diff --git a/WORKSPACE b/WORKSPACE index d5732130..1c021919 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -22,6 +22,22 @@ workspace(name = "com_google_cloud_spanner_emulator") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "rules_proto", + sha256 = "6fb6767d1bef535310547e03247f7518b03487740c11b6c6adb7952033fe1295", + strip_prefix = "rules_proto-6.0.2", + url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.2/rules_proto-6.0.2.tar.gz", +) + +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies") +rules_proto_dependencies() + +load("@rules_proto//proto:setup.bzl", "rules_proto_setup") +rules_proto_setup() + +load("@rules_proto//proto:toolchains.bzl", "rules_proto_toolchains") +rules_proto_toolchains() + ################################################################################ # Bazel utility rules # ################################################################################ @@ -65,11 +81,11 @@ switched_rules_by_language( ################################################################################ # Go Build Support # ################################################################################ -_rules_go_version = "v0.39.1" +_rules_go_version = "v0.48.1" http_archive( name = "io_bazel_rules_go", - sha256 = "6dc2da7ab4cf5d7bfc7c949776b1b7c733f05e56edc4bcd9022bb249d2e2a996", + sha256 = "b2038e2de2cace18f032249cb4bb0048abf583a36369fa98f687af1b3f880b26", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/{0}/rules_go-{0}.zip".format(_rules_go_version), "https://github.com/bazelbuild/rules_go/releases/download/{0}/rules_go-{0}.zip.format(_rules_go_version)", @@ -78,13 +94,13 @@ http_archive( load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") -go_register_toolchains(version = "1.20.13") +go_register_toolchains(version = "1.21.11") -_bazel_gazelle_version = "0.31.1" +_bazel_gazelle_version = "0.36.0" http_archive( name = "bazel_gazelle", - sha256 = "b8b6d75de6e4bf7c41b7737b183523085f56283f6db929b86c5e7e1f09cf59c9", + sha256 = "75df288c4b31c81eb50f51e2e14f4763cb7548daae126817247064637fd9ea62", urls = [ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v{0}/bazel-gazelle-v{0}.tar.gz".format(_bazel_gazelle_version), "https://github.com/bazelbuild/bazel-gazelle/releases/download/v{0}/bazel-gazelle-v{0}.tar.gz".format(_bazel_gazelle_version), @@ -103,24 +119,18 @@ go_repository( name = "org_golang_google_grpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/grpc", - sum = "h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag=", - version = "v1.54.0", -) - -go_repository( - name = "grpc_ecosystem_grpc_gateway", - build_file_proto_mode = "disable_global", - importpath = "github.com/grpc-ecosystem/grpc-gateway/v2", - sum = "h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A=", - version = "v2.15.0", + sum = "h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=", + version = "v1.64.1", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( name = "org_golang_google_genproto", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto", - sum = "h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=", - version = "v0.0.0-20230410155749-daa745c078e1", + sum = "h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY=", + version = "v0.0.0-20240227224415-6ceb2ff114de", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( @@ -129,8 +139,35 @@ go_repository( importpath = "google.golang.org/protobuf", patch_args = ["-p1"], patches = ["//build/bazel:golang_protobuf.patch"], - sum = "h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=", - version = "v1.31.0", + sum = "h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=", + version = "v1.34.2", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, +) + +go_repository( + name = "org_golang_google_genproto_googleapis_api", + importpath = "google.golang.org/genproto/googleapis/api", + sum = "h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=", + version = "v0.0.0-20240711142825-46eb208f015d", +) + +go_repository( + name = "org_golang_google_genproto_googleapis_rpc", + importpath = "google.golang.org/genproto/googleapis/rpc", + sum = "h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A=", + version = "v0.0.0-20240711142825-46eb208f015d", +) + +go_repository( + name = "grpc_ecosystem_grpc_gateway", + build_file_proto_mode = "disable_global", + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2", + sum = "h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=", + version = "v2.20.0", + repo_mapping = { + "@go_googleapis": "@com_google_googleapis", + "@googleapis": "@com_google_googleapis", + }, ) go_rules_dependencies() @@ -139,48 +176,55 @@ go_repository( name = "com_github_golang_protobuf", build_file_proto_mode = "disable_global", importpath = "github.com/golang/protobuf", - sum = "h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=", - version = "v1.5.3", + sum = "h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=", + version = "v1.5.4", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) + go_repository( name = "in_gopkg_yaml_v3", build_file_proto_mode = "disable_global", importpath = "gopkg.in/yaml.v3", sum = "h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=", version = "v3.0.1", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( name = "com_github_golang_glog", build_file_proto_mode = "disable_global", importpath = "github.com/golang/glog", - sum = "h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=", - version = "v1.1.0", + sum = "h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68=", + version = "v1.2.0", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( name = "org_golang_x_net", build_file_proto_mode = "disable_global", importpath = "golang.org/x/net", - sum = "h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=", - version = "v0.15.0", + sum = "h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=", + version = "v0.26.0", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( name = "org_golang_x_sys", build_file_proto_mode = "disable_global", importpath = "golang.org/x/sys", - sum = "h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=", - version = "v0.12.0", + sum = "h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=", + version = "v0.21.0", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) go_repository( name = "org_golang_x_text", build_file_proto_mode = "disable_global", importpath = "golang.org/x/text", - sum = "h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=", - version = "v0.13.0", + sum = "h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=", + version = "v0.16.0", + repo_mapping = {"@go_googleapis": "@com_google_googleapis"}, ) ################################################################################ diff --git a/backend/actions/BUILD b/backend/actions/BUILD index 516f0103..ff43c134 100644 --- a/backend/actions/BUILD +++ b/backend/actions/BUILD @@ -233,7 +233,6 @@ cc_library( "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/time", - "@com_google_zetasql//zetasql/base:ret_check", "@com_google_zetasql//zetasql/public:json_value", "@com_google_zetasql//zetasql/public:type", "@com_google_zetasql//zetasql/public:value", diff --git a/backend/actions/change_stream.cc b/backend/actions/change_stream.cc index 42a0cb43..9979db45 100644 --- a/backend/actions/change_stream.cc +++ b/backend/actions/change_stream.cc @@ -57,7 +57,6 @@ #include "nlohmann/json_fwd.hpp" #include "nlohmann/json.hpp" #include "third_party/spanner_pg/datatypes/extended/spanner_extended_type.h" -#include "zetasql/base/ret_check.h" #include "zetasql/base/status_macros.h" namespace google { namespace spanner { @@ -452,6 +451,10 @@ absl::Status LogTableMod( ZETASQL_RETURN_IF_ERROR(std::visit( overloaded{ [&](const InsertOp& op) -> absl::Status { + if (change_stream->exclude_insert().has_value() && + change_stream->exclude_insert().value()) { + return absl::OkStatus(); + } std::pair, std::vector> tracked_columns_and_values = GetTrackedColumnsAndValues( op.columns, op.values, change_stream, op.table); @@ -464,6 +467,10 @@ absl::Status LogTableMod( return absl::OkStatus(); }, [&](const UpdateOp& op) -> absl::Status { + if (change_stream->exclude_update().has_value() && + change_stream->exclude_update().value()) { + return absl::OkStatus(); + } std::pair, std::vector> tracked_columns_and_values = GetTrackedColumnsAndValues( op.columns, op.values, change_stream, op.table); @@ -476,6 +483,10 @@ absl::Status LogTableMod( return absl::OkStatus(); }, [&](const DeleteOp& op) -> absl::Status { + if (change_stream->exclude_delete().has_value() && + change_stream->exclude_delete().value()) { + return absl::OkStatus(); + } std::vector columns; for (const KeyColumn* pk : op.table->primary_key()) { columns.push_back(pk->column()); @@ -529,6 +540,10 @@ void CloudValueToJSONValue(const zetasql::Value value, JSONValueRef& ref) { ref.SetDouble(value.double_value()); break; } + case zetasql::TYPE_FLOAT: { + ref.SetDouble(static_cast(value.float_value())); + break; + } case zetasql::TYPE_STRING: { ref.SetString(value.string_value()); break; diff --git a/backend/actions/change_stream_test.cc b/backend/actions/change_stream_test.cc index ec2c0737..bf5737d0 100644 --- a/backend/actions/change_stream_test.cc +++ b/backend/actions/change_stream_test.cc @@ -52,6 +52,10 @@ using JSON = ::nlohmann::json; using zetasql::JSONValue; using zetasql::NumericValue; using zetasql::values::Bool; +using zetasql::values::Double; +using zetasql::values::DoubleArray; +using zetasql::values::Float; +using zetasql::values::FloatArray; using zetasql::values::Int64; using zetasql::values::Json; using zetasql::values::JsonArray; @@ -92,6 +96,22 @@ class ChangeStreamTest : public test::ActionsTest { )"}, &type_factory_) .value()), + float_schema_(emulator::test::CreateSchemaFromDDL( + { + R"( + CREATE TABLE FloatTable ( + int64_col INT64 NOT NULL, + float_col FLOAT32, + double_col FLOAT64, + float_arr ARRAY, + double_arr ARRAY + ) PRIMARY KEY (int64_col) + )", + R"( + CREATE CHANGE STREAM ChangeStream_FloatTable FOR FloatTable OPTIONS ( value_capture_type = 'NEW_VALUES' ) + )"}, + &type_factory_) + .value()), pg_schema_( emulator::test::CreateSchemaFromDDL( { @@ -106,15 +126,16 @@ class ChangeStreamTest : public test::ActionsTest { )", R"(CREATE CHANGE STREAM pg_stream FOR ALL WITH ( value_capture_type = 'NEW_VALUES' ))", }, - &type_factory_, - "", /*proto_descriptor_bytes*/ + &type_factory_, "", /*proto_descriptor_bytes*/ database_api::DatabaseDialect::POSTGRESQL) .value()), table_(schema_->FindTable("TestTable")), table2_(schema_->FindTable("TestTable2")), + float_table_(float_schema_->FindTable("FloatTable")), pg_table_(pg_schema_->FindTable("entended_pg_datatypes")), base_columns_(table_->columns()), base_columns_table_2_all_col_(table2_->columns()), + float_columns_(float_table_->columns()), pg_columns_(pg_table_->columns()), change_stream_(schema_->FindChangeStream("ChangeStream_All")), change_stream2_( @@ -122,26 +143,31 @@ class ChangeStreamTest : public test::ActionsTest { change_stream3_( schema_->FindChangeStream("ChangeStream_TestTable2KeyOnly")), change_stream4_(schema_->FindChangeStream("ChangeStream_TestTable2")), + float_change_stream_( + float_schema_->FindChangeStream("ChangeStream_FloatTable")), pg_change_stream_(pg_schema_->FindChangeStream("pg_stream")) {} protected: // Test components. zetasql::TypeFactory type_factory_; std::unique_ptr schema_; + std::unique_ptr float_schema_; std::unique_ptr pg_schema_; // Test variables. const Table* table_; const Table* table2_; - const Table* table3_; + const Table* float_table_; const Table* pg_table_; absl::Span base_columns_; absl::Span base_columns_table_2_all_col_; + absl::Span float_columns_; absl::Span pg_columns_; const ChangeStream* change_stream_; const ChangeStream* change_stream2_; const ChangeStream* change_stream3_; const ChangeStream* change_stream4_; + const ChangeStream* float_change_stream_; const ChangeStream* pg_change_stream_; std::vector key_and_another_string_col_table_1_ = { table_->FindColumn("int64_col"), @@ -1102,6 +1128,110 @@ TEST_F(ChangeStreamTest, PgVerifyExtendedDatatypesValueAndType) { ASSERT_EQ(operation->values[18], zetasql::Value(Bool(false))); } +TEST_F(ChangeStreamTest, FloatValueAndTypes) { + set_up_partition_token_for_change_stream_partition_table(float_change_stream_, + store()); + // Insert base table entry. + std::vector buffered_write_ops; + buffered_write_ops.push_back( + Insert(float_table_, Key({Int64(1)}), float_columns_, + {Int64(1), Float(1.1f), Double(2.2), FloatArray({1.1f, 3.14f}), + DoubleArray({2.2, 2.71})})); + ZETASQL_ASSERT_OK_AND_ASSIGN( + std::vector change_stream_write_ops, + BuildChangeStreamWriteOps(float_schema_.get(), buffered_write_ops, + store(), 1)); + + // Verify change stream entry is added to the transaction buffer. + ASSERT_EQ(change_stream_write_ops.size(), 1); + WriteOp op = change_stream_write_ops[0]; + // Verify the table of the received WriteOp + ASSERT_EQ(TableOf(op), float_change_stream_->change_stream_data_table()); + // Verify the received WriteOp is InsertOp + auto* operation = std::get_if(&op); + ASSERT_NE(operation, nullptr); + // Verify columns in the rebuilt InsertOp corresponds to columns in + // change_stream_data_table + ASSERT_EQ(operation->columns, + float_change_stream_->change_stream_data_table()->columns()); + + // Verify values in the rebuilt InsertOp are correct + // Verify partition_token + ASSERT_EQ(operation->values[0], zetasql::Value::String("11111")); + // Verify record_sequence + ASSERT_EQ(operation->values[3], zetasql::Value(String("00000000"))); + // Verify is_last_record_in_transaction_in_partition + ASSERT_EQ(operation->values[4], zetasql::Value(Bool(true))); + // Verify table_name + ASSERT_EQ(operation->values[5], zetasql::Value(String("FloatTable"))); + // Verify column_types_name + ASSERT_EQ(operation->values[6], + zetasql::values::Array(zetasql::types::StringArrayType(), + {zetasql::Value(String("int64_col")), + zetasql::Value(String("float_col")), + zetasql::Value(String("double_col")), + zetasql::Value(String("float_arr")), + zetasql::Value(String("double_arr"))})); + // Verify column_types_type + JSON int_type; + int_type["code"] = "INT64"; + JSON float32_type; + float32_type["code"] = "FLOAT32"; + JSON float32_arr_type; + float32_arr_type["code"] = "ARRAY"; + float32_arr_type["array_element_type"]["code"] = "FLOAT32"; + JSON float64_type; + float64_type["code"] = "FLOAT64"; + JSON float64_arr_type; + float64_arr_type["code"] = "ARRAY"; + float64_arr_type["array_element_type"]["code"] = "FLOAT64"; + ASSERT_EQ(operation->values[7], + zetasql::values::Array( + zetasql::types::StringArrayType(), + {zetasql::Value(String(int_type.dump())), + zetasql::Value(String(float32_type.dump())), + zetasql::Value(String(float64_type.dump())), + zetasql::Value(String(float32_arr_type.dump())), + zetasql::Value(String(float64_arr_type.dump()))})); + // Verify column_types_is_primary_key + ASSERT_EQ(operation->values[8], + zetasql::values::Array( + zetasql::types::BoolArrayType(), + {zetasql::Value(Bool(true)), zetasql::Value(Bool(false)), + zetasql::Value(Bool(false)), zetasql::Value(Bool(false)), + zetasql::Value(Bool(false))})); + // Verify column_types_ordinal_position + ASSERT_EQ(operation->values[9], + zetasql::values::Array( + zetasql::types::Int64ArrayType(), + {zetasql::Value(Int64(1)), zetasql::Value(Int64(2)), + zetasql::Value(Int64(3)), zetasql::Value(Int64(4)), + zetasql::Value(Int64(5))})); + // Verify mods + zetasql::Value mod_keys = operation->values[10]; + ASSERT_EQ(mod_keys.element(0), + zetasql::Value(String("{\"int64_col\":\"1\"}"))); + zetasql::Value mod_new_values = operation->values[11]; + ASSERT_EQ( + mod_new_values.element(0), + zetasql::Value(String( + R"({"double_arr":[2.2,2.71],"double_col":2.2,"float_arr":[1.100000023841858,3.140000104904175],"float_col":1.100000023841858})"))); + zetasql::Value mod_old_values = operation->values[12]; + ASSERT_EQ(mod_old_values.element(0), zetasql::Value(String("{}"))); + // Verify mod_type + ASSERT_EQ(operation->values[13], zetasql::Value(String("INSERT"))); + // Verify value_capture_type + ASSERT_EQ(operation->values[14], zetasql::Value(String("NEW_VALUES"))); + // Verify number_of_records_in_transaction + ASSERT_EQ(operation->values[15], zetasql::Value(Int64(1))); + // Verify number_of_partitions_in_transaction + ASSERT_EQ(operation->values[16], zetasql::Value(Int64(1))); + // Verify transaction_tag + ASSERT_EQ(operation->values[17], zetasql::Value(String(""))); + // Verify is_system_transaction + ASSERT_EQ(operation->values[18], zetasql::Value(Bool(false))); +} + } // namespace } // namespace backend } // namespace emulator diff --git a/backend/query/analyzer_options.cc b/backend/query/analyzer_options.cc index 0dee3cb1..e9ca6bf2 100644 --- a/backend/query/analyzer_options.cc +++ b/backend/query/analyzer_options.cc @@ -71,6 +71,7 @@ zetasql::LanguageOptions MakeGoogleSqlLanguageOptions() { zetasql::FEATURE_V_1_2_SAFE_FUNCTION_CALL, zetasql::FEATURE_JSON_TYPE, zetasql::FEATURE_JSON_ARRAY_FUNCTIONS, + zetasql::FEATURE_JSON_CONSTRUCTOR_FUNCTIONS, zetasql::FEATURE_JSON_STRICT_NUMBER_PARSING, zetasql::FEATURE_JSON_VALUE_EXTRACTION_FUNCTIONS, zetasql::FEATURE_JSON_LAX_VALUE_EXTRACTION_FUNCTIONS, diff --git a/backend/query/catalog_test.cc b/backend/query/catalog_test.cc index 85c67aac..c33a7f96 100644 --- a/backend/query/catalog_test.cc +++ b/backend/query/catalog_test.cc @@ -125,13 +125,8 @@ class CatalogTest : public testing::Test { void MakeCatalog(absl::Span statements, database_api::DatabaseDialect dialect = database_api::DatabaseDialect::GOOGLE_STANDARD_SQL) { - ZETASQL_ASSERT_OK_AND_ASSIGN( - schema_, test::CreateSchemaFromDDL(statements, - &type_factory_ - , - "" - , - dialect)); + ZETASQL_ASSERT_OK_AND_ASSIGN(schema_, test::CreateSchemaFromDDL( + statements, &type_factory_, "", dialect)); catalog_ = std::make_unique(schema_.get(), &function_catalog_, &type_factory_); } diff --git a/backend/query/feature_filter/gsql_supported_functions.cc b/backend/query/feature_filter/gsql_supported_functions.cc index bfedc1ef..1aa8bca1 100644 --- a/backend/query/feature_filter/gsql_supported_functions.cc +++ b/backend/query/feature_filter/gsql_supported_functions.cc @@ -194,6 +194,8 @@ const absl::flat_hash_set* SupportedZetaSQLFunctions() { "json_query_array", "json_value_array", "json_type", + "json_object", + "json_array", "$subscript", "$bitwise_right_shift", "round", diff --git a/backend/query/function_catalog.h b/backend/query/function_catalog.h index e7f1c802..de8c97dc 100644 --- a/backend/query/function_catalog.h +++ b/backend/query/function_catalog.h @@ -37,7 +37,7 @@ constexpr char kCloudSpannerEmulatorFunctionCatalogName[] = "Spanner"; // A catalog of all SQL functions. // -// The FunctionCatalog supports looking up a function by name and emunerating +// The FunctionCatalog supports looking up a function by name and enumerating // all existing functions. class FunctionCatalog { public: diff --git a/backend/query/information_schema_catalog.cc b/backend/query/information_schema_catalog.cc index 31980e0e..4dad511a 100644 --- a/backend/query/information_schema_catalog.cc +++ b/backend/query/information_schema_catalog.cc @@ -190,10 +190,13 @@ static constexpr char kModelOptions[] = "MODEL_OPTIONS"; static constexpr char kModelColumns[] = "MODEL_COLUMNS"; static constexpr char kModelColumnOptions[] = "MODEL_COLUMN_OPTIONS"; +static int kFloatNumericPrecision = 24; static int kDoubleNumericPrecision = 53; static int kBigintNumericPrecision = 64; -static int kDoubleNumericPrecisionRadix = 2; -static int kPGNumericNumericPrecisionRadix = 10; + +// The radix for binary or decimal representation of a numeric value. +static int kBinaryRepresentedNumericPrecisionRadix = 2; +static int kDecimalRepresentedNumericPrecisionRadix = 10; static const zetasql_base::NoDestructor> // For now, this is a set of tables that are created from metadata. Once the @@ -714,6 +717,8 @@ zetasql::Value GetPGNumericPrecision(const zetasql::Type* type) { return Int64(kDoubleNumericPrecision); } else if (type->IsInt64()) { return Int64(kBigintNumericPrecision); + } else if (type->IsFloat()) { + return Int64(kFloatNumericPrecision); } return NullInt64(); } @@ -722,11 +727,11 @@ zetasql::Value GetPGNumericPrecision(const zetasql::Type* type) { // "columns" table, based on the given column type. zetasql::Value GetPGNumericPrecisionRadix(const zetasql::Type* type) { // Setting the numeric precision radix. - if (type->IsDouble() || type->IsInt64()) { - return Int64(kDoubleNumericPrecisionRadix); + if (type->IsDouble() || type->IsInt64() || type->IsFloat()) { + return Int64(kBinaryRepresentedNumericPrecisionRadix); } else if (type == postgres_translator::spangres::types::PgNumericMapping() ->mapped_type()) { - return Int64(kPGNumericNumericPrecisionRadix); + return Int64(kDecimalRepresentedNumericPrecisionRadix); } return NullInt64(); } diff --git a/backend/query/query_engine.cc b/backend/query/query_engine.cc index 2abf8958..90630102 100644 --- a/backend/query/query_engine.cc +++ b/backend/query/query_engine.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -759,12 +760,6 @@ absl::StatusOr> ExtractParameters( if (it != undeclared_params.end()) { auto parsed_value = frontend::ValueFromProto(*it->second, type); - if (parsed_value.ok() && !parsed_value->is_null() && - (type->IsTimestamp() || type->IsDate())) { - return error::UnableToInferUndeclaredParameter(name, - type->DebugString()); - } - // If the value does not parse as the given type, the error code is // kInvalidArgument, not kFailedPrecondition, for example. if (!parsed_value.ok()) { @@ -1007,6 +1002,19 @@ absl::StatusOr QueryEngine::ExecuteSql( ZETASQL_RETURN_IF_ERROR(context.writer->Write(execute_update_result.mutation)); result.modified_row_count = execute_update_result.modify_row_count; result.rows = std::move(execute_update_result.returning_row_cursor); + } else { + // Add the columns and types of the returning clause to the result. + auto returning_clause = GetReturningClause(resolved_statement.get()); + if (returning_clause != nullptr) { + std::vector names; + std::vector types; + for (auto& column : returning_clause->output_column_list()) { + names.push_back(column->column().name()); + types.push_back(column->column().type()); + } + std::vector> values; + result.rows = std::make_unique(names, types, values); + } } } // Add both undeclared and declared parameters to the result. @@ -1018,6 +1026,31 @@ absl::StatusOr QueryEngine::ExecuteSql( return result; } +const zetasql::ResolvedReturningClause* GetReturningClause( + const zetasql::ResolvedStatement* resolved_statement) { + const zetasql::ResolvedReturningClause* returning_clause; + switch (resolved_statement->node_kind()) { + case zetasql::RESOLVED_INSERT_STMT: + returning_clause = + resolved_statement->GetAs() + ->returning(); + break; + case zetasql::RESOLVED_UPDATE_STMT: + returning_clause = + resolved_statement->GetAs() + ->returning(); + break; + case zetasql::RESOLVED_DELETE_STMT: + returning_clause = + resolved_statement->GetAs() + ->returning(); + break; + default: + returning_clause = nullptr; + } + return returning_clause; +} + absl::Status QueryEngine::IsPartitionable(const Query& query, const QueryContext& context) const { ZETASQL_ASSIGN_OR_RETURN(auto analyzer_options, diff --git a/backend/query/query_engine.h b/backend/query/query_engine.h index 95959920..9884f103 100644 --- a/backend/query/query_engine.h +++ b/backend/query/query_engine.h @@ -61,6 +61,10 @@ struct Query { // Returns true if the given query is a DML statement. bool IsDMLQuery(const std::string& query); +// Returns the returning clause of a DML statement. +const zetasql::ResolvedReturningClause* GetReturningClause( + const zetasql::ResolvedStatement* resolved_statement); + // QueryResult specifies the output of a query request. struct QueryResult { // A row cursor containing the query result rows. It's null for DML requests diff --git a/backend/query/query_engine_test.cc b/backend/query/query_engine_test.cc index 09c1930f..b56f483b 100644 --- a/backend/query/query_engine_test.cc +++ b/backend/query/query_engine_test.cc @@ -213,6 +213,7 @@ class QueryEngineTestBase : public testing::Test { const Schema* model_schema() { return model_schema_.get(); } const Schema* sequence_schema() { return sequence_schema_.get(); } const Schema* gpk_schema() { return gpk_schema_.get(); } + const Schema* timestamp_date_schema() { return timestamp_date_schema_.get(); } RowReader* change_stream_partition_table_reader() { return &change_stream_partition_table_reader_; } @@ -220,6 +221,9 @@ class QueryEngineTestBase : public testing::Test { return &change_stream_data_table_reader_; } RowReader* gpk_table_reader() { return &gpk_table_reader_; } + RowReader* timestamp_date_table_reader() { + return ×tamp_date_table_reader_; + } RowReader* reader() { return &reader_; } QueryEngine& query_engine() { return query_engine_; } zetasql::TypeFactory* type_factory() { return &type_factory_; } @@ -318,17 +322,25 @@ class QueryEngineTestBase : public testing::Test { std::unique_ptr model_schema_; std::unique_ptr sequence_schema_; std::unique_ptr gpk_schema_; + std::unique_ptr timestamp_date_schema_; private: std::unique_ptr views_schema_ = test::CreateSchemaWithView(&type_factory_); test::TestRowReader reader_{ {{"test_table", - {{"int64_col", "string_col"}, - {zetasql::types::Int64Type(), zetasql::types::StringType()}, - {{zetasql::values::Int64(1), zetasql::values::String("one")}, - {zetasql::values::Int64(2), zetasql::values::String("two")}, - {zetasql::values::Int64(4), zetasql::values::String("four")}}}}}}; + {{"int64_col", "string_col", "date_col", "timestamp_col"}, + {zetasql::types::Int64Type(), zetasql::types::StringType(), + zetasql::types::DateType(), zetasql::types::TimestampType()}, + {{zetasql::values::Int64(1), zetasql::values::String("one"), + zetasql::values::Date(1), + zetasql::values::Timestamp(absl::FromUnixSeconds(1))}, + {zetasql::values::Int64(2), zetasql::values::String("two"), + zetasql::values::Date(2), + zetasql::values::Timestamp(absl::FromUnixSeconds(2))}, + {zetasql::values::Int64(4), zetasql::values::String("four"), + zetasql::values::Date(4), + zetasql::values::Timestamp(absl::FromUnixSeconds(4))}}}}}}; QueryEngine query_engine_{&type_factory_}; test::ScopedEmulatorFeatureFlagsSetter feature_flags_setter_ = test::ScopedEmulatorFeatureFlagsSetter( @@ -349,6 +361,14 @@ class QueryEngineTestBase : public testing::Test { zetasql::types::Int64Type()}}}}}; std::unique_ptr proto_schema_ = test::CreateSchemaWithProtoEnumColumn(&type_factory_, read_descriptors()); + test::TestRowReader timestamp_date_table_reader_{ + {{"timestamp_date_table", + {{"int64_col", "timestamp_col", "date_col"}, + {zetasql::types::Int64Type(), zetasql::types::TimestampType(), + zetasql::types::DateType()}, + {{zetasql::values::Int64(1), + zetasql::values::Timestamp(absl::FromUnixSeconds(1)), + zetasql::values::Date(1)}}}}}}; }; struct TestQuery { @@ -382,6 +402,8 @@ class QueryEngineTest test::CreateSchemaWithOneSequence( &type_factory_, database_api::DatabaseDialect::POSTGRESQL)); query_engine().SetLatestSchemaForFunctionCatalog(sequence_schema_.get()); + timestamp_date_schema_ = test::CreateSchemaWithTimestampDateTable( + &type_factory_, database_api::DatabaseDialect::POSTGRESQL); } else if (GetParam() == database_api::DatabaseDialect::GOOGLE_STANDARD_SQL) { schema_ = test::CreateSchemaWithOneTable(&type_factory_); @@ -394,6 +416,8 @@ class QueryEngineTest ZETASQL_ASSERT_OK_AND_ASSIGN(sequence_schema_, test::CreateSchemaWithOneSequence(&type_factory_)); query_engine().SetLatestSchemaForFunctionCatalog(sequence_schema_.get()); + timestamp_date_schema_ = + test::CreateSchemaWithTimestampDateTable(&type_factory_); } } }; @@ -796,6 +820,34 @@ TEST_P(QueryEngineTest, ExecuteSqlRefusesIncompleteParameters) { HasSubstr("Incomplete query parameters"))); } +TEST_P(QueryEngineTest, ExecuteSqlAcceptsNonNullUntypedParameter) { + Query query; + google::protobuf::Value p1, p2; + p1.set_string_value("0001-01-01T00:00:00.00Z"); + p2.set_string_value("0001-01-01"); + if (GetParam() == database_api::DatabaseDialect::POSTGRESQL) { + query = {/*sql=*/ + "SELECT int64_col FROM timestamp_date_table WHERE " + "timestamp_col=$1 AND date_col=$2", + /*declared_params=*/{}, + /*undeclared_params=*/{{"p1", p1}, {"p2", p2}}}; + } else { + query = {/*sql=*/ + "SELECT int64_col FROM timestamp_date_table WHERE " + "timestamp_col=@p1 AND date_col=@p2", + /*declared_params=*/{}, + /*undeclared_params=*/{{"p1", p1}, {"p2", p2}}}; + } + ZETASQL_ASSERT_OK_AND_ASSIGN( + QueryResult result, + query_engine().ExecuteSql( + query, + QueryContext{timestamp_date_schema(), timestamp_date_table_reader()}, + v1::ExecuteSqlRequest::NORMAL)); + EXPECT_THAT(GetParamNames(result), ElementsAre("p1", "p2")); + EXPECT_THAT(GetParamTypes(result), ElementsAre(TimestampType(), DateType())); +} + TEST_P(QueryEngineTest, ExecuteSqlSelectsOneColumnFromTableWithForceIndexHint) { std::string hint = (GetParam() == database_api::DatabaseDialect::POSTGRESQL) ? "/*@ force_index=test_index */" @@ -998,6 +1050,31 @@ TEST_P(QueryEngineTest, InsertOrIgnoreDmlFlagDisabled) { } } +TEST_P(QueryEngineTest, InsertOrIgnoreDmlWithReturning) { + MockRowWriter writer; + if (GetParam() == database_api::DatabaseDialect::GOOGLE_STANDARD_SQL) { + EXPECT_THAT( + query_engine().ExecuteSql( + Query{"INSERT OR IGNORE INTO test_table (int64_col) VALUES(1) " + "THEN RETURN *"}, + QueryContext{schema(), reader(), &writer}), + StatusIs( + absl::StatusCode::kUnimplemented, + HasSubstr("Returning clause in Insert or ignore statement is not " + "supported in Emulator"))); + } else { + EXPECT_THAT( + query_engine().ExecuteSql( + Query{"INSERT INTO test_table (int64_col) VALUES(1) " + "ON CONFLICT(int64_col) DO NOTHING RETURNING *"}, + QueryContext{schema(), reader(), &writer}), + StatusIs( + absl::StatusCode::kUnimplemented, + HasSubstr("Returning clause in Insert or ignore statement is not " + "supported in Emulator"))); + } +} + TEST_P(QueryEngineTest, InsertOrUpdateDmlFlagDisabled) { test::ScopedEmulatorFeatureFlagsSetter setter( {.enable_upsert_queries = false}); @@ -1025,6 +1102,32 @@ TEST_P(QueryEngineTest, InsertOrUpdateDmlFlagDisabled) { } } +TEST_P(QueryEngineTest, InsertOrUpdateDmlWithReturning) { + MockRowWriter writer; + if (GetParam() == database_api::DatabaseDialect::GOOGLE_STANDARD_SQL) { + EXPECT_THAT( + query_engine().ExecuteSql( + Query{"INSERT OR UPDATE INTO test_table (int64_col) VALUES(1) " + "THEN RETURN *"}, + QueryContext{schema(), reader(), &writer}), + StatusIs( + absl::StatusCode::kUnimplemented, + HasSubstr("Returning clause in Insert or update statement is not " + "supported in Emulator"))); + } else { + EXPECT_THAT( + query_engine().ExecuteSql( + Query{"INSERT INTO test_table (int64_col) VALUES(1) " + "ON CONFLICT(int64_col) DO UPDATE " + "SET int64_col = excluded.int64_col RETURNING *"}, + QueryContext{schema(), reader(), &writer}), + StatusIs( + absl::StatusCode::kUnimplemented, + HasSubstr("Returning clause in Insert or update statement is not " + "supported in Emulator"))); + } +} + TEST_P(QueryEngineTest, ExecuteInsertsTwoRows) { MockRowWriter writer; EXPECT_CALL( diff --git a/backend/schema/updater/schema_updater_tests/table.cc b/backend/schema/updater/schema_updater_tests/table.cc index ae66ba1c..44da1396 100644 --- a/backend/schema/updater/schema_updater_tests/table.cc +++ b/backend/schema/updater/schema_updater_tests/table.cc @@ -1597,17 +1597,16 @@ TEST_P(SchemaUpdaterTest, CreateTableIfNotExists) { } TEST_P(SchemaUpdaterTest, CreateTableWithVectorLength) { - if (GetParam() == POSTGRESQL) GTEST_SKIP(); ZETASQL_EXPECT_OK(CreateSchema({R"( CREATE TABLE T ( k1 INT64, a1 ARRAY(vector_length=>123), + a2 ARRAY(vector_length=>123), ) PRIMARY KEY (k1) )"})); } TEST_P(SchemaUpdaterTest, CreateTableWithVectorLengthOnInvalidType) { - if (GetParam() == POSTGRESQL) GTEST_SKIP(); EXPECT_THAT(CreateSchema({R"sql( CREATE TABLE T ( k1 INT64, @@ -1624,7 +1623,7 @@ TEST_P(SchemaUpdaterTest, AlterTableAlterColumnAddVectorLength) { CREATE TABLE T ( k1 INT64, a1 ARRAY(vector_length=>123), - a2 ARRAY, + a2 ARRAY, ) PRIMARY KEY (k1) )sql"})); @@ -1635,12 +1634,11 @@ TEST_P(SchemaUpdaterTest, AlterTableAlterColumnAddVectorLength) { } TEST_P(SchemaUpdaterTest, AlterTableAlterColumnRemoveVectorLength) { - if (GetParam() == POSTGRESQL) GTEST_SKIP(); ZETASQL_ASSERT_OK_AND_ASSIGN(auto schema, CreateSchema({R"sql( CREATE TABLE T ( k1 INT64, a1 ARRAY(vector_length=>2), - a2 ARRAY, + a2 ARRAY, ) PRIMARY KEY (k1) )sql"})); diff --git a/common/errors.cc b/common/errors.cc index 97d9f76f..994dd690 100644 --- a/common/errors.cc +++ b/common/errors.cc @@ -2668,14 +2668,6 @@ absl::Status CannotSetDefaultValueOnGeneratedColumn( } // Query errors. -absl::Status UnableToInferUndeclaredParameter(absl::string_view parameter_name, - absl::string_view type) { - return absl::Status( - absl::StatusCode::kInvalidArgument, - absl::Substitute("Unable to infer type for parameter $0. Provide the " - "type binding $1", - parameter_name, type)); -} absl::Status InvalidHint(absl::string_view hint_string) { return absl::Status(absl::StatusCode::kInvalidArgument, absl::Substitute("Unsupported hint: $0.", hint_string)); diff --git a/common/errors.h b/common/errors.h index e03cffb4..3092f30c 100644 --- a/common/errors.h +++ b/common/errors.h @@ -647,8 +647,6 @@ absl::Status CannotSetDefaultValueOnGeneratedColumn( absl::string_view column_name); // Query errors. -absl::Status UnableToInferUndeclaredParameter(absl::string_view parameter_name, - absl::string_view type); absl::Status InvalidHint(absl::string_view hint_string); absl::Status InvalidEmulatorHint(absl::string_view hint_string); absl::Status InvalidHintValue(absl::string_view hint_string, diff --git a/frontend/handlers/queries.cc b/frontend/handlers/queries.cc index b6ce9d48..de2beaaf 100644 --- a/frontend/handlers/queries.cc +++ b/frontend/handlers/queries.cc @@ -466,13 +466,6 @@ absl::Status ExecuteStreamingSql( std::vector responses; if (is_dml_query) { responses.emplace_back(); - if (txn->IsPartitionedDml()) { - responses.back().mutable_stats()->set_row_count_lower_bound( - result.modified_row_count); - } else { - responses.back().mutable_stats()->set_row_count_exact( - result.modified_row_count); - } if (result.rows == nullptr) { // Set empty row type. responses.back().mutable_metadata()->mutable_row_type(); @@ -481,6 +474,13 @@ absl::Status ExecuteStreamingSql( ZETASQL_ASSIGN_OR_RETURN(responses, RowCursorToPartialResultSetProtos( result.rows.get(), /*limit=*/0)); } + if (txn->IsPartitionedDml()) { + responses.back().mutable_stats()->set_row_count_lower_bound( + result.modified_row_count); + } else { + responses.back().mutable_stats()->set_row_count_exact( + result.modified_row_count); + } } else { ZETASQL_ASSIGN_OR_RETURN(responses, RowCursorToPartialResultSetProtos( result.rows.get(), /*limit=*/0)); diff --git a/frontend/handlers/queries_test.cc b/frontend/handlers/queries_test.cc index 777bb8d2..a12a06f1 100644 --- a/frontend/handlers/queries_test.cc +++ b/frontend/handlers/queries_test.cc @@ -453,6 +453,313 @@ TEST_F(QueryApiTest, ExecuteSqlWithDmlAndParameters) { )pb")); } +TEST_F(QueryApiTest, ExecuteSqlWithDmlReturningAndParameters) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "INSERT INTO test_table (int64_col, string_col) " + "VALUES (@p1, @p2) THEN RETURN int64_col, string_col" + )"""); + request.set_session(test_session_uri_); + request.set_query_mode(spanner_api::ExecuteSqlRequest::PLAN); + request.mutable_transaction()->set_id(transaction_response.id()); + + spanner_api::ResultSet response; + ZETASQL_ASSERT_OK(ExecuteSql(request, &response)); + EXPECT_THAT( + response, + EqualsProto( + R"pb( + metadata { + row_type { + fields { + name: "int64_col" + type { code: INT64 } + } + fields { + name: "string_col" + type { code: STRING } + } + } + undeclared_parameters { + fields { + name: "p1" + type { code: INT64 } + } + fields { + name: "p2" + type { code: STRING } + } + } + } + stats { + query_plan { plan_nodes { display_name: "No query plan" } } + row_count_exact: 0 + } + )pb")); +} + +TEST_F(QueryApiTest, ExecuteSqlWithDmlReturningReturnsStats) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "INSERT INTO test_table (int64_col, string_col) " + "VALUES (10, 'row_10') THEN RETURN int64_col, string_col" + )"""); + request.set_session(test_session_uri_); + request.mutable_transaction()->set_id(transaction_response.id()); + + spanner_api::ResultSet response; + ZETASQL_ASSERT_OK(ExecuteSql(request, &response)); + EXPECT_THAT(response, EqualsProto( + R"pb( + metadata { + row_type { + fields { + name: "int64_col" + type { code: INT64 } + } + fields { + name: "string_col" + type { code: STRING } + } + } + } + rows { + values { string_value: "10" } + values { string_value: "row_10" } + } + stats { row_count_exact: 1 } + )pb")); +} + +TEST_F(QueryApiTest, ExecuteStreamingSqlWithDmlReturningReturnsStats) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "INSERT INTO test_table (int64_col, string_col) " + "VALUES (10, 'row_10') THEN RETURN int64_col, string_col" + )"""); + request.set_session(test_session_uri_); + request.mutable_transaction()->set_id(transaction_response.id()); + + std::vector response; + ZETASQL_EXPECT_OK(ExecuteStreamingSql(request, &response)); + EXPECT_THAT(response, ElementsAre(EqualsProto( + R"pb(metadata { + row_type { + fields { + name: "int64_col" + type { code: INT64 } + } + fields { + name: "string_col" + type { code: STRING } + } + } + } + values { string_value: "10" } + values { string_value: "row_10" } + chunked_value: false + stats { row_count_exact: 1 } + )pb"))); +} + +TEST_F(QueryApiTest, + ExecuteStreamingSqlWithDmlReturningInPlanModeReturnsEmptyStats) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "INSERT INTO test_table (int64_col, string_col) " + "VALUES (10, 'row_10') THEN RETURN int64_col, string_col" + )"""); + request.set_session(test_session_uri_); + request.set_query_mode(spanner_api::ExecuteSqlRequest::PLAN); + request.mutable_transaction()->set_id(transaction_response.id()); + + std::vector response; + ZETASQL_EXPECT_OK(ExecuteStreamingSql(request, &response)); + EXPECT_THAT(response, ElementsAre(EqualsProto( + R"pb(metadata { + row_type { + fields { + name: "int64_col" + type { code: INT64 } + } + fields { + name: "string_col" + type { code: STRING } + } + } + } + chunked_value: false + stats { row_count_exact: 0 } + )pb"))); +} + +TEST_F(QueryApiTest, ExecuteSqlWithDmlReturningStar) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "DELETE test_table WHERE TRUE THEN RETURN *" + )"""); + request.set_session(test_session_uri_); + request.set_query_mode(spanner_api::ExecuteSqlRequest::PLAN); + request.mutable_transaction()->set_id(transaction_response.id()); + + spanner_api::ResultSet response; + ZETASQL_ASSERT_OK(ExecuteSql(request, &response)); + EXPECT_THAT( + response, + EqualsProto( + R"pb( + metadata { + row_type { + fields { + name: "int64_col" + type { code: INT64 } + } + fields { + name: "string_col" + type { code: STRING } + } + } + } + stats { + query_plan { plan_nodes { display_name: "No query plan" } } + row_count_exact: 0 + } + )pb")); +} + +TEST_F(QueryApiTest, ExecuteSqlUpdateReturning) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "UPDATE test_table SET string_col=@p1 " + "WHERE int64_col=@p2 THEN RETURN string_col" + )"""); + request.set_session(test_session_uri_); + request.set_query_mode(spanner_api::ExecuteSqlRequest::PLAN); + request.mutable_transaction()->set_id(transaction_response.id()); + + spanner_api::ResultSet response; + ZETASQL_ASSERT_OK(ExecuteSql(request, &response)); + EXPECT_THAT( + response, + EqualsProto( + R"pb( + metadata { + row_type { + fields { + name: "string_col" + type { code: STRING } + } + } + undeclared_parameters { + fields { + name: "p1" + type { code: STRING } + } + fields { + name: "p2" + type { code: INT64 } + } + } + } + stats { + query_plan { plan_nodes { display_name: "No query plan" } } + row_count_exact: 0 + } + )pb")); +} + +TEST_F(QueryApiTest, ExecuteSqlDmlPlanWithoutReturning) { + spanner_api::BeginTransactionRequest begin_request = PARSE_TEXT_PROTO(R"pb( + options { read_write {} } + )pb"); + begin_request.set_session(test_session_uri_); + + spanner_api::Transaction transaction_response; + ZETASQL_EXPECT_OK(BeginTransaction(begin_request, &transaction_response)); + + spanner_api::ExecuteSqlRequest request = PARSE_TEXT_PROTO( + R"""( + sql: "UPDATE test_table SET string_col=@p1 " + "WHERE int64_col=@p2" + )"""); + request.set_session(test_session_uri_); + request.set_query_mode(spanner_api::ExecuteSqlRequest::PLAN); + request.mutable_transaction()->set_id(transaction_response.id()); + + spanner_api::ResultSet response; + ZETASQL_ASSERT_OK(ExecuteSql(request, &response)); + EXPECT_THAT( + response, + EqualsProto( + R"pb( + metadata { + row_type {} + undeclared_parameters { + fields { + name: "p1" + type { code: STRING } + } + fields { + name: "p2" + type { code: INT64 } + } + } + } + stats { + query_plan { plan_nodes { display_name: "No query plan" } } + row_count_exact: 0 + } + )pb")); +} + TEST_F(QueryApiTest, ExecuteSqlWithDmlAndProtoParameters) { ZETASQL_ASSERT_OK(AddProtoTables()); diff --git a/gateway/gateway.go b/gateway/gateway.go index 9e14b2bc..a993a204 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -63,7 +63,6 @@ func New(opts Options) *Gateway { func (gw *Gateway) Run() { // Start the emulator grpc server and redirect its output. emulatorArgs := []string{ - "--host_port", gw.opts.FrontendAddress, } if gw.opts.LogRequests { diff --git a/tests/common/BUILD b/tests/common/BUILD index 191f11cc..95e1390d 100644 --- a/tests/common/BUILD +++ b/tests/common/BUILD @@ -268,9 +268,13 @@ cc_library( srcs = ["change_streams.cc"], hdrs = ["change_streams.h"], deps = [ + ":chunking", "//frontend/converters:pg_change_streams", + "@com_github_googleapis_google_cloud_cpp//:spanner", + "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", "@com_google_absl//absl/time", "@com_google_googleapis//google/spanner/v1:spanner_cc_grpc", "@com_google_protobuf//:cc_wkt_protos", diff --git a/tests/common/change_streams.cc b/tests/common/change_streams.cc index 114dd2a4..8459b94d 100644 --- a/tests/common/change_streams.cc +++ b/tests/common/change_streams.cc @@ -17,12 +17,23 @@ #include "tests/common/change_streams.h" #include +#include +#include #include +#include #include #include "google/protobuf/struct.pb.h" +#include "google/spanner/v1/spanner.pb.h" +#include "absl/status/status.h" #include "absl/status/statusor.h" +#include "absl/strings/string_view.h" +#include "absl/strings/substitute.h" +#include "absl/time/time.h" +#include "google/cloud/spanner/database.h" #include "frontend/converters/pg_change_streams.h" +#include "tests/common/chunking.h" +#include "grpcpp/client_context.h" #include "google/protobuf/json/json.h" #include "zetasql/base/ret_check.h" #include "zetasql/base/status_macros.h" @@ -236,6 +247,74 @@ absl::StatusOr GetChangeStreamRecordsFromResultSet( return change_stream_records; } +// Creates a new session for tests using raw grpc client. +absl::StatusOr CreateTestSession( + SpannerStub* client, const cloud::spanner::Database* database) { + grpc::ClientContext context; + spanner_api::CreateSessionRequest request; + spanner_api::Session response; + request.set_database(database->FullName()); + ZETASQL_RETURN_IF_ERROR(client->CreateSession(&context, request, &response)); + return response.name(); +} + +// Reads from a grpc::ClientReader and returns the response in a vector. +absl::Status ReadFromClientReader( + std::unique_ptr> reader, + std::vector* response) { + response->clear(); + spanner_api::PartialResultSet result; + while (reader->Read(&result)) { + response->push_back(result); + } + return reader->Finish(); +} + +absl::StatusOr ExecuteChangeStreamQuery( + absl::string_view sql, absl::string_view session_uri, SpannerStub* client) { + // Build the request that will be executed. + spanner_api::ExecuteSqlRequest request; + request.mutable_transaction() + ->mutable_single_use() + ->mutable_read_only() + ->set_strong(true); + *request.mutable_sql() = sql; + request.set_session(session_uri); + + // Execute the tvf query with ExecuteStreamingSql API. + std::vector response; + grpc::ClientContext context; + auto client_reader = client->ExecuteStreamingSql(&context, request); + ZETASQL_RETURN_IF_ERROR(ReadFromClientReader(std::move(client_reader), &response)); + + ZETASQL_ASSIGN_OR_RETURN(auto result_set, backend::test::MergePartialResultSets( + response, /*columns_per_row=*/1)); + ZETASQL_ASSIGN_OR_RETURN(ChangeStreamRecords change_records, + GetChangeStreamRecordsFromResultSet(result_set)); + return change_records; +} + +absl::StatusOr> GetActiveTokenFromInitialQuery( + absl::Time start, absl::string_view change_stream_name, + absl::string_view session_uri, SpannerStub* client) { + std::vector active_tokens; + std::string sql = absl::Substitute( + "SELECT * FROM " + "READ_$0 ('$1',NULL, NULL, 300000 )", + change_stream_name, start); + ZETASQL_ASSIGN_OR_RETURN(test::ChangeStreamRecords change_records, + ExecuteChangeStreamQuery(sql, session_uri, client)); + for (const auto& child_partition_record : + change_records.child_partition_records) { + for (const auto& child_partition : + child_partition_record.child_partitions.values()) { + active_tokens.push_back( + child_partition.list_value().values(0).string_value()); + } + } + return active_tokens; +} + } // namespace test } // namespace emulator } // namespace spanner diff --git a/tests/common/change_streams.h b/tests/common/change_streams.h index e644d895..bbc4ebe4 100644 --- a/tests/common/change_streams.h +++ b/tests/common/change_streams.h @@ -16,18 +16,27 @@ #ifndef THIRD_PARTY_CLOUD_SPANNER_EMULATOR_TESTS_COMMON_CHANGE_STREAMS_H_ #define THIRD_PARTY_CLOUD_SPANNER_EMULATOR_TESTS_COMMON_CHANGE_STREAMS_H_ +#include #include #include #include "google/protobuf/struct.pb.h" #include "google/spanner/v1/result_set.pb.h" -#include "absl/time/time.h" +#include "google/spanner/v1/spanner.grpc.pb.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "google/cloud/spanner/database.h" #include "frontend/converters/pg_change_streams.h" +#include "grpcpp/support/sync_stream.h" namespace google { namespace spanner { namespace emulator { namespace test { +namespace spanner_api = ::google::spanner::v1; +using SpannerStub = v1::Spanner::Stub; struct DataChangeRecord { google::protobuf::Value commit_timestamp; @@ -156,6 +165,19 @@ inline std::string EncodeTimestampString(absl::Time timestamp, absl::UTCTimeZone()), "Z"); } +absl::StatusOr CreateTestSession( + SpannerStub* client, const cloud::spanner::Database* database); + +absl::Status ReadFromClientReader( + std::unique_ptr> reader, + std::vector* response); + +absl::StatusOr ExecuteChangeStreamQuery( + absl::string_view sql, absl::string_view session_uri, SpannerStub* client); + +absl::StatusOr> GetActiveTokenFromInitialQuery( + absl::Time start, absl::string_view change_stream_name, + absl::string_view session_uri, SpannerStub* client); } // namespace test } // namespace emulator diff --git a/tests/common/schema_constructor.cc b/tests/common/schema_constructor.cc index 8abde53d..a1e91fc1 100644 --- a/tests/common/schema_constructor.cc +++ b/tests/common/schema_constructor.cc @@ -102,6 +102,38 @@ std::unique_ptr CreateSchemaWithOneTable( return std::move(maybe_schema.value()); } +std::unique_ptr CreateSchemaWithTimestampDateTable( + zetasql::TypeFactory* type_factory, + database_api::DatabaseDialect dialect) { + std::string timestamp_date_table = + R"( + CREATE TABLE timestamp_date_table ( + int64_col INT64 NOT NULL, + timestamp_col TIMESTAMP, + date_col DATE + ) PRIMARY KEY (int64_col) + )"; + if (dialect == database_api::DatabaseDialect::POSTGRESQL) { + timestamp_date_table = + R"( + CREATE TABLE timestamp_date_table ( + int64_col bigint NOT NULL PRIMARY KEY, + timestamp_col timestamptz, + date_col date + ) + )"; + } + auto maybe_schema = CreateSchemaFromDDL( + { + timestamp_date_table, + }, + type_factory, "" /*proto_descriptor_bytes*/ + , + dialect); + ABSL_CHECK_OK(maybe_schema.status()); // Crash OK + return std::move(maybe_schema.value()); +} + std::unique_ptr CreateSchemaWithOneTableAndOneChangeStream( zetasql::TypeFactory* type_factory, diff --git a/tests/common/schema_constructor.h b/tests/common/schema_constructor.h index 1dac4d75..09ddc49c 100644 --- a/tests/common/schema_constructor.h +++ b/tests/common/schema_constructor.h @@ -53,6 +53,12 @@ std::unique_ptr CreateSchemaWithOneTable( database_api::DatabaseDialect dialect = database_api::DatabaseDialect::GOOGLE_STANDARD_SQL); +// Creates a schema with a single table that has a timestamp and date column. +std::unique_ptr CreateSchemaWithTimestampDateTable( + zetasql::TypeFactory* type_factory, + database_api::DatabaseDialect dialect = + database_api::DatabaseDialect::GOOGLE_STANDARD_SQL); + std::unique_ptr CreateSchemaWithOneTableAndOneChangeStream( zetasql::TypeFactory* type_factory, diff --git a/tests/conformance/cases/BUILD b/tests/conformance/cases/BUILD index 37bb63b1..4bc7f6a7 100644 --- a/tests/conformance/cases/BUILD +++ b/tests/conformance/cases/BUILD @@ -27,6 +27,7 @@ cc_library( "arrays.cc", "batch_dml.cc", "case_sensitivity.cc", + "change_streams_exclusion.cc", "change_streams_read_write.cc", "check_constraint_read_write.cc", "column_constraints.cc", diff --git a/tests/conformance/cases/arrays.cc b/tests/conformance/cases/arrays.cc index 57889ff1..ca2903f9 100644 --- a/tests/conformance/cases/arrays.cc +++ b/tests/conformance/cases/arrays.cc @@ -57,12 +57,11 @@ class ArraysTest : public DatabaseTest { class ArraysWithVectorLengthTest : public DatabaseTest { public: absl::Status SetUpDatabase() override { - // TODO: b/326591008 - Add an array column of FLOAT32 with vector length - // after FLOAT32 is supported in the emulator. return SetSchema({R"sql( CREATE TABLE VectorLengthLimitsTable ( pk INT64 NOT NULL, arr_double ARRAY(vector_length=>2), + arr_float ARRAY(vector_length=>2), ) PRIMARY KEY (pk) )sql"}); } @@ -207,21 +206,31 @@ TEST_F(ArraysTest, InsertEmptyArraysSucceed) { TEST_F(ArraysWithVectorLengthTest, InsertArraysSucceed) { Array double_arr{1.1, 1.2}; + Array float_arr{2.1, 2.2}; ZETASQL_EXPECT_OK(Insert("VectorLengthLimitsTable", {"pk", "arr_double"}, {2, std::move(double_arr)})); + ZETASQL_EXPECT_OK(Insert("VectorLengthLimitsTable", {"pk", "arr_float"}, + {3, std::move(float_arr)})); } TEST_F(ArraysWithVectorLengthTest, InsertArraysWithNullFail) { Array double_arr{1.1, std::nullopt}; + Array float_arr{2.1, std::nullopt}; EXPECT_THAT( Insert("VectorLengthLimitsTable", {"pk", "arr_double"}, {2, std::move(double_arr)}), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr(" has `vector_length`, and Null is not allowed"))); + EXPECT_THAT( + Insert("VectorLengthLimitsTable", {"pk", "arr_float"}, + {3, std::move(float_arr)}), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr(" has `vector_length`, and Null is not allowed"))); } TEST_F(ArraysWithVectorLengthTest, InsertArraysLessThanVectorLengthFail) { Array double_arr{1.1}; + Array float_arr{2.1}; EXPECT_THAT( Insert("VectorLengthLimitsTable", {"pk", "arr_double"}, {2, std::move(double_arr)}), @@ -229,16 +238,30 @@ TEST_F(ArraysWithVectorLengthTest, InsertArraysLessThanVectorLengthFail) { absl::StatusCode::kInvalidArgument, HasSubstr( "has 1 elements and is less than the `vector_length` limit: 2"))); + EXPECT_THAT( + Insert("VectorLengthLimitsTable", {"pk", "arr_float"}, + {3, std::move(float_arr)}), + StatusIs( + absl::StatusCode::kInvalidArgument, + HasSubstr( + "has 1 elements and is less than the `vector_length` limit: 2"))); } TEST_F(ArraysWithVectorLengthTest, InsertArraysExceedsVectorLengthFail) { Array double_arr{1.1, 1.2, 1.3}; + Array float_arr{2.1, 2.2, 2.3, 2.4}; EXPECT_THAT( Insert("VectorLengthLimitsTable", {"pk", "arr_double"}, {2, std::move(double_arr)}), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr( "has 3 elements and exceeds the `vector_length` limit: 2"))); + EXPECT_THAT( + Insert("VectorLengthLimitsTable", {"pk", "arr_float"}, + {3, std::move(float_arr)}), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr( + "has 4 elements and exceeds the `vector_length` limit: 2"))); } TEST_F(ArraysTest, InsertInvalidUTFStringArrayFails) { diff --git a/tests/conformance/cases/change_streams_exclusion.cc b/tests/conformance/cases/change_streams_exclusion.cc new file mode 100644 index 00000000..abec47ff --- /dev/null +++ b/tests/conformance/cases/change_streams_exclusion.cc @@ -0,0 +1,312 @@ +// +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include +#include + +#include "google/spanner/v1/result_set.pb.h" +#include "google/spanner/v1/spanner.pb.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "zetasql/base/testing/status_matchers.h" +#include "tests/common/proto_matchers.h" +#include "absl/log/log.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/substitute.h" +#include "absl/time/time.h" +#include "google/cloud/spanner/keys.h" +#include "google/cloud/spanner/mutations.h" +#include "common/clock.h" +#include "tests/common/change_streams.h" +#include "tests/conformance/common/database_test_base.h" +#include "zetasql/base/status_macros.h" + +namespace google { +namespace spanner { +namespace emulator { +namespace test { + +namespace { +using InsertMutationBuilder = cloud::spanner::InsertMutationBuilder; +using UpdateMutationBuilder = cloud::spanner::UpdateMutationBuilder; +using DeleteMutationBuilder = cloud::spanner::DeleteMutationBuilder; +using ReplaceMutationBuilder = cloud::spanner::ReplaceMutationBuilder; +class ChangeStreamExclusionTest : public DatabaseTest { + public: + absl::Status SetUpDatabase() override { + ZETASQL_RETURN_IF_ERROR(SetSchema({ + R"( + CREATE TABLE Users( + UserId INT64 NOT NULL, + Name STRING(MAX), + Age INT64, + ) PRIMARY KEY (UserId) + )", + R"( + CREATE TABLE Accounts( + UserId INT64 NOT NULL, + AccountId INT64 NOT NULL, + Balance INT64, + ) PRIMARY KEY (UserId,AccountId), + INTERLEAVE IN PARENT Users ON DELETE CASCADE + )", + R"( + CREATE CHANGE STREAM Stream1 FOR ALL OPTIONS ( + exclude_insert = true ) + )", + R"( + CREATE CHANGE STREAM Stream2 FOR ALL OPTIONS ( + exclude_update = true ) + )", + R"( + CREATE CHANGE STREAM Stream3 FOR ALL OPTIONS ( + exclude_delete = true ) + )", + })); + ZETASQL_ASSIGN_OR_RETURN(test_session_uri_, + CreateTestSession(raw_client(), database())); + ZETASQL_RETURN_IF_ERROR(PopulateTestData()); + return absl::OkStatus(); + } + + protected: + std::string test_session_uri_; + const std::string exclude_insert_change_stream_ = "Stream1"; + const std::string exclude_update_change_stream_ = "Stream2"; + const std::string exclude_delete_change_stream_ = "Stream3"; + + struct DataChangeRecordsCount { + int insert_count = 0; + int update_count = 0; + int delete_count = 0; + int total_count = 0; + }; + + absl::Status PopulateTestData() { + auto mutation_builder_insert = + InsertMutationBuilder("Users", {"UserId", "Name"}); + std::vector rows = {{1, "name1"}, {2, "name2"}}; + for (const auto& row : rows) { + mutation_builder_insert.AddRow(row); + } + return Commit({mutation_builder_insert.Build()}).status(); + } + + absl::StatusOr CountDataRecordsFromStartToNow( + absl::Time start, std::string change_stream_name) { + ZETASQL_ASSIGN_OR_RETURN( + std::vector active_tokens, + GetActiveTokenFromInitialQuery(start, change_stream_name, + test_session_uri_, raw_client())); + std::vector merged_data_change_records; + DataChangeRecordsCount data_change_records_count; + for (const auto& partition_token : active_tokens) { + std::string sql = absl::Substitute( + "SELECT * FROM " + "READ_$0 ('$1','$2', '$3', 300000 )", + change_stream_name, start, Clock().Now(), partition_token); + ZETASQL_ASSIGN_OR_RETURN( + test::ChangeStreamRecords change_records, + ExecuteChangeStreamQuery(sql, test_session_uri_, raw_client())); + for (const auto& data_change_record : + change_records.data_change_records) { + if (data_change_record.mod_type.string_value() == "INSERT") { + data_change_records_count.insert_count++; + } else if (data_change_record.mod_type.string_value() == "UPDATE") { + data_change_records_count.update_count++; + } else if (data_change_record.mod_type.string_value() == "DELETE") { + data_change_records_count.delete_count++; + } + } + } + + data_change_records_count.total_count = + data_change_records_count.insert_count + + data_change_records_count.update_count + + data_change_records_count.delete_count; + return data_change_records_count; + } +}; + +TEST_F(ChangeStreamExclusionTest, SingleInsertModTypeFilter) { + auto mutation_builder_insert = + InsertMutationBuilder("Users", {"UserId", "Name"}); + std::vector rows = {{3, "name3"}}; + for (const auto& row : rows) { + mutation_builder_insert.AddRow(row); + } + ZETASQL_ASSERT_OK_AND_ASSIGN(auto commit_result, + Commit({mutation_builder_insert.Build()})); + Timestamp commit_timestamp = commit_result.commit_timestamp; + absl::Time query_start_time = commit_timestamp.get().value(); + ZETASQL_ASSERT_OK_AND_ASSIGN(auto data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_insert_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 0); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_update_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.insert_count, 1); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_delete_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.insert_count, 1); +} + +TEST_F(ChangeStreamExclusionTest, SingleUpdateModTypeFilter) { + auto mutation_builder_update = + UpdateMutationBuilder("Users", {"UserId", "Name"}); + std::vector rows = {{1, "name1Update"}}; + for (const auto& row : rows) { + mutation_builder_update.AddRow(row); + } + ZETASQL_ASSERT_OK_AND_ASSIGN(auto commit_result, + Commit({mutation_builder_update.Build()})); + Timestamp commit_timestamp = commit_result.commit_timestamp; + absl::Time query_start_time = commit_timestamp.get().value(); + + ZETASQL_ASSERT_OK_AND_ASSIGN(auto data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_insert_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.update_count, 1); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_update_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 0); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_delete_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.update_count, 1); +} + +TEST_F(ChangeStreamExclusionTest, SingleDeleteModTypeFilter) { + auto mutation_builder_delete = DeleteMutationBuilder( + "Users", KeySet().AddKey(cloud::spanner::MakeKey(1))); + ZETASQL_ASSERT_OK_AND_ASSIGN(auto commit_result, + Commit({mutation_builder_delete.Build()})); + Timestamp commit_timestamp = commit_result.commit_timestamp; + absl::Time query_start_time = commit_timestamp.get().value(); + + ZETASQL_ASSERT_OK_AND_ASSIGN(auto data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_insert_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.delete_count, 1); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_update_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 1); + ASSERT_EQ(data_change_records.delete_count, 1); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_delete_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 0); +} + +TEST_F(ChangeStreamExclusionTest, MultipleModTypesFilter) { + auto mutation_builder_insert = + InsertMutationBuilder("Users", {"UserId", "Name"}); + std::vector rows = {{3, "name3"}}; + for (const auto& row : rows) { + mutation_builder_insert.AddRow(row); + } + + auto mutation_builder_update = + UpdateMutationBuilder("Users", {"UserId", "Name"}); + rows = {{1, "name1Update"}}; + for (const auto& row : rows) { + mutation_builder_update.AddRow(row); + } + + auto mutation_builder_delete = DeleteMutationBuilder( + "Users", KeySet().AddKey(cloud::spanner::MakeKey(2))); + + ZETASQL_ASSERT_OK_AND_ASSIGN( + auto commit_result, + Commit({mutation_builder_insert.Build(), mutation_builder_update.Build(), + mutation_builder_delete.Build()})); + Timestamp commit_timestamp = commit_result.commit_timestamp; + absl::Time query_start_time = commit_timestamp.get().value(); + ZETASQL_ASSERT_OK_AND_ASSIGN(auto data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_insert_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 2); + ASSERT_EQ(data_change_records.insert_count, 0); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_update_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 2); + ASSERT_EQ(data_change_records.update_count, 0); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_delete_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 2); + ASSERT_EQ(data_change_records.delete_count, 0); +} + +TEST_F(ChangeStreamExclusionTest, CascadeDeleteModTypeFilter) { + auto mutation_builder_insert = + InsertMutationBuilder("Accounts", {"UserId", "AccountId", "Balance"}); + std::vector rows = {{1, 111, 250}}; + for (const auto& row : rows) { + mutation_builder_insert.AddRow(row); + } + ZETASQL_ASSERT_OK(Commit({mutation_builder_insert.Build()})); + + auto mutation_builder_delete = DeleteMutationBuilder( + "Users", KeySet().AddKey(cloud::spanner::MakeKey(1))); + + ZETASQL_ASSERT_OK_AND_ASSIGN(auto commit_result, + Commit({mutation_builder_delete.Build()})); + Timestamp commit_timestamp = commit_result.commit_timestamp; + absl::Time query_start_time = commit_timestamp.get().value(); + ZETASQL_ASSERT_OK_AND_ASSIGN(auto data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_insert_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 2); + ASSERT_EQ(data_change_records.delete_count, 2); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_update_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 2); + ASSERT_EQ(data_change_records.delete_count, 2); + + ZETASQL_ASSERT_OK_AND_ASSIGN(data_change_records, + CountDataRecordsFromStartToNow( + query_start_time, exclude_delete_change_stream_)); + ASSERT_EQ(data_change_records.total_count, 0); +} + +} // namespace + +} // namespace test +} // namespace emulator +} // namespace spanner +} // namespace google diff --git a/tests/conformance/cases/change_streams_read_write.cc b/tests/conformance/cases/change_streams_read_write.cc index 60c93ee8..9677815d 100644 --- a/tests/conformance/cases/change_streams_read_write.cc +++ b/tests/conformance/cases/change_streams_read_write.cc @@ -15,7 +15,6 @@ // #include -#include #include #include #include @@ -39,10 +38,7 @@ #include "google/cloud/spanner/timestamp.h" #include "common/clock.h" #include "tests/common/change_streams.h" -#include "tests/common/chunking.h" #include "tests/conformance/common/database_test_base.h" -#include "grpcpp/client_context.h" -#include "grpcpp/support/sync_stream.h" #include "zetasql/base/status_macros.h" namespace google { @@ -94,7 +90,7 @@ class ChangeStreamTest : public DatabaseTest { boolVal BOOL, bytesVal BYTES(MAX), dateVal DATE, - floatVal FLOAT64, + float64Val FLOAT64, stringVal STRING(MAX), numericVal NUMERIC, timestampVal TIMESTAMP, @@ -102,6 +98,7 @@ class ChangeStreamTest : public DatabaseTest { arrayInt ARRAY, arrayStr ARRAY, arrayJson ARRAY, + float32Val FLOAT32, ) PRIMARY KEY(intVal) )", R"( @@ -110,11 +107,11 @@ class ChangeStreamTest : public DatabaseTest { boolVal BOOL, bytesVal BYTES(MAX), dateVal DATE, - floatVal FLOAT64, + float64Val FLOAT64, stringVal STRING(MAX), numericVal NUMERIC, timestampVal TIMESTAMP, - ) PRIMARY KEY(intVal,boolVal,bytesVal,dateVal,floatVal,stringVal,numericVal,timestampVal) + ) PRIMARY KEY(intVal,boolVal,bytesVal,dateVal,float64Val,stringVal,numericVal,timestampVal) )", R"( CREATE TABLE ASTable ( @@ -140,89 +137,29 @@ class ChangeStreamTest : public DatabaseTest { CREATE CHANGE STREAM StreamSpecifiedColumns FOR Users2(Name,Age) )", })); - ZETASQL_ASSIGN_OR_RETURN(test_session_uri_, CreateTestSession()); + ZETASQL_ASSIGN_OR_RETURN(test_session_uri_, + CreateTestSession(raw_client(), database())); return absl::OkStatus(); } protected: std::string test_session_uri_; - // Creates a new session for tests using raw grpc client. - absl::StatusOr CreateTestSession() { - grpc::ClientContext context; - spanner_api::CreateSessionRequest request; - spanner_api::Session response; - request.set_database(database()->FullName()); - ZETASQL_RETURN_IF_ERROR(raw_client()->CreateSession(&context, request, &response)); - return response.name(); - } - - absl::Status ReadFromClientReader( - std::unique_ptr> reader, - std::vector* response) { - response->clear(); - spanner_api::PartialResultSet result; - while (reader->Read(&result)) { - response->push_back(result); - } - return reader->Finish(); - } - - absl::StatusOr ExecuteChangeStreamQuery( - std::string sql) { - // Build the request that will be executed. - spanner_api::ExecuteSqlRequest request; - request.mutable_transaction() - ->mutable_single_use() - ->mutable_read_only() - ->set_strong(true); - *request.mutable_sql() = sql; - request.set_session(test_session_uri_); - - // Execute the tvf query with ExecuteStreamingSql API. - std::vector response; - grpc::ClientContext context; - auto client_reader = raw_client()->ExecuteStreamingSql(&context, request); - ZETASQL_EXPECT_OK(ReadFromClientReader(std::move(client_reader), &response)); - - ZETASQL_ASSIGN_OR_RETURN(auto result_set, backend::test::MergePartialResultSets( - response, /*columns_per_row=*/1)); - ZETASQL_ASSIGN_OR_RETURN(ChangeStreamRecords change_records, - GetChangeStreamRecordsFromResultSet(result_set)); - return change_records; - } - - absl::StatusOr> GetActiveTokenFromInitialQuery( - absl::Time start, std::string change_stream_name) { - std::vector active_tokens; - std::string sql = absl::Substitute( - "SELECT * FROM " - "READ_$0 ('$1',NULL, NULL, 300000 )", - change_stream_name, start); - ZETASQL_ASSIGN_OR_RETURN(test::ChangeStreamRecords change_records, - ExecuteChangeStreamQuery(sql)); - for (const auto& child_partition_record : - change_records.child_partition_records) { - for (const auto& child_partition : - child_partition_record.child_partitions.values()) { - active_tokens.push_back( - child_partition.list_value().values(0).string_value()); - } - } - return active_tokens; - } absl::StatusOr> GetDataRecordsFromStartToNow( absl::Time start, std::string change_stream_name) { - ZETASQL_ASSIGN_OR_RETURN(std::vector active_tokens, - GetActiveTokenFromInitialQuery(start, change_stream_name)); + ZETASQL_ASSIGN_OR_RETURN( + std::vector active_tokens, + GetActiveTokenFromInitialQuery(start, change_stream_name, + test_session_uri_, raw_client())); std::vector merged_data_change_records; for (const auto& partition_token : active_tokens) { std::string sql = absl::Substitute( "SELECT * FROM " "READ_$0 ('$1','$2', '$3', 300000 )", change_stream_name, start, Clock().Now(), partition_token); - ZETASQL_ASSIGN_OR_RETURN(test::ChangeStreamRecords change_records, - ExecuteChangeStreamQuery(sql)); + ZETASQL_ASSIGN_OR_RETURN( + test::ChangeStreamRecords change_records, + ExecuteChangeStreamQuery(sql, test_session_uri_, raw_client())); merged_data_change_records.insert( merged_data_change_records.end(), change_records.data_change_records.begin(), @@ -973,14 +910,13 @@ TEST_F(ChangeStreamTest, DeleteRowNotExisting) { TEST_F(ChangeStreamTest, DiffDataTypesInKey) { auto mutation_builder_insert_friends = InsertMutationBuilder( "ScalarTypesAllKeysTable", - {"intVal", "boolVal", "bytesVal", "dateVal", "floatVal", "stringVal", + {"intVal", "boolVal", "bytesVal", "dateVal", "float64Val", "stringVal", "numericVal", "timestampVal"}); std::vector rows = { {1, true, cloud::spanner::Bytes( cloud::spanner_internal::BytesFromBase64("blue").value()), - "2014-09-27", (float)1.1, "stringVal", - cloud::spanner::MakeNumeric("1").value(), + "2014-09-27", 1.1, "stringVal", cloud::spanner::MakeNumeric("1").value(), cloud::spanner::MakeTimestamp(absl::UnixEpoch()).value()}}; for (const auto& row : rows) { mutation_builder_insert_friends.AddRow(row); @@ -1033,7 +969,7 @@ TEST_F(ChangeStreamTest, DiffDataTypesInKey) { } values { list_value { - values { string_value: "floatVal" } + values { string_value: "float64Val" } values { string_value: "{\"code\":\"FLOAT64\"}" } values { bool_value: true } values { string_value: "5" } @@ -1071,7 +1007,7 @@ TEST_F(ChangeStreamTest, DiffDataTypesInKey) { R"pb(values { list_value { values { - string_value: "{\"boolVal\":true,\"bytesVal\":\"blue\",\"dateVal\":\"2014-09-27\",\"floatVal\":1.100000023841858,\"intVal\":\"1\",\"numericVal\":\"1\",\"stringVal\":\"stringVal\",\"timestampVal\":\"1970-01-01T00:00:00Z\"}" + string_value: "{\"boolVal\":true,\"bytesVal\":\"blue\",\"dateVal\":\"2014-09-27\",\"float64Val\":1.1,\"intVal\":\"1\",\"numericVal\":\"1\",\"stringVal\":\"stringVal\",\"timestampVal\":\"1970-01-01T00:00:00Z\"}" } values { string_value: "{}" } values { string_value: "{}" } @@ -3317,9 +3253,9 @@ TEST_F(ChangeStreamTest, RangeDeleteExistingRows) { TEST_F(ChangeStreamTest, DiffDataTypes) { auto mutation_builder_insert_friends = InsertMutationBuilder( "ScalarTypesTable", - {"intVal", "boolVal", "bytesVal", "dateVal", "floatVal", "stringVal", + {"intVal", "boolVal", "bytesVal", "dateVal", "float64Val", "stringVal", "numericVal", "timestampVal", "jsonVal", "arrayInt", "arrayStr", - "arrayJson"}); + "arrayJson", "float32Val"}); Array numeric_arr{cloud::spanner::MakeNumeric("1").value(), cloud::spanner::MakeNumeric("2").value(), cloud::spanner::MakeNumeric("3").value()}; @@ -3330,10 +3266,9 @@ TEST_F(ChangeStreamTest, DiffDataTypes) { {1, true, cloud::spanner::Bytes( cloud::spanner_internal::BytesFromBase64("blue").value()), - "2014-09-27", (float)1.1, "stringVal", - cloud::spanner::MakeNumeric("1").value(), + "2014-09-27", 1.1, "stringVal", cloud::spanner::MakeNumeric("1").value(), cloud::spanner::MakeTimestamp(absl::UnixEpoch()).value(), - Json(R"("Hello world!")"), num_arr, str_arr, json_arr}}; + Json(R"("Hello world!")"), num_arr, str_arr, json_arr, 3.14f}}; for (const auto& row : rows) { mutation_builder_insert_friends.AddRow(row); } @@ -3386,7 +3321,7 @@ TEST_F(ChangeStreamTest, DiffDataTypes) { } values { list_value { - values { string_value: "floatVal" } + values { string_value: "float64Val" } values { string_value: "{\"code\":\"FLOAT64\"}" } values { bool_value: false } values { string_value: "5" } @@ -3453,7 +3388,16 @@ TEST_F(ChangeStreamTest, DiffDataTypes) { values { bool_value: false } values { string_value: "12" } } - })pb")); + } + values { + list_value { + values { string_value: "float32Val" } + values { string_value: "{\"code\":\"FLOAT32\"}" } + values { bool_value: false } + values { string_value: "13" } + } + } + )pb")); // mods EXPECT_THAT( data_change_records[0].mods, @@ -3462,7 +3406,7 @@ TEST_F(ChangeStreamTest, DiffDataTypes) { list_value { values { string_value: "{\"intVal\":\"1\"}" } values { - string_value: "{\"arrayInt\":[\"1\",\"2\",\"3\"],\"arrayJson\":[\"\\\"Hello\\\"\",\"\\\"Hi\\\"\"],\"arrayStr\":[\"Hello\",\"Hi\"],\"boolVal\":true,\"bytesVal\":\"blue\",\"dateVal\":\"2014-09-27\",\"floatVal\":1.100000023841858,\"jsonVal\":\"\\\"Hello world!\\\"\",\"numericVal\":\"1\",\"stringVal\":\"stringVal\",\"timestampVal\":\"1970-01-01T00:00:00Z\"}" + string_value: "{\"arrayInt\":[\"1\",\"2\",\"3\"],\"arrayJson\":[\"\\\"Hello\\\"\",\"\\\"Hi\\\"\"],\"arrayStr\":[\"Hello\",\"Hi\"],\"boolVal\":true,\"bytesVal\":\"blue\",\"dateVal\":\"2014-09-27\",\"float32Val\":3.140000104904175,\"float64Val\":1.1,\"jsonVal\":\"\\\"Hello world!\\\"\",\"numericVal\":\"1\",\"stringVal\":\"stringVal\",\"timestampVal\":\"1970-01-01T00:00:00Z\"}" } values { string_value: "{}" } } diff --git a/tests/conformance/cases/information_schema.cc b/tests/conformance/cases/information_schema.cc index c8c039dc..7c2a0c23 100644 --- a/tests/conformance/cases/information_schema.cc +++ b/tests/conformance/cases/information_schema.cc @@ -90,15 +90,18 @@ class InformationSchemaTest // Information schema columns not yet supported. const std::pair kUnsupportedColumns{ "unsupported_columns", - std::vector({"IS_HIDDEN", "IS_STORED_VOLATILE"})}; + std::vector({ + "IS_HIDDEN", "IS_STORED_VOLATILE", + })}; // Information schema constraints not yet supported. const std::pair kUnsupportedConstraints{ - "unsupported_constraints", std::vector({ - "CK_IS_NOT_NULL_TABLES_TABLE_TYPE", - "CK_IS_NOT_NULL_VIEWS_SECURITY_TYPE", - "CK_IS_NOT_NULL_COLUMNS_IS_HIDDEN", - })}; + "unsupported_constraints", + std::vector({ + "CK_IS_NOT_NULL_TABLES_TABLE_TYPE", + "CK_IS_NOT_NULL_VIEWS_SECURITY_TYPE", + "CK_IS_NOT_NULL_COLUMNS_IS_HIDDEN", + })}; // Returns the given rows, replacing matching string patterns with their // actual values from the given results. @@ -364,6 +367,7 @@ TEST_P(InformationSchemaTest, GSQLMetaColumns) { t.table_schema = 'INFORMATION_SCHEMA' and t.table_name not in unnest(@unsupported_tables) and not (t.table_name = 'COLUMNS' and t.column_name in unnest(@unsupported_columns)) + and not (t.table_name = 'INDEXES' and t.column_name in unnest(@unsupported_columns)) and not (t.table_name = 'TABLES' and t.column_name = 'INTERLEAVE_TYPE') and not (t.table_name = 'TABLES' and t.column_name = 'ROW_DELETION_POLICY_EXPRESSION') and not (t.table_name = 'TABLES' and t.column_name = 'TABLE_TYPE') @@ -1074,36 +1078,38 @@ TEST_P(InformationSchemaTest, MetaCheckConstraints) { if (GetParam() == database_api::DatabaseDialect::POSTGRESQL) { filter = "t.constraint_schema = 'information_schema'"; } else { - filter = R"(t.constraint_schema = 'INFORMATION_SCHEMA' - and t.constraint_catalog = '' - and t.constraint_name not in unnest(@unsupported_constraints) - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_CHANGE_STREAM%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_DATABASE_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_VIEWS_TABLE%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_COLUMN_PRIVILEGES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_TABLE_PRIVILEGES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_GRANTEES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_TABLE_GRANTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_COLUMN_GRANTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_CHANGE_STREAM_GRANTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_MODEL_GRANTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_ROUTINE_GRANTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODELS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_COLUMNS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_COLUMN_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_PRIVILEGES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PLACEMENTS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PLACEMENT_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PARAMETERS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINE_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINE_PRIVILEGES%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_TABLE_SYNONYMS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_INDEX_OPTIONS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_AAC_APPROVAL_CONFIGS%' - and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_COLUMN_PARAMETERS%')"; + filter = + "t.constraint_schema = 'INFORMATION_SCHEMA' " + "and t.constraint_catalog = '' " + "and t.constraint_name not in unnest(@unsupported_constraints) " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_CHANGE_STREAM%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_DATABASE_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_VIEWS_TABLE%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_COLUMN_PRIVILEGES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_TABLE_PRIVILEGES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_GRANTEES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_TABLE_GRANTS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_COLUMN_GRANTS%' " + "and t.constraint_name NOT LIKE " + "'CK_IS_NOT_NULL_ROLE_CHANGE_STREAM_GRANTS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_MODEL_GRANTS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROLE_ROUTINE_GRANTS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODELS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_COLUMNS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_COLUMN_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_MODEL_PRIVILEGES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PLACEMENTS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PLACEMENT_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_PARAMETERS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINE_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_ROUTINE_PRIVILEGES%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_TABLE_SYNONYMS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_INDEX_OPTIONS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_AAC_APPROVAL_CONFIGS%' " + "and t.constraint_name NOT LIKE 'CK_IS_NOT_NULL_COLUMN_PARAMETERS%'"; } std::string query = absl::Substitute(R"( @@ -2037,22 +2043,24 @@ TEST_P(InformationSchemaTest, GSQLDefaultColumns) { {"", "", "base", "key2", 2, Ns(), Ns(), "YES", "STRING(256)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT {"", "", "base", "bool_value", 3, Ns(), Ns(), "YES", "BOOL", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT {"", "", "base", "int_value", 4, Ns(), Ns(), "NO", "INT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "double_value", 5, Ns(), Ns(), "YES", "FLOAT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "str_value", 6, Ns(), Ns(), "YES", "STRING(MAX)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "byte_value", 7, Ns(), Ns(), "YES", "BYTES(256)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "timestamp_value", 8, Ns(), Ns(), "YES", "TIMESTAMP", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "date_value", 9, Ns(), Ns(), "YES", "DATE", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "bool_array", 10, Ns(), Ns(), "NO", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "int_array", 11, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "double_array", 12, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "str_array", 13, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "byte_array", 14, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "timestamp_array", 15, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "date_array", 16, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "gen_value", 17, Ns(), Ns(), "YES", "INT64", "ALWAYS", "key1 + 1", "YES", "COMMITTED"}, // NOLINT - {"", "", "base", "gen_function_value", 18, Ns(), Ns(), "YES", "INT64", "ALWAYS", "LENGTH(key2)", "NO", "COMMITTED"}, // NOLINT - {"", "", "base", "default_col_value", 19, "100", Ns(), "YES", "INT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT - {"", "", "base", "default_timestamp_col_value", 20, "CURRENT_TIMESTAMP()", Ns(), "YES", "TIMESTAMP", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "float_value", 5, Ns(), Ns(), "YES", "FLOAT32", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "double_value", 6, Ns(), Ns(), "YES", "FLOAT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "str_value", 7, Ns(), Ns(), "YES", "STRING(MAX)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "byte_value", 8, Ns(), Ns(), "YES", "BYTES(256)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "timestamp_value", 9, Ns(), Ns(), "YES", "TIMESTAMP", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "date_value", 10, Ns(), Ns(), "YES", "DATE", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "bool_array", 11, Ns(), Ns(), "NO", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "int_array", 12, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "float_array", 13, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "double_array", 14, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "str_array", 15, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "byte_array", 16, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "timestamp_array", 17, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "date_array", 18, Ns(), Ns(), "YES", "ARRAY", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "gen_value", 19, Ns(), Ns(), "YES", "INT64", "ALWAYS", "key1 + 1", "YES", "COMMITTED"}, // NOLINT + {"", "", "base", "gen_function_value", 20, Ns(), Ns(), "YES", "INT64", "ALWAYS", "LENGTH(key2)", "NO", "COMMITTED"}, // NOLINT + {"", "", "base", "default_col_value", 21, "100", Ns(), "YES", "INT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT + {"", "", "base", "default_timestamp_col_value", 22, "CURRENT_TIMESTAMP()", Ns(), "YES", "TIMESTAMP", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT {"", "", "base_view", "key1", 1, Ns(), Ns(), "YES", "INT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT {"", "", "cascade_child", "key1", 1, Ns(), Ns(), "YES", "INT64", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT {"", "", "cascade_child", "key2", 2, Ns(), Ns(), "YES", "STRING(256)", "NEVER", Ns(), Ns(), "COMMITTED"}, // NOLINT @@ -2112,22 +2120,24 @@ TEST_P(InformationSchemaTest, PGDefaultColumns) { {"public", "base", "key2", 2, Ns(), "character varying", "NO", "character varying(256)", "NEVER", Ns(), Ns(), "COMMITTED", 256, Ni(), Ni(), Ni()}, // NOLINT {"public", "base", "bool_value", 3, Ns(), "boolean", "YES", "boolean", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT {"public", "base", "int_value", 4, Ns(), "bigint", "NO", "bigint", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 64, 2, 0}, // NOLINT - {"public", "base", "double_value", 5, Ns(), "double precision", "YES", "double precision", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 53, 2, Ni()}, // NOLINT - {"public", "base", "str_value", 6, Ns(), "character varying", "YES", "character varying", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "byte_value", 7, Ns(), "bytea", "YES", "bytea", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "timestamp_value", 8, Ns(), "spanner.commit_timestamp", "YES", "spanner.commit_timestamp", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "date_value", 9, Ns(), "date", "YES", "date", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "bool_array", 10, Ns(), "ARRAY", "NO", "boolean[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "int_array", 11, Ns(), "ARRAY", "YES", "bigint[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "double_array", 12, Ns(), "ARRAY", "YES", "double precision[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "str_array", 13, Ns(), "ARRAY", "YES", "character varying(256)[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "byte_array", 14, Ns(), "ARRAY", "YES", "bytea[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "timestamp_array", 15, Ns(), "ARRAY", "YES", "timestamp with time zone[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "date_array", 16, Ns(), "ARRAY", "YES", "date[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT - {"public", "base", "gen_value", 17, Ns(), "bigint", "YES", "bigint", "ALWAYS", "(key1 + '1'::bigint)", "YES", "COMMITTED", Ni(), 64, 2, 0}, // NOLINT - {"public", "base", "gen_function_value", 18, Ns(), "bigint", "YES", "bigint", "ALWAYS", "length(key2)", "NO", "COMMITTED", Ni(), 64, 2, 0}, // NOLINT - {"public", "base", "default_col_value", 19, "'100'::bigint", "bigint", "YES", "bigint", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 64, 2, 0}, // NOLINT - {"public", "base", "default_timestamp_col_value", 20, "CURRENT_TIMESTAMP", "timestamp with time zone", "YES", "timestamp with time zone", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "float_value", 5, Ns(), "real", "YES", "real", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 24, 2, Ni()}, // NOLINT + {"public", "base", "double_value", 6, Ns(), "double precision", "YES", "double precision", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 53, 2, Ni()}, // NOLINT + {"public", "base", "str_value", 7, Ns(), "character varying", "YES", "character varying", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "byte_value", 8, Ns(), "bytea", "YES", "bytea", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "timestamp_value", 9, Ns(), "spanner.commit_timestamp", "YES", "spanner.commit_timestamp", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "date_value", 10, Ns(), "date", "YES", "date", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "bool_array", 11, Ns(), "ARRAY", "NO", "boolean[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "int_array", 12, Ns(), "ARRAY", "YES", "bigint[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "float_array", 13, Ns(), "ARRAY", "YES", "real[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "double_array", 14, Ns(), "ARRAY", "YES", "double precision[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "str_array", 15, Ns(), "ARRAY", "YES", "character varying(256)[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "byte_array", 16, Ns(), "ARRAY", "YES", "bytea[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "timestamp_array", 17, Ns(), "ARRAY", "YES", "timestamp with time zone[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "date_array", 18, Ns(), "ARRAY", "YES", "date[]", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT + {"public", "base", "gen_value", 19, Ns(), "bigint", "YES", "bigint", "ALWAYS", "(key1 + '1'::bigint)", "YES", "COMMITTED", Ni(), 64, 2, 0}, // NOLINT + {"public", "base", "gen_function_value", 20, Ns(), "bigint", "YES", "bigint", "ALWAYS", "length(key2)", "NO", "COMMITTED", Ni(), 64, 2, 0}, // NOLINT + {"public", "base", "default_col_value", 21, "'100'::bigint", "bigint", "YES", "bigint", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 64, 2, 0}, // NOLINT + {"public", "base", "default_timestamp_col_value", 22, "CURRENT_TIMESTAMP", "timestamp with time zone", "YES", "timestamp with time zone", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), Ni(), Ni(), Ni()}, // NOLINT {"public", "base_view", "key1", 1, Ns(), "bigint", "YES", "bigint", "NEVER", Ns(), Ns(), "COMMITTED", Ni(), 64, 2, 0}, // NOLINT }); // clang-format on diff --git a/tests/conformance/data/schema_changes/pg/ddl.create_table.test b/tests/conformance/data/schema_changes/pg/ddl.create_table.test index ae95d0eb..cc9af2eb 100644 --- a/tests/conformance/data/schema_changes/pg/ddl.create_table.test +++ b/tests/conformance/data/schema_changes/pg/ddl.create_table.test @@ -269,13 +269,14 @@ CREATE TABLE "" (id bigint PRIMARY KEY); ERROR: zero-length delimited identifier at or near """" == -CREATE TABLE identity_not_supported( - id bigint PRIMARY KEY, - ident bigint GENERATED ALWAYS AS IDENTITY -); --- -ERROR: Constraint type is not supported. -== +# TODO: When identity in ddl is supported, re-enable this test. +# CREATE TABLE identity_not_supported( +# id bigint PRIMARY KEY, +# ident bigint GENERATED ALWAYS AS IDENTITY +# ); +# -- +# ERROR: Constraint type is not supported. +# == CREATE TABLE typed_table_not_supported OF some_type(col WITH OPTIONS DEFAULT 123) -- diff --git a/tests/conformance/data/schemas/information_schema.test b/tests/conformance/data/schemas/information_schema.test index 8007ff36..7f70b484 100644 --- a/tests/conformance/data/schemas/information_schema.test +++ b/tests/conformance/data/schemas/information_schema.test @@ -4,6 +4,7 @@ CREATE TABLE base ( key2 STRING(256), bool_value BOOL, int_value INT64 NOT NULL, + float_value FLOAT32, double_value FLOAT64, str_value STRING(MAX), byte_value BYTES(256), @@ -11,6 +12,7 @@ CREATE TABLE base ( date_value DATE, bool_array ARRAY NOT NULL, int_array ARRAY, + float_array ARRAY, double_array ARRAY, str_array ARRAY, byte_array ARRAY, @@ -81,6 +83,7 @@ CREATE TABLE base ( key2 varchar(256), bool_value bool, int_value bigint NOT NULL, + float_value float4, double_value float8, str_value varchar, byte_value bytea, @@ -88,6 +91,7 @@ CREATE TABLE base ( date_value date, bool_array bool[] NOT NULL, int_array bigint[], + float_array float4[], double_array float8[], str_array varchar(256)[], byte_array bytea[], diff --git a/third_party/spanner_pg/bootstrap_catalog/BUILD b/third_party/spanner_pg/bootstrap_catalog/BUILD index 7698fb33..a4115255 100644 --- a/third_party/spanner_pg/bootstrap_catalog/BUILD +++ b/third_party/spanner_pg/bootstrap_catalog/BUILD @@ -63,7 +63,10 @@ cc_library( cc_library( name = "bootstrap_catalog_info", srcs = ["bootstrap_catalog_info.c"], - hdrs = ["bootstrap_catalog_info.h"], + hdrs = [ + "bootstrap_catalog_info.h", + "bootstrap_catalog_textproto.h", + ], copts = ["-Ithird_party/spanner_pg/shims"], deps = [ ":bootstrap_catalog_srcs", @@ -128,6 +131,7 @@ genrule( outs = [ "bootstrap_catalog_info.h", "bootstrap_catalog_info.c", + "bootstrap_catalog_textproto.h", ], # Includes Spanner-specific bootstrap catalog data. # The order of the files in the following list is important. @@ -191,6 +195,8 @@ genrule( third_party/spanner_pg/src/include/catalog/pg_policy.h \ third_party/spanner_pg/src/include/catalog/pg_replication_origin.h \ third_party/spanner_pg/src/include/catalog/pg_default_acl.h \ + third_party/spanner_pg/src/include/catalog/pg_parameter_acl.h \ + third_party/spanner_pg/src/include/catalog/pg_publication_namespace.h \ third_party/spanner_pg/src/include/catalog/pg_init_privs.h \ third_party/spanner_pg/src/include/catalog/pg_seclabel.h \ third_party/spanner_pg/src/include/catalog/pg_shseclabel.h \ @@ -206,6 +212,7 @@ genrule( mv /tmp/bootstrap_catalog_info.h $(location bootstrap_catalog_info.h) mv /tmp/bootstrap_catalog_info.c $(location bootstrap_catalog_info.c) + mv /tmp/bootstrap_catalog_textproto.h $(location bootstrap_catalog_textproto.h) """, tools = ["gen_catalog_info.pl"], ) diff --git a/third_party/spanner_pg/bootstrap_catalog/bootstrap_catalog_test.cc b/third_party/spanner_pg/bootstrap_catalog/bootstrap_catalog_test.cc index 7cc468a6..08128270 100644 --- a/third_party/spanner_pg/bootstrap_catalog/bootstrap_catalog_test.cc +++ b/third_party/spanner_pg/bootstrap_catalog/bootstrap_catalog_test.cc @@ -491,6 +491,22 @@ TEST(BootstrapCatalog, SpannerBitReverseProc) { EXPECT_STREQ(NameStr(procs[0]->proname), "bit_reverse"); } +TEST(BootstrapCatalog, SpannerFarmFingerprintProc) { + ZETASQL_ASSERT_OK_AND_ASSIGN( + Oid namespace_oid, + PgBootstrapCatalog::Default()->GetNamespaceOid("spanner")); + + ZETASQL_ASSERT_OK_AND_ASSIGN( + absl::Span procs, + PgBootstrapCatalog::Default()->GetProcsByName("farm_fingerprint")); + + ASSERT_EQ(procs.size(), 2); + for (auto* proc : procs) { + EXPECT_EQ(proc->pronamespace, namespace_oid); + EXPECT_STREQ(NameStr(proc->proname), "farm_fingerprint"); + } +} + TEST(BootstrapCatalog, SpannerGetInternalSequenceStateProc) { ZETASQL_ASSERT_OK_AND_ASSIGN( Oid namespace_oid, diff --git a/third_party/spanner_pg/bootstrap_catalog/gen_catalog_info.pl b/third_party/spanner_pg/bootstrap_catalog/gen_catalog_info.pl index 74bec08a..d65365ad 100755 --- a/third_party/spanner_pg/bootstrap_catalog/gen_catalog_info.pl +++ b/third_party/spanner_pg/bootstrap_catalog/gen_catalog_info.pl @@ -32,6 +32,8 @@ BEGIN my $include_path; my $engine_catalog_path = ''; +my $num_errors = 0; + # More args means more RAM reserved for the generated tables. # Set this to the max number of args needed by any current PostgreSQL function. # (We could compute this but then the script would need to be 2-pass.) @@ -392,6 +394,9 @@ BEGIN my $headerfile = $output_path . 'bootstrap_catalog_info.h'; open my $header, '>', $headerfile . $tmpext or die "can't open $headerfile$tmpext: $!"; +my $textprotofile = $output_path . 'bootstrap_catalog_textproto.h'; +open my $textproto, '>', $textprotofile . $tmpext + or die "can't open $textprotofile$tmpext: $!"; # var for unused code my $bki; @@ -416,6 +421,12 @@ BEGIN print $header "#include \"third_party/spanner_pg/postgres_includes/all.h\"\n"; print $header "\n"; +print $textproto "#ifndef GENERATED__GEN_CATALOG_INFO_PL__BOOTSTRAP_CATALOG_TEXTPROTO_H_\n"; +print $textproto "#define GENERATED__GEN_CATALOG_INFO_PL__BOOTSTRAP_CATALOG_TEXTPROTO_H_\n"; +print $textproto "\n"; +print $textproto "#include \n"; +print $textproto "#include \n"; +print $textproto "\n"; print $cc "#include \"bootstrap_catalog_info.h\"\n"; print $cc "\n"; @@ -430,6 +441,7 @@ BEGIN print $cc "static const int ENCODING = -1; // TODO: Discover encoding\n"; print $cc "static const int SIZEOF_POINTER = sizeof(void*);\n"; print $cc "static const int ALIGNOF_POINTER = alignof(void*);\n"; +print $cc "static const int LOCALE_PROVIDER = 'c';\n"; print $cc "\n"; # produce output, one catalog at a time @@ -463,6 +475,9 @@ BEGIN { print $cc "const FormData_${catname} ${catname}_data[] = {\n"; } + print $textproto "const std::vector "; + print $textproto "${catname}_textproto_data = {\n"; + # 'bki' is PostgreSQL's name for some of the stuff we're building. # Doesn't make a lot of sense here, but the naming scheme is # shared with our common dependency `Catalog.pm`. @@ -559,9 +574,11 @@ BEGIN } } output_oid_record($cc, \%bki_values, $catalog, $catname); + output_textproto($textproto, \%bki_values, $catalog, $catname); } print $cc "};\n"; + print $textproto "};\n"; # Compute the array size in the compiled file and expose it as a symbol. # @@ -577,6 +594,7 @@ BEGIN # Abseil has a similar class span absl::Span.) print $cc "const size_t ${catname}_data_size = sizeof(${catname}_data)/sizeof(${catname}_data[0]);\n"; print $cc "\n"; + print $textproto "\n"; } print $header "#ifdef __cplusplus\n"; @@ -588,6 +606,8 @@ BEGIN print $header "\n"; print $header "#endif // GENERATED__GEN_CATALOG_INFO_PL__BOOTSTRAP_CATALOG_INFO_H_\n"; +print $textproto "#endif // GENERATED__GEN_CATALOG_INFO_PL__BOOTSTRAP_CATALOG_TEXTPROTO_H_\n"; + # We're done emitting data close $cc; close $header; @@ -595,8 +615,9 @@ BEGIN # Finally, rename the completed files into place. Catalog::RenameTempFile($ccfile, $tmpext); Catalog::RenameTempFile($headerfile, $tmpext); +Catalog::RenameTempFile($textprotofile, $tmpext); -exit 0; +exit($num_errors != 0 ? 1 : 0); #################### Subroutines ######################## @@ -798,6 +819,145 @@ sub output_oid_record print $cc "\n"; } +sub output_textproto +{ + my($cc, $values, $catalog, $catname) = @_; + print $cc " \""; + + for my $i (0..$#{ $catalog->{columns} }) + { + my $column = $catalog->{columns}[$i]; + + my $attname = $column->{name}; + my $val = $values->{$attname}; + my $coltype = $column->{type}; + output_field_for_textproto($cc, $attname, $val, $coltype, $catname); + } + + print $cc "\",\n"; +} + +# Output a single field for a textproto. +# The field looks like "fieldname: Value, ". +sub output_field_for_textproto +{ + my ($cc, $attname, $val, $coltype, $catname) = @_; + if ($val eq "_null_") + { + # Textproto will parse absent values as null. + return; + } + if (index($coltype, "_") != -1) + { + if ($val =~ /^{[\w, ]*}$/) + { + # Strip leading and trailing brackets + $val = substr($val, 1, -1); + } + my @vals; + if ($val =~ /^[\w,]*$/) { + @vals = split(/,/, $val); + } else { + @vals = split(/, /, $val); + } + + foreach my $element (@vals) + { + output_field_for_textproto( + $cc, $attname, $element, substr($coltype, 1), $catname); + } + return; + } + elsif ($coltype eq "oidvector") + { + if ($val =~ /^"[0-9 ]*"$/) + { + # Strip leading and trailing quotes + $val = substr($val, 1, -1); + } + my @vals = split(/ /, $val); + + foreach my $oid (@vals) + { + output_field_for_textproto($cc, $attname, $oid, "oid", $catname); + } + return; + } + + print $cc "$attname: "; + + if ($coltype eq "regproc" && $val !~ /^[0-9]*$/) + { + # Regproc fields are cross references. + # If $regprocoids (above) hasn't already resolved this reference to an + # oid, omit it so we can still compile. + # This probably means that the order of scanned #include files is + # wrong. + print $cc "InvalidOid /*$val*/"; + } + elsif ($coltype =~ /^int.*/ && $val =~ /^"[0-9 ]*"$/) + { + # We seem to have some quoted numbers. Not clear why. + $val = substr($val, 1, -1); + print $cc $val + } + # Format based on data type + elsif ($coltype eq "name") + { + # Make sure value is wrapped as \"STRING\" + # In the existing source, sometimes we have "STRING" + # and sometimes we just have STRING + if ($val !~ /^\{".*"\}$/) + { + $val = "\\\"$val\\\""; + } + print $cc $val; + } + elsif ($coltype eq "text") + { + print $cc "\\\"$val\\\""; + } + elsif ($coltype eq "char" && (length($val) == 0 || length($val) == 1 || substr($val, 0, 1) eq "\\")) + { + if (length($val) == 0) + { + # Represent the empty character as null. + print $cc "\\\"\\\""; + } + else + { + # Quote single-character chars + print $cc "\\\"$val\\\""; + } + } + elsif ($coltype eq "bool") + { + # Convert SQL bool syntax to textproto bool syntax. + # Pass enum/#define'd constants through. + if ($val eq "t") + { + print $cc "true"; + } + elsif ($val eq "f") + { + print $cc "false"; + } + else + { + print $cc $val; + } + } + else + { + # If we don't know what it is, + # it's probably something that is represented equivalently + # in SQL and in C. Just pass it through. + print $cc $val; + } + + print $cc ", "; +} + # Output one record of a regular FormData struct sub output_record { @@ -1165,7 +1325,7 @@ sub morph_row_for_schemapg sub lookup_oids { my ($lookup, $catname, $attname, $lookup_opt, $bki_values, @lookupnames) - = @_; + = @_; my @lookupoids; foreach my $lookupname (@lookupnames) @@ -1180,16 +1340,20 @@ sub lookup_oids push @lookupoids, $lookupname; if ($lookupname eq '-' or $lookupname eq '0') { - Carp::confess sprintf - "invalid zero OID reference in %s.dat field %s line %s\n", - $catname, $attname, $bki_values->{line_number} - if !$lookup_opt; + if (!$lookup_opt) + { + Carp::confess sprintf + "invalid zero OID reference in %s.dat field %s line %s\n", + $catname, $attname, $bki_values->{line_number}; + $num_errors++; + } } else { Carp::confess sprintf "unresolved OID reference \"%s\" in %s.dat field %s line %s\n", $lookupname, $catname, $attname, $bki_values->{line_number}; + $num_errors++; } } } diff --git a/third_party/spanner_pg/bootstrap_catalog/proc_changelist.cc b/third_party/spanner_pg/bootstrap_catalog/proc_changelist.cc index a8256dc8..4e48d8fb 100644 --- a/third_party/spanner_pg/bootstrap_catalog/proc_changelist.cc +++ b/third_party/spanner_pg/bootstrap_catalog/proc_changelist.cc @@ -81,16 +81,12 @@ absl::flat_hash_set procs_to_remove = { {"int4", {{INT8OID}, INT4OID}}, {"int4", {{JSONBOID}, INT4OID}}, {"int4", {{NUMERICOID}, INT4OID}}, - {"float4pl", {{FLOAT4OID, FLOAT4OID}, FLOAT4OID}}, {"float48pl", {{FLOAT4OID, FLOAT8OID}, FLOAT8OID}}, {"float84pl", {{FLOAT8OID, FLOAT4OID}, FLOAT8OID}}, - {"float4mi", {{FLOAT4OID, FLOAT4OID}, FLOAT4OID}}, {"float48mi", {{FLOAT4OID, FLOAT8OID}, FLOAT8OID}}, {"float84mi", {{FLOAT8OID, FLOAT4OID}, FLOAT8OID}}, - {"float4div", {{FLOAT4OID, FLOAT4OID}, FLOAT4OID}}, {"float48div", {{FLOAT4OID, FLOAT8OID}, FLOAT8OID}}, {"float84div", {{FLOAT8OID, FLOAT4OID}, FLOAT8OID}}, - {"float4mul", {{FLOAT4OID, FLOAT4OID}, FLOAT4OID}}, {"float48mul", {{FLOAT4OID, FLOAT8OID}, FLOAT8OID}}, {"float84mul", {{FLOAT8OID, FLOAT4OID}, FLOAT8OID}}, }; diff --git a/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_proc.dat b/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_proc.dat index a99885cd..62d35422 100644 --- a/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_proc.dat +++ b/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_proc.dat @@ -43,17 +43,6 @@ prorettype => 'timestamptz', proargtypes => 'text timestamptz timestamptz', prosrc => 'timestamptz_bin' }, -############################# -# FTS SPANNER.TOKENLIST I/O FUNCTIONS -############################# - { oid => '50003', proname => 'spanner_tokenlist_in', - prorettype => 'tokenlist', proargtypes => 'cstring', - prosrc => 'spangres_fts_func' }, - -{ oid => '50004', proname => 'spanner_tokenlist_out', - prorettype => 'cstring', proargtypes => 'tokenlist', - prosrc => 'spangres_fts_func' }, - ############################# # FTS TOKENIZATION FUNCTIONS ############################# @@ -131,26 +120,22 @@ { oid => '50030', proname => 'tokenize_substring', pronamespace => 'spanner', prorettype => 'tokenlist', proargtypes => 'text int8 int8 bool', - proargnames => '{value, ngram_size_max, ngram_size_min, - support_relative_search}', + proargnames => '{value, ngram_size_max, ngram_size_min, support_relative_search}', prosrc => 'spangres_fts_func' }, { oid => '50031', proname => 'tokenize_substring', pronamespace => 'spanner', prorettype => 'tokenlist', proargtypes => '_text int8 int8 bool', - proargnames => '{value, ngram_size_max, ngram_size_min, - support_relative_search}', + proargnames => '{value, ngram_size_max, ngram_size_min, support_relative_search}', prosrc => 'spangres_fts_func' }, { oid => '50032', proname => 'tokenize_substring', pronamespace => 'spanner', prorettype => 'tokenlist', proargtypes => 'text int8 int8 bool text', - proargnames => '{value, ngram_size_max, ngram_size_min, - support_relative_search, content_type}', + proargnames => '{value, ngram_size_max, ngram_size_min, support_relative_search, content_type}', prosrc => 'spangres_fts_func' }, { oid => '50033', proname => 'tokenize_substring', pronamespace => 'spanner', prorettype => 'tokenlist', proargtypes => '_text int8 int8 bool text', - proargnames => '{value, ngram_size_max, ngram_size_min, - support_relative_search, content_type}', + proargnames => '{value, ngram_size_max, ngram_size_min, support_relative_search, content_type}', prosrc => 'spangres_fts_func' }, # TOKEN @@ -289,4 +274,16 @@ proargtypes => 'text', prosrc => 'cancel_query' }, -] +############################# +# HASHING FUNCTIONS +############################# + +{ oid => '50054', proname => 'farm_fingerprint', pronamespace => 'spanner', + prorettype => 'int8', proargtypes => 'text', + prosrc => 'farm_fingerprint' }, + +{ oid => '50055', proname => 'farm_fingerprint', pronamespace => 'spanner', + prorettype => 'int8', proargtypes => 'bytea', + prosrc => 'farm_fingerprint' }, + +] \ No newline at end of file diff --git a/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_type.dat b/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_type.dat index 4f142a93..2961be98 100644 --- a/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_type.dat +++ b/third_party/spanner_pg/bootstrap_catalog/spanner_pg_data/pg_type.dat @@ -3,7 +3,7 @@ descr => 'representation for TOKENLIST type in Spanner', typname => 'tokenlist', typnamespace => 'spanner', typlen => '-1', typbyval => 'f', typcategory => 'X', - typinput => 'spanner_tokenlist_in', typoutput => 'spanner_tokenlist_out', + typinput => 'textin', typoutput => 'textout', typreceive => '-', typsend => '-', typalign => 'i', typstorage => 'p' }, ] \ No newline at end of file diff --git a/third_party/spanner_pg/catalog/BUILD b/third_party/spanner_pg/catalog/BUILD index aeaaec5f..c00f41b6 100644 --- a/third_party/spanner_pg/catalog/BUILD +++ b/third_party/spanner_pg/catalog/BUILD @@ -217,6 +217,7 @@ cc_library( "@com_google_absl//absl/types:span", "@com_google_zetasql//zetasql/base", "@com_google_zetasql//zetasql/base:no_destructor", + "@com_google_zetasql//zetasql/public:interval_value", "@com_google_zetasql//zetasql/public:options_cc_proto", "@com_google_zetasql//zetasql/public:type", "@com_google_zetasql//zetasql/public:value", @@ -568,10 +569,6 @@ cc_library( name = "emulator_function_evaluators", srcs = ["emulator_function_evaluators.cc"], hdrs = ["emulator_function_evaluators.h"], - visibility = [ - "//:__subpackages__", - "//backend/query:__subpackages__", - ], deps = [ "//third_party/spanner_pg/function_evaluators:pg_evaluators_implementations", # build_cleaner: keep "//third_party/spanner_pg/interface:pg_evaluators", @@ -640,7 +637,9 @@ cc_library( "//third_party/spanner_pg/function_evaluators:pg_evaluators_implementations", # build_cleaner: keep "//third_party/spanner_pg/interface:pg_evaluators", "@com_google_absl//absl/base", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/flags:flag", + "@com_google_absl//absl/log:check", "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", diff --git a/third_party/spanner_pg/catalog/builtin_spanner_functions.cc b/third_party/spanner_pg/catalog/builtin_spanner_functions.cc index 388a1e7f..9f0dbabb 100644 --- a/third_party/spanner_pg/catalog/builtin_spanner_functions.cc +++ b/third_party/spanner_pg/catalog/builtin_spanner_functions.cc @@ -60,6 +60,7 @@ namespace { const zetasql::Type* gsql_int64 = zetasql::types::Int64Type(); const zetasql::Type* gsql_string = zetasql::types::StringType(); const zetasql::Type* gsql_bool = zetasql::types::BoolType(); +const zetasql::Type* gsql_float = zetasql::types::FloatType(); const zetasql::Type* gsql_double = zetasql::types::DoubleType(); const zetasql::Type* gsql_bytes = zetasql::types::BytesType(); const zetasql::Type* gsql_timestamp = zetasql::types::TimestampType(); @@ -254,10 +255,11 @@ static void AddPgNumericNewFunctions( /*context_ptr=*/nullptr}, /*has_mapped_function=*/true, /*explicit_mapped_function_name=*/emulator_mod_fn_name}}}); - functions.push_back({"numeric_div_trunc", - "div", - {{{gsql_pg_numeric, - {gsql_pg_numeric, gsql_pg_numeric}, + functions.push_back( + {"numeric_div_trunc", + "div", + {{{gsql_pg_numeric, + {gsql_pg_numeric, gsql_pg_numeric}, /*context_ptr=*/nullptr}, /*has_mapped_function=*/true, /*explicit_mapped_function_name=*/emulator_div_trunc_fn_name}}}); @@ -272,7 +274,8 @@ static void AddPgNumericNewFunctions( functions.push_back( {"numeric_uminus", "$unary_minus", - {{{gsql_pg_numeric, {gsql_pg_numeric}, + {{{gsql_pg_numeric, + {gsql_pg_numeric}, /*context_ptr=*/nullptr}, /*has_mapped_function=*/true, /*explicit_mapped_function_name=*/emulator_uminus_fn_name}}}); @@ -330,6 +333,21 @@ static void AddPgNumericNewFunctions( constexpr zetasql::Function::Mode AGGREGATE = zetasql::Function::AGGREGATE; + std::vector sum_signatures = { + {{gsql_pg_numeric, {gsql_int64}, /*context_ptr=*/nullptr}}, + {{gsql_double, {gsql_double}, /*context_ptr=*/nullptr}}, + {{gsql_pg_numeric, {gsql_pg_numeric}, /*context_ptr=*/nullptr}}}; + + std::vector avg_signatures = { + {{gsql_pg_numeric, {gsql_int64}, /*context_ptr=*/nullptr}}, + {{gsql_double, {gsql_double}, /*context_ptr=*/nullptr}}, + {{gsql_pg_numeric, {gsql_pg_numeric}, /*context_ptr=*/nullptr}}}; + + sum_signatures.push_back( + {{gsql_float, {gsql_float}, /*context_ptr=*/nullptr}}); + avg_signatures.push_back( + {{gsql_double, {gsql_float}, /*context_ptr=*/nullptr}}); + // Remove existing function registration for sum. functions.erase(std::remove_if(functions.begin(), functions.end(), [](const PostgresFunctionArguments& args) { @@ -337,14 +355,9 @@ static void AddPgNumericNewFunctions( "sum"; }), functions.end()); + // Register new function mapping for sum. - functions.push_back( - {"sum", - "pg.sum", - {{{gsql_pg_numeric, {gsql_int64}, /*context_ptr=*/nullptr}}, - {{gsql_double, {gsql_double}, /*context_ptr=*/nullptr}}, - {{gsql_pg_numeric, {gsql_pg_numeric}, /*context_ptr=*/nullptr}}}, - AGGREGATE}); + functions.push_back({"sum", "pg.sum", sum_signatures, AGGREGATE}); // Remove existing function registration for avg. functions.erase(std::remove_if(functions.begin(), functions.end(), @@ -353,13 +366,7 @@ static void AddPgNumericNewFunctions( "avg"; }), functions.end()); - functions.push_back( - {"avg", - "pg.avg", - {{{gsql_pg_numeric, {gsql_int64}, /*context_ptr=*/nullptr}}, - {{gsql_double, {gsql_double}, /*context_ptr=*/nullptr}}, - {{gsql_pg_numeric, {gsql_pg_numeric}, /*context_ptr=*/nullptr}}}, - AGGREGATE}); + functions.push_back({"avg", "pg.avg", avg_signatures, AGGREGATE}); } void AddPgNumericFunctions(std::vector& functions) { @@ -887,18 +894,18 @@ void AddSpannerFunctions(std::vector& functions) { const zetasql::Type* gsql_pg_jsonb = types::PgJsonbMapping()->mapped_type(); - functions.push_back({"ml_predict_row", - "ml_predict_row", - { - {{gsql_pg_jsonb, - {gsql_string, gsql_pg_jsonb}, - /*context_ptr=*/nullptr}}, - {{gsql_pg_jsonb, - {gsql_pg_jsonb, gsql_pg_jsonb}, - /*context_ptr=*/nullptr}}, - }, - /*mode=*/zetasql::Function::SCALAR, - /*postgres_namespace=*/"spanner"}); + functions.push_back({"ml_predict_row", + "ml_predict_row", + { + {{gsql_pg_jsonb, + {gsql_string, gsql_pg_jsonb}, + /*context_ptr=*/nullptr}}, + {{gsql_pg_jsonb, + {gsql_pg_jsonb, gsql_pg_jsonb}, + /*context_ptr=*/nullptr}}, + }, + /*mode=*/zetasql::Function::SCALAR, + /*postgres_namespace=*/"spanner"}); functions.push_back({"int64_array", "int64_array", @@ -973,15 +980,21 @@ static void RemapMinFunction( const zetasql::Type* argumentType = existing_signature.signature().argument(0).type(); - if (!argumentType->IsDouble()) { - function_signatures.push_back(existing_signature); - } else { - // For double use PG.MIN function instead of default MIN to follow - // Postgres' order semantics. + // For float and double use PG.MIN function instead of default MIN to follow + // Postgres' order semantics. + if (argumentType->IsDouble()) { function_signatures.push_back( {{gsql_double, {gsql_double}, /*context_ptr=*/nullptr}, /*has_mapped_function=*/true, /*explicit_mapped_function_name=*/"pg.min"}); + } else if (argumentType->IsFloat() + ) { + function_signatures.push_back( + {{gsql_float, {gsql_float}, /*context_ptr=*/nullptr}, + /*has_mapped_function=*/true, + /*explicit_mapped_function_name=*/"pg.min"}); + } else { + function_signatures.push_back(existing_signature); } } diff --git a/third_party/spanner_pg/catalog/emulator_functions.cc b/third_party/spanner_pg/catalog/emulator_functions.cc index 97a41919..b5d8c12a 100644 --- a/third_party/spanner_pg/catalog/emulator_functions.cc +++ b/third_party/spanner_pg/catalog/emulator_functions.cc @@ -34,10 +34,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -54,7 +56,9 @@ #include "zetasql/public/types/type_factory.h" #include "zetasql/public/value.h" #include "absl/base/casts.h" +#include "absl/base/optimization.h" #include "absl/flags/flag.h" +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/cord.h" @@ -112,6 +116,7 @@ using ::zetasql::FunctionSignatureRewriteOptions; const zetasql::Type* gsql_bool = zetasql::types::BoolType(); const zetasql::Type* gsql_bytes = zetasql::types::BytesType(); const zetasql::Type* gsql_date = zetasql::types::DateType(); +const zetasql::Type* gsql_float = zetasql::types::FloatType(); const zetasql::Type* gsql_double = zetasql::types::DoubleType(); const zetasql::Type* gsql_int64 = zetasql::types::Int64Type(); const zetasql::Type* gsql_string = zetasql::types::StringType(); @@ -152,6 +157,7 @@ using ::postgres_translator::function_evaluators::DateMii; using ::postgres_translator::function_evaluators::DatePli; using ::postgres_translator::function_evaluators::Divide; using ::postgres_translator::function_evaluators::DivideTruncateTowardsZero; +using ::postgres_translator::function_evaluators::Float4ToChar; using ::postgres_translator::function_evaluators::Float8ToChar; using ::postgres_translator::function_evaluators::Floor; using ::postgres_translator::function_evaluators::Int8ToChar; @@ -428,6 +434,12 @@ absl::StatusOr EvalToChar( Float8ToChar(args[0].double_value(), args[1].string_value())); return zetasql::Value::String(result); } + case zetasql::TYPE_FLOAT: { + ZETASQL_ASSIGN_OR_RETURN( + std::string result, + Float4ToChar(args[0].float_value(), args[1].string_value())); + return zetasql::Value::String(result); + } case zetasql::TYPE_EXTENDED: if (args[0].type()->Equals(gsql_pg_numeric)) { ZETASQL_ASSIGN_OR_RETURN(absl::Cord numeric_string, @@ -464,6 +476,9 @@ std::unique_ptr ToCharFunction( zetasql::FunctionSignature{gsql_string, {gsql_double, gsql_string}, /*context_ptr=*/nullptr}, + zetasql::FunctionSignature{gsql_string, + {gsql_float, gsql_string}, + /*context_ptr=*/nullptr}, zetasql::FunctionSignature{gsql_string, {gsql_pg_numeric, gsql_string}, /*context_ptr=*/nullptr}}, @@ -890,6 +905,8 @@ std::unique_ptr CastToNumericFunction( gsql_pg_numeric, {gsql_int64}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ gsql_pg_numeric, {gsql_double}, /*context_ptr=*/nullptr}, + zetasql::FunctionSignature{ + gsql_pg_numeric, {gsql_float}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ gsql_pg_numeric, {gsql_string}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ @@ -938,6 +955,21 @@ std::unique_ptr CastNumericToDoubleFunction( function_options); } +std::unique_ptr CastNumericToFloatFunction( + absl::string_view catalog_name) { + static const zetasql::Type* gsql_pg_numeric = + spangres::datatypes::GetPgNumericType(); + + zetasql::FunctionOptions function_options; + function_options.set_evaluator(PGFunctionEvaluator(EvalCastNumericToFloat)); + return std::make_unique( + kPGCastNumericToFloatFunctionName, catalog_name, + zetasql::Function::SCALAR, + std::vector{zetasql::FunctionSignature{ + gsql_float, {gsql_pg_numeric}, /*context_ptr=*/nullptr}}, + function_options); +} + std::unique_ptr CastNumericToStringFunction( absl::string_view catalog_name) { static const zetasql::Type* gsql_pg_numeric = @@ -1497,20 +1529,22 @@ std::unique_ptr ExtractFunction( function_options); } -// Maps double value to an integer value in such a way, that the PostgreSQL -// sort order/comparison semantics of DOUBLE PRECISION (FLOAT8) type values is -// preserved in the order of obtained (after mapping) int64_t values ({input x < -// input y} => {output for x < output for y}). +// Maps float and double value to an integer value in such a way, that the +// PostgreSQL sort order/comparison semantics of FLOAT4 and FLOAT8 type +// values is preserved in the order of obtained (after mapping) int64_t values +// ({input x < input y} => {output for x < output for y}). // -// PostgreSQL FLOAT8 comparison semantic rules are as follows: +// PostgreSQL FLOAT4 or FLOAT8 comparison semantic rules are as follows: // * All Nan values are equal (including negative). // * Nan value is bigger than any other non-null floating point value. // * Negative zero (-0.0) is equal to positive zero (0.0). -absl::StatusOr EvalMapDoubleToInt( +template >> +absl::StatusOr EvalMapFloatingPointToInt( absl::Span args) { ZETASQL_RET_CHECK(args.size() == 1); - double num = args[0].double_value(); + double num = static_cast(args[0].Get()); + if (std::isnan(num)) { return zetasql::Value::Int64(std::numeric_limits::max()); } @@ -1529,7 +1563,7 @@ std::unique_ptr MapDoubleToIntFunction( const std::string& catalog_name) { zetasql::FunctionOptions function_options; function_options.set_evaluator( - zetasql::FunctionEvaluator(EvalMapDoubleToInt)); + zetasql::FunctionEvaluator(EvalMapFloatingPointToInt)); return std::make_unique( kPGMapDoubleToIntFunctionName, catalog_name, zetasql::Function::SCALAR, @@ -1540,6 +1574,21 @@ std::unique_ptr MapDoubleToIntFunction( function_options); } +std::unique_ptr MapFloatToIntFunction( + const std::string& catalog_name) { + zetasql::FunctionOptions function_options; + function_options.set_evaluator( + zetasql::FunctionEvaluator(EvalMapFloatingPointToInt)); + + return std::make_unique( + kPGMapFloatToIntFunctionName, catalog_name, zetasql::Function::SCALAR, + std::vector{ + zetasql::FunctionSignature{zetasql::types::Int64Type(), + {zetasql::types::FloatType()}, + nullptr}}, + function_options); +} + // PG Cast functions absl::StatusOr EvalToJsonbFromValue(zetasql::Value arg); @@ -1560,6 +1609,8 @@ absl::StatusOr GetStringRepresentation( return value.bool_value() ? kTrue : kFalse; case zetasql::TYPE_DOUBLE: return zetasql::RoundTripDoubleToString(value.double_value()); + case zetasql::TYPE_FLOAT: + return zetasql::RoundTripFloatToString(value.float_value()); case zetasql::TYPE_STRING: return value.string_value(); case zetasql::TYPE_BYTES: @@ -1633,14 +1684,15 @@ absl::StatusOr EvalToJsonbFromBool( return CreatePgJsonbValue(GetStringRepresentation(arg).value()); } -// Returns a normalized PG.JSONB value from the double input. -absl::StatusOr EvalToJsonbFromDouble( +// Returns a normalized PG.JSONB value from the floating point input. +template >> +absl::StatusOr EvalToJsonbFromFloatingPoint( const zetasql::Value arg) { - if (std::isnan(arg.double_value())) { + if (std::isnan(arg.Get())) { return CreatePgJsonbValueFromNormalized(absl::Cord(kNanString)); } - if (std::isinf(arg.double_value())) { - return arg.double_value() > 0 + if (std::isinf(arg.Get())) { + return arg.Get() > 0 ? CreatePgJsonbValueFromNormalized(absl::Cord(kInfString)) : CreatePgJsonbValueFromNormalized(absl::Cord(kNegInfString)); } @@ -1733,7 +1785,9 @@ absl::StatusOr EvalToJsonbFromValue( case zetasql::TYPE_BOOL: return EvalToJsonbFromBool(arg); case zetasql::TYPE_DOUBLE: - return EvalToJsonbFromDouble(arg); + return EvalToJsonbFromFloatingPoint(arg); + case zetasql::TYPE_FLOAT: + return EvalToJsonbFromFloatingPoint(arg); case zetasql::TYPE_STRING: return EvalToJsonbFromString(arg); case zetasql::TYPE_BYTES: @@ -1783,6 +1837,10 @@ std::unique_ptr ToJsonbFunction( gsql_pg_jsonb, {gsql_double}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ gsql_pg_jsonb, {gsql_double_array}, /*context_ptr=*/nullptr}, + zetasql::FunctionSignature{ + gsql_pg_jsonb, {gsql_float}, /*context_ptr=*/nullptr}, + zetasql::FunctionSignature{ + gsql_pg_jsonb, {gsql_float_array}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ gsql_pg_jsonb, {gsql_int64}, /*context_ptr=*/nullptr}, zetasql::FunctionSignature{ @@ -1818,6 +1876,8 @@ absl::StatusOr EvalCastFromJsonb( return spangres::datatypes::PgJsonbToBoolConversion(args); case zetasql::TYPE_DOUBLE: return spangres::datatypes::PgJsonbToDoubleConversion(args); + case zetasql::TYPE_FLOAT: + return spangres::datatypes::PgJsonbToFloatConversion(args); case zetasql::TYPE_STRING: return spangres::datatypes::PgJsonbToStringConversion(args); default: @@ -2127,20 +2187,22 @@ std::unique_ptr JsonbBuildObjectFunction( function_options); } -// PgDoubleLess and PgDoubleGreater are alternatives to std::less and -// std::greater which capture Postgres' ordering semantics. -// std::less and std::greater do not have proper ordering -// semantics for NaN values, they will always return false when one of the -// argument is NaN. In Postgres NaN is the highest valued float8 and NUMERIC. +// PgLesser and PgGreater are alternatives to +// std::less and std::greater which capture +// Postgres' ordering semantics. std::less and +// std::greater do not have proper ordering semantics for NaN +// values, they will always return false when one of the argument is NaN. In +// Postgres NaN is the highest valued float4, float8 and NUMERIC. // LEAST(12::float8, 3::float8, 'nan'::float8, null::float8) => 3 // GREATEST(12::float8, 3::float8, 'nan'::float8, null::float8) => NaN -class PgDoubleLess { +template >> +class PgFloatingPointLesser { public: // Returns true iff lhs is strictly less than rhs. bool operator()(const zetasql::Value lhs, const zetasql::Value rhs) const { - double typed_lhs = lhs.double_value(); - double typed_rhs = rhs.double_value(); + T typed_lhs = lhs.Get(); + T typed_rhs = rhs.Get(); if (std::isnan(typed_lhs) && std::isnan(typed_rhs)) { return false; @@ -2154,13 +2216,14 @@ class PgDoubleLess { } }; -class PgDoubleGreater { +template >> +class PgFloatingPointGreater { public: // Returns true iff lhs is strictly greater than rhs. bool operator()(const zetasql::Value lhs, const zetasql::Value rhs) const { - double typed_lhs = lhs.double_value(); - double typed_rhs = rhs.double_value(); + T typed_lhs = lhs.Get(); + T typed_rhs = rhs.Get(); if (std::isnan(typed_lhs) && std::isnan(typed_rhs)) { return false; @@ -2174,7 +2237,7 @@ class PgDoubleGreater { } }; -class PgLess { +class PgLesser { public: // Returns true iff lhs is strictly less than rhs. bool operator()(const zetasql::Value lhs, @@ -2238,7 +2301,8 @@ absl::StatusOr EvalLeastGreatest( std::pair, std::unique_ptr> LeastGreatestFunctions(const std::string& catalog_name) { - auto is_non_double_supported_type = [](const zetasql::Type* type) -> bool { + auto is_non_floating_point_supported_type = + [](const zetasql::Type* type) -> bool { return (type->IsInt64() || type->IsBool() || type->IsBytes() || type->IsString() || type->IsDate() || type->IsTimestamp()); }; @@ -2247,10 +2311,12 @@ LeastGreatestFunctions(const std::string& catalog_name) { [&](const zetasql::FunctionSignature& signature) -> absl::StatusOr { if (signature.result_type().type()->IsDouble()) { - return EvalLeastGreatest; - } else if (is_non_double_supported_type( + return EvalLeastGreatest>; + } else if (signature.result_type().type()->IsFloat()) { + return EvalLeastGreatest>; + } else if (is_non_floating_point_supported_type( signature.result_type().type())) { - return EvalLeastGreatest; + return EvalLeastGreatest; } return absl::InvalidArgumentError( absl::Substitute("Unsupported type $0 when calling $1()", @@ -2265,8 +2331,10 @@ LeastGreatestFunctions(const std::string& catalog_name) { [&](const zetasql::FunctionSignature& signature) -> absl::StatusOr { if (signature.result_type().type()->IsDouble()) { - return EvalLeastGreatest; - } else if (is_non_double_supported_type( + return EvalLeastGreatest>; + } else if (signature.result_type().type()->IsFloat()) { + return EvalLeastGreatest>; + } else if (is_non_floating_point_supported_type( signature.result_type().type())) { return EvalLeastGreatest; } @@ -2281,6 +2349,7 @@ LeastGreatestFunctions(const std::string& catalog_name) { std::vector supported_types{ zetasql::types::DoubleType(), + zetasql::types::FloatType(), zetasql::types::Int64Type(), zetasql::types::BoolType(), zetasql::types::BytesType(), @@ -2314,10 +2383,11 @@ LeastGreatestFunctions(const std::string& catalog_name) { // Aggregate functions. -class MinDoubleEvaluator : public zetasql::AggregateFunctionEvaluator { +template >> +class MinFloatingPointEvaluator : public zetasql::AggregateFunctionEvaluator { public: - explicit MinDoubleEvaluator() {} - ~MinDoubleEvaluator() override = default; + explicit MinFloatingPointEvaluator() {} + ~MinFloatingPointEvaluator() override = default; absl::Status Reset() override { return absl::OkStatus(); } @@ -2330,9 +2400,9 @@ class MinDoubleEvaluator : public zetasql::AggregateFunctionEvaluator { } const zetasql::Value value = *args[0]; - if (!value.type()->IsDouble()) { + if (!value.type()->IsDouble() && !value.type()->IsFloat()) { return absl::InvalidArgumentError( - "Cannot accumulate value which is not of type double."); + "Cannot accumulate value which is not of type double or float."); } // TODO: Figure out why IgnoreNulls(), which defaults to true @@ -2345,13 +2415,12 @@ class MinDoubleEvaluator : public zetasql::AggregateFunctionEvaluator { // comparison with the current value in context as NaN is greater than all // other values in PostgreSQL. if (result_.is_null()) { - result_ = - zetasql::Value::Double(std::numeric_limits::quiet_NaN()); + result_ = zetasql::Value::Make(std::numeric_limits::quiet_NaN()); } // Use the comparison function that respects the NaN-ordering semantics of // PostgreSQL. - if (PgDoubleLess()(value, result_)) { + if (PgFloatingPointLesser()(value, result_)) { result_ = value; } @@ -2363,15 +2432,19 @@ class MinDoubleEvaluator : public zetasql::AggregateFunctionEvaluator { private: // Initialized to NULL as it's the default value to return if no values are // provided to aggregate or if all the values to aggregate are NULL. - zetasql::Value result_ = zetasql::values::NullDouble(); + zetasql::Value result_ = zetasql::Value::MakeNull(); }; std::unique_ptr MinAggregator( const std::string& catalog_name) { zetasql::AggregateFunctionEvaluatorFactory aggregate_fn = - [](const zetasql::FunctionSignature& sig) { - return std::make_unique(); - }; + [](const zetasql::FunctionSignature& sig) + -> std::unique_ptr { + if (sig.result_type().type()->IsFloat()) { + return std::make_unique>(); + } + return std::make_unique>(); + }; zetasql::FunctionOptions options; options.set_aggregate_function_evaluator_factory(aggregate_fn); @@ -2380,6 +2453,9 @@ std::unique_ptr MinAggregator( std::vector{ zetasql::FunctionSignature{zetasql::types::DoubleType(), {zetasql::types::DoubleType()}, + nullptr}, + zetasql::FunctionSignature{zetasql::types::FloatType(), + {zetasql::types::FloatType()}, nullptr}}, options); } @@ -2478,7 +2554,9 @@ std::unique_ptr MaxNumericAggregator( options); } -// Can evaluate a sum for INT64, DOUBLE and PG.NUMERIC. +enum SumAvgAggregatorType { Sum, Avg }; + +// Can evaluate a sum for INT64, FLOAT, DOUBLE and PG.NUMERIC. class SumEvaluator : public zetasql::AggregateFunctionEvaluator { public: explicit SumEvaluator() {} @@ -2503,6 +2581,11 @@ class SumEvaluator : public zetasql::AggregateFunctionEvaluator { if (value.type_kind() == zetasql::TYPE_DOUBLE) { kind_ = zetasql::TYPE_DOUBLE; result_ = zetasql::values::NullDouble(); + } else if (value.type_kind() == zetasql::TYPE_FLOAT) { + kind_ = zetasql::TYPE_FLOAT; + // Avg of float returns a double. + result_ = IsAvgEvaluator() ? zetasql::values::NullDouble() + : zetasql::values::NullFloat(); } else if (value.type_kind() == zetasql::TYPE_INT64 || (value.type_kind() == zetasql::TYPE_EXTENDED && value.type()->Equals(gsql_pg_numeric_))) { @@ -2511,8 +2594,8 @@ class SumEvaluator : public zetasql::AggregateFunctionEvaluator { result_ = zetasql::values::Null(gsql_pg_numeric_); } else { return absl::InvalidArgumentError( - "Cannot accumulate value which is not of type INT64, DOUBLE or " - "PG.NUMERIC."); + "Cannot accumulate value which is not of type INT64, FLOAT, DOUBLE " + "or PG.NUMERIC."); } } else if (value.type_kind() != kind_ || (value.type_kind() == zetasql::TYPE_EXTENDED && @@ -2537,6 +2620,11 @@ class SumEvaluator : public zetasql::AggregateFunctionEvaluator { // correct type. ZETASQL_ASSIGN_OR_RETURN(result_, CreatePgNumericValueWithMemoryContext( absl::StrCat(value.int64_value()))); + } else if (IsAvgEvaluator() && + value.type_kind() == zetasql::TYPE_FLOAT) { + // Convert the float to double for avg calculations. + result_ = + zetasql::values::Double(static_cast(value.float_value())); } else { result_ = value; } @@ -2565,6 +2653,25 @@ class SumEvaluator : public zetasql::AggregateFunctionEvaluator { return status; } result_ = zetasql::values::Double(result); + } else if (value.type_kind() == zetasql::TYPE_FLOAT && + !IsAvgEvaluator()) { + float result; + absl::Status status; + if (!zetasql::functions::Add(result_.float_value(), value.float_value(), + &result, &status)) { + return status; + } + result_ = zetasql::values::Float(result); + } else if (value.type_kind() == zetasql::TYPE_FLOAT && IsAvgEvaluator()) { + // Calculations of avg over float values happens in the double domain. + double result; + absl::Status status; + if (!zetasql::functions::Add(result_.double_value(), + static_cast(value.float_value()), + &result, &status)) { + return status; + } + result_ = zetasql::values::Double(result); } else if (value.type_kind() == zetasql::TYPE_EXTENDED) { // Setup the memory context arena which is required for EvalNumericAdd(). ZETASQL_ASSIGN_OR_RETURN( @@ -2595,6 +2702,8 @@ class SumEvaluator : public zetasql::AggregateFunctionEvaluator { zetasql::Value result_; const zetasql::Type* gsql_pg_numeric_ = spangres::datatypes::GetPgNumericType(); + + virtual bool IsAvgEvaluator() { return false; } }; std::unique_ptr SumAggregator( @@ -2617,12 +2726,15 @@ std::unique_ptr SumAggregator( zetasql::FunctionSignature{zetasql::types::DoubleType(), {zetasql::types::DoubleType()}, nullptr}, + zetasql::FunctionSignature{zetasql::types::FloatType(), + {zetasql::types::FloatType()}, + nullptr}, zetasql::FunctionSignature{ gsql_pg_numeric, {gsql_pg_numeric}, nullptr}}, options); } -// Can evaluate the avg for INT64, DOUBLE and PG.NUMERIC. +// Can evaluate the avg for INT64, FLOAT, DOUBLE and PG.NUMERIC. class AvgEvaluator : public SumEvaluator { public: absl::StatusOr GetFinalResult() override { @@ -2634,12 +2746,13 @@ class AvgEvaluator : public SumEvaluator { return zetasql::values::Null(gsql_pg_numeric_); } - if (kind_ == zetasql::TYPE_DOUBLE) { + if (kind_ == zetasql::TYPE_DOUBLE || kind_ == zetasql::TYPE_FLOAT) { if (result_.is_null()) { return zetasql::values::NullDouble(); } double result; absl::Status status; + // `result_` is always a double value, even for when the input is float. if (!zetasql::functions::Divide(result_.double_value(), static_cast(count_), &result, &status)) { @@ -2658,6 +2771,9 @@ class AvgEvaluator : public SumEvaluator { CreatePgNumericValue(absl::StrCat(count_))); return EvalNumericDivide(absl::MakeConstSpan({result_, count_as_numeric})); } + + protected: + virtual bool IsAvgEvaluator() override { return true; } }; std::unique_ptr AvgAggregator( @@ -2680,6 +2796,9 @@ std::unique_ptr AvgAggregator( zetasql::FunctionSignature{zetasql::types::DoubleType(), {zetasql::types::DoubleType()}, nullptr}, + zetasql::FunctionSignature{zetasql::types::DoubleType(), + {zetasql::types::FloatType()}, + nullptr}, zetasql::FunctionSignature{ gsql_pg_numeric, {gsql_pg_numeric}, nullptr}}, options); @@ -3225,6 +3344,23 @@ absl::StatusOr EvalCastNumericToDouble( return zetasql::Value::Double(out); } +absl::StatusOr EvalCastNumericToFloat( + absl::Span args) { + ZETASQL_RET_CHECK(args.size() == 1); + if (args[0].is_null()) { + return zetasql::Value::NullFloat(); + } + ZETASQL_ASSIGN_OR_RETURN(absl::Cord normalized_value, + GetPgNumericNormalizedValue(args[0])); + float out; + bool result = absl::SimpleAtof(std::string(normalized_value), &out); + if (!result || std::isinf(out)) { + return absl::OutOfRangeError(absl::StrCat("Cannot cast to float from ", + std::string(normalized_value))); + } + return zetasql::Value::Float(out); +} + absl::StatusOr EvalCastNumericToString( absl::Span args) { ZETASQL_RET_CHECK(args.size() == 1); @@ -3236,6 +3372,21 @@ absl::StatusOr EvalCastNumericToString( return zetasql::Value::String(std::string(normalized_value)); } +namespace { +template >> +absl::StatusOr FloatingPointToNumeric( + zetasql::Value gsql_value) { + if (std::isnan(gsql_value.Get())) { + return kNan; + } else if (std::isinf(gsql_value.Get())) { + return absl::InvalidArgumentError("Cannot cast infinity to PG.NUMERIC"); + } else { + return absl::StrFormat("%.*g", std::numeric_limits::digits10, + gsql_value.Get()); + } +} +} // namespace + absl::StatusOr EvalCastToNumeric( absl::Span args) { ZETASQL_RET_CHECK(!args.empty() && args.size() < 4); @@ -3267,18 +3418,15 @@ absl::StatusOr EvalCastToNumeric( case zetasql::TYPE_INT64: input_to_string = absl::StrCat(args[0].int64_value()); break; - case zetasql::TYPE_DOUBLE: - if (std::isnan(args[0].double_value())) { - input_to_string = kNan; - break; - } - if (std::isinf(args[0].double_value())) { - return absl::InvalidArgumentError("Cannot cast infinity to PG.NUMERIC"); - } - input_to_string = - absl::StrFormat("%.*g", std::numeric_limits::digits10, - args[0].double_value()); + case zetasql::TYPE_DOUBLE: { + ZETASQL_ASSIGN_OR_RETURN(input_to_string, + FloatingPointToNumeric(args[0])); + break; + } + case zetasql::TYPE_FLOAT: { + ZETASQL_ASSIGN_OR_RETURN(input_to_string, FloatingPointToNumeric(args[0])); break; + } case zetasql::TYPE_STRING: input_to_string = args[0].string_value(); break; @@ -3374,6 +3522,88 @@ absl::StatusOr EvalCastOidToString( return zetasql::Value::String(absl::StrCat(oid)); } +namespace { +inline bool FloatDivide(float in1, float in2, float* out, absl::Status* error) { + if (ABSL_PREDICT_FALSE(in2 == 0)) { + *error = absl::OutOfRangeError( + absl::StrCat("division by zero: ", in1, " / ", in2)); + return false; + } + *out = in1 / in2; + if (ABSL_PREDICT_TRUE(std::isfinite(*out))) { + return true; + } else if (!std::isfinite(in1) || !std::isfinite(in2)) { + return true; + } else { + *error = absl::OutOfRangeError( + absl::StrCat("float overflow: ", in1, " / ", in2)); + return false; + } +} +} // namespace + +absl::StatusOr EvalFloatArithmetic( + absl::Span args, + std::function Fn) { + ZETASQL_RET_CHECK(args.size() == 2 && Fn != nullptr); + if (args[0].is_null() || args[1].is_null()) { + return zetasql::Value::Null(zetasql::types::FloatType()); + } + + float arg0 = args[0].float_value(); + float arg1 = args[1].float_value(); + + float result; + absl::Status error; + bool is_success = Fn(arg0, arg1, &result, &error); + + if (!is_success || !error.ok()) { + return error; + } + + return zetasql::Value::Float(result); +} + +std::unique_ptr FloatArithmeticFunction( + absl::string_view function_name, absl::string_view catalog_name) { + zetasql::FunctionOptions function_options; + + if (function_name == kPGFloatAddFunctionName) { + function_options.set_evaluator( + PGFunctionEvaluator([&](absl::Span args) { + return EvalFloatArithmetic(args, zetasql::functions::Add); + })); + } else if (function_name == kPGFloatSubtractFunctionName) { + function_options.set_evaluator( + PGFunctionEvaluator([&](absl::Span args) { + return EvalFloatArithmetic(args, + zetasql::functions::Subtract); + })); + } else if (function_name == kPGFloatMultiplyFunctionName) { + function_options.set_evaluator( + PGFunctionEvaluator([&](absl::Span args) { + return EvalFloatArithmetic(args, + zetasql::functions::Multiply); + })); + } else if (function_name == kPGFloatDivideFunctionName) { + function_options.set_evaluator( + PGFunctionEvaluator([&](absl::Span args) { + return EvalFloatArithmetic(args, FloatDivide); + })); + } else { + ABSL_DCHECK(false) << "Unsupported float arithmetic function: " + << function_name; + return nullptr; + } + + return std::make_unique( + function_name, catalog_name, zetasql::Function::SCALAR, + std::vector{{gsql_float, + {gsql_float, gsql_float}, + /*context_ptr=*/nullptr}}, + function_options); +} + SpannerPGFunctions GetSpannerPGFunctions(const std::string& catalog_name) { SpannerPGFunctions functions; @@ -3397,6 +3627,9 @@ SpannerPGFunctions GetSpannerPGFunctions(const std::string& catalog_name) { auto map_double_to_int_func = MapDoubleToIntFunction(catalog_name); functions.push_back(std::move(map_double_to_int_func)); + auto map_float_to_int_func = MapFloatToIntFunction(catalog_name); + functions.push_back(std::move(map_float_to_int_func)); + auto least_greatest_funcs = LeastGreatestFunctions(catalog_name); functions.push_back(std::move(least_greatest_funcs.first)); // least functions.push_back(std::move(least_greatest_funcs.second)); // greatest @@ -3467,6 +3700,19 @@ SpannerPGFunctions GetSpannerPGFunctions(const std::string& catalog_name) { auto jsonb_build_object_func = JsonbBuildObjectFunction(catalog_name); functions.push_back(std::move(jsonb_build_object_func)); + auto float_add_func = + FloatArithmeticFunction(kPGFloatAddFunctionName, catalog_name); + functions.push_back(std::move(float_add_func)); + auto float_subtract_func = + FloatArithmeticFunction(kPGFloatSubtractFunctionName, catalog_name); + functions.push_back(std::move(float_subtract_func)); + auto float_multiply_func = + FloatArithmeticFunction(kPGFloatMultiplyFunctionName, catalog_name); + functions.push_back(std::move(float_multiply_func)); + auto float_divide_func = + FloatArithmeticFunction(kPGFloatDivideFunctionName, catalog_name); + functions.push_back(std::move(float_divide_func)); + auto numeric_abs_func = NumericAbsFunction(catalog_name); functions.push_back(std::move(numeric_abs_func)); auto numeric_add_func = NumericAddFunction(catalog_name); @@ -3495,6 +3741,8 @@ SpannerPGFunctions GetSpannerPGFunctions(const std::string& catalog_name) { functions.push_back(std::move(cast_numeric_to_int64_func)); auto cast_numeric_to_double_func = CastNumericToDoubleFunction(catalog_name); functions.push_back(std::move(cast_numeric_to_double_func)); + auto cast_numeric_to_float_func = CastNumericToFloatFunction(catalog_name); + functions.push_back(std::move(cast_numeric_to_float_func)); auto cast_to_numeric_func = CastToNumericFunction(catalog_name); functions.push_back(std::move(cast_to_numeric_func)); auto cast_numeric_to_string_func = CastNumericToStringFunction(catalog_name); diff --git a/third_party/spanner_pg/catalog/emulator_functions.h b/third_party/spanner_pg/catalog/emulator_functions.h index 8d2b9c22..623044ed 100644 --- a/third_party/spanner_pg/catalog/emulator_functions.h +++ b/third_party/spanner_pg/catalog/emulator_functions.h @@ -53,6 +53,7 @@ inline constexpr char kPGCastToTimestampFunctionName[] = "pg.cast_to_timestamp"; // Functions to capture NULL/NaN ordering semantics of PG. inline constexpr char kPGMapDoubleToIntFunctionName[] = "pg.map_double_to_int"; +inline constexpr char kPGMapFloatToIntFunctionName[] = "pg.map_float_to_int"; inline constexpr char kPGLeastFunctionName[] = "pg.least"; inline constexpr char kPGGreatestFunctionName[] = "pg.greatest"; @@ -119,6 +120,12 @@ inline constexpr char kPGJsonbBuildArrayFunctionName[] = "pg.jsonb_build_array"; inline constexpr char kPGJsonbBuildObjectFunctionName[] = "pg.jsonb_build_object"; +// PG float functions. +inline constexpr char kPGFloatAddFunctionName[] = "pg.float_add"; +inline constexpr char kPGFloatSubtractFunctionName[] = "pg.float_subtract"; +inline constexpr char kPGFloatMultiplyFunctionName[] = "pg.float_multiply"; +inline constexpr char kPGFloatDivideFunctionName[] = "pg.float_divide"; + // PG NUMERIC functions. inline constexpr char kPGNumericAddFunctionName[] = "pg.numeric_add"; inline constexpr char kPGNumericDivideFunctionName[] = "pg.numeric_divide"; @@ -129,6 +136,7 @@ inline constexpr char kPGNumericUminusFunctionName[] = "pg.numeric_uminus"; inline constexpr char kPGCastToNumericFunctionName[] = "pg.cast_to_numeric"; inline constexpr char kPGCastNumericToDoubleFunctionName[] = "pg.cast_to_double"; +inline constexpr char kPGCastNumericToFloatFunctionName[] = "pg.cast_to_float"; inline constexpr char kPGCastNumericToStringFunctionName[] = "pg.cast_to_string"; inline constexpr char kPGCastNumericToInt64FunctionName[] = "pg.cast_to_int64"; @@ -171,6 +179,9 @@ absl::StatusOr EvalCastNumericToInt64( absl::StatusOr EvalCastNumericToDouble( absl::Span args); +absl::StatusOr EvalCastNumericToFloat( + absl::Span args); + absl::StatusOr EvalCastNumericToString( absl::Span args); diff --git a/third_party/spanner_pg/catalog/emulator_functions_test.cc b/third_party/spanner_pg/catalog/emulator_functions_test.cc index 175063ce..445797b0 100644 --- a/third_party/spanner_pg/catalog/emulator_functions_test.cc +++ b/third_party/spanner_pg/catalog/emulator_functions_test.cc @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -178,6 +179,21 @@ const zetasql::Value kDoubleMinValue = const zetasql::Value kDoubleLowestValue = zetasql::values::Double(std::numeric_limits::lowest()); +const zetasql::Value kNullFloatValue = zetasql::values::NullFloat(); +const zetasql::Value kFloatValue = zetasql::values::Float(1.0); +const zetasql::Value kPosInfFloatValue = + zetasql::values::Float(std::numeric_limits::infinity()); +const zetasql::Value kNegInfFloatValue = + zetasql::values::Float(-1 * std::numeric_limits::infinity()); +const zetasql::Value kFloatNaNValue = + zetasql::values::Float(std::numeric_limits::quiet_NaN()); +const zetasql::Value kFloatMaxValue = + zetasql::values::Float(std::numeric_limits::max()); +const zetasql::Value kFloatMinValue = + zetasql::values::Float(std::numeric_limits::min()); +const zetasql::Value kFloatLowestValue = + zetasql::values::Float(std::numeric_limits::lowest()); + const zetasql::Value kNullInt64Value = zetasql::values::NullInt64(); const zetasql::Value kInt64Value = zetasql::values::Int64(1); const zetasql::Value kInt64MaxValue = @@ -812,6 +828,50 @@ INSTANTIATE_TEST_SUITE_P( {CreatePgNumericNullValue()}, kNullDoubleValue}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("1.00001")}, + zetasql::Value::Float(1.00001f)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("0.299997")}, + zetasql::Value::Float(0.299997f)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("0.2999997")}, + zetasql::Value::Float(0.2999997f)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("299997")}, + zetasql::Value::Float(299997)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("2999997")}, + zetasql::Value::Float(2999997)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("-0.2999997")}, + zetasql::Value::Float(-0.2999997f)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("-0.29999997")}, + zetasql::Value::Float(-0.29999997f)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("-2999997")}, + zetasql::Value::Float(-2999997)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("-29999997")}, + zetasql::Value::Float(-29999997)}, + PGScalarFunctionTestCase{ + kPGCastNumericToFloatFunctionName, + {*CreatePgNumericValueWithMemoryContext("NaN")}, + kFloatNaNValue}, + PGScalarFunctionTestCase{kPGCastNumericToFloatFunctionName, + {CreatePgNumericNullValue()}, + kNullFloatValue}, + PGScalarFunctionTestCase{kPGCastNumericToStringFunctionName, {kPGNumericNaNValue}, zetasql::Value::String("NaN")}, @@ -877,6 +937,11 @@ INSTANTIATE_TEST_SUITE_P( {zetasql::Value::String("123.123"), zetasql::Value::Int64(5), zetasql::Value::Int64(2)}, *CreatePgNumericValueWithMemoryContext("123.12")}, + PGScalarFunctionTestCase{ + kPGCastToNumericFunctionName, + {zetasql::Value::String("294"), zetasql::Value::Int64(2), + zetasql::Value::Int64(-1)}, + *CreatePgNumericValueWithMemoryContext("290")}, PGScalarFunctionTestCase{ kPGCastToNumericFunctionName, {zetasql::Value::String("NaN"), zetasql::Value::Int64(5), @@ -1654,7 +1719,94 @@ INSTANTIATE_TEST_SUITE_P( zetasql::values::NullBool()}, PGScalarFunctionTestCase{kPGOidGreaterThanEqualsFunctionName, {kNullPGOidValue, kPGOidMinValue}, - zetasql::values::NullBool()})); + zetasql::values::NullBool()}, + + // PG.FLOAT_ADD + PGScalarFunctionTestCase{kPGFloatAddFunctionName, + {kNullFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatAddFunctionName, + {kNullFloatValue, kFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatAddFunctionName, + {kFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatAddFunctionName, + {kFloatValue, kFloatValue}, + zetasql::values::Float(2.0f)}, + + // PG.FLOAT_SUBTRACT + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {kNullFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {kNullFloatValue, kFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {kFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {kFloatValue, kFloatValue}, + zetasql::values::Float(0)}, + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {kFloatValue, zetasql::values::Float(2.0)}, + zetasql::values::Float(-1.0f)}, + PGScalarFunctionTestCase{kPGFloatSubtractFunctionName, + {zetasql::values::Float(2.0), kFloatValue}, + zetasql::values::Float(1.0f)}, + + // PG.FLOAT_MULTIPLY + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kNullFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kNullFloatValue, kFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kFloatValue, kFloatValue}, + zetasql::values::Float(1.0f)}, + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kFloatValue, zetasql::values::Float(-2.0f)}, + zetasql::values::Float(-2.0f)}, + PGScalarFunctionTestCase{kPGFloatMultiplyFunctionName, + {kFloatValue, zetasql::values::Float(0)}, + zetasql::values::Float(0)}, + + // PG.FLOAT_DIVIDE + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {kNullFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {kNullFloatValue, kFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {kFloatValue, kNullFloatValue}, + zetasql::values::NullFloat()}, + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {kFloatValue, kFloatValue}, + zetasql::values::Float(1.0f)}, + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {kFloatValue, zetasql::values::Float(2.0)}, + zetasql::values::Float(0.5f)}, + PGScalarFunctionTestCase{kPGFloatDivideFunctionName, + {zetasql::values::Float(2.0), kFloatValue}, + zetasql::values::Float(2.0f)}), + [](const testing::TestParamInfo& info) { + std::string name = absl::StrCat( + "idx_", info.index, "_", info.param.function_name, "_", + absl::StrJoin(info.param.function_arguments, "_", + [](std::string* out, zetasql::Value v) { + absl::StrAppend( + out, absl::StrCat(v.type()->DebugString(), "_", + // Limit number of chars. + v.DebugString().substr(0, 10))); + })); + absl::c_replace_if(name, [](char c) { return !std::isalnum(c); }, '_'); + return name; + }); TEST_F(EmulatorFunctionsTest, RegexpMatchReturnsNullElementForUnmatchedOptionalCapturingGroups) { @@ -1941,6 +2093,125 @@ TEST_F(EmulatorFunctionsTest, UminusReturnsErrorWhenArgumentsAreInvalid) { zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); } +TEST_F(EmulatorFunctionsTest, FloatAddReturnsErrorWhenArgumentsAreInvalid) { + const zetasql::Function* function = + functions_[kPGFloatAddFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + std::vector args = {}; + EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); +} + +TEST_F(EmulatorFunctionsTest, FloatAddReturnsErrorWhenResultIsOverflow) { + const zetasql::Function* function = + functions_[kPGFloatAddFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kFloatMaxValue, kFloatMaxValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); + + EXPECT_THAT( + evaluator_(absl::MakeConstSpan({kFloatLowestValue, kFloatLowestValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); +} + +TEST_F(EmulatorFunctionsTest, + FloatSubtractReturnsErrorWhenArgumentsAreInvalid) { + const zetasql::Function* function = + functions_[kPGFloatSubtractFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + std::vector args = {}; + EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); +} + +TEST_F(EmulatorFunctionsTest, FloatSubtractReturnsErrorWhenResultIsOverflow) { + const zetasql::Function* function = + functions_[kPGFloatSubtractFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatLowestValue, kFloatMaxValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatMaxValue, kFloatLowestValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); +} + +TEST_F(EmulatorFunctionsTest, + FloatMultiplyReturnsErrorWhenArgumentsAreInvalid) { + const zetasql::Function* function = + functions_[kPGFloatMultiplyFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + std::vector args = {}; + EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); +} + +TEST_F(EmulatorFunctionsTest, FloatMultiplyReturnsErrorWhenResultIsOverflow) { + const zetasql::Function* function = + functions_[kPGFloatMultiplyFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kFloatMaxValue, kFloatMaxValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatLowestValue, kFloatLowestValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); +} + +TEST_F(EmulatorFunctionsTest, FloatDivideReturnsErrorWhenArgumentsAreInvalid) { + const zetasql::Function* function = + functions_[kPGFloatDivideFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + std::vector args = {}; + EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); +} + +TEST_F(EmulatorFunctionsTest, FloatDivideReturnsErrorWhenDividingByZero) { + const zetasql::Function* function = + functions_[kPGFloatDivideFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatMaxValue, zetasql::Value::Float(0.0f)})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatMinValue, zetasql::Value::Float(0.0f)})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); +} + +TEST_F(EmulatorFunctionsTest, FloatDivideReturnsErrorWhenResultIsOverflow) { + const zetasql::Function* function = + functions_[kPGFloatDivideFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatMaxValue, kFloatMinValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); + + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {kFloatLowestValue, kFloatMinValue})), + zetasql_base::testing::StatusIs(absl::StatusCode::kOutOfRange)); +} + TEST_F(EmulatorFunctionsTest, CastOidToInt64ReturnsErrorWhenArgumentsAreInvalid) { const zetasql::Function* function = @@ -2031,6 +2302,24 @@ TEST_F(EmulatorFunctionsTest, HasSubstr("Cannot cast to double"))); } +TEST_F(EmulatorFunctionsTest, + CastNumericToFloatReturnsErrorWhenArgumentsAreInvalid) { + const zetasql::Function* function = + functions_[kPGCastNumericToFloatFunctionName].get(); + ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( + function->signatures().front())); + // Insufficient arguments. + std::vector args = {}; + EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); + // Value too small to be represented by a float. + EXPECT_THAT( + evaluator_(absl::MakeConstSpan( + {*CreatePgNumericValueWithMemoryContext("-3.4028238e+38")})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("Cannot cast to float"))); +} + TEST_F(EmulatorFunctionsTest, CastNumericToStringReturnsErrorWhenArgumentsAreInvalid) { const zetasql::Function* function = @@ -2144,16 +2433,11 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithOutOfRangePrecisionScaleError) { function->signatures().front())); // Out of range precision and scale - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kPGNumericValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(3)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kPGNumericValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kPGNumericValue, + zetasql::Value::Int64(2), + zetasql::Value::Int64(3)})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); EXPECT_THAT(evaluator_(absl::MakeConstSpan({kPGNumericValue, zetasql::Value::Int64(1001), zetasql::Value::Int64(0)})), @@ -2169,39 +2453,27 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithOutOfRangePrecisionScaleError) { zetasql::Value::Int64(0)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_(absl::MakeConstSpan({zetasql::Value::String("1.0"), - zetasql::Value::Int64(2), - zetasql::Value::Int64(3)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({zetasql::Value::String("1.0"), + zetasql::Value::Int64(2), + zetasql::Value::Int64(3)})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); // Test that out-of-range precision and scale is checked first when value is // special (NaN/NULL). - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kNullPGNumericValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(3)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kPGNumericNaNValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(3)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kNullDoubleValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kDoubleNaNValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kPosInfDoubleValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNullPGNumericValue, + zetasql::Value::Int64(2), + zetasql::Value::Int64(3)})), + zetasql_base::testing::IsOkAndHolds(kNullPGNumericValue)); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNullDoubleValue, + zetasql::Value::Int64(2), + zetasql::Value::Int64(-1)})), + zetasql_base::testing::IsOkAndHolds(kNullPGNumericValue)); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kPosInfDoubleValue, + zetasql::Value::Int64(2), + zetasql::Value::Int64(-1)})), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("Cannot cast infinity to PG.NUMERIC"))); EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNegInfDoubleValue, zetasql::Value::Int64(1001), zetasql::Value::Int64(0)})), @@ -2217,11 +2489,10 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithOutOfRangePrecisionScaleError) { zetasql::Value::Int64(0)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kNullStringValue, zetasql::Value::Int64(2), - zetasql::Value::Int64(3)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNullStringValue, + zetasql::Value::Int64(2), + zetasql::Value::Int64(3)})), + zetasql_base::testing::IsOkAndHolds(kNullPGNumericValue)); EXPECT_THAT(evaluator_(absl::MakeConstSpan({zetasql::Value::String("-Inf"), zetasql::Value::Int64(10001), zetasql::Value::Int64(3)})), @@ -2288,11 +2559,11 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithInfinityDoubleError) { // Infinity double value with out of range precision and scale: expect error // regarding invalid precision/scale - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kNegInfDoubleValue, zetasql::Value::Int64(100), - zetasql::Value::Int64(1000)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNegInfDoubleValue, + zetasql::Value::Int64(100), + zetasql::Value::Int64(1000)})), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("Cannot cast infinity to PG.NUMERIC"))); EXPECT_THAT(evaluator_(absl::MakeConstSpan( {kPosInfDoubleValue, zetasql::Value::Int64(1001)})), StatusIs(absl::StatusCode::kInvalidArgument, @@ -2301,11 +2572,11 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithInfinityDoubleError) { {kPosInfDoubleValue, zetasql::Value::Int64(0)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({kNegInfDoubleValue, zetasql::Value::Int64(100), - zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({kNegInfDoubleValue, + zetasql::Value::Int64(100), + zetasql::Value::Int64(-1)})), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("Cannot cast infinity to PG.NUMERIC"))); // Infinity double value with null precision and scale: expect error regarding // null @@ -2423,7 +2694,8 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithInfinityStringError) { evaluator_(absl::MakeConstSpan({zetasql::Value::String("-infinity"), zetasql::Value::Int64(100), zetasql::Value::Int64(1000)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); EXPECT_THAT( evaluator_(absl::MakeConstSpan({zetasql::Value::String(" INFinity "), zetasql::Value::Int64(1001)})), @@ -2434,11 +2706,11 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithInfinityStringError) { zetasql::Value::Int64(0)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_(absl::MakeConstSpan({zetasql::Value::String("-iNf"), - zetasql::Value::Int64(100), - zetasql::Value::Int64(1000)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan({zetasql::Value::String("-iNf"), + zetasql::Value::Int64(100), + zetasql::Value::Int64(1000)})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); EXPECT_THAT(evaluator_(absl::MakeConstSpan({zetasql::Value::String("inf"), zetasql::Value::Int64(1001)})), StatusIs(absl::StatusCode::kInvalidArgument, @@ -2616,11 +2888,6 @@ TEST_F(EmulatorFunctionsTest, zetasql::Value::Int64(1001)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_(absl::MakeConstSpan({zetasql::Value::String("1e-100000"), - zetasql::Value::Int64(3), - zetasql::Value::Int64(100)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); EXPECT_THAT( evaluator_(absl::MakeConstSpan( {zetasql::Value::String("1e-10000"), zetasql::Value::Int64(0)})), @@ -2692,12 +2959,12 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithTooLargeStringValueError) { // Values are too large to be represented as a numeric value but precision and // scale are invalid: expect error regarding invalid precision/scale - EXPECT_THAT( - evaluator_( - absl::MakeConstSpan({zetasql::Value::String(std::string( - kMaxPGNumericWholeDigits + 1, '9')), - kInt64Value, zetasql::Value::Int64(1000)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {zetasql::Value::String( + std::string(kMaxPGNumericWholeDigits + 1, '9')), + kInt64Value, zetasql::Value::Int64(1000)})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); EXPECT_THAT( evaluator_(absl::MakeConstSpan( {zetasql::Value::String(std::string( @@ -2713,13 +2980,13 @@ TEST_F(EmulatorFunctionsTest, CastToNumericWithTooLargeStringValueError) { zetasql::Value::Int64(0)})), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC precision"))); - EXPECT_THAT( - evaluator_(absl::MakeConstSpan( - {zetasql::Value::String(absl::StrCat( - std::string(kMaxPGNumericWholeDigits + 1, '9'), ".", - std::string(kMaxPGNumericFractionalDigits + 1, '9'))), - kInt64Value, zetasql::Value::Int64(-1)})), - StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("NUMERIC scale"))); + EXPECT_THAT(evaluator_(absl::MakeConstSpan( + {zetasql::Value::String(absl::StrCat( + std::string(kMaxPGNumericWholeDigits + 1, '9'), ".", + std::string(kMaxPGNumericFractionalDigits + 1, '9'))), + kInt64Value, zetasql::Value::Int64(-1)})), + StatusIs(absl::StatusCode::kOutOfRange, + HasSubstr("numeric field overflow"))); // Values are too large to be represented as a numeric value but precision and // scale are null: expect error regarding null @@ -3500,22 +3767,28 @@ TEST_F(EvalCastToTimestampTest, InvalidArgsCount) { zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); } -class EvalMapDoubleToIntTest : public EmulatorFunctionsTest { +template >> +class EvalMapFloatingPointToIntTest : public EmulatorFunctionsTest { protected: void SetUp() override { - const zetasql::Function* function = - functions_[kPGMapDoubleToIntFunctionName].get(); + const zetasql::Function* function; + if constexpr (std::is_same_v) { + function = functions_[kPGMapDoubleToIntFunctionName].get(); + } else { + function = functions_[kPGMapFloatToIntFunctionName].get(); + } ZETASQL_ASSERT_OK_AND_ASSIGN(evaluator_, (function->GetFunctionEvaluatorFactory())( function->signatures().front())); } - void VerifyEquality(const absl::Span values) { + void VerifyEquality(const absl::Span values) { ASSERT_GT(values.size(), 1); for (int i = 1; i < values.size(); i++) { std::vector args1 = { - zetasql::values::Double(values[i - 1])}; + zetasql::Value::Make(values[i - 1])}; std::vector args2 = { - zetasql::values::Double(values[i])}; + zetasql::Value::Make(values[i])}; ZETASQL_ASSERT_OK_AND_ASSIGN(zetasql::Value res1, evaluator_(absl::MakeConstSpan(args1))); ZETASQL_ASSERT_OK_AND_ASSIGN(zetasql::Value res2, @@ -3524,13 +3797,13 @@ class EvalMapDoubleToIntTest : public EmulatorFunctionsTest { } } - void VerifyGivenOrder(const absl::Span values) { + void VerifyGivenOrder(const absl::Span values) { ASSERT_GT(values.size(), 1); for (int i = 1; i < values.size(); i++) { std::vector args1 = { - zetasql::values::Double(values[i - 1])}; + zetasql::Value::Make(values[i - 1])}; std::vector args2 = { - zetasql::values::Double(values[i])}; + zetasql::Value::Make(values[i])}; ZETASQL_ASSERT_OK_AND_ASSIGN(zetasql::Value res1, evaluator_(absl::MakeConstSpan(args1))); ZETASQL_ASSERT_OK_AND_ASSIGN(zetasql::Value res2, @@ -3546,39 +3819,55 @@ class EvalMapDoubleToIntTest : public EmulatorFunctionsTest { } }; +using FloatTypes = ::testing::Types; +TYPED_TEST_SUITE(EvalMapFloatingPointToIntTest, FloatTypes); + // Verifies that all Nans are mapped to the same value. -TEST_F(EvalMapDoubleToIntTest, NansEquality) { - VerifyEquality({std::numeric_limits::quiet_NaN(), - -std::numeric_limits::quiet_NaN(), - std::numeric_limits::signaling_NaN(), - -std::numeric_limits::signaling_NaN(), -std::nan(""), - -std::nan(RandomString().c_str())}); +TYPED_TEST(EvalMapFloatingPointToIntTest, NansEquality) { + TypeParam nan1; + TypeParam nan2; + + if constexpr (std::is_same_v) { + nan1 = -std::nan(""); + nan2 = -std::nan(this->RandomString().c_str()); + } else { + nan1 = -std::nanf(""); + nan2 = -std::nanf(this->RandomString().c_str()); + } + + this->VerifyEquality({std::numeric_limits::quiet_NaN(), + -std::numeric_limits::quiet_NaN(), + std::numeric_limits::signaling_NaN(), + -std::numeric_limits::signaling_NaN(), nan1, + nan2}); } // Verifies that all Zeros are mapped to the same value. -TEST_F(EvalMapDoubleToIntTest, ZerosEquality) { VerifyEquality({0.0, -0.0}); } +TYPED_TEST(EvalMapFloatingPointToIntTest, ZerosEquality) { + this->VerifyEquality({0.0, -0.0}); +} // Verifies that outputs follow PostgreSQL FLOAT8 order rules for inputs. -TEST_F(EvalMapDoubleToIntTest, FixedOrder) { - VerifyGivenOrder({-std::numeric_limits::infinity(), - std::numeric_limits::lowest(), -1.03, - -std::numeric_limits::min(), 0, - std::numeric_limits::min(), 1, - std::numeric_limits::max(), - std::numeric_limits::infinity(), - std::numeric_limits::quiet_NaN()}); +TYPED_TEST(EvalMapFloatingPointToIntTest, FixedOrder) { + this->VerifyGivenOrder({-std::numeric_limits::infinity(), + std::numeric_limits::lowest(), -1.03, + -std::numeric_limits::min(), 0, + std::numeric_limits::min(), 1, + std::numeric_limits::max(), + std::numeric_limits::infinity(), + std::numeric_limits::quiet_NaN()}); } -TEST_F(EvalMapDoubleToIntTest, RandomOrder) { +TYPED_TEST(EvalMapFloatingPointToIntTest, RandomOrder) { // Add at least two distrinct values, so we never end up with one value after // dedup. - std::vector values{std::numeric_limits::min(), 0}; + std::vector values{std::numeric_limits::min(), 0}; absl::BitGen gen; for (int i = 0; i < 10; i++) { values.push_back( - absl::Uniform(absl::IntervalClosedClosed, gen, - -std::numeric_limits::infinity(), - std::numeric_limits::infinity())); + absl::Uniform(absl::IntervalClosedClosed, gen, + -std::numeric_limits::infinity(), + std::numeric_limits::infinity())); } std::sort(values.begin(), values.end()); @@ -3586,12 +3875,12 @@ TEST_F(EvalMapDoubleToIntTest, RandomOrder) { values.erase(std::unique(values.begin(), values.end()), values.end()); // Verification. - VerifyGivenOrder(values); + this->VerifyGivenOrder(values); } -TEST_F(EvalMapDoubleToIntTest, InvalidArgsCount) { +TYPED_TEST(EvalMapFloatingPointToIntTest, InvalidArgsCount) { std::vector args = {}; - EXPECT_THAT(evaluator_(absl::MakeConstSpan(args)), + EXPECT_THAT(this->evaluator_(absl::MakeConstSpan(args)), zetasql_base::testing::StatusIs(absl::StatusCode::kInternal)); } @@ -3622,10 +3911,10 @@ TEST_P(EvalLeastGreatestTest, TestEvalLeastGreatest) { functions[kPGGreatestFunctionName].get(); const std::vector types = { - zetasql::types::DoubleType(), zetasql::types::Int64Type(), - zetasql::types::BoolType(), zetasql::types::BytesType(), - zetasql::types::StringType(), zetasql::types::DateType(), - zetasql::types::TimestampType()}; + zetasql::types::DoubleType(), zetasql::types::Int64Type(), + zetasql::types::BoolType(), zetasql::types::BytesType(), + zetasql::types::StringType(), zetasql::types::DateType(), + zetasql::types::FloatType(), zetasql::types::TimestampType()}; absl::flat_hash_map least_evaluators; @@ -3753,6 +4042,84 @@ INSTANTIATE_TEST_SUITE_P( 0, 0, absl::StatusCode::kOk}, + {"FloatResultsInMid", + {zetasql::values::Float(-12), zetasql::values::Float(-87980.125f), + zetasql::values::Float(100), zetasql::values::Float(-7)}, + zetasql::types::FloatType()->DebugString(), + 1, + 2, + absl::StatusCode::kOk}, + {"FloatAscending", + {zetasql::values::Float(-10000.123f), zetasql::values::Float(-12), + zetasql::values::Float(-7), zetasql::values::Float(100)}, + zetasql::types::FloatType()->DebugString(), + 0, + 3, + absl::StatusCode::kOk}, + {"FloatDescending", + {zetasql::values::Float(100), zetasql::values::Float(-7), + zetasql::values::Float(-12), zetasql::values::Float(-879.125f)}, + zetasql::types::FloatType()->DebugString(), + 3, + 0, + absl::StatusCode::kOk}, + {"FloatWithNaN", + {zetasql::values::Float(std::numeric_limits::quiet_NaN()), + zetasql::values::Float(-12), zetasql::values::Float(-5), + zetasql::values::Float(-7)}, + zetasql::types::FloatType()->DebugString(), + 1, + 0, + absl::StatusCode::kOk}, + {"FloatWithNegativeNaN", + {zetasql::values::Float(-std::numeric_limits::quiet_NaN()), + zetasql::values::Float(-12), zetasql::values::Float(-5), + zetasql::values::Float(-7)}, + zetasql::types::FloatType()->DebugString(), + 1, + 0, + absl::StatusCode::kOk}, + {"FloatSingleValue", + {zetasql::values::Float(-87980.125f)}, + zetasql::types::FloatType()->DebugString(), + 0, + 0, + absl::StatusCode::kOk}, + {"FloatWithInfinitiesAndNaNAndNull", + {zetasql::values::Float(87980.125f), + zetasql::values::Float(std::numeric_limits::infinity()), + zetasql::values::Float(std::numeric_limits::quiet_NaN()), + zetasql::values::NullFloat(), + zetasql::values::Float(-std::numeric_limits::infinity())}, + zetasql::types::FloatType()->DebugString(), + 4, + 2, + absl::StatusCode::kOk}, + {"FloatAllNaNs", + {zetasql::values::Float(std::numeric_limits::quiet_NaN()), + zetasql::values::Float(std::numeric_limits::quiet_NaN())}, + zetasql::types::FloatType()->DebugString(), + 0, + 0, + absl::StatusCode::kOk}, + {"FloatAllNulls", + {zetasql::values::NullFloat(), zetasql::values::NullFloat()}, + zetasql::types::FloatType()->DebugString(), + 0, + 0, + absl::StatusCode::kOk}, + {"FloatSkipNullFirst", + {zetasql::values::NullFloat(), zetasql::values::Float(100)}, + zetasql::types::FloatType()->DebugString(), + 1, + 1, + absl::StatusCode::kOk}, + {"FloatSkipNullLast", + {zetasql::values::Float(200), zetasql::values::NullFloat()}, + zetasql::types::FloatType()->DebugString(), + 0, + 0, + absl::StatusCode::kOk}, {"StringWithDuplicates", {zetasql::values::String("aaaaa"), zetasql::values::String("aaaab"), @@ -3879,10 +4246,13 @@ TEST(EvalMinSignatureTest, MinOnlyForDoubleType) { const zetasql::Function* function = functions[kPGMinFunctionName].get(); const std::vector& signatures = function->signatures(); - EXPECT_THAT(signatures.size(), 1); - EXPECT_TRUE(signatures.front().result_type().type()->IsDouble()); - EXPECT_THAT(signatures.front().arguments().size(), 1); - EXPECT_TRUE(signatures.front().arguments().front().type()->IsDouble()); + EXPECT_THAT(signatures.size(), 2); + EXPECT_TRUE(signatures[0].result_type().type()->IsDouble()); + EXPECT_THAT(signatures[0].arguments().size(), 1); + EXPECT_TRUE(signatures[0].arguments().front().type()->IsDouble()); + EXPECT_TRUE(signatures[1].result_type().type()->IsFloat()); + EXPECT_THAT(signatures[1].arguments().size(), 1); + EXPECT_TRUE(signatures[1].arguments().front().type()->IsFloat()); } struct EvalAggregatorTestCase { @@ -3903,10 +4273,9 @@ TEST_P(EvalMinTest, TestMin) { for (auto& function : spanner_pg_functions) { functions[function->Name()] = std::move(function); } - zetasql::FunctionSignature signature(zetasql::types::DoubleType(), - {zetasql::types::DoubleType()}, - nullptr); const EvalAggregatorTestCase& test_case = GetParam(); + const zetasql::Type* agg_type = test_case.expected_value.type(); + zetasql::FunctionSignature signature(agg_type, {agg_type}, nullptr); const zetasql::Function* min_function = functions[test_case.function_name].get(); auto callback = min_function->GetAggregateFunctionEvaluatorFactory(); @@ -3942,12 +4311,12 @@ TEST_P(EvalMinTest, TestMin) { INSTANTIATE_TEST_SUITE_P(EvalMinTests, EvalMinTest, ::testing::ValuesIn({ - {"OneNullArg", + {"OneDoubleNullArg", kPGMinFunctionName, {&kNullDoubleValue}, kNullDoubleValue, absl::StatusCode::kOk}, - {"EmptyArgs", + {"EmptyDoubleArgs", kPGMinFunctionName, {}, kNullDoubleValue, @@ -3972,22 +4341,22 @@ INSTANTIATE_TEST_SUITE_P(EvalMinTests, EvalMinTest, {&kDoubleValue, &kNegInfDoubleValue}, kNegInfDoubleValue, absl::StatusCode::kOk}, - {"OnePosInfArgOneNegInfArg", + {"OneDoublePosInfArgOneNegInfArg", kPGMinFunctionName, {&kPosInfDoubleValue, &kNegInfDoubleValue}, kNegInfDoubleValue, absl::StatusCode::kOk}, - {"OnePosInfArgOneNegInfArg", + {"OneDoublePosInfArgOneNegInfArg", kPGMinFunctionName, {&kPosInfDoubleValue, &kNegInfDoubleValue}, kNegInfDoubleValue, absl::StatusCode::kOk}, - {"OneNanArg", + {"OneDoubleNanArg", kPGMinFunctionName, {&kDoubleNaNValue}, kDoubleNaNValue, absl::StatusCode::kOk}, - {"OneNullArgOneNanArg", + {"OneDoubleNullArgOneNanArg", kPGMinFunctionName, {&kNullDoubleValue, &kDoubleNaNValue}, kDoubleNaNValue, @@ -3997,16 +4366,82 @@ INSTANTIATE_TEST_SUITE_P(EvalMinTests, EvalMinTest, {&kDoubleValue, &kDoubleNaNValue}, kDoubleValue, absl::StatusCode::kOk}, - {"OneNegInfArgOneNanArg", + {"OneDoubleNegInfArgOneNanArg", kPGMinFunctionName, {&kNegInfDoubleValue, &kDoubleNaNValue}, kNegInfDoubleValue, absl::StatusCode::kOk}, - {"OnePosInfArgOneNanArg", + {"OneDoublePosInfArgOneNanArg", kPGMinFunctionName, {&kPosInfDoubleValue, &kDoubleNaNValue}, kPosInfDoubleValue, absl::StatusCode::kOk}, + + {"OneFloatNullArg", + kPGMinFunctionName, + {&kNullFloatValue}, + kNullFloatValue, + absl::StatusCode::kOk}, + {"EmptyFloatArgs", + kPGMinFunctionName, + {}, + kNullFloatValue, + absl::StatusCode::kOk}, + {"OneFloatArg", + kPGMinFunctionName, + {&kFloatValue}, + kFloatValue, + absl::StatusCode::kOk}, + {"OneFloatArgOneNullArg", + kPGMinFunctionName, + {&kFloatValue, &kNullFloatValue}, + kFloatValue, + absl::StatusCode::kOk}, + {"OneFloatArgOnePosInfArg", + kPGMinFunctionName, + {&kFloatValue, &kPosInfFloatValue}, + kFloatValue, + absl::StatusCode::kOk}, + {"OneFloatArgOneNegInfArg", + kPGMinFunctionName, + {&kFloatValue, &kNegInfFloatValue}, + kNegInfFloatValue, + absl::StatusCode::kOk}, + {"OneFloatPosInfArgOneNegInfArg", + kPGMinFunctionName, + {&kPosInfFloatValue, &kNegInfFloatValue}, + kNegInfFloatValue, + absl::StatusCode::kOk}, + {"OneFloatPosInfArgOneNegInfArg", + kPGMinFunctionName, + {&kPosInfFloatValue, &kNegInfFloatValue}, + kNegInfFloatValue, + absl::StatusCode::kOk}, + {"OneFloatNanArg", + kPGMinFunctionName, + {&kFloatNaNValue}, + kFloatNaNValue, + absl::StatusCode::kOk}, + {"OneFloatNullArgOneNanArg", + kPGMinFunctionName, + {&kNullFloatValue, &kFloatNaNValue}, + kFloatNaNValue, + absl::StatusCode::kOk}, + {"OneFloatArgOneNanArg", + kPGMinFunctionName, + {&kFloatValue, &kFloatNaNValue}, + kFloatValue, + absl::StatusCode::kOk}, + {"OneFloatNegInfArgOneNanArg", + kPGMinFunctionName, + {&kNegInfFloatValue, &kFloatNaNValue}, + kNegInfFloatValue, + absl::StatusCode::kOk}, + {"OneFloatPosInfArgOneNanArg", + kPGMinFunctionName, + {&kPosInfFloatValue, &kFloatNaNValue}, + kPosInfFloatValue, + absl::StatusCode::kOk}, })); INSTANTIATE_TEST_SUITE_P(EvalMinFailureTests, EvalMinTest, @@ -4021,6 +4456,16 @@ INSTANTIATE_TEST_SUITE_P(EvalMinFailureTests, EvalMinTest, {&kDoubleValue, &kInt64Value}, kNullDoubleValue, // ignored absl::StatusCode::kInvalidArgument}, + {"OneFloatInvalidArg", + kPGMinFunctionName, + {&kInt64Value}, + kNullFloatValue, // ignored + absl::StatusCode::kInvalidArgument}, + {"OneFloatValidArgOneInvalidArg", + kPGMinFunctionName, + {&kFloatValue, &kInt64Value}, + kNullFloatValue, // ignored + absl::StatusCode::kInvalidArgument}, })); using EvalNumericMinMaxTest = ::testing::TestWithParam; @@ -4177,6 +4622,8 @@ TEST_P(EvalSumAvgTest, TestSumAvgAggregator) { static const zetasql::Type* gsql_pg_numeric = spangres::datatypes::GetPgNumericType(); + const EvalAggregatorTestCase& test_case = GetParam(); + absl::flat_hash_map signature_map = { {zetasql::TYPE_INT64, @@ -4185,12 +4632,19 @@ TEST_P(EvalSumAvgTest, TestSumAvgAggregator) { {zetasql::types::DoubleType(), {zetasql::types::DoubleType()}, nullptr}}, + {zetasql::TYPE_FLOAT, + // For avg, the result type is double if the input type is float. + // For sum, the result type is float if the input type is float. + {test_case.function_name == kPGAvgFunctionName + ? zetasql::types::DoubleType() + : zetasql::types::FloatType(), + {zetasql::types::FloatType()}, + nullptr}}, {zetasql::TYPE_EXTENDED, {gsql_pg_numeric, {gsql_pg_numeric}, nullptr}}, }; bool stop_acc = false; - const EvalAggregatorTestCase& test_case = GetParam(); const zetasql::Function* function = functions[test_case.function_name].get(); @@ -4346,6 +4800,63 @@ INSTANTIATE_TEST_SUITE_P( kDoubleNaNValue, absl::StatusCode::kOk}, + // Tests for pg.sum of FLOAT + {"OneNullFloatArg", + kPGSumFunctionName, + {&kNullFloatValue}, + kNullFloatValue, + absl::StatusCode::kOk}, + {"OneFloatArg", + kPGSumFunctionName, + {&kFloatValue}, + kFloatValue, + absl::StatusCode::kOk}, + {"ManyFloatArgs", + kPGSumFunctionName, + {&kFloatValue, &kFloatValue, &kFloatValue}, + zetasql::values::Float(3.0f), + absl::StatusCode::kOk}, + {"NullFloatArgFirst", + kPGSumFunctionName, + {&kNullFloatValue, &kFloatValue, &kFloatValue}, + zetasql::values::Float(2.0f), + absl::StatusCode::kOk}, + {"NullFloatArgsBeforeFloatValues", + kPGSumFunctionName, + {&kNullFloatValue, &kNullFloatValue, &kFloatValue, &kFloatValue}, + zetasql::values::Float(2.0f), + absl::StatusCode::kOk}, + {"NullFloatArgsElsewhere", + kPGSumFunctionName, + {&kFloatValue, &kNullFloatValue, &kFloatValue, &kNullFloatValue}, + zetasql::values::Float(2.0f), + absl::StatusCode::kOk}, + {"OneNanFloatArg", + kPGSumFunctionName, + {&kFloatNaNValue}, + kFloatNaNValue, + absl::StatusCode::kOk}, + {"ManyNanFloatArgs", + kPGSumFunctionName, + {&kFloatValue, &kFloatNaNValue, &kFloatValue, &kFloatNaNValue}, + kFloatNaNValue, + absl::StatusCode::kOk}, + {"OneInfinityFloatArg", + kPGSumFunctionName, + {&kPosInfFloatValue}, + kPosInfFloatValue, + absl::StatusCode::kOk}, + {"ManyInfinityFloatArgs", + kPGSumFunctionName, + {&kPosInfFloatValue, &kPosInfFloatValue, &kPosInfFloatValue}, + kPosInfFloatValue, + absl::StatusCode::kOk}, + {"PosAndNegInfinityMakesNaN", + kPGSumFunctionName, + {&kPosInfFloatValue, &kNegInfFloatValue}, + kFloatNaNValue, + absl::StatusCode::kOk}, + // Tests for pg.sum of PG.NUMERIC {"OneNullPGNumericArg", kPGSumFunctionName, @@ -4511,6 +5022,75 @@ INSTANTIATE_TEST_SUITE_P( 2.0), absl::StatusCode::kOk}, + // Tests for pg.avg of FLOAT + {"OneNullFloatArg", + kPGAvgFunctionName, + {&kNullFloatValue}, + kNullDoubleValue, + absl::StatusCode::kOk}, + {"OneFloatArg", + kPGAvgFunctionName, + {&kFloatValue}, + kDoubleValue, + absl::StatusCode::kOk}, + {"ManyFloatArgs", + kPGAvgFunctionName, + {&kFloatValue, &kFloatValue, &kFloatValue}, + kDoubleValue, + absl::StatusCode::kOk}, + {"NullFloatArgFirst", + kPGAvgFunctionName, + {&kNullFloatValue, &kFloatValue, &kFloatValue}, + kDoubleValue, + absl::StatusCode::kOk}, + {"NullFloatArgsBeforeFloatValues", + kPGAvgFunctionName, + {&kNullFloatValue, &kNullFloatValue, &kFloatValue, &kFloatValue}, + kDoubleValue, + absl::StatusCode::kOk}, + {"NullFloatArgsElsewhere", + kPGAvgFunctionName, + {&kFloatValue, &kNullFloatValue, &kFloatValue, &kNullFloatValue}, + kDoubleValue, + absl::StatusCode::kOk}, + {"OneNanFloatArg", + kPGAvgFunctionName, + {&kFloatNaNValue}, + kDoubleNaNValue, + absl::StatusCode::kOk}, + {"ManyNanFloatArgs", + kPGAvgFunctionName, + {&kFloatValue, &kFloatNaNValue, &kFloatValue, &kFloatNaNValue}, + kDoubleNaNValue, + absl::StatusCode::kOk}, + {"OneInfinityFloatArg", + kPGAvgFunctionName, + {&kPosInfFloatValue}, + kPosInfDoubleValue, + absl::StatusCode::kOk}, + {"ManyInfinityFloatArgs", + kPGAvgFunctionName, + {&kPosInfFloatValue, &kPosInfFloatValue, &kPosInfFloatValue}, + kPosInfDoubleValue, + absl::StatusCode::kOk}, + {"PosAndNegInfinityMakesNaN", + kPGAvgFunctionName, + {&kPosInfFloatValue, &kNegInfFloatValue}, + kDoubleNaNValue, + absl::StatusCode::kOk}, + {"AvgMinAndMaxFloat", + kPGAvgFunctionName, + {&kFloatMinValue, &kFloatMaxValue}, + zetasql::values::Double((std::numeric_limits::min() + + std::numeric_limits::max()) / + 2.0), + absl::StatusCode::kOk}, + {"AvgFloatMaxDoesNotOverflow", + kPGAvgFunctionName, + {&kFloatMaxValue, &kFloatMaxValue}, + zetasql::values::Double(std::numeric_limits::max()), + absl::StatusCode::kOk}, + // Tests for pg.avg of PG.NUMERIC {"OneNullPGNumericArg", kPGAvgFunctionName, @@ -4574,11 +5154,21 @@ INSTANTIATE_TEST_SUITE_P(EvalSumAvgFailureTests, EvalSumAvgTest, {&kDoubleValue, &kInt64Value}, kNullDoubleValue, // ignored absl::StatusCode::kInvalidArgument}, + {"SumFloatWithInconsistentTypes", + kPGSumFunctionName, + {&kDoubleValue, &kFloatValue}, + kNullFloatValue, // ignored + absl::StatusCode::kInvalidArgument}, {"SumDoubleWithOverflow", kPGSumFunctionName, {&kDoubleMaxValue, &kDoubleMaxValue}, kNullDoubleValue, // ignored absl::StatusCode::kOutOfRange}, + {"SumFloatWithOverflow", + kPGSumFunctionName, + {&kFloatMaxValue, &kFloatMaxValue}, + kNullFloatValue, // ignored + absl::StatusCode::kOutOfRange}, {"SumPGNumericWithInconsistentTypes", kPGSumFunctionName, {&kPGNumericValue, &kDoubleValue}, @@ -4600,6 +5190,11 @@ INSTANTIATE_TEST_SUITE_P(EvalSumAvgFailureTests, EvalSumAvgTest, {&kDoubleValue, &kInt64Value}, kNullDoubleValue, // ignored absl::StatusCode::kInvalidArgument}, + {"AvgFloatWithInconsistentTypes", + kPGAvgFunctionName, + {&kFloatValue, &kInt64Value}, + kNullDoubleValue, // ignored + absl::StatusCode::kInvalidArgument}, {"AvgDoubleWithOverflow", kPGAvgFunctionName, {&kDoubleMaxValue, &kDoubleMaxValue}, diff --git a/third_party/spanner_pg/catalog/spangres_system_catalog.cc b/third_party/spanner_pg/catalog/spangres_system_catalog.cc index 15bf9acf..0783a84b 100644 --- a/third_party/spanner_pg/catalog/spangres_system_catalog.cc +++ b/third_party/spanner_pg/catalog/spangres_system_catalog.cc @@ -32,12 +32,15 @@ #include "third_party/spanner_pg/catalog/spangres_system_catalog.h" #include +#include #include "zetasql/public/builtin_function.h" #include "zetasql/public/builtin_function_options.h" #include "zetasql/analyzer/function_signature_matcher.h" #include "zetasql/public/input_argument_type.h" +#include "zetasql/public/language_options.h" #include "zetasql/public/type.pb.h" +#include "zetasql/public/types/type.h" #include "zetasql/public/types/type_factory.h" #include "zetasql/resolved_ast/resolved_ast.h" #include "absl/flags/flag.h" @@ -80,10 +83,6 @@ namespace spangres_types = ::postgres_translator::spangres::types; {F_FLOAT84LE, F_INT8LE}, {F_FLOAT84GE, F_INT8GE}, {F_FLOAT84NE, F_INT8NE}, }); -const auto kNanOrderingFunctions = - std::set( - {"pg.min", "pg.least", "pg.greatest", "pg.map_double_to_int"}); - static bool FunctionNameSupportedInSpanner( const std::string& function_name, const zetasql::LanguageOptions& language_options, @@ -190,6 +189,8 @@ static absl::StatusOr GetPgNumericCastFunctionName( return "pg.cast_to_int64"; case zetasql::TypeKind::TYPE_DOUBLE: return "pg.cast_to_double"; + case zetasql::TypeKind::TYPE_FLOAT: + return "pg.cast_to_float"; case zetasql::TypeKind::TYPE_STRING: return "pg.cast_to_string"; default: @@ -201,6 +202,7 @@ static absl::StatusOr GetPgNumericCastFunctionName( switch (source_type->kind()) { case zetasql::TypeKind::TYPE_INT64: case zetasql::TypeKind::TYPE_DOUBLE: + case zetasql::TypeKind::TYPE_FLOAT: case zetasql::TypeKind::TYPE_STRING: return "pg.cast_to_numeric"; default: @@ -296,28 +298,23 @@ SpangresSystemCatalog::GetResolvedExprForComparison( return gsql_expr; } - return GetResolvedExprForDoubleComparison(std::move(gsql_expr), - language_options); + return GetResolvedExprForFloatingPointComparison(std::move(gsql_expr), + language_options); } absl::StatusOr> -SpangresSystemCatalog::GetResolvedExprForDoubleComparison( +SpangresSystemCatalog::GetResolvedExprForFloatingPointComparison( std::unique_ptr gsql_expr, const zetasql::LanguageOptions& language_options) { - if (!(gsql_expr->type()->IsDouble() || gsql_expr->type()->IsFloat())) { - return gsql_expr; - } + const zetasql::Type* expr_type = gsql_expr->type(); - if (gsql_expr->type()->IsFloat()) { - // First cast the float to a double, then use the standard mapping from - // double to int64_t. - gsql_expr = zetasql::MakeResolvedCast(zetasql::types::DoubleType(), - std::move(gsql_expr), - /*return_null_on_error=*/false); + if (!(expr_type->IsDouble() || expr_type->IsFloat())) { + return gsql_expr; } - ZETASQL_ASSIGN_OR_RETURN(FunctionAndSignature function_and_signature, - GetMapDoubleToIntFunction(language_options)); + ZETASQL_ASSIGN_OR_RETURN( + FunctionAndSignature function_and_signature, + GetMapFloatingPointToIntFunction(expr_type, language_options)); std::vector> argument_list; argument_list.emplace_back(std::move(gsql_expr)); @@ -335,8 +332,9 @@ bool SpangresSystemCatalog::IsResolvedExprForComparison( } auto func = gsql_expr.GetAs(); - return func->function()->FullName(/*include_group=*/false) == - "pg.map_double_to_int"; + auto func_name = func->function()->FullName(/*include_group=*/false); + return func_name == "pg.map_double_to_int" || + func_name == "pg.map_float_to_int"; } absl::StatusOr @@ -362,22 +360,28 @@ std::optional SpangresSystemCatalog::GetMappedOidForComparisonFuncid( } absl::StatusOr -SpangresSystemCatalog::GetMapDoubleToIntFunction( +SpangresSystemCatalog::GetMapFloatingPointToIntFunction( + const zetasql::Type* source_type, const zetasql::LanguageOptions& language_options) { + ZETASQL_RET_CHECK(source_type->IsDouble() || source_type->IsFloat()) + << "source_type is not double or float"; + // TOD(b/228246295): Lookup this FunctionAndSignature only once. - static const std::string function_name = "pg.map_double_to_int"; + const std::string function_name = + source_type->IsDouble() ? "pg.map_double_to_int" : "pg.map_float_to_int"; ZETASQL_ASSIGN_OR_RETURN(const zetasql::Function* builtin_function, GetBuiltinFunction(function_name)); - ZETASQL_RET_CHECK(builtin_function) << "Cannot find pg.map_double_to_int in the list " - "of builtin function of SpangresSystemCatalog"; + ZETASQL_RET_CHECK(builtin_function) + << "Cannot find " << function_name + << " in the list of builtin function of SpangresSystemCatalog"; // Try find the matching signature. Run the ZetaSQL Function Signature // Matcher to determine if the input arguments exactly match the signature bool found_signature = false; - static const std::vector input_argument_types{ - zetasql::InputArgumentType(zetasql::types::DoubleType())}; + const std::vector input_argument_types{ + zetasql::InputArgumentType(source_type)}; zetasql::Coercer coercer(type_factory(), &language_options, this); const std::vector arg_ast_nodes; @@ -404,8 +408,9 @@ SpangresSystemCatalog::GetMapDoubleToIntFunction( } } - ZETASQL_RET_CHECK(found_signature) << "Could not find a matching signature for " - "pg.map_double_to_int function."; + ZETASQL_RET_CHECK(found_signature) + << "Could not find a matching signature for " << function_name + << " function." << " source_type: " << source_type->DebugString(); return FunctionAndSignature(builtin_function, *result_signature); } @@ -518,6 +523,8 @@ absl::Status SpangresSystemCatalog::AddFunctions( ZETASQL_RETURN_IF_ERROR(AddPgNumericCastFunction("pg.cast_to_double")); ZETASQL_RETURN_IF_ERROR(AddPgNumericCastFunction("pg.cast_to_string")); + ZETASQL_RETURN_IF_ERROR(AddPgNumericCastFunction("pg.cast_to_float")); + // Add casting override functions for STRING->DATE and STRING->TIMESTAMP. ZETASQL_RETURN_IF_ERROR(AddCastOverrideFunction( zetasql::types::StringType(), zetasql::types::DateType(), diff --git a/third_party/spanner_pg/catalog/spangres_system_catalog.h b/third_party/spanner_pg/catalog/spangres_system_catalog.h index 4bfae989..4a07b8d6 100644 --- a/third_party/spanner_pg/catalog/spangres_system_catalog.h +++ b/third_party/spanner_pg/catalog/spangres_system_catalog.h @@ -33,11 +33,13 @@ #define CATALOG_SPANGRES_SYSTEM_CATALOG_H_ #include "zetasql/public/language_options.h" +#include "zetasql/public/types/type.h" #include "absl/memory/memory.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "third_party/spanner_pg/catalog/engine_system_catalog.h" +#include "third_party/spanner_pg/catalog/function.h" #include "third_party/spanner_pg/interface/engine_builtin_function_catalog.h" namespace postgres_translator { @@ -126,18 +128,19 @@ class SpangresSystemCatalog : public EngineSystemCatalog { const zetasql::LanguageOptions& language_options) override; // If the input `gsql_expr` returns a double type, wraps it in a call to - // PG.MapDoubleToInt in order to preserve double/float8 ordering and equality - // semantics. + // PG.MapDoubleToInt or PG.MapFloatToInt in order to preserve float8/float4 + // ordering and equality semantics. absl::StatusOr> - GetResolvedExprForDoubleComparison( + GetResolvedExprForFloatingPointComparison( std::unique_ptr gsql_expr, const zetasql::LanguageOptions& language_options); - // MapDoubleToInt function is necessary because Spanner has different sort - // semantics for FLOAT8 type compared to Postgres. Wrapping ResolvedExprs - // which return FLOAT8 with this function allows sort and comparison semantics - // to be equivalent. - absl::StatusOr GetMapDoubleToIntFunction( + // MapDoubleToInt and MapFloatToInt functions are necessary because Spanner + // has different sort semantics for FLOAT4 and FLOAT8 types compared to + // Postgres. Wrapping ResolvedExprs which return FLOAT4 or FLOAT8 with these + // function allows sort and comparison semantics to be equivalent. + absl::StatusOr GetMapFloatingPointToIntFunction( + const zetasql::Type* source_type, const zetasql::LanguageOptions& language_options); }; diff --git a/third_party/spanner_pg/catalog/spangres_system_catalog_test.cc b/third_party/spanner_pg/catalog/spangres_system_catalog_test.cc index c184f987..cd4bd371 100644 --- a/third_party/spanner_pg/catalog/spangres_system_catalog_test.cc +++ b/third_party/spanner_pg/catalog/spangres_system_catalog_test.cc @@ -88,7 +88,6 @@ const zetasql::Type* gsql_float = zetasql::types::FloatType(); const zetasql::Type* gsql_string = zetasql::types::StringType(); const zetasql::Type* gsql_date = zetasql::types::DateType(); const zetasql::Type* gsql_timestamp = zetasql::types::TimestampType(); - const zetasql::Type* gsql_int64_array = zetasql::types::Int64ArrayType(); const zetasql::Type* gsql_string_array = zetasql::types::StringArrayType(); const zetasql::Type* gsql_bool_array = zetasql::types::BoolArrayType(); @@ -216,28 +215,14 @@ TEST_F(SpangresSystemCatalogTest, GetTypes) { absl::flat_hash_set types; ZETASQL_ASSERT_OK(catalog->GetTypes(&types)); std::vector expected_types{ - gsql_bool, - gsql_int64, - gsql_float, - gsql_double, - gsql_string, - gsql_bytes, - gsql_date, - gsql_timestamp, + gsql_bool, gsql_int64, gsql_float, gsql_double, gsql_string, gsql_bytes, + gsql_date, gsql_timestamp, types::PgNumericMapping()->mapped_type(), types::PgJsonbMapping()->mapped_type(), - types::PgOidMapping()->mapped_type(), - gsql_bool_array, - gsql_int64_array, - gsql_float_array, - gsql_double_array, - gsql_string_array, - gsql_bytes_array, - gsql_date_array, - gsql_timestamp_array, - GetPgNumericArrayType(), - GetPgJsonbArrayType(), - GetPgOidArrayType()}; + types::PgOidMapping()->mapped_type(), gsql_bool_array, gsql_int64_array, + gsql_float_array, gsql_double_array, gsql_string_array, gsql_bytes_array, + gsql_date_array, gsql_timestamp_array, + GetPgNumericArrayType(), GetPgJsonbArrayType(), GetPgOidArrayType()}; EXPECT_THAT(types, UnorderedPointwise(TypeEquals(), expected_types)); } @@ -616,6 +601,7 @@ TEST_F(SpangresSystemCatalogTest, MinAggregateRemapTest) { static const zetasql::Type* gsql_pg_numeric = spangres::datatypes::GetPgNumericType(); + bool has_signature_for_float = false; bool has_signature_for_double = false; bool has_signature_for_numeric = false; for (const std::unique_ptr& signature : @@ -626,6 +612,10 @@ TEST_F(SpangresSystemCatalogTest, MinAggregateRemapTest) { has_signature_for_double = true; EXPECT_EQ(signature->mapped_function()->FullName(/*include_group=*/false), "pg.min"); + } else if (argument_type->IsFloat()) { + has_signature_for_float = true; + EXPECT_EQ(signature->mapped_function()->FullName(/*include_group=*/false), + "pg.min"); } else if ( argument_type->Equals(gsql_pg_numeric)) { has_signature_for_numeric = true; diff --git a/third_party/spanner_pg/catalog/type.cc b/third_party/spanner_pg/catalog/type.cc index c361fba8..22533197 100644 --- a/third_party/spanner_pg/catalog/type.cc +++ b/third_party/spanner_pg/catalog/type.cc @@ -35,6 +35,7 @@ #include "zetasql/base/logging.h" #include "zetasql/public/functions/date_time_util.h" +#include "zetasql/public/interval_value.h" #include "zetasql/public/options.pb.h" #include "zetasql/public/types/extended_type.h" #include "zetasql/public/types/type.h" @@ -443,6 +444,51 @@ class PostgresDateMapping : public PostgresTypeMapping { } }; +class PostgresIntervalMapping : public PostgresTypeMapping { + public: + explicit PostgresIntervalMapping(const zetasql::TypeFactory* factory) + : PostgresTypeMapping(factory, INTERVALOID) {} + + const zetasql::Type* mapped_type() const override { + return zetasql::types::IntervalType(); + } + + absl::StatusOr MakeGsqlValue( + const Const* pg_const) const override { + if (pg_const->constisnull) { + return zetasql::Value::NullInterval(); + } + + Interval* interval = DatumGetIntervalP(pg_const->constvalue); + ZETASQL_ASSIGN_OR_RETURN(zetasql::IntervalValue interval_value, + zetasql::IntervalValue::FromMonthsDaysMicros( + interval->month, interval->day, interval->time)); + return zetasql::Value::Interval(interval_value); + } + + absl::StatusOr MakePgConst( + const zetasql::Value& value) const override { + zetasql::IntervalValue interval_value = + (!value.is_null() ? value.interval_value() + : zetasql::IntervalValue()); + + ZETASQL_ASSIGN_OR_RETURN(void* p, CheckedPgPalloc(sizeof(Interval))); + Interval* interval = reinterpret_cast(p); + interval->month = static_cast(interval_value.get_months()); + interval->day = static_cast(interval_value.get_days()); + interval->time = interval_value.get_micros(); + + return CheckedPgMakeConst( + /*consttype=*/INTERVALOID, + /*consttypmod=*/-1, + /*constcollid=*/InvalidOid, + /*constlen=*/sizeof(Interval), + /*constvalue=*/IntervalPGetDatum(interval), + /*constisnull=*/value.is_null(), + /*constbyval=*/false); + } +}; + absl::StatusOr PostgresExtendedArrayMapping::MakeGsqlValue( const Const* pg_const) const { // Technically this means we support multi-dimensional NULL arrays, but PG @@ -654,6 +700,12 @@ const PostgresTypeMapping* PgDateMapping() { return s_pg_date_mapping.get(); } +const PostgresTypeMapping* PgIntervalMapping() { + static const zetasql_base::NoDestructor + s_pg_interval_mapping(GetTypeFactory()); + return s_pg_interval_mapping.get(); +} + // Supported Array Types. const PostgresTypeMapping* PgBoolArrayMapping() { static const zetasql_base::NoDestructor @@ -747,6 +799,16 @@ const PostgresTypeMapping* PgDateArrayMapping() { return s_pg_date_array_mapping.get(); } +const PostgresTypeMapping* PgIntervalArrayMapping() { + static const zetasql_base::NoDestructor + s_pg_interval_array_mapping( + /*type_factory=*/GetTypeFactory(), + /*array_type_oid=*/INTERVALARRAYOID, + /*element_type=*/types::PgIntervalMapping(), + /*mapped_type=*/zetasql::types::IntervalArrayType(), + /*requires_nan_handling=*/false); + return s_pg_interval_array_mapping.get(); +} } // namespace types } // namespace postgres_translator diff --git a/third_party/spanner_pg/catalog/type.h b/third_party/spanner_pg/catalog/type.h index bdd4d5cf..465a70d6 100644 --- a/third_party/spanner_pg/catalog/type.h +++ b/third_party/spanner_pg/catalog/type.h @@ -167,6 +167,7 @@ const PostgresTypeMapping* PgTextMapping(); const PostgresTypeMapping* PgByteaMapping(); const PostgresTypeMapping* PgTimestamptzMapping(); const PostgresTypeMapping* PgDateMapping(); +const PostgresTypeMapping* PgIntervalMapping(); // Supported Array Types. const PostgresTypeMapping* PgBoolArrayMapping(); @@ -178,6 +179,7 @@ const PostgresTypeMapping* PgTextArrayMapping(); const PostgresTypeMapping* PgByteaArrayMapping(); const PostgresTypeMapping* PgTimestamptzArrayMapping(); const PostgresTypeMapping* PgDateArrayMapping(); +const PostgresTypeMapping* PgIntervalArrayMapping(); } // namespace types diff --git a/third_party/spanner_pg/catalog/type_test.cc b/third_party/spanner_pg/catalog/type_test.cc index 3960487c..ef9b8932 100644 --- a/third_party/spanner_pg/catalog/type_test.cc +++ b/third_party/spanner_pg/catalog/type_test.cc @@ -319,6 +319,47 @@ TEST_F(TypeTest, PgDateMapping) { IsOkAndHolds(zetasql::Value::NullDate())); } +TEST_F(TypeTest, PgIntervalMapping) { + const PostgresTypeMapping* pg_interval_mapping = types::PgIntervalMapping(); + EXPECT_TRUE(pg_interval_mapping->mapped_type()->IsInterval()); + EXPECT_EQ(pg_interval_mapping->TypeName(zetasql::PRODUCT_EXTERNAL), + "pg.interval"); + EXPECT_EQ(pg_interval_mapping->PostgresTypeOid(), INTERVALOID); + EXPECT_TRUE( + pg_interval_mapping->IsSupportedType(zetasql::LanguageOptions())); + EXPECT_TRUE(pg_interval_mapping->Equals(types::PgIntervalMapping())); + + Interval interval; + + interval.month = 10; + interval.day = -50; + interval.time = 5057089; + + ZETASQL_ASSERT_OK_AND_ASSIGN(Const * pg_const, + CheckedPgMakeConst( + /*consttype=*/INTERVALOID, + /*consttypmod=*/-1, + /*constcollid=*/InvalidOid, + /*constlen=*/sizeof(Interval), + /*constvalue=*/IntervalPGetDatum(&interval), + /*constisnull=*/false, + /*constbyval=*/false)); + EXPECT_THAT( + pg_interval_mapping->MakeGsqlValue(pg_const), + IsOkAndHolds(zetasql::Value::Interval( + *zetasql::IntervalValue::FromMonthsDaysMicros(10, -50, 5057089)))); + ZETASQL_ASSERT_OK_AND_ASSIGN(pg_const, CheckedPgMakeConst( + /*consttype=*/INTERVALOID, + /*consttypmod=*/-1, + /*constcollid=*/InvalidOid, + /*constlen=*/sizeof(Interval), + /*constvalue=*/IntervalPGetDatum(nullptr), + /*constisnull=*/true, + /*constbyval=*/false)); + EXPECT_THAT(pg_interval_mapping->MakeGsqlValue(pg_const), + IsOkAndHolds(zetasql::Value::NullInterval())); +} + // Supported Array Types. TEST_F(TypeTest, PgBoolArrayMapping) { const PostgresTypeMapping* pg_bool_array_mapping = diff --git a/third_party/spanner_pg/datatypes/extended/BUILD b/third_party/spanner_pg/datatypes/extended/BUILD index cc4ae0c5..d654934e 100644 --- a/third_party/spanner_pg/datatypes/extended/BUILD +++ b/third_party/spanner_pg/datatypes/extended/BUILD @@ -213,7 +213,9 @@ cc_library( ":pg_oid_type", "//third_party/spanner_pg/catalog:emulator_function_evaluators", "//third_party/spanner_pg/catalog:emulator_functions", + "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/container:flat_hash_set", + "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:cord", @@ -290,6 +292,8 @@ cc_library( ":pg_jsonb_type", ":pg_numeric_type", "//third_party/spanner_pg/catalog:emulator_function_evaluators", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:cord", @@ -307,6 +311,7 @@ cc_test( "//third_party/spanner_pg/datatypes/common:numeric_core", "//third_party/spanner_pg/interface:pg_arena_factory", "//third_party/spanner_pg/src/backend:backend_with_shims", + "@com_google_absl//absl/status", "@com_google_googletest//:gtest", "@com_google_zetasql//zetasql/base:no_destructor", "@com_google_zetasql//zetasql/base/testing:status_matchers", diff --git a/third_party/spanner_pg/datatypes/extended/conversion_finder.cc b/third_party/spanner_pg/datatypes/extended/conversion_finder.cc index 9cadb511..d5f96c66 100644 --- a/third_party/spanner_pg/datatypes/extended/conversion_finder.cc +++ b/third_party/spanner_pg/datatypes/extended/conversion_finder.cc @@ -56,6 +56,7 @@ using ::zetasql::CastFunctionType; using ::zetasql::Catalog; const zetasql::Type* gsql_bool = zetasql::types::BoolType(); +const zetasql::Type* gsql_float = zetasql::types::FloatType(); const zetasql::Type* gsql_double = zetasql::types::DoubleType(); const zetasql::Type* gsql_int64 = zetasql::types::Int64Type(); const zetasql::Type* gsql_string = zetasql::types::StringType(); @@ -124,6 +125,9 @@ static const ConversionMap& GetConversionMap() { {{gsql_double, gsql_pg_numeric}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetDoubleToPgNumericConversion()}}, + {{gsql_float, gsql_pg_numeric}, + {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), + GetFloatToPgNumericConversion()}}, {{gsql_string, gsql_pg_numeric}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetStringToPgNumericConversion()}}, @@ -134,6 +138,9 @@ static const ConversionMap& GetConversionMap() { {{gsql_pg_numeric, gsql_double}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetPgNumericToDoubleConversion()}}, + {{gsql_pg_numeric, gsql_float}, + {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), + GetPgNumericToFloatConversion()}}, {{gsql_pg_numeric, gsql_string}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetPgNumericToStringConversion()}}, @@ -148,6 +155,9 @@ static const ConversionMap& GetConversionMap() { {{gsql_pg_jsonb, gsql_double}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetPgJsonbToDoubleConversion()}}, + {{gsql_pg_jsonb, gsql_float}, + {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), + GetPgJsonbToFloatConversion()}}, {{gsql_pg_jsonb, gsql_int64}, {CastFunctionProperty(CastFunctionType::EXPLICIT, /*coercion_cost=*/0), GetPgJsonbToInt64Conversion()}}, diff --git a/third_party/spanner_pg/datatypes/extended/conversion_finder_test.cc b/third_party/spanner_pg/datatypes/extended/conversion_finder_test.cc index 063f7952..9b320d55 100644 --- a/third_party/spanner_pg/datatypes/extended/conversion_finder_test.cc +++ b/third_party/spanner_pg/datatypes/extended/conversion_finder_test.cc @@ -64,6 +64,7 @@ MATCHER_P(EqPG, result, using ::zetasql::types::BoolType; using ::zetasql::types::BytesType; using ::zetasql::types::DoubleType; +using ::zetasql::types::FloatType; using ::zetasql::types::Int64Type; using ::zetasql::types::StringType; using FindConversionOptions = ::zetasql::Catalog::FindConversionOptions; @@ -103,6 +104,11 @@ std::vector GetConversionFoundTestCases() { ConversionSourceExpressionKind::kOther), zetasql::Value::Double(-123.523535), CreatePgNumericValueWithMemoryContext("-123.523535").value()}, + {FloatType(), GetPgNumericType(), + FindConversionOptions(/*is_explicit=*/true, + ConversionSourceExpressionKind::kOther), + zetasql::Value::Float(-123.523f), + CreatePgNumericValueWithMemoryContext("-123.523").value()}, {StringType(), GetPgNumericType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), @@ -119,6 +125,11 @@ std::vector GetConversionFoundTestCases() { ConversionSourceExpressionKind::kOther), CreatePgNumericValueWithMemoryContext("123.52353500").value(), zetasql::Value::Double(123.523535)}, + {GetPgNumericType(), FloatType(), + FindConversionOptions(/*is_explicit=*/true, + ConversionSourceExpressionKind::kOther), + CreatePgNumericValueWithMemoryContext("123.52300").value(), + zetasql::Value::Float(123.523f)}, {GetPgNumericType(), StringType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), @@ -141,6 +152,11 @@ std::vector GetConversionFoundTestCases() { ConversionSourceExpressionKind::kOther), CreatePgJsonbValueWithMemoryContext("123.52353500").value(), zetasql::Value::Double(123.523535)}, + {GetPgJsonbType(), FloatType(), + FindConversionOptions(/*is_explicit=*/true, + ConversionSourceExpressionKind::kOther), + CreatePgJsonbValueWithMemoryContext("123.523500").value(), + zetasql::Value::Float(123.5235f)}, {GetPgJsonbType(), GetPgNumericType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), @@ -154,23 +170,19 @@ std::vector GetConversionFoundTestCases() { {GetPgOidType(), StringType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), - *CreatePgOidValue(42), - zetasql::Value::String("42")}, + *CreatePgOidValue(42), zetasql::Value::String("42")}, {StringType(), GetPgOidType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), - zetasql::Value::String("42"), - *CreatePgOidValue(42)}, + zetasql::Value::String("42"), *CreatePgOidValue(42)}, {GetPgOidType(), Int64Type(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), - *CreatePgOidValue(42), - zetasql::Value::Int64(42)}, + *CreatePgOidValue(42), zetasql::Value::Int64(42)}, {Int64Type(), GetPgOidType(), FindConversionOptions(/*is_explicit=*/true, ConversionSourceExpressionKind::kOther), - zetasql::Value::Int64(42), - *CreatePgOidValue(42)}, + zetasql::Value::Int64(42), *CreatePgOidValue(42)}, }; } diff --git a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.cc b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.cc index eb6be1d6..6df800af 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.cc +++ b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.cc @@ -39,8 +39,11 @@ #include #include "zetasql/public/function.h" +#include "absl/base/optimization.h" +#include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/cord.h" +#include "absl/strings/numbers.h" #include "absl/strings/string_view.h" #include "third_party/spanner_pg/catalog/emulator_function_evaluators.h" #include "third_party/spanner_pg/datatypes/extended/pg_jsonb_type.h" @@ -129,7 +132,8 @@ absl::StatusOr GetInt64FromPgJsonb(const absl::Cord& jsonb) { return result; } -absl::StatusOr OutOfRangeForDoubleError(absl::string_view input) { +absl::Status OutOfRangeForFloatingPointError(absl::string_view input, + absl::string_view pg_type_name) { // We expect that the input value should come from already processed JSON, // thus it should be valid UTF-8 string and we don't need to do any additional // escaping using functions like EnsureValidUTF8. However, we don't want to @@ -142,41 +146,57 @@ absl::StatusOr OutOfRangeForDoubleError(absl::string_view input) { terminator = "..."; } return absl::OutOfRangeError(absl::StrCat( - "\"", input, terminator, "\" is out of range for type double precision")); + "\"", input, terminator, "\" is out of range for type ", pg_type_name)); } -inline absl::StatusOr ParseDouble(absl::string_view input) { - double result; - if (ABSL_PREDICT_FALSE(!absl::SimpleAtod(input, &result) || - std::isnan(result) || std::isinf(result))) { - return OutOfRangeForDoubleError(input); +template >> +inline absl::StatusOr ParseFloatingPoint(absl::string_view input) { + T result; + bool is_success; + if constexpr (std::is_same_v) { + is_success = absl::SimpleAtod(input, &result); + } else { + is_success = absl::SimpleAtof(input, &result); + } + if (ABSL_PREDICT_FALSE(!is_success || std::isnan(result) || + std::isinf(result))) { + return OutOfRangeForFloatingPointError( + input, std::is_same_v ? "double precision" : "real"); } return result; } -absl::StatusOr GetDoubleFromPgJsonb(const absl::Cord& jsonb) { +template >> +absl::StatusOr GetFloatingPointFromPgJsonb(const absl::Cord& jsonb) { ZETASQL_RET_CHECK_GT(jsonb.size(), 0); // Check that value is actually a number. const char first_char = jsonb[0]; if (ABSL_PREDICT_FALSE(!std::isdigit(first_char) && first_char != '-')) { - return GetPgJsonbCastErrorMessage(first_char, "double precision"); + return GetPgJsonbCastErrorMessage( + first_char, std::is_same_v ? "double precision" : "real"); } + // T == FLOAT: + // We only need first 47 characters (3(-,0,.) + FLT_DIG(6) + + // FLT_MIN_10_EXP(37) + 1 additional character for detecting out of range + // values) of the jsonb string to convert it to a float. + // T == DOUBLE: // We only need first 326 characters (3(-,0,.) + DBL_DIG(15) + // DBL_MIN_10_EXP(307) + 1 additional character for detecting out of range - // values) of the jsonb string to convert it to a double - constexpr size_t kMaxDoubleDigitsLength = 326; + // values) of the jsonb string to convert it to a double. + constexpr size_t kMaxFloatingPointDigitsLength = + std::is_same_v ? 326 : 47; - std::array buffer; + std::array buffer; int i; - for (i = 0; i < jsonb.size() && i < kMaxDoubleDigitsLength; ++i) { + for (i = 0; i < jsonb.size() && i < kMaxFloatingPointDigitsLength; ++i) { buffer[i] = jsonb[i]; } const size_t number_size = i; std::string_view input = absl::string_view{buffer.data(), number_size}; - return ParseDouble(input); + return ParseFloatingPoint(input); } absl::StatusOr PgJsonbToBoolConversion( @@ -208,10 +228,21 @@ absl::StatusOr PgJsonbToDoubleConversion( return zetasql::Value::NullDouble(); } ZETASQL_ASSIGN_OR_RETURN(absl::Cord jsonb, GetPgJsonbNormalizedValue(args[0])); - ZETASQL_ASSIGN_OR_RETURN(double d, GetDoubleFromPgJsonb(jsonb)); + ZETASQL_ASSIGN_OR_RETURN(double d, GetFloatingPointFromPgJsonb(jsonb)); return zetasql::Value::Double(d); } +absl::StatusOr PgJsonbToFloatConversion( + const absl::Span args) { + ZETASQL_RET_CHECK_EQ(args.size(), 1); + if (args[0].is_null()) { + return zetasql::Value::NullFloat(); + } + ZETASQL_ASSIGN_OR_RETURN(absl::Cord jsonb, GetPgJsonbNormalizedValue(args[0])); + ZETASQL_ASSIGN_OR_RETURN(float f, GetFloatingPointFromPgJsonb(jsonb)); + return zetasql::Value::Float(f); +} + absl::StatusOr PgJsonbToPgNumericConversion( const absl::Span args) { ZETASQL_RET_CHECK_EQ(args.size(), 1); @@ -283,6 +314,16 @@ const zetasql::Function* GetPgJsonbToDoubleConversion() { return kPgJsonbToDoubleConv; } +const zetasql::Function* GetPgJsonbToFloatConversion() { + static const zetasql::Function* kPgJsonbToFloatConv = + new zetasql::Function( + "pg_jsonb_to_float_conv", "spanner", zetasql::Function::SCALAR, + /*function_signatures=*/{}, + zetasql::FunctionOptions().set_evaluator( + PGFunctionEvaluator(PgJsonbToFloatConversion))); + return kPgJsonbToFloatConv; +} + const zetasql::Function* GetPgJsonbToPgNumericConversion() { static const zetasql::Function* kPgJsonbToPgNumericConv = new zetasql::Function( diff --git a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.h b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.h index c1bfa86a..440230f0 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.h +++ b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions.h @@ -44,6 +44,8 @@ absl::StatusOr PgJsonbToInt64Conversion( const absl::Span args); absl::StatusOr PgJsonbToDoubleConversion( const absl::Span args); +absl::StatusOr PgJsonbToFloatConversion( + const absl::Span args); absl::StatusOr PgJsonbToPgNumericConversion( const absl::Span args); absl::StatusOr PgJsonbToStringConversion( @@ -53,6 +55,7 @@ const zetasql::Function* GetStringToPgJsonbConversion(); const zetasql::Function* GetPgJsonbToBoolConversion(); const zetasql::Function* GetPgJsonbToInt64Conversion(); const zetasql::Function* GetPgJsonbToDoubleConversion(); +const zetasql::Function* GetPgJsonbToFloatConversion(); const zetasql::Function* GetPgJsonbToPgNumericConversion(); const zetasql::Function* GetPgJsonbToStringConversion(); } // namespace datatypes diff --git a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions_test.cc b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions_test.cc index 70e4391d..9e2700da 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions_test.cc +++ b/third_party/spanner_pg/datatypes/extended/pg_jsonb_conversion_functions_test.cc @@ -40,6 +40,7 @@ #include "gtest/gtest.h" #include "zetasql/base/testing/status_matchers.h" #include "zetasql/base/no_destructor.h" +#include "absl/status/status.h" #include "third_party/spanner_pg/datatypes/common/numeric_core.h" #include "third_party/spanner_pg/datatypes/extended/pg_jsonb_type.h" #include "third_party/spanner_pg/datatypes/extended/pg_numeric_type.h" @@ -52,6 +53,7 @@ namespace { const zetasql::Type* gsql_bool = zetasql::types::BoolType(); const zetasql::Type* gsql_double = zetasql::types::DoubleType(); +const zetasql::Type* gsql_float = zetasql::types::FloatType(); const zetasql::Type* gsql_int64 = zetasql::types::Int64Type(); const zetasql::Type* gsql_string = zetasql::types::StringType(); @@ -92,6 +94,7 @@ static const ConversionMap& GetConversionMap() { // PG.JSONB -> {{gsql_pg_jsonb, gsql_bool}, PgJsonbToBoolConversion}, {{gsql_pg_jsonb, gsql_double}, PgJsonbToDoubleConversion}, + {{gsql_pg_jsonb, gsql_float}, PgJsonbToFloatConversion}, {{gsql_pg_jsonb, gsql_int64}, PgJsonbToInt64Conversion}, {{gsql_pg_jsonb, gsql_pg_numeric}, PgJsonbToPgNumericConversion}, {{gsql_pg_jsonb, gsql_string}, PgJsonbToStringConversion}, @@ -319,6 +322,95 @@ TEST(PgJsonbConversionTest, ConvertPgJsonbToDoubleError) { } } +TEST(PgJsonbConversionTest, ConvertPgJsonbToFloatSuccess) { + TestConversion( + GetPgJsonbType(), zetasql::types::FloatType(), + zetasql::Value::Null( + postgres_translator::spangres::datatypes::GetPgJsonbType()), + zetasql::Value::NullFloat()); + + std::vector> float_test_cases = { + {"0", 0}, + {"0.0", 0.0f}, + {"3.14", 3.14f}, + {"3.14000000", 3.14f}, + {"123", 123}, + {"3.145678", 3.145678f}, + {"3.1456789", 3.145679f}, + {"-33.12349", -33.12349f}, + {"0.00001342", 1.342e-05f}, + {"0.00000000000000000001000000001", 1e-20f}, + {"0.0000000000000000000100000001", 1.00000001e-20f}, + + {absl::StrCat("34028235", std::string(31, '0')), + std::numeric_limits::max()}, + {absl::StrCat("-34028235", std::string(31, '0')), + std::numeric_limits::lowest()}, + {absl::StrCat("0.", std::string(37, '0'), "11754944"), + std::numeric_limits::min()}, + + {"3.4028233e+38", 3.4028233e+38f}, + {"3.4028234e+38", 3.4028235e+38f}, + {"3.4028235e+38", 3.4028235e+38f}, + + {"1.1754943e-38", 1.1754944e-38f}, + {"1.1754944e-38", 1.1754944e-38f}, + {"1.1754945e-38", 1.1754945e-38f}, + + {"-3.4028233e+38", -3.4028233e+38f}, + {"-3.4028234e+38", -3.4028235e+38f}, + {"-3.4028235e+38", -3.4028235e+38f}, + }; + for (const auto& [input, expected_output] : float_test_cases) { + SCOPED_TRACE(absl::StrCat( + "input:", input, " expected_output:", std::to_string(expected_output))); + TestConversion(GetPgJsonbType(), zetasql::types::FloatType(), + CreatePgJsonbValueWithMemoryContext(input).value(), + zetasql::Value::Float(expected_output)); + } +} + +TEST(PgJsonbConversionTest, ConvertPgJsonbToFloatError) { + std::vector> + float_invalid_arg_test_cases = { + {"\"abc\"", "cannot cast jsonb string to type real"}, + {"[1, 2]", "cannot cast jsonb array to type real"}, + {"{\"a\": 2}", "cannot cast jsonb object to type real"}, + {"true", "cannot cast jsonb boolean to type real"}, + {"false", "cannot cast jsonb boolean to type real"}, + {"null", "cannot cast jsonb null to type real"}, + {"\"NaN\"", "cannot cast jsonb string to type real"}, + {"\"-Infinity\"", "cannot cast jsonb string to type real"}, + {"\"Infinity\"", "cannot cast jsonb string to type real"}, + }; + for (const auto& [input, expected_error] : float_invalid_arg_test_cases) { + SCOPED_TRACE( + absl::StrCat("input:", input, " expected_error: ", expected_error)); + TestConversion(GetPgJsonbType(), zetasql::types::FloatType(), + CreatePgJsonbValueWithMemoryContext(input).value(), + std::nullopt, + /* is_error= */ true, absl::StatusCode::kInvalidArgument, + expected_error); + } + + std::vector> + float_out_of_range_test_cases = { + {"3.4028236e+38", absl::StrCat("\"34028236", std::string(31, '0'), + "\" is out of range for type real")}, + {"3.4028235e+39", absl::StrCat("\"34028235", std::string(32, '0'), + "\" is out of range for type real")}, + {"-3.4028236e+38", absl::StrCat("\"-34028236", std::string(31, '0'), + "\" is out of range for type real")}}; + for (const auto& [input, expected_error] : float_out_of_range_test_cases) { + SCOPED_TRACE( + absl::StrCat("input:", input, " expected_error: ", expected_error)); + TestConversion( + GetPgJsonbType(), zetasql::types::FloatType(), + CreatePgJsonbValueWithMemoryContext(input).value(), std::nullopt, + /* is_error= */ true, absl::StatusCode::kOutOfRange, expected_error); + } +} + TEST(PgJsonbConversionTest, ConvertPgJsonbToPgNumericSuccess) { TestConversion(GetPgJsonbType(), GetPgNumericType(), zetasql::Value::Null(GetPgJsonbType()), diff --git a/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.cc b/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.cc index d6b302b1..4d02d5d5 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.cc +++ b/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.cc @@ -58,6 +58,16 @@ const zetasql::Function* GetDoubleToPgNumericConversion() { return kDoubleToPgNumericConv; } +const zetasql::Function* GetFloatToPgNumericConversion() { + static const zetasql::Function* kFloatToPgNumericConv = + new zetasql::Function("float_to_pg_numeric_conv", "spanner", + zetasql::Function::SCALAR, + /*function_signatures=*/{}, + zetasql::FunctionOptions().set_evaluator( + PGFunctionEvaluator(EvalCastToNumeric))); + return kFloatToPgNumericConv; +} + const zetasql::Function* GetStringToPgNumericConversion() { static const zetasql::Function* kStringToPgNumericConv = new zetasql::Function("string_to_pg_numeric_conv", "spanner", @@ -88,6 +98,16 @@ const zetasql::Function* GetPgNumericToDoubleConversion() { return kPgNumericToDoubleConv; } +const zetasql::Function* GetPgNumericToFloatConversion() { + static const zetasql::Function* kPgNumericToFloatConv = + new zetasql::Function("pg_numeric_to_float_conv", "spanner", + zetasql::Function::SCALAR, + /*function_signatures=*/{}, + zetasql::FunctionOptions().set_evaluator( + PGFunctionEvaluator(EvalCastNumericToFloat))); + return kPgNumericToFloatConv; +} + const zetasql::Function* GetPgNumericToStringConversion() { static const zetasql::Function* kPgNumericToStringConv = new zetasql::Function( diff --git a/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.h b/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.h index a13bef70..111f2394 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.h +++ b/third_party/spanner_pg/datatypes/extended/pg_numeric_conversion_functions.h @@ -40,10 +40,12 @@ namespace datatypes { // PG.NUMERIC conversion functions. const zetasql::Function* GetInt64ToPgNumericConversion(); const zetasql::Function* GetDoubleToPgNumericConversion(); +const zetasql::Function* GetFloatToPgNumericConversion(); const zetasql::Function* GetStringToPgNumericConversion(); const zetasql::Function* GetPgNumericToInt64Conversion(); const zetasql::Function* GetPgNumericToDoubleConversion(); +const zetasql::Function* GetPgNumericToFloatConversion(); const zetasql::Function* GetPgNumericToStringConversion(); } // namespace datatypes diff --git a/third_party/spanner_pg/datatypes/extended/pg_numeric_type_test.cc b/third_party/spanner_pg/datatypes/extended/pg_numeric_type_test.cc index 385c4fbd..b4e95de4 100644 --- a/third_party/spanner_pg/datatypes/extended/pg_numeric_type_test.cc +++ b/third_party/spanner_pg/datatypes/extended/pg_numeric_type_test.cc @@ -219,14 +219,11 @@ TEST_F(PgNumericTypeTest, ValueComparison) { } TEST_F(PgNumericTypeTest, FixedPrecisionNumericErrorCases) { + // store values between -0.099 and 0.099 EXPECT_THAT(postgres_translator::spangres::datatypes:: CreatePgNumericValueWithPrecisionAndScale("0.3", 2, 3), - StatusIs(absl::StatusCode::kInvalidArgument, - testing::HasSubstr("NUMERIC scale"))); - EXPECT_THAT(postgres_translator::spangres::datatypes:: - CreatePgNumericValueWithPrecisionAndScale("0.3", 2, -1), - StatusIs(absl::StatusCode::kInvalidArgument, - testing::HasSubstr("NUMERIC scale"))); + StatusIs(absl::StatusCode::kOutOfRange, + testing::HasSubstr("numeric field overflow"))); EXPECT_THAT(postgres_translator::spangres::datatypes:: CreatePgNumericValueWithPrecisionAndScale("0.3", 1001, 0), StatusIs(absl::StatusCode::kInvalidArgument, @@ -298,6 +295,25 @@ INSTANTIATE_TEST_SUITE_P( .scale = 0, .expected_fixed_precision = "123", }, + TestCase{ + .arbitrary_numeric = "0.3", + .precision = 2, + .scale = -1, + .expected_fixed_precision = "0", + }, + TestCase{ + .arbitrary_numeric = "1234", + .precision = 4, + .scale = -2, + .expected_fixed_precision = "1200", + }, + // store values between -0.00999 and 0.00999 + TestCase{ + .arbitrary_numeric = "0.0088999", + .precision = 3, + .scale = 5, + .expected_fixed_precision = "0.00890", + }, TestCase{ .arbitrary_numeric = "123.0000000001", .precision = 13, diff --git a/third_party/spanner_pg/ddl/BUILD b/third_party/spanner_pg/ddl/BUILD index e5fb6226..b471a959 100644 --- a/third_party/spanner_pg/ddl/BUILD +++ b/third_party/spanner_pg/ddl/BUILD @@ -72,6 +72,7 @@ cc_library( "@com_google_absl//absl/status", "@com_google_absl//absl/status:statusor", "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/types:optional", "@com_google_protobuf//:protobuf_lite", "@com_google_zetasql//zetasql/base", diff --git a/third_party/spanner_pg/ddl/ddl_test.cc b/third_party/spanner_pg/ddl/ddl_test.cc index d0473d6c..bf3b313d 100644 --- a/third_party/spanner_pg/ddl/ddl_test.cc +++ b/third_party/spanner_pg/ddl/ddl_test.cc @@ -55,8 +55,9 @@ namespace { using ::google::spanner::emulator::backend::ddl::DDLStatementList; using ::testing::ElementsAre; -using ::zetasql_base::testing::StatusIs; +using ::testing::SizeIs; using ::zetasql_base::testing::IsOkAndHolds; +using ::zetasql_base::testing::StatusIs; class DdlTest : public testing::Test { protected: @@ -134,7 +135,7 @@ TEST_F(DdlTest, DisableDateType) { {.enable_date_type = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs(absl::StatusCode::kFailedPrecondition, + StatusIs(absl::StatusCode::kFailedPrecondition, "Type is not supported.")); } @@ -153,7 +154,7 @@ TEST_F(DdlTest, DisablePgJsonbType) { {.enable_jsonb_type = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs(absl::StatusCode::kFailedPrecondition, + StatusIs(absl::StatusCode::kFailedPrecondition, "Type is not supported.")); } @@ -170,7 +171,7 @@ TEST_F(DdlTest, DisableAnalyze) { base_helper_.Translator()->Translate(parsed_statements, {.enable_analyze = false}); - EXPECT_THAT(statements, zetasql_base::testing::StatusIs( + EXPECT_THAT(statements, StatusIs( absl::StatusCode::kFailedPrecondition, " statement is not supported.")); } @@ -188,7 +189,7 @@ TEST_F(DdlTest, DisableCreateView) { base_helper_.Translator()->Translate(parsed_statements, {.enable_create_view = false}); - EXPECT_THAT(statements, zetasql_base::testing::StatusIs( + EXPECT_THAT(statements, StatusIs( absl::StatusCode::kFailedPrecondition, " statement is not supported.")); } @@ -206,13 +207,9 @@ TEST_F(DdlTest, UnsupportedDropTypeDomain) { base_helper_.Translator()->Translate(parsed_statements, {.enable_create_view = false}); - EXPECT_THAT( - statements, - zetasql_base::testing::StatusIs( - absl::StatusCode::kFailedPrecondition, - " is not supported. Only , , " - ", , , and " - " statements are supported.")); + EXPECT_THAT(statements, + StatusIs(absl::StatusCode::kFailedPrecondition, + testing::HasSubstr(" is not supported."))); } // For unsupported by Spangres statements SchemaPrinter should error out @@ -224,7 +221,7 @@ TEST_F(DdlTest, UnsupportedCreateViewStatement) { create_function->set_sql_security( google::spanner::emulator::backend::ddl::Function::UNSPECIFIED_SQL_SECURITY); EXPECT_THAT(base_helper_.SchemaPrinter()->PrintDDLStatement(input), - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kInternal, testing::HasSubstr( "Only SQL SECURITY INVOKER or DEFINER is supported."))); @@ -389,7 +386,7 @@ TEST_F(DdlTest, DisableCreateChangeStream) { {.enable_change_streams = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, " statement is not supported.")); } @@ -410,7 +407,7 @@ TEST_F(DdlTest, DisableChangeStreamModTypeFilter) { parsed_statements, {.enable_change_streams = true, .enable_change_streams_mod_type_filter_options = false}); - EXPECT_THAT(statements, zetasql_base::testing::StatusIs( + EXPECT_THAT(statements, StatusIs( absl::StatusCode::kFailedPrecondition, "Options exclude_insert, exclude_update, and " "exclude_delete are not supported yet.")); @@ -433,7 +430,7 @@ TEST_F(DdlTest, DisableChangeStreamTtlDeletesFilter) { {.enable_change_streams = true, .enable_change_streams_ttl_deletes_filter_option = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, "Option exclude_ttl_deletes is not supported yet.")); } @@ -455,7 +452,7 @@ TEST_F(DdlTest, DisableChangeStreamAllowTxnExclusion) { {.enable_change_streams = true, .enable_change_streams_allow_txn_exclusion_option = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, "Option allow_txn_exclusion is not supported yet.")); } @@ -493,7 +490,7 @@ TEST_F(DdlTest, DisableAlterChangeStream) { {.enable_change_streams = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, " statement is not supported.")); } @@ -512,7 +509,7 @@ TEST_F(DdlTest, DisableDropChangeStream) { {.enable_change_streams = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, " statement is not supported.")); } @@ -589,7 +586,7 @@ TEST_F(DdlTest, DisableVectorLength) { {.enable_vector_length = false}); EXPECT_THAT(statements, - zetasql_base::testing::StatusIs( + StatusIs( absl::StatusCode::kFailedPrecondition, " constraint type is not supported.")); } diff --git a/third_party/spanner_pg/ddl/ddl_translator.h b/third_party/spanner_pg/ddl/ddl_translator.h index e6e0f94e..5290f21c 100644 --- a/third_party/spanner_pg/ddl/ddl_translator.h +++ b/third_party/spanner_pg/ddl/ddl_translator.h @@ -115,7 +115,7 @@ struct TranslationOptions { // which is a non-stored generated column. bool enable_virtual_generated_column = false; // enable_vector_length allows translation of clause. - bool enable_vector_length = false; + bool enable_vector_length = true; }; // Interface for translating PostgreSQL DDL parse tree (AST) to Spanner schema diff --git a/third_party/spanner_pg/ddl/pg_parse_tree_validator.cc b/third_party/spanner_pg/ddl/pg_parse_tree_validator.cc index f8f4ef49..6e75f458 100644 --- a/third_party/spanner_pg/ddl/pg_parse_tree_validator.cc +++ b/third_party/spanner_pg/ddl/pg_parse_tree_validator.cc @@ -52,6 +52,16 @@ namespace postgres_translator { namespace spangres { +absl::Status ValidateSequenceOption( + const List* options, + bool is_create, + const TranslationOptions& translation_options); + +absl::Status ValidateSequenceOption( + const DefElem& elem, + bool is_create +); + namespace { using PGConstants = internal::PostgreSQLConstants; using internal::FieldTypeChecker; @@ -100,8 +110,9 @@ absl::Status ValidateAlterColumnType(const AlterTableStmt& node, if (list_length(node.cmds) > 2) { return UnsupportedTranslationError( " statement can only modify one column " - "at a time and only support and " - "."); + "at a time and only support , , , " + ", and ."); } if (list_length(node.cmds) == 2) { ZETASQL_ASSIGN_OR_RETURN( @@ -453,7 +464,8 @@ absl::Status ValidateParseTreeNode(const AlterDatabaseSetStmt& node) { return absl::OkStatus(); } -absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter) { +absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter, + const TranslationOptions& options) { // Make sure that if Constraint structure changes we update the // translator. AssertPGNodeConsistsOf(node, FieldTypeChecker(node.contype), @@ -466,6 +478,7 @@ absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter) { FieldTypeChecker(node.cooked_expr), FieldTypeChecker(node.generated_when), FieldTypeChecker(node.stored_kind), + FieldTypeChecker(node.nulls_not_distinct), FieldTypeChecker(node.keys), FieldTypeChecker(node.including), FieldTypeChecker(node.exclusions), @@ -481,6 +494,7 @@ absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter) { FieldTypeChecker(node.fk_matchtype), FieldTypeChecker(node.fk_upd_action), FieldTypeChecker(node.fk_del_action), + FieldTypeChecker(node.fk_del_set_cols), FieldTypeChecker(node.old_conpfeqop), FieldTypeChecker(node.old_pktable_oid), FieldTypeChecker(node.skip_validation), @@ -583,11 +597,11 @@ absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter) { // `exclusions` is used for EXCLUDE constraints which are not supported. ZETASQL_RET_CHECK_EQ(node.exclusions, nullptr); - // `options` are defined in WITH clause, which is not supported. if (!IsListEmpty(node.options)) { - return UnsupportedTranslationError( - " clause is not supported in constraint definitions."); - } + // `options` are defined in WITH clause, which is not supported. + return UnsupportedTranslationError( + " clause is not supported in constraint definitions."); + } // `indexname` is used in ALTER TABLE ADD [UNIQUE | PRIMARY KEY] USING INDEX. // This type of ALTER statement is not supported. @@ -887,10 +901,10 @@ absl::Status ValidateParseTreeNode(const DropStmt& node, } for (int i = 0; i < list_length(object_to_drop_list); ++i) { ZETASQL_ASSIGN_OR_RETURN( - const Value* object_to_drop_node, - (GetListItemAsNode)(object_to_drop_list, i)); + const String* object_to_drop_node, + (GetListItemAsNode)(object_to_drop_list, i)); - char* object_to_drop = object_to_drop_node->val.str; + char* object_to_drop = object_to_drop_node->sval; // Expected to see non-empty object name to drop. ZETASQL_RET_CHECK(object_to_drop && *object_to_drop != '\0'); } @@ -901,18 +915,18 @@ absl::Status ValidateParseTreeNode(const DropStmt& node, "statement."); } ZETASQL_ASSIGN_OR_RETURN( - const Value* object_to_drop_node, - (SingleItemListAsNode)(object_to_drop_list)); + const String* object_to_drop_node, + (SingleItemListAsNode)(object_to_drop_list)); - char* object_to_drop = object_to_drop_node->val.str; + char* object_to_drop = object_to_drop_node->sval; // Expected to see non-empty object name to drop. ZETASQL_RET_CHECK(object_to_drop && *object_to_drop != '\0'); } } else { - ZETASQL_ASSIGN_OR_RETURN(const Value* object_to_drop_node, - (SingleItemListAsNode)(node.objects)); + ZETASQL_ASSIGN_OR_RETURN(const String* object_to_drop_node, + (SingleItemListAsNode)(node.objects)); - char* object_to_drop = object_to_drop_node->val.str; + char* object_to_drop = object_to_drop_node->sval; // Expected to see non-empty object name to drop. ZETASQL_RET_CHECK(object_to_drop && *object_to_drop != '\0'); } @@ -929,8 +943,10 @@ absl::Status ValidateParseTreeNode(const DropStmt& node, // if not enabled, or not a table or index, then an error. if (!options.enable_if_not_exists || !(node.removeType == OBJECT_TABLE || node.removeType == OBJECT_INDEX || - node.removeType == OBJECT_SEQUENCE || node.removeType == OBJECT_VIEW - || node.removeType == OBJECT_SCHEMA)) { + node.removeType == OBJECT_SEQUENCE || + node.removeType == OBJECT_VIEW || + node.removeType == OBJECT_SCHEMA + )) { return UnsupportedTranslationError( " is not supported by statement."); } @@ -963,10 +979,10 @@ absl::Status ValidateParseTreeNode(const TypeName& node) { // (catalog name and type name) elements. ZETASQL_RET_CHECK(!IsListEmpty(node.names)); ZETASQL_RET_CHECK_LE(list_length(node.names), 2); - for (const Value* type_name_part : StructList(node.names)) { + for (const String* type_name_part : StructList(node.names)) { ZETASQL_RET_CHECK_EQ(type_name_part->type, T_String); - ZETASQL_RET_CHECK_NE(type_name_part->val.str, nullptr); - ZETASQL_RET_CHECK_NE(*type_name_part->val.str, '\0'); + ZETASQL_RET_CHECK_NE(type_name_part->sval, nullptr); + ZETASQL_RET_CHECK_NE(*type_name_part->sval, '\0'); } // `typeOid` is used when type is defined internally via oid. Not used during @@ -1006,10 +1022,11 @@ absl::Status ValidateParseTreeNode(const TypeName& node) { } // Validate the option for both and . -absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create) { +absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create + ) { absl::string_view name = elem.defname; absl::string_view parent_statement_type = - is_create ? "CREATE SEQUENCE" : "ALTER SEQUENCE"; + (is_create ? "CREATE SEQUENCE" : "ALTER SEQUENCE"); ZETASQL_RET_CHECK(!name.empty()); if (name == "minvalue") { if (elem.arg != nullptr) { @@ -1024,10 +1041,10 @@ absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create) { parent_statement_type)); } } else if (name == "skip_range") { - ZETASQL_RET_CHECK_NE(elem.arg, nullptr); - ZETASQL_ASSIGN_OR_RETURN(const List* range_values, - (DowncastNode(elem.arg))); - ZETASQL_RET_CHECK_EQ(list_length(range_values), 2); + ZETASQL_RET_CHECK_NE(elem.arg, nullptr); + ZETASQL_ASSIGN_OR_RETURN(const List* range_values, + (DowncastNode(elem.arg))); + ZETASQL_RET_CHECK_EQ(list_length(range_values), 2); } else if (name == "start_counter" && is_create) { ZETASQL_RET_CHECK_NE(elem.arg, nullptr); // Pg integer-looking string will get lexed as T_Float if the value is @@ -1038,13 +1055,14 @@ absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create) { // Pg integer-looking string will get lexed as T_Float if the value is // too large to fit in an 'int'. ZETASQL_RET_CHECK(elem.arg->type == T_Integer || elem.arg->type == T_Float); - } else if (name == "owned_by") { + } else if (name == "owned_by" + ) { ZETASQL_ASSIGN_OR_RETURN(const List* names, (DowncastNode(elem.arg))); ZETASQL_RET_CHECK_GE(list_length(names), 1); if (list_length(names) == 1) { - ZETASQL_ASSIGN_OR_RETURN(const Value* name, - (SingleItemListAsNode(names))); - absl::string_view name_str = strVal(name); + ZETASQL_ASSIGN_OR_RETURN(const String* name, + (SingleItemListAsNode(names))); + absl::string_view name_str = name->sval; if (name_str == "none") { return absl::OkStatus(); } @@ -1052,10 +1070,9 @@ absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create) { return UnsupportedTranslationError( "Optional clause only support `NONE` as the value."); } else if (name == "cycle") { - ZETASQL_ASSIGN_OR_RETURN(const Value* cycleValue, - (DowncastNode(elem.arg))); - int32_t cycle = intVal(cycleValue); - if (cycle != 0) { + ZETASQL_ASSIGN_OR_RETURN(const Boolean* has_cycle, + (DowncastNode(elem.arg))); + if (has_cycle->boolval) { return UnsupportedTranslationError( "Optional clause only support `NO CYCLE` as the value."); } @@ -1067,7 +1084,9 @@ absl::Status ValidateSequenceOption(const DefElem& elem, bool is_create) { return absl::OkStatus(); } -absl::Status ValidateSequenceOption(const List* options, bool is_create) { +absl::Status ValidateSequenceOption( + const List* options, bool is_create, + const TranslationOptions& translation_options) { bool seen_bit_reversed_positive = false; for (int i = 0; i < list_length(options); ++i) { DefElem* elem = ::postgres_translator::internal::PostgresCastNode( @@ -1077,16 +1096,19 @@ absl::Status ValidateSequenceOption(const List* options, bool is_create) { if (name == "bit_reversed_positive" && is_create) { seen_bit_reversed_positive = true; } else { - ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption(*elem, is_create)); + ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption( + *elem, + is_create + )); } } - // Currently BIT_REVERSED_POSITIVE is mandatory. - if (!seen_bit_reversed_positive && is_create) { - return UnsupportedTranslationError( - "Only BIT_REVERSED_POSITIVE sequences are supported. Use `CREATE " - "SEQUENCE BIT_REVERSED_POSITIVE ...` to create sequence."); - } + if (!seen_bit_reversed_positive && is_create) { + return UnsupportedTranslationError( + "Only BIT_REVERSED_POSITIVE sequences are supported. Use `CREATE " + "SEQUENCE BIT_REVERSED_POSITIVE ...` to create sequence."); + } + return absl::OkStatus(); } @@ -1112,7 +1134,9 @@ absl::Status ValidateParseTreeNode(const CreateSeqStmt& node, // `options` defines the property of the sequence. Spangres only supports a // few portions of native PostgreSQL's options. List* opts = node.options; - ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption(opts, true)); + ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption( + opts, /*is_create=*/true, + options)); // `ownerId` should be the default value after parsing. ZETASQL_RET_CHECK_EQ(node.ownerId, InvalidOid); @@ -1139,7 +1163,9 @@ absl::Status ValidateParseTreeNode(const AlterSeqStmt& node, // specified options we don't (currently) allow. List* opts = node.options; if (opts != nullptr) { - ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption(opts, false)); + ZETASQL_RETURN_IF_ERROR(ValidateSequenceOption( + opts, /*is_create=*/false, + options)); } // `for_identity` true when it created for SERIAL @@ -1350,9 +1376,9 @@ absl::Status ValidateParseTreeNode(const AlterSpangresStatsStmt& node) { "spanner."); } - ZETASQL_ASSIGN_OR_RETURN(const Value* package_namespace, - (GetListItemAsNode(node.package_name, 0))); - if (std::string(package_namespace->val.str) != PGConstants::kNamespace) { + ZETASQL_ASSIGN_OR_RETURN(const String* package_namespace, + (GetListItemAsNode(node.package_name, 0))); + if (std::string(package_namespace->sval) != PGConstants::kNamespace) { return UnsupportedTranslationError(absl::StrCat( " statement requires package name to be prefixed by " "'", @@ -1837,7 +1863,9 @@ absl::Status ValidateParseTreeNode(const IndexStmt& node, FieldTypeChecker(node.indexOid), FieldTypeChecker(node.oldNode), FieldTypeChecker(node.oldCreateSubid), FieldTypeChecker(node.oldFirstRelfilenodeSubid), - FieldTypeChecker(node.unique), FieldTypeChecker(node.primary), + FieldTypeChecker(node.unique), + FieldTypeChecker(node.nulls_not_distinct), + FieldTypeChecker(node.primary), FieldTypeChecker(node.isconstraint), FieldTypeChecker(node.deferrable), FieldTypeChecker(node.initdeferred), @@ -2055,11 +2083,5 @@ absl::Status ValidateParseTreeNode(const NullTest& node) { return absl::OkStatus(); } -absl::Status ValidateParseTreeNode(const Value& node) { - AssertStructConsistsOf(node, FieldTypeChecker(node.type), - FieldTypeChecker(node.val)); - return absl::OkStatus(); -} - } // namespace spangres } // namespace postgres_translator diff --git a/third_party/spanner_pg/ddl/pg_parse_tree_validator.h b/third_party/spanner_pg/ddl/pg_parse_tree_validator.h index 65df6d70..d2dac4be 100644 --- a/third_party/spanner_pg/ddl/pg_parse_tree_validator.h +++ b/third_party/spanner_pg/ddl/pg_parse_tree_validator.h @@ -80,7 +80,8 @@ absl::Status ValidateParseTreeNode(const RangeVar& node, absl::string_view parent_statement_type); absl::Status ValidateParseTreeNode(const InterleaveSpec& node, absl::string_view parent_statement_type); -absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter); +absl::Status ValidateParseTreeNode(const Constraint& node, bool add_in_alter, + const TranslationOptions& options); absl::Status ValidateParseTreeNode(const AlterTableStmt& node, const TranslationOptions& options); absl::Status ValidateParseTreeNode(const AlterTableCmd& node, @@ -125,7 +126,6 @@ absl::Status ValidateParseTreeNode(const RenameStmt& node, absl::Status ValidateParseTreeNode(const TableChainedRenameStmt& node, const TranslationOptions& options); absl::Status ValidateParseTreeNode(const TableRenameOp& node); -absl::Status ValidateParseTreeNode(const Value& node); } // namespace spangres } // namespace postgres_translator diff --git a/third_party/spanner_pg/ddl/pg_to_spanner_ddl_translator.cc b/third_party/spanner_pg/ddl/pg_to_spanner_ddl_translator.cc index c1e1a9cf..6dbb675f 100644 --- a/third_party/spanner_pg/ddl/pg_to_spanner_ddl_translator.cc +++ b/third_party/spanner_pg/ddl/pg_to_spanner_ddl_translator.cc @@ -33,6 +33,7 @@ #include +#include #include #include #include @@ -47,6 +48,8 @@ #include "absl/flags/flag.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" +#include "absl/strings/str_format.h" +#include "absl/strings/str_join.h" #include "absl/strings/string_view.h" #include "absl/strings/substitute.h" #include "absl/types/optional.h" @@ -70,7 +73,6 @@ typedef google::protobuf::RepeatedPtrField TranslateOption( - absl::string_view option_name) const; + absl::string_view option_name, const TranslationOptions& options) const; absl::Status UnsupportedTranslationError( absl::string_view error_mesage) const; @@ -308,7 +310,7 @@ class PostgreSQLToSpannerDDLTranslatorImpl char action) const; absl::StatusOr GetSchemaName( - const Value& value, absl::string_view parent_statement_type) const; + const String& value, absl::string_view parent_statement_type) const; absl::StatusOr GetTableName( const RangeVar& range_var, absl::string_view parent_statement_type) const; @@ -396,7 +398,7 @@ absl::StatusOr IntervalString(const Ttl& node) { } ZETASQL_ASSIGN_OR_RETURN(const A_Const* acnode, (DowncastNode(tcnode->arg))); - return acnode->val.val.str; + return acnode->val.sval.sval; } // Returns true if PG list is empty or nullptr @@ -459,7 +461,9 @@ GetTypeMap() { {"int4range", absl::nullopt}, {"int8range", absl::nullopt}, {"internal", absl::nullopt}, + // copybara::insert_begin(interval-emulator-support) {"interval", absl::nullopt}, + // copybara::insert_end {"json", absl::nullopt}, {"jsonpath", absl::nullopt}, {"language_handler", absl::nullopt}, @@ -530,6 +534,34 @@ GetTypeMap() { return *map; } +// Suggest a type for unsupported PostgreSQL types based on +// https://cloud.google.com/spanner/docs/migrating-postgres-spanner-pgcompat#data-types +const absl::flat_hash_map>& +GetSuggestedTypeMap() { + static auto* map = new absl::flat_hash_map>{ + {"bigserial", {"bigint", "int8"}}, + {"serial8", {"bigint", "int8"}}, + {"cidr", {"text"}}, + {"inet", {"text"}}, + {"integer", {"bigint", "int8"}}, + {"int4", {"bigint", "int8"}}, + {"json", {"jsonb"}}, + {"macaddr", {"text"}}, + {"money", {"numeric", "decimal"}}, + {"realfloat4", {"double precision", "float8"}}, + {"smallint", {"bigint", "int8"}}, + {"int2", {"bigint", "int8"}}, + {"smallserial", {"bigint", "int8"}}, + {"serial2", {"bigint", "int8"}}, + {"serial", {"bigint, int8"}}, + {"serial4", {"bigint", "int8"}}, + {"uuid", {"text", "bytea"}}, + {"xml", {"text"}}}; + + return *map; +} + // Returns the first and only element of the single-item list cast to // . Checks that element's type is equal to NodeTypeTag. template @@ -616,7 +648,7 @@ PostgreSQLToSpannerDDLTranslatorImpl::GetInterleaveClauseType( absl::StatusOr PostgreSQLToSpannerDDLTranslatorImpl::TranslateOption( - absl::string_view option_name) const { + absl::string_view option_name, const TranslationOptions& options) const { ZETASQL_RET_CHECK(!option_name.empty()) << "Option name is missing."; absl::optional option = @@ -625,6 +657,7 @@ PostgreSQLToSpannerDDLTranslatorImpl::TranslateOption( return UnsupportedTranslationError( absl::StrCat("Database option <", option_name, "> is not supported.")); } + return *option; } @@ -637,12 +670,12 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ParseColumnType( schema_name = ""; - for (const Value* type_name_part : StructList(type.names)) { + for (const String* type_name_part : StructList(type.names)) { if (type_name_contains_schema_part) { - schema_name = type_name_part->val.str; + schema_name = type_name_part->sval; type_name_contains_schema_part = false; } else { - type_name = type_name_part->val.str; + type_name = type_name_part->sval; } } @@ -653,7 +686,8 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ProcessTableConstraint( const Constraint& constraint, const TranslationOptions& options, google::spanner::emulator::backend::ddl::ColumnDefinition* target_column, TableContext& context) const { - ZETASQL_RETURN_IF_ERROR(ValidateParseTreeNode(constraint, /*add_in_alter=*/false)); + ZETASQL_RETURN_IF_ERROR( + ValidateParseTreeNode(constraint, /*add_in_alter=*/false, options)); switch (constraint.contype) { case CONSTR_PRIMARY: { @@ -677,12 +711,12 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ProcessTableConstraint( } else { // Constraint is defined as a separate expression. ZETASQL_RET_CHECK(!IsListEmpty(constraint.keys)); - for (const Value* primary_key_part : - StructList(constraint.keys)) { + for (const String* primary_key_part : + StructList(constraint.keys)) { ZETASQL_RET_CHECK_EQ(primary_key_part->type, T_String); - ZETASQL_RET_CHECK_NE(primary_key_part->val.str, nullptr); + ZETASQL_RET_CHECK_NE(primary_key_part->sval, nullptr); - primary_key_column_names.push_back(primary_key_part->val.str); + primary_key_column_names.push_back(primary_key_part->sval); } } @@ -779,7 +813,6 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ProcessTableConstraint( return absl::OkStatus(); } - case CONSTR_ATTR_IMMEDIATE: case CONSTR_ATTR_NOT_DEFERRABLE: { // This means NOT DEFERRABLE and/or INITIALLY IMMEDIATE is set on @@ -814,15 +847,13 @@ PostgreSQLToSpannerDDLTranslatorImpl::GetInterleaveParentDeleteActionType( } absl::StatusOr PostgreSQLToSpannerDDLTranslatorImpl::GetSchemaName( - const Value& value, absl::string_view parent_statement_type) const { - ZETASQL_RETURN_IF_ERROR(ValidateParseTreeNode(value)); - if (value.val.str == nullptr) { + const String& value, absl::string_view parent_statement_type) const { + if (value.sval == nullptr) { return absl::InvalidArgumentError(absl::Substitute( "Schema name not specified in $0 statement.", parent_statement_type)); } - ZETASQL_RET_CHECK_EQ(value.type, T_String); - if (strcmp(value.val.str, "public") != 0) { - return value.val.str; + if (strcmp(value.sval, "public") != 0) { + return value.sval; } // Return empty string for public schema. return ""; @@ -860,7 +891,7 @@ PostgreSQLToSpannerDDLTranslatorImpl::GetFunctionName( bool uses_spanner_namespace = false; if (list_length(object_with_args.objname) == 2) { absl::string_view function_namespace = - static_cast(linitial(object_with_args.objname))->val.str; + static_cast(linitial(object_with_args.objname))->sval; if (function_namespace == "spanner") { uses_spanner_namespace = true; } @@ -871,7 +902,7 @@ PostgreSQLToSpannerDDLTranslatorImpl::GetFunctionName( parent_statement_type)); } std::string function_name = - static_cast(lsecond(object_with_args.objname))->val.str; + static_cast(lsecond(object_with_args.objname))->sval; return function_name; } @@ -1071,18 +1102,18 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateForeignKey( // Constraint is defined at table level -> we use data from constraint // itself to set constrained columns ZETASQL_RET_CHECK(!IsListEmpty(constraint.fk_attrs)); - for (Value* attr_name : StructList(constraint.fk_attrs)) { + for (String* attr_name : StructList(constraint.fk_attrs)) { ZETASQL_RET_CHECK_NE(attr_name, nullptr); ZETASQL_RET_CHECK_EQ(attr_name->type, T_String); - out.add_constrained_column_name(attr_name->val.str); + out.add_constrained_column_name(attr_name->sval); } } - for (Value* attr_name : StructList(constraint.pk_attrs)) { + for (String* attr_name : StructList(constraint.pk_attrs)) { ZETASQL_RET_CHECK_NE(attr_name, nullptr); ZETASQL_RET_CHECK_EQ(attr_name->type, T_String); - out.add_referenced_column_name(attr_name->val.str); + out.add_referenced_column_name(attr_name->sval); } ZETASQL_ASSIGN_OR_RETURN(std::string pk_table_name, @@ -1198,6 +1229,14 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ProcessPostgresType( } if (!type_it->second.has_value()) { // type not supported + auto suggested_type_it = GetSuggestedTypeMap().find(type_name); + if (suggested_type_it != GetSuggestedTypeMap().end()) { + // Type is unsupported; use bigint or int8_t instead. + return UnsupportedTranslationError( + absl::StrFormat( + "Type <%s> is not supported; use %s instead.", type_name, + absl::StrJoin(suggested_type_it->second, " or "))); + } return UnsupportedTranslationError( absl::StrCat("Type <", type_name, "> is not supported.")); } @@ -1227,12 +1266,12 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::ProcessPostgresType( ZETASQL_ASSIGN_OR_RETURN( const A_Const* length, (SingleItemListAsNode)(type.typmods)); - if (length->val.val.ival > PGConstants::kMaxStringLength) { + if (length->val.ival.ival > PGConstants::kMaxStringLength) { return UnsupportedTranslationError( absl::StrCat("Maximum length for fields is ", PGConstants::kMaxStringLength, ".")); } - where_to_set_type->set_length(length->val.val.ival); + where_to_set_type->set_length(length->val.ival.ival); } else { // should never get here ZETASQL_RET_CHECK_FAIL() << "Unexpected type name: " << type_name << "."; @@ -1312,11 +1351,10 @@ PostgreSQLToSpannerDDLTranslatorImpl::ProcessSequenceSkipRangeOption( (DowncastNode(skip_range.arg))); // Can not use the DowncastNode because the type tag could be either // T_INTEGER or T_FLOAT. - Value* skip_range_min = PostgresCastToValue(linitial(args)); char min_name[] = "skip_range_min"; ZETASQL_ASSIGN_OR_RETURN( DefElem * min_elem, - CheckedPgMakeDefElem(min_name, PostgresCastToNode(skip_range_min), + CheckedPgMakeDefElem(min_name, PostgresCastToNode(linitial(args)), skip_range.location)); ZETASQL_ASSIGN_OR_RETURN(int64_t min_int64, CheckedPgDefGetInt64(min_elem)); skip_range_min_option.set_option_name(min_name); @@ -1324,11 +1362,10 @@ PostgreSQLToSpannerDDLTranslatorImpl::ProcessSequenceSkipRangeOption( // Can not use the DowncastNode because the type tag could be either // T_INTEGER or T_FLOAT. - Value* skip_range_max = PostgresCastToValue(lsecond(args)); char max_name[] = "skip_range_max"; ZETASQL_ASSIGN_OR_RETURN( DefElem * max_elem, - CheckedPgMakeDefElem(max_name, PostgresCastToNode(skip_range_max), + CheckedPgMakeDefElem(max_name, PostgresCastToNode(lsecond(args)), skip_range.location)); ZETASQL_ASSIGN_OR_RETURN(int64_t max_int64, CheckedPgDefGetInt64(max_elem)); skip_range_max_option.set_option_name(max_name); @@ -1438,26 +1475,26 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropSequence( // sequence_to_drop_list is 1 or 2. if (sequence_to_drop_list->length == 2) { ZETASQL_ASSIGN_OR_RETURN( - const Value* schema_to_drop_node, - (GetListItemAsNode)(sequence_to_drop_list, 0)); + const String* schema_to_drop_node, + (GetListItemAsNode)(sequence_to_drop_list, 0)); ZETASQL_ASSIGN_OR_RETURN( - const Value* sequence_to_drop_node, - (GetListItemAsNode)(sequence_to_drop_list, 1)); - if (strcmp(schema_to_drop_node->val.str, "public") != 0) { + const String* sequence_to_drop_node, + (GetListItemAsNode)(sequence_to_drop_list, 1)); + if (strcmp(schema_to_drop_node->sval, "public") != 0) { *out.mutable_sequence_name() = - absl::Substitute("$0.$1", schema_to_drop_node->val.str, - sequence_to_drop_node->val.str); + absl::Substitute("$0.$1", schema_to_drop_node->sval, + sequence_to_drop_node->sval); } else { *out.mutable_sequence_name() = - absl::StrCat(sequence_to_drop_node->val.str); + absl::StrCat(sequence_to_drop_node->sval); } } else { ZETASQL_RET_CHECK_EQ(sequence_to_drop_list->length, 1) << "Incorrect number of name components in drop target."; ZETASQL_ASSIGN_OR_RETURN( - const Value* sequence_to_drop_node, - (SingleItemListAsNode)(sequence_to_drop_list)); - *out.mutable_sequence_name() = sequence_to_drop_node->val.str; + const String* sequence_to_drop_node, + (SingleItemListAsNode)(sequence_to_drop_list)); + *out.mutable_sequence_name() = sequence_to_drop_node->sval; } if (drop_statement.missing_ok) { @@ -1582,8 +1619,8 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateCreateTable( } if (out.primary_key_size() == 0) { - return UnsupportedTranslationError(absl::StrCat( - "Primary key must be defined for table \"", table_name, "\".")); + return UnsupportedTranslationError(absl::StrCat( + "Primary key must be defined for table \"", table_name, "\".")); } return absl::OkStatus(); @@ -1664,7 +1701,7 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateAlterTable( const Constraint* constraint, (DowncastNode(first_cmd->def))); ZETASQL_RETURN_IF_ERROR( - ValidateParseTreeNode(*constraint, /*add_in_alter=*/true)); + ValidateParseTreeNode(*constraint, /*add_in_alter=*/true, options)); if (!constraint->initially_valid && constraint->skip_validation) { return UnsupportedTranslationError( @@ -1875,6 +1912,7 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropStatement( case OBJECT_CHANGE_STREAM: return TranslateDropChangeStream( drop_statement, options, *out.mutable_drop_change_stream()); + case OBJECT_SEQUENCE: return TranslateDropSequence(drop_statement, options, *out.mutable_drop_sequence()); @@ -1920,22 +1958,22 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropView( if (view_to_drop_list->length == 2) { ZETASQL_ASSIGN_OR_RETURN( - const Value* schema_to_drop_node, - (GetListItemAsNode)(view_to_drop_list, 0)); + const String* schema_to_drop_node, + (GetListItemAsNode)(view_to_drop_list, 0)); ZETASQL_ASSIGN_OR_RETURN( - const Value* view_to_drop_node, - (GetListItemAsNode)(view_to_drop_list, 1)); - if (strcmp(schema_to_drop_node->val.str, "public") != 0) { + const String* view_to_drop_node, + (GetListItemAsNode)(view_to_drop_list, 1)); + if (strcmp(schema_to_drop_node->sval, "public") != 0) { *out.mutable_function_name() = absl::Substitute( - "$0.$1", schema_to_drop_node->val.str, view_to_drop_node->val.str); + "$0.$1", schema_to_drop_node->sval, view_to_drop_node->sval); } else { - *out.mutable_function_name() = view_to_drop_node->val.str; + *out.mutable_function_name() = view_to_drop_node->sval; } } else if (view_to_drop_list->length == 1) { ZETASQL_ASSIGN_OR_RETURN( - const Value* view_to_drop_node, - (SingleItemListAsNode)(view_to_drop_list)); - *out.mutable_function_name() = view_to_drop_node->val.str; + const String* view_to_drop_node, + (SingleItemListAsNode)(view_to_drop_list)); + *out.mutable_function_name() = view_to_drop_node->sval; } else { // Caller should have called ValidateParseTreeNode, which ensures the size // of view_to_drop_list is 1 or 2. So this should never be reached. @@ -1962,26 +2000,26 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropTable( // Caller should have called ValidateParseTreeNode, which ensures the size of // table_to_drop_list is 1 or 2. if (table_to_drop_list->length == 2) { - ZETASQL_ASSIGN_OR_RETURN(const Value* schema_to_drop_node, - (GetListItemAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* schema_to_drop_node, + (GetListItemAsNode)( table_to_drop_list, 0)); - ZETASQL_ASSIGN_OR_RETURN(const Value* table_to_drop_node, - (GetListItemAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* table_to_drop_node, + (GetListItemAsNode)( table_to_drop_list, 1)); - if (strcmp(schema_to_drop_node->val.str, "public") != 0) { + if (strcmp(schema_to_drop_node->sval, "public") != 0) { *out.mutable_table_name() = absl::Substitute("$0.$1", - schema_to_drop_node->val.str, - table_to_drop_node->val.str); + schema_to_drop_node->sval, + table_to_drop_node->sval); } else { - *out.mutable_table_name() = absl::StrCat(table_to_drop_node->val.str); + *out.mutable_table_name() = absl::StrCat(table_to_drop_node->sval); } } else { ZETASQL_RET_CHECK_EQ(table_to_drop_list->length, 1) << "Incorrect number of name components in drop target."; - ZETASQL_ASSIGN_OR_RETURN(const Value* table_to_drop_node, - (SingleItemListAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* table_to_drop_node, + (SingleItemListAsNode)( table_to_drop_list)); - *out.mutable_table_name() = table_to_drop_node->val.str; + *out.mutable_table_name() = table_to_drop_node->sval; } if (drop_statement.missing_ok && options.enable_if_not_exists) { @@ -2026,26 +2064,26 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropIndex( // Caller should have called ValidateParseTreeNode, which ensures the size of // index_to_drop_list is 1 or 2. if (index_to_drop_list->length == 2) { - ZETASQL_ASSIGN_OR_RETURN(const Value* schema_to_drop_node, - (GetListItemAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* schema_to_drop_node, + (GetListItemAsNode)( index_to_drop_list, 0)); - ZETASQL_ASSIGN_OR_RETURN(const Value* index_to_drop_node, - (GetListItemAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* index_to_drop_node, + (GetListItemAsNode)( index_to_drop_list, 1)); - if (strcmp(schema_to_drop_node->val.str, "public") != 0) { + if (strcmp(schema_to_drop_node->sval, "public") != 0) { *out.mutable_index_name() = absl::Substitute("$0.$1", - schema_to_drop_node->val.str, - index_to_drop_node->val.str); + schema_to_drop_node->sval, + index_to_drop_node->sval); } else { - *out.mutable_index_name() = absl::StrCat(index_to_drop_node->val.str); + *out.mutable_index_name() = absl::StrCat(index_to_drop_node->sval); } } else { ZETASQL_RET_CHECK_EQ(index_to_drop_list->length, 1) << "Incorrect number of name components in drop target."; - ZETASQL_ASSIGN_OR_RETURN(const Value* index_to_drop_node, - (SingleItemListAsNode)( + ZETASQL_ASSIGN_OR_RETURN(const String* index_to_drop_node, + (SingleItemListAsNode)( index_to_drop_list)); - *out.mutable_index_name() = index_to_drop_node->val.str; + *out.mutable_index_name() = index_to_drop_node->sval; } if (drop_statement.missing_ok && options.enable_if_not_exists) { @@ -2083,10 +2121,10 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateDropSchema( ZETASQL_RET_CHECK_EQ(drop_statement.removeType, OBJECT_SCHEMA); ZETASQL_ASSIGN_OR_RETURN( - const Value* schema_to_drop_node, - (SingleItemListAsNode)(drop_statement.objects)); + const String* schema_to_drop_node, + (SingleItemListAsNode)(drop_statement.objects)); - *out.mutable_schema_name() = schema_to_drop_node->val.str; + *out.mutable_schema_name() = schema_to_drop_node->sval; if (drop_statement.missing_ok) { out.set_if_exists(true); @@ -2174,12 +2212,12 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::TranslateAlterChangeStream( // Populate the change stream reset options, if any. if (alter_change_stream_stmt.opt_reset_options != nullptr) { - for (const Value* option_name : - StructList(alter_change_stream_stmt.opt_reset_options)) { + for (const String* option_name : + StructList(alter_change_stream_stmt.opt_reset_options)) { ZETASQL_RET_CHECK_EQ(option_name->type, T_String); - ZETASQL_RET_CHECK_NE(option_name->val.str, nullptr); - ZETASQL_RET_CHECK_NE(*option_name->val.str, '\0'); - std::string option_string = option_name->val.str; + ZETASQL_RET_CHECK_NE(option_name->sval, nullptr); + ZETASQL_RET_CHECK_NE(*option_name->sval, '\0'); + std::string option_string = option_name->sval; if (option_string == internal::PostgreSQLConstants:: kChangeStreamValueCaptureTypeOptionName) { google::spanner::emulator::backend::ddl::SetOption* option_out = @@ -2283,9 +2321,9 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::PopulateChangeStreamOptions( "Failed to provide valid option value for '$0' in <$1> statement.", def_elem->defname, parent_statement)); } - ZETASQL_ASSIGN_OR_RETURN(const Value* arg_value, - (DowncastNode(def_elem->arg))); - std::string value = arg_value->val.str; + ZETASQL_ASSIGN_OR_RETURN(const String* arg_value, + (DowncastNode(def_elem->arg))); + std::string value = arg_value->sval; google::spanner::emulator::backend::ddl::SetOption* option_out = options_out->Add(); option_out->set_option_name(def_elem->defname); if (absl::AsciiStrToLower(value) == "null") { @@ -2326,9 +2364,9 @@ absl::Status PostgreSQLToSpannerDDLTranslatorImpl::PopulateChangeStreamOptions( "Failed to provide valid option value for '$0' in <$1> statement.", def_elem->defname, parent_statement)); } - ZETASQL_ASSIGN_OR_RETURN(const Value* arg_value, - (DowncastNode(def_elem->arg))); - std::string value = arg_value->val.str; + ZETASQL_ASSIGN_OR_RETURN(const String* arg_value, + (DowncastNode(def_elem->arg))); + std::string value = arg_value->sval; google::spanner::emulator::backend::ddl::SetOption* option_out = options_out->Add(); option_out->set_option_name(def_elem->defname); if (absl::AsciiStrToLower(value) == "null") { @@ -2377,8 +2415,9 @@ PostgreSQLToSpannerDDLTranslatorImpl::PopulateChangeStreamForClause( // If there are explicitly tracked columns, for_all_columns cannot // be set to true. ZETASQL_RET_CHECK_EQ(tracked_table->for_all_columns, false); - for (Value* column_value : StructList(tracked_table->columns)) { - const char* column_name = column_value->val.str; + for (String* column_value : + StructList(tracked_table->columns)) { + const char* column_name = column_value->sval; ZETASQL_RET_CHECK(column_name && *column_name != '\0'); columns->add_column_name(column_name); } @@ -2868,9 +2907,9 @@ absl::StatusOr PostgreSQLToSpannerDDLTranslatorImpl:: return WhereClauseTranslationError(); } - ZETASQL_ASSIGN_OR_RETURN(const Value* value, - (SingleItemListAsNode(column_list))); - const char* column_name = value->val.str; + ZETASQL_ASSIGN_OR_RETURN(const String* value, + (SingleItemListAsNode(column_list))); + const char* column_name = value->sval; ZETASQL_RET_CHECK(column_name && *column_name != '\0'); return column_name; diff --git a/third_party/spanner_pg/ddl/translation_utils.cc b/third_party/spanner_pg/ddl/translation_utils.cc index aca8763f..a0546a79 100644 --- a/third_party/spanner_pg/ddl/translation_utils.cc +++ b/third_party/spanner_pg/ddl/translation_utils.cc @@ -314,6 +314,10 @@ absl::StatusOr ObjectTypeToString(ObjectType object_type) { return "USER MAPPING"; case OBJECT_VIEW: return "VIEW"; + case OBJECT_PARAMETER_ACL: + return "PARAMETER_ACL"; + case OBJECT_PUBLICATION_NAMESPACE: + return "PUBLICATION_NAMESPACE"; } return absl::FailedPreconditionError("Unknown object type"); } diff --git a/third_party/spanner_pg/errors/error_catalog.textproto b/third_party/spanner_pg/errors/error_catalog.textproto index c2d18fe8..566170be 100644 --- a/third_party/spanner_pg/errors/error_catalog.textproto +++ b/third_party/spanner_pg/errors/error_catalog.textproto @@ -217,6 +217,11 @@ group { group { code: "FEATURE_NOT_SUPPORTED" + message { + name: "UnitNotSupportedForType" + pg_message_id: "unit \"%s\" not supported for type %s" + } + message { name: "CrossDatabaseReferencesNotSupport" pg_message_id: "cross-database references are not implemented: %s" @@ -530,6 +535,11 @@ group { "ON CONFLICT DO UPDATE requires inference specification " "or constraint name" } + + message { + name: "NonIntegerConstant" + pg_message_id: "non-integer constant in %s" + } } group { @@ -544,6 +554,11 @@ group { group { code: "INVALID_PARAMETER_VALUE" + message { + name: "NumericScaleNotInRange" + pg_message_id: "NUMERIC scale %d must be between %d and %d" + } + message { name: "Float4NotSupport" pg_message_id: "The Postgres Type is not supported: float4" @@ -603,6 +618,11 @@ group { name: "DateUnitsNotRecognized" pg_message_id: "date units \"%s\" not recognized" } + + message { + name: "UnitNotRecognizedForType" + pg_message_id: "unit \"%s\" not recognized for type %s" + } } group { @@ -774,6 +794,11 @@ group { pg_message_id: "invalid input syntax for type %s: \"%s\"" } + message { + name: "InvalidInputString" + pg_message_id: "invalid input string for \"%s\"" + } + message { name: "InvalidValue" pg_message_id: "invalid value \"%s\" for \"%s\"" @@ -832,6 +857,11 @@ group { pg_message_id: "unrecognized token: \"%.*s\"" } + message { + name: "NotFoundCurlyBracketAtEndOfInputNode" + pg_message_id: "did not find '}' at end of input node" + } + message { name: "FunctionReturnNull" pg_message_id: "function %u returned NULL" diff --git a/third_party/spanner_pg/function_evaluators/formatting_evaluators.cc b/third_party/spanner_pg/function_evaluators/formatting_evaluators.cc index 6783ad21..cfe5c70e 100644 --- a/third_party/spanner_pg/function_evaluators/formatting_evaluators.cc +++ b/third_party/spanner_pg/function_evaluators/formatting_evaluators.cc @@ -74,6 +74,21 @@ absl::StatusOr Float8ToChar(double value, return CheckedPgTextDatumGetCString(formatted_number_datum); } +absl::StatusOr Float4ToChar(float value, + absl::string_view number_format) { + Datum value_in_datum = Float4GetDatum(value); + ZETASQL_ASSIGN_OR_RETURN( + Datum number_format_in_datum, + CheckedPgStringToDatum(std::string(number_format).c_str(), TEXTOID)); + + ZETASQL_ASSIGN_OR_RETURN( + Datum formatted_number_datum, + postgres_translator::CheckedOidFunctionCall2( + F_TO_CHAR_FLOAT4_TEXT, value_in_datum, number_format_in_datum)); + + return CheckedPgTextDatumGetCString(formatted_number_datum); +} + absl::StatusOr NumericToChar( absl::string_view numeric_decimal_string, absl::string_view number_format) { std::string numeric_string = std::string(numeric_decimal_string); diff --git a/third_party/spanner_pg/function_evaluators/tests/BUILD b/third_party/spanner_pg/function_evaluators/tests/BUILD index ad65ab33..a22536fb 100644 --- a/third_party/spanner_pg/function_evaluators/tests/BUILD +++ b/third_party/spanner_pg/function_evaluators/tests/BUILD @@ -278,6 +278,20 @@ cc_test( ], ) +cc_test( + name = "float4_to_char_test", + srcs = [ + "float4_to_char_test.cc", + ], + deps = [ + ":test_base", + "//third_party/spanner_pg/interface:pg_evaluators", + "@com_google_absl//absl/status", + "@com_google_googletest//:gtest", + "@com_google_zetasql//zetasql/base/testing:status_matchers", + ], +) + cc_test( name = "numeric_to_char_test", srcs = [ diff --git a/third_party/spanner_pg/function_evaluators/tests/date_part_extract_test.cc b/third_party/spanner_pg/function_evaluators/tests/date_part_extract_test.cc index e0cb6916..978897de 100644 --- a/third_party/spanner_pg/function_evaluators/tests/date_part_extract_test.cc +++ b/third_party/spanner_pg/function_evaluators/tests/date_part_extract_test.cc @@ -333,11 +333,11 @@ TEST_P(DateExtractErrorTest, DateExtractError) { const DateExtractErrorTestCase& test_case = GetParam(); ZETASQL_ASSERT_OK_AND_ASSIGN(int32_t source_input, PgDateIn(test_case.source)); for (const auto& unsupported_field : test_case.unsupported_fields) { - EXPECT_THAT( - PgDateExtract(unsupported_field, source_input), - StatusIs(absl::StatusCode::kUnimplemented, - HasSubstr(absl::StrFormat("date units \"%s\" not supported", - unsupported_field)))); + EXPECT_THAT(PgDateExtract(unsupported_field, source_input), + StatusIs(absl::StatusCode::kUnimplemented, + HasSubstr(absl::StrFormat( + "unit \"%s\" not supported for type date", + unsupported_field)))); } } diff --git a/third_party/spanner_pg/function_evaluators/tests/float4_to_char_test.cc b/third_party/spanner_pg/function_evaluators/tests/float4_to_char_test.cc new file mode 100644 index 00000000..53f59140 --- /dev/null +++ b/third_party/spanner_pg/function_evaluators/tests/float4_to_char_test.cc @@ -0,0 +1,509 @@ +// +// PostgreSQL is released under the PostgreSQL License, a liberal Open Source +// license, similar to the BSD or MIT licenses. +// +// PostgreSQL Database Management System +// (formerly known as Postgres, then as Postgres95) +// +// Portions Copyright © 1996-2020, The PostgreSQL Global Development Group +// +// Portions Copyright © 1994, The Regents of the University of California +// +// Portions Copyright 2023 Google LLC +// +// Permission to use, copy, modify, and distribute this software and its +// documentation for any purpose, without fee, and without a written agreement +// is hereby granted, provided that the above copyright notice and this +// paragraph and the following two paragraphs appear in all copies. +// +// IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +// LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +// EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN +// "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE +// MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +//------------------------------------------------------------------------------ + +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "zetasql/base/testing/status_matchers.h" +#include "absl/status/status.h" +#include "third_party/spanner_pg/function_evaluators/tests/test_base.h" +#include "third_party/spanner_pg/interface/formatting_evaluators.h" + +namespace postgres_translator::function_evaluators { +namespace { + +using ::testing::HasSubstr; +using ::testing::StrEq; +using ::zetasql_base::testing::IsOkAndHolds; +using ::zetasql_base::testing::StatusIs; + +class Float4ToCharTest : public PgEvaluatorTest { + protected: + void TearDown() override { + PgEvaluatorTest::TearDown(); + CleanupPostgresNumberCache(); + } +}; + +TEST_F(Float4ToCharTest, FormatNumberWithDigit9) { + EXPECT_THAT(Float4ToChar(123.45f, "999"), IsOkAndHolds(StrEq(" 123"))); + EXPECT_THAT(Float4ToChar(-123.45f, "999"), IsOkAndHolds(StrEq("-123"))); + EXPECT_THAT(Float4ToChar(123.45f, "9999"), IsOkAndHolds(StrEq(" 123"))); +} + +TEST_F(Float4ToCharTest, FormatNumberRoundsNumber) { + // Rounds down + EXPECT_THAT(Float4ToChar(0.1f, "9"), IsOkAndHolds(StrEq(" 0"))); + EXPECT_THAT(Float4ToChar(0.4f, "9"), IsOkAndHolds(StrEq(" 0"))); + EXPECT_THAT(Float4ToChar(1.2f, "9"), IsOkAndHolds(StrEq(" 1"))); + EXPECT_THAT(Float4ToChar(1.4f, "9"), IsOkAndHolds(StrEq(" 1"))); + EXPECT_THAT(Float4ToChar(1.49f, "9"), IsOkAndHolds(StrEq(" 1"))); + EXPECT_THAT(Float4ToChar(1.44f, "9.9"), IsOkAndHolds(StrEq(" 1.4"))); + EXPECT_THAT(Float4ToChar(1.449f, "9.9"), IsOkAndHolds(StrEq(" 1.4"))); + // Edge case, 0.5 is rounded down + EXPECT_THAT(Float4ToChar(0.5f, "9"), IsOkAndHolds(StrEq(" 0"))); + + // Rounds up + EXPECT_THAT(Float4ToChar(1.5f, "9"), IsOkAndHolds(StrEq(" 2"))); + EXPECT_THAT(Float4ToChar(1.9f, "9"), IsOkAndHolds(StrEq(" 2"))); + EXPECT_THAT(Float4ToChar(1.45f, "9.9"), IsOkAndHolds(StrEq(" 1.5"))); + EXPECT_THAT(Float4ToChar(1.451f, "9.9"), IsOkAndHolds(StrEq(" 1.5"))); + EXPECT_THAT(Float4ToChar(1.46f, "9.9"), IsOkAndHolds(StrEq(" 1.5"))); + EXPECT_THAT(Float4ToChar(0.51f, "9"), IsOkAndHolds(StrEq(" 1"))); + + // Negative numbers + EXPECT_THAT(Float4ToChar(-0.1f, "9"), IsOkAndHolds(StrEq("-0"))); + EXPECT_THAT(Float4ToChar(-0.5f, "9"), IsOkAndHolds(StrEq("-0"))); + EXPECT_THAT(Float4ToChar(-0.51f, "9"), IsOkAndHolds(StrEq("-1"))); + EXPECT_THAT(Float4ToChar(-0.9f, "9"), IsOkAndHolds(StrEq("-1"))); + EXPECT_THAT(Float4ToChar(-1.49f, "9"), IsOkAndHolds(StrEq("-1"))); + EXPECT_THAT(Float4ToChar(-1.5f, "9"), IsOkAndHolds(StrEq("-2"))); + EXPECT_THAT(Float4ToChar(-1.9f, "9"), IsOkAndHolds(StrEq("-2"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithDigit0) { + EXPECT_THAT(Float4ToChar(123.45f, "000"), IsOkAndHolds(StrEq(" 123"))); + EXPECT_THAT(Float4ToChar(123.45f, "0000"), IsOkAndHolds(StrEq(" 0123"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithDecimalPoint) { + EXPECT_THAT(Float4ToChar(123.45f, "999.99"), IsOkAndHolds(StrEq(" 123.45"))); + EXPECT_THAT(Float4ToChar(123.45f, "999.00"), IsOkAndHolds(StrEq(" 123.45"))); + // Rounds down + EXPECT_THAT(Float4ToChar(123.45f, "999.9"), IsOkAndHolds(StrEq(" 123.4"))); + EXPECT_THAT(Float4ToChar(123.45f, "999.0"), IsOkAndHolds(StrEq(" 123.4"))); + EXPECT_THAT(Float4ToChar(123.45f, "9999.999"), + IsOkAndHolds(StrEq(" 123.450"))); + EXPECT_THAT(Float4ToChar(123.45f, "0000.000"), + IsOkAndHolds(StrEq(" 0123.450"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithThousandsSeparator) { + EXPECT_THAT(Float4ToChar(123456.789f, "999,999.999"), + IsOkAndHolds(StrEq(" 123,457"))); + EXPECT_THAT(Float4ToChar(12345.67f, "999,999.999"), + IsOkAndHolds(StrEq(" 12,345.7"))); + EXPECT_THAT(Float4ToChar(1234567, "999,999,999.999"), + IsOkAndHolds(StrEq(" 1,234,567"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithAngleBrackets) { + EXPECT_THAT(Float4ToChar(123.45f, "999.99PR"), + IsOkAndHolds(StrEq(" 123.45 "))); + EXPECT_THAT(Float4ToChar(-123.45f, "999.99PR"), + IsOkAndHolds(StrEq("<123.45>"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithAnchoredSign) { + EXPECT_THAT(Float4ToChar(123.45f, "999.99S"), IsOkAndHolds(StrEq("123.45+"))); + EXPECT_THAT(Float4ToChar(123.45f, "S999.99"), IsOkAndHolds(StrEq("+123.45"))); + EXPECT_THAT(Float4ToChar(123.45f, "9S99.99"), IsOkAndHolds(StrEq("+123.45"))); + EXPECT_THAT(Float4ToChar(123.45f, "99S9.99"), IsOkAndHolds(StrEq("+123.45"))); +} + +// Locale is hardcoded to en_US in Spangres +TEST_F(Float4ToCharTest, FormatNumberWithLocalePatterns) { + // Currency symbol + EXPECT_THAT(Float4ToChar(123.45f, "L999.99"), + IsOkAndHolds(StrEq("$ 123.45"))); + // Decimal point + EXPECT_THAT(Float4ToChar(123.45f, "999D99"), IsOkAndHolds(StrEq(" 123.45"))); + // Group separator + EXPECT_THAT(Float4ToChar(12345.6f, "999G999.999"), + IsOkAndHolds(StrEq(" 12,345.6"))); + // Minus sign + EXPECT_THAT(Float4ToChar(-12.34f, "9MI9D99"), IsOkAndHolds(StrEq("1-2.34"))); + // Plus sign + EXPECT_THAT(Float4ToChar(12.34f, "9PL9.99"), IsOkAndHolds(StrEq(" 1+2.34"))); + // Plus/minus sign + EXPECT_THAT(Float4ToChar(-12.34f, "9SG9.99"), IsOkAndHolds(StrEq("1-2.34"))); + EXPECT_THAT(Float4ToChar(12.34f, "9SG9.99"), IsOkAndHolds(StrEq("1+2.34"))); + // Upper case ordinal number suffix (rounds down) + EXPECT_THAT(Float4ToChar(0.49f, "9TH"), IsOkAndHolds(StrEq(" 0TH"))); + EXPECT_THAT(Float4ToChar(1.49f, "9TH"), IsOkAndHolds(StrEq(" 1ST"))); + EXPECT_THAT(Float4ToChar(2.49f, "9TH"), IsOkAndHolds(StrEq(" 2ND"))); + EXPECT_THAT(Float4ToChar(3.49f, "9TH"), IsOkAndHolds(StrEq(" 3RD"))); + EXPECT_THAT(Float4ToChar(4.49f, "9TH"), IsOkAndHolds(StrEq(" 4TH"))); + // Upper case ordinal number suffix (rounds up) + EXPECT_THAT(Float4ToChar(1.5f, "9TH"), IsOkAndHolds(StrEq(" 2ND"))); + + // Lower case ordinal number suffix (rounds down) + EXPECT_THAT(Float4ToChar(0.49f, "9th"), IsOkAndHolds(StrEq(" 0th"))); + EXPECT_THAT(Float4ToChar(1.49f, "9th"), IsOkAndHolds(StrEq(" 1st"))); + EXPECT_THAT(Float4ToChar(2.49f, "9th"), IsOkAndHolds(StrEq(" 2nd"))); + EXPECT_THAT(Float4ToChar(3.49f, "9th"), IsOkAndHolds(StrEq(" 3rd"))); + EXPECT_THAT(Float4ToChar(4.49f, "9th"), IsOkAndHolds(StrEq(" 4th"))); + // Lower case ordinal number suffix (rounds up) + EXPECT_THAT(Float4ToChar(1.5f, "9th"), IsOkAndHolds(StrEq(" 2nd"))); +} + +TEST_F(Float4ToCharTest, FormatNumberAsRomanNumerals) { + // Rounds down + EXPECT_THAT(Float4ToChar(1.4f, "9RN"), + IsOkAndHolds(StrEq(" I"))); + EXPECT_THAT(Float4ToChar(2.4f, "9RN"), + IsOkAndHolds(StrEq(" II"))); + EXPECT_THAT(Float4ToChar(3.4f, "9RN"), + IsOkAndHolds(StrEq(" III"))); + EXPECT_THAT(Float4ToChar(4.4f, "9RN"), + IsOkAndHolds(StrEq(" IV"))); + EXPECT_THAT(Float4ToChar(5.4f, "9RN"), + IsOkAndHolds(StrEq(" V"))); + EXPECT_THAT(Float4ToChar(10.4f, "9RN"), + IsOkAndHolds(StrEq(" X"))); + EXPECT_THAT(Float4ToChar(50.4f, "9RN"), + IsOkAndHolds(StrEq(" L"))); + EXPECT_THAT(Float4ToChar(100.4f, "9RN"), + IsOkAndHolds(StrEq(" C"))); + EXPECT_THAT(Float4ToChar(500.4f, "9RN"), + IsOkAndHolds(StrEq(" D"))); + EXPECT_THAT(Float4ToChar(1000.4f, "9RN"), + IsOkAndHolds(StrEq(" M"))); + EXPECT_THAT(Float4ToChar(3999.4f, "9RN"), + IsOkAndHolds(StrEq(" MMMCMXCIX"))); + + // Rounds up + EXPECT_THAT(Float4ToChar(5.5f, "9RN"), + IsOkAndHolds(StrEq(" VI"))); +} + +TEST_F(Float4ToCharTest, ShiftNumberByPowersOfTen) { + EXPECT_THAT(Float4ToChar(9.9f, "9V9"), IsOkAndHolds(StrEq(" 99"))); + EXPECT_THAT(Float4ToChar(9.9f, "9V99999"), IsOkAndHolds(StrEq(" 990000"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithScientificNotation) { + EXPECT_THAT(Float4ToChar(123456.789f, "9.99EEEE"), + IsOkAndHolds(StrEq(" 1.23e+05"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithFillMode) { + EXPECT_THAT(Float4ToChar(1.2f, "9RNFM"), IsOkAndHolds(StrEq("I"))); + EXPECT_THAT(Float4ToChar(123.45f, "9999.999FM"), + IsOkAndHolds(StrEq("123.45"))); +} + +TEST_F(Float4ToCharTest, FormatNumberWithStringLiterals) { + EXPECT_THAT(Float4ToChar(485.67f, "\"Good number:\"999.99"), + IsOkAndHolds(StrEq("Good number: 485.67"))); +} + +TEST_F(Float4ToCharTest, FormatNumberEdgeCases) { + // Maintains digits after 0 + EXPECT_THAT(Float4ToChar(12.34f, "0999.9"), IsOkAndHolds(StrEq(" 0012.3"))); + + // Angle brackets format along with decimal / thousands separator + EXPECT_THAT(Float4ToChar(-123.5f, "0000.00PR"), + IsOkAndHolds(StrEq("<0123.50>"))); + EXPECT_THAT(Float4ToChar(-123.5f, "0000PR,"), IsOkAndHolds(StrEq("<0124>,"))); + EXPECT_THAT(Float4ToChar(-123.5f, "0000PR."), IsOkAndHolds(StrEq("<0124"))); + EXPECT_THAT(Float4ToChar(-123.5f, "0000PR,."), + IsOkAndHolds(StrEq("<0124,"))); + + // Minus sign is replaced by space on positive numbers + EXPECT_THAT(Float4ToChar(12.49f, "0MI0.0"), IsOkAndHolds(StrEq("1 2.5"))); + // Plus sign is replaced by space on negative numbers + EXPECT_THAT(Float4ToChar(-12.46f, "0PL0.0"), IsOkAndHolds(StrEq("-1 2.5"))); + + // Ordinal number suffixes are not applied to values < 0 + EXPECT_THAT(Float4ToChar(-123.1f, "000TH"), IsOkAndHolds(StrEq("-123"))); + EXPECT_THAT(Float4ToChar(-123.1f, "000th"), IsOkAndHolds(StrEq("-123"))); +} + +TEST_F(Float4ToCharTest, + ReturnsPlaceholderWhenNumberCanNotBeFormattedWithValidPattern) { + // Less significant digits in format then in given number + EXPECT_THAT(Float4ToChar(123.45f, "00.00"), IsOkAndHolds(StrEq(" ##.##"))); + EXPECT_THAT(Float4ToChar(123.45f, "9PL9"), IsOkAndHolds(StrEq(" #+#"))); + EXPECT_THAT(Float4ToChar(123.45f, "9MI9"), IsOkAndHolds(StrEq("# #"))); + // Only 1-3999 roman numbers are supported (0.5 is rounded down / 3999.5 is + // rounded up) + EXPECT_THAT(Float4ToChar(0.5f, "9RN"), + IsOkAndHolds(StrEq("###############"))); + EXPECT_THAT(Float4ToChar(3999.5f, "9RN"), + IsOkAndHolds(StrEq("###############"))); +} + +TEST_F(Float4ToCharTest, ReturnsEmptyStringWhenFormatIsEmpty) { + EXPECT_THAT(Float4ToChar(123.45f, ""), IsOkAndHolds(StrEq(""))); +} + +TEST_F(Float4ToCharTest, MsanViolationTest) { + // Because the format goes beyond the allowed number of double digits the + // output template (with '#'s) is shrunk. This originally caused a pointer + // to overflow to an invalid position. We can run this test with msan to + // guarantee such bug is fixed. This is also tested in the corresponding fuzz + // tests. + EXPECT_THAT(Float4ToChar(12345678901, "FM9999999999D999990"), + IsOkAndHolds(StrEq("##########."))); + EXPECT_THAT(Float4ToChar(12345678901, "FM9999999999D9999900000000000000000"), + IsOkAndHolds(StrEq("##########."))); +} + +TEST_F(Float4ToCharTest, AsanViolationTest) { + EXPECT_THAT(Float4ToChar(std::numeric_limits::quiet_NaN(), "rn"), + IsOkAndHolds(StrEq("###############"))); +} + +TEST_F(Float4ToCharTest, ReturnsErrorWhenFormatIsInvalid) { + EXPECT_THAT(Float4ToChar(-9.9f, "9PR.9"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("\"9\" must be ahead of \"PR\""))); + EXPECT_THAT( + Float4ToChar(9.9f, "9.9V9"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("cannot use \"V\" and decimal point together"))); + EXPECT_THAT(Float4ToChar(9.9f, "9..9"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("multiple decimal points"))); + EXPECT_THAT(Float4ToChar(9.9f, "EEEE9.9"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("\"EEEE\" must be the last pattern used"))); + EXPECT_THAT(Float4ToChar(9.9f, "9EEEE EEEE"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("cannot use \"EEEE\" twice"))); + EXPECT_THAT( + Float4ToChar(9.9f, "S9.9EEEE"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("\"EEEE\" is incompatible with other formats"))); +} + +struct RegressionTestCase { + double input_value; + std::string input_format; + std::string expected_output; +}; + +class RegressionTest : public PgEvaluatorTestWithParam { + protected: + void TearDown() override { + PgEvaluatorTestWithParam::TearDown(); + CleanupPostgresNumberCache(); + } +}; + +// ---- Parameterized tests +// These tests exercise regression scenarios in PostgreSQL + +TEST_P(RegressionTest, PostgreSQLRegressionTests) { + const RegressionTestCase& test_case = GetParam(); + EXPECT_THAT(Float4ToChar(test_case.input_value, test_case.input_format), + IsOkAndHolds(StrEq(test_case.expected_output))); +} +INSTANTIATE_TEST_SUITE_P( + RegressionTestSuite, RegressionTest, + testing::Values( + RegressionTestCase({0, "9G999G999G999G999G999", + " 0"}), + RegressionTestCase({0, "9G999G999D999G999", " .000,00"}), + RegressionTestCase({0, "9999999999999999.999999999999999PR", + " .00000 "}), + RegressionTestCase({0, "9999999999999999.99999S", + " .00000+"}), + RegressionTestCase({0, "MI9999999999999999.99999", + " .00000"}), + RegressionTestCase({0, "FMS9999999999999999.999999999999999", "+0."}), + RegressionTestCase({0, "FM9999999999999999.999999999999999THPR", "0."}), + RegressionTestCase({0, "SG9999999999999999.999999th", + "+ .00000"}), + RegressionTestCase({0, "0999999999999999.999999", + " 0000000000000000.00000"}), + RegressionTestCase({0, "S0999999999999999.999999", + "+0000000000000000.00000"}), + RegressionTestCase({0, "FM0999999999999999.999999999999999", + "0000000000000000."}), + RegressionTestCase({0, "FM9999999999999999.099999999999999", ".0"}), + RegressionTestCase({0, "FM9999999999990999.990999999999999", + "0000.000"}), + RegressionTestCase({0, "FM0999999999999999.999909999999999", + "0000000000000000.00000"}), + RegressionTestCase({0, "FM9999999990999999.099999999999999", + "0000000.0"}), + RegressionTestCase({0, "L9999999999999999.099999999999999", + "$ .00000"}), + RegressionTestCase({0, "FM9999999999999999.99999999999999", "0."}), + RegressionTestCase({0, + "S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 " + "9 9 9 9 9 9 9 9 9 9", + " +. 0 0 0 0 0 "}), + RegressionTestCase({0, + "FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 " + "9 9 9 9 9 9 9 9 9 9 9", + " +0 . "}), + RegressionTestCase( + {0, + "99999 \"text\" 9999 \"9999\" 999 \"\\\"text between quote " + "marks\\\"\" 9999", + " text 9999 \"text between quote marks\" 0"}), + RegressionTestCase({0, "999999SG9999999999", " + 0"}), + RegressionTestCase({0, "FM9999999999999999.999999999999999", "0."}), + RegressionTestCase({0, "9.999EEEE", " 0.000e+00"}), + + RegressionTestCase({-1234.354f, "9G999G999G999G999G999", + " -1,234"}), + RegressionTestCase({-1234.354f, + "9G999G999G999G999G999D999G999G999G999G999", + " -1,234.35"}), + RegressionTestCase({-1234.354f, + "9999999999999999.999999999999999PR", + " <1234.35>"}), + RegressionTestCase({-1234.354f, + "9999999999999999.999999999999999S", + " 1234.35-"}), + RegressionTestCase({-1234.354f, + "MI9999999999999999.999999999999999", + "- 1234.35"}), + RegressionTestCase({-1234.354f, + "FMS9999999999999999.999999999999999", + "-1234.35"}), + RegressionTestCase({-1234.354f, + "FM9999999999999999.999999999999999THPR", + "<1234.35>"}), + RegressionTestCase({-1234.354f, + "SG9999999999999999.999999999999999th", + "- 1234.35"}), + RegressionTestCase({-1234.354f, + "0999999999999999.999999999999999", + "-0000000000001234.35"}), + RegressionTestCase({-1234.354f, + "S0999999999999999.999999999999999", + "-0000000000001234.35"}), + RegressionTestCase({-1234.354f, + "FM0999999999999999.999999999999999", + "-0000000000001234.35"}), + RegressionTestCase({-1234.354f, + "FM9999999999999999.099999999999999", + "-1234.35"}), + RegressionTestCase({-1234.354f, + "FM9999999999990999.990999999999999", + "-1234.35"}), + RegressionTestCase({-1234.354f, + "FM0999999999999999.999909999999999", + "-0000000000001234.35"}), + RegressionTestCase({-1234.354f, + "FM9999999990999999.099999999999999", + "-0001234.35"}), + RegressionTestCase({-1234.354f, + "L9999999999999999.099999999999999", + "$ -1234.35"}), + RegressionTestCase({-1234.354f, + "FM9999999999999999.99999999999999", + "-1234.35"}), + RegressionTestCase( + {-1234.354f, + "S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 " + "9 9 9", + " -1 2 3 4 . 3 5 "}), + RegressionTestCase( + {-1234.354f, + "FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 " + "9 9 9 9", + " -1 2 3 4 . 3 5 "}), + RegressionTestCase( + {-1234.354f, + "99999 \"text\" 9999 \"9999\" 999 \"\\\"text between quote " + "marks\\\"\" 9999", + " text 9999 \"text between quote marks\" -1234"}), + RegressionTestCase({-1234.354f, "999999SG9999999999", + " - 1234"}), + RegressionTestCase({-1234.354f, + "FM9999999999999999.999999999999999", + "-1234.35"}), + RegressionTestCase({-1234.354f, "9.999EEEE", "-1.234e+03"}), + + RegressionTestCase({9461.411f, "9G999G999G999G999G999", + " 9,461"}), + RegressionTestCase({9461.411f, + "9G999G999G999G999G999D999G999G999G999G999", + " 9,461.41"}), + RegressionTestCase({9461.411f, "9999999999999999.999999999999999PR", + " 9461.41 "}), + RegressionTestCase({9461.411f, "9999999999999999.999999999999999S", + " 9461.41+"}), + RegressionTestCase({9461.411f, "MI9999999999999999.999999999999999", + " 9461.41"}), + RegressionTestCase({9461.411f, + "FMS9999999999999999.999999999999999", + "+9461.41"}), + RegressionTestCase({9461.411f, + "FM9999999999999999.999999999999999THPR", + "9461.41"}), + RegressionTestCase({9461.411f, + "SG9999999999999999.999999999999999th", + "+ 9461.41"}), + RegressionTestCase({9461.411f, "0999999999999999.999999999999999", + " 0000000000009461.41"}), + RegressionTestCase({9461.411f, "S0999999999999999.999999999999999", + "+0000000000009461.41"}), + RegressionTestCase({9461.411f, "FM0999999999999999.999999999999999", + "0000000000009461.41"}), + RegressionTestCase({9461.411f, "FM9999999999999999.099999999999999", + "9461.41"}), + RegressionTestCase({9461.411f, "FM9999999999990999.990999999999999", + "9461.41"}), + RegressionTestCase({9461.411f, "FM0999999999999999.999909999999999", + "0000000000009461.41"}), + RegressionTestCase({9461.411f, "FM9999999990999999.099999999999999", + "0009461.41"}), + RegressionTestCase({9461.411f, "L9999999999999999.099999999999999", + "$ 9461.41"}), + RegressionTestCase({9461.411f, "FM9999999999999999.99999999999999", + "9461.41"}), + RegressionTestCase( + {9461.411f, + "S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 " + "9 9 9", + " +9 4 6 1 . 4 1 "}), + RegressionTestCase({9461.41f, + "FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 " + "9 9 9 9 9 9 9 9 9 9 9", + " +9 4 6 1 . 4 1 "}), + RegressionTestCase( + {9461.41f, + "99999 \"text\" 9999 \"9999\" 999 \"\\\"text between quote " + "marks\\\"\" 9999", + " text 9999 \"text between quote marks\" 9461"}), + RegressionTestCase({9461.41f, "999999SG9999999999", + " + 9461"}), + RegressionTestCase({9461.41f, "FM9999999999999999.999999999999999", + "9461.41"}), + RegressionTestCase({9461.41f, "9.999EEEE", " 9.461e+03"}))); +} // namespace +} // namespace postgres_translator::function_evaluators + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/third_party/spanner_pg/function_evaluators/tests/to_timestamp_test.cc b/third_party/spanner_pg/function_evaluators/tests/to_timestamp_test.cc index efdfe8ff..805e78d7 100644 --- a/third_party/spanner_pg/function_evaluators/tests/to_timestamp_test.cc +++ b/third_party/spanner_pg/function_evaluators/tests/to_timestamp_test.cc @@ -387,6 +387,10 @@ TEST_F(RegressionTest, ReturnsUnimplementedForTZPattern) { // --config=asan TEST_F(RegressionTest, ASANViolation) { + EXPECT_THAT(ToTimestamp("92996999\3649999999999\376\2769999999", + "IDDDtm\242\215GITM"), + StatusIs(absl::StatusCode::kInvalidArgument, + HasSubstr("timestamp out of range"))); EXPECT_THAT(ToTimestamp("\013 \010\25411111111\010", std::string("\232\361UC--------tym---.\000----", 24)), StatusIs(absl::StatusCode::kInvalidArgument)); diff --git a/third_party/spanner_pg/interface/formatting_evaluators.h b/third_party/spanner_pg/interface/formatting_evaluators.h index b86ad1fb..ee2536eb 100644 --- a/third_party/spanner_pg/interface/formatting_evaluators.h +++ b/third_party/spanner_pg/interface/formatting_evaluators.h @@ -51,6 +51,10 @@ absl::StatusOr Int8ToChar(int64_t value, absl::StatusOr Float8ToChar(double value, absl::string_view number_format); +// Converts float32 to string according to the given format. +absl::StatusOr Float4ToChar(float value, + absl::string_view number_format); + // Converts numeric decimal string to string according to the given format absl::StatusOr NumericToChar( absl::string_view numeric_decimal_string, absl::string_view number_format); diff --git a/third_party/spanner_pg/interface/stub_formatting_evaluators.cc b/third_party/spanner_pg/interface/stub_formatting_evaluators.cc index 99f926fc..7505b713 100644 --- a/third_party/spanner_pg/interface/stub_formatting_evaluators.cc +++ b/third_party/spanner_pg/interface/stub_formatting_evaluators.cc @@ -29,7 +29,10 @@ // MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. //------------------------------------------------------------------------------ +#include #include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/string_view.h" #include "third_party/spanner_pg/interface/formatting_evaluators.h" namespace postgres_translator::function_evaluators { @@ -46,6 +49,11 @@ absl::StatusOr Float8ToChar(double value, return absl::UnimplementedError("invoked stub Float8ToChar"); } +absl::StatusOr Float4ToChar(float value, + absl::string_view number_format) { + return absl::UnimplementedError("invoked stub Float4ToChar"); +} + absl::StatusOr NumericToChar( absl::string_view numeric_encoded_value, absl::string_view number_format) { return absl::UnimplementedError("invoked stub NumericToChar"); diff --git a/third_party/spanner_pg/interface/test/BUILD b/third_party/spanner_pg/interface/test/BUILD index 235d6b35..dbc0fbcf 100644 --- a/third_party/spanner_pg/interface/test/BUILD +++ b/third_party/spanner_pg/interface/test/BUILD @@ -49,7 +49,7 @@ disabled_non_emulator_golden_tests = [ # columns after gpk support. "testdata/gencol_emulator_insertdml.test", # The emulator and spanner have different resolved ASTs for the distance functions - "testdata/float4_functions_emulator.test", + "testdata/float4_functions_only_emulator.test", # TODO: reenable once Spangres is on the Spanner dev branch. "testdata/fts_functions.test", ] diff --git a/third_party/spanner_pg/postgres_includes/pg-include-list.h b/third_party/spanner_pg/postgres_includes/pg-include-list.h index f9beba74..ab595ca4 100644 --- a/third_party/spanner_pg/postgres_includes/pg-include-list.h +++ b/third_party/spanner_pg/postgres_includes/pg-include-list.h @@ -60,6 +60,7 @@ #include "third_party/spanner_pg/src/include/access/htup_details.h" #include "third_party/spanner_pg/src/include/access/nbtree.h" #include "third_party/spanner_pg/src/include/access/sysattr.h" +#include "third_party/spanner_pg/src/include/access/toast_compression.h" #include "third_party/spanner_pg/src/include/catalog/index.h" #include "third_party/spanner_pg/src/include/catalog/namespace.h" #include "third_party/spanner_pg/src/include/catalog/pg_aggregate.h" @@ -111,7 +112,6 @@ #include "third_party/spanner_pg/src/include/utils/elog.h" #include "third_party/spanner_pg/src/include/utils/fmgrtab.h" #include "third_party/spanner_pg/src/include/utils/formatting.h" -#include "third_party/spanner_pg/src/include/utils/int8.h" // DO_NOT_TRANSFORM #include "third_party/spanner_pg/src/include/utils/lsyscache.h" #include "third_party/spanner_pg/src/include/utils/memutils.h" #include "third_party/spanner_pg/src/include/utils/numeric.h" diff --git a/third_party/spanner_pg/shims/catalog_shim.c b/third_party/spanner_pg/shims/catalog_shim.c index fba39305..f1587727 100644 --- a/third_party/spanner_pg/shims/catalog_shim.c +++ b/third_party/spanner_pg/shims/catalog_shim.c @@ -312,8 +312,8 @@ Node* HintColumnRefToString(ColumnRef* column_ref) { } Assert(IsA(value, String)); A_Const* a_const = makeNode(A_Const); - a_const->val.type = T_String; - a_const->val.val.str = strVal(value); + a_const->val.node.type = T_String; + a_const->val.sval.sval = strVal(value); a_const->location = column_ref->location; return (Node*)a_const; } diff --git a/third_party/spanner_pg/shims/catalog_shim.h b/third_party/spanner_pg/shims/catalog_shim.h index 9a077515..7f169f96 100644 --- a/third_party/spanner_pg/shims/catalog_shim.h +++ b/third_party/spanner_pg/shims/catalog_shim.h @@ -662,11 +662,11 @@ void cancel_parser_errposition_callback(ParseCallbackState* pcbstate); // field is removed from ParseState. void free_parsestate(ParseState* pstate); -// Convert a Value node (as returned by the grammar) to a Const node +// Convert a A_Const value (as returned by the grammar) to a Const node // and assign a type for the constant. The original PostgreSQL function chooses // int4, int8_t, or numeric for integers and floats but the Spangres function will // only choose int8_t or numeric.. -Const* make_const(ParseState* pstate, Value* value, int location); +Const* make_const(ParseState* pstate, A_Const* aconst); /*---------------------------------------------------------------------------*/ /* Shimmed functions from parser/parse_oper.c */ diff --git a/third_party/spanner_pg/shims/catalog_shim_cc_wrappers.cc b/third_party/spanner_pg/shims/catalog_shim_cc_wrappers.cc index 8ad89713..e7f762cd 100644 --- a/third_party/spanner_pg/shims/catalog_shim_cc_wrappers.cc +++ b/third_party/spanner_pg/shims/catalog_shim_cc_wrappers.cc @@ -394,9 +394,10 @@ static absl::StatusOr ExpandNSItemVarsForJoinCpp( List* result = NIL; int colindex = -1; - for (Value* colnameval : StructList(nsitem->p_rte->eref->colnames)) { + for (String* colnameval : + StructList(nsitem->p_rte->eref->colnames)) { ++colindex; - const char* colname = strVal(colnameval); + const char* colname = colnameval->sval; // During ordinary parsing, there will never be any // deleted columns in the join; but we have to check since diff --git a/third_party/spanner_pg/shims/catalog_shim_deparser.c b/third_party/spanner_pg/shims/catalog_shim_deparser.c index 8860cd7f..a8b1ae95 100644 --- a/third_party/spanner_pg/shims/catalog_shim_deparser.c +++ b/third_party/spanner_pg/shims/catalog_shim_deparser.c @@ -97,54 +97,37 @@ void appendContextKeyword(deparse_context* context, const char* str, int indentBefore, int indentAfter, int indentPlus); void simple_quote_literal(StringInfo buf, const char* val); -char* GetStringValue(Value* val) { - if (val->type != T_String) { - elog(ERROR, "invalid parse tree: string value expected, but got %s", - CNodeTagToNodeString(val->type)); - } - - return val->val.str; -} - -int GetIntValue(Value* val) { - if (val->type != T_Integer) { - elog(ERROR, "invalid parse tree: integer value expected, but got %s", - CNodeTagToNodeString(val->type)); - } - - return val->val.ival; -} - // Deparse Value node and print it as literal depending on type: // - for int nodes, just print as is // - for string nodes, quote the value before printing -void GetValueDef(Value* val, deparse_context* context) { +void GetValueDef(A_Const* aconst, deparse_context* context) { StringInfo buf = context->buf; - switch (val->type) { + switch (aconst->val.node.type) { case T_Integer: - appendStringInfo(buf, "%d", val->val.ival); + appendStringInfo(buf, "%d", aconst->val.ival.ival); break; case T_String: - simple_quote_literal(buf, val->val.str); + simple_quote_literal(buf, aconst->val.sval.sval); break; // TODO: add test case and support for T_Float, T_Null values default: - elog(ERROR, "unexpected value type %s", CNodeTagToNodeString(val->type)); + elog(ERROR, "unexpected value type %s", + CNodeTagToNodeString(aconst->val.node.type)); } } // Deparse Value node and print it as identifier -void GetIdentifierValueDef(Value* val, deparse_context* context) { +void GetIdentifierValueDef(union ValUnion* val, deparse_context* context) { StringInfo buf = context->buf; - if (val->type != T_String || val->val.str == NULL) { + if (val->node.type != T_String || val->sval.sval == NULL) { elog(ERROR, "invalid identifier type"); } - appendStringInfoString(buf, quote_identifier(val->val.str)); + appendStringInfoString(buf, quote_identifier(val->sval.sval)); } // Deparse RangeVar and append it to buf. @@ -204,7 +187,7 @@ void GetTypeNameDef(TypeName* stmt, deparse_context* context) { type_name); } A_Const* typmod_node = castNode(A_Const, linitial(stmt->typmods)); - GetValueDef(&typmod_node->val, context); + GetValueDef(typmod_node, context); } else if (strcmp(type_name, "numeric") == 0) { if (list_length(stmt->typmods) != 2) { elog(ERROR, @@ -213,9 +196,9 @@ void GetTypeNameDef(TypeName* stmt, deparse_context* context) { } A_Const* precision_node = castNode(A_Const, linitial(stmt->typmods)); A_Const* scale_node = castNode(A_Const, lsecond(stmt->typmods)); - GetValueDef(&precision_node->val, context); + GetValueDef(precision_node, context); appendStringInfoString(buf, ", "); - GetValueDef(&scale_node->val, context); + GetValueDef(scale_node, context); } else { elog(ERROR, "type modifiers are not allowed for type %s", type_name); } @@ -482,7 +465,7 @@ void GetConstraintDef(Constraint* stmt, deparse_context* context) { appendStringInfoString(buf, " ("); for (ListCell* pk_it = list_head(stmt->keys); pk_it; pk_it = lnext(stmt->keys, pk_it)) { - GetIdentifierValueDef((Value*)lfirst(pk_it), context); + GetIdentifierValueDef((union ValUnion*)lfirst(pk_it), context); if (lnext(stmt->keys, pk_it) != NULL) { appendStringInfo(buf, ", "); @@ -516,7 +499,7 @@ void GetConstraintDef(Constraint* stmt, deparse_context* context) { for (ListCell* fk_it = list_head(stmt->fk_attrs); fk_it; fk_it = lnext(stmt->fk_attrs, fk_it)) { - GetIdentifierValueDef((Value*)lfirst(fk_it), context); + GetIdentifierValueDef(lfirst(fk_it), context); if (lnext(stmt->fk_attrs, fk_it) != NULL) { appendStringInfo(buf, ", "); @@ -531,7 +514,7 @@ void GetConstraintDef(Constraint* stmt, deparse_context* context) { for (ListCell* pk_it = list_head(stmt->pk_attrs); pk_it; pk_it = lnext(stmt->pk_attrs, pk_it)) { - GetIdentifierValueDef((Value*)lfirst(pk_it), context); + GetIdentifierValueDef(lfirst(pk_it), context); if (lnext(stmt->pk_attrs, pk_it) != NULL) { appendStringInfo(buf, ", "); @@ -639,7 +622,7 @@ void GetAlterDatabaseSetStmtDef(AlterDatabaseSetStmt* stmt, } A_Const* const_node = castNode(A_Const, linitial(set_statement->args)); - GetValueDef(&const_node->val, context); + GetValueDef(const_node, context); return; } @@ -721,12 +704,12 @@ void GetDropStmtDef(DropStmt* stmt, deparse_context* context) { elog(ERROR, "catalog qualifiers support is not implemented in statement"); } else if (list_length(name_components) == 2) { - GetIdentifierValueDef((Value*)list_nth(name_components, 0), context); + GetIdentifierValueDef(list_nth(name_components, 0), context); appendStringInfoString(buf, "."); - GetIdentifierValueDef((Value*)list_nth(name_components, 1), context); + GetIdentifierValueDef(list_nth(name_components, 1), context); return; } - GetIdentifierValueDef((Value*)linitial(name_components), context); + GetIdentifierValueDef(linitial(name_components), context); } void GetAlterTableCmdDropColumn(AlterTableCmd* cmd, deparse_context* context) { diff --git a/third_party/spanner_pg/shims/catalog_shim_parse_node.c b/third_party/spanner_pg/shims/catalog_shim_parse_node.c index 2e2ca48c..dd717e62 100644 --- a/third_party/spanner_pg/shims/catalog_shim_parse_node.c +++ b/third_party/spanner_pg/shims/catalog_shim_parse_node.c @@ -94,7 +94,7 @@ void free_parsestate(ParseState* pstate) { /* * make_const * - * Convert a Value node (as returned by the grammar) to a Const node + * Convert a A_Const value (as returned by the grammar) to a Const node * of the "natural" type for the constant. Note that this routine is * only used when there is no explicit cast for the constant, so we * have to guess what type is wanted. @@ -113,20 +113,35 @@ void free_parsestate(ParseState* pstate) { * (never int4) for floats. */ Const * -make_const(ParseState *pstate, Value *value, int location) +make_const(ParseState* pstate, A_Const* aconst) { Const *con; Datum val; int64_t val64; + char *endptr; Oid typeid; int typelen; bool typebyval; ParseCallbackState pcbstate; - switch (nodeTag(value)) + if (aconst->isnull) + { + /* return a null const */ + con = makeConst(UNKNOWNOID, + -1, + InvalidOid, + -2, + (Datum) 0, + true, + false); + con->location = aconst->location; + return con; + } + + switch (nodeTag(&aconst->val)) { case T_Integer: - val = Int64GetDatum(intVal(value)); + val = Int64GetDatum(intVal(&aconst->val)); typeid = INT8OID; typelen = sizeof(int64_t); @@ -135,7 +150,9 @@ make_const(ParseState *pstate, Value *value, int location) case T_Float: /* could be an oversize integer as well as a float ... */ - if (scanint8(strVal(value), true, &val64)) + errno = 0; + val64 = strtoi64(aconst->val.fval.fval, &endptr, 10); + if (errno == 0 && *endptr == '\0') { /* SPANGRES: skip checking if the value fits in an int32_t. */ val = Int64GetDatum(val64); @@ -147,9 +164,9 @@ make_const(ParseState *pstate, Value *value, int location) else { /* arrange to report location if numeric_in() fails */ - setup_parser_errposition_callback(&pcbstate, pstate, location); + setup_parser_errposition_callback(&pcbstate, pstate, aconst->location); val = DirectFunctionCall3(numeric_in, - CStringGetDatum(strVal(value)), + CStringGetDatum(aconst->val.fval.fval), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1)); cancel_parser_errposition_callback(&pcbstate); @@ -160,13 +177,21 @@ make_const(ParseState *pstate, Value *value, int location) } break; + case T_Boolean: + val = BoolGetDatum(boolVal(&aconst->val)); + + typeid = BOOLOID; + typelen = 1; + typebyval = true; + break; + case T_String: /* * We assume here that UNKNOWN's internal representation is the * same as CSTRING */ - val = CStringGetDatum(strVal(value)); + val = CStringGetDatum(strVal(&aconst->val)); typeid = UNKNOWNOID; /* will be coerced later */ typelen = -2; /* cstring-style varwidth type */ @@ -175,9 +200,9 @@ make_const(ParseState *pstate, Value *value, int location) case T_BitString: /* arrange to report location if bit_in() fails */ - setup_parser_errposition_callback(&pcbstate, pstate, location); + setup_parser_errposition_callback(&pcbstate, pstate, aconst->location); val = DirectFunctionCall3(bit_in, - CStringGetDatum(strVal(value)), + CStringGetDatum(aconst->val.bsval.bsval), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1)); cancel_parser_errposition_callback(&pcbstate); @@ -186,20 +211,8 @@ make_const(ParseState *pstate, Value *value, int location) typebyval = false; break; - case T_Null: - /* return a null const */ - con = makeConst(UNKNOWNOID, - -1, - InvalidOid, - -2, - (Datum) 0, - true, - false); - con->location = location; - return con; - default: - elog(ERROR, "unrecognized node type: %d", (int) nodeTag(value)); + elog(ERROR, "unrecognized node type: %d", (int) nodeTag(&aconst->val)); return NULL; /* keep compiler quiet */ } @@ -210,7 +223,7 @@ make_const(ParseState *pstate, Value *value, int location) val, false, typebyval); - con->location = location; + con->location = aconst->location; return con; } diff --git a/third_party/spanner_pg/shims/catalog_shim_parse_relation.c b/third_party/spanner_pg/shims/catalog_shim_parse_relation.c index 678a022f..abedfd4f 100644 --- a/third_party/spanner_pg/shims/catalog_shim_parse_relation.c +++ b/third_party/spanner_pg/shims/catalog_shim_parse_relation.c @@ -190,7 +190,7 @@ expandNSItemVars(ParseState *pstate, ParseNamespaceItem *nsitem, colindex = 0; foreach(lc, nsitem->p_rte->eref->colnames) { - Value *colnameval = (Value *) lfirst(lc); + void *colnameval = (void *) lfirst(lc); const char *colname = strVal(colnameval); ParseNamespaceColumn *nscol = nsitem->p_nscolumns + colindex; diff --git a/third_party/spanner_pg/shims/catalog_shim_test.cc b/third_party/spanner_pg/shims/catalog_shim_test.cc index db3dbf49..4daea8c3 100644 --- a/third_party/spanner_pg/shims/catalog_shim_test.cc +++ b/third_party/spanner_pg/shims/catalog_shim_test.cc @@ -74,8 +74,8 @@ Node* makeTypeCast(Node* arg, TypeName* type_name, int location) { // static helper in gram.y. Node* makeBoolAConst(bool state) { A_Const* n = makeNode(A_Const); - n->val.type = T_String; - n->val.val.str = (state ? pstrdup("t") : pstrdup("f")); + n->val.node.type = T_String; + n->val.sval.sval = (state ? pstrdup("t") : pstrdup("f")); n->location = -1; return makeTypeCast(internal::PostgresCastToNode(n), SystemTypeName(pstrdup("bool")), -1); @@ -1003,6 +1003,7 @@ TEST_F(CatalogShimTestWithMemory, FuncnameGetCandidatesNamespace) { // Spanner catalog function with an explicit catalog. EXPECT_TRUE(FunctionFound("spanner", "pending_commit_timestamp")); EXPECT_TRUE(FunctionFound("spanner", "bit_reverse", /*nargs=*/-1)); + EXPECT_TRUE(FunctionFound("spanner", "farm_fingerprint", /*nargs=*/1)); EXPECT_TRUE(FunctionFound("spanner", "get_internal_sequence_state", /*nargs=*/-1)); @@ -1010,12 +1011,14 @@ TEST_F(CatalogShimTestWithMemory, FuncnameGetCandidatesNamespace) { EXPECT_FALSE( FunctionFound(/*namespace_name=*/nullptr, "pending_commit_timestamp")); EXPECT_FALSE(FunctionFound(/*namespace_name=*/nullptr, "bit_reverse")); + EXPECT_FALSE(FunctionFound(/*namespace_name=*/nullptr, "farm_fingerprint")); EXPECT_FALSE( FunctionFound(/*namespace_name=*/nullptr, "get_internal_sequence_state")); // Incorrect catalog for Spanner function. EXPECT_FALSE(FunctionFound("pg_catalog", "pending_commit_timestamp")); EXPECT_FALSE(FunctionFound("pg_catalog", "bit_reverse")); + EXPECT_FALSE(FunctionFound("pg_catalog", "farm_fingerprint")); EXPECT_FALSE(FunctionFound("pg_catalog", "get_internal_sequence_state")); } @@ -1913,8 +1916,8 @@ TEST_F(CatalogShimTestWithMemory, DeparseFunctionHints) { // static helper in gram.y. Node* makeIntConst(int val) { A_Const* n = makeNode(A_Const); - n->val.type = T_Integer; - n->val.val.ival = val; + n->val.node.type = T_Integer; + n->val.ival.ival = val; n->location = -1; return internal::PostgresCastToNode(n); } @@ -1963,8 +1966,8 @@ TEST_F(HintTransformTest, Boolean) { // static helper in gram.y. Node* makeStringConst(char* string) { A_Const* n = makeNode(A_Const); - n->val.type = T_String; - n->val.val.str = string; + n->val.node.type = T_String; + n->val.sval.sval = string; n->location = -1; return internal::PostgresCastToNode(n); } @@ -2619,8 +2622,8 @@ TEST_F(CatalogShimTestWithMemory, TransformContainerType) { static Node* MakeIntConst(int val, int location) { A_Const* n = makeNode(A_Const); - n->val.type = T_Integer; - n->val.val.ival = val; + n->val.node.type = T_Integer; + n->val.ival.ival = val; n->location = location; return reinterpret_cast(n); diff --git a/third_party/spanner_pg/shims/catalog_shim_tupdesc.c b/third_party/spanner_pg/shims/catalog_shim_tupdesc.c index 7d2a5fe8..feb20f03 100644 --- a/third_party/spanner_pg/shims/catalog_shim_tupdesc.c +++ b/third_party/spanner_pg/shims/catalog_shim_tupdesc.c @@ -130,5 +130,6 @@ TupleDescInitEntry(TupleDesc desc, att->attbyval = typeForm->typbyval; att->attalign = typeForm->typalign; att->attstorage = typeForm->typstorage; + att->attcompression = InvalidCompressionMethod; att->attcollation = typeForm->typcollation; } diff --git a/third_party/spanner_pg/shims/error_shim.cc b/third_party/spanner_pg/shims/error_shim.cc index 299767f2..ca0d2539 100644 --- a/third_party/spanner_pg/shims/error_shim.cc +++ b/third_party/spanner_pg/shims/error_shim.cc @@ -154,26 +154,26 @@ absl::StatusOr CheckedPgRawParser(const char* sql) { } absl::StatusOr CheckedPgParseAnalyze(RawStmt* raw_stmt, const char* sql, - Oid* param_types, int num_params, + const Oid* param_types, + int num_params, QueryEnvironment* query_env) { // Set the stack base here so PostgreSQL stack depth is being checked properly // to avoid overflow. ZETASQL_RET_CHECK(ErrorCheckedPgCall(set_stack_base).ok()); - return ErrorCheckedPgCall(parse_analyze, raw_stmt, sql, param_types, - num_params, query_env); + return ErrorCheckedPgCall(parse_analyze_fixedparams, raw_stmt, sql, + param_types, num_params, query_env); } -absl::StatusOr CheckedPgParseAnalyzeVarparams(RawStmt* raw_stmt, - const char* sql, - Oid** param_types, - int* num_params) { +absl::StatusOr CheckedPgParseAnalyzeVarparams( + RawStmt* raw_stmt, const char* sql, Oid** param_types, int* num_params, + QueryEnvironment* query_env) { // Set the stack base here so PostgreSQL stack depth is being checked properly // to avoid overflow. ZETASQL_RET_CHECK(ErrorCheckedPgCall(set_stack_base).ok()); return ErrorCheckedPgCall(parse_analyze_varparams, raw_stmt, sql, param_types, - num_params); + num_params, query_env); } // Add in a forward declaration of stringToNode because we don't want to @@ -474,14 +474,14 @@ absl::Status CheckedPgGetSortGroupOperators(Oid argtype, bool needLT, gtOpr, isHashable); } -absl::StatusOr CheckedPgMakeVar(Index varno, AttrNumber varattno, +absl::StatusOr CheckedPgMakeVar(int varno, AttrNumber varattno, Oid vartype, int32_t vartypmod, Oid varcollid, Index varlevelsup) { return ErrorCheckedPgCall(makeVar, varno, varattno, vartype, vartypmod, varcollid, varlevelsup); } -absl::StatusOr CheckedPgMakeString(char* input) { +absl::StatusOr CheckedPgMakeString(char* input) { return ErrorCheckedPgCall(makeString, input); } diff --git a/third_party/spanner_pg/shims/error_shim.h b/third_party/spanner_pg/shims/error_shim.h index cb1259e0..b6bdf336 100644 --- a/third_party/spanner_pg/shims/error_shim.h +++ b/third_party/spanner_pg/shims/error_shim.h @@ -51,12 +51,12 @@ absl::StatusOr CheckedPgRawParserFullOutput( const char* sql); absl::StatusOr CheckedPgRawParser(const char* sql); absl::StatusOr CheckedPgParseAnalyze(RawStmt* raw_stmt, const char* sql, - Oid* param_types, int num_params, + const Oid* param_types, + int num_params, QueryEnvironment* query_env); -absl::StatusOr CheckedPgParseAnalyzeVarparams(RawStmt* raw_stmt, - const char* sql, - Oid** param_types, - int* num_params); +absl::StatusOr CheckedPgParseAnalyzeVarparams( + RawStmt* raw_stmt, const char* sql, Oid** param_types, int* num_params, + QueryEnvironment* query_env = NULL); absl::StatusOr CheckedPgStringToNode(const char* data); absl::StatusOr CheckedPgNodeToString(const void* obj); absl::StatusOr CheckedPgPrettyFormatNodeDump(const char* dump); @@ -115,10 +115,10 @@ absl::Status CheckedPgGetSortGroupOperators(Oid argtype, bool needLT, bool needEQ, bool needGT, Oid* ltOpr, Oid* eqOpr, Oid* gtOpr, bool* isHashable); -absl::StatusOr CheckedPgMakeVar(Index varno, AttrNumber varattno, +absl::StatusOr CheckedPgMakeVar(int varno, AttrNumber varattno, Oid vartype, int32_t vartypmod, Oid varcollid, Index varlevelsup); -absl::StatusOr CheckedPgMakeString(char* input); +absl::StatusOr CheckedPgMakeString(char* input); absl::StatusOr CheckedPgMakeAlias(const char* aliasname, List* colnames); absl::StatusOr CheckedPgMakeConst(Oid consttype, int32_t consttypmod, diff --git a/third_party/spanner_pg/shims/error_shim_test.cc b/third_party/spanner_pg/shims/error_shim_test.cc index 9b901a94..acac94c1 100644 --- a/third_party/spanner_pg/shims/error_shim_test.cc +++ b/third_party/spanner_pg/shims/error_shim_test.cc @@ -320,11 +320,11 @@ TEST_F(ErrorShimTest, CheckedPgListDeleteNthCell) { } TEST_F(ErrorShimTest, CheckedPgLinitialNode) { - Value* arg1 = makeString(pstrdup("column1")); - Value* arg2 = makeString(pstrdup("column2")); + String* arg1 = makeString(pstrdup("column1")); + String* arg2 = makeString(pstrdup("column2")); List* test_list = list_make2(arg1, arg2); - ZETASQL_ASSERT_OK_AND_ASSIGN(Value * initial_arg, - CheckedPgLinitialNode(test_list)); + ZETASQL_ASSERT_OK_AND_ASSIGN(String * initial_arg, + CheckedPgLinitialNode(test_list)); EXPECT_EQ(initial_arg, arg1); } diff --git a/third_party/spanner_pg/shims/fake_catalog_shim.c b/third_party/spanner_pg/shims/fake_catalog_shim.c index 5a68c7b1..2b8ec2cb 100644 --- a/third_party/spanner_pg/shims/fake_catalog_shim.c +++ b/third_party/spanner_pg/shims/fake_catalog_shim.c @@ -394,7 +394,7 @@ void get_utility_query_def(Query *query, deparse_context *context) { abort(); } -Const* make_const(ParseState* pstate, Value* value, int location) { +Const* make_const(ParseState* pstate, A_Const* aconst) { abort(); } diff --git a/third_party/spanner_pg/shims/parser_shim.h b/third_party/spanner_pg/shims/parser_shim.h index 813f3d11..4188a8ff 100644 --- a/third_party/spanner_pg/shims/parser_shim.h +++ b/third_party/spanner_pg/shims/parser_shim.h @@ -120,6 +120,7 @@ typedef struct Constraint { GeneratedColStoreOpt stored_kind; /* STORED or VIRTUAL */ /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */ + bool nulls_not_distinct; /* null treatment for UNIQUE constraints */ List *keys; /* String nodes naming referenced key * column(s) */ List *including; /* String nodes naming referenced nonkey @@ -145,6 +146,7 @@ typedef struct Constraint { char fk_matchtype; /* FULL, PARTIAL, SIMPLE */ char fk_upd_action; /* ON UPDATE action */ char fk_del_action; /* ON DELETE action */ + List *fk_del_set_cols; /* ON DELETE SET NULL/DEFAULT (col1, col2) */ List *old_conpfeqop; /* pg_constraint.conpfeqop of my former self */ Oid old_pktable_oid; /* pg_constraint.confrelid of my former * self */ diff --git a/third_party/spanner_pg/shims/serializer_deserializer_test.cc b/third_party/spanner_pg/shims/serializer_deserializer_test.cc index 869cd19a..7e095b83 100644 --- a/third_party/spanner_pg/shims/serializer_deserializer_test.cc +++ b/third_party/spanner_pg/shims/serializer_deserializer_test.cc @@ -138,7 +138,7 @@ MATCHER(CanSerializeAndDeserialize, "") { // where you need a placeholder Node value and you don't care what it is. Node* PlaceHolderNode() { A_Const* a_const = makeNode(A_Const); - a_const->val = *makeString(pstrdup("PlaceHolder Test Node")); + a_const->val.sval = *makeString(pstrdup("PlaceHolder Test Node")); a_const->location = 1; // If C supported inheritance, Node would be a base class for A_Const, @@ -177,8 +177,7 @@ TEST_F(SerializationDeserializationTest, AConstNull) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val.type = T_Null; - a_const->val.val.str = nullptr; + a_const->isnull = true; a_const->location = 4; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -187,7 +186,7 @@ TEST_F(SerializationDeserializationTest, AConstInteger) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeInteger(1); + a_const->val.ival = *makeInteger(1); a_const->location = 3; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -196,7 +195,7 @@ TEST_F(SerializationDeserializationTest, AConstNegativeInteger) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeInteger(-1); + a_const->val.ival = *makeInteger(-1); a_const->location = 5; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -205,7 +204,7 @@ TEST_F(SerializationDeserializationTest, AConstFloat) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeFloat(pstrdup("123.456")); + a_const->val.fval = *makeFloat(pstrdup("123.456")); a_const->location = 6; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -214,7 +213,7 @@ TEST_F(SerializationDeserializationTest, AConstBitString) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeBitString(pstrdup("b1010")); + a_const->val.bsval = *makeBitString(pstrdup("b1010")); a_const->location = 7; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -223,7 +222,7 @@ TEST_F(SerializationDeserializationTest, AConstString) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeString(pstrdup("Hello World")); + a_const->val.sval = *makeString(pstrdup("Hello World")); a_const->location = 8; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -232,7 +231,7 @@ TEST_F(SerializationDeserializationTest, AConstEmptyString) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeString(pstrdup("")); + a_const->val.sval = *makeString(pstrdup("")); a_const->location = 8; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -241,7 +240,7 @@ TEST_F(SerializationDeserializationTest, AConstStringWithSpecialChars) { // 'makeAConst()' and friends are declared static so we can't call them here. // Do something equivalent ourselves. A_Const* a_const = makeNode(A_Const); - a_const->val = *makeString(pstrdup("\n\\n🙂")); + a_const->val.sval = *makeString(pstrdup("\n\\n🙂")); a_const->location = 8; EXPECT_THAT(a_const, CanSerializeAndDeserialize()); } @@ -590,6 +589,7 @@ TEST_F(SerializationDeserializationTest, IndexStmt) { index_stmt->indexOid = 124; index_stmt->oldNode = 125; index_stmt->unique = true; + index_stmt->nulls_not_distinct = true; index_stmt->primary = true; index_stmt->isconstraint = true; index_stmt->deferrable = true; diff --git a/third_party/spanner_pg/src/Makefile.global.in b/third_party/spanner_pg/src/Makefile.global.in index 0df9f13f..eeefc73b 100644 --- a/third_party/spanner_pg/src/Makefile.global.in +++ b/third_party/spanner_pg/src/Makefile.global.in @@ -350,6 +350,8 @@ XGETTEXT = @XGETTEXT@ GZIP = gzip BZIP2 = bzip2 +LZ4 = @LZ4@ +ZSTD = @ZSTD@ DOWNLOAD = wget -O $@ --no-use-server-timestamps #DOWNLOAD = curl -o $@ @@ -362,10 +364,10 @@ DOWNLOAD = wget -O $@ --no-use-server-timestamps # Pick a release from here: . Note # that the most recent release listed there is often a pre-release; # don't pick that one, except for testing. -UNICODE_VERSION = 13.0.0 +UNICODE_VERSION = 14.0.0 # Pick a release from here: -CLDR_VERSION = 39 +CLDR_VERSION = 41 # Tree-wide build support @@ -446,8 +448,9 @@ ifeq ($(enable_tap_tests),yes) ifndef PGXS define prove_installcheck -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +echo "+++ tap install-check in $(subdir) +++" && \ +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)' \ @@ -456,8 +459,9 @@ cd $(srcdir) && \ endef else # PGXS case define prove_installcheck -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +echo "+++ tap install-check in $(subdir) +++" && \ +rm -rf '$(CURDIR)'/tmp_check && \ +$(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ TESTDIR='$(CURDIR)' PATH="$(bindir):$(CURDIR):$$PATH" \ PGPORT='6$(DEF_PGPORT)' \ @@ -467,8 +471,9 @@ endef endif # PGXS define prove_check -rm -rf '$(CURDIR)'/tmp_check -$(MKDIR_P) '$(CURDIR)'/tmp_check +echo "+++ tap check in $(subdir) +++" && \ +rm -rf '$(CURDIR)'/tmp_check && \ +$(MKDIR_P) '$(CURDIR)'/tmp_check && \ cd $(srcdir) && \ TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' \ top_builddir='$(CURDIR)/$(top_builddir)' \ @@ -477,7 +482,7 @@ cd $(srcdir) && \ endef else -prove_installcheck = @echo "TAP tests not enabled" +prove_installcheck = @echo "TAP tests not enabled. Try configuring with --enable-tap-tests" prove_check = $(prove_installcheck) endif @@ -544,6 +549,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 @@ -640,7 +647,6 @@ submake-libpgfeutils: | submake-generated-headers ifneq ($(USE_MODULE_DB),) PL_TESTDB = pl_regression_$(NAME) - # Replace this with $(or ...) if we ever require GNU make 3.81. ifneq ($(MODULE_big),) CONTRIB_TESTDB=contrib_regression_$(MODULE_big) ISOLATION_TESTDB=isolation_regression_$(MODULE_big) @@ -673,6 +679,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 \ @@ -681,12 +688,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 \ @@ -695,6 +704,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)' \ @@ -873,11 +883,11 @@ install-strip: # allows parallel make across directories and lets make -k and -q work # correctly. -# We need the $(eval) function and order-only prerequisites, which are -# available in GNU make 3.80. That also happens to be the version -# where the .VARIABLES variable was introduced, so this is a simple check. -ifndef .VARIABLES -$(error GNU make 3.80 or newer is required. You are using version $(MAKE_VERSION)) +# We need the ability to export target-specific variables, which was +# added in GNU make 3.81. That also happens to be the version +# where the .FEATURES variable was introduced, so this is a simple check. +ifndef .FEATURES +$(error GNU make 3.81 or newer is required. You are using version $(MAKE_VERSION)) endif # This function is only for internal use below. It should be called @@ -885,7 +895,7 @@ endif # given subdirectory. For the tree-wide all/install/check/installcheck cases, # ensure we do our one-time tasks before recursing (see targets above). # Note that to avoid a nasty bug in make 3.80, -# this function has to avoid using any complicated constructs (like +# this function was written to not use any complicated constructs (like # multiple targets on a line) and also not contain any lines that expand # to more than about 200 bytes. This is why we make it apply to just one # subdirectory at a time, rather than to a list of subdirectories. diff --git a/third_party/spanner_pg/src/Makefile.shlib b/third_party/spanner_pg/src/Makefile.shlib index 173bb232..b52d40ce 100644 --- a/third_party/spanner_pg/src/Makefile.shlib +++ b/third_party/spanner_pg/src/Makefile.shlib @@ -391,14 +391,19 @@ endif # PORTNAME == cygwin || PORTNAME == win32 %.pc: $(MAKEFILE_LIST) - echo 'Name: lib$(NAME)' >$@ + echo 'prefix=$(prefix)' >$@ + echo 'exec_prefix=$(patsubst $(prefix),$${prefix},$(exec_prefix))' >>$@ + echo 'libdir=$(patsubst $(exec_prefix)/%,$${exec_prefix}/%,$(libdir))' >>$@ + echo 'includedir=$(patsubst $(prefix)/%,$${prefix}/%,$(includedir))' >>$@ + echo >>$@ + echo 'Name: lib$(NAME)' >>$@ echo 'Description: PostgreSQL lib$(NAME) library' >>$@ echo 'Url: $(PACKAGE_URL)' >>$@ echo 'Version: $(VERSION)' >>$@ echo 'Requires: ' >>$@ echo 'Requires.private: $(PKG_CONFIG_REQUIRES_PRIVATE)' >>$@ - echo 'Cflags: -I$(includedir)' >>$@ - echo 'Libs: -L$(libdir) -l$(NAME)' >>$@ + echo 'Cflags: -I$${includedir}' >>$@ + echo 'Libs: -L$${libdir} -l$(NAME)' >>$@ # Record -L flags that the user might have passed in to the PostgreSQL # build to locate third-party libraries (e.g., ldap, ssl). Filter out # those that point inside the build or source tree. Use sort to diff --git a/third_party/spanner_pg/src/backend/Makefile b/third_party/spanner_pg/src/backend/Makefile index 0da848b1..0231841a 100644 --- a/third_party/spanner_pg/src/backend/Makefile +++ b/third_party/spanner_pg/src/backend/Makefile @@ -2,7 +2,7 @@ # # Makefile for the postgres backend # -# 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 # # src/backend/Makefile @@ -17,7 +17,8 @@ subdir = src/backend top_builddir = ../.. include $(top_builddir)/src/Makefile.global -SUBDIRS = access bootstrap catalog parser commands executor foreign lib libpq \ +SUBDIRS = access backup bootstrap catalog parser commands executor \ + foreign lib libpq \ main nodes optimizer partitioning port postmaster \ regex replication rewrite \ statistics storage tcop tsearch utils $(top_builddir)/src/timezone \ @@ -48,7 +49,7 @@ OBJS = \ LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) $(LDAP_LIBS_BE) $(ICU_LIBS) # The backend doesn't need everything that's in LIBS, however -LIBS := $(filter-out -lz -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS)) +LIBS := $(filter-out -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS)) ifeq ($(with_systemd),yes) LIBS += -lsystemd diff --git a/third_party/spanner_pg/src/backend/access/brin/brin.c b/third_party/spanner_pg/src/backend/access/brin/brin.c index 8c6ee96c..a38ff1b4 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin.c @@ -4,7 +4,7 @@ * * See src/backend/access/brin/README for details. * - * 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 * * IDENTIFICATION @@ -1037,13 +1037,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; /* @@ -1147,13 +1144,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; /* @@ -1327,8 +1321,6 @@ initialize_brin_buildstate(Relation idxRel, BrinRevmap *revmap, state->bs_bdesc = brin_build_desc(idxRel); state->bs_dtuple = brin_new_memtuple(state->bs_bdesc); - brin_memtuple_initialize(state->bs_dtuple, state->bs_bdesc); - return state; } diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_bloom.c b/third_party/spanner_pg/src/backend/access/brin/brin_bloom.c index 21b8dfa1..73888c96 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_bloom.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_bloom.c @@ -2,7 +2,7 @@ * brin_bloom.c * Implementation of Bloom opclass for BRIN * - * 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 * * @@ -49,7 +49,7 @@ * We use a scheme requiring only two functions described in this paper: * * Less Hashing, Same Performance:Building a Better Bloom Filter - * Adam Kirsch, Michael Mitzenmacher†, Harvard School of Engineering and + * Adam Kirsch, Michael Mitzenmacher, Harvard School of Engineering and * Applied Sciences, Cambridge, Massachusetts [DOI 10.1002/rsa.20208] * * The two hash functions h1 and h2 are calculated using hard-coded seeds, @@ -259,7 +259,6 @@ typedef struct BloomFilter /* data of the bloom filter */ char data[FLEXIBLE_ARRAY_MEMBER]; - } BloomFilter; @@ -282,8 +281,7 @@ bloom_init(int ndistinct, double false_positive_rate) double k; /* number of hash functions */ Assert(ndistinct > 0); - Assert((false_positive_rate >= BLOOM_MIN_FALSE_POSITIVE_RATE) && - (false_positive_rate < BLOOM_MAX_FALSE_POSITIVE_RATE)); + Assert(false_positive_rate > 0 && false_positive_rate < 1); /* sizing bloom filter: -(n * ln(p)) / (ln(2))^2 */ nbits = ceil(-(ndistinct * log(false_positive_rate)) / pow(log(2.0), 2)); diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_inclusion.c b/third_party/spanner_pg/src/backend/access/brin/brin_inclusion.c index 7138bde5..cf71141c 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_inclusion.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_inclusion.c @@ -16,7 +16,7 @@ * writing is the INET type, where IPv6 values cannot be merged with IPv4 * values. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_minmax.c b/third_party/spanner_pg/src/backend/access/brin/brin_minmax.c index bd15b103..3ec7998c 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_minmax.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_minmax.c @@ -2,7 +2,7 @@ * brin_minmax.c * Implementation of Min/Max opclass for BRIN * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_minmax_multi.c b/third_party/spanner_pg/src/backend/access/brin/brin_minmax_multi.c index c924f480..3aa931a6 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_minmax_multi.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_minmax_multi.c @@ -2,7 +2,7 @@ * brin_minmax_multi.c * Implementation of Multi Min/Max opclass for BRIN * - * 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 * * @@ -204,7 +204,7 @@ typedef struct Ranges * with basic metadata, followed by the boundary values. It has a varlena * header, so can be treated as varlena directly. * - * See range_serialize/range_deserialize for serialization details. + * See brin_range_serialize/brin_range_deserialize for serialization details. */ typedef struct SerializedRanges { @@ -223,9 +223,9 @@ typedef struct SerializedRanges char data[FLEXIBLE_ARRAY_MEMBER]; } SerializedRanges; -static SerializedRanges *range_serialize(Ranges *range); +static SerializedRanges *brin_range_serialize(Ranges *range); -static Ranges *range_deserialize(int maxvalues, SerializedRanges *range); +static Ranges *brin_range_deserialize(int maxvalues, SerializedRanges *range); /* @@ -316,7 +316,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); @@ -569,14 +569,14 @@ range_deduplicate_values(Ranges *range) /* - * range_serialize + * brin_range_serialize * Serialize the in-memory representation into a compact varlena value. * * Simply copy the header and then also the individual values, as stored * in the in-memory value array. */ static SerializedRanges * -range_serialize(Ranges *range) +brin_range_serialize(Ranges *range) { Size len; int nvalues; @@ -715,14 +715,14 @@ range_serialize(Ranges *range) } /* - * range_deserialize + * brin_range_deserialize * Serialize the in-memory representation into a compact varlena value. * * Simply copy the header and then also the individual values, as stored * in the in-memory value array. */ static Ranges * -range_deserialize(int maxvalues, SerializedRanges *serialized) +brin_range_deserialize(int maxvalues, SerializedRanges *serialized) { int i, nvalues; @@ -2389,7 +2389,7 @@ brin_minmax_multi_serialize(BrinDesc *bdesc, Datum src, Datum *dst) /* At this point everything has to be fully sorted. */ Assert(ranges->nsorted == ranges->nvalues); - s = range_serialize(ranges); + s = brin_range_serialize(ranges); dst[0] = PointerGetDatum(s); } @@ -2512,7 +2512,7 @@ brin_minmax_multi_add_value(PG_FUNCTION_ARGS) maxvalues = Max(maxvalues, MINMAX_BUFFER_MIN); maxvalues = Min(maxvalues, MINMAX_BUFFER_MAX); - ranges = range_deserialize(maxvalues, serialized); + ranges = brin_range_deserialize(maxvalues, serialized); ranges->attno = attno; ranges->colloid = colloid; @@ -2565,7 +2565,7 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) attno = column->bv_attno; serialized = (SerializedRanges *) PG_DETOAST_DATUM(column->bv_values[0]); - ranges = range_deserialize(serialized->maxvalues, serialized); + ranges = brin_range_deserialize(serialized->maxvalues, serialized); /* inspect the ranges, and for each one evaluate the scan keys */ for (rangeno = 0; rangeno < ranges->nranges; rangeno++) @@ -2760,8 +2760,8 @@ brin_minmax_multi_union(PG_FUNCTION_ARGS) serialized_a = (SerializedRanges *) PG_DETOAST_DATUM(col_a->bv_values[0]); serialized_b = (SerializedRanges *) PG_DETOAST_DATUM(col_b->bv_values[0]); - ranges_a = range_deserialize(serialized_a->maxvalues, serialized_a); - ranges_b = range_deserialize(serialized_b->maxvalues, serialized_b); + ranges_a = brin_range_deserialize(serialized_a->maxvalues, serialized_a); + ranges_b = brin_range_deserialize(serialized_b->maxvalues, serialized_b); /* make sure neither of the ranges is NULL */ Assert(ranges_a && ranges_b); @@ -2843,7 +2843,7 @@ brin_minmax_multi_union(PG_FUNCTION_ARGS) /* cleanup and update the serialized value */ pfree(serialized_a); - col_a->bv_values[0] = PointerGetDatum(range_serialize(ranges_a)); + col_a->bv_values[0] = PointerGetDatum(brin_range_serialize(ranges_a)); PG_RETURN_VOID(); } @@ -3025,9 +3025,9 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) fmgr_info(outfunc, &fmgrinfo); /* deserialize the range info easy-to-process pieces */ - ranges_deserialized = range_deserialize(ranges->maxvalues, ranges); + ranges_deserialized = brin_range_deserialize(ranges->maxvalues, ranges); - appendStringInfo(&str, "nranges: %u nvalues: %u maxvalues: %u", + appendStringInfo(&str, "nranges: %d nvalues: %d maxvalues: %d", ranges_deserialized->nranges, ranges_deserialized->nvalues, ranges_deserialized->maxvalues); diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_pageops.c b/third_party/spanner_pg/src/backend/access/brin/brin_pageops.c index 992b33a8..f17aad51 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_pageops.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_pageops.c @@ -2,7 +2,7 @@ * brin_pageops.c * Page-handling routines for BRIN indexes * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_revmap.c b/third_party/spanner_pg/src/backend/access/brin/brin_revmap.c index c574c8a0..6e392a55 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_revmap.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_revmap.c @@ -12,7 +12,7 @@ * the metapage. When the revmap needs to be expanded, all tuples on the * regular BRIN page at that block (if any) are moved out of the way. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_tuple.c b/third_party/spanner_pg/src/backend/access/brin/brin_tuple.c index ccb28d55..31e50e10 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_tuple.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_tuple.c @@ -23,7 +23,7 @@ * Note the size of the null bitmask may not be the same as that of the * datum array. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_validate.c b/third_party/spanner_pg/src/backend/access/brin/brin_validate.c index 11835d85..c54c874b 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_validate.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_validate.c @@ -3,7 +3,7 @@ * brin_validate.c * Opclass validator for BRIN. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/brin/brin_xlog.c b/third_party/spanner_pg/src/backend/access/brin/brin_xlog.c index 3519038b..af694988 100644 --- a/third_party/spanner_pg/src/backend/access/brin/brin_xlog.c +++ b/third_party/spanner_pg/src/backend/access/brin/brin_xlog.c @@ -2,7 +2,7 @@ * brin_xlog.c * XLog replay routines for BRIN indexes * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/common/attmap.c b/third_party/spanner_pg/src/backend/access/common/attmap.c index 32405f86..896f82a2 100644 --- a/third_party/spanner_pg/src/backend/access/common/attmap.c +++ b/third_party/spanner_pg/src/backend/access/common/attmap.c @@ -10,7 +10,7 @@ * columns in a different order, taking into account dropped columns. * They are also used by the tuple conversion routines in tupconvert.c. * - * 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/third_party/spanner_pg/src/backend/access/common/bufmask.c b/third_party/spanner_pg/src/backend/access/common/bufmask.c index 409acecf..a8f213cf 100644 --- a/third_party/spanner_pg/src/backend/access/common/bufmask.c +++ b/third_party/spanner_pg/src/backend/access/common/bufmask.c @@ -5,7 +5,7 @@ * in a page which can be different when the WAL is generated * and when the WAL is applied. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * Contains common routines required for masking a page. * diff --git a/third_party/spanner_pg/src/backend/access/common/detoast.c b/third_party/spanner_pg/src/backend/access/common/detoast.c index 545a6b88..92c9c658 100644 --- a/third_party/spanner_pg/src/backend/access/common/detoast.c +++ b/third_party/spanner_pg/src/backend/access/common/detoast.c @@ -3,7 +3,7 @@ * detoast.c * Retrieve compressed or external variable size attributes. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/common/detoast.c diff --git a/third_party/spanner_pg/src/backend/access/common/heaptuple.c b/third_party/spanner_pg/src/backend/access/common/heaptuple.c index 9a107f51..c1cbaab9 100644 --- a/third_party/spanner_pg/src/backend/access/common/heaptuple.c +++ b/third_party/spanner_pg/src/backend/access/common/heaptuple.c @@ -45,7 +45,7 @@ * and we'd like to still refer to them via C struct offsets. * * - * 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/third_party/spanner_pg/src/backend/access/common/indextuple.c b/third_party/spanner_pg/src/backend/access/common/indextuple.c index 8df882da..c0bad3cd 100644 --- a/third_party/spanner_pg/src/backend/access/common/indextuple.c +++ b/third_party/spanner_pg/src/backend/access/common/indextuple.c @@ -4,7 +4,7 @@ * This file contains index tuple accessor and mutator routines, * as well as various tuple utilities. * - * 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 * * @@ -33,20 +33,39 @@ * ---------------------------------------------------------------- */ + /* ---------------- + * index_form_tuple + * + * As index_form_tuple_context, but allocates the returned tuple in the + * CurrentMemoryContext. + * ---------------- + */ +IndexTuple +index_form_tuple(TupleDesc tupleDescriptor, + Datum *values, + bool *isnull) +{ + return index_form_tuple_context(tupleDescriptor, values, isnull, + CurrentMemoryContext); +} + /* ---------------- - * index_form_tuple + * index_form_tuple_context * * This shouldn't leak any memory; otherwise, callers such as * tuplesort_putindextuplevalues() will be very unhappy. * * This shouldn't perform external table access provided caller * does not pass values that are stored EXTERNAL. + * + * Allocates returned tuple in provided 'context'. * ---------------- */ IndexTuple -index_form_tuple(TupleDesc tupleDescriptor, - Datum *values, - bool *isnull) +index_form_tuple_context(TupleDesc tupleDescriptor, + Datum *values, + bool *isnull, + MemoryContext context) { char *tp; /* tuple pointer */ IndexTuple tuple; /* return tuple */ @@ -143,7 +162,7 @@ index_form_tuple(TupleDesc tupleDescriptor, size = hoff + data_size; size = MAXALIGN(size); /* be conservative */ - tp = (char *) palloc0(size); + tp = (char *) MemoryContextAllocZero(context, size); tuple = (IndexTuple) tp; heap_fill_tuple(tupleDescriptor, diff --git a/third_party/spanner_pg/src/backend/access/common/printsimple.c b/third_party/spanner_pg/src/backend/access/common/printsimple.c index 93c3c4f6..e99aa279 100644 --- a/third_party/spanner_pg/src/backend/access/common/printsimple.c +++ b/third_party/spanner_pg/src/backend/access/common/printsimple.c @@ -8,7 +8,7 @@ * doesn't handle standalone backends or protocol versions other than * 3.0, because we don't need such handling for current applications. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/common/printtup.c b/third_party/spanner_pg/src/backend/access/common/printtup.c index ab087b02..f605d112 100644 --- a/third_party/spanner_pg/src/backend/access/common/printtup.c +++ b/third_party/spanner_pg/src/backend/access/common/printtup.c @@ -5,7 +5,7 @@ * clients and standalone backends are supported here). * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/common/relation.c b/third_party/spanner_pg/src/backend/access/common/relation.c index 632d13c1..382a42ff 100644 --- a/third_party/spanner_pg/src/backend/access/common/relation.c +++ b/third_party/spanner_pg/src/backend/access/common/relation.c @@ -3,7 +3,7 @@ * relation.c * Generic relation related routines. * - * 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 * * @@ -73,7 +73,7 @@ relation_open(Oid relationId, LOCKMODE lockmode) if (RelationUsesLocalBuffers(r)) MyXactFlags |= XACT_FLAGS_ACCESSEDTEMPNAMESPACE; - pgstat_initstats(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_initstats(r); + pgstat_init_relation(r); return r; } diff --git a/third_party/spanner_pg/src/backend/access/common/reloptions.c b/third_party/spanner_pg/src/backend/access/common/reloptions.c index 39e0cd1f..5b696043 100644 --- a/third_party/spanner_pg/src/backend/access/common/reloptions.c +++ b/third_party/spanner_pg/src/backend/access/common/reloptions.c @@ -3,7 +3,7 @@ * reloptions.c * Core support for relation options (pg_class.reloptions) * - * 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 * * @@ -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", @@ -466,7 +475,7 @@ static relopt_real realRelOpts[] = }; /* values from StdRdOptIndexCleanup */ -relopt_enum_elt_def StdRdOptIndexCleanupValues[] = +static relopt_enum_elt_def StdRdOptIndexCleanupValues[] = { {"auto", STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO}, {"on", STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON}, @@ -481,7 +490,7 @@ relopt_enum_elt_def StdRdOptIndexCleanupValues[] = }; /* values from GistOptBufferingMode */ -relopt_enum_elt_def gistBufferingOptValues[] = +static relopt_enum_elt_def gistBufferingOptValues[] = { {"auto", GIST_OPTION_BUFFERING_AUTO}, {"on", GIST_OPTION_BUFFERING_ON}, @@ -490,7 +499,7 @@ relopt_enum_elt_def gistBufferingOptValues[] = }; /* values from ViewOptCheckOption */ -relopt_enum_elt_def viewCheckOptValues[] = +static relopt_enum_elt_def viewCheckOptValues[] = { /* no value for NOT_SET */ {"local", VIEW_OPTION_CHECK_OPTION_LOCAL}, @@ -1997,6 +2006,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/third_party/spanner_pg/src/backend/access/common/scankey.c b/third_party/spanner_pg/src/backend/access/common/scankey.c index bf33c50d..ff2b608f 100644 --- a/third_party/spanner_pg/src/backend/access/common/scankey.c +++ b/third_party/spanner_pg/src/backend/access/common/scankey.c @@ -3,7 +3,7 @@ * scankey.c * scan key support code * - * 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/third_party/spanner_pg/src/backend/access/common/session.c b/third_party/spanner_pg/src/backend/access/common/session.c index 61b3206b..47da2617 100644 --- a/third_party/spanner_pg/src/backend/access/common/session.c +++ b/third_party/spanner_pg/src/backend/access/common/session.c @@ -12,7 +12,7 @@ * Currently this infrastructure is used to share: * - typemod registry for ephemeral row-types, i.e. BlessTupleDesc etc. * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/backend/access/common/session.c * diff --git a/third_party/spanner_pg/src/backend/access/common/syncscan.c b/third_party/spanner_pg/src/backend/access/common/syncscan.c index b7a28af4..d5b16c5b 100644 --- a/third_party/spanner_pg/src/backend/access/common/syncscan.c +++ b/third_party/spanner_pg/src/backend/access/common/syncscan.c @@ -36,7 +36,7 @@ * ss_report_location - update current scan location * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/common/toast_compression.c b/third_party/spanner_pg/src/backend/access/common/toast_compression.c index 84561834..f90f9f11 100644 --- a/third_party/spanner_pg/src/backend/access/common/toast_compression.c +++ b/third_party/spanner_pg/src/backend/access/common/toast_compression.c @@ -3,7 +3,7 @@ * toast_compression.c * Functions for toast compression. * - * Copyright (c) 2021, PostgreSQL Global Development Group + * Copyright (c) 2021-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/backend/access/common/toast_internals.c b/third_party/spanner_pg/src/backend/access/common/toast_internals.c index 2d2fd605..576e585a 100644 --- a/third_party/spanner_pg/src/backend/access/common/toast_internals.c +++ b/third_party/spanner_pg/src/backend/access/common/toast_internals.c @@ -3,7 +3,7 @@ * toast_internals.c * Functions for internal use by the TOAST system. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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/third_party/spanner_pg/src/backend/access/common/tupconvert.c b/third_party/spanner_pg/src/backend/access/common/tupconvert.c index 64f54393..4010e20c 100644 --- a/third_party/spanner_pg/src/backend/access/common/tupconvert.c +++ b/third_party/spanner_pg/src/backend/access/common/tupconvert.c @@ -7,7 +7,7 @@ * equivalent but might have columns in a different order or different sets of * dropped columns. * - * 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/third_party/spanner_pg/src/backend/access/common/tupdesc.c b/third_party/spanner_pg/src/backend/access/common/tupdesc.c index 81e524af..1ce1bd2a 100644 --- a/third_party/spanner_pg/src/backend/access/common/tupdesc.c +++ b/third_party/spanner_pg/src/backend/access/common/tupdesc.c @@ -3,7 +3,7 @@ * tupdesc.c * POSTGRES tuple descriptor support code * - * 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 * * @@ -632,7 +632,7 @@ TupleDescInitEntry_UNUSED_SPANGRES(TupleDesc desc, att->attisdropped = false; att->attislocal = true; att->attinhcount = 0; - /* attacl, attoptions and attfdwoptions are not present in tupledescs */ + /* variable-length fields are not present in tupledescs */ tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(oidtypeid)); if (!HeapTupleIsValid(tuple)) @@ -693,7 +693,7 @@ TupleDescInitBuiltinEntry(TupleDesc desc, att->attisdropped = false; att->attislocal = true; att->attinhcount = 0; - /* attacl, attoptions and attfdwoptions are not present in tupledescs */ + /* variable-length fields are not present in tupledescs */ att->atttypid = oidtypeid; diff --git a/third_party/spanner_pg/src/backend/access/gin/README b/third_party/spanner_pg/src/backend/access/gin/README index 41d4e1e8..b0807316 100644 --- a/third_party/spanner_pg/src/backend/access/gin/README +++ b/third_party/spanner_pg/src/backend/access/gin/README @@ -396,7 +396,7 @@ leafs. If first stage detects at least one empty page, then at the second stage ginScanToDelete() deletes empty pages. ginScanToDelete() traverses the whole tree in depth-first manner. It starts -from the super-exclusive lock on the tree root. This lock prevents all the +from the full cleanup lock on the tree root. This lock prevents all the concurrent insertions into this tree while we're deleting pages. However, there are still might be some in-progress readers, who traversed root before we locked it. diff --git a/third_party/spanner_pg/src/backend/access/gin/ginarrayproc.c b/third_party/spanner_pg/src/backend/access/gin/ginarrayproc.c index bf73e329..68855965 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginarrayproc.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginarrayproc.c @@ -4,7 +4,7 @@ * support functions for GIN's indexing of any array * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginbtree.c b/third_party/spanner_pg/src/backend/access/gin/ginbtree.c index 482cf108..8520e37e 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginbtree.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginbtree.c @@ -4,7 +4,7 @@ * page utilities routines for the postgres inverted index access method. * * - * 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 * * IDENTIFICATION @@ -28,6 +28,8 @@ static bool ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, Buffer childbuf, GinStatsData *buildStats); static void ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, GinStatsData *buildStats); +static void ginFinishOldSplit(GinBtree btree, GinBtreeStack *stack, + GinStatsData *buildStats, int access); /* * Lock buffer by needed method for search. @@ -109,7 +111,7 @@ ginFindLeafPage(GinBtree btree, bool searchMode, * encounter on the way. */ if (!searchMode && GinPageIsIncompleteSplit(page)) - ginFinishSplit(btree, stack, false, NULL); + ginFinishOldSplit(btree, stack, NULL, access); /* * ok, page is correctly locked, we should check to move right .., @@ -130,7 +132,7 @@ ginFindLeafPage(GinBtree btree, bool searchMode, TestForOldSnapshot(snapshot, btree->index, page); if (!searchMode && GinPageIsIncompleteSplit(page)) - ginFinishSplit(btree, stack, false, NULL); + ginFinishOldSplit(btree, stack, NULL, access); } if (GinPageIsLeaf(page)) /* we found, return locked page */ @@ -166,8 +168,11 @@ ginFindLeafPage(GinBtree btree, bool searchMode, * Step right from current page. * * The next page is locked first, before releasing the current page. This is - * crucial to protect from concurrent page deletion (see comment in - * ginDeletePage). + * crucial to prevent concurrent VACUUM from deleting a page that we are about + * to step to. (The lock-coupling isn't strictly necessary when we are + * traversing the tree to find an insert location, because page deletion grabs + * a cleanup lock on the root to prevent any concurrent inserts. See Page + * deletion section in the README. But there's no harm in doing it always.) */ Buffer ginStepRight(Buffer buffer, Relation index, int lockmode) @@ -264,7 +269,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) ptr->parent = root; ptr->off = InvalidOffsetNumber; - ginFinishSplit(btree, ptr, false, NULL); + ginFinishOldSplit(btree, ptr, NULL, GIN_EXCLUSIVE); } leftmostBlkno = btree->getLeftMostChild(btree, page); @@ -274,7 +279,11 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) blkno = GinPageGetOpaque(page)->rightlink; if (blkno == InvalidBlockNumber) { - UnlockReleaseBuffer(buffer); + /* Link not present in this level */ + LockBuffer(buffer, GIN_UNLOCK); + /* Do not release pin on the root buffer */ + if (buffer != root->buffer) + ReleaseBuffer(buffer); break; } buffer = ginStepRight(buffer, btree->index, GIN_EXCLUSIVE); @@ -289,7 +298,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) ptr->parent = root; ptr->off = InvalidOffsetNumber; - ginFinishSplit(btree, ptr, false, NULL); + ginFinishOldSplit(btree, ptr, NULL, GIN_EXCLUSIVE); } } @@ -527,7 +536,6 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, BufferGetBlockNumber(stack->buffer), BufferGetBlockNumber(rbuffer)); } - } else { @@ -671,15 +679,6 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, bool done; bool first = true; - /* - * freestack == false when we encounter an incompletely split page during - * a scan, while freestack == true is used in the normal scenario that a - * split is finished right after the initial insert. - */ - if (!freestack) - elog(DEBUG1, "finishing incomplete split of block %u in gin index \"%s\"", - stack->blkno, RelationGetRelationName(btree->index)); - /* this loop crawls up the stack until the insertion is complete */ do { @@ -700,7 +699,7 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, * would fail. */ if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) - ginFinishSplit(btree, parent, false, buildStats); + ginFinishOldSplit(btree, parent, buildStats, GIN_EXCLUSIVE); /* move right if it's needed */ page = BufferGetPage(parent->buffer); @@ -724,7 +723,7 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, page = BufferGetPage(parent->buffer); if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) - ginFinishSplit(btree, parent, false, buildStats); + ginFinishOldSplit(btree, parent, buildStats, GIN_EXCLUSIVE); } /* insert the downlink */ @@ -760,6 +759,42 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, freeGinBtreeStack(stack); } +/* + * An entry point to ginFinishSplit() that is used when we stumble upon an + * existing incompletely split page in the tree, as opposed to completing a + * split that we just made outselves. The difference is that stack->buffer may + * be merely share-locked on entry, and will be upgraded to exclusive mode. + * + * Note: Upgrading the lock momentarily releases it. Doing that in a scan + * would not be OK, because a concurrent VACUUM might delete the page while + * we're not holding the lock. It's OK in an insert, though, because VACUUM + * has a different mechanism that prevents it from running concurrently with + * inserts. (Namely, it holds a cleanup lock on the root.) + */ +static void +ginFinishOldSplit(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats, int access) +{ + elog(DEBUG1, "finishing incomplete split of block %u in gin index \"%s\"", + stack->blkno, RelationGetRelationName(btree->index)); + + if (access == GIN_SHARE) + { + LockBuffer(stack->buffer, GIN_UNLOCK); + LockBuffer(stack->buffer, GIN_EXCLUSIVE); + + if (!GinPageIsIncompleteSplit(BufferGetPage(stack->buffer))) + { + /* + * Someone else already completed the split while we were not + * holding the lock. + */ + return; + } + } + + ginFinishSplit(btree, stack, false, buildStats); +} + /* * Insert a value to tree described by stack. * @@ -780,7 +815,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, /* If the leaf page was incompletely split, finish the split first */ if (GinPageIsIncompleteSplit(BufferGetPage(stack->buffer))) - ginFinishSplit(btree, stack, false, buildStats); + ginFinishOldSplit(btree, stack, buildStats, GIN_EXCLUSIVE); done = ginPlaceToPage(btree, stack, insertdata, InvalidBlockNumber, diff --git a/third_party/spanner_pg/src/backend/access/gin/ginbulk.c b/third_party/spanner_pg/src/backend/access/gin/ginbulk.c index 4c5067cc..0d0da446 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginbulk.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginbulk.c @@ -4,7 +4,7 @@ * routines for fast build of inverted index * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/gindatapage.c b/third_party/spanner_pg/src/backend/access/gin/gindatapage.c index 06c05865..7c76d1f9 100644 --- a/third_party/spanner_pg/src/backend/access/gin/gindatapage.c +++ b/third_party/spanner_pg/src/backend/access/gin/gindatapage.c @@ -4,7 +4,7 @@ * routines for handling GIN posting tree pages. * * - * 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 * * IDENTIFICATION @@ -241,7 +241,7 @@ dataIsMoveRight(GinBtree btree, Page page) if (GinPageIsDeleted(page)) return true; - return (ginCompareItemPointers(&btree->itemptr, iptr) > 0) ? true : false; + return (ginCompareItemPointers(&btree->itemptr, iptr) > 0); } /* diff --git a/third_party/spanner_pg/src/backend/access/gin/ginentrypage.c b/third_party/spanner_pg/src/backend/access/gin/ginentrypage.c index 29c36bc0..382f8bb4 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginentrypage.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginentrypage.c @@ -4,7 +4,7 @@ * routines for handling GIN entry tree pages. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginfast.c b/third_party/spanner_pg/src/backend/access/gin/ginfast.c index 36409772..e5074659 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginfast.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginfast.c @@ -7,7 +7,7 @@ * transfer pending entries into the regular index structure. This * wins because bulk insertion is much more efficient than retail. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginget.c b/third_party/spanner_pg/src/backend/access/gin/ginget.c index 02decb0a..00fd6a9f 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginget.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginget.c @@ -4,7 +4,7 @@ * fetch tuples from a GIN scan. * * - * 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 * * IDENTIFICATION @@ -16,6 +16,7 @@ #include "access/gin_private.h" #include "access/relscan.h" +#include "common/pg_prng.h" #include "miscadmin.h" #include "storage/predicate.h" #include "utils/datum.h" @@ -789,7 +790,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, } } -#define gin_rand() (((double) random()) / ((double) MAX_RANDOM_VALUE)) +#define gin_rand() pg_prng_double(&pg_global_prng_state) #define dropItem(e) ( gin_rand() > ((double)GinFuzzySearchLimit)/((double)((e)->predictNumberResult)) ) /* @@ -1320,7 +1321,7 @@ scanGetItem(IndexScanDesc scan, ItemPointerData advancePast, GinScanKey key = so->keys + i; /* - * If we're considering a lossy page, skip excludeOnly keys, They + * If we're considering a lossy page, skip excludeOnly keys. They * can't exclude the whole page anyway. */ if (ItemPointerIsLossyPage(item) && key->excludeOnly) diff --git a/third_party/spanner_pg/src/backend/access/gin/gininsert.c b/third_party/spanner_pg/src/backend/access/gin/gininsert.c index 0e8672c9..ea1c4184 100644 --- a/third_party/spanner_pg/src/backend/access/gin/gininsert.c +++ b/third_party/spanner_pg/src/backend/access/gin/gininsert.c @@ -4,7 +4,7 @@ * insert routines for the postgres inverted index access method. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginlogic.c b/third_party/spanner_pg/src/backend/access/gin/ginlogic.c index 6bf3288f..c38c27fb 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginlogic.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginlogic.c @@ -24,7 +24,7 @@ * is used for.) * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginpostinglist.c b/third_party/spanner_pg/src/backend/access/gin/ginpostinglist.c index 216b2b9a..6b737154 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginpostinglist.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginpostinglist.c @@ -4,7 +4,7 @@ * routines for dealing with posting lists. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginscan.c b/third_party/spanner_pg/src/backend/access/gin/ginscan.c index 55e2d49f..b776d044 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginscan.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginscan.c @@ -4,7 +4,7 @@ * routines to manage scans of inverted index relations * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginutil.c b/third_party/spanner_pg/src/backend/access/gin/ginutil.c index 33d8da76..b7ba6790 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginutil.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginutil.c @@ -4,7 +4,7 @@ * Utility routines for the Postgres inverted index access method. * * - * 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 * * IDENTIFICATION @@ -102,7 +102,7 @@ initGinState(GinState *state, Relation index) MemSet(state, 0, sizeof(GinState)); state->index = index; - state->oneCol = (origTupdesc->natts == 1) ? true : false; + state->oneCol = (origTupdesc->natts == 1); state->origTupdesc = origTupdesc; for (i = 0; i < origTupdesc->natts; i++) diff --git a/third_party/spanner_pg/src/backend/access/gin/ginvacuum.c b/third_party/spanner_pg/src/backend/access/gin/ginvacuum.c index a276eb02..b4fa5f6b 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginvacuum.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginvacuum.c @@ -4,7 +4,7 @@ * delete & vacuum routines for the postgres GIN * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginvalidate.c b/third_party/spanner_pg/src/backend/access/gin/ginvalidate.c index d2510daa..44f2ff20 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginvalidate.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginvalidate.c @@ -3,7 +3,7 @@ * ginvalidate.c * Opclass validator for GIN. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gin/ginxlog.c b/third_party/spanner_pg/src/backend/access/gin/ginxlog.c index 09ce4d6a..87e83666 100644 --- a/third_party/spanner_pg/src/backend/access/gin/ginxlog.c +++ b/third_party/spanner_pg/src/backend/access/gin/ginxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for inverted index. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gist/README b/third_party/spanner_pg/src/backend/access/gist/README index 0ce224e3..8015ff19 100644 --- a/third_party/spanner_pg/src/backend/access/gist/README +++ b/third_party/spanner_pg/src/backend/access/gist/README @@ -26,6 +26,7 @@ The current implementation of GiST supports: * Concurrency * Recovery support via WAL logging * Buffering build algorithm + * Sorted build method The support for concurrency implemented in PostgreSQL was developed based on the paper "Access Methods for Next-Generation Database Systems" by @@ -414,6 +415,21 @@ emptied yet; tuples never move upwards in the tree. The final emptying loops through buffers at a given level until all buffers at that level have been emptied, and then moves down to the next level. +Sorted build method +------------------- + +Sort all input tuples, pack them into GiST leaf pages in the sorted order, +and create downlinks and internal pages as we go. This method builds the index +from the bottom up, similar to how the B-tree index is built. + +The sorted method is used if the operator classes for all columns have a +"sortsupport" defined. Otherwise, we fall back on inserting tuples one by one +with optional buffering. + +Sorting GiST build requires good linearization of the sort opclass. That is not +always the case in multidimensional data. To tackle the anomalies, we buffer +index tuples and apply a picksplit function that can be multidimensional-aware. + Bulk delete algorithm (VACUUM) ------------------------------ diff --git a/third_party/spanner_pg/src/backend/access/gist/gist.c b/third_party/spanner_pg/src/backend/access/gist/gist.c index 3c519f74..9b367b5a 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gist.c +++ b/third_party/spanner_pg/src/backend/access/gist/gist.c @@ -4,7 +4,7 @@ * interface routines for the postgres GiST index access method. * * - * 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 * * IDENTIFICATION @@ -16,6 +16,7 @@ #include "access/gist_private.h" #include "access/gistscan.h" +#include "access/xloginsert.h" #include "catalog/pg_collation.h" #include "commands/vacuum.h" #include "miscadmin.h" diff --git a/third_party/spanner_pg/src/backend/access/gist/gistbuild.c b/third_party/spanner_pg/src/backend/access/gist/gistbuild.c index 69bbeaf0..be9b91be 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistbuild.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistbuild.c @@ -22,7 +22,7 @@ * tuples (unless buffering mode is disabled). * * - * 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 * * IDENTIFICATION @@ -113,16 +113,23 @@ typedef struct Page ready_pages[XLR_MAX_BLOCK_ID]; } GISTBuildState; +#define GIST_SORTED_BUILD_PAGE_NUM 4 + /* * In sorted build, we use a stack of these structs, one for each level, - * to hold an in-memory buffer of the rightmost page at the level. When the - * page fills up, it is written out and a new page is allocated. + * to hold an in-memory buffer of last pages at the level. + * + * Sorting GiST build requires good linearization of the sort opclass. This is + * not always the case in multidimensional data. To tackle the anomalies, we + * buffer index tuples and apply picksplit that can be multidimension-aware. */ -typedef struct GistSortedBuildPageState +typedef struct GistSortedBuildLevelState { - Page page; - struct GistSortedBuildPageState *parent; /* Upper level, if any */ -} GistSortedBuildPageState; + int current_page; + BlockNumber last_blkno; + struct GistSortedBuildLevelState *parent; /* Upper level, if any */ + Page pages[GIST_SORTED_BUILD_PAGE_NUM]; +} GistSortedBuildLevelState; /* prototypes for private functions */ @@ -130,11 +137,11 @@ static void gistSortedBuildCallback(Relation index, ItemPointer tid, Datum *values, bool *isnull, bool tupleIsAlive, void *state); static void gist_indexsortbuild(GISTBuildState *state); -static void gist_indexsortbuild_pagestate_add(GISTBuildState *state, - GistSortedBuildPageState *pagestate, - IndexTuple itup); -static void gist_indexsortbuild_pagestate_flush(GISTBuildState *state, - GistSortedBuildPageState *pagestate); +static void gist_indexsortbuild_levelstate_add(GISTBuildState *state, + GistSortedBuildLevelState *levelstate, + IndexTuple itup); +static void gist_indexsortbuild_levelstate_flush(GISTBuildState *state, + GistSortedBuildLevelState *levelstate); static void gist_indexsortbuild_flush_ready_pages(GISTBuildState *state); static void gistInitBuffering(GISTBuildState *buildstate); @@ -264,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, @@ -396,8 +403,7 @@ static void gist_indexsortbuild(GISTBuildState *state) { IndexTuple itup; - GistSortedBuildPageState *leafstate; - GistSortedBuildPageState *pagestate; + GistSortedBuildLevelState *levelstate; Page page; state->pages_allocated = 0; @@ -414,10 +420,10 @@ gist_indexsortbuild(GISTBuildState *state) state->pages_allocated++; state->pages_written++; - /* Allocate a temporary buffer for the first leaf page. */ - leafstate = palloc(sizeof(GistSortedBuildPageState)); - leafstate->page = page; - leafstate->parent = NULL; + /* Allocate a temporary buffer for the first leaf page batch. */ + levelstate = palloc0(sizeof(GistSortedBuildLevelState)); + levelstate->pages[0] = page; + levelstate->parent = NULL; gistinitpage(page, F_LEAF); /* @@ -425,40 +431,42 @@ gist_indexsortbuild(GISTBuildState *state) */ while ((itup = tuplesort_getindextuple(state->sortstate, true)) != NULL) { - gist_indexsortbuild_pagestate_add(state, leafstate, itup); + gist_indexsortbuild_levelstate_add(state, levelstate, itup); MemoryContextReset(state->giststate->tempCxt); } /* * Write out the partially full non-root pages. * - * Keep in mind that flush can build a new root. + * Keep in mind that flush can build a new root. If number of pages is > 1 + * then new root is required. */ - pagestate = leafstate; - while (pagestate->parent != NULL) + while (levelstate->parent != NULL || levelstate->current_page != 0) { - GistSortedBuildPageState *parent; - - gist_indexsortbuild_pagestate_flush(state, pagestate); - parent = pagestate->parent; - pfree(pagestate->page); - pfree(pagestate); - pagestate = parent; + GistSortedBuildLevelState *parent; + + gist_indexsortbuild_levelstate_flush(state, levelstate); + parent = levelstate->parent; + for (int i = 0; i < GIST_SORTED_BUILD_PAGE_NUM; i++) + if (levelstate->pages[i]) + pfree(levelstate->pages[i]); + pfree(levelstate); + levelstate = parent; } gist_indexsortbuild_flush_ready_pages(state); /* Write out the root */ - PageSetLSN(pagestate->page, GistBuildLSN); - PageSetChecksumInplace(pagestate->page, GIST_ROOT_BLKNO); + PageSetLSN(levelstate->pages[0], GistBuildLSN); + PageSetChecksumInplace(levelstate->pages[0], GIST_ROOT_BLKNO); smgrwrite(RelationGetSmgr(state->indexrel), MAIN_FORKNUM, GIST_ROOT_BLKNO, - pagestate->page, true); + levelstate->pages[0], true); if (RelationNeedsWAL(state->indexrel)) log_newpage(&state->indexrel->rd_node, MAIN_FORKNUM, GIST_ROOT_BLKNO, - pagestate->page, true); + levelstate->pages[0], true); - pfree(pagestate->page); - pfree(pagestate); + pfree(levelstate->pages[0]); + pfree(levelstate); /* * When we WAL-logged index pages, we must nonetheless fsync index files. @@ -474,96 +482,161 @@ gist_indexsortbuild(GISTBuildState *state) } /* - * Add tuple to a page. If the pages is full, write it out and re-initialize + * Add tuple to a page. If the pages are full, write them out and re-initialize * a new page first. */ static void -gist_indexsortbuild_pagestate_add(GISTBuildState *state, - GistSortedBuildPageState *pagestate, - IndexTuple itup) +gist_indexsortbuild_levelstate_add(GISTBuildState *state, + GistSortedBuildLevelState *levelstate, + IndexTuple itup) { Size sizeNeeded; - /* Does the tuple fit? If not, flush */ - sizeNeeded = IndexTupleSize(itup) + sizeof(ItemIdData) + state->freespace; - if (PageGetFreeSpace(pagestate->page) < sizeNeeded) - gist_indexsortbuild_pagestate_flush(state, pagestate); + /* Check if tuple can be added to the current page */ + sizeNeeded = IndexTupleSize(itup) + sizeof(ItemIdData); /* fillfactor ignored */ + if (PageGetFreeSpace(levelstate->pages[levelstate->current_page]) < sizeNeeded) + { + Page newPage; + Page old_page = levelstate->pages[levelstate->current_page]; + uint16 old_page_flags = GistPageGetOpaque(old_page)->flags; - gistfillbuffer(pagestate->page, &itup, 1, InvalidOffsetNumber); + if (levelstate->current_page + 1 == GIST_SORTED_BUILD_PAGE_NUM) + { + gist_indexsortbuild_levelstate_flush(state, levelstate); + } + else + levelstate->current_page++; + + if (levelstate->pages[levelstate->current_page] == NULL) + levelstate->pages[levelstate->current_page] = palloc(BLCKSZ); + + newPage = levelstate->pages[levelstate->current_page]; + gistinitpage(newPage, old_page_flags); + } + + gistfillbuffer(levelstate->pages[levelstate->current_page], &itup, 1, InvalidOffsetNumber); } static void -gist_indexsortbuild_pagestate_flush(GISTBuildState *state, - GistSortedBuildPageState *pagestate) +gist_indexsortbuild_levelstate_flush(GISTBuildState *state, + GistSortedBuildLevelState *levelstate) { - GistSortedBuildPageState *parent; - IndexTuple *itvec; - IndexTuple union_tuple; - int vect_len; - bool isleaf; + GistSortedBuildLevelState *parent; BlockNumber blkno; MemoryContext oldCtx; + IndexTuple union_tuple; + SplitedPageLayout *dist; + IndexTuple *itvec; + int vect_len; + bool isleaf = GistPageIsLeaf(levelstate->pages[0]); - /* check once per page */ CHECK_FOR_INTERRUPTS(); - if (state->ready_num_pages == XLR_MAX_BLOCK_ID) - gist_indexsortbuild_flush_ready_pages(state); + oldCtx = MemoryContextSwitchTo(state->giststate->tempCxt); - /* - * The page is now complete. Assign a block number to it, and add it to - * the list of finished pages. (We don't write it out immediately, because - * we want to WAL-log the pages in batches.) - */ - blkno = state->pages_allocated++; - state->ready_blknos[state->ready_num_pages] = blkno; - state->ready_pages[state->ready_num_pages] = pagestate->page; - state->ready_num_pages++; + /* Get index tuples from first page */ + itvec = gistextractpage(levelstate->pages[0], &vect_len); + if (levelstate->current_page > 0) + { + /* Append tuples from each page */ + for (int i = 1; i < levelstate->current_page + 1; i++) + { + int len_local; + IndexTuple *itvec_local = gistextractpage(levelstate->pages[i], &len_local); - isleaf = GistPageIsLeaf(pagestate->page); + itvec = gistjoinvector(itvec, &vect_len, itvec_local, len_local); + pfree(itvec_local); + } + + /* Apply picksplit to list of all collected tuples */ + dist = gistSplit(state->indexrel, levelstate->pages[0], itvec, vect_len, state->giststate); + } + else + { + /* Create splitted layout from single page */ + dist = (SplitedPageLayout *) palloc0(sizeof(SplitedPageLayout)); + union_tuple = gistunion(state->indexrel, itvec, vect_len, + state->giststate); + dist->itup = union_tuple; + dist->list = gistfillitupvec(itvec, vect_len, &(dist->lenlist)); + dist->block.num = vect_len; + } - /* - * Form a downlink tuple to represent all the tuples on the page. - */ - oldCtx = MemoryContextSwitchTo(state->giststate->tempCxt); - itvec = gistextractpage(pagestate->page, &vect_len); - union_tuple = gistunion(state->indexrel, itvec, vect_len, - state->giststate); - ItemPointerSetBlockNumber(&(union_tuple->t_tid), blkno); MemoryContextSwitchTo(oldCtx); - /* - * Insert the downlink to the parent page. If this was the root, create a - * new page as the parent, which becomes the new root. - */ - parent = pagestate->parent; - if (parent == NULL) + /* Reset page counter */ + levelstate->current_page = 0; + + /* Create pages for all partitions in split result */ + for (; dist != NULL; dist = dist->next) { - parent = palloc(sizeof(GistSortedBuildPageState)); - parent->page = (Page) palloc(BLCKSZ); - parent->parent = NULL; - gistinitpage(parent->page, 0); + char *data; + Page target; - pagestate->parent = parent; - } - gist_indexsortbuild_pagestate_add(state, parent, union_tuple); + /* check once per page */ + CHECK_FOR_INTERRUPTS(); - /* Re-initialize the page buffer for next page on this level. */ - pagestate->page = palloc(BLCKSZ); - gistinitpage(pagestate->page, isleaf ? F_LEAF : 0); + /* Create page and copy data */ + data = (char *) (dist->list); + target = palloc0(BLCKSZ); + gistinitpage(target, isleaf ? F_LEAF : 0); + for (int i = 0; i < dist->block.num; i++) + { + IndexTuple thistup = (IndexTuple) data; - /* - * Set the right link to point to the previous page. This is just for - * debugging purposes: GiST only follows the right link if a page is split - * concurrently to a scan, and that cannot happen during index build. - * - * It's a bit counterintuitive that we set the right link on the new page - * to point to the previous page, and not the other way round. But GiST - * pages are not ordered like B-tree pages are, so as long as the - * right-links form a chain through all the pages in the same level, the - * order doesn't matter. - */ - GistPageGetOpaque(pagestate->page)->rightlink = blkno; + if (PageAddItem(target, (Item) data, IndexTupleSize(thistup), i + FirstOffsetNumber, false, false) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in \"%s\"", RelationGetRelationName(state->indexrel)); + + data += IndexTupleSize(thistup); + } + union_tuple = dist->itup; + + if (state->ready_num_pages == XLR_MAX_BLOCK_ID) + gist_indexsortbuild_flush_ready_pages(state); + + /* + * The page is now complete. Assign a block number to it, and add it + * to the list of finished pages. (We don't write it out immediately, + * because we want to WAL-log the pages in batches.) + */ + blkno = state->pages_allocated++; + state->ready_blknos[state->ready_num_pages] = blkno; + state->ready_pages[state->ready_num_pages] = target; + state->ready_num_pages++; + ItemPointerSetBlockNumber(&(union_tuple->t_tid), blkno); + + /* + * Set the right link to point to the previous page. This is just for + * debugging purposes: GiST only follows the right link if a page is + * split concurrently to a scan, and that cannot happen during index + * build. + * + * It's a bit counterintuitive that we set the right link on the new + * page to point to the previous page, not the other way around. But + * GiST pages are not ordered like B-tree pages are, so as long as the + * right-links form a chain through all the pages at the same level, + * the order doesn't matter. + */ + if (levelstate->last_blkno) + GistPageGetOpaque(target)->rightlink = levelstate->last_blkno; + levelstate->last_blkno = blkno; + + /* + * Insert the downlink to the parent page. If this was the root, + * create a new page as the parent, which becomes the new root. + */ + parent = levelstate->parent; + if (parent == NULL) + { + parent = palloc0(sizeof(GistSortedBuildLevelState)); + parent->pages[0] = (Page) palloc(BLCKSZ); + parent->parent = NULL; + gistinitpage(parent->pages[0], 0); + + levelstate->parent = parent; + } + gist_indexsortbuild_levelstate_add(state, parent, union_tuple); + } } static void diff --git a/third_party/spanner_pg/src/backend/access/gist/gistbuildbuffers.c b/third_party/spanner_pg/src/backend/access/gist/gistbuildbuffers.c index 95cc3348..eabf7460 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistbuildbuffers.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistbuildbuffers.c @@ -4,7 +4,7 @@ * node buffer management functions for GiST buffering build algorithm. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gist/gistget.c b/third_party/spanner_pg/src/backend/access/gist/gistget.c index c8f7e781..adbf622c 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistget.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistget.c @@ -4,7 +4,7 @@ * fetch tuples from a GiST scan. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gist/gistproc.c b/third_party/spanner_pg/src/backend/access/gist/gistproc.c index d474612b..22f2c185 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistproc.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistproc.c @@ -7,7 +7,7 @@ * This gives R-tree behavior, with Guttman's poly-time split algorithm. * * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/backend/access/gist/gistscan.c b/third_party/spanner_pg/src/backend/access/gist/gistscan.c index 668bf2b8..e5994e9a 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistscan.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistscan.c @@ -4,7 +4,7 @@ * routines to manage scans on GiST index relations * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gist/gistsplit.c b/third_party/spanner_pg/src/backend/access/gist/gistsplit.c index 526ed121..c1965a52 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistsplit.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistsplit.c @@ -15,7 +15,7 @@ * gistSplitByKey() is the entry point to this file. * * - * 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 * * IDENTIFICATION @@ -303,9 +303,9 @@ supportSecondarySplit(Relation r, GISTSTATE *giststate, int attno, penalty2 = gistpenalty(giststate, attno, entry1, false, &entrySR, false); if (penalty1 < penalty2) - leaveOnLeft = (sv->spl_ldatum_exists) ? true : false; + leaveOnLeft = sv->spl_ldatum_exists; else - leaveOnLeft = (sv->spl_rdatum_exists) ? true : false; + leaveOnLeft = sv->spl_rdatum_exists; } if (leaveOnLeft == false) @@ -421,8 +421,8 @@ gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVec * Prepare spl_ldatum/spl_rdatum/spl_ldatum_exists/spl_rdatum_exists in * case we are doing a secondary split (see comments in gist.h). */ - sv->spl_ldatum_exists = (v->spl_lisnull[attno]) ? false : true; - sv->spl_rdatum_exists = (v->spl_risnull[attno]) ? false : true; + sv->spl_ldatum_exists = !(v->spl_lisnull[attno]); + sv->spl_rdatum_exists = !(v->spl_risnull[attno]); sv->spl_ldatum = v->spl_lattr[attno]; sv->spl_rdatum = v->spl_rattr[attno]; @@ -451,8 +451,8 @@ gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVec * Reinit GIST_SPLITVEC. Although these fields are not used by * genericPickSplit(), set them up for further processing */ - sv->spl_ldatum_exists = (v->spl_lisnull[attno]) ? false : true; - sv->spl_rdatum_exists = (v->spl_risnull[attno]) ? false : true; + sv->spl_ldatum_exists = !(v->spl_lisnull[attno]); + sv->spl_rdatum_exists = !(v->spl_risnull[attno]); sv->spl_ldatum = v->spl_lattr[attno]; sv->spl_rdatum = v->spl_rattr[attno]; diff --git a/third_party/spanner_pg/src/backend/access/gist/gistutil.c b/third_party/spanner_pg/src/backend/access/gist/gistutil.c index 43ba03b6..d4bf0c75 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistutil.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistutil.c @@ -4,7 +4,7 @@ * utilities routines for the postgres GiST index access method. * * - * 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 * * IDENTIFICATION @@ -19,6 +19,7 @@ #include "access/htup_details.h" #include "access/reloptions.h" #include "catalog/pg_opclass.h" +#include "common/pg_prng.h" #include "storage/indexfsm.h" #include "storage/lmgr.h" #include "utils/float.h" @@ -507,7 +508,7 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ if (keep_current_best == -1) { /* we didn't make the random choice yet for this old best */ - keep_current_best = (random() <= (MAX_RANDOM_VALUE / 2)) ? 1 : 0; + keep_current_best = pg_prng_bool(&pg_global_prng_state) ? 1 : 0; } if (keep_current_best == 0) { @@ -529,7 +530,7 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ if (keep_current_best == -1) { /* we didn't make the random choice yet for this old best */ - keep_current_best = (random() <= (MAX_RANDOM_VALUE / 2)) ? 1 : 0; + keep_current_best = pg_prng_bool(&pg_global_prng_state) ? 1 : 0; } if (keep_current_best == 1) break; diff --git a/third_party/spanner_pg/src/backend/access/gist/gistvacuum.c b/third_party/spanner_pg/src/backend/access/gist/gistvacuum.c index 06631935..f190decd 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistvacuum.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistvacuum.c @@ -4,7 +4,7 @@ * vacuuming routines for the postgres GiST index access method. * * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/backend/access/gist/gistvalidate.c b/third_party/spanner_pg/src/backend/access/gist/gistvalidate.c index 9c65e32c..23a3fffc 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistvalidate.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistvalidate.c @@ -3,7 +3,7 @@ * gistvalidate.c * Opclass validator for GiST. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/gist/gistxlog.c b/third_party/spanner_pg/src/backend/access/gist/gistxlog.c index 76723fa8..c46132e6 100644 --- a/third_party/spanner_pg/src/backend/access/gist/gistxlog.c +++ b/third_party/spanner_pg/src/backend/access/gist/gistxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for GiST. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/hash/README b/third_party/spanner_pg/src/backend/access/hash/README index 2227ebfe..13dc59c1 100644 --- a/third_party/spanner_pg/src/backend/access/hash/README +++ b/third_party/spanner_pg/src/backend/access/hash/README @@ -215,7 +215,7 @@ Pseudocode Algorithms Various flags that are used in hash index operations are described as below: The bucket-being-split and bucket-being-populated flags indicate that split -the operation is in progress for a bucket. During split operation, a +operation is in progress for a bucket. During split operation, a bucket-being-split flag is set on the old bucket and bucket-being-populated flag is set on new bucket. These flags are cleared once the split operation is finished. @@ -570,7 +570,7 @@ consistency after a crash. To provide robustness, we write WAL for each of these operations. CREATE INDEX writes multiple WAL records. First, we write a record to cover -the initializatoin of the metapage, followed by one for each new bucket +the initialization of the metapage, followed by one for each new bucket created, followed by one for the initial bitmap page. It's not important for index creation to appear atomic, because the index isn't yet visible to any other transaction, and the creating transaction will roll back in the event of diff --git a/third_party/spanner_pg/src/backend/access/hash/hash.c b/third_party/spanner_pg/src/backend/access/hash/hash.c index 0752fb38..c361509d 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hash.c +++ b/third_party/spanner_pg/src/backend/access/hash/hash.c @@ -3,7 +3,7 @@ * hash.c * Implementation of Margo Seltzer's Hashing package for postgres. * - * 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 * * @@ -22,6 +22,7 @@ #include "access/hash_xlog.h" #include "access/relscan.h" #include "access/tableam.h" +#include "access/xloginsert.h" #include "catalog/index.h" #include "commands/progress.h" #include "commands/vacuum.h" @@ -513,7 +514,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 @@ -715,7 +716,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); @@ -816,7 +817,7 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, XLogRecPtr recptr; xlrec.clear_dead_marking = clear_dead_marking; - xlrec.is_primary_bucket_page = (buf == bucket_buf) ? true : false; + xlrec.is_primary_bucket_page = (buf == bucket_buf); XLogBeginInsert(); XLogRegisterData((char *) &xlrec, SizeOfHashDelete); @@ -882,7 +883,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/third_party/spanner_pg/src/backend/access/hash/hash_xlog.c b/third_party/spanner_pg/src/backend/access/hash/hash_xlog.c index 6e2f0c39..6fe1c2f7 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hash_xlog.c +++ b/third_party/spanner_pg/src/backend/access/hash/hash_xlog.c @@ -4,7 +4,7 @@ * WAL replay logic for hash index. * * - * 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 * * IDENTIFICATION @@ -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; @@ -464,7 +464,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; @@ -487,7 +487,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; @@ -709,7 +709,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; } @@ -728,11 +728,11 @@ 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; - ovflopaque->hasho_bucket = -1; + ovflopaque->hasho_bucket = InvalidBucket; ovflopaque->hasho_flag = LH_UNUSED_PAGE; ovflopaque->hasho_page_id = HASHO_PAGE_ID; @@ -747,7 +747,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; @@ -765,7 +765,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; @@ -902,7 +902,7 @@ hash_xlog_delete(XLogReaderState *record) { HashPageOpaque pageopaque; - pageopaque = (HashPageOpaque) PageGetSpecialPointer(page); + pageopaque = HashPageGetOpaque(page); pageopaque->hasho_flag &= ~LH_PAGE_HAS_DEAD_TUPLES; } @@ -932,7 +932,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); @@ -1023,7 +1023,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); @@ -1115,7 +1115,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/third_party/spanner_pg/src/backend/access/hash/hashfunc.c b/third_party/spanner_pg/src/backend/access/hash/hashfunc.c index 2c00de50..f890f79e 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashfunc.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashfunc.c @@ -3,7 +3,7 @@ * hashfunc.c * Support functions for hash access method. * - * 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 * * @@ -278,7 +278,7 @@ hashtext(PG_FUNCTION_ARGS) errmsg("could not determine which collation to use for string hashing"), errhint("Use the COLLATE clause to set the collation explicitly."))); - if (!lc_collate_is_c(collid) && collid != DEFAULT_COLLATION_OID) + if (!lc_collate_is_c(collid)) mylocale = pg_newlocale_from_collation(collid); if (!mylocale || mylocale->deterministic) @@ -335,7 +335,7 @@ hashtextextended(PG_FUNCTION_ARGS) errmsg("could not determine which collation to use for string hashing"), errhint("Use the COLLATE clause to set the collation explicitly."))); - if (!lc_collate_is_c(collid) && collid != DEFAULT_COLLATION_OID) + if (!lc_collate_is_c(collid)) mylocale = pg_newlocale_from_collation(collid); if (!mylocale || mylocale->deterministic) diff --git a/third_party/spanner_pg/src/backend/access/hash/hashinsert.c b/third_party/spanner_pg/src/backend/access/hash/hashinsert.c index d254a00b..4f2fecb9 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashinsert.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashinsert.c @@ -3,7 +3,7 @@ * hashinsert.c * Item insertion in hash tables for Postgres. * - * 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 * * @@ -17,6 +17,7 @@ #include "access/hash.h" #include "access/hash_xlog.h" +#include "access/xloginsert.h" #include "miscadmin.h" #include "storage/buf_internals.h" #include "storage/lwlock.h" @@ -94,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; /* @@ -176,13 +177,13 @@ _hash_doinsert(Relation rel, IndexTuple itup, Relation heapRel) LockBuffer(buf, BUFFER_LOCK_UNLOCK); /* chain to a new overflow page */ - buf = _hash_addovflpage(rel, metabuf, buf, (buf == bucket_buf) ? true : false); + buf = _hash_addovflpage(rel, metabuf, buf, (buf == bucket_buf)); page = BufferGetPage(buf); /* 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); } @@ -383,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/third_party/spanner_pg/src/backend/access/hash/hashovfl.c b/third_party/spanner_pg/src/backend/access/hash/hashovfl.c index 1ff2e0c1..e34cfc30 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashovfl.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashovfl.c @@ -3,7 +3,7 @@ * hashovfl.c * Overflow page management code for the Postgres hash access method * - * 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 * * @@ -19,6 +19,7 @@ #include "access/hash.h" #include "access/hash_xlog.h" +#include "access/xloginsert.h" #include "miscadmin.h" #include "utils/rel.h" @@ -158,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)) @@ -363,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; @@ -515,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); @@ -599,11 +600,11 @@ _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; - ovflopaque->hasho_bucket = -1; + ovflopaque->hasho_bucket = InvalidBucket; ovflopaque->hasho_flag = LH_UNUSED_PAGE; ovflopaque->hasho_page_id = HASHO_PAGE_ID; @@ -612,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; @@ -621,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; @@ -750,10 +751,10 @@ _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 = -1; + op->hasho_bucket = InvalidBucket; op->hasho_flag = LH_BITMAP_PAGE; op->hasho_page_id = HASHO_PAGE_ID; @@ -823,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 @@ -854,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)); @@ -953,7 +954,7 @@ _hash_squeezebucket(Relation rel, xl_hash_move_page_contents xlrec; xlrec.ntups = nitups; - xlrec.is_prim_bucket_same_wrt = (wbuf == bucket_buf) ? true : false; + xlrec.is_prim_bucket_same_wrt = (wbuf == bucket_buf); XLogBeginInsert(); XLogRegisterData((char *) &xlrec, SizeOfHashMovePageContents); @@ -1004,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; @@ -1075,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/third_party/spanner_pg/src/backend/access/hash/hashpage.c b/third_party/spanner_pg/src/backend/access/hash/hashpage.c index 14bde24e..9da5fb48 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashpage.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashpage.c @@ -3,7 +3,7 @@ * hashpage.c * Hash table page management code for the Postgres hash access method * - * 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 * * @@ -30,6 +30,7 @@ #include "access/hash.h" #include "access/hash_xlog.h" +#include "access/xloginsert.h" #include "miscadmin.h" #include "port/pg_bitutils.h" #include "storage/lmgr.h" @@ -165,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 @@ -528,10 +529,10 @@ _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 = -1; + pageopaque->hasho_bucket = InvalidBucket; pageopaque->hasho_flag = LH_META_PAGE; pageopaque->hasho_page_id = HASHO_PAGE_ID; @@ -692,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 @@ -867,7 +868,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 @@ -886,7 +887,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; @@ -1013,11 +1014,11 @@ _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; - ovflopaque->hasho_bucket = -1; + ovflopaque->hasho_bucket = InvalidBucket; ovflopaque->hasho_flag = LH_UNUSED_PAGE; ovflopaque->hasho_page_id = HASHO_PAGE_ID; @@ -1094,11 +1095,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, @@ -1199,9 +1200,9 @@ _hash_splitbucket(Relation rel, all_tups_size = 0; /* chain to a new overflow page */ - nbuf = _hash_addovflpage(rel, metabuf, nbuf, (nbuf == bucket_nbuf) ? true : false); + nbuf = _hash_addovflpage(rel, metabuf, nbuf, (nbuf == bucket_nbuf)); npage = BufferGetPage(nbuf); - nopaque = (HashPageOpaque) PageGetSpecialPointer(npage); + nopaque = HashPageGetOpaque(npage); } itups[nitups++] = new_itup; @@ -1254,7 +1255,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); } /* @@ -1267,11 +1268,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(); @@ -1395,7 +1396,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); @@ -1449,7 +1450,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, @@ -1590,7 +1591,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/third_party/spanner_pg/src/backend/access/hash/hashsearch.c b/third_party/spanner_pg/src/backend/access/hash/hashsearch.c index 2ffa28e8..524af274 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashsearch.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashsearch.c @@ -3,7 +3,7 @@ * hashsearch.c * search code for postgres hash tables * - * 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 * * @@ -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/third_party/spanner_pg/src/backend/access/hash/hashsort.c b/third_party/spanner_pg/src/backend/access/hash/hashsort.c index 3ce42483..aa61e39f 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashsort.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashsort.c @@ -14,7 +14,7 @@ * plenty of locality of access. * * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/backend/access/hash/hashutil.c b/third_party/spanner_pg/src/backend/access/hash/hashutil.c index cf666822..4d0d8e49 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashutil.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashutil.c @@ -3,7 +3,7 @@ * hashutil.c * Utility code for Postgres hash implementation. * - * 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 * * @@ -241,7 +241,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, @@ -576,7 +576,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/third_party/spanner_pg/src/backend/access/hash/hashvalidate.c b/third_party/spanner_pg/src/backend/access/hash/hashvalidate.c index ab57e99c..d78574c9 100644 --- a/third_party/spanner_pg/src/backend/access/hash/hashvalidate.c +++ b/third_party/spanner_pg/src/backend/access/hash/hashvalidate.c @@ -3,7 +3,7 @@ * hashvalidate.c * Opclass validator for hash. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/heap/heapam.c b/third_party/spanner_pg/src/backend/access/heap/heapam.c index fd30ce82..30bc88e5 100644 --- a/third_party/spanner_pg/src/backend/access/heap/heapam.c +++ b/third_party/spanner_pg/src/backend/access/heap/heapam.c @@ -3,7 +3,7 @@ * heapam.c * heap access method code * - * 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 * * @@ -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 * ---------------------------------------------------------------- @@ -1516,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) { @@ -1579,10 +1533,11 @@ heap_getnextslot_tidrange(TableScanDesc sscan, ScanDirection direction, * 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 - * and *userbuf is set to InvalidBuffer, but tuple->t_data is left pointing - * to the tuple. (Note that it is unsafe to dereference tuple->t_data in - * this case, but callers might choose to test it for NULL-ness.) + * 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. @@ -1600,26 +1555,8 @@ bool heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tuple, - Buffer *userbuf) -{ - return heap_fetch_extended(relation, snapshot, tuple, userbuf, false); -} - -/* - * heap_fetch_extended - fetch tuple even if it fails snapshot test - * - * If keep_buf is true, then upon finding a tuple that is valid but fails - * the snapshot check, we return the tuple pointer in tuple->t_data and the - * buffer ID in *userbuf, keeping the buffer pin, just as if it had passed - * the snapshot. (The function result is still "false" though.) - * If keep_buf is false then this behaves identically to heap_fetch(). - */ -bool -heap_fetch_extended(Relation relation, - Snapshot snapshot, - HeapTuple tuple, - Buffer *userbuf, - bool keep_buf) + Buffer *userbuf, + bool keep_buf) { ItemPointer tid = &(tuple->t_self); ItemId lp; @@ -1709,6 +1646,7 @@ heap_fetch_extended(Relation relation, { ReleaseBuffer(buffer); *userbuf = InvalidBuffer; + tuple->t_data = NULL; } return false; @@ -2918,13 +2856,7 @@ heap_delete(Relation relation, ItemPointer tid, result = TM_Deleted; } - if (crosscheck != InvalidSnapshot && result == TM_Ok) - { - /* Perform additional check for transaction-snapshot mode RI updates */ - if (!HeapTupleSatisfiesVisibility(&tp, crosscheck, buffer)) - result = TM_Updated; - } - + /* sanity check the result HeapTupleSatisfiesUpdate() and the logic above */ if (result != TM_Ok) { Assert(result == TM_SelfModified || @@ -2934,6 +2866,17 @@ heap_delete(Relation relation, ItemPointer tid, Assert(!(tp.t_data->t_infomask & HEAP_XMAX_INVALID)); Assert(result != TM_Updated || !ItemPointerEquals(&tp.t_self, &tp.t_data->t_ctid)); + } + + if (crosscheck != InvalidSnapshot && result == TM_Ok) + { + /* Perform additional check for transaction-snapshot mode RI updates */ + if (!HeapTupleSatisfiesVisibility(&tp, crosscheck, buffer)) + result = TM_Updated; + } + + if (result != TM_Ok) + { tmfd->ctid = tp.t_data->t_ctid; tmfd->xmax = HeapTupleHeaderGetUpdateXid(tp.t_data); if (result == TM_SelfModified) @@ -3215,7 +3158,6 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, bool have_tuple_lock = false; bool iscombo; bool use_hot_update = false; - bool hot_attrs_checked = false; bool key_intact; bool all_visible_cleared = false; bool all_visible_cleared_new = false; @@ -3265,32 +3207,15 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, key_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_KEY); id_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_IDENTITY_KEY); - + interesting_attrs = NULL; + interesting_attrs = bms_add_members(interesting_attrs, hot_attrs); + interesting_attrs = bms_add_members(interesting_attrs, key_attrs); + interesting_attrs = bms_add_members(interesting_attrs, id_attrs); block = ItemPointerGetBlockNumber(otid); buffer = ReadBuffer(relation, block); page = BufferGetPage(buffer); - interesting_attrs = NULL; - - /* - * If the page is already full, there is hardly any chance of doing a HOT - * update on this page. It might be wasteful effort to look for index - * column updates only to later reject HOT updates for lack of space in - * the same page. So we be conservative and only fetch hot_attrs if the - * page is not already full. Since we are already holding a pin on the - * buffer, there is no chance that the buffer can get cleaned up - * concurrently and even if that was possible, in the worst case we lose a - * chance to do a HOT update. - */ - if (!PageIsFull(page)) - { - interesting_attrs = bms_add_members(interesting_attrs, hot_attrs); - hot_attrs_checked = true; - } - interesting_attrs = bms_add_members(interesting_attrs, key_attrs); - interesting_attrs = bms_add_members(interesting_attrs, id_attrs); - /* * Before locking the buffer, pin the visibility map page if it appears to * be necessary. Since we haven't got the lock yet, someone else might be @@ -3563,16 +3488,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, result = TM_Deleted; } - if (crosscheck != InvalidSnapshot && result == TM_Ok) - { - /* Perform additional check for transaction-snapshot mode RI updates */ - if (!HeapTupleSatisfiesVisibility(&oldtup, crosscheck, buffer)) - { - result = TM_Updated; - Assert(!ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid)); - } - } - + /* Sanity check the result HeapTupleSatisfiesUpdate() and the logic above */ if (result != TM_Ok) { Assert(result == TM_SelfModified || @@ -3582,6 +3498,17 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, Assert(!(oldtup.t_data->t_infomask & HEAP_XMAX_INVALID)); Assert(result != TM_Updated || !ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid)); + } + + if (crosscheck != InvalidSnapshot && result == TM_Ok) + { + /* Perform additional check for transaction-snapshot mode RI updates */ + if (!HeapTupleSatisfiesVisibility(&oldtup, crosscheck, buffer)) + result = TM_Updated; + } + + if (result != TM_Ok) + { tmfd->ctid = oldtup.t_data->t_ctid; tmfd->xmax = HeapTupleHeaderGetUpdateXid(oldtup.t_data); if (result == TM_SelfModified) @@ -3634,9 +3561,9 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, /* * And also prepare an Xmax value for the new copy of the tuple. If there * was no xmax previously, or there was one but all lockers are now gone, - * then use InvalidXid; otherwise, get the xmax from the old tuple. (In - * rare cases that might also be InvalidXid and yet not have the - * HEAP_XMAX_INVALID bit set; that's fine.) + * then use InvalidTransactionId; otherwise, get the xmax from the old + * tuple. (In rare cases that might also be InvalidTransactionId and yet + * not have the HEAP_XMAX_INVALID bit set; that's fine.) */ if ((oldtup.t_data->t_infomask & HEAP_XMAX_INVALID) || HEAP_LOCKED_UPGRADED(oldtup.t_data->t_infomask) || @@ -3912,10 +3839,9 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, /* * Since the new tuple is going into the same page, we might be able * to do a HOT update. Check if any of the index columns have been - * changed. If the page was already full, we may have skipped checking - * for index columns, and also can't do a HOT update. + * changed. */ - if (hot_attrs_checked && !bms_overlap(modified_attrs, hot_attrs)) + if (!bms_overlap(modified_attrs, hot_attrs)) use_hot_update = true; } else @@ -5478,7 +5404,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 @@ -6178,10 +6104,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 @@ -6193,12 +6121,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; @@ -6210,6 +6143,7 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, bool has_lockers; TransactionId update_xid; bool update_committed; + TransactionId temp_xid_out; *flags = 0; @@ -6246,7 +6180,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 { @@ -6273,7 +6207,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 { @@ -6281,6 +6215,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; } @@ -6304,6 +6242,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)) @@ -6311,28 +6250,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++) { @@ -6388,7 +6337,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. @@ -6401,15 +6350,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 { @@ -6417,8 +6371,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; } @@ -6427,11 +6391,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) { @@ -6447,15 +6416,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); @@ -6470,35 +6442,45 @@ 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. * - * 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_p) + xl_heap_freeze_tuple *frz, bool *totally_frozen, + TransactionId *relfrozenxid_out, + MultiXactId *relminmxid_out) { bool changed = false; bool xmax_already_frozen = false; @@ -6517,7 +6499,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)) @@ -6542,6 +6526,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; + } } /* @@ -6551,7 +6541,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); @@ -6559,15 +6549,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 @@ -6586,6 +6589,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 @@ -6602,6 +6618,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)) { @@ -6626,15 +6666,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, @@ -6675,6 +6721,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)) { @@ -6698,8 +6746,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; } @@ -6752,11 +6800,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 @@ -7135,9 +7186,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) @@ -7181,87 +7230,106 @@ heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple) } /* - * heap_tuple_needs_freeze + * heap_tuple_would_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. - * - * 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, Buffer buf) +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; } /* @@ -7348,6 +7416,63 @@ index_delete_prefetch_buffer(Relation rel, } #endif +/* + * Helper function for heap_index_delete_tuples. Checks for index corruption + * involving an invalid TID in index AM caller's index page. + * + * This is an ideal place for these checks. The index AM must hold a buffer + * lock on the index page containing the TIDs we examine here, so we don't + * have to worry about concurrent VACUUMs at all. We can be sure that the + * index is corrupt when htid points directly to an LP_UNUSED item or + * heap-only tuple, which is not the case during standard index scans. + */ +static inline void +index_delete_check_htid(TM_IndexDeleteOp *delstate, + Page page, OffsetNumber maxoff, + ItemPointer htid, TM_IndexStatus *istatus) +{ + OffsetNumber indexpagehoffnum = ItemPointerGetOffsetNumber(htid); + ItemId iid; + + Assert(OffsetNumberIsValid(istatus->idxoffnum)); + + if (unlikely(indexpagehoffnum > maxoff)) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg_internal("heap tid from index tuple (%u,%u) points past end of heap page line pointer array at offset %u of block %u in index \"%s\"", + ItemPointerGetBlockNumber(htid), + indexpagehoffnum, + istatus->idxoffnum, delstate->iblknum, + RelationGetRelationName(delstate->irel)))); + + iid = PageGetItemId(page, indexpagehoffnum); + if (unlikely(!ItemIdIsUsed(iid))) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg_internal("heap tid from index tuple (%u,%u) points to unused heap page item at offset %u of block %u in index \"%s\"", + ItemPointerGetBlockNumber(htid), + indexpagehoffnum, + istatus->idxoffnum, delstate->iblknum, + RelationGetRelationName(delstate->irel)))); + + if (ItemIdHasStorage(iid)) + { + HeapTupleHeader htup; + + Assert(ItemIdIsNormal(iid)); + htup = (HeapTupleHeader) PageGetItem(page, iid); + + if (unlikely(HeapTupleHeaderIsHeapOnly(htup))) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg_internal("heap tid from index tuple (%u,%u) points to heap-only tuple at offset %u of block %u in index \"%s\"", + ItemPointerGetBlockNumber(htid), + indexpagehoffnum, + istatus->idxoffnum, delstate->iblknum, + RelationGetRelationName(delstate->irel)))); + } +} + /* * heapam implementation of tableam's index_delete_tuples interface. * @@ -7542,6 +7667,14 @@ heap_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate) maxoff = PageGetMaxOffsetNumber(page); } + /* + * In passing, detect index corruption involving an index page with a + * TID that points to a location in the heap that couldn't possibly be + * correct. We only do this with actual TIDs from caller's index page + * (not items reached by traversing through a HOT chain). + */ + index_delete_check_htid(delstate, page, maxoff, htid, istatus); + if (istatus->knowndeletable) Assert(!delstate->bottomup && !istatus->promising); else @@ -7579,8 +7712,15 @@ heap_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate) ItemId lp; HeapTupleHeader htup; - /* Some sanity checks */ - if (offnum < FirstOffsetNumber || offnum > maxoff) + /* Sanity check (pure paranoia) */ + if (offnum < FirstOffsetNumber) + break; + + /* + * An offset past the end of page's line pointer array is possible + * when the array was truncated + */ + if (offnum > maxoff) break; lp = PageGetItemId(page, offnum); @@ -8366,7 +8506,6 @@ log_heap_new_cid(Relation relation, HeapTuple tup) { xlrec.cmin = InvalidCommandId; xlrec.cmax = HeapTupleHeaderGetRawCommandId(hdr); - } xlrec.combocid = InvalidCommandId; } @@ -8388,7 +8527,7 @@ log_heap_new_cid(Relation relation, HeapTuple tup) /* * Build a heap tuple representing the configured REPLICA IDENTITY to represent - * the old tuple in a UPDATE or DELETE. + * the old tuple in an UPDATE or DELETE. * * Returns NULL if there's no need to log an identity or if there's no suitable * key defined. @@ -8491,7 +8630,7 @@ ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool key_required, /* * Handles XLOG_HEAP2_PRUNE record type. * - * Acquires a super-exclusive lock. + * Acquires a full cleanup lock. */ static void heap_xlog_prune(XLogReaderState *record) @@ -8577,7 +8716,7 @@ heap_xlog_prune(XLogReaderState *record) /* * Handles XLOG_HEAP2_VACUUM record type. * - * Acquires an exclusive lock only. + * Acquires an ordinary exclusive lock only. */ static void heap_xlog_vacuum(XLogReaderState *record) @@ -9250,7 +9389,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) oldtup.t_len = 0; XLogRecGetBlockTag(record, 0, &rnode, NULL, &newblk); - if (XLogRecGetBlockTag(record, 1, NULL, NULL, &oldblk)) + if (XLogRecGetBlockTagExtended(record, 1, NULL, NULL, &oldblk, NULL)) { /* HOT updates are never done across pages */ Assert(!hot_update); diff --git a/third_party/spanner_pg/src/backend/access/heap/heapam_handler.c b/third_party/spanner_pg/src/backend/access/heap/heapam_handler.c index 97b62f74..21682592 100644 --- a/third_party/spanner_pg/src/backend/access/heap/heapam_handler.c +++ b/third_party/spanner_pg/src/backend/access/heap/heapam_handler.c @@ -3,7 +3,7 @@ * heapam_handler.c * heap table access method code * - * 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 * * @@ -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,8 +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_extended(relation, &SnapshotDirty, tuple, - &buffer, true)) + if (heap_fetch(relation, &SnapshotDirty, tuple, &buffer, true)) { /* * If xmin isn't what we're expecting, the slot must have @@ -592,7 +591,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 @@ -600,7 +599,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) @@ -644,7 +643,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, @@ -725,7 +724,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; @@ -1088,8 +1087,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/third_party/spanner_pg/src/backend/access/heap/heapam_visibility.c b/third_party/spanner_pg/src/backend/access/heap/heapam_visibility.c index 20d82cad..ff0b8a68 100644 --- a/third_party/spanner_pg/src/backend/access/heap/heapam_visibility.c +++ b/third_party/spanner_pg/src/backend/access/heap/heapam_visibility.c @@ -52,7 +52,7 @@ * HeapTupleSatisfiesAny() * all tuples are visible * - * 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 * * IDENTIFICATION @@ -1475,7 +1475,7 @@ HeapTupleIsSurelyDead(HeapTuple htup, GlobalVisState *vistest) * all relevant hint bits were just set moments ago). */ if (!HeapTupleHeaderXminCommitted(tuple)) - return HeapTupleHeaderXminInvalid(tuple) ? true : false; + return HeapTupleHeaderXminInvalid(tuple); /* * If the inserting transaction committed, but any deleting transaction diff --git a/third_party/spanner_pg/src/backend/access/heap/heaptoast.c b/third_party/spanner_pg/src/backend/access/heap/heaptoast.c index 55bbe1d5..1575a81b 100644 --- a/third_party/spanner_pg/src/backend/access/heap/heaptoast.c +++ b/third_party/spanner_pg/src/backend/access/heap/heaptoast.c @@ -4,7 +4,7 @@ * Heap-specific definitions for external and compressed storage * of variable size attributes. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/heap/hio.c b/third_party/spanner_pg/src/backend/access/heap/hio.c index 66f7a523..6e1ff45c 100644 --- a/third_party/spanner_pg/src/backend/access/heap/hio.c +++ b/third_party/spanner_pg/src/backend/access/heap/hio.c @@ -3,7 +3,7 @@ * hio.c * POSTGRES heap access method input/output code. * - * 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 * * @@ -387,7 +387,7 @@ RelationGetBufferForTuple(Relation relation, Size len, * on, as cached in the BulkInsertState or relcache entry. If that * doesn't work, we ask the Free Space Map to locate a suitable page. * Since the FSM's info might be out of date, we have to be prepared to - * loop around and retry multiple times. (To insure this isn't an infinite + * loop around and retry multiple times. (To ensure this isn't an infinite * loop, we must update the FSM with the correct amount of free space on * each page that proves not to be suitable.) If the FSM has no record of * a page with enough free space, we give up and extend the relation. diff --git a/third_party/spanner_pg/src/backend/access/heap/pruneheap.c b/third_party/spanner_pg/src/backend/access/heap/pruneheap.c index f7f8056d..9f43bbe2 100644 --- a/third_party/spanner_pg/src/backend/access/heap/pruneheap.c +++ b/third_party/spanner_pg/src/backend/access/heap/pruneheap.c @@ -3,7 +3,7 @@ * pruneheap.c * heap page pruning and HOT-chain management code * - * 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 * * @@ -19,6 +19,7 @@ #include "access/htup_details.h" #include "access/transam.h" #include "access/xlog.h" +#include "access/xloginsert.h" #include "catalog/catalog.h" #include "miscadmin.h" #include "pgstat.h" @@ -67,9 +68,9 @@ 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 - * -1 to indicate no visibility has been computed, e.g. for LP_DEAD items. + * and efficiency reasons; see comment in heap_page_prune() for 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. */ @@ -88,6 +89,7 @@ static void heap_prune_record_redirect(PruneState *prstate, OffsetNumber offnum, OffsetNumber rdoffnum); static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum); static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum); +static void page_verify_redirects(Page page); /* @@ -201,14 +203,39 @@ heap_page_prune_opt(Relation relation, Buffer buffer) */ if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) { - /* OK to prune */ - (void) heap_page_prune(relation, buffer, vistest, - limited_xmin, limited_ts, - true, NULL); + int ndeleted, + nnewlpdead; + + ndeleted = heap_page_prune(relation, buffer, vistest, limited_xmin, + limited_ts, &nnewlpdead, NULL); + + /* + * Report the number of tuples reclaimed to pgstats. This is + * ndeleted minus the number of newly-LP_DEAD-set items. + * + * We derive the number of dead tuples like this to avoid totally + * forgetting about items that were set to LP_DEAD, since they + * still need to be cleaned up by VACUUM. We only want to count + * heap-only tuples that just became LP_UNUSED in our report, + * which don't. + * + * VACUUM doesn't have to compensate in the same way when it + * tracks ndeleted, since it will set the same LP_DEAD items to + * LP_UNUSED separately. + */ + if (ndeleted > nnewlpdead) + pgstat_update_heap_dead_tuples(relation, + ndeleted - nnewlpdead); } /* And release buffer lock */ LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + + /* + * We avoid reuse of any free space created on the page by unrelated + * UPDATEs/INSERTs by opting to not update the FSM at this point. The + * free space should be reused by UPDATEs to *this* page. + */ } } @@ -216,7 +243,10 @@ 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. + * 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. 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 @@ -224,10 +254,8 @@ heap_page_prune_opt(Relation relation, Buffer buffer) * either have been set by TransactionIdLimitedForOldSnapshots, or * InvalidTransactionId/0 respectively. * - * If report_stats is true then we send the number of reclaimed heap-only - * tuples to pgstats. (This must be false during vacuum, since vacuum will - * send its own new total to pgstats, and we don't want this delta applied - * on top of that.) + * Sets *nnewlpdead for caller, indicating the number of items that were + * newly set LP_DEAD during prune operation. * * off_loc is the offset location required by the caller to use in error * callback. @@ -239,11 +267,12 @@ heap_page_prune(Relation relation, Buffer buffer, GlobalVisState *vistest, TransactionId old_snap_xmin, TimestampTz old_snap_ts, - bool report_stats, + int *nnewlpdead, OffsetNumber *off_loc) { int ndeleted = 0; Page page = BufferGetPage(buffer); + BlockNumber blockno = BufferGetBlockNumber(buffer); OffsetNumber offnum, maxoff; PruneState prstate; @@ -310,7 +339,7 @@ heap_page_prune(Relation relation, Buffer buffer, htup = (HeapTupleHeader) PageGetItem(page, itemid); tup.t_data = htup; tup.t_len = ItemIdGetLength(itemid); - ItemPointerSet(&(tup.t_self), BufferGetBlockNumber(buffer), offnum); + ItemPointerSet(&(tup.t_self), blockno, offnum); /* * Set the offset number so that we can display it along with any @@ -443,29 +472,8 @@ heap_page_prune(Relation relation, Buffer buffer, END_CRIT_SECTION(); - /* - * If requested, report the number of tuples reclaimed to pgstats. This is - * ndeleted minus ndead, because we don't want to count a now-DEAD root - * item as a deletion for this purpose. - */ - if (report_stats && ndeleted > prstate.ndead) - pgstat_update_heap_dead_tuples(relation, ndeleted - prstate.ndead); - - /* - * XXX Should we update the FSM information of this page ? - * - * There are two schools of thought here. We may not want to update FSM - * information so that the page is not used for unrelated UPDATEs/INSERTs - * and any free space in this page will remain available for further - * UPDATEs in *this* page, thus improving chances for doing HOT updates. - * - * But for a large table and where a page does not receive further UPDATEs - * for a long time, we might waste this space by not updating the FSM - * information. The relation may get extended and fragmented further. - * - * One possibility is to leave "fillfactor" worth of space in this page - * and update FSM with the remaining space. - */ + /* Record number of newly-set-LP_DEAD items for caller */ + *nnewlpdead = prstate.ndead; return ndeleted; } @@ -559,6 +567,13 @@ heap_prune_satisfies_vacuum(PruneState *prstate, HeapTuple tup, Buffer buffer) * This is OK because a RECENTLY_DEAD tuple preceding a DEAD tuple is really * DEAD, our visibility test is just too coarse to detect it. * + * In general, pruning must never leave behind a DEAD tuple that still has + * tuple storage. VACUUM isn't prepared to deal with that case. That's why + * VACUUM prunes the same heap page a second time (without dropping its lock + * in the interim) when it sees a newly DEAD tuple that we initially saw as + * in-progress. Retrying pruning like this can only happen when an inserting + * transaction concurrently aborts. + * * The root line pointer is redirected to the tuple immediately after the * latest DEAD tuple. If all tuples in the chain are DEAD, the root line * pointer is marked LP_DEAD. (This includes the case of a DEAD simple @@ -641,8 +656,15 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) bool tupdead, recent_dead; - /* Some sanity checks */ - if (offnum < FirstOffsetNumber || offnum > maxoff) + /* Sanity check (pure paranoia) */ + if (offnum < FirstOffsetNumber) + break; + + /* + * An offset past the end of page's line pointer array is possible + * when the array was truncated (original item must have been unused) + */ + if (offnum > maxoff) break; /* If item is already processed, stop --- it must not be same chain */ @@ -744,9 +766,9 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) /* * Remember the last DEAD tuple seen. We will advance past * RECENTLY_DEAD tuples just in case there's a DEAD one after them; - * but we can't advance past anything else. (XXX is it really worth - * continuing to scan beyond RECENTLY_DEAD? The case where we will - * find another DEAD tuple is a fairly unusual corner case.) + * but we can't advance past anything else. We have to make sure that + * we don't miss any DEAD tuples, since DEAD tuples that still have + * tuple storage after pruning will confuse VACUUM. */ if (tupdead) { @@ -883,7 +905,7 @@ heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum) /* * Perform the actual page changes needed by heap_page_prune. - * It is expected that the caller has a super-exclusive lock on the + * It is expected that the caller has a full cleanup lock on the * buffer. */ void @@ -894,39 +916,119 @@ heap_page_prune_execute(Buffer buffer, { Page page = (Page) BufferGetPage(buffer); OffsetNumber *offnum; - int i; + HeapTupleHeader htup PG_USED_FOR_ASSERTS_ONLY; /* Shouldn't be called unless there's something to do */ Assert(nredirected > 0 || ndead > 0 || nunused > 0); /* Update all redirected line pointers */ offnum = redirected; - for (i = 0; i < nredirected; i++) + for (int i = 0; i < nredirected; i++) { OffsetNumber fromoff = *offnum++; OffsetNumber tooff = *offnum++; ItemId fromlp = PageGetItemId(page, fromoff); + ItemId tolp PG_USED_FOR_ASSERTS_ONLY; + +#ifdef USE_ASSERT_CHECKING + + /* + * Any existing item that we set as an LP_REDIRECT (any 'from' item) + * must be the first item from a HOT chain. If the item has tuple + * storage then it can't be a heap-only tuple. Otherwise we are just + * maintaining an existing LP_REDIRECT from an existing HOT chain that + * has been pruned at least once before now. + */ + if (!ItemIdIsRedirected(fromlp)) + { + Assert(ItemIdHasStorage(fromlp) && ItemIdIsNormal(fromlp)); + + htup = (HeapTupleHeader) PageGetItem(page, fromlp); + Assert(!HeapTupleHeaderIsHeapOnly(htup)); + } + else + { + /* We shouldn't need to redundantly set the redirect */ + Assert(ItemIdGetRedirect(fromlp) != tooff); + } + + /* + * The item that we're about to set as an LP_REDIRECT (the 'from' + * item) will point to an existing item (the 'to' item) that is + * already a heap-only tuple. There can be at most one LP_REDIRECT + * item per HOT chain. + * + * We need to keep around an LP_REDIRECT item (after original + * non-heap-only root tuple gets pruned away) so that it's always + * possible for VACUUM to easily figure out what TID to delete from + * indexes when an entire HOT chain becomes dead. A heap-only tuple + * can never become LP_DEAD; an LP_REDIRECT item or a regular heap + * tuple can. + * + * This check may miss problems, e.g. the target of a redirect could + * be marked as unused subsequently. The page_verify_redirects() check + * below will catch such problems. + */ + tolp = PageGetItemId(page, tooff); + Assert(ItemIdHasStorage(tolp) && ItemIdIsNormal(tolp)); + htup = (HeapTupleHeader) PageGetItem(page, tolp); + Assert(HeapTupleHeaderIsHeapOnly(htup)); +#endif ItemIdSetRedirect(fromlp, tooff); } /* Update all now-dead line pointers */ offnum = nowdead; - for (i = 0; i < ndead; i++) + for (int i = 0; i < ndead; i++) { OffsetNumber off = *offnum++; ItemId lp = PageGetItemId(page, off); +#ifdef USE_ASSERT_CHECKING + + /* + * An LP_DEAD line pointer must be left behind when the original item + * (which is dead to everybody) could still be referenced by a TID in + * an index. This should never be necessary with any individual + * heap-only tuple item, though. (It's not clear how much of a problem + * that would be, but there is no reason to allow it.) + */ + if (ItemIdHasStorage(lp)) + { + Assert(ItemIdIsNormal(lp)); + htup = (HeapTupleHeader) PageGetItem(page, lp); + Assert(!HeapTupleHeaderIsHeapOnly(htup)); + } + else + { + /* Whole HOT chain becomes dead */ + Assert(ItemIdIsRedirected(lp)); + } +#endif + ItemIdSetDead(lp); } /* Update all now-unused line pointers */ offnum = nowunused; - for (i = 0; i < nunused; i++) + for (int i = 0; i < nunused; i++) { OffsetNumber off = *offnum++; ItemId lp = PageGetItemId(page, off); +#ifdef USE_ASSERT_CHECKING + + /* + * Only heap-only tuples can become LP_UNUSED during pruning. They + * don't need to be left in place as LP_DEAD items until VACUUM gets + * around to doing index vacuuming. + */ + Assert(ItemIdHasStorage(lp) && ItemIdIsNormal(lp)); + htup = (HeapTupleHeader) PageGetItem(page, lp); + Assert(HeapTupleHeaderIsHeapOnly(htup)); +#endif + ItemIdSetUnused(lp); } @@ -935,6 +1037,58 @@ heap_page_prune_execute(Buffer buffer, * whether it has free pointers. */ PageRepairFragmentation(page); + + /* + * Now that the page has been modified, assert that redirect items still + * point to valid targets. + */ + page_verify_redirects(page); +} + + +/* + * If built with assertions, verify that all LP_REDIRECT items point to a + * valid item. + * + * One way that bugs related to HOT pruning show is redirect items pointing to + * removed tuples. It's not trivial to reliably check that marking an item + * unused will not orphan a redirect item during heap_prune_chain() / + * heap_page_prune_execute(), so we additionally check the whole page after + * pruning. Without this check such bugs would typically only cause asserts + * later, potentially well after the corruption has been introduced. + * + * Also check comments in heap_page_prune_execute()'s redirection loop. + */ +static void +page_verify_redirects(Page page) +{ +#ifdef USE_ASSERT_CHECKING + OffsetNumber offnum; + OffsetNumber maxoff; + + maxoff = PageGetMaxOffsetNumber(page); + for (offnum = FirstOffsetNumber; + offnum <= maxoff; + offnum = OffsetNumberNext(offnum)) + { + ItemId itemid = PageGetItemId(page, offnum); + OffsetNumber targoff; + ItemId targitem; + HeapTupleHeader htup; + + if (!ItemIdIsRedirected(itemid)) + continue; + + targoff = ItemIdGetRedirect(itemid); + targitem = PageGetItemId(page, targoff); + + Assert(ItemIdIsUsed(targitem)); + Assert(ItemIdIsNormal(targitem)); + Assert(ItemIdHasStorage(targitem)); + htup = (HeapTupleHeader) PageGetItem(page, targitem); + Assert(HeapTupleHeaderIsHeapOnly(htup)); + } +#endif } @@ -1019,8 +1173,15 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets) */ for (;;) { - /* Sanity check */ - if (nextoffnum < FirstOffsetNumber || nextoffnum > maxoff) + /* Sanity check (pure paranoia) */ + if (offnum < FirstOffsetNumber) + break; + + /* + * An offset past the end of page's line pointer array is possible + * when the array was truncated + */ + if (offnum > maxoff) break; lp = PageGetItemId(page, nextoffnum); diff --git a/third_party/spanner_pg/src/backend/access/heap/rewriteheap.c b/third_party/spanner_pg/src/backend/access/heap/rewriteheap.c index 2c159cf7..2a538267 100644 --- a/third_party/spanner_pg/src/backend/access/heap/rewriteheap.c +++ b/third_party/spanner_pg/src/backend/access/heap/rewriteheap.c @@ -92,7 +92,7 @@ * heap's TOAST table will go through the normal bufmgr. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION @@ -741,7 +741,7 @@ raw_heap_insert(RewriteState state, HeapTuple tup) * * When doing logical decoding - which relies on using cmin/cmax of catalog * tuples, via xl_heap_new_cid records - heap rewrites have to log enough - * information to allow the decoding backend to updates its internal mapping + * information to allow the decoding backend to update its internal mapping * of (relfilenode,ctid) => (cmin, cmax) to be correct for the rewritten heap. * * For that, every time we find a tuple that's been modified in a catalog diff --git a/third_party/spanner_pg/src/backend/access/heap/vacuumlazy.c b/third_party/spanner_pg/src/backend/access/heap/vacuumlazy.c index 8aab6e32..b802ed24 100644 --- a/third_party/spanner_pg/src/backend/access/heap/vacuumlazy.c +++ b/third_party/spanner_pg/src/backend/access/heap/vacuumlazy.c @@ -3,41 +3,25 @@ * vacuumlazy.c * Concurrent ("lazy") vacuuming. * - * - * The major space usage for LAZY VACUUM is storage for the array of dead tuple - * TIDs. We want to ensure we can vacuum even the very largest relations with - * finite memory space usage. To do that, we set upper bounds on the number of - * tuples we will keep track of at once. + * The major space usage for vacuuming is storage for the array of dead TIDs + * that are to be removed from indexes. We want to ensure we can vacuum even + * the very largest relations with finite memory space usage. To do that, we + * set upper bounds on the number of TIDs we can keep track of at once. * * We are willing to use at most maintenance_work_mem (or perhaps - * autovacuum_work_mem) memory space to keep track of dead tuples. We - * initially allocate an array of TIDs of that size, with an upper limit that - * depends on table size (this limit ensures we don't allocate a huge area - * uselessly for vacuuming small tables). If the array threatens to overflow, - * we suspend the heap scan phase and perform a pass of index cleanup and page - * compaction, then resume the heap scan with an empty TID array. - * - * If we're processing a table with no indexes, we can just vacuum each page - * as we go; there's no need to save up multiple tuples to minimize the number - * of index scans performed. So we don't use maintenance_work_mem memory for - * the TID array, just enough to hold as many heap tuples as fit on one page. + * autovacuum_work_mem) memory space to keep track of dead TIDs. We initially + * allocate an array of TIDs of that size, with an upper limit that depends on + * table size (this limit ensures we don't allocate a huge area uselessly for + * vacuuming small tables). If the array threatens to overflow, we must call + * lazy_vacuum to vacuum indexes (and to vacuum the pages that we've pruned). + * This frees up the memory space dedicated to storing dead TIDs. * - * Lazy vacuum supports parallel execution with parallel worker processes. In - * a parallel vacuum, we perform both index vacuum and index cleanup with - * parallel worker processes. Individual indexes are processed by one vacuum - * process. At the beginning of a lazy vacuum (at lazy_scan_heap) we prepare - * the parallel context and initialize the DSM segment that contains shared - * information as well as the memory space for storing dead tuples. When - * starting either index vacuum or index cleanup, we launch parallel worker - * processes. Once all indexes are processed the parallel worker processes - * exit. After that, the leader process re-initializes the parallel context - * so that it can use the same DSM for multiple passes of index vacuum and - * for performing index cleanup. For updating the index statistics, we need - * to update the system table and since updates are not allowed during - * parallel mode we update the index statistics after exiting from the - * parallel mode. + * In practice VACUUM will often complete its initial pass over the target + * heap relation without ever running out of space to store TIDs. This means + * that there only needs to be one call to lazy_vacuum, after the initial pass + * completes. * - * 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 * * @@ -56,11 +40,11 @@ #include "access/heapam_xlog.h" #include "access/htup_details.h" #include "access/multixact.h" -#include "access/parallel.h" #include "access/transam.h" #include "access/visibilitymap.h" #include "access/xact.h" #include "access/xlog.h" +#include "access/xloginsert.h" #include "catalog/index.h" #include "catalog/storage.h" #include "commands/dbcommands.h" @@ -124,13 +108,6 @@ #define VACUUM_FSM_EVERY_PAGES \ ((BlockNumber) (((uint64) 8 * 1024 * 1024 * 1024) / BLCKSZ)) -/* - * Guesstimation of number of dead tuples per page. This is used to - * provide an upper limit to memory allocated when vacuuming small - * tables. - */ -#define LAZY_ALLOC_TUPLES MaxHeapTuplesPerPage - /* * Before we consider skipping a page that's marked as clean in * visibility map, we must've seen at least this many clean pages. @@ -143,22 +120,11 @@ */ #define PREFETCH_SIZE ((BlockNumber) 32) -/* - * DSM keys for parallel vacuum. Unlike other parallel execution code, since - * we don't need to worry about DSM keys conflicting with plan_node_id we can - * use small integers. - */ -#define PARALLEL_VACUUM_KEY_SHARED 1 -#define PARALLEL_VACUUM_KEY_DEAD_TUPLES 2 -#define PARALLEL_VACUUM_KEY_QUERY_TEXT 3 -#define PARALLEL_VACUUM_KEY_BUFFER_USAGE 4 -#define PARALLEL_VACUUM_KEY_WAL_USAGE 5 - /* * Macro to check if we are in a parallel vacuum. If true, we are in the * parallel mode and the DSM segment is initialized. */ -#define ParallelVacuumIsActive(vacrel) ((vacrel)->lps != NULL) +#define ParallelVacuumIsActive(vacrel) ((vacrel)->pvs != NULL) /* Phases of vacuum during which we report error context. */ typedef enum @@ -171,137 +137,6 @@ typedef enum VACUUM_ERRCB_PHASE_TRUNCATE } VacErrPhase; -/* - * LVDeadTuples stores the dead tuple TIDs collected during the heap scan. - * This is allocated in the DSM segment in parallel mode and in local memory - * in non-parallel mode. - */ -typedef struct LVDeadTuples -{ - int max_tuples; /* # slots allocated in array */ - int num_tuples; /* current # of entries */ - /* List of TIDs of tuples we intend to delete */ - /* NB: this list is ordered by TID address */ - ItemPointerData itemptrs[FLEXIBLE_ARRAY_MEMBER]; /* array of - * ItemPointerData */ -} LVDeadTuples; - -/* The dead tuple space consists of LVDeadTuples and dead tuple TIDs */ -#define SizeOfDeadTuples(cnt) \ - add_size(offsetof(LVDeadTuples, itemptrs), \ - mul_size(sizeof(ItemPointerData), cnt)) -#define MAXDEADTUPLES(max_size) \ - (((max_size) - offsetof(LVDeadTuples, itemptrs)) / sizeof(ItemPointerData)) - -/* - * Shared information among parallel workers. So this is allocated in the DSM - * segment. - */ -typedef struct LVShared -{ - /* - * Target table relid and log level. These fields are not modified during - * the lazy vacuum. - */ - Oid relid; - int elevel; - - /* - * An indication for vacuum workers to perform either index vacuum or - * index cleanup. first_time is true only if for_cleanup is true and - * bulk-deletion is not performed yet. - */ - bool for_cleanup; - bool first_time; - - /* - * Fields for both index vacuum and cleanup. - * - * reltuples is the total number of input heap tuples. We set either old - * live tuples in the index vacuum case or the new live tuples in the - * index cleanup case. - * - * estimated_count is true if reltuples is an estimated value. (Note that - * reltuples could be -1 in this case, indicating we have no idea.) - */ - double reltuples; - bool estimated_count; - - /* - * In single process lazy vacuum we could consume more memory during index - * vacuuming or cleanup apart from the memory for heap scanning. In - * parallel vacuum, since individual vacuum workers can consume memory - * equal to maintenance_work_mem, the new maintenance_work_mem for each - * worker is set such that the parallel operation doesn't consume more - * memory than single process lazy vacuum. - */ - int maintenance_work_mem_worker; - - /* - * Shared vacuum cost balance. During parallel vacuum, - * VacuumSharedCostBalance points to this value and it accumulates the - * balance of each parallel vacuum worker. - */ - pg_atomic_uint32 cost_balance; - - /* - * Number of active parallel workers. This is used for computing the - * minimum threshold of the vacuum cost balance before a worker sleeps for - * cost-based delay. - */ - pg_atomic_uint32 active_nworkers; - - /* - * Variables to control parallel vacuum. We have a bitmap to indicate - * which index has stats in shared memory. The set bit in the map - * indicates that the particular index supports a parallel vacuum. - */ - pg_atomic_uint32 idx; /* counter for vacuuming and clean up */ - uint32 offset; /* sizeof header incl. bitmap */ - bits8 bitmap[FLEXIBLE_ARRAY_MEMBER]; /* bit map of NULLs */ - - /* Shared index statistics data follows at end of struct */ -} LVShared; - -#define SizeOfLVShared (offsetof(LVShared, bitmap) + sizeof(bits8)) -#define GetSharedIndStats(s) \ - ((LVSharedIndStats *)((char *)(s) + ((LVShared *)(s))->offset)) -#define IndStatsIsNull(s, i) \ - (!(((LVShared *)(s))->bitmap[(i) >> 3] & (1 << ((i) & 0x07)))) - -/* - * Struct for an index bulk-deletion statistic used for parallel vacuum. This - * is allocated in the DSM segment. - */ -typedef struct LVSharedIndStats -{ - bool updated; /* are the stats updated? */ - IndexBulkDeleteResult istat; -} LVSharedIndStats; - -/* Struct for maintaining a parallel vacuum state. */ -typedef struct LVParallelState -{ - ParallelContext *pcxt; - - /* Shared information among parallel vacuum workers */ - LVShared *lvshared; - - /* Points to buffer usage area in DSM */ - BufferUsage *buffer_usage; - - /* Points to WAL usage area in DSM */ - WalUsage *wal_usage; - - /* - * The number of indexes that support parallel index bulk-deletion and - * parallel index cleanup respectively. - */ - int nindexes_parallel_bulkdel; - int nindexes_parallel_cleanup; - int nindexes_parallel_condcleanup; -} LVParallelState; - typedef struct LVRelState { /* Target heap relation and its indexes */ @@ -309,6 +144,10 @@ typedef struct LVRelState Relation *indrels; int nindexes; + /* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */ + bool aggressive; + /* Use visibility map to skip? (disabled by DISABLE_PAGE_SKIPPING) */ + bool skipwithvm; /* Wraparound failsafe has been triggered? */ bool failsafe_active; /* Consider index vacuuming bypass optimization? */ @@ -319,42 +158,48 @@ typedef struct LVRelState bool do_index_cleanup; bool do_rel_truncate; - /* Buffer access strategy and parallel state */ + /* Buffer access strategy and parallel vacuum state */ BufferAccessStrategy bstrategy; - LVParallelState *lps; + ParallelVacuumState *pvs; - /* Statistics from pg_class when we start out */ - BlockNumber old_rel_pages; /* previous value of pg_class.relpages */ - double old_live_tuples; /* previous value of pg_class.reltuples */ /* rel's initial relfrozenxid and relminmxid */ TransactionId relfrozenxid; 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; + /* Tracks oldest extant XID/MXID for setting relfrozenxid/relminmxid */ + TransactionId NewRelfrozenXid; + MultiXactId NewRelminMxid; + bool skippedallvis; /* Error reporting state */ char *relnamespace; char *relname; - char *indname; + char *indname; /* Current index name */ BlockNumber blkno; /* used only for heap operations */ OffsetNumber offnum; /* used only for heap operations */ VacErrPhase phase; + 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 + * lazy_vacuum_heap_rel, which marks the same LP_DEAD line pointers as + * LP_UNUSED during second heap pass. */ - LVDeadTuples *dead_tuples; /* items to vacuum from indexes */ + VacDeadItems *dead_items; /* TIDs whose index tuples we'll delete */ BlockNumber rel_pages; /* total number of pages */ - BlockNumber scanned_pages; /* number of pages we examined */ - BlockNumber pinskipped_pages; /* # of pages skipped due to a pin */ - BlockNumber frozenskipped_pages; /* # of frozen pages we skipped */ - BlockNumber tupcount_pages; /* pages whose tuples we counted */ - BlockNumber pages_removed; /* pages remove by truncation */ + BlockNumber scanned_pages; /* # pages examined (not 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 */ BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */ /* Statistics output by us, for table */ @@ -365,12 +210,12 @@ typedef struct LVRelState /* Instrumentation counters */ int num_index_scans; + /* Counters that follow are only for scanned_pages */ int64 tuples_deleted; /* # deleted from table */ int64 lpdead_items; /* # deleted from indexes */ - int64 new_dead_tuples; /* new estimated total # of dead items in - * table */ - int64 num_tuples; /* total number of nonremovable tuples */ - int64 live_tuples; /* live tuples (reltuples estimate) */ + int64 live_tuples; /* # live tuples remaining */ + int64 recently_dead_tuples; /* # dead, but not yet removable */ + int64 missed_dead_tuples; /* # removable, but not removed */ } LVRelState; /* @@ -378,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 */ /* @@ -399,37 +244,28 @@ typedef struct LVSavedErrInfo VacErrPhase phase; } LVSavedErrInfo; -/* elevel controls whole VACUUM's verbosity */ -static int elevel = -1; - /* non-export function prototypes */ -static void lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, - bool aggressive); +static void lazy_scan_heap(LVRelState *vacrel); +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); 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, + bool *hastup, bool *recordfreespace); static void lazy_vacuum(LVRelState *vacrel); static bool lazy_vacuum_all_indexes(LVRelState *vacrel); static void lazy_vacuum_heap_rel(LVRelState *vacrel); static int lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, - Buffer buffer, int tupindex, Buffer *vmbuffer); -static bool lazy_check_needs_freeze(Buffer buf, bool *hastup, - LVRelState *vacrel); + Buffer buffer, int index, Buffer *vmbuffer); static bool lazy_check_wraparound_failsafe(LVRelState *vacrel); -static void do_parallel_lazy_vacuum_all_indexes(LVRelState *vacrel); -static void do_parallel_lazy_cleanup_all_indexes(LVRelState *vacrel); -static void do_parallel_vacuum_or_cleanup(LVRelState *vacrel, int nworkers); -static void do_parallel_processing(LVRelState *vacrel, - LVShared *lvshared); -static void do_serial_processing_for_unsafe_indexes(LVRelState *vacrel, - LVShared *lvshared); -static IndexBulkDeleteResult *parallel_process_one_index(Relation indrel, - IndexBulkDeleteResult *istat, - LVShared *lvshared, - LVSharedIndStats *shared_indstats, - LVRelState *vacrel); static void lazy_cleanup_all_indexes(LVRelState *vacrel); static IndexBulkDeleteResult *lazy_vacuum_one_index(Relation indrel, IndexBulkDeleteResult *istat, @@ -444,24 +280,11 @@ static bool should_attempt_truncation(LVRelState *vacrel); static void lazy_truncate_heap(LVRelState *vacrel); static BlockNumber count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected); -static long compute_max_dead_tuples(BlockNumber relblocks, bool hasindex); -static void lazy_space_alloc(LVRelState *vacrel, int nworkers, - BlockNumber relblocks); -static void lazy_space_free(LVRelState *vacrel); -static bool lazy_tid_reaped(ItemPointer itemptr, void *state); -static int vac_cmp_itemptr(const void *left, const void *right); +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 int compute_parallel_vacuum_workers(LVRelState *vacrel, - int nrequested, - bool *will_parallel_vacuum); -static void update_index_statistics(LVRelState *vacrel); -static LVParallelState *begin_parallel_vacuum(LVRelState *vacrel, - BlockNumber nblocks, - int nrequested); -static void end_parallel_vacuum(LVRelState *vacrel); -static LVSharedIndStats *parallel_stats_for_idx(LVShared *lvshared, int getidx); -static bool parallel_processing_is_safe(Relation indrel, LVShared *lvshared); +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, @@ -474,8 +297,10 @@ static void restore_vacuum_error_info(LVRelState *vacrel, /* * heap_vacuum_rel() -- perform VACUUM for one heap relation * - * This routine vacuums a single heap, cleans out its indexes, and - * updates its relpages and reltuples statistics. + * 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 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. @@ -485,33 +310,34 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, BufferAccessStrategy bstrategy) { LVRelState *vacrel; + bool verbose, + instrument, + aggressive, + skipwithvm, + frozenxid_updated, + minmulti_updated; + TransactionId OldestXmin, + FreezeLimit; + MultiXactId OldestMxact, + 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; /* should we scan all unfrozen pages? */ - bool scanned_all_unfrozen; /* actually scanned all such pages? */ - char **indnames = NULL; - TransactionId xidFullScanLimit; - MultiXactId mxactFullScanLimit; - BlockNumber new_rel_pages; - BlockNumber new_rel_allvisible; - double new_live_tuples; - TransactionId new_frozen_xid; - MultiXactId new_min_multi; + PgStat_Counter startreadtime = 0, + startwritetime = 0; + WalUsage startwalusage = pgWalUsage; + int64 StartPageHit = VacuumPageHit, + StartPageMiss = VacuumPageMiss, + StartPageDirty = VacuumPageDirty; ErrorContextCallback errcallback; - PgStat_Counter startreadtime = 0; - PgStat_Counter startwritetime = 0; - TransactionId OldestXmin; - TransactionId FreezeLimit; - MultiXactId MultiXactCutoff; + char **indnames = NULL; - /* measure elapsed time iff autovacuum logging requires it */ - if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0) + verbose = (params->options & VACOPT_VERBOSE) != 0; + instrument = (verbose || (IsAutoVacuumWorkerProcess() && + params->log_min_duration >= 0)); + if (instrument) { pg_rusage_init(&ru0); starttime = GetCurrentTimestamp(); @@ -522,43 +348,83 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, } } - if (params->options & VACOPT_VERBOSE) - elevel = INFO; - else - elevel = DEBUG2; - pgstat_progress_start_command(PROGRESS_COMMAND_VACUUM, RelationGetRelid(rel)); - 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, &xidFullScanLimit, - &MultiXactCutoff, &mxactFullScanLimit); - /* - * We request an aggressive scan if the table's frozen Xid is now older - * than or equal to the requested Xid full-table scan limit; or if the - * table's minimum MultiXactId is older than or equal to the requested - * mxid full-table scan limit; or if DISABLE_PAGE_SKIPPING was specified. + * 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 lazy_scan_heap cannot leave behind unfrozen + * XIDs < FreezeLimit (all MXIDs < MultiXactCutoff also need to go away). */ - aggressive = TransactionIdPrecedesOrEquals(rel->rd_rel->relfrozenxid, - xidFullScanLimit); - aggressive |= MultiXactIdPrecedesOrEquals(rel->rd_rel->relminmxid, - mxactFullScanLimit); + 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, &OldestMxact, + &FreezeLimit, &MultiXactCutoff); + + skipwithvm = true; if (params->options & VACOPT_DISABLE_PAGE_SKIPPING) + { + /* + * Force aggressive mode, and disable skipping blocks using the + * visibility map (even those set all-frozen) + */ aggressive = true; + skipwithvm = false; + } + /* + * Setup error traceback support for ereport() first. The idea is to set + * up an error context callback to display additional information on any + * error during a vacuum. During different phases of vacuum, we update + * the state so that the error context callback always display current + * information. + * + * Copy the names of heap rel into local memory for error reporting + * purposes, too. It isn't always safe to assume that we can get the name + * of each rel. It's convenient for code in lazy_scan_heap to always use + * these temp copies. + */ vacrel = (LVRelState *) palloc0(sizeof(LVRelState)); + vacrel->relnamespace = get_namespace_name(RelationGetNamespace(rel)); + vacrel->relname = pstrdup(RelationGetRelationName(rel)); + vacrel->indname = NULL; + vacrel->phase = VACUUM_ERRCB_PHASE_UNKNOWN; + vacrel->verbose = verbose; + errcallback.callback = vacuum_error_callback; + errcallback.arg = vacrel; + errcallback.previous = error_context_stack; + error_context_stack = &errcallback; + if (verbose) + { + Assert(!IsAutoVacuumWorkerProcess()); + if (aggressive) + ereport(INFO, + (errmsg("aggressively vacuuming \"%s.%s.%s\"", + get_database_name(MyDatabaseId), + vacrel->relnamespace, vacrel->relname))); + else + ereport(INFO, + (errmsg("vacuuming \"%s.%s.%s\"", + get_database_name(MyDatabaseId), + vacrel->relnamespace, vacrel->relname))); + } - /* Set up high level stuff about rel */ + /* Set up high level stuff about rel and its indexes */ vacrel->rel = rel; vac_open_indexes(vacrel->rel, RowExclusiveLock, &vacrel->nindexes, &vacrel->indrels); - vacrel->failsafe_active = false; - vacrel->consider_bypass_optimization = true; + if (instrument && vacrel->nindexes > 0) + { + /* Copy index names used by instrumentation (not error reporting) */ + indnames = palloc(sizeof(char *) * vacrel->nindexes); + for (int i = 0; i < vacrel->nindexes; i++) + indnames[i] = pstrdup(RelationGetRelationName(vacrel->indrels[i])); + } /* * The index_cleanup param either disables index vacuuming and cleanup or @@ -572,6 +438,10 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, Assert(params->index_cleanup != VACOPTVALUE_UNSPECIFIED); Assert(params->truncate != VACOPTVALUE_UNSPECIFIED && params->truncate != VACOPTVALUE_AUTO); + vacrel->aggressive = aggressive; + vacrel->skipwithvm = skipwithvm; + vacrel->failsafe_active = false; + vacrel->consider_bypass_optimization = true; vacrel->do_index_vacuuming = true; vacrel->do_index_cleanup = true; vacrel->do_rel_truncate = (params->truncate != VACOPTVALUE_DISABLED); @@ -593,84 +463,98 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, } vacrel->bstrategy = bstrategy; - vacrel->old_rel_pages = rel->rd_rel->relpages; - vacrel->old_live_tuples = rel->rd_rel->reltuples; vacrel->relfrozenxid = rel->rd_rel->relfrozenxid; vacrel->relminmxid = rel->rd_rel->relminmxid; + vacrel->old_live_tuples = rel->rd_rel->reltuples; - /* Set cutoffs for entire VACUUM */ - vacrel->OldestXmin = OldestXmin; - vacrel->FreezeLimit = FreezeLimit; - vacrel->MultiXactCutoff = MultiXactCutoff; + /* Initialize page counters explicitly (be tidy) */ + vacrel->scanned_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 */ - vacrel->relnamespace = get_namespace_name(RelationGetNamespace(rel)); - vacrel->relname = pstrdup(RelationGetRelationName(rel)); - vacrel->indname = NULL; - vacrel->phase = VACUUM_ERRCB_PHASE_UNKNOWN; + /* Allocate/initialize output statistics state */ + vacrel->new_rel_tuples = 0; + vacrel->new_live_tuples = 0; + vacrel->indstats = (IndexBulkDeleteResult **) + palloc0(vacrel->nindexes * sizeof(IndexBulkDeleteResult *)); - /* Save index names iff autovacuum logging requires it */ - if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0 && - vacrel->nindexes > 0) - { - indnames = palloc(sizeof(char *) * vacrel->nindexes); - for (int i = 0; i < vacrel->nindexes; i++) - indnames[i] = - pstrdup(RelationGetRelationName(vacrel->indrels[i])); - } + /* 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; /* - * Setup error traceback support for ereport(). The idea is to set up an - * error context callback to display additional information on any error - * during a vacuum. During different phases of vacuum (heap scan, heap - * vacuum, index vacuum, index clean up, heap truncate), we update the - * error context callback to display appropriate information. + * 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. * - * Note that the index vacuum and heap vacuum phases may be called - * multiple times in the middle of the heap scan phase. So the old phase - * information is restored at the end of those phases. + * 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. */ - errcallback.callback = vacuum_error_callback; - errcallback.arg = vacrel; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; + 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 (always <= OldestMxact) */ + vacrel->MultiXactCutoff = MultiXactCutoff; + /* Initialize state used to track oldest extant XID/MXID */ + vacrel->NewRelfrozenXid = OldestXmin; + vacrel->NewRelminMxid = OldestMxact; + vacrel->skippedallvis = false; - /* Do the vacuuming */ - lazy_scan_heap(vacrel, params, aggressive); + /* + * 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); - /* Done with indexes */ - vac_close_indexes(vacrel->nindexes, vacrel->indrels, NoLock); + /* + * Call lazy_scan_heap to perform all required heap pruning, index + * vacuuming, and heap vacuuming (plus related processing) + */ + lazy_scan_heap(vacrel); /* - * Compute whether we actually scanned the all unfrozen pages. If we did, - * we can adjust relfrozenxid and relminmxid. - * - * NB: We need to check this before truncating the relation, because that - * will change ->rel_pages. + * Free resources managed by dead_items_alloc. This ends parallel mode in + * passing when necessary. */ - if ((vacrel->scanned_pages + vacrel->frozenskipped_pages) - < vacrel->rel_pages) - { - Assert(!aggressive); - scanned_all_unfrozen = false; - } - else - scanned_all_unfrozen = true; + dead_items_cleanup(vacrel); + Assert(!IsInParallelMode()); /* - * Optionally truncate the relation. + * 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. */ + 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 error traceback information. This is the last phase during - * which we add context information to errors, so we don't need to - * revert to the previous phase. - */ - 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; @@ -680,88 +564,105 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, PROGRESS_VACUUM_PHASE_FINAL_CLEANUP); /* - * Update statistics in pg_class. - * - * 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. + * Prepare to update rel's pg_class entry. * + * 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->skippedallvis) + { + /* + * Must keep original relfrozenxid in a non-aggressive VACUUM that + * 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); + vacrel->NewRelfrozenXid = InvalidTransactionId; + vacrel->NewRelminMxid = InvalidMultiXactId; + } + + /* * For safety, clamp relallvisible to be not more than what we're setting - * relpages to. - * - * Also, don't change relfrozenxid/relminmxid if we skipped any pages, - * since then we don't know for certain that all tuples have a newer xmin. + * pg_class.relpages to */ - new_rel_pages = vacrel->rel_pages; - new_live_tuples = vacrel->new_live_tuples; - + new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */ visibilitymap_count(rel, &new_rel_allvisible, NULL); if (new_rel_allvisible > new_rel_pages) new_rel_allvisible = new_rel_pages; - new_frozen_xid = scanned_all_unfrozen ? FreezeLimit : InvalidTransactionId; - new_min_multi = scanned_all_unfrozen ? MultiXactCutoff : InvalidMultiXactId; - - vac_update_relstats(rel, - new_rel_pages, - new_live_tuples, - new_rel_allvisible, - vacrel->nindexes > 0, - new_frozen_xid, - new_min_multi, - false); + /* + * Now actually 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 can't happen, since we + * scan every page that isn't skipped using the visibility map. + */ + 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. + * 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 + * 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 * soon in cases where the failsafe prevented significant amounts of heap * vacuuming. */ pgstat_report_vacuum(RelationGetRelid(rel), rel->rd_rel->relisshared, - Max(new_live_tuples, 0), - vacrel->new_dead_tuples); + Max(vacrel->new_live_tuples, 0), + vacrel->recently_dead_tuples + + vacrel->missed_dead_tuples); pgstat_progress_end_command(); - /* and log the action if appropriate */ - if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0) + if (instrument) { TimestampTz endtime = GetCurrentTimestamp(); - if (params->log_min_duration == 0 || + if (verbose || params->log_min_duration == 0 || TimestampDifferenceExceeds(starttime, endtime, params->log_min_duration)) { + long secs_dur; + int usecs_dur; + WalUsage walusage; StringInfoData buf; char *msgfmt; - BlockNumber orig_rel_pages; - - TimestampDifference(starttime, endtime, &secs, &usecs); - + 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); - read_rate = 0; - write_rate = 0; - if ((secs > 0) || (usecs > 0)) + initStringInfo(&buf); + if (verbose) { - read_rate = (double) BLCKSZ * VacuumPageMiss / (1024 * 1024) / - (secs + usecs / 1000000.0); - write_rate = (double) BLCKSZ * VacuumPageDirty / (1024 * 1024) / - (secs + usecs / 1000000.0); + /* + * Aggressiveness already reported earlier, in dedicated + * VACUUM VERBOSE ereport + */ + Assert(!params->is_wraparound); + msgfmt = _("finished vacuuming \"%s.%s.%s\": index scans: %d\n"); } - - /* - * This is pretty messy, but we split it up so that we can skip - * emitting individual parts of the message when not applicable. - */ - initStringInfo(&buf); - if (params->is_wraparound) + else if (params->is_wraparound) { /* * While it's possible for a VACUUM to be both is_wraparound @@ -786,43 +687,63 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, vacrel->relnamespace, vacrel->relname, vacrel->num_index_scans); - appendStringInfo(&buf, _("pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n"), - vacrel->pages_removed, - vacrel->rel_pages, - vacrel->pinskipped_pages, - vacrel->frozenskipped_pages); + appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"), + vacrel->removed_pages, + new_rel_pages, + vacrel->scanned_pages, + 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, oldest xmin: %u\n"), + _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"), (long long) vacrel->tuples_deleted, (long long) vacrel->new_rel_tuples, - (long long) vacrel->new_dead_tuples, - OldestXmin); - orig_rel_pages = vacrel->rel_pages + vacrel->pages_removed; - if (orig_rel_pages > 0) + (long long) vacrel->recently_dead_tuples); + if (vacrel->missed_dead_tuples > 0) + appendStringInfo(&buf, + _("tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n"), + (long long) vacrel->missed_dead_tuples, + vacrel->missed_dead_pages); + diff = (int32) (ReadNextTransactionId() - OldestXmin); + appendStringInfo(&buf, + _("removable cutoff: %u, which was %d XIDs old when operation ended\n"), + OldestXmin, diff); + if (frozenxid_updated) { - 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: ")); + diff = (int32) (vacrel->NewRelfrozenXid - vacrel->relfrozenxid); + appendStringInfo(&buf, + _("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"), + vacrel->NewRelminMxid, diff); + } + 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: ")); - 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]; @@ -846,13 +767,20 @@ 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 * PageMissOp / (1024 * 1024) / + (secs_dur + usecs_dur / 1000000.0); + 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, @@ -860,7 +788,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, (unsigned long long) walusage.wal_bytes); appendStringInfo(&buf, _("system usage: %s"), pg_rusage_show(&ru0)); - ereport(LOG, + ereport(verbose ? INFO : LOG, (errmsg_internal("%s", buf.data))); pfree(buf.data); } @@ -872,284 +800,116 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, if (vacrel->indstats[i]) pfree(vacrel->indstats[i]); - if (indnames && indnames[i]) + if (instrument) pfree(indnames[i]); } } /* - * lazy_scan_heap() -- scan an open heap relation + * lazy_scan_heap() -- workhorse function for VACUUM * - * This routine prunes each page in the heap, which will among other - * things truncate dead tuples to dead line pointers, defragment the - * page, and set commit status bits (see heap_page_prune). It also builds - * lists of dead tuples and pages with free space, calculates statistics - * on the number of live tuples in the heap, and marks pages as - * all-visible if appropriate. When done, or when we run low on space - * for dead-tuple TIDs, invoke lazy_vacuum to vacuum indexes and vacuum - * heap relation during its own second pass over the heap. + * This routine prunes each page in the heap, and considers the need to + * freeze remaining tuples with storage (not including pages that can be + * skipped using the visibility map). Also performs related maintenance + * of the FSM and visibility map. These steps all take place during an + * initial pass over the target heap relation. * - * If the table has at least two indexes, we execute both index vacuum - * and index cleanup with parallel workers unless parallel vacuum is - * disabled. In a parallel vacuum, we enter parallel mode and then - * create both the parallel context and the DSM segment before starting - * heap scan so that we can record dead tuples to the DSM segment. All - * parallel workers are launched at beginning of index vacuuming and - * index cleanup and they exit once done with all indexes. At the end of - * this function we exit from parallel mode. Index bulk-deletion results - * are stored in the DSM segment and we update index statistics for all - * the indexes after exiting from parallel mode since writes are not - * allowed during parallel mode. + * Also invokes lazy_vacuum_all_indexes to vacuum indexes, which largely + * consists of deleting index tuples that point to LP_DEAD items left in + * heap pages following pruning. Earlier initial pass over the heap will + * have collected the TIDs whose index tuples need to be removed. * - * If there are no indexes then we can reclaim line pointers on the fly; - * dead line pointers need only be retained until all index pointers that - * reference them have been killed. + * Finally, invokes lazy_vacuum_heap_rel to vacuum heap pages, which + * largely consists of marking LP_DEAD items (from collected TID array) + * as LP_UNUSED. This has to happen in a second, final pass over the + * heap, to preserve a basic invariant that all index AMs rely on: no + * extant index tuple can ever be allowed to contain a TID that points to + * an LP_UNUSED line pointer in the heap. We must disallow premature + * recycling of line pointers to avoid index scans that get confused + * about which TID points to which tuple immediately after recycling. + * (Actually, this isn't a concern when target heap relation happens to + * have no indexes, which allows us to safely apply the one-pass strategy + * as an optimization). + * + * In practice we often have enough space to fit all TIDs, and so won't + * need to call lazy_vacuum more than once, after our initial pass over + * the heap has totally finished. Otherwise things are slightly more + * complicated: our "initial pass" over the heap applies only to those + * pages that were pruned before we needed to call lazy_vacuum, and our + * "final pass" over the heap only vacuums these same heap pages. + * However, we process indexes in full every time lazy_vacuum is called, + * which makes index processing very inefficient when memory is in short + * supply. */ static void -lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) +lazy_scan_heap(LVRelState *vacrel) { - LVDeadTuples *dead_tuples; - BlockNumber nblocks, + BlockNumber rel_pages = vacrel->rel_pages, blkno, next_unskippable_block, - next_failsafe_block, - next_fsm_block_to_vacuum; - PGRUsage ru0; + next_failsafe_block = 0, + next_fsm_block_to_vacuum = 0; + VacDeadItems *dead_items = vacrel->dead_items; Buffer vmbuffer = InvalidBuffer; - bool skipping_blocks; - StringInfoData buf; + bool next_unskippable_allvis, + skipping_current_range; const int initprog_index[] = { PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_TOTAL_HEAP_BLKS, PROGRESS_VACUUM_MAX_DEAD_TUPLES }; int64 initprog_val[3]; - GlobalVisState *vistest; - - pg_rusage_init(&ru0); - - if (aggressive) - ereport(elevel, - (errmsg("aggressively vacuuming \"%s.%s\"", - vacrel->relnamespace, - vacrel->relname))); - else - ereport(elevel, - (errmsg("vacuuming \"%s.%s\"", - vacrel->relnamespace, - vacrel->relname))); - - nblocks = RelationGetNumberOfBlocks(vacrel->rel); - next_unskippable_block = 0; - next_failsafe_block = 0; - next_fsm_block_to_vacuum = 0; - vacrel->rel_pages = nblocks; - vacrel->scanned_pages = 0; - vacrel->pinskipped_pages = 0; - vacrel->frozenskipped_pages = 0; - vacrel->tupcount_pages = 0; - vacrel->pages_removed = 0; - vacrel->lpdead_item_pages = 0; - vacrel->nonempty_pages = 0; - - /* Initialize instrumentation counters */ - vacrel->num_index_scans = 0; - vacrel->tuples_deleted = 0; - vacrel->lpdead_items = 0; - vacrel->new_dead_tuples = 0; - vacrel->num_tuples = 0; - vacrel->live_tuples = 0; - - vistest = GlobalVisTestFor(vacrel->rel); - - vacrel->indstats = (IndexBulkDeleteResult **) - palloc0(vacrel->nindexes * sizeof(IndexBulkDeleteResult *)); - - /* - * Before beginning scan, check if it's already necessary to apply - * failsafe - */ - lazy_check_wraparound_failsafe(vacrel); - - /* - * Allocate the space for dead tuples. Note that this handles parallel - * VACUUM initialization as part of allocating shared memory space used - * for dead_tuples. - */ - lazy_space_alloc(vacrel, params->nworkers, nblocks); - dead_tuples = vacrel->dead_tuples; /* 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[2] = dead_tuples->max_tuples; + initprog_val[1] = rel_pages; + initprog_val[2] = dead_items->max_items; pgstat_progress_update_multi_param(3, initprog_index, initprog_val); - /* - * Except when 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 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 nblocks if 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 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. - * - * We will scan the table's last page, at least to the extent of - * determining whether it has tuples or not, even if it should be skipped - * according to the above rules; except when we've already determined that - * it's not worth trying to truncate the table. 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 in - * the last page. This is worth avoiding mainly because such a lock must - * be replayed on any hot standby, where it can be disruptive. - */ - if ((params->options & VACOPT_DISABLE_PAGE_SKIPPING) == 0) - { - while (next_unskippable_block < nblocks) - { - uint8 vmstatus; - - vmstatus = visibilitymap_get_status(vacrel->rel, - next_unskippable_block, - &vmbuffer); - if (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; - - for (blkno = 0; blkno < nblocks; blkno++) + /* 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; - /* - * Consider need to skip blocks. See note above about forcing - * scanning of last page. - */ -#define FORCE_CHECK_PAGE() \ - (blkno == nblocks - 1 && should_attempt_truncation(vacrel)) - - 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 ((params->options & VACOPT_DISABLE_PAGE_SKIPPING) == 0) - { - while (next_unskippable_block < nblocks) - { - uint8 vmskipflags; - - vmskipflags = visibilitymap_get_status(vacrel->rel, - next_unskippable_block, - &vmbuffer); - if (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 (aggressive && VM_ALL_VISIBLE(vacrel->rel, blkno, &vmbuffer)) - all_visible_according_to_vm = true; + Assert(next_unskippable_block >= blkno + 1); } else { - /* - * The current block is potentially skippable; if we've seen a - * long enough run of skippable blocks to justify skipping it, and - * we're not forced to check it, then go ahead and skip. - * Otherwise, the page must be at least all-visible if not - * all-frozen, so we can set all_visible_according_to_vm = true. - */ - if (skipping_blocks && !FORCE_CHECK_PAGE()) - { - /* - * 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 all-frozen, so we have to recheck; but - * in this case an approximate answer is OK. - */ - if (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; - } + + /* Current range is too small to skip -- just scan the page */ all_visible_according_to_vm = true; } + 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(); /* @@ -1170,11 +930,11 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) /* * Consider if we definitely have enough space to process TIDs on page * already. If we are close to overrunning the available space for - * dead-tuple TIDs, pause and do a cycle of vacuuming before we tackle + * dead_items TIDs, pause and do a cycle of vacuuming before we tackle * this page. */ - if ((dead_tuples->max_tuples - dead_tuples->num_tuples) < MaxHeapTuplesPerPage && - dead_tuples->num_tuples > 0) + Assert(dead_items->max_items >= MaxHeapTuplesPerPage); + if (dead_items->max_items - dead_items->num_items < MaxHeapTuplesPerPage) { /* * Before beginning index vacuuming, we release any pin we may @@ -1188,7 +948,7 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) vmbuffer = InvalidBuffer; } - /* Remove the collected garbage tuples from table and indexes */ + /* Perform a round of index and heap vacuuming */ vacrel->consider_bypass_optimization = false; lazy_vacuum(vacrel); @@ -1206,182 +966,86 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) } /* - * Set up visibility map page as needed. - * * Pin the visibility map page in case we need to mark the page * all-visible. In most cases this will be very cheap, because we'll - * already have the correct page pinned anyway. However, it's - * possible that (a) next_unskippable_block is covered by a different - * VM page than the current block or (b) we released our pin and did a - * cycle of index vacuuming. + * already have the correct page pinned anyway. */ visibilitymap_pin(vacrel->rel, blkno, &vmbuffer); + /* Finished preparatory checks. Actually scan the page. */ buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, blkno, RBM_NORMAL, vacrel->bstrategy); + page = BufferGetPage(buf); /* - * We need buffer cleanup lock so that we can prune HOT chains and - * defragment the page. + * We need a buffer cleanup lock to prune HOT chains and defragment + * the page in lazy_scan_prune. But when it's not possible to acquire + * a cleanup lock right away, we may be able to settle for reduced + * processing using lazy_scan_noprune. */ if (!ConditionalLockBufferForCleanup(buf)) { - bool hastup; + bool hastup, + recordfreespace; - /* - * If we're not performing an aggressive scan to guard against XID - * wraparound, and we don't want to forcibly check the page, then - * it's OK to skip vacuuming pages we get a lock conflict on. They - * will be dealt with in some future vacuum. - */ - if (!aggressive && !FORCE_CHECK_PAGE()) - { - ReleaseBuffer(buf); - vacrel->pinskipped_pages++; - continue; - } - - /* - * Read the page with share lock to see if any xids on it need to - * be frozen. If not we just skip the page, after updating our - * scan statistics. If there are some, we wait for cleanup lock. - * - * We could defer the lock request further by remembering the page - * and coming back to it later, or we could even register - * ourselves for multiple buffers and then service whichever one - * is received first. For now, this seems good enough. - * - * If we get here with aggressive false, then we're just forcibly - * checking the page, and so we don't want to insist on getting - * the lock; we only need to know if the page contains tuples, so - * that we can update nonempty_pages correctly. It's convenient - * to use lazy_check_needs_freeze() for both situations, though. - */ LockBuffer(buf, BUFFER_LOCK_SHARE); - if (!lazy_check_needs_freeze(buf, &hastup, vacrel)) + + /* Check for new or empty pages before lazy_scan_noprune call */ + if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, true, + vmbuffer)) { - UnlockReleaseBuffer(buf); - vacrel->scanned_pages++; - vacrel->pinskipped_pages++; - if (hastup) - vacrel->nonempty_pages = blkno + 1; + /* Processed as new/empty page (lock and pin released) */ continue; } - if (!aggressive) + + /* Collect LP_DEAD items in dead_items array, count tuples */ + if (lazy_scan_noprune(vacrel, buf, blkno, page, &hastup, + &recordfreespace)) { + Size freespace = 0; + /* - * Here, we must not advance scanned_pages; that would amount - * to claiming that the page contains no freezable tuples. + * Processed page successfully (without cleanup lock) -- just + * need to perform rel truncation and FSM steps, much like the + * lazy_scan_prune case. Don't bother trying to match its + * visibility map setting steps, though. */ - UnlockReleaseBuffer(buf); - vacrel->pinskipped_pages++; if (hastup) vacrel->nonempty_pages = blkno + 1; + if (recordfreespace) + freespace = PageGetHeapFreeSpace(page); + UnlockReleaseBuffer(buf); + if (recordfreespace) + RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); continue; } - LockBuffer(buf, BUFFER_LOCK_UNLOCK); - LockBufferForCleanup(buf); - /* drop through to normal processing */ - } - - /* - * By here we definitely have enough dead_tuples space for whatever - * LP_DEAD tids are on this page, we have the visibility map page set - * up in case we need to set this page's all_visible/all_frozen bit, - * and we have a super-exclusive lock. Any tuples on this page are - * now sure to be "counted" by this VACUUM. - * - * One last piece of preamble needs to take place before we can prune: - * we need to consider new and empty pages. - */ - vacrel->scanned_pages++; - vacrel->tupcount_pages++; - - page = BufferGetPage(buf); - if (PageIsNew(page)) - { /* - * All-zeroes pages can be left over if either a backend extends - * the relation by a single page, but crashes before the newly - * initialized page has been written out, or when bulk-extending - * the relation (which creates a number of empty pages at the tail - * end of the relation, but enters them into the FSM). - * - * Note we do not enter the page into the visibilitymap. That has - * the downside that we repeatedly visit this page in subsequent - * vacuums, but otherwise we'll never not discover the space on a - * promoted standby. The harm of repeated checking ought to - * normally not be too bad - the space usually should be used at - * some point, otherwise there wouldn't be any regular vacuums. - * - * Make sure these pages are in the FSM, to ensure they can be - * reused. Do that by testing if there's any space recorded for - * the page. If not, enter it. We do so after releasing the lock - * on the heap page, the FSM is approximate, after all. + * lazy_scan_noprune could not do all required processing. Wait + * for a cleanup lock, and call lazy_scan_prune in the usual way. */ - UnlockReleaseBuffer(buf); - - if (GetRecordedFreeSpace(vacrel->rel, blkno) == 0) - { - Size freespace = BLCKSZ - SizeOfPageHeaderData; - - RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); - } - continue; + Assert(vacrel->aggressive); + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + LockBufferForCleanup(buf); } - if (PageIsEmpty(page)) + /* Check for new or empty pages before lazy_scan_prune call */ + if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, false, vmbuffer)) { - Size freespace = PageGetHeapFreeSpace(page); - - /* - * Empty pages are always all-visible and all-frozen (note that - * the same is currently not true for new pages, see above). - */ - if (!PageIsAllVisible(page)) - { - START_CRIT_SECTION(); - - /* mark buffer dirty before writing a WAL record */ - MarkBufferDirty(buf); - - /* - * It's possible that another backend has extended the heap, - * initialized the page, and then failed to WAL-log the page - * due to an ERROR. Since heap extension is not WAL-logged, - * recovery might try to replay our record setting the page - * all-visible and find that the page isn't initialized, which - * will cause a PANIC. To prevent that, check whether the - * page has been previously WAL-logged, and if not, do that - * now. - */ - if (RelationNeedsWAL(vacrel->rel) && - PageGetLSN(page) == InvalidXLogRecPtr) - log_newpage_buffer(buf, true); - - PageSetAllVisible(page); - visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, - vmbuffer, InvalidTransactionId, - VISIBILITYMAP_ALL_VISIBLE | VISIBILITYMAP_ALL_FROZEN); - END_CRIT_SECTION(); - } - - UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); + /* Processed as new/empty page (lock and pin released) */ continue; } /* - * Prune and freeze tuples. + * Prune, freeze, and count tuples. * * Accumulates details of remaining LP_DEAD line pointers on page in - * dead tuple list. This includes LP_DEAD line pointers that we + * dead_items array. This includes LP_DEAD line pointers that we * pruned ourselves, as well as existing LP_DEAD line pointers that * 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); @@ -1405,8 +1069,8 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) lazy_vacuum_heap_page(vacrel, blkno, buf, 0, &vmbuffer); - /* Forget the now-vacuumed tuples */ - dead_tuples->num_tuples = 0; + /* Forget the LP_DEAD items that we just vacuumed */ + dead_items->num_items = 0; /* * Periodically perform FSM vacuuming to make newly-freed @@ -1443,12 +1107,12 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) * with prunestate-driven visibility map and FSM steps (just like * the two-pass strategy). */ - Assert(dead_tuples->num_tuples == 0); + Assert(dead_items->num_items == 0); } /* - * 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) { @@ -1480,9 +1144,8 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) /* * 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)) @@ -1505,12 +1168,12 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) * visible to everyone yet actually are, and the PD_ALL_VISIBLE flag * is correct. * - * There should never be dead tuples on a page with PD_ALL_VISIBLE + * There should never be LP_DEAD items on a page with PD_ALL_VISIBLE * set, however. */ else if (prunestate.has_lpdead_items && PageIsAllVisible(page)) { - elog(WARNING, "page containing dead tuples is marked as all-visible in relation \"%s\" page %u", + elog(WARNING, "page containing LP_DEAD items is marked as all-visible in relation \"%s\" page %u", vacrel->relname, blkno); PageClearAllVisible(page); MarkBufferDirty(buf); @@ -1521,7 +1184,7 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) /* * 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 && @@ -1538,8 +1201,8 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) } /* - * Final steps for block: drop super-exclusive lock, record free space - * in the FSM + * Final steps for block: drop cleanup lock, record free space in the + * FSM */ if (prunestate.has_lpdead_items && vacrel->do_index_vacuuming) { @@ -1573,15 +1236,16 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) } } + 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, nblocks, - vacrel->tupcount_pages, + vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages, + vacrel->scanned_pages, vacrel->live_tuples); /* @@ -1589,19 +1253,14 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) * (unlikely) scenario that new_live_tuples is -1, take it as zero. */ vacrel->new_rel_tuples = - Max(vacrel->new_live_tuples, 0) + vacrel->new_dead_tuples; + Max(vacrel->new_live_tuples, 0) + vacrel->recently_dead_tuples + + 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; - } - - /* If any tuples need to be deleted, perform final vacuum cycle */ - if (dead_tuples->num_tuples > 0) + if (dead_items->num_items > 0) lazy_vacuum(vacrel); /* @@ -1614,65 +1273,246 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) /* 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 lazy_space_alloc(). (We must end parallel - * mode/free shared memory before updating index statistics. We cannot - * write while in parallel mode.) - */ - lazy_space_free(vacrel); +/* + * 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 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.) + */ +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; - /* Update index statistics */ - if (vacrel->nindexes > 0 && vacrel->do_index_cleanup) - update_index_statistics(vacrel); + *next_unskippable_allvis = true; + while (next_unskippable_block < rel_pages) + { + uint8 mapbits = visibilitymap_get_status(vacrel->rel, + next_unskippable_block, + vmbuffer); - /* - * When the table has no indexes (i.e. in the one-pass strategy case), - * make log report that lazy_vacuum_heap_rel would've made had there been - * indexes. (As in the two-pass strategy case, only make this report when - * there were LP_DEAD line pointers vacuumed in lazy_vacuum_heap_page.) - */ - if (vacrel->nindexes == 0 && vacrel->lpdead_item_pages > 0) - ereport(elevel, - (errmsg("table \"%s\": removed %lld dead item identifiers in %u pages", - vacrel->relname, (long long) vacrel->lpdead_items, - vacrel->lpdead_item_pages))); + 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++; + } /* - * Make a log report summarizing pruning and freezing. + * 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. * - * The autovacuum specific logging in heap_vacuum_rel summarizes an entire - * VACUUM operation, whereas each VACUUM VERBOSE log report generally - * summarizes a single round of index/heap vacuuming (or rel truncation). - * It wouldn't make sense to report on pruning or freezing while following - * that convention, though. You can think of this log report as a summary - * of our first pass over the heap. + * 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. */ - initStringInfo(&buf); - appendStringInfo(&buf, - _("%lld dead row versions cannot be removed yet, oldest xmin: %u\n"), - (long long) vacrel->new_dead_tuples, vacrel->OldestXmin); - appendStringInfo(&buf, ngettext("Skipped %u page due to buffer pins, ", - "Skipped %u pages due to buffer pins, ", - vacrel->pinskipped_pages), - vacrel->pinskipped_pages); - appendStringInfo(&buf, ngettext("%u frozen page.\n", - "%u frozen pages.\n", - vacrel->frozenskipped_pages), - vacrel->frozenskipped_pages); - appendStringInfo(&buf, _("%s."), pg_rusage_show(&ru0)); - - ereport(elevel, - (errmsg("table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages", - vacrel->relname, - (long long) vacrel->tuples_deleted, - (long long) vacrel->num_tuples, vacrel->scanned_pages, - nblocks), - errdetail_internal("%s", buf.data))); - pfree(buf.data); + 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. + * + * Must call here to handle both new and empty pages before calling + * lazy_scan_prune or lazy_scan_noprune, since they're not prepared to deal + * with new or empty pages. + * + * 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 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 + * wonder why we need to handle them here all the same. It's only necessary + * because of a corner-case involving a hard crash during heap relation + * extension. If we ever make relation-extension crash safe, then it should + * no longer be necessary to deal with empty pages here (or new pages, for + * that matter). + * + * Caller must hold at least a shared lock. We might need to escalate the + * lock in that case, so the type of lock caller holds needs to be specified + * using 'sharelock' argument. + * + * Returns false in common case where caller should go on to call + * lazy_scan_prune (or lazy_scan_noprune). Otherwise returns true, indicating + * that lazy_scan_heap is done processing the page, releasing lock on caller's + * behalf. + */ +static bool +lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, + Page page, bool sharelock, Buffer vmbuffer) +{ + Size freespace; + + if (PageIsNew(page)) + { + /* + * All-zeroes pages can be left over if either a backend extends the + * relation by a single page, but crashes before the newly initialized + * page has been written out, or when bulk-extending the relation + * (which creates a number of empty pages at the tail end of the + * relation), and then enters them into the FSM. + * + * Note we do not enter the page into the visibilitymap. That has the + * downside that we repeatedly visit this page in subsequent vacuums, + * but otherwise we'll never discover the space on a promoted standby. + * The harm of repeated checking ought to normally not be too bad. The + * space usually should be used at some point, otherwise there + * wouldn't be any regular vacuums. + * + * Make sure these pages are in the FSM, to ensure they can be reused. + * Do that by testing if there's any space recorded for the page. If + * not, enter it. We do so after releasing the lock on the heap page, + * the FSM is approximate, after all. + */ + UnlockReleaseBuffer(buf); + + if (GetRecordedFreeSpace(vacrel->rel, blkno) == 0) + { + freespace = BLCKSZ - SizeOfPageHeaderData; + + RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); + } + + return true; + } + + if (PageIsEmpty(page)) + { + /* + * It seems likely that caller will always be able to get a cleanup + * lock on an empty page. But don't take any chances -- escalate to + * an exclusive lock (still don't need a cleanup lock, though). + */ + if (sharelock) + { + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); + + if (!PageIsEmpty(page)) + { + /* page isn't new or empty -- keep lock and pin for now */ + return false; + } + } + else + { + /* Already have a full cleanup lock (which is more than enough) */ + } + + /* + * Unlike new pages, empty pages are always set all-visible and + * all-frozen. + */ + if (!PageIsAllVisible(page)) + { + START_CRIT_SECTION(); + + /* mark buffer dirty before writing a WAL record */ + MarkBufferDirty(buf); + + /* + * It's possible that another backend has extended the heap, + * initialized the page, and then failed to WAL-log the page due + * to an ERROR. Since heap extension is not WAL-logged, recovery + * might try to replay our record setting the page all-visible and + * find that the page isn't initialized, which will cause a PANIC. + * To prevent that, check whether the page has been previously + * WAL-logged, and if not, do that now. + */ + if (RelationNeedsWAL(vacrel->rel) && + PageGetLSN(page) == InvalidXLogRecPtr) + log_newpage_buffer(buf, true); + + PageSetAllVisible(page); + visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, + vmbuffer, InvalidTransactionId, + VISIBILITYMAP_ALL_VISIBLE | VISIBILITYMAP_ALL_FROZEN); + END_CRIT_SECTION(); + } + + freespace = PageGetHeapFreeSpace(page); + UnlockReleaseBuffer(buf); + RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); + return true; + } + + /* page isn't new or empty -- keep lock and pin */ + return false; } /* @@ -1691,7 +1531,7 @@ lazy_scan_heap(LVRelState *vacrel, VacuumParams *params, bool aggressive) * The approach we take now is to restart pruning when the race condition is * detected. This allows heap_page_prune() to prune the tuples inserted by * the now-aborted transaction. This is a little crude, but it guarantees - * that any items that make it into the dead_tuples array are simple LP_DEAD + * that any items that make it into the dead_items array are simple LP_DEAD * line pointers, and that every remaining item with tuple storage is * considered as a candidate for freezing. */ @@ -1700,7 +1540,6 @@ lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - GlobalVisState *vistest, LVPagePruneState *prunestate) { Relation rel = vacrel->rel; @@ -1711,23 +1550,33 @@ lazy_scan_prune(LVRelState *vacrel, HTSV_Result res; int tuples_deleted, lpdead_items, - new_dead_tuples, - num_tuples, - live_tuples; + live_tuples, + recently_dead_tuples; + int nnewlpdead; int nfrozen; + TransactionId NewRelfrozenXid; + MultiXactId NewRelminMxid; OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; xl_heap_freeze_tuple frozen[MaxHeapTuplesPerPage]; + 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: - /* Initialize (or reset) page-level counters */ + /* Initialize (or reset) page-level state */ + NewRelfrozenXid = vacrel->NewRelfrozenXid; + NewRelminMxid = vacrel->NewRelminMxid; tuples_deleted = 0; lpdead_items = 0; - new_dead_tuples = 0; - num_tuples = 0; live_tuples = 0; + recently_dead_tuples = 0; /* * Prune all HOT-update chains in this page. @@ -1738,8 +1587,8 @@ 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, - InvalidTransactionId, 0, false, + tuples_deleted = heap_page_prune(rel, buf, vacrel->vistest, + InvalidTransactionId, 0, &nnewlpdead, &vacrel->offnum); /* @@ -1780,10 +1629,9 @@ lazy_scan_prune(LVRelState *vacrel, * LP_DEAD items are processed outside of the loop. * * Note that we deliberately don't set hastup=true in the case of an - * LP_DEAD item here, which is not how lazy_check_needs_freeze() or - * count_nondeletable_pages() do it -- they only consider pages empty - * when they only have LP_UNUSED items, which is important for - * correctness. + * LP_DEAD item here, which is not how count_nondeletable_pages() does + * it -- it only considers pages empty/truncatable when they have no + * items at all (except LP_UNUSED items). * * Our assumption is that any LP_DEAD items we encounter here will * become LP_UNUSED inside lazy_vacuum_heap_page() before we actually @@ -1829,13 +1677,14 @@ lazy_scan_prune(LVRelState *vacrel, * VACUUM can't run inside a transaction block, which makes some cases * impossible (e.g. in-progress insert from the same transaction). * - * We treat LP_DEAD items a little differently, too -- we don't count - * them as dead_tuples at all (we only consider new_dead_tuples). The - * outcome is no different because we assume that any LP_DEAD items we - * encounter here will become LP_UNUSED inside lazy_vacuum_heap_page() - * before we report anything to the stats collector. (Cases where we - * bypass index vacuuming will violate our assumption, but the overall - * impact of that should be negligible.) + * We treat LP_DEAD items (which are the closest thing to DEAD tuples + * that might be seen here) differently, too: we assume that they'll + * become LP_UNUSED before VACUUM finishes. This difference is only + * superficial. VACUUM effectively agrees with ANALYZE about DEAD + * items, in the end. VACUUM won't remember LP_DEAD items, but only + * because they're not supposed to be left behind when it is done. + * (Cases where we bypass index vacuuming will violate this optimistic + * assumption, but the overall impact of that should be negligible.) */ switch (res) { @@ -1884,11 +1733,11 @@ lazy_scan_prune(LVRelState *vacrel, case HEAPTUPLE_RECENTLY_DEAD: /* - * If tuple is recently deleted then we must not remove it - * from relation. (We only remove items that are LP_DEAD from + * If tuple is recently dead then we must not remove it from + * the relation. (We only remove items that are LP_DEAD from * pruning.) */ - new_dead_tuples++; + recently_dead_tuples++; prunestate->all_visible = false; break; case HEAPTUPLE_INSERT_IN_PROGRESS: @@ -1924,15 +1773,14 @@ 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 makes rel truncation unsafe */ if (heap_prepare_freeze_tuple(tuple.t_data, vacrel->relfrozenxid, 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; @@ -1946,13 +1794,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 @@ -2036,12 +1887,11 @@ lazy_scan_prune(LVRelState *vacrel, #endif /* - * Now save details of the LP_DEAD items from the page in the dead_tuples - * array. Also record that page has dead items in per-page prunestate. + * Now save details of the LP_DEAD items from the page in vacrel */ if (lpdead_items > 0) { - LVDeadTuples *dead_tuples = vacrel->dead_tuples; + VacDeadItems *dead_items = vacrel->dead_items; ItemPointerData tmp; Assert(!prunestate->all_visible); @@ -2054,106 +1904,344 @@ lazy_scan_prune(LVRelState *vacrel, for (int i = 0; i < lpdead_items; i++) { ItemPointerSetOffsetNumber(&tmp, deadoffsets[i]); - dead_tuples->itemptrs[dead_tuples->num_tuples++] = tmp; + dead_items->items[dead_items->num_items++] = tmp; } - Assert(dead_tuples->num_tuples <= dead_tuples->max_tuples); + Assert(dead_items->num_items <= dead_items->max_items); pgstat_progress_update_param(PROGRESS_VACUUM_NUM_DEAD_TUPLES, - dead_tuples->num_tuples); + dead_items->num_items); } /* Finally, add page-local counts to whole-VACUUM counts */ vacrel->tuples_deleted += tuples_deleted; vacrel->lpdead_items += lpdead_items; - vacrel->new_dead_tuples += new_dead_tuples; - vacrel->num_tuples += num_tuples; vacrel->live_tuples += live_tuples; + vacrel->recently_dead_tuples += recently_dead_tuples; } /* - * Remove the collected garbage tuples from the table and its indexes. + * lazy_scan_noprune() -- lazy_scan_prune() without pruning or freezing * - * We may choose to bypass index vacuuming at this point, though only when the - * ongoing VACUUM operation will definitely only have one index scan/round of - * index vacuuming. Caller indicates whether or not this is such a VACUUM - * operation using 'onecall' argument. + * Caller need only hold a pin and share lock on the buffer, unlike + * lazy_scan_prune, which requires a full cleanup lock. While pruning isn't + * performed here, it's quite possible that an earlier opportunistic pruning + * operation left LP_DEAD items behind. We'll at least collect any such items + * in the dead_items array for removal from indexes. * - * In rare emergencies, the ongoing VACUUM operation can be made to skip both - * index vacuuming and index cleanup at the point we're called. This avoids - * having the whole system refuse to allocate further XIDs/MultiXactIds due to - * wraparound. + * For aggressive VACUUM callers, we may return false to indicate that a full + * cleanup lock is required for processing by lazy_scan_prune. This is only + * necessary when the aggressive VACUUM needs to freeze some tuple XIDs from + * one or more tuples on the page. We always return true for non-aggressive + * callers. + * + * See lazy_scan_prune for an explanation of hastup return flag. + * recordfreespace flag instructs caller on whether or not it should do + * generic FSM processing for page. */ -static void -lazy_vacuum(LVRelState *vacrel) +static bool +lazy_scan_noprune(LVRelState *vacrel, + Buffer buf, + BlockNumber blkno, + Page page, + bool *hastup, + bool *recordfreespace) { - bool bypass; + OffsetNumber offnum, + maxoff; + int lpdead_items, + live_tuples, + recently_dead_tuples, + missed_dead_tuples; + HeapTupleHeader tupleheader; + TransactionId NewRelfrozenXid = vacrel->NewRelfrozenXid; + MultiXactId NewRelminMxid = vacrel->NewRelminMxid; + OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; - /* Should not end up here with no indexes */ - Assert(vacrel->nindexes > 0); - Assert(!IsParallelWorker()); - Assert(vacrel->lpdead_item_pages > 0); + Assert(BufferGetBlockNumber(buf) == blkno); - if (!vacrel->do_index_vacuuming) - { - Assert(!vacrel->do_index_cleanup); - vacrel->dead_tuples->num_tuples = 0; - return; - } + *hastup = false; /* for now */ + *recordfreespace = false; /* for now */ - /* - * Consider bypassing index vacuuming (and heap vacuuming) entirely. - * - * We currently only do this in cases where the number of LP_DEAD items - * for the entire VACUUM operation is close to zero. This avoids sharp - * discontinuities in the duration and overhead of successive VACUUM - * operations that run against the same table with a fixed workload. - * Ideally, successive VACUUM operations will behave as if there are - * exactly zero LP_DEAD items in cases where there are close to zero. - * - * This is likely to be helpful with a table that is continually affected - * by UPDATEs that can mostly apply the HOT optimization, but occasionally - * have small aberrations that lead to just a few heap pages retaining - * only one or two LP_DEAD items. This is pretty common; even when the - * DBA goes out of their way to make UPDATEs use HOT, it is practically - * impossible to predict whether HOT will be applied in 100% of cases. - * It's far easier to ensure that 99%+ of all UPDATEs against a table use - * HOT through careful tuning. - */ - bypass = false; - if (vacrel->consider_bypass_optimization && vacrel->rel_pages > 0) + lpdead_items = 0; + live_tuples = 0; + recently_dead_tuples = 0; + missed_dead_tuples = 0; + + maxoff = PageGetMaxOffsetNumber(page); + for (offnum = FirstOffsetNumber; + offnum <= maxoff; + offnum = OffsetNumberNext(offnum)) { - BlockNumber threshold; + ItemId itemid; + HeapTupleData tuple; - Assert(vacrel->num_index_scans == 0); - Assert(vacrel->lpdead_items == vacrel->dead_tuples->num_tuples); - Assert(vacrel->do_index_vacuuming); - Assert(vacrel->do_index_cleanup); + vacrel->offnum = offnum; + itemid = PageGetItemId(page, offnum); - /* - * This crossover point at which we'll start to do index vacuuming is - * expressed as a percentage of the total number of heap pages in the - * table that are known to have at least one LP_DEAD item. This is - * much more important than the total number of LP_DEAD items, since - * it's a proxy for the number of heap pages whose visibility map bits - * cannot be set on account of bypassing index and heap vacuuming. - * - * We apply one further precautionary test: the space currently used - * to store the TIDs (TIDs that now all point to LP_DEAD items) must - * not exceed 32MB. This limits the risk that we will bypass index - * vacuuming again and again until eventually there is a VACUUM whose - * dead_tuples space is not CPU cache resident. - * + if (!ItemIdIsUsed(itemid)) + continue; + + if (ItemIdIsRedirected(itemid)) + { + *hastup = true; + continue; + } + + if (ItemIdIsDead(itemid)) + { + /* + * Deliberately don't set hastup=true here. See same point in + * lazy_scan_prune for an explanation. + */ + deadoffsets[lpdead_items++] = offnum; + continue; + } + + *hastup = true; /* page prevents rel truncation */ + tupleheader = (HeapTupleHeader) PageGetItem(page, itemid); + if (heap_tuple_would_freeze(tupleheader, + vacrel->FreezeLimit, + vacrel->MultiXactCutoff, + &NewRelfrozenXid, &NewRelminMxid)) + { + /* Tuple with XID < FreezeLimit (or MXID < MultiXactCutoff) */ + if (vacrel->aggressive) + { + /* + * 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 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 + * wait a while for a cleanup lock, but it can't be helped. + */ + vacrel->offnum = InvalidOffsetNumber; + return false; + } + + /* + * 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. + */ + } + + ItemPointerSet(&(tuple.t_self), blkno, offnum); + tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); + tuple.t_len = ItemIdGetLength(itemid); + tuple.t_tableOid = RelationGetRelid(vacrel->rel); + + switch (HeapTupleSatisfiesVacuum(&tuple, vacrel->OldestXmin, buf)) + { + case HEAPTUPLE_DELETE_IN_PROGRESS: + case HEAPTUPLE_LIVE: + + /* + * Count both cases as live, just like lazy_scan_prune + */ + live_tuples++; + + break; + case HEAPTUPLE_DEAD: + + /* + * There is some useful work for pruning to do, that won't be + * done due to failure to get a cleanup lock. + */ + missed_dead_tuples++; + break; + case HEAPTUPLE_RECENTLY_DEAD: + + /* + * Count in recently_dead_tuples, just like lazy_scan_prune + */ + recently_dead_tuples++; + break; + case HEAPTUPLE_INSERT_IN_PROGRESS: + + /* + * Do not count these rows as live, just like lazy_scan_prune + */ + break; + default: + elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result"); + break; + } + } + + vacrel->offnum = InvalidOffsetNumber; + + /* + * 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) */ + if (lpdead_items > 0) + { + /* + * Perfunctory handling for the corner case where a single pass + * strategy VACUUM cannot get a cleanup lock, and it turns out + * that there is one or more LP_DEAD items: just count the LP_DEAD + * items as missed_dead_tuples instead. (This is a bit dishonest, + * but it beats having to maintain specialized heap vacuuming code + * forever, for vanishingly little benefit.) + */ + *hastup = true; + missed_dead_tuples += lpdead_items; + } + + *recordfreespace = true; + } + else if (lpdead_items == 0) + { + /* + * Won't be vacuuming this page later, so record page's freespace in + * the FSM now + */ + *recordfreespace = true; + } + else + { + VacDeadItems *dead_items = vacrel->dead_items; + ItemPointerData tmp; + + /* + * Page has LP_DEAD items, and so any references/TIDs that remain in + * indexes will be deleted during index vacuuming (and then marked + * LP_UNUSED in the heap) + */ + vacrel->lpdead_item_pages++; + + ItemPointerSetBlockNumber(&tmp, blkno); + + for (int i = 0; i < lpdead_items; i++) + { + ItemPointerSetOffsetNumber(&tmp, deadoffsets[i]); + dead_items->items[dead_items->num_items++] = tmp; + } + + Assert(dead_items->num_items <= dead_items->max_items); + pgstat_progress_update_param(PROGRESS_VACUUM_NUM_DEAD_TUPLES, + dead_items->num_items); + + vacrel->lpdead_items += lpdead_items; + + /* + * Assume that we'll go on to vacuum this heap page during final pass + * over the heap. Don't record free space until then. + */ + *recordfreespace = false; + } + + /* + * 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; + if (missed_dead_tuples > 0) + vacrel->missed_dead_pages++; + + /* Caller won't need to call lazy_scan_prune with same page */ + return true; +} + +/* + * Main entry point for index vacuuming and heap vacuuming. + * + * Removes items collected in dead_items from table's indexes, then marks the + * same items LP_UNUSED in the heap. See the comments above lazy_scan_heap + * for full details. + * + * Also empties dead_items, freeing up space for later TIDs. + * + * We may choose to bypass index vacuuming at this point, though only when the + * ongoing VACUUM operation will definitely only have one index scan/round of + * index vacuuming. + */ +static void +lazy_vacuum(LVRelState *vacrel) +{ + bool bypass; + + /* Should not end up here with no indexes */ + Assert(vacrel->nindexes > 0); + Assert(vacrel->lpdead_item_pages > 0); + + if (!vacrel->do_index_vacuuming) + { + Assert(!vacrel->do_index_cleanup); + vacrel->dead_items->num_items = 0; + return; + } + + /* + * Consider bypassing index vacuuming (and heap vacuuming) entirely. + * + * We currently only do this in cases where the number of LP_DEAD items + * for the entire VACUUM operation is close to zero. This avoids sharp + * discontinuities in the duration and overhead of successive VACUUM + * operations that run against the same table with a fixed workload. + * Ideally, successive VACUUM operations will behave as if there are + * exactly zero LP_DEAD items in cases where there are close to zero. + * + * This is likely to be helpful with a table that is continually affected + * by UPDATEs that can mostly apply the HOT optimization, but occasionally + * have small aberrations that lead to just a few heap pages retaining + * only one or two LP_DEAD items. This is pretty common; even when the + * DBA goes out of their way to make UPDATEs use HOT, it is practically + * impossible to predict whether HOT will be applied in 100% of cases. + * It's far easier to ensure that 99%+ of all UPDATEs against a table use + * HOT through careful tuning. + */ + bypass = false; + if (vacrel->consider_bypass_optimization && vacrel->rel_pages > 0) + { + BlockNumber threshold; + + Assert(vacrel->num_index_scans == 0); + Assert(vacrel->lpdead_items == vacrel->dead_items->num_items); + Assert(vacrel->do_index_vacuuming); + Assert(vacrel->do_index_cleanup); + + /* + * This crossover point at which we'll start to do index vacuuming is + * expressed as a percentage of the total number of heap pages in the + * table that are known to have at least one LP_DEAD item. This is + * much more important than the total number of LP_DEAD items, since + * it's a proxy for the number of heap pages whose visibility map bits + * cannot be set on account of bypassing index and heap vacuuming. + * + * We apply one further precautionary test: the space currently used + * to store the TIDs (TIDs that now all point to LP_DEAD items) must + * not exceed 32MB. This limits the risk that we will bypass index + * vacuuming again and again until eventually there is a VACUUM whose + * 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 new_dead_tuples report to the stats collector) - * 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. - * The discrepancy should be negligible. If this optimization is ever - * expanded to cover more cases then this may need to be reconsidered. + * 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 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. */ threshold = (double) vacrel->rel_pages * BYPASS_THRESHOLD_PAGES; bypass = (vacrel->lpdead_item_pages < threshold && - vacrel->lpdead_items < MAXDEADTUPLES(32L * 1024L * 1024L)); + vacrel->lpdead_items < MAXDEADITEMS(32L * 1024L * 1024L)); } if (bypass) @@ -2169,11 +2257,6 @@ lazy_vacuum(LVRelState *vacrel) * calls.) */ vacrel->do_index_vacuuming = false; - ereport(elevel, - (errmsg("table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers", - vacrel->relname, vacrel->lpdead_item_pages, - 100.0 * vacrel->lpdead_item_pages / vacrel->rel_pages, - (long long) vacrel->lpdead_items))); } else if (lazy_vacuum_all_indexes(vacrel)) { @@ -2188,7 +2271,7 @@ lazy_vacuum(LVRelState *vacrel) /* * Failsafe case. * - * we attempted index vacuuming, but didn't finish a full round/full + * We attempted index vacuuming, but didn't finish a full round/full * index scan. This happens when relfrozenxid or relminmxid is too * far in the past. * @@ -2203,7 +2286,7 @@ lazy_vacuum(LVRelState *vacrel) * Forget the LP_DEAD items that we just vacuumed (or just decided to not * vacuum) */ - vacrel->dead_tuples->num_tuples = 0; + vacrel->dead_items->num_items = 0; } /* @@ -2219,12 +2302,9 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) { bool allindexes = true; - Assert(!IsParallelWorker()); 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)) @@ -2259,7 +2339,8 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) else { /* Outsource everything to parallel variant */ - do_parallel_lazy_vacuum_all_indexes(vacrel); + parallel_vacuum_bulkdel_all_indexes(vacrel->pvs, vacrel->old_live_tuples, + vacrel->num_index_scans); /* * Do a postcheck to consider applying wraparound failsafe now. Note @@ -2277,7 +2358,7 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) * place). */ Assert(vacrel->num_index_scans > 0 || - vacrel->dead_tuples->num_tuples == vacrel->lpdead_items); + vacrel->dead_items->num_items == vacrel->lpdead_items); Assert(allindexes || vacrel->failsafe_active); /* @@ -2296,7 +2377,7 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) /* * lazy_vacuum_heap_rel() -- second pass over the heap for two pass strategy * - * This routine marks LP_DEAD items in vacrel->dead_tuples array as LP_UNUSED. + * This routine marks LP_DEAD items in vacrel->dead_items array as LP_UNUSED. * Pages that never had lazy_scan_prune record LP_DEAD items are not visited * at all. * @@ -2314,9 +2395,8 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) static void lazy_vacuum_heap_rel(LVRelState *vacrel) { - int tupindex; + int index; BlockNumber vacuumed_pages; - PGRUsage ru0; Buffer vmbuffer = InvalidBuffer; LVSavedErrInfo saved_err_info; @@ -2333,11 +2413,10 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) VACUUM_ERRCB_PHASE_VACUUM_HEAP, InvalidBlockNumber, InvalidOffsetNumber); - pg_rusage_init(&ru0); vacuumed_pages = 0; - tupindex = 0; - while (tupindex < vacrel->dead_tuples->num_tuples) + index = 0; + while (index < vacrel->dead_items->num_items) { BlockNumber tblk; Buffer buf; @@ -2346,13 +2425,12 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) vacuum_delay_point(); - tblk = ItemPointerGetBlockNumber(&vacrel->dead_tuples->itemptrs[tupindex]); + tblk = ItemPointerGetBlockNumber(&vacrel->dead_items->items[index]); vacrel->blkno = tblk; buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, tblk, RBM_NORMAL, vacrel->bstrategy); LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); - tupindex = lazy_vacuum_heap_page(vacrel, tblk, buf, tupindex, - &vmbuffer); + index = lazy_vacuum_heap_page(vacrel, tblk, buf, index, &vmbuffer); /* Now that we've vacuumed the page, record its available space */ page = BufferGetPage(buf); @@ -2376,15 +2454,14 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) * We set all LP_DEAD items from the first heap pass to LP_UNUSED during * the second heap pass. No more, no less. */ - Assert(tupindex > 0); + Assert(index > 0); Assert(vacrel->num_index_scans > 1 || - (tupindex == vacrel->lpdead_items && + (index == vacrel->lpdead_items && vacuumed_pages == vacrel->lpdead_item_pages)); - ereport(elevel, + ereport(DEBUG2, (errmsg("table \"%s\": removed %lld dead item identifiers in %u pages", - vacrel->relname, (long long ) tupindex, vacuumed_pages), - errdetail_internal("%s", pg_rusage_show(&ru0)))); + vacrel->relname, (long long) index, vacuumed_pages))); /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); @@ -2392,27 +2469,20 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) /* * lazy_vacuum_heap_page() -- free page's LP_DEAD items listed in the - * vacrel->dead_tuples array. + * vacrel->dead_items array. * - * Caller must have an exclusive buffer lock on the buffer (though a - * super-exclusive lock is also acceptable). + * Caller must have an exclusive buffer lock on the buffer (though a full + * cleanup lock is also acceptable). * - * tupindex is the index in vacrel->dead_tuples of the first dead tuple for - * this page. We assume the rest follow sequentially. The return value is - * the first tupindex after the tuples of this page. - * - * Prior to PostgreSQL 14 there were rare cases where this routine had to set - * tuples with storage to unused. These days it is strictly responsible for - * marking LP_DEAD stub line pointers as unused. This only happens for those - * LP_DEAD items on the page that were determined to be LP_DEAD items back - * when the same page was visited by lazy_scan_prune() (i.e. those whose TID - * was recorded in the dead_tuples array). + * index is an offset into the vacrel->dead_items array for the first listed + * LP_DEAD item on the page. The return value is the first index immediately + * after all LP_DEAD items for the same page in the array. */ static int lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, - int tupindex, Buffer *vmbuffer) + int index, Buffer *vmbuffer) { - LVDeadTuples *dead_tuples = vacrel->dead_tuples; + VacDeadItems *dead_items = vacrel->dead_items; Page page = BufferGetPage(buffer); OffsetNumber unused[MaxHeapTuplesPerPage]; int uncnt = 0; @@ -2431,16 +2501,16 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, START_CRIT_SECTION(); - for (; tupindex < dead_tuples->num_tuples; tupindex++) + for (; index < dead_items->num_items; index++) { BlockNumber tblk; OffsetNumber toff; ItemId itemid; - tblk = ItemPointerGetBlockNumber(&dead_tuples->itemptrs[tupindex]); + tblk = ItemPointerGetBlockNumber(&dead_items->items[index]); if (tblk != blkno) break; /* past end of tuples for this block */ - toff = ItemPointerGetOffsetNumber(&dead_tuples->itemptrs[tupindex]); + toff = ItemPointerGetOffsetNumber(&dead_items->items[index]); itemid = PageGetItemId(page, toff); Assert(ItemIdIsDead(itemid) && !ItemIdHasStorage(itemid)); @@ -2520,68 +2590,7 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); - return tupindex; -} - -/* - * lazy_check_needs_freeze() -- scan page to see if any tuples - * need to be cleaned to avoid wraparound - * - * Returns true if the page needs to be vacuumed using cleanup lock. - * Also returns a flag indicating whether page contains any tuples at all. - */ -static bool -lazy_check_needs_freeze(Buffer buf, bool *hastup, LVRelState *vacrel) -{ - Page page = BufferGetPage(buf); - OffsetNumber offnum, - maxoff; - HeapTupleHeader tupleheader; - - *hastup = false; - - /* - * New and empty pages, obviously, don't contain tuples. We could make - * sure that the page is registered in the FSM, but it doesn't seem worth - * waiting for a cleanup lock just for that, especially because it's - * likely that the pin holder will do so. - */ - if (PageIsNew(page) || PageIsEmpty(page)) - return false; - - maxoff = PageGetMaxOffsetNumber(page); - for (offnum = FirstOffsetNumber; - offnum <= maxoff; - offnum = OffsetNumberNext(offnum)) - { - ItemId itemid; - - /* - * Set the offset number so that we can display it along with any - * error that occurred while processing this tuple. - */ - vacrel->offnum = offnum; - itemid = PageGetItemId(page, offnum); - - /* this should match hastup test in count_nondeletable_pages() */ - if (ItemIdIsUsed(itemid)) - *hastup = true; - - /* dead and redirect items never need freezing */ - if (!ItemIdIsNormal(itemid)) - continue; - - tupleheader = (HeapTupleHeader) PageGetItem(page, itemid); - - if (heap_tuple_needs_freeze(tupleheader, vacrel->FreezeLimit, - vacrel->MultiXactCutoff, buf)) - break; - } /* scan along page */ - - /* Clear the offset information once we have processed the given page. */ - vacrel->offnum = InvalidOffsetNumber; - - return (offnum <= maxoff); + return index; } /* @@ -2599,6 +2608,9 @@ lazy_check_needs_freeze(Buffer buf, bool *hastup, LVRelState *vacrel) 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; @@ -2617,365 +2629,20 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) (errmsg("bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans", get_database_name(MyDatabaseId), vacrel->relnamespace, - vacrel->relname, - vacrel->num_index_scans), - errdetail("The table's relfrozenxid or relminmxid is too far in the past."), - errhint("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."))); - - /* Stop applying cost limits from this point on */ - VacuumCostActive = false; - VacuumCostBalance = 0; - - return true; - } - - return false; -} - -/* - * Perform lazy_vacuum_all_indexes() steps in parallel - */ -static void -do_parallel_lazy_vacuum_all_indexes(LVRelState *vacrel) -{ - /* Tell parallel workers to do index vacuuming */ - vacrel->lps->lvshared->for_cleanup = false; - vacrel->lps->lvshared->first_time = false; - - /* - * We can only provide an approximate value of num_heap_tuples, at least - * for now. Matches serial VACUUM case. - */ - vacrel->lps->lvshared->reltuples = vacrel->old_live_tuples; - vacrel->lps->lvshared->estimated_count = true; - - do_parallel_vacuum_or_cleanup(vacrel, - vacrel->lps->nindexes_parallel_bulkdel); -} - -/* - * Perform lazy_cleanup_all_indexes() steps in parallel - */ -static void -do_parallel_lazy_cleanup_all_indexes(LVRelState *vacrel) -{ - int nworkers; - - /* - * If parallel vacuum is active we perform index cleanup with parallel - * workers. - * - * Tell parallel workers to do index cleanup. - */ - vacrel->lps->lvshared->for_cleanup = true; - vacrel->lps->lvshared->first_time = (vacrel->num_index_scans == 0); - - /* - * Now we can provide a better estimate of total number of surviving - * tuples (we assume indexes are more interested in that than in the - * number of nominally live tuples). - */ - vacrel->lps->lvshared->reltuples = vacrel->new_rel_tuples; - vacrel->lps->lvshared->estimated_count = - (vacrel->tupcount_pages < vacrel->rel_pages); - - /* Determine the number of parallel workers to launch */ - if (vacrel->lps->lvshared->first_time) - nworkers = vacrel->lps->nindexes_parallel_cleanup + - vacrel->lps->nindexes_parallel_condcleanup; - else - nworkers = vacrel->lps->nindexes_parallel_cleanup; - - do_parallel_vacuum_or_cleanup(vacrel, nworkers); -} - -/* - * Perform index vacuum or index cleanup with parallel workers. This function - * must be used by the parallel vacuum leader process. The caller must set - * lps->lvshared->for_cleanup to indicate whether to perform vacuum or - * cleanup. - */ -static void -do_parallel_vacuum_or_cleanup(LVRelState *vacrel, int nworkers) -{ - LVParallelState *lps = vacrel->lps; - - Assert(!IsParallelWorker()); - Assert(ParallelVacuumIsActive(vacrel)); - Assert(vacrel->nindexes > 0); - - /* The leader process will participate */ - nworkers--; - - /* - * It is possible that parallel context is initialized with fewer workers - * than the number of indexes that need a separate worker in the current - * phase, so we need to consider it. See compute_parallel_vacuum_workers. - */ - nworkers = Min(nworkers, lps->pcxt->nworkers); - - /* Setup the shared cost-based vacuum delay and launch workers */ - if (nworkers > 0) - { - if (vacrel->num_index_scans > 0) - { - /* Reset the parallel index processing counter */ - pg_atomic_write_u32(&(lps->lvshared->idx), 0); - - /* Reinitialize the parallel context to relaunch parallel workers */ - ReinitializeParallelDSM(lps->pcxt); - } - - /* - * Set up shared cost balance and the number of active workers for - * vacuum delay. We need to do this before launching workers as - * otherwise, they might not see the updated values for these - * parameters. - */ - pg_atomic_write_u32(&(lps->lvshared->cost_balance), VacuumCostBalance); - pg_atomic_write_u32(&(lps->lvshared->active_nworkers), 0); - - /* - * The number of workers can vary between bulkdelete and cleanup - * phase. - */ - ReinitializeParallelWorkers(lps->pcxt, nworkers); - - LaunchParallelWorkers(lps->pcxt); - - if (lps->pcxt->nworkers_launched > 0) - { - /* - * Reset the local cost values for leader backend as we have - * already accumulated the remaining balance of heap. - */ - VacuumCostBalance = 0; - VacuumCostBalanceLocal = 0; - - /* Enable shared cost balance for leader backend */ - VacuumSharedCostBalance = &(lps->lvshared->cost_balance); - VacuumActiveNWorkers = &(lps->lvshared->active_nworkers); - } - - if (lps->lvshared->for_cleanup) - ereport(elevel, - (errmsg(ngettext("launched %d parallel vacuum worker for index cleanup (planned: %d)", - "launched %d parallel vacuum workers for index cleanup (planned: %d)", - lps->pcxt->nworkers_launched), - lps->pcxt->nworkers_launched, nworkers))); - else - ereport(elevel, - (errmsg(ngettext("launched %d parallel vacuum worker for index vacuuming (planned: %d)", - "launched %d parallel vacuum workers for index vacuuming (planned: %d)", - lps->pcxt->nworkers_launched), - lps->pcxt->nworkers_launched, nworkers))); - } - - /* Process the indexes that can be processed by only leader process */ - do_serial_processing_for_unsafe_indexes(vacrel, lps->lvshared); - - /* - * Join as a parallel worker. The leader process alone processes all the - * indexes in the case where no workers are launched. - */ - do_parallel_processing(vacrel, lps->lvshared); - - /* - * Next, accumulate buffer and WAL usage. (This must wait for the workers - * to finish, or we might get incomplete data.) - */ - if (nworkers > 0) - { - /* Wait for all vacuum workers to finish */ - WaitForParallelWorkersToFinish(lps->pcxt); - - for (int i = 0; i < lps->pcxt->nworkers_launched; i++) - InstrAccumParallelQuery(&lps->buffer_usage[i], &lps->wal_usage[i]); - } - - /* - * Carry the shared balance value to heap scan and disable shared costing - */ - if (VacuumSharedCostBalance) - { - VacuumCostBalance = pg_atomic_read_u32(VacuumSharedCostBalance); - VacuumSharedCostBalance = NULL; - VacuumActiveNWorkers = NULL; - } -} - -/* - * Index vacuum/cleanup routine used by the leader process and parallel - * vacuum worker processes to process the indexes in parallel. - */ -static void -do_parallel_processing(LVRelState *vacrel, LVShared *lvshared) -{ - /* - * Increment the active worker count if we are able to launch any worker. - */ - if (VacuumActiveNWorkers) - pg_atomic_add_fetch_u32(VacuumActiveNWorkers, 1); - - /* Loop until all indexes are vacuumed */ - for (;;) - { - int idx; - LVSharedIndStats *shared_istat; - Relation indrel; - IndexBulkDeleteResult *istat; - - /* Get an index number to process */ - idx = pg_atomic_fetch_add_u32(&(lvshared->idx), 1); - - /* Done for all indexes? */ - if (idx >= vacrel->nindexes) - break; - - /* Get the index statistics space from DSM, if any */ - shared_istat = parallel_stats_for_idx(lvshared, idx); - - /* Skip indexes not participating in parallelism */ - if (shared_istat == NULL) - continue; - - indrel = vacrel->indrels[idx]; - - /* - * Skip processing indexes that are unsafe for workers (these are - * processed in do_serial_processing_for_unsafe_indexes() by leader) - */ - if (!parallel_processing_is_safe(indrel, lvshared)) - continue; - - /* Do vacuum or cleanup of the index */ - istat = (vacrel->indstats[idx]); - vacrel->indstats[idx] = parallel_process_one_index(indrel, istat, - lvshared, - shared_istat, - vacrel); - } - - /* - * We have completed the index vacuum so decrement the active worker - * count. - */ - if (VacuumActiveNWorkers) - pg_atomic_sub_fetch_u32(VacuumActiveNWorkers, 1); -} - -/* - * Perform parallel processing of indexes in leader process. - * - * Handles index vacuuming (or index cleanup) for indexes that are not - * parallel safe. It's possible that this will vary for a given index, based - * on details like whether we're performing for_cleanup processing right now. - * - * Also performs processing of smaller indexes that fell under the size cutoff - * enforced by compute_parallel_vacuum_workers(). These indexes never get a - * slot for statistics in DSM. - */ -static void -do_serial_processing_for_unsafe_indexes(LVRelState *vacrel, LVShared *lvshared) -{ - Assert(!IsParallelWorker()); - - /* - * Increment the active worker count if we are able to launch any worker. - */ - if (VacuumActiveNWorkers) - pg_atomic_add_fetch_u32(VacuumActiveNWorkers, 1); - - for (int idx = 0; idx < vacrel->nindexes; idx++) - { - LVSharedIndStats *shared_istat; - Relation indrel; - IndexBulkDeleteResult *istat; - - shared_istat = parallel_stats_for_idx(lvshared, idx); - indrel = vacrel->indrels[idx]; - - /* - * We're only here for the indexes that parallel workers won't - * process. Note that the shared_istat test ensures that we process - * indexes that fell under initial size cutoff. - */ - if (shared_istat != NULL && - parallel_processing_is_safe(indrel, lvshared)) - continue; - - /* Do vacuum or cleanup of the index */ - istat = (vacrel->indstats[idx]); - vacrel->indstats[idx] = parallel_process_one_index(indrel, istat, - lvshared, - shared_istat, - vacrel); - } - - /* - * We have completed the index vacuum so decrement the active worker - * count. - */ - if (VacuumActiveNWorkers) - pg_atomic_sub_fetch_u32(VacuumActiveNWorkers, 1); -} - -/* - * Vacuum or cleanup index either by leader process or by one of the worker - * process. After processing the index this function copies the index - * statistics returned from ambulkdelete and amvacuumcleanup to the DSM - * segment. - */ -static IndexBulkDeleteResult * -parallel_process_one_index(Relation indrel, - IndexBulkDeleteResult *istat, - LVShared *lvshared, - LVSharedIndStats *shared_istat, - LVRelState *vacrel) -{ - IndexBulkDeleteResult *istat_res; - - /* - * Update the pointer to the corresponding bulk-deletion result if someone - * has already updated it - */ - if (shared_istat && shared_istat->updated && istat == NULL) - istat = &shared_istat->istat; - - /* Do vacuum or cleanup of the index */ - if (lvshared->for_cleanup) - istat_res = lazy_cleanup_one_index(indrel, istat, lvshared->reltuples, - lvshared->estimated_count, vacrel); - else - istat_res = lazy_vacuum_one_index(indrel, istat, lvshared->reltuples, - vacrel); - - /* - * Copy the index bulk-deletion result returned from ambulkdelete and - * amvacuumcleanup to the DSM segment if it's the first cycle because they - * allocate locally and it's possible that an index will be vacuumed by a - * different vacuum process the next cycle. Copying the result normally - * happens only the first time an index is vacuumed. For any additional - * vacuum pass, we directly point to the result on the DSM segment and - * pass it to vacuum index APIs so that workers can update it directly. - * - * Since all vacuum workers write the bulk-deletion result at different - * slots we can write them without locking. - */ - if (shared_istat && !shared_istat->updated && istat_res != NULL) - { - memcpy(&shared_istat->istat, istat_res, sizeof(IndexBulkDeleteResult)); - shared_istat->updated = true; + vacrel->relname, + vacrel->num_index_scans), + errdetail("The table's relfrozenxid or relminmxid is too far in the past."), + errhint("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."))); - /* Free the locally-allocated bulk-deletion result */ - pfree(istat_res); + /* Stop applying cost limits from this point on */ + VacuumCostActive = false; + VacuumCostBalance = 0; - /* return the pointer to the result from shared memory */ - return &shared_istat->istat; + return true; } - return istat_res; + return false; } /* @@ -2984,7 +2651,10 @@ parallel_process_one_index(Relation indrel, static void lazy_cleanup_all_indexes(LVRelState *vacrel) { - Assert(!IsParallelWorker()); + 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 */ @@ -2993,10 +2663,6 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) if (!ParallelVacuumIsActive(vacrel)) { - double reltuples = vacrel->new_rel_tuples; - bool estimated_count = - vacrel->tupcount_pages < vacrel->rel_pages; - for (int idx = 0; idx < vacrel->nindexes; idx++) { Relation indrel = vacrel->indrels[idx]; @@ -3010,18 +2676,22 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) else { /* Outsource everything to parallel variant */ - do_parallel_lazy_cleanup_all_indexes(vacrel); + parallel_vacuum_cleanup_all_indexes(vacrel->pvs, reltuples, + vacrel->num_index_scans, + estimated_count); } } /* * lazy_vacuum_one_index() -- vacuum index relation. * - * Delete all the index entries pointing to tuples listed in - * dead_tuples, and update running statistics. + * Delete all the index tuples containing a TID collected in + * vacrel->dead_items array. Also update running statistics. + * Exact details depend on index AM's ambulkdelete routine. * * reltuples is the number of heap tuples to be passed to the * bulkdelete callback. It's always assumed to be estimated. + * See indexam.sgml for more info. * * Returns bulk delete stats derived from input stats */ @@ -3030,16 +2700,13 @@ lazy_vacuum_one_index(Relation indrel, IndexBulkDeleteResult *istat, double reltuples, LVRelState *vacrel) { IndexVacuumInfo ivinfo; - PGRUsage ru0; LVSavedErrInfo saved_err_info; - pg_rusage_init(&ru0); - ivinfo.index = indrel; ivinfo.analyze_only = false; ivinfo.report_progress = false; ivinfo.estimated_count = true; - ivinfo.message_level = elevel; + ivinfo.message_level = DEBUG2; ivinfo.num_heap_tuples = reltuples; ivinfo.strategy = vacrel->bstrategy; @@ -3056,13 +2723,7 @@ lazy_vacuum_one_index(Relation indrel, IndexBulkDeleteResult *istat, InvalidBlockNumber, InvalidOffsetNumber); /* Do bulk deletion */ - istat = index_bulk_delete(&ivinfo, istat, lazy_tid_reaped, - (void *) vacrel->dead_tuples); - - ereport(elevel, - (errmsg("scanned index \"%s\" to remove %d row versions", - vacrel->indname, vacrel->dead_tuples->num_tuples), - errdetail_internal("%s", pg_rusage_show(&ru0)))); + istat = vac_bulkdel_one_index(&ivinfo, istat, (void *) vacrel->dead_items); /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); @@ -3075,8 +2736,9 @@ lazy_vacuum_one_index(Relation indrel, IndexBulkDeleteResult *istat, /* * lazy_cleanup_one_index() -- do post-vacuum cleanup for index relation. * - * reltuples is the number of heap tuples and estimated_count is true - * if reltuples is an estimated value. + * Calls index AM's amvacuumcleanup routine. reltuples is the number + * of heap tuples and estimated_count is true if reltuples is an + * estimated value. See indexam.sgml for more info. * * Returns bulk delete stats derived from input stats */ @@ -3086,16 +2748,13 @@ lazy_cleanup_one_index(Relation indrel, IndexBulkDeleteResult *istat, LVRelState *vacrel) { IndexVacuumInfo ivinfo; - PGRUsage ru0; LVSavedErrInfo saved_err_info; - pg_rusage_init(&ru0); - ivinfo.index = indrel; ivinfo.analyze_only = false; ivinfo.report_progress = false; ivinfo.estimated_count = estimated_count; - ivinfo.message_level = elevel; + ivinfo.message_level = DEBUG2; ivinfo.num_heap_tuples = reltuples; ivinfo.strategy = vacrel->bstrategy; @@ -3112,24 +2771,7 @@ lazy_cleanup_one_index(Relation indrel, IndexBulkDeleteResult *istat, VACUUM_ERRCB_PHASE_INDEX_CLEANUP, InvalidBlockNumber, InvalidOffsetNumber); - istat = index_vacuum_cleanup(&ivinfo, istat); - - if (istat) - { - ereport(elevel, - (errmsg("index \"%s\" now contains %.0f row versions in %u pages", - RelationGetRelationName(indrel), - (istat)->num_index_tuples, - (istat)->num_pages), - errdetail("%.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.", - (istat)->tuples_removed, - (istat)->pages_newly_deleted, - (istat)->pages_deleted, (istat)->pages_free, - pg_rusage_show(&ru0)))); - } + istat = vac_cleanup_one_index(&ivinfo, istat); /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); @@ -3143,10 +2785,17 @@ lazy_cleanup_one_index(Relation indrel, IndexBulkDeleteResult *istat, * should_attempt_truncation - should we attempt to truncate the heap? * * Don't even think about it unless we have a shot at releasing a goodly - * number of pages. Otherwise, the time taken isn't worth it. + * number of pages. Otherwise, the time taken isn't worth it, mainly because + * an AccessExclusive lock must be replayed on any hot standby, where it can + * be particularly disruptive. * - * Also don't attempt it if wraparound failsafe is in effect. It's hard to - * predict how long lazy_truncate_heap will take. Don't take any chances. + * Also don't attempt it if wraparound failsafe is in effect. The entire + * system might be refusing to allocate new XIDs at this point. The system + * definitely won't return to normal unless and until VACUUM actually advances + * the oldest relfrozenxid -- which hasn't happened for target rel just yet. + * If lazy_truncate_heap attempted to acquire an AccessExclusiveLock to + * truncate the table under these circumstances, an XID exhaustion error might + * make it impossible for VACUUM to fix the underlying XID exhaustion problem. * There is very little chance of truncation working out when the failsafe is * in effect in any case. lazy_scan_prune makes the optimistic assumption * that any LP_DEAD items it encounters will always be LP_UNUSED by the time @@ -3155,27 +2804,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; } /* @@ -3184,7 +2829,7 @@ should_attempt_truncation(LVRelState *vacrel) static void lazy_truncate_heap(LVRelState *vacrel) { - BlockNumber old_rel_pages = vacrel->rel_pages; + BlockNumber orig_rel_pages = vacrel->rel_pages; BlockNumber new_rel_pages; bool lock_waiter_detected; int lock_retry; @@ -3193,15 +2838,15 @@ 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. */ do { - PGRUsage ru0; - - pg_rusage_init(&ru0); - /* * We need full exclusive lock on the relation in order to do * truncation. If we can't get it, give up rather than waiting --- we @@ -3229,13 +2874,17 @@ lazy_truncate_heap(LVRelState *vacrel) * We failed to establish the lock in the specified number of * retries. This means we give up truncating. */ - ereport(elevel, + ereport(vacrel->verbose ? INFO : DEBUG2, (errmsg("\"%s\": stopping truncate due to conflicting lock request", vacrel->relname))); return; } - pg_usleep(VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL * 1000L); + (void) WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL, + WAIT_EVENT_VACUUM_TRUNCATE); + ResetLatch(MyLatch); } /* @@ -3244,7 +2893,7 @@ lazy_truncate_heap(LVRelState *vacrel) * the newly added pages presumably contain non-deletable tuples. */ new_rel_pages = RelationGetNumberOfBlocks(vacrel->rel); - if (new_rel_pages != old_rel_pages) + if (new_rel_pages != orig_rel_pages) { /* * Note: we intentionally don't update vacrel->rel_pages with the @@ -3266,7 +2915,7 @@ lazy_truncate_heap(LVRelState *vacrel) new_rel_pages = count_nondeletable_pages(vacrel, &lock_waiter_detected); vacrel->blkno = new_rel_pages; - if (new_rel_pages >= old_rel_pages) + if (new_rel_pages >= orig_rel_pages) { /* can't do anything after all */ UnlockRelation(vacrel->rel, AccessExclusiveLock); @@ -3292,16 +2941,14 @@ lazy_truncate_heap(LVRelState *vacrel) * without also touching reltuples, since the tuple count wasn't * changed by the truncation. */ - vacrel->pages_removed += old_rel_pages - new_rel_pages; + vacrel->removed_pages += orig_rel_pages - new_rel_pages; vacrel->rel_pages = new_rel_pages; - ereport(elevel, + ereport(vacrel->verbose ? INFO : DEBUG2, (errmsg("table \"%s\": truncated %u to %u pages", vacrel->relname, - old_rel_pages, new_rel_pages), - errdetail_internal("%s", - pg_rusage_show(&ru0)))); - old_rel_pages = new_rel_pages; + orig_rel_pages, new_rel_pages))); + orig_rel_pages = new_rel_pages; } while (new_rel_pages > vacrel->nonempty_pages && lock_waiter_detected); } @@ -3359,7 +3006,7 @@ count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected) { if (LockHasWaitersRelation(vacrel->rel, AccessExclusiveLock)) { - ereport(elevel, + ereport(vacrel->verbose ? INFO : DEBUG2, (errmsg("table \"%s\": suspending truncate due to conflicting lock request", vacrel->relname))); @@ -3446,45 +3093,60 @@ count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected) } /* - * Return the maximum number of dead tuples we can record. + * Returns the number of dead TIDs that VACUUM should allocate space to + * store, given a heap rel of size vacrel->rel_pages, and given current + * maintenance_work_mem setting (or current autovacuum_work_mem setting, + * when applicable). + * + * See the comments at the head of this file for rationale. */ -static long -compute_max_dead_tuples(BlockNumber relblocks, bool hasindex) +static int +dead_items_max_items(LVRelState *vacrel) { - long maxtuples; + int64 max_items; int vac_work_mem = IsAutoVacuumWorkerProcess() && autovacuum_work_mem != -1 ? autovacuum_work_mem : maintenance_work_mem; - if (hasindex) + if (vacrel->nindexes > 0) { - maxtuples = MAXDEADTUPLES(vac_work_mem * 1024L); - maxtuples = Min(maxtuples, INT_MAX); - maxtuples = Min(maxtuples, MAXDEADTUPLES(MaxAllocSize)); + BlockNumber rel_pages = vacrel->rel_pages; + + max_items = MAXDEADITEMS(vac_work_mem * 1024L); + max_items = Min(max_items, INT_MAX); + max_items = Min(max_items, MAXDEADITEMS(MaxAllocSize)); /* curious coding here to ensure the multiplication can't overflow */ - if ((BlockNumber) (maxtuples / LAZY_ALLOC_TUPLES) > relblocks) - maxtuples = relblocks * LAZY_ALLOC_TUPLES; + if ((BlockNumber) (max_items / MaxHeapTuplesPerPage) > rel_pages) + max_items = rel_pages * MaxHeapTuplesPerPage; /* stay sane if small maintenance_work_mem */ - maxtuples = Max(maxtuples, MaxHeapTuplesPerPage); + max_items = Max(max_items, MaxHeapTuplesPerPage); } else - maxtuples = MaxHeapTuplesPerPage; + { + /* One-pass case only stores a single heap page's TIDs at a time */ + max_items = MaxHeapTuplesPerPage; + } - return maxtuples; + return (int) max_items; } /* - * lazy_space_alloc - space allocation decisions for lazy vacuum + * Allocate dead_items (either using palloc, or in dynamic shared memory). + * Sets dead_items in vacrel for caller. * - * See the comments at the head of this file for rationale. + * Also handles parallel initialization as part of allocating dead_items in + * DSM when required. */ static void -lazy_space_alloc(LVRelState *vacrel, int nworkers, BlockNumber nblocks) +dead_items_alloc(LVRelState *vacrel, int nworkers) { - LVDeadTuples *dead_tuples; - long maxtuples; + VacDeadItems *dead_items; + int max_items; + + max_items = dead_items_max_items(vacrel); + Assert(max_items >= MaxHeapTuplesPerPage); /* * Initialize state for a parallel vacuum. As of now, only one worker can @@ -3509,104 +3171,43 @@ lazy_space_alloc(LVRelState *vacrel, int nworkers, BlockNumber nblocks) vacrel->relname))); } else - vacrel->lps = begin_parallel_vacuum(vacrel, nblocks, nworkers); + vacrel->pvs = parallel_vacuum_init(vacrel->rel, vacrel->indrels, + vacrel->nindexes, nworkers, + max_items, + vacrel->verbose ? INFO : DEBUG2, + vacrel->bstrategy); - /* If parallel mode started, we're done */ + /* If parallel mode started, dead_items space is allocated in DSM */ if (ParallelVacuumIsActive(vacrel)) + { + vacrel->dead_items = parallel_vacuum_get_dead_items(vacrel->pvs); return; + } } - maxtuples = compute_max_dead_tuples(nblocks, vacrel->nindexes > 0); + /* Serial VACUUM case */ + dead_items = (VacDeadItems *) palloc(vac_max_items_to_alloc_size(max_items)); + dead_items->max_items = max_items; + dead_items->num_items = 0; - dead_tuples = (LVDeadTuples *) palloc(SizeOfDeadTuples(maxtuples)); - dead_tuples->num_tuples = 0; - dead_tuples->max_tuples = (int) maxtuples; - - vacrel->dead_tuples = dead_tuples; + vacrel->dead_items = dead_items; } /* - * lazy_space_free - free space allocated in lazy_space_alloc + * Perform cleanup for resources allocated in dead_items_alloc */ static void -lazy_space_free(LVRelState *vacrel) +dead_items_cleanup(LVRelState *vacrel) { if (!ParallelVacuumIsActive(vacrel)) + { + /* Don't bother with pfree here */ return; + } - /* - * End parallel mode before updating index statistics as we cannot write - * during parallel mode. - */ - end_parallel_vacuum(vacrel); -} - -/* - * lazy_tid_reaped() -- is a particular tid deletable? - * - * This has the right signature to be an IndexBulkDeleteCallback. - * - * Assumes dead_tuples array is in sorted order. - */ -static bool -lazy_tid_reaped(ItemPointer itemptr, void *state) -{ - LVDeadTuples *dead_tuples = (LVDeadTuples *) state; - int64 litem, - ritem, - item; - ItemPointer res; - - litem = itemptr_encode(&dead_tuples->itemptrs[0]); - ritem = itemptr_encode(&dead_tuples->itemptrs[dead_tuples->num_tuples - 1]); - item = itemptr_encode(itemptr); - - /* - * Doing a simple bound check before bsearch() is useful to avoid the - * extra cost of bsearch(), especially if dead tuples on the heap are - * concentrated in a certain range. Since this function is called for - * every index tuple, it pays to be really fast. - */ - if (item < litem || item > ritem) - return false; - - res = (ItemPointer) bsearch((void *) itemptr, - (void *) dead_tuples->itemptrs, - dead_tuples->num_tuples, - sizeof(ItemPointerData), - vac_cmp_itemptr); - - return (res != NULL); -} - -/* - * Comparator routines for use with qsort() and bsearch(). - */ -static int -vac_cmp_itemptr(const void *left, const void *right) -{ - BlockNumber lblk, - rblk; - OffsetNumber loff, - roff; - - lblk = ItemPointerGetBlockNumber((ItemPointer) left); - rblk = ItemPointerGetBlockNumber((ItemPointer) right); - - if (lblk < rblk) - return -1; - if (lblk > rblk) - return 1; - - loff = ItemPointerGetOffsetNumber((ItemPointer) left); - roff = ItemPointerGetOffsetNumber((ItemPointer) right); - - if (loff < roff) - return -1; - if (loff > roff) - return 1; - - return 0; + /* End parallel mode */ + parallel_vacuum_end(vacrel->pvs, vacrel->indstats); + vacrel->pvs = NULL; } /* @@ -3614,6 +3215,11 @@ vac_cmp_itemptr(const void *left, const void *right) * transactions. Also return the visibility_cutoff_xid which is the highest * xmin amongst the visible tuples. Set *all_frozen to true if every tuple * on this page is frozen. + * + * This is a stripped down version of lazy_scan_prune(). If you change + * anything here, make sure that everything stays in sync. Note that an + * assertion calls us to verify that everybody still agrees. Be sure to avoid + * introducing new side-effects here. */ static bool heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, @@ -3629,10 +3235,6 @@ heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, *visibility_cutoff_xid = InvalidTransactionId; *all_frozen = true; - /* - * This is a stripped down version of the line pointer scan in - * lazy_scan_heap(). So if you change anything here, also check that code. - */ maxoff = PageGetMaxOffsetNumber(page); for (offnum = FirstOffsetNumber; offnum <= maxoff && all_visible; @@ -3677,7 +3279,7 @@ heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, { TransactionId xmin; - /* Check comments in lazy_scan_heap. */ + /* Check comments in lazy_scan_prune. */ if (!HeapTupleHeaderXminCommitted(tuple.t_data)) { all_visible = false; @@ -3729,87 +3331,17 @@ heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, return all_visible; } -/* - * Compute the number of parallel worker processes to request. Both index - * vacuum and index cleanup can be executed with parallel workers. The index - * is eligible for parallel vacuum iff its size is greater than - * min_parallel_index_scan_size as invoking workers for very small indexes - * can hurt performance. - * - * nrequested is the number of parallel workers that user requested. If - * nrequested is 0, we compute the parallel degree based on nindexes, that is - * the number of indexes that support parallel vacuum. This function also - * sets will_parallel_vacuum to remember indexes that participate in parallel - * vacuum. - */ -static int -compute_parallel_vacuum_workers(LVRelState *vacrel, int nrequested, - bool *will_parallel_vacuum) -{ - int nindexes_parallel = 0; - int nindexes_parallel_bulkdel = 0; - int nindexes_parallel_cleanup = 0; - int parallel_workers; - - /* - * We don't allow performing parallel operation in standalone backend or - * when parallelism is disabled. - */ - if (!IsUnderPostmaster || max_parallel_maintenance_workers == 0) - return 0; - - /* - * Compute the number of indexes that can participate in parallel vacuum. - */ - for (int idx = 0; idx < vacrel->nindexes; idx++) - { - Relation indrel = vacrel->indrels[idx]; - uint8 vacoptions = indrel->rd_indam->amparallelvacuumoptions; - - if (vacoptions == VACUUM_OPTION_NO_PARALLEL || - RelationGetNumberOfBlocks(indrel) < min_parallel_index_scan_size) - continue; - - will_parallel_vacuum[idx] = true; - - if ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) != 0) - nindexes_parallel_bulkdel++; - if (((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) != 0) || - ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0)) - nindexes_parallel_cleanup++; - } - - nindexes_parallel = Max(nindexes_parallel_bulkdel, - nindexes_parallel_cleanup); - - /* The leader process takes one index */ - nindexes_parallel--; - - /* No index supports parallel vacuum */ - if (nindexes_parallel <= 0) - return 0; - - /* Compute the parallel degree */ - parallel_workers = (nrequested > 0) ? - Min(nrequested, nindexes_parallel) : nindexes_parallel; - - /* Cap by max_parallel_maintenance_workers */ - parallel_workers = Min(parallel_workers, max_parallel_maintenance_workers); - - return parallel_workers; -} - /* * 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++) { @@ -3827,438 +3359,15 @@ update_index_statistics(LVRelState *vacrel) false, InvalidTransactionId, InvalidMultiXactId, - false); - } -} - -/* - * This function prepares and returns parallel vacuum state if we can launch - * even one worker. This function is responsible for entering parallel mode, - * create a parallel context, and then initialize the DSM segment. - */ -static LVParallelState * -begin_parallel_vacuum(LVRelState *vacrel, BlockNumber nblocks, - int nrequested) -{ - LVParallelState *lps = NULL; - Relation *indrels = vacrel->indrels; - int nindexes = vacrel->nindexes; - ParallelContext *pcxt; - LVShared *shared; - LVDeadTuples *dead_tuples; - BufferUsage *buffer_usage; - WalUsage *wal_usage; - bool *will_parallel_vacuum; - long maxtuples; - Size est_shared; - Size est_deadtuples; - int nindexes_mwm = 0; - int parallel_workers = 0; - int querylen; - - /* - * A parallel vacuum must be requested and there must be indexes on the - * relation - */ - Assert(nrequested >= 0); - Assert(nindexes > 0); - - /* - * Compute the number of parallel vacuum workers to launch - */ - will_parallel_vacuum = (bool *) palloc0(sizeof(bool) * nindexes); - parallel_workers = compute_parallel_vacuum_workers(vacrel, - nrequested, - will_parallel_vacuum); - - /* Can't perform vacuum in parallel */ - if (parallel_workers <= 0) - { - pfree(will_parallel_vacuum); - return lps; - } - - lps = (LVParallelState *) palloc0(sizeof(LVParallelState)); - - EnterParallelMode(); - pcxt = CreateParallelContext("postgres", "parallel_vacuum_main", - parallel_workers); - Assert(pcxt->nworkers > 0); - lps->pcxt = pcxt; - - /* Estimate size for shared information -- PARALLEL_VACUUM_KEY_SHARED */ - est_shared = MAXALIGN(add_size(SizeOfLVShared, BITMAPLEN(nindexes))); - for (int idx = 0; idx < nindexes; idx++) - { - Relation indrel = indrels[idx]; - uint8 vacoptions = indrel->rd_indam->amparallelvacuumoptions; - - /* - * Cleanup option should be either disabled, always performing in - * parallel or conditionally performing in parallel. - */ - Assert(((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) == 0) || - ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) == 0)); - Assert(vacoptions <= VACUUM_OPTION_MAX_VALID_VALUE); - - /* Skip indexes that don't participate in parallel vacuum */ - if (!will_parallel_vacuum[idx]) - continue; - - if (indrel->rd_indam->amusemaintenanceworkmem) - nindexes_mwm++; - - est_shared = add_size(est_shared, sizeof(LVSharedIndStats)); - - /* - * Remember the number of indexes that support parallel operation for - * each phase. - */ - if ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) != 0) - lps->nindexes_parallel_bulkdel++; - if ((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) != 0) - lps->nindexes_parallel_cleanup++; - if ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0) - lps->nindexes_parallel_condcleanup++; - } - shm_toc_estimate_chunk(&pcxt->estimator, est_shared); - shm_toc_estimate_keys(&pcxt->estimator, 1); - - /* Estimate size for dead tuples -- PARALLEL_VACUUM_KEY_DEAD_TUPLES */ - maxtuples = compute_max_dead_tuples(nblocks, true); - est_deadtuples = MAXALIGN(SizeOfDeadTuples(maxtuples)); - shm_toc_estimate_chunk(&pcxt->estimator, est_deadtuples); - shm_toc_estimate_keys(&pcxt->estimator, 1); - - /* - * Estimate space for BufferUsage and WalUsage -- - * PARALLEL_VACUUM_KEY_BUFFER_USAGE and PARALLEL_VACUUM_KEY_WAL_USAGE. - * - * If there are no extensions loaded that care, we could skip this. We - * have no way of knowing whether anyone's looking at pgBufferUsage or - * pgWalUsage, so do it unconditionally. - */ - shm_toc_estimate_chunk(&pcxt->estimator, - mul_size(sizeof(BufferUsage), pcxt->nworkers)); - shm_toc_estimate_keys(&pcxt->estimator, 1); - shm_toc_estimate_chunk(&pcxt->estimator, - mul_size(sizeof(WalUsage), pcxt->nworkers)); - shm_toc_estimate_keys(&pcxt->estimator, 1); - - /* Finally, estimate PARALLEL_VACUUM_KEY_QUERY_TEXT space */ - if (debug_query_string) - { - querylen = strlen(debug_query_string); - shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1); - shm_toc_estimate_keys(&pcxt->estimator, 1); - } - else - querylen = 0; /* keep compiler quiet */ - - InitializeParallelDSM(pcxt); - - /* Prepare shared information */ - shared = (LVShared *) shm_toc_allocate(pcxt->toc, est_shared); - MemSet(shared, 0, est_shared); - shared->relid = RelationGetRelid(vacrel->rel); - shared->elevel = elevel; - shared->maintenance_work_mem_worker = - (nindexes_mwm > 0) ? - maintenance_work_mem / Min(parallel_workers, nindexes_mwm) : - maintenance_work_mem; - - pg_atomic_init_u32(&(shared->cost_balance), 0); - pg_atomic_init_u32(&(shared->active_nworkers), 0); - pg_atomic_init_u32(&(shared->idx), 0); - shared->offset = MAXALIGN(add_size(SizeOfLVShared, BITMAPLEN(nindexes))); - - /* - * Initialize variables for shared index statistics, set NULL bitmap and - * the size of stats for each index. - */ - memset(shared->bitmap, 0x00, BITMAPLEN(nindexes)); - for (int idx = 0; idx < nindexes; idx++) - { - if (!will_parallel_vacuum[idx]) - continue; - - /* Set NOT NULL as this index does support parallelism */ - shared->bitmap[idx >> 3] |= 1 << (idx & 0x07); - } - - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_SHARED, shared); - lps->lvshared = shared; - - /* Prepare the dead tuple space */ - dead_tuples = (LVDeadTuples *) shm_toc_allocate(pcxt->toc, est_deadtuples); - dead_tuples->max_tuples = maxtuples; - dead_tuples->num_tuples = 0; - MemSet(dead_tuples->itemptrs, 0, sizeof(ItemPointerData) * maxtuples); - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_DEAD_TUPLES, dead_tuples); - vacrel->dead_tuples = dead_tuples; - - /* - * Allocate space for each worker's BufferUsage and WalUsage; no need to - * initialize - */ - buffer_usage = shm_toc_allocate(pcxt->toc, - mul_size(sizeof(BufferUsage), pcxt->nworkers)); - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_BUFFER_USAGE, buffer_usage); - lps->buffer_usage = buffer_usage; - wal_usage = shm_toc_allocate(pcxt->toc, - mul_size(sizeof(WalUsage), pcxt->nworkers)); - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_WAL_USAGE, wal_usage); - lps->wal_usage = wal_usage; - - /* Store query string for workers */ - if (debug_query_string) - { - char *sharedquery; - - sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1); - memcpy(sharedquery, debug_query_string, querylen + 1); - sharedquery[querylen] = '\0'; - shm_toc_insert(pcxt->toc, - PARALLEL_VACUUM_KEY_QUERY_TEXT, sharedquery); - } - - pfree(will_parallel_vacuum); - return lps; -} - -/* - * Destroy the parallel context, and end parallel mode. - * - * Since writes are not allowed during parallel mode, copy the - * updated index statistics from DSM into local memory and then later use that - * to update the index statistics. One might think that we can exit from - * parallel mode, update the index statistics and then destroy parallel - * context, but that won't be safe (see ExitParallelMode). - */ -static void -end_parallel_vacuum(LVRelState *vacrel) -{ - IndexBulkDeleteResult **indstats = vacrel->indstats; - LVParallelState *lps = vacrel->lps; - int nindexes = vacrel->nindexes; - - Assert(!IsParallelWorker()); - - /* Copy the updated statistics */ - for (int idx = 0; idx < nindexes; idx++) - { - LVSharedIndStats *shared_istat; - - shared_istat = parallel_stats_for_idx(lps->lvshared, idx); - - /* - * Skip index -- it must have been processed by the leader, from - * inside do_serial_processing_for_unsafe_indexes() - */ - if (shared_istat == NULL) - continue; - - if (shared_istat->updated) - { - indstats[idx] = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult)); - memcpy(indstats[idx], &(shared_istat->istat), sizeof(IndexBulkDeleteResult)); - } - else - indstats[idx] = NULL; - } - - DestroyParallelContext(lps->pcxt); - ExitParallelMode(); - - /* Deactivate parallel vacuum */ - pfree(lps); - vacrel->lps = NULL; -} - -/* - * Return shared memory statistics for index at offset 'getidx', if any - * - * Returning NULL indicates that compute_parallel_vacuum_workers() determined - * that the index is a totally unsuitable target for all parallel processing - * up front. For example, the index could be < min_parallel_index_scan_size - * cutoff. - */ -static LVSharedIndStats * -parallel_stats_for_idx(LVShared *lvshared, int getidx) -{ - char *p; - - if (IndStatsIsNull(lvshared, getidx)) - return NULL; - - p = (char *) GetSharedIndStats(lvshared); - for (int idx = 0; idx < getidx; idx++) - { - if (IndStatsIsNull(lvshared, idx)) - continue; - - p += sizeof(LVSharedIndStats); - } - - return (LVSharedIndStats *) p; -} - -/* - * Returns false, if the given index can't participate in parallel index - * vacuum or parallel index cleanup - */ -static bool -parallel_processing_is_safe(Relation indrel, LVShared *lvshared) -{ - uint8 vacoptions = indrel->rd_indam->amparallelvacuumoptions; - - /* first_time must be true only if for_cleanup is true */ - Assert(lvshared->for_cleanup || !lvshared->first_time); - - if (lvshared->for_cleanup) - { - /* Skip, if the index does not support parallel cleanup */ - if (((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) == 0) && - ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) == 0)) - return false; - - /* - * Skip, if the index supports parallel cleanup conditionally, but we - * have already processed the index (for bulkdelete). See the - * comments for option VACUUM_OPTION_PARALLEL_COND_CLEANUP to know - * when indexes support parallel cleanup conditionally. - */ - if (!lvshared->first_time && - ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0)) - return false; - } - else if ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) == 0) - { - /* Skip if the index does not support parallel bulk deletion */ - return false; + NULL, NULL, false); } - - return true; -} - -/* - * Perform work within a launched parallel process. - * - * Since parallel vacuum workers perform only index vacuum or index cleanup, - * we don't need to report progress information. - */ -void -parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) -{ - Relation rel; - Relation *indrels; - LVShared *lvshared; - LVDeadTuples *dead_tuples; - BufferUsage *buffer_usage; - WalUsage *wal_usage; - int nindexes; - char *sharedquery; - LVRelState vacrel; - ErrorContextCallback errcallback; - - /* - * A parallel vacuum worker must have only PROC_IN_VACUUM flag since we - * don't support parallel vacuum for autovacuum as of now. - */ - Assert(MyProc->statusFlags == PROC_IN_VACUUM); - - lvshared = (LVShared *) shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_SHARED, - false); - elevel = lvshared->elevel; - - if (lvshared->for_cleanup) - elog(DEBUG1, "starting parallel vacuum worker for cleanup"); - else - elog(DEBUG1, "starting parallel vacuum worker for bulk delete"); - - /* Set debug_query_string for individual workers */ - sharedquery = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_QUERY_TEXT, true); - debug_query_string = sharedquery; - pgstat_report_activity(STATE_RUNNING, debug_query_string); - - /* - * Open table. The lock mode is the same as the leader process. It's - * okay because the lock mode does not conflict among the parallel - * workers. - */ - rel = table_open(lvshared->relid, ShareUpdateExclusiveLock); - - /* - * Open all indexes. indrels are sorted in order by OID, which should be - * matched to the leader's one. - */ - vac_open_indexes(rel, RowExclusiveLock, &nindexes, &indrels); - Assert(nindexes > 0); - - /* Set dead tuple space */ - dead_tuples = (LVDeadTuples *) shm_toc_lookup(toc, - PARALLEL_VACUUM_KEY_DEAD_TUPLES, - false); - - /* Set cost-based vacuum delay */ - VacuumCostActive = (VacuumCostDelay > 0); - VacuumCostBalance = 0; - VacuumPageHit = 0; - VacuumPageMiss = 0; - VacuumPageDirty = 0; - VacuumCostBalanceLocal = 0; - VacuumSharedCostBalance = &(lvshared->cost_balance); - VacuumActiveNWorkers = &(lvshared->active_nworkers); - - vacrel.rel = rel; - vacrel.indrels = indrels; - vacrel.nindexes = nindexes; - /* Each parallel VACUUM worker gets its own access strategy */ - vacrel.bstrategy = GetAccessStrategy(BAS_VACUUM); - vacrel.indstats = (IndexBulkDeleteResult **) - palloc0(nindexes * sizeof(IndexBulkDeleteResult *)); - - if (lvshared->maintenance_work_mem_worker > 0) - maintenance_work_mem = lvshared->maintenance_work_mem_worker; - - /* - * Initialize vacrel for use as error callback arg by parallel worker. - */ - vacrel.relnamespace = get_namespace_name(RelationGetNamespace(rel)); - vacrel.relname = pstrdup(RelationGetRelationName(rel)); - vacrel.indname = NULL; - vacrel.phase = VACUUM_ERRCB_PHASE_UNKNOWN; /* Not yet processing */ - vacrel.dead_tuples = dead_tuples; - - /* Setup error traceback support for ereport() */ - errcallback.callback = vacuum_error_callback; - errcallback.arg = &vacrel; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - - /* Prepare to track buffer usage during parallel execution */ - InstrStartParallelQuery(); - - /* Process indexes to perform vacuum/cleanup */ - do_parallel_processing(&vacrel, lvshared); - - /* Report buffer/WAL usage during parallel execution */ - buffer_usage = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_BUFFER_USAGE, false); - wal_usage = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_WAL_USAGE, false); - InstrEndParallelQuery(&buffer_usage[ParallelWorkerNumber], - &wal_usage[ParallelWorkerNumber]); - - /* Pop the error context stack */ - error_context_stack = errcallback.previous; - - vac_close_indexes(nindexes, indrels, RowExclusiveLock); - table_close(rel, ShareUpdateExclusiveLock); - FreeAccessStrategy(vacrel.bstrategy); - pfree(vacrel.indstats); } /* - * Error context callback for errors occurring during vacuum. + * Error context callback for errors occurring during vacuum. The error + * context messages for index phases should match the messages set in parallel + * vacuum. If you change this function for those phases, change + * parallel_vacuum_error_callback() as well. */ static void vacuum_error_callback(void *arg) diff --git a/third_party/spanner_pg/src/backend/access/heap/visibilitymap.c b/third_party/spanner_pg/src/backend/access/heap/visibilitymap.c index 4720b35e..e09f25a6 100644 --- a/third_party/spanner_pg/src/backend/access/heap/visibilitymap.c +++ b/third_party/spanner_pg/src/backend/access/heap/visibilitymap.c @@ -3,7 +3,7 @@ * visibilitymap.c * bitmap for tracking visibility of heap tuples * - * 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 * * @@ -88,7 +88,8 @@ #include "access/heapam_xlog.h" #include "access/visibilitymap.h" -#include "access/xlog.h" +#include "access/xloginsert.h" +#include "access/xlogutils.h" #include "miscadmin.h" #include "port/pg_bitutils.h" #include "storage/bufmgr.h" diff --git a/third_party/spanner_pg/src/backend/access/index/amapi.c b/third_party/spanner_pg/src/backend/access/index/amapi.c index d30bc435..2b028e19 100644 --- a/third_party/spanner_pg/src/backend/access/index/amapi.c +++ b/third_party/spanner_pg/src/backend/access/index/amapi.c @@ -3,7 +3,7 @@ * amapi.c * Support routines for API for Postgres index access methods. * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/index/amvalidate.c b/third_party/spanner_pg/src/backend/access/index/amvalidate.c index c08f9d36..58622e7a 100644 --- a/third_party/spanner_pg/src/backend/access/index/amvalidate.c +++ b/third_party/spanner_pg/src/backend/access/index/amvalidate.c @@ -4,7 +4,7 @@ * Support routines for index access methods' amvalidate and * amadjustmembers functions. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/index/genam.c b/third_party/spanner_pg/src/backend/access/index/genam.c index c7286cb8..0934acf4 100644 --- a/third_party/spanner_pg/src/backend/access/index/genam.c +++ b/third_party/spanner_pg/src/backend/access/index/genam.c @@ -3,7 +3,7 @@ * genam.c * general index access method routines * - * 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 * * @@ -305,6 +305,8 @@ index_compute_xid_horizon_for_tuples(Relation irel, Assert(nitems > 0); + delstate.irel = irel; + delstate.iblknum = BufferGetBlockNumber(ibuf); delstate.bottomup = false; delstate.bottomupfreespace = 0; delstate.ndeltids = 0; @@ -314,16 +316,17 @@ index_compute_xid_horizon_for_tuples(Relation irel, /* identify what the index tuples about to be deleted point to */ for (int i = 0; i < nitems; i++) { + OffsetNumber offnum = itemnos[i]; ItemId iitemid; - iitemid = PageGetItemId(ipage, itemnos[i]); + iitemid = PageGetItemId(ipage, offnum); itup = (IndexTuple) PageGetItem(ipage, iitemid); Assert(ItemIdIsDead(iitemid)); ItemPointerCopy(&itup->t_tid, &delstate.deltids[i].tid); delstate.deltids[i].id = delstate.ndeltids; - delstate.status[i].idxoffnum = InvalidOffsetNumber; /* unused */ + delstate.status[i].idxoffnum = offnum; delstate.status[i].knowndeletable = true; /* LP_DEAD-marked */ delstate.status[i].promising = false; /* unused */ delstate.status[i].freespace = 0; /* unused */ diff --git a/third_party/spanner_pg/src/backend/access/index/indexam.c b/third_party/spanner_pg/src/backend/access/index/indexam.c index 5e22479b..cd5f07f2 100644 --- a/third_party/spanner_pg/src/backend/access/index/indexam.c +++ b/third_party/spanner_pg/src/backend/access/index/indexam.c @@ -3,7 +3,7 @@ * indexam.c * general index access method routines * - * 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 * * @@ -107,6 +107,7 @@ do { \ static IndexScanDesc index_beginscan_internal(Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot, ParallelIndexScanDesc pscan, bool temp_snap); +static inline void validate_relation_kind(Relation r); /* ---------------------------------------------------------------- @@ -135,12 +136,30 @@ index_open(Oid relationId, LOCKMODE lockmode) r = relation_open(relationId, lockmode); - if (r->rd_rel->relkind != RELKIND_INDEX && - r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not an index", - RelationGetRelationName(r)))); + validate_relation_kind(r); + + return r; +} + +/* ---------------- + * try_index_open - open a index relation by relation OID + * + * Same as index_open, except return NULL instead of failing + * if the relation does not exist. + * ---------------- + */ +Relation +try_index_open(Oid relationId, LOCKMODE lockmode) +{ + Relation r; + + r = try_relation_open(relationId, lockmode); + + /* leave if index does not exist */ + if (!r) + return NULL; + + validate_relation_kind(r); return r; } @@ -168,6 +187,24 @@ index_close(Relation relation, LOCKMODE lockmode) UnlockRelationId(&relid, lockmode); } +/* ---------------- + * validate_relation_kind - check the relation's kind + * + * Make sure relkind is an index or a partitioned index. + * ---------------- + */ +static inline void +validate_relation_kind(Relation r) +{ + if (r->rd_rel->relkind != RELKIND_INDEX && + r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not an index", + RelationGetRelationName(r)))); +} + + /* ---------------- * index_insert - insert an index tuple into a relation * ---------------- diff --git a/third_party/spanner_pg/src/backend/access/nbtree/README b/third_party/spanner_pg/src/backend/access/nbtree/README index bfe33b6b..5529afc1 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/README +++ b/third_party/spanner_pg/src/backend/access/nbtree/README @@ -166,53 +166,40 @@ that the incoming item doesn't fit on the split page where it needs to go! Deleting index tuples during VACUUM ----------------------------------- -Before deleting a leaf item, we get a super-exclusive lock on the target +Before deleting a leaf item, we get a full cleanup lock on the target page, so that no other backend has a pin on the page when the deletion starts. This is not necessary for correctness in terms of the btree index operations themselves; as explained above, index scans logically stop "between" pages and so can't lose their place. The reason we do it is to -provide an interlock between VACUUM and indexscans. Since VACUUM deletes -index entries before reclaiming heap tuple line pointers, the -super-exclusive lock guarantees that VACUUM can't reclaim for re-use a -line pointer that an indexscanning process might be about to visit. This -guarantee works only for simple indexscans that visit the heap in sync -with the index scan, not for bitmap scans. We only need the guarantee -when using non-MVCC snapshot rules; when using an MVCC snapshot, it -doesn't matter if the heap tuple is replaced with an unrelated tuple at -the same TID, because the new tuple won't be visible to our scan anyway. -Therefore, a scan using an MVCC snapshot which has no other confounding -factors will not hold the pin after the page contents are read. The -current reasons for exceptions, where a pin is still needed, are if the -index is not WAL-logged or if the scan is an index-only scan. If later -work allows the pin to be dropped for all cases we will be able to -simplify the vacuum code, since the concept of a super-exclusive lock -for btree indexes will no longer be needed. +provide an interlock between VACUUM and index scans that are not prepared +to deal with concurrent TID recycling when visiting the heap. Since only +VACUUM can ever mark pointed-to items LP_UNUSED in the heap, and since +this only ever happens _after_ btbulkdelete returns, having index scans +hold on to the pin (used when reading from the leaf page) until _after_ +they're done visiting the heap (for TIDs from pinned leaf page) prevents +concurrent TID recycling. VACUUM cannot get a conflicting cleanup lock +until the index scan is totally finished processing its leaf page. + +This approach is fairly coarse, so we avoid it whenever possible. In +practice most index scans won't hold onto their pin, and so won't block +VACUUM. These index scans must deal with TID recycling directly, which is +more complicated and not always possible. See later section on making +concurrent TID recycling safe. + +Opportunistic index tuple deletion performs almost the same page-level +modifications while only holding an exclusive lock. This is safe because +there is no question of TID recycling taking place later on -- only VACUUM +can make TIDs recyclable. See also simple deletion and bottom-up +deletion, below. Because a pin is not always held, and a page can be split even while someone does hold a pin on it, it is possible that an indexscan will return items that are no longer stored on the page it has a pin on, but rather somewhere to the right of that page. To ensure that VACUUM can't -prematurely remove such heap tuples, we require btbulkdelete to obtain a -super-exclusive lock on every leaf page in the index, even pages that -don't contain any deletable tuples. Any scan which could yield incorrect -results if the tuple at a TID matching the scan's range and filter -conditions were replaced by a different tuple while the scan is in -progress must hold the pin on each index page until all index entries read -from the page have been processed. This guarantees that the btbulkdelete -call cannot return while any indexscan is still holding a copy of a -deleted index tuple if the scan could be confused by that. Note that this -requirement does not say that btbulkdelete must visit the pages in any -particular order. (See also simple deletion and bottom-up deletion, -below.) - -There is no such interlocking for deletion of items in internal pages, -since backends keep no lock nor pin on a page they have descended past. -Hence, when a backend is ascending the tree using its stack, it must -be prepared for the possibility that the item it wants is to the left of -the recorded position (but it can't have moved left out of the recorded -page). Since we hold a lock on the lower page (per L&Y) until we have -re-found the parent item that links to it, we can be assured that the -parent item does still exist and can't have been deleted. +prematurely make TIDs recyclable in this scenario, we require btbulkdelete +to obtain a cleanup lock on every leaf page in the index, even pages that +don't contain any deletable tuples. Note that this requirement does not +say that btbulkdelete must visit the pages in any particular order. VACUUM's linear scan, concurrent page splits -------------------------------------------- @@ -453,6 +440,55 @@ whenever it is subsequently taken from the FSM for reuse. The deleted page's contents will be overwritten by the split operation (it will become the new right sibling page). +Making concurrent TID recycling safe +------------------------------------ + +As explained in the earlier section about deleting index tuples during +VACUUM, we implement a locking protocol that allows individual index scans +to avoid concurrent TID recycling. Index scans opt-out (and so drop their +leaf page pin when visiting the heap) whenever it's safe to do so, though. +Dropping the pin early is useful because it avoids blocking progress by +VACUUM. This is particularly important with index scans used by cursors, +since idle cursors sometimes stop for relatively long periods of time. In +extreme cases, a client application may hold on to an idle cursors for +hours or even days. Blocking VACUUM for that long could be disastrous. + +Index scans that don't hold on to a buffer pin are protected by holding an +MVCC snapshot instead. This more limited interlock prevents wrong answers +to queries, but it does not prevent concurrent TID recycling itself (only +holding onto the leaf page pin while accessing the heap ensures that). + +Index-only scans can never drop their buffer pin, since they are unable to +tolerate having a referenced TID become recyclable. Index-only scans +typically just visit the visibility map (not the heap proper), and so will +not reliably notice that any stale TID reference (for a TID that pointed +to a dead-to-all heap item at first) was concurrently marked LP_UNUSED in +the heap by VACUUM. This could easily allow VACUUM to set the whole heap +page to all-visible in the visibility map immediately afterwards. An MVCC +snapshot is only sufficient to avoid problems during plain index scans +because they must access granular visibility information from the heap +proper. A plain index scan will even recognize LP_UNUSED items in the +heap (items that could be recycled but haven't been just yet) as "not +visible" -- even when the heap page is generally considered all-visible. + +LP_DEAD setting of index tuples by the kill_prior_tuple optimization +(described in full in simple deletion, below) is also more complicated for +index scans that drop their leaf page pins. We must be careful to avoid +LP_DEAD-marking any new index tuple that looks like a known-dead index +tuple because it happens to share the same TID, following concurrent TID +recycling. It's just about possible that some other session inserted a +new, unrelated index tuple, on the same leaf page, which has the same +original TID. It would be totally wrong to LP_DEAD-set this new, +unrelated index tuple. + +We handle this kill_prior_tuple race condition by having affected index +scans conservatively assume that any change to the leaf page at all +implies that it was reached by btbulkdelete in the interim period when no +buffer pin was held. This is implemented by not setting any LP_DEAD bits +on the leaf page at all when the page's LSN has changed. (That won't work +with an unlogged index, so for now we don't ever apply the "don't hold +onto pin" optimization there.) + Fastpath For Index Insertion ---------------------------- @@ -490,40 +526,33 @@ lock on the leaf page). Once an index tuple has been marked LP_DEAD it can actually be deleted from the index immediately; since index scans only stop "between" pages, no scan can lose its place from such a deletion. We separate the steps -because we allow LP_DEAD to be set with only a share lock (it's exactly -like a hint bit for a heap tuple), but physically removing tuples requires -exclusive lock. Also, delaying the deletion often allows us to pick up -extra index tuples that weren't initially safe for index scans to mark -LP_DEAD. We do this with index tuples whose TIDs point to the same table -blocks as an LP_DEAD-marked tuple. They're practically free to check in -passing, and have a pretty good chance of being safe to delete due to -various locality effects. - -We only try to delete LP_DEAD tuples (and nearby tuples) when we are -otherwise faced with having to split a page to do an insertion (and hence -have exclusive lock on it already). Deduplication and bottom-up index -deletion can also prevent a page split, but simple deletion is always our -preferred approach. (Note that posting list tuples can only have their -LP_DEAD bit set when every table TID within the posting list is known -dead. This isn't much of a problem in practice because LP_DEAD bits are -just a starting point for simple deletion -- we still manage to perform -granular deletes of posting list TIDs quite often.) - -It's sufficient to have an exclusive lock on the index page, not a -super-exclusive lock, to do deletion of LP_DEAD items. It might seem -that this breaks the interlock between VACUUM and indexscans, but that is -not so: as long as an indexscanning process has a pin on the page where -the index item used to be, VACUUM cannot complete its btbulkdelete scan -and so cannot remove the heap tuple. This is another reason why -btbulkdelete has to get a super-exclusive lock on every leaf page, not only -the ones where it actually sees items to delete. - -LP_DEAD setting by index scans cannot be sure that a TID whose index tuple -it had planned on LP_DEAD-setting has not been recycled by VACUUM if it -drops its pin in the meantime. It must conservatively also remember the -LSN of the page, and only act to set LP_DEAD bits when the LSN has not -changed at all. (Avoiding dropping the pin entirely also makes it safe, of -course.) +because we allow LP_DEAD to be set with only a share lock (it's like a +hint bit for a heap tuple), but physically deleting tuples requires an +exclusive lock. We also need to generate a latestRemovedXid value for +each deletion operation's WAL record, which requires additional +coordinating with the tableam when the deletion actually takes place. +(This latestRemovedXid value may be used to generate a recovery conflict +during subsequent REDO of the record by a standby.) + +Delaying and batching index tuple deletion like this enables a further +optimization: opportunistic checking of "extra" nearby index tuples +(tuples that are not LP_DEAD-set) when they happen to be very cheap to +check in passing (because we already know that the tableam will be +visiting their table block to generate a latestRemovedXid value). Any +index tuples that turn out to be safe to delete will also be deleted. +Simple deletion will behave as if the extra tuples that actually turn +out to be delete-safe had their LP_DEAD bits set right from the start. + +Deduplication can also prevent a page split, but index tuple deletion is +our preferred approach. Note that posting list tuples can only have +their LP_DEAD bit set when every table TID within the posting list is +known dead. This isn't much of a problem in practice because LP_DEAD +bits are just a starting point for deletion. What really matters is +that _some_ deletion operation that targets related nearby-in-table TIDs +takes place at some point before the page finally splits. That's all +that's required for the deletion process to perform granular removal of +groups of dead TIDs from posting list tuples (without the situation ever +being allowed to get out of hand). Bottom-Up deletion ------------------ @@ -724,23 +753,21 @@ because it allows running applications to continue while the standby changes state into a normally running server. The interlocking required to avoid returning incorrect results from -non-MVCC scans is not required on standby nodes. We still get a -super-exclusive lock ("cleanup lock") when replaying VACUUM records -during recovery, but recovery does not need to lock every leaf page -(only those leaf pages that have items to delete). That is safe because -HeapTupleSatisfiesUpdate(), HeapTupleSatisfiesSelf(), -HeapTupleSatisfiesDirty() and HeapTupleSatisfiesVacuum() are only ever -used during write transactions, which cannot exist on the standby. MVCC -scans are already protected by definition, so HeapTupleSatisfiesMVCC() -is not a problem. The optimizer looks at the boundaries of value ranges -using HeapTupleSatisfiesNonVacuumable() with an index-only scan, which -is also safe. That leaves concern only for HeapTupleSatisfiesToast(). - -HeapTupleSatisfiesToast() doesn't use MVCC semantics, though that's -because it doesn't need to - if the main heap row is visible then the -toast rows will also be visible. So as long as we follow a toast -pointer from a visible (live) tuple the corresponding toast rows -will also be visible, so we do not need to recheck MVCC on them. +non-MVCC scans is not required on standby nodes. We still get a full +cleanup lock when replaying VACUUM records during recovery, but recovery +does not need to lock every leaf page (only those leaf pages that have +items to delete) -- that's sufficient to avoid breaking index-only scans +during recovery (see section above about making TID recycling safe). That +leaves concern only for plain index scans. (XXX: Not actually clear why +this is totally unnecessary during recovery.) + +MVCC snapshot plain index scans are always safe, for the same reasons that +they're safe during original execution. HeapTupleSatisfiesToast() doesn't +use MVCC semantics, though that's because it doesn't need to - if the main +heap row is visible then the toast rows will also be visible. So as long +as we follow a toast pointer from a visible (live) tuple the corresponding +toast rows will also be visible, so we do not need to recheck MVCC on +them. Other Things That Are Handy to Know ----------------------------------- diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtcompare.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtcompare.c index 7ac73cb8..7e18e2fc 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtcompare.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtcompare.c @@ -3,7 +3,7 @@ * nbtcompare.c * Comparison functions for btree access method. * - * 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 * * @@ -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); } +#if SIZEOF_DATUM < 8 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); +#if SIZEOF_DATUM >= 8 + ssup->comparator = ssup_datum_signed_cmp; +#else ssup->comparator = btint8fastcmp; +#endif PG_RETURN_VOID(); } diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtdedup.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtdedup.c index 1cd1b59e..0207421a 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtdedup.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtdedup.c @@ -3,7 +3,7 @@ * nbtdedup.c * Deduplicate or bottom-up delete items in Postgres btrees. * - * 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 * * @@ -16,6 +16,7 @@ #include "access/nbtree.h" #include "access/nbtxlog.h" +#include "access/xloginsert.h" #include "miscadmin.h" #include "utils/rel.h" @@ -61,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 PG_USED_FOR_ASSERTS_ONLY = 0; @@ -230,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; } @@ -309,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; @@ -348,6 +349,8 @@ _bt_bottomupdel_pass(Relation rel, Buffer buf, Relation heapRel, * concerning ourselves with avoiding work during the tableam call. Our * role in costing the bottom-up deletion process is strictly advisory. */ + delstate.irel = rel; + delstate.iblknum = BufferGetBlockNumber(buf); delstate.bottomup = true; delstate.bottomupfreespace = Max(BLCKSZ / 16, newitemsz); delstate.ndeltids = 0; diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtinsert.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtinsert.c index 1241c562..f6f4af8b 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtinsert.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtinsert.c @@ -3,7 +3,7 @@ * nbtinsert.c * Item insertion in Lehman and Yao btrees for Postgres. * - * 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 * * @@ -19,6 +19,7 @@ #include "access/nbtxlog.h" #include "access/transam.h" #include "access/xloginsert.h" +#include "common/pg_prng.h" #include "lib/qunique.h" #include "miscadmin.h" #include "storage/lmgr.h" @@ -328,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 @@ -397,9 +398,9 @@ _bt_search_insert(Relation rel, BTInsertState insertstate) * _bt_findinsertloc() to reuse most of the binary search work we do * here. * - * Do not call here when there are NULL values in scan key. NULL should be - * considered unequal to NULL when checking for duplicates, but we are not - * prepared to handle that correctly. + * This code treats NULLs as equal, unlike the default semantics for unique + * indexes. So do not call here when there are NULL values in scan key and + * the index uses the default NULLS DISTINCT mode. */ static TransactionId _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel, @@ -427,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); /* @@ -732,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)) @@ -807,9 +808,6 @@ _bt_check_unique(Relation rel, BTInsertState insertstate, Relation heapRel, * If insertstate contains cached binary search bounds, we will take * advantage of them. This avoids repeating comparisons that we made in * _bt_check_unique() already. - * - * If there is not enough room on the page for the new tuple, we try to - * make room by removing any LP_DEAD tuples. */ static OffsetNumber _bt_findinsertloc(Relation rel, @@ -824,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))) @@ -890,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; } @@ -968,13 +966,13 @@ _bt_findinsertloc(Relation rel, if (P_RIGHTMOST(opaque) || _bt_compare(rel, itup_key, page, P_HIKEY) != 0 || - random() <= (MAX_RANDOM_VALUE / 100)) + pg_prng_uint32(&pg_global_prng_state) <= (PG_UINT32_MAX / 100)) break; _bt_stepright(rel, insertstate, stack); /* Update local state after stepping right */ page = BufferGetPage(insertstate->buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); } } @@ -1032,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; @@ -1040,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 @@ -1122,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); @@ -1298,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; @@ -1506,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); @@ -1542,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 @@ -1718,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 @@ -1889,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)); @@ -1954,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); @@ -2141,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 @@ -2232,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; @@ -2244,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) @@ -2322,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)) { @@ -2453,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); @@ -2494,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 */ @@ -2682,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); @@ -2813,6 +2811,8 @@ _bt_simpledel_pass(Relation rel, Buffer buffer, Relation heapRel, &ndeadblocks); /* Initialize tableam state that describes index deletion operation */ + delstate.irel = rel; + delstate.iblknum = BufferGetBlockNumber(buffer); delstate.bottomup = false; delstate.bottomupfreespace = 0; delstate.ndeltids = 0; diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtpage.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtpage.c index 7c9412aa..822e2896 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtpage.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtpage.c @@ -4,7 +4,7 @@ * BTree-specific page management code for the Postgres btree access * method. * - * 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 * * @@ -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; @@ -1115,8 +1115,7 @@ _bt_conditionallockbuf(Relation rel, Buffer buf) } /* - * _bt_upgradelockbufcleanup() -- upgrade lock to super-exclusive/cleanup - * lock. + * _bt_upgradelockbufcleanup() -- upgrade lock to a full cleanup lock. */ void _bt_upgradelockbufcleanup(Relation rel, Buffer buf) @@ -1147,7 +1146,7 @@ _bt_pageinit(Page page, Size size) /* * Delete item(s) from a btree leaf page during VACUUM. * - * This routine assumes that the caller has a super-exclusive write lock on + * This routine assumes that the caller already has a full cleanup lock on * the buffer. Also, the given deletable and updatable arrays *must* be * sorted in ascending order. * @@ -1197,7 +1196,7 @@ _bt_delitems_vacuum(Relation rel, Buffer buf, * * PageIndexTupleOverwrite() won't unset each item's LP_DEAD bit when it * happens to already be set. It's important that we not interfere with - * _bt_delitems_delete(). + * any future simple index tuple deletion operations. */ for (int i = 0; i < nupdatable; i++) { @@ -1221,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; /* @@ -1230,7 +1229,7 @@ _bt_delitems_vacuum(Relation rel, Buffer buf, * This flag indicates the presence of LP_DEAD items on the page (though * not reliably). Note that we only rely on it with pg_upgrade'd * !heapkeyspace indexes. That's why clearing it here won't usually - * interfere with _bt_delitems_delete(). + * interfere with simple index tuple deletion. */ opaque->btpo_flags &= ~BTP_HAS_GARBAGE; @@ -1339,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. @@ -1719,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 @@ -1774,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); @@ -1843,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 @@ -2100,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) && @@ -2149,7 +2148,7 @@ _bt_mark_page_halfdead(Relation rel, Buffer leafbuf, BTStack stack) return false; page = BufferGetPage(subtreeparent); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); #ifdef USE_ASSERT_CHECKING @@ -2210,7 +2209,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); @@ -2225,7 +2224,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); @@ -2262,7 +2261,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; @@ -2334,7 +2333,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)); @@ -2373,7 +2372,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); @@ -2400,7 +2399,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; @@ -2448,7 +2447,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 @@ -2457,7 +2456,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 @@ -2512,7 +2511,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); /* * Validate target's right sibling page. Its left link must point back to @@ -2562,7 +2561,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 */ @@ -2599,12 +2598,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; @@ -2633,7 +2632,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)); /* @@ -2850,7 +2849,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/third_party/spanner_pg/src/backend/access/nbtree/nbtree.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtree.c index 64ebf58f..91280083 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtree.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtree.c @@ -8,7 +8,7 @@ * This file contains only the public interface routines. * * - * 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 * * IDENTIFICATION @@ -22,6 +22,7 @@ #include "access/nbtxlog.h" #include "access/relscan.h" #include "access/xlog.h" +#include "access/xloginsert.h" #include "commands/progress.h" #include "commands/vacuum.h" #include "miscadmin.h" @@ -159,7 +160,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); @@ -964,11 +965,10 @@ btvacuumscan(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, * recycled. Taking the lock synchronizes things enough to prevent a * problem: either num_pages won't include the new page, or _bt_getbuf * already has write lock on the buffer and it will be fully initialized - * before we can examine it. (See also vacuumlazy.c, which has the same - * issue.) Also, we need not worry if a page is added immediately after - * we look; the page splitting code already has write-lock on the left - * page before it adds a right page, so we must already have processed any - * tuples due to be moved into such a page. + * before we can examine it. Also, we need not worry if a page is added + * immediately after we look; the page splitting code already has + * write-lock on the left page before it adds a right page, so we must + * already have processed any tuples due to be moved into such a page. * * We can skip locking for new or temp relations, however, since no one * else could be accessing them. @@ -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); @@ -1161,9 +1161,9 @@ btvacuumpage(BTVacState *vstate, BlockNumber scanblkno) nhtidslive; /* - * Trade in the initial read lock for a super-exclusive write lock on - * this page. We must get such a lock on every leaf page over the - * course of the vacuum scan, whether or not it actually contains any + * Trade in the initial read lock for a full cleanup lock on this + * page. We must get such a lock on every leaf page over the course + * of the vacuum scan, whether or not it actually contains any * deletable tuples --- see nbtree/README. */ _bt_upgradelockbufcleanup(rel, buf); @@ -1184,12 +1184,6 @@ btvacuumpage(BTVacState *vstate, BlockNumber scanblkno) opaque->btpo_next < scanblkno) backtrack_to = opaque->btpo_next; - /* - * When each VACUUM begins, it determines an OldestXmin cutoff value. - * Tuples before the cutoff are removed by VACUUM. Scan over all - * items to see which ones need to be deleted according to cutoff - * point using callback. - */ ndeletable = 0; nupdatable = 0; minoff = P_FIRSTDATAKEY(opaque); @@ -1198,6 +1192,7 @@ btvacuumpage(BTVacState *vstate, BlockNumber scanblkno) nhtidslive = 0; if (callback) { + /* btbulkdelete callback tells us what to delete (or update) */ for (offnum = minoff; offnum <= maxoff; offnum = OffsetNumberNext(offnum)) @@ -1207,26 +1202,6 @@ btvacuumpage(BTVacState *vstate, BlockNumber scanblkno) itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); - /* - * Hot Standby assumes that it's okay that XLOG_BTREE_VACUUM - * records do not produce their own conflicts. This is safe - * as long as the callback function only considers whether the - * index tuple refers to pre-cutoff heap tuples that were - * certainly already pruned away during VACUUM's initial heap - * scan by the time we get here. (heapam's XLOG_HEAP2_PRUNE - * records produce conflicts using a latestRemovedXid value - * for the pointed-to heap tuples, so there is no need to - * produce our own conflict now.) - * - * Backends with snapshots acquired after a VACUUM starts but - * before it finishes could have visibility cutoff with a - * later xid than VACUUM's OldestXmin cutoff. These backends - * might happen to opportunistically mark some index tuples - * LP_DEAD before we reach them, even though they may be after - * our cutoff. We don't try to kill these "extra" index - * tuples in _bt_delitems_vacuum(). This keep things simple, - * and allows us to always avoid generating our own conflicts. - */ Assert(!BTreeTupleIsPivot(itup)); if (!BTreeTupleIsPosting(itup)) { diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtsearch.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtsearch.c index 8f5edf28..3947f8a2 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtsearch.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtsearch.c @@ -4,7 +4,7 @@ * Search code for postgres btrees. * * - * 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 * * IDENTIFICATION @@ -53,16 +53,11 @@ static inline void _bt_initialize_more_data(BTScanOpaque so, ScanDirection dir); /* * _bt_drop_lock_and_maybe_pin() * - * Unlock the buffer; and if it is safe to release the pin, do that, too. It - * is safe if the scan is using an MVCC snapshot and the index is WAL-logged. + * Unlock the buffer; and if it is safe to release the pin, do that, too. * This will prevent vacuum from stalling in a blocked state trying to read a - * page when a cursor is sitting on it -- at least in many important cases. + * page when a cursor is sitting on it. * - * Set the buffer to invalid if the pin is released, since the buffer may be - * re-used. If we need to go back to this block (for example, to apply - * LP_DEAD hints) we must get a fresh reference to the buffer. Hopefully it - * will remain in shared memory for as long as it takes to scan the index - * buffer page. + * See nbtree/README section on making concurrent TID recycling safe. */ static void _bt_drop_lock_and_maybe_pin(IndexScanDesc scan, BTScanPos sp) @@ -142,7 +137,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; @@ -276,7 +271,7 @@ _bt_moveright(Relation rel, { page = BufferGetPage(buf); TestForOldSnapshot(snapshot, rel, page); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); if (P_RIGHTMOST(opaque)) break; @@ -355,7 +350,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); @@ -459,7 +454,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); @@ -667,7 +662,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; @@ -1556,7 +1551,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) @@ -2027,7 +2022,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)) { @@ -2130,7 +2125,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); @@ -2211,7 +2206,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) BTPageOpaque opaque; page = BufferGetPage(buf); - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); for (;;) { @@ -2236,7 +2231,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 @@ -2263,14 +2258,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)) { /* @@ -2288,7 +2283,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; } @@ -2349,7 +2344,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 (;;) { @@ -2369,7 +2364,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? */ @@ -2392,7 +2387,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; @@ -2438,7 +2433,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/third_party/spanner_pg/src/backend/access/nbtree/nbtsort.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtsort.c index 1e02be97..9f60fa98 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtsort.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtsort.c @@ -34,7 +34,7 @@ * This code isn't concerned about the FSM at all. The caller is responsible * for initializing that. * - * 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 * * IDENTIFICATION @@ -89,6 +89,7 @@ typedef struct BTSpool Relation heap; Relation index; bool isunique; + bool nulls_not_distinct; } BTSpool; /* @@ -106,6 +107,7 @@ typedef struct BTShared Oid heaprelid; Oid indexrelid; bool isunique; + bool nulls_not_distinct; bool isconcurrent; int scantuplesortstates; @@ -206,6 +208,7 @@ typedef struct BTLeader typedef struct BTBuildState { bool isunique; + bool nulls_not_distinct; bool havedead; Relation heap; BTSpool *spool; @@ -307,6 +310,7 @@ btbuild(Relation heap, Relation index, IndexInfo *indexInfo) #endif /* BTREE_BUILD_STATS */ buildstate.isunique = indexInfo->ii_Unique; + buildstate.nulls_not_distinct = indexInfo->ii_NullsNotDistinct; buildstate.havedead = false; buildstate.heap = heap; buildstate.spool = NULL; @@ -380,6 +384,7 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate, btspool->heap = heap; btspool->index = index; btspool->isunique = indexInfo->ii_Unique; + btspool->nulls_not_distinct = indexInfo->ii_NullsNotDistinct; /* Save as primary spool */ buildstate->spool = btspool; @@ -429,8 +434,9 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate, */ buildstate->spool->sortstate = 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 @@ -468,8 +474,8 @@ _bt_spools_heapscan(Relation heap, Relation index, BTBuildState *buildstate, * full, so we give it only work_mem */ buildstate->spool2->sortstate = - tuplesort_begin_index_btree(heap, index, false, work_mem, - coordinate2, false); + tuplesort_begin_index_btree(heap, index, false, false, work_mem, + coordinate2, TUPLESORT_NONE); } /* Fill spool using either serial or parallel heap scan */ @@ -619,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; @@ -994,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); @@ -1011,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; @@ -1119,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. @@ -1554,6 +1560,7 @@ _bt_begin_parallel(BTBuildState *buildstate, bool isconcurrent, int request) btshared->heaprelid = RelationGetRelid(btspool->heap); btshared->indexrelid = RelationGetRelid(btspool->index); btshared->isunique = btspool->isunique; + btshared->nulls_not_distinct = btspool->nulls_not_distinct; btshared->isconcurrent = isconcurrent; btshared->scantuplesortstates = scantuplesortstates; ConditionVariableInit(&btshared->workersdonecv); @@ -1747,6 +1754,7 @@ _bt_leader_participate_as_worker(BTBuildState *buildstate) leaderworker->heap = buildstate->spool->heap; leaderworker->index = buildstate->spool->index; leaderworker->isunique = buildstate->spool->isunique; + leaderworker->nulls_not_distinct = buildstate->spool->nulls_not_distinct; /* Initialize second spool, if required */ if (!btleader->btshared->isunique) @@ -1846,6 +1854,7 @@ _bt_parallel_build_main(dsm_segment *seg, shm_toc *toc) btspool->heap = heapRel; btspool->index = indexRel; btspool->isunique = btshared->isunique; + btspool->nulls_not_distinct = btshared->nulls_not_distinct; /* Look up shared state private to tuplesort.c */ sharedsort = shm_toc_lookup(toc, PARALLEL_KEY_TUPLESORT, false); @@ -1928,8 +1937,9 @@ _bt_parallel_scan_and_sort(BTSpool *btspool, BTSpool *btspool2, btspool->sortstate = tuplesort_begin_index_btree(btspool->heap, btspool->index, 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 @@ -1950,13 +1960,14 @@ _bt_parallel_scan_and_sort(BTSpool *btspool, BTSpool *btspool2, coordinate2->nParticipants = -1; coordinate2->sharedsort = sharedsort2; btspool2->sortstate = - tuplesort_begin_index_btree(btspool->heap, btspool->index, false, + tuplesort_begin_index_btree(btspool->heap, btspool->index, false, false, Min(sortmem, work_mem), coordinate2, false); } /* Fill in buildstate for _bt_build_callback() */ buildstate.isunique = btshared->isunique; + buildstate.nulls_not_distinct = btshared->nulls_not_distinct; buildstate.havedead = false; buildstate.heap = btspool->heap; buildstate.spool = btspool; diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtsplitloc.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtsplitloc.c index 3485e93e..241e26d3 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtsplitloc.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtsplitloc.c @@ -3,7 +3,7 @@ * nbtsplitloc.c * Choose split point code for Postgres btree implementation. * - * 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 * * @@ -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 @@ -152,7 +151,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/third_party/spanner_pg/src/backend/access/nbtree/nbtutils.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtutils.c index 3086e2af..19010aa4 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtutils.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtutils.c @@ -3,7 +3,7 @@ * nbtutils.c * Utility code for Postgres btree implementation. * - * 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 * * @@ -167,6 +167,13 @@ _bt_mkscankey(Relation rel, IndexTuple itup) key->anynullkeys = true; } + /* + * In NULLS NOT DISTINCT mode, we pretend that there are no null keys, so + * that full uniqueness check is done. + */ + if (rel->rd_index->indnullsnotdistinct) + key->anynullkeys = false; + return key; } @@ -1784,7 +1791,7 @@ _bt_killitems(IndexScanDesc scan) } } - opaque = (BTPageOpaque) PageGetSpecialPointer(page); + opaque = BTPageGetOpaque(page); minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); @@ -2126,14 +2133,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)); - } /* @@ -2484,7 +2489,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; @@ -2601,7 +2606,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) */ @@ -2672,7 +2676,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)); @@ -2710,23 +2714,11 @@ _bt_allequalimage(Relation rel, bool debugmessage) { bool allequalimage = true; - /* INCLUDE indexes don't support deduplication */ + /* INCLUDE indexes can never support deduplication */ if (IndexRelationGetNumberOfAttributes(rel) != IndexRelationGetNumberOfKeyAttributes(rel)) return false; - /* - * There is no special reason why deduplication cannot work with system - * relations (i.e. with system catalog indexes and TOAST indexes). We - * deem deduplication unsafe for these indexes all the same, since the - * alternative is to force users to always use deduplication, without - * being able to opt out. (ALTER INDEX is not supported with system - * indexes, so users would have no way to set the deduplicate_items - * storage parameter to 'off'.) - */ - if (IsSystemRelation(rel)) - return false; - for (int i = 0; i < IndexRelationGetNumberOfKeyAttributes(rel); i++) { Oid opfamily = rel->rd_opfamily[i]; @@ -2750,10 +2742,6 @@ _bt_allequalimage(Relation rel, bool debugmessage) } } - /* - * Don't elog() until here to avoid reporting on a system relation index - * or an INCLUDE index - */ if (debugmessage) { if (allequalimage) diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtvalidate.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtvalidate.c index b6f729d4..d7d58eca 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtvalidate.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtvalidate.c @@ -3,7 +3,7 @@ * nbtvalidate.c * Opclass validator for btree. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/nbtree/nbtxlog.c b/third_party/spanner_pg/src/backend/access/nbtree/nbtxlog.c index 786c08c0..f9186ca2 100644 --- a/third_party/spanner_pg/src/backend/access/nbtree/nbtxlog.c +++ b/third_party/spanner_pg/src/backend/access/nbtree/nbtxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for btrees. * * - * 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 * * IDENTIFICATION @@ -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; @@ -267,7 +267,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState *record) XLogRecGetBlockTag(record, 0, NULL, NULL, &origpagenumber); XLogRecGetBlockTag(record, 1, NULL, NULL, &rightpagenumber); - if (!XLogRecGetBlockTag(record, 2, NULL, NULL, &spagenumber)) + if (!XLogRecGetBlockTagExtended(record, 2, NULL, NULL, &spagenumber, NULL)) spagenumber = P_NONE; /* @@ -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/third_party/spanner_pg/src/backend/access/rmgrdesc/brindesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/brindesc.c index b6265a49..f05607e6 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/brindesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/brindesc.c @@ -3,7 +3,7 @@ * brindesc.c * rmgr descriptor routines for BRIN indexes * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/clogdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/clogdesc.c index b12f43a1..87513732 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/clogdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/clogdesc.c @@ -3,7 +3,7 @@ * clogdesc.c * rmgr descriptor routines for access/transam/clog.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/committsdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/committsdesc.c index 26bad44b..3a65538b 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/committsdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/committsdesc.c @@ -3,7 +3,7 @@ * committsdesc.c * rmgr descriptor routines for access/transam/commit_ts.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/dbasedesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/dbasedesc.c index 26609845..523d0b3c 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/dbasedesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/dbasedesc.c @@ -3,7 +3,7 @@ * dbasedesc.c * rmgr descriptor routines for commands/dbcommands.c * - * 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 * * @@ -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/third_party/spanner_pg/src/backend/access/rmgrdesc/genericdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/genericdesc.c index 7242d0d2..877beb54 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/genericdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/genericdesc.c @@ -4,7 +4,7 @@ * rmgr descriptor routines for access/transam/generic_xlog.c * * - * 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 * * src/backend/access/rmgrdesc/genericdesc.c diff --git a/third_party/spanner_pg/src/backend/access/rmgrdesc/gindesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/gindesc.c index ee9e69cd..57f7bce8 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/gindesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/gindesc.c @@ -3,7 +3,7 @@ * gindesc.c * rmgr descriptor routines for access/transam/gin/ginxlog.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/gistdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/gistdesc.c index 8ae31126..d0c8e247 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/gistdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/gistdesc.c @@ -3,7 +3,7 @@ * gistdesc.c * rmgr descriptor routines for access/gist/gistxlog.c * - * 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 * * @@ -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/third_party/spanner_pg/src/backend/access/rmgrdesc/hashdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/hashdesc.c index 90ccea08..ef443bdb 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/hashdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/hashdesc.c @@ -3,7 +3,7 @@ * hashdesc.c * rmgr descriptor routines for access/hash/hash.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/heapdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/heapdesc.c index 5c29fd9e..6238085d 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/heapdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/heapdesc.c @@ -3,7 +3,7 @@ * heapdesc.c * rmgr descriptor routines for access/heap/heapam.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/logicalmsgdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/logicalmsgdesc.c index dee440f7..08e03aa3 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/logicalmsgdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/logicalmsgdesc.c @@ -3,7 +3,7 @@ * logicalmsgdesc.c * rmgr descriptor routines for replication/logical/message.c * - * Portions Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2015-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/rmgrdesc/mxactdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/mxactdesc.c index 8c37690e..7076be2b 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/mxactdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/mxactdesc.c @@ -3,7 +3,7 @@ * mxactdesc.c * rmgr descriptor routines for access/transam/multixact.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/nbtdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/nbtdesc.c index 710efbd3..dfbbf4eb 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/nbtdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/nbtdesc.c @@ -3,7 +3,7 @@ * nbtdesc.c * rmgr descriptor routines for access/nbtree/nbtxlog.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/relmapdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/relmapdesc.c index 2f9d4f54..43d63eb9 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/relmapdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/relmapdesc.c @@ -3,7 +3,7 @@ * relmapdesc.c * rmgr descriptor routines for utils/cache/relmapper.c * - * 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 * * @@ -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/third_party/spanner_pg/src/backend/access/rmgrdesc/replorigindesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/replorigindesc.c index 1f314c47..e3213b10 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/replorigindesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/replorigindesc.c @@ -3,7 +3,7 @@ * replorigindesc.c * rmgr descriptor routines for replication/logical/origin.c * - * Portions Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2015-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/rmgrdesc/seqdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/seqdesc.c index 0bd29468..d9b1e605 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/seqdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/seqdesc.c @@ -3,7 +3,7 @@ * seqdesc.c * rmgr descriptor routines for commands/sequence.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/smgrdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/smgrdesc.c index 7755553d..75478132 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/smgrdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/smgrdesc.c @@ -3,7 +3,7 @@ * smgrdesc.c * rmgr descriptor routines for catalog/storage.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/spgdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/spgdesc.c index 0fefe386..d5d921a4 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/spgdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/spgdesc.c @@ -3,7 +3,7 @@ * spgdesc.c * rmgr descriptor routines for access/spgist/spgxlog.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/standbydesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/standbydesc.c index 01ee7ac6..2dba39e3 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/standbydesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/standbydesc.c @@ -3,7 +3,7 @@ * standbydesc.c * rmgr descriptor routines for storage/ipc/standby.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/tblspcdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/tblspcdesc.c index cb356eaa..ed94b6e2 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/tblspcdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/tblspcdesc.c @@ -3,7 +3,7 @@ * tblspcdesc.c * rmgr descriptor routines for commands/tablespace.c * - * 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/third_party/spanner_pg/src/backend/access/rmgrdesc/xactdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/xactdesc.c index 4b0d10f0..90b6ac28 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/xactdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/xactdesc.c @@ -3,7 +3,7 @@ * xactdesc.c * rmgr descriptor routines for access/transam/xact.c * - * 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 * * @@ -16,6 +16,7 @@ #include "access/transam.h" #include "access/xact.h" +#include "replication/origin.h" #include "storage/sinval.h" #include "storage/standbydefs.h" #include "utils/timestamp.h" @@ -83,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; @@ -178,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; @@ -243,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)); } @@ -279,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, " %d/%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) { @@ -294,11 +342,15 @@ 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, XactCompletionRelcacheInitFileInval(parsed.xinfo)); + if (XactCompletionApplyFeedback(parsed.xinfo)) + appendStringInfoString(buf, "; apply_feedback"); + if (XactCompletionForceSyncCommit(parsed.xinfo)) appendStringInfoString(buf, "; sync"); @@ -312,7 +364,7 @@ xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId } static void -xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec) +xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId origin_id) { xl_xact_parsed_abort parsed; @@ -326,10 +378,20 @@ xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec) xact_desc_relations(buf, "rels", parsed.nrels, parsed.xnodes); xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts); + + if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN) + { + appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s", + origin_id, + LSN_FORMAT_ARGS(parsed.origin_lsn), + timestamptz_to_str(parsed.origin_timestamp)); + } + + xact_desc_stats(buf, "", parsed.nstats, parsed.stats); } static void -xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec) +xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginId origin_id) { xl_xact_parsed_prepare parsed; @@ -341,10 +403,22 @@ xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec) 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, parsed.tsId, xlrec->initfileinval); + + /* + * Check if the replication origin has been set in this record in the same + * way as PrepareRedoAdd(). + */ + if (origin_id != InvalidRepOriginId) + appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s", + origin_id, + LSN_FORMAT_ARGS(parsed.origin_lsn), + timestamptz_to_str(parsed.origin_timestamp)); } static void @@ -375,13 +449,15 @@ xact_desc(StringInfo buf, XLogReaderState *record) { xl_xact_abort *xlrec = (xl_xact_abort *) rec; - xact_desc_abort(buf, XLogRecGetInfo(record), xlrec); + xact_desc_abort(buf, XLogRecGetInfo(record), xlrec, + XLogRecGetOrigin(record)); } else if (info == XLOG_XACT_PREPARE) { xl_xact_prepare *xlrec = (xl_xact_prepare *) rec; - xact_desc_prepare(buf, XLogRecGetInfo(record), xlrec); + xact_desc_prepare(buf, XLogRecGetInfo(record), xlrec, + XLogRecGetOrigin(record)); } else if (info == XLOG_XACT_ASSIGNMENT) { diff --git a/third_party/spanner_pg/src/backend/access/rmgrdesc/xlogdesc.c b/third_party/spanner_pg/src/backend/access/rmgrdesc/xlogdesc.c index 5bf2346d..fefc5633 100644 --- a/third_party/spanner_pg/src/backend/access/rmgrdesc/xlogdesc.c +++ b/third_party/spanner_pg/src/backend/access/rmgrdesc/xlogdesc.c @@ -3,7 +3,7 @@ * xlogdesc.c * rmgr descriptor routines for access/transam/xlog.c * - * 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 * * @@ -200,3 +200,132 @@ 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; + ForkNumber forknum; + BlockNumber blk; + + if (!XLogRecGetBlockTagExtended(record, block_id, + &rnode, &forknum, &blk, NULL)) + continue; + + 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/third_party/spanner_pg/src/backend/access/spgist/spgdoinsert.c b/third_party/spanner_pg/src/backend/access/spgist/spgdoinsert.c index 70557bcf..e84b5edc 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgdoinsert.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgdoinsert.c @@ -4,7 +4,7 @@ * implementation of insert algorithm * * - * 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 * * IDENTIFICATION @@ -19,6 +19,7 @@ #include "access/spgist_private.h" #include "access/spgxlog.h" #include "access/xloginsert.h" +#include "common/pg_prng.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "utils/rel.h" @@ -2210,7 +2211,9 @@ spgdoinsert(Relation index, SpGistState *state, if (out.resultType == spgAddNode) elog(ERROR, "cannot add a node to an allTheSame inner tuple"); else if (out.resultType == spgMatchNode) - out.result.matchNode.nodeN = random() % innerTuple->nNodes; + out.result.matchNode.nodeN = + pg_prng_uint64_range(&pg_global_prng_state, + 0, innerTuple->nNodes - 1); } switch (out.resultType) diff --git a/third_party/spanner_pg/src/backend/access/spgist/spginsert.c b/third_party/spanner_pg/src/backend/access/spgist/spginsert.c index cc4394b1..bfb74049 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spginsert.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spginsert.c @@ -5,7 +5,7 @@ * * All the actual insertion logic is in spgdoinsert.c. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgkdtreeproc.c b/third_party/spanner_pg/src/backend/access/spgist/spgkdtreeproc.c index d9b3f6a0..d6bf675b 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgkdtreeproc.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgkdtreeproc.c @@ -4,7 +4,7 @@ * implementation of k-d tree over points for SP-GiST * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgproc.c b/third_party/spanner_pg/src/backend/access/spgist/spgproc.c index 1bad5d6c..4cfb6756 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgproc.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgproc.c @@ -4,7 +4,7 @@ * Common supporting procedures for SP-GiST opclasses. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgquadtreeproc.c b/third_party/spanner_pg/src/backend/access/spgist/spgquadtreeproc.c index a52d924f..ce6464f7 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgquadtreeproc.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgquadtreeproc.c @@ -4,7 +4,7 @@ * implementation of quad tree over points for SP-GiST * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgscan.c b/third_party/spanner_pg/src/backend/access/spgist/spgscan.c index 401a1a83..87a345d2 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgscan.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgscan.c @@ -4,7 +4,7 @@ * routines for scanning SP-GiST indexes * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgtextproc.c b/third_party/spanner_pg/src/backend/access/spgist/spgtextproc.c index f3405553..199d9214 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgtextproc.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgtextproc.c @@ -29,7 +29,7 @@ * No new entries ever get pushed into a -2-labeled child, either. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgutils.c b/third_party/spanner_pg/src/backend/access/spgist/spgutils.c index 30494aba..93674d39 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgutils.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgutils.c @@ -4,7 +4,7 @@ * various support functions for SP-GiST * * - * 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 * * IDENTIFICATION @@ -187,8 +187,6 @@ spgGetCache(Relation index) Oid atttype; spgConfigIn in; FmgrInfo *procinfo; - Buffer metabuffer; - SpGistMetaPageData *metadata; cache = MemoryContextAllocZero(index->rd_indexcxt, sizeof(SpGistCache)); @@ -256,19 +254,28 @@ spgGetCache(Relation index) fillTypeDesc(&cache->attPrefixType, cache->config.prefixType); fillTypeDesc(&cache->attLabelType, cache->config.labelType); - /* Last, get the lastUsedPages data from the metapage */ - metabuffer = ReadBuffer(index, SPGIST_METAPAGE_BLKNO); - LockBuffer(metabuffer, BUFFER_LOCK_SHARE); + /* + * Finally, if it's a real index (not a partitioned one), get the + * lastUsedPages data from the metapage + */ + if (index->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + { + Buffer metabuffer; + SpGistMetaPageData *metadata; - metadata = SpGistPageGetMeta(BufferGetPage(metabuffer)); + metabuffer = ReadBuffer(index, SPGIST_METAPAGE_BLKNO); + LockBuffer(metabuffer, BUFFER_LOCK_SHARE); - if (metadata->magicNumber != SPGIST_MAGIC_NUMBER) - elog(ERROR, "index \"%s\" is not an SP-GiST index", - RelationGetRelationName(index)); + metadata = SpGistPageGetMeta(BufferGetPage(metabuffer)); - cache->lastUsedPages = metadata->lastUsedPages; + if (metadata->magicNumber != SPGIST_MAGIC_NUMBER) + elog(ERROR, "index \"%s\" is not an SP-GiST index", + RelationGetRelationName(index)); - UnlockReleaseBuffer(metabuffer); + cache->lastUsedPages = metadata->lastUsedPages; + + UnlockReleaseBuffer(metabuffer); + } index->rd_amcache = (void *) cache; } @@ -748,7 +755,6 @@ spgoptions(Datum reloptions, bool validate) RELOPT_KIND_SPGIST, sizeof(SpGistOptions), tab, lengthof(tab)); - } /* @@ -1254,8 +1260,8 @@ SpGistPageAddNewItem(SpGistState *state, Page page, Item item, Size size, *startOffset = offnum + 1; } else - elog(PANIC, "failed to add item of size %u to SPGiST index page", - (int) size); + elog(PANIC, "failed to add item of size %zu to SPGiST index page", + size); return offnum; } @@ -1266,8 +1272,8 @@ SpGistPageAddNewItem(SpGistState *state, Page page, Item item, Size size, InvalidOffsetNumber, false, false); if (offnum == InvalidOffsetNumber && !errorOK) - elog(ERROR, "failed to add item of size %u to SPGiST index page", - (int) size); + elog(ERROR, "failed to add item of size %zu to SPGiST index page", + size); return offnum; } diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgvacuum.c b/third_party/spanner_pg/src/backend/access/spgist/spgvacuum.c index 76fb0374..00496305 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgvacuum.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgvacuum.c @@ -4,7 +4,7 @@ * vacuum for SP-GiST * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgvalidate.c b/third_party/spanner_pg/src/backend/access/spgist/spgvalidate.c index 472a28b8..82281f7b 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgvalidate.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgvalidate.c @@ -3,7 +3,7 @@ * spgvalidate.c * Opclass validator for SP-GiST. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/spgist/spgxlog.c b/third_party/spanner_pg/src/backend/access/spgist/spgxlog.c index 3dfd2aa3..b500b2cc 100644 --- a/third_party/spanner_pg/src/backend/access/spgist/spgxlog.c +++ b/third_party/spanner_pg/src/backend/access/spgist/spgxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for SP-GiST * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/table/table.c b/third_party/spanner_pg/src/backend/access/table/table.c index 545007e6..744d3b55 100644 --- a/third_party/spanner_pg/src/backend/access/table/table.c +++ b/third_party/spanner_pg/src/backend/access/table/table.c @@ -3,7 +3,7 @@ * table.c * Generic routines for table related code. * - * 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/third_party/spanner_pg/src/backend/access/table/tableam.c b/third_party/spanner_pg/src/backend/access/table/tableam.c index 66f0f843..b3d1a6c3 100644 --- a/third_party/spanner_pg/src/backend/access/table/tableam.c +++ b/third_party/spanner_pg/src/backend/access/table/tableam.c @@ -3,7 +3,7 @@ * tableam.c * Table access method routines too big to be inline functions. * - * 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 * * @@ -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/third_party/spanner_pg/src/backend/access/table/tableamapi.c b/third_party/spanner_pg/src/backend/access/table/tableamapi.c index 325ecdc1..76df7985 100644 --- a/third_party/spanner_pg/src/backend/access/table/tableamapi.c +++ b/third_party/spanner_pg/src/backend/access/table/tableamapi.c @@ -3,7 +3,7 @@ * tableamapi.c * Support routines for API for Postgres table access methods * - * 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 * * src/backend/access/table/tableamapi.c diff --git a/third_party/spanner_pg/src/backend/access/table/toast_helper.c b/third_party/spanner_pg/src/backend/access/table/toast_helper.c index 013236b7..0cc5a30f 100644 --- a/third_party/spanner_pg/src/backend/access/table/toast_helper.c +++ b/third_party/spanner_pg/src/backend/access/table/toast_helper.c @@ -4,7 +4,7 @@ * Helper functions for table AMs implementing compressed or * out-of-line storage of varlena attributes. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/table/toast_helper.c diff --git a/third_party/spanner_pg/src/backend/access/tablesample/bernoulli.c b/third_party/spanner_pg/src/backend/access/tablesample/bernoulli.c index ae6e4f58..5bd7c7bc 100644 --- a/third_party/spanner_pg/src/backend/access/tablesample/bernoulli.c +++ b/third_party/spanner_pg/src/backend/access/tablesample/bernoulli.c @@ -13,7 +13,7 @@ * cutoff value computed from the selection probability by BeginSampleScan. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/tablesample/system.c b/third_party/spanner_pg/src/backend/access/tablesample/system.c index b0869e50..c387f3d5 100644 --- a/third_party/spanner_pg/src/backend/access/tablesample/system.c +++ b/third_party/spanner_pg/src/backend/access/tablesample/system.c @@ -13,7 +13,7 @@ * cutoff value computed from the selection probability by BeginSampleScan. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/access/tablesample/tablesample.c b/third_party/spanner_pg/src/backend/access/tablesample/tablesample.c index 02f2a95e..eda8454c 100644 --- a/third_party/spanner_pg/src/backend/access/tablesample/tablesample.c +++ b/third_party/spanner_pg/src/backend/access/tablesample/tablesample.c @@ -3,7 +3,7 @@ * tablesample.c * Support functions for TABLESAMPLE feature * - * 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/third_party/spanner_pg/src/backend/access/transam/BUILD b/third_party/spanner_pg/src/backend/access/transam/BUILD index 20fd753a..36369de4 100644 --- a/third_party/spanner_pg/src/backend/access/transam/BUILD +++ b/third_party/spanner_pg/src/backend/access/transam/BUILD @@ -65,7 +65,9 @@ cc_library( "xlogarchive.c", "xlogfuncs.c", "xloginsert.c", + "xlogprefetcher.c", "xlogreader.c", + "xlogrecovery.c", "xlogutils.c", ], copts = [ diff --git a/third_party/spanner_pg/src/backend/access/transam/Makefile b/third_party/spanner_pg/src/backend/access/transam/Makefile index 595e02de..3e5444a6 100644 --- a/third_party/spanner_pg/src/backend/access/transam/Makefile +++ b/third_party/spanner_pg/src/backend/access/transam/Makefile @@ -31,7 +31,10 @@ OBJS = \ xlogarchive.o \ xlogfuncs.o \ xloginsert.o \ + xlogprefetcher.o \ xlogreader.o \ + xlogrecovery.o \ + xlogstats.o \ xlogutils.o include $(top_srcdir)/src/backend/common.mk diff --git a/third_party/spanner_pg/src/backend/access/transam/clog.c b/third_party/spanner_pg/src/backend/access/transam/clog.c index 8575f1cb..3d9088a7 100644 --- a/third_party/spanner_pg/src/backend/access/transam/clog.c +++ b/third_party/spanner_pg/src/backend/access/transam/clog.c @@ -23,7 +23,7 @@ * for aborts (whether sync or async), since the post-crash assumption would * be that such transactions failed anyway. * - * 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 * * src/backend/access/transam/clog.c diff --git a/third_party/spanner_pg/src/backend/access/transam/commit_ts.c b/third_party/spanner_pg/src/backend/access/transam/commit_ts.c index 3bd1ce63..e16a0d94 100644 --- a/third_party/spanner_pg/src/backend/access/transam/commit_ts.c +++ b/third_party/spanner_pg/src/backend/access/transam/commit_ts.c @@ -15,7 +15,7 @@ * re-perform the status update on redo; so we need make no additional XLOG * entry here. * - * 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 * * src/backend/access/transam/commit_ts.c @@ -28,6 +28,8 @@ #include "access/htup_details.h" #include "access/slru.h" #include "access/transam.h" +#include "access/xloginsert.h" +#include "access/xlogutils.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" @@ -98,7 +100,7 @@ typedef struct CommitTimestampShared bool commitTsActive; } CommitTimestampShared; -CommitTimestampShared *commitTsShared; +static CommitTimestampShared *commitTsShared; /* GUC variable */ @@ -511,13 +513,14 @@ pg_xact_commit_timestamp_origin(PG_FUNCTION_ARGS) /* * Number of shared CommitTS buffers. * - * We use a very similar logic as for the number of CLOG buffers; see comments - * in CLOGShmemBuffers. + * We use a very similar logic as for the number of CLOG buffers (except we + * scale up twice as fast with shared buffers, and the maximum is twice as + * high); see comments in CLOGShmemBuffers. */ Size CommitTsShmemBuffers(void) { - return Min(16, Max(4, NBuffers / 1024)); + return Min(256, Max(4, NBuffers / 256)); } /* diff --git a/third_party/spanner_pg/src/backend/access/transam/generic_xlog.c b/third_party/spanner_pg/src/backend/access/transam/generic_xlog.c index c6759fd5..0136ca75 100644 --- a/third_party/spanner_pg/src/backend/access/transam/generic_xlog.c +++ b/third_party/spanner_pg/src/backend/access/transam/generic_xlog.c @@ -4,7 +4,7 @@ * Implementation of generic xlog records. * * - * 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 * * src/backend/access/transam/generic_xlog.c @@ -478,10 +478,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; @@ -521,7 +521,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/third_party/spanner_pg/src/backend/access/transam/multixact.c b/third_party/spanner_pg/src/backend/access/transam/multixact.c index ad80ee9d..81df4937 100644 --- a/third_party/spanner_pg/src/backend/access/transam/multixact.c +++ b/third_party/spanner_pg/src/backend/access/transam/multixact.c @@ -59,7 +59,7 @@ * counter does not fall within the wraparound horizon considering the global * minimum value. * - * 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 * * src/backend/access/transam/multixact.c @@ -74,8 +74,8 @@ #include "access/twophase.h" #include "access/twophase_rmgr.h" #include "access/xact.h" -#include "access/xlog.h" #include "access/xloginsert.h" +#include "access/xlogutils.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "funcapi.h" @@ -3078,8 +3078,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->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; /* WAL log truncation */ WriteMTruncateXlogRec(newOldestMultiDB, @@ -3105,7 +3105,7 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) /* Then offsets */ PerformOffsetsTruncation(oldestMulti, newOldestMulti); - MyProc->delayChkpt = false; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); LWLockRelease(MultiXactTruncationLock); diff --git a/third_party/spanner_pg/src/backend/access/transam/parallel.c b/third_party/spanner_pg/src/backend/access/transam/parallel.c index 8ce95ab1..df0cd775 100644 --- a/third_party/spanner_pg/src/backend/access/transam/parallel.c +++ b/third_party/spanner_pg/src/backend/access/transam/parallel.c @@ -3,7 +3,7 @@ * parallel.c * Infrastructure for launching parallel workers * - * 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 * * IDENTIFICATION @@ -14,7 +14,6 @@ #include "postgres.h" -#include "access/heapam.h" #include "access/nbtree.h" #include "access/parallel.h" #include "access/session.h" @@ -25,6 +24,7 @@ #include "catalog/pg_enum.h" #include "catalog/storage.h" #include "commands/async.h" +#include "commands/vacuum.h" #include "executor/execParallel.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" @@ -1318,7 +1318,7 @@ ParallelWorkerMain(Datum main_arg) /* Arrange to signal the leader if we exit. */ ParallelLeaderPid = fps->parallel_leader_pid; ParallelLeaderBackendId = fps->parallel_leader_backend_id; - on_shmem_exit(ParallelWorkerShutdown, (Datum) 0); + before_shmem_exit(ParallelWorkerShutdown, PointerGetDatum(seg)); /* * Now we can find and attach to the error queue provided for us. That's @@ -1531,6 +1531,16 @@ ParallelWorkerReportLastRecEnd(XLogRecPtr last_xlog_end) * This guards against the case where we exit uncleanly without sending an * ErrorResponse to the leader, for example because some code calls proc_exit * directly. + * + * Also explicitly detach from dsm segment so that subsystems using + * on_dsm_detach() have a chance to send stats before the stats subsystem is + * shut down as part of a before_shmem_exit() hook. + * + * One might think this could instead be solved by carefully ordering the + * attaching to dsm segments, so that the pgstats segments get detached from + * later than the parallel query one. That turns out to not work because the + * stats hash might need to grow which can cause new segments to be allocated, + * which then will be detached from earlier. */ static void ParallelWorkerShutdown(int code, Datum arg) @@ -1538,6 +1548,8 @@ ParallelWorkerShutdown(int code, Datum arg) SendProcSignal(ParallelLeaderPid, PROCSIG_PARALLEL_MESSAGE, ParallelLeaderBackendId); + + dsm_detach((dsm_segment *) DatumGetPointer(arg)); } /* diff --git a/third_party/spanner_pg/src/backend/access/transam/rmgr.c b/third_party/spanner_pg/src/backend/access/transam/rmgr.c index 58091f6b..6bb4de38 100644 --- a/third_party/spanner_pg/src/backend/access/transam/rmgr.c +++ b/third_party/spanner_pg/src/backend/access/transam/rmgr.c @@ -24,15 +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) \ - { name, redo, desc, identify, startup, cleanup, mask }, +#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/CustomWALResourceManagers 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 (!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))); + + 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}; + + InitMaterializedSRF(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(RmgrIdIsBuiltin(rmid)); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + return (Datum) 0; +} diff --git a/third_party/spanner_pg/src/backend/access/transam/slru.c b/third_party/spanner_pg/src/backend/access/transam/slru.c index 3ee01ef1..af57fe9e 100644 --- a/third_party/spanner_pg/src/backend/access/transam/slru.c +++ b/third_party/spanner_pg/src/backend/access/transam/slru.c @@ -38,7 +38,7 @@ * by re-setting the page's page_dirty flag. * * - * 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 * * src/backend/access/transam/slru.c @@ -54,6 +54,7 @@ #include "access/slru.h" #include "access/transam.h" #include "access/xlog.h" +#include "access/xlogutils.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/fd.h" @@ -215,7 +216,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)); @@ -949,7 +950,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 +958,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: diff --git a/third_party/spanner_pg/src/backend/access/transam/subtrans.c b/third_party/spanner_pg/src/backend/access/transam/subtrans.c index 6a8e521f..66d35481 100644 --- a/third_party/spanner_pg/src/backend/access/transam/subtrans.c +++ b/third_party/spanner_pg/src/backend/access/transam/subtrans.c @@ -19,7 +19,7 @@ * data across crashes. During database startup, we simply force the * currently-active page of SUBTRANS to zeroes. * - * 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 * * src/backend/access/transam/subtrans.c diff --git a/third_party/spanner_pg/src/backend/access/transam/timeline.c b/third_party/spanner_pg/src/backend/access/transam/timeline.c index 8d0903c1..be219682 100644 --- a/third_party/spanner_pg/src/backend/access/transam/timeline.c +++ b/third_party/spanner_pg/src/backend/access/transam/timeline.c @@ -21,7 +21,7 @@ * The fields are separated by tabs. Lines beginning with # are comments, and * are ignored. Empty lines are also ignored. * - * 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 * * src/backend/access/transam/timeline.c diff --git a/third_party/spanner_pg/src/backend/access/transam/transam.c b/third_party/spanner_pg/src/backend/access/transam/transam.c index e9e0ef79..58658101 100644 --- a/third_party/spanner_pg/src/backend/access/transam/transam.c +++ b/third_party/spanner_pg/src/backend/access/transam/transam.c @@ -3,7 +3,7 @@ * transam.c * postgres transaction (commit) log interface routines * - * 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 * * @@ -219,38 +219,6 @@ TransactionIdDidAbort(TransactionId transactionId) return false; } -/* - * TransactionIdIsKnownCompleted - * True iff transaction associated with the identifier is currently - * known to have either committed or aborted. - * - * This does NOT look into pg_xact but merely probes our local cache - * (and so it's not named TransactionIdDidComplete, which would be the - * appropriate name for a function that worked that way). - * - * NB: This is unused, and will be removed in v15. This was used to - * short-circuit TransactionIdIsInProgress, but that was wrong for a - * transaction that was known to be marked as committed in CLOG but not - * yet removed from the proc array. This is kept in backbranches just in - * case it is still used by extensions. However, extensions doing - * something similar to tuple visibility checks should also be careful to - * check the proc array first! - * - * Note: - * Assumes transaction identifier is valid. - */ -bool -TransactionIdIsKnownCompleted(TransactionId transactionId) -{ - if (TransactionIdEquals(transactionId, cachedFetchXid)) - { - /* If it's in the cache at all, it must be completed. */ - return true; - } - - return false; -} - /* * TransactionIdCommitTree * Marks the given transaction and children as committed diff --git a/third_party/spanner_pg/src/backend/access/transam/twophase.c b/third_party/spanner_pg/src/backend/access/transam/twophase.c index 25d58140..5306442b 100644 --- a/third_party/spanner_pg/src/backend/access/transam/twophase.c +++ b/third_party/spanner_pg/src/backend/access/transam/twophase.c @@ -3,7 +3,7 @@ * twophase.c * Two-phase commit support functions. * - * 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 * * IDENTIFICATION @@ -86,6 +86,7 @@ #include "access/xlog.h" #include "access/xloginsert.h" #include "access/xlogreader.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/pg_type.h" #include "catalog/storage.h" @@ -207,6 +208,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, @@ -216,6 +219,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[]); @@ -476,15 +481,14 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, } proc->xid = xid; Assert(proc->xmin == InvalidTransactionId); - proc->delayChkpt = false; + proc->delayChkptFlags = 0; proc->statusFlags = 0; - proc->delayChkptEnd = false; proc->pid = 0; proc->databaseId = databaseid; proc->roleId = owner; proc->tempNamespaceId = InvalidOid; proc->isBackgroundWorker = false; - proc->lwWaiting = false; + proc->lwWaiting = LW_WS_NOT_WAITING; proc->lwWaitMode = 0; proc->waitLock = NULL; proc->waitProcLock = NULL; @@ -1048,6 +1052,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 */ @@ -1073,9 +1079,16 @@ 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' */ + /* EndPrepare will fill the origin data, if necessary */ + hdr.origin_lsn = InvalidXLogRecPtr; + hdr.origin_timestamp = 0; save_state_data(&hdr, sizeof(TwoPhaseFileHeader)); save_state_data(gxact->gid, hdr.gidlen); @@ -1100,6 +1113,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, @@ -1135,11 +1160,6 @@ EndPrepare(GlobalTransaction gxact) hdr->origin_lsn = replorigin_session_origin_lsn; hdr->origin_timestamp = replorigin_session_origin_timestamp; } - else - { - hdr->origin_lsn = InvalidXLogRecPtr; - hdr->origin_timestamp = 0; - } /* * If the data size exceeds MaxAllocSize, we won't be able to read it in @@ -1155,11 +1175,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. @@ -1168,8 +1188,8 @@ EndPrepare(GlobalTransaction gxact) START_CRIT_SECTION(); - Assert(!MyProc->delayChkpt); - MyProc->delayChkpt = true; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; XLogBeginInsert(); for (record = records.head; record != NULL; record = record->next) @@ -1212,7 +1232,7 @@ EndPrepare(GlobalTransaction gxact) * checkpoint starting after this will certainly see the gxact as a * candidate for fsyncing. */ - MyProc->delayChkpt = false; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; /* * Remember that we have this GlobalTransaction entry locked for us. If @@ -1376,11 +1396,7 @@ ReadTwoPhaseFile(TransactionId xid, bool missing_ok) * twophase files and ReadTwoPhaseFile should be used instead. * * Note clearly that this function can access WAL during normal operation, - * similarly to the way WALSender or Logical Decoding would do. While - * accessing WAL, read_local_xlog_page() may change ThisTimeLineID, - * particularly if this routine is called for the end-of-recovery checkpoint - * in the checkpointer itself, so save the current timeline number value - * and restore it once done. + * similarly to the way WALSender or Logical Decoding would do. */ static void XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len) @@ -1388,7 +1404,6 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len) XLogRecord *record; XLogReaderState *xlogreader; char *errormsg; - TimeLineID save_currtli = ThisTimeLineID; xlogreader = XLogReaderAllocate(wal_segment_size, NULL, XL_ROUTINE(.page_read = &read_local_xlog_page, @@ -1404,13 +1419,6 @@ XlogReadTwoPhaseData(XLogRecPtr lsn, char **buf, int *len) XLogBeginRead(xlogreader, lsn); record = XLogReadRecord(xlogreader, &errormsg); - /* - * Restore immediately the timeline where it was previously, as - * read_local_xlog_page() could have changed it if the record was read - * while recovery was finishing or if the timeline has jumped in-between. - */ - ThisTimeLineID = save_currtli; - if (record == NULL) { if (errormsg) @@ -1488,6 +1496,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; /* @@ -1522,6 +1532,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)); @@ -1543,12 +1557,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); @@ -1584,17 +1602,26 @@ 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. * * Relcache init file invalidation requires processing both before and - * after we send the SI messages. See AtEOXact_Inval() + * after we send the SI messages, only when committing. See + * AtEOXact_Inval(). */ - if (hdr->initfileinval) - RelationCacheInitFilePreInvalidate(); - SendSharedInvalidMessages(invalmsgs, hdr->ninvalmsgs); - if (hdr->initfileinval) - RelationCacheInitFilePostInvalidate(); + if (isCommit) + { + if (hdr->initfileinval) + RelationCacheInitFilePreInvalidate(); + SendSharedInvalidMessages(invalmsgs, hdr->ninvalmsgs); + if (hdr->initfileinval) + RelationCacheInitFilePostInvalidate(); + } /* * Acquire the two-phase lock. We want to work on the two-phase callbacks @@ -1792,7 +1819,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++) @@ -2078,6 +2105,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,7 +2277,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), @@ -2260,6 +2289,8 @@ RecordTransactionCommitPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, int ninvalmsgs, SharedInvalidationMessage *invalmsgs, bool initfileinval, @@ -2279,8 +2310,8 @@ RecordTransactionCommitPrepared(TransactionId xid, START_CRIT_SECTION(); /* See notes in RecordTransactionCommit */ - Assert(!MyProc->delayChkpt); - MyProc->delayChkpt = true; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; /* * Emit the XLOG commit record. Note that we mark 2PC commits as @@ -2289,6 +2320,7 @@ RecordTransactionCommitPrepared(TransactionId xid, */ recptr = XactLogCommitRecord(committs, nchildren, children, nrels, rels, + nstats, stats, ninvalmsgs, invalmsgs, initfileinval, MyXactFlags | XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK, @@ -2328,7 +2360,7 @@ RecordTransactionCommitPrepared(TransactionId xid, TransactionIdCommitTree(xid, nchildren, children); /* Checkpoint can proceed now */ - MyProc->delayChkpt = false; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); @@ -2355,6 +2387,8 @@ RecordTransactionAbortPrepared(TransactionId xid, TransactionId *children, int nrels, RelFileNode *rels, + int nstats, + xl_xact_stats_item *stats, const char *gid) { XLogRecPtr recptr; @@ -2385,6 +2419,7 @@ RecordTransactionAbortPrepared(TransactionId xid, recptr = XactLogAbortRecord(GetCurrentTimestamp(), nchildren, children, nrels, rels, + nstats, stats, MyXactFlags | XACT_FLAGS_ACQUIREDACCESSEXCLUSIVELOCK, xid, gid); @@ -2559,3 +2594,71 @@ PrepareRedoRemove(TransactionId xid, bool giveWarning) RemoveTwoPhaseFile(xid, giveWarning); RemoveGXact(gxact); } + +/* + * LookupGXact + * Check if the prepared transaction with the given GID, lsn and timestamp + * exists. + * + * Note that we always compare with the LSN where prepare ends because that is + * what is stored as origin_lsn in the 2PC file. + * + * This function is primarily used to check if the prepared transaction + * received from the upstream (remote node) already exists. Checking only GID + * is not sufficient because a different prepared xact with the same GID can + * exist on the same node. So, we are ensuring to match origin_lsn and + * origin_timestamp of prepared xact to avoid the possibility of a match of + * prepared xact from two different nodes. + */ +bool +LookupGXact(const char *gid, XLogRecPtr prepare_end_lsn, + TimestampTz origin_prepare_timestamp) +{ + int i; + bool found = false; + + LWLockAcquire(TwoPhaseStateLock, LW_SHARED); + for (i = 0; i < TwoPhaseState->numPrepXacts; i++) + { + GlobalTransaction gxact = TwoPhaseState->prepXacts[i]; + + /* Ignore not-yet-valid GIDs. */ + if (gxact->valid && strcmp(gxact->gid, gid) == 0) + { + char *buf; + TwoPhaseFileHeader *hdr; + + /* + * We are not expecting collisions of GXACTs (same gid) between + * publisher and subscribers, so we perform all I/O while holding + * TwoPhaseStateLock for simplicity. + * + * To move the I/O out of the lock, we need to ensure that no + * other backend commits the prepared xact in the meantime. We can + * do this optimization if we encounter many collisions in GID + * between publisher and subscriber. + */ + if (gxact->ondisk) + buf = ReadTwoPhaseFile(gxact->xid, false); + else + { + Assert(gxact->prepare_start_lsn); + XlogReadTwoPhaseData(gxact->prepare_start_lsn, &buf, NULL); + } + + hdr = (TwoPhaseFileHeader *) buf; + + if (hdr->origin_lsn == prepare_end_lsn && + hdr->origin_timestamp == origin_prepare_timestamp) + { + found = true; + pfree(buf); + break; + } + + pfree(buf); + } + } + LWLockRelease(TwoPhaseStateLock); + return found; +} diff --git a/third_party/spanner_pg/src/backend/access/transam/twophase_rmgr.c b/third_party/spanner_pg/src/backend/access/transam/twophase_rmgr.c index 1fd78556..35a9b32a 100644 --- a/third_party/spanner_pg/src/backend/access/transam/twophase_rmgr.c +++ b/third_party/spanner_pg/src/backend/access/transam/twophase_rmgr.c @@ -3,7 +3,7 @@ * twophase_rmgr.c * Two-phase-commit resource managers tables * - * 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/third_party/spanner_pg/src/backend/access/transam/varsup.c b/third_party/spanner_pg/src/backend/access/transam/varsup.c index a22bf375..748120a0 100644 --- a/third_party/spanner_pg/src/backend/access/transam/varsup.c +++ b/third_party/spanner_pg/src/backend/access/transam/varsup.c @@ -3,7 +3,7 @@ * varsup.c * postgres OID & XID variables support routines * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/transam/varsup.c @@ -18,7 +18,7 @@ #include "access/subtrans.h" #include "access/transam.h" #include "access/xact.h" -#include "access/xlog.h" +#include "access/xlogutils.h" #include "commands/dbcommands.h" #include "miscadmin.h" #include "postmaster/autovacuum.h" @@ -541,11 +541,11 @@ GetNewObjectId(void) * FirstNormalObjectId since that range is reserved for initdb (see * IsCatalogRelationOid()). Note we are relying on unsigned comparison. * - * During initdb, we start the OID generator at FirstBootstrapObjectId, so - * we only wrap if before that point when in bootstrap or standalone mode. + * During initdb, we start the OID generator at FirstGenbkiObjectId, so we + * only wrap if before that point when in bootstrap or standalone mode. * The first time through this routine after normal postmaster start, the * counter will be forced up to FirstNormalObjectId. This mechanism - * leaves the OIDs between FirstBootstrapObjectId and FirstNormalObjectId + * leaves the OIDs between FirstGenbkiObjectId and FirstNormalObjectId * available for automatic assignment during initdb, while ensuring they * will never conflict with user-assigned OIDs. */ @@ -560,7 +560,7 @@ GetNewObjectId(void) else { /* we may be bootstrapping, so don't enforce the full range */ - if (ShmemVariableCache->nextOid < ((Oid) FirstBootstrapObjectId)) + if (ShmemVariableCache->nextOid < ((Oid) FirstGenbkiObjectId)) { /* wraparound in standalone mode (unlikely but possible) */ ShmemVariableCache->nextOid = FirstNormalObjectId; @@ -586,6 +586,47 @@ GetNewObjectId(void) return result; } +/* + * SetNextObjectId + * + * This may only be called during initdb; it advances the OID counter + * to the specified value. + */ +static void +SetNextObjectId(Oid nextOid) +{ + /* Safety check, this is only allowable during initdb */ + if (IsPostmasterEnvironment) + elog(ERROR, "cannot advance OID counter anymore"); + + /* Taking the lock is, therefore, just pro forma; but do it anyway */ + LWLockAcquire(OidGenLock, LW_EXCLUSIVE); + + if (ShmemVariableCache->nextOid > nextOid) + elog(ERROR, "too late to advance OID counter to %u, it is now %u", + nextOid, ShmemVariableCache->nextOid); + + ShmemVariableCache->nextOid = nextOid; + ShmemVariableCache->oidCount = 0; + + LWLockRelease(OidGenLock); +} + +/* + * StopGeneratingPinnedObjectIds + * + * This is called once during initdb to force the OID counter up to + * FirstUnpinnedObjectId. This supports letting initdb's post-bootstrap + * processing create some pinned objects early on. Once it's done doing + * so, it calls this (via pg_stop_making_pinned_objects()) so that the + * remaining objects it makes will be considered un-pinned. + */ +void +StopGeneratingPinnedObjectIds(void) +{ + SetNextObjectId(FirstUnpinnedObjectId); +} + #ifdef USE_ASSERT_CHECKING diff --git a/third_party/spanner_pg/src/backend/access/transam/xact.c b/third_party/spanner_pg/src/backend/access/transam/xact.c index c133d17e..8b435459 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xact.c +++ b/third_party/spanner_pg/src/backend/access/transam/xact.c @@ -5,7 +5,7 @@ * * See src/backend/access/transam/README for more information. * - * 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 * * @@ -29,6 +29,7 @@ #include "access/xact.h" #include "access/xlog.h" #include "access/xloginsert.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/index.h" #include "catalog/namespace.h" @@ -37,6 +38,7 @@ #include "commands/async.h" #include "commands/tablecmds.h" #include "commands/trigger.h" +#include "common/pg_prng.h" #include "executor/spi.h" #include "libpq/be-fsstubs.h" #include "libpq/pqsignal.h" @@ -119,9 +121,9 @@ bool bsysscan = false; * The XIDs are stored sorted in numerical order (not logical order) to make * lookups as fast as possible. */ -FullTransactionId XactTopFullTransactionId = {InvalidTransactionId}; -int nParallelCurrentXids = 0; -TransactionId *ParallelCurrentXids; +static FullTransactionId XactTopFullTransactionId = {InvalidTransactionId}; +static int nParallelCurrentXids = 0; +static TransactionId *ParallelCurrentXids; /* * Miscellaneous flag bits to record events which occur on the top level @@ -205,7 +207,7 @@ typedef struct TransactionStateData bool didLogXid; /* has xid been included in WAL record? */ int parallelModeLevel; /* Enter/ExitParallelMode counter */ bool chain; /* start a new block after this one */ - bool assigned; /* assigned to top-level XID */ + bool topXidLogged; /* for a subxact: is top-level XID logged? */ struct TransactionStateData *parent; /* back link to parent */ } TransactionStateData; @@ -238,7 +240,7 @@ typedef struct SerializedTransactionState static TransactionStateData TopTransactionStateData = { .state = TRANS_DEFAULT, .blockState = TBLOCK_DEFAULT, - .assigned = false, + .topXidLogged = false, }; /* @@ -529,6 +531,56 @@ MarkCurrentTransactionIdLoggedIfAny(void) CurrentTransactionState->didLogXid = true; } +/* + * IsSubxactTopXidLogPending + * + * This is used to decide whether we need to WAL log the top-level XID for + * operation in a subtransaction. We require that for logical decoding, see + * LogicalDecodingProcessRecord. + * + * This returns true if wal_level >= logical and we are inside a valid + * subtransaction, for which the assignment was not yet written to any WAL + * record. + */ +bool +IsSubxactTopXidLogPending(void) +{ + /* check whether it is already logged */ + if (CurrentTransactionState->topXidLogged) + return false; + + /* wal_level has to be logical */ + if (!XLogLogicalInfoActive()) + return false; + + /* we need to be in a transaction state */ + if (!IsTransactionState()) + return false; + + /* it has to be a subtransaction */ + if (!IsSubTransaction()) + return false; + + /* the subtransaction has to have a XID assigned */ + if (!TransactionIdIsValid(GetCurrentTransactionIdIfAny())) + return false; + + return true; +} + +/* + * MarkSubxactTopXidLogged + * + * Remember that the top transaction id for the current subtransaction is WAL + * logged now. + */ +void +MarkSubxactTopXidLogged(void) +{ + Assert(IsSubxactTopXidLogPending()); + + CurrentTransactionState->topXidLogged = true; +} /* * GetStableLatestTransactionId @@ -1237,6 +1289,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; @@ -1255,6 +1309,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); @@ -1269,10 +1324,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 */ @@ -1334,19 +1391,20 @@ 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); + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); START_CRIT_SECTION(); - MyProc->delayChkpt = true; + MyProc->delayChkptFlags |= DELAY_CHKPT_START; SetCurrentTransactionStopTimestamp(); XactLogCommitRecord(xactStopTimestamp, nchildren, children, nrels, rels, + ndroppedstats, droppedstats, nmsgs, invalMessages, RelcacheInitFileInval, MyXactFlags, @@ -1442,7 +1500,7 @@ RecordTransactionCommit(void) */ if (markXidCommitted) { - MyProc->delayChkpt = false; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; END_CRIT_SECTION(); } @@ -1470,6 +1528,8 @@ RecordTransactionCommit(void) /* Clean up local data */ if (rels) pfree(rels); + if (ndroppedstats) + pfree(droppedstats); return latestXid; } @@ -1650,6 +1710,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; @@ -1686,6 +1748,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(); @@ -1702,6 +1765,7 @@ RecordTransactionAbort(bool isSubXact) XactLogAbortRecord(xact_time, nchildren, children, nrels, rels, + ndroppedstats, droppedstats, MyXactFlags, InvalidTransactionId, NULL); @@ -1748,6 +1812,8 @@ RecordTransactionAbort(bool isSubXact) /* And clean up local data */ if (rels) pfree(rels); + if (ndroppedstats) + pfree(droppedstats); return latestXid; } @@ -1945,7 +2011,7 @@ StartTransaction(void) /* Determine if statements are logged in this transaction */ xact_is_sampled = log_xact_sample_rate != 0 && (log_xact_sample_rate == 1 || - random() <= log_xact_sample_rate * MAX_RANDOM_VALUE); + pg_prng_double(&pg_global_prng_state) <= log_xact_sample_rate); /* * initialize current transaction state fields @@ -2936,24 +3002,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; } @@ -2964,9 +3026,10 @@ void CommitTransactionCommand(void) { TransactionState s = CurrentTransactionState; + SavedTransactionCharacteristics savetc; /* Must save in case we need to restore below */ - SaveTransactionCharacteristics(); + SaveTransactionCharacteristics(&savetc); switch (s->blockState) { @@ -3024,7 +3087,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3050,7 +3113,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3068,7 +3131,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } break; @@ -3135,7 +3198,7 @@ CommitTransactionCommand(void) StartTransaction(); s->blockState = TBLOCK_INPROGRESS; s->chain = false; - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); } } else if (s->blockState == TBLOCK_PREPARE) @@ -5206,8 +5269,9 @@ PushTransaction(void) s->blockState = TBLOCK_SUBBEGIN; GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext); s->prevXactReadOnly = XactReadOnly; + s->startedInRecovery = p->startedInRecovery; s->parallelModeLevel = 0; - s->assigned = false; + s->topXidLogged = false; CurrentTransactionState = s; @@ -5557,6 +5621,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, @@ -5567,6 +5632,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; @@ -5624,6 +5690,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; @@ -5680,6 +5752,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); @@ -5713,6 +5793,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) { @@ -5720,6 +5801,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; @@ -5757,6 +5839,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; @@ -5818,6 +5906,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)); @@ -5951,6 +6047,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 @@ -6053,6 +6157,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 @@ -6140,50 +6252,3 @@ xact_redo(XLogReaderState *record) else elog(PANIC, "xact_redo: unknown op code %u", info); } - -/* - * IsSubTransactionAssignmentPending - * - * This is used to decide whether we need to WAL log the top-level XID for - * operation in a subtransaction. We require that for logical decoding, see - * LogicalDecodingProcessRecord. - * - * This returns true if wal_level >= logical and we are inside a valid - * subtransaction, for which the assignment was not yet written to any WAL - * record. - */ -bool -IsSubTransactionAssignmentPending(void) -{ - /* wal_level has to be logical */ - if (!XLogLogicalInfoActive()) - return false; - - /* we need to be in a transaction state */ - if (!IsTransactionState()) - return false; - - /* it has to be a subtransaction */ - if (!IsSubTransaction()) - return false; - - /* the subtransaction has to have a XID assigned */ - if (!TransactionIdIsValid(GetCurrentTransactionIdIfAny())) - return false; - - /* and it should not be already 'assigned' */ - return !CurrentTransactionState->assigned; -} - -/* - * MarkSubTransactionAssigned - * - * Mark the subtransaction assignment as completed. - */ -void -MarkSubTransactionAssigned(void) -{ - Assert(IsSubTransactionAssignmentPending()); - - CurrentTransactionState->assigned = true; -} diff --git a/third_party/spanner_pg/src/backend/access/transam/xlog.c b/third_party/spanner_pg/src/backend/access/transam/xlog.c index 1f139fa7..9795ce71 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xlog.c +++ b/third_party/spanner_pg/src/backend/access/transam/xlog.c @@ -3,8 +3,32 @@ * xlog.c * PostgreSQL write-ahead log manager * + * The Write-Ahead Log (WAL) functionality is split into several source + * files, in addition to this one: * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * xloginsert.c - Functions for constructing WAL records + * xlogrecovery.c - WAL recovery and standby code + * xlogreader.c - Facility for reading WAL files and parsing WAL records + * xlogutils.c - Helper functions for WAL redo routines + * + * This file contains functions for coordinating database startup and + * checkpointing, and managing the write-ahead log buffers when the + * system is running. + * + * StartupXLOG() is the main entry point of the startup process. It + * coordinates database startup, performing WAL recovery, and the + * transition from WAL recovery into normal operations. + * + * XLogInsertRecord() inserts a WAL record into the WAL buffers. Most + * callers should not call this directly, but use the functions in + * xloginsert.c to construct the WAL record. XLogFlush() can be used + * to force the WAL to disk. + * + * In addition to those, there are many other functions for interrogating + * the current system state, and for starting/stopping backups. + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlog.c @@ -35,13 +59,14 @@ #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" +#include "backup/basebackup.h" #include "catalog/catversion.h" #include "catalog/pg_control.h" #include "catalog/pg_database.h" -#include "commands/progress.h" -#include "commands/tablespace.h" #include "common/controldata_utils.h" #include "common/file_utils.h" #include "executor/instrument.h" @@ -53,7 +78,6 @@ #include "postmaster/bgwriter.h" #include "postmaster/startup.h" #include "postmaster/walwriter.h" -#include "replication/basebackup.h" #include "replication/logical.h" #include "replication/origin.h" #include "replication/slot.h" @@ -73,20 +97,19 @@ #include "storage/smgr.h" #include "storage/spin.h" #include "storage/sync.h" -#include "utils/builtins.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/relmapper.h" #include "utils/pg_rusage.h" #include "utils/snapmgr.h" +#include "utils/timeout.h" #include "utils/timestamp.h" extern uint32 bootstrap_data_checksum_version; -/* Unsupported old recovery command file names (relative to $PGDATA) */ -#define RECOVERY_COMMAND_FILE "recovery.conf" -#define RECOVERY_COMMAND_DONE "recovery.done" +/* timeline ID to be used when bootstrapping */ +#define BootstrapTimeLineID 1 /* User-settable parameters */ int max_wal_size_mb = 1024; /* 1 GB */ @@ -99,18 +122,19 @@ char *XLogArchiveCommand = NULL; bool EnableHotStandby = false; bool fullPageWrites = true; bool wal_log_hints = false; -bool wal_compression = false; +int wal_compression = WAL_COMPRESSION_NONE; char *wal_consistency_checking_string = NULL; bool *wal_consistency_checking = NULL; bool wal_init_zero = true; bool wal_recycle = true; -bool log_checkpoints = false; +bool log_checkpoints = true; int sync_method = DEFAULT_SYNC_METHOD; int wal_level = WAL_LEVEL_MINIMAL; 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 @@ -174,13 +198,6 @@ const struct config_enum_entry archive_mode_options[] = { {NULL, 0, false} }; -const struct config_enum_entry recovery_target_action_options[] = { - {"pause", RECOVERY_TARGET_ACTION_PAUSE, false}, - {"promote", RECOVERY_TARGET_ACTION_PROMOTE, false}, - {"shutdown", RECOVERY_TARGET_ACTION_SHUTDOWN, false}, - {NULL, 0, false} -}; - /* * Statistics for current checkpoint are collected in this global struct. * Because only the checkpointer or a stand-alone backend can perform @@ -188,43 +205,6 @@ const struct config_enum_entry recovery_target_action_options[] = { */ CheckpointStatsData CheckpointStats; -/* - * ThisTimeLineID will be same in all backends --- it identifies current - * WAL timeline for the database system. - */ -TimeLineID ThisTimeLineID = 0; - -/* - * Are we doing recovery from XLOG? - * - * This is only ever true in the startup process; it should be read as meaning - * "this process is replaying WAL records", rather than "the system is in - * recovery mode". It should be examined primarily by functions that need - * to act differently when called from a WAL redo function (e.g., to skip WAL - * logging). To check whether the system is in recovery regardless of which - * process you're running in, use RecoveryInProgress() but only after shared - * memory startup and lock initialization. - */ -bool InRecovery = false; - -/* Are we in Hot Standby mode? Only valid in startup process, see xlog.h */ -HotStandbyState standbyState = STANDBY_DISABLED; - -static XLogRecPtr LastRec; - -/* Local copy of WalRcv->flushedUpto */ -static XLogRecPtr flushedUpto = 0; -static TimeLineID receiveTLI = 0; - -/* - * abortedRecPtr is the start pointer of a broken record at end of WAL when - * recovery completes; missingContrecPtr is the location of the first - * contrecord that went missing. See CreateOverwriteContrecordRecord for - * details. - */ -static XLogRecPtr abortedRecPtr; -static XLogRecPtr missingContrecPtr; - /* * During recovery, lastFullPageWrites keeps track of full_page_writes that * the replayed WAL records indicate. It's initialized with full_page_writes @@ -240,18 +220,6 @@ static bool lastFullPageWrites; */ static bool LocalRecoveryInProgress = true; -/* - * Local copy of SharedHotStandbyActive variable. False actually means "not - * known, need to check the shared state". - */ -static bool LocalHotStandbyActive = false; - -/* - * Local copy of SharedPromoteIsTriggered variable. False actually means "not - * known, need to check the shared state". - */ -static bool LocalPromoteIsTriggered = false; - /* * Local state for XLogInsertAllowed(): * 1: unconditionally allowed to insert XLOG @@ -264,96 +232,6 @@ static bool LocalPromoteIsTriggered = false; */ static int LocalXLogInsertAllowed = -1; -/* - * When ArchiveRecoveryRequested is set, archive recovery was requested, - * ie. signal files were present. When InArchiveRecovery is set, we are - * currently recovering using offline XLOG archives. These variables are only - * valid in the startup process. - * - * When ArchiveRecoveryRequested is true, but InArchiveRecovery is false, we're - * currently performing crash recovery using only XLOG files in pg_wal, but - * will switch to using offline XLOG archives as soon as we reach the end of - * WAL in pg_wal. -*/ -bool ArchiveRecoveryRequested = false; -bool InArchiveRecovery = false; - -static bool standby_signal_file_found = false; -static bool recovery_signal_file_found = false; - -/* Was the last xlog file restored from archive, or local? */ -static bool restoredFromArchive = false; - -/* Buffers dedicated to consistency checks of size BLCKSZ */ -static char *replay_image_masked = NULL; -static char *primary_image_masked = NULL; - -/* options formerly taken from recovery.conf for archive recovery */ -char *recoveryRestoreCommand = NULL; -char *recoveryEndCommand = NULL; -char *archiveCleanupCommand = NULL; -RecoveryTargetType recoveryTarget = RECOVERY_TARGET_UNSET; -bool recoveryTargetInclusive = true; -int recoveryTargetAction = RECOVERY_TARGET_ACTION_PAUSE; -TransactionId recoveryTargetXid; -char *recovery_target_time_string; -static TimestampTz recoveryTargetTime; -const char *recoveryTargetName; -XLogRecPtr recoveryTargetLSN; -int recovery_min_apply_delay = 0; - -/* options formerly taken from recovery.conf for XLOG streaming */ -bool StandbyModeRequested = false; -char *PrimaryConnInfo = NULL; -char *PrimarySlotName = NULL; -char *PromoteTriggerFile = NULL; -bool wal_receiver_create_temp_slot = false; - -/* are we currently in standby mode? */ -bool StandbyMode = false; - -/* - * if recoveryStopsBefore/After returns true, it saves information of the stop - * point here - */ -static TransactionId recoveryStopXid; -static TimestampTz recoveryStopTime; -static XLogRecPtr recoveryStopLSN; -static char recoveryStopName[MAXFNAMELEN]; -static bool recoveryStopAfter; - -/* - * During normal operation, the only timeline we care about is ThisTimeLineID. - * During recovery, however, things are more complicated. To simplify life - * for rmgr code, we keep ThisTimeLineID set to the "current" timeline as we - * scan through the WAL history (that is, it is the line that was active when - * the currently-scanned WAL record was generated). We also need these - * timeline values: - * - * recoveryTargetTimeLineGoal: what the user requested, if any - * - * recoveryTargetTLIRequested: numeric value of requested timeline, if constant - * - * recoveryTargetTLI: the currently understood target timeline; changes - * - * expectedTLEs: a list of TimeLineHistoryEntries for recoveryTargetTLI and the timelines of - * its known parents, newest first (so recoveryTargetTLI is always the - * first list member). Only these TLIs are expected to be seen in the WAL - * segments we read, and indeed only these TLIs will be considered as - * candidate WAL files to open at all. - * - * curFileTLI: the TLI appearing in the name of the current input WAL file. - * (This is not necessarily the same as ThisTimeLineID, because we could - * be scanning data that was copied from an ancestor timeline when the current - * file was created.) During a sequential scan we do not allow this value - * to decrease. - */ -RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal = RECOVERY_TARGET_TIMELINE_LATEST; -TimeLineID recoveryTargetTLIRequested = 0; -TimeLineID recoveryTargetTLI = 0; -static List *expectedTLEs; -static TimeLineID curFileTLI; - /* * ProcLastRecPtr points to the start of the last XLOG record inserted by the * current backend. It is updated for all inserts. XactLastRecEnd points to @@ -380,8 +258,14 @@ XLogRecPtr XactLastCommitEnd = InvalidXLogRecPtr; * XLogCtl->Insert.RedoRecPtr, whenever we can safely do so (ie, when we * hold an insertion lock). See XLogInsertRecord for details. We are also * allowed to update from XLogCtl->RedoRecPtr if we hold the info_lck; - * see GetRedoRecPtr. A freshly spawned backend obtains the value during - * InitXLOGAccess. + * see GetRedoRecPtr. + * + * NB: Code that uses this variable must be prepared not only for the + * possibility that it may be arbitrarily out of date, but also for the + * possibility that it might be set to InvalidXLogRecPtr. We used to + * initialize it as a side effect of the first call to RecoveryInProgress(), + * which meant that most code that might use it could assume that it had a + * real if perhaps stale value. That's no longer the case. */ static XLogRecPtr RedoRecPtr; @@ -389,24 +273,15 @@ static XLogRecPtr RedoRecPtr; * doPageWrites is this backend's local copy of (forcePageWrites || * fullPageWrites). It is used together with RedoRecPtr to decide whether * a full-page image of a page need to be taken. + * + * NB: Initially this is false, and there's no guarantee that it will be + * initialized to any other value before it is first used. Any code that + * makes use of it must recheck the value after obtaining a WALInsertLock, + * and respond appropriately if it turns out that the previous value wasn't + * accurate. */ static bool doPageWrites; -/* Has the recovery code requested a walreceiver wakeup? */ -static bool doRequestWalReceiverReply; - -/* - * RedoStartLSN points to the checkpoint's REDO location which is specified - * in a backup label file, backup history file or control file. In standby - * mode, XLOG streaming usually starts from the position where an invalid - * record was found. But if we fail to read even the initial checkpoint - * record, we use the REDO location instead of the checkpoint location as - * the start position of XLOG streaming. Otherwise we would have to jump - * backwards to the REDO location after reading the checkpoint record, - * because the REDO record can precede the checkpoint record. - */ -static XLogRecPtr RedoStartLSN = InvalidXLogRecPtr; - /*---------- * Shared-memory data structures for XLOG control * @@ -512,29 +387,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. @@ -583,15 +435,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 + * 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; /* @@ -652,12 +501,14 @@ typedef struct XLogCtlData int XLogCacheBlck; /* highest allocated xlog buffer index */ /* - * Shared copy of ThisTimeLineID. Does not change after end-of-recovery. - * If we created a new timeline when the system was started up, + * InsertTimeLineID is the timeline into which new WAL is being inserted + * and flushed. It is zero during recovery, and does not change once set. + * + * If we create a new timeline when the system was started up, * PrevTimeLineID is the old timeline's ID that we forked off from. - * Otherwise it's equal to ThisTimeLineID. + * Otherwise it's equal to InsertTimeLineID. */ - TimeLineID ThisTimeLineID; + TimeLineID InsertTimeLineID; TimeLineID PrevTimeLineID; /* @@ -667,16 +518,14 @@ typedef struct XLogCtlData RecoveryState SharedRecoveryState; /* - * SharedHotStandbyActive indicates if we allow hot standby queries to be - * run. Protected by info_lck. - */ - bool SharedHotStandbyActive; - - /* - * SharedPromoteIsTriggered indicates if a standby promotion has been - * triggered. Protected by info_lck. + * InstallXLogFileSegmentActive indicates whether the checkpointer should + * arrange for future segments by recycling and/or PreallocXlogFiles(). + * Protected by ControlFileLock. Only the startup process changes it. If + * true, anyone can use InstallXLogFileSegment(). If false, the startup + * process owns the exclusive right to install segments, by reading from + * the archive and possibly replacing existing files. */ - bool SharedPromoteIsTriggered; + bool InstallXLogFileSegmentActive; /* * WalWriterSleeping indicates whether the WAL writer is currently in @@ -685,23 +534,6 @@ typedef struct XLogCtlData */ bool WalWriterSleeping; - /* - * recoveryWakeupLatch is used to wake up the startup process to continue - * WAL replay, if it is waiting for WAL to arrive or failover trigger file - * to appear. - * - * Note that the startup process also uses another latch, its procLatch, - * to wait for recovery conflict. If we get rid of recoveryWakeupLatch for - * signaling the startup process in favor of using its procLatch, which - * comports better with possible generic signal handlers using that latch. - * But we should not do that because the startup process doesn't assume - * that it's waken up by walreceiver process or SIGHUP signal handler - * while it's waiting for recovery conflict. The separate latches, - * recoveryWakeupLatch and procLatch, should be used for inter-process - * communication for WAL replay and recovery conflict, respectively. - */ - Latch recoveryWakeupLatch; - /* * During recovery, we keep a copy of the latest checkpoint record here. * lastCheckPointRecPtr points to start of checkpoint record and @@ -714,28 +546,6 @@ typedef struct XLogCtlData XLogRecPtr lastCheckPointEndPtr; CheckPoint lastCheckPoint; - /* - * lastReplayedEndRecPtr points to end+1 of the last record successfully - * replayed. When we're currently replaying a record, ie. in a redo - * function, replayEndRecPtr points to the end+1 of the record being - * replayed, otherwise it's equal to lastReplayedEndRecPtr. - */ - XLogRecPtr lastReplayedEndRecPtr; - TimeLineID lastReplayedTLI; - XLogRecPtr replayEndRecPtr; - TimeLineID replayEndTLI; - /* timestamp of last COMMIT/ABORT record replayed (or being replayed) */ - TimestampTz recoveryLastXTime; - - /* - * timestamp of when we started replaying the current chunk of WAL data, - * only relevant for replication or archive recovery - */ - TimestampTz currentChunkStartTime; - /* Recovery pause state */ - RecoveryPauseState recoveryPauseState; - ConditionVariable recoveryNotPausedCV; - /* * lastFpwDisableRecPtr points to the start of the last replayed * XLOG_FPW_CHANGE record that instructs full_page_writes is disabled. @@ -793,104 +603,29 @@ static int UsableBytesInSegment; */ static XLogwrtResult LogwrtResult = {0, 0}; -/* - * Codes indicating where we got a WAL file from during recovery, or where - * to attempt to get one. - */ -typedef enum -{ - XLOG_FROM_ANY = 0, /* request to read WAL from any source */ - XLOG_FROM_ARCHIVE, /* restored using restore_command */ - XLOG_FROM_PG_WAL, /* existing file in pg_wal */ - XLOG_FROM_STREAM /* streamed from primary */ -} XLogSource; - -/* human-readable names for XLogSources, for debugging output */ -static const char *const xlogSourceNames[] = {"any", "archive", "pg_wal", "stream"}; - /* * openLogFile is -1 or a kernel FD for an open log file segment. - * openLogSegNo identifies the segment. These variables are only used to - * write the XLOG, and so will normally refer to the active segment. + * openLogSegNo identifies the segment, and openLogTLI the corresponding TLI. + * These variables are only used to write the XLOG, and so will normally refer + * to the active segment. + * * Note: call Reserve/ReleaseExternalFD to track consumption of this FD. */ static int openLogFile = -1; static XLogSegNo openLogSegNo = 0; - -/* - * These variables are used similarly to the ones above, but for reading - * the XLOG. readOff is the offset of the page just read, readLen - * indicates how much of it has been read into readBuf, and readSource - * indicates where we got the currently open file from. - * Note: we could use Reserve/ReleaseExternalFD to track consumption of - * this FD too; but it doesn't currently seem worthwhile, since the XLOG is - * not read by general-purpose sessions. - */ -static int readFile = -1; -static XLogSegNo readSegNo = 0; -static uint32 readOff = 0; -static uint32 readLen = 0; -static XLogSource readSource = XLOG_FROM_ANY; - -/* - * Keeps track of which source we're currently reading from. This is - * different from readSource in that this is always set, even when we don't - * currently have a WAL file open. If lastSourceFailed is set, our last - * attempt to read from currentSource failed, and we should try another source - * next. - * - * pendingWalRcvRestart is set when a config change occurs that requires a - * walreceiver restart. This is only valid in XLOG_FROM_STREAM state. - */ -static XLogSource currentSource = XLOG_FROM_ANY; -static bool lastSourceFailed = false; -static bool pendingWalRcvRestart = false; - -typedef struct XLogPageReadPrivate -{ - int emode; - bool fetching_ckpt; /* are we fetching a checkpoint record? */ - bool randAccess; -} XLogPageReadPrivate; - -/* - * These variables track when we last obtained some WAL data to process, - * and where we got it from. (XLogReceiptSource is initially the same as - * readSource, but readSource gets reset to zero when we don't have data - * to process right now. It is also different from currentSource, which - * also changes when we try to read from a source and fail, while - * XLogReceiptSource tracks where we last successfully read some WAL.) - */ -static TimestampTz XLogReceiptTime = 0; -static XLogSource XLogReceiptSource = XLOG_FROM_ANY; - -/* State information for XLOG reading */ -static XLogRecPtr ReadRecPtr; /* start of last record read */ -static XLogRecPtr EndRecPtr; /* end+1 of last record read */ +static TimeLineID openLogTLI = 0; /* * Local copies of equivalent fields in the control file. When running - * crash recovery, minRecoveryPoint is set to InvalidXLogRecPtr as we + * crash recovery, LocalMinRecoveryPoint is set to InvalidXLogRecPtr as we * expect to replay all the WAL available, and updateMinRecoveryPoint is * switched to false to prevent any updates while replaying records. * Those values are kept consistent as long as crash recovery runs. */ -static XLogRecPtr minRecoveryPoint; -static TimeLineID minRecoveryPointTLI; +static XLogRecPtr LocalMinRecoveryPoint; +static TimeLineID LocalMinRecoveryPointTLI; static bool updateMinRecoveryPoint = true; -/* - * Have we reached a consistent database state? In crash recovery, we have - * to replay all the WAL, so reachedConsistency is never set. During archive - * recovery, the database is consistent once minRecoveryPoint is reached. - */ -bool reachedConsistency = false; - -static bool InRedo = false; - -/* Have we launched bgwriter during recovery? */ -static bool bgwriterLaunched = false; - /* For WALInsertLockAcquire/Release functions */ static int MyLockNo = 0; static bool holdingAllLocks = false; @@ -899,93 +634,61 @@ static bool holdingAllLocks = false; static MemoryContext walDebugCxt = NULL; #endif -static void readRecoverySignalFile(void); -static void validateRecoveryParameters(void); -static void exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog); -static bool recoveryStopsBefore(XLogReaderState *record); -static bool recoveryStopsAfter(XLogReaderState *record); -static void ConfirmRecoveryPaused(void); -static void recoveryPausesHere(bool endOfRecovery); -static bool recoveryApplyDelay(XLogReaderState *record); -static void SetLatestXTime(TimestampTz xtime); -static void SetCurrentChunkStartTime(TimestampTz xtime); +static void CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, + XLogRecPtr EndOfLog, + TimeLineID newTLI); static void CheckRequiredParameterValues(void); static void XLogReportParameters(void); -static void checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, - TimeLineID prevTLI); -static void VerifyOverwriteContrecord(xl_overwrite_contrecord *xlrec, - XLogReaderState *state); -static void LocalSetXLogInsertAllowed(void); +static int LocalSetXLogInsertAllowed(void); static void CreateEndOfRecoveryRecord(void); -static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn); +static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, + XLogRecPtr missingContrecPtr, + TimeLineID newTLI); static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags); static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo); static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void); -static void AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic); -static bool XLogCheckpointNeeded(XLogSegNo new_segno); -static void XLogWrite(XLogwrtRqst WriteRqst, bool flexible); +static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, + bool opportunistic); +static void XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible); static bool InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, bool find_free, XLogSegNo max_segno, - bool use_lock); -static int XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli, - XLogSource source, bool notfoundOk); -static int XLogFileReadAnyTLI(XLogSegNo segno, int emode, XLogSource source); -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); -static int emode_for_corrupt_record(int emode, XLogRecPtr RecPtr); + TimeLineID tli); static void XLogFileClose(void); -static void PreallocXlogFiles(XLogRecPtr endptr); +static void PreallocXlogFiles(XLogRecPtr endptr, TimeLineID tli); static void RemoveTempXlogFiles(void); -static void RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr); +static void RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, + XLogRecPtr endptr, TimeLineID insertTLI); static void RemoveXlogFile(const char *segname, XLogSegNo recycleSegNo, - XLogSegNo *endlogSegNo); + XLogSegNo *endlogSegNo, TimeLineID insertTLI); static void UpdateLastRemovedPtr(char *filename); static void ValidateXLOGDirectoryStructure(void); static void CleanupBackupHistory(void); static void UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force); -static XLogRecord *ReadRecord(XLogReaderState *xlogreader, - int emode, bool fetching_ckpt); -static void CheckRecoveryConsistency(void); -static XLogRecord *ReadCheckpointRecord(XLogReaderState *xlogreader, - XLogRecPtr RecPtr, int whichChkpt, bool report); -static bool rescanLatestTimeLine(void); +static bool PerformRecoveryXLogAction(void); static void InitControlFile(uint64 sysidentifier); static void WriteControlFile(void); static void ReadControlFile(void); +static void UpdateControlFile(void); static char *str_time(pg_time_t tnow); -static void SetPromoteIsTriggered(void); -static bool CheckForStandbyTrigger(void); -#ifdef WAL_DEBUG -static void xlog_outrec(StringInfo buf, XLogReaderState *record); -#endif -static void xlog_block_info(StringInfo buf, XLogReaderState *record); -static void xlog_outdesc(StringInfo buf, XLogReaderState *record); -static void pg_start_backup_callback(int code, Datum arg); -static void pg_stop_backup_callback(int code, Datum arg); -static bool read_backup_label(XLogRecPtr *checkPointLoc, - bool *backupEndRequired, bool *backupFromStandby); -static bool read_tablespace_map(List **tablespaces); - -static void rm_redo_error_callback(void *arg); +static void pg_backup_start_callback(int code, Datum arg); + static int get_sync_bit(int method); static void CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, - XLogRecPtr StartPos, XLogRecPtr EndPos); + XLogRecPtr StartPos, XLogRecPtr EndPos, + TimeLineID tli); static void ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr); static bool ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr); static XLogRecPtr WaitXLogInsertionsToFinish(XLogRecPtr upto); -static char *GetXLogBuffer(XLogRecPtr ptr); +static char *GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli); static XLogRecPtr XLogBytePosToRecPtr(uint64 bytepos); static XLogRecPtr XLogBytePosToEndRecPtr(uint64 bytepos); static uint64 XLogRecPtrToBytePos(XLogRecPtr ptr); -static void checkXLogConsistency(XLogReaderState *record); static void WALInsertLockAcquire(void); static void WALInsertLockAcquireExclusive(void); @@ -1007,6 +710,9 @@ static void WALInsertLockUpdateInsertingAt(XLogRecPtr insertingAt); * 'flags' gives more in-depth control on the record being inserted. See * XLogSetRecordFlags() for details. * + * 'topxid_included' tells whether the top-transaction id is logged along with + * current subtransaction. See XLogRecordAssemble(). + * * The first XLogRecData in the chain must be for the record header, and its * data must be MAXALIGNed. XLogInsertRecord fills in the xl_prev and * xl_crc fields in the header, the rest of the header must already be filled @@ -1022,7 +728,8 @@ XLogRecPtr XLogInsertRecord(XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, - int num_fpi) + int num_fpi, + bool topxid_included) { XLogCtlInsert *Insert = &XLogCtl->Insert; pg_crc32c rdata_crc; @@ -1034,6 +741,7 @@ XLogInsertRecord(XLogRecData *rdata, XLogRecPtr StartPos; XLogRecPtr EndPos; bool prevDoPageWrites = doPageWrites; + TimeLineID insertTLI; /* we assume that all of the record header is in the first chunk */ Assert(rdata->len >= SizeOfXLogRecord); @@ -1042,6 +750,12 @@ XLogInsertRecord(XLogRecData *rdata, if (!XLogInsertAllowed()) elog(ERROR, "cannot make new WAL entries during recovery"); + /* + * Given that we're not in recovery, InsertTimeLineID is set and can't + * change, so we can read it without a lock. + */ + insertTLI = XLogCtl->InsertTimeLineID; + /*---------- * * We have now done all the preparatory work we can without holding a @@ -1145,7 +859,7 @@ XLogInsertRecord(XLogRecData *rdata, * inserted. Copy the record in the space reserved. */ CopyXLogRecordToWAL(rechdr->xl_tot_len, isLogSwitch, rdata, - StartPos, EndPos); + StartPos, EndPos, insertTLI); /* * Unless record is flagged as not important, update LSN of last @@ -1173,9 +887,16 @@ XLogInsertRecord(XLogRecData *rdata, */ WALInsertLockRelease(); + END_CRIT_SECTION(); + MarkCurrentTransactionIdLoggedIfAny(); - END_CRIT_SECTION(); + /* + * Mark top transaction id is logged (if needed) so that we should not try + * to log it again with the next WAL record in the current subtransaction. + */ + if (topxid_included) + MarkSubxactTopXidLogged(); /* * Update shared LogwrtRqst.Write, if we crossed page boundary. @@ -1225,6 +946,8 @@ XLogInsertRecord(XLogRecData *rdata, if (XLOG_DEBUG) { static XLogReaderState *debug_reader = NULL; + XLogRecord *record; + DecodedXLogRecord *decoded; StringInfoData buf; StringInfoData recordBuf; char *errormsg = NULL; @@ -1244,15 +967,25 @@ 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); - + XL_ROUTINE(.page_read = NULL, + .segment_open = NULL, + .segment_close = NULL), + NULL); if (!debug_reader) { - appendStringInfoString(&buf, "error decoding record: out of memory"); + 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", @@ -1261,10 +994,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); @@ -1415,121 +1152,13 @@ ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr) return true; } -/* - * Checks whether the current buffer page and backup page stored in the - * WAL record are consistent or not. Before comparing the two pages, a - * masking can be applied to the pages to ignore certain areas like hint bits, - * unused space between pd_lower and pd_upper among other things. This - * function should be called once WAL replay has been completed for a - * given record. - */ -static void -checkXLogConsistency(XLogReaderState *record) -{ - RmgrId rmid = XLogRecGetRmid(record); - RelFileNode rnode; - ForkNumber forknum; - BlockNumber blkno; - int block_id; - - /* Records with no backup blocks have no need for consistency checks. */ - if (!XLogRecHasAnyBlockRefs(record)) - return; - - Assert((XLogRecGetInfo(record) & XLR_CHECK_CONSISTENCY) != 0); - - for (block_id = 0; block_id <= record->max_block_id; block_id++) - { - Buffer buf; - Page page; - - if (!XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blkno)) - { - /* - * WAL record doesn't contain a block reference with the given id. - * Do nothing. - */ - continue; - } - - Assert(XLogRecHasBlockImage(record, block_id)); - - if (XLogRecBlockImageApply(record, block_id)) - { - /* - * WAL record has already applied the page, so bypass the - * consistency check as that would result in comparing the full - * page stored in the record with itself. - */ - continue; - } - - /* - * Read the contents from the current buffer and store it in a - * temporary page. - */ - buf = XLogReadBufferExtended(rnode, forknum, blkno, - RBM_NORMAL_NO_LOG); - if (!BufferIsValid(buf)) - continue; - - LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); - page = BufferGetPage(buf); - - /* - * Take a copy of the local page where WAL has been applied to have a - * comparison base before masking it... - */ - memcpy(replay_image_masked, page, BLCKSZ); - - /* No need for this page anymore now that a copy is in. */ - UnlockReleaseBuffer(buf); - - /* - * If the block LSN is already ahead of this WAL record, we can't - * expect contents to match. This can happen if recovery is - * restarted. - */ - if (PageGetLSN(replay_image_masked) > record->EndRecPtr) - continue; - - /* - * Read the contents from the backup copy, stored in WAL record and - * store it in a temporary page. There is no need to allocate a new - * page here, a local buffer is fine to hold its contents and a mask - * can be directly applied on it. - */ - if (!RestoreBlockImage(record, block_id, primary_image_masked)) - elog(ERROR, "failed to restore block image"); - - /* - * If masking function is defined, mask both the primary and replay - * images - */ - if (RmgrTable[rmid].rm_mask != NULL) - { - RmgrTable[rmid].rm_mask(replay_image_masked, blkno); - RmgrTable[rmid].rm_mask(primary_image_masked, blkno); - } - - /* Time to compare the primary and replay images. */ - if (memcmp(replay_image_masked, primary_image_masked, BLCKSZ) != 0) - { - elog(FATAL, - "inconsistent page found, rel %u/%u/%u, forknum %u, blkno %u", - rnode.spcNode, rnode.dbNode, rnode.relNode, - forknum, blkno); - } - } -} - /* * Subroutine of XLogInsertRecord. Copies a WAL record to an already-reserved * area in the WAL. */ static void CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, - XLogRecPtr StartPos, XLogRecPtr EndPos) + XLogRecPtr StartPos, XLogRecPtr EndPos, TimeLineID tli) { char *currpos; int freespace; @@ -1542,7 +1171,7 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, * inserting to. */ CurrPos = StartPos; - currpos = GetXLogBuffer(CurrPos); + currpos = GetXLogBuffer(CurrPos, tli); freespace = INSERT_FREESPACE(CurrPos); /* @@ -1579,7 +1208,7 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, * page was initialized, in AdvanceXLInsertBuffer, and we're the * only backend that needs to set the contrecord flag. */ - currpos = GetXLogBuffer(CurrPos); + currpos = GetXLogBuffer(CurrPos, tli); pagehdr = (XLogPageHeader) currpos; pagehdr->xlp_rem_len = write_len - written; pagehdr->xlp_info |= XLP_FIRST_IS_CONTRECORD; @@ -1652,7 +1281,7 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, * (which itself calls the two methods we need) to get the pointer * and zero most of the page. Then we just zero the page header. */ - currpos = GetXLogBuffer(CurrPos); + currpos = GetXLogBuffer(CurrPos, tli); MemSet(currpos, 0, SizeOfXLogShortPHD); CurrPos += XLOG_BLCKSZ; @@ -1904,7 +1533,7 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto) * later, because older buffers might be recycled already) */ static char * -GetXLogBuffer(XLogRecPtr ptr) +GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) { int idx; XLogRecPtr endptr; @@ -1980,7 +1609,7 @@ GetXLogBuffer(XLogRecPtr ptr) WALInsertLockUpdateInsertingAt(initializedUpto); - AdvanceXLInsertBuffer(ptr, false); + AdvanceXLInsertBuffer(ptr, tli, false); endptr = XLogCtl->xlblocks[idx]; if (expectedEndPtr != endptr) @@ -2142,7 +1771,7 @@ XLogRecPtrToBytePos(XLogRecPtr ptr) * initialized properly. */ static void -AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic) +AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) { XLogCtlInsert *Insert = &XLogCtl->Insert; int nextidx; @@ -2215,9 +1844,9 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic) TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_START(); WriteRqst.Write = OldPageRqstPtr; WriteRqst.Flush = 0; - XLogWrite(WriteRqst, false); + 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 */ @@ -2249,7 +1878,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic) NewPage->xlp_magic = XLOG_PAGE_MAGIC; /* NewPage->xlp_info = 0; */ /* done by memset */ - NewPage->xlp_tli = ThisTimeLineID; + NewPage->xlp_tli = tli; NewPage->xlp_pageaddr = NewPageBeginPtr; /* NewPage->xlp_rem_len = 0; */ /* done by memset */ @@ -2270,18 +1899,6 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic) if (!Insert->forcePageWrites) NewPage->xlp_info |= XLP_BKP_REMOVABLE; - /* - * If a record was found to be broken at the end of recovery, and - * we're going to write on the page where its first contrecord was - * lost, set the XLP_FIRST_IS_OVERWRITE_CONTRECORD flag on the page - * header. See CreateOverwriteContrecordRecord(). - */ - if (missingContrecPtr == NewPageBeginPtr) - { - NewPage->xlp_info |= XLP_FIRST_IS_OVERWRITE_CONTRECORD; - missingContrecPtr = InvalidXLogRecPtr; - } - /* * If first page of an XLOG segment file, make it a long header. */ @@ -2420,7 +2037,7 @@ XLOGfileslop(XLogRecPtr lastredoptr) * * Note: it is caller's responsibility that RedoRecPtr is up-to-date. */ -static bool +bool XLogCheckpointNeeded(XLogSegNo new_segno) { XLogSegNo old_segno; @@ -2445,12 +2062,11 @@ XLogCheckpointNeeded(XLogSegNo new_segno) * write. */ static void -XLogWrite(XLogwrtRqst WriteRqst, bool flexible) +XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) { bool ispartialpage; bool last_iteration; bool finishing_seg; - bool use_existent; int curridx; int npages; int startidx; @@ -2514,10 +2130,10 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) XLogFileClose(); XLByteToPrevSeg(LogwrtResult.Write, openLogSegNo, wal_segment_size); + openLogTLI = tli; /* create/use new log file */ - use_existent = true; - openLogFile = XLogFileInit(openLogSegNo, &use_existent, true); + openLogFile = XLogFileInit(openLogSegNo, tli); ReserveExternalFD(); } @@ -2526,7 +2142,8 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) { XLByteToPrevSeg(LogwrtResult.Write, openLogSegNo, wal_segment_size); - openLogFile = XLogFileOpen(openLogSegNo); + openLogTLI = tli; + openLogFile = XLogFileOpen(openLogSegNo, tli); ReserveExternalFD(); } @@ -2587,10 +2204,10 @@ XLogWrite(XLogwrtRqst WriteRqst, 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) { @@ -2601,7 +2218,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) continue; save_errno = errno; - XLogFileName(xlogfname, ThisTimeLineID, openLogSegNo, + XLogFileName(xlogfname, tli, openLogSegNo, wal_segment_size); errno = save_errno; ereport(PANIC, @@ -2632,7 +2249,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) */ if (finishing_seg) { - issue_xlog_fsync(openLogFile, openLogSegNo); + issue_xlog_fsync(openLogFile, openLogSegNo, tli); /* signal that we need to wakeup walsenders later */ WalSndWakeupRequest(); @@ -2640,7 +2257,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) LogwrtResult.Flush = LogwrtResult.Write; /* end of page */ if (XLogArchivingActive()) - XLogArchiveNotifySeg(openLogSegNo); + XLogArchiveNotifySeg(openLogSegNo, tli); XLogCtl->lastSegSwitchTime = (pg_time_t) time(NULL); XLogCtl->lastSegSwitchLSN = LogwrtResult.Flush; @@ -2681,7 +2298,6 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) */ if (LogwrtResult.Flush < WriteRqst.Flush && LogwrtResult.Flush < LogwrtResult.Write) - { /* * Could get here without iterating above loop, in which case we might @@ -2699,11 +2315,12 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible) { XLByteToPrevSeg(LogwrtResult.Write, openLogSegNo, wal_segment_size); - openLogFile = XLogFileOpen(openLogSegNo); + openLogTLI = tli; + openLogFile = XLogFileOpen(openLogSegNo, tli); ReserveExternalFD(); } - issue_xlog_fsync(openLogFile, openLogSegNo); + issue_xlog_fsync(openLogFile, openLogSegNo, tli); } /* signal that we need to wakeup walsenders later */ @@ -2814,7 +2431,7 @@ static void UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) { /* Quick check using our local copy of the variable */ - if (!updateMinRecoveryPoint || (!force && lsn <= minRecoveryPoint)) + if (!updateMinRecoveryPoint || (!force && lsn <= LocalMinRecoveryPoint)) return; /* @@ -2828,7 +2445,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) * available is replayed in this case. This also saves from extra locks * taken on the control file from the startup process. */ - if (XLogRecPtrIsInvalid(minRecoveryPoint) && InRecovery) + if (XLogRecPtrIsInvalid(LocalMinRecoveryPoint) && InRecovery) { updateMinRecoveryPoint = false; return; @@ -2837,12 +2454,12 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); /* update local copy */ - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; - if (XLogRecPtrIsInvalid(minRecoveryPoint)) + if (XLogRecPtrIsInvalid(LocalMinRecoveryPoint)) updateMinRecoveryPoint = false; - else if (force || minRecoveryPoint < lsn) + else if (force || LocalMinRecoveryPoint < lsn) { XLogRecPtr newMinRecoveryPoint; TimeLineID newMinRecoveryPointTLI; @@ -2860,11 +2477,7 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) * all. Instead, we just log a warning and continue with recovery. * (See also the comments about corrupt LSNs in XLogFlush.) */ - SpinLockAcquire(&XLogCtl->info_lck); - newMinRecoveryPoint = XLogCtl->replayEndRecPtr; - newMinRecoveryPointTLI = XLogCtl->replayEndTLI; - SpinLockRelease(&XLogCtl->info_lck); - + newMinRecoveryPoint = GetCurrentReplayRecPtr(&newMinRecoveryPointTLI); if (!force && newMinRecoveryPoint < lsn) elog(WARNING, "xlog min recovery request %X/%X is past current point %X/%X", @@ -2876,12 +2489,12 @@ UpdateMinRecoveryPoint(XLogRecPtr lsn, bool force) ControlFile->minRecoveryPoint = newMinRecoveryPoint; ControlFile->minRecoveryPointTLI = newMinRecoveryPointTLI; UpdateControlFile(); - minRecoveryPoint = newMinRecoveryPoint; - minRecoveryPointTLI = newMinRecoveryPointTLI; + LocalMinRecoveryPoint = newMinRecoveryPoint; + LocalMinRecoveryPointTLI = newMinRecoveryPointTLI; ereport(DEBUG2, (errmsg_internal("updated min recovery point to %X/%X on timeline %u", - LSN_FORMAT_ARGS(minRecoveryPoint), + LSN_FORMAT_ARGS(newMinRecoveryPoint), newMinRecoveryPointTLI))); } } @@ -2899,6 +2512,7 @@ XLogFlush(XLogRecPtr record) { XLogRecPtr WriteRqstPtr; XLogwrtRqst WriteRqst; + TimeLineID insertTLI = XLogCtl->InsertTimeLineID; /* * During REDO, we are reading not writing WAL. Therefore, instead of @@ -3019,7 +2633,7 @@ XLogFlush(XLogRecPtr record) WriteRqst.Write = insertpos; WriteRqst.Flush = insertpos; - XLogWrite(WriteRqst, false); + XLogWrite(WriteRqst, insertTLI, false); LWLockRelease(WALWriteLock); /* done */ @@ -3091,11 +2705,18 @@ XLogBackgroundFlush(void) static TimestampTz lastflush; TimestampTz now; int flushbytes; + TimeLineID insertTLI; /* XLOG doesn't need flushing during recovery */ if (RecoveryInProgress()) return false; + /* + * Since we're not in recovery, InsertTimeLineID is set and can't change, + * so we can read it without a lock. + */ + insertTLI = XLogCtl->InsertTimeLineID; + /* read LogwrtResult and update local state */ SpinLockAcquire(&XLogCtl->info_lck); LogwrtResult = XLogCtl->LogwrtResult; @@ -3186,7 +2807,7 @@ XLogBackgroundFlush(void) if (WriteRqst.Write > LogwrtResult.Write || WriteRqst.Flush > LogwrtResult.Flush) { - XLogWrite(WriteRqst, flexible); + XLogWrite(WriteRqst, insertTLI, flexible); } LWLockRelease(WALWriteLock); @@ -3199,7 +2820,7 @@ XLogBackgroundFlush(void) * Great, done. To take some work off the critical path, try to initialize * as many of the no-longer-needed WAL buffers for future use as we can. */ - AdvanceXLInsertBuffer(InvalidXLogRecPtr, true); + AdvanceXLInsertBuffer(InvalidXLogRecPtr, insertTLI, true); /* * If we determined that we need to write data, but somebody else @@ -3233,11 +2854,11 @@ XLogNeedsFlush(XLogRecPtr record) * which cannot update its local copy of minRecoveryPoint as long as * it has not replayed all WAL available when doing crash recovery. */ - if (XLogRecPtrIsInvalid(minRecoveryPoint) && InRecovery) + if (XLogRecPtrIsInvalid(LocalMinRecoveryPoint) && InRecovery) updateMinRecoveryPoint = false; /* Quick exit if already known to be updated or cannot be updated */ - if (record <= minRecoveryPoint || !updateMinRecoveryPoint) + if (record <= LocalMinRecoveryPoint || !updateMinRecoveryPoint) return false; /* @@ -3246,8 +2867,8 @@ XLogNeedsFlush(XLogRecPtr record) */ if (!LWLockConditionalAcquire(ControlFileLock, LW_SHARED)) return true; - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; LWLockRelease(ControlFileLock); /* @@ -3255,11 +2876,11 @@ XLogNeedsFlush(XLogRecPtr record) * process doing crash recovery, which should not update the control * file value if crash recovery is still running. */ - if (XLogRecPtrIsInvalid(minRecoveryPoint)) + if (XLogRecPtrIsInvalid(LocalMinRecoveryPoint)) updateMinRecoveryPoint = false; /* check again */ - if (record <= minRecoveryPoint || !updateMinRecoveryPoint) + if (record <= LocalMinRecoveryPoint || !updateMinRecoveryPoint) return false; else return true; @@ -3282,29 +2903,22 @@ XLogNeedsFlush(XLogRecPtr record) } /* - * Create a new XLOG file segment, or open a pre-existing one. - * - * logsegno: identify segment to be created/opened. + * Try to make a given XLOG file segment exist. * - * *use_existent: if true, OK to use a pre-existing file (else, any - * pre-existing file will be deleted). On return, true if a pre-existing - * file was used. + * logsegno: identify segment. * - * use_lock: if true, acquire ControlFileLock while moving file into - * place. This should be true except during bootstrap log creation. The - * caller must *not* hold the lock at call. + * *added: on return, true if this call raised the number of extant segments. * - * Returns FD of opened file. + * path: on return, this char[MAXPGPATH] has the path to the logsegno file. * - * Note: errors here are ERROR not PANIC because we might or might not be - * inside a critical section (eg, during checkpoint there is no reason to - * take down the system on failure). They will promote to PANIC if we are - * in a critical section. + * Returns -1 or FD of opened file. A -1 here is not an error; a caller + * wanting an open segment should attempt to open "path", which usually will + * succeed. (This is weird, but it's efficient for the callers.) */ -int -XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock) +static int +XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli, + bool *added, char *path) { - char path[MAXPGPATH]; char tmppath[MAXPGPATH]; PGAlignedXLogBlock zbuffer; XLogSegNo installed_segno; @@ -3312,24 +2926,24 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock) int fd; int save_errno; - XLogFilePath(path, ThisTimeLineID, logsegno, wal_segment_size); + Assert(logtli != 0); + + XLogFilePath(path, logtli, logsegno, wal_segment_size); /* * Try to use existent file (checkpoint maker may have created it already) */ - if (*use_existent) + *added = false; + fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method)); + if (fd < 0) { - fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method)); - if (fd < 0) - { - if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", path))); - } - else - return fd; + if (errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", path))); } + else + return fd; /* * Initialize an empty (all zeroes) segment. NOTE: it is possible that @@ -3442,12 +3056,9 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock) errmsg("could not close file \"%s\": %m", tmppath))); /* - * Now move the segment into place with its final name. - * - * If caller didn't want to use a pre-existing file, get rid of any - * pre-existing file. Otherwise, cope with possibility that someone else - * has created the file while we were filling ours: if so, use ours to - * pre-create a future log segment. + * Now move the segment into place with its final name. Cope with + * possibility that someone else has created the file while we were + * filling ours: if so, use ours to pre-create a future log segment. */ installed_segno = logsegno; @@ -3461,33 +3072,57 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock) * CheckPointSegments. */ max_segno = logsegno + CheckPointSegments; - if (!InstallXLogFileSegment(&installed_segno, tmppath, - *use_existent, max_segno, - use_lock)) + if (InstallXLogFileSegment(&installed_segno, tmppath, true, max_segno, + logtli)) + { + *added = true; + elog(DEBUG2, "done creating and filling new WAL file"); + } + else { /* * No need for any more future segments, or InstallXLogFileSegment() - * failed to rename the file into place. If the rename failed, opening - * the file below will fail. + * failed to rename the file into place. If the rename failed, a + * caller opening the file may fail. */ unlink(tmppath); + elog(DEBUG2, "abandoned new WAL file"); } - /* Set flag to tell caller there was no existent file */ - *use_existent = false; + return -1; +} + +/* + * Create a new XLOG file segment, or open a pre-existing one. + * + * logsegno: identify segment to be created/opened. + * + * Returns FD of opened file. + * + * Note: errors here are ERROR not PANIC because we might or might not be + * inside a critical section (eg, during checkpoint there is no reason to + * take down the system on failure). They will promote to PANIC if we are + * in a critical section. + */ +int +XLogFileInit(XLogSegNo logsegno, TimeLineID logtli) +{ + bool ignore_added; + char path[MAXPGPATH]; + int fd; + + Assert(logtli != 0); + + fd = XLogFileInitInternal(logsegno, logtli, &ignore_added, path); + if (fd >= 0) + return fd; /* Now open original target segment (might not be file I just made) */ fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method)); if (fd < 0) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", path), - (AmCheckpointerProcess() ? - errhint("This is known to fail occasionally during archive recovery, where it is harmless.") : - 0))); - - elog(DEBUG2, "done creating and filling new WAL file"); - + errmsg("could not open file \"%s\": %m", path))); return fd; } @@ -3507,7 +3142,8 @@ XLogFileInit(XLogSegNo logsegno, bool *use_existent, bool use_lock) * emplacing a bogus file. */ static void -XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno, +XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno, + TimeLineID srcTLI, XLogSegNo srcsegno, int upto) { char path[MAXPGPATH]; @@ -3620,7 +3256,7 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno, /* * Now move the segment into place with its final name. */ - if (!InstallXLogFileSegment(&destsegno, tmppath, false, 0, false)) + if (!InstallXLogFileSegment(&destsegno, tmppath, false, 0, destTLI)) elog(ERROR, "InstallXLogFileSegment should not have failed"); } @@ -3644,29 +3280,29 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno, * free slot is found between *segno and max_segno. (Ignored when find_free * is false.) * - * use_lock: if true, acquire ControlFileLock while moving file into - * place. This should be true except during bootstrap log creation. The - * caller must *not* hold the lock at call. + * tli: The timeline on which the new segment should be installed. * * Returns true if the file was installed successfully. false indicates that - * max_segno limit was exceeded, or an error occurred while renaming the - * file into place. + * max_segno limit was exceeded, the startup process has disabled this + * function for now, or an error occurred while renaming the file into place. */ static bool InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, - bool find_free, XLogSegNo max_segno, - bool use_lock) + bool find_free, XLogSegNo max_segno, TimeLineID tli) { char path[MAXPGPATH]; struct stat stat_buf; - XLogFilePath(path, ThisTimeLineID, *segno, wal_segment_size); + Assert(tli != 0); - /* - * We want to be sure that only one process does this at a time. - */ - if (use_lock) - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + XLogFilePath(path, tli, *segno, wal_segment_size); + + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + if (!XLogCtl->InstallXLogFileSegmentActive) + { + LWLockRelease(ControlFileLock); + return false; + } if (!find_free) { @@ -3681,12 +3317,11 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, if ((*segno) >= max_segno) { /* Failed to find a free slot within specified range */ - if (use_lock) - LWLockRelease(ControlFileLock); + LWLockRelease(ControlFileLock); return false; } (*segno)++; - XLogFilePath(path, ThisTimeLineID, *segno, wal_segment_size); + XLogFilePath(path, tli, *segno, wal_segment_size); } } @@ -3696,14 +3331,12 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, */ if (durable_rename_excl(tmppath, path, LOG) != 0) { - if (use_lock) - LWLockRelease(ControlFileLock); + LWLockRelease(ControlFileLock); /* durable_rename_excl already emitted log message */ return false; } - if (use_lock) - LWLockRelease(ControlFileLock); + LWLockRelease(ControlFileLock); return true; } @@ -3712,12 +3345,12 @@ InstallXLogFileSegment(XLogSegNo *segno, char *tmppath, * Open a pre-existing logfile segment for writing. */ int -XLogFileOpen(XLogSegNo segno) +XLogFileOpen(XLogSegNo segno, TimeLineID tli) { char path[MAXPGPATH]; int fd; - XLogFilePath(path, ThisTimeLineID, segno, wal_segment_size); + XLogFilePath(path, tli, segno, wal_segment_size); fd = BasicOpenFile(path, O_RDWR | PG_BINARY | get_sync_bit(sync_method)); if (fd < 0) @@ -3729,222 +3362,35 @@ XLogFileOpen(XLogSegNo segno) } /* - * Open a logfile segment for reading (during recovery). - * - * If source == XLOG_FROM_ARCHIVE, the segment is retrieved from archive. - * Otherwise, it's assumed to be already available in pg_wal. + * Close the current logfile segment for writing. */ -static int -XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli, - XLogSource source, bool notfoundOk) +static void +XLogFileClose(void) { - char xlogfname[MAXFNAMELEN]; - char activitymsg[MAXFNAMELEN + 16]; - char path[MAXPGPATH]; - int fd; + Assert(openLogFile >= 0); - XLogFileName(xlogfname, tli, segno, wal_segment_size); + /* + * WAL segment files will not be re-read in normal operation, so we advise + * the OS to release any cached pages. But do not do so if WAL archiving + * or streaming is active, because archiver and walsender process could + * use the cache to read the WAL segment. + */ +#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) + if (!XLogIsNeeded()) + (void) posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED); +#endif - switch (source) + if (close(openLogFile) != 0) { - case XLOG_FROM_ARCHIVE: - /* Report recovery progress in PS display */ - snprintf(activitymsg, sizeof(activitymsg), "waiting for %s", - xlogfname); - set_ps_display(activitymsg); + char xlogfname[MAXFNAMELEN]; + int save_errno = errno; - restoredFromArchive = RestoreArchivedFile(path, xlogfname, - "RECOVERYXLOG", - wal_segment_size, - InRedo); - if (!restoredFromArchive) - return -1; - break; - - case XLOG_FROM_PG_WAL: - case XLOG_FROM_STREAM: - XLogFilePath(path, tli, segno, wal_segment_size); - restoredFromArchive = false; - break; - - default: - elog(ERROR, "invalid XLogFileRead source %d", source); - } - - /* - * If the segment was fetched from archival storage, replace the existing - * xlog segment (if any) with the archival version. - */ - if (source == XLOG_FROM_ARCHIVE) - { - KeepFileRestoredFromArchive(path, xlogfname); - - /* - * Set path to point at the new file in pg_wal. - */ - snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlogfname); - } - - fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); - if (fd >= 0) - { - /* Success! */ - curFileTLI = tli; - - /* Report recovery progress in PS display */ - snprintf(activitymsg, sizeof(activitymsg), "recovering %s", - xlogfname); - set_ps_display(activitymsg); - - /* Track source of data in assorted state variables */ - readSource = source; - XLogReceiptSource = source; - /* In FROM_STREAM case, caller tracks receipt time, not me */ - if (source != XLOG_FROM_STREAM) - XLogReceiptTime = GetCurrentTimestamp(); - - return fd; - } - if (errno != ENOENT || !notfoundOk) /* unexpected failure? */ - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", path))); - return -1; -} - -/* - * Open a logfile segment for reading (during recovery). - * - * This version searches for the segment with any TLI listed in expectedTLEs. - */ -static int -XLogFileReadAnyTLI(XLogSegNo segno, int emode, XLogSource source) -{ - char path[MAXPGPATH]; - ListCell *cell; - int fd; - List *tles; - - /* - * Loop looking for a suitable timeline ID: we might need to read any of - * the timelines listed in expectedTLEs. - * - * We expect curFileTLI on entry to be the TLI of the preceding file in - * sequence, or 0 if there was no predecessor. We do not allow curFileTLI - * to go backwards; this prevents us from picking up the wrong file when a - * parent timeline extends to higher segment numbers than the child we - * want to read. - * - * If we haven't read the timeline history file yet, read it now, so that - * we know which TLIs to scan. We don't save the list in expectedTLEs, - * however, unless we actually find a valid segment. That way if there is - * neither a timeline history file nor a WAL segment in the archive, and - * streaming replication is set up, we'll read the timeline history file - * streamed from the primary when we start streaming, instead of - * recovering with a dummy history generated here. - */ - if (expectedTLEs) - tles = expectedTLEs; - else - tles = readTimeLineHistory(recoveryTargetTLI); - - foreach(cell, tles) - { - TimeLineHistoryEntry *hent = (TimeLineHistoryEntry *) lfirst(cell); - TimeLineID tli = hent->tli; - - if (tli < curFileTLI) - break; /* don't bother looking at too-old TLIs */ - - /* - * Skip scanning the timeline ID that the logfile segment to read - * doesn't belong to - */ - if (hent->begin != InvalidXLogRecPtr) - { - XLogSegNo beginseg = 0; - - XLByteToSeg(hent->begin, beginseg, wal_segment_size); - - /* - * The logfile segment that doesn't belong to the timeline is - * older or newer than the segment that the timeline started or - * ended at, respectively. It's sufficient to check only the - * starting segment of the timeline here. Since the timelines are - * scanned in descending order in this loop, any segments newer - * than the ending segment should belong to newer timeline and - * have already been read before. So it's not necessary to check - * the ending segment of the timeline here. - */ - if (segno < beginseg) - continue; - } - - if (source == XLOG_FROM_ANY || source == XLOG_FROM_ARCHIVE) - { - fd = XLogFileRead(segno, emode, tli, - XLOG_FROM_ARCHIVE, true); - if (fd != -1) - { - elog(DEBUG1, "got WAL segment from archive"); - if (!expectedTLEs) - expectedTLEs = tles; - return fd; - } - } - - if (source == XLOG_FROM_ANY || source == XLOG_FROM_PG_WAL) - { - fd = XLogFileRead(segno, emode, tli, - XLOG_FROM_PG_WAL, true); - if (fd != -1) - { - if (!expectedTLEs) - expectedTLEs = tles; - return fd; - } - } - } - - /* Couldn't find it. For simplicity, complain about front timeline */ - XLogFilePath(path, recoveryTargetTLI, segno, wal_segment_size); - errno = ENOENT; - ereport(emode, - (errcode_for_file_access(), - errmsg("could not open file \"%s\": %m", path))); - return -1; -} - -/* - * Close the current logfile segment for writing. - */ -static void -XLogFileClose(void) -{ - Assert(openLogFile >= 0); - - /* - * WAL segment files will not be re-read in normal operation, so we advise - * the OS to release any cached pages. But do not do so if WAL archiving - * or streaming is active, because archiver and walsender process could - * use the cache to read the WAL segment. - */ -#if defined(USE_POSIX_FADVISE) && defined(POSIX_FADV_DONTNEED) - if (!XLogIsNeeded()) - (void) posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED); -#endif - - if (close(openLogFile) != 0) - { - char xlogfname[MAXFNAMELEN]; - int save_errno = errno; - - XLogFileName(xlogfname, ThisTimeLineID, openLogSegNo, wal_segment_size); - errno = save_errno; - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not close file \"%s\": %m", xlogfname))); - } + XLogFileName(xlogfname, openLogTLI, openLogSegNo, wal_segment_size); + errno = save_errno; + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not close file \"%s\": %m", xlogfname))); + } openLogFile = -1; ReleaseExternalFD(); @@ -3959,24 +3405,37 @@ XLogFileClose(void) * High-volume systems will be OK once they've built up a sufficient set of * recycled log segments, but the startup transient is likely to include * a lot of segment creations by foreground processes, which is not so good. + * + * XLogFileInitInternal() can ereport(ERROR). All known causes indicate big + * trouble; for example, a full filesystem is one cause. The checkpoint WAL + * and/or ControlFile updates already completed. If a RequestCheckpoint() + * initiated the present checkpoint and an ERROR ends this function, the + * command that called RequestCheckpoint() fails. That's not ideal, but it's + * not worth contorting more functions to use caller-specified elevel values. + * (With or without RequestCheckpoint(), an ERROR forestalls some inessential + * reporting and resource reclamation.) */ static void -PreallocXlogFiles(XLogRecPtr endptr) +PreallocXlogFiles(XLogRecPtr endptr, TimeLineID tli) { XLogSegNo _logSegNo; int lf; - bool use_existent; + bool added; + char path[MAXPGPATH]; uint64 offset; + if (!XLogCtl->InstallXLogFileSegmentActive) + return; /* unlocked check says no */ + XLByteToPrevSeg(endptr, _logSegNo, wal_segment_size); offset = XLogSegmentOffset(endptr - 1, wal_segment_size); if (offset >= (uint32) (0.75 * wal_segment_size)) { _logSegNo++; - use_existent = true; - lf = XLogFileInit(_logSegNo, &use_existent, true); - close(lf); - if (!use_existent) + lf = XLogFileInitInternal(_logSegNo, tli, &added, path); + if (lf >= 0) + close(lf); + if (added) CheckpointStats.ckpt_segs_added++; } } @@ -4090,9 +3549,13 @@ RemoveTempXlogFiles(void) * endptr is current (or recent) end of xlog, and lastredoptr is the * redo pointer of the last checkpoint. These are used to determine * whether we want to recycle rather than delete no-longer-wanted log files. + * + * insertTLI is the current timeline for XLOG insertion. Any recycled + * segments should be reused for this timeline. */ static void -RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr) +RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr, + TimeLineID insertTLI) { DIR *xldir; struct dirent *xlde; @@ -4107,7 +3570,7 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr) /* * Construct a filename of the last segment to be kept. The timeline ID * doesn't matter, we ignore that in the comparison. (During recovery, - * ThisTimeLineID isn't set, so we can't use that.) + * InsertTimeLineID isn't set, so we can't use that.) */ XLogFileName(lastoff, 0, segno, wal_segment_size); @@ -4141,7 +3604,8 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr) /* Update the last removed location in shared memory first */ UpdateLastRemovedPtr(xlde->d_name); - RemoveXlogFile(xlde->d_name, recycleSegNo, &endlogSegNo); + RemoveXlogFile(xlde->d_name, recycleSegNo, &endlogSegNo, + insertTLI); } } } @@ -4164,7 +3628,7 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr) * 'switchpoint' is the current point in WAL where we switch to new timeline, * and 'newTLI' is the new timeline we switch to. */ -static void +void RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI) { DIR *xldir; @@ -4213,7 +3677,8 @@ RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI) * - but seems safer to let them be archived and removed later. */ if (!XLogArchiveIsReady(xlde->d_name)) - RemoveXlogFile(xlde->d_name, recycleSegNo, &endLogSegNo); + RemoveXlogFile(xlde->d_name, recycleSegNo, &endLogSegNo, + newTLI); } } @@ -4229,10 +3694,13 @@ RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI) * * endlogSegNo gets incremented if the segment is recycled so as it is not * checked again with future callers of this function. + * + * insertTLI is the current timeline for XLOG insertion. Any recycled segments + * should be used for this timeline. */ static void RemoveXlogFile(const char *segname, XLogSegNo recycleSegNo, - XLogSegNo *endlogSegNo) + XLogSegNo *endlogSegNo, TimeLineID insertTLI) { char path[MAXPGPATH]; #ifdef WIN32 @@ -4249,9 +3717,10 @@ RemoveXlogFile(const char *segname, XLogSegNo recycleSegNo, */ if (wal_recycle && *endlogSegNo <= recycleSegNo && + XLogCtl->InstallXLogFileSegmentActive && /* callee rechecks this */ lstat(path, &statbuf) == 0 && S_ISREG(statbuf.st_mode) && InstallXLogFileSegment(endlogSegNo, path, - true, recycleSegNo, true)) + true, recycleSegNo, insertTLI)) { ereport(DEBUG2, (errmsg_internal("recycled write-ahead log file \"%s\"", @@ -4262,7 +3731,7 @@ RemoveXlogFile(const char *segname, XLogSegNo recycleSegNo, } else { - /* No need for any more future segments... */ + /* No need for any more future segments, or recycling failed ... */ int rc; ereport(DEBUG2, @@ -4384,268 +3853,6 @@ CleanupBackupHistory(void) FreeDir(xldir); } -/* - * Attempt to read the next XLOG record. - * - * Before first call, the reader needs to be positioned to the first record - * by calling XLogBeginRead(). - * - * 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, - bool fetching_ckpt) -{ - XLogRecord *record; - XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data; - - /* Pass through parameters to XLogPageRead */ - private->fetching_ckpt = fetching_ckpt; - private->emode = emode; - private->randAccess = (xlogreader->ReadRecPtr == InvalidXLogRecPtr); - - /* This is the first attempt to read this page. */ - lastSourceFailed = false; - - for (;;) - { - char *errormsg; - - record = XLogReadRecord(xlogreader, &errormsg); - ReadRecPtr = xlogreader->ReadRecPtr; - EndRecPtr = xlogreader->EndRecPtr; - if (record == NULL) - { - /* - * When 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 to downstream WAL readers that that portion is to be - * ignored. - * - * However, when ArchiveRecoveryRequested = true, we're going to - * switch to a new timeline at the end of recovery. We will only - * copy WAL over to the new timeline up to the end of the last - * complete record, so if we did this, we would later create an - * overwrite contrecord in the wrong place, breaking everything. - */ - if (!ArchiveRecoveryRequested && - !XLogRecPtrIsInvalid(xlogreader->abortedRecPtr)) - { - abortedRecPtr = xlogreader->abortedRecPtr; - missingContrecPtr = xlogreader->missingContrecPtr; - } - - if (readFile >= 0) - { - close(readFile); - readFile = -1; - } - - /* - * We only end up here without a message when XLogPageRead() - * failed - in that case we already logged something. In - * StandbyMode that only happens if we have been triggered, so we - * shouldn't loop anymore in that case. - */ - if (errormsg) - ereport(emode_for_corrupt_record(emode, EndRecPtr), - (errmsg_internal("%s", errormsg) /* already translated */ )); - } - - /* - * Check page TLI is one of the expected values. - */ - else if (!tliInHistory(xlogreader->latestPageTLI, expectedTLEs)) - { - char fname[MAXFNAMELEN]; - XLogSegNo segno; - int32 offset; - - XLByteToSeg(xlogreader->latestPagePtr, segno, wal_segment_size); - offset = XLogSegmentOffset(xlogreader->latestPagePtr, - wal_segment_size); - XLogFileName(fname, xlogreader->seg.ws_tli, segno, - wal_segment_size); - ereport(emode_for_corrupt_record(emode, EndRecPtr), - (errmsg("unexpected timeline ID %u in log segment %s, offset %u", - xlogreader->latestPageTLI, - fname, - offset))); - record = NULL; - } - - if (record) - { - /* Great, got a record */ - return record; - } - else - { - /* No valid record available from this source */ - lastSourceFailed = true; - - /* - * If archive recovery was requested, but we were still doing - * crash recovery, switch to archive recovery and retry using the - * offline archive. We have now replayed all the valid WAL in - * pg_wal, so we are presumably now consistent. - * - * We require that there's at least some valid WAL present in - * pg_wal, however (!fetching_ckpt). We could recover using the - * WAL from the archive, even if pg_wal is completely empty, but - * we'd have no idea how far we'd have to replay to reach - * consistency. So err on the safe side and give up. - */ - if (!InArchiveRecovery && ArchiveRecoveryRequested && - !fetching_ckpt) - { - ereport(DEBUG1, - (errmsg_internal("reached end of WAL in pg_wal, entering archive recovery"))); - InArchiveRecovery = true; - if (StandbyModeRequested) - StandbyMode = true; - - /* initialize minRecoveryPoint to this record */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_IN_ARCHIVE_RECOVERY; - if (ControlFile->minRecoveryPoint < EndRecPtr) - { - ControlFile->minRecoveryPoint = EndRecPtr; - ControlFile->minRecoveryPointTLI = ThisTimeLineID; - } - /* update local copy */ - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; - - /* - * The startup process can update its local copy of - * minRecoveryPoint from this point. - */ - updateMinRecoveryPoint = true; - - UpdateControlFile(); - - /* - * We update SharedRecoveryState while holding the lock on - * ControlFileLock so both states are consistent in shared - * memory. - */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedRecoveryState = RECOVERY_STATE_ARCHIVE; - SpinLockRelease(&XLogCtl->info_lck); - - LWLockRelease(ControlFileLock); - - CheckRecoveryConsistency(); - - /* - * Before we retry, reset lastSourceFailed and currentSource - * so that we will check the archive next. - */ - lastSourceFailed = false; - currentSource = XLOG_FROM_ANY; - - continue; - } - - /* In standby mode, loop back to retry. Otherwise, give up. */ - if (StandbyMode && !CheckForStandbyTrigger()) - continue; - else - return NULL; - } - } -} - -/* - * Scan for new timelines that might have appeared in the archive since we - * started recovery. - * - * If there are any, the function changes recovery target TLI to the latest - * one and returns 'true'. - */ -static bool -rescanLatestTimeLine(void) -{ - List *newExpectedTLEs; - bool found; - ListCell *cell; - TimeLineID newtarget; - TimeLineID oldtarget = recoveryTargetTLI; - TimeLineHistoryEntry *currentTle = NULL; - - newtarget = findNewestTimeLine(recoveryTargetTLI); - if (newtarget == recoveryTargetTLI) - { - /* No new timelines found */ - return false; - } - - /* - * Determine the list of expected TLIs for the new TLI - */ - - newExpectedTLEs = readTimeLineHistory(newtarget); - - /* - * If the current timeline is not part of the history of the new timeline, - * we cannot proceed to it. - */ - found = false; - foreach(cell, newExpectedTLEs) - { - currentTle = (TimeLineHistoryEntry *) lfirst(cell); - - if (currentTle->tli == recoveryTargetTLI) - { - found = true; - break; - } - } - if (!found) - { - ereport(LOG, - (errmsg("new timeline %u is not a child of database system timeline %u", - newtarget, - ThisTimeLineID))); - return false; - } - - /* - * The current timeline was found in the history file, but check that the - * next timeline was forked off from it *after* the current recovery - * location. - */ - if (currentTle->end < EndRecPtr) - { - ereport(LOG, - (errmsg("new timeline %u forked off current database system timeline %u before current recovery point %X/%X", - newtarget, - ThisTimeLineID, - LSN_FORMAT_ARGS(EndRecPtr)))); - return false; - } - - /* The new timeline history seems valid. Switch target */ - recoveryTargetTLI = newtarget; - list_free_deep(expectedTLEs); - expectedTLEs = newExpectedTLEs; - - /* - * As in StartupXLOG(), try to ensure we have all the history files - * between the old target and new target in pg_wal. - */ - restoreTimeLineHistoryFiles(oldtarget + 1, newtarget); - - ereport(LOG, - (errmsg("new target timeline is %u", - recoveryTargetTLI))); - - return true; -} - /* * I/O routines for pg_control * @@ -4962,7 +4169,7 @@ ReadControlFile(void) snprintf(wal_segsz_str, sizeof(wal_segsz_str), "%d", wal_segment_size); SetConfigOption("wal_segment_size", wal_segsz_str, PGC_INTERNAL, - PGC_S_OVERRIDE); + PGC_S_DYNAMIC_DEFAULT); /* check and update variables dependent on wal_segment_size */ if (ConvertToXSegs(min_wal_size_mb, wal_segment_size) < 2) @@ -4981,14 +4188,14 @@ ReadControlFile(void) /* Make the initdb settings visible as GUC variables, too */ SetConfigOption("data_checksums", DataChecksumsEnabled() ? "yes" : "no", - PGC_INTERNAL, PGC_S_OVERRIDE); + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); } /* * Utility wrapper to update the control file. Note that the control * file gets flushed. */ -void +static void UpdateControlFile(void) { update_controlfile(DataDir, ControlFile, true); @@ -5138,13 +4345,22 @@ XLOGShmemSize(void) * This isn't an amazingly clean place to do this, but we must wait till * NBuffers has received its final value, and must do it before using the * value of XLOGbuffers to do anything important. + * + * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT. + * However, if the DBA explicitly set wal_buffers = -1 in the config file, + * then PGC_S_DYNAMIC_DEFAULT will fail to override that and we must force + * the matter with PGC_S_OVERRIDE. */ if (XLOGbuffers == -1) { char buf[32]; snprintf(buf, sizeof(buf), "%d", XLOGChooseNumBuffers()); - SetConfigOption("wal_buffers", buf, PGC_POSTMASTER, PGC_S_OVERRIDE); + SetConfigOption("wal_buffers", buf, PGC_POSTMASTER, + PGC_S_DYNAMIC_DEFAULT); + if (XLOGbuffers == -1) /* failed to apply it? */ + SetConfigOption("wal_buffers", buf, PGC_POSTMASTER, + PGC_S_OVERRIDE); } Assert(XLOGbuffers > 0); @@ -5266,15 +4482,12 @@ XLOGShmemInit(void) */ XLogCtl->XLogCacheBlck = XLOGbuffers - 1; XLogCtl->SharedRecoveryState = RECOVERY_STATE_CRASH; - XLogCtl->SharedHotStandbyActive = false; - XLogCtl->SharedPromoteIsTriggered = false; + XLogCtl->InstallXLogFileSegmentActive = false; XLogCtl->WalWriterSleeping = false; SpinLockInit(&XLogCtl->Insert.insertpos_lck); SpinLockInit(&XLogCtl->info_lck); SpinLockInit(&XLogCtl->ulsn_lck); - InitSharedLatch(&XLogCtl->recoveryWakeupLatch); - ConditionVariableInit(&XLogCtl->recoveryNotPausedCV); } /* @@ -5290,11 +4503,15 @@ BootStrapXLOG(void) XLogLongPageHeader longpage; XLogRecord *record; char *recptr; - bool use_existent; uint64 sysidentifier; struct timeval tv; pg_crc32c crc; + /* allow ordinary WAL segment creation, like StartupXLOG() would */ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + XLogCtl->InstallXLogFileSegmentActive = true; + LWLockRelease(ControlFileLock); + /* * Select a hopefully-unique system identifier code for this installation. * We use the result of gettimeofday(), including the fractional seconds @@ -5312,9 +4529,6 @@ BootStrapXLOG(void) sysidentifier |= ((uint64) tv.tv_usec) << 12; sysidentifier |= getpid() & 0xFFF; - /* First timeline ID is always 1 */ - ThisTimeLineID = 1; - /* page buffer must be aligned suitably for O_DIRECT */ buffer = (char *) palloc(XLOG_BLCKSZ + XLOG_BLCKSZ); page = (XLogPageHeader) TYPEALIGN(XLOG_BLCKSZ, buffer); @@ -5328,18 +4542,18 @@ BootStrapXLOG(void) * used, so that we can use 0/0 to mean "before any valid WAL segment". */ checkPoint.redo = wal_segment_size + SizeOfXLogLongPHD; - checkPoint.ThisTimeLineID = ThisTimeLineID; - checkPoint.PrevTimeLineID = ThisTimeLineID; + checkPoint.ThisTimeLineID = BootstrapTimeLineID; + checkPoint.PrevTimeLineID = BootstrapTimeLineID; checkPoint.fullPageWrites = fullPageWrites; checkPoint.nextXid = FullTransactionIdFromEpochAndXid(0, FirstNormalTransactionId); - checkPoint.nextOid = FirstBootstrapObjectId; + checkPoint.nextOid = FirstGenbkiObjectId; 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); @@ -5357,7 +4571,7 @@ BootStrapXLOG(void) /* Set up the XLOG page header */ page->xlp_magic = XLOG_PAGE_MAGIC; page->xlp_info = XLP_LONG_HEADER; - page->xlp_tli = ThisTimeLineID; + page->xlp_tli = BootstrapTimeLineID; page->xlp_pageaddr = wal_segment_size; longpage = (XLogLongPageHeader) page; longpage->xlp_sysid = sysidentifier; @@ -5387,8 +4601,8 @@ BootStrapXLOG(void) record->xl_crc = crc; /* Create first XLOG segment file */ - use_existent = false; - openLogFile = XLogFileInit(1, &use_existent, false); + openLogTLI = BootstrapTimeLineID; + openLogFile = XLogFileInit(1, BootstrapTimeLineID); /* * We needn't bother with Reserve/ReleaseExternalFD here, since we'll @@ -5460,223 +4674,39 @@ str_time(pg_time_t tnow) } /* - * See if there are any recovery signal files and if so, set state for - * recovery. - * - * See if there is a recovery command file (recovery.conf), and if so - * throw an ERROR since as of PG12 we no longer recognize that. + * Initialize the first WAL segment on new timeline. */ static void -readRecoverySignalFile(void) +XLogInitNewTimeline(TimeLineID endTLI, XLogRecPtr endOfLog, TimeLineID newTLI) { - struct stat stat_buf; + char xlogfname[MAXFNAMELEN]; + XLogSegNo endLogSegNo; + XLogSegNo startLogSegNo; - if (IsBootstrapProcessingMode()) - return; + /* we always switch to a new timeline after archive recovery */ + Assert(endTLI != newTLI); /* - * Check for old recovery API file: recovery.conf + * Update min recovery point one last time. */ - if (stat(RECOVERY_COMMAND_FILE, &stat_buf) == 0) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("using recovery command file \"%s\" is not supported", - RECOVERY_COMMAND_FILE))); + UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); /* - * Remove unused .done file, if present. Ignore if absent. + * Calculate the last segment on the old timeline, and the first segment + * on the new timeline. If the switch happens in the middle of a segment, + * they are the same, but if the switch happens exactly at a segment + * boundary, startLogSegNo will be endLogSegNo + 1. */ - unlink(RECOVERY_COMMAND_DONE); + XLByteToPrevSeg(endOfLog, endLogSegNo, wal_segment_size); + XLByteToSeg(endOfLog, startLogSegNo, wal_segment_size); /* - * Check for recovery signal files and if found, fsync them since they - * represent server state information. We don't sweat too much about the - * possibility of fsync failure, however. - * - * If present, standby signal file takes precedence. If neither is present - * then we won't enter archive recovery. + * Initialize the starting WAL segment for the new timeline. If the switch + * happens in the middle of a segment, copy data from the last WAL segment + * of the old timeline up to the switch point, to the starting WAL segment + * on the new timeline. */ - if (stat(STANDBY_SIGNAL_FILE, &stat_buf) == 0) - { - int fd; - - fd = BasicOpenFilePerm(STANDBY_SIGNAL_FILE, O_RDWR | PG_BINARY | get_sync_bit(sync_method), - S_IRUSR | S_IWUSR); - if (fd >= 0) - { - (void) pg_fsync(fd); - close(fd); - } - standby_signal_file_found = true; - } - else if (stat(RECOVERY_SIGNAL_FILE, &stat_buf) == 0) - { - int fd; - - fd = BasicOpenFilePerm(RECOVERY_SIGNAL_FILE, O_RDWR | PG_BINARY | get_sync_bit(sync_method), - S_IRUSR | S_IWUSR); - if (fd >= 0) - { - (void) pg_fsync(fd); - close(fd); - } - recovery_signal_file_found = true; - } - - StandbyModeRequested = false; - ArchiveRecoveryRequested = false; - if (standby_signal_file_found) - { - StandbyModeRequested = true; - ArchiveRecoveryRequested = true; - } - else if (recovery_signal_file_found) - { - StandbyModeRequested = false; - ArchiveRecoveryRequested = true; - } - else - return; - - /* - * We don't support standby mode in standalone backends; that requires - * other processes such as the WAL receiver to be alive. - */ - if (StandbyModeRequested && !IsUnderPostmaster) - ereport(FATAL, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("standby mode is not supported by single-user servers"))); -} - -static void -validateRecoveryParameters(void) -{ - if (!ArchiveRecoveryRequested) - return; - - /* - * Check for compulsory parameters - */ - if (StandbyModeRequested) - { - if ((PrimaryConnInfo == NULL || strcmp(PrimaryConnInfo, "") == 0) && - (recoveryRestoreCommand == NULL || strcmp(recoveryRestoreCommand, "") == 0)) - ereport(WARNING, - (errmsg("specified neither primary_conninfo nor restore_command"), - errhint("The database server will regularly poll the pg_wal subdirectory to check for files placed there."))); - } - else - { - if (recoveryRestoreCommand == NULL || - strcmp(recoveryRestoreCommand, "") == 0) - ereport(FATAL, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("must specify restore_command when standby mode is not enabled"))); - } - - /* - * Override any inconsistent requests. Note that this is a change of - * behaviour in 9.5; prior to this we simply ignored a request to pause if - * hot_standby = off, which was surprising behaviour. - */ - if (recoveryTargetAction == RECOVERY_TARGET_ACTION_PAUSE && - !EnableHotStandby) - recoveryTargetAction = RECOVERY_TARGET_ACTION_SHUTDOWN; - - /* - * Final parsing of recovery_target_time string; see also - * check_recovery_target_time(). - */ - if (recoveryTarget == RECOVERY_TARGET_TIME) - { - recoveryTargetTime = DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in, - CStringGetDatum(recovery_target_time_string), - ObjectIdGetDatum(InvalidOid), - Int32GetDatum(-1))); - } - - /* - * If user specified recovery_target_timeline, validate it or compute the - * "latest" value. We can't do this until after we've gotten the restore - * command and set InArchiveRecovery, because we need to fetch timeline - * history files from the archive. - */ - if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_NUMERIC) - { - TimeLineID rtli = recoveryTargetTLIRequested; - - /* Timeline 1 does not have a history file, all else should */ - if (rtli != 1 && !existsTimeLineHistory(rtli)) - ereport(FATAL, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("recovery target timeline %u does not exist", - rtli))); - recoveryTargetTLI = rtli; - } - else if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_LATEST) - { - /* We start the "latest" search from pg_control's timeline */ - recoveryTargetTLI = findNewestTimeLine(recoveryTargetTLI); - } - else - { - /* - * else we just use the recoveryTargetTLI as already read from - * ControlFile - */ - Assert(recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_CONTROLFILE); - } -} - -/* - * Exit archive-recovery state - */ -static void -exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog) -{ - char xlogfname[MAXFNAMELEN]; - XLogSegNo endLogSegNo; - XLogSegNo startLogSegNo; - - /* we always switch to a new timeline after archive recovery */ - Assert(endTLI != ThisTimeLineID); - - /* - * We are no longer in archive recovery state. - */ - InArchiveRecovery = false; - - /* - * Update min recovery point one last time. - */ - UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); - - /* - * If the ending log segment is still open, close it (to avoid problems on - * Windows with trying to rename or delete an open file). - */ - if (readFile >= 0) - { - close(readFile); - readFile = -1; - } - - /* - * Calculate the last segment on the old timeline, and the first segment - * on the new timeline. If the switch happens in the middle of a segment, - * they are the same, but if the switch happens exactly at a segment - * boundary, startLogSegNo will be endLogSegNo + 1. - */ - XLByteToPrevSeg(endOfLog, endLogSegNo, wal_segment_size); - XLByteToSeg(endOfLog, startLogSegNo, wal_segment_size); - - /* - * Initialize the starting WAL segment for the new timeline. If the switch - * happens in the middle of a segment, copy data from the last WAL segment - * of the old timeline up to the switch point, to the starting WAL segment - * on the new timeline. - */ - if (endLogSegNo == startLogSegNo) + if (endLogSegNo == startLogSegNo) { /* * Make a copy of the file on the new timeline. @@ -5685,7 +4715,7 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog) * considerations. But we should be just as tense as XLogFileInit to * avoid emplacing a bogus file. */ - XLogFileCopy(endLogSegNo, endTLI, endLogSegNo, + XLogFileCopy(newTLI, endLogSegNo, endTLI, endLogSegNo, XLogSegmentOffset(endOfLog, wal_segment_size)); } else @@ -5694,18 +4724,16 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog) * The switch happened at a segment boundary, so just create the next * segment on the new timeline. */ - bool use_existent = true; int fd; - fd = XLogFileInit(startLogSegNo, &use_existent, true); + fd = XLogFileInit(startLogSegNo, newTLI); if (close(fd) != 0) { char xlogfname[MAXFNAMELEN]; int save_errno = errno; - XLogFileName(xlogfname, ThisTimeLineID, startLogSegNo, - wal_segment_size); + XLogFileName(xlogfname, newTLI, startLogSegNo, wal_segment_size); errno = save_errno; ereport(ERROR, (errcode_for_file_access(), @@ -5717,7518 +4745,4155 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog) * Let's just make real sure there are not .ready or .done flags posted * for the new segment. */ - XLogFileName(xlogfname, ThisTimeLineID, startLogSegNo, wal_segment_size); + XLogFileName(xlogfname, newTLI, startLogSegNo, wal_segment_size); XLogArchiveCleanup(xlogfname); - - /* - * Remove the signal files out of the way, so that we don't accidentally - * re-enter archive recovery mode in a subsequent crash. - */ - if (standby_signal_file_found) - durable_unlink(STANDBY_SIGNAL_FILE, FATAL); - - if (recovery_signal_file_found) - durable_unlink(RECOVERY_SIGNAL_FILE, FATAL); - - ereport(LOG, - (errmsg("archive recovery complete"))); } /* - * Extract timestamp from WAL record. - * - * If the record contains a timestamp, returns true, and saves the timestamp - * in *recordXtime. If the record type has no timestamp, returns false. - * Currently, only transaction commit/abort records and restore points contain - * timestamps. - */ -static bool -getRecordTimestamp(XLogReaderState *record, TimestampTz *recordXtime) -{ - uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - uint8 xact_info = info & XLOG_XACT_OPMASK; - uint8 rmid = XLogRecGetRmid(record); - - if (rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT) - { - *recordXtime = ((xl_restore_point *) XLogRecGetData(record))->rp_time; - return true; - } - if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_COMMIT || - xact_info == XLOG_XACT_COMMIT_PREPARED)) - { - *recordXtime = ((xl_xact_commit *) XLogRecGetData(record))->xact_time; - return true; - } - if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_ABORT || - xact_info == XLOG_XACT_ABORT_PREPARED)) - { - *recordXtime = ((xl_xact_abort *) XLogRecGetData(record))->xact_time; - return true; - } - return false; -} - -/* - * For point-in-time recovery, this function decides whether we want to - * stop applying the XLOG before the current record. - * - * Returns true if we are stopping, false otherwise. If stopping, some - * information is saved in recoveryStopXid et al for use in annotating the - * new timeline's history file. + * Perform cleanup actions at the conclusion of archive recovery. */ -static bool -recoveryStopsBefore(XLogReaderState *record) +static void +CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, XLogRecPtr EndOfLog, + TimeLineID newTLI) { - bool stopsHere = false; - uint8 xact_info; - bool isCommit; - TimestampTz recordXtime = 0; - TransactionId recordXid; - /* - * Ignore recovery target settings when not in archive recovery (meaning - * we are in crash recovery). + * Execute the recovery_end_command, if any. */ - if (!ArchiveRecoveryRequested) - return false; + if (recoveryEndCommand && strcmp(recoveryEndCommand, "") != 0) + ExecuteRecoveryCommand(recoveryEndCommand, + "recovery_end_command", + true, + WAIT_EVENT_RECOVERY_END_COMMAND); - /* Check if we should stop as soon as reaching consistency */ - if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE && reachedConsistency) - { - ereport(LOG, - (errmsg("recovery stopping after reaching consistency"))); - - recoveryStopAfter = false; - recoveryStopXid = InvalidTransactionId; - recoveryStopLSN = InvalidXLogRecPtr; - recoveryStopTime = 0; - recoveryStopName[0] = '\0'; - return true; - } - - /* Check if target LSN has been reached */ - if (recoveryTarget == RECOVERY_TARGET_LSN && - !recoveryTargetInclusive && - record->ReadRecPtr >= recoveryTargetLSN) + /* + * We switched to a new timeline. Clean up segments on the old timeline. + * + * If there are any higher-numbered segments on the old timeline, remove + * them. They might contain valid WAL, but they might also be + * pre-allocated files containing garbage. In any case, they are not part + * of the new timeline's history so we don't need them. + */ + RemoveNonParentXlogFiles(EndOfLog, newTLI); + + /* + * If the switch happened in the middle of a segment, what to do with the + * last, partial segment on the old timeline? If we don't archive it, and + * the server that created the WAL never archives it either (e.g. because + * it was hit by a meteor), it will never make it to the archive. That's + * OK from our point of view, because the new segment that we created with + * the new TLI contains all the WAL from the old timeline up to the switch + * point. But if you later try to do PITR to the "missing" WAL on the old + * timeline, recovery won't find it in the archive. It's physically + * present in the new file with new TLI, but recovery won't look there + * when it's recovering to the older timeline. On the other hand, if we + * archive the partial segment, and the original server on that timeline + * is still running and archives the completed version of the same segment + * later, it will fail. (We used to do that in 9.4 and below, and it + * caused such problems). + * + * As a compromise, we rename the last segment with the .partial suffix, + * and archive it. Archive recovery will never try to read .partial + * segments, so they will normally go unused. But in the odd PITR case, + * the administrator can copy them manually to the pg_wal directory + * (removing the suffix). They can be useful in debugging, too. + * + * If a .done or .ready file already exists for the old timeline, however, + * we had already determined that the segment is complete, so we can let + * it be archived normally. (In particular, if it was restored from the + * archive to begin with, it's expected to have a .done file). + */ + if (XLogSegmentOffset(EndOfLog, wal_segment_size) != 0 && + XLogArchivingActive()) { - recoveryStopAfter = false; - recoveryStopXid = InvalidTransactionId; - recoveryStopLSN = record->ReadRecPtr; - recoveryStopTime = 0; - recoveryStopName[0] = '\0'; - ereport(LOG, - (errmsg("recovery stopping before WAL location (LSN) \"%X/%X\"", - LSN_FORMAT_ARGS(recoveryStopLSN)))); - return true; - } - - /* Otherwise we only consider stopping before COMMIT or ABORT records. */ - if (XLogRecGetRmid(record) != RM_XACT_ID) - return false; + char origfname[MAXFNAMELEN]; + XLogSegNo endLogSegNo; - xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK; + XLByteToPrevSeg(EndOfLog, endLogSegNo, wal_segment_size); + XLogFileName(origfname, EndOfLogTLI, endLogSegNo, wal_segment_size); - if (xact_info == XLOG_XACT_COMMIT) - { - isCommit = true; - recordXid = XLogRecGetXid(record); - } - else if (xact_info == XLOG_XACT_COMMIT_PREPARED) - { - xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record); - xl_xact_parsed_commit parsed; + if (!XLogArchiveIsReadyOrDone(origfname)) + { + char origpath[MAXPGPATH]; + char partialfname[MAXFNAMELEN]; + char partialpath[MAXPGPATH]; - isCommit = true; - ParseCommitRecord(XLogRecGetInfo(record), - xlrec, - &parsed); - recordXid = parsed.twophase_xid; - } - else if (xact_info == XLOG_XACT_ABORT) - { - isCommit = false; - recordXid = XLogRecGetXid(record); - } - else if (xact_info == XLOG_XACT_ABORT_PREPARED) - { - xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record); - xl_xact_parsed_abort parsed; + XLogFilePath(origpath, EndOfLogTLI, endLogSegNo, wal_segment_size); + snprintf(partialfname, MAXFNAMELEN, "%s.partial", origfname); + snprintf(partialpath, MAXPGPATH, "%s.partial", origpath); - isCommit = false; - ParseAbortRecord(XLogRecGetInfo(record), - xlrec, - &parsed); - recordXid = parsed.twophase_xid; - } - else - return false; + /* + * Make sure there's no .done or .ready file for the .partial + * file. + */ + XLogArchiveCleanup(partialfname); - if (recoveryTarget == RECOVERY_TARGET_XID && !recoveryTargetInclusive) - { - /* - * There can be only one transaction end record with this exact - * transactionid - * - * when testing for an xid, we MUST test for equality only, since - * transactions are numbered in the order they start, not the order - * they complete. A higher numbered xid will complete before you about - * 50% of the time... - */ - stopsHere = (recordXid == recoveryTargetXid); + durable_rename(origpath, partialpath, ERROR); + XLogArchiveNotify(partialfname); + } } +} +/* + * Check to see if required parameters are set high enough on this server + * for various aspects of recovery operation. + * + * Note that all the parameters which this function tests need to be + * listed in Administrator's Overview section in high-availability.sgml. + * If you change them, don't forget to update the list. + */ +static void +CheckRequiredParameterValues(void) +{ /* - * Note: we must fetch recordXtime regardless of recoveryTarget setting. - * We don't expect getRecordTimestamp ever to fail, since we already know - * this is a commit or abort record; but test its result anyway. + * For archive recovery, the WAL must be generated with at least 'replica' + * wal_level. */ - if (getRecordTimestamp(record, &recordXtime) && - recoveryTarget == RECOVERY_TARGET_TIME) + if (ArchiveRecoveryRequested && ControlFile->wal_level == WAL_LEVEL_MINIMAL) { - /* - * There can be many transactions that share the same commit time, so - * we stop after the last one, if we are inclusive, or stop at the - * first one if we are exclusive - */ - if (recoveryTargetInclusive) - stopsHere = (recordXtime > recoveryTargetTime); - else - stopsHere = (recordXtime >= recoveryTargetTime); + ereport(FATAL, + (errmsg("WAL was generated with wal_level=minimal, cannot continue recovering"), + errdetail("This happens if you temporarily set wal_level=minimal on the server."), + errhint("Use a backup taken after setting wal_level to higher than minimal."))); } - if (stopsHere) + /* + * For Hot Standby, the WAL must be generated with 'replica' mode, and we + * must have at least as many backend slots as the primary. + */ + if (ArchiveRecoveryRequested && EnableHotStandby) { - recoveryStopAfter = false; - recoveryStopXid = recordXid; - recoveryStopTime = recordXtime; - recoveryStopLSN = InvalidXLogRecPtr; - recoveryStopName[0] = '\0'; - - if (isCommit) - { - ereport(LOG, - (errmsg("recovery stopping before commit of transaction %u, time %s", - recoveryStopXid, - timestamptz_to_str(recoveryStopTime)))); - } - else - { - ereport(LOG, - (errmsg("recovery stopping before abort of transaction %u, time %s", - recoveryStopXid, - timestamptz_to_str(recoveryStopTime)))); - } + /* We ignore autovacuum_max_workers when we make this test. */ + RecoveryRequiresIntParameter("max_connections", + MaxConnections, + ControlFile->MaxConnections); + RecoveryRequiresIntParameter("max_worker_processes", + max_worker_processes, + ControlFile->max_worker_processes); + RecoveryRequiresIntParameter("max_wal_senders", + max_wal_senders, + ControlFile->max_wal_senders); + RecoveryRequiresIntParameter("max_prepared_transactions", + max_prepared_xacts, + ControlFile->max_prepared_xacts); + RecoveryRequiresIntParameter("max_locks_per_transaction", + max_locks_per_xact, + ControlFile->max_locks_per_xact); } - - return stopsHere; } /* - * Same as recoveryStopsBefore, but called after applying the record. - * - * We also track the timestamp of the latest applied COMMIT/ABORT - * record in XLogCtl->recoveryLastXTime. + * This must be called ONCE during postmaster or standalone-backend startup */ -static bool -recoveryStopsAfter(XLogReaderState *record) +void +StartupXLOG(void) { - uint8 info; - uint8 xact_info; - uint8 rmid; - TimestampTz recordXtime = 0; + XLogCtlInsert *Insert; + CheckPoint checkPoint; + bool wasShutdown; + bool didCrash; + bool haveTblspcMap; + bool haveBackupLabel; + XLogRecPtr EndOfLog; + TimeLineID EndOfLogTLI; + TimeLineID newTLI; + bool performedWalRecovery; + EndOfWalRecoveryInfo *endOfRecoveryInfo; + XLogRecPtr abortedRecPtr; + XLogRecPtr missingContrecPtr; + TransactionId oldestActiveXID; + bool promoted = false; /* - * Ignore recovery target settings when not in archive recovery (meaning - * we are in crash recovery). + * We should have an aux process resource owner to use, and we should not + * be in a transaction that's installed some other resowner. */ - if (!ArchiveRecoveryRequested) - return false; - - info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - rmid = XLogRecGetRmid(record); + Assert(AuxProcessResourceOwner != NULL); + Assert(CurrentResourceOwner == NULL || + CurrentResourceOwner == AuxProcessResourceOwner); + CurrentResourceOwner = AuxProcessResourceOwner; /* - * There can be many restore points that share the same name; we stop at - * the first one. + * Check that contents look valid. */ - if (recoveryTarget == RECOVERY_TARGET_NAME && - rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT) + if (!XRecOffIsValid(ControlFile->checkPoint)) + ereport(FATAL, + (errmsg("control file contains invalid checkpoint location"))); + + switch (ControlFile->state) { - xl_restore_point *recordRestorePointData; + case DB_SHUTDOWNED: - recordRestorePointData = (xl_restore_point *) XLogRecGetData(record); + /* + * This is the expected case, so don't be chatty in standalone + * mode + */ + ereport(IsPostmasterEnvironment ? LOG : NOTICE, + (errmsg("database system was shut down at %s", + str_time(ControlFile->time)))); + break; - if (strcmp(recordRestorePointData->rp_name, recoveryTargetName) == 0) - { - recoveryStopAfter = true; - recoveryStopXid = InvalidTransactionId; - recoveryStopLSN = InvalidXLogRecPtr; - (void) getRecordTimestamp(record, &recoveryStopTime); - strlcpy(recoveryStopName, recordRestorePointData->rp_name, MAXFNAMELEN); + case DB_SHUTDOWNED_IN_RECOVERY: + ereport(LOG, + (errmsg("database system was shut down in recovery at %s", + str_time(ControlFile->time)))); + break; + case DB_SHUTDOWNING: ereport(LOG, - (errmsg("recovery stopping at restore point \"%s\", time %s", - recoveryStopName, - timestamptz_to_str(recoveryStopTime)))); - return true; - } - } + (errmsg("database system shutdown was interrupted; last known up at %s", + str_time(ControlFile->time)))); + break; - /* Check if the target LSN has been reached */ - if (recoveryTarget == RECOVERY_TARGET_LSN && - recoveryTargetInclusive && - record->ReadRecPtr >= recoveryTargetLSN) - { - recoveryStopAfter = true; - recoveryStopXid = InvalidTransactionId; - recoveryStopLSN = record->ReadRecPtr; - recoveryStopTime = 0; - recoveryStopName[0] = '\0'; - ereport(LOG, - (errmsg("recovery stopping after WAL location (LSN) \"%X/%X\"", - LSN_FORMAT_ARGS(recoveryStopLSN)))); - return true; - } - - if (rmid != RM_XACT_ID) - return false; - - xact_info = info & XLOG_XACT_OPMASK; - - if (xact_info == XLOG_XACT_COMMIT || - xact_info == XLOG_XACT_COMMIT_PREPARED || - xact_info == XLOG_XACT_ABORT || - xact_info == XLOG_XACT_ABORT_PREPARED) - { - TransactionId recordXid; - - /* Update the last applied transaction timestamp */ - if (getRecordTimestamp(record, &recordXtime)) - SetLatestXTime(recordXtime); - - /* Extract the XID of the committed/aborted transaction */ - if (xact_info == XLOG_XACT_COMMIT_PREPARED) - { - xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record); - xl_xact_parsed_commit parsed; - - ParseCommitRecord(XLogRecGetInfo(record), - xlrec, - &parsed); - recordXid = parsed.twophase_xid; - } - else if (xact_info == XLOG_XACT_ABORT_PREPARED) - { - xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record); - xl_xact_parsed_abort parsed; - - ParseAbortRecord(XLogRecGetInfo(record), - xlrec, - &parsed); - recordXid = parsed.twophase_xid; - } - else - recordXid = XLogRecGetXid(record); + case DB_IN_CRASH_RECOVERY: + ereport(LOG, + (errmsg("database system was interrupted while in recovery at %s", + str_time(ControlFile->time)), + errhint("This probably means that some data is corrupted and" + " you will have to use the last backup for recovery."))); + break; - /* - * There can be only one transaction end record with this exact - * transactionid - * - * when testing for an xid, we MUST test for equality only, since - * transactions are numbered in the order they start, not the order - * they complete. A higher numbered xid will complete before you about - * 50% of the time... - */ - if (recoveryTarget == RECOVERY_TARGET_XID && recoveryTargetInclusive && - recordXid == recoveryTargetXid) - { - recoveryStopAfter = true; - recoveryStopXid = recordXid; - recoveryStopTime = recordXtime; - recoveryStopLSN = InvalidXLogRecPtr; - recoveryStopName[0] = '\0'; - - if (xact_info == XLOG_XACT_COMMIT || - xact_info == XLOG_XACT_COMMIT_PREPARED) - { - ereport(LOG, - (errmsg("recovery stopping after commit of transaction %u, time %s", - recoveryStopXid, - timestamptz_to_str(recoveryStopTime)))); - } - else if (xact_info == XLOG_XACT_ABORT || - xact_info == XLOG_XACT_ABORT_PREPARED) - { - ereport(LOG, - (errmsg("recovery stopping after abort of transaction %u, time %s", - recoveryStopXid, - timestamptz_to_str(recoveryStopTime)))); - } - return true; - } - } + case DB_IN_ARCHIVE_RECOVERY: + ereport(LOG, + (errmsg("database system was interrupted while in recovery at log time %s", + str_time(ControlFile->checkPointCopy.time)), + errhint("If this has occurred more than once some data might be corrupted" + " and you might need to choose an earlier recovery target."))); + break; - /* Check if we should stop as soon as reaching consistency */ - if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE && reachedConsistency) - { - ereport(LOG, - (errmsg("recovery stopping after reaching consistency"))); + case DB_IN_PRODUCTION: + ereport(LOG, + (errmsg("database system was interrupted; last known up at %s", + str_time(ControlFile->time)))); + break; - recoveryStopAfter = true; - recoveryStopXid = InvalidTransactionId; - recoveryStopTime = 0; - recoveryStopLSN = InvalidXLogRecPtr; - recoveryStopName[0] = '\0'; - return true; + default: + ereport(FATAL, + (errmsg("control file contains invalid database cluster state"))); } - return false; -} - -/* - * Wait until shared recoveryPauseState is set to RECOVERY_NOT_PAUSED. - * - * endOfRecovery is true if the recovery target is reached and - * the paused state starts at the end of recovery because of - * recovery_target_action=pause, and false otherwise. - */ -static void -recoveryPausesHere(bool endOfRecovery) -{ - /* Don't pause unless users can connect! */ - if (!LocalHotStandbyActive) - return; + /* This is just to allow attaching to startup process with a debugger */ +#ifdef XLOG_REPLAY_DELAY + if (ControlFile->state != DB_SHUTDOWNED) + pg_usleep(60000000L); +#endif - /* Don't pause after standby promotion has been triggered */ - if (LocalPromoteIsTriggered) - return; + /* + * Verify that pg_wal and pg_wal/archive_status exist. In cases where + * someone has performed a copy for PITR, these directories may have been + * excluded and need to be re-created. + */ + ValidateXLOGDirectoryStructure(); - if (endOfRecovery) - ereport(LOG, - (errmsg("pausing at the end of recovery"), - errhint("Execute pg_wal_replay_resume() to promote."))); - else - ereport(LOG, - (errmsg("recovery has paused"), - errhint("Execute pg_wal_replay_resume() to continue."))); + /* Set up timeout handler needed to report startup progress. */ + if (!IsBootstrapProcessingMode()) + RegisterTimeout(STARTUP_PROGRESS_TIMEOUT, + startup_progress_timeout_handler); - /* loop until recoveryPauseState is set to RECOVERY_NOT_PAUSED */ - while (GetRecoveryPauseState() != RECOVERY_NOT_PAUSED) + /*---------- + * If we previously crashed, perform a couple of actions: + * + * - The pg_wal directory may still include some temporary WAL segments + * used when creating a new segment, so perform some clean up to not + * bloat this path. This is done first as there is no point to sync + * this temporary data. + * + * - There might be data which we had written, intending to fsync it, but + * which we had not actually fsync'd yet. Therefore, a power failure in + * the near future might cause earlier unflushed writes to be lost, even + * though more recent data written to disk from here on would be + * persisted. To avoid that, fsync the entire data directory. + */ + if (ControlFile->state != DB_SHUTDOWNED && + ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY) { - HandleStartupProcInterrupts(); - if (CheckForStandbyTrigger()) - return; - - /* - * If recovery pause is requested then set it paused. While we are in - * the loop, user might resume and pause again so set this every time. - */ - ConfirmRecoveryPaused(); - - /* - * We wait on a condition variable that will wake us as soon as the - * pause ends, but we use a timeout so we can check the above exit - * condition periodically too. - */ - ConditionVariableTimedSleep(&XLogCtl->recoveryNotPausedCV, 1000, - WAIT_EVENT_RECOVERY_PAUSE); + RemoveTempXlogFiles(); + SyncDataDirectory(); + didCrash = true; } - ConditionVariableCancelSleep(); -} - -/* - * Get the current state of the recovery pause request. - */ -RecoveryPauseState -GetRecoveryPauseState(void) -{ - RecoveryPauseState state; - - SpinLockAcquire(&XLogCtl->info_lck); - state = XLogCtl->recoveryPauseState; - SpinLockRelease(&XLogCtl->info_lck); - - return state; -} - -/* - * Set the recovery pause state. - * - * If recovery pause is requested then sets the recovery pause state to - * 'pause requested' if it is not already 'paused'. Otherwise, sets it - * to 'not paused' to resume the recovery. The recovery pause will be - * confirmed by the ConfirmRecoveryPaused. - */ -void -SetRecoveryPause(bool recoveryPause) -{ - SpinLockAcquire(&XLogCtl->info_lck); - - if (!recoveryPause) - XLogCtl->recoveryPauseState = RECOVERY_NOT_PAUSED; - else if (XLogCtl->recoveryPauseState == RECOVERY_NOT_PAUSED) - XLogCtl->recoveryPauseState = RECOVERY_PAUSE_REQUESTED; + else + didCrash = false; - SpinLockRelease(&XLogCtl->info_lck); + /* + * Prepare for WAL recovery if needed. + * + * InitWalRecovery analyzes the control file and the backup label file, if + * any. It updates the in-memory ControlFile buffer according to the + * starting checkpoint, and sets InRecovery and ArchiveRecoveryRequested. + * It also applies the tablespace map file, if any. + */ + InitWalRecovery(ControlFile, &wasShutdown, + &haveBackupLabel, &haveTblspcMap); + checkPoint = ControlFile->checkPointCopy; - if (!recoveryPause) - ConditionVariableBroadcast(&XLogCtl->recoveryNotPausedCV); -} + /* initialize shared memory variables from the checkpoint record */ + ShmemVariableCache->nextXid = checkPoint.nextXid; + ShmemVariableCache->nextOid = checkPoint.nextOid; + ShmemVariableCache->oidCount = 0; + MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); + AdvanceOldestClogXid(checkPoint.oldestXid); + SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); + SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB, true); + SetCommitTsLimit(checkPoint.oldestCommitTsXid, + checkPoint.newestCommitTsXid); + XLogCtl->ckptFullXid = checkPoint.nextXid; -/* - * Confirm the recovery pause by setting the recovery pause state to - * RECOVERY_PAUSED. - */ -static void -ConfirmRecoveryPaused(void) -{ - /* If recovery pause is requested then set it paused */ - SpinLockAcquire(&XLogCtl->info_lck); - if (XLogCtl->recoveryPauseState == RECOVERY_PAUSE_REQUESTED) - XLogCtl->recoveryPauseState = RECOVERY_PAUSED; - SpinLockRelease(&XLogCtl->info_lck); -} + /* + * Clear out any old relcache cache files. This is *necessary* if we do + * any WAL replay, since that would probably result in the cache files + * being out of sync with database reality. In theory we could leave them + * in place if the database had been cleanly shut down, but it seems + * safest to just remove them always and let them be rebuilt during the + * first backend startup. These files needs to be removed from all + * directories including pg_tblspc, however the symlinks are created only + * after reading tablespace_map file in case of archive recovery from + * backup, so needs to clear old relcache files here after creating + * symlinks. + */ + RelationCacheInitFileRemove(); -/* - * When recovery_min_apply_delay is set, we wait long enough to make sure - * certain record types are applied at least that interval behind the primary. - * - * Returns true if we waited. - * - * Note that the delay is calculated between the WAL record log time and - * the current time on standby. We would prefer to keep track of when this - * standby received each WAL record, which would allow a more consistent - * approach and one not affected by time synchronisation issues, but that - * is significantly more effort and complexity for little actual gain in - * usability. - */ -static bool -recoveryApplyDelay(XLogReaderState *record) -{ - uint8 xact_info; - TimestampTz xtime; - TimestampTz delayUntil; - long msecs; + /* + * Initialize replication slots, before there's a chance to remove + * required resources. + */ + StartupReplicationSlots(); - /* nothing to do if no delay configured */ - if (recovery_min_apply_delay <= 0) - return false; + /* + * Startup logical state, needs to be setup now so we have proper data + * during crash recovery. + */ + StartupReorderBuffer(); - /* no delay is applied on a database not yet consistent */ - if (!reachedConsistency) - return false; + /* + * Startup CLOG. This must be done after ShmemVariableCache->nextXid has + * been initialized and before we accept connections or begin WAL replay. + */ + StartupCLOG(); - /* nothing to do if crash recovery is requested */ - if (!ArchiveRecoveryRequested) - return false; + /* + * Startup MultiXact. We need to do this early to be able to replay + * truncations. + */ + StartupMultiXact(); /* - * Is it a COMMIT record? - * - * We deliberately choose not to delay aborts since they have no effect on - * MVCC. We already allow replay of records that don't have a timestamp, - * so there is already opportunity for issues caused by early conflicts on - * standbys. + * Ditto for commit timestamps. Activate the facility if the setting is + * enabled in the control file, as there should be no tracking of commit + * timestamps done when the setting was disabled. This facility can be + * started or stopped when replaying a XLOG_PARAMETER_CHANGE record. */ - if (XLogRecGetRmid(record) != RM_XACT_ID) - return false; + if (ControlFile->track_commit_timestamp) + StartupCommitTs(); - xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK; + /* + * Recover knowledge about replay progress of known replication partners. + */ + StartupReplicationOrigin(); - if (xact_info != XLOG_XACT_COMMIT && - xact_info != XLOG_XACT_COMMIT_PREPARED) - return false; + /* + * Initialize unlogged LSN. On a clean shutdown, it's restored from the + * control file. On recovery, all unlogged relations are blown away, so + * the unlogged LSN counter can be reset too. + */ + if (ControlFile->state == DB_SHUTDOWNED) + XLogCtl->unloggedLSN = ControlFile->unloggedLSN; + else + XLogCtl->unloggedLSN = FirstNormalUnloggedLSN; - if (!getRecordTimestamp(record, &xtime)) - return false; + /* + * Copy any missing timeline history files between 'now' and the recovery + * target timeline from archive to pg_wal. While we don't need those files + * ourselves - the history file of the recovery target timeline covers all + * the previous timelines in the history too - a cascading standby server + * might be interested in them. Or, if you archive the WAL from this + * server to a different archive than the primary, it'd be good for all + * the history files to get archived there after failover, so that you can + * use one of the old timelines as a PITR target. Timeline history files + * are small, so it's better to copy them unnecessarily than not copy them + * and regret later. + */ + restoreTimeLineHistoryFiles(checkPoint.ThisTimeLineID, recoveryTargetTLI); - delayUntil = TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay); + /* + * Before running in recovery, scan pg_twophase and fill in its status to + * be able to work on entries generated by redo. Doing a scan before + * taking any recovery action has the merit to discard any 2PC files that + * are newer than the first record to replay, saving from any conflicts at + * replay. This avoids as well any subsequent scans when doing recovery + * of the on-disk two-phase data. + */ + restoreTwoPhaseData(); /* - * Exit without arming the latch if it's already past time to apply this - * record + * 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. */ - msecs = TimestampDifferenceMilliseconds(GetCurrentTimestamp(), delayUntil); - if (msecs <= 0) - return false; + if (didCrash) + pgstat_discard_stats(); + else + pgstat_restore_stats(); - while (true) - { - ResetLatch(&XLogCtl->recoveryWakeupLatch); + lastFullPageWrites = checkPoint.fullPageWrites; - /* - * This might change recovery_min_apply_delay or the trigger file's - * location. - */ - HandleStartupProcInterrupts(); + RedoRecPtr = XLogCtl->RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; + doPageWrites = lastFullPageWrites; - if (CheckForStandbyTrigger()) - break; + /* REDO */ + if (InRecovery) + { + /* Initialize state for RecoveryInProgress() */ + SpinLockAcquire(&XLogCtl->info_lck); + if (InArchiveRecovery) + XLogCtl->SharedRecoveryState = RECOVERY_STATE_ARCHIVE; + else + XLogCtl->SharedRecoveryState = RECOVERY_STATE_CRASH; + SpinLockRelease(&XLogCtl->info_lck); /* - * Recalculate delayUntil as recovery_min_apply_delay could have - * changed while waiting in this loop. + * 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. + * + * No need to hold ControlFileLock yet, we aren't up far enough. */ - delayUntil = TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay); + UpdateControlFile(); /* - * Wait for difference between GetCurrentTimestamp() and delayUntil. - */ - msecs = TimestampDifferenceMilliseconds(GetCurrentTimestamp(), - delayUntil); - - if (msecs <= 0) - break; - - elog(DEBUG2, "recovery apply delay %ld milliseconds", msecs); - - (void) WaitLatch(&XLogCtl->recoveryWakeupLatch, - WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, - msecs, - WAIT_EVENT_RECOVERY_APPLY_DELAY); - } - return true; -} - -/* - * Save timestamp of latest processed commit/abort record. - * - * We keep this in XLogCtl, not a simple static variable, so that it can be - * seen by processes other than the startup process. Note in particular - * that CreateRestartPoint is executed in the checkpointer. - */ -static void -SetLatestXTime(TimestampTz xtime) -{ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->recoveryLastXTime = xtime; - SpinLockRelease(&XLogCtl->info_lck); -} - -/* - * Fetch timestamp of latest processed commit/abort record. - */ -TimestampTz -GetLatestXTime(void) -{ - TimestampTz xtime; - - SpinLockAcquire(&XLogCtl->info_lck); - xtime = XLogCtl->recoveryLastXTime; - SpinLockRelease(&XLogCtl->info_lck); + * If there was a backup label file, it's done its job and the info + * has now been propagated into pg_control. We must get rid of the + * label file so that if we crash during recovery, we'll pick up at + * the latest recovery restartpoint instead of going all the way back + * to the backup start point. It seems prudent though to just rename + * the file out of the way rather than delete it completely. + */ + if (haveBackupLabel) + { + unlink(BACKUP_LABEL_OLD); + durable_rename(BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, FATAL); + } - return xtime; -} + /* + * If there was a tablespace_map file, it's done its job and the + * symlinks have been created. We must get rid of the map file so + * that if we crash during recovery, we don't create symlinks again. + * It seems prudent though to just rename the file out of the way + * rather than delete it completely. + */ + if (haveTblspcMap) + { + unlink(TABLESPACE_MAP_OLD); + durable_rename(TABLESPACE_MAP, TABLESPACE_MAP_OLD, FATAL); + } -/* - * Save timestamp of the next chunk of WAL records to apply. - * - * We keep this in XLogCtl, not a simple static variable, so that it can be - * seen by all backends. - */ -static void -SetCurrentChunkStartTime(TimestampTz xtime) -{ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->currentChunkStartTime = xtime; - SpinLockRelease(&XLogCtl->info_lck); -} + /* + * Initialize our local copy of minRecoveryPoint. When doing crash + * recovery we want to replay up to the end of WAL. Particularly, in + * the case of a promoted standby minRecoveryPoint value in the + * control file is only updated after the first checkpoint. However, + * if the instance crashes before the first post-recovery checkpoint + * is completed then recovery will use a stale location causing the + * startup process to think that there are still invalid page + * references when checking for data consistency. + */ + if (InArchiveRecovery) + { + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + } + else + { + LocalMinRecoveryPoint = InvalidXLogRecPtr; + LocalMinRecoveryPointTLI = 0; + } -/* - * Fetch timestamp of latest processed commit/abort record. - * Startup process maintains an accurate local copy in XLogReceiptTime - */ -TimestampTz -GetCurrentChunkReplayStartTime(void) -{ - TimestampTz xtime; + /* Check that the GUCs used to generate the WAL allow recovery */ + CheckRequiredParameterValues(); - SpinLockAcquire(&XLogCtl->info_lck); - xtime = XLogCtl->currentChunkStartTime; - SpinLockRelease(&XLogCtl->info_lck); + /* + * We're in recovery, so unlogged relations may be trashed and must be + * reset. This should be done BEFORE allowing Hot Standby + * connections, so that read-only backends don't try to read whatever + * garbage is left over from before. + */ + ResetUnloggedRelations(UNLOGGED_RELATION_CLEANUP); - return xtime; -} + /* + * Likewise, delete any saved transaction snapshot files that got left + * behind by crashed backends. + */ + DeleteAllExportedSnapshotFiles(); -/* - * Returns time of receipt of current chunk of XLOG data, as well as - * whether it was received from streaming replication or from archives. - */ -void -GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream) -{ - /* - * This must be executed in the startup process, since we don't export the - * relevant state to shared memory. - */ - Assert(InRecovery); + /* + * Initialize for Hot Standby, if enabled. We won't let backends in + * yet, not until we've reached the min recovery point specified in + * control file and we've established a recovery snapshot from a + * running-xacts WAL record. + */ + if (ArchiveRecoveryRequested && EnableHotStandby) + { + TransactionId *xids; + int nxids; - *rtime = XLogReceiptTime; - *fromStream = (XLogReceiptSource == XLOG_FROM_STREAM); -} + ereport(DEBUG1, + (errmsg_internal("initializing for hot standby"))); -/* - * Note that text field supplied is a parameter name and does not require - * translation - */ -static void -RecoveryRequiresIntParameter(const char *param_name, int currValue, int minValue) -{ - if (currValue < minValue) - { - if (LocalHotStandbyActive) - { - bool warned_for_promote = false; + InitRecoveryTransactionEnvironment(); - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("hot standby is not possible because of insufficient parameter settings"), - errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", - param_name, - currValue, - minValue))); + if (wasShutdown) + oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); + else + oldestActiveXID = checkPoint.oldestActiveXid; + Assert(TransactionIdIsValid(oldestActiveXID)); - SetRecoveryPause(true); + /* Tell procarray about the range of xids it has to deal with */ + ProcArrayInitRecovery(XidFromFullTransactionId(ShmemVariableCache->nextXid)); - ereport(LOG, - (errmsg("recovery has paused"), - errdetail("If recovery is unpaused, the server will shut down."), - errhint("You can then restart the server after making the necessary configuration changes."))); + /* + * Startup subtrans only. CLOG, MultiXact and commit timestamp + * have already been started up and other SLRUs are not maintained + * during recovery and need not be started yet. + */ + StartupSUBTRANS(oldestActiveXID); - while (GetRecoveryPauseState() != RECOVERY_NOT_PAUSED) + /* + * If we're beginning at a shutdown checkpoint, we know that + * nothing was running on the primary at this point. So fake-up an + * empty running-xacts record and use that here and now. Recover + * additional standby state for prepared transactions. + */ + if (wasShutdown) { - HandleStartupProcInterrupts(); - - if (CheckForStandbyTrigger()) - { - if (!warned_for_promote) - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("promotion is not possible because of insufficient parameter settings"), - - /* - * Repeat the detail from above so it's easy to find - * in the log. - */ - errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", - param_name, - currValue, - minValue), - errhint("Restart the server after making the necessary configuration changes."))); - warned_for_promote = true; - } + RunningTransactionsData running; + TransactionId latestCompletedXid; /* - * If recovery pause is requested then set it paused. While - * we are in the loop, user might resume and pause again so - * set this every time. + * Construct a RunningTransactions snapshot representing a + * shut down server, with only prepared transactions still + * alive. We're never overflowed at this point because all + * subxids are listed with their parent prepared transactions. */ - ConfirmRecoveryPaused(); + running.xcnt = nxids; + running.subxcnt = 0; + running.subxid_overflow = false; + running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); + running.oldestRunningXid = oldestActiveXID; + latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); + TransactionIdRetreat(latestCompletedXid); + Assert(TransactionIdIsNormal(latestCompletedXid)); + running.latestCompletedXid = latestCompletedXid; + running.xids = xids; - /* - * We wait on a condition variable that will wake us as soon - * as the pause ends, but we use a timeout so we can check the - * above conditions periodically too. - */ - ConditionVariableTimedSleep(&XLogCtl->recoveryNotPausedCV, 1000, - WAIT_EVENT_RECOVERY_PAUSE); + ProcArrayApplyRecoveryInfo(&running); + + StandbyRecoverPreparedTransactions(); } - ConditionVariableCancelSleep(); } - ereport(FATAL, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("recovery aborted because of insufficient parameter settings"), - /* Repeat the detail from above so it's easy to find in the log. */ - errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", - param_name, - currValue, - minValue), - errhint("You can restart the server after making the necessary configuration changes."))); + /* + * We're all set for replaying the WAL now. Do it. + */ + PerformWalRecovery(); + performedWalRecovery = true; } -} + else + performedWalRecovery = false; -/* - * Check to see if required parameters are set high enough on this server - * for various aspects of recovery operation. - * - * Note that all the parameters which this function tests need to be - * listed in Administrator's Overview section in high-availability.sgml. - * If you change them, don't forget to update the list. - */ -static void -CheckRequiredParameterValues(void) -{ /* - * For archive recovery, the WAL must be generated with at least 'replica' - * wal_level. + * Finish WAL recovery. */ - if (ArchiveRecoveryRequested && ControlFile->wal_level == WAL_LEVEL_MINIMAL) - { - ereport(FATAL, - (errmsg("WAL was generated with wal_level=minimal, cannot continue recovering"), - errdetail("This happens if you temporarily set wal_level=minimal on the server."), - errhint("Use a backup taken after setting wal_level to higher than minimal."))); - } + endOfRecoveryInfo = FinishWalRecovery(); + EndOfLog = endOfRecoveryInfo->endOfLog; + EndOfLogTLI = endOfRecoveryInfo->endOfLogTLI; + abortedRecPtr = endOfRecoveryInfo->abortedRecPtr; + missingContrecPtr = endOfRecoveryInfo->missingContrecPtr; /* - * For Hot Standby, the WAL must be generated with 'replica' mode, and we - * must have at least as many backend slots as the primary. + * Reset ps status display, so as no information related to recovery + * shows up. */ - if (ArchiveRecoveryRequested && EnableHotStandby) - { - /* We ignore autovacuum_max_workers when we make this test. */ - RecoveryRequiresIntParameter("max_connections", - MaxConnections, - ControlFile->MaxConnections); - RecoveryRequiresIntParameter("max_worker_processes", - max_worker_processes, - ControlFile->max_worker_processes); - RecoveryRequiresIntParameter("max_wal_senders", - max_wal_senders, - ControlFile->max_wal_senders); - RecoveryRequiresIntParameter("max_prepared_transactions", - max_prepared_xacts, - ControlFile->max_prepared_xacts); - RecoveryRequiresIntParameter("max_locks_per_transaction", - max_locks_per_xact, - ControlFile->max_locks_per_xact); - } -} - -/* - * This must be called ONCE during postmaster or standalone-backend startup - */ -void -StartupXLOG(void) -{ - XLogCtlInsert *Insert; - CheckPoint checkPoint; - bool wasShutdown; - bool reachedRecoveryTarget = false; - bool haveBackupLabel = false; - bool haveTblspcMap = false; - XLogRecPtr RecPtr, - checkPointLoc, - EndOfLog; - TimeLineID EndOfLogTLI; - TimeLineID PrevTimeLineID; - XLogRecord *record; - TransactionId oldestActiveXID; - bool backupEndRequired = false; - bool backupFromStandby = false; - DBState dbstate_at_startup; - XLogReaderState *xlogreader; - XLogPageReadPrivate private; - bool promoted = false; - struct stat st; + set_ps_display(""); /* - * We should have an aux process resource owner to use, and we should not - * be in a transaction that's installed some other resowner. + * 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 purposefully 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. */ - Assert(AuxProcessResourceOwner != NULL); - Assert(CurrentResourceOwner == NULL || - CurrentResourceOwner == AuxProcessResourceOwner); - CurrentResourceOwner = AuxProcessResourceOwner; + if (InRecovery && + (EndOfLog < LocalMinRecoveryPoint || + !XLogRecPtrIsInvalid(ControlFile->backupStartPoint))) + { + /* + * Ran off end of WAL before reaching end-of-backup WAL record, or + * 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 (!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 + ereport(FATAL, + (errmsg("WAL ends before consistent recovery point"))); + } + } /* - * Check that contents look valid. - */ - if (!XRecOffIsValid(ControlFile->checkPoint)) - ereport(FATAL, - (errmsg("control file contains invalid checkpoint location"))); - - switch (ControlFile->state) - { - case DB_SHUTDOWNED: - - /* - * This is the expected case, so don't be chatty in standalone - * mode - */ - ereport(IsPostmasterEnvironment ? LOG : NOTICE, - (errmsg("database system was shut down at %s", - str_time(ControlFile->time)))); - break; - - case DB_SHUTDOWNED_IN_RECOVERY: - ereport(LOG, - (errmsg("database system was shut down in recovery at %s", - str_time(ControlFile->time)))); - break; - - case DB_SHUTDOWNING: - ereport(LOG, - (errmsg("database system shutdown was interrupted; last known up at %s", - str_time(ControlFile->time)))); - break; - - case DB_IN_CRASH_RECOVERY: - ereport(LOG, - (errmsg("database system was interrupted while in recovery at %s", - str_time(ControlFile->time)), - errhint("This probably means that some data is corrupted and" - " you will have to use the last backup for recovery."))); - break; - - case DB_IN_ARCHIVE_RECOVERY: - ereport(LOG, - (errmsg("database system was interrupted while in recovery at log time %s", - str_time(ControlFile->checkPointCopy.time)), - errhint("If this has occurred more than once some data might be corrupted" - " and you might need to choose an earlier recovery target."))); - break; - - case DB_IN_PRODUCTION: - ereport(LOG, - (errmsg("database system was interrupted; last known up at %s", - str_time(ControlFile->time)))); - break; - - default: - ereport(FATAL, - (errmsg("control file contains invalid database cluster state"))); - } - - /* This is just to allow attaching to startup process with a debugger */ -#ifdef XLOG_REPLAY_DELAY - if (ControlFile->state != DB_SHUTDOWNED) - pg_usleep(60000000L); -#endif - - /* - * Verify that pg_wal and pg_wal/archive_status exist. In cases where - * someone has performed a copy for PITR, these directories may have been - * excluded and need to be re-created. - */ - ValidateXLOGDirectoryStructure(); - - /*---------- - * If we previously crashed, perform a couple of actions: - * - * - The pg_wal directory may still include some temporary WAL segments - * used when creating a new segment, so perform some clean up to not - * bloat this path. This is done first as there is no point to sync - * this temporary data. - * - * - There might be data which we had written, intending to fsync it, but - * which we had not actually fsync'd yet. Therefore, a power failure in - * the near future might cause earlier unflushed writes to be lost, even - * though more recent data written to disk from here on would be - * persisted. To avoid that, fsync the entire data directory. + * Reset unlogged relations to the contents of their INIT fork. This is + * done AFTER recovery is complete so as to include any unlogged relations + * created during recovery, but BEFORE recovery is marked as having + * completed successfully. Otherwise we'd not retry if any of the post + * end-of-recovery steps fail. */ - if (ControlFile->state != DB_SHUTDOWNED && - ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY) - { - RemoveTempXlogFiles(); - SyncDataDirectory(); - } + if (InRecovery) + ResetUnloggedRelations(UNLOGGED_RELATION_INIT); /* - * Initialize on the assumption we want to recover to the latest timeline - * that's active according to pg_control. + * Pre-scan prepared transactions to find out the range of XIDs present. + * This information is not quite needed yet, but it is positioned here so + * as potential problems are detected before any on-disk change is done. */ - if (ControlFile->minRecoveryPointTLI > - ControlFile->checkPointCopy.ThisTimeLineID) - recoveryTargetTLI = ControlFile->minRecoveryPointTLI; - else - recoveryTargetTLI = ControlFile->checkPointCopy.ThisTimeLineID; + oldestActiveXID = PrescanPreparedTransactions(NULL, NULL); /* - * Check for signal files, and if so set up state for offline recovery + * Allow ordinary WAL segment creation before possibly switching to a new + * timeline, which creates a new segment, and after the last ReadRecord(). */ - readRecoverySignalFile(); - validateRecoveryParameters(); - - if (ArchiveRecoveryRequested) - { - if (StandbyModeRequested) - ereport(LOG, - (errmsg("entering standby mode"))); - else if (recoveryTarget == RECOVERY_TARGET_XID) - ereport(LOG, - (errmsg("starting point-in-time recovery to XID %u", - recoveryTargetXid))); - else if (recoveryTarget == RECOVERY_TARGET_TIME) - ereport(LOG, - (errmsg("starting point-in-time recovery to %s", - timestamptz_to_str(recoveryTargetTime)))); - else if (recoveryTarget == RECOVERY_TARGET_NAME) - ereport(LOG, - (errmsg("starting point-in-time recovery to \"%s\"", - recoveryTargetName))); - else if (recoveryTarget == RECOVERY_TARGET_LSN) - ereport(LOG, - (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"", - LSN_FORMAT_ARGS(recoveryTargetLSN)))); - else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) - ereport(LOG, - (errmsg("starting point-in-time recovery to earliest consistent point"))); - else - ereport(LOG, - (errmsg("starting archive recovery"))); - } + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + XLogCtl->InstallXLogFileSegmentActive = true; + LWLockRelease(ControlFileLock); /* - * Take ownership of the wakeup latch if we're going to sleep during - * recovery. + * Consider whether we need to assign a new timeline ID. + * + * If we did archive recovery, we always assign a new ID. This handles a + * couple of issues. If we stopped short of the end of WAL during + * recovery, then we are clearly generating a new timeline and must assign + * it a unique new ID. Even if we ran to the end, modifying the current + * last segment is problematic because it may result in trying to + * overwrite an already-archived copy of that segment, and we encourage + * DBAs to make their archive_commands reject that. We can dodge the + * problem by making the new active segment have a new timeline ID. + * + * In a normal crash recovery, we can just extend the timeline we were in. */ + newTLI = endOfRecoveryInfo->lastRecTLI; if (ArchiveRecoveryRequested) - OwnLatch(&XLogCtl->recoveryWakeupLatch); - - /* Set up XLOG reader facility */ - MemSet(&private, 0, sizeof(XLogPageReadPrivate)); - xlogreader = - XLogReaderAllocate(wal_segment_size, NULL, - XL_ROUTINE(.page_read = &XLogPageRead, - .segment_open = NULL, - .segment_close = wal_segment_close), - &private); - if (!xlogreader) - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed while allocating a WAL reading processor."))); - xlogreader->system_identifier = ControlFile->system_identifier; - - /* - * Allocate two page buffers dedicated to WAL consistency checks. We do - * it this way, rather than just making static arrays, for two reasons: - * (1) no need to waste the storage in most instantiations of the backend; - * (2) a static char array isn't guaranteed to have any particular - * alignment, whereas palloc() will provide MAXALIGN'd storage. - */ - replay_image_masked = (char *) palloc(BLCKSZ); - primary_image_masked = (char *) palloc(BLCKSZ); - - if (read_backup_label(&checkPointLoc, &backupEndRequired, - &backupFromStandby)) { - List *tablespaces = NIL; + newTLI = findNewestTimeLine(recoveryTargetTLI) + 1; + ereport(LOG, + (errmsg("selected new timeline ID: %u", newTLI))); /* - * Archive recovery was requested, and thanks to the backup label - * file, we know how far we need to replay to reach consistency. Enter - * archive recovery directly. + * Make a writable copy of the last WAL segment. (Note that we also + * have a copy of the last block of the old WAL in + * endOfRecovery->lastPage; we will use that below.) */ - InArchiveRecovery = true; - if (StandbyModeRequested) - StandbyMode = true; + XLogInitNewTimeline(EndOfLogTLI, EndOfLog, newTLI); /* - * When a backup_label file is present, we want to roll forward from - * the checkpoint it identifies, rather than using pg_control. + * Remove the signal files out of the way, so that we don't + * accidentally re-enter archive recovery mode in a subsequent crash. */ - record = ReadCheckpointRecord(xlogreader, checkPointLoc, 0, true); - if (record != NULL) - { - memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); - wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN); - ereport(DEBUG1, - (errmsg_internal("checkpoint record is at %X/%X", - LSN_FORMAT_ARGS(checkPointLoc)))); - InRecovery = true; /* force recovery even if SHUTDOWNED */ + if (endOfRecoveryInfo->standby_signal_file_found) + durable_unlink(STANDBY_SIGNAL_FILE, FATAL); - /* - * Make sure that REDO location exists. This may not be the case - * if there was a crash during an online backup, which left a - * backup_label around that references a WAL segment that's - * already been archived. - */ - if (checkPoint.redo < checkPointLoc) - { - XLogBeginRead(xlogreader, checkPoint.redo); - if (!ReadRecord(xlogreader, LOG, false)) - ereport(FATAL, - (errmsg("could not find redo location referenced by checkpoint record"), - errhint("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.", - DataDir, DataDir, DataDir))); - } - } - else - { - ereport(FATAL, - (errmsg("could not locate required checkpoint record"), - errhint("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.", - DataDir, DataDir, DataDir))); - wasShutdown = false; /* keep compiler quiet */ - } + if (endOfRecoveryInfo->recovery_signal_file_found) + durable_unlink(RECOVERY_SIGNAL_FILE, FATAL); - /* read the tablespace_map file if present and create symlinks. */ - if (read_tablespace_map(&tablespaces)) - { - ListCell *lc; + /* + * Write the timeline history file, and have it archived. After this + * point (or rather, as soon as the file is archived), the timeline + * will appear as "taken" in the WAL archive and to any standby + * servers. If we crash before actually switching to the new + * timeline, standby servers will nevertheless think that we switched + * to the new timeline, and will try to connect to the new timeline. + * To minimize the window for that, try to do as little as possible + * between here and writing the end-of-recovery record. + */ + writeTimeLineHistory(newTLI, recoveryTargetTLI, + EndOfLog, endOfRecoveryInfo->recoveryStopReason); - foreach(lc, tablespaces) - { - tablespaceinfo *ti = lfirst(lc); - char *linkloc; + ereport(LOG, + (errmsg("archive recovery complete"))); + } - linkloc = psprintf("pg_tblspc/%s", ti->oid); + /* Save the selected TimeLineID in shared memory, too */ + XLogCtl->InsertTimeLineID = newTLI; + XLogCtl->PrevTimeLineID = endOfRecoveryInfo->lastRecTLI; - /* - * Remove the existing symlink if any and Create the symlink - * under PGDATA. - */ - remove_tablespace_symlink(linkloc); + /* + * Actually, if WAL ended in an incomplete record, skip the parts that + * made it through and start writing after the portion that persisted. + * (It's critical to first write an OVERWRITE_CONTRECORD message, which + * we'll do as soon as we're open for writing new WAL.) + */ + if (!XLogRecPtrIsInvalid(missingContrecPtr)) + { + /* + * We should only have a missingContrecPtr if we're not switching to + * a new timeline. When a timeline switch occurs, WAL is copied from + * the old timeline to the new only up to the end of the last complete + * record, so there can't be an incomplete WAL record that we need to + * disregard. + */ + Assert(newTLI == endOfRecoveryInfo->lastRecTLI); + Assert(!XLogRecPtrIsInvalid(abortedRecPtr)); + EndOfLog = missingContrecPtr; + } - if (symlink(ti->path, linkloc) < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not create symbolic link \"%s\": %m", - linkloc))); + /* + * Prepare to write WAL starting at EndOfLog location, and init xlog + * buffer cache using the block containing the last record from the + * previous incarnation. + */ + Insert = &XLogCtl->Insert; + Insert->PrevBytePos = XLogRecPtrToBytePos(endOfRecoveryInfo->lastRec); + Insert->CurrBytePos = XLogRecPtrToBytePos(EndOfLog); - pfree(ti->oid); - pfree(ti->path); - pfree(ti); - } + /* + * Tricky point here: lastPage contains the *last* block that the LastRec + * record spans, not the one it starts in. The last block is indeed the + * one we want to use. + */ + if (EndOfLog % XLOG_BLCKSZ != 0) + { + char *page; + int len; + int firstIdx; - /* set flag to delete it later */ - haveTblspcMap = true; - } + firstIdx = XLogRecPtrToBufIdx(EndOfLog); + len = EndOfLog - endOfRecoveryInfo->lastPageBeginPtr; + Assert(len < XLOG_BLCKSZ); + + /* Copy the valid part of the last block, and zero the rest */ + page = &XLogCtl->pages[firstIdx * XLOG_BLCKSZ]; + memcpy(page, endOfRecoveryInfo->lastPage, len); + memset(page + len, 0, XLOG_BLCKSZ - len); - /* set flag to delete it later */ - haveBackupLabel = true; + XLogCtl->xlblocks[firstIdx] = endOfRecoveryInfo->lastPageBeginPtr + XLOG_BLCKSZ; + XLogCtl->InitializedUpTo = endOfRecoveryInfo->lastPageBeginPtr + XLOG_BLCKSZ; } else { /* - * If tablespace_map file is present without backup_label file, there - * is no use of such file. There is no harm in retaining it, but it - * is better to get rid of the map file so that we don't have any - * redundant file in data directory and it will avoid any sort of - * confusion. It seems prudent though to just rename the file out of - * the way rather than delete it completely, also we ignore any error - * that occurs in rename operation as even if map file is present - * without backup_label file, it is harmless. + * There is no partial block to copy. Just set InitializedUpTo, and + * let the first attempt to insert a log record to initialize the next + * buffer. */ - if (stat(TABLESPACE_MAP, &st) == 0) - { - unlink(TABLESPACE_MAP_OLD); - if (durable_rename(TABLESPACE_MAP, TABLESPACE_MAP_OLD, DEBUG1) == 0) - ereport(LOG, - (errmsg("ignoring file \"%s\" because no file \"%s\" exists", - TABLESPACE_MAP, BACKUP_LABEL_FILE), - errdetail("File \"%s\" was renamed to \"%s\".", - TABLESPACE_MAP, TABLESPACE_MAP_OLD))); - else - ereport(LOG, - (errmsg("ignoring file \"%s\" because no file \"%s\" exists", - TABLESPACE_MAP, BACKUP_LABEL_FILE), - errdetail("Could not rename file \"%s\" to \"%s\": %m.", - TABLESPACE_MAP, TABLESPACE_MAP_OLD))); - } + XLogCtl->InitializedUpTo = EndOfLog; + } - /* - * It's possible that archive recovery was requested, but we don't - * know how far we need to replay the WAL before we reach consistency. - * This can happen for example if a base backup is taken from a - * running server using an atomic filesystem snapshot, without calling - * pg_start/stop_backup. Or if you just kill a running primary server - * and put it into archive recovery by creating a recovery signal - * file. - * - * Our strategy in that case is to perform crash recovery first, - * replaying all the WAL present in pg_wal, and only enter archive - * recovery after that. - * - * But usually we already know how far we need to replay the WAL (up - * to minRecoveryPoint, up to backupEndPoint, or until we see an - * end-of-backup record), and we can enter archive recovery directly. - */ - if (ArchiveRecoveryRequested && - (ControlFile->minRecoveryPoint != InvalidXLogRecPtr || - ControlFile->backupEndRequired || - ControlFile->backupEndPoint != InvalidXLogRecPtr || - ControlFile->state == DB_SHUTDOWNED)) - { - InArchiveRecovery = true; - if (StandbyModeRequested) - StandbyMode = true; - } + LogwrtResult.Write = LogwrtResult.Flush = EndOfLog; - /* Get the last valid checkpoint record. */ - checkPointLoc = ControlFile->checkPoint; - RedoStartLSN = ControlFile->checkPointCopy.redo; - record = ReadCheckpointRecord(xlogreader, checkPointLoc, 1, true); - if (record != NULL) - { - ereport(DEBUG1, - (errmsg_internal("checkpoint record is at %X/%X", - LSN_FORMAT_ARGS(checkPointLoc)))); - } - else - { - /* - * We used to attempt to go back to a secondary checkpoint record - * here, but only when not in standby mode. We now just fail if we - * can't read the last checkpoint because this allows us to - * simplify processing around checkpoints. - */ - ereport(PANIC, - (errmsg("could not locate a valid checkpoint record"))); - } - memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); - wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN); - } + XLogCtl->LogwrtResult = LogwrtResult; + + XLogCtl->LogwrtRqst.Write = EndOfLog; + XLogCtl->LogwrtRqst.Flush = EndOfLog; /* - * Clear out any old relcache cache files. This is *necessary* if we do - * any WAL replay, since that would probably result in the cache files - * being out of sync with database reality. In theory we could leave them - * in place if the database had been cleanly shut down, but it seems - * safest to just remove them always and let them be rebuilt during the - * first backend startup. These files needs to be removed from all - * directories including pg_tblspc, however the symlinks are created only - * after reading tablespace_map file in case of archive recovery from - * backup, so needs to clear old relcache files here after creating - * symlinks. + * Preallocate additional log files, if wanted. */ - RelationCacheInitFileRemove(); + PreallocXlogFiles(EndOfLog, newTLI); /* - * If the location of the checkpoint record is not on the expected - * timeline in the history of the requested timeline, we cannot proceed: - * the backup is not part of the history of the requested timeline. + * Okay, we're officially UP. */ - Assert(expectedTLEs); /* was initialized by reading checkpoint - * record */ - if (tliOfPointInHistory(checkPointLoc, expectedTLEs) != - checkPoint.ThisTimeLineID) - { - XLogRecPtr switchpoint; + InRecovery = false; - /* - * tliSwitchPoint will throw an error if the checkpoint's timeline is - * not in expectedTLEs at all. - */ - switchpoint = tliSwitchPoint(ControlFile->checkPointCopy.ThisTimeLineID, expectedTLEs, NULL); - ereport(FATAL, - (errmsg("requested timeline %u is not a child of this server's history", - recoveryTargetTLI), - errdetail("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.", - LSN_FORMAT_ARGS(ControlFile->checkPoint), - ControlFile->checkPointCopy.ThisTimeLineID, - LSN_FORMAT_ARGS(switchpoint)))); - } + /* start the archive_timeout timer and LSN running */ + XLogCtl->lastSegSwitchTime = (pg_time_t) time(NULL); + XLogCtl->lastSegSwitchLSN = EndOfLog; + + /* also initialize latestCompletedXid, to nextXid - 1 */ + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + ShmemVariableCache->latestCompletedXid = ShmemVariableCache->nextXid; + FullTransactionIdRetreat(&ShmemVariableCache->latestCompletedXid); + LWLockRelease(ProcArrayLock); /* - * The min recovery point should be part of the requested timeline's - * history, too. + * Start up subtrans, if not already done for hot standby. (commit + * timestamps are started below, if necessary.) */ - if (!XLogRecPtrIsInvalid(ControlFile->minRecoveryPoint) && - tliOfPointInHistory(ControlFile->minRecoveryPoint - 1, expectedTLEs) != - ControlFile->minRecoveryPointTLI) - ereport(FATAL, - (errmsg("requested timeline %u does not contain minimum recovery point %X/%X on timeline %u", - recoveryTargetTLI, - LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint), - ControlFile->minRecoveryPointTLI))); - - LastRec = RecPtr = checkPointLoc; - - ereport(DEBUG1, - (errmsg_internal("redo record is at %X/%X; shutdown %s", - LSN_FORMAT_ARGS(checkPoint.redo), - wasShutdown ? "true" : "false"))); - ereport(DEBUG1, - (errmsg_internal("next transaction ID: " UINT64_FORMAT "; next OID: %u", - U64FromFullTransactionId(checkPoint.nextXid), - checkPoint.nextOid))); - ereport(DEBUG1, - (errmsg_internal("next MultiXactId: %u; next MultiXactOffset: %u", - checkPoint.nextMulti, checkPoint.nextMultiOffset))); - ereport(DEBUG1, - (errmsg_internal("oldest unfrozen transaction ID: %u, in database %u", - checkPoint.oldestXid, checkPoint.oldestXidDB))); - ereport(DEBUG1, - (errmsg_internal("oldest MultiXactId: %u, in database %u", - checkPoint.oldestMulti, checkPoint.oldestMultiDB))); - ereport(DEBUG1, - (errmsg_internal("commit timestamp Xid oldest/newest: %u/%u", - checkPoint.oldestCommitTsXid, - checkPoint.newestCommitTsXid))); - if (!TransactionIdIsNormal(XidFromFullTransactionId(checkPoint.nextXid))) - ereport(PANIC, - (errmsg("invalid next transaction ID"))); + if (standbyState == STANDBY_DISABLED) + StartupSUBTRANS(oldestActiveXID); - /* initialize shared memory variables from the checkpoint record */ - ShmemVariableCache->nextXid = checkPoint.nextXid; - ShmemVariableCache->nextOid = checkPoint.nextOid; - ShmemVariableCache->oidCount = 0; - MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); - AdvanceOldestClogXid(checkPoint.oldestXid); - SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); - SetMultiXactIdLimit(checkPoint.oldestMulti, checkPoint.oldestMultiDB, true); - SetCommitTsLimit(checkPoint.oldestCommitTsXid, - checkPoint.newestCommitTsXid); - XLogCtl->ckptFullXid = checkPoint.nextXid; + /* + * Perform end of recovery actions for any SLRUs that need it. + */ + TrimCLOG(); + TrimMultiXact(); /* - * Initialize replication slots, before there's a chance to remove - * required resources. + * Reload shared-memory state for prepared transactions. This needs to + * happen before renaming the last partial segment of the old timeline as + * it may be possible that we have to recovery some transactions from it. */ - StartupReplicationSlots(); + RecoverPreparedTransactions(); + + /* Shut down xlogreader */ + ShutdownWalRecovery(); + + /* Enable WAL writes for this backend only. */ + LocalSetXLogInsertAllowed(); + + /* If necessary, write overwrite-contrecord before doing anything else */ + if (!XLogRecPtrIsInvalid(abortedRecPtr)) + { + Assert(!XLogRecPtrIsInvalid(missingContrecPtr)); + CreateOverwriteContrecordRecord(abortedRecPtr, missingContrecPtr, newTLI); + } /* - * Startup logical state, needs to be setup now so we have proper data - * during crash recovery. + * Update full_page_writes in shared memory and write an XLOG_FPW_CHANGE + * record before resource manager writes cleanup WAL records or checkpoint + * record is written. */ - StartupReorderBuffer(); + Insert->fullPageWrites = lastFullPageWrites; + UpdateFullPageWrites(); /* - * Startup CLOG. This must be done after ShmemVariableCache->nextXid has - * been initialized and before we accept connections or begin WAL replay. + * Emit checkpoint or end-of-recovery record in XLOG, if required. */ - StartupCLOG(); + if (performedWalRecovery) + promoted = PerformRecoveryXLogAction(); /* - * Startup MultiXact. We need to do this early to be able to replay - * truncations. + * If any of the critical GUCs have changed, log them before we allow + * backends to write WAL. */ - StartupMultiXact(); + XLogReportParameters(); + + /* If this is archive recovery, perform post-recovery cleanup actions. */ + if (ArchiveRecoveryRequested) + CleanupAfterArchiveRecovery(EndOfLogTLI, EndOfLog, newTLI); /* - * Ditto for commit timestamps. Activate the facility if the setting is - * enabled in the control file, as there should be no tracking of commit - * timestamps done when the setting was disabled. This facility can be - * started or stopped when replaying a XLOG_PARAMETER_CHANGE record. + * Local WAL inserts enabled, so it's time to finish initialization of + * commit timestamp. */ - if (ControlFile->track_commit_timestamp) - StartupCommitTs(); + CompleteCommitTsInitialization(); /* - * Recover knowledge about replay progress of known replication partners. + * All done with end-of-recovery actions. + * + * Now allow backends to write WAL and update the control file status in + * consequence. SharedRecoveryState, that controls if backends can write + * WAL, is updated while holding ControlFileLock to prevent other backends + * to look at an inconsistent state of the control file in shared memory. + * There is still a small window during which backends can write WAL and + * the control file is still referring to a system not in DB_IN_PRODUCTION + * state while looking at the on-disk control file. + * + * Also, we use info_lck to update SharedRecoveryState to ensure that + * there are no race conditions concerning visibility of other recent + * updates to shared memory. */ - StartupReplicationOrigin(); + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = DB_IN_PRODUCTION; + + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->SharedRecoveryState = RECOVERY_STATE_DONE; + SpinLockRelease(&XLogCtl->info_lck); + + UpdateControlFile(); + LWLockRelease(ControlFileLock); /* - * Initialize unlogged LSN. On a clean shutdown, it's restored from the - * control file. On recovery, all unlogged relations are blown away, so - * the unlogged LSN counter can be reset too. + * Shutdown the recovery environment. This must occur after + * RecoverPreparedTransactions() (see notes in lock_twophase_recover()) + * and after switching SharedRecoveryState to RECOVERY_STATE_DONE so as + * any session building a snapshot will not rely on KnownAssignedXids as + * RecoveryInProgress() would return false at this stage. This is + * particularly critical for prepared 2PC transactions, that would still + * need to be included in snapshots once recovery has ended. */ - if (ControlFile->state == DB_SHUTDOWNED) - XLogCtl->unloggedLSN = ControlFile->unloggedLSN; - else - XLogCtl->unloggedLSN = FirstNormalUnloggedLSN; + if (standbyState != STANDBY_DISABLED) + ShutdownRecoveryTransactionEnvironment(); /* - * We must replay WAL entries using the same TimeLineID they were created - * under, so temporarily adopt the TLI indicated by the checkpoint (see - * also xlog_redo()). + * If there were cascading standby servers connected to us, nudge any wal + * sender processes to notice that we've been promoted. */ - ThisTimeLineID = checkPoint.ThisTimeLineID; + WalSndWakeup(); /* - * Copy any missing timeline history files between 'now' and the recovery - * target timeline from archive to pg_wal. While we don't need those files - * ourselves - the history file of the recovery target timeline covers all - * the previous timelines in the history too - a cascading standby server - * might be interested in them. Or, if you archive the WAL from this - * server to a different archive than the primary, it'd be good for all - * the history files to get archived there after failover, so that you can - * use one of the old timelines as a PITR target. Timeline history files - * are small, so it's better to copy them unnecessarily than not copy them - * and regret later. + * If this was a promotion, request an (online) checkpoint now. This isn't + * required for consistency, but the last restartpoint might be far back, + * and in case of a crash, recovering from it might take a longer than is + * appropriate now that we're not in standby mode anymore. */ - restoreTimeLineHistoryFiles(ThisTimeLineID, recoveryTargetTLI); + if (promoted) + RequestCheckpoint(CHECKPOINT_FORCE); +} + +/* + * Callback from PerformWalRecovery(), called when we switch from crash + * recovery to archive recovery mode. Updates the control file accordingly. + */ +void +SwitchIntoArchiveRecovery(XLogRecPtr EndRecPtr, TimeLineID replayTLI) +{ + /* initialize minRecoveryPoint to this record */ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = DB_IN_ARCHIVE_RECOVERY; + if (ControlFile->minRecoveryPoint < EndRecPtr) + { + ControlFile->minRecoveryPoint = EndRecPtr; + ControlFile->minRecoveryPointTLI = replayTLI; + } + /* update local copy */ + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; /* - * Before running in recovery, scan pg_twophase and fill in its status to - * be able to work on entries generated by redo. Doing a scan before - * taking any recovery action has the merit to discard any 2PC files that - * are newer than the first record to replay, saving from any conflicts at - * replay. This avoids as well any subsequent scans when doing recovery - * of the on-disk two-phase data. + * The startup process can update its local copy of minRecoveryPoint from + * this point. */ - restoreTwoPhaseData(); + updateMinRecoveryPoint = true; - lastFullPageWrites = checkPoint.fullPageWrites; + UpdateControlFile(); - RedoRecPtr = XLogCtl->RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; - doPageWrites = lastFullPageWrites; + /* + * We update SharedRecoveryState while holding the lock on ControlFileLock + * so both states are consistent in shared memory. + */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->SharedRecoveryState = RECOVERY_STATE_ARCHIVE; + SpinLockRelease(&XLogCtl->info_lck); - if (RecPtr < checkPoint.redo) - ereport(PANIC, - (errmsg("invalid redo in checkpoint record"))); + LWLockRelease(ControlFileLock); +} +/* + * Callback from PerformWalRecovery(), called when we reach the end of backup. + * Updates the control file accordingly. + */ +void +ReachedEndOfBackup(XLogRecPtr EndRecPtr, TimeLineID tli) +{ /* - * Check whether we need to force recovery from WAL. If it appears to - * have been a clean shutdown and we did not have a recovery signal file, - * then assume no recovery needed. + * We have reached the end of base backup, as indicated by pg_control. The + * data on disk is now consistent (unless minRecovery point is further + * ahead, which can happen if we crashed during previous recovery). Reset + * backupStartPoint and backupEndPoint, and update minRecoveryPoint to + * make sure we don't allow starting up at an earlier point even if + * recovery is stopped and restarted soon after this. */ - if (checkPoint.redo < RecPtr) - { - if (wasShutdown) - ereport(PANIC, - (errmsg("invalid redo record in shutdown checkpoint"))); - InRecovery = true; - } - else if (ControlFile->state != DB_SHUTDOWNED) - InRecovery = true; - else if (ArchiveRecoveryRequested) + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + + if (ControlFile->minRecoveryPoint < EndRecPtr) { - /* force recovery due to presence of recovery signal file */ - InRecovery = true; + ControlFile->minRecoveryPoint = EndRecPtr; + ControlFile->minRecoveryPointTLI = tli; } + ControlFile->backupStartPoint = InvalidXLogRecPtr; + ControlFile->backupEndPoint = InvalidXLogRecPtr; + ControlFile->backupEndRequired = false; + UpdateControlFile(); + + LWLockRelease(ControlFileLock); +} + +/* + * Perform whatever XLOG actions are necessary at end of REDO. + * + * The goal here is to make sure that we'll be able to recover properly if + * we crash again. If we choose to write a checkpoint, we'll write a shutdown + * checkpoint rather than an on-line one. This is not particularly critical, + * but since we may be assigning a new TLI, using a shutdown checkpoint allows + * us to have the rule that TLI only changes in shutdown checkpoints, which + * allows some extra error checking in xlog_redo. + */ +static bool +PerformRecoveryXLogAction(void) +{ + bool promoted = false; + /* - * Start recovery assuming that the final record isn't lost. + * Perform a checkpoint to update all our recovery activity to disk. + * + * Note that we write a shutdown checkpoint rather than an on-line one. + * This is not particularly critical, but since we may be assigning a new + * TLI, using a shutdown checkpoint allows us to have the rule that TLI + * only changes in shutdown checkpoints, which allows some extra error + * checking in xlog_redo. + * + * In promotion, only create a lightweight end-of-recovery record instead + * of a full checkpoint. A checkpoint is requested later, after we're + * fully out of recovery mode and already accepting queries. */ - abortedRecPtr = InvalidXLogRecPtr; - missingContrecPtr = InvalidXLogRecPtr; - - /* REDO */ - if (InRecovery) + if (ArchiveRecoveryRequested && IsUnderPostmaster && + PromoteIsTriggered()) { - int rmid; + promoted = true; /* - * 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. + * Insert a special WAL record to mark the end of recovery, since we + * aren't doing a checkpoint. That means that the checkpointer process + * may likely be in the middle of a time-smoothed restartpoint and + * could continue to be for minutes after this. That sounds strange, + * but the effect is roughly the same and it would be stranger to try + * to come out of the restartpoint and then checkpoint. We request a + * checkpoint later anyway, just for safety. */ - dbstate_at_startup = ControlFile->state; - if (InArchiveRecovery) - { - ControlFile->state = DB_IN_ARCHIVE_RECOVERY; - - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedRecoveryState = RECOVERY_STATE_ARCHIVE; - SpinLockRelease(&XLogCtl->info_lck); - } - else - { - ereport(LOG, - (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; + CreateEndOfRecoveryRecord(); + } + else + { + RequestCheckpoint(CHECKPOINT_END_OF_RECOVERY | + CHECKPOINT_IMMEDIATE | + CHECKPOINT_WAIT); + } - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedRecoveryState = RECOVERY_STATE_CRASH; - SpinLockRelease(&XLogCtl->info_lck); - } - ControlFile->checkPoint = checkPointLoc; - ControlFile->checkPointCopy = checkPoint; - if (InArchiveRecovery) - { - /* initialize minRecoveryPoint if not set yet */ - if (ControlFile->minRecoveryPoint < checkPoint.redo) - { - ControlFile->minRecoveryPoint = checkPoint.redo; - ControlFile->minRecoveryPointTLI = checkPoint.ThisTimeLineID; - } - } + return promoted; +} +/* + * Is the system still in recovery? + * + * Unlike testing InRecovery, this works in any process that's connected to + * shared memory. + */ +bool +RecoveryInProgress(void) +{ + /* + * We check shared state each time only until we leave recovery mode. We + * can't re-enter recovery, so there's no need to keep checking after the + * shared variable has once been seen false. + */ + if (!LocalRecoveryInProgress) + return false; + else + { /* - * 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. + * use volatile pointer to make sure we make a fresh read of the + * shared variable. */ - if (haveBackupLabel) - { - ControlFile->backupStartPoint = checkPoint.redo; - ControlFile->backupEndRequired = backupEndRequired; + volatile XLogCtlData *xlogctl = XLogCtl; - 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; - } - } - ControlFile->time = (pg_time_t) time(NULL); - /* No need to hold ControlFileLock yet, we aren't up far enough */ - UpdateControlFile(); + LocalRecoveryInProgress = (xlogctl->SharedRecoveryState != RECOVERY_STATE_DONE); /* - * Initialize our local copy of minRecoveryPoint. When doing crash - * recovery we want to replay up to the end of WAL. Particularly, in - * the case of a promoted standby minRecoveryPoint value in the - * control file is only updated after the first checkpoint. However, - * if the instance crashes before the first post-recovery checkpoint - * is completed then recovery will use a stale location causing the - * startup process to think that there are still invalid page - * references when checking for data consistency. + * Note: We don't need a memory barrier when we're still in recovery. + * We might exit recovery immediately after return, so the caller + * can't rely on 'true' meaning that we're still in recovery anyway. */ - if (InArchiveRecovery) - { - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; - } - else - { - minRecoveryPoint = InvalidXLogRecPtr; - minRecoveryPointTLI = 0; - } - /* - * Reset pgstat data, because it may be invalid after recovery. - */ - pgstat_reset_all(); - - /* - * If there was a backup label file, it's done its job and the info - * has now been propagated into pg_control. We must get rid of the - * label file so that if we crash during recovery, we'll pick up at - * the latest recovery restartpoint instead of going all the way back - * to the backup start point. It seems prudent though to just rename - * the file out of the way rather than delete it completely. - */ - if (haveBackupLabel) - { - unlink(BACKUP_LABEL_OLD); - durable_rename(BACKUP_LABEL_FILE, BACKUP_LABEL_OLD, FATAL); - } - - /* - * If there was a tablespace_map file, it's done its job and the - * symlinks have been created. We must get rid of the map file so - * that if we crash during recovery, we don't create symlinks again. - * It seems prudent though to just rename the file out of the way - * rather than delete it completely. - */ - if (haveTblspcMap) - { - unlink(TABLESPACE_MAP_OLD); - durable_rename(TABLESPACE_MAP, TABLESPACE_MAP_OLD, FATAL); - } - - /* Check that the GUCs used to generate the WAL allow recovery */ - CheckRequiredParameterValues(); + return LocalRecoveryInProgress; + } +} - /* - * We're in recovery, so unlogged relations may be trashed and must be - * reset. This should be done BEFORE allowing Hot Standby - * connections, so that read-only backends don't try to read whatever - * garbage is left over from before. - */ - ResetUnloggedRelations(UNLOGGED_RELATION_CLEANUP); +/* + * Returns current recovery state from shared memory. + * + * This returned state is kept consistent with the contents of the control + * file. See details about the possible values of RecoveryState in xlog.h. + */ +RecoveryState +GetRecoveryState(void) +{ + RecoveryState retval; - /* - * Likewise, delete any saved transaction snapshot files that got left - * behind by crashed backends. - */ - DeleteAllExportedSnapshotFiles(); + SpinLockAcquire(&XLogCtl->info_lck); + retval = XLogCtl->SharedRecoveryState; + SpinLockRelease(&XLogCtl->info_lck); - /* - * Initialize for Hot Standby, if enabled. We won't let backends in - * yet, not until we've reached the min recovery point specified in - * control file and we've established a recovery snapshot from a - * running-xacts WAL record. - */ - if (ArchiveRecoveryRequested && EnableHotStandby) - { - TransactionId *xids; - int nxids; + return retval; +} - ereport(DEBUG1, - (errmsg_internal("initializing for hot standby"))); +/* + * Is this process allowed to insert new WAL records? + * + * Ordinarily this is essentially equivalent to !RecoveryInProgress(). + * But we also have provisions for forcing the result "true" or "false" + * within specific processes regardless of the global state. + */ +bool +XLogInsertAllowed(void) +{ + /* + * If value is "unconditionally true" or "unconditionally false", just + * return it. This provides the normal fast path once recovery is known + * done. + */ + if (LocalXLogInsertAllowed >= 0) + return (bool) LocalXLogInsertAllowed; - InitRecoveryTransactionEnvironment(); + /* + * Else, must check to see if we're still in recovery. + */ + if (RecoveryInProgress()) + return false; - if (wasShutdown) - oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); - else - oldestActiveXID = checkPoint.oldestActiveXid; - Assert(TransactionIdIsValid(oldestActiveXID)); + /* + * On exit from recovery, reset to "unconditionally true", since there is + * no need to keep checking. + */ + LocalXLogInsertAllowed = 1; + return true; +} - /* Tell procarray about the range of xids it has to deal with */ - ProcArrayInitRecovery(XidFromFullTransactionId(ShmemVariableCache->nextXid)); +/* + * Make XLogInsertAllowed() return true in the current process only. + * + * Note: it is allowed to switch LocalXLogInsertAllowed back to -1 later, + * and even call LocalSetXLogInsertAllowed() again after that. + * + * Returns the previous value of LocalXLogInsertAllowed. + */ +static int +LocalSetXLogInsertAllowed(void) +{ + int oldXLogAllowed = LocalXLogInsertAllowed; - /* - * Startup subtrans only. CLOG, MultiXact and commit timestamp - * have already been started up and other SLRUs are not maintained - * during recovery and need not be started yet. - */ - StartupSUBTRANS(oldestActiveXID); + LocalXLogInsertAllowed = 1; - /* - * If we're beginning at a shutdown checkpoint, we know that - * nothing was running on the primary at this point. So fake-up an - * empty running-xacts record and use that here and now. Recover - * additional standby state for prepared transactions. - */ - if (wasShutdown) - { - RunningTransactionsData running; - TransactionId latestCompletedXid; + return oldXLogAllowed; +} - /* - * Construct a RunningTransactions snapshot representing a - * shut down server, with only prepared transactions still - * alive. We're never overflowed at this point because all - * subxids are listed with their parent prepared transactions. - */ - running.xcnt = nxids; - running.subxcnt = 0; - running.subxid_overflow = false; - running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); - running.oldestRunningXid = oldestActiveXID; - latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); - TransactionIdRetreat(latestCompletedXid); - Assert(TransactionIdIsNormal(latestCompletedXid)); - running.latestCompletedXid = latestCompletedXid; - running.xids = xids; +/* + * Return the current Redo pointer from shared memory. + * + * As a side-effect, the local RedoRecPtr copy is updated. + */ +XLogRecPtr +GetRedoRecPtr(void) +{ + XLogRecPtr ptr; - ProcArrayApplyRecoveryInfo(&running); + /* + * The possibly not up-to-date copy in XlogCtl is enough. Even if we + * grabbed a WAL insertion lock to read the authoritative value in + * Insert->RedoRecPtr, someone might update it just after we've released + * the lock. + */ + SpinLockAcquire(&XLogCtl->info_lck); + ptr = XLogCtl->RedoRecPtr; + SpinLockRelease(&XLogCtl->info_lck); - StandbyRecoverPreparedTransactions(); - } - } + if (RedoRecPtr < ptr) + RedoRecPtr = ptr; - /* Initialize resource managers */ - for (rmid = 0; rmid <= RM_MAX_ID; rmid++) - { - if (RmgrTable[rmid].rm_startup != NULL) - RmgrTable[rmid].rm_startup(); - } + return RedoRecPtr; +} - /* - * Initialize shared variables for tracking progress of WAL replay, as - * if we had just replayed the record before the REDO location (or the - * checkpoint record itself, if it's a shutdown checkpoint). - */ - SpinLockAcquire(&XLogCtl->info_lck); - if (checkPoint.redo < RecPtr) - XLogCtl->replayEndRecPtr = checkPoint.redo; - else - XLogCtl->replayEndRecPtr = EndRecPtr; - XLogCtl->replayEndTLI = ThisTimeLineID; - XLogCtl->lastReplayedEndRecPtr = XLogCtl->replayEndRecPtr; - XLogCtl->lastReplayedTLI = XLogCtl->replayEndTLI; - XLogCtl->recoveryLastXTime = 0; - XLogCtl->currentChunkStartTime = 0; - XLogCtl->recoveryPauseState = RECOVERY_NOT_PAUSED; - SpinLockRelease(&XLogCtl->info_lck); +/* + * Return information needed to decide whether a modified block needs a + * 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, 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. + */ +void +GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p) +{ + *RedoRecPtr_p = RedoRecPtr; + *doPageWrites_p = doPageWrites; +} - /* Also ensure XLogReceiptTime has a sane value */ - XLogReceiptTime = GetCurrentTimestamp(); +/* + * GetInsertRecPtr -- Returns the current insert position. + * + * NOTE: The value *actually* returned is the position of the last full + * xlog page. It lags behind the real insert position by at most 1 page. + * For that, we don't need to scan through WAL insertion locks, and an + * approximation is enough for the current usage of this function. + */ +XLogRecPtr +GetInsertRecPtr(void) +{ + XLogRecPtr recptr; - /* - * Let postmaster know we've started redo now, so that it can launch - * checkpointer to perform restartpoints. We don't bother during - * crash recovery as restartpoints can only be performed during - * archive recovery. And we'd like to keep crash recovery simple, to - * avoid introducing bugs that could affect you when recovering after - * crash. - * - * After this point, we can no longer assume that we're the only - * process in addition to postmaster! Also, fsync requests are - * subsequently to be handled by the checkpointer, not locally. - */ - if (ArchiveRecoveryRequested && IsUnderPostmaster) - { - PublishStartupProcessInformation(); - EnableSyncRequestForwarding(); - SendPostmasterSignal(PMSIGNAL_RECOVERY_STARTED); - bgwriterLaunched = true; - } + SpinLockAcquire(&XLogCtl->info_lck); + recptr = XLogCtl->LogwrtRqst.Write; + SpinLockRelease(&XLogCtl->info_lck); - /* - * Allow read-only connections immediately if we're consistent - * already. - */ - CheckRecoveryConsistency(); + return recptr; +} - /* - * Find the first record that logically follows the checkpoint --- it - * might physically precede it, though. - */ - if (checkPoint.redo < RecPtr) - { - /* back up to find the record */ - XLogBeginRead(xlogreader, checkPoint.redo); - record = ReadRecord(xlogreader, PANIC, false); - } - else - { - /* just have to read next record after CheckPoint */ - record = ReadRecord(xlogreader, LOG, false); - } +/* + * GetFlushRecPtr -- Returns the current flush position, ie, the last WAL + * position known to be fsync'd to disk. This should only be used on a + * system that is known not to be in recovery. + */ +XLogRecPtr +GetFlushRecPtr(TimeLineID *insertTLI) +{ + Assert(XLogCtl->SharedRecoveryState == RECOVERY_STATE_DONE); - if (record != NULL) - { - ErrorContextCallback errcallback; - TimestampTz xtime; - PGRUsage ru0; + SpinLockAcquire(&XLogCtl->info_lck); + LogwrtResult = XLogCtl->LogwrtResult; + SpinLockRelease(&XLogCtl->info_lck); - pg_rusage_init(&ru0); + /* + * If we're writing and flushing WAL, the time line can't be changing, so + * no lock is required. + */ + if (insertTLI) + *insertTLI = XLogCtl->InsertTimeLineID; - InRedo = true; + return LogwrtResult.Flush; +} - ereport(LOG, - (errmsg("redo starts at %X/%X", - LSN_FORMAT_ARGS(ReadRecPtr)))); +/* + * GetWALInsertionTimeLine -- Returns the current timeline of a system that + * is not in recovery. + */ +TimeLineID +GetWALInsertionTimeLine(void) +{ + Assert(XLogCtl->SharedRecoveryState == RECOVERY_STATE_DONE); - /* - * main redo apply loop - */ - do - { - bool switchedTLI = false; + /* Since the value can't be changing, no lock is required. */ + return XLogCtl->InsertTimeLineID; +} -#ifdef WAL_DEBUG - if (XLOG_DEBUG || - (rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || - (rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) - { - StringInfoData buf; - - initStringInfo(&buf); - appendStringInfo(&buf, "REDO @ %X/%X; LSN %X/%X: ", - LSN_FORMAT_ARGS(ReadRecPtr), - LSN_FORMAT_ARGS(EndRecPtr)); - xlog_outrec(&buf, xlogreader); - appendStringInfoString(&buf, " - "); - xlog_outdesc(&buf, xlogreader); - elog(LOG, "%s", buf.data); - pfree(buf.data); - } -#endif - - /* Handle interrupt signals of startup process */ - HandleStartupProcInterrupts(); - - /* - * Pause WAL replay, if requested by a hot-standby session via - * SetRecoveryPause(). - * - * Note that we intentionally don't take the info_lck spinlock - * here. We might therefore read a slightly stale value of - * the recoveryPause flag, but it can't be very stale (no - * worse than the last spinlock we did acquire). Since a - * pause request is a pretty asynchronous thing anyway, - * possibly responding to it one WAL record later than we - * otherwise would is a minor issue, so it doesn't seem worth - * adding another spinlock cycle to prevent that. - */ - if (((volatile XLogCtlData *) XLogCtl)->recoveryPauseState != - RECOVERY_NOT_PAUSED) - recoveryPausesHere(false); - - /* - * Have we reached our recovery target? - */ - if (recoveryStopsBefore(xlogreader)) - { - reachedRecoveryTarget = true; - break; - } - - /* - * If we've been asked to lag the primary, wait on latch until - * enough time has passed. - */ - if (recoveryApplyDelay(xlogreader)) - { - /* - * We test for paused recovery again here. If user sets - * delayed apply, it may be because they expect to pause - * recovery in case of problems, so we must test again - * here otherwise pausing during the delay-wait wouldn't - * work. - */ - if (((volatile XLogCtlData *) XLogCtl)->recoveryPauseState != - RECOVERY_NOT_PAUSED) - recoveryPausesHere(false); - } - - /* Setup error traceback support for ereport() */ - errcallback.callback = rm_redo_error_callback; - errcallback.arg = (void *) xlogreader; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - - /* - * ShmemVariableCache->nextXid must be beyond record's xid. - */ - AdvanceNextFullTransactionIdPastXid(record->xl_xid); - - /* - * Before replaying this record, check if this record causes - * the current timeline to change. The record is already - * considered to be part of the new timeline, so we update - * ThisTimeLineID before replaying it. That's important so - * that replayEndTLI, which is recorded as the minimum - * recovery point's TLI if recovery stops after this record, - * is set correctly. - */ - if (record->xl_rmid == RM_XLOG_ID) - { - TimeLineID newTLI = ThisTimeLineID; - TimeLineID prevTLI = ThisTimeLineID; - uint8 info = record->xl_info & ~XLR_INFO_MASK; - - if (info == XLOG_CHECKPOINT_SHUTDOWN) - { - CheckPoint checkPoint; - - memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); - newTLI = checkPoint.ThisTimeLineID; - prevTLI = checkPoint.PrevTimeLineID; - } - else if (info == XLOG_END_OF_RECOVERY) - { - xl_end_of_recovery xlrec; - - memcpy(&xlrec, XLogRecGetData(xlogreader), sizeof(xl_end_of_recovery)); - newTLI = xlrec.ThisTimeLineID; - prevTLI = xlrec.PrevTimeLineID; - } - - if (newTLI != ThisTimeLineID) - { - /* Check that it's OK to switch to this TLI */ - checkTimeLineSwitch(EndRecPtr, newTLI, prevTLI); - - /* Following WAL records should be run with new TLI */ - ThisTimeLineID = newTLI; - switchedTLI = true; - } - } - - /* - * Update shared replayEndRecPtr before replaying this record, - * so that XLogFlush will update minRecoveryPoint correctly. - */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->replayEndRecPtr = EndRecPtr; - XLogCtl->replayEndTLI = ThisTimeLineID; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * If we are attempting to enter Hot Standby mode, process - * XIDs we see - */ - if (standbyState >= STANDBY_INITIALIZED && - TransactionIdIsValid(record->xl_xid)) - RecordKnownAssignedTransactionIds(record->xl_xid); - - /* Now apply the WAL record itself */ - RmgrTable[record->xl_rmid].rm_redo(xlogreader); - - /* - * After redo, check whether the backup pages associated with - * the WAL record are consistent with the existing pages. This - * check is done only if consistency check is enabled for this - * record. - */ - if ((record->xl_info & XLR_CHECK_CONSISTENCY) != 0) - checkXLogConsistency(xlogreader); - - /* Pop the error context stack */ - error_context_stack = errcallback.previous; - - /* - * Update lastReplayedEndRecPtr after this record has been - * successfully replayed. - */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->lastReplayedEndRecPtr = EndRecPtr; - XLogCtl->lastReplayedTLI = ThisTimeLineID; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * If rm_redo called XLogRequestWalReceiverReply, then we wake - * up the receiver so that it notices the updated - * lastReplayedEndRecPtr and sends a reply to the primary. - */ - if (doRequestWalReceiverReply) - { - doRequestWalReceiverReply = false; - WalRcvForceReply(); - } +/* + * GetLastImportantRecPtr -- Returns the LSN of the last important record + * inserted. All records not explicitly marked as unimportant are considered + * important. + * + * The LSN is determined by computing the maximum of + * WALInsertLocks[i].lastImportantAt. + */ +XLogRecPtr +GetLastImportantRecPtr(void) +{ + XLogRecPtr res = InvalidXLogRecPtr; + int i; - /* Remember this record as the last-applied one */ - LastRec = ReadRecPtr; + for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++) + { + XLogRecPtr last_important; - /* Allow read-only connections if we're consistent now */ - CheckRecoveryConsistency(); + /* + * Need to take a lock to prevent torn reads of the LSN, which are + * possible on some of the supported platforms. WAL insert locks only + * support exclusive mode, so we have to use that. + */ + LWLockAcquire(&WALInsertLocks[i].l.lock, LW_EXCLUSIVE); + last_important = WALInsertLocks[i].l.lastImportantAt; + LWLockRelease(&WALInsertLocks[i].l.lock); - /* Is this a timeline switch? */ - if (switchedTLI) - { - /* - * Before we continue on the new timeline, clean up any - * (possibly bogus) future WAL segments on the old - * timeline. - */ - RemoveNonParentXlogFiles(EndRecPtr, ThisTimeLineID); - - /* - * Wake up any walsenders to notice that we are on a new - * timeline. - */ - if (AllowCascadeReplication()) - WalSndWakeup(); - } + if (res < last_important) + res = last_important; + } - /* Exit loop if we reached inclusive recovery target */ - if (recoveryStopsAfter(xlogreader)) - { - reachedRecoveryTarget = true; - break; - } + return res; +} - /* Else, try to fetch the next WAL record */ - record = ReadRecord(xlogreader, LOG, false); - } while (record != NULL); +/* + * Get the time and LSN of the last xlog segment switch + */ +pg_time_t +GetLastSegSwitchData(XLogRecPtr *lastSwitchLSN) +{ + pg_time_t result; - /* - * end of main redo apply loop - */ + /* Need WALWriteLock, but shared lock is sufficient */ + LWLockAcquire(WALWriteLock, LW_SHARED); + result = XLogCtl->lastSegSwitchTime; + *lastSwitchLSN = XLogCtl->lastSegSwitchLSN; + LWLockRelease(WALWriteLock); - if (reachedRecoveryTarget) - { - if (!reachedConsistency) - ereport(FATAL, - (errmsg("requested recovery stop point is before consistent recovery point"))); + return result; +} - /* - * This is the last point where we can restart recovery with a - * new recovery target, if we shutdown and begin again. After - * this, Resource Managers may choose to do permanent - * corrective actions at end of recovery. - */ - switch (recoveryTargetAction) - { - case RECOVERY_TARGET_ACTION_SHUTDOWN: +/* + * This must be called ONCE during postmaster or standalone-backend shutdown + */ +void +ShutdownXLOG(int code, Datum arg) +{ + /* + * We should have an aux process resource owner to use, and we should not + * be in a transaction that's installed some other resowner. + */ + Assert(AuxProcessResourceOwner != NULL); + Assert(CurrentResourceOwner == NULL || + CurrentResourceOwner == AuxProcessResourceOwner); + CurrentResourceOwner = AuxProcessResourceOwner; - /* - * exit with special return code to request shutdown - * of postmaster. Log messages issued from - * postmaster. - */ - proc_exit(3); + /* Don't be chatty in standalone mode */ + ereport(IsPostmasterEnvironment ? LOG : NOTICE, + (errmsg("shutting down"))); - case RECOVERY_TARGET_ACTION_PAUSE: - SetRecoveryPause(true); - recoveryPausesHere(true); + /* + * Signal walsenders to move to stopping state. + */ + WalSndInitStopping(); - /* drop into promote */ + /* + * Wait for WAL senders to be in stopping state. This prevents commands + * from writing new WAL. + */ + WalSndWaitStopping(); - case RECOVERY_TARGET_ACTION_PROMOTE: - break; - } - } + if (RecoveryInProgress()) + CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); + else + { + /* + * If archiving is enabled, rotate the last XLOG file so that all the + * remaining records are archived (postmaster wakes up the archiver + * process one more time at the end of shutdown). The checkpoint + * record will go to the next XLOG file and won't be archived (yet). + */ + if (XLogArchivingActive()) + RequestXLogSwitch(false); - /* 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(); - } + CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); + } +} - ereport(LOG, - (errmsg("redo done at %X/%X system usage: %s", - LSN_FORMAT_ARGS(ReadRecPtr), - pg_rusage_show(&ru0)))); - xtime = GetLatestXTime(); - if (xtime) - ereport(LOG, - (errmsg("last completed transaction was at log time %s", - timestamptz_to_str(xtime)))); - - InRedo = false; - } - else - { - /* there are no WAL records following the checkpoint */ - ereport(LOG, - (errmsg("redo is not required"))); +/* + * Log start of a checkpoint. + */ +static void +LogCheckpointStart(int flags, bool restartpoint) +{ + if (restartpoint) + ereport(LOG, + /* translator: the placeholders show checkpoint options */ + (errmsg("restartpoint starting:%s%s%s%s%s%s%s%s", + (flags & CHECKPOINT_IS_SHUTDOWN) ? " shutdown" : "", + (flags & CHECKPOINT_END_OF_RECOVERY) ? " end-of-recovery" : "", + (flags & CHECKPOINT_IMMEDIATE) ? " immediate" : "", + (flags & CHECKPOINT_FORCE) ? " force" : "", + (flags & CHECKPOINT_WAIT) ? " wait" : "", + (flags & CHECKPOINT_CAUSE_XLOG) ? " wal" : "", + (flags & CHECKPOINT_CAUSE_TIME) ? " time" : "", + (flags & CHECKPOINT_FLUSH_ALL) ? " flush-all" : ""))); + else + ereport(LOG, + /* translator: the placeholders show checkpoint options */ + (errmsg("checkpoint starting:%s%s%s%s%s%s%s%s", + (flags & CHECKPOINT_IS_SHUTDOWN) ? " shutdown" : "", + (flags & CHECKPOINT_END_OF_RECOVERY) ? " end-of-recovery" : "", + (flags & CHECKPOINT_IMMEDIATE) ? " immediate" : "", + (flags & CHECKPOINT_FORCE) ? " force" : "", + (flags & CHECKPOINT_WAIT) ? " wait" : "", + (flags & CHECKPOINT_CAUSE_XLOG) ? " wal" : "", + (flags & CHECKPOINT_CAUSE_TIME) ? " time" : "", + (flags & CHECKPOINT_FLUSH_ALL) ? " flush-all" : ""))); +} - } +/* + * Log end of a checkpoint. + */ +static void +LogCheckpointEnd(bool restartpoint) +{ + long write_msecs, + sync_msecs, + total_msecs, + longest_msecs, + average_msecs; + uint64 average_sync_time; - /* - * This check is intentionally after the above log messages that - * indicate how far recovery went. - */ - if (ArchiveRecoveryRequested && - recoveryTarget != RECOVERY_TARGET_UNSET && - !reachedRecoveryTarget) - ereport(FATAL, - (errmsg("recovery ended before configured recovery target was reached"))); - } + CheckpointStats.ckpt_end_t = GetCurrentTimestamp(); - /* - * Kill WAL receiver, if it's still running, before we continue to write - * the startup checkpoint and aborted-contrecord records. It will trump - * over these records and subsequent ones if it's still alive when we - * start writing WAL. - */ - ShutdownWalRcv(); + write_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_write_t, + CheckpointStats.ckpt_sync_t); - /* - * Reset unlogged relations to the contents of their INIT fork. This is - * done AFTER recovery is complete so as to include any unlogged relations - * created during recovery, but BEFORE recovery is marked as having - * completed successfully. Otherwise we'd not retry if any of the post - * end-of-recovery steps fail. - */ - if (InRecovery) - ResetUnloggedRelations(UNLOGGED_RELATION_INIT); + sync_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_sync_t, + CheckpointStats.ckpt_sync_end_t); - /* - * We don't need the latch anymore. It's not strictly necessary to disown - * it, but let's do it for the sake of tidiness. - */ - if (ArchiveRecoveryRequested) - DisownLatch(&XLogCtl->recoveryWakeupLatch); + /* Accumulate checkpoint timing summary data, in milliseconds. */ + PendingCheckpointerStats.checkpoint_write_time += write_msecs; + PendingCheckpointerStats.checkpoint_sync_time += sync_msecs; /* - * We are now done reading the xlog from stream. Turn off streaming - * recovery to force fetching the files (which would be required at end of - * recovery, e.g., timeline history file) from archive or pg_wal. - * - * Note that standby mode must be turned off after killing WAL receiver, - * i.e., calling ShutdownWalRcv(). + * All of the published timing statistics are accounted for. Only + * continue if a log message is to be written. */ - Assert(!WalRcvStreaming()); - StandbyMode = false; + if (!log_checkpoints) + return; - /* - * Determine where to start writing WAL next. - * - * When recovery ended in an incomplete record, write a WAL record about - * that and continue after it. In all other cases, re-fetch the last - * valid or last applied record, so we can identify the exact endpoint of - * what we consider the valid portion of WAL. - */ - XLogBeginRead(xlogreader, LastRec); - record = ReadRecord(xlogreader, PANIC, false); - EndOfLog = EndRecPtr; + total_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_start_t, + CheckpointStats.ckpt_end_t); /* - * EndOfLogTLI is the TLI in the filename of the XLOG segment containing - * the end-of-log. It could be different from the timeline that EndOfLog - * nominally belongs to, if there was a timeline switch in that segment, - * and we were reading the old WAL from a segment belonging to a higher - * timeline. + * Timing values returned from CheckpointStats are in microseconds. + * Convert to milliseconds for consistent printing. */ - EndOfLogTLI = xlogreader->seg.ws_tli; + longest_msecs = (long) ((CheckpointStats.ckpt_longest_sync + 999) / 1000); - /* - * 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 - * minRecoveryPoint here, even though ControlFile->minRecoveryPoint might - * be further ahead --- ControlFile->minRecoveryPoint cannot have been - * advanced beyond the WAL we processed. - */ - if (InRecovery && - (EndOfLog < minRecoveryPoint || - !XLogRecPtrIsInvalid(ControlFile->backupStartPoint))) - { - /* - * 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. - */ - if (ArchiveRecoveryRequested || ControlFile->backupEndRequired) - { - if (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"))); - } - } + average_sync_time = 0; + if (CheckpointStats.ckpt_sync_rels > 0) + average_sync_time = CheckpointStats.ckpt_agg_sync_time / + CheckpointStats.ckpt_sync_rels; + average_msecs = (long) ((average_sync_time + 999) / 1000); - /* - * Pre-scan prepared transactions to find out the range of XIDs present. - * This information is not quite needed yet, but it is positioned here so - * as potential problems are detected before any on-disk change is done. - */ - oldestActiveXID = PrescanPreparedTransactions(NULL, NULL); + if (restartpoint) + ereport(LOG, + (errmsg("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", + CheckpointStats.ckpt_bufs_written, + (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers, + CheckpointStats.ckpt_segs_added, + CheckpointStats.ckpt_segs_removed, + CheckpointStats.ckpt_segs_recycled, + write_msecs / 1000, (int) (write_msecs % 1000), + sync_msecs / 1000, (int) (sync_msecs % 1000), + total_msecs / 1000, (int) (total_msecs % 1000), + CheckpointStats.ckpt_sync_rels, + longest_msecs / 1000, (int) (longest_msecs % 1000), + average_msecs / 1000, (int) (average_msecs % 1000), + (int) (PrevCheckPointDistance / 1024.0), + (int) (CheckPointDistanceEstimate / 1024.0)))); + else + ereport(LOG, + (errmsg("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", + CheckpointStats.ckpt_bufs_written, + (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers, + CheckpointStats.ckpt_segs_added, + CheckpointStats.ckpt_segs_removed, + CheckpointStats.ckpt_segs_recycled, + write_msecs / 1000, (int) (write_msecs % 1000), + sync_msecs / 1000, (int) (sync_msecs % 1000), + total_msecs / 1000, (int) (total_msecs % 1000), + CheckpointStats.ckpt_sync_rels, + longest_msecs / 1000, (int) (longest_msecs % 1000), + average_msecs / 1000, (int) (average_msecs % 1000), + (int) (PrevCheckPointDistance / 1024.0), + (int) (CheckPointDistanceEstimate / 1024.0)))); +} +/* + * Update the estimate of distance between checkpoints. + * + * The estimate is used to calculate the number of WAL segments to keep + * preallocated, see XLOGfileslop(). + */ +static void +UpdateCheckPointDistanceEstimate(uint64 nbytes) +{ /* - * Consider whether we need to assign a new timeline ID. + * To estimate the number of segments consumed between checkpoints, keep a + * moving average of the amount of WAL generated in previous checkpoint + * cycles. However, if the load is bursty, with quiet periods and busy + * periods, we want to cater for the peak load. So instead of a plain + * moving average, let the average decline slowly if the previous cycle + * used less WAL than estimated, but bump it up immediately if it used + * more. * - * If we are doing an archive recovery, we always assign a new ID. This - * handles a couple of issues. If we stopped short of the end of WAL - * during recovery, then we are clearly generating a new timeline and must - * assign it a unique new ID. Even if we ran to the end, modifying the - * current last segment is problematic because it may result in trying to - * overwrite an already-archived copy of that segment, and we encourage - * DBAs to make their archive_commands reject that. We can dodge the - * problem by making the new active segment have a new timeline ID. + * When checkpoints are triggered by max_wal_size, this should converge to + * CheckpointSegments * wal_segment_size, * - * In a normal crash recovery, we can just extend the timeline we were in. + * Note: This doesn't pay any attention to what caused the checkpoint. + * Checkpoints triggered manually with CHECKPOINT command, or by e.g. + * starting a base backup, are counted the same as those created + * automatically. The slow-decline will largely mask them out, if they are + * not frequent. If they are frequent, it seems reasonable to count them + * in as any others; if you issue a manual checkpoint every 5 minutes and + * never let a timed checkpoint happen, it makes sense to base the + * preallocation on that 5 minute interval rather than whatever + * checkpoint_timeout is set to. */ - PrevTimeLineID = ThisTimeLineID; - if (ArchiveRecoveryRequested) - { - char reason[200]; - char recoveryPath[MAXPGPATH]; - - Assert(InArchiveRecovery); + PrevCheckPointDistance = nbytes; + if (CheckPointDistanceEstimate < nbytes) + CheckPointDistanceEstimate = nbytes; + else + CheckPointDistanceEstimate = + (0.90 * CheckPointDistanceEstimate + 0.10 * (double) nbytes); +} - ThisTimeLineID = findNewestTimeLine(recoveryTargetTLI) + 1; - ereport(LOG, - (errmsg("selected new timeline ID: %u", ThisTimeLineID))); +/* + * Update the ps display for a process running a checkpoint. Note that + * this routine should not do any allocations so as it can be called + * from a critical section. + */ +static void +update_checkpoint_display(int flags, bool restartpoint, bool reset) +{ + /* + * The status is reported only for end-of-recovery and shutdown + * checkpoints or shutdown restartpoints. Updating the ps display is + * useful in those situations as it may not be possible to rely on + * pg_stat_activity to see the status of the checkpointer or the startup + * process. + */ + if ((flags & (CHECKPOINT_END_OF_RECOVERY | CHECKPOINT_IS_SHUTDOWN)) == 0) + return; - /* - * Create a comment for the history file to explain why and where - * timeline changed. - */ - if (recoveryTarget == RECOVERY_TARGET_XID) - snprintf(reason, sizeof(reason), - "%s transaction %u", - recoveryStopAfter ? "after" : "before", - recoveryStopXid); - else if (recoveryTarget == RECOVERY_TARGET_TIME) - snprintf(reason, sizeof(reason), - "%s %s\n", - recoveryStopAfter ? "after" : "before", - timestamptz_to_str(recoveryStopTime)); - else if (recoveryTarget == RECOVERY_TARGET_LSN) - snprintf(reason, sizeof(reason), - "%s LSN %X/%X\n", - recoveryStopAfter ? "after" : "before", - LSN_FORMAT_ARGS(recoveryStopLSN)); - else if (recoveryTarget == RECOVERY_TARGET_NAME) - snprintf(reason, sizeof(reason), - "at restore point \"%s\"", - recoveryStopName); - else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) - snprintf(reason, sizeof(reason), "reached consistency"); - else - snprintf(reason, sizeof(reason), "no recovery target specified"); + if (reset) + set_ps_display(""); + else + { + char activitymsg[128]; - /* - * We are now done reading the old WAL. Turn off archive fetching if - * it was active, and make a writable copy of the last WAL segment. - * (Note that we also have a copy of the last block of the old WAL in - * readBuf; we will use that below.) - */ - exitArchiveRecovery(EndOfLogTLI, EndOfLog); + snprintf(activitymsg, sizeof(activitymsg), "performing %s%s%s", + (flags & CHECKPOINT_END_OF_RECOVERY) ? "end-of-recovery " : "", + (flags & CHECKPOINT_IS_SHUTDOWN) ? "shutdown " : "", + restartpoint ? "restartpoint" : "checkpoint"); + set_ps_display(activitymsg); + } +} - /* - * Write the timeline history file, and have it archived. After this - * point (or rather, as soon as the file is archived), the timeline - * will appear as "taken" in the WAL archive and to any standby - * servers. If we crash before actually switching to the new - * timeline, standby servers will nevertheless think that we switched - * to the new timeline, and will try to connect to the new timeline. - * To minimize the window for that, try to do as little as possible - * between here and writing the end-of-recovery record. - */ - writeTimeLineHistory(ThisTimeLineID, recoveryTargetTLI, - EndRecPtr, reason); - /* - * Since there might be a partial WAL segment named RECOVERYXLOG, get - * rid of it. - */ - snprintf(recoveryPath, MAXPGPATH, XLOGDIR "/RECOVERYXLOG"); - unlink(recoveryPath); /* ignore any error */ +/* + * Perform a checkpoint --- either during shutdown, or on-the-fly + * + * flags is a bitwise OR of the following: + * CHECKPOINT_IS_SHUTDOWN: checkpoint is for database shutdown. + * CHECKPOINT_END_OF_RECOVERY: checkpoint is for end of WAL recovery. + * CHECKPOINT_IMMEDIATE: finish the checkpoint ASAP, + * ignoring checkpoint_completion_target parameter. + * CHECKPOINT_FORCE: force a checkpoint even if no XLOG activity has occurred + * since the last one (implied by CHECKPOINT_IS_SHUTDOWN or + * CHECKPOINT_END_OF_RECOVERY). + * CHECKPOINT_FLUSH_ALL: also flush buffers of unlogged tables. + * + * Note: flags contains other bits, of interest here only for logging purposes. + * In particular note that this routine is synchronous and does not pay + * attention to CHECKPOINT_WAIT. + * + * If !shutdown then we are writing an online checkpoint. This is a very special + * kind of operation and WAL record because the checkpoint action occurs over + * a period of time yet logically occurs at just a single LSN. The logical + * position of the WAL record (redo ptr) is the same or earlier than the + * physical position. When we replay WAL we locate the checkpoint via its + * physical position then read the redo ptr and actually start replay at the + * earlier logical position. Note that we don't write *anything* to WAL at + * the logical position, so that location could be any other kind of WAL record. + * All of this mechanism allows us to continue working while we checkpoint. + * As a result, timing of actions is critical here and be careful to note that + * this function will likely take minutes to execute on a busy system. + */ +void +CreateCheckPoint(int flags) +{ + bool shutdown; + CheckPoint checkPoint; + XLogRecPtr recptr; + XLogSegNo _logSegNo; + XLogCtlInsert *Insert = &XLogCtl->Insert; + uint32 freespace; + XLogRecPtr PriorRedoPtr; + XLogRecPtr curInsert; + XLogRecPtr last_important_lsn; + VirtualTransactionId *vxids; + int nvxids; + int oldXLogAllowed = 0; - /* Get rid of any remaining recovered timeline-history file, too */ - snprintf(recoveryPath, MAXPGPATH, XLOGDIR "/RECOVERYHISTORY"); - unlink(recoveryPath); /* ignore any error */ - } + /* + * An end-of-recovery checkpoint is really a shutdown checkpoint, just + * issued at a different time. + */ + if (flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY)) + shutdown = true; + else + shutdown = false; - /* Save the selected TimeLineID in shared memory, too */ - XLogCtl->ThisTimeLineID = ThisTimeLineID; - XLogCtl->PrevTimeLineID = PrevTimeLineID; + /* sanity check */ + if (RecoveryInProgress() && (flags & CHECKPOINT_END_OF_RECOVERY) == 0) + elog(ERROR, "can't create a checkpoint during recovery"); /* - * Actually, if WAL ended in an incomplete record, skip the parts that - * made it through and start writing after the portion that persisted. - * (It's critical to first write an OVERWRITE_CONTRECORD message, which - * we'll do as soon as we're open for writing new WAL.) + * Prepare to accumulate statistics. + * + * Note: because it is possible for log_checkpoints to change while a + * checkpoint proceeds, we always accumulate stats, even if + * log_checkpoints is currently off. */ - if (!XLogRecPtrIsInvalid(missingContrecPtr)) - { - /* - * We should only have a missingContrecPtr if we're not switching to - * a new timeline. When a timeline switch occurs, WAL is copied from - * the old timeline to the new only up to the end of the last complete - * record, so there can't be an incomplete WAL record that we need to - * disregard. - */ - Assert(ThisTimeLineID == PrevTimeLineID); - Assert(!XLogRecPtrIsInvalid(abortedRecPtr)); - EndOfLog = missingContrecPtr; - } + MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); + CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); /* - * Prepare to write WAL starting at EndOfLog location, and init xlog - * buffer cache using the block containing the last record from the - * previous incarnation. + * 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. */ - Insert = &XLogCtl->Insert; - Insert->PrevBytePos = XLogRecPtrToBytePos(LastRec); - Insert->CurrBytePos = XLogRecPtrToBytePos(EndOfLog); + SyncPreCheckpoint(); /* - * Tricky point here: readBuf contains the *last* block that the LastRec - * record spans, not the one it starts in. The last block is indeed the - * one we want to use. + * Use a critical section to force system panic if we have trouble. */ - if (EndOfLog % XLOG_BLCKSZ != 0) - { - char *page; - int len; - int firstIdx; - XLogRecPtr pageBeginPtr; - - pageBeginPtr = EndOfLog - (EndOfLog % XLOG_BLCKSZ); - Assert(readOff == XLogSegmentOffset(pageBeginPtr, wal_segment_size)); - - firstIdx = XLogRecPtrToBufIdx(EndOfLog); - - /* Copy the valid part of the last block, and zero the rest */ - page = &XLogCtl->pages[firstIdx * XLOG_BLCKSZ]; - len = EndOfLog % XLOG_BLCKSZ; - memcpy(page, xlogreader->readBuf, len); - memset(page + len, 0, XLOG_BLCKSZ - len); + START_CRIT_SECTION(); - XLogCtl->xlblocks[firstIdx] = pageBeginPtr + XLOG_BLCKSZ; - XLogCtl->InitializedUpTo = pageBeginPtr + XLOG_BLCKSZ; - } - else + if (shutdown) { - /* - * There is no partial block to copy. Just set InitializedUpTo, and - * let the first attempt to insert a log record to initialize the next - * buffer. - */ - XLogCtl->InitializedUpTo = EndOfLog; + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = DB_SHUTDOWNING; + UpdateControlFile(); + LWLockRelease(ControlFileLock); } - LogwrtResult.Write = LogwrtResult.Flush = EndOfLog; - - XLogCtl->LogwrtResult = LogwrtResult; - - XLogCtl->LogwrtRqst.Write = EndOfLog; - XLogCtl->LogwrtRqst.Flush = EndOfLog; + /* Begin filling in the checkpoint WAL record */ + MemSet(&checkPoint, 0, sizeof(checkPoint)); + checkPoint.time = (pg_time_t) time(NULL); - LocalSetXLogInsertAllowed(); + /* + * For Hot Standby, derive the oldestActiveXid before we fix the redo + * pointer. This allows us to begin accumulating changes to assemble our + * starting snapshot of locks and transactions. + */ + if (!shutdown && XLogStandbyInfoActive()) + checkPoint.oldestActiveXid = GetOldestActiveTransactionId(); + else + checkPoint.oldestActiveXid = InvalidTransactionId; - /* If necessary, write overwrite-contrecord before doing anything else */ - if (!XLogRecPtrIsInvalid(abortedRecPtr)) - { - Assert(!XLogRecPtrIsInvalid(missingContrecPtr)); - CreateOverwriteContrecordRecord(abortedRecPtr); - abortedRecPtr = InvalidXLogRecPtr; - missingContrecPtr = InvalidXLogRecPtr; - } + /* + * Get location of last important record before acquiring insert locks (as + * GetLastImportantRecPtr() also locks WAL locks). + */ + last_important_lsn = GetLastImportantRecPtr(); /* - * Update full_page_writes in shared memory and write an XLOG_FPW_CHANGE - * record before resource manager writes cleanup WAL records or checkpoint - * record is written. + * We must block concurrent insertions while examining insert state to + * determine the checkpoint REDO pointer. */ - Insert->fullPageWrites = lastFullPageWrites; - UpdateFullPageWrites(); - LocalXLogInsertAllowed = -1; + WALInsertLockAcquireExclusive(); + curInsert = XLogBytePosToRecPtr(Insert->CurrBytePos); - if (InRecovery) + /* + * If this isn't a shutdown or forced checkpoint, and if there has been no + * WAL activity requiring a checkpoint, skip it. The idea here is to + * avoid inserting duplicate checkpoints when the system is idle. + */ + if ((flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY | + CHECKPOINT_FORCE)) == 0) { - /* - * Perform a checkpoint to update all our recovery activity to disk. - * - * Note that we write a shutdown checkpoint rather than an on-line - * one. This is not particularly critical, but since we may be - * assigning a new TLI, using a shutdown checkpoint allows us to have - * the rule that TLI only changes in shutdown checkpoints, which - * allows some extra error checking in xlog_redo. - * - * In promotion, only create a lightweight end-of-recovery record - * instead of a full checkpoint. A checkpoint is requested later, - * after we're fully out of recovery mode and already accepting - * queries. - */ - if (bgwriterLaunched) + if (last_important_lsn == ControlFile->checkPoint) { - if (LocalPromoteIsTriggered) - { - checkPointLoc = ControlFile->checkPoint; - - /* - * Confirm the last checkpoint is available for us to recover - * from if we fail. - */ - record = ReadCheckpointRecord(xlogreader, checkPointLoc, 1, false); - if (record != NULL) - { - promoted = true; - - /* - * Insert a special WAL record to mark the end of - * recovery, since we aren't doing a checkpoint. That - * means that the checkpointer process may likely be in - * the middle of a time-smoothed restartpoint and could - * continue to be for minutes after this. That sounds - * strange, but the effect is roughly the same and it - * would be stranger to try to come out of the - * restartpoint and then checkpoint. We request a - * checkpoint later anyway, just for safety. - */ - CreateEndOfRecoveryRecord(); - } - } - - if (!promoted) - RequestCheckpoint(CHECKPOINT_END_OF_RECOVERY | - CHECKPOINT_IMMEDIATE | - CHECKPOINT_WAIT); + WALInsertLockRelease(); + END_CRIT_SECTION(); + ereport(DEBUG1, + (errmsg_internal("checkpoint skipped because system is idle"))); + return; } - else - CreateCheckPoint(CHECKPOINT_END_OF_RECOVERY | CHECKPOINT_IMMEDIATE); } /* - * Preallocate additional log files, if wanted. - */ - PreallocXlogFiles(EndOfLog); - - /* - * Okay, we're officially UP. + * An end-of-recovery checkpoint is created before anyone is allowed to + * write WAL. To allow us to write the checkpoint record, temporarily + * enable XLogInsertAllowed. */ - InRecovery = false; + if (flags & CHECKPOINT_END_OF_RECOVERY) + oldXLogAllowed = LocalSetXLogInsertAllowed(); - /* start the archive_timeout timer and LSN running */ - XLogCtl->lastSegSwitchTime = (pg_time_t) time(NULL); - XLogCtl->lastSegSwitchLSN = EndOfLog; + checkPoint.ThisTimeLineID = XLogCtl->InsertTimeLineID; + if (flags & CHECKPOINT_END_OF_RECOVERY) + checkPoint.PrevTimeLineID = XLogCtl->PrevTimeLineID; + else + checkPoint.PrevTimeLineID = checkPoint.ThisTimeLineID; - /* also initialize latestCompletedXid, to nextXid - 1 */ - LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); - ShmemVariableCache->latestCompletedXid = ShmemVariableCache->nextXid; - FullTransactionIdRetreat(&ShmemVariableCache->latestCompletedXid); - LWLockRelease(ProcArrayLock); + checkPoint.fullPageWrites = Insert->fullPageWrites; /* - * Start up subtrans, if not already done for hot standby. (commit - * timestamps are started below, if necessary.) + * Compute new REDO record ptr = location of next XLOG record. + * + * NB: this is NOT necessarily where the checkpoint record itself will be, + * since other backends may insert more XLOG records while we're off doing + * the buffer flush work. Those XLOG records are logically after the + * checkpoint, even though physically before it. Got that? */ - if (standbyState == STANDBY_DISABLED) - StartupSUBTRANS(oldestActiveXID); + freespace = INSERT_FREESPACE(curInsert); + if (freespace == 0) + { + if (XLogSegmentOffset(curInsert, wal_segment_size) == 0) + curInsert += SizeOfXLogLongPHD; + else + curInsert += SizeOfXLogShortPHD; + } + checkPoint.redo = curInsert; /* - * Perform end of recovery actions for any SLRUs that need it. + * Here we update the shared RedoRecPtr for future XLogInsert calls; this + * must be done while holding all the insertion locks. + * + * Note: if we fail to complete the checkpoint, RedoRecPtr will be left + * pointing past where it really needs to point. This is okay; the only + * consequence is that XLogInsert might back up whole buffers that it + * didn't really need to. We can't postpone advancing RedoRecPtr because + * XLogInserts that happen while we are dumping buffers must assume that + * their buffer changes are not included in the checkpoint. */ - TrimCLOG(); - TrimMultiXact(); + RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; /* - * Reload shared-memory state for prepared transactions. This needs to - * happen before renaming the last partial segment of the old timeline as - * it may be possible that we have to recovery some transactions from it. + * Now we can release the WAL insertion locks, allowing other xacts to + * proceed while we are flushing disk buffers. */ - RecoverPreparedTransactions(); + WALInsertLockRelease(); - /* Shut down xlogreader */ - if (readFile >= 0) - { - close(readFile); - readFile = -1; - } - XLogReaderFree(xlogreader); + /* Update the info_lck-protected copy of RedoRecPtr as well */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->RedoRecPtr = checkPoint.redo; + SpinLockRelease(&XLogCtl->info_lck); /* - * If any of the critical GUCs have changed, log them before we allow - * backends to write WAL. + * If enabled, log checkpoint start. We postpone this until now so as not + * to log anything if we decided to skip the checkpoint. */ - LocalSetXLogInsertAllowed(); - XLogReportParameters(); - - if (ArchiveRecoveryRequested) - { - /* - * And finally, execute the recovery_end_command, if any. - */ - if (recoveryEndCommand && strcmp(recoveryEndCommand, "") != 0) - ExecuteRecoveryCommand(recoveryEndCommand, - "recovery_end_command", - true); - - /* - * We switched to a new timeline. Clean up segments on the old - * timeline. - * - * If there are any higher-numbered segments on the old timeline, - * remove them. They might contain valid WAL, but they might also be - * pre-allocated files containing garbage. In any case, they are not - * part of the new timeline's history so we don't need them. - */ - RemoveNonParentXlogFiles(EndOfLog, ThisTimeLineID); + if (log_checkpoints) + LogCheckpointStart(flags, false); - /* - * If the switch happened in the middle of a segment, what to do with - * the last, partial segment on the old timeline? If we don't archive - * it, and the server that created the WAL never archives it either - * (e.g. because it was hit by a meteor), it will never make it to the - * archive. That's OK from our point of view, because the new segment - * that we created with the new TLI contains all the WAL from the old - * timeline up to the switch point. But if you later try to do PITR to - * the "missing" WAL on the old timeline, recovery won't find it in - * the archive. It's physically present in the new file with new TLI, - * but recovery won't look there when it's recovering to the older - * timeline. On the other hand, if we archive the partial segment, and - * the original server on that timeline is still running and archives - * the completed version of the same segment later, it will fail. (We - * used to do that in 9.4 and below, and it caused such problems). - * - * As a compromise, we rename the last segment with the .partial - * suffix, and archive it. Archive recovery will never try to read - * .partial segments, so they will normally go unused. But in the odd - * PITR case, the administrator can copy them manually to the pg_wal - * directory (removing the suffix). They can be useful in debugging, - * too. - * - * If a .done or .ready file already exists for the old timeline, - * however, we had already determined that the segment is complete, so - * we can let it be archived normally. (In particular, if it was - * restored from the archive to begin with, it's expected to have a - * .done file). - */ - if (XLogSegmentOffset(EndOfLog, wal_segment_size) != 0 && - XLogArchivingActive()) - { - char origfname[MAXFNAMELEN]; - XLogSegNo endLogSegNo; + /* Update the process title */ + update_checkpoint_display(flags, false, false); - XLByteToPrevSeg(EndOfLog, endLogSegNo, wal_segment_size); - XLogFileName(origfname, EndOfLogTLI, endLogSegNo, wal_segment_size); + TRACE_POSTGRESQL_CHECKPOINT_START(flags); - if (!XLogArchiveIsReadyOrDone(origfname)) - { - char origpath[MAXPGPATH]; - char partialfname[MAXFNAMELEN]; - char partialpath[MAXPGPATH]; + /* + * Get the other info we need for the checkpoint record. + * + * We don't need to save oldestClogXid in the checkpoint, it only matters + * for the short period in which clog is being truncated, and if we crash + * during that we'll redo the clog truncation and fix up oldestClogXid + * there. + */ + LWLockAcquire(XidGenLock, LW_SHARED); + checkPoint.nextXid = ShmemVariableCache->nextXid; + checkPoint.oldestXid = ShmemVariableCache->oldestXid; + checkPoint.oldestXidDB = ShmemVariableCache->oldestXidDB; + LWLockRelease(XidGenLock); - XLogFilePath(origpath, EndOfLogTLI, endLogSegNo, wal_segment_size); - snprintf(partialfname, MAXFNAMELEN, "%s.partial", origfname); - snprintf(partialpath, MAXPGPATH, "%s.partial", origpath); + LWLockAcquire(CommitTsLock, LW_SHARED); + checkPoint.oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; + checkPoint.newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; + LWLockRelease(CommitTsLock); - /* - * Make sure there's no .done or .ready file for the .partial - * file. - */ - XLogArchiveCleanup(partialfname); + LWLockAcquire(OidGenLock, LW_SHARED); + checkPoint.nextOid = ShmemVariableCache->nextOid; + if (!shutdown) + checkPoint.nextOid += ShmemVariableCache->oidCount; + LWLockRelease(OidGenLock); - durable_rename(origpath, partialpath, ERROR); - XLogArchiveNotify(partialfname); - } - } - } + MultiXactGetCheckptMulti(shutdown, + &checkPoint.nextMulti, + &checkPoint.nextMultiOffset, + &checkPoint.oldestMulti, + &checkPoint.oldestMultiDB); /* - * Local WAL inserts enabled, so it's time to finish initialization of - * commit timestamp. + * Having constructed the checkpoint record, ensure all shmem disk buffers + * and commit-log buffers are flushed to disk. + * + * This I/O could fail for various reasons. If so, we will fail to + * complete the checkpoint, but there is no reason to force a system + * panic. Accordingly, exit critical section while doing it. */ - CompleteCommitTsInitialization(); + END_CRIT_SECTION(); /* - * All done with end-of-recovery actions. + * In some cases there are groups of actions that must all occur on one + * side or the other of a checkpoint record. Before flushing the + * checkpoint record we must explicitly wait for any backend currently + * performing those groups of actions. * - * Now allow backends to write WAL and update the control file status in - * consequence. SharedRecoveryState, that controls if backends can write - * WAL, is updated while holding ControlFileLock to prevent other backends - * to look at an inconsistent state of the control file in shared memory. - * There is still a small window during which backends can write WAL and - * the control file is still referring to a system not in DB_IN_PRODUCTION - * state while looking at the on-disk control file. + * One example is end of transaction, so we must wait for any transactions + * that are currently in commit critical sections. If an xact inserted + * its commit record into XLOG just before the REDO point, then a crash + * restart from the REDO point would not replay that record, which means + * that our flushing had better include the xact's update of pg_xact. So + * we wait till he's out of his commit critical section before proceeding. + * See notes in RecordTransactionCommit(). * - * Also, we use info_lck to update SharedRecoveryState to ensure that - * there are no race conditions concerning visibility of other recent - * updates to shared memory. + * Because we've already released the insertion locks, this test is a bit + * fuzzy: it is possible that we will wait for xacts we didn't really need + * to wait for. But the delay should be short and it seems better to make + * checkpoint take a bit longer than to hold off insertions longer than + * necessary. (In fact, the whole reason we have this issue is that xact.c + * does commit record XLOG insertion and clog update as two separate steps + * protected by different locks, but again that seems best on grounds of + * minimizing lock contention.) + * + * 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. */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_IN_PRODUCTION; - ControlFile->time = (pg_time_t) time(NULL); + vxids = GetVirtualXIDsDelayingChkpt(&nvxids, DELAY_CHKPT_START); + if (nvxids > 0) + { + do + { + pg_usleep(10000L); /* wait for 10 msec */ + } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids, + DELAY_CHKPT_START)); + } + pfree(vxids); - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedRecoveryState = RECOVERY_STATE_DONE; - SpinLockRelease(&XLogCtl->info_lck); + CheckPointGuts(checkPoint.redo, flags); - UpdateControlFile(); - LWLockRelease(ControlFileLock); + 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); /* - * Shutdown the recovery environment. This must occur after - * RecoverPreparedTransactions() (see notes in lock_twophase_recover()) - * and after switching SharedRecoveryState to RECOVERY_STATE_DONE so as - * any session building a snapshot will not rely on KnownAssignedXids as - * RecoveryInProgress() would return false at this stage. This is - * particularly critical for prepared 2PC transactions, that would still - * need to be included in snapshots once recovery has ended. + * Take a snapshot of running transactions and write this to WAL. This + * allows us to reconstruct the state of running transactions during + * archive recovery, if required. Skip, if this info disabled. + * + * If we are shutting down, or Startup process is completing crash + * recovery we don't need to write running xact data. */ - if (standbyState != STANDBY_DISABLED) - ShutdownRecoveryTransactionEnvironment(); + if (!shutdown && XLogStandbyInfoActive()) + LogStandbySnapshot(); - /* - * If there were cascading standby servers connected to us, nudge any wal - * sender processes to notice that we've been promoted. - */ - WalSndWakeup(); + START_CRIT_SECTION(); /* - * If this was a promotion, request an (online) checkpoint now. This isn't - * required for consistency, but the last restartpoint might be far back, - * and in case of a crash, recovering from it might take a longer than is - * appropriate now that we're not in standby mode anymore. + * Now insert the checkpoint record into XLOG. */ - if (promoted) - RequestCheckpoint(CHECKPOINT_FORCE); -} + XLogBeginInsert(); + XLogRegisterData((char *) (&checkPoint), sizeof(checkPoint)); + recptr = XLogInsert(RM_XLOG_ID, + shutdown ? XLOG_CHECKPOINT_SHUTDOWN : + XLOG_CHECKPOINT_ONLINE); -/* - * Verify that, in non-test mode, ./pg_tblspc doesn't contain any real - * directories. - * - * Replay of database creation XLOG records for databases that were later - * dropped can create fake directories in pg_tblspc. By the time consistency - * is reached these directories should have been removed; here we verify - * that this did indeed happen. This is to be called at the point where - * consistent state is reached. - * - * allow_in_place_tablespaces turns the PANIC into a WARNING, which is - * useful for testing purposes, and also allows for an escape hatch in case - * things go south. - */ -static void -CheckTablespaceDirectory(void) -{ - DIR *dir; - struct dirent *de; + XLogFlush(recptr); - dir = AllocateDir("pg_tblspc"); - while ((de = ReadDir(dir, "pg_tblspc")) != NULL) + /* + * We mustn't write any new WAL after a shutdown checkpoint, or it will be + * overwritten at next startup. No-one should even try, this just allows + * sanity-checking. In the case of an end-of-recovery checkpoint, we want + * to just temporarily disable writing until the system has exited + * recovery. + */ + if (shutdown) { - char path[MAXPGPATH + 10]; - - /* Skip entries of non-oid names */ - if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) - continue; - - snprintf(path, sizeof(path), "pg_tblspc/%s", de->d_name); - - if (get_dirent_type(path, de, false, ERROR) != PGFILETYPE_LNK) - ereport(allow_in_place_tablespaces ? WARNING : PANIC, - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("unexpected directory entry \"%s\" found in %s", - de->d_name, "pg_tblspc/"), - errdetail("All directory entries in pg_tblspc/ should be symbolic links."), - errhint("Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete."))); + if (flags & CHECKPOINT_END_OF_RECOVERY) + LocalXLogInsertAllowed = oldXLogAllowed; + else + LocalXLogInsertAllowed = 0; /* never again write WAL */ } -} - -/* - * Checks if recovery has reached a consistent state. When consistency is - * reached and we have a valid starting standby snapshot, tell postmaster - * that it can start accepting read-only connections. - */ -static void -CheckRecoveryConsistency(void) -{ - XLogRecPtr lastReplayedEndRecPtr; /* - * During crash recovery, we don't reach a consistent state until we've - * replayed all the WAL. + * We now have ProcLastRecPtr = start of actual checkpoint record, recptr + * = end of actual checkpoint record. */ - if (XLogRecPtrIsInvalid(minRecoveryPoint)) - return; + if (shutdown && checkPoint.redo != ProcLastRecPtr) + ereport(PANIC, + (errmsg("concurrent write-ahead log activity while database system is shutting down"))); - Assert(InArchiveRecovery); + /* + * Remember the prior checkpoint's redo ptr for + * UpdateCheckPointDistanceEstimate() + */ + PriorRedoPtr = ControlFile->checkPointCopy.redo; /* - * assume that we are called in the startup process, and hence don't need - * a lock to read lastReplayedEndRecPtr + * Update the control file. */ - lastReplayedEndRecPtr = XLogCtl->lastReplayedEndRecPtr; + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + if (shutdown) + ControlFile->state = DB_SHUTDOWNED; + ControlFile->checkPoint = ProcLastRecPtr; + ControlFile->checkPointCopy = checkPoint; + /* crash recovery should always recover to the end of WAL */ + ControlFile->minRecoveryPoint = InvalidXLogRecPtr; + ControlFile->minRecoveryPointTLI = 0; /* - * Have we reached the point where our base backup was completed? + * Persist unloggedLSN value. It's reset on crash recovery, so this goes + * unused on non-shutdown checkpoints, but seems useful to store it always + * for debugging purposes. */ - if (!XLogRecPtrIsInvalid(ControlFile->backupEndPoint) && - ControlFile->backupEndPoint <= lastReplayedEndRecPtr) - { - /* - * We have reached the end of base backup, as indicated by pg_control. - * The data on disk is now consistent. Reset backupStartPoint and - * backupEndPoint, and update minRecoveryPoint to make sure we don't - * allow starting up at an earlier point even if recovery is stopped - * and restarted soon after this. - */ - elog(DEBUG1, "end of backup reached"); + SpinLockAcquire(&XLogCtl->ulsn_lck); + ControlFile->unloggedLSN = XLogCtl->unloggedLSN; + SpinLockRelease(&XLogCtl->ulsn_lck); - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + UpdateControlFile(); + LWLockRelease(ControlFileLock); - if (ControlFile->minRecoveryPoint < lastReplayedEndRecPtr) - ControlFile->minRecoveryPoint = lastReplayedEndRecPtr; + /* Update shared-memory copy of checkpoint XID/epoch */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->ckptFullXid = checkPoint.nextXid; + SpinLockRelease(&XLogCtl->info_lck); - ControlFile->backupStartPoint = InvalidXLogRecPtr; - ControlFile->backupEndPoint = InvalidXLogRecPtr; - ControlFile->backupEndRequired = false; - UpdateControlFile(); + /* + * We are now done with critical updates; no need for system panic if we + * have trouble while fooling with old log segments. + */ + END_CRIT_SECTION(); - LWLockRelease(ControlFileLock); - } + /* + * Let smgr do post-checkpoint cleanup (eg, deleting old files). + */ + SyncPostCheckpoint(); /* - * Have we passed our safe starting point? Note that minRecoveryPoint is - * known to be incorrectly set if ControlFile->backupEndRequired, 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. + * Update the average distance between checkpoints if the prior checkpoint + * exists. */ - if (!reachedConsistency && !ControlFile->backupEndRequired && - minRecoveryPoint <= lastReplayedEndRecPtr && - XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) - { - /* - * Check to see if the XLOG sequence contained any unresolved - * references to uninitialized pages. - */ - XLogCheckInvalidPages(); + if (PriorRedoPtr != InvalidXLogRecPtr) + UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr); + /* + * Delete old log files, those no longer needed for last checkpoint to + * prevent the disk holding the xlog from growing full. + */ + XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); + KeepLogSeg(recptr, &_logSegNo); + if (InvalidateObsoleteReplicationSlots(_logSegNo)) + { /* - * Check that pg_tblspc doesn't contain any real directories. Replay - * of Database/CREATE_* records may have created ficticious tablespace - * directories that should have been removed by the time consistency - * was reached. + * Some slots have been invalidated; recalculate the old-segment + * horizon, starting again from RedoRecPtr. */ - CheckTablespaceDirectory(); - - reachedConsistency = true; - ereport(LOG, - (errmsg("consistent recovery state reached at %X/%X", - LSN_FORMAT_ARGS(lastReplayedEndRecPtr)))); + XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); + KeepLogSeg(recptr, &_logSegNo); } + _logSegNo--; + RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr, + checkPoint.ThisTimeLineID); /* - * Have we got a valid starting snapshot that will allow queries to be - * run? If so, we can tell postmaster that the database is consistent now, - * enabling connections. + * Make more log segments if needed. (Do this after recycling old log + * segments, since that may supply some of the needed files.) */ - if (standbyState == STANDBY_SNAPSHOT_READY && - !LocalHotStandbyActive && - reachedConsistency && - IsUnderPostmaster) - { - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedHotStandbyActive = true; - SpinLockRelease(&XLogCtl->info_lck); - - LocalHotStandbyActive = true; - - SendPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY); - } -} + if (!shutdown) + PreallocXlogFiles(recptr, checkPoint.ThisTimeLineID); -/* - * Is the system still in recovery? - * - * Unlike testing InRecovery, this works in any process that's connected to - * shared memory. - * - * As a side-effect, we initialize the local TimeLineID and RedoRecPtr - * variables the first time we see that recovery is finished. - */ -bool -RecoveryInProgress(void) -{ /* - * We check shared state each time only until we leave recovery mode. We - * can't re-enter recovery, so there's no need to keep checking after the - * shared variable has once been seen false. + * Truncate pg_subtrans if possible. We can throw away all data before + * the oldest XMIN of any running transaction. No future transaction will + * attempt to reference any pg_subtrans entry older than that (see Asserts + * in subtrans.c). During recovery, though, we mustn't do this because + * StartupSUBTRANS hasn't been called yet. */ - if (!LocalRecoveryInProgress) - return false; - else - { - /* - * use volatile pointer to make sure we make a fresh read of the - * shared variable. - */ - volatile XLogCtlData *xlogctl = XLogCtl; - - LocalRecoveryInProgress = (xlogctl->SharedRecoveryState != RECOVERY_STATE_DONE); + if (!RecoveryInProgress()) + TruncateSUBTRANS(GetOldestTransactionIdConsideredRunning()); - /* - * Initialize TimeLineID and RedoRecPtr when we discover that recovery - * is finished. InitPostgres() relies upon this behaviour to ensure - * that InitXLOGAccess() is called at backend startup. (If you change - * this, see also LocalSetXLogInsertAllowed.) - */ - if (!LocalRecoveryInProgress) - { - /* - * If we just exited recovery, make sure we read TimeLineID and - * RedoRecPtr after SharedRecoveryState (for machines with weak - * memory ordering). - */ - pg_memory_barrier(); - InitXLOGAccess(); - } + /* Real work is done; log and update stats. */ + LogCheckpointEnd(false); - /* - * Note: We don't need a memory barrier when we're still in recovery. - * We might exit recovery immediately after return, so the caller - * can't rely on 'true' meaning that we're still in recovery anyway. - */ + /* Reset the process title */ + update_checkpoint_display(flags, false, true); - return LocalRecoveryInProgress; - } + TRACE_POSTGRESQL_CHECKPOINT_DONE(CheckpointStats.ckpt_bufs_written, + NBuffers, + CheckpointStats.ckpt_segs_added, + CheckpointStats.ckpt_segs_removed, + CheckpointStats.ckpt_segs_recycled); } /* - * Returns current recovery state from shared memory. + * Mark the end of recovery in WAL though without running a full checkpoint. + * We can expect that a restartpoint is likely to be in progress as we + * do this, though we are unwilling to wait for it to complete. * - * This returned state is kept consistent with the contents of the control - * file. See details about the possible values of RecoveryState in xlog.h. + * CreateRestartPoint() allows for the case where recovery may end before + * the restartpoint completes so there is no concern of concurrent behaviour. */ -RecoveryState -GetRecoveryState(void) +static void +CreateEndOfRecoveryRecord(void) { - RecoveryState retval; + xl_end_of_recovery xlrec; + XLogRecPtr recptr; - SpinLockAcquire(&XLogCtl->info_lck); - retval = XLogCtl->SharedRecoveryState; - SpinLockRelease(&XLogCtl->info_lck); + /* sanity check */ + if (!RecoveryInProgress()) + elog(ERROR, "can only be used to end recovery"); - return retval; -} + xlrec.end_time = GetCurrentTimestamp(); + + WALInsertLockAcquireExclusive(); + xlrec.ThisTimeLineID = XLogCtl->InsertTimeLineID; + xlrec.PrevTimeLineID = XLogCtl->PrevTimeLineID; + WALInsertLockRelease(); + + START_CRIT_SECTION(); + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(xl_end_of_recovery)); + recptr = XLogInsert(RM_XLOG_ID, XLOG_END_OF_RECOVERY); + + XLogFlush(recptr); -/* - * Is HotStandby active yet? This is only important in special backends - * since normal backends won't ever be able to connect until this returns - * true. Postmaster knows this by way of signal, not via shared memory. - * - * Unlike testing standbyState, this works in any process that's connected to - * shared memory. (And note that standbyState alone doesn't tell the truth - * anyway.) - */ -bool -HotStandbyActive(void) -{ /* - * We check shared state each time only until Hot Standby is active. We - * can't de-activate Hot Standby, so there's no need to keep checking - * after the shared variable has once been seen true. + * Update the control file so that crash recovery can follow the timeline + * changes to this point. */ - if (LocalHotStandbyActive) - return true; - else - { - /* spinlock is essential on machines with weak memory ordering! */ - SpinLockAcquire(&XLogCtl->info_lck); - LocalHotStandbyActive = XLogCtl->SharedHotStandbyActive; - SpinLockRelease(&XLogCtl->info_lck); - - return LocalHotStandbyActive; - } -} + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->minRecoveryPoint = recptr; + ControlFile->minRecoveryPointTLI = xlrec.ThisTimeLineID; + UpdateControlFile(); + LWLockRelease(ControlFileLock); -/* - * Like HotStandbyActive(), but to be used only in WAL replay code, - * where we don't need to ask any other process what the state is. - */ -bool -HotStandbyActiveInReplay(void) -{ - Assert(AmStartupProcess() || !IsPostmasterEnvironment); - return LocalHotStandbyActive; + END_CRIT_SECTION(); } /* - * Is this process allowed to insert new WAL records? + * Write an OVERWRITE_CONTRECORD message. * - * Ordinarily this is essentially equivalent to !RecoveryInProgress(). - * But we also have provisions for forcing the result "true" or "false" - * within specific processes regardless of the global state. + * When on WAL replay we expect a continuation record at the start of a page + * that is not there, recovery ends and WAL writing resumes at that point. + * But it's wrong to resume writing new WAL back at the start of the record + * that was broken, because downstream consumers of that WAL (physical + * replicas) are not prepared to "rewind". So the first action after + * finishing replay of all valid WAL must be to write a record of this type + * at the point where the contrecord was missing; to support xlogreader + * detecting the special case, XLP_FIRST_IS_OVERWRITE_CONTRECORD is also added + * to the page header where the record occurs. xlogreader has an ad-hoc + * mechanism to report metadata about the broken record, which is what we + * use here. + * + * At replay time, XLP_FIRST_IS_OVERWRITE_CONTRECORD instructs xlogreader to + * skip the record it was reading, and pass back the LSN of the skipped + * record, so that its caller can verify (on "replay" of that record) that the + * XLOG_OVERWRITE_CONTRECORD matches what was effectively overwritten. + * + * 'aborted_lsn' is the beginning position of the record that was incomplete. + * It is included in the WAL record. 'pagePtr' and 'newTLI' point to the + * beginning of the XLOG page where the record is to be inserted. They must + * match the current WAL insert position, they're passed here just so that we + * can verify that. */ -bool -XLogInsertAllowed(void) +static XLogRecPtr +CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr, + TimeLineID newTLI) { - /* - * If value is "unconditionally true" or "unconditionally false", just - * return it. This provides the normal fast path once recovery is known - * done. - */ - if (LocalXLogInsertAllowed >= 0) - return (bool) LocalXLogInsertAllowed; + xl_overwrite_contrecord xlrec; + XLogRecPtr recptr; + XLogPageHeader pagehdr; + XLogRecPtr startPos; + + /* sanity checks */ + if (!RecoveryInProgress()) + elog(ERROR, "can only be used at end of recovery"); + if (pagePtr % XLOG_BLCKSZ != 0) + elog(ERROR, "invalid position for missing continuation record %X/%X", + LSN_FORMAT_ARGS(pagePtr)); + + /* The current WAL insert position should be right after the page header */ + startPos = pagePtr; + if (XLogSegmentOffset(startPos, wal_segment_size) == 0) + startPos += SizeOfXLogLongPHD; + else + startPos += SizeOfXLogShortPHD; + recptr = GetXLogInsertRecPtr(); + if (recptr != startPos) + elog(ERROR, "invalid WAL insert position %X/%X for OVERWRITE_CONTRECORD", + LSN_FORMAT_ARGS(recptr)); + + START_CRIT_SECTION(); /* - * Else, must check to see if we're still in recovery. + * Initialize the XLOG page header (by GetXLogBuffer), and set the + * XLP_FIRST_IS_OVERWRITE_CONTRECORD flag. + * + * No other backend is allowed to write WAL yet, so acquiring the WAL + * insertion lock is just pro forma. */ - if (RecoveryInProgress()) - return false; + WALInsertLockAcquire(); + pagehdr = (XLogPageHeader) GetXLogBuffer(pagePtr, newTLI); + pagehdr->xlp_info |= XLP_FIRST_IS_OVERWRITE_CONTRECORD; + WALInsertLockRelease(); /* - * On exit from recovery, reset to "unconditionally true", since there is - * no need to keep checking. + * Insert the XLOG_OVERWRITE_CONTRECORD record as the first record on the + * page. We know it becomes the first record, because no other backend is + * allowed to write WAL yet. */ - LocalXLogInsertAllowed = 1; - return true; -} - -/* - * Make XLogInsertAllowed() return true in the current process only. - * - * Note: it is allowed to switch LocalXLogInsertAllowed back to -1 later, - * and even call LocalSetXLogInsertAllowed() again after that. - */ -static void -LocalSetXLogInsertAllowed(void) -{ - Assert(LocalXLogInsertAllowed == -1); - LocalXLogInsertAllowed = 1; - - /* Initialize as RecoveryInProgress() would do when switching state */ - InitXLOGAccess(); -} - -/* - * Subroutine to try to fetch and validate a prior checkpoint record. - * - * whichChkpt identifies the checkpoint (merely for reporting purposes). - * 1 for "primary", 0 for "other" (backup_label) - */ -static XLogRecord * -ReadCheckpointRecord(XLogReaderState *xlogreader, XLogRecPtr RecPtr, - int whichChkpt, bool report) -{ - XLogRecord *record; - uint8 info; - - if (!XRecOffIsValid(RecPtr)) - { - if (!report) - return NULL; + XLogBeginInsert(); + xlrec.overwritten_lsn = aborted_lsn; + xlrec.overwrite_time = GetCurrentTimestamp(); + XLogRegisterData((char *) &xlrec, sizeof(xl_overwrite_contrecord)); + recptr = XLogInsert(RM_XLOG_ID, XLOG_OVERWRITE_CONTRECORD); - switch (whichChkpt) - { - case 1: - ereport(LOG, - (errmsg("invalid primary checkpoint link in control file"))); - break; - default: - ereport(LOG, - (errmsg("invalid checkpoint link in backup_label file"))); - break; - } - return NULL; - } + /* check that the record was inserted to the right place */ + if (ProcLastRecPtr != startPos) + elog(ERROR, "OVERWRITE_CONTRECORD was inserted to unexpected position %X/%X", + LSN_FORMAT_ARGS(ProcLastRecPtr)); - XLogBeginRead(xlogreader, RecPtr); - record = ReadRecord(xlogreader, LOG, true); + XLogFlush(recptr); - if (record == NULL) - { - if (!report) - return NULL; + END_CRIT_SECTION(); - switch (whichChkpt) - { - case 1: - ereport(LOG, - (errmsg("invalid primary checkpoint record"))); - break; - default: - ereport(LOG, - (errmsg("invalid checkpoint record"))); - break; - } - return NULL; - } - if (record->xl_rmid != RM_XLOG_ID) - { - switch (whichChkpt) - { - case 1: - ereport(LOG, - (errmsg("invalid resource manager ID in primary checkpoint record"))); - break; - default: - ereport(LOG, - (errmsg("invalid resource manager ID in checkpoint record"))); - break; - } - return NULL; - } - info = record->xl_info & ~XLR_INFO_MASK; - if (info != XLOG_CHECKPOINT_SHUTDOWN && - info != XLOG_CHECKPOINT_ONLINE) - { - switch (whichChkpt) - { - case 1: - ereport(LOG, - (errmsg("invalid xl_info in primary checkpoint record"))); - break; - default: - ereport(LOG, - (errmsg("invalid xl_info in checkpoint record"))); - break; - } - return NULL; - } - if (record->xl_tot_len != SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint)) - { - switch (whichChkpt) - { - case 1: - ereport(LOG, - (errmsg("invalid length of primary checkpoint record"))); - break; - default: - ereport(LOG, - (errmsg("invalid length of checkpoint record"))); - break; - } - return NULL; - } - return record; + return recptr; } /* - * This must be called in a backend process before creating WAL records - * (except in a standalone backend, which does StartupXLOG instead). We need - * to initialize the local copies of ThisTimeLineID and RedoRecPtr. + * Flush all data in shared memory to disk, and fsync * - * Note: before Postgres 8.0, we went to some effort to keep the postmaster - * process's copies of ThisTimeLineID and RedoRecPtr valid too. This was - * unnecessary however, since the postmaster itself never touches XLOG anyway. + * This is the common code shared between regular checkpoints and + * recovery restartpoints. */ -void -InitXLOGAccess(void) +static void +CheckPointGuts(XLogRecPtr checkPointRedo, int flags) { - XLogCtlInsert *Insert = &XLogCtl->Insert; - - /* ThisTimeLineID doesn't change so we need no lock to copy it */ - ThisTimeLineID = XLogCtl->ThisTimeLineID; - Assert(ThisTimeLineID != 0 || IsBootstrapProcessingMode()); + CheckPointRelationMap(); + CheckPointReplicationSlots(); + CheckPointSnapBuild(); + CheckPointLogicalRewriteHeap(); + CheckPointReplicationOrigin(); - /* set wal_segment_size */ - wal_segment_size = ControlFile->xlog_seg_size; + /* Write out all dirty data in SLRUs and the main buffer pool */ + TRACE_POSTGRESQL_BUFFER_CHECKPOINT_START(flags); + CheckpointStats.ckpt_write_t = GetCurrentTimestamp(); + CheckPointCLOG(); + CheckPointCommitTs(); + CheckPointSUBTRANS(); + CheckPointMultiXact(); + CheckPointPredicate(); + CheckPointBuffers(flags); - /* Use GetRedoRecPtr to copy the RedoRecPtr safely */ - (void) GetRedoRecPtr(); - /* Also update our copy of doPageWrites. */ - doPageWrites = (Insert->fullPageWrites || Insert->forcePageWrites); + /* Perform all queued up fsyncs */ + TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START(); + CheckpointStats.ckpt_sync_t = GetCurrentTimestamp(); + ProcessSyncRequests(); + CheckpointStats.ckpt_sync_end_t = GetCurrentTimestamp(); + TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE(); - /* Also initialize the working areas for constructing WAL records */ - InitXLogInsert(); + /* We deliberately delay 2PC checkpointing as long as possible */ + CheckPointTwoPhase(checkPointRedo); } /* - * Return the current Redo pointer from shared memory. + * Save a checkpoint for recovery restart if appropriate * - * As a side-effect, the local RedoRecPtr copy is updated. + * This function is called each time a checkpoint record is read from XLOG. + * It must determine whether the checkpoint represents a safe restartpoint or + * not. If so, the checkpoint record is stashed in shared memory so that + * CreateRestartPoint can consult it. (Note that the latter function is + * executed by the checkpointer, while this one will be executed by the + * startup process.) */ -XLogRecPtr -GetRedoRecPtr(void) +static void +RecoveryRestartPoint(const CheckPoint *checkPoint, XLogReaderState *record) { - XLogRecPtr ptr; + /* + * Also refrain from creating a restartpoint if we have seen any + * references to non-existent pages. Restarting recovery from the + * restartpoint would not see the references, so we would lose the + * cross-check that the pages belonged to a relation that was dropped + * later. + */ + if (XLogHaveInvalidPages()) + { + elog(trace_recovery(DEBUG2), + "could not record restart point at %X/%X because there " + "are unresolved references to invalid pages", + LSN_FORMAT_ARGS(checkPoint->redo)); + return; + } /* - * The possibly not up-to-date copy in XlogCtl is enough. Even if we - * grabbed a WAL insertion lock to read the authoritative value in - * Insert->RedoRecPtr, someone might update it just after we've released - * the lock. + * Copy the checkpoint record to shared memory, so that checkpointer can + * work out the next time it wants to perform a restartpoint. */ SpinLockAcquire(&XLogCtl->info_lck); - ptr = XLogCtl->RedoRecPtr; + XLogCtl->lastCheckPointRecPtr = record->ReadRecPtr; + XLogCtl->lastCheckPointEndPtr = record->EndRecPtr; + XLogCtl->lastCheckPoint = *checkPoint; SpinLockRelease(&XLogCtl->info_lck); - - if (RedoRecPtr < ptr) - RedoRecPtr = ptr; - - return RedoRecPtr; } /* - * Return information needed to decide whether a modified block needs a - * full-page image to be included in the WAL record. + * Establish a restartpoint if possible. * - * The returned values are cached copies from backend-private memory, and - * possibly out-of-date. XLogInsertRecord will re-check them against - * up-to-date values, while holding the WAL insert lock. - */ -void -GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p) -{ - *RedoRecPtr_p = RedoRecPtr; - *doPageWrites_p = doPageWrites; -} - -/* - * GetInsertRecPtr -- Returns the current insert position. + * This is similar to CreateCheckPoint, but is used during WAL recovery + * to establish a point from which recovery can roll forward without + * replaying the entire recovery log. * - * NOTE: The value *actually* returned is the position of the last full - * xlog page. It lags behind the real insert position by at most 1 page. - * For that, we don't need to scan through WAL insertion locks, and an - * approximation is enough for the current usage of this function. + * Returns true if a new restartpoint was established. We can only establish + * a restartpoint if we have replayed a safe checkpoint record since last + * restartpoint. */ -XLogRecPtr -GetInsertRecPtr(void) +bool +CreateRestartPoint(int flags) { - XLogRecPtr recptr; - - SpinLockAcquire(&XLogCtl->info_lck); - recptr = XLogCtl->LogwrtRqst.Write; - SpinLockRelease(&XLogCtl->info_lck); + XLogRecPtr lastCheckPointRecPtr; + XLogRecPtr lastCheckPointEndPtr; + CheckPoint lastCheckPoint; + XLogRecPtr PriorRedoPtr; + XLogRecPtr receivePtr; + XLogRecPtr replayPtr; + TimeLineID replayTLI; + XLogRecPtr endptr; + XLogSegNo _logSegNo; + TimestampTz xtime; - return recptr; -} + /* Concurrent checkpoint/restartpoint cannot happen */ + Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER); -/* - * GetFlushRecPtr -- Returns the current flush position, ie, the last WAL - * position known to be fsync'd to disk. - */ -XLogRecPtr -GetFlushRecPtr(void) -{ + /* Get a local copy of the last safe checkpoint record. */ SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; + lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr; + lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr; + lastCheckPoint = XLogCtl->lastCheckPoint; SpinLockRelease(&XLogCtl->info_lck); - return LogwrtResult.Flush; -} - -/* - * GetLastImportantRecPtr -- Returns the LSN of the last important record - * inserted. All records not explicitly marked as unimportant are considered - * important. - * - * The LSN is determined by computing the maximum of - * WALInsertLocks[i].lastImportantAt. - */ -XLogRecPtr -GetLastImportantRecPtr(void) -{ - XLogRecPtr res = InvalidXLogRecPtr; - int i; - - for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++) + /* + * Check that we're still in recovery mode. It's ok if we exit recovery + * mode after this check, the restart point is valid anyway. + */ + if (!RecoveryInProgress()) { - XLogRecPtr last_important; - - /* - * Need to take a lock to prevent torn reads of the LSN, which are - * possible on some of the supported platforms. WAL insert locks only - * support exclusive mode, so we have to use that. - */ - LWLockAcquire(&WALInsertLocks[i].l.lock, LW_EXCLUSIVE); - last_important = WALInsertLocks[i].l.lastImportantAt; - LWLockRelease(&WALInsertLocks[i].l.lock); - - if (res < last_important) - res = last_important; + ereport(DEBUG2, + (errmsg_internal("skipping restartpoint, recovery has already ended"))); + return false; } - return res; -} + /* + * If the last checkpoint record we've replayed is already our last + * restartpoint, we can't perform a new restart point. We still update + * minRecoveryPoint in that case, so that if this is a shutdown restart + * point, we won't start up earlier than before. That's not strictly + * necessary, but when hot standby is enabled, it would be rather weird if + * the database opened up for read-only connections at a point-in-time + * before the last shutdown. Such time travel is still possible in case of + * immediate shutdown, though. + * + * We don't explicitly advance minRecoveryPoint when we do create a + * restartpoint. It's assumed that flushing the buffers will do that as a + * side-effect. + */ + if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) || + lastCheckPoint.redo <= ControlFile->checkPointCopy.redo) + { + ereport(DEBUG2, + (errmsg_internal("skipping restartpoint, already performed at %X/%X", + LSN_FORMAT_ARGS(lastCheckPoint.redo)))); -/* - * Get the time and LSN of the last xlog segment switch - */ -pg_time_t -GetLastSegSwitchData(XLogRecPtr *lastSwitchLSN) -{ - pg_time_t result; + UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); + if (flags & CHECKPOINT_IS_SHUTDOWN) + { + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; + UpdateControlFile(); + LWLockRelease(ControlFileLock); + } + return false; + } - /* Need WALWriteLock, but shared lock is sufficient */ - LWLockAcquire(WALWriteLock, LW_SHARED); - result = XLogCtl->lastSegSwitchTime; - *lastSwitchLSN = XLogCtl->lastSegSwitchLSN; - LWLockRelease(WALWriteLock); + /* + * Update the shared RedoRecPtr so that the startup process can calculate + * the number of segments replayed since last restartpoint, and request a + * restartpoint if it exceeds CheckPointSegments. + * + * Like in CreateCheckPoint(), hold off insertions to update it, although + * during recovery this is just pro forma, because no WAL insertions are + * happening. + */ + WALInsertLockAcquireExclusive(); + RedoRecPtr = XLogCtl->Insert.RedoRecPtr = lastCheckPoint.redo; + WALInsertLockRelease(); - return result; -} + /* Also update the info_lck-protected copy */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->RedoRecPtr = lastCheckPoint.redo; + SpinLockRelease(&XLogCtl->info_lck); -/* - * This must be called ONCE during postmaster or standalone-backend shutdown - */ -void -ShutdownXLOG(int code, Datum arg) -{ /* - * We should have an aux process resource owner to use, and we should not - * be in a transaction that's installed some other resowner. + * Prepare to accumulate statistics. + * + * Note: because it is possible for log_checkpoints to change while a + * checkpoint proceeds, we always accumulate stats, even if + * log_checkpoints is currently off. */ - Assert(AuxProcessResourceOwner != NULL); - Assert(CurrentResourceOwner == NULL || - CurrentResourceOwner == AuxProcessResourceOwner); - CurrentResourceOwner = AuxProcessResourceOwner; + MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); + CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); - /* Don't be chatty in standalone mode */ - ereport(IsPostmasterEnvironment ? LOG : NOTICE, - (errmsg("shutting down"))); + if (log_checkpoints) + LogCheckpointStart(flags, true); + + /* Update the process title */ + update_checkpoint_display(flags, true, false); + + CheckPointGuts(lastCheckPoint.redo, flags); /* - * Signal walsenders to move to stopping state. + * Remember the prior checkpoint's redo ptr for + * UpdateCheckPointDistanceEstimate() */ - WalSndInitStopping(); + PriorRedoPtr = ControlFile->checkPointCopy.redo; /* - * Wait for WAL senders to be in stopping state. This prevents commands - * from writing new WAL. + * 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. */ - WalSndWaitStopping(); - - if (RecoveryInProgress()) - CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); - else + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + if (ControlFile->checkPointCopy.redo < lastCheckPoint.redo) { /* - * If archiving is enabled, rotate the last XLOG file so that all the - * remaining records are archived (postmaster wakes up the archiver - * process one more time at the end of shutdown). The checkpoint - * record will go to the next XLOG file and won't be archived (yet). + * 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. */ - if (XLogArchivingActive() && XLogArchiveCommandSet()) - RequestXLogSwitch(false); - - CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); - } -} - -/* - * Log start of a checkpoint. - */ -static void -LogCheckpointStart(int flags, bool restartpoint) -{ - if (restartpoint) - ereport(LOG, - /* translator: the placeholders show checkpoint options */ - (errmsg("restartpoint starting:%s%s%s%s%s%s%s%s", - (flags & CHECKPOINT_IS_SHUTDOWN) ? " shutdown" : "", - (flags & CHECKPOINT_END_OF_RECOVERY) ? " end-of-recovery" : "", - (flags & CHECKPOINT_IMMEDIATE) ? " immediate" : "", - (flags & CHECKPOINT_FORCE) ? " force" : "", - (flags & CHECKPOINT_WAIT) ? " wait" : "", - (flags & CHECKPOINT_CAUSE_XLOG) ? " wal" : "", - (flags & CHECKPOINT_CAUSE_TIME) ? " time" : "", - (flags & CHECKPOINT_FLUSH_ALL) ? " flush-all" : ""))); - else - ereport(LOG, - /* translator: the placeholders show checkpoint options */ - (errmsg("checkpoint starting:%s%s%s%s%s%s%s%s", - (flags & CHECKPOINT_IS_SHUTDOWN) ? " shutdown" : "", - (flags & CHECKPOINT_END_OF_RECOVERY) ? " end-of-recovery" : "", - (flags & CHECKPOINT_IMMEDIATE) ? " immediate" : "", - (flags & CHECKPOINT_FORCE) ? " force" : "", - (flags & CHECKPOINT_WAIT) ? " wait" : "", - (flags & CHECKPOINT_CAUSE_XLOG) ? " wal" : "", - (flags & CHECKPOINT_CAUSE_TIME) ? " time" : "", - (flags & CHECKPOINT_FLUSH_ALL) ? " flush-all" : ""))); -} + ControlFile->checkPoint = lastCheckPointRecPtr; + ControlFile->checkPointCopy = lastCheckPoint; -/* - * Log end of a checkpoint. - */ -static void -LogCheckpointEnd(bool restartpoint) -{ - long write_msecs, - sync_msecs, - total_msecs, - longest_msecs, - average_msecs; - uint64 average_sync_time; + /* + * 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. + */ + if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY) + { + if (ControlFile->minRecoveryPoint < lastCheckPointEndPtr) + { + ControlFile->minRecoveryPoint = lastCheckPointEndPtr; + ControlFile->minRecoveryPointTLI = lastCheckPoint.ThisTimeLineID; - CheckpointStats.ckpt_end_t = GetCurrentTimestamp(); + /* update local copy */ + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + } + if (flags & CHECKPOINT_IS_SHUTDOWN) + ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; + } + UpdateControlFile(); + } + LWLockRelease(ControlFileLock); - write_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_write_t, - CheckpointStats.ckpt_sync_t); + /* + * Update the average distance between checkpoints/restartpoints if the + * prior checkpoint exists. + */ + if (PriorRedoPtr != InvalidXLogRecPtr) + UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr); - sync_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_sync_t, - CheckpointStats.ckpt_sync_end_t); + /* + * Delete old log files, those no longer needed for last restartpoint to + * prevent the disk holding the xlog from growing full. + */ + XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - /* Accumulate checkpoint timing summary data, in milliseconds. */ - BgWriterStats.m_checkpoint_write_time += write_msecs; - BgWriterStats.m_checkpoint_sync_time += sync_msecs; + /* + * Retreat _logSegNo using the current end of xlog replayed or received, + * whichever is later. + */ + receivePtr = GetWalRcvFlushRecPtr(NULL, NULL); + replayPtr = GetXLogReplayRecPtr(&replayTLI); + endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr; + KeepLogSeg(endptr, &_logSegNo); + if (InvalidateObsoleteReplicationSlots(_logSegNo)) + { + /* + * Some slots have been invalidated; recalculate the old-segment + * horizon, starting again from RedoRecPtr. + */ + XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); + KeepLogSeg(endptr, &_logSegNo); + } + _logSegNo--; /* - * All of the published timing statistics are accounted for. Only - * continue if a log message is to be written. + * Try to recycle segments on a useful timeline. If we've been promoted + * since the beginning of this restartpoint, use the new timeline chosen + * at end of recovery. If we're still in recovery, use the timeline we're + * currently replaying. + * + * There is no guarantee that the WAL segments will be useful on the + * current timeline; if recovery proceeds to a new timeline right after + * this, the pre-allocated WAL segments on this timeline will not be used, + * and will go wasted until recycled on the next restartpoint. We'll live + * with that. */ - if (!log_checkpoints) - return; + if (!RecoveryInProgress()) + replayTLI = XLogCtl->InsertTimeLineID; - total_msecs = TimestampDifferenceMilliseconds(CheckpointStats.ckpt_start_t, - CheckpointStats.ckpt_end_t); + RemoveOldXlogFiles(_logSegNo, RedoRecPtr, endptr, replayTLI); /* - * Timing values returned from CheckpointStats are in microseconds. - * Convert to milliseconds for consistent printing. + * Make more log segments if needed. (Do this after recycling old log + * segments, since that may supply some of the needed files.) */ - longest_msecs = (long) ((CheckpointStats.ckpt_longest_sync + 999) / 1000); - - average_sync_time = 0; - if (CheckpointStats.ckpt_sync_rels > 0) - average_sync_time = CheckpointStats.ckpt_agg_sync_time / - CheckpointStats.ckpt_sync_rels; - average_msecs = (long) ((average_sync_time + 999) / 1000); - - if (restartpoint) - ereport(LOG, - (errmsg("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", - CheckpointStats.ckpt_bufs_written, - (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers, - CheckpointStats.ckpt_segs_added, - CheckpointStats.ckpt_segs_removed, - CheckpointStats.ckpt_segs_recycled, - write_msecs / 1000, (int) (write_msecs % 1000), - sync_msecs / 1000, (int) (sync_msecs % 1000), - total_msecs / 1000, (int) (total_msecs % 1000), - CheckpointStats.ckpt_sync_rels, - longest_msecs / 1000, (int) (longest_msecs % 1000), - average_msecs / 1000, (int) (average_msecs % 1000), - (int) (PrevCheckPointDistance / 1024.0), - (int) (CheckPointDistanceEstimate / 1024.0)))); - else - ereport(LOG, - (errmsg("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", - CheckpointStats.ckpt_bufs_written, - (double) CheckpointStats.ckpt_bufs_written * 100 / NBuffers, - CheckpointStats.ckpt_segs_added, - CheckpointStats.ckpt_segs_removed, - CheckpointStats.ckpt_segs_recycled, - write_msecs / 1000, (int) (write_msecs % 1000), - sync_msecs / 1000, (int) (sync_msecs % 1000), - total_msecs / 1000, (int) (total_msecs % 1000), - CheckpointStats.ckpt_sync_rels, - longest_msecs / 1000, (int) (longest_msecs % 1000), - average_msecs / 1000, (int) (average_msecs % 1000), - (int) (PrevCheckPointDistance / 1024.0), - (int) (CheckPointDistanceEstimate / 1024.0)))); -} + PreallocXlogFiles(endptr, replayTLI); -/* - * Update the estimate of distance between checkpoints. - * - * The estimate is used to calculate the number of WAL segments to keep - * preallocated, see XLOGfileslop(). - */ -static void -UpdateCheckPointDistanceEstimate(uint64 nbytes) -{ /* - * To estimate the number of segments consumed between checkpoints, keep a - * moving average of the amount of WAL generated in previous checkpoint - * cycles. However, if the load is bursty, with quiet periods and busy - * periods, we want to cater for the peak load. So instead of a plain - * moving average, let the average decline slowly if the previous cycle - * used less WAL than estimated, but bump it up immediately if it used - * more. - * - * When checkpoints are triggered by max_wal_size, this should converge to - * CheckpointSegments * wal_segment_size, - * - * Note: This doesn't pay any attention to what caused the checkpoint. - * Checkpoints triggered manually with CHECKPOINT command, or by e.g. - * starting a base backup, are counted the same as those created - * automatically. The slow-decline will largely mask them out, if they are - * not frequent. If they are frequent, it seems reasonable to count them - * in as any others; if you issue a manual checkpoint every 5 minutes and - * never let a timed checkpoint happen, it makes sense to base the - * preallocation on that 5 minute interval rather than whatever - * checkpoint_timeout is set to. + * Truncate pg_subtrans if possible. We can throw away all data before + * the oldest XMIN of any running transaction. No future transaction will + * attempt to reference any pg_subtrans entry older than that (see Asserts + * in subtrans.c). When hot standby is disabled, though, we mustn't do + * this because StartupSUBTRANS hasn't been called yet. */ - PrevCheckPointDistance = nbytes; - if (CheckPointDistanceEstimate < nbytes) - CheckPointDistanceEstimate = nbytes; - else - CheckPointDistanceEstimate = - (0.90 * CheckPointDistanceEstimate + 0.10 * (double) nbytes); -} + if (EnableHotStandby) + TruncateSUBTRANS(GetOldestTransactionIdConsideredRunning()); + + /* Real work is done; log and update stats. */ + LogCheckpointEnd(true); + + /* Reset the process title */ + update_checkpoint_display(flags, true, true); + + xtime = GetLatestXTime(); + ereport((log_checkpoints ? LOG : DEBUG2), + (errmsg("recovery restart point at %X/%X", + LSN_FORMAT_ARGS(lastCheckPoint.redo)), + xtime ? errdetail("Last completed transaction was at log time %s.", + timestamptz_to_str(xtime)) : 0)); -/* - * Update the ps display for a process running a checkpoint. Note that - * this routine should not do any allocations so as it can be called - * from a critical section. - */ -static void -update_checkpoint_display(int flags, bool restartpoint, bool reset) -{ /* - * The status is reported only for end-of-recovery and shutdown - * checkpoints or shutdown restartpoints. Updating the ps display is - * useful in those situations as it may not be possible to rely on - * pg_stat_activity to see the status of the checkpointer or the startup - * process. + * Finally, execute archive_cleanup_command, if any. */ - if ((flags & (CHECKPOINT_END_OF_RECOVERY | CHECKPOINT_IS_SHUTDOWN)) == 0) - return; - - if (reset) - set_ps_display(""); - else - { - char activitymsg[128]; + if (archiveCleanupCommand && strcmp(archiveCleanupCommand, "") != 0) + ExecuteRecoveryCommand(archiveCleanupCommand, + "archive_cleanup_command", + false, + WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND); - snprintf(activitymsg, sizeof(activitymsg), "performing %s%s%s", - (flags & CHECKPOINT_END_OF_RECOVERY) ? "end-of-recovery " : "", - (flags & CHECKPOINT_IS_SHUTDOWN) ? "shutdown " : "", - restartpoint ? "restartpoint" : "checkpoint"); - set_ps_display(activitymsg); - } + return true; } - /* - * Perform a checkpoint --- either during shutdown, or on-the-fly + * Report availability of WAL for the given target LSN + * (typically a slot's restart_lsn) * - * flags is a bitwise OR of the following: - * CHECKPOINT_IS_SHUTDOWN: checkpoint is for database shutdown. - * CHECKPOINT_END_OF_RECOVERY: checkpoint is for end of WAL recovery. - * CHECKPOINT_IMMEDIATE: finish the checkpoint ASAP, - * ignoring checkpoint_completion_target parameter. - * CHECKPOINT_FORCE: force a checkpoint even if no XLOG activity has occurred - * since the last one (implied by CHECKPOINT_IS_SHUTDOWN or - * CHECKPOINT_END_OF_RECOVERY). - * CHECKPOINT_FLUSH_ALL: also flush buffers of unlogged tables. + * Returns one of the following enum values: * - * Note: flags contains other bits, of interest here only for logging purposes. - * In particular note that this routine is synchronous and does not pay - * attention to CHECKPOINT_WAIT. + * * WALAVAIL_RESERVED means targetLSN is available and it is in the range of + * max_wal_size. * - * If !shutdown then we are writing an online checkpoint. This is a very special - * kind of operation and WAL record because the checkpoint action occurs over - * a period of time yet logically occurs at just a single LSN. The logical - * position of the WAL record (redo ptr) is the same or earlier than the - * physical position. When we replay WAL we locate the checkpoint via its - * physical position then read the redo ptr and actually start replay at the - * earlier logical position. Note that we don't write *anything* to WAL at - * the logical position, so that location could be any other kind of WAL record. - * All of this mechanism allows us to continue working while we checkpoint. - * As a result, timing of actions is critical here and be careful to note that - * this function will likely take minutes to execute on a busy system. + * * WALAVAIL_EXTENDED means it is still available by preserving extra + * segments beyond max_wal_size. If max_slot_wal_keep_size is smaller + * than max_wal_size, this state is not returned. + * + * * WALAVAIL_UNRESERVED means it is being lost and the next checkpoint will + * remove reserved segments. The walsender using this slot may return to the + * above. + * + * * WALAVAIL_REMOVED means it has been removed. A replication stream on + * a slot with this LSN cannot continue after a restart. + * + * * WALAVAIL_INVALID_LSN means the slot hasn't been set to reserve WAL. */ -void -CreateCheckPoint(int flags) +WALAvailability +GetWALAvailability(XLogRecPtr targetLSN) { - bool shutdown; - CheckPoint checkPoint; - XLogRecPtr recptr; - XLogSegNo _logSegNo; - XLogCtlInsert *Insert = &XLogCtl->Insert; - uint32 freespace; - XLogRecPtr PriorRedoPtr; - XLogRecPtr curInsert; - XLogRecPtr last_important_lsn; - VirtualTransactionId *vxids; - int nvxids; + XLogRecPtr currpos; /* current write LSN */ + XLogSegNo currSeg; /* segid of currpos */ + XLogSegNo targetSeg; /* segid of targetLSN */ + XLogSegNo oldestSeg; /* actual oldest segid */ + XLogSegNo oldestSegMaxWalSize; /* oldest segid kept by max_wal_size */ + XLogSegNo oldestSlotSeg; /* oldest segid kept by slot */ + uint64 keepSegs; /* - * An end-of-recovery checkpoint is really a shutdown checkpoint, just - * issued at a different time. + * slot does not reserve WAL. Either deactivated, or has never been active */ - if (flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY)) - shutdown = true; - else - shutdown = false; - - /* sanity check */ - if (RecoveryInProgress() && (flags & CHECKPOINT_END_OF_RECOVERY) == 0) - elog(ERROR, "can't create a checkpoint during recovery"); + if (XLogRecPtrIsInvalid(targetLSN)) + return WALAVAIL_INVALID_LSN; /* - * Initialize InitXLogInsert working areas before entering the critical - * section. Normally, this is done by the first call to - * RecoveryInProgress() or LocalSetXLogInsertAllowed(), but when creating - * an end-of-recovery checkpoint, the LocalSetXLogInsertAllowed call is - * done below in a critical section, and InitXLogInsert cannot be called - * in a critical section. + * Calculate the oldest segment currently reserved by all slots, + * considering wal_keep_size and max_slot_wal_keep_size. Initialize + * oldestSlotSeg to the current segment. */ - InitXLogInsert(); + currpos = GetXLogWriteRecPtr(); + XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size); + KeepLogSeg(currpos, &oldestSlotSeg); /* - * Prepare to accumulate statistics. - * - * Note: because it is possible for log_checkpoints to change while a - * checkpoint proceeds, we always accumulate stats, even if - * log_checkpoints is currently off. + * Find the oldest extant segment file. We get 1 until checkpoint removes + * the first WAL segment file since startup, which causes the status being + * wrong under certain abnormal conditions but that doesn't actually harm. */ - MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); - CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); + oldestSeg = XLogGetLastRemovedSegno() + 1; - /* - * 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(); + /* calculate oldest segment by max_wal_size */ + XLByteToSeg(currpos, currSeg, wal_segment_size); + keepSegs = ConvertToXSegs(max_wal_size_mb, wal_segment_size) + 1; + + if (currSeg > keepSegs) + oldestSegMaxWalSize = currSeg - keepSegs; + else + oldestSegMaxWalSize = 1; + + /* the segment we care about */ + XLByteToSeg(targetLSN, targetSeg, wal_segment_size); /* - * Use a critical section to force system panic if we have trouble. + * No point in returning reserved or extended status values if the + * targetSeg is known to be lost. */ - START_CRIT_SECTION(); - - if (shutdown) + if (targetSeg >= oldestSlotSeg) { - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_SHUTDOWNING; - ControlFile->time = (pg_time_t) time(NULL); - UpdateControlFile(); - LWLockRelease(ControlFileLock); + /* show "reserved" when targetSeg is within max_wal_size */ + if (targetSeg >= oldestSegMaxWalSize) + return WALAVAIL_RESERVED; + + /* being retained by slots exceeding max_wal_size */ + return WALAVAIL_EXTENDED; } - /* Begin filling in the checkpoint WAL record */ - MemSet(&checkPoint, 0, sizeof(checkPoint)); - checkPoint.time = (pg_time_t) time(NULL); + /* WAL segments are no longer retained but haven't been removed yet */ + if (targetSeg >= oldestSeg) + return WALAVAIL_UNRESERVED; - /* - * For Hot Standby, derive the oldestActiveXid before we fix the redo - * pointer. This allows us to begin accumulating changes to assemble our - * starting snapshot of locks and transactions. - */ - if (!shutdown && XLogStandbyInfoActive()) - checkPoint.oldestActiveXid = GetOldestActiveTransactionId(); - else - checkPoint.oldestActiveXid = InvalidTransactionId; + /* Definitely lost */ + return WALAVAIL_REMOVED; +} - /* - * Get location of last important record before acquiring insert locks (as - * GetLastImportantRecPtr() also locks WAL locks). - */ - last_important_lsn = GetLastImportantRecPtr(); - /* - * We must block concurrent insertions while examining insert state to - * determine the checkpoint REDO pointer. - */ - WALInsertLockAcquireExclusive(); - curInsert = XLogBytePosToRecPtr(Insert->CurrBytePos); +/* + * Retreat *logSegNo to the last segment that we need to retain because of + * either wal_keep_size or replication slots. + * + * This is calculated by subtracting wal_keep_size from the given xlog + * location, recptr and by making sure that that result is below the + * requirement of replication slots. For the latter criterion we do consider + * the effects of max_slot_wal_keep_size: reserve at most that much space back + * from recptr. + * + * Note about replication slots: if this function calculates a value + * that's further ahead than what slots need reserved, then affected + * slots need to be invalidated and this function invoked again. + * XXX it might be a good idea to rewrite this function so that + * invalidation is optionally done here, instead. + */ +static void +KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) +{ + XLogSegNo currSegNo; + XLogSegNo segno; + XLogRecPtr keep; - /* - * If this isn't a shutdown or forced checkpoint, and if there has been no - * WAL activity requiring a checkpoint, skip it. The idea here is to - * avoid inserting duplicate checkpoints when the system is idle. - */ - if ((flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY | - CHECKPOINT_FORCE)) == 0) - { - if (last_important_lsn == ControlFile->checkPoint) - { - WALInsertLockRelease(); - END_CRIT_SECTION(); - ereport(DEBUG1, - (errmsg_internal("checkpoint skipped because system is idle"))); - return; - } - } + XLByteToSeg(recptr, currSegNo, wal_segment_size); + segno = currSegNo; /* - * An end-of-recovery checkpoint is created before anyone is allowed to - * write WAL. To allow us to write the checkpoint record, temporarily - * enable XLogInsertAllowed. (This also ensures ThisTimeLineID is - * initialized, which we need here and in AdvanceXLInsertBuffer.) + * Calculate how many segments are kept by slots first, adjusting for + * max_slot_wal_keep_size. */ - if (flags & CHECKPOINT_END_OF_RECOVERY) - LocalSetXLogInsertAllowed(); + keep = XLogGetReplicationSlotMinimumLSN(); + if (keep != InvalidXLogRecPtr && keep < recptr) + { + XLByteToSeg(keep, segno, wal_segment_size); - checkPoint.ThisTimeLineID = ThisTimeLineID; - if (flags & CHECKPOINT_END_OF_RECOVERY) - checkPoint.PrevTimeLineID = XLogCtl->PrevTimeLineID; - else - checkPoint.PrevTimeLineID = ThisTimeLineID; + /* Cap by max_slot_wal_keep_size ... */ + if (max_slot_wal_keep_size_mb >= 0) + { + uint64 slot_keep_segs; - checkPoint.fullPageWrites = Insert->fullPageWrites; + slot_keep_segs = + ConvertToXSegs(max_slot_wal_keep_size_mb, wal_segment_size); - /* - * Compute new REDO record ptr = location of next XLOG record. - * - * NB: this is NOT necessarily where the checkpoint record itself will be, - * since other backends may insert more XLOG records while we're off doing - * the buffer flush work. Those XLOG records are logically after the - * checkpoint, even though physically before it. Got that? - */ - freespace = INSERT_FREESPACE(curInsert); - if (freespace == 0) - { - if (XLogSegmentOffset(curInsert, wal_segment_size) == 0) - curInsert += SizeOfXLogLongPHD; - else - curInsert += SizeOfXLogShortPHD; + if (currSegNo - segno > slot_keep_segs) + segno = currSegNo - slot_keep_segs; + } } - checkPoint.redo = curInsert; - - /* - * Here we update the shared RedoRecPtr for future XLogInsert calls; this - * must be done while holding all the insertion locks. - * - * Note: if we fail to complete the checkpoint, RedoRecPtr will be left - * pointing past where it really needs to point. This is okay; the only - * consequence is that XLogInsert might back up whole buffers that it - * didn't really need to. We can't postpone advancing RedoRecPtr because - * XLogInserts that happen while we are dumping buffers must assume that - * their buffer changes are not included in the checkpoint. - */ - RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; - - /* - * Now we can release the WAL insertion locks, allowing other xacts to - * proceed while we are flushing disk buffers. - */ - WALInsertLockRelease(); - /* Update the info_lck-protected copy of RedoRecPtr as well */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->RedoRecPtr = checkPoint.redo; - SpinLockRelease(&XLogCtl->info_lck); + /* but, keep at least wal_keep_size if that's set */ + if (wal_keep_size_mb > 0) + { + uint64 keep_segs; - /* - * If enabled, log checkpoint start. We postpone this until now so as not - * to log anything if we decided to skip the checkpoint. - */ - if (log_checkpoints) - LogCheckpointStart(flags, false); + keep_segs = ConvertToXSegs(wal_keep_size_mb, wal_segment_size); + if (currSegNo - segno < keep_segs) + { + /* avoid underflow, don't go below 1 */ + if (currSegNo <= keep_segs) + segno = 1; + else + segno = currSegNo - keep_segs; + } + } - /* Update the process title */ - update_checkpoint_display(flags, false, false); + /* don't delete WAL segments newer than the calculated segment */ + if (segno < *logSegNo) + *logSegNo = segno; +} - TRACE_POSTGRESQL_CHECKPOINT_START(flags); +/* + * Write a NEXTOID log record + */ +void +XLogPutNextOid(Oid nextOid) +{ + XLogBeginInsert(); + XLogRegisterData((char *) (&nextOid), sizeof(Oid)); + (void) XLogInsert(RM_XLOG_ID, XLOG_NEXTOID); /* - * Get the other info we need for the checkpoint record. + * We need not flush the NEXTOID record immediately, because any of the + * just-allocated OIDs could only reach disk as part of a tuple insert or + * update that would have its own XLOG record that must follow the NEXTOID + * record. Therefore, the standard buffer LSN interlock applied to those + * records will ensure no such OID reaches disk before the NEXTOID record + * does. * - * We don't need to save oldestClogXid in the checkpoint, it only matters - * for the short period in which clog is being truncated, and if we crash - * during that we'll redo the clog truncation and fix up oldestClogXid - * there. + * Note, however, that the above statement only covers state "within" the + * database. When we use a generated OID as a file or directory name, we + * are in a sense violating the basic WAL rule, because that filesystem + * change may reach disk before the NEXTOID WAL record does. The impact + * of this is that if a database crash occurs immediately afterward, we + * might after restart re-generate the same OID and find that it conflicts + * with the leftover file or directory. But since for safety's sake we + * always loop until finding a nonconflicting filename, this poses no real + * problem in practice. See pgsql-hackers discussion 27-Sep-2006. */ - LWLockAcquire(XidGenLock, LW_SHARED); - checkPoint.nextXid = ShmemVariableCache->nextXid; - checkPoint.oldestXid = ShmemVariableCache->oldestXid; - checkPoint.oldestXidDB = ShmemVariableCache->oldestXidDB; - LWLockRelease(XidGenLock); +} - LWLockAcquire(CommitTsLock, LW_SHARED); - checkPoint.oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; - checkPoint.newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; - LWLockRelease(CommitTsLock); +/* + * Write an XLOG SWITCH record. + * + * Here we just blindly issue an XLogInsert request for the record. + * All the magic happens inside XLogInsert. + * + * The return value is either the end+1 address of the switch record, + * or the end+1 address of the prior segment if we did not need to + * write a switch record because we are already at segment start. + */ +XLogRecPtr +RequestXLogSwitch(bool mark_unimportant) +{ + XLogRecPtr RecPtr; - LWLockAcquire(OidGenLock, LW_SHARED); - checkPoint.nextOid = ShmemVariableCache->nextOid; - if (!shutdown) - checkPoint.nextOid += ShmemVariableCache->oidCount; - LWLockRelease(OidGenLock); + /* XLOG SWITCH has no data */ + XLogBeginInsert(); - MultiXactGetCheckptMulti(shutdown, - &checkPoint.nextMulti, - &checkPoint.nextMultiOffset, - &checkPoint.oldestMulti, - &checkPoint.oldestMultiDB); + if (mark_unimportant) + XLogSetRecordFlags(XLOG_MARK_UNIMPORTANT); + RecPtr = XLogInsert(RM_XLOG_ID, XLOG_SWITCH); - /* - * Having constructed the checkpoint record, ensure all shmem disk buffers - * and commit-log buffers are flushed to disk. - * - * This I/O could fail for various reasons. If so, we will fail to - * complete the checkpoint, but there is no reason to force a system - * panic. Accordingly, exit critical section while doing it. - */ - END_CRIT_SECTION(); - - /* - * In some cases there are groups of actions that must all occur on one - * side or the other of a checkpoint record. Before flushing the - * checkpoint record we must explicitly wait for any backend currently - * performing those groups of actions. - * - * One example is end of transaction, so we must wait for any transactions - * that are currently in commit critical sections. If an xact inserted - * its commit record into XLOG just before the REDO point, then a crash - * restart from the REDO point would not replay that record, which means - * that our flushing had better include the xact's update of pg_xact. So - * we wait till he's out of his commit critical section before proceeding. - * See notes in RecordTransactionCommit(). - * - * Because we've already released the insertion locks, this test is a bit - * fuzzy: it is possible that we will wait for xacts we didn't really need - * to wait for. But the delay should be short and it seems better to make - * checkpoint take a bit longer than to hold off insertions longer than - * necessary. (In fact, the whole reason we have this issue is that xact.c - * does commit record XLOG insertion and clog update as two separate steps - * 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. - */ - vxids = GetVirtualXIDsDelayingChkpt(&nvxids); - if (nvxids > 0) - { - do - { - pg_usleep(10000L); /* wait for 10 msec */ - } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids)); - } - pfree(vxids); - - CheckPointGuts(checkPoint.redo, flags); - - vxids = GetVirtualXIDsDelayingChkptEnd(&nvxids); - if (nvxids > 0) - { - do - { - pg_usleep(10000L); /* wait for 10 msec */ - } while (HaveVirtualXIDsDelayingChkptEnd(vxids, nvxids)); - } - pfree(vxids); - - /* - * Take a snapshot of running transactions and write this to WAL. This - * allows us to reconstruct the state of running transactions during - * archive recovery, if required. Skip, if this info disabled. - * - * If we are shutting down, or Startup process is completing crash - * recovery we don't need to write running xact data. - */ - if (!shutdown && XLogStandbyInfoActive()) - LogStandbySnapshot(); - - START_CRIT_SECTION(); - - /* - * Now insert the checkpoint record into XLOG. - */ - XLogBeginInsert(); - XLogRegisterData((char *) (&checkPoint), sizeof(checkPoint)); - recptr = XLogInsert(RM_XLOG_ID, - shutdown ? XLOG_CHECKPOINT_SHUTDOWN : - XLOG_CHECKPOINT_ONLINE); - - XLogFlush(recptr); - - /* - * We mustn't write any new WAL after a shutdown checkpoint, or it will be - * overwritten at next startup. No-one should even try, this just allows - * sanity-checking. In the case of an end-of-recovery checkpoint, we want - * to just temporarily disable writing until the system has exited - * recovery. - */ - if (shutdown) - { - if (flags & CHECKPOINT_END_OF_RECOVERY) - LocalXLogInsertAllowed = -1; /* return to "check" state */ - else - LocalXLogInsertAllowed = 0; /* never again write WAL */ - } - - /* - * We now have ProcLastRecPtr = start of actual checkpoint record, recptr - * = end of actual checkpoint record. - */ - if (shutdown && checkPoint.redo != ProcLastRecPtr) - ereport(PANIC, - (errmsg("concurrent write-ahead log activity while database system is shutting down"))); - - /* - * Remember the prior checkpoint's redo ptr for - * UpdateCheckPointDistanceEstimate() - */ - PriorRedoPtr = ControlFile->checkPointCopy.redo; - - /* - * Update the control file. - */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - if (shutdown) - ControlFile->state = DB_SHUTDOWNED; - ControlFile->checkPoint = ProcLastRecPtr; - ControlFile->checkPointCopy = checkPoint; - ControlFile->time = (pg_time_t) time(NULL); - /* crash recovery should always recover to the end of WAL */ - ControlFile->minRecoveryPoint = InvalidXLogRecPtr; - ControlFile->minRecoveryPointTLI = 0; - - /* - * Persist unloggedLSN value. It's reset on crash recovery, so this goes - * unused on non-shutdown checkpoints, but seems useful to store it always - * for debugging purposes. - */ - SpinLockAcquire(&XLogCtl->ulsn_lck); - ControlFile->unloggedLSN = XLogCtl->unloggedLSN; - SpinLockRelease(&XLogCtl->ulsn_lck); - - UpdateControlFile(); - LWLockRelease(ControlFileLock); - - /* Update shared-memory copy of checkpoint XID/epoch */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->ckptFullXid = checkPoint.nextXid; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * We are now done with critical updates; no need for system panic if we - * have trouble while fooling with old log segments. - */ - END_CRIT_SECTION(); - - /* - * Let smgr do post-checkpoint cleanup (eg, deleting old files). - */ - SyncPostCheckpoint(); - - /* - * Update the average distance between checkpoints if the prior checkpoint - * exists. - */ - if (PriorRedoPtr != InvalidXLogRecPtr) - UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr); - - /* - * Delete old log files, those no longer needed for last checkpoint to - * prevent the disk holding the xlog from growing full. - */ - XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); - if (InvalidateObsoleteReplicationSlots(_logSegNo)) - { - /* - * Some slots have been invalidated; recalculate the old-segment - * horizon, starting again from RedoRecPtr. - */ - XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); - } - _logSegNo--; - RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr); - - /* - * Make more log segments if needed. (Do this after recycling old log - * segments, since that may supply some of the needed files.) - */ - if (!shutdown) - PreallocXlogFiles(recptr); - - /* - * Truncate pg_subtrans if possible. We can throw away all data before - * the oldest XMIN of any running transaction. No future transaction will - * attempt to reference any pg_subtrans entry older than that (see Asserts - * in subtrans.c). During recovery, though, we mustn't do this because - * StartupSUBTRANS hasn't been called yet. - */ - if (!RecoveryInProgress()) - TruncateSUBTRANS(GetOldestTransactionIdConsideredRunning()); - - /* Real work is done; log and update stats. */ - LogCheckpointEnd(false); - - /* Reset the process title */ - update_checkpoint_display(flags, false, true); - - TRACE_POSTGRESQL_CHECKPOINT_DONE(CheckpointStats.ckpt_bufs_written, - NBuffers, - CheckpointStats.ckpt_segs_added, - CheckpointStats.ckpt_segs_removed, - CheckpointStats.ckpt_segs_recycled); -} - -/* - * Mark the end of recovery in WAL though without running a full checkpoint. - * We can expect that a restartpoint is likely to be in progress as we - * do this, though we are unwilling to wait for it to complete. - * - * CreateRestartPoint() allows for the case where recovery may end before - * the restartpoint completes so there is no concern of concurrent behaviour. - */ -static void -CreateEndOfRecoveryRecord(void) -{ - xl_end_of_recovery xlrec; - XLogRecPtr recptr; - - /* sanity check */ - if (!RecoveryInProgress()) - elog(ERROR, "can only be used to end recovery"); - - xlrec.end_time = GetCurrentTimestamp(); - - WALInsertLockAcquireExclusive(); - xlrec.ThisTimeLineID = ThisTimeLineID; - xlrec.PrevTimeLineID = XLogCtl->PrevTimeLineID; - WALInsertLockRelease(); - - LocalSetXLogInsertAllowed(); - - START_CRIT_SECTION(); - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_end_of_recovery)); - recptr = XLogInsert(RM_XLOG_ID, XLOG_END_OF_RECOVERY); - - XLogFlush(recptr); - - /* - * Update the control file so that crash recovery can follow the timeline - * changes to this point. - */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->time = (pg_time_t) time(NULL); - ControlFile->minRecoveryPoint = recptr; - ControlFile->minRecoveryPointTLI = ThisTimeLineID; - UpdateControlFile(); - LWLockRelease(ControlFileLock); - - END_CRIT_SECTION(); - - LocalXLogInsertAllowed = -1; /* return to "check" state */ -} + return RecPtr; +} /* - * Write an OVERWRITE_CONTRECORD message. - * - * When on WAL replay we expect a continuation record at the start of a page - * that is not there, recovery ends and WAL writing resumes at that point. - * But it's wrong to resume writing new WAL back at the start of the record - * that was broken, because downstream consumers of that WAL (physical - * replicas) are not prepared to "rewind". So the first action after - * finishing replay of all valid WAL must be to write a record of this type - * at the point where the contrecord was missing; to support xlogreader - * detecting the special case, XLP_FIRST_IS_OVERWRITE_CONTRECORD is also added - * to the page header where the record occurs. xlogreader has an ad-hoc - * mechanism to report metadata about the broken record, which is what we - * use here. - * - * At replay time, XLP_FIRST_IS_OVERWRITE_CONTRECORD instructs xlogreader to - * skip the record it was reading, and pass back the LSN of the skipped - * record, so that its caller can verify (on "replay" of that record) that the - * XLOG_OVERWRITE_CONTRECORD matches what was effectively overwritten. + * Write a RESTORE POINT record */ -static XLogRecPtr -CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn) +XLogRecPtr +XLogRestorePoint(const char *rpName) { - xl_overwrite_contrecord xlrec; - XLogRecPtr recptr; - - /* sanity check */ - if (!RecoveryInProgress()) - elog(ERROR, "can only be used at end of recovery"); + XLogRecPtr RecPtr; + xl_restore_point xlrec; - xlrec.overwritten_lsn = aborted_lsn; - xlrec.overwrite_time = GetCurrentTimestamp(); - - START_CRIT_SECTION(); - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_overwrite_contrecord)); - - recptr = XLogInsert(RM_XLOG_ID, XLOG_OVERWRITE_CONTRECORD); - - XLogFlush(recptr); - - END_CRIT_SECTION(); - - return recptr; -} - -/* - * Flush all data in shared memory to disk, and fsync - * - * This is the common code shared between regular checkpoints and - * recovery restartpoints. - */ -static void -CheckPointGuts(XLogRecPtr checkPointRedo, int flags) -{ - CheckPointRelationMap(); - CheckPointReplicationSlots(); - CheckPointSnapBuild(); - CheckPointLogicalRewriteHeap(); - CheckPointReplicationOrigin(); - - /* Write out all dirty data in SLRUs and the main buffer pool */ - TRACE_POSTGRESQL_BUFFER_CHECKPOINT_START(flags); - CheckpointStats.ckpt_write_t = GetCurrentTimestamp(); - CheckPointCLOG(); - CheckPointCommitTs(); - CheckPointSUBTRANS(); - CheckPointMultiXact(); - CheckPointPredicate(); - CheckPointBuffers(flags); - - /* Perform all queued up fsyncs */ - TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START(); - CheckpointStats.ckpt_sync_t = GetCurrentTimestamp(); - ProcessSyncRequests(); - CheckpointStats.ckpt_sync_end_t = GetCurrentTimestamp(); - TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE(); - - /* We deliberately delay 2PC checkpointing as long as possible */ - CheckPointTwoPhase(checkPointRedo); -} - -/* - * Save a checkpoint for recovery restart if appropriate - * - * This function is called each time a checkpoint record is read from XLOG. - * It must determine whether the checkpoint represents a safe restartpoint or - * not. If so, the checkpoint record is stashed in shared memory so that - * CreateRestartPoint can consult it. (Note that the latter function is - * executed by the checkpointer, while this one will be executed by the - * startup process.) - */ -static void -RecoveryRestartPoint(const CheckPoint *checkPoint) -{ - /* - * Also refrain from creating a restartpoint if we have seen any - * references to non-existent pages. Restarting recovery from the - * restartpoint would not see the references, so we would lose the - * cross-check that the pages belonged to a relation that was dropped - * later. - */ - if (XLogHaveInvalidPages()) - { - elog(trace_recovery(DEBUG2), - "could not record restart point at %X/%X because there " - "are unresolved references to invalid pages", - LSN_FORMAT_ARGS(checkPoint->redo)); - return; - } - - /* - * Copy the checkpoint record to shared memory, so that checkpointer can - * work out the next time it wants to perform a restartpoint. - */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->lastCheckPointRecPtr = ReadRecPtr; - XLogCtl->lastCheckPointEndPtr = EndRecPtr; - XLogCtl->lastCheckPoint = *checkPoint; - SpinLockRelease(&XLogCtl->info_lck); -} - -/* - * Establish a restartpoint if possible. - * - * This is similar to CreateCheckPoint, but is used during WAL recovery - * to establish a point from which recovery can roll forward without - * replaying the entire recovery log. - * - * Returns true if a new restartpoint was established. We can only establish - * a restartpoint if we have replayed a safe checkpoint record since last - * restartpoint. - */ -bool -CreateRestartPoint(int flags) -{ - XLogRecPtr lastCheckPointRecPtr; - XLogRecPtr lastCheckPointEndPtr; - CheckPoint lastCheckPoint; - XLogRecPtr PriorRedoPtr; - XLogRecPtr receivePtr; - XLogRecPtr replayPtr; - TimeLineID replayTLI; - XLogRecPtr endptr; - XLogSegNo _logSegNo; - TimestampTz xtime; - - /* Get a local copy of the last safe checkpoint record. */ - SpinLockAcquire(&XLogCtl->info_lck); - lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr; - lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr; - lastCheckPoint = XLogCtl->lastCheckPoint; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * Check that we're still in recovery mode. It's ok if we exit recovery - * mode after this check, the restart point is valid anyway. - */ - if (!RecoveryInProgress()) - { - ereport(DEBUG2, - (errmsg_internal("skipping restartpoint, recovery has already ended"))); - return false; - } - - /* - * If the last checkpoint record we've replayed is already our last - * restartpoint, we can't perform a new restart point. We still update - * minRecoveryPoint in that case, so that if this is a shutdown restart - * point, we won't start up earlier than before. That's not strictly - * necessary, but when hot standby is enabled, it would be rather weird if - * the database opened up for read-only connections at a point-in-time - * before the last shutdown. Such time travel is still possible in case of - * immediate shutdown, though. - * - * We don't explicitly advance minRecoveryPoint when we do create a - * restartpoint. It's assumed that flushing the buffers will do that as a - * side-effect. - */ - if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) || - lastCheckPoint.redo <= ControlFile->checkPointCopy.redo) - { - ereport(DEBUG2, - (errmsg_internal("skipping restartpoint, already performed at %X/%X", - LSN_FORMAT_ARGS(lastCheckPoint.redo)))); - - UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); - if (flags & CHECKPOINT_IS_SHUTDOWN) - { - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; - ControlFile->time = (pg_time_t) time(NULL); - UpdateControlFile(); - LWLockRelease(ControlFileLock); - } - return false; - } - - /* - * Update the shared RedoRecPtr so that the startup process can calculate - * the number of segments replayed since last restartpoint, and request a - * restartpoint if it exceeds CheckPointSegments. - * - * Like in CreateCheckPoint(), hold off insertions to update it, although - * during recovery this is just pro forma, because no WAL insertions are - * happening. - */ - WALInsertLockAcquireExclusive(); - RedoRecPtr = XLogCtl->Insert.RedoRecPtr = lastCheckPoint.redo; - WALInsertLockRelease(); - - /* Also update the info_lck-protected copy */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->RedoRecPtr = lastCheckPoint.redo; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * Prepare to accumulate statistics. - * - * Note: because it is possible for log_checkpoints to change while a - * checkpoint proceeds, we always accumulate stats, even if - * log_checkpoints is currently off. - */ - MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); - CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); - - if (log_checkpoints) - LogCheckpointStart(flags, true); - - /* Update the process title */ - update_checkpoint_display(flags, true, false); - - CheckPointGuts(lastCheckPoint.redo, flags); - - /* - * Remember the prior checkpoint's redo ptr for - * UpdateCheckPointDistanceEstimate() - */ - PriorRedoPtr = ControlFile->checkPointCopy.redo; - - /* - * 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->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; - ControlFile->time = (pg_time_t) time(NULL); - - /* - * 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 non-exclusive base backup 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 non-exclusive base backup 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->state == DB_IN_ARCHIVE_RECOVERY) - { - if (ControlFile->minRecoveryPoint < lastCheckPointEndPtr) - { - ControlFile->minRecoveryPoint = lastCheckPointEndPtr; - ControlFile->minRecoveryPointTLI = lastCheckPoint.ThisTimeLineID; - - /* update local copy */ - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; - } - if (flags & CHECKPOINT_IS_SHUTDOWN) - ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; - } - UpdateControlFile(); - } - LWLockRelease(ControlFileLock); - - /* - * Update the average distance between checkpoints/restartpoints if the - * prior checkpoint exists. - */ - if (PriorRedoPtr != InvalidXLogRecPtr) - UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr); - - /* - * Delete old log files, those no longer needed for last restartpoint to - * prevent the disk holding the xlog from growing full. - */ - XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - - /* - * Retreat _logSegNo using the current end of xlog replayed or received, - * whichever is later. - */ - receivePtr = GetWalRcvFlushRecPtr(NULL, NULL); - replayPtr = GetXLogReplayRecPtr(&replayTLI); - endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr; - KeepLogSeg(endptr, &_logSegNo); - if (InvalidateObsoleteReplicationSlots(_logSegNo)) - { - /* - * Some slots have been invalidated; recalculate the old-segment - * horizon, starting again from RedoRecPtr. - */ - XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(endptr, &_logSegNo); - } - _logSegNo--; - - /* - * Try to recycle segments on a useful timeline. If we've been promoted - * since the beginning of this restartpoint, use the new timeline chosen - * at end of recovery (RecoveryInProgress() sets ThisTimeLineID in that - * case). If we're still in recovery, use the timeline we're currently - * replaying. - * - * There is no guarantee that the WAL segments will be useful on the - * current timeline; if recovery proceeds to a new timeline right after - * this, the pre-allocated WAL segments on this timeline will not be used, - * and will go wasted until recycled on the next restartpoint. We'll live - * with that. - */ - if (RecoveryInProgress()) - ThisTimeLineID = replayTLI; - - RemoveOldXlogFiles(_logSegNo, RedoRecPtr, endptr); - - /* - * Make more log segments if needed. (Do this after recycling old log - * segments, since that may supply some of the needed files.) - */ - PreallocXlogFiles(endptr); - - /* - * ThisTimeLineID is normally not set when we're still in recovery. - * However, recycling/preallocating segments above needed ThisTimeLineID - * to determine which timeline to install the segments on. Reset it now, - * to restore the normal state of affairs for debugging purposes. - */ - if (RecoveryInProgress()) - ThisTimeLineID = 0; - - /* - * Truncate pg_subtrans if possible. We can throw away all data before - * the oldest XMIN of any running transaction. No future transaction will - * attempt to reference any pg_subtrans entry older than that (see Asserts - * in subtrans.c). When hot standby is disabled, though, we mustn't do - * this because StartupSUBTRANS hasn't been called yet. - */ - if (EnableHotStandby) - TruncateSUBTRANS(GetOldestTransactionIdConsideredRunning()); - - /* Real work is done; log and update stats. */ - LogCheckpointEnd(true); - - /* Reset the process title */ - update_checkpoint_display(flags, true, true); - - xtime = GetLatestXTime(); - ereport((log_checkpoints ? LOG : DEBUG2), - (errmsg("recovery restart point at %X/%X", - LSN_FORMAT_ARGS(lastCheckPoint.redo)), - xtime ? errdetail("Last completed transaction was at log time %s.", - timestamptz_to_str(xtime)) : 0)); - - /* - * Finally, execute archive_cleanup_command, if any. - */ - if (archiveCleanupCommand && strcmp(archiveCleanupCommand, "") != 0) - ExecuteRecoveryCommand(archiveCleanupCommand, - "archive_cleanup_command", - false); - - return true; -} - -/* - * Report availability of WAL for the given target LSN - * (typically a slot's restart_lsn) - * - * Returns one of the following enum values: - * - * * WALAVAIL_RESERVED means targetLSN is available and it is in the range of - * max_wal_size. - * - * * WALAVAIL_EXTENDED means it is still available by preserving extra - * segments beyond max_wal_size. If max_slot_wal_keep_size is smaller - * than max_wal_size, this state is not returned. - * - * * WALAVAIL_UNRESERVED means it is being lost and the next checkpoint will - * remove reserved segments. The walsender using this slot may return to the - * above. - * - * * WALAVAIL_REMOVED means it has been removed. A replication stream on - * a slot with this LSN cannot continue after a restart. - * - * * WALAVAIL_INVALID_LSN means the slot hasn't been set to reserve WAL. - */ -WALAvailability -GetWALAvailability(XLogRecPtr targetLSN) -{ - XLogRecPtr currpos; /* current write LSN */ - XLogSegNo currSeg; /* segid of currpos */ - XLogSegNo targetSeg; /* segid of targetLSN */ - XLogSegNo oldestSeg; /* actual oldest segid */ - XLogSegNo oldestSegMaxWalSize; /* oldest segid kept by max_wal_size */ - XLogSegNo oldestSlotSeg; /* oldest segid kept by slot */ - uint64 keepSegs; - - /* - * slot does not reserve WAL. Either deactivated, or has never been active - */ - if (XLogRecPtrIsInvalid(targetLSN)) - return WALAVAIL_INVALID_LSN; - - /* - * Calculate the oldest segment currently reserved by all slots, - * considering wal_keep_size and max_slot_wal_keep_size. Initialize - * oldestSlotSeg to the current segment. - */ - currpos = GetXLogWriteRecPtr(); - XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size); - KeepLogSeg(currpos, &oldestSlotSeg); - - /* - * Find the oldest extant segment file. We get 1 until checkpoint removes - * the first WAL segment file since startup, which causes the status being - * wrong under certain abnormal conditions but that doesn't actually harm. - */ - oldestSeg = XLogGetLastRemovedSegno() + 1; - - /* calculate oldest segment by max_wal_size */ - XLByteToSeg(currpos, currSeg, wal_segment_size); - keepSegs = ConvertToXSegs(max_wal_size_mb, wal_segment_size) + 1; - - if (currSeg > keepSegs) - oldestSegMaxWalSize = currSeg - keepSegs; - else - oldestSegMaxWalSize = 1; - - /* the segment we care about */ - XLByteToSeg(targetLSN, targetSeg, wal_segment_size); - - /* - * No point in returning reserved or extended status values if the - * targetSeg is known to be lost. - */ - if (targetSeg >= oldestSlotSeg) - { - /* show "reserved" when targetSeg is within max_wal_size */ - if (targetSeg >= oldestSegMaxWalSize) - return WALAVAIL_RESERVED; - - /* being retained by slots exceeding max_wal_size */ - return WALAVAIL_EXTENDED; - } - - /* WAL segments are no longer retained but haven't been removed yet */ - if (targetSeg >= oldestSeg) - return WALAVAIL_UNRESERVED; - - /* Definitely lost */ - return WALAVAIL_REMOVED; -} - - -/* - * Retreat *logSegNo to the last segment that we need to retain because of - * either wal_keep_size or replication slots. - * - * This is calculated by subtracting wal_keep_size from the given xlog - * location, recptr and by making sure that that result is below the - * requirement of replication slots. For the latter criterion we do consider - * the effects of max_slot_wal_keep_size: reserve at most that much space back - * from recptr. - * - * Note about replication slots: if this function calculates a value - * that's further ahead than what slots need reserved, then affected - * slots need to be invalidated and this function invoked again. - * XXX it might be a good idea to rewrite this function so that - * invalidation is optionally done here, instead. - */ -static void -KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) -{ - XLogSegNo currSegNo; - XLogSegNo segno; - XLogRecPtr keep; - - XLByteToSeg(recptr, currSegNo, wal_segment_size); - segno = currSegNo; - - /* - * Calculate how many segments are kept by slots first, adjusting for - * max_slot_wal_keep_size. - */ - keep = XLogGetReplicationSlotMinimumLSN(); - if (keep != InvalidXLogRecPtr && keep < recptr) - { - XLByteToSeg(keep, segno, wal_segment_size); - - /* Cap by max_slot_wal_keep_size ... */ - if (max_slot_wal_keep_size_mb >= 0) - { - uint64 slot_keep_segs; - - slot_keep_segs = - ConvertToXSegs(max_slot_wal_keep_size_mb, wal_segment_size); - - if (currSegNo - segno > slot_keep_segs) - segno = currSegNo - slot_keep_segs; - } - } - - /* but, keep at least wal_keep_size if that's set */ - if (wal_keep_size_mb > 0) - { - uint64 keep_segs; - - keep_segs = ConvertToXSegs(wal_keep_size_mb, wal_segment_size); - if (currSegNo - segno < keep_segs) - { - /* avoid underflow, don't go below 1 */ - if (currSegNo <= keep_segs) - segno = 1; - else - segno = currSegNo - keep_segs; - } - } - - /* don't delete WAL segments newer than the calculated segment */ - if (segno < *logSegNo) - *logSegNo = segno; -} - -/* - * Write a NEXTOID log record - */ -void -XLogPutNextOid(Oid nextOid) -{ - XLogBeginInsert(); - XLogRegisterData((char *) (&nextOid), sizeof(Oid)); - (void) XLogInsert(RM_XLOG_ID, XLOG_NEXTOID); - - /* - * We need not flush the NEXTOID record immediately, because any of the - * just-allocated OIDs could only reach disk as part of a tuple insert or - * update that would have its own XLOG record that must follow the NEXTOID - * record. Therefore, the standard buffer LSN interlock applied to those - * records will ensure no such OID reaches disk before the NEXTOID record - * does. - * - * Note, however, that the above statement only covers state "within" the - * database. When we use a generated OID as a file or directory name, we - * are in a sense violating the basic WAL rule, because that filesystem - * change may reach disk before the NEXTOID WAL record does. The impact - * of this is that if a database crash occurs immediately afterward, we - * might after restart re-generate the same OID and find that it conflicts - * with the leftover file or directory. But since for safety's sake we - * always loop until finding a nonconflicting filename, this poses no real - * problem in practice. See pgsql-hackers discussion 27-Sep-2006. - */ -} - -/* - * Write an XLOG SWITCH record. - * - * Here we just blindly issue an XLogInsert request for the record. - * All the magic happens inside XLogInsert. - * - * The return value is either the end+1 address of the switch record, - * or the end+1 address of the prior segment if we did not need to - * write a switch record because we are already at segment start. - */ -XLogRecPtr -RequestXLogSwitch(bool mark_unimportant) -{ - XLogRecPtr RecPtr; - - /* XLOG SWITCH has no data */ - XLogBeginInsert(); - - if (mark_unimportant) - XLogSetRecordFlags(XLOG_MARK_UNIMPORTANT); - RecPtr = XLogInsert(RM_XLOG_ID, XLOG_SWITCH); - - return RecPtr; -} - -/* - * Write a RESTORE POINT record - */ -XLogRecPtr -XLogRestorePoint(const char *rpName) -{ - XLogRecPtr RecPtr; - xl_restore_point xlrec; - - xlrec.rp_time = GetCurrentTimestamp(); - strlcpy(xlrec.rp_name, rpName, MAXFNAMELEN); - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_restore_point)); - - RecPtr = XLogInsert(RM_XLOG_ID, XLOG_RESTORE_POINT); - - ereport(LOG, - (errmsg("restore point \"%s\" created at %X/%X", - rpName, LSN_FORMAT_ARGS(RecPtr)))); - - return RecPtr; -} - -/* - * Check if any of the GUC parameters that are critical for hot standby - * have changed, and update the value in pg_control file if necessary. - */ -static void -XLogReportParameters(void) -{ - if (wal_level != ControlFile->wal_level || - wal_log_hints != ControlFile->wal_log_hints || - MaxConnections != ControlFile->MaxConnections || - max_worker_processes != ControlFile->max_worker_processes || - max_wal_senders != ControlFile->max_wal_senders || - max_prepared_xacts != ControlFile->max_prepared_xacts || - max_locks_per_xact != ControlFile->max_locks_per_xact || - track_commit_timestamp != ControlFile->track_commit_timestamp) - { - /* - * The change in number of backend slots doesn't need to be WAL-logged - * if archiving is not enabled, as you can't start archive recovery - * with wal_level=minimal anyway. We don't really care about the - * values in pg_control either if wal_level=minimal, but seems better - * to keep them up-to-date to avoid confusion. - */ - if (wal_level != ControlFile->wal_level || XLogIsNeeded()) - { - xl_parameter_change xlrec; - XLogRecPtr recptr; - - xlrec.MaxConnections = MaxConnections; - xlrec.max_worker_processes = max_worker_processes; - xlrec.max_wal_senders = max_wal_senders; - xlrec.max_prepared_xacts = max_prepared_xacts; - xlrec.max_locks_per_xact = max_locks_per_xact; - xlrec.wal_level = wal_level; - xlrec.wal_log_hints = wal_log_hints; - xlrec.track_commit_timestamp = track_commit_timestamp; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - - recptr = XLogInsert(RM_XLOG_ID, XLOG_PARAMETER_CHANGE); - XLogFlush(recptr); - } - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - - ControlFile->MaxConnections = MaxConnections; - ControlFile->max_worker_processes = max_worker_processes; - ControlFile->max_wal_senders = max_wal_senders; - ControlFile->max_prepared_xacts = max_prepared_xacts; - ControlFile->max_locks_per_xact = max_locks_per_xact; - ControlFile->wal_level = wal_level; - ControlFile->wal_log_hints = wal_log_hints; - ControlFile->track_commit_timestamp = track_commit_timestamp; - UpdateControlFile(); - - LWLockRelease(ControlFileLock); - } -} - -/* - * Update full_page_writes in shared memory, and write an - * XLOG_FPW_CHANGE record if necessary. - * - * Note: this function assumes there is no other process running - * concurrently that could update it. - */ -void -UpdateFullPageWrites(void) -{ - XLogCtlInsert *Insert = &XLogCtl->Insert; - bool recoveryInProgress; - - /* - * Do nothing if full_page_writes has not been changed. - * - * It's safe to check the shared full_page_writes without the lock, - * because we assume that there is no concurrently running process which - * can update it. - */ - if (fullPageWrites == Insert->fullPageWrites) - return; - - /* - * Perform this outside critical section so that the WAL insert - * initialization done by RecoveryInProgress() doesn't trigger an - * assertion failure. - */ - recoveryInProgress = RecoveryInProgress(); - - START_CRIT_SECTION(); - - /* - * It's always safe to take full page images, even when not strictly - * required, but not the other round. So if we're setting full_page_writes - * to true, first set it true and then write the WAL record. If we're - * setting it to false, first write the WAL record and then set the global - * flag. - */ - if (fullPageWrites) - { - WALInsertLockAcquireExclusive(); - Insert->fullPageWrites = true; - WALInsertLockRelease(); - } - - /* - * Write an XLOG_FPW_CHANGE record. This allows us to keep track of - * full_page_writes during archive recovery, if required. - */ - if (XLogStandbyInfoActive() && !recoveryInProgress) - { - XLogBeginInsert(); - XLogRegisterData((char *) (&fullPageWrites), sizeof(bool)); - - XLogInsert(RM_XLOG_ID, XLOG_FPW_CHANGE); - } - - if (!fullPageWrites) - { - WALInsertLockAcquireExclusive(); - Insert->fullPageWrites = false; - WALInsertLockRelease(); - } - END_CRIT_SECTION(); -} - -/* - * Check that it's OK to switch to new timeline during recovery. - * - * 'lsn' is the address of the shutdown checkpoint record we're about to - * replay. (Currently, timeline can only change at a shutdown checkpoint). - */ -static void -checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, TimeLineID prevTLI) -{ - /* Check that the record agrees on what the current (old) timeline is */ - if (prevTLI != ThisTimeLineID) - ereport(PANIC, - (errmsg("unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record", - prevTLI, ThisTimeLineID))); - - /* - * The new timeline better be in the list of timelines we expect to see, - * according to the timeline history. It should also not decrease. - */ - if (newTLI < ThisTimeLineID || !tliInHistory(newTLI, expectedTLEs)) - ereport(PANIC, - (errmsg("unexpected timeline ID %u (after %u) in checkpoint record", - newTLI, ThisTimeLineID))); - - /* - * If we have not yet reached min recovery point, and we're about to - * switch to a timeline greater than the timeline of the min recovery - * point: trouble. After switching to the new timeline, we could not - * possibly visit the min recovery point on the correct timeline anymore. - * This can happen if there is a newer timeline in the archive that - * branched before the timeline the min recovery point is on, and you - * attempt to do PITR to the new timeline. - */ - if (!XLogRecPtrIsInvalid(minRecoveryPoint) && - lsn < minRecoveryPoint && - newTLI > minRecoveryPointTLI) - ereport(PANIC, - (errmsg("unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u", - newTLI, - LSN_FORMAT_ARGS(minRecoveryPoint), - minRecoveryPointTLI))); - - /* Looks good */ -} - -/* - * XLOG resource manager's routines - * - * Definitions of info values are in include/catalog/pg_control.h, though - * not all record types are related to control file updates. - */ -void -xlog_redo(XLogReaderState *record) -{ - uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - XLogRecPtr lsn = record->EndRecPtr; - - /* in XLOG rmgr, backup blocks are only used by XLOG_FPI records */ - Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT || - !XLogRecHasAnyBlockRefs(record)); - - if (info == XLOG_NEXTOID) - { - Oid nextOid; - - /* - * We used to try to take the maximum of ShmemVariableCache->nextOid - * and the recorded nextOid, but that fails if the OID counter wraps - * around. Since no OID allocation should be happening during replay - * anyway, better to just believe the record exactly. We still take - * OidGenLock while setting the variable, just in case. - */ - memcpy(&nextOid, XLogRecGetData(record), sizeof(Oid)); - LWLockAcquire(OidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextOid = nextOid; - ShmemVariableCache->oidCount = 0; - LWLockRelease(OidGenLock); - } - else if (info == XLOG_CHECKPOINT_SHUTDOWN) - { - CheckPoint checkPoint; - - memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); - /* In a SHUTDOWN checkpoint, believe the counters exactly */ - LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextXid = checkPoint.nextXid; - LWLockRelease(XidGenLock); - LWLockAcquire(OidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextOid = checkPoint.nextOid; - ShmemVariableCache->oidCount = 0; - LWLockRelease(OidGenLock); - MultiXactSetNextMXact(checkPoint.nextMulti, - checkPoint.nextMultiOffset); - - MultiXactAdvanceOldest(checkPoint.oldestMulti, - checkPoint.oldestMultiDB); - - /* - * No need to set oldestClogXid here as well; it'll be set when we - * redo an xl_clog_truncate if it changed since initialization. - */ - SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); - - /* - * If we see a shutdown checkpoint while waiting for an end-of-backup - * record, the backup was canceled and the end-of-backup record will - * never arrive. - */ - if (ArchiveRecoveryRequested && - !XLogRecPtrIsInvalid(ControlFile->backupStartPoint) && - XLogRecPtrIsInvalid(ControlFile->backupEndPoint)) - ereport(PANIC, - (errmsg("online backup was canceled, recovery cannot continue"))); - - /* - * If we see a shutdown checkpoint, we know that nothing was running - * on the primary at this point. So fake-up an empty running-xacts - * record and use that here and now. Recover additional standby state - * for prepared transactions. - */ - if (standbyState >= STANDBY_INITIALIZED) - { - TransactionId *xids; - int nxids; - TransactionId oldestActiveXID; - TransactionId latestCompletedXid; - RunningTransactionsData running; - - oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); - - /* - * Construct a RunningTransactions snapshot representing a shut - * down server, with only prepared transactions still alive. We're - * never overflowed at this point because all subxids are listed - * with their parent prepared transactions. - */ - running.xcnt = nxids; - running.subxcnt = 0; - running.subxid_overflow = false; - running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); - running.oldestRunningXid = oldestActiveXID; - latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); - TransactionIdRetreat(latestCompletedXid); - Assert(TransactionIdIsNormal(latestCompletedXid)); - running.latestCompletedXid = latestCompletedXid; - running.xids = xids; - - ProcArrayApplyRecoveryInfo(&running); - - StandbyRecoverPreparedTransactions(); - } - - /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; - LWLockRelease(ControlFileLock); - - /* Update shared-memory copy of checkpoint XID/epoch */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->ckptFullXid = checkPoint.nextXid; - SpinLockRelease(&XLogCtl->info_lck); - - /* - * We should've already switched to the new TLI before replaying this - * record. - */ - if (checkPoint.ThisTimeLineID != ThisTimeLineID) - ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in checkpoint record", - checkPoint.ThisTimeLineID, ThisTimeLineID))); - - RecoveryRestartPoint(&checkPoint); - } - else if (info == XLOG_CHECKPOINT_ONLINE) - { - CheckPoint checkPoint; - - memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); - /* In an ONLINE checkpoint, treat the XID counter as a minimum */ - LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - if (FullTransactionIdPrecedes(ShmemVariableCache->nextXid, - checkPoint.nextXid)) - ShmemVariableCache->nextXid = checkPoint.nextXid; - LWLockRelease(XidGenLock); - - /* - * We ignore the nextOid counter in an ONLINE checkpoint, preferring - * to track OID assignment through XLOG_NEXTOID records. The nextOid - * counter is from the start of the checkpoint and might well be stale - * compared to later XLOG_NEXTOID records. We could try to take the - * maximum of the nextOid counter and our latest value, but since - * there's no particular guarantee about the speed with which the OID - * counter wraps around, that's a risky thing to do. In any case, - * users of the nextOid counter are required to avoid assignment of - * duplicates, so that a somewhat out-of-date value should be safe. - */ - - /* Handle multixact */ - MultiXactAdvanceNextMXact(checkPoint.nextMulti, - checkPoint.nextMultiOffset); - - /* - * NB: This may perform multixact truncation when replaying WAL - * generated by an older primary. - */ - MultiXactAdvanceOldest(checkPoint.oldestMulti, - checkPoint.oldestMultiDB); - if (TransactionIdPrecedes(ShmemVariableCache->oldestXid, - checkPoint.oldestXid)) - SetTransactionIdLimit(checkPoint.oldestXid, - checkPoint.oldestXidDB); - /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; - LWLockRelease(ControlFileLock); - - /* Update shared-memory copy of checkpoint XID/epoch */ - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->ckptFullXid = checkPoint.nextXid; - SpinLockRelease(&XLogCtl->info_lck); - - /* TLI should not change in an on-line checkpoint */ - if (checkPoint.ThisTimeLineID != ThisTimeLineID) - ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in checkpoint record", - checkPoint.ThisTimeLineID, ThisTimeLineID))); - - RecoveryRestartPoint(&checkPoint); - } - else if (info == XLOG_OVERWRITE_CONTRECORD) - { - xl_overwrite_contrecord xlrec; - - memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_overwrite_contrecord)); - VerifyOverwriteContrecord(&xlrec, record); - } - else if (info == XLOG_END_OF_RECOVERY) - { - xl_end_of_recovery xlrec; - - memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_end_of_recovery)); - - /* - * For Hot Standby, we could treat this like a Shutdown Checkpoint, - * but this case is rarer and harder to test, so the benefit doesn't - * outweigh the potential extra cost of maintenance. - */ - - /* - * We should've already switched to the new TLI before replaying this - * record. - */ - if (xlrec.ThisTimeLineID != ThisTimeLineID) - ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in checkpoint record", - xlrec.ThisTimeLineID, ThisTimeLineID))); - } - else if (info == XLOG_NOOP) - { - /* nothing to do here */ - } - else if (info == XLOG_SWITCH) - { - /* nothing to do here */ - } - else if (info == XLOG_RESTORE_POINT) - { - /* nothing to do here */ - } - else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT) - { - /* - * Full-page image (FPI) records contain nothing else but a backup - * block (or multiple backup blocks). Every block reference must - * include a full-page image - otherwise there would be no point in - * this record. - * - * No recovery conflicts are generated by these generic records - if a - * resource manager needs to generate conflicts, it has to define a - * separate WAL record type and redo routine. - * - * XLOG_FPI_FOR_HINT records are generated when a page needs to be - * WAL- logged because of a hint bit update. They are only generated - * when checksums are enabled. There is no difference in handling - * XLOG_FPI and XLOG_FPI_FOR_HINT records, they use a different info - * code just to distinguish them for statistics purposes. - */ - for (uint8 block_id = 0; block_id <= record->max_block_id; block_id++) - { - Buffer buffer; - - if (XLogReadBufferForRedo(record, block_id, &buffer) != BLK_RESTORED) - elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block"); - UnlockReleaseBuffer(buffer); - } - } - else if (info == XLOG_BACKUP_END) - { - XLogRecPtr startpoint; - - memcpy(&startpoint, XLogRecGetData(record), sizeof(startpoint)); - - if (ControlFile->backupStartPoint == startpoint) - { - /* - * We have reached the end of base backup, the point where - * pg_stop_backup() was done. The data on disk is now consistent. - * Reset backupStartPoint, and update minRecoveryPoint to make - * sure we don't allow starting up at an earlier point even if - * recovery is stopped and restarted soon after this. - */ - elog(DEBUG1, "end of backup reached"); - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - - if (ControlFile->minRecoveryPoint < lsn) - { - ControlFile->minRecoveryPoint = lsn; - ControlFile->minRecoveryPointTLI = ThisTimeLineID; - } - ControlFile->backupStartPoint = InvalidXLogRecPtr; - ControlFile->backupEndRequired = false; - UpdateControlFile(); - - LWLockRelease(ControlFileLock); - } - } - else if (info == XLOG_PARAMETER_CHANGE) - { - xl_parameter_change xlrec; - - /* Update our copy of the parameters in pg_control */ - memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_parameter_change)); - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->MaxConnections = xlrec.MaxConnections; - ControlFile->max_worker_processes = xlrec.max_worker_processes; - ControlFile->max_wal_senders = xlrec.max_wal_senders; - ControlFile->max_prepared_xacts = xlrec.max_prepared_xacts; - ControlFile->max_locks_per_xact = xlrec.max_locks_per_xact; - ControlFile->wal_level = xlrec.wal_level; - ControlFile->wal_log_hints = xlrec.wal_log_hints; - - /* - * Update minRecoveryPoint to ensure that if recovery is aborted, we - * recover back up to this point before allowing hot standby again. - * This is important if the max_* settings are decreased, to ensure - * you don't run queries against the WAL preceding the change. The - * local copies cannot be updated as long as crash recovery is - * happening and we expect all the WAL to be replayed. - */ - if (InArchiveRecovery) - { - minRecoveryPoint = ControlFile->minRecoveryPoint; - minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; - } - if (minRecoveryPoint != InvalidXLogRecPtr && minRecoveryPoint < lsn) - { - ControlFile->minRecoveryPoint = lsn; - ControlFile->minRecoveryPointTLI = ThisTimeLineID; - } - - CommitTsParameterChange(xlrec.track_commit_timestamp, - ControlFile->track_commit_timestamp); - ControlFile->track_commit_timestamp = xlrec.track_commit_timestamp; - - UpdateControlFile(); - LWLockRelease(ControlFileLock); - - /* Check to see if any parameter change gives a problem on recovery */ - CheckRequiredParameterValues(); - } - else if (info == XLOG_FPW_CHANGE) - { - bool fpw; - - memcpy(&fpw, XLogRecGetData(record), sizeof(bool)); - - /* - * 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 - * full_page_writes has been disabled during online backup. - */ - if (!fpw) - { - SpinLockAcquire(&XLogCtl->info_lck); - if (XLogCtl->lastFpwDisableRecPtr < ReadRecPtr) - XLogCtl->lastFpwDisableRecPtr = ReadRecPtr; - SpinLockRelease(&XLogCtl->info_lck); - } - - /* Keep track of full_page_writes */ - lastFullPageWrites = fpw; - } -} - -/* - * Verify the payload of a XLOG_OVERWRITE_CONTRECORD record. - */ -static void -VerifyOverwriteContrecord(xl_overwrite_contrecord *xlrec, XLogReaderState *state) -{ - if (xlrec->overwritten_lsn != state->overwrittenRecPtr) - elog(FATAL, "mismatching overwritten LSN %X/%X -> %X/%X", - LSN_FORMAT_ARGS(xlrec->overwritten_lsn), - LSN_FORMAT_ARGS(state->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), - timestamptz_to_str(xlrec->overwrite_time)))); - - /* Verifying the record should only happen once */ - state->overwrittenRecPtr = InvalidXLogRecPtr; -} - -#ifdef WAL_DEBUG - -static void -xlog_outrec(StringInfo buf, XLogReaderState *record) -{ - appendStringInfo(buf, "prev %X/%X; xid %u", - LSN_FORMAT_ARGS(XLogRecGetPrev(record)), - XLogRecGetXid(record)); - - appendStringInfo(buf, "; len %u", - XLogRecGetDataLen(record)); - - xlog_block_info(buf, record); -} -#endif /* WAL_DEBUG */ - -/* - * Returns a string giving information about all the blocks in an - * XLogRecord. - */ -static void -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++) - { - RelFileNode rnode; - ForkNumber forknum; - BlockNumber blk; - - if (!XLogRecHasBlockRef(record, block_id)) - continue; - - XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); - if (forknum != MAIN_FORKNUM) - appendStringInfo(buf, "; blkref #%u: rel %u/%u/%u, fork %u, blk %u", - block_id, - rnode.spcNode, rnode.dbNode, rnode.relNode, - forknum, - blk); - else - appendStringInfo(buf, "; blkref #%u: rel %u/%u/%u, blk %u", - block_id, - rnode.spcNode, rnode.dbNode, rnode.relNode, - blk); - if (XLogRecHasBlockImage(record, block_id)) - appendStringInfoString(buf, " FPW"); - } -} - -/* - * Returns a string describing an XLogRecord, consisting of its identity - * optionally followed by a colon, a space, and a further description. - */ -static void -xlog_outdesc(StringInfo buf, XLogReaderState *record) -{ - RmgrId rmid = XLogRecGetRmid(record); - uint8 info = XLogRecGetInfo(record); - const char *id; - - appendStringInfoString(buf, RmgrTable[rmid].rm_name); - appendStringInfoChar(buf, '/'); - - id = RmgrTable[rmid].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); -} - - -/* - * Return the (possible) sync flag used for opening a file, depending on the - * value of the GUC wal_sync_method. - */ -static int -get_sync_bit(int method) -{ - int o_direct_flag = 0; - - /* If fsync is disabled, never open in sync mode */ - if (!enableFsync) - return 0; - - /* - * Optimize writes by bypassing kernel cache with O_DIRECT when using - * O_SYNC/O_FSYNC and O_DSYNC. But only if archiving and streaming are - * disabled, otherwise the archive command or walsender process will read - * the WAL soon after writing it, which is guaranteed to cause a physical - * read if we bypassed the kernel cache. We also skip the - * posix_fadvise(POSIX_FADV_DONTNEED) call in XLogFileClose() for the same - * reason. - * - * Never use O_DIRECT in walreceiver process for similar reasons; the WAL - * written by walreceiver is normally read by the startup process soon - * after it's written. Also, walreceiver performs unaligned writes, which - * don't work with O_DIRECT, so it is required for correctness too. - */ - if (!XLogIsNeeded() && !AmWalReceiverProcess()) - o_direct_flag = PG_O_DIRECT; - - switch (method) - { - /* - * enum values for all sync options are defined even if they are - * not supported on the current platform. But if not, they are - * not included in the enum option array, and therefore will never - * be seen here. - */ - case SYNC_METHOD_FSYNC: - case SYNC_METHOD_FSYNC_WRITETHROUGH: - case SYNC_METHOD_FDATASYNC: - return 0; -#ifdef OPEN_SYNC_FLAG - case SYNC_METHOD_OPEN: - return OPEN_SYNC_FLAG | o_direct_flag; -#endif -#ifdef OPEN_DATASYNC_FLAG - case SYNC_METHOD_OPEN_DSYNC: - return OPEN_DATASYNC_FLAG | o_direct_flag; -#endif - default: - /* can't happen (unless we are out of sync with option array) */ - elog(ERROR, "unrecognized wal_sync_method: %d", method); - return 0; /* silence warning */ - } -} - -/* - * GUC support - */ -void -assign_xlog_sync_method(int new_sync_method, void *extra) -{ - if (sync_method != new_sync_method) - { - /* - * To ensure that no blocks escape unsynced, force an fsync on the - * currently open log segment (if any). Also, if the open flag is - * changing, close the log file so it will be reopened (with new flag - * bit) at next use. - */ - if (openLogFile >= 0) - { - pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN); - if (pg_fsync(openLogFile) != 0) - { - char xlogfname[MAXFNAMELEN]; - int save_errno; - - save_errno = errno; - XLogFileName(xlogfname, ThisTimeLineID, openLogSegNo, - wal_segment_size); - errno = save_errno; - ereport(PANIC, - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", xlogfname))); - } - - pgstat_report_wait_end(); - if (get_sync_bit(sync_method) != get_sync_bit(new_sync_method)) - XLogFileClose(); - } - } -} - - -/* - * Issue appropriate kind of fsync (if any) for an XLOG output file. - * - * 'fd' is a file descriptor for the XLOG file to be fsync'd. - * 'segno' is for error reporting purposes. - */ -void -issue_xlog_fsync(int fd, XLogSegNo segno) -{ - char *msg = NULL; - instr_time start; - - /* - * Quick exit if fsync is disabled or write() has already synced the WAL - * file. - */ - if (!enableFsync || - sync_method == SYNC_METHOD_OPEN || - sync_method == SYNC_METHOD_OPEN_DSYNC) - return; - - /* Measure I/O timing to sync the WAL file */ - if (track_wal_io_timing) - INSTR_TIME_SET_CURRENT(start); - - pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); - switch (sync_method) - { - case SYNC_METHOD_FSYNC: - if (pg_fsync_no_writethrough(fd) != 0) - msg = _("could not fsync file \"%s\": %m"); - break; -#ifdef HAVE_FSYNC_WRITETHROUGH - case SYNC_METHOD_FSYNC_WRITETHROUGH: - if (pg_fsync_writethrough(fd) != 0) - msg = _("could not fsync write-through file \"%s\": %m"); - break; -#endif -#ifdef HAVE_FDATASYNC - case SYNC_METHOD_FDATASYNC: - if (pg_fdatasync(fd) != 0) - msg = _("could not fdatasync file \"%s\": %m"); - break; -#endif - case SYNC_METHOD_OPEN: - case SYNC_METHOD_OPEN_DSYNC: - /* not reachable */ - Assert(false); - break; - default: - elog(PANIC, "unrecognized wal_sync_method: %d", sync_method); - break; - } - - /* PANIC if failed to fsync */ - if (msg) - { - char xlogfname[MAXFNAMELEN]; - int save_errno = errno; - - XLogFileName(xlogfname, ThisTimeLineID, segno, - wal_segment_size); - errno = save_errno; - ereport(PANIC, - (errcode_for_file_access(), - errmsg(msg, xlogfname))); - } - - pgstat_report_wait_end(); - - /* - * Increment the I/O timing and the number of times WAL files were synced. - */ - if (track_wal_io_timing) - { - instr_time duration; - - INSTR_TIME_SET_CURRENT(duration); - INSTR_TIME_SUBTRACT(duration, start); - WalStats.m_wal_sync_time += INSTR_TIME_GET_MICROSEC(duration); - } - - WalStats.m_wal_sync++; -} - -/* - * 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. - * - * If "tablespaces" isn't NULL, it receives a list of tablespaceinfo structs - * describing the cluster's tablespaces. - * - * tblspcmapfile is required mainly for tar format in windows as native windows - * utilities are not able to create symlinks while extracting files from tar. - * However for consistency, the same is used for all platforms. - * - * 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(). - * - * 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, - StringInfo labelfile, List **tablespaces, - StringInfo tblspcmapfile) -{ - bool exclusive = (labelfile == NULL); - bool backup_started_in_recovery = false; - XLogRecPtr checkpointloc; - XLogRecPtr startpoint; - TimeLineID starttli; - pg_time_t stamp_time; - 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. - */ - if (!backup_started_in_recovery && !XLogIsNeeded()) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL level not sufficient for making an online backup"), - errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); - - if (strlen(backupidstr) > MAXPGPATH) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("backup label too long (max %d bytes)", - MAXPGPATH))); - - /* - * Mark backup active in shared memory. We must do full-page WAL writes - * during an on-line backup even if not doing so at other times, because - * it's quite possible for the backup dump to obtain a "torn" (partially - * written) copy of a database page if it reads the page concurrently with - * our write to the same page. This can be fixed as long as the first - * write to the page in the WAL sequence is a full-page write. Hence, we - * turn on forcePageWrites and then force a CHECKPOINT, to ensure there - * are no dirty pages in shared memory that might get dumped while the - * backup is in progress without having a corresponding WAL record. (Once - * the backup is complete, we need not force full-page writes anymore, - * since we expect that any pages not modified during the backup interval - * must have been correctly captured by the backup.) - * - * Note that forcePageWrites has no effect during an online backup from - * the standby. - * - * We must hold all the insertion locks to change the value of - * forcePageWrites, to ensure adequate interlocking against - * 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.forcePageWrites = true; - WALInsertLockRelease(); - - /* Ensure we release forcePageWrites if fail below */ - PG_ENSURE_ERROR_CLEANUP(pg_start_backup_callback, (Datum) BoolGetDatum(exclusive)); - { - bool gotUniqueStartpoint = false; - DIR *tblspcdir; - struct dirent *de; - tablespaceinfo *ti; - int datadirpathlen; - - /* - * 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 - * 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 - * pg_wal directory was not included in the base backup and the WAL - * archive was cleared too before starting the backup. - * - * This also ensures that we have emitted a WAL page header that has - * XLP_BKP_REMOVABLE off before we emit the checkpoint record. - * Therefore, if a WAL archiver (such as pglesslog) is trying to - * compress out removable backup blocks, it won't remove any that - * occur after this point. - * - * During recovery, we skip forcing XLOG file switch, which means that - * the backup taken during recovery is not available for the special - * recovery case described above. - */ - if (!backup_started_in_recovery) - RequestXLogSwitch(false); - - do - { - bool checkpointfpw; - - /* - * Force a CHECKPOINT. Aside from being necessary to prevent torn - * page problems, this guarantees that two successive backup runs - * will have different checkpoint positions and hence different - * history file names, even if nothing happened in between. - * - * During recovery, establish a restartpoint if possible. We use - * the last restartpoint as the backup starting checkpoint. This - * means that two successive backup runs can have same checkpoint - * positions. - * - * Since the fact that we are executing do_pg_start_backup() - * during recovery means that checkpointer is running, we can use - * RequestCheckpoint() to establish a restartpoint. - * - * We use CHECKPOINT_IMMEDIATE only if requested by user (via - * passing fast = true). Otherwise this can take awhile. - */ - RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | - (fast ? CHECKPOINT_IMMEDIATE : 0)); - - /* - * Now we need to fetch the checkpoint record location, and also - * its REDO pointer. The oldest point in WAL that would be needed - * to restore starting from the checkpoint is precisely the REDO - * pointer. - */ - LWLockAcquire(ControlFileLock, LW_SHARED); - checkpointloc = ControlFile->checkPoint; - startpoint = ControlFile->checkPointCopy.redo; - starttli = ControlFile->checkPointCopy.ThisTimeLineID; - checkpointfpw = ControlFile->checkPointCopy.fullPageWrites; - LWLockRelease(ControlFileLock); - - if (backup_started_in_recovery) - { - XLogRecPtr recptr; - - /* - * Check to see if all WAL replayed during online backup - * (i.e., since last restartpoint used as backup starting - * checkpoint) contain full-page writes. - */ - SpinLockAcquire(&XLogCtl->info_lck); - recptr = XLogCtl->lastFpwDisableRecPtr; - SpinLockRelease(&XLogCtl->info_lck); - - if (!checkpointfpw || startpoint <= recptr) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL generated with full_page_writes=off was replayed " - "since last restartpoint"), - errhint("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."))); - - /* - * During recovery, since we don't use the end-of-backup WAL - * record and don't write the backup history file, the - * starting WAL location doesn't need to be unique. This means - * that two base backups started at the same time might use - * the same checkpoint as starting locations. - */ - gotUniqueStartpoint = true; - } - - /* - * If two base backups are started at the same time (in WAL sender - * processes), we need to make sure that they use different - * checkpoints as starting locations, because we use the starting - * WAL location as a unique identifier for the base backup in the - * end-of-backup WAL record and when we write the backup history - * file. Perhaps it would be better generate a separate unique ID - * for each backup instead of forcing another checkpoint, but - * taking a checkpoint right after another is not that expensive - * either because only few buffers have been dirtied yet. - */ - WALInsertLockAcquireExclusive(); - if (XLogCtl->Insert.lastBackupStart < startpoint) - { - XLogCtl->Insert.lastBackupStart = startpoint; - gotUniqueStartpoint = true; - } - WALInsertLockRelease(); - } while (!gotUniqueStartpoint); - - XLByteToSeg(startpoint, _logSegNo, wal_segment_size); - XLogFileName(xlogfilename, starttli, _logSegNo, wal_segment_size); - - /* - * Construct tablespace_map file. If caller isn't interested in this, - * we make a local StringInfo. - */ - if (tblspcmapfile == NULL) - tblspcmapfile = makeStringInfo(); - - datadirpathlen = strlen(DataDir); - - /* Collect information about all tablespaces */ - tblspcdir = AllocateDir("pg_tblspc"); - while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL) - { - char fullpath[MAXPGPATH + 10]; - char linkpath[MAXPGPATH]; - char *relpath = NULL; - int rllen; - StringInfoData escapedpath; - char *s; - - /* Skip anything that doesn't look like a tablespace */ - if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) - continue; - - 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. - */ - if (get_dirent_type(fullpath, de, false, ERROR) != PGFILETYPE_LNK) - continue; - -#if defined(HAVE_READLINK) || defined(WIN32) - rllen = readlink(fullpath, linkpath, sizeof(linkpath)); - if (rllen < 0) - { - ereport(WARNING, - (errmsg("could not read symbolic link \"%s\": %m", - fullpath))); - continue; - } - else if (rllen >= sizeof(linkpath)) - { - ereport(WARNING, - (errmsg("symbolic link \"%s\" target is too long", - fullpath))); - continue; - } - linkpath[rllen] = '\0'; - - /* - * Build a backslash-escaped version of the link path to include - * in the tablespace map file. - */ - initStringInfo(&escapedpath); - for (s = linkpath; *s; s++) - { - if (*s == '\n' || *s == '\r' || *s == '\\') - appendStringInfoChar(&escapedpath, '\\'); - appendStringInfoChar(&escapedpath, *s); - } - - /* - * Relpath holds the relative path of the tablespace directory - * when it's located within PGDATA, or NULL if it's located - * elsewhere. - */ - if (rllen > datadirpathlen && - strncmp(linkpath, DataDir, datadirpathlen) == 0 && - IS_DIR_SEP(linkpath[datadirpathlen])) - relpath = linkpath + datadirpathlen + 1; - - ti = palloc(sizeof(tablespaceinfo)); - ti->oid = pstrdup(de->d_name); - ti->path = pstrdup(linkpath); - ti->rpath = relpath ? pstrdup(relpath) : NULL; - ti->size = -1; - - if (tablespaces) - *tablespaces = lappend(*tablespaces, ti); - - appendStringInfo(tblspcmapfile, "%s %s\n", - ti->oid, escapedpath.data); + xlrec.rp_time = GetCurrentTimestamp(); + strlcpy(xlrec.rp_name, rpName, MAXFNAMELEN); - pfree(escapedpath.data); -#else + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(xl_restore_point)); - /* - * If the platform does not have symbolic links, it should not be - * possible to have tablespaces - clearly somebody else created - * them. Warn about it and ignore. - */ - ereport(WARNING, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("tablespaces are not supported on this platform"))); -#endif - } - FreeDir(tblspcdir); + RecPtr = XLogInsert(RM_XLOG_ID, XLOG_RESTORE_POINT); - /* - * Construct backup label file. If caller isn't interested in this, - * we make a local StringInfo. - */ - if (labelfile == NULL) - labelfile = makeStringInfo(); + ereport(LOG, + (errmsg("restore point \"%s\" created at %X/%X", + rpName, LSN_FORMAT_ARGS(RecPtr)))); - /* Use the log timezone here, not the session timezone */ - stamp_time = (pg_time_t) time(NULL); - pg_strftime(strfbuf, sizeof(strfbuf), - "%Y-%m-%d %H:%M:%S %Z", - pg_localtime(&stamp_time, log_timezone)); - appendStringInfo(labelfile, "START WAL LOCATION: %X/%X (file %s)\n", - 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 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); + return RecPtr; +} +/* + * Check if any of the GUC parameters that are critical for hot standby + * have changed, and update the value in pg_control file if necessary. + */ +static void +XLogReportParameters(void) +{ + if (wal_level != ControlFile->wal_level || + wal_log_hints != ControlFile->wal_log_hints || + MaxConnections != ControlFile->MaxConnections || + max_worker_processes != ControlFile->max_worker_processes || + max_wal_senders != ControlFile->max_wal_senders || + max_prepared_xacts != ControlFile->max_prepared_xacts || + max_locks_per_xact != ControlFile->max_locks_per_xact || + track_commit_timestamp != ControlFile->track_commit_timestamp) + { /* - * Okay, write the file, or return its contents to caller. + * The change in number of backend slots doesn't need to be WAL-logged + * if archiving is not enabled, as you can't start archive recovery + * with wal_level=minimal anyway. We don't really care about the + * values in pg_control either if wal_level=minimal, but seems better + * to keep them up-to-date to avoid confusion. */ - if (exclusive) + if (wal_level != ControlFile->wal_level || XLogIsNeeded()) { - /* - * 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))); + xl_parameter_change xlrec; + XLogRecPtr recptr; - fp = AllocateFile(BACKUP_LABEL_FILE, "w"); + xlrec.MaxConnections = MaxConnections; + xlrec.max_worker_processes = max_worker_processes; + xlrec.max_wal_senders = max_wal_senders; + xlrec.max_prepared_xacts = max_prepared_xacts; + xlrec.max_locks_per_xact = max_locks_per_xact; + xlrec.wal_level = wal_level; + xlrec.wal_log_hints = wal_log_hints; + xlrec.track_commit_timestamp = track_commit_timestamp; - 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))); + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - fp = AllocateFile(TABLESPACE_MAP, "w"); + recptr = XLogInsert(RM_XLOG_ID, XLOG_PARAMETER_CHANGE); + XLogFlush(recptr); + } - 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))); - } + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - /* Allocated locally for exclusive backups, so free separately */ - pfree(tblspcmapfile->data); - pfree(tblspcmapfile); - } + ControlFile->MaxConnections = MaxConnections; + ControlFile->max_worker_processes = max_worker_processes; + ControlFile->max_wal_senders = max_wal_senders; + ControlFile->max_prepared_xacts = max_prepared_xacts; + ControlFile->max_locks_per_xact = max_locks_per_xact; + ControlFile->wal_level = wal_level; + ControlFile->wal_log_hints = wal_log_hints; + ControlFile->track_commit_timestamp = track_commit_timestamp; + UpdateControlFile(); + + LWLockRelease(ControlFileLock); } - PG_END_ENSURE_ERROR_CLEANUP(pg_start_backup_callback, (Datum) BoolGetDatum(exclusive)); +} + +/* + * Update full_page_writes in shared memory, and write an + * XLOG_FPW_CHANGE record if necessary. + * + * Note: this function assumes there is no other process running + * concurrently that could update it. + */ +void +UpdateFullPageWrites(void) +{ + XLogCtlInsert *Insert = &XLogCtl->Insert; + bool recoveryInProgress; /* - * Mark that start phase has correctly finished for an exclusive backup. - * Session-level locks are updated as well to reflect that state. + * Do nothing if full_page_writes has not been changed. * - * 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. + * It's safe to check the shared full_page_writes without the lock, + * because we assume that there is no concurrently running process which + * can update it. */ - 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; + if (fullPageWrites == Insert->fullPageWrites) + return; /* - * We're done. As a convenience, return the starting WAL location. + * Perform this outside critical section so that the WAL insert + * initialization done by RecoveryInProgress() doesn't trigger an + * assertion failure. */ - if (starttli_p) - *starttli_p = starttli; - return startpoint; -} + recoveryInProgress = RecoveryInProgress(); -/* Error cleanup callback for pg_start_backup */ -static void -pg_start_backup_callback(int code, Datum arg) -{ - bool exclusive = DatumGetBool(arg); + START_CRIT_SECTION(); - /* Update backup counters and forcePageWrites on failure */ - WALInsertLockAcquireExclusive(); - if (exclusive) - { - Assert(XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_STARTING); - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_NONE; - } - else + /* + * It's always safe to take full page images, even when not strictly + * required, but not the other round. So if we're setting full_page_writes + * to true, first set it true and then write the WAL record. If we're + * setting it to false, first write the WAL record and then set the global + * flag. + */ + if (fullPageWrites) { - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; + WALInsertLockAcquireExclusive(); + Insert->fullPageWrites = true; + WALInsertLockRelease(); } - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) + /* + * Write an XLOG_FPW_CHANGE record. This allows us to keep track of + * full_page_writes during archive recovery, if required. + */ + if (XLogStandbyInfoActive() && !recoveryInProgress) { - XLogCtl->Insert.forcePageWrites = false; - } - WALInsertLockRelease(); -} + XLogBeginInsert(); + XLogRegisterData((char *) (&fullPageWrites), sizeof(bool)); -/* - * Error cleanup callback for pg_stop_backup - */ -static void -pg_stop_backup_callback(int code, Datum arg) -{ - bool exclusive = DatumGetBool(arg); + XLogInsert(RM_XLOG_ID, XLOG_FPW_CHANGE); + } - /* Update backup status on failure */ - WALInsertLockAcquireExclusive(); - if (exclusive) + if (!fullPageWrites) { - Assert(XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_STOPPING); - XLogCtl->Insert.exclusiveBackupState = EXCLUSIVE_BACKUP_IN_PROGRESS; + WALInsertLockAcquireExclusive(); + Insert->fullPageWrites = false; + WALInsertLockRelease(); } - WALInsertLockRelease(); -} - -/* - * Utility routine to fetch the session-level status of a backup running. - */ -SessionBackupState -get_backup_status(void) -{ - return sessionBackupState; + END_CRIT_SECTION(); } /* - * do_pg_stop_backup - * - * 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'. + * XLOG resource manager's routines * - * Returns the last WAL location that must be present to restore from this - * backup, and the corresponding timeline ID in *stoptli_p. + * Definitions of info values are in include/catalog/pg_control.h, though + * not all record types are related to control file updates. * - * It is the responsibility of the caller of this function to verify the - * permissions of the calling user! + * NOTE: Some XLOG record types that are directly related to WAL recovery + * are handled in xlogrecovery_redo(). */ -XLogRecPtr -do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) +void +xlog_redo(XLogReaderState *record) { - bool exclusive = (labelfile == NULL); - bool backup_started_in_recovery = false; - XLogRecPtr startpoint; - XLogRecPtr stoppoint; - TimeLineID stoptli; - pg_time_t stamp_time; - char strfbuf[128]; - char histfilepath[MAXPGPATH]; - char startxlogfilename[MAXFNAMELEN]; - char stopxlogfilename[MAXFNAMELEN]; - char lastxlogfilename[MAXFNAMELEN]; - char histfilename[MAXFNAMELEN]; - char backupfrom[20]; - XLogSegNo _logSegNo; - FILE *lfp; - FILE *fp; - char ch; - int seconds_before_warning; - int waits = 0; - bool reported_waiting = false; - char *remaining; - char *ptr; - uint32 hi, - lo; + uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; + XLogRecPtr lsn = record->EndRecPtr; + + /* + * In XLOG rmgr, backup blocks are only used by XLOG_FPI and + * XLOG_FPI_FOR_HINT records. + */ + Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT || + !XLogRecHasAnyBlockRefs(record)); + + if (info == XLOG_NEXTOID) + { + Oid nextOid; + + /* + * We used to try to take the maximum of ShmemVariableCache->nextOid + * and the recorded nextOid, but that fails if the OID counter wraps + * around. Since no OID allocation should be happening during replay + * anyway, better to just believe the record exactly. We still take + * OidGenLock while setting the variable, just in case. + */ + memcpy(&nextOid, XLogRecGetData(record), sizeof(Oid)); + LWLockAcquire(OidGenLock, LW_EXCLUSIVE); + ShmemVariableCache->nextOid = nextOid; + ShmemVariableCache->oidCount = 0; + LWLockRelease(OidGenLock); + } + else if (info == XLOG_CHECKPOINT_SHUTDOWN) + { + CheckPoint checkPoint; + TimeLineID replayTLI; - backup_started_in_recovery = RecoveryInProgress(); + memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); + /* In a SHUTDOWN checkpoint, believe the counters exactly */ + LWLockAcquire(XidGenLock, LW_EXCLUSIVE); + ShmemVariableCache->nextXid = checkPoint.nextXid; + LWLockRelease(XidGenLock); + LWLockAcquire(OidGenLock, LW_EXCLUSIVE); + ShmemVariableCache->nextOid = checkPoint.nextOid; + ShmemVariableCache->oidCount = 0; + LWLockRelease(OidGenLock); + MultiXactSetNextMXact(checkPoint.nextMulti, + checkPoint.nextMultiOffset); - /* - * 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."))); + MultiXactAdvanceOldest(checkPoint.oldestMulti, + checkPoint.oldestMultiDB); - /* - * 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. - */ - if (!backup_started_in_recovery && !XLogIsNeeded()) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL level not sufficient for making an online backup"), - errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); + /* + * No need to set oldestClogXid here as well; it'll be set when we + * redo an xl_clog_truncate if it changed since initialization. + */ + SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); - 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(). + * If we see a shutdown checkpoint while waiting for an end-of-backup + * record, the backup was canceled and the end-of-backup record will + * never arrive. */ - 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(); + if (ArchiveRecoveryRequested && + !XLogRecPtrIsInvalid(ControlFile->backupStartPoint) && + XLogRecPtrIsInvalid(ControlFile->backupEndPoint)) + ereport(PANIC, + (errmsg("online backup was canceled, recovery cannot continue"))); /* - * Remove backup_label. In case of failure, the state for an exclusive - * backup is switched back to in-progress. + * If we see a shutdown checkpoint, we know that nothing was running + * on the primary at this point. So fake-up an empty running-xacts + * record and use that here and now. Recover additional standby state + * for prepared transactions. */ - PG_ENSURE_ERROR_CLEANUP(pg_stop_backup_callback, (Datum) BoolGetDatum(exclusive)); + if (standbyState >= STANDBY_INITIALIZED) { - /* - * 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"))); - } + TransactionId *xids; + int nxids; + TransactionId oldestActiveXID; + TransactionId latestCompletedXid; + RunningTransactionsData running; - 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'; + oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); /* - * Close and remove the backup label file + * Construct a RunningTransactions snapshot representing a shut + * down server, with only prepared transactions still alive. We're + * never overflowed at this point because all subxids are listed + * with their parent prepared transactions. */ - 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); + running.xcnt = nxids; + running.subxcnt = 0; + running.subxid_overflow = false; + running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); + running.oldestRunningXid = oldestActiveXID; + latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); + TransactionIdRetreat(latestCompletedXid); + Assert(TransactionIdIsNormal(latestCompletedXid)); + running.latestCompletedXid = latestCompletedXid; + running.xids = xids; - /* - * Remove tablespace_map file if present, it is created only if - * there are tablespaces. - */ - durable_unlink(TABLESPACE_MAP, DEBUG1); + ProcArrayApplyRecoveryInfo(&running); + + StandbyRecoverPreparedTransactions(); } - PG_END_ENSURE_ERROR_CLEANUP(pg_stop_backup_callback, (Datum) BoolGetDatum(exclusive)); - } - /* - * 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; + /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; + LWLockRelease(ControlFileLock); + + /* Update shared-memory copy of checkpoint XID/epoch */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->ckptFullXid = checkPoint.nextXid; + SpinLockRelease(&XLogCtl->info_lck); + + /* + * We should've already switched to the new TLI before replaying this + * record. + */ + (void) GetCurrentReplayRecPtr(&replayTLI); + if (checkPoint.ThisTimeLineID != replayTLI) + ereport(PANIC, + (errmsg("unexpected timeline ID %u (should be %u) in shutdown checkpoint record", + checkPoint.ThisTimeLineID, replayTLI))); + + RecoveryRestartPoint(&checkPoint, record); } - else + else if (info == XLOG_CHECKPOINT_ONLINE) { + CheckPoint checkPoint; + TimeLineID replayTLI; + + memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); + /* In an ONLINE checkpoint, treat the XID counter as a minimum */ + LWLockAcquire(XidGenLock, LW_EXCLUSIVE); + if (FullTransactionIdPrecedes(ShmemVariableCache->nextXid, + checkPoint.nextXid)) + ShmemVariableCache->nextXid = checkPoint.nextXid; + LWLockRelease(XidGenLock); + /* - * 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. + * We ignore the nextOid counter in an ONLINE checkpoint, preferring + * to track OID assignment through XLOG_NEXTOID records. The nextOid + * counter is from the start of the checkpoint and might well be stale + * compared to later XLOG_NEXTOID records. We could try to take the + * maximum of the nextOid counter and our latest value, but since + * there's no particular guarantee about the speed with which the OID + * counter wraps around, that's a risky thing to do. In any case, + * users of the nextOid counter are required to avoid assignment of + * duplicates, so that a somewhat out-of-date value should be safe. */ - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; - } - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) - { - XLogCtl->Insert.forcePageWrites = false; - } + /* Handle multixact */ + MultiXactAdvanceNextMXact(checkPoint.nextMulti, + checkPoint.nextMultiOffset); - /* - * Clean up session-level lock. - * - * You might think that WALInsertLockRelease() can be called before - * cleaning up session-level lock because session-level lock doesn't need - * to be protected with WAL insertion lock. But since - * CHECK_FOR_INTERRUPTS() can occur in it, session-level lock must be - * cleaned up before it. - */ - sessionBackupState = SESSION_BACKUP_NONE; + /* + * NB: This may perform multixact truncation when replaying WAL + * generated by an older primary. + */ + MultiXactAdvanceOldest(checkPoint.oldestMulti, + checkPoint.oldestMultiDB); + if (TransactionIdPrecedes(ShmemVariableCache->oldestXid, + checkPoint.oldestXid)) + SetTransactionIdLimit(checkPoint.oldestXid, + checkPoint.oldestXidDB); + /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->checkPointCopy.nextXid = checkPoint.nextXid; + LWLockRelease(ControlFileLock); - WALInsertLockRelease(); + /* Update shared-memory copy of checkpoint XID/epoch */ + SpinLockAcquire(&XLogCtl->info_lck); + XLogCtl->ckptFullXid = checkPoint.nextXid; + SpinLockRelease(&XLogCtl->info_lck); - /* - * Read and parse the START WAL LOCATION line (this code is pretty crude, - * but we are not expecting any variability in the file format). - */ - if (sscanf(labelfile, "START WAL LOCATION: %X/%X (file %24s)%c", - &hi, &lo, startxlogfilename, - &ch) != 4 || ch != '\n') - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); - startpoint = ((uint64) hi) << 32 | lo; - remaining = strchr(labelfile, '\n') + 1; /* %n is not portable enough */ + /* TLI should not change in an on-line checkpoint */ + (void) GetCurrentReplayRecPtr(&replayTLI); + if (checkPoint.ThisTimeLineID != replayTLI) + ereport(PANIC, + (errmsg("unexpected timeline ID %u (should be %u) in online checkpoint record", + checkPoint.ThisTimeLineID, replayTLI))); - /* - * Parse the BACKUP FROM line. If we are taking an online backup from the - * standby, we confirm that the standby has not been promoted during the - * backup. - */ - ptr = strstr(remaining, "BACKUP FROM:"); - if (!ptr || sscanf(ptr, "BACKUP FROM: %19s\n", backupfrom) != 1) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); - if (strcmp(backupfrom, "standby") == 0 && !backup_started_in_recovery) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("the standby was promoted during online backup"), - errhint("This means that the backup being taken is corrupt " - "and should not be used. " - "Try taking another online backup."))); + RecoveryRestartPoint(&checkPoint, record); + } + else if (info == XLOG_OVERWRITE_CONTRECORD) + { + /* nothing to do here, handled in xlogrecovery_redo() */ + } + else if (info == XLOG_END_OF_RECOVERY) + { + xl_end_of_recovery xlrec; + TimeLineID replayTLI; - /* - * During recovery, we don't write an end-of-backup record. We assume that - * pg_control was backed up last and its minimum recovery point can be - * available as the backup end location. Since we don't have an - * end-of-backup record, we use the pg_control value to check whether - * we've reached the end of backup when starting recovery from this - * backup. We have no way of checking if pg_control wasn't backed up last - * however. - * - * We don't force a switch to new WAL file but it is still possible to - * wait for all the required files to be archived if waitforarchive is - * true. This is okay if we use the backup to start a standby and fetch - * the missing WAL using streaming replication. But in the case of an - * archive recovery, a user should set waitforarchive to true and wait for - * them to be archived to ensure that all the required files are - * available. - * - * We return the current minimum recovery point as the backup end - * location. Note that it can be greater than the exact backup end - * location if the minimum recovery point is updated after the backup of - * pg_control. This is harmless for current uses. - * - * XXX currently a backup history file is for informational and debug - * purposes only. It's not essential for an online backup. Furthermore, - * even if it's created, it will not be archived during recovery because - * an archiver is not invoked. So it doesn't seem worthwhile to write a - * backup history file during recovery. - */ - if (backup_started_in_recovery) + memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_end_of_recovery)); + + /* + * For Hot Standby, we could treat this like a Shutdown Checkpoint, + * but this case is rarer and harder to test, so the benefit doesn't + * outweigh the potential extra cost of maintenance. + */ + + /* + * We should've already switched to the new TLI before replaying this + * record. + */ + (void) GetCurrentReplayRecPtr(&replayTLI); + if (xlrec.ThisTimeLineID != replayTLI) + ereport(PANIC, + (errmsg("unexpected timeline ID %u (should be %u) in end-of-recovery record", + xlrec.ThisTimeLineID, replayTLI))); + } + else if (info == XLOG_NOOP) + { + /* nothing to do here */ + } + else if (info == XLOG_SWITCH) + { + /* nothing to do here */ + } + else if (info == XLOG_RESTORE_POINT) + { + /* nothing to do here, handled in xlogrecovery.c */ + } + else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT) { - XLogRecPtr recptr; - /* - * Check to see if all WAL replayed during online backup contain - * full-page writes. + * XLOG_FPI records contain nothing else but one or more block + * references. Every block reference must include a full-page image + * even if full_page_writes was disabled when the record was generated + * - otherwise there would be no point in this record. + * + * XLOG_FPI_FOR_HINT records are generated when a page needs to be + * WAL-logged because of a hint bit update. They are only generated + * when checksums and/or wal_log_hints are enabled. They may include + * no full-page images if full_page_writes was disabled when they were + * generated. In this case there is nothing to do here. + * + * No recovery conflicts are generated by these generic records - if a + * resource manager needs to generate conflicts, it has to define a + * separate WAL record type and redo routine. */ - SpinLockAcquire(&XLogCtl->info_lck); - recptr = XLogCtl->lastFpwDisableRecPtr; - SpinLockRelease(&XLogCtl->info_lck); - - if (startpoint <= recptr) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL generated with full_page_writes=off was replayed " - "during online backup"), - errhint("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."))); + for (uint8 block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + Buffer buffer; + if (!XLogRecHasBlockImage(record, block_id)) + { + if (info == XLOG_FPI) + elog(ERROR, "XLOG_FPI record did not contain a full-page image"); + continue; + } - LWLockAcquire(ControlFileLock, LW_SHARED); - stoppoint = ControlFile->minRecoveryPoint; - stoptli = ControlFile->minRecoveryPointTLI; - LWLockRelease(ControlFileLock); + if (XLogReadBufferForRedo(record, block_id, &buffer) != BLK_RESTORED) + elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block"); + UnlockReleaseBuffer(buffer); + } } - else + else if (info == XLOG_BACKUP_END) { - /* - * Write the backup-end xlog record - */ - XLogBeginInsert(); - XLogRegisterData((char *) (&startpoint), sizeof(startpoint)); - stoppoint = XLogInsert(RM_XLOG_ID, XLOG_BACKUP_END); - stoptli = ThisTimeLineID; + /* nothing to do here, handled in xlogrecovery_redo() */ + } + else if (info == XLOG_PARAMETER_CHANGE) + { + xl_parameter_change xlrec; + + /* Update our copy of the parameters in pg_control */ + memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_parameter_change)); + + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->MaxConnections = xlrec.MaxConnections; + ControlFile->max_worker_processes = xlrec.max_worker_processes; + ControlFile->max_wal_senders = xlrec.max_wal_senders; + ControlFile->max_prepared_xacts = xlrec.max_prepared_xacts; + ControlFile->max_locks_per_xact = xlrec.max_locks_per_xact; + ControlFile->wal_level = xlrec.wal_level; + ControlFile->wal_log_hints = xlrec.wal_log_hints; /* - * Force a switch to a new xlog segment file, so that the backup is - * valid as soon as archiver moves out the current segment file. + * Update minRecoveryPoint to ensure that if recovery is aborted, we + * recover back up to this point before allowing hot standby again. + * This is important if the max_* settings are decreased, to ensure + * you don't run queries against the WAL preceding the change. The + * local copies cannot be updated as long as crash recovery is + * happening and we expect all the WAL to be replayed. */ - RequestXLogSwitch(false); + if (InArchiveRecovery) + { + LocalMinRecoveryPoint = ControlFile->minRecoveryPoint; + LocalMinRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + } + if (LocalMinRecoveryPoint != InvalidXLogRecPtr && LocalMinRecoveryPoint < lsn) + { + TimeLineID replayTLI; - XLByteToPrevSeg(stoppoint, _logSegNo, wal_segment_size); - XLogFileName(stopxlogfilename, stoptli, _logSegNo, wal_segment_size); + (void) GetCurrentReplayRecPtr(&replayTLI); + ControlFile->minRecoveryPoint = lsn; + ControlFile->minRecoveryPointTLI = replayTLI; + } - /* Use the log timezone here, not the session timezone */ - stamp_time = (pg_time_t) time(NULL); - pg_strftime(strfbuf, sizeof(strfbuf), - "%Y-%m-%d %H:%M:%S %Z", - pg_localtime(&stamp_time, log_timezone)); + CommitTsParameterChange(xlrec.track_commit_timestamp, + ControlFile->track_commit_timestamp); + ControlFile->track_commit_timestamp = xlrec.track_commit_timestamp; - /* - * Write the backup history file - */ - XLByteToSeg(startpoint, _logSegNo, wal_segment_size); - BackupHistoryFilePath(histfilepath, stoptli, _logSegNo, - startpoint, wal_segment_size); - fp = AllocateFile(histfilepath, "w"); - if (!fp) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not create file \"%s\": %m", - histfilepath))); - fprintf(fp, "START WAL LOCATION: %X/%X (file %s)\n", - LSN_FORMAT_ARGS(startpoint), startxlogfilename); - fprintf(fp, "STOP WAL LOCATION: %X/%X (file %s)\n", - LSN_FORMAT_ARGS(stoppoint), stopxlogfilename); + UpdateControlFile(); + LWLockRelease(ControlFileLock); - /* - * Transfer remaining lines including label and start timeline to - * history file. - */ - fprintf(fp, "%s", remaining); - fprintf(fp, "STOP TIME: %s\n", strfbuf); - fprintf(fp, "STOP TIMELINE: %u\n", stoptli); - if (fflush(fp) || ferror(fp) || FreeFile(fp)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write file \"%s\": %m", - histfilepath))); + /* Check to see if any parameter change gives a problem on recovery */ + CheckRequiredParameterValues(); + } + else if (info == XLOG_FPW_CHANGE) + { + bool fpw; + + memcpy(&fpw, XLogRecGetData(record), sizeof(bool)); /* - * Clean out any no-longer-needed history files. As a side effect, - * this will post a .ready file for the newly created history file, - * notifying the archiver that history file may be archived - * immediately. + * Update the LSN of the last replayed XLOG_FPW_CHANGE record so that + * do_pg_backup_start() and do_pg_backup_stop() can check whether + * full_page_writes has been disabled during online backup. */ - CleanupBackupHistory(); + if (!fpw) + { + SpinLockAcquire(&XLogCtl->info_lck); + if (XLogCtl->lastFpwDisableRecPtr < record->ReadRecPtr) + XLogCtl->lastFpwDisableRecPtr = record->ReadRecPtr; + SpinLockRelease(&XLogCtl->info_lck); + } + + /* Keep track of full_page_writes */ + lastFullPageWrites = fpw; } +} + +/* + * Return the (possible) sync flag used for opening a file, depending on the + * value of the GUC wal_sync_method. + */ +static int +get_sync_bit(int method) +{ + int o_direct_flag = 0; + + /* If fsync is disabled, never open in sync mode */ + if (!enableFsync) + return 0; /* - * If archiving is enabled, wait for all the required WAL files to be - * archived before returning. If archiving isn't enabled, the required WAL - * needs to be transported via streaming replication (hopefully with - * wal_keep_size set high enough), or some more exotic mechanism like - * polling and copying files from pg_wal with script. We have no knowledge - * of those mechanisms, so it's up to the user to ensure that he gets all - * the required WAL. - * - * We wait until both the last WAL file filled during backup and the - * history file have been archived, and assume that the alphabetic sorting - * property of the WAL files ensures any earlier WAL files are safely - * archived as well. + * Optimize writes by bypassing kernel cache with O_DIRECT when using + * O_SYNC/O_FSYNC and O_DSYNC. But only if archiving and streaming are + * disabled, otherwise the archive command or walsender process will read + * the WAL soon after writing it, which is guaranteed to cause a physical + * read if we bypassed the kernel cache. We also skip the + * posix_fadvise(POSIX_FADV_DONTNEED) call in XLogFileClose() for the same + * reason. * - * We wait forever, since archive_command is supposed to work and we - * assume the admin wanted his backup to work completely. If you don't - * wish to wait, then either waitforarchive should be passed in as false, - * or you can set statement_timeout. Also, some notices are issued to - * clue in anyone who might be doing this interactively. + * Never use O_DIRECT in walreceiver process for similar reasons; the WAL + * written by walreceiver is normally read by the startup process soon + * after it's written. Also, walreceiver performs unaligned writes, which + * don't work with O_DIRECT, so it is required for correctness too. */ + if (!XLogIsNeeded() && !AmWalReceiverProcess()) + o_direct_flag = PG_O_DIRECT; - if (waitforarchive && - ((!backup_started_in_recovery && XLogArchivingActive()) || - (backup_started_in_recovery && XLogArchivingAlways()))) + switch (method) { - XLByteToPrevSeg(stoppoint, _logSegNo, wal_segment_size); - XLogFileName(lastxlogfilename, stoptli, _logSegNo, wal_segment_size); - - XLByteToSeg(startpoint, _logSegNo, wal_segment_size); - BackupHistoryFileName(histfilename, stoptli, _logSegNo, - startpoint, wal_segment_size); - - seconds_before_warning = 60; - waits = 0; + /* + * enum values for all sync options are defined even if they are + * not supported on the current platform. But if not, they are + * not included in the enum option array, and therefore will never + * be seen here. + */ + case SYNC_METHOD_FSYNC: + case SYNC_METHOD_FSYNC_WRITETHROUGH: + case SYNC_METHOD_FDATASYNC: + return 0; +#ifdef OPEN_SYNC_FLAG + case SYNC_METHOD_OPEN: + return OPEN_SYNC_FLAG | o_direct_flag; +#endif +#ifdef OPEN_DATASYNC_FLAG + case SYNC_METHOD_OPEN_DSYNC: + return OPEN_DATASYNC_FLAG | o_direct_flag; +#endif + default: + /* can't happen (unless we are out of sync with option array) */ + elog(ERROR, "unrecognized wal_sync_method: %d", method); + return 0; /* silence warning */ + } +} - while (XLogArchiveIsBusy(lastxlogfilename) || - XLogArchiveIsBusy(histfilename)) +/* + * GUC support + */ +void +assign_xlog_sync_method(int new_sync_method, void *extra) +{ + if (sync_method != new_sync_method) + { + /* + * To ensure that no blocks escape unsynced, force an fsync on the + * currently open log segment (if any). Also, if the open flag is + * changing, close the log file so it will be reopened (with new flag + * bit) at next use. + */ + if (openLogFile >= 0) { - CHECK_FOR_INTERRUPTS(); - - if (!reported_waiting && waits > 5) + pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN); + if (pg_fsync(openLogFile) != 0) { - ereport(NOTICE, - (errmsg("base backup done, waiting for required WAL segments to be archived"))); - reported_waiting = true; + char xlogfname[MAXFNAMELEN]; + int save_errno; + + save_errno = errno; + XLogFileName(xlogfname, openLogTLI, openLogSegNo, + wal_segment_size); + errno = save_errno; + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", xlogfname))); } - pgstat_report_wait_start(WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE); - pg_usleep(1000000L); pgstat_report_wait_end(); - - if (++waits >= seconds_before_warning) - { - seconds_before_warning *= 2; /* This wraps in >10 years... */ - ereport(WARNING, - (errmsg("still waiting for all required WAL segments to be archived (%d seconds elapsed)", - waits), - errhint("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."))); - } + if (get_sync_bit(sync_method) != get_sync_bit(new_sync_method)) + XLogFileClose(); } - - ereport(NOTICE, - (errmsg("all required WAL segments have been archived"))); } - else if (waitforarchive) - ereport(NOTICE, - (errmsg("WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup"))); - - /* - * We're done. As a convenience, return the ending WAL location. - */ - if (stoptli_p) - *stoptli_p = stoptli; - return stoppoint; } /* - * do_pg_abort_backup: abort a running backup - * - * This does just the most basic steps of do_pg_stop_backup(), 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(). + * Issue appropriate kind of fsync (if any) for an XLOG output file. * - * NB: This gets used as a before_shmem_exit handler, hence the odd-looking - * signature. + * 'fd' is a file descriptor for the XLOG file to be fsync'd. + * 'segno' is for error reporting purposes. */ void -do_pg_abort_backup(int code, Datum arg) +issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { - bool emit_warning = DatumGetBool(arg); + char *msg = NULL; + instr_time start; + + Assert(tli != 0); /* - * Quick exit if session is not keeping around a non-exclusive backup - * already started. + * Quick exit if fsync is disabled or write() has already synced the WAL + * file. */ - if (sessionBackupState != SESSION_BACKUP_NON_EXCLUSIVE) + if (!enableFsync || + sync_method == SYNC_METHOD_OPEN || + sync_method == SYNC_METHOD_OPEN_DSYNC) return; - WALInsertLockAcquireExclusive(); - Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - XLogCtl->Insert.nonExclusiveBackups--; + /* Measure I/O timing to sync the WAL file */ + if (track_wal_io_timing) + INSTR_TIME_SET_CURRENT(start); + + pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); + switch (sync_method) + { + case SYNC_METHOD_FSYNC: + if (pg_fsync_no_writethrough(fd) != 0) + msg = _("could not fsync file \"%s\": %m"); + break; +#ifdef HAVE_FSYNC_WRITETHROUGH + case SYNC_METHOD_FSYNC_WRITETHROUGH: + if (pg_fsync_writethrough(fd) != 0) + msg = _("could not fsync write-through file \"%s\": %m"); + break; +#endif +#ifdef HAVE_FDATASYNC + case SYNC_METHOD_FDATASYNC: + if (pg_fdatasync(fd) != 0) + msg = _("could not fdatasync file \"%s\": %m"); + break; +#endif + case SYNC_METHOD_OPEN: + case SYNC_METHOD_OPEN_DSYNC: + /* not reachable */ + Assert(false); + break; + default: + elog(PANIC, "unrecognized wal_sync_method: %d", sync_method); + break; + } - if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && - XLogCtl->Insert.nonExclusiveBackups == 0) + /* PANIC if failed to fsync */ + if (msg) { - XLogCtl->Insert.forcePageWrites = false; + char xlogfname[MAXFNAMELEN]; + int save_errno = errno; + + XLogFileName(xlogfname, tli, segno, wal_segment_size); + errno = save_errno; + ereport(PANIC, + (errcode_for_file_access(), + errmsg(msg, xlogfname))); } - sessionBackupState = SESSION_BACKUP_NONE; - WALInsertLockRelease(); + pgstat_report_wait_end(); - if (emit_warning) - ereport(WARNING, - (errmsg("aborting backup due to backend exiting before pg_stop_backup was called"))); -} + /* + * Increment the I/O timing and the number of times WAL files were synced. + */ + if (track_wal_io_timing) + { + instr_time duration; -/* - * Register a handler that will warn about unterminated backups at end of - * session, unless this has already been done. - */ -void -register_persistent_abort_backup_handler(void) -{ - static bool already_done = false; + INSTR_TIME_SET_CURRENT(duration); + INSTR_TIME_SUBTRACT(duration, start); + PendingWalStats.wal_sync_time += INSTR_TIME_GET_MICROSEC(duration); + } - if (already_done) - return; - before_shmem_exit(do_pg_abort_backup, DatumGetBool(true)); - already_done = true; + PendingWalStats.wal_sync++; } /* - * Get latest redo apply position. + * 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. * - * Exported to allow WALReceiver to read the pointer directly. + * Input parameters are "backupidstr" (the backup label string) and "fast" + * (if true, we do the checkpoint in immediate mode to make it faster). + * + * The backup label and tablespace map contents are appended to *labelfile and + * *tblspcmapfile, and the caller is responsible for including them in the + * backup archive as 'backup_label' and 'tablespace_map'. + * tblspcmapfile is required mainly for tar format in windows as native windows + * utilities are not able to create symlinks while extracting files from tar. + * However for consistency and platform-independence, we do it the same way + * everywhere. + * + * If "tablespaces" isn't NULL, it receives a list of tablespaceinfo structs + * describing the cluster's tablespaces. + * + * 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 backup must be stopped by calling + * do_pg_backup_stop() or do_pg_abort_backup(). There can be many + * backups active at the same time. + * + * It is the responsibility of the caller of this function to verify the + * permissions of the calling user! */ XLogRecPtr -GetXLogReplayRecPtr(TimeLineID *replayTLI) +do_pg_backup_start(const char *backupidstr, bool fast, TimeLineID *starttli_p, + StringInfo labelfile, List **tablespaces, + StringInfo tblspcmapfile) { - XLogRecPtr recptr; - TimeLineID tli; + bool backup_started_in_recovery = false; + XLogRecPtr checkpointloc; + XLogRecPtr startpoint; + TimeLineID starttli; + pg_time_t stamp_time; + char strfbuf[128]; + char xlogfilename[MAXFNAMELEN]; + XLogSegNo _logSegNo; - SpinLockAcquire(&XLogCtl->info_lck); - recptr = XLogCtl->lastReplayedEndRecPtr; - tli = XLogCtl->lastReplayedTLI; - SpinLockRelease(&XLogCtl->info_lck); + backup_started_in_recovery = RecoveryInProgress(); - if (replayTLI) - *replayTLI = tli; - return recptr; -} + /* + * 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. + */ + if (!backup_started_in_recovery && !XLogIsNeeded()) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL level not sufficient for making an online backup"), + errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); -/* - * Get latest WAL insert pointer - */ -XLogRecPtr -GetXLogInsertRecPtr(void) -{ - XLogCtlInsert *Insert = &XLogCtl->Insert; - uint64 current_bytepos; + if (strlen(backupidstr) > MAXPGPATH) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("backup label too long (max %d bytes)", + MAXPGPATH))); - SpinLockAcquire(&Insert->insertpos_lck); - current_bytepos = Insert->CurrBytePos; - SpinLockRelease(&Insert->insertpos_lck); + /* + * Mark backup active in shared memory. We must do full-page WAL writes + * during an on-line backup even if not doing so at other times, because + * it's quite possible for the backup dump to obtain a "torn" (partially + * written) copy of a database page if it reads the page concurrently with + * our write to the same page. This can be fixed as long as the first + * write to the page in the WAL sequence is a full-page write. Hence, we + * turn on forcePageWrites and then force a CHECKPOINT, to ensure there + * are no dirty pages in shared memory that might get dumped while the + * backup is in progress without having a corresponding WAL record. (Once + * the backup is complete, we need not force full-page writes anymore, + * since we expect that any pages not modified during the backup interval + * must have been correctly captured by the backup.) + * + * Note that forcePageWrites has no effect during an online backup from + * the standby. + * + * We must hold all the insertion locks to change the value of + * forcePageWrites, to ensure adequate interlocking against + * XLogInsertRecord(). + */ + WALInsertLockAcquireExclusive(); + XLogCtl->Insert.runningBackups++; + XLogCtl->Insert.forcePageWrites = true; + WALInsertLockRelease(); + + /* Ensure we release forcePageWrites if fail below */ + PG_ENSURE_ERROR_CLEANUP(pg_backup_start_callback, (Datum) 0); + { + bool gotUniqueStartpoint = false; + DIR *tblspcdir; + struct dirent *de; + tablespaceinfo *ti; + int datadirpathlen; + + /* + * 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_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 + * pg_wal directory was not included in the base backup and the WAL + * archive was cleared too before starting the backup. + * + * This also ensures that we have emitted a WAL page header that has + * XLP_BKP_REMOVABLE off before we emit the checkpoint record. + * Therefore, if a WAL archiver (such as pglesslog) is trying to + * compress out removable backup blocks, it won't remove any that + * occur after this point. + * + * During recovery, we skip forcing XLOG file switch, which means that + * the backup taken during recovery is not available for the special + * recovery case described above. + */ + if (!backup_started_in_recovery) + RequestXLogSwitch(false); + + do + { + bool checkpointfpw; + + /* + * Force a CHECKPOINT. Aside from being necessary to prevent torn + * page problems, this guarantees that two successive backup runs + * will have different checkpoint positions and hence different + * history file names, even if nothing happened in between. + * + * During recovery, establish a restartpoint if possible. We use + * the last restartpoint as the backup starting checkpoint. This + * means that two successive backup runs can have same checkpoint + * positions. + * + * 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. + * + * We use CHECKPOINT_IMMEDIATE only if requested by user (via + * passing fast = true). Otherwise this can take awhile. + */ + RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | + (fast ? CHECKPOINT_IMMEDIATE : 0)); - return XLogBytePosToRecPtr(current_bytepos); -} + /* + * Now we need to fetch the checkpoint record location, and also + * its REDO pointer. The oldest point in WAL that would be needed + * to restore starting from the checkpoint is precisely the REDO + * pointer. + */ + LWLockAcquire(ControlFileLock, LW_SHARED); + checkpointloc = ControlFile->checkPoint; + startpoint = ControlFile->checkPointCopy.redo; + starttli = ControlFile->checkPointCopy.ThisTimeLineID; + checkpointfpw = ControlFile->checkPointCopy.fullPageWrites; + LWLockRelease(ControlFileLock); -/* - * Get latest WAL write pointer - */ -XLogRecPtr -GetXLogWriteRecPtr(void) -{ - SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; - SpinLockRelease(&XLogCtl->info_lck); + if (backup_started_in_recovery) + { + XLogRecPtr recptr; - return LogwrtResult.Write; -} + /* + * Check to see if all WAL replayed during online backup + * (i.e., since last restartpoint used as backup starting + * checkpoint) contain full-page writes. + */ + SpinLockAcquire(&XLogCtl->info_lck); + recptr = XLogCtl->lastFpwDisableRecPtr; + SpinLockRelease(&XLogCtl->info_lck); -/* - * Returns the redo pointer of the last checkpoint or restartpoint. This is - * the oldest point in WAL that we still need, if we have to restart recovery. - */ -void -GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli) -{ - LWLockAcquire(ControlFileLock, LW_SHARED); - *oldrecptr = ControlFile->checkPointCopy.redo; - *oldtli = ControlFile->checkPointCopy.ThisTimeLineID; - LWLockRelease(ControlFileLock); -} + if (!checkpointfpw || startpoint <= recptr) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL generated with full_page_writes=off was replayed " + "since last restartpoint"), + errhint("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."))); -/* - * read_backup_label: check to see if a backup_label file is present - * - * If we see a backup_label during recovery, we assume that we are recovering - * from a backup dump file, and we therefore roll forward from the checkpoint - * identified by the label file, NOT what pg_control says. This avoids the - * problem that pg_control might have been archived one or more checkpoints - * later than the start of the dump, and so if we rely on it as the start - * point, we will fail to restore a consistent database state. - * - * Returns true if a backup_label was found (and fills the checkpoint - * location and its REDO location into *checkPointLoc and RedoStartLSN, - * respectively); returns false if not. If this backup_label came from a - * streamed backup, *backupEndRequired is set to true. If this backup_label - * was created during recovery, *backupFromStandby is set to true. - */ -static bool -read_backup_label(XLogRecPtr *checkPointLoc, bool *backupEndRequired, - bool *backupFromStandby) -{ - char startxlogfilename[MAXFNAMELEN]; - TimeLineID tli_from_walseg, - tli_from_file; - FILE *lfp; - char ch; - char backuptype[20]; - char backupfrom[20]; - char backuplabel[MAXPGPATH]; - char backuptime[128]; - uint32 hi, - lo; + /* + * During recovery, since we don't use the end-of-backup WAL + * record and don't write the backup history file, the + * starting WAL location doesn't need to be unique. This means + * that two base backups started at the same time might use + * the same checkpoint as starting locations. + */ + gotUniqueStartpoint = true; + } - *backupEndRequired = false; - *backupFromStandby = false; + /* + * If two base backups are started at the same time (in WAL sender + * processes), we need to make sure that they use different + * checkpoints as starting locations, because we use the starting + * WAL location as a unique identifier for the base backup in the + * end-of-backup WAL record and when we write the backup history + * file. Perhaps it would be better generate a separate unique ID + * for each backup instead of forcing another checkpoint, but + * taking a checkpoint right after another is not that expensive + * either because only few buffers have been dirtied yet. + */ + WALInsertLockAcquireExclusive(); + if (XLogCtl->Insert.lastBackupStart < startpoint) + { + XLogCtl->Insert.lastBackupStart = startpoint; + gotUniqueStartpoint = true; + } + WALInsertLockRelease(); + } while (!gotUniqueStartpoint); - /* - * See if label file is present - */ - lfp = AllocateFile(BACKUP_LABEL_FILE, "r"); - if (!lfp) - { - if (errno != ENOENT) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - BACKUP_LABEL_FILE))); - return false; /* it's not there, all is fine */ - } + XLByteToSeg(startpoint, _logSegNo, wal_segment_size); + XLogFileName(xlogfilename, starttli, _logSegNo, wal_segment_size); - /* - * Read and parse the START WAL LOCATION and CHECKPOINT lines (this code - * is pretty crude, but we are not expecting any variability in the file - * format). - */ - if (fscanf(lfp, "START WAL LOCATION: %X/%X (file %08X%16s)%c", - &hi, &lo, &tli_from_walseg, startxlogfilename, &ch) != 5 || ch != '\n') - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); - RedoStartLSN = ((uint64) hi) << 32 | lo; - if (fscanf(lfp, "CHECKPOINT LOCATION: %X/%X%c", - &hi, &lo, &ch) != 3 || ch != '\n') - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); - *checkPointLoc = ((uint64) hi) << 32 | lo; + /* + * Construct tablespace_map file. + */ + datadirpathlen = strlen(DataDir); - /* - * 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. - */ - if (fscanf(lfp, "BACKUP METHOD: %19s\n", backuptype) == 1) - { - if (strcmp(backuptype, "streamed") == 0) - *backupEndRequired = true; - } + /* Collect information about all tablespaces */ + tblspcdir = AllocateDir("pg_tblspc"); + while ((de = ReadDir(tblspcdir, "pg_tblspc")) != NULL) + { + char fullpath[MAXPGPATH + 10]; + char linkpath[MAXPGPATH]; + char *relpath = NULL; + int rllen; + StringInfoData escapedpath; + char *s; - if (fscanf(lfp, "BACKUP FROM: %19s\n", backupfrom) == 1) - { - if (strcmp(backupfrom, "standby") == 0) - *backupFromStandby = true; - } + /* Skip anything that doesn't look like a tablespace */ + if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) + continue; - /* - * Parse START TIME and LABEL. Those are not mandatory fields for recovery - * but checking for their presence is useful for debugging and the next - * sanity checks. Cope also with the fact that the result buffers have a - * pre-allocated size, hence if the backup_label file has been generated - * with strings longer than the maximum assumed here an incorrect parsing - * happens. That's fine as only minor consistency checks are done - * afterwards. - */ - if (fscanf(lfp, "START TIME: %127[^\n]\n", backuptime) == 1) - ereport(DEBUG1, - (errmsg_internal("backup time %s in file \"%s\"", - backuptime, BACKUP_LABEL_FILE))); + snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name); - if (fscanf(lfp, "LABEL: %1023[^\n]\n", backuplabel) == 1) - ereport(DEBUG1, - (errmsg_internal("backup label %s in file \"%s\"", - backuplabel, BACKUP_LABEL_FILE))); + /* + * 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. + */ + if (get_dirent_type(fullpath, de, false, ERROR) != PGFILETYPE_LNK) + continue; - /* - * START TIMELINE is new as of 11. Its parsing is not mandatory, still use - * it as a sanity check if present. - */ - if (fscanf(lfp, "START TIMELINE: %u\n", &tli_from_file) == 1) - { - if (tli_from_walseg != tli_from_file) - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE), - errdetail("Timeline ID parsed is %u, but expected %u.", - tli_from_file, tli_from_walseg))); +#if defined(HAVE_READLINK) || defined(WIN32) + rllen = readlink(fullpath, linkpath, sizeof(linkpath)); + if (rllen < 0) + { + ereport(WARNING, + (errmsg("could not read symbolic link \"%s\": %m", + fullpath))); + continue; + } + else if (rllen >= sizeof(linkpath)) + { + ereport(WARNING, + (errmsg("symbolic link \"%s\" target is too long", + fullpath))); + continue; + } + linkpath[rllen] = '\0'; - ereport(DEBUG1, - (errmsg_internal("backup timeline %u in file \"%s\"", - tli_from_file, BACKUP_LABEL_FILE))); - } + /* + * Build a backslash-escaped version of the link path to include + * in the tablespace map file. + */ + initStringInfo(&escapedpath); + for (s = linkpath; *s; s++) + { + if (*s == '\n' || *s == '\r' || *s == '\\') + appendStringInfoChar(&escapedpath, '\\'); + appendStringInfoChar(&escapedpath, *s); + } - if (ferror(lfp) || FreeFile(lfp)) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - BACKUP_LABEL_FILE))); + /* + * Relpath holds the relative path of the tablespace directory + * when it's located within PGDATA, or NULL if it's located + * elsewhere. + */ + if (rllen > datadirpathlen && + strncmp(linkpath, DataDir, datadirpathlen) == 0 && + IS_DIR_SEP(linkpath[datadirpathlen])) + relpath = linkpath + datadirpathlen + 1; - return true; -} + ti = palloc(sizeof(tablespaceinfo)); + ti->oid = pstrdup(de->d_name); + ti->path = pstrdup(linkpath); + ti->rpath = relpath ? pstrdup(relpath) : NULL; + ti->size = -1; -/* - * read_tablespace_map: check to see if a tablespace_map file is present - * - * If we see a tablespace_map file during recovery, we assume that we are - * recovering from a backup dump file, and we therefore need to create symlinks - * as per the information present in tablespace_map file. - * - * Returns true if a tablespace_map file was found (and fills *tablespaces - * with a tablespaceinfo struct for each tablespace listed in the file); - * returns false if not. - */ -static bool -read_tablespace_map(List **tablespaces) -{ - tablespaceinfo *ti; - FILE *lfp; - char str[MAXPGPATH]; - int ch, - i, - n; - bool was_backslash; + if (tablespaces) + *tablespaces = lappend(*tablespaces, ti); - /* - * See if tablespace_map file is present - */ - lfp = AllocateFile(TABLESPACE_MAP, "r"); - if (!lfp) - { - if (errno != ENOENT) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - TABLESPACE_MAP))); - return false; /* it's not there, all is fine */ - } + appendStringInfo(tblspcmapfile, "%s %s\n", + ti->oid, escapedpath.data); - /* - * Read and parse the link name and path lines from tablespace_map file - * (this code is pretty crude, but we are not expecting any variability in - * the file format). De-escape any backslashes that were inserted. - */ - i = 0; - was_backslash = false; - while ((ch = fgetc(lfp)) != EOF) - { - if (!was_backslash && (ch == '\n' || ch == '\r')) - { - if (i == 0) - continue; /* \r immediately followed by \n */ + pfree(escapedpath.data); +#else /* - * The de-escaped line should contain an OID followed by exactly - * one space followed by a path. The path might start with - * spaces, so don't be too liberal about parsing. + * If the platform does not have symbolic links, it should not be + * possible to have tablespaces - clearly somebody else created + * them. Warn about it and ignore. */ - str[i] = '\0'; - n = 0; - while (str[n] && str[n] != ' ') - n++; - if (n < 1 || n >= i - 1) - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", TABLESPACE_MAP))); - str[n++] = '\0'; + ereport(WARNING, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("tablespaces are not supported on this platform"))); +#endif + } + FreeDir(tblspcdir); - ti = palloc0(sizeof(tablespaceinfo)); - ti->oid = pstrdup(str); - ti->path = pstrdup(str + n); - *tablespaces = lappend(*tablespaces, ti); + /* + * Construct backup label file. + */ - i = 0; - continue; - } - else if (!was_backslash && ch == '\\') - was_backslash = true; - else - { - if (i < sizeof(str) - 1) - str[i++] = ch; - was_backslash = false; - } + /* Use the log timezone here, not the session timezone */ + stamp_time = (pg_time_t) time(NULL); + pg_strftime(strfbuf, sizeof(strfbuf), + "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&stamp_time, log_timezone)); + appendStringInfo(labelfile, "START WAL LOCATION: %X/%X (file %s)\n", + LSN_FORMAT_ARGS(startpoint), xlogfilename); + appendStringInfo(labelfile, "CHECKPOINT LOCATION: %X/%X\n", + LSN_FORMAT_ARGS(checkpointloc)); + 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); } + PG_END_ENSURE_ERROR_CLEANUP(pg_backup_start_callback, (Datum) 0); - if (i != 0 || was_backslash) /* last line not terminated? */ - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("invalid data in file \"%s\"", TABLESPACE_MAP))); - - if (ferror(lfp) || FreeFile(lfp)) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not read file \"%s\": %m", - TABLESPACE_MAP))); + /* + * Mark that the start phase has correctly finished for the backup. + */ + sessionBackupState = SESSION_BACKUP_RUNNING; - return true; + /* + * We're done. As a convenience, return the starting WAL location. + */ + if (starttli_p) + *starttli_p = starttli; + return startpoint; } -/* - * Error context callback for errors occurring during rm_redo(). - */ +/* Error cleanup callback for pg_backup_start */ static void -rm_redo_error_callback(void *arg) +pg_backup_start_callback(int code, Datum arg) { - XLogReaderState *record = (XLogReaderState *) arg; - StringInfoData buf; - - initStringInfo(&buf); - xlog_outdesc(&buf, record); - xlog_block_info(&buf, record); + /* Update backup counters and forcePageWrites on failure */ + WALInsertLockAcquireExclusive(); - /* translator: %s is a WAL record description */ - errcontext("WAL redo at %X/%X for %s", - LSN_FORMAT_ARGS(record->ReadRecPtr), - buf.data); + Assert(XLogCtl->Insert.runningBackups > 0); + XLogCtl->Insert.runningBackups--; - pfree(buf.data); + if (XLogCtl->Insert.runningBackups == 0) + { + XLogCtl->Insert.forcePageWrites = false; + } + WALInsertLockRelease(); } /* - * BackupInProgress: check if online backup mode is active - * - * This is done by checking for existence of the "backup_label" file. + * Utility routine to fetch the session-level status of a backup running. */ -bool -BackupInProgress(void) +SessionBackupState +get_backup_status(void) { - struct stat stat_buf; - - return (stat(BACKUP_LABEL_FILE, &stat_buf) == 0); + return sessionBackupState; } /* - * CancelBackup: rename the "backup_label" and "tablespace_map" - * files to cancel backup mode + * 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 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". + * Returns the last WAL location that must be present to restore from this + * backup, and the corresponding timeline ID in *stoptli_p. * - * Note that this will render an online backup in progress - * useless. To correctly finish an online backup, pg_stop_backup must be - * called. + * It is the responsibility of the caller of this function to verify the + * permissions of the calling user! */ -void -CancelBackup(void) +XLogRecPtr +do_pg_backup_stop(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) { - struct stat stat_buf; + bool backup_started_in_recovery = false; + XLogRecPtr startpoint; + XLogRecPtr stoppoint; + TimeLineID stoptli; + pg_time_t stamp_time; + char strfbuf[128]; + char histfilepath[MAXPGPATH]; + char startxlogfilename[MAXFNAMELEN]; + char stopxlogfilename[MAXFNAMELEN]; + char lastxlogfilename[MAXFNAMELEN]; + char histfilename[MAXFNAMELEN]; + char backupfrom[20]; + XLogSegNo _logSegNo; + FILE *fp; + char ch; + int seconds_before_warning; + int waits = 0; + bool reported_waiting = false; + char *remaining; + char *ptr; + uint32 hi, + lo; - /* if the backup_label file is not there, return */ - if (stat(BACKUP_LABEL_FILE, &stat_buf) < 0) - return; + backup_started_in_recovery = RecoveryInProgress(); - /* remove leftover file from previously canceled backup if it exists */ - unlink(BACKUP_LABEL_OLD); + /* + * 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. + */ + if (!backup_started_in_recovery && !XLogIsNeeded()) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL level not sufficient for making an online backup"), + errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); - 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; - } + /* + * 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(); + + /* + * 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 the tablespace_map file is not there, return */ - if (stat(TABLESPACE_MAP, &stat_buf) < 0) + if (XLogCtl->Insert.runningBackups == 0) { - ereport(LOG, - (errmsg("online backup mode canceled"), - errdetail("File \"%s\" was renamed to \"%s\".", - BACKUP_LABEL_FILE, BACKUP_LABEL_OLD))); - return; + XLogCtl->Insert.forcePageWrites = false; } - /* remove leftover file from previously canceled backup if it exists */ - unlink(TABLESPACE_MAP_OLD); + /* + * Clean up session-level lock. + * + * You might think that WALInsertLockRelease() can be called before + * cleaning up session-level lock because session-level lock doesn't need + * to be protected with WAL insertion lock. But since + * CHECK_FOR_INTERRUPTS() can occur in it, session-level lock must be + * cleaned up before it. + */ + sessionBackupState = SESSION_BACKUP_NONE; - 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))); - } -} + WALInsertLockRelease(); -/* - * 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. - * - * 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. - * - * '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 - * return. - * - * In standby mode, if after a successful return of XLogPageRead() the - * caller finds the record it's interested in to be broken, it should - * ereport the error with the level determined by - * emode_for_corrupt_record(), and then set lastSourceFailed - * and call XLogPageRead() again with the same arguments. This lets - * XLogPageRead() to try fetching the record from another source, or to - * sleep and retry. - */ -static int -XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, - XLogRecPtr targetRecPtr, char *readBuf) -{ - XLogPageReadPrivate *private = - (XLogPageReadPrivate *) xlogreader->private_data; - int emode = private->emode; - uint32 targetPageOff; - XLogSegNo targetSegNo PG_USED_FOR_ASSERTS_ONLY; - int r; + /* + * Read and parse the START WAL LOCATION line (this code is pretty crude, + * but we are not expecting any variability in the file format). + */ + if (sscanf(labelfile, "START WAL LOCATION: %X/%X (file %24s)%c", + &hi, &lo, startxlogfilename, + &ch) != 4 || ch != '\n') + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); + startpoint = ((uint64) hi) << 32 | lo; + remaining = strchr(labelfile, '\n') + 1; /* %n is not portable enough */ - XLByteToSeg(targetPagePtr, targetSegNo, wal_segment_size); - targetPageOff = XLogSegmentOffset(targetPagePtr, wal_segment_size); + /* + * Parse the BACKUP FROM line. If we are taking an online backup from the + * standby, we confirm that the standby has not been promoted during the + * backup. + */ + ptr = strstr(remaining, "BACKUP FROM:"); + if (!ptr || sscanf(ptr, "BACKUP FROM: %19s\n", backupfrom) != 1) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); + if (strcmp(backupfrom, "standby") == 0 && !backup_started_in_recovery) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("the standby was promoted during online backup"), + errhint("This means that the backup being taken is corrupt " + "and should not be used. " + "Try taking another online backup."))); /* - * See if we need to switch to a new segment because the requested record - * is not in the currently open one. + * During recovery, we don't write an end-of-backup record. We assume that + * pg_control was backed up last and its minimum recovery point can be + * available as the backup end location. Since we don't have an + * end-of-backup record, we use the pg_control value to check whether + * we've reached the end of backup when starting recovery from this + * backup. We have no way of checking if pg_control wasn't backed up last + * however. + * + * We don't force a switch to new WAL file but it is still possible to + * wait for all the required files to be archived if waitforarchive is + * true. This is okay if we use the backup to start a standby and fetch + * the missing WAL using streaming replication. But in the case of an + * archive recovery, a user should set waitforarchive to true and wait for + * them to be archived to ensure that all the required files are + * available. + * + * We return the current minimum recovery point as the backup end + * location. Note that it can be greater than the exact backup end + * location if the minimum recovery point is updated after the backup of + * pg_control. This is harmless for current uses. + * + * XXX currently a backup history file is for informational and debug + * purposes only. It's not essential for an online backup. Furthermore, + * even if it's created, it will not be archived during recovery because + * an archiver is not invoked. So it doesn't seem worthwhile to write a + * backup history file during recovery. */ - if (readFile >= 0 && - !XLByteInSeg(targetPagePtr, readSegNo, wal_segment_size)) + if (backup_started_in_recovery) { + XLogRecPtr recptr; + /* - * Request a restartpoint if we've replayed too much xlog since the - * last one. + * Check to see if all WAL replayed during online backup contain + * full-page writes. */ - if (bgwriterLaunched) - { - if (XLogCheckpointNeeded(readSegNo)) - { - (void) GetRedoRecPtr(); - if (XLogCheckpointNeeded(readSegNo)) - RequestCheckpoint(CHECKPOINT_CAUSE_XLOG); - } - } - - close(readFile); - readFile = -1; - readSource = XLOG_FROM_ANY; - } + SpinLockAcquire(&XLogCtl->info_lck); + recptr = XLogCtl->lastFpwDisableRecPtr; + SpinLockRelease(&XLogCtl->info_lck); - XLByteToSeg(targetPagePtr, readSegNo, wal_segment_size); + if (startpoint <= recptr) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL generated with full_page_writes=off was replayed " + "during online backup"), + errhint("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."))); -retry: - /* See if we need to retrieve more data */ - if (readFile < 0 || - (readSource == XLOG_FROM_STREAM && - flushedUpto < targetPagePtr + reqLen)) - { - if (!WaitForWALToBecomeAvailable(targetPagePtr + reqLen, - private->randAccess, - private->fetching_ckpt, - targetRecPtr)) - { - if (readFile >= 0) - close(readFile); - readFile = -1; - readLen = 0; - readSource = XLOG_FROM_ANY; - return -1; - } + LWLockAcquire(ControlFileLock, LW_SHARED); + stoppoint = ControlFile->minRecoveryPoint; + stoptli = ControlFile->minRecoveryPointTLI; + LWLockRelease(ControlFileLock); } + else + { + /* + * Write the backup-end xlog record + */ + XLogBeginInsert(); + XLogRegisterData((char *) (&startpoint), sizeof(startpoint)); + stoppoint = XLogInsert(RM_XLOG_ID, XLOG_BACKUP_END); - /* - * At this point, we have the right segment open and if we're streaming we - * know the requested record is in it. - */ - Assert(readFile != -1); + /* + * Given that we're not in recovery, InsertTimeLineID is set and can't + * change, so we can read it without a lock. + */ + stoptli = XLogCtl->InsertTimeLineID; - /* - * If the current segment is being streamed from the primary, calculate - * how much of the current page we have received already. We know the - * requested record has been received, but this is for the benefit of - * future calls, to allow quick exit at the top of this function. - */ - if (readSource == XLOG_FROM_STREAM) - { - if (((targetPagePtr) / XLOG_BLCKSZ) != (flushedUpto / XLOG_BLCKSZ)) - readLen = XLOG_BLCKSZ; - else - readLen = XLogSegmentOffset(flushedUpto, wal_segment_size) - - targetPageOff; - } - else - readLen = XLOG_BLCKSZ; + /* + * Force a switch to a new xlog segment file, so that the backup is + * valid as soon as archiver moves out the current segment file. + */ + RequestXLogSwitch(false); - /* Read the requested page */ - readOff = targetPageOff; + XLByteToPrevSeg(stoppoint, _logSegNo, wal_segment_size); + XLogFileName(stopxlogfilename, stoptli, _logSegNo, wal_segment_size); - pgstat_report_wait_start(WAIT_EVENT_WAL_READ); - r = pg_pread(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff); - if (r != XLOG_BLCKSZ) - { - char fname[MAXFNAMELEN]; - int save_errno = errno; + /* Use the log timezone here, not the session timezone */ + stamp_time = (pg_time_t) time(NULL); + pg_strftime(strfbuf, sizeof(strfbuf), + "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&stamp_time, log_timezone)); - pgstat_report_wait_end(); - XLogFileName(fname, curFileTLI, readSegNo, wal_segment_size); - if (r < 0) - { - errno = save_errno; - ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen), + /* + * Write the backup history file + */ + XLByteToSeg(startpoint, _logSegNo, wal_segment_size); + BackupHistoryFilePath(histfilepath, stoptli, _logSegNo, + startpoint, wal_segment_size); + fp = AllocateFile(histfilepath, "w"); + if (!fp) + ereport(ERROR, (errcode_for_file_access(), - errmsg("could not read from log segment %s, offset %u: %m", - fname, readOff))); - } - else - ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen), - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("could not read from log segment %s, offset %u: read %d of %zu", - fname, readOff, r, (Size) XLOG_BLCKSZ))); - goto next_record_is_invalid; - } - pgstat_report_wait_end(); + errmsg("could not create file \"%s\": %m", + histfilepath))); + fprintf(fp, "START WAL LOCATION: %X/%X (file %s)\n", + LSN_FORMAT_ARGS(startpoint), startxlogfilename); + fprintf(fp, "STOP WAL LOCATION: %X/%X (file %s)\n", + LSN_FORMAT_ARGS(stoppoint), stopxlogfilename); - Assert(targetSegNo == readSegNo); - Assert(targetPageOff == readOff); - Assert(reqLen <= readLen); - - xlogreader->seg.ws_tli = curFileTLI; - - /* - * Check the page header immediately, so that we can retry immediately if - * it's not valid. This may seem unnecessary, because ReadPageInternal() - * validates the page header anyway, and would propagate the failure up to - * ReadRecord(), which would retry. However, there's a corner case with - * continuation records, if a record is split across two pages such that - * we would need to read the two pages from different sources. For - * example, imagine a scenario where a streaming replica is started up, - * and replay reaches a record that's split across two WAL segments. The - * first page is only available locally, in pg_wal, because it's already - * been recycled on the primary. The second page, however, is not present - * in pg_wal, and we should stream it from the primary. There is a - * recycled WAL segment present in pg_wal, with garbage contents, however. - * We would read the first page from the local WAL segment, but when - * reading the second page, we would read the bogus, recycled, WAL - * segment. If we didn't catch that case here, we would never recover, - * because ReadRecord() would retry reading the whole record from the - * beginning. - * - * Of course, this only catches errors in the page header, which is what - * happens in the case of a recycled WAL segment. Other kinds of errors or - * corruption still has the same problem. But this at least fixes the - * common case, which can happen as part of normal operation. - * - * Validating the page header is cheap enough that doing it twice - * shouldn't be a big deal from a performance point of view. - * - * When not in standby mode, an invalid page header should cause recovery - * to end, not retry reading the page, so we don't need to validate the - * page header here for the retry. Instead, ReadPageInternal() is - * responsible for the validation. - */ - if (StandbyMode && - !XLogReaderValidatePageHeader(xlogreader, targetPagePtr, readBuf)) - { /* - * Emit this error right now then retry this page immediately. Use - * errmsg_internal() because the message was already translated. + * Transfer remaining lines including label and start timeline to + * history file. */ - if (xlogreader->errormsg_buf[0]) - ereport(emode_for_corrupt_record(emode, EndRecPtr), - (errmsg_internal("%s", xlogreader->errormsg_buf))); + fprintf(fp, "%s", remaining); + fprintf(fp, "STOP TIME: %s\n", strfbuf); + fprintf(fp, "STOP TIMELINE: %u\n", stoptli); + if (fflush(fp) || ferror(fp) || FreeFile(fp)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", + histfilepath))); - /* reset any error XLogReaderValidatePageHeader() might have set */ - xlogreader->errormsg_buf[0] = '\0'; - goto next_record_is_invalid; + /* + * Clean out any no-longer-needed history files. As a side effect, + * this will post a .ready file for the newly created history file, + * notifying the archiver that history file may be archived + * immediately. + */ + CleanupBackupHistory(); } - return readLen; - -next_record_is_invalid: - lastSourceFailed = true; - - if (readFile >= 0) - close(readFile); - readFile = -1; - readLen = 0; - readSource = XLOG_FROM_ANY; - - /* In standby-mode, keep trying */ - if (StandbyMode) - goto retry; - else - return -1; -} - -/* - * Open the WAL segment containing WAL location 'RecPtr'. - * - * The segment can be fetched via restore_command, or via walreceiver having - * streamed the record, or it can already be present in pg_wal. Checking - * pg_wal is mainly for crash recovery, but it will be polled in standby mode - * too, in case someone copies a new segment directly to pg_wal. That is not - * documented or recommended, though. - * - * If 'fetching_ckpt' is true, we're fetching a checkpoint record, and should - * prepare to read WAL starting from RedoStartLSN after this. - * - * 'RecPtr' might not point to the beginning of the record we're interested - * in, it might also point to the page or segment header. In that case, - * 'tliRecPtr' is the position of the WAL record we're interested in. It is - * used to decide which timeline to stream the requested WAL from. - * - * If the record is not immediately available, the function returns false - * if we're not in standby mode. In standby mode, waits for it to become - * 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. - */ -static bool -WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, - bool fetching_ckpt, XLogRecPtr tliRecPtr) -{ - static TimestampTz last_fail_time = 0; - TimestampTz now; - bool streaming_reply_sent = false; - - /*------- - * Standby mode is implemented by a state machine: - * - * 1. Read from either archive or pg_wal (XLOG_FROM_ARCHIVE), or just - * pg_wal (XLOG_FROM_PG_WAL) - * 2. Check trigger file - * 3. Read from primary server via walreceiver (XLOG_FROM_STREAM) - * 4. Rescan timelines - * 5. Sleep wal_retrieve_retry_interval milliseconds, and loop back to 1. - * - * Failure to read from the current source advances the state machine to - * the next state. + /* + * If archiving is enabled, wait for all the required WAL files to be + * archived before returning. If archiving isn't enabled, the required WAL + * needs to be transported via streaming replication (hopefully with + * wal_keep_size set high enough), or some more exotic mechanism like + * polling and copying files from pg_wal with script. We have no knowledge + * of those mechanisms, so it's up to the user to ensure that he gets all + * the required WAL. * - * 'currentSource' indicates the current state. There are no currentSource - * values for "check trigger", "rescan timelines", and "sleep" states, - * those actions are taken when reading from the previous source fails, as - * part of advancing to the next state. + * We wait until both the last WAL file filled during backup and the + * history file have been archived, and assume that the alphabetic sorting + * property of the WAL files ensures any earlier WAL files are safely + * archived as well. * - * If standby mode is turned off while reading WAL from stream, we move - * to XLOG_FROM_ARCHIVE and reset lastSourceFailed, to force fetching - * the files (which would be required at end of recovery, e.g., timeline - * history file) from archive or pg_wal. We don't need to kill WAL receiver - * here because it's already stopped when standby mode is turned off at - * the end of recovery. - *------- + * We wait forever, since archive_command is supposed to work and we + * assume the admin wanted his backup to work completely. If you don't + * wish to wait, then either waitforarchive should be passed in as false, + * or you can set statement_timeout. Also, some notices are issued to + * clue in anyone who might be doing this interactively. */ - if (!InArchiveRecovery) - currentSource = XLOG_FROM_PG_WAL; - else if (currentSource == XLOG_FROM_ANY || - (!StandbyMode && currentSource == XLOG_FROM_STREAM)) - { - lastSourceFailed = false; - currentSource = XLOG_FROM_ARCHIVE; - } - for (;;) + if (waitforarchive && + ((!backup_started_in_recovery && XLogArchivingActive()) || + (backup_started_in_recovery && XLogArchivingAlways()))) { - XLogSource oldSource = currentSource; - bool startWalReceiver = false; - - /* - * First check if we failed to read from the current source, and - * advance the state machine if so. The failure to read might've - * happened outside this function, e.g when a CRC check fails on a - * record, or within this loop. - */ - if (lastSourceFailed) - { - switch (currentSource) - { - case XLOG_FROM_ARCHIVE: - case XLOG_FROM_PG_WAL: - - /* - * Check to see if the trigger file exists. Note that we - * do this only after failure, so when you create the - * trigger file, we still finish replaying as much as we - * can from archive and pg_wal before failover. - */ - if (StandbyMode && CheckForStandbyTrigger()) - { - ShutdownWalRcv(); - return false; - } - - /* - * Not in standby mode, and we've now tried the archive - * and pg_wal. - */ - if (!StandbyMode) - return false; - - /* - * Move to XLOG_FROM_STREAM state, and set to start a - * walreceiver if necessary. - */ - currentSource = XLOG_FROM_STREAM; - startWalReceiver = true; - break; - - case XLOG_FROM_STREAM: - - /* - * Failure while streaming. Most likely, we got here - * because streaming replication was terminated, or - * promotion was triggered. But we also get here if we - * find an invalid record in the WAL streamed from the - * primary, in which case something is seriously wrong. - * There's little chance that the problem will just go - * away, but PANIC is not good for availability either, - * especially in hot standby mode. So, we treat that the - * same as disconnection, and retry from archive/pg_wal - * again. The WAL in the archive should be identical to - * what was streamed, so it's unlikely that it helps, but - * one can hope... - */ - - /* - * We should be able to move to XLOG_FROM_STREAM only in - * standby mode. - */ - Assert(StandbyMode); - - /* - * Before we leave XLOG_FROM_STREAM state, make sure that - * walreceiver is not active, so that it won't overwrite - * WAL that we restore from archive. - */ - if (WalRcvStreaming()) - ShutdownWalRcv(); - - /* - * Before we sleep, re-scan for possible new timelines if - * we were requested to recover to the latest timeline. - */ - if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_LATEST) - { - if (rescanLatestTimeLine()) - { - currentSource = XLOG_FROM_ARCHIVE; - break; - } - } - - /* - * XLOG_FROM_STREAM is the last state in our state - * machine, so we've exhausted all the options for - * obtaining the requested WAL. We're going to loop back - * and retry from the archive, but if it hasn't been long - * since last attempt, sleep wal_retrieve_retry_interval - * milliseconds to avoid busy-waiting. - */ - now = GetCurrentTimestamp(); - if (!TimestampDifferenceExceeds(last_fail_time, now, - wal_retrieve_retry_interval)) - { - long wait_time; - - wait_time = wal_retrieve_retry_interval - - TimestampDifferenceMilliseconds(last_fail_time, now); - - /* Do background tasks that might benefit us later. */ - KnownAssignedTransactionIdsIdleMaintenance(); - - (void) WaitLatch(&XLogCtl->recoveryWakeupLatch, - WL_LATCH_SET | WL_TIMEOUT | - WL_EXIT_ON_PM_DEATH, - wait_time, - WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL); - ResetLatch(&XLogCtl->recoveryWakeupLatch); - now = GetCurrentTimestamp(); - - /* Handle interrupt signals of startup process */ - HandleStartupProcInterrupts(); - } - last_fail_time = now; - currentSource = XLOG_FROM_ARCHIVE; - break; - - default: - elog(ERROR, "unexpected WAL source %d", currentSource); - } - } - else if (currentSource == XLOG_FROM_PG_WAL) - { - /* - * We just successfully read a file in pg_wal. We prefer files in - * the archive over ones in pg_wal, so try the next file again - * from the archive first. - */ - if (InArchiveRecovery) - currentSource = XLOG_FROM_ARCHIVE; - } + XLByteToPrevSeg(stoppoint, _logSegNo, wal_segment_size); + XLogFileName(lastxlogfilename, stoptli, _logSegNo, wal_segment_size); - if (currentSource != oldSource) - elog(DEBUG2, "switched WAL source from %s to %s after %s", - xlogSourceNames[oldSource], xlogSourceNames[currentSource], - lastSourceFailed ? "failure" : "success"); + XLByteToSeg(startpoint, _logSegNo, wal_segment_size); + BackupHistoryFileName(histfilename, stoptli, _logSegNo, + startpoint, wal_segment_size); - /* - * We've now handled possible failure. Try to read from the chosen - * source. - */ - lastSourceFailed = false; + seconds_before_warning = 60; + waits = 0; - switch (currentSource) + while (XLogArchiveIsBusy(lastxlogfilename) || + XLogArchiveIsBusy(histfilename)) { - case XLOG_FROM_ARCHIVE: - case XLOG_FROM_PG_WAL: - - /* - * WAL receiver must not be running when reading WAL from - * archive or pg_wal. - */ - Assert(!WalRcvStreaming()); - - /* Close any old file we might have open. */ - if (readFile >= 0) - { - close(readFile); - readFile = -1; - } - /* Reset curFileTLI if random fetch. */ - if (randAccess) - curFileTLI = 0; - - /* - * Try to restore the file from archive, or read an existing - * file from pg_wal. - */ - readFile = XLogFileReadAnyTLI(readSegNo, DEBUG2, - currentSource == XLOG_FROM_ARCHIVE ? XLOG_FROM_ANY : - currentSource); - if (readFile >= 0) - return true; /* success! */ + CHECK_FOR_INTERRUPTS(); - /* - * Nope, not found in archive or pg_wal. - */ - lastSourceFailed = true; - break; + if (!reported_waiting && waits > 5) + { + ereport(NOTICE, + (errmsg("base backup done, waiting for required WAL segments to be archived"))); + reported_waiting = true; + } - case XLOG_FROM_STREAM: - { - bool havedata; - - /* - * We should be able to move to XLOG_FROM_STREAM only in - * standby mode. - */ - Assert(StandbyMode); - - /* - * First, shutdown walreceiver if its restart has been - * requested -- but no point if we're already slated for - * starting it. - */ - if (pendingWalRcvRestart && !startWalReceiver) - { - ShutdownWalRcv(); - - /* - * Re-scan for possible new timelines if we were - * requested to recover to the latest timeline. - */ - if (recoveryTargetTimeLineGoal == - RECOVERY_TARGET_TIMELINE_LATEST) - rescanLatestTimeLine(); - - startWalReceiver = true; - } - pendingWalRcvRestart = false; - - /* - * Launch walreceiver if needed. - * - * If fetching_ckpt is true, RecPtr points to the initial - * checkpoint location. In that case, we use RedoStartLSN - * as the streaming start position instead of RecPtr, so - * that when we later jump backwards to start redo at - * RedoStartLSN, we will have the logs streamed already. - */ - if (startWalReceiver && - PrimaryConnInfo && strcmp(PrimaryConnInfo, "") != 0) - { - XLogRecPtr ptr; - TimeLineID tli; - - if (fetching_ckpt) - { - ptr = RedoStartLSN; - tli = ControlFile->checkPointCopy.ThisTimeLineID; - } - else - { - ptr = RecPtr; - - /* - * Use the record begin position to determine the - * TLI, rather than the position we're reading. - */ - tli = tliOfPointInHistory(tliRecPtr, expectedTLEs); - - if (curFileTLI > 0 && tli < curFileTLI) - elog(ERROR, "according to history file, WAL location %X/%X belongs to timeline %u, but previous recovered WAL file came from timeline %u", - LSN_FORMAT_ARGS(tliRecPtr), - tli, curFileTLI); - } - curFileTLI = tli; - RequestXLogStreaming(tli, ptr, PrimaryConnInfo, - PrimarySlotName, - wal_receiver_create_temp_slot); - flushedUpto = 0; - } - - /* - * Check if WAL receiver is active or wait to start up. - */ - if (!WalRcvStreaming()) - { - lastSourceFailed = true; - break; - } - - /* - * Walreceiver is active, so see if new data has arrived. - * - * We only advance XLogReceiptTime when we obtain fresh - * WAL from walreceiver and observe that we had already - * processed everything before the most recent "chunk" - * that it flushed to disk. In steady state where we are - * keeping up with the incoming data, XLogReceiptTime will - * be updated on each cycle. When we are behind, - * XLogReceiptTime will not advance, so the grace time - * allotted to conflicting queries will decrease. - */ - if (RecPtr < flushedUpto) - havedata = true; - else - { - XLogRecPtr latestChunkStart; - - flushedUpto = GetWalRcvFlushRecPtr(&latestChunkStart, &receiveTLI); - if (RecPtr < flushedUpto && receiveTLI == curFileTLI) - { - havedata = true; - if (latestChunkStart <= RecPtr) - { - XLogReceiptTime = GetCurrentTimestamp(); - SetCurrentChunkStartTime(XLogReceiptTime); - } - } - else - havedata = false; - } - if (havedata) - { - /* - * Great, streamed far enough. Open the file if it's - * not open already. Also read the timeline history - * file if we haven't initialized timeline history - * yet; it should be streamed over and present in - * pg_wal by now. Use XLOG_FROM_STREAM so that source - * info is set correctly and XLogReceiptTime isn't - * changed. - * - * NB: We must set readTimeLineHistory based on - * recoveryTargetTLI, not receiveTLI. Normally they'll - * be the same, but if recovery_target_timeline is - * 'latest' and archiving is configured, then it's - * possible that we managed to retrieve one or more - * new timeline history files from the archive, - * updating recoveryTargetTLI. - */ - if (readFile < 0) - { - if (!expectedTLEs) - expectedTLEs = readTimeLineHistory(recoveryTargetTLI); - readFile = XLogFileRead(readSegNo, PANIC, - receiveTLI, - XLOG_FROM_STREAM, false); - Assert(readFile >= 0); - } - else - { - /* just make sure source info is correct... */ - readSource = XLOG_FROM_STREAM; - XLogReceiptSource = XLOG_FROM_STREAM; - return true; - } - break; - } - - /* - * Data not here yet. Check for trigger, then wait for - * walreceiver to wake us up when new WAL arrives. - */ - 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. - */ - lastSourceFailed = true; - break; - } - - /* - * Since we have replayed everything we have received so - * far and are about to start waiting for more WAL, let's - * tell the upstream server our replay location now so - * that pg_stat_replication doesn't show stale - * information. - */ - if (!streaming_reply_sent) - { - WalRcvForceReply(); - streaming_reply_sent = true; - } - - /* Do any background tasks that might benefit us later. */ - KnownAssignedTransactionIdsIdleMaintenance(); - - /* - * Wait for more WAL to arrive. Time out after 5 seconds - * to react to a trigger file promptly and to check if the - * WAL receiver is still active. - */ - (void) WaitLatch(&XLogCtl->recoveryWakeupLatch, - WL_LATCH_SET | WL_TIMEOUT | - WL_EXIT_ON_PM_DEATH, - 5000L, WAIT_EVENT_RECOVERY_WAL_STREAM); - ResetLatch(&XLogCtl->recoveryWakeupLatch); - break; - } + (void) WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + 1000L, + WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE); + ResetLatch(MyLatch); - default: - elog(ERROR, "unexpected WAL source %d", currentSource); + if (++waits >= seconds_before_warning) + { + seconds_before_warning *= 2; /* This wraps in >10 years... */ + ereport(WARNING, + (errmsg("still waiting for all required WAL segments to be archived (%d seconds elapsed)", + waits), + errhint("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."))); + } } - /* - * Check for recovery pause here so that we can confirm more quickly - * that a requested pause has actually taken effect. - */ - if (((volatile XLogCtlData *) XLogCtl)->recoveryPauseState != - RECOVERY_NOT_PAUSED) - recoveryPausesHere(false); - - /* - * This possibly-long loop needs to handle interrupts of startup - * process. - */ - HandleStartupProcInterrupts(); + ereport(NOTICE, + (errmsg("all required WAL segments have been archived"))); } + else if (waitforarchive) + ereport(NOTICE, + (errmsg("WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup"))); - return false; /* not reached */ + /* + * We're done. As a convenience, return the ending WAL location. + */ + if (stoptli_p) + *stoptli_p = stoptli; + return stoppoint; } + /* - * Set flag to signal the walreceiver to restart. (The startup process calls - * this on noticing a relevant configuration change.) + * do_pg_abort_backup: abort a running backup + * + * 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 gets used as a before_shmem_exit handler, hence the odd-looking + * signature. */ void -StartupRequestWalReceiverRestart(void) +do_pg_abort_backup(int code, Datum arg) { - if (currentSource == XLOG_FROM_STREAM && WalRcvRunning()) - { - ereport(LOG, - (errmsg("WAL receiver process shutdown requested"))); + bool emit_warning = DatumGetBool(arg); + + /* + * Quick exit if session does not have a running backup. + */ + if (sessionBackupState != SESSION_BACKUP_RUNNING) + return; + + WALInsertLockAcquireExclusive(); + Assert(XLogCtl->Insert.runningBackups > 0); + XLogCtl->Insert.runningBackups--; - pendingWalRcvRestart = true; + if (XLogCtl->Insert.runningBackups == 0) + { + XLogCtl->Insert.forcePageWrites = false; } + + sessionBackupState = SESSION_BACKUP_NONE; + WALInsertLockRelease(); + + if (emit_warning) + ereport(WARNING, + (errmsg("aborting backup due to backend exiting before pg_backup_stop was called"))); } /* - * Determine what log level should be used to report a corrupt WAL record - * in the current WAL page, previously read by XLogPageRead(). - * - * 'emode' is the error mode that would be used to report a file-not-found - * or legitimate end-of-WAL situation. Generally, we use it as-is, but if - * we're retrying the exact same record that we've tried previously, only - * complain the first time to keep the noise down. However, we only do when - * reading from pg_wal, because we don't expect any invalid records in archive - * or in records streamed from the primary. Files in the archive should be complete, - * and we should never hit the end of WAL because we stop and wait for more WAL - * to arrive before replaying it. - * - * NOTE: This function remembers the RecPtr value it was last called with, - * to suppress repeated messages about the same record. Only call this when - * you are about to ereport(), or you might cause a later message to be - * erroneously suppressed. + * Register a handler that will warn about unterminated backups at end of + * session, unless this has already been done. */ -static int -emode_for_corrupt_record(int emode, XLogRecPtr RecPtr) +void +register_persistent_abort_backup_handler(void) { - static XLogRecPtr lastComplaint = 0; + static bool already_done = false; - if (readSource == XLOG_FROM_PG_WAL && emode == LOG) - { - if (RecPtr == lastComplaint) - emode = DEBUG1; - else - lastComplaint = RecPtr; - } - return emode; + if (already_done) + return; + before_shmem_exit(do_pg_abort_backup, DatumGetBool(true)); + already_done = true; } /* - * Has a standby promotion already been triggered? - * - * Unlike CheckForStandbyTrigger(), this works in any process - * that's connected to shared memory. + * Get latest WAL insert pointer */ -bool -PromoteIsTriggered(void) +XLogRecPtr +GetXLogInsertRecPtr(void) { - /* - * We check shared state each time only until a standby promotion is - * triggered. We can't trigger a promotion again, so there's no need to - * keep checking after the shared variable has once been seen true. - */ - if (LocalPromoteIsTriggered) - return true; + XLogCtlInsert *Insert = &XLogCtl->Insert; + uint64 current_bytepos; - SpinLockAcquire(&XLogCtl->info_lck); - LocalPromoteIsTriggered = XLogCtl->SharedPromoteIsTriggered; - SpinLockRelease(&XLogCtl->info_lck); + SpinLockAcquire(&Insert->insertpos_lck); + current_bytepos = Insert->CurrBytePos; + SpinLockRelease(&Insert->insertpos_lck); - return LocalPromoteIsTriggered; + return XLogBytePosToRecPtr(current_bytepos); } -static void -SetPromoteIsTriggered(void) +/* + * Get latest WAL write pointer + */ +XLogRecPtr +GetXLogWriteRecPtr(void) { SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->SharedPromoteIsTriggered = true; + LogwrtResult = XLogCtl->LogwrtResult; SpinLockRelease(&XLogCtl->info_lck); - /* - * Mark the recovery pause state as 'not paused' because the paused state - * ends and promotion continues if a promotion is triggered while recovery - * is paused. Otherwise pg_get_wal_replay_pause_state() can mistakenly - * return 'paused' while a promotion is ongoing. - */ - SetRecoveryPause(false); - - LocalPromoteIsTriggered = true; + return LogwrtResult.Write; } /* - * Check to see whether the user-specified trigger file exists and whether a - * promote request has arrived. If either condition holds, return true. + * Returns the redo pointer of the last checkpoint or restartpoint. This is + * the oldest point in WAL that we still need, if we have to restart recovery. */ -static bool -CheckForStandbyTrigger(void) +void +GetOldestRestartPoint(XLogRecPtr *oldrecptr, TimeLineID *oldtli) { - struct stat stat_buf; - - if (LocalPromoteIsTriggered) - return true; - - if (IsPromoteSignaled() && CheckPromoteSignal()) - { - ereport(LOG, (errmsg("received promote request"))); - RemovePromoteSignalFiles(); - ResetPromoteSignaled(); - SetPromoteIsTriggered(); - return true; - } - - if (PromoteTriggerFile == NULL || strcmp(PromoteTriggerFile, "") == 0) - return false; + LWLockAcquire(ControlFileLock, LW_SHARED); + *oldrecptr = ControlFile->checkPointCopy.redo; + *oldtli = ControlFile->checkPointCopy.ThisTimeLineID; + LWLockRelease(ControlFileLock); +} - if (stat(PromoteTriggerFile, &stat_buf) == 0) - { - ereport(LOG, - (errmsg("promote trigger file found: %s", PromoteTriggerFile))); - unlink(PromoteTriggerFile); - SetPromoteIsTriggered(); - return true; - } - else if (errno != ENOENT) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat promote trigger file \"%s\": %m", - PromoteTriggerFile))); +/* Thin wrapper around ShutdownWalRcv(). */ +void +XLogShutdownWalRcv(void) +{ + ShutdownWalRcv(); - return false; + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + XLogCtl->InstallXLogFileSegmentActive = false; + LWLockRelease(ControlFileLock); } -/* - * Remove the files signaling a standby promotion request. - */ +/* Enable WAL file recycling and preallocation. */ void -RemovePromoteSignalFiles(void) +SetInstallXLogFileSegmentActive(void) { - unlink(PROMOTE_SIGNAL_FILE); + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + XLogCtl->InstallXLogFileSegmentActive = true; + LWLockRelease(ControlFileLock); } -/* - * Check to see if a promote request has arrived. - */ bool -CheckPromoteSignal(void) +IsInstallXLogFileSegmentActive(void) { - struct stat stat_buf; - - if (stat(PROMOTE_SIGNAL_FILE, &stat_buf) == 0) - return true; + bool result; - return false; -} + LWLockAcquire(ControlFileLock, LW_SHARED); + result = XLogCtl->InstallXLogFileSegmentActive; + LWLockRelease(ControlFileLock); -/* - * Wake up startup process to replay newly arrived WAL, or to notice that - * failover has been requested. - */ -void -WakeupRecovery(void) -{ - SetLatch(&XLogCtl->recoveryWakeupLatch); + return result; } /* @@ -13241,12 +8906,3 @@ SetWalWriterSleeping(bool sleeping) XLogCtl->WalWriterSleeping = sleeping; SpinLockRelease(&XLogCtl->info_lck); } - -/* - * Schedule a walreceiver wakeup in the main recovery loop. - */ -void -XLogRequestWalReceiverReply(void) -{ - doRequestWalReceiverReply = true; -} diff --git a/third_party/spanner_pg/src/backend/access/transam/xlogarchive.c b/third_party/spanner_pg/src/backend/access/transam/xlogarchive.c index 26b023e7..6516a74a 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xlogarchive.c +++ b/third_party/spanner_pg/src/backend/access/transam/xlogarchive.c @@ -4,7 +4,7 @@ * Functions for archiving WAL files and restoring from the archive. * * - * 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 * * src/backend/access/transam/xlogarchive.c @@ -24,6 +24,7 @@ #include "access/xlogarchive.h" #include "common/archive.h" #include "miscadmin.h" +#include "pgstat.h" #include "postmaster/startup.h" #include "postmaster/pgarch.h" #include "replication/walsender.h" @@ -160,8 +161,15 @@ RestoreArchivedFile(char *path, const char *xlogfname, (errmsg_internal("executing restore command \"%s\"", xlogRestoreCmd))); + pgstat_report_wait_start(WAIT_EVENT_RESTORE_COMMAND); + /* - * Check signals before restore command and reset afterwards. + * PreRestoreCommand() informs the SIGTERM handler for the startup process + * that it should proc_exit() right away. This is done for the duration + * of the system() call because there isn't a good way to break out while + * it is executing. Since we might call proc_exit() in a signal handler, + * it is best to put any additional logic before or after the + * PreRestoreCommand()/PostRestoreCommand() section. */ PreRestoreCommand(); @@ -171,6 +179,8 @@ RestoreArchivedFile(char *path, const char *xlogfname, rc = system(xlogRestoreCmd); PostRestoreCommand(); + + pgstat_report_wait_end(); pfree(xlogRestoreCmd); if (rc == 0) @@ -284,7 +294,8 @@ RestoreArchivedFile(char *path, const char *xlogfname, * This is currently used for recovery_end_command and archive_cleanup_command. */ void -ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOnSignal) +ExecuteRecoveryCommand(const char *command, const char *commandName, + bool failOnSignal, uint32 wait_event_info) { char xlogRecoveryCmd[MAXPGPATH]; char lastRestartPointFname[MAXPGPATH]; @@ -354,7 +365,10 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOn /* * execute the constructed command */ + pgstat_report_wait_start(wait_event_info); rc = system(xlogRecoveryCmd); + pgstat_report_wait_end(); + if (rc != 0) { /* @@ -489,6 +503,20 @@ XLogArchiveNotify(const char *xlog) return; } + /* + * Timeline history files are given the highest archival priority to lower + * the chance that a promoted standby will choose a timeline that is + * already in use. However, the archiver ordinarily tries to gather + * multiple files to archive from each scan of the archive_status + * directory, which means that newly created timeline history files could + * be left unarchived for a while. To ensure that the archiver picks up + * timeline history files as soon as possible, we force the archiver to + * scan the archive_status directory the next time it looks for a file to + * archive. + */ + if (IsTLHistoryFileName(xlog)) + PgArchForceDirScan(); + /* Notify archiver that it's got something to do */ if (IsUnderPostmaster) PgArchWakeup(); @@ -498,11 +526,13 @@ XLogArchiveNotify(const char *xlog) * Convenience routine to notify using segment number representation of filename */ void -XLogArchiveNotifySeg(XLogSegNo segno) +XLogArchiveNotifySeg(XLogSegNo segno, TimeLineID tli) { char xlog[MAXFNAMELEN]; - XLogFileName(xlog, ThisTimeLineID, segno, wal_segment_size); + Assert(tli != 0); + + XLogFileName(xlog, tli, segno, wal_segment_size); XLogArchiveNotify(xlog); } diff --git a/third_party/spanner_pg/src/backend/access/transam/xlogfuncs.c b/third_party/spanner_pg/src/backend/access/transam/xlogfuncs.c index 0823b8dc..d08990e0 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xlogfuncs.c +++ b/third_party/spanner_pg/src/backend/access/transam/xlogfuncs.c @@ -7,7 +7,7 @@ * This file contains WAL control and information functions. * * - * 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 * * src/backend/access/transam/xlogfuncs.c @@ -19,8 +19,8 @@ #include #include "access/htup_details.h" -#include "access/xlog.h" #include "access/xlog_internal.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/pg_type.h" #include "funcapi.h" @@ -41,13 +41,13 @@ #include "third_party/spanner_pg/shims/catalog_shim.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 @@ -59,105 +59,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. - * - * The first parameter (variable 'exclusive') allows the user to tell us if - * this is an exclusive or a non-exclusive backup. + * pg_backup_stop: finish taking an on-line 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. * @@ -165,98 +104,50 @@ pg_stop_backup(PG_FUNCTION_ARGS) * GRANT system. */ Datum -pg_stop_backup_v2(PG_FUNCTION_ARGS) +pg_backup_stop(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); + bool waitforarchive = PG_GETARG_BOOL(0); 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)); - 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); - - tuplestore_putvalues(tupstore, tupdesc, values, nulls); - tuplestore_donestoring(tupstore); - - return (Datum) 0; + 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))); } /* @@ -325,7 +216,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 @@ -348,7 +239,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. */ @@ -369,7 +260,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. */ @@ -384,13 +275,13 @@ pg_current_wal_flush_lsn(PG_FUNCTION_ARGS) errmsg("recovery is in progress"), errhint("WAL control functions cannot be executed during recovery."))); - current_recptr = GetFlushRecPtr(); + current_recptr = GetFlushRecPtr(NULL); PG_RETURN_LSN(current_recptr); } /* - * 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. @@ -409,7 +300,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. @@ -429,7 +320,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 @@ -471,7 +362,8 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) * xlogfilename */ XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); - XLogFileName(xlogfilename, ThisTimeLineID, xlogsegno, wal_segment_size); + XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, + wal_segment_size); values[0] = CStringGetTextDatum(xlogfilename); isnull[0] = false; @@ -496,7 +388,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) @@ -513,7 +405,8 @@ pg_walfile_name(PG_FUNCTION_ARGS) "pg_walfile_name()"))); XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); - XLogFileName(xlogfilename, ThisTimeLineID, xlogsegno, wal_segment_size); + XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, + wal_segment_size); PG_RETURN_TEXT_P(cstring_to_text(xlogfilename)); } @@ -670,81 +563,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/third_party/spanner_pg/src/backend/access/transam/xloginsert.c b/third_party/spanner_pg/src/backend/access/transam/xloginsert.c index 134c78f1..35cc0559 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xloginsert.c +++ b/third_party/spanner_pg/src/backend/access/transam/xloginsert.c @@ -9,7 +9,7 @@ * of XLogRecData structs by a call to XLogRecordAssemble(). See * access/transam/README for details. * - * 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 * * src/backend/access/transam/xloginsert.c @@ -19,6 +19,14 @@ #include "postgres.h" +#ifdef USE_LZ4 +#include +#endif + +#ifdef USE_ZSTD +#include +#endif + #include "access/xact.h" #include "access/xlog.h" #include "access/xlog_internal.h" @@ -33,8 +41,26 @@ #include "storage/proc.h" #include "utils/memutils.h" +/* + * Guess the maximum buffer size required to store a compressed version of + * backup block image. + */ +#ifdef USE_LZ4 +#define LZ4_MAX_BLCKSZ LZ4_COMPRESSBOUND(BLCKSZ) +#else +#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) + /* Buffer size required to store a compressed version of backup block image */ -#define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ) +#define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ) /* * For each block reference registered with XLogRegisterBuffer, we fill in @@ -58,7 +84,7 @@ typedef struct * backup block data in XLogRecordAssemble() */ /* buffer to store a compressed version of backup block image */ - char compressed_page[PGLZ_MAX_BLCKSZ]; + char compressed_page[COMPRESS_BUFSIZE]; } registered_buffer; static registered_buffer *registered_buffers; @@ -111,7 +137,8 @@ static MemoryContext xloginsert_cxt; static XLogRecData *XLogRecordAssemble(RmgrId rmid, uint8 info, XLogRecPtr RedoRecPtr, bool doPageWrites, - XLogRecPtr *fpw_lsn, int *num_fpi); + XLogRecPtr *fpw_lsn, int *num_fpi, + bool *topxid_included); static bool XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length, char *dest, uint16 *dlen); @@ -197,10 +224,6 @@ XLogResetInsertion(void) { int i; - /* reset the subxact assignment flag (if needed) */ - if (curinsert_flags & XLOG_INCLUDE_XID) - MarkSubTransactionAssigned(); - for (i = 0; i < max_registered_block_id; i++) registered_buffers[i].in_use = false; @@ -275,8 +298,6 @@ XLogRegisterBlock(uint8 block_id, RelFileNode *rnode, ForkNumber forknum, { registered_buffer *regbuf; - /* This is currently only used to WAL-log a full-page image of a page */ - Assert(flags & REGBUF_FORCE_IMAGE); Assert(begininsert_called); if (block_id >= max_registered_block_id) @@ -399,8 +420,6 @@ XLogRegisterBufData(uint8 block_id, char *data, int len) * - XLOG_MARK_UNIMPORTANT, to signal that the record is not important for * durability, which allows to avoid triggering WAL archiving and other * background activity. - * - XLOG_INCLUDE_XID, a message-passing hack between XLogRecordAssemble - * and XLogResetInsertion. */ void XLogSetRecordFlags(uint8 flags) @@ -455,6 +474,7 @@ XLogInsert(RmgrId rmid, uint8 info) { XLogRecPtr RedoRecPtr; bool doPageWrites; + bool topxid_included = false; XLogRecPtr fpw_lsn; XLogRecData *rdt; int num_fpi = 0; @@ -467,9 +487,10 @@ XLogInsert(RmgrId rmid, uint8 info) GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites); rdt = XLogRecordAssemble(rmid, info, RedoRecPtr, doPageWrites, - &fpw_lsn, &num_fpi); + &fpw_lsn, &num_fpi, &topxid_included); - EndPos = XLogInsertRecord(rdt, fpw_lsn, curinsert_flags, num_fpi); + EndPos = XLogInsertRecord(rdt, fpw_lsn, curinsert_flags, num_fpi, + topxid_included); } while (EndPos == InvalidXLogRecPtr); XLogResetInsertion(); @@ -488,11 +509,14 @@ XLogInsert(RmgrId rmid, uint8 info) * of all of them, *fpw_lsn is set to the lowest LSN among such pages. This * signals that the assembled record is only good for insertion on the * assumption that the RedoRecPtr and doPageWrites values were up-to-date. + * + * *topxid_included is set if the topmost transaction ID is logged with the + * current subtransaction. */ static XLogRecData * XLogRecordAssemble(RmgrId rmid, uint8 info, XLogRecPtr RedoRecPtr, bool doPageWrites, - XLogRecPtr *fpw_lsn, int *num_fpi) + XLogRecPtr *fpw_lsn, int *num_fpi, bool *topxid_included) { XLogRecData *rdt; uint32 total_len = 0; @@ -630,7 +654,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, /* * Try to compress a block image if wal_compression is enabled */ - if (wal_compression) + if (wal_compression != WAL_COMPRESSION_NONE) { is_compressed = XLogCompressBackupBlock(page, bimg.hole_offset, @@ -667,8 +691,37 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, if (is_compressed) { + /* The current compression is stored in the WAL record */ bimg.length = compressed_len; - bimg.bimg_info |= BKPIMAGE_IS_COMPRESSED; + + /* Set the compression method used for this block */ + switch ((WalCompression) wal_compression) + { + case WAL_COMPRESSION_PGLZ: + bimg.bimg_info |= BKPIMAGE_COMPRESS_PGLZ; + break; + + case WAL_COMPRESSION_LZ4: +#ifdef USE_LZ4 + bimg.bimg_info |= BKPIMAGE_COMPRESS_LZ4; +#else + elog(ERROR, "LZ4 is not supported by this build"); +#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; + /* no default case, so that compiler will warn */ + } rdt_datas_last->data = regbuf->compressed_page; rdt_datas_last->len = compressed_len; @@ -757,12 +810,12 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, } /* followed by toplevel XID, if not already included in previous record */ - if (IsSubTransactionAssignmentPending()) + if (IsSubxactTopXidLogPending()) { TransactionId xid = GetTopTransactionIdIfAny(); - /* update the flag (later used by XLogResetInsertion) */ - XLogSetRecordFlags(XLOG_INCLUDE_XID); + /* Set the flag that the top xid is included in the WAL */ + *topxid_included = true; *(scratch++) = (char) XLR_BLOCK_ID_TOPLEVEL_XID; memcpy(scratch, &xid, sizeof(TransactionId)); @@ -832,7 +885,7 @@ XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length, char *dest, uint16 *dlen) { int32 orig_len = BLCKSZ - hole_length; - int32 len; + int32 len = -1; int32 extra_bytes = 0; char *source; PGAlignedBlock tmp; @@ -855,12 +908,45 @@ XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length, else source = page; + switch ((WalCompression) wal_compression) + { + case WAL_COMPRESSION_PGLZ: + len = pglz_compress(source, orig_len, dest, PGLZ_strategy_default); + break; + + case WAL_COMPRESSION_LZ4: +#ifdef USE_LZ4 + len = LZ4_compress_default(source, dest, orig_len, + COMPRESS_BUFSIZE); + if (len <= 0) + len = -1; /* failure */ +#else + elog(ERROR, "LZ4 is not supported by this build"); +#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; + /* no default case, so that compiler will warn */ + } + /* - * We recheck the actual size even if pglz_compress() reports success and - * see if the number of bytes saved by compression is larger than the - * length of extra data needed for the compressed version of block image. + * We recheck the actual size even if compression reports success and see + * if the number of bytes saved by compression is larger than the length + * of extra data needed for the compressed version of block image. */ - len = pglz_compress(source, orig_len, dest, PGLZ_strategy_default); if (len >= 0 && len + extra_bytes < orig_len) { @@ -925,7 +1011,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) /* * Ensure no checkpoint can change our view of RedoRecPtr. */ - Assert(MyProc->delayChkpt); + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) != 0); /* * Update RedoRecPtr so that we can make the right decision @@ -942,7 +1028,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) if (lsn <= RedoRecPtr) { - int flags; + int flags = 0; PGAlignedBlock copied_buffer; char *origdata = (char *) BufferGetBlock(buffer); RelFileNode rnode; @@ -969,7 +1055,6 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std) XLogBeginInsert(); - flags = REGBUF_FORCE_IMAGE; if (buffer_std) flags |= REGBUF_STANDARD; diff --git a/third_party/spanner_pg/src/backend/access/transam/xlogprefetcher.c b/third_party/spanner_pg/src/backend/access/transam/xlogprefetcher.c new file mode 100644 index 00000000..b98b3192 --- /dev/null +++ b/third_party/spanner_pg/src/backend/access/transam/xlogprefetcher.c @@ -0,0 +1,1105 @@ +/*------------------------------------------------------------------------- + * + * 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 && \ + maintenance_io_concurrency > 0) +#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); + + /* 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); + if (record == NULL) + { + /* + * We can't read any more, due to an error or lack of data in + * 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; + } + + /* + * 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]; + + InitMaterializedSRF(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; + XLogRecPtr replayed_up_to; + + /* + * 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()) + { + Assert(maintenance_io_concurrency > 0); + max_inflight = maintenance_io_concurrency; + 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, as it's now been + * replayed. + */ + replayed_up_to = XLogReleasePreviousRecord(prefetcher->reader); + + /* + * Can we drop any filters yet? 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, replayed_up_to); + + /* + * All IO initiated by earlier WAL is now completed. This might trigger + * further prefetching. + */ + lrq_complete_lsn(prefetcher->streaming_read, replayed_up_to); + + /* + * If there's nothing queued yet, then start prefetching to cause at least + * one record to be queued. + */ + if (!XLogReaderHasQueuedRecordOrError(prefetcher->reader)) + { + Assert(lrq_inflight(prefetcher->streaming_read) == 0); + Assert(lrq_completed(prefetcher->streaming_read) == 0); + 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); + + /* + * If maintenance_io_concurrency is set very low, we might have started + * prefetching some but not all of the blocks referenced in the record + * we're about to return. Forget about the rest of the blocks in this + * record by dropping the prefetcher's reference to it. + */ + if (record == prefetcher->record) + prefetcher->record = NULL; + + /* + * 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); + + 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 is 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/third_party/spanner_pg/src/backend/access/transam/xlogreader.c b/third_party/spanner_pg/src/backend/access/transam/xlogreader.c index f84569cd..e7ad3317 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xlogreader.c +++ b/third_party/spanner_pg/src/backend/access/transam/xlogreader.c @@ -3,7 +3,7 @@ * xlogreader.c * Generic XLog reading facility * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/transam/xlogreader.c @@ -18,6 +18,12 @@ #include "postgres.h" #include +#ifdef USE_LZ4 +#include +#endif +#ifdef USE_ZSTD +#include +#endif #include "access/transam.h" #include "access/xlog_internal.h" @@ -31,6 +37,8 @@ #include "miscadmin.h" #include "pgstat.h" #include "utils/memutils.h" +#else +#include "common/logging.h" #endif static void report_invalid_record(XLogReaderState *state, const char *fmt,...) @@ -39,6 +47,7 @@ static void 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, @@ -50,6 +59,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. @@ -64,6 +79,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; } /* @@ -86,8 +119,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 @@ -131,18 +162,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) @@ -197,7 +221,7 @@ WALOpenSegmentInit(WALOpenSegment *seg, WALSegmentContext *segcxt, /* * Begin reading WAL at 'RecPtr'. * - * 'RecPtr' should point to the beginnning of a valid WAL record. Pointing at + * 'RecPtr' should point to the beginning of a valid WAL record. Pointing at * the beginning of a page is also OK, if there is a new record right after * the page header, i.e. not a continuation. * @@ -214,7 +238,137 @@ XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr) /* Begin at the passed-in record pointer. */ state->EndRecPtr = RecPtr; + state->NextRecPtr = RecPtr; state->ReadRecPtr = InvalidXLogRecPtr; + state->DecodeRecPtr = InvalidXLogRecPtr; +} + +/* + * Release the last record that was returned by XLogNextRecord(), if any, to + * free up space. Returns the LSN past the end of the record. + */ +XLogRecPtr +XLogReleasePreviousRecord(XLogReaderState *state) +{ + DecodedXLogRecord *record; + XLogRecPtr next_lsn; + + if (!state->record) + return InvalidXLogRecPtr; + + /* + * Remove it from the decoded record queue. It must be the oldest item + * decoded, decode_queue_head. + */ + record = state->record; + next_lsn = record->next_lsn; + 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 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; + } + } + + return next_lsn; +} + +/* + * 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; } /* @@ -235,6 +389,145 @@ 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 (required_space <= + state->decode_buffer_size - + (state->decode_buffer_tail - state->decode_buffer)) + { + /*- + * There is space between tail and end. + * + * +-----+--------------------+-----+ + * | |////////////////////|here!| + * +-----+--------------------+-----+ + * ^ ^ + * | | + * h t + */ + decoded = (DecodedXLogRecord *) state->decode_buffer_tail; + decoded->oversized = false; + return decoded; + } + else if (required_space < + state->decode_buffer_head - state->decode_buffer) + { + /*- + * There is space between start and head. + * + * +-----+--------------------+-----+ + * |here!|////////////////////| | + * +-----+--------------------+-----+ + * ^ ^ + * | | + * h t + */ + decoded = (DecodedXLogRecord *) state->decode_buffer; + decoded->oversized = false; + return decoded; + } + } + else + { + /* Tail is to the left of head. */ + if (required_space < + state->decode_buffer_head - state->decode_buffer_tail) + { + /*- + * There is space between tail and head. + * + * +-----+--------------------+-----+ + * |/////|here! |/////| + * +-----+--------------------+-----+ + * ^ ^ + * | | + * t h + */ + 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(required_space); + decoded->oversized = true; + return decoded; + } + + return NULL; +} + +static XLogPageReadResult +XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) { XLogRecPtr RecPtr; XLogRecord *record; @@ -247,6 +540,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 @@ -256,21 +551,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. @@ -281,7 +575,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)); @@ -289,6 +583,7 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) } restart: + state->nonblocking = nonblocking; state->currRecPtr = RecPtr; assembled = false; @@ -302,7 +597,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; /* @@ -358,7 +655,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; @@ -378,6 +675,24 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) gotheader = false; } + /* + * Try to find space to decode this record, if we can do so without + * calling palloc. If we can't, we'll try again below after we've + * validated that total_len isn't garbage bytes from a recycled WAL page. + */ + decoded = XLogReadRecordAlloc(state, + total_len, + false /* allow_oversized */ ); + if (decoded == NULL && nonblocking) + { + /* + * There is no space in the circular decode buffer, and the caller is + * only reading ahead. The caller should consume existing records to + * make space. + */ + return XLREAD_WOULDBLOCK; + } + len = XLOG_BLCKSZ - RecPtr % XLOG_BLCKSZ; if (total_len > len) { @@ -412,7 +727,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); @@ -430,7 +747,6 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) if (pageHeader->xlp_info & XLP_FIRST_IS_OVERWRITE_CONTRECORD) { state->overwrittenRecPtr = RecPtr; - ResetDecoder(state); RecPtr = targetPagePtr; goto restart; } @@ -485,7 +801,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; @@ -497,7 +813,6 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) * also cross-checked total_len against xlp_rem_len on the second * page, and verified xlp_pageaddr on both. */ - Assert(gotheader); if (total_len > state->readRecordBufSize) { char save_copy[XLOG_BLCKSZ * 2]; @@ -521,8 +836,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 @@ -530,16 +845,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; } /* @@ -549,14 +866,52 @@ 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; - else - return NULL; + /* + * If we got here without a DecodedXLogRecord, it means we needed to + * validate total_len before trusting it, but by now now we've done that. + */ + if (decoded == NULL) + { + Assert(!nonblocking); + decoded = XLogReadRecordAlloc(state, + total_len, + true /* allow_oversized */ ); + /* allocation should always happen under allow_oversized */ + Assert(decoded != NULL); + } + + 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; + } err: if (assembled) @@ -572,16 +927,55 @@ XLogReadRecord(XLogReaderState *state, char **errormsg) */ state->abortedRecPtr = RecPtr; state->missingContrecPtr = targetPagePtr; + + /* + * If we got here without reporting an error, make sure an error is + * queued so that XLogPrefetcherReadRecord() doesn't bring us back a + * second time and clobber the above state. + */ + state->errormsg_deferred = true; } + 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; } @@ -590,8 +984,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. @@ -614,6 +1014,13 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) targetPageOff == state->segoff && reqLen <= state->readLen) return state->readLen; + /* + * Invalidate contents of internal buffer before read attempt. Just set + * the length to 0, rather than a full XLogReaderInvalReadState(), so we + * don't forget the segment we last successfully read. + */ + state->readLen = 0; + /* * Data is not in our buffer. * @@ -633,7 +1040,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 */ @@ -651,7 +1060,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); @@ -670,7 +1081,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; } @@ -689,7 +1102,8 @@ ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen) err: XLogReaderInvalReadState(state); - return -1; + + return XLREAD_FAIL; } /* @@ -722,7 +1136,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr, (uint32) SizeOfXLogRecord, record->xl_tot_len); return false; } - if (record->xl_rmid > RM_MAX_ID) + if (!RmgrIdIsValid(record->xl_rmid)) { report_invalid_record(state, "invalid resource manager ID %u at %X/%X", @@ -942,12 +1356,15 @@ 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. + * Forget about an error produced by XLogReaderValidatePageHeader(). */ +void +XLogReaderResetError(XLogReaderState *state) +{ + state->errormsg_buf[0] = '\0'; + state->errormsg_deferred = false; +} /* * Find the first record with an lsn >= RecPtr. @@ -970,6 +1387,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 @@ -1066,8 +1486,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 @@ -1170,34 +1588,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; - - state->decoded_record = NULL; - - state->main_data_len = 0; + DecodedXLogRecord *r; - 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; +} + +/* + * 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 the previously read record. + * 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. @@ -1212,17 +1679,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; @@ -1240,7 +1710,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 */ @@ -1251,18 +1721,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) { @@ -1270,7 +1740,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", @@ -1278,9 +1752,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; @@ -1290,6 +1764,8 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) 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) @@ -1317,7 +1793,7 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) blk->apply_image = ((blk->bimg_info & BKPIMAGE_APPLY) != 0); - if (blk->bimg_info & BKPIMAGE_IS_COMPRESSED) + if (BKPIMAGE_COMPRESSED(blk->bimg_info)) { if (blk->bimg_info & BKPIMAGE_HAS_HOLE) COPY_HEADER_FIELD(&blk->hole_length, sizeof(uint16)); @@ -1362,29 +1838,28 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) } /* - * cross-check that bimg_len < BLCKSZ if the IS_COMPRESSED - * flag is set. + * Cross-check that bimg_len < BLCKSZ if it is compressed. */ - if ((blk->bimg_info & BKPIMAGE_IS_COMPRESSED) && + if (BKPIMAGE_COMPRESSED(blk->bimg_info) && blk->bimg_len == BLCKSZ) { report_invalid_record(state, - "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X", + "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X", (unsigned int) blk->bimg_len, LSN_FORMAT_ARGS(state->ReadRecPtr)); goto err; } /* - * cross-check that bimg_len = BLCKSZ if neither HAS_HOLE nor - * IS_COMPRESSED flag is set. + * cross-check that bimg_len = BLCKSZ if neither HAS_HOLE is + * set nor COMPRESSED(). */ if (!(blk->bimg_info & BKPIMAGE_HAS_HOLE) && - !(blk->bimg_info & BKPIMAGE_IS_COMPRESSED) && + !BKPIMAGE_COMPRESSED(blk->bimg_info) && blk->bimg_len != BLCKSZ) { report_invalid_record(state, - "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X", + "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X", (unsigned int) blk->data_len, LSN_FORMAT_ARGS(state->ReadRecPtr)); goto err; @@ -1424,17 +1899,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; @@ -1443,58 +1919,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: @@ -1510,26 +1965,54 @@ DecodeXLogRecord(XLogReaderState *state, XLogRecord *record, char **errormsg) /* * 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. + * This is like XLogRecGetBlockTagExtended, except that the block reference + * must exist and there's no access to prefetch_buffer. */ -bool +void XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileNode *rnode, ForkNumber *forknum, BlockNumber *blknum) +{ + if (!XLogRecGetBlockTagExtended(record, block_id, rnode, forknum, blknum, + NULL)) + { +#ifndef FRONTEND + elog(ERROR, "could not locate backup block with ID %d in WAL record", + block_id); +#else + pg_fatal("could not locate backup block with ID %d in WAL record", + block_id); +#endif + } +} + +/* + * 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; - if (!record->blocks[block_id].in_use) + if (!XLogRecHasBlockRef(record, block_id)) return false; - bkpb = &record->blocks[block_id]; + bkpb = &record->record->blocks[block_id]; if (rnode) *rnode = bkpb->rnode; if (forknum) *forknum = bkpb->forknum; if (blknum) *blknum = bkpb->blkno; + if (prefetch_buffer) + *prefetch_buffer = bkpb->prefetch_buffer; return true; } @@ -1543,10 +2026,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) { @@ -1565,7 +2049,8 @@ XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len) /* * Restore a full-page image from a backup block attached to an XLOG record. * - * Returns true if a full-page image is restored. + * Returns true if a full-page image is restored, and false on failure with + * an error to be consumed by the caller. */ bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page) @@ -1574,25 +2059,84 @@ 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) + { + report_invalid_record(record, + "could not restore image at %X/%X with invalid block %d specified", + LSN_FORMAT_ARGS(record->ReadRecPtr), + block_id); return false; - if (!record->blocks[block_id].has_image) + } + if (!record->record->blocks[block_id].has_image) + { + report_invalid_record(record, "could not restore image at %X/%X with invalid state, block %d", + LSN_FORMAT_ARGS(record->ReadRecPtr), + block_id); return false; + } - bkpb = &record->blocks[block_id]; + bkpb = &record->record->blocks[block_id]; ptr = bkpb->bkp_image; - if (bkpb->bimg_info & BKPIMAGE_IS_COMPRESSED) + if (BKPIMAGE_COMPRESSED(bkpb->bimg_info)) { /* If a backup block image is compressed, decompress it */ - if (pglz_decompress(ptr, bkpb->bimg_len, tmp.data, - BLCKSZ - bkpb->hole_length, true) < 0) + bool decomp_success = true; + + if ((bkpb->bimg_info & BKPIMAGE_COMPRESS_PGLZ) != 0) + { + if (pglz_decompress(ptr, bkpb->bimg_len, tmp.data, + BLCKSZ - bkpb->hole_length, true) < 0) + decomp_success = false; + } + else if ((bkpb->bimg_info & BKPIMAGE_COMPRESS_LZ4) != 0) { - report_invalid_record(record, "invalid compressed image at %X/%X, block %d", +#ifdef USE_LZ4 + if (LZ4_decompress_safe(ptr, tmp.data, + bkpb->bimg_len, BLCKSZ - bkpb->hole_length) <= 0) + decomp_success = false; +#else + report_invalid_record(record, "could not restore image at %X/%X compressed with %s not supported by build, block %d", LSN_FORMAT_ARGS(record->ReadRecPtr), + "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, "could not restore 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 + { + report_invalid_record(record, "could not restore image at %X/%X compressed with unknown method, block %d", + LSN_FORMAT_ARGS(record->ReadRecPtr), + block_id); + return false; + } + + if (!decomp_success) + { + report_invalid_record(record, "could not decompress image at %X/%X, block %d", + LSN_FORMAT_ARGS(record->ReadRecPtr), + block_id); + return false; + } + ptr = tmp.data; } diff --git a/third_party/spanner_pg/src/backend/access/transam/xlogrecovery.c b/third_party/spanner_pg/src/backend/access/transam/xlogrecovery.c new file mode 100644 index 00000000..1503b216 --- /dev/null +++ b/third_party/spanner_pg/src/backend/access/transam/xlogrecovery.c @@ -0,0 +1,4733 @@ +/*------------------------------------------------------------------------- + * + * xlogrecovery.c + * Functions for WAL recovery, standby mode + * + * This source file contains functions controlling WAL recovery. + * InitWalRecovery() initializes the system for crash or archive recovery, + * or standby mode, depending on configuration options and the state of + * the control file and possible backup label file. PerformWalRecovery() + * performs the actual WAL replay, calling the rmgr-specific redo routines. + * EndWalRecovery() performs end-of-recovery checks and cleanup actions, + * and prepares information needed to initialize the WAL for writes. In + * addition to these three main functions, there are a bunch of functions + * for interrogating recovery state and controlling the recovery process. + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/backend/access/transam/xlogrecovery.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include +#include +#include +#include +#include +#include + +#include "access/timeline.h" +#include "access/transam.h" +#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" +#include "backup/basebackup.h" +#include "catalog/pg_control.h" +#include "commands/tablespace.h" +#include "common/file_utils.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "postmaster/bgwriter.h" +#include "postmaster/startup.h" +#include "replication/walreceiver.h" +#include "storage/fd.h" +#include "storage/ipc.h" +#include "storage/latch.h" +#include "storage/pmsignal.h" +#include "storage/proc.h" +#include "storage/procarray.h" +#include "storage/spin.h" +#include "utils/builtins.h" +#include "utils/guc.h" +#include "utils/ps_status.h" +#include "utils/pg_rusage.h" + +/* Unsupported old recovery command file names (relative to $PGDATA) */ +#define RECOVERY_COMMAND_FILE "recovery.conf" +#define RECOVERY_COMMAND_DONE "recovery.done" + +/* + * GUC support + */ +const struct config_enum_entry recovery_target_action_options[] = { + {"pause", RECOVERY_TARGET_ACTION_PAUSE, false}, + {"promote", RECOVERY_TARGET_ACTION_PROMOTE, false}, + {"shutdown", RECOVERY_TARGET_ACTION_SHUTDOWN, false}, + {NULL, 0, false} +}; + +/* options formerly taken from recovery.conf for archive recovery */ +char *recoveryRestoreCommand = NULL; +char *recoveryEndCommand = NULL; +char *archiveCleanupCommand = NULL; +RecoveryTargetType recoveryTarget = RECOVERY_TARGET_UNSET; +bool recoveryTargetInclusive = true; +int recoveryTargetAction = RECOVERY_TARGET_ACTION_PAUSE; +TransactionId recoveryTargetXid; +char *recovery_target_time_string; +TimestampTz recoveryTargetTime; +const char *recoveryTargetName; +XLogRecPtr recoveryTargetLSN; +int recovery_min_apply_delay = 0; + +/* options formerly taken from recovery.conf for XLOG streaming */ +char *PrimaryConnInfo = NULL; +char *PrimarySlotName = NULL; +char *PromoteTriggerFile = NULL; +bool wal_receiver_create_temp_slot = false; + +/* + * recoveryTargetTimeLineGoal: what the user requested, if any + * + * recoveryTargetTLIRequested: numeric value of requested timeline, if constant + * + * recoveryTargetTLI: the currently understood target timeline; changes + * + * expectedTLEs: a list of TimeLineHistoryEntries for recoveryTargetTLI and + * the timelines of its known parents, newest first (so recoveryTargetTLI is + * always the first list member). Only these TLIs are expected to be seen in + * the WAL segments we read, and indeed only these TLIs will be considered as + * candidate WAL files to open at all. + * + * curFileTLI: the TLI appearing in the name of the current input WAL file. + * (This is not necessarily the same as the timeline from which we are + * replaying WAL, which StartupXLOG calls replayTLI, because we could be + * scanning data that was copied from an ancestor timeline when the current + * file was created.) During a sequential scan we do not allow this value + * to decrease. + */ +RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal = RECOVERY_TARGET_TIMELINE_LATEST; +TimeLineID recoveryTargetTLIRequested = 0; +TimeLineID recoveryTargetTLI = 0; +static List *expectedTLEs; +static TimeLineID curFileTLI; + +/* + * When ArchiveRecoveryRequested is set, archive recovery was requested, + * ie. signal files were present. When InArchiveRecovery is set, we are + * currently recovering using offline XLOG archives. These variables are only + * valid in the startup process. + * + * When ArchiveRecoveryRequested is true, but InArchiveRecovery is false, we're + * currently performing crash recovery using only XLOG files in pg_wal, but + * will switch to using offline XLOG archives as soon as we reach the end of + * WAL in pg_wal. +*/ +bool ArchiveRecoveryRequested = false; +bool InArchiveRecovery = false; + +/* + * When StandbyModeRequested is set, standby mode was requested, i.e. + * standby.signal file was present. When StandbyMode is set, we are currently + * in standby mode. These variables are only valid in the startup process. + * They work similarly to ArchiveRecoveryRequested and InArchiveRecovery. + */ +static bool StandbyModeRequested = false; +bool StandbyMode = false; + +/* was a signal file present at startup? */ +static bool standby_signal_file_found = false; +static bool recovery_signal_file_found = false; + +/* + * CheckPointLoc is the position of the checkpoint record that determines + * where to start the replay. It comes from the backup label file or the + * control file. + * + * RedoStartLSN is the checkpoint's REDO location, also from the backup label + * file or the control file. In standby mode, XLOG streaming usually starts + * from the position where an invalid record was found. But if we fail to + * read even the initial checkpoint record, we use the REDO location instead + * of the checkpoint location as the start position of XLOG streaming. + * Otherwise we would have to jump backwards to the REDO location after + * reading the checkpoint record, because the REDO record can precede the + * checkpoint record. + */ +static XLogRecPtr CheckPointLoc = InvalidXLogRecPtr; +static TimeLineID CheckPointTLI = 0; +static XLogRecPtr RedoStartLSN = InvalidXLogRecPtr; +static TimeLineID RedoStartTLI = 0; + +/* + * Local copy of SharedHotStandbyActive variable. False actually means "not + * known, need to check the shared state". + */ +static bool LocalHotStandbyActive = false; + +/* + * Local copy of SharedPromoteIsTriggered variable. False actually means "not + * known, need to check the shared state". + */ +static bool LocalPromoteIsTriggered = false; + +/* Has the recovery code requested a walreceiver wakeup? */ +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 +{ + int emode; + bool fetching_ckpt; /* are we fetching a checkpoint record? */ + bool randAccess; + TimeLineID replayTLI; +} XLogPageReadPrivate; + +/* flag to tell XLogPageRead that we have started replaying */ +static bool InRedo = false; + +/* + * Codes indicating where we got a WAL file from during recovery, or where + * to attempt to get one. + */ +typedef enum +{ + XLOG_FROM_ANY = 0, /* request to read WAL from any source */ + XLOG_FROM_ARCHIVE, /* restored using restore_command */ + XLOG_FROM_PG_WAL, /* existing file in pg_wal */ + XLOG_FROM_STREAM /* streamed from primary */ +} XLogSource; + +/* human-readable names for XLogSources, for debugging output */ +static const char *const xlogSourceNames[] = {"any", "archive", "pg_wal", "stream"}; + +/* + * readFile is -1 or a kernel FD for the log file segment that's currently + * open for reading. readSegNo identifies the segment. readOff is the offset + * of the page just read, readLen indicates how much of it has been read into + * readBuf, and readSource indicates where we got the currently open file from. + * + * Note: we could use Reserve/ReleaseExternalFD to track consumption of this + * FD too (like for openLogFile in xlog.c); but it doesn't currently seem + * worthwhile, since the XLOG is not read by general-purpose sessions. + */ +static int readFile = -1; +static XLogSegNo readSegNo = 0; +static uint32 readOff = 0; +static uint32 readLen = 0; +static XLogSource readSource = XLOG_FROM_ANY; + +/* + * Keeps track of which source we're currently reading from. This is + * different from readSource in that this is always set, even when we don't + * currently have a WAL file open. If lastSourceFailed is set, our last + * attempt to read from currentSource failed, and we should try another source + * next. + * + * pendingWalRcvRestart is set when a config change occurs that requires a + * walreceiver restart. This is only valid in XLOG_FROM_STREAM state. + */ +static XLogSource currentSource = XLOG_FROM_ANY; +static bool lastSourceFailed = false; +static bool pendingWalRcvRestart = false; + +/* + * These variables track when we last obtained some WAL data to process, + * and where we got it from. (XLogReceiptSource is initially the same as + * readSource, but readSource gets reset to zero when we don't have data + * to process right now. It is also different from currentSource, which + * also changes when we try to read from a source and fail, while + * XLogReceiptSource tracks where we last successfully read some WAL.) + */ +static TimestampTz XLogReceiptTime = 0; +static XLogSource XLogReceiptSource = XLOG_FROM_ANY; + +/* Local copy of WalRcv->flushedUpto */ +static XLogRecPtr flushedUpto = 0; +static TimeLineID receiveTLI = 0; + +/* + * Copy of minRecoveryPoint and backupEndPoint from the control file. + * + * In order to reach consistency, we must replay the WAL up to + * minRecoveryPoint. If backupEndRequired is true, we must also reach + * backupEndPoint, or if it's invalid, an end-of-backup record corresponding + * to backupStartPoint. + * + * Note: In archive recovery, after consistency has been reached, the + * functions in xlog.c will start updating minRecoveryPoint in the control + * file. But this copy of minRecoveryPoint variable reflects the value at the + * beginning of recovery, and is *not* updated after consistency is reached. + */ +static XLogRecPtr minRecoveryPoint; +static TimeLineID minRecoveryPointTLI; + +static XLogRecPtr backupStartPoint; +static XLogRecPtr backupEndPoint; +static bool backupEndRequired = false; + +/* + * Have we reached a consistent database state? In crash recovery, we have + * to replay all the WAL, so reachedConsistency is never set. During archive + * recovery, the database is consistent once minRecoveryPoint is reached. + * + * Consistent state means that the system is internally consistent, all + * the WAL has been replayed up to a certain point, and importantly, there + * is no trace of later actions on disk. + */ +bool reachedConsistency = false; + +/* Buffers dedicated to consistency checks of size BLCKSZ */ +static char *replay_image_masked = NULL; +static char *primary_image_masked = NULL; + + +/* + * Shared-memory state for WAL recovery. + */ +typedef struct XLogRecoveryCtlData +{ + /* + * SharedHotStandbyActive indicates if we allow hot standby queries to be + * run. Protected by info_lck. + */ + bool SharedHotStandbyActive; + + /* + * SharedPromoteIsTriggered indicates if a standby promotion has been + * triggered. Protected by info_lck. + */ + bool SharedPromoteIsTriggered; + + /* + * recoveryWakeupLatch is used to wake up the startup process to continue + * WAL replay, if it is waiting for WAL to arrive or failover trigger file + * to appear. + * + * Note that the startup process also uses another latch, its procLatch, + * to wait for recovery conflict. If we get rid of recoveryWakeupLatch for + * signaling the startup process in favor of using its procLatch, which + * comports better with possible generic signal handlers using that latch. + * But we should not do that because the startup process doesn't assume + * that it's waken up by walreceiver process or SIGHUP signal handler + * while it's waiting for recovery conflict. The separate latches, + * recoveryWakeupLatch and procLatch, should be used for inter-process + * communication for WAL replay and recovery conflict, respectively. + */ + Latch recoveryWakeupLatch; + + /* + * Last record successfully replayed. + */ + XLogRecPtr lastReplayedReadRecPtr; /* start position */ + XLogRecPtr lastReplayedEndRecPtr; /* end+1 position */ + TimeLineID lastReplayedTLI; /* timeline */ + + /* + * When we're currently replaying a record, ie. in a redo function, + * replayEndRecPtr points to the end+1 of the record being replayed, + * otherwise it's equal to lastReplayedEndRecPtr. + */ + XLogRecPtr replayEndRecPtr; + TimeLineID replayEndTLI; + /* timestamp of last COMMIT/ABORT record replayed (or being replayed) */ + TimestampTz recoveryLastXTime; + + /* + * timestamp of when we started replaying the current chunk of WAL data, + * only relevant for replication or archive recovery + */ + TimestampTz currentChunkStartTime; + /* Recovery pause state */ + RecoveryPauseState recoveryPauseState; + ConditionVariable recoveryNotPausedCV; + + slock_t info_lck; /* locks shared variables shown above */ +} XLogRecoveryCtlData; + +static XLogRecoveryCtlData *XLogRecoveryCtl = NULL; + +/* + * abortedRecPtr is the start pointer of a broken record at end of WAL when + * recovery completes; missingContrecPtr is the location of the first + * contrecord that went missing. See CreateOverwriteContrecordRecord for + * details. + */ +static XLogRecPtr abortedRecPtr; +static XLogRecPtr missingContrecPtr; + +/* + * if recoveryStopsBefore/After returns true, it saves information of the stop + * point here + */ +static TransactionId recoveryStopXid; +static TimestampTz recoveryStopTime; +static XLogRecPtr recoveryStopLSN; +static char recoveryStopName[MAXFNAMELEN]; +static bool recoveryStopAfter; + +/* prototypes for local functions */ +static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI); + +static void EnableStandbyMode(void); +static void readRecoverySignalFile(void); +static void validateRecoveryParameters(void); +static bool read_backup_label(XLogRecPtr *checkPointLoc, + TimeLineID *backupLabelTLI, + bool *backupEndRequired, bool *backupFromStandby); +static bool read_tablespace_map(List **tablespaces); + +static void xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI); +static void CheckRecoveryConsistency(void); +static void rm_redo_error_callback(void *arg); +#ifdef WAL_DEBUG +static void xlog_outrec(StringInfo buf, XLogReaderState *record); +#endif +static void xlog_block_info(StringInfo buf, XLogReaderState *record); +static void checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, + TimeLineID prevTLI, TimeLineID replayTLI); +static bool getRecordTimestamp(XLogReaderState *record, TimestampTz *recordXtime); +static void verifyBackupPageConsistency(XLogReaderState *record); + +static bool recoveryStopsBefore(XLogReaderState *record); +static bool recoveryStopsAfter(XLogReaderState *record); +static char *getRecoveryStopReason(void); +static void recoveryPausesHere(bool endOfRecovery); +static bool recoveryApplyDelay(XLogReaderState *record); +static void ConfirmRecoveryPaused(void); + +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 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(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, + XLogSource source, bool notfoundOk); +static int XLogFileReadAnyTLI(XLogSegNo segno, int emode, XLogSource source); + +static bool CheckForStandbyTrigger(void); +static void SetPromoteIsTriggered(void); +static bool HotStandbyActiveInReplay(void); + +static void SetCurrentChunkStartTime(TimestampTz xtime); +static void SetLatestXTime(TimestampTz xtime); + +/* + * Initialization of shared memory for WAL recovery + */ +Size +XLogRecoveryShmemSize(void) +{ + Size size; + + /* XLogRecoveryCtl */ + size = sizeof(XLogRecoveryCtlData); + + return size; +} + +void +XLogRecoveryShmemInit(void) +{ + bool found; + + XLogRecoveryCtl = (XLogRecoveryCtlData *) + ShmemInitStruct("XLOG Recovery Ctl", XLogRecoveryShmemSize(), &found); + if (found) + return; + memset(XLogRecoveryCtl, 0, sizeof(XLogRecoveryCtlData)); + + SpinLockInit(&XLogRecoveryCtl->info_lck); + InitSharedLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + ConditionVariableInit(&XLogRecoveryCtl->recoveryNotPausedCV); +} + +/* + * A thin wrapper to enable StandbyMode and do other preparatory work as + * needed. + */ +static void +EnableStandbyMode(void) +{ + StandbyMode = true; + + /* + * To avoid server log bloat, we don't report recovery progress in a + * standby as it will always be in recovery unless promoted. We disable + * startup progress timeout in standby mode to avoid calling + * startup_progress_timeout_handler() unnecessarily. + */ + disable_startup_progress_timeout(); +} + +/* + * Prepare the system for WAL recovery, if needed. + * + * This is called by StartupXLOG() which coordinates the server startup + * sequence. This function analyzes the control file and the backup label + * file, if any, and figures out whether we need to perform crash recovery or + * archive recovery, and how far we need to replay the WAL to reach a + * consistent state. + * + * This doesn't yet change the on-disk state, except for creating the symlinks + * from table space map file if any, and for fetching WAL files needed to find + * the checkpoint record. On entry, the caller has already read the control + * file into memory, and passes it as argument. This function updates it to + * reflect the recovery state, and the caller is expected to write it back to + * disk does after initializing other subsystems, but before calling + * PerformWalRecovery(). + * + * This initializes some global variables like ArchiveModeRequested, and + * StandbyModeRequested and InRecovery. + */ +void +InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, + bool *haveBackupLabel_ptr, bool *haveTblspcMap_ptr) +{ + XLogPageReadPrivate *private; + struct stat st; + bool wasShutdown; + XLogRecord *record; + DBState dbstate_at_startup; + bool haveTblspcMap = false; + bool haveBackupLabel = false; + CheckPoint checkPoint; + bool backupFromStandby = false; + + dbstate_at_startup = ControlFile->state; + + /* + * Initialize on the assumption we want to recover to the latest timeline + * that's active according to pg_control. + */ + if (ControlFile->minRecoveryPointTLI > + ControlFile->checkPointCopy.ThisTimeLineID) + recoveryTargetTLI = ControlFile->minRecoveryPointTLI; + else + recoveryTargetTLI = ControlFile->checkPointCopy.ThisTimeLineID; + + /* + * Check for signal files, and if so set up state for offline recovery + */ + readRecoverySignalFile(); + validateRecoveryParameters(); + + if (ArchiveRecoveryRequested) + { + if (StandbyModeRequested) + ereport(LOG, + (errmsg("entering standby mode"))); + else if (recoveryTarget == RECOVERY_TARGET_XID) + ereport(LOG, + (errmsg("starting point-in-time recovery to XID %u", + recoveryTargetXid))); + else if (recoveryTarget == RECOVERY_TARGET_TIME) + ereport(LOG, + (errmsg("starting point-in-time recovery to %s", + timestamptz_to_str(recoveryTargetTime)))); + else if (recoveryTarget == RECOVERY_TARGET_NAME) + ereport(LOG, + (errmsg("starting point-in-time recovery to \"%s\"", + recoveryTargetName))); + else if (recoveryTarget == RECOVERY_TARGET_LSN) + ereport(LOG, + (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"", + LSN_FORMAT_ARGS(recoveryTargetLSN)))); + else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) + ereport(LOG, + (errmsg("starting point-in-time recovery to earliest consistent point"))); + else + ereport(LOG, + (errmsg("starting archive recovery"))); + } + + /* + * Take ownership of the wakeup latch if we're going to sleep during + * recovery. + */ + if (ArchiveRecoveryRequested) + OwnLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + + private = palloc0(sizeof(XLogPageReadPrivate)); + xlogreader = + XLogReaderAllocate(wal_segment_size, NULL, + XL_ROUTINE(.page_read = &XLogPageRead, + .segment_open = NULL, + .segment_close = wal_segment_close), + private); + if (!xlogreader) + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"), + 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: + * (1) no need to waste the storage in most instantiations of the backend; + * (2) a static char array isn't guaranteed to have any particular + * alignment, whereas palloc() will provide MAXALIGN'd storage. + */ + replay_image_masked = (char *) palloc(BLCKSZ); + primary_image_masked = (char *) palloc(BLCKSZ); + + if (read_backup_label(&CheckPointLoc, &CheckPointTLI, &backupEndRequired, + &backupFromStandby)) + { + List *tablespaces = NIL; + + /* + * Archive recovery was requested, and thanks to the backup label + * file, we know how far we need to replay to reach consistency. Enter + * archive recovery directly. + */ + InArchiveRecovery = true; + if (StandbyModeRequested) + EnableStandbyMode(); + + /* + * Omitting backup_label when creating a new replica, PITR node etc. + * unfortunately is a common cause of corruption. Logging that + * backup_label was used makes it a bit easier to exclude that as the + * cause of observed corruption. + * + * Do so before we try to read the checkpoint record (which can fail), + * as otherwise it can be hard to understand why a checkpoint other + * than ControlFile->checkPoint is used. + */ + ereport(LOG, + (errmsg("starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u", + LSN_FORMAT_ARGS(RedoStartLSN), + LSN_FORMAT_ARGS(CheckPointLoc), + CheckPointTLI))); + + /* + * When a backup_label file is present, we want to roll forward from + * the checkpoint it identifies, rather than using pg_control. + */ + record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 0, true, + CheckPointTLI); + if (record != NULL) + { + memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); + wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN); + ereport(DEBUG1, + (errmsg_internal("checkpoint record is at %X/%X", + LSN_FORMAT_ARGS(CheckPointLoc)))); + InRecovery = true; /* force recovery even if SHUTDOWNED */ + + /* + * Make sure that REDO location exists. This may not be the case + * if there was a crash during an online backup, which left a + * backup_label around that references a WAL segment that's + * already been archived. + */ + if (checkPoint.redo < CheckPointLoc) + { + XLogPrefetcherBeginRead(xlogprefetcher, checkPoint.redo); + if (!ReadRecord(xlogprefetcher, LOG, false, + checkPoint.ThisTimeLineID)) + ereport(FATAL, + (errmsg("could not find redo location referenced by checkpoint record"), + errhint("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.", + DataDir, DataDir, DataDir))); + } + } + else + { + ereport(FATAL, + (errmsg("could not locate required checkpoint record"), + errhint("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.", + DataDir, DataDir, DataDir))); + wasShutdown = false; /* keep compiler quiet */ + } + + /* Read the tablespace_map file if present and create symlinks. */ + if (read_tablespace_map(&tablespaces)) + { + ListCell *lc; + + foreach(lc, tablespaces) + { + tablespaceinfo *ti = lfirst(lc); + char *linkloc; + + linkloc = psprintf("pg_tblspc/%s", ti->oid); + + /* + * Remove the existing symlink if any and Create the symlink + * under PGDATA. + */ + remove_tablespace_symlink(linkloc); + + if (symlink(ti->path, linkloc) < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create symbolic link \"%s\": %m", + linkloc))); + + pfree(ti->oid); + pfree(ti->path); + pfree(ti); + } + + /* tell the caller to delete it later */ + haveTblspcMap = true; + } + + /* tell the caller to delete it later */ + haveBackupLabel = true; + } + else + { + /* + * If tablespace_map file is present without backup_label file, there + * is no use of such file. There is no harm in retaining it, but it + * is better to get rid of the map file so that we don't have any + * redundant file in data directory and it will avoid any sort of + * confusion. It seems prudent though to just rename the file out of + * the way rather than delete it completely, also we ignore any error + * that occurs in rename operation as even if map file is present + * without backup_label file, it is harmless. + */ + if (stat(TABLESPACE_MAP, &st) == 0) + { + unlink(TABLESPACE_MAP_OLD); + if (durable_rename(TABLESPACE_MAP, TABLESPACE_MAP_OLD, DEBUG1) == 0) + ereport(LOG, + (errmsg("ignoring file \"%s\" because no file \"%s\" exists", + TABLESPACE_MAP, BACKUP_LABEL_FILE), + errdetail("File \"%s\" was renamed to \"%s\".", + TABLESPACE_MAP, TABLESPACE_MAP_OLD))); + else + ereport(LOG, + (errmsg("ignoring file \"%s\" because no file \"%s\" exists", + TABLESPACE_MAP, BACKUP_LABEL_FILE), + errdetail("Could not rename file \"%s\" to \"%s\": %m.", + TABLESPACE_MAP, TABLESPACE_MAP_OLD))); + } + + /* + * It's possible that archive recovery was requested, but we don't + * know how far we need to replay the WAL before we reach consistency. + * This can happen for example if a base backup is taken from a + * running server using an atomic filesystem snapshot, without calling + * pg_backup_start/stop. Or if you just kill a running primary server + * and put it into archive recovery by creating a recovery signal + * file. + * + * Our strategy in that case is to perform crash recovery first, + * replaying all the WAL present in pg_wal, and only enter archive + * recovery after that. + * + * But usually we already know how far we need to replay the WAL (up + * to minRecoveryPoint, up to backupEndPoint, or until we see an + * end-of-backup record), and we can enter archive recovery directly. + */ + if (ArchiveRecoveryRequested && + (ControlFile->minRecoveryPoint != InvalidXLogRecPtr || + ControlFile->backupEndRequired || + ControlFile->backupEndPoint != InvalidXLogRecPtr || + ControlFile->state == DB_SHUTDOWNED)) + { + InArchiveRecovery = true; + if (StandbyModeRequested) + EnableStandbyMode(); + } + + /* + * For the same reason as when starting up with backup_label present, + * emit a log message when we continue initializing from a base + * backup. + */ + if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) + ereport(LOG, + (errmsg("restarting backup recovery with redo LSN %X/%X", + LSN_FORMAT_ARGS(ControlFile->backupStartPoint)))); + + /* Get the last valid checkpoint record. */ + CheckPointLoc = ControlFile->checkPoint; + CheckPointTLI = ControlFile->checkPointCopy.ThisTimeLineID; + RedoStartLSN = ControlFile->checkPointCopy.redo; + RedoStartTLI = ControlFile->checkPointCopy.ThisTimeLineID; + record = ReadCheckpointRecord(xlogprefetcher, CheckPointLoc, 1, true, + CheckPointTLI); + if (record != NULL) + { + ereport(DEBUG1, + (errmsg_internal("checkpoint record is at %X/%X", + LSN_FORMAT_ARGS(CheckPointLoc)))); + } + else + { + /* + * We used to attempt to go back to a secondary checkpoint record + * here, but only when not in standby mode. We now just fail if we + * can't read the last checkpoint because this allows us to + * simplify processing around checkpoints. + */ + ereport(PANIC, + (errmsg("could not locate a valid checkpoint record"))); + } + memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); + wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN); + } + + /* + * If the location of the checkpoint record is not on the expected + * timeline in the history of the requested timeline, we cannot proceed: + * the backup is not part of the history of the requested timeline. + */ + Assert(expectedTLEs); /* was initialized by reading checkpoint + * record */ + if (tliOfPointInHistory(CheckPointLoc, expectedTLEs) != + CheckPointTLI) + { + XLogRecPtr switchpoint; + + /* + * tliSwitchPoint will throw an error if the checkpoint's timeline is + * not in expectedTLEs at all. + */ + switchpoint = tliSwitchPoint(ControlFile->checkPointCopy.ThisTimeLineID, expectedTLEs, NULL); + ereport(FATAL, + (errmsg("requested timeline %u is not a child of this server's history", + recoveryTargetTLI), + errdetail("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.", + LSN_FORMAT_ARGS(ControlFile->checkPoint), + ControlFile->checkPointCopy.ThisTimeLineID, + LSN_FORMAT_ARGS(switchpoint)))); + } + + /* + * The min recovery point should be part of the requested timeline's + * history, too. + */ + if (!XLogRecPtrIsInvalid(ControlFile->minRecoveryPoint) && + tliOfPointInHistory(ControlFile->minRecoveryPoint - 1, expectedTLEs) != + ControlFile->minRecoveryPointTLI) + ereport(FATAL, + (errmsg("requested timeline %u does not contain minimum recovery point %X/%X on timeline %u", + recoveryTargetTLI, + LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint), + ControlFile->minRecoveryPointTLI))); + + ereport(DEBUG1, + (errmsg_internal("redo record is at %X/%X; shutdown %s", + LSN_FORMAT_ARGS(checkPoint.redo), + wasShutdown ? "true" : "false"))); + ereport(DEBUG1, + (errmsg_internal("next transaction ID: " UINT64_FORMAT "; next OID: %u", + U64FromFullTransactionId(checkPoint.nextXid), + checkPoint.nextOid))); + ereport(DEBUG1, + (errmsg_internal("next MultiXactId: %u; next MultiXactOffset: %u", + checkPoint.nextMulti, checkPoint.nextMultiOffset))); + ereport(DEBUG1, + (errmsg_internal("oldest unfrozen transaction ID: %u, in database %u", + checkPoint.oldestXid, checkPoint.oldestXidDB))); + ereport(DEBUG1, + (errmsg_internal("oldest MultiXactId: %u, in database %u", + checkPoint.oldestMulti, checkPoint.oldestMultiDB))); + ereport(DEBUG1, + (errmsg_internal("commit timestamp Xid oldest/newest: %u/%u", + checkPoint.oldestCommitTsXid, + checkPoint.newestCommitTsXid))); + if (!TransactionIdIsNormal(XidFromFullTransactionId(checkPoint.nextXid))) + ereport(PANIC, + (errmsg("invalid next transaction ID"))); + + /* sanity check */ + if (checkPoint.redo > CheckPointLoc) + ereport(PANIC, + (errmsg("invalid redo in checkpoint record"))); + + /* + * Check whether we need to force recovery from WAL. If it appears to + * have been a clean shutdown and we did not have a recovery signal file, + * then assume no recovery needed. + */ + if (checkPoint.redo < CheckPointLoc) + { + if (wasShutdown) + ereport(PANIC, + (errmsg("invalid redo record in shutdown checkpoint"))); + InRecovery = true; + } + else if (ControlFile->state != DB_SHUTDOWNED) + InRecovery = true; + else if (ArchiveRecoveryRequested) + { + /* force recovery due to presence of recovery signal file */ + InRecovery = true; + } + + /* + * 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 (InRecovery) + { + if (InArchiveRecovery) + { + ControlFile->state = DB_IN_ARCHIVE_RECOVERY; + } + else + { + ereport(LOG, + (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) + { + /* 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) + { + 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; + } + } + } + + /* remember these, so that we know when we have reached consistency */ + backupStartPoint = ControlFile->backupStartPoint; + backupEndRequired = ControlFile->backupEndRequired; + backupEndPoint = ControlFile->backupEndPoint; + if (InArchiveRecovery) + { + minRecoveryPoint = ControlFile->minRecoveryPoint; + minRecoveryPointTLI = ControlFile->minRecoveryPointTLI; + } + else + { + minRecoveryPoint = InvalidXLogRecPtr; + minRecoveryPointTLI = 0; + } + + /* + * Start recovery assuming that the final record isn't lost. + */ + abortedRecPtr = InvalidXLogRecPtr; + missingContrecPtr = InvalidXLogRecPtr; + + *wasShutdown_ptr = wasShutdown; + *haveBackupLabel_ptr = haveBackupLabel; + *haveTblspcMap_ptr = haveTblspcMap; +} + +/* + * See if there are any recovery signal files and if so, set state for + * recovery. + * + * See if there is a recovery command file (recovery.conf), and if so + * throw an ERROR since as of PG12 we no longer recognize that. + */ +static void +readRecoverySignalFile(void) +{ + struct stat stat_buf; + + if (IsBootstrapProcessingMode()) + return; + + /* + * Check for old recovery API file: recovery.conf + */ + if (stat(RECOVERY_COMMAND_FILE, &stat_buf) == 0) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("using recovery command file \"%s\" is not supported", + RECOVERY_COMMAND_FILE))); + + /* + * Remove unused .done file, if present. Ignore if absent. + */ + unlink(RECOVERY_COMMAND_DONE); + + /* + * Check for recovery signal files and if found, fsync them since they + * represent server state information. We don't sweat too much about the + * possibility of fsync failure, however. + * + * If present, standby signal file takes precedence. If neither is present + * then we won't enter archive recovery. + */ + if (stat(STANDBY_SIGNAL_FILE, &stat_buf) == 0) + { + int fd; + + fd = BasicOpenFilePerm(STANDBY_SIGNAL_FILE, O_RDWR | PG_BINARY, + S_IRUSR | S_IWUSR); + if (fd >= 0) + { + (void) pg_fsync(fd); + close(fd); + } + standby_signal_file_found = true; + } + else if (stat(RECOVERY_SIGNAL_FILE, &stat_buf) == 0) + { + int fd; + + fd = BasicOpenFilePerm(RECOVERY_SIGNAL_FILE, O_RDWR | PG_BINARY, + S_IRUSR | S_IWUSR); + if (fd >= 0) + { + (void) pg_fsync(fd); + close(fd); + } + recovery_signal_file_found = true; + } + + StandbyModeRequested = false; + ArchiveRecoveryRequested = false; + if (standby_signal_file_found) + { + StandbyModeRequested = true; + ArchiveRecoveryRequested = true; + } + else if (recovery_signal_file_found) + { + StandbyModeRequested = false; + ArchiveRecoveryRequested = true; + } + else + return; + + /* + * We don't support standby mode in standalone backends; that requires + * other processes such as the WAL receiver to be alive. + */ + if (StandbyModeRequested && !IsUnderPostmaster) + ereport(FATAL, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("standby mode is not supported by single-user servers"))); +} + +static void +validateRecoveryParameters(void) +{ + if (!ArchiveRecoveryRequested) + return; + + /* + * Check for compulsory parameters + */ + if (StandbyModeRequested) + { + if ((PrimaryConnInfo == NULL || strcmp(PrimaryConnInfo, "") == 0) && + (recoveryRestoreCommand == NULL || strcmp(recoveryRestoreCommand, "") == 0)) + ereport(WARNING, + (errmsg("specified neither primary_conninfo nor restore_command"), + errhint("The database server will regularly poll the pg_wal subdirectory to check for files placed there."))); + } + else + { + if (recoveryRestoreCommand == NULL || + strcmp(recoveryRestoreCommand, "") == 0) + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("must specify restore_command when standby mode is not enabled"))); + } + + /* + * Override any inconsistent requests. Note that this is a change of + * behaviour in 9.5; prior to this we simply ignored a request to pause if + * hot_standby = off, which was surprising behaviour. + */ + if (recoveryTargetAction == RECOVERY_TARGET_ACTION_PAUSE && + !EnableHotStandby) + recoveryTargetAction = RECOVERY_TARGET_ACTION_SHUTDOWN; + + /* + * Final parsing of recovery_target_time string; see also + * check_recovery_target_time(). + */ + if (recoveryTarget == RECOVERY_TARGET_TIME) + { + recoveryTargetTime = DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in, + CStringGetDatum(recovery_target_time_string), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1))); + } + + /* + * If user specified recovery_target_timeline, validate it or compute the + * "latest" value. We can't do this until after we've gotten the restore + * command and set InArchiveRecovery, because we need to fetch timeline + * history files from the archive. + */ + if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_NUMERIC) + { + TimeLineID rtli = recoveryTargetTLIRequested; + + /* Timeline 1 does not have a history file, all else should */ + if (rtli != 1 && !existsTimeLineHistory(rtli)) + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("recovery target timeline %u does not exist", + rtli))); + recoveryTargetTLI = rtli; + } + else if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_LATEST) + { + /* We start the "latest" search from pg_control's timeline */ + recoveryTargetTLI = findNewestTimeLine(recoveryTargetTLI); + } + else + { + /* + * else we just use the recoveryTargetTLI as already read from + * ControlFile + */ + Assert(recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_CONTROLFILE); + } +} + +/* + * read_backup_label: check to see if a backup_label file is present + * + * If we see a backup_label during recovery, we assume that we are recovering + * from a backup dump file, and we therefore roll forward from the checkpoint + * identified by the label file, NOT what pg_control says. This avoids the + * problem that pg_control might have been archived one or more checkpoints + * later than the start of the dump, and so if we rely on it as the start + * point, we will fail to restore a consistent database state. + * + * Returns true if a backup_label was found (and fills the checkpoint + * location and TLI into *checkPointLoc and *backupLabelTLI, respectively); + * returns false if not. If this backup_label came from a streamed backup, + * *backupEndRequired is set to true. If this backup_label was created during + * recovery, *backupFromStandby is set to true. + * + * Also sets the global variables RedoStartLSN and RedoStartTLI with the LSN + * and TLI read from the backup file. + */ +static bool +read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI, + bool *backupEndRequired, bool *backupFromStandby) +{ + char startxlogfilename[MAXFNAMELEN]; + TimeLineID tli_from_walseg, + tli_from_file; + FILE *lfp; + char ch; + char backuptype[20]; + char backupfrom[20]; + char backuplabel[MAXPGPATH]; + char backuptime[128]; + uint32 hi, + lo; + + /* suppress possible uninitialized-variable warnings */ + *checkPointLoc = InvalidXLogRecPtr; + *backupLabelTLI = 0; + *backupEndRequired = false; + *backupFromStandby = false; + + /* + * See if label file is present + */ + lfp = AllocateFile(BACKUP_LABEL_FILE, "r"); + if (!lfp) + { + if (errno != ENOENT) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", + BACKUP_LABEL_FILE))); + return false; /* it's not there, all is fine */ + } + + /* + * Read and parse the START WAL LOCATION and CHECKPOINT lines (this code + * is pretty crude, but we are not expecting any variability in the file + * format). + */ + if (fscanf(lfp, "START WAL LOCATION: %X/%X (file %08X%16s)%c", + &hi, &lo, &tli_from_walseg, startxlogfilename, &ch) != 5 || ch != '\n') + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); + RedoStartLSN = ((uint64) hi) << 32 | lo; + RedoStartTLI = tli_from_walseg; + if (fscanf(lfp, "CHECKPOINT LOCATION: %X/%X%c", + &hi, &lo, &ch) != 3 || ch != '\n') + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE))); + *checkPointLoc = ((uint64) hi) << 32 | lo; + *backupLabelTLI = tli_from_walseg; + + /* + * 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) + { + if (strcmp(backuptype, "streamed") == 0) + *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) + *backupFromStandby = true; + } + + /* + * Parse START TIME and LABEL. Those are not mandatory fields for recovery + * but checking for their presence is useful for debugging and the next + * sanity checks. Cope also with the fact that the result buffers have a + * pre-allocated size, hence if the backup_label file has been generated + * with strings longer than the maximum assumed here an incorrect parsing + * happens. That's fine as only minor consistency checks are done + * afterwards. + */ + if (fscanf(lfp, "START TIME: %127[^\n]\n", backuptime) == 1) + ereport(DEBUG1, + (errmsg_internal("backup time %s in file \"%s\"", + backuptime, BACKUP_LABEL_FILE))); + + if (fscanf(lfp, "LABEL: %1023[^\n]\n", backuplabel) == 1) + ereport(DEBUG1, + (errmsg_internal("backup label %s in file \"%s\"", + backuplabel, BACKUP_LABEL_FILE))); + + /* + * START TIMELINE is new as of 11. Its parsing is not mandatory, still use + * it as a sanity check if present. + */ + if (fscanf(lfp, "START TIMELINE: %u\n", &tli_from_file) == 1) + { + if (tli_from_walseg != tli_from_file) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", BACKUP_LABEL_FILE), + errdetail("Timeline ID parsed is %u, but expected %u.", + tli_from_file, tli_from_walseg))); + + ereport(DEBUG1, + (errmsg_internal("backup timeline %u in file \"%s\"", + tli_from_file, BACKUP_LABEL_FILE))); + } + + if (ferror(lfp) || FreeFile(lfp)) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", + BACKUP_LABEL_FILE))); + + return true; +} + +/* + * read_tablespace_map: check to see if a tablespace_map file is present + * + * If we see a tablespace_map file during recovery, we assume that we are + * recovering from a backup dump file, and we therefore need to create symlinks + * as per the information present in tablespace_map file. + * + * Returns true if a tablespace_map file was found (and fills *tablespaces + * with a tablespaceinfo struct for each tablespace listed in the file); + * returns false if not. + */ +static bool +read_tablespace_map(List **tablespaces) +{ + tablespaceinfo *ti; + FILE *lfp; + char str[MAXPGPATH]; + int ch, + i, + n; + bool was_backslash; + + /* + * See if tablespace_map file is present + */ + lfp = AllocateFile(TABLESPACE_MAP, "r"); + if (!lfp) + { + if (errno != ENOENT) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", + TABLESPACE_MAP))); + return false; /* it's not there, all is fine */ + } + + /* + * Read and parse the link name and path lines from tablespace_map file + * (this code is pretty crude, but we are not expecting any variability in + * the file format). De-escape any backslashes that were inserted. + */ + i = 0; + was_backslash = false; + while ((ch = fgetc(lfp)) != EOF) + { + if (!was_backslash && (ch == '\n' || ch == '\r')) + { + if (i == 0) + continue; /* \r immediately followed by \n */ + + /* + * The de-escaped line should contain an OID followed by exactly + * one space followed by a path. The path might start with + * spaces, so don't be too liberal about parsing. + */ + str[i] = '\0'; + n = 0; + while (str[n] && str[n] != ' ') + n++; + if (n < 1 || n >= i - 1) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", TABLESPACE_MAP))); + str[n++] = '\0'; + + ti = palloc0(sizeof(tablespaceinfo)); + ti->oid = pstrdup(str); + ti->path = pstrdup(str + n); + *tablespaces = lappend(*tablespaces, ti); + + i = 0; + continue; + } + else if (!was_backslash && ch == '\\') + was_backslash = true; + else + { + if (i < sizeof(str) - 1) + str[i++] = ch; + was_backslash = false; + } + } + + if (i != 0 || was_backslash) /* last line not terminated? */ + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", TABLESPACE_MAP))); + + if (ferror(lfp) || FreeFile(lfp)) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", + TABLESPACE_MAP))); + + return true; +} + +/* + * Finish WAL recovery. + * + * This does not close the 'xlogreader' yet, because in some cases the caller + * still wants to re-read the last checkpoint record by calling + * ReadCheckPointRecord(). + * + * Returns the position of the last valid or applied record, after which new + * WAL should be appended, information about why recovery was ended, and some + * other things. See the WalRecoveryResult struct for details. + */ +EndOfWalRecoveryInfo * +FinishWalRecovery(void) +{ + EndOfWalRecoveryInfo *result = palloc(sizeof(EndOfWalRecoveryInfo)); + XLogRecPtr lastRec; + TimeLineID lastRecTLI; + XLogRecPtr endOfLog; + + /* + * Kill WAL receiver, if it's still running, before we continue to write + * the startup checkpoint and aborted-contrecord records. It will trump + * over these records and subsequent ones if it's still alive when we + * start writing WAL. + */ + XLogShutdownWalRcv(); + + /* + * We are now done reading the xlog from stream. Turn off streaming + * recovery to force fetching the files (which would be required at end of + * recovery, e.g., timeline history file) from archive or pg_wal. + * + * Note that standby mode must be turned off after killing WAL receiver, + * i.e., calling XLogShutdownWalRcv(). + */ + Assert(!WalRcvStreaming()); + StandbyMode = false; + + /* + * Determine where to start writing WAL next. + * + * Re-fetch the last valid or last applied record, so we can identify the + * exact endpoint of what we consider the valid portion of WAL. There may + * be an incomplete continuation record after that, in which case + * 'abortedRecPtr' and 'missingContrecPtr' are set and the caller will + * write a special OVERWRITE_CONTRECORD message to mark that the rest of + * it is intentionally missing. See CreateOverwriteContrecordRecord(). + * + * An important side-effect of this is to load the last page into + * xlogreader. The caller uses it to initialize the WAL for writing. + */ + if (!InRecovery) + { + lastRec = CheckPointLoc; + lastRecTLI = CheckPointTLI; + } + else + { + lastRec = XLogRecoveryCtl->lastReplayedReadRecPtr; + lastRecTLI = XLogRecoveryCtl->lastReplayedTLI; + } + XLogPrefetcherBeginRead(xlogprefetcher, lastRec); + (void) ReadRecord(xlogprefetcher, PANIC, false, lastRecTLI); + endOfLog = xlogreader->EndRecPtr; + + /* + * Remember the TLI in the filename of the XLOG segment containing the + * end-of-log. It could be different from the timeline that endOfLog + * nominally belongs to, if there was a timeline switch in that segment, + * and we were reading the old WAL from a segment belonging to a higher + * timeline. + */ + result->endOfLogTLI = xlogreader->seg.ws_tli; + + if (ArchiveRecoveryRequested) + { + /* + * We are no longer in archive recovery state. + * + * We are now done reading the old WAL. Turn off archive fetching if + * it was active. + */ + Assert(InArchiveRecovery); + InArchiveRecovery = false; + + /* + * If the ending log segment is still open, close it (to avoid + * problems on Windows with trying to rename or delete an open file). + */ + if (readFile >= 0) + { + close(readFile); + readFile = -1; + } + } + + /* + * Copy the last partial block to the caller, for initializing the WAL + * buffer for appending new WAL. + */ + if (endOfLog % XLOG_BLCKSZ != 0) + { + char *page; + int len; + XLogRecPtr pageBeginPtr; + + pageBeginPtr = endOfLog - (endOfLog % XLOG_BLCKSZ); + Assert(readOff == XLogSegmentOffset(pageBeginPtr, wal_segment_size)); + + /* Copy the valid part of the last block */ + len = endOfLog % XLOG_BLCKSZ; + page = palloc(len); + memcpy(page, xlogreader->readBuf, len); + + result->lastPageBeginPtr = pageBeginPtr; + result->lastPage = page; + } + else + { + /* There is no partial block to copy. */ + result->lastPageBeginPtr = endOfLog; + result->lastPage = NULL; + } + + /* + * Create a comment for the history file to explain why and where timeline + * changed. + */ + result->recoveryStopReason = getRecoveryStopReason(); + + result->lastRec = lastRec; + result->lastRecTLI = lastRecTLI; + result->endOfLog = endOfLog; + + result->abortedRecPtr = abortedRecPtr; + result->missingContrecPtr = missingContrecPtr; + + result->standby_signal_file_found = standby_signal_file_found; + result->recovery_signal_file_found = recovery_signal_file_found; + + return result; +} + +/* + * Clean up the WAL reader and leftovers from restoring WAL from archive + */ +void +ShutdownWalRecovery(void) +{ + char recoveryPath[MAXPGPATH]; + + /* Final update of pg_stat_recovery_prefetch. */ + XLogPrefetcherComputeStats(xlogprefetcher); + + /* Shut down xlogreader */ + if (readFile >= 0) + { + close(readFile); + readFile = -1; + } + XLogReaderFree(xlogreader); + XLogPrefetcherFree(xlogprefetcher); + + if (ArchiveRecoveryRequested) + { + /* + * Since there might be a partial WAL segment named RECOVERYXLOG, get + * rid of it. + */ + snprintf(recoveryPath, MAXPGPATH, XLOGDIR "/RECOVERYXLOG"); + unlink(recoveryPath); /* ignore any error */ + + /* Get rid of any remaining recovered timeline-history file, too */ + snprintf(recoveryPath, MAXPGPATH, XLOGDIR "/RECOVERYHISTORY"); + unlink(recoveryPath); /* ignore any error */ + } + + /* + * We don't need the latch anymore. It's not strictly necessary to disown + * it, but let's do it for the sake of tidiness. + */ + if (ArchiveRecoveryRequested) + DisownLatch(&XLogRecoveryCtl->recoveryWakeupLatch); +} + +/* + * Perform WAL recovery. + * + * If the system was shut down cleanly, this is never called. + */ +void +PerformWalRecovery(void) +{ + XLogRecord *record; + bool reachedRecoveryTarget = false; + TimeLineID replayTLI; + + /* + * Initialize shared variables for tracking progress of WAL replay, as if + * we had just replayed the record before the REDO location (or the + * checkpoint record itself, if it's a shutdown checkpoint). + */ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + if (RedoStartLSN < CheckPointLoc) + { + XLogRecoveryCtl->lastReplayedReadRecPtr = InvalidXLogRecPtr; + XLogRecoveryCtl->lastReplayedEndRecPtr = RedoStartLSN; + XLogRecoveryCtl->lastReplayedTLI = RedoStartTLI; + } + else + { + XLogRecoveryCtl->lastReplayedReadRecPtr = xlogreader->ReadRecPtr; + XLogRecoveryCtl->lastReplayedEndRecPtr = xlogreader->EndRecPtr; + XLogRecoveryCtl->lastReplayedTLI = CheckPointTLI; + } + XLogRecoveryCtl->replayEndRecPtr = XLogRecoveryCtl->lastReplayedEndRecPtr; + XLogRecoveryCtl->replayEndTLI = XLogRecoveryCtl->lastReplayedTLI; + XLogRecoveryCtl->recoveryLastXTime = 0; + XLogRecoveryCtl->currentChunkStartTime = 0; + XLogRecoveryCtl->recoveryPauseState = RECOVERY_NOT_PAUSED; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + /* Also ensure XLogReceiptTime has a sane value */ + XLogReceiptTime = GetCurrentTimestamp(); + + /* + * Let postmaster know we've started redo now, so that it can launch the + * archiver if necessary. + */ + if (IsUnderPostmaster) + SendPostmasterSignal(PMSIGNAL_RECOVERY_STARTED); + + /* + * Allow read-only connections immediately if we're consistent already. + */ + CheckRecoveryConsistency(); + + /* + * Find the first record that logically follows the checkpoint --- it + * might physically precede it, though. + */ + if (RedoStartLSN < CheckPointLoc) + { + /* back up to find the record */ + replayTLI = RedoStartTLI; + 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(xlogprefetcher, LOG, false, replayTLI); + } + + if (record != NULL) + { + TimestampTz xtime; + PGRUsage ru0; + + pg_rusage_init(&ru0); + + InRedo = true; + + RmgrStartup(); + + ereport(LOG, + (errmsg("redo starts at %X/%X", + LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)))); + + /* Prepare to report progress of the redo phase. */ + if (!StandbyMode) + begin_startup_progress_phase(); + + /* + * main redo apply loop + */ + do + { + if (!StandbyMode) + ereport_startup_progress("redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X", + LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)); + +#ifdef WAL_DEBUG + if (XLOG_DEBUG || + (record->xl_rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || + (record->xl_rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) + { + StringInfoData buf; + + initStringInfo(&buf); + appendStringInfo(&buf, "REDO @ %X/%X; LSN %X/%X: ", + LSN_FORMAT_ARGS(xlogreader->ReadRecPtr), + LSN_FORMAT_ARGS(xlogreader->EndRecPtr)); + xlog_outrec(&buf, xlogreader); + appendStringInfoString(&buf, " - "); + xlog_outdesc(&buf, xlogreader); + elog(LOG, "%s", buf.data); + pfree(buf.data); + } +#endif + + /* Handle interrupt signals of startup process */ + HandleStartupProcInterrupts(); + + /* + * Pause WAL replay, if requested by a hot-standby session via + * SetRecoveryPause(). + * + * Note that we intentionally don't take the info_lck spinlock + * here. We might therefore read a slightly stale value of the + * recoveryPause flag, but it can't be very stale (no worse than + * the last spinlock we did acquire). Since a pause request is a + * pretty asynchronous thing anyway, possibly responding to it one + * WAL record later than we otherwise would is a minor issue, so + * it doesn't seem worth adding another spinlock cycle to prevent + * that. + */ + if (((volatile XLogRecoveryCtlData *) XLogRecoveryCtl)->recoveryPauseState != + RECOVERY_NOT_PAUSED) + recoveryPausesHere(false); + + /* + * Have we reached our recovery target? + */ + if (recoveryStopsBefore(xlogreader)) + { + reachedRecoveryTarget = true; + break; + } + + /* + * If we've been asked to lag the primary, wait on latch until + * enough time has passed. + */ + if (recoveryApplyDelay(xlogreader)) + { + /* + * We test for paused recovery again here. If user sets + * delayed apply, it may be because they expect to pause + * recovery in case of problems, so we must test again here + * otherwise pausing during the delay-wait wouldn't work. + */ + if (((volatile XLogRecoveryCtlData *) XLogRecoveryCtl)->recoveryPauseState != + RECOVERY_NOT_PAUSED) + recoveryPausesHere(false); + } + + /* + * Apply the record + */ + ApplyWalRecord(xlogreader, record, &replayTLI); + + /* Exit loop if we reached inclusive recovery target */ + if (recoveryStopsAfter(xlogreader)) + { + reachedRecoveryTarget = true; + break; + } + + /* Else, try to fetch the next WAL record */ + record = ReadRecord(xlogprefetcher, LOG, false, replayTLI); + } while (record != NULL); + + /* + * end of main redo apply loop + */ + + if (reachedRecoveryTarget) + { + if (!reachedConsistency) + ereport(FATAL, + (errmsg("requested recovery stop point is before consistent recovery point"))); + + /* + * This is the last point where we can restart recovery with a new + * recovery target, if we shutdown and begin again. After this, + * Resource Managers may choose to do permanent corrective actions + * at end of recovery. + */ + switch (recoveryTargetAction) + { + case RECOVERY_TARGET_ACTION_SHUTDOWN: + + /* + * exit with special return code to request shutdown of + * postmaster. Log messages issued from postmaster. + */ + proc_exit(3); + + case RECOVERY_TARGET_ACTION_PAUSE: + SetRecoveryPause(true); + recoveryPausesHere(true); + + /* drop into promote */ + + case RECOVERY_TARGET_ACTION_PROMOTE: + break; + } + } + + RmgrCleanup(); + + ereport(LOG, + (errmsg("redo done at %X/%X system usage: %s", + LSN_FORMAT_ARGS(xlogreader->ReadRecPtr), + pg_rusage_show(&ru0)))); + xtime = GetLatestXTime(); + if (xtime) + ereport(LOG, + (errmsg("last completed transaction was at log time %s", + timestamptz_to_str(xtime)))); + + InRedo = false; + } + else + { + /* there are no WAL records following the checkpoint */ + ereport(LOG, + (errmsg("redo is not required"))); + } + + /* + * This check is intentionally after the above log messages that indicate + * how far recovery went. + */ + if (ArchiveRecoveryRequested && + recoveryTarget != RECOVERY_TARGET_UNSET && + !reachedRecoveryTarget) + ereport(FATAL, + (errmsg("recovery ended before configured recovery target was reached"))); +} + +/* + * Subroutine of PerformWalRecovery, to apply one WAL record. + */ +static void +ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *replayTLI) +{ + ErrorContextCallback errcallback; + bool switchedTLI = false; + + /* Setup error traceback support for ereport() */ + errcallback.callback = rm_redo_error_callback; + errcallback.arg = (void *) xlogreader; + errcallback.previous = error_context_stack; + error_context_stack = &errcallback; + + /* + * ShmemVariableCache->nextXid must be beyond record's xid. + */ + AdvanceNextFullTransactionIdPastXid(record->xl_xid); + + /* + * Before replaying this record, check if this record causes the current + * timeline to change. The record is already considered to be part of the + * new timeline, so we update replayTLI before replaying it. That's + * important so that replayEndTLI, which is recorded as the minimum + * recovery point's TLI if recovery stops after this record, is set + * correctly. + */ + if (record->xl_rmid == RM_XLOG_ID) + { + TimeLineID newReplayTLI = *replayTLI; + TimeLineID prevReplayTLI = *replayTLI; + uint8 info = record->xl_info & ~XLR_INFO_MASK; + + if (info == XLOG_CHECKPOINT_SHUTDOWN) + { + CheckPoint checkPoint; + + memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); + newReplayTLI = checkPoint.ThisTimeLineID; + prevReplayTLI = checkPoint.PrevTimeLineID; + } + else if (info == XLOG_END_OF_RECOVERY) + { + xl_end_of_recovery xlrec; + + memcpy(&xlrec, XLogRecGetData(xlogreader), sizeof(xl_end_of_recovery)); + newReplayTLI = xlrec.ThisTimeLineID; + prevReplayTLI = xlrec.PrevTimeLineID; + } + + if (newReplayTLI != *replayTLI) + { + /* Check that it's OK to switch to this TLI */ + checkTimeLineSwitch(xlogreader->EndRecPtr, + newReplayTLI, prevReplayTLI, *replayTLI); + + /* Following WAL records should be run with new TLI */ + *replayTLI = newReplayTLI; + switchedTLI = true; + } + } + + /* + * Update shared replayEndRecPtr before replaying this record, so that + * XLogFlush will update minRecoveryPoint correctly. + */ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->replayEndRecPtr = xlogreader->EndRecPtr; + XLogRecoveryCtl->replayEndTLI = *replayTLI; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + /* + * If we are attempting to enter Hot Standby mode, process XIDs we see + */ + if (standbyState >= STANDBY_INITIALIZED && + TransactionIdIsValid(record->xl_xid)) + RecordKnownAssignedTransactionIds(record->xl_xid); + + /* + * Some XLOG record types that are related to recovery are processed + * directly here, rather than in xlog_redo() + */ + if (record->xl_rmid == RM_XLOG_ID) + xlogrecovery_redo(xlogreader, *replayTLI); + + /* Now apply the WAL record itself */ + GetRmgr(record->xl_rmid).rm_redo(xlogreader); + + /* + * After redo, check whether the backup pages associated with the WAL + * record are consistent with the existing pages. This check is done only + * if consistency check is enabled for this record. + */ + if ((record->xl_info & XLR_CHECK_CONSISTENCY) != 0) + verifyBackupPageConsistency(xlogreader); + + /* Pop the error context stack */ + error_context_stack = errcallback.previous; + + /* + * Update lastReplayedEndRecPtr after this record has been successfully + * replayed. + */ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->lastReplayedReadRecPtr = xlogreader->ReadRecPtr; + XLogRecoveryCtl->lastReplayedEndRecPtr = xlogreader->EndRecPtr; + XLogRecoveryCtl->lastReplayedTLI = *replayTLI; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + /* + * If rm_redo called XLogRequestWalReceiverReply, then we wake up the + * receiver so that it notices the updated lastReplayedEndRecPtr and sends + * a reply to the primary. + */ + if (doRequestWalReceiverReply) + { + doRequestWalReceiverReply = false; + WalRcvForceReply(); + } + + /* Allow read-only connections if we're consistent now */ + CheckRecoveryConsistency(); + + /* Is this a timeline switch? */ + if (switchedTLI) + { + /* + * Before we continue on the new timeline, clean up any (possibly + * bogus) future WAL segments on the old timeline. + */ + RemoveNonParentXlogFiles(xlogreader->EndRecPtr, *replayTLI); + + /* + * Wake up any walsenders to notice that we are on a new timeline. + */ + if (AllowCascadeReplication()) + WalSndWakeup(); + + /* Reset the prefetcher. */ + XLogPrefetchReconfigure(); + } +} + +/* + * Some XLOG RM record types that are directly related to WAL recovery are + * handled here rather than in the xlog_redo() + */ +static void +xlogrecovery_redo(XLogReaderState *record, TimeLineID replayTLI) +{ + uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; + XLogRecPtr lsn = record->EndRecPtr; + + Assert(XLogRecGetRmid(record) == RM_XLOG_ID); + + if (info == XLOG_OVERWRITE_CONTRECORD) + { + /* Verify the payload of a XLOG_OVERWRITE_CONTRECORD record. */ + xl_overwrite_contrecord xlrec; + + memcpy(&xlrec, XLogRecGetData(record), sizeof(xl_overwrite_contrecord)); + if (xlrec.overwritten_lsn != record->overwrittenRecPtr) + elog(FATAL, "mismatching overwritten LSN %X/%X -> %X/%X", + 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), + timestamptz_to_str(xlrec.overwrite_time)))); + + /* Verifying the record should only happen once */ + record->overwrittenRecPtr = InvalidXLogRecPtr; + } + else if (info == XLOG_BACKUP_END) + { + XLogRecPtr startpoint; + + memcpy(&startpoint, XLogRecGetData(record), sizeof(startpoint)); + + if (backupStartPoint == startpoint) + { + /* + * We have reached the end of base backup, the point where + * 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 + * end-of-backup processing. + */ + elog(DEBUG1, "end of backup record reached"); + + backupEndPoint = lsn; + } + else + elog(DEBUG1, "saw end-of-backup record for backup starting at %X/%X, waiting for %X/%X", + LSN_FORMAT_ARGS(startpoint), LSN_FORMAT_ARGS(backupStartPoint)); + } +} + +/* + * Verify that, in non-test mode, ./pg_tblspc doesn't contain any real + * directories. + * + * Replay of database creation XLOG records for databases that were later + * dropped can create fake directories in pg_tblspc. By the time consistency + * is reached these directories should have been removed; here we verify + * that this did indeed happen. This is to be called at the point where + * consistent state is reached. + * + * allow_in_place_tablespaces turns the PANIC into a WARNING, which is + * useful for testing purposes, and also allows for an escape hatch in case + * things go south. + */ +static void +CheckTablespaceDirectory(void) +{ + DIR *dir; + struct dirent *de; + + dir = AllocateDir("pg_tblspc"); + while ((de = ReadDir(dir, "pg_tblspc")) != NULL) + { + char path[MAXPGPATH + 10]; + + /* Skip entries of non-oid names */ + if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) + continue; + + snprintf(path, sizeof(path), "pg_tblspc/%s", de->d_name); + + if (get_dirent_type(path, de, false, ERROR) != PGFILETYPE_LNK) + ereport(allow_in_place_tablespaces ? WARNING : PANIC, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("unexpected directory entry \"%s\" found in %s", + de->d_name, "pg_tblspc/"), + errdetail("All directory entries in pg_tblspc/ should be symbolic links."), + errhint("Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete."))); + } +} + +/* + * Checks if recovery has reached a consistent state. When consistency is + * reached and we have a valid starting standby snapshot, tell postmaster + * that it can start accepting read-only connections. + */ +static void +CheckRecoveryConsistency(void) +{ + XLogRecPtr lastReplayedEndRecPtr; + TimeLineID lastReplayedTLI; + + /* + * During crash recovery, we don't reach a consistent state until we've + * replayed all the WAL. + */ + if (XLogRecPtrIsInvalid(minRecoveryPoint)) + return; + + Assert(InArchiveRecovery); + + /* + * assume that we are called in the startup process, and hence don't need + * a lock to read lastReplayedEndRecPtr + */ + lastReplayedEndRecPtr = XLogRecoveryCtl->lastReplayedEndRecPtr; + lastReplayedTLI = XLogRecoveryCtl->lastReplayedTLI; + + /* + * Have we reached the point where our base backup was completed? + */ + if (!XLogRecPtrIsInvalid(backupEndPoint) && + backupEndPoint <= lastReplayedEndRecPtr) + { + XLogRecPtr saveBackupStartPoint = backupStartPoint; + XLogRecPtr saveBackupEndPoint = backupEndPoint; + + elog(DEBUG1, "end of backup reached"); + + /* + * We have reached the end of base backup, as indicated by pg_control. + * Update the control file accordingly. + */ + ReachedEndOfBackup(lastReplayedEndRecPtr, lastReplayedTLI); + backupStartPoint = InvalidXLogRecPtr; + backupEndPoint = InvalidXLogRecPtr; + backupEndRequired = false; + + ereport(LOG, + (errmsg("completed backup recovery with redo LSN %X/%X and end LSN %X/%X", + LSN_FORMAT_ARGS(saveBackupStartPoint), + LSN_FORMAT_ARGS(saveBackupEndPoint)))); + } + + /* + * Have we passed our safe starting point? Note that minRecoveryPoint is + * 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. + */ + if (!reachedConsistency && !backupEndRequired && + minRecoveryPoint <= lastReplayedEndRecPtr) + { + /* + * Check to see if the XLOG sequence contained any unresolved + * references to uninitialized pages. + */ + XLogCheckInvalidPages(); + + /* + * Check that pg_tblspc doesn't contain any real directories. Replay + * of Database/CREATE_* records may have created ficticious tablespace + * directories that should have been removed by the time consistency + * was reached. + */ + CheckTablespaceDirectory(); + + reachedConsistency = true; + ereport(LOG, + (errmsg("consistent recovery state reached at %X/%X", + LSN_FORMAT_ARGS(lastReplayedEndRecPtr)))); + } + + /* + * Have we got a valid starting snapshot that will allow queries to be + * run? If so, we can tell postmaster that the database is consistent now, + * enabling connections. + */ + if (standbyState == STANDBY_SNAPSHOT_READY && + !LocalHotStandbyActive && + reachedConsistency && + IsUnderPostmaster) + { + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->SharedHotStandbyActive = true; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + LocalHotStandbyActive = true; + + SendPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY); + } +} + +/* + * Error context callback for errors occurring during rm_redo(). + */ +static void +rm_redo_error_callback(void *arg) +{ + XLogReaderState *record = (XLogReaderState *) arg; + StringInfoData buf; + + initStringInfo(&buf); + xlog_outdesc(&buf, record); + xlog_block_info(&buf, record); + + /* translator: %s is a WAL record description */ + errcontext("WAL redo at %X/%X for %s", + LSN_FORMAT_ARGS(record->ReadRecPtr), + buf.data); + + pfree(buf.data); +} + +/* + * Returns a string describing an XLogRecord, consisting of its identity + * optionally followed by a colon, a space, and a further description. + */ +void +xlog_outdesc(StringInfo buf, XLogReaderState *record) +{ + RmgrData rmgr = GetRmgr(XLogRecGetRmid(record)); + uint8 info = XLogRecGetInfo(record); + const char *id; + + appendStringInfoString(buf, rmgr.rm_name); + appendStringInfoChar(buf, '/'); + + id = rmgr.rm_identify(info); + if (id == NULL) + appendStringInfo(buf, "UNKNOWN (%X): ", info & ~XLR_INFO_MASK); + else + appendStringInfo(buf, "%s: ", id); + + rmgr.rm_desc(buf, record); +} + +#ifdef WAL_DEBUG + +static void +xlog_outrec(StringInfo buf, XLogReaderState *record) +{ + appendStringInfo(buf, "prev %X/%X; xid %u", + LSN_FORMAT_ARGS(XLogRecGetPrev(record)), + XLogRecGetXid(record)); + + appendStringInfo(buf, "; len %u", + XLogRecGetDataLen(record)); + + xlog_block_info(buf, record); +} +#endif /* WAL_DEBUG */ + +/* + * Returns a string giving information about all the blocks in an + * XLogRecord. + */ +static void +xlog_block_info(StringInfo buf, XLogReaderState *record) +{ + int block_id; + + /* decode block references */ + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + RelFileNode rnode; + ForkNumber forknum; + BlockNumber blk; + + if (!XLogRecGetBlockTagExtended(record, block_id, + &rnode, &forknum, &blk, NULL)) + continue; + + if (forknum != MAIN_FORKNUM) + appendStringInfo(buf, "; blkref #%d: rel %u/%u/%u, fork %u, blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + 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)) + appendStringInfoString(buf, " FPW"); + } +} + + +/* + * Check that it's OK to switch to new timeline during recovery. + * + * 'lsn' is the address of the shutdown checkpoint record we're about to + * replay. (Currently, timeline can only change at a shutdown checkpoint). + */ +static void +checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, TimeLineID prevTLI, + TimeLineID replayTLI) +{ + /* Check that the record agrees on what the current (old) timeline is */ + if (prevTLI != replayTLI) + ereport(PANIC, + (errmsg("unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record", + prevTLI, replayTLI))); + + /* + * The new timeline better be in the list of timelines we expect to see, + * according to the timeline history. It should also not decrease. + */ + if (newTLI < replayTLI || !tliInHistory(newTLI, expectedTLEs)) + ereport(PANIC, + (errmsg("unexpected timeline ID %u (after %u) in checkpoint record", + newTLI, replayTLI))); + + /* + * If we have not yet reached min recovery point, and we're about to + * switch to a timeline greater than the timeline of the min recovery + * point: trouble. After switching to the new timeline, we could not + * possibly visit the min recovery point on the correct timeline anymore. + * This can happen if there is a newer timeline in the archive that + * branched before the timeline the min recovery point is on, and you + * attempt to do PITR to the new timeline. + */ + if (!XLogRecPtrIsInvalid(minRecoveryPoint) && + lsn < minRecoveryPoint && + newTLI > minRecoveryPointTLI) + ereport(PANIC, + (errmsg("unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u", + newTLI, + LSN_FORMAT_ARGS(minRecoveryPoint), + minRecoveryPointTLI))); + + /* Looks good */ +} + + +/* + * Extract timestamp from WAL record. + * + * If the record contains a timestamp, returns true, and saves the timestamp + * in *recordXtime. If the record type has no timestamp, returns false. + * Currently, only transaction commit/abort records and restore points contain + * timestamps. + */ +static bool +getRecordTimestamp(XLogReaderState *record, TimestampTz *recordXtime) +{ + uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; + uint8 xact_info = info & XLOG_XACT_OPMASK; + uint8 rmid = XLogRecGetRmid(record); + + if (rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT) + { + *recordXtime = ((xl_restore_point *) XLogRecGetData(record))->rp_time; + return true; + } + if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_COMMIT || + xact_info == XLOG_XACT_COMMIT_PREPARED)) + { + *recordXtime = ((xl_xact_commit *) XLogRecGetData(record))->xact_time; + return true; + } + if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_ABORT || + xact_info == XLOG_XACT_ABORT_PREPARED)) + { + *recordXtime = ((xl_xact_abort *) XLogRecGetData(record))->xact_time; + return true; + } + return false; +} + +/* + * Checks whether the current buffer page and backup page stored in the + * WAL record are consistent or not. Before comparing the two pages, a + * masking can be applied to the pages to ignore certain areas like hint bits, + * unused space between pd_lower and pd_upper among other things. This + * function should be called once WAL replay has been completed for a + * given record. + */ +static void +verifyBackupPageConsistency(XLogReaderState *record) +{ + RmgrData rmgr = GetRmgr(XLogRecGetRmid(record)); + RelFileNode rnode; + ForkNumber forknum; + BlockNumber blkno; + int block_id; + + /* Records with no backup blocks have no need for consistency checks. */ + if (!XLogRecHasAnyBlockRefs(record)) + return; + + Assert((XLogRecGetInfo(record) & XLR_CHECK_CONSISTENCY) != 0); + + for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++) + { + Buffer buf; + Page page; + + if (!XLogRecGetBlockTagExtended(record, block_id, + &rnode, &forknum, &blkno, NULL)) + { + /* + * WAL record doesn't contain a block reference with the given id. + * Do nothing. + */ + continue; + } + + Assert(XLogRecHasBlockImage(record, block_id)); + + if (XLogRecBlockImageApply(record, block_id)) + { + /* + * WAL record has already applied the page, so bypass the + * consistency check as that would result in comparing the full + * page stored in the record with itself. + */ + continue; + } + + /* + * Read the contents from the current buffer and store it in a + * temporary page. + */ + buf = XLogReadBufferExtended(rnode, forknum, blkno, + RBM_NORMAL_NO_LOG, + InvalidBuffer); + if (!BufferIsValid(buf)) + continue; + + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); + page = BufferGetPage(buf); + + /* + * Take a copy of the local page where WAL has been applied to have a + * comparison base before masking it... + */ + memcpy(replay_image_masked, page, BLCKSZ); + + /* No need for this page anymore now that a copy is in. */ + UnlockReleaseBuffer(buf); + + /* + * If the block LSN is already ahead of this WAL record, we can't + * expect contents to match. This can happen if recovery is + * restarted. + */ + if (PageGetLSN(replay_image_masked) > record->EndRecPtr) + continue; + + /* + * Read the contents from the backup copy, stored in WAL record and + * store it in a temporary page. There is no need to allocate a new + * page here, a local buffer is fine to hold its contents and a mask + * can be directly applied on it. + */ + if (!RestoreBlockImage(record, block_id, primary_image_masked)) + ereport(ERROR, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg_internal("%s", record->errormsg_buf))); + + /* + * If masking function is defined, mask both the primary and replay + * images + */ + if (rmgr.rm_mask != NULL) + { + rmgr.rm_mask(replay_image_masked, blkno); + rmgr.rm_mask(primary_image_masked, blkno); + } + + /* Time to compare the primary and replay images. */ + if (memcmp(replay_image_masked, primary_image_masked, BLCKSZ) != 0) + { + elog(FATAL, + "inconsistent page found, rel %u/%u/%u, forknum %u, blkno %u", + rnode.spcNode, rnode.dbNode, rnode.relNode, + forknum, blkno); + } + } +} + +/* + * For point-in-time recovery, this function decides whether we want to + * stop applying the XLOG before the current record. + * + * Returns true if we are stopping, false otherwise. If stopping, some + * information is saved in recoveryStopXid et al for use in annotating the + * new timeline's history file. + */ +static bool +recoveryStopsBefore(XLogReaderState *record) +{ + bool stopsHere = false; + uint8 xact_info; + bool isCommit; + TimestampTz recordXtime = 0; + TransactionId recordXid; + + /* + * Ignore recovery target settings when not in archive recovery (meaning + * we are in crash recovery). + */ + if (!ArchiveRecoveryRequested) + return false; + + /* Check if we should stop as soon as reaching consistency */ + if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE && reachedConsistency) + { + ereport(LOG, + (errmsg("recovery stopping after reaching consistency"))); + + recoveryStopAfter = false; + recoveryStopXid = InvalidTransactionId; + recoveryStopLSN = InvalidXLogRecPtr; + recoveryStopTime = 0; + recoveryStopName[0] = '\0'; + return true; + } + + /* Check if target LSN has been reached */ + if (recoveryTarget == RECOVERY_TARGET_LSN && + !recoveryTargetInclusive && + record->ReadRecPtr >= recoveryTargetLSN) + { + recoveryStopAfter = false; + recoveryStopXid = InvalidTransactionId; + recoveryStopLSN = record->ReadRecPtr; + recoveryStopTime = 0; + recoveryStopName[0] = '\0'; + ereport(LOG, + (errmsg("recovery stopping before WAL location (LSN) \"%X/%X\"", + LSN_FORMAT_ARGS(recoveryStopLSN)))); + return true; + } + + /* Otherwise we only consider stopping before COMMIT or ABORT records. */ + if (XLogRecGetRmid(record) != RM_XACT_ID) + return false; + + xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK; + + if (xact_info == XLOG_XACT_COMMIT) + { + isCommit = true; + recordXid = XLogRecGetXid(record); + } + else if (xact_info == XLOG_XACT_COMMIT_PREPARED) + { + xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record); + xl_xact_parsed_commit parsed; + + isCommit = true; + ParseCommitRecord(XLogRecGetInfo(record), + xlrec, + &parsed); + recordXid = parsed.twophase_xid; + } + else if (xact_info == XLOG_XACT_ABORT) + { + isCommit = false; + recordXid = XLogRecGetXid(record); + } + else if (xact_info == XLOG_XACT_ABORT_PREPARED) + { + xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record); + xl_xact_parsed_abort parsed; + + isCommit = false; + ParseAbortRecord(XLogRecGetInfo(record), + xlrec, + &parsed); + recordXid = parsed.twophase_xid; + } + else + return false; + + if (recoveryTarget == RECOVERY_TARGET_XID && !recoveryTargetInclusive) + { + /* + * There can be only one transaction end record with this exact + * transactionid + * + * when testing for an xid, we MUST test for equality only, since + * transactions are numbered in the order they start, not the order + * they complete. A higher numbered xid will complete before you about + * 50% of the time... + */ + stopsHere = (recordXid == recoveryTargetXid); + } + + /* + * Note: we must fetch recordXtime regardless of recoveryTarget setting. + * We don't expect getRecordTimestamp ever to fail, since we already know + * this is a commit or abort record; but test its result anyway. + */ + if (getRecordTimestamp(record, &recordXtime) && + recoveryTarget == RECOVERY_TARGET_TIME) + { + /* + * There can be many transactions that share the same commit time, so + * we stop after the last one, if we are inclusive, or stop at the + * first one if we are exclusive + */ + if (recoveryTargetInclusive) + stopsHere = (recordXtime > recoveryTargetTime); + else + stopsHere = (recordXtime >= recoveryTargetTime); + } + + if (stopsHere) + { + recoveryStopAfter = false; + recoveryStopXid = recordXid; + recoveryStopTime = recordXtime; + recoveryStopLSN = InvalidXLogRecPtr; + recoveryStopName[0] = '\0'; + + if (isCommit) + { + ereport(LOG, + (errmsg("recovery stopping before commit of transaction %u, time %s", + recoveryStopXid, + timestamptz_to_str(recoveryStopTime)))); + } + else + { + ereport(LOG, + (errmsg("recovery stopping before abort of transaction %u, time %s", + recoveryStopXid, + timestamptz_to_str(recoveryStopTime)))); + } + } + + return stopsHere; +} + +/* + * Same as recoveryStopsBefore, but called after applying the record. + * + * We also track the timestamp of the latest applied COMMIT/ABORT + * record in XLogRecoveryCtl->recoveryLastXTime. + */ +static bool +recoveryStopsAfter(XLogReaderState *record) +{ + uint8 info; + uint8 xact_info; + uint8 rmid; + TimestampTz recordXtime = 0; + + /* + * Ignore recovery target settings when not in archive recovery (meaning + * we are in crash recovery). + */ + if (!ArchiveRecoveryRequested) + return false; + + info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; + rmid = XLogRecGetRmid(record); + + /* + * There can be many restore points that share the same name; we stop at + * the first one. + */ + if (recoveryTarget == RECOVERY_TARGET_NAME && + rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT) + { + xl_restore_point *recordRestorePointData; + + recordRestorePointData = (xl_restore_point *) XLogRecGetData(record); + + if (strcmp(recordRestorePointData->rp_name, recoveryTargetName) == 0) + { + recoveryStopAfter = true; + recoveryStopXid = InvalidTransactionId; + recoveryStopLSN = InvalidXLogRecPtr; + (void) getRecordTimestamp(record, &recoveryStopTime); + strlcpy(recoveryStopName, recordRestorePointData->rp_name, MAXFNAMELEN); + + ereport(LOG, + (errmsg("recovery stopping at restore point \"%s\", time %s", + recoveryStopName, + timestamptz_to_str(recoveryStopTime)))); + return true; + } + } + + /* Check if the target LSN has been reached */ + if (recoveryTarget == RECOVERY_TARGET_LSN && + recoveryTargetInclusive && + record->ReadRecPtr >= recoveryTargetLSN) + { + recoveryStopAfter = true; + recoveryStopXid = InvalidTransactionId; + recoveryStopLSN = record->ReadRecPtr; + recoveryStopTime = 0; + recoveryStopName[0] = '\0'; + ereport(LOG, + (errmsg("recovery stopping after WAL location (LSN) \"%X/%X\"", + LSN_FORMAT_ARGS(recoveryStopLSN)))); + return true; + } + + if (rmid != RM_XACT_ID) + return false; + + xact_info = info & XLOG_XACT_OPMASK; + + if (xact_info == XLOG_XACT_COMMIT || + xact_info == XLOG_XACT_COMMIT_PREPARED || + xact_info == XLOG_XACT_ABORT || + xact_info == XLOG_XACT_ABORT_PREPARED) + { + TransactionId recordXid; + + /* Update the last applied transaction timestamp */ + if (getRecordTimestamp(record, &recordXtime)) + SetLatestXTime(recordXtime); + + /* Extract the XID of the committed/aborted transaction */ + if (xact_info == XLOG_XACT_COMMIT_PREPARED) + { + xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(record); + xl_xact_parsed_commit parsed; + + ParseCommitRecord(XLogRecGetInfo(record), + xlrec, + &parsed); + recordXid = parsed.twophase_xid; + } + else if (xact_info == XLOG_XACT_ABORT_PREPARED) + { + xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(record); + xl_xact_parsed_abort parsed; + + ParseAbortRecord(XLogRecGetInfo(record), + xlrec, + &parsed); + recordXid = parsed.twophase_xid; + } + else + recordXid = XLogRecGetXid(record); + + /* + * There can be only one transaction end record with this exact + * transactionid + * + * when testing for an xid, we MUST test for equality only, since + * transactions are numbered in the order they start, not the order + * they complete. A higher numbered xid will complete before you about + * 50% of the time... + */ + if (recoveryTarget == RECOVERY_TARGET_XID && recoveryTargetInclusive && + recordXid == recoveryTargetXid) + { + recoveryStopAfter = true; + recoveryStopXid = recordXid; + recoveryStopTime = recordXtime; + recoveryStopLSN = InvalidXLogRecPtr; + recoveryStopName[0] = '\0'; + + if (xact_info == XLOG_XACT_COMMIT || + xact_info == XLOG_XACT_COMMIT_PREPARED) + { + ereport(LOG, + (errmsg("recovery stopping after commit of transaction %u, time %s", + recoveryStopXid, + timestamptz_to_str(recoveryStopTime)))); + } + else if (xact_info == XLOG_XACT_ABORT || + xact_info == XLOG_XACT_ABORT_PREPARED) + { + ereport(LOG, + (errmsg("recovery stopping after abort of transaction %u, time %s", + recoveryStopXid, + timestamptz_to_str(recoveryStopTime)))); + } + return true; + } + } + + /* Check if we should stop as soon as reaching consistency */ + if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE && reachedConsistency) + { + ereport(LOG, + (errmsg("recovery stopping after reaching consistency"))); + + recoveryStopAfter = true; + recoveryStopXid = InvalidTransactionId; + recoveryStopTime = 0; + recoveryStopLSN = InvalidXLogRecPtr; + recoveryStopName[0] = '\0'; + return true; + } + + return false; +} + +/* + * Create a comment for the history file to explain why and where + * timeline changed. + */ +static char * +getRecoveryStopReason(void) +{ + char reason[200]; + + if (recoveryTarget == RECOVERY_TARGET_XID) + snprintf(reason, sizeof(reason), + "%s transaction %u", + recoveryStopAfter ? "after" : "before", + recoveryStopXid); + else if (recoveryTarget == RECOVERY_TARGET_TIME) + snprintf(reason, sizeof(reason), + "%s %s\n", + recoveryStopAfter ? "after" : "before", + timestamptz_to_str(recoveryStopTime)); + else if (recoveryTarget == RECOVERY_TARGET_LSN) + snprintf(reason, sizeof(reason), + "%s LSN %X/%X\n", + recoveryStopAfter ? "after" : "before", + LSN_FORMAT_ARGS(recoveryStopLSN)); + else if (recoveryTarget == RECOVERY_TARGET_NAME) + snprintf(reason, sizeof(reason), + "at restore point \"%s\"", + recoveryStopName); + else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) + snprintf(reason, sizeof(reason), "reached consistency"); + else + snprintf(reason, sizeof(reason), "no recovery target specified"); + + return pstrdup(reason); +} + +/* + * Wait until shared recoveryPauseState is set to RECOVERY_NOT_PAUSED. + * + * endOfRecovery is true if the recovery target is reached and + * the paused state starts at the end of recovery because of + * recovery_target_action=pause, and false otherwise. + */ +static void +recoveryPausesHere(bool endOfRecovery) +{ + /* Don't pause unless users can connect! */ + if (!LocalHotStandbyActive) + return; + + /* Don't pause after standby promotion has been triggered */ + if (LocalPromoteIsTriggered) + return; + + if (endOfRecovery) + ereport(LOG, + (errmsg("pausing at the end of recovery"), + errhint("Execute pg_wal_replay_resume() to promote."))); + else + ereport(LOG, + (errmsg("recovery has paused"), + errhint("Execute pg_wal_replay_resume() to continue."))); + + /* loop until recoveryPauseState is set to RECOVERY_NOT_PAUSED */ + while (GetRecoveryPauseState() != RECOVERY_NOT_PAUSED) + { + HandleStartupProcInterrupts(); + if (CheckForStandbyTrigger()) + return; + + /* + * If recovery pause is requested then set it paused. While we are in + * the loop, user might resume and pause again so set this every time. + */ + ConfirmRecoveryPaused(); + + /* + * We wait on a condition variable that will wake us as soon as the + * pause ends, but we use a timeout so we can check the above exit + * condition periodically too. + */ + ConditionVariableTimedSleep(&XLogRecoveryCtl->recoveryNotPausedCV, 1000, + WAIT_EVENT_RECOVERY_PAUSE); + } + ConditionVariableCancelSleep(); +} + +/* + * When recovery_min_apply_delay is set, we wait long enough to make sure + * certain record types are applied at least that interval behind the primary. + * + * Returns true if we waited. + * + * Note that the delay is calculated between the WAL record log time and + * the current time on standby. We would prefer to keep track of when this + * standby received each WAL record, which would allow a more consistent + * approach and one not affected by time synchronisation issues, but that + * is significantly more effort and complexity for little actual gain in + * usability. + */ +static bool +recoveryApplyDelay(XLogReaderState *record) +{ + uint8 xact_info; + TimestampTz xtime; + TimestampTz delayUntil; + long msecs; + + /* nothing to do if no delay configured */ + if (recovery_min_apply_delay <= 0) + return false; + + /* no delay is applied on a database not yet consistent */ + if (!reachedConsistency) + return false; + + /* nothing to do if crash recovery is requested */ + if (!ArchiveRecoveryRequested) + return false; + + /* + * Is it a COMMIT record? + * + * We deliberately choose not to delay aborts since they have no effect on + * MVCC. We already allow replay of records that don't have a timestamp, + * so there is already opportunity for issues caused by early conflicts on + * standbys. + */ + if (XLogRecGetRmid(record) != RM_XACT_ID) + return false; + + xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK; + + if (xact_info != XLOG_XACT_COMMIT && + xact_info != XLOG_XACT_COMMIT_PREPARED) + return false; + + if (!getRecordTimestamp(record, &xtime)) + return false; + + delayUntil = TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay); + + /* + * Exit without arming the latch if it's already past time to apply this + * record + */ + msecs = TimestampDifferenceMilliseconds(GetCurrentTimestamp(), delayUntil); + if (msecs <= 0) + return false; + + while (true) + { + ResetLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + + /* + * This might change recovery_min_apply_delay or the trigger file's + * location. + */ + HandleStartupProcInterrupts(); + + if (CheckForStandbyTrigger()) + break; + + /* + * Recalculate delayUntil as recovery_min_apply_delay could have + * changed while waiting in this loop. + */ + delayUntil = TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay); + + /* + * Wait for difference between GetCurrentTimestamp() and delayUntil. + */ + msecs = TimestampDifferenceMilliseconds(GetCurrentTimestamp(), + delayUntil); + + if (msecs <= 0) + break; + + elog(DEBUG2, "recovery apply delay %ld milliseconds", msecs); + + (void) WaitLatch(&XLogRecoveryCtl->recoveryWakeupLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + msecs, + WAIT_EVENT_RECOVERY_APPLY_DELAY); + } + return true; +} + +/* + * Get the current state of the recovery pause request. + */ +RecoveryPauseState +GetRecoveryPauseState(void) +{ + RecoveryPauseState state; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + state = XLogRecoveryCtl->recoveryPauseState; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + return state; +} + +/* + * Set the recovery pause state. + * + * If recovery pause is requested then sets the recovery pause state to + * 'pause requested' if it is not already 'paused'. Otherwise, sets it + * to 'not paused' to resume the recovery. The recovery pause will be + * confirmed by the ConfirmRecoveryPaused. + */ +void +SetRecoveryPause(bool recoveryPause) +{ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + + if (!recoveryPause) + XLogRecoveryCtl->recoveryPauseState = RECOVERY_NOT_PAUSED; + else if (XLogRecoveryCtl->recoveryPauseState == RECOVERY_NOT_PAUSED) + XLogRecoveryCtl->recoveryPauseState = RECOVERY_PAUSE_REQUESTED; + + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + if (!recoveryPause) + ConditionVariableBroadcast(&XLogRecoveryCtl->recoveryNotPausedCV); +} + +/* + * Confirm the recovery pause by setting the recovery pause state to + * RECOVERY_PAUSED. + */ +static void +ConfirmRecoveryPaused(void) +{ + /* If recovery pause is requested then set it paused */ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + if (XLogRecoveryCtl->recoveryPauseState == RECOVERY_PAUSE_REQUESTED) + XLogRecoveryCtl->recoveryPauseState = RECOVERY_PAUSED; + SpinLockRelease(&XLogRecoveryCtl->info_lck); +} + + +/* + * Attempt to read the next XLOG record. + * + * Before first call, the reader needs to be positioned to the first record + * 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(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 */ + private->fetching_ckpt = fetching_ckpt; + private->emode = emode; + private->randAccess = (xlogreader->ReadRecPtr == InvalidXLogRecPtr); + private->replayTLI = replayTLI; + + /* This is the first attempt to read this page. */ + lastSourceFailed = false; + + for (;;) + { + char *errormsg; + + record = XLogPrefetcherReadRecord(xlogprefetcher, &errormsg); + if (record == NULL) + { + /* + * When 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 to downstream WAL readers that that portion is to be + * ignored. + * + * However, when ArchiveRecoveryRequested = true, we're going to + * switch to a new timeline at the end of recovery. We will only + * copy WAL over to the new timeline up to the end of the last + * complete record, so if we did this, we would later create an + * overwrite contrecord in the wrong place, breaking everything. + */ + if (!ArchiveRecoveryRequested && + !XLogRecPtrIsInvalid(xlogreader->abortedRecPtr)) + { + abortedRecPtr = xlogreader->abortedRecPtr; + missingContrecPtr = xlogreader->missingContrecPtr; + } + + if (readFile >= 0) + { + close(readFile); + readFile = -1; + } + + /* + * We only end up here without a message when XLogPageRead() + * failed - in that case we already logged something. In + * StandbyMode that only happens if we have been triggered, so we + * shouldn't loop anymore in that case. + */ + if (errormsg) + ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr), + (errmsg_internal("%s", errormsg) /* already translated */ )); + } + + /* + * Check page TLI is one of the expected values. + */ + else if (!tliInHistory(xlogreader->latestPageTLI, expectedTLEs)) + { + char fname[MAXFNAMELEN]; + XLogSegNo segno; + int32 offset; + + XLByteToSeg(xlogreader->latestPagePtr, segno, wal_segment_size); + offset = XLogSegmentOffset(xlogreader->latestPagePtr, + wal_segment_size); + XLogFileName(fname, xlogreader->seg.ws_tli, segno, + wal_segment_size); + ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr), + (errmsg("unexpected timeline ID %u in log segment %s, offset %u", + xlogreader->latestPageTLI, + fname, + offset))); + record = NULL; + } + + if (record) + { + /* Great, got a record */ + return record; + } + else + { + /* No valid record available from this source */ + lastSourceFailed = true; + + /* + * If archive recovery was requested, but we were still doing + * crash recovery, switch to archive recovery and retry using the + * offline archive. We have now replayed all the valid WAL in + * pg_wal, so we are presumably now consistent. + * + * We require that there's at least some valid WAL present in + * pg_wal, however (!fetching_ckpt). We could recover using the + * WAL from the archive, even if pg_wal is completely empty, but + * we'd have no idea how far we'd have to replay to reach + * consistency. So err on the safe side and give up. + */ + if (!InArchiveRecovery && ArchiveRecoveryRequested && + !fetching_ckpt) + { + ereport(DEBUG1, + (errmsg_internal("reached end of WAL in pg_wal, entering archive recovery"))); + InArchiveRecovery = true; + if (StandbyModeRequested) + EnableStandbyMode(); + + SwitchIntoArchiveRecovery(xlogreader->EndRecPtr, replayTLI); + minRecoveryPoint = xlogreader->EndRecPtr; + minRecoveryPointTLI = replayTLI; + + CheckRecoveryConsistency(); + + /* + * Before we retry, reset lastSourceFailed and currentSource + * so that we will check the archive next. + */ + lastSourceFailed = false; + currentSource = XLOG_FROM_ANY; + + continue; + } + + /* In standby mode, loop back to retry. Otherwise, give up. */ + if (StandbyMode && !CheckForStandbyTrigger()) + continue; + else + return NULL; + } + } +} + +/* + * Read the XLOG page containing RecPtr into readBuf (if not read already). + * 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. + * + * '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 + * 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 + * caller finds the record it's interested in to be broken, it should + * ereport the error with the level determined by + * emode_for_corrupt_record(), and then set lastSourceFailed + * and call XLogPageRead() again with the same arguments. This lets + * XLogPageRead() to try fetching the record from another source, or to + * sleep and retry. + */ +static int +XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, + XLogRecPtr targetRecPtr, char *readBuf) +{ + XLogPageReadPrivate *private = + (XLogPageReadPrivate *) xlogreader->private_data; + int emode = private->emode; + uint32 targetPageOff; + XLogSegNo targetSegNo PG_USED_FOR_ASSERTS_ONLY; + int r; + + XLByteToSeg(targetPagePtr, targetSegNo, wal_segment_size); + targetPageOff = XLogSegmentOffset(targetPagePtr, wal_segment_size); + + /* + * See if we need to switch to a new segment because the requested record + * is not in the currently open one. + */ + if (readFile >= 0 && + !XLByteInSeg(targetPagePtr, readSegNo, wal_segment_size)) + { + /* + * Request a restartpoint if we've replayed too much xlog since the + * last one. + */ + if (ArchiveRecoveryRequested && IsUnderPostmaster) + { + if (XLogCheckpointNeeded(readSegNo)) + { + (void) GetRedoRecPtr(); + if (XLogCheckpointNeeded(readSegNo)) + RequestCheckpoint(CHECKPOINT_CAUSE_XLOG); + } + } + + close(readFile); + readFile = -1; + readSource = XLOG_FROM_ANY; + } + + XLByteToSeg(targetPagePtr, readSegNo, wal_segment_size); + +retry: + /* See if we need to retrieve more data */ + if (readFile < 0 || + (readSource == XLOG_FROM_STREAM && + flushedUpto < targetPagePtr + reqLen)) + { + 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)) + { + 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; + } + } + + /* + * At this point, we have the right segment open and if we're streaming we + * know the requested record is in it. + */ + Assert(readFile != -1); + + /* + * If the current segment is being streamed from the primary, calculate + * how much of the current page we have received already. We know the + * requested record has been received, but this is for the benefit of + * future calls, to allow quick exit at the top of this function. + */ + if (readSource == XLOG_FROM_STREAM) + { + if (((targetPagePtr) / XLOG_BLCKSZ) != (flushedUpto / XLOG_BLCKSZ)) + readLen = XLOG_BLCKSZ; + else + readLen = XLogSegmentOffset(flushedUpto, wal_segment_size) - + targetPageOff; + } + else + readLen = XLOG_BLCKSZ; + + /* Read the requested page */ + readOff = targetPageOff; + + pgstat_report_wait_start(WAIT_EVENT_WAL_READ); + r = pg_pread(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff); + if (r != XLOG_BLCKSZ) + { + char fname[MAXFNAMELEN]; + int save_errno = errno; + + pgstat_report_wait_end(); + XLogFileName(fname, curFileTLI, readSegNo, wal_segment_size); + if (r < 0) + { + errno = save_errno; + ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen), + (errcode_for_file_access(), + errmsg("could not read from log segment %s, offset %u: %m", + fname, readOff))); + } + else + ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen), + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read from log segment %s, offset %u: read %d of %zu", + fname, readOff, r, (Size) XLOG_BLCKSZ))); + goto next_record_is_invalid; + } + pgstat_report_wait_end(); + + Assert(targetSegNo == readSegNo); + Assert(targetPageOff == readOff); + Assert(reqLen <= readLen); + + xlogreader->seg.ws_tli = curFileTLI; + + /* + * Check the page header immediately, so that we can retry immediately if + * it's not valid. This may seem unnecessary, because ReadPageInternal() + * validates the page header anyway, and would propagate the failure up to + * ReadRecord(), which would retry. However, there's a corner case with + * continuation records, if a record is split across two pages such that + * we would need to read the two pages from different sources. For + * example, imagine a scenario where a streaming replica is started up, + * and replay reaches a record that's split across two WAL segments. The + * first page is only available locally, in pg_wal, because it's already + * been recycled on the primary. The second page, however, is not present + * in pg_wal, and we should stream it from the primary. There is a + * recycled WAL segment present in pg_wal, with garbage contents, however. + * We would read the first page from the local WAL segment, but when + * reading the second page, we would read the bogus, recycled, WAL + * segment. If we didn't catch that case here, we would never recover, + * because ReadRecord() would retry reading the whole record from the + * beginning. + * + * Of course, this only catches errors in the page header, which is what + * happens in the case of a recycled WAL segment. Other kinds of errors or + * corruption still has the same problem. But this at least fixes the + * common case, which can happen as part of normal operation. + * + * Validating the page header is cheap enough that doing it twice + * shouldn't be a big deal from a performance point of view. + * + * When not in standby mode, an invalid page header should cause recovery + * to end, not retry reading the page, so we don't need to validate the + * page header here for the retry. Instead, ReadPageInternal() is + * responsible for the validation. + */ + if (StandbyMode && + !XLogReaderValidatePageHeader(xlogreader, targetPagePtr, readBuf)) + { + /* + * Emit this error right now then retry this page immediately. Use + * errmsg_internal() because the message was already translated. + */ + if (xlogreader->errormsg_buf[0]) + ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr), + (errmsg_internal("%s", xlogreader->errormsg_buf))); + + /* reset any error XLogReaderValidatePageHeader() might have set */ + XLogReaderResetError(xlogreader); + goto next_record_is_invalid; + } + + return readLen; + +next_record_is_invalid: + + /* + * If we're reading ahead, give up fast. Retries and error reporting will + * be handled by a later read when recovery catches up to this point. + */ + if (xlogreader->nonblocking) + return XLREAD_WOULDBLOCK; + + lastSourceFailed = true; + + if (readFile >= 0) + close(readFile); + readFile = -1; + readLen = 0; + readSource = XLOG_FROM_ANY; + + /* In standby-mode, keep trying */ + if (StandbyMode) + goto retry; + else + return XLREAD_FAIL; +} + +/* + * Open the WAL segment containing WAL location 'RecPtr'. + * + * The segment can be fetched via restore_command, or via walreceiver having + * streamed the record, or it can already be present in pg_wal. Checking + * pg_wal is mainly for crash recovery, but it will be polled in standby mode + * too, in case someone copies a new segment directly to pg_wal. That is not + * documented or recommended, though. + * + * If 'fetching_ckpt' is true, we're fetching a checkpoint record, and should + * prepare to read WAL starting from RedoStartLSN after this. + * + * 'RecPtr' might not point to the beginning of the record we're interested + * in, it might also point to the page or segment header. In that case, + * 'tliRecPtr' is the position of the WAL record we're interested in. It is + * used to decide which timeline to stream the requested WAL from. + * + * 'replayLSN' is the current replay LSN, so that if we scan for new + * timelines, we can reject a switch to a timeline that branched off before + * this point. + * + * If the record is not immediately available, the function returns false + * if we're not in standby mode. In standby mode, waits for it to become + * available. + * + * When the requested record becomes available, the function opens the file + * 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 XLogPageReadResult +WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, + bool fetching_ckpt, XLogRecPtr tliRecPtr, + TimeLineID replayTLI, XLogRecPtr replayLSN, + bool nonblocking) +{ + static TimestampTz last_fail_time = 0; + TimestampTz now; + bool streaming_reply_sent = false; + + /*------- + * Standby mode is implemented by a state machine: + * + * 1. Read from either archive or pg_wal (XLOG_FROM_ARCHIVE), or just + * pg_wal (XLOG_FROM_PG_WAL) + * 2. Check trigger file + * 3. Read from primary server via walreceiver (XLOG_FROM_STREAM) + * 4. Rescan timelines + * 5. Sleep wal_retrieve_retry_interval milliseconds, and loop back to 1. + * + * Failure to read from the current source advances the state machine to + * the next state. + * + * 'currentSource' indicates the current state. There are no currentSource + * values for "check trigger", "rescan timelines", and "sleep" states, + * those actions are taken when reading from the previous source fails, as + * part of advancing to the next state. + * + * If standby mode is turned off while reading WAL from stream, we move + * to XLOG_FROM_ARCHIVE and reset lastSourceFailed, to force fetching + * the files (which would be required at end of recovery, e.g., timeline + * history file) from archive or pg_wal. We don't need to kill WAL receiver + * here because it's already stopped when standby mode is turned off at + * the end of recovery. + *------- + */ + if (!InArchiveRecovery) + currentSource = XLOG_FROM_PG_WAL; + else if (currentSource == XLOG_FROM_ANY || + (!StandbyMode && currentSource == XLOG_FROM_STREAM)) + { + lastSourceFailed = false; + currentSource = XLOG_FROM_ARCHIVE; + } + + for (;;) + { + XLogSource oldSource = currentSource; + bool startWalReceiver = false; + + /* + * First check if we failed to read from the current source, and + * advance the state machine if so. The failure to read might've + * happened outside this function, e.g when a CRC check fails on a + * record, or within this loop. + */ + 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: + case XLOG_FROM_PG_WAL: + + /* + * Check to see if the trigger file exists. Note that we + * do this only after failure, so when you create the + * trigger file, we still finish replaying as much as we + * can from archive and pg_wal before failover. + */ + if (StandbyMode && CheckForStandbyTrigger()) + { + XLogShutdownWalRcv(); + return XLREAD_FAIL; + } + + /* + * Not in standby mode, and we've now tried the archive + * and pg_wal. + */ + if (!StandbyMode) + return XLREAD_FAIL; + + /* + * Move to XLOG_FROM_STREAM state, and set to start a + * walreceiver if necessary. + */ + currentSource = XLOG_FROM_STREAM; + startWalReceiver = true; + break; + + case XLOG_FROM_STREAM: + + /* + * Failure while streaming. Most likely, we got here + * because streaming replication was terminated, or + * promotion was triggered. But we also get here if we + * find an invalid record in the WAL streamed from the + * primary, in which case something is seriously wrong. + * There's little chance that the problem will just go + * away, but PANIC is not good for availability either, + * especially in hot standby mode. So, we treat that the + * same as disconnection, and retry from archive/pg_wal + * again. The WAL in the archive should be identical to + * what was streamed, so it's unlikely that it helps, but + * one can hope... + */ + + /* + * We should be able to move to XLOG_FROM_STREAM only in + * standby mode. + */ + Assert(StandbyMode); + + /* + * Before we leave XLOG_FROM_STREAM state, make sure that + * walreceiver is not active, so that it won't overwrite + * WAL that we restore from archive. + */ + XLogShutdownWalRcv(); + + /* + * Before we sleep, re-scan for possible new timelines if + * we were requested to recover to the latest timeline. + */ + if (recoveryTargetTimeLineGoal == RECOVERY_TARGET_TIMELINE_LATEST) + { + if (rescanLatestTimeLine(replayTLI, replayLSN)) + { + currentSource = XLOG_FROM_ARCHIVE; + break; + } + } + + /* + * XLOG_FROM_STREAM is the last state in our state + * machine, so we've exhausted all the options for + * obtaining the requested WAL. We're going to loop back + * and retry from the archive, but if it hasn't been long + * since last attempt, sleep wal_retrieve_retry_interval + * milliseconds to avoid busy-waiting. + */ + now = GetCurrentTimestamp(); + if (!TimestampDifferenceExceeds(last_fail_time, now, + wal_retrieve_retry_interval)) + { + long wait_time; + + wait_time = wal_retrieve_retry_interval - + TimestampDifferenceMilliseconds(last_fail_time, now); + + elog(LOG, "waiting for WAL to become available at %X/%X", + LSN_FORMAT_ARGS(RecPtr)); + + /* Do background tasks that might benefit us later. */ + KnownAssignedTransactionIdsIdleMaintenance(); + + (void) WaitLatch(&XLogRecoveryCtl->recoveryWakeupLatch, + WL_LATCH_SET | WL_TIMEOUT | + WL_EXIT_ON_PM_DEATH, + wait_time, + WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL); + ResetLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + now = GetCurrentTimestamp(); + + /* Handle interrupt signals of startup process */ + HandleStartupProcInterrupts(); + } + last_fail_time = now; + currentSource = XLOG_FROM_ARCHIVE; + break; + + default: + elog(ERROR, "unexpected WAL source %d", currentSource); + } + } + else if (currentSource == XLOG_FROM_PG_WAL) + { + /* + * We just successfully read a file in pg_wal. We prefer files in + * the archive over ones in pg_wal, so try the next file again + * from the archive first. + */ + if (InArchiveRecovery) + currentSource = XLOG_FROM_ARCHIVE; + } + + if (currentSource != oldSource) + elog(DEBUG2, "switched WAL source from %s to %s after %s", + xlogSourceNames[oldSource], xlogSourceNames[currentSource], + lastSourceFailed ? "failure" : "success"); + + /* + * We've now handled possible failure. Try to read from the chosen + * source. + */ + lastSourceFailed = false; + + switch (currentSource) + { + case XLOG_FROM_ARCHIVE: + case XLOG_FROM_PG_WAL: + + /* + * WAL receiver must not be running when reading WAL from + * archive or pg_wal. + */ + Assert(!WalRcvStreaming()); + + /* Close any old file we might have open. */ + if (readFile >= 0) + { + close(readFile); + readFile = -1; + } + /* Reset curFileTLI if random fetch. */ + if (randAccess) + curFileTLI = 0; + + /* + * Try to restore the file from archive, or read an existing + * file from pg_wal. + */ + readFile = XLogFileReadAnyTLI(readSegNo, DEBUG2, + currentSource == XLOG_FROM_ARCHIVE ? XLOG_FROM_ANY : + currentSource); + if (readFile >= 0) + return XLREAD_SUCCESS; /* success! */ + + /* + * Nope, not found in archive or pg_wal. + */ + lastSourceFailed = true; + break; + + case XLOG_FROM_STREAM: + { + bool havedata; + + /* + * We should be able to move to XLOG_FROM_STREAM only in + * standby mode. + */ + Assert(StandbyMode); + + /* + * First, shutdown walreceiver if its restart has been + * requested -- but no point if we're already slated for + * starting it. + */ + if (pendingWalRcvRestart && !startWalReceiver) + { + XLogShutdownWalRcv(); + + /* + * Re-scan for possible new timelines if we were + * requested to recover to the latest timeline. + */ + if (recoveryTargetTimeLineGoal == + RECOVERY_TARGET_TIMELINE_LATEST) + rescanLatestTimeLine(replayTLI, replayLSN); + + startWalReceiver = true; + } + pendingWalRcvRestart = false; + + /* + * Launch walreceiver if needed. + * + * If fetching_ckpt is true, RecPtr points to the initial + * checkpoint location. In that case, we use RedoStartLSN + * as the streaming start position instead of RecPtr, so + * that when we later jump backwards to start redo at + * RedoStartLSN, we will have the logs streamed already. + */ + if (startWalReceiver && + PrimaryConnInfo && strcmp(PrimaryConnInfo, "") != 0) + { + XLogRecPtr ptr; + TimeLineID tli; + + if (fetching_ckpt) + { + ptr = RedoStartLSN; + tli = RedoStartTLI; + } + else + { + ptr = RecPtr; + + /* + * Use the record begin position to determine the + * TLI, rather than the position we're reading. + */ + tli = tliOfPointInHistory(tliRecPtr, expectedTLEs); + + if (curFileTLI > 0 && tli < curFileTLI) + elog(ERROR, "according to history file, WAL location %X/%X belongs to timeline %u, but previous recovered WAL file came from timeline %u", + LSN_FORMAT_ARGS(tliRecPtr), + tli, curFileTLI); + } + curFileTLI = tli; + SetInstallXLogFileSegmentActive(); + RequestXLogStreaming(tli, ptr, PrimaryConnInfo, + PrimarySlotName, + wal_receiver_create_temp_slot); + flushedUpto = 0; + } + + /* + * Check if WAL receiver is active or wait to start up. + */ + if (!WalRcvStreaming()) + { + lastSourceFailed = true; + break; + } + + /* + * Walreceiver is active, so see if new data has arrived. + * + * We only advance XLogReceiptTime when we obtain fresh + * WAL from walreceiver and observe that we had already + * processed everything before the most recent "chunk" + * that it flushed to disk. In steady state where we are + * keeping up with the incoming data, XLogReceiptTime will + * be updated on each cycle. When we are behind, + * XLogReceiptTime will not advance, so the grace time + * allotted to conflicting queries will decrease. + */ + if (RecPtr < flushedUpto) + havedata = true; + else + { + XLogRecPtr latestChunkStart; + + flushedUpto = GetWalRcvFlushRecPtr(&latestChunkStart, &receiveTLI); + if (RecPtr < flushedUpto && receiveTLI == curFileTLI) + { + havedata = true; + if (latestChunkStart <= RecPtr) + { + XLogReceiptTime = GetCurrentTimestamp(); + SetCurrentChunkStartTime(XLogReceiptTime); + } + } + else + havedata = false; + } + if (havedata) + { + /* + * Great, streamed far enough. Open the file if it's + * not open already. Also read the timeline history + * file if we haven't initialized timeline history + * yet; it should be streamed over and present in + * pg_wal by now. Use XLOG_FROM_STREAM so that source + * info is set correctly and XLogReceiptTime isn't + * changed. + * + * NB: We must set readTimeLineHistory based on + * recoveryTargetTLI, not receiveTLI. Normally they'll + * be the same, but if recovery_target_timeline is + * 'latest' and archiving is configured, then it's + * possible that we managed to retrieve one or more + * new timeline history files from the archive, + * updating recoveryTargetTLI. + */ + if (readFile < 0) + { + if (!expectedTLEs) + expectedTLEs = readTimeLineHistory(recoveryTargetTLI); + readFile = XLogFileRead(readSegNo, PANIC, + receiveTLI, + XLOG_FROM_STREAM, false); + Assert(readFile >= 0); + } + else + { + /* just make sure source info is correct... */ + readSource = XLOG_FROM_STREAM; + XLogReceiptSource = XLOG_FROM_STREAM; + 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. + */ + if (CheckForStandbyTrigger()) + { + /* + * 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; + } + + /* + * Since we have replayed everything we have received so + * far and are about to start waiting for more WAL, let's + * tell the upstream server our replay location now so + * that pg_stat_replication doesn't show stale + * information. + */ + if (!streaming_reply_sent) + { + WalRcvForceReply(); + streaming_reply_sent = true; + } + + /* Do any background tasks that might benefit us later. */ + KnownAssignedTransactionIdsIdleMaintenance(); + + /* 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 + * WAL receiver is still active. + */ + (void) WaitLatch(&XLogRecoveryCtl->recoveryWakeupLatch, + WL_LATCH_SET | WL_TIMEOUT | + WL_EXIT_ON_PM_DEATH, + 5000L, WAIT_EVENT_RECOVERY_WAL_STREAM); + ResetLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + break; + } + + default: + elog(ERROR, "unexpected WAL source %d", currentSource); + } + + /* + * Check for recovery pause here so that we can confirm more quickly + * that a requested pause has actually taken effect. + */ + if (((volatile XLogRecoveryCtlData *) XLogRecoveryCtl)->recoveryPauseState != + RECOVERY_NOT_PAUSED) + recoveryPausesHere(false); + + /* + * This possibly-long loop needs to handle interrupts of startup + * process. + */ + HandleStartupProcInterrupts(); + } + + return XLREAD_FAIL; /* not reached */ +} + + +/* + * Determine what log level should be used to report a corrupt WAL record + * in the current WAL page, previously read by XLogPageRead(). + * + * 'emode' is the error mode that would be used to report a file-not-found + * or legitimate end-of-WAL situation. Generally, we use it as-is, but if + * we're retrying the exact same record that we've tried previously, only + * complain the first time to keep the noise down. However, we only do when + * reading from pg_wal, because we don't expect any invalid records in archive + * or in records streamed from the primary. Files in the archive should be complete, + * and we should never hit the end of WAL because we stop and wait for more WAL + * to arrive before replaying it. + * + * NOTE: This function remembers the RecPtr value it was last called with, + * to suppress repeated messages about the same record. Only call this when + * you are about to ereport(), or you might cause a later message to be + * erroneously suppressed. + */ +static int +emode_for_corrupt_record(int emode, XLogRecPtr RecPtr) +{ + static XLogRecPtr lastComplaint = 0; + + if (readSource == XLOG_FROM_PG_WAL && emode == LOG) + { + if (RecPtr == lastComplaint) + emode = DEBUG1; + else + lastComplaint = RecPtr; + } + return emode; +} + + +/* + * Subroutine to try to fetch and validate a prior checkpoint record. + * + * whichChkpt identifies the checkpoint (merely for reporting purposes). + * 1 for "primary", 0 for "other" (backup_label) + */ +static XLogRecord * +ReadCheckpointRecord(XLogPrefetcher *xlogprefetcher, XLogRecPtr RecPtr, + int whichChkpt, bool report, TimeLineID replayTLI) +{ + XLogRecord *record; + uint8 info; + + Assert(xlogreader != NULL); + + if (!XRecOffIsValid(RecPtr)) + { + if (!report) + return NULL; + + switch (whichChkpt) + { + case 1: + ereport(LOG, + (errmsg("invalid primary checkpoint link in control file"))); + break; + default: + ereport(LOG, + (errmsg("invalid checkpoint link in backup_label file"))); + break; + } + return NULL; + } + + XLogPrefetcherBeginRead(xlogprefetcher, RecPtr); + record = ReadRecord(xlogprefetcher, LOG, true, replayTLI); + + if (record == NULL) + { + if (!report) + return NULL; + + switch (whichChkpt) + { + case 1: + ereport(LOG, + (errmsg("invalid primary checkpoint record"))); + break; + default: + ereport(LOG, + (errmsg("invalid checkpoint record"))); + break; + } + return NULL; + } + if (record->xl_rmid != RM_XLOG_ID) + { + switch (whichChkpt) + { + case 1: + ereport(LOG, + (errmsg("invalid resource manager ID in primary checkpoint record"))); + break; + default: + ereport(LOG, + (errmsg("invalid resource manager ID in checkpoint record"))); + break; + } + return NULL; + } + info = record->xl_info & ~XLR_INFO_MASK; + if (info != XLOG_CHECKPOINT_SHUTDOWN && + info != XLOG_CHECKPOINT_ONLINE) + { + switch (whichChkpt) + { + case 1: + ereport(LOG, + (errmsg("invalid xl_info in primary checkpoint record"))); + break; + default: + ereport(LOG, + (errmsg("invalid xl_info in checkpoint record"))); + break; + } + return NULL; + } + if (record->xl_tot_len != SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint)) + { + switch (whichChkpt) + { + case 1: + ereport(LOG, + (errmsg("invalid length of primary checkpoint record"))); + break; + default: + ereport(LOG, + (errmsg("invalid length of checkpoint record"))); + break; + } + return NULL; + } + return record; +} + +/* + * Scan for new timelines that might have appeared in the archive since we + * started recovery. + * + * If there are any, the function changes recovery target TLI to the latest + * one and returns 'true'. + */ +static bool +rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN) +{ + List *newExpectedTLEs; + bool found; + ListCell *cell; + TimeLineID newtarget; + TimeLineID oldtarget = recoveryTargetTLI; + TimeLineHistoryEntry *currentTle = NULL; + + newtarget = findNewestTimeLine(recoveryTargetTLI); + if (newtarget == recoveryTargetTLI) + { + /* No new timelines found */ + return false; + } + + /* + * Determine the list of expected TLIs for the new TLI + */ + + newExpectedTLEs = readTimeLineHistory(newtarget); + + /* + * If the current timeline is not part of the history of the new timeline, + * we cannot proceed to it. + */ + found = false; + foreach(cell, newExpectedTLEs) + { + currentTle = (TimeLineHistoryEntry *) lfirst(cell); + + if (currentTle->tli == recoveryTargetTLI) + { + found = true; + break; + } + } + if (!found) + { + ereport(LOG, + (errmsg("new timeline %u is not a child of database system timeline %u", + newtarget, + replayTLI))); + return false; + } + + /* + * The current timeline was found in the history file, but check that the + * next timeline was forked off from it *after* the current recovery + * location. + */ + if (currentTle->end < replayLSN) + { + ereport(LOG, + (errmsg("new timeline %u forked off current database system timeline %u before current recovery point %X/%X", + newtarget, + replayTLI, + LSN_FORMAT_ARGS(replayLSN)))); + return false; + } + + /* The new timeline history seems valid. Switch target */ + recoveryTargetTLI = newtarget; + list_free_deep(expectedTLEs); + expectedTLEs = newExpectedTLEs; + + /* + * As in StartupXLOG(), try to ensure we have all the history files + * between the old target and new target in pg_wal. + */ + restoreTimeLineHistoryFiles(oldtarget + 1, newtarget); + + ereport(LOG, + (errmsg("new target timeline is %u", + recoveryTargetTLI))); + + return true; +} + + +/* + * Open a logfile segment for reading (during recovery). + * + * If source == XLOG_FROM_ARCHIVE, the segment is retrieved from archive. + * Otherwise, it's assumed to be already available in pg_wal. + */ +static int +XLogFileRead(XLogSegNo segno, int emode, TimeLineID tli, + XLogSource source, bool notfoundOk) +{ + char xlogfname[MAXFNAMELEN]; + char activitymsg[MAXFNAMELEN + 16]; + char path[MAXPGPATH]; + int fd; + + XLogFileName(xlogfname, tli, segno, wal_segment_size); + + switch (source) + { + case XLOG_FROM_ARCHIVE: + /* Report recovery progress in PS display */ + snprintf(activitymsg, sizeof(activitymsg), "waiting for %s", + xlogfname); + set_ps_display(activitymsg); + + if (!RestoreArchivedFile(path, xlogfname, + "RECOVERYXLOG", + wal_segment_size, + InRedo)) + return -1; + break; + + case XLOG_FROM_PG_WAL: + case XLOG_FROM_STREAM: + XLogFilePath(path, tli, segno, wal_segment_size); + break; + + default: + elog(ERROR, "invalid XLogFileRead source %d", source); + } + + /* + * If the segment was fetched from archival storage, replace the existing + * xlog segment (if any) with the archival version. + */ + if (source == XLOG_FROM_ARCHIVE) + { + Assert(!IsInstallXLogFileSegmentActive()); + KeepFileRestoredFromArchive(path, xlogfname); + + /* + * Set path to point at the new file in pg_wal. + */ + snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlogfname); + } + + fd = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (fd >= 0) + { + /* Success! */ + curFileTLI = tli; + + /* Report recovery progress in PS display */ + snprintf(activitymsg, sizeof(activitymsg), "recovering %s", + xlogfname); + set_ps_display(activitymsg); + + /* Track source of data in assorted state variables */ + readSource = source; + XLogReceiptSource = source; + /* In FROM_STREAM case, caller tracks receipt time, not me */ + if (source != XLOG_FROM_STREAM) + XLogReceiptTime = GetCurrentTimestamp(); + + return fd; + } + if (errno != ENOENT || !notfoundOk) /* unexpected failure? */ + ereport(PANIC, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", path))); + return -1; +} + +/* + * Open a logfile segment for reading (during recovery). + * + * This version searches for the segment with any TLI listed in expectedTLEs. + */ +static int +XLogFileReadAnyTLI(XLogSegNo segno, int emode, XLogSource source) +{ + char path[MAXPGPATH]; + ListCell *cell; + int fd; + List *tles; + + /* + * Loop looking for a suitable timeline ID: we might need to read any of + * the timelines listed in expectedTLEs. + * + * We expect curFileTLI on entry to be the TLI of the preceding file in + * sequence, or 0 if there was no predecessor. We do not allow curFileTLI + * to go backwards; this prevents us from picking up the wrong file when a + * parent timeline extends to higher segment numbers than the child we + * want to read. + * + * If we haven't read the timeline history file yet, read it now, so that + * we know which TLIs to scan. We don't save the list in expectedTLEs, + * however, unless we actually find a valid segment. That way if there is + * neither a timeline history file nor a WAL segment in the archive, and + * streaming replication is set up, we'll read the timeline history file + * streamed from the primary when we start streaming, instead of + * recovering with a dummy history generated here. + */ + if (expectedTLEs) + tles = expectedTLEs; + else + tles = readTimeLineHistory(recoveryTargetTLI); + + foreach(cell, tles) + { + TimeLineHistoryEntry *hent = (TimeLineHistoryEntry *) lfirst(cell); + TimeLineID tli = hent->tli; + + if (tli < curFileTLI) + break; /* don't bother looking at too-old TLIs */ + + /* + * Skip scanning the timeline ID that the logfile segment to read + * doesn't belong to + */ + if (hent->begin != InvalidXLogRecPtr) + { + XLogSegNo beginseg = 0; + + XLByteToSeg(hent->begin, beginseg, wal_segment_size); + + /* + * The logfile segment that doesn't belong to the timeline is + * older or newer than the segment that the timeline started or + * ended at, respectively. It's sufficient to check only the + * starting segment of the timeline here. Since the timelines are + * scanned in descending order in this loop, any segments newer + * than the ending segment should belong to newer timeline and + * have already been read before. So it's not necessary to check + * the ending segment of the timeline here. + */ + if (segno < beginseg) + continue; + } + + if (source == XLOG_FROM_ANY || source == XLOG_FROM_ARCHIVE) + { + fd = XLogFileRead(segno, emode, tli, + XLOG_FROM_ARCHIVE, true); + if (fd != -1) + { + elog(DEBUG1, "got WAL segment from archive"); + if (!expectedTLEs) + expectedTLEs = tles; + return fd; + } + } + + if (source == XLOG_FROM_ANY || source == XLOG_FROM_PG_WAL) + { + fd = XLogFileRead(segno, emode, tli, + XLOG_FROM_PG_WAL, true); + if (fd != -1) + { + if (!expectedTLEs) + expectedTLEs = tles; + return fd; + } + } + } + + /* Couldn't find it. For simplicity, complain about front timeline */ + XLogFilePath(path, recoveryTargetTLI, segno, wal_segment_size); + errno = ENOENT; + ereport(emode, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", path))); + return -1; +} + +/* + * Set flag to signal the walreceiver to restart. (The startup process calls + * this on noticing a relevant configuration change.) + */ +void +StartupRequestWalReceiverRestart(void) +{ + if (currentSource == XLOG_FROM_STREAM && WalRcvRunning()) + { + ereport(LOG, + (errmsg("WAL receiver process shutdown requested"))); + + pendingWalRcvRestart = true; + } +} + + +/* + * Has a standby promotion already been triggered? + * + * Unlike CheckForStandbyTrigger(), this works in any process + * that's connected to shared memory. + */ +bool +PromoteIsTriggered(void) +{ + /* + * We check shared state each time only until a standby promotion is + * triggered. We can't trigger a promotion again, so there's no need to + * keep checking after the shared variable has once been seen true. + */ + if (LocalPromoteIsTriggered) + return true; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + LocalPromoteIsTriggered = XLogRecoveryCtl->SharedPromoteIsTriggered; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + return LocalPromoteIsTriggered; +} + +static void +SetPromoteIsTriggered(void) +{ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->SharedPromoteIsTriggered = true; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + /* + * Mark the recovery pause state as 'not paused' because the paused state + * ends and promotion continues if a promotion is triggered while recovery + * is paused. Otherwise pg_get_wal_replay_pause_state() can mistakenly + * return 'paused' while a promotion is ongoing. + */ + SetRecoveryPause(false); + + LocalPromoteIsTriggered = true; +} + +/* + * Check to see whether the user-specified trigger file exists and whether a + * promote request has arrived. If either condition holds, return true. + */ +static bool +CheckForStandbyTrigger(void) +{ + struct stat stat_buf; + + if (LocalPromoteIsTriggered) + return true; + + if (IsPromoteSignaled() && CheckPromoteSignal()) + { + ereport(LOG, (errmsg("received promote request"))); + RemovePromoteSignalFiles(); + ResetPromoteSignaled(); + SetPromoteIsTriggered(); + return true; + } + + if (PromoteTriggerFile == NULL || strcmp(PromoteTriggerFile, "") == 0) + return false; + + if (stat(PromoteTriggerFile, &stat_buf) == 0) + { + ereport(LOG, + (errmsg("promote trigger file found: %s", PromoteTriggerFile))); + unlink(PromoteTriggerFile); + SetPromoteIsTriggered(); + return true; + } + else if (errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat promote trigger file \"%s\": %m", + PromoteTriggerFile))); + + return false; +} + +/* + * Remove the files signaling a standby promotion request. + */ +void +RemovePromoteSignalFiles(void) +{ + unlink(PROMOTE_SIGNAL_FILE); +} + +/* + * Check to see if a promote request has arrived. + */ +bool +CheckPromoteSignal(void) +{ + struct stat stat_buf; + + if (stat(PROMOTE_SIGNAL_FILE, &stat_buf) == 0) + return true; + + return false; +} + +/* + * Wake up startup process to replay newly arrived WAL, or to notice that + * failover has been requested. + */ +void +WakeupRecovery(void) +{ + SetLatch(&XLogRecoveryCtl->recoveryWakeupLatch); +} + +/* + * Schedule a walreceiver wakeup in the main recovery loop. + */ +void +XLogRequestWalReceiverReply(void) +{ + doRequestWalReceiverReply = true; +} + +/* + * Is HotStandby active yet? This is only important in special backends + * since normal backends won't ever be able to connect until this returns + * true. Postmaster knows this by way of signal, not via shared memory. + * + * Unlike testing standbyState, this works in any process that's connected to + * shared memory. (And note that standbyState alone doesn't tell the truth + * anyway.) + */ +bool +HotStandbyActive(void) +{ + /* + * We check shared state each time only until Hot Standby is active. We + * can't de-activate Hot Standby, so there's no need to keep checking + * after the shared variable has once been seen true. + */ + if (LocalHotStandbyActive) + return true; + else + { + /* spinlock is essential on machines with weak memory ordering! */ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + LocalHotStandbyActive = XLogRecoveryCtl->SharedHotStandbyActive; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + return LocalHotStandbyActive; + } +} + +/* + * Like HotStandbyActive(), but to be used only in WAL replay code, + * where we don't need to ask any other process what the state is. + */ +static bool +HotStandbyActiveInReplay(void) +{ + Assert(AmStartupProcess() || !IsPostmasterEnvironment); + return LocalHotStandbyActive; +} + +/* + * Get latest redo apply position. + * + * Exported to allow WALReceiver to read the pointer directly. + */ +XLogRecPtr +GetXLogReplayRecPtr(TimeLineID *replayTLI) +{ + XLogRecPtr recptr; + TimeLineID tli; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + recptr = XLogRecoveryCtl->lastReplayedEndRecPtr; + tli = XLogRecoveryCtl->lastReplayedTLI; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + if (replayTLI) + *replayTLI = tli; + return recptr; +} + + +/* + * Get position of last applied, or the record being applied. + * + * This is different from GetXLogReplayRecPtr() in that if a WAL + * record is currently being applied, this includes that record. + */ +XLogRecPtr +GetCurrentReplayRecPtr(TimeLineID *replayEndTLI) +{ + XLogRecPtr recptr; + TimeLineID tli; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + recptr = XLogRecoveryCtl->replayEndRecPtr; + tli = XLogRecoveryCtl->replayEndTLI; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + if (replayEndTLI) + *replayEndTLI = tli; + return recptr; +} + +/* + * Save timestamp of latest processed commit/abort record. + * + * We keep this in XLogRecoveryCtl, not a simple static variable, so that it can be + * seen by processes other than the startup process. Note in particular + * that CreateRestartPoint is executed in the checkpointer. + */ +static void +SetLatestXTime(TimestampTz xtime) +{ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->recoveryLastXTime = xtime; + SpinLockRelease(&XLogRecoveryCtl->info_lck); +} + +/* + * Fetch timestamp of latest processed commit/abort record. + */ +TimestampTz +GetLatestXTime(void) +{ + TimestampTz xtime; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + xtime = XLogRecoveryCtl->recoveryLastXTime; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + return xtime; +} + +/* + * Save timestamp of the next chunk of WAL records to apply. + * + * We keep this in XLogRecoveryCtl, not a simple static variable, so that it can be + * seen by all backends. + */ +static void +SetCurrentChunkStartTime(TimestampTz xtime) +{ + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + XLogRecoveryCtl->currentChunkStartTime = xtime; + SpinLockRelease(&XLogRecoveryCtl->info_lck); +} + +/* + * Fetch timestamp of latest processed commit/abort record. + * Startup process maintains an accurate local copy in XLogReceiptTime + */ +TimestampTz +GetCurrentChunkReplayStartTime(void) +{ + TimestampTz xtime; + + SpinLockAcquire(&XLogRecoveryCtl->info_lck); + xtime = XLogRecoveryCtl->currentChunkStartTime; + SpinLockRelease(&XLogRecoveryCtl->info_lck); + + return xtime; +} + +/* + * Returns time of receipt of current chunk of XLOG data, as well as + * whether it was received from streaming replication or from archives. + */ +void +GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream) +{ + /* + * This must be executed in the startup process, since we don't export the + * relevant state to shared memory. + */ + Assert(InRecovery); + + *rtime = XLogReceiptTime; + *fromStream = (XLogReceiptSource == XLOG_FROM_STREAM); +} + +/* + * Note that text field supplied is a parameter name and does not require + * translation + */ +void +RecoveryRequiresIntParameter(const char *param_name, int currValue, int minValue) +{ + if (currValue < minValue) + { + if (HotStandbyActiveInReplay()) + { + bool warned_for_promote = false; + + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("hot standby is not possible because of insufficient parameter settings"), + errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", + param_name, + currValue, + minValue))); + + SetRecoveryPause(true); + + ereport(LOG, + (errmsg("recovery has paused"), + errdetail("If recovery is unpaused, the server will shut down."), + errhint("You can then restart the server after making the necessary configuration changes."))); + + while (GetRecoveryPauseState() != RECOVERY_NOT_PAUSED) + { + HandleStartupProcInterrupts(); + + if (CheckForStandbyTrigger()) + { + if (!warned_for_promote) + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("promotion is not possible because of insufficient parameter settings"), + + /* + * Repeat the detail from above so it's easy to find + * in the log. + */ + errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", + param_name, + currValue, + minValue), + errhint("Restart the server after making the necessary configuration changes."))); + warned_for_promote = true; + } + + /* + * If recovery pause is requested then set it paused. While + * we are in the loop, user might resume and pause again so + * set this every time. + */ + ConfirmRecoveryPaused(); + + /* + * We wait on a condition variable that will wake us as soon + * as the pause ends, but we use a timeout so we can check the + * above conditions periodically too. + */ + ConditionVariableTimedSleep(&XLogRecoveryCtl->recoveryNotPausedCV, 1000, + WAIT_EVENT_RECOVERY_PAUSE); + } + ConditionVariableCancelSleep(); + } + + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("recovery aborted because of insufficient parameter settings"), + /* Repeat the detail from above so it's easy to find in the log. */ + errdetail("%s = %d is a lower setting than on the primary server, where its value was %d.", + param_name, + currValue, + minValue), + errhint("You can restart the server after making the necessary configuration changes."))); + } +} diff --git a/third_party/spanner_pg/src/backend/access/transam/xlogstats.c b/third_party/spanner_pg/src/backend/access/transam/xlogstats.c new file mode 100644 index 00000000..51418179 --- /dev/null +++ b/third_party/spanner_pg/src/backend/access/transam/xlogstats.c @@ -0,0 +1,96 @@ +/*------------------------------------------------------------------------- + * + * 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 (!XLogRecHasBlockRef(record, block_id)) + continue; + + 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/third_party/spanner_pg/src/backend/access/transam/xlogutils.c b/third_party/spanner_pg/src/backend/access/transam/xlogutils.c index d17d660f..702c8c14 100644 --- a/third_party/spanner_pg/src/backend/access/transam/xlogutils.c +++ b/third_party/spanner_pg/src/backend/access/transam/xlogutils.c @@ -8,7 +8,7 @@ * None of this code is used during normal system operation. * * - * 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 * * src/backend/access/transam/xlogutils.c @@ -20,11 +20,13 @@ #include #include "access/timeline.h" -#include "access/xlog.h" +#include "access/xlogrecovery.h" #include "access/xlog_internal.h" +#include "access/xlogprefetcher.h" #include "access/xlogutils.h" #include "miscadmin.h" #include "pgstat.h" +#include "storage/fd.h" #include "storage/smgr.h" #include "utils/guc.h" #include "utils/hsearch.h" @@ -34,6 +36,25 @@ /* GUC variable */ bool ignore_invalid_pages = false; +/* + * Are we doing recovery from XLOG? + * + * This is only ever true in the startup process; it should be read as meaning + * "this process is replaying WAL records", rather than "the system is in + * recovery mode". It should be examined primarily by functions that need + * to act differently when called from a WAL redo function (e.g., to skip WAL + * logging). To check whether the system is in recovery regardless of which + * process you're running in, use RecoveryInProgress() but only after shared + * memory startup and lock initialization. + * + * This is updated from xlog.c and xlogrecovery.c, but lives here because + * it's mostly read by WAL redo functions. + */ +bool InRecovery = false; + +/* Are we in Hot Standby mode? Only valid in startup process, see xlogutils.h */ +HotStandbyState standbyState = STANDBY_DISABLED; + /* * During XLOG replay, we may see XLOG records for incremental updates of * pages that no longer exist, because their relation was later dropped or @@ -59,6 +80,9 @@ 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 @@ -335,14 +359,17 @@ 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); + elog(PANIC, "failed to locate backup block with ID %d in WAL record", + block_id); } /* @@ -350,7 +377,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) @@ -361,10 +388,13 @@ 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"); + ereport(ERROR, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg_internal("%s", record->errormsg_buf))); /* * The page may be uninitialized. If so, we can't set the LSN because @@ -390,7 +420,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) @@ -430,6 +460,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 @@ -437,7 +471,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; @@ -445,6 +480,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); @@ -464,7 +508,7 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, { /* page exists in file */ buffer = ReadBufferWithoutRelcache(rnode, forknum, blkno, - mode, NULL); + mode, NULL, true); } else { @@ -489,7 +533,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 */ @@ -499,10 +543,11 @@ XLogReadBufferExtended(RelFileNode rnode, ForkNumber forknum, LockBuffer(buffer, BUFFER_LOCK_UNLOCK); ReleaseBuffer(buffer); buffer = ReadBufferWithoutRelcache(rnode, forknum, blkno, - mode, NULL); + mode, NULL, true); } } +recent_buffer_fast_path: if (mode == RBM_NORMAL) { /* check that page has been initialized */ @@ -658,6 +703,10 @@ XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, * wantLength to the amount of the page that will be read, up to * XLOG_BLCKSZ. If the amount to be read isn't known, pass XLOG_BLCKSZ. * + * The currTLI argument should be the system-wide current timeline. + * Note that this may be different from state->currTLI, which is the timeline + * from which the caller is currently reading previous xlog records. + * * We switch to an xlog segment from the new timeline eagerly when on a * historical timeline, as soon as we reach the start of the xlog segment * containing the timeline switch. The server copied the segment to the new @@ -679,12 +728,11 @@ XLogTruncateRelation(RelFileNode rnode, ForkNumber forkNum, * * The caller must also make sure it doesn't read past the current replay * position (using GetXLogReplayRecPtr) if executing in recovery, so it - * doesn't fail to notice that the current timeline became historical. The - * caller must also update ThisTimeLineID with the result of - * GetXLogReplayRecPtr and must check RecoveryInProgress(). + * doesn't fail to notice that the current timeline became historical. */ void -XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wantLength) +XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, + uint32 wantLength, TimeLineID currTLI) { const XLogRecPtr lastReadPage = (state->seg.ws_segno * state->segcxt.ws_segsize + state->segoff); @@ -692,6 +740,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa Assert(wantPage != InvalidXLogRecPtr && wantPage % XLOG_BLCKSZ == 0); Assert(wantLength <= XLOG_BLCKSZ); Assert(state->readLen == 0 || state->readLen <= XLOG_BLCKSZ); + Assert(currTLI != 0); /* * If the desired page is currently read in and valid, we have nothing to @@ -712,12 +761,12 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa * just carry on. (Seeking backwards requires a check to make sure the * older page isn't on a prior timeline). * - * ThisTimeLineID might've become historical since we last looked, but the - * caller is required not to read past the flush limit it saw at the time - * it looked up the timeline. There's nothing we can do about it if - * StartupXLOG() renames it to .partial concurrently. + * currTLI might've become historical since the caller obtained the value, + * but the caller is required not to read past the flush limit it saw at + * the time it looked up the timeline. There's nothing we can do about it + * if StartupXLOG() renames it to .partial concurrently. */ - if (state->currTLI == ThisTimeLineID && wantPage >= lastReadPage) + if (state->currTLI == currTLI && wantPage >= lastReadPage) { Assert(state->currTLIValidUntil == InvalidXLogRecPtr); return; @@ -729,7 +778,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa * the current segment we can just keep reading. */ if (state->currTLIValidUntil != InvalidXLogRecPtr && - state->currTLI != ThisTimeLineID && + state->currTLI != currTLI && state->currTLI != 0 && ((wantPage + wantLength) / state->segcxt.ws_segsize) < (state->currTLIValidUntil / state->segcxt.ws_segsize)) @@ -752,7 +801,7 @@ XLogReadDetermineTimeline(XLogReaderState *state, XLogRecPtr wantPage, uint32 wa * We need to re-read the timeline history in case it's been changed * by a promotion or replay from a cascaded replica. */ - List *timelineHistory = readTimeLineHistory(ThisTimeLineID); + List *timelineHistory = readTimeLineHistory(currTLI); XLogRecPtr endOfSegment; endOfSegment = ((wantPage / state->segcxt.ws_segsize) + 1) * @@ -827,12 +876,38 @@ 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; TimeLineID tli; int count; WALReadError errinfo; + TimeLineID currTLI; loc = targetPagePtr + reqLen; @@ -842,16 +917,12 @@ read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, /* * Determine the limit of xlog we can currently read to, and what the * most recent timeline is. - * - * RecoveryInProgress() will update ThisTimeLineID when it first - * notices recovery finishes, so we only have to maintain it for the - * local process until recovery ends. */ if (!RecoveryInProgress()) - read_upto = GetFlushRecPtr(); + read_upto = GetFlushRecPtr(&currTLI); else - read_upto = GetXLogReplayRecPtr(&ThisTimeLineID); - tli = ThisTimeLineID; + read_upto = GetXLogReplayRecPtr(&currTLI); + tli = currTLI; /* * Check which timeline to get the record from. @@ -870,21 +941,36 @@ read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, * archive in the timeline will get renamed to .partial by * StartupXLOG(). * - * If that happens after our caller updated ThisTimeLineID but before - * we actually read the xlog page, we might still try to read from the + * If that happens after our caller determined the TLI but before we + * actually read the xlog page, we might still try to read from the * old (now renamed) segment and fail. There's not much we can do * about this, but it can only happen when we're a leaf of a cascading * standby whose primary gets promoted while we're decoding, so a * one-off ERROR isn't too bad. */ - XLogReadDetermineTimeline(state, targetPagePtr, reqLen); + XLogReadDetermineTimeline(state, targetPagePtr, reqLen, tli); - if (state->currTLI == ThisTimeLineID) + if (state->currTLI == currTLI) { if (loc <= read_upto) break; + /* 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); } @@ -964,15 +1050,15 @@ WALReadRaiseError(WALReadError *errinfo) errno = errinfo->wre_errno; ereport(ERROR, (errcode_for_file_access(), - errmsg("could not read from log segment %s, offset %u: %m", + errmsg("could not read from log segment %s, offset %d: %m", fname, errinfo->wre_off))); } else if (errinfo->wre_read == 0) { ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("could not read from log segment %s, offset %u: read %d of %zu", + errmsg("could not read from log segment %s, offset %d: read %d of %d", fname, errinfo->wre_off, errinfo->wre_read, - (Size) errinfo->wre_req))); + errinfo->wre_req))); } } diff --git a/third_party/spanner_pg/src/backend/backup/BUILD b/third_party/spanner_pg/src/backend/backup/BUILD new file mode 100644 index 00000000..71829aed --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/BUILD @@ -0,0 +1,71 @@ +# +# PostgreSQL is released under the PostgreSQL License, a liberal Open Source +# license, similar to the BSD or MIT licenses. +# +# PostgreSQL Database Management System +# (formerly known as Postgres, then as Postgres95) +# +# Portions Copyright © 1996-2020, The PostgreSQL Global Development Group +# +# Portions Copyright © 1994, The Regents of the University of California +# +# Portions Copyright 2023 Google LLC +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose, without fee, and without a written agreement +# is hereby granted, provided that the above copyright notice and this +# paragraph and the following two paragraphs appear in all copies. +# +# IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +# LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +# EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN +# "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE +# MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +#------------------------------------------------------------------------------ + + + +package( + default_visibility = [ + "//:__subpackages__", + ], + # Disable layering_check because the Postgres binary is one giant component. + # Disable parse_headers because postgres implicitly includes postgres.h + # before each header, so, the headers cannot be parsed independently. + features = [ + "-layering_check", + "-parse_headers", + ], +) + +licenses(["notice"]) + +cc_library( + name = "backup", + srcs = [ + "backup_manifest.c", + "basebackup.c", + "basebackup_copy.c", + "basebackup_gzip.c", + "basebackup_lz4.c", + "basebackup_progress.c", + "basebackup_server.c", + "basebackup_sink.c", + "basebackup_target.c", + "basebackup_throttle.c", + "basebackup_zstd.c", + ], + deps = [ + "//third_party/spanner_pg/src/include", + "@lz4", + "@net_zstd//:zstdlib", + "@zlib", + ], + alwayslink = 1, +) diff --git a/third_party/spanner_pg/src/backend/backup/Makefile b/third_party/spanner_pg/src/backend/backup/Makefile new file mode 100644 index 00000000..b21bd8ff --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/Makefile @@ -0,0 +1,30 @@ +#------------------------------------------------------------------------- +# +# Makefile-- +# Makefile for src/backend/backup +# +# IDENTIFICATION +# src/backend/backup/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/backend/backup +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_target.o \ + basebackup_throttle.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/third_party/spanner_pg/src/backend/replication/backup_manifest.c b/third_party/spanner_pg/src/backend/backup/backup_manifest.c similarity index 91% rename from third_party/spanner_pg/src/backend/replication/backup_manifest.c rename to third_party/spanner_pg/src/backend/backup/backup_manifest.c index 27191044..618bd0d5 100644 --- a/third_party/spanner_pg/src/backend/replication/backup_manifest.c +++ b/third_party/spanner_pg/src/backend/backup/backup_manifest.c @@ -3,20 +3,21 @@ * backup_manifest.c * code for generating and sending a backup manifest * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/replication/backup_manifest.c + * src/backend/backup/backup_manifest.c * *------------------------------------------------------------------------- */ #include "postgres.h" #include "access/timeline.h" +#include "backup/backup_manifest.h" +#include "backup/basebackup_sink.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" #include "mb/pg_wchar.h" -#include "replication/backup_manifest.h" #include "utils/builtins.h" #include "utils/json.h" @@ -67,7 +68,8 @@ InitializeBackupManifest(backup_manifest_info *manifest, manifest->buffile = BufFileCreateTemp(false); manifest->manifest_ctx = pg_cryptohash_create(PG_SHA256); if (pg_cryptohash_init(manifest->manifest_ctx) < 0) - elog(ERROR, "failed to initialize checksum of backup manifest"); + elog(ERROR, "failed to initialize checksum of backup manifest: %s", + pg_cryptohash_error(manifest->manifest_ctx)); } manifest->manifest_size = UINT64CONST(0); @@ -310,9 +312,8 @@ AddWALInfoToBackupManifest(backup_manifest_info *manifest, XLogRecPtr startptr, * Finalize the backup manifest, and send it to the client. */ void -SendBackupManifest(backup_manifest_info *manifest) +SendBackupManifest(backup_manifest_info *manifest, bbsink *sink) { - StringInfoData protobuf; uint8 checksumbuf[PG_SHA256_DIGEST_LENGTH]; char checksumstringbuf[PG_SHA256_DIGEST_STRING_LENGTH]; size_t manifest_bytes_done = 0; @@ -334,7 +335,8 @@ SendBackupManifest(backup_manifest_info *manifest) manifest->still_checksumming = false; if (pg_cryptohash_final(manifest->manifest_ctx, checksumbuf, sizeof(checksumbuf)) < 0) - elog(ERROR, "failed to finalize checksum of backup manifest"); + elog(ERROR, "failed to finalize checksum of backup manifest: %s", + pg_cryptohash_error(manifest->manifest_ctx)); AppendStringToManifest(manifest, "\"Manifest-Checksum\": \""); hex_encode((char *) checksumbuf, sizeof checksumbuf, checksumstringbuf); @@ -352,39 +354,29 @@ SendBackupManifest(backup_manifest_info *manifest) (errcode_for_file_access(), errmsg("could not rewind temporary file"))); - /* Send CopyOutResponse message */ - pq_beginmessage(&protobuf, 'H'); - pq_sendbyte(&protobuf, 0); /* overall format */ - pq_sendint16(&protobuf, 0); /* natts */ - pq_endmessage(&protobuf); /* - * Send CopyData messages. - * - * We choose to read back the data from the temporary file in chunks of - * size BLCKSZ; this isn't necessary, but buffile.c uses that as the I/O - * size, so it seems to make sense to match that value here. + * Send the backup manifest. */ + bbsink_begin_manifest(sink); while (manifest_bytes_done < manifest->manifest_size) { - char manifestbuf[BLCKSZ]; size_t bytes_to_read; size_t rc; - bytes_to_read = Min(sizeof(manifestbuf), + bytes_to_read = Min(sink->bbs_buffer_length, manifest->manifest_size - manifest_bytes_done); - rc = BufFileRead(manifest->buffile, manifestbuf, bytes_to_read); + rc = BufFileRead(manifest->buffile, sink->bbs_buffer, + bytes_to_read); if (rc != bytes_to_read) ereport(ERROR, (errcode_for_file_access(), errmsg("could not read from temporary file: read only %zu of %zu bytes", rc, bytes_to_read))); - pq_putmessage('d', manifestbuf, bytes_to_read); + bbsink_manifest_contents(sink, bytes_to_read); manifest_bytes_done += bytes_to_read; } - - /* No more data, so send CopyDone message */ - pq_putemptymessage('c'); + bbsink_end_manifest(sink); /* Release resources */ BufFileClose(manifest->buffile); @@ -402,7 +394,8 @@ AppendStringToManifest(backup_manifest_info *manifest, char *s) if (manifest->still_checksumming) { if (pg_cryptohash_update(manifest->manifest_ctx, (uint8 *) s, len) < 0) - elog(ERROR, "failed to update checksum of backup manifest"); + elog(ERROR, "failed to update checksum of backup manifest: %s", + pg_cryptohash_error(manifest->manifest_ctx)); } BufFileWrite(manifest->buffile, s, len); manifest->manifest_size += len; diff --git a/third_party/spanner_pg/src/backend/replication/basebackup.c b/third_party/spanner_pg/src/backend/backup/basebackup.c similarity index 67% rename from third_party/spanner_pg/src/backend/replication/basebackup.c rename to third_party/spanner_pg/src/backend/backup/basebackup.c index d142cc21..078a3fe9 100644 --- a/third_party/spanner_pg/src/backend/replication/basebackup.c +++ b/third_party/spanner_pg/src/backend/backup/basebackup.c @@ -3,10 +3,10 @@ * basebackup.c * code for taking a base backup and streaming it to a standby * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/replication/basebackup.c + * src/backend/backup/basebackup.c * *------------------------------------------------------------------------- */ @@ -16,21 +16,21 @@ #include #include -#include "access/xlog_internal.h" /* for pg_start/stop_backup */ -#include "catalog/pg_type.h" +#include "access/xlog_internal.h" +#include "backup/backup_manifest.h" +#include "backup/basebackup.h" +#include "backup/basebackup_sink.h" +#include "backup/basebackup_target.h" +#include "commands/defrem.h" +#include "common/compression.h" #include "common/file_perm.h" -#include "commands/progress.h" #include "lib/stringinfo.h" -#include "libpq/libpq.h" -#include "libpq/pqformat.h" #include "miscadmin.h" #include "nodes/pg_list.h" #include "pgstat.h" #include "pgtar.h" #include "port.h" #include "postmaster/syslogger.h" -#include "replication/basebackup.h" -#include "replication/backup_manifest.h" #include "replication/walsender.h" #include "replication/walsender_private.h" #include "storage/bufpage.h" @@ -45,6 +45,16 @@ #include "utils/resowner.h" #include "utils/timestamp.h" +/* + * How much data do we want to send in one CopyData message? Note that + * this may also result in reading the underlying files in chunks of this + * size. + * + * NB: The buffer size is required to be a multiple of the system block + * size, so use that value instead if it's bigger than our preference. + */ +#define SINK_BUFFER_LENGTH Max(32768, BLCKSZ) + typedef struct { const char *label; @@ -54,32 +64,34 @@ typedef struct bool includewal; uint32 maxrate; bool sendtblspcmapfile; + bool send_to_client; + bool use_copytblspc; + BaseBackupTargetHandle *target_handle; backup_manifest_option manifest; + pg_compress_algorithm compression; + pg_compress_specification compression_specification; pg_checksum_type manifest_checksum_type; } basebackup_options; -static int64 sendTablespace(char *path, char *oid, bool sizeonly, +static int64 sendTablespace(bbsink *sink, char *path, char *oid, bool sizeonly, struct backup_manifest_info *manifest); -static int64 sendDir(const char *path, int basepathlen, bool sizeonly, +static int64 sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, List *tablespaces, bool sendtblspclinks, backup_manifest_info *manifest, const char *spcoid); -static bool sendFile(const char *readfilename, const char *tarfilename, +static bool sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, struct stat *statbuf, bool missing_ok, Oid dboid, backup_manifest_info *manifest, const char *spcoid); -static void sendFileWithContent(const char *filename, const char *content, +static void sendFileWithContent(bbsink *sink, const char *filename, + const char *content, backup_manifest_info *manifest); -static int64 _tarWriteHeader(const char *filename, const char *linktarget, - struct stat *statbuf, bool sizeonly); -static int64 _tarWriteDir(const char *pathbuf, int basepathlen, struct stat *statbuf, - bool sizeonly); -static void send_int8_string(StringInfoData *buf, int64 intval); -static void SendBackupHeader(List *tablespaces); -static void perform_base_backup(basebackup_options *opt); +static int64 _tarWriteHeader(bbsink *sink, const char *filename, + const char *linktarget, struct stat *statbuf, + bool sizeonly); +static void _tarWritePadding(bbsink *sink, int len); +static void convert_link_to_directory(const char *pathbuf, struct stat *statbuf); +static void perform_base_backup(basebackup_options *opt, bbsink *sink); static void parse_basebackup_options(List *options, basebackup_options *opt); -static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli); static int compareWalFileNames(const ListCell *a, const ListCell *b); -static void throttle(size_t increment); -static void update_basebackup_progress(int64 delta); static bool is_checksummed_file(const char *fullpath, const char *filename); static int basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, const char *filename, bool partial_read_ok); @@ -87,49 +99,12 @@ 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; - -/* - * Size of each block sent into the tar stream for larger files. - */ -#define TAR_SEND_SIZE 32768 - -/* - * How frequently to throttle, as a fraction of the specified rate-second. - */ -#define THROTTLING_FREQUENCY 8 - -/* The actual number of bytes, transfer of which may cause sleep. */ -static uint64 throttling_sample; - -/* Amount of data already transferred but not yet throttled. */ -static int64 throttling_counter; - -/* The minimum time required to transfer throttling_sample bytes. */ -static TimeOffset elapsed_min_unit; - -/* The last check of the transfer rate. */ -static TimestampTz throttled_last; - -/* The starting XLOG position of the base backup. */ -static XLogRecPtr startptr; - /* Total number of checksum failures during base backup. */ static long long int total_checksum_failures; /* Do not verify checksums. */ static bool noverify_checksums = false; -/* - * Total amount of backup data that will be streamed. - * -1 means that the size is not estimated. - */ -static int64 backup_total = 0; - -/* Amount of backup data already streamed */ -static int64 backup_streamed = 0; - /* * Definition of one element part of an exclusion list, used for paths part * of checksum validation or base backups. "name" is the name of the file @@ -153,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, @@ -206,10 +180,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 a running cluster + * capable of doing an online backup, but exclude them just in case. */ {BACKUP_LABEL_FILE, false}, {TABLESPACE_MAP, false}, @@ -253,39 +225,26 @@ static const struct exclude_list_item noChecksumFiles[] = { * clobbered by longjmp" from stupider versions of gcc. */ static void -perform_base_backup(basebackup_options *opt) +perform_base_backup(basebackup_options *opt, bbsink *sink) { - TimeLineID starttli; + bbsink_state state; XLogRecPtr endptr; TimeLineID endtli; StringInfo labelfile; StringInfo tblspc_map_file; backup_manifest_info manifest; - int datadirpathlen; - List *tablespaces = NIL; - backup_total = 0; - backup_streamed = 0; - pgstat_progress_start_command(PROGRESS_COMMAND_BASEBACKUP, InvalidOid); - - /* - * If the estimation of the total backup size is disabled, make the - * backup_total column in the view return NULL by setting the parameter to - * -1. - */ - if (!opt->progress) - { - backup_total = -1; - pgstat_progress_update_param(PROGRESS_BASEBACKUP_BACKUP_TOTAL, - backup_total); - } + /* Initial backup state, insofar as we know it now. */ + state.tablespaces = NIL; + state.tablespace_num = 0; + state.bytes_done = 0; + state.bytes_total = 0; + state.bytes_total_is_valid = false; /* we're going to use a BufFile, so we need a ResourceOwner */ Assert(CurrentResourceOwner == NULL); CurrentResourceOwner = ResourceOwnerCreate(NULL, "base backup"); - datadirpathlen = strlen(DataDir); - backup_started_in_recovery = RecoveryInProgress(); labelfile = makeStringInfo(); @@ -295,41 +254,28 @@ perform_base_backup(basebackup_options *opt) total_checksum_failures = 0; - pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, - PROGRESS_BASEBACKUP_PHASE_WAIT_CHECKPOINT); - startptr = do_pg_start_backup(opt->label, opt->fastcheckpoint, &starttli, - labelfile, &tablespaces, - tblspc_map_file); + basebackup_progress_wait_checkpoint(); + 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)); { ListCell *lc; tablespaceinfo *ti; - int tblspc_streamed = 0; - - /* - * 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; - tablespaces = lappend(tablespaces, ti); + state.tablespaces = lappend(state.tablespaces, ti); /* * Calculate the total backup size by summing up the size of each @@ -337,100 +283,53 @@ perform_base_backup(basebackup_options *opt) */ if (opt->progress) { - pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, - PROGRESS_BASEBACKUP_PHASE_ESTIMATE_BACKUP_SIZE); + basebackup_progress_estimate_backup_size(); - foreach(lc, tablespaces) + foreach(lc, state.tablespaces) { tablespaceinfo *tmp = (tablespaceinfo *) lfirst(lc); if (tmp->path == NULL) - tmp->size = sendDir(".", 1, true, tablespaces, true, NULL, - NULL); + tmp->size = sendDir(sink, ".", 1, true, state.tablespaces, + true, NULL, NULL); else - tmp->size = sendTablespace(tmp->path, tmp->oid, true, + tmp->size = sendTablespace(sink, tmp->path, tmp->oid, true, NULL); - backup_total += tmp->size; + state.bytes_total += tmp->size; } + state.bytes_total_is_valid = true; } - /* Report that we are now streaming database files as a base backup */ - { - const int index[] = { - PROGRESS_BASEBACKUP_PHASE, - PROGRESS_BASEBACKUP_BACKUP_TOTAL, - PROGRESS_BASEBACKUP_TBLSPC_TOTAL - }; - const int64 val[] = { - PROGRESS_BASEBACKUP_PHASE_STREAM_BACKUP, - backup_total, list_length(tablespaces) - }; - - pgstat_progress_update_multi_param(3, index, val); - } - - /* Send the starting position of the backup */ - SendXlogRecPtrResult(startptr, starttli); - - /* Send tablespace header */ - SendBackupHeader(tablespaces); - - /* Setup and activate network throttling, if client requested it */ - if (opt->maxrate > 0) - { - throttling_sample = - (int64) opt->maxrate * (int64) 1024 / THROTTLING_FREQUENCY; - - /* - * The minimum amount of time for throttling_sample bytes to be - * transferred. - */ - elapsed_min_unit = USECS_PER_SEC / THROTTLING_FREQUENCY; - - /* Enable throttling. */ - throttling_counter = 0; - - /* The 'real data' starts now (header was ignored). */ - throttled_last = GetCurrentTimestamp(); - } - else - { - /* Disable throttling. */ - throttling_counter = -1; - } + /* notify basebackup sink about start of backup */ + bbsink_begin_backup(sink, &state, SINK_BUFFER_LENGTH); /* Send off our tablespaces one by one */ - foreach(lc, tablespaces) + foreach(lc, state.tablespaces) { tablespaceinfo *ti = (tablespaceinfo *) lfirst(lc); - StringInfoData buf; - - /* Send CopyOutResponse message */ - pq_beginmessage(&buf, 'H'); - pq_sendbyte(&buf, 0); /* overall format */ - pq_sendint16(&buf, 0); /* natts */ - pq_endmessage(&buf); if (ti->path == NULL) { struct stat statbuf; bool sendtblspclinks = true; + bbsink_begin_archive(sink, "base.tar"); + /* In the main tar, include the backup_label first... */ - sendFileWithContent(BACKUP_LABEL_FILE, labelfile->data, + sendFileWithContent(sink, BACKUP_LABEL_FILE, labelfile->data, &manifest); /* Then the tablespace_map file, if required... */ if (opt->sendtblspcmapfile) { - sendFileWithContent(TABLESPACE_MAP, tblspc_map_file->data, + sendFileWithContent(sink, TABLESPACE_MAP, tblspc_map_file->data, &manifest); sendtblspclinks = false; } /* Then the bulk of the files... */ - sendDir(".", 1, false, tablespaces, sendtblspclinks, - &manifest, NULL); + sendDir(sink, ".", 1, false, state.tablespaces, + sendtblspclinks, &manifest, NULL); /* ... and pg_control after everything else. */ if (lstat(XLOG_CONTROL_FILE, &statbuf) != 0) @@ -438,33 +337,43 @@ perform_base_backup(basebackup_options *opt) (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", XLOG_CONTROL_FILE))); - sendFile(XLOG_CONTROL_FILE, XLOG_CONTROL_FILE, &statbuf, + sendFile(sink, XLOG_CONTROL_FILE, XLOG_CONTROL_FILE, &statbuf, false, InvalidOid, &manifest, NULL); } else - sendTablespace(ti->path, ti->oid, false, &manifest); + { + char *archive_name = psprintf("%s.tar", ti->oid); + + bbsink_begin_archive(sink, archive_name); + + sendTablespace(sink, ti->path, ti->oid, false, &manifest); + } /* * If we're including WAL, and this is the main data directory we - * don't terminate the tar stream here. Instead, we will append - * the xlog files below and terminate it then. This is safe since - * the main data directory is always sent *last*. + * don't treat this as the end of the tablespace. Instead, we will + * include the xlog files below and stop afterwards. This is safe + * since the main data directory is always sent *last*. */ if (opt->includewal && ti->path == NULL) { - Assert(lnext(tablespaces, lc) == NULL); + Assert(lnext(state.tablespaces, lc) == NULL); } else - pq_putemptymessage('c'); /* CopyDone */ - - tblspc_streamed++; - pgstat_progress_update_param(PROGRESS_BASEBACKUP_TBLSPC_STREAMED, - tblspc_streamed); + { + /* Properly terminate the tarfile. */ + StaticAssertStmt(2 * TAR_BLOCK_SIZE <= BLCKSZ, + "BLCKSZ too small for 2 tar blocks"); + memset(sink->bbs_buffer, 0, 2 * TAR_BLOCK_SIZE); + bbsink_archive_contents(sink, 2 * TAR_BLOCK_SIZE); + + /* OK, that's the end of the archive. */ + bbsink_end_archive(sink); + } } - pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, - PROGRESS_BASEBACKUP_PHASE_WAIT_WAL_ARCHIVE); - endptr = do_pg_stop_backup(labelfile->data, !opt->nowait, &endtli); + basebackup_progress_wait_wal_archive(&state); + endptr = do_pg_backup_stop(labelfile->data, !opt->nowait, &endtli); } PG_END_ENSURE_ERROR_CLEANUP(do_pg_abort_backup, BoolGetDatum(false)); @@ -489,8 +398,7 @@ perform_base_backup(basebackup_options *opt) ListCell *lc; TimeLineID tli; - pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, - PROGRESS_BASEBACKUP_PHASE_TRANSFER_WAL); + basebackup_progress_transfer_wal(); /* * I'd rather not worry about timelines here, so scan pg_wal and @@ -501,10 +409,10 @@ perform_base_backup(basebackup_options *opt) * shouldn't be such files, but if there are, there's little harm in * including them. */ - XLByteToSeg(startptr, startsegno, wal_segment_size); - XLogFileName(firstoff, ThisTimeLineID, startsegno, wal_segment_size); + XLByteToSeg(state.startptr, startsegno, wal_segment_size); + XLogFileName(firstoff, state.starttli, startsegno, wal_segment_size); XLByteToPrevSeg(endptr, endsegno, wal_segment_size); - XLogFileName(lastoff, ThisTimeLineID, endsegno, wal_segment_size); + XLogFileName(lastoff, endtli, endsegno, wal_segment_size); dir = AllocateDir("pg_wal"); while ((de = ReadDir(dir, "pg_wal")) != NULL) @@ -528,7 +436,7 @@ perform_base_backup(basebackup_options *opt) * Before we go any further, check that none of the WAL segments we * need were removed. */ - CheckXLogRemoved(startsegno, ThisTimeLineID); + CheckXLogRemoved(startsegno, state.starttli); /* * Sort the WAL filenames. We want to send the files in order from @@ -555,7 +463,7 @@ perform_base_backup(basebackup_options *opt) { char startfname[MAXFNAMELEN]; - XLogFileName(startfname, ThisTimeLineID, startsegno, + XLogFileName(startfname, state.starttli, startsegno, wal_segment_size); ereport(ERROR, (errmsg("could not find WAL file \"%s\"", startfname))); @@ -571,8 +479,7 @@ perform_base_backup(basebackup_options *opt) { char nextfname[MAXFNAMELEN]; - XLogFileName(nextfname, ThisTimeLineID, nextsegno, - wal_segment_size); + XLogFileName(nextfname, tli, nextsegno, wal_segment_size); ereport(ERROR, (errmsg("could not find WAL file \"%s\"", nextfname))); } @@ -581,7 +488,7 @@ perform_base_backup(basebackup_options *opt) { char endfname[MAXFNAMELEN]; - XLogFileName(endfname, ThisTimeLineID, endsegno, wal_segment_size); + XLogFileName(endfname, endtli, endsegno, wal_segment_size); ereport(ERROR, (errmsg("could not find WAL file \"%s\"", endfname))); } @@ -591,7 +498,6 @@ perform_base_backup(basebackup_options *opt) { char *walFileName = (char *) lfirst(lc); int fd; - char buf[TAR_SEND_SIZE]; size_t cnt; pgoff_t len = 0; @@ -630,22 +536,17 @@ perform_base_backup(basebackup_options *opt) } /* send the WAL file itself */ - _tarWriteHeader(pathbuf, NULL, &statbuf, false); + _tarWriteHeader(sink, pathbuf, NULL, &statbuf, false); - while ((cnt = basebackup_read_file(fd, buf, - Min(sizeof(buf), + while ((cnt = basebackup_read_file(fd, sink->bbs_buffer, + Min(sink->bbs_buffer_length, wal_segment_size - len), len, pathbuf, true)) > 0) { CheckXLogRemoved(segno, tli); - /* Send the chunk as a CopyData message */ - if (pq_putmessage('d', buf, cnt)) - ereport(ERROR, - (errmsg("base backup could not send data, aborting backup"))); - update_basebackup_progress(cnt); + bbsink_archive_contents(sink, cnt); len += cnt; - throttle(cnt); if (len == wal_segment_size) break; @@ -674,7 +575,7 @@ perform_base_backup(basebackup_options *opt) * complete segment. */ StatusFilePath(pathbuf, walFileName, ".done"); - sendFileWithContent(pathbuf, "", &manifest); + sendFileWithContent(sink, pathbuf, "", &manifest); } /* @@ -697,23 +598,30 @@ perform_base_backup(basebackup_options *opt) (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", pathbuf))); - sendFile(pathbuf, pathbuf, &statbuf, false, InvalidOid, + sendFile(sink, pathbuf, pathbuf, &statbuf, false, InvalidOid, &manifest, NULL); /* unconditionally mark file as archived */ StatusFilePath(pathbuf, fname, ".done"); - sendFileWithContent(pathbuf, "", &manifest); + sendFileWithContent(sink, pathbuf, "", &manifest); } - /* Send CopyDone message for the last tar file */ - pq_putemptymessage('c'); + /* Properly terminate the tar file. */ + StaticAssertStmt(2 * TAR_BLOCK_SIZE <= BLCKSZ, + "BLCKSZ too small for 2 tar blocks"); + memset(sink->bbs_buffer, 0, 2 * TAR_BLOCK_SIZE); + bbsink_archive_contents(sink, 2 * TAR_BLOCK_SIZE); + + /* OK, that's the end of the archive. */ + bbsink_end_archive(sink); } - AddWALInfoToBackupManifest(&manifest, startptr, starttli, endptr, endtli); + AddWALInfoToBackupManifest(&manifest, state.startptr, state.starttli, + endptr, endtli); - SendBackupManifest(&manifest); + SendBackupManifest(&manifest, sink); - SendXlogRecPtrResult(endptr, endtli); + bbsink_end_backup(sink, endptr, endtli); if (total_checksum_failures) { @@ -739,7 +647,7 @@ perform_base_backup(basebackup_options *opt) /* clean up the resource owner we created */ WalSndResourceCleanup(true); - pgstat_progress_end_command(); + basebackup_progress_done(); } /* @@ -764,7 +672,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) ListCell *lopt; bool o_label = false; bool o_progress = false; - bool o_fast = false; + bool o_checkpoint = false; bool o_nowait = false; bool o_wal = false; bool o_maxrate = false; @@ -772,10 +680,19 @@ parse_basebackup_options(List *options, basebackup_options *opt) bool o_noverify_checksums = false; bool o_manifest = false; bool o_manifest_checksums = false; + bool o_target = false; + bool o_target_detail = false; + char *target_str = NULL; + char *target_detail_str = NULL; + bool o_compression = 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 = PG_COMPRESSION_NONE; + opt->compression_specification.algorithm = PG_COMPRESSION_NONE; foreach(lopt, options) { @@ -787,7 +704,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->label = strVal(defel->arg); + opt->label = defGetString(defel); o_label = true; } else if (strcmp(defel->defname, "progress") == 0) @@ -796,25 +713,35 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->progress = true; + opt->progress = defGetBoolean(defel); o_progress = true; } - else if (strcmp(defel->defname, "fast") == 0) + else if (strcmp(defel->defname, "checkpoint") == 0) { - if (o_fast) + char *optval = defGetString(defel); + + if (o_checkpoint) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->fastcheckpoint = true; - o_fast = true; + if (pg_strcasecmp(optval, "fast") == 0) + opt->fastcheckpoint = true; + else if (pg_strcasecmp(optval, "spread") == 0) + opt->fastcheckpoint = false; + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized checkpoint type: \"%s\"", + optval))); + o_checkpoint = true; } - else if (strcmp(defel->defname, "nowait") == 0) + else if (strcmp(defel->defname, "wait") == 0) { if (o_nowait) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->nowait = true; + opt->nowait = !defGetBoolean(defel); o_nowait = true; } else if (strcmp(defel->defname, "wal") == 0) @@ -823,19 +750,19 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->includewal = true; + opt->includewal = defGetBoolean(defel); o_wal = true; } else if (strcmp(defel->defname, "max_rate") == 0) { - long maxrate; + int64 maxrate; if (o_maxrate) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - maxrate = intVal(defel->arg); + maxrate = defGetInt64(defel); if (maxrate < MAX_RATE_LOWER || maxrate > MAX_RATE_UPPER) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), @@ -851,21 +778,21 @@ parse_basebackup_options(List *options, basebackup_options *opt) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - opt->sendtblspcmapfile = true; + opt->sendtblspcmapfile = defGetBoolean(defel); o_tablespace_map = true; } - else if (strcmp(defel->defname, "noverify_checksums") == 0) + else if (strcmp(defel->defname, "verify_checksums") == 0) { if (o_noverify_checksums) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("duplicate option \"%s\"", defel->defname))); - noverify_checksums = true; + noverify_checksums = !defGetBoolean(defel); o_noverify_checksums = true; } else if (strcmp(defel->defname, "manifest") == 0) { - char *optval = strVal(defel->arg); + char *optval = defGetString(defel); bool manifest_bool; if (o_manifest) @@ -890,7 +817,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) } else if (strcmp(defel->defname, "manifest_checksums") == 0) { - char *optval = strVal(defel->arg); + char *optval = defGetString(defel); if (o_manifest_checksums) ereport(ERROR, @@ -904,10 +831,57 @@ parse_basebackup_options(List *options, basebackup_options *opt) optval))); o_manifest_checksums = true; } + else if (strcmp(defel->defname, "target") == 0) + { + if (o_target) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate option \"%s\"", defel->defname))); + target_str = defGetString(defel); + o_target = true; + } + else if (strcmp(defel->defname, "target_detail") == 0) + { + char *optval = defGetString(defel); + + if (o_target_detail) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate option \"%s\"", defel->defname))); + target_detail_str = optval; + o_target_detail = true; + } + else if (strcmp(defel->defname, "compression") == 0) + { + char *optval = defGetString(defel); + + if (o_compression) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate option \"%s\"", defel->defname))); + if (!parse_compress_algorithm(optval, &opt->compression)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized compression algorithm: \"%s\"", + optval))); + o_compression = true; + } + else if (strcmp(defel->defname, "compression_detail") == 0) + { + if (o_compression_detail) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate option \"%s\"", defel->defname))); + compression_detail_str = defGetString(defel); + o_compression_detail = true; + } else - elog(ERROR, "option \"%s\" not recognized", - defel->defname); + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized base backup option: \"%s\"", + defel->defname))); } + if (opt->label == NULL) opt->label = "base backup"; if (opt->manifest == MANIFEST_OPTION_NO) @@ -918,13 +892,55 @@ parse_basebackup_options(List *options, basebackup_options *opt) errmsg("manifest checksums require a backup manifest"))); opt->manifest_checksum_type = CHECKSUM_TYPE_NONE; } + + if (target_str == NULL) + { + if (target_detail_str != NULL) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("target detail cannot be used without target"))); + opt->use_copytblspc = true; + opt->send_to_client = true; + } + else if (strcmp(target_str, "client") == 0) + { + 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_detail && !o_compression) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("compression detail cannot be specified unless compression is enabled"))); + + if (o_compression) + { + char *error_detail; + + parse_compress_specification(opt->compression, compression_detail_str, + &opt->compression_specification); + error_detail = + validate_compress_specification(&opt->compression_specification); + if (error_detail != NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid compression specification: %s", + error_detail)); + } } /* * 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. */ @@ -932,9 +948,10 @@ void SendBaseBackup(BaseBackupCmd *cmd) { basebackup_options opt; + bbsink *sink; SessionBackupState status = get_backup_status(); - 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"))); @@ -952,158 +969,55 @@ SendBaseBackup(BaseBackupCmd *cmd) set_ps_display(activitymsg); } - perform_base_backup(&opt); -} - -static void -send_int8_string(StringInfoData *buf, int64 intval) -{ - char is[32]; - - sprintf(is, INT64_FORMAT, intval); - pq_sendint32(buf, strlen(is)); - pq_sendbytes(buf, is, strlen(is)); -} - -static void -SendBackupHeader(List *tablespaces) -{ - StringInfoData buf; - ListCell *lc; - - /* Construct and send the directory information */ - pq_beginmessage(&buf, 'T'); /* RowDescription */ - pq_sendint16(&buf, 3); /* 3 fields */ - - /* First field - spcoid */ - pq_sendstring(&buf, "spcoid"); - pq_sendint32(&buf, 0); /* table oid */ - pq_sendint16(&buf, 0); /* attnum */ - pq_sendint32(&buf, OIDOID); /* type oid */ - pq_sendint16(&buf, 4); /* typlen */ - pq_sendint32(&buf, 0); /* typmod */ - pq_sendint16(&buf, 0); /* format code */ - - /* Second field - spclocation */ - pq_sendstring(&buf, "spclocation"); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - pq_sendint32(&buf, TEXTOID); - pq_sendint16(&buf, -1); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - - /* Third field - size */ - pq_sendstring(&buf, "size"); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - pq_sendint32(&buf, INT8OID); - pq_sendint16(&buf, 8); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - pq_endmessage(&buf); - - foreach(lc, tablespaces) - { - tablespaceinfo *ti = lfirst(lc); - - /* Send one datarow message */ - pq_beginmessage(&buf, 'D'); - pq_sendint16(&buf, 3); /* number of columns */ - if (ti->path == NULL) - { - pq_sendint32(&buf, -1); /* Length = -1 ==> NULL */ - pq_sendint32(&buf, -1); - } - else - { - Size len; - - len = strlen(ti->oid); - pq_sendint32(&buf, len); - pq_sendbytes(&buf, ti->oid, len); - - len = strlen(ti->path); - pq_sendint32(&buf, len); - pq_sendbytes(&buf, ti->path, len); - } - if (ti->size >= 0) - send_int8_string(&buf, ti->size / 1024); - else - pq_sendint32(&buf, -1); /* NULL */ - - pq_endmessage(&buf); - } - - /* Send a CommandComplete message */ - pq_puttextmessage('C', "SELECT"); -} - -/* - * Send a single resultset containing just a single - * XLogRecPtr record (in text format) - */ -static void -SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli) -{ - StringInfoData buf; - char str[MAXFNAMELEN]; - Size len; - - pq_beginmessage(&buf, 'T'); /* RowDescription */ - pq_sendint16(&buf, 2); /* 2 fields */ - - /* Field headers */ - pq_sendstring(&buf, "recptr"); - pq_sendint32(&buf, 0); /* table oid */ - pq_sendint16(&buf, 0); /* attnum */ - pq_sendint32(&buf, TEXTOID); /* type oid */ - pq_sendint16(&buf, -1); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - - pq_sendstring(&buf, "tli"); - pq_sendint32(&buf, 0); /* table oid */ - pq_sendint16(&buf, 0); /* attnum */ - /* - * int8 may seem like a surprising data type for this, but in theory int4 - * would not be wide enough for this, as TimeLineID is unsigned. + * 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. */ - pq_sendint32(&buf, INT8OID); /* type oid */ - pq_sendint16(&buf, -1); - pq_sendint32(&buf, 0); - pq_sendint16(&buf, 0); - pq_endmessage(&buf); + sink = bbsink_copystream_new(opt.send_to_client); + if (opt.target_handle != NULL) + sink = BaseBackupGetSink(opt.target_handle, sink); - /* Data row */ - pq_beginmessage(&buf, 'D'); - pq_sendint16(&buf, 2); /* number of columns */ + /* Set up network throttling, if client requested it */ + if (opt.maxrate > 0) + sink = bbsink_throttle_new(sink, opt.maxrate); - len = snprintf(str, sizeof(str), - "%X/%X", LSN_FORMAT_ARGS(ptr)); - pq_sendint32(&buf, len); - pq_sendbytes(&buf, str, len); + /* Set up server-side compression, if client requested it */ + if (opt.compression == PG_COMPRESSION_GZIP) + sink = bbsink_gzip_new(sink, &opt.compression_specification); + else if (opt.compression == PG_COMPRESSION_LZ4) + sink = bbsink_lz4_new(sink, &opt.compression_specification); + else if (opt.compression == PG_COMPRESSION_ZSTD) + sink = bbsink_zstd_new(sink, &opt.compression_specification); - len = snprintf(str, sizeof(str), "%u", tli); - pq_sendint32(&buf, len); - pq_sendbytes(&buf, str, len); + /* Set up progress reporting. */ + sink = bbsink_progress_new(sink, opt.progress); - pq_endmessage(&buf); - - /* Send a CommandComplete message */ - pq_puttextmessage('C', "SELECT"); + /* + * Perform the base backup, but make sure we clean up the bbsink even if + * an error occurs. + */ + PG_TRY(); + { + perform_base_backup(&opt, sink); + } + PG_FINALLY(); + { + bbsink_cleanup(sink); + } + PG_END_TRY(); } /* * Inject a file with given name and content in the output tar stream. */ static void -sendFileWithContent(const char *filename, const char *content, +sendFileWithContent(bbsink *sink, const char *filename, const char *content, backup_manifest_info *manifest) { struct stat statbuf; - int pad, + int bytes_done = 0, len; pg_checksum_context checksum_ctx; @@ -1129,25 +1043,24 @@ sendFileWithContent(const char *filename, const char *content, statbuf.st_mode = pg_file_create_mode; statbuf.st_size = len; - _tarWriteHeader(filename, NULL, &statbuf, false); - /* Send the contents as a CopyData message */ - pq_putmessage('d', content, len); - update_basebackup_progress(len); + _tarWriteHeader(sink, filename, NULL, &statbuf, false); - /* Pad to a multiple of the tar block size. */ - pad = tarPaddingBytesRequired(len); - if (pad > 0) + if (pg_checksum_update(&checksum_ctx, (uint8 *) content, len) < 0) + elog(ERROR, "could not update checksum of file \"%s\"", + filename); + + while (bytes_done < len) { - char buf[TAR_BLOCK_SIZE]; + size_t remaining = len - bytes_done; + size_t nbytes = Min(sink->bbs_buffer_length, remaining); - MemSet(buf, 0, pad); - pq_putmessage('d', buf, pad); - update_basebackup_progress(pad); + memcpy(sink->bbs_buffer, content, nbytes); + bbsink_archive_contents(sink, nbytes); + bytes_done += nbytes; + content += nbytes; } - if (pg_checksum_update(&checksum_ctx, (uint8 *) content, len) < 0) - elog(ERROR, "could not update checksum of file \"%s\"", - filename); + _tarWritePadding(sink, len); AddFileToBackupManifest(manifest, NULL, filename, len, (pg_time_t) statbuf.st_mtime, &checksum_ctx); @@ -1161,7 +1074,7 @@ sendFileWithContent(const char *filename, const char *content, * Only used to send auxiliary tablespaces, not PGDATA. */ static int64 -sendTablespace(char *path, char *spcoid, bool sizeonly, +sendTablespace(bbsink *sink, char *path, char *spcoid, bool sizeonly, backup_manifest_info *manifest) { int64 size; @@ -1191,11 +1104,11 @@ sendTablespace(char *path, char *spcoid, bool sizeonly, return 0; } - size = _tarWriteHeader(TABLESPACE_VERSION_DIRECTORY, NULL, &statbuf, + size = _tarWriteHeader(sink, TABLESPACE_VERSION_DIRECTORY, NULL, &statbuf, sizeonly); /* Send all the files in the tablespace version directory */ - size += sendDir(pathbuf, strlen(path), sizeonly, NIL, true, manifest, + size += sendDir(sink, pathbuf, strlen(path), sizeonly, NIL, true, manifest, spcoid); return size; @@ -1214,8 +1127,8 @@ sendTablespace(char *path, char *spcoid, bool sizeonly, * as it will be sent separately in the tablespace_map file. */ static int64 -sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, - bool sendtblspclinks, backup_manifest_info *manifest, +sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, + List *tablespaces, bool sendtblspclinks, backup_manifest_info *manifest, const char *spcoid) { DIR *dir; @@ -1277,7 +1190,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, * 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(); @@ -1374,7 +1287,9 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, if (strcmp(de->d_name, excludeDirContents[excludeIdx]) == 0) { elog(DEBUG1, "contents of directory \"%s\" excluded from backup", de->d_name); - size += _tarWriteDir(pathbuf, basepathlen, &statbuf, sizeonly); + convert_link_to_directory(pathbuf, &statbuf); + size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, NULL, + &statbuf, sizeonly); excludeFound = true; break; } @@ -1383,17 +1298,6 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, 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); - size += _tarWriteDir(pathbuf, basepathlen, &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 @@ -1402,14 +1306,16 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, if (strcmp(pathbuf, "./pg_wal") == 0) { /* If pg_wal is a symlink, write it as a directory anyway */ - size += _tarWriteDir(pathbuf, basepathlen, &statbuf, sizeonly); + convert_link_to_directory(pathbuf, &statbuf); + size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, NULL, + &statbuf, sizeonly); /* * Also send archive_status directory (by hackishly reusing * statbuf from above ...). */ - size += _tarWriteHeader("./pg_wal/archive_status", NULL, &statbuf, - sizeonly); + size += _tarWriteHeader(sink, "./pg_wal/archive_status", NULL, + &statbuf, sizeonly); continue; /* don't recurse into pg_wal */ } @@ -1440,7 +1346,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, pathbuf))); linkpath[rllen] = '\0'; - size += _tarWriteHeader(pathbuf + basepathlen + 1, linkpath, + size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, linkpath, &statbuf, sizeonly); #else @@ -1464,7 +1370,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, * Store a directory entry in the tar file so we can get the * permissions right. */ - size += _tarWriteHeader(pathbuf + basepathlen + 1, NULL, &statbuf, + size += _tarWriteHeader(sink, pathbuf + basepathlen + 1, NULL, &statbuf, sizeonly); /* @@ -1496,7 +1402,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, skip_this_dir = true; if (!skip_this_dir) - size += sendDir(pathbuf, basepathlen, sizeonly, tablespaces, + size += sendDir(sink, pathbuf, basepathlen, sizeonly, tablespaces, sendtblspclinks, manifest, spcoid); } else if (S_ISREG(statbuf.st_mode)) @@ -1504,7 +1410,7 @@ sendDir(const char *path, int basepathlen, bool sizeonly, List *tablespaces, bool sent = false; if (!sizeonly) - sent = sendFile(pathbuf, pathbuf + basepathlen + 1, &statbuf, + sent = sendFile(sink, pathbuf, pathbuf + basepathlen + 1, &statbuf, true, isDbDir ? atooid(lastDir + 1) : InvalidOid, manifest, spcoid); @@ -1574,28 +1480,26 @@ 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. */ static bool -sendFile(const char *readfilename, const char *tarfilename, +sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, struct stat *statbuf, bool missing_ok, Oid dboid, backup_manifest_info *manifest, const char *spcoid) { int fd; BlockNumber blkno = 0; bool block_retry = false; - char buf[TAR_SEND_SIZE]; uint16 checksum; int checksum_failures = 0; off_t cnt; int i; pgoff_t len = 0; char *page; - size_t pad; PageHeader phdr; int segmentno = 0; char *segmentpath; @@ -1616,7 +1520,7 @@ sendFile(const char *readfilename, const char *tarfilename, errmsg("could not open file \"%s\": %m", readfilename))); } - _tarWriteHeader(tarfilename, NULL, statbuf, false); + _tarWriteHeader(sink, tarfilename, NULL, statbuf, false); if (!noverify_checksums && DataChecksumsEnabled()) { @@ -1657,26 +1561,20 @@ sendFile(const char *readfilename, const char *tarfilename, */ while (len < statbuf->st_size) { + size_t remaining = statbuf->st_size - len; + /* Try to read some more data. */ - cnt = basebackup_read_file(fd, buf, - Min(sizeof(buf), statbuf->st_size - len), + cnt = basebackup_read_file(fd, sink->bbs_buffer, + Min(sink->bbs_buffer_length, remaining), len, readfilename, true); - /* - * If we hit end-of-file, a concurrent truncation must have occurred. - * That's not an error condition, because WAL replay will fix things - * up. - */ - if (cnt == 0) - break; - /* * The checksums are verified at block level, so we iterate over the * buffer in chunks of BLCKSZ, after making sure that * TAR_SEND_SIZE/buf is divisible by BLCKSZ and we read a multiple of * BLCKSZ bytes. */ - Assert(TAR_SEND_SIZE % BLCKSZ == 0); + Assert((sink->bbs_buffer_length % BLCKSZ) == 0); if (verify_checksum && (cnt % BLCKSZ != 0)) { @@ -1692,7 +1590,7 @@ sendFile(const char *readfilename, const char *tarfilename, { for (i = 0; i < cnt / BLCKSZ; i++) { - page = buf + BLCKSZ * i; + page = sink->bbs_buffer + BLCKSZ * i; /* * Only check pages which have not been modified since the @@ -1702,7 +1600,7 @@ sendFile(const char *readfilename, const char *tarfilename, * this case. We also skip completely new pages, since they * don't have a checksum yet. */ - if (!PageIsNew(page) && PageGetLSN(page) < startptr) + if (!PageIsNew(page) && PageGetLSN(page) < sink->bbs_state->startptr) { checksum = pg_checksum_page((char *) page, blkno + segmentno * RELSEG_SIZE); phdr = (PageHeader) page; @@ -1724,7 +1622,8 @@ sendFile(const char *readfilename, const char *tarfilename, /* Reread the failed block */ reread_cnt = - basebackup_read_file(fd, buf + BLCKSZ * i, + basebackup_read_file(fd, + sink->bbs_buffer + BLCKSZ * i, BLCKSZ, len + BLCKSZ * i, readfilename, false); @@ -1771,34 +1670,38 @@ sendFile(const char *readfilename, const char *tarfilename, } } - /* Send the chunk as a CopyData message */ - if (pq_putmessage('d', buf, cnt)) - ereport(ERROR, - (errmsg("base backup could not send data, aborting backup"))); - update_basebackup_progress(cnt); + /* + * If we hit end-of-file, a concurrent truncation must have occurred. + * That's not an error condition, because WAL replay will fix things + * up. + */ + if (cnt == 0) + break; + + /* Archive the data we just read. */ + bbsink_archive_contents(sink, cnt); /* Also feed it to the checksum machinery. */ - if (pg_checksum_update(&checksum_ctx, (uint8 *) buf, cnt) < 0) + if (pg_checksum_update(&checksum_ctx, + (uint8 *) sink->bbs_buffer, cnt) < 0) elog(ERROR, "could not update checksum of base backup"); len += cnt; - throttle(cnt); } /* If the file was truncated while we were sending it, pad it with zeros */ - if (len < statbuf->st_size) + while (len < statbuf->st_size) { - MemSet(buf, 0, sizeof(buf)); - while (len < statbuf->st_size) - { - cnt = Min(sizeof(buf), statbuf->st_size - len); - pq_putmessage('d', buf, cnt); - if (pg_checksum_update(&checksum_ctx, (uint8 *) buf, cnt) < 0) - elog(ERROR, "could not update checksum of base backup"); - update_basebackup_progress(cnt); - len += cnt; - throttle(cnt); - } + size_t remaining = statbuf->st_size - len; + size_t nbytes = Min(sink->bbs_buffer_length, remaining); + + MemSet(sink->bbs_buffer, 0, nbytes); + if (pg_checksum_update(&checksum_ctx, + (uint8 *) sink->bbs_buffer, + nbytes) < 0) + elog(ERROR, "could not update checksum of base backup"); + bbsink_archive_contents(sink, nbytes); + len += nbytes; } /* @@ -1806,13 +1709,7 @@ sendFile(const char *readfilename, const char *tarfilename, * of data is probably not worth throttling, and is not checksummed * because it's not actually part of the file.) */ - pad = tarPaddingBytesRequired(len); - if (pad > 0) - { - MemSet(buf, 0, pad); - pq_putmessage('d', buf, pad); - update_basebackup_progress(pad); - } + _tarWritePadding(sink, len); CloseTransientFile(fd); @@ -1835,18 +1732,28 @@ sendFile(const char *readfilename, const char *tarfilename, return true; } - static int64 -_tarWriteHeader(const char *filename, const char *linktarget, +_tarWriteHeader(bbsink *sink, const char *filename, const char *linktarget, struct stat *statbuf, bool sizeonly) { - char h[TAR_BLOCK_SIZE]; enum tarError rc; if (!sizeonly) { - rc = tarCreateHeader(h, filename, linktarget, statbuf->st_size, - statbuf->st_mode, statbuf->st_uid, statbuf->st_gid, + /* + * As of this writing, the smallest supported block size is 1kB, which + * is twice TAR_BLOCK_SIZE. Since the buffer size is required to be a + * multiple of BLCKSZ, it should be safe to assume that the buffer is + * large enough to fit an entire tar block. We double-check by means + * of these assertions. + */ + StaticAssertStmt(TAR_BLOCK_SIZE <= BLCKSZ, + "BLCKSZ too small for tar block"); + Assert(sink->bbs_buffer_length >= TAR_BLOCK_SIZE); + + rc = tarCreateHeader(sink->bbs_buffer, filename, linktarget, + statbuf->st_size, statbuf->st_mode, + statbuf->st_uid, statbuf->st_gid, statbuf->st_mtime); switch (rc) @@ -1868,137 +1775,48 @@ _tarWriteHeader(const char *filename, const char *linktarget, elog(ERROR, "unrecognized tar error: %d", rc); } - pq_putmessage('d', h, sizeof(h)); - update_basebackup_progress(sizeof(h)); + bbsink_archive_contents(sink, TAR_BLOCK_SIZE); } - return sizeof(h); -} - -/* - * Write tar header for a directory. If the entry in statbuf is a link then - * write it as a directory anyway. - */ -static int64 -_tarWriteDir(const char *pathbuf, int basepathlen, struct stat *statbuf, - bool sizeonly) -{ - /* If symlink, write it as a directory anyway */ -#ifndef WIN32 - if (S_ISLNK(statbuf->st_mode)) -#else - if (pgwin32_is_junction(pathbuf)) -#endif - statbuf->st_mode = S_IFDIR | pg_dir_create_mode; - - return _tarWriteHeader(pathbuf + basepathlen + 1, NULL, statbuf, sizeonly); + return TAR_BLOCK_SIZE; } /* - * Increment the network transfer counter by the given number of bytes, - * and sleep if necessary to comply with the requested network transfer - * rate. + * Pad with zero bytes out to a multiple of TAR_BLOCK_SIZE. */ static void -throttle(size_t increment) +_tarWritePadding(bbsink *sink, int len) { - TimeOffset elapsed_min; - - if (throttling_counter < 0) - return; - - throttling_counter += increment; - if (throttling_counter < throttling_sample) - return; - - /* How much time should have elapsed at minimum? */ - elapsed_min = elapsed_min_unit * - (throttling_counter / throttling_sample); + int pad = tarPaddingBytesRequired(len); /* - * Since the latch could be set repeatedly because of concurrently WAL - * activity, sleep in a loop to ensure enough time has passed. + * As in _tarWriteHeader, it should be safe to assume that the buffer is + * large enough that we don't need to do this in multiple chunks. */ - for (;;) - { - TimeOffset elapsed, - sleep; - int wait_result; - - /* Time elapsed since the last measurement (and possible wake up). */ - elapsed = GetCurrentTimestamp() - throttled_last; - - /* sleep if the transfer is faster than it should be */ - sleep = elapsed_min - elapsed; - if (sleep <= 0) - break; + Assert(sink->bbs_buffer_length >= TAR_BLOCK_SIZE); + Assert(pad <= TAR_BLOCK_SIZE); - ResetLatch(MyLatch); - - /* We're eating a potentially set latch, so check for interrupts */ - CHECK_FOR_INTERRUPTS(); - - /* - * (TAR_SEND_SIZE / throttling_sample * elapsed_min_unit) should be - * the maximum time to sleep. Thus the cast to long is safe. - */ - wait_result = WaitLatch(MyLatch, - WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, - (long) (sleep / 1000), - WAIT_EVENT_BASE_BACKUP_THROTTLE); - - if (wait_result & WL_LATCH_SET) - CHECK_FOR_INTERRUPTS(); - - /* Done waiting? */ - if (wait_result & WL_TIMEOUT) - break; + if (pad > 0) + { + MemSet(sink->bbs_buffer, 0, pad); + bbsink_archive_contents(sink, pad); } - - /* - * As we work with integers, only whole multiple of throttling_sample was - * processed. The rest will be done during the next call of this function. - */ - throttling_counter %= throttling_sample; - - /* - * Time interval for the remaining amount and possible next increments - * starts now. - */ - throttled_last = GetCurrentTimestamp(); } /* - * Increment the counter for the amount of data already streamed - * by the given number of bytes, and update the progress report for - * pg_stat_progress_basebackup. + * If the entry in statbuf is a link, then adjust statbuf to make it look like a + * directory, so that it will be written that way. */ static void -update_basebackup_progress(int64 delta) +convert_link_to_directory(const char *pathbuf, struct stat *statbuf) { - const int index[] = { - PROGRESS_BASEBACKUP_BACKUP_STREAMED, - PROGRESS_BASEBACKUP_BACKUP_TOTAL - }; - int64 val[2]; - int nparam = 0; - - backup_streamed += delta; - val[nparam++] = backup_streamed; - - /* - * Avoid overflowing past 100% or the full size. This may make the total - * size number change as we approach the end of the backup (the estimate - * will always be wrong if WAL is included), but that's better than having - * the done column be bigger than the total. - */ - if (backup_total > -1 && backup_streamed > backup_total) - { - backup_total = backup_streamed; - val[nparam++] = backup_total; - } - - pgstat_progress_update_multi_param(nparam, index, val); + /* If symlink, write it as a directory anyway */ +#ifndef WIN32 + if (S_ISLNK(statbuf->st_mode)) +#else + if (pgwin32_is_junction(pathbuf)) +#endif + statbuf->st_mode = S_IFDIR | pg_dir_create_mode; } /* diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_copy.c b/third_party/spanner_pg/src/backend/backup/basebackup_copy.c new file mode 100644 index 00000000..62b518f2 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_copy.c @@ -0,0 +1,473 @@ +/*------------------------------------------------------------------------- + * + * basebackup_copy.c + * send basebackup archives using COPY OUT + * + * We send a result set with information about the tabelspaces to be included + * in the backup before starting COPY OUT. Then, we start a single COPY OUT + * operation and transmits all the archives and the manifest if present during + * the course of that single COPY OUT. Each CopyData message begins with a + * type byte, allowing us to signal the start of a new archive, or the + * manifest, by some means other than ending the COPY stream. This also allows + * for future protocol extensions, since we can include arbitrary information + * in the message stream as long as we're certain that the client will know + * what to do with it. + * + * An older method that sent each archive using a separate COPY OUT + * operation is no longer supported. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_copy.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "backup/basebackup.h" +#include "backup/basebackup_sink.h" +#include "catalog/pg_type_d.h" +#include "libpq/libpq.h" +#include "libpq/pqformat.h" +#include "utils/timestamp.h" + +typedef struct bbsink_copystream +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Are we sending the archives to the client, or somewhere else? */ + bool send_to_client; + + /* + * Protocol message buffer. We assemble CopyData protocol messages by + * setting the first character of this buffer to 'd' (archive or manifest + * data) and then making base.bbs_buffer point to the second character so + * that the rest of the data gets copied into the message just where we + * want it. + */ + char *msgbuffer; + + /* + * When did we last report progress to the client, and how much progress + * did we report? + */ + TimestampTz last_progress_report_time; + uint64 bytes_done_at_last_time_check; +} bbsink_copystream; + +/* + * We don't want to send progress messages to the client excessively + * frequently. Ideally, we'd like to send a message when the time since the + * last message reaches PROGRESS_REPORT_MILLISECOND_THRESHOLD, but checking + * the system time every time we send a tiny bit of data seems too expensive. + * So we only check it after the number of bytes sine the last check reaches + * PROGRESS_REPORT_BYTE_INTERVAL. + */ +#define PROGRESS_REPORT_BYTE_INTERVAL 65536 +#define PROGRESS_REPORT_MILLISECOND_THRESHOLD 1000 + +static void bbsink_copystream_begin_backup(bbsink *sink); +static void bbsink_copystream_begin_archive(bbsink *sink, + const char *archive_name); +static void bbsink_copystream_archive_contents(bbsink *sink, size_t len); +static void bbsink_copystream_end_archive(bbsink *sink); +static void bbsink_copystream_begin_manifest(bbsink *sink); +static void bbsink_copystream_manifest_contents(bbsink *sink, size_t len); +static void bbsink_copystream_end_manifest(bbsink *sink); +static void bbsink_copystream_end_backup(bbsink *sink, XLogRecPtr endptr, + TimeLineID endtli); +static void bbsink_copystream_cleanup(bbsink *sink); + +static void SendCopyOutResponse(void); +static void SendCopyDone(void); +static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli); +static void SendTablespaceList(List *tablespaces); +static void send_int8_string(StringInfoData *buf, int64 intval); + +static const bbsink_ops bbsink_copystream_ops = { + .begin_backup = bbsink_copystream_begin_backup, + .begin_archive = bbsink_copystream_begin_archive, + .archive_contents = bbsink_copystream_archive_contents, + .end_archive = bbsink_copystream_end_archive, + .begin_manifest = bbsink_copystream_begin_manifest, + .manifest_contents = bbsink_copystream_manifest_contents, + .end_manifest = bbsink_copystream_end_manifest, + .end_backup = bbsink_copystream_end_backup, + .cleanup = bbsink_copystream_cleanup +}; + +/* + * Create a new 'copystream' bbsink. + */ +bbsink * +bbsink_copystream_new(bool send_to_client) +{ + bbsink_copystream *sink = palloc0(sizeof(bbsink_copystream)); + + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_copystream_ops; + sink->send_to_client = send_to_client; + + /* Set up for periodic progress reporting. */ + sink->last_progress_report_time = GetCurrentTimestamp(); + sink->bytes_done_at_last_time_check = UINT64CONST(0); + + return &sink->base; +} + +/* + * Send start-of-backup wire protocol messages. + */ +static void +bbsink_copystream_begin_backup(bbsink *sink) +{ + bbsink_copystream *mysink = (bbsink_copystream *) sink; + bbsink_state *state = sink->bbs_state; + char *buf; + + /* + * Initialize buffer. We ultimately want to send the archive and manifest + * data by means of CopyData messages where the payload portion of each + * message begins with a type byte. However, basebackup.c expects the + * buffer to be aligned, so we can't just allocate one extra byte for the + * type byte. Instead, allocate enough extra bytes that the portion of the + * buffer we reveal to our callers can be aligned, while leaving room to + * slip the type byte in just beforehand. That will allow us to ship the + * data with a single call to pq_putmessage and without needing any extra + * copying. + */ + buf = palloc(mysink->base.bbs_buffer_length + MAXIMUM_ALIGNOF); + mysink->msgbuffer = buf + (MAXIMUM_ALIGNOF - 1); + mysink->base.bbs_buffer = buf + MAXIMUM_ALIGNOF; + mysink->msgbuffer[0] = 'd'; /* archive or manifest data */ + + /* Tell client the backup start location. */ + SendXlogRecPtrResult(state->startptr, state->starttli); + + /* Send client a list of tablespaces. */ + SendTablespaceList(state->tablespaces); + + /* Send a CommandComplete message */ + pq_puttextmessage('C', "SELECT"); + + /* Begin COPY stream. This will be used for all archives + manifest. */ + SendCopyOutResponse(); +} + +/* + * Send a CopyData message announcing the beginning of a new archive. + */ +static void +bbsink_copystream_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_state *state = sink->bbs_state; + tablespaceinfo *ti; + StringInfoData buf; + + ti = list_nth(state->tablespaces, state->tablespace_num); + pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_sendbyte(&buf, 'n'); /* New archive */ + pq_sendstring(&buf, archive_name); + pq_sendstring(&buf, ti->path == NULL ? "" : ti->path); + pq_endmessage(&buf); +} + +/* + * Send a CopyData message containing a chunk of archive content. + */ +static void +bbsink_copystream_archive_contents(bbsink *sink, size_t len) +{ + bbsink_copystream *mysink = (bbsink_copystream *) sink; + bbsink_state *state = mysink->base.bbs_state; + StringInfoData buf; + uint64 targetbytes; + + /* Send the archive content to the client, if appropriate. */ + if (mysink->send_to_client) + { + /* Add one because we're also sending a leading type byte. */ + pq_putmessage('d', mysink->msgbuffer, len + 1); + } + + /* Consider whether to send a progress report to the client. */ + targetbytes = mysink->bytes_done_at_last_time_check + + PROGRESS_REPORT_BYTE_INTERVAL; + if (targetbytes <= state->bytes_done) + { + TimestampTz now = GetCurrentTimestamp(); + long ms; + + /* + * OK, we've sent a decent number of bytes, so check the system time + * to see whether we're due to send a progress report. + */ + mysink->bytes_done_at_last_time_check = state->bytes_done; + ms = TimestampDifferenceMilliseconds(mysink->last_progress_report_time, + now); + + /* + * Send a progress report if enough time has passed. Also send one if + * the system clock was set backward, so that such occurrences don't + * have the effect of suppressing further progress messages. + */ + if (ms < 0 || ms >= PROGRESS_REPORT_MILLISECOND_THRESHOLD) + { + mysink->last_progress_report_time = now; + + pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_sendbyte(&buf, 'p'); /* Progress report */ + pq_sendint64(&buf, state->bytes_done); + pq_endmessage(&buf); + pq_flush_if_writable(); + } + } +} + +/* + * We don't need to explicitly signal the end of the archive; the client + * will figure out that we've reached the end when we begin the next one, + * or begin the manifest, or end the COPY stream. However, this seems like + * a good time to force out a progress report. One reason for that is that + * if this is the last archive, and we don't force a progress report now, + * the client will never be told that we sent all the bytes. + */ +static void +bbsink_copystream_end_archive(bbsink *sink) +{ + bbsink_copystream *mysink = (bbsink_copystream *) sink; + bbsink_state *state = mysink->base.bbs_state; + StringInfoData buf; + + mysink->bytes_done_at_last_time_check = state->bytes_done; + mysink->last_progress_report_time = GetCurrentTimestamp(); + pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_sendbyte(&buf, 'p'); /* Progress report */ + pq_sendint64(&buf, state->bytes_done); + pq_endmessage(&buf); + pq_flush_if_writable(); +} + +/* + * Send a CopyData message announcing the beginning of the backup manifest. + */ +static void +bbsink_copystream_begin_manifest(bbsink *sink) +{ + StringInfoData buf; + + pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_sendbyte(&buf, 'm'); /* Manifest */ + pq_endmessage(&buf); +} + +/* + * Each chunk of manifest data is sent using a CopyData message. + */ +static void +bbsink_copystream_manifest_contents(bbsink *sink, size_t len) +{ + bbsink_copystream *mysink = (bbsink_copystream *) sink; + + if (mysink->send_to_client) + { + /* Add one because we're also sending a leading type byte. */ + pq_putmessage('d', mysink->msgbuffer, len + 1); + } +} + +/* + * We don't need an explicit terminator for the backup manifest. + */ +static void +bbsink_copystream_end_manifest(bbsink *sink) +{ + /* Do nothing. */ +} + +/* + * Send end-of-backup wire protocol messages. + */ +static void +bbsink_copystream_end_backup(bbsink *sink, XLogRecPtr endptr, + TimeLineID endtli) +{ + SendCopyDone(); + SendXlogRecPtrResult(endptr, endtli); +} + +/* + * Cleanup. + */ +static void +bbsink_copystream_cleanup(bbsink *sink) +{ + /* Nothing to do. */ +} + +/* + * Send a CopyOutResponse message. + */ +static void +SendCopyOutResponse(void) +{ + StringInfoData buf; + + pq_beginmessage(&buf, 'H'); + pq_sendbyte(&buf, 0); /* overall format */ + pq_sendint16(&buf, 0); /* natts */ + pq_endmessage(&buf); +} + +/* + * Send a CopyDone message. + */ +static void +SendCopyDone(void) +{ + pq_putemptymessage('c'); +} + +/* + * Send a single resultset containing just a single + * XLogRecPtr record (in text format) + */ +static void +SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli) +{ + StringInfoData buf; + char str[MAXFNAMELEN]; + Size len; + + pq_beginmessage(&buf, 'T'); /* RowDescription */ + pq_sendint16(&buf, 2); /* 2 fields */ + + /* Field headers */ + pq_sendstring(&buf, "recptr"); + pq_sendint32(&buf, 0); /* table oid */ + pq_sendint16(&buf, 0); /* attnum */ + pq_sendint32(&buf, TEXTOID); /* type oid */ + pq_sendint16(&buf, -1); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + + pq_sendstring(&buf, "tli"); + pq_sendint32(&buf, 0); /* table oid */ + pq_sendint16(&buf, 0); /* attnum */ + + /* + * int8 may seem like a surprising data type for this, but in theory int4 + * would not be wide enough for this, as TimeLineID is unsigned. + */ + pq_sendint32(&buf, INT8OID); /* type oid */ + pq_sendint16(&buf, -1); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + pq_endmessage(&buf); + + /* Data row */ + pq_beginmessage(&buf, 'D'); + pq_sendint16(&buf, 2); /* number of columns */ + + len = snprintf(str, sizeof(str), + "%X/%X", LSN_FORMAT_ARGS(ptr)); + pq_sendint32(&buf, len); + pq_sendbytes(&buf, str, len); + + len = snprintf(str, sizeof(str), "%u", tli); + pq_sendint32(&buf, len); + pq_sendbytes(&buf, str, len); + + pq_endmessage(&buf); + + /* Send a CommandComplete message */ + pq_puttextmessage('C', "SELECT"); +} + +/* + * Send a result set via libpq describing the tablespace list. + */ +static void +SendTablespaceList(List *tablespaces) +{ + StringInfoData buf; + ListCell *lc; + + /* Construct and send the directory information */ + pq_beginmessage(&buf, 'T'); /* RowDescription */ + pq_sendint16(&buf, 3); /* 3 fields */ + + /* First field - spcoid */ + pq_sendstring(&buf, "spcoid"); + pq_sendint32(&buf, 0); /* table oid */ + pq_sendint16(&buf, 0); /* attnum */ + pq_sendint32(&buf, OIDOID); /* type oid */ + pq_sendint16(&buf, 4); /* typlen */ + pq_sendint32(&buf, 0); /* typmod */ + pq_sendint16(&buf, 0); /* format code */ + + /* Second field - spclocation */ + pq_sendstring(&buf, "spclocation"); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + pq_sendint32(&buf, TEXTOID); + pq_sendint16(&buf, -1); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + + /* Third field - size */ + pq_sendstring(&buf, "size"); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + pq_sendint32(&buf, INT8OID); + pq_sendint16(&buf, 8); + pq_sendint32(&buf, 0); + pq_sendint16(&buf, 0); + pq_endmessage(&buf); + + foreach(lc, tablespaces) + { + tablespaceinfo *ti = lfirst(lc); + + /* Send one datarow message */ + pq_beginmessage(&buf, 'D'); + pq_sendint16(&buf, 3); /* number of columns */ + if (ti->path == NULL) + { + pq_sendint32(&buf, -1); /* Length = -1 ==> NULL */ + pq_sendint32(&buf, -1); + } + else + { + Size len; + + len = strlen(ti->oid); + pq_sendint32(&buf, len); + pq_sendbytes(&buf, ti->oid, len); + + len = strlen(ti->path); + pq_sendint32(&buf, len); + pq_sendbytes(&buf, ti->path, len); + } + if (ti->size >= 0) + send_int8_string(&buf, ti->size / 1024); + else + pq_sendint32(&buf, -1); /* NULL */ + + pq_endmessage(&buf); + } +} + +/* + * Send a 64-bit integer as a string via the wire protocol. + */ +static void +send_int8_string(StringInfoData *buf, int64 intval) +{ + char is[32]; + + sprintf(is, INT64_FORMAT, intval); + pq_sendint32(buf, strlen(is)); + pq_sendbytes(buf, is, strlen(is)); +} diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_gzip.c b/third_party/spanner_pg/src/backend/backup/basebackup_gzip.c new file mode 100644 index 00000000..1ec42791 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_gzip.c @@ -0,0 +1,304 @@ +/*------------------------------------------------------------------------- + * + * basebackup_gzip.c + * Basebackup sink implementing gzip compression. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_gzip.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#ifdef HAVE_LIBZ +#include +#endif + +#include "backup/basebackup_sink.h" + +#ifdef HAVE_LIBZ +typedef struct bbsink_gzip +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Compression level. */ + int compresslevel; + + /* Compressed data stream. */ + z_stream zstream; + + /* Number of bytes staged in output buffer. */ + size_t bytes_written; +} bbsink_gzip; + +static void bbsink_gzip_begin_backup(bbsink *sink); +static void bbsink_gzip_begin_archive(bbsink *sink, const char *archive_name); +static void bbsink_gzip_archive_contents(bbsink *sink, size_t len); +static void bbsink_gzip_manifest_contents(bbsink *sink, size_t len); +static void bbsink_gzip_end_archive(bbsink *sink); +static void *gzip_palloc(void *opaque, unsigned items, unsigned size); +static void gzip_pfree(void *opaque, void *address); + +static const bbsink_ops bbsink_gzip_ops = { + .begin_backup = bbsink_gzip_begin_backup, + .begin_archive = bbsink_gzip_begin_archive, + .archive_contents = bbsink_gzip_archive_contents, + .end_archive = bbsink_gzip_end_archive, + .begin_manifest = bbsink_forward_begin_manifest, + .manifest_contents = bbsink_gzip_manifest_contents, + .end_manifest = bbsink_forward_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_forward_cleanup +}; +#endif + +/* + * Create a new basebackup sink that performs gzip compression. + */ +bbsink * +bbsink_gzip_new(bbsink *next, pg_compress_specification *compress) +{ +#ifndef HAVE_LIBZ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("gzip compression is not supported by this build"))); + return NULL; /* keep compiler quiet */ +#else + bbsink_gzip *sink; + int compresslevel; + + Assert(next != NULL); + + compresslevel = compress->level; + Assert((compresslevel >= 1 && compresslevel <= 9) || + compresslevel == Z_DEFAULT_COMPRESSION); + + sink = palloc0(sizeof(bbsink_gzip)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_gzip_ops; + sink->base.bbs_next = next; + sink->compresslevel = compresslevel; + + return &sink->base; +#endif +} + +#ifdef HAVE_LIBZ + +/* + * Begin backup. + */ +static void +bbsink_gzip_begin_backup(bbsink *sink) +{ + /* + * We need our own buffer, because we're going to pass different data to + * the next sink than what gets passed to us. + */ + sink->bbs_buffer = palloc(sink->bbs_buffer_length); + + /* + * Since deflate() doesn't require the output buffer to be of any + * particular size, we can just make it the same size as the input buffer. + */ + bbsink_begin_backup(sink->bbs_next, sink->bbs_state, + sink->bbs_buffer_length); +} + +/* + * Prepare to compress the next archive. + */ +static void +bbsink_gzip_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_gzip *mysink = (bbsink_gzip *) sink; + char *gz_archive_name; + z_stream *zs = &mysink->zstream; + + /* Initialize compressor object. */ + memset(zs, 0, sizeof(z_stream)); + zs->zalloc = gzip_palloc; + zs->zfree = gzip_pfree; + zs->next_out = (uint8 *) sink->bbs_next->bbs_buffer; + zs->avail_out = sink->bbs_next->bbs_buffer_length; + + /* + * We need to use deflateInit2() rather than deflateInit() here so that we + * can request a gzip header rather than a zlib header. Otherwise, we want + * to supply the same values that would have been used by default if we + * had just called deflateInit(). + * + * Per the documentation for deflateInit2, the third argument must be + * Z_DEFLATED; the fourth argument is the number of "window bits", by + * default 15, but adding 16 gets you a gzip header rather than a zlib + * header; the fifth argument controls memory usage, and 8 is the default; + * and likewise Z_DEFAULT_STRATEGY is the default for the sixth argument. + */ + if (deflateInit2(zs, mysink->compresslevel, Z_DEFLATED, 15 + 16, 8, + Z_DEFAULT_STRATEGY) != Z_OK) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not initialize compression library")); + + /* + * Add ".gz" to the archive name. Note that the pg_basebackup -z produces + * archives named ".tar.gz" rather than ".tgz", so we match that here. + */ + gz_archive_name = psprintf("%s.gz", archive_name); + Assert(sink->bbs_next != NULL); + bbsink_begin_archive(sink->bbs_next, gz_archive_name); + pfree(gz_archive_name); +} + +/* + * Compress the input data to the output buffer until we run out of input + * data. Each time the output buffer fills up, invoke the archive_contents() + * method for then 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_gzip_end_archive() is invoked. + */ +static void +bbsink_gzip_archive_contents(bbsink *sink, size_t len) +{ + bbsink_gzip *mysink = (bbsink_gzip *) sink; + z_stream *zs = &mysink->zstream; + + /* Compress data from input buffer. */ + zs->next_in = (uint8 *) mysink->base.bbs_buffer; + zs->avail_in = len; + + while (zs->avail_in > 0) + { + int res; + + /* Write output data into unused portion of output buffer. */ + Assert(mysink->bytes_written < mysink->base.bbs_next->bbs_buffer_length); + zs->next_out = (uint8 *) + mysink->base.bbs_next->bbs_buffer + mysink->bytes_written; + zs->avail_out = + mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written; + + /* + * Try to compress. Note that this will update zs->next_in and + * zs->avail_in according to how much input data was consumed, and + * zs->next_out and zs->avail_out according to how many output bytes + * were produced. + * + * According to the zlib documentation, Z_STREAM_ERROR should only + * occur if we've made a programming error, or if say there's been a + * memory clobber; we use elog() rather than Assert() here out of an + * abundance of caution. + */ + res = deflate(zs, Z_NO_FLUSH); + if (res == Z_STREAM_ERROR) + elog(ERROR, "could not compress data: %s", zs->msg); + + /* Update our notion of how many bytes we've written. */ + mysink->bytes_written = + mysink->base.bbs_next->bbs_buffer_length - zs->avail_out; + + /* + * If the output buffer is full, it's time for the next sink to + * process the contents. + */ + if (mysink->bytes_written >= mysink->base.bbs_next->bbs_buffer_length) + { + bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); + mysink->bytes_written = 0; + } + } +} + +/* + * There might be some data inside zlib's internal buffers; we need to get + * that flushed out and forwarded to the successor sink as archive content. + * + * Then we can end processing for this archive. + */ +static void +bbsink_gzip_end_archive(bbsink *sink) +{ + bbsink_gzip *mysink = (bbsink_gzip *) sink; + z_stream *zs = &mysink->zstream; + + /* There is no more data available. */ + zs->next_in = (uint8 *) mysink->base.bbs_buffer; + zs->avail_in = 0; + + while (1) + { + int res; + + /* Write output data into unused portion of output buffer. */ + Assert(mysink->bytes_written < mysink->base.bbs_next->bbs_buffer_length); + zs->next_out = (uint8 *) + mysink->base.bbs_next->bbs_buffer + mysink->bytes_written; + zs->avail_out = + mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written; + + /* + * As bbsink_gzip_archive_contents, but pass Z_FINISH since there is + * no more input. + */ + res = deflate(zs, Z_FINISH); + if (res == Z_STREAM_ERROR) + elog(ERROR, "could not compress data: %s", zs->msg); + + /* Update our notion of how many bytes we've written. */ + mysink->bytes_written = + mysink->base.bbs_next->bbs_buffer_length - zs->avail_out; + + /* + * Apparently we had no data in the output buffer and deflate() was + * not able to add any. We must be done. + */ + if (mysink->bytes_written == 0) + break; + + /* Send whatever accumulated output bytes we have. */ + bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); + mysink->bytes_written = 0; + } + + /* Must also pass on the information that this archive has ended. */ + bbsink_forward_end_archive(sink); +} + +/* + * 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_gzip_manifest_contents(bbsink *sink, size_t len) +{ + memcpy(sink->bbs_next->bbs_buffer, sink->bbs_buffer, len); + bbsink_manifest_contents(sink->bbs_next, len); +} + +/* + * Wrapper function to adjust the signature of palloc to match what libz + * expects. + */ +static void * +gzip_palloc(void *opaque, unsigned items, unsigned size) +{ + return palloc(items * size); +} + +/* + * Wrapper function to adjust the signature of pfree to match what libz + * expects. + */ +static void +gzip_pfree(void *opaque, void *address) +{ + pfree(address); +} + +#endif diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_lz4.c b/third_party/spanner_pg/src/backend/backup/basebackup_lz4.c new file mode 100644 index 00000000..986272ab --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_lz4.c @@ -0,0 +1,296 @@ +/*------------------------------------------------------------------------- + * + * basebackup_lz4.c + * Basebackup sink implementing lz4 compression. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_lz4.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#ifdef USE_LZ4 +#include +#endif + +#include "backup/basebackup_sink.h" + +#ifdef USE_LZ4 + +typedef struct bbsink_lz4 +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Compression level. */ + int compresslevel; + + LZ4F_compressionContext_t ctx; + LZ4F_preferences_t prefs; + + /* Number of bytes staged in output buffer. */ + size_t bytes_written; +} bbsink_lz4; + +static void bbsink_lz4_begin_backup(bbsink *sink); +static void bbsink_lz4_begin_archive(bbsink *sink, const char *archive_name); +static void bbsink_lz4_archive_contents(bbsink *sink, size_t avail_in); +static void bbsink_lz4_manifest_contents(bbsink *sink, size_t len); +static void bbsink_lz4_end_archive(bbsink *sink); +static void bbsink_lz4_cleanup(bbsink *sink); + +static const bbsink_ops bbsink_lz4_ops = { + .begin_backup = bbsink_lz4_begin_backup, + .begin_archive = bbsink_lz4_begin_archive, + .archive_contents = bbsink_lz4_archive_contents, + .end_archive = bbsink_lz4_end_archive, + .begin_manifest = bbsink_forward_begin_manifest, + .manifest_contents = bbsink_lz4_manifest_contents, + .end_manifest = bbsink_forward_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_lz4_cleanup +}; +#endif + +/* + * Create a new basebackup sink that performs lz4 compression. + */ +bbsink * +bbsink_lz4_new(bbsink *next, pg_compress_specification *compress) +{ +#ifndef USE_LZ4 + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("lz4 compression is not supported by this build"))); + return NULL; /* keep compiler quiet */ +#else + bbsink_lz4 *sink; + int compresslevel; + + Assert(next != NULL); + + compresslevel = compress->level; + Assert(compresslevel >= 0 && compresslevel <= 12); + + sink = palloc0(sizeof(bbsink_lz4)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_lz4_ops; + sink->base.bbs_next = next; + sink->compresslevel = compresslevel; + + return &sink->base; +#endif +} + +#ifdef USE_LZ4 + +/* + * Begin backup. + */ +static void +bbsink_lz4_begin_backup(bbsink *sink) +{ + bbsink_lz4 *mysink = (bbsink_lz4 *) sink; + size_t output_buffer_bound; + LZ4F_preferences_t *prefs = &mysink->prefs; + + /* Initialize compressor object. */ + memset(prefs, 0, sizeof(LZ4F_preferences_t)); + prefs->frameInfo.blockSizeID = LZ4F_max256KB; + prefs->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); + + /* + * Since LZ4F_compressUpdate() requires the output buffer of size equal or + * greater than that of LZ4F_compressBound(), make sure we have the next + * sink's bbs_buffer of length that can accommodate the compressed input + * buffer. + */ + output_buffer_bound = LZ4F_compressBound(mysink->base.bbs_buffer_length, + &mysink->prefs); + + /* + * 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_lz4_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_lz4 *mysink = (bbsink_lz4 *) sink; + char *lz4_archive_name; + LZ4F_errorCode_t ctxError; + size_t headerSize; + + ctxError = LZ4F_createCompressionContext(&mysink->ctx, LZ4F_VERSION); + if (LZ4F_isError(ctxError)) + elog(ERROR, "could not create lz4 compression context: %s", + LZ4F_getErrorName(ctxError)); + + /* First of all write the frame header to destination buffer. */ + headerSize = LZ4F_compressBegin(mysink->ctx, + mysink->base.bbs_next->bbs_buffer, + mysink->base.bbs_next->bbs_buffer_length, + &mysink->prefs); + + if (LZ4F_isError(headerSize)) + elog(ERROR, "could not write lz4 header: %s", + LZ4F_getErrorName(headerSize)); + + /* + * We need to write the compressed data after the header in the output + * buffer. So, make sure to update the notion of bytes written to output + * buffer. + */ + mysink->bytes_written += headerSize; + + /* Add ".lz4" to the archive name. */ + lz4_archive_name = psprintf("%s.lz4", archive_name); + Assert(sink->bbs_next != NULL); + bbsink_begin_archive(sink->bbs_next, lz4_archive_name); + pfree(lz4_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 then 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_lz4_end_archive() is invoked. + */ +static void +bbsink_lz4_archive_contents(bbsink *sink, size_t avail_in) +{ + bbsink_lz4 *mysink = (bbsink_lz4 *) sink; + size_t compressedSize; + size_t avail_in_bound; + + avail_in_bound = LZ4F_compressBound(avail_in, &mysink->prefs); + + /* + * If the number of available bytes has fallen below the value computed by + * 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) < + avail_in_bound) + { + bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); + mysink->bytes_written = 0; + } + + /* + * Compress the input buffer and write it into the output buffer. + */ + compressedSize = LZ4F_compressUpdate(mysink->ctx, + mysink->base.bbs_next->bbs_buffer + mysink->bytes_written, + mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written, + (uint8 *) mysink->base.bbs_buffer, + avail_in, + NULL); + + if (LZ4F_isError(compressedSize)) + elog(ERROR, "could not compress data: %s", + LZ4F_getErrorName(compressedSize)); + + /* + * Update our notion of how many bytes we've written into output buffer. + */ + mysink->bytes_written += compressedSize; +} + +/* + * There might be some data inside lz4's internal buffers; we need to get + * that flushed out and also finalize the lz4 frame and then get that forwarded + * to the successor sink as archive content. + * + * Then we can end processing for this archive. + */ +static void +bbsink_lz4_end_archive(bbsink *sink) +{ + bbsink_lz4 *mysink = (bbsink_lz4 *) sink; + size_t compressedSize; + size_t lz4_footer_bound; + + lz4_footer_bound = LZ4F_compressBound(0, &mysink->prefs); + + Assert(mysink->base.bbs_next->bbs_buffer_length >= lz4_footer_bound); + + if ((mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written) < + lz4_footer_bound) + { + bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); + mysink->bytes_written = 0; + } + + compressedSize = LZ4F_compressEnd(mysink->ctx, + mysink->base.bbs_next->bbs_buffer + mysink->bytes_written, + mysink->base.bbs_next->bbs_buffer_length - mysink->bytes_written, + NULL); + + if (LZ4F_isError(compressedSize)) + elog(ERROR, "could not end lz4 compression: %s", + LZ4F_getErrorName(compressedSize)); + + /* Update our notion of how many bytes we've written. */ + mysink->bytes_written += compressedSize; + + /* Send whatever accumulated output bytes we have. */ + bbsink_archive_contents(sink->bbs_next, mysink->bytes_written); + mysink->bytes_written = 0; + + /* Release the resources. */ + LZ4F_freeCompressionContext(mysink->ctx); + mysink->ctx = NULL; + + /* Pass on the information that this archive has ended. */ + bbsink_forward_end_archive(sink); +} + +/* + * 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_lz4_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 the compression context by + * calling LZ4F_freeCompressionContext() if needed to avoid memory leak. + */ +static void +bbsink_lz4_cleanup(bbsink *sink) +{ + bbsink_lz4 *mysink = (bbsink_lz4 *) sink; + + if (mysink->ctx) + { + LZ4F_freeCompressionContext(mysink->ctx); + mysink->ctx = NULL; + } +} + +#endif diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_progress.c b/third_party/spanner_pg/src/backend/backup/basebackup_progress.c new file mode 100644 index 00000000..6d4b5a23 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_progress.c @@ -0,0 +1,246 @@ +/*------------------------------------------------------------------------- + * + * basebackup_progress.c + * Basebackup sink implementing progress tracking, including but not + * limited to command progress reporting. + * + * This should be used even if the PROGRESS option to the replication + * command BASE_BACKUP is not specified. Without that option, we won't + * have tallied up the size of the files that are going to need to be + * backed up, but we can still report to the command progress reporting + * facility how much data we've processed. + * + * Moreover, we also use this as a convenient place to update certain + * fields of the bbsink_state. That work is accurately described as + * keeping track of our progress, but it's not just for introspection. + * We need those fields to be updated properly in order for base backups + * to work. + * + * This particular basebackup sink requires extra callbacks that most base + * backup sinks don't. Rather than cramming those into the interface, we just + * have a few extra functions here that basebackup.c can call. (We could put + * the logic directly into that file as it's fairly simple, but it seems + * cleaner to have everything related to progress reporting in one place.) + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_progress.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "backup/basebackup.h" +#include "backup/basebackup_sink.h" +#include "commands/progress.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "storage/latch.h" +#include "utils/timestamp.h" + +static void bbsink_progress_begin_backup(bbsink *sink); +static void bbsink_progress_archive_contents(bbsink *sink, size_t len); +static void bbsink_progress_end_archive(bbsink *sink); + +static const bbsink_ops bbsink_progress_ops = { + .begin_backup = bbsink_progress_begin_backup, + .begin_archive = bbsink_forward_begin_archive, + .archive_contents = bbsink_progress_archive_contents, + .end_archive = bbsink_progress_end_archive, + .begin_manifest = bbsink_forward_begin_manifest, + .manifest_contents = bbsink_forward_manifest_contents, + .end_manifest = bbsink_forward_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_forward_cleanup +}; + +/* + * Create a new basebackup sink that performs progress tracking functions and + * forwards data to a successor sink. + */ +bbsink * +bbsink_progress_new(bbsink *next, bool estimate_backup_size) +{ + bbsink *sink; + + Assert(next != NULL); + + sink = palloc0(sizeof(bbsink)); + *((const bbsink_ops **) &sink->bbs_ops) = &bbsink_progress_ops; + sink->bbs_next = next; + + /* + * Report that a base backup is in progress, and set the total size of the + * backup to -1, which will get translated to NULL. If we're estimating + * the backup size, we'll insert the real estimate when we have it. + */ + pgstat_progress_start_command(PROGRESS_COMMAND_BASEBACKUP, InvalidOid); + pgstat_progress_update_param(PROGRESS_BASEBACKUP_BACKUP_TOTAL, -1); + + return sink; +} + +/* + * Progress reporting at start of backup. + */ +static void +bbsink_progress_begin_backup(bbsink *sink) +{ + const int index[] = { + PROGRESS_BASEBACKUP_PHASE, + PROGRESS_BASEBACKUP_BACKUP_TOTAL, + PROGRESS_BASEBACKUP_TBLSPC_TOTAL + }; + int64 val[3]; + + /* + * Report that we are now streaming database files as a base backup. Also + * advertise the number of tablespaces, and, if known, the estimated total + * backup size. + */ + val[0] = PROGRESS_BASEBACKUP_PHASE_STREAM_BACKUP; + if (sink->bbs_state->bytes_total_is_valid) + val[1] = sink->bbs_state->bytes_total; + else + val[1] = -1; + val[2] = list_length(sink->bbs_state->tablespaces); + pgstat_progress_update_multi_param(3, index, val); + + /* Delegate to next sink. */ + bbsink_forward_begin_backup(sink); +} + +/* + * End-of archive progress reporting. + */ +static void +bbsink_progress_end_archive(bbsink *sink) +{ + /* + * We expect one archive per tablespace, so reaching the end of an archive + * also means reaching the end of a tablespace. (Some day we might have a + * reason to decouple these concepts.) + * + * If WAL is included in the backup, we'll mark the last tablespace + * complete before the last archive is complete, so we need a guard here + * to ensure that the number of tablespaces streamed doesn't exceed the + * total. + */ + if (sink->bbs_state->tablespace_num < list_length(sink->bbs_state->tablespaces)) + pgstat_progress_update_param(PROGRESS_BASEBACKUP_TBLSPC_STREAMED, + sink->bbs_state->tablespace_num + 1); + + /* Delegate to next sink. */ + bbsink_forward_end_archive(sink); + + /* + * This is a convenient place to update the bbsink_state's notion of which + * is the current tablespace. Note that the bbsink_state object is shared + * across all bbsink objects involved, but we're the outermost one and + * this is the very last thing we do. + */ + sink->bbs_state->tablespace_num++; +} + +/* + * Handle progress tracking for new archive contents. + * + * Increment the counter for the amount of data already streamed + * by the given number of bytes, and update the progress report for + * pg_stat_progress_basebackup. + */ +static void +bbsink_progress_archive_contents(bbsink *sink, size_t len) +{ + bbsink_state *state = sink->bbs_state; + const int index[] = { + PROGRESS_BASEBACKUP_BACKUP_STREAMED, + PROGRESS_BASEBACKUP_BACKUP_TOTAL + }; + int64 val[2]; + int nparam = 0; + + /* First update bbsink_state with # of bytes done. */ + state->bytes_done += len; + + /* Now forward to next sink. */ + bbsink_forward_archive_contents(sink, len); + + /* Prepare to set # of bytes done for command progress reporting. */ + val[nparam++] = state->bytes_done; + + /* + * We may also want to update # of total bytes, to avoid overflowing past + * 100% or the full size. This may make the total size number change as we + * approach the end of the backup (the estimate will always be wrong if + * WAL is included), but that's better than having the done column be + * bigger than the total. + */ + if (state->bytes_total_is_valid && state->bytes_done > state->bytes_total) + val[nparam++] = state->bytes_done; + + pgstat_progress_update_multi_param(nparam, index, val); +} + +/* + * Advertise that we are waiting for the start-of-backup checkpoint. + */ +void +basebackup_progress_wait_checkpoint(void) +{ + pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, + PROGRESS_BASEBACKUP_PHASE_WAIT_CHECKPOINT); +} + +/* + * Advertise that we are estimating the backup size. + */ +void +basebackup_progress_estimate_backup_size(void) +{ + pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, + PROGRESS_BASEBACKUP_PHASE_ESTIMATE_BACKUP_SIZE); +} + +/* + * Advertise that we are waiting for WAL archiving at end-of-backup. + */ +void +basebackup_progress_wait_wal_archive(bbsink_state *state) +{ + const int index[] = { + PROGRESS_BASEBACKUP_PHASE, + PROGRESS_BASEBACKUP_TBLSPC_STREAMED + }; + int64 val[2]; + + /* + * We report having finished all tablespaces at this point, even if the + * archive for the main tablespace is still open, because what's going to + * be added is WAL files, not files that are really from the main + * tablespace. + */ + val[0] = PROGRESS_BASEBACKUP_PHASE_WAIT_WAL_ARCHIVE; + val[1] = list_length(state->tablespaces); + pgstat_progress_update_multi_param(2, index, val); +} + +/* + * Advertise that we are transferring WAL files into the final archive. + */ +void +basebackup_progress_transfer_wal(void) +{ + pgstat_progress_update_param(PROGRESS_BASEBACKUP_PHASE, + PROGRESS_BASEBACKUP_PHASE_TRANSFER_WAL); +} + +/* + * Advertise that we are no longer performing a backup. + */ +void +basebackup_progress_done(void) +{ + pgstat_progress_end_command(); +} diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_server.c b/third_party/spanner_pg/src/backend/backup/basebackup_server.c new file mode 100644 index 00000000..0258d7a0 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_server.c @@ -0,0 +1,309 @@ +/*------------------------------------------------------------------------- + * + * basebackup_server.c + * store basebackup archives on the server + * + * IDENTIFICATION + * src/backend/backup/basebackup_server.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xact.h" +#include "backup/basebackup.h" +#include "backup/basebackup_sink.h" +#include "catalog/pg_authid.h" +#include "miscadmin.h" +#include "storage/fd.h" +#include "utils/acl.h" +#include "utils/timestamp.h" +#include "utils/wait_event.h" + +typedef struct bbsink_server +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Directory in which backup is to be stored. */ + char *pathname; + + /* Currently open file (or 0 if nothing open). */ + File file; + + /* Current file position. */ + off_t filepos; +} bbsink_server; + +static void bbsink_server_begin_archive(bbsink *sink, + const char *archive_name); +static void bbsink_server_archive_contents(bbsink *sink, size_t len); +static void bbsink_server_end_archive(bbsink *sink); +static void bbsink_server_begin_manifest(bbsink *sink); +static void bbsink_server_manifest_contents(bbsink *sink, size_t len); +static void bbsink_server_end_manifest(bbsink *sink); + +static const bbsink_ops bbsink_server_ops = { + .begin_backup = bbsink_forward_begin_backup, + .begin_archive = bbsink_server_begin_archive, + .archive_contents = bbsink_server_archive_contents, + .end_archive = bbsink_server_end_archive, + .begin_manifest = bbsink_server_begin_manifest, + .manifest_contents = bbsink_server_manifest_contents, + .end_manifest = bbsink_server_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_forward_cleanup +}; + +/* + * Create a new 'server' bbsink. + */ +bbsink * +bbsink_server_new(bbsink *next, char *pathname) +{ + bbsink_server *sink = palloc0(sizeof(bbsink_server)); + + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_server_ops; + sink->pathname = pathname; + sink->base.bbs_next = next; + + /* Replication permission is not sufficient in this case. */ + StartTransactionCommand(); + if (!has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server"))); + CommitTransactionCommand(); + + /* + * It's not a good idea to store your backups in the same directory that + * you're backing up. If we allowed a relative path here, that could + * easily happen accidentally, so we don't. The user could still + * accomplish the same thing by including the absolute path to $PGDATA in + * the pathname, but that's likely an intentional bad decision rather than + * an accident. + */ + if (!is_absolute_path(pathname)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_NAME), + errmsg("relative path not allowed for backup stored on server"))); + + switch (pg_check_dir(pathname)) + { + case 0: + + /* + * Does not exist, so create it using the same permissions we'd + * use for a new subdirectory of the data directory itself. + */ + if (MakePGDirectory(pathname) < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create directory \"%s\": %m", pathname))); + break; + + case 1: + /* Exists, empty. */ + break; + + case 2: + case 3: + case 4: + /* Exists, not empty. */ + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_FILE), + errmsg("directory \"%s\" exists but is not empty", + pathname))); + break; + + default: + /* Access problem. */ + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not access directory \"%s\": %m", + pathname))); + } + + return &sink->base; +} + +/* + * Open the correct output file for this archive. + */ +static void +bbsink_server_begin_archive(bbsink *sink, const char *archive_name) +{ + bbsink_server *mysink = (bbsink_server *) sink; + char *filename; + + Assert(mysink->file == 0); + Assert(mysink->filepos == 0); + + filename = psprintf("%s/%s", mysink->pathname, archive_name); + + mysink->file = PathNameOpenFile(filename, + O_CREAT | O_EXCL | O_WRONLY | PG_BINARY); + if (mysink->file <= 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create file \"%s\": %m", filename))); + + pfree(filename); + + bbsink_forward_begin_archive(sink, archive_name); +} + +/* + * Write the data to the output file. + */ +static void +bbsink_server_archive_contents(bbsink *sink, size_t len) +{ + bbsink_server *mysink = (bbsink_server *) sink; + int nbytes; + + nbytes = FileWrite(mysink->file, mysink->base.bbs_buffer, len, + mysink->filepos, WAIT_EVENT_BASEBACKUP_WRITE); + + if (nbytes != len) + { + if (nbytes < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", + FilePathName(mysink->file)), + errhint("Check free disk space."))); + /* short write: complain appropriately */ + ereport(ERROR, + (errcode(ERRCODE_DISK_FULL), + errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %u", + FilePathName(mysink->file), + nbytes, (int) len, (unsigned) mysink->filepos), + errhint("Check free disk space."))); + } + + mysink->filepos += nbytes; + + bbsink_forward_archive_contents(sink, len); +} + +/* + * fsync and close the current output file. + */ +static void +bbsink_server_end_archive(bbsink *sink) +{ + bbsink_server *mysink = (bbsink_server *) sink; + + /* + * We intentionally don't use data_sync_elevel here, because the server + * 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, + (errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", + FilePathName(mysink->file)))); + + + /* We're done with this file now. */ + FileClose(mysink->file); + mysink->file = 0; + mysink->filepos = 0; + + bbsink_forward_end_archive(sink); +} + +/* + * Open the output file to which we will write the manifest. + * + * Just like pg_basebackup, we write the manifest first under a temporary + * name and then rename it into place after fsync. That way, if the manifest + * is there and under the correct name, the user can be sure that the backup + * completed. + */ +static void +bbsink_server_begin_manifest(bbsink *sink) +{ + bbsink_server *mysink = (bbsink_server *) sink; + char *tmp_filename; + + Assert(mysink->file == 0); + + tmp_filename = psprintf("%s/backup_manifest.tmp", mysink->pathname); + + mysink->file = PathNameOpenFile(tmp_filename, + O_CREAT | O_EXCL | O_WRONLY | PG_BINARY); + if (mysink->file <= 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create file \"%s\": %m", tmp_filename))); + + pfree(tmp_filename); + + bbsink_forward_begin_manifest(sink); +} + +/* + * Each chunk of manifest data is sent using a CopyData message. + */ +static void +bbsink_server_manifest_contents(bbsink *sink, size_t len) +{ + bbsink_server *mysink = (bbsink_server *) sink; + int nbytes; + + nbytes = FileWrite(mysink->file, mysink->base.bbs_buffer, len, + mysink->filepos, WAIT_EVENT_BASEBACKUP_WRITE); + + if (nbytes != len) + { + if (nbytes < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", + FilePathName(mysink->file)), + errhint("Check free disk space."))); + /* short write: complain appropriately */ + ereport(ERROR, + (errcode(ERRCODE_DISK_FULL), + errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %u", + FilePathName(mysink->file), + nbytes, (int) len, (unsigned) mysink->filepos), + errhint("Check free disk space."))); + } + + mysink->filepos += nbytes; + + bbsink_forward_manifest_contents(sink, len); +} + +/* + * fsync the backup manifest, close the file, and then rename it into place. + */ +static void +bbsink_server_end_manifest(bbsink *sink) +{ + bbsink_server *mysink = (bbsink_server *) sink; + char *tmp_filename; + char *filename; + + /* We're done with this file now. */ + FileClose(mysink->file); + mysink->file = 0; + + /* + * Rename it into place. This also fsyncs the temporary file, so we don't + * need to do that here. We don't use data_sync_elevel here for the same + * reasons as in bbsink_server_end_archive. + */ + tmp_filename = psprintf("%s/backup_manifest.tmp", mysink->pathname); + filename = psprintf("%s/backup_manifest", mysink->pathname); + durable_rename(tmp_filename, filename, ERROR); + pfree(filename); + pfree(tmp_filename); + + bbsink_forward_end_manifest(sink); +} diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_sink.c b/third_party/spanner_pg/src/backend/backup/basebackup_sink.c new file mode 100644 index 00000000..4536029d --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_sink.c @@ -0,0 +1,125 @@ +/*------------------------------------------------------------------------- + * + * basebackup_sink.c + * Default implementations for bbsink (basebackup sink) callbacks. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * src/backend/backup/basebackup_sink.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "backup/basebackup_sink.h" + +/* + * Forward begin_backup callback. + * + * Only use this implementation if you want the bbsink you're implementing to + * share a buffer with the successor bbsink. + */ +void +bbsink_forward_begin_backup(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_state != NULL); + bbsink_begin_backup(sink->bbs_next, sink->bbs_state, + sink->bbs_buffer_length); + sink->bbs_buffer = sink->bbs_next->bbs_buffer; +} + +/* + * Forward begin_archive callback. + */ +void +bbsink_forward_begin_archive(bbsink *sink, const char *archive_name) +{ + Assert(sink->bbs_next != NULL); + bbsink_begin_archive(sink->bbs_next, archive_name); +} + +/* + * Forward archive_contents callback. + * + * 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 + * reason to have separately allocated buffers containing the same identical + * data. + */ +void +bbsink_forward_archive_contents(bbsink *sink, size_t len) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_buffer == sink->bbs_next->bbs_buffer); + Assert(sink->bbs_buffer_length == sink->bbs_next->bbs_buffer_length); + bbsink_archive_contents(sink->bbs_next, len); +} + +/* + * Forward end_archive callback. + */ +void +bbsink_forward_end_archive(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_archive(sink->bbs_next); +} + +/* + * Forward begin_manifest callback. + */ +void +bbsink_forward_begin_manifest(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_begin_manifest(sink->bbs_next); +} + +/* + * Forward manifest_contents callback. + * + * As with the archive_contents callback, it's expected that the buffer is + * shared. + */ +void +bbsink_forward_manifest_contents(bbsink *sink, size_t len) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_buffer == sink->bbs_next->bbs_buffer); + Assert(sink->bbs_buffer_length == sink->bbs_next->bbs_buffer_length); + bbsink_manifest_contents(sink->bbs_next, len); +} + +/* + * Forward end_manifest callback. + */ +void +bbsink_forward_end_manifest(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_manifest(sink->bbs_next); +} + +/* + * Forward end_backup callback. + */ +void +bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_backup(sink->bbs_next, endptr, endtli); +} + +/* + * Forward cleanup callback. + */ +void +bbsink_forward_cleanup(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_cleanup(sink->bbs_next); +} diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_target.c b/third_party/spanner_pg/src/backend/backup/basebackup_target.c new file mode 100644 index 00000000..4d15ca40 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_target.c @@ -0,0 +1,241 @@ +/*------------------------------------------------------------------------- + * + * basebackup_target.c + * Base backups can be "targeted", 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-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_target.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "backup/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); +static bbsink *blackhole_get_sink(bbsink *next_sink, void *detail_arg); +static 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 *newtype; + 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); + newtype = palloc(sizeof(BaseBackupTargetType)); + newtype->name = pstrdup(name); + newtype->check_detail = check_detail; + newtype->get_sink = get_sink; + BaseBackupTargetTypeList = lappend(BaseBackupTargetTypeList, newtype); + 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))); + + /* keep compiler quiet */ + return NULL; +} + +/* + * 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. + */ +static bbsink * +blackhole_get_sink(bbsink *next_sink, void *detail_arg) +{ + return next_sink; +} + +/* + * Create a bbsink implementing a server-side backup. + */ +static 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. + */ +static 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. + */ +static 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/third_party/spanner_pg/src/backend/backup/basebackup_throttle.c b/third_party/spanner_pg/src/backend/backup/basebackup_throttle.c new file mode 100644 index 00000000..62ba7321 --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_throttle.c @@ -0,0 +1,199 @@ +/*------------------------------------------------------------------------- + * + * basebackup_throttle.c + * Basebackup sink implementing throttling. Data is forwarded to the + * next base backup sink in the chain at a rate no greater than the + * configured maximum. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_throttle.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "backup/basebackup_sink.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "storage/latch.h" +#include "utils/timestamp.h" + +typedef struct bbsink_throttle +{ + /* Common information for all types of sink. */ + bbsink base; + + /* The actual number of bytes, transfer of which may cause sleep. */ + uint64 throttling_sample; + + /* Amount of data already transferred but not yet throttled. */ + int64 throttling_counter; + + /* The minimum time required to transfer throttling_sample bytes. */ + TimeOffset elapsed_min_unit; + + /* The last check of the transfer rate. */ + TimestampTz throttled_last; +} bbsink_throttle; + +static void bbsink_throttle_begin_backup(bbsink *sink); +static void bbsink_throttle_archive_contents(bbsink *sink, size_t len); +static void bbsink_throttle_manifest_contents(bbsink *sink, size_t len); +static void throttle(bbsink_throttle *sink, size_t increment); + +static const bbsink_ops bbsink_throttle_ops = { + .begin_backup = bbsink_throttle_begin_backup, + .begin_archive = bbsink_forward_begin_archive, + .archive_contents = bbsink_throttle_archive_contents, + .end_archive = bbsink_forward_end_archive, + .begin_manifest = bbsink_forward_begin_manifest, + .manifest_contents = bbsink_throttle_manifest_contents, + .end_manifest = bbsink_forward_end_manifest, + .end_backup = bbsink_forward_end_backup, + .cleanup = bbsink_forward_cleanup +}; + +/* + * How frequently to throttle, as a fraction of the specified rate-second. + */ +#define THROTTLING_FREQUENCY 8 + +/* + * Create a new basebackup sink that performs throttling and forwards data + * to a successor sink. + */ +bbsink * +bbsink_throttle_new(bbsink *next, uint32 maxrate) +{ + bbsink_throttle *sink; + + Assert(next != NULL); + Assert(maxrate > 0); + + sink = palloc0(sizeof(bbsink_throttle)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_throttle_ops; + sink->base.bbs_next = next; + + sink->throttling_sample = + (int64) maxrate * (int64) 1024 / THROTTLING_FREQUENCY; + + /* + * The minimum amount of time for throttling_sample bytes to be + * transferred. + */ + sink->elapsed_min_unit = USECS_PER_SEC / THROTTLING_FREQUENCY; + + return &sink->base; +} + +/* + * There's no real work to do here, but we need to record the current time so + * that it can be used for future calculations. + */ +static void +bbsink_throttle_begin_backup(bbsink *sink) +{ + bbsink_throttle *mysink = (bbsink_throttle *) sink; + + bbsink_forward_begin_backup(sink); + + /* The 'real data' starts now (header was ignored). */ + mysink->throttled_last = GetCurrentTimestamp(); +} + +/* + * First throttle, and then pass archive contents to next sink. + */ +static void +bbsink_throttle_archive_contents(bbsink *sink, size_t len) +{ + throttle((bbsink_throttle *) sink, len); + + bbsink_forward_archive_contents(sink, len); +} + +/* + * First throttle, and then pass manifest contents to next sink. + */ +static void +bbsink_throttle_manifest_contents(bbsink *sink, size_t len) +{ + throttle((bbsink_throttle *) sink, len); + + bbsink_forward_manifest_contents(sink, len); +} + +/* + * Increment the network transfer counter by the given number of bytes, + * and sleep if necessary to comply with the requested network transfer + * rate. + */ +static void +throttle(bbsink_throttle *sink, size_t increment) +{ + TimeOffset elapsed_min; + + Assert(sink->throttling_counter >= 0); + + sink->throttling_counter += increment; + if (sink->throttling_counter < sink->throttling_sample) + return; + + /* How much time should have elapsed at minimum? */ + elapsed_min = sink->elapsed_min_unit * + (sink->throttling_counter / sink->throttling_sample); + + /* + * Since the latch could be set repeatedly because of concurrently WAL + * activity, sleep in a loop to ensure enough time has passed. + */ + for (;;) + { + TimeOffset elapsed, + sleep; + int wait_result; + + /* Time elapsed since the last measurement (and possible wake up). */ + elapsed = GetCurrentTimestamp() - sink->throttled_last; + + /* sleep if the transfer is faster than it should be */ + sleep = elapsed_min - elapsed; + if (sleep <= 0) + break; + + ResetLatch(MyLatch); + + /* We're eating a potentially set latch, so check for interrupts */ + CHECK_FOR_INTERRUPTS(); + + /* + * (TAR_SEND_SIZE / throttling_sample * elapsed_min_unit) should be + * the maximum time to sleep. Thus the cast to long is safe. + */ + wait_result = WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + (long) (sleep / 1000), + WAIT_EVENT_BASE_BACKUP_THROTTLE); + + if (wait_result & WL_LATCH_SET) + CHECK_FOR_INTERRUPTS(); + + /* Done waiting? */ + if (wait_result & WL_TIMEOUT) + break; + } + + /* + * As we work with integers, only whole multiple of throttling_sample was + * processed. The rest will be done during the next call of this function. + */ + sink->throttling_counter %= sink->throttling_sample; + + /* + * Time interval for the remaining amount and possible next increments + * starts now. + */ + sink->throttled_last = GetCurrentTimestamp(); +} diff --git a/third_party/spanner_pg/src/backend/backup/basebackup_zstd.c b/third_party/spanner_pg/src/backend/backup/basebackup_zstd.c new file mode 100644 index 00000000..84256e3f --- /dev/null +++ b/third_party/spanner_pg/src/backend/backup/basebackup_zstd.c @@ -0,0 +1,313 @@ +/*------------------------------------------------------------------------- + * + * basebackup_zstd.c + * Basebackup sink implementing zstd compression. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_zstd.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#ifdef USE_ZSTD +#include +#endif + +#include "backup/basebackup_sink.h" + +#ifdef USE_ZSTD + +typedef struct bbsink_zstd +{ + /* Common information for all types of sink. */ + bbsink base; + + /* Compression options */ + pg_compress_specification *compress; + + 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); + +static 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. + */ +bbsink * +bbsink_zstd_new(bbsink *next, pg_compress_specification *compress) +{ +#ifndef USE_ZSTD + 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); + + sink = palloc0(sizeof(bbsink_zstd)); + *((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_zstd_ops; + sink->base.bbs_next = next; + sink->compress = compress; + + return &sink->base; +#endif +} + +#ifdef USE_ZSTD + +/* + * Begin backup. + */ +static void +bbsink_zstd_begin_backup(bbsink *sink) +{ + bbsink_zstd *mysink = (bbsink_zstd *) sink; + size_t output_buffer_bound; + size_t ret; + pg_compress_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, + 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 & PG_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 + * 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/third_party/spanner_pg/src/backend/bootstrap/bootparse.y b/third_party/spanner_pg/src/backend/bootstrap/bootparse.y index 5fcd004e..e5cf1b3d 100644 --- a/third_party/spanner_pg/src/backend/bootstrap/bootparse.y +++ b/third_party/spanner_pg/src/backend/bootstrap/bootparse.y @@ -4,7 +4,7 @@ * bootparse.y * yacc grammar for the "bootstrap" mode (BKI file format) * - * 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 * * @@ -167,9 +167,9 @@ Boot_CreateStmt: } RPAREN { - TupleDesc tupdesc; - bool shared_relation; - bool mapped_relation; + TupleDesc tupdesc; + bool shared_relation; + bool mapped_relation; do_start(); @@ -212,12 +212,13 @@ Boot_CreateStmt: mapped_relation, true, &relfrozenxid, - &relminmxid); + &relminmxid, + true); elog(DEBUG4, "bootstrap relation created"); } else { - Oid id; + Oid id; id = heap_create_with_catalog($2, PG_CATALOG_NAMESPACE, @@ -268,8 +269,8 @@ Boot_InsertStmt: Boot_DeclareIndexStmt: XDECLARE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN { - IndexStmt *stmt = makeNode(IndexStmt); - Oid relationId; + IndexStmt *stmt = makeNode(IndexStmt); + Oid relationId; elog(DEBUG4, "creating index \"%s\"", $3); @@ -320,8 +321,8 @@ Boot_DeclareIndexStmt: Boot_DeclareUniqueIndexStmt: XDECLARE UNIQUE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN { - IndexStmt *stmt = makeNode(IndexStmt); - Oid relationId; + IndexStmt *stmt = makeNode(IndexStmt); + Oid relationId; elog(DEBUG4, "creating unique index \"%s\"", $4); @@ -399,7 +400,8 @@ boot_index_params: boot_index_param: boot_ident boot_ident { - IndexElem *n = makeNode(IndexElem); + IndexElem *n = makeNode(IndexElem); + n->name = $1; n->expr = NULL; n->indexcolname = NULL; diff --git a/third_party/spanner_pg/src/backend/bootstrap/bootscanner.l b/third_party/spanner_pg/src/backend/bootstrap/bootscanner.l index 7aecd895..3094ccb9 100644 --- a/third_party/spanner_pg/src/backend/bootstrap/bootscanner.l +++ b/third_party/spanner_pg/src/backend/bootstrap/bootscanner.l @@ -4,7 +4,7 @@ * bootscanner.l * a lexical scanner for the bootstrap parser * - * 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/third_party/spanner_pg/src/backend/bootstrap/bootstrap.c b/third_party/spanner_pg/src/backend/bootstrap/bootstrap.c index 86602b98..d3fc5f75 100644 --- a/third_party/spanner_pg/src/backend/bootstrap/bootstrap.c +++ b/third_party/spanner_pg/src/backend/bootstrap/bootstrap.c @@ -4,7 +4,7 @@ * routines to support running postgres in 'bootstrap' mode * bootstrap mode is used to create the initial template database * - * 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 * * IDENTIFICATION @@ -33,11 +33,6 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "pg_getopt.h" -#include "pgstat.h" -#include "postmaster/bgwriter.h" -#include "postmaster/startup.h" -#include "postmaster/walwriter.h" -#include "replication/walreceiver.h" #include "storage/bufmgr.h" #include "storage/bufpage.h" #include "storage/condition_variable.h" @@ -47,7 +42,6 @@ #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/memutils.h" -#include "utils/ps_status.h" #include "utils/rel.h" #include "utils/relmapper.h" @@ -57,9 +51,7 @@ uint32 bootstrap_data_checksum_version = 0; /* No checksum */ static void CheckerModeMain(void); -static void BootstrapModeMain(void); static void bootstrap_signals(void); -static void ShutdownAuxiliaryProcess(int code, Datum arg); static Form_pg_attribute AllocateAttribute(void); static void populate_typ_list(void); static Oid gettype(char *type); @@ -70,8 +62,6 @@ static void cleanup(void); * ---------------- */ -AuxProcType MyAuxProcType = NotAnAuxProcess; /* declared in miscadmin.h */ - Relation boot_reldesc; /* current relation descriptor */ Form_pg_attribute attrtypes[MAXATTR]; /* points to attribute info */ @@ -188,46 +178,52 @@ static IndexList *ILHead = NULL; /* - * AuxiliaryProcessMain + * In shared memory checker mode, all we really want to do is create shared + * memory and semaphores (just to prove we can do it with the current GUC + * settings). Since, in fact, that was already done by + * CreateSharedMemoryAndSemaphores(), we have nothing more to do here. + */ +static void +CheckerModeMain(void) +{ + proc_exit(0); +} + +/* + * The main entry point for running the backend in bootstrap mode * - * The main entry point for auxiliary processes, such as the bgwriter, - * walwriter, walreceiver, bootstrapper and the shared memory checker code. + * The bootstrap mode is used to initialize the template database. + * The bootstrap backend doesn't speak SQL, but instead expects + * commands in a special bootstrap language. * - * This code is here just because of historical reasons. + * When check_only is true, startup is done only far enough to verify that + * the current configuration, particularly the passed in options pertaining + * to shared memory sizing, options work (or at least do not cause an error + * up to shared memory creation). */ void -AuxiliaryProcessMain(int argc, char *argv[]) +BootstrapModeMain(int argc, char *argv[], bool check_only) { + int i; char *progname = argv[0]; int flag; char *userDoption = NULL; - /* - * Initialize process environment (already done if under postmaster, but - * not if standalone). - */ - if (!IsUnderPostmaster) - InitStandaloneProcess(argv[0]); + Assert(!IsUnderPostmaster); - /* - * process command arguments - */ + InitStandaloneProcess(argv[0]); /* Set defaults, to be overridden by explicit options below */ - if (!IsUnderPostmaster) - InitializeGUCOptions(); + InitializeGUCOptions(); - /* Ignore the initial --boot argument, if present */ - if (argc > 1 && strcmp(argv[1], "--boot") == 0) - { - argv++; - argc--; - } - - /* If no -x argument, we are a CheckerProcess */ - MyAuxProcType = CheckerProcess; + /* an initial --boot or --check should be present */ + Assert(argc > 1 + && (strcmp(argv[1], "--boot") == 0 + || strcmp(argv[1], "--check") == 0)); + argv++; + argc--; - while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:x:X:-:")) != -1) + while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:X:-:")) != -1) { switch (flag) { @@ -259,9 +255,6 @@ AuxiliaryProcessMain(int argc, char *argv[]) case 'r': strlcpy(OutputFileName, optarg, MAXPGPATH); break; - case 'x': - MyAuxProcType = atoi(optarg); - break; case 'X': { int WalSegSz = strtoul(optarg, NULL, 0); @@ -271,7 +264,7 @@ AuxiliaryProcessMain(int argc, char *argv[]) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("-X requires a power of two value between 1 MB and 1 GB"))); SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL, - PGC_S_OVERRIDE); + PGC_S_DYNAMIC_DEFAULT); } break; case 'c': @@ -315,193 +308,47 @@ AuxiliaryProcessMain(int argc, char *argv[]) proc_exit(1); } - switch (MyAuxProcType) - { - case StartupProcess: - MyBackendType = B_STARTUP; - break; - case ArchiverProcess: - MyBackendType = B_ARCHIVER; - break; - case BgWriterProcess: - MyBackendType = B_BG_WRITER; - break; - case CheckpointerProcess: - MyBackendType = B_CHECKPOINTER; - break; - case WalWriterProcess: - MyBackendType = B_WAL_WRITER; - break; - case WalReceiverProcess: - MyBackendType = B_WAL_RECEIVER; - break; - default: - MyBackendType = B_INVALID; - } - if (IsUnderPostmaster) - init_ps_display(NULL); - - /* Acquire configuration parameters, unless inherited from postmaster */ - if (!IsUnderPostmaster) - { - if (!SelectConfigFiles(userDoption, progname)) - proc_exit(1); - } + /* Acquire configuration parameters */ + if (!SelectConfigFiles(userDoption, progname)) + proc_exit(1); /* * Validate we have been given a reasonable-looking DataDir and change - * into it (if under postmaster, should be done already). + * into it */ - if (!IsUnderPostmaster) - { - checkDataDir(); - ChangeToDataDir(); - } + checkDataDir(); + ChangeToDataDir(); - /* If standalone, create lockfile for data directory */ - if (!IsUnderPostmaster) - CreateDataDirLockFile(false); + CreateDataDirLockFile(false); SetProcessingMode(BootstrapProcessing); IgnoreSystemIndexes = true; - /* Initialize MaxBackends (if under postmaster, was done already) */ - if (!IsUnderPostmaster) - InitializeMaxBackends(); + InitializeMaxBackends(); - BaseInit(); + CreateSharedMemoryAndSemaphores(); /* - * When we are an auxiliary process, we aren't going to do the full - * InitPostgres pushups, but there are a couple of things that need to get - * lit up even in an auxiliary process. + * XXX: It might make sense to move this into its own function at some + * point. Right now it seems like it'd cause more code duplication than + * it's worth. */ - if (IsUnderPostmaster) + if (check_only) { - /* - * Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case, - * this was already done by SubPostmasterMain(). - */ -#ifndef EXEC_BACKEND - InitAuxiliaryProcess(); -#endif - - /* - * Assign the ProcSignalSlot for an auxiliary process. Since it - * doesn't have a BackendId, the slot is statically allocated based on - * the auxiliary process type (MyAuxProcType). Backends use slots - * indexed in the range from 1 to MaxBackends (inclusive), so we use - * MaxBackends + AuxProcType + 1 as the index of the slot for an - * auxiliary process. - * - * This will need rethinking if we ever want more than one of a - * particular auxiliary process type. - */ - ProcSignalInit(MaxBackends + MyAuxProcType + 1); - - /* finish setting up bufmgr.c */ - InitBufferPoolBackend(); - - /* - * Auxiliary processes don't run transactions, but they may need a - * resource owner anyway to manage buffer pins acquired outside - * transactions (and, perhaps, other things in future). - */ - CreateAuxProcessResourceOwner(); - - /* Initialize statistics reporting */ - pgstat_initialize(); - - /* Initialize backend status information */ - pgstat_beinit(); - pgstat_bestart(); - - /* register a before-shutdown callback for LWLock cleanup */ - before_shmem_exit(ShutdownAuxiliaryProcess, 0); + SetProcessingMode(NormalProcessing); + CheckerModeMain(); + abort(); } /* - * XLOG operations + * Do backend-like initialization for bootstrap mode */ - SetProcessingMode(NormalProcessing); - - switch (MyAuxProcType) - { - case CheckerProcess: - /* don't set signals, they're useless here */ - CheckerModeMain(); - proc_exit(1); /* should never return */ - - case BootstrapProcess: - - /* - * There was a brief instant during which mode was Normal; this is - * okay. We need to be in bootstrap mode during BootStrapXLOG for - * the sake of multixact initialization. - */ - SetProcessingMode(BootstrapProcessing); - bootstrap_signals(); - BootStrapXLOG(); - BootstrapModeMain(); - proc_exit(1); /* should never return */ - - case StartupProcess: - StartupProcessMain(); - proc_exit(1); - - case ArchiverProcess: - PgArchiverMain(); - proc_exit(1); - - case BgWriterProcess: - BackgroundWriterMain(); - proc_exit(1); - - case CheckpointerProcess: - CheckpointerMain(); - proc_exit(1); - - case WalWriterProcess: - InitXLOGAccess(); - WalWriterMain(); - proc_exit(1); - - case WalReceiverProcess: - WalReceiverMain(); - proc_exit(1); - - default: - elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType); - proc_exit(1); - } -} - -/* - * In shared memory checker mode, all we really want to do is create shared - * memory and semaphores (just to prove we can do it with the current GUC - * settings). Since, in fact, that was already done by BaseInit(), - * we have nothing more to do here. - */ -static void -CheckerModeMain(void) -{ - proc_exit(0); -} + InitProcess(); -/* - * The main entry point for running the backend in bootstrap mode - * - * The bootstrap mode is used to initialize the template database. - * The bootstrap backend doesn't speak SQL, but instead expects - * commands in a special bootstrap language. - */ -static void -BootstrapModeMain(void) -{ - int i; + BaseInit(); - Assert(!IsUnderPostmaster); - Assert(IsBootstrapProcessingMode()); + bootstrap_signals(); + BootStrapXLOG(); /* * To ensure that src/common/link-canary.c is linked into the backend, we @@ -510,12 +357,7 @@ BootstrapModeMain(void) if (pg_link_canary_is_frontend()) elog(ERROR, "backend is incorrectly linked to frontend functions"); - /* - * Do backend-like initialization for bootstrap mode - */ - InitProcess(); - - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, NULL, false); + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); /* Initialize stuff for bootstrap-file processing */ for (i = 0; i < MAXATTR; i++) @@ -567,21 +409,6 @@ bootstrap_signals(void) pqsignal(SIGQUIT, SIG_DFL); } -/* - * Begin shutdown of an auxiliary process. This is approximately the equivalent - * of ShutdownPostgres() in postinit.c. We can't run transactions in an - * auxiliary process, so most of the work of AbortTransaction() is not needed, - * but we do need to make sure we've released any LWLocks we are holding. - * (This is only critical during an error exit.) - */ -static void -ShutdownAuxiliaryProcess(int code, Datum arg) -{ - LWLockReleaseAll(); - ConditionVariableCancelSleep(); - pgstat_report_wait_end(); -} - /* ---------------------------------------------------------------- * MANUAL BACKEND INTERACTIVE INTERFACE COMMANDS * ---------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/backend/catalog/BUILD b/third_party/spanner_pg/src/backend/catalog/BUILD index 6c27dc0a..e0ab9f75 100644 --- a/third_party/spanner_pg/src/backend/catalog/BUILD +++ b/third_party/spanner_pg/src/backend/catalog/BUILD @@ -58,7 +58,9 @@ cc_library( "objectaddress.c", "partition.c", "pg_aggregate.c", + "pg_attrdef.c", "pg_cast.c", + "pg_class.c", "pg_collation.c", "pg_constraint.c", "pg_conversion.c", @@ -69,6 +71,7 @@ cc_library( "pg_largeobject.c", "pg_namespace.c", "pg_operator.c", + "pg_parameter_acl.c", "pg_proc.c", "pg_publication.c", "pg_range.c", @@ -126,6 +129,8 @@ GENERATED_CATALOG_HEADER_FILES = [ "pg_database_d.h", "pg_db_role_setting_d.h", "pg_default_acl_d.h", + "pg_parameter_acl_d.h", + "pg_publication_namespace_d.h", "pg_depend_d.h", "pg_description_d.h", "pg_enum_d.h", @@ -244,6 +249,8 @@ genrule( third_party/spanner_pg/src/include/catalog/pg_policy.h \ third_party/spanner_pg/src/include/catalog/pg_replication_origin.h \ third_party/spanner_pg/src/include/catalog/pg_default_acl.h \ + third_party/spanner_pg/src/include/catalog/pg_parameter_acl.h \ + third_party/spanner_pg/src/include/catalog/pg_publication_namespace.h \ third_party/spanner_pg/src/include/catalog/pg_init_privs.h \ third_party/spanner_pg/src/include/catalog/pg_seclabel.h \ third_party/spanner_pg/src/include/catalog/pg_shseclabel.h \ diff --git a/third_party/spanner_pg/src/backend/catalog/Catalog.pm b/third_party/spanner_pg/src/backend/catalog/Catalog.pm index a5e98693..e91a8e10 100644 --- a/third_party/spanner_pg/src/backend/catalog/Catalog.pm +++ b/third_party/spanner_pg/src/backend/catalog/Catalog.pm @@ -4,7 +4,7 @@ # Perl module that extracts info from catalog files into Perl # data structures # -# 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 # # src/backend/catalog/Catalog.pm @@ -41,10 +41,12 @@ sub ParseHeader my $is_varlen = 0; my $is_client_code = 0; - $catalog{columns} = []; - $catalog{toasting} = []; - $catalog{indexing} = []; - $catalog{client_code} = []; + $catalog{columns} = []; + $catalog{toasting} = []; + $catalog{indexing} = []; + $catalog{other_oids} = []; + $catalog{foreign_keys} = []; + $catalog{client_code} = []; open(my $ifh, '<', $input_file) || die "$input_file: $!"; @@ -95,15 +97,38 @@ sub ParseHeader { parent_table => $1, toast_oid => $2, toast_index_oid => $3 }; } elsif ( - /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(.+)\)/) + /^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*(.+)\)/ + ) { push @{ $catalog{indexing} }, { is_unique => $1 ? 1 : 0, is_pkey => $2 ? 1 : 0, - index_name => $3, - index_oid => $4, - index_decl => $5 + index_name => $3, + index_oid => $4, + index_oid_macro => $5, + index_decl => $6 + }; + } + elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/) + { + push @{ $catalog{other_oids} }, + { + other_name => $1, + other_oid => $2 }; } elsif ( @@ -560,6 +585,10 @@ sub FindAllOidsFromHeaders { push @oids, $index->{index_oid}; } + foreach my $other (@{ $catalog->{other_oids} }) + { + push @oids, $other->{other_oid}; + } } return \@oids; diff --git a/third_party/spanner_pg/src/backend/catalog/Makefile b/third_party/spanner_pg/src/backend/catalog/Makefile index 69f9dd51..89a0221e 100644 --- a/third_party/spanner_pg/src/backend/catalog/Makefile +++ b/third_party/spanner_pg/src/backend/catalog/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/catalog # -# 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 # # src/backend/catalog/Makefile @@ -25,7 +25,9 @@ OBJS = \ objectaddress.o \ partition.o \ pg_aggregate.o \ + pg_attrdef.o \ pg_cast.o \ + pg_class.o \ pg_collation.o \ pg_constraint.o \ pg_conversion.o \ @@ -36,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 \ @@ -66,9 +69,10 @@ 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_sequence.h pg_publication.h pg_publication_rel.h pg_subscription.h \ - pg_subscription_rel.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 GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h system_fk_info.h @@ -101,7 +105,7 @@ generated-header-symlinks: $(top_builddir)/src/include/catalog/header-stamp # configure run, even in distribution tarballs. So depending on configure.ac # instead is cheating a bit, but it will achieve the goal of updating the # version number when it changes. -bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.ac +bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.ac $(top_srcdir)/src/include/access/transam.h $(PERL) $< --include-path=$(top_srcdir)/src/include/ \ --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS) touch $@ diff --git a/third_party/spanner_pg/src/backend/catalog/aclchk.c b/third_party/spanner_pg/src/backend/catalog/aclchk.c index fc2951df..89d5ef7d 100644 --- a/third_party/spanner_pg/src/backend/catalog/aclchk.c +++ b/third_party/spanner_pg/src/backend/catalog/aclchk.c @@ -3,7 +3,7 @@ * aclchk.c * Routines to check access control permissions. * - * 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 * * @@ -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" @@ -59,6 +60,7 @@ #include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" +#include "commands/defrem.h" #include "commands/event_trigger.h" #include "commands/extension.h" #include "commands/proclang.h" @@ -113,11 +115,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, @@ -260,6 +264,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 */ @@ -391,7 +398,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); @@ -499,6 +507,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); @@ -601,6 +613,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); @@ -627,7 +642,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; @@ -760,6 +775,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); @@ -923,19 +969,13 @@ ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *s if (strcmp(defel->defname, "schemas") == 0) { if (dnspnames) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dnspnames = defel; } else if (strcmp(defel->defname, "roles") == 0) { if (drolespecs) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); drolespecs = defel; } else @@ -1501,6 +1541,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; @@ -3232,6 +3275,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) @@ -3262,6 +3453,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, @@ -3299,6 +3494,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); } @@ -3383,6 +3582,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; @@ -3434,6 +3636,7 @@ aclcheck_error(AclResult aclerr, ObjectType objtype, case OBJECT_DEFAULT: case OBJECT_DEFACL: case OBJECT_DOMCONSTRAINT: + case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_ROLE: case OBJECT_RULE: @@ -3444,7 +3647,7 @@ aclcheck_error(AclResult aclerr, ObjectType objtype, case OBJECT_TSTEMPLATE: case OBJECT_USER_MAPPING: case OBJECT_CHANGE_STREAM: - elog(ERROR, "unsupported object type %d", objtype); + elog(ERROR, "unsupported object type %d", objtype); } ereport(ERROR, @@ -3574,6 +3777,8 @@ 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: case OBJECT_TRANSFORM: @@ -3581,7 +3786,7 @@ aclcheck_error(AclResult aclerr, ObjectType objtype, case OBJECT_TSTEMPLATE: case OBJECT_USER_MAPPING: case OBJECT_CHANGE_STREAM: - elog(ERROR, "unsupported object type %d", objtype); + elog(ERROR, "unsupported object type %d", objtype); } ereport(ERROR, @@ -3660,6 +3865,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: @@ -4007,6 +4214,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 */ @@ -4720,6 +5042,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 */ @@ -5791,9 +6139,9 @@ recordExtObjInitPriv(Oid objoid, Oid classoid) ReleaseSysCache(tuple); } - /* pg_largeobject_metadata */ - else if (classoid == LargeObjectMetadataRelationId) + else if (classoid == LargeObjectRelationId) { + /* For large objects, we must consult pg_largeobject_metadata */ Datum aclDatum; bool isNull; HeapTuple tuple; diff --git a/third_party/spanner_pg/src/backend/catalog/catalog.c b/third_party/spanner_pg/src/backend/catalog/catalog.c index 7cabe741..e784538a 100644 --- a/third_party/spanner_pg/src/backend/catalog/catalog.c +++ b/third_party/spanner_pg/src/backend/catalog/catalog.c @@ -5,7 +5,7 @@ * bits of hard-wired knowledge * * - * 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 * * @@ -31,7 +31,9 @@ #include "catalog/pg_authid.h" #include "catalog/pg_database.h" #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" @@ -120,9 +122,9 @@ bool IsCatalogRelationOid(Oid relid) { /* - * We consider a relation to be a system catalog if it has an OID that was - * manually assigned or assigned by genbki.pl. This includes all the - * defined catalogs, their indexes, and their TOAST tables and indexes. + * We consider a relation to be a system catalog if it has a pinned OID. + * This includes all the defined catalogs, their indexes, and their TOAST + * tables and indexes. * * This rule excludes the relations in information_schema, which are not * integral to the system and can be treated the same as user relations. @@ -132,7 +134,7 @@ IsCatalogRelationOid(Oid relid) * This test is reliable since an OID wraparound will skip this range of * OIDs; see GetNewObjectId(). */ - return (relid < (Oid) FirstBootstrapObjectId); + return (relid < (Oid) FirstUnpinnedObjectId); } /* @@ -246,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 || @@ -280,6 +285,8 @@ IsSharedRelation(Oid relationId) relationId == PgDatabaseToastIndex || relationId == PgDbRoleSettingToastTable || relationId == PgDbRoleSettingToastIndex || + relationId == PgParameterAclToastTable || + relationId == PgParameterAclToastIndex || relationId == PgReplicationOriginToastTable || relationId == PgReplicationOriginToastIndex || relationId == PgShdescriptionToastTable || @@ -294,6 +301,68 @@ IsSharedRelation(Oid relationId) return false; } +/* + * IsPinnedObject + * Given the class + OID identity of a database object, report whether + * it is "pinned", that is not droppable because the system requires it. + * + * We used to represent this explicitly in pg_depend, but that proved to be + * an undesirable amount of overhead, so now we rely on an OID range test. + */ +bool +IsPinnedObject(Oid classId, Oid objectId) +{ + /* + * Objects with OIDs above FirstUnpinnedObjectId are never pinned. Since + * the OID generator skips this range when wrapping around, this check + * guarantees that user-defined objects are never considered pinned. + */ + if (objectId >= FirstUnpinnedObjectId) + return false; + + /* + * Large objects are never pinned. We need this special case because + * their OIDs can be user-assigned. + */ + if (classId == LargeObjectRelationId) + return false; + + /* + * There are a few objects defined in the catalog .dat files that, as a + * matter of policy, we prefer not to treat as pinned. We used to handle + * that by excluding them from pg_depend, but it's just as easy to + * hard-wire their OIDs here. (If the user does indeed drop and recreate + * them, they'll have new but certainly-unpinned OIDs, so no problem.) + * + * Checking both classId and objectId is overkill, since OIDs below + * FirstGenbkiObjectId should be globally unique, but do it anyway for + * robustness. + */ + + /* 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 + * instance) but generating only the minimum required set of dependencies + * seems hard, and enforcing an accurate list would be much more expensive + * than the simple range test used here. + */ + return true; +} + /* * GetNewOidWithIndex @@ -533,7 +602,8 @@ pg_nextoid(PG_FUNCTION_ARGS) if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to call pg_nextoid()"))); + errmsg("must be superuser to call %s()", + "pg_nextoid"))); rel = table_open(reloid, RowExclusiveLock); idx = index_open(idxoid, RowExclusiveLock); @@ -580,5 +650,29 @@ pg_nextoid(PG_FUNCTION_ARGS) table_close(rel, RowExclusiveLock); index_close(idx, RowExclusiveLock); - return newoid; + PG_RETURN_OID(newoid); +} + +/* + * SQL callable interface for StopGeneratingPinnedObjectIds(). + * + * This is only to be used by initdb, so it's intentionally not documented in + * the user facing docs. + */ +Datum +pg_stop_making_pinned_objects(PG_FUNCTION_ARGS) +{ + /* + * Belt-and-suspenders check, since StopGeneratingPinnedObjectIds will + * fail anyway in non-single-user mode. + */ + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to call %s()", + "pg_stop_making_pinned_objects"))); + + StopGeneratingPinnedObjectIds(); + + PG_RETURN_VOID(); } diff --git a/third_party/spanner_pg/src/backend/catalog/dependency.c b/third_party/spanner_pg/src/backend/catalog/dependency.c index 404ced12..85e2a902 100644 --- a/third_party/spanner_pg/src/backend/catalog/dependency.c +++ b/third_party/spanner_pg/src/backend/catalog/dependency.c @@ -4,7 +4,7 @@ * Routines to support inter-object dependencies. * * - * 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 * * IDENTIFICATION @@ -18,6 +18,7 @@ #include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" +#include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" @@ -45,9 +46,11 @@ #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" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" #include "catalog/pg_rewrite.h" #include "catalog/pg_statistic_ext.h" @@ -71,6 +74,7 @@ #include "commands/sequence.h" #include "commands/trigger.h" #include "commands/typecmds.h" +#include "funcapi.h" #include "nodes/nodeFuncs.h" #include "parser/parsetree.h" #include "rewrite/rewriteRemove.h" @@ -176,7 +180,9 @@ 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 */ PublicationRelRelationId, /* OCLASS_PUBLICATION_REL */ SubscriptionRelationId, /* OCLASS_SUBSCRIPTION */ @@ -200,6 +206,8 @@ static void deleteOneObject(const ObjectAddress *object, static void doDeletion(const ObjectAddress *object, int flags); static bool find_expr_references_walker(Node *node, find_expr_references_context *context); +static void process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, + find_expr_references_context *context); static void eliminate_duplicate_dependencies(ObjectAddresses *addrs); static int object_address_comparator(const void *a, const void *b); static void add_object_address(ObjectClass oclass, Oid objectId, int32 subId, @@ -520,6 +528,16 @@ findDependentObjects(const ObjectAddress *object, if (object_address_present_add_flags(object, objflags, targetObjects)) return; + /* + * If the target object is pinned, we can just error out immediately; it + * won't have any objects recorded as depending on it. + */ + if (IsPinnedObject(object->classId, object->objectId)) + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because it is required by the database system", + getObjectDescription(object, false)))); + /* * The target object might be internally dependent on some other object * (its "owner"), and/or be a member of an extension (also considered its @@ -783,15 +801,6 @@ findDependentObjects(const ObjectAddress *object, objflags |= DEPFLAG_IS_PART; break; - case DEPENDENCY_PIN: - - /* - * Should not happen; PIN dependencies should have zeroes in - * the depender fields... - */ - elog(ERROR, "incorrect use of PIN dependency with %s", - getObjectDescription(object, false)); - break; default: elog(ERROR, "unrecognized dependency type '%c' for %s", foundDep->deptype, getObjectDescription(object, false)); @@ -920,18 +929,6 @@ findDependentObjects(const ObjectAddress *object, case DEPENDENCY_EXTENSION: subflags = DEPFLAG_EXTENSION; break; - case DEPENDENCY_PIN: - - /* - * For a PIN dependency we just ereport immediately; there - * won't be any others to report. - */ - ereport(ERROR, - (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), - errmsg("cannot drop %s because it is required by the database system", - getObjectDescription(object, false)))); - subflags = 0; /* keep compiler quiet */ - break; default: elog(ERROR, "unrecognized dependency type '%c' for %s", foundDep->deptype, getObjectDescription(object, false)); @@ -1207,7 +1204,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, @@ -1475,6 +1471,10 @@ doDeletion(const ObjectAddress *object, int flags) RemovePolicyById(object->objectId); break; + case OCLASS_PUBLICATION_NAMESPACE: + RemovePublicationSchemaById(object->objectId); + break; + case OCLASS_PUBLICATION_REL: RemovePublicationRelById(object->objectId); break; @@ -1512,6 +1512,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; @@ -1771,6 +1772,12 @@ find_expr_references_walker(Node *node, add_object_address(OCLASS_CLASS, rte->relid, var->varattno, context->addrs); } + else if (rte->rtekind == RTE_FUNCTION) + { + /* Might need to add a dependency on a composite type's column */ + /* (done out of line, because it's a bit bulky) */ + process_function_rte_ref(rte, var->varattno, context); + } /* * Vars referencing other RTE types require no additional work. In @@ -2345,6 +2352,65 @@ find_expr_references_walker(Node *node, (void *) context); } +/* + * find_expr_references_walker subroutine: handle a Var reference + * to an RTE_FUNCTION RTE + */ +static void +process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, + find_expr_references_context *context) +{ + int atts_done = 0; + ListCell *lc; + + /* + * Identify which RangeTblFunction produces this attnum, and see if it + * returns a composite type. If so, we'd better make a dependency on the + * referenced column of the composite type (or actually, of its associated + * relation). + */ + foreach(lc, rte->functions) + { + RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc); + + if (attnum > atts_done && + attnum <= atts_done + rtfunc->funccolcount) + { + TupleDesc tupdesc; + + tupdesc = get_expr_result_tupdesc(rtfunc->funcexpr, true); + if (tupdesc && tupdesc->tdtypeid != RECORDOID) + { + /* + * Named composite type, so individual columns could get + * dropped. Make a dependency on this specific column. + */ + Oid reltype = get_typ_typrelid(tupdesc->tdtypeid); + + Assert(attnum - atts_done <= tupdesc->natts); + if (OidIsValid(reltype)) /* can this fail? */ + add_object_address(OCLASS_CLASS, reltype, + attnum - atts_done, + context->addrs); + return; + } + /* Nothing to do; function's result type is handled elsewhere */ + return; + } + atts_done += rtfunc->funccolcount; + } + + /* If we get here, must be looking for the ordinality column */ + if (rte->funcordinality && attnum == atts_done + 1) + return; + + /* this probably can't happen ... */ + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column %d of relation \"%s\" does not exist", + attnum, rte->eref->aliasname))); +} + /* * Given an array of dependency references, eliminate any duplicates. */ @@ -2873,9 +2939,15 @@ getObjectClass(const ObjectAddress *object) case EventTriggerRelationId: return OCLASS_EVENT_TRIGGER; + case ParameterAclRelationId: + return OCLASS_PARAMETER_ACL; + case PolicyRelationId: return OCLASS_POLICY; + case PublicationNamespaceRelationId: + return OCLASS_PUBLICATION_NAMESPACE; + case PublicationRelationId: return OCLASS_PUBLICATION; diff --git a/third_party/spanner_pg/src/backend/catalog/genbki.pl b/third_party/spanner_pg/src/backend/catalog/genbki.pl index 78e0e3fe..14edbebd 100755 --- a/third_party/spanner_pg/src/backend/catalog/genbki.pl +++ b/third_party/spanner_pg/src/backend/catalog/genbki.pl @@ -6,7 +6,7 @@ # headers from specially formatted header files and data files. # postgres.bki is used to initialize the postgres template database. # -# 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 # # src/backend/catalog/genbki.pl @@ -29,6 +29,8 @@ my $major_version; my $include_path; +my $num_errors = 0; + GetOptions( 'output:s' => \$output_path, 'set-version:s' => \$major_version, @@ -173,14 +175,14 @@ # OIDs not specified in the input files are automatically assigned, -# starting at FirstGenbkiObjectId, extending up to FirstBootstrapObjectId. +# starting at FirstGenbkiObjectId, extending up to FirstUnpinnedObjectId. # We allow such OIDs to be assigned independently within each catalog. my $FirstGenbkiObjectId = Catalog::FindDefinedSymbol('access/transam.h', $include_path, 'FirstGenbkiObjectId'); -my $FirstBootstrapObjectId = +my $FirstUnpinnedObjectId = Catalog::FindDefinedSymbol('access/transam.h', $include_path, - 'FirstBootstrapObjectId'); + 'FirstUnpinnedObjectId'); # Hash of next available OID, indexed by catalog name. my %GenbkiNextOids; @@ -450,7 +452,7 @@ * %s_d.h * Macro definitions for %s * - * 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 * * NOTES @@ -474,6 +476,30 @@ printf $def "#define %s %s\n", $catalog->{rowtype_oid_macro}, $catalog->{rowtype_oid} if $catalog->{rowtype_oid_macro}; + + # Likewise for macros for toast, index, and other 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", + $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"; # .bki CREATE command for this catalog @@ -692,7 +718,7 @@ * schemapg.h * Schema_pg_xxx macros for use by relcache.c * - * 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 * * NOTES @@ -728,7 +754,7 @@ * system_fk_info.h * Data about the foreign-key relationships in the system catalogs * - * 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 * * NOTES @@ -793,7 +819,7 @@ Catalog::RenameTempFile($fk_info_file, $tmpext); Catalog::RenameTempFile($constraints_file, $tmpext); -exit 0; +exit($num_errors != 0 ? 1 : 0); #################### Subroutines ######################## @@ -895,12 +921,11 @@ sub morph_row_for_pgattr # Copy the type data from pg_type, and add some type-dependent items my $type = $types{$atttype}; - $row->{atttypid} = $type->{oid}; - $row->{attlen} = $type->{typlen}; - $row->{attbyval} = $type->{typbyval}; - $row->{attalign} = $type->{typalign}; - $row->{attstorage} = $type->{typstorage}; - $row->{attcompression} = '\0'; + $row->{atttypid} = $type->{oid}; + $row->{attlen} = $type->{typlen}; + $row->{attbyval} = $type->{typbyval}; + $row->{attalign} = $type->{typalign}; + $row->{attstorage} = $type->{typstorage}; # set attndims if it's an array type $row->{attndims} = $type->{typcategory} eq 'A' ? '1' : '0'; @@ -1021,8 +1046,7 @@ sub morph_row_for_schemapg # Perform OID lookups on an array of OID names. # If we don't have a unique value to substitute, warn and # leave the entry unchanged. -# (A warning seems sufficient because the bootstrap backend will reject -# non-numeric values anyway. So we might as well detect multiple problems +# (We don't exit right away so that we can detect multiple problems # within this genbki.pl run.) sub lookup_oids { @@ -1042,16 +1066,20 @@ sub lookup_oids push @lookupoids, $lookupname; if ($lookupname eq '-' or $lookupname eq '0') { - Carp::confess sprintf - "invalid zero OID reference in %s.dat field %s line %s\n", - $catname, $attname, $bki_values->{line_number} - if !$lookup_opt; + if (!$lookup_opt) + { + Carp::confess sprintf + "invalid zero OID reference in %s.dat field %s line %s\n", + $catname, $attname, $bki_values->{line_number}; + $num_errors++; + } } else { Carp::confess sprintf "unresolved OID reference \"%s\" in %s.dat field %s line %s\n", $lookupname, $catname, $attname, $bki_values->{line_number}; + $num_errors++; } } } @@ -1093,8 +1121,8 @@ sub assign_next_oid # Check that we didn't overrun available OIDs die - "genbki OID counter for $catname reached $result, overrunning FirstBootstrapObjectId\n" - if $result >= $FirstBootstrapObjectId; + "genbki OID counter for $catname reached $result, overrunning FirstUnpinnedObjectId\n" + if $result >= $FirstUnpinnedObjectId; return $result; } diff --git a/third_party/spanner_pg/src/backend/catalog/heap.c b/third_party/spanner_pg/src/backend/catalog/heap.c index 43b07134..3916971c 100644 --- a/third_party/spanner_pg/src/backend/catalog/heap.c +++ b/third_party/spanner_pg/src/backend/catalog/heap.c @@ -3,7 +3,7 @@ * heap.c * code to create and destroy POSTGRES heap relations * - * 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 * * @@ -30,19 +30,12 @@ #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 +54,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" @@ -74,18 +65,13 @@ #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 "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" #include "third_party/spanner_pg/shims/catalog_shim.h" @@ -94,7 +80,9 @@ /* Potentially set by pg_upgrade_support functions */ Oid binary_upgrade_next_heap_pg_class_oid = InvalidOid; +Oid binary_upgrade_next_heap_pg_class_relfilenode = InvalidOid; Oid binary_upgrade_next_toast_pg_class_oid = InvalidOid; +Oid binary_upgrade_next_toast_pg_class_relfilenode = InvalidOid; static void AddNewRelationTuple(Relation pg_class_desc, Relation new_rel_desc, @@ -289,8 +277,12 @@ SystemAttributeByName(const char *attname) * heap_create - Create an uncataloged heap relation * * Note API change: the caller must now always provide the OID - * to use for the relation. The relfilenode may (and, normally, - * should) be left unspecified. + * to use for the relation. The relfilenode may be (and in + * the simplest cases is) left unspecified. + * + * create_storage indicates whether or not to create the storage. + * However, even if create_storage is true, no storage will be + * created if the relkind is one that doesn't have storage. * * rel->rd_rel is initialized by RelationBuildLocalRelation, * and is mostly zeroes at return. @@ -310,9 +302,9 @@ heap_create(const char *relname, bool mapped_relation, bool allow_system_table_mods, TransactionId *relfrozenxid, - MultiXactId *relminmxid) + MultiXactId *relminmxid, + bool create_storage) { - bool create_storage; Relation rel; /* The caller must have provided an OID for the relation. */ @@ -340,47 +332,24 @@ heap_create(const char *relname, *relfrozenxid = InvalidTransactionId; *relminmxid = InvalidMultiXactId; - /* Handle reltablespace for specific relkinds. */ - switch (relkind) - { - case RELKIND_VIEW: - case RELKIND_COMPOSITE_TYPE: - case RELKIND_FOREIGN_TABLE: - - /* - * Force reltablespace to zero if the relation has no physical - * storage. This is mainly just for cleanliness' sake. - * - * Partitioned tables and indexes don't have physical storage - * either, but we want to keep their tablespace settings so that - * their children can inherit it. - */ - reltablespace = InvalidOid; - break; - - case RELKIND_SEQUENCE: - - /* - * Force reltablespace to zero for sequences, since we don't - * support moving them around into different tablespaces. - */ - reltablespace = InvalidOid; - break; - default: - break; - } - /* - * Decide whether to create storage. If caller passed a valid relfilenode, - * storage is already created, so don't do it here. Also don't create it - * for relkinds without physical storage. + * Force reltablespace to zero if the relation kind does not support + * tablespaces. This is mainly just for cleanliness' sake. */ - if (!RELKIND_HAS_STORAGE(relkind) || OidIsValid(relfilenode)) + if (!RELKIND_HAS_TABLESPACE(relkind)) + reltablespace = InvalidOid; + + /* Don't create storage for relkinds without physical storage. */ + if (!RELKIND_HAS_STORAGE(relkind)) create_storage = false; else { - create_storage = true; - relfilenode = relid; + /* + * If relfilenode is unspecified by the caller then create storage + * with oid same as relid. + */ + if (!OidIsValid(relfilenode)) + relfilenode = relid; } /* @@ -413,35 +382,20 @@ heap_create(const char *relname, /* * Have the storage manager create the relation's disk file, if needed. * - * For relations the callback creates both the main and the init fork, for - * indexes only the main fork is created. The other forks will be created - * on demand. + * For tables, the AM callback creates both the main and the init fork. + * For others, only the main fork is created; the other forks will be + * created on demand. */ if (create_storage) { - switch (rel->rd_rel->relkind) - { - case RELKIND_VIEW: - case RELKIND_COMPOSITE_TYPE: - case RELKIND_FOREIGN_TABLE: - case RELKIND_PARTITIONED_TABLE: - case RELKIND_PARTITIONED_INDEX: - Assert(false); - break; - - case RELKIND_INDEX: - case RELKIND_SEQUENCE: - RelationCreateStorage(rel->rd_node, relpersistence); - break; - - case RELKIND_RELATION: - case RELKIND_TOASTVALUE: - case RELKIND_MATVIEW: - table_relation_set_new_filenode(rel, &rel->rd_node, - relpersistence, - relfrozenxid, relminmxid); - break; - } + if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind)) + table_relation_set_new_filenode(rel, &rel->rd_node, + relpersistence, + relfrozenxid, relminmxid); + else if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) + RelationCreateStorage(rel->rd_node, relpersistence, true); + else + Assert(false); } /* @@ -453,6 +407,9 @@ heap_create(const char *relname, recordDependencyOnTablespace(RelationRelationId, relid, reltablespace); + /* ensure that stats are dropped if transaction aborts */ + pgstat_create_relation(rel); + return rel; } @@ -727,9 +684,10 @@ CheckAttributeType(const char *attname, * Construct and insert a set of tuples in pg_attribute. * * Caller has already opened and locked pg_attribute. tupdesc contains the - * attributes to insert. attcacheoff is always initialized to -1, attacl, - * attfdwoptions and attmissingval are always initialized to NULL. attoptions - * must contain the same number of elements as tupdesc, or be NULL. + * attributes to insert. attcacheoff is always initialized to -1. attoptions + * supplies the values for the attoptions fields and must contain the same + * number of elements as tupdesc or be NULL. The other variable-length fields + * of pg_attribute are always initialized to null values. * * indstate is the index state for CatalogTupleInsertWithInfo. It can be * passed as NULL, in which case we'll fetch the necessary info. (Don't do @@ -1018,29 +976,16 @@ AddNewRelationTuple(Relation pg_class_desc, */ new_rel_reltup = new_rel_desc->rd_rel; - switch (relkind) + /* The relation is empty */ + new_rel_reltup->relpages = 0; + new_rel_reltup->reltuples = -1; + new_rel_reltup->relallvisible = 0; + + /* Sequences always have a known size */ + if (relkind == RELKIND_SEQUENCE) { - case RELKIND_RELATION: - case RELKIND_MATVIEW: - case RELKIND_INDEX: - case RELKIND_TOASTVALUE: - /* The relation is real, but as yet empty */ - new_rel_reltup->relpages = 0; - new_rel_reltup->reltuples = -1; - new_rel_reltup->relallvisible = 0; - break; - case RELKIND_SEQUENCE: - /* Sequences always have a known size */ - new_rel_reltup->relpages = 1; - new_rel_reltup->reltuples = 1; - new_rel_reltup->relallvisible = 0; - break; - default: - /* Views, etc, have no disk storage */ - new_rel_reltup->relpages = 0; - new_rel_reltup->reltuples = -1; - new_rel_reltup->relallvisible = 0; - break; + new_rel_reltup->relpages = 1; + new_rel_reltup->reltuples = 1; } new_rel_reltup->relfrozenxid = relfrozenxid; @@ -1175,6 +1120,9 @@ heap_create_with_catalog(const char *relname, Oid existing_relid; Oid old_type_oid; Oid new_type_oid; + + /* By default set to InvalidOid unless overridden by binary-upgrade */ + Oid relfilenode = InvalidOid; TransactionId relfrozenxid; MultiXactId relminmxid; @@ -1237,30 +1185,57 @@ heap_create_with_catalog(const char *relname, */ if (!OidIsValid(relid)) { - /* Use binary-upgrade override for pg_class.oid/relfilenode? */ - if (IsBinaryUpgrade && - (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE || - relkind == RELKIND_VIEW || relkind == RELKIND_MATVIEW || - relkind == RELKIND_COMPOSITE_TYPE || relkind == RELKIND_FOREIGN_TABLE || - relkind == RELKIND_PARTITIONED_TABLE)) + /* Use binary-upgrade override for pg_class.oid and relfilenode */ + if (IsBinaryUpgrade) { - if (!OidIsValid(binary_upgrade_next_heap_pg_class_oid)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pg_class heap OID value not set when in binary upgrade mode"))); + /* + * Indexes are not supported here; they use + * binary_upgrade_next_index_pg_class_oid. + */ + Assert(relkind != RELKIND_INDEX); + Assert(relkind != RELKIND_PARTITIONED_INDEX); - relid = binary_upgrade_next_heap_pg_class_oid; - binary_upgrade_next_heap_pg_class_oid = InvalidOid; - } - /* There might be no TOAST table, so we have to test for it. */ - else if (IsBinaryUpgrade && - OidIsValid(binary_upgrade_next_toast_pg_class_oid) && - relkind == RELKIND_TOASTVALUE) - { - relid = binary_upgrade_next_toast_pg_class_oid; - binary_upgrade_next_toast_pg_class_oid = InvalidOid; + if (relkind == RELKIND_TOASTVALUE) + { + /* There might be no TOAST table, so we have to test for it. */ + if (OidIsValid(binary_upgrade_next_toast_pg_class_oid)) + { + relid = binary_upgrade_next_toast_pg_class_oid; + binary_upgrade_next_toast_pg_class_oid = InvalidOid; + + if (!OidIsValid(binary_upgrade_next_toast_pg_class_relfilenode)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("toast relfilenode value not set when in binary upgrade mode"))); + + relfilenode = binary_upgrade_next_toast_pg_class_relfilenode; + binary_upgrade_next_toast_pg_class_relfilenode = InvalidOid; + } + } + else + { + if (!OidIsValid(binary_upgrade_next_heap_pg_class_oid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pg_class heap OID value not set when in binary upgrade mode"))); + + relid = binary_upgrade_next_heap_pg_class_oid; + binary_upgrade_next_heap_pg_class_oid = InvalidOid; + + if (RELKIND_HAS_STORAGE(relkind)) + { + if (!OidIsValid(binary_upgrade_next_heap_pg_class_relfilenode)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("relfilenode value not set when in binary upgrade mode"))); + + relfilenode = binary_upgrade_next_heap_pg_class_relfilenode; + binary_upgrade_next_heap_pg_class_relfilenode = InvalidOid; + } + } } - else + + if (!OidIsValid(relid)) relid = GetNewRelFileNode(reltablespace, pg_class_desc, relpersistence); } @@ -1296,12 +1271,16 @@ heap_create_with_catalog(const char *relname, * Create the relcache entry (mostly dummy at this point) and the physical * disk file. (If we fail further down, it's the smgr's responsibility to * remove the disk file again.) + * + * NB: Note that passing create_storage = true is correct even for binary + * upgrade. The storage we create here will be replaced later, but we + * need to have something on disk in the meanwhile. */ new_rel_desc = heap_create(relname, relnamespace, reltablespace, relid, - InvalidOid, + relfilenode, accessmtd, tupdesc, relkind, @@ -1310,7 +1289,8 @@ heap_create_with_catalog(const char *relname, mapped_relation, allow_system_table_mods, &relfrozenxid, - &relminmxid); + &relminmxid, + true); Assert(relid == RelationGetRelid(new_rel_desc)); @@ -1471,13 +1451,12 @@ heap_create_with_catalog(const char *relname, /* * Make a dependency link to force the relation to be deleted if its - * access method is. Do this only for relation and materialized views. + * access method is. * * No need to add an explicit dependency for the toast table, as the * main table depends on it. */ - if (relkind == RELKIND_RELATION || - relkind == RELKIND_MATVIEW) + if (RELKIND_HAS_TABLE_AM(relkind) && relkind != RELKIND_TOASTVALUE) { ObjectAddressSet(referenced, AccessMethodRelationId, accessmtd); add_exact_object_address(&referenced, addrs); @@ -1771,131 +1750,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 * @@ -2006,6 +1860,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 @@ -2207,195 +2064,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. * @@ -2488,6 +2156,8 @@ StoreRelCheck(Relation rel, const char *ccname, Node *expr, 0, ' ', ' ', + NULL, + 0, ' ', NULL, /* not an exclusion constraint */ expr, /* Tree form of check constraint */ @@ -2662,7 +2332,8 @@ AddRelationNewConstraints(Relation rel, continue; /* If the DEFAULT is volatile we cannot use a missing value */ - if (colDef->missingMode && contain_volatile_functions((Node *) expr)) + if (colDef->missingMode && + contain_volatile_functions_after_planning((Expr *) expr)) colDef->missingMode = false; defOid = StoreAttrDefault(rel, colDef->attnum, expr, is_internal, @@ -3097,9 +2768,11 @@ cookDefault(ParseState *pstate, if (attgenerated) { + /* Disallow refs to other generated columns */ check_nested_generated(pstate, expr); - if (contain_mutable_functions(expr)) + /* Disallow mutable functions */ + if (contain_mutable_functions_after_planning((Expr *) expr)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("generation expression is not immutable"))); @@ -3554,9 +3227,8 @@ heap_truncate_find_FKs(List *relationIds) /* * If this constraint has a parent constraint which we have not seen * yet, keep track of it for the second loop, below. Tracking parent - * constraints allows us to climb up to the top-level level constraint - * and look for all possible relations referencing the partitioned - * table. + * constraints allows us to climb up to the top-level constraint and + * look for all possible relations referencing the partitioned table. */ if (OidIsValid(con->conparentid) && !list_member_oid(parent_cons, con->conparentid)) diff --git a/third_party/spanner_pg/src/backend/catalog/index.c b/third_party/spanner_pg/src/backend/catalog/index.c index e730b6f2..2277f2f9 100644 --- a/third_party/spanner_pg/src/backend/catalog/index.c +++ b/third_party/spanner_pg/src/backend/catalog/index.c @@ -3,7 +3,7 @@ * index.c * code to create and destroy POSTGRES index relations * - * 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 * * @@ -91,6 +91,7 @@ /* Potentially set by pg_upgrade_support functions */ Oid binary_upgrade_next_index_pg_class_oid = InvalidOid; +Oid binary_upgrade_next_index_pg_class_relfilenode = InvalidOid; /* * Pointer-free representation of variables used when reindexing system @@ -617,6 +618,7 @@ UpdateIndexRelation(Oid indexoid, values[Anum_pg_index_indnatts - 1] = Int16GetDatum(indexInfo->ii_NumIndexAttrs); values[Anum_pg_index_indnkeyatts - 1] = Int16GetDatum(indexInfo->ii_NumIndexKeyAttrs); values[Anum_pg_index_indisunique - 1] = BoolGetDatum(indexInfo->ii_Unique); + values[Anum_pg_index_indnullsnotdistinct - 1] = BoolGetDatum(indexInfo->ii_NullsNotDistinct); values[Anum_pg_index_indisprimary - 1] = BoolGetDatum(primary); values[Anum_pg_index_indisexclusion - 1] = BoolGetDatum(isexclusion); values[Anum_pg_index_indimmediate - 1] = BoolGetDatum(immediate); @@ -737,6 +739,7 @@ index_create(Relation heapRelation, char relkind; TransactionId relfrozenxid; MultiXactId relminmxid; + bool create_storage = !OidIsValid(relFileNode); /* constraint flags can only be set when a constraint is requested */ Assert((constr_flags == 0) || @@ -908,7 +911,7 @@ index_create(Relation heapRelation, */ if (!OidIsValid(indexRelationId)) { - /* Use binary-upgrade override for pg_class.oid/relfilenode? */ + /* Use binary-upgrade override for pg_class.oid and relfilenode */ if (IsBinaryUpgrade) { if (!OidIsValid(binary_upgrade_next_index_pg_class_oid)) @@ -918,6 +921,22 @@ index_create(Relation heapRelation, indexRelationId = binary_upgrade_next_index_pg_class_oid; binary_upgrade_next_index_pg_class_oid = InvalidOid; + + /* Override the index relfilenode */ + if ((relkind == RELKIND_INDEX) && + (!OidIsValid(binary_upgrade_next_index_pg_class_relfilenode))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("index relfilenode value not set when in binary upgrade mode"))); + relFileNode = binary_upgrade_next_index_pg_class_relfilenode; + binary_upgrade_next_index_pg_class_relfilenode = InvalidOid; + + /* + * Note that we want create_storage = true for binary upgrade. The + * storage we create here will be replaced later, but we need to + * have something on disk in the meanwhile. + */ + Assert(create_storage); } else { @@ -944,7 +963,8 @@ index_create(Relation heapRelation, mapped_relation, allow_system_table_mods, &relfrozenxid, - &relminmxid); + &relminmxid, + create_storage); Assert(relfrozenxid == InvalidTransactionId); Assert(relminmxid == InvalidMultiXactId); @@ -1353,6 +1373,7 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, indexExprs, indexPreds, oldInfo->ii_Unique, + oldInfo->ii_NullsNotDistinct, false, /* not ready for inserts */ true); @@ -1735,30 +1756,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 (newClassRel->pgstat_info) - { - 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); @@ -1991,6 +1990,8 @@ index_constraint_create(Relation heapRelation, 0, ' ', ' ', + NULL, + 0, ' ', indexInfo->ii_ExclusionOps, NULL, /* no check constraint */ @@ -2326,9 +2327,12 @@ index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode) /* * Schedule physical removal of the files (if any) */ - if (userIndexRelation->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + if (RELKIND_HAS_STORAGE(userIndexRelation->rd_rel->relkind)) RelationDropStorage(userIndexRelation); + /* ensure that stats are dropped if transaction commits */ + pgstat_drop_relation(userIndexRelation); + /* * Close and flush the index's relcache entry, to ensure relcache doesn't * try to rebuild it while we're deleting catalog entries. We keep the @@ -2441,6 +2445,7 @@ BuildIndexInfo(Relation index) RelationGetIndexExpressions(index), RelationGetIndexPredicate(index), indexStruct->indisunique, + indexStruct->indnullsnotdistinct, indexStruct->indisready, false); @@ -2500,6 +2505,7 @@ BuildDummyIndexInfo(Relation index) RelationGetDummyIndexExpressions(index), NIL, indexStruct->indisunique, + indexStruct->indnullsnotdistinct, indexStruct->indisready, false); @@ -2533,6 +2539,9 @@ CompareIndexInfo(IndexInfo *info1, IndexInfo *info2, if (info1->ii_Unique != info2->ii_Unique) return false; + if (info1->ii_NullsNotDistinct != info2->ii_NullsNotDistinct) + return false; + /* indexes are only equivalent if they have the same access method */ if (info1->ii_Am != info2->ii_Am) return false; @@ -3368,7 +3377,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 */ @@ -3615,7 +3624,24 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, * Open the target index relation and get an exclusive lock on it, to * ensure that no one else is touching this particular index. */ - iRel = index_open(indexId, AccessExclusiveLock); + if ((params->options & REINDEXOPT_MISSING_OK) != 0) + iRel = try_index_open(indexId, AccessExclusiveLock); + else + iRel = index_open(indexId, AccessExclusiveLock); + + /* if index relation is gone, leave */ + if (!iRel) + { + /* Roll back any GUC changes */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + + /* Close parent heap relation, but keep locks */ + table_close(heapRelation, NoLock); + return; + } if (progress) pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID, diff --git a/third_party/spanner_pg/src/backend/catalog/indexing.c b/third_party/spanner_pg/src/backend/catalog/indexing.c index 4d1440cd..0b920933 100644 --- a/third_party/spanner_pg/src/backend/catalog/indexing.c +++ b/third_party/spanner_pg/src/backend/catalog/indexing.c @@ -4,7 +4,7 @@ * This file contains routines to support indexes defined on system * catalogs. * - * 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/third_party/spanner_pg/src/backend/catalog/information_schema.sql b/third_party/spanner_pg/src/backend/catalog/information_schema.sql index 11d9dd60..18725a02 100644 --- a/third_party/spanner_pg/src/backend/catalog/information_schema.sql +++ b/third_party/spanner_pg/src/backend/catalog/information_schema.sql @@ -2,7 +2,7 @@ * SQL Information Schema * as defined in ISO/IEC 9075-11:2016 * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * 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'); @@ -1838,7 +1840,11 @@ CREATE VIEW table_constraints AS AS is_deferrable, CAST(CASE WHEN c.condeferred THEN 'YES' ELSE 'NO' END AS yes_or_no) AS initially_deferred, - CAST('YES' AS yes_or_no) AS enforced + CAST('YES' AS yes_or_no) AS enforced, + CAST(CASE WHEN c.contype = 'u' + THEN CASE WHEN (SELECT NOT indnullsnotdistinct FROM pg_index WHERE indexrelid = conindid) THEN 'YES' ELSE 'NO' END + END + AS yes_or_no) AS nulls_distinct FROM pg_namespace nc, pg_namespace nr, @@ -1868,7 +1874,8 @@ CREATE VIEW table_constraints AS CAST('CHECK' AS character_data) AS constraint_type, CAST('NO' AS yes_or_no) AS is_deferrable, CAST('NO' AS yes_or_no) AS initially_deferred, - CAST('YES' AS yes_or_no) AS enforced + CAST('YES' AS yes_or_no) AS enforced, + CAST(NULL AS yes_or_no) AS nulls_distinct FROM pg_namespace nr, pg_class r, diff --git a/third_party/spanner_pg/src/backend/catalog/namespace.c b/third_party/spanner_pg/src/backend/catalog/namespace.c index b62c43f0..509fb83d 100644 --- a/third_party/spanner_pg/src/backend/catalog/namespace.c +++ b/third_party/spanner_pg/src/backend/catalog/namespace.c @@ -9,7 +9,7 @@ * and implementing search-path-controlled searches. * * - * 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 * * IDENTIFICATION @@ -3057,7 +3057,7 @@ CheckSetNamespace(Oid oldNspOid, Oid nspOid) /* * QualifiedNameGetCreationNamespace - * Given a possibly-qualified name for an object (in List-of-Values + * Given a possibly-qualified name for an object (in List-of-Strings * format), determine what namespace the object should be created in. * Also extract and return the object name (last component of list). * @@ -3171,7 +3171,7 @@ makeRangeVarFromNameList(List *names) * This is used primarily to form error messages, and so we do not quote * the list elements, for the sake of legibility. * - * In most scenarios the list elements should always be Value strings, + * In most scenarios the list elements should always be String values, * but we also allow A_Star for the convenience of ColumnRef processing. */ char * diff --git a/third_party/spanner_pg/src/backend/catalog/objectaccess.c b/third_party/spanner_pg/src/backend/catalog/objectaccess.c index 4aa445a0..1c51df02 100644 --- a/third_party/spanner_pg/src/backend/catalog/objectaccess.c +++ b/third_party/spanner_pg/src/backend/catalog/objectaccess.c @@ -3,7 +3,7 @@ * objectaccess.c * functions for object_access_hook on various events * - * 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 * * ------------------------------------------------------------------------- @@ -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/third_party/spanner_pg/src/backend/catalog/objectaddress.c b/third_party/spanner_pg/src/backend/catalog/objectaddress.c index 728316de..12734f81 100644 --- a/third_party/spanner_pg/src/backend/catalog/objectaddress.c +++ b/third_party/spanner_pg/src/backend/catalog/objectaddress.c @@ -3,7 +3,7 @@ * objectaddress.c * functions for working with ObjectAddresses * - * 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 * * @@ -45,9 +45,11 @@ #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" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" #include "catalog/pg_rewrite.h" #include "catalog/pg_statistic_ext.h" @@ -819,6 +821,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 @@ -827,6 +833,10 @@ static const struct object_type_map { "publication", OBJECT_PUBLICATION }, + /* OCLASS_PUBLICATION_NAMESPACE */ + { + "publication namespace", OBJECT_PUBLICATION_NAMESPACE + }, /* OCLASS_PUBLICATION_REL */ { "publication relation", OBJECT_PUBLICATION_REL @@ -853,7 +863,7 @@ const ObjectAddress InvalidObjectAddress = }; static ObjectAddress get_object_address_unqualified(ObjectType objtype, - Value *strval, bool missing_ok); + String *strval, bool missing_ok); static ObjectAddress get_relation_by_qualified_name(ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok); @@ -877,6 +887,8 @@ static ObjectAddress get_object_address_usermapping(List *object, static ObjectAddress get_object_address_publication_rel(List *object, Relation *relp, bool missing_ok); +static ObjectAddress get_object_address_publication_schema(List *object, + bool missing_ok); static ObjectAddress get_object_address_defacl(List *object, bool missing_ok); static const ObjectPropertyType *get_object_property_data(Oid class_id); @@ -997,7 +1009,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: @@ -1009,11 +1020,12 @@ 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: address = get_object_address_unqualified(objtype, - (Value *) object, missing_ok); + castNode(String, object), missing_ok); break; case OBJECT_TYPE: case OBJECT_DOMAIN: @@ -1115,6 +1127,10 @@ get_object_address(ObjectType objtype, Node *object, address = get_object_address_usermapping(castNode(List, object), missing_ok); break; + case OBJECT_PUBLICATION_NAMESPACE: + address = get_object_address_publication_schema(castNode(List, object), + missing_ok); + break; case OBJECT_PUBLICATION_REL: address = get_object_address_publication_rel(castNode(List, object), &relation, @@ -1246,7 +1262,7 @@ get_object_address_rv(ObjectType objtype, RangeVar *rel, List *object, */ static ObjectAddress get_object_address_unqualified(ObjectType objtype, - Value *strval, bool missing_ok) + String *strval, bool missing_ok) { const char *name; ObjectAddress address; @@ -1306,6 +1322,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); @@ -1569,39 +1590,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) @@ -1937,6 +1930,49 @@ get_object_address_publication_rel(List *object, return address; } +/* + * Find the ObjectAddress for a publication schema. The first element of the + * object parameter is the schema name, the second is the publication name. + */ +static ObjectAddress +get_object_address_publication_schema(List *object, bool missing_ok) +{ + ObjectAddress address; + Publication *pub; + char *pubname; + char *schemaname; + Oid schemaid; + + ObjectAddressSet(address, PublicationNamespaceRelationId, InvalidOid); + + /* Fetch schema name and publication name from input list */ + schemaname = strVal(linitial(object)); + pubname = strVal(lsecond(object)); + + schemaid = get_namespace_oid(schemaname, missing_ok); + if (!OidIsValid(schemaid)) + return address; + + /* Now look up the pg_publication tuple */ + pub = GetPublicationByName(pubname, missing_ok); + if (!pub) + return address; + + /* Find the publication schema mapping in syscache */ + address.objectId = + GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, + Anum_pg_publication_namespace_oid, + ObjectIdGetDatum(schemaid), + ObjectIdGetDatum(pub->oid)); + if (!OidIsValid(address.objectId) && !missing_ok) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("publication schema \"%s\" in publication \"%s\" does not exist", + schemaname, pubname))); + + return address; +} + /* * Find the ObjectAddress for a default ACL. */ @@ -2205,9 +2241,16 @@ pg_get_object_address(PG_FUNCTION_ARGS) */ switch (type) { + case OBJECT_PUBLICATION_NAMESPACE: + case OBJECT_USER_MAPPING: + if (list_length(name) != 1) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("name list length must be exactly %d", 1))); + /* fall through to check args length */ + /* FALLTHROUGH */ case OBJECT_DOMCONSTRAINT: case OBJECT_CAST: - case OBJECT_USER_MAPPING: case OBJECT_PUBLICATION_REL: case OBJECT_DEFACL: case OBJECT_TRANSFORM: @@ -2279,6 +2322,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: @@ -2302,6 +2346,7 @@ pg_get_object_address(PG_FUNCTION_ARGS) case OBJECT_PUBLICATION_REL: objnode = (Node *) list_make2(name, linitial(args)); break; + case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_USER_MAPPING: objnode = (Node *) list_make2(linitial(name), linitial(args)); break; @@ -2389,7 +2434,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_DATABASE: if (!pg_database_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_TYPE: case OBJECT_DOMAIN: @@ -2436,7 +2481,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_SCHEMA: if (!pg_namespace_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_COLLATION: if (!pg_collation_ownercheck(address.objectId, roleid)) @@ -2451,27 +2496,27 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_EXTENSION: if (!pg_extension_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_FDW: if (!pg_foreign_data_wrapper_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_FOREIGN_SERVER: if (!pg_foreign_server_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_EVENT_TRIGGER: if (!pg_event_trigger_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_LANGUAGE: if (!pg_language_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_OPCLASS: if (!pg_opclass_ownercheck(address.objectId, roleid)) @@ -2511,12 +2556,12 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_PUBLICATION: if (!pg_publication_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_SUBSCRIPTION: if (!pg_subscription_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_TRANSFORM: { @@ -2530,7 +2575,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address, case OBJECT_TABLESPACE: if (!pg_tablespace_ownercheck(address.objectId, roleid)) aclcheck_error(ACLCHECK_NOT_OWNER, objtype, - strVal((Value *) object)); + strVal(object)); break; case OBJECT_TSDICTIONARY: if (!pg_ts_dict_ownercheck(address.objectId, roleid)) @@ -2566,6 +2611,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, @@ -2851,6 +2897,55 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) return tuple; } +/* + * getPublicationSchemaInfo + * + * 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. + */ +static bool +getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, + char **pubname, char **nspname) +{ + HeapTuple tup; + Form_pg_publication_namespace pnform; + + tup = SearchSysCache1(PUBLICATIONNAMESPACE, + ObjectIdGetDatum(object->objectId)); + if (!HeapTupleIsValid(tup)) + { + if (!missing_ok) + elog(ERROR, "cache lookup failed for publication schema %u", + object->objectId); + return false; + } + + pnform = (Form_pg_publication_namespace) GETSTRUCT(tup); + *pubname = get_publication_name(pnform->pnpubid, missing_ok); + if (!(*pubname)) + { + ReleaseSysCache(tup); + return false; + } + + *nspname = get_namespace_name(pnform->pnnspid); + if (!(*nspname)) + { + Oid schemaid = pnform->pnnspid; + + pfree(*pubname); + ReleaseSysCache(tup); + if (!missing_ok) + elog(ERROR, "cache lookup failed for schema %u", + schemaid); + return false; + } + + ReleaseSysCache(tup); + return true; +} + /* * getObjectDescription: build an object description for messages * @@ -3059,48 +3154,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); - - 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); + colobject = GetAttrDefaultColumnAddress(object->objectId); - 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; } @@ -3819,6 +3887,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; @@ -3875,6 +3969,22 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } + case OCLASS_PUBLICATION_NAMESPACE: + { + char *pubname; + char *nspname; + + if (!getPublicationSchemaInfo(object, missing_ok, + &pubname, &nspname)) + break; + + appendStringInfo(&buffer, _("publication of schema %s in publication %s"), + nspname, pubname); + pfree(pubname); + pfree(nspname); + break; + } + case OCLASS_PUBLICATION_REL: { HeapTuple tup; @@ -4468,6 +4578,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; @@ -4476,6 +4590,10 @@ getObjectTypeDescription(const ObjectAddress *object, bool missing_ok) appendStringInfoString(&buffer, "publication"); break; + case OCLASS_PUBLICATION_NAMESPACE: + appendStringInfoString(&buffer, "publication namespace"); + break; + case OCLASS_PUBLICATION_REL: appendStringInfoString(&buffer, "publication relation"); break; @@ -4884,50 +5002,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); - - tup = systable_getnext(adscan); + colobject = GetAttrDefaultColumnAddress(object->objectId); - 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; } @@ -5539,7 +5629,6 @@ getObjectIdentityParts(const ObjectAddress *object, systable_endscan(rcscan); table_close(defaclrel, AccessShareLock); break; - } defacl = (Form_pg_default_acl) GETSTRUCT(tup); @@ -5638,6 +5727,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; @@ -5686,6 +5803,30 @@ getObjectIdentityParts(const ObjectAddress *object, break; } + case OCLASS_PUBLICATION_NAMESPACE: + { + char *pubname; + char *nspname; + + if (!getPublicationSchemaInfo(object, missing_ok, &pubname, + &nspname)) + break; + appendStringInfo(&buffer, "%s in publication %s", + nspname, pubname); + + if (objargs) + *objargs = list_make1(pubname); + else + pfree(pubname); + + if (objname) + *objname = list_make1(nspname); + else + pfree(nspname); + + break; + } + case OCLASS_PUBLICATION_REL: { HeapTuple tup; diff --git a/third_party/spanner_pg/src/backend/catalog/partition.c b/third_party/spanner_pg/src/backend/catalog/partition.c index c873e88c..0ff7ed03 100644 --- a/third_party/spanner_pg/src/backend/catalog/partition.c +++ b/third_party/spanner_pg/src/backend/catalog/partition.c @@ -3,7 +3,7 @@ * partition.c * Partitioning related data structures and functions. * - * 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/third_party/spanner_pg/src/backend/catalog/pg_aggregate.c b/third_party/spanner_pg/src/backend/catalog/pg_aggregate.c index 2e6401b4..14693ba2 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_aggregate.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_aggregate.c @@ -3,7 +3,7 @@ * pg_aggregate.c * routines to support manipulation of the pg_aggregate relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_attrdef.c b/third_party/spanner_pg/src/backend/catalog/pg_attrdef.c new file mode 100644 index 00000000..c5d4a991 --- /dev/null +++ b/third_party/spanner_pg/src/backend/catalog/pg_attrdef.c @@ -0,0 +1,413 @@ +/*------------------------------------------------------------------------- + * + * 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. 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, + attgenerated ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); + + /* + * Record dependencies on objects used in the expression, too. + */ + 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/third_party/spanner_pg/src/backend/catalog/pg_cast.c b/third_party/spanner_pg/src/backend/catalog/pg_cast.c index b9cda3cf..4857f646 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_cast.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_cast.c @@ -3,7 +3,7 @@ * pg_cast.c * routines to support manipulation of the pg_cast relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_class.c b/third_party/spanner_pg/src/backend/catalog/pg_class.c new file mode 100644 index 00000000..b696fa2a --- /dev/null +++ b/third_party/spanner_pg/src/backend/catalog/pg_class.c @@ -0,0 +1,52 @@ +/*------------------------------------------------------------------------- + * + * pg_class.c + * routines to support manipulation of the pg_class 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_class.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/pg_class.h" + +/* + * Issue an errdetail() informing that the relkind is not supported for this + * operation. + */ +int +errdetail_relkind_not_supported(char relkind) +{ + switch (relkind) + { + case RELKIND_RELATION: + return errdetail("This operation is not supported for tables."); + case RELKIND_INDEX: + return errdetail("This operation is not supported for indexes."); + case RELKIND_SEQUENCE: + return errdetail("This operation is not supported for sequences."); + case RELKIND_TOASTVALUE: + return errdetail("This operation is not supported for TOAST tables."); + case RELKIND_VIEW: + return errdetail("This operation is not supported for views."); + case RELKIND_MATVIEW: + return errdetail("This operation is not supported for materialized views."); + case RELKIND_COMPOSITE_TYPE: + return errdetail("This operation is not supported for composite types."); + case RELKIND_FOREIGN_TABLE: + return errdetail("This operation is not supported for foreign tables."); + case RELKIND_PARTITIONED_TABLE: + return errdetail("This operation is not supported for partitioned tables."); + case RELKIND_PARTITIONED_INDEX: + return errdetail("This operation is not supported for partitioned indexes."); + default: + elog(ERROR, "unrecognized relkind: '%c'", relkind); + return 0; + } +} diff --git a/third_party/spanner_pg/src/backend/catalog/pg_collation.c b/third_party/spanner_pg/src/backend/catalog/pg_collation.c index b1137ca3..6081bf58 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_collation.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_collation.c @@ -3,7 +3,7 @@ * pg_collation.c * routines to support manipulation of the pg_collation relation * - * 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 * * @@ -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) @@ -58,9 +59,7 @@ CollationCreate(const char *collname, Oid collnamespace, HeapTuple tup; Datum values[Natts_pg_collation]; bool nulls[Natts_pg_collation]; - NameData name_name, - name_collate, - name_ctype; + NameData name_name; Oid oid; ObjectAddress myself, referenced; @@ -68,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. @@ -184,10 +182,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); - namestrcpy(&name_collate, collcollate); - values[Anum_pg_collation_collcollate - 1] = NameGetDatum(&name_collate); - namestrcpy(&name_ctype, collctype); - values[Anum_pg_collation_collctype - 1] = NameGetDatum(&name_ctype); + 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/third_party/spanner_pg/src/backend/catalog/pg_constraint.c b/third_party/spanner_pg/src/backend/catalog/pg_constraint.c index 7ddd34f5..f663ba3b 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_constraint.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_constraint.c @@ -3,7 +3,7 @@ * pg_constraint.c * routines to support manipulation of the pg_constraint relation * - * 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 * * @@ -70,6 +70,8 @@ CreateConstraintEntry(const char *constraintName, int foreignNKeys, char foreignUpdateType, char foreignDeleteType, + const int16 *fkDeleteSetCols, + int numFkDeleteSetCols, char foreignMatchType, const Oid *exclOp, Node *conExpr, @@ -90,6 +92,7 @@ CreateConstraintEntry(const char *constraintName, ArrayType *conppeqopArray; ArrayType *conffeqopArray; ArrayType *conexclopArray; + ArrayType *confdelsetcolsArray; NameData cname; int i; ObjectAddress conobject; @@ -138,6 +141,16 @@ CreateConstraintEntry(const char *constraintName, fkdatums[i] = ObjectIdGetDatum(ffEqOp[i]); conffeqopArray = construct_array(fkdatums, foreignNKeys, OIDOID, sizeof(Oid), true, TYPALIGN_INT); + + if (numFkDeleteSetCols > 0) + { + for (i = 0; i < numFkDeleteSetCols; i++) + fkdatums[i] = Int16GetDatum(fkDeleteSetCols[i]); + confdelsetcolsArray = construct_array(fkdatums, numFkDeleteSetCols, + INT2OID, 2, true, TYPALIGN_SHORT); + } + else + confdelsetcolsArray = NULL; } else { @@ -145,6 +158,7 @@ CreateConstraintEntry(const char *constraintName, conpfeqopArray = NULL; conppeqopArray = NULL; conffeqopArray = NULL; + confdelsetcolsArray = NULL; } if (exclOp != NULL) @@ -213,6 +227,11 @@ CreateConstraintEntry(const char *constraintName, else nulls[Anum_pg_constraint_conffeqop - 1] = true; + if (confdelsetcolsArray) + values[Anum_pg_constraint_confdelsetcols - 1] = PointerGetDatum(confdelsetcolsArray); + else + nulls[Anum_pg_constraint_confdelsetcols - 1] = true; + if (conexclopArray) values[Anum_pg_constraint_conexclop - 1] = PointerGetDatum(conexclopArray); else @@ -1170,13 +1189,15 @@ get_primary_key_attnos_UNUSED_SPANGRES(Oid relid, bool deferrableOk, Oid *constr /* * Extract data from the pg_constraint tuple of a foreign-key constraint. * - * All arguments save the first are output arguments; the last three of them - * can be passed as NULL if caller doesn't need them. + * All arguments save the first are output arguments. All output arguments + * other than numfks, conkey and confkey can be passed as NULL if caller + * doesn't need them. */ void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, - Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs) + Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs, + int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols) { Oid constrId; Datum adatum; @@ -1273,6 +1294,32 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, pfree(arr); /* free de-toasted copy, if any */ } + if (fk_del_set_cols) + { + adatum = SysCacheGetAttr(CONSTROID, tuple, + Anum_pg_constraint_confdelsetcols, &isNull); + if (isNull) + { + *num_fk_del_set_cols = 0; + } + else + { + int num_delete_cols; + + arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */ + if (ARR_NDIM(arr) != 1 || + ARR_HASNULL(arr) || + ARR_ELEMTYPE(arr) != INT2OID) + elog(ERROR, "confdelsetcols is not a 1-D smallint array"); + num_delete_cols = ARR_DIMS(arr)[0]; + memcpy(fk_del_set_cols, ARR_DATA_PTR(arr), num_delete_cols * sizeof(int16)); + if ((Pointer) arr != DatumGetPointer(adatum)) + pfree(arr); /* free de-toasted copy, if any */ + + *num_fk_del_set_cols = num_delete_cols; + } + } + *numfks = numkeys; } diff --git a/third_party/spanner_pg/src/backend/catalog/pg_conversion.c b/third_party/spanner_pg/src/backend/catalog/pg_conversion.c index 02ac7c4a..3d8b86ac 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_conversion.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_conversion.c @@ -3,7 +3,7 @@ * pg_conversion.c * routines to support manipulation of the pg_conversion relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_db_role_setting.c b/third_party/spanner_pg/src/backend/catalog/pg_db_role_setting.c index 0c2b02bb..42387f4e 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_db_role_setting.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_db_role_setting.c @@ -2,7 +2,7 @@ * pg_db_role_setting.c * Routines to support manipulation of the pg_db_role_setting relation * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/catalog/pg_depend.c b/third_party/spanner_pg/src/backend/catalog/pg_depend.c index 07791b47..89bbb5c9 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_depend.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_depend.c @@ -3,7 +3,7 @@ * pg_depend.c * routines to support manipulation of the pg_depend relation * - * 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 * * @@ -17,6 +17,7 @@ #include "access/genam.h" #include "access/htup_details.h" #include "access/table.h" +#include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_constraint.h" @@ -29,7 +30,7 @@ #include "utils/rel.h" -static bool isObjectPinned(const ObjectAddress *object, Relation rel); +static bool isObjectPinned(const ObjectAddress *object); /* @@ -69,8 +70,11 @@ recordMultipleDependencies(const ObjectAddress *depender, return; /* nothing to do */ /* - * During bootstrap, do nothing since pg_depend may not exist yet. initdb - * will fill in appropriate pg_depend entries after bootstrap. + * During bootstrap, do nothing since pg_depend may not exist yet. + * + * Objects created during bootstrap are most likely pinned, and the few + * that are not do not have dependencies on each other, so that there + * would be no need to make a pg_depend entry anyway. */ if (IsBootstrapProcessingMode()) return; @@ -99,7 +103,7 @@ recordMultipleDependencies(const ObjectAddress *depender, * need to record dependencies on it. This saves lots of space in * pg_depend, so it's worth the time taken to check. */ - if (isObjectPinned(referenced, dependDesc)) + if (isObjectPinned(referenced)) continue; if (slot_init_count < max_slots) @@ -463,8 +467,6 @@ changeDependencyFor(Oid classId, Oid objectId, bool oldIsPinned; bool newIsPinned; - depRel = table_open(DependRelationId, RowExclusiveLock); - /* * Check to see if either oldRefObjectId or newRefObjectId is pinned. * Pinned objects should not have any dependency entries pointing to them, @@ -475,16 +477,14 @@ changeDependencyFor(Oid classId, Oid objectId, objAddr.objectId = oldRefObjectId; objAddr.objectSubId = 0; - oldIsPinned = isObjectPinned(&objAddr, depRel); + oldIsPinned = isObjectPinned(&objAddr); objAddr.objectId = newRefObjectId; - newIsPinned = isObjectPinned(&objAddr, depRel); + newIsPinned = isObjectPinned(&objAddr); if (oldIsPinned) { - table_close(depRel, RowExclusiveLock); - /* * If both are pinned, we need do nothing. However, return 1 not 0, * else callers will think this is an error case. @@ -504,6 +504,8 @@ changeDependencyFor(Oid classId, Oid objectId, return 1; } + depRel = table_open(DependRelationId, RowExclusiveLock); + /* There should be existing dependency record(s), so search. */ ScanKeyInit(&key[0], Anum_pg_depend_classid, @@ -638,7 +640,7 @@ changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, objAddr.objectId = oldRefObjectId; objAddr.objectSubId = 0; - if (isObjectPinned(&objAddr, depRel)) + if (isObjectPinned(&objAddr)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot remove dependency on %s because it is a system object", @@ -650,7 +652,7 @@ changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, */ objAddr.objectId = newRefObjectId; - newIsPinned = isObjectPinned(&objAddr, depRel); + newIsPinned = isObjectPinned(&objAddr); /* Now search for dependency records */ ScanKeyInit(&key[0], @@ -698,50 +700,14 @@ changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, * isObjectPinned() * * Test if an object is required for basic database functionality. - * Caller must already have opened pg_depend. * * The passed subId, if any, is ignored; we assume that only whole objects * are pinned (and that this implies pinning their components). */ static bool -isObjectPinned(const ObjectAddress *object, Relation rel) +isObjectPinned(const ObjectAddress *object) { - bool ret = false; - SysScanDesc scan; - HeapTuple tup; - ScanKeyData key[2]; - - ScanKeyInit(&key[0], - Anum_pg_depend_refclassid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->classId)); - - ScanKeyInit(&key[1], - Anum_pg_depend_refobjid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - scan = systable_beginscan(rel, DependReferenceIndexId, true, - NULL, 2, key); - - /* - * Since we won't generate additional pg_depend entries for pinned - * objects, there can be at most one entry referencing a pinned object. - * Hence, it's sufficient to look at the first returned tuple; we don't - * need to loop. - */ - tup = systable_getnext(scan); - if (HeapTupleIsValid(tup)) - { - Form_pg_depend foundDep = (Form_pg_depend) GETSTRUCT(tup); - - if (foundDep->deptype == DEPENDENCY_PIN) - ret = true; - } - - systable_endscan(scan); - - return ret; + return IsPinnedObject(object->classId, object->objectId); } diff --git a/third_party/spanner_pg/src/backend/catalog/pg_enum.c b/third_party/spanner_pg/src/backend/catalog/pg_enum.c index f958f154..11471549 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_enum.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_enum.c @@ -3,7 +3,7 @@ * pg_enum.c * routines to support manipulation of the pg_enum relation * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -55,7 +55,7 @@ static int sort_order_cmp(const void *p1, const void *p2); * EnumValuesCreate * Create an entry in pg_enum for each of the supplied enum values. * - * vals is a list of Value strings. + * vals is a list of String values. */ void EnumValuesCreate(Oid enumTypeOid, List *vals) diff --git a/third_party/spanner_pg/src/backend/catalog/pg_inherits.c b/third_party/spanner_pg/src/backend/catalog/pg_inherits.c index f2952073..50e9b1dd 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_inherits.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_inherits.c @@ -8,7 +8,7 @@ * Perhaps someday that code should be moved here, but it'd have to be * disentangled from other stuff such as pg_depend updates. * - * 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/third_party/spanner_pg/src/backend/catalog/pg_largeobject.c b/third_party/spanner_pg/src/backend/catalog/pg_largeobject.c index 047bc688..30f024ce 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_largeobject.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_largeobject.c @@ -3,7 +3,7 @@ * pg_largeobject.c * routines to support manipulation of the pg_largeobject relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_namespace.c b/third_party/spanner_pg/src/backend/catalog/pg_namespace.c index e66e090d..5ec88009 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_namespace.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_namespace.c @@ -3,7 +3,7 @@ * pg_namespace.c * routines to support manipulation of the pg_namespace relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_operator.c b/third_party/spanner_pg/src/backend/catalog/pg_operator.c index 0ee349ea..2ea6fb85 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_operator.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_operator.c @@ -3,7 +3,7 @@ * pg_operator.c * routines to support manipulation of the pg_operator relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_parameter_acl.c b/third_party/spanner_pg/src/backend/catalog/pg_parameter_acl.c new file mode 100644 index 00000000..2decee90 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/backend/catalog/pg_proc.c b/third_party/spanner_pg/src/backend/catalog/pg_proc.c index d1267544..0fc975bf 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_proc.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_proc.c @@ -3,7 +3,7 @@ * pg_proc.c * routines to support manipulation of the pg_proc relation * - * 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 * * @@ -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" @@ -710,6 +711,10 @@ ProcedureCreate(const char *procedureName, AtEOXact_GUC(true, save_nestlevel); } + /* ensure that stats are dropped if transaction aborts */ + if (!is_update) + pgstat_create_function(retval); + return myself; } @@ -948,7 +953,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/third_party/spanner_pg/src/backend/catalog/pg_publication.c b/third_party/spanner_pg/src/backend/catalog/pg_publication.c index 36609118..84d8dbb2 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_publication.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_publication.c @@ -3,11 +3,11 @@ * pg_publication.c * publication C API manipulation * - * 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 * * IDENTIFICATION - * pg_publication.c + * src/backend/catalog/pg_publication.c * *------------------------------------------------------------------------- */ @@ -28,7 +28,9 @@ #include "catalog/objectaccess.h" #include "catalog/objectaddress.h" #include "catalog/pg_inherits.h" +#include "catalog/pg_namespace.h" #include "catalog/pg_publication.h" +#include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" #include "catalog/pg_type.h" #include "commands/publicationcmds.h" @@ -43,6 +45,11 @@ #include "utils/rel.h" #include "utils/syscache.h" +#include "third_party/spanner_pg/shims/catalog_shim.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. @@ -55,25 +62,55 @@ check_publication_add_relation(Relation targetrel) RelationGetForm(targetrel)->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("\"%s\" is not a table", + errmsg("cannot add relation \"%s\" to publication", RelationGetRelationName(targetrel)), - errdetail("Only tables can be added to publications."))); + errdetail_relkind_not_supported(RelationGetForm(targetrel)->relkind))); /* Can't be system table */ if (IsCatalogRelation(targetrel)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("\"%s\" is a system table", + errmsg("cannot add relation \"%s\" to publication", RelationGetRelationName(targetrel)), - errdetail("System tables cannot be added to publications."))); + errdetail("This operation is not supported for system tables."))); /* UNLOGGED and TEMP relations cannot be part of publication. */ - if (!RelationIsPermanent(targetrel)) + if (targetrel->rd_rel->relpersistence == RELPERSISTENCE_TEMP) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add relation \"%s\" to publication", + RelationGetRelationName(targetrel)), + errdetail("This operation is not supported for temporary tables."))); + else if (targetrel->rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("table \"%s\" cannot be replicated", + errmsg("cannot add relation \"%s\" to publication", RelationGetRelationName(targetrel)), - errdetail("Temporary and unlogged relations cannot be replicated."))); + errdetail("This operation is not supported for unlogged tables."))); +} + +/* + * Check if schema can be in given publication and throw appropriate error if + * not. + */ +static void +check_publication_add_schema(Oid schemaid) +{ + /* Can't be system namespace */ + if (IsCatalogNamespace(schemaid) || IsToastNamespace(schemaid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add schema \"%s\" to publication", + get_namespace_name(schemaid)), + errdetail("This operation is not supported for system schemas."))); + + /* Can't be temporary namespace */ + if (isAnyTempNamespace(schemaid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add schema \"%s\" to publication", + get_namespace_name(schemaid)), + errdetail("Temporary schemas cannot be replicated."))); } /* @@ -86,7 +123,7 @@ check_publication_add_relation(Relation targetrel) * XXX This also excludes all tables with relid < FirstNormalObjectId, * ie all tables created during initdb. This mainly affects the preinstalled * information_schema. IsCatalogRelationOid() only excludes tables with - * relid < FirstBootstrapObjectId, making that test rather redundant, + * relid < FirstUnpinnedObjectId, making that test rather redundant, * but really we should get rid of the FirstNormalObjectId test not * IsCatalogRelationOid. We can't do so today because we don't want * information_schema tables to be considered publishable; but this test @@ -153,6 +190,36 @@ is_publishable_relation(Relation rel) return is_publishable_class(RelationGetRelid(rel), rel->rd_rel); } +/* + * Returns true if any schema is associated with the publication, false if no + * schema is associated with the publication. + */ +bool +is_schema_publication(Oid pubid) +{ + Relation pubschsrel; + ScanKeyData scankey; + SysScanDesc scan; + HeapTuple tup; + bool result = false; + + pubschsrel = table_open(PublicationNamespaceRelationId, AccessShareLock); + ScanKeyInit(&scankey, + Anum_pg_publication_namespace_pnpubid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(pubid)); + + scan = systable_beginscan(pubschsrel, + PublicationNamespacePnnspidPnpubidIndexId, + true, NULL, 1, &scankey); + tup = systable_getnext(scan); + result = HeapTupleIsValid(tup); + + systable_endscan(scan); + table_close(pubschsrel, AccessShareLock); + + return result; +} /* * SQL-callable variant of the above @@ -213,20 +280,78 @@ GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, return result; } +/* + * Returns the relid of the topmost ancestor that is published via this + * 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, int *ancestor_level) +{ + ListCell *lc; + Oid topmost_relid = InvalidOid; + int level = 0; + + /* + * Find the "topmost" ancestor that is in this publication. + */ + foreach(lc, ancestors) + { + Oid ancestor = lfirst_oid(lc); + 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); + list_free(aschemaPubids); + } + + return topmost_relid; +} + /* * Insert new publication / relation mapping. */ ObjectAddress -publication_add_relation(Oid pubid, Relation 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]; + Relation targetrel = pri->relation; Oid relid = RelationGetRelid(targetrel); - Oid prrelid; + Oid pubreloid; Publication *pub = GetPublication(pubid); + AttrNumber *attarray = NULL; + int natts = 0; ObjectAddress myself, referenced; List *relids = NIL; @@ -254,25 +379,46 @@ publication_add_relation(Oid pubid, Relation targetrel, 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)); - prrelid = GetNewOidWithIndex(rel, PublicationRelObjectIndexId, - Anum_pg_publication_rel_oid); - values[Anum_pg_publication_rel_oid - 1] = ObjectIdGetDatum(prrelid); + pubreloid = GetNewOidWithIndex(rel, PublicationRelObjectIndexId, + Anum_pg_publication_rel_oid); + values[Anum_pg_publication_rel_oid - 1] = ObjectIdGetDatum(pubreloid); values[Anum_pg_publication_rel_prpubid - 1] = ObjectIdGetDatum(pubid); 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; + + /* 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. */ CatalogTupleInsert(rel, tup); heap_freetuple(tup); - ObjectAddressSet(myself, PublicationRelRelationId, prrelid); + /* Register dependencies as needed */ + ObjectAddressSet(myself, PublicationRelRelationId, pubreloid); /* Add dependency on the publication */ ObjectAddressSet(referenced, PublicationRelationId, pubid); @@ -282,6 +428,19 @@ publication_add_relation(Oid pubid, Relation 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); + + /* 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); @@ -301,6 +460,212 @@ publication_add_relation(Oid pubid, Relation targetrel, 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 use system column \"%s\" in publication column list", + colname)); + + if (TupleDescAttr(tupdesc, attnum - 1)->attgenerated) + ereport(ERROR, + errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot use 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 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) +{ + Bitmapset *result = NULL; + ArrayType *arr; + int nelems; + int16 *elems; + MemoryContext oldcxt = NULL; + + /* + * 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. + */ +ObjectAddress +publication_add_schema(Oid pubid, Oid schemaid, bool if_not_exists) +{ + Relation rel; + HeapTuple tup; + Datum values[Natts_pg_publication_namespace]; + bool nulls[Natts_pg_publication_namespace]; + Oid psschid; + Publication *pub = GetPublication(pubid); + List *schemaRels = NIL; + ObjectAddress myself, + referenced; + + rel = table_open(PublicationNamespaceRelationId, RowExclusiveLock); + + /* + * Check for duplicates. Note that this does not really prevent + * 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, + ObjectIdGetDatum(schemaid), + ObjectIdGetDatum(pubid))) + { + table_close(rel, RowExclusiveLock); + + if (if_not_exists) + return InvalidObjectAddress; + + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("schema \"%s\" is already member of publication \"%s\"", + get_namespace_name(schemaid), pub->name))); + } + + check_publication_add_schema(schemaid); + + /* Form a tuple */ + memset(values, 0, sizeof(values)); + memset(nulls, false, sizeof(nulls)); + + psschid = GetNewOidWithIndex(rel, PublicationNamespaceObjectIndexId, + Anum_pg_publication_namespace_oid); + values[Anum_pg_publication_namespace_oid - 1] = ObjectIdGetDatum(psschid); + values[Anum_pg_publication_namespace_pnpubid - 1] = + ObjectIdGetDatum(pubid); + values[Anum_pg_publication_namespace_pnnspid - 1] = + ObjectIdGetDatum(schemaid); + + tup = heap_form_tuple(RelationGetDescr(rel), values, nulls); + + /* Insert tuple into catalog */ + CatalogTupleInsert(rel, tup); + heap_freetuple(tup); + + ObjectAddressSet(myself, PublicationNamespaceRelationId, psschid); + + /* Add dependency on the publication */ + ObjectAddressSet(referenced, PublicationRelationId, pubid); + recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO); + + /* Add dependency on the schema */ + ObjectAddressSet(referenced, NamespaceRelationId, schemaid); + recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO); + + /* Close the table */ + table_close(rel, RowExclusiveLock); + + /* + * Invalidate relcache so that publication info is rebuilt. See + * publication_add_relation for why we need to consider all the + * partitions. + */ + schemaRels = GetSchemaPublicationRelations(schemaid, + PUBLICATION_PART_ALL); + InvalidatePublicationRels(schemaRels); + + return myself; +} + /* Gets list of publication oids for a relation */ List * GetRelationPublications(Oid relid) @@ -348,7 +713,7 @@ GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(pubid)); - scan = systable_beginscan(pubrelsrel, PublicationRelPrrelidPrpubidIndexId, + scan = systable_beginscan(pubrelsrel, PublicationRelPrpubidIndexId, true, NULL, 1, &scankey); result = NIL; @@ -364,6 +729,10 @@ GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) systable_endscan(scan); table_close(pubrelsrel, AccessShareLock); + /* Now sort and de-duplicate the result list */ + list_sort(result, list_oid_cmp); + list_deduplicate_oid(result); + return result; } @@ -467,6 +836,151 @@ GetAllTablesPublicationRelations(bool pubviaroot) return result; } +/* + * Gets the list of schema oids for a publication. + * + * This should only be used FOR TABLES IN SCHEMA publications. + */ +List * +GetPublicationSchemas(Oid pubid) +{ + List *result = NIL; + Relation pubschsrel; + ScanKeyData scankey; + SysScanDesc scan; + HeapTuple tup; + + /* Find all schemas associated with the publication */ + pubschsrel = table_open(PublicationNamespaceRelationId, AccessShareLock); + + ScanKeyInit(&scankey, + Anum_pg_publication_namespace_pnpubid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(pubid)); + + scan = systable_beginscan(pubschsrel, + PublicationNamespacePnnspidPnpubidIndexId, + true, NULL, 1, &scankey); + while (HeapTupleIsValid(tup = systable_getnext(scan))) + { + Form_pg_publication_namespace pubsch; + + pubsch = (Form_pg_publication_namespace) GETSTRUCT(tup); + + result = lappend_oid(result, pubsch->pnnspid); + } + + systable_endscan(scan); + table_close(pubschsrel, AccessShareLock); + + return result; +} + +/* + * Gets the list of publication oids associated with a specified schema. + */ +List * +GetSchemaPublications(Oid schemaid) +{ + List *result = NIL; + CatCList *pubschlist; + int i; + + /* Find all publications associated with the schema */ + pubschlist = SearchSysCacheList1(PUBLICATIONNAMESPACEMAP, + ObjectIdGetDatum(schemaid)); + for (i = 0; i < pubschlist->n_members; i++) + { + HeapTuple tup = &pubschlist->members[i]->tuple; + Oid pubid = ((Form_pg_publication_namespace) GETSTRUCT(tup))->pnpubid; + + result = lappend_oid(result, pubid); + } + + ReleaseSysCacheList(pubschlist); + + return result; +} + +/* + * Get the list of publishable relation oids for a specified schema. + */ +List * +GetSchemaPublicationRelations(Oid schemaid, PublicationPartOpt pub_partopt) +{ + Relation classRel; + ScanKeyData key[1]; + TableScanDesc scan; + HeapTuple tuple; + List *result = NIL; + + Assert(OidIsValid(schemaid)); + + classRel = table_open(RelationRelationId, AccessShareLock); + + ScanKeyInit(&key[0], + Anum_pg_class_relnamespace, + BTEqualStrategyNumber, F_OIDEQ, + schemaid); + + /* get all the relations present in the specified schema */ + 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; + char relkind; + + if (!is_publishable_class(relid, relForm)) + continue; + + relkind = get_rel_relkind(relid); + if (relkind == RELKIND_RELATION) + result = lappend_oid(result, relid); + else if (relkind == RELKIND_PARTITIONED_TABLE) + { + List *partitionrels = NIL; + + /* + * It is quite possible that some of the partitions are in a + * different schema than the parent table, so we need to get such + * partitions separately. + */ + partitionrels = GetPubPartitionOptionRelations(partitionrels, + pub_partopt, + relForm->oid); + result = list_concat_unique_oid(result, partitionrels); + } + } + + table_endscan(scan); + table_close(classRel, AccessShareLock); + return result; +} + +/* + * Gets the list of all relations published by FOR TABLES IN SCHEMA + * publication. + */ +List * +GetAllSchemaPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt) +{ + List *result = NIL; + List *pubschemalist = GetPublicationSchemas(pubid); + ListCell *cell; + + foreach(cell, pubschemalist) + { + Oid schemaid = lfirst_oid(cell); + List *schemaRels = NIL; + + schemaRels = GetSchemaPublicationRelations(schemaid, pub_partopt); + result = list_concat(result, schemaRels); + } + + return result; +} + /* * Get publication using oid * @@ -565,11 +1079,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_PUBLICATION_TABLES_ELEM 3 FuncCallContext *funcctx; char *pubname = text_to_cstring(PG_GETARG_TEXT_PP(0)); Publication *publication; @@ -578,6 +1093,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 */ @@ -594,13 +1110,23 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) * need those. */ if (publication->alltables) + { tables = GetAllTablesPublicationRelations(publication->pubviaroot); + } else { - tables = GetPublicationRelations(publication->oid, + List *relids, + *schemarelids; + + relids = GetPublicationRelations(publication->oid, publication->pubviaroot ? PUBLICATION_PART_ROOT : PUBLICATION_PART_LEAF); + schemarelids = GetAllSchemaPublicationRelations(publication->oid, + publication->pubviaroot ? + PUBLICATION_PART_ROOT : + PUBLICATION_PART_LEAF); + tables = list_concat_unique_oid(relids, schemarelids); /* * If the publication publishes partition changes via their @@ -613,6 +1139,17 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) if (publication->pubviaroot) tables = filter_partitions(tables); } + + /* Construct a tuple descriptor for the result rows. */ + tupdesc = CreateTemplateTupleDesc(NUM_PUBLICATION_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); @@ -624,9 +1161,56 @@ 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); + Oid schemaid = get_rel_namespace(relid); + Datum values[NUM_PUBLICATION_TABLES_ELEM]; + bool nulls[NUM_PUBLICATION_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); + + /* + * We don't consider row filters or column lists for FOR ALL TABLES or + * FOR TABLES IN SCHEMA publications. + */ + if (!publication->alltables && + !SearchSysCacheExists2(PUBLICATIONNAMESPACEMAP, + ObjectIdGetDatum(schemaid), + ObjectIdGetDatum(publication->oid))) + 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/third_party/spanner_pg/src/backend/catalog/pg_range.c b/third_party/spanner_pg/src/backend/catalog/pg_range.c index 839b65eb..06b7b5ad 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_range.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_range.c @@ -3,7 +3,7 @@ * pg_range.c * routines to support manipulation of the pg_range relation * - * 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/third_party/spanner_pg/src/backend/catalog/pg_shdepend.c b/third_party/spanner_pg/src/backend/catalog/pg_shdepend.c index e9b37383..3e8fa008 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_shdepend.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_shdepend.c @@ -3,7 +3,7 @@ * pg_shdepend.c * routines to support manipulation of the pg_shdepend relation * - * 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 * * @@ -102,7 +102,6 @@ static void storeObjectDescription(StringInfo descs, ObjectAddress *object, SharedDependencyType deptype, int count); -static bool isSharedObjectPinned(Oid classId, Oid objectId, Relation sdepRel); /* @@ -141,8 +140,7 @@ recordSharedDependencyOn(ObjectAddress *depender, sdepRel = table_open(SharedDependRelationId, RowExclusiveLock); /* If the referenced object is pinned, do nothing. */ - if (!isSharedObjectPinned(referenced->classId, referenced->objectId, - sdepRel)) + if (!IsPinnedObject(referenced->classId, referenced->objectId)) { shdepAddDependency(sdepRel, depender->classId, depender->objectId, depender->objectSubId, @@ -256,7 +254,7 @@ shdepChangeDep(Relation sdepRel, systable_endscan(scan); - if (isSharedObjectPinned(refclassid, refobjid, sdepRel)) + if (IsPinnedObject(refclassid, refobjid)) { /* No new entry needed, so just delete existing entry if any */ if (oldtup) @@ -514,7 +512,7 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, continue; /* Skip pinned roles; they don't need dependency entries */ - if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel)) + if (IsPinnedObject(AuthIdRelationId, roleid)) continue; shdepAddDependency(sdepRel, classId, objectId, objsubId, @@ -532,7 +530,7 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, continue; /* Skip pinned roles */ - if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel)) + if (IsPinnedObject(AuthIdRelationId, roleid)) continue; shdepDropDependency(sdepRel, classId, objectId, objsubId, @@ -627,8 +625,6 @@ shared_dependency_comparator(const void *a, const void *b) * on objects local to other databases. We can (and do) provide descriptions * of the two former kinds of objects, but we can't do that for "remote" * objects, so we just provide a count of them. - * - * If we find a SHARED_DEPENDENCY_PIN entry, we can error out early. */ bool checkSharedDependencies(Oid classId, Oid objectId, @@ -650,6 +646,18 @@ checkSharedDependencies(Oid classId, Oid objectId, StringInfoData descs; StringInfoData alldescs; + /* This case can be dispatched quickly */ + if (IsPinnedObject(classId, objectId)) + { + object.classId = classId; + object.objectId = objectId; + object.objectSubId = 0; + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because it is required by the database system", + getObjectDescription(&object, false)))); + } + /* * We limit the number of dependencies reported to the client to * MAX_REPORTED_DEPS, since client software may not deal well with @@ -686,18 +694,6 @@ checkSharedDependencies(Oid classId, Oid objectId, { Form_pg_shdepend sdepForm = (Form_pg_shdepend) GETSTRUCT(tup); - /* This case can be dispatched quickly */ - if (sdepForm->deptype == SHARED_DEPENDENCY_PIN) - { - object.classId = classId; - object.objectId = objectId; - object.objectSubId = 0; - ereport(ERROR, - (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), - errmsg("cannot drop %s because it is required by the database system", - getObjectDescription(&object, false)))); - } - object.classId = sdepForm->classid; object.objectId = sdepForm->objid; object.objectSubId = sdepForm->objsubid; @@ -1282,53 +1278,6 @@ storeObjectDescription(StringInfo descs, } -/* - * isSharedObjectPinned - * Return whether a given shared object has a SHARED_DEPENDENCY_PIN entry. - * - * sdepRel must be the pg_shdepend relation, already opened and suitably - * locked. - */ -static bool -isSharedObjectPinned(Oid classId, Oid objectId, Relation sdepRel) -{ - bool result = false; - ScanKeyData key[2]; - SysScanDesc scan; - HeapTuple tup; - - ScanKeyInit(&key[0], - Anum_pg_shdepend_refclassid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(classId)); - ScanKeyInit(&key[1], - Anum_pg_shdepend_refobjid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(objectId)); - - scan = systable_beginscan(sdepRel, SharedDependReferenceIndexId, true, - NULL, 2, key); - - /* - * Since we won't generate additional pg_shdepend entries for pinned - * objects, there can be at most one entry referencing a pinned object. - * Hence, it's sufficient to look at the first returned tuple; we don't - * need to loop. - */ - tup = systable_getnext(scan); - if (HeapTupleIsValid(tup)) - { - Form_pg_shdepend shdepForm = (Form_pg_shdepend) GETSTRUCT(tup); - - if (shdepForm->deptype == SHARED_DEPENDENCY_PIN) - result = true; - } - - systable_endscan(scan); - - return result; -} - /* * shdepDropOwned * @@ -1369,7 +1318,7 @@ shdepDropOwned(List *roleids, DropBehavior behavior) HeapTuple tuple; /* Doesn't work for pinned objects */ - if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel)) + if (IsPinnedObject(AuthIdRelationId, roleid)) { ObjectAddress obj; @@ -1412,7 +1361,6 @@ shdepDropOwned(List *roleids, DropBehavior behavior) switch (sdepForm->deptype) { /* Shouldn't happen */ - case SHARED_DEPENDENCY_PIN: case SHARED_DEPENDENCY_INVALID: elog(ERROR, "unexpected dependency type"); break; @@ -1516,7 +1464,7 @@ shdepReassignOwned(List *roleids, Oid newrole) Oid roleid = lfirst_oid(cell); /* Refuse to work on pinned roles */ - if (isSharedObjectPinned(AuthIdRelationId, roleid, sdepRel)) + if (IsPinnedObject(AuthIdRelationId, roleid)) { ObjectAddress obj; @@ -1561,10 +1509,6 @@ shdepReassignOwned(List *roleids, Oid newrole) sdepForm->dbid != InvalidOid) continue; - /* Unexpected because we checked for pins above */ - if (sdepForm->deptype == SHARED_DEPENDENCY_PIN) - elog(ERROR, "unexpected shared pin"); - /* We leave non-owner dependencies alone */ if (sdepForm->deptype != SHARED_DEPENDENCY_OWNER) continue; diff --git a/third_party/spanner_pg/src/backend/catalog/pg_subscription.c b/third_party/spanner_pg/src/backend/catalog/pg_subscription.c index 8148b908..72fff19e 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_subscription.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_subscription.c @@ -3,7 +3,7 @@ * pg_subscription.c * replication subscriptions * - * 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 * * IDENTIFICATION @@ -65,11 +65,14 @@ 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; sub->binary = subform->subbinary; sub->stream = subform->substream; + sub->twophasestate = subform->subtwophasestate; + sub->disableonerr = subform->subdisableonerr; /* Get conninfo */ datum = SysCacheGetAttr(SUBSCRIPTIONOID, @@ -157,6 +160,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 * @@ -452,6 +494,39 @@ RemoveSubscriptionRel(Oid subid, Oid relid) table_close(rel, RowExclusiveLock); } +/* + * Does the subscription have any relations? + * + * Use this function only to know true/false, and when you have no need for the + * List returned by GetSubscriptionRelations. + */ +bool +HasSubscriptionRelations(Oid subid) +{ + Relation rel; + ScanKeyData skey[1]; + SysScanDesc scan; + bool has_subrels; + + rel = table_open(SubscriptionRelRelationId, AccessShareLock); + + ScanKeyInit(&skey[0], + Anum_pg_subscription_rel_srsubid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(subid)); + + scan = systable_beginscan(rel, InvalidOid, false, + NULL, 1, skey); + + /* If even a single tuple exists then the subscription has tables. */ + has_subrels = HeapTupleIsValid(systable_getnext(scan)); + + /* Cleanup */ + systable_endscan(scan); + table_close(rel, AccessShareLock); + + return has_subrels; +} /* * Get all relations for subscription. diff --git a/third_party/spanner_pg/src/backend/catalog/pg_type.c b/third_party/spanner_pg/src/backend/catalog/pg_type.c index 0c24fdea..25aede96 100644 --- a/third_party/spanner_pg/src/backend/catalog/pg_type.c +++ b/third_party/spanner_pg/src/backend/catalog/pg_type.c @@ -3,7 +3,7 @@ * pg_type.c * routines to support manipulation of the pg_type relation * - * 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/third_party/spanner_pg/src/backend/catalog/sql_features.txt b/third_party/spanner_pg/src/backend/catalog/sql_features.txt index 9f424216..da7c9c77 100644 --- a/third_party/spanner_pg/src/backend/catalog/sql_features.txt +++ b/third_party/spanner_pg/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 @@ -228,6 +228,7 @@ F263 Comma-separated predicates in simple CASE expression NO F271 Compound character literals YES F281 LIKE enhancements YES F291 UNIQUE predicate NO +F292 UNIQUE null treatment YES SQL:202x draft F301 CORRESPONDING in query expressions NO F302 INTERSECT table operator YES F302 INTERSECT table operator 01 INTERSECT DISTINCT table operator YES @@ -239,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 @@ -323,11 +324,11 @@ F821 Local table references NO F831 Full cursor update NO F831 Full cursor update 01 Updatable scrollable cursors NO F831 Full cursor update 02 Updatable ordered cursors NO -F841 LIKE_REGEX predicate NO -F842 OCCURRENCES_REGEX function NO -F843 POSITION_REGEX function NO -F844 SUBSTRING_REGEX function NO -F845 TRANSLATE_REGEX function NO +F841 LIKE_REGEX predicate NO consider regexp_like() +F842 OCCURRENCES_REGEX function NO consider regexp_matches() +F843 POSITION_REGEX function NO consider regexp_instr() +F844 SUBSTRING_REGEX function NO consider regexp_substr() +F845 TRANSLATE_REGEX function NO consider regexp_replace() F846 Octet support in regular expression operators NO F847 Nonconstant regular expressions NO F850 Top-level in YES @@ -363,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 @@ -462,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 diff --git a/third_party/spanner_pg/src/backend/catalog/storage.c b/third_party/spanner_pg/src/backend/catalog/storage.c index 8f74a3ef..c06e414a 100644 --- a/third_party/spanner_pg/src/backend/catalog/storage.c +++ b/third_party/spanner_pg/src/backend/catalog/storage.c @@ -3,7 +3,7 @@ * storage.c * code to create and destroy physical storage for relations * - * 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 * * @@ -73,7 +73,7 @@ typedef struct PendingRelSync } PendingRelSync; static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */ -HTAB *pendingSyncHash = NULL; +static HTAB *pendingSyncHash = NULL; /* @@ -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()) { @@ -330,16 +340,16 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * 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 + * 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. + * 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->delayChkptEnd); - MyProc->delayChkptEnd = true; + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_COMPLETE) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_COMPLETE; /* * We WAL-log the truncation before actually truncating, which means @@ -387,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->delayChkptEnd = false; + MyProc->delayChkptFlags &= ~DELAY_CHKPT_COMPLETE; /* * Update upper-level FSM pages to account for the truncation. This is diff --git a/third_party/spanner_pg/src/backend/catalog/system_functions.sql b/third_party/spanner_pg/src/backend/catalog/system_functions.sql index a416e94d..73da687d 100644 --- a/third_party/spanner_pg/src/backend/catalog/system_functions.sql +++ b/third_party/spanner_pg/src/backend/catalog/system_functions.sql @@ -1,7 +1,7 @@ /* * PostgreSQL System Functions * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * 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 SETOF 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; @@ -639,6 +637,10 @@ 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; REVOKE EXECUTE ON FUNCTION lo_import(text, oid) FROM public; @@ -699,6 +701,14 @@ REVOKE EXECUTE ON FUNCTION pg_ls_dir(text) FROM public; REVOKE EXECUTE ON FUNCTION pg_ls_dir(text,boolean,boolean) FROM public; +REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) FROM PUBLIC; + +REVOKE EXECUTE ON FUNCTION pg_ls_logicalsnapdir() FROM PUBLIC; + +REVOKE EXECUTE ON FUNCTION pg_ls_logicalmapdir() FROM PUBLIC; + +REVOKE EXECUTE ON FUNCTION pg_ls_replslotdir(text) FROM PUBLIC; + -- -- We also set up some things as accessible to standard roles. -- @@ -713,6 +723,12 @@ GRANT EXECUTE ON FUNCTION pg_ls_tmpdir() TO pg_monitor; GRANT EXECUTE ON FUNCTION pg_ls_tmpdir(oid) TO pg_monitor; +GRANT EXECUTE ON FUNCTION pg_ls_logicalsnapdir() TO pg_monitor; + +GRANT EXECUTE ON FUNCTION pg_ls_logicalmapdir() TO pg_monitor; + +GRANT EXECUTE ON FUNCTION pg_ls_replslotdir(text) TO pg_monitor; + GRANT pg_read_all_settings TO pg_monitor; GRANT pg_read_all_stats TO pg_monitor; diff --git a/third_party/spanner_pg/src/backend/catalog/system_views.sql b/third_party/spanner_pg/src/backend/catalog/system_views.sql index 999d9840..76e4177c 100644 --- a/third_party/spanner_pg/src/backend/catalog/system_views.sql +++ b/third_party/spanner_pg/src/backend/catalog/system_views.sql @@ -1,7 +1,7 @@ /* * PostgreSQL System Views * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/backend/catalog/system_views.sql * @@ -266,6 +266,7 @@ CREATE VIEW pg_stats_ext WITH (security_barrier) AS ) AS attnames, pg_get_statisticsobjdef_expressions(s.oid) as exprs, s.stxkind AS kinds, + sd.stxdinherit AS inherited, sd.stxdndistinct AS n_distinct, sd.stxddependencies AS dependencies, m.most_common_vals, @@ -298,6 +299,7 @@ CREATE VIEW pg_stats_ext_exprs WITH (security_barrier) AS s.stxname AS statistics_name, pg_get_userbyid(s.stxowner) AS statistics_owner, stat.expr, + sd.stxdinherit AS inherited, (stat.a).stanullfrac AS null_frac, (stat.a).stawidth AS avg_width, (stat.a).stadistinct AS n_distinct, @@ -366,7 +368,14 @@ 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 pg_attribute a + WHERE a.attrelid = GPT.relid AND a.attnum > 0 AND + NOT a.attisdropped AND + (a.attnum = ANY(GPT.attrs) OR GPT.attrs IS NULL) + ) 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) @@ -605,6 +614,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(); @@ -621,13 +636,17 @@ CREATE VIEW pg_shmem_allocations AS SELECT * FROM pg_get_shmem_allocations(); REVOKE ALL ON pg_shmem_allocations FROM PUBLIC; +GRANT SELECT ON pg_shmem_allocations TO pg_read_all_stats; REVOKE EXECUTE ON FUNCTION pg_get_shmem_allocations() FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_shmem_allocations() TO pg_read_all_stats; CREATE VIEW pg_backend_memory_contexts AS SELECT * FROM pg_get_backend_memory_contexts(); REVOKE ALL ON pg_backend_memory_contexts FROM PUBLIC; +GRANT SELECT ON pg_backend_memory_contexts TO pg_read_all_stats; REVOKE EXECUTE ON FUNCTION pg_get_backend_memory_contexts() FROM PUBLIC; +GRANT EXECUTE ON FUNCTION pg_get_backend_memory_contexts() TO pg_read_all_stats; -- Statistics views @@ -711,22 +730,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 @@ -899,6 +927,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, @@ -1254,6 +1296,17 @@ 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, subslotname, subsynccommit, subpublications) +GRANT SELECT (oid, subdbid, subskiplsn, subname, subowner, subenabled, + subbinary, substream, subtwophasestate, subdisableonerr, subslotname, + subsynccommit, subpublications) ON pg_subscription TO public; + +CREATE VIEW pg_stat_subscription_stats AS + SELECT + ss.subid, + s.subname, + 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/third_party/spanner_pg/src/backend/catalog/toasting.c b/third_party/spanner_pg/src/backend/catalog/toasting.c index dbd42c1d..bbf8f5a4 100644 --- a/third_party/spanner_pg/src/backend/catalog/toasting.c +++ b/third_party/spanner_pg/src/backend/catalog/toasting.c @@ -4,7 +4,7 @@ * This file contains routines to support creation of toast tables * * - * 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 * * IDENTIFICATION @@ -107,10 +107,8 @@ BootstrapToastTable(char *relName, Oid toastOid, Oid toastIndexOid) if (rel->rd_rel->relkind != RELKIND_RELATION && rel->rd_rel->relkind != RELKIND_MATVIEW) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table or materialized view", - relName))); + elog(ERROR, "\"%s\" is not a table or materialized view", + relName); /* create_toast_table does all the work */ if (!create_toast_table(rel, toastOid, toastIndexOid, (Datum) 0, @@ -305,7 +303,10 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, indexInfo->ii_ExclusionStrats = NULL; indexInfo->ii_OpclassOptions = NULL; indexInfo->ii_Unique = true; + indexInfo->ii_NullsNotDistinct = false; indexInfo->ii_ReadyForInserts = true; + indexInfo->ii_CheckedUnchanged = false; + indexInfo->ii_IndexUnchanged = false; indexInfo->ii_Concurrent = false; indexInfo->ii_BrokenHotChain = false; indexInfo->ii_ParallelWorkers = 0; diff --git a/third_party/spanner_pg/src/backend/commands/BUILD b/third_party/spanner_pg/src/backend/commands/BUILD index 7a7c055a..56ba74a1 100644 --- a/third_party/spanner_pg/src/backend/commands/BUILD +++ b/third_party/spanner_pg/src/backend/commands/BUILD @@ -95,6 +95,7 @@ cc_library( "typecmds.c", "user.c", "vacuum.c", + "vacuumparallel.c", "variable.c", "view.c", ], diff --git a/third_party/spanner_pg/src/backend/commands/Makefile b/third_party/spanner_pg/src/backend/commands/Makefile index e8504f0a..48f7348f 100644 --- a/third_party/spanner_pg/src/backend/commands/Makefile +++ b/third_party/spanner_pg/src/backend/commands/Makefile @@ -59,6 +59,7 @@ OBJS = \ typecmds.o \ user.o \ vacuum.o \ + vacuumparallel.o \ variable.o \ view.o diff --git a/third_party/spanner_pg/src/backend/commands/aggregatecmds.c b/third_party/spanner_pg/src/backend/commands/aggregatecmds.c index 436cb6c1..4469300b 100644 --- a/third_party/spanner_pg/src/backend/commands/aggregatecmds.c +++ b/third_party/spanner_pg/src/backend/commands/aggregatecmds.c @@ -4,7 +4,7 @@ * * Routines for aggregate-manipulation commands * - * 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/third_party/spanner_pg/src/backend/commands/alter.c b/third_party/spanner_pg/src/backend/commands/alter.c index 29249498..6f27a492 100644 --- a/third_party/spanner_pg/src/backend/commands/alter.c +++ b/third_party/spanner_pg/src/backend/commands/alter.c @@ -3,7 +3,7 @@ * alter.c * Drivers for generic alter commands * - * 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 * * @@ -501,7 +501,7 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt, switch (stmt->objectType) { case OBJECT_EXTENSION: - address = AlterExtensionNamespace(strVal((Value *) stmt->object), stmt->newschema, + address = AlterExtensionNamespace(strVal(stmt->object), stmt->newschema, oldSchemaAddr ? &oldNspOid : NULL); break; @@ -658,8 +658,10 @@ 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: case OCLASS_PUBLICATION_REL: case OCLASS_SUBSCRIPTION: case OCLASS_TRANSFORM: @@ -837,10 +839,10 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) switch (stmt->objectType) { case OBJECT_DATABASE: - return AlterDatabaseOwner(strVal((Value *) stmt->object), newowner); + return AlterDatabaseOwner(strVal(stmt->object), newowner); case OBJECT_SCHEMA: - return AlterSchemaOwner(strVal((Value *) stmt->object), newowner); + return AlterSchemaOwner(strVal(stmt->object), newowner); case OBJECT_TYPE: case OBJECT_DOMAIN: /* same as TYPE */ @@ -848,23 +850,23 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) break; case OBJECT_FDW: - return AlterForeignDataWrapperOwner(strVal((Value *) stmt->object), + return AlterForeignDataWrapperOwner(strVal(stmt->object), newowner); case OBJECT_FOREIGN_SERVER: - return AlterForeignServerOwner(strVal((Value *) stmt->object), + return AlterForeignServerOwner(strVal(stmt->object), newowner); case OBJECT_EVENT_TRIGGER: - return AlterEventTriggerOwner(strVal((Value *) stmt->object), + return AlterEventTriggerOwner(strVal(stmt->object), newowner); case OBJECT_PUBLICATION: - return AlterPublicationOwner(strVal((Value *) stmt->object), + return AlterPublicationOwner(strVal(stmt->object), newowner); case OBJECT_SUBSCRIPTION: - return AlterSubscriptionOwner(strVal((Value *) stmt->object), + return AlterSubscriptionOwner(strVal(stmt->object), newowner); /* Generic cases */ @@ -1044,9 +1046,14 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) /* Perform actual update */ CatalogTupleUpdate(rel, &newtup->t_self, newtup); - /* Update owner dependency reference */ + /* + * Update owner dependency reference. When working on a large object, + * we have to translate back to the OID conventionally used for LOs' + * classId. + */ if (classId == LargeObjectMetadataRelationId) classId = LargeObjectRelationId; + changeDependencyOnOwner(classId, objectId, new_ownerId); /* Release memory */ @@ -1054,6 +1061,16 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) pfree(nulls); pfree(replaces); } + else + { + /* + * No need to change anything. But when working on a large object, we + * have to translate back to the OID conventionally used for LOs' + * classId, or the post-alter hook (if any) will get confused. + */ + if (classId == LargeObjectMetadataRelationId) + classId = LargeObjectRelationId; + } InvokeObjectPostAlterHook(classId, objectId, 0); } diff --git a/third_party/spanner_pg/src/backend/commands/amcmds.c b/third_party/spanner_pg/src/backend/commands/amcmds.c index b4bcf034..ff38b318 100644 --- a/third_party/spanner_pg/src/backend/commands/amcmds.c +++ b/third_party/spanner_pg/src/backend/commands/amcmds.c @@ -3,7 +3,7 @@ * amcmds.c * Routines for SQL commands that manipulate access methods. * - * 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 * * @@ -55,7 +55,7 @@ CreateAccessMethod(CreateAmStmt *stmt) rel = table_open(AccessMethodRelationId, RowExclusiveLock); - /* Must be super user */ + /* Must be superuser */ if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), diff --git a/third_party/spanner_pg/src/backend/commands/analyze.c b/third_party/spanner_pg/src/backend/commands/analyze.c index c59cb7f5..c6a4e835 100644 --- a/third_party/spanner_pg/src/backend/commands/analyze.c +++ b/third_party/spanner_pg/src/backend/commands/analyze.c @@ -3,7 +3,7 @@ * analyze.c * the Postgres statistics generator * - * 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 * * @@ -38,6 +38,7 @@ #include "commands/progress.h" #include "commands/tablecmds.h" #include "commands/vacuum.h" +#include "common/pg_prng.h" #include "executor/executor.h" #include "foreign/fdwapi.h" #include "miscadmin.h" @@ -430,7 +431,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, */ if (onerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - List *idxs = RelationGetIndexList(onerel); + List *idxs = RelationGetIndexList(onerel); Irel = NULL; nindexes = 0; @@ -550,7 +551,6 @@ do_analyze_rel(Relation onerel, VacuumParams *params, { MemoryContext col_context, old_context; - bool build_ext_stats; pgstat_progress_update_param(PROGRESS_ANALYZE_PHASE, PROGRESS_ANALYZE_PHASE_COMPUTE_STATS); @@ -614,30 +614,9 @@ do_analyze_rel(Relation onerel, VacuumParams *params, thisdata->attr_cnt, thisdata->vacattrstats); } - /* - * Should we build extended statistics for this relation? - * - * The extended statistics catalog does not include an inheritance - * flag, so we can't store statistics built both with and without - * data from child relations. We can store just one set of statistics - * per relation. For plain relations that's fine, but for inheritance - * trees we have to pick whether to store statistics for just the - * one relation or the whole tree. For plain inheritance we store - * the (!inh) version, mostly for backwards compatibility reasons. - * For partitioned tables that's pointless (the non-leaf tables are - * always empty), so we store stats representing the whole tree. - */ - build_ext_stats = (onerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) ? inh : (!inh); - - /* - * Build extended statistics (if there are any). - * - * For now we only build extended statistics on individual relations, - * not for relations representing inheritance trees. - */ - if (build_ext_stats) - BuildRelationExtStatistics(onerel, totalrows, numrows, rows, - attr_cnt, vacattrstats); + /* Build extended statistics (if there are any). */ + BuildRelationExtStatistics(onerel, inh, totalrows, numrows, rows, + attr_cnt, vacattrstats); } pgstat_progress_update_param(PROGRESS_ANALYZE_PHASE, @@ -668,6 +647,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, hasindex, InvalidTransactionId, InvalidMultiXactId, + NULL, NULL, in_outer_xact); /* Same for indexes */ @@ -684,6 +664,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, false, InvalidTransactionId, InvalidMultiXactId, + NULL, NULL, in_outer_xact); } } @@ -696,14 +677,15 @@ do_analyze_rel(Relation onerel, VacuumParams *params, vac_update_relstats(onerel, -1, totalrows, 0, hasindex, InvalidTransactionId, InvalidMultiXactId, + NULL, NULL, in_outer_xact); } /* - * Now report ANALYZE to the stats collector. 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.) + * 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.) * * Reset the changes_since_analyze counter only if we analyzed all * columns; otherwise, there is still work for auto-analyze to do. @@ -1158,7 +1140,7 @@ acquire_sample_rows(Relation onerel, int elevel, double liverows = 0; /* # live rows seen */ double deadrows = 0; /* # dead rows seen */ double rowstoskip = -1; /* -1 means not set yet */ - long randseed; /* Seed for block sampler(s) */ + uint32 randseed; /* Seed for block sampler(s) */ BlockNumber totalblocks; TransactionId OldestXmin; BlockSamplerData bs; @@ -1180,7 +1162,7 @@ acquire_sample_rows(Relation onerel, int elevel, OldestXmin = GetOldestNonRemovableTransactionId(onerel); /* Prepare for sampling block numbers */ - randseed = random(); + randseed = pg_prng_uint32(&pg_global_prng_state); nblocks = BlockSampler_Init(&bs, totalblocks, targrows, randseed); #ifdef USE_PREFETCH @@ -1297,7 +1279,7 @@ acquire_sample_rows(Relation onerel, int elevel, * Found a suitable tuple, so save it, replacing one old * tuple at random */ - int k = (int) (targrows * sampler_random_fract(rstate.randstate)); + int k = (int) (targrows * sampler_random_fract(&rstate.randstate)); Assert(k >= 0 && k < targrows); heap_freetuple(rows[k]); diff --git a/third_party/spanner_pg/src/backend/commands/async.c b/third_party/spanner_pg/src/backend/commands/async.c index 409fece1..3e1b92df 100644 --- a/third_party/spanner_pg/src/backend/commands/async.c +++ b/third_party/spanner_pg/src/backend/commands/async.c @@ -3,7 +3,7 @@ * async.c * Asynchronous notification: NOTIFY, LISTEN, UNLISTEN * - * 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 * * IDENTIFICATION @@ -1234,20 +1234,6 @@ Exec_UnlistenAllCommit(void) listenChannels = NIL; } -/* - * ProcessCompletedNotifies --- nowadays this does nothing - * - * This routine used to send signals and handle self-notifies, - * but that functionality has been moved elsewhere. - * We'd delete it entirely, except that the documentation used to instruct - * background-worker authors to call it. To avoid an ABI break in stable - * branches, keep it as a no-op routine. - */ -void -ProcessCompletedNotifies(void) -{ -} - /* * Test whether we are actively listening on the given channel name. * diff --git a/third_party/spanner_pg/src/backend/commands/cluster.c b/third_party/spanner_pg/src/backend/commands/cluster.c index ed8bf8c5..8319c118 100644 --- a/third_party/spanner_pg/src/backend/commands/cluster.c +++ b/third_party/spanner_pg/src/backend/commands/cluster.c @@ -6,7 +6,7 @@ * There is hardly anything left of Paul Brown's original implementation... * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * @@ -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" @@ -70,11 +72,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); /*--------------------------------------------------------------------------- @@ -107,6 +112,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) @@ -128,11 +137,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, @@ -148,14 +159,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; @@ -190,71 +193,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, 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(); } } @@ -341,10 +374,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)) { @@ -364,9 +398,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); goto out; @@ -409,7 +445,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 @@ -425,6 +461,10 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) goto out; } + 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 @@ -457,7 +497,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; @@ -593,6 +633,7 @@ static void rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose) { Oid tableOid = RelationGetRelid(OldHeap); + Oid accessMethod = OldHeap->rd_rel->relam; Oid tableSpace = OldHeap->rd_rel->reltablespace; Oid OIDNewHeap; char relpersistence; @@ -601,8 +642,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 */ @@ -614,6 +655,7 @@ rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose) /* Create the transient table that will receive the re-ordered data */ OIDNewHeap = make_new_heap(tableOid, tableSpace, + accessMethod, relpersistence, AccessExclusiveLock); @@ -635,16 +677,16 @@ rebuild_relation(Relation OldHeap, Oid indexOid, bool verbose) /* * Create the transient table that will be filled with new data during * CLUSTER, ALTER TABLE, and similar operations. The transient table - * duplicates the logical structure of the OldHeap, but is placed in - * NewTableSpace which might be different from OldHeap's. Also, it's built - * with the specified persistence, which might differ from the original's. + * duplicates the logical structure of the OldHeap; but will have the + * specified physical storage properties NewTableSpace, NewAccessMethod, and + * relpersistence. * * After this, the caller should load the new heap with transferred/modified * data, then call finish_heap_swap to complete the operation. */ Oid -make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, char relpersistence, - LOCKMODE lockmode) +make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod, + char relpersistence, LOCKMODE lockmode) { TupleDesc OldHeapDesc; char NewHeapName[NAMEDATALEN]; @@ -703,7 +745,7 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, char relpersistence, InvalidOid, InvalidOid, OldHeap->rd_rel->relowner, - OldHeap->rd_rel->relam, + NewAccessMethod, OldHeapDesc, NIL, RELKIND_RELATION, @@ -781,9 +823,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, @@ -791,6 +834,7 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, BlockNumber num_pages; int elevel = verbose ? INFO : DEBUG2; PGRUsage ru0; + char *nspname; pg_rusage_init(&ru0); @@ -804,6 +848,9 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, else OldIndex = NULL; + /* Store a copy of the namespace name for logging purposes */ + nspname = get_namespace_name(RelationGetNamespace(OldHeap)); + /* * Their tuple descriptors should be exactly alike, but here we only need * assume that they have the same number of columns. @@ -867,9 +914,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, NULL, &MultiXactCutoff, - NULL); + 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 @@ -902,22 +948,22 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, if (OldIndex != NULL && !use_sort) ereport(elevel, (errmsg("clustering \"%s.%s\" using index scan on \"%s\"", - get_namespace_name(RelationGetNamespace(OldHeap)), + nspname, RelationGetRelationName(OldHeap), RelationGetRelationName(OldIndex)))); else if (use_sort) ereport(elevel, (errmsg("clustering \"%s.%s\" using sequential scan and sort", - get_namespace_name(RelationGetNamespace(OldHeap)), + nspname, RelationGetRelationName(OldHeap)))); else ereport(elevel, (errmsg("vacuuming \"%s.%s\"", - get_namespace_name(RelationGetNamespace(OldHeap)), + nspname, RelationGetRelationName(OldHeap)))); /* - * Hand of the actual copying to AM specific function, the generic code + * Hand off the actual copying to AM specific function, the generic code * cannot know how to deal with visibility across AMs. Note that this * routine is allowed to set FreezeXid / MultiXactCutoff to different * values (e.g. because the AM doesn't use freezing). @@ -938,7 +984,8 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, /* Log what we did */ ereport(elevel, - (errmsg("\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages", + (errmsg("\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages", + nspname, RelationGetRelationName(OldHeap), tups_vacuumed, num_tuples, RelationGetNumberOfBlocks(OldHeap)), @@ -1020,6 +1067,8 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, relfilenode2; Oid swaptemp; char swptmpchr; + Oid relam1, + relam2; /* We need writable copies of both pg_class tuples. */ relRelation = table_open(RelationRelationId, RowExclusiveLock); @@ -1036,6 +1085,8 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, relfilenode1 = relform1->relfilenode; relfilenode2 = relform2->relfilenode; + relam1 = relform1->relam; + relam2 = relform2->relam; if (OidIsValid(relfilenode1) && OidIsValid(relfilenode2)) { @@ -1053,6 +1104,10 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, relform1->reltablespace = relform2->reltablespace; relform2->reltablespace = swaptemp; + swaptemp = relform1->relam; + relform1->relam = relform2->relam; + relform2->relam = swaptemp; + swptmpchr = relform1->relpersistence; relform1->relpersistence = relform2->relpersistence; relform2->relpersistence = swptmpchr; @@ -1088,6 +1143,9 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, if (relform1->relpersistence != relform2->relpersistence) elog(ERROR, "cannot change persistence of mapped relation \"%s\"", NameStr(relform1->relname)); + if (relform1->relam != relform2->relam) + elog(ERROR, "cannot change access method of mapped relation \"%s\"", + NameStr(relform1->relname)); if (!swap_toast_by_content && (relform1->reltoastrelid || relform2->reltoastrelid)) elog(ERROR, "cannot swap toast by links for mapped relation \"%s\"", @@ -1198,6 +1256,31 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, CacheInvalidateRelcacheByTuple(reltup2); } + /* + * Now that pg_class has been updated with its relevant information for + * the swap, update the dependency of the relations to point to their new + * table AM, if it has changed. + */ + if (relam1 != relam2) + { + if (changeDependencyFor(RelationRelationId, + r1, + AccessMethodRelationId, + relam1, + relam2) != 1) + elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"", + get_namespace_name(get_rel_namespace(r1)), + get_rel_name(r1)); + if (changeDependencyFor(RelationRelationId, + r2, + AccessMethodRelationId, + relam2, + relam1) != 1) + elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"", + get_namespace_name(get_rel_namespace(r2)), + get_rel_name(r2)); + } + /* * Post alter hook for modified relations. The change to r2 is always * internal, but r1 depends on the invocation context. @@ -1532,8 +1615,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); @@ -1568,8 +1651,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 @@ -1583,21 +1665,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); } @@ -1605,5 +1686,53 @@ 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. + * + * Like expand_vacuum_rel, but here caller must hold AccessExclusiveLock + * on the table containing the index. + */ +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); + + 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; + + /* 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); + } + + return rtcs; } diff --git a/third_party/spanner_pg/src/backend/commands/collationcmds.c b/third_party/spanner_pg/src/backend/commands/collationcmds.c index 598c6eb9..2865b9c0 100644 --- a/third_party/spanner_pg/src/backend/commands/collationcmds.c +++ b/third_party/spanner_pg/src/backend/commands/collationcmds.c @@ -3,7 +3,7 @@ * collationcmds.c * collation-related commands support code * - * 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 * * @@ -64,12 +64,12 @@ 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; + char *colliculocale; + bool collisdeterministic; + int collencoding; + char collprovider; char *collversion = NULL; Oid newoid; ObjectAddress address; @@ -109,32 +109,57 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e parser_errposition(pstate, defel->location))); break; } - + if (*defelp != NULL) + errorConflictingDefElem(defel, pstate); *defelp = defel; } - if ((localeEl && (lccollateEl || lcctypeEl)) - || (fromEl && list_length(parameters) != 1)) + if (localeEl && (lccollateEl || lcctypeEl)) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"), + errdetail("LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE.")); + + if (fromEl && list_length(parameters) != 1) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"), + errdetail("FROM cannot be specified together with any other options.")); if (fromEl) { Oid collid; HeapTuple tp; + Datum datum; + bool isnull; collid = get_collation_oid(defGetQualifiedName(fromEl), false); tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid)); if (!HeapTupleIsValid(tp)) elog(ERROR, "cache lookup failed for collation %u", collid); - collcollate = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collcollate)); - collctype = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collctype)); collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider; collisdeterministic = ((Form_pg_collation) GETSTRUCT(tp))->collisdeterministic; collencoding = ((Form_pg_collation) GETSTRUCT(tp))->collencoding; + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collcollate, &isnull); + if (!isnull) + collcollate = TextDatumGetCString(datum); + else + collcollate = NULL; + + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collctype, &isnull); + if (!isnull) + collctype = TextDatumGetCString(datum); + else + collctype = NULL; + + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colliculocale, &isnull); + if (!isnull) + colliculocale = TextDatumGetCString(datum); + else + colliculocale = NULL; + ReleaseSysCache(tp); /* @@ -149,65 +174,88 @@ 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); - } - - if (lccollateEl) - collcollate = defGetString(lccollateEl); + char *collproviderstr = NULL; - if (lcctypeEl) - collctype = defGetString(lcctypeEl); + collcollate = NULL; + collctype = NULL; + colliculocale = NULL; - if (providerEl) - collproviderstr = defGetString(providerEl); + if (providerEl) + collproviderstr = defGetString(providerEl); - if (deterministicEl) - collisdeterministic = defGetBoolean(deterministicEl); + if (deterministicEl) + collisdeterministic = defGetBoolean(deterministicEl); + else + collisdeterministic = true; - if (versionEl) - collversion = defGetString(versionEl); + 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; + 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 - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("unrecognized collation provider: %s", - collproviderstr))); - } - else if (!fromEl) - collprovider = COLLPROVIDER_LIBC; + 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); - /* - * 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 (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 + * 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 @@ -237,7 +285,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, @@ -247,6 +295,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collencoding, collcollate, collctype, + colliculocale, collversion, if_not_exists, false); /* not quiet */ @@ -308,7 +357,7 @@ AlterCollation(AlterCollationStmt *stmt) Oid collOid; HeapTuple tup; Form_pg_collation collForm; - Datum collversion; + Datum datum; bool isnull; char *oldversion; char *newversion; @@ -326,11 +375,13 @@ AlterCollation(AlterCollationStmt *stmt) elog(ERROR, "cache lookup failed for collation %u", collOid); collForm = (Form_pg_collation) GETSTRUCT(tup); - collversion = SysCacheGetAttr(COLLOID, tup, Anum_pg_collation_collversion, - &isnull); - oldversion = isnull ? NULL : TextDatumGetCString(collversion); + datum = SysCacheGetAttr(COLLOID, tup, Anum_pg_collation_collversion, &isnull); + oldversion = isnull ? NULL : TextDatumGetCString(datum); - newversion = get_collation_actual_version(collForm->collprovider, NameStr(collForm->collcollate)); + 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 */ if ((!oldversion && newversion) || (oldversion && !newversion)) @@ -377,8 +428,9 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) { Oid collid = PG_GETARG_OID(0); HeapTuple tp; - char *collcollate; char collprovider; + Datum datum; + bool isnull; char *version; tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid)); @@ -387,12 +439,19 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("collation with OID %u does not exist", collid))); - collcollate = pstrdup(NameStr(((Form_pg_collation) GETSTRUCT(tp))->collcollate)); collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider; - ReleaseSysCache(tp); + 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; - version = get_collation_actual_version(collprovider, collcollate); + ReleaseSysCache(tp); if (version) PG_RETURN_TEXT_P(cstring_to_text(version)); @@ -540,7 +599,7 @@ pg_import_system_collations(PG_FUNCTION_ARGS) #ifdef READ_LOCALE_A_OUTPUT { FILE *locale_a_handle; - char localebuf[NAMEDATALEN]; /* we assume ASCII so this is fine */ + char localebuf[LOCALE_NAME_BUFLEN]; int nvalid = 0; Oid collid; CollAliasData *aliases; @@ -564,13 +623,13 @@ pg_import_system_collations(PG_FUNCTION_ARGS) { size_t len; int enc; - char alias[NAMEDATALEN]; + char alias[LOCALE_NAME_BUFLEN]; len = strlen(localebuf); if (len == 0 || localebuf[len - 1] != '\n') { - elog(DEBUG1, "locale name too long, skipped: \"%s\"", localebuf); + elog(DEBUG1, "skipping locale with too-long name: \"%s\"", localebuf); continue; } localebuf[len - 1] = '\0'; @@ -584,18 +643,22 @@ pg_import_system_collations(PG_FUNCTION_ARGS) */ if (!pg_is_ascii(localebuf)) { - elog(DEBUG1, "locale name has non-ASCII characters, skipped: \"%s\"", localebuf); + elog(DEBUG1, "skipping locale with non-ASCII name: \"%s\"", localebuf); continue; } enc = pg_get_encoding_from_locale(localebuf, false); if (enc < 0) { - /* error message printed by pg_get_encoding_from_locale() */ + elog(DEBUG1, "skipping locale with unrecognized encoding: \"%s\"", + localebuf); continue; } if (!PG_VALID_BE_ENCODING(enc)) - continue; /* ignore locales for client-only encodings */ + { + elog(DEBUG1, "skipping locale with client-only encoding: \"%s\"", localebuf); + continue; + } if (enc == PG_SQL_ASCII) continue; /* C/POSIX are already in the catalog */ @@ -613,7 +676,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)) @@ -674,7 +737,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)) @@ -715,7 +778,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) @@ -724,20 +787,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/third_party/spanner_pg/src/backend/commands/comment.c b/third_party/spanner_pg/src/backend/commands/comment.c index 2f61c7b0..777aff10 100644 --- a/third_party/spanner_pg/src/backend/commands/comment.c +++ b/third_party/spanner_pg/src/backend/commands/comment.c @@ -4,7 +4,7 @@ * * PostgreSQL object comments utility code. * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/commands/comment.c @@ -53,7 +53,7 @@ CommentObject(CommentStmt *stmt) */ if (stmt->objtype == OBJECT_DATABASE) { - char *database = strVal((Value *) stmt->object); + char *database = strVal(stmt->object); if (!OidIsValid(get_database_oid(database, true))) { @@ -99,8 +99,9 @@ CommentObject(CommentStmt *stmt) relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, composite type, or foreign table", - RelationGetRelationName(relation)))); + errmsg("cannot set comment on relation \"%s\"", + RelationGetRelationName(relation)), + errdetail_relkind_not_supported(relation->rd_rel->relkind))); break; default: break; diff --git a/third_party/spanner_pg/src/backend/commands/constraint.c b/third_party/spanner_pg/src/backend/commands/constraint.c index d0063164..721de178 100644 --- a/third_party/spanner_pg/src/backend/commands/constraint.c +++ b/third_party/spanner_pg/src/backend/commands/constraint.c @@ -3,7 +3,7 @@ * constraint.c * PostgreSQL CONSTRAINT support code. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/commands/conversioncmds.c b/third_party/spanner_pg/src/backend/commands/conversioncmds.c index 5fed97a2..67feda33 100644 --- a/third_party/spanner_pg/src/backend/commands/conversioncmds.c +++ b/third_party/spanner_pg/src/backend/commands/conversioncmds.c @@ -3,7 +3,7 @@ * conversioncmds.c * conversion creation command support code * - * 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/third_party/spanner_pg/src/backend/commands/copy.c b/third_party/spanner_pg/src/backend/commands/copy.c index ed7b177d..89bd37d3 100644 --- a/third_party/spanner_pg/src/backend/commands/copy.c +++ b/third_party/spanner_pg/src/backend/commands/copy.c @@ -3,7 +3,7 @@ * copy.c * Implements the COPY utility command * - * 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 * * @@ -82,26 +82,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."))); } @@ -224,9 +224,8 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt, { /* * Build the ColumnRef for each column. The ColumnRef - * 'fields' property is a String 'Value' node (see - * nodes/value.h) that corresponds to the column name - * respectively. + * 'fields' property is a String node that corresponds to + * the column name respectively. */ cr = makeNode(ColumnRef); cr->fields = list_make1(lfirst(lc)); @@ -279,6 +278,12 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt, { Assert(stmt->query); + /* MERGE is allowed by parser, but unimplemented. Reject for now */ + if (IsA(stmt->query, MergeStmt)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("MERGE not supported in COPY")); + query = makeNode(RawStmt); query->stmt = stmt->query; query->stmt_location = stmt_location; @@ -319,6 +324,71 @@ 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, bool is_from) +{ + /* + * 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) + { + if (!is_from) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use \"%s\" with HEADER in COPY TO", + sval))); + 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. * @@ -362,10 +432,7 @@ ProcessCopyOptions(ParseState *pstate, char *fmt = defGetString(defel); if (format_specified) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); format_specified = true; if (strcmp(fmt, "text") == 0) /* default format */ ; @@ -382,66 +449,45 @@ ProcessCopyOptions(ParseState *pstate, else if (strcmp(defel->defname, "freeze") == 0) { if (freeze_specified) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); freeze_specified = true; opts_out->freeze = defGetBoolean(defel); } else if (strcmp(defel->defname, "delimiter") == 0) { if (opts_out->delim) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->delim = defGetString(defel); } else if (strcmp(defel->defname, "null") == 0) { if (opts_out->null_print) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->null_print = defGetString(defel); } else if (strcmp(defel->defname, "header") == 0) { if (header_specified) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); header_specified = true; - opts_out->header_line = defGetBoolean(defel); + opts_out->header_line = defGetCopyHeaderChoice(defel, is_from); } else if (strcmp(defel->defname, "quote") == 0) { if (opts_out->quote) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->quote = defGetString(defel); } else if (strcmp(defel->defname, "escape") == 0) { if (opts_out->escape) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->escape = defGetString(defel); } else if (strcmp(defel->defname, "force_quote") == 0) { if (opts_out->force_quote || opts_out->force_quote_all) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); if (defel->arg && IsA(defel->arg, A_Star)) opts_out->force_quote_all = true; else if (defel->arg && IsA(defel->arg, List)) @@ -456,10 +502,7 @@ ProcessCopyOptions(ParseState *pstate, else if (strcmp(defel->defname, "force_not_null") == 0) { if (opts_out->force_notnull) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); if (defel->arg && IsA(defel->arg, List)) opts_out->force_notnull = castNode(List, defel->arg); else @@ -472,9 +515,7 @@ ProcessCopyOptions(ParseState *pstate, else if (strcmp(defel->defname, "force_null") == 0) { if (opts_out->force_null) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); if (defel->arg && IsA(defel->arg, List)) opts_out->force_null = castNode(List, defel->arg); else @@ -492,10 +533,7 @@ ProcessCopyOptions(ParseState *pstate, * allowed for the column list to be NIL. */ if (opts_out->convert_selectively) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->convert_selectively = true; if (defel->arg == NULL || IsA(defel->arg, List)) opts_out->convert_select = castNode(List, defel->arg); @@ -509,10 +547,7 @@ ProcessCopyOptions(ParseState *pstate, else if (strcmp(defel->defname, "encoding") == 0) { if (opts_out->file_encoding >= 0) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); opts_out->file_encoding = pg_char_to_encoding(defGetString(defel)); if (opts_out->file_encoding < 0) ereport(ERROR, @@ -596,10 +631,10 @@ ProcessCopyOptions(ParseState *pstate, errmsg("COPY delimiter cannot be \"%s\"", opts_out->delim))); /* Check header */ - if (!opts_out->csv_mode && opts_out->header_line) + if (opts_out->binary && opts_out->header_line) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY HEADER available only in CSV mode"))); + errmsg("cannot specify HEADER in BINARY mode"))); /* Check quote */ if (!opts_out->csv_mode && opts_out->quote != NULL) diff --git a/third_party/spanner_pg/src/backend/commands/copyfrom.c b/third_party/spanner_pg/src/backend/commands/copyfrom.c index 01e45194..cc2405d0 100644 --- a/third_party/spanner_pg/src/backend/commands/copyfrom.c +++ b/third_party/spanner_pg/src/backend/commands/copyfrom.c @@ -9,7 +9,7 @@ * Reading data from the input file or client and parsing it into Datums * is handled in copyfromparse.c. * - * 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 * * @@ -117,21 +117,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 { @@ -141,16 +139,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 @@ -165,14 +166,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); } } } @@ -757,6 +760,9 @@ CopyFrom(CopyFromState cstate) * Can't support multi-inserts if there are any volatile function * expressions in WHERE clause. Similarly to the trigger case above, * such expressions may query the table we're inserting into. + * + * Note: the whereClause was already preprocessed in DoCopy(), so it's + * okay to use contain_volatile_functions() directly. */ insertMethod = CIM_SINGLE; } @@ -1239,7 +1245,7 @@ BeginCopyFrom(ParseState *pstate, tupDesc = RelationGetDescr(cstate->rel); - /* process commmon options or initialization */ + /* process common options or initialization */ /* Generate or convert list of attributes to process */ cstate->attnumlist = CopyGetAttnums(tupDesc, cstate->rel, attnamelist); @@ -1348,10 +1354,6 @@ BeginCopyFrom(ParseState *pstate, cstate->whereClause = whereClause; - MemoryContextSwitchTo(oldcontext); - - oldcontext = MemoryContextSwitchTo(cstate->copycontext); - /* Initialize state variables */ cstate->eol_type = EOL_UNKNOWN; cstate->cur_relname = RelationGetRelationName(cstate->rel); @@ -1456,7 +1458,8 @@ BeginCopyFrom(ParseState *pstate, * known to be safe for use with the multi-insert * optimization. Hence we use this special case function * checker rather than the standard check for - * contain_volatile_functions(). + * contain_volatile_functions(). Note also that we already + * ran the expression through expression_planner(). */ if (!volatile_defexprs) volatile_defexprs = contain_volatile_functions_not_nextval((Node *) defexpr); diff --git a/third_party/spanner_pg/src/backend/commands/copyfromparse.c b/third_party/spanner_pg/src/backend/commands/copyfromparse.c index 2c3e7279..097414ef 100644 --- a/third_party/spanner_pg/src/backend/commands/copyfromparse.c +++ b/third_party/spanner_pg/src/backend/commands/copyfromparse.c @@ -37,7 +37,7 @@ * the data is valid in the current encoding. * * In binary mode, the pipeline is much simpler. Input is loaded into - * into 'raw_buf', and encoding conversion is done in the datatype-specific + * 'raw_buf', and encoding conversion is done in the datatype-specific * receive functions, if required. 'input_buf' and 'line_buf' are not used, * but 'attribute_buf' is used as a temporary buffer to hold one attribute's * data when it's passed the receive function. @@ -47,7 +47,7 @@ * and 'attribute_buf' are expanded on demand, to hold the longest line * encountered so far. * - * 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 * * @@ -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,60 @@ 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: got %d, expected %d", + fldct, list_length(cstate->attnumlist)))); + + fldnum = 0; + foreach(cur, cstate->attnumlist) + { + int attnum = lfirst_int(cur); + char *colName; + Form_pg_attribute attr = TupleDescAttr(tupDesc, attnum - 1); + + Assert(fldnum < cstate->max_fields); + + colName = cstate->raw_fields[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/third_party/spanner_pg/src/backend/commands/copyto.c b/third_party/spanner_pg/src/backend/commands/copyto.c index b799d950..7459b2bc 100644 --- a/third_party/spanner_pg/src/backend/commands/copyto.c +++ b/third_party/spanner_pg/src/backend/commands/copyto.c @@ -3,7 +3,7 @@ * copyto.c * COPY TO file/program/client * - * 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 * * @@ -99,7 +99,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 */ @@ -118,8 +117,8 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0"; static void EndCopy(CopyToState cstate); static void ClosePipeToProgram(CopyToState cstate); static void CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot); -static void CopyAttributeOutText(CopyToState cstate, char *string); -static void CopyAttributeOutCSV(CopyToState cstate, char *string, +static void CopyAttributeOutText(CopyToState cstate, const char *string); +static void CopyAttributeOutCSV(CopyToState cstate, const char *string, bool use_quote, bool single_attr); /* Low-level communications functions */ @@ -441,9 +440,9 @@ 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, - pstate->p_sourcetext, NULL, 0, - NULL); + rewritten = pg_analyze_and_rewrite_fixedparams(raw_query, + pstate->p_sourcetext, NULL, 0, + NULL); /* check that we got back something we can work with */ if (rewritten == NIL) @@ -863,8 +862,11 @@ DoCopyTo(CopyToState cstate) colname = NameStr(TupleDescAttr(tupDesc, attnum - 1)->attname); - CopyAttributeOutCSV(cstate, colname, false, - list_length(cstate->attnumlist) == 1); + if (cstate->opts.csv_mode) + CopyAttributeOutCSV(cstate, colname, false, + list_length(cstate->attnumlist) == 1); + else + CopyAttributeOutText(cstate, colname); } CopySendEndOfRow(cstate); @@ -1009,10 +1011,10 @@ CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot) } while (0) static void -CopyAttributeOutText(CopyToState cstate, char *string) +CopyAttributeOutText(CopyToState cstate, const char *string) { - char *ptr; - char *start; + const char *ptr; + const char *start; char c; char delimc = cstate->opts.delim[0]; @@ -1162,11 +1164,11 @@ CopyAttributeOutText(CopyToState cstate, char *string) * CSV-style escaping */ static void -CopyAttributeOutCSV(CopyToState cstate, char *string, +CopyAttributeOutCSV(CopyToState cstate, const char *string, bool use_quote, bool single_attr) { - char *ptr; - char *start; + const char *ptr; + const char *start; char c; char delimc = cstate->opts.delim[0]; char quotec = cstate->opts.quote[0]; @@ -1194,7 +1196,7 @@ CopyAttributeOutCSV(CopyToState cstate, char *string, use_quote = true; else { - char *tptr = ptr; + const char *tptr = ptr; while ((c = *tptr) != '\0') { diff --git a/third_party/spanner_pg/src/backend/commands/createas.c b/third_party/spanner_pg/src/backend/commands/createas.c index 22757f23..694541e2 100644 --- a/third_party/spanner_pg/src/backend/commands/createas.c +++ b/third_party/spanner_pg/src/backend/commands/createas.c @@ -13,7 +13,7 @@ * we must return a tuples-processed count in the QueryCompletion. (We no * longer do that for CTAS ... WITH NO DATA, however.) * - * 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/third_party/spanner_pg/src/backend/commands/dbcommands.c b/third_party/spanner_pg/src/backend/commands/dbcommands.c index 6cce93a9..618c2826 100644 --- a/third_party/spanner_pg/src/backend/commands/dbcommands.c +++ b/third_party/spanner_pg/src/backend/commands/dbcommands.c @@ -8,7 +8,7 @@ * stepping on each others' toes. Formerly we used table-level locks * on pg_database, but that's too coarse-grained. * - * 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 * * @@ -30,12 +30,14 @@ #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" #include "catalog/indexing.h" #include "catalog/objectaccess.h" #include "catalog/pg_authid.h" +#include "catalog/pg_collation.h" #include "catalog/pg_database.h" #include "catalog/pg_db_role_setting.h" #include "catalog/pg_subscription.h" @@ -63,15 +65,33 @@ #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" #include "third_party/spanner_pg/shims/catalog_shim.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 @@ -80,6 +100,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); @@ -87,14 +118,552 @@ static void movedb_failure_callback(int code, Datum arg); static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, - Oid *dbLastSysOidP, TransactionId *dbFrozenXidP, - MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype); + TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, + 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); 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); +static void recovery_create_dbdir(char *path, bool only_tblspc); + +/* + * 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); + } + + pfree(srcpath); + pfree(dstpath); + 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; + Snapshot snapshot; + SMgrRelation smgr; + 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; + + smgr = smgropen(rnode, InvalidBackendId); + nblocks = smgrnblocks(smgr, MAIN_FORKNUM); + smgrclose(smgr); + + /* 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, true); + + 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. + * + * Visibility 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]; + + /* + * Note that we don't have to copy version data from the source database; + * there's only one legal value. + */ + sprintf(buf, "%s\n", PG_MAJORVERSION); + nbytes = strlen(PG_MAJORVERSION) + 1; + + /* 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(); + + pgstat_report_wait_start(WAIT_EVENT_VERSION_FILE_SYNC); + if (pg_fsync(fd) != 0) + ereport(data_sync_elevel(ERROR), + (errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", versionfile))); + fsync_fname(dbpath, true); + pgstat_report_wait_end(); + + /* Close the version file. */ + CloseTransientFile(fd); + + /* If we are not in WAL replay then write the WAL. */ + if (!isRedo) + { + xl_dbase_create_wal_log_rec xlrec; + + START_CRIT_SECTION(); + + xlrec.db_id = dbid; + xlrec.tablespace_id = tsid; + + XLogBeginInsert(); + XLogRegisterData((char *) (&xlrec), + sizeof(xl_dbase_create_wal_log_rec)); + + (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE_WAL_LOG); + + 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); + } + pfree(srcpath); + pfree(dstpath); + } + 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 @@ -102,16 +671,16 @@ 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; char *src_collate = NULL; char *src_ctype = NULL; + char *src_iculocale = NULL; + char src_locprovider = '\0'; + char *src_collversion = NULL; bool src_istemplate; bool src_allowconn; - Oid src_lastsysoid = InvalidOid; TransactionId src_frozenxid = InvalidTransactionId; MultiXactId src_minmxid = InvalidMultiXactId; Oid src_deftablespace; @@ -120,7 +689,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) HeapTuple tuple; Datum new_record[Natts_pg_database]; bool new_record_nulls[Natts_pg_database]; - Oid dboid; + Oid dboid = InvalidOid; Oid datdba; ListCell *option; DefElem *dtablespacename = NULL; @@ -130,21 +699,29 @@ 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; + DefElem *dcollversion = NULL; + DefElem *dstrategy = NULL; char *dbname = stmt->dbname; char *dbowner = NULL; const char *dbtemplate = NULL; char *dbcollate = NULL; char *dbctype = NULL; + char *dbiculocale = NULL; + char dblocprovider = '\0'; char *canonname; int encoding = -1; bool dbistemplate = false; bool dballowconnections = true; int dbconnlimit = DATCONNLIMIT_UNLIMITED; + char *dbcollversion = NULL; int notherbackends; int npreparedxacts; + CreateDBStrategy dbstrategy = CREATEDB_WAL_LOG; createdb_failure_params fparms; /* Extract options from the statement node tree */ @@ -155,93 +732,81 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) if (strcmp(defel->defname, "tablespace") == 0) { if (dtablespacename) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dtablespacename = defel; } else if (strcmp(defel->defname, "owner") == 0) { if (downer) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); downer = defel; } else if (strcmp(defel->defname, "template") == 0) { if (dtemplate) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dtemplate = defel; } else if (strcmp(defel->defname, "encoding") == 0) { if (dencoding) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dencoding = defel; } else if (strcmp(defel->defname, "locale") == 0) { if (dlocale) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dlocale = defel; } else if (strcmp(defel->defname, "lc_collate") == 0) { if (dcollate) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dcollate = defel; } else if (strcmp(defel->defname, "lc_ctype") == 0) { if (dctype) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + 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) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); distemplate = defel; } else if (strcmp(defel->defname, "allow_connections") == 0) { if (dallowconnections) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dallowconnections = defel; } else if (strcmp(defel->defname, "connection_limit") == 0) { if (dconnlimit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dconnlimit = defel; } + else if (strcmp(defel->defname, "collation_version") == 0) + { + if (dcollversion) + errorConflictingDefElem(defel, pstate); + dcollversion = defel; + } else if (strcmp(defel->defname, "location") == 0) { ereport(WARNING, @@ -250,6 +815,36 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) errhint("Consider using tablespaces instead."), parser_errposition(pstate, defel->location))); } + else if (strcmp(defel->defname, "oid") == 0) + { + dboid = defGetObjectId(defel); + + /* + * We don't normally permit new databases to be created with + * system-assigned OIDs. pg_upgrade tries to preserve database + * OIDs, so we can't allow any database to be created with an OID + * that might be in use in a freshly-initialized cluster created + * by some future version. We assume all such OIDs will be from + * the system-managed OID range. + * + * As an exception, however, we permit any OID to be assigned when + * allow_system_table_mods=on (so that initdb can assign system + * OIDs to template0 and postgres) or when performing a binary + * upgrade (so that pg_upgrade can preserve whatever OIDs it finds + * in the source cluster). + */ + if (dboid < FirstNormalObjectId && + !allowSystemTableMods && !IsBinaryUpgrade) + ereport(ERROR, + (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), @@ -257,12 +852,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 +893,22 @@ 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 (distemplate && distemplate->arg) dbistemplate = defGetBoolean(distemplate); if (dallowconnections && dallowconnections->arg) @@ -316,6 +921,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid connection limit: %d", dbconnlimit))); } + if (dcollversion) + dbcollversion = defGetString(dcollversion); /* obtain OID of proposed owner */ if (dbowner) @@ -351,9 +958,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) if (!get_db_info(dbtemplate, ShareLock, &src_dboid, &src_owner, &src_encoding, - &src_istemplate, &src_allowconn, &src_lastsysoid, + &src_istemplate, &src_allowconn, &src_frozenxid, &src_minmxid, &src_deftablespace, - &src_collate, &src_ctype)) + &src_collate, &src_ctype, &src_iculocale, &src_locprovider, + &src_collversion)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("template database \"%s\" does not exist", @@ -382,6 +990,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; @@ -389,6 +1014,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbcollate = src_collate; if (dbctype == NULL) dbctype = src_ctype; + if (dblocprovider == '\0') + dblocprovider = src_locprovider; + if (dbiculocale == NULL && dblocprovider == COLLPROVIDER_ICU) + dbiculocale = src_iculocale; /* Some encodings are client only */ if (!PG_VALID_BE_ENCODING(encoding)) @@ -410,6 +1039,33 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) check_encoding_locale_matches(encoding, dbcollate, dbctype); + if (dblocprovider == COLLPROVIDER_ICU) + { + if (!(is_encoding_supported_by_icu(encoding))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("encoding \"%s\" is not supported with ICU provider", + pg_encoding_to_char(encoding)))); + + /* + * 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"))); + + check_icu_locale(dbiculocale); + } + else + { + if (dbiculocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("ICU locale cannot be specified unless locale provider is ICU"))); + } + /* * Check that the new encoding and locale settings match the source * database. We insist on this because we simply copy the source data --- @@ -443,8 +1099,73 @@ 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."))); + } + } + + /* + * If we got a collation version for the template database, check that it + * matches the actual OS collation version. Otherwise error; the user + * needs to fix the template database first. Don't complain if a + * collation version was specified explicitly as a statement option; that + * is used by pg_upgrade to reproduce the old state exactly. + * + * (If the template database has no collation version, then either the + * platform/provider does not support collation versioning, or it's + * template0, for which we stipulate that it does not contain + * collation-using objects.) + */ + if (src_collversion && !dcollversion) + { + char *actual_versionstr; + + 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", + dbtemplate))); + + if (strcmp(actual_versionstr, src_collversion) != 0) + ereport(ERROR, + (errmsg("template database \"%s\" has a collation version mismatch", + dbtemplate), + errdetail("The template database was created using collation version %s, " + "but the operating system provides version %s.", + src_collversion, actual_versionstr), + errhint("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.", + quote_identifier(dbtemplate)))); } + if (dbcollversion == NULL) + dbcollversion = src_collversion; + + /* + * Normally, we copy the collation version from the template database. + * This last resort only applies if the template database does not have a + * collation version, which is normally only the case for template0. + */ + if (dbcollversion == NULL) + dbcollversion = get_collation_actual_version(dblocprovider, dblocprovider == COLLPROVIDER_ICU ? dbiculocale : dbcollate); + /* Resolve default tablespace for new database */ if (dtablespacename && dtablespacename->arg) { @@ -547,11 +1268,34 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) */ pg_database_rel = table_open(DatabaseRelationId, RowExclusiveLock); - do + /* + * If database OID is configured, check if the OID is already in use or + * data directory already exists. + */ + if (OidIsValid(dboid)) + { + char *existing_dbname = get_database_name(dboid); + + if (existing_dbname != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE)), + errmsg("database OID %u is already in use by database \"%s\"", + dboid, existing_dbname)); + + if (check_db_file_conflict(dboid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE)), + errmsg("data directory with the specified OID %u already exists", dboid)); + } + else { - dboid = GetNewOidWithIndex(pg_database_rel, DatabaseOidIndexId, - Anum_pg_database_oid); - } while (check_db_file_conflict(dboid)); + /* Select an OID for the new database if is not explicitly configured. */ + do + { + dboid = GetNewOidWithIndex(pg_database_rel, DatabaseOidIndexId, + Anum_pg_database_oid); + } while (check_db_file_conflict(dboid)); + } /* * Insert a new tuple into pg_database. This establishes our ownership of @@ -559,6 +1303,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)); @@ -568,17 +1315,23 @@ 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_datcollate - 1] = - DirectFunctionCall1(namein, CStringGetDatum(dbcollate)); - new_record[Anum_pg_database_datctype - 1] = - DirectFunctionCall1(namein, CStringGetDatum(dbctype)); + 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); - new_record[Anum_pg_database_datlastsysoid - 1] = ObjectIdGetDatum(src_lastsysoid); new_record[Anum_pg_database_datfrozenxid - 1] = TransactionIdGetDatum(src_frozenxid); new_record[Anum_pg_database_datminmxid - 1] = TransactionIdGetDatum(src_minmxid); 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 + new_record_nulls[Anum_pg_database_datcollversion - 1] = true; /* * We deliberately set datacl to default (NULL), rather than copying it @@ -606,17 +1359,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 @@ -627,101 +1381,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. + * 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. */ - 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. - */ - 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. @@ -807,6 +1484,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 @@ -846,7 +1542,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) { @@ -961,6 +1657,11 @@ dropdb(const char *dbname, bool missing_ok, bool force) */ dropDatabaseDependencies(db_id); + /* + * Tell the cumulative stats system to forget it immediately, too. + */ + pgstat_drop_database(db_id); + tup = SearchSysCacheCopy1(DATABASEOID, ObjectIdGetDatum(db_id)); if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for database %u", db_id); @@ -999,11 +1700,6 @@ dropdb(const char *dbname, bool missing_ok, bool force) */ DropDatabaseBuffers(db_id); - /* - * Tell the stats collector to forget it immediately, too. - */ - pgstat_drop_database(db_id); - /* * Tell checkpointer to forget any pending fsync and unlink requests for * files in the database; else the fsyncs will fail at next checkpoint, or @@ -1014,12 +1710,13 @@ dropdb(const char *dbname, bool missing_ok, bool force) /* * Force a checkpoint to make sure the checkpointer has received the - * message sent by ForgetDatabaseSyncRequests. On Windows, this also - * ensures that background procs don't hold any open files, which would - * cause rmdir() to fail. + * message sent by ForgetDatabaseSyncRequests. */ RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); + /* Close all smgr fds in all backends. */ + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + /* * Remove all tablespace subdirs belonging to the database. */ @@ -1060,7 +1757,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))); @@ -1173,7 +1870,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, NULL, &src_tblspcoid, 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))); @@ -1268,6 +1965,9 @@ movedb(const char *dbname, const char *tblspcname) RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FLUSH_ALL); + /* Close all smgr fds in all backends. */ + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + /* * Now drop all buffers holding data of the target database; they should * no longer be dirty so DropDatabaseBuffers is safe. @@ -1339,7 +2039,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; @@ -1347,10 +2047,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); } /* @@ -1386,9 +2087,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); @@ -1453,6 +2155,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 */ @@ -1466,6 +2171,8 @@ movedb_failure_callback(int code, Datum arg) dstpath = GetDatabasePath(fparms->dest_dboid, fparms->dest_tsoid); (void) rmtree(dstpath, true); + + pfree(dstpath); } /* @@ -1526,37 +2233,25 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) if (strcmp(defel->defname, "is_template") == 0) { if (distemplate) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); distemplate = defel; } else if (strcmp(defel->defname, "allow_connections") == 0) { if (dallowconnections) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dallowconnections = defel; } else if (strcmp(defel->defname, "connection_limit") == 0) { if (dconnlimit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dconnlimit = defel; } else if (strcmp(defel->defname, "tablespace") == 0) { if (dtablespace) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dtablespace = defel; } else @@ -1680,6 +2375,89 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) } +/* + * ALTER DATABASE name REFRESH COLLATION VERSION + */ +ObjectAddress +AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt) +{ + Relation rel; + ScanKeyData scankey; + SysScanDesc scan; + Oid db_id; + HeapTuple tuple; + Form_pg_database datForm; + ObjectAddress address; + Datum datum; + bool isnull; + char *oldversion; + char *newversion; + + rel = table_open(DatabaseRelationId, RowExclusiveLock); + ScanKeyInit(&scankey, + Anum_pg_database_datname, + BTEqualStrategyNumber, F_NAMEEQ, + CStringGetDatum(stmt->dbname)); + scan = systable_beginscan(rel, DatabaseNameIndexId, true, + NULL, 1, &scankey); + tuple = systable_getnext(scan); + if (!HeapTupleIsValid(tuple)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database \"%s\" does not exist", stmt->dbname))); + + datForm = (Form_pg_database) GETSTRUCT(tuple); + db_id = datForm->oid; + + if (!pg_database_ownercheck(db_id, GetUserId())) + aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_DATABASE, + stmt->dbname); + + datum = heap_getattr(tuple, Anum_pg_database_datcollversion, RelationGetDescr(rel), &isnull); + oldversion = isnull ? NULL : 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)) + elog(ERROR, "invalid collation version change"); + else if (oldversion && newversion && strcmp(newversion, oldversion) != 0) + { + bool nulls[Natts_pg_database] = {0}; + bool replaces[Natts_pg_database] = {0}; + Datum values[Natts_pg_database] = {0}; + + ereport(NOTICE, + (errmsg("changing version from %s to %s", + oldversion, newversion))); + + values[Anum_pg_database_datcollversion - 1] = CStringGetTextDatum(newversion); + replaces[Anum_pg_database_datcollversion - 1] = true; + + tuple = heap_modify_tuple(tuple, RelationGetDescr(rel), + values, nulls, replaces); + CatalogTupleUpdate(rel, &tuple->t_self, tuple); + heap_freetuple(tuple); + } + else + ereport(NOTICE, + (errmsg("version has not changed"))); + + InvokeObjectPostAlterHook(DatabaseRelationId, db_id, 0); + + ObjectAddressSet(address, DatabaseRelationId, db_id); + + systable_endscan(scan); + + table_close(rel, NoLock); + + return address; +} + + /* * ALTER DATABASE name SET ... */ @@ -1822,6 +2600,38 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId) } +Datum +pg_database_collation_actual_version(PG_FUNCTION_ARGS) +{ + Oid dbid = PG_GETARG_OID(0); + HeapTuple tp; + char datlocprovider; + Datum datum; + bool isnull; + char *version; + + tp = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(dbid)); + if (!HeapTupleIsValid(tp)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("database with OID %u does not exist", dbid))); + + 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); + + if (version) + PG_RETURN_TEXT_P(cstring_to_text(version)); + else + PG_RETURN_NULL(); +} + + /* * Helper functions */ @@ -1836,9 +2646,10 @@ static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, - Oid *dbLastSysOidP, TransactionId *dbFrozenXidP, - MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype) + TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, + Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbIculocale, + char *dbLocProvider, + char **dbCollversion) { bool result = false; Relation relation; @@ -1903,6 +2714,9 @@ get_db_info(const char *name, LOCKMODE lockmode, if (strcmp(name, NameStr(dbform->datname)) == 0) { + Datum datum; + bool isnull; + /* oid of the database */ if (dbIdP) *dbIdP = dbOid; @@ -1918,9 +2732,6 @@ get_db_info(const char *name, LOCKMODE lockmode, /* allowing connections? */ if (dbAllowConnP) *dbAllowConnP = dbform->datallowconn; - /* last system OID used in database */ - if (dbLastSysOidP) - *dbLastSysOidP = dbform->datlastsysoid; /* limit of frozen XIDs */ if (dbFrozenXidP) *dbFrozenXidP = dbform->datfrozenxid; @@ -1931,10 +2742,36 @@ 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) - *dbCollate = pstrdup(NameStr(dbform->datcollate)); + { + datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datcollate, &isnull); + Assert(!isnull); + *dbCollate = TextDatumGetCString(datum); + } if (dbCtype) - *dbCtype = pstrdup(NameStr(dbform->datctype)); + { + datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datctype, &isnull); + 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); + if (isnull) + *dbCollversion = NULL; + else + *dbCollversion = TextDatumGetCString(datum); + } ReleaseSysCache(tuple); result = true; break; @@ -2279,9 +3116,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; char *parent_path; @@ -2338,12 +3176,37 @@ 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 * * 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) + { + xl_dbase_create_wal_log_rec *xlrec = + (xl_dbase_create_wal_log_rec *) XLogRecGetData(record); + char *dbpath; + char *parent_path; + + dbpath = GetDatabasePath(xlrec->db_id, xlrec->tablespace_id); + + /* create the parent directory if needed and valid */ + parent_path = pstrdup(dbpath); + get_parent_directory(parent_path); + recovery_create_dbdir(parent_path, true); + + /* 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) { @@ -2379,6 +3242,9 @@ dbase_redo(XLogReaderState *record) /* Clean out the xlog relcache too */ XLogDropDatabase(xlrec->db_id); + /* Close all sgmr fds in all backends. */ + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + for (i = 0; i < xlrec->ntablespaces; i++) { dst_path = GetDatabasePath(xlrec->db_id, xlrec->tablespace_ids[i]); diff --git a/third_party/spanner_pg/src/backend/commands/define.c b/third_party/spanner_pg/src/backend/commands/define.c index 84487b7d..1e07fa97 100644 --- a/third_party/spanner_pg/src/backend/commands/define.c +++ b/third_party/spanner_pg/src/backend/commands/define.c @@ -4,7 +4,7 @@ * Support routines for various kinds of object creation. * * - * 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 * * @@ -58,12 +58,9 @@ defGetString(DefElem *def) case T_Integer: return psprintf("%ld", (long) intVal(def->arg)); case T_Float: - - /* - * T_Float values are kept in string form, so this type cheat - * works (and doesn't risk losing precision) - */ - return strVal(def->arg); + return castNode(Float, def->arg)->fval; + case T_Boolean: + return boolVal(def->arg) ? "true" : "false"; case T_String: return strVal(def->arg); case T_TypeName: @@ -206,7 +203,40 @@ defGetInt64(DefElem *def) * strings. */ return DatumGetInt64(DirectFunctionCall1(int8in, - CStringGetDatum(strVal(def->arg)))); + CStringGetDatum(castNode(Float, def->arg)->fval))); + default: + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s requires a numeric value", + def->defname))); + } + return 0; /* keep compiler quiet */ +} + +/* + * Extract an OID value from a DefElem. + */ +Oid +defGetObjectId(DefElem *def) +{ + if (def->arg == NULL) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s requires a numeric value", + def->defname))); + switch (nodeTag(def->arg)) + { + case T_Integer: + return (Oid) intVal(def->arg); + case T_Float: + + /* + * Values too large for int4 will be represented as Float + * constants by the lexer. Accept these if they are valid OID + * strings. + */ + return DatumGetObjectId(DirectFunctionCall1(oidin, + CStringGetDatum(castNode(Float, def->arg)->fval))); default: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -347,3 +377,15 @@ defGetStringList(DefElem *def) return (List *) def->arg; } + +/* + * Raise an error about a conflicting DefElem. + */ +void +errorConflictingDefElem(DefElem *defel, ParseState *pstate) +{ + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"), + parser_errposition(pstate, defel->location)); +} diff --git a/third_party/spanner_pg/src/backend/commands/discard.c b/third_party/spanner_pg/src/backend/commands/discard.c index 57d3d7dd..c583539e 100644 --- a/third_party/spanner_pg/src/backend/commands/discard.c +++ b/third_party/spanner_pg/src/backend/commands/discard.c @@ -3,7 +3,7 @@ * discard.c * The implementation of the DISCARD command * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/commands/dropcmds.c b/third_party/spanner_pg/src/backend/commands/dropcmds.c index 97e5e9a7..c9b57324 100644 --- a/third_party/spanner_pg/src/backend/commands/dropcmds.c +++ b/third_party/spanner_pg/src/backend/commands/dropcmds.c @@ -3,7 +3,7 @@ * dropcmds.c * handle various "DROP" operations * - * 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 * * @@ -255,7 +255,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) { case OBJECT_ACCESS_METHOD: msg = gettext_noop("access method \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_TYPE: case OBJECT_DOMAIN: @@ -285,7 +285,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) break; case OBJECT_SCHEMA: msg = gettext_noop("schema \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_STATISTIC_EXT: if (!schema_does_not_exist_skipping(castNode(List, object), &msg, &name)) @@ -324,7 +324,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) break; case OBJECT_EXTENSION: msg = gettext_noop("extension \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_FUNCTION: { @@ -392,7 +392,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) } case OBJECT_LANGUAGE: msg = gettext_noop("language \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_CAST: { @@ -434,7 +434,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) break; case OBJECT_EVENT_TRIGGER: msg = gettext_noop("event trigger \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_RULE: if (!owningrel_does_not_exist_skipping(castNode(List, object), &msg, &name)) @@ -447,11 +447,11 @@ does_not_exist_skipping(ObjectType objtype, Node *object) break; case OBJECT_FDW: msg = gettext_noop("foreign-data wrapper \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_FOREIGN_SERVER: msg = gettext_noop("server \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; case OBJECT_OPCLASS: { @@ -479,7 +479,7 @@ does_not_exist_skipping(ObjectType objtype, Node *object) break; case OBJECT_PUBLICATION: msg = gettext_noop("publication \"%s\" does not exist, skipping"); - name = strVal((Value *) object); + name = strVal(object); break; default: elog(ERROR, "unrecognized object type: %d", (int) objtype); diff --git a/third_party/spanner_pg/src/backend/commands/event_trigger.c b/third_party/spanner_pg/src/backend/commands/event_trigger.c index 5cf7da44..294e0b14 100644 --- a/third_party/spanner_pg/src/backend/commands/event_trigger.c +++ b/third_party/spanner_pg/src/backend/commands/event_trigger.c @@ -3,7 +3,7 @@ * event_trigger.c * PostgreSQL EVENT TRIGGER support code. * - * 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 * * IDENTIFICATION @@ -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: @@ -976,6 +977,7 @@ EventTriggerSupportsObjectType(ObjectType obtype) case OBJECT_POLICY: case OBJECT_PROCEDURE: case OBJECT_PUBLICATION: + case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_ROUTINE: case OBJECT_RULE: @@ -1017,6 +1019,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: @@ -1053,6 +1056,7 @@ EventTriggerSupportsObjectClass(ObjectClass objclass) case OCLASS_EXTENSION: case OCLASS_POLICY: case OCLASS_PUBLICATION: + case OCLASS_PUBLICATION_NAMESPACE: case OCLASS_PUBLICATION_REL: case OCLASS_SUBSCRIPTION: case OCLASS_TRANSFORM: @@ -1291,10 +1295,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; /* @@ -1307,30 +1307,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); + InitMaterializedSRF(fcinfo, 0); slist_foreach(iter, &(currentEventTriggerState->SQLDropList)) { @@ -1399,12 +1377,10 @@ 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); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -1850,10 +1826,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; /* @@ -1865,30 +1837,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); + InitMaterializedSRF(fcinfo, 0); foreach(lc, currentEventTriggerState->commandList) { @@ -1985,11 +1935,7 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) elog(ERROR, "invalid null namespace in object %u/%u/%d", addr.classId, addr.objectId, addr.objectSubId); - /* XXX not quite get_namespace_name_or_temp */ - if (isAnyTempNamespace(schema_oid)) - schema = pstrdup("pg_temp"); - else - schema = get_namespace_name(schema_oid); + schema = get_namespace_name_or_temp(schema_oid); table_close(catalog, AccessShareLock); } @@ -2063,12 +2009,10 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) break; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - PG_RETURN_VOID(); } @@ -2103,6 +2047,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: @@ -2133,6 +2079,7 @@ stringify_grant_objtype(ObjectType objtype) case OBJECT_OPFAMILY: case OBJECT_POLICY: case OBJECT_PUBLICATION: + case OBJECT_PUBLICATION_NAMESPACE: case OBJECT_PUBLICATION_REL: case OBJECT_ROLE: case OBJECT_RULE: @@ -2214,8 +2161,10 @@ 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: case OBJECT_PUBLICATION_REL: case OBJECT_ROLE: case OBJECT_RULE: diff --git a/third_party/spanner_pg/src/backend/commands/explain.c b/third_party/spanner_pg/src/backend/commands/explain.c index 23c88220..99d7af60 100644 --- a/third_party/spanner_pg/src/backend/commands/explain.c +++ b/third_party/spanner_pg/src/backend/commands/explain.c @@ -3,7 +3,7 @@ * explain.c * Explain query execution plans * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION @@ -1190,6 +1190,9 @@ ExplainNode(PlanState *planstate, List *ancestors, case CMD_DELETE: pname = operation = "Delete"; break; + case CMD_MERGE: + pname = operation = "Merge"; + break; default: pname = "???"; break; @@ -1987,6 +1990,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); @@ -3104,7 +3115,7 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) ListCell *lc; List *context; StringInfoData keystr; - char *seperator = ""; + char *separator = ""; bool useprefix; int64 memPeakKb; @@ -3125,11 +3136,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) @@ -3512,8 +3523,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) { @@ -3578,16 +3592,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"); + 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'); } @@ -3624,6 +3655,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); } } } @@ -3760,7 +3797,7 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es) Assert(rte->rtekind == RTE_RELATION); objectname = get_rel_name(rte->relid); if (es->verbose) - namespace = get_namespace_name(get_rel_namespace(rte->relid)); + namespace = get_namespace_name_or_temp(get_rel_namespace(rte->relid)); objecttag = "Relation Name"; break; case T_FunctionScan: @@ -3787,8 +3824,7 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es) objectname = get_func_name(funcid); if (es->verbose) - namespace = - get_namespace_name(get_func_namespace(funcid)); + namespace = get_namespace_name_or_temp(get_func_namespace(funcid)); } } objecttag = "Function Name"; @@ -3880,6 +3916,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 ???"; @@ -4002,6 +4043,53 @@ 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); + + if (es->format == EXPLAIN_FORMAT_TEXT) + { + 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 + { + 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/third_party/spanner_pg/src/backend/commands/extension.c b/third_party/spanner_pg/src/backend/commands/extension.c index a9121f20..a2601508 100644 --- a/third_party/spanner_pg/src/backend/commands/extension.c +++ b/third_party/spanner_pg/src/backend/commands/extension.c @@ -12,7 +12,7 @@ * postgresql.conf. An extension also has an installation script file, * containing SQL commands to create the extension's objects. * - * 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 * * @@ -488,11 +488,22 @@ parse_extension_control_file(ExtensionControlFile *control, if ((file = AllocateFile(filename, "r")) == NULL) { - if (version && errno == ENOENT) + if (errno == ENOENT) { - /* no auxiliary file for this version */ - pfree(filename); - return; + /* no complaint for missing auxiliary file */ + if (version) + { + pfree(filename); + return; + } + + /* missing control file indicates extension is not installed */ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("extension \"%s\" is not available", control->name), + errdetail("Could not open extension control file \"%s\": %m.", + filename), + errhint("The extension must first be installed on the system where PostgreSQL is running."))); } ereport(ERROR, (errcode_for_file_access(), @@ -747,11 +758,11 @@ execute_sql_string(const char *sql) /* Be sure parser can see any DDL done so far */ CommandCounterIncrement(); - stmt_list = pg_analyze_and_rewrite(parsetree, - sql, - NULL, - 0, - NULL); + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, + sql, + NULL, + 0, + NULL); stmt_list = pg_plan_queries(stmt_list, sql, CURSOR_OPT_PARALLEL_OK, NULL); foreach(lc2, stmt_list) @@ -897,6 +908,9 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, * We use the equivalent of a function SET option to allow the setting to * persist for exactly the duration of the script execution. guc.c also * takes care of undoing the setting on error. + * + * log_min_messages can't be set by ordinary users, so for that one we + * pretend to be superuser. */ save_nestlevel = NewGUCNestLevel(); @@ -905,9 +919,10 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, PGC_USERSET, PGC_S_SESSION, GUC_ACTION_SAVE, true, 0, false); if (log_min_messages < WARNING) - (void) set_config_option("log_min_messages", "warning", - PGC_SUSET, PGC_S_SESSION, - GUC_ACTION_SAVE, true, 0, false); + (void) set_config_option_ext("log_min_messages", "warning", + PGC_SUSET, PGC_S_SESSION, + BOOTSTRAP_SUPERUSERID, + GUC_ACTION_SAVE, true, 0, false); /* * Similarly disable check_function_bodies, to ensure that SQL functions @@ -1753,30 +1768,21 @@ CreateExtension(ParseState *pstate, CreateExtensionStmt *stmt) if (strcmp(defel->defname, "schema") == 0) { if (d_schema) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); d_schema = defel; schemaName = defGetString(d_schema); } else if (strcmp(defel->defname, "new_version") == 0) { if (d_new_version) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); d_new_version = defel; versionName = defGetString(d_new_version); } else if (strcmp(defel->defname, "cascade") == 0) { if (d_cascade) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); d_cascade = defel; cascade = defGetBoolean(d_cascade); } @@ -1952,38 +1958,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); + InitMaterializedSRF(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2035,15 +2015,13 @@ 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); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -2060,38 +2038,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); + InitMaterializedSRF(fcinfo, 0); location = get_extension_control_directory(); dir = AllocateDir(location); @@ -2126,15 +2078,13 @@ 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); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -2342,10 +2292,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; @@ -2353,30 +2299,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); + InitMaterializedSRF(fcinfo, 0); /* Read the extension's control file */ control = read_extension_control_file(NameStr(*extname)); @@ -2433,13 +2357,11 @@ pg_extension_update_paths(PG_FUNCTION_ARGS) pfree(pathbuf.data); } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - return (Datum) 0; } @@ -3070,10 +2992,7 @@ ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt) if (strcmp(defel->defname, "new_version") == 0) { if (d_new_version) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); d_new_version = defel; } else diff --git a/third_party/spanner_pg/src/backend/commands/foreigncmds.c b/third_party/spanner_pg/src/backend/commands/foreigncmds.c index 901b8bc8..91f4dd30 100644 --- a/third_party/spanner_pg/src/backend/commands/foreigncmds.c +++ b/third_party/spanner_pg/src/backend/commands/foreigncmds.c @@ -3,7 +3,7 @@ * foreigncmds.c * foreign-data wrapper/server creation/manipulation commands * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -515,7 +515,7 @@ lookup_fdw_validator_func(DefElem *validator) * Process function options of CREATE/ALTER FDW */ static void -parse_func_options(List *func_options, +parse_func_options(ParseState *pstate, List *func_options, bool *handler_given, Oid *fdwhandler, bool *validator_given, Oid *fdwvalidator) { @@ -534,18 +534,14 @@ parse_func_options(List *func_options, if (strcmp(def->defname, "handler") == 0) { if (*handler_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(def, pstate); *handler_given = true; *fdwhandler = lookup_fdw_handler_func(def); } else if (strcmp(def->defname, "validator") == 0) { if (*validator_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(def, pstate); *validator_given = true; *fdwvalidator = lookup_fdw_validator_func(def); } @@ -559,7 +555,7 @@ parse_func_options(List *func_options, * Create a foreign-data wrapper */ ObjectAddress -CreateForeignDataWrapper(CreateFdwStmt *stmt) +CreateForeignDataWrapper(ParseState *pstate, CreateFdwStmt *stmt) { Relation rel; Datum values[Natts_pg_foreign_data_wrapper]; @@ -577,7 +573,7 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt) rel = table_open(ForeignDataWrapperRelationId, RowExclusiveLock); - /* Must be super user */ + /* Must be superuser */ if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), @@ -611,7 +607,7 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt) values[Anum_pg_foreign_data_wrapper_fdwowner - 1] = ObjectIdGetDatum(ownerId); /* Lookup handler and validator functions, if given */ - parse_func_options(stmt->func_options, + parse_func_options(pstate, stmt->func_options, &handler_given, &fdwhandler, &validator_given, &fdwvalidator); @@ -675,7 +671,7 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt) * Alter foreign-data wrapper */ ObjectAddress -AlterForeignDataWrapper(AlterFdwStmt *stmt) +AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt) { Relation rel; HeapTuple tp; @@ -694,7 +690,7 @@ AlterForeignDataWrapper(AlterFdwStmt *stmt) rel = table_open(ForeignDataWrapperRelationId, RowExclusiveLock); - /* Must be super user */ + /* Must be superuser */ if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), @@ -717,7 +713,7 @@ AlterForeignDataWrapper(AlterFdwStmt *stmt) memset(repl_null, false, sizeof(repl_null)); memset(repl_repl, false, sizeof(repl_repl)); - parse_func_options(stmt->func_options, + parse_func_options(pstate, stmt->func_options, &handler_given, &fdwhandler, &validator_given, &fdwvalidator); diff --git a/third_party/spanner_pg/src/backend/commands/functioncmds.c b/third_party/spanner_pg/src/backend/commands/functioncmds.c index 9d186580..694bbce2 100644 --- a/third_party/spanner_pg/src/backend/commands/functioncmds.c +++ b/third_party/spanner_pg/src/backend/commands/functioncmds.c @@ -5,7 +5,7 @@ * Routines for CREATE and DROP FUNCTION commands and CREATE and DROP * CAST commands. * - * 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 * * @@ -526,7 +526,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*volatility_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *volatility_item = defel; } @@ -535,14 +535,14 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*strict_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *strict_item = defel; } else if (strcmp(defel->defname, "security") == 0) { if (*security_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *security_item = defel; } @@ -551,7 +551,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*leakproof_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *leakproof_item = defel; } @@ -564,7 +564,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*cost_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *cost_item = defel; } @@ -573,7 +573,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*rows_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *rows_item = defel; } @@ -582,7 +582,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*support_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *support_item = defel; } @@ -591,7 +591,7 @@ compute_common_attribute(ParseState *pstate, if (is_procedure) goto procedure_error; if (*parallel_item) - goto duplicate_error; + errorConflictingDefElem(defel, pstate); *parallel_item = defel; } @@ -601,13 +601,6 @@ compute_common_attribute(ParseState *pstate, /* Recognized an option */ return true; -duplicate_error: - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); - return false; /* keep compiler quiet */ - procedure_error: ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), @@ -768,37 +761,25 @@ compute_function_attributes(ParseState *pstate, if (strcmp(defel->defname, "as") == 0) { if (as_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); as_item = defel; } else if (strcmp(defel->defname, "language") == 0) { if (language_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); language_item = defel; } else if (strcmp(defel->defname, "transform") == 0) { if (transform_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); transform_item = defel; } else if (strcmp(defel->defname, "window") == 0) { if (windowfunc_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); if (is_procedure) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), @@ -834,15 +815,15 @@ compute_function_attributes(ParseState *pstate, if (transform_item) *transform = transform_item->arg; if (windowfunc_item) - *windowfunc_p = intVal(windowfunc_item->arg); + *windowfunc_p = boolVal(windowfunc_item->arg); if (volatility_item) *volatility_p = interpret_func_volatility(volatility_item); if (strict_item) - *strict_p = intVal(strict_item->arg); + *strict_p = boolVal(strict_item->arg); if (security_item) - *security_definer = intVal(security_item->arg); + *security_definer = boolVal(security_item->arg); if (leakproof_item) - *leakproof_p = intVal(leakproof_item->arg); + *leakproof_p = boolVal(leakproof_item->arg); if (set_items) *proconfig = update_proconfig_value(NULL, set_items); if (cost_item) @@ -1346,6 +1327,8 @@ RemoveFunctionById(Oid funcOid) table_close(relation, RowExclusiveLock); + pgstat_drop_function(funcOid); + /* * If there's a pg_aggregate tuple, delete that too. */ @@ -1438,12 +1421,12 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt) if (volatility_item) procForm->provolatile = interpret_func_volatility(volatility_item); if (strict_item) - procForm->proisstrict = intVal(strict_item->arg); + procForm->proisstrict = boolVal(strict_item->arg); if (security_def_item) - procForm->prosecdef = intVal(security_def_item->arg); + procForm->prosecdef = boolVal(security_def_item->arg); if (leakproof_item) { - procForm->proleakproof = intVal(leakproof_item->arg); + procForm->proleakproof = boolVal(leakproof_item->arg); if (procForm->proleakproof && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), @@ -2074,7 +2057,7 @@ IsThereFunctionInNamespace(const char *proname, int pronargs, * See at ExecuteCallStmt() about the atomic argument. */ void -ExecuteDoStmt(DoStmt *stmt, bool atomic) +ExecuteDoStmt(ParseState *pstate, DoStmt *stmt, bool atomic) { InlineCodeBlock *codeblock = makeNode(InlineCodeBlock); ListCell *arg; @@ -2093,17 +2076,13 @@ ExecuteDoStmt(DoStmt *stmt, bool atomic) if (strcmp(defel->defname, "as") == 0) { if (as_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); as_item = defel; } else if (strcmp(defel->defname, "language") == 0) { if (language_item) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); language_item = defel; } else diff --git a/third_party/spanner_pg/src/backend/commands/indexcmds.c b/third_party/spanner_pg/src/backend/commands/indexcmds.c index 1e5a09a1..9e177b16 100644 --- a/third_party/spanner_pg/src/backend/commands/indexcmds.c +++ b/third_party/spanner_pg/src/backend/commands/indexcmds.c @@ -3,7 +3,7 @@ * indexcmds.c * POSTGRES define and remove index code. * - * 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 * * @@ -134,7 +134,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. @@ -230,7 +230,7 @@ CheckIndexCompatible(Oid oldId, * ii_NumIndexKeyAttrs with same value. */ indexInfo = makeIndexInfo(numberOfAttributes, numberOfAttributes, - accessMethodId, NIL, NIL, false, false, false); + accessMethodId, NIL, NIL, false, false, false, false); typeObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); collationObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); classObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); @@ -677,22 +677,12 @@ DefineIndex(Oid relationId, case RELKIND_PARTITIONED_TABLE: /* OK */ break; - case RELKIND_FOREIGN_TABLE: - - /* - * Custom error message for FOREIGN TABLE since the term is close - * to a regular table and can confuse the user. - */ - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot create index on foreign table \"%s\"", - RelationGetRelationName(rel)))); - break; default: ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table or materialized view", - RelationGetRelationName(rel)))); + errmsg("cannot create index on relation \"%s\"", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); break; } @@ -904,6 +894,7 @@ DefineIndex(Oid relationId, NIL, /* expressions, NIL for now */ make_ands_implicit((Expr *) stmt->whereClause), stmt->unique, + stmt->nulls_not_distinct, !concurrent, concurrent); @@ -1014,10 +1005,13 @@ DefineIndex(Oid relationId, { if (key->partattrs[i] == indexInfo->ii_IndexAttrNumbers[j]) { - /* Matched the column, now what about the equality op? */ + /* Matched the column, now what about the collation and equality op? */ Oid idx_opfamily; Oid idx_opcintype; + if (key->partcollation[i] != collationObjectId[j]) + continue; + if (get_opclass_opfamily_and_input_type(classObjectId[j], &idx_opfamily, &idx_opcintype)) @@ -1721,33 +1715,6 @@ DefineIndex(Oid relationId, } -/* - * CheckMutability - * Test whether given expression is mutable - */ -static bool -CheckMutability(Expr *expr) -{ - /* - * First run the expression through the planner. This has a couple of - * important consequences. First, function default arguments will get - * inserted, which may affect volatility (consider "default now()"). - * Second, inline-able functions will get inlined, which may allow us to - * conclude that the function is really less volatile than it's marked. As - * an example, polymorphic functions must be marked with the most volatile - * behavior that they have for any input type, but once we inline the - * function we may be able to conclude that it's not so volatile for the - * particular input type we're dealing with. - * - * We assume here that expression_planner() won't scribble on its input. - */ - expr = expression_planner(expr); - - /* Now we can search for non-immutable functions */ - return contain_mutable_functions((Node *) expr); -} - - /* * CheckPredicate * Checks that the given partial-index predicate is valid. @@ -1771,7 +1738,7 @@ CheckPredicate(Expr *predicate) * A predicate using mutable functions is probably wrong, for the same * reasons that we don't allow an index expression to use one. */ - if (CheckMutability(predicate)) + if (contain_mutable_functions_after_planning(predicate)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("functions in index predicate must be marked IMMUTABLE"))); @@ -1914,7 +1881,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, * same data every time, it's not clear what the index entries * mean at all. */ - if (CheckMutability((Expr *) expr)) + if (contain_mutable_functions_after_planning((Expr *) expr)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("functions in index expression must be marked IMMUTABLE"))); @@ -2376,7 +2343,7 @@ makeObjectName(const char *name1, const char *name2, const char *label) Assert(availchars > 0); /* else caller chose a bad label */ /* - * If we must truncate, preferentially truncate the longer name. This + * If we must truncate, preferentially truncate the longer name. This * logic could be expressed without a loop, but it's simple and obvious as * a loop. */ @@ -3111,8 +3078,7 @@ reindex_error_callback(void *arg) { ReindexErrorInfo *errinfo = (ReindexErrorInfo *) arg; - Assert(errinfo->relkind == RELKIND_PARTITIONED_INDEX || - errinfo->relkind == RELKIND_PARTITIONED_TABLE); + Assert(RELKIND_HAS_PARTITIONS(errinfo->relkind)); if (errinfo->relkind == RELKIND_PARTITIONED_TABLE) errcontext("while reindexing partitioned table \"%s.%s\"", @@ -3141,8 +3107,7 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) ErrorContextCallback errcallback; ReindexErrorInfo errinfo; - Assert(relkind == RELKIND_PARTITIONED_INDEX || - relkind == RELKIND_PARTITIONED_TABLE); + Assert(RELKIND_HAS_PARTITIONS(relkind)); /* * Check if this runs in a transaction block, with an error callback to @@ -3275,8 +3240,7 @@ ReindexMultipleInternal(List *relids, ReindexParams *params) * Partitioned tables and indexes can never be processed directly, and * a list of their leaves should be built first. */ - Assert(relkind != RELKIND_PARTITIONED_INDEX && - relkind != RELKIND_PARTITIONED_TABLE); + Assert(!RELKIND_HAS_PARTITIONS(relkind)); if ((params->options & REINDEXOPT_CONCURRENTLY) != 0 && relpersistence != RELPERSISTENCE_TEMP) diff --git a/third_party/spanner_pg/src/backend/commands/lockcmds.c b/third_party/spanner_pg/src/backend/commands/lockcmds.c index 0053db0e..d58473ca 100644 --- a/third_party/spanner_pg/src/backend/commands/lockcmds.c +++ b/third_party/spanner_pg/src/backend/commands/lockcmds.c @@ -3,7 +3,7 @@ * lockcmds.c * LOCK command support code * - * 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 * * @@ -90,8 +90,9 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid, relkind != RELKIND_VIEW) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table or view", - rv->relname))); + errmsg("cannot lock relation \"%s\"", + rv->relname), + errdetail_relkind_not_supported(relkind))); /* * Make note if a temporary relation has been accessed in this @@ -169,7 +170,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 +216,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 +264,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/third_party/spanner_pg/src/backend/commands/matview.c b/third_party/spanner_pg/src/backend/commands/matview.c index 533f46b4..f84b65fb 100644 --- a/third_party/spanner_pg/src/backend/commands/matview.c +++ b/third_party/spanner_pg/src/backend/commands/matview.c @@ -3,7 +3,7 @@ * matview.c * materialized view support * - * 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 * * @@ -298,8 +298,9 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, * it against access by any other process until commit (by which time it * will be gone). */ - OIDNewHeap = make_new_heap(matviewOid, tableSpace, relpersistence, - ExclusiveLock); + OIDNewHeap = make_new_heap(matviewOid, tableSpace, + matviewRel->rd_rel->relam, + relpersistence, ExclusiveLock); LockRelationOid(OIDNewHeap, AccessExclusiveLock); dest = CreateTransientRelDestReceiver(OIDNewHeap); @@ -330,10 +331,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) @@ -656,13 +657,35 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1)))); } + /* + * Create the temporary "diff" table. + * + * Temporarily switch out of the SECURITY_RESTRICTED_OPERATION context, + * because you cannot create temp tables in SRO context. For extra + * paranoia, add the composite type column only after switching back to + * SRO context. + */ SetUserIdAndSecContext(relowner, save_sec_context | SECURITY_LOCAL_USERID_CHANGE); + resetStringInfo(&querybuf); + appendStringInfo(&querybuf, + "CREATE TEMP TABLE %s (tid pg_catalog.tid)", + diffname); + if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + elog(ERROR, "SPI_exec failed: %s", querybuf.data); + SetUserIdAndSecContext(relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + resetStringInfo(&querybuf); + appendStringInfo(&querybuf, + "ALTER TABLE %s ADD COLUMN newdata %s", + diffname, tempname); + if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + elog(ERROR, "SPI_exec failed: %s", querybuf.data); - /* Start building the query for creating the diff table. */ + /* Start building the query for populating the diff table. */ resetStringInfo(&querybuf); appendStringInfo(&querybuf, - "CREATE TEMP TABLE %s AS " + "INSERT INTO %s " "SELECT mv.ctid AS tid, newdata.*::%s AS newdata " "FROM %s mv FULL JOIN %s newdata ON (", diffname, tempname, matviewname, tempname); @@ -782,22 +805,22 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, * * ExecRefreshMatView() checks that after taking the exclusive lock on the * matview. So at least one unique index is guaranteed to exist here - * because the lock is still being held; so an Assert seems sufficient. + * because the lock is still being held. (One known exception is if a + * function called as part of refreshing the matview drops the index. + * That's a pretty silly thing to do.) */ - Assert(foundUniqueIndex); + if (!foundUniqueIndex) + elog(ERROR, "could not find suitable unique index on materialized view"); appendStringInfoString(&querybuf, " AND newdata.* OPERATOR(pg_catalog.*=) mv.*) " "WHERE newdata.* IS NULL OR mv.* IS NULL " "ORDER BY tid"); - /* Create the temporary "diff" table. */ - if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + /* Populate the temporary "diff" table. */ + if (SPI_exec(querybuf.data, 0) != SPI_OK_INSERT) elog(ERROR, "SPI_exec failed: %s", querybuf.data); - SetUserIdAndSecContext(relowner, - save_sec_context | SECURITY_RESTRICTED_OPERATION); - /* * We have no further use for data from the "full-data" temp table, but we * must keep it around because its type is referenced from the diff table. diff --git a/third_party/spanner_pg/src/backend/commands/opclasscmds.c b/third_party/spanner_pg/src/backend/commands/opclasscmds.c index 11d152fa..7a931ab7 100644 --- a/third_party/spanner_pg/src/backend/commands/opclasscmds.c +++ b/third_party/spanner_pg/src/backend/commands/opclasscmds.c @@ -4,7 +4,7 @@ * * Routines for opclass (and opfamily) manipulation commands * - * 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/third_party/spanner_pg/src/backend/commands/operatorcmds.c b/third_party/spanner_pg/src/backend/commands/operatorcmds.c index eb50f60e..a5924d7d 100644 --- a/third_party/spanner_pg/src/backend/commands/operatorcmds.c +++ b/third_party/spanner_pg/src/backend/commands/operatorcmds.c @@ -4,7 +4,7 @@ * * Routines for operator manipulation commands * - * 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/third_party/spanner_pg/src/backend/commands/policy.c b/third_party/spanner_pg/src/backend/commands/policy.c index 0f4d43af..aa3edd27 100644 --- a/third_party/spanner_pg/src/backend/commands/policy.c +++ b/third_party/spanner_pg/src/backend/commands/policy.c @@ -3,7 +3,7 @@ * policy.c * Commands for manipulating policies. * - * 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 * * src/backend/commands/policy.c diff --git a/third_party/spanner_pg/src/backend/commands/portalcmds.c b/third_party/spanner_pg/src/backend/commands/portalcmds.c index f0c4cbc3..92f464cc 100644 --- a/third_party/spanner_pg/src/backend/commands/portalcmds.c +++ b/third_party/spanner_pg/src/backend/commands/portalcmds.c @@ -9,7 +9,7 @@ * storage management for portals (but doesn't run any queries in them). * * - * 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/third_party/spanner_pg/src/backend/commands/prepare.c b/third_party/spanner_pg/src/backend/commands/prepare.c index abe7dcd7..39c6a50d 100644 --- a/third_party/spanner_pg/src/backend/commands/prepare.c +++ b/third_party/spanner_pg/src/backend/commands/prepare.c @@ -7,7 +7,7 @@ * accessed via the extended FE/BE query protocol. * * - * Copyright (c) 2002-2021, PostgreSQL Global Development Group + * Copyright (c) 2002-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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" @@ -63,9 +64,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 +96,7 @@ PrepareQuery(ParseState *pstate, PrepareStmt *stmt, if (nargs) { + int i; ListCell *l; argtypes = (Oid *) palloc(nargs * sizeof(Oid)); @@ -115,44 +115,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, @@ -702,55 +668,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"))); - - /* 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. */ - tupstore = - tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random, - false, work_mem); - - /* generate junk in short-term context */ - MemoryContextSwitchTo(oldcontext); + InitMaterializedSRF(fcinfo, 0); /* hash table might be uninitialized */ if (prepared_queries) @@ -775,17 +698,11 @@ 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); } } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - return (Datum) 0; } diff --git a/third_party/spanner_pg/src/backend/commands/proclang.c b/third_party/spanner_pg/src/backend/commands/proclang.c index 81598d3e..4a093f45 100644 --- a/third_party/spanner_pg/src/backend/commands/proclang.c +++ b/third_party/spanner_pg/src/backend/commands/proclang.c @@ -3,7 +3,7 @@ * proclang.c * PostgreSQL LANGUAGE support code. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/commands/publicationcmds.c b/third_party/spanner_pg/src/backend/commands/publicationcmds.c index e288dd41..7e0e452d 100644 --- a/third_party/spanner_pg/src/backend/commands/publicationcmds.c +++ b/third_party/spanner_pg/src/backend/commands/publicationcmds.c @@ -3,11 +3,11 @@ * publicationcmds.c * publication manipulation * - * 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 * * IDENTIFICATION - * publicationcmds.c + * src/backend/commands/publicationcmds.c * *------------------------------------------------------------------------- */ @@ -25,7 +25,10 @@ #include "catalog/objectaddress.h" #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" #include "catalog/pg_type.h" #include "commands/dbcommands.h" @@ -34,6 +37,11 @@ #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" #include "utils/builtins.h" @@ -45,14 +53,35 @@ #include "utils/syscache.h" #include "utils/varlena.h" +#include "third_party/spanner_pg/shims/catalog_shim.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 *OpenTableList(List *tables); static void CloseTableList(List *rels); +static void LockSchemaList(List *schemalist); static void PublicationAddTables(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 -parse_publication_options(List *options, +parse_publication_options(ParseState *pstate, + List *options, bool *publish_given, PublicationActions *pubactions, bool *publish_via_partition_root_given, @@ -82,9 +111,7 @@ parse_publication_options(List *options, ListCell *lc; if (*publish_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); /* * If publish option was given only the explicitly listed actions @@ -101,7 +128,8 @@ parse_publication_options(List *options, if (!SplitIdentifierString(publish, ',', &publish_list)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("invalid list syntax for \"publish\" option"))); + errmsg("invalid list syntax in parameter \"%s\"", + "publish"))); /* Process the option list. */ foreach(lc, publish_list) @@ -119,15 +147,14 @@ parse_publication_options(List *options, else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized \"publish\" value: \"%s\"", publish_opt))); + errmsg("unrecognized value for publication option \"%s\": \"%s\"", + "publish", publish_opt))); } } else if (strcmp(defel->defname, "publish_via_partition_root") == 0) { if (*publish_via_partition_root_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); *publish_via_partition_root_given = true; *publish_via_partition_root = defGetBoolean(defel); } @@ -138,11 +165,574 @@ parse_publication_options(List *options, } } +/* + * Convert the PublicationObjSpecType list into schema oid list and + * PublicationTable list. + */ +static void +ObjectsInPublicationToOids(List *pubobjspec_list, ParseState *pstate, + List **rels, List **schemas) +{ + ListCell *cell; + PublicationObjSpec *pubobj; + + if (!pubobjspec_list) + return; + + foreach(cell, pubobjspec_list) + { + Oid schemaid; + List *search_path; + + pubobj = (PublicationObjSpec *) lfirst(cell); + + switch (pubobj->pubobjtype) + { + case PUBLICATIONOBJ_TABLE: + *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" */ + *schemas = list_append_unique_oid(*schemas, schemaid); + break; + case PUBLICATIONOBJ_TABLES_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" */ + *schemas = list_append_unique_oid(*schemas, schemaid); + break; + default: + /* shouldn't happen */ + elog(ERROR, "invalid publication object type %d", pubobj->pubobjtype); + break; + } + } +} + +/* + * 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 +pub_rf_contains_invalid_column(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, NULL); + + 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); + } + + ReleaseSysCache(rftuple); + + 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) +{ + return (func_volatile(func_id) != PROVOLATILE_IMMUTABLE || + func_id >= FirstNormalObjectId); +} + +/* + * 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 = _("Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed."); + break; + } + + /* + * For all the supported nodes, if we haven't already found a problem, + * check the types, functions, and collations used in it. We check List + * by walking through each element. + */ + if (!errdetail_msg && !IsA(node, List)) + { + 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."); + } + + /* + * If we found a problem in this node, throw error now. Otherwise keep + * going. + */ + if (errdetail_msg) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("invalid publication WHERE expression"), + errdetail_internal("%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"))); + + /* + * A fresh pstate is required so that we only have "this" table in its + * rangetable + */ + 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; + } +} + + +/* + * Given a list of tables that are going to be added to a publication, + * verify that they fulfill the necessary preconditions, namely: no tables + * have a column list if any schema is published; and partitioned tables do + * not have column lists if publish_via_partition_root is not set. + * + * 'publish_schema' indicates that the publication contains any TABLES IN + * SCHEMA elements (newly added in this command, or preexisting). + * 'pubviaroot' is the value of publish_via_partition_root. + */ +static void +CheckPubRelationColumnList(char *pubname, List *tables, + bool publish_schema, bool pubviaroot) +{ + ListCell *lc; + + foreach(lc, tables) + { + PublicationRelInfo *pri = (PublicationRelInfo *) lfirst(lc); + + if (pri->columns == NIL) + continue; + + /* + * Disallow specifying column list if any schema is in the + * publication. + * + * XXX We could instead just forbid the case when the publication + * tries to publish the table with a column list and a schema for that + * table. However, if we do that then we need a restriction during + * ALTER TABLE ... SET SCHEMA to prevent such a case which doesn't + * seem to be a good idea. + */ + if (publish_schema) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot use column list for relation \"%s.%s\" in publication \"%s\"", + get_namespace_name(RelationGetNamespace(pri->relation)), + RelationGetRelationName(pri->relation), pubname), + errdetail("Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements.")); + + /* + * If the publication doesn't publish changes via the root partitioned + * table, the partition's column list will be used. So disallow using + * a column list on the 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 column list for relation \"%s.%s\" in publication \"%s\"", + get_namespace_name(RelationGetNamespace(pri->relation)), + RelationGetRelationName(pri->relation), pubname), + errdetail("Column lists cannot be specified for partitioned tables when %s is false.", + "publish_via_partition_root"))); + } +} + /* * Create new publication. */ ObjectAddress -CreatePublication(CreatePublicationStmt *stmt) +CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) { Relation rel; ObjectAddress myself; @@ -155,6 +745,8 @@ CreatePublication(CreatePublicationStmt *stmt) bool publish_via_partition_root_given; bool publish_via_partition_root; AclResult aclresult; + List *relations = NIL; + List *schemaidlist = NIL; /* must have CREATE privilege on database */ aclresult = pg_database_aclcheck(MyDatabaseId, GetUserId(), ACL_CREATE); @@ -174,12 +766,10 @@ CreatePublication(CreatePublicationStmt *stmt) puboid = GetSysCacheOid1(PUBLICATIONNAME, Anum_pg_publication_oid, CStringGetDatum(stmt->pubname)); if (OidIsValid(puboid)) - { ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("publication \"%s\" already exists", stmt->pubname))); - } /* Form a tuple. */ memset(values, 0, sizeof(values)); @@ -189,7 +779,8 @@ CreatePublication(CreatePublicationStmt *stmt) DirectFunctionCall1(namein, CStringGetDatum(stmt->pubname)); values[Anum_pg_publication_pubowner - 1] = ObjectIdGetDatum(GetUserId()); - parse_publication_options(stmt->options, + parse_publication_options(pstate, + stmt->options, &publish_given, &pubactions, &publish_via_partition_root_given, &publish_via_partition_root); @@ -223,33 +814,59 @@ CreatePublication(CreatePublicationStmt *stmt) /* Make the changes visible. */ CommandCounterIncrement(); - if (stmt->tables) - { - List *rels; - - Assert(list_length(stmt->tables) > 0); - - rels = OpenTableList(stmt->tables); - PublicationAddTables(puboid, rels, true, NULL); - CloseTableList(rels); - } - else if (stmt->for_all_tables) + /* Associate objects with the publication. */ + if (stmt->for_all_tables) { /* Invalidate relcache so that publication info is rebuilt. */ CacheInvalidateRelcacheAll(); } + else + { + ObjectsInPublicationToOids(stmt->pubobjects, pstate, &relations, + &schemaidlist); + + /* FOR TABLES IN SCHEMA requires superuser */ + if (schemaidlist != NIL && !superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to create FOR TABLES IN SCHEMA publication")); + + if (list_length(relations) > 0) + { + List *rels; + + rels = OpenTableList(relations); + TransformPubWhereClauses(rels, pstate->p_sourcetext, + publish_via_partition_root); + + CheckPubRelationColumnList(stmt->pubname, rels, + schemaidlist != NIL, + publish_via_partition_root); + + PublicationAddTables(puboid, rels, true, NULL); + CloseTableList(rels); + } + + if (list_length(schemaidlist) > 0) + { + /* + * Schema lock is held until the publication is created to prevent + * concurrent schema deletion. + */ + LockSchemaList(schemaidlist); + PublicationAddSchemas(puboid, schemaidlist, true, NULL); + } + } table_close(rel, RowExclusiveLock); InvokeObjectPostCreateHook(PublicationRelationId, puboid, 0); if (wal_level != WAL_LEVEL_LOGICAL) - { ereport(WARNING, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("wal_level is insufficient to publish logical changes"), - errhint("Set wal_level to logical before creating subscriptions."))); - } + errhint("Set wal_level to \"logical\" before creating subscriptions."))); return myself; } @@ -258,8 +875,8 @@ CreatePublication(CreatePublicationStmt *stmt) * Change options of a publication. */ static void -AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel, - HeapTuple tup) +AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, + Relation rel, HeapTuple tup) { bool nulls[Natts_pg_publication]; bool replaces[Natts_pg_publication]; @@ -270,12 +887,97 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel, bool publish_via_partition_root; ObjectAddress obj; Form_pg_publication pubform; + List *root_relids = NIL; + ListCell *lc; - parse_publication_options(stmt->options, + parse_publication_options(pstate, + stmt->options, &publish_given, &pubactions, &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 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) + { + /* + * Lock the publication so nobody else can do anything with it. This + * prevents concurrent alter to add partitioned table(s) with WHERE + * clause(s) and/or column lists 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) + { + Oid relid = lfirst_oid(lc); + 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)); + 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) + { + 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"))); + } + } + /* Everything ok, form a new tuple. */ memset(values, 0, sizeof(values)); memset(nulls, false, sizeof(nulls)); @@ -319,13 +1021,32 @@ AlterPublicationOptions(AlterPublicationStmt *stmt, Relation rel, } else { + List *relids = NIL; + List *schemarelids = NIL; + /* * For any partitioned tables contained in the publication, we must * invalidate all partitions contained in the respective partition * trees, not just those explicitly mentioned in the publication. */ - List *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); InvalidatePublicationRels(relids); } @@ -362,59 +1083,151 @@ InvalidatePublicationRels(List *relids) * Add or remove table to/from publication. */ static void -AlterPublicationTables(AlterPublicationStmt *stmt, Relation rel, - HeapTuple tup) +AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, + List *tables, const char *queryString, + bool publish_schema) { List *rels = NIL; Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); Oid pubid = pubform->oid; - /* Check that user is allowed to manipulate the publication tables. */ - if (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 cannot be added to or dropped from FOR ALL TABLES publications."))); + /* + * Nothing to do if no objects, except in SET: for that it is quite + * possible that user has not specified any tables in which case we need + * to remove all the existing tables. + */ + if (!tables && stmt->action != AP_SetObjects) + return; + + rels = OpenTableList(tables); - Assert(list_length(stmt->tables) > 0); + if (stmt->action == AP_AddObjects) + { + TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + + publish_schema |= is_schema_publication(pubid); - rels = OpenTableList(stmt->tables); + CheckPubRelationColumnList(stmt->pubname, rels, publish_schema, + pubform->pubviaroot); - if (stmt->tableAction == DEFELEM_ADD) PublicationAddTables(pubid, rels, false, stmt); - else if (stmt->tableAction == DEFELEM_DROP) + } + else if (stmt->action == AP_DropObjects) PublicationDropTables(pubid, rels, false); - else /* DEFELEM_SET */ + else /* AP_SetObjects */ { List *oldrelids = GetPublicationRelations(pubid, PUBLICATION_PART_ROOT); List *delrels = NIL; ListCell *oldlc; - /* Calculate which relations to drop. */ + TransformPubWhereClauses(rels, queryString, pubform->pubviaroot); + + CheckPubRelationColumnList(stmt->pubname, rels, publish_schema, + 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; + 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, + &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) { - Relation newrel = (Relation) lfirst(newlc); + PublicationRelInfo *newpubrel; + Oid newrelid; + Bitmapset *newcolumns = NULL; - if (RelationGetRelid(newrel) == oldrelid) + newpubrel = (PublicationRelInfo *) lfirst(newlc); + newrelid = RelationGetRelid(newpubrel->relation); + + /* + * If the new publication has column list, transform it to a + * bitmap too. + */ + if (newpubrel->columns) { - found = true; - break; + 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. Same for the column list. Drop the + * rest. + */ + if (RelationGetRelid(newpubrel->relation) == oldrelid) + { + if (equal(oldrelwhereclause, newpubrel->whereClause) && + bms_equal(oldcolumns, newcolumns)) + { + found = true; + break; + } } } + /* + * Add the non-matched relations to a list so that they can be + * dropped. + */ if (!found) { - Relation oldrel = table_open(oldrelid, - ShareUpdateExclusiveLock); - + oldrel = palloc(sizeof(PublicationRelInfo)); + oldrel->whereClause = NULL; + oldrel->columns = NIL; + oldrel->relation = table_open(oldrelid, + ShareUpdateExclusiveLock); delrels = lappend(delrels, oldrel); } } @@ -434,14 +1247,135 @@ AlterPublicationTables(AlterPublicationStmt *stmt, Relation rel, CloseTableList(rels); } +/* + * Alter the publication schemas. + * + * Add or remove schemas to/from publication. + */ +static void +AlterPublicationSchemas(AlterPublicationStmt *stmt, + HeapTuple tup, List *schemaidlist) +{ + Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); + + /* + * Nothing to do if no objects, except in SET: for that it is quite + * possible that user has not specified any schemas in which case we need + * to remove all the existing schemas. + */ + if (!schemaidlist && stmt->action != AP_SetObjects) + return; + + /* + * Schema lock is held until the publication is altered to prevent + * concurrent schema deletion. + */ + LockSchemaList(schemaidlist); + if (stmt->action == AP_AddObjects) + { + ListCell *lc; + List *reloids; + + reloids = GetPublicationRelations(pubform->oid, PUBLICATION_PART_ROOT); + + foreach(lc, reloids) + { + HeapTuple coltuple; + + coltuple = SearchSysCache2(PUBLICATIONRELMAP, + ObjectIdGetDatum(lfirst_oid(lc)), + ObjectIdGetDatum(pubform->oid)); + + if (!HeapTupleIsValid(coltuple)) + continue; + + /* + * Disallow adding schema if column list is already part of the + * publication. See CheckPubRelationColumnList. + */ + if (!heap_attisnull(coltuple, Anum_pg_publication_rel_prattrs, NULL)) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot add schema to publication \"%s\"", + stmt->pubname), + errdetail("Schemas cannot be added if any tables that specify a column list are already part of the publication.")); + + ReleaseSysCache(coltuple); + } + + PublicationAddSchemas(pubform->oid, schemaidlist, false, stmt); + } + else if (stmt->action == AP_DropObjects) + PublicationDropSchemas(pubform->oid, schemaidlist, false); + else /* AP_SetObjects */ + { + List *oldschemaids = GetPublicationSchemas(pubform->oid); + List *delschemas = NIL; + + /* Identify which schemas should be dropped */ + delschemas = list_difference_oid(oldschemaids, schemaidlist); + + /* + * Schema lock is held until the publication is altered to prevent + * concurrent schema deletion. + */ + LockSchemaList(delschemas); + + /* And drop them */ + 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, true, stmt); + } +} + +/* + * Check if relations and schemas can be in a given publication and throw + * appropriate error if not. + */ +static void +CheckAlterPublication(AlterPublicationStmt *stmt, HeapTuple tup, + List *tables, List *schemaidlist) +{ + Form_pg_publication pubform = (Form_pg_publication) GETSTRUCT(tup); + + if ((stmt->action == AP_AddObjects || stmt->action == AP_SetObjects) && + schemaidlist && !superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to add or set schemas"))); + + /* + * Check that user is allowed to manipulate the publication tables in + * schema + */ + 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("Schemas cannot be added to or dropped from FOR ALL TABLES publications."))); + + /* Check that user is allowed to manipulate the publication tables. */ + if (tables && 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 cannot be added to or dropped from FOR ALL TABLES publications."))); +} + /* * Alter the existing publication. * - * This is dispatcher function for AlterPublicationOptions and - * AlterPublicationTables. + * This is dispatcher function for AlterPublicationOptions, + * AlterPublicationSchemas and AlterPublicationTables. */ void -AlterPublication(AlterPublicationStmt *stmt) +AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt) { Relation rel; HeapTuple tup; @@ -466,9 +1400,41 @@ AlterPublication(AlterPublicationStmt *stmt) stmt->pubname); if (stmt->options) - AlterPublicationOptions(stmt, rel, tup); + AlterPublicationOptions(pstate, stmt, rel, tup); else - AlterPublicationTables(stmt, rel, tup); + { + 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. */ + 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. We get the tuple again to avoid the risk + * of any publication option getting changed. + */ + 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, pstate->p_sourcetext, + schemaidlist != NIL); + AlterPublicationSchemas(stmt, tup, schemaidlist); + } /* Cleanup. */ heap_freetuple(tup); @@ -546,7 +1512,43 @@ RemovePublicationById(Oid pubid) } /* - * Open relations specified by a RangeVar list. + * Remove schema from publication by mapping OID. + */ +void +RemovePublicationSchemaById(Oid psoid) +{ + Relation rel; + HeapTuple tup; + List *schemaRels = NIL; + Form_pg_publication_namespace pubsch; + + rel = table_open(PublicationNamespaceRelationId, RowExclusiveLock); + + tup = SearchSysCache1(PUBLICATIONNAMESPACE, ObjectIdGetDatum(psoid)); + + if (!HeapTupleIsValid(tup)) + elog(ERROR, "cache lookup failed for publication schema %u", psoid); + + pubsch = (Form_pg_publication_namespace) GETSTRUCT(tup); + + /* + * Invalidate relcache so that publication info is rebuilt. See + * RemovePublicationRelById for why we need to consider all the + * partitions. + */ + schemaRels = GetSchemaPublicationRelations(pubsch->pnnspid, + PUBLICATION_PART_ALL); + InvalidatePublicationRels(schemaRels); + + CatalogTupleDelete(rel, &tup->t_self); + + ReleaseSysCache(tup); + + table_close(rel, RowExclusiveLock); +} + +/* + * Open relations specified by a PublicationTable list. * The returned tables are locked in ShareUpdateExclusiveLock mode in order to * add them to a publication. */ @@ -556,21 +1558,24 @@ OpenTableList(List *tables) List *relids = NIL; List *rels = NIL; ListCell *lc; + List *relids_with_rf = NIL; + List *relids_with_collist = NIL; /* * Open, share-lock, and check all the explicitly-specified relations */ foreach(lc, tables) { - RangeVar *rv = castNode(RangeVar, lfirst(lc)); - bool recurse = rv->inh; + PublicationTable *t = lfirst_node(PublicationTable, lc); + bool recurse = t->relation->inh; Relation rel; Oid myrelid; + PublicationRelInfo *pub_rel; /* Allow query cancel in case this takes a long time */ CHECK_FOR_INTERRUPTS(); - rel = table_openrv(rv, ShareUpdateExclusiveLock); + rel = table_openrv(t->relation, ShareUpdateExclusiveLock); myrelid = RelationGetRelid(rel); /* @@ -582,13 +1587,37 @@ 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)))); + + /* 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; } - rels = lappend(rels, rel); + pub_rel = palloc(sizeof(PublicationRelInfo)); + pub_rel->relation = rel; + pub_rel->whereClause = t->whereClause; + pub_rel->columns = t->columns; + rels = lappend(rels, 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 @@ -615,17 +1644,57 @@ 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)))); + + /* + * 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; + } /* find_all_inheritors already got lock */ rel = table_open(childrelid, NoLock); - rels = lappend(rels, rel); + pub_rel = palloc(sizeof(PublicationRelInfo)); + 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; + rels = lappend(rels, 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); } } } list_free(relids); + list_free(relids_with_rf); return rels; } @@ -640,9 +1709,41 @@ CloseTableList(List *rels) foreach(lc, rels) { - Relation rel = (Relation) lfirst(lc); + PublicationRelInfo *pub_rel; - table_close(rel, NoLock); + pub_rel = (PublicationRelInfo *) lfirst(lc); + table_close(pub_rel->relation, NoLock); + } + + list_free_deep(rels); +} + +/* + * Lock the schemas specified in the schema list in AccessShareLock mode in + * order to prevent concurrent schema deletion. + */ +static void +LockSchemaList(List *schemalist) +{ + ListCell *lc; + + foreach(lc, schemalist) + { + Oid schemaid = lfirst_oid(lc); + + /* Allow query cancel in case this takes a long time */ + CHECK_FOR_INTERRUPTS(); + LockDatabaseObject(NamespaceRelationId, schemaid, 0, AccessShareLock); + + /* + * It is possible that by the time we acquire the lock on schema, + * concurrent DDL has removed it. We can test this by checking the + * existence of schema. + */ + if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaid))) + ereport(ERROR, + errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema with OID %u does not exist", schemaid)); } } @@ -659,7 +1760,8 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, foreach(lc, rels) { - Relation rel = (Relation) lfirst(lc); + PublicationRelInfo *pub_rel = (PublicationRelInfo *) lfirst(lc); + Relation rel = pub_rel->relation; ObjectAddress obj; /* Must be owner of the table or superuser. */ @@ -667,7 +1769,7 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists, aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(rel->rd_rel->relkind), RelationGetRelationName(rel)); - obj = publication_add_relation(pubid, rel, if_not_exists); + obj = publication_add_relation(pubid, pub_rel, if_not_exists); if (stmt) { EventTriggerCollectSimpleCommand(obj, InvalidObjectAddress, @@ -691,9 +1793,15 @@ PublicationDropTables(Oid pubid, List *rels, bool missing_ok) foreach(lc, rels) { - Relation rel = (Relation) lfirst(lc); + PublicationRelInfo *pubrel = (PublicationRelInfo *) lfirst(lc); + 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)); @@ -708,11 +1816,78 @@ 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); } } +/* + * Add listed schemas to the publication. + */ +static void +PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists, + AlterPublicationStmt *stmt) +{ + ListCell *lc; + + Assert(!stmt || !stmt->for_all_tables); + + foreach(lc, schemas) + { + Oid schemaid = lfirst_oid(lc); + ObjectAddress obj; + + obj = publication_add_schema(pubid, schemaid, if_not_exists); + if (stmt) + { + EventTriggerCollectSimpleCommand(obj, InvalidObjectAddress, + (Node *) stmt); + + InvokeObjectPostCreateHook(PublicationNamespaceRelationId, + obj.objectId, 0); + } + } +} + +/* + * Remove listed schemas from the publication. + */ +static void +PublicationDropSchemas(Oid pubid, List *schemas, bool missing_ok) +{ + ObjectAddress obj; + ListCell *lc; + Oid psid; + + foreach(lc, schemas) + { + Oid schemaid = lfirst_oid(lc); + + psid = GetSysCacheOid2(PUBLICATIONNAMESPACEMAP, + Anum_pg_publication_namespace_oid, + ObjectIdGetDatum(schemaid), + ObjectIdGetDatum(pubid)); + if (!OidIsValid(psid)) + { + if (missing_ok) + continue; + + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("tables from schema \"%s\" are not part of the publication", + get_namespace_name(schemaid)))); + } + + ObjectAddressSet(obj, PublicationNamespaceRelationId, psid); + performDeletion(&obj, DROP_CASCADE, 0); + } +} + /* * Internal workhorse for changing a publication owner */ @@ -750,6 +1925,13 @@ AlterPublicationOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) errmsg("permission denied to change owner of publication \"%s\"", NameStr(form->pubname)), errhint("The owner of a FOR ALL TABLES publication must be a superuser."))); + + if (!superuser_arg(newOwnerId) && is_schema_publication(form->oid)) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to change owner of publication \"%s\"", + NameStr(form->pubname)), + errhint("The owner of a FOR TABLES IN SCHEMA publication must be a superuser."))); } form->pubowner = newOwnerId; diff --git a/third_party/spanner_pg/src/backend/commands/schemacmds.c b/third_party/spanner_pg/src/backend/commands/schemacmds.c index 311cad66..92b36083 100644 --- a/third_party/spanner_pg/src/backend/commands/schemacmds.c +++ b/third_party/spanner_pg/src/backend/commands/schemacmds.c @@ -3,7 +3,7 @@ * schemacmds.c * schema creation/manipulation commands * - * 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 * * @@ -201,7 +201,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/third_party/spanner_pg/src/backend/commands/seclabel.c b/third_party/spanner_pg/src/backend/commands/seclabel.c index 5af1d835..cc646852 100644 --- a/third_party/spanner_pg/src/backend/commands/seclabel.c +++ b/third_party/spanner_pg/src/backend/commands/seclabel.c @@ -3,7 +3,7 @@ * seclabel.c * routines to support security label feature. * - * 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 * * ------------------------------------------------------------------------- @@ -79,7 +79,9 @@ 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: case OBJECT_RULE: case OBJECT_STATISTIC_EXT: @@ -189,8 +191,9 @@ ExecSecLabelStmt(SecLabelStmt *stmt) relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, composite type, or foreign table", - RelationGetRelationName(relation)))); + errmsg("cannot set security label on relation \"%s\"", + RelationGetRelationName(relation)), + errdetail_relkind_not_supported(relation->rd_rel->relkind))); break; default: break; diff --git a/third_party/spanner_pg/src/backend/commands/sequence.c b/third_party/spanner_pg/src/backend/commands/sequence.c index e6008021..22faa573 100644 --- a/third_party/spanner_pg/src/backend/commands/sequence.c +++ b/third_party/spanner_pg/src/backend/commands/sequence.c @@ -3,7 +3,7 @@ * sequence.c * PostgreSQL sequences support code. * - * 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 * * @@ -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" @@ -97,6 +98,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); @@ -135,12 +137,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, @@ -348,9 +344,33 @@ ResetSequence(Oid seq_relid) /* * 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; @@ -359,7 +379,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); @@ -400,7 +420,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; @@ -532,6 +552,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) { @@ -710,15 +752,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 @@ -733,15 +771,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 @@ -960,20 +994,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) @@ -1271,90 +1296,63 @@ init_params(ParseState *pstate, List *options, bool for_identity, if (strcmp(defel->defname, "as") == 0) { if (as_type) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); as_type = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "increment") == 0) { if (increment_by) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); increment_by = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "start") == 0) { if (start_value) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); start_value = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "restart") == 0) { if (restart_value) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); restart_value = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "maxvalue") == 0) { if (max_value) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); max_value = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "minvalue") == 0) { if (min_value) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); min_value = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "cache") == 0) { if (cache_value) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); cache_value = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "cycle") == 0) { if (is_cycled) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); is_cycled = defel; *need_seq_rewrite = true; } else if (strcmp(defel->defname, "owned_by") == 0) { if (*owned_by) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); *owned_by = defGetQualifiedName(defel); } else if (strcmp(defel->defname, "sequence_name") == 0) @@ -1438,7 +1436,7 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* CYCLE */ if (is_cycled != NULL) { - seqform->seqcycle = intVal(is_cycled->arg); + seqform->seqcycle = boolVal(is_cycled->arg); Assert(BoolIsValid(seqform->seqcycle)); seqdataform->log_cnt = 0; } @@ -1470,19 +1468,14 @@ init_params(ParseState *pstate, List *options, bool for_identity, seqdataform->log_cnt = 0; } + /* 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)) - || (seqform->seqtypid == INT8OID && (seqform->seqmax < PG_INT64_MIN || seqform->seqmax > PG_INT64_MAX))) - { - char bufx[100]; - - snprintf(bufx, sizeof(bufx), INT64_FORMAT, seqform->seqmax); - + || (seqform->seqtypid == INT4OID && (seqform->seqmax < PG_INT32_MIN || seqform->seqmax > PG_INT32_MAX))) 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) @@ -1507,33 +1500,22 @@ init_params(ParseState *pstate, List *options, bool for_identity, seqdataform->log_cnt = 0; } + /* 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)) - || (seqform->seqtypid == INT8OID && (seqform->seqmin < PG_INT64_MIN || seqform->seqmin > PG_INT64_MAX))) - { - char bufm[100]; - - snprintf(bufm, sizeof(bufm), INT64_FORMAT, seqform->seqmin); - + || (seqform->seqtypid == INT4OID && (seqform->seqmin < PG_INT32_MIN || seqform->seqmin > PG_INT32_MAX))) 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) @@ -1550,29 +1532,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) @@ -1592,44 +1562,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) @@ -1690,8 +1643,9 @@ process_owned_by(Relation seqrel, List *owned_by, bool for_identity) tablerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("referenced relation \"%s\" is not a table or foreign table", - RelationGetRelationName(tablerel)))); + errmsg("sequence cannot be owned by relation \"%s\"", + RelationGetRelationName(tablerel)), + errdetail_relkind_not_supported(tablerel->rd_rel->relkind))); /* We insist on same owner and schema */ if (seqrel->rd_rel->relowner != tablerel->rd_rel->relowner) @@ -1775,7 +1729,7 @@ sequence_options(Oid relid) options = lappend(options, makeDefElem("cache", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqcache)), -1)); options = lappend(options, - makeDefElem("cycle", (Node *) makeInteger(pgsform->seqcycle), -1)); + makeDefElem("cycle", (Node *) makeBoolean(pgsform->seqcycle), -1)); options = lappend(options, makeDefElem("increment", (Node *) makeFloat(psprintf(INT64_FORMAT, pgsform->seqincrement)), -1)); options = lappend(options, diff --git a/third_party/spanner_pg/src/backend/commands/statscmds.c b/third_party/spanner_pg/src/backend/commands/statscmds.c index bfe589ff..100ee9c4 100644 --- a/third_party/spanner_pg/src/backend/commands/statscmds.c +++ b/third_party/spanner_pg/src/backend/commands/statscmds.c @@ -3,7 +3,7 @@ * statscmds.c * Commands for creating and altering extended statistics objects * - * 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 * * @@ -77,13 +77,10 @@ CreateStatistics(CreateStatsStmt *stmt) HeapTuple htup; Datum values[Natts_pg_statistic_ext]; bool nulls[Natts_pg_statistic_ext]; - Datum datavalues[Natts_pg_statistic_ext_data]; - bool datanulls[Natts_pg_statistic_ext_data]; int2vector *stxkeys; List *stxexprs = NIL; Datum exprsDatum; Relation statrel; - Relation datarel; Relation rel = NULL; Oid relid; ObjectAddress parentobject, @@ -138,8 +135,9 @@ CreateStatistics(CreateStatsStmt *stmt) rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("relation \"%s\" is not a table, foreign table, or materialized view", - RelationGetRelationName(rel)))); + errmsg("cannot define statistics for relation \"%s\"", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); /* You must own the relation to create stats on it */ if (!pg_class_ownercheck(RelationGetRelid(rel), stxowner)) @@ -218,14 +216,14 @@ CreateStatistics(CreateStatsStmt *stmt) * Convert the expression list to a simple array of attnums, but also keep * a list of more complex expressions. While at it, enforce some * constraints - we don't allow extended statistics on system attributes, - * and we require the data type to have less-than operator. + * and we require the data type to have a less-than operator. * - * There are many ways how to "mask" a simple attribute refenrece as an + * There are many ways to "mask" a simple attribute reference as an * expression, for example "(a+0)" etc. We can't possibly detect all of - * them, but we handle at least the simple case with attribute in parens. - * There'll always be a way around this, if the user is determined (like - * the "(a+0)" example), but this makes it somewhat consistent with how - * indexes treat attributes/expressions. + * them, but we handle at least the simple case with the attribute in + * parens. There'll always be a way around this, if the user is determined + * (like the "(a+0)" example), but this makes it somewhat consistent with + * how indexes treat attributes/expressions. */ foreach(cell, stmt->exprs) { @@ -266,9 +264,9 @@ CreateStatistics(CreateStatsStmt *stmt) nattnums++; ReleaseSysCache(atttuple); } - else if (IsA(selem->expr, Var)) /* column reference in parens */ + else if (IsA(selem->expr, Var)) /* column reference in parens */ { - Var *var = (Var *) selem->expr; + Var *var = (Var *) selem->expr; TypeCacheEntry *type; /* Disallow use of system attributes in extended stats */ @@ -305,10 +303,11 @@ CreateStatistics(CreateStatsStmt *stmt) while ((k = bms_next_member(attnums, k)) >= 0) { AttrNumber attnum = k + FirstLowInvalidHeapAttributeNumber; + if (attnum <= 0) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("statistics creation on system columns is not supported"))); + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("statistics creation on system columns is not supported"))); } /* @@ -355,7 +354,7 @@ CreateStatistics(CreateStatsStmt *stmt) build_mcv = false; foreach(cell, stmt->stat_types) { - char *type = strVal((Value *) lfirst(cell)); + char *type = strVal(lfirst(cell)); if (strcmp(type, "ndistinct") == 0) { @@ -519,28 +518,10 @@ CreateStatistics(CreateStatsStmt *stmt) relation_close(statrel, RowExclusiveLock); /* - * Also build the pg_statistic_ext_data tuple, to hold the actual - * statistics data. + * We used to create the pg_statistic_ext_data tuple too, but it's not + * clear what value should the stxdinherit flag have (it depends on + * whether the rel is partitioned, contains data, etc.) */ - datarel = table_open(StatisticExtDataRelationId, RowExclusiveLock); - - memset(datavalues, 0, sizeof(datavalues)); - memset(datanulls, false, sizeof(datanulls)); - - datavalues[Anum_pg_statistic_ext_data_stxoid - 1] = ObjectIdGetDatum(statoid); - - /* no statistics built yet */ - datanulls[Anum_pg_statistic_ext_data_stxdndistinct - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxddependencies - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxdmcv - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxdexpr - 1] = true; - - /* insert it into pg_statistic_ext_data */ - htup = heap_form_tuple(datarel->rd_att, datavalues, datanulls); - CatalogTupleInsert(datarel, htup); - heap_freetuple(htup); - - relation_close(datarel, RowExclusiveLock); InvokeObjectPostCreateHook(StatisticExtRelationId, statoid, 0); @@ -724,32 +705,42 @@ AlterStatistics(AlterStatsStmt *stmt) } /* - * Guts of statistics object deletion. + * Delete entry in pg_statistic_ext_data catalog. We don't know if the row + * exists, so don't error out. */ void -RemoveStatisticsById(Oid statsOid) +RemoveStatisticsDataById(Oid statsOid, bool inh) { Relation relation; HeapTuple tup; - Form_pg_statistic_ext statext; - Oid relid; - /* - * First delete the pg_statistic_ext_data tuple holding the actual - * statistical data. - */ relation = table_open(StatisticExtDataRelationId, RowExclusiveLock); - tup = SearchSysCache1(STATEXTDATASTXOID, ObjectIdGetDatum(statsOid)); - - if (!HeapTupleIsValid(tup)) /* should not happen */ - elog(ERROR, "cache lookup failed for statistics data %u", statsOid); + tup = SearchSysCache2(STATEXTDATASTXOID, ObjectIdGetDatum(statsOid), + BoolGetDatum(inh)); - CatalogTupleDelete(relation, &tup->t_self); + /* We don't know if the data row for inh value exists. */ + if (HeapTupleIsValid(tup)) + { + CatalogTupleDelete(relation, &tup->t_self); - ReleaseSysCache(tup); + ReleaseSysCache(tup); + } table_close(relation, RowExclusiveLock); +} + +/* + * Guts of statistics object deletion. + */ +void +RemoveStatisticsById(Oid statsOid) +{ + Relation relation; + Relation rel; + HeapTuple tup; + Form_pg_statistic_ext statext; + Oid relid; /* * Delete the pg_statistic_ext tuple. Also send out a cache inval on the @@ -765,12 +756,26 @@ RemoveStatisticsById(Oid statsOid) statext = (Form_pg_statistic_ext) GETSTRUCT(tup); relid = statext->stxrelid; + /* + * Delete the pg_statistic_ext_data tuples holding the actual statistical + * data. There might be data with/without inheritance, so attempt deleting + * both. We lock the user table first, to prevent other processes (e.g. + * DROP STATISTICS) from removing the row concurrently. + */ + rel = table_open(relid, ShareUpdateExclusiveLock); + + RemoveStatisticsDataById(statsOid, true); + RemoveStatisticsDataById(statsOid, false); + CacheInvalidateRelcacheByRelid(relid); CatalogTupleDelete(relation, &tup->t_self); ReleaseSysCache(tup); + /* Keep lock until the end of the transaction. */ + table_close(rel, NoLock); + table_close(relation, RowExclusiveLock); } diff --git a/third_party/spanner_pg/src/backend/commands/subscriptioncmds.c b/third_party/spanner_pg/src/backend/commands/subscriptioncmds.c index 09867bbb..5a74082f 100644 --- a/third_party/spanner_pg/src/backend/commands/subscriptioncmds.c +++ b/third_party/spanner_pg/src/backend/commands/subscriptioncmds.c @@ -3,11 +3,11 @@ * subscriptioncmds.c * subscription catalog manipulation functions * - * 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 * * IDENTIFICATION - * subscriptioncmds.c + * src/backend/commands/subscriptioncmds.c * *------------------------------------------------------------------------- */ @@ -32,6 +32,7 @@ #include "executor/executor.h" #include "miscadmin.h" #include "nodes/makefuncs.h" +#include "pgstat.h" #include "replication/logicallauncher.h" #include "replication/origin.h" #include "replication/slot.h" @@ -44,10 +45,52 @@ #include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/pg_lsn.h" #include "utils/syscache.h" #include "third_party/spanner_pg/shims/catalog_shim.h" +/* + * Options that can be specified by the user in CREATE/ALTER SUBSCRIPTION + * command. + */ +#define SUBOPT_CONNECT 0x00000001 +#define SUBOPT_ENABLED 0x00000002 +#define SUBOPT_CREATE_SLOT 0x00000004 +#define SUBOPT_SLOT_NAME 0x00000008 +#define SUBOPT_COPY_DATA 0x00000010 +#define SUBOPT_SYNCHRONOUS_COMMIT 0x00000020 +#define SUBOPT_REFRESH 0x00000040 +#define SUBOPT_BINARY 0x00000080 +#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)) + +/* + * Structure to hold a bitmap representing the user-provided CREATE/ALTER + * SUBSCRIPTION command options and the parsed/default values of each of them. + */ +typedef struct SubOpts +{ + bits32 specified_opts; + char *slot_name; + char *synchronous_commit; + bool connect; + bool enabled; + bool create_slot; + bool copy_data; + bool refresh; + bool binary; + bool streaming; + bool twophase; + bool disableonerr; + XLogRecPtr lsn; +} SubOpts; + static List *fetch_table_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); @@ -58,166 +101,198 @@ static void ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, * Common option parsing function for CREATE and ALTER SUBSCRIPTION commands. * * Since not all options can be specified in both commands, this function - * will report an error on options if the target output pointer is NULL to - * accommodate that. + * will report an error if mutually exclusive options are specified. */ static void -parse_subscription_options(List *options, - bool *connect, - bool *enabled_given, bool *enabled, - bool *create_slot, - bool *slot_name_given, char **slot_name, - bool *copy_data, - char **synchronous_commit, - bool *refresh, - bool *binary_given, bool *binary, - bool *streaming_given, bool *streaming) +parse_subscription_options(ParseState *pstate, List *stmt_options, + bits32 supported_opts, SubOpts *opts) { ListCell *lc; - bool connect_given = false; - bool create_slot_given = false; - bool copy_data_given = false; - bool refresh_given = false; - /* If connect is specified, the others also need to be. */ - Assert(!connect || (enabled && create_slot && copy_data)); - - if (connect) - *connect = true; - if (enabled) - { - *enabled_given = false; - *enabled = true; - } - if (create_slot) - *create_slot = true; - if (slot_name) - { - *slot_name_given = false; - *slot_name = NULL; - } - if (copy_data) - *copy_data = true; - if (synchronous_commit) - *synchronous_commit = NULL; - if (refresh) - *refresh = true; - if (binary) - { - *binary_given = false; - *binary = false; - } - if (streaming) - { - *streaming_given = false; - *streaming = false; - } + /* Start out with cleared opts. */ + memset(opts, 0, sizeof(SubOpts)); + + /* caller must expect some option */ + Assert(supported_opts != 0); + + /* If connect option is supported, these others also need to be. */ + Assert(!IsSet(supported_opts, SUBOPT_CONNECT) || + IsSet(supported_opts, SUBOPT_ENABLED | SUBOPT_CREATE_SLOT | + SUBOPT_COPY_DATA)); + + /* Set default values for the boolean supported options. */ + if (IsSet(supported_opts, SUBOPT_CONNECT)) + opts->connect = true; + if (IsSet(supported_opts, SUBOPT_ENABLED)) + opts->enabled = true; + if (IsSet(supported_opts, SUBOPT_CREATE_SLOT)) + opts->create_slot = true; + if (IsSet(supported_opts, SUBOPT_COPY_DATA)) + opts->copy_data = true; + if (IsSet(supported_opts, SUBOPT_REFRESH)) + opts->refresh = true; + if (IsSet(supported_opts, SUBOPT_BINARY)) + opts->binary = false; + if (IsSet(supported_opts, SUBOPT_STREAMING)) + 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, options) + foreach(lc, stmt_options) { DefElem *defel = (DefElem *) lfirst(lc); - if (strcmp(defel->defname, "connect") == 0 && connect) + if (IsSet(supported_opts, SUBOPT_CONNECT) && + strcmp(defel->defname, "connect") == 0) { - if (connect_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_CONNECT)) + errorConflictingDefElem(defel, pstate); - connect_given = true; - *connect = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_CONNECT; + opts->connect = defGetBoolean(defel); } - else if (strcmp(defel->defname, "enabled") == 0 && enabled) + else if (IsSet(supported_opts, SUBOPT_ENABLED) && + strcmp(defel->defname, "enabled") == 0) { - if (*enabled_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_ENABLED)) + errorConflictingDefElem(defel, pstate); - *enabled_given = true; - *enabled = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_ENABLED; + opts->enabled = defGetBoolean(defel); } - else if (strcmp(defel->defname, "create_slot") == 0 && create_slot) + else if (IsSet(supported_opts, SUBOPT_CREATE_SLOT) && + strcmp(defel->defname, "create_slot") == 0) { - if (create_slot_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) + errorConflictingDefElem(defel, pstate); - create_slot_given = true; - *create_slot = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_CREATE_SLOT; + opts->create_slot = defGetBoolean(defel); } - else if (strcmp(defel->defname, "slot_name") == 0 && slot_name) + else if (IsSet(supported_opts, SUBOPT_SLOT_NAME) && + strcmp(defel->defname, "slot_name") == 0) { - if (*slot_name_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_SLOT_NAME)) + errorConflictingDefElem(defel, pstate); - *slot_name_given = true; - *slot_name = defGetString(defel); + opts->specified_opts |= SUBOPT_SLOT_NAME; + opts->slot_name = defGetString(defel); /* Setting slot_name = NONE is treated as no slot name. */ - if (strcmp(*slot_name, "none") == 0) - *slot_name = NULL; + if (strcmp(opts->slot_name, "none") == 0) + opts->slot_name = NULL; else - ReplicationSlotValidateName(*slot_name, ERROR); + ReplicationSlotValidateName(opts->slot_name, ERROR); } - else if (strcmp(defel->defname, "copy_data") == 0 && copy_data) + else if (IsSet(supported_opts, SUBOPT_COPY_DATA) && + strcmp(defel->defname, "copy_data") == 0) { - if (copy_data_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_COPY_DATA)) + errorConflictingDefElem(defel, pstate); - copy_data_given = true; - *copy_data = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_COPY_DATA; + opts->copy_data = defGetBoolean(defel); } - else if (strcmp(defel->defname, "synchronous_commit") == 0 && - synchronous_commit) + else if (IsSet(supported_opts, SUBOPT_SYNCHRONOUS_COMMIT) && + strcmp(defel->defname, "synchronous_commit") == 0) { - if (*synchronous_commit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_SYNCHRONOUS_COMMIT)) + errorConflictingDefElem(defel, pstate); - *synchronous_commit = defGetString(defel); + opts->specified_opts |= SUBOPT_SYNCHRONOUS_COMMIT; + opts->synchronous_commit = defGetString(defel); /* Test if the given value is valid for synchronous_commit GUC. */ - (void) set_config_option("synchronous_commit", *synchronous_commit, + (void) set_config_option("synchronous_commit", opts->synchronous_commit, PGC_BACKEND, PGC_S_TEST, GUC_ACTION_SET, false, 0, false); } - else if (strcmp(defel->defname, "refresh") == 0 && refresh) + else if (IsSet(supported_opts, SUBOPT_REFRESH) && + strcmp(defel->defname, "refresh") == 0) { - if (refresh_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_REFRESH)) + errorConflictingDefElem(defel, pstate); - refresh_given = true; - *refresh = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_REFRESH; + opts->refresh = defGetBoolean(defel); } - else if (strcmp(defel->defname, "binary") == 0 && binary) + else if (IsSet(supported_opts, SUBOPT_BINARY) && + strcmp(defel->defname, "binary") == 0) { - if (*binary_given) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + if (IsSet(opts->specified_opts, SUBOPT_BINARY)) + errorConflictingDefElem(defel, pstate); - *binary_given = true; - *binary = defGetBoolean(defel); + opts->specified_opts |= SUBOPT_BINARY; + opts->binary = defGetBoolean(defel); } - else if (strcmp(defel->defname, "streaming") == 0 && streaming) + else if (IsSet(supported_opts, SUBOPT_STREAMING) && + strcmp(defel->defname, "streaming") == 0) { - if (*streaming_given) + if (IsSet(opts->specified_opts, SUBOPT_STREAMING)) + errorConflictingDefElem(defel, pstate); + + opts->specified_opts |= SUBOPT_STREAMING; + opts->streaming = defGetBoolean(defel); + } + else if (strcmp(defel->defname, "two_phase") == 0) + { + /* + * Do not allow toggling of two_phase option. Doing so could cause + * missing of transactions and lead to an inconsistent replica. + * See comments atop worker.c + * + * Note: Unsupported twophase indicates that this call originated + * from AlterSubscription. + */ + if (!IsSet(supported_opts, SUBOPT_TWOPHASE_COMMIT)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errmsg("unrecognized subscription parameter: \"%s\"", defel->defname))); + + if (IsSet(opts->specified_opts, SUBOPT_TWOPHASE_COMMIT)) + errorConflictingDefElem(defel, pstate); - *streaming_given = true; - *streaming = defGetBoolean(defel); + 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 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, @@ -229,65 +304,170 @@ parse_subscription_options(List *options, * We've been explicitly asked to not connect, that requires some * additional processing. */ - if (connect && !*connect) + if (!opts->connect && IsSet(supported_opts, SUBOPT_CONNECT)) { /* Check for incompatible options from the user. */ - if (enabled && *enabled_given && *enabled) + if (opts->enabled && + IsSet(opts->specified_opts, SUBOPT_ENABLED)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), /*- translator: both %s are strings of the form "option = value" */ errmsg("%s and %s are mutually exclusive options", "connect = false", "enabled = true"))); - if (create_slot && create_slot_given && *create_slot) + if (opts->create_slot && + IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("%s and %s are mutually exclusive options", "connect = false", "create_slot = true"))); - if (copy_data && copy_data_given && *copy_data) + if (opts->copy_data && + IsSet(opts->specified_opts, SUBOPT_COPY_DATA)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("%s and %s are mutually exclusive options", "connect = false", "copy_data = true"))); /* Change the defaults of other options. */ - *enabled = false; - *create_slot = false; - *copy_data = false; + opts->enabled = false; + opts->create_slot = false; + opts->copy_data = false; } /* * Do additional checking for disallowed combination when slot_name = NONE * was used. */ - if (slot_name && *slot_name_given && !*slot_name) + if (!opts->slot_name && + IsSet(opts->specified_opts, SUBOPT_SLOT_NAME)) { - if (enabled && *enabled_given && *enabled) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("%s and %s are mutually exclusive options", - "slot_name = NONE", "enabled = true"))); + if (opts->enabled) + { + if (IsSet(opts->specified_opts, SUBOPT_ENABLED)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("%s and %s are mutually exclusive options", + "slot_name = NONE", "enabled = true"))); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("subscription with %s must also set %s", + "slot_name = NONE", "enabled = false"))); + } - if (create_slot && create_slot_given && *create_slot) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("%s and %s are mutually exclusive options", - "slot_name = NONE", "create_slot = true"))); + if (opts->create_slot) + { + if (IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("%s and %s are mutually exclusive options", + "slot_name = NONE", "create_slot = true"))); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("subscription with %s must also set %s", + "slot_name = NONE", "create_slot = false"))); + } + } +} - if (enabled && !*enabled_given && *enabled) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("subscription with %s must also set %s", - "slot_name = NONE", "enabled = false"))); +/* + * 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; - if (create_slot && !create_slot_given && *create_slot) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("subscription with %s must also set %s", - "slot_name = NONE", "create_slot = false"))); + 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 that the specified publications are present on 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("could not receive list of publications from the publisher: %s", + 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 on the publisher", + "publications %s do not exist on the publisher", + list_length(publicationsCopy), + pubnames->data)); } } @@ -326,7 +506,8 @@ publicationListToArray(List *publist) * Create new subscription. */ ObjectAddress -CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) +CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, + bool isTopLevel) { Relation rel; ObjectAddress myself; @@ -335,37 +516,23 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) Datum values[Natts_pg_subscription]; Oid owner = GetUserId(); HeapTuple tup; - bool connect; - bool enabled_given; - bool enabled; - bool copy_data; - bool streaming; - bool streaming_given; - char *synchronous_commit; char *conninfo; - char *slotname; - bool slotname_given; - bool binary; - bool binary_given; char originname[NAMEDATALEN]; - bool create_slot; List *publications; + bits32 supported_opts; + SubOpts opts = {0}; /* * Parse and check options. * * Connection and publication should not be specified here. */ - parse_subscription_options(stmt->options, - &connect, - &enabled_given, &enabled, - &create_slot, - &slotname_given, &slotname, - ©_data, - &synchronous_commit, - NULL, /* no "refresh" */ - &binary_given, &binary, - &streaming_given, &streaming); + 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_DISABLE_ON_ERR); + parse_subscription_options(pstate, stmt->options, supported_opts, &opts); /* * Since creating a replication slot is not transactional, rolling back @@ -373,7 +540,7 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) * CREATE SUBSCRIPTION inside a transaction block if creating a * replication slot. */ - if (create_slot) + if (opts.create_slot) PreventInTransactionBlock(isTopLevel, "CREATE SUBSCRIPTION ... WITH (create_slot = true)"); if (!superuser()) @@ -403,12 +570,13 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) stmt->subname))); } - if (!slotname_given && slotname == NULL) - slotname = stmt->subname; + if (!IsSet(opts.specified_opts, SUBOPT_SLOT_NAME) && + opts.slot_name == NULL) + opts.slot_name = stmt->subname; /* The default for synchronous_commit of subscriptions is off. */ - if (synchronous_commit == NULL) - synchronous_commit = "off"; + if (opts.synchronous_commit == NULL) + opts.synchronous_commit = "off"; conninfo = stmt->conninfo; publications = stmt->publication; @@ -427,21 +595,27 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) 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); - values[Anum_pg_subscription_subenabled - 1] = BoolGetDatum(enabled); - values[Anum_pg_subscription_subbinary - 1] = BoolGetDatum(binary); - values[Anum_pg_subscription_substream - 1] = BoolGetDatum(streaming); + values[Anum_pg_subscription_subenabled - 1] = BoolGetDatum(opts.enabled); + values[Anum_pg_subscription_subbinary - 1] = BoolGetDatum(opts.binary); + values[Anum_pg_subscription_substream - 1] = BoolGetDatum(opts.streaming); + values[Anum_pg_subscription_subtwophasestate - 1] = + 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 (slotname) + if (opts.slot_name) values[Anum_pg_subscription_subslotname - 1] = - DirectFunctionCall1(namein, CStringGetDatum(slotname)); + DirectFunctionCall1(namein, CStringGetDatum(opts.slot_name)); else nulls[Anum_pg_subscription_subslotname - 1] = true; values[Anum_pg_subscription_subsynccommit - 1] = - CStringGetTextDatum(synchronous_commit); + CStringGetTextDatum(opts.synchronous_commit); values[Anum_pg_subscription_subpublications - 1] = publicationListToArray(publications); @@ -460,7 +634,7 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) * Connect to remote side to execute requested commands and fetch table * info. */ - if (connect) + if (opts.connect) { char *err; WalReceiverConn *wrconn; @@ -477,11 +651,13 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) PG_TRY(); { + check_publications(wrconn, publications); + /* * Set sync state based on if we were asked to do data copy or * not. */ - table_state = copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; + table_state = opts.copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY; /* * Get the table list from publisher and build local table status @@ -508,15 +684,40 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) * won't use the initial snapshot for anything, so no need to * export it. */ - if (create_slot) + if (opts.create_slot) { - Assert(slotname); + bool twophase_enabled = false; - walrcv_create_slot(wrconn, slotname, false, + Assert(opts.slot_name); + + /* + * Even if two_phase is set, don't create the slot with + * two-phase enabled. Will enable it once all the tables are + * synced and ready. This avoids race-conditions like prepared + * transactions being skipped due to changes not being applied + * due to checks in should_apply_changes_for_rel() when + * tablesync for the corresponding tables are in progress. See + * comments atop worker.c. + * + * 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 + * PUBLICATION to work. + */ + if (opts.twophase && !opts.copy_data && tables != NIL) + twophase_enabled = true; + + walrcv_create_slot(wrconn, opts.slot_name, false, twophase_enabled, CRS_NOEXPORT_SNAPSHOT, NULL); + + if (twophase_enabled) + UpdateTwoPhaseState(subid, LOGICALREP_TWOPHASE_STATE_ENABLED); + ereport(NOTICE, (errmsg("created replication slot \"%s\" on publisher", - slotname))); + opts.slot_name))); } } PG_FINALLY(); @@ -533,7 +734,9 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) table_close(rel, RowExclusiveLock); - if (enabled) + pgstat_create_subscription(subid); + + if (opts.enabled) ApplyLauncherWakeupAtCommit(); ObjectAddressSet(myself, SubscriptionRelationId, subid); @@ -544,7 +747,8 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel) } static void -AlterSubscription_refresh(Subscription *sub, bool copy_data) +AlterSubscription_refresh(Subscription *sub, bool copy_data, + List *validate_publications) { char *err; List *pubrel_names; @@ -575,6 +779,9 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) PG_TRY(); { + if (validate_publications) + check_publications(wrconn, validate_publications); + /* Get the table list from publisher. */ pubrel_names = fetch_table_list(wrconn, sub->publications); @@ -756,7 +963,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) * Alter the existing subscription. */ ObjectAddress -AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) +AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, + bool isTopLevel) { Relation rel; ObjectAddress myself; @@ -768,6 +976,8 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) bool update_tuple = false; Subscription *sub; Form_pg_subscription form; + bits32 supported_opts; + SubOpts opts = {0}; rel = table_open(SubscriptionRelationId, RowExclusiveLock); @@ -803,93 +1013,85 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) { case ALTER_SUBSCRIPTION_OPTIONS: { - char *slotname; - bool slotname_given; - char *synchronous_commit; - bool binary_given; - bool binary; - bool streaming_given; - bool streaming; - - parse_subscription_options(stmt->options, - NULL, /* no "connect" */ - NULL, NULL, /* no "enabled" */ - NULL, /* no "create_slot" */ - &slotname_given, &slotname, - NULL, /* no "copy_data" */ - &synchronous_commit, - NULL, /* no "refresh" */ - &binary_given, &binary, - &streaming_given, &streaming); - - if (slotname_given) + supported_opts = (SUBOPT_SLOT_NAME | + SUBOPT_SYNCHRONOUS_COMMIT | SUBOPT_BINARY | + SUBOPT_STREAMING | SUBOPT_DISABLE_ON_ERR); + + parse_subscription_options(pstate, stmt->options, + supported_opts, &opts); + + if (IsSet(opts.specified_opts, SUBOPT_SLOT_NAME)) { - if (sub->enabled && !slotname) + /* + * The subscription must be disabled to allow slot_name as + * 'none', otherwise, the apply worker will repeatedly try + * to stream the data using that slot_name which neither + * exists on the publisher nor the user will be allowed to + * create it. + */ + if (sub->enabled && !opts.slot_name) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot set %s for enabled subscription", "slot_name = NONE"))); - if (slotname) + if (opts.slot_name) values[Anum_pg_subscription_subslotname - 1] = - DirectFunctionCall1(namein, CStringGetDatum(slotname)); + DirectFunctionCall1(namein, CStringGetDatum(opts.slot_name)); else nulls[Anum_pg_subscription_subslotname - 1] = true; replaces[Anum_pg_subscription_subslotname - 1] = true; } - if (synchronous_commit) + if (opts.synchronous_commit) { values[Anum_pg_subscription_subsynccommit - 1] = - CStringGetTextDatum(synchronous_commit); + CStringGetTextDatum(opts.synchronous_commit); replaces[Anum_pg_subscription_subsynccommit - 1] = true; } - if (binary_given) + if (IsSet(opts.specified_opts, SUBOPT_BINARY)) { values[Anum_pg_subscription_subbinary - 1] = - BoolGetDatum(binary); + BoolGetDatum(opts.binary); replaces[Anum_pg_subscription_subbinary - 1] = true; } - if (streaming_given) + if (IsSet(opts.specified_opts, SUBOPT_STREAMING)) { values[Anum_pg_subscription_substream - 1] = - BoolGetDatum(streaming); + BoolGetDatum(opts.streaming); 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; } case ALTER_SUBSCRIPTION_ENABLED: { - bool enabled, - enabled_given; - - parse_subscription_options(stmt->options, - NULL, /* no "connect" */ - &enabled_given, &enabled, - NULL, /* no "create_slot" */ - NULL, NULL, /* no "slot_name" */ - NULL, /* no "copy_data" */ - NULL, /* no "synchronous_commit" */ - NULL, /* no "refresh" */ - NULL, NULL, /* no "binary" */ - NULL, NULL); /* no streaming */ - Assert(enabled_given); - - if (!sub->slotname && enabled) + parse_subscription_options(pstate, stmt->options, + SUBOPT_ENABLED, &opts); + Assert(IsSet(opts.specified_opts, SUBOPT_ENABLED)); + + if (!sub->slotname && opts.enabled) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot enable subscription that does not have a slot name"))); values[Anum_pg_subscription_subenabled - 1] = - BoolGetDatum(enabled); + BoolGetDatum(opts.enabled); replaces[Anum_pg_subscription_subenabled - 1] = true; - if (enabled) + if (opts.enabled) ApplyLauncherWakeupAtCommit(); update_tuple = true; @@ -910,19 +1112,10 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) case ALTER_SUBSCRIPTION_SET_PUBLICATION: { - bool copy_data; - bool refresh; - - parse_subscription_options(stmt->options, - NULL, /* no "connect" */ - NULL, NULL, /* no "enabled" */ - NULL, /* no "create_slot" */ - NULL, NULL, /* no "slot_name" */ - ©_data, - NULL, /* no "synchronous_commit" */ - &refresh, - NULL, NULL, /* no "binary" */ - NULL, NULL); /* no "streaming" */ + supported_opts = SUBOPT_COPY_DATA | SUBOPT_REFRESH; + parse_subscription_options(pstate, stmt->options, + supported_opts, &opts); + values[Anum_pg_subscription_subpublications - 1] = publicationListToArray(stmt->publication); replaces[Anum_pg_subscription_subpublications - 1] = true; @@ -930,7 +1123,7 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) update_tuple = true; /* Refresh if user asked us to. */ - if (refresh) + if (opts.refresh) { if (!sub->enabled) ereport(ERROR, @@ -938,12 +1131,23 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) errmsg("ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions"), errhint("Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)."))); + /* + * See ALTER_SUBSCRIPTION_REFRESH for details why this is + * not allowed. + */ + if (sub->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED && opts.copy_data) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled"), + errhint("Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION."))); + PreventInTransactionBlock(isTopLevel, "ALTER SUBSCRIPTION with refresh"); /* Make sure refresh sees the new list of publications. */ sub->publications = stmt->publication; - AlterSubscription_refresh(sub, copy_data); + AlterSubscription_refresh(sub, opts.copy_data, + stmt->publication); } break; @@ -952,24 +1156,14 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) case ALTER_SUBSCRIPTION_ADD_PUBLICATION: case ALTER_SUBSCRIPTION_DROP_PUBLICATION: { - bool isadd = stmt->kind == ALTER_SUBSCRIPTION_ADD_PUBLICATION; - bool copy_data = false; - bool refresh; List *publist; + bool isadd = stmt->kind == ALTER_SUBSCRIPTION_ADD_PUBLICATION; - parse_subscription_options(stmt->options, - NULL, /* no "connect" */ - NULL, NULL, /* no "enabled" */ - NULL, /* no "create_slot" */ - NULL, NULL, /* no "slot_name" */ - ©_data, - NULL, /* no "synchronous_commit" */ - &refresh, - NULL, NULL, /* no "binary" */ - NULL, NULL); /* no "streaming" */ + supported_opts = SUBOPT_REFRESH | SUBOPT_COPY_DATA; + parse_subscription_options(pstate, stmt->options, + supported_opts, &opts); publist = merge_publications(sub->publications, stmt->publication, isadd, stmt->subname); - values[Anum_pg_subscription_subpublications - 1] = publicationListToArray(publist); replaces[Anum_pg_subscription_subpublications - 1] = true; @@ -977,20 +1171,42 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) update_tuple = true; /* Refresh if user asked us to. */ - if (refresh) + 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), errmsg("ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions"), - errhint("Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + isadd ? + "ALTER SUBSCRIPTION ... ADD PUBLICATION ... WITH (refresh = false)" : + "ALTER SUBSCRIPTION ... DROP PUBLICATION ... WITH (refresh = false)"))); + + /* + * See ALTER_SUBSCRIPTION_REFRESH for details why this is + * not allowed. + */ + if (sub->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED && opts.copy_data) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled"), + /* translator: %s is an SQL ALTER command */ + errhint("Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION.", + isadd ? + "ALTER SUBSCRIPTION ... ADD PUBLICATION" : + "ALTER SUBSCRIPTION ... DROP PUBLICATION"))); PreventInTransactionBlock(isTopLevel, "ALTER SUBSCRIPTION with refresh"); /* Refresh the new list of publications. */ sub->publications = publist; - AlterSubscription_refresh(sub, copy_data); + AlterSubscription_refresh(sub, opts.copy_data, + validate_publications); } break; @@ -998,31 +1214,86 @@ AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel) case ALTER_SUBSCRIPTION_REFRESH: { - bool copy_data; - if (!sub->enabled) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions"))); - parse_subscription_options(stmt->options, - NULL, /* no "connect" */ - NULL, NULL, /* no "enabled" */ - NULL, /* no "create_slot" */ - NULL, NULL, /* no "slot_name" */ - ©_data, - NULL, /* no "synchronous_commit" */ - NULL, /* no "refresh" */ - NULL, NULL, /* no "binary" */ - NULL, NULL); /* no "streaming" */ + parse_subscription_options(pstate, stmt->options, + SUBOPT_COPY_DATA, &opts); + + /* + * The subscription option "two_phase" requires that + * replication has passed the initial table synchronization + * phase before the two_phase becomes properly enabled. + * + * But, having reached this two-phase commit "enabled" state + * we must not allow any subsequent table initialization to + * occur. So the ALTER SUBSCRIPTION ... REFRESH is disallowed + * when the user had requested two_phase = on mode. + * + * The exception to this restriction is when copy_data = + * false, because when copy_data is false the tablesync will + * start already in READY state and will exit directly without + * doing anything. + * + * For more details see comments atop worker.c. + */ + if (sub->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED && opts.copy_data) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled"), + errhint("Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION."))); PreventInTransactionBlock(isTopLevel, "ALTER SUBSCRIPTION ... REFRESH"); - AlterSubscription_refresh(sub, copy_data); + AlterSubscription_refresh(sub, opts.copy_data, NULL); 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); @@ -1138,7 +1409,8 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) * Since dropping a replication slot is not transactional, the replication * slot stays dropped even if the transaction rolls back. So we cannot * run DROP SUBSCRIPTION inside a transaction block if dropping the - * replication slot. + * replication slot. Also, in this case, we report a message for dropping + * 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 @@ -1223,6 +1495,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) snprintf(originname, sizeof(originname), "pg_%u", subid); replorigin_drop_by_name(originname, true, false); + /* + * Tell the cumulative stats system that the subscription is getting + * dropped. + */ + pgstat_drop_subscription(subid); + /* * If there is no slot associated with the subscription, we can finish * here. @@ -1303,7 +1581,6 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) */ if (slotname) ReplicationSlotDropAtPubNode(wrconn, slotname, false); - } PG_FINALLY(); { @@ -1408,6 +1685,8 @@ AlterSubscriptionOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId) InvokeObjectPostAlterHook(SubscriptionRelationId, form->oid, 0); + + ApplyLauncherWakeupAtCommit(); } /* @@ -1474,6 +1753,11 @@ AlterSubscriptionOwner_oid(Oid subid, Oid newOwnerId) /* * Get the list of tables which belong to specified publications on the * publisher connection. + * + * Note that we don't support the case where the column list is different for + * the same table in different publications to avoid sending unwanted column + * information for some of the rows. This can happen when both the column + * list and row filter are specified for different publications. */ static List * fetch_table_list(WalReceiverConn *wrconn, List *publications) @@ -1481,32 +1765,23 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications) WalRcvExecResult *res; StringInfoData cmd; TupleTableSlot *slot; - Oid tableRow[2] = {TEXTOID, TEXTOID}; - ListCell *lc; - bool first; + Oid tableRow[3] = {TEXTOID, TEXTOID, NAMEARRAYOID}; List *tablelist = NIL; - - Assert(list_length(publications) > 0); + bool check_columnlist = (walrcv_server_version(wrconn) >= 150000); 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)); + appendStringInfoString(&cmd, "SELECT DISTINCT t.schemaname, t.tablename \n"); - if (first) - first = false; - else - appendStringInfoString(&cmd, ", "); + /* Get column lists for each relation if the publisher supports it */ + if (check_columnlist) + appendStringInfoString(&cmd, ", t.attnames\n"); - appendStringInfoString(&cmd, quote_literal_cstr(pubname)); - } + appendStringInfoString(&cmd, "FROM pg_catalog.pg_publication_tables t\n" + " WHERE t.pubname IN ("); + get_publications_str(publications, &cmd, true); appendStringInfoChar(&cmd, ')'); - res = walrcv_exec(wrconn, cmd.data, 2, tableRow); + res = walrcv_exec(wrconn, cmd.data, check_columnlist ? 3 : 2, tableRow); pfree(cmd.data); if (res->status != WALRCV_OK_TUPLES) @@ -1530,7 +1805,14 @@ fetch_table_list(WalReceiverConn *wrconn, List *publications) Assert(!isnull); rv = makeRangeVar(nspname, relname, -1); - tablelist = lappend(tablelist, rv); + + if (check_columnlist && list_member(tablelist, rv)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use different column lists for table \"%s.%s\" in different publications", + nspname, relname)); + else + tablelist = lappend(tablelist, rv); ExecClearTuple(slot); } @@ -1577,8 +1859,8 @@ ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, char *err) ereport(ERROR, (errcode(ERRCODE_CONNECTION_FAILURE), - errmsg("could not connect to publisher when attempting to " - "drop replication slot \"%s\": %s", slotname, err), + errmsg("could not connect to publisher when attempting to drop replication slot \"%s\": %s", + slotname, err), /* translator: %s is an SQL ALTER command */ errhint("Use %s to disable the subscription, and then use %s to disassociate it from the slot.", "ALTER SUBSCRIPTION ... DISABLE", diff --git a/third_party/spanner_pg/src/backend/commands/tablecmds.c b/third_party/spanner_pg/src/backend/commands/tablecmds.c index 07127e4d..52a03a76 100644 --- a/third_party/spanner_pg/src/backend/commands/tablecmds.c +++ b/third_party/spanner_pg/src/backend/commands/tablecmds.c @@ -3,7 +3,7 @@ * tablecmds.c * Commands for creating and altering table structures and settings * - * 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 * * @@ -26,6 +26,7 @@ #include "access/toast_compression.h" #include "access/xact.h" #include "access/xlog.h" +#include "access/xloginsert.h" #include "catalog/catalog.h" #include "catalog/heap.h" #include "catalog/index.h" @@ -33,15 +34,17 @@ #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" #include "catalog/pg_foreign_table.h" #include "catalog/pg_inherits.h" +#include "catalog/pg_largeobject.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" -#include "catalog/pg_tablespace.h" #include "catalog/pg_statistic_ext.h" +#include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" #include "catalog/pg_type.h" #include "catalog/storage.h" @@ -179,6 +182,7 @@ typedef struct AlteredTableInfo List *afterStmts; /* List of utility command parsetrees */ bool verify_new_notnull; /* T if we should recheck NOT NULL */ int rewrite; /* Reason for forced rewrite, if any */ + Oid newAccessMethod; /* new access method; 0 means no change */ Oid newTableSpace; /* new tablespace; 0 means no change */ bool chgPersistence; /* T if SET LOGGED/UNLOGGED is used */ char newrelpersistence; /* if above is true */ @@ -318,6 +322,7 @@ struct DropRelationCallbackState #define ATT_COMPOSITE_TYPE 0x0010 #define ATT_FOREIGN_TABLE 0x0020 #define ATT_PARTITIONED_INDEX 0x0040 +#define ATT_SEQUENCE 0x0080 /* * ForeignTruncateInfo @@ -406,8 +411,7 @@ static void ATRewriteTables(AlterTableStmt *parsetree, AlterTableUtilityContext *context); static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode); static AlteredTableInfo *ATGetQueueEntry(List **wqueue, Relation rel); -static void ATSimplePermissions(Relation rel, int allowed_targets); -static void ATWrongRelkindError(Relation rel, int allowed_targets); +static void ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets); static void ATSimpleRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context); @@ -491,12 +495,19 @@ static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstra Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, - bool old_check_ok); + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, + Oid parentDelTrigger, Oid parentUpdTrigger); +static void validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, + int numfksetcols, const int16 *fksetcolsattnums, + List *fksetcols); static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, - bool old_check_ok, LOCKMODE lockmode); + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, LOCKMODE lockmode, + Oid parentInsTrigger, Oid parentUpdTrigger); static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel, Relation partitionRel); static void CloneFkReferenced(Relation parentRel, Relation partitionRel); @@ -504,15 +515,30 @@ static void CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel); static void createForeignKeyCheckTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, - Oid indexOid); + Oid indexOid, + Oid parentInsTrigger, Oid parentUpdTrigger, + Oid *insertTrigOid, Oid *updateTrigOid); static void createForeignKeyActionTriggers(Relation rel, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, - Oid indexOid); + Oid indexOid, + Oid parentDelTrigger, Oid parentUpdTrigger, + Oid *deleteTrigOid, Oid *updateTrigOid); static bool tryAttachPartitionForeignKey(ForeignKeyCacheInfo *fk, Oid partRelid, Oid parentConstrOid, int numfks, AttrNumber *mapped_conkey, AttrNumber *confkey, - Oid *conpfeqop); + Oid *conpfeqop, + Oid parentInsTrigger, + Oid parentUpdTrigger, + Relation trigrel); +static void GetForeignKeyActionTriggers(Relation trigrel, + Oid conoid, Oid confrelid, Oid conrelid, + Oid *deleteTriggerOid, + Oid *updateTriggerOid); +static void GetForeignKeyCheckTriggers(Relation trigrel, + Oid conoid, Oid confrelid, Oid conrelid, + Oid *insertTriggerOid, + Oid *updateTriggerOid); static void ATExecDropConstraint(Relation rel, const char *constrName, DropBehavior behavior, bool recurse, bool recursing, @@ -547,6 +573,7 @@ static void change_owner_recurse_to_sequences(Oid relationOid, static ObjectAddress ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode); static void ATExecDropCluster(Relation rel, LOCKMODE lockmode); +static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname); static bool ATPrepChangePersistence(Relation rel, bool toLogged); static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacename, LOCKMODE lockmode); @@ -923,11 +950,8 @@ 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 == RELKIND_RELATION || - relkind == RELKIND_TOASTVALUE || - relkind == RELKIND_MATVIEW) + else if (RELKIND_HAS_TABLE_AM(relkind)) accessMethod = default_table_access_method; /* look up the access method, verify it is for a table */ @@ -2162,7 +2186,15 @@ truncate_check_rel(Oid relid, Form_pg_class reltuple) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is not a table", relname))); - if (!allowSystemTableMods && IsSystemClass(relid, reltuple)) + /* + * Most system catalogs can't be truncated at all, or at least not unless + * allow_system_table_mods=on. As an exception, however, we allow + * pg_largeobject to be truncated as part of pg_upgrade, because we need + * to change its relfilenode to match the old cluster, and allowing a + * TRUNCATE command to be executed is the easiest way of doing that. + */ + if (!allowSystemTableMods && IsSystemClass(relid, reltuple) + && (!IsBinaryUpgrade || relid != LargeObjectRelationId)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied: \"%s\" is a system catalog", @@ -3378,8 +3410,9 @@ renameatt_check(Oid myrelid, Form_pg_class classform, bool recursing) relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, composite type, index, or foreign table", - NameStr(classform->relname)))); + errmsg("cannot rename columns of relation \"%s\"", + NameStr(classform->relname)), + errdetail_relkind_not_supported(relkind))); /* * permissions checking. only the owner of a class can change its schema. @@ -3752,7 +3785,6 @@ RenameConstraint(RenameStmt *stmt) stmt->relation->inh), /* recursive? */ false, /* recursing? */ 0 /* expected inhcount */ ); - } /* @@ -4149,6 +4181,7 @@ AlterTableGetLockLevel(List *cmds) */ case AT_AddColumn: /* may rewrite heap, in some cases and visible * to SELECT */ + case AT_SetAccessMethod: /* must rewrite heap */ case AT_SetTableSpace: /* must rewrite heap */ case AT_AlterColumnType: /* must rewrite heap */ cmd_lockmode = AccessExclusiveLock; @@ -4475,7 +4508,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, switch (cmd->subtype) { case AT_AddColumn: /* ADD COLUMN */ - ATSimplePermissions(rel, + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE); ATPrepAddColumn(wqueue, rel, recurse, recursing, false, cmd, lockmode, context); @@ -4483,7 +4516,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_ADD_COL; break; case AT_AddColumnToView: /* add column via CREATE OR REPLACE VIEW */ - ATSimplePermissions(rel, ATT_VIEW); + ATSimplePermissions(cmd->subtype, rel, ATT_VIEW); ATPrepAddColumn(wqueue, rel, recurse, recursing, true, cmd, lockmode, context); /* Recursion occurs during execution phase */ @@ -4497,7 +4530,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, * substitutes default values into INSERTs before it expands * rules. */ - ATSimplePermissions(rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); /* No command-specific prep needed */ pass = cmd->def ? AT_PASS_ADD_OTHERCONSTR : AT_PASS_DROP; @@ -4505,77 +4538,77 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, case AT_CookedColumnDefault: /* add a pre-cooked default */ /* This is currently used only in CREATE TABLE */ /* (so the permission check really isn't necessary) */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* This command never recurses */ pass = AT_PASS_ADD_OTHERCONSTR; break; case AT_AddIdentity: - ATSimplePermissions(rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); /* This command never recurses */ pass = AT_PASS_ADD_OTHERCONSTR; break; case AT_SetIdentity: - ATSimplePermissions(rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); /* This command never recurses */ /* This should run after AddIdentity, so do it in MISC pass */ pass = AT_PASS_MISC; break; case AT_DropIdentity: - ATSimplePermissions(rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); /* This command never recurses */ pass = AT_PASS_DROP; break; case AT_DropNotNull: /* ALTER COLUMN DROP NOT NULL */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); ATPrepDropNotNull(rel, recurse, recursing); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); pass = AT_PASS_DROP; break; case AT_SetNotNull: /* ALTER COLUMN SET NOT NULL */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Need command-specific recursion decision */ ATPrepSetNotNull(wqueue, rel, cmd, recurse, recursing, lockmode, context); pass = AT_PASS_COL_ATTRS; break; case AT_CheckNotNull: /* check column is already marked NOT NULL */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); /* No command-specific prep needed */ pass = AT_PASS_COL_ATTRS; break; case AT_DropExpression: /* ALTER COLUMN DROP EXPRESSION */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); ATPrepDropExpression(rel, cmd, recurse, recursing, lockmode); pass = AT_PASS_DROP; break; case AT_SetStatistics: /* ALTER COLUMN SET STATISTICS */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_SetOptions: /* ALTER COLUMN SET ( options ) */ case AT_ResetOptions: /* ALTER COLUMN RESET ( options ) */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE); /* This command never recurses */ pass = AT_PASS_MISC; break; case AT_SetStorage: /* ALTER COLUMN SET STORAGE */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_SetCompression: /* ALTER COLUMN SET COMPRESSION */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_DropColumn: /* DROP COLUMN */ - ATSimplePermissions(rel, + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE); ATPrepDropColumn(wqueue, rel, recurse, recursing, cmd, lockmode, context); @@ -4583,13 +4616,13 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_DROP; break; case AT_AddIndex: /* ADD INDEX */ - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_ADD_INDEX; break; case AT_AddConstraint: /* ADD CONSTRAINT */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Recursion occurs during execution phase */ /* No command-specific prep needed except saving recurse flag */ if (recurse) @@ -4597,13 +4630,13 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_ADD_CONSTR; break; case AT_AddIndexConstraint: /* ADD CONSTRAINT USING INDEX */ - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_ADD_INDEXCONSTR; break; case AT_DropConstraint: /* DROP CONSTRAINT */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); ATCheckPartitionsNotInUse(rel, lockmode); /* Other recursion occurs during execution phase */ /* No command-specific prep needed except saving recurse flag */ @@ -4612,7 +4645,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_DROP; break; case AT_AlterColumnType: /* ALTER COLUMN TYPE */ - ATSimplePermissions(rel, + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE); /* See comments for ATPrepAlterColumnType */ cmd = ATParseTransformCmd(wqueue, tab, rel, cmd, recurse, lockmode, @@ -4624,7 +4657,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_ALTER_TYPE; break; case AT_AlterColumnGenericOptions: - ATSimplePermissions(rel, ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_FOREIGN_TABLE); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_MISC; @@ -4636,13 +4669,13 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, break; case AT_ClusterOn: /* CLUSTER ON */ case AT_DropCluster: /* SET WITHOUT CLUSTER */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW); /* These commands never recurse */ /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_SetLogged: /* SET LOGGED */ - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE); if (tab->chgPersistence) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -4657,7 +4690,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_SetUnLogged: /* SET UNLOGGED */ - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE); if (tab->chgPersistence) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -4672,11 +4705,29 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_DropOids: /* SET WITHOUT OIDS */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); pass = AT_PASS_DROP; break; + case AT_SetAccessMethod: /* SET ACCESS METHOD */ + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW); + + /* partitioned tables don't have an access method */ + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change access method of a partitioned table"))); + + /* check if another access method change was already requested */ + if (OidIsValid(tab->newAccessMethod)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot have multiple SET ACCESS METHOD subcommands"))); + + ATPrepSetAccessMethod(tab, rel, cmd->name); + pass = AT_PASS_MISC; /* does not matter; no work in Phase 2 */ + break; case AT_SetTableSpace: /* SET TABLESPACE */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX); /* This command never recurses */ ATPrepSetTableSpace(tab, rel, cmd->name, lockmode); @@ -4685,30 +4736,30 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, case AT_SetRelOptions: /* SET (...) */ case AT_ResetRelOptions: /* RESET (...) */ case AT_ReplaceRelOptions: /* reset them all, then set just these */ - ATSimplePermissions(rel, ATT_TABLE | ATT_VIEW | ATT_MATVIEW | ATT_INDEX); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_MATVIEW | ATT_INDEX); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_AddInherit: /* INHERIT */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* This command never recurses */ ATPrepAddInherit(rel); pass = AT_PASS_MISC; break; case AT_DropInherit: /* NO INHERIT */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* This command never recurses */ /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_AlterConstraint: /* ALTER CONSTRAINT */ - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* Recursion occurs during execution phase */ pass = AT_PASS_MISC; break; case AT_ValidateConstraint: /* VALIDATE CONSTRAINT */ - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Recursion occurs during execution phase */ /* No command-specific prep needed except saving recurse flag */ if (recurse) @@ -4716,7 +4767,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, pass = AT_PASS_MISC; break; case AT_ReplicaIdentity: /* REPLICA IDENTITY ... */ - ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW); pass = AT_PASS_MISC; /* This command never recurses */ /* No command-specific prep needed */ @@ -4729,7 +4780,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, case AT_DisableTrig: /* DISABLE TRIGGER variants */ case AT_DisableTrigAll: case AT_DisableTrigUser: - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Set up recursion for phase 2; no other prep needed */ if (recurse) cmd->recurse = true; @@ -4745,28 +4796,28 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, case AT_DisableRowSecurity: case AT_ForceRowSecurity: case AT_NoForceRowSecurity: - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* These commands never recurse */ /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_GenericOptions: - ATSimplePermissions(rel, ATT_FOREIGN_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_FOREIGN_TABLE); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_AttachPartition: - ATSimplePermissions(rel, ATT_TABLE | ATT_PARTITIONED_INDEX); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_PARTITIONED_INDEX); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_DetachPartition: - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_DetachPartitionFinalize: - ATSimplePermissions(rel, ATT_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; @@ -4824,7 +4875,7 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, foreach(lcmd, subcmds) ATExecCmd(wqueue, tab, - castNode(AlterTableCmd, lfirst(lcmd)), + lfirst_node(AlterTableCmd, lcmd), lockmode, pass, context); /* @@ -5051,6 +5102,9 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, case AT_DropOids: /* SET WITHOUT OIDS */ /* nothing to do here, oid columns don't exist anymore */ break; + case AT_SetAccessMethod: /* SET ACCESS METHOD */ + /* handled specially in Phase 3 */ + break; case AT_SetTableSpace: /* SET TABLESPACE */ /* @@ -5394,7 +5448,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, /* * We only need to rewrite the table if at least one column needs to - * be recomputed, or we are changing its persistence. + * be recomputed, or we are changing its persistence or access method. * * There are two reasons for requiring a rewrite when changing * persistence: on one hand, we need to ensure that the buffers @@ -5403,11 +5457,12 @@ 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; Oid OIDNewHeap; + Oid NewAccessMethod; Oid NewTableSpace; char persistence; @@ -5448,6 +5503,15 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, else NewTableSpace = OldHeap->rd_rel->reltablespace; + /* + * Select destination access method (same as original unless user + * requested a change) + */ + if (OidIsValid(tab->newAccessMethod)) + NewAccessMethod = tab->newAccessMethod; + else + NewAccessMethod = OldHeap->rd_rel->relam; + /* * Select persistence of transient table (same as original unless * user requested a change) @@ -5487,8 +5551,8 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, * persistence. That wouldn't work for pg_class, but that can't be * unlogged anyway. */ - OIDNewHeap = make_new_heap(tab->relid, NewTableSpace, persistence, - lockmode); + OIDNewHeap = make_new_heap(tab->relid, NewTableSpace, NewAccessMethod, + persistence, lockmode); /* * Copy the heap data into the new table with the desired @@ -5511,6 +5575,13 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, RecentXmin, ReadNextMultiXactId(), persistence); + + InvokeObjectPostAlterHook(RelationRelationId, tab->relid, 0); + } + else if (tab->rewrite > 0 && tab->relkind == RELKIND_SEQUENCE) + { + if (tab->chgPersistence) + SequenceChangePersistence(tab->relid, tab->newrelpersistence); } else { @@ -5530,6 +5601,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); + } + } } /* @@ -6003,6 +6091,8 @@ ATGetQueueEntry(List **wqueue, Relation rel) tab->rel = NULL; /* set later */ tab->relkind = rel->rd_rel->relkind; tab->oldDesc = CreateTupleDescCopyConstr(RelationGetDescr(rel)); + tab->newAccessMethod = InvalidOid; + tab->newTableSpace = InvalidOid; tab->newrelpersistence = RELPERSISTENCE_PERMANENT; tab->chgPersistence = false; @@ -6011,6 +6101,166 @@ ATGetQueueEntry(List **wqueue, Relation rel) return tab; } +static const char * +alter_table_type_to_string(AlterTableType cmdtype) +{ + switch (cmdtype) + { + case AT_AddColumn: + case AT_AddColumnRecurse: + case AT_AddColumnToView: + return "ADD COLUMN"; + case AT_ColumnDefault: + case AT_CookedColumnDefault: + return "ALTER COLUMN ... SET DEFAULT"; + case AT_DropNotNull: + return "ALTER COLUMN ... DROP NOT NULL"; + case AT_SetNotNull: + return "ALTER COLUMN ... SET NOT NULL"; + case AT_DropExpression: + return "ALTER COLUMN ... DROP EXPRESSION"; + case AT_CheckNotNull: + return NULL; /* not real grammar */ + case AT_SetStatistics: + return "ALTER COLUMN ... SET STATISTICS"; + case AT_SetOptions: + return "ALTER COLUMN ... SET"; + case AT_ResetOptions: + return "ALTER COLUMN ... RESET"; + case AT_SetStorage: + return "ALTER COLUMN ... SET STORAGE"; + case AT_SetCompression: + return "ALTER COLUMN ... SET COMPRESSION"; + case AT_DropColumn: + case AT_DropColumnRecurse: + return "DROP COLUMN"; + case AT_AddIndex: + case AT_ReAddIndex: + return NULL; /* not real grammar */ + case AT_AddConstraint: + case AT_AddConstraintRecurse: + case AT_ReAddConstraint: + case AT_ReAddDomainConstraint: + case AT_AddIndexConstraint: + return "ADD CONSTRAINT"; + case AT_AlterConstraint: + return "ALTER CONSTRAINT"; + case AT_ValidateConstraint: + case AT_ValidateConstraintRecurse: + return "VALIDATE CONSTRAINT"; + case AT_DropConstraint: + case AT_DropConstraintRecurse: + return "DROP CONSTRAINT"; + case AT_ReAddComment: + return NULL; /* not real grammar */ + case AT_AlterColumnType: + return "ALTER COLUMN ... SET DATA TYPE"; + case AT_AlterColumnGenericOptions: + return "ALTER COLUMN ... OPTIONS"; + case AT_ChangeOwner: + return "OWNER TO"; + case AT_ClusterOn: + return "CLUSTER ON"; + case AT_DropCluster: + return "SET WITHOUT CLUSTER"; + case AT_SetAccessMethod: + return "SET ACCESS METHOD"; + case AT_SetLogged: + return "SET LOGGED"; + case AT_SetUnLogged: + return "SET UNLOGGED"; + case AT_DropOids: + return "SET WITHOUT OIDS"; + case AT_SetTableSpace: + return "SET TABLESPACE"; + case AT_SetRelOptions: + return "SET"; + case AT_ResetRelOptions: + return "RESET"; + case AT_ReplaceRelOptions: + return NULL; /* not real grammar */ + case AT_EnableTrig: + return "ENABLE TRIGGER"; + case AT_EnableAlwaysTrig: + return "ENABLE ALWAYS TRIGGER"; + case AT_EnableReplicaTrig: + return "ENABLE REPLICA TRIGGER"; + case AT_DisableTrig: + return "DISABLE TRIGGER"; + case AT_EnableTrigAll: + return "ENABLE TRIGGER ALL"; + case AT_DisableTrigAll: + return "DISABLE TRIGGER ALL"; + case AT_EnableTrigUser: + return "ENABLE TRIGGER USER"; + case AT_DisableTrigUser: + return "DISABLE TRIGGER USER"; + case AT_EnableRule: + return "ENABLE RULE"; + case AT_EnableAlwaysRule: + return "ENABLE ALWAYS RULE"; + case AT_EnableReplicaRule: + return "ENABLE REPLICA RULE"; + case AT_DisableRule: + return "DISABLE RULE"; + case AT_AddInherit: + return "INHERIT"; + case AT_DropInherit: + return "NO INHERIT"; + case AT_AddOf: + return "OF"; + case AT_DropOf: + return "NOT OF"; + case AT_ReplicaIdentity: + return "REPLICA IDENTITY"; + case AT_EnableRowSecurity: + return "ENABLE ROW SECURITY"; + case AT_DisableRowSecurity: + return "DISABLE ROW SECURITY"; + case AT_ForceRowSecurity: + return "FORCE ROW SECURITY"; + case AT_NoForceRowSecurity: + return "NO FORCE ROW SECURITY"; + case AT_GenericOptions: + return "OPTIONS"; + case AT_AttachPartition: + return "ATTACH PARTITION"; + case AT_DetachPartition: + return "DETACH PARTITION"; + case AT_DetachPartitionFinalize: + return "DETACH PARTITION ... FINALIZE"; + case AT_AddIdentity: + return "ALTER COLUMN ... ADD IDENTITY"; + case AT_SetIdentity: + return "ALTER COLUMN ... SET"; + case AT_DropIdentity: + return "ALTER COLUMN ... DROP IDENTITY"; + case AT_ReAddStatistics: + return NULL; /* not real grammar */ + /* SPANGRES BEGIN */ + case AT_AddTtl: + return "ADD TTL"; + case AT_AlterTtl: + return "ALTER TTL"; + case AT_DropTtl: + return "DROP TTL"; + case AT_SetOnDeleteCascade: + case AT_SetOnDeleteNoAction: + return "SET INTERLEAVE IN PARENT ON DELETE"; + case AT_AddIndexIncludeColumn: + return "ALTER INDEX ... ADD INCLUDE COLUMN"; + case AT_DropIndexIncludeColumn: + return "ALTER INDEX ... DROP INCLUDE COLUMN"; + case AT_AddSynonym: + return "ADD SYNONYM"; + case AT_DropSynonym: + return "DROP SYNONYM"; + /* SPANGRES END */ + } + + return NULL; +} + /* * ATSimplePermissions * @@ -6019,7 +6269,7 @@ ATGetQueueEntry(List **wqueue, Relation rel) * - Ensure that it is not a system table */ static void -ATSimplePermissions(Relation rel, int allowed_targets) +ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets) { int actual_target; @@ -6047,6 +6297,9 @@ ATSimplePermissions(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; @@ -6054,7 +6307,21 @@ ATSimplePermissions(Relation rel, int allowed_targets) /* Wrong target type? */ if ((actual_target & allowed_targets) == 0) - ATWrongRelkindError(rel, allowed_targets); + { + const char *action_str = alter_table_type_to_string(cmdtype); + + if (action_str) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + /* translator: %s is a group of some SQL keywords */ + errmsg("ALTER action %s cannot be performed on relation \"%s\"", + action_str, RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); + else + /* internal error? */ + elog(ERROR, "invalid ALTER action attempted on relation \"%s\"", + RelationGetRelationName(rel)); + } /* Permissions checks */ if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId())) @@ -6068,75 +6335,6 @@ ATSimplePermissions(Relation rel, int allowed_targets) RelationGetRelationName(rel)))); } -/* - * ATWrongRelkindError - * - * Throw an error when a relation has been determined to be of the wrong - * type. - */ -static void -ATWrongRelkindError(Relation rel, int allowed_targets) -{ - char *msg; - - switch (allowed_targets) - { - case ATT_TABLE: - msg = _("\"%s\" is not a table"); - break; - case ATT_TABLE | ATT_VIEW: - msg = _("\"%s\" is not a table or view"); - break; - case ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table, view, or foreign table"); - break; - case ATT_TABLE | ATT_VIEW | ATT_MATVIEW | ATT_INDEX: - msg = _("\"%s\" is not a table, view, materialized view, or index"); - break; - case ATT_TABLE | ATT_MATVIEW: - msg = _("\"%s\" is not a table or materialized view"); - break; - case ATT_TABLE | ATT_MATVIEW | ATT_INDEX: - msg = _("\"%s\" is not a table, materialized view, or index"); - break; - case ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX: - msg = _("\"%s\" is not a table, materialized view, index, or partitioned index"); - break; - case ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table"); - break; - case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table, materialized view, or foreign table"); - break; - case ATT_TABLE | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table or foreign table"); - break; - case ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table, composite type, or foreign table"); - break; - case ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a table, materialized view, index, or foreign table"); - break; - case ATT_TABLE | ATT_PARTITIONED_INDEX: - msg = _("\"%s\" is not a table or partitioned index"); - break; - case ATT_VIEW: - msg = _("\"%s\" is not a view"); - break; - case ATT_FOREIGN_TABLE: - msg = _("\"%s\" is not a foreign table"); - break; - default: - /* shouldn't get here, add all necessary cases above */ - msg = _("\"%s\" is of the wrong type"); - break; - } - - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg(msg, RelationGetRelationName(rel)))); -} - /* * ATSimpleRecursion * @@ -6366,8 +6564,7 @@ find_composite_type_dependencies(Oid typeOid, Relation origRelation, * partitioning rule. For now, reject for partitioned rels too. */ if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind) || - rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE || - rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX) + RELKIND_HAS_PARTITIONS(rel->rd_rel->relkind)) { if (origTypeName) ereport(ERROR, @@ -6572,7 +6769,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions((*cmd)->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); if (rel->rd_rel->relispartition && !recursing) ereport(ERROR, @@ -6630,6 +6827,10 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, colDef->colname, RelationGetRelationName(rel)))); table_close(attrdesc, RowExclusiveLock); + + /* Make the child column change visible */ + CommandCounterIncrement(); + return InvalidObjectAddress; } } @@ -6701,7 +6902,10 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, list_make1_oid(rel->rd_rel->reltype), 0); - /* construct new attribute's pg_attribute entry */ + /* + * Construct new attribute's pg_attribute entry. (Variable-length fields + * are handled by InsertPgAttributeTuples().) + */ attribute.attrelid = myrelid; namestrcpy(&(attribute.attname), colDef->colname); attribute.atttypid = typeOid; @@ -6725,8 +6929,6 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, attribute.attinhcount = colDef->inhcount; attribute.attcollation = collOid; - /* attribute.attacl is handled by InsertPgAttributeTuples() */ - ReleaseSysCache(typeTuple); tupdesc = CreateTupleDesc(lengthof(aattr), (FormData_pg_attribute **) &aattr); @@ -7477,7 +7679,7 @@ ATExecColumnDefault(Relation rel, const char *colName, * operation when the user asked for a drop. */ RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, false, - newDefault == NULL ? false : true); + newDefault != NULL); if (newDefault) { @@ -7818,6 +8020,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); @@ -7855,71 +8058,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)); - - 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); - } - } + 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); - 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; } @@ -8319,7 +8495,7 @@ ATExecDropColumn(List **wqueue, Relation rel, const char *colName, /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(AT_DropColumn, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Initialize addrs on the first invocation */ Assert(!recursing || addrs != NULL); @@ -8803,7 +8979,7 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(AT_AddConstraint, rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* * Call AddRelationNewConstraints to do the work, making sure it works on @@ -8941,9 +9117,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Oid pfeqoperators[INDEX_MAX_KEYS]; Oid ppeqoperators[INDEX_MAX_KEYS]; Oid ffeqoperators[INDEX_MAX_KEYS]; + int16 fkdelsetcols[INDEX_MAX_KEYS]; int i; int numfks, - numpks; + numpks, + numfkdelsetcols; Oid indexOid; bool old_check_ok; ObjectAddress address; @@ -9039,11 +9217,19 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, MemSet(pfeqoperators, 0, sizeof(pfeqoperators)); MemSet(ppeqoperators, 0, sizeof(ppeqoperators)); MemSet(ffeqoperators, 0, sizeof(ffeqoperators)); + MemSet(fkdelsetcols, 0, sizeof(fkdelsetcols)); numfks = transformColumnNameList(RelationGetRelid(rel), fkconstraint->fk_attrs, fkattnum, fktypoid); + numfkdelsetcols = transformColumnNameList(RelationGetRelid(rel), + fkconstraint->fk_del_set_cols, + fkdelsetcols, NULL); + validateFkOnDeleteSetColumns(numfks, fkattnum, + numfkdelsetcols, fkdelsetcols, + fkconstraint->fk_del_set_cols); + /* * If the attribute list for the referenced table was omitted, lookup the * definition of the primary key and use it. Otherwise, validate the @@ -9318,7 +9504,10 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, pfeqoperators, ppeqoperators, ffeqoperators, - old_check_ok); + numfkdelsetcols, + fkdelsetcols, + old_check_ok, + InvalidOid, InvalidOid); /* Now handle the referencing side. */ addFkRecurseReferencing(wqueue, fkconstraint, rel, pkrel, @@ -9330,8 +9519,11 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, pfeqoperators, ppeqoperators, ffeqoperators, + numfkdelsetcols, + fkdelsetcols, old_check_ok, - lockmode); + lockmode, + InvalidOid, InvalidOid); /* * Done. Close pk table, but keep lock until we've committed. @@ -9341,6 +9533,41 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, return address; } +/* + * validateFkOnDeleteSetColumns + * Verifies that columns used in ON DELETE SET NULL/DEFAULT (...) + * column lists are valid. + */ +void +validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, + int numfksetcols, const int16 *fksetcolsattnums, + List *fksetcols) +{ + for (int i = 0; i < numfksetcols; i++) + { + int16 setcol_attnum = fksetcolsattnums[i]; + bool seen = false; + + for (int j = 0; j < numfks; j++) + { + if (fkattnums[j] == setcol_attnum) + { + seen = true; + break; + } + } + + if (!seen) + { + char *col = strVal(list_nth(fksetcols, i)); + + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col))); + } + } +} + /* * addFkRecurseReferenced * subroutine for ATAddForeignKeyConstraint; recurses on the referenced @@ -9362,16 +9589,26 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, * numfks is the number of columns in the foreign key * pkattnum is the attnum array of referenced attributes. * fkattnum is the attnum array of referencing attributes. + * numfkdelsetcols is the number of columns in the ON DELETE SET NULL/DEFAULT + * (...) clause + * fkdelsetcols is the attnum array of the columns in the ON DELETE SET + * NULL/DEFAULT clause * pf/pp/ffeqoperators are OID array of operators between columns. * old_check_ok signals that this constraint replaces an existing one that * was already validated (thus this one doesn't need validation). + * parentDelTrigger and parentUpdTrigger, when being recursively called on + * a partition, are the OIDs of the parent action triggers for DELETE and + * UPDATE respectively. */ static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, - Oid *ppeqoperators, Oid *ffeqoperators, bool old_check_ok) + Oid *ppeqoperators, Oid *ffeqoperators, + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, + Oid parentDelTrigger, Oid parentUpdTrigger) { ObjectAddress address; Oid constrOid; @@ -9379,6 +9616,8 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, bool conislocal; int coninhcount; bool connoinherit; + Oid deleteTriggerOid, + updateTriggerOid; /* * Verify relkind for each referenced partition. At the top level, this @@ -9446,6 +9685,8 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, numfks, fkconstraint->fk_upd_action, fkconstraint->fk_del_action, + fkdelsetcols, + numfkdelsetcols, fkconstraint->fk_matchtype, NULL, /* no exclusion constraint */ NULL, /* no check constraint */ @@ -9475,15 +9716,13 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, CommandCounterIncrement(); /* - * If the referenced table is a plain relation, create the action triggers - * that enforce the constraint. + * Create the action triggers that enforce the constraint. */ - if (pkrel->rd_rel->relkind == RELKIND_RELATION) - { - createForeignKeyActionTriggers(rel, RelationGetRelid(pkrel), - fkconstraint, - constrOid, indexOid); - } + createForeignKeyActionTriggers(rel, RelationGetRelid(pkrel), + fkconstraint, + constrOid, indexOid, + parentDelTrigger, parentUpdTrigger, + &deleteTriggerOid, &updateTriggerOid); /* * If the referenced table is partitioned, recurse on ourselves to handle @@ -9527,7 +9766,9 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, partIndexId, constrOid, numfks, mapped_pkattnum, fkattnum, pfeqoperators, ppeqoperators, ffeqoperators, - old_check_ok); + numfkdelsetcols, fkdelsetcols, + old_check_ok, + deleteTriggerOid, updateTriggerOid); /* Done -- clean up (but keep the lock) */ table_close(partRel, NoLock); @@ -9567,17 +9808,29 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, * pkattnum is the attnum array of referenced attributes. * fkattnum is the attnum array of referencing attributes. * pf/pp/ffeqoperators are OID array of operators between columns. + * numfkdelsetcols is the number of columns in the ON DELETE SET NULL/DEFAULT + * (...) clause + * fkdelsetcols is the attnum array of the columns in the ON DELETE SET + * NULL/DEFAULT clause * old_check_ok signals that this constraint replaces an existing one that * was already validated (thus this one doesn't need validation). * lockmode is the lockmode to acquire on partitions when recursing. + * parentInsTrigger and parentUpdTrigger, when being recursively called on + * a partition, are the OIDs of the parent check triggers for INSERT and + * UPDATE respectively. */ static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, - bool old_check_ok, LOCKMODE lockmode) + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, LOCKMODE lockmode, + Oid parentInsTrigger, Oid parentUpdTrigger) { + Oid insertTriggerOid, + updateTriggerOid; + AssertArg(OidIsValid(parentConstr)); if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) @@ -9586,19 +9839,21 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, errmsg("foreign key constraints are not supported on foreign tables"))); /* - * If the referencing relation is a plain table, add the check triggers to - * it and, if necessary, schedule it to be checked in Phase 3. + * Add the check triggers to it and, if necessary, schedule it to be + * checked in Phase 3. * * If the relation is partitioned, drill down to do it to its partitions. */ + createForeignKeyCheckTriggers(RelationGetRelid(rel), + RelationGetRelid(pkrel), + fkconstraint, + parentConstr, + indexOid, + parentInsTrigger, parentUpdTrigger, + &insertTriggerOid, &updateTriggerOid); + if (rel->rd_rel->relkind == RELKIND_RELATION) { - createForeignKeyCheckTriggers(RelationGetRelid(rel), - RelationGetRelid(pkrel), - fkconstraint, - parentConstr, - indexOid); - /* * Tell Phase 3 to check that the constraint is satisfied by existing * rows. We can skip this during table creation, when requested @@ -9627,6 +9882,15 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, else if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { PartitionDesc pd = RelationGetPartitionDesc(rel, true); + Relation trigrel; + + /* + * Triggers of the foreign keys will be manipulated a bunch of times + * in the loop below. To avoid repeatedly opening/closing the trigger + * catalog relation, we open it here and pass it to the subroutines + * called below. + */ + trigrel = table_open(TriggerRelationId, RowExclusiveLock); /* * Recurse to take appropriate action on each partition; either we @@ -9668,7 +9932,10 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, numfks, mapped_fkattnum, pkattnum, - pfeqoperators)) + pfeqoperators, + insertTriggerOid, + updateTriggerOid, + trigrel)) { attached = true; break; @@ -9714,6 +9981,8 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, numfks, fkconstraint->fk_upd_action, fkconstraint->fk_del_action, + fkdelsetcols, + numfkdelsetcols, fkconstraint->fk_matchtype, NULL, NULL, @@ -9746,11 +10015,17 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, pfeqoperators, ppeqoperators, ffeqoperators, + numfkdelsetcols, + fkdelsetcols, old_check_ok, - lockmode); + lockmode, + insertTriggerOid, + updateTriggerOid); table_close(partition, NoLock); } + + table_close(trigrel, RowExclusiveLock); } } @@ -9808,6 +10083,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) ScanKeyData key[2]; HeapTuple tuple; List *clone = NIL; + Relation trigrel; /* * Search for any constraints where this partition's parent is in the @@ -9837,6 +10113,14 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) systable_endscan(scan); table_close(pg_constraint, RowShareLock); + /* + * Triggers of the foreign keys will be manipulated a bunch of times in + * the loop below. To avoid repeatedly opening/closing the trigger + * catalog relation, we open it here and pass it to the subroutines called + * below. + */ + trigrel = table_open(TriggerRelationId, RowExclusiveLock); + attmap = build_attrmap_by_name(RelationGetDescr(partitionRel), RelationGetDescr(parentRel)); foreach(cell, clone) @@ -9853,7 +10137,11 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) Oid conpfeqop[INDEX_MAX_KEYS]; Oid conppeqop[INDEX_MAX_KEYS]; Oid conffeqop[INDEX_MAX_KEYS]; + int numfkdelsetcols; + AttrNumber confdelsetcols[INDEX_MAX_KEYS]; Constraint *fkconstraint; + Oid deleteTriggerOid, + updateTriggerOid; tuple = SearchSysCache1(CONSTROID, constrOid); if (!HeapTupleIsValid(tuple)) @@ -9896,7 +10184,9 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) confkey, conpfeqop, conppeqop, - conffeqop); + conffeqop, + &numfkdelsetcols, + confdelsetcols); for (int i = 0; i < numfks; i++) mapped_confkey[i] = attmap->attnums[confkey[i] - 1]; @@ -9913,6 +10203,7 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) fkconstraint->fk_matchtype = constrForm->confmatchtype; fkconstraint->fk_upd_action = constrForm->confupdtype; fkconstraint->fk_del_action = constrForm->confdeltype; + fkconstraint->fk_del_set_cols = NIL; fkconstraint->old_conpfeqop = NIL; fkconstraint->old_pktable_oid = InvalidOid; fkconstraint->skip_validation = false; @@ -9938,6 +10229,16 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) if (!OidIsValid(partIndexId)) elog(ERROR, "index for %u not found in partition %s", indexOid, RelationGetRelationName(partitionRel)); + + /* + * Get the "action" triggers belonging to the constraint to pass as + * parent OIDs for similar triggers that will be created on the + * partition in addFkRecurseReferenced(). + */ + GetForeignKeyActionTriggers(trigrel, constrOid, + constrForm->confrelid, constrForm->conrelid, + &deleteTriggerOid, &updateTriggerOid); + addFkRecurseReferenced(NULL, fkconstraint, fkRel, @@ -9950,11 +10251,17 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) conpfeqop, conppeqop, conffeqop, - true); + numfkdelsetcols, + confdelsetcols, + true, + deleteTriggerOid, + updateTriggerOid); table_close(fkRel, NoLock); ReleaseSysCache(tuple); } + + table_close(trigrel, RowExclusiveLock); } /* @@ -9977,6 +10284,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) List *partFKs; List *clone = NIL; ListCell *cell; + Relation trigrel; /* obtain a list of constraints that we need to clone */ foreach(cell, RelationGetFKeyList(parentRel)) @@ -9998,6 +10306,14 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("foreign key constraints are not supported on foreign tables"))); + /* + * Triggers of the foreign keys will be manipulated a bunch of times in + * the loop below. To avoid repeatedly opening/closing the trigger + * catalog relation, we open it here and pass it to the subroutines called + * below. + */ + trigrel = table_open(TriggerRelationId, RowExclusiveLock); + /* * The constraint key may differ, if the columns in the partition are * different. This map is used to convert them. @@ -10020,6 +10336,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) Oid conpfeqop[INDEX_MAX_KEYS]; Oid conppeqop[INDEX_MAX_KEYS]; Oid conffeqop[INDEX_MAX_KEYS]; + int numfkdelsetcols; + AttrNumber confdelsetcols[INDEX_MAX_KEYS]; Constraint *fkconstraint; bool attached; Oid indexOid; @@ -10027,6 +10345,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) ObjectAddress address, referenced; ListCell *cell; + Oid insertTriggerOid, + updateTriggerOid; tuple = SearchSysCache1(CONSTROID, parentConstrOid); if (!HeapTupleIsValid(tuple)) @@ -10051,10 +10371,24 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) ShareRowExclusiveLock, NULL); DeconstructFkConstraintRow(tuple, &numfks, conkey, confkey, - conpfeqop, conppeqop, conffeqop); + conpfeqop, conppeqop, conffeqop, + &numfkdelsetcols, confdelsetcols); for (int i = 0; i < numfks; i++) mapped_conkey[i] = attmap->attnums[conkey[i] - 1]; + /* + * Get the "check" triggers belonging to the constraint to pass as + * parent OIDs for similar triggers that will be created on the + * partition in addFkRecurseReferencing(). They are also passed to + * tryAttachPartitionForeignKey() below to simply assign as parents to + * the partition's existing "check" triggers, that is, if the + * corresponding constraints is deemed attachable to the parent + * constraint. + */ + GetForeignKeyCheckTriggers(trigrel, constrForm->oid, + constrForm->confrelid, constrForm->conrelid, + &insertTriggerOid, &updateTriggerOid); + /* * Before creating a new constraint, see whether any existing FKs are * fit for the purpose. If one is, attach the parent constraint to @@ -10073,7 +10407,10 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) numfks, mapped_conkey, confkey, - conpfeqop)) + conpfeqop, + insertTriggerOid, + updateTriggerOid, + trigrel)) { attached = true; table_close(pkrel, NoLock); @@ -10099,6 +10436,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) fkconstraint->fk_matchtype = constrForm->confmatchtype; fkconstraint->fk_upd_action = constrForm->confupdtype; fkconstraint->fk_del_action = constrForm->confdeltype; + fkconstraint->fk_del_set_cols = NIL; fkconstraint->old_conpfeqop = NIL; fkconstraint->old_pktable_oid = InvalidOid; fkconstraint->skip_validation = false; @@ -10146,6 +10484,8 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) numfks, fkconstraint->fk_upd_action, fkconstraint->fk_del_action, + confdelsetcols, + numfkdelsetcols, fkconstraint->fk_matchtype, NULL, NULL, @@ -10181,10 +10521,16 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) conpfeqop, conppeqop, conffeqop, + numfkdelsetcols, + confdelsetcols, false, /* no old check exists */ - AccessExclusiveLock); + AccessExclusiveLock, + insertTriggerOid, + updateTriggerOid); table_close(pkrel, NoLock); } + + table_close(trigrel, RowExclusiveLock); } /* @@ -10205,16 +10551,20 @@ tryAttachPartitionForeignKey(ForeignKeyCacheInfo *fk, int numfks, AttrNumber *mapped_conkey, AttrNumber *confkey, - Oid *conpfeqop) + Oid *conpfeqop, + Oid parentInsTrigger, + Oid parentUpdTrigger, + Relation trigrel) { HeapTuple parentConstrTup; Form_pg_constraint parentConstr; HeapTuple partcontup; Form_pg_constraint partConstr; - Relation trigrel; ScanKeyData key; SysScanDesc scan; HeapTuple trigtup; + Oid insertTriggerOid, + updateTriggerOid; parentConstrTup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(parentConstrOid)); @@ -10275,12 +10625,10 @@ tryAttachPartitionForeignKey(ForeignKeyCacheInfo *fk, * in the partition. We identify them because they have our constraint * OID, as well as being on the referenced rel. */ - trigrel = table_open(TriggerRelationId, RowExclusiveLock); ScanKeyInit(&key, Anum_pg_trigger_tgconstraint, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(fk->conoid)); - scan = systable_beginscan(trigrel, TriggerConstraintIndexId, true, NULL, 1, &key); while ((trigtup = systable_getnext(scan)) != NULL) @@ -10313,13 +10661,148 @@ tryAttachPartitionForeignKey(ForeignKeyCacheInfo *fk, } systable_endscan(scan); - table_close(trigrel, RowExclusiveLock); ConstraintSetParentConstraint(fk->conoid, parentConstrOid, partRelid); + + /* + * Like the constraint, attach partition's "check" triggers to the + * corresponding parent triggers. + */ + GetForeignKeyCheckTriggers(trigrel, + fk->conoid, fk->confrelid, fk->conrelid, + &insertTriggerOid, &updateTriggerOid); + Assert(OidIsValid(insertTriggerOid) && OidIsValid(parentInsTrigger)); + TriggerSetParentTrigger(trigrel, insertTriggerOid, parentInsTrigger, + partRelid); + Assert(OidIsValid(updateTriggerOid) && OidIsValid(parentUpdTrigger)); + TriggerSetParentTrigger(trigrel, updateTriggerOid, parentUpdTrigger, + partRelid); + CommandCounterIncrement(); return true; } +/* + * GetForeignKeyActionTriggers + * Returns delete and update "action" triggers of the given relation + * belonging to the given constraint + */ +static void +GetForeignKeyActionTriggers(Relation trigrel, + Oid conoid, Oid confrelid, Oid conrelid, + Oid *deleteTriggerOid, + Oid *updateTriggerOid) +{ + ScanKeyData key; + SysScanDesc scan; + HeapTuple trigtup; + + *deleteTriggerOid = *updateTriggerOid = InvalidOid; + ScanKeyInit(&key, + Anum_pg_trigger_tgconstraint, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(conoid)); + + scan = systable_beginscan(trigrel, TriggerConstraintIndexId, true, + NULL, 1, &key); + while ((trigtup = systable_getnext(scan)) != NULL) + { + Form_pg_trigger trgform = (Form_pg_trigger) GETSTRUCT(trigtup); + + if (trgform->tgconstrrelid != conrelid) + continue; + if (trgform->tgrelid != confrelid) + continue; + /* Only ever look at "action" triggers on the PK side. */ + if (RI_FKey_trigger_type(trgform->tgfoid) != RI_TRIGGER_PK) + continue; + if (TRIGGER_FOR_DELETE(trgform->tgtype)) + { + Assert(*deleteTriggerOid == InvalidOid); + *deleteTriggerOid = trgform->oid; + } + else if (TRIGGER_FOR_UPDATE(trgform->tgtype)) + { + Assert(*updateTriggerOid == InvalidOid); + *updateTriggerOid = trgform->oid; + } +#ifndef USE_ASSERT_CHECKING + /* In an assert-enabled build, continue looking to find duplicates */ + if (OidIsValid(*deleteTriggerOid) && OidIsValid(*updateTriggerOid)) + break; +#endif + } + + if (!OidIsValid(*deleteTriggerOid)) + elog(ERROR, "could not find ON DELETE action trigger of foreign key constraint %u", + conoid); + if (!OidIsValid(*updateTriggerOid)) + elog(ERROR, "could not find ON UPDATE action trigger of foreign key constraint %u", + conoid); + + systable_endscan(scan); +} + +/* + * GetForeignKeyCheckTriggers + * Returns insert and update "check" triggers of the given relation + * belonging to the given constraint + */ +static void +GetForeignKeyCheckTriggers(Relation trigrel, + Oid conoid, Oid confrelid, Oid conrelid, + Oid *insertTriggerOid, + Oid *updateTriggerOid) +{ + ScanKeyData key; + SysScanDesc scan; + HeapTuple trigtup; + + *insertTriggerOid = *updateTriggerOid = InvalidOid; + ScanKeyInit(&key, + Anum_pg_trigger_tgconstraint, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(conoid)); + + scan = systable_beginscan(trigrel, TriggerConstraintIndexId, true, + NULL, 1, &key); + while ((trigtup = systable_getnext(scan)) != NULL) + { + Form_pg_trigger trgform = (Form_pg_trigger) GETSTRUCT(trigtup); + + if (trgform->tgconstrrelid != confrelid) + continue; + if (trgform->tgrelid != conrelid) + continue; + /* Only ever look at "check" triggers on the FK side. */ + if (RI_FKey_trigger_type(trgform->tgfoid) != RI_TRIGGER_FK) + continue; + if (TRIGGER_FOR_INSERT(trgform->tgtype)) + { + Assert(*insertTriggerOid == InvalidOid); + *insertTriggerOid = trgform->oid; + } + else if (TRIGGER_FOR_UPDATE(trgform->tgtype)) + { + Assert(*updateTriggerOid == InvalidOid); + *updateTriggerOid = trgform->oid; + } +#ifndef USE_ASSERT_CHECKING + /* In an assert-enabled build, continue looking to find duplicates. */ + if (OidIsValid(*insertTriggerOid) && OidIsValid(*updateTriggerOid)) + break; +#endif + } + + if (!OidIsValid(*insertTriggerOid)) + elog(ERROR, "could not find ON INSERT check triggers of foreign key constraint %u", + conoid); + if (!OidIsValid(*updateTriggerOid)) + elog(ERROR, "could not find ON UPDATE check triggers of foreign key constraint %u", + conoid); + + systable_endscan(scan); +} /* * ALTER TABLE ALTER CONSTRAINT @@ -10802,7 +11285,7 @@ ATExecValidateConstraint(List **wqueue, Relation rel, char *constrName, /* * transformColumnNameList - transform list of column names * - * Lookup each name and return its attnum and type OID + * Lookup each name and return its attnum and, optionally, type OID * * Note: the name of this function suggests that it's general-purpose, * but actually it's only used to look up names appearing in foreign-key @@ -10840,7 +11323,8 @@ transformColumnNameList(Oid relId, List *colList, errmsg("cannot have more than %d keys in a foreign key", INDEX_MAX_KEYS))); attnums[attnum] = attform->attnum; - atttypids[attnum] = attform->atttypid; + if (atttypids != NULL) + atttypids[attnum] = attform->atttypid; ReleaseSysCache(atttuple); attnum++; } @@ -10952,15 +11436,19 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, /* * transformFkeyCheckAttrs - * - * Make sure that the attributes of a referenced table belong to a unique - * (or primary key) constraint. Return the OID of the index supporting - * the constraint, as well as the opclasses associated with the index - * columns. + * Validate that the 'attnums' columns in the 'pkrel' relation are valid to + * reference as part of a foreign key constraint. + * + * Returns the OID of the unique index supporting the constraint and + * populates the caller-provided 'opclasses' array with the opclasses + * associated with the index columns. + * + * Raises an ERROR on validation failure. */ static Oid transformFkeyCheckAttrs(Relation pkrel, int numattrs, int16 *attnums, - Oid *opclasses) /* output parameter */ + Oid *opclasses) { Oid indexoid = InvalidOid; bool found = false; @@ -11247,10 +11735,19 @@ validateForeignKeyConstraint(char *conname, ExecDropSingleTupleTableSlot(slot); } -static void +/* + * CreateFKCheckTrigger + * Creates the insert (on_insert=true) or update "check" trigger that + * implements a given foreign key + * + * Returns the OID of the so created trigger. + */ +static Oid CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, - Oid constraintOid, Oid indexOid, bool on_insert) + Oid constraintOid, Oid indexOid, Oid parentTrigOid, + bool on_insert) { + ObjectAddress trigAddress; CreateTrigStmt *fk_trigger; /* @@ -11290,23 +11787,32 @@ CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, fk_trigger->initdeferred = fkconstraint->initdeferred; fk_trigger->constrrel = NULL; - (void) CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid, constraintOid, - indexOid, InvalidOid, InvalidOid, NULL, true, false); + trigAddress = CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid, + constraintOid, indexOid, InvalidOid, + parentTrigOid, NULL, true, false); /* Make changes-so-far visible */ CommandCounterIncrement(); + + return trigAddress.objectId; } /* * createForeignKeyActionTriggers * Create the referenced-side "action" triggers that implement a foreign * key. + * + * Returns the OIDs of the so created triggers in *deleteTrigOid and + * *updateTrigOid. */ static void createForeignKeyActionTriggers(Relation rel, Oid refRelOid, Constraint *fkconstraint, - Oid constraintOid, Oid indexOid) + Oid constraintOid, Oid indexOid, + Oid parentDelTrigger, Oid parentUpdTrigger, + Oid *deleteTrigOid, Oid *updateTrigOid) { CreateTrigStmt *fk_trigger; + ObjectAddress trigAddress; /* * Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON @@ -11358,9 +11864,12 @@ createForeignKeyActionTriggers(Relation rel, Oid refRelOid, Constraint *fkconstr break; } - (void) CreateTrigger(fk_trigger, NULL, refRelOid, RelationGetRelid(rel), - constraintOid, - indexOid, InvalidOid, InvalidOid, NULL, true, false); + trigAddress = CreateTrigger(fk_trigger, NULL, refRelOid, + RelationGetRelid(rel), + constraintOid, indexOid, InvalidOid, + parentDelTrigger, NULL, true, false); + if (deleteTrigOid) + *deleteTrigOid = trigAddress.objectId; /* Make changes-so-far visible */ CommandCounterIncrement(); @@ -11415,25 +11924,35 @@ createForeignKeyActionTriggers(Relation rel, Oid refRelOid, Constraint *fkconstr break; } - (void) CreateTrigger(fk_trigger, NULL, refRelOid, RelationGetRelid(rel), - constraintOid, - indexOid, InvalidOid, InvalidOid, NULL, true, false); + trigAddress = CreateTrigger(fk_trigger, NULL, refRelOid, + RelationGetRelid(rel), + constraintOid, indexOid, InvalidOid, + parentUpdTrigger, NULL, true, false); + if (updateTrigOid) + *updateTrigOid = trigAddress.objectId; } /* * createForeignKeyCheckTriggers * Create the referencing-side "check" triggers that implement a foreign * key. + * + * Returns the OIDs of the so created triggers in *insertTrigOid and + * *updateTrigOid. */ static void createForeignKeyCheckTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, - Oid indexOid) + Oid indexOid, + Oid parentInsTrigger, Oid parentUpdTrigger, + Oid *insertTrigOid, Oid *updateTrigOid) { - CreateFKCheckTrigger(myRelOid, refRelOid, fkconstraint, constraintOid, - indexOid, true); - CreateFKCheckTrigger(myRelOid, refRelOid, fkconstraint, constraintOid, - indexOid, false); + *insertTrigOid = CreateFKCheckTrigger(myRelOid, refRelOid, fkconstraint, + constraintOid, indexOid, + parentInsTrigger, true); + *updateTrigOid = CreateFKCheckTrigger(myRelOid, refRelOid, fkconstraint, + constraintOid, indexOid, + parentUpdTrigger, false); } /* @@ -11460,7 +11979,7 @@ ATExecDropConstraint(Relation rel, const char *constrName, /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) - ATSimplePermissions(rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(AT_DropConstraint, rel, ATT_TABLE | ATT_FOREIGN_TABLE); conrel = table_open(ConstraintRelationId, RowExclusiveLock); @@ -12160,10 +12679,6 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, Form_pg_depend foundDep = (Form_pg_depend) GETSTRUCT(depTup); ObjectAddress foundObject; - /* We don't expect any PIN dependencies on columns */ - if (foundDep->deptype == DEPENDENCY_PIN) - elog(ERROR, "cannot alter type of a pinned column"); - foundObject.classId = foundDep->classid; foundObject.objectId = foundDep->objid; foundObject.objectSubId = foundDep->objsubid; @@ -12188,21 +12703,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... */ @@ -12265,13 +12765,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: @@ -12309,7 +12835,9 @@ 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: case OCLASS_SUBSCRIPTION: case OCLASS_TRANSFORM: @@ -12333,9 +12861,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, @@ -12362,18 +12889,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)); @@ -12489,7 +13011,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(); /* @@ -12846,7 +13386,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); @@ -12926,7 +13466,7 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, foreach(lcmd, stmt->cmds) { - AlterTableCmd *cmd = castNode(AlterTableCmd, lfirst(lcmd)); + AlterTableCmd *cmd = lfirst_node(AlterTableCmd, lcmd); if (cmd->subtype == AT_AddIndex) { @@ -13378,8 +13918,9 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock default: ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, sequence, or foreign table", - NameStr(tuple_class->relname)))); + errmsg("cannot change owner of relation \"%s\"", + NameStr(tuple_class->relname)), + errdetail_relkind_not_supported(tuple_class->relkind))); } /* @@ -13669,7 +14210,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); @@ -13692,6 +14233,28 @@ ATExecDropCluster(Relation rel, LOCKMODE lockmode) mark_index_clustered(rel, InvalidOid, false); } +/* + * Preparation phase for SET ACCESS METHOD + * + * Check that access method exists. If it is the same as the table's current + * access method, it is a no-op. Otherwise, a table rewrite is necessary. + */ +static void +ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname) +{ + Oid amoid; + + /* Check that the table access method exists */ + amoid = get_table_am_oid(amname, false); + + if (rel->rd_rel->relam == amoid) + return; + + /* Save info for Phase 3 to do the real work */ + tab->rewrite |= AT_REWRITE_ACCESS_METHOD; + tab->newAccessMethod = amoid; +} + /* * ALTER TABLE SET TABLESPACE */ @@ -13794,8 +14357,9 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, default: ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, index, or TOAST table", - RelationGetRelationName(rel)))); + errmsg("cannot set options for relation \"%s\"", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); break; } @@ -13980,9 +14544,7 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode) } else { - Assert(rel->rd_rel->relkind == RELKIND_RELATION || - rel->rd_rel->relkind == RELKIND_MATVIEW || - rel->rd_rel->relkind == RELKIND_TOASTVALUE); + Assert(RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind)); table_relation_copy_data(rel, &newrnode); } @@ -14245,7 +14807,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, @@ -14287,8 +14849,9 @@ ATExecEnableDisableTrigger(Relation rel, const char *trigname, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode) { - EnableDisableTriggerNew(rel, trigname, fires_when, skip_system, recurse, - lockmode); + EnableDisableTriggerNew2(rel, trigname, InvalidOid, + fires_when, skip_system, recurse, + lockmode); } /* @@ -14350,7 +14913,7 @@ ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode) * Must be owner of both parent and child -- child was checked by * ATSimplePermissions call in ATPrepCmd */ - ATSimplePermissions(parent_rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(AT_AddInherit, parent_rel, ATT_TABLE | ATT_FOREIGN_TABLE); /* Permanent rels cannot inherit from temporary ones */ if (parent_rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP && @@ -15305,7 +15868,7 @@ ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode) errmsg("table \"%s\" has different type for column \"%s\"", RelationGetRelationName(rel), type_attname))); } - DecrTupleDescRefCount(typeTupleDesc); + ReleaseTupleDesc(typeTupleDesc); /* Any remaining columns at the end of the table had better be dropped. */ for (; table_attno <= tableTupleDesc->natts; table_attno++) @@ -15471,6 +16034,7 @@ relation_mark_replica_identity(Relation rel, char ri_type, Oid indexOid, CatalogTupleUpdate(pg_index, &pg_index_tuple->t_self, pg_index_tuple); InvokeObjectPostAlterHookArg(IndexRelationId, thisIndexOid, 0, InvalidOid, is_internal); + /* * Invalidate the relcache for the table, so that after we commit * all sessions will refresh the table's replica identity index @@ -15518,7 +16082,6 @@ ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode else elog(ERROR, "unexpected identity type %u", stmt->identity_type); - /* Check that the index exists */ indexOid = get_relname_relid(stmt->name, rel->rd_rel->relnamespace); if (!OidIsValid(indexOid)) @@ -16470,11 +17033,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, @@ -16671,17 +17234,27 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, * Don't allow ALTER TABLE .. SET SCHEMA on relations that can't be moved * to a different schema, such as indexes and TOAST tables. */ - if (IsA(stmt, AlterObjectSchemaStmt) && - relkind != RELKIND_RELATION && - relkind != RELKIND_VIEW && - relkind != RELKIND_MATVIEW && - relkind != RELKIND_SEQUENCE && - relkind != RELKIND_FOREIGN_TABLE && - relkind != RELKIND_PARTITIONED_TABLE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, sequence, or foreign table", - rv->relname))); + if (IsA(stmt, AlterObjectSchemaStmt)) + { + if (relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change schema of index \"%s\"", + rv->relname), + errhint("Change the schema of the table instead."))); + else if (relkind == RELKIND_COMPOSITE_TYPE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change schema of composite type \"%s\"", + rv->relname), + errhint("Use ALTER TYPE instead."))); + else if (relkind == RELKIND_TOASTVALUE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot change schema of TOAST table \"%s\"", + rv->relname), + errhint("Change the schema of the table instead."))); + } ReleaseSysCache(tuple); } @@ -16737,7 +17310,7 @@ transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy) /* take care of any partition expressions */ foreach(l, partspec->partParams) { - PartitionElem *pelem = castNode(PartitionElem, lfirst(l)); + PartitionElem *pelem = lfirst_node(PartitionElem, l); if (pelem->expr) { @@ -16774,7 +17347,7 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu attn = 0; foreach(lc, partParams) { - PartitionElem *pelem = castNode(PartitionElem, lfirst(lc)); + PartitionElem *pelem = lfirst_node(PartitionElem, lc); Oid atttype; Oid attcollation; @@ -16863,30 +17436,6 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu partattrs[attn] = 0; /* marks the column as expression */ *partexprs = lappend(*partexprs, expr); - /* - * Try to simplify the expression before checking for - * mutability. The main practical value of doing it in this - * order is that an inline-able SQL-language function will be - * accepted if its expansion is immutable, whether or not the - * function itself is marked immutable. - * - * Note that expression_planner does not change the passed in - * expression destructively and we have already saved the - * expression to be stored into the catalog above. - */ - expr = (Node *) expression_planner((Expr *) expr); - - /* - * Partition expression cannot contain mutable functions, - * because a given row must always map to the same partition - * as long as there is no change in the partition boundary - * structure. - */ - if (contain_mutable_functions(expr)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("functions in partition key expression must be marked IMMUTABLE"))); - /* * transformPartitionSpec() should have already rejected * subqueries, aggregates, window functions, and SRFs, based @@ -16928,6 +17477,32 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu parser_errposition(pstate, pelem->location))); } + /* + * Preprocess the expression before checking for mutability. + * This is essential for the reasons described in + * contain_mutable_functions_after_planning. However, we call + * expression_planner for ourselves rather than using that + * function, because if constant-folding reduces the + * expression to a constant, we'd like to know that so we can + * complain below. + * + * Like contain_mutable_functions_after_planning, assume that + * expression_planner won't scribble on its input, so this + * won't affect the partexprs entry we saved above. + */ + expr = (Node *) expression_planner((Expr *) expr); + + /* + * Partition expressions cannot contain mutable functions, + * because a given row must always map to the same partition + * as long as there is no change in the partition boundary + * structure. + */ + if (contain_mutable_functions(expr)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("functions in partition key expression must be marked IMMUTABLE"))); + /* * While it is not exactly *wrong* for a partition expression * to be a constant, it seems better to reject such keys. @@ -16998,7 +17573,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 @@ -17243,7 +17817,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, * Must be owner of both parent and source table -- parent was checked by * ATSimplePermissions call in ATPrepCmd */ - ATSimplePermissions(attachrel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimplePermissions(AT_AttachPartition, attachrel, ATT_TABLE | ATT_FOREIGN_TABLE); /* A partition can only have one parent */ if (attachrel->rd_rel->relispartition) @@ -17379,7 +17953,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("trigger \"%s\" prevents table \"%s\" from becoming a partition", trigger_name, RelationGetRelationName(attachrel)), - errdetail("ROW triggers with transition tables are not supported on partitions"))); + errdetail("ROW triggers with transition tables are not supported on partitions."))); /* * Check that the new partition's bound is valid and does not overlap any @@ -17412,7 +17986,7 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, * If the parent itself is a partition, make sure to include its * constraint as well. */ - partBoundConstraint = get_qual_from_partbound(attachrel, rel, cmd->bound); + partBoundConstraint = get_qual_from_partbound(rel, cmd->bound); partConstraint = list_concat(partBoundConstraint, RelationGetPartitionQual(rel)); @@ -17481,12 +18055,12 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, /* * If the partition we just attached is partitioned itself, invalidate * relcache for all descendent partitions too to ensure that their - * rd_partcheck expression trees are rebuilt; partitions already locked - * at the beginning of this function. + * rd_partcheck expression trees are rebuilt; partitions already locked at + * the beginning of this function. */ if (attachrel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - ListCell *l; + ListCell *l; foreach(l, attachrel_children) { @@ -17721,19 +18295,10 @@ CloneRowTriggersToPartition(Relation parent, Relation partition) continue; /* - * Internal triggers require careful examination. Ideally, we don't - * clone them. However, if our parent is itself a partition, there - * might be internal triggers that must not be skipped; for example, - * triggers on our parent that are in turn clones from its parent (our - * grandparent) are marked internal, yet they are to be cloned. - * - * Note we dare not verify that the other trigger belongs to an - * ancestor relation of our parent, because that creates deadlock - * opportunities. + * Don't clone internal triggers, because the constraint cloning code + * will. */ - if (trigForm->tgisinternal && - (!parent->rd_rel->relispartition || - !OidIsValid(trigForm->tgparentid))) + if (trigForm->tgisinternal) continue; /* @@ -18035,6 +18600,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, new_repl[Natts_pg_class]; HeapTuple tuple, newtuple; + Relation trigrel = NULL; if (concurrent) { @@ -18053,12 +18619,16 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, * additional action triggers. */ fks = copyObject(RelationGetFKeyList(partRel)); + if (fks != NIL) + trigrel = table_open(TriggerRelationId, RowExclusiveLock); foreach(cell, fks) { ForeignKeyCacheInfo *fk = lfirst(cell); HeapTuple contup; Form_pg_constraint conform; Constraint *fkconstraint; + Oid insertTriggerOid, + updateTriggerOid; contup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(fk->conoid)); if (!HeapTupleIsValid(contup)) @@ -18076,6 +18646,20 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, /* unset conparentid and adjust conislocal, coninhcount, etc. */ ConstraintSetParentConstraint(fk->conoid, InvalidOid, InvalidOid); + /* + * Also, look up the partition's "check" triggers corresponding to the + * constraint being detached and detach them from the parent triggers. + */ + GetForeignKeyCheckTriggers(trigrel, + fk->conoid, fk->confrelid, fk->conrelid, + &insertTriggerOid, &updateTriggerOid); + Assert(OidIsValid(insertTriggerOid)); + TriggerSetParentTrigger(trigrel, insertTriggerOid, InvalidOid, + RelationGetRelid(partRel)); + Assert(OidIsValid(updateTriggerOid)); + TriggerSetParentTrigger(trigrel, updateTriggerOid, InvalidOid, + RelationGetRelid(partRel)); + /* * Make the action triggers on the referenced relation. When this was * a partition the action triggers pointed to the parent rel (they @@ -18093,6 +18677,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, fkconstraint->fk_matchtype = conform->confmatchtype; fkconstraint->fk_upd_action = conform->confupdtype; fkconstraint->fk_del_action = conform->confdeltype; + fkconstraint->fk_del_set_cols = NIL; fkconstraint->old_conpfeqop = NIL; fkconstraint->old_pktable_oid = InvalidOid; fkconstraint->skip_validation = false; @@ -18100,11 +18685,15 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, createForeignKeyActionTriggers(partRel, conform->confrelid, fkconstraint, fk->conoid, - conform->conindid); + conform->conindid, + InvalidOid, InvalidOid, + NULL, NULL); ReleaseSysCache(contup); } list_free_deep(fks); + if (trigrel) + table_close(trigrel, RowExclusiveLock); /* * Any sub-constraints that are in the referenced-side of a larger @@ -18202,13 +18791,13 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, /* * If the partition we just detached is partitioned itself, invalidate * relcache for all descendent partitions too to ensure that their - * rd_partcheck expression trees are rebuilt; must lock partitions - * before doing so, using the same lockmode as what partRel has been - * locked with by the caller. + * rd_partcheck expression trees are rebuilt; must lock partitions before + * doing so, using the same lockmode as what partRel has been locked with + * by the caller. */ if (partRel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - List *children; + List *children; children = find_all_inheritors(RelationGetRelid(partRel), AccessExclusiveLock, NULL); @@ -18329,6 +18918,14 @@ DropClonedTriggersFromPartition(Oid partitionId) if (!OidIsValid(pg_trigger->tgparentid)) continue; + /* + * Ignore internal triggers that are implementation objects of foreign + * keys, because these will be detached when the foreign keys + * themselves are. + */ + if (OidIsValid(pg_trigger->tgconstrrelid)) + continue; + /* * This is ugly, but necessary: remove the dependency markings on the * trigger so that it can be removed. diff --git a/third_party/spanner_pg/src/backend/commands/tablespace.c b/third_party/spanner_pg/src/backend/commands/tablespace.c index edd1ac03..9bdfef97 100644 --- a/third_party/spanner_pg/src/backend/commands/tablespace.c +++ b/third_party/spanner_pg/src/backend/commands/tablespace.c @@ -35,7 +35,7 @@ * and munge the system catalogs of the new database. * * - * 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 * * @@ -56,8 +56,9 @@ #include "access/sysattr.h" #include "access/tableam.h" #include "access/xact.h" -#include "access/xlog.h" #include "access/xloginsert.h" +#include "access/xlogutils.h" +#include "catalog/binary_upgrade.h" #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" @@ -89,6 +90,7 @@ char *default_tablespace = NULL; char *temp_tablespaces = NULL; bool allow_in_place_tablespaces = false; +Oid binary_upgrade_next_pg_tablespace_oid = InvalidOid; static void create_tablespace_directories(const char *location, const Oid tablespaceoid); @@ -222,7 +224,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) Datum newOptions; bool in_place; - /* Must be super user */ + /* Must be superuser */ if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), @@ -318,8 +320,20 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) MemSet(nulls, false, sizeof(nulls)); - tablespaceoid = GetNewOidWithIndex(rel, TablespaceOidIndexId, - Anum_pg_tablespace_oid); + if (IsBinaryUpgrade) + { + /* Use binary-upgrade override for tablespace oid */ + if (!OidIsValid(binary_upgrade_next_pg_tablespace_oid)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pg_tablespace OID value not set when in binary upgrade mode"))); + + tablespaceoid = binary_upgrade_next_pg_tablespace_oid; + binary_upgrade_next_pg_tablespace_oid = InvalidOid; + } + else + tablespaceoid = GetNewOidWithIndex(rel, TablespaceOidIndexId, + Anum_pg_tablespace_oid); values[Anum_pg_tablespace_oid - 1] = ObjectIdGetDatum(tablespaceoid); values[Anum_pg_tablespace_spcname - 1] = DirectFunctionCall1(namein, CStringGetDatum(stmt->tablespacename)); @@ -432,7 +446,6 @@ DropTableSpace(DropTableSpaceStmt *stmt) ereport(NOTICE, (errmsg("tablespace \"%s\" does not exist, skipping", tablespacename))); - /* XXX I assume I need one or both of these next two calls */ table_endscan(scandesc); table_close(rel, NoLock); } @@ -448,8 +461,7 @@ DropTableSpace(DropTableSpaceStmt *stmt) tablespacename); /* Disallow drop of the standard tablespaces, even by superuser */ - if (tablespaceoid == GLOBALTABLESPACE_OID || - tablespaceoid == DEFAULTTABLESPACE_OID) + if (IsPinnedObject(TableSpaceRelationId, tablespaceoid)) aclcheck_error(ACLCHECK_NO_PRIV, OBJECT_TABLESPACE, tablespacename); @@ -503,15 +515,23 @@ DropTableSpace(DropTableSpaceStmt *stmt) * but we can't tell them apart from important data files that we * mustn't delete. So instead, we force a checkpoint which will clean * out any lingering files, and try again. - * - * XXX On Windows, an unlinked file persists in the directory listing + */ + RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); + + /* + * On Windows, an unlinked file persists in the directory listing * until no process retains an open handle for the file. The DDL * commands that schedule files for unlink send invalidation messages - * directing other PostgreSQL processes to close the files. DROP - * TABLESPACE should not give up on the tablespace becoming empty - * until all relevant invalidation processing is complete. + * directing other PostgreSQL processes to close the files, but + * nothing guarantees they'll be processed in time. So, we'll also + * use a global barrier to ask all backends to close all files, and + * wait until they're finished. */ - RequestCheckpoint(CHECKPOINT_IMMEDIATE | CHECKPOINT_FORCE | CHECKPOINT_WAIT); + LWLockRelease(TablespaceCreateLock); + WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); + LWLockAcquire(TablespaceCreateLock, LW_EXCLUSIVE); + + /* And now try again. */ if (!destroy_tablespace_directories(tablespaceoid, false)) { /* Still not empty, the files must be important then */ @@ -1532,6 +1552,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 diff --git a/third_party/spanner_pg/src/backend/commands/trigger.c b/third_party/spanner_pg/src/backend/commands/trigger.c index 4076602a..7273f296 100644 --- a/third_party/spanner_pg/src/backend/commands/trigger.c +++ b/third_party/spanner_pg/src/backend/commands/trigger.c @@ -3,7 +3,7 @@ * trigger.c * PostgreSQL TRIGGERs support code. * - * 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 * * IDENTIFICATION @@ -72,6 +72,12 @@ int SessionReplicationRole = SESSION_REPLICATION_ROLE_ORIGIN; static int MyTriggerDepth = 0; /* Local function prototypes */ +static void renametrig_internal(Relation tgrel, Relation targetrel, + HeapTuple trigtup, const char *newname, + const char *expected_name); +static void renametrig_partition(Relation tgrel, Oid partitionId, + Oid parentTriggerOid, const char *newname, + const char *expected_name); static void SetTriggerFlags(TriggerDesc *trigdesc, Trigger *trigger); static bool GetTupleForTrigger(EState *estate, EPQState *epqstate, @@ -79,7 +85,9 @@ static bool GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, - TupleTableSlot **newSlot); + TupleTableSlot **epqslot, + TM_Result *tmresultp, + TM_FailureData *tmfdp); static bool TriggerEnabled(EState *estate, ResultRelInfo *relinfo, Trigger *trigger, TriggerEvent event, Bitmapset *modifiedCols, @@ -90,10 +98,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); @@ -127,8 +138,10 @@ static bool before_stmt_triggers_fired(Oid relid, CmdType cmdType); * given, stmt->funcname is ignored. * * parentTriggerOid, if nonzero, is a trigger that begets this one; so that - * if that trigger is dropped, this one should be too. (This is passed as - * Invalid by most callers; it's set here when recursing on a partition.) + * if that trigger is dropped, this one should be too. There are two cases + * when a nonzero value is passed for this: 1) when this function recurses to + * create the trigger on partitions, 2) when creating child foreign key + * triggers; see CreateFKCheckTrigger() and createForeignKeyActionTriggers(). * * If whenClause is passed, it is an already-transformed expression for * WHEN. In this case, we ignore any that may come in stmt->whenClause. @@ -197,6 +210,7 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, bool trigger_exists = false; Oid existing_constraint_oid = InvalidOid; bool existing_isInternal = false; + bool existing_isClone = false; if (OidIsValid(relOid)) rel = table_open(relOid, ShareRowExclusiveLock); @@ -305,8 +319,9 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, else ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table or view", - RelationGetRelationName(rel)))); + errmsg("relation \"%s\" cannot have triggers", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); if (!allowSystemTableMods && IsSystemRelation(rel)) ereport(ERROR, @@ -735,6 +750,7 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, trigoid = oldtrigger->oid; existing_constraint_oid = oldtrigger->tgconstraint; existing_isInternal = oldtrigger->tgisinternal; + existing_isClone = OidIsValid(oldtrigger->tgparentid); trigger_exists = true; /* copy the tuple to use in CatalogTupleUpdate() */ tuple = heap_copytuple(tuple); @@ -761,17 +777,16 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, stmt->trigname, RelationGetRelationName(rel)))); /* - * An internal trigger cannot be replaced by a user-defined trigger. - * However, skip this test when in_partition, because then we're - * recursing from a partitioned table and the check was made at the - * parent level. Child triggers will always be marked "internal" (so - * this test does protect us from the user trying to replace a child - * trigger directly). + * An internal trigger or a child trigger (isClone) cannot be replaced + * by a user-defined trigger. However, skip this test when + * in_partition, because then we're recursing from a partitioned table + * and the check was made at the parent level. */ - if (existing_isInternal && !isInternal && !in_partition) + if ((existing_isInternal || existing_isClone) && + !isInternal && !in_partition) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("trigger \"%s\" for relation \"%s\" is an internal trigger", + errmsg("trigger \"%s\" for relation \"%s\" is an internal or a child trigger", stmt->trigname, RelationGetRelationName(rel)))); /* @@ -823,6 +838,8 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, 0, ' ', ' ', + NULL, + 0, ' ', NULL, /* no exclusion */ NULL, /* no check constraint */ @@ -852,11 +869,6 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, /* * Build the new pg_trigger tuple. - * - * When we're creating a trigger in a partition, we mark it as internal, - * even though we don't do the isInternal magic in this function. This - * makes the triggers in partitions identical to the ones in the - * partitioned tables, except that they are marked internal. */ memset(nulls, false, sizeof(nulls)); @@ -868,7 +880,7 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, values[Anum_pg_trigger_tgfoid - 1] = ObjectIdGetDatum(funcoid); values[Anum_pg_trigger_tgtype - 1] = Int16GetDatum(tgtype); values[Anum_pg_trigger_tgenabled - 1] = trigger_fires_when; - values[Anum_pg_trigger_tgisinternal - 1] = BoolGetDatum(isInternal || in_partition); + values[Anum_pg_trigger_tgisinternal - 1] = BoolGetDatum(isInternal); values[Anum_pg_trigger_tgconstrrelid - 1] = ObjectIdGetDatum(constrrelid); values[Anum_pg_trigger_tgconstrindid - 1] = ObjectIdGetDatum(indexOid); values[Anum_pg_trigger_tgconstraint - 1] = ObjectIdGetDatum(constraintOid); @@ -1237,6 +1249,82 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, return myself; } +/* + * TriggerSetParentTrigger + * Set a partition's trigger as child of its parent trigger, + * or remove the linkage if parentTrigId is InvalidOid. + * + * This updates the constraint's pg_trigger row to show it as inherited, and + * adds PARTITION dependencies to prevent the trigger from being deleted + * on its own. Alternatively, reverse that. + */ +void +TriggerSetParentTrigger(Relation trigRel, + Oid childTrigId, + Oid parentTrigId, + Oid childTableId) +{ + SysScanDesc tgscan; + ScanKeyData skey[1]; + Form_pg_trigger trigForm; + HeapTuple tuple, + newtup; + ObjectAddress depender; + ObjectAddress referenced; + + /* + * Find the trigger to delete. + */ + ScanKeyInit(&skey[0], + Anum_pg_trigger_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(childTrigId)); + + tgscan = systable_beginscan(trigRel, TriggerOidIndexId, true, + NULL, 1, skey); + + tuple = systable_getnext(tgscan); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "could not find tuple for trigger %u", childTrigId); + newtup = heap_copytuple(tuple); + trigForm = (Form_pg_trigger) GETSTRUCT(newtup); + if (OidIsValid(parentTrigId)) + { + /* don't allow setting parent for a constraint that already has one */ + if (OidIsValid(trigForm->tgparentid)) + elog(ERROR, "trigger %u already has a parent trigger", + childTrigId); + + trigForm->tgparentid = parentTrigId; + + CatalogTupleUpdate(trigRel, &tuple->t_self, newtup); + + ObjectAddressSet(depender, TriggerRelationId, childTrigId); + + ObjectAddressSet(referenced, TriggerRelationId, parentTrigId); + recordDependencyOn(&depender, &referenced, DEPENDENCY_PARTITION_PRI); + + ObjectAddressSet(referenced, RelationRelationId, childTableId); + recordDependencyOn(&depender, &referenced, DEPENDENCY_PARTITION_SEC); + } + else + { + trigForm->tgparentid = InvalidOid; + + CatalogTupleUpdate(trigRel, &tuple->t_self, newtup); + + deleteDependencyRecordsForClass(TriggerRelationId, childTrigId, + TriggerRelationId, + DEPENDENCY_PARTITION_PRI); + deleteDependencyRecordsForClass(TriggerRelationId, childTrigId, + RelationRelationId, + DEPENDENCY_PARTITION_SEC); + } + + heap_freetuple(newtup); + systable_endscan(tgscan); +} + /* * Guts of trigger deletion. @@ -1281,8 +1369,9 @@ RemoveTriggerById(Oid trigOid) rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, or foreign table", - RelationGetRelationName(rel)))); + errmsg("relation \"%s\" cannot have triggers", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); if (!allowSystemTableMods && IsSystemRelation(rel)) ereport(ERROR, @@ -1387,8 +1476,9 @@ RangeVarCallbackForRenameTrigger(const RangeVar *rv, Oid relid, Oid oldrelid, form->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, or foreign table", - rv->relname))); + errmsg("relation \"%s\" cannot have triggers", + rv->relname), + errdetail_relkind_not_supported(form->relkind))); /* you must own the table to rename one of its triggers */ if (!pg_class_ownercheck(relid, GetUserId())) @@ -1440,38 +1530,16 @@ renametrig(RenameStmt *stmt) targetrel = relation_open(relid, NoLock); /* - * Scan pg_trigger twice for existing triggers on relation. We do this in - * order to ensure a trigger does not exist with newname (The unique index - * on tgrelid/tgname would complain anyway) and to ensure a trigger does - * exist with oldname. - * - * NOTE that this is cool only because we have AccessExclusiveLock on the - * relation, so the trigger set won't be changing underneath us. + * On partitioned tables, this operation recurses to partitions. Lock all + * tables upfront. */ - tgrel = table_open(TriggerRelationId, RowExclusiveLock); + if (targetrel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + (void) find_all_inheritors(relid, AccessExclusiveLock, NULL); - /* - * First pass -- look for name conflict - */ - ScanKeyInit(&key[0], - Anum_pg_trigger_tgrelid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(relid)); - ScanKeyInit(&key[1], - Anum_pg_trigger_tgname, - BTEqualStrategyNumber, F_NAMEEQ, - PointerGetDatum(stmt->newname)); - tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true, - NULL, 2, key); - if (HeapTupleIsValid(tuple = systable_getnext(tgscan))) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("trigger \"%s\" for relation \"%s\" already exists", - stmt->newname, RelationGetRelationName(targetrel)))); - systable_endscan(tgscan); + tgrel = table_open(TriggerRelationId, RowExclusiveLock); /* - * Second pass -- look for trigger existing with oldname and update + * Search for the trigger to modify. */ ScanKeyInit(&key[0], Anum_pg_trigger_tgrelid, @@ -1487,27 +1555,40 @@ renametrig(RenameStmt *stmt) { Form_pg_trigger trigform; - /* - * Update pg_trigger tuple with new tgname. - */ - tuple = heap_copytuple(tuple); /* need a modifiable copy */ trigform = (Form_pg_trigger) GETSTRUCT(tuple); tgoid = trigform->oid; - namestrcpy(&trigform->tgname, - stmt->newname); + /* + * If the trigger descends from a trigger on a parent partitioned + * table, reject the rename. We don't allow a trigger in a partition + * to differ in name from that of its parent: that would lead to an + * inconsistency that pg_dump would not reproduce. + */ + if (OidIsValid(trigform->tgparentid)) + ereport(ERROR, + errmsg("cannot rename trigger \"%s\" on table \"%s\"", + stmt->subname, RelationGetRelationName(targetrel)), + errhint("Rename the trigger on the partitioned table \"%s\" instead.", + get_rel_name(get_partition_parent(relid, false)))); - CatalogTupleUpdate(tgrel, &tuple->t_self, tuple); - InvokeObjectPostAlterHook(TriggerRelationId, - tgoid, 0); + /* Rename the trigger on this relation ... */ + renametrig_internal(tgrel, targetrel, tuple, stmt->newname, + stmt->subname); - /* - * Invalidate relation's relcache entry so that other backends (and - * this one too!) are sent SI message to make them rebuild relcache - * entries. (Ideally this should happen automatically...) - */ - CacheInvalidateRelcache(targetrel); + /* ... and if it is partitioned, recurse to its partitions */ + if (targetrel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + PartitionDesc partdesc = RelationGetPartitionDesc(targetrel, true); + + for (int i = 0; i < partdesc->nparts; i++) + { + Oid partitionId = partdesc->oids[i]; + + renametrig_partition(tgrel, partitionId, trigform->oid, + stmt->newname, stmt->subname); + } + } } else { @@ -1531,6 +1612,137 @@ renametrig(RenameStmt *stmt) return address; } +/* + * Subroutine for renametrig -- perform the actual work of renaming one + * trigger on one table. + * + * If the trigger has a name different from the expected one, raise a + * NOTICE about it. + */ +static void +renametrig_internal(Relation tgrel, Relation targetrel, HeapTuple trigtup, + const char *newname, const char *expected_name) +{ + HeapTuple tuple; + Form_pg_trigger tgform; + ScanKeyData key[2]; + SysScanDesc tgscan; + + /* If the trigger already has the new name, nothing to do. */ + tgform = (Form_pg_trigger) GETSTRUCT(trigtup); + if (strcmp(NameStr(tgform->tgname), newname) == 0) + return; + + /* + * Before actually trying the rename, search for triggers with the same + * name. The update would fail with an ugly message in that case, and it + * is better to throw a nicer error. + */ + ScanKeyInit(&key[0], + Anum_pg_trigger_tgrelid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(RelationGetRelid(targetrel))); + ScanKeyInit(&key[1], + Anum_pg_trigger_tgname, + BTEqualStrategyNumber, F_NAMEEQ, + PointerGetDatum(newname)); + tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true, + NULL, 2, key); + if (HeapTupleIsValid(tuple = systable_getnext(tgscan))) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("trigger \"%s\" for relation \"%s\" already exists", + newname, RelationGetRelationName(targetrel)))); + systable_endscan(tgscan); + + /* + * The target name is free; update the existing pg_trigger tuple with it. + */ + tuple = heap_copytuple(trigtup); /* need a modifiable copy */ + tgform = (Form_pg_trigger) GETSTRUCT(tuple); + + /* + * If the trigger has a name different from what we expected, let the user + * know. (We can proceed anyway, since we must have reached here following + * a tgparentid link.) + */ + if (strcmp(NameStr(tgform->tgname), expected_name) != 0) + ereport(NOTICE, + errmsg("renamed trigger \"%s\" on relation \"%s\"", + NameStr(tgform->tgname), + RelationGetRelationName(targetrel))); + + namestrcpy(&tgform->tgname, newname); + + CatalogTupleUpdate(tgrel, &tuple->t_self, tuple); + + InvokeObjectPostAlterHook(TriggerRelationId, tgform->oid, 0); + + /* + * Invalidate relation's relcache entry so that other backends (and this + * one too!) are sent SI message to make them rebuild relcache entries. + * (Ideally this should happen automatically...) + */ + CacheInvalidateRelcache(targetrel); +} + +/* + * Subroutine for renametrig -- Helper for recursing to partitions when + * renaming triggers on a partitioned table. + */ +static void +renametrig_partition(Relation tgrel, Oid partitionId, Oid parentTriggerOid, + const char *newname, const char *expected_name) +{ + SysScanDesc tgscan; + ScanKeyData key; + HeapTuple tuple; + + /* + * Given a relation and the OID of a trigger on parent relation, find the + * corresponding trigger in the child and rename that trigger to the given + * name. + */ + ScanKeyInit(&key, + Anum_pg_trigger_tgrelid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(partitionId)); + tgscan = systable_beginscan(tgrel, TriggerRelidNameIndexId, true, + NULL, 1, &key); + while (HeapTupleIsValid(tuple = systable_getnext(tgscan))) + { + Form_pg_trigger tgform = (Form_pg_trigger) GETSTRUCT(tuple); + Relation partitionRel; + + if (tgform->tgparentid != parentTriggerOid) + continue; /* not our trigger */ + + partitionRel = table_open(partitionId, NoLock); + + /* Rename the trigger on this partition */ + renametrig_internal(tgrel, partitionRel, tuple, newname, expected_name); + + /* And if this relation is partitioned, recurse to its partitions */ + if (partitionRel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + PartitionDesc partdesc = RelationGetPartitionDesc(partitionRel, + true); + + for (int i = 0; i < partdesc->nparts; i++) + { + Oid partitionId = partdesc->oids[i]; + + renametrig_partition(tgrel, partitionId, tgform->oid, newname, + NameStr(tgform->tgname)); + } + } + table_close(partitionRel, NoLock); + + /* There should be at most one matching tuple */ + break; + } + systable_endscan(tgscan); +} /* * EnableDisableTrigger() @@ -1539,7 +1751,8 @@ renametrig(RenameStmt *stmt) * to change 'tgenabled' field for the specified trigger(s) * * rel: relation to process (caller must hold suitable lock on it) - * tgname: trigger to process, or NULL to scan all triggers + * tgname: name of trigger to process, or NULL to scan all triggers + * tgparent: if not zero, process only triggers with this tgparentid * fires_when: new value for tgenabled field. In addition to generic * enablement/disablement, this also defines when the trigger * should be fired in session replication roles. @@ -1551,9 +1764,9 @@ renametrig(RenameStmt *stmt) * system triggers */ void -EnableDisableTriggerNew(Relation rel, const char *tgname, - char fires_when, bool skip_system, bool recurse, - LOCKMODE lockmode) +EnableDisableTriggerNew2(Relation rel, const char *tgname, Oid tgparent, + char fires_when, bool skip_system, bool recurse, + LOCKMODE lockmode) { Relation tgrel; int nkeys; @@ -1590,7 +1803,10 @@ EnableDisableTriggerNew(Relation rel, const char *tgname, { Form_pg_trigger oldtrig = (Form_pg_trigger) GETSTRUCT(tuple); - if (oldtrig->tgisinternal && !OidIsValid(oldtrig->tgparentid)) + if (OidIsValid(tgparent) && tgparent != oldtrig->tgparentid) + continue; + + if (oldtrig->tgisinternal) { /* system trigger ... ok to process? */ if (skip_system) @@ -1640,9 +1856,10 @@ EnableDisableTriggerNew(Relation rel, const char *tgname, Relation part; part = relation_open(partdesc->oids[i], lockmode); - EnableDisableTriggerNew(part, NameStr(oldtrig->tgname), - fires_when, skip_system, recurse, - lockmode); + /* Match on child triggers' tgparentid, not their name */ + EnableDisableTriggerNew2(part, NULL, oldtrig->oid, + fires_when, skip_system, recurse, + lockmode); table_close(part, NoLock); /* keep lock till commit */ } } @@ -1671,16 +1888,27 @@ EnableDisableTriggerNew(Relation rel, const char *tgname, } /* - * ABI-compatible wrapper for the above. To keep as close possible to the old - * behavior, this never recurses. Do not call this function in new code. + * ABI-compatible wrappers to emulate old versions of the above function. + * Do not call these versions in new code. */ +void +EnableDisableTriggerNew(Relation rel, const char *tgname, + char fires_when, bool skip_system, bool recurse, + LOCKMODE lockmode) +{ + EnableDisableTriggerNew2(rel, tgname, InvalidOid, + fires_when, skip_system, + recurse, lockmode); +} + void EnableDisableTrigger(Relation rel, const char *tgname, char fires_when, bool skip_system, LOCKMODE lockmode) { - EnableDisableTriggerNew(rel, tgname, fires_when, skip_system, - true, lockmode); + EnableDisableTriggerNew2(rel, tgname, InvalidOid, + fires_when, skip_system, + true, lockmode); } @@ -2290,8 +2518,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 @@ -2379,10 +2609,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 @@ -2504,8 +2736,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); } /* @@ -2516,11 +2750,13 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, * back the concurrently updated tuple if any. */ bool -ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, - ResultRelInfo *relinfo, - ItemPointer tupleid, - HeapTuple fdw_trigtuple, - TupleTableSlot **epqslot) +ExecBRDeleteTriggersNew(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot, + TM_Result *tmresult, + TM_FailureData *tmfd) { TupleTableSlot *slot = ExecGetTriggerOldSlot(estate, relinfo); TriggerDesc *trigdesc = relinfo->ri_TrigDesc; @@ -2536,7 +2772,8 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, TupleTableSlot *epqslot_candidate = NULL; if (!GetTupleForTrigger(estate, epqstate, relinfo, tupleid, - LockTupleExclusive, slot, &epqslot_candidate)) + LockTupleExclusive, slot, &epqslot_candidate, + tmresult, tmfd)) return false; /* @@ -2551,7 +2788,6 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, } trigtuple = ExecFetchSlotHeapTuple(slot, true, &should_free); - } else { @@ -2600,11 +2836,32 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, return result; } +/* + * ABI-compatible wrapper to emulate old version of the above function. + * Do not call this version in new code. + */ +bool +ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot) +{ + return ExecBRDeleteTriggersNew(estate, epqstate, relinfo, tupleid, + fdw_trigtuple, epqslot, NULL, NULL); +} + +/* + * 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; @@ -2621,13 +2878,17 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, tupleid, LockTupleExclusive, slot, + NULL, + NULL, NULL); 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); } } @@ -2746,18 +3007,22 @@ 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 -ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, - ResultRelInfo *relinfo, - ItemPointer tupleid, - HeapTuple fdw_trigtuple, - TupleTableSlot *newslot) +ExecBRUpdateTriggersNew(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_Result *tmresult, + TM_FailureData *tmfd) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo); @@ -2780,7 +3045,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, + tmresult, tmfd)) return false; /* cancel the update action */ /* @@ -2791,10 +3057,6 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, * received in newslot. Neither we nor our callers have any further * interest in the passed-in tuple, so it's okay to overwrite newslot * with the newer data. - * - * (Typically, newslot was also generated by ExecGetUpdateNewTuple, so - * that epqslot_clean will be that same slot and the copy step below - * is not needed.) */ if (epqslot_candidate != NULL) { @@ -2803,14 +3065,36 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, epqslot_clean = ExecGetUpdateNewTuple(relinfo, epqslot_candidate, oldslot); - if (newslot != epqslot_clean) + /* + * Typically, the caller's newslot was also generated by + * ExecGetUpdateNewTuple, so that epqslot_clean will be the same + * slot and copying is not needed. But do the right thing if it + * isn't. + */ + if (unlikely(newslot != epqslot_clean)) ExecCopySlot(newslot, epqslot_clean); + + /* + * At this point newslot contains a virtual tuple that may + * reference some fields of oldslot's tuple in some disk buffer. + * If that tuple is in a different page than the original target + * tuple, then our only pin on that buffer is oldslot's, and we're + * about to release it. Hence we'd better materialize newslot to + * ensure it doesn't contain references into an unpinned buffer. + * (We'd materialize it below anyway, but too late for safety.) + */ + ExecMaterializeSlot(newslot); } + /* + * Here we convert oldslot to a materialized slot holding trigtuple. + * Neither slot passed to the triggers will hold any buffer pin. + */ trigtuple = ExecFetchSlotHeapTuple(oldslot, true, &should_free_trig); } else { + /* Put the FDW-supplied tuple into oldslot to unify the cases */ ExecForceStoreHeapTuple(fdw_trigtuple, oldslot, false); trigtuple = fdw_trigtuple; } @@ -2884,13 +3168,42 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, return true; } +/* + * ABI-compatible wrapper to emulate old version of the above function. + * Do not call this version in new code. + */ +bool +ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_FailureData *tmfd) +{ + return ExecBRUpdateTriggersNew(estate, epqstate, relinfo, tupleid, + fdw_trigtuple, newslot, NULL, tmfd); +} + +/* + * 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; @@ -2905,25 +3218,38 @@ 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, + NULL, + NULL, NULL); else if (fdw_trigtuple != NULL) ExecForceStoreHeapTuple(fdw_trigtuple, oldslot, false); 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); } } @@ -3046,8 +3372,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); } @@ -3061,7 +3390,9 @@ GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, - TupleTableSlot **epqslot) + TupleTableSlot **epqslot, + TM_Result *tmresultp, + TM_FailureData *tmfdp) { Relation relation = relinfo->ri_RelationDesc; @@ -3087,6 +3418,12 @@ GetTupleForTrigger(EState *estate, lockflags, &tmfd); + /* Let the caller know about the status of this operation */ + if (tmresultp) + *tmresultp = test; + if (tmfdp) + *tmfdp = tmfd; + switch (test) { case TM_SelfModified: @@ -3111,6 +3448,18 @@ GetTupleForTrigger(EState *estate, case TM_Ok: if (tmfd.traversed) { + /* + * Recheck the tuple using EPQ. For MERGE, we leave this + * to the caller (it must do additional rechecking, and + * might end up executing a different action entirely). + */ + if (estate->es_plannedstmt->commandType == CMD_MERGE) + { + if (tmresultp) + *tmresultp = TM_Updated; + return false; + } + *epqslot = EvalPlanQual(epqstate, relation, relinfo->ri_RangeTableIndex, @@ -3328,9 +3677,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 @@ -3341,6 +3690,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) @@ -3363,16 +3717,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 @@ -3392,27 +3746,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))) @@ -3584,8 +3956,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 */ }; @@ -3594,6 +3981,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, @@ -3604,6 +3993,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); @@ -3949,8 +4348,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), @@ -3964,6 +4371,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, @@ -3971,6 +4380,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}; @@ -4051,12 +4462,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); } @@ -4066,16 +4500,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); } @@ -4097,13 +4555,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; } } @@ -4304,13 +4768,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)); @@ -4335,12 +4803,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); /* @@ -4494,8 +4983,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; @@ -4507,23 +4998,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. */ @@ -4553,10 +5052,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); @@ -4745,12 +5248,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_tuplestore; - table->new_tuplestore = NULL; + 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_ins_tuplestore; + table->new_ins_tuplestore = NULL; if (ts) tuplestore_end(ts); if (table->storeslot) @@ -5028,6 +5539,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_del_tuplestore; + else if (event == TRIGGER_EVENT_UPDATE && update_old_table) + 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_ins_tuplestore; + else if (event == TRIGGER_EVENT_UPDATE && update_new_table) + tuplestore = transition_capture->tcs_private->new_upd_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() * @@ -5520,7 +6117,6 @@ AfterTriggerPendingOnRel(Oid relid) return false; } - /* ---------- * AfterTriggerSaveEvent() * @@ -5542,14 +6138,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; @@ -5580,75 +6197,45 @@ 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, 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) || @@ -5658,6 +6245,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. * @@ -5718,6 +6318,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 { @@ -5742,13 +6355,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]; @@ -5777,13 +6430,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)) @@ -5794,8 +6464,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 */ @@ -5804,7 +6486,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/third_party/spanner_pg/src/backend/commands/tsearchcmds.c b/third_party/spanner_pg/src/backend/commands/tsearchcmds.c index e06fb32b..7aa166ff 100644 --- a/third_party/spanner_pg/src/backend/commands/tsearchcmds.c +++ b/third_party/spanner_pg/src/backend/commands/tsearchcmds.c @@ -4,7 +4,7 @@ * * Routines for tsearch manipulation commands * - * 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 * * @@ -48,6 +48,12 @@ #include "utils/rel.h" #include "utils/syscache.h" +/* Single entry of List returned by getTokenTypes() */ +typedef struct +{ + int num; /* token type number */ + char *name; /* token type name */ +} TSTokenTypeItem; static void MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup, Relation relMap); @@ -1151,22 +1157,45 @@ AlterTSConfiguration(AlterTSConfigurationStmt *stmt) } /* - * Translate a list of token type names to an array of token type numbers + * Check whether a token type name is a member of a TSTokenTypeItem list. + */ +static bool +tstoken_list_member(char *token_name, List *tokens) +{ + ListCell *c; + bool found = false; + + foreach(c, tokens) + { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + + if (strcmp(token_name, ts->name) == 0) + { + found = true; + break; + } + } + + return found; +} + +/* + * Translate a list of token type names to a list of unique TSTokenTypeItem. + * + * Duplicated entries list are removed from tokennames. */ -static int * +static List * getTokenTypes(Oid prsId, List *tokennames) { TSParserCacheEntry *prs = lookup_ts_parser_cache(prsId); LexDescr *list; - int *res, - i, - ntoken; + List *result = NIL; + int ntoken; ListCell *tn; ntoken = list_length(tokennames); if (ntoken == 0) - return NULL; - res = (int *) palloc(sizeof(int) * ntoken); + return NIL; if (!OidIsValid(prs->lextypeOid)) elog(ERROR, "method lextype isn't defined for text search parser %u", @@ -1176,19 +1205,26 @@ getTokenTypes(Oid prsId, List *tokennames) list = (LexDescr *) DatumGetPointer(OidFunctionCall1(prs->lextypeOid, (Datum) 0)); - i = 0; foreach(tn, tokennames) { - Value *val = (Value *) lfirst(tn); + String *val = lfirst_node(String, tn); bool found = false; int j; + /* Skip if this token is already in the result */ + if (tstoken_list_member(strVal(val), result)) + continue; + j = 0; while (list && list[j].lexid) { if (strcmp(strVal(val), list[j].alias) == 0) { - res[i] = list[j].lexid; + TSTokenTypeItem *ts = (TSTokenTypeItem *) palloc0(sizeof(TSTokenTypeItem)); + + ts->num = list[j].lexid; + ts->name = pstrdup(strVal(val)); + result = lappend(result, ts); found = true; break; } @@ -1199,10 +1235,9 @@ getTokenTypes(Oid prsId, List *tokennames) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("token type \"%s\" does not exist", strVal(val)))); - i++; } - return res; + return result; } /* @@ -1220,8 +1255,7 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, int i; int j; Oid prsId; - int *tokens, - ntoken; + List *tokens = NIL; Oid *dictIds; int ndict; ListCell *c; @@ -1231,15 +1265,16 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, prsId = tsform->cfgparser; tokens = getTokenTypes(prsId, stmt->tokentype); - ntoken = list_length(stmt->tokentype); if (stmt->override) { /* * delete maps for tokens if they exist and command was ALTER */ - for (i = 0; i < ntoken; i++) + foreach(c, tokens) { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + ScanKeyInit(&skey[0], Anum_pg_ts_config_map_mapcfg, BTEqualStrategyNumber, F_OIDEQ, @@ -1247,7 +1282,7 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyInit(&skey[1], Anum_pg_ts_config_map_maptokentype, BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(tokens[i])); + Int32GetDatum(ts->num)); scan = systable_beginscan(relMap, TSConfigMapIndexId, true, NULL, 2, skey); @@ -1302,9 +1337,11 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, { bool tokmatch = false; - for (j = 0; j < ntoken; j++) + foreach(c, tokens) { - if (cfgmap->maptokentype == tokens[j]) + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + + if (cfgmap->maptokentype == ts->num) { tokmatch = true; break; @@ -1345,8 +1382,10 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, /* * Insertion of new entries */ - for (i = 0; i < ntoken; i++) + foreach(c, tokens) { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + for (j = 0; j < ndict; j++) { Datum values[Natts_pg_ts_config_map]; @@ -1354,7 +1393,7 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, memset(nulls, false, sizeof(nulls)); values[Anum_pg_ts_config_map_mapcfg - 1] = ObjectIdGetDatum(cfgId); - values[Anum_pg_ts_config_map_maptokentype - 1] = Int32GetDatum(tokens[i]); + values[Anum_pg_ts_config_map_maptokentype - 1] = Int32GetDatum(ts->num); values[Anum_pg_ts_config_map_mapseqno - 1] = Int32GetDatum(j + 1); values[Anum_pg_ts_config_map_mapdict - 1] = ObjectIdGetDatum(dictIds[j]); @@ -1381,9 +1420,8 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyData skey[2]; SysScanDesc scan; HeapTuple maptup; - int i; Oid prsId; - int *tokens; + List *tokens = NIL; ListCell *c; tsform = (Form_pg_ts_config) GETSTRUCT(tup); @@ -1392,10 +1430,9 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, tokens = getTokenTypes(prsId, stmt->tokentype); - i = 0; - foreach(c, stmt->tokentype) + foreach(c, tokens) { - Value *val = (Value *) lfirst(c); + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); bool found = false; ScanKeyInit(&skey[0], @@ -1405,7 +1442,7 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyInit(&skey[1], Anum_pg_ts_config_map_maptokentype, BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(tokens[i])); + Int32GetDatum(ts->num)); scan = systable_beginscan(relMap, TSConfigMapIndexId, true, NULL, 2, skey); @@ -1425,17 +1462,15 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("mapping for token type \"%s\" does not exist", - strVal(val)))); + ts->name))); } else { ereport(NOTICE, (errmsg("mapping for token type \"%s\" does not exist, skipping", - strVal(val)))); + ts->name))); } } - - i++; } EventTriggerCollectAlterTSConfig(stmt, cfgId, NULL, 0); @@ -1742,6 +1777,15 @@ buildDefItem(const char *name, const char *val, bool was_quoted) return makeDefElem(pstrdup(name), (Node *) makeFloat(pstrdup(val)), -1); + + if (strcmp(val, "true") == 0) + return makeDefElem(pstrdup(name), + (Node *) makeBoolean(true), + -1); + if (strcmp(val, "false") == 0) + return makeDefElem(pstrdup(name), + (Node *) makeBoolean(false), + -1); } /* Just make it a string */ return makeDefElem(pstrdup(name), diff --git a/third_party/spanner_pg/src/backend/commands/typecmds.c b/third_party/spanner_pg/src/backend/commands/typecmds.c index a04f464d..4cf0e66c 100644 --- a/third_party/spanner_pg/src/backend/commands/typecmds.c +++ b/third_party/spanner_pg/src/backend/commands/typecmds.c @@ -3,7 +3,7 @@ * typecmds.c * Routines for SQL commands that manipulate types (and domains). * - * 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 * * @@ -332,10 +332,7 @@ DefineType(ParseState *pstate, List *names, List *parameters) continue; } if (*defelp != NULL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); *defelp = defel; } @@ -1338,7 +1335,7 @@ checkEnumOwner(HeapTuple tup) * and users might have queries with that same assumption. */ ObjectAddress -DefineRange(CreateRangeStmt *stmt) +DefineRange(ParseState *pstate, CreateRangeStmt *stmt) { char *typeName; Oid typeNamespace; @@ -1413,50 +1410,38 @@ DefineRange(CreateRangeStmt *stmt) if (strcmp(defel->defname, "subtype") == 0) { if (OidIsValid(rangeSubtype)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); /* we can look up the subtype name immediately */ rangeSubtype = typenameTypeId(NULL, defGetTypeName(defel)); } else if (strcmp(defel->defname, "subtype_opclass") == 0) { if (rangeSubOpclassName != NIL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); rangeSubOpclassName = defGetQualifiedName(defel); } else if (strcmp(defel->defname, "collation") == 0) { if (rangeCollationName != NIL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); rangeCollationName = defGetQualifiedName(defel); } else if (strcmp(defel->defname, "canonical") == 0) { if (rangeCanonicalName != NIL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); rangeCanonicalName = defGetQualifiedName(defel); } else if (strcmp(defel->defname, "subtype_diff") == 0) { if (rangeSubtypeDiffName != NIL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); rangeSubtypeDiffName = defGetQualifiedName(defel); } else if (strcmp(defel->defname, "multirange_type_name") == 0) { if (multirangeTypeName != NULL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); /* we can look up the subtype name immediately */ multirangeNamespace = QualifiedNameGetCreationNamespace(defGetQualifiedName(defel), &multirangeTypeName); @@ -1912,10 +1897,10 @@ makeMultirangeConstructors(const char *name, Oid namespace, allParamTypes = ObjectIdGetDatum(rangeArrayOid); allParameterTypes = construct_array(&allParamTypes, 1, OIDOID, - sizeof(Oid), true, 'i'); + sizeof(Oid), true, TYPALIGN_INT); paramModes = CharGetDatum(FUNC_PARAM_VARIADIC); parameterModes = construct_array(¶mModes, 1, CHAROID, - 1, true, 'c'); + 1, true, TYPALIGN_CHAR); myself = ProcedureCreate(name, /* name: same as multirange type */ namespace, false, /* replace */ @@ -3562,6 +3547,8 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, 0, ' ', ' ', + NULL, + 0, ' ', NULL, /* not an exclusion constraint */ expr, /* Tree form of check constraint */ diff --git a/third_party/spanner_pg/src/backend/commands/user.c b/third_party/spanner_pg/src/backend/commands/user.c index ef1b0ebf..75588f47 100644 --- a/third_party/spanner_pg/src/backend/commands/user.c +++ b/third_party/spanner_pg/src/backend/commands/user.c @@ -3,7 +3,7 @@ * user.c * Commands for manipulating roles (formerly called users). * - * 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 * * src/backend/commands/user.c @@ -27,6 +27,7 @@ #include "catalog/pg_db_role_setting.h" #include "commands/comment.h" #include "commands/dbcommands.h" +#include "commands/defrem.h" #include "commands/seclabel.h" #include "commands/user.h" #include "libpq/crypt.h" @@ -130,10 +131,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) if (strcmp(defel->defname, "password") == 0) { if (dpassword) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dpassword = defel; } else if (strcmp(defel->defname, "sysid") == 0) @@ -144,109 +142,73 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) else if (strcmp(defel->defname, "superuser") == 0) { if (dissuper) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dissuper = defel; } else if (strcmp(defel->defname, "inherit") == 0) { if (dinherit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dinherit = defel; } else if (strcmp(defel->defname, "createrole") == 0) { if (dcreaterole) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dcreaterole = defel; } else if (strcmp(defel->defname, "createdb") == 0) { if (dcreatedb) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dcreatedb = defel; } else if (strcmp(defel->defname, "canlogin") == 0) { if (dcanlogin) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dcanlogin = defel; } else if (strcmp(defel->defname, "isreplication") == 0) { if (disreplication) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); disreplication = defel; } else if (strcmp(defel->defname, "connectionlimit") == 0) { if (dconnlimit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dconnlimit = defel; } else if (strcmp(defel->defname, "addroleto") == 0) { if (daddroleto) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); daddroleto = defel; } else if (strcmp(defel->defname, "rolemembers") == 0) { if (drolemembers) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); drolemembers = defel; } else if (strcmp(defel->defname, "adminmembers") == 0) { if (dadminmembers) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dadminmembers = defel; } else if (strcmp(defel->defname, "validUntil") == 0) { if (dvalidUntil) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dvalidUntil = defel; } else if (strcmp(defel->defname, "bypassrls") == 0) { if (dbypassRLS) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); + errorConflictingDefElem(defel, pstate); dbypassRLS = defel; } else @@ -257,17 +219,17 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) if (dpassword && dpassword->arg) password = strVal(dpassword->arg); if (dissuper) - issuper = intVal(dissuper->arg) != 0; + issuper = boolVal(dissuper->arg); if (dinherit) - inherit = intVal(dinherit->arg) != 0; + inherit = boolVal(dinherit->arg); if (dcreaterole) - createrole = intVal(dcreaterole->arg) != 0; + createrole = boolVal(dcreaterole->arg); if (dcreatedb) - createdb = intVal(dcreatedb->arg) != 0; + createdb = boolVal(dcreatedb->arg); if (dcanlogin) - canlogin = intVal(dcanlogin->arg) != 0; + canlogin = boolVal(dcanlogin->arg); if (disreplication) - isreplication = intVal(disreplication->arg) != 0; + isreplication = boolVal(disreplication->arg); if (dconnlimit) { connlimit = intVal(dconnlimit->arg); @@ -285,7 +247,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) if (dvalidUntil) validUntil = strVal(dvalidUntil->arg); if (dbypassRLS) - bypassrls = intVal(dbypassRLS->arg) != 0; + bypassrls = boolVal(dbypassRLS->arg); /* Check some permissions first */ if (issuper) @@ -395,7 +357,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) if (password) { char *shadow_pass; - char *logdetail; + const char *logdetail = NULL; /* * Don't allow an empty password. Libpq treats an empty password the @@ -530,7 +492,7 @@ CreateRole(ParseState *pstate, CreateRoleStmt *stmt) * "ALTER ROLE role ROLE rolenames", we don't document it. */ Oid -AlterRole(AlterRoleStmt *stmt) +AlterRole(ParseState *pstate, AlterRoleStmt *stmt) { Datum new_record[Natts_pg_authid]; bool new_record_nulls[Natts_pg_authid]; @@ -541,20 +503,12 @@ AlterRole(AlterRoleStmt *stmt) new_tuple; Form_pg_authid authform; ListCell *option; - char *rolename = NULL; + char *rolename; char *password = NULL; /* user password */ - int issuper = -1; /* Make the user a superuser? */ - int inherit = -1; /* Auto inherit privileges? */ - int createrole = -1; /* Can this user create roles? */ - int createdb = -1; /* Can the user create databases? */ - int canlogin = -1; /* Can this user login? */ - int isreplication = -1; /* Is this a replication role? */ int connlimit = -1; /* maximum connections allowed */ - List *rolemembers = NIL; /* roles to be added/removed */ char *validUntil = NULL; /* time the login is valid until */ Datum validUntil_datum; /* same, as timestamptz Datum */ bool validUntil_null; - int bypassrls = -1; DefElem *dpassword = NULL; DefElem *dissuper = NULL; DefElem *dinherit = NULL; @@ -579,90 +533,68 @@ AlterRole(AlterRoleStmt *stmt) if (strcmp(defel->defname, "password") == 0) { if (dpassword) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dpassword = defel; } else if (strcmp(defel->defname, "superuser") == 0) { if (dissuper) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dissuper = defel; } else if (strcmp(defel->defname, "inherit") == 0) { if (dinherit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dinherit = defel; } else if (strcmp(defel->defname, "createrole") == 0) { if (dcreaterole) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dcreaterole = defel; } else if (strcmp(defel->defname, "createdb") == 0) { if (dcreatedb) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dcreatedb = defel; } else if (strcmp(defel->defname, "canlogin") == 0) { if (dcanlogin) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dcanlogin = defel; } else if (strcmp(defel->defname, "isreplication") == 0) { if (disreplication) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); disreplication = defel; } else if (strcmp(defel->defname, "connectionlimit") == 0) { if (dconnlimit) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dconnlimit = defel; } else if (strcmp(defel->defname, "rolemembers") == 0 && stmt->action != 0) { if (drolemembers) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); drolemembers = defel; } else if (strcmp(defel->defname, "validUntil") == 0) { if (dvalidUntil) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dvalidUntil = defel; } else if (strcmp(defel->defname, "bypassrls") == 0) { if (dbypassRLS) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, pstate); dbypassRLS = defel; } else @@ -672,18 +604,6 @@ AlterRole(AlterRoleStmt *stmt) if (dpassword && dpassword->arg) password = strVal(dpassword->arg); - if (dissuper) - issuper = intVal(dissuper->arg); - if (dinherit) - inherit = intVal(dinherit->arg); - if (dcreaterole) - createrole = intVal(dcreaterole->arg); - if (dcreatedb) - createdb = intVal(dcreatedb->arg); - if (dcanlogin) - canlogin = intVal(dcanlogin->arg); - if (disreplication) - isreplication = intVal(disreplication->arg); if (dconnlimit) { connlimit = intVal(dconnlimit->arg); @@ -692,12 +612,8 @@ AlterRole(AlterRoleStmt *stmt) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid connection limit: %d", connlimit))); } - if (drolemembers) - rolemembers = (List *) drolemembers->arg; if (dvalidUntil) validUntil = strVal(dvalidUntil->arg); - if (dbypassRLS) - bypassrls = intVal(dbypassRLS->arg); /* * Scan the pg_authid relation to be certain the user exists. @@ -716,21 +632,21 @@ AlterRole(AlterRoleStmt *stmt) * property. Otherwise, if you don't have createrole, you're only allowed * to change your own password. */ - if (authform->rolsuper || issuper >= 0) + if (authform->rolsuper || dissuper) { if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to alter superuser roles or change superuser attribute"))); } - else if (authform->rolreplication || isreplication >= 0) + else if (authform->rolreplication || disreplication) { if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to alter replication roles or change replication attribute"))); } - else if (bypassrls >= 0) + else if (dbypassRLS) { if (!superuser()) ereport(ERROR, @@ -739,23 +655,16 @@ AlterRole(AlterRoleStmt *stmt) } else if (!have_createrole_privilege()) { - /* We already checked issuper, isreplication, and bypassrls */ - if (!(inherit < 0 && - createrole < 0 && - createdb < 0 && - canlogin < 0 && - !dconnlimit && - !rolemembers && - !validUntil && - dpassword && - roleid == GetUserId())) + /* check the rest */ + if (dinherit || dcreaterole || dcreatedb || dcanlogin || dconnlimit || + drolemembers || dvalidUntil || !dpassword || roleid != GetUserId()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied"))); } /* Convert validuntil to internal form */ - if (validUntil) + if (dvalidUntil) { validUntil_datum = DirectFunctionCall3(timestamptz_in, CStringGetDatum(validUntil), @@ -791,39 +700,39 @@ AlterRole(AlterRoleStmt *stmt) /* * issuper/createrole/etc */ - if (issuper >= 0) + if (dissuper) { - new_record[Anum_pg_authid_rolsuper - 1] = BoolGetDatum(issuper > 0); + new_record[Anum_pg_authid_rolsuper - 1] = BoolGetDatum(boolVal(dissuper->arg)); new_record_repl[Anum_pg_authid_rolsuper - 1] = true; } - if (inherit >= 0) + if (dinherit) { - new_record[Anum_pg_authid_rolinherit - 1] = BoolGetDatum(inherit > 0); + new_record[Anum_pg_authid_rolinherit - 1] = BoolGetDatum(boolVal(dinherit->arg)); new_record_repl[Anum_pg_authid_rolinherit - 1] = true; } - if (createrole >= 0) + if (dcreaterole) { - new_record[Anum_pg_authid_rolcreaterole - 1] = BoolGetDatum(createrole > 0); + new_record[Anum_pg_authid_rolcreaterole - 1] = BoolGetDatum(boolVal(dcreaterole->arg)); new_record_repl[Anum_pg_authid_rolcreaterole - 1] = true; } - if (createdb >= 0) + if (dcreatedb) { - new_record[Anum_pg_authid_rolcreatedb - 1] = BoolGetDatum(createdb > 0); + new_record[Anum_pg_authid_rolcreatedb - 1] = BoolGetDatum(boolVal(dcreatedb->arg)); new_record_repl[Anum_pg_authid_rolcreatedb - 1] = true; } - if (canlogin >= 0) + if (dcanlogin) { - new_record[Anum_pg_authid_rolcanlogin - 1] = BoolGetDatum(canlogin > 0); + new_record[Anum_pg_authid_rolcanlogin - 1] = BoolGetDatum(boolVal(dcanlogin->arg)); new_record_repl[Anum_pg_authid_rolcanlogin - 1] = true; } - if (isreplication >= 0) + if (disreplication) { - new_record[Anum_pg_authid_rolreplication - 1] = BoolGetDatum(isreplication > 0); + new_record[Anum_pg_authid_rolreplication - 1] = BoolGetDatum(boolVal(disreplication->arg)); new_record_repl[Anum_pg_authid_rolreplication - 1] = true; } @@ -837,7 +746,7 @@ AlterRole(AlterRoleStmt *stmt) if (password) { char *shadow_pass; - char *logdetail; + const char *logdetail = NULL; /* Like in CREATE USER, don't allow an empty password. */ if (password[0] == '\0' || @@ -870,9 +779,9 @@ AlterRole(AlterRoleStmt *stmt) new_record_nulls[Anum_pg_authid_rolvaliduntil - 1] = validUntil_null; new_record_repl[Anum_pg_authid_rolvaliduntil - 1] = true; - if (bypassrls >= 0) + if (dbypassRLS) { - new_record[Anum_pg_authid_rolbypassrls - 1] = BoolGetDatum(bypassrls > 0); + new_record[Anum_pg_authid_rolbypassrls - 1] = BoolGetDatum(boolVal(dbypassRLS->arg)); new_record_repl[Anum_pg_authid_rolbypassrls - 1] = true; } @@ -889,17 +798,21 @@ AlterRole(AlterRoleStmt *stmt) * Advance command counter so we can see new record; else tests in * AddRoleMems may fail. */ - if (rolemembers) + if (drolemembers) + { + List *rolemembers = (List *) drolemembers->arg; + CommandCounterIncrement(); - if (stmt->action == +1) /* add members to role */ - AddRoleMems(rolename, roleid, - rolemembers, roleSpecsToIds(rolemembers), - GetUserId(), false); - else if (stmt->action == -1) /* drop members from role */ - DelRoleMems(rolename, roleid, - rolemembers, roleSpecsToIds(rolemembers), - false); + if (stmt->action == +1) /* add members to role */ + AddRoleMems(rolename, roleid, + rolemembers, roleSpecsToIds(rolemembers), + GetUserId(), false); + else if (stmt->action == -1) /* drop members from role */ + DelRoleMems(rolename, roleid, + rolemembers, roleSpecsToIds(rolemembers), + false); + } /* * Close pg_authid, but keep lock till commit. @@ -1514,11 +1427,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/third_party/spanner_pg/src/backend/commands/vacuum.c b/third_party/spanner_pg/src/backend/commands/vacuum.c index 18018a4e..75b0ca95 100644 --- a/third_party/spanner_pg/src/backend/commands/vacuum.c +++ b/third_party/spanner_pg/src/backend/commands/vacuum.c @@ -3,13 +3,16 @@ * vacuum.c * The postgres vacuum cleaner. * - * This file now includes only control and dispatch code for VACUUM and - * ANALYZE commands. Regular VACUUM is implemented in vacuumlazy.c, - * ANALYZE in analyze.c, and VACUUM FULL is a variant of CLUSTER, handled - * in cluster.c. + * This file includes (a) control and dispatch code for VACUUM and ANALYZE + * commands, (b) code to compute various vacuum thresholds, and (c) index + * vacuum code. * + * VACUUM for heap AM is implemented in vacuumlazy.c, parallel vacuum in + * vacuumparallel.c, ANALYZE in analyze.c, and VACUUM FULL is a variant of + * CLUSTER, handled in cluster.c. * - * 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 * * @@ -32,6 +35,7 @@ #include "access/transam.h" #include "access/xact.h" #include "catalog/namespace.h" +#include "catalog/index.h" #include "catalog/pg_database.h" #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" @@ -52,6 +56,7 @@ #include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/memutils.h" +#include "utils/pg_rusage.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -90,6 +95,8 @@ static void vac_truncate_clog(TransactionId frozenXID, static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params); static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); +static bool vac_tid_reaped(ItemPointer itemptr, void *state); +static int vac_cmp_itemptr(const void *left, const void *right); /* * Primary entry point for manual VACUUM and ANALYZE commands @@ -262,7 +269,7 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* user-invoked vacuum is never "for wraparound" */ params.is_wraparound = false; - /* user-invoked vacuum never uses this parameter */ + /* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */ params.log_min_duration = -1; /* Now go through the common routine */ @@ -345,13 +352,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 statistics collector, 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. * @@ -937,43 +937,44 @@ get_all_vacuum_rels(int options) * Input parameters are the target relation, applicable freeze age settings. * * The output parameters are: - * - oldestXmin is the cutoff value used to distinguish whether tuples are - * DEAD or RECENTLY_DEAD (see HeapTupleSatisfiesVacuum). - * - freezeLimit is the Xid below which all Xids are replaced by - * FrozenTransactionId during vacuum. - * - xidFullScanLimit (computed from freeze_table_age parameter) - * represents a minimum Xid value; a table whose relfrozenxid is older than - * this will have a full-table vacuum applied to it, to freeze tuples across - * the whole table. Vacuuming a table younger than this value can use a - * partial scan. - * - multiXactCutoff is the value below which all MultiXactIds are removed from - * Xmax. - * - mxactFullScanLimit is a value against which a table's relminmxid value is - * compared to produce a full-table vacuum, as with xidFullScanLimit. + * - oldestXmin is the Xid below which tuples deleted by any xact (that + * committed) should be considered DEAD, not just RECENTLY_DEAD. + * - 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 (at a minimum), and relminmxid up to multiXactCutoff (at a + * minimum). * - * xidFullScanLimit and mxactFullScanLimit can be passed as NULL if caller is - * not interested. + * 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. */ -void +bool vacuum_set_xid_limits(Relation rel, int freeze_min_age, int freeze_table_age, int multixact_freeze_min_age, int multixact_freeze_table_age, TransactionId *oldestXmin, + MultiXactId *oldestMxact, TransactionId *freezeLimit, - TransactionId *xidFullScanLimit, - MultiXactId *multiXactCutoff, - MultiXactId *mxactFullScanLimit) + MultiXactId *multiXactCutoff) { int freezemin; int mxid_freezemin; int effective_multixact_freeze_max_age; TransactionId limit; TransactionId safeLimit; - MultiXactId oldestMxact; MultiXactId mxactLimit; MultiXactId safeMxactLimit; + int freezetable; /* * We can always ignore processes running lazy vacuum. This is because we @@ -1066,9 +1067,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; @@ -1083,72 +1086,68 @@ 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; } *multiXactCutoff = mxactLimit; - if (xidFullScanLimit != NULL) - { - int freezetable; - - Assert(mxactFullScanLimit != NULL); - - /* - * Determine the table freeze age to use: as specified by the caller, - * or vacuum_freeze_table_age, but in any case not more than - * autovacuum_freeze_max_age * 0.95, so that if you have e.g nightly - * VACUUM schedule, the nightly VACUUM gets a chance to freeze tuples - * before anti-wraparound autovacuum is launched. - */ - freezetable = freeze_table_age; - if (freezetable < 0) - freezetable = vacuum_freeze_table_age; - freezetable = Min(freezetable, autovacuum_freeze_max_age * 0.95); - Assert(freezetable >= 0); - - /* - * Compute XID limit causing a full-table vacuum, being careful not to - * generate a "permanent" XID. - */ - limit = ReadNextTransactionId() - freezetable; - if (!TransactionIdIsNormal(limit)) - limit = FirstNormalTransactionId; + /* + * Done setting output parameters; just need to figure out if caller needs + * to do an aggressive VACUUM or not. + * + * Determine the table freeze age to use: as specified by the caller, or + * vacuum_freeze_table_age, but in any case not more than + * autovacuum_freeze_max_age * 0.95, so that if you have e.g nightly + * VACUUM schedule, the nightly VACUUM gets a chance to freeze tuples + * before anti-wraparound autovacuum is launched. + */ + freezetable = freeze_table_age; + if (freezetable < 0) + freezetable = vacuum_freeze_table_age; + freezetable = Min(freezetable, autovacuum_freeze_max_age * 0.95); + Assert(freezetable >= 0); - *xidFullScanLimit = limit; + /* + * Compute XID limit causing an aggressive vacuum, being careful not to + * generate a "permanent" XID + */ + limit = ReadNextTransactionId() - freezetable; + if (!TransactionIdIsNormal(limit)) + limit = FirstNormalTransactionId; + if (TransactionIdPrecedesOrEquals(rel->rd_rel->relfrozenxid, + limit)) + return true; - /* - * Similar to the above, determine the table freeze age to use for - * multixacts: as specified by the caller, or - * vacuum_multixact_freeze_table_age, but in any case not more than - * autovacuum_multixact_freeze_table_age * 0.95, so that if you have - * e.g. nightly VACUUM schedule, the nightly VACUUM gets a chance to - * freeze multixacts before anti-wraparound autovacuum is launched. - */ - freezetable = multixact_freeze_table_age; - if (freezetable < 0) - freezetable = vacuum_multixact_freeze_table_age; - freezetable = Min(freezetable, - effective_multixact_freeze_max_age * 0.95); - Assert(freezetable >= 0); + /* + * Similar to the above, determine the table freeze age to use for + * multixacts: as specified by the caller, or + * vacuum_multixact_freeze_table_age, but in any case not more than + * autovacuum_multixact_freeze_table_age * 0.95, so that if you have e.g. + * nightly VACUUM schedule, the nightly VACUUM gets a chance to freeze + * multixacts before anti-wraparound autovacuum is launched. + */ + freezetable = multixact_freeze_table_age; + if (freezetable < 0) + freezetable = vacuum_multixact_freeze_table_age; + freezetable = Min(freezetable, + effective_multixact_freeze_max_age * 0.95); + Assert(freezetable >= 0); - /* - * Compute MultiXact limit causing a full-table vacuum, being careful - * to generate a valid MultiXact value. - */ - mxactLimit = ReadNextMultiXactId() - freezetable; - if (mxactLimit < FirstMultiXactId) - mxactLimit = FirstMultiXactId; + /* + * Compute MultiXact limit causing an aggressive vacuum, being careful to + * generate a valid MultiXact value + */ + mxactLimit = ReadNextMultiXactId() - freezetable; + if (mxactLimit < FirstMultiXactId) + mxactLimit = FirstMultiXactId; + if (MultiXactIdPrecedesOrEquals(rel->rd_rel->relminmxid, + mxactLimit)) + return true; - *mxactFullScanLimit = mxactLimit; - } - else - { - Assert(mxactFullScanLimit == NULL); - } + return false; } /* @@ -1237,10 +1236,23 @@ vac_estimate_reltuples(Relation relation, return scanned_tuples; /* - * If scanned_pages is zero but total_pages isn't, keep the existing value - * of reltuples. (Note: we might be returning -1 in this case.) + * 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. + * This might be caused by vacuumlazy.c implementation details, such as + * its tendency to always scan the last heap page. Handle that here. + * + * If the relation is _exactly_ the same size according to the existing + * pg_class entry, and only a few of its pages (less than 2%) were + * scanned, keep the existing value of reltuples. Also keep the existing + * value when only a subset of rel's pages <= a single page were scanned. + * + * (Note: we might be returning -1 here.) */ - if (scanned_pages == 0) + if (old_rel_pages == total_pages && + scanned_pages < (double) total_pages * 0.02) + return old_rel_tuples; + if (scanned_pages <= 1) return old_rel_tuples; /* @@ -1309,13 +1321,18 @@ vac_update_relstats(Relation relation, BlockNumber num_all_visible_pages, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, + bool *frozenxid_updated, bool *minmulti_updated, bool in_outer_xact) { Oid relid = RelationGetRelid(relation); Relation rd; HeapTuple ctup; Form_pg_class pgcform; - bool dirty; + bool dirty, + futurexid, + futuremxid; + TransactionId oldfrozenxid; + MultiXactId oldminmulti; rd = table_open(RelationRelationId, RowExclusiveLock); @@ -1375,33 +1392,55 @@ 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". */ - if (TransactionIdIsNormal(frozenxid) && - pgcform->relfrozenxid != frozenxid && - (TransactionIdPrecedes(pgcform->relfrozenxid, frozenxid) || - TransactionIdPrecedes(ReadNextTransactionId(), - pgcform->relfrozenxid))) + oldfrozenxid = pgcform->relfrozenxid; + futurexid = false; + if (frozenxid_updated) + *frozenxid_updated = false; + if (TransactionIdIsNormal(frozenxid) && oldfrozenxid != frozenxid) { - 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 */ - if (MultiXactIdIsValid(minmulti) && - pgcform->relminmxid != minmulti && - (MultiXactIdPrecedes(pgcform->relminmxid, minmulti) || - MultiXactIdPrecedes(ReadNextMultiXactId(), pgcform->relminmxid))) + oldminmulti = pgcform->relminmxid; + futuremxid = false; + if (minmulti_updated) + *minmulti_updated = false; + if (MultiXactIdIsValid(minmulti) && oldminmulti != minmulti) { - 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. */ @@ -1409,6 +1448,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)))); } @@ -2284,3 +2336,130 @@ get_vacoptval_from_boolean(DefElem *def) { return defGetBoolean(def) ? VACOPTVALUE_ENABLED : VACOPTVALUE_DISABLED; } + +/* + * vac_bulkdel_one_index() -- bulk-deletion for index relation. + * + * Returns bulk delete stats derived from input stats + */ +IndexBulkDeleteResult * +vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat, + VacDeadItems *dead_items) +{ + /* Do bulk deletion */ + istat = index_bulk_delete(ivinfo, istat, vac_tid_reaped, + (void *) dead_items); + + ereport(ivinfo->message_level, + (errmsg("scanned index \"%s\" to remove %d row versions", + RelationGetRelationName(ivinfo->index), + dead_items->num_items))); + + return istat; +} + +/* + * vac_cleanup_one_index() -- do post-vacuum cleanup for index relation. + * + * Returns bulk delete stats derived from input stats + */ +IndexBulkDeleteResult * +vac_cleanup_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat) +{ + istat = index_vacuum_cleanup(ivinfo, istat); + + if (istat) + ereport(ivinfo->message_level, + (errmsg("index \"%s\" now contains %.0f row versions in %u pages", + RelationGetRelationName(ivinfo->index), + istat->num_index_tuples, + istat->num_pages), + errdetail("%.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.", + istat->tuples_removed, + istat->pages_newly_deleted, + istat->pages_deleted, istat->pages_free))); + + return istat; +} + +/* + * Returns the total required space for VACUUM's dead_items array given a + * max_items value. + */ +Size +vac_max_items_to_alloc_size(int max_items) +{ + Assert(max_items <= MAXDEADITEMS(MaxAllocSize)); + + return offsetof(VacDeadItems, items) + sizeof(ItemPointerData) * max_items; +} + +/* + * vac_tid_reaped() -- is a particular tid deletable? + * + * This has the right signature to be an IndexBulkDeleteCallback. + * + * Assumes dead_items array is sorted (in ascending TID order). + */ +static bool +vac_tid_reaped(ItemPointer itemptr, void *state) +{ + VacDeadItems *dead_items = (VacDeadItems *) state; + int64 litem, + ritem, + item; + ItemPointer res; + + litem = itemptr_encode(&dead_items->items[0]); + ritem = itemptr_encode(&dead_items->items[dead_items->num_items - 1]); + item = itemptr_encode(itemptr); + + /* + * Doing a simple bound check before bsearch() is useful to avoid the + * extra cost of bsearch(), especially if dead items on the heap are + * concentrated in a certain range. Since this function is called for + * every index tuple, it pays to be really fast. + */ + if (item < litem || item > ritem) + return false; + + res = (ItemPointer) bsearch((void *) itemptr, + (void *) dead_items->items, + dead_items->num_items, + sizeof(ItemPointerData), + vac_cmp_itemptr); + + return (res != NULL); +} + +/* + * Comparator routines for use with qsort() and bsearch(). + */ +static int +vac_cmp_itemptr(const void *left, const void *right) +{ + BlockNumber lblk, + rblk; + OffsetNumber loff, + roff; + + lblk = ItemPointerGetBlockNumber((ItemPointer) left); + rblk = ItemPointerGetBlockNumber((ItemPointer) right); + + if (lblk < rblk) + return -1; + if (lblk > rblk) + return 1; + + loff = ItemPointerGetOffsetNumber((ItemPointer) left); + roff = ItemPointerGetOffsetNumber((ItemPointer) right); + + if (loff < roff) + return -1; + if (loff > roff) + return 1; + + return 0; +} diff --git a/third_party/spanner_pg/src/backend/commands/vacuumparallel.c b/third_party/spanner_pg/src/backend/commands/vacuumparallel.c new file mode 100644 index 00000000..f26d796e --- /dev/null +++ b/third_party/spanner_pg/src/backend/commands/vacuumparallel.c @@ -0,0 +1,1074 @@ +/*------------------------------------------------------------------------- + * + * vacuumparallel.c + * Support routines for parallel vacuum execution. + * + * This file contains routines that are intended to support setting up, using, + * and tearing down a ParallelVacuumState. + * + * In a parallel vacuum, we perform both index bulk deletion and index cleanup + * with parallel worker processes. Individual indexes are processed by one + * vacuum process. ParalleVacuumState contains shared information as well as + * 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 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. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/commands/vacuumparallel.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/amapi.h" +#include "access/table.h" +#include "access/xact.h" +#include "catalog/index.h" +#include "commands/vacuum.h" +#include "optimizer/paths.h" +#include "pgstat.h" +#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 + * we don't need to worry about DSM keys conflicting with plan_node_id we can + * use small integers. + */ +#define PARALLEL_VACUUM_KEY_SHARED 1 +#define PARALLEL_VACUUM_KEY_DEAD_ITEMS 2 +#define PARALLEL_VACUUM_KEY_QUERY_TEXT 3 +#define PARALLEL_VACUUM_KEY_BUFFER_USAGE 4 +#define PARALLEL_VACUUM_KEY_WAL_USAGE 5 +#define PARALLEL_VACUUM_KEY_INDEX_STATS 6 + +/* + * Shared information among parallel workers. So this is allocated in the DSM + * segment. + */ +typedef struct PVShared +{ + /* + * Target table relid and log level (for messages about parallel workers + * launched during VACUUM VERBOSE). These fields are not modified during + * the parallel vacuum. + */ + Oid relid; + int elevel; + + /* + * Fields for both index vacuum and cleanup. + * + * reltuples is the total number of input heap tuples. We set either old + * live tuples in the index vacuum case or the new live tuples in the + * index cleanup case. + * + * estimated_count is true if reltuples is an estimated value. (Note that + * reltuples could be -1 in this case, indicating we have no idea.) + */ + double reltuples; + bool estimated_count; + + /* + * In single process vacuum we could consume more memory during index + * vacuuming or cleanup apart from the memory for heap scanning. In + * parallel vacuum, since individual vacuum workers can consume memory + * equal to maintenance_work_mem, the new maintenance_work_mem for each + * worker is set such that the parallel operation doesn't consume more + * memory than single process vacuum. + */ + int maintenance_work_mem_worker; + + /* + * Shared vacuum cost balance. During parallel vacuum, + * VacuumSharedCostBalance points to this value and it accumulates the + * balance of each parallel vacuum worker. + */ + pg_atomic_uint32 cost_balance; + + /* + * Number of active parallel workers. This is used for computing the + * minimum threshold of the vacuum cost balance before a worker sleeps for + * cost-based delay. + */ + pg_atomic_uint32 active_nworkers; + + /* Counter for vacuuming and cleanup */ + pg_atomic_uint32 idx; +} PVShared; + +/* Status used during parallel index vacuum or cleanup */ +typedef enum PVIndVacStatus +{ + PARALLEL_INDVAC_STATUS_INITIAL = 0, + PARALLEL_INDVAC_STATUS_NEED_BULKDELETE, + PARALLEL_INDVAC_STATUS_NEED_CLEANUP, + PARALLEL_INDVAC_STATUS_COMPLETED +} PVIndVacStatus; + +/* + * Struct for index vacuum statistics of an index that is used for parallel vacuum. + * This includes the status of parallel index vacuum as well as index statistics. + */ +typedef struct PVIndStats +{ + /* + * The following two fields are set by leader process before executing + * parallel index vacuum or parallel index cleanup. These fields are not + * fixed for the entire VACUUM operation. They are only fixed for an + * individual parallel index vacuum and cleanup. + * + * parallel_workers_can_process is true if both leader and worker can + * process the index, otherwise only leader can process it. + */ + PVIndVacStatus status; + bool parallel_workers_can_process; + + /* + * Individual worker or leader stores the result of index vacuum or + * cleanup. + */ + bool istat_updated; /* are the stats updated? */ + IndexBulkDeleteResult istat; +} PVIndStats; + +/* + * Struct for maintaining a parallel vacuum state. typedef appears in vacuum.h. + */ +struct ParallelVacuumState +{ + /* NULL for worker processes */ + ParallelContext *pcxt; + + /* Target indexes */ + Relation *indrels; + int nindexes; + + /* Shared information among parallel vacuum workers */ + PVShared *shared; + + /* + * Shared index statistics among parallel vacuum workers. The array + * element is allocated for every index, even those indexes where parallel + * index vacuuming is unsafe or not worthwhile (e.g., + * will_parallel_vacuum[] is false). During parallel vacuum, + * IndexBulkDeleteResult of each index is kept in DSM and is copied into + * local memory at the end of parallel vacuum. + */ + PVIndStats *indstats; + + /* Shared dead items space among parallel vacuum workers */ + VacDeadItems *dead_items; + + /* Points to buffer usage area in DSM */ + BufferUsage *buffer_usage; + + /* Points to WAL usage area in DSM */ + WalUsage *wal_usage; + + /* + * False if the index is totally unsuitable target for all parallel + * processing. For example, the index could be < + * min_parallel_index_scan_size cutoff. + */ + bool *will_parallel_vacuum; + + /* + * The number of indexes that support parallel index bulk-deletion and + * parallel index cleanup respectively. + */ + int nindexes_parallel_bulkdel; + int nindexes_parallel_cleanup; + int nindexes_parallel_condcleanup; + + /* Buffer access strategy used by leader process */ + BufferAccessStrategy bstrategy; + + /* + * Error reporting state. The error callback is set only for workers + * processes during parallel index vacuum. + */ + char *relnamespace; + char *relname; + char *indname; + PVIndVacStatus status; +}; + +static int parallel_vacuum_compute_workers(Relation *indrels, int nindexes, int nrequested, + bool *will_parallel_vacuum); +static void parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scans, + bool vacuum); +static void parallel_vacuum_process_safe_indexes(ParallelVacuumState *pvs); +static void parallel_vacuum_process_unsafe_indexes(ParallelVacuumState *pvs); +static void parallel_vacuum_process_one_index(ParallelVacuumState *pvs, Relation indrel, + PVIndStats *indstats); +static bool parallel_vacuum_index_is_parallel_safe(Relation indrel, int num_index_scans, + bool vacuum); +static void parallel_vacuum_error_callback(void *arg); + +/* + * Try to enter parallel mode and create a parallel context. Then initialize + * shared memory state. + * + * On success, return parallel vacuum state. Otherwise return NULL. + */ +ParallelVacuumState * +parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, + int nrequested_workers, int max_items, + int elevel, BufferAccessStrategy bstrategy) +{ + ParallelVacuumState *pvs; + ParallelContext *pcxt; + PVShared *shared; + VacDeadItems *dead_items; + PVIndStats *indstats; + BufferUsage *buffer_usage; + WalUsage *wal_usage; + bool *will_parallel_vacuum; + Size est_indstats_len; + Size est_shared_len; + Size est_dead_items_len; + int nindexes_mwm = 0; + int parallel_workers = 0; + int querylen; + + /* + * A parallel vacuum must be requested and there must be indexes on the + * relation + */ + Assert(nrequested_workers >= 0); + Assert(nindexes > 0); + + /* + * Compute the number of parallel vacuum workers to launch + */ + will_parallel_vacuum = (bool *) palloc0(sizeof(bool) * nindexes); + parallel_workers = parallel_vacuum_compute_workers(indrels, nindexes, + nrequested_workers, + will_parallel_vacuum); + if (parallel_workers <= 0) + { + /* Can't perform vacuum in parallel -- return NULL */ + pfree(will_parallel_vacuum); + return NULL; + } + + pvs = (ParallelVacuumState *) palloc0(sizeof(ParallelVacuumState)); + pvs->indrels = indrels; + pvs->nindexes = nindexes; + pvs->will_parallel_vacuum = will_parallel_vacuum; + pvs->bstrategy = bstrategy; + + EnterParallelMode(); + pcxt = CreateParallelContext("postgres", "parallel_vacuum_main", + parallel_workers); + Assert(pcxt->nworkers > 0); + pvs->pcxt = pcxt; + + /* Estimate size for index vacuum stats -- PARALLEL_VACUUM_KEY_INDEX_STATS */ + est_indstats_len = mul_size(sizeof(PVIndStats), nindexes); + shm_toc_estimate_chunk(&pcxt->estimator, est_indstats_len); + shm_toc_estimate_keys(&pcxt->estimator, 1); + + /* Estimate size for shared information -- PARALLEL_VACUUM_KEY_SHARED */ + est_shared_len = sizeof(PVShared); + shm_toc_estimate_chunk(&pcxt->estimator, est_shared_len); + shm_toc_estimate_keys(&pcxt->estimator, 1); + + /* Estimate size for dead_items -- PARALLEL_VACUUM_KEY_DEAD_ITEMS */ + est_dead_items_len = vac_max_items_to_alloc_size(max_items); + shm_toc_estimate_chunk(&pcxt->estimator, est_dead_items_len); + shm_toc_estimate_keys(&pcxt->estimator, 1); + + /* + * Estimate space for BufferUsage and WalUsage -- + * PARALLEL_VACUUM_KEY_BUFFER_USAGE and PARALLEL_VACUUM_KEY_WAL_USAGE. + * + * If there are no extensions loaded that care, we could skip this. We + * have no way of knowing whether anyone's looking at pgBufferUsage or + * pgWalUsage, so do it unconditionally. + */ + shm_toc_estimate_chunk(&pcxt->estimator, + mul_size(sizeof(BufferUsage), pcxt->nworkers)); + shm_toc_estimate_keys(&pcxt->estimator, 1); + shm_toc_estimate_chunk(&pcxt->estimator, + mul_size(sizeof(WalUsage), pcxt->nworkers)); + shm_toc_estimate_keys(&pcxt->estimator, 1); + + /* Finally, estimate PARALLEL_VACUUM_KEY_QUERY_TEXT space */ + if (debug_query_string) + { + querylen = strlen(debug_query_string); + shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1); + shm_toc_estimate_keys(&pcxt->estimator, 1); + } + else + querylen = 0; /* keep compiler quiet */ + + InitializeParallelDSM(pcxt); + + /* Prepare index vacuum stats */ + indstats = (PVIndStats *) shm_toc_allocate(pcxt->toc, est_indstats_len); + MemSet(indstats, 0, est_indstats_len); + for (int i = 0; i < nindexes; i++) + { + Relation indrel = indrels[i]; + uint8 vacoptions = indrel->rd_indam->amparallelvacuumoptions; + + /* + * Cleanup option should be either disabled, always performing in + * parallel or conditionally performing in parallel. + */ + Assert(((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) == 0) || + ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) == 0)); + Assert(vacoptions <= VACUUM_OPTION_MAX_VALID_VALUE); + + if (!will_parallel_vacuum[i]) + continue; + + if (indrel->rd_indam->amusemaintenanceworkmem) + nindexes_mwm++; + + /* + * Remember the number of indexes that support parallel operation for + * each phase. + */ + if ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) != 0) + pvs->nindexes_parallel_bulkdel++; + if ((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) != 0) + pvs->nindexes_parallel_cleanup++; + if ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0) + pvs->nindexes_parallel_condcleanup++; + } + shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_INDEX_STATS, indstats); + pvs->indstats = indstats; + + /* Prepare shared information */ + shared = (PVShared *) shm_toc_allocate(pcxt->toc, est_shared_len); + MemSet(shared, 0, est_shared_len); + shared->relid = RelationGetRelid(rel); + shared->elevel = elevel; + shared->maintenance_work_mem_worker = + (nindexes_mwm > 0) ? + maintenance_work_mem / Min(parallel_workers, nindexes_mwm) : + maintenance_work_mem; + + pg_atomic_init_u32(&(shared->cost_balance), 0); + pg_atomic_init_u32(&(shared->active_nworkers), 0); + pg_atomic_init_u32(&(shared->idx), 0); + + shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_SHARED, shared); + pvs->shared = shared; + + /* Prepare the dead_items space */ + dead_items = (VacDeadItems *) shm_toc_allocate(pcxt->toc, + est_dead_items_len); + dead_items->max_items = max_items; + dead_items->num_items = 0; + MemSet(dead_items->items, 0, sizeof(ItemPointerData) * max_items); + shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_DEAD_ITEMS, dead_items); + pvs->dead_items = dead_items; + + /* + * Allocate space for each worker's BufferUsage and WalUsage; no need to + * initialize + */ + buffer_usage = shm_toc_allocate(pcxt->toc, + mul_size(sizeof(BufferUsage), pcxt->nworkers)); + shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_BUFFER_USAGE, buffer_usage); + pvs->buffer_usage = buffer_usage; + wal_usage = shm_toc_allocate(pcxt->toc, + mul_size(sizeof(WalUsage), pcxt->nworkers)); + shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_WAL_USAGE, wal_usage); + pvs->wal_usage = wal_usage; + + /* Store query string for workers */ + if (debug_query_string) + { + char *sharedquery; + + sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1); + memcpy(sharedquery, debug_query_string, querylen + 1); + sharedquery[querylen] = '\0'; + shm_toc_insert(pcxt->toc, + PARALLEL_VACUUM_KEY_QUERY_TEXT, sharedquery); + } + + /* Success -- return parallel vacuum state */ + return pvs; +} + +/* + * Destroy the parallel context, and end parallel mode. + * + * Since writes are not allowed during parallel mode, copy the + * updated index statistics from DSM into local memory and then later use that + * to update the index statistics. One might think that we can exit from + * parallel mode, update the index statistics and then destroy parallel + * context, but that won't be safe (see ExitParallelMode). + */ +void +parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats) +{ + Assert(!IsParallelWorker()); + + /* Copy the updated statistics */ + for (int i = 0; i < pvs->nindexes; i++) + { + PVIndStats *indstats = &(pvs->indstats[i]); + + if (indstats->istat_updated) + { + istats[i] = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult)); + memcpy(istats[i], &indstats->istat, sizeof(IndexBulkDeleteResult)); + } + else + istats[i] = NULL; + } + + DestroyParallelContext(pvs->pcxt); + ExitParallelMode(); + + pfree(pvs->will_parallel_vacuum); + pfree(pvs); +} + +/* Returns the dead items space */ +VacDeadItems * +parallel_vacuum_get_dead_items(ParallelVacuumState *pvs) +{ + return pvs->dead_items; +} + +/* + * Do parallel index bulk-deletion with parallel workers. + */ +void +parallel_vacuum_bulkdel_all_indexes(ParallelVacuumState *pvs, long num_table_tuples, + int num_index_scans) +{ + Assert(!IsParallelWorker()); + + /* + * We can only provide an approximate value of num_heap_tuples, at least + * for now. + */ + pvs->shared->reltuples = num_table_tuples; + pvs->shared->estimated_count = true; + + parallel_vacuum_process_all_indexes(pvs, num_index_scans, true); +} + +/* + * Do parallel index cleanup with parallel workers. + */ +void +parallel_vacuum_cleanup_all_indexes(ParallelVacuumState *pvs, long num_table_tuples, + int num_index_scans, bool estimated_count) +{ + Assert(!IsParallelWorker()); + + /* + * We can provide a better estimate of total number of surviving tuples + * (we assume indexes are more interested in that than in the number of + * nominally live tuples). + */ + pvs->shared->reltuples = num_table_tuples; + pvs->shared->estimated_count = estimated_count; + + parallel_vacuum_process_all_indexes(pvs, num_index_scans, false); +} + +/* + * Compute the number of parallel worker processes to request. Both index + * vacuum and index cleanup can be executed with parallel workers. + * The index is eligible for parallel vacuum iff its size is greater than + * min_parallel_index_scan_size as invoking workers for very small indexes + * can hurt performance. + * + * nrequested is the number of parallel workers that user requested. If + * nrequested is 0, we compute the parallel degree based on nindexes, that is + * the number of indexes that support parallel vacuum. This function also + * sets will_parallel_vacuum to remember indexes that participate in parallel + * vacuum. + */ +static int +parallel_vacuum_compute_workers(Relation *indrels, int nindexes, int nrequested, + bool *will_parallel_vacuum) +{ + int nindexes_parallel = 0; + int nindexes_parallel_bulkdel = 0; + int nindexes_parallel_cleanup = 0; + int parallel_workers; + + /* + * We don't allow performing parallel operation in standalone backend or + * when parallelism is disabled. + */ + if (!IsUnderPostmaster || max_parallel_maintenance_workers == 0) + return 0; + + /* + * Compute the number of indexes that can participate in parallel vacuum. + */ + for (int i = 0; i < nindexes; i++) + { + Relation indrel = indrels[i]; + uint8 vacoptions = indrel->rd_indam->amparallelvacuumoptions; + + /* Skip index that is not a suitable target for parallel index vacuum */ + if (vacoptions == VACUUM_OPTION_NO_PARALLEL || + RelationGetNumberOfBlocks(indrel) < min_parallel_index_scan_size) + continue; + + will_parallel_vacuum[i] = true; + + if ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) != 0) + nindexes_parallel_bulkdel++; + if (((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) != 0) || + ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0)) + nindexes_parallel_cleanup++; + } + + nindexes_parallel = Max(nindexes_parallel_bulkdel, + nindexes_parallel_cleanup); + + /* The leader process takes one index */ + nindexes_parallel--; + + /* No index supports parallel vacuum */ + if (nindexes_parallel <= 0) + return 0; + + /* Compute the parallel degree */ + parallel_workers = (nrequested > 0) ? + Min(nrequested, nindexes_parallel) : nindexes_parallel; + + /* Cap by max_parallel_maintenance_workers */ + parallel_workers = Min(parallel_workers, max_parallel_maintenance_workers); + + return parallel_workers; +} + +/* + * Perform index vacuum or index cleanup with parallel workers. This function + * must be used by the parallel vacuum leader process. + */ +static void +parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scans, + bool vacuum) +{ + int nworkers; + PVIndVacStatus new_status; + + Assert(!IsParallelWorker()); + + if (vacuum) + { + new_status = PARALLEL_INDVAC_STATUS_NEED_BULKDELETE; + + /* Determine the number of parallel workers to launch */ + nworkers = pvs->nindexes_parallel_bulkdel; + } + else + { + new_status = PARALLEL_INDVAC_STATUS_NEED_CLEANUP; + + /* Determine the number of parallel workers to launch */ + nworkers = pvs->nindexes_parallel_cleanup; + + /* Add conditionally parallel-aware indexes if in the first time call */ + if (num_index_scans == 0) + nworkers += pvs->nindexes_parallel_condcleanup; + } + + /* The leader process will participate */ + nworkers--; + + /* + * It is possible that parallel context is initialized with fewer workers + * than the number of indexes that need a separate worker in the current + * phase, so we need to consider it. See + * parallel_vacuum_compute_workers(). + */ + nworkers = Min(nworkers, pvs->pcxt->nworkers); + + /* + * Set index vacuum status and mark whether parallel vacuum worker can + * process it. + */ + for (int i = 0; i < pvs->nindexes; i++) + { + PVIndStats *indstats = &(pvs->indstats[i]); + + Assert(indstats->status == PARALLEL_INDVAC_STATUS_INITIAL); + indstats->status = new_status; + indstats->parallel_workers_can_process = + (pvs->will_parallel_vacuum[i] && + parallel_vacuum_index_is_parallel_safe(pvs->indrels[i], + num_index_scans, + vacuum)); + } + + /* Reset the parallel index processing counter */ + pg_atomic_write_u32(&(pvs->shared->idx), 0); + + /* Setup the shared cost-based vacuum delay and launch workers */ + if (nworkers > 0) + { + /* Reinitialize parallel context to relaunch parallel workers */ + if (num_index_scans > 0) + ReinitializeParallelDSM(pvs->pcxt); + + /* + * Set up shared cost balance and the number of active workers for + * vacuum delay. We need to do this before launching workers as + * otherwise, they might not see the updated values for these + * parameters. + */ + pg_atomic_write_u32(&(pvs->shared->cost_balance), VacuumCostBalance); + pg_atomic_write_u32(&(pvs->shared->active_nworkers), 0); + + /* + * The number of workers can vary between bulkdelete and cleanup + * phase. + */ + ReinitializeParallelWorkers(pvs->pcxt, nworkers); + + LaunchParallelWorkers(pvs->pcxt); + + if (pvs->pcxt->nworkers_launched > 0) + { + /* + * Reset the local cost values for leader backend as we have + * already accumulated the remaining balance of heap. + */ + VacuumCostBalance = 0; + VacuumCostBalanceLocal = 0; + + /* Enable shared cost balance for leader backend */ + VacuumSharedCostBalance = &(pvs->shared->cost_balance); + VacuumActiveNWorkers = &(pvs->shared->active_nworkers); + } + + if (vacuum) + ereport(pvs->shared->elevel, + (errmsg(ngettext("launched %d parallel vacuum worker for index vacuuming (planned: %d)", + "launched %d parallel vacuum workers for index vacuuming (planned: %d)", + pvs->pcxt->nworkers_launched), + pvs->pcxt->nworkers_launched, nworkers))); + else + ereport(pvs->shared->elevel, + (errmsg(ngettext("launched %d parallel vacuum worker for index cleanup (planned: %d)", + "launched %d parallel vacuum workers for index cleanup (planned: %d)", + pvs->pcxt->nworkers_launched), + pvs->pcxt->nworkers_launched, nworkers))); + } + + /* Vacuum the indexes that can be processed by only leader process */ + parallel_vacuum_process_unsafe_indexes(pvs); + + /* + * Join as a parallel worker. The leader vacuums alone processes all + * parallel-safe indexes in the case where no workers are launched. + */ + parallel_vacuum_process_safe_indexes(pvs); + + /* + * Next, accumulate buffer and WAL usage. (This must wait for the workers + * to finish, or we might get incomplete data.) + */ + if (nworkers > 0) + { + /* Wait for all vacuum workers to finish */ + WaitForParallelWorkersToFinish(pvs->pcxt); + + for (int i = 0; i < pvs->pcxt->nworkers_launched; i++) + InstrAccumParallelQuery(&pvs->buffer_usage[i], &pvs->wal_usage[i]); + } + + /* + * Reset all index status back to initial (while checking that we have + * vacuumed all indexes). + */ + for (int i = 0; i < pvs->nindexes; i++) + { + PVIndStats *indstats = &(pvs->indstats[i]); + + if (indstats->status != PARALLEL_INDVAC_STATUS_COMPLETED) + elog(ERROR, "parallel index vacuum on index \"%s\" is not completed", + RelationGetRelationName(pvs->indrels[i])); + + indstats->status = PARALLEL_INDVAC_STATUS_INITIAL; + } + + /* + * Carry the shared balance value to heap scan and disable shared costing + */ + if (VacuumSharedCostBalance) + { + VacuumCostBalance = pg_atomic_read_u32(VacuumSharedCostBalance); + VacuumSharedCostBalance = NULL; + VacuumActiveNWorkers = NULL; + } +} + +/* + * Index vacuum/cleanup routine used by the leader process and parallel + * vacuum worker processes to vacuum the indexes in parallel. + */ +static void +parallel_vacuum_process_safe_indexes(ParallelVacuumState *pvs) +{ + /* + * Increment the active worker count if we are able to launch any worker. + */ + if (VacuumActiveNWorkers) + pg_atomic_add_fetch_u32(VacuumActiveNWorkers, 1); + + /* Loop until all indexes are vacuumed */ + for (;;) + { + int idx; + PVIndStats *indstats; + + /* Get an index number to process */ + idx = pg_atomic_fetch_add_u32(&(pvs->shared->idx), 1); + + /* Done for all indexes? */ + if (idx >= pvs->nindexes) + break; + + indstats = &(pvs->indstats[idx]); + + /* + * Skip vacuuming index that is unsafe for workers or has an + * unsuitable target for parallel index vacuum (this is vacuumed in + * parallel_vacuum_process_unsafe_indexes() by the leader). + */ + if (!indstats->parallel_workers_can_process) + continue; + + /* Do vacuum or cleanup of the index */ + parallel_vacuum_process_one_index(pvs, pvs->indrels[idx], indstats); + } + + /* + * We have completed the index vacuum so decrement the active worker + * count. + */ + if (VacuumActiveNWorkers) + pg_atomic_sub_fetch_u32(VacuumActiveNWorkers, 1); +} + +/* + * Perform parallel vacuuming of indexes in leader process. + * + * Handles index vacuuming (or index cleanup) for indexes that are not + * parallel safe. It's possible that this will vary for a given index, based + * on details like whether we're performing index cleanup right now. + * + * Also performs vacuuming of smaller indexes that fell under the size cutoff + * enforced by parallel_vacuum_compute_workers(). + */ +static void +parallel_vacuum_process_unsafe_indexes(ParallelVacuumState *pvs) +{ + Assert(!IsParallelWorker()); + + /* + * Increment the active worker count if we are able to launch any worker. + */ + if (VacuumActiveNWorkers) + pg_atomic_add_fetch_u32(VacuumActiveNWorkers, 1); + + for (int i = 0; i < pvs->nindexes; i++) + { + PVIndStats *indstats = &(pvs->indstats[i]); + + /* Skip, indexes that are safe for workers */ + if (indstats->parallel_workers_can_process) + continue; + + /* Do vacuum or cleanup of the index */ + parallel_vacuum_process_one_index(pvs, pvs->indrels[i], indstats); + } + + /* + * We have completed the index vacuum so decrement the active worker + * count. + */ + if (VacuumActiveNWorkers) + pg_atomic_sub_fetch_u32(VacuumActiveNWorkers, 1); +} + +/* + * Vacuum or cleanup index either by leader process or by one of the worker + * process. After vacuuming the index this function copies the index + * statistics returned from ambulkdelete and amvacuumcleanup to the DSM + * segment. + */ +static void +parallel_vacuum_process_one_index(ParallelVacuumState *pvs, Relation indrel, + PVIndStats *indstats) +{ + IndexBulkDeleteResult *istat = NULL; + IndexBulkDeleteResult *istat_res; + IndexVacuumInfo ivinfo; + + /* + * Update the pointer to the corresponding bulk-deletion result if someone + * has already updated it + */ + if (indstats->istat_updated) + istat = &(indstats->istat); + + ivinfo.index = indrel; + ivinfo.analyze_only = false; + ivinfo.report_progress = false; + ivinfo.message_level = DEBUG2; + ivinfo.estimated_count = pvs->shared->estimated_count; + ivinfo.num_heap_tuples = pvs->shared->reltuples; + ivinfo.strategy = pvs->bstrategy; + + /* Update error traceback information */ + pvs->indname = pstrdup(RelationGetRelationName(indrel)); + pvs->status = indstats->status; + + switch (indstats->status) + { + case PARALLEL_INDVAC_STATUS_NEED_BULKDELETE: + istat_res = vac_bulkdel_one_index(&ivinfo, istat, pvs->dead_items); + break; + case PARALLEL_INDVAC_STATUS_NEED_CLEANUP: + istat_res = vac_cleanup_one_index(&ivinfo, istat); + break; + default: + elog(ERROR, "unexpected parallel vacuum index status %d for index \"%s\"", + indstats->status, + RelationGetRelationName(indrel)); + } + + /* + * Copy the index bulk-deletion result returned from ambulkdelete and + * amvacuumcleanup to the DSM segment if it's the first cycle because they + * allocate locally and it's possible that an index will be vacuumed by a + * different vacuum process the next cycle. Copying the result normally + * happens only the first time an index is vacuumed. For any additional + * vacuum pass, we directly point to the result on the DSM segment and + * pass it to vacuum index APIs so that workers can update it directly. + * + * Since all vacuum workers write the bulk-deletion result at different + * slots we can write them without locking. + */ + if (!indstats->istat_updated && istat_res != NULL) + { + memcpy(&(indstats->istat), istat_res, sizeof(IndexBulkDeleteResult)); + indstats->istat_updated = true; + + /* Free the locally-allocated bulk-deletion result */ + pfree(istat_res); + } + + /* + * Update the status to completed. No need to lock here since each worker + * touches different indexes. + */ + indstats->status = PARALLEL_INDVAC_STATUS_COMPLETED; + + /* Reset error traceback information */ + pvs->status = PARALLEL_INDVAC_STATUS_COMPLETED; + pfree(pvs->indname); + pvs->indname = NULL; +} + +/* + * Returns false, if the given index can't participate in the next execution of + * parallel index vacuum or parallel index cleanup. + */ +static bool +parallel_vacuum_index_is_parallel_safe(Relation indrel, int num_index_scans, + bool vacuum) +{ + uint8 vacoptions; + + vacoptions = indrel->rd_indam->amparallelvacuumoptions; + + /* In parallel vacuum case, check if it supports parallel bulk-deletion */ + if (vacuum) + return ((vacoptions & VACUUM_OPTION_PARALLEL_BULKDEL) != 0); + + /* Not safe, if the index does not support parallel cleanup */ + if (((vacoptions & VACUUM_OPTION_PARALLEL_CLEANUP) == 0) && + ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) == 0)) + return false; + + /* + * Not safe, if the index supports parallel cleanup conditionally, but we + * have already processed the index (for bulkdelete). We do this to avoid + * the need to invoke workers when parallel index cleanup doesn't need to + * scan the index. See the comments for option + * VACUUM_OPTION_PARALLEL_COND_CLEANUP to know when indexes support + * parallel cleanup conditionally. + */ + if (num_index_scans > 0 && + ((vacoptions & VACUUM_OPTION_PARALLEL_COND_CLEANUP) != 0)) + return false; + + return true; +} + +/* + * Perform work within a launched parallel process. + * + * Since parallel vacuum workers perform only index vacuum or index cleanup, + * we don't need to report progress information. + */ +void +parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) +{ + ParallelVacuumState pvs; + Relation rel; + Relation *indrels; + PVIndStats *indstats; + PVShared *shared; + VacDeadItems *dead_items; + BufferUsage *buffer_usage; + WalUsage *wal_usage; + int nindexes; + char *sharedquery; + ErrorContextCallback errcallback; + + /* + * A parallel vacuum worker must have only PROC_IN_VACUUM flag since we + * don't support parallel vacuum for autovacuum as of now. + */ + Assert(MyProc->statusFlags == PROC_IN_VACUUM); + + elog(DEBUG1, "starting parallel vacuum worker"); + + shared = (PVShared *) shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_SHARED, false); + + /* Set debug_query_string for individual workers */ + sharedquery = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_QUERY_TEXT, true); + debug_query_string = sharedquery; + pgstat_report_activity(STATE_RUNNING, debug_query_string); + + /* + * Open table. The lock mode is the same as the leader process. It's + * okay because the lock mode does not conflict among the parallel + * workers. + */ + rel = table_open(shared->relid, ShareUpdateExclusiveLock); + + /* + * Open all indexes. indrels are sorted in order by OID, which should be + * matched to the leader's one. + */ + vac_open_indexes(rel, RowExclusiveLock, &nindexes, &indrels); + Assert(nindexes > 0); + + if (shared->maintenance_work_mem_worker > 0) + maintenance_work_mem = shared->maintenance_work_mem_worker; + + /* Set index statistics */ + indstats = (PVIndStats *) shm_toc_lookup(toc, + PARALLEL_VACUUM_KEY_INDEX_STATS, + false); + + /* Set dead_items space */ + dead_items = (VacDeadItems *) shm_toc_lookup(toc, + PARALLEL_VACUUM_KEY_DEAD_ITEMS, + false); + + /* Set cost-based vacuum delay */ + VacuumCostActive = (VacuumCostDelay > 0); + VacuumCostBalance = 0; + VacuumPageHit = 0; + VacuumPageMiss = 0; + VacuumPageDirty = 0; + VacuumCostBalanceLocal = 0; + VacuumSharedCostBalance = &(shared->cost_balance); + VacuumActiveNWorkers = &(shared->active_nworkers); + + /* Set parallel vacuum state */ + pvs.indrels = indrels; + pvs.nindexes = nindexes; + pvs.indstats = indstats; + pvs.shared = shared; + pvs.dead_items = dead_items; + pvs.relnamespace = get_namespace_name(RelationGetNamespace(rel)); + pvs.relname = pstrdup(RelationGetRelationName(rel)); + + /* These fields will be filled during index vacuum or cleanup */ + pvs.indname = NULL; + pvs.status = PARALLEL_INDVAC_STATUS_INITIAL; + + /* Each parallel VACUUM worker gets its own access strategy */ + pvs.bstrategy = GetAccessStrategy(BAS_VACUUM); + + /* Setup error traceback support for ereport() */ + errcallback.callback = parallel_vacuum_error_callback; + errcallback.arg = &pvs; + errcallback.previous = error_context_stack; + error_context_stack = &errcallback; + + /* Prepare to track buffer usage during parallel execution */ + InstrStartParallelQuery(); + + /* Process indexes to perform vacuum/cleanup */ + parallel_vacuum_process_safe_indexes(&pvs); + + /* Report buffer/WAL usage during parallel execution */ + buffer_usage = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_BUFFER_USAGE, false); + wal_usage = shm_toc_lookup(toc, PARALLEL_VACUUM_KEY_WAL_USAGE, false); + InstrEndParallelQuery(&buffer_usage[ParallelWorkerNumber], + &wal_usage[ParallelWorkerNumber]); + + /* Pop the error context stack */ + error_context_stack = errcallback.previous; + + vac_close_indexes(nindexes, indrels, RowExclusiveLock); + table_close(rel, ShareUpdateExclusiveLock); + FreeAccessStrategy(pvs.bstrategy); +} + +/* + * Error context callback for errors occurring during parallel index vacuum. + * The error context messages should match the messages set in the lazy vacuum + * error context. If you change this function, change vacuum_error_callback() + * as well. + */ +static void +parallel_vacuum_error_callback(void *arg) +{ + ParallelVacuumState *errinfo = arg; + + switch (errinfo->status) + { + case PARALLEL_INDVAC_STATUS_NEED_BULKDELETE: + errcontext("while vacuuming index \"%s\" of relation \"%s.%s\"", + errinfo->indname, + errinfo->relnamespace, + errinfo->relname); + break; + case PARALLEL_INDVAC_STATUS_NEED_CLEANUP: + errcontext("while cleaning up index \"%s\" of relation \"%s.%s\"", + errinfo->indname, + errinfo->relnamespace, + errinfo->relname); + break; + case PARALLEL_INDVAC_STATUS_INITIAL: + case PARALLEL_INDVAC_STATUS_COMPLETED: + default: + return; + } +} diff --git a/third_party/spanner_pg/src/backend/commands/variable.c b/third_party/spanner_pg/src/backend/commands/variable.c index 0c856794..e5ddcda0 100644 --- a/third_party/spanner_pg/src/backend/commands/variable.c +++ b/third_party/spanner_pg/src/backend/commands/variable.c @@ -4,7 +4,7 @@ * Routines for handling specialized SET variables. * * - * 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/third_party/spanner_pg/src/backend/commands/view.c b/third_party/spanner_pg/src/backend/commands/view.c index 79874534..73c0dc7e 100644 --- a/third_party/spanner_pg/src/backend/commands/view.c +++ b/third_party/spanner_pg/src/backend/commands/view.c @@ -3,7 +3,7 @@ * view.c * use rewrite rules to construct views * - * 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 * * @@ -298,7 +298,12 @@ checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc) NameStr(oldattr->attname), NameStr(newattr->attname)), errhint("Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead."))); - /* XXX would it be safe to allow atttypmod to change? Not sure */ + + /* + * We cannot allow type, typmod, or collation to change, since these + * properties may be embedded in Vars of other views/rules referencing + * this one. Other column attributes can be ignored. + */ if (newattr->atttypid != oldattr->atttypid || newattr->atttypmod != oldattr->atttypmod) ereport(ERROR, @@ -309,7 +314,18 @@ checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc) oldattr->atttypmod), format_type_with_typemod(newattr->atttypid, newattr->atttypmod)))); - /* We can ignore the remaining attributes of an attribute... */ + + /* + * At this point, attcollations should be both valid or both invalid, + * so applying get_collation_name unconditionally should be fine. + */ + if (newattr->attcollation != oldattr->attcollation) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot change collation of view column \"%s\" from \"%s\" to \"%s\"", + NameStr(oldattr->attname), + get_collation_name(oldattr->attcollation), + get_collation_name(newattr->attcollation)))); } /* @@ -439,7 +455,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/third_party/spanner_pg/src/backend/executor/README b/third_party/spanner_pg/src/backend/executor/README index bf5e7086..642d63be 100644 --- a/third_party/spanner_pg/src/backend/executor/README +++ b/third_party/spanner_pg/src/backend/executor/README @@ -26,7 +26,7 @@ unnecessarily (for example, Sort does not rescan its input if no parameters of the input have changed, since it can just reread its stored sorted data). For a SELECT, it is only necessary to deliver the top-level result tuples -to the client. For INSERT/UPDATE/DELETE, the actual table modification +to the client. For INSERT/UPDATE/DELETE/MERGE, the actual table modification operations happen in a top-level ModifyTable plan node. If the query includes a RETURNING clause, the ModifyTable node delivers the computed RETURNING rows as output, otherwise it returns nothing. Handling INSERT @@ -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, +DELETE, 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 ----------------- @@ -314,8 +353,8 @@ EvalPlanQual (READ COMMITTED Update Checking) For simple SELECTs, the executor need only pay attention to tuples that are valid according to the snapshot seen by the current transaction (ie, they were inserted by a previously committed transaction, and not deleted by any -previously committed transaction). However, for UPDATE and DELETE it is not -cool to modify or delete a tuple that's been modified by an open or +previously committed transaction). However, for UPDATE, DELETE, and MERGE it +is not cool to modify or delete a tuple that's been modified by an open or concurrently-committed transaction. If we are running in SERIALIZABLE isolation level then we just raise an error when this condition is seen to occur. In READ COMMITTED isolation level, we must work a lot harder. @@ -339,14 +378,14 @@ we're doing UPDATE). If no tuple is returned, then the modified tuple(s) fail the quals, so we ignore the current result tuple and continue the original query. -In UPDATE/DELETE, only the target relation needs to be handled this way. +In UPDATE/DELETE/MERGE, only the target relation needs to be handled this way. In SELECT FOR UPDATE, there may be multiple relations flagged FOR UPDATE, so we obtain lock on the current tuple version in each such relation before executing the recheck. It is also possible that there are relations in the query that are not -to be locked (they are neither the UPDATE/DELETE target nor specified to -be locked in SELECT FOR UPDATE/SHARE). When re-running the test query +to be locked (they are neither the UPDATE/DELETE/MERGE target nor specified +to be locked in SELECT FOR UPDATE/SHARE). When re-running the test query we want to use the same rows from these relations that were joined to the locked rows. For ordinary relations this can be implemented relatively cheaply by including the row TID in the join outputs and re-fetching that diff --git a/third_party/spanner_pg/src/backend/executor/execAmi.c b/third_party/spanner_pg/src/backend/executor/execAmi.c index c3aa6501..b6245994 100644 --- a/third_party/spanner_pg/src/backend/executor/execAmi.c +++ b/third_party/spanner_pg/src/backend/executor/execAmi.c @@ -3,7 +3,7 @@ * execAmi.c * miscellaneous executor access method routines * - * 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 * * src/backend/executor/execAmi.c @@ -438,13 +438,10 @@ ExecSupportsMarkRestore(Path *pathnode) return true; case T_CustomScan: - { - CustomPath *customPath = castNode(CustomPath, pathnode); + if (castNode(CustomPath, pathnode)->flags & CUSTOMPATH_SUPPORT_MARK_RESTORE) + return true; + return false; - if (customPath->flags & CUSTOMPATH_SUPPORT_MARK_RESTORE) - return true; - return false; - } case T_Result: /* @@ -567,12 +564,8 @@ ExecSupportsBackwardScan(Plan *node) return ExecSupportsBackwardScan(((SubqueryScan *) node)->subplan); case T_CustomScan: - { - uint32 flags = ((CustomScan *) node)->flags; - - if (flags & CUSTOMPATH_SUPPORT_BACKWARD_SCAN) - return true; - } + if (((CustomScan *) node)->flags & CUSTOMPATH_SUPPORT_BACKWARD_SCAN) + return true; return false; case T_SeqScan: diff --git a/third_party/spanner_pg/src/backend/executor/execAsync.c b/third_party/spanner_pg/src/backend/executor/execAsync.c index 94a284a3..d8d79e97 100644 --- a/third_party/spanner_pg/src/backend/executor/execAsync.c +++ b/third_party/spanner_pg/src/backend/executor/execAsync.c @@ -3,7 +3,7 @@ * execAsync.c * Support routines for asynchronous execution * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/executor/execCurrent.c b/third_party/spanner_pg/src/backend/executor/execCurrent.c index 2208539d..f29822f5 100644 --- a/third_party/spanner_pg/src/backend/executor/execCurrent.c +++ b/third_party/spanner_pg/src/backend/executor/execCurrent.c @@ -3,7 +3,7 @@ * execCurrent.c * executor support for WHERE CURRENT OF cursor * - * 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 * * src/backend/executor/execCurrent.c diff --git a/third_party/spanner_pg/src/backend/executor/execExpr.c b/third_party/spanner_pg/src/backend/executor/execExpr.c index 91c2be29..4501371c 100644 --- a/third_party/spanner_pg/src/backend/executor/execExpr.c +++ b/third_party/spanner_pg/src/backend/executor/execExpr.c @@ -19,7 +19,7 @@ * and "Expression Evaluation" sections. * * - * 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 * * @@ -368,7 +368,7 @@ ExecBuildProjectionInfo(List *targetList, projInfo->pi_exprContext = econtext; /* We embed ExprState into ProjectionInfo instead of doing extra palloc */ - projInfo->pi_state.tag = T_ExprState; + projInfo->pi_state.type = T_ExprState; state = &projInfo->pi_state; state->expr = (Expr *) targetList; state->parent = parent; @@ -536,7 +536,7 @@ ExecBuildUpdateProjection(List *targetList, projInfo->pi_exprContext = econtext; /* We embed ExprState into ProjectionInfo instead of doing extra palloc */ - projInfo->pi_state.tag = T_ExprState; + projInfo->pi_state.type = T_ExprState; state = &projInfo->pi_state; if (evalTargetList) state->expr = (Expr *) targetList; @@ -1193,21 +1193,34 @@ ExecInitExprRec(Expr *node, ExprState *state, FmgrInfo *finfo; FunctionCallInfo fcinfo; AclResult aclresult; - FmgrInfo *hash_finfo; - FunctionCallInfo hash_fcinfo; + Oid cmpfuncid; + + /* + * Select the correct comparison function. When we do hashed + * NOT IN clauses, the opfuncid will be the inequality + * comparison function and negfuncid will be set to equality. + * We need to use the equality function for hash probes. + */ + if (OidIsValid(opexpr->negfuncid)) + { + Assert(OidIsValid(opexpr->hashfuncid)); + cmpfuncid = opexpr->negfuncid; + } + else + cmpfuncid = opexpr->opfuncid; Assert(list_length(opexpr->args) == 2); scalararg = (Expr *) linitial(opexpr->args); arrayarg = (Expr *) lsecond(opexpr->args); /* Check permission to call function */ - aclresult = pg_proc_aclcheck(opexpr->opfuncid, + aclresult = pg_proc_aclcheck(cmpfuncid, GetUserId(), ACL_EXECUTE); if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, OBJECT_FUNCTION, - get_func_name(opexpr->opfuncid)); - InvokeFunctionExecuteHook(opexpr->opfuncid); + get_func_name(cmpfuncid)); + InvokeFunctionExecuteHook(cmpfuncid); if (OidIsValid(opexpr->hashfuncid)) { @@ -1223,7 +1236,7 @@ ExecInitExprRec(Expr *node, ExprState *state, /* Set up the primary fmgr lookup information */ finfo = palloc0(sizeof(FmgrInfo)); fcinfo = palloc0(SizeForFunctionCallInfo(2)); - fmgr_info(opexpr->opfuncid, finfo); + fmgr_info(cmpfuncid, finfo); fmgr_info_set_expr((Node *) node, finfo); InitFunctionCallInfoData(*fcinfo, finfo, 2, opexpr->inputcollid, NULL, NULL); @@ -1237,18 +1250,6 @@ ExecInitExprRec(Expr *node, ExprState *state, */ if (OidIsValid(opexpr->hashfuncid)) { - hash_finfo = palloc0(sizeof(FmgrInfo)); - hash_fcinfo = palloc0(SizeForFunctionCallInfo(1)); - fmgr_info(opexpr->hashfuncid, hash_finfo); - fmgr_info_set_expr((Node *) node, hash_finfo); - InitFunctionCallInfoData(*hash_fcinfo, hash_finfo, - 1, opexpr->inputcollid, NULL, - NULL); - - scratch.d.hashedscalararrayop.hash_finfo = hash_finfo; - scratch.d.hashedscalararrayop.hash_fcinfo_data = hash_fcinfo; - scratch.d.hashedscalararrayop.hash_fn_addr = hash_finfo->fn_addr; - /* Evaluate scalar directly into left function argument */ ExecInitExprRec(scalararg, state, &fcinfo->args[0].value, &fcinfo->args[0].isnull); @@ -1264,13 +1265,11 @@ ExecInitExprRec(Expr *node, ExprState *state, /* And perform the operation */ scratch.opcode = EEOP_HASHED_SCALARARRAYOP; + scratch.d.hashedscalararrayop.inclause = opexpr->useOr; scratch.d.hashedscalararrayop.finfo = finfo; scratch.d.hashedscalararrayop.fcinfo_data = fcinfo; - scratch.d.hashedscalararrayop.fn_addr = finfo->fn_addr; + scratch.d.hashedscalararrayop.saop = opexpr; - scratch.d.hashedscalararrayop.hash_finfo = hash_finfo; - scratch.d.hashedscalararrayop.hash_fcinfo_data = hash_fcinfo; - scratch.d.hashedscalararrayop.hash_fn_addr = hash_finfo->fn_addr; ExprEvalPushStep(state, &scratch); } @@ -1454,7 +1453,7 @@ ExecInitExprRec(Expr *node, ExprState *state, /* find out the number of columns in the composite type */ tupDesc = lookup_rowtype_tupdesc(fstore->resulttype, -1); ncolumns = tupDesc->natts; - DecrTupleDescRefCount(tupDesc); + ReleaseTupleDesc(tupDesc); /* create workspace for column values */ values = (Datum *) palloc(sizeof(Datum) * ncolumns); diff --git a/third_party/spanner_pg/src/backend/executor/execExprInterp.c b/third_party/spanner_pg/src/backend/executor/execExprInterp.c index 69face81..26e7056b 100644 --- a/third_party/spanner_pg/src/backend/executor/execExprInterp.c +++ b/third_party/spanner_pg/src/backend/executor/execExprInterp.c @@ -46,7 +46,7 @@ * exported rather than being "static" in this file.) * * - * 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 * * IDENTIFICATION @@ -210,6 +210,8 @@ typedef struct ScalarArrayOpExprHashTable { saophash_hash *hashtab; /* underlying hash table */ struct ExprEvalStep *op; + FmgrInfo hash_finfo; /* function's lookup data */ + FunctionCallInfoBaseData hash_fcinfo_data; /* arguments etc */ } ScalarArrayOpExprHashTable; /* Define parameters for ScalarArrayOpExpr hash table code generation. */ @@ -3454,13 +3456,13 @@ static uint32 saop_element_hash(struct saophash_hash *tb, Datum key) { ScalarArrayOpExprHashTable *elements_tab = (ScalarArrayOpExprHashTable *) tb->private_data; - FunctionCallInfo fcinfo = elements_tab->op->d.hashedscalararrayop.hash_fcinfo_data; + FunctionCallInfo fcinfo = &elements_tab->hash_fcinfo_data; Datum hash; fcinfo->args[0].value = key; fcinfo->args[0].isnull = false; - hash = elements_tab->op->d.hashedscalararrayop.hash_fn_addr(fcinfo); + hash = elements_tab->hash_finfo.fn_addr(fcinfo); return DatumGetUInt32(hash); } @@ -3482,7 +3484,7 @@ saop_hash_element_match(struct saophash_hash *tb, Datum key1, Datum key2) fcinfo->args[1].value = key2; fcinfo->args[1].isnull = false; - result = elements_tab->op->d.hashedscalararrayop.fn_addr(fcinfo); + result = elements_tab->op->d.hashedscalararrayop.finfo->fn_addr(fcinfo); return DatumGetBool(result); } @@ -3505,6 +3507,7 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco { ScalarArrayOpExprHashTable *elements_tab = op->d.hashedscalararrayop.elements_tab; FunctionCallInfo fcinfo = op->d.hashedscalararrayop.fcinfo_data; + bool inclause = op->d.hashedscalararrayop.inclause; bool strictfunc = op->d.hashedscalararrayop.finfo->fn_strict; Datum scalar = fcinfo->args[0].value; bool scalar_isnull = fcinfo->args[0].isnull; @@ -3528,6 +3531,7 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco /* Build the hash table on first evaluation */ if (elements_tab == NULL) { + ScalarArrayOpExpr *saop; int16 typlen; bool typbyval; char typalign; @@ -3539,6 +3543,8 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco MemoryContext oldcontext; ArrayType *arr; + saop = op->d.hashedscalararrayop.saop; + arr = DatumGetArrayTypeP(*op->resvalue); nitems = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr)); @@ -3550,10 +3556,21 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory); elements_tab = (ScalarArrayOpExprHashTable *) - palloc(sizeof(ScalarArrayOpExprHashTable)); + palloc0(offsetof(ScalarArrayOpExprHashTable, hash_fcinfo_data) + + SizeForFunctionCallInfo(1)); op->d.hashedscalararrayop.elements_tab = elements_tab; elements_tab->op = op; + fmgr_info(saop->hashfuncid, &elements_tab->hash_finfo); + fmgr_info_set_expr((Node *) saop, &elements_tab->hash_finfo); + + InitFunctionCallInfoData(elements_tab->hash_fcinfo_data, + &elements_tab->hash_finfo, + 1, + saop->inputcollid, + NULL, + NULL); + /* * Create the hash table sizing it according to the number of elements * in the array. This does assume that the array has no duplicates. @@ -3608,7 +3625,12 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco /* Check the hash to see if we have a match. */ hashfound = NULL != saophash_lookup(elements_tab->hashtab, scalar); - result = BoolGetDatum(hashfound); + /* the result depends on if the clause is an IN or NOT IN clause */ + if (inclause) + result = BoolGetDatum(hashfound); /* IN */ + else + result = BoolGetDatum(!hashfound); /* NOT IN */ + resultnull = false; /* @@ -3617,7 +3639,7 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco * hashtable, but instead marked if we found any when building the table * in has_nulls. */ - if (!DatumGetBool(result) && op->d.hashedscalararrayop.has_nulls) + if (!hashfound && op->d.hashedscalararrayop.has_nulls) { if (strictfunc) { @@ -3643,8 +3665,15 @@ ExecEvalHashedScalarArrayOp(ExprState *state, ExprEvalStep *op, ExprContext *eco fcinfo->args[1].value = (Datum) 0; fcinfo->args[1].isnull = true; - result = op->d.hashedscalararrayop.fn_addr(fcinfo); + result = op->d.hashedscalararrayop.finfo->fn_addr(fcinfo); resultnull = fcinfo->isnull; + + /* + * Reverse the result for NOT IN clauses since the above function + * is the equality function and we need not-equals. + */ + if (!inclause) + result = !result; } } diff --git a/third_party/spanner_pg/src/backend/executor/execGrouping.c b/third_party/spanner_pg/src/backend/executor/execGrouping.c index f93d956e..7aa4b726 100644 --- a/third_party/spanner_pg/src/backend/executor/execGrouping.c +++ b/third_party/spanner_pg/src/backend/executor/execGrouping.c @@ -3,7 +3,7 @@ * execGrouping.c * executor utility routines for grouping, hashing, and aggregation * - * 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 * * @@ -248,7 +248,7 @@ BuildTupleHashTableExt(PlanState *parent, } /* - * BuildTupleHashTable is a backwards-compatibilty wrapper for + * BuildTupleHashTable is a backwards-compatibility wrapper for * BuildTupleHashTableExt(), that allocates the hashtable's metadata in * tablecxt. Note that hashtables created this way cannot be reset leak-free * with ResetTupleHashTable(). @@ -461,8 +461,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/third_party/spanner_pg/src/backend/executor/execIndexing.c b/third_party/spanner_pg/src/backend/executor/execIndexing.c index 74becdc8..6a8735ed 100644 --- a/third_party/spanner_pg/src/backend/executor/execIndexing.c +++ b/third_party/spanner_pg/src/backend/executor/execIndexing.c @@ -95,7 +95,7 @@ * with the higher XID backs out. * * - * 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 * * @@ -136,6 +136,11 @@ static bool check_exclusion_or_unique_constraint(Relation heap, Relation index, static bool index_recheck_constraint(Relation index, Oid *constr_procs, Datum *existing_values, bool *existing_isnull, Datum *new_values); +static bool index_unchanged_by_update(ResultRelInfo *resultRelInfo, + EState *estate, IndexInfo *indexInfo, + Relation indexRelation); +static bool index_expression_changed_walker(Node *node, + Bitmapset *allUpdatedCols); /* ---------------------------------------------------------------- * ExecOpenIndices @@ -401,12 +406,11 @@ ExecInsertIndexTuples(ResultRelInfo *resultRelInfo, * There's definitely going to be an index_insert() call for this * index. If we're being called as part of an UPDATE statement, * consider if the 'indexUnchanged' = true hint should be passed. - * - * XXX We always assume that the hint should be passed for an UPDATE. - * This is a workaround for a bug in PostgreSQL 14. In practice this - * won't make much difference for current users of the hint. */ - indexUnchanged = update; + indexUnchanged = update && index_unchanged_by_update(resultRelInfo, + estate, + indexInfo, + indexRelation); satisfiesConstraint = index_insert(indexRelation, /* index relation */ @@ -695,13 +699,19 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index, } /* - * If any of the input values are NULL, the constraint check is assumed to - * pass (i.e., we assume the operators are strict). + * If any of the input values are NULL, and the index uses the default + * nulls-are-distinct mode, the constraint check is assumed to pass (i.e., + * we assume the operators are strict). Otherwise, we interpret the + * constraint as specifying IS NULL for each column whose input value is + * NULL. */ - for (i = 0; i < indnkeyatts; i++) + if (!indexInfo->ii_NullsNotDistinct) { - if (isnull[i]) - return true; + for (i = 0; i < indnkeyatts; i++) + { + if (isnull[i]) + return true; + } } /* @@ -713,7 +723,7 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index, for (i = 0; i < indnkeyatts; i++) { ScanKeyEntryInitialize(&scankeys[i], - 0, + isnull[i] ? SK_ISNULL | SK_SEARCHNULL : 0, i + 1, constr_strats[i], InvalidOid, @@ -919,3 +929,149 @@ index_recheck_constraint(Relation index, Oid *constr_procs, return true; } + +/* + * Check if ExecInsertIndexTuples() should pass indexUnchanged hint. + * + * When the executor performs an UPDATE that requires a new round of index + * tuples, determine if we should pass 'indexUnchanged' = true hint for one + * single index. + */ +static bool +index_unchanged_by_update(ResultRelInfo *resultRelInfo, EState *estate, + IndexInfo *indexInfo, Relation indexRelation) +{ + Bitmapset *updatedCols; + Bitmapset *extraUpdatedCols; + Bitmapset *allUpdatedCols; + bool hasexpression = false; + List *idxExprs; + + /* + * Check cache first + */ + if (indexInfo->ii_CheckedUnchanged) + return indexInfo->ii_IndexUnchanged; + indexInfo->ii_CheckedUnchanged = true; + + /* + * Check for indexed attribute overlap with updated columns. + * + * Only do this for key columns. A change to a non-key column within an + * INCLUDE index should not be counted here. Non-key column values are + * opaque payload state to the index AM, a little like an extra table TID. + * + * Note that row-level BEFORE triggers won't affect our behavior, since + * they don't affect the updatedCols bitmaps generally. It doesn't seem + * worth the trouble of checking which attributes were changed directly. + */ + updatedCols = ExecGetUpdatedCols(resultRelInfo, estate); + extraUpdatedCols = ExecGetExtraUpdatedCols(resultRelInfo, estate); + for (int attr = 0; attr < indexInfo->ii_NumIndexKeyAttrs; attr++) + { + int keycol = indexInfo->ii_IndexAttrNumbers[attr]; + + if (keycol <= 0) + { + /* + * Skip expressions for now, but remember to deal with them later + * on + */ + hasexpression = true; + continue; + } + + if (bms_is_member(keycol - FirstLowInvalidHeapAttributeNumber, + updatedCols) || + bms_is_member(keycol - FirstLowInvalidHeapAttributeNumber, + extraUpdatedCols)) + { + /* Changed key column -- don't hint for this index */ + indexInfo->ii_IndexUnchanged = false; + return false; + } + } + + /* + * When we get this far and index has no expressions, return true so that + * index_insert() call will go on to pass 'indexUnchanged' = true hint. + * + * The _absence_ of an indexed key attribute that overlaps with updated + * attributes (in addition to the total absence of indexed expressions) + * shows that the index as a whole is logically unchanged by UPDATE. + */ + if (!hasexpression) + { + indexInfo->ii_IndexUnchanged = true; + return true; + } + + /* + * Need to pass only one bms to expression_tree_walker helper function. + * Avoid allocating memory in common case where there are no extra cols. + */ + if (!extraUpdatedCols) + allUpdatedCols = updatedCols; + else + allUpdatedCols = bms_union(updatedCols, extraUpdatedCols); + + /* + * We have to work slightly harder in the event of indexed expressions, + * but the principle is the same as before: try to find columns (Vars, + * actually) that overlap with known-updated columns. + * + * If we find any matching Vars, don't pass hint for index. Otherwise + * pass hint. + */ + idxExprs = RelationGetIndexExpressions(indexRelation); + hasexpression = index_expression_changed_walker((Node *) idxExprs, + allUpdatedCols); + list_free(idxExprs); + if (extraUpdatedCols) + bms_free(allUpdatedCols); + + if (hasexpression) + { + indexInfo->ii_IndexUnchanged = false; + return false; + } + + /* + * Deliberately don't consider index predicates. We should even give the + * hint when result rel's "updated tuple" has no corresponding index + * tuple, which is possible with a partial index (provided the usual + * conditions are met). + */ + indexInfo->ii_IndexUnchanged = true; + return true; +} + +/* + * Indexed expression helper for index_unchanged_by_update(). + * + * Returns true when Var that appears within allUpdatedCols located. + */ +static bool +index_expression_changed_walker(Node *node, Bitmapset *allUpdatedCols) +{ + if (node == NULL) + return false; + + if (IsA(node, Var)) + { + Var *var = (Var *) node; + + if (bms_is_member(var->varattno - FirstLowInvalidHeapAttributeNumber, + allUpdatedCols)) + { + /* Var was updated -- indicates that we should not hint */ + return true; + } + + /* Still haven't found a reason to not pass the hint */ + return false; + } + + return expression_tree_walker(node, index_expression_changed_walker, + (void *) allUpdatedCols); +} diff --git a/third_party/spanner_pg/src/backend/executor/execJunk.c b/third_party/spanner_pg/src/backend/executor/execJunk.c index 9741897e..7934c608 100644 --- a/third_party/spanner_pg/src/backend/executor/execJunk.c +++ b/third_party/spanner_pg/src/backend/executor/execJunk.c @@ -3,7 +3,7 @@ * execJunk.c * Junk attribute support stuff.... * - * 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/third_party/spanner_pg/src/backend/executor/execMain.c b/third_party/spanner_pg/src/backend/executor/execMain.c index 5f11167d..f64d3935 100644 --- a/third_party/spanner_pg/src/backend/executor/execMain.c +++ b/third_party/spanner_pg/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * before ExecutorEnd. This can be omitted only in case of EXPLAIN, * which should also omit ExecutorRun. * - * 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 * * @@ -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" @@ -234,6 +235,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; @@ -1245,6 +1247,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 @@ -1281,7 +1285,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; @@ -1332,7 +1337,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); @@ -1346,6 +1351,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 * @@ -1445,12 +1513,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(). */ @@ -2062,6 +2147,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/third_party/spanner_pg/src/backend/executor/execParallel.c b/third_party/spanner_pg/src/backend/executor/execParallel.c index f8a4a40e..f1fd7f7e 100644 --- a/third_party/spanner_pg/src/backend/executor/execParallel.c +++ b/third_party/spanner_pg/src/backend/executor/execParallel.c @@ -3,7 +3,7 @@ * execParallel.c * Support routines for parallel execution. * - * 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 * * This file contains routines that are intended to support setting up, @@ -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. */ @@ -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/third_party/spanner_pg/src/backend/executor/execPartition.c b/third_party/spanner_pg/src/backend/executor/execPartition.c index 9296cd91..86773310 100644 --- a/third_party/spanner_pg/src/backend/executor/execPartition.c +++ b/third_party/spanner_pg/src/backend/executor/execPartition.c @@ -3,7 +3,7 @@ * execPartition.c * Support routines for partitioning. * - * 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 * * IDENTIFICATION @@ -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" @@ -184,11 +185,18 @@ static char *ExecBuildSlotPartitionKeyDescription(Relation rel, bool *isnull, int maxfieldlen); static List *adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri); -static void ExecInitPruningContext(PartitionPruneContext *context, - List *pruning_steps, - PartitionDesc partdesc, - PartitionKey partkey, - PlanState *planstate); +static List *adjust_partition_colnos_using_map(List *colnos, AttrMap *attrMap); +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, @@ -539,8 +547,8 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, * Build WITH CHECK OPTION constraints for the partition. Note that we * didn't build the withCheckOptionList for partitions within the planner, * but simple translation of varattnos will suffice. This only occurs for - * the INSERT case or in the case of UPDATE tuple routing where we didn't - * find a result rel to reuse. + * the INSERT case or in the case of UPDATE/MERGE tuple routing where we + * didn't find a result rel to reuse. */ if (node && node->withCheckOptionLists != NIL) { @@ -551,12 +559,15 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, /* * In the case of INSERT on a partitioned table, there is only one * plan. Likewise, there is only one WCO list, not one per partition. - * For UPDATE, there are as many WCO lists as there are plans. + * For UPDATE/MERGE, there are as many WCO lists as there are plans. */ Assert((node->operation == CMD_INSERT && list_length(node->withCheckOptionLists) == 1 && list_length(node->resultRelations) == 1) || (node->operation == CMD_UPDATE && + list_length(node->withCheckOptionLists) == + list_length(node->resultRelations)) || + (node->operation == CMD_MERGE && list_length(node->withCheckOptionLists) == list_length(node->resultRelations))); @@ -587,7 +598,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, foreach(ll, wcoList) { - WithCheckOption *wco = castNode(WithCheckOption, lfirst(ll)); + WithCheckOption *wco = lfirst_node(WithCheckOption, ll); ExprState *wcoExpr = ExecInitQual(castNode(List, wco->qual), &mtstate->ps); @@ -612,6 +623,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, List *returningList; /* See the comment above for WCO lists. */ + /* (except no RETURNING support for MERGE yet) */ Assert((node->operation == CMD_INSERT && list_length(node->returningLists) == 1 && list_length(node->resultRelations) == 1) || @@ -855,6 +867,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; @@ -1431,17 +1536,33 @@ 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) { - List *new_colnos = NIL; TupleConversionMap *map = ExecGetChildToRootMap(leaf_part_rri); - AttrMap *attrMap; + + Assert(map != NULL); + + 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. + * + * Note: mustn't be called if no adjustment is required. + */ +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) { @@ -1487,64 +1608,121 @@ adjust_partition_colnos(List *colnos, ResultRelInfo *leaf_part_rri) * * 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); /* @@ -1556,7 +1734,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; @@ -1573,7 +1751,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); @@ -1709,18 +1887,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; } @@ -1744,11 +1924,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; @@ -1769,6 +1950,7 @@ ExecInitPruningContext(PartitionPruneContext *context, context->ppccontext = CurrentMemoryContext; context->planstate = planstate; + context->exprcontext = econtext; /* Initialize expression state for each expression we need */ context->exprstates = (ExprState **) @@ -1776,7 +1958,7 @@ ExecInitPruningContext(PartitionPruneContext *context, foreach(lc, pruning_steps) { PartitionPruneStepOp *step = (PartitionPruneStepOp *) lfirst(lc); - ListCell *lc2 = list_head(step->exprs); + ListCell *lc2 = list_head(step->exprs); int keyno; /* not needed for other step kinds */ @@ -1792,7 +1974,7 @@ ExecInitPruningContext(PartitionPruneContext *context, if (lc2 != NULL) { - Expr *expr = lfirst(lc2); + Expr *expr = lfirst(lc2); /* not needed for Consts */ if (!IsA(expr, Const)) @@ -1801,8 +1983,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); } lc2 = lnext(step->exprs, lc2); } @@ -1811,179 +2005,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. - * - * 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. + * PartitionPruneFixSubPlanMap + * Fix mapping of partition indexes to subplan indexes contained in + * prunestate by considering the new list of subplans that survived + * initial pruning * - * 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); } /* @@ -1991,21 +2125,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 @@ -2019,17 +2156,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 */ @@ -2047,8 +2188,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 */ @@ -2064,25 +2204,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/third_party/spanner_pg/src/backend/executor/execProcnode.c b/third_party/spanner_pg/src/backend/executor/execProcnode.c index 9b2c436f..41cdf051 100644 --- a/third_party/spanner_pg/src/backend/executor/execProcnode.c +++ b/third_party/spanner_pg/src/backend/executor/execProcnode.c @@ -7,7 +7,7 @@ * ExecProcNode, or ExecEndNode on its subnodes and do the appropriate * processing. * - * 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/third_party/spanner_pg/src/backend/executor/execReplication.c b/third_party/spanner_pg/src/backend/executor/execReplication.c index 34754bd1..2e9f84d4 100644 --- a/third_party/spanner_pg/src/backend/executor/execReplication.c +++ b/third_party/spanner_pg/src/backend/executor/execReplication.c @@ -3,7 +3,7 @@ * execReplication.c * miscellaneous executor routines for logical replication * - * 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 * * IDENTIFICATION @@ -495,7 +495,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" */ } @@ -526,8 +526,9 @@ ExecSimpleRelationUpdate(ResultRelInfo *resultRelInfo, /* AFTER ROW UPDATE Triggers */ ExecARUpdateTriggers(estate, resultRelInfo, + NULL, NULL, tid, NULL, slot, - recheckIndexes, NULL); + recheckIndexes, NULL, false); list_free(recheckIndexes); } @@ -556,7 +557,6 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, { skip_tuple = !ExecBRDeleteTriggers(estate, epqstate, resultRelInfo, tid, NULL, NULL); - } if (!skip_tuple) @@ -566,7 +566,7 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, /* AFTER ROW DELETE Triggers */ ExecARDeleteTriggers(estate, resultRelInfo, - tid, NULL, NULL); + tid, NULL, NULL, false); } } @@ -576,7 +576,7 @@ ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, void CheckCmdReplicaIdentity(Relation rel, CmdType cmd) { - PublicationActions *pubactions; + PublicationDesc pubdesc; /* * Skip checking the replica identity for partitioned tables, because the @@ -589,24 +589,64 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd) if (cmd != CMD_UPDATE && cmd != CMD_DELETE) 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_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 (rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL || - OidIsValid(RelationGetReplicaIndex(rel))) + 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 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. */ - 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", @@ -624,22 +664,10 @@ void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname) { - /* - * Give a more specific error for foreign tables. - */ - if (relkind == RELKIND_FOREIGN_TABLE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot use relation \"%s.%s\" as logical replication target", - nspname, relname), - errdetail("\"%s.%s\" is a foreign table.", - nspname, relname))); - 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", nspname, relname), - errdetail("\"%s.%s\" is not a table.", - nspname, relname))); + errdetail_relkind_not_supported(relkind))); } diff --git a/third_party/spanner_pg/src/backend/executor/execSRF.c b/third_party/spanner_pg/src/backend/executor/execSRF.c index 910d691d..bef707b8 100644 --- a/third_party/spanner_pg/src/backend/executor/execSRF.c +++ b/third_party/spanner_pg/src/backend/executor/execSRF.c @@ -7,7 +7,7 @@ * common code for calling set-returning functions according to the * ReturnSetInfo API. * - * 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/third_party/spanner_pg/src/backend/executor/execScan.c b/third_party/spanner_pg/src/backend/executor/execScan.c index dc835dee..5ae8f4da 100644 --- a/third_party/spanner_pg/src/backend/executor/execScan.c +++ b/third_party/spanner_pg/src/backend/executor/execScan.c @@ -7,7 +7,7 @@ * stuff - checking the qualification and projecting the tuple * appropriately. * - * 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 * * @@ -281,7 +281,7 @@ ExecAssignScanProjectionInfo(ScanState *node) * As above, but caller can specify varno expected in Vars in the tlist. */ void -ExecAssignScanProjectionInfoWithVarno(ScanState *node, Index varno) +ExecAssignScanProjectionInfoWithVarno(ScanState *node, int varno) { TupleDesc tupdesc = node->ss_ScanTupleSlot->tts_tupleDescriptor; diff --git a/third_party/spanner_pg/src/backend/executor/execTuples.c b/third_party/spanner_pg/src/backend/executor/execTuples.c index 456fd44a..48619b24 100644 --- a/third_party/spanner_pg/src/backend/executor/execTuples.c +++ b/third_party/spanner_pg/src/backend/executor/execTuples.c @@ -46,7 +46,7 @@ * to avoid physically constructing projection tuples in many cases. * * - * 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/third_party/spanner_pg/src/backend/executor/execUtils.c b/third_party/spanner_pg/src/backend/executor/execUtils.c index b74b0684..3a436838 100644 --- a/third_party/spanner_pg/src/backend/executor/execUtils.c +++ b/third_party/spanner_pg/src/backend/executor/execUtils.c @@ -3,7 +3,7 @@ * execUtils.c * miscellaneous executor utility routines * - * 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 * * @@ -66,7 +66,7 @@ #include "utils/typcache.h" -static bool tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc); +static bool tlist_matches_tupdesc(PlanState *ps, List *tlist, int varno, TupleDesc tupdesc); static void ShutdownExprContext(ExprContext *econtext, bool isCommit); @@ -559,7 +559,7 @@ ExecAssignProjectionInfo(PlanState *planstate, */ void ExecConditionalAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc, - Index varno) + int varno) { if (tlist_matches_tupdesc(planstate, planstate->plan->targetlist, @@ -585,7 +585,7 @@ ExecConditionalAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc, } static bool -tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc) +tlist_matches_tupdesc(PlanState *ps, List *tlist, int varno, TupleDesc tupdesc) { int numattrs = tupdesc->natts; int attrno; diff --git a/third_party/spanner_pg/src/backend/executor/functions.c b/third_party/spanner_pg/src/backend/executor/functions.c index a2584588..a69d3d9f 100644 --- a/third_party/spanner_pg/src/backend/executor/functions.c +++ b/third_party/spanner_pg/src/backend/executor/functions.c @@ -3,7 +3,7 @@ * functions.c * Execution of SQL-language functions * - * 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 * * @@ -719,7 +719,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/third_party/spanner_pg/src/backend/executor/instrument.c b/third_party/spanner_pg/src/backend/executor/instrument.c index 2b106d84..ceff4727 100644 --- a/third_party/spanner_pg/src/backend/executor/instrument.c +++ b/third_party/spanner_pg/src/backend/executor/instrument.c @@ -4,7 +4,7 @@ * functions for instrumentation of plan execution * * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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/third_party/spanner_pg/src/backend/executor/nodeAgg.c b/third_party/spanner_pg/src/backend/executor/nodeAgg.c index ded45eba..a1fe4b28 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeAgg.c +++ b/third_party/spanner_pg/src/backend/executor/nodeAgg.c @@ -208,7 +208,16 @@ * * Spilled data is written to logical tapes. These provide better control * over memory usage, disk space, and the number of files than if we were - * to use a BufFile for each spill. + * to use a BufFile for each spill. We don't know the number of tapes needed + * at the start of the algorithm (because it can recurse), so a tape set is + * allocated at the beginning, and individual tapes are created as needed. + * As a particular tape is read, logtape.c recycles its disk space. When a + * tape is read to completion, it is destroyed entirely. + * + * Tapes' buffers can take up substantial memory when many tapes are open at + * once. We only need one tape open at a time in read mode (using a buffer + * that's a multiple of BLCKSZ); but we need one tape open in write mode (each + * requiring a buffer of size BLCKSZ) for each partition. * * Note that it's possible for transition states to start small but then * grow very large; for instance in the case of ARRAY_AGG. In such cases, @@ -228,7 +237,7 @@ * to filter expressions having to be evaluated early, and allows to JIT * the entire expression into one native function. * - * 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 * * IDENTIFICATION @@ -315,27 +324,6 @@ */ #define CHUNKHDRSZ 16 -/* - * Track all tapes needed for a HashAgg that spills. We don't know the maximum - * number of tapes needed at the start of the algorithm (because it can - * recurse), so one tape set is allocated and extended as needed for new - * tapes. When a particular tape is already read, rewind it for write mode and - * put it in the free list. - * - * Tapes' buffers can take up substantial memory when many tapes are open at - * once. We only need one tape open at a time in read mode (using a buffer - * that's a multiple of BLCKSZ); but we need one tape open in write mode (each - * requiring a buffer of size BLCKSZ) for each partition. - */ -typedef struct HashTapeInfo -{ - LogicalTapeSet *tapeset; - int ntapes; - int *freetapes; - int nfreetapes; - int freetapes_alloc; -} HashTapeInfo; - /* * Represents partitioned spill data for a single hashtable. Contains the * necessary information to route tuples to the correct partition, and to @@ -347,9 +335,8 @@ typedef struct HashTapeInfo */ typedef struct HashAggSpill { - LogicalTapeSet *tapeset; /* borrowed reference to tape set */ int npartitions; /* number of partitions */ - int *partitions; /* spill partition tape numbers */ + LogicalTape **partitions; /* spill partition tapes */ int64 *ntuples; /* number of tuples in each partition */ uint32 mask; /* mask to find partition from hash value */ int shift; /* after masking, shift by this amount */ @@ -369,8 +356,7 @@ typedef struct HashAggBatch { int setno; /* grouping set */ int used_bits; /* number of bits of hash already used */ - LogicalTapeSet *tapeset; /* borrowed reference to tape set */ - int input_tapenum; /* input partition tape */ + LogicalTape *input_tape; /* input partition tape */ int64 input_tuples; /* number of tuples in this batch */ double input_card; /* estimated group cardinality */ } HashAggBatch; @@ -446,29 +432,25 @@ static void hash_agg_update_metrics(AggState *aggstate, bool from_tape, int npartitions); static void hashagg_finish_initial_spills(AggState *aggstate); static void hashagg_reset_spill_state(AggState *aggstate); -static HashAggBatch *hashagg_batch_new(LogicalTapeSet *tapeset, - int input_tapenum, int setno, +static HashAggBatch *hashagg_batch_new(LogicalTape *input_tape, int setno, int64 input_tuples, double input_card, int used_bits); static MinimalTuple hashagg_batch_read(HashAggBatch *batch, uint32 *hashp); -static void hashagg_spill_init(HashAggSpill *spill, HashTapeInfo *tapeinfo, +static void hashagg_spill_init(HashAggSpill *spill, LogicalTapeSet *lts, int used_bits, double input_groups, double hashentrysize); static Size hashagg_spill_tuple(AggState *aggstate, HashAggSpill *spill, TupleTableSlot *slot, uint32 hash); static void hashagg_spill_finish(AggState *aggstate, HashAggSpill *spill, int setno); -static void hashagg_tapeinfo_init(AggState *aggstate); -static void hashagg_tapeinfo_assign(HashTapeInfo *tapeinfo, int *dest, - int ndest); -static void hashagg_tapeinfo_release(HashTapeInfo *tapeinfo, int tapenum); static Datum GetAggInitVal(Datum textInitVal, Oid transtype); static void build_pertrans_for_aggref(AggStatePerTrans pertrans, AggState *aggstate, EState *estate, - Aggref *aggref, Oid aggtransfn, Oid aggtranstype, - Oid aggserialfn, Oid aggdeserialfn, - Datum initValue, bool initValueIsNull, - Oid *inputTypes, int numArguments); + Aggref *aggref, Oid transfn_oid, + Oid aggtranstype, Oid aggserialfn, + Oid aggdeserialfn, Datum initValue, + bool initValueIsNull, Oid *inputTypes, + int numArguments); /* @@ -552,7 +534,7 @@ initialize_phase(AggState *aggstate, int newphase) sortnode->collations, sortnode->nullsFirst, work_mem, - NULL, false); + NULL, TUPLESORT_NONE); } aggstate->current_phase = newphase; @@ -629,7 +611,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] = @@ -639,7 +621,7 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans, pertrans->sortOperators, pertrans->sortCollations, pertrans->sortNullsFirst, - work_mem, NULL, false); + work_mem, NULL, TUPLESORT_NONE); } /* @@ -1890,12 +1872,12 @@ hash_agg_enter_spill_mode(AggState *aggstate) if (!aggstate->hash_ever_spilled) { - Assert(aggstate->hash_tapeinfo == NULL); + Assert(aggstate->hash_tapeset == NULL); Assert(aggstate->hash_spills == NULL); aggstate->hash_ever_spilled = true; - hashagg_tapeinfo_init(aggstate); + aggstate->hash_tapeset = LogicalTapeSetCreate(true, NULL, -1); aggstate->hash_spills = palloc(sizeof(HashAggSpill) * aggstate->num_hashes); @@ -1904,7 +1886,7 @@ hash_agg_enter_spill_mode(AggState *aggstate) AggStatePerHash perhash = &aggstate->perhash[setno]; HashAggSpill *spill = &aggstate->hash_spills[setno]; - hashagg_spill_init(spill, aggstate->hash_tapeinfo, 0, + hashagg_spill_init(spill, aggstate->hash_tapeset, 0, perhash->aggnode->numGroups, aggstate->hashentrysize); } @@ -1946,9 +1928,9 @@ hash_agg_update_metrics(AggState *aggstate, bool from_tape, int npartitions) aggstate->hash_mem_peak = total_mem; /* update disk usage */ - if (aggstate->hash_tapeinfo != NULL) + if (aggstate->hash_tapeset != NULL) { - uint64 disk_used = LogicalTapeSetBlocks(aggstate->hash_tapeinfo->tapeset) * (BLCKSZ / 1024); + uint64 disk_used = LogicalTapeSetBlocks(aggstate->hash_tapeset) * (BLCKSZ / 1024); if (aggstate->hash_disk_used < disk_used) aggstate->hash_disk_used = disk_used; @@ -2135,7 +2117,7 @@ lookup_hash_entries(AggState *aggstate) TupleTableSlot *slot = aggstate->tmpcontext->ecxt_outertuple; if (spill->partitions == NULL) - hashagg_spill_init(spill, aggstate->hash_tapeinfo, 0, + hashagg_spill_init(spill, aggstate->hash_tapeset, 0, perhash->aggnode->numGroups, aggstate->hashentrysize); @@ -2600,7 +2582,7 @@ agg_refill_hash_table(AggState *aggstate) HashAggBatch *batch; AggStatePerHash perhash; HashAggSpill spill; - HashTapeInfo *tapeinfo = aggstate->hash_tapeinfo; + LogicalTapeSet *tapeset = aggstate->hash_tapeset; bool spill_initialized = false; if (aggstate->hash_batches == NIL) @@ -2678,8 +2660,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) { @@ -2697,7 +2679,7 @@ agg_refill_hash_table(AggState *aggstate) * that we don't assign tapes that will never be used. */ spill_initialized = true; - hashagg_spill_init(&spill, tapeinfo, batch->used_bits, + hashagg_spill_init(&spill, tapeset, batch->used_bits, batch->input_card, aggstate->hashentrysize); } /* no memory for a new group, spill */ @@ -2713,7 +2695,7 @@ agg_refill_hash_table(AggState *aggstate) ResetExprContext(aggstate->tmpcontext); } - hashagg_tapeinfo_release(tapeinfo, batch->input_tapenum); + LogicalTapeClose(batch->input_tape); /* change back to phase 0 */ aggstate->current_phase = 0; @@ -2888,67 +2870,6 @@ agg_retrieve_hash_table_in_memory(AggState *aggstate) return NULL; } -/* - * Initialize HashTapeInfo - */ -static void -hashagg_tapeinfo_init(AggState *aggstate) -{ - HashTapeInfo *tapeinfo = palloc(sizeof(HashTapeInfo)); - int init_tapes = 16; /* expanded dynamically */ - - tapeinfo->tapeset = LogicalTapeSetCreate(init_tapes, true, NULL, NULL, -1); - tapeinfo->ntapes = init_tapes; - tapeinfo->nfreetapes = init_tapes; - tapeinfo->freetapes_alloc = init_tapes; - tapeinfo->freetapes = palloc(init_tapes * sizeof(int)); - for (int i = 0; i < init_tapes; i++) - tapeinfo->freetapes[i] = i; - - aggstate->hash_tapeinfo = tapeinfo; -} - -/* - * Assign unused tapes to spill partitions, extending the tape set if - * necessary. - */ -static void -hashagg_tapeinfo_assign(HashTapeInfo *tapeinfo, int *partitions, - int npartitions) -{ - int partidx = 0; - - /* use free tapes if available */ - while (partidx < npartitions && tapeinfo->nfreetapes > 0) - partitions[partidx++] = tapeinfo->freetapes[--tapeinfo->nfreetapes]; - - if (partidx < npartitions) - { - LogicalTapeSetExtend(tapeinfo->tapeset, npartitions - partidx); - - while (partidx < npartitions) - partitions[partidx++] = tapeinfo->ntapes++; - } -} - -/* - * After a tape has already been written to and then read, this function - * rewinds it for writing and adds it to the free list. - */ -static void -hashagg_tapeinfo_release(HashTapeInfo *tapeinfo, int tapenum) -{ - /* rewinding frees the buffer while not in use */ - LogicalTapeRewindForWrite(tapeinfo->tapeset, tapenum); - if (tapeinfo->freetapes_alloc == tapeinfo->nfreetapes) - { - tapeinfo->freetapes_alloc <<= 1; - tapeinfo->freetapes = repalloc(tapeinfo->freetapes, - tapeinfo->freetapes_alloc * sizeof(int)); - } - tapeinfo->freetapes[tapeinfo->nfreetapes++] = tapenum; -} - /* * hashagg_spill_init * @@ -2956,7 +2877,7 @@ hashagg_tapeinfo_release(HashTapeInfo *tapeinfo, int tapenum) * of partitions to create, and initializes them. */ static void -hashagg_spill_init(HashAggSpill *spill, HashTapeInfo *tapeinfo, int used_bits, +hashagg_spill_init(HashAggSpill *spill, LogicalTapeSet *tapeset, int used_bits, double input_groups, double hashentrysize) { int npartitions; @@ -2965,13 +2886,13 @@ hashagg_spill_init(HashAggSpill *spill, HashTapeInfo *tapeinfo, int used_bits, npartitions = hash_choose_num_partitions(input_groups, hashentrysize, used_bits, &partition_bits); - spill->partitions = palloc0(sizeof(int) * npartitions); + spill->partitions = palloc0(sizeof(LogicalTape *) * npartitions); spill->ntuples = palloc0(sizeof(int64) * npartitions); spill->hll_card = palloc0(sizeof(hyperLogLogState) * npartitions); - hashagg_tapeinfo_assign(tapeinfo, spill->partitions, npartitions); + for (int i = 0; i < npartitions; i++) + spill->partitions[i] = LogicalTapeCreate(tapeset); - spill->tapeset = tapeinfo->tapeset; spill->shift = 32 - used_bits - partition_bits; spill->mask = (npartitions - 1) << spill->shift; spill->npartitions = npartitions; @@ -2990,11 +2911,10 @@ static Size hashagg_spill_tuple(AggState *aggstate, HashAggSpill *spill, TupleTableSlot *inputslot, uint32 hash) { - LogicalTapeSet *tapeset = spill->tapeset; TupleTableSlot *spillslot; int partition; MinimalTuple tuple; - int tapenum; + LogicalTape *tape; int total_written = 0; bool shouldFree; @@ -3033,12 +2953,12 @@ hashagg_spill_tuple(AggState *aggstate, HashAggSpill *spill, */ addHyperLogLog(&spill->hll_card[partition], hash_bytes_uint32(hash)); - tapenum = spill->partitions[partition]; + tape = spill->partitions[partition]; - LogicalTapeWrite(tapeset, tapenum, (void *) &hash, sizeof(uint32)); + LogicalTapeWrite(tape, (void *) &hash, sizeof(uint32)); total_written += sizeof(uint32); - LogicalTapeWrite(tapeset, tapenum, (void *) tuple, tuple->t_len); + LogicalTapeWrite(tape, (void *) tuple, tuple->t_len); total_written += tuple->t_len; if (shouldFree) @@ -3054,15 +2974,14 @@ hashagg_spill_tuple(AggState *aggstate, HashAggSpill *spill, * be done. */ static HashAggBatch * -hashagg_batch_new(LogicalTapeSet *tapeset, int tapenum, int setno, +hashagg_batch_new(LogicalTape *input_tape, int setno, int64 input_tuples, double input_card, int used_bits) { HashAggBatch *batch = palloc0(sizeof(HashAggBatch)); batch->setno = setno; batch->used_bits = used_bits; - batch->tapeset = tapeset; - batch->input_tapenum = tapenum; + batch->input_tape = input_tape; batch->input_tuples = input_tuples; batch->input_card = input_card; @@ -3076,42 +2995,41 @@ hashagg_batch_new(LogicalTapeSet *tapeset, int tapenum, int setno, static MinimalTuple hashagg_batch_read(HashAggBatch *batch, uint32 *hashp) { - LogicalTapeSet *tapeset = batch->tapeset; - int tapenum = batch->input_tapenum; + LogicalTape *tape = batch->input_tape; MinimalTuple tuple; uint32 t_len; size_t nread; uint32 hash; - nread = LogicalTapeRead(tapeset, tapenum, &hash, sizeof(uint32)); + nread = LogicalTapeRead(tape, &hash, sizeof(uint32)); if (nread == 0) return NULL; if (nread != sizeof(uint32)) ereport(ERROR, (errcode_for_file_access(), - errmsg("unexpected EOF for tape %d: requested %zu bytes, read %zu bytes", - tapenum, sizeof(uint32), nread))); + errmsg_internal("unexpected EOF for tape %p: requested %zu bytes, read %zu bytes", + tape, sizeof(uint32), nread))); if (hashp != NULL) *hashp = hash; - nread = LogicalTapeRead(tapeset, tapenum, &t_len, sizeof(t_len)); + nread = LogicalTapeRead(tape, &t_len, sizeof(t_len)); if (nread != sizeof(uint32)) ereport(ERROR, (errcode_for_file_access(), - errmsg("unexpected EOF for tape %d: requested %zu bytes, read %zu bytes", - tapenum, sizeof(uint32), nread))); + errmsg_internal("unexpected EOF for tape %p: requested %zu bytes, read %zu bytes", + tape, sizeof(uint32), nread))); tuple = (MinimalTuple) palloc(t_len); tuple->t_len = t_len; - nread = LogicalTapeRead(tapeset, tapenum, + nread = LogicalTapeRead(tape, (void *) ((char *) tuple + sizeof(uint32)), t_len - sizeof(uint32)); if (nread != t_len - sizeof(uint32)) ereport(ERROR, (errcode_for_file_access(), - errmsg("unexpected EOF for tape %d: requested %zu bytes, read %zu bytes", - tapenum, t_len - sizeof(uint32), nread))); + errmsg_internal("unexpected EOF for tape %p: requested %zu bytes, read %zu bytes", + tape, t_len - sizeof(uint32), nread))); return tuple; } @@ -3168,8 +3086,7 @@ hashagg_spill_finish(AggState *aggstate, HashAggSpill *spill, int setno) for (i = 0; i < spill->npartitions; i++) { - LogicalTapeSet *tapeset = aggstate->hash_tapeinfo->tapeset; - int tapenum = spill->partitions[i]; + LogicalTape *tape = spill->partitions[i]; HashAggBatch *new_batch; double cardinality; @@ -3181,10 +3098,9 @@ hashagg_spill_finish(AggState *aggstate, HashAggSpill *spill, int setno) freeHyperLogLog(&spill->hll_card[i]); /* rewinding frees the buffer while not in use */ - LogicalTapeRewindForRead(tapeset, tapenum, - HASHAGG_READ_BUFFER_SIZE); + LogicalTapeRewindForRead(tape, HASHAGG_READ_BUFFER_SIZE); - new_batch = hashagg_batch_new(tapeset, tapenum, setno, + new_batch = hashagg_batch_new(tape, setno, spill->ntuples[i], cardinality, used_bits); aggstate->hash_batches = lappend(aggstate->hash_batches, new_batch); @@ -3223,14 +3139,10 @@ hashagg_reset_spill_state(AggState *aggstate) aggstate->hash_batches = NIL; /* close tape set */ - if (aggstate->hash_tapeinfo != NULL) + if (aggstate->hash_tapeset != NULL) { - HashTapeInfo *tapeinfo = aggstate->hash_tapeinfo; - - LogicalTapeSetClose(tapeinfo->tapeset); - pfree(tapeinfo->freetapes); - pfree(tapeinfo); - aggstate->hash_tapeinfo = NULL; + LogicalTapeSetClose(aggstate->hash_tapeset); + aggstate->hash_tapeset = NULL; } } @@ -3730,8 +3642,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) Aggref *aggref = lfirst(l); AggStatePerAgg peragg; AggStatePerTrans pertrans; - Oid inputTypes[FUNC_MAX_ARGS]; - int numArguments; + Oid aggTransFnInputTypes[FUNC_MAX_ARGS]; + int numAggTransFnArgs; int numDirectArgs; HeapTuple aggTuple; Form_pg_aggregate aggform; @@ -3865,14 +3777,15 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) * could be different from the agg's declared input types, when the * agg accepts ANY or a polymorphic type. */ - numArguments = get_aggregate_argtypes(aggref, inputTypes); + numAggTransFnArgs = get_aggregate_argtypes(aggref, + aggTransFnInputTypes); /* Count the "direct" arguments, if any */ numDirectArgs = list_length(aggref->aggdirectargs); /* Detect how many arguments to pass to the finalfn */ if (aggform->aggfinalextra) - peragg->numFinalArgs = numArguments + 1; + peragg->numFinalArgs = numAggTransFnArgs + 1; else peragg->numFinalArgs = numDirectArgs + 1; @@ -3886,7 +3799,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) */ if (OidIsValid(finalfn_oid)) { - build_aggregate_finalfn_expr(inputTypes, + build_aggregate_finalfn_expr(aggTransFnInputTypes, peragg->numFinalArgs, aggtranstype, aggref->aggtype, @@ -3917,7 +3830,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) /* * If this aggregation is performing state combines, then instead * of using the transition function, we'll use the combine - * function + * function. */ if (DO_AGGSPLIT_COMBINE(aggstate->aggsplit)) { @@ -3930,8 +3843,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) else transfn_oid = aggform->aggtransfn; - aclresult = pg_proc_aclcheck(transfn_oid, aggOwner, - ACL_EXECUTE); + aclresult = pg_proc_aclcheck(transfn_oid, aggOwner, ACL_EXECUTE); if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, OBJECT_FUNCTION, get_func_name(transfn_oid)); @@ -3949,11 +3861,72 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) else initValue = GetAggInitVal(textInitVal, aggtranstype); - build_pertrans_for_aggref(pertrans, aggstate, estate, - aggref, transfn_oid, aggtranstype, - serialfn_oid, deserialfn_oid, - initValue, initValueIsNull, - inputTypes, numArguments); + if (DO_AGGSPLIT_COMBINE(aggstate->aggsplit)) + { + Oid combineFnInputTypes[] = {aggtranstype, + aggtranstype}; + + /* + * When combining there's only one input, the to-be-combined + * transition value. The transition value is not counted + * here. + */ + pertrans->numTransInputs = 1; + + /* aggcombinefn always has two arguments of aggtranstype */ + build_pertrans_for_aggref(pertrans, aggstate, estate, + aggref, transfn_oid, aggtranstype, + serialfn_oid, deserialfn_oid, + initValue, initValueIsNull, + combineFnInputTypes, 2); + + /* + * Ensure that a combine function to combine INTERNAL states + * is not strict. This should have been checked during CREATE + * AGGREGATE, but the strict property could have been changed + * since then. + */ + if (pertrans->transfn.fn_strict && aggtranstype == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("combine function with transition type %s must not be declared STRICT", + format_type_be(aggtranstype)))); + } + else + { + /* Detect how many arguments to pass to the transfn */ + if (AGGKIND_IS_ORDERED_SET(aggref->aggkind)) + pertrans->numTransInputs = list_length(aggref->args); + else + pertrans->numTransInputs = numAggTransFnArgs; + + build_pertrans_for_aggref(pertrans, aggstate, estate, + aggref, transfn_oid, aggtranstype, + serialfn_oid, deserialfn_oid, + initValue, initValueIsNull, + aggTransFnInputTypes, + numAggTransFnArgs); + + /* + * If the transfn is strict and the initval is NULL, make sure + * input type and transtype are the same (or at least + * binary-compatible), so that it's OK to use the first + * aggregated input value as the initial transValue. This + * should have been checked at agg definition time, but we + * must check again in case the transfn's strictness property + * has been changed. + */ + if (pertrans->transfn.fn_strict && pertrans->initValueIsNull) + { + if (numAggTransFnArgs <= numDirectArgs || + !IsBinaryCoercible(aggTransFnInputTypes[numDirectArgs], + aggtranstype)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("aggregate %u needs to have compatible input type and transition type", + aggref->aggfnoid))); + } + } } else pertrans->aggshared = true; @@ -4045,20 +4018,24 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) * Build the state needed to calculate a state value for an aggregate. * * This initializes all the fields in 'pertrans'. 'aggref' is the aggregate - * to initialize the state for. 'aggtransfn', 'aggtranstype', and the rest + * to initialize the state for. 'transfn_oid', 'aggtranstype', and the rest * of the arguments could be calculated from 'aggref', but the caller has * calculated them already, so might as well pass them. + * + * 'transfn_oid' may be either the Oid of the aggtransfn or the aggcombinefn. */ static void build_pertrans_for_aggref(AggStatePerTrans pertrans, AggState *aggstate, EState *estate, Aggref *aggref, - Oid aggtransfn, Oid aggtranstype, + Oid transfn_oid, Oid aggtranstype, Oid aggserialfn, Oid aggdeserialfn, Datum initValue, bool initValueIsNull, Oid *inputTypes, int numArguments) { int numGroupingSets = Max(aggstate->maxsets, 1); + Expr *transfnexpr; + int numTransArgs; Expr *serialfnexpr = NULL; Expr *deserialfnexpr = NULL; ListCell *lc; @@ -4073,7 +4050,7 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans, pertrans->aggref = aggref; pertrans->aggshared = false; pertrans->aggCollation = aggref->inputcollid; - pertrans->transfn_oid = aggtransfn; + pertrans->transfn_oid = transfn_oid; pertrans->serialfn_oid = aggserialfn; pertrans->deserialfn_oid = aggdeserialfn; pertrans->initValue = initValue; @@ -4087,111 +4064,34 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans, pertrans->aggtranstype = aggtranstype; + /* account for the current transition state */ + numTransArgs = pertrans->numTransInputs + 1; + /* - * When combining states, we have no use at all for the aggregate - * function's transfn. Instead we use the combinefn. In this case, the - * transfn and transfn_oid fields of pertrans refer to the combine - * function rather than the transition function. + * Set up infrastructure for calling the transfn. Note that invtrans is + * not needed here. */ - if (DO_AGGSPLIT_COMBINE(aggstate->aggsplit)) - { - Expr *combinefnexpr; - size_t numTransArgs; - - /* - * When combining there's only one input, the to-be-combined added - * transition value from below (this node's transition value is - * counted separately). - */ - pertrans->numTransInputs = 1; - - /* account for the current transition state */ - numTransArgs = pertrans->numTransInputs + 1; - - build_aggregate_combinefn_expr(aggtranstype, - aggref->inputcollid, - aggtransfn, - &combinefnexpr); - fmgr_info(aggtransfn, &pertrans->transfn); - fmgr_info_set_expr((Node *) combinefnexpr, &pertrans->transfn); - - pertrans->transfn_fcinfo = - (FunctionCallInfo) palloc(SizeForFunctionCallInfo(2)); - InitFunctionCallInfoData(*pertrans->transfn_fcinfo, - &pertrans->transfn, - numTransArgs, - pertrans->aggCollation, - (void *) aggstate, NULL); - - /* - * Ensure that a combine function to combine INTERNAL states is not - * strict. This should have been checked during CREATE AGGREGATE, but - * the strict property could have been changed since then. - */ - if (pertrans->transfn.fn_strict && aggtranstype == INTERNALOID) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("combine function with transition type %s must not be declared STRICT", - format_type_be(aggtranstype)))); - } - else - { - Expr *transfnexpr; - size_t numTransArgs; + build_aggregate_transfn_expr(inputTypes, + numArguments, + numDirectArgs, + aggref->aggvariadic, + aggtranstype, + aggref->inputcollid, + transfn_oid, + InvalidOid, + &transfnexpr, + NULL); - /* Detect how many arguments to pass to the transfn */ - if (AGGKIND_IS_ORDERED_SET(aggref->aggkind)) - pertrans->numTransInputs = numInputs; - else - pertrans->numTransInputs = numArguments; + fmgr_info(transfn_oid, &pertrans->transfn); + fmgr_info_set_expr((Node *) transfnexpr, &pertrans->transfn); - /* account for the current transition state */ - numTransArgs = pertrans->numTransInputs + 1; - - /* - * Set up infrastructure for calling the transfn. Note that - * invtransfn is not needed here. - */ - build_aggregate_transfn_expr(inputTypes, - numArguments, - numDirectArgs, - aggref->aggvariadic, - aggtranstype, - aggref->inputcollid, - aggtransfn, - InvalidOid, - &transfnexpr, - NULL); - fmgr_info(aggtransfn, &pertrans->transfn); - fmgr_info_set_expr((Node *) transfnexpr, &pertrans->transfn); - - pertrans->transfn_fcinfo = - (FunctionCallInfo) palloc(SizeForFunctionCallInfo(numTransArgs)); - InitFunctionCallInfoData(*pertrans->transfn_fcinfo, - &pertrans->transfn, - numTransArgs, - pertrans->aggCollation, - (void *) aggstate, NULL); - - /* - * If the transfn is strict and the initval is NULL, make sure input - * type and transtype are the same (or at least binary-compatible), so - * that it's OK to use the first aggregated input value as the initial - * transValue. This should have been checked at agg definition time, - * but we must check again in case the transfn's strictness property - * has been changed. - */ - if (pertrans->transfn.fn_strict && pertrans->initValueIsNull) - { - if (numArguments <= numDirectArgs || - !IsBinaryCoercible(inputTypes[numDirectArgs], - aggtranstype)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("aggregate %u needs to have compatible input type and transition type", - aggref->aggfnoid))); - } - } + pertrans->transfn_fcinfo = + (FunctionCallInfo) palloc(SizeForFunctionCallInfo(numTransArgs)); + InitFunctionCallInfoData(*pertrans->transfn_fcinfo, + &pertrans->transfn, + numTransArgs, + pertrans->aggCollation, + (void *) aggstate, NULL); /* get info about the state value's datatype */ get_typlenbyval(aggtranstype, @@ -4228,7 +4128,6 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans, 2, InvalidOid, (void *) aggstate, NULL); - } /* @@ -4282,6 +4181,9 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans, */ Assert(aggstate->aggstrategy != AGG_HASHED && aggstate->aggstrategy != AGG_MIXED); + /* ORDER BY aggregates are not supported with partial aggregation */ + Assert(!DO_AGGSPLIT_COMBINE(aggstate->aggsplit)); + /* If we have only one input, we need its len/byval info. */ if (numInputs == 1) { diff --git a/third_party/spanner_pg/src/backend/executor/nodeAppend.c b/third_party/spanner_pg/src/backend/executor/nodeAppend.c index 6a2daa6e..68f13f2a 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeAppend.c +++ b/third_party/spanner_pg/src/backend/executor/nodeAppend.c @@ -3,7 +3,7 @@ * nodeAppend.c * routines to handle append nodes. * - * 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 * * @@ -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); } @@ -1029,43 +1016,51 @@ ExecAppendAsyncEventWait(AppendState *node) /* We should never be called when there are no valid async subplans. */ Assert(node->as_nasyncremain > 0); + Assert(node->as_eventset == NULL); node->as_eventset = CreateWaitEventSet(CurrentMemoryContext, nevents); - AddWaitEventToSet(node->as_eventset, WL_EXIT_ON_PM_DEATH, PGINVALID_SOCKET, - NULL, NULL); - - /* Give each waiting subplan a chance to add an event. */ - i = -1; - while ((i = bms_next_member(node->as_asyncplans, i)) >= 0) + PG_TRY(); { - AsyncRequest *areq = node->as_asyncrequests[i]; + AddWaitEventToSet(node->as_eventset, WL_EXIT_ON_PM_DEATH, PGINVALID_SOCKET, + NULL, NULL); - if (areq->callback_pending) - ExecAsyncConfigureWait(areq); - } + /* Give each waiting subplan a chance to add an event. */ + i = -1; + while ((i = bms_next_member(node->as_asyncplans, i)) >= 0) + { + AsyncRequest *areq = node->as_asyncrequests[i]; - /* - * No need for further processing if there are no configured events other - * than the postmaster death event. - */ - if (GetNumRegisteredWaitEvents(node->as_eventset) == 1) + if (areq->callback_pending) + ExecAsyncConfigureWait(areq); + } + + /* + * No need for further processing if there are no configured events + * other than the postmaster death event. + */ + if (GetNumRegisteredWaitEvents(node->as_eventset) == 1) + { + FreeWaitEventSet(node->as_eventset); + node->as_eventset = NULL; + return; + } + + /* Return at most EVENT_BUFFER_SIZE events in one call. */ + if (nevents > EVENT_BUFFER_SIZE) + nevents = EVENT_BUFFER_SIZE; + + /* + * If the timeout is -1, wait until at least one event occurs. If the + * timeout is 0, poll for events, but do not wait at all. + */ + noccurred = WaitEventSetWait(node->as_eventset, timeout, occurred_event, + nevents, WAIT_EVENT_APPEND_READY); + } + PG_FINALLY(); { FreeWaitEventSet(node->as_eventset); node->as_eventset = NULL; - return; } - - /* We wait on at most EVENT_BUFFER_SIZE events. */ - if (nevents > EVENT_BUFFER_SIZE) - nevents = EVENT_BUFFER_SIZE; - - /* - * If the timeout is -1, wait until at least one event occurs. If the - * timeout is 0, poll for events, but do not wait at all. - */ - noccurred = WaitEventSetWait(node->as_eventset, timeout, occurred_event, - nevents, WAIT_EVENT_APPEND_READY); - FreeWaitEventSet(node->as_eventset); - node->as_eventset = NULL; + PG_END_TRY(); if (noccurred == 0) return; diff --git a/third_party/spanner_pg/src/backend/executor/nodeBitmapAnd.c b/third_party/spanner_pg/src/backend/executor/nodeBitmapAnd.c index a8d7b1e5..b54c79f8 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeBitmapAnd.c +++ b/third_party/spanner_pg/src/backend/executor/nodeBitmapAnd.c @@ -3,7 +3,7 @@ * nodeBitmapAnd.c * routines to handle BitmapAnd nodes. * - * 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/third_party/spanner_pg/src/backend/executor/nodeBitmapHeapscan.c b/third_party/spanner_pg/src/backend/executor/nodeBitmapHeapscan.c index 2db1914a..f6fe07ad 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeBitmapHeapscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeBitmapHeapscan.c @@ -16,7 +16,7 @@ * required index qual conditions. * * - * 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/third_party/spanner_pg/src/backend/executor/nodeBitmapIndexscan.c b/third_party/spanner_pg/src/backend/executor/nodeBitmapIndexscan.c index 48c20362..551e4763 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeBitmapIndexscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeBitmapIndexscan.c @@ -3,7 +3,7 @@ * nodeBitmapIndexscan.c * Routines to support bitmapped index scans of relations * - * 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/third_party/spanner_pg/src/backend/executor/nodeBitmapOr.c b/third_party/spanner_pg/src/backend/executor/nodeBitmapOr.c index 4a8c01d0..2d57f11f 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeBitmapOr.c +++ b/third_party/spanner_pg/src/backend/executor/nodeBitmapOr.c @@ -3,7 +3,7 @@ * nodeBitmapOr.c * routines to handle BitmapOr nodes. * - * 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/third_party/spanner_pg/src/backend/executor/nodeCtescan.c b/third_party/spanner_pg/src/backend/executor/nodeCtescan.c index 9c2b08d1..b9d7dec8 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeCtescan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeCtescan.c @@ -3,7 +3,7 @@ * nodeCtescan.c * routines to handle CteScan nodes. * - * 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/third_party/spanner_pg/src/backend/executor/nodeCustom.c b/third_party/spanner_pg/src/backend/executor/nodeCustom.c index c82060e6..8f56bd8a 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeCustom.c +++ b/third_party/spanner_pg/src/backend/executor/nodeCustom.c @@ -3,7 +3,7 @@ * nodeCustom.c * Routines to handle execution of custom scan node * - * 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 * * ------------------------------------------------------------------------ @@ -31,7 +31,7 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags) CustomScanState *css; Relation scan_rel = NULL; Index scanrelid = cscan->scan.scanrelid; - Index tlistvarno; + int tlistvarno; /* * Allocate the CustomScanState object. We let the custom scan provider diff --git a/third_party/spanner_pg/src/backend/executor/nodeForeignscan.c b/third_party/spanner_pg/src/backend/executor/nodeForeignscan.c index d27849a4..5b9737c2 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeForeignscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeForeignscan.c @@ -3,7 +3,7 @@ * nodeForeignscan.c * Routines to support scans of foreign tables * - * 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 * * @@ -145,7 +145,7 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags) ForeignScanState *scanstate; Relation currentRelation = NULL; Index scanrelid = node->scan.scanrelid; - Index tlistvarno; + int tlistvarno; FdwRoutine *fdwroutine; /* check for unsupported flags */ diff --git a/third_party/spanner_pg/src/backend/executor/nodeFunctionscan.c b/third_party/spanner_pg/src/backend/executor/nodeFunctionscan.c index 8c8e3389..d59cdb67 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeFunctionscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeFunctionscan.c @@ -3,7 +3,7 @@ * nodeFunctionscan.c * Support routines for scanning RangeFunctions (functions in rangetable). * - * 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/third_party/spanner_pg/src/backend/executor/nodeGather.c b/third_party/spanner_pg/src/backend/executor/nodeGather.c index 734142b7..4f8a17df 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeGather.c +++ b/third_party/spanner_pg/src/backend/executor/nodeGather.c @@ -3,7 +3,7 @@ * nodeGather.c * Support routines for scanning a plan via multiple workers. * - * 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 * * A Gather executor launches parallel workers to run multiple copies of a diff --git a/third_party/spanner_pg/src/backend/executor/nodeGatherMerge.c b/third_party/spanner_pg/src/backend/executor/nodeGatherMerge.c index 03f02a19..a488cc6d 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeGatherMerge.c +++ b/third_party/spanner_pg/src/backend/executor/nodeGatherMerge.c @@ -3,7 +3,7 @@ * nodeGatherMerge.c * Scan a plan in multiple workers, and do order-preserving merge. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/executor/nodeGroup.c b/third_party/spanner_pg/src/backend/executor/nodeGroup.c index 1721b2aa..666d02b5 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeGroup.c +++ b/third_party/spanner_pg/src/backend/executor/nodeGroup.c @@ -3,7 +3,7 @@ * nodeGroup.c * Routines to handle group nodes (used for queries with GROUP BY clause). * - * 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/third_party/spanner_pg/src/backend/executor/nodeHash.c b/third_party/spanner_pg/src/backend/executor/nodeHash.c index 0a522591..34dd9a28 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeHash.c +++ b/third_party/spanner_pg/src/backend/executor/nodeHash.c @@ -3,7 +3,7 @@ * nodeHash.c * Routines to hash relations for hashjoin * - * 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 * * @@ -1162,6 +1162,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) double dtuples; double dbuckets; int new_nbuckets; + uint32 max_buckets; /* * We probably also need a smaller bucket array. How many @@ -1174,9 +1175,17 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) * array. */ dtuples = (old_batch0->ntuples * 2.0) / new_nbatch; + + /* + * We need to calculate the maximum number of buckets to + * stay within the MaxAllocSize boundary. Round the + * maximum number to the previous power of 2 given that + * later we round the number to the next power of 2. + */ + max_buckets = pg_prevpower2_32((uint32) + (MaxAllocSize / sizeof(dsa_pointer_atomic))); dbuckets = ceil(dtuples / NTUP_PER_BUCKET); - dbuckets = Min(dbuckets, - MaxAllocSize / sizeof(dsa_pointer_atomic)); + dbuckets = Min(dbuckets, max_buckets); new_nbuckets = (int) dbuckets; new_nbuckets = Max(new_nbuckets, 1024); new_nbuckets = pg_nextpower2_32(new_nbuckets); @@ -1850,8 +1859,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 @@ -3431,25 +3440,3 @@ get_hash_memory_limit(void) return (size_t) mem_limit; } - -/* - * Convert the hash memory limit to an integer number of kilobytes, - * that is something comparable to work_mem. Like work_mem, we clamp - * the result to ensure that multiplying it by 1024 fits in a long int. - * - * This is deprecated since it may understate the actual memory limit. - * It is unused in core and will eventually be removed. - */ -int -get_hash_mem(void) -{ - size_t mem_limit = get_hash_memory_limit(); - - /* Remove the kilobyte factor */ - mem_limit /= 1024; - - /* Clamp to MAX_KILOBYTES, like work_mem */ - mem_limit = Min(mem_limit, (size_t) MAX_KILOBYTES); - - return (int) mem_limit; -} diff --git a/third_party/spanner_pg/src/backend/executor/nodeHashjoin.c b/third_party/spanner_pg/src/backend/executor/nodeHashjoin.c index b2f1cf7f..b6944d70 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeHashjoin.c +++ b/third_party/spanner_pg/src/backend/executor/nodeHashjoin.c @@ -3,7 +3,7 @@ * nodeHashjoin.c * Routines to handle hash join nodes * - * 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/third_party/spanner_pg/src/backend/executor/nodeIncrementalSort.c b/third_party/spanner_pg/src/backend/executor/nodeIncrementalSort.c index 3d16ebe6..54ffd108 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeIncrementalSort.c +++ b/third_party/spanner_pg/src/backend/executor/nodeIncrementalSort.c @@ -3,7 +3,7 @@ * nodeIncrementalSort.c * Routines to handle incremental sorting of relations. * - * 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 * * IDENTIFICATION @@ -318,7 +318,7 @@ switchToPresortedPrefixMode(PlanState *pstate) &(plannode->sort.nullsFirst[nPresortedCols]), work_mem, NULL, - false); + node->bounded ? TUPLESORT_ALLOWBOUNDED : TUPLESORT_NONE); node->prefixsort_state = prefixsort_state; } else @@ -619,7 +619,9 @@ ExecIncrementalSort(PlanState *pstate) plannode->sort.nullsFirst, work_mem, NULL, - false); + node->bounded ? + TUPLESORT_ALLOWBOUNDED : + TUPLESORT_NONE); node->fullsort_state = fullsort_state; } else diff --git a/third_party/spanner_pg/src/backend/executor/nodeIndexonlyscan.c b/third_party/spanner_pg/src/backend/executor/nodeIndexonlyscan.c index 8fee9581..eb3ddd29 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeIndexonlyscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeIndexonlyscan.c @@ -3,7 +3,7 @@ * nodeIndexonlyscan.c * Routines to support index-only scans * - * 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/third_party/spanner_pg/src/backend/executor/nodeIndexscan.c b/third_party/spanner_pg/src/backend/executor/nodeIndexscan.c index 5d17d349..e1987221 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeIndexscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeIndexscan.c @@ -3,7 +3,7 @@ * nodeIndexscan.c * Routines to support indexed scans of relations * - * 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 * * @@ -577,6 +577,7 @@ ExecReScanIndexScan(IndexScanState *node) if (node->iss_ReorderQueue) { HeapTuple tuple; + while (!pairingheap_is_empty(node->iss_ReorderQueue)) { tuple = reorderqueue_pop(node); diff --git a/third_party/spanner_pg/src/backend/executor/nodeLimit.c b/third_party/spanner_pg/src/backend/executor/nodeLimit.c index 128eb3e5..1b91b123 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeLimit.c +++ b/third_party/spanner_pg/src/backend/executor/nodeLimit.c @@ -3,7 +3,7 @@ * nodeLimit.c * Routines to handle limiting of query results where appropriate * - * 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/third_party/spanner_pg/src/backend/executor/nodeLockRows.c b/third_party/spanner_pg/src/backend/executor/nodeLockRows.c index 7583973f..1a9dab25 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeLockRows.c +++ b/third_party/spanner_pg/src/backend/executor/nodeLockRows.c @@ -3,7 +3,7 @@ * nodeLockRows.c * Routines to handle FOR UPDATE/FOR SHARE row locking * - * 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/third_party/spanner_pg/src/backend/executor/nodeMaterial.c b/third_party/spanner_pg/src/backend/executor/nodeMaterial.c index 7c53f8e6..2cb27e0e 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeMaterial.c +++ b/third_party/spanner_pg/src/backend/executor/nodeMaterial.c @@ -3,7 +3,7 @@ * nodeMaterial.c * Routines to handle materialization nodes. * - * 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/third_party/spanner_pg/src/backend/executor/nodeMemoize.c b/third_party/spanner_pg/src/backend/executor/nodeMemoize.c index e975b265..dbd701d2 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeMemoize.c +++ b/third_party/spanner_pg/src/backend/executor/nodeMemoize.c @@ -3,7 +3,7 @@ * nodeMemoize.c * Routines to handle caching of results from parameterized nodes * - * Portions Copyright (c) 2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -117,8 +117,8 @@ typedef struct MemoizeKey typedef struct MemoizeEntry { MemoizeKey *key; /* Hash key for hash table lookups */ - MemoizeTuple *tuplehead; /* Pointer to the first tuple or NULL if - * no tuples are cached for this entry */ + MemoizeTuple *tuplehead; /* Pointer to the first tuple or NULL if no + * tuples are cached for this entry */ uint32 hash; /* Hash value (cached) */ char status; /* Hash status */ bool complete; /* Did we read the outer plan to completion? */ @@ -172,8 +172,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 */ { @@ -195,8 +195,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 */ { @@ -222,7 +222,7 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key) */ static bool MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1, - const MemoizeKey *key2) + const MemoizeKey *key2) { MemoizeState *mstate = (MemoizeState *) tb->private_data; ExprContext *econtext = mstate->ss.ps.ps_ExprContext; @@ -403,7 +403,7 @@ static void cache_purge_all(MemoizeState *mstate) { uint64 evictions = mstate->hashtable->members; - PlanState *pstate = (PlanState *) mstate; + PlanState *pstate = (PlanState *) mstate; /* * Likely the most efficient way to remove all items is to just reset the @@ -506,7 +506,7 @@ cache_reduce_memory(MemoizeState *mstate, MemoizeKey *specialkey) break; } - mstate->stats.cache_evictions += evictions; /* Update Stats */ + mstate->stats.cache_evictions += evictions; /* Update Stats */ return specialkey_intact; } @@ -987,8 +987,8 @@ ExecInitMemoize(Memoize *node, EState *estate, int eflags) &TTSOpsVirtual); mstate->param_exprs = (ExprState **) palloc(nkeys * sizeof(ExprState *)); - mstate->collations = node->collations; /* Just point directly to the plan - * data */ + mstate->collations = node->collations; /* Just point directly to the plan + * data */ mstate->hashfunctions = (FmgrInfo *) palloc(nkeys * sizeof(FmgrInfo)); eqfuncoids = palloc(nkeys * sizeof(Oid)); @@ -1163,7 +1163,7 @@ double ExecEstimateCacheEntryOverheadBytes(double ntuples) { return sizeof(MemoizeEntry) + sizeof(MemoizeKey) + sizeof(MemoizeTuple) * - ntuples; + ntuples; } /* ---------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/backend/executor/nodeMergeAppend.c b/third_party/spanner_pg/src/backend/executor/nodeMergeAppend.c index 617bffb2..c5c62fa5 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeMergeAppend.c +++ b/third_party/spanner_pg/src/backend/executor/nodeMergeAppend.c @@ -3,7 +3,7 @@ * nodeMergeAppend.c * routines to handle MergeAppend nodes. * - * 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 * * @@ -86,33 +86,21 @@ 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 - * 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) @@ -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/third_party/spanner_pg/src/backend/executor/nodeMergejoin.c b/third_party/spanner_pg/src/backend/executor/nodeMergejoin.c index c7cae4b4..ff0bf2ff 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeMergejoin.c +++ b/third_party/spanner_pg/src/backend/executor/nodeMergejoin.c @@ -3,7 +3,7 @@ * nodeMergejoin.c * routines supporting merge joins * - * 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 * * @@ -1145,7 +1145,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: @@ -1201,8 +1201,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. @@ -1263,8 +1263,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. @@ -1676,5 +1676,4 @@ ExecReScanMergeJoin(MergeJoinState *node) ExecReScan(node->js.ps.lefttree); if (node->js.ps.righttree->chgParam == NULL) ExecReScan(node->js.ps.righttree); - } diff --git a/third_party/spanner_pg/src/backend/executor/nodeModifyTable.c b/third_party/spanner_pg/src/backend/executor/nodeModifyTable.c index fd0789e9..6fea82e0 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeModifyTable.c +++ b/third_party/spanner_pg/src/backend/executor/nodeModifyTable.c @@ -3,7 +3,7 @@ * nodeModifyTable.c * routines to handle ModifyTable nodes. * - * 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 * * @@ -20,15 +20,24 @@ * * 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. * + * 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" @@ -61,6 +70,57 @@ 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; + + /* MERGE specific */ + MergeActionState *relaction; /* MERGE action in progress */ + + /* + * Information about the changes that were made concurrently to a tuple + * being updated or deleted + */ + TM_FailureData tmfd; + + /* + * The tuple projected by the INSERT's RETURNING clause, when doing a + * cross-partition UPDATE + */ + TupleTableSlot *cpUpdateReturningSlot; +} 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? */ + + /* + * Lock mode to acquire on the latest tuple version before performing + * EvalPlanQual on it + */ + LockTupleMode lockmode; +} UpdateContext; + + static void ExecBatchInsert(ModifyTableState *mtstate, ResultRelInfo *resultRelInfo, TupleTableSlot **slots, @@ -69,12 +129,16 @@ static void ExecBatchInsert(ModifyTableState *mtstate, EState *estate, bool canSetTag); static void ExecPendingInserts(EState *estate); -static bool ExecOnConflictUpdate(ModifyTableState *mtstate, +static void ExecCrossPartitionUpdateForeignKey(ModifyTableContext *context, + ResultRelInfo *sourcePartInfo, + ResultRelInfo *destPartInfo, + ItemPointer tupleid, + TupleTableSlot *oldslot, + TupleTableSlot *newslot); +static bool ExecOnConflictUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer conflictTid, - TupleTableSlot *planSlot, TupleTableSlot *excludedSlot, - EState *estate, bool canSetTag, TupleTableSlot **returning); static TupleTableSlot *ExecPrepareTupleRouting(ModifyTableState *mtstate, @@ -84,6 +148,20 @@ static TupleTableSlot *ExecPrepareTupleRouting(ModifyTableState *mtstate, TupleTableSlot *slot, ResultRelInfo **partRelInfo); +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); + + /* * Verify that the tuples to be produced by INSERT match the * target relation's rowtype @@ -257,8 +335,9 @@ ExecCheckTIDVisible(EState *estate, * * This fills the resultRelInfo's ri_GeneratedExprs field and makes an * associated ResultRelInfoExtra struct to hold ri_extraUpdatedCols. - * (Currently, ri_extraUpdatedCols is consulted only in UPDATE, but we might - * as well fill it for INSERT too.) + * (Currently, ri_extraUpdatedCols is consulted only in UPDATE, but we + * must fill it in other cases too, since for example cmdtype might be + * MERGE yet an UPDATE might happen later.) */ void ExecInitStoredGenerated(ResultRelInfo *resultRelInfo, @@ -631,7 +710,6 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, return ExecProject(newProj); } - /* ---------------------------------------------------------------- * ExecInsert * @@ -640,10 +718,11 @@ 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. + * *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 @@ -651,15 +730,18 @@ ExecGetUpdateNewTuple(ResultRelInfo *relinfo, * ---------------------------------------------------------------- */ static TupleTableSlot * -ExecInsert(ModifyTableState *mtstate, +ExecInsert(ModifyTableContext *context, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, - TupleTableSlot *planSlot, - EState *estate, - bool canSetTag) + bool canSetTag, + TupleTableSlot **inserted_tuple, + ResultRelInfo **insert_destrel) { + 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; @@ -780,7 +862,7 @@ ExecInsert(ModifyTableState *mtstate, { TupleDesc tdesc = CreateTupleDescCopy(slot->tts_tupleDescriptor); TupleDesc plan_tdesc = - CreateTupleDescCopy(planSlot->tts_tupleDescriptor); + CreateTupleDescCopy(planSlot->tts_tupleDescriptor); resultRelInfo->ri_Slots[resultRelInfo->ri_NumSlots] = MakeSingleTupleTableSlot(tdesc, slot->tts_ops); @@ -871,9 +953,17 @@ ExecInsert(ModifyTableState *mtstate, * 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 @@ -939,9 +1029,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; @@ -1045,11 +1135,14 @@ ExecInsert(ModifyTableState *mtstate, 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 @@ -1083,6 +1176,11 @@ ExecInsert(ModifyTableState *mtstate, if (resultRelInfo->ri_projectReturning) result = ExecProcessReturning(resultRelInfo, slot, planSlot); + if (inserted_tuple) + *inserted_tuple = slot; + if (insert_destrel) + *insert_destrel = resultRelInfo; + return result; } @@ -1151,6 +1249,131 @@ ExecBatchInsert(ModifyTableState *mtstate, resultRelInfo->ri_NumSlots = 0; } +/* + * ExecPendingInserts -- flushes all pending inserts to the foreign tables + */ +static void +ExecPendingInserts(EState *estate) +{ + ListCell *l1, + *l2; + + forboth(l1, estate->es_insert_pending_result_relations, + l2, estate->es_insert_pending_modifytables) + { + ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(l1); + ModifyTableState *mtstate = (ModifyTableState *) lfirst(l2); + + Assert(mtstate); + ExecBatchInsert(mtstate, resultRelInfo, + resultRelInfo->ri_Slots, + resultRelInfo->ri_PlanSlots, + resultRelInfo->ri_NumSlots, + estate, mtstate->canSetTag); + } + + list_free(estate->es_insert_pending_result_relations); + list_free(estate->es_insert_pending_modifytables); + estate->es_insert_pending_result_relations = NIL; + estate->es_insert_pending_modifytables = NIL; +} + +/* + * 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, TM_Result *result) +{ + if (result) + *result = TM_Ok; + + /* BEFORE ROW DELETE triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_delete_before_row) + { + /* Flush any pending inserts, so rows are visible to the triggers */ + if (context->estate->es_insert_pending_result_relations != NIL) + ExecPendingInserts(context->estate); + + return ExecBRDeleteTriggersNew(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, + epqreturnslot, result, &context->tmfd); + } + + 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, bool changingPart) +{ + 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, + NULL, NULL, + tupleid, oldtuple, + NULL, NULL, mtstate->mt_transition_capture, + false); + + /* + * We've already captured the OLD 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, changingPart); +} + /* ---------------------------------------------------------------- * ExecDelete * @@ -1168,50 +1391,38 @@ 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, + TM_Result *tmresult, 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; - - /* Flush any pending inserts, so rows are visible to the triggers */ - if (estate->es_insert_pending_result_relations != NIL) - ExecPendingInserts(estate); - - 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, tmresult)) + return NULL; /* INSTEAD OF ROW DELETE Triggers */ if (resultRelInfo->ri_TrigDesc && @@ -1237,7 +1448,7 @@ ExecDelete(ModifyTableState *mtstate, slot = resultRelInfo->ri_FdwRoutine->ExecForeignDelete(estate, resultRelInfo, slot, - planSlot); + context->planSlot); if (slot == NULL) /* "do nothing" */ return NULL; @@ -1256,20 +1467,17 @@ 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); + + if (tmresult) + *tmresult = result; switch (result) { @@ -1299,7 +1507,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"), @@ -1325,8 +1533,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, @@ -1334,13 +1542,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); @@ -1373,7 +1581,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"), @@ -1436,33 +1644,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 OLD 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, changingPart); /* Process RETURNING if present and if requested */ if (processReturning && resultRelInfo->ri_projectReturning) @@ -1493,7 +1675,7 @@ ldelete:; } } - rslot = ExecProcessReturning(resultRelInfo, slot, planSlot); + rslot = ExecProcessReturning(resultRelInfo, slot, context->planSlot); /* * Before releasing the target tuple again, make sure rslot has a @@ -1509,35 +1691,6 @@ ldelete:; return NULL; } -/* - * ExecPendingInserts -- flushes all pending inserts to the foreign tables - */ -static void -ExecPendingInserts(EState *estate) -{ - ListCell *l1, - *l2; - - forboth(l1, estate->es_insert_pending_result_relations, - l2, estate->es_insert_pending_modifytables) - { - ResultRelInfo *resultRelInfo = (ResultRelInfo *) lfirst(l1); - ModifyTableState *mtstate = (ModifyTableState *) lfirst(l2); - - Assert(mtstate); - ExecBatchInsert(mtstate, resultRelInfo, - resultRelInfo->ri_Slots, - resultRelInfo->ri_PlanSlots, - resultRelInfo->ri_NumSlots, - estate, mtstate->canSetTag); - } - - list_free(estate->es_insert_pending_result_relations); - list_free(estate->es_insert_pending_modifytables); - estate->es_insert_pending_result_relations = NIL; - estate->es_insert_pending_modifytables = NIL; -} - /* * ExecCrossPartitionUpdate --- Move an updated tuple to another partition. * @@ -1551,25 +1704,31 @@ ExecPendingInserts(EState *estate) * 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 that's returned in *retry_slot still needs to be re-routed, and call + * this function again or perform a regular update accordingly. For MERGE, + * the updated tuple is not returned in *retry_slot; it has its own retry + * logic. */ static bool -ExecCrossPartitionUpdate(ModifyTableState *mtstate, +ExecCrossPartitionUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, HeapTuple oldtuple, - TupleTableSlot *slot, TupleTableSlot *planSlot, - EPQState *epqstate, bool canSetTag, + TupleTableSlot *slot, + bool canSetTag, + UpdateContext *updateCxt, + TM_Result *tmresult, TupleTableSlot **retry_slot, - TupleTableSlot **inserted_tuple) + TupleTableSlot **inserted_tuple, + ResultRelInfo **insert_destrel) { + ModifyTableState *mtstate = context->mtstate; EState *estate = mtstate->ps.state; TupleConversionMap *tupconv_map; bool tuple_deleted; TupleTableSlot *epqslot = NULL; - *inserted_tuple = NULL; + context->cpUpdateReturningSlot = NULL; *retry_slot = NULL; /* @@ -1617,12 +1776,12 @@ 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 */ - &tuple_deleted, &epqslot); + false, /* canSetTag */ + tmresult, &tuple_deleted, &epqslot); /* * For some reason if DELETE didn't happen (e.g. trigger prevented it, or @@ -1649,9 +1808,13 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, * another transaction has concurrently updated the same row, it * re-fetches the row, skips the delete, and epqslot is set to the * re-fetched tuple slot. In that case, we need to do all the checks - * again. + * again. For MERGE, we leave everything to the caller (it must do + * additional rechecking, and might end up executing a different + * action entirely). */ - if (TupIsNull(epqslot)) + if (context->relaction != NULL) + return *tmresult == TM_Ok; + else if (TupIsNull(epqslot)) return true; else { @@ -1667,6 +1830,7 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, SnapshotAny, oldSlot)) elog(ERROR, "failed to fetch tuple being updated"); + /* and project the new tuple to retry the UPDATE with */ *retry_slot = ExecGetUpdateNewTuple(resultRelInfo, epqslot, oldSlot); return false; @@ -1685,8 +1849,9 @@ 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, + inserted_tuple, insert_destrel); /* * Reset the transition state that may possibly have been written by @@ -1699,54 +1864,22 @@ ExecCrossPartitionUpdate(ModifyTableState *mtstate, return true; } -/* ---------------------------------------------------------------- - * ExecUpdate - * - * note: we can't run UPDATE queries with transactions - * off because UPDATEs are actually INSERTs and our - * scan will mistakenly loop forever, updating the tuple - * it just inserted.. This should be fixed but until it - * is, we don't want to get stuck in an infinite loop - * which corrupts your database.. - * - * When updating a table, tupleid identifies the tuple to - * update and oldtuple is NULL. When updating a view, oldtuple - * is passed to the INSTEAD OF triggers and identifies what to - * update, and tupleid is invalid. When updating a foreign table, - * tupleid is invalid; the FDW has to figure out which row to - * update using data from the planSlot. oldtuple is passed to - * foreign table triggers; it is NULL when the foreign table has - * no relevant triggers. - * - * slot contains the new tuple value to be stored. - * planSlot is the output of the ModifyTable's subplan; we use it - * to access values from other input tables (for RETURNING), - * row-ID junk columns, etc. +/* + * ExecUpdatePrologue -- subroutine for ExecUpdate * - * Returns RETURNING result if any, otherwise NULL. - * ---------------------------------------------------------------- + * 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 TupleTableSlot * -ExecUpdate(ModifyTableState *mtstate, - ResultRelInfo *resultRelInfo, - ItemPointer tupleid, - HeapTuple oldtuple, - TupleTableSlot *slot, - TupleTableSlot *planSlot, - EPQState *epqstate, - EState *estate, - bool canSetTag) +static bool +ExecUpdatePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, + TM_Result *result) { Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; - TM_Result result; - TM_FailureData tmfd; - List *recheckIndexes = NIL; - /* - * abort the operation if not running transactions - */ - if (IsBootstrapProcessingMode()) - elog(ERROR, "cannot UPDATE during bootstrap"); + if (result) + *result = TM_Ok; ExecMaterializeSlot(slot); @@ -1758,42 +1891,392 @@ ExecUpdate(ModifyTableState *mtstate, resultRelInfo->ri_IndexRelationDescs == NULL) ExecOpenIndices(resultRelInfo, false); - /* BEFORE ROW UPDATE Triggers */ + /* BEFORE ROW UPDATE triggers */ if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->trig_update_before_row) { /* Flush any pending inserts, so rows are visible to the triggers */ - if (estate->es_insert_pending_result_relations != NIL) - ExecPendingInserts(estate); + if (context->estate->es_insert_pending_result_relations != NIL) + ExecPendingInserts(context->estate); - if (!ExecBRUpdateTriggers(estate, epqstate, resultRelInfo, - tupleid, oldtuple, slot)) - return NULL; /* "do nothing" */ + return ExecBRUpdateTriggersNew(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, slot, + result, &context->tmfd); } - /* INSTEAD OF ROW UPDATE Triggers */ - if (resultRelInfo->ri_TrigDesc && - resultRelInfo->ri_TrigDesc->trig_update_instead_row) - { - if (!ExecIRUpdateTriggers(estate, resultRelInfo, - oldtuple, slot)) - return NULL; /* "do nothing" */ - } - else if (resultRelInfo->ri_FdwRoutine) - { - /* - * GENERATED expressions might reference the tableoid column, so - * (re-)initialize tts_tableOid before evaluating them. + return true; +} + +/* + * ExecUpdatePrepareSlot -- subroutine for ExecUpdateAct + * + * Apply the final modifications to the tuple slot before the update. + * (This is split out because we also need it in the foreign-table code path.) + */ +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 move the tuple to a new partition, we loop back here to recompute + * GENERATED values (which are allowed to be different across partitions) + * and recheck any RLS policies and constraints. We do not fire any + * BEFORE triggers of the new partition, however. + */ +lreplace: + /* Fill in GENERATEd columns */ + ExecUpdatePrepareSlot(resultRelInfo, slot, estate); + + /* 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. */ - slot->tts_tableOid = RelationGetRelid(resultRelInfo->ri_RelationDesc); + 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; + ResultRelInfo *insert_destrel = NULL; /* - * Compute stored generated columns + * 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 (resultRelationDesc->rd_att->constr && - resultRelationDesc->rd_att->constr->has_generated_stored) - ExecComputeStoredGenerated(resultRelInfo, estate, slot, - CMD_UPDATE); + if (ExecCrossPartitionUpdate(context, resultRelInfo, + tupleid, oldtuple, slot, + canSetTag, updateCxt, + &result, + &retry_slot, + &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; + } + + /* + * 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 result; + + /* + * ExecCrossPartitionUpdate installed an updated version of the new + * tuple in the retry slot; start over. + */ + slot = retry_slot; + 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, &updateCxt->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) +{ + ModifyTableState *mtstate = context->mtstate; + List *recheckIndexes = NIL; + + /* 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, + NULL, NULL, + tupleid, oldtuple, slot, + recheckIndexes, + mtstate->operation == CMD_INSERT ? + mtstate->mt_oc_transition_capture : + mtstate->mt_transition_capture, + false); + + 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, 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 table \"%s\".", + RelationGetRelationName(rootRelInfo->ri_RelationDesc)))); + } + + /* Perform the root table's triggers. */ + ExecARUpdateTriggers(context->estate, + rootRelInfo, sourcePartInfo, destPartInfo, + tupleid, NULL, newslot, NIL, NULL, true); +} + +/* ---------------------------------------------------------------- + * ExecUpdate + * + * note: we can't run UPDATE queries with transactions + * off because UPDATEs are actually INSERTs and our + * scan will mistakenly loop forever, updating the tuple + * it just inserted.. This should be fixed but until it + * is, we don't want to get stuck in an infinite loop + * which corrupts your database.. + * + * When updating a table, tupleid identifies the tuple to + * update and oldtuple is NULL. When updating a view, oldtuple + * is passed to the INSTEAD OF triggers and identifies what to + * update, and tupleid is invalid. When updating a foreign table, + * tupleid is invalid; the FDW has to figure out which row to + * update using data from the planSlot. oldtuple is passed to + * foreign table triggers; it is NULL when the foreign table has + * no relevant triggers. + * + * slot contains the new tuple value to be stored. + * planSlot is the output of the ModifyTable's subplan; we use it + * to access values from other input tables (for RETURNING), + * row-ID junk columns, etc. + * + * Returns RETURNING result if any, otherwise NULL. + * ---------------------------------------------------------------- + */ +static TupleTableSlot * +ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, + ItemPointer tupleid, HeapTuple oldtuple, TupleTableSlot *slot, + bool canSetTag) +{ + EState *estate = context->estate; + Relation resultRelationDesc = resultRelInfo->ri_RelationDesc; + UpdateContext updateCxt = {0}; + TM_Result result; + + /* + * abort the operation if not running transactions + */ + if (IsBootstrapProcessingMode()) + elog(ERROR, "cannot UPDATE during bootstrap"); + + /* + * Prepare for the update. This includes BEFORE ROW triggers, so we're + * done if it says we are. + */ + if (!ExecUpdatePrologue(context, resultRelInfo, tupleid, oldtuple, slot, NULL)) + return NULL; + + /* INSTEAD OF ROW UPDATE Triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_update_instead_row) + { + if (!ExecIRUpdateTriggers(estate, resultRelInfo, + oldtuple, slot)) + return NULL; /* "do nothing" */ + } + else if (resultRelInfo->ri_FdwRoutine) + { + /* Fill in GENERATEd columns */ + ExecUpdatePrepareSlot(resultRelInfo, slot, estate); /* * update in foreign table: let the FDW do it @@ -1801,7 +2284,7 @@ ExecUpdate(ModifyTableState *mtstate, slot = resultRelInfo->ri_FdwRoutine->ExecForeignUpdate(estate, resultRelInfo, slot, - planSlot); + context->planSlot); if (slot == NULL) /* "do nothing" */ return NULL; @@ -1815,10 +2298,6 @@ ExecUpdate(ModifyTableState *mtstate, } else { - LockTupleMode lockmode; - bool partition_constraint_failed; - bool update_indexes; - /* * If we generate a new candidate tuple after EvalPlanQual testing, we * must loop back here to try again. (We don't need to redo triggers, @@ -1826,102 +2305,17 @@ ExecUpdate(ModifyTableState *mtstate, * done table_tuple_lock to lock the correct tuple, so there's no need * to do them again.) */ -lreplace: - - /* - * 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); - - /* 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) - { - TupleTableSlot *inserted_tuple, - *retry_slot; - bool retry; - - /* - * 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; - } - - /* - * 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); +redo_act: + result = ExecUpdateAct(context, resultRelInfo, tupleid, oldtuple, slot, + canSetTag, &updateCxt); /* - * 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. + * If ExecUpdateAct reports that a cross-partition update was done, + * then the RETURNING tuple (if any) has been projected and there's + * nothing else for us to do. */ - 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) { @@ -1950,7 +2344,7 @@ ExecUpdate(ModifyTableState *mtstate, * 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"), @@ -1977,22 +2371,22 @@ ExecUpdate(ModifyTableState *mtstate, * 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, + updateCxt.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); @@ -2002,7 +2396,8 @@ ExecUpdate(ModifyTableState *mtstate, /* 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; @@ -2013,7 +2408,7 @@ ExecUpdate(ModifyTableState *mtstate, 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 */ @@ -2032,7 +2427,7 @@ ExecUpdate(ModifyTableState *mtstate, * 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"), @@ -2062,41 +2457,17 @@ ExecUpdate(ModifyTableState *mtstate, 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); - - 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); + ExecUpdateEpilogue(context, &updateCxt, resultRelInfo, tupleid, oldtuple, + slot); /* Process RETURNING if present */ if (resultRelInfo->ri_projectReturning) - return ExecProcessReturning(resultRelInfo, slot, planSlot); + return ExecProcessReturning(resultRelInfo, slot, context->planSlot); return NULL; } @@ -2113,15 +2484,14 @@ ExecUpdate(ModifyTableState *mtstate, * 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; @@ -2134,7 +2504,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 @@ -2143,8 +2513,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) @@ -2167,9 +2537,9 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, * 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, @@ -2180,7 +2550,9 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, 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 */ @@ -2189,138 +2561,806 @@ ExecOnConflictUpdate(ModifyTableState *mtstate, case TM_SelfModified: - /* - * This state should never be reached. As a dirty snapshot is used - * to find conflicting tuples, speculative insertion wouldn't have - * seen this row to conflict with. - */ - elog(ERROR, "unexpected self-updated tuple"); - break; + /* + * This state should never be reached. As a dirty snapshot is used + * to find conflicting tuples, speculative insertion wouldn't have + * seen this row to conflict with. + */ + elog(ERROR, "unexpected self-updated tuple"); + break; + + case TM_Updated: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent update"))); + + /* + * As long as we don't support an UPDATE of INSERT ON CONFLICT for + * a partitioned table we shouldn't reach to a case where tuple to + * be lock is moved to another partition due to concurrent update + * of the partition key. + */ + Assert(!ItemPointerIndicatesMovedPartitions(&tmfd.ctid)); + + /* + * Tell caller to try again from the very start. + * + * It does not make sense to use the usual EvalPlanQual() style + * loop here, as the new version of the row might not conflict + * anymore, or the conflicting tuple has actually been deleted. + */ + ExecClearTuple(existing); + return false; + + case TM_Deleted: + if (IsolationUsesXactSnapshot()) + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("could not serialize access due to concurrent delete"))); + + /* see TM_Updated case */ + Assert(!ItemPointerIndicatesMovedPartitions(&tmfd.ctid)); + ExecClearTuple(existing); + return false; + + default: + elog(ERROR, "unrecognized table_tuple_lock status: %u", test); + } + + /* Success, the tuple is locked. */ + + /* + * Verify that the tuple is visible to our MVCC snapshot if the current + * isolation level mandates that. + * + * It's not sufficient to rely on the check within ExecUpdate() as e.g. + * CONFLICT ... WHERE clause may prevent us from reaching that. + * + * This means we only ever continue when a new command in the current + * transaction could see the row, even though in READ COMMITTED mode the + * tuple will not be visible according to the current statement's + * snapshot. This is in line with the way UPDATE deals with newer tuple + * versions. + */ + ExecCheckTupleVisible(context->estate, relation, existing); + + /* + * Make tuple and any needed join variables available to ExecQual and + * ExecProject. The EXCLUDED tuple is installed in ecxt_innertuple, while + * the target's existing tuple is installed in the scantuple. EXCLUDED + * has been made to reference INNER_VAR in setrefs.c, but there is no + * other redirection. + */ + econtext->ecxt_scantuple = existing; + econtext->ecxt_innertuple = excludedSlot; + econtext->ecxt_outertuple = NULL; + + if (!ExecQual(onConflictSetWhere, econtext)) + { + ExecClearTuple(existing); /* see return below */ + InstrCountFiltered1(&mtstate->ps, 1); + return true; /* done with the tuple */ + } + + if (resultRelInfo->ri_WithCheckOptions != NIL) + { + /* + * Check target's existing tuple against UPDATE-applicable USING + * security barrier quals (if any), enforced here as RLS checks/WCOs. + * + * The rewriter creates UPDATE RLS checks/WCOs for UPDATE security + * quals, and stores them as WCOs of "kind" WCO_RLS_CONFLICT_CHECK, + * but that's almost the extent of its special handling for ON + * CONFLICT DO UPDATE. + * + * The rewriter will also have associated UPDATE applicable straight + * RLS checks/WCOs for the benefit of the ExecUpdate() call that + * follows. INSERTs and UPDATEs naturally have mutually exclusive WCO + * kinds, so there is no danger of spurious over-enforcement in the + * INSERT or UPDATE path. + */ + ExecWithCheckOptions(WCO_RLS_CONFLICT_CHECK, resultRelInfo, + existing, + mtstate->ps.state); + } + + /* Project the new tuple version */ + ExecProject(resultRelInfo->ri_onConflict->oc_ProjInfo); + + /* + * Note that it is possible that the target tuple has been modified in + * this session, after the above table_tuple_lock. We choose to not error + * out in that case, in line with ExecUpdate's treatment of similar cases. + * This can happen if an UPDATE is triggered from within ExecQual(), + * ExecWithCheckOptions() or ExecProject() above, e.g. by selecting from a + * wCTE in the ON CONFLICT's SET. + */ + + /* Execute UPDATE with projection */ + *returning = ExecUpdate(context, resultRelInfo, + conflictTid, NULL, + resultRelInfo->ri_onConflict->oc_ProjSlot, + canSetTag); + + /* + * Clear out existing tuple, as there might not be another conflict among + * the next input rows. Don't want to hold resources till the end of the + * query. + */ + ExecClearTuple(existing); + 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; + 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 for UPDATE RLS policies are applied in + * ExecUpdateAct() 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 && commandType != CMD_NOTHING) + { + 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; + if (!ExecUpdatePrologue(context, resultRelInfo, + tupleid, NULL, newslot, &result)) + { + if (result == TM_Ok) + return true; /* "do nothing" */ + break; /* concurrent update/delete */ + } + result = ExecUpdateAct(context, resultRelInfo, tupleid, NULL, + newslot, canSetTag, &updateCxt); + + /* + * As in ExecUpdate(), if ExecUpdateAct() reports that a + * cross-partition update was done, then there's nothing else + * for us to do --- the UPDATE has been turned into a DELETE + * and an INSERT, and we must not perform any of the usual + * post-update tasks. + */ + if (updateCxt.crossPartUpdate) + { + mtstate->mt_merge_updated += 1; + return true; + } + + if (result == TM_Ok && updateCxt.updated) + { + ExecUpdateEpilogue(context, &updateCxt, resultRelInfo, + tupleid, NULL, newslot); + mtstate->mt_merge_updated += 1; + } + break; + + case CMD_DELETE: + context->relaction = relaction; + if (!ExecDeletePrologue(context, resultRelInfo, tupleid, + NULL, NULL, &result)) + { + if (result == TM_Ok) + return true; /* "do nothing" */ + break; /* concurrent update/delete */ + } + 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 && commandType != CMD_NOTHING) + (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. Run EvalPlanQual() with the new version of + * the tuple. If it 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: - case TM_Updated: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent update"))); + /* + * tuple already deleted; tell caller to run NOT + * MATCHED actions + */ + return false; - /* - * As long as we don't support an UPDATE of INSERT ON CONFLICT for - * a partitioned table we shouldn't reach to a case where tuple to - * be lock is moved to another partition due to concurrent update - * of the partition key. - */ - Assert(!ItemPointerIndicatesMovedPartitions(&tmfd.ctid)); + case TM_SelfModified: - /* - * Tell caller to try again from the very start. - * - * It does not make sense to use the usual EvalPlanQual() style - * loop here, as the new version of the row might not conflict - * anymore, or the conflicting tuple has actually been deleted. - */ - ExecClearTuple(existing); - return false; + /* + * 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; - case TM_Deleted: - if (IsolationUsesXactSnapshot()) - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("could not serialize access due to concurrent delete"))); + default: + /* see table_tuple_lock call in ExecDelete() */ + elog(ERROR, "unexpected table_tuple_lock status: %u", + result); + return false; + } + } - /* see TM_Updated case */ - Assert(!ItemPointerIndicatesMovedPartitions(&tmfd.ctid)); - ExecClearTuple(existing); - return false; + case TM_Invisible: + case TM_WouldBlock: + case TM_BeingModified: + /* these should not occur */ + elog(ERROR, "unexpected tuple operation result: %d", result); + break; + } - default: - elog(ERROR, "unrecognized table_tuple_lock status: %u", test); + /* + * We've activated one of the WHEN clauses, so we don't search + * further. This is required behaviour, not an optimization. + */ + break; } - /* Success, the tuple is locked. */ + /* + * 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; /* - * Verify that the tuple is visible to our MVCC snapshot if the current - * isolation level mandates that. - * - * It's not sufficient to rely on the check within ExecUpdate() as e.g. - * CONFLICT ... WHERE clause may prevent us from reaching that. + * 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. * - * This means we only ever continue when a new command in the current - * transaction could see the row, even though in READ COMMITTED mode the - * tuple will not be visible according to the current statement's - * snapshot. This is in line with the way UPDATE deals with newer tuple - * versions. + * XXX does this mean that we can avoid creating copies of actionStates on + * partitioned tables, for not-matched actions? */ - ExecCheckTupleVisible(estate, relation, existing); + actionStates = resultRelInfo->ri_notMatchedMergeAction; /* - * Make tuple and any needed join variables available to ExecQual and - * ExecProject. The EXCLUDED tuple is installed in ecxt_innertuple, while - * the target's existing tuple is installed in the scantuple. EXCLUDED - * has been made to reference INNER_VAR in setrefs.c, but there is no - * other redirection. + * 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 = existing; - econtext->ecxt_innertuple = excludedSlot; + econtext->ecxt_scantuple = NULL; + econtext->ecxt_innertuple = context->planSlot; econtext->ecxt_outertuple = NULL; - if (!ExecQual(onConflictSetWhere, econtext)) + foreach(l, actionStates) { - ExecClearTuple(existing); /* see return below */ - InstrCountFiltered1(&mtstate->ps, 1); - return true; /* done with the tuple */ - } + MergeActionState *action = (MergeActionState *) lfirst(l); + CmdType commandType = action->mas_action->commandType; + TupleTableSlot *newslot; - if (resultRelInfo->ri_WithCheckOptions != NIL) - { /* - * Check target's existing tuple against UPDATE-applicable USING - * security barrier quals (if any), enforced here as RLS checks/WCOs. - * - * The rewriter creates UPDATE RLS checks/WCOs for UPDATE security - * quals, and stores them as WCOs of "kind" WCO_RLS_CONFLICT_CHECK, - * but that's almost the extent of its special handling for ON - * CONFLICT DO UPDATE. + * Test condition, if any. * - * The rewriter will also have associated UPDATE applicable straight - * RLS checks/WCOs for the benefit of the ExecUpdate() call that - * follows. INSERTs and UPDATEs naturally have mutually exclusive WCO - * kinds, so there is no danger of spurious over-enforcement in the - * INSERT or UPDATE path. + * 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). */ - ExecWithCheckOptions(WCO_RLS_CONFLICT_CHECK, resultRelInfo, - existing, - mtstate->ps.state); + 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; } +} - /* Project the new tuple version */ - ExecProject(resultRelInfo->ri_onConflict->oc_ProjInfo); +/* + * 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; - /* - * Note that it is possible that the target tuple has been modified in - * this session, after the above table_tuple_lock. We choose to not error - * out in that case, in line with ExecUpdate's treatment of similar cases. - * This can happen if an UPDATE is triggered from within ExecQual(), - * ExecWithCheckOptions() or ExecProject() above, e.g. by selecting from a - * wCTE in the ON CONFLICT's SET. - */ + if (node->mergeActionLists == NIL) + return; - /* Execute UPDATE with projection */ - *returning = ExecUpdate(mtstate, resultRelInfo, conflictTid, NULL, - resultRelInfo->ri_onConflict->oc_ProjSlot, - planSlot, - &mtstate->mt_epqstate, mtstate->ps.state, - canSetTag); + mtstate->mt_merge_subcommands = 0; + + if (mtstate->ps.ps_ExprContext == NULL) + ExecAssignExprContext(estate, &mtstate->ps); + econtext = mtstate->ps.ps_ExprContext; /* - * Clear out existing tuple, as there might not be another conflict among - * the next input rows. Don't want to hold resources till the end of the - * query. + * 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. */ - ExecClearTuple(existing); - return true; + 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; +} /* * Process BEFORE EACH STATEMENT triggers @@ -2345,6 +3385,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; @@ -2378,6 +3426,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; @@ -2481,17 +3540,17 @@ static TupleTableSlot * ExecModifyTable(PlanState *pstate) { ModifyTableState *node = castNode(ModifyTableState, pstate); + ModifyTableContext context; EState *estate = node->ps.state; CmdType operation = node->operation; ResultRelInfo *resultRelInfo; PlanState *subplanstate; TupleTableSlot *slot; - TupleTableSlot *planSlot; TupleTableSlot *oldSlot; - ItemPointer tupleid; ItemPointerData tuple_ctid; HeapTupleData oldtupdata; HeapTuple oldtuple; + ItemPointer tupleid; CHECK_FOR_INTERRUPTS(); @@ -2529,6 +3588,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,10 +3615,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; /* @@ -2568,10 +3632,28 @@ ExecModifyTable(PlanState *pstate) bool isNull; Oid resultoid; - datum = ExecGetJunkAttribute(planSlot, node->mt_resultOidAttno, + datum = ExecGetJunkAttribute(context.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, context.planSlot); + + 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 */ @@ -2594,25 +3676,26 @@ 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; /* - * 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; @@ -2628,9 +3711,27 @@ 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, context.planSlot); + + 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!! */ @@ -2686,10 +3787,11 @@ 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 = ExecInsert(node, resultRelInfo, slot, planSlot, - estate, node->canSetTag); + slot = ExecGetInsertNewTuple(resultRelInfo, context.planSlot); + slot = ExecInsert(&context, resultRelInfo, slot, + node->canSetTag, NULL, NULL); break; + case CMD_UPDATE: /* Initialize projection info if first time for this table */ if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) @@ -2710,28 +3812,29 @@ 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)) elog(ERROR, "failed to fetch tuple being updated"); } - slot = ExecGetUpdateNewTuple(resultRelInfo, planSlot, + slot = ExecGetUpdateNewTuple(resultRelInfo, context.planSlot, oldSlot); + context.relaction = NULL; /* 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, NULL); break; + + case CMD_MERGE: + slot = ExecMerge(&context, resultRelInfo, tupleid, node->canSetTag); + break; + default: elog(ERROR, "unknown operation"); break; @@ -2852,6 +3955,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: * @@ -2918,8 +4025,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 @@ -2957,12 +4064,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; @@ -2978,20 +4086,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, @@ -3002,19 +4119,23 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } /* - * For INSERT and UPDATE, prepare to evaluate any generated columns. - * (This is probably not necessary any longer, but we'll refrain from - * changing it in back branches, in case extension code expects it.) + * For INSERT/UPDATE/MERGE, prepare to evaluate any generated columns. + * We must do this now, even if we never insert or update any rows, to + * cover the case where a MERGE does some UPDATE operations and later + * some INSERTs. We'll need ri_GeneratedExprs to cover all generated + * columns, so we force it now. (It might be sufficient to do this + * only for operation == CMD_MERGE, but we'll avoid changing the data + * structure definition in back branches.) */ - if (operation == CMD_INSERT || operation == CMD_UPDATE) + if (operation == CMD_INSERT || operation == CMD_UPDATE || operation == CMD_MERGE) ExecInitStoredGenerated(resultRelInfo, estate, operation); } /* - * 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"); @@ -3027,8 +4148,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) @@ -3176,9 +4298,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* * If we have any secondary relations in an UPDATE or DELETE, they need to - * be treated like non-locked relations in SELECT FOR UPDATE, ie, the - * EvalPlanQual mechanism needs to be told about them. Locate the - * relevant ExecRowMarks. + * be treated like non-locked relations in SELECT FOR UPDATE, i.e., the + * EvalPlanQual mechanism needs to be told about them. This also goes for + * the source relations in a MERGE. Locate the relevant ExecRowMarks. */ arowmarks = NIL; foreach(l, node->rowMarks) @@ -3197,6 +4319,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/third_party/spanner_pg/src/backend/executor/nodeNamedtuplestorescan.c b/third_party/spanner_pg/src/backend/executor/nodeNamedtuplestorescan.c index c0d1069f..ca637b1b 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeNamedtuplestorescan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeNamedtuplestorescan.c @@ -3,7 +3,7 @@ * nodeNamedtuplestorescan.c * routines to handle NamedTuplestoreScan nodes. * - * 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/third_party/spanner_pg/src/backend/executor/nodeNestloop.c b/third_party/spanner_pg/src/backend/executor/nodeNestloop.c index 41e5ecab..06767c31 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeNestloop.c +++ b/third_party/spanner_pg/src/backend/executor/nodeNestloop.c @@ -3,7 +3,7 @@ * nodeNestloop.c * routines to support nest-loop joins * - * 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/third_party/spanner_pg/src/backend/executor/nodeProjectSet.c b/third_party/spanner_pg/src/backend/executor/nodeProjectSet.c index d441a57c..cf5118ea 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeProjectSet.c +++ b/third_party/spanner_pg/src/backend/executor/nodeProjectSet.c @@ -11,7 +11,7 @@ * can't be inside more-complex expressions. If that'd otherwise be * the case, the planner adds additional ProjectSet nodes. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/executor/nodeRecursiveunion.c b/third_party/spanner_pg/src/backend/executor/nodeRecursiveunion.c index f9e91fdc..2d01ed77 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeRecursiveunion.c +++ b/third_party/spanner_pg/src/backend/executor/nodeRecursiveunion.c @@ -7,7 +7,7 @@ * already seen. The hash key is computed from the grouping columns. * * - * 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/third_party/spanner_pg/src/backend/executor/nodeResult.c b/third_party/spanner_pg/src/backend/executor/nodeResult.c index 0946af0a..d0413e05 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeResult.c +++ b/third_party/spanner_pg/src/backend/executor/nodeResult.c @@ -34,7 +34,7 @@ * plan normally and pass back the results. * * - * 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 * * IDENTIFICATION @@ -195,7 +195,7 @@ ExecInitResult(Result *node, EState *estate, int eflags) resstate->ps.ExecProcNode = ExecResult; resstate->rs_done = false; - resstate->rs_checkqual = (node->resconstantqual == NULL) ? false : true; + resstate->rs_checkqual = (node->resconstantqual != NULL); /* * Miscellaneous initialization @@ -260,7 +260,7 @@ void ExecReScanResult(ResultState *node) { node->rs_done = false; - node->rs_checkqual = (node->resconstantqual == NULL) ? false : true; + node->rs_checkqual = (node->resconstantqual != NULL); /* * If chgParam of subnode is not null then plan will be re-scanned by diff --git a/third_party/spanner_pg/src/backend/executor/nodeSamplescan.c b/third_party/spanner_pg/src/backend/executor/nodeSamplescan.c index 44232d50..a03ae120 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSamplescan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSamplescan.c @@ -3,7 +3,7 @@ * nodeSamplescan.c * Support routines for sample scans of relations (table sampling). * - * 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 * * @@ -17,6 +17,7 @@ #include "access/relscan.h" #include "access/tableam.h" #include "access/tsmapi.h" +#include "common/pg_prng.h" #include "executor/executor.h" #include "executor/nodeSamplescan.h" #include "miscadmin.h" @@ -154,7 +155,7 @@ ExecInitSampleScan(SampleScan *node, EState *estate, int eflags) * do this just once, since the seed shouldn't change over rescans. */ if (tsc->repeatable == NULL) - scanstate->seed = random(); + scanstate->seed = pg_prng_uint32(&pg_global_prng_state); /* * Finally, initialize the TABLESAMPLE method handler. diff --git a/third_party/spanner_pg/src/backend/executor/nodeSeqscan.c b/third_party/spanner_pg/src/backend/executor/nodeSeqscan.c index 066f9ae3..7b58cd91 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSeqscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSeqscan.c @@ -3,7 +3,7 @@ * nodeSeqscan.c * Support routines for sequential scans of relations. * - * 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 * * @@ -151,7 +151,7 @@ ExecInitSeqScan(SeqScan *node, EState *estate, int eflags) */ scanstate->ss.ss_currentRelation = ExecOpenScanRelation(estate, - node->scanrelid, + node->scan.scanrelid, eflags); /* and create slot with the appropriate rowtype */ @@ -169,7 +169,7 @@ ExecInitSeqScan(SeqScan *node, EState *estate, int eflags) * initialize child expressions */ scanstate->ss.ps.qual = - ExecInitQual(node->plan.qual, (PlanState *) scanstate); + ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate); return scanstate; } diff --git a/third_party/spanner_pg/src/backend/executor/nodeSetOp.c b/third_party/spanner_pg/src/backend/executor/nodeSetOp.c index aad7ac0e..4b428cfa 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSetOp.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSetOp.c @@ -32,7 +32,7 @@ * input group. * * - * 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/third_party/spanner_pg/src/backend/executor/nodeSort.c b/third_party/spanner_pg/src/backend/executor/nodeSort.c index b99027e0..37ad3570 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSort.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSort.c @@ -3,7 +3,7 @@ * nodeSort.c * Routines to handle sorting of relations. * - * 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 * * @@ -29,6 +29,16 @@ * which saves the results in a temporary file or memory. After the * initial call, returns a tuple from the file with each call. * + * There are two distinct ways that this sort can be performed: + * + * 1) When the result is a single column we perform a Datum sort. + * + * 2) When the result contains multiple columns we perform a tuple sort. + * + * We could do this by always performing a tuple sort, however sorting + * Datums only can be significantly faster than sorting tuples, + * especially when the Datums are of a pass-by-value type. + * * Conditions: * -- none. * @@ -67,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"); @@ -86,31 +97,61 @@ ExecSort(PlanState *pstate) outerNode = outerPlanState(node); tupDesc = ExecGetResultType(outerNode); - tuplesortstate = tuplesort_begin_heap(tupDesc, - plannode->numCols, - plannode->sortColIdx, - plannode->sortOperators, - plannode->collations, - plannode->nullsFirst, - work_mem, - NULL, - node->randomAccess); + if (node->randomAccess) + tuplesortopts |= TUPLESORT_RANDOMACCESS; + if (node->bounded) + tuplesortopts |= TUPLESORT_ALLOWBOUNDED; + + if (node->datumSort) + tuplesortstate = tuplesort_begin_datum(TupleDescAttr(tupDesc, 0)->atttypid, + plannode->sortOperators[0], + plannode->collations[0], + plannode->nullsFirst[0], + work_mem, + NULL, + tuplesortopts); + else + tuplesortstate = tuplesort_begin_heap(tupDesc, + plannode->numCols, + plannode->sortColIdx, + plannode->sortOperators, + plannode->collations, + plannode->nullsFirst, + work_mem, + NULL, + tuplesortopts); if (node->bounded) tuplesort_set_bound(tuplesortstate, node->bound); node->tuplesortstate = (void *) tuplesortstate; /* - * Scan the subplan and feed all the tuples to tuplesort. + * Scan the subplan and feed all the tuples to tuplesort using the + * appropriate method based on the type of sort we're doing. */ - - for (;;) + if (node->datumSort) { - slot = ExecProcNode(outerNode); - - if (TupIsNull(slot)) - break; - - tuplesort_puttupleslot(tuplesortstate, slot); + for (;;) + { + slot = ExecProcNode(outerNode); + + if (TupIsNull(slot)) + break; + slot_getsomeattrs(slot, 1); + tuplesort_putdatum(tuplesortstate, + slot->tts_values[0], + slot->tts_isnull[0]); + } + } + else + { + for (;;) + { + slot = ExecProcNode(outerNode); + + if (TupIsNull(slot)) + break; + tuplesort_puttupleslot(tuplesortstate, slot); + } } /* @@ -144,15 +185,27 @@ ExecSort(PlanState *pstate) SO1_printf("ExecSort: %s\n", "retrieving tuple from tuplesort"); + slot = node->ss.ps.ps_ResultTupleSlot; + /* - * Get the first or next tuple from tuplesort. Returns NULL if no more - * tuples. Note that we only rely on slot tuple remaining valid until the - * next fetch from the tuplesort. + * Fetch the next sorted item from the appropriate tuplesort function. For + * datum sorts we must manage the slot ourselves and leave it clear when + * tuplesort_getdatum returns false to indicate there are no more datums. + * For tuple sorts, tuplesort_gettupleslot manages the slot for us and + * empties the slot when it runs out of tuples. */ - slot = node->ss.ps.ps_ResultTupleSlot; - (void) tuplesort_gettupleslot(tuplesortstate, - ScanDirectionIsForward(dir), - false, slot, NULL); + if (node->datumSort) + { + ExecClearTuple(slot); + if (tuplesort_getdatum(tuplesortstate, ScanDirectionIsForward(dir), + &(slot->tts_values[0]), &(slot->tts_isnull[0]), NULL)) + ExecStoreVirtualTuple(slot); + } + else + (void) tuplesort_gettupleslot(tuplesortstate, + ScanDirectionIsForward(dir), + false, slot, NULL); + return slot; } @@ -167,6 +220,7 @@ SortState * ExecInitSort(Sort *node, EState *estate, int eflags) { SortState *sortstate; + TupleDesc outerTupDesc; SO1_printf("ExecInitSort: %s\n", "initializing sort node"); @@ -221,6 +275,17 @@ ExecInitSort(Sort *node, EState *estate, int eflags) ExecInitResultTupleSlotTL(&sortstate->ss.ps, &TTSOpsMinimalTuple); sortstate->ss.ps.ps_ProjInfo = NULL; + outerTupDesc = ExecGetResultType(outerPlanState(sortstate)); + + /* + * We perform a Datum sort when we're sorting just a single byval column, + * otherwise we perform a tuple sort. + */ + if (outerTupDesc->natts == 1 && TupleDescAttr(outerTupDesc, 0)->attbyval) + sortstate->datumSort = true; + else + sortstate->datumSort = false; + SO1_printf("ExecInitSort: %s\n", "sort node initialized"); diff --git a/third_party/spanner_pg/src/backend/executor/nodeSubplan.c b/third_party/spanner_pg/src/backend/executor/nodeSubplan.c index b398bea2..4abeae4b 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSubplan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSubplan.c @@ -11,7 +11,7 @@ * subplans, which are re-evaluated every time their result is required. * * - * 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 * * IDENTIFICATION @@ -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" @@ -534,7 +534,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/third_party/spanner_pg/src/backend/executor/nodeSubqueryscan.c b/third_party/spanner_pg/src/backend/executor/nodeSubqueryscan.c index c09f628d..242c9cd4 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeSubqueryscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeSubqueryscan.c @@ -7,7 +7,7 @@ * we need two sets of code. Ought to look at trying to unify the cases. * * - * 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/third_party/spanner_pg/src/backend/executor/nodeTableFuncscan.c b/third_party/spanner_pg/src/backend/executor/nodeTableFuncscan.c index a1b5c76b..f280c119 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeTableFuncscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeTableFuncscan.c @@ -3,7 +3,7 @@ * nodeTableFuncscan.c * Support routines for scanning RangeTableFunc (XMLTABLE like functions). * - * 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 * * @@ -14,11 +14,11 @@ */ /* * INTERFACE ROUTINES - * ExecTableFuncscan scans a function. + * ExecTableFuncScan scans a function. * ExecFunctionNext retrieve next tuple in sequential order. - * ExecInitTableFuncscan creates and initializes a TableFuncscan node. - * ExecEndTableFuncscan releases any storage allocated. - * ExecReScanTableFuncscan rescans the function + * ExecInitTableFuncScan creates and initializes a TableFuncscan node. + * ExecEndTableFuncScan releases any storage allocated. + * ExecReScanTableFuncScan rescans the function */ #include "postgres.h" @@ -49,7 +49,7 @@ static void tfuncLoadRows(TableFuncScanState *tstate, ExprContext *econtext); /* ---------------------------------------------------------------- * TableFuncNext * - * This is a workhorse for ExecTableFuncscan + * This is a workhorse for ExecTableFuncScan * ---------------------------------------------------------------- */ static TupleTableSlot * @@ -87,7 +87,7 @@ TableFuncRecheck(TableFuncScanState *node, TupleTableSlot *slot) } /* ---------------------------------------------------------------- - * ExecTableFuncscan(node) + * ExecTableFuncScan(node) * * Scans the function sequentially and returns the next qualifying * tuple. @@ -106,7 +106,7 @@ ExecTableFuncScan(PlanState *pstate) } /* ---------------------------------------------------------------- - * ExecInitTableFuncscan + * ExecInitTableFuncScan * ---------------------------------------------------------------- */ TableFuncScanState * @@ -208,7 +208,7 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags) } /* ---------------------------------------------------------------- - * ExecEndTableFuncscan + * ExecEndTableFuncScan * * frees any storage allocated through C routines. * ---------------------------------------------------------------- @@ -237,7 +237,7 @@ ExecEndTableFuncScan(TableFuncScanState *node) } /* ---------------------------------------------------------------- - * ExecReScanTableFuncscan + * ExecReScanTableFuncScan * * Rescans the relation. * ---------------------------------------------------------------- @@ -367,7 +367,7 @@ tfuncInitialize(TableFuncScanState *tstate, ExprContext *econtext, Datum doc) forboth(lc1, tstate->ns_uris, lc2, tstate->ns_names) { ExprState *expr = (ExprState *) lfirst(lc1); - Value *ns_node = (Value *) lfirst(lc2); + String *ns_node = lfirst_node(String, lc2); char *ns_uri; char *ns_name; diff --git a/third_party/spanner_pg/src/backend/executor/nodeTidrangescan.c b/third_party/spanner_pg/src/backend/executor/nodeTidrangescan.c index 2b0d205d..d5bf1be7 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeTidrangescan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeTidrangescan.c @@ -3,7 +3,7 @@ * nodeTidrangescan.c * Routines to support TID range scans of relations * - * 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/third_party/spanner_pg/src/backend/executor/nodeTidscan.c b/third_party/spanner_pg/src/backend/executor/nodeTidscan.c index 48c3737d..4116d1f3 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeTidscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeTidscan.c @@ -3,7 +3,7 @@ * nodeTidscan.c * Routines to support direct tid scans of relations * - * 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/third_party/spanner_pg/src/backend/executor/nodeUnique.c b/third_party/spanner_pg/src/backend/executor/nodeUnique.c index 9214d6fd..6c99d13a 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeUnique.c +++ b/third_party/spanner_pg/src/backend/executor/nodeUnique.c @@ -11,7 +11,7 @@ * (It's debatable whether the savings justifies carrying two plan node * types, though.) * - * 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/third_party/spanner_pg/src/backend/executor/nodeValuesscan.c b/third_party/spanner_pg/src/backend/executor/nodeValuesscan.c index 5de1429f..dda1c59b 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeValuesscan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeValuesscan.c @@ -4,7 +4,7 @@ * Support routines for scanning Values lists * ("VALUES (...), (...), ..." in rangetable). * - * 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 * * @@ -285,7 +285,7 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) i = 0; foreach(vtl, node->values_lists) { - List *exprs = castNode(List, lfirst(vtl)); + List *exprs = lfirst_node(List, vtl); scanstate->exprlists[i] = exprs; diff --git a/third_party/spanner_pg/src/backend/executor/nodeWindowAgg.c b/third_party/spanner_pg/src/backend/executor/nodeWindowAgg.c index ee9b7d08..1a6e11db 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeWindowAgg.c +++ b/third_party/spanner_pg/src/backend/executor/nodeWindowAgg.c @@ -23,7 +23,7 @@ * aggregate function over all rows in the current row's window frame. * * - * 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 * * IDENTIFICATION @@ -1250,6 +1250,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 @@ -1258,7 +1272,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); @@ -1297,9 +1311,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); @@ -2025,13 +2046,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; /* @@ -2101,143 +2123,244 @@ 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); - if (winstate->more_partitions) + /* 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); + + /* + * 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; + + /* + * If we're not the top-window, we'd better NULLify + * the aggregate results. In pass-through mode we no + * longer update these and this avoids the old stale + * results lingering. Some of these might be byref + * types so we can't have them pointing to free'd + * memory. The planner insisted that quals used in + * the runcondition are strict, so the top-level + * WindowAgg will filter these NULLs out in the filter + * clause. + */ + numfuncs = winstate->numfuncs; + for (i = 0; i < numfuncs; i++) + { + econtext->ecxt_aggvalues[i] = (Datum) 0; + econtext->ecxt_aggnulls[i] = true; + } + } + } + else + { + /* + * Pass-through not required. We can just return NULL. + * Nothing else will match the runcondition. + */ + winstate->status = WINDOWAGG_DONE; + return NULL; + } + } + + /* + * 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; + } - return ExecProject(winstate->ss.ps.ps_ProjInfo); + /* + * 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; } /* ----------------- @@ -2302,12 +2425,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 @@ -2502,6 +2645,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; @@ -2581,7 +2727,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/third_party/spanner_pg/src/backend/executor/nodeWorktablescan.c b/third_party/spanner_pg/src/backend/executor/nodeWorktablescan.c index 91d3bf37..15fd71fb 100644 --- a/third_party/spanner_pg/src/backend/executor/nodeWorktablescan.c +++ b/third_party/spanner_pg/src/backend/executor/nodeWorktablescan.c @@ -3,7 +3,7 @@ * nodeWorktablescan.c * routines to handle WorkTableScan nodes. * - * 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/third_party/spanner_pg/src/backend/executor/spi.c b/third_party/spanner_pg/src/backend/executor/spi.c index bccbcffb..deb596af 100644 --- a/third_party/spanner_pg/src/backend/executor/spi.c +++ b/third_party/spanner_pg/src/backend/executor/spi.c @@ -3,7 +3,7 @@ * spi.c * Server Programming Interface * - * 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 * * @@ -230,6 +230,7 @@ static void _SPI_commit(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + SavedTransactionCharacteristics savetc; /* * Complain if we are in a context that doesn't permit transaction @@ -257,9 +258,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(); @@ -283,7 +283,7 @@ _SPI_commit(bool chain) /* Immediately start a new transaction */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -307,7 +307,7 @@ _SPI_commit(bool chain) /* ... and start a new one */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -335,6 +335,7 @@ static void _SPI_rollback(bool chain) { MemoryContext oldcontext = CurrentMemoryContext; + SavedTransactionCharacteristics savetc; /* see under SPI_commit() */ if (_SPI_current->atomic) @@ -348,9 +349,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(); @@ -375,7 +375,7 @@ _SPI_rollback(bool chain) /* Immediately start a new transaction */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -400,7 +400,7 @@ _SPI_rollback(bool chain) /* ... and start a new one */ StartTransactionCommand(); if (chain) - RestoreTransactionCharacteristics(); + RestoreTransactionCharacteristics(&savetc); MemoryContextSwitchTo(oldcontext); @@ -424,16 +424,6 @@ SPI_rollback_and_chain(void) _SPI_rollback(true); } -/* - * SPICleanup is a no-op, kept for backwards compatibility. We rely on - * AtEOXact_SPI to cleanup. Extensions should not (need to) fiddle with the - * internal SPI state directly. - */ -void -SPICleanup(void) -{ -} - /* * Clean up SPI state at transaction commit or abort. */ @@ -1152,7 +1142,7 @@ SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum, if (attnum[i] <= 0 || attnum[i] > numberOfAttributes) break; v[attnum[i] - 1] = Values[i]; - n[attnum[i] - 1] = (Nulls && Nulls[i] == 'n') ? true : false; + n[attnum[i] - 1] = (Nulls && Nulls[i] == 'n'); } if (i == natts) /* no errors in *attnum */ @@ -2043,6 +2033,8 @@ SPI_result_code_string(int code) return "SPI_OK_REL_UNREGISTER"; case SPI_OK_TD_REGISTER: return "SPI_OK_TD_REGISTER"; + case SPI_OK_MERGE: + return "SPI_OK_MERGE"; } /* Unrecognized code ... return something useful ... */ sprintf(buf, "Unrecognized SPI code %d", code); @@ -2272,7 +2264,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, @@ -2280,11 +2272,11 @@ _SPI_prepare_plan(const char *src, SPIPlanPtr plan) } else { - stmt_list = pg_analyze_and_rewrite(parsetree, - src, - plan->argtypes, - plan->nargs, - _SPI_current->queryEnv); + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, + src, + plan->argtypes, + plan->nargs, + _SPI_current->queryEnv); } /* Finish filling in the CachedPlanSource */ @@ -2509,7 +2501,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, @@ -2517,11 +2509,11 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, } else { - stmt_list = pg_analyze_and_rewrite(parsetree, - src, - plan->argtypes, - plan->nargs, - _SPI_current->queryEnv); + stmt_list = pg_analyze_and_rewrite_fixedparams(parsetree, + src, + plan->argtypes, + plan->nargs, + _SPI_current->queryEnv); } /* Finish filling in the CachedPlanSource */ @@ -2895,6 +2887,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/third_party/spanner_pg/src/backend/executor/tqueue.c b/third_party/spanner_pg/src/backend/executor/tqueue.c index 7af9fbe9..3449b803 100644 --- a/third_party/spanner_pg/src/backend/executor/tqueue.c +++ b/third_party/spanner_pg/src/backend/executor/tqueue.c @@ -8,7 +8,7 @@ * * A TupleQueueReader reads tuples from a shm_mq and returns the tuples. * - * 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 * * IDENTIFICATION @@ -60,7 +60,7 @@ tqueueReceiveSlot(TupleTableSlot *slot, DestReceiver *self) /* Send the tuple itself. */ tuple = ExecFetchSlotMinimalTuple(slot, &should_free); - result = shm_mq_send(tqueue->queue, tuple->t_len, tuple, false); + result = shm_mq_send(tqueue->queue, tuple->t_len, tuple, false, false); if (should_free) pfree(tuple); diff --git a/third_party/spanner_pg/src/backend/executor/tstoreReceiver.c b/third_party/spanner_pg/src/backend/executor/tstoreReceiver.c index e07664ff..0a19904b 100644 --- a/third_party/spanner_pg/src/backend/executor/tstoreReceiver.c +++ b/third_party/spanner_pg/src/backend/executor/tstoreReceiver.c @@ -11,7 +11,7 @@ * Also optionally, we can apply a tuple conversion map before storing. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/foreign/foreign.c b/third_party/spanner_pg/src/backend/foreign/foreign.c index 5564dc3a..e60394c7 100644 --- a/third_party/spanner_pg/src/backend/foreign/foreign.c +++ b/third_party/spanner_pg/src/backend/foreign/foreign.c @@ -3,7 +3,7 @@ * foreign.c * support for foreign-data wrappers, servers and user mappings. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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" @@ -499,46 +500,29 @@ 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; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - Datum values[2]; - bool nulls[2]; - 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"))); + List *options; + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; - oldcontext = MemoryContextSwitchTo(per_query_ctx); + options = untransformRelOptions(array); + rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - /* - * 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; + /* prepare the result set */ + InitMaterializedSRF(fcinfo, MAT_SRF_USE_EXPECTED_DESC); foreach(cell, options) { DefElem *def = lfirst(cell); + Datum values[2]; + bool nulls[2]; values[0] = CStringGetTextDatum(def->defname); nulls[0] = false; @@ -552,28 +536,10 @@ deflist_to_tuplestore(ReturnSetInfo *rsinfo, List *options) values[1] = (Datum) 0; nulls[1] = true; } - tuplestore_putvalues(tupstore, tupdesc, values, nulls); + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, + values, nulls); } - /* clean up and return the tuplestore */ - tuplestore_donestoring(tupstore); - - 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; } @@ -670,8 +636,10 @@ postgresql_fdw_validator(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("invalid option \"%s\"", def->defname), - errhint("Valid options in this context are: %s", - buf.data))); + buf.len > 0 + ? errhint("Valid options in this context are: %s", + buf.data) + : errhint("There are no valid options in this context."))); PG_RETURN_BOOL(false); } diff --git a/third_party/spanner_pg/src/backend/jit/Makefile b/third_party/spanner_pg/src/backend/jit/Makefile index a895ebac..a9a603e6 100644 --- a/third_party/spanner_pg/src/backend/jit/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/backend/jit/jit.c b/third_party/spanner_pg/src/backend/jit/jit.c index 2da300e0..18d168f1 100644 --- a/third_party/spanner_pg/src/backend/jit/jit.c +++ b/third_party/spanner_pg/src/backend/jit/jit.c @@ -8,7 +8,7 @@ * should end up here. * * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/jit.c @@ -198,7 +198,7 @@ file_exists(const char *name) AssertArg(name != NULL); if (stat(name, &st) == 0) - return S_ISDIR(st.st_mode) ? false : true; + return !S_ISDIR(st.st_mode); else if (!(errno == ENOENT || errno == ENOTDIR)) ereport(ERROR, (errcode_for_file_access(), diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit.c b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit.c index b888fad0..a4b9ede1 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit.c +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit.c @@ -3,7 +3,7 @@ * llvmjit.c * Core part of the LLVM JIT provider. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit.c @@ -47,6 +47,8 @@ #include "utils/memutils.h" #include "utils/resowner_private.h" +#define LLVMJIT_LLVM_CONTEXT_REUSE_MAX 100 + /* Handle of a module emitted via ORC JIT */ typedef struct LLVMJitHandle { @@ -100,8 +102,15 @@ LLVMModuleRef llvm_types_module = NULL; static bool llvm_session_initialized = false; static size_t llvm_generation = 0; + +/* number of LLVMJitContexts that currently are in use */ +static size_t llvm_jit_context_in_use_count = 0; + +/* how many times has the current LLVMContextRef been used */ +static size_t llvm_llvm_context_reuse_count = 0; static const char *llvm_triple = NULL; static const char *llvm_layout = NULL; +static LLVMContextRef llvm_context; static LLVMTargetRef llvm_targetref; @@ -122,6 +131,8 @@ static void llvm_compile_module(LLVMJitContext *context); static void llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module); static void llvm_create_types(void); +static void llvm_set_target(void); +static void llvm_recreate_llvm_context(void); static uint64_t llvm_resolve_symbol(const char *name, void *ctx); #if LLVM_VERSION_MAJOR > 11 @@ -143,6 +154,63 @@ _PG_jit_provider_init(JitProviderCallbacks *cb) cb->compile_expr = llvm_compile_expr; } + +/* + * Every now and then create a new LLVMContextRef. Unfortunately, during every + * round of inlining, types may "leak" (they can still be found/used via the + * context, but new types will be created the next time in inlining is + * performed). To prevent that from slowly accumulating problematic amounts of + * memory, recreate the LLVMContextRef we use. We don't want to do so too + * often, as that implies some overhead (particularly re-loading the module + * summaries / modules is fairly expensive). A future TODO would be to make + * this more finegrained and only drop/recreate the LLVMContextRef when we know + * there has been inlining. If we can get the size of the context from LLVM + * then that might be a better way to determine when to drop/recreate rather + * then the usagecount heuristic currently employed. + */ +static void +llvm_recreate_llvm_context(void) +{ + if (!llvm_context) + elog(ERROR, "Trying to recreate a non-existing context"); + + /* + * We can only safely recreate the LLVM context if no other code is being + * JITed, otherwise we'd release the types in use for that. + */ + if (llvm_jit_context_in_use_count > 0) + { + llvm_llvm_context_reuse_count++; + return; + } + + if (llvm_llvm_context_reuse_count <= LLVMJIT_LLVM_CONTEXT_REUSE_MAX) + { + llvm_llvm_context_reuse_count++; + return; + } + + /* + * Need to reset the modules that the inlining code caches before + * disposing of the context. LLVM modules exist within a specific LLVM + * context, therefore disposing of the context before resetting the cache + * would lead to dangling pointers to modules. + */ + llvm_inline_reset_caches(); + + LLVMContextDispose(llvm_context); + llvm_context = LLVMContextCreate(); + llvm_llvm_context_reuse_count = 0; + + /* + * Re-build cached type information, so code generation code can rely on + * that information to be present (also prevents the variables to be + * dangling references). + */ + llvm_create_types(); +} + + /* * Create a context for JITing work. * @@ -159,6 +227,8 @@ llvm_create_context(int jitFlags) llvm_session_initialize(); + llvm_recreate_llvm_context(); + ResourceOwnerEnlargeJIT(CurrentResourceOwner); context = MemoryContextAllocZero(TopMemoryContext, @@ -169,6 +239,8 @@ llvm_create_context(int jitFlags) context->base.resowner = CurrentResourceOwner; ResourceOwnerRememberJIT(CurrentResourceOwner, PointerGetDatum(context)); + llvm_jit_context_in_use_count++; + return context; } @@ -178,9 +250,15 @@ llvm_create_context(int jitFlags) static void llvm_release_context(JitContext *context) { - LLVMJitContext *llvm_context = (LLVMJitContext *) context; + LLVMJitContext *llvm_jit_context = (LLVMJitContext *) context; ListCell *lc; + /* + * Consider as cleaned up even if we skip doing so below, that way we can + * verify the tracking is correct (see llvm_shutdown()). + */ + llvm_jit_context_in_use_count--; + /* * When this backend is exiting, don't clean up LLVM. As an error might * have occurred from within LLVM, we do not want to risk reentering. All @@ -191,13 +269,13 @@ llvm_release_context(JitContext *context) llvm_enter_fatal_on_oom(); - if (llvm_context->module) + if (llvm_jit_context->module) { - LLVMDisposeModule(llvm_context->module); - llvm_context->module = NULL; + LLVMDisposeModule(llvm_jit_context->module); + llvm_jit_context->module = NULL; } - foreach(lc, llvm_context->handles) + foreach(lc, llvm_jit_context->handles) { LLVMJitHandle *jit_handle = (LLVMJitHandle *) lfirst(lc); @@ -227,8 +305,8 @@ llvm_release_context(JitContext *context) pfree(jit_handle); } - list_free(llvm_context->handles); - llvm_context->handles = NIL; + list_free(llvm_jit_context->handles); + llvm_jit_context->handles = NIL; llvm_leave_fatal_on_oom(); } @@ -248,7 +326,7 @@ llvm_mutable_module(LLVMJitContext *context) { context->compiled = false; context->module_generation = llvm_generation++; - context->module = LLVMModuleCreateWithName("pg"); + context->module = LLVMModuleCreateWithNameInContext("pg", llvm_context); LLVMSetTarget(context->module, llvm_triple); LLVMSetDataLayout(context->module, llvm_layout); } @@ -832,6 +910,14 @@ llvm_session_initialize(void) LLVMInitializeNativeAsmPrinter(); LLVMInitializeNativeAsmParser(); + if (llvm_context == NULL) + { + llvm_context = LLVMContextCreate(); + + llvm_jit_context_in_use_count = 0; + llvm_llvm_context_reuse_count = 0; + } + /* * When targeting LLVM 15, turn off opaque pointers for the context we * build our code in. We don't need to do so for other contexts (e.g. @@ -851,6 +937,11 @@ llvm_session_initialize(void) */ llvm_create_types(); + /* + * Extract target information from loaded module. + */ + llvm_set_target(); + if (LLVMGetTargetFromTriple(llvm_triple, &llvm_targetref, &error) != 0) { elog(FATAL, "failed to query triple %s", error); @@ -937,8 +1028,8 @@ llvm_shutdown(int code, Datum arg) * has occurred in the middle of LLVM code. It is not safe to call back * into LLVM (which is why a FATAL error was thrown). * - * We do need to shutdown LLVM in other shutdown cases, otherwise - * e.g. profiling data won't be written out. + * We do need to shutdown LLVM in other shutdown cases, otherwise e.g. + * profiling data won't be written out. */ if (llvm_in_fatal_on_oom()) { @@ -946,6 +1037,10 @@ llvm_shutdown(int code, Datum arg) return; } + if (llvm_jit_context_in_use_count != 0) + elog(PANIC, "LLVMJitContext in use count not 0 at exit (is %zu)", + llvm_jit_context_in_use_count); + #if LLVM_VERSION_MAJOR > 11 { if (llvm_opt3_orc) @@ -1008,6 +1103,23 @@ load_return_type(LLVMModuleRef mod, const char *name) return typ; } +/* + * Load triple & layout from clang emitted file so we're guaranteed to be + * compatible. + */ +static void +llvm_set_target(void) +{ + if (!llvm_types_module) + elog(ERROR, "failed to extract target information, llvmjit_types.c not loaded"); + + if (llvm_triple == NULL) + llvm_triple = pstrdup(LLVMGetTarget(llvm_types_module)); + + if (llvm_layout == NULL) + llvm_layout = pstrdup(LLVMGetDataLayoutStr(llvm_types_module)); +} + /* * Load required information, types, function signatures from llvmjit_types.c * and make them available in global variables. @@ -1031,19 +1143,12 @@ llvm_create_types(void) } /* eagerly load contents, going to need it all */ - if (LLVMParseBitcode2(buf, &llvm_types_module)) + if (LLVMParseBitcodeInContext2(llvm_context, buf, &llvm_types_module)) { - elog(ERROR, "LLVMParseBitcode2 of %s failed", path); + elog(ERROR, "LLVMParseBitcodeInContext2 of %s failed", path); } LLVMDisposeMemoryBuffer(buf); - /* - * Load triple & layout from clang emitted file so we're guaranteed to be - * compatible. - */ - llvm_triple = pstrdup(LLVMGetTarget(llvm_types_module)); - llvm_layout = pstrdup(LLVMGetDataLayoutStr(llvm_types_module)); - TypeSizeT = llvm_pg_var_type("TypeSizeT"); TypeParamBool = load_return_type(llvm_types_module, "FunctionReturningBool"); TypeStorageBool = llvm_pg_var_type("TypeStorageBool"); diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_deform.c b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_deform.c index 60a677ba..489ef34e 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_deform.c +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_deform.c @@ -7,7 +7,7 @@ * knowledge of the tuple descriptor. Fixed column widths, NOT NULLness, etc * can be taken advantage of. * - * 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 * * IDENTIFICATION @@ -37,6 +37,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, char *funcname; LLVMModuleRef mod; + LLVMContextRef lc; LLVMBuilderRef b; LLVMTypeRef deform_sig; @@ -99,6 +100,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, return NULL; mod = llvm_mutable_module(context); + lc = LLVMGetModuleContext(mod); funcname = llvm_expand_funcname(context, "deform"); @@ -133,8 +135,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, param_types[0] = l_ptr(StructTupleTableSlot); - deform_sig = LLVMFunctionType(LLVMVoidType(), param_types, - lengthof(param_types), 0); + deform_sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), + param_types, lengthof(param_types), 0); } v_deform_fn = LLVMAddFunction(mod, funcname, deform_sig); LLVMSetLinkage(v_deform_fn, LLVMInternalLinkage); @@ -142,17 +144,17 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, llvm_copy_attributes(AttributeTemplate, v_deform_fn); b_entry = - LLVMAppendBasicBlock(v_deform_fn, "entry"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "entry"); b_adjust_unavail_cols = - LLVMAppendBasicBlock(v_deform_fn, "adjust_unavail_cols"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "adjust_unavail_cols"); b_find_start = - LLVMAppendBasicBlock(v_deform_fn, "find_startblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "find_startblock"); b_out = - LLVMAppendBasicBlock(v_deform_fn, "outblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "outblock"); b_dead = - LLVMAppendBasicBlock(v_deform_fn, "deadblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "deadblock"); - b = LLVMCreateBuilder(); + b = LLVMCreateBuilderInContext(lc); attcheckattnoblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); attstartblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); @@ -192,7 +194,6 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_tupleheaderp = l_load_struct_gep(b, StructHeapTupleTableSlot, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_TUPLE, "tupleheader"); - } else if (ops == &TTSOpsMinimalTuple) { @@ -233,7 +234,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_tuplep, FIELDNO_HEAPTUPLEHEADERDATA_BITS, ""), - l_ptr(LLVMInt8Type()), + l_ptr(LLVMInt8TypeInContext(lc)), "t_bits"); v_infomask1 = l_load_struct_gep(b, @@ -251,14 +252,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_hasnulls = LLVMBuildICmp(b, LLVMIntNE, LLVMBuildAnd(b, - l_int16_const(HEAP_HASNULL), + l_int16_const(lc, HEAP_HASNULL), v_infomask1, ""), - l_int16_const(0), + l_int16_const(lc, 0), "hasnulls"); /* t_infomask2 & HEAP_NATTS_MASK */ v_maxatt = LLVMBuildAnd(b, - l_int16_const(HEAP_NATTS_MASK), + l_int16_const(lc, HEAP_NATTS_MASK), v_infomask2, "maxatt"); @@ -273,13 +274,13 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_tuplep, FIELDNO_HEAPTUPLEHEADERDATA_HOFF, ""), - LLVMInt32Type(), "t_hoff"); + LLVMInt32TypeInContext(lc), "t_hoff"); v_tupdata_base = l_gep(b, - LLVMInt8Type(), + LLVMInt8TypeInContext(lc), LLVMBuildBitCast(b, v_tuplep, - l_ptr(LLVMInt8Type()), + l_ptr(LLVMInt8TypeInContext(lc)), ""), &v_hoff, 1, "v_tupdata_base"); @@ -291,7 +292,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, { LLVMValueRef v_off_start; - v_off_start = l_load(b, LLVMInt32Type(), v_slotoffp, "v_slot_off"); + v_off_start = l_load(b, LLVMInt32TypeInContext(lc), v_slotoffp, "v_slot_off"); v_off_start = LLVMBuildZExt(b, v_off_start, TypeSizeT, ""); LLVMBuildStore(b, v_off_start, v_offp); } @@ -337,7 +338,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntULT, v_maxatt, - l_int16_const(natts), + l_int16_const(lc, natts), ""), b_adjust_unavail_cols, b_find_start); @@ -346,8 +347,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMPositionBuilderAtEnd(b, b_adjust_unavail_cols); v_params[0] = v_slot; - v_params[1] = LLVMBuildZExt(b, v_maxatt, LLVMInt32Type(), ""); - v_params[2] = l_int32_const(natts); + v_params[1] = LLVMBuildZExt(b, v_maxatt, LLVMInt32TypeInContext(lc), ""); + v_params[2] = l_int32_const(lc, natts); f = llvm_pg_func(mod, "slot_getmissingattrs"); l_call(b, LLVMGetFunctionType(f), f, @@ -357,7 +358,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMPositionBuilderAtEnd(b, b_find_start); - v_nvalid = l_load(b, LLVMInt16Type(), v_nvalidp, ""); + v_nvalid = l_load(b, LLVMInt16TypeInContext(lc), v_nvalidp, ""); /* * Build switch to go from nvalid to the right startblock. Callers @@ -372,11 +373,10 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, for (attnum = 0; attnum < natts; attnum++) { - LLVMValueRef v_attno = l_int16_const(attnum); + LLVMValueRef v_attno = l_int16_const(lc, attnum); LLVMAddCase(v_switch, v_attno, attcheckattnoblocks[attnum]); } - } else { @@ -396,7 +396,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, Form_pg_attribute att = TupleDescAttr(desc, attnum); LLVMValueRef v_incby; int alignto; - LLVMValueRef l_attno = l_int16_const(attnum); + LLVMValueRef l_attno = l_int16_const(lc, attnum); LLVMValueRef v_attdatap; LLVMValueRef v_resultp; @@ -457,14 +457,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, else b_next = attcheckattnoblocks[attnum + 1]; - v_nullbyteno = l_int32_const(attnum >> 3); - v_nullbytemask = l_int8_const(1 << ((attnum) & 0x07)); - v_nullbyte = l_load_gep1(b, LLVMInt8Type(), v_bits, v_nullbyteno, "attnullbyte"); + v_nullbyteno = l_int32_const(lc, attnum >> 3); + v_nullbytemask = l_int8_const(lc, 1 << ((attnum) & 0x07)); + v_nullbyte = l_load_gep1(b, LLVMInt8TypeInContext(lc), v_bits, v_nullbyteno, "attnullbyte"); v_nullbit = LLVMBuildICmp(b, LLVMIntEQ, LLVMBuildAnd(b, v_nullbyte, v_nullbytemask, ""), - l_int8_const(0), + l_int8_const(lc, 0), "attisnull"); v_attisnull = LLVMBuildAnd(b, v_hasnulls, v_nullbit, ""); @@ -475,8 +475,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* store null-byte */ LLVMBuildStore(b, - l_int8_const(1), - l_gep(b, LLVMInt8Type(), v_tts_nulls, &l_attno, 1, "")); + l_int8_const(lc, 1), + l_gep(b, LLVMInt8TypeInContext(lc), v_tts_nulls, &l_attno, 1, "")); /* store zero datum */ LLVMBuildStore(b, l_sizet_const(0), @@ -542,10 +542,11 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_off = l_load(b, TypeSizeT, v_offp, ""); v_possible_padbyte = - l_load_gep1(b, LLVMInt8Type(), v_tupdata_base, v_off, "padbyte"); + l_load_gep1(b, LLVMInt8TypeInContext(lc), v_tupdata_base, + v_off, "padbyte"); v_ispad = LLVMBuildICmp(b, LLVMIntEQ, - v_possible_padbyte, l_int8_const(0), + v_possible_padbyte, l_int8_const(lc, 0), "ispadbyte"); LLVMBuildCondBr(b, v_ispad, attalignblocks[attnum], @@ -653,14 +654,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); v_attdatap = - l_gep(b, LLVMInt8Type(), v_tupdata_base, &v_off, 1, ""); + l_gep(b, LLVMInt8TypeInContext(lc), v_tupdata_base, &v_off, 1, ""); } /* compute address to store value at */ v_resultp = l_gep(b, TypeSizeT, v_tts_values, &l_attno, 1, ""); /* store null-byte (false) */ - LLVMBuildStore(b, l_int8_const(0), + LLVMBuildStore(b, l_int8_const(lc, 0), l_gep(b, TypeStorageBool, v_tts_nulls, &l_attno, 1, "")); /* @@ -670,7 +671,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, if (att->attbyval) { LLVMValueRef v_tmp_loaddata; - LLVMTypeRef vartype = LLVMIntType(att->attlen * 8); + LLVMTypeRef vartype = LLVMIntTypeInContext(lc, att->attlen * 8); LLVMTypeRef vartypep = LLVMPointerType(vartype, 0); v_tmp_loaddata = @@ -762,11 +763,11 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); LLVMValueRef v_flags; - LLVMBuildStore(b, l_int16_const(natts), v_nvalidp); - v_off = LLVMBuildTrunc(b, v_off, LLVMInt32Type(), ""); + LLVMBuildStore(b, l_int16_const(lc, natts), v_nvalidp); + v_off = LLVMBuildTrunc(b, v_off, LLVMInt32TypeInContext(lc), ""); LLVMBuildStore(b, v_off, v_slotoffp); - v_flags = l_load(b, LLVMInt16Type(), v_flagsp, "tts_flags"); - v_flags = LLVMBuildOr(b, v_flags, l_int16_const(TTS_FLAG_SLOW), ""); + v_flags = l_load(b, LLVMInt16TypeInContext(lc), v_flagsp, "tts_flags"); + v_flags = LLVMBuildOr(b, v_flags, l_int16_const(lc, TTS_FLAG_SLOW), ""); LLVMBuildStore(b, v_flags, v_flagsp); LLVMBuildRetVoid(b); } diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_error.cpp b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_error.cpp index 5ad92f30..542425dc 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_error.cpp +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_error.cpp @@ -6,7 +6,7 @@ * Unfortunately neither (re)setting the C++ new handler, nor the LLVM OOM * handler are exposed to C. Therefore this file wraps the necessary code. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit_error.cpp diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_expr.c b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_expr.c index 583a5783..95836af1 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_expr.c +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_expr.c @@ -3,7 +3,7 @@ * llvmjit_expr.c * JIT compile expressions. * - * 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 * * @@ -84,6 +84,7 @@ llvm_compile_expr(ExprState *state) LLVMBuilderRef b; LLVMModuleRef mod; + LLVMContextRef lc; LLVMValueRef eval_fn; LLVMBasicBlockRef entry; LLVMBasicBlockRef *opblocks; @@ -143,8 +144,9 @@ llvm_compile_expr(ExprState *state) INSTR_TIME_SET_CURRENT(starttime); mod = llvm_mutable_module(context); + lc = LLVMGetModuleContext(mod); - b = LLVMCreateBuilder(); + b = LLVMCreateBuilderInContext(lc); funcname = llvm_expand_funcname(context, "evalexpr"); @@ -155,7 +157,7 @@ llvm_compile_expr(ExprState *state) LLVMSetVisibility(eval_fn, LLVMDefaultVisibility); llvm_copy_attributes(AttributeTemplate, eval_fn); - entry = LLVMAppendBasicBlock(eval_fn, "entry"); + entry = LLVMAppendBasicBlockInContext(lc, eval_fn, "entry"); /* build state */ v_state = LLVMGetParam(eval_fn, 0); @@ -337,7 +339,7 @@ llvm_compile_expr(ExprState *state) ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntUGE, v_nvalid, - l_int16_const(op->d.fetch.last_var), + l_int16_const(lc, op->d.fetch.last_var), ""), opblocks[opno + 1], b_fetch); @@ -373,7 +375,7 @@ llvm_compile_expr(ExprState *state) LLVMValueRef params[2]; params[0] = v_slot; - params[1] = l_int32_const(op->d.fetch.last_var); + params[1] = l_int32_const(lc, op->d.fetch.last_var); l_call(b, llvm_pg_var_func_type("slot_getsomeattrs_int"), @@ -411,7 +413,7 @@ llvm_compile_expr(ExprState *state) v_nulls = v_scannulls; } - v_attnum = l_int32_const(op->d.var.attnum); + v_attnum = l_int32_const(lc, op->d.var.attnum); value = l_load_gep1(b, TypeSizeT, v_values, v_attnum, ""); isnull = l_load_gep1(b, TypeStorageBool, v_nulls, v_attnum, ""); LLVMBuildStore(b, value, v_resvaluep); @@ -477,12 +479,12 @@ llvm_compile_expr(ExprState *state) } /* load data */ - v_attnum = l_int32_const(op->d.assign_var.attnum); + v_attnum = l_int32_const(lc, op->d.assign_var.attnum); v_value = l_load_gep1(b, TypeSizeT, v_values, v_attnum, ""); v_isnull = l_load_gep1(b, TypeStorageBool, v_nulls, v_attnum, ""); /* compute addresses of targets */ - v_resultnum = l_int32_const(op->d.assign_var.resultnum); + v_resultnum = l_int32_const(lc, op->d.assign_var.resultnum); v_rvaluep = l_gep(b, TypeSizeT, v_resultvalues, @@ -515,7 +517,7 @@ llvm_compile_expr(ExprState *state) v_isnull = l_load(b, TypeStorageBool, v_tmpisnullp, ""); /* compute addresses of targets */ - v_resultnum = l_int32_const(resultnum); + v_resultnum = l_int32_const(lc, resultnum); v_rvaluep = l_gep(b, TypeSizeT, v_resultvalues, &v_resultnum, 1, ""); v_risnullp = @@ -1749,7 +1751,7 @@ llvm_compile_expr(ExprState *state) v_cmpresult = LLVMBuildTrunc(b, l_load(b, TypeSizeT, v_resvaluep, ""), - LLVMInt32Type(), ""); + LLVMInt32TypeInContext(lc), ""); switch (rctype) { @@ -1775,7 +1777,7 @@ llvm_compile_expr(ExprState *state) v_result = LLVMBuildICmp(b, predicate, v_cmpresult, - l_int32_const(0), + l_int32_const(lc, 0), ""); v_result = LLVMBuildZExt(b, v_result, TypeSizeT, ""); @@ -1910,7 +1912,7 @@ llvm_compile_expr(ExprState *state) LLVMValueRef value, isnull; - v_aggno = l_int32_const(op->d.aggref.aggno); + v_aggno = l_int32_const(lc, op->d.aggref.aggno); /* load agg value / null */ value = l_load_gep1(b, TypeSizeT, v_aggvalues, v_aggno, "aggvalue"); @@ -1944,8 +1946,8 @@ llvm_compile_expr(ExprState *state) * expression). So load it from memory each time round. */ v_wfuncnop = l_ptr_const(&wfunc->wfuncno, - l_ptr(LLVMInt32Type())); - v_wfuncno = l_load(b, LLVMInt32Type(), v_wfuncnop, "v_wfuncno"); + l_ptr(LLVMInt32TypeInContext(lc))); + v_wfuncno = l_load(b, LLVMInt32TypeInContext(lc), v_wfuncnop, "v_wfuncno"); /* load window func value / null */ value = l_load_gep1(b, TypeSizeT, v_aggvalues, v_wfuncno, @@ -2052,7 +2054,7 @@ llvm_compile_expr(ExprState *state) /* strict function, check for NULL args */ for (int argno = 0; argno < nargs; argno++) { - LLVMValueRef v_argno = l_int32_const(argno); + LLVMValueRef v_argno = l_int32_const(lc, argno); LLVMValueRef v_argisnull; LLVMBasicBlockRef b_argnotnull; @@ -2111,7 +2113,7 @@ llvm_compile_expr(ExprState *state) FIELDNO_AGGSTATE_ALL_PERGROUPS, "aggstate.all_pergroups"); - v_setoff = l_int32_const(op->d.agg_plain_pergroup_nullcheck.setoff); + v_setoff = l_int32_const(lc, op->d.agg_plain_pergroup_nullcheck.setoff); v_pergroup_allaggs = l_load_gep1(b, l_ptr(StructAggStatePerGroupData), v_allpergroupsp, v_setoff, ""); @@ -2183,8 +2185,8 @@ llvm_compile_expr(ExprState *state) v_aggstatep, FIELDNO_AGGSTATE_ALL_PERGROUPS, "aggstate.all_pergroups"); - v_setoff = l_int32_const(op->d.agg_trans.setoff); - v_transno = l_int32_const(op->d.agg_trans.transno); + v_setoff = l_int32_const(lc, op->d.agg_trans.setoff); + v_transno = l_int32_const(lc, op->d.agg_trans.transno); v_pergroupp = l_gep(b, StructAggStatePerGroupData, @@ -2239,7 +2241,6 @@ llvm_compile_expr(ExprState *state) ""); LLVMBuildBr(b, opblocks[opno + 1]); - } LLVMPositionBuilderAtEnd(b, b_no_init); @@ -2298,7 +2299,7 @@ llvm_compile_expr(ExprState *state) /* set aggstate globals */ LLVMBuildStore(b, v_aggcontext, v_curaggcontext); - LLVMBuildStore(b, l_int32_const(op->d.agg_trans.setno), + LLVMBuildStore(b, l_int32_const(lc, op->d.agg_trans.setno), v_current_setp); LLVMBuildStore(b, v_pertransp, v_current_pertransp); @@ -2465,7 +2466,7 @@ llvm_compile_expr(ExprState *state) * Run compiled expression. * * This will only be called the first time a JITed expression is called. We - * first make sure the expression is still up2date, and then get a pointer to + * first make sure the expression is still up-to-date, and then get a pointer to * the emitted function. The latter can be the first thing that triggers * optimizing and emitting all the generated functions. */ @@ -2494,11 +2495,14 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMModuleRef mod, FunctionCallInfo fcinfo, LLVMValueRef *v_fcinfo_isnull) { + LLVMContextRef lc; LLVMValueRef v_fn; LLVMValueRef v_fcinfo_isnullp; LLVMValueRef v_retval; LLVMValueRef v_fcinfo; + lc = LLVMGetModuleContext(mod); + v_fn = llvm_function_reference(context, b, mod, fcinfo); v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); @@ -2522,12 +2526,12 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMValueRef v_lifetime = create_LifetimeEnd(mod); LLVMValueRef params[2]; - params[0] = l_int64_const(sizeof(NullableDatum) * fcinfo->nargs); - params[1] = l_ptr_const(fcinfo->args, l_ptr(LLVMInt8Type())); + params[0] = l_int64_const(lc, sizeof(NullableDatum) * fcinfo->nargs); + params[1] = l_ptr_const(fcinfo->args, l_ptr(LLVMInt8TypeInContext(lc))); l_call(b, LLVMGetFunctionType(v_lifetime), v_lifetime, params, lengthof(params), ""); - params[0] = l_int64_const(sizeof(fcinfo->isnull)); - params[1] = l_ptr_const(&fcinfo->isnull, l_ptr(LLVMInt8Type())); + params[0] = l_int64_const(lc, sizeof(fcinfo->isnull)); + params[1] = l_ptr_const(&fcinfo->isnull, l_ptr(LLVMInt8TypeInContext(lc))); l_call(b, LLVMGetFunctionType(v_lifetime), v_lifetime, params, lengthof(params), ""); } @@ -2573,6 +2577,7 @@ create_LifetimeEnd(LLVMModuleRef mod) LLVMTypeRef sig; LLVMValueRef fn; LLVMTypeRef param_types[2]; + LLVMContextRef lc; /* LLVM 5+ has a variadic pointer argument */ #if LLVM_VERSION_MAJOR < 5 @@ -2585,12 +2590,12 @@ create_LifetimeEnd(LLVMModuleRef mod) if (fn) return fn; - param_types[0] = LLVMInt64Type(); - param_types[1] = l_ptr(LLVMInt8Type()); + lc = LLVMGetModuleContext(mod); + param_types[0] = LLVMInt64TypeInContext(lc); + param_types[1] = l_ptr(LLVMInt8TypeInContext(lc)); - sig = LLVMFunctionType(LLVMVoidType(), - param_types, lengthof(param_types), - false); + sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), param_types, + lengthof(param_types), false); fn = LLVMAddFunction(mod, nm, sig); LLVMSetFunctionCallConv(fn, LLVMCCallConv); diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_inline.cpp b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_inline.cpp index 774d9e8b..b3382a78 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_inline.cpp +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_inline.cpp @@ -11,7 +11,7 @@ * so for all external functions, all the referenced functions (and * prerequisites) will be imported. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/llvmjit/llvmjit_inline.cpp @@ -114,12 +114,12 @@ typedef llvm::StringMap > SummaryCache llvm::ManagedStatic summary_cache; -static std::unique_ptr llvm_build_inline_plan(llvm::Module *mod); +static std::unique_ptr llvm_build_inline_plan(LLVMContextRef lc, llvm::Module *mod); static void llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline); -static llvm::Module* load_module_cached(llvm::StringRef modPath); -static std::unique_ptr load_module(llvm::StringRef Identifier); +static llvm::Module* load_module_cached(LLVMContextRef c, llvm::StringRef modPath); +static std::unique_ptr load_module(LLVMContextRef c, llvm::StringRef Identifier); static std::unique_ptr llvm_load_summary(llvm::StringRef path); @@ -152,6 +152,18 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid); #define ilog(...) (void) 0 #endif +/* + * Reset inlining related state. This needs to be called before the currently + * used LLVMContextRef is disposed (and a new one create), otherwise we would + * have dangling references to deleted modules. + */ +void +llvm_inline_reset_caches(void) +{ + module_cache->clear(); + summary_cache->clear(); +} + /* * Perform inlining of external function references in M based on a simple * cost based analysis. @@ -159,9 +171,10 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid); void llvm_inline(LLVMModuleRef M) { + LLVMContextRef lc = LLVMGetModuleContext(M); llvm::Module *mod = llvm::unwrap(M); - std::unique_ptr globalsToInline = llvm_build_inline_plan(mod); + std::unique_ptr globalsToInline = llvm_build_inline_plan(lc, mod); if (!globalsToInline) return; llvm_execute_inline_plan(mod, globalsToInline.get()); @@ -172,7 +185,7 @@ llvm_inline(LLVMModuleRef M) * mod. */ static std::unique_ptr -llvm_build_inline_plan(llvm::Module *mod) +llvm_build_inline_plan(LLVMContextRef lc, llvm::Module *mod) { std::unique_ptr globalsToInline(new ImportMapTy()); FunctionInlineStates functionStates; @@ -271,7 +284,7 @@ llvm_build_inline_plan(llvm::Module *mod) continue; } - defMod = load_module_cached(modPath); + defMod = load_module_cached(lc, modPath); if (defMod->materializeMetadata()) elog(FATAL, "failed to materialize metadata"); @@ -466,20 +479,20 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline) * the cache state would get corrupted. */ static llvm::Module* -load_module_cached(llvm::StringRef modPath) +load_module_cached(LLVMContextRef lc, llvm::StringRef modPath) { auto it = module_cache->find(modPath); if (it == module_cache->end()) { it = module_cache->insert( - std::make_pair(modPath, load_module(modPath))).first; + std::make_pair(modPath, load_module(lc, modPath))).first; } return it->second.get(); } static std::unique_ptr -load_module(llvm::StringRef Identifier) +load_module(LLVMContextRef lc, llvm::StringRef Identifier) { LLVMMemoryBufferRef buf; LLVMModuleRef mod; @@ -491,7 +504,7 @@ load_module(llvm::StringRef Identifier) if (LLVMCreateMemoryBufferWithContentsOfFile(path, &buf, &msg)) elog(FATAL, "failed to open bitcode file \"%s\": %s", path, msg); - if (LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), buf, &mod)) + if (LLVMGetBitcodeModuleInContext2(lc, buf, &mod)) elog(FATAL, "failed to parse bitcode in file \"%s\"", path); /* @@ -808,7 +821,10 @@ static void add_module_to_inline_search_path(InlineSearchPath& searchpath, llvm::StringRef modpath) { /* only extension in libdir are candidates for inlining for now */ - if (!modpath.startswith("$libdir/")) +#if LLVM_VERSION_MAJOR < 16 +#define starts_with startswith +#endif + if (!modpath.starts_with("$libdir/")) return; /* if there's no match, attempt to load */ diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_types.c b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_types.c index 58c5d135..83593924 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_types.c +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_types.c @@ -16,7 +16,7 @@ * bitcode. * * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit_types.c diff --git a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_wrap.cpp b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_wrap.cpp index 2962083c..bab5b662 100644 --- a/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_wrap.cpp +++ b/third_party/spanner_pg/src/backend/jit/llvm/llvmjit_wrap.cpp @@ -3,7 +3,7 @@ * llvmjit_wrap.cpp * Parts of the LLVM interface not (yet) exposed to C. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/llvm/llvmjit_wrap.cpp diff --git a/third_party/spanner_pg/src/backend/lib/binaryheap.c b/third_party/spanner_pg/src/backend/lib/binaryheap.c index d54e2452..999c23e5 100644 --- a/third_party/spanner_pg/src/backend/lib/binaryheap.c +++ b/third_party/spanner_pg/src/backend/lib/binaryheap.c @@ -3,7 +3,7 @@ * binaryheap.c * A simple binary heap implementation * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/binaryheap.c @@ -19,7 +19,6 @@ static void sift_down(binaryheap *heap, int node_off); static void sift_up(binaryheap *heap, int node_off); -static inline void swap_nodes(binaryheap *heap, int a, int b); /* * binaryheap_allocate @@ -173,24 +172,28 @@ binaryheap_first(binaryheap *heap) Datum binaryheap_remove_first(binaryheap *heap) { + Datum result; + Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); + /* extract the root node, which will be the result */ + result = heap->bh_nodes[0]; + + /* easy if heap contains one element */ if (heap->bh_size == 1) { heap->bh_size--; - return heap->bh_nodes[0]; + return result; } /* - * Swap the root and last nodes, decrease the size of the heap (i.e. - * remove the former root node) and sift the new root node down to its - * correct position. + * Remove the last node, placing it in the vacated root entry, and sift + * the new root node down to its correct position. */ - swap_nodes(heap, 0, heap->bh_size - 1); - heap->bh_size--; + heap->bh_nodes[0] = heap->bh_nodes[--heap->bh_size]; sift_down(heap, 0); - return heap->bh_nodes[heap->bh_size]; + return result; } /* @@ -211,19 +214,6 @@ binaryheap_replace_first(binaryheap *heap, Datum d) sift_down(heap, 0); } -/* - * Swap the contents of two nodes. - */ -static inline void -swap_nodes(binaryheap *heap, int a, int b) -{ - Datum swap; - - swap = heap->bh_nodes[a]; - heap->bh_nodes[a] = heap->bh_nodes[b]; - heap->bh_nodes[b] = swap; -} - /* * Sift a node up to the highest position it can hold according to the * comparator. @@ -231,29 +221,40 @@ swap_nodes(binaryheap *heap, int a, int b) static void sift_up(binaryheap *heap, int node_off) { + Datum node_val = heap->bh_nodes[node_off]; + + /* + * Within the loop, the node_off'th array entry is a "hole" that + * notionally holds node_val, but we don't actually store node_val there + * till the end, saving some unnecessary data copying steps. + */ while (node_off != 0) { int cmp; int parent_off; + Datum parent_val; /* * If this node is smaller than its parent, the heap condition is * satisfied, and we're done. */ parent_off = parent_offset(node_off); - cmp = heap->bh_compare(heap->bh_nodes[node_off], - heap->bh_nodes[parent_off], + parent_val = heap->bh_nodes[parent_off]; + cmp = heap->bh_compare(node_val, + parent_val, heap->bh_arg); if (cmp <= 0) break; /* - * Otherwise, swap the node and its parent and go on to check the - * node's new parent. + * Otherwise, swap the parent value with the hole, and go on to check + * the node's new parent. */ - swap_nodes(heap, node_off, parent_off); + heap->bh_nodes[node_off] = parent_val; node_off = parent_off; } + /* Re-fill the hole */ + heap->bh_nodes[node_off] = node_val; } /* @@ -263,6 +264,13 @@ sift_up(binaryheap *heap, int node_off) static void sift_down(binaryheap *heap, int node_off) { + Datum node_val = heap->bh_nodes[node_off]; + + /* + * Within the loop, the node_off'th array entry is a "hole" that + * notionally holds node_val, but we don't actually store node_val there + * till the end, saving some unnecessary data copying steps. + */ while (true) { int left_off = left_offset(node_off); @@ -271,14 +279,14 @@ sift_down(binaryheap *heap, int node_off) /* Is the left child larger than the parent? */ if (left_off < heap->bh_size && - heap->bh_compare(heap->bh_nodes[node_off], + heap->bh_compare(node_val, heap->bh_nodes[left_off], heap->bh_arg) < 0) swap_off = left_off; /* Is the right child larger than the parent? */ if (right_off < heap->bh_size && - heap->bh_compare(heap->bh_nodes[node_off], + heap->bh_compare(node_val, heap->bh_nodes[right_off], heap->bh_arg) < 0) { @@ -298,10 +306,12 @@ sift_down(binaryheap *heap, int node_off) break; /* - * Otherwise, swap the node with the child that violates the heap + * Otherwise, swap the hole with the child that violates the heap * property; then go on to check its children. */ - swap_nodes(heap, swap_off, node_off); + heap->bh_nodes[node_off] = heap->bh_nodes[swap_off]; node_off = swap_off; } + /* Re-fill the hole */ + heap->bh_nodes[node_off] = node_val; } diff --git a/third_party/spanner_pg/src/backend/lib/bipartite_match.c b/third_party/spanner_pg/src/backend/lib/bipartite_match.c index baa1c139..8e1637f1 100644 --- a/third_party/spanner_pg/src/backend/lib/bipartite_match.c +++ b/third_party/spanner_pg/src/backend/lib/bipartite_match.c @@ -7,7 +7,7 @@ * * https://en.wikipedia.org/w/index.php?title=Hopcroft%E2%80%93Karp_algorithm&oldid=593898016 * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/bipartite_match.c diff --git a/third_party/spanner_pg/src/backend/lib/bloomfilter.c b/third_party/spanner_pg/src/backend/lib/bloomfilter.c index daf2c40e..465ca7cf 100644 --- a/third_party/spanner_pg/src/backend/lib/bloomfilter.c +++ b/third_party/spanner_pg/src/backend/lib/bloomfilter.c @@ -24,7 +24,7 @@ * caller many authoritative lookups, such as expensive probes of a much larger * on-disk structure. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/bloomfilter.c @@ -81,8 +81,7 @@ static inline uint32 mod_m(uint32 a, uint64 m); * distinct seed value on every call makes it unlikely that the same false * positives will reoccur when the same set is fingerprinted a second time. * Callers that don't care about this pass a constant as their seed, typically - * 0. Callers can use a pseudo-random seed in the range of 0 - INT_MAX by - * calling random(). + * 0. Callers can also use a pseudo-random seed, eg from pg_prng_uint64(). */ bloom_filter * bloom_create(int64 total_elems, int bloom_work_mem, uint64 seed) diff --git a/third_party/spanner_pg/src/backend/lib/dshash.c b/third_party/spanner_pg/src/backend/lib/dshash.c index 99128b22..c5c032a5 100644 --- a/third_party/spanner_pg/src/backend/lib/dshash.c +++ b/third_party/spanner_pg/src/backend/lib/dshash.c @@ -20,7 +20,7 @@ * Future versions may support iterators and incremental resizing; for now * the implementation is minimalist. * - * 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 * * IDENTIFICATION @@ -125,6 +125,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)) @@ -151,6 +155,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[ \ @@ -321,7 +329,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]; @@ -575,6 +583,150 @@ dshash_memhash(const void *v, size_t size, void *arg) return tag_hash(v, size); } +/* + * Sequentially scan through dshash table and return all the elements one by + * one, return NULL when all elements have been returned. + * + * 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, + 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 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; + + /* + * 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) + { + Assert(status->curbucket == 0); + ASSERT_NO_PARTITION_LOCKS_HELD_BY_ME(status->hash_table); + + status->curpartition = 0; + + LWLockAcquire(PARTITION_LOCK(status->hash_table, + status->curpartition), + status->exclusive ? LW_EXCLUSIVE : LW_SHARED); + + 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 + 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); + + /* + * 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. + * + * Needs to be called after finishing or when exiting a seqscan. + */ +void +dshash_seq_term(dshash_seq_status *status) +{ + if (status->curpartition >= 0) + LWLockRelease(PARTITION_LOCK(status->hash_table, status->curpartition)); +} + +/* + * Remove the current entry of the 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(LWLockHeldByMeInMode(PARTITION_LOCK(hash_table, partition), + LW_EXCLUSIVE)); + + delete_item(hash_table, item); +} + /* * Print debugging information about the internal state of the hash table to * stderr. The caller must hold no partition locks. diff --git a/third_party/spanner_pg/src/backend/lib/hyperloglog.c b/third_party/spanner_pg/src/backend/lib/hyperloglog.c index f4e02410..06b1e288 100644 --- a/third_party/spanner_pg/src/backend/lib/hyperloglog.c +++ b/third_party/spanner_pg/src/backend/lib/hyperloglog.c @@ -3,7 +3,7 @@ * hyperloglog.c * HyperLogLog cardinality estimator * - * Portions Copyright (c) 2014-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2014-2022, PostgreSQL Global Development Group * * Based on Hideaki Ohno's C++ implementation. This is probably not ideally * suited to estimating the cardinality of very large sets; in particular, we diff --git a/third_party/spanner_pg/src/backend/lib/ilist.c b/third_party/spanner_pg/src/backend/lib/ilist.c index e9a07c14..29ef2162 100644 --- a/third_party/spanner_pg/src/backend/lib/ilist.c +++ b/third_party/spanner_pg/src/backend/lib/ilist.c @@ -3,7 +3,7 @@ * ilist.c * support for integrated/inline doubly- and singly- linked lists * - * 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/third_party/spanner_pg/src/backend/lib/integerset.c b/third_party/spanner_pg/src/backend/lib/integerset.c index 278a91bd..5aff292c 100644 --- a/third_party/spanner_pg/src/backend/lib/integerset.c +++ b/third_party/spanner_pg/src/backend/lib/integerset.c @@ -61,7 +61,7 @@ * (https://doi.org/10.1002/spe.948) * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/lib/knapsack.c b/third_party/spanner_pg/src/backend/lib/knapsack.c index 50c84b4a..f4c51663 100644 --- a/third_party/spanner_pg/src/backend/lib/knapsack.c +++ b/third_party/spanner_pg/src/backend/lib/knapsack.c @@ -15,7 +15,7 @@ * allows approximate solutions in polynomial time (the general case of the * exact problem is NP-hard). * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/knapsack.c diff --git a/third_party/spanner_pg/src/backend/lib/pairingheap.c b/third_party/spanner_pg/src/backend/lib/pairingheap.c index bed3d2ef..d561df07 100644 --- a/third_party/spanner_pg/src/backend/lib/pairingheap.c +++ b/third_party/spanner_pg/src/backend/lib/pairingheap.c @@ -14,7 +14,7 @@ * The pairing heap: a new form of self-adjusting heap. * Algorithmica 1, 1 (January 1986), pages 111-129. DOI: 10.1007/BF01840439 * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/pairingheap.c diff --git a/third_party/spanner_pg/src/backend/lib/rbtree.c b/third_party/spanner_pg/src/backend/lib/rbtree.c index 536df1f7..a9981dba 100644 --- a/third_party/spanner_pg/src/backend/lib/rbtree.c +++ b/third_party/spanner_pg/src/backend/lib/rbtree.c @@ -17,7 +17,7 @@ * longest path from root to leaf is only about twice as long as the shortest, * so lookups are guaranteed to run in O(lg n) time. * - * Copyright (c) 2009-2021, PostgreSQL Global Development Group + * Copyright (c) 2009-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/rbtree.c diff --git a/third_party/spanner_pg/src/backend/libpq/BUILD b/third_party/spanner_pg/src/backend/libpq/BUILD index de457fc0..1e6f1944 100644 --- a/third_party/spanner_pg/src/backend/libpq/BUILD +++ b/third_party/spanner_pg/src/backend/libpq/BUILD @@ -48,6 +48,7 @@ cc_library( name = "libpq", srcs = [ "auth.c", + "auth-sasl.c", "auth-scram.c", "be-fsstubs.c", "be-secure.c", diff --git a/third_party/spanner_pg/src/backend/libpq/Makefile b/third_party/spanner_pg/src/backend/libpq/Makefile index 8d1d16b0..6d385fd6 100644 --- a/third_party/spanner_pg/src/backend/libpq/Makefile +++ b/third_party/spanner_pg/src/backend/libpq/Makefile @@ -15,6 +15,7 @@ include $(top_builddir)/src/Makefile.global # be-fsstubs is here for historical reasons, probably belongs elsewhere OBJS = \ + auth-sasl.o \ auth-scram.o \ auth.o \ be-fsstubs.o \ diff --git a/third_party/spanner_pg/src/backend/libpq/auth-sasl.c b/third_party/spanner_pg/src/backend/libpq/auth-sasl.c new file mode 100644 index 00000000..a1d7dbb6 --- /dev/null +++ b/third_party/spanner_pg/src/backend/libpq/auth-sasl.c @@ -0,0 +1,202 @@ +/*------------------------------------------------------------------------- + * + * auth-sasl.c + * Routines to handle authentication via SASL + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/libpq/auth-sasl.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "libpq/auth.h" +#include "libpq/libpq.h" +#include "libpq/pqformat.h" +#include "libpq/sasl.h" + +/* + * Maximum accepted size of SASL messages. + * + * The messages that the server or libpq generate are much smaller than this, + * but have some headroom. + */ +#define PG_MAX_SASL_MESSAGE_LENGTH 1024 + +/* + * Perform a SASL exchange with a libpq client, using a specific mechanism + * implementation. + * + * shadow_pass is an optional pointer to the stored secret of the role + * authenticated, from pg_authid.rolpassword. For mechanisms that use + * shadowed passwords, a NULL pointer here means that an entry could not + * be found for the role (or the user does not exist), and the mechanism + * should fail the authentication exchange. + * + * Mechanisms must take care not to reveal to the client that a user entry + * does not exist; ideally, the external failure mode is identical to that + * of an incorrect password. Mechanisms may instead use the logdetail + * output parameter to internally differentiate between failure cases and + * assist debugging by the server admin. + * + * A mechanism is not required to utilize a shadow entry, or even a password + * system at all; for these cases, shadow_pass may be ignored and the caller + * should just pass NULL. + */ +int +CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, char *shadow_pass, + const char **logdetail) +{ + StringInfoData sasl_mechs; + int mtype; + StringInfoData buf; + void *opaq = NULL; + char *output = NULL; + int outputlen = 0; + const char *input; + int inputlen; + int result; + bool initial; + + /* + * Send the SASL authentication request to user. It includes the list of + * authentication mechanisms that are supported. + */ + initStringInfo(&sasl_mechs); + + mech->get_mechanisms(port, &sasl_mechs); + /* Put another '\0' to mark that list is finished. */ + appendStringInfoChar(&sasl_mechs, '\0'); + + sendAuthRequest(port, AUTH_REQ_SASL, sasl_mechs.data, sasl_mechs.len); + pfree(sasl_mechs.data); + + /* + * Loop through SASL message exchange. This exchange can consist of + * multiple messages sent in both directions. First message is always + * from the client. All messages from client to server are password + * packets (type 'p'). + */ + initial = true; + do + { + pq_startmsgread(); + mtype = pq_getbyte(); + if (mtype != 'p') + { + /* Only log error if client didn't disconnect. */ + if (mtype != EOF) + { + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("expected SASL response, got message type %d", + mtype))); + } + else + return STATUS_EOF; + } + + /* Get the actual SASL message */ + initStringInfo(&buf); + if (pq_getmessage(&buf, PG_MAX_SASL_MESSAGE_LENGTH)) + { + /* EOF - pq_getmessage already logged error */ + pfree(buf.data); + return STATUS_ERROR; + } + + elog(DEBUG4, "processing received SASL response of length %d", buf.len); + + /* + * The first SASLInitialResponse message is different from the others. + * It indicates which SASL mechanism the client selected, and contains + * an optional Initial Client Response payload. The subsequent + * SASLResponse messages contain just the SASL payload. + */ + if (initial) + { + const char *selected_mech; + + selected_mech = pq_getmsgrawstring(&buf); + + /* + * Initialize the status tracker for message exchanges. + * + * If the user doesn't exist, or doesn't have a valid password, or + * it's expired, we still go through the motions of SASL + * authentication, but tell the authentication method that the + * authentication is "doomed". That is, it's going to fail, no + * matter what. + * + * This is because we don't want to reveal to an attacker what + * usernames are valid, nor which users have a valid password. + */ + opaq = mech->init(port, selected_mech, shadow_pass); + + inputlen = pq_getmsgint(&buf, 4); + if (inputlen == -1) + input = NULL; + else + input = pq_getmsgbytes(&buf, inputlen); + + initial = false; + } + else + { + inputlen = buf.len; + input = pq_getmsgbytes(&buf, buf.len); + } + pq_getmsgend(&buf); + + /* + * The StringInfo guarantees that there's a \0 byte after the + * response. + */ + Assert(input == NULL || input[inputlen] == '\0'); + + /* + * Hand the incoming message to the mechanism implementation. + */ + result = mech->exchange(opaq, input, inputlen, + &output, &outputlen, + logdetail); + + /* input buffer no longer used */ + pfree(buf.data); + + if (output) + { + /* + * PG_SASL_EXCHANGE_FAILURE with some output is forbidden by SASL. + * Make sure here that the mechanism used got that right. + */ + if (result == PG_SASL_EXCHANGE_FAILURE) + elog(ERROR, "output message found after SASL exchange failure"); + + /* + * Negotiation generated data to be sent to the client. + */ + elog(DEBUG4, "sending SASL challenge of length %d", outputlen); + + if (result == PG_SASL_EXCHANGE_SUCCESS) + sendAuthRequest(port, AUTH_REQ_SASL_FIN, output, outputlen); + else + sendAuthRequest(port, AUTH_REQ_SASL_CONT, output, outputlen); + + pfree(output); + } + } while (result == PG_SASL_EXCHANGE_CONTINUE); + + /* Oops, Something bad happened */ + if (result != PG_SASL_EXCHANGE_SUCCESS) + { + return STATUS_ERROR; + } + + return STATUS_OK; +} diff --git a/third_party/spanner_pg/src/backend/libpq/auth-scram.c b/third_party/spanner_pg/src/backend/libpq/auth-scram.c index f9e1026a..ee7f5221 100644 --- a/third_party/spanner_pg/src/backend/libpq/auth-scram.c +++ b/third_party/spanner_pg/src/backend/libpq/auth-scram.c @@ -80,7 +80,7 @@ * general, after logging in, but let's do what we can here. * * - * 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 * * src/backend/libpq/auth-scram.c @@ -101,11 +101,26 @@ #include "common/sha2.h" #include "libpq/auth.h" #include "libpq/crypt.h" +#include "libpq/sasl.h" #include "libpq/scram.h" #include "miscadmin.h" #include "utils/builtins.h" #include "utils/timestamp.h" +static void scram_get_mechanisms(Port *port, StringInfo buf); +static void *scram_init(Port *port, const char *selected_mech, + const char *shadow_pass); +static int scram_exchange(void *opaq, const char *input, int inputlen, + char **output, int *outputlen, + const char **logdetail); + +/* Mechanism declaration */ +const pg_be_sasl_mech pg_be_scram_mech = { + scram_get_mechanisms, + scram_init, + scram_exchange +}; + /* * Status data for a SCRAM authentication exchange. This should be kept * internal to this file. @@ -170,16 +185,14 @@ static char *sanitize_str(const char *s); static char *scram_mock_salt(const char *username); /* - * pg_be_scram_get_mechanisms - * * Get a list of SASL mechanisms that this module supports. * * For the convenience of building the FE/BE packet that lists the * mechanisms, the names are appended to the given StringInfo buffer, * separated by '\0' bytes. */ -void -pg_be_scram_get_mechanisms(Port *port, StringInfo buf) +static void +scram_get_mechanisms(Port *port, StringInfo buf) { /* * Advertise the mechanisms in decreasing order of importance. So the @@ -199,15 +212,13 @@ pg_be_scram_get_mechanisms(Port *port, StringInfo buf) } /* - * pg_be_scram_init - * * Initialize a new SCRAM authentication exchange status tracker. This * needs to be called before doing any exchange. It will be filled later * after the beginning of the exchange with authentication information. * * 'selected_mech' identifies the SASL mechanism that the client selected. * It should be one of the mechanisms that we support, as returned by - * pg_be_scram_get_mechanisms(). + * scram_get_mechanisms(). * * 'shadow_pass' is the role's stored secret, from pg_authid.rolpassword. * The username was provided by the client in the startup message, and is @@ -215,10 +226,8 @@ pg_be_scram_get_mechanisms(Port *port, StringInfo buf) * an authentication exchange, but it will fail, as if an incorrect password * was given. */ -void * -pg_be_scram_init(Port *port, - const char *selected_mech, - const char *shadow_pass) +static void * +scram_init(Port *port, const char *selected_mech, const char *shadow_pass) { scram_state *state; bool got_secret; @@ -325,9 +334,9 @@ pg_be_scram_init(Port *port, * string at *logdetail that will be sent to the postmaster log (but not * the client). */ -int -pg_be_scram_exchange(void *opaq, const char *input, int inputlen, - char **output, int *outputlen, char **logdetail) +static int +scram_exchange(void *opaq, const char *input, int inputlen, + char **output, int *outputlen, const char **logdetail) { scram_state *state = (scram_state *) opaq; int result; @@ -346,7 +355,7 @@ pg_be_scram_exchange(void *opaq, const char *input, int inputlen, *output = pstrdup(""); *outputlen = 0; - return SASL_EXCHANGE_CONTINUE; + return PG_SASL_EXCHANGE_CONTINUE; } /* @@ -379,7 +388,7 @@ pg_be_scram_exchange(void *opaq, const char *input, int inputlen, *output = build_server_first_message(state); state->state = SCRAM_AUTH_SALT_SENT; - result = SASL_EXCHANGE_CONTINUE; + result = PG_SASL_EXCHANGE_CONTINUE; break; case SCRAM_AUTH_SALT_SENT: @@ -408,7 +417,8 @@ pg_be_scram_exchange(void *opaq, const char *input, int inputlen, * erroring out in an application-specific way. We choose to do * the latter, so that the error message for invalid password is * the same for all authentication methods. The caller will call - * ereport(), when we return SASL_EXCHANGE_FAILURE with no output. + * ereport(), when we return PG_SASL_EXCHANGE_FAILURE with no + * output. * * NB: the order of these checks is intentional. We calculate the * client proof even in a mock authentication, even though it's @@ -417,7 +427,7 @@ pg_be_scram_exchange(void *opaq, const char *input, int inputlen, */ if (!verify_client_proof(state) || state->doomed) { - result = SASL_EXCHANGE_FAILURE; + result = PG_SASL_EXCHANGE_FAILURE; break; } @@ -425,16 +435,16 @@ pg_be_scram_exchange(void *opaq, const char *input, int inputlen, *output = build_server_final_message(state); /* Success! */ - result = SASL_EXCHANGE_SUCCESS; + result = PG_SASL_EXCHANGE_SUCCESS; state->state = SCRAM_AUTH_FINISHED; break; default: elog(ERROR, "invalid SCRAM exchange state"); - result = SASL_EXCHANGE_FAILURE; + result = PG_SASL_EXCHANGE_FAILURE; } - if (result == SASL_EXCHANGE_FAILURE && state->logdetail && logdetail) + if (result == PG_SASL_EXCHANGE_FAILURE && state->logdetail && logdetail) *logdetail = state->logdetail; if (*output) @@ -455,6 +465,7 @@ pg_be_scram_build_secret(const char *password) pg_saslprep_rc rc; char saltbuf[SCRAM_DEFAULT_SALT_LEN]; char *result; + const char *errstr = NULL; /* * Normalize the password with SASLprep. If that doesn't work, because @@ -472,7 +483,8 @@ pg_be_scram_build_secret(const char *password) errmsg("could not generate random salt"))); result = scram_build_secret(saltbuf, SCRAM_DEFAULT_SALT_LEN, - SCRAM_DEFAULT_ITERATIONS, password); + SCRAM_DEFAULT_ITERATIONS, password, + &errstr); if (prep_password) pfree(prep_password); @@ -499,6 +511,7 @@ scram_verify_plain_password(const char *username, const char *password, uint8 computed_key[SCRAM_KEY_LEN]; char *prep_password; pg_saslprep_rc rc; + const char *errstr = NULL; if (!parse_scram_secret(secret, &iterations, &encoded_salt, stored_key, server_key)) @@ -529,10 +542,10 @@ scram_verify_plain_password(const char *username, const char *password, /* Compute Server Key based on the user-supplied plaintext password */ if (scram_SaltedPassword(password, salt, saltlen, iterations, - salted_password) < 0 || - scram_ServerKey(salted_password, computed_key) < 0) + salted_password, &errstr) < 0 || + scram_ServerKey(salted_password, computed_key, &errstr) < 0) { - elog(ERROR, "could not compute server key"); + elog(ERROR, "could not compute server key: %s", errstr); } if (prep_password) @@ -1103,6 +1116,7 @@ verify_client_proof(scram_state *state) uint8 client_StoredKey[SCRAM_KEY_LEN]; pg_hmac_ctx *ctx = pg_hmac_create(PG_SHA256); int i; + const char *errstr = NULL; /* * Calculate ClientSignature. Note that we don't log directly a failure @@ -1123,7 +1137,8 @@ verify_client_proof(scram_state *state) strlen(state->client_final_message_without_proof)) < 0 || pg_hmac_final(ctx, ClientSignature, sizeof(ClientSignature)) < 0) { - elog(ERROR, "could not calculate client signature"); + elog(ERROR, "could not calculate client signature: %s", + pg_hmac_error(ctx)); } pg_hmac_free(ctx); @@ -1133,8 +1148,8 @@ verify_client_proof(scram_state *state) ClientKey[i] = state->ClientProof[i] ^ ClientSignature[i]; /* Hash it one more time, and compare with StoredKey */ - if (scram_H(ClientKey, SCRAM_KEY_LEN, client_StoredKey) < 0) - elog(ERROR, "could not hash stored key"); + if (scram_H(ClientKey, SCRAM_KEY_LEN, client_StoredKey, &errstr) < 0) + elog(ERROR, "could not hash stored key: %s", errstr); if (memcmp(client_StoredKey, state->StoredKey, SCRAM_KEY_LEN) != 0) return false; @@ -1199,7 +1214,7 @@ build_server_first_message(scram_state *state) state->server_nonce[encoded_len] = '\0'; state->server_first_message = - psprintf("r=%s%s,s=%s,i=%u", + psprintf("r=%s%s,s=%s,i=%d", state->client_nonce, state->server_nonce, state->salt, state->iterations); @@ -1379,7 +1394,8 @@ build_server_final_message(scram_state *state) strlen(state->client_final_message_without_proof)) < 0 || pg_hmac_final(ctx, ServerSignature, sizeof(ServerSignature)) < 0) { - elog(ERROR, "could not calculate server signature"); + elog(ERROR, "could not calculate server signature: %s", + pg_hmac_error(ctx)); } pg_hmac_free(ctx); diff --git a/third_party/spanner_pg/src/backend/libpq/auth.c b/third_party/spanner_pg/src/backend/libpq/auth.c index a5560a0f..88e3863f 100644 --- a/third_party/spanner_pg/src/backend/libpq/auth.c +++ b/third_party/spanner_pg/src/backend/libpq/auth.c @@ -3,7 +3,7 @@ * auth.c * Routines to handle network authentication * - * 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 * * @@ -18,6 +18,7 @@ #include #include #include +#include #include #ifdef HAVE_SYS_SELECT_H #include @@ -26,11 +27,11 @@ #include "commands/user.h" #include "common/ip.h" #include "common/md5.h" -#include "common/scram-common.h" #include "libpq/auth.h" #include "libpq/crypt.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" +#include "libpq/sasl.h" #include "libpq/scram.h" #include "miscadmin.h" #include "port/pg_bswap.h" @@ -45,9 +46,7 @@ * Global authentication functions *---------------------------------------------------------------- */ -static void sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, - int extralen); -static void auth_failed(Port *port, int status, char *logdetail); +static void auth_failed(Port *port, int status, const char *logdetail); static char *recv_password_packet(Port *port); static void set_authn_id(Port *port, const char *id); @@ -56,11 +55,11 @@ static void set_authn_id(Port *port, const char *id); * Password-based authentication methods (password, md5, and scram-sha-256) *---------------------------------------------------------------- */ -static int CheckPasswordAuth(Port *port, char **logdetail); -static int CheckPWChallengeAuth(Port *port, char **logdetail); +static int CheckPasswordAuth(Port *port, const char **logdetail); +static int CheckPWChallengeAuth(Port *port, const char **logdetail); -static int CheckMD5Auth(Port *port, char *shadow_pass, char **logdetail); -static int CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail); +static int CheckMD5Auth(Port *port, char *shadow_pass, + const char **logdetail); /*---------------------------------------------------------------- @@ -223,14 +222,6 @@ static int PerformRadiusTransaction(const char *server, const char *secret, cons */ #define PG_MAX_AUTH_TOKEN_LENGTH 65535 -/* - * Maximum accepted size of SASL messages. - * - * The messages that the server or libpq generate are much smaller than this, - * but have some headroom. - */ -#define PG_MAX_SASL_MESSAGE_LENGTH 1024 - /*---------------------------------------------------------------- * Global authentication functions *---------------------------------------------------------------- @@ -257,7 +248,7 @@ ClientAuthentication_hook_type ClientAuthentication_hook = NULL; * particular, if logdetail isn't NULL, we send that string to the log. */ static void -auth_failed(Port *port, int status, char *logdetail) +auth_failed(Port *port, int status, const char *logdetail) { const char *errstr; char *cdetail; @@ -393,7 +384,7 @@ void ClientAuthentication(Port *port) { int status = STATUS_ERROR; - char *logdetail = NULL; + const char *logdetail = NULL; /* * Get the authentication method to use for this frontend/database @@ -667,7 +658,7 @@ ClientAuthentication(Port *port) /* * Send an authentication request packet to the frontend. */ -static void +void sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, int extralen) { StringInfoData buf; @@ -779,7 +770,7 @@ recv_password_packet(Port *port) * Plaintext password authentication. */ static int -CheckPasswordAuth(Port *port, char **logdetail) +CheckPasswordAuth(Port *port, const char **logdetail) { char *passwd; int result; @@ -814,7 +805,7 @@ CheckPasswordAuth(Port *port, char **logdetail) * MD5 and SCRAM authentication. */ static int -CheckPWChallengeAuth(Port *port, char **logdetail) +CheckPWChallengeAuth(Port *port, const char **logdetail) { int auth_result; char *shadow_pass; @@ -847,24 +838,24 @@ CheckPWChallengeAuth(Port *port, char **logdetail) * SCRAM secret, we must do SCRAM authentication. * * If MD5 authentication is not allowed, always use SCRAM. If the user - * had an MD5 password, CheckSCRAMAuth() will fail. + * had an MD5 password, CheckSASLAuth() with the SCRAM mechanism will + * fail. */ if (port->hba->auth_method == uaMD5 && pwtype == PASSWORD_TYPE_MD5) auth_result = CheckMD5Auth(port, shadow_pass, logdetail); else - auth_result = CheckSCRAMAuth(port, shadow_pass, logdetail); + auth_result = CheckSASLAuth(&pg_be_scram_mech, port, shadow_pass, + logdetail); if (shadow_pass) pfree(shadow_pass); - - /* - * If get_role_password() returned error, return error, even if the - * authentication succeeded. - */ - if (!shadow_pass) + else { + /* + * If get_role_password() returned error, authentication better not + * have succeeded. + */ Assert(auth_result != STATUS_OK); - return STATUS_ERROR; } if (auth_result == STATUS_OK) @@ -874,7 +865,7 @@ CheckPWChallengeAuth(Port *port, char **logdetail) } static int -CheckMD5Auth(Port *port, char *shadow_pass, char **logdetail) +CheckMD5Auth(Port *port, char *shadow_pass, const char **logdetail) { char md5Salt[4]; /* Password salt */ char *passwd; @@ -910,152 +901,6 @@ CheckMD5Auth(Port *port, char *shadow_pass, char **logdetail) return result; } -static int -CheckSCRAMAuth(Port *port, char *shadow_pass, char **logdetail) -{ - StringInfoData sasl_mechs; - int mtype; - StringInfoData buf; - void *scram_opaq = NULL; - char *output = NULL; - int outputlen = 0; - const char *input; - int inputlen; - int result; - bool initial; - - /* - * Send the SASL authentication request to user. It includes the list of - * authentication mechanisms that are supported. - */ - initStringInfo(&sasl_mechs); - - pg_be_scram_get_mechanisms(port, &sasl_mechs); - /* Put another '\0' to mark that list is finished. */ - appendStringInfoChar(&sasl_mechs, '\0'); - - sendAuthRequest(port, AUTH_REQ_SASL, sasl_mechs.data, sasl_mechs.len); - pfree(sasl_mechs.data); - - /* - * Loop through SASL message exchange. This exchange can consist of - * multiple messages sent in both directions. First message is always - * from the client. All messages from client to server are password - * packets (type 'p'). - */ - initial = true; - do - { - pq_startmsgread(); - mtype = pq_getbyte(); - if (mtype != 'p') - { - /* Only log error if client didn't disconnect. */ - if (mtype != EOF) - { - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("expected SASL response, got message type %d", - mtype))); - } - else - return STATUS_EOF; - } - - /* Get the actual SASL message */ - initStringInfo(&buf); - if (pq_getmessage(&buf, PG_MAX_SASL_MESSAGE_LENGTH)) - { - /* EOF - pq_getmessage already logged error */ - pfree(buf.data); - return STATUS_ERROR; - } - - elog(DEBUG4, "processing received SASL response of length %d", buf.len); - - /* - * The first SASLInitialResponse message is different from the others. - * It indicates which SASL mechanism the client selected, and contains - * an optional Initial Client Response payload. The subsequent - * SASLResponse messages contain just the SASL payload. - */ - if (initial) - { - const char *selected_mech; - - selected_mech = pq_getmsgrawstring(&buf); - - /* - * Initialize the status tracker for message exchanges. - * - * If the user doesn't exist, or doesn't have a valid password, or - * it's expired, we still go through the motions of SASL - * authentication, but tell the authentication method that the - * authentication is "doomed". That is, it's going to fail, no - * matter what. - * - * This is because we don't want to reveal to an attacker what - * usernames are valid, nor which users have a valid password. - */ - scram_opaq = pg_be_scram_init(port, selected_mech, shadow_pass); - - inputlen = pq_getmsgint(&buf, 4); - if (inputlen == -1) - input = NULL; - else - input = pq_getmsgbytes(&buf, inputlen); - - initial = false; - } - else - { - inputlen = buf.len; - input = pq_getmsgbytes(&buf, buf.len); - } - pq_getmsgend(&buf); - - /* - * The StringInfo guarantees that there's a \0 byte after the - * response. - */ - Assert(input == NULL || input[inputlen] == '\0'); - - /* - * we pass 'logdetail' as NULL when doing a mock authentication, - * because we should already have a better error message in that case - */ - result = pg_be_scram_exchange(scram_opaq, input, inputlen, - &output, &outputlen, - logdetail); - - /* input buffer no longer used */ - pfree(buf.data); - - if (output) - { - /* - * Negotiation generated data to be sent to the client. - */ - elog(DEBUG4, "sending SASL challenge of length %u", outputlen); - - if (result == SASL_EXCHANGE_SUCCESS) - sendAuthRequest(port, AUTH_REQ_SASL_FIN, output, outputlen); - else - sendAuthRequest(port, AUTH_REQ_SASL_CONT, output, outputlen); - - pfree(output); - } - } while (result == SASL_EXCHANGE_CONTINUE); - - /* Oops, Something bad happened */ - if (result != SASL_EXCHANGE_SUCCESS) - { - return STATUS_ERROR; - } - - return STATUS_OK; -} - /*---------------------------------------------------------------- * GSSAPI authentication system @@ -1156,8 +1001,8 @@ pg_GSS_recvauth(Port *port) /* gbuf no longer used */ pfree(buf.data); - elog(DEBUG5, "gss_accept_sec_context major: %d, " - "minor: %d, outlen: %u, outflags: %x", + elog(DEBUG5, "gss_accept_sec_context major: %u, " + "minor: %u, outlen: %u, outflags: %x", maj_stat, min_stat, (unsigned int) port->gss->outbuf.length, gflags); @@ -3180,7 +3025,7 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por struct addrinfo hint; struct addrinfo *serveraddrs; int port; - ACCEPT_TYPE_ARG3 addrsize; + socklen_t addrsize; fd_set fdset; struct timeval endtime; int i, @@ -3239,6 +3084,8 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por md5trailer = packet->vector; for (i = 0; i < encryptedpasswordlen; i += RADIUS_VECTOR_LENGTH) { + const char *errstr = NULL; + memcpy(cryptvector + strlen(secret), md5trailer, RADIUS_VECTOR_LENGTH); /* @@ -3247,10 +3094,12 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por */ md5trailer = encryptedpassword + i; - if (!pg_md5_binary(cryptvector, strlen(secret) + RADIUS_VECTOR_LENGTH, encryptedpassword + i)) + if (!pg_md5_binary(cryptvector, strlen(secret) + RADIUS_VECTOR_LENGTH, + encryptedpassword + i, &errstr)) { ereport(LOG, - (errmsg("could not perform MD5 encryption of password"))); + (errmsg("could not perform MD5 encryption of password: %s", + errstr))); pfree(cryptvector); pg_freeaddrinfo_all(hint.ai_family, serveraddrs); return STATUS_ERROR; @@ -3335,6 +3184,7 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por struct timeval timeout; struct timeval now; int64 timeoutval; + const char *errstr = NULL; gettimeofday(&now, NULL); timeoutval = (endtime.tv_sec * 1000000 + endtime.tv_usec) - (now.tv_sec * 1000000 + now.tv_usec); @@ -3453,10 +3303,11 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por if (!pg_md5_binary(cryptvector, packetlength + strlen(secret), - encryptedpassword)) + encryptedpassword, &errstr)) { ereport(LOG, - (errmsg("could not perform MD5 encryption of received packet"))); + (errmsg("could not perform MD5 encryption of received packet: %s", + errstr))); pfree(cryptvector); continue; } diff --git a/third_party/spanner_pg/src/backend/libpq/be-fsstubs.c b/third_party/spanner_pg/src/backend/libpq/be-fsstubs.c index 63eaccc8..58045328 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-fsstubs.c +++ b/third_party/spanner_pg/src/backend/libpq/be-fsstubs.c @@ -3,7 +3,7 @@ * be-fsstubs.c * Builtin functions for open/close/read/write operations on large objects * - * 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/third_party/spanner_pg/src/backend/libpq/be-gssapi-common.c b/third_party/spanner_pg/src/backend/libpq/be-gssapi-common.c index 38f58def..71b796d5 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-gssapi-common.c +++ b/third_party/spanner_pg/src/backend/libpq/be-gssapi-common.c @@ -3,7 +3,7 @@ * be-gssapi-common.c * Common code for GSSAPI authentication and encryption * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/libpq/be-secure-common.c b/third_party/spanner_pg/src/backend/libpq/be-secure-common.c index 7d082d78..2719ce14 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-secure-common.c +++ b/third_party/spanner_pg/src/backend/libpq/be-secure-common.c @@ -8,7 +8,7 @@ * communications code calls, this file contains support routines that are * used by the library-specific implementations such as be-secure-openssl.c. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/libpq/be-secure-gssapi.c b/third_party/spanner_pg/src/backend/libpq/be-secure-gssapi.c index 316ca65d..d3337a3d 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-secure-gssapi.c +++ b/third_party/spanner_pg/src/backend/libpq/be-secure-gssapi.c @@ -3,7 +3,7 @@ * be-secure-gssapi.c * GSSAPI encryption support * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/libpq/be-secure-gssapi.c @@ -60,8 +60,8 @@ static char *PqGSSSendBuffer; /* Encrypted data waiting to be sent */ static int PqGSSSendLength; /* End of data available in PqGSSSendBuffer */ static int PqGSSSendNext; /* Next index to send a byte from * PqGSSSendBuffer */ -static int PqGSSSendConsumed; /* Number of *unencrypted* bytes consumed for - * current contents of PqGSSSendBuffer */ +static int PqGSSSendConsumed; /* Number of source bytes encrypted but not + * yet reported as sent */ static char *PqGSSRecvBuffer; /* Received, encrypted data */ static int PqGSSRecvLength; /* End of data available in PqGSSRecvBuffer */ @@ -83,8 +83,8 @@ static uint32 PqGSSMaxPktSize; /* Maximum size we can encrypt and fit the * * On success, returns the number of data bytes consumed (possibly less than * len). On failure, returns -1 with errno set appropriately. For retryable - * errors, caller should call again (passing the same data) once the socket - * is ready. + * errors, caller should call again (passing the same or more data) once the + * socket is ready. * * Dealing with fatal errors here is a bit tricky: we can't invoke elog(FATAL) * since it would try to write to the client, probably resulting in infinite @@ -98,19 +98,25 @@ be_gssapi_write(Port *port, void *ptr, size_t len) minor; gss_buffer_desc input, output; - size_t bytes_sent = 0; size_t bytes_to_encrypt; size_t bytes_encrypted; gss_ctx_id_t gctx = port->gss->ctx; /* - * When we get a failure, we must not tell the caller we have successfully - * transmitted everything, else it won't retry. Hence a "success" - * (positive) return value must only count source bytes corresponding to - * fully-transmitted encrypted packets. The amount of source data - * corresponding to the current partly-transmitted packet is remembered in + * When we get a retryable failure, we must not tell the caller we have + * successfully transmitted everything, else it won't retry. For + * simplicity, we claim we haven't transmitted anything until we have + * successfully transmitted all "len" bytes. Between calls, the amount of + * the current input data that's already been encrypted and placed into + * PqGSSSendBuffer (and perhaps transmitted) is remembered in * PqGSSSendConsumed. On a retry, the caller *must* be sending that data * again, so if it offers a len less than that, something is wrong. + * + * Note: it may seem attractive to report partial write completion once + * we've successfully sent any encrypted packets. However, that can cause + * problems for callers; notably, pqPutMsgEnd's heuristic to send only + * full 8K blocks interacts badly with such a hack. We won't save much, + * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) { @@ -118,6 +124,7 @@ be_gssapi_write(Port *port, void *ptr, size_t len) errno = ECONNRESET; return -1; } + /* Discount whatever source data we already encrypted. */ bytes_to_encrypt = len - PqGSSSendConsumed; bytes_encrypted = PqGSSSendConsumed; @@ -146,33 +153,20 @@ be_gssapi_write(Port *port, void *ptr, size_t len) ret = secure_raw_write(port, PqGSSSendBuffer + PqGSSSendNext, amount); if (ret <= 0) - { - /* - * Report any previously-sent data; if there was none, reflect - * the secure_raw_write result up to our caller. When there - * was some, we're effectively assuming that any interesting - * failure condition will recur on the next try. - */ - if (bytes_sent) - return bytes_sent; return ret; - } /* * Check if this was a partial write, and if so, move forward that * far in our buffer and try again. */ - if (ret != amount) + if (ret < amount) { PqGSSSendNext += ret; continue; } - /* We've successfully sent whatever data was in that packet. */ - bytes_sent += PqGSSSendConsumed; - - /* All encrypted data was sent, our buffer is empty now. */ - PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + /* We've successfully sent whatever data was in the buffer. */ + PqGSSSendLength = PqGSSSendNext = 0; } /* @@ -196,7 +190,10 @@ be_gssapi_write(Port *port, void *ptr, size_t len) output.value = NULL; output.length = 0; - /* Create the next encrypted packet */ + /* + * Create the next encrypted packet. Any failure here is considered a + * hard failure, so we return -1 even if some data has been sent. + */ major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT, &input, &conf_state, &output); if (major != GSS_S_COMPLETE) @@ -239,10 +236,13 @@ be_gssapi_write(Port *port, void *ptr, size_t len) } /* If we get here, our counters should all match up. */ - Assert(bytes_sent == len); - Assert(bytes_sent == bytes_encrypted); + Assert(len == PqGSSSendConsumed); + Assert(len == bytes_encrypted); + + /* We're reporting all the data as sent, so reset PqGSSSendConsumed. */ + PqGSSSendConsumed = 0; - return bytes_sent; + return bytes_encrypted; } /* diff --git a/third_party/spanner_pg/src/backend/libpq/be-secure-openssl.c b/third_party/spanner_pg/src/backend/libpq/be-secure-openssl.c index 13ac9614..ed13e8b0 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-secure-openssl.c +++ b/third_party/spanner_pg/src/backend/libpq/be-secure-openssl.c @@ -4,7 +4,7 @@ * functions for OpenSSL support in the backend. * * - * 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 * * @@ -29,14 +29,6 @@ #include #endif -#include -#include -#include -#ifndef OPENSSL_NO_ECDH -#include -#endif - -#include "common/openssl.h" #include "libpq/libpq.h" #include "miscadmin.h" #include "pgstat.h" @@ -45,6 +37,21 @@ #include "tcop/tcopprot.h" #include "utils/memutils.h" +/* + * These SSL-related #includes must come after all system-provided headers. + * This ensures that OpenSSL can take care of conflicts with Windows' + * by #undef'ing the conflicting macros. (We don't directly + * include , but some other Windows headers do.) + */ +#include "common/openssl.h" +#include +#include +#ifndef OPENSSL_NO_ECDH +#include +#endif +#include + + /* default init hook can be overridden by a shared library */ static void default_openssl_tls_init(SSL_CTX *context, bool isServerStart); openssl_tls_init_hook_typ openssl_tls_init_hook = default_openssl_tls_init; @@ -450,6 +457,7 @@ be_tls_open_server(Port *port) * per-thread error queue following another call to an OpenSSL I/O * routine. */ + errno = 0; ERR_clear_error(); r = SSL_accept(port->ssl); if (r <= 0) @@ -486,7 +494,7 @@ be_tls_open_server(Port *port) WAIT_EVENT_SSL_OPEN_SERVER); goto aloop; case SSL_ERROR_SYSCALL: - if (r < 0) + if (r < 0 && errno != 0) ereport(COMMERROR, (errcode_for_socket_access(), errmsg("could not accept SSL connection: %m"))); @@ -608,8 +616,11 @@ be_tls_open_server(Port *port) bio = BIO_new(BIO_s_mem()); if (!bio) { - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } @@ -620,12 +631,15 @@ be_tls_open_server(Port *port) * which make regular expression matching a bit easier. Also note that * it prints the Subject fields in reverse order. */ - X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253); - if (BIO_get_mem_ptr(bio, &bio_buf) <= 0) + if (X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253) == -1 || + BIO_get_mem_ptr(bio, &bio_buf) <= 0) { BIO_free(bio); - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } peer_dn = MemoryContextAlloc(TopMemoryContext, bio_buf->length + 1); @@ -639,8 +653,11 @@ be_tls_open_server(Port *port) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("SSL certificate's distinguished name contains embedded null"))); pfree(peer_dn); - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } @@ -711,7 +728,7 @@ be_tls_read(Port *port, void *ptr, size_t len, int *waitfor) break; case SSL_ERROR_SYSCALL: /* leave it to caller to ereport the value of errno */ - if (n != -1) + if (n != -1 || errno == 0) { errno = ECONNRESET; n = -1; @@ -769,8 +786,14 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) n = -1; break; case SSL_ERROR_SYSCALL: - /* leave it to caller to ereport the value of errno */ - if (n != -1) + + /* + * Leave it to caller to ereport the value of errno. However, if + * errno is still zero then assume it's a read EOF situation, and + * report ECONNRESET. (This seems possible because SSL_write can + * also do reads.) + */ + if (n != -1 || errno == 0) { errno = ECONNRESET; n = -1; @@ -823,11 +846,6 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) * to retry; do we need to adopt their logic for that? */ -#ifndef HAVE_BIO_GET_DATA -#define BIO_get_data(bio) (bio->ptr) -#define BIO_set_data(bio, data) (bio->ptr = data) -#endif - static BIO_METHOD *my_bio_methods = NULL; static int @@ -837,7 +855,7 @@ my_sock_read(BIO *h, char *buf, int size) if (buf != NULL) { - res = secure_raw_read(((Port *) BIO_get_data(h)), buf, size); + res = secure_raw_read(((Port *) BIO_get_app_data(h)), buf, size); BIO_clear_retry_flags(h); if (res <= 0) { @@ -857,7 +875,7 @@ my_sock_write(BIO *h, const char *buf, int size) { int res = 0; - res = secure_raw_write(((Port *) BIO_get_data(h)), buf, size); + res = secure_raw_write(((Port *) BIO_get_app_data(h)), buf, size); BIO_clear_retry_flags(h); if (res <= 0) { @@ -933,7 +951,7 @@ my_SSL_set_fd(Port *port, int fd) SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } - BIO_set_data(bio, port); + BIO_set_app_data(bio, port); BIO_set_fd(bio, fd, BIO_NOCLOSE); SSL_set_bio(port->ssl, bio, bio); diff --git a/third_party/spanner_pg/src/backend/libpq/be-secure.c b/third_party/spanner_pg/src/backend/libpq/be-secure.c index 8ef08320..a05f67af 100644 --- a/third_party/spanner_pg/src/backend/libpq/be-secure.c +++ b/third_party/spanner_pg/src/backend/libpq/be-secure.c @@ -6,7 +6,7 @@ * message integrity and endpoint authentication. * * - * 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/third_party/spanner_pg/src/backend/libpq/crypt.c b/third_party/spanner_pg/src/backend/libpq/crypt.c index 3fcad991..1ff8b050 100644 --- a/third_party/spanner_pg/src/backend/libpq/crypt.c +++ b/third_party/spanner_pg/src/backend/libpq/crypt.c @@ -4,7 +4,7 @@ * Functions for dealing with encrypted passwords stored in * pg_authid.rolpassword. * - * 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 * * src/backend/libpq/crypt.c @@ -34,7 +34,7 @@ * sent to the client, to avoid giving away user information! */ char * -get_role_password(const char *role, char **logdetail) +get_role_password(const char *role, const char **logdetail) { TimestampTz vuntil = 0; HeapTuple roleTup; @@ -116,6 +116,7 @@ encrypt_password(PasswordType target_type, const char *role, { PasswordType guessed_type = get_password_type(password); char *encrypted_password; + const char *errstr = NULL; if (guessed_type != PASSWORD_TYPE_PLAINTEXT) { @@ -132,8 +133,8 @@ encrypt_password(PasswordType target_type, const char *role, encrypted_password = palloc(MD5_PASSWD_LEN + 1); if (!pg_md5_encrypt(password, role, strlen(role), - encrypted_password)) - elog(ERROR, "password encryption failed"); + encrypted_password, &errstr)) + elog(ERROR, "password encryption failed: %s", errstr); return encrypted_password; case PASSWORD_TYPE_SCRAM_SHA_256: @@ -159,17 +160,18 @@ encrypt_password(PasswordType target_type, const char *role, * 'client_pass' is the response given by the remote user to the MD5 challenge. * 'md5_salt' is the salt used in the MD5 authentication challenge. * - * In the error case, optionally store a palloc'd string at *logdetail - * that will be sent to the postmaster log (but not the client). + * In the error case, save a string at *logdetail that will be sent to the + * postmaster log (but not the client). */ int md5_crypt_verify(const char *role, const char *shadow_pass, const char *client_pass, const char *md5_salt, int md5_salt_len, - char **logdetail) + const char **logdetail) { int retval; char crypt_pwd[MD5_PASSWD_LEN + 1]; + const char *errstr = NULL; Assert(md5_salt_len > 0); @@ -183,16 +185,13 @@ md5_crypt_verify(const char *role, const char *shadow_pass, /* * Compute the correct answer for the MD5 challenge. - * - * We do not bother setting logdetail for any pg_md5_encrypt failure - * below: the only possible error is out-of-memory, which is unlikely, and - * if it did happen adding a psprintf call would only make things worse. */ /* stored password already encrypted, only do salt */ if (!pg_md5_encrypt(shadow_pass + strlen("md5"), md5_salt, md5_salt_len, - crypt_pwd)) + crypt_pwd, &errstr)) { + *logdetail = errstr; return STATUS_ERROR; } @@ -215,15 +214,16 @@ md5_crypt_verify(const char *role, const char *shadow_pass, * pg_authid.rolpassword. * 'client_pass' is the password given by the remote user. * - * In the error case, optionally store a palloc'd string at *logdetail - * that will be sent to the postmaster log (but not the client). + * In the error case, store a string at *logdetail that will be sent to the + * postmaster log (but not the client). */ int plain_crypt_verify(const char *role, const char *shadow_pass, const char *client_pass, - char **logdetail) + const char **logdetail) { char crypt_client_pass[MD5_PASSWD_LEN + 1]; + const char *errstr = NULL; /* * Client sent password in plaintext. If we have an MD5 hash stored, hash @@ -251,14 +251,10 @@ plain_crypt_verify(const char *role, const char *shadow_pass, if (!pg_md5_encrypt(client_pass, role, strlen(role), - crypt_client_pass)) + crypt_client_pass, + &errstr)) { - /* - * We do not bother setting logdetail for pg_md5_encrypt - * failure: the only possible error is out-of-memory, which is - * unlikely, and if it did happen adding a psprintf call would - * only make things worse. - */ + *logdetail = errstr; return STATUS_ERROR; } if (strcmp(crypt_client_pass, shadow_pass) == 0) diff --git a/third_party/spanner_pg/src/backend/libpq/hba.c b/third_party/spanner_pg/src/backend/libpq/hba.c index bcbe3cbf..59f37271 100644 --- a/third_party/spanner_pg/src/backend/libpq/hba.c +++ b/third_party/spanner_pg/src/backend/libpq/hba.c @@ -5,7 +5,7 @@ * wherein you authenticate a user by seeing what IP address the system * says he comes from and choosing authentication method based on it). * - * 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 * * @@ -70,32 +70,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. @@ -140,16 +114,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); /* @@ -290,31 +258,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; } @@ -331,7 +299,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 * @@ -355,7 +323,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; @@ -366,7 +334,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. @@ -421,7 +389,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); @@ -429,7 +397,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 */ @@ -446,9 +414,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)); } } } @@ -458,9 +426,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 @@ -468,14 +438,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; @@ -483,7 +454,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); @@ -502,7 +473,7 @@ tokenize_file(const char *filename, FILE *file, List **tok_lines, int elevel) /* Collect the next input line, handling backslash continuations */ resetStringInfo(&buf); - while (pg_get_line_append(file, &buf)) + while (pg_get_line_append(file, &buf, NULL)) { /* Strip trailing newline, including \r in case we're on Windows */ buf.len = pg_strip_crlf(buf.data); @@ -552,12 +523,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); @@ -602,13 +575,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) { @@ -626,13 +599,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) { @@ -916,25 +889,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) @@ -942,11 +912,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) @@ -964,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; @@ -978,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)); @@ -1041,7 +1012,6 @@ parse_hba_line(TokenizedLine *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"; @@ -1054,7 +1024,6 @@ parse_hba_line(TokenizedLine *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"; @@ -1099,7 +1068,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. */ @@ -1119,7 +1088,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) @@ -1687,8 +1656,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; } @@ -1808,7 +1777,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) { @@ -2140,12 +2108,12 @@ check_hba(hbaPort *port) /* Check connection type */ if (hba->conntype == ctLocal) { - if (!IS_AF_UNIX(port->raddr.addr.ss_family)) + if (port->raddr.addr.ss_family != AF_UNIX) continue; } else { - if (IS_AF_UNIX(port->raddr.addr.ss_family)) + if (port->raddr.addr.ss_family == AF_UNIX) continue; /* Check SSL state */ @@ -2259,7 +2227,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 */ @@ -2270,7 +2238,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 */ @@ -2330,432 +2298,13 @@ 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) -{ - 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. - */ - 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); - - /* Fill the tuplestore */ - fill_hba_view(tuple_store, tupdesc); - - PG_RETURN_NULL(); -} - /* * 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. @@ -2764,13 +2313,14 @@ pg_hba_file_rules(PG_FUNCTION_ARGS) * to have set a memory context that will be reset if this function returns * NULL. */ -static IdentLine * -parse_ident_line(TokenizedLine *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; - HbaToken *token; + AuthToken *token; IdentLine *parsedline; Assert(tok_line->fields != NIL); @@ -2821,11 +2371,14 @@ parse_ident_line(TokenizedLine *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; } @@ -3056,7 +2609,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 */ @@ -3067,7 +2620,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) @@ -3076,7 +2629,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/third_party/spanner_pg/src/backend/libpq/ifaddr.c b/third_party/spanner_pg/src/backend/libpq/ifaddr.c index 75760f3b..a41808af 100644 --- a/third_party/spanner_pg/src/backend/libpq/ifaddr.c +++ b/third_party/spanner_pg/src/backend/libpq/ifaddr.c @@ -3,7 +3,7 @@ * ifaddr.c * IP netmask calculations, and enumerating network interfaces. * - * 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/third_party/spanner_pg/src/backend/libpq/pqcomm.c b/third_party/spanner_pg/src/backend/libpq/pqcomm.c index 44782f2d..bb9fa77c 100644 --- a/third_party/spanner_pg/src/backend/libpq/pqcomm.c +++ b/third_party/spanner_pg/src/backend/libpq/pqcomm.c @@ -17,7 +17,7 @@ * the backend's "backend/libpq" is quite separate from "interfaces/libpq". * All that remains is similarities of names to trap the unwary... * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/pqcomm.c @@ -204,7 +204,7 @@ pq_init(void) (errmsg("could not set socket to nonblocking mode: %m"))); #endif - FeBeWaitSet = CreateWaitEventSet(TopMemoryContext, 3); + FeBeWaitSet = CreateWaitEventSet(TopMemoryContext, FeBeWaitSetNEvents); socket_pos = AddWaitEventToSet(FeBeWaitSet, WL_SOCKET_WRITEABLE, MyProcPort->sock, NULL, NULL); latch_pos = AddWaitEventToSet(FeBeWaitSet, WL_LATCH_SET, PGINVALID_SOCKET, @@ -393,7 +393,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, for (addr = addrs; addr; addr = addr->ai_next) { - if (!IS_AF_UNIX(family) && IS_AF_UNIX(addr->ai_family)) + if (family != AF_UNIX && addr->ai_family == AF_UNIX) { /* * Only set up a unix domain socket when they really asked for it. @@ -478,7 +478,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, * unpredictable behavior. With no flags at all, win32 behaves as Unix * with SO_REUSEADDR. */ - if (!IS_AF_UNIX(addr->ai_family)) + if (addr->ai_family != AF_UNIX) { if ((setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one))) == -1) @@ -530,7 +530,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, errmsg("could not bind %s address \"%s\": %m", familyDesc, addrDesc), saved_errno == EADDRINUSE ? - (IS_AF_UNIX(addr->ai_family) ? + (addr->ai_family == AF_UNIX ? errhint("Is another postmaster already running on port %d?", (int) portNumber) : errhint("Is another postmaster already running on port %d?" @@ -748,7 +748,7 @@ StreamConnection(pgsocket server_fd, Port *port) } /* select NODELAY and KEEPALIVE options if it's a TCP connection */ - if (!IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port->laddr.addr.ss_family != AF_UNIX) { int on; #ifdef WIN32 @@ -954,6 +954,8 @@ pq_recvbuf(void) { int r; + errno = 0; + r = secure_read(MyProcPort, PqRecvBuffer + PqRecvLength, PQ_RECV_BUFFER_SIZE - PqRecvLength); @@ -966,10 +968,13 @@ pq_recvbuf(void) * Careful: an ereport() that tries to write to the client would * cause recursion to here, leading to stack overflow and core * dump! This message must go *only* to the postmaster log. + * + * If errno is zero, assume it's EOF and let the caller complain. */ - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("could not receive data from client: %m"))); + if (errno != 0) + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("could not receive data from client: %m"))); return EOF; } if (r == 0) @@ -1046,6 +1051,8 @@ pq_getbyte_if_available(unsigned char *c) /* Put the socket into non-blocking mode */ socket_set_nonblocking(true); + errno = 0; + r = secure_read(MyProcPort, c, 1); if (r < 0) { @@ -1062,10 +1069,13 @@ pq_getbyte_if_available(unsigned char *c) * Careful: an ereport() that tries to write to the client would * cause recursion to here, leading to stack overflow and core * dump! This message must go *only* to the postmaster log. + * + * If errno is zero, assume it's EOF and let the caller complain. */ - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("could not receive data from client: %m"))); + if (errno != 0) + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("could not receive data from client: %m"))); r = EOF; } } @@ -1623,7 +1633,7 @@ int pq_getkeepalivesidle(Port *port) { #if defined(PG_TCP_KEEPALIVE_IDLE) || defined(SIO_KEEPALIVE_VALS) - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return 0; if (port->keepalives_idle != 0) @@ -1632,7 +1642,7 @@ pq_getkeepalivesidle(Port *port) if (port->default_keepalives_idle == 0) { #ifndef WIN32 - ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_idle); + socklen_t size = sizeof(port->default_keepalives_idle); if (getsockopt(port->sock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE, (char *) &port->default_keepalives_idle, @@ -1657,7 +1667,7 @@ pq_getkeepalivesidle(Port *port) int pq_setkeepalivesidle(int idle, Port *port) { - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return STATUS_OK; /* check SIO_KEEPALIVE_VALS here, not just WIN32, as some toolchains lack it */ @@ -1708,7 +1718,7 @@ int pq_getkeepalivesinterval(Port *port) { #if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS) - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return 0; if (port->keepalives_interval != 0) @@ -1717,7 +1727,7 @@ pq_getkeepalivesinterval(Port *port) if (port->default_keepalives_interval == 0) { #ifndef WIN32 - ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_interval); + socklen_t size = sizeof(port->default_keepalives_interval); if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPINTVL, (char *) &port->default_keepalives_interval, @@ -1742,7 +1752,7 @@ pq_getkeepalivesinterval(Port *port) int pq_setkeepalivesinterval(int interval, Port *port) { - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return STATUS_OK; #if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS) @@ -1792,7 +1802,7 @@ int pq_getkeepalivescount(Port *port) { #ifdef TCP_KEEPCNT - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return 0; if (port->keepalives_count != 0) @@ -1800,7 +1810,7 @@ pq_getkeepalivescount(Port *port) if (port->default_keepalives_count == 0) { - ACCEPT_TYPE_ARG3 size = sizeof(port->default_keepalives_count); + socklen_t size = sizeof(port->default_keepalives_count); if (getsockopt(port->sock, IPPROTO_TCP, TCP_KEEPCNT, (char *) &port->default_keepalives_count, @@ -1821,7 +1831,7 @@ pq_getkeepalivescount(Port *port) int pq_setkeepalivescount(int count, Port *port) { - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return STATUS_OK; #ifdef TCP_KEEPCNT @@ -1867,7 +1877,7 @@ int pq_gettcpusertimeout(Port *port) { #ifdef TCP_USER_TIMEOUT - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return 0; if (port->tcp_user_timeout != 0) @@ -1875,7 +1885,7 @@ pq_gettcpusertimeout(Port *port) if (port->default_tcp_user_timeout == 0) { - ACCEPT_TYPE_ARG3 size = sizeof(port->default_tcp_user_timeout); + socklen_t size = sizeof(port->default_tcp_user_timeout); if (getsockopt(port->sock, IPPROTO_TCP, TCP_USER_TIMEOUT, (char *) &port->default_tcp_user_timeout, @@ -1896,7 +1906,7 @@ pq_gettcpusertimeout(Port *port) int pq_settcpusertimeout(int timeout, Port *port) { - if (port == NULL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port == NULL || port->laddr.addr.ss_family == AF_UNIX) return STATUS_OK; #ifdef TCP_USER_TIMEOUT @@ -1944,33 +1954,33 @@ pq_settcpusertimeout(int timeout, Port *port) bool pq_check_connection(void) { -#if defined(POLLRDHUP) - /* - * POLLRDHUP is a Linux extension to poll(2) to detect sockets closed by - * the other end. We don't have a portable way to do that without - * actually trying to read or write data on other systems. We don't want - * to read because that would be confused by pipelined queries and COPY - * data. Perhaps in future we'll try to write a heartbeat message instead. - */ - struct pollfd pollfd; + WaitEvent events[FeBeWaitSetNEvents]; int rc; - pollfd.fd = MyProcPort->sock; - pollfd.events = POLLOUT | POLLIN | POLLRDHUP; - pollfd.revents = 0; - - rc = poll(&pollfd, 1, 0); + /* + * It's OK to modify the socket event filter without restoring, because + * all FeBeWaitSet socket wait sites do the same. + */ + ModifyWaitEvent(FeBeWaitSet, FeBeWaitSetSocketPos, WL_SOCKET_CLOSED, NULL); - if (rc < 0) +retry: + rc = WaitEventSetWait(FeBeWaitSet, 0, events, lengthof(events), 0); + for (int i = 0; i < rc; ++i) { - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("could not poll socket: %m"))); - return false; + if (events[i].events & WL_SOCKET_CLOSED) + return false; + if (events[i].events & WL_LATCH_SET) + { + /* + * A latch event might be preventing other events from being + * reported. Reset it and poll again. No need to restore it + * because no code should expect latches to survive across + * CHECK_FOR_INTERRUPTS(). + */ + ResetLatch(MyLatch); + goto retry; + } } - else if (rc == 1 && (pollfd.revents & (POLLHUP | POLLRDHUP))) - return false; -#endif return true; } diff --git a/third_party/spanner_pg/src/backend/libpq/pqformat.c b/third_party/spanner_pg/src/backend/libpq/pqformat.c index 19998988..9c24df33 100644 --- a/third_party/spanner_pg/src/backend/libpq/pqformat.c +++ b/third_party/spanner_pg/src/backend/libpq/pqformat.c @@ -21,7 +21,7 @@ * are different. * * - * 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 * * src/backend/libpq/pqformat.c diff --git a/third_party/spanner_pg/src/backend/libpq/pqmq.c b/third_party/spanner_pg/src/backend/libpq/pqmq.c index d1a1f47a..4d0415e3 100644 --- a/third_party/spanner_pg/src/backend/libpq/pqmq.c +++ b/third_party/spanner_pg/src/backend/libpq/pqmq.c @@ -3,7 +3,7 @@ * pqmq.c * Use the frontend/backend protocol for communication over a shm_mq * - * 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 * * src/backend/libpq/pqmq.c @@ -154,7 +154,12 @@ mq_putmessage(char msgtype, const char *s, size_t len) for (;;) { - result = shm_mq_sendv(pq_mq_handle, iov, 2, true); + /* + * Immediately notify the receiver by passing force_flush as true so + * that the shared memory value is updated before we send the parallel + * message signal right after this. + */ + result = shm_mq_sendv(pq_mq_handle, iov, 2, true, true); if (pq_mq_parallel_leader_pid != 0) SendProcSignal(pq_mq_parallel_leader_pid, diff --git a/third_party/spanner_pg/src/backend/libpq/pqsignal.c b/third_party/spanner_pg/src/backend/libpq/pqsignal.c index dedf3a45..26ed671d 100644 --- a/third_party/spanner_pg/src/backend/libpq/pqsignal.c +++ b/third_party/spanner_pg/src/backend/libpq/pqsignal.c @@ -3,7 +3,7 @@ * pqsignal.c * Backend signal(2) support (see also src/port/pqsignal.c) * - * 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/third_party/spanner_pg/src/backend/main/main.c b/third_party/spanner_pg/src/backend/main/main.c index 350ef5b7..f8f7ebbd 100644 --- a/third_party/spanner_pg/src/backend/main/main.c +++ b/third_party/spanner_pg/src/backend/main/main.c @@ -9,7 +9,7 @@ * proper FooMain() routine for the incarnation. * * - * 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 * * @@ -22,6 +22,10 @@ #include +#if defined(WIN32) +#include +#endif + #if defined(__NetBSD__) #include #endif @@ -181,33 +185,23 @@ main(int argc, char *argv[]) * Dispatch to one of various subprograms depending on first argument. */ + if (argc > 1 && strcmp(argv[1], "--check") == 0) + BootstrapModeMain(argc, argv, true); + else if (argc > 1 && strcmp(argv[1], "--boot") == 0) + BootstrapModeMain(argc, argv, false); #ifdef EXEC_BACKEND - if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0) - SubPostmasterMain(argc, argv); /* does not return */ -#endif - -#ifdef WIN32 - - /* - * Start our win32 signal implementation - * - * SubPostmasterMain() will do this for itself, but the remaining modes - * need it here - */ - pgwin32_signal_initialize(); + else if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0) + SubPostmasterMain(argc, argv); #endif - - if (argc > 1 && strcmp(argv[1], "--boot") == 0) - AuxiliaryProcessMain(argc, argv); /* does not return */ else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) - GucInfoMain(); /* does not return */ + GucInfoMain(); else if (argc > 1 && strcmp(argv[1], "--single") == 0) - PostgresMain(argc, argv, - NULL, /* no dbname */ - strdup(get_user_name_or_exit(progname))); /* does not return */ + PostgresSingleUserMain(argc, argv, + strdup(get_user_name_or_exit(progname))); else - PostmasterMain(argc, argv); /* does not return */ - abort(); /* should not get here */ + PostmasterMain(argc, argv); + /* the functions above should not return */ + abort(); } @@ -247,8 +241,55 @@ startup_hacks(const char *progname) exit(1); } - /* In case of general protection fault, don't show GUI popup box */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + /* + * By default abort() only generates a crash-dump in *non* debug + * builds. As our Assert() / ExceptionalCondition() uses abort(), + * leaving the default in place would make debugging harder. + * + * MINGW's own C runtime doesn't have _set_abort_behavior(). When + * 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. + */ +#if !defined(__MINGW32__) && !defined(__MINGW64__) + _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, + _CALL_REPORTFAULT | _WRITE_ABORT_MSG); +#endif /* !defined(__MINGW32__) && + * !defined(__MINGW64__) */ + + /* + * SEM_FAILCRITICALERRORS causes more errors to be reported to + * callers. + * + * We used to also specify SEM_NOGPFAULTERRORBOX, but that prevents + * windows crash reporting from working. Which includes registered + * just-in-time debuggers, making it unnecessarily hard to debug + * problems on windows. Now we try to disable sources of popups + * separately below (note that SEM_NOGPFAULTERRORBOX did not actually + * prevent all sources of such popups). + */ + SetErrorMode(SEM_FAILCRITICALERRORS); + + /* + * Show errors on stderr instead of popup box (note this doesn't + * affect errors originating in the C runtime, see below). + */ + _set_error_mode(_OUT_TO_STDERR); + + /* + * In DEBUG builds, errors, including assertions, C runtime errors are + * reported via _CrtDbgReport. By default such errors are displayed + * with a popup (even with NOGPFAULTERRORBOX), preventing forward + * progress. Instead report such errors stderr (and the debugger). + * This is C runtime specific and thus the above incantations aren't + * sufficient to suppress these popups. + */ + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); #if defined(_M_AMD64) && _MSC_VER == 1800 @@ -350,9 +391,9 @@ help(const char *progname) printf(_("\nOptions for bootstrapping mode:\n")); printf(_(" --boot selects bootstrapping mode (must be first argument)\n")); + printf(_(" --check selects check mode (must be first argument)\n")); printf(_(" DBNAME database name (mandatory argument in bootstrapping mode)\n")); printf(_(" -r FILENAME send stdout and stderr to given file\n")); - printf(_(" -x NUM internal use\n")); printf(_("\nPlease read the documentation for the complete list of run-time\n" "configuration settings and how to set them on the command line or in\n" diff --git a/third_party/spanner_pg/src/backend/nls.mk b/third_party/spanner_pg/src/backend/nls.mk index a0ddf8f3..6899f051 100644 --- a/third_party/spanner_pg/src/backend/nls.mk +++ b/third_party/spanner_pg/src/backend/nls.mk @@ -1,6 +1,6 @@ # src/backend/nls.mk CATALOG_NAME = postgres -AVAIL_LANGUAGES = de es fr it ja ko ru sv uk zh_CN +AVAIL_LANGUAGES = de es fr it ja ka ko ru sv uk zh_CN GETTEXT_FILES = + gettext-files GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) \ GUC_check_errmsg \ @@ -10,13 +10,15 @@ GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) \ yyerror \ parser_yyerror \ scanner_yyerror \ - report_invalid_record:2 + report_invalid_record:2 \ + ereport_startup_progress GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) \ GUC_check_errmsg:1:c-format \ GUC_check_errdetail:1:c-format \ GUC_check_errhint:1:c-format \ write_stderr:1:c-format \ - report_invalid_record:2:c-format + report_invalid_record:2:c-format \ + ereport_startup_progress:1:c-format gettext-files: distprep find $(srcdir) $(srcdir)/../common $(srcdir)/../port -name '*.c' -print | LC_ALL=C sort >$@ diff --git a/third_party/spanner_pg/src/backend/nodes/README b/third_party/spanner_pg/src/backend/nodes/README index dcd66d72..d066ac5c 100644 --- a/third_party/spanner_pg/src/backend/nodes/README +++ b/third_party/spanner_pg/src/backend/nodes/README @@ -28,7 +28,7 @@ FILES IN THIS DIRECTORY (src/backend/nodes/) list.c - generic list support params.c - Param support tidbitmap.c - TIDBitmap support - value.c - support for Value nodes + value.c - support for value nodes FILES IN src/include/nodes/ diff --git a/third_party/spanner_pg/src/backend/nodes/bitmapset.c b/third_party/spanner_pg/src/backend/nodes/bitmapset.c index bff70cfb..0a6c30e4 100644 --- a/third_party/spanner_pg/src/backend/nodes/bitmapset.c +++ b/third_party/spanner_pg/src/backend/nodes/bitmapset.c @@ -11,7 +11,7 @@ * bms_is_empty() in preference to testing for NULL.) * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/nodes/bitmapset.c diff --git a/third_party/spanner_pg/src/backend/nodes/copyfuncs.c b/third_party/spanner_pg/src/backend/nodes/copyfuncs.c index 1da7a129..9c9c1344 100644 --- a/third_party/spanner_pg/src/backend/nodes/copyfuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/copyfuncs.c @@ -11,7 +11,7 @@ * be handled easily in a simple depth-first traversal. * * - * 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 * * IDENTIFICATION @@ -54,6 +54,10 @@ #define COPY_STRING_FIELD(fldname) \ (newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL) +/* Copy a field that is an inline array */ +#define COPY_ARRAY_FIELD(fldname) \ + memcpy(newnode->fldname, from->fldname, sizeof(newnode->fldname)) + /* Copy a field that is a pointer to a simple palloc'd object of size sz */ #define COPY_POINTER_FIELD(fldname, sz) \ do { \ @@ -225,6 +229,7 @@ _copyModifyTable(const ModifyTable *from) COPY_NODE_FIELD(onConflictWhere); COPY_SCALAR_FIELD(exclRelRTI); COPY_NODE_FIELD(exclRelTlist); + COPY_NODE_FIELD(mergeActionLists); return newnode; } @@ -628,6 +633,7 @@ _copySubqueryScan(const SubqueryScan *from) * copy remainder of node */ COPY_NODE_FIELD(subplan); + COPY_SCALAR_FIELD(scanstatus); return newnode; } @@ -1099,11 +1105,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; } @@ -1727,6 +1736,7 @@ _copyScalarArrayOpExpr(const ScalarArrayOpExpr *from) COPY_SCALAR_FIELD(opno); COPY_SCALAR_FIELD(opfuncid); COPY_SCALAR_FIELD(hashfuncid); + COPY_SCALAR_FIELD(negfuncid); COPY_SCALAR_FIELD(useOr); COPY_SCALAR_FIELD(inputcollid); COPY_NODE_FIELD(args); @@ -2380,7 +2390,8 @@ _copyRestrictInfo(const RestrictInfo *from) COPY_SCALAR_FIELD(right_bucketsize); COPY_SCALAR_FIELD(left_mcvfreq); COPY_SCALAR_FIELD(right_mcvfreq); - COPY_SCALAR_FIELD(hasheqoperator); + COPY_SCALAR_FIELD(left_hasheqoperator); + COPY_SCALAR_FIELD(right_hasheqoperator); return newnode; } @@ -2594,6 +2605,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); @@ -2711,8 +2723,37 @@ _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 * -_copyAExpr(const A_Expr *from) +_copyA_Expr(const A_Expr *from) { A_Expr *newnode = makeNode(A_Expr); @@ -2748,29 +2789,37 @@ _copyParamRef(const ParamRef *from) } static A_Const * -_copyAConst(const A_Const *from) +_copyA_Const(const A_Const *from) { A_Const *newnode = makeNode(A_Const); - /* This part must duplicate _copyValue */ - COPY_SCALAR_FIELD(val.type); - switch (from->val.type) + COPY_SCALAR_FIELD(isnull); + if (!from->isnull) { - case T_Integer: - COPY_SCALAR_FIELD(val.val.ival); - break; - case T_Float: - case T_String: - case T_BitString: - COPY_STRING_FIELD(val.val.str); - break; - case T_Null: - /* nothing to do */ - break; - default: - elog(ERROR, "unrecognized node type: %d", - (int) from->val.type); - break; + /* This part must duplicate other _copy*() functions. */ + COPY_SCALAR_FIELD(val.node.type); + switch (nodeTag(&from->val)) + { + case T_Integer: + COPY_SCALAR_FIELD(val.ival.ival); + break; + case T_Float: + COPY_STRING_FIELD(val.fval.fval); + break; + case T_Boolean: + COPY_SCALAR_FIELD(val.boolval.boolval); + break; + case T_String: + COPY_STRING_FIELD(val.sval.sval); + break; + case T_BitString: + COPY_STRING_FIELD(val.bsval.bsval); + break; + default: + elog(ERROR, "unrecognized node type: %d", + (int) nodeTag(&from->val)); + break; + } } COPY_LOCATION_FIELD(location); @@ -2800,7 +2849,7 @@ _copyFuncCall(const FuncCall *from) } static A_Star * -_copyAStar(const A_Star *from) +_copyA_Star(const A_Star *from) { A_Star *newnode = makeNode(A_Star); @@ -2808,7 +2857,7 @@ _copyAStar(const A_Star *from) } static A_Indices * -_copyAIndices(const A_Indices *from) +_copyA_Indices(const A_Indices *from) { A_Indices *newnode = makeNode(A_Indices); @@ -3080,6 +3129,7 @@ _copyConstraint(const Constraint *from) COPY_NODE_FIELD(raw_expr); COPY_STRING_FIELD(cooked_expr); COPY_SCALAR_FIELD(generated_when); + COPY_SCALAR_FIELD(nulls_not_distinct); COPY_SCALAR_FIELD(stored_kind); COPY_NODE_FIELD(keys); COPY_NODE_FIELD(including); @@ -3096,6 +3146,7 @@ _copyConstraint(const Constraint *from) COPY_SCALAR_FIELD(fk_matchtype); COPY_SCALAR_FIELD(fk_upd_action); COPY_SCALAR_FIELD(fk_del_action); + COPY_NODE_FIELD(fk_del_set_cols); COPY_NODE_FIELD(old_conpfeqop); COPY_SCALAR_FIELD(old_pktable_oid); COPY_SCALAR_FIELD(skip_validation); @@ -3211,6 +3262,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); @@ -3275,6 +3328,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) { @@ -3680,6 +3747,7 @@ _copyIndexStmt(const IndexStmt *from) COPY_SCALAR_FIELD(oldCreateSubid); COPY_SCALAR_FIELD(oldFirstRelfilenodeSubid); COPY_SCALAR_FIELD(unique); + COPY_SCALAR_FIELD(nulls_not_distinct); COPY_SCALAR_FIELD(primary); COPY_SCALAR_FIELD(isconstraint); COPY_SCALAR_FIELD(deferrable); @@ -4098,6 +4166,16 @@ _copyAlterDatabaseStmt(const AlterDatabaseStmt *from) return newnode; } +static AlterDatabaseRefreshCollStmt * +_copyAlterDatabaseRefreshCollStmt(const AlterDatabaseRefreshCollStmt *from) +{ + AlterDatabaseRefreshCollStmt *newnode = makeNode(AlterDatabaseRefreshCollStmt); + + COPY_STRING_FIELD(dbname); + + return newnode; +} + static AlterDatabaseSetStmt * _copyAlterDatabaseSetStmt(const AlterDatabaseSetStmt *from) { @@ -4880,6 +4958,31 @@ _copyPartitionCmd(const PartitionCmd *from) return newnode; } +static PublicationObjSpec * +_copyPublicationObject(const PublicationObjSpec *from) +{ + PublicationObjSpec *newnode = makeNode(PublicationObjSpec); + + COPY_SCALAR_FIELD(pubobjtype); + COPY_STRING_FIELD(name); + COPY_NODE_FIELD(pubtable); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +static PublicationTable * +_copyPublicationTable(const PublicationTable *from) +{ + PublicationTable *newnode = makeNode(PublicationTable); + + COPY_NODE_FIELD(relation); + COPY_NODE_FIELD(whereClause); + COPY_NODE_FIELD(columns); + + return newnode; +} + static CreatePublicationStmt * _copyCreatePublicationStmt(const CreatePublicationStmt *from) { @@ -4887,7 +4990,7 @@ _copyCreatePublicationStmt(const CreatePublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tables); + COPY_NODE_FIELD(pubobjects); COPY_SCALAR_FIELD(for_all_tables); return newnode; @@ -4900,9 +5003,9 @@ _copyAlterPublicationStmt(const AlterPublicationStmt *from) COPY_STRING_FIELD(pubname); COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tables); + COPY_NODE_FIELD(pubobjects); COPY_SCALAR_FIELD(for_all_tables); - COPY_SCALAR_FIELD(tableAction); + COPY_SCALAR_FIELD(action); return newnode; } @@ -5021,32 +5124,53 @@ _copyExtensibleNode(const ExtensibleNode *from) * value.h copy functions * **************************************************************** */ -static Value * -_copyValue(const Value *from) +static Integer * +_copyInteger(const Integer *from) { - Value *newnode = makeNode(Value); + Integer *newnode = makeNode(Integer); - /* See also _copyAConst when changing this code! */ + COPY_SCALAR_FIELD(ival); + + return newnode; +} + +static Float * +_copyFloat(const Float *from) +{ + Float *newnode = makeNode(Float); + + COPY_STRING_FIELD(fval); + + return newnode; +} + +static Boolean * +_copyBoolean(const Boolean *from) +{ + Boolean *newnode = makeNode(Boolean); + + COPY_SCALAR_FIELD(boolval); + + return newnode; +} + +static String * +_copyString(const String *from) +{ + String *newnode = makeNode(String); + + COPY_STRING_FIELD(sval); + + return newnode; +} + +static BitString * +_copyBitString(const BitString *from) +{ + BitString *newnode = makeNode(BitString); + + COPY_STRING_FIELD(bsval); - COPY_SCALAR_FIELD(type); - switch (from->type) - { - case T_Integer: - COPY_SCALAR_FIELD(val.ival); - break; - case T_Float: - case T_String: - case T_BitString: - COPY_STRING_FIELD(val.str); - break; - case T_Null: - /* nothing to do */ - break; - default: - elog(ERROR, "unrecognized node type: %d", - (int) from->type); - break; - } return newnode; } @@ -5060,15 +5184,13 @@ _copyForeignKeyCacheInfo(const ForeignKeyCacheInfo *from) COPY_SCALAR_FIELD(conrelid); COPY_SCALAR_FIELD(confrelid); COPY_SCALAR_FIELD(nkeys); - /* COPY_SCALAR_FIELD might work for these, but let's not assume that */ - memcpy(newnode->conkey, from->conkey, sizeof(newnode->conkey)); - memcpy(newnode->confkey, from->confkey, sizeof(newnode->confkey)); - memcpy(newnode->conpfeqop, from->conpfeqop, sizeof(newnode->conpfeqop)); + COPY_ARRAY_FIELD(conkey); + COPY_ARRAY_FIELD(confkey); + COPY_ARRAY_FIELD(conpfeqop); return newnode; } - /* * copyObjectImpl -- implementation of copyObject(); see nodes/nodes.h * @@ -5437,11 +5559,19 @@ copyObjectImpl(const void *from) * VALUE NODES */ case T_Integer: + retval = _copyInteger(from); + break; case T_Float: + retval = _copyFloat(from); + break; + case T_Boolean: + retval = _copyBoolean(from); + break; case T_String: + retval = _copyString(from); + break; case T_BitString: - case T_Null: - retval = _copyValue(from); + retval = _copyBitString(from); break; /* @@ -5485,6 +5615,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; @@ -5656,6 +5789,9 @@ copyObjectImpl(const void *from) case T_AlterDatabaseStmt: retval = _copyAlterDatabaseStmt(from); break; + case T_AlterDatabaseRefreshCollStmt: + retval = _copyAlterDatabaseRefreshCollStmt(from); + break; case T_AlterDatabaseSetStmt: retval = _copyAlterDatabaseSetStmt(from); break; @@ -5847,8 +5983,9 @@ copyObjectImpl(const void *from) break; case T_AlterChangeStreamStmt: retval = _copyAlterChangeStreamStmt(from); + break; case T_A_Expr: - retval = _copyAExpr(from); + retval = _copyA_Expr(from); break; case T_ColumnRef: retval = _copyColumnRef(from); @@ -5857,16 +5994,16 @@ copyObjectImpl(const void *from) retval = _copyParamRef(from); break; case T_A_Const: - retval = _copyAConst(from); + retval = _copyA_Const(from); break; case T_FuncCall: retval = _copyFuncCall(from); break; case T_A_Star: - retval = _copyAStar(from); + retval = _copyA_Star(from); break; case T_A_Indices: - retval = _copyAIndices(from); + retval = _copyA_Indices(from); break; case T_A_Indirection: retval = _copyA_Indirection(from); @@ -5970,6 +6107,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; @@ -6000,6 +6143,12 @@ copyObjectImpl(const void *from) case T_PartitionCmd: retval = _copyPartitionCmd(from); break; + case T_PublicationObjSpec: + retval = _copyPublicationObject(from); + break; + case T_PublicationTable: + retval = _copyPublicationTable(from); + break; case T_AlterSpangresStatsStmt: retval = _copyAlterSpangresStatsStmt(from); break; diff --git a/third_party/spanner_pg/src/backend/nodes/equalfuncs.c b/third_party/spanner_pg/src/backend/nodes/equalfuncs.c index c3367aeb..ca88c1cc 100644 --- a/third_party/spanner_pg/src/backend/nodes/equalfuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/equalfuncs.c @@ -18,7 +18,7 @@ * "x" to be considered equal() to another reference to "x" in the query. * * - * 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 * * IDENTIFICATION @@ -75,6 +75,13 @@ #define equalstr(a, b) \ (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b)) +/* Compare a field that is an inline array */ +#define COMPARE_ARRAY_FIELD(fldname) \ + do { \ + if (memcmp(a->fldname, b->fldname, sizeof(a->fldname)) != 0) \ + return false; \ + } while (0) + /* Compare a field that is a pointer to a simple palloc'd object of size sz */ #define COMPARE_POINTER_FIELD(fldname, sz) \ do { \ @@ -419,6 +426,12 @@ _equalScalarArrayOpExpr(const ScalarArrayOpExpr *a, const ScalarArrayOpExpr *b) b->hashfuncid != 0) return false; + /* Likewise for the negfuncid */ + if (a->negfuncid != b->negfuncid && + a->negfuncid != 0 && + b->negfuncid != 0) + return false; + COMPARE_SCALAR_FIELD(useOr); COMPARE_SCALAR_FIELD(inputcollid); COMPARE_NODE_FIELD(args); @@ -1005,6 +1018,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); COMPARE_NODE_FIELD(statementHints); @@ -1063,6 +1078,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) { @@ -1402,6 +1429,7 @@ _equalIndexStmt(const IndexStmt *a, const IndexStmt *b) COMPARE_SCALAR_FIELD(oldCreateSubid); COMPARE_SCALAR_FIELD(oldFirstRelfilenodeSubid); COMPARE_SCALAR_FIELD(unique); + COMPARE_SCALAR_FIELD(nulls_not_distinct); COMPARE_SCALAR_FIELD(primary); COMPARE_SCALAR_FIELD(isconstraint); COMPARE_SCALAR_FIELD(deferrable); @@ -1756,6 +1784,14 @@ _equalAlterDatabaseStmt(const AlterDatabaseStmt *a, const AlterDatabaseStmt *b) return true; } +static bool +_equalAlterDatabaseRefreshCollStmt(const AlterDatabaseRefreshCollStmt *a, const AlterDatabaseRefreshCollStmt *b) +{ + COMPARE_STRING_FIELD(dbname); + + return true; +} + static bool _equalAlterDatabaseSetStmt(const AlterDatabaseSetStmt *a, const AlterDatabaseSetStmt *b) { @@ -2318,13 +2354,35 @@ _equalAlterTSConfigurationStmt(const AlterTSConfigurationStmt *a, return true; } +static bool +_equalPublicationObject(const PublicationObjSpec *a, + const PublicationObjSpec *b) +{ + COMPARE_SCALAR_FIELD(pubobjtype); + COMPARE_STRING_FIELD(name); + COMPARE_NODE_FIELD(pubtable); + COMPARE_LOCATION_FIELD(location); + + return true; +} + +static bool +_equalPublicationTable(const PublicationTable *a, const PublicationTable *b) +{ + COMPARE_NODE_FIELD(relation); + COMPARE_NODE_FIELD(whereClause); + COMPARE_NODE_FIELD(columns); + + return true; +} + static bool _equalCreatePublicationStmt(const CreatePublicationStmt *a, const CreatePublicationStmt *b) { COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); - COMPARE_NODE_FIELD(tables); + COMPARE_NODE_FIELD(pubobjects); COMPARE_SCALAR_FIELD(for_all_tables); return true; @@ -2336,9 +2394,9 @@ _equalAlterPublicationStmt(const AlterPublicationStmt *a, { COMPARE_STRING_FIELD(pubname); COMPARE_NODE_FIELD(options); - COMPARE_NODE_FIELD(tables); + COMPARE_NODE_FIELD(pubobjects); COMPARE_SCALAR_FIELD(for_all_tables); - COMPARE_SCALAR_FIELD(tableAction); + COMPARE_SCALAR_FIELD(action); return true; } @@ -2444,7 +2502,7 @@ _equalAlterPolicyStmt(const AlterPolicyStmt *a, const AlterPolicyStmt *b) } static bool -_equalAExpr(const A_Expr *a, const A_Expr *b) +_equalA_Expr(const A_Expr *a, const A_Expr *b) { COMPARE_SCALAR_FIELD(kind); COMPARE_NODE_FIELD(name); @@ -2474,10 +2532,15 @@ _equalParamRef(const ParamRef *a, const ParamRef *b) } static bool -_equalAConst(const A_Const *a, const A_Const *b) +_equalA_Const(const A_Const *a, const A_Const *b) { - if (!equal(&a->val, &b->val)) /* hack for in-line Value field */ + /* + * Hack for in-line val field. Also val is not valid is isnull is true. + */ + if (!a->isnull && !b->isnull && + !equal(&a->val, &b->val)) return false; + COMPARE_SCALAR_FIELD(isnull); COMPARE_LOCATION_FIELD(location); return true; @@ -2503,13 +2566,13 @@ _equalFuncCall(const FuncCall *a, const FuncCall *b) } static bool -_equalAStar(const A_Star *a, const A_Star *b) +_equalA_Star(const A_Star *a, const A_Star *b) { return true; } static bool -_equalAIndices(const A_Indices *a, const A_Indices *b) +_equalA_Indices(const A_Indices *a, const A_Indices *b) { COMPARE_SCALAR_FIELD(is_slice); COMPARE_NODE_FIELD(lidx); @@ -2745,6 +2808,7 @@ _equalConstraint(const Constraint *a, const Constraint *b) COMPARE_NODE_FIELD(raw_expr); COMPARE_STRING_FIELD(cooked_expr); COMPARE_SCALAR_FIELD(generated_when); + COMPARE_SCALAR_FIELD(nulls_not_distinct); COMPARE_SCALAR_FIELD(stored_kind); COMPARE_NODE_FIELD(keys); COMPARE_NODE_FIELD(including); @@ -2761,6 +2825,7 @@ _equalConstraint(const Constraint *a, const Constraint *b) COMPARE_SCALAR_FIELD(fk_matchtype); COMPARE_SCALAR_FIELD(fk_upd_action); COMPARE_SCALAR_FIELD(fk_del_action); + COMPARE_NODE_FIELD(fk_del_set_cols); COMPARE_NODE_FIELD(old_conpfeqop); COMPARE_SCALAR_FIELD(old_pktable_oid); COMPARE_SCALAR_FIELD(skip_validation); @@ -2906,6 +2971,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); @@ -3009,6 +3075,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) { @@ -3198,27 +3290,41 @@ _equalList(const List *a, const List *b) */ static bool -_equalValue(const Value *a, const Value *b) +_equalInteger(const Integer *a, const Integer *b) { - COMPARE_SCALAR_FIELD(type); + COMPARE_SCALAR_FIELD(ival); - switch (a->type) - { - case T_Integer: - COMPARE_SCALAR_FIELD(val.ival); - break; - case T_Float: - case T_String: - case T_BitString: - COMPARE_STRING_FIELD(val.str); - break; - case T_Null: - /* nothing to do */ - break; - default: - elog(ERROR, "unrecognized node type: %d", (int) a->type); - break; - } + return true; +} + +static bool +_equalFloat(const Float *a, const Float *b) +{ + COMPARE_STRING_FIELD(fval); + + return true; +} + +static bool +_equalBoolean(const Boolean *a, const Boolean *b) +{ + COMPARE_SCALAR_FIELD(boolval); + + return true; +} + +static bool +_equalString(const String *a, const String *b) +{ + COMPARE_STRING_FIELD(sval); + + return true; +} + +static bool +_equalBitString(const BitString *a, const BitString *b) +{ + COMPARE_STRING_FIELD(bsval); return true; } @@ -3438,11 +3544,19 @@ equal(const void *a, const void *b) break; case T_Integer: + retval = _equalInteger(a, b); + break; case T_Float: + retval = _equalFloat(a, b); + break; + case T_Boolean: + retval = _equalBoolean(a, b); + break; case T_String: + retval = _equalString(a, b); + break; case T_BitString: - case T_Null: - retval = _equalValue(a, b); + retval = _equalBitString(a, b); break; /* @@ -3470,6 +3584,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; @@ -3641,6 +3758,9 @@ equal(const void *a, const void *b) case T_AlterDatabaseStmt: retval = _equalAlterDatabaseStmt(a, b); break; + case T_AlterDatabaseRefreshCollStmt: + retval = _equalAlterDatabaseRefreshCollStmt(a, b); + break; case T_AlterDatabaseSetStmt: retval = _equalAlterDatabaseSetStmt(a, b); break; @@ -3834,7 +3954,7 @@ equal(const void *a, const void *b) retval = _equalAlterChangeStreamStmt(a, b); break; case T_A_Expr: - retval = _equalAExpr(a, b); + retval = _equalA_Expr(a, b); break; case T_ColumnRef: retval = _equalColumnRef(a, b); @@ -3843,16 +3963,16 @@ equal(const void *a, const void *b) retval = _equalParamRef(a, b); break; case T_A_Const: - retval = _equalAConst(a, b); + retval = _equalA_Const(a, b); break; case T_FuncCall: retval = _equalFuncCall(a, b); break; case T_A_Star: - retval = _equalAStar(a, b); + retval = _equalA_Star(a, b); break; case T_A_Indices: - retval = _equalAIndices(a, b); + retval = _equalA_Indices(a, b); break; case T_A_Indirection: retval = _equalA_Indirection(a, b); @@ -3956,6 +4076,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; @@ -3986,6 +4112,12 @@ equal(const void *a, const void *b) case T_PartitionCmd: retval = _equalPartitionCmd(a, b); break; + case T_PublicationObjSpec: + retval = _equalPublicationObject(a, b); + break; + case T_PublicationTable: + retval = _equalPublicationTable(a, b); + break; case T_InterleaveSpec: retval = _equalInterleaveSpec(a, b); break; diff --git a/third_party/spanner_pg/src/backend/nodes/extensible.c b/third_party/spanner_pg/src/backend/nodes/extensible.c index 1489df07..50db4c11 100644 --- a/third_party/spanner_pg/src/backend/nodes/extensible.c +++ b/third_party/spanner_pg/src/backend/nodes/extensible.c @@ -10,7 +10,7 @@ * and GetExtensibleNodeMethods to get information about a previously * registered type of extensible node. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/nodes/list.c b/third_party/spanner_pg/src/backend/nodes/list.c index 12847e35..90f93e89 100644 --- a/third_party/spanner_pg/src/backend/nodes/list.c +++ b/third_party/spanner_pg/src/backend/nodes/list.c @@ -6,7 +6,7 @@ * See comments in pg_list.h. * * - * 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 * * @@ -410,6 +410,9 @@ insert_new_cell(List *list, int pos) /* * Insert the given datum at position 'pos' (measured from 0) in the list. * 'pos' must be valid, ie, 0 <= pos <= list's length. + * + * Note that this takes time proportional to the distance to the end of the + * list, since the following entries must be moved. */ List * list_insert_nth(List *list, int pos, void *datum) @@ -460,6 +463,9 @@ list_insert_nth_oid(List *list, int pos, Oid datum) * value, rather than continuing to use the pointer passed as the * second argument. * + * Note that this takes time proportional to the length of the list, + * since the existing entries must be moved. + * * Caution: before Postgres 8.0, the original List was unmodified and * could be considered to retain its separate identity. This is no longer * the case. @@ -525,6 +531,10 @@ lcons_oid(Oid datum, List *list) * Callers should be sure to use the return value as the new pointer to the * concatenated list: the 'list1' input pointer may or may not be the same * as the returned pointer. + * + * Note that this takes at least time proportional to the length of list2. + * It'd typically be the case that we have to enlarge list1's storage, + * probably adding time proportional to the length of list1. */ List * list_concat(List *list1, const List *list2) @@ -623,6 +633,8 @@ list_truncate(List *list, int new_size) * Return true iff 'datum' is a member of the list. Equality is * determined via equal(), so callers should ensure that they pass a * Node as 'datum'. + * + * This does a simple linear search --- avoid using it on long lists. */ bool list_member(const List *list, const void *datum) @@ -706,6 +718,9 @@ list_member_oid(const List *list, Oid datum) * Delete the n'th cell (counting from 0) in list. * * The List is pfree'd if this was the last member. + * + * Note that this takes time proportional to the distance to the end of the + * list, since the following entries must be moved. */ List * list_delete_nth_cell(List *list, int n) @@ -777,6 +792,9 @@ list_delete_nth_cell(List *list, int n) * * The List is pfree'd if this was the last member. However, we do not * touch any data the cell might've been pointing to. + * + * Note that this takes time proportional to the distance to the end of the + * list, since the following entries must be moved. */ List * list_delete_cell(List *list, ListCell *cell) @@ -787,6 +805,8 @@ list_delete_cell(List *list, ListCell *cell) /* * Delete the first cell in list that matches datum, if any. * Equality is determined via equal(). + * + * This does a simple linear search --- avoid using it on long lists. */ List * list_delete(List *list, void *datum) @@ -870,6 +890,13 @@ list_delete_oid(List *list, Oid datum) * where the intent is to alter the list rather than just traverse it. * Beware that the list is modified, whereas the Lisp-y coding leaves * the original list head intact in case there's another pointer to it. + * + * Note that this takes time proportional to the length of the list, + * since the remaining entries must be moved. Consider reversing the + * list order so that you can use list_delete_last() instead. However, + * if that causes you to replace lappend() with lcons(), you haven't + * improved matters. (In short, you can make an efficient stack from + * a List, but not an efficient FIFO queue.) */ List * list_delete_first(List *list) @@ -884,9 +911,6 @@ list_delete_first(List *list) /* * Delete the last element of the list. - * - * This is the opposite of list_delete_first(), but is noticeably cheaper - * with a long list, since no data need be moved. */ List * list_delete_last(List *list) @@ -910,6 +934,9 @@ list_delete_last(List *list) * Delete the first N cells of the list. * * The List is pfree'd if the request causes all cells to be deleted. + * + * Note that this takes time proportional to the distance to the end of the + * list, since the following entries must be moved. */ List * list_delete_first_n(List *list, int n) @@ -989,8 +1016,10 @@ list_delete_first_n(List *list, int n) * you probably want to use list_concat_unique() instead to avoid wasting * the storage of the old x list. * - * This function could probably be implemented a lot faster if it is a - * performance bottleneck. + * Note that this takes time proportional to the product of the list + * lengths, so beware of using it on long lists. (We could probably + * improve that, but really you should be using some other data structure + * if this'd be a performance bottleneck.) */ List * list_union(const List *list1, const List *list2) @@ -1094,6 +1123,11 @@ list_union_oid(const List *list1, const List *list2) * This variant works on lists of pointers, and determines list * membership via equal(). Note that the list1 member will be pointed * to in the result. + * + * Note that this takes time proportional to the product of the list + * lengths, so beware of using it on long lists. (We could probably + * improve that, but really you should be using some other data structure + * if this'd be a performance bottleneck.) */ List * list_intersection(const List *list1, const List *list2) @@ -1152,6 +1186,11 @@ list_intersection_int(const List *list1, const List *list2) * * This variant works on lists of pointers, and determines list * membership via equal() + * + * Note that this takes time proportional to the product of the list + * lengths, so beware of using it on long lists. (We could probably + * improve that, but really you should be using some other data structure + * if this'd be a performance bottleneck.) */ List * list_difference(const List *list1, const List *list2) @@ -1256,6 +1295,8 @@ list_difference_oid(const List *list1, const List *list2) * * Whether an element is already a member of the list is determined * via equal(). + * + * This does a simple linear search --- avoid using it on long lists. */ List * list_append_unique(List *list, void *datum) @@ -1313,6 +1354,11 @@ list_append_unique_oid(List *list, Oid datum) * modified in-place rather than being copied. However, callers of this * function may have strict ordering expectations -- i.e. that the relative * order of those list2 elements that are not duplicates is preserved. + * + * Note that this takes time proportional to the product of the list + * lengths, so beware of using it on long lists. (We could probably + * improve that, but really you should be using some other data structure + * if this'd be a performance bottleneck.) */ List * list_concat_unique(List *list1, const List *list2) @@ -1401,6 +1447,8 @@ list_concat_unique_oid(List *list1, const List *list2) * * It is caller's responsibility to have sorted the list to bring duplicates * together, perhaps via list_sort(list, list_oid_cmp). + * + * Note that this takes time proportional to the length of the list. */ void list_deduplicate_oid(List *list) @@ -1496,6 +1544,27 @@ list_copy(const List *oldlist) return newlist; } +/* + * Return a shallow copy of the specified list containing only the first 'len' + * elements. If oldlist is shorter than 'len' then we copy the entire list. + */ +List * +list_copy_head(const List *oldlist, int len) +{ + List *newlist; + + if (oldlist == NIL || len <= 0) + return NIL; + + len = Min(oldlist->length, len); + + newlist = new_list(oldlist->type, len); + memcpy(newlist->elements, oldlist->elements, len * sizeof(ListCell)); + + check_list_invariants(newlist); + return newlist; +} + /* * Return a shallow copy of the specified list, without the first N elements. */ @@ -1557,6 +1626,8 @@ list_copy_deep(const List *oldlist) * * Like qsort(), this provides no guarantees about sort stability * for equal keys. + * + * This is based on qsort(), so it likewise has O(N log N) runtime. */ void list_sort(List *list, list_sort_comparator cmp) diff --git a/third_party/spanner_pg/src/backend/nodes/makefuncs.c b/third_party/spanner_pg/src/backend/nodes/makefuncs.c index 32dbd0a7..a88539f6 100644 --- a/third_party/spanner_pg/src/backend/nodes/makefuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/makefuncs.c @@ -4,7 +4,7 @@ * creator functions for various nodes. The functions here are for the * most frequently created nodes. * - * 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 * * @@ -64,7 +64,7 @@ makeSimpleA_Expr(A_Expr_Kind kind, char *name, * creates a Var node */ Var * -makeVar(Index varno, +makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, @@ -86,7 +86,7 @@ makeVar(Index varno, * them, but just initialize them to the given varno/varattno. This * reduces code clutter and chance of error for most callers. */ - var->varnosyn = varno; + var->varnosyn = (Index) varno; var->varattnosyn = varattno; /* Likewise, we just set location to "unknown" here */ @@ -101,7 +101,7 @@ makeVar(Index varno, * TargetEntry */ Var * -makeVarFromTargetEntry(Index varno, +makeVarFromTargetEntry(int varno, TargetEntry *tle) { return makeVar(varno, @@ -132,7 +132,7 @@ makeVarFromTargetEntry(Index varno, */ Var * makeWholeRowVar(RangeTblEntry *rte, - Index varno, + int varno, Index varlevelsup, bool allowScalar) { @@ -744,7 +744,7 @@ make_ands_implicit(Expr *clause) */ IndexInfo * makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, List *expressions, - List *predicates, bool unique, bool isready, bool concurrent) + List *predicates, bool unique, bool nulls_not_distinct, bool isready, bool concurrent) { IndexInfo *n = makeNode(IndexInfo); @@ -753,7 +753,10 @@ makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, List *expressions, Assert(n->ii_NumIndexKeyAttrs != 0); Assert(n->ii_NumIndexKeyAttrs <= n->ii_NumIndexAttrs); n->ii_Unique = unique; + n->ii_NullsNotDistinct = nulls_not_distinct; n->ii_ReadyForInserts = isready; + n->ii_CheckedUnchanged = false; + n->ii_IndexUnchanged = false; n->ii_Concurrent = concurrent; /* expressions */ diff --git a/third_party/spanner_pg/src/backend/nodes/nodeFuncs.c b/third_party/spanner_pg/src/backend/nodes/nodeFuncs.c index c0e4e047..a31282aa 100644 --- a/third_party/spanner_pg/src/backend/nodes/nodeFuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/nodeFuncs.c @@ -3,7 +3,7 @@ * nodeFuncs.c * Various general-purpose manipulations of Node trees * - * 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 * * @@ -2183,6 +2183,8 @@ expression_tree_walker(Node *node, return true; if (walker(wc->endOffset, context)) return true; + if (walker(wc->runCondition, context)) + return true; } break; case T_CTECycleClause: @@ -2212,6 +2214,26 @@ expression_tree_walker(Node *node, return true; } break; + case T_PartitionBoundSpec: + { + PartitionBoundSpec *pbs = (PartitionBoundSpec *) node; + + if (walker(pbs->listdatums, context)) + return true; + if (walker(pbs->lowerdatums, context)) + return true; + if (walker(pbs->upperdatums, context)) + return true; + } + break; + case T_PartitionRangeDatum: + { + PartitionRangeDatum *prd = (PartitionRangeDatum *) node; + + if (walker(prd->value, context)) + return true; + } + break; case T_List: foreach(temp, (List *) node) { @@ -2245,6 +2267,16 @@ expression_tree_walker(Node *node, return true; } break; + case T_MergeAction: + { + MergeAction *action = (MergeAction *) node; + + if (walker(action->qual, context)) + return true; + if (walker(action->targetList, context)) + return true; + } + break; case T_PartitionPruneStepOp: { PartitionPruneStepOp *opstep = (PartitionPruneStepOp *) node; @@ -2383,6 +2415,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)) @@ -2428,6 +2462,8 @@ query_tree_walker(Query *query, return true; if (walker(wc->endOffset, context)) return true; + if (walker(wc->runCondition, context)) + return true; } } @@ -2619,11 +2655,6 @@ expression_tree_mutator(Node *node, ( (newnode) = (nodetype *) palloc(sizeof(nodetype)), \ memcpy((newnode), (node), sizeof(nodetype)) ) -#define CHECKFLATCOPY(newnode, node, nodetype) \ - ( AssertMacro(IsA((node), nodetype)), \ - (newnode) = (nodetype *) palloc(sizeof(nodetype)), \ - memcpy((newnode), (node), sizeof(nodetype)) ) - #define MUTATE(newfield, oldfield, fieldtype) \ ( (newfield) = (fieldtype) mutator((Node *) (oldfield), context) ) @@ -3070,6 +3101,7 @@ expression_tree_mutator(Node *node, MUTATE(newnode->orderClause, wc->orderClause, List *); MUTATE(newnode->startOffset, wc->startOffset, Node *); MUTATE(newnode->endOffset, wc->endOffset, Node *); + MUTATE(newnode->runCondition, wc->runCondition, List *); return (Node *) newnode; } break; @@ -3103,6 +3135,28 @@ expression_tree_mutator(Node *node, return (Node *) newnode; } break; + case T_PartitionBoundSpec: + { + PartitionBoundSpec *pbs = (PartitionBoundSpec *) node; + PartitionBoundSpec *newnode; + + FLATCOPY(newnode, pbs, PartitionBoundSpec); + MUTATE(newnode->listdatums, pbs->listdatums, List *); + MUTATE(newnode->lowerdatums, pbs->lowerdatums, List *); + MUTATE(newnode->upperdatums, pbs->upperdatums, List *); + return (Node *) newnode; + } + break; + case T_PartitionRangeDatum: + { + PartitionRangeDatum *prd = (PartitionRangeDatum *) node; + PartitionRangeDatum *newnode; + + FLATCOPY(newnode, prd, PartitionRangeDatum); + MUTATE(newnode->value, prd->value, Node *); + return (Node *) newnode; + } + break; case T_List: { /* @@ -3149,6 +3203,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; @@ -3303,9 +3369,9 @@ expression_tree_mutator(Node *node, * which is the bitwise OR of flag values to suppress mutating of * indicated items. (More flag bits may be added as needed.) * - * Normally the Query node itself is copied, but some callers want it to be - * modified in-place; they must pass QTW_DONT_COPY_QUERY in flags. All - * modified substructure is safely copied in any case. + * Normally the top-level Query node itself is copied, but some callers want + * it to be modified in-place; they must pass QTW_DONT_COPY_QUERY in flags. + * All modified substructure is safely copied in any case. */ Query * query_tree_mutator(Query *query, @@ -3326,6 +3392,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 *); @@ -3364,6 +3431,7 @@ query_tree_mutator(Query *query, FLATCOPY(newnode, wc, WindowClause); MUTATE(newnode->startOffset, wc->startOffset, Node *); MUTATE(newnode->endOffset, wc->endOffset, Node *); + MUTATE(newnode->runCondition, wc->runCondition, List *); resultlist = lappend(resultlist, (Node *) newnode); } @@ -3420,10 +3488,7 @@ range_table_mutator(List *rtable, break; case RTE_SUBQUERY: if (!(flags & QTW_IGNORE_RT_SUBQUERIES)) - { - CHECKFLATCOPY(newrte->subquery, rte->subquery, Query); - MUTATE(newrte->subquery, newrte->subquery, Query *); - } + MUTATE(newrte->subquery, rte->subquery, Query *); else { /* else, copy RT subqueries as-is */ @@ -3518,9 +3583,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, @@ -3546,9 +3611,9 @@ raw_expression_tree_walker(Node *node, case T_SQLValueFunction: case T_Integer: case T_Float: + case T_Boolean: case T_String: case T_BitString: - case T_Null: case T_ParamRef: case T_A_Const: case T_A_Star: @@ -3700,6 +3765,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/third_party/spanner_pg/src/backend/nodes/nodes.c b/third_party/spanner_pg/src/backend/nodes/nodes.c index a292b412..c2d3b6ac 100644 --- a/third_party/spanner_pg/src/backend/nodes/nodes.c +++ b/third_party/spanner_pg/src/backend/nodes/nodes.c @@ -4,7 +4,7 @@ * support code for nodes (now that we have removed the home-brew * inheritance system, our support code for nodes is much simpler) * - * 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/third_party/spanner_pg/src/backend/nodes/outfuncs.c b/third_party/spanner_pg/src/backend/nodes/outfuncs.c index 07fe8164..76a1fcff 100644 --- a/third_party/spanner_pg/src/backend/nodes/outfuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/outfuncs.c @@ -3,7 +3,7 @@ * outfuncs.c * Output functions for Postgres tree nodes. * - * 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 * * @@ -127,6 +127,20 @@ 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) " "); \ + 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) \ do { \ appendStringInfoString(str, " :" CppAsString(fldname) " "); \ @@ -425,6 +439,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 @@ -633,6 +648,7 @@ _outSubqueryScan(StringInfo str, const SubqueryScan *node) _outScanInfo(str, (const Scan *) node); WRITE_NODE_FIELD(subplan); + WRITE_ENUM_FIELD(scanstatus, SubqueryScanStatus); } static void @@ -823,11 +839,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 @@ -1128,7 +1147,7 @@ _outVar(StringInfo str, const Var *node) { WRITE_NODE_TYPE("VAR"); - WRITE_UINT_FIELD(varno); + WRITE_INT_FIELD(varno); WRITE_INT_FIELD(varattno); WRITE_OID_FIELD(vartype); WRITE_INT_FIELD(vartypmod); @@ -1326,6 +1345,7 @@ _outScalarArrayOpExpr(StringInfo str, const ScalarArrayOpExpr *node) WRITE_OID_FIELD(opno); WRITE_OID_FIELD(opfuncid); WRITE_OID_FIELD(hashfuncid); + WRITE_OID_FIELD(negfuncid); WRITE_BOOL_FIELD(useOr); WRITE_OID_FIELD(inputcollid); WRITE_NODE_FIELD(args); @@ -1480,7 +1500,7 @@ _outConvertRowtypeExpr(StringInfo str, const ConvertRowtypeExpr *node) static void _outCollateExpr(StringInfo str, const CollateExpr *node) { - WRITE_NODE_TYPE("COLLATE"); + WRITE_NODE_TYPE("COLLATEEXPR"); WRITE_NODE_FIELD(arg); WRITE_OID_FIELD(collOid); @@ -1490,7 +1510,7 @@ _outCollateExpr(StringInfo str, const CollateExpr *node) static void _outCaseExpr(StringInfo str, const CaseExpr *node) { - WRITE_NODE_TYPE("CASE"); + WRITE_NODE_TYPE("CASEEXPR"); WRITE_OID_FIELD(casetype); WRITE_OID_FIELD(casecollid); @@ -1503,7 +1523,7 @@ _outCaseExpr(StringInfo str, const CaseExpr *node) static void _outCaseWhen(StringInfo str, const CaseWhen *node) { - WRITE_NODE_TYPE("WHEN"); + WRITE_NODE_TYPE("CASEWHEN"); WRITE_NODE_FIELD(expr); WRITE_NODE_FIELD(result); @@ -1523,7 +1543,7 @@ _outCaseTestExpr(StringInfo str, const CaseTestExpr *node) static void _outArrayExpr(StringInfo str, const ArrayExpr *node) { - WRITE_NODE_TYPE("ARRAY"); + WRITE_NODE_TYPE("ARRAYEXPR"); WRITE_OID_FIELD(array_typeid); WRITE_OID_FIELD(array_collid); @@ -1536,7 +1556,7 @@ _outArrayExpr(StringInfo str, const ArrayExpr *node) static void _outRowExpr(StringInfo str, const RowExpr *node) { - WRITE_NODE_TYPE("ROW"); + WRITE_NODE_TYPE("ROWEXPR"); WRITE_NODE_FIELD(args); WRITE_OID_FIELD(row_typeid); @@ -1548,7 +1568,7 @@ _outRowExpr(StringInfo str, const RowExpr *node) static void _outRowCompareExpr(StringInfo str, const RowCompareExpr *node) { - WRITE_NODE_TYPE("ROWCOMPARE"); + WRITE_NODE_TYPE("ROWCOMPAREEXPR"); WRITE_ENUM_FIELD(rctype, RowCompareType); WRITE_NODE_FIELD(opnos); @@ -1561,7 +1581,7 @@ _outRowCompareExpr(StringInfo str, const RowCompareExpr *node) static void _outCoalesceExpr(StringInfo str, const CoalesceExpr *node) { - WRITE_NODE_TYPE("COALESCE"); + WRITE_NODE_TYPE("COALESCEEXPR"); WRITE_OID_FIELD(coalescetype); WRITE_OID_FIELD(coalescecollid); @@ -1572,7 +1592,7 @@ _outCoalesceExpr(StringInfo str, const CoalesceExpr *node) static void _outMinMaxExpr(StringInfo str, const MinMaxExpr *node) { - WRITE_NODE_TYPE("MINMAX"); + WRITE_NODE_TYPE("MINMAXEXPR"); WRITE_OID_FIELD(minmaxtype); WRITE_OID_FIELD(minmaxcollid); @@ -2147,6 +2167,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 @@ -2211,6 +2233,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 @@ -2403,6 +2426,7 @@ _outRelOptInfo(StringInfo str, const RelOptInfo *node) WRITE_BOOL_FIELD(consider_partitionwise_join); WRITE_BITMAPSET_FIELD(top_parent_relids); WRITE_BOOL_FIELD(partbounds_merged); + WRITE_BITMAPSET_FIELD(live_parts); WRITE_BITMAPSET_FIELD(all_partrels); } @@ -2526,14 +2550,7 @@ _outPathTarget(StringInfo str, const PathTarget *node) WRITE_NODE_TYPE("PATHTARGET"); WRITE_NODE_FIELD(exprs); - if (node->sortgrouprefs) - { - int i; - - appendStringInfoString(str, " :sortgrouprefs"); - for (i = 0; i < list_length(node->exprs); i++) - appendStringInfo(str, " %u", node->sortgrouprefs[i]); - } + WRITE_INDEX_ARRAY(sortgrouprefs, list_length(node->exprs)); WRITE_FLOAT_FIELD(cost.startup, "%.2f"); WRITE_FLOAT_FIELD(cost.per_tuple, "%.2f"); WRITE_INT_FIELD(width); @@ -2581,7 +2598,8 @@ _outRestrictInfo(StringInfo str, const RestrictInfo *node) WRITE_NODE_FIELD(right_em); WRITE_BOOL_FIELD(outer_is_left); WRITE_OID_FIELD(hashjoinoperator); - WRITE_OID_FIELD(hasheqoperator); + WRITE_OID_FIELD(left_hasheqoperator); + WRITE_OID_FIELD(right_hasheqoperator); } static void @@ -2789,6 +2807,7 @@ _outIndexStmt(StringInfo str, const IndexStmt *node) WRITE_UINT_FIELD(oldCreateSubid); WRITE_UINT_FIELD(oldFirstRelfilenodeSubid); WRITE_BOOL_FIELD(unique); + WRITE_BOOL_FIELD(nulls_not_distinct); WRITE_BOOL_FIELD(primary); WRITE_BOOL_FIELD(isconstraint); WRITE_BOOL_FIELD(deferrable); @@ -2826,7 +2845,7 @@ _outAlterStatsStmt(StringInfo str, const AlterStatsStmt *node) static void _outNotifyStmt(StringInfo str, const NotifyStmt *node) { - WRITE_NODE_TYPE("NOTIFY"); + WRITE_NODE_TYPE("NOTIFYSTMT"); WRITE_STRING_FIELD(conditionname); WRITE_STRING_FIELD(payload); @@ -2835,7 +2854,7 @@ _outNotifyStmt(StringInfo str, const NotifyStmt *node) static void _outDeclareCursorStmt(StringInfo str, const DeclareCursorStmt *node) { - WRITE_NODE_TYPE("DECLARECURSOR"); + WRITE_NODE_TYPE("DECLARECURSORSTMT"); WRITE_STRING_FIELD(portalname); WRITE_INT_FIELD(options); @@ -3129,6 +3148,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); WRITE_NODE_FIELD(statementHints); @@ -3180,6 +3201,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); @@ -3258,6 +3280,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) { @@ -3276,7 +3324,7 @@ _outSetOperationStmt(StringInfo str, const SetOperationStmt *node) static void _outRangeTblEntry(StringInfo str, const RangeTblEntry *node) { - WRITE_NODE_TYPE("RTE"); + WRITE_NODE_TYPE("RANGETBLENTRY"); /* put alias + eref first to make dump more legible */ WRITE_NODE_FIELD(alias); @@ -3378,7 +3426,7 @@ _outTableSampleClause(StringInfo str, const TableSampleClause *node) } static void -_outAExpr(StringInfo str, const A_Expr *node) +_outA_Expr(StringInfo str, const A_Expr *node) { WRITE_NODE_TYPE("AEXPR"); @@ -3460,49 +3508,50 @@ _outAExpr(StringInfo str, const A_Expr *node) } static void -_outValue(StringInfo str, const Value *value) +_outInteger(StringInfo str, const Integer *node) { - switch (value->type) - { - case T_Integer: - appendStringInfo(str, "%d", value->val.ival); - break; - case T_Float: + appendStringInfo(str, "%d", node->ival); +} - /* - * We assume the value is a valid numeric literal and so does not - * need quoting. - */ - appendStringInfoString(str, value->val.str); - break; - case T_String: - - /* - * We use outToken to provide escaping of the string's content, - * but we don't want it to do anything with an empty string. - */ - appendStringInfoChar(str, '"'); - if (value->val.str[0] != '\0') - outToken(str, value->val.str); - appendStringInfoChar(str, '"'); - break; - case T_BitString: - /* internal representation already has leading 'b' but no quote */ - appendStringInfoChar(str, 'b'); - appendStringInfoChar(str, '"'); - const char* payload = value->val.str; - if (payload[0] == 'b' && payload[1] != '\0') - outToken(str, payload + 1); - appendStringInfoChar(str, '"'); - break; - case T_Null: - /* this is seen only within A_Const, not in transformed trees */ - appendStringInfoString(str, "NULL"); - break; - default: - elog(ERROR, "unrecognized node type: %d", (int) value->type); - break; - } +static void +_outFloat(StringInfo str, const Float *node) +{ + /* + * We assume the value is a valid numeric literal and so does not need + * quoting. + */ + appendStringInfoString(str, node->fval); +} + +static void +_outBoolean(StringInfo str, const Boolean *node) +{ + appendStringInfoString(str, node->boolval ? "true" : "false"); +} + +static void +_outString(StringInfo str, const String *node) +{ + /* + * We use outToken to provide escaping of the string's content, but we + * don't want it to do anything with an empty string. + */ + appendStringInfoChar(str, '"'); + if (node->sval[0] != '\0') + outToken(str, node->sval); + appendStringInfoChar(str, '"'); +} + +static void +_outBitString(StringInfo str, const BitString *node) +{ + /* internal representation already has leading 'b' but no quote */ + appendStringInfoChar(str, 'b'); + appendStringInfoChar(str, '"'); + const char* payload = node->bsval; + if (payload[0] == 'b' && payload[1] != '\0') + outToken(str, payload + 1); + appendStringInfoChar(str, '"'); } static void @@ -3539,12 +3588,17 @@ _outRawStmt(StringInfo str, const RawStmt *node) } static void -_outAConst(StringInfo str, const A_Const *node) +_outA_Const(StringInfo str, const A_Const *node) { WRITE_NODE_TYPE("A_CONST"); - appendStringInfoString(str, " :val "); - _outValue(str, &(node->val)); + if (node->isnull) + appendStringInfoString(str, " NULL"); + else + { + appendStringInfoString(str, " :val "); + outNode(str, &node->val); + } WRITE_LOCATION_FIELD(location); } @@ -4251,14 +4305,17 @@ outNode(StringInfo str, const void *obj) appendStringInfoString(str, "<>"); else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList)) _outList(str, obj); - else if (IsA(obj, Integer) || - IsA(obj, Float) || - IsA(obj, String) || - IsA(obj, BitString)) - { - /* nodeRead does not want to see { } around these! */ - _outValue(str, obj); - } + /* nodeRead does not want to see { } around these! */ + else if (IsA(obj, Integer)) + _outInteger(str, (Integer *) obj); + else if (IsA(obj, Float)) + _outFloat(str, (Float *) obj); + else if (IsA(obj, Boolean)) + _outBoolean(str, (Boolean *) obj); + else if (IsA(obj, String)) + _outString(str, (String *) obj); + else if (IsA(obj, BitString)) + _outBitString(str, (BitString *) obj); else { appendStringInfoChar(str, '{'); @@ -4834,6 +4891,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; @@ -4847,7 +4910,7 @@ outNode(StringInfo str, const void *obj) _outTableSampleClause(str, obj); break; case T_A_Expr: - _outAExpr(str, obj); + _outA_Expr(str, obj); break; case T_ColumnRef: _outColumnRef(str, obj); @@ -4859,7 +4922,7 @@ outNode(StringInfo str, const void *obj) _outRawStmt(str, obj); break; case T_A_Const: - _outAConst(str, obj); + _outA_Const(str, obj); break; case T_A_Star: _outA_Star(str, obj); diff --git a/third_party/spanner_pg/src/backend/nodes/params.c b/third_party/spanner_pg/src/backend/nodes/params.c index f9812ff7..9f4bfa49 100644 --- a/third_party/spanner_pg/src/backend/nodes/params.c +++ b/third_party/spanner_pg/src/backend/nodes/params.c @@ -4,7 +4,7 @@ * Support for finding the values associated with Param nodes. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/nodes/print.c b/third_party/spanner_pg/src/backend/nodes/print.c index 8c0f5da0..34b14172 100644 --- a/third_party/spanner_pg/src/backend/nodes/print.c +++ b/third_party/spanner_pg/src/backend/nodes/print.c @@ -3,7 +3,7 @@ * print.c * various print routines (used mostly for debugging) * - * 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/third_party/spanner_pg/src/backend/nodes/read.c b/third_party/spanner_pg/src/backend/nodes/read.c index bb767c61..d93d201a 100644 --- a/third_party/spanner_pg/src/backend/nodes/read.c +++ b/third_party/spanner_pg/src/backend/nodes/read.c @@ -4,7 +4,7 @@ * routines to convert a string (legal ascii representation of node) back * to nodes * - * 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 * * @@ -241,7 +241,7 @@ debackslash(const char *token, int length) * nodeTokenType - * returns the type of the node token contained in token. * It returns one of the following valid NodeTags: - * T_Integer, T_Float, T_String, T_BitString + * T_Integer, T_Float, T_Boolean, T_String, T_BitString * and some of its own: * RIGHT_PAREN, LEFT_PAREN, LEFT_BRACE, OTHER_TOKEN * @@ -289,6 +289,9 @@ nodeTokenType(const char *token, int length) retval = RIGHT_PAREN; else if (*token == '{') retval = LEFT_BRACE; + else if ((length == 4 && strncmp(token, "true", 4) == 0) || + (length == 5 && strncmp(token, "false", 5) == 0)) + retval = T_Boolean; else if (*token == '"' && length > 1 && token[length - 1] == '"') retval = T_String; else if (*token == 'b') @@ -304,7 +307,7 @@ nodeTokenType(const char *token, int length) * * This routine applies some semantic knowledge on top of the purely * lexical tokenizer pg_strtok(). It can read - * * Value token nodes (integers, floats, or strings); + * * Value token nodes (integers, floats, booleans, or strings); * * General nodes (via parseNodeString() from readfuncs.c); * * Lists of the above; * * Lists of integers or OIDs. @@ -448,6 +451,9 @@ nodeRead(const char *token, int tok_len) result = (Node *) makeFloat(fval); } break; + case T_Boolean: + result = (Node *) makeBoolean(token[0] == 't'); + break; case T_String: /* need to remove leading and trailing quotes, and backslashes */ result = (Node *) makeString(debackslash(token + 1, tok_len - 2)); diff --git a/third_party/spanner_pg/src/backend/nodes/readfuncs.c b/third_party/spanner_pg/src/backend/nodes/readfuncs.c index 81b02333..b5fa34bd 100644 --- a/third_party/spanner_pg/src/backend/nodes/readfuncs.c +++ b/third_party/spanner_pg/src/backend/nodes/readfuncs.c @@ -3,7 +3,7 @@ * readfuncs.c * Reader functions for Postgres tree nodes. * - * 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 * * @@ -32,13 +32,11 @@ #include -#include "fmgr.h" #include "miscadmin.h" #include "nodes/extensible.h" #include "nodes/parsenodes.h" #include "nodes/plannodes.h" #include "nodes/readfuncs.h" -#include "utils/builtins.h" #include "third_party/spanner_pg/shims/parser_shim.h" @@ -81,7 +79,7 @@ #define READ_UINT64_FIELD(fldname) \ token = pg_strtok(&length); /* skip :fldname */ \ token = pg_strtok(&length); /* get field value */ \ - local_node->fldname = pg_strtouint64(token, NULL, 10) + local_node->fldname = strtou64(token, NULL, 10) /* Read a long integer field (anything written as ":fldname %ld") */ #define READ_LONG_FIELD(fldname) \ @@ -286,6 +284,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); READ_NODE_FIELD(statementHints); @@ -420,6 +420,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); @@ -510,6 +511,42 @@ _readCommonTableExpr(void) READ_DONE(); } +/* + * _readMergeWhenClause + */ +static MergeWhenClause * +_readMergeWhenClause(void) +{ + READ_LOCALS(MergeWhenClause); + + READ_BOOL_FIELD(matched); + READ_ENUM_FIELD(commandType, CmdType); + READ_ENUM_FIELD(override, OverridingKind); + READ_NODE_FIELD(condition); + READ_NODE_FIELD(targetList); + READ_NODE_FIELD(values); + + 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 */ @@ -617,7 +654,7 @@ _readVar(void) { READ_LOCALS(Var); - READ_UINT_FIELD(varno); + READ_INT_FIELD(varno); READ_INT_FIELD(varattno); READ_OID_FIELD(vartype); READ_INT_FIELD(vartypmod); @@ -703,11 +740,18 @@ static bool TokenIsInteger(const char* token, size_t len) { * strings, bitstrings, and NULL. * It is intended to be an exact inverse of `_outValue()` in outfuncs.c. */ -static Value -_readValue(void) +static void +_readValue(A_Const *aconst) { READ_TEMP_LOCALS(); - Value value; + token = pg_strtok(&length); /* check NULL or skip ::val */ + + if (length == 4 && + token[0] == 'N' && token[1] == 'U' && + token[2] == 'L' && token[3] == 'L') { + aconst->isnull = true; + return; + } token = pg_strtok(&length); @@ -717,40 +761,45 @@ _readValue(void) int64 int64_value = atol(token); int32 int32_value = int64_value; if (TokenIsInteger(token, length) && int64_value == (int64)int32_value) { - value.type = T_Integer; - value.val.ival = int32_value; + aconst->val.node.type = T_Integer; + aconst->val.ival.ival = int32_value; } else { // "Float" really means "Not a simple int32; keep as a string for no" - value.type = T_Float; - value.val.str = pnstrdup(token, length); + aconst->val.node.type = T_Float; + aconst->val.fval.fval = pnstrdup(token, length); } } else if (token[0] == '"' && token[length-1] == '"') { - value.type = T_String; - value.val.str = debackslash(token+1, length-2); + aconst->val.node.type = T_String; + aconst->val.sval.sval = debackslash(token+1, length-2); } else if (token[0] == 'b') { // Sanity check if (token[1] != '"' || token[length-1] != '"') { elog(ERROR, "Unrecognized bit string value at %.32s", token); } - value.type = T_BitString; + aconst->val.node.type = T_BitString; // Strip quotes and backslashes, but keep the leading 'b'. char* payload = debackslash(token+2, length-3); - value.val.str = palloc(length-1); - snprintf(value.val.str, length-1, "b%s", payload); + aconst->val.bsval.bsval = palloc(length-1); + snprintf(aconst->val.bsval.bsval, length-1, "b%s", payload); pfree(payload); } + else if (length == 5 && + token[0] == 'f' && token[1] == 'a' && token[2] == 'l'&& + token[3] == 's' && token[4] == 'e') { + aconst->val.node.type = T_Boolean; + aconst->val.boolval.boolval = false; + } else if (length == 4 && - token[0] == 'N' && token[1] == 'U' && - token[2] == 'L' && token[3] == 'L') { - value.type = T_Null; - value.val.ival = 0; - } else { + token[0] == 't' && token[1] == 'r' && + token[2] == 'u' && token[3] == 'e') { + aconst->val.node.type = T_Boolean; + aconst->val.boolval.boolval = true; + } + else { elog(ERROR, "Unrecognized value at %.32s", token); } - - return value; } /* @@ -761,8 +810,7 @@ _readAConst(void) { READ_LOCALS(A_Const); - token = pg_strtok(&length); /* skip ::val */ - local_node->val = _readValue(); + _readValue(local_node); READ_LOCATION_FIELD(location); READ_DONE(); @@ -1253,6 +1301,7 @@ _readScalarArrayOpExpr(void) READ_OID_FIELD(opno); READ_OID_FIELD(opfuncid); READ_OID_FIELD(hashfuncid); + READ_OID_FIELD(negfuncid); READ_BOOL_FIELD(useOr); READ_OID_FIELD(inputcollid); READ_NODE_FIELD(args); @@ -2365,6 +2414,7 @@ _readModifyTable(void) READ_NODE_FIELD(onConflictWhere); READ_UINT_FIELD(exclRelRTI); READ_NODE_FIELD(exclRelTlist); + READ_NODE_FIELD(mergeActionLists); READ_DONE(); } @@ -2496,7 +2546,7 @@ _readSeqScan(void) { READ_LOCALS_NO_FIELDS(SeqScan); - ReadCommonScan(local_node); + ReadCommonScan(&local_node->scan); READ_DONE(); } @@ -2631,6 +2681,7 @@ _readSubqueryScan(void) ReadCommonScan(&local_node->scan); READ_NODE_FIELD(subplan); + READ_ENUM_FIELD(scanstatus, SubqueryScanStatus); READ_DONE(); } @@ -3012,11 +3063,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(); } @@ -3665,6 +3719,7 @@ _readIndexStmt(void) READ_UINT_FIELD(oldCreateSubid); READ_UINT_FIELD(oldFirstRelfilenodeSubid); READ_BOOL_FIELD(unique); + READ_BOOL_FIELD(nulls_not_distinct); READ_BOOL_FIELD(primary); READ_BOOL_FIELD(isconstraint); READ_BOOL_FIELD(deferrable); @@ -4014,6 +4069,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)) @@ -4066,23 +4125,23 @@ parseNodeString(void) return_value = _readArrayCoerceExpr(); else if (MATCH("CONVERTROWTYPEEXPR", 18)) return_value = _readConvertRowtypeExpr(); - else if (MATCH("COLLATE", 7)) + else if (MATCH("COLLATEEXPR", 11)) return_value = _readCollateExpr(); - else if (MATCH("CASE", 4)) + else if (MATCH("CASEEXPR", 8)) return_value = _readCaseExpr(); - else if (MATCH("WHEN", 4)) + else if (MATCH("CASEWHEN", 8)) return_value = _readCaseWhen(); else if (MATCH("CASETESTEXPR", 12)) return_value = _readCaseTestExpr(); - else if (MATCH("ARRAY", 5)) + else if (MATCH("ARRAYEXPR", 9)) return_value = _readArrayExpr(); - else if (MATCH("ROW", 3)) + else if (MATCH("ROWEXPR", 7)) return_value = _readRowExpr(); - else if (MATCH("ROWCOMPARE", 10)) + else if (MATCH("ROWCOMPAREEXPR", 14)) return_value = _readRowCompareExpr(); - else if (MATCH("COALESCE", 8)) + else if (MATCH("COALESCEEXPR", 12)) return_value = _readCoalesceExpr(); - else if (MATCH("MINMAX", 6)) + else if (MATCH("MINMAXEXPR", 10)) return_value = _readMinMaxExpr(); else if (MATCH("SQLVALUEFUNCTION", 16)) return_value = _readSQLValueFunction(); @@ -4116,17 +4175,17 @@ parseNodeString(void) return_value = _readOnConflictExpr(); else if (MATCH("APPENDRELINFO", 13)) return_value = _readAppendRelInfo(); - else if (MATCH("RTE", 3)) + else if (MATCH("RANGETBLENTRY", 13)) return_value = _readRangeTblEntry(); else if (MATCH("RANGETBLFUNCTION", 16)) return_value = _readRangeTblFunction(); else if (MATCH("TABLESAMPLECLAUSE", 17)) return_value = _readTableSampleClause(); - else if (MATCH("NOTIFY", 6)) + else if (MATCH("NOTIFYSTMT", 10)) return_value = _readNotifyStmt(); else if (MATCH("DEFELEM", 7)) return_value = _readDefElem(); - else if (MATCH("DECLARECURSOR", 13)) + else if (MATCH("DECLARECURSORSTMT", 17)) return_value = _readDeclareCursorStmt(); else if (MATCH("PLANNEDSTMT", 11)) return_value = _readPlannedStmt(); diff --git a/third_party/spanner_pg/src/backend/nodes/tidbitmap.c b/third_party/spanner_pg/src/backend/nodes/tidbitmap.c index c5feacbf..a7a6b266 100644 --- a/third_party/spanner_pg/src/backend/nodes/tidbitmap.c +++ b/third_party/spanner_pg/src/backend/nodes/tidbitmap.c @@ -29,7 +29,7 @@ * and a non-lossy page. * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/nodes/tidbitmap.c diff --git a/third_party/spanner_pg/src/backend/nodes/value.c b/third_party/spanner_pg/src/backend/nodes/value.c index 15e6d267..5774a686 100644 --- a/third_party/spanner_pg/src/backend/nodes/value.c +++ b/third_party/spanner_pg/src/backend/nodes/value.c @@ -1,10 +1,10 @@ /*------------------------------------------------------------------------- * * value.c - * implementation of Value nodes + * implementation of value nodes * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,18 +14,17 @@ */ #include "postgres.h" -#include "nodes/parsenodes.h" +#include "nodes/value.h" /* * makeInteger */ -Value * +Integer * makeInteger(int i) { - Value *v = makeNode(Value); + Integer *v = makeNode(Integer); - v->type = T_Integer; - v->val.ival = i; + v->ival = i; return v; } @@ -34,13 +33,24 @@ makeInteger(int i) * * Caller is responsible for passing a palloc'd string. */ -Value * +Float * makeFloat(char *numericStr) { - Value *v = makeNode(Value); + Float *v = makeNode(Float); - v->type = T_Float; - v->val.str = numericStr; + v->fval = numericStr; + return v; +} + +/* + * makeBoolean + */ +Boolean * +makeBoolean(bool val) +{ + Boolean *v = makeNode(Boolean); + + v->boolval = val; return v; } @@ -49,13 +59,12 @@ makeFloat(char *numericStr) * * Caller is responsible for passing a palloc'd string. */ -Value * +String * makeString(char *str) { - Value *v = makeNode(Value); + String *v = makeNode(String); - v->type = T_String; - v->val.str = str; + v->sval = str; return v; } @@ -64,12 +73,11 @@ makeString(char *str) * * Caller is responsible for passing a palloc'd string. */ -Value * +BitString * makeBitString(char *str) { - Value *v = makeNode(Value); + BitString *v = makeNode(BitString); - v->type = T_BitString; - v->val.str = str; + v->bsval = str; return v; } diff --git a/third_party/spanner_pg/src/backend/optimizer/README b/third_party/spanner_pg/src/backend/optimizer/README index 2339347c..41c120e0 100644 --- a/third_party/spanner_pg/src/backend/optimizer/README +++ b/third_party/spanner_pg/src/backend/optimizer/README @@ -1015,6 +1015,7 @@ UPPERREL_SETOP result of UNION/INTERSECT/EXCEPT, if any UPPERREL_PARTIAL_GROUP_AGG result of partial grouping/aggregation, if any UPPERREL_GROUP_AGG result of grouping/aggregation, if any UPPERREL_WINDOW result of window functions, if any +UPPERREL_PARTIAL_DISTINCT result of partial "SELECT DISTINCT", if any UPPERREL_DISTINCT result of "SELECT DISTINCT", if any UPPERREL_ORDERED result of ORDER BY, if any UPPERREL_FINAL result of any remaining top-level actions diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_copy.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_copy.c index 4f6226b0..62302f44 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_copy.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_copy.c @@ -2,7 +2,7 @@ * * geqo_copy.c * - * 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 * * src/backend/optimizer/geqo/geqo_copy.c diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_cx.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_cx.c index 3b8d2fe5..34cc53af 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_cx.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_erx.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_erx.c index 3b92f420..cc066136 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_erx.c +++ b/third_party/spanner_pg/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; isize + new_clump->size < num_gene) + if (!bms_equal(joinrel->relids, root->all_baserels)) generate_useful_gather_paths(root, joinrel, false); /* Find and save the cheapest paths for this joinrel */ diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_main.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_main.c index 36df3467..68ed7432 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_main.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_main.c @@ -4,7 +4,7 @@ * solution to the query optimization problem * by means of a Genetic Algorithm (GA) * - * 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 * * src/backend/optimizer/geqo/geqo_main.c diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_misc.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_misc.c index 02b5a701..890ac363 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_misc.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_misc.c @@ -3,7 +3,7 @@ * geqo_misc.c * misc. printout and debug stuff * - * 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 * * src/backend/optimizer/geqo/geqo_misc.c diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox1.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox1.c index 10d2d0a3..ede7abb4 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox1.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox1.c @@ -89,7 +89,6 @@ ox1(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, } p = (p + 1) % num_gene; /* increment tour2-index */ } - } #endif /* defined(OX1) */ diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox2.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox2.c index 72b9b0fb..080dbc07 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox2.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_ox2.c @@ -106,7 +106,6 @@ ox2(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, /* city isn't used yet, so inherit from tour2 */ offspring[k] = tour2[k]; } - } #endif /* defined(OX2) */ diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pmx.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pmx.c index ddbc7817..e44fd0ba 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pmx.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pmx.c @@ -131,7 +131,6 @@ pmx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene) j++; } - } if (!(found)) @@ -140,7 +139,6 @@ pmx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene) indx[mx_fail] = k; mx_fail++; } - } /* ... for */ @@ -172,9 +170,7 @@ pmx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene) j++; } - } /* ... for */ - } /* ... if */ @@ -206,12 +202,10 @@ pmx(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene) j++; } - } /* ... if */ i++; } /* end while */ - } } /* ... for */ diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pool.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pool.c index 1fc103ba..0dfef1fd 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pool.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_pool.c @@ -3,7 +3,7 @@ * geqo_pool.c * Genetic Algorithm (GA) pool stuff * - * 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 * * src/backend/optimizer/geqo/geqo_pool.c diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_px.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_px.c index ad5ad3f1..914296b5 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_px.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_px.c @@ -96,15 +96,12 @@ px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, { /* next city in tour2 has been used */ tour2_index++; } - } else { /* next position in offspring is filled */ offspring_index++; } - } - } #endif /* defined(PX) */ diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_random.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_random.c index f21bc047..c6b7648a 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_random.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_random.c @@ -3,7 +3,7 @@ * geqo_random.c * random number generator * - * 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 * * src/backend/optimizer/geqo/geqo_random.c @@ -21,14 +21,7 @@ geqo_set_seed(PlannerInfo *root, double seed) { GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private; - /* - * XXX. This seeding algorithm could certainly be improved - but it is not - * critical to do so. - */ - memset(private->random_state, 0, sizeof(private->random_state)); - memcpy(private->random_state, - &seed, - Min(sizeof(private->random_state), sizeof(seed))); + pg_prng_fseed(&private->random_state, seed); } double @@ -36,5 +29,17 @@ geqo_rand(PlannerInfo *root) { GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private; - return pg_erand48(private->random_state); + return pg_prng_double(&private->random_state); +} + +int +geqo_randint(PlannerInfo *root, int upper, int lower) +{ + GeqoPrivateData *private = (GeqoPrivateData *) root->join_search_private; + + /* + * In current usage, "lower" is never negative so we can just use + * pg_prng_uint64_range directly. + */ + return (int) pg_prng_uint64_range(&private->random_state, lower, upper); } diff --git a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_selection.c b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_selection.c index 66b6c8ae..50f678a4 100644 --- a/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_selection.c +++ b/third_party/spanner_pg/src/backend/optimizer/geqo/geqo_selection.c @@ -3,7 +3,7 @@ * geqo_selection.c * linear selection scheme for the genetic query optimizer * - * 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 * * src/backend/optimizer/geqo/geqo_selection.c @@ -63,10 +63,6 @@ geqo_selection(PlannerInfo *root, Chromosome *momma, Chromosome *daddy, /* * Ensure we have selected different genes, except if pool size is only * one, when we can't. - * - * This code was observed to hang up in an infinite loop when the - * platform's implementation of erand48() was broken. We now always use - * our own version. */ if (pool->size > 1) { @@ -95,11 +91,11 @@ linear_rand(PlannerInfo *root, int pool_size, double bias) double max = (double) pool_size; /* - * If geqo_rand() returns exactly 1.0 then we will get exactly max from - * this equation, whereas we need 0 <= index < max. Also it seems - * possible that roundoff error might deliver values slightly outside the - * range; in particular avoid passing a value slightly less than 0 to - * sqrt(). If we get a bad value just try again. + * geqo_rand() is not supposed to return 1.0, but if it does then we will + * get exactly max from this equation, whereas we need 0 <= index < max. + * Also it seems possible that roundoff error might deliver values + * slightly outside the range; in particular avoid passing a value + * slightly less than 0 to sqrt(). If we get a bad value just try again. */ do { diff --git a/third_party/spanner_pg/src/backend/optimizer/path/allpaths.c b/third_party/spanner_pg/src/backend/optimizer/path/allpaths.c index f535ef0e..e4f0d463 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/allpaths.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/allpaths.c @@ -3,7 +3,7 @@ * allpaths.c * Routines to find possible search paths for processing a query * - * 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 * * @@ -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 @@ -49,15 +50,34 @@ #include "rewrite/rewriteManip.h" #include "utils/lsyscache.h" +#include "third_party/spanner_pg/shims/catalog_shim.h" + +/* Bitmask flags for pushdown_safety_info.unsafeFlags */ +#define UNSAFE_HAS_VOLATILE_FUNC (1 << 0) +#define UNSAFE_HAS_SET_FUNC (1 << 1) +#define UNSAFE_NOTIN_DISTINCTON_CLAUSE (1 << 2) +#define UNSAFE_NOTIN_PARTITIONBY_CLAUSE (1 << 3) +#define UNSAFE_TYPE_MISMATCH (1 << 4) /* results of subquery_is_pushdown_safe */ typedef struct pushdown_safety_info { - bool *unsafeColumns; /* which output columns are unsafe to use */ + unsigned char *unsafeFlags; /* bitmask of reasons why this target list + * column is unsafe for qual pushdown, or 0 if + * no reason. */ bool unsafeVolatile; /* don't push down volatile quals */ bool unsafeLeaky; /* don't push down leaky quals */ } pushdown_safety_info; +/* Return type for qual_is_pushdown_safe */ +typedef enum pushdown_safe_type +{ + PUSHDOWN_UNSAFE, /* unsafe to push qual into subquery */ + PUSHDOWN_SAFE, /* safe to push qual into subquery */ + PUSHDOWN_WINDOWCLAUSE_RUNCOND /* unsafe, but may work as WindowClause + * run condition */ +} pushdown_safe_type; + /* These parameters are set by GUC */ bool enable_geqo = false; /* just in case GUC doesn't set it */ int geqo_threshold; @@ -134,14 +154,15 @@ static void check_output_expressions(Query *subquery, static void compare_tlist_datatypes(List *tlist, List *colTypes, pushdown_safety_info *safetyInfo); static bool targetIsInAllPartitionLists(TargetEntry *tle, Query *query); -static bool qual_is_pushdown_safe(Query *subquery, Index rti, - RestrictInfo *rinfo, - pushdown_safety_info *safetyInfo); +static pushdown_safe_type qual_is_pushdown_safe(Query *subquery, Index rti, + RestrictInfo *rinfo, + pushdown_safety_info *safetyInfo); 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); /* @@ -551,12 +572,11 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, * its own pool of workers. Instead, we'll consider gathering partial * paths for the parent appendrel. * - * Also, if this is the topmost scan/join rel (that is, the only baserel), - * we postpone gathering until the final scan/join targetlist is available - * (see grouping_planner). + * Also, if this is the topmost scan/join rel, we postpone gathering until + * the final scan/join targetlist is available (see grouping_planner). */ if (rel->reloptkind == RELOPT_BASEREL && - bms_membership(root->all_baserels) != BMS_SINGLETON) + !bms_equal(rel->relids, root->all_baserels)) generate_useful_gather_paths(root, rel, false); /* Now find the cheapest of the paths for this rel */ @@ -1689,7 +1709,7 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, * for both forward and reverse scans. */ if (rel->part_scheme != NULL && IS_SIMPLE_REL(rel) && - partitions_are_ordered(rel->boundinfo, rel->nparts)) + partitions_are_ordered(rel->boundinfo, rel->live_parts)) { partition_pathkeys = build_partition_pathkeys(root, rel, ForwardScanDirection, @@ -1716,6 +1736,7 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, List *pathkeys = (List *) lfirst(lcp); List *startup_subpaths = NIL; List *total_subpaths = NIL; + List *fractional_subpaths = NIL; bool startup_neq_total = false; ListCell *lcr; bool match_partition_order; @@ -1745,7 +1766,8 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, { RelOptInfo *childrel = (RelOptInfo *) lfirst(lcr); Path *cheapest_startup, - *cheapest_total; + *cheapest_total, + *cheapest_fractional = NULL; /* Locate the right paths, if they are available. */ cheapest_startup = @@ -1773,6 +1795,38 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, Assert(cheapest_total->param_info == NULL); } + /* + * When building a fractional path, determine a cheapest + * fractional path for each child relation too. Looking at startup + * and total costs is not enough, because the cheapest fractional + * path may be dominated by two separate paths (one for startup, + * one for total). + * + * When needed (building fractional path), determine the cheapest + * fractional path too. + */ + if (root->tuple_fraction > 0) + { + double path_fraction = (1.0 / root->tuple_fraction); + + cheapest_fractional = + get_cheapest_fractional_path_for_pathkeys(childrel->pathlist, + pathkeys, + NULL, + path_fraction); + + /* + * If we found no path with matching pathkeys, use the + * cheapest total path instead. + * + * XXX We might consider partially sorted paths too (with an + * incremental sort on top). But we'd have to build all the + * incremental paths, do the costing etc. + */ + if (!cheapest_fractional) + cheapest_fractional = cheapest_total; + } + /* * Notice whether we actually have different paths for the * "cheapest" and "total" cases; frequently there will be no point @@ -1799,6 +1853,12 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, startup_subpaths = lappend(startup_subpaths, cheapest_startup); total_subpaths = lappend(total_subpaths, cheapest_total); + + if (cheapest_fractional) + { + cheapest_fractional = get_singleton_append_subpath(cheapest_fractional); + fractional_subpaths = lappend(fractional_subpaths, cheapest_fractional); + } } else if (match_partition_order_desc) { @@ -1812,6 +1872,12 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, startup_subpaths = lcons(cheapest_startup, startup_subpaths); total_subpaths = lcons(cheapest_total, total_subpaths); + + if (cheapest_fractional) + { + cheapest_fractional = get_singleton_append_subpath(cheapest_fractional); + fractional_subpaths = lcons(cheapest_fractional, fractional_subpaths); + } } else { @@ -1823,6 +1889,10 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, &startup_subpaths, NULL); accumulate_append_subpath(cheapest_total, &total_subpaths, NULL); + + if (cheapest_fractional) + accumulate_append_subpath(cheapest_fractional, + &fractional_subpaths, NULL); } } @@ -1849,6 +1919,17 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, 0, false, -1)); + + if (fractional_subpaths) + add_path(rel, (Path *) create_append_path(root, + rel, + fractional_subpaths, + NIL, + pathkeys, + NULL, + 0, + false, + -1)); } else { @@ -1864,6 +1945,13 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, total_subpaths, pathkeys, NULL)); + + if (fractional_subpaths) + add_path(rel, (Path *) create_merge_append_path(root, + rel, + fractional_subpaths, + pathkeys, + NULL)); } } } @@ -2090,6 +2178,297 @@ 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 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, + Bitmapset **run_cond_attrs) +{ + 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; + + /* can't use it if there are subplans in the WindowFunc */ + if (contain_subplans((Node *) wfunc)) + 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; + runoperator = opexpr->opno; + 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); + + /* record that this attno was used in a run condition */ + *run_cond_attrs = bms_add_member(*run_cond_attrs, + attno - FirstLowInvalidHeapAttributeNumber); + 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. + * + * '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, Bitmapset **run_cond_attrs) +{ + 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; + + /* + * Currently, we restrict this optimization to strict OpExprs. The reason + * for this is that during execution, once the runcondition becomes false, + * we stop evaluating WindowFuncs. To avoid leaving around stale window + * function result values, we set them to NULL. Having only strict + * OpExprs here ensures that we properly filter out the tuples with NULLs + * in the top-level WindowAgg. + */ + set_opfuncid(opexpr); + if (!func_strict(opexpr->opfuncid)) + 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, + run_cond_attrs)) + 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, + run_cond_attrs)) + return keep_original; + } + + return true; +} + /* * set_subquery_pathlist * Generate SubqueryScan access paths for a subquery RTE @@ -2112,6 +2491,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; /* @@ -2131,13 +2511,14 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, /* * Zero out result area for subquery_is_pushdown_safe, so that it can set * flags as needed while recursing. In particular, we need a workspace - * for keeping track of unsafe-to-reference columns. unsafeColumns[i] - * will be set true if we find that output column i of the subquery is - * unsafe to use in a pushed-down qual. + * for keeping track of the reasons why columns are unsafe to reference. + * These reasons are stored in the bits inside unsafeFlags[i] when we + * discover reasons that column i of the subquery is unsafe to be used in + * a pushed-down qual. */ memset(&safetyInfo, 0, sizeof(safetyInfo)); - safetyInfo.unsafeColumns = (bool *) - palloc0((list_length(subquery->targetList) + 1) * sizeof(bool)); + safetyInfo.unsafeFlags = (unsigned char *) + palloc0((list_length(subquery->targetList) + 1) * sizeof(unsigned char)); /* * If the subquery has the "security_barrier" flag, it means the subquery @@ -2178,32 +2559,60 @@ 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)) + if (rinfo->pseudoconstant) { - Node *clause = (Node *) rinfo->clause; - - /* Push it down */ - subquery_push_qual(subquery, rte, rti, clause); + upperrestrictlist = lappend(upperrestrictlist, rinfo); + continue; } - else + + switch (qual_is_pushdown_safe(subquery, rti, rinfo, &safetyInfo)) { - /* Keep it in the upper query */ - upperrestrictlist = lappend(upperrestrictlist, rinfo); + case PUSHDOWN_SAFE: + /* Push it down */ + subquery_push_qual(subquery, rte, rti, clause); + break; + + case PUSHDOWN_WINDOWCLAUSE_RUNCOND: + + /* + * 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, + &run_cond_attrs)) + { + /* + * 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); + } + break; + + case PUSHDOWN_UNSAFE: + upperrestrictlist = lappend(upperrestrictlist, rinfo); + break; } } rel->baserestrictinfo = upperrestrictlist; /* We don't bother recomputing baserestrict_min_security */ } - pfree(safetyInfo.unsafeColumns); + pfree(safetyInfo.unsafeFlags); /* * 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 @@ -2795,8 +3204,8 @@ generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_r * gather merge path for every subpath that has pathkeys present. * * But since the subpath is already sorted, we know we don't need - * to consider adding a sort (other either kind) on top of it, so - * we can continue here. + * to consider adding a sort (full or incremental) on top of it, + * so we can continue here. */ if (is_sorted) continue; @@ -3042,7 +3451,7 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels) * partial paths. We'll do the same for the topmost scan/join rel * once we know the final targetlist (see grouping_planner). */ - if (lev < levels_needed) + if (!bms_equal(rel->relids, root->all_baserels)) generate_useful_gather_paths(root, rel, false); /* Find and save the cheapest paths for this rel */ @@ -3120,13 +3529,13 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels) * * In addition, we make several checks on the subquery's output columns to see * if it is safe to reference them in pushed-down quals. If output column k - * is found to be unsafe to reference, we set safetyInfo->unsafeColumns[k] - * to true, but we don't reject the subquery overall since column k might not - * be referenced by some/all quals. The unsafeColumns[] array will be - * consulted later by qual_is_pushdown_safe(). It's better to do it this way - * than to make the checks directly in qual_is_pushdown_safe(), because when - * the subquery involves set operations we have to check the output - * expressions in each arm of the set op. + * is found to be unsafe to reference, we set the reason for that inside + * safetyInfo->unsafeFlags[k], but we don't reject the subquery overall since + * column k might not be referenced by some/all quals. The unsafeFlags[] + * array will be consulted later by qual_is_pushdown_safe(). It's better to + * do it this way than to make the checks directly in qual_is_pushdown_safe(), + * because when the subquery involves set operations we have to check the + * output expressions in each arm of the set op. * * Note: pushing quals into a DISTINCT subquery is theoretically dubious: * we're effectively assuming that the quals cannot distinguish values that @@ -3174,9 +3583,9 @@ subquery_is_pushdown_safe(Query *subquery, Query *topquery, /* * If we're at a leaf query, check for unsafe expressions in its target - * list, and mark any unsafe ones in unsafeColumns[]. (Non-leaf nodes in - * setop trees have only simple Vars in their tlists, so no need to check - * them.) + * list, and mark any reasons why they're unsafe in unsafeFlags[]. + * (Non-leaf nodes in setop trees have only simple Vars in their tlists, + * so no need to check them.) */ if (subquery->setOperations == NULL) check_output_expressions(subquery, safetyInfo); @@ -3247,9 +3656,9 @@ recurse_pushdown_safe(Node *setOp, Query *topquery, * * There are several cases in which it's unsafe to push down an upper-level * qual if it references a particular output column of a subquery. We check - * each output column of the subquery and set unsafeColumns[k] to true if - * that column is unsafe for a pushed-down qual to reference. The conditions - * checked here are: + * each output column of the subquery and set flags in unsafeFlags[k] when we + * see that column is unsafe for a pushed-down qual to reference. The + * conditions checked here are: * * 1. We must not push down any quals that refer to subselect outputs that * return sets, else we'd introduce functions-returning-sets into the @@ -3273,7 +3682,9 @@ recurse_pushdown_safe(Node *setOp, Query *topquery, * every row of any one window partition, and totally excluding some * partitions will not change a window function's results for remaining * partitions. (Again, this also requires nonvolatile quals, but - * subquery_is_pushdown_safe handles that.) + * subquery_is_pushdown_safe handles that.). Subquery columns marked as + * unsafe for this reason can still have WindowClause run conditions pushed + * down. */ static void check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo) @@ -3287,40 +3698,44 @@ check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo) if (tle->resjunk) continue; /* ignore resjunk columns */ - /* We need not check further if output col is already known unsafe */ - if (safetyInfo->unsafeColumns[tle->resno]) - continue; - /* Functions returning sets are unsafe (point 1) */ if (subquery->hasTargetSRFs && + (safetyInfo->unsafeFlags[tle->resno] & + UNSAFE_HAS_SET_FUNC) == 0 && expression_returns_set((Node *) tle->expr)) { - safetyInfo->unsafeColumns[tle->resno] = true; + safetyInfo->unsafeFlags[tle->resno] |= UNSAFE_HAS_SET_FUNC; continue; } /* Volatile functions are unsafe (point 2) */ - if (contain_volatile_functions((Node *) tle->expr)) + if ((safetyInfo->unsafeFlags[tle->resno] & + UNSAFE_HAS_VOLATILE_FUNC) == 0 && + contain_volatile_functions((Node *) tle->expr)) { - safetyInfo->unsafeColumns[tle->resno] = true; + safetyInfo->unsafeFlags[tle->resno] |= UNSAFE_HAS_VOLATILE_FUNC; continue; } /* If subquery uses DISTINCT ON, check point 3 */ if (subquery->hasDistinctOn && + (safetyInfo->unsafeFlags[tle->resno] & + UNSAFE_NOTIN_DISTINCTON_CLAUSE) == 0 && !targetIsInSortList(tle, InvalidOid, subquery->distinctClause)) { /* non-DISTINCT column, so mark it unsafe */ - safetyInfo->unsafeColumns[tle->resno] = true; + safetyInfo->unsafeFlags[tle->resno] |= UNSAFE_NOTIN_DISTINCTON_CLAUSE; continue; } /* If subquery uses window functions, check point 4 */ if (subquery->hasWindowFuncs && + (safetyInfo->unsafeFlags[tle->resno] & + UNSAFE_NOTIN_DISTINCTON_CLAUSE) == 0 && !targetIsInAllPartitionLists(tle, subquery)) { /* not present in all PARTITION BY clauses, so mark it unsafe */ - safetyInfo->unsafeColumns[tle->resno] = true; + safetyInfo->unsafeFlags[tle->resno] |= UNSAFE_NOTIN_PARTITIONBY_CLAUSE; continue; } } @@ -3332,8 +3747,8 @@ check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo) * subquery columns that suffer no type coercions in the set operation. * Otherwise there are possible semantic gotchas. So, we check the * component queries to see if any of them have output types different from - * the top-level setop outputs. unsafeColumns[k] is set true if column k - * has different type in any component. + * the top-level setop outputs. We set the UNSAFE_TYPE_MISMATCH bit in + * unsafeFlags[k] if column k has different type in any component. * * We don't have to care about typmods here: the only allowed difference * between set-op input and output typmods is input is a specific typmod @@ -3341,7 +3756,7 @@ check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo) * * tlist is a subquery tlist. * colTypes is an OID list of the top-level setop's output column types. - * safetyInfo->unsafeColumns[] is the result array. + * safetyInfo is the pushdown_safety_info to set unsafeFlags[] for. */ static void compare_tlist_datatypes(List *tlist, List *colTypes, @@ -3359,7 +3774,7 @@ compare_tlist_datatypes(List *tlist, List *colTypes, if (colType == NULL) elog(ERROR, "wrong number of tlist entries"); if (exprType((Node *) tle->expr) != lfirst_oid(colType)) - safetyInfo->unsafeColumns[tle->resno] = true; + safetyInfo->unsafeFlags[tle->resno] |= UNSAFE_TYPE_MISMATCH; colType = lnext(colTypes, colType); } if (colType != NULL) @@ -3419,28 +3834,28 @@ targetIsInAllPartitionLists(TargetEntry *tle, Query *query) * 5. rinfo's clause must not refer to any subquery output columns that were * found to be unsafe to reference by subquery_is_pushdown_safe(). */ -static bool +static pushdown_safe_type qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, pushdown_safety_info *safetyInfo) { - bool safe = true; + pushdown_safe_type safe = PUSHDOWN_SAFE; Node *qual = (Node *) rinfo->clause; List *vars; ListCell *vl; /* Refuse subselects (point 1) */ if (contain_subplans(qual)) - return false; + return PUSHDOWN_UNSAFE; /* Refuse volatile quals if we found they'd be unsafe (point 2) */ if (safetyInfo->unsafeVolatile && contain_volatile_functions((Node *) rinfo)) - return false; + return PUSHDOWN_UNSAFE; /* Refuse leaky quals if told to (point 3) */ if (safetyInfo->unsafeLeaky && contain_leaked_vars(qual)) - return false; + return PUSHDOWN_UNSAFE; /* * It would be unsafe to push down window function calls, but at least for @@ -3469,7 +3884,7 @@ qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, */ if (!IsA(var, Var)) { - safe = false; + safe = PUSHDOWN_UNSAFE; break; } @@ -3481,7 +3896,7 @@ qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, */ if (var->varno != rti) { - safe = false; + safe = PUSHDOWN_UNSAFE; break; } @@ -3491,15 +3906,26 @@ qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, /* Check point 4 */ if (var->varattno == 0) { - safe = false; + safe = PUSHDOWN_UNSAFE; break; } /* Check point 5 */ - if (safetyInfo->unsafeColumns[var->varattno]) + if (safetyInfo->unsafeFlags[var->varattno] != 0) { - safe = false; - break; + if (safetyInfo->unsafeFlags[var->varattno] & + (UNSAFE_HAS_VOLATILE_FUNC | UNSAFE_HAS_SET_FUNC | + UNSAFE_NOTIN_DISTINCTON_CLAUSE | UNSAFE_TYPE_MISMATCH)) + { + safe = PUSHDOWN_UNSAFE; + break; + } + else + { + /* UNSAFE_NOTIN_PARTITIONBY_CLAUSE is ok for run conditions */ + safe = PUSHDOWN_WINDOWCLAUSE_RUNCOND; + /* don't break, we might find another Var that's unsafe */ + } } } @@ -3601,16 +4027,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/third_party/spanner_pg/src/backend/optimizer/path/clausesel.c b/third_party/spanner_pg/src/backend/optimizer/path/clausesel.c index d263ecf0..06f83630 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/clausesel.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/clausesel.c @@ -3,7 +3,7 @@ * clausesel.c * Routines to compute clause selectivities * - * 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/third_party/spanner_pg/src/backend/optimizer/path/costsize.c b/third_party/spanner_pg/src/backend/optimizer/path/costsize.c index ebab8707..30dfe4de 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/costsize.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/costsize.c @@ -60,7 +60,7 @@ * values. * * - * 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 * * IDENTIFICATION @@ -71,6 +71,7 @@ #include "postgres.h" +#include #include #include "access/amapi.h" @@ -125,6 +126,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; @@ -169,7 +171,7 @@ static bool cost_qual_eval_walker(Node *node, cost_qual_eval_context *context); static void get_restriction_qual_cost(PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, QualCost *qpqual_cost); -static bool has_indexed_join_quals(NestPath *joinpath); +static bool has_indexed_join_quals(NestPath *path); static double approx_tuple_count(PlannerInfo *root, JoinPath *path, List *quals); static double calc_joinrel_size_estimate(PlannerInfo *root, @@ -216,6 +218,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 @@ -1396,6 +1424,7 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, { Cost startup_cost; Cost run_cost; + List *qpquals; QualCost qpqual_cost; Cost cpu_per_tuple; @@ -1403,11 +1432,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 @@ -1422,7 +1464,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; @@ -2980,8 +3022,8 @@ final_cost_nestloop(PlannerInfo *root, NestPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra) { - Path *outer_path = path->outerjoinpath; - Path *inner_path = path->innerjoinpath; + Path *outer_path = path->jpath.outerjoinpath; + Path *inner_path = path->jpath.innerjoinpath; double outer_path_rows = outer_path->rows; double inner_path_rows = inner_path->rows; Cost startup_cost = workspace->startup_cost; @@ -2996,18 +3038,18 @@ final_cost_nestloop(PlannerInfo *root, NestPath *path, if (inner_path_rows <= 0) inner_path_rows = 1; /* Mark the path with the correct row estimate */ - if (path->path.param_info) - path->path.rows = path->path.param_info->ppi_rows; + if (path->jpath.path.param_info) + path->jpath.path.rows = path->jpath.path.param_info->ppi_rows; else - path->path.rows = path->path.parent->rows; + path->jpath.path.rows = path->jpath.path.parent->rows; /* For partial paths, scale row estimate. */ - if (path->path.parallel_workers > 0) + if (path->jpath.path.parallel_workers > 0) { - double parallel_divisor = get_parallel_divisor(&path->path); + double parallel_divisor = get_parallel_divisor(&path->jpath.path); - path->path.rows = - clamp_row_est(path->path.rows / parallel_divisor); + path->jpath.path.rows = + clamp_row_est(path->jpath.path.rows / parallel_divisor); } /* @@ -3020,7 +3062,7 @@ final_cost_nestloop(PlannerInfo *root, NestPath *path, /* cost of inner-relation source data (we already dealt with outer rel) */ - if (path->jointype == JOIN_SEMI || path->jointype == JOIN_ANTI || + if (path->jpath.jointype == JOIN_SEMI || path->jpath.jointype == JOIN_ANTI || extra->inner_unique) { /* @@ -3138,17 +3180,17 @@ final_cost_nestloop(PlannerInfo *root, NestPath *path, } /* CPU costs */ - cost_qual_eval(&restrict_qual_cost, path->joinrestrictinfo, root); + cost_qual_eval(&restrict_qual_cost, path->jpath.joinrestrictinfo, root); startup_cost += restrict_qual_cost.startup; cpu_per_tuple = cpu_tuple_cost + restrict_qual_cost.per_tuple; run_cost += cpu_per_tuple * ntuples; /* tlist eval costs are paid per output row, not per tuple scanned */ - startup_cost += path->path.pathtarget->cost.startup; - run_cost += path->path.pathtarget->cost.per_tuple * path->path.rows; + startup_cost += path->jpath.path.pathtarget->cost.startup; + run_cost += path->jpath.path.pathtarget->cost.per_tuple * path->jpath.path.rows; - path->path.startup_cost = startup_cost; - path->path.total_cost = startup_cost + run_cost; + path->jpath.path.startup_cost = startup_cost; + path->jpath.path.total_cost = startup_cost + run_cost; } /* @@ -4779,8 +4821,9 @@ compute_semi_anti_join_factors(PlannerInfo *root, * expensive. */ static bool -has_indexed_join_quals(NestPath *joinpath) +has_indexed_join_quals(NestPath *path) { + JoinPath *joinpath = &path->jpath; Relids joinrelids = joinpath->path.parent->relids; Path *innerpath = joinpath->innerjoinpath; List *indexclauses; @@ -5666,10 +5709,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 { @@ -5968,7 +6012,8 @@ set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target) Assert(var->varlevelsup == 0); /* Try to get data from RelOptInfo cache */ - if (var->varno < root->simple_rel_array_size) + if (!IS_SPECIAL_VARNO(var->varno) && + var->varno < root->simple_rel_array_size) { RelOptInfo *rel = root->simple_rel_array[var->varno]; @@ -6156,7 +6201,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/third_party/spanner_pg/src/backend/optimizer/path/equivclass.c b/third_party/spanner_pg/src/backend/optimizer/path/equivclass.c index 99e16763..94b0721c 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/equivclass.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/equivclass.c @@ -6,7 +6,7 @@ * See src/backend/optimizer/README for discussion of EquivalenceClasses. * * - * 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 * * IDENTIFICATION @@ -932,35 +932,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? @@ -1020,7 +991,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/third_party/spanner_pg/src/backend/optimizer/path/indxpath.c b/third_party/spanner_pg/src/backend/optimizer/path/indxpath.c index 8dea446d..45ea6bea 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/indxpath.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/indxpath.c @@ -4,7 +4,7 @@ * Routines to determine which indexes are usable for scanning a * given relation, and create Paths accordingly. * - * 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 * * @@ -1809,7 +1809,6 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index) bool result; Bitmapset *attrs_used = NULL; Bitmapset *index_canreturn_attrs = NULL; - Bitmapset *index_cannotreturn_attrs = NULL; ListCell *lc; int i; @@ -1849,11 +1848,7 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index) /* * Construct a bitmapset of columns that the index can return back in an - * index-only scan. If there are multiple index columns containing the - * same attribute, all of them must be capable of returning the value, - * since we might recheck operators on any of them. (Potentially we could - * be smarter about that, but it's such a weird situation that it doesn't - * seem worth spending a lot of sweat on.) + * index-only scan. */ for (i = 0; i < index->ncolumns; i++) { @@ -1870,21 +1865,13 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index) index_canreturn_attrs = bms_add_member(index_canreturn_attrs, attno - FirstLowInvalidHeapAttributeNumber); - else - index_cannotreturn_attrs = - bms_add_member(index_cannotreturn_attrs, - attno - FirstLowInvalidHeapAttributeNumber); } - index_canreturn_attrs = bms_del_members(index_canreturn_attrs, - index_cannotreturn_attrs); - /* Do we have all the necessary attributes? */ result = bms_is_subset(attrs_used, index_canreturn_attrs); bms_free(attrs_used); bms_free(index_canreturn_attrs); - bms_free(index_cannotreturn_attrs); return result; } @@ -3393,12 +3380,13 @@ check_index_predicates(PlannerInfo *root, RelOptInfo *rel) * Normally we remove quals that are implied by a partial index's * predicate from indrestrictinfo, indicating that they need not be * checked explicitly by an indexscan plan using this index. However, if - * the rel is a target relation of UPDATE/DELETE/SELECT FOR UPDATE, we - * cannot remove such quals from the plan, because they need to be in the - * plan so that they will be properly rechecked by EvalPlanQual testing. - * Some day we might want to remove such quals from the main plan anyway - * and pass them through to EvalPlanQual via a side channel; but for now, - * we just don't remove implied quals at all for target relations. + * the rel is a target relation of UPDATE/DELETE/MERGE/SELECT FOR UPDATE, + * we cannot remove such quals from the plan, because they need to be in + * the plan so that they will be properly rechecked by EvalPlanQual + * testing. Some day we might want to remove such quals from the main + * plan anyway and pass them through to EvalPlanQual via a side channel; + * but for now, we just don't remove implied quals at all for target + * relations. */ is_target_rel = (bms_is_member(rel->relid, root->all_result_relids) || get_plan_rowmark(root->rowMarks, rel->relid) != NULL); diff --git a/third_party/spanner_pg/src/backend/optimizer/path/joinpath.c b/third_party/spanner_pg/src/backend/optimizer/path/joinpath.c index ab097ae0..46696027 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/joinpath.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/joinpath.c @@ -3,7 +3,7 @@ * joinpath.c * Routines to find all possible paths for processing a set of joins * - * 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 * * @@ -417,9 +417,15 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info, RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); OpExpr *opexpr; Node *expr; + Oid hasheqoperator; - /* can't use a memoize node without a valid hash equals operator */ - if (!OidIsValid(rinfo->hasheqoperator) || + opexpr = (OpExpr *) rinfo->clause; + + /* + * Bail if the rinfo is not compatible. We need a join OpExpr + * with 2 args. + */ + if (!IsA(opexpr, OpExpr) || list_length(opexpr->args) != 2 || !clause_sides_match_join(rinfo, outerrel, innerrel)) { list_free(*operators); @@ -427,17 +433,26 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info, return false; } - /* - * We already checked that this is an OpExpr with 2 args when - * setting hasheqoperator. - */ - opexpr = (OpExpr *) rinfo->clause; if (rinfo->outer_is_left) + { expr = (Node *) linitial(opexpr->args); + hasheqoperator = rinfo->left_hasheqoperator; + } else + { expr = (Node *) lsecond(opexpr->args); + hasheqoperator = rinfo->right_hasheqoperator; + } + + /* can't do memoize if we can't hash the outer type */ + if (!OidIsValid(hasheqoperator)) + { + list_free(*operators); + list_free(*param_exprs); + return false; + } - *operators = lappend_oid(*operators, rinfo->hasheqoperator); + *operators = lappend_oid(*operators, hasheqoperator); *param_exprs = lappend(*param_exprs, expr); /* @@ -1293,7 +1308,7 @@ sort_inner_and_outer(PlannerInfo *root, foreach(l, all_pathkeys) { - PathKey *front_pathkey = (PathKey *) lfirst(l); + PathKey *front_pathkey = (PathKey *) lfirst(l); List *cur_mergeclauses; List *outerkeys; List *innerkeys; diff --git a/third_party/spanner_pg/src/backend/optimizer/path/joinrels.c b/third_party/spanner_pg/src/backend/optimizer/path/joinrels.c index e8c180cc..9da3ff2f 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/joinrels.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/joinrels.c @@ -3,7 +3,7 @@ * joinrels.c * Routines to determine which relations should be joined * - * 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 * * @@ -1539,6 +1539,7 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, child_sjinfo, child_sjinfo->jointype); joinrel->part_rels[cnt_parts] = child_joinrel; + joinrel->live_parts = bms_add_member(joinrel->live_parts, cnt_parts); joinrel->all_partrels = bms_add_members(joinrel->all_partrels, child_joinrel->relids); } diff --git a/third_party/spanner_pg/src/backend/optimizer/path/pathkeys.c b/third_party/spanner_pg/src/backend/optimizer/path/pathkeys.c index f5a963b8..e83562e1 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/pathkeys.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/pathkeys.c @@ -7,7 +7,7 @@ * the nature and use of path keys. * * - * 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 * * IDENTIFICATION @@ -706,7 +706,7 @@ build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, int i; Assert(partscheme != NULL); - Assert(partitions_are_ordered(partrel->boundinfo, partrel->nparts)); + Assert(partitions_are_ordered(partrel->boundinfo, partrel->live_parts)); /* For now, we can only cope with baserels */ Assert(IS_SIMPLE_REL(partrel)); diff --git a/third_party/spanner_pg/src/backend/optimizer/path/tidpath.c b/third_party/spanner_pg/src/backend/optimizer/path/tidpath.c index 0725d950..279ca1f5 100644 --- a/third_party/spanner_pg/src/backend/optimizer/path/tidpath.c +++ b/third_party/spanner_pg/src/backend/optimizer/path/tidpath.c @@ -27,7 +27,7 @@ * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=, and * AND-clauses composed of such conditions. * - * 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/third_party/spanner_pg/src/backend/optimizer/plan/analyzejoins.c b/third_party/spanner_pg/src/backend/optimizer/plan/analyzejoins.c index 8b4163f1..34efeee9 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/analyzejoins.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/analyzejoins.c @@ -11,7 +11,7 @@ * is that we have to work harder to clean up after ourselves when we modify * the query, since the derived data structures have to be updated too. * - * 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 * * @@ -176,6 +176,14 @@ join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo) if (!bms_get_singleton_member(sjinfo->min_righthand, &innerrelid)) return false; + /* + * Never try to eliminate a left join to the query result rel. Although + * the case is syntactically impossible in standard SQL, MERGE will build + * a join tree that looks exactly like that. + */ + if (innerrelid == root->parse->resultRelation) + return false; + innerrel = find_base_rel(root, innerrelid); /* diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/createplan.c b/third_party/spanner_pg/src/backend/optimizer/plan/createplan.c index ebf741e7..78340add 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/createplan.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/createplan.c @@ -5,7 +5,7 @@ * Planning is complete, we just need to convert the selected * Path into a Plan. * - * 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 * * @@ -16,7 +16,6 @@ */ #include "postgres.h" -#include #include #include "access/sysattr.h" @@ -84,7 +83,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_plan(Plan *plan, 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, @@ -290,6 +289,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, @@ -312,7 +312,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); @@ -1111,14 +1112,37 @@ create_join_plan(PlannerInfo *root, JoinPath *best_path) } /* - * is_async_capable_plan - * Check whether the Plan node created from a Path node is async-capable. + * mark_async_capable_plan + * 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 -is_async_capable_plan(Plan *plan, Path *path) +mark_async_capable_plan(Plan *plan, Path *path) { switch (nodeTag(path)) { + case T_SubqueryScanPath: + { + 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. + */ + 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; @@ -1133,13 +1157,33 @@ is_async_capable_plan(Plan *plan, 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 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 (mark_async_capable_plan(plan, + ((ProjectionPath *) path)->subpath)) + return true; + return false; default: - break; + return false; } - return false; + + plan->async_capable = true; + + return true; } /* @@ -1302,14 +1346,14 @@ create_append_plan(PlannerInfo *root, AppendPath *best_path, int flags) } } - subplans = lappend(subplans, subplan); - /* If needed, check to see if subplan can be executed asynchronously */ - if (consider_async && is_async_capable_plan(subplan, subpath)) + if (consider_async && mark_async_capable_plan(subplan, subpath)) { - subplan->async_capable = true; + Assert(subplan->async_capable); ++nasyncplans; } + + subplans = lappend(subplans, subplan); } /* @@ -2650,6 +2694,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); @@ -2678,7 +2725,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, @@ -2715,7 +2762,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, @@ -2784,6 +2831,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); @@ -2886,7 +2934,7 @@ create_seqscan_plan(PlannerInfo *root, Path *best_path, scan_clauses, scan_relid); - copy_generic_path_info(&scan_plan->plan, best_path); + copy_generic_path_info(&scan_plan->scan.plan, best_path); return scan_plan; } @@ -4273,8 +4321,8 @@ create_nestloop_plan(PlannerInfo *root, NestLoop *join_plan; Plan *outer_plan; Plan *inner_plan; - List *tlist = build_path_tlist(root, &best_path->path); - List *joinrestrictclauses = best_path->joinrestrictinfo; + List *tlist = build_path_tlist(root, &best_path->jpath.path); + List *joinrestrictclauses = best_path->jpath.joinrestrictinfo; List *joinclauses; List *otherclauses; Relids outerrelids; @@ -4282,13 +4330,13 @@ create_nestloop_plan(PlannerInfo *root, Relids saveOuterRels = root->curOuterRels; /* NestLoop can project, so no need to be picky about child tlists */ - outer_plan = create_plan_recurse(root, best_path->outerjoinpath, 0); + outer_plan = create_plan_recurse(root, best_path->jpath.outerjoinpath, 0); /* For a nestloop, include outer relids in curOuterRels for inner side */ root->curOuterRels = bms_union(root->curOuterRels, - best_path->outerjoinpath->parent->relids); + best_path->jpath.outerjoinpath->parent->relids); - inner_plan = create_plan_recurse(root, best_path->innerjoinpath, 0); + inner_plan = create_plan_recurse(root, best_path->jpath.innerjoinpath, 0); /* Restore curOuterRels */ bms_free(root->curOuterRels); @@ -4299,10 +4347,10 @@ create_nestloop_plan(PlannerInfo *root, /* Get the join qual clauses (in plain expression form) */ /* Any pseudoconstant clauses are ignored here */ - if (IS_OUTER_JOIN(best_path->jointype)) + if (IS_OUTER_JOIN(best_path->jpath.jointype)) { extract_actual_join_clauses(joinrestrictclauses, - best_path->path.parent->relids, + best_path->jpath.path.parent->relids, &joinclauses, &otherclauses); } else @@ -4313,7 +4361,7 @@ create_nestloop_plan(PlannerInfo *root, } /* Replace any outer-relation variables with nestloop params */ - if (best_path->path.param_info) + if (best_path->jpath.path.param_info) { joinclauses = (List *) replace_nestloop_params(root, (Node *) joinclauses); @@ -4325,7 +4373,7 @@ create_nestloop_plan(PlannerInfo *root, * Identify any nestloop parameters that should be supplied by this join * node, and remove them from root->curOuterParams. */ - outerrelids = best_path->outerjoinpath->parent->relids; + outerrelids = best_path->jpath.outerjoinpath->parent->relids; nestParams = identify_current_nestloop_params(root, outerrelids); join_plan = make_nestloop(tlist, @@ -4334,10 +4382,10 @@ create_nestloop_plan(PlannerInfo *root, nestParams, outer_plan, inner_plan, - best_path->jointype, - best_path->inner_unique); + best_path->jpath.jointype, + best_path->jpath.inner_unique); - copy_generic_path_info(&join_plan->join.plan, &best_path->path); + copy_generic_path_info(&join_plan->join.plan, &best_path->jpath.path); return join_plan; } @@ -4857,7 +4905,8 @@ replace_nestloop_params_mutator(Node *node, PlannerInfo *root) /* Upper-level Vars should be long gone at this point */ Assert(var->varlevelsup == 0); /* If not to be replaced, we can just return the Var unmodified */ - if (!bms_is_member(var->varno, root->curOuterRels)) + if (IS_SPECIAL_VARNO(var->varno) || + !bms_is_member(var->varno, root->curOuterRels)) return node; /* Replace the Var with a nestloop Param */ return (Node *) replace_nestloop_param_var(root, var); @@ -5421,13 +5470,13 @@ make_seqscan(List *qptlist, Index scanrelid) { SeqScan *node = makeNode(SeqScan); - Plan *plan = &node->plan; + Plan *plan = &node->scan.plan; plan->targetlist = qptlist; plan->qual = qpqual; plan->lefttree = NULL; plan->righttree = NULL; - node->scanrelid = scanrelid; + node->scan.scanrelid = scanrelid; return node; } @@ -5605,6 +5654,7 @@ make_subqueryscan(List *qptlist, plan->righttree = NULL; node->scan.scanrelid = scanrelid; node->subplan = subplan; + node->scanstatus = SUBQUERY_SCAN_UNKNOWN; return node; } @@ -6505,7 +6555,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; @@ -6534,7 +6584,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; @@ -6551,17 +6601,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; } @@ -6933,7 +6986,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; @@ -6941,9 +6995,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 || @@ -7001,6 +7056,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan, node->withCheckOptionLists = withCheckOptionLists; node->returningLists = returningLists; node->rowMarks = rowMarks; + node->mergeActionLists = mergeActionLists; node->epqParam = epqParam; /* @@ -7030,12 +7086,32 @@ make_modifytable(PlannerInfo *root, Plan *subplan, RelOptInfo *resultRel = root->simple_rel_array[rti]; fdwroutine = resultRel->fdwroutine; + + /* + * MERGE is not currently supported for foreign tables and we + * already checked when the table mentioned in the query is + * foreign; but we can still get here if a partitioned table has a + * foreign table as partition. Disallow that now, to avoid an + * uglier error message later. + */ + if (operation == CMD_MERGE && fdwroutine != NULL) + { + RangeTblEntry *rte = root->simple_rte_array[rti]; + + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + get_rel_name(rte->relid)), + errdetail_relkind_not_supported(rte->relkind)); + } + } else { RangeTblEntry *rte = planner_rt_fetch(rti, root); Assert(rte->rtekind == RTE_RELATION); + Assert(operation != CMD_MERGE); if (rte->relkind == RELKIND_FOREIGN_TABLE) fdwroutine = GetFdwRoutineByRelId(rte->relid); else @@ -7100,6 +7176,10 @@ is_projection_capable_path(Path *path) case T_MergeAppend: case T_RecursiveUnion: return false; + case T_CustomScan: + if (castNode(CustomPath, path)->flags & CUSTOMPATH_SUPPORT_PROJECTION) + return true; + return false; case T_Append: /* @@ -7146,6 +7226,10 @@ is_projection_capable_plan(Plan *plan) case T_MergeAppend: case T_RecursiveUnion: return false; + case T_CustomScan: + if (((CustomScan *) plan)->flags & CUSTOMPATH_SUPPORT_PROJECTION) + return true; + return false; case T_ProjectSet: /* diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/initsplan.c b/third_party/spanner_pg/src/backend/optimizer/plan/initsplan.c index 4e409e7d..d18574d8 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/initsplan.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/initsplan.c @@ -3,7 +3,7 @@ * initsplan.c * Target list, qualification, joininfo initialization routines * - * 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 * * @@ -2713,8 +2713,8 @@ check_hashjoinable(RestrictInfo *restrictinfo) /* * check_memoizable * If the restrictinfo's clause is suitable to be used for a Memoize node, - * set the hasheqoperator to the hash equality operator that will be needed - * during caching. + * set the lefthasheqoperator and righthasheqoperator to the hash equality + * operator that will be needed during caching. */ static void check_memoizable(RestrictInfo *restrictinfo) @@ -2732,22 +2732,23 @@ check_memoizable(RestrictInfo *restrictinfo) return; lefttype = exprType(linitial(((OpExpr *) clause)->args)); + + typentry = lookup_type_cache(lefttype, TYPECACHE_HASH_PROC | + TYPECACHE_EQ_OPR); + + if (OidIsValid(typentry->hash_proc) && OidIsValid(typentry->eq_opr)) + restrictinfo->left_hasheqoperator = typentry->eq_opr; + righttype = exprType(lsecond(((OpExpr *) clause)->args)); /* - * Really there should be a field for both the left and right hash - * equality operator, however, in v14, there's only a single field in - * RestrictInfo to record the operator in, so we must insist that the left - * and right types match. + * Lookup the right type, unless it's the same as the left type, in which + * case typentry is already pointing to the required TypeCacheEntry. */ if (lefttype != righttype) - return; - - typentry = lookup_type_cache(lefttype, TYPECACHE_HASH_PROC | - TYPECACHE_EQ_OPR); - - if (!OidIsValid(typentry->hash_proc) || !OidIsValid(typentry->eq_opr)) - return; + typentry = lookup_type_cache(righttype, TYPECACHE_HASH_PROC | + TYPECACHE_EQ_OPR); - restrictinfo->hasheqoperator = typentry->eq_opr; + if (OidIsValid(typentry->hash_proc) && OidIsValid(typentry->eq_opr)) + restrictinfo->right_hasheqoperator = typentry->eq_opr; } diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/planagg.c b/third_party/spanner_pg/src/backend/optimizer/plan/planagg.c index c1634d16..9330908c 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/planagg.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/planagg.c @@ -17,7 +17,7 @@ * scan all the rows anyway. * * - * 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/third_party/spanner_pg/src/backend/optimizer/plan/planmain.c b/third_party/spanner_pg/src/backend/optimizer/plan/planmain.c index 273ac0ac..5a1d0066 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/planmain.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/planmain.c @@ -9,7 +9,7 @@ * shorn of features like subselects, inheritance, aggregates, grouping, * and so on. (Those are the things planner.c deals with.) * - * 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 * * @@ -264,7 +264,7 @@ query_planner(PlannerInfo *root, add_other_rels_to_query(root); /* - * Distribute any UPDATE/DELETE row identity variables to the target + * Distribute any UPDATE/DELETE/MERGE row identity variables to the target * relations. This can't be done till we've finished expansion of * appendrels. */ diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/planner.c b/third_party/spanner_pg/src/backend/optimizer/plan/planner.c index 5d998c7d..316d0f68 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/planner.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/planner.c @@ -3,7 +3,7 @@ * planner.c * The query optimizer external interface. * - * 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 * * @@ -192,6 +192,12 @@ static void create_one_window_path(PlannerInfo *root, List *activeWindows); static RelOptInfo *create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel); +static void create_partial_distinct_paths(PlannerInfo *root, + RelOptInfo *input_rel, + RelOptInfo *final_distinct_rel); +static RelOptInfo *create_final_distinct_paths(PlannerInfo *root, + RelOptInfo *input_rel, + RelOptInfo *distinct_rel); static RelOptInfo *create_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *target, @@ -646,6 +652,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. @@ -818,6 +829,9 @@ subquery_planner(PlannerGlobal *glob, Query *parse, EXPRKIND_LIMIT); wc->endOffset = preprocess_expression(root, wc->endOffset, EXPRKIND_LIMIT); + wc->runCondition = (List *) preprocess_expression(root, + (Node *) wc->runCondition, + EXPRKIND_TARGET); } parse->limitOffset = preprocess_expression(root, parse->limitOffset, @@ -846,6 +860,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); @@ -1574,6 +1602,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) */ root->upper_targets[UPPERREL_FINAL] = final_target; root->upper_targets[UPPERREL_ORDERED] = final_target; + root->upper_targets[UPPERREL_PARTIAL_DISTINCT] = sort_input_target; root->upper_targets[UPPERREL_DISTINCT] = sort_input_target; root->upper_targets[UPPERREL_WINDOW] = sort_input_target; root->upper_targets[UPPERREL_GROUP_AGG] = grouping_target; @@ -1710,7 +1739,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) { @@ -1719,11 +1748,12 @@ 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) { - /* Inherited UPDATE/DELETE */ + /* Inherited UPDATE/DELETE/MERGE */ RelOptInfo *top_result_rel = find_base_rel(root, parse->resultRelation); int resultRelation = -1; @@ -1788,6 +1818,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) @@ -1810,11 +1877,13 @@ 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 { - /* Single-relation INSERT/UPDATE/DELETE. */ + /* Single-relation INSERT/UPDATE/DELETE/MERGE. */ rootRelation = 0; /* there's no separate root rel */ resultRelations = list_make1_int(parse->resultRelation); if (parse->commandType == CMD_UPDATE) @@ -1823,6 +1892,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); } /* @@ -1849,6 +1920,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) returningLists, rowMarks, parse->onConflict, + mergeActionLists, assign_special_exec_param(root)); } @@ -2136,11 +2208,12 @@ preprocess_rowmarks(PlannerInfo *root) else { /* - * We only need rowmarks for UPDATE, DELETE, or FOR [KEY] + * We only need rowmarks for UPDATE, DELETE, MERGE, or FOR [KEY] * UPDATE/SHARE. */ if (parse->commandType != CMD_UPDATE && - parse->commandType != CMD_DELETE) + parse->commandType != CMD_DELETE && + parse->commandType != CMD_MERGE) return; } @@ -4118,6 +4191,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 @@ -4142,6 +4216,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, @@ -4205,10 +4280,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); @@ -4225,16 +4311,9 @@ create_one_window_path(PlannerInfo *root, * Sort/Unique won't project anything. */ static RelOptInfo * -create_distinct_paths(PlannerInfo *root, - RelOptInfo *input_rel) +create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel) { - Query *parse = root->parse; - Path *cheapest_input_path = input_rel->cheapest_total_path; RelOptInfo *distinct_rel; - double numDistinctRows; - bool allow_hash; - Path *path; - ListCell *lc; /* For now, do all work in the (DISTINCT, NULL) upperrel */ distinct_rel = fetch_upper_rel(root, UPPERREL_DISTINCT, NULL); @@ -4256,6 +4335,184 @@ create_distinct_paths(PlannerInfo *root, distinct_rel->useridiscurrent = input_rel->useridiscurrent; distinct_rel->fdwroutine = input_rel->fdwroutine; + /* build distinct paths based on input_rel's pathlist */ + create_final_distinct_paths(root, input_rel, distinct_rel); + + /* now build distinct paths based on input_rel's partial_pathlist */ + create_partial_distinct_paths(root, input_rel, distinct_rel); + + /* Give a helpful error if we failed to create any paths */ + if (distinct_rel->pathlist == NIL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("could not implement DISTINCT"), + errdetail("Some of the datatypes only support hashing, while others only support sorting."))); + + /* + * If there is an FDW that's responsible for all baserels of the query, + * let it consider adding ForeignPaths. + */ + if (distinct_rel->fdwroutine && + distinct_rel->fdwroutine->GetForeignUpperPaths) + distinct_rel->fdwroutine->GetForeignUpperPaths(root, + UPPERREL_DISTINCT, + input_rel, + distinct_rel, + NULL); + + /* Let extensions possibly add some more paths */ + if (create_upper_paths_hook) + (*create_upper_paths_hook) (root, UPPERREL_DISTINCT, input_rel, + distinct_rel, NULL); + + /* Now choose the best path(s) */ + set_cheapest(distinct_rel); + + return distinct_rel; +} + +/* + * create_partial_distinct_paths + * + * Process 'input_rel' partial paths and add unique/aggregate paths to the + * UPPERREL_PARTIAL_DISTINCT rel. For paths created, add Gather/GatherMerge + * paths on top and add a final unique/aggregate path to remove any duplicate + * produced from combining rows from parallel workers. + */ +static void +create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, + RelOptInfo *final_distinct_rel) +{ + RelOptInfo *partial_distinct_rel; + Query *parse; + List *distinctExprs; + double numDistinctRows; + Path *cheapest_partial_path; + ListCell *lc; + + /* nothing to do when there are no partial paths in the input rel */ + if (!input_rel->consider_parallel || input_rel->partial_pathlist == NIL) + return; + + parse = root->parse; + + /* can't do parallel DISTINCT ON */ + if (parse->hasDistinctOn) + return; + + partial_distinct_rel = fetch_upper_rel(root, UPPERREL_PARTIAL_DISTINCT, + NULL); + partial_distinct_rel->reltarget = root->upper_targets[UPPERREL_PARTIAL_DISTINCT]; + partial_distinct_rel->consider_parallel = input_rel->consider_parallel; + + /* + * If input_rel belongs to a single FDW, so does the partial_distinct_rel. + */ + partial_distinct_rel->serverid = input_rel->serverid; + partial_distinct_rel->userid = input_rel->userid; + partial_distinct_rel->useridiscurrent = input_rel->useridiscurrent; + partial_distinct_rel->fdwroutine = input_rel->fdwroutine; + + cheapest_partial_path = linitial(input_rel->partial_pathlist); + + distinctExprs = get_sortgrouplist_exprs(parse->distinctClause, + parse->targetList); + + /* estimate how many distinct rows we'll get from each worker */ + numDistinctRows = estimate_num_groups(root, distinctExprs, + cheapest_partial_path->rows, + NULL, NULL); + + /* first try adding unique paths atop of sorted paths */ + if (grouping_is_sortable(parse->distinctClause)) + { + foreach(lc, input_rel->partial_pathlist) + { + Path *path = (Path *) lfirst(lc); + + if (pathkeys_contained_in(root->distinct_pathkeys, path->pathkeys)) + { + add_partial_path(partial_distinct_rel, (Path *) + create_upper_unique_path(root, + partial_distinct_rel, + path, + list_length(root->distinct_pathkeys), + numDistinctRows)); + } + } + } + + /* + * Now try hash aggregate paths, if enabled and hashing is possible. Since + * we're not on the hook to ensure we do our best to create at least one + * path here, we treat enable_hashagg as a hard off-switch rather than the + * slightly softer variant in create_final_distinct_paths. + */ + if (enable_hashagg && grouping_is_hashable(parse->distinctClause)) + { + add_partial_path(partial_distinct_rel, (Path *) + create_agg_path(root, + partial_distinct_rel, + cheapest_partial_path, + cheapest_partial_path->pathtarget, + AGG_HASHED, + AGGSPLIT_SIMPLE, + parse->distinctClause, + NIL, + NULL, + numDistinctRows)); + } + + /* + * If there is an FDW that's responsible for all baserels of the query, + * let it consider adding ForeignPaths. + */ + if (partial_distinct_rel->fdwroutine && + partial_distinct_rel->fdwroutine->GetForeignUpperPaths) + partial_distinct_rel->fdwroutine->GetForeignUpperPaths(root, + UPPERREL_PARTIAL_DISTINCT, + input_rel, + partial_distinct_rel, + NULL); + + /* Let extensions possibly add some more partial paths */ + if (create_upper_paths_hook) + (*create_upper_paths_hook) (root, UPPERREL_PARTIAL_DISTINCT, + input_rel, partial_distinct_rel, NULL); + + if (partial_distinct_rel->partial_pathlist != NIL) + { + generate_gather_paths(root, partial_distinct_rel, true); + set_cheapest(partial_distinct_rel); + + /* + * Finally, create paths to distinctify the final result. This step + * is needed to remove any duplicates due to combining rows from + * parallel workers. + */ + create_final_distinct_paths(root, partial_distinct_rel, + final_distinct_rel); + } +} + +/* + * create_final_distinct_paths + * Create distinct paths in 'distinct_rel' based on 'input_rel' pathlist + * + * input_rel: contains the source-data paths + * distinct_rel: destination relation for storing created paths + */ +static RelOptInfo * +create_final_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, + RelOptInfo *distinct_rel) +{ + Query *parse = root->parse; + Path *cheapest_input_path = input_rel->cheapest_total_path; + double numDistinctRows; + bool allow_hash; + Path *path; + ListCell *lc; + /* Estimate number of distinct rows there will be */ if (parse->groupClause || parse->groupingSets || parse->hasAggs || root->hasHavingQual) @@ -4382,31 +4639,6 @@ create_distinct_paths(PlannerInfo *root, numDistinctRows)); } - /* Give a helpful error if we failed to find any implementation */ - if (distinct_rel->pathlist == NIL) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("could not implement DISTINCT"), - errdetail("Some of the datatypes only support hashing, while others only support sorting."))); - - /* - * If there is an FDW that's responsible for all baserels of the query, - * let it consider adding ForeignPaths. - */ - if (distinct_rel->fdwroutine && - distinct_rel->fdwroutine->GetForeignUpperPaths) - distinct_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_DISTINCT, - input_rel, distinct_rel, - NULL); - - /* Let extensions possibly add some more paths */ - if (create_upper_paths_hook) - (*create_upper_paths_hook) (root, UPPERREL_DISTINCT, - input_rel, distinct_rel, NULL); - - /* Now choose the best path(s) */ - set_cheapest(distinct_rel); - return distinct_rel; } @@ -6537,7 +6769,6 @@ create_partial_grouping_paths(PlannerInfo *root, dNumPartialGroups)); } } - } if (can_sort && cheapest_partial_path != NULL) @@ -6987,19 +7218,22 @@ apply_scanjoin_target_to_paths(PlannerInfo *root, if (rel_is_partitioned) { List *live_children = NIL; - int partition_idx; + int i; /* Adjust each partition. */ - for (partition_idx = 0; partition_idx < rel->nparts; partition_idx++) + i = -1; + while ((i = bms_next_member(rel->live_parts, i)) >= 0) { - RelOptInfo *child_rel = rel->part_rels[partition_idx]; + RelOptInfo *child_rel = rel->part_rels[i]; AppendRelInfo **appinfos; int nappinfos; List *child_scanjoin_targets = NIL; ListCell *lc; - /* Pruned or dummy children can be ignored. */ - if (child_rel == NULL || IS_DUMMY_REL(child_rel)) + Assert(child_rel != NULL); + + /* Dummy children can be ignored. */ + if (IS_DUMMY_REL(child_rel)) continue; /* Translate scan/join targets for this child. */ @@ -7080,32 +7314,36 @@ create_partitionwise_grouping_paths(PlannerInfo *root, PartitionwiseAggregateType patype, GroupPathExtraData *extra) { - int nparts = input_rel->nparts; - int cnt_parts; List *grouped_live_children = NIL; List *partially_grouped_live_children = NIL; PathTarget *target = grouped_rel->reltarget; bool partial_grouping_valid = true; + int i; Assert(patype != PARTITIONWISE_AGGREGATE_NONE); Assert(patype != PARTITIONWISE_AGGREGATE_PARTIAL || partially_grouped_rel != NULL); /* Add paths for partitionwise aggregation/grouping. */ - for (cnt_parts = 0; cnt_parts < nparts; cnt_parts++) + i = -1; + while ((i = bms_next_member(input_rel->live_parts, i)) >= 0) { - RelOptInfo *child_input_rel = input_rel->part_rels[cnt_parts]; - PathTarget *child_target = copy_pathtarget(target); + RelOptInfo *child_input_rel = input_rel->part_rels[i]; + PathTarget *child_target; AppendRelInfo **appinfos; int nappinfos; GroupPathExtraData child_extra; RelOptInfo *child_grouped_rel; RelOptInfo *child_partially_grouped_rel; - /* Pruned or dummy children can be ignored. */ - if (child_input_rel == NULL || IS_DUMMY_REL(child_input_rel)) + Assert(child_input_rel != NULL); + + /* Dummy children can be ignored. */ + if (IS_DUMMY_REL(child_input_rel)) continue; + child_target = copy_pathtarget(target); + /* * Copy the given "extra" structure as is and then override the * members specific to this child. diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/setrefs.c b/third_party/spanner_pg/src/backend/optimizer/plan/setrefs.c index 07ac5505..9d912a84 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/setrefs.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/setrefs.c @@ -4,7 +4,7 @@ * Post-processing of a completed plan tree: fix references to subplan * vars, compute regproc values for operators, etc * - * 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 * * @@ -31,7 +31,7 @@ typedef struct { - Index varno; /* RT index of Var */ + int varno; /* RT index of Var */ AttrNumber varattno; /* attr number of Var */ AttrNumber resno; /* TLE position of Var */ } tlist_vinfo; @@ -66,11 +66,18 @@ typedef struct { PlannerInfo *root; indexed_tlist *subplan_itlist; - Index newvarno; + int newvarno; int rtoffset; 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 @@ -115,7 +122,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, @@ -143,15 +149,15 @@ static void set_dummy_tlist_references(Plan *plan, int rtoffset); static indexed_tlist *build_tlist_index(List *tlist); static Var *search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, - Index newvarno, + int newvarno, int rtoffset); static Var *search_indexed_tlist_for_non_var(Expr *node, indexed_tlist *itlist, - Index newvarno); + int newvarno); static Var *search_indexed_tlist_for_sortgroupref(Expr *node, Index sortgroupref, indexed_tlist *itlist, - Index newvarno); + int newvarno); static List *fix_join_expr(PlannerInfo *root, List *clauses, indexed_tlist *outer_itlist, @@ -163,7 +169,7 @@ static Node *fix_join_expr_mutator(Node *node, static Node *fix_upper_expr(PlannerInfo *root, Node *node, indexed_tlist *subplan_itlist, - Index newvarno, + int newvarno, int rtoffset, double num_exec); static Node *fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context); @@ -172,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); /***************************************************************************** @@ -505,16 +514,6 @@ add_rte_to_flat_rtable(PlannerGlobal *glob, RangeTblEntry *rte) glob->finalrtable = lappend(glob->finalrtable, newrte); - /* - * Check for RT index overflow; it's very unlikely, but if it did happen, - * the executor would get confused by varnos that match the special varno - * values. - */ - if (IS_SPECIAL_VARNO(list_length(glob->finalrtable))) - ereport(ERROR, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("too many range table entries"))); - /* * If it's a plain relation RTE, add the table to relationOids. * @@ -553,12 +552,12 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) { SeqScan *splan = (SeqScan *) plan; - splan->scanrelid += rtoffset; - splan->plan.targetlist = - fix_scan_list(root, splan->plan.targetlist, + splan->scan.scanrelid += rtoffset; + splan->scan.plan.targetlist = + fix_scan_list(root, splan->scan.plan.targetlist, rtoffset, NUM_EXEC_TLIST(plan)); - splan->plan.qual = - fix_scan_list(root, splan->plan.qual, + splan->scan.plan.qual = + fix_scan_list(root, splan->scan.plan.qual, rtoffset, NUM_EXEC_QUAL(plan)); } break; @@ -896,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); /* @@ -907,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: @@ -962,6 +981,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); @@ -973,7 +993,6 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) if (splan->returningLists) { List *newRL = NIL; - Plan *subplan = outerPlan(splan); ListCell *lcrl, *lcrr; @@ -1040,6 +1059,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; @@ -1267,14 +1348,41 @@ 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 can be called from mark_async_capable_plan(), a helper function for + * create_append_plan(), before set_subqueryscan_references(), to determine + * triviality of a SubqueryScan that is a child of an Append node. So we + * cache the result in the SubqueryScan node to avoid repeated computation. + * + * Note: when called from mark_async_capable_plan(), we determine the result + * before running finalize_plan() on the SubqueryScan node (if needed) and + * set_plan_references() on the subplan tree, but this would be safe, because + * 1) finalize_plan() doesn't modify the tlist or quals for the SubqueryScan + * node (or that for any plan node in the subplan tree), and + * 2) set_plan_references() modifies the tlist for every plan node in the + * subplan tree, but keeps const/resjunk columns as const/resjunk ones and + * preserves the length and order of the tlist, and + * 3) set_plan_references() might delete the topmost plan node like an Append + * or MergeAppend from the subplan tree and pull up the child plan node, + * but in that case, the tlist for the child plan node exactly matches the + * parent. */ -static bool +bool trivial_subqueryscan(SubqueryScan *plan) { int attrno; ListCell *lp, *lc; + /* We might have detected this already; in which case reuse the result */ + 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; @@ -1316,6 +1424,9 @@ trivial_subqueryscan(SubqueryScan *plan) attrno++; } + /* Re-mark the SubqueryScan as deletable from the plan tree */ + plan->scanstatus = SUBQUERY_SCAN_TRIVIAL; + return true; } @@ -1777,6 +1888,9 @@ fix_expr_common(PlannerInfo *root, Node *node) if (OidIsValid(saop->hashfuncid)) record_plan_function_dependency(root, saop->hashfuncid); + + if (OidIsValid(saop->negfuncid)) + record_plan_function_dependency(root, saop->negfuncid); } else if (IsA(node, Const)) { @@ -1997,10 +2111,8 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context) { CurrentOfExpr *cexpr = (CurrentOfExpr *) copyObject(node); - Assert(cexpr->cvarno != INNER_VAR); - Assert(cexpr->cvarno != OUTER_VAR); - if (!IS_SPECIAL_VARNO(cexpr->cvarno)) - cexpr->cvarno += context->rtoffset; + Assert(!IS_SPECIAL_VARNO(cexpr->cvarno)); + cexpr->cvarno += context->rtoffset; return (Node *) cexpr; } if (IsA(node, PlaceHolderVar)) @@ -2497,7 +2609,7 @@ build_tlist_index(List *tlist) * (so nothing other than Vars and PlaceHolderVars can be matched). */ static indexed_tlist * -build_tlist_index_other_vars(List *tlist, Index ignore_rel) +build_tlist_index_other_vars(List *tlist, int ignore_rel) { indexed_tlist *itlist; tlist_vinfo *vinfo; @@ -2549,9 +2661,9 @@ build_tlist_index_other_vars(List *tlist, Index ignore_rel) */ static Var * search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, - Index newvarno, int rtoffset) + int newvarno, int rtoffset) { - Index varno = var->varno; + int varno = var->varno; AttrNumber varattno = var->varattno; tlist_vinfo *vinfo; int i; @@ -2589,7 +2701,7 @@ search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, */ static Var * search_indexed_tlist_for_non_var(Expr *node, - indexed_tlist *itlist, Index newvarno) + indexed_tlist *itlist, int newvarno) { TargetEntry *tle; @@ -2631,7 +2743,7 @@ static Var * search_indexed_tlist_for_sortgroupref(Expr *node, Index sortgroupref, indexed_tlist *itlist, - Index newvarno) + int newvarno) { ListCell *lc; @@ -2663,7 +2775,7 @@ search_indexed_tlist_for_sortgroupref(Expr *node, * relation target lists. Also perform opcode lookup and add * regclass OIDs to root->glob->relationOids. * - * This is used in three different scenarios: + * This is used in four different scenarios: * 1) a normal join clause, where all the Vars in the clause *must* be * replaced by OUTER_VAR or INNER_VAR references. In this case * acceptable_rel should be zero so that any failure to match a Var will be @@ -2678,6 +2790,11 @@ search_indexed_tlist_for_sortgroupref(Expr *node, * to-be-updated relation) alone. Correspondingly inner_itlist is to be * EXCLUDED elements, outer_itlist = NULL and acceptable_rel the target * relation. + * 4) MERGE. In this case, references to the source relation are to be + * replaced with INNER_VAR references, leaving Vars of the target + * relation (the to-be-modified relation) alone. So inner_itlist is to be + * the source relation elements, outer_itlist = NULL and acceptable_rel + * the target relation. * * 'clauses' is the targetlist or list of join clauses * 'outer_itlist' is the indexed target list of the outer join relation, @@ -2849,7 +2966,7 @@ static Node * fix_upper_expr(PlannerInfo *root, Node *node, indexed_tlist *subplan_itlist, - Index newvarno, + int newvarno, int rtoffset, double num_exec) { @@ -3009,6 +3126,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 @@ -3028,11 +3217,11 @@ record_plan_function_dependency(PlannerInfo *root, Oid funcid) * For performance reasons, we don't bother to track built-in functions; * we just assume they'll never change (or at least not in ways that'd * invalidate plans using them). For this purpose we can consider a - * built-in function to be one with OID less than FirstBootstrapObjectId. + * built-in function to be one with OID less than FirstUnpinnedObjectId. * Note that the OID generator guarantees never to generate such an OID * after startup, even at OID wraparound. */ - if (funcid >= (Oid) FirstBootstrapObjectId) + if (funcid >= (Oid) FirstUnpinnedObjectId) { PlanInvalItem *inval_item = makeNode(PlanInvalItem); @@ -3068,7 +3257,7 @@ record_plan_type_dependency(PlannerInfo *root, Oid typid) * As in record_plan_function_dependency, ignore the possibility that * someone would change a built-in domain. */ - if (typid >= (Oid) FirstBootstrapObjectId) + if (typid >= (Oid) FirstUnpinnedObjectId) { PlanInvalItem *inval_item = makeNode(PlanInvalItem); diff --git a/third_party/spanner_pg/src/backend/optimizer/plan/subselect.c b/third_party/spanner_pg/src/backend/optimizer/plan/subselect.c index d2581aac..557d5b97 100644 --- a/third_party/spanner_pg/src/backend/optimizer/plan/subselect.c +++ b/third_party/spanner_pg/src/backend/optimizer/plan/subselect.c @@ -6,7 +6,7 @@ * This module deals with SubLinks and CTEs, but not subquery RTEs (i.e., * not sub-SELECT-in-FROM cases). * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/optimizer/prep/prepagg.c b/third_party/spanner_pg/src/backend/optimizer/prep/prepagg.c index 6b281192..42bbd6e7 100644 --- a/third_party/spanner_pg/src/backend/optimizer/prep/prepagg.c +++ b/third_party/spanner_pg/src/backend/optimizer/prep/prepagg.c @@ -22,7 +22,7 @@ * at executor startup. The Agg nodes are constructed much later in the * planning, however, so it's not trivial. * - * 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/third_party/spanner_pg/src/backend/optimizer/prep/prepjointree.c b/third_party/spanner_pg/src/backend/optimizer/prep/prepjointree.c index 1f20d188..ea057630 100644 --- a/third_party/spanner_pg/src/backend/optimizer/prep/prepjointree.c +++ b/third_party/spanner_pg/src/backend/optimizer/prep/prepjointree.c @@ -14,7 +14,7 @@ * remove_useless_result_rtes * * - * 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 * * @@ -81,7 +81,7 @@ static Node *pull_up_simple_union_all(PlannerInfo *root, Node *jtnode, static void pull_up_union_leaf_queries(Node *setOp, PlannerInfo *root, int parentRTindex, Query *setOpQuery, int childRToffset); -static void make_setop_translation_list(Query *query, Index newvarno, +static void make_setop_translation_list(Query *query, int newvarno, AppendRelInfo *appinfo); static bool is_simple_subquery(PlannerInfo *root, Query *subquery, RangeTblEntry *rte, @@ -133,6 +133,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 @@ -902,10 +982,9 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, ListCell *lc; /* - * Need a modifiable copy of the subquery to hack on. Even if we didn't - * sometimes choose not to pull up below, we must do this to avoid - * problems if the same subquery is referenced from multiple jointree - * items (which can't happen normally, but might after rule rewriting). + * Make a modifiable copy of the subquery to hack on, so that the RTE will + * be left unchanged in case we decide below that we can't pull it up + * after all. */ subquery = copyObject(rte->subquery); @@ -1183,6 +1262,14 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, Assert(root->placeholder_list == NIL); Assert(subroot->placeholder_list == NIL); + /* + * We no longer need the RTE's copy of the subquery's query tree. Getting + * rid of it saves nothing in particular so far as this level of query is + * concerned; but if this query level is in turn pulled up into a parent, + * we'd waste cycles copying the now-unused query tree. + */ + rte->subquery = NULL; + /* * Miscellaneous housekeeping. * @@ -1374,7 +1461,7 @@ pull_up_union_leaf_queries(Node *setOp, PlannerInfo *root, int parentRTindex, * Also create the rather trivial reverse-translation array. */ static void -make_setop_translation_list(Query *query, Index newvarno, +make_setop_translation_list(Query *query, int newvarno, AppendRelInfo *appinfo) { List *vars = NIL; @@ -2049,6 +2136,15 @@ perform_pullup_replace_vars(PlannerInfo *root, pullup_replace_vars((Node *) parse->targetList, rvcontext); parse->returningList = (List *) pullup_replace_vars((Node *) parse->returningList, rvcontext); + + foreach(lc, parse->windowClause) + { + WindowClause *wc = lfirst_node(WindowClause, lc); + + if (wc->runCondition != NIL) + wc->runCondition = (List *) + pullup_replace_vars((Node *) wc->runCondition, rvcontext); + } if (parse->onConflict) { parse->onConflict->onConflictSet = (List *) @@ -2063,6 +2159,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); @@ -2284,8 +2391,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. @@ -2306,7 +2413,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; @@ -2364,8 +2471,13 @@ pullup_replace_vars_callback(Var *var, else if (newnode && IsA(newnode, PlaceHolderVar) && ((PlaceHolderVar *) newnode)->phlevelsup == 0) { - /* No need to wrap a PlaceHolderVar with another one, either */ - wrap = false; + /* The same rules apply for a PlaceHolderVar */ + if (rcon->target_rte->lateral && + !bms_is_subset(((PlaceHolderVar *) newnode)->phrels, + rcon->relids)) + wrap = true; + else + wrap = false; } else if (rcon->wrap_non_vars) { diff --git a/third_party/spanner_pg/src/backend/optimizer/prep/prepqual.c b/third_party/spanner_pg/src/backend/optimizer/prep/prepqual.c index 13b3885c..b8a8c7f5 100644 --- a/third_party/spanner_pg/src/backend/optimizer/prep/prepqual.c +++ b/third_party/spanner_pg/src/backend/optimizer/prep/prepqual.c @@ -19,7 +19,7 @@ * tree after local transformations that might introduce nested AND/ORs. * * - * 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 * * @@ -131,6 +131,7 @@ negate_clause(Node *node) newopexpr->opno = negator; newopexpr->opfuncid = InvalidOid; newopexpr->hashfuncid = InvalidOid; + newopexpr->negfuncid = InvalidOid; newopexpr->useOr = !saopexpr->useOr; newopexpr->inputcollid = saopexpr->inputcollid; newopexpr->args = saopexpr->args; diff --git a/third_party/spanner_pg/src/backend/optimizer/prep/preptlist.c b/third_party/spanner_pg/src/backend/optimizer/prep/preptlist.c index e9434580..133966b6 100644 --- a/third_party/spanner_pg/src/backend/optimizer/prep/preptlist.c +++ b/third_party/spanner_pg/src/backend/optimizer/prep/preptlist.c @@ -25,7 +25,7 @@ * rewriter's work is more concerned with SQL semantics. * * - * 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 * * IDENTIFICATION @@ -107,14 +107,15 @@ preprocess_targetlist(PlannerInfo *root) root->update_colnos = extract_update_targetlist_colnos(tlist); /* - * For non-inherited UPDATE/DELETE, register any junk column(s) needed to - * allow the executor to identify the rows to be updated or deleted. In - * the inheritance case, we do nothing now, leaving this to be dealt with - * when expand_inherited_rtentry() makes the leaf target relations. (But - * there might not be any leaf target relations, in which case we must do - * this in distribute_row_identity_vars().) + * For non-inherited UPDATE/DELETE/MERGE, register any junk column(s) + * needed to allow the executor to identify the rows to be updated or + * deleted. In the inheritance case, we do nothing now, leaving this to + * be dealt with when expand_inherited_rtentry() makes the leaf target + * relations. (But there might not be any leaf target relations, in which + * case we must do this in distribute_row_identity_vars().) */ - if ((command_type == CMD_UPDATE || command_type == CMD_DELETE) && + if ((command_type == CMD_UPDATE || command_type == CMD_DELETE || + command_type == CMD_MERGE) && !target_rte->inh) { /* row-identity logic expects to add stuff to processed_tlist */ @@ -124,6 +125,65 @@ preprocess_targetlist(PlannerInfo *root) tlist = root->processed_tlist; } + /* + * For MERGE we also need to handle the target list for each INSERT and + * UPDATE action separately. In addition, we examine the qual of each + * action and add any Vars there (other than those of the target rel) to + * the subplan targetlist. + */ + if (command_type == CMD_MERGE) + { + ListCell *l; + + /* + * 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); + List *vars; + ListCell *l2; + + 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 resjunk entries for any Vars and PlaceHolderVars used in + * each action's targetlist and WHEN condition that belong to + * relations other than the target. We don't expect to see any + * aggregates or window functions here. + */ + vars = pull_var_clause((Node *) + list_concat_copy((List *) action->qual, + action->targetList), + PVC_INCLUDE_PLACEHOLDERS); + foreach(l2, vars) + { + Var *var = (Var *) lfirst(l2); + TargetEntry *tle; + + if (IsA(var, Var) && var->varno == result_relation) + continue; /* don't need it */ + + if (tlist_member((Expr *) var, tlist)) + continue; /* already got it */ + + tle = makeTargetEntry((Expr *) var, + list_length(tlist) + 1, + NULL, true); + tlist = lappend(tlist, tle); + } + list_free(vars); + } + } + /* * 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/third_party/spanner_pg/src/backend/optimizer/prep/prepunion.c b/third_party/spanner_pg/src/backend/optimizer/prep/prepunion.c index 493121da..2301d29c 100644 --- a/third_party/spanner_pg/src/backend/optimizer/prep/prepunion.c +++ b/third_party/spanner_pg/src/backend/optimizer/prep/prepunion.c @@ -12,7 +12,7 @@ * case, but most of the heavy lifting for that is done elsewhere, * notably in prepjointree.c and allpaths.c. * - * 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/third_party/spanner_pg/src/backend/optimizer/util/appendinfo.c b/third_party/spanner_pg/src/backend/optimizer/util/appendinfo.c index d22b9bb4..37a231f8 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/appendinfo.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/appendinfo.c @@ -3,12 +3,12 @@ * appendinfo.c * Routines for mapping between append parent(s) and children * - * 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 * * * IDENTIFICATION - * src/backend/optimizer/path/appendinfo.c + * src/backend/optimizer/util/appendinfo.c * *------------------------------------------------------------------------- */ @@ -21,6 +21,7 @@ #include "nodes/nodeFuncs.h" #include "optimizer/appendinfo.h" #include "optimizer/pathnode.h" +#include "optimizer/planmain.h" #include "parser/parsetree.h" #include "utils/lsyscache.h" #include "utils/rel.h" @@ -750,7 +751,7 @@ find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos) /* * add_row_identity_var - * Register a row-identity column to be used in UPDATE/DELETE. + * Register a row-identity column to be used in UPDATE/DELETE/MERGE. * * The Var must be equal(), aside from varno, to any other row-identity * column with the same rowid_name. Thus, for example, "wholerow" @@ -776,8 +777,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) @@ -864,14 +865,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, @@ -927,8 +930,8 @@ add_row_identity_columns(PlannerInfo *root, Index rtindex, * distribute_row_identity_vars * * After we have finished identifying all the row identity columns - * needed by an inherited UPDATE/DELETE query, make sure that these - * columns will be generated by all the target relations. + * needed by an inherited UPDATE/DELETE/MERGE query, make sure that + * these columns will be generated by all the target relations. * * This is more or less like what build_base_rel_tlists() does, * except that it would not understand what to do with ROWID_VAR Vars. @@ -944,8 +947,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; @@ -965,9 +971,10 @@ distribute_row_identity_vars(PlannerInfo *root) * certainly process no rows. Handle this edge case by re-opening the top * result relation and adding the row identity columns it would have used, * as preprocess_targetlist() would have done if it weren't marked "inh". - * (This is a bit ugly, but it seems better to confine the ugliness and - * extra cycles to this unusual corner case.) We needn't worry about - * fixing the rel's reltarget, as that won't affect the finished plan. + * Then re-run build_base_rel_tlists() to ensure that the added columns + * get propagated to the relation's reltarget. (This is a bit ugly, but + * it seems better to confine the ugliness and extra cycles to this + * unusual corner case.) */ if (root->row_identity_vars == NIL) { @@ -977,6 +984,8 @@ distribute_row_identity_vars(PlannerInfo *root) add_row_identity_columns(root, result_relation, target_rte, target_relation); table_close(target_relation, NoLock); + build_base_rel_tlists(root, root->processed_tlist); + /* There are no ROWID_VAR Vars in this case, so we're done. */ return; } diff --git a/third_party/spanner_pg/src/backend/optimizer/util/clauses.c b/third_party/spanner_pg/src/backend/optimizer/util/clauses.c index 5a0aeb3a..4badf940 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/clauses.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/clauses.c @@ -3,7 +3,7 @@ * clauses.c * routines to manipulate qualification clauses * - * 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 * * @@ -359,6 +359,11 @@ contain_subplans_walker(Node *node, void *context) * mistakenly think that something like "WHERE random() < 0.5" can be treated * as a constant qualification. * + * This will give the right answer only for clauses that have been put + * through expression preprocessing. Callers outside the planner typically + * should use contain_mutable_functions_after_planning() instead, for the + * reasons given there. + * * We will recursively look into Query nodes (i.e., SubLink sub-selects) * but not into SubPlans. See comments for contain_volatile_functions(). */ @@ -418,6 +423,34 @@ contain_mutable_functions_walker(Node *node, void *context) context); } +/* + * contain_mutable_functions_after_planning + * Test whether given expression contains mutable functions. + * + * This is a wrapper for contain_mutable_functions() that is safe to use from + * outside the planner. The difference is that it first runs the expression + * through expression_planner(). There are two key reasons why we need that: + * + * First, function default arguments will get inserted, which may affect + * volatility (consider "default now()"). + * + * Second, inline-able functions will get inlined, which may allow us to + * conclude that the function is really less volatile than it's marked. + * As an example, polymorphic functions must be marked with the most volatile + * behavior that they have for any input type, but once we inline the + * function we may be able to conclude that it's not so volatile for the + * particular input type we're dealing with. + */ +bool +contain_mutable_functions_after_planning(Expr *expr) +{ + /* We assume here that expression_planner() won't scribble on its input */ + expr = expression_planner(expr); + + /* Now we can search for non-immutable functions */ + return contain_mutable_functions((Node *) expr); +} + /***************************************************************************** * Check clauses for volatile functions @@ -431,6 +464,11 @@ contain_mutable_functions_walker(Node *node, void *context) * volatile function) is found. This test prevents, for example, * invalid conversions of volatile expressions into indexscan quals. * + * This will give the right answer only for clauses that have been put + * through expression preprocessing. Callers outside the planner typically + * should use contain_volatile_functions_after_planning() instead, for the + * reasons given there. + * * We will recursively look into Query nodes (i.e., SubLink sub-selects) * but not into SubPlans. This is a bit odd, but intentional. If we are * looking at a SubLink, we are probably deciding whether a query tree @@ -554,6 +592,34 @@ contain_volatile_functions_walker(Node *node, void *context) context); } +/* + * contain_volatile_functions_after_planning + * Test whether given expression contains volatile functions. + * + * This is a wrapper for contain_volatile_functions() that is safe to use from + * outside the planner. The difference is that it first runs the expression + * through expression_planner(). There are two key reasons why we need that: + * + * First, function default arguments will get inserted, which may affect + * volatility (consider "default random()"). + * + * Second, inline-able functions will get inlined, which may allow us to + * conclude that the function is really less volatile than it's marked. + * As an example, polymorphic functions must be marked with the most volatile + * behavior that they have for any input type, but once we inline the + * function we may be able to conclude that it's not so volatile for the + * particular input type we're dealing with. + */ +bool +contain_volatile_functions_after_planning(Expr *expr) +{ + /* We assume here that expression_planner() won't scribble on its input */ + expr = expression_planner(expr); + + /* Now we can search for volatile functions */ + return contain_volatile_functions((Node *) expr); +} + /* * Special purpose version of contain_volatile_functions() for use in COPY: * ignore nextval(), but treat all other functions normally. @@ -2119,7 +2185,8 @@ eval_const_expressions(PlannerInfo *root, Node *node) * * We'll use a hash table if all of the following conditions are met: * 1. The 2nd argument of the array contain only Consts. - * 2. useOr is true. + * 2. useOr is true or there is a valid negator operator for the + * ScalarArrayOpExpr's opno. * 3. There's valid hash function for both left and righthand operands and * these hash functions are the same. * 4. If the array contains enough elements for us to consider it to be @@ -2144,27 +2211,71 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) Oid lefthashfunc; Oid righthashfunc; - if (saop->useOr && arrayarg && IsA(arrayarg, Const) && - !((Const *) arrayarg)->constisnull && - get_op_hash_functions(saop->opno, &lefthashfunc, &righthashfunc) && - lefthashfunc == righthashfunc) + if (arrayarg && IsA(arrayarg, Const) && + !((Const *) arrayarg)->constisnull) { - Datum arrdatum = ((Const *) arrayarg)->constvalue; - ArrayType *arr = (ArrayType *) DatumGetPointer(arrdatum); - int nitems; + if (saop->useOr) + { + if (get_op_hash_functions(saop->opno, &lefthashfunc, &righthashfunc) && + lefthashfunc == righthashfunc) + { + Datum arrdatum = ((Const *) arrayarg)->constvalue; + ArrayType *arr = (ArrayType *) DatumGetPointer(arrdatum); + int nitems; - /* - * Only fill in the hash functions if the array looks large enough - * for it to be worth hashing instead of doing a linear search. - */ - nitems = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr)); + /* + * Only fill in the hash functions if the array looks + * large enough for it to be worth hashing instead of + * doing a linear search. + */ + nitems = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr)); - if (nitems >= MIN_ARRAY_SIZE_FOR_HASHED_SAOP) + if (nitems >= MIN_ARRAY_SIZE_FOR_HASHED_SAOP) + { + /* Looks good. Fill in the hash functions */ + saop->hashfuncid = lefthashfunc; + } + return true; + } + } + else /* !saop->useOr */ { - /* Looks good. Fill in the hash functions */ - saop->hashfuncid = lefthashfunc; + Oid negator = get_negator(saop->opno); + + /* + * Check if this is a NOT IN using an operator whose negator + * is hashable. If so we can still build a hash table and + * just ensure the lookup items are not in the hash table. + */ + if (OidIsValid(negator) && + get_op_hash_functions(negator, &lefthashfunc, &righthashfunc) && + lefthashfunc == righthashfunc) + { + Datum arrdatum = ((Const *) arrayarg)->constvalue; + ArrayType *arr = (ArrayType *) DatumGetPointer(arrdatum); + int nitems; + + /* + * Only fill in the hash functions if the array looks + * large enough for it to be worth hashing instead of + * doing a linear search. + */ + nitems = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr)); + + if (nitems >= MIN_ARRAY_SIZE_FOR_HASHED_SAOP) + { + /* Looks good. Fill in the hash functions */ + saop->hashfuncid = lefthashfunc; + + /* + * Also set the negfuncid. The executor will need + * that to perform hashtable lookups. + */ + saop->negfuncid = get_opcode(negator); + } + return true; + } } - return true; } } @@ -2289,6 +2400,7 @@ eval_const_expressions_mutator(Node *node, int16 typLen; bool typByVal; Datum pval; + Const *con; get_typlenbyval(param->paramtype, &typLen, &typByVal); @@ -2296,13 +2408,15 @@ eval_const_expressions_mutator(Node *node, pval = prm->value; else pval = datumCopy(prm->value, typByVal, typLen); - return (Node *) makeConst(param->paramtype, - param->paramtypmod, - param->paramcollid, - (int) typLen, - pval, - prm->isnull, - typByVal); + con = makeConst(param->paramtype, + param->paramtypmod, + param->paramcollid, + (int) typLen, + pval, + prm->isnull, + typByVal); + con->location = param->location; + return (Node *) con; } } } @@ -5012,7 +5126,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); @@ -5199,7 +5313,7 @@ pull_paramids_walker(Node *node, Bitmapset **context) return false; if (IsA(node, Param)) { - Param *param = (Param *)node; + Param *param = (Param *) node; *context = bms_add_member(*context, param->paramid); return false; diff --git a/third_party/spanner_pg/src/backend/optimizer/util/inherit.c b/third_party/spanner_pg/src/backend/optimizer/util/inherit.c index 7ea75804..3c11f5db 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/inherit.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/inherit.c @@ -3,12 +3,12 @@ * inherit.c * Routines to process child relations in inheritance trees * - * 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 * * * IDENTIFICATION - * src/backend/optimizer/path/inherit.c + * src/backend/optimizer/util/inherit.c * *------------------------------------------------------------------------- */ @@ -348,7 +348,7 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo, * that survive pruning. Below, we will initialize child objects for the * surviving partitions. */ - live_parts = prune_append_rel_partitions(relinfo); + relinfo->live_parts = live_parts = prune_append_rel_partitions(relinfo); /* Expand simple_rel_array and friends to hold child objects. */ num_live_parts = bms_num_members(live_parts); @@ -606,7 +606,7 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte, /* * If we are creating a child of the query target relation (only possible - * in UPDATE/DELETE), add it to all_result_relids, as well as + * in UPDATE/DELETE/MERGE), add it to all_result_relids, as well as * leaf_result_relids if appropriate, and make sure that we generate * required row-identity data. */ diff --git a/third_party/spanner_pg/src/backend/optimizer/util/joininfo.c b/third_party/spanner_pg/src/backend/optimizer/util/joininfo.c index 717808b0..d4cffdb1 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/joininfo.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/joininfo.c @@ -3,7 +3,7 @@ * joininfo.c * joininfo list manipulation routines * - * 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/third_party/spanner_pg/src/backend/optimizer/util/orclauses.c b/third_party/spanner_pg/src/backend/optimizer/util/orclauses.c index d559f338..b1363df0 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/orclauses.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/orclauses.c @@ -3,7 +3,7 @@ * orclauses.c * Routines to extract restriction OR clauses from join OR clauses * - * 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/third_party/spanner_pg/src/backend/optimizer/util/paramassign.c b/third_party/spanner_pg/src/backend/optimizer/util/paramassign.c index ebb42411..12486cb0 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/paramassign.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/paramassign.c @@ -40,7 +40,7 @@ * doesn't really save much executor work anyway. * * - * 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 * * IDENTIFICATION @@ -431,7 +431,7 @@ process_subquery_nestloop_params(PlannerInfo *root, List *subplan_params) foreach(lc, subplan_params) { - PlannerParamItem *pitem = castNode(PlannerParamItem, lfirst(lc)); + PlannerParamItem *pitem = lfirst_node(PlannerParamItem, lc); if (IsA(pitem->item, Var)) { diff --git a/third_party/spanner_pg/src/backend/optimizer/util/pathnode.c b/third_party/spanner_pg/src/backend/optimizer/util/pathnode.c index f8642d56..46fd29be 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/pathnode.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/pathnode.c @@ -3,7 +3,7 @@ * pathnode.c * Routines to manipulate pathlists and create path nodes * - * 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 * * @@ -26,6 +26,7 @@ #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" +#include "optimizer/placeholder.h" #include "optimizer/planmain.h" #include "optimizer/prep.h" #include "optimizer/restrictinfo.h" @@ -56,6 +57,10 @@ static int append_startup_cost_compare(const ListCell *a, const ListCell *b); static List *reparameterize_pathlist_by_child(PlannerInfo *root, List *pathlist, RelOptInfo *child_rel); +static bool contain_references_to(PlannerInfo *root, Node *clause, + Relids relids); +static bool ris_contain_references_to(PlannerInfo *root, List *rinfos, + Relids relids); /***************************************************************************** @@ -105,7 +110,7 @@ compare_path_costs(Path *path1, Path *path2, CostSelector criterion) } /* - * compare_path_fractional_costs + * compare_fractional_path_costs * Return -1, 0, or +1 according as path1 is cheaper, the same cost, * or more expensive than path2 for fetching the specified fraction * of the total tuples. @@ -936,7 +941,7 @@ create_seqscan_path(PlannerInfo *root, RelOptInfo *rel, pathnode->pathtarget = rel->reltarget; pathnode->param_info = get_baserel_parampathinfo(root, rel, required_outer); - pathnode->parallel_aware = parallel_workers > 0 ? true : false; + pathnode->parallel_aware = (parallel_workers > 0); pathnode->parallel_safe = rel->consider_parallel; pathnode->parallel_workers = parallel_workers; pathnode->pathkeys = NIL; /* seqscan has unordered result */ @@ -1057,7 +1062,7 @@ create_bitmap_heap_path(PlannerInfo *root, pathnode->path.pathtarget = rel->reltarget; pathnode->path.param_info = get_baserel_parampathinfo(root, rel, required_outer); - pathnode->path.parallel_aware = parallel_degree > 0 ? true : false; + pathnode->path.parallel_aware = (parallel_degree > 0); pathnode->path.parallel_safe = rel->consider_parallel; pathnode->path.parallel_workers = parallel_degree; pathnode->path.pathkeys = NIL; /* always unordered */ @@ -2444,10 +2449,10 @@ create_nestloop_path(PlannerInfo *root, restrict_clauses = jclauses; } - pathnode->path.pathtype = T_NestLoop; - pathnode->path.parent = joinrel; - pathnode->path.pathtarget = joinrel->reltarget; - pathnode->path.param_info = + pathnode->jpath.path.pathtype = T_NestLoop; + pathnode->jpath.path.parent = joinrel; + pathnode->jpath.path.pathtarget = joinrel->reltarget; + pathnode->jpath.path.param_info = get_joinrel_parampathinfo(root, joinrel, outer_path, @@ -2455,17 +2460,17 @@ create_nestloop_path(PlannerInfo *root, extra->sjinfo, required_outer, &restrict_clauses); - pathnode->path.parallel_aware = false; - pathnode->path.parallel_safe = joinrel->consider_parallel && + pathnode->jpath.path.parallel_aware = false; + pathnode->jpath.path.parallel_safe = joinrel->consider_parallel && outer_path->parallel_safe && inner_path->parallel_safe; /* This is a foolish way to estimate parallel_workers, but for now... */ - pathnode->path.parallel_workers = outer_path->parallel_workers; - pathnode->path.pathkeys = pathkeys; - pathnode->jointype = jointype; - pathnode->inner_unique = extra->inner_unique; - pathnode->outerjoinpath = outer_path; - pathnode->innerjoinpath = inner_path; - pathnode->joinrestrictinfo = restrict_clauses; + pathnode->jpath.path.parallel_workers = outer_path->parallel_workers; + pathnode->jpath.path.pathkeys = pathkeys; + pathnode->jpath.jointype = jointype; + pathnode->jpath.inner_unique = extra->inner_unique; + pathnode->jpath.outerjoinpath = outer_path; + pathnode->jpath.innerjoinpath = inner_path; + pathnode->jpath.joinrestrictinfo = restrict_clauses; final_cost_nestloop(root, pathnode, workspace, extra); @@ -3388,6 +3393,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 +3407,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 +3430,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 @@ -3602,7 +3618,8 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, /* * create_modifytable_path - * Creates a pathnode that represents performing INSERT/UPDATE/DELETE mods + * Creates a pathnode that represents performing INSERT/UPDATE/DELETE/MERGE + * mods * * 'rel' is the parent relation associated with the result * 'subpath' is a Path producing source data @@ -3620,6 +3637,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 +3649,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 +3716,7 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, pathnode->rowMarks = rowMarks; pathnode->onconflict = onconflict; pathnode->epqParam = epqParam; + pathnode->mergeActionLists = mergeActionLists; return pathnode; } @@ -4037,6 +4057,40 @@ do { \ switch (nodeTag(path)) { case T_Path: + + /* + * If the path's restriction clauses contain lateral references to + * the other relation, we can't reparameterize, because we must + * not change the RelOptInfo's contents here. (Doing so would + * break things if we end up using a non-partitionwise join.) + */ + if (ris_contain_references_to(root, + path->parent->baserestrictinfo, + child_rel->top_parent_relids)) + return NULL; + + /* + * If it's a SampleScan with tablesample parameters referencing + * the other relation, we can't reparameterize, because we must + * not change the RTE's contents here. (Doing so would break + * things if we end up using a non-partitionwise join.) + */ + if (path->pathtype == T_SampleScan) + { + Index scan_relid = path->parent->relid; + RangeTblEntry *rte; + + /* it should be a base rel with a tablesample clause... */ + Assert(scan_relid > 0); + rte = planner_rt_fetch(scan_relid, root); + Assert(rte->rtekind == RTE_RELATION); + Assert(rte->tablesample != NULL); + + if (contain_references_to(root, (Node *) rte->tablesample, + child_rel->top_parent_relids)) + return NULL; + } + FLAT_COPY_PATH(new_path, path, Path); break; @@ -4044,6 +4098,18 @@ do { \ { IndexPath *ipath; + /* + * If the path's restriction clauses contain lateral + * references to the other relation, we can't reparameterize, + * because we must not change the IndexOptInfo's contents + * here. (Doing so would break things if we end up using a + * non-partitionwise join.) + */ + if (ris_contain_references_to(root, + path->parent->baserestrictinfo, + child_rel->top_parent_relids)) + return NULL; + FLAT_COPY_PATH(ipath, path, IndexPath); ADJUST_CHILD_ATTRS(ipath->indexclauses); new_path = (Path *) ipath; @@ -4054,6 +4120,18 @@ do { \ { BitmapHeapPath *bhpath; + /* + * If the path's restriction clauses contain lateral + * references to the other relation, we can't reparameterize, + * because we must not change the RelOptInfo's contents here. + * (Doing so would break things if we end up using a + * non-partitionwise join.) + */ + if (ris_contain_references_to(root, + path->parent->baserestrictinfo, + child_rel->top_parent_relids)) + return NULL; + FLAT_COPY_PATH(bhpath, path, BitmapHeapPath); REPARAMETERIZE_CHILD_PATH(bhpath->bitmapqual); new_path = (Path *) bhpath; @@ -4085,6 +4163,18 @@ do { \ ForeignPath *fpath; ReparameterizeForeignPathByChild_function rfpc_func; + /* + * If the path's restriction clauses contain lateral + * references to the other relation, we can't reparameterize, + * because we must not change the RelOptInfo's contents here. + * (Doing so would break things if we end up using a + * non-partitionwise join.) + */ + if (ris_contain_references_to(root, + path->parent->baserestrictinfo, + child_rel->top_parent_relids)) + return NULL; + FLAT_COPY_PATH(fpath, path, ForeignPath); if (fpath->fdw_outerpath) REPARAMETERIZE_CHILD_PATH(fpath->fdw_outerpath); @@ -4103,6 +4193,18 @@ do { \ { CustomPath *cpath; + /* + * If the path's restriction clauses contain lateral + * references to the other relation, we can't reparameterize, + * because we must not change the RelOptInfo's contents here. + * (Doing so would break things if we end up using a + * non-partitionwise join.) + */ + if (ris_contain_references_to(root, + path->parent->baserestrictinfo, + child_rel->top_parent_relids)) + return NULL; + FLAT_COPY_PATH(cpath, path, CustomPath); REPARAMETERIZE_CHILD_PATH_LIST(cpath->custom_paths); if (cpath->methods && @@ -4118,13 +4220,15 @@ do { \ case T_NestPath: { JoinPath *jpath; + NestPath *npath; - FLAT_COPY_PATH(jpath, path, NestPath); + FLAT_COPY_PATH(npath, path, NestPath); + jpath = (JoinPath *) npath; REPARAMETERIZE_CHILD_PATH(jpath->outerjoinpath); REPARAMETERIZE_CHILD_PATH(jpath->innerjoinpath); ADJUST_CHILD_ATTRS(jpath->joinrestrictinfo); - new_path = (Path *) jpath; + new_path = (Path *) npath; } break; @@ -4279,3 +4383,91 @@ reparameterize_pathlist_by_child(PlannerInfo *root, return result; } + +/* + * contain_references_to + * Detect whether any Vars or PlaceHolderVars in the given clause contain + * lateral references to the given 'relids'. + */ +static bool +contain_references_to(PlannerInfo *root, Node *clause, Relids relids) +{ + bool ret = false; + List *vars; + ListCell *lc; + + /* + * Examine all Vars and PlaceHolderVars used in the clause. + * + * By omitting the relevant flags, this also gives us a cheap sanity check + * that no aggregates or window functions appear in the clause. We don't + * expect any of those in scan-level restrictions or tablesamples. + */ + vars = pull_var_clause(clause, PVC_INCLUDE_PLACEHOLDERS); + foreach(lc, vars) + { + Node *node = (Node *) lfirst(lc); + + if (IsA(node, Var)) + { + Var *var = (Var *) node; + + if (bms_is_member(var->varno, relids)) + { + ret = true; + break; + } + } + else if (IsA(node, PlaceHolderVar)) + { + PlaceHolderVar *phv = (PlaceHolderVar *) node; + PlaceHolderInfo *phinfo = find_placeholder_info(root, phv, false); + + /* + * We should check both ph_eval_at (in case the PHV is to be + * computed at the other relation and then laterally referenced + * here) and ph_lateral (in case the PHV is to be evaluated here + * but contains lateral references to the other relation). The + * former case should not occur in baserestrictinfo clauses, but + * it can occur in tablesample clauses. + */ + if (bms_overlap(phinfo->ph_eval_at, relids) || + bms_overlap(phinfo->ph_lateral, relids)) + { + ret = true; + break; + } + } + else + Assert(false); + } + + list_free(vars); + + return ret; +} + +/* + * ris_contain_references_to + * Apply contain_references_to() to a list of RestrictInfos. + * + * We need extra code for this because pull_var_clause() can't descend + * through RestrictInfos. + */ +static bool +ris_contain_references_to(PlannerInfo *root, List *rinfos, Relids relids) +{ + ListCell *lc; + + foreach(lc, rinfos) + { + RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc); + + /* Pseudoconstant clauses can't contain any Vars or PHVs */ + if (rinfo->pseudoconstant) + continue; + if (contain_references_to(root, (Node *) rinfo->clause, relids)) + return true; + } + return false; +} diff --git a/third_party/spanner_pg/src/backend/optimizer/util/placeholder.c b/third_party/spanner_pg/src/backend/optimizer/util/placeholder.c index 1c4202d8..3b0f0584 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/placeholder.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/placeholder.c @@ -4,7 +4,7 @@ * PlaceHolderVar and PlaceHolderInfo manipulation routines * * - * 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/third_party/spanner_pg/src/backend/optimizer/util/plancat.c b/third_party/spanner_pg/src/backend/optimizer/util/plancat.c index 2471df2b..48ec6caa 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/plancat.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/plancat.c @@ -4,7 +4,7 @@ * routines for accessing the system catalogs * * - * 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 * * @@ -30,6 +30,7 @@ #include "catalog/pg_am.h" #include "catalog/pg_proc.h" #include "catalog/pg_statistic_ext.h" +#include "catalog/pg_statistic_ext_data.h" #include "foreign/fdwapi.h" #include "miscadmin.h" #include "nodes/makefuncs.h" @@ -132,7 +133,8 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, * Relations without a table AM can be used in a query only if they are of * special-cased relkinds. This check prevents us from crashing later if, * for example, a view's ON SELECT rule has gone missing. Note that - * table_open() already rejected indexes and composite types. + * table_open() already rejected indexes and composite types; spell the + * error the same way it does. */ if (!relation->rd_tableam) { @@ -141,7 +143,8 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot open relation \"%s\"", - RelationGetRelationName(relation)))); + RelationGetRelationName(relation)), + errdetail_relkind_not_supported(relation->rd_rel->relkind))); } /* Temporary and unlogged relations are inaccessible during recovery. */ @@ -984,117 +987,104 @@ estimate_rel_size(Relation rel, int32 *attr_widths, BlockNumber relallvisible; double density; - switch (rel->rd_rel->relkind) + if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind)) { - case RELKIND_RELATION: - case RELKIND_MATVIEW: - case RELKIND_TOASTVALUE: - table_relation_estimate_size(rel, attr_widths, pages, tuples, - allvisfrac); - break; + table_relation_estimate_size(rel, attr_widths, pages, tuples, + allvisfrac); + } + else if (rel->rd_rel->relkind == RELKIND_INDEX) + { + /* + * XXX: It'd probably be good to move this into a callback, individual + * index types e.g. know if they have a metapage. + */ - case RELKIND_INDEX: + /* it has storage, ok to call the smgr */ + curpages = RelationGetNumberOfBlocks(rel); - /* - * XXX: It'd probably be good to move this into a callback, - * individual index types e.g. know if they have a metapage. - */ + /* report estimated # pages */ + *pages = curpages; + /* quick exit if rel is clearly empty */ + if (curpages == 0) + { + *tuples = 0; + *allvisfrac = 0; + return; + } - /* it has storage, ok to call the smgr */ - curpages = RelationGetNumberOfBlocks(rel); + /* coerce values in pg_class to more desirable types */ + relpages = (BlockNumber) rel->rd_rel->relpages; + reltuples = (double) rel->rd_rel->reltuples; + relallvisible = (BlockNumber) rel->rd_rel->relallvisible; - /* report estimated # pages */ - *pages = curpages; - /* quick exit if rel is clearly empty */ - if (curpages == 0) - { - *tuples = 0; - *allvisfrac = 0; - break; - } - - /* coerce values in pg_class to more desirable types */ - relpages = (BlockNumber) rel->rd_rel->relpages; - reltuples = (double) rel->rd_rel->reltuples; - relallvisible = (BlockNumber) rel->rd_rel->relallvisible; + /* + * Discount the metapage while estimating the number of tuples. This + * is a kluge because it assumes more than it ought to about index + * structure. Currently it's OK for btree, hash, and GIN indexes but + * suspect for GiST indexes. + */ + if (relpages > 0) + { + curpages--; + relpages--; + } + /* estimate number of tuples from previous tuple density */ + if (reltuples >= 0 && relpages > 0) + density = reltuples / (double) relpages; + else + { /* - * Discount the metapage while estimating the number of tuples. - * This is a kluge because it assumes more than it ought to about - * index structure. Currently it's OK for btree, hash, and GIN - * indexes but suspect for GiST indexes. + * If we have no data because the relation was never vacuumed, + * estimate tuple width from attribute datatypes. We assume here + * that the pages are completely full, which is OK for tables + * (since they've presumably not been VACUUMed yet) but is + * probably an overestimate for indexes. Fortunately + * get_relation_info() can clamp the overestimate to the parent + * table's size. + * + * Note: this code intentionally disregards alignment + * considerations, because (a) that would be gilding the lily + * considering how crude the estimate is, and (b) it creates + * platform dependencies in the default plans which are kind of a + * headache for regression testing. + * + * XXX: Should this logic be more index specific? */ - if (relpages > 0) - { - curpages--; - relpages--; - } - - /* estimate number of tuples from previous tuple density */ - if (reltuples >= 0 && relpages > 0) - density = reltuples / (double) relpages; - else - { - /* - * If we have no data because the relation was never vacuumed, - * estimate tuple width from attribute datatypes. We assume - * here that the pages are completely full, which is OK for - * tables (since they've presumably not been VACUUMed yet) but - * is probably an overestimate for indexes. Fortunately - * get_relation_info() can clamp the overestimate to the - * parent table's size. - * - * Note: this code intentionally disregards alignment - * considerations, because (a) that would be gilding the lily - * considering how crude the estimate is, and (b) it creates - * platform dependencies in the default plans which are kind - * of a headache for regression testing. - * - * XXX: Should this logic be more index specific? - */ - int32 tuple_width; + int32 tuple_width; - tuple_width = get_rel_data_width(rel, attr_widths); - tuple_width += MAXALIGN(SizeofHeapTupleHeader); - tuple_width += sizeof(ItemIdData); - /* note: integer division is intentional here */ - density = (BLCKSZ - SizeOfPageHeaderData) / tuple_width; - } - *tuples = rint(density * (double) curpages); - - /* - * We use relallvisible as-is, rather than scaling it up like we - * do for the pages and tuples counts, on the theory that any - * pages added since the last VACUUM are most likely not marked - * all-visible. But costsize.c wants it converted to a fraction. - */ - if (relallvisible == 0 || curpages <= 0) - *allvisfrac = 0; - else if ((double) relallvisible >= curpages) - *allvisfrac = 1; - else - *allvisfrac = (double) relallvisible / curpages; - break; + tuple_width = get_rel_data_width(rel, attr_widths); + tuple_width += MAXALIGN(SizeofHeapTupleHeader); + tuple_width += sizeof(ItemIdData); + /* note: integer division is intentional here */ + density = (BLCKSZ - SizeOfPageHeaderData) / tuple_width; + } + *tuples = rint(density * (double) curpages); - case RELKIND_SEQUENCE: - /* Sequences always have a known size */ - *pages = 1; - *tuples = 1; - *allvisfrac = 0; - break; - case RELKIND_FOREIGN_TABLE: - /* Just use whatever's in pg_class */ - /* Note that FDW must cope if reltuples is -1! */ - *pages = rel->rd_rel->relpages; - *tuples = rel->rd_rel->reltuples; - *allvisfrac = 0; - break; - default: - /* else it has no disk storage; probably shouldn't get here? */ - *pages = 0; - *tuples = 0; + /* + * We use relallvisible as-is, rather than scaling it up like we do + * for the pages and tuples counts, on the theory that any pages added + * since the last VACUUM are most likely not marked all-visible. But + * costsize.c wants it converted to a fraction. + */ + if (relallvisible == 0 || curpages <= 0) *allvisfrac = 0; - break; + else if ((double) relallvisible >= curpages) + *allvisfrac = 1; + else + *allvisfrac = (double) relallvisible / curpages; + } + else + { + /* + * Just use whatever's in pg_class. This covers foreign tables, + * sequences, and also relkinds without storage (shouldn't get here?); + * see initializations in AddNewRelationTuple(). Note that FDW must + * cope if reltuples is -1! + */ + *pages = rel->rd_rel->relpages; + *tuples = rel->rd_rel->reltuples; + *allvisfrac = 0; } } @@ -1308,6 +1298,87 @@ get_relation_constraints(PlannerInfo *root, return result; } +/* + * Try loading data for the statistics object. + * + * We don't know if the data (specified by statOid and inh value) exist. + * The result is stored in stainfos list. + */ +static void +get_relation_statistics_worker(List **stainfos, RelOptInfo *rel, + Oid statOid, bool inh, + Bitmapset *keys, List *exprs) +{ + Form_pg_statistic_ext_data dataForm; + HeapTuple dtup; + + dtup = SearchSysCache2(STATEXTDATASTXOID, + ObjectIdGetDatum(statOid), BoolGetDatum(inh)); + if (!HeapTupleIsValid(dtup)) + return; + + dataForm = (Form_pg_statistic_ext_data) GETSTRUCT(dtup); + + /* add one StatisticExtInfo for each kind built */ + if (statext_is_kind_built(dtup, STATS_EXT_NDISTINCT)) + { + StatisticExtInfo *info = makeNode(StatisticExtInfo); + + info->statOid = statOid; + info->inherit = dataForm->stxdinherit; + info->rel = rel; + info->kind = STATS_EXT_NDISTINCT; + info->keys = bms_copy(keys); + info->exprs = exprs; + + *stainfos = lappend(*stainfos, info); + } + + if (statext_is_kind_built(dtup, STATS_EXT_DEPENDENCIES)) + { + StatisticExtInfo *info = makeNode(StatisticExtInfo); + + info->statOid = statOid; + info->inherit = dataForm->stxdinherit; + info->rel = rel; + info->kind = STATS_EXT_DEPENDENCIES; + info->keys = bms_copy(keys); + info->exprs = exprs; + + *stainfos = lappend(*stainfos, info); + } + + if (statext_is_kind_built(dtup, STATS_EXT_MCV)) + { + StatisticExtInfo *info = makeNode(StatisticExtInfo); + + info->statOid = statOid; + info->inherit = dataForm->stxdinherit; + info->rel = rel; + info->kind = STATS_EXT_MCV; + info->keys = bms_copy(keys); + info->exprs = exprs; + + *stainfos = lappend(*stainfos, info); + } + + if (statext_is_kind_built(dtup, STATS_EXT_EXPRESSIONS)) + { + StatisticExtInfo *info = makeNode(StatisticExtInfo); + + info->statOid = statOid; + info->inherit = dataForm->stxdinherit; + info->rel = rel; + info->kind = STATS_EXT_EXPRESSIONS; + info->keys = bms_copy(keys); + info->exprs = exprs; + + *stainfos = lappend(*stainfos, info); + } + + ReleaseSysCache(dtup); +} + /* * get_relation_statistics * Retrieve extended statistics defined on the table. @@ -1331,7 +1402,6 @@ get_relation_statistics(RelOptInfo *rel, Relation relation) Oid statOid = lfirst_oid(l); Form_pg_statistic_ext staForm; HeapTuple htup; - HeapTuple dtup; Bitmapset *keys = NULL; List *exprs = NIL; int i; @@ -1341,10 +1411,6 @@ get_relation_statistics(RelOptInfo *rel, Relation relation) elog(ERROR, "cache lookup failed for statistics object %u", statOid); staForm = (Form_pg_statistic_ext) GETSTRUCT(htup); - dtup = SearchSysCache1(STATEXTDATASTXOID, ObjectIdGetDatum(statOid)); - if (!HeapTupleIsValid(dtup)) - elog(ERROR, "cache lookup failed for statistics object %u", statOid); - /* * First, build the array of columns covered. This is ultimately * wasted if no stats within the object have actually been built, but @@ -1356,6 +1422,11 @@ get_relation_statistics(RelOptInfo *rel, Relation relation) /* * Preprocess expressions (if any). We read the expressions, run them * through eval_const_expressions, and fix the varnos. + * + * XXX We don't know yet if there are any data for this stats object, + * with either stxdinherit value. But it's reasonable to assume there + * is at least one of those, possibly both. So it's better to process + * keys and expressions here. */ { bool isnull; @@ -1396,61 +1467,13 @@ get_relation_statistics(RelOptInfo *rel, Relation relation) } } - /* add one StatisticExtInfo for each kind built */ - if (statext_is_kind_built(dtup, STATS_EXT_NDISTINCT)) - { - StatisticExtInfo *info = makeNode(StatisticExtInfo); - - info->statOid = statOid; - info->rel = rel; - info->kind = STATS_EXT_NDISTINCT; - info->keys = bms_copy(keys); - info->exprs = exprs; - - stainfos = lappend(stainfos, info); - } - - if (statext_is_kind_built(dtup, STATS_EXT_DEPENDENCIES)) - { - StatisticExtInfo *info = makeNode(StatisticExtInfo); + /* extract statistics for possible values of stxdinherit flag */ - info->statOid = statOid; - info->rel = rel; - info->kind = STATS_EXT_DEPENDENCIES; - info->keys = bms_copy(keys); - info->exprs = exprs; + get_relation_statistics_worker(&stainfos, rel, statOid, true, keys, exprs); - stainfos = lappend(stainfos, info); - } - - if (statext_is_kind_built(dtup, STATS_EXT_MCV)) - { - StatisticExtInfo *info = makeNode(StatisticExtInfo); - - info->statOid = statOid; - info->rel = rel; - info->kind = STATS_EXT_MCV; - info->keys = bms_copy(keys); - info->exprs = exprs; - - stainfos = lappend(stainfos, info); - } - - if (statext_is_kind_built(dtup, STATS_EXT_EXPRESSIONS)) - { - StatisticExtInfo *info = makeNode(StatisticExtInfo); - - info->statOid = statOid; - info->rel = rel; - info->kind = STATS_EXT_EXPRESSIONS; - info->keys = bms_copy(keys); - info->exprs = exprs; - - stainfos = lappend(stainfos, info); - } + get_relation_statistics_worker(&stainfos, rel, statOid, false, keys, exprs); ReleaseSysCache(htup); - ReleaseSysCache(dtup); bms_free(keys); } @@ -2165,6 +2188,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/third_party/spanner_pg/src/backend/optimizer/util/predtest.c b/third_party/spanner_pg/src/backend/optimizer/util/predtest.c index 7d492707..ec8477f8 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/predtest.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/predtest.c @@ -4,7 +4,7 @@ * Routines to attempt to prove logical implications between predicate * expressions. * - * 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/third_party/spanner_pg/src/backend/optimizer/util/relnode.c b/third_party/spanner_pg/src/backend/optimizer/util/relnode.c index e105a4d5..3c75fd56 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/relnode.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/relnode.c @@ -3,7 +3,7 @@ * relnode.c * Relation-node lookup/construction routines * - * 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 * * @@ -255,6 +255,7 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent) rel->partbounds_merged = false; rel->partition_qual = NIL; rel->part_rels = NULL; + rel->live_parts = NULL; rel->all_partrels = NULL; rel->partexprs = NULL; rel->nullable_partexprs = NULL; @@ -669,6 +670,7 @@ build_join_rel(PlannerInfo *root, joinrel->partbounds_merged = false; joinrel->partition_qual = NIL; joinrel->part_rels = NULL; + joinrel->live_parts = NULL; joinrel->all_partrels = NULL; joinrel->partexprs = NULL; joinrel->nullable_partexprs = NULL; @@ -847,6 +849,7 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, joinrel->partbounds_merged = false; joinrel->partition_qual = NIL; joinrel->part_rels = NULL; + joinrel->live_parts = NULL; joinrel->all_partrels = NULL; joinrel->partexprs = NULL; joinrel->nullable_partexprs = NULL; @@ -996,7 +999,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, if (var->varno == ROWID_VAR) { - /* UPDATE/DELETE row identity vars are always needed */ + /* UPDATE/DELETE/MERGE row identity vars are always needed */ RowIdentityVarInfo *ridinfo = (RowIdentityVarInfo *) list_nth(root->row_identity_vars, var->varattno - 1); diff --git a/third_party/spanner_pg/src/backend/optimizer/util/restrictinfo.c b/third_party/spanner_pg/src/backend/optimizer/util/restrictinfo.c index 2fd29ed3..e7764f43 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/restrictinfo.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/restrictinfo.c @@ -3,7 +3,7 @@ * restrictinfo.c * RestrictInfo node manipulation routines. * - * 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 * * @@ -217,7 +217,8 @@ make_restrictinfo_internal(PlannerInfo *root, restrictinfo->left_mcvfreq = -1; restrictinfo->right_mcvfreq = -1; - restrictinfo->hasheqoperator = InvalidOid; + restrictinfo->left_hasheqoperator = InvalidOid; + restrictinfo->right_hasheqoperator = InvalidOid; return restrictinfo; } @@ -368,7 +369,8 @@ commute_restrictinfo(RestrictInfo *rinfo, Oid comm_op) result->right_bucketsize = rinfo->left_bucketsize; result->left_mcvfreq = rinfo->right_mcvfreq; result->right_mcvfreq = rinfo->left_mcvfreq; - result->hasheqoperator = InvalidOid; + result->left_hasheqoperator = InvalidOid; + result->right_hasheqoperator = InvalidOid; return result; } diff --git a/third_party/spanner_pg/src/backend/optimizer/util/tlist.c b/third_party/spanner_pg/src/backend/optimizer/util/tlist.c index 98f008ba..eed3e3fb 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/tlist.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/tlist.c @@ -3,7 +3,7 @@ * tlist.c * Target list manipulation routines * - * 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/third_party/spanner_pg/src/backend/optimizer/util/var.c b/third_party/spanner_pg/src/backend/optimizer/util/var.c index cdc5c5c1..ebc6ce84 100644 --- a/third_party/spanner_pg/src/backend/optimizer/util/var.c +++ b/third_party/spanner_pg/src/backend/optimizer/util/var.c @@ -9,7 +9,7 @@ * contains variables. * * - * 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 * * @@ -88,6 +88,9 @@ static Relids alias_relid_set(Query *query, Relids relids); * Create a set of all the distinct varnos present in a parsetree. * Only varnos that reference level-zero rtable entries are considered. * + * "root" can be passed as NULL if it is not necessary to process + * PlaceHolderVars. + * * NOTE: this is used on not-yet-planned expressions. It may therefore find * bare SubLinks, and if so it needs to recurse into them to look for uplevel * references to the desired rtable level! But when we find a completed @@ -168,9 +171,13 @@ pull_varnos_walker(Node *node, pull_varnos_context *context) /* * If a PlaceHolderVar is not of the target query level, ignore it, * instead recursing into its expression to see if it contains any - * vars that are of the target level. + * vars that are of the target level. We'll also do that when the + * caller doesn't pass a "root" pointer. (We probably shouldn't see + * PlaceHolderVars at all in such cases, but if we do, this is a + * reasonable behavior.) */ - if (phv->phlevelsup == context->sublevels_up) + if (phv->phlevelsup == context->sublevels_up && + context->root != NULL) { /* * Ideally, the PHV's contribution to context->varnos is its @@ -793,6 +800,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/third_party/spanner_pg/src/backend/parser/BUILD b/third_party/spanner_pg/src/backend/parser/BUILD index 992d63eb..32fe3207 100644 --- a/third_party/spanner_pg/src/backend/parser/BUILD +++ b/third_party/spanner_pg/src/backend/parser/BUILD @@ -62,6 +62,7 @@ cc_library( "parse_enr.c", "parse_expr.c", "parse_func.c", + "parse_merge.c", "parse_node.c", "parse_oper.c", "parse_param.c", diff --git a/third_party/spanner_pg/src/backend/parser/Makefile b/third_party/spanner_pg/src/backend/parser/Makefile index 5ddb9a92..9f1c4022 100644 --- a/third_party/spanner_pg/src/backend/parser/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/backend/parser/analyze.c b/third_party/spanner_pg/src/backend/parser/analyze.c index 3d24060f..89438f2d 100644 --- a/third_party/spanner_pg/src/backend/parser/analyze.c +++ b/third_party/spanner_pg/src/backend/parser/analyze.c @@ -14,7 +14,7 @@ * contain optimizable statements, which we should transform. * * - * 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 * * 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" @@ -62,9 +63,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_UNUSED_SPANGRES(ParseState *pstate, OnConflictClause *onConflictClause); static int count_rowexpr_columns(ParseState *pstate, Node *expr); @@ -78,8 +76,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_UNUSED_SPANGRES(ParseState *pstate, - List *targetList); static Query *transformPLAssignStmt(ParseState *pstate, PLAssignStmt *stmt); static Query *transformDeclareCursorStmt(ParseState *pstate, @@ -98,7 +94,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. @@ -109,9 +105,9 @@ 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, - QueryEnvironment *queryEnv) +parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, + const Oid *paramTypes, int numParams, + QueryEnvironment *queryEnv) { ParseState *pstate = make_parsestate(NULL); Query *query; @@ -122,7 +118,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; @@ -150,7 +146,8 @@ parse_analyze(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,7 +157,9 @@ 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); + + pstate->p_queryEnv = queryEnv; query = transformTopLevelStmt(pstate, parseTree); @@ -180,6 +179,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. @@ -299,6 +336,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: @@ -328,6 +366,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; @@ -420,6 +462,7 @@ stmt_requires_parse_analysis(RawStmt *parseTree) case T_InsertStmt: case T_DeleteStmt: case T_UpdateStmt: + case T_MergeStmt: case T_SelectStmt: case T_ReturnStmt: case T_PLAssignStmt: @@ -974,7 +1017,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) @@ -1606,7 +1649,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 @@ -2093,8 +2136,8 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt, ListCell *ltl; ListCell *rtl; const char *context; - bool recursive = (pstate->p_parent_cte && - pstate->p_parent_cte->cterecursive); + bool recursive = (pstate->p_parent_cte && + pstate->p_parent_cte->cterecursive); context = (stmt->op == SETOP_UNION ? "UNION" : (stmt->op == SETOP_INTERSECT ? "INTERSECT" : @@ -2248,7 +2291,10 @@ transformSetOperationTree(ParseState *pstate, SelectStmt *stmt, setup_parser_errposition_callback(&pcbstate, pstate, bestlocation); - /* If it's a recursive union, we need to require hashing support. */ + /* + * If it's a recursive union, we need to require hashing + * support. + */ op->groupClauses = lappend(op->groupClauses, makeSortGroupClauseForSetOp(rescoltype, recursive)); @@ -2431,10 +2477,10 @@ 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 */ #ifdef UNDEFINED_SPANGRES_CARVEOUT -static List * +List * transformUpdateTargetList_UNUSED_SPANGRES(ParseState *pstate, List *origTlist) { List *tlist = NIL; diff --git a/third_party/spanner_pg/src/backend/parser/check_keywords.pl b/third_party/spanner_pg/src/backend/parser/check_keywords.pl old mode 100644 new mode 100755 index 598f3d20..baab6241 --- a/third_party/spanner_pg/src/backend/parser/check_keywords.pl +++ b/third_party/spanner_pg/src/backend/parser/check_keywords.pl @@ -4,7 +4,7 @@ # Usage: check_keywords.pl gram.y kwlist.h # src/backend/parser/check_keywords.pl -# Copyright (c) 2009-2021, PostgreSQL Global Development Group +# Copyright (c) 2009-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/backend/parser/gram.y b/third_party/spanner_pg/src/backend/parser/gram.y index 1d3113eb..654e36de 100644 --- a/third_party/spanner_pg/src/backend/parser/gram.y +++ b/third_party/spanner_pg/src/backend/parser/gram.y @@ -6,7 +6,7 @@ * gram.y * POSTGRESQL BISON rules/actions * - * 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 * * @@ -129,18 +129,31 @@ typedef struct ImportQual /* Private struct for the result of opt_select_limit production */ typedef struct SelectLimit { - Node *limitOffset; - Node *limitCount; + Node *limitOffset; + Node *limitCount; LimitOption limitOption; } SelectLimit; /* Private struct for the result of group_clause production */ typedef struct GroupClause { - bool distinct; - List *list; + bool distinct; + List *list; } GroupClause; +/* Private structs for the result of key_actions and key_action productions */ +typedef struct KeyAction +{ + char action; + List *cols; +} KeyAction; + +typedef struct KeyActions +{ + KeyAction *updateAction; + KeyAction *deleteAction; +} KeyActions; + /* ConstraintAttributeSpec yields an integer bitmask of these flags: */ #define CAS_NOT_DEFERRABLE 0x01 #define CAS_DEFERRABLE 0x02 @@ -166,10 +179,10 @@ static Node *makeStringConstCast(char *str, int location, TypeName *typename, core_yyscan_t yyscanner); static Node *makeIntConst(int val, int location); static Node *makeFloatConst(char *str, int location); +static Node *makeBoolAConst(bool state, int location, core_yyscan_t yyscanner); static Node *makeBitStringConst(char *str, int location); static Node *makeNullAConst(int location); -static Node *makeAConst(Value *v, int location); -static Node *makeBoolAConst(bool state, int location, core_yyscan_t yyscanner); +static Node *makeAConst(Node *v, int location); static RoleSpec *makeRoleSpec(RoleSpecType type, int location); static void check_qualified_name(List *names, core_yyscan_t yyscanner); static List *check_func_name(List *names, core_yyscan_t yyscanner); @@ -185,7 +198,7 @@ static void insertSelectOptions(SelectStmt *stmt, core_yyscan_t yyscanner); static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg); static Node *doNegate(Node *n, int location); -static void doNegateFloat(Value *v); +static void doNegateFloat(Float *v); static Node *makeAndExpr(Node *lexpr, Node *rexpr, int location); static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location); static Node *makeNotExpr(Node *expr, int location); @@ -197,12 +210,17 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, static List *mergeTableFuncParameters(List *func_args, List *columns); static TypeName *TableFuncTypeName(List *columns); static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner); +static RangeVar *makeRangeVarFromQualifiedName(char *name, List *rels, + int location, + core_yyscan_t yyscanner); static void SplitColQualList(List *qualList, List **constraintList, CollateClause **collClause, core_yyscan_t yyscanner); static void processCASbits(int cas_bits, int location, const char *constrType, bool *deferrable, bool *initdeferred, bool *not_valid, bool *no_inherit, core_yyscan_t yyscanner); +static void preprocess_pubobj_list(List *pubobjspec_list, + core_yyscan_t yyscanner); static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); /* BEGIN SPANGRES ADDED FUNCTIONS */ static void incrementOperatorCount(int position, core_yyscan_t yyscanner); @@ -221,53 +239,56 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %union { - core_YYSTYPE core_yystype; + core_YYSTYPE core_yystype; /* these fields must match core_YYSTYPE: */ - int ival; - char *str; - const char *keyword; - - char chr; - bool boolean; - JoinType jtype; - DropBehavior dbehavior; - OnCommitAction oncommit; - List *list; - Node *node; - Value *value; - ObjectType objtype; - TypeName *typnam; - FunctionParameter *fun_param; + int ival; + char *str; + const char *keyword; + + char chr; + bool boolean; + JoinType jtype; + DropBehavior dbehavior; + OnCommitAction oncommit; + List *list; + Node *node; + ObjectType objtype; + TypeName *typnam; + FunctionParameter *fun_param; FunctionParameterMode fun_param_mode; - ObjectWithArgs *objwithargs; - DefElem *defelt; - SortBy *sortby; - WindowDef *windef; - JoinExpr *jexpr; - IndexElem *ielem; - StatsElem *selem; - Alias *alias; - RangeVar *range; - IntoClause *into; - WithClause *with; - InferClause *infer; - OnConflictClause *onconflict; - A_Indices *aind; - ResTarget *target; - struct PrivTarget *privtarget; - AccessPriv *accesspriv; - struct ImportQual *importqual; - InsertStmt *istmt; - VariableSetStmt *vsetstmt; - PartitionElem *partelem; - PartitionSpec *partspec; - PartitionBoundSpec *partboundspec; - RoleSpec *rolespec; - struct SelectLimit *selectlimit; - SetQuantifier setquantifier; - struct GroupClause *groupclause; - GeneratedColStoreOpt generatedcolstoreopt; + ObjectWithArgs *objwithargs; + DefElem *defelt; + SortBy *sortby; + WindowDef *windef; + JoinExpr *jexpr; + IndexElem *ielem; + StatsElem *selem; + Alias *alias; + RangeVar *range; + IntoClause *into; + WithClause *with; + InferClause *infer; + OnConflictClause *onconflict; + A_Indices *aind; + ResTarget *target; + struct PrivTarget *privtarget; + AccessPriv *accesspriv; + struct ImportQual *importqual; + InsertStmt *istmt; + VariableSetStmt *vsetstmt; + PartitionElem *partelem; + PartitionSpec *partspec; + PartitionBoundSpec *partboundspec; + RoleSpec *rolespec; + PublicationObjSpec *publicationobjectspec; + struct SelectLimit *selectlimit; + SetQuantifier setquantifier; + struct GroupClause *groupclause; + MergeWhenClause *mergewhen; + struct KeyActions *keyactions; + struct KeyAction *keyaction; + GeneratedColStoreOpt generatedcolstoreopt; InterleaveSpec *interleavespec; Ttl *ttlopt; } @@ -297,7 +318,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); 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 RenameTableStmts ReturnStmt RevokeStmt RevokeRoleStmt RuleActionStmt RuleActionStmtOrEmpty RuleStmt @@ -356,15 +377,15 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %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 %type TriggerForSpec TriggerForType %type TriggerActionTime %type TriggerEvents TriggerOneEvent -%type TriggerFuncArg +%type TriggerFuncArg %type TriggerWhen %type TransitionRelName %type TransitionRowOrTable TransitionOldOrNew @@ -426,6 +447,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); 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 @@ -439,14 +461,13 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); transform_element_list transform_type_list TriggerTransitions TriggerReferencing vacuum_relation_list opt_vacuum_relation_list - drop_option_list + drop_option_list pub_obj_list %type opt_routine_body %type group_clause %type group_by_list %type group_by_item empty_grouping_set rollup_clause cube_clause %type grouping_sets_clause -%type opt_publication_for_tables publication_for_tables %type opt_fdw_options fdw_options %type fdw_option @@ -500,6 +521,10 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %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 @@ -522,7 +547,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type when_clause_list %type opt_search_clause opt_cycle_clause %type sub_type opt_materialized -%type NumericOnly +%type NumericOnly %type NumericOnly_list %type alias_clause opt_alias_clause opt_alias_clause_for_join_using %type func_alias_clause @@ -532,6 +557,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type table_ref %type joined_table %type relation_expr +%type extended_relation_expr %type relation_expr_opt_alias %type tablesample_clause opt_repeatable_clause %type target_el set_target insert_column_item @@ -568,6 +594,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type createdb_opt_name plassign_target %type var_value zone_value %type auth_ident RoleSpec opt_granted_by +%type PublicationObjSpec %type unreserved_keyword type_func_name_keyword %type col_name_keyword reserved_keyword @@ -578,7 +605,9 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type column_compression opt_column_compression %type ColQualList %type ColConstraint ColConstraintElem ConstraintAttr -%type key_actions key_delete key_match key_update key_action +%type key_match +%type key_delete key_update key_action +%type key_actions %type ConstraintAttributeSpec ConstraintAttributeElem %type ExistingIndex @@ -616,6 +645,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type opt_window_exclusion_clause %type opt_existing_window_name %type opt_if_not_exists +%type opt_unique_null_treatment %type generated_when override_kind %type stored_kind %type PartitionSpec OptPartitionSpec @@ -625,7 +655,7 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); %type hash_partbound %type hash_partbound_elem %type OptInterleave OptInterleaveIndex -%type interleave_action +%type interleave_action %type OptTtl %type opt_change_stream_for_tables @@ -705,7 +735,8 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); LEADING LEAKPROOF LEAST LEFT LENGTH 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 @@ -716,7 +747,9 @@ static void incrementTypeCastCount(int position, core_yyscan_t yyscanner); ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER - PARALLEL PARENT PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POLICY + PARALLEL PARAMETER PARENT PARSER PARTIAL PARTITION PASSING PASSWORD + PLACING + PLANS POLICY POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION @@ -874,6 +907,7 @@ parse_toplevel: | MODE_PLPGSQL_ASSIGN1 PLAssignStmt { PLAssignStmt *n = (PLAssignStmt *) $2; + n->nnames = 1; pg_yyget_extra(yyscanner)->parsetree = list_make1(makeRawStmt((Node *) n, 0)); @@ -881,6 +915,7 @@ parse_toplevel: | MODE_PLPGSQL_ASSIGN2 PLAssignStmt { PLAssignStmt *n = (PLAssignStmt *) $2; + n->nnames = 2; pg_yyget_extra(yyscanner)->parsetree = list_make1(makeRawStmt((Node *) n, 0)); @@ -888,6 +923,7 @@ parse_toplevel: | MODE_PLPGSQL_ASSIGN3 PLAssignStmt { PLAssignStmt *n = (PLAssignStmt *) $2; + n->nnames = 3; pg_yyget_extra(yyscanner)->parsetree = list_make1(makeRawStmt((Node *) n, 0)); @@ -1042,6 +1078,7 @@ stmt: | RefreshMatViewStmt | LoadStmt | LockStmt + | MergeStmt | NotifyStmt | PrepareStmt | ReassignOwnedStmt @@ -1077,9 +1114,10 @@ stmt: CallStmt: CALL func_application { - CallStmt *n = makeNode(CallStmt); + CallStmt *n = makeNode(CallStmt); + n->funccall = castNode(FuncCall, $2); - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1093,10 +1131,11 @@ CreateRoleStmt: CREATE ROLE RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); + n->stmt_type = ROLESTMT_ROLE; n->role = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1125,7 +1164,7 @@ AlterOptRoleElem: PASSWORD Sconst { $$ = makeDefElem("password", - (Node *)makeString($2), @1); + (Node *) makeString($2), @1); } | PASSWORD NULL_P { @@ -1139,7 +1178,7 @@ AlterOptRoleElem: * ENCRYPTED PASSWORD. */ $$ = makeDefElem("password", - (Node *)makeString($3), @1); + (Node *) makeString($3), @1); } | UNENCRYPTED PASSWORD Sconst { @@ -1151,20 +1190,20 @@ AlterOptRoleElem: } | INHERIT { - $$ = makeDefElem("inherit", (Node *)makeInteger(true), @1); + $$ = makeDefElem("inherit", (Node *) makeBoolean(true), @1); } | CONNECTION LIMIT SignedIconst { - $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3), @1); + $$ = makeDefElem("connectionlimit", (Node *) makeInteger($3), @1); } | VALID UNTIL Sconst { - $$ = makeDefElem("validUntil", (Node *)makeString($3), @1); + $$ = makeDefElem("validUntil", (Node *) makeString($3), @1); } /* Supported but not documented for roles, for use by ALTER GROUP. */ | USER role_list { - $$ = makeDefElem("rolemembers", (Node *)$2, @1); + $$ = makeDefElem("rolemembers", (Node *) $2, @1); } | IDENT { @@ -1174,36 +1213,36 @@ AlterOptRoleElem: * size of the main parser. */ if (strcmp($1, "superuser") == 0) - $$ = makeDefElem("superuser", (Node *)makeInteger(true), @1); + $$ = makeDefElem("superuser", (Node *) makeBoolean(true), @1); else if (strcmp($1, "nosuperuser") == 0) - $$ = makeDefElem("superuser", (Node *)makeInteger(false), @1); + $$ = makeDefElem("superuser", (Node *) makeBoolean(false), @1); else if (strcmp($1, "createrole") == 0) - $$ = makeDefElem("createrole", (Node *)makeInteger(true), @1); + $$ = makeDefElem("createrole", (Node *) makeBoolean(true), @1); else if (strcmp($1, "nocreaterole") == 0) - $$ = makeDefElem("createrole", (Node *)makeInteger(false), @1); + $$ = makeDefElem("createrole", (Node *) makeBoolean(false), @1); else if (strcmp($1, "replication") == 0) - $$ = makeDefElem("isreplication", (Node *)makeInteger(true), @1); + $$ = makeDefElem("isreplication", (Node *) makeBoolean(true), @1); else if (strcmp($1, "noreplication") == 0) - $$ = makeDefElem("isreplication", (Node *)makeInteger(false), @1); + $$ = makeDefElem("isreplication", (Node *) makeBoolean(false), @1); else if (strcmp($1, "createdb") == 0) - $$ = makeDefElem("createdb", (Node *)makeInteger(true), @1); + $$ = makeDefElem("createdb", (Node *) makeBoolean(true), @1); else if (strcmp($1, "nocreatedb") == 0) - $$ = makeDefElem("createdb", (Node *)makeInteger(false), @1); + $$ = makeDefElem("createdb", (Node *) makeBoolean(false), @1); else if (strcmp($1, "login") == 0) - $$ = makeDefElem("canlogin", (Node *)makeInteger(true), @1); + $$ = makeDefElem("canlogin", (Node *) makeBoolean(true), @1); else if (strcmp($1, "nologin") == 0) - $$ = makeDefElem("canlogin", (Node *)makeInteger(false), @1); + $$ = makeDefElem("canlogin", (Node *) makeBoolean(false), @1); else if (strcmp($1, "bypassrls") == 0) - $$ = makeDefElem("bypassrls", (Node *)makeInteger(true), @1); + $$ = makeDefElem("bypassrls", (Node *) makeBoolean(true), @1); else if (strcmp($1, "nobypassrls") == 0) - $$ = makeDefElem("bypassrls", (Node *)makeInteger(false), @1); + $$ = makeDefElem("bypassrls", (Node *) makeBoolean(false), @1); else if (strcmp($1, "noinherit") == 0) { /* * Note that INHERIT is a keyword, so it's handled by main parser, but * NOINHERIT is handled here. */ - $$ = makeDefElem("inherit", (Node *)makeInteger(false), @1); + $$ = makeDefElem("inherit", (Node *) makeBoolean(false), @1); } else ereport(ERROR, @@ -1218,23 +1257,23 @@ CreateOptRoleElem: /* The following are not supported by ALTER ROLE/USER/GROUP */ | SYSID Iconst { - $$ = makeDefElem("sysid", (Node *)makeInteger($2), @1); + $$ = makeDefElem("sysid", (Node *) makeInteger($2), @1); } | ADMIN role_list { - $$ = makeDefElem("adminmembers", (Node *)$2, @1); + $$ = makeDefElem("adminmembers", (Node *) $2, @1); } | ROLE role_list { - $$ = makeDefElem("rolemembers", (Node *)$2, @1); + $$ = makeDefElem("rolemembers", (Node *) $2, @1); } | IN_P ROLE role_list { - $$ = makeDefElem("addroleto", (Node *)$3, @1); + $$ = makeDefElem("addroleto", (Node *) $3, @1); } | IN_P GROUP_P role_list { - $$ = makeDefElem("addroleto", (Node *)$3, @1); + $$ = makeDefElem("addroleto", (Node *) $3, @1); } ; @@ -1249,10 +1288,11 @@ CreateUserStmt: CREATE USER RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); + n->stmt_type = ROLESTMT_USER; n->role = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1267,18 +1307,20 @@ AlterRoleStmt: ALTER ROLE RoleSpec opt_with AlterOptRoleList { AlterRoleStmt *n = makeNode(AlterRoleStmt); + n->role = $3; n->action = +1; /* add, if there are members */ n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER USER RoleSpec opt_with AlterOptRoleList { AlterRoleStmt *n = makeNode(AlterRoleStmt); + n->role = $3; n->action = +1; /* add, if there are members */ n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1291,34 +1333,38 @@ AlterRoleSetStmt: ALTER ROLE RoleSpec opt_in_database SetResetClause { AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt); + n->role = $3; n->database = $4; n->setstmt = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROLE ALL opt_in_database SetResetClause { AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt); + n->role = NULL; n->database = $4; n->setstmt = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER USER RoleSpec opt_in_database SetResetClause { AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt); + n->role = $3; n->database = $4; n->setstmt = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER USER ALL opt_in_database SetResetClause { AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt); + n->role = NULL; n->database = $4; n->setstmt = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1336,44 +1382,50 @@ DropRoleStmt: DROP ROLE role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->missing_ok = false; n->roles = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP ROLE IF_P EXISTS role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->missing_ok = true; n->roles = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP USER role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->missing_ok = false; n->roles = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP USER IF_P EXISTS role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->roles = $5; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP GROUP_P role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->missing_ok = false; n->roles = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP GROUP_P IF_P EXISTS role_list { DropRoleStmt *n = makeNode(DropRoleStmt); + n->missing_ok = true; n->roles = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1388,10 +1440,11 @@ CreateGroupStmt: CREATE GROUP_P RoleId opt_with OptRoleList { CreateRoleStmt *n = makeNode(CreateRoleStmt); + n->stmt_type = ROLESTMT_GROUP; n->role = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1406,11 +1459,12 @@ AlterGroupStmt: ALTER GROUP_P RoleSpec add_drop USER role_list { AlterRoleStmt *n = makeNode(AlterRoleStmt); + n->role = $3; n->action = $4; n->options = list_make1(makeDefElem("rolemembers", - (Node *)$6, @6)); - $$ = (Node *)n; + (Node *) $6, @6)); + $$ = (Node *) n; } ; @@ -1429,26 +1483,29 @@ CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION RoleSpec OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); + /* One can omit the schema name or the authorization id. */ n->schemaname = $3; n->authrole = $5; n->schemaElts = $6; n->if_not_exists = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE SCHEMA ColId OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); + /* ...but not both */ n->schemaname = $3; n->authrole = NULL; n->schemaElts = $4; n->if_not_exists = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE SCHEMA IF_P NOT EXISTS OptSchemaName AUTHORIZATION RoleSpec OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); + /* schema name can be omitted here, too */ n->schemaname = $6; n->authrole = $8; @@ -1459,11 +1516,12 @@ CreateSchemaStmt: parser_errposition(@9))); n->schemaElts = $9; n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList { CreateSchemaStmt *n = makeNode(CreateSchemaStmt); + /* ...but not here */ n->schemaname = $6; n->authrole = NULL; @@ -1474,7 +1532,7 @@ CreateSchemaStmt: parser_errposition(@7))); n->schemaElts = $7; n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -1521,18 +1579,21 @@ VariableSetStmt: SET set_rest { VariableSetStmt *n = $2; + n->is_local = false; $$ = (Node *) n; } | SET LOCAL set_rest { VariableSetStmt *n = $3; + n->is_local = true; $$ = (Node *) n; } | SET SESSION set_rest { VariableSetStmt *n = $3; + n->is_local = false; $$ = (Node *) n; } @@ -1542,6 +1603,7 @@ set_rest: TRANSACTION transaction_mode_list { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_MULTI; n->name = "TRANSACTION"; n->args = $2; @@ -1550,6 +1612,7 @@ set_rest: | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_MULTI; n->name = "SESSION CHARACTERISTICS"; n->args = $5; @@ -1562,6 +1625,7 @@ generic_set: var_name TO var_list { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = $1; n->args = $3; @@ -1570,6 +1634,7 @@ generic_set: | var_name '=' var_list { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = $1; n->args = $3; @@ -1578,6 +1643,7 @@ generic_set: | var_name TO DEFAULT { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_DEFAULT; n->name = $1; $$ = n; @@ -1585,6 +1651,7 @@ generic_set: | var_name '=' DEFAULT { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_DEFAULT; n->name = $1; $$ = n; @@ -1596,6 +1663,7 @@ set_rest_more: /* Generic SET syntaxes: */ | var_name FROM CURRENT_P { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_CURRENT; n->name = $1; $$ = n; @@ -1604,6 +1672,7 @@ set_rest_more: /* Generic SET syntaxes: */ | TIME ZONE zone_value { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "timezone"; if ($3 != NULL) @@ -1623,6 +1692,7 @@ set_rest_more: /* Generic SET syntaxes: */ | SCHEMA Sconst { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "search_path"; n->args = list_make1(makeStringConst($2, @2)); @@ -1631,6 +1701,7 @@ set_rest_more: /* Generic SET syntaxes: */ | NAMES opt_encoding { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "client_encoding"; if ($2 != NULL) @@ -1642,6 +1713,7 @@ set_rest_more: /* Generic SET syntaxes: */ | ROLE NonReservedWord_or_Sconst { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "role"; n->args = list_make1(makeStringConst($2, @2)); @@ -1650,6 +1722,7 @@ set_rest_more: /* Generic SET syntaxes: */ | SESSION AUTHORIZATION NonReservedWord_or_Sconst { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "session_authorization"; n->args = list_make1(makeStringConst($3, @3)); @@ -1658,6 +1731,7 @@ set_rest_more: /* Generic SET syntaxes: */ | SESSION AUTHORIZATION DEFAULT { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_DEFAULT; n->name = "session_authorization"; $$ = n; @@ -1665,6 +1739,7 @@ set_rest_more: /* Generic SET syntaxes: */ | XML_P OPTION document_or_content { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; n->name = "xmloption"; n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3)); @@ -1674,6 +1749,7 @@ set_rest_more: /* Generic SET syntaxes: */ | TRANSACTION SNAPSHOT Sconst { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_MULTI; n->name = "TRANSACTION SNAPSHOT"; n->args = list_make1(makeStringConst($3, @3)); @@ -1747,11 +1823,13 @@ zone_value: } | ConstInterval Sconst opt_interval { - TypeName *t = $1; + TypeName *t = $1; + if ($3 != NIL) { - A_Const *n = (A_Const *) linitial($3); - if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0) + A_Const *n = (A_Const *) linitial($3); + + if ((n->val.ival.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("time zone interval must be HOUR or HOUR TO MINUTE"), @@ -1762,7 +1840,8 @@ zone_value: } | ConstInterval '(' Iconst ')' Sconst { - TypeName *t = $1; + TypeName *t = $1; + t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1), makeIntConst($3, @3)); $$ = makeStringConstCast($5, @5, t, yyscanner); @@ -1792,6 +1871,7 @@ reset_rest: | TIME ZONE { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_RESET; n->name = "timezone"; $$ = n; @@ -1799,6 +1879,7 @@ reset_rest: | TRANSACTION ISOLATION LEVEL { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_RESET; n->name = "transaction_isolation"; $$ = n; @@ -1806,6 +1887,7 @@ reset_rest: | SESSION AUTHORIZATION { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_RESET; n->name = "session_authorization"; $$ = n; @@ -1816,6 +1898,7 @@ generic_reset: var_name { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_RESET; n->name = $1; $$ = n; @@ -1823,6 +1906,7 @@ generic_reset: | ALL { VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_RESET_ALL; $$ = n; } @@ -1845,30 +1929,35 @@ VariableShowStmt: SHOW var_name { VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = $2; $$ = (Node *) n; } | SHOW TIME ZONE { VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "timezone"; $$ = (Node *) n; } | SHOW TRANSACTION ISOLATION LEVEL { VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "transaction_isolation"; $$ = (Node *) n; } | SHOW SESSION AUTHORIZATION { VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "session_authorization"; $$ = (Node *) n; } | SHOW ALL { VariableShowStmt *n = makeNode(VariableShowStmt); + n->name = "all"; $$ = (Node *) n; } @@ -1879,6 +1968,7 @@ ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode { ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt); + n->constraints = $3; n->deferred = $4; $$ = (Node *) n; @@ -1903,7 +1993,8 @@ CheckPointStmt: CHECKPOINT { CheckPointStmt *n = makeNode(CheckPointStmt); - $$ = (Node *)n; + + $$ = (Node *) n; } ; @@ -1918,30 +2009,35 @@ DiscardStmt: DISCARD ALL { DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_ALL; $$ = (Node *) n; } | DISCARD TEMP { DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_TEMP; $$ = (Node *) n; } | DISCARD TEMPORARY { DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_TEMP; $$ = (Node *) n; } | DISCARD PLANS { DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_PLANS; $$ = (Node *) n; } | DISCARD SEQUENCES { DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_SEQUENCES; $$ = (Node *) n; } @@ -1961,203 +2057,224 @@ AlterTableStmt: ALTER TABLE relation_expr alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = $4; n->objtype = OBJECT_TABLE; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; n->cmds = $6; n->objtype = OBJECT_TABLE; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr partition_cmd { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = list_make1($4); n->objtype = OBJECT_TABLE; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr partition_cmd { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; n->cmds = list_make1($6); n->objtype = OBJECT_TABLE; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $6; n->objtype = OBJECT_TABLE; n->roles = NIL; n->new_tablespacename = $9; n->nowait = $10; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $6; n->objtype = OBJECT_TABLE; n->roles = $9; n->new_tablespacename = $12; n->nowait = $13; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX qualified_name alter_index_cmd { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = list_make1($4); n->objtype = OBJECT_INDEX; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX IF_P EXISTS qualified_name alter_index_cmd { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; n->cmds = list_make1($6); n->objtype = OBJECT_INDEX; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX qualified_name index_partition_cmd { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = list_make1($4); n->objtype = OBJECT_INDEX; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $6; n->objtype = OBJECT_INDEX; n->roles = NIL; n->new_tablespacename = $9; n->nowait = $10; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $6; n->objtype = OBJECT_INDEX; n->roles = $9; n->new_tablespacename = $12; n->nowait = $13; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = $4; n->objtype = OBJECT_SEQUENCE; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; n->cmds = $6; n->objtype = OBJECT_SEQUENCE; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $3; n->cmds = $4; n->objtype = OBJECT_VIEW; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $5; n->cmds = $6; n->objtype = OBJECT_VIEW; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $4; n->cmds = $5; n->objtype = OBJECT_MATVIEW; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $6; n->cmds = $7; n->objtype = OBJECT_MATVIEW; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $7; n->objtype = OBJECT_MATVIEW; n->roles = NIL; n->new_tablespacename = $10; n->nowait = $11; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait { AlterTableMoveAllStmt *n = makeNode(AlterTableMoveAllStmt); + n->orig_tablespacename = $7; n->objtype = OBJECT_MATVIEW; n->roles = $10; n->new_tablespacename = $13; n->nowait = $14; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE relation_expr alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $4; n->cmds = $5; n->objtype = OBJECT_FOREIGN_TABLE; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds { AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $6; n->cmds = $7; n->objtype = OBJECT_FOREIGN_TABLE; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -2275,37 +2392,41 @@ alter_table_cmd: ADD_P columnDef { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; n->def = $2; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ADD IF NOT EXISTS */ | ADD_P IF_P NOT EXISTS columnDef { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; n->def = $5; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ADD COLUMN */ | ADD_P COLUMN columnDef { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; n->def = $3; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ADD COLUMN IF NOT EXISTS */ | ADD_P COLUMN IF_P NOT EXISTS columnDef { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; n->def = $6; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ADD TTL INTERVAL 'interval' ON */ | ADD_P OptTtl @@ -2348,53 +2469,59 @@ alter_table_cmd: | ALTER opt_column ColId DROP DEFAULT { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ColumnDefault; n->name = $3; n->def = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } /* END SPANGRES ADDED GRAMMAR RULES */ /* ALTER TABLE ALTER [COLUMN] DROP NOT NULL */ | ALTER opt_column ColId DROP NOT NULL_P { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropNotNull; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET NOT NULL */ | ALTER opt_column ColId SET NOT NULL_P { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetNotNull; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] DROP EXPRESSION */ | ALTER opt_column ColId DROP EXPRESSION { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropExpression; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] DROP EXPRESSION IF EXISTS */ | ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropExpression; n->name = $3; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ | ALTER opt_column ColId SET STATISTICS SignedIconst { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetStatistics; n->name = $3; n->def = (Node *) makeInteger($6); - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ | ALTER opt_column Iconst SET STATISTICS SignedIconst @@ -2410,43 +2537,47 @@ alter_table_cmd: n->subtype = AT_SetStatistics; n->num = (int16) $3; n->def = (Node *) makeInteger($6); - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET ( column_parameter = value [, ... ] ) */ | ALTER opt_column ColId SET reloptions { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetOptions; n->name = $3; n->def = (Node *) $5; - $$ = (Node *)n; + $$ = (Node *) n; } - /* ALTER TABLE ALTER [COLUMN] RESET ( column_parameter = value [, ... ] ) */ + /* ALTER TABLE ALTER [COLUMN] RESET ( column_parameter [, ... ] ) */ | ALTER opt_column ColId RESET reloptions { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ResetOptions; n->name = $3; n->def = (Node *) $5; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET STORAGE */ | ALTER opt_column ColId SET STORAGE ColId { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetStorage; n->name = $3; n->def = (Node *) makeString($6); - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET COMPRESSION */ | ALTER opt_column ColId SET column_compression { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetCompression; n->name = $3; n->def = (Node *) makeString($5); - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] ADD GENERATED ... AS IDENTITY ... */ | ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList @@ -2463,54 +2594,59 @@ alter_table_cmd: n->name = $3; n->def = (Node *) c; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET /RESET */ | ALTER opt_column ColId alter_identity_column_option_list { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetIdentity; n->name = $3; n->def = (Node *) $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] DROP IDENTITY */ | ALTER opt_column ColId DROP IDENTITY_P { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropIdentity; n->name = $3; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] DROP IDENTITY IF EXISTS */ | ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropIdentity; n->name = $3; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DROP [COLUMN] IF EXISTS [RESTRICT|CASCADE] */ | DROP opt_column IF_P EXISTS ColId opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; n->name = $5; n->behavior = $6; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DROP [COLUMN] [RESTRICT|CASCADE] */ | DROP opt_column ColId opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; n->name = $3; n->behavior = $4; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* * ALTER TABLE ALTER [COLUMN] [SET DATA] TYPE @@ -2520,6 +2656,7 @@ alter_table_cmd: { AlterTableCmd *n = makeNode(AlterTableCmd); ColumnDef *def = makeNode(ColumnDef); + n->subtype = AT_AlterColumnType; n->name = $3; n->def = (Node *) def; @@ -2528,30 +2665,33 @@ alter_table_cmd: def->collClause = (CollateClause *) $7; def->raw_default = $8; def->location = @3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER FOREIGN TABLE ALTER [COLUMN] OPTIONS */ | ALTER opt_column ColId alter_generic_options { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AlterColumnGenericOptions; n->name = $3; n->def = (Node *) $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ADD CONSTRAINT ... */ | ADD_P TableConstraint { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddConstraint; n->def = $2; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ALTER CONSTRAINT ... */ | ALTER CONSTRAINT name ConstraintAttributeSpec { AlterTableCmd *n = makeNode(AlterTableCmd); Constraint *c = makeNode(Constraint); + n->subtype = AT_AlterConstraint; n->def = (Node *) c; c->contype = CONSTR_FOREIGN; /* others not supported, yet */ @@ -2560,35 +2700,38 @@ alter_table_cmd: &c->deferrable, &c->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE VALIDATE CONSTRAINT ... */ | VALIDATE CONSTRAINT name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ValidateConstraint; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DROP CONSTRAINT IF EXISTS [RESTRICT|CASCADE] */ | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropConstraint; n->name = $5; n->behavior = $6; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DROP CONSTRAINT [RESTRICT|CASCADE] */ | DROP CONSTRAINT name opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropConstraint; n->name = $3; n->behavior = $4; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DROP TTL */ | DROP TTL @@ -2601,38 +2744,43 @@ alter_table_cmd: | SET WITHOUT OIDS { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropOids; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE CLUSTER ON */ | CLUSTER ON name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ClusterOn; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE SET WITHOUT CLUSTER */ | SET WITHOUT CLUSTER { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropCluster; n->name = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE SET LOGGED */ | SET LOGGED { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetLogged; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE SET UNLOGGED */ | SET UNLOGGED { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetUnLogged; - $$ = (Node *)n; + $$ = (Node *) n; } | SET ON DELETE_P CASCADE { @@ -2650,200 +2798,235 @@ alter_table_cmd: | ENABLE_P TRIGGER name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableTrig; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE ALWAYS TRIGGER */ | ENABLE_P ALWAYS TRIGGER name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableAlwaysTrig; n->name = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE REPLICA TRIGGER */ | ENABLE_P REPLICA TRIGGER name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableReplicaTrig; n->name = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE TRIGGER ALL */ | ENABLE_P TRIGGER ALL { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableTrigAll; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE TRIGGER USER */ | ENABLE_P TRIGGER USER { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableTrigUser; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DISABLE TRIGGER */ | DISABLE_P TRIGGER name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DisableTrig; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DISABLE TRIGGER ALL */ | DISABLE_P TRIGGER ALL { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DisableTrigAll; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DISABLE TRIGGER USER */ | DISABLE_P TRIGGER USER { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DisableTrigUser; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE RULE */ | ENABLE_P RULE name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableRule; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE ALWAYS RULE */ | ENABLE_P ALWAYS RULE name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableAlwaysRule; n->name = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE REPLICA RULE */ | ENABLE_P REPLICA RULE name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableReplicaRule; n->name = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DISABLE RULE */ | DISABLE_P RULE name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DisableRule; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE INHERIT */ | INHERIT qualified_name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddInherit; n->def = (Node *) $2; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE NO INHERIT */ | NO INHERIT qualified_name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropInherit; n->def = (Node *) $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE OF */ | OF any_name { AlterTableCmd *n = makeNode(AlterTableCmd); - TypeName *def = makeTypeNameFromNameList($2); + TypeName *def = makeTypeNameFromNameList($2); + def->location = @2; n->subtype = AT_AddOf; n->def = (Node *) def; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE NOT OF */ | NOT OF { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropOf; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE OWNER TO RoleSpec */ | OWNER TO RoleSpec { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ChangeOwner; n->newowner = $3; - $$ = (Node *)n; + $$ = (Node *) n; + } + /* ALTER TABLE SET ACCESS METHOD */ + | SET ACCESS METHOD name + { + AlterTableCmd *n = makeNode(AlterTableCmd); + + n->subtype = AT_SetAccessMethod; + n->name = $4; + $$ = (Node *) n; } /* ALTER TABLE SET TABLESPACE */ | SET TABLESPACE name { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetTableSpace; n->name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE SET (...) */ | SET reloptions { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_SetRelOptions; - n->def = (Node *)$2; - $$ = (Node *)n; + n->def = (Node *) $2; + $$ = (Node *) n; } /* ALTER TABLE RESET (...) */ | RESET reloptions { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ResetRelOptions; - n->def = (Node *)$2; - $$ = (Node *)n; + n->def = (Node *) $2; + $$ = (Node *) n; } /* ALTER TABLE REPLICA IDENTITY */ | REPLICA IDENTITY_P replica_identity { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ReplicaIdentity; n->def = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE ENABLE ROW LEVEL SECURITY */ | ENABLE_P ROW LEVEL SECURITY { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_EnableRowSecurity; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE DISABLE ROW LEVEL SECURITY */ | DISABLE_P ROW LEVEL SECURITY { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DisableRowSecurity; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE FORCE ROW LEVEL SECURITY */ | FORCE ROW LEVEL SECURITY { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_ForceRowSecurity; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TABLE NO FORCE ROW LEVEL SECURITY */ | NO FORCE ROW LEVEL SECURITY { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_NoForceRowSecurity; - $$ = (Node *)n; + $$ = (Node *) n; } | alter_generic_options { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_GenericOptions; - n->def = (Node *)$1; + n->def = (Node *) $1; $$ = (Node *) n; } /* ALTER TABLE ADD SYNONYM */ @@ -2881,6 +3064,7 @@ opt_collate_clause: COLLATE any_name { CollateClause *n = makeNode(CollateClause); + n->arg = NULL; n->collname = $2; n->location = @1; @@ -2898,6 +3082,7 @@ replica_identity: NOTHING { ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt); + n->identity_type = REPLICA_IDENTITY_NOTHING; n->name = NULL; $$ = (Node *) n; @@ -2905,6 +3090,7 @@ replica_identity: | FULL { ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt); + n->identity_type = REPLICA_IDENTITY_FULL; n->name = NULL; $$ = (Node *) n; @@ -2912,6 +3098,7 @@ replica_identity: | DEFAULT { ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt); + n->identity_type = REPLICA_IDENTITY_DEFAULT; n->name = NULL; $$ = (Node *) n; @@ -2919,6 +3106,7 @@ replica_identity: | USING INDEX name { ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt); + n->identity_type = REPLICA_IDENTITY_INDEX; n->name = $3; $$ = (Node *) n; @@ -2973,7 +3161,7 @@ alter_identity_column_option: } | RESTART opt_with NumericOnly { - $$ = makeDefElem("restart", (Node *)$3, @1); + $$ = makeDefElem("restart", (Node *) $3, @1); } | SET SeqOptElem { @@ -3088,7 +3276,7 @@ PartitionBoundSpec: hash_partbound_elem: NonReservedWord Iconst { - $$ = makeDefElem($1, (Node *)makeInteger($2), @1); + $$ = makeDefElem($1, (Node *) makeInteger($2), @1); } ; @@ -3119,7 +3307,7 @@ AlterCompositeTypeStmt: n->relation = makeRangeVarFromAnyName($3, @3, yyscanner); n->cmds = $4; n->objtype = OBJECT_TYPE; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3133,36 +3321,40 @@ alter_type_cmd: ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_AddColumn; n->def = $3; n->behavior = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TYPE DROP ATTRIBUTE IF EXISTS [RESTRICT|CASCADE] */ | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; n->name = $5; n->behavior = $6; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TYPE DROP ATTRIBUTE [RESTRICT|CASCADE] */ | DROP ATTRIBUTE ColId opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_DropColumn; n->name = $3; n->behavior = $4; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER TYPE ALTER ATTRIBUTE [SET DATA] TYPE [RESTRICT|CASCADE] */ | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior { AlterTableCmd *n = makeNode(AlterTableCmd); ColumnDef *def = makeNode(ColumnDef); + n->subtype = AT_AlterColumnType; n->name = $3; n->def = (Node *) def; @@ -3172,7 +3364,7 @@ alter_type_cmd: def->collClause = (CollateClause *) $7; def->raw_default = NULL; def->location = @3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3188,14 +3380,16 @@ ClosePortalStmt: CLOSE cursor_name { ClosePortalStmt *n = makeNode(ClosePortalStmt); + n->portalname = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | CLOSE ALL { ClosePortalStmt *n = makeNode(ClosePortalStmt); + n->portalname = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3229,6 +3423,7 @@ CopyStmt: COPY opt_binary qualified_name opt_column_list copy_options where_clause { CopyStmt *n = makeNode(CopyStmt); + n->relation = $3; n->query = NULL; n->attlist = $4; @@ -3257,11 +3452,12 @@ CopyStmt: COPY opt_binary qualified_name opt_column_list n->options = lappend(n->options, $8); if ($10) n->options = list_concat(n->options, $10); - $$ = (Node *)n; + $$ = (Node *) n; } | COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options { CopyStmt *n = makeNode(CopyStmt); + n->relation = NULL; n->query = $3; n->attlist = NIL; @@ -3276,7 +3472,7 @@ CopyStmt: COPY opt_binary qualified_name opt_column_list errmsg("STDIN/STDOUT not allowed with PROGRAM"), parser_errposition(@5))); - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3314,55 +3510,55 @@ copy_opt_list: copy_opt_item: BINARY { - $$ = makeDefElem("format", (Node *)makeString("binary"), @1); + $$ = makeDefElem("format", (Node *) makeString("binary"), @1); } | FREEZE { - $$ = makeDefElem("freeze", (Node *)makeInteger(true), @1); + $$ = makeDefElem("freeze", (Node *) makeBoolean(true), @1); } | DELIMITER opt_as Sconst { - $$ = makeDefElem("delimiter", (Node *)makeString($3), @1); + $$ = makeDefElem("delimiter", (Node *) makeString($3), @1); } | NULL_P opt_as Sconst { - $$ = makeDefElem("null", (Node *)makeString($3), @1); + $$ = makeDefElem("null", (Node *) makeString($3), @1); } | CSV { - $$ = makeDefElem("format", (Node *)makeString("csv"), @1); + $$ = makeDefElem("format", (Node *) makeString("csv"), @1); } | HEADER_P { - $$ = makeDefElem("header", (Node *)makeInteger(true), @1); + $$ = makeDefElem("header", (Node *) makeBoolean(true), @1); } | QUOTE opt_as Sconst { - $$ = makeDefElem("quote", (Node *)makeString($3), @1); + $$ = makeDefElem("quote", (Node *) makeString($3), @1); } | ESCAPE opt_as Sconst { - $$ = makeDefElem("escape", (Node *)makeString($3), @1); + $$ = makeDefElem("escape", (Node *) makeString($3), @1); } | FORCE QUOTE columnList { - $$ = makeDefElem("force_quote", (Node *)$3, @1); + $$ = makeDefElem("force_quote", (Node *) $3, @1); } | FORCE QUOTE '*' { - $$ = makeDefElem("force_quote", (Node *)makeNode(A_Star), @1); + $$ = makeDefElem("force_quote", (Node *) makeNode(A_Star), @1); } | FORCE NOT NULL_P columnList { - $$ = makeDefElem("force_not_null", (Node *)$4, @1); + $$ = makeDefElem("force_not_null", (Node *) $4, @1); } | FORCE NULL_P columnList { - $$ = makeDefElem("force_null", (Node *)$3, @1); + $$ = makeDefElem("force_null", (Node *) $3, @1); } | ENCODING Sconst { - $$ = makeDefElem("encoding", (Node *)makeString($2), @1); + $$ = makeDefElem("encoding", (Node *) makeString($2), @1); } ; @@ -3371,7 +3567,7 @@ copy_opt_item: opt_binary: BINARY { - $$ = makeDefElem("format", (Node *)makeString("binary"), @1); + $$ = makeDefElem("format", (Node *) makeString("binary"), @1); } | /*EMPTY*/ { $$ = NULL; } ; @@ -3379,7 +3575,7 @@ opt_binary: copy_delimiter: opt_using DELIMITERS Sconst { - $$ = makeDefElem("delimiter", (Node *)makeString($3), @2); + $$ = makeDefElem("delimiter", (Node *) makeString($3), @2); } | /*EMPTY*/ { $$ = NULL; } ; @@ -3457,6 +3653,7 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $4->relpersistence = $2; n->relation = $4; n->tableElts = $6; @@ -3471,13 +3668,14 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $14; n->if_not_exists = false; n->ttl = $15; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '(' OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $7->relpersistence = $2; n->relation = $7; n->tableElts = $9; @@ -3492,13 +3690,14 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $17; n->if_not_exists = true; n->ttl = $18; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp TABLE qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $4->relpersistence = $2; n->relation = $4; n->tableElts = $7; @@ -3514,13 +3713,14 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $13; n->if_not_exists = false; n->ttl = $14; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $7->relpersistence = $2; n->relation = $7; n->tableElts = $10; @@ -3536,13 +3736,14 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $16; n->if_not_exists = true; n->ttl = $17; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $4->relpersistence = $2; n->relation = $4; n->tableElts = $8; @@ -3558,13 +3759,14 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $15; n->if_not_exists = false; n->ttl = $16; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace OptInterleave OptTtl { CreateStmt *n = makeNode(CreateStmt); + $7->relpersistence = $2; n->relation = $7; n->tableElts = $11; @@ -3580,7 +3782,7 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' n->interleavespec = $18; n->if_not_exists = true; n->ttl = $19; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3664,6 +3866,7 @@ TypedTableElement: columnDef: ColId Typename opt_column_compression create_generic_options ColQualList { ColumnDef *n = makeNode(ColumnDef); + n->colname = $1; n->typeName = $2; n->compression = $3; @@ -3679,13 +3882,14 @@ columnDef: ColId Typename opt_column_compression create_generic_options ColQualL SplitColQualList($5, &n->constraints, &n->collClause, yyscanner); n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; columnOptions: ColId ColQualList { ColumnDef *n = makeNode(ColumnDef); + n->colname = $1; n->typeName = NULL; n->inhcount = 0; @@ -3699,11 +3903,12 @@ columnOptions: ColId ColQualList SplitColQualList($2, &n->constraints, &n->collClause, yyscanner); n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | ColId WITH OPTIONS ColQualList { ColumnDef *n = makeNode(ColumnDef); + n->colname = $1; n->typeName = NULL; n->inhcount = 0; @@ -3717,7 +3922,7 @@ columnOptions: ColId ColQualList SplitColQualList($4, &n->constraints, &n->collClause, yyscanner); n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3740,6 +3945,7 @@ ColConstraint: CONSTRAINT name ColConstraintElem { Constraint *n = castNode(Constraint, $3); + n->conname = $2; n->location = @1; $$ = (Node *) n; @@ -3754,6 +3960,7 @@ ColConstraint: * again in SplitColQualList. */ CollateClause *n = makeNode(CollateClause); + n->arg = NULL; n->collname = $2; n->location = @1; @@ -3780,42 +3987,48 @@ ColConstraintElem: NOT NULL_P { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_NOTNULL; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | NULL_P { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_NULL; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } - | UNIQUE opt_definition OptConsTableSpace + | UNIQUE opt_unique_null_treatment opt_definition OptConsTableSpace { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_UNIQUE; n->location = @1; + n->nulls_not_distinct = !$2; n->keys = NULL; - n->options = $2; + n->options = $3; n->indexname = NULL; - n->indexspace = $3; - $$ = (Node *)n; + n->indexspace = $4; + $$ = (Node *) n; } | PRIMARY KEY opt_definition OptConsTableSpace { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_PRIMARY; n->location = @1; n->keys = NULL; n->options = $3; n->indexname = NULL; n->indexspace = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | CHECK '(' a_expr ')' opt_no_inherit { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_CHECK; n->location = @1; n->is_no_inherit = $5; @@ -3828,11 +4041,12 @@ ColConstraintElem: int expr_end = @4; n->constraint_expr_string = pnstrdup(pg_yyget_extra(yyscanner)->core_yy_extra.scanbuf + expr_start, expr_end - expr_start); - $$ = (Node *)n; + $$ = (Node *) n; } | DEFAULT b_expr { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_DEFAULT; n->location = @1; n->raw_expr = $2; @@ -3842,20 +4056,22 @@ ColConstraintElem: int expr_end = pg_yyget_extra(yyscanner)->current_yylloc; n->constraint_expr_string = pnstrdup(pg_yyget_extra(yyscanner)->core_yy_extra.scanbuf + expr_start, expr_end - expr_start); - $$ = (Node *)n; + $$ = (Node *) n; } | GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_IDENTITY; n->generated_when = $2; n->options = $5; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | GENERATED generated_when AS '(' a_expr ')' stored_kind { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_GENERATED; n->generated_when = $2; n->raw_expr = $5; @@ -3879,22 +4095,24 @@ ColConstraintElem: int expr_end = @6; n->constraint_expr_string = pnstrdup(pg_yyget_extra(yyscanner)->core_yy_extra.scanbuf + expr_start, expr_end - expr_start); - $$ = (Node *)n; + $$ = (Node *) n; } | REFERENCES qualified_name opt_column_list key_match key_actions { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_FOREIGN; n->location = @1; - n->pktable = $2; - n->fk_attrs = NIL; - n->pk_attrs = $3; - n->fk_matchtype = $4; - n->fk_upd_action = (char) ($5 >> 8); - n->fk_del_action = (char) ($5 & 0xFF); - n->skip_validation = false; - n->initially_valid = true; - $$ = (Node *)n; + n->pktable = $2; + n->fk_attrs = NIL; + n->pk_attrs = $3; + n->fk_matchtype = $4; + n->fk_upd_action = ($5)->updateAction->action; + n->fk_del_action = ($5)->deleteAction->action; + n->fk_del_set_cols = ($5)->deleteAction->cols; + n->skip_validation = false; + n->initially_valid = true; + $$ = (Node *) n; } | VECTOR LENGTH SignedIconst { @@ -3906,6 +4124,12 @@ ColConstraintElem: } ; +opt_unique_null_treatment: + NULLS_P DISTINCT { $$ = true; } + | NULLS_P NOT DISTINCT { $$ = false; } + | /*EMPTY*/ { $$ = true; } + ; + generated_when: ALWAYS { $$ = ATTRIBUTE_IDENTITY_ALWAYS; } | BY DEFAULT { $$ = ATTRIBUTE_IDENTITY_BY_DEFAULT; } @@ -3934,30 +4158,34 @@ ConstraintAttr: DEFERRABLE { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_ATTR_DEFERRABLE; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | NOT DEFERRABLE { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_ATTR_NOT_DEFERRABLE; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | INITIALLY DEFERRED { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_ATTR_DEFERRED; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | INITIALLY IMMEDIATE { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_ATTR_IMMEDIATE; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -3966,9 +4194,11 @@ TableLikeClause: LIKE qualified_name TableLikeOptionList { TableLikeClause *n = makeNode(TableLikeClause); + n->relation = $2; n->options = $3; - $$ = (Node *)n; + + $$ = (Node *) n; } ; @@ -4000,6 +4230,7 @@ TableConstraint: CONSTRAINT name ConstraintElem { Constraint *n = castNode(Constraint, $3); + n->conname = $2; n->location = @1; $$ = (Node *) n; @@ -4011,6 +4242,7 @@ ConstraintElem: CHECK '(' a_expr ')' ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_CHECK; n->location = @1; n->raw_expr = $3; @@ -4024,27 +4256,30 @@ ConstraintElem: int expr_end = @4; n->constraint_expr_string = pnstrdup(pg_yyget_extra(yyscanner)->core_yy_extra.scanbuf + expr_start, expr_end - expr_start); - $$ = (Node *)n; + $$ = (Node *) n; } - | UNIQUE '(' columnList ')' opt_c_include opt_definition OptConsTableSpace + | UNIQUE opt_unique_null_treatment '(' columnList ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_UNIQUE; n->location = @1; - n->keys = $3; - n->including = $5; - n->options = $6; + n->nulls_not_distinct = !$2; + n->keys = $4; + n->including = $6; + n->options = $7; n->indexname = NULL; - n->indexspace = $7; - processCASbits($8, @8, "UNIQUE", + n->indexspace = $8; + processCASbits($9, @9, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } | UNIQUE ExistingIndex ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_UNIQUE; n->location = @1; n->keys = NIL; @@ -4055,12 +4290,13 @@ ConstraintElem: processCASbits($3, @3, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } | PRIMARY KEY '(' columnList ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_PRIMARY; n->location = @1; n->keys = $4; @@ -4071,11 +4307,12 @@ ConstraintElem: processCASbits($9, @9, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } | PRIMARY KEY ExistingIndex ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_PRIMARY; n->location = @1; n->keys = NIL; @@ -4086,45 +4323,48 @@ ConstraintElem: processCASbits($4, @4, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } | EXCLUDE access_method_clause '(' ExclusionConstraintList ')' opt_c_include opt_definition OptConsTableSpace OptWhereClause ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_EXCLUSION; n->location = @1; - n->access_method = $2; - n->exclusions = $4; - n->including = $6; - n->options = $7; - n->indexname = NULL; - n->indexspace = $8; - n->where_clause = $9; + n->access_method = $2; + n->exclusions = $4; + n->including = $6; + n->options = $7; + n->indexname = NULL; + n->indexspace = $8; + n->where_clause = $9; processCASbits($10, @10, "EXCLUDE", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list key_match key_actions ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); + n->contype = CONSTR_FOREIGN; n->location = @1; - n->pktable = $7; - n->fk_attrs = $4; - n->pk_attrs = $8; - n->fk_matchtype = $9; - n->fk_upd_action = (char) ($10 >> 8); - n->fk_del_action = (char) ($10 & 0xFF); + n->pktable = $7; + n->fk_attrs = $4; + n->pk_attrs = $8; + n->fk_matchtype = $9; + n->fk_upd_action = ($10)->updateAction->action; + n->fk_del_action = ($10)->deleteAction->action; + n->fk_del_set_cols = ($10)->deleteAction->cols; processCASbits($11, @11, "FOREIGN KEY", &n->deferrable, &n->initdeferred, &n->skip_validation, NULL, yyscanner); n->initially_valid = !n->skip_validation; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4210,37 +4450,116 @@ OptWhereClause: | /*EMPTY*/ { $$ = NULL; } ; -/* - * We combine the update and delete actions into one value temporarily - * for simplicity of parsing, and then break them down again in the - * calling production. update is in the left 8 bits, delete in the right. - * Note that NOACTION is the default. - */ key_actions: key_update - { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); } + { + KeyActions *n = palloc(sizeof(KeyActions)); + + n->updateAction = $1; + n->deleteAction = palloc(sizeof(KeyAction)); + n->deleteAction->action = FKCONSTR_ACTION_NOACTION; + n->deleteAction->cols = NIL; + $$ = n; + } | key_delete - { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); } - | key_update key_delete - { $$ = ($1 << 8) | ($2 & 0xFF); } - | key_delete key_update - { $$ = ($2 << 8) | ($1 & 0xFF); } - | /*EMPTY*/ - { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); } - ; + { + KeyActions *n = palloc(sizeof(KeyActions)); -key_update: ON UPDATE key_action { $$ = $3; } - ; + n->updateAction = palloc(sizeof(KeyAction)); + n->updateAction->action = FKCONSTR_ACTION_NOACTION; + n->updateAction->cols = NIL; + n->deleteAction = $1; + $$ = n; + } + | key_update key_delete + { + KeyActions *n = palloc(sizeof(KeyActions)); + + n->updateAction = $1; + n->deleteAction = $2; + $$ = n; + } + | key_delete key_update + { + KeyActions *n = palloc(sizeof(KeyActions)); + + n->updateAction = $2; + n->deleteAction = $1; + $$ = n; + } + | /*EMPTY*/ + { + KeyActions *n = palloc(sizeof(KeyActions)); + + n->updateAction = palloc(sizeof(KeyAction)); + n->updateAction->action = FKCONSTR_ACTION_NOACTION; + n->updateAction->cols = NIL; + n->deleteAction = palloc(sizeof(KeyAction)); + n->deleteAction->action = FKCONSTR_ACTION_NOACTION; + n->deleteAction->cols = NIL; + $$ = n; + } + ; + +key_update: ON UPDATE key_action + { + if (($3)->cols) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("a column list with %s is only supported for ON DELETE actions", + ($3)->action == FKCONSTR_ACTION_SETNULL ? "SET NULL" : "SET DEFAULT"), + parser_errposition(@1))); + $$ = $3; + } + ; -key_delete: ON DELETE_P key_action { $$ = $3; } +key_delete: ON DELETE_P key_action + { + $$ = $3; + } ; key_action: - NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; } - | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; } - | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; } - | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; } - | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; } + NO ACTION + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_NOACTION; + n->cols = NIL; + $$ = n; + } + | RESTRICT + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_RESTRICT; + n->cols = NIL; + $$ = n; + } + | CASCADE + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_CASCADE; + n->cols = NIL; + $$ = n; + } + | SET NULL_P opt_column_list + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_SETNULL; + n->cols = $3; + $$ = n; + } + | SET DEFAULT opt_column_list + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_SETDEFAULT; + n->cols = $3; + $$ = n; + } ; OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; } @@ -4345,7 +4664,7 @@ OptInterleave: INTERLEAVE IN_P qualified_name InterleaveSpec *n = makeNode(InterleaveSpec); n->interleavetype = INTERLEAVE_IN_PARENT; n->parent = $4; - n->on_delete_action = $5; + n->on_delete_action = $5->action; n->location = @1; $$ = n; } @@ -4362,7 +4681,14 @@ OptInterleaveIndex: INTERLEAVE IN_P qualified_name | /*EMPTY*/ { $$ = NULL; } interleave_action: key_delete { $$ = $1; } - | /*EMPTY*/ { $$ = FKCONSTR_ACTION_NOACTION; } + | /*EMPTY*/ + { + KeyAction *n = palloc(sizeof(KeyAction)); + + n->action = FKCONSTR_ACTION_NOACTION; + n->cols = NIL; + $$ = n; + } /***************************************************************************** * @@ -4383,25 +4709,27 @@ CreateStatsStmt: opt_name_list ON stats_params FROM from_list { CreateStatsStmt *n = makeNode(CreateStatsStmt); + n->defnames = $3; n->stat_types = $4; n->exprs = $6; n->relations = $8; n->stxcomment = NULL; n->if_not_exists = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE STATISTICS IF_P NOT EXISTS any_name opt_name_list ON stats_params FROM from_list { CreateStatsStmt *n = makeNode(CreateStatsStmt); + n->defnames = $6; n->stat_types = $7; n->exprs = $9; n->relations = $11; n->stxcomment = NULL; n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4448,18 +4776,20 @@ AlterStatsStmt: ALTER STATISTICS any_name SET STATISTICS SignedIconst { AlterStatsStmt *n = makeNode(AlterStatsStmt); + n->defnames = $3; n->missing_ok = false; n->stxstattarget = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS SignedIconst { AlterStatsStmt *n = makeNode(AlterStatsStmt); + n->defnames = $5; n->missing_ok = true; n->stxstattarget = $8; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4491,6 +4821,7 @@ CreateAsStmt: CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $6; ctas->into = $4; ctas->objtype = OBJECT_TABLE; @@ -4504,6 +4835,7 @@ CreateAsStmt: | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS SelectStmt opt_with_data { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $9; ctas->into = $7; ctas->objtype = OBJECT_TABLE; @@ -4550,6 +4882,7 @@ CreateMatViewStmt: CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $7; ctas->into = $5; ctas->objtype = OBJECT_MATVIEW; @@ -4563,6 +4896,7 @@ CreateMatViewStmt: | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); + ctas->query = $10; ctas->into = $8; ctas->objtype = OBJECT_MATVIEW; @@ -4606,6 +4940,7 @@ RefreshMatViewStmt: REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data { RefreshMatViewStmt *n = makeNode(RefreshMatViewStmt); + n->concurrent = $4; n->relation = $5; n->skipData = !($6); @@ -4626,22 +4961,24 @@ CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqOptList { CreateSeqStmt *n = makeNode(CreateSeqStmt); + $4->relpersistence = $2; n->sequence = $4; n->options = $5; n->ownerId = InvalidOid; n->if_not_exists = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList { CreateSeqStmt *n = makeNode(CreateSeqStmt); + $7->relpersistence = $2; n->sequence = $7; n->options = $8; n->ownerId = InvalidOid; n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4649,18 +4986,20 @@ AlterSeqStmt: ALTER SEQUENCE qualified_name SeqOptList { AlterSeqStmt *n = makeNode(AlterSeqStmt); + n->sequence = $3; n->options = $4; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList { AlterSeqStmt *n = makeNode(AlterSeqStmt); + n->sequence = $5; n->options = $6; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4679,7 +5018,7 @@ SeqOptList: SeqOptElem { $$ = list_make1($1); } SeqOptElem: AS SimpleTypename { - $$ = makeDefElem("as", (Node *)$2, @1); + $$ = makeDefElem("as", (Node *) $2, @1); } | BIT_REVERSED_POSITIVE { @@ -4687,27 +5026,27 @@ SeqOptElem: AS SimpleTypename } | CACHE NumericOnly { - $$ = makeDefElem("cache", (Node *)$2, @1); + $$ = makeDefElem("cache", (Node *) $2, @1); } | CYCLE { - $$ = makeDefElem("cycle", (Node *)makeInteger(true), @1); + $$ = makeDefElem("cycle", (Node *) makeBoolean(true), @1); } | NO CYCLE { - $$ = makeDefElem("cycle", (Node *)makeInteger(false), @1); + $$ = makeDefElem("cycle", (Node *) makeBoolean(false), @1); } | INCREMENT opt_by NumericOnly { - $$ = makeDefElem("increment", (Node *)$3, @1); + $$ = makeDefElem("increment", (Node *) $3, @1); } | MAXVALUE NumericOnly { - $$ = makeDefElem("maxvalue", (Node *)$2, @1); + $$ = makeDefElem("maxvalue", (Node *) $2, @1); } | MINVALUE NumericOnly { - $$ = makeDefElem("minvalue", (Node *)$2, @1); + $$ = makeDefElem("minvalue", (Node *) $2, @1); } | NO MAXVALUE { @@ -4719,12 +5058,12 @@ SeqOptElem: AS SimpleTypename } | OWNED BY any_name { - $$ = makeDefElem("owned_by", (Node *)$3, @1); + $$ = makeDefElem("owned_by", (Node *) $3, @1); } | SEQUENCE NAME_P any_name { /* not documented, only used by pg_dump */ - $$ = makeDefElem("sequence_name", (Node *)$3, @1); + $$ = makeDefElem("sequence_name", (Node *) $3, @1); } | SKIP RANGE NumericOnly NumericOnly { @@ -4732,7 +5071,7 @@ SeqOptElem: AS SimpleTypename } | START opt_with NumericOnly { - $$ = makeDefElem("start", (Node *)$3, @1); + $$ = makeDefElem("start", (Node *) $3, @1); } | START COUNTER opt_with NumericOnly { @@ -4744,7 +5083,7 @@ SeqOptElem: AS SimpleTypename } | RESTART opt_with NumericOnly { - $$ = makeDefElem("restart", (Node *)$3, @1); + $$ = makeDefElem("restart", (Node *) $3, @1); } | RESTART COUNTER opt_with NumericOnly { @@ -4757,14 +5096,16 @@ opt_by: BY ; NumericOnly: - FCONST { $$ = makeFloat($1); } - | '+' FCONST { $$ = makeFloat($2); } + FCONST { $$ = (Node *) makeFloat($1); } + | '+' FCONST { $$ = (Node *) makeFloat($2); } | '-' FCONST { - $$ = makeFloat($2); - doNegateFloat($$); + Float *f = makeFloat($2); + + doNegateFloat(f); + $$ = (Node *) f; } - | SignedIconst { $$ = makeInteger($1); } + | SignedIconst { $$ = (Node *) makeInteger($1); } ; NumericOnly_list: NumericOnly { $$ = list_make1($1); } @@ -4790,22 +5131,24 @@ CreatePLangStmt: * ignore TRUSTED, as the previous code would have too. */ CreateExtensionStmt *n = makeNode(CreateExtensionStmt); + n->if_not_exists = $2; n->extname = $6; n->options = NIL; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name HANDLER handler_name opt_inline_handler opt_validator { CreatePLangStmt *n = makeNode(CreatePLangStmt); + n->replace = $2; n->plname = $6; n->plhandler = $8; n->plinline = $9; n->plvalidator = $10; n->pltrusted = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -4853,6 +5196,7 @@ opt_procedural: CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions { CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt); + n->tablespacename = $3; n->owner = $4; n->location = $6; @@ -4878,6 +5222,7 @@ OptTableSpaceOwner: OWNER RoleSpec { $$ = $2; } DropTableSpaceStmt: DROP TABLESPACE name { DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt); + n->tablespacename = $3; n->missing_ok = false; $$ = (Node *) n; @@ -4885,6 +5230,7 @@ DropTableSpaceStmt: DROP TABLESPACE name | DROP TABLESPACE IF_P EXISTS name { DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt); + n->tablespacename = $5; n->missing_ok = true; $$ = (Node *) n; @@ -4902,6 +5248,7 @@ DropTableSpaceStmt: DROP TABLESPACE name CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list { CreateExtensionStmt *n = makeNode(CreateExtensionStmt); + n->extname = $3; n->if_not_exists = false; n->options = $5; @@ -4910,6 +5257,7 @@ CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list { CreateExtensionStmt *n = makeNode(CreateExtensionStmt); + n->extname = $6; n->if_not_exists = true; n->options = $8; @@ -4927,11 +5275,11 @@ create_extension_opt_list: create_extension_opt_item: SCHEMA name { - $$ = makeDefElem("schema", (Node *)makeString($2), @1); + $$ = makeDefElem("schema", (Node *) makeString($2), @1); } | VERSION_P NonReservedWord_or_Sconst { - $$ = makeDefElem("new_version", (Node *)makeString($2), @1); + $$ = makeDefElem("new_version", (Node *) makeString($2), @1); } | FROM NonReservedWord_or_Sconst { @@ -4942,7 +5290,7 @@ create_extension_opt_item: } | CASCADE { - $$ = makeDefElem("cascade", (Node *)makeInteger(true), @1); + $$ = makeDefElem("cascade", (Node *) makeBoolean(true), @1); } ; @@ -4955,6 +5303,7 @@ create_extension_opt_item: AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list { AlterExtensionStmt *n = makeNode(AlterExtensionStmt); + n->extname = $3; n->options = $5; $$ = (Node *) n; @@ -4971,7 +5320,7 @@ alter_extension_opt_list: alter_extension_opt_item: TO NonReservedWord_or_Sconst { - $$ = makeDefElem("new_version", (Node *)makeString($2), @1); + $$ = makeDefElem("new_version", (Node *) makeString($2), @1); } ; @@ -4985,33 +5334,37 @@ AlterExtensionContentsStmt: ALTER EXTENSION name add_drop object_type_name name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = $5; n->object = (Node *) makeString($6); - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop object_type_any_name any_name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = $5; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_AGGREGATE; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')' { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_CAST; @@ -5021,83 +5374,92 @@ AlterExtensionContentsStmt: | ALTER EXTENSION name add_drop DOMAIN_P Typename { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_DOMAIN; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_FUNCTION; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_OPERATOR; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_OPCLASS; n->object = (Node *) lcons(makeString($9), $7); - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_OPFAMILY; n->object = (Node *) lcons(makeString($9), $7); - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_PROCEDURE; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_ROUTINE; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_TRANSFORM; n->object = (Node *) list_make2($7, makeString($9)); - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name add_drop TYPE_P Typename { AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt); + n->extname = $3; n->action = $4; n->objtype = OBJECT_TYPE; n->object = (Node *) $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -5111,6 +5473,7 @@ AlterExtensionContentsStmt: CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options { CreateFdwStmt *n = makeNode(CreateFdwStmt); + n->fdwname = $5; n->func_options = $6; n->options = $7; @@ -5119,9 +5482,9 @@ CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic ; fdw_option: - HANDLER handler_name { $$ = makeDefElem("handler", (Node *)$2, @1); } + HANDLER handler_name { $$ = makeDefElem("handler", (Node *) $2, @1); } | NO HANDLER { $$ = makeDefElem("handler", NULL, @1); } - | VALIDATOR handler_name { $$ = makeDefElem("validator", (Node *)$2, @1); } + | VALIDATOR handler_name { $$ = makeDefElem("validator", (Node *) $2, @1); } | NO VALIDATOR { $$ = makeDefElem("validator", NULL, @1); } ; @@ -5145,6 +5508,7 @@ opt_fdw_options: AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options { AlterFdwStmt *n = makeNode(AlterFdwStmt); + n->fdwname = $5; n->func_options = $6; n->options = $7; @@ -5153,6 +5517,7 @@ AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_op | ALTER FOREIGN DATA_P WRAPPER name fdw_options { AlterFdwStmt *n = makeNode(AlterFdwStmt); + n->fdwname = $5; n->func_options = $6; n->options = NIL; @@ -5241,6 +5606,7 @@ CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options { CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt); + n->servername = $3; n->servertype = $4; n->version = $5; @@ -5253,6 +5619,7 @@ CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options { CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt); + n->servername = $6; n->servertype = $7; n->version = $8; @@ -5289,6 +5656,7 @@ opt_foreign_server_version: AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options { AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; n->version = $4; n->options = $5; @@ -5298,6 +5666,7 @@ AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_o | ALTER SERVER name foreign_server_version { AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; n->version = $4; n->has_version = true; @@ -5306,6 +5675,7 @@ AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_o | ALTER SERVER name alter_generic_options { AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; n->options = $4; $$ = (Node *) n; @@ -5325,6 +5695,7 @@ CreateForeignTableStmt: OptInherit SERVER name create_generic_options { CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $4->relpersistence = RELPERSISTENCE_PERMANENT; n->base.relation = $4; n->base.tableElts = $6; @@ -5345,6 +5716,7 @@ CreateForeignTableStmt: OptInherit SERVER name create_generic_options { CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $7->relpersistence = RELPERSISTENCE_PERMANENT; n->base.relation = $7; n->base.tableElts = $9; @@ -5365,6 +5737,7 @@ CreateForeignTableStmt: SERVER name create_generic_options { CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $4->relpersistence = RELPERSISTENCE_PERMANENT; n->base.relation = $4; n->base.inhRelations = list_make1($7); @@ -5386,6 +5759,7 @@ CreateForeignTableStmt: SERVER name create_generic_options { CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $7->relpersistence = RELPERSISTENCE_PERMANENT; n->base.relation = $7; n->base.inhRelations = list_make1($10); @@ -5418,6 +5792,7 @@ ImportForeignSchemaStmt: FROM SERVER name INTO name create_generic_options { ImportForeignSchemaStmt *n = makeNode(ImportForeignSchemaStmt); + n->server_name = $8; n->remote_schema = $4; n->local_schema = $10; @@ -5437,6 +5812,7 @@ import_qualification: import_qualification_type '(' relation_expr_list ')' { ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual)); + n->type = $1; n->table_names = $3; $$ = n; @@ -5460,6 +5836,7 @@ import_qualification: CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options { CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt); + n->user = $5; n->servername = $7; n->options = $8; @@ -5469,6 +5846,7 @@ CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_gen | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options { CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt); + n->user = $8; n->servername = $10; n->options = $11; @@ -5494,6 +5872,7 @@ auth_ident: RoleSpec { $$ = $1; } DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name { DropUserMappingStmt *n = makeNode(DropUserMappingStmt); + n->user = $5; n->servername = $7; n->missing_ok = false; @@ -5502,6 +5881,7 @@ DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name { DropUserMappingStmt *n = makeNode(DropUserMappingStmt); + n->user = $7; n->servername = $9; n->missing_ok = true; @@ -5519,6 +5899,7 @@ DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options { AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt); + n->user = $5; n->servername = $7; n->options = $8; @@ -5545,6 +5926,7 @@ CreatePolicyStmt: RowSecurityOptionalExpr RowSecurityOptionalWithCheck { CreatePolicyStmt *n = makeNode(CreatePolicyStmt); + n->policy_name = $3; n->table = $5; n->permissive = $6; @@ -5561,6 +5943,7 @@ AlterPolicyStmt: RowSecurityOptionalExpr RowSecurityOptionalWithCheck { AlterPolicyStmt *n = makeNode(AlterPolicyStmt); + n->policy_name = $3; n->table = $5; n->roles = $6; @@ -5600,9 +5983,9 @@ RowSecurityDefaultPermissive: else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized row security option \"%s\"", $2), + errmsg("unrecognized row security option \"%s\"", $2), errhint("Only PERMISSIVE or RESTRICTIVE policies are supported currently."), - parser_errposition(@2))); + parser_errposition(@2))); } | /* EMPTY */ { $$ = true; } @@ -5631,6 +6014,7 @@ row_security_cmd: CreateAmStmt: CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name { CreateAmStmt *n = makeNode(CreateAmStmt); + n->amname = $4; n->handler_name = $8; n->amtype = $6; @@ -5656,6 +6040,7 @@ CreateTrigStmt: EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')' { CreateTrigStmt *n = makeNode(CreateTrigStmt); + n->replace = $2; n->isconstraint = false; n->trigname = $4; @@ -5671,7 +6056,7 @@ CreateTrigStmt: n->deferrable = false; n->initdeferred = false; n->constrrel = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER TriggerEvents ON qualified_name OptConstrFromTable ConstraintAttributeSpec @@ -5679,6 +6064,7 @@ CreateTrigStmt: EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')' { CreateTrigStmt *n = makeNode(CreateTrigStmt); + n->replace = $2; if (n->replace) /* not supported, see CreateTrigger */ ereport(ERROR, @@ -5699,7 +6085,7 @@ CreateTrigStmt: &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); n->constrrel = $10; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -5714,10 +6100,10 @@ TriggerEvents: { $$ = $1; } | TriggerEvents OR TriggerOneEvent { - int events1 = intVal(linitial($1)); - int events2 = intVal(linitial($3)); - List *columns1 = (List *) lsecond($1); - List *columns2 = (List *) lsecond($3); + int events1 = intVal(linitial($1)); + int events2 = intVal(linitial($3)); + List *columns1 = (List *) lsecond($1); + List *columns2 = (List *) lsecond($3); if (events1 & events2) parser_yyerror("duplicate trigger events specified"); @@ -5760,10 +6146,11 @@ TriggerTransition: TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName { TriggerTransition *n = makeNode(TriggerTransition); + n->name = $4; n->isNew = $1; n->isTable = $2; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -5833,11 +6220,11 @@ TriggerFuncArgs: TriggerFuncArg: Iconst { - $$ = makeString(psprintf("%d", $1)); + $$ = (Node *) makeString(psprintf("%d", $1)); } - | FCONST { $$ = makeString($1); } - | Sconst { $$ = makeString($1); } - | ColLabel { $$ = makeString($1); } + | FCONST { $$ = (Node *) makeString($1); } + | Sconst { $$ = (Node *) makeString($1); } + | ColLabel { $$ = (Node *) makeString($1); } ; OptConstrFromTable: @@ -5897,22 +6284,24 @@ CreateEventTrigStmt: EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')' { CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt); + n->trigname = $4; n->eventname = $6; n->whenclause = NULL; n->funcname = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE EVENT TRIGGER name ON ColLabel WHEN event_trigger_when_list EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')' { CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt); + n->trigname = $4; n->eventname = $6; n->whenclause = $8; n->funcname = $11; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -5939,6 +6328,7 @@ AlterEventTrigStmt: ALTER EVENT TRIGGER name enable_trigger { AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt); + n->trigname = $4; n->tgenabled = $5; $$ = (Node *) n; @@ -5982,56 +6372,61 @@ DefineStmt: CREATE opt_or_replace AGGREGATE func_name aggr_args definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_AGGREGATE; n->oldstyle = false; n->replace = $2; n->defnames = $4; n->args = $5; n->definition = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition { /* old-style (pre-8.2) syntax for CREATE AGGREGATE */ DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_AGGREGATE; n->oldstyle = true; n->replace = $2; n->defnames = $4; n->args = NIL; n->definition = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE OPERATOR any_operator definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_OPERATOR; n->oldstyle = false; n->defnames = $3; n->args = NIL; n->definition = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TYPE_P any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TYPE; n->oldstyle = false; n->defnames = $3; n->args = NIL; n->definition = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TYPE_P any_name { /* Shell type (identified by lack of definition) */ DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TYPE; n->oldstyle = false; n->defnames = $3; n->args = NIL; n->definition = NIL; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')' { @@ -6040,95 +6435,105 @@ DefineStmt: /* can't use qualified_name, sigh */ n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner); n->coldeflist = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')' { CreateEnumStmt *n = makeNode(CreateEnumStmt); + n->typeName = $3; n->vals = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TYPE_P any_name AS RANGE definition { CreateRangeStmt *n = makeNode(CreateRangeStmt); + n->typeName = $3; - n->params = $6; - $$ = (Node *)n; + n->params = $6; + $$ = (Node *) n; } | CREATE TEXT_P SEARCH PARSER any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TSPARSER; n->args = NIL; n->defnames = $5; n->definition = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TEXT_P SEARCH DICTIONARY any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TSDICTIONARY; n->args = NIL; n->defnames = $5; n->definition = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TEXT_P SEARCH TEMPLATE any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TSTEMPLATE; n->args = NIL; n->defnames = $5; n->definition = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE TEXT_P SEARCH CONFIGURATION any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_TSCONFIGURATION; n->args = NIL; n->defnames = $5; n->definition = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE COLLATION any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_COLLATION; n->args = NIL; n->defnames = $3; n->definition = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE COLLATION IF_P NOT EXISTS any_name definition { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_COLLATION; n->args = NIL; n->defnames = $6; n->definition = $7; n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE COLLATION any_name FROM any_name { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_COLLATION; n->args = NIL; n->defnames = $3; n->definition = list_make1(makeDefElem("from", (Node *) $5, @5)); - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name { DefineStmt *n = makeNode(DefineStmt); + n->kind = OBJECT_COLLATION; n->args = NIL; n->defnames = $6; n->definition = list_make1(makeDefElem("from", (Node *) $8, @8)); n->if_not_exists = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -6150,12 +6555,12 @@ def_elem: ColLabel '=' def_arg ; /* Note: any simple identifier will be returned as a type name! */ -def_arg: func_type { $$ = (Node *)$1; } - | reserved_keyword { $$ = (Node *)makeString(pstrdup($1)); } - | qual_all_Op { $$ = (Node *)$1; } - | NumericOnly { $$ = (Node *)$1; } - | Sconst { $$ = (Node *)makeString($1); } - | NONE { $$ = (Node *)makeString(pstrdup($1)); } +def_arg: func_type { $$ = (Node *) $1; } + | reserved_keyword { $$ = (Node *) makeString(pstrdup($1)); } + | qual_all_Op { $$ = (Node *) $1; } + | NumericOnly { $$ = (Node *) $1; } + | Sconst { $$ = (Node *) makeString($1); } + | NONE { $$ = (Node *) makeString(pstrdup($1)); } ; old_aggr_definition: '(' old_aggr_list ')' { $$ = $2; } @@ -6172,7 +6577,7 @@ old_aggr_list: old_aggr_elem { $$ = list_make1($1); } */ old_aggr_elem: IDENT '=' def_arg { - $$ = makeDefElem($1, (Node *)$3, @1); + $$ = makeDefElem($1, (Node *) $3, @1); } ; @@ -6197,6 +6602,7 @@ AlterEnumStmt: ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst { AlterEnumStmt *n = makeNode(AlterEnumStmt); + n->typeName = $3; n->oldVal = NULL; n->newVal = $7; @@ -6208,6 +6614,7 @@ AlterEnumStmt: | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst BEFORE Sconst { AlterEnumStmt *n = makeNode(AlterEnumStmt); + n->typeName = $3; n->oldVal = NULL; n->newVal = $7; @@ -6219,6 +6626,7 @@ AlterEnumStmt: | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst AFTER Sconst { AlterEnumStmt *n = makeNode(AlterEnumStmt); + n->typeName = $3; n->oldVal = NULL; n->newVal = $7; @@ -6230,6 +6638,7 @@ AlterEnumStmt: | ALTER TYPE_P any_name RENAME VALUE_P Sconst TO Sconst { AlterEnumStmt *n = makeNode(AlterEnumStmt); + n->typeName = $3; n->oldVal = $6; n->newVal = $8; @@ -6261,6 +6670,7 @@ CreateOpClassStmt: USING name opt_opfamily AS opclass_item_list { CreateOpClassStmt *n = makeNode(CreateOpClassStmt); + n->opclassname = $4; n->isDefault = $5; n->datatype = $8; @@ -6281,6 +6691,7 @@ opclass_item: { CreateOpClassItem *n = makeNode(CreateOpClassItem); ObjectWithArgs *owa = makeNode(ObjectWithArgs); + owa->objname = $3; owa->objargs = NIL; n->itemtype = OPCLASS_ITEM_OPERATOR; @@ -6293,6 +6704,7 @@ opclass_item: opt_recheck { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_OPERATOR; n->name = $3; n->number = $2; @@ -6302,6 +6714,7 @@ opclass_item: | FUNCTION Iconst function_with_argtypes { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_FUNCTION; n->name = $3; n->number = $2; @@ -6310,6 +6723,7 @@ opclass_item: | FUNCTION Iconst '(' type_list ')' function_with_argtypes { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_FUNCTION; n->name = $6; n->number = $2; @@ -6319,6 +6733,7 @@ opclass_item: | STORAGE Typename { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_STORAGETYPE; n->storedtype = $2; $$ = (Node *) n; @@ -6360,6 +6775,7 @@ CreateOpFamilyStmt: CREATE OPERATOR FAMILY any_name USING name { CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt); + n->opfamilyname = $4; n->amname = $6; $$ = (Node *) n; @@ -6370,6 +6786,7 @@ AlterOpFamilyStmt: ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list { AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt); + n->opfamilyname = $4; n->amname = $6; n->isDrop = false; @@ -6379,6 +6796,7 @@ AlterOpFamilyStmt: | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list { AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt); + n->opfamilyname = $4; n->amname = $6; n->isDrop = true; @@ -6396,6 +6814,7 @@ opclass_drop: OPERATOR Iconst '(' type_list ')' { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_OPERATOR; n->number = $2; n->class_args = $4; @@ -6404,6 +6823,7 @@ opclass_drop: | FUNCTION Iconst '(' type_list ')' { CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_FUNCTION; n->number = $2; n->class_args = $4; @@ -6416,6 +6836,7 @@ DropOpClassStmt: DROP OPERATOR CLASS any_name USING name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->objects = list_make1(lcons(makeString($6), $4)); n->removeType = OBJECT_OPCLASS; n->behavior = $7; @@ -6426,6 +6847,7 @@ DropOpClassStmt: | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->objects = list_make1(lcons(makeString($8), $6)); n->removeType = OBJECT_OPCLASS; n->behavior = $9; @@ -6439,6 +6861,7 @@ DropOpFamilyStmt: DROP OPERATOR FAMILY any_name USING name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->objects = list_make1(lcons(makeString($6), $4)); n->removeType = OBJECT_OPFAMILY; n->behavior = $7; @@ -6449,6 +6872,7 @@ DropOpFamilyStmt: | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->objects = list_make1(lcons(makeString($8), $6)); n->removeType = OBJECT_OPFAMILY; n->behavior = $9; @@ -6471,9 +6895,10 @@ DropOwnedStmt: DROP OWNED BY role_list opt_drop_behavior { DropOwnedStmt *n = makeNode(DropOwnedStmt); + n->roles = $4; n->behavior = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -6481,9 +6906,10 @@ ReassignOwnedStmt: REASSIGN OWNED BY role_list TO RoleSpec { ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt); + n->roles = $4; n->newrole = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -6499,46 +6925,51 @@ ReassignOwnedStmt: DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->missing_ok = true; n->objects = $5; n->behavior = $6; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP object_type_any_name any_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->missing_ok = false; n->objects = $3; n->behavior = $4; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->missing_ok = true; n->objects = $5; n->behavior = $6; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP drop_type_name name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->missing_ok = false; n->objects = $3; n->behavior = $4; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->objects = list_make1(lappend($5, makeString($3))); n->behavior = $6; @@ -6549,6 +6980,7 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = $2; n->objects = list_make1(lappend($7, makeString($5))); n->behavior = $8; @@ -6559,6 +6991,7 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP TYPE_P type_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_TYPE; n->missing_ok = false; n->objects = $3; @@ -6569,6 +7002,7 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_TYPE; n->missing_ok = true; n->objects = $5; @@ -6579,6 +7013,7 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP DOMAIN_P type_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_DOMAIN; n->missing_ok = false; n->objects = $3; @@ -6589,6 +7024,7 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_DOMAIN; n->missing_ok = true; n->objects = $5; @@ -6599,22 +7035,24 @@ DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_INDEX; n->missing_ok = false; n->objects = $4; n->behavior = $5; n->concurrent = true; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_INDEX; n->missing_ok = true; n->objects = $6; n->behavior = $7; n->concurrent = true; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP CHANGE STREAM qualified_name { @@ -6706,10 +7144,11 @@ TruncateStmt: TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior { TruncateStmt *n = makeNode(TruncateStmt); + n->relations = $3; n->restart_seqs = $4; n->behavior = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -6729,6 +7168,7 @@ CommentStmt: COMMENT ON object_type_any_name any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = $3; n->object = (Node *) $4; n->comment = $6; @@ -6737,6 +7177,7 @@ CommentStmt: | COMMENT ON COLUMN any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_COLUMN; n->object = (Node *) $4; n->comment = $6; @@ -6745,6 +7186,7 @@ CommentStmt: | COMMENT ON object_type_name name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = $3; n->object = (Node *) makeString($4); n->comment = $6; @@ -6753,6 +7195,7 @@ CommentStmt: | COMMENT ON TYPE_P Typename IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_TYPE; n->object = (Node *) $4; n->comment = $6; @@ -6761,6 +7204,7 @@ CommentStmt: | COMMENT ON DOMAIN_P Typename IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_DOMAIN; n->object = (Node *) $4; n->comment = $6; @@ -6769,6 +7213,7 @@ CommentStmt: | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_AGGREGATE; n->object = (Node *) $4; n->comment = $6; @@ -6777,6 +7222,7 @@ CommentStmt: | COMMENT ON FUNCTION function_with_argtypes IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_FUNCTION; n->object = (Node *) $4; n->comment = $6; @@ -6785,6 +7231,7 @@ CommentStmt: | COMMENT ON OPERATOR operator_with_argtypes IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_OPERATOR; n->object = (Node *) $4; n->comment = $6; @@ -6793,6 +7240,7 @@ CommentStmt: | COMMENT ON CONSTRAINT name ON any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_TABCONSTRAINT; n->object = (Node *) lappend($6, makeString($4)); n->comment = $8; @@ -6801,6 +7249,7 @@ CommentStmt: | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_DOMCONSTRAINT; /* * should use Typename not any_name in the production, but @@ -6814,6 +7263,7 @@ CommentStmt: | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = $3; n->object = (Node *) lappend($6, makeString($4)); n->comment = $8; @@ -6822,6 +7272,7 @@ CommentStmt: | COMMENT ON PROCEDURE function_with_argtypes IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_PROCEDURE; n->object = (Node *) $4; n->comment = $6; @@ -6830,6 +7281,7 @@ CommentStmt: | COMMENT ON ROUTINE function_with_argtypes IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_ROUTINE; n->object = (Node *) $4; n->comment = $6; @@ -6838,6 +7290,7 @@ CommentStmt: | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_TRANSFORM; n->object = (Node *) list_make2($5, makeString($7)); n->comment = $9; @@ -6846,6 +7299,7 @@ CommentStmt: | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_OPCLASS; n->object = (Node *) lcons(makeString($7), $5); n->comment = $9; @@ -6854,6 +7308,7 @@ CommentStmt: | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_OPFAMILY; n->object = (Node *) lcons(makeString($7), $5); n->comment = $9; @@ -6862,6 +7317,7 @@ CommentStmt: | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_LARGEOBJECT; n->object = (Node *) $5; n->comment = $7; @@ -6870,6 +7326,7 @@ CommentStmt: | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text { CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_CAST; n->object = (Node *) list_make2($5, $7); n->comment = $10; @@ -6897,6 +7354,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = $5; n->object = (Node *) $6; @@ -6907,6 +7365,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_COLUMN; n->object = (Node *) $6; @@ -6917,6 +7376,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = $5; n->object = (Node *) makeString($6); @@ -6927,6 +7387,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_TYPE; n->object = (Node *) $6; @@ -6937,6 +7398,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_DOMAIN; n->object = (Node *) $6; @@ -6947,6 +7409,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_AGGREGATE; n->object = (Node *) $6; @@ -6957,6 +7420,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_FUNCTION; n->object = (Node *) $6; @@ -6967,6 +7431,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_LARGEOBJECT; n->object = (Node *) $7; @@ -6977,6 +7442,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_PROCEDURE; n->object = (Node *) $6; @@ -6987,6 +7453,7 @@ SecLabelStmt: IS security_label { SecLabelStmt *n = makeNode(SecLabelStmt); + n->provider = $3; n->objtype = OBJECT_ROUTINE; n->object = (Node *) $6; @@ -7013,144 +7480,162 @@ security_label: Sconst { $$ = $1; } FetchStmt: FETCH fetch_args { FetchStmt *n = (FetchStmt *) $2; + n->ismove = false; - $$ = (Node *)n; + $$ = (Node *) n; } | MOVE fetch_args { FetchStmt *n = (FetchStmt *) $2; + n->ismove = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; fetch_args: cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $1; n->direction = FETCH_FORWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $2; n->direction = FETCH_FORWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | NEXT opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_FORWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | PRIOR opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_BACKWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | FIRST_P opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_ABSOLUTE; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | LAST_P opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_ABSOLUTE; n->howMany = -1; - $$ = (Node *)n; + $$ = (Node *) n; } | ABSOLUTE_P SignedIconst opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_ABSOLUTE; n->howMany = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | RELATIVE_P SignedIconst opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_RELATIVE; n->howMany = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | SignedIconst opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_FORWARD; n->howMany = $1; - $$ = (Node *)n; + $$ = (Node *) n; } | ALL opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_FORWARD; n->howMany = FETCH_ALL; - $$ = (Node *)n; + $$ = (Node *) n; } | FORWARD opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_FORWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | FORWARD SignedIconst opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_FORWARD; n->howMany = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | FORWARD ALL opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_FORWARD; n->howMany = FETCH_ALL; - $$ = (Node *)n; + $$ = (Node *) n; } | BACKWARD opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $3; n->direction = FETCH_BACKWARD; n->howMany = 1; - $$ = (Node *)n; + $$ = (Node *) n; } | BACKWARD SignedIconst opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_BACKWARD; n->howMany = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | BACKWARD ALL opt_from_in cursor_name { FetchStmt *n = makeNode(FetchStmt); + n->portalname = $4; n->direction = FETCH_BACKWARD; n->howMany = FETCH_ALL; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -7173,6 +7658,7 @@ GrantStmt: GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option opt_granted_by { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = true; n->privileges = $2; n->targtype = ($4)->targtype; @@ -7181,7 +7667,7 @@ GrantStmt: GRANT privileges ON privilege_target TO grantee_list n->grantees = $6; n->grant_option = $7; n->grantor = $8; - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -7190,6 +7676,7 @@ RevokeStmt: FROM grantee_list opt_granted_by opt_drop_behavior { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = false; n->grant_option = false; n->privileges = $2; @@ -7199,12 +7686,13 @@ RevokeStmt: n->grantees = $6; n->grantor = $7; n->behavior = $8; - $$ = (Node *)n; + $$ = (Node *) n; } | REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = false; n->grant_option = true; n->privileges = $5; @@ -7214,7 +7702,7 @@ RevokeStmt: n->grantees = $9; n->grantor = $10; n->behavior = $11; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -7237,6 +7725,7 @@ privileges: privilege_list | ALL '(' columnList ')' { AccessPriv *n = makeNode(AccessPriv); + n->priv_name = NULL; n->cols = $3; $$ = list_make1(n); @@ -7244,6 +7733,7 @@ privileges: privilege_list | ALL PRIVILEGES '(' columnList ')' { AccessPriv *n = makeNode(AccessPriv); + n->priv_name = NULL; n->cols = $4; $$ = list_make1(n); @@ -7257,6 +7747,7 @@ privilege_list: privilege { $$ = list_make1($1); } privilege: SELECT opt_column_list { AccessPriv *n = makeNode(AccessPriv); + n->priv_name = pstrdup($1); n->cols = $2; $$ = n; @@ -7264,6 +7755,7 @@ privilege: SELECT opt_column_list | REFERENCES opt_column_list { AccessPriv *n = makeNode(AccessPriv); + n->priv_name = pstrdup($1); n->cols = $2; $$ = n; @@ -7271,19 +7763,50 @@ privilege: SELECT opt_column_list | CREATE opt_column_list { AccessPriv *n = makeNode(AccessPriv); + n->priv_name = pstrdup($1); 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); + n->priv_name = $1; n->cols = $2; $$ = n; } ; +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. @@ -7292,6 +7815,7 @@ privilege_target: qualified_name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_TABLE; n->objs = $1; @@ -7300,6 +7824,7 @@ privilege_target: | TABLE qualified_name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_TABLE; n->objs = $2; @@ -7308,6 +7833,7 @@ privilege_target: | SEQUENCE qualified_name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_SEQUENCE; n->objs = $2; @@ -7316,6 +7842,7 @@ privilege_target: | FOREIGN DATA_P WRAPPER name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_FDW; n->objs = $4; @@ -7324,6 +7851,7 @@ privilege_target: | FOREIGN SERVER name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_FOREIGN_SERVER; n->objs = $3; @@ -7332,6 +7860,7 @@ privilege_target: | FUNCTION function_with_argtypes_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_FUNCTION; n->objs = $2; @@ -7340,6 +7869,7 @@ privilege_target: | PROCEDURE function_with_argtypes_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_PROCEDURE; n->objs = $2; @@ -7348,6 +7878,7 @@ privilege_target: | ROUTINE function_with_argtypes_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_ROUTINE; n->objs = $2; @@ -7356,6 +7887,7 @@ privilege_target: | DATABASE name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_DATABASE; n->objs = $2; @@ -7364,6 +7896,7 @@ privilege_target: | DOMAIN_P any_name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_DOMAIN; n->objs = $2; @@ -7372,6 +7905,7 @@ privilege_target: | LANGUAGE name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_LANGUAGE; n->objs = $2; @@ -7380,14 +7914,24 @@ privilege_target: | LARGE_P OBJECT_P NumericOnly_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_LARGEOBJECT; 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)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_SCHEMA; n->objs = $2; @@ -7396,6 +7940,7 @@ privilege_target: | TABLESPACE name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_TABLESPACE; n->objs = $2; @@ -7404,6 +7949,7 @@ privilege_target: | TYPE_P any_name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; n->objtype = OBJECT_TYPE; n->objs = $2; @@ -7420,6 +7966,7 @@ privilege_target: | ALL TABLES IN_P SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_ALL_IN_SCHEMA; n->objtype = OBJECT_TABLE; n->objs = $5; @@ -7428,6 +7975,7 @@ privilege_target: | ALL SEQUENCES IN_P SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_ALL_IN_SCHEMA; n->objtype = OBJECT_SEQUENCE; n->objs = $5; @@ -7436,6 +7984,7 @@ privilege_target: | ALL FUNCTIONS IN_P SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_ALL_IN_SCHEMA; n->objtype = OBJECT_FUNCTION; n->objs = $5; @@ -7444,6 +7993,7 @@ privilege_target: | ALL PROCEDURES IN_P SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_ALL_IN_SCHEMA; n->objtype = OBJECT_PROCEDURE; n->objs = $5; @@ -7452,6 +8002,7 @@ privilege_target: | ALL ROUTINES IN_P SCHEMA name_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_ALL_IN_SCHEMA; n->objtype = OBJECT_ROUTINE; n->objs = $5; @@ -7494,12 +8045,13 @@ GrantRoleStmt: GRANT privilege_list TO role_list opt_grant_admin_option opt_granted_by { GrantRoleStmt *n = makeNode(GrantRoleStmt); + n->is_grant = true; n->granted_roles = $2; n->grantee_roles = $4; n->admin_opt = $5; n->grantor = $6; - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -7507,22 +8059,24 @@ RevokeRoleStmt: REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior { GrantRoleStmt *n = makeNode(GrantRoleStmt); + n->is_grant = false; n->admin_opt = false; n->granted_roles = $2; n->grantee_roles = $4; n->behavior = $6; - $$ = (Node*)n; + $$ = (Node *) n; } | REVOKE ADMIN OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior { GrantRoleStmt *n = makeNode(GrantRoleStmt); + n->is_grant = false; n->admin_opt = true; n->granted_roles = $5; n->grantee_roles = $7; n->behavior = $9; - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -7544,9 +8098,10 @@ AlterDefaultPrivilegesStmt: ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction { AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt); + n->options = $4; n->action = (GrantStmt *) $5; - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -7558,15 +8113,15 @@ DefACLOptionList: DefACLOption: IN_P SCHEMA name_list { - $$ = makeDefElem("schemas", (Node *)$3, @1); + $$ = makeDefElem("schemas", (Node *) $3, @1); } | FOR ROLE role_list { - $$ = makeDefElem("roles", (Node *)$3, @1); + $$ = makeDefElem("roles", (Node *) $3, @1); } | FOR USER role_list { - $$ = makeDefElem("roles", (Node *)$3, @1); + $$ = makeDefElem("roles", (Node *) $3, @1); } ; @@ -7579,6 +8134,7 @@ DefACLAction: opt_grant_grant_option { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = true; n->privileges = $2; n->targtype = ACL_TARGET_DEFAULTS; @@ -7586,12 +8142,13 @@ DefACLAction: n->objects = NIL; n->grantees = $6; n->grant_option = $7; - $$ = (Node*)n; + $$ = (Node *) n; } | REVOKE privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = false; n->grant_option = false; n->privileges = $2; @@ -7600,12 +8157,13 @@ DefACLAction: n->objects = NIL; n->grantees = $6; n->behavior = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior { GrantStmt *n = makeNode(GrantStmt); + n->is_grant = false; n->grant_option = true; n->privileges = $5; @@ -7614,7 +8172,7 @@ DefACLAction: n->objects = NIL; n->grantees = $9; n->behavior = $10; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -7638,9 +8196,10 @@ defacl_privilege_target: IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name ON relation_expr access_method_clause '(' index_params ')' - opt_include opt_reloptions OptTableSpace OptInterleaveIndex where_clause + opt_include opt_unique_null_treatment opt_reloptions OptTableSpace OptInterleaveIndex where_clause { IndexStmt *n = makeNode(IndexStmt); + n->unique = $2; n->concurrent = $4; n->idxname = $5; @@ -7648,10 +8207,11 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->accessMethod = $8; n->indexParams = $10; n->indexIncludingParams = $12; - n->options = $13; - n->tableSpace = $14; - n->interleavespec = $15; - n->whereClause = $16; + n->nulls_not_distinct = !$13; + n->options = $14; + n->tableSpace = $15; + n->interleavespec = $16; + n->whereClause = $17; n->excludeOpNames = NIL; n->idxcomment = NULL; n->indexOid = InvalidOid; @@ -7665,13 +8225,14 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->transformed = false; n->if_not_exists = false; n->reset_default_tblspc = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name ON relation_expr access_method_clause '(' index_params ')' - opt_include opt_reloptions OptTableSpace OptInterleaveIndex where_clause + opt_include opt_unique_null_treatment opt_reloptions OptTableSpace OptInterleaveIndex where_clause { IndexStmt *n = makeNode(IndexStmt); + n->unique = $2; n->concurrent = $4; n->idxname = $8; @@ -7679,10 +8240,11 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->accessMethod = $11; n->indexParams = $13; n->indexIncludingParams = $15; - n->options = $16; - n->tableSpace = $17; - n->interleavespec = $18; - n->whereClause = $19; + n->nulls_not_distinct = !$16; + n->options = $17; + n->tableSpace = $18; + n->interleavespec = $19; + n->whereClause = $20; n->excludeOpNames = NIL; n->idxcomment = NULL; n->indexOid = InvalidOid; @@ -7696,7 +8258,7 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->transformed = false; n->if_not_exists = true; n->reset_default_tblspc = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -7817,6 +8379,7 @@ CreateFunctionStmt: RETURNS func_return opt_createfunc_opt_list opt_routine_body { CreateFunctionStmt *n = makeNode(CreateFunctionStmt); + n->is_procedure = false; n->replace = $2; n->funcname = $4; @@ -7824,12 +8387,13 @@ CreateFunctionStmt: n->returnType = $7; n->options = $8; n->sql_body = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body { CreateFunctionStmt *n = makeNode(CreateFunctionStmt); + n->is_procedure = false; n->replace = $2; n->funcname = $4; @@ -7838,12 +8402,13 @@ CreateFunctionStmt: n->returnType->location = @7; n->options = $11; n->sql_body = $12; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body { CreateFunctionStmt *n = makeNode(CreateFunctionStmt); + n->is_procedure = false; n->replace = $2; n->funcname = $4; @@ -7851,12 +8416,13 @@ CreateFunctionStmt: n->returnType = NULL; n->options = $6; n->sql_body = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body { CreateFunctionStmt *n = makeNode(CreateFunctionStmt); + n->is_procedure = true; n->replace = $2; n->funcname = $4; @@ -7864,7 +8430,7 @@ CreateFunctionStmt: n->returnType = NULL; n->options = $6; n->sql_body = $7; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -7892,6 +8458,7 @@ function_with_argtypes: func_name func_args { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = $1; n->objargs = extractArgTypes($2); n->objfuncargs = $2; @@ -7905,6 +8472,7 @@ function_with_argtypes: | type_func_name_keyword { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = list_make1(makeString(pstrdup($1))); n->args_unspecified = true; $$ = n; @@ -7912,6 +8480,7 @@ function_with_argtypes: | ColId { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = list_make1(makeString($1)); n->args_unspecified = true; $$ = n; @@ -7919,6 +8488,7 @@ function_with_argtypes: | ColId indirection { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = check_func_name(lcons(makeString($1), $2), yyscanner); n->args_unspecified = true; @@ -7955,6 +8525,7 @@ func_arg: arg_class param_name func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = $2; n->argType = $3; n->mode = $1; @@ -7964,6 +8535,7 @@ func_arg: | param_name arg_class func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = $1; n->argType = $3; n->mode = $2; @@ -7973,6 +8545,7 @@ func_arg: | param_name func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = $1; n->argType = $2; n->mode = FUNC_PARAM_DEFAULT; @@ -7982,6 +8555,7 @@ func_arg: | arg_class func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = NULL; n->argType = $2; n->mode = $1; @@ -7991,6 +8565,7 @@ func_arg: | func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = NULL; n->argType = $1; n->mode = FUNC_PARAM_DEFAULT; @@ -8097,8 +8672,8 @@ aggr_arg: func_arg * * The return value of this production is a two-element list, in which the * first item is a sublist of FunctionParameter nodes (with any duplicate - * VARIADIC item already dropped, as per above) and the second is an integer - * Value node, containing -1 if there was no ORDER BY and otherwise the number + * VARIADIC item already dropped, as per above) and the second is an Integer + * node, containing -1 if there was no ORDER BY and otherwise the number * of argument declarations before the ORDER BY. (If this number is equal * to the first sublist's length, then we dropped a duplicate VARIADIC item.) * This representation is passed as-is to CREATE AGGREGATE; for operations @@ -8133,6 +8708,7 @@ aggregate_with_argtypes: func_name aggr_args { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = $1; n->objargs = extractAggrArgTypes($2); n->objfuncargs = (List *) linitial($2); @@ -8163,91 +8739,91 @@ createfunc_opt_list: common_func_opt_item: CALLED ON NULL_P INPUT_P { - $$ = makeDefElem("strict", (Node *)makeInteger(false), @1); + $$ = makeDefElem("strict", (Node *) makeBoolean(false), @1); } | RETURNS NULL_P ON NULL_P INPUT_P { - $$ = makeDefElem("strict", (Node *)makeInteger(true), @1); + $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1); } | STRICT_P { - $$ = makeDefElem("strict", (Node *)makeInteger(true), @1); + $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1); } | IMMUTABLE { - $$ = makeDefElem("volatility", (Node *)makeString("immutable"), @1); + $$ = makeDefElem("volatility", (Node *) makeString("immutable"), @1); } | STABLE { - $$ = makeDefElem("volatility", (Node *)makeString("stable"), @1); + $$ = makeDefElem("volatility", (Node *) makeString("stable"), @1); } | VOLATILE { - $$ = makeDefElem("volatility", (Node *)makeString("volatile"), @1); + $$ = makeDefElem("volatility", (Node *) makeString("volatile"), @1); } | EXTERNAL SECURITY DEFINER { - $$ = makeDefElem("security", (Node *)makeInteger(true), @1); + $$ = makeDefElem("security", (Node *) makeBoolean(true), @1); } | EXTERNAL SECURITY INVOKER { - $$ = makeDefElem("security", (Node *)makeInteger(false), @1); + $$ = makeDefElem("security", (Node *) makeBoolean(false), @1); } | SECURITY DEFINER { - $$ = makeDefElem("security", (Node *)makeInteger(true), @1); + $$ = makeDefElem("security", (Node *) makeBoolean(true), @1); } | SECURITY INVOKER { - $$ = makeDefElem("security", (Node *)makeInteger(false), @1); + $$ = makeDefElem("security", (Node *) makeBoolean(false), @1); } | LEAKPROOF { - $$ = makeDefElem("leakproof", (Node *)makeInteger(true), @1); + $$ = makeDefElem("leakproof", (Node *) makeBoolean(true), @1); } | NOT LEAKPROOF { - $$ = makeDefElem("leakproof", (Node *)makeInteger(false), @1); + $$ = makeDefElem("leakproof", (Node *) makeBoolean(false), @1); } | COST NumericOnly { - $$ = makeDefElem("cost", (Node *)$2, @1); + $$ = makeDefElem("cost", (Node *) $2, @1); } | ROWS NumericOnly { - $$ = makeDefElem("rows", (Node *)$2, @1); + $$ = makeDefElem("rows", (Node *) $2, @1); } | SUPPORT any_name { - $$ = makeDefElem("support", (Node *)$2, @1); + $$ = makeDefElem("support", (Node *) $2, @1); } | FunctionSetResetClause { /* we abuse the normal content of a DefElem here */ - $$ = makeDefElem("set", (Node *)$1, @1); + $$ = makeDefElem("set", (Node *) $1, @1); } | PARALLEL ColId { - $$ = makeDefElem("parallel", (Node *)makeString($2), @1); + $$ = makeDefElem("parallel", (Node *) makeString($2), @1); } ; createfunc_opt_item: AS func_as { - $$ = makeDefElem("as", (Node *)$2, @1); + $$ = makeDefElem("as", (Node *) $2, @1); } | LANGUAGE NonReservedWord_or_Sconst { - $$ = makeDefElem("language", (Node *)makeString($2), @1); + $$ = makeDefElem("language", (Node *) makeString($2), @1); } | TRANSFORM transform_type_list { - $$ = makeDefElem("transform", (Node *)$2, @1); + $$ = makeDefElem("transform", (Node *) $2, @1); } | WINDOW { - $$ = makeDefElem("window", (Node *)makeInteger(true), @1); + $$ = makeDefElem("window", (Node *) makeBoolean(true), @1); } | common_func_opt_item { @@ -8265,6 +8841,7 @@ func_as: Sconst { $$ = list_make1(makeString($1)); } ReturnStmt: RETURN a_expr { ReturnStmt *r = makeNode(ReturnStmt); + r->returnval = (Node *) $2; $$ = (Node *) r; } @@ -8324,6 +8901,7 @@ opt_definition: table_func_column: param_name func_type { FunctionParameter *n = makeNode(FunctionParameter); + n->name = $1; n->argType = $2; n->mode = FUNC_PARAM_TABLE; @@ -8355,6 +8933,7 @@ AlterFunctionStmt: ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict { AlterFunctionStmt *n = makeNode(AlterFunctionStmt); + n->objtype = OBJECT_FUNCTION; n->func = $3; n->actions = $4; @@ -8363,6 +8942,7 @@ AlterFunctionStmt: | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict { AlterFunctionStmt *n = makeNode(AlterFunctionStmt); + n->objtype = OBJECT_PROCEDURE; n->func = $3; n->actions = $4; @@ -8371,6 +8951,7 @@ AlterFunctionStmt: | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict { AlterFunctionStmt *n = makeNode(AlterFunctionStmt); + n->objtype = OBJECT_ROUTINE; n->func = $3; n->actions = $4; @@ -8407,62 +8988,68 @@ RemoveFuncStmt: DROP FUNCTION function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_FUNCTION; n->objects = $3; n->behavior = $4; n->missing_ok = false; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_FUNCTION; n->objects = $5; n->behavior = $6; n->missing_ok = true; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_PROCEDURE; n->objects = $3; n->behavior = $4; n->missing_ok = false; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_PROCEDURE; n->objects = $5; n->behavior = $6; n->missing_ok = true; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP ROUTINE function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_ROUTINE; n->objects = $3; n->behavior = $4; n->missing_ok = false; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_ROUTINE; n->objects = $5; n->behavior = $6; n->missing_ok = true; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8470,22 +9057,24 @@ RemoveAggrStmt: DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_AGGREGATE; n->objects = $3; n->behavior = $4; n->missing_ok = false; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_AGGREGATE; n->objects = $5; n->behavior = $6; n->missing_ok = true; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8493,22 +9082,24 @@ RemoveOperStmt: DROP OPERATOR operator_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_OPERATOR; n->objects = $3; n->behavior = $4; n->missing_ok = false; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_OPERATOR; n->objects = $5; n->behavior = $6; n->missing_ok = true; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8546,6 +9137,7 @@ operator_with_argtypes: any_operator oper_argtypes { ObjectWithArgs *n = makeNode(ObjectWithArgs); + n->objname = $1; n->objargs = $2; $$ = n; @@ -8564,8 +9156,9 @@ operator_with_argtypes: DoStmt: DO dostmt_opt_list { DoStmt *n = makeNode(DoStmt); + n->args = $2; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8577,11 +9170,11 @@ dostmt_opt_list: dostmt_opt_item: Sconst { - $$ = makeDefElem("as", (Node *)makeString($1), @1); + $$ = makeDefElem("as", (Node *) makeString($1), @1); } | LANGUAGE NonReservedWord_or_Sconst { - $$ = makeDefElem("language", (Node *)makeString($2), @1); + $$ = makeDefElem("language", (Node *) makeString($2), @1); } ; @@ -8595,34 +9188,37 @@ CreateCastStmt: CREATE CAST '(' Typename AS Typename ')' WITH FUNCTION function_with_argtypes cast_context { CreateCastStmt *n = makeNode(CreateCastStmt); + n->sourcetype = $4; n->targettype = $6; n->func = $10; n->context = (CoercionContext) $11; n->inout = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE CAST '(' Typename AS Typename ')' WITHOUT FUNCTION cast_context { CreateCastStmt *n = makeNode(CreateCastStmt); + n->sourcetype = $4; n->targettype = $6; n->func = NULL; n->context = (CoercionContext) $10; n->inout = false; - $$ = (Node *)n; + $$ = (Node *) n; } | CREATE CAST '(' Typename AS Typename ')' WITH INOUT cast_context { CreateCastStmt *n = makeNode(CreateCastStmt); + n->sourcetype = $4; n->targettype = $6; n->func = NULL; n->context = (CoercionContext) $10; n->inout = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8635,12 +9231,13 @@ cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; } DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_CAST; n->objects = list_make1(list_make2($5, $7)); n->behavior = $9; n->missing_ok = $3; n->concurrent = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8658,12 +9255,13 @@ opt_if_exists: IF_P EXISTS { $$ = true; } CreateTransformStmt: CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')' { CreateTransformStmt *n = makeNode(CreateTransformStmt); + n->replace = $2; n->type_name = $5; n->lang = $7; n->fromsql = linitial($9); n->tosql = lsecond($9); - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8689,11 +9287,12 @@ transform_element_list: FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO S DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior { DropStmt *n = makeNode(DropStmt); + n->removeType = OBJECT_TRANSFORM; n->objects = list_make1(list_make2($5, makeString($7))); n->behavior = $8; n->missing_ok = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8709,50 +9308,54 @@ ReindexStmt: REINDEX reindex_target_type opt_concurrently qualified_name { ReindexStmt *n = makeNode(ReindexStmt); + n->kind = $2; n->relation = $4; n->name = NULL; n->params = NIL; if ($3) n->params = lappend(n->params, - makeDefElem("concurrently", NULL, @3)); - $$ = (Node *)n; + makeDefElem("concurrently", NULL, @3)); + $$ = (Node *) n; } | REINDEX reindex_target_multitable opt_concurrently name { ReindexStmt *n = makeNode(ReindexStmt); + n->kind = $2; n->name = $4; n->relation = NULL; n->params = NIL; if ($3) n->params = lappend(n->params, - makeDefElem("concurrently", NULL, @3)); - $$ = (Node *)n; + makeDefElem("concurrently", NULL, @3)); + $$ = (Node *) n; } | REINDEX '(' utility_option_list ')' reindex_target_type opt_concurrently qualified_name { ReindexStmt *n = makeNode(ReindexStmt); + n->kind = $5; n->relation = $7; n->name = NULL; n->params = $3; if ($6) n->params = lappend(n->params, - makeDefElem("concurrently", NULL, @6)); - $$ = (Node *)n; + makeDefElem("concurrently", NULL, @6)); + $$ = (Node *) n; } | REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name { ReindexStmt *n = makeNode(ReindexStmt); + n->kind = $5; n->name = $7; n->relation = NULL; n->params = $3; if ($6) n->params = lappend(n->params, - makeDefElem("concurrently", NULL, @6)); - $$ = (Node *)n; + makeDefElem("concurrently", NULL, @6)); + $$ = (Node *) n; } ; reindex_target_type: @@ -8776,19 +9379,21 @@ AlterTblSpcStmt: { AlterTableSpaceOptionsStmt *n = makeNode(AlterTableSpaceOptionsStmt); + n->tablespacename = $3; n->options = $5; n->isReset = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLESPACE name RESET reloptions { AlterTableSpaceOptionsStmt *n = makeNode(AlterTableSpaceOptionsStmt); + n->tablespacename = $3; n->options = $5; n->isReset = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -8838,195 +9443,216 @@ rename_op: ALTER TABLE relation_expr RENAME TO name RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_AGGREGATE; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER COLLATION any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLLATION; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER CONVERSION_P any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_CONVERSION; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DATABASE name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_DATABASE; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DOMAIN_P any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_DOMAIN; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_DOMCONSTRAINT; n->object = (Node *) $3; n->subname = $6; n->newname = $8; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FDW; n->object = (Node *) makeString($5); n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FUNCTION function_with_argtypes RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FUNCTION; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER GROUP_P RoleId RENAME TO RoleId { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER opt_procedural LANGUAGE name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_LANGUAGE; n->object = (Node *) makeString($4); n->newname = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR CLASS any_name USING name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_OPCLASS; n->object = (Node *) lcons(makeString($6), $4); n->newname = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR FAMILY any_name USING name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_OPFAMILY; n->object = (Node *) lcons(makeString($6), $4); n->newname = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER POLICY name ON qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_POLICY; n->relation = $5; n->subname = $3; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_POLICY; n->relation = $7; n->subname = $5; n->newname = $10; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PROCEDURE function_with_argtypes RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_PROCEDURE; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PUBLICATION name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_PUBLICATION; n->object = (Node *) makeString($3); n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROUTINE function_with_argtypes RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ROUTINE; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SCHEMA name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_SCHEMA; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SERVER name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FOREIGN_SERVER; n->object = (Node *) makeString($3); n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_SUBSCRIPTION; n->object = (Node *) makeString($3); n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABLE; n->relation = $3; n->subname = NULL; n->newname = $6; n->missing_ok = false; n->addSynonym = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr RENAME WITH SYNONYM TO name { @@ -9037,18 +9663,19 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name n->newname = $8; n->missing_ok = false; n->addSynonym = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABLE; n->relation = $5; n->subname = NULL; n->newname = $8; n->missing_ok = true; n->addSynonym = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr RENAME WITH SYNONYM TO name { @@ -9059,328 +9686,361 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name n->newname = $10; n->missing_ok = true; n->addSynonym = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_SEQUENCE; n->relation = $3; n->subname = NULL; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_SEQUENCE; n->relation = $5; n->subname = NULL; n->newname = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_VIEW; n->relation = $3; n->subname = NULL; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_VIEW; n->relation = $5; n->subname = NULL; n->newname = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_MATVIEW; n->relation = $4; n->subname = NULL; n->newname = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_MATVIEW; n->relation = $6; n->subname = NULL; n->newname = $9; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_INDEX; n->relation = $3; n->subname = NULL; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_INDEX; n->relation = $5; n->subname = NULL; n->newname = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE relation_expr RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FOREIGN_TABLE; n->relation = $4; n->subname = NULL; n->newname = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FOREIGN_TABLE; n->relation = $6; n->subname = NULL; n->newname = $9; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_TABLE; n->relation = $3; n->subname = $6; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_TABLE; n->relation = $5; n->subname = $8; n->newname = $10; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW qualified_name RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_VIEW; n->relation = $3; n->subname = $6; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_VIEW; n->relation = $5; n->subname = $8; n->newname = $10; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_MATVIEW; n->relation = $4; n->subname = $7; n->newname = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_MATVIEW; n->relation = $6; n->subname = $9; n->newname = $11; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABCONSTRAINT; n->relation = $3; n->subname = $6; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABCONSTRAINT; n->relation = $5; n->subname = $8; n->newname = $10; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_FOREIGN_TABLE; n->relation = $4; n->subname = $7; n->newname = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; n->relationType = OBJECT_FOREIGN_TABLE; n->relation = $6; n->subname = $9; n->newname = $11; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER RULE name ON qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_RULE; n->relation = $5; n->subname = $3; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TRIGGER name ON qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TRIGGER; n->relation = $5; n->subname = $3; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EVENT TRIGGER name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_EVENT_TRIGGER; n->object = (Node *) makeString($4); n->newname = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROLE RoleId RENAME TO RoleId { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER USER RoleId RENAME TO RoleId { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ROLE; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLESPACE name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TABLESPACE; n->subname = $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER STATISTICS any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_STATISTIC_EXT; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TSPARSER; n->object = (Node *) $5; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TSDICTIONARY; n->object = (Node *) $5; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TSTEMPLATE; n->object = (Node *) $5; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TSCONFIGURATION; n->object = (Node *) $5; n->newname = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TYPE_P any_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_TYPE; n->object = (Node *) $3; n->newname = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior { RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_ATTRIBUTE; n->relationType = OBJECT_TYPE; n->relation = makeRangeVarFromAnyName($3, @3, yyscanner); @@ -9388,7 +10048,7 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name n->newname = $8; n->behavior = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -9410,57 +10070,63 @@ AlterObjectDependsStmt: ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_FUNCTION; n->object = (Node *) $3; n->extname = makeString($8); n->remove = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_PROCEDURE; n->object = (Node *) $3; n->extname = makeString($8); n->remove = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_ROUTINE; n->object = (Node *) $3; n->extname = makeString($8); n->remove = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_TRIGGER; n->relation = $5; n->object = (Node *) list_make1(makeString($3)); n->extname = makeString($10); n->remove = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_MATVIEW; n->relation = $4; n->extname = makeString($9); n->remove = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name { AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt); + n->objectType = OBJECT_INDEX; n->relation = $3; n->extname = makeString($8); n->remove = $4; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -9478,245 +10144,272 @@ AlterObjectSchemaStmt: ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_AGGREGATE; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER COLLATION any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_COLLATION; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER CONVERSION_P any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_CONVERSION; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DOMAIN_P any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_DOMAIN; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EXTENSION name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_EXTENSION; n->object = (Node *) makeString($3); n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FUNCTION function_with_argtypes SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_FUNCTION; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR operator_with_argtypes SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_OPERATOR; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_OPCLASS; n->object = (Node *) lcons(makeString($6), $4); n->newschema = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_OPFAMILY; n->object = (Node *) lcons(makeString($6), $4); n->newschema = $9; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PROCEDURE function_with_argtypes SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_PROCEDURE; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROUTINE function_with_argtypes SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_ROUTINE; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE relation_expr SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TABLE; n->relation = $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TABLE; n->relation = $5; n->newschema = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER STATISTICS any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_STATISTIC_EXT; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TSPARSER; n->object = (Node *) $5; n->newschema = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TSDICTIONARY; n->object = (Node *) $5; n->newschema = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TSTEMPLATE; n->object = (Node *) $5; n->newschema = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TSCONFIGURATION; n->object = (Node *) $5; n->newschema = $8; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_SEQUENCE; n->relation = $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_SEQUENCE; n->relation = $5; n->newschema = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_VIEW; n->relation = $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_VIEW; n->relation = $5; n->newschema = $8; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_MATVIEW; n->relation = $4; n->newschema = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_MATVIEW; n->relation = $6; n->newschema = $9; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE relation_expr SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_FOREIGN_TABLE; n->relation = $4; n->newschema = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_FOREIGN_TABLE; n->relation = $6; n->newschema = $9; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TYPE_P any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_TYPE; n->object = (Node *) $3; n->newschema = $6; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -9730,9 +10423,10 @@ AlterOperatorStmt: ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')' { AlterOperatorStmt *n = makeNode(AlterOperatorStmt); + n->opername = $3; n->options = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -9748,11 +10442,11 @@ operator_def_elem: ColLabel '=' NONE /* must be similar enough to def_arg to avoid reduce/reduce conflicts */ operator_def_arg: - func_type { $$ = (Node *)$1; } - | reserved_keyword { $$ = (Node *)makeString(pstrdup($1)); } - | qual_all_Op { $$ = (Node *)$1; } - | NumericOnly { $$ = (Node *)$1; } - | Sconst { $$ = (Node *)makeString($1); } + func_type { $$ = (Node *) $1; } + | reserved_keyword { $$ = (Node *) makeString(pstrdup($1)); } + | qual_all_Op { $$ = (Node *) $1; } + | NumericOnly { $$ = (Node *) $1; } + | Sconst { $$ = (Node *) makeString($1); } ; /***************************************************************************** @@ -9767,9 +10461,10 @@ AlterTypeStmt: ALTER TYPE_P any_name SET '(' operator_def_list ')' { AlterTypeStmt *n = makeNode(AlterTypeStmt); + n->typeName = $3; n->options = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -9782,249 +10477,378 @@ AlterTypeStmt: AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_AGGREGATE; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER COLLATION any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_COLLATION; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER CONVERSION_P any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_CONVERSION; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DATABASE name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_DATABASE; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DOMAIN_P any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_DOMAIN; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_FUNCTION; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_LANGUAGE; n->object = (Node *) makeString($4); n->newowner = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_LARGEOBJECT; n->object = (Node *) $4; n->newowner = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_OPERATOR; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_OPCLASS; n->object = (Node *) lcons(makeString($6), $4); n->newowner = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_OPFAMILY; n->object = (Node *) lcons(makeString($6), $4); n->newowner = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_PROCEDURE; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_ROUTINE; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SCHEMA name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_SCHEMA; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TYPE_P any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_TYPE; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TABLESPACE name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_TABLESPACE; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER STATISTICS any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_STATISTIC_EXT; n->object = (Node *) $3; n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_TSDICTIONARY; n->object = (Node *) $5; n->newowner = $8; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_TSCONFIGURATION; n->object = (Node *) $5; n->newowner = $8; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_FDW; n->object = (Node *) makeString($5); n->newowner = $8; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SERVER name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_FOREIGN_SERVER; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER EVENT TRIGGER name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_EVENT_TRIGGER; n->object = (Node *) makeString($4); n->newowner = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER PUBLICATION name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_PUBLICATION; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name OWNER TO RoleSpec { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_SUBSCRIPTION; n->object = (Node *) makeString($3); n->newowner = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; /***************************************************************************** * - * CREATE PUBLICATION name [ FOR TABLE ] [ WITH options ] + * CREATE PUBLICATION name [WITH options] + * + * CREATE PUBLICATION FOR ALL TABLES [WITH options] + * + * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options] + * + * pub_obj is one of: + * + * TABLE table [, ...] + * TABLES IN SCHEMA schema [, ...] * *****************************************************************************/ CreatePublicationStmt: - CREATE PUBLICATION name opt_publication_for_tables opt_definition + CREATE PUBLICATION name opt_definition { CreatePublicationStmt *n = makeNode(CreatePublicationStmt); + n->pubname = $3; - n->options = $5; - if ($4 != NULL) - { - /* FOR TABLE */ - if (IsA($4, List)) - n->tables = (List *)$4; - /* FOR ALL TABLES */ - else - n->for_all_tables = true; - } - $$ = (Node *)n; + n->options = $4; + $$ = (Node *) n; } - ; + | CREATE PUBLICATION name FOR ALL TABLES opt_definition + { + CreatePublicationStmt *n = makeNode(CreatePublicationStmt); -opt_publication_for_tables: - publication_for_tables { $$ = $1; } - | /* EMPTY */ { $$ = NULL; } + n->pubname = $3; + n->options = $7; + n->for_all_tables = true; + $$ = (Node *) n; + } + | CREATE PUBLICATION name FOR pub_obj_list opt_definition + { + CreatePublicationStmt *n = makeNode(CreatePublicationStmt); + + n->pubname = $3; + n->options = $6; + n->pubobjects = (List *) $5; + preprocess_pubobj_list(n->pubobjects, yyscanner); + $$ = (Node *) n; + } ; -publication_for_tables: - FOR TABLE relation_expr_list +/* + * FOR TABLE and FOR TABLES IN SCHEMA specifications + * + * This rule parses publication objects with and without keyword prefixes. + * + * The actual type of the object without keyword prefix depends on the previous + * one with keyword prefix. It will be preprocessed in preprocess_pubobj_list(). + * + * For the object without keyword prefix, we cannot just use relation_expr here, + * because some extended expressions in relation_expr cannot be used as a + * schemaname and we cannot differentiate it. So, we extract the rules from + * relation_expr here. + */ +PublicationObjSpec: + TABLE relation_expr opt_column_list OptWhereClause { - $$ = (Node *) $3; + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_TABLE; + $$->pubtable = makeNode(PublicationTable); + $$->pubtable->relation = $2; + $$->pubtable->columns = $3; + $$->pubtable->whereClause = $4; } - | FOR ALL TABLES + | TABLES IN_P SCHEMA ColId { - $$ = (Node *) makeInteger(true); + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA; + $$->name = $4; + $$->location = @4; } - ; + | TABLES IN_P SCHEMA CURRENT_SCHEMA + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; + $$->location = @4; + } + | ColId opt_column_list OptWhereClause + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; + /* + * 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 + * 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->columns = $2; + $$->pubtable->whereClause = $3; + } + else + { + $$->name = $1; + } + $$->location = @1; + } + | ColId indirection opt_column_list OptWhereClause + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; + $$->pubtable = makeNode(PublicationTable); + $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); + $$->pubtable->columns = $3; + $$->pubtable->whereClause = $4; + $$->location = @1; + } + /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */ + | extended_relation_expr opt_column_list OptWhereClause + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; + $$->pubtable = makeNode(PublicationTable); + $$->pubtable->relation = $1; + $$->pubtable->columns = $2; + $$->pubtable->whereClause = $3; + } + | CURRENT_SCHEMA + { + $$ = makeNode(PublicationObjSpec); + $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION; + $$->location = @1; + } + ; +pub_obj_list: PublicationObjSpec + { $$ = list_make1($1); } + | pub_obj_list ',' PublicationObjSpec + { $$ = lappend($1, $3); } + ; /***************************************************************************** * * ALTER PUBLICATION name SET ( options ) * - * ALTER PUBLICATION name ADD TABLE table [, table2] + * ALTER PUBLICATION name ADD pub_obj [, ...] + * + * ALTER PUBLICATION name DROP pub_obj [, ...] * - * ALTER PUBLICATION name DROP TABLE table [, table2] + * ALTER PUBLICATION name SET pub_obj [, ...] * - * ALTER PUBLICATION name SET TABLE table [, table2] + * pub_obj is one of: + * + * TABLE table_name [, ...] + * TABLES IN SCHEMA schema_name [, ...] * *****************************************************************************/ @@ -10032,33 +10856,40 @@ AlterPublicationStmt: ALTER PUBLICATION name SET definition { AlterPublicationStmt *n = makeNode(AlterPublicationStmt); + n->pubname = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } - | ALTER PUBLICATION name ADD_P TABLE relation_expr_list + | ALTER PUBLICATION name ADD_P pub_obj_list { AlterPublicationStmt *n = makeNode(AlterPublicationStmt); + n->pubname = $3; - n->tables = $6; - n->tableAction = DEFELEM_ADD; - $$ = (Node *)n; + n->pubobjects = $5; + preprocess_pubobj_list(n->pubobjects, yyscanner); + n->action = AP_AddObjects; + $$ = (Node *) n; } - | ALTER PUBLICATION name SET TABLE relation_expr_list + | ALTER PUBLICATION name SET pub_obj_list { AlterPublicationStmt *n = makeNode(AlterPublicationStmt); + n->pubname = $3; - n->tables = $6; - n->tableAction = DEFELEM_SET; - $$ = (Node *)n; + n->pubobjects = $5; + preprocess_pubobj_list(n->pubobjects, yyscanner); + n->action = AP_SetObjects; + $$ = (Node *) n; } - | ALTER PUBLICATION name DROP TABLE relation_expr_list + | ALTER PUBLICATION name DROP pub_obj_list { AlterPublicationStmt *n = makeNode(AlterPublicationStmt); + n->pubname = $3; - n->tables = $6; - n->tableAction = DEFELEM_DROP; - $$ = (Node *)n; + n->pubobjects = $5; + preprocess_pubobj_list(n->pubobjects, yyscanner); + n->action = AP_DropObjects; + $$ = (Node *) n; } ; @@ -10077,7 +10908,7 @@ CreateSubscriptionStmt: n->conninfo = $5; n->publication = $7; n->options = $8; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10092,78 +10923,96 @@ AlterSubscriptionStmt: { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_OPTIONS; n->subname = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name CONNECTION Sconst { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_CONNECTION; n->subname = $3; n->conninfo = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_REFRESH; n->subname = $3; n->options = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_ADD_PUBLICATION; n->subname = $3; n->publication = $6; n->options = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_DROP_PUBLICATION; n->subname = $3; n->publication = $6; n->options = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_SET_PUBLICATION; n->subname = $3; n->publication = $6; n->options = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SUBSCRIPTION name ENABLE_P { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_ENABLED; n->subname = $3; n->options = list_make1(makeDefElem("enabled", - (Node *)makeInteger(true), @1)); - $$ = (Node *)n; + (Node *) makeBoolean(true), @1)); + $$ = (Node *) n; } | ALTER SUBSCRIPTION name DISABLE_P { AlterSubscriptionStmt *n = makeNode(AlterSubscriptionStmt); + n->kind = ALTER_SUBSCRIPTION_ENABLED; n->subname = $3; n->options = list_make1(makeDefElem("enabled", - (Node *)makeInteger(false), @1)); - $$ = (Node *)n; + (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; } ; @@ -10176,6 +11025,7 @@ AlterSubscriptionStmt: DropSubscriptionStmt: DROP SUBSCRIPTION name opt_drop_behavior { DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt); + n->subname = $3; n->missing_ok = false; n->behavior = $4; @@ -10184,6 +11034,7 @@ DropSubscriptionStmt: DROP SUBSCRIPTION name opt_drop_behavior | DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior { DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt); + n->subname = $5; n->missing_ok = true; n->behavior = $6; @@ -10325,7 +11176,8 @@ RuleStmt: CREATE opt_or_replace RULE name AS ON event TO qualified_name where_clause DO opt_instead RuleActionList { - RuleStmt *n = makeNode(RuleStmt); + RuleStmt *n = makeNode(RuleStmt); + n->replace = $2; n->relation = $9; n->rulename = $4; @@ -10333,7 +11185,7 @@ RuleStmt: CREATE opt_or_replace RULE name AS n->event = $7; n->instead = $12; n->actions = $13; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10396,9 +11248,10 @@ opt_instead: NotifyStmt: NOTIFY ColId notify_payload { NotifyStmt *n = makeNode(NotifyStmt); + n->conditionname = $2; n->payload = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10410,8 +11263,9 @@ notify_payload: ListenStmt: LISTEN ColId { ListenStmt *n = makeNode(ListenStmt); + n->conditionname = $2; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10419,14 +11273,16 @@ UnlistenStmt: UNLISTEN ColId { UnlistenStmt *n = makeNode(UnlistenStmt); + n->conditionname = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | UNLISTEN '*' { UnlistenStmt *n = makeNode(UnlistenStmt); + n->conditionname = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10444,89 +11300,101 @@ TransactionStmt: ABORT_P opt_transaction opt_transaction_chain { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_ROLLBACK; n->options = NIL; n->chain = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | START TRANSACTION transaction_mode_list_or_empty { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_START; n->options = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | COMMIT opt_transaction opt_transaction_chain { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_COMMIT; n->options = NIL; n->chain = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | ROLLBACK opt_transaction opt_transaction_chain { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_ROLLBACK; n->options = NIL; n->chain = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | SAVEPOINT ColId { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_SAVEPOINT; n->savepoint_name = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | RELEASE SAVEPOINT ColId { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_RELEASE; n->savepoint_name = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | RELEASE ColId { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_RELEASE; n->savepoint_name = $2; - $$ = (Node *)n; + $$ = (Node *) n; } | ROLLBACK opt_transaction TO SAVEPOINT ColId { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_ROLLBACK_TO; n->savepoint_name = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ROLLBACK opt_transaction TO ColId { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_ROLLBACK_TO; n->savepoint_name = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | PREPARE TRANSACTION Sconst { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_PREPARE; n->gid = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | COMMIT PREPARED Sconst { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_COMMIT_PREPARED; n->gid = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | ROLLBACK PREPARED Sconst { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_ROLLBACK_PREPARED; n->gid = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10534,17 +11402,19 @@ TransactionStmtLegacy: BEGIN_P opt_transaction transaction_mode_list_or_empty { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_BEGIN; n->options = $3; - $$ = (Node *)n; + $$ = (Node *) n; } | END_P opt_transaction opt_transaction_chain { TransactionStmt *n = makeNode(TransactionStmt); + n->kind = TRANS_STMT_COMMIT; n->options = NIL; n->chain = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10612,7 +11482,8 @@ opt_is_definer_right: ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions opt_is_definer_right AS SelectStmt opt_check_option { - ViewStmt *n = makeNode(ViewStmt); + ViewStmt *n = makeNode(ViewStmt); + n->view = $4; n->view->relpersistence = $2; n->aliases = $5; @@ -10631,7 +11502,8 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions opt_ | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions opt_is_definer_right AS SelectStmt opt_check_option { - ViewStmt *n = makeNode(ViewStmt); + ViewStmt *n = makeNode(ViewStmt); + n->view = $6; n->view->relpersistence = $4; n->aliases = $7; @@ -10650,7 +11522,8 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions opt_ | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions opt_is_definer_right AS SelectStmt opt_check_option { - ViewStmt *n = makeNode(ViewStmt); + ViewStmt *n = makeNode(ViewStmt); + n->view = $5; n->view->relpersistence = $2; n->aliases = $7; @@ -10674,7 +11547,8 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions opt_ | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions opt_is_definer_right AS SelectStmt opt_check_option { - ViewStmt *n = makeNode(ViewStmt); + ViewStmt *n = makeNode(ViewStmt); + n->view = $7; n->view->relpersistence = $4; n->aliases = $9; @@ -10713,9 +11587,10 @@ opt_check_option: LoadStmt: LOAD file_name { - LoadStmt *n = makeNode(LoadStmt); + LoadStmt *n = makeNode(LoadStmt); + n->filename = $2; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10730,9 +11605,10 @@ CreatedbStmt: CREATE DATABASE name opt_with createdb_opt_list { CreatedbStmt *n = makeNode(CreatedbStmt); + n->dbname = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10747,13 +11623,13 @@ createdb_opt_items: ; createdb_opt_item: - createdb_opt_name opt_equal SignedIconst + createdb_opt_name opt_equal NumericOnly { - $$ = makeDefElem($1, (Node *)makeInteger($3), @1); + $$ = makeDefElem($1, $3, @1); } | createdb_opt_name opt_equal opt_boolean_or_string { - $$ = makeDefElem($1, (Node *)makeString($3), @1); + $$ = makeDefElem($1, (Node *) makeString($3), @1); } | createdb_opt_name opt_equal DEFAULT { @@ -10801,24 +11677,34 @@ AlterDatabaseStmt: ALTER DATABASE name WITH createdb_opt_list { AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt); + n->dbname = $3; n->options = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DATABASE name createdb_opt_list { AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt); + n->dbname = $3; n->options = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER DATABASE name SET TABLESPACE name { AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt); + n->dbname = $3; n->options = list_make1(makeDefElem("tablespace", - (Node *)makeString($6), @6)); - $$ = (Node *)n; + (Node *) makeString($6), @6)); + $$ = (Node *) n; + } + | ALTER DATABASE name REFRESH COLLATION VERSION_P + { + AlterDatabaseRefreshCollStmt *n = makeNode(AlterDatabaseRefreshCollStmt); + + n->dbname = $3; + $$ = (Node *) n; } ; @@ -10826,9 +11712,10 @@ AlterDatabaseSetStmt: ALTER DATABASE name SetResetClause { AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt); + n->dbname = $3; n->setstmt = $4; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10843,34 +11730,38 @@ AlterDatabaseSetStmt: DropdbStmt: DROP DATABASE name { DropdbStmt *n = makeNode(DropdbStmt); + n->dbname = $3; n->missing_ok = false; n->options = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP DATABASE IF_P EXISTS name { DropdbStmt *n = makeNode(DropdbStmt); + n->dbname = $5; n->missing_ok = true; n->options = NULL; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP DATABASE name opt_with '(' drop_option_list ')' { DropdbStmt *n = makeNode(DropdbStmt); + n->dbname = $3; n->missing_ok = false; n->options = $6; - $$ = (Node *)n; + $$ = (Node *) n; } | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')' { DropdbStmt *n = makeNode(DropdbStmt); + n->dbname = $5; n->missing_ok = true; n->options = $8; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10905,8 +11796,9 @@ drop_option: AlterCollationStmt: ALTER COLLATION any_name REFRESH VERSION_P { AlterCollationStmt *n = makeNode(AlterCollationStmt); + n->collname = $3; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10922,14 +11814,16 @@ AlterSystemStmt: ALTER SYSTEM_P SET generic_set { AlterSystemStmt *n = makeNode(AlterSystemStmt); + n->setstmt = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | ALTER SYSTEM_P RESET generic_reset { AlterSystemStmt *n = makeNode(AlterSystemStmt); + n->setstmt = $4; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10944,11 +11838,12 @@ CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList { CreateDomainStmt *n = makeNode(CreateDomainStmt); + n->domainname = $3; n->typeName = $5; SplitColQualList($6, &n->constraints, &n->collClause, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -10957,66 +11852,73 @@ AlterDomainStmt: ALTER DOMAIN_P any_name alter_column_default { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'T'; n->typeName = $3; n->def = $4; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN DROP NOT NULL */ | ALTER DOMAIN_P any_name DROP NOT NULL_P { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'N'; n->typeName = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN SET NOT NULL */ | ALTER DOMAIN_P any_name SET NOT NULL_P { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'O'; n->typeName = $3; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN ADD CONSTRAINT ... */ | ALTER DOMAIN_P any_name ADD_P TableConstraint { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'C'; n->typeName = $3; n->def = $5; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN DROP CONSTRAINT [RESTRICT|CASCADE] */ | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'X'; n->typeName = $3; n->name = $6; n->behavior = $7; n->missing_ok = false; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN DROP CONSTRAINT IF EXISTS [RESTRICT|CASCADE] */ | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'X'; n->typeName = $3; n->name = $8; n->behavior = $9; n->missing_ok = true; - $$ = (Node *)n; + $$ = (Node *) n; } /* ALTER DOMAIN VALIDATE CONSTRAINT */ | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name { AlterDomainStmt *n = makeNode(AlterDomainStmt); + n->subtype = 'V'; n->typeName = $3; n->name = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11035,9 +11937,10 @@ AlterTSDictionaryStmt: ALTER TEXT_P SEARCH DICTIONARY any_name definition { AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt); + n->dictname = $5; n->options = $6; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11045,64 +11948,70 @@ AlterTSConfigurationStmt: ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_ADD_MAPPING; n->cfgname = $5; n->tokentype = $9; n->dicts = $11; n->override = false; n->replace = false; - $$ = (Node*)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN; n->cfgname = $5; n->tokentype = $9; n->dicts = $11; n->override = true; n->replace = false; - $$ = (Node*)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_REPLACE_DICT; n->cfgname = $5; n->tokentype = NIL; n->dicts = list_make2($9,$11); n->override = false; n->replace = true; - $$ = (Node*)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN; n->cfgname = $5; n->tokentype = $9; n->dicts = list_make2($11,$13); n->override = false; n->replace = true; - $$ = (Node*)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_DROP_MAPPING; n->cfgname = $5; n->tokentype = $9; n->missing_ok = false; - $$ = (Node*)n; + $$ = (Node *) n; } | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list { AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt); + n->kind = ALTER_TSCONFIG_DROP_MAPPING; n->cfgname = $5; n->tokentype = $11; n->missing_ok = true; - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -11126,12 +12035,13 @@ CreateConversionStmt: TO Sconst FROM any_name { CreateConversionStmt *n = makeNode(CreateConversionStmt); + n->conversion_name = $4; n->for_encoding_name = $6; n->to_encoding_name = $8; n->func_name = $10; n->def = $2; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11149,42 +12059,46 @@ ClusterStmt: CLUSTER opt_verbose qualified_name cluster_index_specification { ClusterStmt *n = makeNode(ClusterStmt); + n->relation = $3; n->indexname = $4; n->params = NIL; if ($2) n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); - $$ = (Node*)n; + $$ = (Node *) n; } | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification { ClusterStmt *n = makeNode(ClusterStmt); + n->relation = $5; n->indexname = $6; n->params = $3; - $$ = (Node*)n; + $$ = (Node *) n; } | CLUSTER opt_verbose { ClusterStmt *n = makeNode(ClusterStmt); + n->relation = NULL; n->indexname = NULL; n->params = NIL; if ($2) n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); - $$ = (Node*)n; + $$ = (Node *) n; } /* kept for pre-8.3 compatibility */ | CLUSTER opt_verbose name ON qualified_name { ClusterStmt *n = makeNode(ClusterStmt); + n->relation = $5; n->indexname = $3; n->params = NIL; if ($2) n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); - $$ = (Node*)n; + $$ = (Node *) n; } ; @@ -11205,6 +12119,7 @@ cluster_index_specification: VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); + n->options = NIL; if ($2) n->options = lappend(n->options, @@ -11220,11 +12135,12 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relati makeDefElem("analyze", NULL, @5)); n->rels = $6; n->is_vacuumcmd = true; - $$ = (Node *)n; + $$ = (Node *) n; } | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); + n->options = $3; n->rels = $5; n->is_vacuumcmd = true; @@ -11235,17 +12151,19 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relati AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); + n->options = NIL; if ($2) n->options = lappend(n->options, makeDefElem("verbose", NULL, @2)); n->rels = $3; n->is_vacuumcmd = false; - $$ = (Node *)n; + $$ = (Node *) n; } | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); + n->options = $3; n->rels = $5; n->is_vacuumcmd = false; @@ -11342,6 +12260,7 @@ ExplainStmt: EXPLAIN ExplainableStmt { ExplainStmt *n = makeNode(ExplainStmt); + n->query = $2; n->options = NIL; $$ = (Node *) n; @@ -11349,6 +12268,7 @@ ExplainStmt: | EXPLAIN analyze_keyword opt_verbose ExplainableStmt { ExplainStmt *n = makeNode(ExplainStmt); + n->query = $4; n->options = list_make1(makeDefElem("analyze", NULL, @2)); if ($3) @@ -11359,6 +12279,7 @@ ExplainStmt: | EXPLAIN VERBOSE ExplainableStmt { ExplainStmt *n = makeNode(ExplainStmt); + n->query = $3; n->options = list_make1(makeDefElem("verbose", NULL, @2)); $$ = (Node *) n; @@ -11366,6 +12287,7 @@ ExplainStmt: | EXPLAIN '(' utility_option_list ')' ExplainableStmt { ExplainStmt *n = makeNode(ExplainStmt); + n->query = $5; n->options = $3; $$ = (Node *) n; @@ -11377,6 +12299,7 @@ ExplainableStmt: | InsertStmt | UpdateStmt | DeleteStmt + | MergeStmt | DeclareCursorStmt | CreateAsStmt | CreateMatViewStmt @@ -11394,6 +12317,7 @@ ExplainableStmt: PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt { PrepareStmt *n = makeNode(PrepareStmt); + n->name = $2; n->argtypes = $3; n->query = $5; @@ -11409,7 +12333,8 @@ PreparableStmt: SelectStmt | InsertStmt | UpdateStmt - | DeleteStmt /* by default all are $$=$1 */ + | DeleteStmt + | MergeStmt /* by default all are $$=$1 */ ; /***************************************************************************** @@ -11422,6 +12347,7 @@ PreparableStmt: ExecuteStmt: EXECUTE name execute_param_clause { ExecuteStmt *n = makeNode(ExecuteStmt); + n->name = $2; n->params = $3; $$ = (Node *) n; @@ -11431,6 +12357,7 @@ ExecuteStmt: EXECUTE name execute_param_clause { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); ExecuteStmt *n = makeNode(ExecuteStmt); + n->name = $7; n->params = $8; ctas->query = (Node *) n; @@ -11448,6 +12375,7 @@ ExecuteStmt: EXECUTE name execute_param_clause { CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt); ExecuteStmt *n = makeNode(ExecuteStmt); + n->name = $10; n->params = $11; ctas->query = (Node *) n; @@ -11476,24 +12404,28 @@ execute_param_clause: '(' expr_list ')' { $$ = $2; } DeallocateStmt: DEALLOCATE name { DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = $2; $$ = (Node *) n; } | DEALLOCATE PREPARE name { DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = $3; $$ = (Node *) n; } | DEALLOCATE ALL { DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = NULL; $$ = (Node *) n; } | DEALLOCATE PREPARE ALL { DeallocateStmt *n = makeNode(DeallocateStmt); + n->name = NULL; $$ = (Node *) n; } @@ -11661,12 +12593,13 @@ DeleteStmt: opt_with_clause DELETE_P FROM relation_expr_opt_alias using_clause where_or_current_clause returning_clause { DeleteStmt *n = makeNode(DeleteStmt); + n->relation = $4; n->usingClause = $5; n->whereClause = $6; n->returningList = $7; n->withClause = $1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11685,12 +12618,12 @@ using_clause: LockStmt: LOCK_P opt_table relation_expr_list opt_lock opt_nowait { - LockStmt *n = makeNode(LockStmt); + LockStmt *n = makeNode(LockStmt); n->relations = $3; n->mode = $4; n->nowait = $5; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11733,13 +12666,14 @@ UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias returning_clause { UpdateStmt *n = makeNode(UpdateStmt); + n->relation = $3; n->targetList = $5; n->fromClause = $6; n->whereClause = $7; n->returningList = $8; n->withClause = $1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11756,14 +12690,14 @@ set_clause: } | '(' set_target_list ')' '=' a_expr { - int ncolumns = list_length($2); - int i = 1; - ListCell *col_cell; + int ncolumns = list_length($2); + int i = 1; + ListCell *col_cell; /* Create a MultiAssignRef source for each target */ foreach(col_cell, $2) { - ResTarget *res_col = (ResTarget *) lfirst(col_cell); + ResTarget *res_col = (ResTarget *) lfirst(col_cell); MultiAssignRef *r = makeNode(MultiAssignRef); r->source = (Node *) $5; @@ -11794,6 +12728,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: @@ -11803,11 +12897,12 @@ set_target_list: DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt { DeclareCursorStmt *n = makeNode(DeclareCursorStmt); + n->portalname = $2; /* currently we always set FAST_PLAN option */ n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN; n->query = $7; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -11990,6 +13085,7 @@ simple_select: group_clause having_clause window_clause { SelectStmt *n = makeNode(SelectStmt); + n->targetList = $3; n->intoClause = $4; n->fromClause = $5; @@ -11998,13 +13094,14 @@ simple_select: n->groupDistinct = ($7)->distinct; n->havingClause = $8; n->windowClause = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | SELECT distinct_clause target_list into_clause from_clause where_clause group_clause having_clause window_clause { SelectStmt *n = makeNode(SelectStmt); + n->distinctClause = $2; n->targetList = $3; n->intoClause = $4; @@ -12014,14 +13111,14 @@ simple_select: n->groupDistinct = ($7)->distinct; n->havingClause = $8; n->windowClause = $9; - $$ = (Node *)n; + $$ = (Node *) n; } | values_clause { $$ = $1; } | TABLE relation_expr { /* same as SELECT * FROM relation_expr */ - ColumnRef *cr = makeNode(ColumnRef); - ResTarget *rt = makeNode(ResTarget); + ColumnRef *cr = makeNode(ColumnRef); + ResTarget *rt = makeNode(ResTarget); SelectStmt *n = makeNode(SelectStmt); cr->fields = list_make1(makeNode(A_Star)); @@ -12029,12 +13126,12 @@ simple_select: rt->name = NULL; rt->indirection = NIL; - rt->val = (Node *)cr; + rt->val = (Node *) cr; rt->location = -1; n->targetList = list_make1(rt); n->fromClause = list_make1($2); - $$ = (Node *)n; + $$ = (Node *) n; } | select_clause UNION set_quantifier select_clause { @@ -12090,6 +13187,7 @@ cte_list: common_table_expr: name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause { CommonTableExpr *n = makeNode(CommonTableExpr); + n->ctename = $1; n->aliascolnames = $2; n->ctematerialized = $4; @@ -12111,6 +13209,7 @@ opt_search_clause: SEARCH DEPTH FIRST_P BY columnList SET ColId { CTESearchClause *n = makeNode(CTESearchClause); + n->search_col_list = $5; n->search_breadth_first = false; n->search_seq_column = $7; @@ -12120,6 +13219,7 @@ opt_search_clause: | SEARCH BREADTH FIRST_P BY columnList SET ColId { CTESearchClause *n = makeNode(CTESearchClause); + n->search_col_list = $5; n->search_breadth_first = true; n->search_seq_column = $7; @@ -12136,6 +13236,7 @@ opt_cycle_clause: CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId { CTECycleClause *n = makeNode(CTECycleClause); + n->cycle_col_list = $2; n->cycle_mark_column = $4; n->cycle_mark_value = $6; @@ -12147,6 +13248,7 @@ opt_cycle_clause: | CYCLE columnList SET ColId USING ColId { CTECycleClause *n = makeNode(CTECycleClause); + n->cycle_col_list = $2; n->cycle_mark_column = $4; n->cycle_mark_value = makeBoolAConst(true, -1, yyscanner); @@ -12321,6 +13423,7 @@ select_limit: | offset_clause { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = $1; n->limitCount = NULL; n->limitOption = LIMIT_OPTION_COUNT; @@ -12337,6 +13440,7 @@ limit_clause: LIMIT select_limit_value { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = NULL; n->limitCount = $2; n->limitOption = LIMIT_OPTION_COUNT; @@ -12361,6 +13465,7 @@ limit_clause: | FETCH first_or_next select_fetch_first_value row_or_rows ONLY { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = NULL; n->limitCount = $3; n->limitOption = LIMIT_OPTION_COUNT; @@ -12369,6 +13474,7 @@ limit_clause: | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = NULL; n->limitCount = $3; n->limitOption = LIMIT_OPTION_WITH_TIES; @@ -12377,6 +13483,7 @@ limit_clause: | FETCH first_or_next row_or_rows ONLY { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = NULL; n->limitCount = makeIntConst(1, -1); n->limitOption = LIMIT_OPTION_COUNT; @@ -12385,6 +13492,7 @@ limit_clause: | FETCH first_or_next row_or_rows WITH TIES { SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit)); + n->limitOffset = NULL; n->limitCount = makeIntConst(1, -1); n->limitOption = LIMIT_OPTION_WITH_TIES; @@ -12476,6 +13584,7 @@ group_clause: GROUP_P BY set_quantifier group_by_list { GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause)); + n->distinct = $3 == SET_QUANTIFIER_DISTINCT; n->list = $4; $$ = n; @@ -12483,6 +13592,7 @@ group_clause: | /*EMPTY*/ { GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause)); + n->distinct = false; n->list = NIL; $$ = n; @@ -12560,6 +13670,7 @@ for_locking_item: for_locking_strength locked_rels_list opt_nowait_or_skip { LockingClause *n = makeNode(LockingClause); + n->lockedRels = $2; n->strength = $1; n->waitPolicy = $3; @@ -12589,12 +13700,14 @@ values_clause: VALUES '(' expr_list ')' { SelectStmt *n = makeNode(SelectStmt); + n->valuesLists = list_make1($3); $$ = (Node *) n; } | values_clause ',' '(' expr_list ')' { SelectStmt *n = (SelectStmt *) $1; + n->valuesLists = lappend(n->valuesLists, $4); $$ = (Node *) n; } @@ -12630,6 +13743,7 @@ table_ref: relation_expr opt_alias_clause | relation_expr opt_alias_clause tablesample_clause { RangeTableSample *n = (RangeTableSample *) $3; + $1->alias = $2; /* relation_expr goes inside the RangeTableSample node */ n->relation = (Node *) $1; @@ -12638,6 +13752,7 @@ table_ref: relation_expr opt_alias_clause | func_table func_alias_clause { RangeFunction *n = (RangeFunction *) $1; + n->alias = linitial($2); n->coldeflist = lsecond($2); $$ = (Node *) n; @@ -12645,6 +13760,7 @@ table_ref: relation_expr opt_alias_clause | LATERAL_P func_table func_alias_clause { RangeFunction *n = (RangeFunction *) $2; + n->lateral = true; n->alias = linitial($3); n->coldeflist = lsecond($3); @@ -12653,12 +13769,14 @@ table_ref: relation_expr opt_alias_clause | xmltable opt_alias_clause { RangeTableFunc *n = (RangeTableFunc *) $1; + n->alias = $2; $$ = (Node *) n; } | LATERAL_P xmltable opt_alias_clause { RangeTableFunc *n = (RangeTableFunc *) $2; + n->lateral = true; n->alias = $3; $$ = (Node *) n; @@ -12666,6 +13784,7 @@ table_ref: relation_expr opt_alias_clause | select_with_parens opt_alias_clause { RangeSubselect *n = makeNode(RangeSubselect); + n->lateral = false; n->subquery = $1; n->alias = $2; @@ -12701,6 +13820,7 @@ table_ref: relation_expr opt_alias_clause | LATERAL_P select_with_parens opt_alias_clause { RangeSubselect *n = makeNode(RangeSubselect); + n->lateral = true; n->subquery = $2; n->alias = $3; @@ -12760,7 +13880,8 @@ joined_table: | table_ref CROSS JOIN opt_spangres_hint table_ref { /* CROSS JOIN is same as unqualified inner join */ - JoinExpr *n = makeNode(JoinExpr); + JoinExpr *n = makeNode(JoinExpr); + n->jointype = JOIN_INNER; n->isNatural = false; n->larg = $1; @@ -12773,7 +13894,8 @@ joined_table: } | table_ref join_type JOIN opt_spangres_hint table_ref join_qual { - JoinExpr *n = makeNode(JoinExpr); + JoinExpr *n = makeNode(JoinExpr); + n->jointype = $2; n->isNatural = false; n->larg = $1; @@ -12795,7 +13917,8 @@ joined_table: | table_ref JOIN opt_spangres_hint table_ref join_qual { /* letting join_type reduce to empty doesn't work */ - JoinExpr *n = makeNode(JoinExpr); + JoinExpr *n = makeNode(JoinExpr); + n->jointype = JOIN_INNER; n->isNatural = false; n->larg = $1; @@ -12816,7 +13939,8 @@ joined_table: } | table_ref NATURAL join_type JOIN table_ref { - JoinExpr *n = makeNode(JoinExpr); + JoinExpr *n = makeNode(JoinExpr); + n->jointype = $3; n->isNatural = true; n->larg = $1; @@ -12829,7 +13953,8 @@ joined_table: | table_ref NATURAL JOIN table_ref { /* letting join_type reduce to empty doesn't work */ - JoinExpr *n = makeNode(JoinExpr); + JoinExpr *n = makeNode(JoinExpr); + n->jointype = JOIN_INNER; n->isNatural = true; n->larg = $1; @@ -12901,13 +14026,15 @@ func_alias_clause: } | AS ColId '(' TableFuncElementList ')' { - Alias *a = makeNode(Alias); + Alias *a = makeNode(Alias); + a->aliasname = $2; $$ = list_make2(a, $4); } | ColId '(' TableFuncElementList ')' { - Alias *a = makeNode(Alias); + Alias *a = makeNode(Alias); + a->aliasname = $1; $$ = list_make2(a, $3); } @@ -12960,7 +14087,14 @@ relation_expr: $$->alias = NULL; $$->tableHints = $2; } - | qualified_name '*' opt_spangres_hint + | extended_relation_expr + { + $$ = $1; + } + ; + +extended_relation_expr: + qualified_name '*' opt_spangres_hint { /* inheritance query, explicitly */ $$ = $1; @@ -13008,14 +14142,16 @@ relation_expr_opt_alias: relation_expr %prec UMINUS } | relation_expr ColId { - Alias *alias = makeNode(Alias); + Alias *alias = makeNode(Alias); + alias->aliasname = $2; $1->alias = alias; $$ = $1; } | relation_expr AS ColId { - Alias *alias = makeNode(Alias); + Alias *alias = makeNode(Alias); + alias->aliasname = $3; $1->alias = alias; $$ = $1; @@ -13029,6 +14165,7 @@ tablesample_clause: TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause { RangeTableSample *n = makeNode(RangeTableSample); + /* n->relation will be filled in later */ n->method = $2; n->args = $4; @@ -13058,6 +14195,7 @@ opt_repeatable_clause: func_table: func_expr_windowless opt_ordinality { RangeFunction *n = makeNode(RangeFunction); + n->lateral = false; n->ordinality = $2; n->is_rowsfrom = false; @@ -13068,6 +14206,7 @@ func_table: func_expr_windowless opt_ordinality | ROWS FROM '(' rowsfrom_list ')' opt_ordinality { RangeFunction *n = makeNode(RangeFunction); + n->lateral = false; n->ordinality = $6; n->is_rowsfrom = true; @@ -13106,6 +14245,7 @@ where_or_current_clause: | WHERE CURRENT_P OF cursor_name { CurrentOfExpr *n = makeNode(CurrentOfExpr); + /* cvarno is filled in by parse analysis */ n->cursor_name = $4; n->cursor_param = 0; @@ -13134,6 +14274,7 @@ TableFuncElementList: TableFuncElement: ColId Typename opt_collate_clause { ColumnDef *n = makeNode(ColumnDef); + n->colname = $1; n->typeName = $2; n->inhcount = 0; @@ -13147,7 +14288,7 @@ TableFuncElement: ColId Typename opt_collate_clause n->collOid = InvalidOid; n->constraints = NIL; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -13158,23 +14299,25 @@ xmltable: XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')' { RangeTableFunc *n = makeNode(RangeTableFunc); + n->rowexpr = $3; n->docexpr = $4; n->columns = $6; n->namespaces = NIL; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' c_expr xmlexists_argument COLUMNS xmltable_column_list ')' { RangeTableFunc *n = makeNode(RangeTableFunc); + n->rowexpr = $8; n->docexpr = $9; n->columns = $11; n->namespaces = $5; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -13185,7 +14328,7 @@ xmltable_column_list: xmltable_column_el { $$ = list_make1($1); } xmltable_column_el: ColId Typename { - RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); + RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); fc->colname = $1; fc->for_ordinality = false; @@ -13199,9 +14342,9 @@ xmltable_column_el: } | ColId Typename xmltable_column_option_list { - RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); - ListCell *option; - bool nullability_seen = false; + RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); + ListCell *option; + bool nullability_seen = false; fc->colname = $1; fc->typeName = $2; @@ -13240,7 +14383,7 @@ xmltable_column_el: (errcode(ERRCODE_SYNTAX_ERROR), errmsg("conflicting or redundant NULL / NOT NULL declarations for column \"%s\"", fc->colname), parser_errposition(defel->location))); - fc->is_not_null = intVal(defel->arg); + fc->is_not_null = boolVal(defel->arg); nullability_seen = true; } else @@ -13256,7 +14399,7 @@ xmltable_column_el: } | ColId FOR ORDINALITY { - RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); + RangeTableFuncCol *fc = makeNode(RangeTableFuncCol); fc->colname = $1; fc->for_ordinality = true; @@ -13280,9 +14423,9 @@ xmltable_column_option_el: | DEFAULT b_expr { $$ = makeDefElem("default", $2, @1); } | NOT NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeInteger(true), @1); } + { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); } | NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeInteger(false), @1); } + { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); } ; xml_namespace_list: @@ -13811,6 +14954,7 @@ a_expr: c_expr | a_expr COLLATE any_name { CollateClause *n = makeNode(CollateClause); + n->arg = $1; n->collname = $3; n->location = @2; @@ -13929,11 +15073,11 @@ a_expr: c_expr $1, $3, @2); } | a_expr LIKE a_expr ESCAPE a_expr %prec LIKE - { - FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), - list_make2($3, $5), - COERCE_EXPLICIT_CALL, - @2); + { + FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), + list_make2($3, $5), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~", $1, (Node *) n, @2); } @@ -13944,10 +15088,10 @@ a_expr: c_expr } | a_expr NOT_LA LIKE a_expr ESCAPE a_expr %prec NOT_LA { - FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), - list_make2($4, $6), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), + list_make2($4, $6), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~", $1, (Node *) n, @2); } @@ -13958,10 +15102,10 @@ a_expr: c_expr } | a_expr ILIKE a_expr ESCAPE a_expr %prec ILIKE { - FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), - list_make2($3, $5), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), + list_make2($3, $5), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*", $1, (Node *) n, @2); } @@ -13972,47 +15116,47 @@ a_expr: c_expr } | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr %prec NOT_LA { - FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), - list_make2($4, $6), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), + list_make2($4, $6), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*", $1, (Node *) n, @2); } | a_expr SIMILAR TO a_expr %prec SIMILAR { - FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), - list_make1($4), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), + list_make1($4), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~", $1, (Node *) n, @2); } | a_expr SIMILAR TO a_expr ESCAPE a_expr %prec SIMILAR { - FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), - list_make2($4, $6), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), + list_make2($4, $6), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~", $1, (Node *) n, @2); } | a_expr NOT_LA SIMILAR TO a_expr %prec NOT_LA { - FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), - list_make1($5), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), + list_make1($5), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~", $1, (Node *) n, @2); } | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr %prec NOT_LA { - FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), - list_make2($5, $7), - COERCE_EXPLICIT_CALL, - @2); + FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"), + list_make2($5, $7), + COERCE_EXPLICIT_CALL, + @2); $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~", $1, (Node *) n, @2); } @@ -14028,35 +15172,39 @@ a_expr: c_expr */ | a_expr IS NULL_P %prec IS { - NullTest *n = makeNode(NullTest); + NullTest *n = makeNode(NullTest); + n->arg = (Expr *) $1; n->nulltesttype = IS_NULL; n->location = @2; - $$ = (Node *)n; + $$ = (Node *) n; } | a_expr ISNULL { - NullTest *n = makeNode(NullTest); + NullTest *n = makeNode(NullTest); + n->arg = (Expr *) $1; n->nulltesttype = IS_NULL; n->location = @2; - $$ = (Node *)n; + $$ = (Node *) n; } | a_expr IS NOT NULL_P %prec IS { - NullTest *n = makeNode(NullTest); + NullTest *n = makeNode(NullTest); + n->arg = (Expr *) $1; n->nulltesttype = IS_NOT_NULL; n->location = @2; - $$ = (Node *)n; + $$ = (Node *) n; } | a_expr NOTNULL { - NullTest *n = makeNode(NullTest); + NullTest *n = makeNode(NullTest); + n->arg = (Expr *) $1; n->nulltesttype = IS_NOT_NULL; n->location = @2; - $$ = (Node *)n; + $$ = (Node *) n; } | row OVERLAPS row { @@ -14078,50 +15226,56 @@ a_expr: c_expr | a_expr IS TRUE_P %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_TRUE; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS NOT TRUE_P %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_NOT_TRUE; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS FALSE_P %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_FALSE; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS NOT FALSE_P %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_NOT_FALSE; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS UNKNOWN %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_UNKNOWN; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS NOT UNKNOWN %prec IS { BooleanTest *b = makeNode(BooleanTest); + b->arg = (Expr *) $1; b->booltesttype = IS_NOT_UNKNOWN; b->location = @2; - $$ = (Node *)b; + $$ = (Node *) b; } | a_expr IS DISTINCT FROM a_expr %prec IS { @@ -14169,14 +15323,14 @@ a_expr: c_expr if (IsA($4, SubLink)) { /* generate foo = ANY (subquery) */ - SubLink *n = (SubLink *) $4; + SubLink *n = (SubLink *) $4; n->subLinkType = ANY_SUBLINK; n->subLinkId = 0; n->testexpr = $1; n->operName = NIL; /* show it's IN not = ANY */ n->location = @2; n->joinHints = $3; - $$ = (Node *)n; + $$ = (Node *) n; } else { @@ -14196,7 +15350,7 @@ a_expr: c_expr { /* generate NOT (foo = ANY (subquery)) */ /* Make an = ANY node */ - SubLink *n = (SubLink *) $5; + SubLink *n = (SubLink *) $5; n->subLinkType = ANY_SUBLINK; n->subLinkId = 0; n->testexpr = $1; @@ -14219,14 +15373,15 @@ a_expr: c_expr } | a_expr subquery_Op sub_type select_with_parens %prec Op { - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); + n->subLinkType = $3; n->subLinkId = 0; n->testexpr = $1; n->operName = $2; n->subselect = $4; n->location = @2; - $$ = (Node *)n; + $$ = (Node *) n; } | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op { @@ -14235,7 +15390,7 @@ a_expr: c_expr else $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2); } - | UNIQUE select_with_parens + | UNIQUE opt_unique_null_treatment select_with_parens { /* Not sure how to get rid of the parentheses * but there are lots of shift/reduce errors without them. @@ -14302,9 +15457,10 @@ a_expr: c_expr * lets us say something smarter than "syntax error". */ SetToDefault *n = makeNode(SetToDefault); + /* parse analysis will fill in the rest */ n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -14436,12 +15592,14 @@ c_expr: columnref { $$ = $1; } | AexprConst { $$ = $1; } | PARAM opt_indirection { - ParamRef *p = makeNode(ParamRef); + ParamRef *p = makeNode(ParamRef); + p->number = $1; p->location = @1; if ($2) { A_Indirection *n = makeNode(A_Indirection); + n->arg = (Node *) p; n->indirection = check_indirection($2, yyscanner); $$ = (Node *) n; @@ -14454,9 +15612,10 @@ c_expr: columnref { $$ = $1; } if ($4) { A_Indirection *n = makeNode(A_Indirection); + n->arg = $2; n->indirection = check_indirection($4, yyscanner); - $$ = (Node *)n; + $$ = (Node *) n; } else $$ = $2; @@ -14467,14 +15626,15 @@ c_expr: columnref { $$ = $1; } { $$ = $1; } | select_with_parens %prec UMINUS { - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); + n->subLinkType = EXPR_SUBLINK; n->subLinkId = 0; n->testexpr = NULL; n->operName = NIL; n->subselect = $1; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | select_with_parens indirection { @@ -14488,73 +15648,80 @@ c_expr: columnref { $$ = $1; } * subscripting or field selection to a sub-SELECT result, * we need this redundant-looking production. */ - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); A_Indirection *a = makeNode(A_Indirection); + n->subLinkType = EXPR_SUBLINK; n->subLinkId = 0; n->testexpr = NULL; n->operName = NIL; n->subselect = $1; n->location = @1; - a->arg = (Node *)n; + a->arg = (Node *) n; a->indirection = check_indirection($2, yyscanner); - $$ = (Node *)a; + $$ = (Node *) a; } | EXISTS select_with_parens { - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); + n->subLinkType = EXISTS_SUBLINK; n->subLinkId = 0; n->testexpr = NULL; n->operName = NIL; n->subselect = $2; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | ARRAY select_with_parens { - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); + n->subLinkType = ARRAY_SUBLINK; n->subLinkId = 0; n->testexpr = NULL; n->operName = NIL; n->subselect = $2; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | ARRAY array_expr { A_ArrayExpr *n = castNode(A_ArrayExpr, $2); + /* point outermost A_ArrayExpr to the ARRAY keyword */ n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } | explicit_row { - RowExpr *r = makeNode(RowExpr); + RowExpr *r = makeNode(RowExpr); + r->args = $1; r->row_typeid = InvalidOid; /* not analyzed yet */ r->colnames = NIL; /* to be filled in during analysis */ r->row_format = COERCE_EXPLICIT_CALL; /* abuse */ r->location = @1; - $$ = (Node *)r; + $$ = (Node *) r; } | implicit_row { - RowExpr *r = makeNode(RowExpr); + RowExpr *r = makeNode(RowExpr); + r->args = $1; r->row_typeid = InvalidOid; /* not analyzed yet */ r->colnames = NIL; /* to be filled in during analysis */ r->row_format = COERCE_IMPLICIT_CAST; /* abuse */ r->location = @1; - $$ = (Node *)r; + $$ = (Node *) r; } | GROUPING '(' expr_list ')' { GroupingFunc *g = makeNode(GroupingFunc); + g->args = $3; g->location = @1; - $$ = (Node *)g; + $$ = (Node *) g; } ; @@ -14566,50 +15733,55 @@ func_application: func_name '(' ')' } | func_name '(' func_arg_list opt_sort_clause ')' { - FuncCall *n = makeFuncCall($1, $3, - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, $3, + COERCE_EXPLICIT_CALL, + @1); + n->agg_order = $4; - $$ = (Node *)n; + $$ = (Node *) n; } | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')' { - FuncCall *n = makeFuncCall($1, list_make1($4), - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, list_make1($4), + COERCE_EXPLICIT_CALL, + @1); + n->func_variadic = true; n->agg_order = $5; - $$ = (Node *)n; + $$ = (Node *) n; } | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')' { - FuncCall *n = makeFuncCall($1, lappend($3, $6), - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, lappend($3, $6), + COERCE_EXPLICIT_CALL, + @1); + n->func_variadic = true; n->agg_order = $7; - $$ = (Node *)n; + $$ = (Node *) n; } | func_name '(' ALL func_arg_list opt_sort_clause ')' { - FuncCall *n = makeFuncCall($1, $4, - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, $4, + COERCE_EXPLICIT_CALL, + @1); + n->agg_order = $5; /* Ideally we'd mark the FuncCall node to indicate * "must be an aggregate", but there's no provision * for that in FuncCall at the moment. */ - $$ = (Node *)n; + $$ = (Node *) n; } | func_name '(' DISTINCT func_arg_list opt_sort_clause ')' { - FuncCall *n = makeFuncCall($1, $4, - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, $4, + COERCE_EXPLICIT_CALL, + @1); + n->agg_order = $5; n->agg_distinct = true; - $$ = (Node *)n; + $$ = (Node *) n; } | func_name '(' '*' ')' { @@ -14623,11 +15795,12 @@ func_application: func_name '(' ')' * so that later processing can detect what the argument * really was. */ - FuncCall *n = makeFuncCall($1, NIL, - COERCE_EXPLICIT_CALL, - @1); + FuncCall *n = makeFuncCall($1, NIL, + COERCE_EXPLICIT_CALL, + @1); + n->agg_star = true; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -14643,7 +15816,8 @@ func_application: func_name '(' ')' */ func_expr: func_application opt_spangres_hint within_group_clause filter_clause over_clause { - FuncCall *n = (FuncCall *) $1; + FuncCall *n = (FuncCall *) $1; + /* * The order clause for WITHIN GROUP and the one for * plain-aggregate ORDER BY share a field, so we have to @@ -14898,25 +16072,28 @@ func_expr_common_subexpr: | COALESCE '(' expr_list ')' { CoalesceExpr *c = makeNode(CoalesceExpr); + c->args = $3; c->location = @1; - $$ = (Node *)c; + $$ = (Node *) c; } | GREATEST '(' expr_list ')' { MinMaxExpr *v = makeNode(MinMaxExpr); + v->args = $3; v->op = IS_GREATEST; v->location = @1; - $$ = (Node *)v; + $$ = (Node *) v; } | LEAST '(' expr_list ')' { MinMaxExpr *v = makeNode(MinMaxExpr); + v->args = $3; v->op = IS_LEAST; v->location = @1; - $$ = (Node *)v; + $$ = (Node *) v; } | XMLCONCAT '(' expr_list ')' { @@ -14957,8 +16134,9 @@ func_expr_common_subexpr: makeXmlExpr(IS_XMLPARSE, NULL, NIL, list_make2($4, makeBoolAConst($5, -1, yyscanner)), @1); + x->xmloption = $3; - $$ = (Node *)x; + $$ = (Node *) x; } | XMLPI '(' NAME_P ColLabel ')' { @@ -14976,11 +16154,12 @@ func_expr_common_subexpr: | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')' { XmlSerialize *n = makeNode(XmlSerialize); + n->xmloption = $3; n->expr = $4; n->typeName = $6; n->location = @1; - $$ = (Node *)n; + $$ = (Node *) n; } ; @@ -15094,7 +16273,8 @@ window_definition_list: window_definition: ColId AS window_specification { - WindowDef *n = $3; + WindowDef *n = $3; + n->name = $1; $$ = n; } @@ -15104,7 +16284,8 @@ over_clause: OVER window_specification { $$ = $2; } | OVER ColId { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->name = $2; n->refname = NULL; n->partitionClause = NIL; @@ -15122,7 +16303,8 @@ over_clause: OVER window_specification window_specification: '(' opt_existing_window_name opt_partition_clause opt_sort_clause opt_frame_clause ')' { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->name = NULL; n->refname = $2; n->partitionClause = $3; @@ -15161,28 +16343,32 @@ opt_partition_clause: PARTITION BY expr_list { $$ = $3; } opt_frame_clause: RANGE frame_extent opt_window_exclusion_clause { - WindowDef *n = $2; + WindowDef *n = $2; + n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_RANGE; n->frameOptions |= $3; $$ = n; } | ROWS frame_extent opt_window_exclusion_clause { - WindowDef *n = $2; + WindowDef *n = $2; + n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_ROWS; n->frameOptions |= $3; $$ = n; } | GROUPS frame_extent opt_window_exclusion_clause { - WindowDef *n = $2; + WindowDef *n = $2; + n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_GROUPS; n->frameOptions |= $3; $$ = n; } | /*EMPTY*/ { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_DEFAULTS; n->startOffset = NULL; n->endOffset = NULL; @@ -15192,7 +16378,8 @@ opt_frame_clause: frame_extent: frame_bound { - WindowDef *n = $1; + WindowDef *n = $1; + /* reject invalid cases */ if (n->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING) ereport(ERROR, @@ -15209,8 +16396,9 @@ frame_extent: frame_bound } | BETWEEN frame_bound AND frame_bound { - WindowDef *n1 = $2; - WindowDef *n2 = $4; + WindowDef *n1 = $2; + WindowDef *n2 = $4; + /* form merged options */ int frameOptions = n1->frameOptions; /* shift converts START_ options to END_ options */ @@ -15254,7 +16442,8 @@ frame_extent: frame_bound frame_bound: UNBOUNDED PRECEDING { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_START_UNBOUNDED_PRECEDING; n->startOffset = NULL; n->endOffset = NULL; @@ -15262,7 +16451,8 @@ frame_bound: } | UNBOUNDED FOLLOWING { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_START_UNBOUNDED_FOLLOWING; n->startOffset = NULL; n->endOffset = NULL; @@ -15270,7 +16460,8 @@ frame_bound: } | CURRENT_P ROW { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_START_CURRENT_ROW; n->startOffset = NULL; n->endOffset = NULL; @@ -15278,7 +16469,8 @@ frame_bound: } | a_expr PRECEDING { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_START_OFFSET_PRECEDING; n->startOffset = $1; n->endOffset = NULL; @@ -15286,7 +16478,8 @@ frame_bound: } | a_expr FOLLOWING { - WindowDef *n = makeNode(WindowDef); + WindowDef *n = makeNode(WindowDef); + n->frameOptions = FRAMEOPTION_START_OFFSET_FOLLOWING; n->startOffset = $1; n->endOffset = NULL; @@ -15412,6 +16605,7 @@ func_arg_expr: a_expr | param_name COLON_EQUALS a_expr { NamedArgExpr *na = makeNode(NamedArgExpr); + na->name = $1; na->arg = (Expr *) $3; na->argnumber = -1; /* until determined */ @@ -15421,6 +16615,7 @@ func_arg_expr: a_expr | param_name EQUALS_GREATER a_expr { NamedArgExpr *na = makeNode(NamedArgExpr); + na->name = $1; na->arg = (Expr *) $3; na->argnumber = -1; /* until determined */ @@ -15573,12 +16768,13 @@ trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); } in_expr: select_with_parens { - SubLink *n = makeNode(SubLink); + SubLink *n = makeNode(SubLink); + n->subselect = $1; /* other fields will be filled later */ - $$ = (Node *)n; + $$ = (Node *) n; } - | '(' expr_list ')' { $$ = (Node *)$2; } + | '(' expr_list ')' { $$ = (Node *) $2; } ; /* @@ -15590,13 +16786,14 @@ in_expr: select_with_parens */ case_expr: CASE case_arg when_clause_list case_default END_P { - CaseExpr *c = makeNode(CaseExpr); + CaseExpr *c = makeNode(CaseExpr); + c->casetype = InvalidOid; /* not analyzed yet */ c->arg = (Expr *) $2; c->args = $3; c->defresult = (Expr *) $4; c->location = @1; - $$ = (Node *)c; + $$ = (Node *) c; } ; @@ -15609,11 +16806,12 @@ when_clause_list: when_clause: WHEN a_expr THEN a_expr { - CaseWhen *w = makeNode(CaseWhen); + CaseWhen *w = makeNode(CaseWhen); + w->expr = (Expr *) $2; w->result = (Expr *) $4; w->location = @1; - $$ = (Node *)w; + $$ = (Node *) w; } ; @@ -15662,6 +16860,7 @@ indirection_el: | '[' a_expr ']' { A_Indices *ai = makeNode(A_Indices); + ai->is_slice = false; ai->lidx = NULL; ai->uidx = $2; @@ -15670,6 +16869,7 @@ indirection_el: | '[' opt_slice_bound ':' opt_slice_bound ']' { A_Indices *ai = makeNode(A_Indices); + ai->is_slice = true; ai->lidx = $2; ai->uidx = $4; @@ -15717,7 +16917,7 @@ target_el: a_expr AS ColLabel $$ = makeNode(ResTarget); $$->name = $3; $$->indirection = NIL; - $$->val = (Node *)$1; + $$->val = (Node *) $1; $$->location = @1; } | a_expr BareColLabel @@ -15725,7 +16925,7 @@ target_el: a_expr AS ColLabel $$ = makeNode(ResTarget); $$->name = $2; $$->indirection = NIL; - $$->val = (Node *)$1; + $$->val = (Node *) $1; $$->location = @1; } | a_expr @@ -15733,19 +16933,20 @@ target_el: a_expr AS ColLabel $$ = makeNode(ResTarget); $$->name = NULL; $$->indirection = NIL; - $$->val = (Node *)$1; + $$->val = (Node *) $1; $$->location = @1; } | '*' { - ColumnRef *n = makeNode(ColumnRef); + ColumnRef *n = makeNode(ColumnRef); + n->fields = list_make1(makeNode(A_Star)); n->location = @1; $$ = makeNode(ResTarget); $$->name = NULL; $$->indirection = NIL; - $$->val = (Node *)n; + $$->val = (Node *) n; $$->location = @1; } ; @@ -15776,28 +16977,7 @@ qualified_name: } | ColId indirection { - check_qualified_name($2, yyscanner); - $$ = makeRangeVar(NULL, NULL, @1); - switch (list_length($2)) - { - case 1: - $$->catalogname = NULL; - $$->schemaname = $1; - $$->relname = strVal(linitial($2)); - break; - case 2: - $$->catalogname = $1; - $$->schemaname = strVal(linitial($2)); - $$->relname = strVal(lsecond($2)); - break; - default: - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("improper qualified name (too many dotted names): %s", - NameListToString(lcons(makeString($1), $2))), - parser_errposition(@1))); - break; - } + $$ = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner); } ; @@ -15863,15 +17043,16 @@ AexprConst: Iconst | func_name Sconst { /* generic type 'literal' syntax */ - TypeName *t = makeTypeNameFromNameList($1); + TypeName *t = makeTypeNameFromNameList($1); + t->location = @1; $$ = makeStringConstCast($2, @2, t, yyscanner); } | func_name '(' func_arg_list opt_sort_clause ')' Sconst { /* generic syntax with a type modifier */ - TypeName *t = makeTypeNameFromNameList($1); - ListCell *lc; + TypeName *t = makeTypeNameFromNameList($1); + ListCell *lc; /* * We must use func_arg_list and opt_sort_clause in the @@ -15905,13 +17086,15 @@ AexprConst: Iconst } | ConstInterval Sconst opt_interval { - TypeName *t = $1; + TypeName *t = $1; + t->typmods = $3; $$ = makeStringConstCast($2, @2, t, yyscanner); } | ConstInterval '(' Iconst ')' Sconst { - TypeName *t = $1; + TypeName *t = $1; + t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1), makeIntConst($3, @3)); $$ = makeStringConstCast($5, @5, t, yyscanner); @@ -15941,7 +17124,8 @@ SignedIconst: Iconst { $$ = $1; } /* Role specifications */ RoleId: RoleSpec { - RoleSpec *spc = (RoleSpec *) $1; + RoleSpec *spc = (RoleSpec *) $1; + switch (spc->roletype) { case ROLESPEC_CSTRING: @@ -15980,50 +17164,51 @@ RoleId: RoleSpec ; RoleSpec: NonReservedWord + { + /* + * "public" and "none" are not keywords, but they must + * be treated specially here. + */ + RoleSpec *n; + + if (strcmp($1, "public") == 0) { - /* - * "public" and "none" are not keywords, but they must - * be treated specially here. - */ - RoleSpec *n; - if (strcmp($1, "public") == 0) - { - n = (RoleSpec *) makeRoleSpec(ROLESPEC_PUBLIC, @1); - n->roletype = ROLESPEC_PUBLIC; - } - else if (strcmp($1, "none") == 0) - { - ereport(ERROR, - (errcode(ERRCODE_RESERVED_NAME), - errmsg("role name \"%s\" is reserved", - "none"), - parser_errposition(@1))); - } - else - { - n = makeRoleSpec(ROLESPEC_CSTRING, @1); - n->rolename = pstrdup($1); - } - $$ = n; + n = (RoleSpec *) makeRoleSpec(ROLESPEC_PUBLIC, @1); + n->roletype = ROLESPEC_PUBLIC; } - | CURRENT_ROLE + else if (strcmp($1, "none") == 0) { - $$ = makeRoleSpec(ROLESPEC_CURRENT_ROLE, @1); + ereport(ERROR, + (errcode(ERRCODE_RESERVED_NAME), + errmsg("role name \"%s\" is reserved", + "none"), + parser_errposition(@1))); } - | CURRENT_USER + else { - $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1); + n = makeRoleSpec(ROLESPEC_CSTRING, @1); + n->rolename = pstrdup($1); } + $$ = n; + } + | CURRENT_ROLE + { + $$ = makeRoleSpec(ROLESPEC_CURRENT_ROLE, @1); + } + | CURRENT_USER + { + $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1); + } | SESSION_USER - { - $$ = makeRoleSpec(ROLESPEC_SESSION_USER, @1); - } + { + $$ = makeRoleSpec(ROLESPEC_SESSION_USER, @1); + } ; role_list: RoleSpec - { $$ = list_make1($1); } + { $$ = list_make1($1); } | role_list ',' RoleSpec - { $$ = lappend($1, $3); } + { $$ = lappend($1, $3); } ; @@ -16310,8 +17495,10 @@ unreserved_keyword: | LOGGED | MAPPING | MATCH + | MATCHED | MATERIALIZED | MAXVALUE + | MERGE | METHOD | MINUTE_P | MINVALUE @@ -16347,6 +17534,7 @@ unreserved_keyword: | OWNED | OWNER | PARALLEL + | PARAMETER | PARENT | PARSER | PARTIAL @@ -16887,8 +18075,10 @@ bare_label_keyword: | LOGGED | MAPPING | MATCH + | MATCHED | MATERIALIZED | MAXVALUE + | MERGE | METHOD | MINVALUE | MODE @@ -16935,6 +18125,7 @@ bare_label_keyword: | OWNED | OWNER | PARALLEL + | PARAMETER | PARENT | PARSER | PARTIAL @@ -17179,8 +18370,8 @@ makeColumnRef(char *colname, List *indirection, * transposed into the "fields" part of the ColumnRef node. */ ColumnRef *c = makeNode(ColumnRef); - int nfields = 0; - ListCell *l; + int nfields = 0; + ListCell *l; c->location = location; foreach(l, indirection) @@ -17225,7 +18416,8 @@ makeTypeCast(Node *arg, TypeName *typename, int location, core_yyscan_t yyscanner) { incrementTypeCastCount(location, yyscanner); - TypeCast *n = makeNode(TypeCast); + TypeCast *n = makeNode(TypeCast); + n->arg = arg; n->typeName = typename; n->location = location; @@ -17235,20 +18427,20 @@ makeTypeCast(Node *arg, TypeName *typename, int location, static Node * makeStringConst(char *str, int location) { - A_Const *n = makeNode(A_Const); + A_Const *n = makeNode(A_Const); - n->val.type = T_String; - n->val.val.str = str; + n->val.sval.type = T_String; + n->val.sval.sval = str; n->location = location; - return (Node *)n; + return (Node *) n; } static Node * makeStringConstCast(char *str, int location, TypeName *typename, core_yyscan_t yyscanner) { - Node *s = makeStringConst(str, location); + Node *s = makeStringConst(str, location); return makeTypeCast(s, typename, -1, yyscanner); } @@ -17256,96 +18448,93 @@ makeStringConstCast(char *str, int location, TypeName *typename, static Node * makeIntConst(int val, int location) { - A_Const *n = makeNode(A_Const); + A_Const *n = makeNode(A_Const); - n->val.type = T_Integer; - n->val.val.ival = val; + n->val.ival.type = T_Integer; + n->val.ival.ival = val; n->location = location; - return (Node *)n; + return (Node *) n; } static Node * makeFloatConst(char *str, int location) { - A_Const *n = makeNode(A_Const); + A_Const *n = makeNode(A_Const); + + n->val.fval.type = T_Float; + n->val.fval.fval = str; + n->location = location; + + return (Node *) n; +} +static Node * +makeBoolAConst(bool state, int location, core_yyscan_t yyscanner) +{ + incrementTypeCastCount(location, yyscanner); + A_Const *n = makeNode(A_Const); - n->val.type = T_Float; - n->val.val.str = str; + n->val.boolval.type = T_Boolean; + n->val.boolval.boolval = state; n->location = location; - return (Node *)n; + return (Node *) n; } static Node * makeBitStringConst(char *str, int location) { - A_Const *n = makeNode(A_Const); + A_Const *n = makeNode(A_Const); - n->val.type = T_BitString; - n->val.val.str = str; + n->val.bsval.type = T_BitString; + n->val.bsval.bsval = str; n->location = location; - return (Node *)n; + return (Node *) n; } static Node * makeNullAConst(int location) { - A_Const *n = makeNode(A_Const); + A_Const *n = makeNode(A_Const); - n->val.type = T_Null; + n->isnull = true; n->location = location; - return (Node *)n; + return (Node *) n; } static Node * -makeAConst(Value *v, int location) +makeAConst(Node *v, int location) { - Node *n; + Node *n; switch (v->type) { case T_Float: - n = makeFloatConst(v->val.str, location); + n = makeFloatConst(castNode(Float, v)->fval, location); break; case T_Integer: - n = makeIntConst(v->val.ival, location); + n = makeIntConst(castNode(Integer, v)->ival, location); break; - case T_String: default: - n = makeStringConst(v->val.str, location); - break; + /* currently not used */ + Assert(false); + n = NULL; } return n; } -/* makeBoolAConst() - * Create an A_Const string node and put it inside a boolean cast. - */ -static Node * -makeBoolAConst(bool state, int location, core_yyscan_t yyscanner) -{ - A_Const *n = makeNode(A_Const); - - n->val.type = T_String; - n->val.val.str = (state ? "t" : "f"); - n->location = location; - - return makeTypeCast((Node *)n, SystemTypeName("bool"), -1, yyscanner); -} - /* makeRoleSpec * Create a RoleSpec with the given type */ static RoleSpec * makeRoleSpec(RoleSpecType type, int location) { - RoleSpec *spec = makeNode(RoleSpec); + RoleSpec *spec = makeNode(RoleSpec); spec->roletype = type; spec->location = location; @@ -17451,7 +18640,7 @@ makeOrderedSetArgs(List *directargs, List *orderedargs, core_yyscan_t yyscanner) { FunctionParameter *lastd = (FunctionParameter *) llast(directargs); - Value *ndirectargs; + Integer *ndirectargs; /* No restriction unless last direct arg is VARIADIC */ if (lastd->mode == FUNC_PARAM_VARIADIC) @@ -17618,19 +18807,19 @@ doNegate(Node *n, int location) { if (IsA(n, A_Const)) { - A_Const *con = (A_Const *)n; + A_Const *con = (A_Const *) n; /* report the constant's location as that of the '-' sign */ con->location = location; - if (con->val.type == T_Integer) + if (IsA(&con->val, Integer)) { - con->val.val.ival = -con->val.val.ival; + con->val.ival.ival = -con->val.ival.ival; return n; } - if (con->val.type == T_Float) + if (IsA(&con->val, Float)) { - doNegateFloat(&con->val); + doNegateFloat(&con->val.fval); return n; } } @@ -17639,17 +18828,16 @@ doNegate(Node *n, int location) } static void -doNegateFloat(Value *v) +doNegateFloat(Float *v) { - char *oldval = v->val.str; + char *oldval = v->fval; - Assert(IsA(v, Float)); if (*oldval == '+') oldval++; if (*oldval == '-') - v->val.str = oldval+1; /* just strip the '-' */ + v->fval = oldval+1; /* just strip the '-' */ else - v->val.str = psprintf("-%s", oldval); + v->fval = psprintf("-%s", oldval); } static Node * @@ -17658,7 +18846,7 @@ makeAndExpr(Node *lexpr, Node *rexpr, int location) /* Flatten "a AND b AND c ..." to a single BoolExpr on sight */ if (IsA(lexpr, BoolExpr)) { - BoolExpr *blexpr = (BoolExpr *) lexpr; + BoolExpr *blexpr = (BoolExpr *) lexpr; if (blexpr->boolop == AND_EXPR) { @@ -17675,7 +18863,7 @@ makeOrExpr(Node *lexpr, Node *rexpr, int location) /* Flatten "a OR b OR c ..." to a single BoolExpr on sight */ if (IsA(lexpr, BoolExpr)) { - BoolExpr *blexpr = (BoolExpr *) lexpr; + BoolExpr *blexpr = (BoolExpr *) lexpr; if (blexpr->boolop == OR_EXPR) { @@ -17775,7 +18963,7 @@ mergeTableFuncParameters(List *func_args, List *columns) static TypeName * TableFuncTypeName(List *columns) { - TypeName *result; + TypeName *result; if (list_length(columns) == 1) { @@ -17799,7 +18987,7 @@ TableFuncTypeName(List *columns) static RangeVar * makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner) { - RangeVar *r = makeNode(RangeVar); + RangeVar *r = makeNode(RangeVar); switch (list_length(names)) { @@ -17833,6 +19021,43 @@ makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner) return r; } +/* + * Convert a relation_name with name and namelist to a RangeVar using + * makeRangeVar. + */ +static RangeVar * +makeRangeVarFromQualifiedName(char *name, List *namelist, int location, + core_yyscan_t yyscanner) +{ + RangeVar *r; + + check_qualified_name(namelist, yyscanner); + r = makeRangeVar(NULL, NULL, location); + + switch (list_length(namelist)) + { + case 1: + r->catalogname = NULL; + r->schemaname = name; + r->relname = strVal(linitial(namelist)); + break; + case 2: + r->catalogname = name; + r->schemaname = strVal(linitial(namelist)); + r->relname = strVal(lsecond(namelist)); + break; + default: + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("improper qualified name (too many dotted names): %s", + NameListToString(lcons(makeString(name), namelist))), + parser_errposition(location)); + break; + } + + return r; +} + /* Separate Constraint nodes from COLLATE clauses in a ColQualList */ static void SplitColQualList(List *qualList, @@ -17844,7 +19069,7 @@ SplitColQualList(List *qualList, *collClause = NULL; foreach(cell, qualList) { - Node *n = (Node *) lfirst(cell); + Node *n = (Node *) lfirst(cell); if (IsA(n, Constraint)) { @@ -17941,6 +19166,91 @@ processCASbits(int cas_bits, int location, const char *constrType, } } +/* + * Process pubobjspec_list to check for errors in any of the objects and + * convert PUBLICATIONOBJ_CONTINUATION into appropriate PublicationObjSpecType. + */ +static void +preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner) +{ + ListCell *cell; + PublicationObjSpec *pubobj; + PublicationObjSpecType prevobjtype = PUBLICATIONOBJ_CONTINUATION; + + if (!pubobjspec_list) + return; + + pubobj = (PublicationObjSpec *) linitial(pubobjspec_list); + if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid publication object list"), + errdetail("One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name."), + parser_errposition(pubobj->location)); + + foreach(cell, pubobjspec_list) + { + pubobj = (PublicationObjSpec *) lfirst(cell); + + if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION) + pubobj->pubobjtype = prevobjtype; + + if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE) + { + /* relation name or pubtable must be set for this type of object */ + if (!pubobj->name && !pubobj->pubtable) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid table name"), + parser_errposition(pubobj->location)); + + if (pubobj->name) + { + /* convert it to PublicationTable */ + PublicationTable *pubtable = makeNode(PublicationTable); + + pubtable->relation = + makeRangeVar(NULL, pubobj->name, pubobj->location); + pubobj->pubtable = pubtable; + pubobj->name = NULL; + } + } + 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)); + + /* 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. + */ + if (pubobj->name) + pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA; + else if (!pubobj->name && !pubobj->pubtable) + pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA; + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid schema name"), + parser_errposition(pubobj->location)); + } + + prevobjtype = pubobj->pubobjtype; + } +} + /*---------- * Recursive view transformation * diff --git a/third_party/spanner_pg/src/backend/parser/parse_agg.c b/third_party/spanner_pg/src/backend/parser/parse_agg.c index a87d249b..3da4f28d 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_agg.c +++ b/third_party/spanner_pg/src/backend/parser/parse_agg.c @@ -3,7 +3,7 @@ * parse_agg.c * handle aggregates and window functions in parser * - * 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 * * @@ -445,6 +445,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; @@ -890,6 +897,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; @@ -1963,6 +1973,11 @@ resolve_aggregate_transtype(Oid aggfuncid, * latter may be InvalidOid, however if invtransfn_oid is set then * transfn_oid must also be set. * + * transfn_oid may also be passed as the aggcombinefn when the *transfnexpr is + * to be used for a combine aggregate phase. We expect invtransfn_oid to be + * InvalidOid in this case since there is no such thing as an inverse + * combinefn. + * * Pointers to the constructed trees are returned into *transfnexpr, * *invtransfnexpr. If there is no invtransfn, the respective pointer is set * to NULL. Since use of the invtransfn is optional, NULL may be passed for @@ -2025,35 +2040,6 @@ build_aggregate_transfn_expr(Oid *agg_input_types, } } -/* - * Like build_aggregate_transfn_expr, but creates an expression tree for the - * combine function of an aggregate, rather than the transition function. - */ -void -build_aggregate_combinefn_expr(Oid agg_state_type, - Oid agg_input_collation, - Oid combinefn_oid, - Expr **combinefnexpr) -{ - Node *argp; - List *args; - FuncExpr *fexpr; - - /* combinefn takes two arguments of the aggregate state type */ - argp = make_agg_arg(agg_state_type, agg_input_collation); - - args = list_make2(argp, argp); - - fexpr = makeFuncExpr(combinefn_oid, - agg_state_type, - args, - InvalidOid, - agg_input_collation, - COERCE_EXPLICIT_CALL); - /* combinefn is currently never treated as variadic */ - *combinefnexpr = (Expr *) fexpr; -} - /* * Like build_aggregate_transfn_expr, but creates an expression tree for the * serialization function of an aggregate. diff --git a/third_party/spanner_pg/src/backend/parser/parse_clause.c b/third_party/spanner_pg/src/backend/parser/parse_clause.c index 7302b24d..39bd2373 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_clause.c +++ b/third_party/spanner_pg/src/backend/parser/parse_clause.c @@ -3,7 +3,7 @@ * parse_clause.c * handle clauses in parser * - * 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 * * @@ -158,7 +158,7 @@ transformFromClause(ParseState *pstate, List *frmList) /* * setTargetTable - * Add the target relation of INSERT/UPDATE/DELETE to the range table, + * Add the target relation of INSERT/UPDATE/DELETE/MERGE to the range table, * and make the special links to it in the ParseState. * * We also open the target relation and acquire a write lock on it. @@ -168,7 +168,9 @@ transformFromClause(ParseState *pstate, List *frmList) * * If alsoSource is true, add the target to the query's joinlist and * namespace. For INSERT, we don't want the target to be joined to; - * it's a destination of tuples, not a source. For UPDATE/DELETE, + * it's a destination of tuples, not a source. MERGE is actually + * both, but we'll add it separately to joinlist and namespace, so + * doing nothing (like INSERT) is correct here. For UPDATE/DELETE, * we do need to scan or join the target. (NOTE: we do not bother * to check for namespace conflict; we assume that the namespace was * initially empty in these cases.) @@ -863,7 +865,7 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf) { foreach(lc2, ns_names) { - Value *ns_node = (Value *) lfirst(lc2); + String *ns_node = lfirst_node(String, lc2); if (ns_node == NULL) continue; @@ -1260,7 +1262,7 @@ transformFromClauseItem(ParseState *pstate, Node *n, foreach(lx, l_colnames) { char *l_colname = strVal(lfirst(lx)); - Value *m_name = NULL; + String *m_name = NULL; if (l_colname[0] == '\0') continue; /* ignore dropped columns */ @@ -1812,7 +1814,7 @@ transformLimitClause(ParseState *pstate, Node *clause, * unadorned NULL that's not accepted back by the grammar. */ if (exprKind == EXPR_KIND_LIMIT && limitOption == LIMIT_OPTION_WITH_TIES && - IsA(clause, A_Const) && ((A_Const *) clause)->val.type == T_Null) + IsA(clause, A_Const) && castNode(A_Const, clause)->isnull) ereport(ERROR, (errcode(ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE), errmsg("row count cannot be null in FETCH FIRST ... WITH TIES clause"))); @@ -2028,20 +2030,19 @@ findTargetlistEntrySQL92(ParseState *pstate, Node *node, List **tlist, } if (IsA(node, A_Const)) { - Value *val = &((A_Const *) node)->val; - int location = ((A_Const *) node)->location; + A_Const *aconst = castNode(A_Const, node); int targetlist_pos = 0; int target_pos; - if (!IsA(val, Integer)) + if (!IsA(&aconst->val, Integer)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), /* translator: %s is name of a SQL construct, eg ORDER BY */ errmsg("non-integer constant in %s", ParseExprKindName(exprKind)), - parser_errposition(pstate, location))); + parser_errposition(pstate, aconst->location))); - target_pos = intVal(val); + target_pos = intVal(&aconst->val); foreach(tl, *tlist) { TargetEntry *tle = (TargetEntry *) lfirst(tl); @@ -2061,7 +2062,7 @@ findTargetlistEntrySQL92(ParseState *pstate, Node *node, List **tlist, /* translator: %s is name of a SQL construct, eg ORDER BY */ errmsg("%s position %d is not in select list", ParseExprKindName(exprKind), target_pos), - parser_errposition(pstate, location))); + parser_errposition(pstate, aconst->location))); } /* @@ -2837,7 +2838,7 @@ transformWindowDefinitions(ParseState *pstate, (errcode(ERRCODE_WINDOWING_ERROR), errmsg("RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column"), parser_errposition(pstate, windef->location))); - sortcl = castNode(SortGroupClause, linitial(wc->orderClause)); + sortcl = linitial_node(SortGroupClause, wc->orderClause); sortkey = get_sortgroupclause_expr(sortcl, *targetlist); /* Find the sort operator in pg_amop */ if (!get_ordering_op_properties(sortcl->sortop, @@ -2871,6 +2872,7 @@ transformWindowDefinitions(ParseState *pstate, rangeopfamily, rangeopcintype, &wc->endInRangeFunc, windef->endOffset); + wc->runCondition = NIL; wc->winref = winref; result = lappend(result, wc); diff --git a/third_party/spanner_pg/src/backend/parser/parse_coerce.c b/third_party/spanner_pg/src/backend/parser/parse_coerce.c index 1d650ce3..7ac9922e 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_coerce.c +++ b/third_party/spanner_pg/src/backend/parser/parse_coerce.c @@ -3,7 +3,7 @@ * parse_coerce.c * handle type coercions/conversions for parser * - * 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/third_party/spanner_pg/src/backend/parser/parse_collate.c b/third_party/spanner_pg/src/backend/parser/parse_collate.c index 51dd5418..7e3ca183 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_collate.c +++ b/third_party/spanner_pg/src/backend/parser/parse_collate.c @@ -29,7 +29,7 @@ * at runtime. If we knew exactly which functions require collation * information, we could throw those errors at parse time instead. * - * 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 * * @@ -486,6 +486,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/third_party/spanner_pg/src/backend/parser/parse_cte.c b/third_party/spanner_pg/src/backend/parser/parse_cte.c index 81f4007e..c4d1fef7 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_cte.c +++ b/third_party/spanner_pg/src/backend/parser/parse_cte.c @@ -3,7 +3,7 @@ * parse_cte.c * handle CTEs (common table expressions) in parser * - * 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 * * @@ -127,6 +127,13 @@ transformWithClause(ParseState *pstate, WithClause *withClause) CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); ListCell *rest; + /* MERGE is allowed by parser, but unimplemented. Reject for now */ + if (IsA(cte->ctequery, MergeStmt)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("MERGE not supported in WITH query"), + parser_errposition(pstate, cte->location)); + for_each_cell(rest, withClause->ctes, lnext(withClause->ctes, lc)) { CommonTableExpr *cte2 = (CommonTableExpr *) lfirst(rest); @@ -463,7 +470,7 @@ analyzeCTE(ParseState *pstate, CommonTableExpr *cte) foreach(lc, search_clause->search_col_list) { - Value *colname = lfirst(lc); + String *colname = lfirst_node(String, lc); if (!list_member(cte->ctecolnames, colname)) ereport(ERROR, @@ -496,7 +503,7 @@ analyzeCTE(ParseState *pstate, CommonTableExpr *cte) foreach(lc, cycle_clause->cycle_col_list) { - Value *colname = lfirst(lc); + String *colname = lfirst_node(String, lc); if (!list_member(cte->ctecolnames, colname)) ereport(ERROR, diff --git a/third_party/spanner_pg/src/backend/parser/parse_enr.c b/third_party/spanner_pg/src/backend/parser/parse_enr.c index a34498df..43fd6831 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_enr.c +++ b/third_party/spanner_pg/src/backend/parser/parse_enr.c @@ -3,7 +3,7 @@ * parse_enr.c * parser support routines dealing with ephemeral named relations * - * 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/third_party/spanner_pg/src/backend/parser/parse_expr.c b/third_party/spanner_pg/src/backend/parser/parse_expr.c index 55852cc2..5a77a1f8 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_expr.c +++ b/third_party/spanner_pg/src/backend/parser/parse_expr.c @@ -3,7 +3,7 @@ * parse_expr.c * handle expressions in parser * - * 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 * * @@ -133,13 +133,8 @@ transformExprRecurse(ParseState *pstate, Node *expr) break; case T_A_Const: - { - A_Const *con = (A_Const *) expr; - Value *val = &con->val; - - result = (Node *) make_const(pstate, val, con->location); - break; - } + result = (Node *) make_const(pstate, (A_Const *) expr); + break; case T_A_Indirection: result = transformIndirection(pstate, (A_Indirection *) expr); @@ -490,6 +485,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: @@ -881,7 +877,7 @@ exprIsNullConstant(Node *arg) { A_Const *con = (A_Const *) arg; - if (con->val.type == T_Null) + if (con->isnull) return true; } return false; @@ -1657,7 +1653,7 @@ transformCaseExpr(ParseState *pstate, CaseExpr *c) { A_Const *n = makeNode(A_Const); - n->val.type = T_Null; + n->isnull = true; n->location = -1; defresult = (Node *) n; } @@ -1719,8 +1715,8 @@ transformSubLink(ParseState *pstate, SubLink *sublink) /* * Check to see if the sublink is in an invalid place within the query. We - * allow sublinks everywhere in SELECT/INSERT/UPDATE/DELETE, but generally - * not in utility statements. + * allow sublinks everywhere in SELECT/INSERT/UPDATE/DELETE/MERGE, but + * generally not in utility statements. */ err = NULL; switch (pstate->p_expr_kind) @@ -1748,6 +1744,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: @@ -3091,6 +3088,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/third_party/spanner_pg/src/backend/parser/parse_func.c b/third_party/spanner_pg/src/backend/parser/parse_func.c index 06b99ca2..ac618731 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_func.c +++ b/third_party/spanner_pg/src/backend/parser/parse_func.c @@ -3,7 +3,7 @@ * parse_func.c * handle function calls in parser * - * 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 * * @@ -2613,6 +2613,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/third_party/spanner_pg/src/backend/parser/parse_merge.c b/third_party/spanner_pg/src/backend/parser/parse_merge.c new file mode 100644 index 00000000..71d6e873 --- /dev/null +++ b/third_party/spanner_pg/src/backend/parser/parse_merge.c @@ -0,0 +1,427 @@ +/*------------------------------------------------------------------------- + * + * 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 "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" + +#include "third_party/spanner_pg/shims/catalog_shim.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 (is_terminal[when_type]) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unreachable WHEN clause specified after unconditional WHEN clause"))); + if (mergeWhenClause->condition == NULL) + is_terminal[when_type] = true; + } + + /* + * Set up the MERGE target table. The target table is added to the + * namespace below and to joinlist in transform_MERGE_to_join, so don't + * do it here. + */ + qry->resultRelation = setTargetTable(pstate, stmt->relation, + stmt->relation->inh, + false, targetPerms); + + /* + * MERGE is unsupported in various cases + */ + if (pstate->p_target_relation_oid != InvalidOid) { + Relation p_target_relation = + RelationIdGetRelation(pstate->p_target_relation_oid); + if (p_target_relation->rd_rel->relkind != RELKIND_RELATION && + p_target_relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + RelationGetRelationName(p_target_relation)), + errdetail_relkind_not_supported(p_target_relation->rd_rel->relkind))); + if (p_target_relation->rd_rules != NULL && + p_target_relation->rd_rules->numLocks > 0) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + RelationGetRelationName(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.")); + + /* + * There's no need for a targetlist here; it'll be set up by + * preprocess_targetlist later. + */ + qry->targetList = NIL; + 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/third_party/spanner_pg/src/backend/parser/parse_node.c b/third_party/spanner_pg/src/backend/parser/parse_node.c index 77101d99..dc206aa0 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_node.c +++ b/third_party/spanner_pg/src/backend/parser/parse_node.c @@ -3,7 +3,7 @@ * parse_node.c * various routines that make nodes for querytrees * - * 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 * * @@ -26,7 +26,6 @@ #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "utils/builtins.h" -#include "utils/int8.h" #include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/varbit.h" @@ -338,7 +337,7 @@ transformContainerSubscripts_UNUSED_SPANGRES(ParseState *pstate, /* * make_const * - * Convert a Value node (as returned by the grammar) to a Const node + * Convert an A_Const node (as returned by the grammar) to a Const node * of the "natural" type for the constant. Note that this routine is * only used when there is no explicit cast for the constant, so we * have to guess what type is wanted. @@ -354,20 +353,33 @@ transformContainerSubscripts_UNUSED_SPANGRES(ParseState *pstate, * too many examples that fail if we try. */ Const * -make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) +make_const_UNUSED_SPANGRES(ParseState *pstate, A_Const *aconst) { Const *con; Datum val; - int64 val64; Oid typeid; int typelen; bool typebyval; ParseCallbackState pcbstate; - switch (nodeTag(value)) + if (aconst->isnull) + { + /* return a null const */ + con = makeConst(UNKNOWNOID, + -1, + InvalidOid, + -2, + (Datum) 0, + true, + false); + con->location = aconst->location; + return con; + } + + switch (nodeTag(&aconst->val)) { case T_Integer: - val = Int32GetDatum(intVal(value)); + val = Int32GetDatum(intVal(&aconst->val)); typeid = INT4OID; typelen = sizeof(int32); @@ -375,46 +387,63 @@ make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) break; case T_Float: - /* could be an oversize integer as well as a float ... */ - if (scanint8(strVal(value), true, &val64)) { - /* - * It might actually fit in int32. Probably only INT_MIN can - * occur, but we'll code the test generally just to be sure. - */ - int32 val32 = (int32) val64; + /* could be an oversize integer as well as a float ... */ - if (val64 == (int64) val32) - { - val = Int32GetDatum(val32); + int64 val64; + char *endptr; - typeid = INT4OID; - typelen = sizeof(int32); - typebyval = true; + errno = 0; + val64 = strtoi64(aconst->val.fval.fval, &endptr, 10); + if (errno == 0 && *endptr == '\0') + { + /* + * It might actually fit in int32. Probably only INT_MIN + * can occur, but we'll code the test generally just to be + * sure. + */ + int32 val32 = (int32) val64; + + if (val64 == (int64) val32) + { + val = Int32GetDatum(val32); + + typeid = INT4OID; + typelen = sizeof(int32); + typebyval = true; + } + else + { + val = Int64GetDatum(val64); + + typeid = INT8OID; + typelen = sizeof(int64); + typebyval = FLOAT8PASSBYVAL; /* int8 and float8 alike */ + } } else { - val = Int64GetDatum(val64); - - typeid = INT8OID; - typelen = sizeof(int64); - typebyval = FLOAT8PASSBYVAL; /* int8 and float8 alike */ + /* arrange to report location if numeric_in() fails */ + setup_parser_errposition_callback(&pcbstate, pstate, aconst->location); + val = DirectFunctionCall3(numeric_in, + CStringGetDatum(aconst->val.fval.fval), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1)); + cancel_parser_errposition_callback(&pcbstate); + + typeid = NUMERICOID; + typelen = -1; /* variable len */ + typebyval = false; } + break; } - else - { - /* arrange to report location if numeric_in() fails */ - setup_parser_errposition_callback(&pcbstate, pstate, location); - val = DirectFunctionCall3(numeric_in, - CStringGetDatum(strVal(value)), - ObjectIdGetDatum(InvalidOid), - Int32GetDatum(-1)); - cancel_parser_errposition_callback(&pcbstate); - - typeid = NUMERICOID; - typelen = -1; /* variable len */ - typebyval = false; - } + + case T_Boolean: + val = BoolGetDatum(boolVal(&aconst->val)); + + typeid = BOOLOID; + typelen = 1; + typebyval = true; break; case T_String: @@ -423,7 +452,7 @@ make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) * We assume here that UNKNOWN's internal representation is the * same as CSTRING */ - val = CStringGetDatum(strVal(value)); + val = CStringGetDatum(strVal(&aconst->val)); typeid = UNKNOWNOID; /* will be coerced later */ typelen = -2; /* cstring-style varwidth type */ @@ -432,9 +461,9 @@ make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) case T_BitString: /* arrange to report location if bit_in() fails */ - setup_parser_errposition_callback(&pcbstate, pstate, location); + setup_parser_errposition_callback(&pcbstate, pstate, aconst->location); val = DirectFunctionCall3(bit_in, - CStringGetDatum(strVal(value)), + CStringGetDatum(aconst->val.bsval.bsval), ObjectIdGetDatum(InvalidOid), Int32GetDatum(-1)); cancel_parser_errposition_callback(&pcbstate); @@ -443,20 +472,8 @@ make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) typebyval = false; break; - case T_Null: - /* return a null const */ - con = makeConst(UNKNOWNOID, - -1, - InvalidOid, - -2, - (Datum) 0, - true, - false); - con->location = location; - return con; - default: - elog(ERROR, "unrecognized node type: %d", (int) nodeTag(value)); + elog(ERROR, "unrecognized node type: %d", (int) nodeTag(&aconst->val)); return NULL; /* keep compiler quiet */ } @@ -467,7 +484,7 @@ make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location) val, false, typebyval); - con->location = location; + con->location = aconst->location; return con; } diff --git a/third_party/spanner_pg/src/backend/parser/parse_oper.c b/third_party/spanner_pg/src/backend/parser/parse_oper.c index f44d6b46..526f7f11 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_oper.c +++ b/third_party/spanner_pg/src/backend/parser/parse_oper.c @@ -3,7 +3,7 @@ * parse_oper.c * handle operator things for parser * - * 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 * * @@ -912,6 +912,7 @@ make_scalar_array_op(ParseState *pstate, List *opname, result->opno = oprid(tup); result->opfuncid = opform->oprcode; result->hashfuncid = InvalidOid; + result->negfuncid = InvalidOid; result->useOr = useOr; /* inputcollid will be set by parse_collate.c */ result->args = args; diff --git a/third_party/spanner_pg/src/backend/parser/parse_param.c b/third_party/spanner_pg/src/backend/parser/parse_param.c index d3ae96db..f9159c95 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_param.c +++ b/third_party/spanner_pg/src/backend/parser/parse_param.c @@ -12,7 +12,7 @@ * Note that other approaches to parameters are possible using the parser * hooks defined in ParseState. * - * 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 * * @@ -36,7 +36,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; @@ -65,8 +65,8 @@ static bool check_parameter_resolution_walker(Node *node, ParseState *pstate);st * 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)); @@ -81,8 +81,8 @@ parse_fixed_parameters(ParseState *pstate, * Set up to process a query containing references to variable parameters. */ void -parse_variable_parameters(ParseState *pstate, - Oid **paramTypes, int *numParams) +setup_parse_variable_parameters(ParseState *pstate, + Oid **paramTypes, int *numParams) { VarParamState *parstate = palloc(sizeof(VarParamState)); diff --git a/third_party/spanner_pg/src/backend/parser/parse_relation.c b/third_party/spanner_pg/src/backend/parser/parse_relation.c index a134ff0f..758421c1 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_relation.c +++ b/third_party/spanner_pg/src/backend/parser/parse_relation.c @@ -3,7 +3,7 @@ * parse_relation.c * parser support routines dealing with relations * - * 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 * * @@ -706,6 +706,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) { @@ -1160,7 +1171,7 @@ buildRelationAliases(TupleDesc tupdesc, Alias *alias, Alias *eref) for (varattno = 0; varattno < maxattrs; varattno++) { Form_pg_attribute attr = TupleDescAttr(tupdesc, varattno); - Value *attrname; + String *attrname; if (attr->attisdropped) { @@ -1173,7 +1184,7 @@ buildRelationAliases(TupleDesc tupdesc, Alias *alias, Alias *eref) else if (aliaslc) { /* Use the next user-supplied alias */ - attrname = (Value *) lfirst(aliaslc); + attrname = lfirst_node(String, aliaslc); aliaslc = lnext(aliaslist, aliaslc); alias->colnames = lappend(alias->colnames, attrname); } @@ -2018,7 +2029,7 @@ addRangeTableEntryForTableFunc(ParseState *pstate, bool inFromCl) { RangeTblEntry *rte = makeNode(RangeTblEntry); - char *refname = alias ? alias->aliasname : pstrdup("xmltable"); + char *refname; Alias *eref; int numaliases; @@ -2036,6 +2047,8 @@ addRangeTableEntryForTableFunc(ParseState *pstate, Assert(list_length(tf->coltypmods) == list_length(tf->colnames)); Assert(list_length(tf->colcollations) == list_length(tf->colnames)); + refname = alias ? alias->aliasname : pstrdup("xmltable"); + rte->rtekind = RTE_TABLEFUNC; rte->relid = InvalidOid; rte->subquery = NULL; @@ -2057,7 +2070,8 @@ addRangeTableEntryForTableFunc(ParseState *pstate, ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("%s function has %d columns available but %d columns specified", - "XMLTABLE", list_length(tf->colnames), numaliases))); + "XMLTABLE", + list_length(tf->colnames), numaliases))); rte->eref = eref; @@ -3121,7 +3135,7 @@ expandNSItemVars_UNUSED_SPANGRES(ParseNamespaceItem *nsitem, colindex = 0; foreach(lc, nsitem->p_names->colnames) { - Value *colnameval = (Value *) lfirst(lc); + String *colnameval = lfirst(lc); const char *colname = strVal(colnameval); ParseNamespaceColumn *nscol = nsitem->p_nscolumns + colindex; @@ -3165,11 +3179,12 @@ expandNSItemVars_UNUSED_SPANGRES(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, @@ -3203,8 +3218,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/third_party/spanner_pg/src/backend/parser/parse_target.c b/third_party/spanner_pg/src/backend/parser/parse_target.c index 6503a765..b5a2308d 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_target.c +++ b/third_party/spanner_pg/src/backend/parser/parse_target.c @@ -3,7 +3,7 @@ * parse_target.c * handle target lists * - * 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 * * @@ -1322,6 +1322,7 @@ ExpandAllTables(ParseState *pstate, int location) expandNSItemAttrs(pstate, nsitem, 0, + true, location)); } @@ -1384,7 +1385,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/third_party/spanner_pg/src/backend/parser/parse_type.c b/third_party/spanner_pg/src/backend/parser/parse_type.c index 1f955041..908b61d1 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_type.c +++ b/third_party/spanner_pg/src/backend/parser/parse_type.c @@ -3,7 +3,7 @@ * parse_type.c * handle type operations for parser * - * 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 * * @@ -391,13 +391,17 @@ typenameTypeMod(ParseState *pstate, const TypeName *typeName, Type typ) if (IsA(&ac->val, Integer)) { - cstr = psprintf("%ld", (long) ac->val.val.ival); + cstr = psprintf("%ld", (long) intVal(&ac->val)); } - else if (IsA(&ac->val, Float) || - IsA(&ac->val, String)) + else if (IsA(&ac->val, Float)) { - /* we can just use the str field directly. */ - cstr = ac->val.val.str; + /* we can just use the string representation directly. */ + cstr = ac->val.fval.fval; + } + else if (IsA(&ac->val, String)) + { + /* we can just use the string representation directly. */ + cstr = strVal(&ac->val); } } else if (IsA(tm, ColumnRef)) diff --git a/third_party/spanner_pg/src/backend/parser/parse_utilcmd.c b/third_party/spanner_pg/src/backend/parser/parse_utilcmd.c index e144d0ee..34635988 100644 --- a/third_party/spanner_pg/src/backend/parser/parse_utilcmd.c +++ b/third_party/spanner_pg/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 @@ -12,7 +12,7 @@ * respective utility commands. * * - * 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 * * src/backend/parser/parse_utilcmd.c @@ -389,9 +389,7 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, if (strcmp(defel->defname, "sequence_name") == 0) { if (nameEl) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"))); + errorConflictingDefElem(defel, cxt->pstate); nameEl = defel; nameEl_idx = foreach_current_index(option); } @@ -444,6 +442,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; /* @@ -601,8 +600,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) */ qstring = quote_qualified_identifier(snamespace, sname); snamenode = makeNode(A_Const); - snamenode->val.type = T_String; - snamenode->val.val.str = qstring; + snamenode->val.node.type = T_String; + snamenode->val.sval.sval = qstring; snamenode->location = -1; castnode = makeNode(TypeCast); castnode->typeName = SystemTypeName("regclass"); @@ -973,8 +972,9 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a table, view, materialized view, composite type, or foreign table", - RelationGetRelationName(relation)))); + errmsg("relation \"%s\" is invalid in LIKE clause", + RelationGetRelationName(relation)), + errdetail_relkind_not_supported(relation->rd_rel->relkind))); cancel_parser_errposition_callback(&pcbstate); @@ -1476,7 +1476,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename) n->location = -1; cxt->columns = lappend(cxt->columns, n); } - DecrTupleDescRefCount(tupdesc); + ReleaseTupleDesc(tupdesc); ReleaseSysCache(tuple); } @@ -1573,6 +1573,7 @@ generateClonedIndexStmt(RangeVar *heapRel, Relation source_idx, index->oldCreateSubid = InvalidSubTransactionId; index->oldFirstRelfilenodeSubid = InvalidSubTransactionId; index->unique = idxrec->indisunique; + index->nulls_not_distinct = idxrec->indnullsnotdistinct; index->primary = idxrec->indisprimary; index->transformed = true; /* don't need transformIndexStmt */ index->concurrent = false; @@ -2104,6 +2105,7 @@ transformIndexConstraints(CreateStmtContext *cxt) equal(index->whereClause, priorindex->whereClause) && equal(index->excludeOpNames, priorindex->excludeOpNames) && strcmp(index->accessMethod, priorindex->accessMethod) == 0 && + index->nulls_not_distinct == priorindex->nulls_not_distinct && index->deferrable == priorindex->deferrable && index->initdeferred == priorindex->initdeferred) { @@ -2170,6 +2172,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) * DefineIndex will check for it. */ } + index->nulls_not_distinct = constraint->nulls_not_distinct; index->isconstraint = true; index->deferrable = constraint->deferrable; index->initdeferred = constraint->initdeferred; @@ -2416,7 +2419,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) /* Make sure referenced column exists. */ foreach(columns, cxt->columns) { - column = castNode(ColumnDef, lfirst(columns)); + column = lfirst_node(ColumnDef, columns); if (strcmp(column->colname, key) == 0) { found = true; @@ -2454,7 +2457,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) foreach(inher, cxt->inhRelations) { - RangeVar *inh = castNode(RangeVar, lfirst(inher)); + RangeVar *inh = lfirst_node(RangeVar, inher); Relation rel; int count; @@ -4082,7 +4085,7 @@ transformPartitionBound(ParseState *pstate, Relation parent, duplicate = false; foreach(cell2, result_spec->listdatums) { - Const *value2 = castNode(Const, lfirst(cell2)); + Const *value2 = lfirst_node(Const, cell2); if (equal(value, value2)) { @@ -4261,7 +4264,7 @@ validateInfiniteBounds(ParseState *pstate, List *blist) foreach(lc, blist) { - PartitionRangeDatum *prd = castNode(PartitionRangeDatum, lfirst(lc)); + PartitionRangeDatum *prd = lfirst_node(PartitionRangeDatum, lc); if (kind == prd->kind) continue; diff --git a/third_party/spanner_pg/src/backend/parser/parser.c b/third_party/spanner_pg/src/backend/parser/parser.c index c927cfe8..1ca36756 100644 --- a/third_party/spanner_pg/src/backend/parser/parser.c +++ b/third_party/spanner_pg/src/backend/parser/parser.c @@ -10,7 +10,7 @@ * analyze.c and related files. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/parser/scan.l b/third_party/spanner_pg/src/backend/parser/scan.l index 73a85a3d..ff1c5f1a 100644 --- a/third_party/spanner_pg/src/backend/parser/scan.l +++ b/third_party/spanner_pg/src/backend/parser/scan.l @@ -22,7 +22,7 @@ * Postgres 9.2, this check is made automatically by the Makefile.) * * - * 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 * * IDENTIFICATION @@ -39,6 +39,7 @@ #include "parser/gramparse.h" #include "parser/parser.h" /* only needed for GUC variables */ #include "parser/scansup.h" +#include "port/pg_bitutils.h" #include "mb/pg_wchar.h" } @@ -173,7 +174,7 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * bit string literal * extended C-style comments * delimited identifiers (double-quoted identifiers) - * hexadecimal numeric string + * hexadecimal byte string * standard quoted strings * quote stop (detect continued strings) * extended quoted strings (support backslash escape sequences) @@ -261,7 +262,7 @@ quotecontinuefail {whitespace}*"-"? xbstart [bB]{quote} xbinside [^']* -/* Hexadecimal number */ +/* Hexadecimal byte string */ xhstart [xX]{quote} xhinside [^']* @@ -340,7 +341,6 @@ xcstart \/\*{op_chars}* xcstop \*+\/ xcinside [^*/]+ -digit [0-9] ident_start [A-Za-z\200-\377_] ident_cont [A-Za-z\200-\377_0-9\$] @@ -379,24 +379,31 @@ self [,()\[\].;\:\+\-\*\/\%\^\<\>\=] op_chars [\~\!\@\#\^\&\|\`\?\+\-\*\/\%\<\>\=] operator {op_chars}+ -/* we no longer allow unary minus in numbers. - * instead we pass it separately to parser. there it gets - * coerced via doNegate() -- Leon aug 20 1999 +/* + * Numbers + * + * Unary minus is not part of a number here. Instead we pass it separately to + * the parser, and there it gets coerced via doNegate(). * * {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10. * - * {realfail1} and {realfail2} are added to prevent the need for scanner + * {realfail} is added to prevent the need for scanner * backup when the {real} rule fails to match completely. */ +digit [0-9] integer {digit}+ decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*)) decimalfail {digit}+\.\. real ({integer}|{decimal})[Ee][-+]?{digit}+ -realfail1 ({integer}|{decimal})[Ee] -realfail2 ({integer}|{decimal})[Ee][-+] +realfail ({integer}|{decimal})[Ee][-+] + +integer_junk {integer}{ident_start} +decimal_junk {decimal}{ident_start} +real_junk {real}{ident_start} param \${integer} +param_junk \${integer}{ident_start} other . @@ -1006,6 +1013,10 @@ spangres_hint_stop \*\/ yylval->ival = atol(yytext + 1); return PARAM; } +{param_junk} { + SET_YYLLOC(); + yyerror("trailing junk after parameter"); + } {integer} { SET_YYLLOC(); @@ -1027,20 +1038,21 @@ spangres_hint_stop \*\/ yylval->str = pstrdup(yytext); return FCONST; } -{realfail1} { - /* - * throw back the [Ee], and figure out whether what - * remains is an {integer} or {decimal}. - */ - yyless(yyleng - 1); +{realfail} { SET_YYLLOC(); - return process_integer_literal(yytext, yylval); + yyerror("trailing junk after numeric literal"); } -{realfail2} { - /* throw back the [Ee][+-], and proceed as above */ - yyless(yyleng - 2); +{integer_junk} { SET_YYLLOC(); - return process_integer_literal(yytext, yylval); + yyerror("trailing junk after numeric literal"); + } +{decimal_junk} { + SET_YYLLOC(); + yyerror("trailing junk after numeric literal"); + } +{real_junk} { + SET_YYLLOC(); + yyerror("trailing junk after numeric literal"); } @@ -1288,10 +1300,7 @@ addlit(char *ytext, int yleng, core_yyscan_t yyscanner) /* enlarge buffer if needed */ if ((yyextra->literallen + yleng) >= yyextra->literalalloc) { - do - { - yyextra->literalalloc *= 2; - } while ((yyextra->literallen + yleng) >= yyextra->literalalloc); + yyextra->literalalloc = pg_nextpower2_32(yyextra->literallen + yleng + 1); yyextra->literalbuf = (char *) repalloc(yyextra->literalbuf, yyextra->literalalloc); } diff --git a/third_party/spanner_pg/src/backend/parser/scansup.c b/third_party/spanner_pg/src/backend/parser/scansup.c index f55caccd..602108a4 100644 --- a/third_party/spanner_pg/src/backend/parser/scansup.c +++ b/third_party/spanner_pg/src/backend/parser/scansup.c @@ -3,7 +3,7 @@ * scansup.c * scanner support routines used by the core lexer * - * 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/third_party/spanner_pg/src/backend/partitioning/partbounds.c b/third_party/spanner_pg/src/backend/partitioning/partbounds.c index a664cd08..cdf1356a 100644 --- a/third_party/spanner_pg/src/backend/partitioning/partbounds.c +++ b/third_party/spanner_pg/src/backend/partitioning/partbounds.c @@ -3,7 +3,7 @@ * partbounds.c * Support routines for manipulating partition bounds * - * 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 * * IDENTIFICATION @@ -249,8 +249,7 @@ static List *get_range_nulltest(PartitionKey key); * expressions as partition constraint */ List * -get_qual_from_partbound(Relation rel, Relation parent, - PartitionBoundSpec *spec) +get_qual_from_partbound(Relation parent, PartitionBoundSpec *spec) { PartitionKey key = RelationGetPartitionKey(parent); List *my_qual = NIL; @@ -361,10 +360,10 @@ create_hash_bounds(PartitionBoundSpec **boundspecs, int nparts, PartitionKey key, int **mapping) { PartitionBoundInfo boundinfo; - PartitionHashBound **hbounds = NULL; + PartitionHashBound *hbounds; int i; - int ndatums = 0; int greatest_modulus; + Datum *boundDatums; boundinfo = (PartitionBoundInfoData *) palloc0(sizeof(PartitionBoundInfoData)); @@ -373,9 +372,8 @@ create_hash_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->null_index = -1; boundinfo->default_index = -1; - ndatums = nparts; - hbounds = (PartitionHashBound **) - palloc(nparts * sizeof(PartitionHashBound *)); + hbounds = (PartitionHashBound *) + palloc(nparts * sizeof(PartitionHashBound)); /* Convert from node to the internal representation */ for (i = 0; i < nparts; i++) @@ -385,26 +383,34 @@ create_hash_bounds(PartitionBoundSpec **boundspecs, int nparts, if (spec->strategy != PARTITION_STRATEGY_HASH) elog(ERROR, "invalid strategy in partition bound spec"); - hbounds[i] = (PartitionHashBound *) palloc(sizeof(PartitionHashBound)); - hbounds[i]->modulus = spec->modulus; - hbounds[i]->remainder = spec->remainder; - hbounds[i]->index = i; + hbounds[i].modulus = spec->modulus; + hbounds[i].remainder = spec->remainder; + hbounds[i].index = i; } /* Sort all the bounds in ascending order */ - qsort(hbounds, nparts, sizeof(PartitionHashBound *), + qsort(hbounds, nparts, sizeof(PartitionHashBound), qsort_partition_hbound_cmp); /* After sorting, moduli are now stored in ascending order. */ - greatest_modulus = hbounds[ndatums - 1]->modulus; + greatest_modulus = hbounds[nparts - 1].modulus; - boundinfo->ndatums = ndatums; - boundinfo->datums = (Datum **) palloc0(ndatums * sizeof(Datum *)); + boundinfo->ndatums = nparts; + boundinfo->datums = (Datum **) palloc0(nparts * sizeof(Datum *)); + boundinfo->kind = NULL; + boundinfo->interleaved_parts = NULL; boundinfo->nindexes = greatest_modulus; boundinfo->indexes = (int *) palloc(greatest_modulus * sizeof(int)); for (i = 0; i < greatest_modulus; i++) boundinfo->indexes[i] = -1; + /* + * In the loop below, to save from allocating a series of small datum + * arrays, here we just allocate a single array and below we'll just + * assign a portion of this array per partition. + */ + boundDatums = (Datum *) palloc(nparts * 2 * sizeof(Datum)); + /* * For hash partitioning, there are as many datums (modulus and remainder * pairs) as there are partitions. Indexes are simply values ranging from @@ -412,10 +418,10 @@ create_hash_bounds(PartitionBoundSpec **boundspecs, int nparts, */ for (i = 0; i < nparts; i++) { - int modulus = hbounds[i]->modulus; - int remainder = hbounds[i]->remainder; + int modulus = hbounds[i].modulus; + int remainder = hbounds[i].remainder; - boundinfo->datums[i] = (Datum *) palloc(2 * sizeof(Datum)); + boundinfo->datums[i] = &boundDatums[i * 2]; boundinfo->datums[i][0] = Int32GetDatum(modulus); boundinfo->datums[i][1] = Int32GetDatum(remainder); @@ -427,14 +433,39 @@ create_hash_bounds(PartitionBoundSpec **boundspecs, int nparts, remainder += modulus; } - (*mapping)[hbounds[i]->index] = i; - pfree(hbounds[i]); + (*mapping)[hbounds[i].index] = i; } pfree(hbounds); return boundinfo; } +/* + * get_non_null_list_datum_count + * Counts the number of non-null Datums in each partition. + */ +static int +get_non_null_list_datum_count(PartitionBoundSpec **boundspecs, int nparts) +{ + int i; + int count = 0; + + for (i = 0; i < nparts; i++) + { + ListCell *lc; + + foreach(lc, boundspecs[i]->listdatums) + { + Const *val = lfirst_node(Const, lc); + + if (!val->constisnull) + count++; + } + } + + return count; +} + /* * create_list_bounds * Create a PartitionBoundInfo for a list partitioned table @@ -444,14 +475,14 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, PartitionKey key, int **mapping) { PartitionBoundInfo boundinfo; - PartitionListValue **all_values = NULL; - ListCell *cell; - int i = 0; - int ndatums = 0; + PartitionListValue *all_values; + int i; + int j; + int ndatums; int next_index = 0; int default_index = -1; int null_index = -1; - List *non_null_values = NIL; + Datum *boundDatums; boundinfo = (PartitionBoundInfoData *) palloc0(sizeof(PartitionBoundInfoData)); @@ -460,8 +491,12 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->null_index = -1; boundinfo->default_index = -1; + ndatums = get_non_null_list_datum_count(boundspecs, nparts); + all_values = (PartitionListValue *) + palloc(ndatums * sizeof(PartitionListValue)); + /* Create a unified list of non-null values across all partitions. */ - for (i = 0; i < nparts; i++) + for (j = 0, i = 0; i < nparts; i++) { PartitionBoundSpec *spec = boundspecs[i]; ListCell *c; @@ -482,15 +517,13 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, foreach(c, spec->listdatums) { - Const *val = castNode(Const, lfirst(c)); - PartitionListValue *list_value = NULL; + Const *val = lfirst_node(Const, c); if (!val->constisnull) { - list_value = (PartitionListValue *) - palloc0(sizeof(PartitionListValue)); - list_value->index = i; - list_value->value = val->constvalue; + all_values[j].index = i; + all_values[j].value = val->constvalue; + j++; } else { @@ -502,40 +535,29 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, elog(ERROR, "found null more than once"); null_index = i; } - - if (list_value) - non_null_values = lappend(non_null_values, list_value); } } - ndatums = list_length(non_null_values); - - /* - * Collect all list values in one array. Alongside the value, we also save - * the index of partition the value comes from. - */ - all_values = (PartitionListValue **) - palloc(ndatums * sizeof(PartitionListValue *)); - i = 0; - foreach(cell, non_null_values) - { - PartitionListValue *src = lfirst(cell); - - all_values[i] = (PartitionListValue *) - palloc(sizeof(PartitionListValue)); - all_values[i]->value = src->value; - all_values[i]->index = src->index; - i++; - } + /* ensure we found a Datum for every slot in the all_values array */ + Assert(j == ndatums); - qsort_arg(all_values, ndatums, sizeof(PartitionListValue *), + qsort_arg(all_values, ndatums, sizeof(PartitionListValue), qsort_partition_list_value_cmp, (void *) key); boundinfo->ndatums = ndatums; boundinfo->datums = (Datum **) palloc0(ndatums * sizeof(Datum *)); + boundinfo->kind = NULL; + boundinfo->interleaved_parts = NULL; boundinfo->nindexes = ndatums; boundinfo->indexes = (int *) palloc(ndatums * sizeof(int)); + /* + * In the loop below, to save from allocating a series of small datum + * arrays, here we just allocate a single array and below we'll just + * assign a portion of this array per datum. + */ + boundDatums = (Datum *) palloc(ndatums * sizeof(Datum)); + /* * Copy values. Canonical indexes are values ranging from 0 to (nparts - * 1) assigned to each partition such that all datums of a given partition @@ -544,10 +566,10 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, */ for (i = 0; i < ndatums; i++) { - int orig_index = all_values[i]->index; + int orig_index = all_values[i].index; - boundinfo->datums[i] = (Datum *) palloc(sizeof(Datum)); - boundinfo->datums[i][0] = datumCopy(all_values[i]->value, + boundinfo->datums[i] = &boundDatums[i]; + boundinfo->datums[i][0] = datumCopy(all_values[i].value, key->parttypbyval[0], key->parttyplen[0]); @@ -558,6 +580,8 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->indexes[i] = (*mapping)[orig_index]; } + pfree(all_values); + /* * Set the canonical value for null_index, if any. * @@ -588,6 +612,70 @@ create_list_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->default_index = (*mapping)[default_index]; } + /* + * Calculate interleaved partitions. Here we look for partitions which + * might be interleaved with other partitions and set a bit in + * interleaved_parts for any partitions which may be interleaved with + * another partition. + */ + + /* + * There must be multiple partitions to have any interleaved partitions, + * otherwise there's nothing to interleave with. + */ + if (nparts > 1) + { + /* + * Short-circuit check to see if only 1 Datum is allowed per + * partition. When this is true there's no need to do the more + * expensive checks to look for interleaved values. + */ + if (boundinfo->ndatums + + partition_bound_accepts_nulls(boundinfo) + + partition_bound_has_default(boundinfo) != nparts) + { + int last_index = -1; + + /* + * Since the indexes array is sorted in Datum order, if any + * partitions are interleaved then it will show up by the + * partition indexes not being in ascending order. Here we check + * for that and record all partitions that are out of order. + */ + for (i = 0; i < boundinfo->nindexes; i++) + { + int index = boundinfo->indexes[i]; + + if (index < last_index) + boundinfo->interleaved_parts = bms_add_member(boundinfo->interleaved_parts, + index); + + /* + * Otherwise, if the null_index exists in the indexes array, + * then the NULL partition must also allow some other Datum, + * therefore it's "interleaved". + */ + else if (partition_bound_accepts_nulls(boundinfo) && + index == boundinfo->null_index) + boundinfo->interleaved_parts = bms_add_member(boundinfo->interleaved_parts, + index); + + last_index = index; + } + } + + /* + * The DEFAULT partition is the "catch-all" partition that can contain + * anything that does not belong to any other partition. If there are + * any other partitions then the DEFAULT partition must be marked as + * interleaved. + */ + if (partition_bound_has_default(boundinfo)) + boundinfo->interleaved_parts = bms_add_member(boundinfo->interleaved_parts, + boundinfo->default_index); + } + + /* All partitions must now have been assigned canonical indexes. */ Assert(next_index == nparts); return boundinfo; @@ -606,10 +694,13 @@ create_range_bounds(PartitionBoundSpec **boundspecs, int nparts, PartitionRangeBound **all_bounds, *prev; int i, - k; + k, + partnatts; int ndatums = 0; int default_index = -1; int next_index = 0; + Datum *boundDatums; + PartitionRangeDatumKind *boundKinds; boundinfo = (PartitionBoundInfoData *) palloc0(sizeof(PartitionBoundInfoData)); @@ -710,6 +801,8 @@ create_range_bounds(PartitionBoundSpec **boundspecs, int nparts, prev = cur; } + pfree(all_bounds); + /* Update ndatums to hold the count of distinct datums. */ ndatums = k; @@ -726,6 +819,7 @@ create_range_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->kind = (PartitionRangeDatumKind **) palloc(ndatums * sizeof(PartitionRangeDatumKind *)); + boundinfo->interleaved_parts = NULL; /* * For range partitioning, an additional value of -1 is stored as the last @@ -734,16 +828,24 @@ create_range_bounds(PartitionBoundSpec **boundspecs, int nparts, boundinfo->nindexes = ndatums + 1; boundinfo->indexes = (int *) palloc((ndatums + 1) * sizeof(int)); + /* + * In the loop below, to save from allocating a series of small arrays, + * here we just allocate a single array for Datums and another for + * PartitionRangeDatumKinds, below we'll just assign a portion of these + * arrays in each loop. + */ + partnatts = key->partnatts; + boundDatums = (Datum *) palloc(ndatums * partnatts * sizeof(Datum)); + boundKinds = (PartitionRangeDatumKind *) palloc(ndatums * partnatts * + sizeof(PartitionRangeDatumKind)); + for (i = 0; i < ndatums; i++) { int j; - boundinfo->datums[i] = (Datum *) palloc(key->partnatts * - sizeof(Datum)); - boundinfo->kind[i] = (PartitionRangeDatumKind *) - palloc(key->partnatts * - sizeof(PartitionRangeDatumKind)); - for (j = 0; j < key->partnatts; j++) + boundinfo->datums[i] = &boundDatums[i * partnatts]; + boundinfo->kind[i] = &boundKinds[i * partnatts]; + for (j = 0; j < partnatts; j++) { if (rbounds[i]->kind[j] == PARTITION_RANGE_DATUM_VALUE) boundinfo->datums[i][j] = @@ -775,6 +877,8 @@ create_range_bounds(PartitionBoundSpec **boundspecs, int nparts, } } + pfree(rbounds); + /* Set the canonical value for default_index, if any. */ if (default_index != -1) { @@ -921,6 +1025,7 @@ partition_bounds_copy(PartitionBoundInfo src, int partnatts; bool hash_part; int natts; + Datum *boundDatums; dest = (PartitionBoundInfo) palloc(sizeof(PartitionBoundInfoData)); @@ -936,32 +1041,48 @@ partition_bounds_copy(PartitionBoundInfo src, if (src->kind != NULL) { + PartitionRangeDatumKind *boundKinds; + + /* only RANGE partition should have a non-NULL kind */ + Assert(key->strategy == PARTITION_STRATEGY_RANGE); + dest->kind = (PartitionRangeDatumKind **) palloc(ndatums * sizeof(PartitionRangeDatumKind *)); + + /* + * In the loop below, to save from allocating a series of small arrays + * for storing the PartitionRangeDatumKind, we allocate a single chunk + * here and use a smaller portion of it for each datum. + */ + boundKinds = (PartitionRangeDatumKind *) palloc(ndatums * partnatts * + sizeof(PartitionRangeDatumKind)); + for (i = 0; i < ndatums; i++) { - dest->kind[i] = (PartitionRangeDatumKind *) palloc(partnatts * - sizeof(PartitionRangeDatumKind)); - + dest->kind[i] = &boundKinds[i * partnatts]; memcpy(dest->kind[i], src->kind[i], - sizeof(PartitionRangeDatumKind) * key->partnatts); + sizeof(PartitionRangeDatumKind) * partnatts); } } else dest->kind = NULL; + /* copy interleaved partitions for LIST partitioned tables */ + dest->interleaved_parts = bms_copy(src->interleaved_parts); + /* * For hash partitioning, datums array will have two elements - modulus * and remainder. */ hash_part = (key->strategy == PARTITION_STRATEGY_HASH); natts = hash_part ? 2 : partnatts; + boundDatums = palloc(ndatums * natts * sizeof(Datum)); for (i = 0; i < ndatums; i++) { int j; - dest->datums[i] = (Datum *) palloc(sizeof(Datum) * natts); + dest->datums[i] = &boundDatums[i * natts]; for (j = 0; j < natts; j++) { @@ -2451,6 +2572,9 @@ build_merged_partition_bounds(char strategy, List *merged_datums, merged_bounds->kind = NULL; } + /* interleaved_parts is always NULL for join relations. */ + merged_bounds->interleaved_parts = NULL; + Assert(list_length(merged_indexes) == ndatums); merged_bounds->nindexes = ndatums; merged_bounds->indexes = (int *) palloc(sizeof(int) * ndatums); @@ -2736,13 +2860,15 @@ add_merged_range_bounds(int partnatts, FmgrInfo *partsupfuncs, * that is partitions appearing earlier in the PartitionDesc sequence * contain partition keys strictly less than those appearing later. * Also, if NULL values are possible, they must come in the last - * partition defined in the PartitionDesc. + * partition defined in the PartitionDesc. 'live_parts' marks which + * partitions we should include when checking the ordering. Partitions + * that do not appear in 'live_parts' are ignored. * * If out of order, or there is insufficient info to know the order, * then we return false. */ bool -partitions_are_ordered(PartitionBoundInfo boundinfo, int nparts) +partitions_are_ordered(PartitionBoundInfo boundinfo, Bitmapset *live_parts) { Assert(boundinfo != NULL); @@ -2754,38 +2880,24 @@ partitions_are_ordered(PartitionBoundInfo boundinfo, int nparts) * RANGE-type partitioning guarantees that the partitions can be * scanned in the order that they're defined in the PartitionDesc * to provide sequential, non-overlapping ranges of tuples. - * However, if a DEFAULT partition exists then it doesn't work, as - * that could contain tuples from either below or above the - * defined range, or tuples belonging to gaps between partitions. + * However, if a DEFAULT partition exists and it's contained + * within live_parts, then the partitions are not ordered. */ - if (!partition_bound_has_default(boundinfo)) + if (!partition_bound_has_default(boundinfo) || + !bms_is_member(boundinfo->default_index, live_parts)) return true; break; case PARTITION_STRATEGY_LIST: /* - * LIST partitioning can also guarantee ordering, but only if the - * partitions don't accept interleaved values. We could likely - * check for this by looping over the PartitionBound's indexes - * array to check that the indexes are in order. For now, let's - * just keep it simple and just accept LIST partitioning when - * there's no DEFAULT partition, exactly one value per partition, - * and optionally a NULL partition that does not accept any other - * values. Such a NULL partition will come last in the - * PartitionDesc, and the other partitions will be properly - * ordered. This is a cheap test to make as it does not require - * any per-partition processing. Maybe we'd like to handle more - * complex cases in the future. + * LIST partitioned are ordered providing none of live_parts + * overlap with the partitioned table's interleaved partitions. */ - if (partition_bound_has_default(boundinfo)) - return false; - - if (boundinfo->ndatums + partition_bound_accepts_nulls(boundinfo) - == nparts) + if (!bms_overlap(live_parts, boundinfo->interleaved_parts)) return true; - break; + break; default: /* HASH, or some other strategy */ break; @@ -2970,7 +3082,7 @@ check_new_partition_bound(char *relname, Relation parent, foreach(cell, spec->listdatums) { - Const *val = castNode(Const, lfirst(cell)); + Const *val = lfirst_node(Const, cell); overlap_location = val->location; if (!val->constisnull) @@ -3355,7 +3467,7 @@ make_one_partition_rbound(PartitionKey key, int index, List *datums, bool lower) i = 0; foreach(lc, datums) { - PartitionRangeDatum *datum = castNode(PartitionRangeDatum, lfirst(lc)); + PartitionRangeDatum *datum = lfirst_node(PartitionRangeDatum, lc); /* What's contained in this range datum? */ bound->kind[i] = datum->kind; @@ -3689,8 +3801,8 @@ partition_hash_bsearch(PartitionBoundInfo boundinfo, static int32 qsort_partition_hbound_cmp(const void *a, const void *b) { - PartitionHashBound *h1 = (*(PartitionHashBound *const *) a); - PartitionHashBound *h2 = (*(PartitionHashBound *const *) b); + const PartitionHashBound *h1 = (const PartitionHashBound *) a; + const PartitionHashBound *h2 = (const PartitionHashBound *) b; return partition_hbound_cmp(h1->modulus, h1->remainder, h2->modulus, h2->remainder); @@ -3704,8 +3816,8 @@ qsort_partition_hbound_cmp(const void *a, const void *b) static int32 qsort_partition_list_value_cmp(const void *a, const void *b, void *arg) { - Datum val1 = (*(PartitionListValue *const *) a)->value, - val2 = (*(PartitionListValue *const *) b)->value; + Datum val1 = ((const PartitionListValue *) a)->value, + val2 = ((const PartitionListValue *) b)->value; PartitionKey key = (PartitionKey) arg; return DatumGetInt32(FunctionCall2Coll(&key->partsupfunc[0], @@ -3833,6 +3945,7 @@ make_partition_op_expr(PartitionKey key, int keynum, saopexpr->opno = operoid; saopexpr->opfuncid = get_opcode(operoid); saopexpr->hashfuncid = InvalidOid; + saopexpr->negfuncid = InvalidOid; saopexpr->useOr = true; saopexpr->inputcollid = key->partcollation[keynum]; saopexpr->args = list_make2(arg1, arrexpr); @@ -4058,7 +4171,7 @@ get_qual_for_list(Relation parent, PartitionBoundSpec *spec) */ foreach(cell, spec->listdatums) { - Const *val = castNode(Const, lfirst(cell)); + Const *val = lfirst_node(Const, cell); if (val->constisnull) list_has_null = true; @@ -4313,8 +4426,8 @@ get_qual_for_range(Relation parent, PartitionBoundSpec *spec, Datum test_result; bool isNull; - ldatum = castNode(PartitionRangeDatum, lfirst(cell1)); - udatum = castNode(PartitionRangeDatum, lfirst(cell2)); + ldatum = lfirst_node(PartitionRangeDatum, cell1); + udatum = lfirst_node(PartitionRangeDatum, cell2); /* * Since get_range_key_properties() modifies partexprs_item, and we @@ -4395,11 +4508,11 @@ get_qual_for_range(Relation parent, PartitionBoundSpec *spec, PartitionRangeDatum *ldatum_next = NULL, *udatum_next = NULL; - ldatum = castNode(PartitionRangeDatum, lfirst(cell1)); + ldatum = lfirst_node(PartitionRangeDatum, cell1); if (lnext(spec->lowerdatums, cell1)) ldatum_next = castNode(PartitionRangeDatum, lfirst(lnext(spec->lowerdatums, cell1))); - udatum = castNode(PartitionRangeDatum, lfirst(cell2)); + udatum = lfirst_node(PartitionRangeDatum, cell2); if (lnext(spec->upperdatums, cell2)) udatum_next = castNode(PartitionRangeDatum, lfirst(lnext(spec->upperdatums, cell2))); diff --git a/third_party/spanner_pg/src/backend/partitioning/partdesc.c b/third_party/spanner_pg/src/backend/partitioning/partdesc.c index 9a9d6a96..8b6e0bd5 100644 --- a/third_party/spanner_pg/src/backend/partitioning/partdesc.c +++ b/third_party/spanner_pg/src/backend/partitioning/partdesc.c @@ -3,7 +3,7 @@ * partdesc.c * Support routines for manipulating partition descriptors * - * 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 * * IDENTIFICATION @@ -91,8 +91,8 @@ RelationGetPartitionDesc(Relation rel, bool omit_detached) * cached descriptor too. We determine that based on the pg_inherits.xmin * that was saved alongside that descriptor: if the xmin that was not in * progress for that active snapshot is also not in progress for the - * current active snapshot, then we can use use it. Otherwise build one - * from scratch. + * current active snapshot, then we can use it. Otherwise build one from + * scratch. */ if (omit_detached && rel->rd_partdesc_nodetached && diff --git a/third_party/spanner_pg/src/backend/partitioning/partprune.c b/third_party/spanner_pg/src/backend/partitioning/partprune.c index 0fb86732..ff63099b 100644 --- a/third_party/spanner_pg/src/backend/partitioning/partprune.c +++ b/third_party/spanner_pg/src/backend/partitioning/partprune.c @@ -25,7 +25,7 @@ * * See gen_partprune_steps_internal() for more details on step generation. * - * 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 * * IDENTIFICATION @@ -655,15 +655,14 @@ make_partitionedrel_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel, relid_map = (Oid *) palloc0(nparts * sizeof(Oid)); present_parts = NULL; - for (i = 0; i < nparts; i++) + i = -1; + while ((i = bms_next_member(subpart->live_parts, i)) >= 0) { RelOptInfo *partrel = subpart->part_rels[i]; int subplanidx; int subpartidx; - /* Skip processing pruned partitions. */ - if (partrel == NULL) - continue; + Assert(partrel != NULL); subplan_map[i] = subplanidx = relid_subplan_map[partrel->relid] - 1; subpart_map[i] = subpartidx = relid_subpart_map[partrel->relid] - 1; @@ -800,6 +799,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. */ @@ -810,8 +810,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. @@ -3688,9 +3688,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, @@ -3711,13 +3711,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/third_party/spanner_pg/src/backend/po/de.po b/third_party/spanner_pg/src/backend/po/de.po index e19e85ba..ccf1ee91 100644 --- a/third_party/spanner_pg/src/backend/po/de.po +++ b/third_party/spanner_pg/src/backend/po/de.po @@ -1,14 +1,14 @@ # German message translation file for PostgreSQL server -# Peter Eisentraut , 2001 - 2022. +# Peter Eisentraut , 2001 - 2023. # # 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: 2023-11-03 19:10+0000\n" -"PO-Revision-Date: 2022-11-03 23:31+0100\n" +"POT-Creation-Date: 2024-02-01 22:27+0000\n" +"PO-Revision-Date: 2023-11-08 21:53+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,6 +17,46 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "diese Installation unterstützt keine Komprimierung mit %s" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "leere Zeichenkette gefunden wo eine Komprimierungsoption erwartet wurde" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "unbekannte Komprimierungsoption: »%s«" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "Komprimierungsoption »%s« benötigt einen Wert" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "Wert für Komprimierungsoption »%s« muss eine ganze Zahl sein" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "Komprimierungsalgorithmus »%s« akzeptiert kein Komprimierungsniveau" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "Komprimierungsalgorithmus »%s« erwartet ein Komprimierungsniveau zwischen %d und %d (Standard bei %d)" + +#: ../common/compression.c:353 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl" + #: ../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 +64,66 @@ msgstr "" msgid "not recorded" msgstr "nicht aufgezeichnet" -#: ../common/controldata_utils.c:78 ../common/controldata_utils.c:83 -#: commands/copyfrom.c:1522 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1525 commands/extension.c:3401 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:96 ../common/controldata_utils.c:99 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1329 access/transam/xlog.c:3573 -#: access/transam/xlog.c:4817 access/transam/xlog.c:11629 -#: access/transam/xlog.c:11642 access/transam/xlog.c:12097 -#: access/transam/xlog.c:12177 access/transam/xlog.c:12214 -#: access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3492 libpq/hba.c:534 -#: replication/basebackup.c:2026 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 -#: replication/logical/snapbuild.c:1863 replication/logical/snapbuild.c:1905 -#: replication/logical/snapbuild.c:1932 replication/slot.c:1727 -#: replication/slot.c:1768 replication/walsender.c:545 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: access/transam/twophase.c:1349 access/transam/xlog.c:3209 +#: access/transam/xlog.c:4024 access/transam/xlogrecovery.c:1223 +#: access/transam/xlogrecovery.c:1315 access/transam/xlogrecovery.c:1352 +#: access/transam/xlogrecovery.c:1412 backup/basebackup.c:1844 +#: commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1939 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: storage/file/buffile.c:463 storage/file/copydir.c:195 +#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:816 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../common/controldata_utils.c:107 ../common/controldata_utils.c:111 -#: access/transam/xlog.c:3578 access/transam/xlog.c:4822 -#: replication/basebackup.c:2030 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1868 -#: replication/logical/snapbuild.c:1910 replication/logical/snapbuild.c:1937 -#: replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 -#: utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3214 access/transam/xlog.c:4029 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 +#: replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:820 #, 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:122 ../common/controldata_utils.c:127 -#: ../common/controldata_utils.c:286 ../common/controldata_utils.c:289 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:271 ../common/controldata_utils.c:274 #: 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:1341 -#: access/transam/twophase.c:1746 access/transam/xlog.c:3442 -#: access/transam/xlog.c:3613 access/transam/xlog.c:3618 -#: access/transam/xlog.c:3946 access/transam/xlog.c:4787 -#: access/transam/xlog.c:5712 access/transam/xlogfuncs.c:728 -#: commands/copyfrom.c:1582 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:5009 -#: replication/logical/snapbuild.c:1772 replication/logical/snapbuild.c:1945 -#: replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 -#: utils/cache/relmapper.c:898 +#: access/transam/timeline.c:516 access/transam/twophase.c:1361 +#: access/transam/twophase.c:1773 access/transam/xlog.c:3056 +#: access/transam/xlog.c:3249 access/transam/xlog.c:3254 +#: access/transam/xlog.c:3392 access/transam/xlog.c:3994 +#: access/transam/xlog.c:4740 commands/copyfrom.c:1585 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:5016 +#: replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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:831 +#: utils/cache/relmapper.c:968 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: ../common/controldata_utils.c:165 +#: ../common/controldata_utils.c:154 msgid "byte ordering mismatch" msgstr "falsche Byte-Reihenfolge" -#: ../common/controldata_utils.c:167 +#: ../common/controldata_utils.c:156 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -99,82 +137,85 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:233 +#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 #: ../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:1285 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3484 -#: access/transam/xlog.c:3528 access/transam/xlog.c:3726 -#: access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1616 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 -#: replication/logical/reorderbuffer.c:4931 -#: replication/logical/snapbuild.c:1727 replication/logical/snapbuild.c:1834 -#: replication/slot.c:1699 replication/walsender.c:518 -#: replication/walsender.c:2563 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 -#: storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 -#: utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: access/transam/timeline.c:348 access/transam/twophase.c:1305 +#: access/transam/xlog.c:2943 access/transam/xlog.c:3125 +#: access/transam/xlog.c:3164 access/transam/xlog.c:3359 +#: access/transam/xlog.c:4014 access/transam/xlogrecovery.c:4243 +#: access/transam/xlogrecovery.c:4346 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 utils/cache/relmapper.c:795 +#: utils/cache/relmapper.c:912 utils/error/elog.c:1933 +#: utils/init/miscinit.c:1374 utils/init/miscinit.c:1508 +#: utils/init/miscinit.c:1585 utils/misc/guc.c:8998 utils/misc/guc.c:9047 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../common/controldata_utils.c:251 ../common/controldata_utils.c:254 -#: access/transam/twophase.c:1719 access/transam/twophase.c:1728 -#: access/transam/xlog.c:11386 access/transam/xlog.c:11424 -#: access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5684 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:240 ../common/controldata_utils.c:243 +#: access/transam/twophase.c:1746 access/transam/twophase.c:1755 +#: access/transam/xlog.c:8676 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: utils/cache/relmapper.c:946 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../common/controldata_utils.c:269 ../common/controldata_utils.c:275 +#: ../common/controldata_utils.c:257 ../common/controldata_utils.c:262 #: ../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:1740 -#: access/transam/xlog.c:3435 access/transam/xlog.c:3607 -#: access/transam/xlog.c:4780 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10910 replication/logical/snapbuild.c:1765 -#: replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 -#: storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 -#: storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: access/transam/timeline.c:510 access/transam/twophase.c:1767 +#: access/transam/xlog.c:3049 access/transam/xlog.c:3243 +#: access/transam/xlog.c:3987 access/transam/xlog.c:7979 +#: access/transam/xlog.c:8022 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1772 +#: replication/slot.c:1684 replication/slot.c:1789 storage/file/fd.c:737 +#: storage/file/fd.c:3741 storage/smgr/md.c:992 storage/smgr/md.c:1033 +#: storage/sync/sync.c:453 utils/cache/relmapper.c:961 utils/misc/guc.c:8767 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 -#: lib/dshash.c:245 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:2550 -#: postmaster/postmaster.c:4208 postmaster/postmaster.c:5609 -#: postmaster/postmaster.c:5973 -#: replication/libpqwalreceiver/libpqwalreceiver.c:287 -#: replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 -#: storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 -#: storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 -#: storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 -#: 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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 libpq/auth.c:1336 +#: libpq/auth.c:1404 libpq/auth.c:1962 libpq/be-secure-gssapi.c:520 +#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 +#: postmaster/postmaster.c:2594 postmaster/postmaster.c:4180 +#: postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2280 storage/ipc/procarray.c:2287 +#: storage/ipc/procarray.c:2792 storage/ipc/procarray.c:3423 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5049 -#: utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8745 #: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 -#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 utils/mmgr/generation.c:234 +#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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 @@ -183,6 +224,22 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" msgid "out of memory" msgstr "Speicher aufgebraucht" +#: ../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 "Erfolg" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "Zielpuffer ist zu klein" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "OpenSSL-Fehler" + #: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" @@ -203,28 +260,28 @@ msgstr "konnte Programmdatei »%s« nicht lesen" msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../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:299 access/transam/xlog.c:11260 -#: replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8325 backup/basebackup.c:1340 +#: 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:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 -#: storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 -#: storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, 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,141 +293,148 @@ 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:1297 -#: access/transam/xlog.c:11362 access/transam/xlog.c:11400 -#: access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 -#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1532 -#: commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 -#: commands/tablespace.c:897 guc-file.l:1062 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1644 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 -#: storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 +#: ../common/file_utils.c:455 access/transam/twophase.c:1317 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:237 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1535 commands/copyto.c:725 commands/extension.c:3390 +#: commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 +#: postmaster/pgarch.c:597 replication/logical/snapbuild.c:1651 +#: 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:729 -#: commands/tablespace.c:739 postmaster/postmaster.c:1518 -#: storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 postmaster/postmaster.c:1579 +#: 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:2744 +#: ../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:1784 -#: replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 -#: storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:426 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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/jsonapi.c:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "interner Fehler" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-Sequenz »\\%s« ist nicht gültig." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "»,« oder »]« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "»:« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON-Wert erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "»,« oder »}« erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Zeichenkette erwartet, aber »%s« gefunden." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token »%s« ist ungültig." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 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:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 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:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 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:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "Tipp: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -386,7 +450,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:1521 libpq/auth.c:2553 +#: ../common/restricted_token.c:64 libpq/auth.c:1366 libpq/auth.c:2398 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu" @@ -421,13 +485,12 @@ 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:1187 -#: replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" @@ -437,6 +500,18 @@ 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 +msgid "could not encode salt" +msgstr "konnte Salt nicht kodieren" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "konnte Stored Key nicht kodieren" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "konnte Server Key nicht kodieren" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -458,7 +533,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:2053 +#: ../common/username.c:45 libpq/auth.c:1898 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -497,12 +572,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«" @@ -527,30 +602,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" @@ -560,6 +635,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" @@ -580,47 +665,46 @@ msgstr "konnte Access-Token-Mitgliedschaft nicht prüfen: Fehlercode %lu\n" 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:1036 access/brin/brin.c:1146 access/gin/ginfast.c:1042 -#: access/transam/xlog.c:11031 access/transam/xlog.c:11568 -#: 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:1036 access/brin/brin.c:1143 access/gin/ginfast.c:1042 +#: 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:1037 access/brin/brin.c:1147 +#: access/brin/brin.c:1037 access/brin/brin.c:1144 #, 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:1045 access/brin/brin.c:1155 +#: access/brin/brin.c:1042 access/brin/brin.c:1149 #, c-format -msgid "block number out of range: %s" -msgstr "Blocknummer ist außerhalb des gültigen Bereichs: %s" +msgid "block number out of range: %lld" +msgstr "Blocknummer ist außerhalb des gültigen Bereichs: %lld" -#: access/brin/brin.c:1089 access/brin/brin.c:1181 +#: access/brin/brin.c:1086 access/brin/brin.c:1175 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "»%s« ist kein BRIN-Index" -#: access/brin/brin.c:1105 access/brin/brin.c:1197 +#: access/brin/brin.c:1102 access/brin/brin.c:1191 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "konnte Basistabelle von Index »%s« nicht öffnen" -#: access/brin/brin.c:1114 access/brin/brin.c:1213 access/gin/ginfast.c:1087 -#: parser/parse_utilcmd.c:2284 +#: access/brin/brin.c:1111 access/brin/brin.c:1207 access/gin/ginfast.c:1087 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "index \"%s\" is not valid" msgstr "Index »%s« ist nicht gültig" -#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 +#: access/brin/brin_bloom.c:749 access/brin/brin_bloom.c:791 #: access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 -#: 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 +#: 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" @@ -628,8 +712,8 @@ msgstr "kann keinen Wert vom Typ %s annehmen" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1461 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1462 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«" @@ -732,91 +816,91 @@ msgstr "Attribut »%s« von Typ %s existiert nicht in Typ %s." msgid "number of columns (%d) exceeds limit (%d)" msgstr "Anzahl der Spalten (%d) überschreitet Maximum (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format 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:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:965 #, 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:1906 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "nicht unterstützter Formatcode: %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: 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:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Gültige Werte sind »local« und »cascaded«." -#: access/common/reloptions.c:682 +#: 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:1225 +#: 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:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12546 +#: access/common/reloptions.c:1303 utils/misc/guc.c:13002 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "Tabellen mit WITH OIDS werden nicht unterstützt" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "unbekannter Parameter »%s«" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "Parameter »%s« mehrmals angegeben" -#: access/common/reloptions.c:1592 +#: 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:1604 +#: 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:1610 access/common/reloptions.c:1630 +#: 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:1612 +#: 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:1624 +#: 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:1632 +#: 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:1654 +#: 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«" @@ -831,14 +915,8 @@ msgstr "Komprimierungsmethode lz4 nicht unterstützt" 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:771 -#: parser/parse_relation.c:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "Spalte »%s« kann nicht als SETOF deklariert werden" @@ -868,7 +946,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:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 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" @@ -883,8 +961,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:2169 -#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3866 utils/adt/arrayfuncs.c:6535 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -907,18 +985,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:759 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:761 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:800 access/gist/gistutil.c:811 -#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 +#: access/gist/gist.c:762 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 @@ -926,7 +1004,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:1194 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "repariere unvollständiges Teilen in Index »%s«, Block %u" @@ -941,13 +1019,13 @@ msgstr "Picksplit-Methode für Spalte %d von Index »%s« fehlgeschlagen" 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 "Der Index ist nicht optimal. Um ihn zu optimieren, kontaktieren Sie einen Entwickler oder versuchen Sie, die Spalte als die zweite im CREATE-INDEX-Befehl zu verwenden." -#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 +#: 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« enthält unerwartete Nullseite bei Block %u" -#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 +#: 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" @@ -964,39 +1042,39 @@ msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY op msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält ungültige ORDER-BY-Operatorfamilienangabe für Operator %s" #: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, 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:279 access/hash/hashfunc.c:336 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1988 commands/tablecmds.c:16957 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:1004 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1955 commands/tablecmds.c:17513 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 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:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1026 #, 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" @@ -1026,33 +1104,33 @@ 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:2288 +#: 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:2759 +#: 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:2805 +#: 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:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3188 access/heap/heapam.c:6032 #, 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:3387 +#: access/heap/heapam.c:3312 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4676 access/heap/heapam.c:4714 +#: access/heap/heapam.c:4979 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" @@ -1074,13 +1152,13 @@ msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" #: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3351 access/transam/xlog.c:3542 -#: access/transam/xlog.c:4759 access/transam/xlog.c:11377 -#: access/transam/xlog.c:11415 access/transam/xlog.c:11820 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4633 -#: postmaster/postmaster.c:5671 replication/logical/origin.c:587 -#: replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1261 +#: access/transam/xlog.c:2965 access/transam/xlog.c:3178 +#: access/transam/xlog.c:3966 access/transam/xlog.c:8659 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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" @@ -1092,180 +1170,170 @@ msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" #: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3423 access/transam/xlog.c:3598 -#: access/transam/xlog.c:4771 postmaster/postmaster.c:4643 -#: postmaster/postmaster.c:4653 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1741 replication/slot.c:1586 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 -#: utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 -#: utils/misc/guc.c:10324 utils/misc/guc.c:10338 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: access/transam/xlog.c:3037 access/transam/xlog.c:3234 +#: access/transam/xlog.c:3978 commands/dbcommands.c:506 +#: postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 +#: replication/slot.c:1666 storage/file/buffile.c:537 +#: storage/file/copydir.c:207 utils/init/miscinit.c:1449 +#: utils/init/miscinit.c:1460 utils/init/miscinit.c:1468 utils/misc/guc.c:8728 +#: utils/misc/guc.c:8759 utils/misc/guc.c:10757 utils/misc/guc.c:10771 +#: 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:1249 access/transam/twophase.c:1679 -#: 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:4424 -#: replication/logical/snapbuild.c:1686 replication/logical/snapbuild.c:2102 -#: replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 -#: storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:436 +#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 +#: replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 +#: replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:773 +#: 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 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "beende 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:775 +#: 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:780 +#: 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:782 +#: 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:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "Seiten: %u entfernt, %u verbleiben, %u gescannt (%.2f%% der Gesamtzahl)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +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:703 #, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "Seiten: %u entfernt, %u verbleiben, %u übersprungen wegen Pins, %u übersprungen weil eingefroren\n" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "verpasste Tupel: %lld tot von %u Seiten nicht entfernt wegen Cleanup-Lock-Konflikt\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:708 #, 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" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "entfernbare Obergrenze: %u, was %d XIDs alt war als die Operation endete\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:714 +#, c-format +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "neue relfrozenxid: %u, was %d XIDs vor dem vorherigen Wert ist\n" + +#: access/heap/vacuumlazy.c:721 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "neue relminmxid: %u, was %d MXIDs vor dem vorherigen Wert ist\n" + +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " msgstr "Index-Scan nicht benötigt: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "Index-Scan benötigt: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format 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:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "Index-Scan umgangen: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "Index-Scan umgangen durch Ausfallsicherung: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, c-format 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:834 +#: access/heap/vacuumlazy.c:755 #, c-format 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:846 commands/analyze.c:814 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format 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:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, 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:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format 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:857 +#: access/heap/vacuumlazy.c:785 #, c-format 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:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "Systembenutzung: %s" -#: access/heap/vacuumlazy.c:933 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "aggressives Vacuum von »%s.%s«" - -#: access/heap/vacuumlazy.c:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "Vacuum von »%s.%s«" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format 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:1656 -#, 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" - -#: 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] "%u Seite wegen Buffer-Pins übersprungen, " -msgstr[1] "%u Seiten wegen Buffer-Pins übersprungen, " - -#: access/heap/vacuumlazy.c:1662 -#, 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" - -#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:4152 -#: commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s." - -#: access/heap/vacuumlazy.c:1669 -#, 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" - -#: 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 "Tabelle »%s«: Index-Scan umgangen: %u Seiten der Tabelle (%.2f%% der Gesamtzahl) haben %lld tote Item-Bezeichner" - -#: access/heap/vacuumlazy.c:2617 +#: access/heap/vacuumlazy.c:2629 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "umgehe nicht essentielle Wartung der Tabelle »%s.%s.%s« als Ausfallsicherung nach %d Index-Scans" -#: access/heap/vacuumlazy.c:2622 +#: 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:2623 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1274,104 +1342,67 @@ 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: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] "%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: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] "%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:3063 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" - -#: access/heap/vacuumlazy.c:3120 -#, 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:3124 -#, 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.\n" -"%s." -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.\n" -"%s." - -#: access/heap/vacuumlazy.c:3233 +#: 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:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "Tabelle »%s«: von %u auf %u Seiten verkürzt" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "Tabelle »%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3508 +#: 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:4274 +#: 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:4277 +#: 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:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "beim Scannen von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4289 +#: 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:4292 +#: 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:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "beim Vacuum von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, 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:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, 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:4312 +#: 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" @@ -1386,40 +1417,40 @@ 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:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16655 commands/tablecmds.c:18406 +#: access/index/indexam.c:203 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2783 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17199 commands/tablecmds.c:18984 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1010 #, c-format 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:2330 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "Index »%s« ist kein B-Tree" @@ -1429,27 +1460,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:2680 +#: access/nbtree/nbtutils.c:2684 #, 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:2686 +#: access/nbtree/nbtutils.c:2690 #, 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:2690 +#: access/nbtree/nbtutils.c:2694 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1463,12 +1494,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:244 +#: access/spgist/spgutils.c:242 #, 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:1017 +#: access/spgist/spgutils.c:1023 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "innere Tupelgröße %zu überschreitet SP-GiST-Maximum %zu" @@ -1484,14 +1515,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:13367 -#: commands/tablecmds.c:16664 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13888 +#: commands/tablecmds.c:17208 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" @@ -1506,7 +1537,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:12470 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12926 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s ist zu lang (maximal %d Zeichen)." @@ -1526,22 +1557,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:280 +#: 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:378 +#: 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:380 +#: 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:382 +#: 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." @@ -1689,60 +1720,116 @@ msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" msgid "invalid magic number in dynamic shared memory segment" msgstr "ungültige magische Zahl in dynamischem Shared-Memory-Segment" -#: access/transam/slru.c:713 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "Resource-Manager mit ID %d nicht registriert" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Fügen Sie das Erweiterungsmodul, das diesen Resource-Manager implementiert, in shared_preload_libraries ein." + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "Custom-Resource-Manager-Name ist ungültig" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Geben Sie einen nicht leeren Namen für den Custom-Resource-Manager an." + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "Custom-Resource-Manager-ID %d ist außerhalb des gültigen Bereichs" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Geben Sie eine Custom-Resource-Manager-ID zwischen %d und %d an." + +#: 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 "konnte Custom-Resource-Manager »%s« mit ID %d nicht registrieren" + +#: access/transam/rmgr.c:112 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "Custom-Resource-Manager muss beim Initialisieren von Modulen in shared_preload_libraries registriert werden." + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Custom-Resource-Manager »%s« ist schon mit der gleichen ID registriert." + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "Bestehender Resource-Manager mit ID %d hat den gleichen Namen." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "Custom-Resource-Manager »%s« mit ID %d wurde registriert" + +#: access/transam/slru.c:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "Datei »%s« existiert nicht, wird als Nullen eingelesen" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "konnte auf den Status von Transaktion %u nicht zugreifen" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Konnte Datei »%s« nicht öffnen: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, 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:960 +#: access/transam/slru.c:961 #, 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:965 +#: access/transam/slru.c:966 #, 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:972 +#: access/transam/slru.c:973 #, 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:977 +#: access/transam/slru.c:978 #, 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:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Konnte Datei »%s« nicht fsyncen: %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Konnte Datei »%s« nicht schließen: %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "konnte Verzeichnis »%s« nicht leeren: anscheinender Überlauf" @@ -1787,182 +1874,183 @@ 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:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "Transaktionsbezeichner »%s« ist zu lang" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "vorbereitete Transaktionen sind abgeschaltet" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, 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:413 #, 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:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, c-format msgid "maximum number of prepared transactions reached" msgstr "maximale Anzahl vorbereiteter Transaktionen erreicht" -#: access/transam/twophase.c:418 access/transam/twophase.c:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Erhöhen Sie max_prepared_transactions (aktuell %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "vorbereitete Transaktion mit Bezeichner »%s« ist beschäftigt" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "keine Berechtigung, um vorbereitete Transaktion abzuschließen" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:606 #, 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:613 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "vorbereitete Transaktion gehört zu einer anderen Datenbank" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:618 #, 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:629 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "vorbereitete Transaktion mit Bezeichner »%s« existiert nicht" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1170 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "maximale Länge der Zweiphasen-Statusdatei überschritten" -#: access/transam/twophase.c:1305 +#: access/transam/twophase.c:1325 #, 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:1314 +#: access/transam/twophase.c:1334 #, 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:1332 +#: access/transam/twophase.c:1352 #, 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:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ungültige magische Zahl in Datei »%s gespeichert«" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ungültige Größe in Datei »%s« gespeichert" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, 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:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Fehlgeschlagen beim Anlegen eines WAL-Leseprozessors." -#: access/transam/twophase.c:1417 +#: access/transam/twophase.c:1425 #, 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:1422 +#: access/transam/twophase.c:1430 #, 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:1430 +#: access/transam/twophase.c:1438 #, 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:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "konnte Datei »%s« nicht neu erzeugen: %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, 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:2068 +#: access/transam/twophase.c:2095 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "Wiederherstellung der vorbereiteten Transaktion %u aus dem Shared Memory" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2188 #, 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:2166 +#: access/transam/twophase.c:2195 #, 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:2179 +#: access/transam/twophase.c:2208 #, 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:2186 +#: access/transam/twophase.c:2215 #, 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:2211 +#: access/transam/twophase.c:2240 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "verfälschte Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2216 +#: access/transam/twophase.c:2245 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "verfälschter Zweiphasen-Status im Speicher für Transaktion %u" -#: access/transam/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "konnte Zweiphasen-Statusdatei für Transaktion %u nicht wiederherstellen" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." msgstr "Zweiphasen-Statusdatei wurde in WAL-Eintrag %X/%X gefunden, aber diese Transaktion wurde schon von der Festplatte wiederhergestellt." -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 -#: utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 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" @@ -1996,568 +2084,880 @@ 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:1046 +#: 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:1584 +#: 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:2435 +#: 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:2445 +#: 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:3416 +#: access/transam/xact.c:3479 #, 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:3426 +#: access/transam/xact.c:3489 #, 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:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s kann nicht innerhalb einer Pipeline ausgeführt werden" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, 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:3517 access/transam/xact.c:3832 -#: access/transam/xact.c:3911 access/transam/xact.c:4034 -#: access/transam/xact.c:4185 access/transam/xact.c:4254 -#: access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 +#: access/transam/xact.c:3974 access/transam/xact.c:4097 +#: access/transam/xact.c:4248 access/transam/xact.c:4317 +#: access/transam/xact.c:4428 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kann nur in Transaktionsblöcken verwendet werden" -#: access/transam/xact.c:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "eine Transaktion ist bereits begonnen" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 -#: access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 +#: access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "keine Transaktion offen" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "während einer parallelen Operation kann nicht committet werden" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, c-format msgid "cannot abort during a parallel operation" msgstr "während einer parallelen Operation kann nicht abgebrochen werden" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4212 #, 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:4236 +#: access/transam/xact.c:4299 #, 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:4246 access/transam/xact.c:4297 -#: access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 +#: access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "Sicherungspunkt »%s« existiert nicht" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, 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:4345 +#: access/transam/xact.c:4408 #, 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:4473 +#: access/transam/xact.c:4536 #, 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:4541 +#: access/transam/xact.c:4604 #, 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:5188 +#: access/transam/xact.c:5251 #, 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:1836 +#: access/transam/xlog.c:1465 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "Flush hinter das Ende des erzeugten WAL angefordert; Anforderung %X/%X, aktuelle Position %X/%X" -#: access/transam/xlog.c:2609 +#: access/transam/xlog.c:2226 #, 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:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "Es ist bekannt, dass dies gelegentlich während der Archivwiederherstellung fehlschlägt, ist da aber harmlos." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 -#: replication/walsender.c:2557 +#: access/transam/xlog.c:3473 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" -#: access/transam/xlog.c:4289 +#: access/transam/xlog.c:3758 #, c-format msgid "could not rename file \"%s\": %m" msgstr "konnte Datei »%s« nicht umbenennen: %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3800 access/transam/xlog.c:3810 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "benötigtes WAL-Verzeichnis »%s« existiert nicht" -#: access/transam/xlog.c:4347 +#: access/transam/xlog.c:3816 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "erzeuge fehlendes WAL-Verzeichnis »%s«" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3819 commands/dbcommands.c:3115 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "konnte fehlendes Verzeichnis »%s« nicht erzeugen: %m" -#: access/transam/xlog.c:4472 -#, 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:4610 -#, 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:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "neue Zielzeitleiste ist %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3886 #, c-format msgid "could not generate secret authorization token" msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 -#: access/transam/xlog.c:4871 access/transam/xlog.c:4878 -#: access/transam/xlog.c:4885 access/transam/xlog.c:4890 -#: access/transam/xlog.c:4897 access/transam/xlog.c:4904 -#: access/transam/xlog.c:4911 access/transam/xlog.c:4918 -#: access/transam/xlog.c:4925 access/transam/xlog.c:4932 -#: access/transam/xlog.c:4941 access/transam/xlog.c:4948 -#: utils/init/miscinit.c:1583 +#: access/transam/xlog.c:4045 access/transam/xlog.c:4054 +#: access/transam/xlog.c:4078 access/transam/xlog.c:4085 +#: access/transam/xlog.c:4092 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 +#: access/transam/xlog.c:4118 access/transam/xlog.c:4125 +#: access/transam/xlog.c:4132 access/transam/xlog.c:4139 +#: access/transam/xlog.c:4148 access/transam/xlog.c:4155 +#: utils/init/miscinit.c:1606 #, c-format msgid "database files are incompatible with server" msgstr "Datenbankdateien sind inkompatibel mit Server" -#: access/transam/xlog.c:4839 +#: access/transam/xlog.c:4046 #, 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:4843 +#: access/transam/xlog.c:4050 #, 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:4848 +#: access/transam/xlog.c:4055 #, 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:4851 access/transam/xlog.c:4875 -#: access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: access/transam/xlog.c:4058 access/transam/xlog.c:4082 +#: access/transam/xlog.c:4089 access/transam/xlog.c:4094 #, 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:4862 +#: access/transam/xlog.c:4069 #, c-format msgid "incorrect checksum in control file" msgstr "falsche Prüfsumme in Kontrolldatei" -#: access/transam/xlog.c:4872 +#: access/transam/xlog.c:4079 #, 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:4879 +#: access/transam/xlog.c:4086 #, 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:4886 +#: access/transam/xlog.c:4093 #, 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:4891 +#: access/transam/xlog.c:4098 #, 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: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:4929 -#: access/transam/xlog.c:4936 access/transam/xlog.c:4944 -#: access/transam/xlog.c:4951 +#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 +#: access/transam/xlog.c:4115 access/transam/xlog.c:4122 +#: access/transam/xlog.c:4129 access/transam/xlog.c:4136 +#: access/transam/xlog.c:4143 access/transam/xlog.c:4151 +#: access/transam/xlog.c:4158 #, 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:4898 +#: access/transam/xlog.c:4105 #, 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:4905 +#: access/transam/xlog.c:4112 #, 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:4912 +#: access/transam/xlog.c:4119 #, 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:4919 +#: access/transam/xlog.c:4126 #, 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:4926 +#: access/transam/xlog.c:4133 #, 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:4933 +#: access/transam/xlog.c:4140 #, 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:4942 +#: access/transam/xlog.c:4149 #, 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:4949 +#: access/transam/xlog.c:4156 #, 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:4958 +#: access/transam/xlog.c:4165 #, 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:4970 +#: access/transam/xlog.c:4177 #, 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:4974 +#: access/transam/xlog.c:4181 #, 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:5408 +#: access/transam/xlog.c:4622 #, 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:5416 +#: access/transam/xlog.c:4630 #, 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:5422 +#: access/transam/xlog.c:4636 #, 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:5483 +#: access/transam/xlog.c:4854 #, 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:5548 +#: access/transam/xlog.c:4855 #, 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:5565 +#: access/transam/xlog.c:4856 #, 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:5566 +#: access/transam/xlog.c:4920 #, 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:5574 +#: access/transam/xlog.c:4931 #, 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:5612 +#: access/transam/xlog.c:4937 #, 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:5734 +#: access/transam/xlog.c:4943 #, 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:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4949 #, 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:5821 +#: access/transam/xlog.c:4951 #, 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:5911 +#: access/transam/xlog.c:4957 #, 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:5918 +#: access/transam/xlog.c:4959 #, 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:5971 +#: access/transam/xlog.c:4965 #, 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:5989 +#: access/transam/xlog.c:4971 #, 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:6056 +#: access/transam/xlog.c:5355 #, 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:6064 +#: access/transam/xlog.c:5356 #, 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:6109 +#: access/transam/xlog.c:5359 #, 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:6110 +#: access/transam/xlog.c:5407 #, 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:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5440 #, c-format -msgid "recovery has paused" -msgstr "Wiederherstellung wurde pausiert" +msgid "archive recovery complete" +msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6046 #, 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:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6085 #, 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:6387 access/transam/xlog.c:6414 -#: access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6097 #, 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:6396 +#: access/transam/xlog.c:6157 #, 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:6397 +#: access/transam/xlog.c:6177 #, 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:6408 +#: access/transam/xlog.c:6612 #, 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:6418 +#: access/transam/xlog.c:7169 #, 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:6442 +#: access/transam/xlog.c:7171 #, 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:6448 +#: access/transam/xlog.c:7418 #, 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:6470 +#: access/transam/xlog.c:7625 #, 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:6471 +#: access/transam/xlog.c:7682 #, 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:6472 +#: access/transam/xlog.c:7740 #, 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:6541 +#: access/transam/xlog.c:7769 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im End-of-Recovery-Datensatz" -#: access/transam/xlog.c:6552 +#: access/transam/xlog.c:8027 #, 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:6558 +#: access/transam/xlog.c:8033 #, 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:6564 +#: access/transam/xlog.c:8128 access/transam/xlog.c:8495 #, 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:8129 access/transam/xlog.c:8496 +#: access/transam/xlogfuncs.c:199 +#, 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." + +#: access/transam/xlog.c:8134 +#, c-format +msgid "backup label too long (max %d bytes)" +msgstr "Backup-Label zu lang (maximal %d Bytes)" + +#: access/transam/xlog.c:8250 +#, 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" + +#: access/transam/xlog.c:8252 access/transam/xlog.c:8608 +#, 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." + +#: access/transam/xlog.c:8332 backup/basebackup.c:1345 utils/adt/misc.c:347 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" + +#: access/transam/xlog.c:8382 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#, c-format +msgid "tablespaces are not supported on this platform" +msgstr "Tablespaces werden auf dieser Plattform nicht unterstützt" + +#: access/transam/xlog.c:8541 access/transam/xlog.c:8554 +#: access/transam/xlogrecovery.c:1237 access/transam/xlogrecovery.c:1244 +#: access/transam/xlogrecovery.c:1303 access/transam/xlogrecovery.c:1383 +#: access/transam/xlogrecovery.c:1407 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "ungültige Daten in Datei »%s«" + +#: access/transam/xlog.c:8558 backup/basebackup.c:1200 +#, 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" + +#: access/transam/xlog.c:8559 backup/basebackup.c:1201 +#, 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." + +#: access/transam/xlog.c:8606 +#, 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" + +#: access/transam/xlog.c:8731 +#, 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" + +#: access/transam/xlog.c:8745 +#, 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)" + +#: access/transam/xlog.c:8747 +#, 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." + +#: access/transam/xlog.c:8754 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "alle benötigten WAL-Segmente wurden archiviert" + +#: access/transam/xlog.c:8758 +#, 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" + +#: access/transam/xlog.c:8807 +#, c-format +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/xlogarchive.c:215 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "Archivdatei »%s« hat falsche Größe: %lld statt %lld" + +#: access/transam/xlogarchive.c:224 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "Logdatei »%s« aus Archiv wiederhergestellt" + +#: access/transam/xlogarchive.c:238 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command endete mit Statuscode null, aber stat() schlug fehlt." + +#: access/transam/xlogarchive.c:270 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %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:383 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s »%s«: %s" + +#: access/transam/xlogarchive.c:493 access/transam/xlogarchive.c:573 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" + +#: access/transam/xlogarchive.c:501 access/transam/xlogarchive.c:581 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "ein Backup läuft bereits in dieser Sitzung" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "es läuft kein Backup" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "Haben Sie pg_backup_start() ausgeführt?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "Während der Wiederherstellung können keine WAL-Kontrollfunktionen ausgeführt werden." + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL-Level nicht ausreichend, um Restore-Punkt anzulegen" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "Wert zu lang für Restore-Punkt (maximal %d Zeichen)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden." + +#: 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 "recovery is not in progress" +msgstr "Wiederherstellung läuft nicht" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "Wiederherstellungskontrollfunktionen können nur während der Wiederherstellung ausgeführt werden." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "Beförderung des Standby läuft" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, 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." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "»wait_seconds« darf nicht negativ oder null sein" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:257 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "konnte Signal nicht an Postmaster senden: %m" + +#: access/transam/xlogfuncs.c:643 +#, 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" + +#: access/transam/xlogprefetcher.c:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch wird auf Plattformen ohne posix_fadvise() nicht unterstützt." + +#: access/transam/xlogreader.c:620 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "ungültiger Datensatz-Offset bei %X/%X" + +#: access/transam/xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "Contrecord angefordert von %X/%X" + +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#, 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" + +#: access/transam/xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "keine Contrecord-Flag bei %X/%X" + +#: access/transam/xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" + +#: access/transam/xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ungültige Resource-Manager-ID %u bei %X/%X" + +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" + +#: access/transam/xlogreader.c:1209 +#, 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" + +#: access/transam/xlogreader.c:1246 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u" + +#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1301 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u" + +#: access/transam/xlogreader.c:1275 +#, 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" + +#: access/transam/xlogreader.c:1283 +#, 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" + +#: access/transam/xlogreader.c:1289 +#, 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" + +#: access/transam/xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u" + +#: access/transam/xlogreader.c:1345 +#, 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" + +#: access/transam/xlogreader.c:1750 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %u außer der Reihe bei %X/%X" + +#: access/transam/xlogreader.c:1774 +#, 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" + +#: access/transam/xlogreader.c:1781 +#, 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" + +#: access/transam/xlogreader.c:1817 +#, 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" + +#: access/transam/xlogreader.c:1833 +#, 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" + +#: access/transam/xlogreader.c:1847 +#, c-format +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/xlogreader.c:1862 +#, c-format +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/xlogreader.c:1878 +#, 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" + +#: access/transam/xlogreader.c:1890 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "ungültige block_id %u bei %X/%X" + +#: access/transam/xlogreader.c:1957 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlog.c:6570 +#: access/transam/xlogreader.c:1982 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "Datenbanksystem wurde während der Wiederherstellung am %s unterbrochen" +msgid "could not 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:6572 +#: access/transam/xlogreader.c:2066 #, 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 "could not restore image at %X/%X with invalid block %d specified" +msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: access/transam/xlog.c:6578 +#: access/transam/xlogreader.c:2073 #, 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 "could not restore image at %X/%X with invalid state, block %d" +msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: access/transam/xlog.c:6580 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, 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 "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: access/transam/xlog.c:6586 +#: access/transam/xlogreader.c:2126 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "Datenbanksystem wurde unterbrochen; letzte bekannte Aktion am %s" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: access/transam/xlog.c:6592 +#: access/transam/xlogreader.c:2134 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" +msgid "could not decompress image at %X/%X, block %d" +msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" -#: access/transam/xlog.c:6649 +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "Standby-Modus eingeschaltet" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "starte Point-in-Time-Recovery bis XID %u" -#: access/transam/xlog.c:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "starte Point-in-Time-Recovery bis %s" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "starte Point-in-Time-Recovery bis »%s«" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, 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«" -#: access/transam/xlog.c:6668 +#: access/transam/xlogrecovery.c:564 #, c-format 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:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "starte Wiederherstellung aus Archiv" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:635 +#, c-format +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "starte Wiederherstellung aus Backup mit Redo-LSN %X/%X, Checkpoint-LSN %X/%X, auf Zeitleisten-ID %u" + +#: access/transam/xlogrecovery.c:667 #, c-format 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:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:668 access/transam/xlogrecovery.c:678 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2568,1581 +2968,1432 @@ msgstr "" "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:6755 +#: access/transam/xlogrecovery.c:677 #, c-format msgid "could not locate required checkpoint record" msgstr "konnte den nötigen Checkpoint-Datensatz nicht finden" -#: access/transam/xlog.c:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:706 commands/tablespace.c:685 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: access/transam/xlog.c:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:738 access/transam/xlogrecovery.c:744 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignoriere Datei »%s«, weil keine Datei »%s« existiert" -#: access/transam/xlog.c:6818 access/transam/xlog.c:12353 +#: access/transam/xlogrecovery.c:740 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Datei »%s« wurde in »%s« umbenannt." -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:746 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." -#: access/transam/xlog.c:6875 +#: access/transam/xlogrecovery.c:785 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "starte Wiederherstellung aus Backup neu mit Redo-LSN %X/%X" + +#: access/transam/xlogrecovery.c:810 #, c-format msgid "could not locate a valid checkpoint record" msgstr "konnte keinen gültigen Checkpoint-Datensatz finden" -#: access/transam/xlog.c:6913 +#: access/transam/xlogrecovery.c:834 #, 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" -#: access/transam/xlog.c:6915 +#: access/transam/xlogrecovery.c:836 #, 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." -#: access/transam/xlog.c:6929 +#: access/transam/xlogrecovery.c:850 #, 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:6959 +#: access/transam/xlogrecovery.c:878 #, c-format msgid "invalid next transaction ID" msgstr "ungültige nächste Transaktions-ID" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:883 #, c-format msgid "invalid redo in checkpoint record" msgstr "ungültiges Redo im Checkpoint-Datensatz" -#: access/transam/xlog.c:7070 +#: access/transam/xlogrecovery.c:894 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ungültiger Redo-Datensatz im Shutdown-Checkpoint" -#: access/transam/xlog.c:7110 +#: access/transam/xlogrecovery.c:923 #, c-format 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:7114 +#: access/transam/xlogrecovery.c:927 #, 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" -#: access/transam/xlog.c:7161 +#: access/transam/xlogrecovery.c:970 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "Daten in backup_label stimmen nicht mit Kontrolldatei überein" -#: access/transam/xlog.c:7162 +#: access/transam/xlogrecovery.c:971 #, 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." -#: access/transam/xlog.c:7388 +#: access/transam/xlogrecovery.c:1025 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" + +#: access/transam/xlogrecovery.c:1090 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "Standby-Modus wird von Servern im Einzelbenutzermodus nicht unterstützt" + +#: access/transam/xlogrecovery.c:1107 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "weder primary_conninfo noch restore_command angegeben" + +#: access/transam/xlogrecovery.c:1108 +#, 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." + +#: access/transam/xlogrecovery.c:1116 +#, 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" + +#: access/transam/xlogrecovery.c:1154 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "recovery_target_timeline %u existiert nicht" + +#: access/transam/xlogrecovery.c:1304 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." + +#: access/transam/xlogrecovery.c:1686 #, c-format msgid "redo starts at %X/%X" msgstr "Redo beginnt bei %X/%X" -#: access/transam/xlog.c:7613 +#: access/transam/xlogrecovery.c:1699 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "Redo im Gang, abgelaufene Zeit: %ld.%02d s, aktuelle LSN: %X/%X" + +#: access/transam/xlogrecovery.c:1791 #, 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:7651 +#: access/transam/xlogrecovery.c:1823 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "Redo fertig bei %X/%X Systembenutzung: %s" -#: access/transam/xlog.c:7657 +#: access/transam/xlogrecovery.c:1829 #, c-format msgid "last completed transaction was at log time %s" msgstr "letzte vollständige Transaktion war bei Logzeit %s" -#: access/transam/xlog.c:7666 +#: access/transam/xlogrecovery.c:1838 #, c-format msgid "redo is not required" msgstr "Redo nicht nötig" -#: access/transam/xlog.c:7678 +#: access/transam/xlogrecovery.c:1849 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "Wiederherstellung endete bevor das konfigurierte Wiederherstellungsziel erreicht wurde" -#: access/transam/xlog.c:7762 access/transam/xlog.c:7766 +#: access/transam/xlogrecovery.c:2024 #, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL endet vor dem Ende der Online-Sicherung" - -#: access/transam/xlog.c:7763 -#, 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/xlog.c:7767 -#, 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." - -#: access/transam/xlog.c:7770 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" - -#: access/transam/xlog.c:7805 -#, c-format -msgid "selected new timeline ID: %u" -msgstr "gewählte neue Zeitleisten-ID: %u" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "fehlender Contrecord bei %X/%X erfolgreich übersprungen, überschrieben am %s" -#: access/transam/xlog.c:8249 +#: access/transam/xlogrecovery.c:2091 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "unerwarteter Verzeichniseintrag »%s« in %s gefunden" -#: access/transam/xlog.c:8251 +#: access/transam/xlogrecovery.c:2093 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Alle Verzeichniseinträge in pg_tblspc/ sollten symbolische Verknüpfungen sein." -#: access/transam/xlog.c:8252 +#: access/transam/xlogrecovery.c:2094 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." msgstr "Entfernen Sie diese Verzeichnisse oder setzen Sie allow_in_place_tablespaces vorrübergehend auf ON, damit die Wiederherstellung abschließen kann." -#: access/transam/xlog.c:8336 -#, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" - -#: access/transam/xlog.c:8545 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "ungültige primäre Checkpoint-Verknüpfung in Kontrolldatei" - -#: access/transam/xlog.c:8549 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "ungültige Checkpoint-Verknüpfung in backup_label-Datei" - -#: access/transam/xlog.c:8567 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "ungültiger primärer Checkpoint-Datensatz" - -#: access/transam/xlog.c:8571 -#, c-format -msgid "invalid checkpoint record" -msgstr "ungültiger Checkpoint-Datensatz" - -#: access/transam/xlog.c:8582 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ungültige Resource-Manager-ID im primären Checkpoint-Datensatz" - -#: access/transam/xlog.c:8586 -#, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" - -#: access/transam/xlog.c:8599 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "ungültige xl_info im primären Checkpoint-Datensatz" - -#: access/transam/xlog.c:8603 -#, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "ungültige xl_info im Checkpoint-Datensatz" - -#: access/transam/xlog.c:8614 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "ungültige Länge des primären Checkpoint-Datensatzes" - -#: access/transam/xlog.c:8618 -#, c-format -msgid "invalid length of checkpoint record" -msgstr "ungültige Länge des Checkpoint-Datensatzes" - -#: access/transam/xlog.c:8799 -#, c-format -msgid "shutting down" -msgstr "fahre herunter" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 -#, 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" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8850 -#, c-format -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:8910 -#, 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 "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:8930 +#: access/transam/xlogrecovery.c:2146 #, 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 "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:9374 -#, 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" - -#: access/transam/xlog.c:9907 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "Recovery-Restart-Punkt bei %X/%X" +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "Wiederherstellung aus Backup abgeschlossen mit Redo-LSN %X/%X und End-LSN %X/%X" -#: access/transam/xlog.c:9909 +#: access/transam/xlogrecovery.c:2176 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." +msgid "consistent recovery state reached at %X/%X" +msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" -#: access/transam/xlog.c:10155 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2214 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL-Redo bei %X/%X für %s" -#: access/transam/xlog.c:10300 +#: access/transam/xlogrecovery.c:2310 #, 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" -#: access/transam/xlog.c:10309 +#: access/transam/xlogrecovery.c:2319 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (nach %u) im Checkpoint-Datensatz" -#: access/transam/xlog.c:10325 +#: access/transam/xlogrecovery.c:2335 #, 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" -#: access/transam/xlog.c:10400 -#, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" - -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 -#: access/transam/xlog.c:10542 -#, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Checkpoint-Datensatz" - -#: access/transam/xlog.c:10700 -#, c-format -msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" -msgstr "fehlender Contrecord bei %X/%X erfolgreich übersprungen, überschrieben am %s" - -#: access/transam/xlog.c:10915 -#, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" - -#: access/transam/xlog.c:10921 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "konnte Datei »%s« nicht fdatasyncen: %m" - -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 -#: 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 "Während der Wiederherstellung können keine WAL-Kontrollfunktionen ausgeführt werden." - -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 -#, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" - -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 -#: access/transam/xlogfuncs.c:308 -#, 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." - -#: access/transam/xlog.c:11047 -#, c-format -msgid "backup label too long (max %d bytes)" -msgstr "Backup-Label zu lang (maximal %d Bytes)" - -#: access/transam/xlog.c:11084 access/transam/xlog.c:11368 -#: access/transam/xlog.c:11406 +#: access/transam/xlogrecovery.c:2519 access/transam/xlogrecovery.c:2795 #, c-format -msgid "a backup is already in progress" -msgstr "ein Backup läuft bereits" +msgid "recovery stopping after reaching consistency" +msgstr "Wiederherstellung beendet nachdem Konsistenz erreicht wurde" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:2540 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Führen Sie pg_stop_backup() aus und versuchen Sie es nochmal." +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "Wiederherstellung beendet vor WAL-Position (LSN) »%X/%X«" -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:2630 #, 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 "recovery stopping before commit of transaction %u, time %s" +msgstr "Wiederherstellung beendet vor Commit der Transaktion %u, Zeit %s" -#: access/transam/xlog.c:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:2637 #, 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 "recovery stopping before abort of transaction %u, time %s" +msgstr "Wiederherstellung beendet vor Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlog.c:11267 replication/basebackup.c:1439 -#: utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2690 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "Wiederherstellung beendet bei Restore-Punkt »%s«, Zeit %s" -#: access/transam/xlog.c:11317 commands/tablespace.c:385 -#: commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2708 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "Tablespaces werden auf dieser Plattform nicht unterstützt" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "Wiederherstellung beendet nach WAL-Position (LSN) »%X/%X«" -#: access/transam/xlog.c:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:2775 #, 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 "recovery stopping after commit of transaction %u, time %s" +msgstr "Wiederherstellung beendet nach Commit der Transaktion %u, Zeit %s" -#: access/transam/xlog.c:11594 +#: access/transam/xlogrecovery.c:2783 #, c-format -msgid "exclusive backup not in progress" -msgstr "es läuft kein exklusives Backup" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "Wiederherstellung beendet nach Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlog.c:11621 +#: access/transam/xlogrecovery.c:2864 #, c-format -msgid "a backup is not in progress" -msgstr "es läuft kein Backup" +msgid "pausing at the end of recovery" +msgstr "pausiere am Ende der Wiederherstellung" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 -#: access/transam/xlog.c:12111 access/transam/xlog.c:12117 -#: access/transam/xlog.c:12165 access/transam/xlog.c:12245 -#: access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2865 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "ungültige Daten in Datei »%s«" +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/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2868 access/transam/xlogrecovery.c:4678 #, 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 "recovery has paused" +msgstr "Wiederherstellung wurde pausiert" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2869 #, 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 "Execute pg_wal_replay_resume() to continue." +msgstr "Führen Sie pg_wal_replay_resume() aus um fortzusetzen." -#: access/transam/xlog.c:11772 +#: access/transam/xlogrecovery.c:3135 #, 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 "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "unerwartete Zeitleisten-ID %u in Logsegment %s, Offset %u" -#: access/transam/xlog.c:11892 +#: access/transam/xlogrecovery.c:3340 #, 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 "could not read from log segment %s, offset %u: %m" +msgstr "konnte nicht aus Logsegment %s, Position %u lesen: %m" -#: access/transam/xlog.c:11904 +#: access/transam/xlogrecovery.c:3346 #, 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 "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/xlog.c:11906 +#: access/transam/xlogrecovery.c:3995 #, 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 primary checkpoint link in control file" +msgstr "ungültige primäre Checkpoint-Verknüpfung in Kontrolldatei" -#: access/transam/xlog.c:11913 +#: access/transam/xlogrecovery.c:3999 #, c-format -msgid "all required WAL segments have been archived" -msgstr "alle benötigten WAL-Segmente wurden archiviert" +msgid "invalid checkpoint link in backup_label file" +msgstr "ungültige Checkpoint-Verknüpfung in backup_label-Datei" -#: access/transam/xlog.c:11917 +#: access/transam/xlogrecovery.c:4017 #, 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 "invalid primary checkpoint record" +msgstr "ungültiger primärer Checkpoint-Datensatz" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:4021 #, 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 "invalid checkpoint record" +msgstr "ungültiger Checkpoint-Datensatz" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:4032 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "ungültige Resource-Manager-ID im primären Checkpoint-Datensatz" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:4036 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL-Redo bei %X/%X für %s" +msgid "invalid resource manager ID in checkpoint record" +msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" -#: access/transam/xlog.c:12342 +#: access/transam/xlogrecovery.c:4049 #, c-format -msgid "online backup mode was not canceled" -msgstr "Online-Sicherungsmodus wurde nicht storniert" +msgid "invalid xl_info in primary checkpoint record" +msgstr "ungültige xl_info im primären Checkpoint-Datensatz" -#: access/transam/xlog.c:12343 +#: access/transam/xlogrecovery.c:4053 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." +msgid "invalid xl_info in checkpoint record" +msgstr "ungültige xl_info im Checkpoint-Datensatz" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 -#: access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:4064 #, c-format -msgid "online backup mode canceled" -msgstr "Online-Sicherungsmodus storniert" +msgid "invalid length of primary checkpoint record" +msgstr "ungültige Länge des primären Checkpoint-Datensatzes" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:4068 #, 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 "invalid length of checkpoint record" +msgstr "ungültige Länge des Checkpoint-Datensatzes" -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:4124 #, 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 "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:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4138 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "konnte nicht aus Logsegment %s, Position %u lesen: %m" +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:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4157 #, 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 "new target timeline is %u" +msgstr "neue Zielzeitleiste ist %u" -#: access/transam/xlog.c:13079 +#: access/transam/xlogrecovery.c:4360 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" -#: access/transam/xlog.c:13174 +#: access/transam/xlogrecovery.c:4423 #, c-format msgid "received promote request" msgstr "Anforderung zum Befördern empfangen" -#: access/transam/xlog.c:13187 +#: access/transam/xlogrecovery.c:4436 #, c-format msgid "promote trigger file found: %s" msgstr "Promote-Triggerdatei gefunden: %s" -#: access/transam/xlog.c:13195 +#: access/transam/xlogrecovery.c:4444 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "konnte »stat« für Promote-Triggerdatei »%s« nicht ausführen: %m" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4669 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "Archivdatei »%s« hat falsche Größe: %lld statt %lld" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "Hot Standby ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4670 access/transam/xlogrecovery.c:4697 +#: access/transam/xlogrecovery.c:4727 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "Logdatei »%s« aus Archiv wiederhergestellt" +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/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4679 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command endete mit Statuscode null, aber stat() schlug fehlt." +msgid "If recovery is unpaused, the server will shut down." +msgstr "Wenn die Wiederherstellungspause beendet wird, wird der Server herunterfahren." -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4680 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %s" +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." -#. 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:4691 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s »%s«: %s" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "Beförderung ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4701 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" +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/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4725 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4731 #, c-format -msgid "a backup is already in progress in this session" -msgstr "ein Backup läuft bereits in dieser Sitzung" +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/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "non-exclusive backup in progress" -msgstr "es läuft ein nicht-exklusives Backup" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "konnte nicht aus Logsegment %s, Position %d lesen: %m" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Meinten Sie pg_stop_backup('f')?" +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" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1966 -#: commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 -#: executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 -#: 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:3328 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 -#: utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 -#: utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10024 -#: utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:253 #, 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 "expected end timeline %u but found timeline %u" +msgstr "End-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1970 -#: commands/extension.c:2078 commands/extension.c:2363 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:3332 -#: 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:223 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10028 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:277 #, 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 "expected start timeline %u but found timeline %u" +msgstr "Start-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:304 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "es läuft kein nicht-exklusives Backup" +msgid "start timeline %u not found in history of timeline %u" +msgstr "Start-Zeitleiste %u nicht in der History der Zeitleiste %u gefunden" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:355 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Meinten Sie pg_stop_backup('t')?" +msgid "could not rewind temporary file" +msgstr "konnte Position in temporärer Datei nicht auf Anfang setzen" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:374 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "WAL-Level nicht ausreichend, um Restore-Punkt anzulegen" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "konnte nicht aus temporärer Datei lesen: es wurden nur %zu von %zu Bytes gelesen" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:454 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "Wert zu lang für Restore-Punkt (maximal %d Zeichen)" +msgid "could not find any WAL files" +msgstr "konnte keine WAL-Dateien finden" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden." +msgid "could not find WAL file \"%s\"" +msgstr "konnte WAL-Datei »%s« nicht finden" -#: 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 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "recovery is not in progress" -msgstr "Wiederherstellung läuft nicht" +msgid "unexpected WAL file size \"%s\"" +msgstr "unerwartete WAL-Dateigröße »%s«" -#: 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 +#: backup/basebackup.c:630 #, 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 "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld Prüfsummenfehler insgesamt" +msgstr[1] "%lld Prüfsummenfehler insgesamt" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:637 #, c-format -msgid "standby promotion is ongoing" -msgstr "Beförderung des Standby läuft" +msgid "checksum verification failure during base backup" +msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, 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 "duplicate option \"%s\"" +msgstr "doppelte Option »%s«" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:734 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "»wait_seconds« darf nicht negativ oder null sein" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "unbekannter Checkpoint-Typ: »%s«" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:769 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "konnte Signal nicht an Postmaster senden: %m" +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)" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:814 #, 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 "unrecognized manifest option: \"%s\"" +msgstr "unbekannte Manifestoption: »%s«" -#: access/transam/xlogreader.c:323 +#: backup/basebackup.c:830 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ungültiger Datensatz-Offset bei %X/%X" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "unbekannter Prüfsummenalgorithmus: »%s«" -#: access/transam/xlogreader.c:331 +#: backup/basebackup.c:865 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "Contrecord angefordert von %X/%X" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: access/transam/xlogreader.c:372 access/transam/xlogreader.c:720 +#: backup/basebackup.c:881 #, 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 "unrecognized base backup option: \"%s\"" +msgstr "unbekannte Base-Backup-Option: »%s«" -#: access/transam/xlogreader.c:442 +#: backup/basebackup.c:892 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "keine Contrecord-Flag bei %X/%X" +msgid "manifest checksums require a backup manifest" +msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" -#: access/transam/xlogreader.c:455 +#: backup/basebackup.c:901 #, 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 "target detail cannot be used without target" +msgstr "Zieldetail kann nicht ohne Ziel verwendet werden" -#: access/transam/xlogreader.c:728 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ungültige Resource-Manager-ID %u bei %X/%X" +msgid "target \"%s\" does not accept a target detail" +msgstr "Ziel »%s« akzeptiert kein Zieldetail" -#: access/transam/xlogreader.c:741 access/transam/xlogreader.c:757 +#: backup/basebackup.c:921 #, 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 "compression detail cannot be specified unless compression is enabled" +msgstr "Komprimierungsdetail kann nicht angegeben werden, wenn Komprimierung nicht eingeschaltet ist" -#: access/transam/xlogreader.c:795 +#: backup/basebackup.c:934 #, 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 compression specification: %s" +msgstr "ungültige Komprimierungsangabe: %s" -#: access/transam/xlogreader.c:832 +#: backup/basebackup.c:1431 #, 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 "skipping special file \"%s\"" +msgstr "überspringe besondere Datei »%s«" -#: access/transam/xlogreader.c:846 access/transam/xlogreader.c:887 +#: backup/basebackup.c:1550 #, 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 "invalid segment number %d in file \"%s\"" +msgstr "ungültige Segmentnummer %d in Datei »%s«" -#: access/transam/xlogreader.c:861 +#: backup/basebackup.c:1582 #, 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 "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" -#: access/transam/xlogreader.c:869 +#: backup/basebackup.c:1656 #, 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 "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" -#: access/transam/xlogreader.c:875 +#: backup/basebackup.c:1663 #, 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 "further checksum verification failures in file \"%s\" will not be reported" +msgstr "weitere Prüfsummenfehler in Datei »%s« werden nicht berichtet werden" -#: access/transam/xlogreader.c:906 +#: backup/basebackup.c:1719 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u" +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" -#: access/transam/xlogreader.c:931 +#: backup/basebackup.c:1765 #, 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 "file name too long for tar format: \"%s\"" +msgstr "Dateiname zu lang für Tar-Format: »%s«" -#: access/transam/xlogreader.c:1276 +#: backup/basebackup.c:1770 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %u außer der Reihe bei %X/%X" +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«" -#: access/transam/xlogreader.c:1298 +#: backup/basebackup_gzip.c:67 #, 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 "gzip compression is not supported by this build" +msgstr "gzip-Komprimierung wird von dieser Installation nicht unterstützt" -#: access/transam/xlogreader.c:1305 +#: backup/basebackup_gzip.c:143 #, 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 "could not initialize compression library" +msgstr "konnte Komprimierungsbibliothek nicht initialisieren" -#: access/transam/xlogreader.c:1341 +#: backup/basebackup_lz4.c:67 #, 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 "lz4 compression is not supported by this build" +msgstr "lz4-Komprimierung wird von dieser Installation nicht unterstützt" -#: access/transam/xlogreader.c:1357 +#: backup/basebackup_server.c:75 #, 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 "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "nur Superuser oder Rollen mit den Privilegien der Rolle pg_write_server_files können ein auf dem Server abgelegtes Backup erzeugen" -#: access/transam/xlogreader.c:1372 +#: backup/basebackup_server.c:89 #, 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 "relative path not allowed for backup stored on server" +msgstr "relativer Pfad nicht erlaubt für auf dem Server abgelegtes Backup" -#: access/transam/xlogreader.c:1387 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 #, 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 "could not create directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: access/transam/xlogreader.c:1403 +#: backup/basebackup_server.c:115 #, 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 "directory \"%s\" exists but is not empty" +msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: access/transam/xlogreader.c:1415 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "ungültige block_id %u bei %X/%X" +msgid "could not access directory \"%s\": %m" +msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: access/transam/xlogreader.c:1502 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "Datensatz mit ungültiger Länge bei %X/%X" +msgid "Check free disk space." +msgstr "Prüfen Sie den freien Festplattenplatz." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "konnte Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes bei Offset %u geschrieben" -#: access/transam/xlogreader.c:1591 +#: backup/basebackup_target.c:146 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ungültiges komprimiertes Abbild bei %X/%X, Block %d" +msgid "unrecognized target: \"%s\"" +msgstr "unbekanntes Ziel: »%s«" -#: bootstrap/bootstrap.c:270 +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "Ziel »%s« erfordert ein Zieldetail" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "zstd-Komprimierung wird von dieser Installation nicht unterstützt" + +#: backup/basebackup_zstd.c:117 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s" + +#: 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:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%s benötigt einen Wert" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, 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 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" 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 +#: 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:365 commands/copy.c:385 commands/copy.c:395 -#: commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 -#: commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 -#: commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 -#: commands/dbcommands.c:158 commands/dbcommands.c:167 -#: commands/dbcommands.c:176 commands/dbcommands.c:185 -#: commands/dbcommands.c:194 commands/dbcommands.c:203 -#: commands/dbcommands.c:212 commands/dbcommands.c:221 -#: commands/dbcommands.c:230 commands/dbcommands.c:239 -#: commands/dbcommands.c:261 commands/dbcommands.c:1529 -#: commands/dbcommands.c:1538 commands/dbcommands.c:1547 -#: commands/dbcommands.c:1556 commands/extension.c:1757 -#: commands/extension.c:1767 commands/extension.c:1777 -#: commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 -#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 -#: commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 -#: commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 -#: commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 -#: 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:408 -#: replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 -#: replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 -#: replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 -#: replication/walsender.c:894 replication/walsender.c:904 -#, 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:557 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 -#: commands/tablecmds.c:7092 commands/tablecmds.c:7248 -#: commands/tablecmds.c:7298 commands/tablecmds.c:7372 -#: commands/tablecmds.c:7442 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7648 commands/tablecmds.c:7707 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7825 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 -#: commands/tablecmds.c:11726 commands/tablecmds.c:11907 -#: commands/tablecmds.c:12067 commands/tablecmds.c:13210 -#: commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2460 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3432 -#: parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7275 commands/tablecmds.c:7431 +#: commands/tablecmds.c:7481 commands/tablecmds.c:7555 +#: commands/tablecmds.c:7625 commands/tablecmds.c:7737 +#: commands/tablecmds.c:7831 commands/tablecmds.c:7890 +#: commands/tablecmds.c:7979 commands/tablecmds.c:8009 +#: commands/tablecmds.c:8137 commands/tablecmds.c:8219 +#: commands/tablecmds.c:8375 commands/tablecmds.c:8493 +#: commands/tablecmds.c:12226 commands/tablecmds.c:12407 +#: commands/tablecmds.c:12567 commands/tablecmds.c:13731 +#: commands/tablecmds.c:16300 commands/trigger.c:954 parser/analyze.c:2506 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, 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:1147 -#: commands/tablecmds.c:249 commands/tablecmds.c:16628 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17172 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:618 commands/sequence.c:852 -#: commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 -#: commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, 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:2615 #, 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:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, 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:389 -#: utils/cache/typcache.c:444 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, 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:387 +#: 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:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "Publikation mit OID %u existiert nicht" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, 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 +#: catalog/catalog.c:447 #, c-format 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:380 +#: 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-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:405 +#: 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] "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:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "nur Superuser können pg_nextoid() aufrufen" +msgid "must be superuser to call %s()" +msgstr "nur Superuser können %s() aufrufen" -#: catalog/catalog.c:544 +#: 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:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "Index »%s« gehört nicht zu Tabelle »%s«" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "Spalte »%s« hat nicht Typ oid" -#: catalog/catalog.c:573 +#: 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:538 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:830 catalog/dependency.c:1057 #, 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:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Sie können stattdessen %s löschen." -#: catalog/dependency.c:931 catalog/pg_shdepend.c:697 -#, 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s hängt von %s ab" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "Löschvorgang löscht ebenfalls %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4157,310 +4408,330 @@ msgstr[1] "" "\n" "und %d weitere Objekte (Liste im Serverlog)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, 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:1197 catalog/dependency.c:1204 -#: catalog/dependency.c:1216 commands/tablecmds.c:1304 -#: commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 -#: commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1447 utils/misc/guc.c:7128 -#: utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11432 -#: utils/misc/guc.c:11466 utils/misc/guc.c:11500 utils/misc/guc.c:11543 -#: utils/misc/guc.c:11585 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14373 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1421 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11880 +#: utils/misc/guc.c:11914 utils/misc/guc.c:11948 utils/misc/guc.c:11991 +#: utils/misc/guc.c:12033 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, 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:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, 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:1882 +#: catalog/dependency.c:1889 #, 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/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "Spalte %d von Relation »%s« existiert nicht" + +#: 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:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 -#: commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6865 #, c-format msgid "tables can have at most %d columns" msgstr "Tabellen können höchstens %d Spalten haben" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7165 #, 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:543 +#: catalog/heap.c:500 #, 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:618 +#: catalog/heap.c:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "Partitionierungsschlüsselspalte %s hat Pseudotyp %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Spalte »%s« hat Pseudotyp %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, 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:709 +#: catalog/heap.c:666 #, 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:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, 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:1200 catalog/index.c:872 commands/createas.c:408 -#: commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "Relation »%s« existiert bereits" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 #: catalog/pg_type.c:931 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 +#: 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:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "TOAST-Relfilenode-Wert ist im Binary-Upgrade-Modus nicht gesetzt" + +#: catalog/heap.c:1216 #, 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:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "Relfilenode-Wert 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:2731 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8710 +#: catalog/heap.c:2572 catalog/index.c:889 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8867 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Constraint »%s« existiert bereits für Relation »%s«" -#: catalog/heap.c:2908 +#: catalog/heap.c:2579 #, 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:2919 +#: catalog/heap.c:2590 #, 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:2929 +#: catalog/heap.c:2600 #, 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:2934 +#: catalog/heap.c:2605 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" -#: catalog/heap.c:3039 +#: catalog/heap.c:2710 #, 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:3041 +#: catalog/heap.c:2712 #, 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:3047 +#: catalog/heap.c:2718 #, 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:3048 +#: catalog/heap.c:2719 #, 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:3101 +#: catalog/heap.c:2774 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2802 rewrite/rewriteHandler.c:1290 #, 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:3134 commands/prepare.c:368 parser/analyze.c:2684 +#: catalog/heap.c:2807 commands/prepare.c:334 parser/analyze.c:2730 #: parser/parse_target.c:594 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, 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:3181 +#: catalog/heap.c:2854 #, 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:3479 +#: catalog/heap.c:3152 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "nicht unterstützte Kombination aus ON COMMIT und Fremdschlüssel" -#: catalog/heap.c:3480 +#: catalog/heap.c:3153 #, 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:3485 +#: catalog/heap.c:3158 #, 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:3486 +#: catalog/heap.c:3159 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3488 +#: catalog/heap.c:3161 #, 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:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, 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:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "Primärschlüssel können keine Ausdrücke sein" -#: catalog/index.c:258 +#: catalog/index.c:259 #, 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:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, 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:811 +#: catalog/index.c:814 #, 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:826 +#: catalog/index.c:829 #, 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:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, 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:844 +#: catalog/index.c:847 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Cluster-globale Indexe können nicht nach initdb erzeugt werden" -#: catalog/index.c:864 commands/createas.c:423 commands/sequence.c:162 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Relation »%s« existiert bereits, wird übersprungen" -#: catalog/index.c:914 +#: catalog/index.c:917 #, 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:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "Index-Relfilenode-Wert ist im Binary-Upgrade-Modus nicht gesetzt" + +#: catalog/index.c:2232 #, 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:3637 +#: catalog/index.c:3663 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3648 commands/indexcmds.c:3572 +#: catalog/index.c:3674 commands/indexcmds.c:3536 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3664 commands/indexcmds.c:3452 commands/indexcmds.c:3596 -#: commands/tablecmds.c:3273 +#: catalog/index.c:3690 commands/indexcmds.c:3416 commands/indexcmds.c:3560 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: catalog/index.c:3808 +#: catalog/index.c:3834 #, c-format msgid "index \"%s\" was reindexed" msgstr "Index »%s« wurde neu indiziert" -#: catalog/index.c:3945 +#: catalog/index.c:3971 #, 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:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5233 +#: commands/trigger.c:5830 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" @@ -4475,24 +4746,24 @@ msgstr "temporäre Tabellen können keinen Schemanamen angeben" msgid "could not obtain lock on relation \"%s.%s\"" msgstr "konnte Sperre für Relation »%s.%s« nicht setzen" -#: catalog/namespace.c:402 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:430 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:435 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:501 catalog/namespace.c:3076 commands/extension.c:1541 -#: commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 +#: commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "kein Schema für die Objekterzeugung ausgewählt" @@ -4532,18 +4803,18 @@ msgstr "Textsuchewörterbuch »%s« existiert nicht" msgid "text search template \"%s\" does not exist" msgstr "Textsuchevorlage »%s« existiert nicht" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 +#: catalog/namespace.c:2770 commands/tsearchcmds.c:1127 #: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "Textsuchekonfiguration »%s« existiert nicht" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 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:2889 gram.y:15103 gram.y:17077 parser/parse_expr.c:817 +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 #: parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -4560,7 +4831,7 @@ 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:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 -#: commands/tablecmds.c:1249 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "Schema »%s« existiert nicht" @@ -4595,234 +4866,238 @@ msgstr "während der Wiederherstellung können keine temporären Tabellen erzeug 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:4338 commands/tablespace.c:1216 commands/variable.c:64 -#: utils/misc/guc.c:11617 utils/misc/guc.c:11695 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12065 utils/misc/guc.c:12167 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." -#: 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:2160 commands/tablecmds.c:6082 -#: commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12343 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6121 commands/tablecmds.c:16633 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17177 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" -#: catalog/objectaddress.c:1384 commands/matview.c:186 commands/tablecmds.c:261 -#: commands/tablecmds.c:16638 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17182 #, 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:6124 commands/tablecmds.c:16643 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17187 #, 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: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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 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 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "Publikationsschema »%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:2247 catalog/objectaddress.c:2331 #, 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:2265 +#: catalog/objectaddress.c:2272 #, 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:2258 catalog/objectaddress.c:2279 #, 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:318 +#: catalog/objectaddress.c:2533 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:1583 +#: catalog/objectaddress.c:2548 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:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "Berechtigung nur für Superuser" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "Berechtigung nur mit CREATEROLE-Privileg" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "unbekannter Objekttyp »%s«" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "Spalte %s von %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "Funktion %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "Typ %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "Typumwandlung von %s in %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "Sortierfolge %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "Constraint %s für %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "Constraint %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "Konversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "Vorgabewert für %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "Sprache %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "Large Object %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "Operator %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "Operatorklasse %s für Zugriffsmethode %s" -#: catalog/objectaddress.c:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "Zugriffsmethode %s" @@ -4831,7 +5106,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "Operator %d (%s, %s) von %s: %s" @@ -4840,221 +5115,231 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "Regel %s für %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "Trigger %s für %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "Schema %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "Statistikobjekt %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "Textsucheparser %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "Textsuchewörterbuch %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "Textsuchevorlage %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "Textsuchekonfiguration %s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "Datenbank %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "Tablespace %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "Fremddaten-Wrapper %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "Server %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "Benutzerabbildung für %s auf Server %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, 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:3727 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3801 #, 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:3737 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s" -#: catalog/objectaddress.c:3743 +#: catalog/objectaddress.c:3811 #, 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:3747 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s" -#: catalog/objectaddress.c:3753 +#: catalog/objectaddress.c:3821 #, 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:3757 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s" -#: catalog/objectaddress.c:3763 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "Vorgabeprivilegien für neue Schemas von Rolle %s" -#: catalog/objectaddress.c:3770 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "Vorgabeprivilegien von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "Vorgabeprivilegien von Rolle %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "Erweiterung %s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "Ereignistrigger %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "Parameter %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "Policy %s für %s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "Publikation %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "Publikation von Schema %s in Publikation %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "Publikation von %s in Publikation %s" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "Subskription %s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "Transformation %s für Sprache %s" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "Tabelle %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "Index %s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "Sequenz %s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "TOAST-Tabelle %s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "Sicht %s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "materialisierte Sicht %s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "zusammengesetzter Typ %s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "Fremdtabelle %s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "Relation %s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "Operatorfamilie %s für Zugriffsmethode %s" @@ -5096,7 +5381,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:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, 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" @@ -5111,7 +5396,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:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, 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" @@ -5126,12 +5411,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:190 catalog/pg_proc.c:224 +#: 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:203 catalog/pg_proc.c:232 +#: 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«" @@ -5146,7 +5431,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:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "kann Routinenart nicht ändern" @@ -5171,11 +5456,11 @@ 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: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 +#: 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 @@ -5197,42 +5482,92 @@ msgstr "Funktion %s muss VARIADIC ANY akzeptieren, um in dieser Aggregatfunktion msgid "function %s requires run-time type coercion" msgstr "Funktion %s erfordert Typumwandlung zur Laufzeit" -#: catalog/pg_cast.c:68 +#: catalog/pg_cast.c:68 +#, c-format +msgid "cast from type %s to type %s already exists" +msgstr "Typumwandlung von Typ %s in Typ %s existiert bereits" + +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "Diese Operation wird für Tabellen nicht unterstützt." + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "Diese Operation wird für Indexe nicht unterstützt." + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "Diese Operation wird für Sequenzen nicht unterstützt." + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "Diese Operation wird für TOAST-Tabellen nicht unterstützt." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "Diese Operation wird für Sichten nicht unterstützt." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "Diese Operation wird für materialisierte Sichten nicht unterstützt." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "Diese Operation wird für zusammengesetzte Typen nicht unterstützt." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "Diese Operation wird für Fremdtabellen nicht unterstützt." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "Diese Operation wird für partitionierte Tabellen nicht unterstützt." + +#: catalog/pg_class.c:47 #, c-format -msgid "cast from type %s to type %s already exists" -msgstr "Typumwandlung von Typ %s in Typ %s existiert bereits" +msgid "This operation is not supported for partitioned indexes." +msgstr "Diese Operation wird für partitionierte Indexe nicht unterstützt." -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "Sortierfolge »%s« existiert bereits, wird übersprungen" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, 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:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "Sortierfolge »%s« existiert bereits" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, 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:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "Constraint »%s« für Domäne %s existiert nicht" @@ -5247,27 +5582,27 @@ 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:218 commands/extension.c:3370 +#: catalog/pg_depend.c:222 commands/extension.c:3289 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s ist schon Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:225 catalog/pg_depend.c:276 commands/extension.c:3410 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s ist kein Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "Eine Erweiterung darf kein Objekt ersetzen, das ihr nicht gehört." -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Eine Erweiterung darf CREATE .. IF NOT EXISTS zum Überspringen der Erzeugung eines Objekts nur verwenden, wenn ihr das vorhandene Objekt schon gehört." -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, 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" @@ -5317,8 +5652,8 @@ msgstr "Partition »%s« kann nicht abgetrennt werden" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4455 -#: commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15489 #, 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 Abtrennoperation abzuschließen." @@ -5398,44 +5733,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:131 parser/parse_func.c:2235 +#: 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:375 +#: 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:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "»%s« ist eine Aggregatfunktion." -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "»%s« ist eine Funktion." -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "»%s« ist eine Prozedur." -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "»%s« ist eine Fensterfunktion." -#: catalog/pg_proc.c:413 +#: 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:414 catalog/pg_proc.c:444 +#: 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" @@ -5444,89 +5789,120 @@ msgstr "kann Rückgabetyp einer bestehenden Funktion nicht ändern" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: 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 +#: 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:445 +#: 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." -#: catalog/pg_proc.c:489 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "kann Name des Eingabeparameters »%s« nicht ändern" -#: catalog/pg_proc.c:516 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "kann Parametervorgabewerte einer bestehenden Funktion nicht entfernen" -#: catalog/pg_proc.c:542 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "kann Datentyp eines bestehenden Parametervorgabewerts nicht ändern" -#: catalog/pg_proc.c:752 +#: 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:850 +#: 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:865 +#: 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:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-Funktion »%s«" -#: catalog/pg_publication.c:60 +#: 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 "Nur Tabellen können Teil einer Publikationen sein." +msgid "cannot add relation \"%s\" to publication" +msgstr "Relation »%s« kann nicht zu Publikation hinzugefügt werden" -#: catalog/pg_publication.c:66 +#: catalog/pg_publication.c:73 #, c-format -msgid "\"%s\" is a system table" -msgstr "»%s« ist eine Systemtabelle" +msgid "This operation is not supported for system tables." +msgstr "Diese Operation wird für Systemtabellen nicht unterstützt." -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:81 #, c-format -msgid "System tables cannot be added to publications." -msgstr "Systemtabellen können nicht Teil einer Publikationen sein." +msgid "This operation is not supported for temporary tables." +msgstr "Diese Operation wird für temporäre Tabellen nicht unterstützt." -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:87 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "Tabelle »%s« kann nicht repliziert werden" +msgid "This operation is not supported for unlogged tables." +msgstr "Diese Operation wird für ungeloggte Tabellen nicht unterstützt." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "Temporäre und ungeloggte Tabellen können nicht repliziert werden." +msgid "cannot add schema \"%s\" to publication" +msgstr "Schema »%s« kann nicht zu Publikation hinzugefügt werden" -#: catalog/pg_publication.c:251 +#: catalog/pg_publication.c:103 +#, c-format +msgid "This operation is not supported for system schemas." +msgstr "Diese Operation wird für Systemschemas nicht unterstützt." + +#: catalog/pg_publication.c:111 +#, c-format +msgid "Temporary schemas cannot be replicated." +msgstr "Temporäre Schemas können nicht repliziert werden." + +#: 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:533 commands/publicationcmds.c:458 -#: commands/publicationcmds.c:786 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "Systemspalte »%s« kann nicht in der Publikationspaltenliste verwendet werden" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "generierte Spalte »%s« kann nicht in der Publikationsspaltenliste verwendet werden" + +#: catalog/pg_publication.c:528 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "doppelte Spalte »%s« in Publikationsspaltenliste" + +#: catalog/pg_publication.c:618 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "Schema »%s« ist schon Mitglied der Publikation »%s«" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "Publikation »%s« existiert nicht" -#: catalog/pg_shdepend.c:833 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5541,71 +5917,71 @@ msgstr[1] "" "\n" "und Objekte in %d anderen Datenbanken (Liste im Serverlog)" -#: catalog/pg_shdepend.c:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "Rolle %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "Tablespace %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "Datenbank %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "Eigentümer von %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "Privilegien für %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "Ziel von %s" -#: catalog/pg_shdepend.c:1263 +#: 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:1271 +#: 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:1382 +#: 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:1529 +#: 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:779 -#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "Subskription »%s« existiert nicht" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" 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«." @@ -5613,7 +5989,7 @@ 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." @@ -5644,7 +6020,7 @@ msgstr "interne Größe %d ist ungültig für Typen mit Wertübergabe" 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:328 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" @@ -5664,17 +6040,11 @@ msgstr "Fehler während der Erzeugung eines Multirange-Typs für Typ »%s«." 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:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, c-format msgid "invalid page in block %u of relation %s" msgstr "ungültige Seite in Block %u von Relation %s" -#: catalog/toasting.c:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 -#: commands/tablecmds.c:16498 -#, 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" @@ -5755,7 +6125,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:650 +#: 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" @@ -5770,12 +6140,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:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" @@ -5785,12 +6155,12 @@ msgstr "Server »%s« existiert bereits" msgid "language \"%s\" already exists" msgstr "Sprache »%s« existiert bereits" -#: commands/alter.c:96 commands/publicationcmds.c:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" @@ -5830,7 +6200,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" @@ -5850,7 +6220,7 @@ msgstr "Nur Superuser können Zugriffsmethoden anlegen." msgid "access method \"%s\" already exists" msgstr "Zugriffsmethode »%s« existiert bereits" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -5862,53 +6232,53 @@ 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:699 -#: parser/parse_clause.c:940 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:714 +#: 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:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, 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:1436 +#: commands/analyze.c:1418 #, 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:1534 +#: commands/analyze.c:1516 #, 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" @@ -5938,97 +6308,97 @@ msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die LISTEN, msgid "too many notifications in the NOTIFY queue" msgstr "zu viele Benachrichtigungen in NOTIFY-Schlange" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTIFY-Schlange ist %.0f%% voll" -#: commands/async.c:1618 +#: 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:1621 +#: 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:395 +#: 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:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14187 commands/tablecmds.c:16068 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "globaler Katalog kann nicht geclustert werden" -#: commands/cluster.c:399 +#: 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:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16078 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" -#: commands/cluster.c:479 +#: 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:491 +#: 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:505 +#: 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:529 +#: 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:902 +#: 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:908 +#: 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:939 +#: 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:943 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6042,97 +6412,124 @@ 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:389 commands/tablecmds.c:7812 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, 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 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROM kann nicht zusammen 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:227 +#: 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:285 +#: 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:296 +#: 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:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 #, c-format msgid "changing version from %s to %s" msgstr "Version wird von %s in %s geändert" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 #, c-format msgid "version has not changed" msgstr "Version hat sich nicht geändert" -#: commands/collationcmds.c:473 +#: 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:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "nur Superuser können Systemsortierfolgen importieren" -#: commands/collationcmds.c:559 commands/copyfrom.c:1506 commands/copyto.c:680 +#: commands/collationcmds.c:618 commands/copyfrom.c:1509 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:690 +#: 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:853 commands/dbcommands.c:1064 -#: commands/dbcommands.c:1177 commands/dbcommands.c:1367 -#: commands/dbcommands.c:1615 commands/dbcommands.c:1737 -#: commands/dbcommands.c:2177 utils/init/postinit.c:887 -#: utils/init/postinit.c:993 utils/init/postinit.c:1019 +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 +#: commands/dbcommands.c:1874 commands/dbcommands.c:2068 +#: commands/dbcommands.c:2310 commands/dbcommands.c:2405 +#: commands/dbcommands.c:2515 commands/dbcommands.c:3014 +#: utils/init/postinit.c:947 utils/init/postinit.c:1011 +#: utils/init/postinit.c:1083 #, 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:990 +#: commands/comment.c:101 #, 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" +msgid "cannot set comment on relation \"%s\"" +msgstr "Kommentar von Relation »%s« kann nicht gesetzt 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" @@ -6169,8 +6566,8 @@ msgstr "Kodierungskonversionsfunktion %s hat falsches Ergebnis für leere Eingab #: 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 "nur Superuser oder Mitglieder von pg_execute_server_program können COPY mit externen Programmen verwenden" +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 Rollen mit den Privilegien der Rolle pg_execute_server_program können COPY mit externen Programmen verwenden" #: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format @@ -6179,13 +6576,13 @@ msgstr "Jeder kann COPY mit STDOUT oder STDIN verwenden. Der Befehl \\copy in ps #: 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 "nur Superuser oder Mitglieder von pg_read_server_files können mit COPY aus einer Datei lesen" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "nur Superuser oder Rollen mit den Privilegien der Rolle 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" -msgstr "nur Superuser oder Mitglieder von pg_write_server_files können mit COPY in eine Datei schreiben" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgstr "nur Superuser oder Rollen mit den Privilegien der Rolle pg_write_server_files können mit COPY in eine Datei schreiben" #: commands/copy.c:188 #, c-format @@ -6197,490 +6594,520 @@ 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:377 +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "MERGE wird in COPY nicht unterstützt" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "»%s« kann nicht mit HEADER in COPY TO verwendet werden" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s erfordert einen Boole’schen Wert oder »match«" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY-Format »%s« nicht erkannt" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 -#: commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, 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:518 +#: commands/copy.c:553 #, 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:525 commands/dbcommands.c:254 commands/dbcommands.c:1563 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 #, c-format msgid "option \"%s\" not recognized" msgstr "Option »%s« nicht erkannt" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "DELIMITER kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "NULL kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:564 +#: commands/copy.c:599 #, 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:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPY-Trennzeichen kann nicht Newline oder Carriage Return sein" -#: commands/copy.c:577 +#: commands/copy.c:612 #, 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:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "DELIMITER für COPY darf nicht »%s« sein" -#: commands/copy.c:600 +#: commands/copy.c:635 #, 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:606 +#: commands/copy.c:641 #, 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:611 +#: commands/copy.c:646 #, 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:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "DELIMITER und QUOTE für COPY müssen verschieden sein" -#: commands/copy.c:622 +#: commands/copy.c:657 #, 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:627 +#: commands/copy.c:662 #, 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:633 +#: commands/copy.c:668 #, 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:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "FORCE_QUOTE ist nur bei COPY TO verfügbar" -#: commands/copy.c:643 +#: commands/copy.c:678 #, 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:647 +#: commands/copy.c:682 #, 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:653 +#: commands/copy.c:688 #, 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:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "FORCE_NULL ist nur bei COPY FROM verfügbar" -#: commands/copy.c:664 +#: commands/copy.c:699 #, 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:671 +#: commands/copy.c:706 #, 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:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "Spalte »%s« ist eine generierte Spalte" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Generierte Spalten können nicht in COPY verwendet werden." -#: commands/copy.c:749 commands/indexcmds.c:1859 commands/statscmds.c:245 -#: commands/tablecmds.c:2347 commands/tablecmds.c:3003 -#: commands/tablecmds.c:3496 parser/parse_relation.c:3642 -#: parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1826 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 #: 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:612 +#: commands/copyfrom.c:1270 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:635 +#: commands/copyfrom.c:1293 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:1340 utils/mb/mbutils.c:385 +#: commands/copyfrom.c:1346 utils/mb/mbutils.c:385 #, c-format msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "Standardumwandlung von Kodierung »%s« nach »%s« existiert nicht" -#: commands/copyfrom.c:1525 +#: commands/copyfrom.c:1528 #, 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:1538 commands/copyto.c:732 +#: commands/copyfrom.c:1541 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "»%s« ist ein Verzeichnis" -#: commands/copyfrom.c:1606 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1609 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:1621 commands/copyto.c:307 +#: commands/copyfrom.c:1624 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:359 +#: 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:1446 -#: commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "falsche Anzahl Felder in Kopfzeile: %d erhalten, %d erwartet" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "Spaltenname in Kopfzeile Feld %d stimmt nicht überein: NULL-Wert (»%s«) erhalten, »%s« erwartet" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "Spaltenname in Kopfzeile Feld %d stimmt nicht überein: »%s« erhalten, »%s« erwartet" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "zusätzliche Daten nach letzter erwarteter Spalte" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "fehlende Daten für Spalte »%s«" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "COPY-Daten nach EOF-Markierung empfangen" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "Feldanzahl in Zeile ist %d, erwartet wurden %d" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "ungequotetes Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Verwenden Sie »\\r«, um ein Carriage-Return-Zeichen darzustellen." -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, 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:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "ungequotetes Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Verwenden Sie »\\n«, um ein Newline-Zeichen darzustellen." -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, 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:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, 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:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "COPY-Ende-Markierung verfälscht" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "Quotes in CSV-Feld nicht abgeschlossen" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "unerwartetes EOF in COPY-Daten" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "ungültige Feldgröße" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, 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:451 +#: 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:465 +#: 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:469 +#: 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:474 +#: 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:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) wird nicht unterstützt" -#: commands/copyto.c:501 +#: 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:530 +#: 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:589 +#: 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:697 +#: 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:716 +#: 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:719 +#: 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." @@ -6695,313 +7122,393 @@ msgstr "zu viele Spaltennamen wurden angegeben" msgid "policies not yet implemented for this command" msgstr "Policys sind für diesen Befehl noch nicht implementiert" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION wird nicht mehr unterstützt" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Verwenden Sie stattdessen Tablespaces." -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, 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 "OIDs kleiner als %u sind für Systemobjekte reserviert" -#: commands/dbcommands.c:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 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:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 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:315 commands/dbcommands.c:1596 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "unbekannter Locale-Provider: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "ungültige Verbindungshöchstgrenze: %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "keine Berechtigung, um Datenbank zu erzeugen" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "Template-Datenbank »%s« existiert nicht" -#: commands/dbcommands.c:367 +#: commands/dbcommands.c:975 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "ungültige Datenbank »%s« kann nicht als Template verwendet werden" -#: commands/dbcommands.c:368 commands/dbcommands.c:1625 -#: utils/init/postinit.c:1002 +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 +#: utils/init/postinit.c:1026 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Verwenden Sie DROP DATABASE, um ungültige Datenbanken zu löschen." -#: commands/dbcommands.c:379 +#: commands/dbcommands.c:987 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "keine Berechtigung, um Datenbank »%s« zu kopieren" -#: commands/dbcommands.c:395 +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "ungültige Datenbankerzeugungsstrategie »%s«" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Gültige Strategien sind »wal_log« und »file_copy«." + +#: commands/dbcommands.c:1024 #, c-format msgid "invalid server encoding %d" msgstr "ungültige Serverkodierung %d" -#: commands/dbcommands.c:401 commands/dbcommands.c:406 +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 #, c-format msgid "invalid locale name: \"%s\"" msgstr "ungültiger Locale-Name: »%s«" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "Kodierung »%s« wird vom ICU-Provider nicht unterstützt" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU-Locale muss angegeben werden" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU-Locale kann nur angegeben werden, wenn der Locale-Provider ICU ist" + +#: commands/dbcommands.c:1082 #, 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:429 +#: commands/dbcommands.c:1085 #, 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:434 +#: commands/dbcommands.c:1090 #, 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:436 +#: commands/dbcommands.c:1092 #, 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:441 +#: commands/dbcommands.c:1097 #, 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:443 +#: commands/dbcommands.c:1099 #, 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:465 commands/dbcommands.c:1223 +#: commands/dbcommands.c:1104 +#, 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:1106 +#, 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:1115 +#, 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:1117 +#, 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:1140 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "Template-Datenbank »%s« hat eine Sortierfolgenversion, aber keine tatsächliche Sortierfolgenversion konnte ermittelt werden" + +#: commands/dbcommands.c:1145 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "Version von Sortierfolge für Template-Datenbank »%s« stimmt nicht überein" + +#: commands/dbcommands.c:1147 +#, c-format +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "Die Template-Datenbank wurde mit Sortierfolgenversion %s erzeugt, aber das Betriebssystem hat Version %s." + +#: commands/dbcommands.c:1150 +#, 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 "Bauen Sie alle Objekte in der Template-Datenbank, die die Standardsortierfolge verwenden, neu und führen Sie ALTER DATABASE %s REFRESH COLLATION VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." + +#: commands/dbcommands.c:1186 commands/dbcommands.c:1920 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global kann nicht als Standard-Tablespace verwendet werden" -#: commands/dbcommands.c:491 +#: commands/dbcommands.c:1212 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "kann neuen Standard-Tablespace »%s« nicht setzen" -#: commands/dbcommands.c:493 +#: commands/dbcommands.c:1214 #, 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:523 commands/dbcommands.c:1093 +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 #, c-format msgid "database \"%s\" already exists" msgstr "Datenbank »%s« existiert bereits" -#: commands/dbcommands.c:537 +#: commands/dbcommands.c:1258 #, 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:780 commands/dbcommands.c:795 +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "Datenbank-OID %u wird bereits von Datenbank »%s« verwendet" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "Datenverzeichnis mit der angegebenen OID %u existiert bereits" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "Kodierung »%s« stimmt nicht mit Locale »%s« überein" -#: commands/dbcommands.c:783 +#: commands/dbcommands.c:1460 #, 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:798 +#: commands/dbcommands.c:1475 #, 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:860 +#: commands/dbcommands.c:1556 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "Datenbank »%s« existiert nicht, wird übersprungen" -#: commands/dbcommands.c:884 +#: commands/dbcommands.c:1580 #, c-format msgid "cannot drop a template database" msgstr "Template-Datenbank kann nicht gelöscht werden" -#: commands/dbcommands.c:890 +#: commands/dbcommands.c:1586 #, c-format msgid "cannot drop the currently open database" msgstr "kann aktuell geöffnete Datenbank nicht löschen" -#: commands/dbcommands.c:903 +#: commands/dbcommands.c:1599 #, 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:905 +#: commands/dbcommands.c:1601 #, 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:919 +#: commands/dbcommands.c:1615 #, 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:921 +#: commands/dbcommands.c:1617 #, 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:942 commands/dbcommands.c:1115 -#: commands/dbcommands.c:1245 +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 +#: commands/dbcommands.c:1942 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "auf Datenbank »%s« wird von anderen Benutzern zugegriffen" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1772 #, c-format msgid "permission denied to rename database" msgstr "keine Berechtigung, um Datenbank umzubenennen" -#: commands/dbcommands.c:1104 +#: commands/dbcommands.c:1801 #, c-format msgid "current database cannot be renamed" msgstr "aktuelle Datenbank kann nicht umbenannt werden" -#: commands/dbcommands.c:1201 +#: commands/dbcommands.c:1898 #, 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:1304 +#: commands/dbcommands.c:2004 #, 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:1306 +#: commands/dbcommands.c:2006 #, 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:1431 commands/dbcommands.c:2015 -#: commands/dbcommands.c:2314 commands/dbcommands.c:2400 +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 +#: commands/dbcommands.c:3152 commands/dbcommands.c:3266 #, 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:1487 +#: commands/dbcommands.c:2194 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "unbekannte DROP-DATABASE-Option »%s«" -#: commands/dbcommands.c:1577 +#: commands/dbcommands.c:2272 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "Option »%s« kann nicht mit anderen Optionen angegeben werden" -#: commands/dbcommands.c:1624 +#: commands/dbcommands.c:2319 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "ungültige Datenbank »%s« kann nicht geändert werden" -#: commands/dbcommands.c:1641 +#: commands/dbcommands.c:2336 #, c-format msgid "cannot disallow connections for current database" msgstr "Verbindungen mit der aktuellen Datenbank können nicht verboten werden" -#: commands/dbcommands.c:1777 +#: commands/dbcommands.c:2555 #, c-format msgid "permission denied to change owner of database" msgstr "keine Berechtigung, um Eigentümer der Datenbank zu ändern" -#: commands/dbcommands.c:2121 +#: commands/dbcommands.c:2958 #, 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:2124 +#: commands/dbcommands.c:2961 #, 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:2129 storage/ipc/procarray.c:3895 +#: commands/dbcommands.c:2966 storage/ipc/procarray.c:3847 #, 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/dbcommands.c:2271 +#: commands/dbcommands.c:3108 #, c-format msgid "missing directory \"%s\"" msgstr "Verzeichnis »%s« fehlt" -#: commands/dbcommands.c:2330 commands/tablespace.c:188 -#: commands/tablespace.c:634 +#: commands/dbcommands.c:3168 commands/tablespace.c:190 +#: commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "konnte »stat« für Verzeichnis »%s« nicht ausführen: %m" -#: 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:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, 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 commands/define.c:225 commands/define.c:243 #, 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:327 #, c-format msgid "%s requires an integer value" msgstr "%s erfordert einen ganzzahligen Wert" -#: commands/define.c:242 +#: commands/define.c:272 #, 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:302 #, 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:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "ungültiges Argument für %s: »%s«" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 -#: utils/adt/ruleutils.c:2832 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2928 #, c-format msgid "\"%s\" is an aggregate function" msgstr "»%s« ist eine Aggregatfunktion" @@ -7011,19 +7518,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:455 commands/tablecmds.c:3580 -#: commands/tablecmds.c:3738 commands/tablecmds.c:3791 -#: commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16495 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, 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:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "Typ »%s« existiert nicht, wird übersprungen" @@ -7043,7 +7550,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:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "Statistikobjekt »%s« existiert nicht, wird übersprungen" @@ -7138,7 +7645,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:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Server »%s« existiert nicht, wird übersprungen" @@ -7215,12 +7722,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" @@ -7245,7 +7752,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:3032 +#: commands/extension.c:173 commands/extension.c:2954 #, c-format msgid "extension \"%s\" does not exist" msgstr "Erweiterung »%s« existiert nicht" @@ -7302,198 +7809,213 @@ 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 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "Erweiterung »%s« ist nicht verfügbar" + +#: commands/extension.c:503 +#, c-format +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 "Die Erweiterung muss zuerst auf dem System, auf dem PostgreSQL läuft, installiert werden." + +#: 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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, 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:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu erzeugen" -#: commands/extension.c:865 +#: 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:866 +#: 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:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu aktualisieren" -#: commands/extension.c:873 +#: 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:874 +#: 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:1003 +#: commands/extension.c:1018 #, c-format msgid "invalid character in extension owner: must not contain any of \"%s\"" msgstr "ungültiges Zeichen im Erweiterungseigentümer: darf keins aus »%s« enthalten" -#: commands/extension.c:1027 +#: commands/extension.c:1042 #, c-format msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" msgstr "ungültiges Zeichen in Schema von Erweiterung »%s«: darf keins aus »%s« enthalten" -#: commands/extension.c:1222 +#: commands/extension.c:1237 #, 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:1430 commands/extension.c:3093 +#: commands/extension.c:1445 commands/extension.c:3012 #, c-format msgid "version to install must be specified" msgstr "die zu installierende Version muss angegeben werden" -#: commands/extension.c:1467 +#: commands/extension.c:1482 #, 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:1501 +#: commands/extension.c:1516 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "Erweiterung »%s« muss in Schema »%s« installiert werden" -#: commands/extension.c:1661 +#: commands/extension.c:1676 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "zyklische Abhängigkeit zwischen Erweiterungen »%s« und »%s« entdeckt" -#: commands/extension.c:1666 +#: commands/extension.c:1681 #, c-format msgid "installing required extension \"%s\"" msgstr "installiere benötigte Erweiterung »%s«" -#: commands/extension.c:1689 +#: commands/extension.c:1704 #, c-format msgid "required extension \"%s\" is not installed" msgstr "benötigte Erweiterung »%s« ist nicht installiert" -#: commands/extension.c:1692 +#: commands/extension.c:1707 #, 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:1727 +#: commands/extension.c:1742 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "Erweiterung »%s« existiert bereits, wird übersprungen" -#: commands/extension.c:1734 +#: commands/extension.c:1749 #, c-format msgid "extension \"%s\" already exists" msgstr "Erweiterung »%s« existiert bereits" -#: commands/extension.c:1745 +#: commands/extension.c:1760 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "geschachteltes CREATE EXTENSION wird nicht unterstützt" -#: commands/extension.c:1918 +#: commands/extension.c:1924 #, 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:2479 +#: commands/extension.c:2401 #, 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:2491 +#: commands/extension.c:2413 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u bezieht sich nicht auf eine Tabelle" -#: commands/extension.c:2496 +#: commands/extension.c:2418 #, 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:2850 +#: commands/extension.c:2772 #, 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:2891 commands/extension.c:2951 +#: commands/extension.c:2813 commands/extension.c:2873 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "Erweiterung »%s« unterstützt SET SCHEMA nicht" -#: commands/extension.c:2953 +#: commands/extension.c:2875 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s ist nicht im Schema der Erweiterung (»%s«)" -#: commands/extension.c:3012 +#: commands/extension.c:2934 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "geschachteltes ALTER EXTENSION wird nicht unterstützt" -#: commands/extension.c:3104 +#: commands/extension.c:3023 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "Version »%s« von Erweiterung »%s« ist bereits installiert" -#: commands/extension.c:3316 +#: commands/extension.c:3235 #, 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:3382 +#: commands/extension.c:3301 #, 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:3476 +#: commands/extension.c:3395 #, c-format msgid "file \"%s\" is too large" msgstr "Datei »%s« ist zu groß" @@ -7523,77 +8045,77 @@ 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:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "Server »%s« existiert bereits, wird übersprungen" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, 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:1158 +#: commands/foreigncmds.c:1154 #, 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:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, 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:1383 +#: commands/foreigncmds.c:1379 #, 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:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "Fremddaten-Wrapper »%s« hat keinen Handler" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, 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:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "importiere Fremdtabelle »%s«" @@ -7698,263 +8220,263 @@ msgstr "Eingabeparameter hinter einem mit Vorgabewert müssen auch einen Vorgabe 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:612 commands/functioncmds.c:803 +#: 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:708 +#: 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:719 +#: 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:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST muss positiv sein" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWS muss positiv sein" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "kein Funktionskörper angegeben" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "doppelter Funktionskörper angegeben" -#: commands/functioncmds.c:899 +#: 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:941 +#: 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:967 commands/functioncmds.c:986 +#: 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:1014 +#: 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:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "keine Sprache angegeben" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 +#: 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:1129 commands/functioncmds.c:2132 +#: 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:1164 commands/functioncmds.c:1448 +#: 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:1215 +#: 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:1228 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "Ergebnistyp der Funktion muss angegeben werden" -#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 +#: 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:1569 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "Quelldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1575 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "Zieldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1599 +#: 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:1604 +#: 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:1629 +#: 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:1633 +#: 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:1637 +#: 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:1642 +#: 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:1647 +#: 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:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "Typumwandlungsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "Typumwandlungsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1667 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "Typumwandlungsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1693 +#: 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:1708 +#: 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:1723 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "zusammengesetzte Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1729 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "Enum-Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "Array-Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1752 +#: 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:1762 +#: 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:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "Transformationsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "Transformationsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1803 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "Transformationsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "Transformationsfunktion muss ein Argument haben" -#: commands/functioncmds.c:1811 +#: 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:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "Datentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "Datentyp %s ist eine Domäne" -#: commands/functioncmds.c:1896 +#: 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:1922 +#: 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:1951 +#: 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:2038 +#: 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:2062 +#: 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:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "kein Inline-Code angegeben" -#: commands/functioncmds.c:2163 +#: 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:2258 +#: 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" @@ -7971,299 +8493,303 @@ msgstr "mindestens eine Spalte muss angegeben werden" msgid "cannot use more than %d columns in an index" msgstr "Index kann nicht mehr als %d Spalten enthalten" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, 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:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "kann Index für partitionierte Tabelle »%s« nicht nebenläufig erzeugen" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "kann keinen Exclusion-Constraint für partitionierte Tabelle »%s« erzeugen" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format 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:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "für partitionierte Relationen kann kein Standard-Tablespace angegeben werden" -#: commands/indexcmds.c:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, 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" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "ersetze Zugriffsmethode »gist« für obsolete Methode »rtree«" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "Zugriffsmethode »%s« unterstützt keine Unique Indexe" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "Zugriffsmethode »%s« unterstützt keine eingeschlossenen Spalten" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "Zugriffsmethode »%s« unterstützt keine mehrspaltigen Indexe" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "Zugriffsmethode »%s« unterstützt keine Exclusion-Constraints" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, 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:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "nicht unterstützter %s-Constraint mit Partitionierungsschlüsseldefinition" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, 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:1046 +#: commands/indexcmds.c:1040 #, 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:1047 +#: commands/indexcmds.c:1041 #, 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:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1060 commands/indexcmds.c:1079 #, c-format msgid "index creation on system columns is not supported" msgstr "Indexerzeugung für Systemspalten wird nicht unterstützt" -#: commands/indexcmds.c:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1279 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:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1281 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:1776 +#: commands/indexcmds.c:1743 #, 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:1854 parser/parse_utilcmd.c:2526 -#: parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1821 parser/parse_utilcmd.c:2529 +#: parser/parse_utilcmd.c:2664 #, 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:1878 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "in eingeschlossenen Spalten werden keine Ausdrücke unterstützt" -#: commands/indexcmds.c:1919 +#: commands/indexcmds.c:1886 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "Funktionen im Indexausdruck müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1934 +#: commands/indexcmds.c:1901 #, c-format msgid "including column does not support a collation" msgstr "inkludierte Spalte unterstützt keine Sortierfolge" -#: commands/indexcmds.c:1938 +#: commands/indexcmds.c:1905 #, c-format msgid "including column does not support an operator class" msgstr "inkludierte Spalte unterstützt keine Operatorklasse" -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1909 #, c-format msgid "including column does not support ASC/DESC options" msgstr "inkludierte Spalte unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1913 #, 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:1987 +#: commands/indexcmds.c:1954 #, 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:1995 commands/tablecmds.c:16964 commands/typecmds.c:810 -#: parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 -#: utils/adt/misc.c:628 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17520 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 +#: 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:2060 +#: commands/indexcmds.c:2027 #, c-format msgid "operator %s is not commutative" msgstr "Operator %s ist nicht kommutativ" -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2029 #, 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:2088 +#: commands/indexcmds.c:2055 #, 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:2091 +#: commands/indexcmds.c:2058 #, 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:2126 +#: commands/indexcmds.c:2093 #, 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:2131 +#: commands/indexcmds.c:2098 #, 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:2177 commands/tablecmds.c:16989 -#: commands/tablecmds.c:16995 commands/typecmds.c:2317 +#: commands/indexcmds.c:2144 commands/tablecmds.c:17545 +#: commands/tablecmds.c:17551 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:2179 +#: commands/indexcmds.c:2146 #, 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:2208 commands/indexcmds.c:2216 +#: commands/indexcmds.c:2175 commands/indexcmds.c:2183 #: 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:2230 commands/typecmds.c:2305 +#: commands/indexcmds.c:2197 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:2320 +#: commands/indexcmds.c:2287 #, 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:2648 +#: commands/indexcmds.c:2615 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" -#: commands/indexcmds.c:2872 +#: commands/indexcmds.c:2839 #, 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:2886 +#: commands/indexcmds.c:2853 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2926 commands/indexcmds.c:3433 -#: commands/indexcmds.c:3561 +#: commands/indexcmds.c:2893 commands/indexcmds.c:3397 +#: commands/indexcmds.c:3525 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2949 +#: commands/indexcmds.c:2916 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:3037 +#: commands/indexcmds.c:3004 #, 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:3070 +#: commands/indexcmds.c:3037 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3083 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:3120 +#: commands/indexcmds.c:3086 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3313 commands/indexcmds.c:4169 +#: commands/indexcmds.c:3277 commands/indexcmds.c:4133 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3465 commands/indexcmds.c:3517 +#: commands/indexcmds.c:3429 commands/indexcmds.c:3481 #, 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:3471 +#: commands/indexcmds.c:3435 #, 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:3626 +#: commands/indexcmds.c:3590 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3647 +#: commands/indexcmds.c:3611 #, 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:4150 commands/indexcmds.c:4162 +#: commands/indexcmds.c:4114 commands/indexcmds.c:4126 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4116 commands/indexcmds.c:4135 +#, 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: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:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "Optionen %s und %s können nicht zusammen verwendet werden" @@ -8278,12 +8804,12 @@ msgstr "kann materialisierte Sicht »%s« nicht nebenläufig auffrischen" 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" @@ -8560,13 +9086,13 @@ 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:89 commands/policy.c:382 commands/statscmds.c:151 -#: commands/tablecmds.c:1585 commands/tablecmds.c:2165 -#: commands/tablecmds.c:3390 commands/tablecmds.c:6064 -#: commands/tablecmds.c:8989 commands/tablecmds.c:16554 -#: commands/tablecmds.c:16589 commands/trigger.c:313 commands/trigger.c:1289 -#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9148 commands/tablecmds.c:17098 +#: commands/tablecmds.c:17133 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "keine Berechtigung: »%s« ist ein Systemkatalog" @@ -8617,52 +9143,42 @@ 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:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: executor/execCurrent.c:70 utils/adt/xml.c:2603 utils/adt/xml.c:2773 #, 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:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "konnte Datentyp von Parameter $%d nicht ermitteln" - -#: commands/prepare.c:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "Utility-Anweisungen können nicht vorbereitet werden" - -#: commands/prepare.c:264 commands/prepare.c:269 +#: 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:329 +#: 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:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "%d Parameter erwartet aber %d erhalten." -#: commands/prepare.c:364 +#: 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:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "vorbereitete Anweisung »%s« existiert bereits" -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "vorbereitete Anweisung »%s« existiert nicht" @@ -8672,61 +9188,192 @@ 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:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1222 +#: postmaster/postmaster.c:1321 utils/init/miscinit.c:1659 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "ungültige Listensyntax für »publish«-Option" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "ungültige Listensyntax für Parameter »%s«" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "unbekannter »publish«-Wert: »%s«" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "unbekannter Wert für Publikationsoption »%s«: »%s«" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "unbekannter Publikationsparameter: »%s«" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "kein Schema für CURRENT_SCHEMA ausgewählt" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "Systemspalten sind nicht erlaubt." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "Benutzerdefinierte Operatoren sind nicht erlaubt." + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "Nur Spalten, Konstanten, eingebaute Operatoren, eingebaute Datentypen, eingebaute Sortierfolgen und eingebaute Funktionen, die »immutable« sind, sind erlaubt." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "Benutzerdefinierte Typen sind nicht erlaubt." + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Benutzerdefinierte Funktionen oder eingebaute Funktionen, die nicht »immutable« sind, sind nicht erlaubt." + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "Benutzerdefinierte Sortierfolgen sind nicht erlaubt." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "ungültiger WHERE-Ausdruck für Publikation" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "Publikations-WHERE-Ausdruck kann nicht für Relation »%s« verwendet werden" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "WHERE-Klausel kann nicht für eine partitionierte Tabelle verwendet werden, wenn %s falsch ist." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "für Relation »%s.%s« in Publikation »%s« kann keine Spaltenliste verwendet werden" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "Spaltenlisten können nicht in Publikationen, die FOR-TABLES-IN-SCHEMA-Elemente enthalten, angegeben werden." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "Spaltenlisten können nicht für partitionierte Tabellen angegeben werden, wenn %s falsch ist." + +#: commands/publicationcmds.c:760 #, 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:250 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "nur Superuser können eine Publikation FOR TABLES IN SCHEMA erzeugen" + +#: commands/publicationcmds.c:867 #, 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:251 +#: commands/publicationcmds.c:868 #, c-format -msgid "Set wal_level to logical before creating subscriptions." +msgid "Set wal_level to \"logical\" before creating subscriptions." msgstr "Setzen Sie wal_level auf »logical« bevor Sie Subskriptionen erzeugen." -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "Parameter »%s« kann für Publikation »%s« nicht auf falsch gesetzt werden" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "Die Publikation enthält eine WHERE-Klausel für die partitionierte Tabelle »%s«, was nicht erlaubt ist, wenn »%s« falsch ist." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "Die Publikation enthält eine Spaltenliste für die partitionierte Tabelle »%s«, was nicht erlaubt ist, wenn »%s« falsch ist." + +#: commands/publicationcmds.c:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "Schema kann nicht zu Publikation »%s« hinzugefügt werden" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "Schemas können nicht hinzugefügt werden, wenn Tabellen, die eine Spaltenliste angeben, schon Teil der Publikation sind." + +#: commands/publicationcmds.c:1348 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "nur Superuser können Schemas hinzufügen oder setzen" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "Publikation »%s« ist als FOR ALL TABLES definiert" -#: commands/publicationcmds.c:378 +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "In einer FOR-ALL-TABLES-Publikation können keine Schemas hinzugefügt oder entfernt werden." + +#: commands/publicationcmds.c:1367 #, 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:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "widersprüchliche oder überflüssige WHERE-Klauseln für Tabelle »%s«" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "widersprüchliche oder überflüssige Spaltenlisten für Tabelle »%s«" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "in ALTER PUBLICATION ... DROP darf keine Spaltenliste angegeben werden" + +#: commands/publicationcmds.c:1814 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "Relation »%s« ist nicht Teil der Publikation" -#: commands/publicationcmds.c:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "WHERE-Klausel kann nicht verwendet werden, wenn eine Tabelle aus einer Publikation entfernt wird" + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "Tabellen von Schema »%s« sind nicht Teil der Publikation" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, 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:752 +#: commands/publicationcmds.c:1926 #, 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/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "Der Eigentümer einer FOR-TABLES-IN-SCHEMA-Publikation muss ein Superuser sein." + #: commands/schemacmds.c:108 commands/schemacmds.c:288 #, c-format msgid "unacceptable schema name \"%s\"" @@ -8742,578 +9389,643 @@ 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 +#: commands/seclabel.c:193 #, c-format -msgid "unlogged sequences are not supported" -msgstr "ungeloggte Sequenzen werden nicht unterstützt" +msgid "cannot set security label on relation \"%s\"" +msgstr "Security-Label für Relation »%s« kann nicht gesetzt werden" -#: commands/sequence.c:717 +#: commands/sequence.c:755 #, 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:740 +#: commands/sequence.c:774 #, 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:858 +#: commands/sequence.c:892 #, 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:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval ist in dieser Sitzung noch nicht definiert" -#: commands/sequence.c:971 +#: commands/sequence.c:997 #, 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:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "ungültige Sequenzoption SEQUENCE NAME" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, 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:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "Sequenztyp muss smallint, integer oder bigint sein" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT darf nicht null sein" -#: commands/sequence.c:1481 +#: commands/sequence.c:1474 #, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1518 +#: commands/sequence.c:1506 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MINVALUE (%s) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1532 +#: commands/sequence.c:1514 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s) muss kleiner als MAXVALUE (%s) sein" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld) muss kleiner als MAXVALUE (%lld) sein" -#: commands/sequence.c:1559 +#: commands/sequence.c:1535 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "START-Wert (%s) kann nicht kleiner als MINVALUE (%s) sein" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "START-Wert (%lld) kann nicht kleiner als MINVALUE (%lld) sein" -#: commands/sequence.c:1571 +#: commands/sequence.c:1541 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "START-Wert (%s) kann nicht größer als MAXVALUE (%s) sein" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "START-Wert (%lld) kann nicht größer als MAXVALUE (%lld) sein" -#: commands/sequence.c:1601 +#: commands/sequence.c:1565 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "RESTART-Wert (%s) kann nicht kleiner als MINVALUE (%s) sein" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "RESTART-Wert (%lld) kann nicht kleiner als MINVALUE (%lld) sein" -#: commands/sequence.c:1613 +#: commands/sequence.c:1571 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "RESTART-Wert (%s) kann nicht größer als MAXVALUE (%s) sein" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "RESTART-Wert (%lld) kann nicht größer als MAXVALUE (%lld) sein" -#: commands/sequence.c:1628 +#: commands/sequence.c:1582 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) muss größer als null sein" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) muss größer als null sein" -#: commands/sequence.c:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "ungültige OWNED BY Option" -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, 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:1691 +#: commands/sequence.c:1644 #, 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" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "Sequenz kann nicht mit Relation »%s« verknüpft werden" -#: commands/sequence.c:1698 +#: commands/sequence.c:1652 #, 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:1702 +#: commands/sequence.c:1656 #, 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:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 -#: commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13878 +#: commands/tablecmds.c:16515 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, 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:139 +#: commands/statscmds.c:136 #, c-format -msgid "relation \"%s\" is not a table, foreign table, or materialized view" -msgstr "Relation »%s« ist keine Tabelle, Fremdtabelle oder materialisierte Sicht" +msgid "cannot define statistics for relation \"%s\"" +msgstr "für Relation »%s« können keine Statistiken definiert werden" -#: commands/statscmds.c:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "Statistikobjekt »%s« existiert bereits, wird übersprungen" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "Statistikobjekt »%s« existiert bereits" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "Statistiken können nicht mehr als %d Spalten enthalten" -#: commands/statscmds.c:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "Statistikerzeugung für Systemspalten wird nicht unterstützt" -#: commands/statscmds.c:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, 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:326 +#: commands/statscmds.c:325 #, 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:347 +#: commands/statscmds.c:346 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "wenn Statistiken für einen einzelnen Ausdruck gebaut werden, kann die Statistikart nicht angegeben werden" -#: commands/statscmds.c:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "unbekannte Statistikart »%s«" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "erweiterte Statistiken benötigen mindestens 2 Spalten" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "doppelter Spaltenname in Statistikdefinition" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8116 #, c-format msgid "statistics target %d is too low" msgstr "Statistikziel %d ist zu niedrig" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8124 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "Statistikobjekt »%s.%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:223 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "unbekannter Subskriptionsparameter: »%s«" +#: commands/subscriptioncmds.c:289 +#, c-format +msgid "invalid WAL location (LSN): %s" +msgstr "ungültige WAL-Position (LSN): %s" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 -#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 -#: commands/subscriptioncmds.c:274 +#: 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:281 commands/subscriptioncmds.c:287 +#: 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:380 +#: commands/subscriptioncmds.c:433 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "konnte Liste der Publikationen nicht vom Publikationsserver empfangen: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "Publikation %s existiert auf dem Publikationsserver nicht" +msgstr[1] "Publikationen %s existieren auf dem Publikationsserver nicht" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "nur Superuser können Subskriptionen erzeugen" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 -#: replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1247 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, 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:529 +#: commands/subscriptioncmds.c:730 #, 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:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "für eine aktivierte Subskription kann nicht %s gesetzt werden" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, 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:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, 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:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION mit »refresh« und »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" + +#: commands/subscriptioncmds.c:1140 +#, c-format +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 mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +msgid "Use %s instead." +msgstr "Verwenden Sie stattdessen %s." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Verwenden Sie %s mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1218 #, 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:1092 +#: commands/subscriptioncmds.c:1243 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH mit »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" + +#: commands/subscriptioncmds.c:1244 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Verwenden Sie ALTER SUBSCRIPTION ... REFRESH mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1263 +#, c-format +msgid "must be superuser to skip transaction" +msgstr "nur Superuser können eine Transaktion überspringen" + +#: commands/subscriptioncmds.c:1283 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "zu überspringende WAL-Position (LSN %X/%X) muss größer als Origin-LSN %X/%X sein" + +#: commands/subscriptioncmds.c:1363 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "Subskription »%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:1344 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« auf dem Publikationsserver wurde gelöscht" -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 #, 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:1395 +#: commands/subscriptioncmds.c:1672 #, 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:1397 +#: commands/subscriptioncmds.c:1674 #, 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:1513 +#: commands/subscriptioncmds.c:1788 #, 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:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:819 +#: replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "für Tabelle »%s.%s« können nicht verschiedene Spaltenlisten für verschiedene Publikationen verwendet werden" + +#: commands/subscriptioncmds.c:1860 #, 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:1581 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Verwenden Sie %s, um die Subskription zu deaktivieren, und dann %s, um sie vom Slot zu trennen." -#: commands/subscriptioncmds.c:1612 +#: commands/subscriptioncmds.c:1894 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:1656 +#: commands/subscriptioncmds.c:1938 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Publikation »%s« ist bereits in Subskription »%s«" -#: commands/subscriptioncmds.c:1670 +#: commands/subscriptioncmds.c:1952 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Publikation »%s« ist nicht in Subskription »%s«" -#: commands/subscriptioncmds.c:1681 +#: commands/subscriptioncmds.c:1963 #, c-format 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:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "Tabelle »%s« existiert nicht" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, 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:248 commands/tablecmds.c:290 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:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "Sequenz »%s« existiert nicht" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "Sequenz »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 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:257 #, c-format msgid "view \"%s\" does not exist" msgstr "Sicht »%s« existiert nicht" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "Sicht »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 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:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "materialisierte Sicht »%s« existiert nicht" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, 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:266 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:18449 -#: parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19027 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "Index »%s« existiert nicht" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, 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:272 commands/tablecmds.c:296 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:277 #, c-format msgid "\"%s\" is not a type" msgstr "»%s« ist kein Typ" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 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:13196 -#: commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13717 +#: commands/tablecmds.c:16218 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "Fremdtabelle »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 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:670 +#: commands/tablecmds.c:697 #, 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:701 +#: commands/tablecmds.c:728 #, 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:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15025 #, 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:922 +#: commands/tablecmds.c:949 #, 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:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "»%s« ist nicht partitioniert" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "Partitionierung kann nicht mehr als %d Spalten verwenden" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "kann keine Fremdpartition der partitionierten Tabelle »%s« erzeugen" -#: commands/tablecmds.c:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, 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:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY unterstützt kein CASCADE" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "kann partitionierten Index »%s« nicht nebenläufig löschen" -#: commands/tablecmds.c:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "kann nicht nur eine partitionierte Tabelle leeren" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, 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:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "Truncate-Vorgang leert ebenfalls Tabelle »%s«" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht leeren" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14922 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "von Partition »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 -#: parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2633 #, 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:2455 +#: commands/tablecmds.c:2487 #, 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:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14901 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14909 #, 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:2528 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "geerbte Definitionen von Spalte »%s« werden zusammengeführt" -#: commands/tablecmds.c:2536 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "geerbte Spalte »%s« hat Typkonflikt" -#: commands/tablecmds.c:2538 commands/tablecmds.c:2561 -#: commands/tablecmds.c:2578 commands/tablecmds.c:2834 -#: commands/tablecmds.c:2864 commands/tablecmds.c:2878 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 #: 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 @@ -9324,1722 +10036,1733 @@ msgstr "geerbte Spalte »%s« hat Typkonflikt" msgid "%s versus %s" msgstr "%s gegen %s" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "geerbte Spalte »%s« hat Sortierfolgenkonflikt" -#: commands/tablecmds.c:2549 commands/tablecmds.c:2846 -#: commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "»%s« gegen »%s«" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, 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:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "für Spalte »%s« besteht ein Komprimierungsmethodenkonflikt" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "geerbte Spalte »%s« hat einen Generierungskonflikt" -#: commands/tablecmds.c:2685 commands/tablecmds.c:2740 -#: commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 -#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12441 parser/parse_utilcmd.c:1302 +#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 +#: parser/parse_utilcmd.c:1862 #, c-format msgid "cannot convert whole-row table reference" msgstr "kann Verweis auf ganze Zeile der Tabelle nicht umwandeln" -#: commands/tablecmds.c:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, 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:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, 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:2820 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "Spalte »%s« wird mit geerbter Definition zusammengeführt" -#: commands/tablecmds.c:2824 +#: commands/tablecmds.c:2856 #, 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:2825 +#: commands/tablecmds.c:2857 #, 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:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "für Spalte »%s« besteht ein Typkonflikt" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, 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:2903 +#: commands/tablecmds.c:2935 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "abgeleitete Spalte »%s« gibt einen Generierungsausdruck an" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:2937 #, 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:2909 +#: commands/tablecmds.c:2941 #, 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:2914 +#: commands/tablecmds.c:2946 #, 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:3023 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "Spalte »%s« erbt widersprüchliche Generierungsausdrücke" -#: commands/tablecmds.c:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "Spalte »%s« erbt widersprüchliche Vorgabewerte" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, 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:3076 +#: commands/tablecmds.c:3108 #, 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:3289 +#: commands/tablecmds.c:3321 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht verschoben werden" -#: commands/tablecmds.c:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "Spalte einer getypten Tabelle kann nicht umbenannt werden" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3410 #, 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" +msgid "cannot rename columns of relation \"%s\"" +msgstr "Spalten von Relation »%s« können nicht umbenannt werden" -#: commands/tablecmds.c:3472 +#: commands/tablecmds.c:3505 #, 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:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "Systemspalte »%s« kann nicht umbenannt werden" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht umbenennen" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, 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:3678 +#: commands/tablecmds.c:3711 #, 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:3976 +#: commands/tablecmds.c:4008 #, 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:3985 +#: commands/tablecmds.c:4017 #, 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:4453 +#: commands/tablecmds.c:4486 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "kann Partition »%s« mit einer unvollständigen Abtrennoperation nicht ändern" -#: commands/tablecmds.c:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "Persistenzeinstellung kann nicht zweimal geändert werden" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "Zugriffsmethode einer partitionierten Tabelle kann nicht geändert werden" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "mehrere SET ACCESS METHOD Unterbefehle sind ungültig" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht neu geschrieben werden" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, 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:5437 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht neu schreiben" -#: commands/tablecmds.c:5898 +#: commands/tablecmds.c:5986 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "Spalte »%s« von Relation »%s« enthält NULL-Werte" -#: commands/tablecmds.c:5915 +#: commands/tablecmds.c:6003 #, 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:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, 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:5940 +#: commands/tablecmds.c:6028 #, 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:6088 commands/trigger.c:1283 commands/trigger.c:1389 -#, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "»%s« ist keine Tabelle, Sicht oder Fremdtabelle" - -#: commands/tablecmds.c:6091 -#, 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:6097 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht noch Index" - -#: commands/tablecmds.c:6100 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or partitioned index" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht, Index noch partitionierter Index" - -#: commands/tablecmds.c:6103 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" -msgstr "»%s« ist weder Tabelle, materialisierte Sicht, Index, partitionierter Index noch Fremdtabelle" - -#: commands/tablecmds.c:6106 -#, 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:6109 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "»%s« ist keine Tabelle oder Fremdtabelle" - -#: commands/tablecmds.c:6112 -#, 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:6115 -#, 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:6118 -#, c-format -msgid "\"%s\" is not a table or partitioned index" -msgstr "»%s« ist keine Tabelle und kein partitionierter Index" - -#: commands/tablecmds.c:6128 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "»%s« hat den falschen Typ" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "ALTER-Aktion %s kann nicht mit Relation »%s« ausgeführt werden" -#: commands/tablecmds.c:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, 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:6386 +#: commands/tablecmds.c:6564 #, 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:6393 +#: commands/tablecmds.c:6571 #, 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:6449 +#: commands/tablecmds.c:6627 #, 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:6451 +#: commands/tablecmds.c:6629 #, 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:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15152 #, 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:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15159 #, 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:6626 +#: commands/tablecmds.c:6804 #, 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:6669 +#: commands/tablecmds.c:6851 #, 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:6912 +#: commands/tablecmds.c:7095 #, 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:6990 +#: commands/tablecmds.c:7173 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "Spalte »%s« von Relation »%s« existiert bereits, wird übersprungen" -#: commands/tablecmds.c:6997 +#: commands/tablecmds.c:7180 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7246 commands/tablecmds.c:12080 #, 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:7064 commands/tablecmds.c:7381 -#: commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7247 commands/tablecmds.c:7564 +#: commands/tablecmds.c:8561 commands/tablecmds.c:12081 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 -#: commands/tablecmds.c:7449 commands/tablecmds.c:7563 -#: commands/tablecmds.c:7657 commands/tablecmds.c:7716 -#: commands/tablecmds.c:7834 commands/tablecmds.c:8000 -#: commands/tablecmds.c:8070 commands/tablecmds.c:8226 -#: commands/tablecmds.c:11735 commands/tablecmds.c:13219 -#: commands/tablecmds.c:15765 +#: commands/tablecmds.c:7284 commands/tablecmds.c:7490 +#: commands/tablecmds.c:7632 commands/tablecmds.c:7746 +#: commands/tablecmds.c:7840 commands/tablecmds.c:7899 +#: commands/tablecmds.c:8018 commands/tablecmds.c:8157 +#: commands/tablecmds.c:8227 commands/tablecmds.c:8383 +#: commands/tablecmds.c:12235 commands/tablecmds.c:13740 +#: commands/tablecmds.c:16309 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7290 commands/tablecmds.c:7638 #, 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:7150 +#: commands/tablecmds.c:7333 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Spalte »%s« ist in einem Primärschlüssel" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7338 #, 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:7178 +#: commands/tablecmds.c:7361 #, 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:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7561 commands/tablecmds.c:9044 #, 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:7379 +#: commands/tablecmds.c:7562 #, 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:7457 +#: commands/tablecmds.c:7640 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7462 +#: commands/tablecmds.c:7645 #, 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:7465 +#: commands/tablecmds.c:7648 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." -#: commands/tablecmds.c:7574 +#: commands/tablecmds.c:7757 #, 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:7580 +#: commands/tablecmds.c:7763 #, 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:7586 +#: commands/tablecmds.c:7769 #, 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:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7846 commands/tablecmds.c:7907 #, 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:7729 +#: commands/tablecmds.c:7912 #, 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:7782 +#: commands/tablecmds.c:7965 #, 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:7804 +#: commands/tablecmds.c:7987 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Generierungsausdruck von vererbter Spalte kann nicht gelöscht werden" -#: commands/tablecmds.c:7842 +#: commands/tablecmds.c:8026 #, 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:7847 +#: commands/tablecmds.c:8031 #, 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:7947 +#: commands/tablecmds.c:8104 #, 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:7990 +#: commands/tablecmds.c:8147 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Spalte Nummer %d von Relation »%s« existiert nicht" -#: commands/tablecmds.c:8009 +#: commands/tablecmds.c:8166 #, 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:8014 +#: commands/tablecmds.c:8171 #, 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:8016 +#: commands/tablecmds.c:8173 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändern Sie stattdessen die Statistiken für die Tabellenspalte." -#: commands/tablecmds.c:8206 +#: commands/tablecmds.c:8363 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8395 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" -#: commands/tablecmds.c:8283 +#: commands/tablecmds.c:8440 #, c-format msgid "cannot drop column from typed table" msgstr "aus einer getypten Tabelle können keine Spalten gelöscht werden" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8499 #, 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:8355 +#: commands/tablecmds.c:8512 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8522 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8535 #, 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:8403 +#: commands/tablecmds.c:8560 #, 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:8607 +#: commands/tablecmds.c:8764 #, 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:8632 +#: commands/tablecmds.c:8789 #, 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:8967 +#: commands/tablecmds.c:9126 #, 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:8973 +#: commands/tablecmds.c:9132 #, 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:8976 +#: commands/tablecmds.c:9135 #, 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:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9142 commands/tablecmds.c:9608 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle" -#: commands/tablecmds.c:9006 +#: commands/tablecmds.c:9165 #, 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:9013 +#: commands/tablecmds.c:9172 #, 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:9019 +#: commands/tablecmds.c:9178 #, 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:9023 +#: commands/tablecmds.c:9182 #, 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:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9256 commands/tablecmds.c:9262 #, 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:9111 +#: commands/tablecmds.c:9278 #, 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:9218 +#: commands/tablecmds.c:9385 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Fremdschlüssel-Constraint »%s« kann nicht implementiert werden" -#: commands/tablecmds.c:9220 +#: commands/tablecmds.c:9387 #, 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:9583 commands/tablecmds.c:9996 -#: parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9544 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "Spalte »%s«, auf die in der ON-DELETE-SET-Aktion verwiesen wird, muss Teil des Fremdschlüssels sein" + +#: commands/tablecmds.c:9817 commands/tablecmds.c:10285 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, 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:10373 commands/tablecmds.c:10651 -#: commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10837 commands/tablecmds.c:11115 +#: commands/tablecmds.c:12037 commands/tablecmds.c:12112 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:10380 +#: commands/tablecmds.c:10844 #, 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:10418 +#: commands/tablecmds.c:10882 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:10421 +#: commands/tablecmds.c:10885 #, 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:10423 +#: commands/tablecmds.c:10887 #, 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:10659 +#: commands/tablecmds.c:11123 #, 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:10737 +#: commands/tablecmds.c:11201 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:10827 +#: commands/tablecmds.c:11291 #, 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:10833 +#: commands/tablecmds.c:11297 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11301 #, 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:10902 +#: commands/tablecmds.c:11367 #, 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:10919 +#: commands/tablecmds.c:11384 #, 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:10984 +#: commands/tablecmds.c:11453 #, 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:11078 +#: commands/tablecmds.c:11547 #, 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:11083 +#: commands/tablecmds.c:11552 #, 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:11493 +#: commands/tablecmds.c:11993 #, 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:11543 +#: commands/tablecmds.c:12043 #, 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:11719 +#: commands/tablecmds.c:12219 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:11746 +#: commands/tablecmds.c:12246 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12255 #, 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:11805 +#: commands/tablecmds.c:12305 #, 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:11808 +#: commands/tablecmds.c:12308 #, 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:11812 +#: commands/tablecmds.c:12312 #, 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:11815 +#: commands/tablecmds.c:12315 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:11914 +#: commands/tablecmds.c:12414 #, 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:11942 +#: commands/tablecmds.c:12442 #, 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:11953 +#: commands/tablecmds.c:12453 #, 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:12078 +#: commands/tablecmds.c:12578 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12616 #, 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:12121 +#: commands/tablecmds.c:12621 #, 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:12199 -#, 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:12200 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." - -#: commands/tablecmds.c:12221 +#: commands/tablecmds.c:12702 #, 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:12222 commands/tablecmds.c:12241 -#: commands/tablecmds.c:12259 +#: commands/tablecmds.c:12703 commands/tablecmds.c:12722 +#: commands/tablecmds.c:12740 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12721 #, 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:12258 +#: commands/tablecmds.c:12739 +#, 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:12770 +#, 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:12771 #, 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" +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:13848 commands/tablecmds.c:13860 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13850 commands/tablecmds.c:13862 #, 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:13355 +#: commands/tablecmds.c:13876 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:13369 commands/tablecmds.c:16665 +#: commands/tablecmds.c:13890 commands/tablecmds.c:17209 +#: commands/tablecmds.c:17228 #, c-format msgid "Use ALTER TYPE instead." msgstr "Verwenden Sie stattdessen ALTER TYPE." -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13899 #, 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:13717 +#: commands/tablecmds.c:14261 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14338 #, 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" +msgid "cannot set options for relation \"%s\"" +msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:13827 commands/view.c:505 +#: commands/tablecmds.c:14372 commands/view.c:521 #, 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:14079 +#: commands/tablecmds.c:14622 #, 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:14091 +#: commands/tablecmds.c:14634 #, 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:14183 +#: commands/tablecmds.c:14726 #, 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:14199 +#: commands/tablecmds.c:14742 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14860 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14865 commands/tablecmds.c:15421 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14870 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14372 +#: commands/tablecmds.c:14916 #, 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:14385 +#: commands/tablecmds.c:14929 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17309 +#: commands/tablecmds.c:14951 commands/tablecmds.c:17864 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17310 +#: commands/tablecmds.c:14952 commands/tablecmds.c:17865 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14965 #, 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:14423 +#: commands/tablecmds.c:14967 #, 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:14626 +#: commands/tablecmds.c:15170 #, 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:14635 +#: commands/tablecmds.c:15179 #, 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:14685 +#: commands/tablecmds.c:15229 #, 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:14713 +#: commands/tablecmds.c:15257 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15345 #, 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:14809 +#: commands/tablecmds.c:15353 #, 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:14820 +#: commands/tablecmds.c:15364 #, 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:14855 +#: commands/tablecmds.c:15399 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15485 #, c-format 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:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15514 commands/tablecmds.c:15562 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:15024 +#: commands/tablecmds.c:15568 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:15252 +#: commands/tablecmds.c:15796 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15826 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15837 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:15302 +#: commands/tablecmds.c:15846 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:15860 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15912 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16086 #, 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:15548 +#: commands/tablecmds.c:16092 #, 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:15554 +#: commands/tablecmds.c:16098 #, 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:15560 +#: commands/tablecmds.c:16104 #, 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:15577 +#: commands/tablecmds.c:16121 #, 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:15584 +#: commands/tablecmds.c:16128 #, 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:15831 +#: commands/tablecmds.c:16375 #, 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:15855 +#: commands/tablecmds.c:16399 #, 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:15857 +#: commands/tablecmds.c:16401 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16446 #, 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:15912 +#: commands/tablecmds.c:16456 #, 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:15970 +#: commands/tablecmds.c:16514 #, 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:16077 +#: commands/tablecmds.c:16621 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:16648 +#: commands/tablecmds.c:17042 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" + +#: commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:16680 +#: commands/tablecmds.c:17220 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "kann Schema des Index »%s« nicht ändern" + +#: commands/tablecmds.c:17222 commands/tablecmds.c:17234 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Ändern Sie stattdessen das Schema der Tabelle." + +#: commands/tablecmds.c:17226 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" + +#: commands/tablecmds.c:17232 #, 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 TOAST table \"%s\"" +msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17269 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "unbekannte Partitionierungsstrategie »%s«" -#: commands/tablecmds.c:16723 +#: commands/tablecmds.c:17277 #, 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:16789 +#: commands/tablecmds.c:17343 #, 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:16797 +#: commands/tablecmds.c:17351 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:16808 commands/tablecmds.c:16922 +#: commands/tablecmds.c:17362 commands/tablecmds.c:17452 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:16809 commands/tablecmds.c:16923 commands/trigger.c:653 +#: commands/tablecmds.c:17363 commands/tablecmds.c:17453 commands/trigger.c:668 #: rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Spalte »%s« ist eine generierte Spalte." -#: commands/tablecmds.c:16885 -#, 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:16905 +#: commands/tablecmds.c:17435 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:16935 +#: commands/tablecmds.c:17482 +#, 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:17491 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:16956 +#: commands/tablecmds.c:17512 #, 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:16991 +#: commands/tablecmds.c:17547 #, 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:16997 +#: commands/tablecmds.c:17553 #, 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:17249 +#: commands/tablecmds.c:17804 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:17255 +#: commands/tablecmds.c:17810 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17271 +#: commands/tablecmds.c:17826 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17285 +#: commands/tablecmds.c:17840 #, 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:17319 +#: commands/tablecmds.c:17874 #, 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:17327 +#: commands/tablecmds.c:17882 #, 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:17335 +#: commands/tablecmds.c:17890 #, 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:17342 +#: commands/tablecmds.c:17897 #, 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:17362 +#: commands/tablecmds.c:17917 #, 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:17365 +#: commands/tablecmds.c:17920 #, 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:17377 +#: commands/tablecmds.c:17932 #, 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:17379 commands/trigger.c:459 +#: commands/tablecmds.c:17934 #, 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" +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:17558 +#: commands/tablecmds.c:18113 #, 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:17561 +#: commands/tablecmds.c:18116 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:17885 +#: commands/tablecmds.c:18431 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "nebenläufiges Abtrennen einer Partition ist nicht möglich, wenn eine Standardpartition existiert" -#: commands/tablecmds.c:17994 +#: commands/tablecmds.c:18540 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:18000 +#: commands/tablecmds.c:18546 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:18483 commands/tablecmds.c:18503 -#: commands/tablecmds.c:18523 commands/tablecmds.c:18542 -#: commands/tablecmds.c:18584 +#: commands/tablecmds.c:19061 commands/tablecmds.c:19081 +#: commands/tablecmds.c:19101 commands/tablecmds.c:19120 +#: commands/tablecmds.c:19162 #, 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:18486 +#: commands/tablecmds.c:19064 #, 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:18506 +#: commands/tablecmds.c:19084 #, 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:18526 +#: commands/tablecmds.c:19104 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:18545 +#: commands/tablecmds.c:19123 #, 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:18587 +#: commands/tablecmds.c:19165 #, 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:18824 +#: commands/tablecmds.c:19402 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:18831 +#: commands/tablecmds.c:19409 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablespace.c:161 commands/tablespace.c:177 -#: commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 -#: storage/file/copydir.c:47 -#, c-format -msgid "could not create directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" - -#: commands/tablespace.c:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "»%s« existiert, ist aber kein Verzeichnis" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "keine Berechtigung, um Tablespace »%s« zu erzeugen" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Nur Superuser können Tablespaces anlegen." -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "Tablespace-Pfad darf keine Apostrophe enthalten" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "Tablespace-Pfad muss ein absoluter Pfad sein" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "Tablespace-Pfad »%s« ist zu lang" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "Tablespace-Pfad sollte nicht innerhalb des Datenverzeichnisses sein" -#: commands/tablespace.c:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "inakzeptabler Tablespace-Name »%s«" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, 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:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "Tablespace »%s« existiert bereits" -#: commands/tablespace.c:427 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "OID-Wert für pg_tablespace ist im Binary-Upgrade-Modus nicht gesetzt" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "Tablespace »%s« existiert nicht" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "Tablespace »%s« existiert nicht, wird übersprungen" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, 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:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "Tablespace »%s« ist nicht leer" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "Verzeichnis »%s« existiert nicht" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, 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:618 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: commands/tablespace.c:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "Verzeichnis »%s« ist bereits als Tablespace in Verwendung" -#: commands/tablespace.c:768 commands/tablespace.c:781 -#: commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 -#: storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 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:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "»%s« ist kein Verzeichnis oder symbolische Verknüpfung" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Tablespace »%s« existiert nicht." -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "Verzeichnisse für Tablespace %u konnten nicht entfernt werden" -#: commands/tablespace.c:1567 +#: commands/tablespace.c:1590 #, 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:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "»%s« ist eine Tabelle" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Tabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "»%s« ist eine partitionierte Tabelle" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "ROW-Trigger mit Übergangstabellen werden für partitionierte Tabellen nicht unterstützt." -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "»%s« ist eine Sicht" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, 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:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Sichten können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 -#: commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "»%s« ist eine Fremdtabelle" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Fremdtabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Fremdtabellen können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Fremdtabellen können keine Constraint-Trigger haben." -#: commands/trigger.c:377 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "Relation »%s« kann keine Trigger haben" + +#: commands/trigger.c:392 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW-Trigger werden nicht unterstützt" -#: commands/trigger.c:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF-Trigger müssen FOR EACH ROW sein" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF-Trigger können keine WHEN-Bedingungen haben" -#: commands/trigger.c:393 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF-Trigger können keine Spaltenlisten haben" -#: commands/trigger.c:422 +#: commands/trigger.c:437 #, 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:423 +#: commands/trigger.c:438 #, 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:436 +#: commands/trigger.c:451 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Trigger für Fremdtabellen können keine Übergangstabellen haben." -#: commands/trigger.c:443 +#: commands/trigger.c:458 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Trigger für Sichten können keine Übergangstabellen haben." -#: commands/trigger.c:463 +#: commands/trigger.c:474 +#, 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/trigger.c:478 #, 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:469 +#: commands/trigger.c:484 #, 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:474 +#: commands/trigger.c:489 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "TRUNCATE-Trigger mit Übergangstabellen werden nicht unterstützt" -#: commands/trigger.c:491 +#: commands/trigger.c:506 #, 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:502 +#: commands/trigger.c:517 #, 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:519 +#: commands/trigger.c:534 #, 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:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, 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:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, 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:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, 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:618 +#: commands/trigger.c:633 #, 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:631 +#: commands/trigger.c:646 #, 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:636 +#: commands/trigger.c:651 #, 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:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, 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:645 +#: commands/trigger.c:660 #, 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:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "Trigger »%s« für Relation »%s« existiert bereits" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "Trigger »%s« für Relation »%s« ist ein interner Trigger" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "Trigger »%s« für Relation »%s« ist ein interner oder abgeleiteter Trigger" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, 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:1354 commands/trigger.c:1515 commands/trigger.c:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "Trigger »%s« für Tabelle »%s« existiert nicht" -#: commands/trigger.c:1600 +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "Trigger »%s« für Tabelle »%s« kann nicht umbenannt werden" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Benennen Sie stattdessen den Trigger für die partitionierte Tabelle »%s« um." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "Trigger »%s« für Tabelle »%s« wurde umbenannt" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "keine Berechtigung: »%s« ist ein Systemtrigger" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" msgstr "Triggerfunktion %u gab NULL-Wert zurück" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 -#: commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3364 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Trigger für BEFORE STATEMENT kann keinen Wert zurückgeben" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, 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:2356 +#: commands/trigger.c:2586 #, 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:3104 executor/nodeModifyTable.c:1956 -#: executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3441 executor/nodeModifyTable.c:2350 +#: executor/nodeModifyTable.c:2433 #, 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:3105 executor/nodeModifyTable.c:1306 -#: executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 -#: executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3442 executor/nodeModifyTable.c:1514 +#: executor/nodeModifyTable.c:1588 executor/nodeModifyTable.c:2351 +#: executor/nodeModifyTable.c:2434 executor/nodeModifyTable.c:3079 #, 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:3134 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 -#: executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 -#: executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3483 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:2368 +#: executor/nodeModifyTable.c:2576 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" -#: commands/trigger.c:3142 executor/nodeModifyTable.c:1412 -#: executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3491 executor/nodeModifyTable.c:1620 +#: executor/nodeModifyTable.c:2451 executor/nodeModifyTable.c:2600 +#: executor/nodeModifyTable.c:2967 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4234 +#: commands/trigger.c:4698 #, 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:5284 +#: commands/trigger.c:5881 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5307 +#: commands/trigger.c:5904 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "Funktion %s sollte Rückgabetyp %s haben" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "nur Superuser können Textsucheparser anlegen" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "Textsucheparserparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "Textsucheparserstartmethode muss angegeben werden" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "Gettoken-Methode für Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "Textsucheparserendemethode muss angegeben werden" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "Lextypes-Methode für Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "Textsuchevorlage »%s« akzeptiert keine Optionen" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "Textsuchevorlage muss angegeben werden" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "nur Superuser können Textsuchevorlagen erzeugen" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "Textsuchevorlageparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "Lexize-Methode für Textsuchevorlage muss angegeben werden" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "Textsuchekonfigurationsparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "Optionen PARSER und COPY können nicht beide angegeben werden" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:1200 +#: commands/tsearchcmds.c:1236 #, c-format msgid "token type \"%s\" does not exist" msgstr "Tokentyp »%s« existiert nicht" -#: commands/tsearchcmds.c:1427 +#: commands/tsearchcmds.c:1464 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "Mapping für Tokentyp »%s« existiert nicht" -#: commands/tsearchcmds.c:1433 +#: commands/tsearchcmds.c:1470 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "Mapping für Tokentyp »%s« existiert nicht, wird übersprungen" -#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#: commands/tsearchcmds.c:1631 commands/tsearchcmds.c:1746 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "ungültiges Parameterlistenformat: »%s«" @@ -11054,581 +11777,581 @@ 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 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:2566 +#: 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:1981 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "Typeingabefunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:1999 +#: 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:2015 +#: 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:2043 +#: 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:2050 +#: 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:2079 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "Typempfangsfunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2097 +#: 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:2104 +#: 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:2132 +#: 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:2139 +#: 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:2166 +#: 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:2173 +#: 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:2200 +#: 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:2207 +#: 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:2234 +#: 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:2263 +#: commands/typecmds.c:2248 #, c-format msgid "type subscripting function %s must return type %s" msgstr "Typ-Subscript-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "benutzerdefinierte Typen können Subscript-Funktion %s nicht verwenden" -#: commands/typecmds.c:2319 +#: 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:2350 +#: 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:2356 +#: 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:2392 +#: 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:2399 +#: 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:2426 +#: 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:2459 +#: 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:2492 +#: 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:15260 -#: gram.y:15305 utils/adt/acl.c:5248 utils/adt/acl.c:5254 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 +#: gram.y:16483 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:570 commands/user.c:925 +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "Reservierte Rollen können nicht geändert werden." -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" msgstr "nur Superuser können Superuser-Rollen oder das Superuser-Attribut ändern" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "must be superuser to alter replication roles or change replication attribute" 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:710 +#: 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 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" 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 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" 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:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "unbekannte ANALYZE-Option »%s«" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, 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:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "parallele Arbeitsprozesse für Vacuum müssen zwischen 0 und %d sein" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "unbekannte VACUUM-Option »%s«" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL kann nicht parallel ausgeführt werden" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, 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:329 +#: commands/vacuum.c:336 #, 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:339 +#: commands/vacuum.c:346 #, 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:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST benötigt VACUUM FULL" @@ -11683,12 +12406,12 @@ msgstr "überspringe Analyze von »%s« --- Sperre nicht verfügbar" msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "überspringe Analyze von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "älteste xmin ist weit in der Vergangenheit" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11697,32 +12420,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:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "älteste Multixact ist weit in der Vergangenheit" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, 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:1755 +#: commands/vacuum.c:1807 #, 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:1756 +#: commands/vacuum.c:1808 #, 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:1924 +#: commands/vacuum.c:1976 #, 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:11657 utils/misc/guc.c:11719 +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" + +#: commands/vacuum.c:2373 +#, 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:2377 +#, 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:664 +#, 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:670 +#, 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:12115 utils/misc/guc.c:12193 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Unbekanntes Schlüsselwort: »%s«." @@ -11782,7 +12540,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" @@ -11847,32 +12605,37 @@ 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:304 +#: commands/view.c:309 #, 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:452 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "kann Sortierfolge der Sichtspalte »%s« nicht von »%s« in »%s« ändern" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "Sichten dürfen kein SELECT INTO enthalten" -#: commands/view.c:464 +#: commands/view.c:480 #, 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:534 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW gibt mehr Spaltennamen als Spalten an" -#: commands/view.c:542 +#: commands/view.c:558 #, 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:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "Sicht »%s« wird eine temporäre Sicht" @@ -11908,57 +12671,57 @@ 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:2452 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 #, 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:2464 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2466 #, c-format msgid "no value found for parameter %d" msgstr "kein Wert für Parameter %d gefunden" #: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 -#: executor/execExprInterp.c:4033 executor/execExprInterp.c:4050 -#: executor/execExprInterp.c:4149 executor/nodeModifyTable.c:119 -#: executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 -#: executor/nodeModifyTable.c:155 +#: executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 +#: executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, 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:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "Anfrage hat zu viele Spalten." -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, 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:650 executor/execExprInterp.c:4051 -#: executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 +#: executor/nodeModifyTable.c:209 #, 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." -#: executor/execExpr.c:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:837 #, c-format msgid "window function calls cannot be nested" msgstr "Aufrufe von Fensterfunktionen können nicht geschachtelt werden" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "Zieltyp ist kein Array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()-Spalte hat Typ %s statt Typ %s" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 +#: executor/execExpr.c:2482 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" @@ -11966,310 +12729,329 @@ 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:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, 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:2915 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 Subscripting nicht unterstützt" -#: executor/execExpr.c:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" msgstr "Typ %s unterstützt Wertzuweisungen in Elemente nicht" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, 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:1924 #, 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:3058 -#: executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 +#: executor/execExprInterp.c:3106 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." -#: executor/execExprInterp.c:2004 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:492 +#: executor/execExprInterp.c:2006 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:570 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: executor/execExprInterp.c:2542 +#: executor/execExprInterp.c:2544 #, 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:2755 +#: executor/execExprInterp.c:2757 #, c-format msgid "cannot merge incompatible arrays" msgstr "kann inkompatible Arrays nicht verschmelzen" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2758 #, 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:2777 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 -#: utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:264 +#: utils/adt/arrayfuncs.c:564 utils/adt/arrayfuncs.c:1306 +#: utils/adt/arrayfuncs.c:3422 utils/adt/arrayfuncs.c:5419 +#: utils/adt/arrayfuncs.c:5936 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:2797 executor/execExprInterp.c:2832 +#: executor/execExprInterp.c:2799 executor/execExprInterp.c:2834 #, 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:2809 utils/adt/array_expanded.c:274 -#: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 -#: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 -#: utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 -#: utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 -#: utils/adt/arrayutils.c:110 +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:937 utils/adt/arrayfuncs.c:1545 +#: utils/adt/arrayfuncs.c:2353 utils/adt/arrayfuncs.c:2368 +#: utils/adt/arrayfuncs.c:2630 utils/adt/arrayfuncs.c:2646 +#: utils/adt/arrayfuncs.c:2954 utils/adt/arrayfuncs.c:2969 +#: utils/adt/arrayfuncs.c:3310 utils/adt/arrayfuncs.c:3452 +#: utils/adt/arrayfuncs.c:6028 utils/adt/arrayfuncs.c:6369 +#: utils/adt/arrayutils.c:88 utils/adt/arrayutils.c:97 +#: utils/adt/arrayutils.c:104 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:3057 executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 #, c-format msgid "attribute %d has wrong type" msgstr "Attribut %d hat falschen Typ" -#: executor/execExprInterp.c:3662 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3691 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:3677 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3706 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:4034 +#: executor/execExprInterp.c:4063 #, 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:4150 executor/execSRF.c:977 +#: executor/execExprInterp.c:4179 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/execIndexing.c:567 +#: executor/execIndexing.c:571 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT unterstützt keine aufschiebbaren Unique-Constraints/Exclusion-Constraints als Arbiter" -#: executor/execIndexing.c:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "konnte Exclusion-Constraint »%s« nicht erzeugen" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "Schlüssel %s kollidiert mit Schlüssel %s." -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Es bestehen Schlüsselkonflikte." -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "kollidierender Schlüsselwert verletzt Exclusion-Constraint »%s«" -#: executor/execIndexing.c:852 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Schlüssel %s kollidiert mit vorhandenem Schlüssel %s." -#: executor/execIndexing.c:854 +#: executor/execIndexing.c:864 #, c-format 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:3096 -#: rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "cannot insert into view \"%s\"" msgstr "kann nicht in Sicht »%s« einfügen" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3099 -#: rewrite/rewriteHandler.c:3930 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 +#: rewrite/rewriteHandler.c:3977 #, 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:3104 -#: rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 +#: rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot update view \"%s\"" msgstr "kann Sicht »%s« nicht aktualisieren" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3107 -#: rewrite/rewriteHandler.c:3938 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 +#: rewrite/rewriteHandler.c:3985 #, 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:3112 -#: rewrite/rewriteHandler.c:3943 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 +#: rewrite/rewriteHandler.c:3990 #, c-format msgid "cannot delete from view \"%s\"" msgstr "kann nicht aus Sicht »%s« löschen" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3115 -#: rewrite/rewriteHandler.c:3946 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 +#: rewrite/rewriteHandler.c:3993 #, 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:2587 +#: executor/execMain.c:1175 executor/execMain.c:2685 #: 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 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "Zielzeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" + +#: executor/execMain.c:2158 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "Zielzeile 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." @@ -12289,50 +13071,60 @@ msgstr "gleichzeitige Aktualisierung, versuche erneut" msgid "concurrent delete, retrying" msgstr "gleichzeitiges Löschen, versuche erneut" -#: executor/execReplication.c:276 parser/parse_cte.c:301 +#: executor/execReplication.c:276 parser/parse_cte.c:308 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 -#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 -#: utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 +#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3702 +#: utils/adt/arrayfuncs.c:4257 utils/adt/arrayfuncs.c:6249 #: 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:604 +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "kann Tabelle »%s« nicht aktualisieren" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "Im WHERE-Ausdruck der Publikation verwendete Spalte ist nicht Teil der Replika-Identität." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "Die von der Publikation verwendete Spaltenliste umfasst die Replika-Identität nicht." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "kann nicht aus Tabelle »%s« löschen" + +#: executor/execReplication.c:644 #, 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:606 +#: executor/execReplication.c:646 #, 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:610 +#: executor/execReplication.c:650 #, 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:612 +#: executor/execReplication.c:652 #, 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:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, 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:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "»%s.%s« ist eine Fremdtabelle." - -#: executor/execReplication.c:641 -#, 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" @@ -12408,7 +13200,7 @@ 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:528 executor/spi.c:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s ist in als nicht »volatile« markierten Funktionen nicht erlaubt" @@ -12470,21 +13262,16 @@ msgstr "Die letzte Anweisung gibt zu wenige Spalten zurück." msgid "return type %s is not supported for SQL functions" msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" -#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, 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" +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "Aggregatfunktion %u muss kompatiblen Eingabe- und Übergangstyp haben" -#: executor/nodeAgg.c:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3952 parser/parse_agg.c:679 parser/parse_agg.c:707 #, c-format msgid "aggregate function calls cannot be nested" msgstr "Aufrufe von Aggregatfunktionen können nicht geschachtelt werden" -#: executor/nodeAgg.c:4187 executor/nodeWindowAgg.c:2845 -#, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "Aggregatfunktion %u muss kompatiblen Eingabe- und Übergangstyp haben" - #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12525,42 +13312,73 @@ 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:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "Anfrage hat zu wenige Spalten." -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1513 executor/nodeModifyTable.c:1587 #, 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:1583 +#: executor/nodeModifyTable.c:1742 #, c-format msgid "invalid ON UPDATE specification" msgstr "ungültige ON-UPDATE-Angabe" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1743 #, 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:2183 +#: executor/nodeModifyTable.c:2204 +#, 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 "Tupel kann nicht zwischen Partitionen bewegt werden, wenn ein Fremdschlüssel direkt auf einen Vorgänger (außer der Wurzel) der Quellpartition verweist" + +#: executor/nodeModifyTable.c:2205 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "Ein Fremdschlüssel verweist auf den Vorgänger »%s«, aber nicht auf den Wurzelvorgänger »%s«." + +#: executor/nodeModifyTable.c:2208 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Definieren Sie den Fremdschlüssel eventuell für Tabelle »%s«." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2554 executor/nodeModifyTable.c:2956 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" -msgstr "Befehl in ON CONFLICT DO UPDATE kann eine Zeile nicht ein zweites Mal ändern" +msgid "%s command cannot affect row a second time" +msgstr "Befehl in %s kann eine Zeile nicht ein zweites Mal ändern" -#: executor/nodeModifyTable.c:2184 +#: executor/nodeModifyTable.c:2556 #, 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:2958 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Stellen Sie sicher, dass nicht mehr als eine Quellzeile auf jede Zielzeile passt." + +#: executor/nodeModifyTable.c:3039 +#, 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:3078 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "das zu aktualisierende oder zu löschende 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" @@ -12601,104 +13419,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:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "Frame-Start-Offset darf nicht NULL sein" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "Frame-Start-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "Frame-Ende-Offset darf nicht NULL sein" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "Frame-Ende-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, 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:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "ungültige Transaktionsbeendung" -#: executor/spi.c:256 +#: 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:347 +#: 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:482 +#: 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:483 executor/spi.c:543 +#: 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:542 +#: 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:1610 +#: 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:1620 +#: 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:1726 +#: 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:1727 parser/analyze.c:2853 +#: executor/spi.c:1717 parser/analyze.c:2899 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Scrollbare Cursor müssen READ ONLY sein." -#: executor/spi.c:2482 +#: executor/spi.c:2474 #, 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:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "%s-Anfrage gibt keine Tupel zurück" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL-Ausdruck »%s«" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL-Zuweisung »%s«" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-Anweisung »%s«" @@ -12708,391 +13526,431 @@ 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:1108 +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "Es gibt keine gültigen Optionen in diesem Zusammenhang." + +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD wird nicht mehr unterstützt" -#: gram.y:1109 +#: gram.y:1147 #, 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:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "unbekannte Rollenoption »%s«" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS kann keine Schemaelemente enthalten" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "aktuelle Datenbank kann nicht geändert werden" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "Zeitzonenintervall muss HOUR oder HOUR TO MINUTE sein" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "Spaltennummer muss im Bereich 1 bis %d sein" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "Sequenzoption »%s« wird hier nicht unterstützt" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "Modulus für Hashpartition mehrmals angegeben" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "Rest für Hashpartition mehrmals angegeben" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "unbekannte Hashpartitionsbegrenzungsangabe »%s«" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "Modulus für Hashpartition muss angegeben werden" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "Rest für Hashpartition muss angegeben werden" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT sind nicht mit PROGRAM erlaubt" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "mit COPY TO ist keine WHERE-Klausel erlaubt" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, 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:3666 +#: gram.y:3881 #, 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:3934 utils/adt/ri_triggers.c:2032 +#: gram.y:4172 utils/adt/ri_triggers.c:2098 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL ist noch nicht implementiert" -#: gram.y:4635 +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "eine Spaltenliste für %s wird nur für ON-DELETE-Aktionen unterstützt" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM wird nicht mehr unterstützt" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "unbekannte Zeilensicherheitsoption »%s«" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Aktuell werden nur PERMISSIVE und RESTRICTIVE unterstützt." -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER wird nicht unterstützt" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "mehrere Trigger-Ereignisse angegeben" -#: gram.y:5559 parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 +#: gram.y:5937 parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "Constraint, der als INITIALLY DEFERRED deklariert wurde, muss DEFERRABLE sein" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "widersprüchliche Constraint-Eigentschaften" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ist noch nicht implementiert" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK wird nicht mehr benötigt" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "Aktualisieren Sie Ihren Datentyp." -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "Aggregatfunktionen können keine OUT-Argumente haben" -#: gram.y:8189 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format msgid "missing argument" msgstr "Argument fehlt" -#: gram.y:8190 utils/adt/regproc.c:711 utils/adt/regproc.c:752 +#: gram.y:8772 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:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, 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:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "Syntax LIMIT x,y wird nicht unterstützt" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Verwenden Sie die getrennten Klauseln LIMIT und OFFSET." -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES in FROM muss Aliasnamen erhalten" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Zum Beispiel FROM (VALUES ...) [AS] xyz." -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "Unteranfrage in FROM muss Aliasnamen erhalten" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Zum Beispiel FROM (SELECT ...) [AS] xyz." -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "nur ein DEFAULT-Wert ist erlaubt" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "nur ein PATH-Wert pro Spalte ist erlaubt" -#: gram.y:12687 +#: gram.y:13821 #, 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:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "unbekannte Spaltenoption »%s«" -#: gram.y:12950 +#: gram.y:14084 #, 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:12959 +#: gram.y:14093 #, 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:13457 +#: gram.y:14596 #, 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:13462 +#: gram.y:14601 #, 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:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-Prädikat ist noch nicht implementiert" -#: gram.y:13989 +#: gram.y:15156 #, 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:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "Frame-Beginn kann nicht UNBOUNDED FOLLOWING sein" -#: gram.y:14528 +#: gram.y:15708 #, 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:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "Frame-Ende kann nicht UNBOUNDED PRECEDING sein" -#: gram.y:14557 +#: gram.y:15738 #, 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:14564 +#: gram.y:15745 #, 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:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "Typmodifikator kann keinen Parameternamen haben" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "Typmodifikator kann kein ORDER BY haben" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kann hier nicht als Rollenname verwendet werden" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, 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:16478 gram.y:16667 +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "unzulässige Verwendung von »*«" -#: gram.y:16630 gram.y:16647 tsearch/spell.c:983 tsearch/spell.c:1000 +#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 #: tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 #, c-format msgid "syntax error" msgstr "Syntaxfehler" -#: gram.y:16731 +#: gram.y:17913 #, 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:16768 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "mehrere ORDER-BY-Klauseln sind nicht erlaubt" -#: gram.y:16779 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "mehrere OFFSET-Klauseln sind nicht erlaubt" -#: gram.y:16788 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "mehrere LIMIT-Klauseln sind nicht erlaubt" -#: gram.y:16797 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "mehrere Limit-Optionen sind nicht erlaubt" -#: gram.y:16824 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "mehrere WITH-Klauseln sind nicht erlaubt" -#: gram.y:17018 +#: gram.y:18199 #, 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:17114 +#: gram.y:18332 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "mehrere COLLATE-Klauseln sind nicht erlaubt" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17152 gram.y:17165 +#: gram.y:18370 gram.y:18383 #, 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:17178 +#: gram.y:18396 #, 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:17191 +#: gram.y:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-Constraints können nicht als NO INHERIT markiert werden" +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "ungültige Publikationsobjektliste" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "Entweder TABLE oder TABLES IN SCHEMA muss vor einem alleinstehenden Tabellen- oder Schemanamen angegeben werden." + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "ungültiger Tabellenname" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "für Schemas ist keine WHERE-Klausel erlaubt" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "für Schemas ist keine Spaltenangabe erlaubt" + +#: gram.y:18492 +#, c-format +msgid "invalid schema name" +msgstr "ungültiger Schemaname" + #: 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:353 utils/misc/guc.c:7374 utils/misc/guc.c:7572 -#: utils/misc/guc.c:7666 utils/misc/guc.c:7760 utils/misc/guc.c:7880 -#: utils/misc/guc.c:7979 +#: guc-file.l:353 utils/misc/guc.c:7691 utils/misc/guc.c:7915 +#: utils/misc/guc.c:8013 utils/misc/guc.c:8111 utils/misc/guc.c:8235 +#: utils/misc/guc.c:8338 #, 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" @@ -13102,831 +13960,831 @@ msgstr "Parameter »%s« kann nicht geändert werden, ohne den Server neu zu sta 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:455 +#: guc-file.l:454 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "Parameter »%s« auf »%s« gesetzt" -#: guc-file.l:497 +#: guc-file.l:496 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "Konfigurationsdatei »%s« enthält Fehler" -#: guc-file.l:502 +#: guc-file.l:501 #, 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:507 +#: guc-file.l:506 #, 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:579 +#: guc-file.l:578 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "leerer Konfigurationsdateiname: »%s«" -#: guc-file.l:596 +#: guc-file.l:595 #, 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:616 +#: guc-file.l:615 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "Konfigurationsdateirekursion in »%s«" -#: guc-file.l:632 libpq/hba.c:2255 libpq/hba.c:2669 +#: guc-file.l:631 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:643 +#: guc-file.l:642 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "fehlende Konfigurationsdatei »%s« wird übersprungen" -#: guc-file.l:897 +#: guc-file.l:896 #, 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:907 +#: guc-file.l:906 #, 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:927 +#: guc-file.l:926 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "zu viele Syntaxfehler gefunden, Datei »%s« wird aufgegeben" -#: guc-file.l:982 +#: guc-file.l:981 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "leerer Konfigurationsverzeichnisname: »%s«" -#: guc-file.l:1001 +#: guc-file.l:1000 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "konnte Konfigurationsverzeichnis »%s« nicht öffnen: %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:482 -#: utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 utils/adt/varlena.c:336 -#: utils/adt/varlena.c:377 +#: 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:629 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" +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:623 +#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:623 #, c-format msgid "unsupported Unicode escape sequence" msgstr "nicht unterstützte Unicode-Escape-Sequenz" -#: lib/dshash.c:246 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 #: utils/mmgr/dsa.c:806 #, 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 +#: 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 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 "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:878 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:884 #, 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:933 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:969 #, 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:1029 msgid "accepting GSS security context failed" msgstr "Annahme des GSS-Sicherheitskontexts fehlgeschlagen" -#: libpq/auth.c:1225 +#: libpq/auth.c:1070 msgid "retrieving GSS user name failed" msgstr "Abfrage des GSS-Benutzernamens fehlgeschlagen" -#: libpq/auth.c:1374 +#: libpq/auth.c:1219 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: libpq/auth.c:1399 +#: libpq/auth.c:1244 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1477 +#: libpq/auth.c:1322 msgid "could not accept SSPI security context" msgstr "konnte SSPI-Sicherheitskontext nicht akzeptieren" -#: libpq/auth.c:1539 +#: libpq/auth.c:1384 msgid "could not get token from SSPI security context" msgstr "konnte kein Token vom SSPI-Sicherheitskontext erhalten" -#: libpq/auth.c:1678 libpq/auth.c:1697 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "konnte Namen nicht umwandeln" -#: libpq/auth.c:1710 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "Realm-Name zu lang" -#: libpq/auth.c:1725 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "umgewandelter Account-Name zu lang" -#: libpq/auth.c:1906 +#: libpq/auth.c:1751 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "konnte Socket für Ident-Verbindung nicht erzeugen: %m" -#: libpq/auth.c:1921 +#: libpq/auth.c:1766 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "konnte nicht mit lokaler Adresse »%s« verbinden: %m" -#: libpq/auth.c:1933 +#: libpq/auth.c:1778 #, 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:1955 +#: libpq/auth.c:1800 #, 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:1972 +#: libpq/auth.c:1817 #, 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:1982 +#: libpq/auth.c:1827 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ungültig formatierte Antwort vom Ident-Server: »%s«" -#: libpq/auth.c:2035 +#: libpq/auth.c:1880 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Peer-Authentifizierung wird auf dieser Plattform nicht unterstützt" -#: libpq/auth.c:2039 +#: libpq/auth.c:1884 #, c-format msgid "could not get peer credentials: %m" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1896 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "konnte lokale Benutzer-ID %ld nicht nachschlagen: %s" -#: libpq/auth.c:2152 +#: libpq/auth.c:1997 #, c-format msgid "error from underlying PAM layer: %s" msgstr "Fehler von der unteren PAM-Ebene: %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2008 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "nicht unterstützte PAM-Conversation: %d/»%s«" -#: libpq/auth.c:2223 +#: libpq/auth.c:2068 #, c-format msgid "could not create PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht erzeugen: %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2079 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) fehlgeschlagen: %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) fehlgeschlagen: %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2123 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) fehlgeschlagen: %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2136 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate fehlgeschlagen: %s" -#: libpq/auth.c:2304 +#: libpq/auth.c:2149 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt fehlgeschlagen: %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2160 #, c-format msgid "could not release PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht freigeben: %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2240 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "konnte LDAP nicht initialisieren: Fehlercode %d" -#: libpq/auth.c:2432 +#: libpq/auth.c:2277 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "konnte keinen Domain-Namen aus ldapbasedn herauslesen" -#: libpq/auth.c:2440 +#: libpq/auth.c:2285 #, 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:2442 +#: libpq/auth.c:2287 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Geben Sie einen LDAP-Servernamen explizit an." -#: libpq/auth.c:2494 +#: libpq/auth.c:2339 #, c-format msgid "could not initialize LDAP: %s" msgstr "konnte LDAP nicht initialisieren: %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2349 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps wird mit dieser LDAP-Bibliothek nicht unterstützt" -#: libpq/auth.c:2512 +#: libpq/auth.c:2357 #, c-format msgid "could not initialize LDAP: %m" msgstr "konnte LDAP nicht initialisieren: %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2367 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "konnte LDAP-Protokollversion nicht setzen: %s" -#: libpq/auth.c:2562 +#: libpq/auth.c:2407 #, 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:2563 +#: libpq/auth.c:2408 #, 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:2579 +#: libpq/auth.c:2424 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "konnte LDAP-TLS-Sitzung nicht starten: %s" -#: libpq/auth.c:2650 +#: libpq/auth.c:2495 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Server nicht angegeben, und kein ldapbasedn" -#: libpq/auth.c:2657 +#: libpq/auth.c:2502 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Server nicht angegeben" -#: libpq/auth.c:2719 +#: libpq/auth.c:2564 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ungültiges Zeichen im Benutzernamen für LDAP-Authentifizierung" -#: libpq/auth.c:2736 +#: libpq/auth.c:2581 #, 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:2765 +#: libpq/auth.c:2610 #, 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:2779 +#: libpq/auth.c:2624 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-Benutzer »%s« existiert nicht" -#: libpq/auth.c:2780 +#: libpq/auth.c:2625 #, 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:2784 +#: libpq/auth.c:2629 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-Benutzer »%s« ist nicht eindeutig" -#: libpq/auth.c:2785 +#: libpq/auth.c:2630 #, 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:2805 +#: libpq/auth.c:2650 #, 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:2826 +#: libpq/auth.c:2671 #, 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:2857 +#: libpq/auth.c:2702 #, 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:2889 +#: libpq/auth.c:2734 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-Diagnostik: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2772 #, 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:2948 +#: libpq/auth.c:2793 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: konnte Subject-DN nicht abfragen" -#: libpq/auth.c:2971 +#: libpq/auth.c:2816 #, 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:2976 +#: libpq/auth.c:2821 #, 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:3078 +#: libpq/auth.c:2923 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Server nicht angegeben" -#: libpq/auth.c:3085 +#: libpq/auth.c:2930 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-Geheimnis nicht angegeben" -#: libpq/auth.c:3099 +#: libpq/auth.c:2944 #, 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:3206 libpq/hba.c:2008 +#: libpq/auth.c:3051 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:3220 +#: libpq/auth.c:3065 #, c-format msgid "could not generate random encryption vector" msgstr "konnte zufälligen Verschlüsselungsvektor nicht erzeugen" -#: libpq/auth.c:3254 +#: libpq/auth.c:3102 #, 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:3280 +#: libpq/auth.c:3129 #, c-format msgid "could not create RADIUS socket: %m" msgstr "konnte RADIUS-Socket nicht erstellen: %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3151 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "konnte lokales RADIUS-Socket nicht binden: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3161 #, c-format msgid "could not send RADIUS packet: %m" msgstr "konnte RADIUS-Paket nicht senden: %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3195 libpq/auth.c:3221 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "Zeitüberschreitung beim Warten auf RADIUS-Antwort von %s" -#: libpq/auth.c:3364 +#: libpq/auth.c:3214 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "konnte Status des RADIUS-Sockets nicht prüfen: %m" -#: libpq/auth.c:3394 +#: libpq/auth.c:3244 #, c-format msgid "could not read RADIUS response: %m" msgstr "konnte RADIUS-Antwort nicht lesen: %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3257 libpq/auth.c:3261 #, 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:3420 +#: libpq/auth.c:3270 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-Antwort von %s zu kurz: %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3277 #, 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:3435 +#: libpq/auth.c:3285 #, 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:3460 +#: libpq/auth.c:3310 #, 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:3469 +#: libpq/auth.c:3320 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-Antwort von %s hat falsche MD5-Signatur" -#: libpq/auth.c:3487 +#: libpq/auth.c:3338 #, 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«" @@ -13983,8 +14841,8 @@ msgstr "konnte Serverdatei »%s« nicht schreiben: %m" msgid "large object read request is too large" msgstr "Large-Object-Leseaufforderung ist zu groß" -#: libpq/be-fsstubs.c:800 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" @@ -14031,16 +14889,16 @@ msgstr "private Schlüsseldatei »%s« erlaubt Zugriff von Gruppe oder Welt" 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." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Server versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" @@ -14072,203 +14930,203 @@ 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:500 #, 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:504 libpq/be-secure-openssl.c:557 #, 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:543 #, 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:546 #, 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:562 libpq/be-secure-openssl.c:751 +#: libpq/be-secure-openssl.c:821 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: libpq/be-secure-openssl.c:600 +#: libpq/be-secure-openssl.c:608 #, 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:654 #, 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:740 libpq/be-secure-openssl.c:805 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:982 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "konnte DH-Parameterdatei »%s« nicht öffnen: %m" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:994 #, c-format msgid "could not load DH parameters file: %s" msgstr "konnte DH-Parameterdatei nicht laden: %s" -#: libpq/be-secure-openssl.c:986 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: %s" msgstr "ungültige DH-Parameter: %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1013 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ungültige DH-Parameter: p ist keine Primzahl" -#: libpq/be-secure-openssl.c:1004 +#: libpq/be-secure-openssl.c:1022 #, 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:1165 +#: libpq/be-secure-openssl.c:1183 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: konnte DH-Parameter nicht laden" -#: libpq/be-secure-openssl.c:1173 +#: libpq/be-secure-openssl.c:1191 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: konnte DH-Parameter nicht setzen: %s" -#: libpq/be-secure-openssl.c:1200 +#: libpq/be-secure-openssl.c:1218 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: unbekannter Kurvenname: %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1227 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: konnte Schlüssel nicht erzeugen" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1255 msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1259 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1418 #, c-format msgid "could not create BIO" msgstr "konnte BIO nicht erzeugen" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1428 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "konnte NID für ASN1_OBJECT-Objekt nicht ermitteln" -#: libpq/be-secure-openssl.c:1418 +#: libpq/be-secure-openssl.c:1436 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "konnte NID %d nicht in eine ASN1_OBJECT-Struktur umwandeln" @@ -14293,397 +15151,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: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 +#: 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:228 #, 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:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi und cert" -#: libpq/hba.c:1730 +#: 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:1747 +#: 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:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ungültiger Wert für clientcert: »%s«" -#: libpq/hba.c:1772 +#: 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:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "ungültiger Wert für clientname: »%s«" -#: libpq/hba.c:1825 +#: 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:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "nicht unterstütztes LDAP-URL-Schema: %s" -#: libpq/hba.c:1860 +#: 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:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ungültiger ldapscheme-Wert: »%s«" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "ungültige LDAP-Portnummer: »%s«" -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi und sspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "konnte RADIUS-Serverliste »%s« nicht parsen" -#: libpq/hba.c:2037 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "konnte RADIUS-Portliste »%s« nicht parsen" -#: libpq/hba.c:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "ungültige RADIUS-Portnummer: »%s«" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "konnte RADIUS-Geheimnisliste »%s« nicht parsen" -#: libpq/hba.c:2095 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "konnte RADIUS-Bezeichnerliste »%s« nicht parsen" -#: libpq/hba.c:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "unbekannter Authentifizierungsoptionsname: »%s«" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "Konfigurationsdatei »%s« enthält keine Einträge" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "ungültiger regulärer Ausdruck »%s«: %s" -#: libpq/hba.c:2884 +#: 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:2903 +#: 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:2999 +#: 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:3019 +#: 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:3052 +#: 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" @@ -14796,10 +15644,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: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 +#: libpq/pqcomm.c:1652 libpq/pqcomm.c:1697 libpq/pqcomm.c:1737 +#: libpq/pqcomm.c:1781 libpq/pqcomm.c:1820 libpq/pqcomm.c:1859 +#: libpq/pqcomm.c:1895 libpq/pqcomm.c:1934 #, c-format msgid "%s(%s) failed: %m" msgstr "%s(%s) fehlgeschlagen: %m" @@ -14809,63 +15656,58 @@ msgstr "%s(%s) fehlgeschlagen: %m" msgid "there is no client connection" msgstr "es besteht keine Client-Verbindung" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:977 libpq/pqcomm.c:1078 #, c-format msgid "could not receive data from client: %m" msgstr "konnte Daten vom Client nicht empfangen: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4316 +#: libpq/pqcomm.c:1183 tcop/postgres.c:4373 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "Verbindung wird abgebrochen, weil Protokollsynchronisierung verloren wurde" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1249 #, c-format msgid "unexpected EOF within message length word" msgstr "unerwartetes EOF im Message-Längenwort" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1259 #, c-format msgid "invalid message length" msgstr "ungültige Message-Länge" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1281 libpq/pqcomm.c:1294 #, c-format msgid "incomplete message from client" msgstr "unvollständige Message vom Client" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1405 #, c-format msgid "could not send data to client: %m" msgstr "konnte Daten nicht an den Client senden: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1620 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1709 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "Setzen der Keepalive-Idle-Zeit wird nicht unterstützt" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1793 libpq/pqcomm.c:1868 libpq/pqcomm.c:1943 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) nicht unterstützt" -#: libpq/pqcomm.c:1968 -#, c-format -msgid "could not poll socket: %m" -msgstr "konnte Socket nicht pollen: %m" - #: 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:1482 utils/adt/rowtypes.c:588 +#: utils/adt/arrayfuncs.c:1483 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "nicht genug Daten in Message übrig" @@ -14880,12 +15722,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" @@ -14894,7 +15736,7 @@ msgstr "" "%s ist der PostgreSQL-Server.\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14905,107 +15747,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" @@ -15014,42 +15856,42 @@ msgstr "" "\n" "Entwickleroptionen:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|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" @@ -15058,39 +15900,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" @@ -15099,22 +15941,22 @@ 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 #, c-format -msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" -msgstr " DBNAME Datenbankname (Pflichtangabe im Bootstrap-Modus)\n" +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check wählt den Check-Modus (muss erstes Argument sein)\n" -#: main/main.c:355 +#: main/main.c:395 #, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM interne Verwendung\n" +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " DBNAME Datenbankname (Pflichtangabe im Bootstrap-Modus)\n" -#: main/main.c:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -15131,12 +15973,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" @@ -15150,12 +15992,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" @@ -15180,15 +16022,15 @@ msgstr "erweiterbarer Knotentyp »%s« existiert bereits" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods »%s« wurde nicht registriert" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, 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: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:592 +#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, c-format msgid "could not find array type for data type %s" msgstr "konnte Arraytyp für Datentyp %s nicht finden" @@ -15208,6 +16050,12 @@ msgstr "unbenanntes Portal mit Parametern: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN wird nur für Merge- oder Hash-Verbund-fähige Verbundbedingungen unterstützt" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "MERGE kann für Relation »%s« nicht ausgeführt werden" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -15215,53 +16063,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:1316 parser/analyze.c:1709 parser/analyze.c:1965 -#: parser/analyze.c:3144 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 +#: parser/analyze.c:3190 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:1973 optimizer/plan/planner.c:3629 +#: optimizer/plan/planner.c:2045 optimizer/plan/planner.c:3702 #, c-format msgid "could not implement GROUP BY" msgstr "konnte GROUP BY nicht implementieren" -#: optimizer/plan/planner.c:1974 optimizer/plan/planner.c:3630 -#: optimizer/plan/planner.c:4387 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2046 optimizer/plan/planner.c:3703 +#: optimizer/plan/planner.c:4346 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:4386 +#: optimizer/plan/planner.c:4345 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:5234 +#: optimizer/plan/planner.c:5466 #, c-format msgid "could not implement window PARTITION BY" msgstr "konnte PARTITION BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:5235 +#: optimizer/plan/planner.c:5467 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fensterpartitionierungsspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window ORDER BY" msgstr "konnte ORDER BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/setrefs.c:516 -#, 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" @@ -15278,847 +16121,859 @@ msgstr "Alle Spaltendatentypen müssen hashbar sein." msgid "could not implement %s" msgstr "konnte %s nicht implementieren" -#: optimizer/util/clauses.c:4729 +#: optimizer/util/clauses.c:4843 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-Funktion »%s« beim Inlining" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format msgid "cannot open relation \"%s\"" msgstr "kann Relation »%s« nicht öffnen" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, 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:688 +#: optimizer/util/plancat.c:691 #, 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:705 +#: optimizer/util/plancat.c:708 #, 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:755 +#: optimizer/util/plancat.c:758 #, 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:860 +#: optimizer/util/plancat.c:863 #, 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:775 parser/analyze.c:1489 +#: parser/analyze.c:818 parser/analyze.c:1532 #, 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:976 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT hat mehr Ausdrücke als Zielspalten" -#: parser/analyze.c:994 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT hat mehr Zielspalten als Ausdrücke" -#: parser/analyze.c:998 +#: parser/analyze.c:1041 #, 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:1297 parser/analyze.c:1682 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, 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:1612 parser/analyze.c:3355 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kann nicht auf VALUES angewendet werden" -#: parser/analyze.c:1848 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ungültige ORDER-BY-Klausel mit UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1849 +#: parser/analyze.c:1892 #, 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:1850 +#: parser/analyze.c:1893 #, 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:1955 +#: parser/analyze.c:1998 #, 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:2027 +#: parser/analyze.c:2070 #, 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:2114 +#: parser/analyze.c:2157 #, 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:2515 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING muss mindestens eine Spalte haben" -#: parser/analyze.c:2618 +#: parser/analyze.c:2664 #, 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:2679 +#: parser/analyze.c:2725 #, 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:2803 parser/analyze.c:2811 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "%s und %s können nicht beide angegeben werden" -#: parser/analyze.c:2831 +#: parser/analyze.c:2877 #, 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:2839 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s wird nicht unterstützt" -#: parser/analyze.c:2842 +#: parser/analyze.c:2888 #, 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:2850 +#: parser/analyze.c:2896 #, 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:2861 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s ist nicht gültig" -#: parser/analyze.c:2864 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Insensitive Cursor müssen READ ONLY sein." -#: parser/analyze.c:2930 +#: parser/analyze.c:2976 #, 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:2940 +#: parser/analyze.c:2986 #, 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:2950 +#: parser/analyze.c:2996 #, 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:2962 +#: parser/analyze.c:3008 #, 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:3151 +#: parser/analyze.c:3197 #, 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:3158 +#: parser/analyze.c:3204 #, 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:3165 +#: parser/analyze.c:3211 #, 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:3172 +#: parser/analyze.c:3218 #, 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:3179 +#: parser/analyze.c:3225 #, 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:3186 +#: parser/analyze.c:3232 #, 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:3278 +#: parser/analyze.c:3324 #, 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:3328 +#: parser/analyze.c:3374 #, 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:3337 +#: parser/analyze.c:3383 #, 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:3346 +#: parser/analyze.c:3392 #, 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:3364 +#: parser/analyze.c:3410 #, 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:3373 +#: parser/analyze.c:3419 #, 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:3393 +#: parser/analyze.c:3439 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "Relation »%s« in %s nicht in der FROM-Klausel gefunden" -#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#: parser/parse_agg.c:208 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "konnte keine Sortieroperator für Typ %s ermitteln" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:210 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Aggregatfunktionen mit DISTINCT müssen ihre Eingaben sortieren können." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:268 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING muss weniger als 32 Argumente haben" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:371 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "Aggregatfunktionen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:373 msgid "grouping operations are not allowed in JOIN conditions" msgstr "Gruppieroperationen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "Aggregatfunktionen sind nicht in der FROM-Klausel ihrer eigenen Anfrageebene erlaubt" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "Gruppieroperationen sind nicht in der FROM-Klausel ihrer eigenen Anfrageebene erlaubt" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "Aggregatfunktionen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "Gruppieroperationen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "Aggregatfunktionen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "Gruppieroperationen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "Aggregatfunktionen sind in der Fenster-RANGE-Klausel nicht erlaubt" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "Gruppieroperationen sind in der Fenster-RANGE-Klausel nicht erlaubt" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "Aggregatfunktionen sind in der Fenster-ROWS-Klausel nicht erlaubt" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "Gruppieroperationen sind in der Fenster-ROWS-Klausel nicht erlaubt" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "Aggregatfunktionen sind in der Fenster-GROUPS-Klausel nicht erlaubt" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 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:450 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "Aggregatfunktionen sind in MERGE-WHEN-Bedingungen nicht erlaubt" + +#: parser/parse_agg.c:452 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "Gruppieroperationen sind in MERGE-WHEN-Bedingungen nicht erlaubt" + +#: parser/parse_agg.c:478 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:480 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:487 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:489 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:494 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:496 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:501 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:503 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:508 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:510 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:515 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:517 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:522 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:524 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:529 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:531 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:536 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:538 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:543 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:545 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:551 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:553 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:559 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:561 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:567 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:569 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:1834 +#: parser/parse_agg.c:596 parser/parse_clause.c:1836 #, 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:599 #, c-format msgid "grouping operations are not allowed in %s" msgstr "Gruppieroperationen sind in %s nicht erlaubt" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:700 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "Aggregatfunktion auf äußerer Ebene kann keine Variable einer unteren Ebene in ihren direkten Argumenten haben" -#: parser/parse_agg.c:760 +#: parser/parse_agg.c:778 #, c-format 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:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 +#: parser/parse_agg.c:779 parser/parse_expr.c:1674 parser/parse_expr.c:2156 #: 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." -#: parser/parse_agg.c:766 +#: parser/parse_agg.c:784 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "Aufrufe von Aggregatfunktionen können keine Aufrufe von Fensterfunktionen enthalten" -#: parser/parse_agg.c:845 +#: parser/parse_agg.c:863 msgid "window functions are not allowed in JOIN conditions" msgstr "Fensterfunktionen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:870 msgid "window functions are not allowed in functions in FROM" msgstr "Fensterfunktionen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:858 +#: parser/parse_agg.c:876 msgid "window functions are not allowed in policy expressions" msgstr "Fensterfunktionen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:871 +#: parser/parse_agg.c:889 msgid "window functions are not allowed in window definitions" msgstr "Fensterfunktionen sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:900 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "Fensterfunktionen sind in MERGE-WHEN-Bedingungen nicht erlaubt" + +#: parser/parse_agg.c:924 msgid "window functions are not allowed in check constraints" msgstr "Fensterfunktionen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:928 msgid "window functions are not allowed in DEFAULT expressions" msgstr "Fensterfunktionen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:931 msgid "window functions are not allowed in index expressions" msgstr "Fensterfunktionen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:934 msgid "window functions are not allowed in statistics expressions" msgstr "Fensterfunktionen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:937 msgid "window functions are not allowed in index predicates" msgstr "Fensterfunktionen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:940 msgid "window functions are not allowed in transform expressions" msgstr "Fensterfunktionen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:943 msgid "window functions are not allowed in EXECUTE parameters" msgstr "Fensterfunktionen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:946 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:928 +#: parser/parse_agg.c:949 msgid "window functions are not allowed in partition bound" msgstr "Fensterfunktionen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:952 msgid "window functions are not allowed in partition key expressions" msgstr "Fensterfunktionen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:955 msgid "window functions are not allowed in CALL arguments" msgstr "Fensterfunktionen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:937 +#: parser/parse_agg.c:958 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:940 +#: parser/parse_agg.c:961 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:984 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" msgstr "Fensterfunktionen sind in %s nicht erlaubt" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1018 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "Fenster »%s« existiert nicht" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1102 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "zu viele Grouping-Sets vorhanden (maximal 4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1242 #, 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:1414 +#: parser/parse_agg.c:1435 #, 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:1417 +#: parser/parse_agg.c:1438 #, 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:1422 +#: parser/parse_agg.c:1443 #, 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:1586 +#: parser/parse_agg.c:1607 #, 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" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format 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:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 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:610 +#: parser/parse_clause.c:612 #, 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:643 +#: parser/parse_clause.c:645 #, 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:644 +#: parser/parse_clause.c:646 #, 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:650 +#: parser/parse_clause.c:652 #, 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:651 +#: parser/parse_clause.c:653 #, 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:658 +#: parser/parse_clause.c:660 #, 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:659 +#: parser/parse_clause.c:661 #, 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:759 +#: 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:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "Spaltenname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "Namensraumname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "nur ein Standardnamensraum ist erlaubt" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "Tablesample-Methode %s existiert nicht" -#: parser/parse_clause.c:954 +#: 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:988 +#: 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:1137 +#: parser/parse_clause.c:1139 #, 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:1327 +#: parser/parse_clause.c:1329 #, 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:1342 +#: parser/parse_clause.c:1344 #, 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:1351 +#: parser/parse_clause.c:1353 #, 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:1366 +#: parser/parse_clause.c:1368 #, 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:1375 +#: parser/parse_clause.c:1377 #, 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:1779 +#: parser/parse_clause.c:1781 #, 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:1804 +#: parser/parse_clause.c:1806 #, 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:1969 +#: parser/parse_clause.c:1971 #, 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:1998 +#: parser/parse_clause.c:1999 #, 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:2020 +#: parser/parse_clause.c:2021 #, 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:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE ist auf 12 Elemente begrenzt" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "Fenster »%s« ist bereits definiert" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, 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:2738 +#: parser/parse_clause.c:2739 #, 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:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, 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:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Lassen Sie die Klammern in dieser OVER-Klausel weg." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, 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:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-Modus erfordert eine ORDER-BY-Klausel" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, 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:2890 +#: parser/parse_clause.c:2892 #, 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:2922 +#: parser/parse_clause.c:2924 #, 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:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT muss mindestens eine Spalte haben" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, 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:3099 +#: parser/parse_clause.c:3101 #, 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:3105 +#: parser/parse_clause.c:3107 #, 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:3184 +#: parser/parse_clause.c:3186 #, 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:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Zum Bespiel ON CONFLICT (Spaltenname)." -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, 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:3204 +#: parser/parse_clause.c:3206 #, 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:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "Operator %s ist kein gültiger Sortieroperator" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, 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:3647 +#: parser/parse_clause.c:3649 #, 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:3653 +#: parser/parse_clause.c:3655 #, 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:3656 +#: parser/parse_clause.c:3658 #, 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:3661 +#: parser/parse_clause.c:3663 #, 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:3664 +#: parser/parse_clause.c:3666 #, 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: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:2662 parser/parse_target.c:994 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "kann Typ %s nicht in Typ %s umwandeln" @@ -16177,19 +17032,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "als »%s« deklarierte Argumente sind nicht alle gleich" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:523 +#: utils/fmgr/funcapi.c:601 #, 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:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:537 +#: utils/fmgr/funcapi.c:615 #, 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:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, 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" @@ -16272,18 +17127,18 @@ 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:1005 #, 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:1008 #, 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:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "explizite Sortierfolgen »%s« und »%s« stimmen nicht überein" @@ -16313,372 +17168,377 @@ msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht in INTERSECT erscheinen msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht in EXCEPT erscheinen" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE wird in WITH-Anfragen nicht unterstützt" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WIHT-Anfragename »%s« mehrmals angegeben" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "konnte keinen Ist-Ungleich-Operator für Typ %s ermitteln" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "WITH-Klausel mit datenmodifizierender Anweisung muss auf der obersten Ebene sein" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "Spalte %2$d in rekursiver Anfrage »%1$s« hat Typ %3$s im nicht-rekursiven Teilausdruck aber Typ %4$s insgesamt" -#: parser/parse_cte.c:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Wandeln Sie die Ausgabe des nicht-rekursiven Teilausdrucks in den korrekten Typ um." -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "Spalte %2$d in rekursiver Anfrage »%1$s« hat Sortierfolge %3$s im nicht-rekursiven Teilausdruck aber Sortierfolge %4$s insgesamt" -#: parser/parse_cte.c:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Verwenden Sie die COLLATE-Klausel, um die Sortierfolge des nicht-rekursiven Teilsausdrucks zu setzen." -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "WITH-Anfrage ist nicht rekursiv" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "mit einer SEARCH- oder CYCLE-Klausel muss die linke Seite von UNION ein SELECT sein" -#: parser/parse_cte.c:455 +#: parser/parse_cte.c:462 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "mit einer SEARCH- oder CYCLE-Klausel muss mit rechte Seite von UNION ein SELECT sein" -#: parser/parse_cte.c:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "Search-Spalte »%s« ist nicht in der Spaltenliste der WITH-Anfrage" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "Search-Spalte »%s« mehrmals angegeben" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "Search-Sequenz-Spaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "Cycle-Spalte »%s« ist nicht in der Spaltenliste der WITH-Anfrage" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "Zyklusspalte »%s« mehrmals angegeben" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "Zyklusmarkierungsspaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "Zykluspfadspaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "Zyklusmarkierungsspaltenname und Zykluspfadspaltenname sind gleich" -#: parser/parse_cte.c:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "Search-Sequenz-Spaltenname und Zyklusmarkierungsspaltenname sind gleich" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "Search-Sequenz-Spaltenname und Zykluspfadspaltenname sind gleich" -#: parser/parse_cte.c:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH-Anfrage »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "gegenseitige Rekursion zwischen WITH-Elementen ist nicht implementiert" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "rekursive Anfrage »%s« darf keine datenmodifizierenden Anweisungen enthalten" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "rekursive Anfrage »%s« hat nicht die Form nicht-rekursiver-Ausdruck UNION [ALL] rekursiver-Ausdruck" -#: parser/parse_cte.c:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format 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:282 #, 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:3641 -#: parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "Spalte %s.%s existiert nicht" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, 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:353 #, 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:359 #, 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:739 +#: parser/parse_expr.c:390 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:512 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:515 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:1234 +#: parser/parse_expr.c:784 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:840 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:1040 #, 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:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, 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:1481 +#: parser/parse_expr.c:1477 #, 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:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 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:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "Unteranfragen können nicht in Check-Constraints verwendet werden" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "Unteranfragen können nicht in DEFAULT-Ausdrücken verwendet werden" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "Unteranfragen können nicht in Indexausdrücken verwendet werden" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "Unteranfragen können nicht im Indexprädikat verwendet werden" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" msgstr "Unteranfragen können nicht in Statistikausdrücken verwendet werden" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "Unteranfragen können in Umwandlungsausdrücken nicht verwendet werden" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "Unteranfragen können nicht in EXECUTE-Parameter verwendet werden" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 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:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "Unteranfragen können nicht in Partitionsbegrenzungen verwendet werden" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "Unteranfragen können nicht in Partitionierungsschlüsselausdrücken verwendet werden" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "Unteranfragen können nicht in CALL-Argument verwendet werden" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 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:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "Unteranfragen können nicht in Spaltengenerierungsausdrücken verwendet werden" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "Unteranfrage darf nur eine Spalte zurückgeben" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "Unteranfrage hat zu viele Spalten" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "Unteranfrage hat zu wenige Spalten" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "kann Typ eines leeren Arrays nicht bestimmen" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, 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:2015 +#: parser/parse_expr.c:2012 #, 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:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-Ausdrücke können höchstens %d Einträge haben" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "unbenannter XML-Attributwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2304 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "unbenannter XML-Elementwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2319 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-Attributname »%s« einscheint mehrmals" -#: parser/parse_expr.c:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kann das Ergebnis von XMLSERIALIZE nicht in Typ %s umwandeln" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "ungleiche Anzahl Einträge in Zeilenausdrücken" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "kann Zeilen mit Länge null nicht vergleichen" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, 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:2777 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "Zeilenvergleichsoperator darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "konnte Interpretation des Zeilenvergleichsoperators %s nicht bestimmen" -#: parser/parse_expr.c:2838 +#: parser/parse_expr.c:2835 #, 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:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Es gibt mehrere gleichermaßen plausible Kandidaten." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM erfordert, dass Operator = boolean ergibt" @@ -16966,59 +17826,88 @@ msgstr "Funktionen mit Ergebnismenge sind in Policy-Ausdrücken nicht erlaubt" msgid "set-returning functions are not allowed in window definitions" msgstr "Funktionen mit Ergebnismenge sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_func.c:2616 +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "Funktionen mit Ergebnismenge sind in MERGE-WHEN-Bedingungen 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:2620 +#: 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:2623 +#: 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:2626 +#: 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:2629 +#: 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:2632 +#: 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:2635 +#: 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:2638 +#: 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:2641 +#: 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:2644 +#: 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:2647 +#: 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:2650 +#: 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:2653 +#: 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_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WITH RECURSIVE wird für die MERGE-Anweisung nicht unterstützt" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "unerreichbare WHERE-Klausel nach einer WHERE-Klausel ohne Bedingung angegeben" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE wird für Relationen mit Regeln nicht unterstützt." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "Name »%s« mehrmals angegeben" + +#: parser/parse_merge.c:210 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "Der Name wird sowohl als MERGE-Zieltabelle als auch als Datenquelle verwendet." + +#: 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" @@ -17089,6 +17978,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" @@ -17104,12 +17998,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:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, 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:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, 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." @@ -17129,108 +18023,108 @@ 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:2343 +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "Systemspalte »%s« kann nicht in MERGE-WHEN-Bedingung verwendet werden" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, 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 +#: parser/parse_relation.c:1778 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "eine Spaltendefinitionsliste ist überflüssig bei einer Funktion mit OUT-Parametern" -#: parser/parse_relation.c:1773 +#: 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 ü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:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "Spaltendefinitionslisten können höchstens %d Einträge haben" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, 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:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "Funktionen in FROM können höchstens %d Spalten zurückgeben" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "Funktion %s hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, 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:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "Verbunde können höchstens %d Spalten haben" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "Verbundausdruck »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-Anfrage »%s« hat keine RETURNING-Klausel" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "Spalte %d von Relation »%s« existiert nicht" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, 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:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "fehlender Eintrag in FROM-Klausel für Tabelle »%s«" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, 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:3646 +#: parser/parse_relation.c:3664 #, 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:3663 +#: parser/parse_relation.c:3681 #, 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." @@ -17275,7 +18169,7 @@ msgstr "Wertzuweisung in Elemente von »%s« erfordert Typ %s, aber Ausdruck hat 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" -#: parser/parse_target.c:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * ist nicht gültig, wenn keine Tabellen angegeben sind" @@ -17295,8 +18189,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:394 -#: utils/cache/typcache.c:449 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" @@ -17306,12 +18200,12 @@ 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«" @@ -17321,320 +18215,325 @@ msgstr "ungültiger Typname: »%s«" msgid "cannot create partitioned table as inheritance child" msgstr "partitionierte Tabelle kann nicht als Vererbungskind erzeugt werden" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "Array aus Typ serial ist nicht implementiert" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, 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:684 +#: parser/parse_utilcmd.c:683 #, 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:701 +#: parser/parse_utilcmd.c:700 #, 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:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "Identitätsspalten in partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, 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:744 +#: parser/parse_utilcmd.c:743 #, 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:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "generierte Spalten in partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, 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:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, 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:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "Unique-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:825 +#: parser/parse_utilcmd.c:824 #, 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:833 +#: parser/parse_utilcmd.c:832 #, 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:841 +#: parser/parse_utilcmd.c:840 #, 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:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "Exclusion-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, 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:977 +#: parser/parse_utilcmd.c:976 #, 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:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "Relation »%s« ist ungültig in der LIKE-Klausel" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, 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:2249 +#: parser/parse_utilcmd.c:2252 #, 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:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "Index »%s« gehört bereits zu einem Constraint" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "»%s« ist kein Unique Index" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 -#: parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, 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:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "Index »%s« enthält Ausdrücke" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "»%s« ist ein partieller Index" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "»%s« ist ein aufschiebbarer Index" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, 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:2381 +#: parser/parse_utilcmd.c:2384 #, 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:2538 +#: parser/parse_utilcmd.c:2541 #, 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:2544 +#: parser/parse_utilcmd.c:2547 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "Spalte »%s« erscheint zweimal im Unique-Constraint" -#: parser/parse_utilcmd.c:2891 +#: parser/parse_utilcmd.c:2894 #, 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:2963 +#: parser/parse_utilcmd.c:2966 #, c-format 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:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "Regeln für materialisierte Sichten werden nicht unterstützt" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, 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:3142 +#: parser/parse_utilcmd.c:3145 #, 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:3160 parser/parse_utilcmd.c:3261 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 #: rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION/INTERSECTION/EXCEPT mit Bedingung sind nicht implementiert" -#: parser/parse_utilcmd.c:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON-SELECT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON-SELECT-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON-INSERT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON-DELETE-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "in WITH-Anfrage kann nicht auf OLD verweisen werden" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "in WITH-Anfrage kann nicht auf NEW verwiesen werden" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "falsch platzierte DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "mehrere DEFERRABLE/NOT DEFERRABLE-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "falsch platzierte NOT DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "falsch platzierte INITIALLY DEFERRED-Klausel" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "mehrere INITIALLY IMMEDIATE/DEFERRED-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "falsch platzierte INITIALLY IMMEDIATE-Klausel" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, 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:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "»%s« ist keine partitionierte Tabelle" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "Tabelle »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "Index »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, 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:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ungültige Begrenzungsangabe für eine Hash-Partition" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format 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:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, 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:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "ungültige Begrenzungsangabe für eine Listenpartition" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "ungültige Begrenzungsangabe für eine Bereichspartition" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, 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:4136 +#: parser/parse_utilcmd.c:4139 #, 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:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "NULL kann nicht in der Bereichsgrenze angegeben werden" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, 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:4306 +#: parser/parse_utilcmd.c:4309 #, 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:4349 +#: parser/parse_utilcmd.c:4352 #, 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" @@ -17647,12 +18546,12 @@ msgstr "auf UESCAPE muss eine einfache Zeichenkettenkonstante folgen" msgid "invalid Unicode escape character" msgstr "ungültiges Unicode-Escape-Zeichen" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 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:6555 +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 #, c-format msgid "invalid Unicode escape" msgstr "ungültiges Unicode-Escape" @@ -17662,8 +18561,8 @@ msgstr "ungültiges Unicode-Escape" 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:6580 +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 +#: utils/adt/varlena.c:6554 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ungültiges Unicode-Surrogatpaar" @@ -17673,74 +18572,74 @@ 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:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "Partition »%s« kollidiert mit bestehender Standardpartition »%s«" -#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 -#: partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, 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:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, 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:2893 +#: partitioning/partbounds.c:3005 #, 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:3028 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "leere Bereichsgrenze angegeben für Partition »%s«" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, 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:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "Partition »%s« würde sich mit Partition »%s« überlappen" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, 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:4715 +#: partitioning/partbounds.c:4828 #, c-format 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:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "»%s« ist keine Hash-partitionierte Tabelle" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, 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:4772 +#: partitioning/partbounds.c:4885 #, 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:4804 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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" @@ -17782,34 +18681,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:616 port/sysv_shmem.c:616 +#: 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:618 port/sysv_shmem.c:618 +#: 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:686 port/sysv_shmem.c:686 +#: 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:693 port/sysv_shmem.c:693 +#: 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:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1195 #, 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:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1197 #, 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." @@ -17838,37 +18737,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" @@ -17958,42 +18857,47 @@ msgstr "Fehlgeschlagener Systemaufruf war DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Fehlgeschlagener Systemaufruf war MapViewOfFileEx." -#: postmaster/autovacuum.c:410 +#: 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:1492 +#: postmaster/autovacuum.c:752 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "Autovacuum-Worker benötigte zu lange zum Starten; abgebrochen" + +#: 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:2298 +#: postmaster/autovacuum.c:2277 #, 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:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." @@ -18003,405 +18907,241 @@ 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 +#: postmaster/bgworker.c:666 #, 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" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "Background-Worker »%s«: Background-Worker ohne Shared-Memory-Zugriff werden nicht unterstützt" -#: 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:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, 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:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "Checkpoint-Anforderung fehlgeschlagen" -#: postmaster/checkpointer.c:1063 +#: 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:365 +#: postmaster/pgarch.c:423 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode ist an, aber archive_command ist nicht gesetzt" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode ist an, aber Archivierung wurde nicht konfiguriert" -#: postmaster/pgarch.c:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "verwaiste Archivstatusdatei »%s« wurde entfernt" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, 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:433 +#: postmaster/pgarch.c:491 #, 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:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "Archivbefehl ist fehlgeschlagen mit Statuscode %d" - -#: 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 "Der fehlgeschlagene Archivbefehl war: %s" - -#: postmaster/pgarch.c:543 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" - -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3758 -#, 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:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "Archivbefehl wurde von Signal %d beendet: %s" - -#: postmaster/pgarch.c:559 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "Archivbefehl hat mit unbekanntem Status %d beendet" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "konnte »localhost« nicht auflösen: %s" - -#: postmaster/pgstat.c:441 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "andere Adresse für Statistiksammelprozess wird versucht" - -#: postmaster/pgstat.c:450 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "konnte Socket für Statistiksammelprozess nicht erzeugen: %m" - -#: postmaster/pgstat.c:462 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "konnte Socket für Statistiksammelprozess nicht binden: %m" - -#: postmaster/pgstat.c:473 -#, 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:489 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "konnte nicht mit Socket für Statistiksammelprozess verbinden: %m" - -#: postmaster/pgstat.c:510 -#, 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:536 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() im Statistiksammelprozess fehlgeschlagen: %m" - -#: postmaster/pgstat.c:551 -#, 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:566 -#, 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:576 -#, 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:599 -#, 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:643 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "Statistiksammelprozess abgeschaltet wegen nicht funkionierender Socket" - -#: postmaster/pgstat.c:790 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "konnte Statistiksammelprozess nicht starten (fork-Fehler): %m" - -#: postmaster/pgstat.c:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "unbekanntes Reset-Ziel: »%s«" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "Das Reset-Ziel muss »archiver«, »bgwriter« oder »wal« sein." - -#: postmaster/pgstat.c:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "konnte Statistiknachricht nicht lesen: %m" - -#: postmaster/pgstat.c:3634 postmaster/pgstat.c:3819 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" - -#: postmaster/pgstat.c:3729 postmaster/pgstat.c:3864 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" - -#: postmaster/pgstat.c:3738 postmaster/pgstat.c:3873 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" - -#: postmaster/pgstat.c:3746 postmaster/pgstat.c:3881 -#, 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:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" - -#: 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 "verfälschte Statistikdatei »%s«" - -#: postmaster/pgstat.c:4634 -#, 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" - -#: postmaster/pgstat.c:4657 +#: postmaster/pgarch.c:798 #, 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" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "Archivierprozess wird neu gestartet, weil der Wert von »archive_library« geändert wurde" -#: postmaster/pgstat.c:4784 +#: postmaster/pgarch.c:831 #, 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" +msgid "archive modules have to define the symbol %s" +msgstr "Archivmodule müssen das Symbol %s definieren" -#: postmaster/pgstat.c:4997 +#: postmaster/pgarch.c:837 #, 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 "Archivmodule müssen einen Archiv-Callback registrieren" -#: 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:1128 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "Logausgabe nach stderr endet" -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Die weitere Logausgabe geht an Logziel »%s«." -#: postmaster/postmaster.c:1140 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "%s startet" -#: postmaster/postmaster.c:1161 postmaster/postmaster.c:1260 -#: utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "ungültige Listensyntax für Parameter »%s«" - -#: postmaster/postmaster.c:1192 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "konnte Listen-Socket für »%s« nicht erzeugen" -#: postmaster/postmaster.c:1198 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "konnte keine TCP/IP-Sockets erstellen" -#: postmaster/postmaster.c:1230 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() fehlgeschlagen: Fehlercode %ld" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1343 #, 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:1288 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "konnte keine Unix-Domain-Sockets erzeugen" -#: postmaster/postmaster.c:1300 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "keine Listen-Socket erzeugt" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1392 #, 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:1335 +#: postmaster/postmaster.c:1396 #, 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:1368 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "konnte pg_hba.conf nicht laden" -#: postmaster/postmaster.c:1394 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "Postmaster ist während des Starts multithreaded geworden" -#: postmaster/postmaster.c:1395 +#: postmaster/postmaster.c:1450 #, 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:1490 +#: postmaster/postmaster.c:1551 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: konnte Pfad des eigenen Programs nicht finden" -#: postmaster/postmaster.c:1497 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: konnte kein passendes Programm »postgres« finden" -#: postmaster/postmaster.c:1520 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 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:1547 +#: postmaster/postmaster.c:1608 #, c-format msgid "" "%s: could not find the database system\n" @@ -18412,232 +19152,228 @@ msgstr "" "Es wurde im Verzeichnis »%s« erwartet,\n" "aber die Datei »%s« konnte nicht geöffnet werden: %s\n" -#: postmaster/postmaster.c:1724 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() fehlgeschlagen im Postmaster: %m" -#: postmaster/postmaster.c:1860 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "SIGKILL wird an ungehorsame Kinder gesendet" -#: postmaster/postmaster.c:1881 +#: postmaster/postmaster.c:1937 #, 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:1984 postmaster/postmaster.c:2012 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "unvollständiges Startpaket" -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "ungültige Länge des Startpakets" -#: postmaster/postmaster.c:2058 +#: postmaster/postmaster.c:2114 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2076 +#: postmaster/postmaster.c:2132 #, c-format msgid "received unencrypted data after SSL request" msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, 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:2102 +#: postmaster/postmaster.c:2158 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: postmaster/postmaster.c:2120 +#: postmaster/postmaster.c:2176 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" -#: postmaster/postmaster.c:2144 +#: postmaster/postmaster.c:2200 #, 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:2208 utils/misc/guc.c:7126 utils/misc/guc.c:7162 -#: utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11538 -#: utils/misc/guc.c:11579 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8944 utils/misc/guc.c:11986 +#: utils/misc/guc.c:12027 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" -#: postmaster/postmaster.c:2211 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2312 #, 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:2273 +#: postmaster/postmaster.c:2329 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" -#: postmaster/postmaster.c:2337 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "das Datenbanksystem startet" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2399 #, c-format msgid "the database system is not yet accepting connections" msgstr "das Datenbanksystem nimmt noch keine Verbindungen an" -#: postmaster/postmaster.c:2344 +#: postmaster/postmaster.c:2400 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Konsistenter Wiederherstellungszustand wurde noch nicht erreicht." -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2404 #, c-format msgid "the database system is not accepting connections" msgstr "das Datenbanksystem nimmt keine Verbindungen an" -#: postmaster/postmaster.c:2349 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "Hot-Standby-Modus ist deaktiviert." -#: postmaster/postmaster.c:2354 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "das Datenbanksystem fährt herunter" -#: postmaster/postmaster.c:2359 +#: postmaster/postmaster.c:2415 #, c-format msgid "the database system is in recovery mode" msgstr "das Datenbanksystem ist im Wiederherstellungsmodus" -#: postmaster/postmaster.c:2364 storage/ipc/procarray.c:499 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 +#: 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:2454 +#: postmaster/postmaster.c:2507 #, c-format msgid "wrong key in cancel request for process %d" msgstr "falscher Schlüssel in Stornierungsanfrage für Prozess %d" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2519 #, 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:2720 +#: postmaster/postmaster.c:2773 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP empfangen, Konfigurationsdateien werden neu geladen" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2746 postmaster/postmaster.c:2750 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s wurde nicht neu geladen" -#: postmaster/postmaster.c:2760 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-Konfiguration wurde nicht neu geladen" -#: postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "intelligentes Herunterfahren verlangt" -#: postmaster/postmaster.c:2862 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "schnelles Herunterfahren verlangt" -#: postmaster/postmaster.c:2880 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "etwaige aktive Transaktionen werden abgebrochen" -#: postmaster/postmaster.c:2904 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "sofortiges Herunterfahren verlangt" -#: postmaster/postmaster.c:2981 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "Herunterfahren beim Wiederherstellungsziel" -#: postmaster/postmaster.c:2999 postmaster/postmaster.c:3035 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "Startprozess" -#: postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:3048 #, c-format msgid "aborting startup due to startup process failure" msgstr "Serverstart abgebrochen wegen Startprozessfehler" -#: postmaster/postmaster.c:3077 +#: postmaster/postmaster.c:3121 #, c-format msgid "database system is ready to accept connections" msgstr "Datenbanksystem ist bereit, um Verbindungen anzunehmen" -#: postmaster/postmaster.c:3098 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "Background-Writer-Prozess" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "Checkpointer-Prozess" -#: postmaster/postmaster.c:3168 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "WAL-Schreibprozess" -#: postmaster/postmaster.c:3183 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "WAL-Receiver-Prozess" -#: postmaster/postmaster.c:3198 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "Autovacuum-Launcher-Prozess" -#: postmaster/postmaster.c:3216 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "Archivierprozess" -#: postmaster/postmaster.c:3231 -msgid "statistics collector process" -msgstr "Statistiksammelprozess" - -#: postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "Systemlogger-Prozess" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "Background-Worker »%s«" -#: postmaster/postmaster.c:3393 postmaster/postmaster.c:3413 -#: postmaster/postmaster.c:3420 postmaster/postmaster.c:3438 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 +#: postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "Serverprozess" -#: postmaster/postmaster.c:3492 +#: postmaster/postmaster.c:3508 #, c-format msgid "terminating any other active server processes" msgstr "aktive Serverprozesse werden abgebrochen" @@ -18662,6 +19398,11 @@ msgstr "Der fehlgeschlagene Prozess führte aus: %s" msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) wurde durch Ausnahme 0x%X beendet" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, 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:3766 @@ -18676,543 +19417,440 @@ msgstr "%s (PID %d) wurde von Signal %d beendet: %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) beendete mit unbekanntem Status %d" -#: postmaster/postmaster.c:3992 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "abnormales Herunterfahren des Datenbanksystems" -#: postmaster/postmaster.c:4030 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" msgstr "fahre herunter wegen Startprozessfehler" -#: postmaster/postmaster.c:4036 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "fahre herunter, weil restart_after_crash aus ist" -#: postmaster/postmaster.c:4048 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alle Serverprozesse beendet; initialisiere neu" -#: postmaster/postmaster.c:4222 postmaster/postmaster.c:5573 -#: postmaster/postmaster.c:5964 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 +#: postmaster/postmaster.c:5920 #, c-format msgid "could not generate random cancel key" msgstr "konnte zufälligen Stornierungsschlüssel nicht erzeugen" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4256 #, 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:4318 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): " -#: postmaster/postmaster.c:4424 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "Verbindung empfangen: Host=%s Port=%s" -#: postmaster/postmaster.c:4429 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "Verbindung empfangen: Host=%s" -#: postmaster/postmaster.c:4672 +#: postmaster/postmaster.c:4646 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "konnte Serverprozess »%s« nicht ausführen: %m" -#: postmaster/postmaster.c:4730 +#: postmaster/postmaster.c:4704 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "konnte Backend-Parameter-Datei-Mapping nicht erzeugen: Fehlercode %lu" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4713 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "konnte Backend-Parameter-Speicher nicht mappen: Fehlercode %lu" -#: postmaster/postmaster.c:4766 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "Kommandozeile für Subprozess zu lang" -#: postmaster/postmaster.c:4784 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "Aufruf von CreateProcess() fehlgeschlagen: %m (Fehlercode %lu)" -#: postmaster/postmaster.c:4811 +#: postmaster/postmaster.c:4785 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "konnte Sicht der Backend-Parameter-Datei nicht unmappen: Fehlercode %lu" -#: postmaster/postmaster.c:4815 +#: postmaster/postmaster.c:4789 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "konnte Handle für Backend-Parameter-Datei nicht schließen: Fehlercode %lu" -#: postmaster/postmaster.c:4837 +#: postmaster/postmaster.c:4811 #, 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:4838 +#: postmaster/postmaster.c:4812 #, 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:5020 +#: postmaster/postmaster.c:4985 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL-Konfiguration konnte im Kindprozess nicht geladen werden" -#: postmaster/postmaster.c:5146 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "Bitte berichten Sie dies an <%s>." -#: postmaster/postmaster.c:5233 +#: postmaster/postmaster.c:5182 #, c-format msgid "database system is ready to accept read-only connections" msgstr "Datenbanksystem ist bereit, um lesende Verbindungen anzunehmen" -#: postmaster/postmaster.c:5497 +#: postmaster/postmaster.c:5446 #, c-format msgid "could not fork startup process: %m" msgstr "konnte Startprozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5501 +#: postmaster/postmaster.c:5450 #, c-format msgid "could not fork archiver process: %m" msgstr "konnte Archivierer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5505 +#: postmaster/postmaster.c:5454 #, c-format msgid "could not fork background writer process: %m" msgstr "konnte Background-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5509 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "konnte Checkpointer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5513 +#: postmaster/postmaster.c:5462 #, c-format msgid "could not fork WAL writer process: %m" msgstr "konnte WAL-Writer-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5517 +#: postmaster/postmaster.c:5466 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "konnte WAL-Receiver-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5521 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "konnte Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5722 postmaster/postmaster.c:5745 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, 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:5729 postmaster/postmaster.c:5752 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, c-format msgid "invalid processing mode in background worker" msgstr "ungültiger Verarbeitungsmodus in Background-Worker" -#: postmaster/postmaster.c:5837 +#: postmaster/postmaster.c:5794 #, c-format msgid "could not fork worker process: %m" msgstr "konnte Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:5950 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "kein Slot für neuen Worker-Prozess verfügbar" -#: postmaster/postmaster.c:6284 +#: postmaster/postmaster.c:6237 #, 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:6316 +#: postmaster/postmaster.c:6269 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "konnte geerbtes Socket nicht erzeugen: Fehlercode %d\n" -#: postmaster/postmaster.c:6345 +#: postmaster/postmaster.c:6298 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "konnte Servervariablendatei »%s« nicht öffnen: %s\n" -#: postmaster/postmaster.c:6352 +#: postmaster/postmaster.c:6305 #, 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:6361 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "konnte Datei »%s« nicht löschen: %s\n" -#: postmaster/postmaster.c:6378 +#: postmaster/postmaster.c:6331 #, 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:6387 +#: postmaster/postmaster.c:6340 #, 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:6394 +#: postmaster/postmaster.c:6347 #, 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:6556 +#: postmaster/postmaster.c:6506 #, c-format msgid "could not read exit code for process\n" msgstr "konnte Exitcode des Prozesses nicht lesen\n" -#: postmaster/postmaster.c:6598 +#: postmaster/postmaster.c:6548 #, 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 -#, 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 -#, c-format -msgid "could not create pipe for syslog: %m" -msgstr "konnte Pipe für Syslog nicht erzeugen: %m" - -#: postmaster/syslogger.c:636 -#, c-format -msgid "could not fork system logger: %m" -msgstr "konnte Systemlogger nicht starten (fork-Fehler): %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "Logausgabe wird an Logsammelprozess umgeleitet" - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "Die weitere Logausgabe wird im Verzeichnis »%s« erscheinen." - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "konnte Standardausgabe nicht umleiten: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "konnte Standardfehlerausgabe nicht umleiten: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "konnte nicht in Logdatei schreiben: %s\n" - -#: postmaster/syslogger.c:1225 -#, 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 -#, 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 -#, 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 -#, 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:345 repl_gram.y:377 -#, c-format -msgid "invalid timeline %u" -msgstr "ungültige Zeitleiste %u" - -#: repl_scanner.l:150 -msgid "invalid streaming start location" -msgstr "ungültige Streaming-Startposition" - -#: repl_scanner.l:206 scan.l:717 -msgid "unterminated quoted string" -msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" - -#: replication/backup_manifest.c:251 -#, 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:275 -#, 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:302 -#, 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:353 -#, c-format -msgid "could not rewind temporary file" -msgstr "konnte Position in temporärer Datei nicht auf Anfang setzen" - -#: replication/backup_manifest.c:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "konnte nicht aus temporärer Datei lesen: es wurden nur %zu von %zu Bytes gelesen" - -#: replication/basebackup.c:546 +#: postmaster/shell_archive.c:123 #, c-format -msgid "could not find any WAL files" -msgstr "konnte keine WAL-Dateien finden" +msgid "archive command failed with exit code %d" +msgstr "Archivbefehl ist fehlgeschlagen mit Statuscode %d" -#: replication/basebackup.c:561 replication/basebackup.c:577 -#: replication/basebackup.c:586 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "could not find WAL file \"%s\"" -msgstr "konnte WAL-Datei »%s« nicht finden" +msgid "The failed archive command was: %s" +msgstr "Der fehlgeschlagene Archivbefehl war: %s" -#: replication/basebackup.c:629 replication/basebackup.c:659 +#: postmaster/shell_archive.c:132 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "unerwartete WAL-Dateigröße »%s«" +msgid "archive command was terminated by exception 0x%X" +msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" -#: replication/basebackup.c:644 replication/basebackup.c:1777 +#: postmaster/shell_archive.c:139 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "Basissicherung konnte keine Daten senden, Sicherung abgebrochen" +msgid "archive command was terminated by signal %d: %s" +msgstr "Archivbefehl wurde von Signal %d beendet: %s" -#: replication/basebackup.c:722 +#: postmaster/shell_archive.c:148 #, 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" +msgid "archive command exited with unrecognized status %d" +msgstr "Archivbefehl hat mit unbekanntem Status %d beendet" -#: replication/basebackup.c:729 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "checksum verification failure during base backup" -msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" +msgid "could not read from logger pipe: %m" +msgstr "konnte nicht aus Logger-Pipe lesen: %m" -#: 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 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "duplicate option \"%s\"" -msgstr "doppelte Option »%s«" +msgid "could not create pipe for syslog: %m" +msgstr "konnte Pipe für Syslog nicht erzeugen: %m" -#: replication/basebackup.c:842 +#: postmaster/syslogger.c:677 #, 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)" +msgid "could not fork system logger: %m" +msgstr "konnte Systemlogger nicht starten (fork-Fehler): %m" -#: replication/basebackup.c:887 +#: postmaster/syslogger.c:713 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "unbekannte Manifestoption: »%s«" +msgid "redirecting log output to logging collector process" +msgstr "Logausgabe wird an Logsammelprozess umgeleitet" -#: replication/basebackup.c:903 +#: postmaster/syslogger.c:714 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "unbekannter Prüfsummenalgorithmus: »%s«" +msgid "Future log output will appear in directory \"%s\"." +msgstr "Die weitere Logausgabe wird im Verzeichnis »%s« erscheinen." -#: replication/basebackup.c:918 +#: postmaster/syslogger.c:722 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" +msgid "could not redirect stdout: %m" +msgstr "konnte Standardausgabe nicht umleiten: %m" -#: replication/basebackup.c:1525 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "skipping special file \"%s\"" -msgstr "überspringe besondere Datei »%s«" +msgid "could not redirect stderr: %m" +msgstr "konnte Standardfehlerausgabe nicht umleiten: %m" -#: replication/basebackup.c:1646 +#: postmaster/syslogger.c:1177 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ungültige Segmentnummer %d in Datei »%s«" +msgid "could not write to log file: %s\n" +msgstr "konnte nicht in Logdatei schreiben: %s\n" -#: replication/basebackup.c:1684 +#: postmaster/syslogger.c:1295 #, 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" +msgid "could not open log file \"%s\": %m" +msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: replication/basebackup.c:1757 +#: postmaster/syslogger.c:1385 #, 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" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "automatische Rotation abgeschaltet (SIGHUP zum Wiederanschalten verwenden)" -#: replication/basebackup.c:1764 +#: regex/regc_pg_locale.c:242 #, 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" +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" -#: replication/basebackup.c:1822 +#: regex/regc_pg_locale.c:265 #, 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" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "nichtdeterministische Sortierfolgen werden von regulären Ausdrücken nicht unterstützt" -#: replication/basebackup.c:1858 +#: repl_gram.y:303 repl_gram.y:335 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "Dateiname zu lang für Tar-Format: »%s«" +msgid "invalid timeline %u" +msgstr "ungültige Zeitleiste %u" -#: replication/basebackup.c:1863 -#, 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«" +#: repl_scanner.l:142 +msgid "invalid streaming start location" +msgstr "ungültige Streaming-Startposition" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: repl_scanner.l:199 scan.l:724 +msgid "unterminated quoted string" +msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "konnte Suchpfad nicht auf leer setzen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "ungültige Syntax für Verbindungszeichenkette: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "konnte Verbindungsparameter nicht interpretieren: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, 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:371 -#: replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:388 +#: replication/libpqwalreceiver/libpqwalreceiver.c:626 #, c-format msgid "invalid response from primary server" msgstr "ungültige Antwort vom Primärserver" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:389 #, 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:448 -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:469 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:506 #, c-format msgid "could not start WAL streaming: %s" msgstr "konnte WAL-Streaming nicht starten: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:530 #, 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:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "unerwartete Ergebnismenge nach End-of-Streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:568 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "Fehler beim Beenden des COPY-Datenstroms: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:578 #, c-format msgid "error reading result of streaming command: %s" msgstr "Fehler beim Lesen des Ergebnisses von Streaming-Befehl: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 -#: replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:825 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "unerwartetes Ergebnis nach CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:614 #, 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:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:627 #, 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:767 -#: replication/libpqwalreceiver/libpqwalreceiver.c:820 -#: replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:841 +#: replication/libpqwalreceiver/libpqwalreceiver.c:848 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:868 #, 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:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:960 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1006 #, c-format msgid "invalid query response" msgstr "ungültige Antwort auf Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1007 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d Felder erwartet, %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1077 #, c-format msgid "the query interface requires a database connection" msgstr "Ausführen von Anfragen benötigt eine Datenbankverbindung" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1108 msgid "empty query" msgstr "leere Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1114 msgid "unexpected pipeline mode" 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." @@ -19252,111 +19890,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:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "starte logisches Dekodieren für Slot »%s«" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, 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 +#: replication/logical/logical.c:720 #, 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 +#: replication/logical/logical.c:726 #, 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:873 replication/logical/logical.c:918 -#: replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, 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/logical.c:1241 replication/logical/logical.c:1290 -#: replication/logical/logical.c:1331 replication/logical/logical.c:1417 -#: replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisches Streaming benötigt einen %s-Callback" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, 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:104 replication/slotfuncs.c:34 -#, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "nur Superuser und Replikationsrollen können Replikations-Slots verwenden" - -#: replication/logical/logicalfuncs.c:134 +#: 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:1128 +#: utils/adt/jsonb.c:1302 #, 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 +#: 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" @@ -19368,18 +20001,18 @@ msgstr "Replication-Origin »%s« existiert nicht" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "konnte keine freie Replication-Origin-OID finden" +msgid "could not find free replication origin ID" +msgstr "konnte keine freie Replication-Origin-ID finden" #: replication/logical/origin.c:355 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" -msgstr "konnte Replication-Origin mit OID %d nicht löschen, wird von PID %d verwendet" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "konnte Replication-Origin mit ID %d nicht löschen, wird von PID %d verwendet" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "Replication-Origin mit OID %u existiert nicht" +msgid "replication origin with ID %d does not exist" +msgstr "Replication-Origin mit ID %d existiert nicht" #: replication/logical/origin.c:741 #, c-format @@ -19393,47 +20026,47 @@ msgstr "konnte keinen freien Replication-State finden, erhöhen Sie max_replicat #: replication/logical/origin.c:790 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "Replikationszustand von Knoten %u auf %X/%X wiederhergestellt" +msgid "recovered replication state of node %d to %X/%X" +msgstr "Replikationszustand von Knoten %d 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" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "Replication-Origin mit ID %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" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "konnte keinen freien Replication-State-Slot für Replication-Origin mit ID %d finden" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, 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." @@ -19465,418 +20098,503 @@ msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, 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:4180 -#: replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, 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:4184 -#: replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, 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:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, 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:637 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "initialer Slot-Snapshot ist zu groß" -#: replication/logical/snapbuild.c:691 +#: replication/logical/snapbuild.c:700 #, 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:1370 replication/logical/snapbuild.c:1477 -#: replication/logical/snapbuild.c:2008 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 +#: replication/logical/snapbuild.c:2015 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisches Dekodieren fand konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "Keine laufenden Transaktionen." -#: replication/logical/snapbuild.c:1428 +#: replication/logical/snapbuild.c:1437 #, 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:1430 replication/logical/snapbuild.c:1454 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, 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:1452 +#: replication/logical/snapbuild.c:1461 #, 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:1479 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "Es laufen keine alten Transaktionen mehr." -#: replication/logical/snapbuild.c:1876 +#: replication/logical/snapbuild.c:1883 #, 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:1882 +#: replication/logical/snapbuild.c:1889 #, 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:1953 +#: replication/logical/snapbuild.c:1960 #, 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:2010 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logische Dekodierung beginnt mit gespeichertem Snapshot." -#: replication/logical/snapbuild.c:2082 +#: replication/logical/snapbuild.c:2089 #, 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:727 replication/logical/tablesync.c:770 +#: 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 "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten, damit two_phase eingeschaltet werden kann" + +#: replication/logical/tablesync.c:741 replication/logical/tablesync.c:882 #, 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:734 +#: replication/logical/tablesync.c:748 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Tabelle »%s.%s« nicht auf dem Publikationsserver gefunden" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:805 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "konnte Spaltenlisteninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" + +#: replication/logical/tablesync.c:984 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "konnte WHERE-Klausel-Informationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" + +#: replication/logical/tablesync.c:1129 #, 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:1059 +#: replication/logical/tablesync.c:1341 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "Benutzer »%s« kann nicht in eine Relation mit Sicherheit auf Zeilenebene replizieren: »%s«" + +#: replication/logical/tablesync.c:1356 #, 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: %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1398 #, c-format msgid "replication origin \"%s\" already exists" msgstr "Replication-Origin »%s« existiert bereits" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1411 #, 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: %s" -#: replication/logical/worker.c:518 -#, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" -msgstr "Verarbeiten empfangener Daten für Replikationszielrelation »%s.%s« Spalte »%s«" - -#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "falsches Binärdatenformat in Spalte %d in logischer Replikation" -#: replication/logical/worker.c:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" msgstr "konnte nicht aus der Änderungsdatei »%s« einer gestreamten Transaktion lesen: es wurden nur %zu von %zu Bytes gelesen" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2251 +#: replication/logical/worker.c:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "ungültiger Nachrichtentyp für logische Replikation »??? (%d)«" + +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, 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:2550 +#: replication/logical/worker.c:3059 #, 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:2564 +#: replication/logical/worker.c:3070 #, 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:2586 +#: replication/logical/worker.c:3096 #, 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 wegen einer Parameteränderung" -#: replication/logical/worker.c:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" msgstr "konnte nicht aus der subxact-Datei »%s« einer gestreamten Transaktion lesen: es wurden nur %zu von %zu Bytes gelesen" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, 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:3170 +#: replication/logical/worker.c:3679 #, 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:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "logische Replikation beginnt Überspringen von Transaktion bei %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "logische Replikation beendet Überspringen von Transaktion bei %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "Skip-LSN von Subskription »%s« gelöscht" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "Die WAL-Endposition (LSN) %X/%X der Remote-Transaktion stimmte nicht mit der Skip-LSN %X/%X überein." + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s«" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u, beendet bei %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u, beendet bei %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u, beendet bei %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "ungültige proto_version" -#: replication/pgoutput/pgoutput.c:201 +#: 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:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "ungültige Syntax für publication_names" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, 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:295 +#: replication/pgoutput/pgoutput.c:432 #, 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:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "Parameter »publication_names« fehlt" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "Streaming angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" -#: replication/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "angeforderte proto_version=%d unterstützt Zwei-Phasen-Commit nicht, benötigt %d oder höher" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "Zwei-Phasen-Commit angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "Replikations-Slot-Name »%s« ist zu kurz" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "Replikations-Slot-Name »%s« ist zu lang" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "Replikations-Slot-Name »%s« enthält ungültiges Zeichen" -#: replication/slot.c:204 +#: replication/slot.c:229 #, 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:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "Replikations-Slot »%s« existiert bereits" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "alle Replikations-Slots sind in Benutzung" -#: replication/slot.c:269 +#: replication/slot.c:294 #, 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:402 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Replikations-Slot »%s« ist aktiv für PID %d" -#: replication/slot.c:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, 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:1065 +#: replication/slot.c:1133 #, 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:1250 +#: replication/slot.c:1145 +#, 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:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, 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:1747 +#: replication/slot.c:1827 #, 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:1754 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:1790 +#: replication/slot.c:1870 #, 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:1824 +#: replication/slot.c:1904 #, 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:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Ändern Sie wal_level in logical oder höher." -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, 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:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Ändern Sie wal_level in replica oder höher." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, 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." @@ -19916,415 +20634,425 @@ 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:161 +#: 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:289 +#: 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:336 +#: 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:337 +#: 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:348 +#: 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:402 +#: 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:406 +#: 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:435 +#: 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:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "Replikation wurde durch Primärserver beendet" -#: replication/walreceiver.c:473 +#: 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:562 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung" -#: replication/walreceiver.c:600 +#: 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:616 replication/walreceiver.c:1036 +#: 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:735 +#: 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:927 +#: 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "%s kann nicht mit einem logischem Replikations-Slot verwendet werden" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, 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:529 +#: replication/walsender.c:642 #, 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:580 -#, 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:609 +#: replication/walsender.c:719 #, 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:678 +#: replication/walsender.c:785 #, 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:681 +#: replication/walsender.c:788 #, 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:725 +#: replication/walsender.c:832 #, 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:1015 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "unbekannter Wert für CREATE_REPLICATION_SLOT-Option »%s«: »%s«" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:975 +#: replication/walsender.c:1100 #, 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:985 +#: replication/walsender.c:1110 #, 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:991 +#: replication/walsender.c:1116 #, 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:997 +#: replication/walsender.c:1122 #, 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:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s darf nicht in einer Subtransaktion aufgerufen werden" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "kann nicht aus logischem Replikations-Slot »%s« lesen" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, 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:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, 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:1587 +#: replication/walsender.c:1739 #, 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:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 -#: tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 -#: tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, 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:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "unerwartetes EOF auf Standby-Verbindung" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, 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:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, 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:951 +#, 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:543 +#: rewrite/rewriteDefine.c:544 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "Nicht-Sicht-Regel für »%s« darf nicht »%s« heißen" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, 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:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-Liste hat zu viele Einträge" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, 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:734 +#: rewrite/rewriteDefine.c:735 #, 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:740 +#: rewrite/rewriteDefine.c:741 #, 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:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-Targeteintrag heißt »%s«." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, 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:753 +#: rewrite/rewriteDefine.c:754 #, 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:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, 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:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, 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:775 +#: rewrite/rewriteDefine.c:776 #, 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:777 +#: rewrite/rewriteDefine.c:778 #, 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:794 +#: rewrite/rewriteDefine.c:795 #, 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:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-Liste hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: 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:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "Umbenennen einer ON-SELECT-Regel ist nicht erlaubt" @@ -20369,158 +21097,158 @@ msgstr "Spalte »%s« kann nur auf DEFAULT aktualisiert werden" msgid "multiple assignments to same column \"%s\"" msgstr "mehrere Zuweisungen zur selben Spalte »%s«" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Regeln für Relation »%s«" -#: rewrite/rewriteHandler.c:2224 +#: rewrite/rewriteHandler.c:2228 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Policys für Relation »%s«" -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "Junk-Sichtspalten sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 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:2552 +#: rewrite/rewriteHandler.c:2556 msgid "View columns that refer to system columns are not updatable." msgstr "Sichtspalten, die auf Systemspalten verweisen, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2555 +#: rewrite/rewriteHandler.c:2559 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:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Sichten, die DISTINCT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Sichten, die GROUP BY enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "Sichten, die HAVING enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 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:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "Sichten, die WITH enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Sichten, die LIMIT oder OFFSET enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2647 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Sichten, die Aggregatfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2646 +#: rewrite/rewriteHandler.c:2650 msgid "Views that return window functions are not automatically updatable." msgstr "Sichten, die Fensterfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2649 +#: rewrite/rewriteHandler.c:2653 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:2656 rewrite/rewriteHandler.c:2660 -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2672 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:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Sichten, die TABLESAMPLE enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 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:3172 +#: rewrite/rewriteHandler.c:3176 #, 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:3180 +#: rewrite/rewriteHandler.c:3184 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kann Spalte »%s« von Sicht »%s« nicht aktualisieren" -#: rewrite/rewriteHandler.c:3665 +#: rewrite/rewriteHandler.c:3675 #, 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:3676 +#: rewrite/rewriteHandler.c:3686 #, 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:3690 +#: rewrite/rewriteHandler.c:3700 #, 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:3694 +#: rewrite/rewriteHandler.c:3704 #, 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:3699 +#: rewrite/rewriteHandler.c:3709 #, 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:3929 rewrite/rewriteHandler.c:3937 -#: rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 +#: rewrite/rewriteHandler.c:3992 #, 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:4050 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "INSERT RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "UPDATE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "DELETE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, 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:4141 +#: rewrite/rewriteHandler.c:4188 #, 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" @@ -20543,103 +21271,111 @@ msgstr "NEW-Variablen in ON UPDATE-Regeln können nicht auf Spalten verweisen, d #: 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 "mit einer SEARCH- oder CYCLE-Klausel muss der rekursive Verweis auf WITH-Anfrage »%s« auf der obersten Ebene des rechten SELECT sein" +msgstr "mit einer SEARCH- oder CYCLE-Klausel muss der rekursive Verweis auf WITH-Anfrage »%s« auf der obersten Ebene ihres rechten SELECT sein" -#: scan.l:458 +#: 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'." @@ -20670,57 +21406,57 @@ msgstr "unbekannter Snowball-Parameter: »%s«" msgid "missing Language parameter" msgstr "Parameter »Language« fehlt" -#: statistics/extended_stats.c:178 +#: 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/mcv.c:1371 utils/adt/jsonfuncs.c:1952 +#: 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:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, 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:843 +#: storage/buffer/bufmgr.c:851 #, 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:930 +#: storage/buffer/bufmgr.c:938 #, 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:932 +#: storage/buffer/bufmgr.c:940 #, 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:1031 +#: storage/buffer/bufmgr.c:1039 #, 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:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "konnte Block %u von %s nicht schreiben" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Mehrere Fehlschläge --- Schreibfehler ist möglicherweise dauerhaft." -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "schreibe Block %u von Relation %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "Snapshot zu alt" @@ -20735,148 +21471,173 @@ 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 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "konnte geteiltes Datei-Set »%s« nicht löschen: %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "konnte Fileset »%s« nicht löschen: %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, 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:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fehlgeschlagen: %m" -#: storage/file/fd.c:1027 +#: 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:1028 +#: 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:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 -#: storage/file/fd.c:2677 +#: 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:1453 +#: 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:1584 +#: 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:1591 +#: 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:1784 +#: 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:1818 +#: 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:1859 +#: 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:1947 +#: 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:2127 +#: 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:2392 storage/file/fd.c:2451 +#: 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:2496 +#: 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:2653 +#: 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:3183 +#: 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:3312 +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "synchronisiere Datenverzeichnis (syncfs), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" + +#: 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/sharedfileset.c:144 +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "synchronisiere Datenverzeichnis (pre-fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "synchronisiere Datenverzeichnis (fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "setze ungeloggte Relationen zurück (init), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "setze ungeloggte Relationen zurück (cleanup), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" + +#: 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" @@ -20931,41 +21692,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:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "konnte Handle für »%s« nicht duplizieren: %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3845 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "Datenbank »%s« wird von vorbereiteten Transaktionen verwendet" -#: storage/ipc/procarray.c:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3877 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "nur Superuser können Prozesse eines Superusers beenden" -#: storage/ipc/procarray.c:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3884 storage/ipc/signalfuncs.c:236 #, 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 "warte immer noch darauf, dass Backend mit PID %lu ProcSignalBarrier annimmt" + +#: 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:719 #, 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:962 -#: storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 -#: storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 -#: storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 -#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 +#: storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -20996,76 +21762,76 @@ 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 utils/adt/mcxtfuncs.c:204 +#: storage/ipc/signalfuncs.c:72 #, c-format -msgid "PID %d is not a PostgreSQL server process" -msgstr "PID %d ist kein PostgreSQL-Serverprozess" +msgid "PID %d is not a PostgreSQL backend process" +msgstr "PID %d ist kein PostgreSQL-Backend-Prozess" -#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1468 -#: utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1442 +#: 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:129 #, 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:134 #, 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:175 #, 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 +#: storage/ipc/signalfuncs.c:193 #, 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:214 +#: storage/ipc/signalfuncs.c:224 #, c-format msgid "\"timeout\" must not be negative" msgstr "»timeout« darf nicht negativ sein" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:276 #, 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:268 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:278 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:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:284 storage/ipc/signalfuncs.c:304 #, 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:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "Wiederherstellung wartet immer noch nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "Warten der Wiederherstellung beendet nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "storniere Anfrage wegen Konflikt mit der Wiederherstellung" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Benutzertransaktion hat Verklemmung (Deadlock) mit Wiederherstellung verursacht." @@ -21138,123 +21904,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:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "Relation %u der Datenbank %u" -#: storage/lmgr/lmgr.c:1113 +#: 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:1119 +#: 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:1124 +#: 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:1131 +#: 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:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "Transaktion %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "virtuelle Transaktion %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: 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:1156 +#: 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:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "unbekannter Locktag-Typ %d" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, 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:792 +#: storage/lmgr/lock.c:793 #, 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:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 -#: storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, 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:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, 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" @@ -21274,82 +22040,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:569 +#: 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:576 +#: 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:2484 storage/lmgr/predicate.c:2499 -#: storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, 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:4120 storage/lmgr/predicate.c:4156 -#: storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 -#: storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 -#: storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 -#: storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 -#, 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:4122 storage/lmgr/predicate.c:4158 #: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 #: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 #: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 #: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, 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:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 +#, 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:1565 +#: storage/lmgr/proc.c:1539 #, 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:1580 +#: storage/lmgr/proc.c:1554 #, 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:1589 +#: storage/lmgr/proc.c:1563 #, 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:1596 +#: storage/lmgr/proc.c:1570 #, 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:1613 +#: storage/lmgr/proc.c:1587 #, 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" @@ -21359,85 +22125,80 @@ 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:438 +#: storage/smgr/md.c:473 #, 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:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "konnte Datei »%s« nicht erweitern: %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "Prüfen Sie den freien Festplattenplatz." - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, 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:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, 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:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, 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:1289 +#: storage/smgr/md.c:1332 #, 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:1303 +#: storage/smgr/md.c:1346 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): %m" @@ -21452,8 +22213,8 @@ msgstr "Funktion »%s« kann nicht via Fastpath-Interface aufgerufen werden" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "Fastpath-Funktionsaufruf: »%s« (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 -#: tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "Dauer: %s ms" @@ -21483,348 +22244,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:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "ungültiger Frontend-Message-Typ %d" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "Anweisung: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "Dauer: %s ms Anweisung: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "kann nicht mehrere Befehle in vorbereitete Anweisung einfügen" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "Dauer: %s ms Parsen %s: %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "unbenannte vorbereitete Anweisung existiert nicht" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "Binden-Nachricht hat %d Parameterformate aber %d Parameter" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, 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:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "falsches Binärdatenformat in Binden-Parameter %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "Dauer: %s ms Binden %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "Portal »%s« existiert nicht" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "Ausführen Fetch von" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "Ausführen" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "Dauer: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "Vorbereiten: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "Parameter: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "Abbruchgrund: Konflikt bei Wiederherstellung" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Benutzer hat Shared-Buffer-Pin zu lange gehalten." -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "Benutzer hat Relationssperre zu lange gehalten." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, 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:2481 +#: tcop/postgres.c:2496 #, 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:2487 +#: tcop/postgres.c:2502 #, 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:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "Portal »%s« Parameter $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "Portal »%s« Parameter $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "unbenanntes Portal Parameter $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "unbenanntes Portal Parameter $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "Verbindung wird abgebrochen wegen unerwartetem SIGQUIT-Signal" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "Verbindung wird abgebrochen wegen Absturz eines anderen Serverprozesses" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, 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:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, 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:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "Verbindung wird abgebrochen aufgrund von Befehl für sofortiges Herunterfahren" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "Fließkommafehler" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "storniere Authentifizierung wegen Zeitüberschreitung" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "Autovacuum-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, 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:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "Verbindung wird abgebrochen wegen Konflikt mit der Wiederherstellung" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "Verbindung wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "Verbindung zum Client wurde verloren" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung einer Sperre" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung der Anfrage" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "storniere Autovacuum-Aufgabe" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "storniere Anfrage wegen Benutzeraufforderung" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Transaktion" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Sitzung" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "Grenze für Stacktiefe überschritten" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, 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:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "»max_stack_depth« darf %ldkB nicht überschreiten." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, 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:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ungültiges Kommandozeilenargument für Serverprozess: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ungültiges Kommandozeilenargument: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: weder Datenbankname noch Benutzername angegeben" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ungültiger Subtyp %d von CLOSE-Message" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ungültiger Subtyp %d von DESCRIBE-Message" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, 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:4768 +#: tcop/postgres.c:4853 #, 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:4945 +#: tcop/postgres.c:5030 #, 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:638 +#: 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:941 tcop/pquery.c:1703 +#: 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:942 tcop/pquery.c:1704 +#: 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" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, c-format msgid "cannot execute %s within a background process" msgstr "%s kann nicht in einem Hintergrundprozess ausgeführt werden" -#: tcop/utility.c:945 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "nur Superuser können CHECKPOINT ausführen" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "nur Superuser oder Rollen mit den Privilegien von pg_checkpoint können CHECKPOINT ausführen" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -21972,13 +22733,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:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "ungültiger regulärer Ausdruck: %s" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ungültiges Affixalias »%s«" @@ -22008,17 +22769,17 @@ 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)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "Zeile %d in Konfigurationsdatei »%s«: »%s«" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "Umwandlung von wchar_t in Serverkodierung fehlgeschlagen: %m" @@ -22050,145 +22811,195 @@ msgstr "konnte Stoppwortdatei »%s« nicht öffnen: %m" msgid "text search parser does not support headline creation" msgstr "Textsucheparser unterstützt das Erzeugen von Headlines nicht" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "unbekannter Headline-Parameter: »%s«" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "»MinWords« sollte kleiner als »MaxWords« sein" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "»MinWords« sollte positiv sein" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "»ShortWord« sollte >= 0 sein" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "»MaxFragments« sollte >= 0 sein" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "konnte permanente Statistikdatei »%s« nicht löschen: %m" + +#: utils/activity/pgstat.c:1229 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "ungültige Statistikart: »%s«" + +#: utils/activity/pgstat.c:1309 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" + +#: utils/activity/pgstat.c:1415 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" + +#: utils/activity/pgstat.c:1424 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" + +#: utils/activity/pgstat.c:1432 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" + +#: utils/activity/pgstat.c:1481 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" + +#: utils/activity/pgstat.c:1637 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "verfälschte Statistikdatei »%s«" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "Funktionsaufruf einer gelöschten Funktion" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "bestehende Statistiken für Art %s, db=%u, oid=%u werden zurückgesetzt" + +#: 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:277 +#: 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_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/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "konnte Eingabedatentypen nicht bestimmen" @@ -22199,16 +23010,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:1768 utils/adt/numeric.c:4231 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 -#: utils/adt/varlena.c:3422 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "integer ist außerhalb des gültigen Bereichs" @@ -22255,251 +23066,251 @@ 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: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 +#: utils/adt/arrayfuncs.c:272 utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:334 utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:510 +#: utils/adt/arrayfuncs.c:521 utils/adt/arrayfuncs.c:536 +#: utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 +#: utils/adt/arrayfuncs.c:594 utils/adt/arrayfuncs.c:602 +#: utils/adt/arrayfuncs.c:636 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:679 utils/adt/arrayfuncs.c:791 +#: utils/adt/arrayfuncs.c:800 utils/adt/arrayfuncs.c:830 +#: utils/adt/arrayfuncs.c:845 utils/adt/arrayfuncs.c:898 #, c-format msgid "malformed array literal: \"%s\"" msgstr "fehlerhafte Arraykonstante: »%s«" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:273 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "Auf »[« müssen explizit angegebene Array-Dimensionen folgen." -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:287 #, c-format msgid "Missing array dimension value." msgstr "Dimensionswert fehlt." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:335 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "»%s« fehlt nach Arraydimensionen." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2909 -#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:2945 +#: utils/adt/arrayfuncs.c:2990 utils/adt/arrayfuncs.c:3005 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "Obergrenze kann nicht kleiner als Untergrenze sein" -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:320 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Arraywert muss mit »{« oder Dimensionsinformationen anfangen." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:349 #, c-format msgid "Array contents must start with \"{\"." msgstr "Array-Inhalt muss mit {« anfangen." -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:355 utils/adt/arrayfuncs.c:362 #, 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:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: utils/adt/arrayfuncs.c:495 utils/adt/arrayfuncs.c:522 +#: 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:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:511 utils/adt/arrayfuncs.c:558 +#: utils/adt/arrayfuncs.c:588 utils/adt/arrayfuncs.c:637 #, c-format msgid "Unexpected \"%c\" character." msgstr "Unerwartetes Zeichen »%c«." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:537 utils/adt/arrayfuncs.c:660 #, c-format msgid "Unexpected array element." msgstr "Unerwartetes Arrayelement." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:595 #, c-format msgid "Unmatched \"%c\" character." msgstr "Zeichen »%c« ohne Gegenstück." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:603 utils/adt/jsonfuncs.c:2490 #, 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:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:680 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:1301 utils/adt/arrayfuncs.c:3369 -#: utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:1302 utils/adt/arrayfuncs.c:3418 +#: utils/adt/arrayfuncs.c:5932 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" -#: utils/adt/arrayfuncs.c:1312 +#: utils/adt/arrayfuncs.c:1313 #, c-format msgid "invalid array flags" msgstr "ungültige Array-Flags" -#: utils/adt/arrayfuncs.c:1334 +#: utils/adt/arrayfuncs.c:1335 #, 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:1378 utils/adt/multirangetypes.c:444 +#: utils/adt/arrayfuncs.c:1379 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:1518 +#: utils/adt/arrayfuncs.c:1519 #, c-format msgid "improper binary format in array element %d" msgstr "falsches Binärformat in Arrayelement %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 +#: utils/adt/arrayfuncs.c:1600 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:2078 +#: utils/adt/arrayfuncs.c:2079 #, 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:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 -#: utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 -#: utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2257 utils/adt/arrayfuncs.c:2279 +#: utils/adt/arrayfuncs.c:2328 utils/adt/arrayfuncs.c:2582 +#: utils/adt/arrayfuncs.c:2920 utils/adt/arrayfuncs.c:5918 +#: utils/adt/arrayfuncs.c:5944 utils/adt/arrayfuncs.c:5955 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "falsche Anzahl Arrayindizes" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2262 utils/adt/arrayfuncs.c:2386 +#: utils/adt/arrayfuncs.c:2665 utils/adt/arrayfuncs.c:2995 #, c-format msgid "array subscript out of range" msgstr "Arrayindex außerhalb des gültigen Bereichs" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2267 #, 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:2867 #, 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:2898 #, 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:2899 #, 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:2910 utils/adt/arrayfuncs.c:3022 #, c-format msgid "source array too small" msgstr "Quellarray ist zu klein" -#: utils/adt/arrayfuncs.c:3527 +#: utils/adt/arrayfuncs.c:3576 #, 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:3629 utils/adt/arrayfuncs.c:3800 -#: utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:3678 utils/adt/arrayfuncs.c:3849 +#: utils/adt/arrayfuncs.c:4240 #, c-format msgid "cannot compare arrays of different element types" msgstr "kann Arrays mit verschiedenen Elementtypen nicht vergleichen" -#: utils/adt/arrayfuncs.c:3978 utils/adt/multirangetypes.c:2742 -#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:4027 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:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4155 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:5282 +#: utils/adt/arrayfuncs.c:5332 #, c-format msgid "data type %s is not an array type" msgstr "Datentyp %s ist kein Array-Typ" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5387 #, c-format msgid "cannot accumulate null arrays" msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5415 #, c-format msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5442 utils/adt/arrayfuncs.c:5448 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "Arrays unterschiedlicher Dimensionalität können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5816 utils/adt/arrayfuncs.c:5856 #, 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:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5919 utils/adt/arrayfuncs.c:5945 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensions-Array muss eindimensional sein." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5924 utils/adt/arrayfuncs.c:5950 #, c-format msgid "dimension values cannot be null" msgstr "Dimensionswerte dürfen nicht NULL sein" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5956 #, 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:6184 +#: utils/adt/arrayfuncs.c:6234 #, 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:6461 +#: utils/adt/arrayfuncs.c:6511 #, c-format msgid "thresholds must be one-dimensional array" msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6516 #, c-format msgid "thresholds array must not contain NULLs" msgstr "»thresholds«-Array darf keine NULL-Werte enthalten" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6749 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "Anzahl der zu entfernenden Elemente muss zwischen 0 und %d sein" @@ -22514,22 +23325,22 @@ msgstr "Arrayindex muss Typ integer haben" msgid "array subscript in assignment must not be null" msgstr "Arrayindex in Zuweisung darf nicht NULL sein" -#: utils/adt/arrayutils.c:140 +#: utils/adt/arrayutils.c:134 #, c-format msgid "array lower bound is too large: %d" msgstr "Array-Untergrenze ist zu groß: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:234 #, c-format msgid "typmod array must be type cstring[]" msgstr "Typmod-Array muss Typ cstring[] haben" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:239 #, c-format msgid "typmod array must be one-dimensional" msgstr "Typmod-Arrays müssen eindimensional sein" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:244 #, c-format msgid "typmod array must not contain nulls" msgstr "Typmod-Array darf keine NULL-Werte enthalten" @@ -22540,211 +23351,216 @@ 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:4050 +#: 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:4660 -#: utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 -#: utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 -#: utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, 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:179 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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 -#: 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3361 #, c-format msgid "division by zero" msgstr "Division durch Null" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format 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 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "konnte %s-Hash nicht berechnen: %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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, 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:2219 #, 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" -msgstr "»date«-Einheit »%s« nicht unterstützt" - -#: utils/adt/date.c:1235 -#, c-format -msgid "date units \"%s\" not recognized" -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: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:5417 utils/adt/timestamp.c:5431 -#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 -#: utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 -#: utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 -#: utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 -#: utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: 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:4078 +#: utils/adt/timestamp.c:4271 utils/adt/timestamp.c:4443 +#: utils/adt/timestamp.c:4696 utils/adt/timestamp.c:4897 +#: utils/adt/timestamp.c:4944 utils/adt/timestamp.c:5168 +#: utils/adt/timestamp.c:5215 utils/adt/timestamp.c:5345 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "Einheit »%s« nicht unterstützt für Typ %s" + +#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 +#: utils/adt/timestamp.c:4092 utils/adt/timestamp.c:4288 +#: utils/adt/timestamp.c:4457 utils/adt/timestamp.c:4656 +#: utils/adt/timestamp.c:4953 utils/adt/timestamp.c:5224 +#: utils/adt/timestamp.c:5406 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "Einheit »%s« nicht erkannt für Typ %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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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:2961 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2975 +#: utils/adt/timestamp.c:3030 utils/adt/timestamp.c:3053 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3080 +#: utils/adt/timestamp.c:3088 utils/adt/timestamp.c:3096 +#: utils/adt/timestamp.c:3782 utils/adt/timestamp.c:3906 +#: utils/adt/timestamp.c:3996 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:4179 utils/adt/timestamp.c:4282 +#: utils/adt/timestamp.c:4761 utils/adt/timestamp.c:5035 +#: utils/adt/timestamp.c:5485 utils/adt/timestamp.c:5499 +#: utils/adt/timestamp.c:5504 utils/adt/timestamp.c:5518 +#: utils/adt/timestamp.c:5551 utils/adt/timestamp.c:5638 +#: utils/adt/timestamp.c:5679 utils/adt/timestamp.c:5683 +#: utils/adt/timestamp.c:5752 utils/adt/timestamp.c:5756 +#: utils/adt/timestamp.c:5770 utils/adt/timestamp.c:5804 utils/adt/xml.c:2241 +#: utils/adt/xml.c:2248 utils/adt/xml.c:2268 utils/adt/xml.c:2275 #, 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:4476 #, 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:2435 -#: 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 +#: utils/adt/timestamp.c:3432 utils/adt/timestamp.c:3463 +#: utils/adt/timestamp.c:3494 #, 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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 utils/adt/timestamp.c:516 +#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4365 +#: utils/adt/timestamp.c:5510 utils/adt/timestamp.c:5762 #, c-format msgid "time zone \"%s\" not recognized" msgstr "Zeitzone »%s« nicht erkannt" -#: utils/adt/date.c:3130 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: utils/adt/date.c:3117 utils/adt/timestamp.c:5540 utils/adt/timestamp.c:5793 #, 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:4023 utils/adt/datetime.c:4030 #, 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:4032 #, 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:4037 #, 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:4043 #, 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:4900 #, 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«." @@ -22754,20 +23570,20 @@ msgstr "Dieser Zeitzonenname erscheint in der Konfigurationsdatei für Zeitzonen msgid "invalid Datum pointer" msgstr "ungültiger »Datum«-Zeiger" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: 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:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ungültige Größeneinheit: »%s«." -#: utils/adt/dbsize.c:824 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Gültige Einheiten sind »kB«, »MB«, »GB« und »TB«." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "Gültige Einheiten sind »bytes«, »kB«, »MB«, »GB«, »TB« und »PB«." #: utils/adt/domains.c:92 #, c-format @@ -22851,390 +23667,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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, 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:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, 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:3824 utils/adt/numeric.c:3936 +#: 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:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:3736 -#: utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, 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:3674 -#: utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, 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:1708 +#: 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:1719 +#: 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:1724 +#: 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:1738 +#: 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:1192 #, 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:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "»9« muss vor »PR« stehen" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "»0« muss vor »PR« stehen" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "mehrere Dezimalpunkte" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, 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:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "»S« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, 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:1283 #, 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:1293 #, 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:1303 #, 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:1312 #, 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:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "»EEEE« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, 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:1345 #, 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:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ungültiges Datum-/Zeit-Formattrennzeichen: »%s«" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "»%s« ist keine Zahl" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, 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:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, 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:2314 #, c-format msgid "invalid combination of date conventions" msgstr "ungültige Kombination von Datumskonventionen" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, 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:2338 #, 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:2341 #, 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:2412 #, 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:2415 #, 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:2418 utils/adt/formatting.c:2433 #, 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:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, 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:2430 #, 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:2444 #, 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:2449 #, 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:2451 #, 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:2667 #, 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "lokalisierter Formatwert ist zu lang" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "Formattrennzeichen »%c« ohne passende Eingabe" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, 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:3540 utils/adt/formatting.c:3884 #, 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:3715 #, 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:3801 #, 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:3809 #, 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:4370 #, 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:4376 #, 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:4404 #, 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:4456 #, 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:4462 #, 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:4488 #, 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:4621 #, 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:4623 #, 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:4734 #, 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:5653 #, 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:5665 #, 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/oracle_compat.c:285 utils/adt/oracle_compat.c:835 -#: utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, 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" @@ -23249,8 +24060,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:4369 -#: utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "zu viele Punkte verlangt" @@ -23260,98 +24071,58 @@ 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:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "Funktion »poly_distance« ist nicht implementiert" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "Funktion »path_center« ist nicht implementiert" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "offener Pfad kann nicht in Polygon umgewandelt werden" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ungültiger Radius in externem »circle«-Wert" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, 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:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "mindestens 2 Punkte müssen angefordert werden" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector-Wert hat zu viele Elemente" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, 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 -#, 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:1616 -#: utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 +#: utils/adt/timestamp.c:5855 utils/adt/timestamp.c:5935 #, 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:4302 +#: 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:4364 #: 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" @@ -23361,23 +24132,23 @@ msgstr "OID ist außerhalb des gültigen Bereichs" 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:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, 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." @@ -23392,18 +24163,18 @@ msgstr "Argument %d darf nicht NULL sein" 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:1135 utils/adt/jsonb.c:1309 #, 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:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "Array-Dimensionen passen nicht" @@ -23418,68 +24189,68 @@ msgstr "Zeichenkette ist zu lang für jsonb" 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:1192 #, 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:1780 #, c-format msgid "object keys must be strings" msgstr "Objektschlüssel müssen Zeichenketten sein" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, 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:1944 #, 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:1945 #, 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:1946 #, 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:1947 #, 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:1948 #, 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:1949 #, 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:752 #, 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:793 #, 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:1667 utils/adt/jsonb_util.c:1687 #, 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:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, 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" @@ -23515,14 +24286,14 @@ msgid "jsonb subscript in assignment must not be null" msgstr "jsonb-Index in Zuweisung darf nicht NULL sein" #: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 -#: utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 -#: utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "%s kann nicht mit einem skalaren Wert aufgerufen werden" #: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 -#: utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "%s kann nicht mit einem Array aufgerufen werden" @@ -23542,177 +24313,182 @@ msgstr "kann nicht die Arraylänge eines skalaren Wertes ermitteln" msgid "cannot get array length of a non-array" msgstr "kann nicht die Arraylänge eines Nicht-Arrays ermitteln" -#: utils/adt/jsonfuncs.c:1934 +#: utils/adt/jsonfuncs.c:1931 #, 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:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kann Array nicht in ein Objekt zerlegen" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "kann skalaren Wert nicht zerlegen" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "kann keine Elemente aus einem skalaren Wert auswählen" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "kann keine Elemente aus einem Objekt auswählen" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, 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:2539 utils/adt/jsonfuncs.c:2544 -#: utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "JSON-Array wurde erwartet" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Prüfen Sie den Wert des Schlüssels »%s«." -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, 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:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Prüfen Sie das Arrayelement %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "malformed JSON array" msgstr "fehlerhaftes JSON-Array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, 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:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, 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:3832 utils/adt/jsonfuncs.c:3912 #, 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:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "%s kann nicht mit einem Objekt aufgerufen werden" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "kann nicht aus skalarem Wert löschen" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, 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:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gesetzt werden" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "JSON-Wert darf nicht NULL sein" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, 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:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gelöscht werden" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "Pfadelement auf Position %d ist NULL" -#: utils/adt/jsonfuncs.c:4944 utils/adt/jsonfuncs.c:4975 -#: utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "existierender Schlüssel kann nicht ersetzt werden" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Der Pfad nimmt an, dass der Schlüssel ein zusammengesetztes Objekt ist, aber er ist ein skalarer Wert." -#: utils/adt/jsonfuncs.c:5049 +#: utils/adt/jsonfuncs.c:4937 #, 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:5153 +#: utils/adt/jsonfuncs.c:5041 #, 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:5170 +#: utils/adt/jsonfuncs.c:5058 #, c-format msgid "path element at position %d is out of range: %d" msgstr "Pfadelement auf Position %d ist außerhalb des gültigen Bereichs: %d" -#: utils/adt/jsonfuncs.c:5322 +#: utils/adt/jsonfuncs.c:5210 #, 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:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "Flag-Array-Element ist keine Zeichenkette" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, 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:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "falsche Flag im Flag-Array: »%s«" @@ -23867,7 +24643,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:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "konnte die für ILIKE zu verwendende Sortierfolge nicht bestimmen" @@ -23882,27 +24658,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:988 +#: utils/adt/like_support.c:1014 #, 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:1090 +#: utils/adt/like_support.c:1115 #, 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«" @@ -23917,430 +24693,415 @@ 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:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "nur Superuser können Speicherkontexte loggen" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d ist kein PostgreSQL-Serverprozess" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "globaler Tablespace hat niemals Datenbanken" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u ist keine Tablespace-OID" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "unreserviert" -#: utils/adt/misc.c:488 +#: 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:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "reserviert (kann Funktions- oder Typname sein)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "reserviert" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "kann alleinstehendes Label sein" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "benötigt AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 -#: utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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:761 +#: 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:775 +#: 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:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Kein gültiger Bezeichner vor ».«." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Kein gültiger Bezeichner nach ».«." -#: utils/adt/misc.c:878 +#: 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:879 +#: 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:148 utils/adt/multirangetypes.c:161 -#: utils/adt/multirangetypes.c:190 utils/adt/multirangetypes.c:260 -#: utils/adt/multirangetypes.c:284 +#: 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 Multirange-Konstante: »%s«" -#: utils/adt/multirangetypes.c:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Linke geschweifte Klammer fehlt." -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Start einer Range erwartet." -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." msgstr "Komma oder Ende der Multirange erwartet." -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "Multiranges können nicht aus mehrdimensionalen Arrays konstruiert werden" -#: utils/adt/multirangetypes.c:1001 +#: utils/adt/multirangetypes.c:1002 #, c-format msgid "multirange values cannot contain null members" msgstr "Multirange-Werte können keine Mitglieder, die NULL sind, haben" -#: utils/adt/multirangetypes.c:1349 -#, c-format -msgid "range_agg must be called with a range" -msgstr "range_agg muss mit einem Range-Type aufgerufen werden" - -#: utils/adt/multirangetypes.c:1420 -#, c-format -msgid "range_intersect_agg must be called with a multirange" -msgstr "range_intersect_agg muss mit einem Multirange-Typ aufgerufen werden" - -#: 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:967 +#: 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:973 +#: 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:982 +#: 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:1195 utils/adt/numeric.c:1209 +#: 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:1200 +#: utils/adt/numeric.c:1262 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "Skala von NUMERIC (%d) muss zwischen 0 und %d liegen" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "Skala von NUMERIC (%d) muss zwischen %d und %d liegen" -#: utils/adt/numeric.c:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ungültiker Modifikator für Typ NUMERIC" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "Startwert kann nicht NaN sein" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "Startwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "Stoppwert kann nicht NaN sein" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "Stoppwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "Schrittgröße kann nicht NaN sein" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 -#: utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 -#: utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 -#: utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 -#: utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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:7554 +#: utils/adt/numeric.c:7594 #, c-format 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/numutils.c:154 -#, 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" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "ungültige oidvector-Daten" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "verlangtes Zeichen zu groß" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "gewünschtes Zeichen ist zu groß für die Kodierung: %d" - -#: utils/adt/oracle_compat.c:1063 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "gewünschtes Zeichen ist nicht gültig für die Kodierung: %d" +msgid "character number must be positive" +msgstr "Zeichennummer muss positiv sein" -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, c-format msgid "null character not permitted" msgstr "Null-Zeichen ist nicht erlaubt" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1041 utils/adt/oracle_compat.c:1094 +#, c-format +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:1082 +#, c-format +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: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" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "Aktualisieren Sie die Systembibliotheken." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, 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:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU wird in dieser Installation nicht unterstützt" + +#: utils/adt/pg_locale.c:1497 #, 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:1500 #, 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:1608 #, 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:1617 #, 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:1652 #, 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:1658 #, 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:1660 #, 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:1663 #, 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 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "konnte Locale »%s« nicht laden" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, 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:1797 #, 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:1804 #, 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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, 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:2183 #, 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." @@ -24360,11 +25121,26 @@ msgstr "NaN kann nicht von pg_lsn subtrahiert werden" 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:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "ungültiger Befehlsname: »%s«" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "unbekanntes Reset-Ziel: »%s«" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "Das Reset-Ziel muss »archiver«, »bgwriter«, »recovery_prefetch« oder »wal« sein." + +#: utils/adt/pgstatfuncs.c:2198 +#, c-format +msgid "invalid subscription OID %u" +msgstr "ungültige Subskriptions-OID: %u" + #: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" @@ -24395,11 +25171,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 "range_intersect_agg muss mit einem Bereichstyp aufgerufen werden" - #: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" @@ -24450,33 +25221,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:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, 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: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 "Wenn Sie regexp_replace() mit einem Startparameter verwenden wollten, wandeln Sie das vierte Argument explizit in integer um." + +#: 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:11875 utils/misc/guc.c:11909 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "ungültiger Wert für Parameter »%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 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" @@ -24492,7 +25278,7 @@ msgid "more than one operator named %s" msgstr "es gibt mehrere Operatoren namens %s" #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9800 utils/adt/ruleutils.c:9969 +#: utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -24504,7 +25290,7 @@ msgstr "Geben Sie zwei Argumente für den Operator an." #: 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:3698 utils/adt/varlena.c:3703 +#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "ungültige Namenssyntax" @@ -24529,78 +25315,78 @@ msgstr "Typname erwartet" 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." @@ -24663,148 +25449,130 @@ 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:5164 +#: utils/adt/ruleutils.c:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "Eingabe ist eine Anfrage, kein Ausdruck" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "Ausdruck enthält Verweise auf Variablen von mehr als einer Relation" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "Ausdruck enthält Variablen" + +#: utils/adt/ruleutils.c:5267 #, 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:12443 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12899 #, 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: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 +#: 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:3134 utils/adt/timestamp.c:3139 +#: utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3194 +#: utils/adt/timestamp.c:3201 utils/adt/timestamp.c:3208 +#: utils/adt/timestamp.c:3228 utils/adt/timestamp.c:3235 +#: utils/adt/timestamp.c:3242 utils/adt/timestamp.c:3329 +#: utils/adt/timestamp.c:3404 utils/adt/timestamp.c:3777 +#: utils/adt/timestamp.c:3901 utils/adt/timestamp.c:4451 #, c-format msgid "interval out of range" msgstr "interval-Wert ist außerhalb des gültigen Bereichs" -#: 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:4020 +#: utils/adt/timestamp.c:3937 utils/adt/timestamp.c:4120 #, c-format msgid "origin out of range" msgstr "Anfangspunkt ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3942 utils/adt/timestamp.c:4125 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "timestamp-Werte können nicht in Intervalle, die Monate oder Jahre enthalten, einsortiert werden" -#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:3949 utils/adt/timestamp.c:4132 #, c-format msgid "stride must be greater than zero" msgstr "Schrittgröße muss größer als null sein" -#: 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«-Einheit »%s« nicht unterstützt" - -#: 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«-Einheit »%s« nicht erkannt" - -#: 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 with time zone«-Einheit »%s« nicht unterstützt" - -#: 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 with time zone«-Einheit »%s« nicht erkannt" - -#: utils/adt/timestamp.c:4346 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "»interval«-Einheit »%s« wird nicht unterstützt, weil Monate gewöhnlich partielle Wochen haben" - -#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "»interval«-Einheit »%s« nicht unterstützt" - -#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5338 +#: utils/adt/timestamp.c:4445 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "»interval«-Einheit »%s« nicht erkannt" +msgid "Months usually have fractional weeks." +msgstr "Monate haben gewöhnlich partielle Wochen." #: utils/adt/trigfuncs.c:42 #, c-format @@ -24912,58 +25680,62 @@ 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 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "Lexem-Array darf keine leeren Zeichenketten 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:2429 +#: utils/adt/tsvector_op.c:2434 #, 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:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-Spalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Spalte »%s« hat nicht Typ tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Konfigurationsspalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Spalte »%s« hat nicht Typ regconfig" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "Konfigurationsspalte »%s« darf nicht NULL sein" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Textsuchekonfigurationsname »%s« muss Schemaqualifikation haben" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Spalte »%s« hat keinen Zeichentyp" @@ -24983,7 +25755,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" @@ -25028,9 +25800,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:890 -#: utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3340 -#: utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "negative Teilzeichenkettenlänge nicht erlaubt" @@ -25055,7 +25827,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:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "neues Bit muss 0 oder 1 sein" @@ -25070,286 +25842,286 @@ 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:1516 +#: 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:1209 utils/adt/varlena.c:1956 +#: 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:1615 utils/adt/varlena.c:1628 +#: 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:1643 +#: 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:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "Vergleichung fehlgeschlagen: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "Sortierschlüsselerzeugung fehlgeschlagen: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, 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:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, 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:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "Feldposition darf nicht null sein" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "Typspezifikation in format() nicht abgeschlossen" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Für ein einzelnes »%%« geben Sie »%%%%« an." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "unbekannte Typspezifikation in format(): »%.*s«" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "zu wenige Argumente für format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "Zahl ist außerhalb des gültigen Bereichs" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, 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:6069 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "Argumentposition der Breitenangabe muss mit »$« enden" -#: utils/adt/varlena.c:6114 +#: utils/adt/varlena.c:6088 #, 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:6240 +#: utils/adt/varlena.c:6214 #, 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:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "ungültige Normalisierungsform: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "ungültiger Unicode-Codepunkt: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." 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:117 #, 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:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "ungültige externe pg_snapshot-Daten" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:232 #, c-format msgid "unsupported XML feature" msgstr "nicht unterstützte XML-Funktionalität" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:233 #, c-format 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:252 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:495 utils/adt/xml.c:500 #, c-format msgid "invalid XML comment" msgstr "ungültiger XML-Kommentar" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:629 #, 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:788 utils/adt/xml.c:811 #, c-format msgid "invalid XML processing instruction" msgstr "ungültige XML-Verarbeitungsanweisung" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:789 #, 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:812 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-Verarbeitungsanweisung darf nicht »?>« enthalten." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:891 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate ist nicht implementiert" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:970 #, c-format msgid "could not initialize XML library" msgstr "konnte XML-Bibliothek nicht initialisieren" -#: utils/adt/xml.c:962 +#: utils/adt/xml.c:971 #, 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:1057 #, 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:1058 #, 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:1945 msgid "Invalid character value." msgstr "Ungültiger Zeichenwert." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1948 msgid "Space required." msgstr "Leerzeichen benötigt." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1951 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone akzeptiert nur »yes« oder »no«." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1954 msgid "Malformed declaration: missing version." msgstr "Fehlerhafte Deklaration: Version fehlt." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1957 msgid "Missing encoding in text declaration." msgstr "Fehlende Kodierung in Textdeklaration." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1960 msgid "Parsing XML declaration: '?>' expected." msgstr "Beim Parsen der XML-Deklaration: »?>« erwartet." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1963 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Unbekannter Libxml-Fehlercode: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2220 #, 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:2242 utils/adt/xml.c:2269 #, 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:2685 #, c-format msgid "invalid query" msgstr "ungültige Anfrage" -#: utils/adt/xml.c:2768 +#: utils/adt/xml.c:2777 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "Portal »%s« gibt keine Tupel zurück" -#: utils/adt/xml.c:4020 +#: utils/adt/xml.c:4029 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4021 +#: utils/adt/xml.c:4030 #, 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:4045 +#: utils/adt/xml.c:4054 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4097 +#: utils/adt/xml.c:4106 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4104 +#: utils/adt/xml.c:4113 #, 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:4455 +#: utils/adt/xml.c:4464 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4484 +#: utils/adt/xml.c:4493 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4515 +#: utils/adt/xml.c:4524 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4659 +#: utils/adt/xml.c:4668 #, 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" @@ -25385,37 +26157,47 @@ 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:6325 +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "Heap-Relfilenode-Wert ist im Binary-Upgrade-Modus nicht gesetzt" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "unerwartete Anforderung eines neuen Relfilenodes im Binary-Upgrade-Modus" + +#: utils/cache/relcache.c:6473 #, 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:6327 +#: utils/cache/relcache.c:6475 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Setze trotzdem fort, aber irgendwas stimmt nicht." -#: utils/cache/relcache.c:6649 +#: utils/cache/relcache.c:6797 #, 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:591 #, 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:767 +#: utils/cache/relmapper.c:839 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "Relation-Mapping-Datei »%s« enthält ungültige Daten" -#: utils/cache/relmapper.c:777 +#: utils/cache/relmapper.c:849 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "Relation-Mapping-Datei »%s« enthält falsche Prüfsumme" -#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "Record-Typ wurde nicht registriert" @@ -25430,101 +26212,101 @@ msgstr "TRAP: ExceptionalCondition: fehlerhafte Argumente in PID %d\n" msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %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" @@ -25554,51 +26336,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" @@ -25623,377 +26415,377 @@ 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:420 +#: utils/fmgr/funcapi.c:498 #, 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:565 +#: utils/fmgr/funcapi.c:643 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "als %s deklariertes Argument enthält keinen Bereichstyp sondern Typ %s" -#: utils/fmgr/funcapi.c:648 +#: utils/fmgr/funcapi.c:726 #, 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:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, 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:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "Spaltenalias fehlt" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, 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:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "Datenverzeichnis »%s« existiert nicht" -#: utils/init/miscinit.c:319 +#: 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:327 +#: 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:343 +#: 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:345 +#: 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:363 +#: 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:365 +#: 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7837 #, 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:718 +#: 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:748 +#: 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:766 +#: 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:826 +#: utils/init/miscinit.c:849 #, c-format msgid "permission denied to set session authorization" msgstr "keine Berechtigung, um Sitzungsautorisierung zu setzen" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:932 #, c-format msgid "invalid role OID: %u" msgstr "ungültige Rollen-OID: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:986 #, c-format msgid "database system is shut down" msgstr "Datenbanksystem ist heruntergefahren" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1073 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht erstellen: %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1087 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht öffnen: %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1094 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht lesen: %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1103 #, c-format msgid "lock file \"%s\" is empty" msgstr "Sperrdatei »%s« ist leer" -#: utils/init/miscinit.c:1081 +#: utils/init/miscinit.c:1104 #, 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:1125 +#: utils/init/miscinit.c:1148 #, c-format msgid "lock file \"%s\" already exists" msgstr "Sperrdatei »%s« existiert bereits" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1152 #, 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:1131 +#: utils/init/miscinit.c:1154 #, 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:1134 +#: utils/init/miscinit.c:1157 #, 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:1136 +#: utils/init/miscinit.c:1159 #, 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:1187 +#: utils/init/miscinit.c:1210 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "konnte alte Sperrdatei »%s« nicht löschen: %m" -#: utils/init/miscinit.c:1189 +#: utils/init/miscinit.c:1212 #, 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:1226 utils/init/miscinit.c:1240 -#: utils/init/miscinit.c:1251 +#: utils/init/miscinit.c:1249 utils/init/miscinit.c:1263 +#: utils/init/miscinit.c:1274 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht schreiben: %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10409 +#: utils/init/miscinit.c:1385 utils/init/miscinit.c:1527 utils/misc/guc.c:10843 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1515 #, 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:1517 +#: utils/init/miscinit.c:1540 #, 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:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1579 utils/init/miscinit.c:1595 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "»%s« ist kein gültiges Datenverzeichnis" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1581 #, c-format msgid "File \"%s\" is missing." msgstr "Die Datei »%s« fehlt." -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1597 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Die Datei »%s« enthält keine gültigen Daten." -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1599 #, c-format msgid "You might need to initdb." msgstr "Sie müssen möglicherweise initdb ausführen." -#: utils/init/miscinit.c:1584 +#: utils/init/miscinit.c:1607 #, 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)" -#: 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:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "in diesem Datenbanksystem sind keine Rollen definiert" +msgid "database \"%s\" has a collation version mismatch" +msgstr "Version von Sortierfolge für Datenbank »%s« stimmt nicht überein" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Sie sollten sofort CREATE USER \"%s\" SUPERUSER; ausführen." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Die Datenbank wurde mit Sortierfolgenversion %s erzeugt, aber das Betriebssystem hat Version %s." + +#: utils/init/postinit.c:471 +#, c-format +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 Objekte in dieser Datenbank, die die Standardsortierfolge verwenden, neu und führen Sie ALTER DATABASE %s REFRESH COLLATION VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/init/postinit.c:798 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "während des Herunterfahrens der Datenbank sind keine neuen Replikationsverbindungen erlaubt" +msgid "no roles are defined in this database system" +msgstr "in diesem Datenbanksystem sind keine Rollen definiert" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "nur Superuser können während des Herunterfahrens der Datenbank verbinden" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Sie sollten sofort CREATE USER \"%s\" SUPERUSER; ausführen." -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, 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:885 #, 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:895 #, 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 -#, c-format -msgid "database %u does not exist" -msgstr "Datenbank %u existiert nicht" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, 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:1001 +#: utils/init/postinit.c:1016 +#, c-format +msgid "database %u does not exist" +msgstr "Datenbank %u existiert nicht" + +#: utils/init/postinit.c:1025 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "mit ungültiger Datenbank »%s« kann nicht verbunden werden" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Das Datenbankunterverzeichnis »%s« fehlt." -#: utils/init/postinit.c:1026 -#, 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" @@ -26057,1906 +26849,1967 @@ 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:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Ungruppiert" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Dateipfade" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Verbindungen und Authentifizierung / Verbindungseinstellungen" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Verbindungen und Authentifizierung / Authentifizierung" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Verbindungen und Authentifizierung / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Resourcenbenutzung / Speicher" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Resourcenbenutzung / Festplatte" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Resourcenbenutzung / Kernelresourcen" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resourcenbenutzung / Kostenbasierte Vacuum-Verzögerung" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Resourcenbenutzung / Background-Writer" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resourcenbenutzung / Asynchrones Verhalten" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead-Log / Einstellungen" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead-Log / Checkpoints" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead-Log / Archivierung" -#: utils/misc/guc.c:748 +#: 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:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead-Log / Wiederherstellungsziele" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replikation / sendende Server" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Replikation / Primärserver" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replikation / Standby-Server" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replikation / Subskriptionsserver" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Anfragetuning / Planermethoden" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Anfragetuning / Planerkosten" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Anfragetuning / Genetischer Anfrageoptimierer" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Anfragetuning / Andere Planeroptionen" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Berichte und Logging / Wohin geloggt wird" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Berichte und Logging / Wann geloggt wird" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Berichte und Logging / Was geloggt wird" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Berichte und Logging / Prozesstitel" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistiken / Überwachung" -#: utils/misc/guc.c:778 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "Statistiken / Statistiksammler für Anfragen und Indexe" +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "Statistiken / Kumulierte Anfrage- und Indexstatistiken" -#: utils/misc/guc.c:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standardeinstellungen für Clientverbindungen / Anweisungsverhalten" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standardeinstellungen für Clientverbindungen / Locale und Formatierung" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Standardeinstellungen für Clientverbindungen / Shared Library Preloading" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Standardeinstellungen für Clientverbindungen / Andere" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Sperrenverwaltung" -#: utils/misc/guc.c:792 +#: 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:794 +#: 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:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Fehlerbehandlung" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Voreingestellte Optionen" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Angepasste Optionen" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Entwickleroptionen" -#: utils/misc/guc.c:860 +#: 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:897 +#: 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:959 +#: 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:969 +#: 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:979 +#: 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:989 +#: 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:999 +#: 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:1009 +#: 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:1019 +#: 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:1028 +#: 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:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Ermöglicht Materialisierung im Planer." -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Ermöglicht Memoization im Planer." -#: utils/misc/guc.c:1058 +#: 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:1068 +#: 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:1078 +#: 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:1088 +#: 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:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Ermöglicht partitionsweise Verbunde." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Ermöglicht partitionsweise Aggregierung und Gruppierung." -#: utils/misc/guc.c:1118 +#: 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:1128 +#: 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:1138 +#: 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:1139 +#: 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:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "Ermöglicht asynchrone Append-Pläne im Planer." -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Ermöglicht genetische Anfrageoptimierung." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 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:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Zeigt, ob der aktuelle Benutzer ein Superuser ist." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Ermöglicht die Bekanntgabe des Servers mit Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Sammelt Commit-Timestamps von Transaktionen." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Ermöglicht SSL-Verbindungen." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "ssl_passphrase_command auch beim Neuladen des Servers verwenden." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "Kontrolliert, ob ssl_passphrase_command beim Neuladen des Servers aufgerufen wird." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Der Ciphersuite-Reihenfolge des Servers Vorrang geben." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Erzwingt die Synchronisierung von Aktualisierungen auf Festplatte." -#: utils/misc/guc.c:1228 -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." +#: utils/misc/guc.c:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures 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:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Setzt die Verarbeitung trotz Prüfsummenfehler fort." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Setzt die Verarbeitung trotz kaputter Seitenköpfe fort." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "Setzt die Wiederherstellung trotz Fehler durch ungültige Seiten fort." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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:1287 +#: utils/misc/guc.c:1346 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:1288 +#: utils/misc/guc.c:1347 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:1301 +#: utils/misc/guc.c:1360 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:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Komprimiert in WAL-Dateien geschriebene volle Seiten." - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 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:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "WAL-Dateien werden durch Umbenennen wiederverwendet." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Schreibt jeden Checkpoint in den Log." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Schreibt jede erfolgreiche Verbindung in den Log." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Schreibt jedes Verbindungsende mit Sitzungszeit in den Log." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Schreibt jeden Replikationsbefehl in den Log." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 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:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Sitzung bei jedem Fehler abbrechen." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Server nach Absturz eines Serverprozesses reinitialisieren." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." msgstr "Temporäre Dateien nach Absturz eines Serverprozesses löschen." -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Loggt die Dauer jeder abgeschlossenen SQL-Anweisung." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "Scheibt den Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Schreibt den umgeschriebenen Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Schreibt den Ausführungsplan jeder Anfrage in den Log." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Rückt die Anzeige von Parse- und Planbäumen ein." -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "Schreibt Parser-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "Schreibt Planer-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "Schreibt Executor-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "Schreibt Gesamtleistungsstatistiken in den Serverlog." -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 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:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Sammelt Informationen über ausgeführte Befehle." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "Sammelt Statistiken über Datenbankaktivität." -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." msgstr "Sammelt Zeitmessungsstatistiken über Datenbank-I/O-Aktivität." -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." msgstr "Sammelt Zeitmessungsstatistiken über WAL-I/O-Aktivität." -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 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:1555 +#: utils/misc/guc.c:1604 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:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Startet den Autovacuum-Prozess." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Erzeugt Debug-Ausgabe für LISTEN und NOTIFY." -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Gibt Informationen über Sperrenverwendung aus." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Gibt Informationen über Benutzersperrenverwendung aus." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Gibt Informationen über die Verwendung von Lightweight Locks aus." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 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:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Schreibt Meldungen über langes Warten auf Sperren in den Log." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "Schreibt Meldungen über Warten wegen Konflikten bei Wiederherstellung in den Log." -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "Schreibt den Hostnamen jeder Verbindung in den Log." -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Behandelt »ausdruck=NULL« als »ausdruck IS NULL«." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Ermöglicht Datenbank-lokale Benutzernamen." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 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:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "Setzt die Read-Only-Einstellung der aktuellen Transaktion." -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 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:1713 +#: utils/misc/guc.c:1762 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:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Schaltet Sicherheit auf Zeilenebene ein." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 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:1732 +#: utils/misc/guc.c:1781 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:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Ermöglicht die Eingabe von NULL-Elementen in Arrays." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 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:1768 +#: utils/misc/guc.c:1817 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:1777 +#: utils/misc/guc.c:1826 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:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "Gibt Informationen über die Ressourcenverwendung beim Sortieren aus." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "Erzeugt Debug-Ausgabe für synchronisiertes Scannen." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "Ermöglicht Bounded Sorting mittels Heap-Sort." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Gibt diverse Debug-Meldungen über WAL aus." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Zeigt ob Datum/Zeit intern ganze Zahlen verwendet." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 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:1863 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Warnt bei Backslash-Escapes in normalen Zeichenkettenkonstanten." -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Bewirkt, dass Zeichenketten der Art '...' Backslashes als normales Zeichen behandeln." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Ermöglicht synchronisierte sequenzielle Scans." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 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:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "Erlaubt Verbindungen und Anfragen während der Wiederherstellung." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 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:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Zeigt, ob Hot Standby aktuell aktiv ist." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Erlaubt Änderungen an der Struktur von Systemtabellen." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Schaltet das Lesen aus Systemindexen ab." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 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:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "Erlaubt Tablespaces direkt in pg_tblspc, zum Testen." -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 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:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "Wenn SQL-Fragmente erzeugt werden, alle Bezeichner quoten." -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 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:2001 +#: utils/misc/guc.c:2050 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:2011 +#: utils/misc/guc.c:2060 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:2021 +#: utils/misc/guc.c:2070 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:2022 +#: utils/misc/guc.c:2071 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:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Erlaubt JIT-Kompilierung." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "JIT-kompilierte Funktionen im Debugger registrieren." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 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:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Erlaubt JIT-Kompilierung von Ausdrücken." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "JIT-kompilierte Funktionen im Profiler perf registrieren." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Erlaubt JIT-Kompilierung von Tuple-Deforming." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 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:2119 +#: utils/misc/guc.c:2168 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:2137 -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:2186 +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 ein Umschalten auf die nächste WAL-Datei erzwungen wird." -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Wartet beim Starten einer Verbindung N Sekunden nach der Authentifizierung." +#: utils/misc/guc.c:2197 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Setzt die Zeit, die nach der Authentifizierung beim Verbindungsstart gewartet wird." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 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:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Setzt das voreingestellte Statistikziel." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 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:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 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:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 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:2204 +#: utils/misc/guc.c:2254 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:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: Anzahl der Individien in der Bevölkerung." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "Null wählt einen passenden Vorgabewert." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: Anzahl der Iterationen im Algorithmus." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 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:2247 +#: utils/misc/guc.c:2297 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:2258 +#: utils/misc/guc.c:2308 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:2269 +#: utils/misc/guc.c:2319 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:2280 +#: utils/misc/guc.c:2330 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:2291 +#: utils/misc/guc.c:2341 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:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Setzt die maximale Anzahl gleichzeitiger Verbindungen." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "Setzt die Anzahl der für Superuser reservierten Verbindungen." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Menge des beim Start reservierten dynamischen Shared Memory." -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 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:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "Zeigt die Größe des primären Shared-Memory-Bereichs des Servers (aufgerundet zum nächsten MB)." + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Zeigt die Anzahl der Huge Pages, die für den primären Shared-Memory-Bereich benötigt werden." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 zeigt an, dass der Wert nicht ermittelt werden konnte." + +#: utils/misc/guc.c:2421 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:2360 +#: utils/misc/guc.c:2432 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:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Setzt die Zugriffsrechte für die Unix-Domain-Socket." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Setzt die Dateizugriffsrechte für Logdateien." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Zeigt die Zugriffsrechte des Datenverzeichnisses." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 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:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Setzt die maximale Speichergröße für Wartungsoperationen." -#: utils/misc/guc.c:2428 +#: utils/misc/guc.c:2500 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:2438 +#: utils/misc/guc.c:2510 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:2439 +#: utils/misc/guc.c:2511 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:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Setzt die maximale Stackgröße, in Kilobytes." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 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:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 bedeutet keine Grenze." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 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:2487 +#: utils/misc/guc.c:2559 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:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-Kosten für eine durch Vacuum schmutzig gemachte Seite." -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen, für Autovacuum." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 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:2540 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Setzt die maximale Anzahl von gleichzeitig vorbereiteten Transaktionen." -#: utils/misc/guc.c:2551 +#: utils/misc/guc.c:2623 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:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "Wird verwendet, um Ausgabe für Systemtabellen zu vermeiden." -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Setzt die OID der Tabelle mit bedingungsloser Sperrenverfolgung." -#: utils/misc/guc.c:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "Setzt die maximal erlaubte Dauer jeder Anweisung." -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Der Wert 0 schaltet die Zeitprüfung aus." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 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:2595 +#: utils/misc/guc.c:2667 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn in einer Transaktion." -#: utils/misc/guc.c:2606 +#: utils/misc/guc.c:2678 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn nicht in einer Transaktion." -#: utils/misc/guc.c:2617 +#: utils/misc/guc.c:2689 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Mindestalter, bei dem VACUUM eine Tabellenzeile einfrieren soll." -#: utils/misc/guc.c:2627 +#: utils/misc/guc.c:2699 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:2637 +#: utils/misc/guc.c:2709 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:2647 +#: utils/misc/guc.c:2719 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:2657 +#: utils/misc/guc.c:2729 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:2666 +#: utils/misc/guc.c:2738 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2747 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Multixact-Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc.c:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Setzt die maximale Anzahl Sperren pro Transaktion." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Setzt die maximale Anzahl Prädikatsperren pro Transaktion." -#: utils/misc/guc.c:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 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:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 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:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 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:2746 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Wartet beim Starten einer Verbindung N Sekunden vor der Authentifizierung." +#: utils/misc/guc.c:2818 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Setzt die Zeit, die vor der Authentifizierung beim Verbindungsstart gewartet wird." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Puffergröße für WAL-Read-Ahead während der Wiederherstellung." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Maximale Entfernung, die im WAL vorausgelesen wird, um Datenblöcke, auf die verwiesen wird, vorab einzulesen." + +#: utils/misc/guc.c:2841 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:2768 +#: utils/misc/guc.c:2852 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:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Setzt die WAL-Größe, die einen Checkpoint auslöst." -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Setzt die maximale Zeit zwischen automatischen WAL-Checkpoints." -#: utils/misc/guc.c:2803 -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:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "Setzt die maximale Zeit, bevor gewarnt wird, wenn durch WAL-Volumen ausgelöste Checkpoints zu häufig passieren." -#: utils/misc/guc.c:2805 -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 "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:2889 +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 WAL-Segmentdateien ausgelöst werden, häufiger als dieser Zeitraum passieren. Null schaltet die Warnung ab." -#: utils/misc/guc.c:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 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:2828 +#: utils/misc/guc.c:2913 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:2839 +#: utils/misc/guc.c:2924 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Zeit zwischen WAL-Flush-Operationen im WAL-Writer." -#: utils/misc/guc.c:2850 +#: utils/misc/guc.c:2935 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:2861 +#: utils/misc/guc.c:2946 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Mindestgröße ab der neue Datei gefsynct wird statt WAL zu schreiben." -#: utils/misc/guc.c:2872 +#: utils/misc/guc.c:2957 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:2883 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Setzt die maximale Anzahl von gleichzeitig definierten Replikations-Slots." -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2978 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:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 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:2917 +#: utils/misc/guc.c:3002 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:2929 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "Setzt die minimale Anzahl gleichzeitig offener Transaktionen bevor »commit_delay« angewendet wird." +#: utils/misc/guc.c:3014 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "Setzt die notwendige minimale Anzahl gleichzeitig offener Transaktionen bevor »commit_delay« angewendet wird." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 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:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 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:2956 +#: utils/misc/guc.c:3041 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:2966 +#: utils/misc/guc.c:3051 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:2968 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Null zeigt alle Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:2978 +#: utils/misc/guc.c:3063 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:2980 +#: utils/misc/guc.c:3065 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:2990 -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:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "Setzt die maximale Länge in Bytes für geloggte Daten von Bind-Parametern, wenn Anfragen geloggt werden." -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 um die Werte vollständig auszugeben." -#: utils/misc/guc.c:3001 -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:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "Setzt die maximale Länge in Bytes für bei Fehlern geloggte Daten von Bind-Parametern, wenn Anfragen geloggt werden." -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "Schlafzeit zwischen Durchläufen des Background-Writers." -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 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:3046 +#: utils/misc/guc.c:3133 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:3064 +#: utils/misc/guc.c:3151 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:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Maximale Anzahl gleichzeitiger Worker-Prozesse." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "Maximale Anzahl Arbeitsprozesse für logische Replikation." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "Maximale Anzahl Arbeitsprozesse für Tabellensynchronisation pro Subskription." -#: utils/misc/guc.c:3127 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Automatische Rotation der Logdateien geschieht nach N Minuten." +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Setzt die Zeit, die gewartet wird, bevor Logdateirotation erzwungen wird." -#: utils/misc/guc.c:3138 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Automatische Rotation der Logdateien geschieht nach N Kilobytes." +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Setzt die maximale Größe, die eine Logdatei erreichen kann, bevor sie rotiert wird." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Setzt die maximale Anzahl von Funktionsargumenten." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Zeigt die maximale Anzahl von Indexschlüsseln." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Zeigt die maximale Länge von Bezeichnern." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Zeigt die Größe eines Diskblocks." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "Zeigt die Anzahl Seiten pro Diskdatei." -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "Zeigt die Blockgröße im Write-Ahead-Log." -#: utils/misc/guc.c:3215 +#: utils/misc/guc.c:3305 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:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Zeigt die Größe eines Write-Ahead-Log-Segments." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Wartezeit zwischen Autovacuum-Durchläufen." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 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:3259 +#: utils/misc/guc.c:3349 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:3268 +#: utils/misc/guc.c:3358 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:3278 +#: utils/misc/guc.c:3368 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:3293 +#: utils/misc/guc.c:3380 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:3303 +#: utils/misc/guc.c:3390 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:3313 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Setzt die maximale Anzahl paralleler Prozesse pro Wartungsoperation." -#: utils/misc/guc.c:3323 +#: utils/misc/guc.c:3410 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:3334 +#: utils/misc/guc.c:3421 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:3345 +#: utils/misc/guc.c:3432 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:3356 +#: utils/misc/guc.c:3443 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:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "Der Wert -1 schaltet dieses Feature aus." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Zeit zwischen TCP-Keepalive-Sendungen." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "Der Wert 0 verwendet die Systemvoreinstellung." -#: utils/misc/guc.c:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Zeit zwischen TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 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:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximale Anzahl an TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc.c:3401 -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:3488 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "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:3412 +#: utils/misc/guc.c:3499 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:3423 +#: utils/misc/guc.c:3510 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:3424 +#: utils/misc/guc.c:3511 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:3435 +#: utils/misc/guc.c:3522 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:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 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:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Zeigt die Serverversion als Zahl." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 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:3470 +#: utils/misc/guc.c:3557 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:3480 +#: utils/misc/guc.c:3567 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:3491 +#: utils/misc/guc.c:3578 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:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "TCP-User-Timeout." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "Huge-Page-Größe, die angefordert werden soll." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." msgstr "System-Caches aggressiv flushen, zum Debuggen." -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 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:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "Zeit zwischen Fortschrittsnachrichten für lange laufende Operationen beim Serverstart." + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "0 schaltet dieses Feature aus." + +#: utils/misc/guc.c:3666 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:3578 +#: utils/misc/guc.c:3677 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:3589 +#: utils/misc/guc.c:3688 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:3600 +#: utils/misc/guc.c:3699 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:3611 +#: utils/misc/guc.c:3710 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:3622 +#: utils/misc/guc.c:3721 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 an das Leader-Backend zu senden." -#: utils/misc/guc.c:3633 +#: utils/misc/guc.c:3732 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:3645 +#: utils/misc/guc.c:3744 msgid "Perform JIT compilation if query is more expensive." msgstr "JIT-Kompilierung durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 schaltet JIT-Kompilierung aus." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "JIT-kompilierte Funktionen optimieren, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 schaltet Optimierung aus." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "JIT-Inlining durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 schaltet Inlining aus." -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 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." +msgstr "Setzt die Planerschätzung für den Anteil der Cursor-Zeilen, die ausgelesen werden werden." -#: utils/misc/guc.c:3690 +#: utils/misc/guc.c:3789 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Setzt die Planerschätzung für die durchschnittliche Größe der Arbeitstabelle einer rekursiven Anfrage." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektiver Auswahldruck in der Bevölkerung." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: Ausgangswert für die zufällige Pfadauswahl." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 msgid "Multiple of work_mem to use for hash tables." msgstr "Vielfaches von work_mem zur Verwendung bei Hash-Tabellen." -#: utils/misc/guc.c:3723 +#: utils/misc/guc.c:3834 msgid "Multiple of the average buffer usage to free per round." msgstr "Vielfaches der durchschnittlichen freizugebenden Pufferverwendung pro Runde." -#: utils/misc/guc.c:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "Setzt den Ausgangswert für die Zufallszahlenerzeugung." -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden, für Autovacuum." -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 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:3776 +#: utils/misc/guc.c:3887 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:3786 +#: utils/misc/guc.c:3897 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:3796 +#: utils/misc/guc.c:3907 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:3806 +#: utils/misc/guc.c:3917 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:3807 +#: utils/misc/guc.c:3918 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:3816 +#: utils/misc/guc.c:3927 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Setzt den Bruchteil der Transaktionen, aus denen alle Anweisungen geloggt werden." -#: utils/misc/guc.c:3817 +#: utils/misc/guc.c:3928 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (alle Anweisungen für alle Transaktionen loggen)." -#: utils/misc/guc.c:3836 +#: utils/misc/guc.c:3947 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:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Dieser wird nur verwendet, wenn »archive_library« nicht gesetzt ist." + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Setzt die Bibliothek, die aufgerufen wird, um eine WAL-Datei zu archivieren." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "Eine leere Zeichenkette bedeutet, dass »archive_command« verwendet werden soll." + +#: utils/misc/guc.c:3967 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:3856 +#: utils/misc/guc.c:3977 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:3866 +#: utils/misc/guc.c:3987 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:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Gibt die Zeitleiste für die Wiederherstellung an." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 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:3895 +#: utils/misc/guc.c:4016 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:3904 +#: utils/misc/guc.c:4025 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:3913 +#: utils/misc/guc.c:4034 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:3922 +#: utils/misc/guc.c:4043 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:3932 +#: utils/misc/guc.c:4053 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:3942 +#: utils/misc/guc.c:4063 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:3953 +#: utils/misc/guc.c:4074 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:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Setzt die Zeichensatzkodierung des Clients." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "Bestimmt die Informationen, die vor jede Logzeile geschrieben werden." -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "Wenn leer, dann wird kein Präfix verwendet." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Setzt die in Logmeldungen verwendete Zeitzone." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "Setzt das Ausgabeformat für Datums- und Zeitwerte." -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Kontrolliert auch die Interpretation von zweideutigen Datumseingaben." -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "Setzt die Standard-Tabellenzugriffsmethode für neue Tabellen." -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4138 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:4018 +#: utils/misc/guc.c:4139 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:4028 +#: utils/misc/guc.c:4149 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:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Setzt den Pfad für ladbare dynamische Bibliotheken." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Setzt den Ort der Kerberos-Server-Schlüsseldatei." -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Setzt den Bonjour-Servicenamen." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Zeigt die Locale für die Sortierreihenfolge." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "Zeigt die Locale für Zeichenklassifizierung und Groß-/Kleinschreibung." -#: utils/misc/guc.c:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Setzt die Sprache, in der Mitteilungen ausgegeben werden." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Setzt die Locale für die Formatierung von Geldbeträgen." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Setzt die Locale für die Formatierung von Zahlen." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 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:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "Listet dynamische Bibliotheken, die vorab in jeden Serverprozess geladen werden." -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Listet dynamische Bibliotheken, die vorab in den Server geladen werden." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 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:4171 +#: utils/misc/guc.c:4292 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:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." msgstr "Zeigt die Zeichensatzkodierung des Servers (der Datenbank)." -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Zeigt die Serverversion." -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Setzt die aktuelle Rolle." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Setzt den Sitzungsbenutzernamen." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Setzt das Ziel für die Serverlogausgabe." -#: utils/misc/guc.c:4231 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", 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:4352 +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«, »jsonlog« und »eventlog«, je nach Plattform." -#: utils/misc/guc.c:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "Bestimmt das Zielverzeichnis für Logdateien." -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 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:4253 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "Bestimmt das Dateinamenmuster für Logdateien." -#: utils/misc/guc.c:4264 +#: utils/misc/guc.c:4385 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:4275 +#: utils/misc/guc.c:4396 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:4286 +#: utils/misc/guc.c:4407 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:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Wählt eine Datei mit Zeitzonenabkürzungen." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Setzt die Eigentümergruppe der Unix-Domain-Socket." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 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:4317 +#: utils/misc/guc.c:4438 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:4332 +#: utils/misc/guc.c:4453 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:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Setzt das Datenverzeichnis des Servers." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "Setzt die Hauptkonfigurationsdatei des Servers." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "Setzt die »hba«-Konfigurationsdatei des Servers." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "Setzt die »ident«-Konfigurationsdatei des Servers." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "Schreibt die Postmaster-PID in die angegebene Datei." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Zeigt den Namen der SSL-Bibliothek." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Ort der SSL-Serverzertifikatsdatei." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 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:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Ort der SSL-Certificate-Authority-Datei." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." msgstr "Ort der SSL-Certificate-Revocation-List-Datei." -#: utils/misc/guc.c:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." msgstr "Ort des SSL-Certificate-Revocation-List-Verzeichnisses." -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Schreibt temporäre Statistikdateien in das angegebene Verzeichnis." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 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:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Setzt die vorgegebene Textsuchekonfiguration." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Setzt die Liste der erlaubten SSL-Verschlüsselungsalgorithmen." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Setzt die für ECDH zu verwendende Kurve." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Setzt den Ort der SSL-DH-Parameter-Datei." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Befehl zum Einlesen von Passphrasen für SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 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:4562 +#: utils/misc/guc.c:4672 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:4573 +#: utils/misc/guc.c:4683 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:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "Zu verwendender JIT-Provider." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Backtrace für Fehler in diesen Funktionen loggen." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Bestimmt, ob »\\'« in Zeichenkettenkonstanten erlaubt ist." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Setzt das Ausgabeformat für bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 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:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 -#: utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 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:4646 -msgid "Compute query identifiers." -msgstr "Anfragebezeichner berechnen." +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "Schaltet die eingebaute Berechnung von Anfragebezeichnern ein." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 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:4657 +#: utils/misc/guc.c:4767 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:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." msgstr "Setzt die Standard-Komprimierungsmethode für komprimierbare Werte." -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "Setzt den Transaktionsisolationsgrad neuer Transaktionen." -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "Zeigt den Isolationsgrad der aktuellen Transaktion." -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Setzt das Ausgabeformat für Intervallwerte." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Setzt den Detailgrad von geloggten Meldungen." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Setzt die Meldungstypen, die geloggt werden." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 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:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Setzt die Anweisungsarten, die geloggt werden." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 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:4768 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Setzt das Sitzungsverhalten für Trigger und Regeln." -#: utils/misc/guc.c:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "Setzt den Synchronisationsgrad der aktuellen Transaktion." -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "Erlaubt die Archivierung von WAL-Dateien mittels archive_command." -#: utils/misc/guc.c:4798 +#: utils/misc/guc.c:4908 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:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "Ermöglicht das Loggen von Debug-Informationen über die Wiederherstellung." -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Sammelt Statistiken auf Funktionsebene über Datenbankaktivität." -#: utils/misc/guc.c:4834 +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Setzt die Konsistenz von Zugriffen auf Statistikdaten." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Komprimiert in WAL-Dateien geschriebene volle Seiten mit der angegebenen Methode." + +#: utils/misc/guc.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Setzt den Umfang der in den WAL geschriebenen Informationen." -#: utils/misc/guc.c:4844 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Wählt die zu verwendende Implementierung von dynamischem Shared Memory." -#: utils/misc/guc.c:4854 +#: utils/misc/guc.c:4986 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:4864 +#: utils/misc/guc.c:4996 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:4874 +#: utils/misc/guc.c:5006 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:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Huge Pages auf Linux oder Windows verwenden." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "Während der Wiederherstellung Blöcke, auf die verwiesen wird, vorab einlesen." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Im WAL vorausschauen, um Verweise auf ungecachte Daten zu finden." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Verwendung der Einrichtungen für parallele Anfragen erzwingen." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 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:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Wählt den Algorithmus zum Verschlüsseln von Passwörtern." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 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:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Setzt die minimale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc.c:4951 +#: utils/misc/guc.c:5093 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Setzt die maximale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc.c:4963 +#: utils/misc/guc.c:5105 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Setzt die Methode für das Synchronisieren des Datenverzeichnisses vor der Wiederherstellung nach einem Absturz." -#: utils/misc/guc.c:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "ungültiger Konfigurationsparametername »%s«" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Selbstdefinierte Parameternamen müssen zwei oder mehr einfache Bezeichner getrennt durch Punkte sein." -#: utils/misc/guc.c:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "»%s« ist ein reservierter Präfix." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "unbekannter Konfigurationsparameter »%s«" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, 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:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27966,12 +28819,12 @@ msgstr "" "Sie müssen die Kommandozeilenoption --config-file oder -D angegeben oder\n" "die Umgebungsvariable PGDATA setzen.\n" -#: utils/misc/guc.c:5880 +#: utils/misc/guc.c:6148 #, 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:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27981,7 +28834,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:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27991,7 +28844,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:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28001,181 +28854,187 @@ 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:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "Wert überschreitet Bereich für ganze Zahlen." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7649 utils/misc/guc.c:9103 #, 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:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7668 utils/misc/guc.c:8927 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "Parameter »%s« kann nicht geändert werden" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7701 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "Parameter »%s« kann jetzt nicht geändert werden" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11365 +#: utils/misc/guc.c:7728 utils/misc/guc.c:7790 utils/misc/guc.c:8903 +#: utils/misc/guc.c:11811 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7770 #, 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:7487 +#: utils/misc/guc.c:7829 #, 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:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9581 +#: utils/misc/guc.c:8482 utils/misc/guc.c:8529 utils/misc/guc.c:10016 #, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "nur Superuser oder Mitglieder von pg_read_all_settings können »%s« ansehen" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "nur Superuser oder Rollen mit den Privilegien von pg_read_all_settings können »%s« ansehen" -#: utils/misc/guc.c:8251 +#: utils/misc/guc.c:8613 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s darf nur ein Argument haben" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8893 #, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "nur Superuser können den Befehl ALTER SYSTEM ausführen" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "keine Berechtigung um ALTER SYSTEM RESET ALL auszuführen" -#: utils/misc/guc.c:8580 +#: utils/misc/guc.c:8960 #, 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:8625 +#: utils/misc/guc.c:9005 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "konnte Inhalt der Datei »%s« nicht parsen" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9179 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT ist nicht implementiert" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9266 #, c-format msgid "SET requires parameter name" msgstr "SET benötigt Parameternamen" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9399 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "Versuch, den Parameter »%s« zu redefinieren" -#: utils/misc/guc.c:10812 +#: utils/misc/guc.c:9726 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "ungültiger Konfigurationsparametername »%s«, wird entfernt" + +#: utils/misc/guc.c:9728 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "»%s« ist jetzt ein reservierter Präfix." + +#: utils/misc/guc.c:11251 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "beim Setzen von Parameter »%s« auf »%s«" -#: utils/misc/guc.c:10977 +#: utils/misc/guc.c:11420 #, c-format msgid "parameter \"%s\" could not be set" msgstr "Parameter »%s« kann nicht gesetzt werden" -#: utils/misc/guc.c:11069 +#: utils/misc/guc.c:11512 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:11427 utils/misc/guc.c:11461 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "ungültiger Wert für Parameter »%s«: %d" - -#: utils/misc/guc.c:11495 +#: utils/misc/guc.c:11943 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" -#: utils/misc/guc.c:11782 +#: utils/misc/guc.c:12256 #, 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:11794 +#: utils/misc/guc.c:12268 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour wird von dieser Installation nicht unterstützt" -#: utils/misc/guc.c:11807 +#: utils/misc/guc.c:12281 #, c-format msgid "SSL is not supported by this build" msgstr "SSL wird von dieser Installation nicht unterstützt" -#: utils/misc/guc.c:11819 +#: utils/misc/guc.c:12293 #, 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:11831 +#: utils/misc/guc.c:12305 #, 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:12061 +#: utils/misc/guc.c:12535 #, 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:12074 +#: utils/misc/guc.c:12548 #, 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:12088 +#: utils/misc/guc.c:12562 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "huge_page_size muss auf dieser Plattform 0 sein." -#: utils/misc/guc.c:12102 +#: utils/misc/guc.c:12574 #, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "client_connection_check_interval muss auf Plattformen ohne POLLRDHUP auf 0 gesetzt sein." +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "client_connection_check_interval muss auf dieser Plattform auf 0 gesetzt sein." -#: utils/misc/guc.c:12230 +#: utils/misc/guc.c:12686 #, c-format msgid "invalid character" msgstr "ungültiges Zeichen" -#: utils/misc/guc.c:12290 +#: utils/misc/guc.c:12746 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline ist keine gültige Zahl." -#: utils/misc/guc.c:12330 +#: utils/misc/guc.c:12786 #, c-format msgid "multiple recovery targets specified" msgstr "mehrere Wiederherstellungsziele angegeben" -#: utils/misc/guc.c:12331 +#: utils/misc/guc.c:12787 #, 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:12339 +#: utils/misc/guc.c:12795 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Der einzige erlaubte Wert ist »immediate«." @@ -28185,11 +29044,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:63 utils/misc/pg_controldata.c:143 #: utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 #, c-format @@ -28211,7 +29065,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:497 +#: 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" @@ -28281,7 +29135,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:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Fehler während der Erzeugung des Speicherkontexts »%s«." @@ -28304,89 +29158,89 @@ msgstr "Fehler bei Anfrage mit Größe %zu im Speicherkontext »%s«." msgid "logging memory contexts of PID %d" 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:401 +#: 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:479 +#: 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:487 +#: 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:738 +#: 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:1279 +#: 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:431 utils/sort/sharedtuplestore.c:440 -#: utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 -#: utils/sort/sharedtuplestore.c:497 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, 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:486 +#: utils/sort/sharedtuplestore.c:487 #, 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:570 +#: utils/sort/sharedtuplestore.c:572 #, 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:577 +#: utils/sort/sharedtuplestore.c:579 #, 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:3218 +#: utils/sort/tuplesort.c:3322 #, 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:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "konnte Unique Index »%s« nicht erstellen" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "Schlüssel %s ist doppelt vorhanden." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Es existieren doppelte Schlüssel." diff --git a/third_party/spanner_pg/src/backend/po/es.po b/third_party/spanner_pg/src/backend/po/es.po index 9489c802..7c7ae445 100644 --- a/third_party/spanner_pg/src/backend/po/es.po +++ b/third_party/spanner_pg/src/backend/po/es.po @@ -42,9 +42,13 @@ # rule regla de reescritura # schema esquema # to skip ignorar -# trigger disparador +# WAL file archivo WAL # window function función de ventana deslizante # +# Algunos términos los dejamos sin traducir y los ponemos en comillas: +# “fork”, “posting list”, “savepoint”, “unlogged”, “publisher” +# FIXME: disparador -> “trigger”, agregar comillas; candado -> “lock”? +# # FIXME varios: # * "port" se traduce en forma inconsistente; corregir # * "window function" probablemente debería ser "función de ventana deslizante" @@ -60,10 +64,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL server 14\n" +"Project-Id-Version: PostgreSQL server 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:55+0000\n" -"PO-Revision-Date: 2023-05-08 11:28+0200\n" +"POT-Creation-Date: 2023-05-07 16:41+0000\n" +"PO-Revision-Date: 2023-05-09 12:14+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -73,6 +77,46 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: BlackCAT 1.1\n" +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "esta instalación no soporta compresión con %s" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "se encontró una cadena vacía donde se esperaba una opción de compresión" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "opción de compresión no reconocida: «%s»" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "la opción de compresión «%s» requiere un valor" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "el valor para la opción de compresión «%s» debe ser un entero" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "el algoritmo de compresión «%s» no acepta un nivel de compresión" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "el algoritmo de compresión «%s» espera un nivel de compresión entre %d y %d (por omisión %d)" + +#: ../common/compression.c:353 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes" + #: ../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 @@ -80,68 +124,66 @@ msgstr "" msgid "not recorded" msgstr "no registrado" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1516 commands/extension.c:3464 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 +#: commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 #, 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 +#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1329 access/transam/xlog.c:3573 -#: access/transam/xlog.c:4817 access/transam/xlog.c:11625 -#: access/transam/xlog.c:11638 access/transam/xlog.c:12093 -#: access/transam/xlog.c:12173 access/transam/xlog.c:12210 -#: access/transam/xlog.c:12270 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3474 libpq/hba.c:534 -#: replication/basebackup.c:2026 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 -#: replication/logical/snapbuild.c:1851 replication/logical/snapbuild.c:1893 -#: replication/logical/snapbuild.c:1920 replication/slot.c:1727 -#: replication/slot.c:1768 replication/walsender.c:545 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 +#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1197 +#: access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 +#: access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 +#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 +#: replication/logical/snapbuild.c:1927 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: 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 "no se pudo leer el archivo «%s»: %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/xlog.c:3578 access/transam/xlog.c:4822 -#: replication/basebackup.c:2030 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1856 -#: replication/logical/snapbuild.c:1898 replication/logical/snapbuild.c:1925 -#: replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 -#: utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 +#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 +#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:817 #, 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" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 -#: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 +#: ../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:1341 -#: access/transam/twophase.c:1746 access/transam/xlog.c:3442 -#: access/transam/xlog.c:3613 access/transam/xlog.c:3618 -#: access/transam/xlog.c:3946 access/transam/xlog.c:4787 -#: access/transam/xlog.c:5712 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:5009 -#: replication/logical/snapbuild.c:1760 replication/logical/snapbuild.c:1933 -#: replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 -#: utils/cache/relmapper.c:898 +#: 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:4738 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:5016 +#: replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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 "no se pudo cerrar el archivo «%s»: %m" -#: ../common/controldata_utils.c:135 +#: ../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "discordancia en orden de bytes" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:126 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -155,82 +197,85 @@ msgstr "" "serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" "directorio de datos." -#: ../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:1264 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1285 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3484 -#: access/transam/xlog.c:3528 access/transam/xlog.c:3726 -#: access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1616 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 -#: replication/logical/reorderbuffer.c:4931 -#: replication/logical/snapbuild.c:1715 replication/logical/snapbuild.c:1822 -#: replication/slot.c:1699 replication/walsender.c:518 -#: replication/walsender.c:2563 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 -#: storage/file/fd.c:3616 storage/smgr/md.c:503 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 -#: utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: 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:4209 +#: access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:538 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:8991 utils/misc/guc.c:9040 #, 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:1719 access/transam/twophase.c:1728 -#: access/transam/xlog.c:11382 access/transam/xlog.c:11420 -#: access/transam/xlog.c:11833 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5681 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 +#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 +#: access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5630 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: utils/cache/relmapper.c:934 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %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: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:1740 -#: access/transam/xlog.c:3435 access/transam/xlog.c:3607 -#: access/transam/xlog.c:4780 access/transam/xlog.c:10865 -#: access/transam/xlog.c:10906 replication/logical/snapbuild.c:1753 -#: replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 -#: storage/file/fd.c:3637 storage/smgr/md.c:951 storage/smgr/md.c:992 -#: storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: 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:7973 +#: access/transam/xlog.c:8016 backup/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1760 replication/slot.c:1684 +#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:989 storage/smgr/md.c:1030 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 #, 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:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 -#: lib/dshash.c:245 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:2547 -#: postmaster/postmaster.c:4205 postmaster/postmaster.c:5606 -#: postmaster/postmaster.c:5970 -#: replication/libpqwalreceiver/libpqwalreceiver.c:287 -#: replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 -#: storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1459 +#: ../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:587 lib/dshash.c:253 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:2591 postmaster/postmaster.c:4177 +#: postmaster/postmaster.c:5555 postmaster/postmaster.c:5926 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 #: storage/ipc/procarray.c:2281 storage/ipc/procarray.c:2288 -#: storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3470 -#: 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 +#: storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3424 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5049 -#: utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 #: utils/misc/tzparser.c:476 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:1088 utils/mmgr/mcxt.c:1119 #: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 @@ -239,6 +284,22 @@ msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" msgid "out of memory" msgstr "memoria agotada" +#: ../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 "éxito" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "el búfer de destino es demasiado pequeño" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "falla de openSSL" + #: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" @@ -259,28 +320,28 @@ msgstr "no se pudo leer el binario «%s»" msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: ../common/exec.c:299 access/transam/xlog.c:11256 -#: replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8319 backup/basebackup.c:1340 +#: utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "no se pudo leer el enlace simbólico «%s»: %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 -#: storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 -#: storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, c-format msgid "%s() failed: %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 -#: ../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" @@ -292,141 +353,148 @@ 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:1297 -#: access/transam/xlog.c:11358 access/transam/xlog.c:11396 -#: access/transam/xlog.c:11613 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:806 -#: commands/tablespace.c:897 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1632 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 -#: storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 guc-file.l:1062 +#: ../common/file_utils.c:455 access/transam/twophase.c:1316 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 +#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:597 +#: replication/logical/snapbuild.c:1639 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 guc-file.l:1061 #, 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:729 -#: commands/tablespace.c:739 postmaster/postmaster.c:1515 -#: storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 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 "no se pudo abrir el directorio «%s»: %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 #, 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:1772 -#: replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 -#: storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1779 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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 "no se pudo renombrar el archivo de «%s» a «%s»: %m" -#: ../common/jsonapi.c:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "error interno" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "La secuencia de escape «%s» no es válida." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Los caracteres con valor 0x%02x deben ser escapados." -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Se esperaba el fin de la entrada, se encontró «%s»." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Se esperaba un elemento de array o «]», se encontró «%s»." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Se esperaba «,» o «]», se encontró «%s»." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Se esperaba «:», se encontró «%s»." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Se esperaba un valor JSON, se encontró «%s»." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "La cadena de entrada terminó inesperadamente." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Se esperaba una cadena o «}», se encontró «%s»." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Se esperaba «,» o «}», se encontró «%s»." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Se esperaba una cadena, se encontró «%s»." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "El elemento «%s» no es válido." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 no puede ser convertido a text." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8." -#: ../common/jsonapi.c:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»." -#: ../common/jsonapi.c:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 jsonpath_scan.l:527 jsonpath_scan.l:537 +#: jsonpath_scan.l:579 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»." -#: ../common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal: " - -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "error: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "precaución: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalle: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "consejo: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -440,9 +508,9 @@ msgstr "nombre de «fork» no válido" #: ../common/relpath.c:62 #, c-format msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." -msgstr "Los nombres de «fork» válidos son «main», «fsm», «vm» e «init»." +msgstr "Los nombres aceptables de «fork» son «main», «fsm», «vm» e «init»." -#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2553 +#: ../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 "no se pudo cargar la biblioteca «%s»: código de error %lu" @@ -477,13 +545,12 @@ msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu msgid "could not re-execute with restricted token: error code %lu" msgstr "no se pudo re-ejecutar con el token restringido: código de error %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 "no se pudo obtener el código de salida del subproceso»: código de error %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1187 -#: replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m" @@ -493,6 +560,18 @@ msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m" msgid "could not remove file or directory \"%s\": %m" msgstr "no se pudo borrar el archivo o el directorio «%s»: %m" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "no se pudo codificar la sal" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "no se pudo codificar la llave almacenada" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "no se pudo codificar la llave del servidor" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -514,7 +593,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:2053 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "usuario no existe" @@ -553,12 +632,12 @@ msgstr "el proceso hijo fue terminado por una señal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "el proceso hijo terminó con código %d no reconocido" -#: ../port/chklocale.c:307 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "no se pudo determinar la codificación para el codeset «%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 "no se pudo determinar la codificación para la configuración regional «%s»: el codeset es «%s»" @@ -583,30 +662,30 @@ msgstr "no se pudo obtener junction para «%s»: %s" msgid "could not get junction for \"%s\": %s\n" msgstr "no se pudo obtener junction para «%s»: %s\n" -#: ../port/open.c:126 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "no se pudo abrir el archivo «%s»: %s" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "lock violation" msgstr "infracción de bloqueo (locking violation)" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "sharing violation" msgstr "infracción de uso compartido (sharing violation)" -#: ../port/open.c:128 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Reintentando durante 30 segundos." -#: ../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 "Es posible que tenga antivirus, sistema de respaldos, o software similar interfiriendo con el sistema de bases de datos." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "no se pudo obtener el directorio de trabajo actual: %s\n" @@ -616,6 +695,16 @@ msgstr "no se pudo obtener el directorio de trabajo actual: %s\n" msgid "operating system error %d" msgstr "error %d de sistema operativo" +#: ../port/thread.c:100 ../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "no se pudo buscar el usuario local de ID %d: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "no existe un usuario local con ID %d" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -636,65 +725,65 @@ msgstr "no se pudo verificar el token de proceso: código de error %lu\n" msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "petición para sumarización BRIN de rango para el índice «%s» página %u no fue registrada" -#: access/brin/brin.c:1025 access/brin/brin.c:1129 access/gin/ginfast.c:1038 -#: access/transam/xlog.c:11027 access/transam/xlog.c:11564 -#: 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:1025 access/brin/brin.c:1126 access/gin/ginfast.c:1038 +#: 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 "la recuperación está en proceso" -#: access/brin/brin.c:1026 access/brin/brin.c:1130 +#: access/brin/brin.c:1026 access/brin/brin.c:1127 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Las funciones de control de BRIN no pueden ejecutarse durante la recuperación." -#: access/brin/brin.c:1034 access/brin/brin.c:1138 +#: access/brin/brin.c:1031 access/brin/brin.c:1132 #, c-format -msgid "block number out of range: %s" -msgstr "número de bloque fuera de rango: %s" +msgid "block number out of range: %lld" +msgstr "número de bloque fuera de rango: %lld" -#: access/brin/brin.c:1078 access/brin/brin.c:1164 +#: access/brin/brin.c:1075 access/brin/brin.c:1158 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "«%s» no es un índice BRIN" -#: access/brin/brin.c:1094 access/brin/brin.c:1180 +#: access/brin/brin.c:1091 access/brin/brin.c:1174 #, c-format msgid "could not open parent table of index \"%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_bloom.c:750 access/brin/brin_bloom.c:792 #: access/brin/brin_minmax_multi.c:3012 access/brin/brin_minmax_multi.c:3155 -#: 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 +#: 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 "no se puede aceptar un valor de tipo %s" #: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 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 +#: access/brin/brin_minmax_multi.c:2185 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 fuera de rango" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "el tamaño de fila de índice %zu excede el máximo %zu para el índice «%s»" @@ -797,91 +886,91 @@ msgstr "El atributo «%s» de tipo %s no existe en el tipo %s." msgid "number of columns (%d) exceeds limit (%d)" msgstr "el número de columnas (%d) excede el límite (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format 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:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 #, 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" #: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1906 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "código de formato no soportado: %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Los valores aceptables son «on», «off» y «auto»." -#: access/common/reloptions.c:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Los valores aceptables son «local» y «cascaded»." -#: access/common/reloptions.c:682 +#: access/common/reloptions.c:691 #, 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:1225 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET no debe incluir valores de parámetros" -#: access/common/reloptions.c:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "espacio de nombre de parámetro «%s» no reconocido" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12538 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12986 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "las tablas declaradas WITH OIDS no está soportado" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "parámetro «%s» no reconocido" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, 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:1592 +#: access/common/reloptions.c:1601 #, 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:1604 +#: access/common/reloptions.c:1613 #, 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:1610 access/common/reloptions.c:1630 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, 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:1612 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Los valores aceptables están entre «%d» y «%d»." -#: access/common/reloptions.c:1624 +#: access/common/reloptions.c:1633 #, 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:1632 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Valores aceptables están entre «%f» y «%f»." -#: access/common/reloptions.c:1654 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "valor no válido para la opción enum «%s»: %s" @@ -896,14 +985,8 @@ msgstr "el método de compresión lz4 no está soportado" msgid "This functionality requires the server to be built with lz4 support." 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 -#, c-format -msgid "You need to rebuild PostgreSQL using %s." -msgstr "Necesita reconstruir PostgreSQL usando %s." - -#: access/common/tupdesc.c:825 parser/parse_clause.c:771 -#: parser/parse_relation.c:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "la columna «%s» no puede ser declarada SETOF" @@ -911,7 +994,7 @@ msgstr "la columna «%s» no puede ser declarada SETOF" #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" -msgstr "la «posting list» es demasiado larga" +msgstr "la “posting list” es demasiado larga" #: access/gin/ginbulk.c:45 #, c-format @@ -933,7 +1016,7 @@ msgstr "«%s» no es un índice GIN" msgid "cannot access temporary indexes of other sessions" msgstr "no se pueden acceder índices temporales de otras sesiones" -#: 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 "no se pudo volver a encontrar la tupla dentro del índice «%s»" @@ -948,8 +1031,8 @@ msgstr "los índices GIN antiguos no soportan recorridos del índice completo ni msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Para corregir esto, ejecute REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6486 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -972,18 +1055,18 @@ msgstr "falta la función de soporte %3$d o %4$d de la clase de operadores «%1$ msgid "support function number %d is invalid for access method %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 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "el índice «%s» contiene una tupla interna marcada como no válida" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 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 "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:800 access/gist/gistutil.c:811 -#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 +#: access/gist/gist.c:762 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 @@ -991,7 +1074,7 @@ msgstr "Esto es causado por una división de página incompleta durante una recu msgid "Please REINDEX it." msgstr "Por favor aplíquele REINDEX." -#: access/gist/gist.c:1175 +#: access/gist/gist.c:1176 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "arreglando división incompleta en el índice «%s», bloque %u" @@ -1006,13 +1089,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:797 access/hash/hashutil.c:224 +#: 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 "índice «%s» contiene páginas vacías no esperadas en el bloque %u" -#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 +#: 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" @@ -1029,39 +1112,39 @@ msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY op 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:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, 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:279 access/hash/hashfunc.c:336 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1971 commands/tablecmds.c:16949 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:1004 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17495 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 utils/adt/varlena.c:1499 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Use la cláusula COLLATE para establecer el ordenamiento explícitamente." -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:83 #, c-format 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:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, 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." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "número no válido de bloque de «overflow» %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 "se agotaron las páginas de desbordamiento en el índice hash «%s»" @@ -1091,33 +1174,33 @@ msgstr "la familia de operadores «%s» del método de acceso %s no tiene funci msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "faltan operadores entre tipos en la familia de operadores «%s» del método de acceso %s" -#: access/heap/heapam.c:2288 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "no se pueden insertar tuplas en un ayudante paralelo" -#: access/heap/heapam.c:2759 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "no se pueden eliminar tuplas durante una operación paralela" -#: access/heap/heapam.c:2805 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "se intentó eliminar una tupla invisible" -#: access/heap/heapam.c:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "no se pueden actualizar tuplas durante una operación paralela" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3307 #, c-format msgid "attempted to update invisible tuple" msgstr "se intentó actualizar una tupla invisible" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 +#: access/heap/heapam.c:4972 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»" @@ -1139,13 +1222,13 @@ msgstr "no se pudo escribir al archivo «%s», se escribió %d de %d: %m" #: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3351 access/transam/xlog.c:3542 -#: access/transam/xlog.c:4759 access/transam/xlog.c:11373 -#: access/transam/xlog.c:11411 access/transam/xlog.c:11816 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4630 -#: postmaster/postmaster.c:5668 replication/logical/origin.c:587 -#: replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1261 +#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 +#: access/transam/xlog.c:3964 access/transam/xlog.c:8653 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:517 +#: postmaster/postmaster.c:4604 postmaster/postmaster.c:5617 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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 "no se pudo crear archivo «%s»: %m" @@ -1157,180 +1240,170 @@ msgstr "no se pudo truncar el archivo «%s» a %u: %m" #: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3423 access/transam/xlog.c:3598 -#: access/transam/xlog.c:4771 postmaster/postmaster.c:4640 -#: postmaster/postmaster.c:4650 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1729 replication/slot.c:1586 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 -#: utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 -#: utils/misc/guc.c:10316 utils/misc/guc.c:10330 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 +#: access/transam/xlog.c:3976 commands/dbcommands.c:529 +#: postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 +#: replication/slot.c:1666 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:8721 +#: utils/misc/guc.c:8752 utils/misc/guc.c:10741 utils/misc/guc.c:10755 +#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" msgstr "no se pudo escribir a archivo «%s»: %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1679 -#: 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:4424 -#: replication/logical/snapbuild.c:1674 replication/logical/snapbuild.c:2090 -#: replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 -#: storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:344 storage/smgr/md.c:394 storage/sync/sync.c:250 +#: 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:4431 +#: replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 +#: replication/slot.c:1763 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:370 storage/smgr/md.c:429 storage/sync/sync.c:250 #: utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "no se pudo eliminar el archivo «%s»: %m" -#: access/heap/vacuumlazy.c:773 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "haciendo vacuum agresivamente a «%s.%s.%s»" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "haciendo vacuum a «%s.%s.%s»" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "se terminó el vacuum de «%s.%s.%s»: recorridos de índice: %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 "vacuum agresivo automático para prevenir wraparound de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:775 +#: access/heap/vacuumlazy.c:676 #, 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:780 +#: access/heap/vacuumlazy.c:681 #, 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:782 +#: access/heap/vacuumlazy.c:683 #, 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:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "páginas: %u eliminadas, %u quedan, %u recorridas (%.2f%% del total)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "tuplas: %lld eliminadas, %lld permanecen, %lld están muertas pero aún no se pueden quitar\n" + +#: access/heap/vacuumlazy.c:703 +#, c-format +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "tuplas faltantes: %lld muertas en %u páginas no eliminadas debido a contención del lock de limpieza\n" + +#: access/heap/vacuumlazy.c:708 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "punto de corte de removible: %u, que tenía %d XIDs de antigüedad cuando la operación terminó\n" + +#: access/heap/vacuumlazy.c:714 #, 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" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "nuevo relfrozenxid: %u, que está %d XIDs más adelante del valor anterior\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:721 #, c-format -msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %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" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "nuevo relminmxid: %u, que está %d MXIDs más adelante del valor anterior\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " msgstr "recorrido de índice no necesario: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "recorrido de índice necesario: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format 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:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "recorrido de índice pasado por alto: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "recorrido de índice pasado por alto debido a modo failsafe: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, c-format 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:834 +#: access/heap/vacuumlazy.c:755 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" 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 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, 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:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, 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:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, 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:857 +#: access/heap/vacuumlazy.c:785 #, c-format 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:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "uso de sistema: %s" -#: access/heap/vacuumlazy.c:933 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "haciendo vacuum agresivamente a «%s.%s»" - -#: access/heap/vacuumlazy.c:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "haciendo vacuum a «%s.%s»" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, 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:1656 -#, c-format -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: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: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:1666 commands/indexcmds.c:4135 -#: commands/indexcmds.c:4154 -#, c-format -msgid "%s." -msgstr "%s." - -#: access/heap/vacuumlazy.c:1669 -#, c-format -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: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:2617 +#: access/heap/vacuumlazy.c:2629 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" 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:2622 +#: access/heap/vacuumlazy.c:2634 #, 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:2623 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1339,104 +1412,67 @@ 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: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: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: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: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:3124 -#, 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.\n" -"%s." -msgstr "" -"%.0f versiones de filas del índice fueron eliminadas.\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:3233 +#: access/heap/vacuumlazy.c:2878 #, 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:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "tabla «%s»: truncadas %u a %u páginas" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format 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:3508 +#: access/heap/vacuumlazy.c:3170 #, 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:4274 +#: access/heap/vacuumlazy.c:3383 #, 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:4277 +#: access/heap/vacuumlazy.c:3386 #, 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:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "recorriendo la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4289 +#: access/heap/vacuumlazy.c:3398 #, 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:4292 +#: access/heap/vacuumlazy.c:3401 #, 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:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "mientras se hacía «vacuum» a la relación «%s.%s»" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, 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:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, 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:4312 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "error mientras se truncaba la relación «%s.%s» a %u bloques" @@ -1451,14 +1487,14 @@ msgstr "el método de acceso «%s» no es de tipo %s" 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 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "transacción abortada durante recorrido de catálogos de sistema" -#: access/index/indexam.c:142 catalog/objectaddress.c:1355 -#: commands/indexcmds.c:2799 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16647 commands/tablecmds.c:18394 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17183 commands/tablecmds.c:18962 #, c-format msgid "\"%s\" is not an index" msgstr "«%s» no es un índice" @@ -1468,23 +1504,23 @@ msgstr "«%s» no es un índice" msgid "operator class %s has no options" msgstr "clase de operadores «%s» no tiene opciones" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "llave duplicada viola restricción de unicidad «%s»" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Ya existe la llave %s." -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format 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:2330 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "el índice «%s» no es un btree" @@ -1494,27 +1530,27 @@ msgstr "el índice «%s» no es un btree" msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "discordancia de versión en índice «%s»: versión de archivo %d, versión de código %d, mínima versión soportada %d" -#: access/nbtree/nbtpage.c:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "el índice «%s» contiene una página interna parcialmente muerta" -#: 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 "Esto puede ser causado por la interrupción de un VACUUM en la versión 9.3 o anteriores, antes de actualizar. Ejecute REINDEX por favor." -#: 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 "el tamaño de fila de índice %1$zu excede el máximo %3$zu para btree versión %2$u para el índice «%4$s»" -#: access/nbtree/nbtutils.c:2671 +#: access/nbtree/nbtutils.c:2675 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "La tupla de índice hace referencia a la tupla (%u,%u) en la relación «%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" @@ -1533,7 +1569,7 @@ msgstr "falta una función de soporte para los tipos %3$s y %4$s en la familia d 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:1017 +#: access/spgist/spgutils.c:1016 #, 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" @@ -1549,14 +1585,14 @@ msgid "operator family \"%s\" of access method %s is missing support function %d msgstr "falta la función de soporte %3$d para el tipo %4$s de la clase de operadores «%1$s» del método de accesso %2$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» 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:13367 -#: commands/tablecmds.c:16656 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13880 +#: commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is a composite type" msgstr "«%s» es un tipo compuesto" @@ -1571,7 +1607,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:12462 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12910 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s es demasiado largo (máximo %d caracteres)." @@ -1591,22 +1627,22 @@ msgstr "No existe el método de acceso de tabla «%s»." msgid "sample percentage must be between 0 and 100" msgstr "el porcentaje de muestreo debe estar entre 0 y 100" -#: access/transam/commit_ts.c:280 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "no se puede obtener el timestamp de compromiso de la transacción %u" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "no se pudo obtener datos de compromiso de transacción" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:382 #, 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 primario." -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Asegúrese que el parámetro de configuración «%s» esté definido." @@ -1754,60 +1790,116 @@ msgstr "no se pudo mapear el segmento de memoria compartida dinámica" msgid "invalid magic number in dynamic shared memory segment" msgstr "número mágico no válido en segmento de memoria compartida dinámica" -#: access/transam/slru.c:713 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "el gestor de recursos con ID %d no está registrado" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Incluya el módulo de extensión que implementa este gestor de recursos en shared_preload_libraries." + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "el nombre de gestor de recursos personalizado no es válido" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Provea un nombre no vacío para el gestor de recursos personalizado." + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "el ID %d de gestor de recursos está fuera de rango" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Provea un ID de gestor de recursos personalizado entre %d y %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 "no se pudo registrar un gestor de recursos personalizado «%s» con ID %d" + +#: access/transam/rmgr.c:112 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "El gestor de recursos personalizado debe ser registrado en shared_preload_libraries." + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "El gestor de recursos «%s» ya está registrado con el mismo ID." + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "El gestor de recursos con ID %d tiene el mismo nombre." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "se registró el gestor de recursos «%s» con ID %d" + +#: access/transam/slru.c:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "el archivo «%s» no existe, leyendo como ceros" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "no se pudo encontrar el estado de la transacción %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "No se pudo abrir el archivo «%s»: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "No se pudo posicionar (seek) en el archivo «%s» a la posición %u: %m." +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "No se pudo posicionar (seek) en el archivo «%s» a la posición %d: %m." -#: access/transam/slru.c:960 +#: access/transam/slru.c:961 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "No se pudo leer desde el archivo «%s» en la posición %u: %m." +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "No se pudo leer desde el archivo «%s» en la posición %d: %m." -#: access/transam/slru.c:965 +#: access/transam/slru.c:966 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "No se pudo leer desde el archivo «%s» en la posición %u: se leyeron muy pocos bytes." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "No se pudo leer desde el archivo «%s» en la posición %d: se leyeron muy pocos bytes." -#: access/transam/slru.c:972 +#: access/transam/slru.c:973 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "No se pudo escribir al archivo «%s» en la posición %u: %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "No se pudo escribir al archivo «%s» en la posición %d: %m." -#: access/transam/slru.c:977 +#: access/transam/slru.c:978 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "No se pudo escribir al archivo «%s» en la posición %u: se escribieron muy pocos bytes." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "No se pudo escribir al archivo «%s» en la posición %d: se escribieron muy pocos bytes." -#: access/transam/slru.c:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "No se pudo sincronizar (fsync) archivo «%s»: %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "No se pudo cerrar el archivo «%s»: %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "no se pudo truncar el directorio «%s»: aparente problema por reciclaje de transacciones" @@ -1852,166 +1944,167 @@ msgstr "IDs de timeline deben ser menores que el ID de timeline del hijo." msgid "requested timeline %u is not in this server's history" msgstr "el timeline %u solicitado no está en la historia de este servidor" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:385 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "identificador de transacción «%s» es demasiado largo" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:392 #, c-format msgid "prepared transactions are disabled" msgstr "las transacciones preparadas están deshabilitadas" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:393 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Defina max_prepared_transactions a un valor distinto de cero." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:412 #, c-format 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:2452 +#: access/transam/twophase.c:421 access/transam/twophase.c:2486 #, 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:2453 +#: access/transam/twophase.c:422 access/transam/twophase.c:2487 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Incremente max_prepared_transactions (actualmente es %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "transacción preparada con identificador «%s» está ocupada" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:604 #, 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:602 +#: access/transam/twophase.c:605 #, 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:613 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transacción preparada pertenece a otra base de datos" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:617 #, 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:629 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "transacción preparada con identificador «%s» no existe" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1169 #, 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:1305 +#: 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] "tamaño incorrecto de archivo «%s»: %lld byte" msgstr[1] "tamaño incorrecto de archivo «%s»: %lld bytes" -#: access/transam/twophase.c:1314 +#: access/transam/twophase.c:1333 #, 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:1332 +#: access/transam/twophase.c:1351 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld" -#: access/transam/twophase.c:1347 +#: access/transam/twophase.c:1366 #, 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:1353 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "tamaño no válido en archivo «%s»" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1384 #, 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:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, 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:1417 +#: access/transam/twophase.c:1424 #, 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:1422 +#: access/transam/twophase.c:1429 #, 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:1430 +#: access/transam/twophase.c:1437 #, 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:1707 +#: access/transam/twophase.c:1733 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "no se pudo recrear archivo «%s»: %m" -#: access/transam/twophase.c:1834 +#: 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 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:2068 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "recuperando transacción preparada %u desde memoria compartida" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2187 #, 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:2166 +#: access/transam/twophase.c:2194 #, 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:2179 +#: access/transam/twophase.c:2207 #, 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:2186 +#: access/transam/twophase.c:2214 #, 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:2211 +#: access/transam/twophase.c:2239 #, 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:2216 +#: access/transam/twophase.c:2244 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "estado de dos fases en memoria corrupto para transacción %u" @@ -2045,570 +2138,891 @@ 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:1046 +#: access/transam/xact.c:1098 #, 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:1584 +#: access/transam/xact.c:1644 #, 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:2435 +#: access/transam/xact.c:2501 #, 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:2445 +#: access/transam/xact.c:2511 #, 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:3416 +#: access/transam/xact.c:3478 #, 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:3426 +#: access/transam/xact.c:3488 #, 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:3436 +#: access/transam/xact.c:3498 #, c-format -#| msgid "%s cannot be executed from a function" msgid "%s cannot be executed within a pipeline" msgstr "%s no puede ser ejecutado en un pipeline" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3508 #, 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:3517 access/transam/xact.c:3832 -#: access/transam/xact.c:3911 access/transam/xact.c:4034 -#: access/transam/xact.c:4185 access/transam/xact.c:4254 -#: access/transam/xact.c:4365 +#: access/transam/xact.c:3579 access/transam/xact.c:3894 +#: access/transam/xact.c:3973 access/transam/xact.c:4096 +#: access/transam/xact.c:4247 access/transam/xact.c:4316 +#: access/transam/xact.c:4427 #, 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:3718 +#: access/transam/xact.c:3780 #, c-format msgid "there is already a transaction in progress" msgstr "ya hay una transacción en curso" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 -#: access/transam/xact.c:4039 +#: access/transam/xact.c:3899 access/transam/xact.c:3978 +#: access/transam/xact.c:4101 #, c-format msgid "there is no transaction in progress" msgstr "no hay una transacción en curso" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3989 #, 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:4050 +#: access/transam/xact.c:4112 #, c-format msgid "cannot abort during a parallel operation" msgstr "no se puede abortar durante una operación paralela" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4211 #, 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:4236 +#: access/transam/xact.c:4298 #, 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:4246 access/transam/xact.c:4297 -#: access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4308 access/transam/xact.c:4359 +#: access/transam/xact.c:4419 access/transam/xact.c:4468 #, c-format msgid "savepoint \"%s\" does not exist" -msgstr "no existe el «savepoint» «%s»" +msgstr "no existe el “savepoint” «%s»" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4365 access/transam/xact.c:4474 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" -msgstr "el «savepoint» «%s» no existe dentro del nivel de savepoint actual" +msgstr "el “savepoint” «%s» no existe dentro del nivel de savepoint actual" -#: access/transam/xact.c:4345 +#: access/transam/xact.c:4407 #, 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:4473 +#: access/transam/xact.c:4535 #, 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:4541 +#: access/transam/xact.c:4603 #, 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:5188 +#: access/transam/xact.c:5250 #, 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:1836 +#: access/transam/xlog.c:1463 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" 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:2609 +#: access/transam/xlog.c:2224 #, 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:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "Se sabe que esto falla ocasionalmente durante la recuperación desde archivo, donde es inocuo." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 -#: replication/walsender.c:2557 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, 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:4289 +#: access/transam/xlog.c:3756 #, c-format msgid "could not rename file \"%s\": %m" msgstr "no se pudo renombrar el archivo «%s»: %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "no existe el directorio WAL «%s»" -#: access/transam/xlog.c:4347 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "creando el directorio WAL faltante «%s»" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2208 +#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "no se pudo crear el directorio faltante «%s»: %m" -#: access/transam/xlog.c:4472 -#, 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:4610 -#, 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:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "el nuevo timeline destino es %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3884 #, c-format msgid "could not generate secret authorization token" msgstr "no se pudo generar un token de autorización secreto" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 -#: access/transam/xlog.c:4871 access/transam/xlog.c:4878 -#: access/transam/xlog.c:4885 access/transam/xlog.c:4890 -#: access/transam/xlog.c:4897 access/transam/xlog.c:4904 -#: access/transam/xlog.c:4911 access/transam/xlog.c:4918 -#: access/transam/xlog.c:4925 access/transam/xlog.c:4932 -#: access/transam/xlog.c:4941 access/transam/xlog.c:4948 -#: utils/init/miscinit.c:1583 +#: 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 "los archivos de base de datos son incompatibles con el servidor" -#: access/transam/xlog.c:4839 +#: 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 "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:4843 +#: 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 "Este puede ser un problema de discordancia en el orden de bytes. Parece que necesitará ejecutar initdb." -#: access/transam/xlog.c:4848 +#: 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 "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:4851 access/transam/xlog.c:4875 -#: access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: 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 "Parece que necesita ejecutar initdb." -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4067 #, 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:4872 +#: 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 "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:4879 +#: 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 "Los archivos de la base de datos fueron inicializados con MAXALIGN %d, pero el servidor fue compilado con MAXALIGN %d." -#: access/transam/xlog.c:4886 +#: 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 "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:4891 +#: 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 "Los archivos de base de datos fueron inicializados con BLCKSZ %d, pero el servidor fue compilado con BLCKSZ %d." -#: 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:4929 -#: access/transam/xlog.c:4936 access/transam/xlog.c:4944 -#: access/transam/xlog.c:4951 +#: 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 "Parece que necesita recompilar o ejecutar initdb." -#: access/transam/xlog.c:4898 +#: 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 "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:4905 +#: 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 "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:4912 +#: 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 "Los archivos de la base de datos fueron inicializados con NAMEDATALEN %d, pero el servidor fue compilado con NAMEDATALEN %d." -#: access/transam/xlog.c:4919 +#: 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 "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:4926 +#: 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 "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:4933 +#: 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 "Los archivos de base de datos fueron inicializados con LOBLKSIZE %d, pero el servidor fue compilado con LOBLKSIZE %d." -#: access/transam/xlog.c:4942 +#: 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 "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:4949 +#: 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 "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:4958 +#: 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] "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:4970 +#: access/transam/xlog.c:4175 #, 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:4974 +#: access/transam/xlog.c:4179 #, 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:5408 +#: access/transam/xlog.c:4620 #, 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:5416 +#: access/transam/xlog.c:4628 #, 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" +msgstr "no se pudo sincronizar (fsync) el archivo WAL de bootstrap: %m" -#: access/transam/xlog.c:5422 +#: access/transam/xlog.c:4634 #, 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:5483 +#: access/transam/xlog.c:4852 #, 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" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "el WAL fue generado con wal_level=minimal, no se puede continuar con la recuperación" -#: access/transam/xlog.c:5548 +#: access/transam/xlog.c:4853 #, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "el modo standby no está soportado en el modo mono-usuario" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Esto sucede si temporalmente define wal_level=minimal en el servidor." -#: access/transam/xlog.c:5565 +#: access/transam/xlog.c:4854 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "no se especifica primary_conninfo ni restore_command" +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Utilice un respaldo tomado después de establecer wal_level a un valor superior a minimal." -#: access/transam/xlog.c:5566 +#: access/transam/xlog.c:4918 #, 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í." +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:5574 +#: access/transam/xlog.c:4929 #, 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" +msgid "database system was shut down at %s" +msgstr "el sistema de bases de datos fue apagado en %s" -#: access/transam/xlog.c:5612 +#: access/transam/xlog.c:4935 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "no existe el timeline %u especificado como destino de recuperación" +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:5734 +#: access/transam/xlog.c:4941 #, c-format -msgid "archive recovery complete" -msgstr "recuperación completa" +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:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4947 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "deteniendo recuperación al alcanzar un estado consistente" +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:5821 +#: access/transam/xlog.c:4949 #, 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»" +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:5911 +#: access/transam/xlog.c:4955 #, 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" +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:5918 +#: access/transam/xlog.c:4957 #, 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" +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:5971 +#: access/transam/xlog.c:4963 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "deteniendo recuperación en el punto de recuperación «%s», hora %s" +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:5989 +#: access/transam/xlog.c:4969 #, 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»" +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:6056 +#: access/transam/xlog.c:5353 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "deteniendo recuperación de comprometer la transacción %u, hora %s" +msgid "WAL ends before end of online backup" +msgstr "WAL termina antes del fin del respaldo en línea" -#: access/transam/xlog.c:6064 +#: access/transam/xlog.c:5354 #, 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" +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:6109 +#: access/transam/xlog.c:5357 #, c-format -msgid "pausing at the end of recovery" -msgstr "pausando al final de la recuperación" +msgid "WAL ends before consistent recovery point" +msgstr "WAL termina antes del punto de recuperación consistente" -#: access/transam/xlog.c:6110 +#: access/transam/xlog.c:5405 #, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "Ejecute pg_wal_replay_resume() para promover." +msgid "selected new timeline ID: %u" +msgstr "seleccionado nuevo ID de timeline: %u" -#: access/transam/xlog.c:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5438 #, c-format -msgid "recovery has paused" -msgstr "la recuperación está en pausa" +msgid "archive recovery complete" +msgstr "recuperación completa" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6040 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Ejecute pg_wal_replay_resume() para continuar." +msgid "shutting down" +msgstr "apagando" -#: access/transam/xlog.c:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6079 #, c-format -msgid "hot standby is not possible because of insufficient parameter settings" -msgstr "hot standby no es posible porque la configuración de parámetros no es suficiente" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "empezando restartpoint:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6387 access/transam/xlog.c:6414 -#: access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6091 #, c-format -msgid "%s = %d is a lower setting than on the primary server, where its value was %d." -msgstr "%s = %d es una configuración menor que en el servidor primario, donde su valor era %d." +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "empezando checkpoint:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6396 +#: access/transam/xlog.c:6151 #, c-format -msgid "If recovery is unpaused, the server will shut down." -msgstr "Si se continúa con la recuperación, el servidor se apagará." +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 completado: se escribió %d buffers (%.1f%%); %d archivo(s) 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:6397 +#: access/transam/xlog.c:6171 #, c-format -msgid "You can then restart the server after making the necessary configuration changes." -msgstr "Luego puede reiniciar el servidor después de hacer los cambios necesarios en la configuración." +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 completado: se escribió %d buffers (%.1f%%); %d archivo(s) 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:6408 +#: access/transam/xlog.c:6606 #, c-format -msgid "promotion is not possible because of insufficient parameter settings" -msgstr "la promoción no es posible porque la configuración de parámetros no es suficiente" +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:6418 +#: access/transam/xlog.c:7163 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "Reinicie el servidor luego de hacer los cambios necesarios en la configuración." - -#: access/transam/xlog.c:6442 +msgid "recovery restart point at %X/%X" +msgstr "restartpoint de recuperación en %X/%X" + +#: access/transam/xlog.c:7165 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "se abortó la recuperación porque la configuración de parámetros no es suficiente" +msgid "Last completed transaction was at log time %s." +msgstr "Última transacción completada al tiempo de registro %s." -#: access/transam/xlog.c:6448 +#: access/transam/xlog.c:7412 #, c-format -msgid "You can restart the server after making the necessary configuration changes." -msgstr "Puede reiniciar el servidor luego de hacer los cambios necesarios en la configuración." +msgid "restore point \"%s\" created at %X/%X" +msgstr "punto de recuperación «%s» creado en %X/%X" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7619 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "el WAL fue generado con wal_level=minimal, no se puede continuar con la recuperación" +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:6471 +#: access/transam/xlog.c:7676 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Esto sucede si temporalmente define wal_level=minimal en el servidor." +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de checkpoint de detención" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:7734 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Utilice un respaldo tomado después de establecer wal_level a un valor superior a minimal." +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de checkpoint «online»" -#: access/transam/xlog.c:6541 +#: access/transam/xlog.c:7763 #, 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" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de fin-de-recuperación" -#: access/transam/xlog.c:6552 +#: access/transam/xlog.c:8021 #, c-format -msgid "database system was shut down at %s" -msgstr "el sistema de bases de datos fue apagado en %s" +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:6558 +#: access/transam/xlog.c:8027 #, 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" +msgid "could not fdatasync file \"%s\": %m" +msgstr "no se pudo sincronizar (fdatasync) archivo «%s»: %m" -#: access/transam/xlog.c:6564 +#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 #, 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" +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:6570 +#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 +#: access/transam/xlogfuncs.c:199 #, 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" +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:6572 +#: access/transam/xlog.c:8128 #, 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." +msgid "backup label too long (max %d bytes)" +msgstr "la etiqueta de respaldo es demasiado larga (máximo %d bytes)" -#: access/transam/xlog.c:6578 +#: access/transam/xlog.c:8244 #, 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" +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:6580 +#: access/transam/xlog.c:8246 access/transam/xlog.c:8602 #, 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." +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 primario, luego trate de ejecutar un respaldo en línea nuevamente." -#: access/transam/xlog.c:6586 +#: access/transam/xlog.c:8326 backup/basebackup.c:1345 utils/adt/misc.c:347 #, 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" +msgid "symbolic link \"%s\" target is too long" +msgstr "la ruta «%s» del enlace simbólico es demasiado larga" -#: access/transam/xlog.c:6592 +#: access/transam/xlog.c:8376 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "el archivo de control contiene un estado no válido del clúster" +msgid "tablespaces are not supported on this platform" +msgstr "tablespaces no están soportados en esta plataforma" + +#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 +#: access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 +#: access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 +#: access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "datos no válidos en archivo «%s»" + +#: access/transam/xlog.c:8552 backup/basebackup.c:1200 +#, 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:8553 backup/basebackup.c:1201 +#, 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:8600 +#, 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:8725 +#, 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:8739 +#, 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:8741 +#, 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:8748 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "todos los segmentos de WAL requeridos han sido archivados" + +#: access/transam/xlog.c:8752 +#, 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:8801 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "abortando el backup porque el proceso servidor terminó antes de que pg_backup_stop fuera invocada" + +#: access/transam/xlogarchive.c:208 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "el archivo «%s» tiene tamaño erróneo: %lld en lugar de %lld" + +#: access/transam/xlogarchive.c:217 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "se ha restaurado el archivo «%s» desde el área de archivado" + +#: access/transam/xlogarchive.c:231 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command retornó un estado de salida cero, pero stat() falló." + +#: access/transam/xlogarchive.c:263 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "no se pudo recuperar el archivo «%s»: %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:376 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s «%s»: %s" + +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "no se pudo crear el archivo de estado «%s»: %m" + +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "no se pudo escribir el archivo de estado «%s»: %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "ya hay un respaldo en curso en esta sesión" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "no hay respaldo en curso" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "¿Invocó pg_backup_start()?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "Las funciones de control de WAL no pueden ejecutarse durante la recuperación." + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "el nivel de WAL no es suficiente para crear un punto de recuperación" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "el valor es demasiado largo para un punto de recuperación (máximo %d caracteres)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "No se puede ejecutar %s durante la recuperación." + +#: 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 "recovery is not in progress" +msgstr "la recuperación no está en proceso" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "Las funciones de control de recuperación sólo pueden ejecutarse durante la recuperación." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "la promoción del standby está en curso" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, 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." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "«wait_seconds» no puede ser negativo o cero" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "no se pudo enviar señal a postmaster: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "el servidor no se promovió en %d segundo" +msgstr[1] "el servidor no se promovió en %d segundos" + +#: access/transam/xlogprefetcher.c:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch no está soportado en plataformas que no tienen posix_fadvise()." + +#: access/transam/xlogreader.c:625 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "posición de registro no válida en %X/%X" + +#: access/transam/xlogreader.c:633 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "contrecord solicitado por %X/%X" + +#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 +#, 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:703 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u" + +#: access/transam/xlogreader.c:725 +#, 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:774 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "no hay bandera de contrecord en %X/%X" + +#: access/transam/xlogreader.c:787 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" + +#: access/transam/xlogreader.c:922 +#, c-format +msgid "missing contrecord at %X/%X" +msgstr "falta un contrecord en %X/%X" + +#: access/transam/xlogreader.c:1129 +#, 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:1142 access/transam/xlogreader.c:1158 +#, 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:1194 +#, 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:1231 +#, 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:1245 access/transam/xlogreader.c:1286 +#, 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:1260 +#, 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:1268 +#, 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:1274 +#, 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:1305 +#, 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:1330 +#, 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:1735 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %u fuera de orden en %X/%X" -#: access/transam/xlog.c:6649 +#: access/transam/xlogreader.c:1759 +#, 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:1766 +#, 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:1802 +#, 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:1818 +#, 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:1832 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X" + +#: access/transam/xlogreader.c:1847 +#, c-format +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 están definidos, pero el largo de imagen de bloque es %u en %X/%X" + +#: access/transam/xlogreader.c:1863 +#, 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:1875 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "block_id %u no válido en %X/%X" + +#: access/transam/xlogreader.c:1942 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "registro con largo no válido en %X/%X" + +#: access/transam/xlogreader.c:1967 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL" + +#: access/transam/xlogreader.c:2051 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "no se pudo restaurar la imagen en %X/%X con bloque especifica %d no válido" + +#: access/transam/xlogreader.c:2058 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d" + +#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d" + +#: access/transam/xlogreader.c:2111 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d" + +#: access/transam/xlogreader.c:2119 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d" + +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "entrando al modo standby" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, 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:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "comenzando el proceso de recuperación hasta %s" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "comenzando el proceso de recuperación hasta «%s»" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, 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:6668 +#: access/transam/xlogrecovery.c:564 #, 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:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "comenzando proceso de recuperación" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:651 #, 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:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2619,1588 +3033,1437 @@ 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:6755 +#: access/transam/xlogrecovery.c:661 #, 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:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 #, 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:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 #, 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:6818 access/transam/xlog.c:12349 +#: access/transam/xlogrecovery.c:724 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "El archivo «%s» fue renombrado a «%s»." -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:730 #, 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:6875 +#: access/transam/xlogrecovery.c:784 #, 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:6913 +#: access/transam/xlogrecovery.c:808 #, 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:6915 +#: access/transam/xlogrecovery.c:810 #, 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:6929 +#: access/transam/xlogrecovery.c:824 #, 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:6959 +#: access/transam/xlogrecovery.c:852 #, c-format msgid "invalid next transaction ID" msgstr "el siguiente ID de transacción no es válido" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:857 #, 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:7070 +#: access/transam/xlogrecovery.c:868 #, 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:7110 +#: access/transam/xlogrecovery.c:897 #, 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:7114 +#: access/transam/xlogrecovery.c:901 #, 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:7161 +#: access/transam/xlogrecovery.c:944 #, 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:7162 +#: access/transam/xlogrecovery.c:945 #, 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:7388 +#: access/transam/xlogrecovery.c:999 +#, 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/xlogrecovery.c:1064 +#, 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/xlogrecovery.c:1081 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "no se especifica primary_conninfo ni restore_command" + +#: access/transam/xlogrecovery.c:1082 +#, 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/xlogrecovery.c:1090 +#, 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/xlogrecovery.c:1128 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "no existe el timeline %u especificado como destino de recuperación" + +#: access/transam/xlogrecovery.c:1278 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "El ID de timeline interpretado es %u, pero se esperaba %u." + +#: access/transam/xlogrecovery.c:1660 #, c-format msgid "redo starts at %X/%X" msgstr "redo comienza en %X/%X" -#: access/transam/xlog.c:7613 +#: access/transam/xlogrecovery.c:1673 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo en progreso, tiempo transcurrido: %ld.%02d s, LSN actual: %X/%X" + +#: access/transam/xlogrecovery.c:1765 #, 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:7651 +#: access/transam/xlogrecovery.c:1797 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "redo listo en %X/%X utilización del sistema: %s" -#: access/transam/xlog.c:7657 +#: access/transam/xlogrecovery.c:1803 #, 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:7666 +#: access/transam/xlogrecovery.c:1812 #, c-format msgid "redo is not required" msgstr "no se requiere redo" -#: access/transam/xlog.c:7678 +#: access/transam/xlogrecovery.c:1823 #, 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:7762 access/transam/xlog.c:7766 -#, 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:7763 -#, 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:7767 -#, 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:7770 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL termina antes del punto de recuperación consistente" - -#: access/transam/xlog.c:7805 +#: access/transam/xlogrecovery.c:1998 #, c-format -msgid "selected new timeline ID: %u" -msgstr "seleccionado nuevo ID de timeline: %u" +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:8245 +#: access/transam/xlogrecovery.c:2065 #, c-format msgid "unexpected directory entry \"%s\" found in %s" -msgstr "elemento de directorio «%s» inesperado encontrado en %s" +msgstr "entrada de directorio inesperada «%s» fue encontrada en %s" -#: access/transam/xlog.c:8247 +#: access/transam/xlogrecovery.c:2067 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." -msgstr "Todas las entradas de directorios en pg_tblspc/ deberían ser enlaces simbólicos." +msgstr "Todas las entradas de directorio en pg_tblspc deberían ser enlaces simbólicos" -#: access/transam/xlog.c:8248 +#: access/transam/xlogrecovery.c:2068 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Elimine esos directorios, o configure allow_in_place_tablespaces a ON transitoriamente para permitir que la recuperación termine." +msgstr "Elimine esos directorios, o defina allow_in_place_tablespaces a ON transitoriamente para permitir que la recuperación pueda completarse." -#: access/transam/xlog.c:8332 +#: access/transam/xlogrecovery.c:2142 #, 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:8541 -#, 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:8545 -#, 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:8563 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "el registro del punto de control primario no es válido" - -#: access/transam/xlog.c:8567 -#, c-format -msgid "invalid checkpoint record" -msgstr "el registro del punto de control no es válido" - -#: access/transam/xlog.c:8578 -#, 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:8582 -#, 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:8595 -#, 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:8599 -#, 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:8610 -#, 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:8614 -#, 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:8795 -#, c-format -msgid "shutting down" -msgstr "apagando" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8834 -#, c-format -msgid "restartpoint starting:%s%s%s%s%s%s%s%s" -msgstr "empezando restartpoint:%s%s%s%s%s%s%s%s" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8846 -#, c-format -msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "empezando checkpoint:%s%s%s%s%s%s%s%s" - -#: access/transam/xlog.c:8906 -#, 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 "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:8926 -#, 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 "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:9370 -#, 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:9903 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "restartpoint de recuperación en %X/%X" - -#: access/transam/xlog.c:9905 -#, 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:10151 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "punto de recuperación «%s» creado en %X/%X" +msgid "WAL redo at %X/%X for %s" +msgstr "redo WAL en %X/%X para %s" -#: access/transam/xlog.c:10296 +#: access/transam/xlogrecovery.c:2276 #, 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:10305 +#: access/transam/xlogrecovery.c:2285 #, 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:10321 +#: access/transam/xlogrecovery.c:2301 #, 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:10396 -#, 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:10452 access/transam/xlog.c:10508 -#: access/transam/xlog.c:10538 -#, 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:10696 -#, 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:10911 -#, 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:10917 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "no se pudo sincronizar (fdatasync) archivo «%s»: %m" - -#: access/transam/xlog.c:11028 access/transam/xlog.c:11565 -#: 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 "Las funciones de control de WAL no pueden ejecutarse durante la recuperación." - -#: access/transam/xlog.c:11037 access/transam/xlog.c:11574 +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 #, 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:11038 access/transam/xlog.c:11575 -#: 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:11043 -#, 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:11080 access/transam/xlog.c:11364 -#: access/transam/xlog.c:11402 -#, c-format -msgid "a backup is already in progress" -msgstr "ya hay un respaldo en curso" +msgid "recovery stopping after reaching consistency" +msgstr "deteniendo recuperación al alcanzar un estado consistente" -#: access/transam/xlog.c:11081 +#: access/transam/xlogrecovery.c:2506 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Ejecute pg_stop_backup() e intente nuevamente." +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:11177 +#: access/transam/xlogrecovery.c:2596 #, 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" +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:11179 access/transam/xlog.c:11770 +#: access/transam/xlogrecovery.c:2603 #, 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 primario, luego trate de ejecutar un respaldo en línea nuevamente." +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:11263 replication/basebackup.c:1439 -#: utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2656 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "la ruta «%s» del enlace simbólico es demasiado larga" +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:11313 commands/tablespace.c:385 -#: commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "tablespaces no están soportados en esta plataforma" +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:11365 access/transam/xlog.c:11403 +#: access/transam/xlogrecovery.c:2741 #, 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." +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:11590 +#: access/transam/xlogrecovery.c:2749 #, c-format -msgid "exclusive backup not in progress" -msgstr "no hay un respaldo exclusivo en curso" +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:11617 +#: access/transam/xlogrecovery.c:2830 #, c-format -msgid "a backup is not in progress" -msgstr "no hay un respaldo en curso" +msgid "pausing at the end of recovery" +msgstr "pausando al final de la recuperación" -#: access/transam/xlog.c:11703 access/transam/xlog.c:11716 -#: access/transam/xlog.c:12107 access/transam/xlog.c:12113 -#: access/transam/xlog.c:12161 access/transam/xlog.c:12241 -#: access/transam/xlog.c:12265 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2831 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "datos no válidos en archivo «%s»" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Ejecute pg_wal_replay_resume() para promover." -#: access/transam/xlog.c:11720 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 #, c-format -msgid "the standby was promoted during online backup" -msgstr "el standby fue promovido durante el respaldo en línea" +msgid "recovery has paused" +msgstr "la recuperación está en pausa" -#: access/transam/xlog.c:11721 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2835 #, 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." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Ejecute pg_wal_replay_resume() para continuar." -#: access/transam/xlog.c:11768 +#: access/transam/xlogrecovery.c:3101 #, 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" +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:11888 +# XXX why talk about "log segment" instead of "file"? +#: access/transam/xlogrecovery.c:3306 #, 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" +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" -#: access/transam/xlog.c:11900 -#, 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)" +# XXX why talk about "log segment" instead of "file"? +#: access/transam/xlogrecovery.c:3312 +#, 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:11902 +#: access/transam/xlogrecovery.c:3961 #, 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." +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:11909 +#: access/transam/xlogrecovery.c:3965 #, c-format -msgid "all required WAL segments have been archived" -msgstr "todos los segmentos de WAL requeridos han sido archivados" +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:11913 +#: access/transam/xlogrecovery.c:3983 #, 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" +msgid "invalid primary checkpoint record" +msgstr "el registro del punto de control primario no es válido" -#: access/transam/xlog.c:11968 +#: access/transam/xlogrecovery.c:3987 #, 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" +msgid "invalid checkpoint record" +msgstr "el registro del punto de control no es válido" -#: access/transam/xlog.c:12162 +#: access/transam/xlogrecovery.c:3998 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "El ID de timeline interpretado es %u, pero se esperaba %u." +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" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12290 +#: access/transam/xlogrecovery.c:4002 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "redo WAL en %X/%X para %s" +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:12338 +#: access/transam/xlogrecovery.c:4015 #, c-format -msgid "online backup mode was not canceled" -msgstr "el modo de respaldo en línea no fue cancelado" +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:12339 +#: access/transam/xlogrecovery.c:4019 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "El archivo «%s» no se pudo renombrar a «%s»: %m." +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:12348 access/transam/xlog.c:12360 -#: access/transam/xlog.c:12370 +#: access/transam/xlogrecovery.c:4030 #, c-format -msgid "online backup mode canceled" -msgstr "el modo de respaldo en línea fue cancelado" +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:12361 +#: access/transam/xlogrecovery.c:4034 #, 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." +msgid "invalid length of checkpoint record" +msgstr "la longitud del registro de punto de control no es válida" -#: access/transam/xlog.c:12371 +#: access/transam/xlogrecovery.c:4090 #, 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." +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" -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlog.c:12504 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4104 #, 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" +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" -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlog.c:12510 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4123 #, 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" +msgid "new target timeline is %u" +msgstr "el nuevo timeline destino es %u" -#: access/transam/xlog.c:13061 +#: access/transam/xlogrecovery.c:4326 #, c-format msgid "WAL receiver process shutdown requested" msgstr "se recibió una petición de apagado para el proceso receptor de wal" -#: access/transam/xlog.c:13156 +#: access/transam/xlogrecovery.c:4389 #, c-format msgid "received promote request" msgstr "se recibió petición de promoción" -#: access/transam/xlog.c:13169 +#: access/transam/xlogrecovery.c:4402 #, c-format msgid "promote trigger file found: %s" msgstr "se encontró el archivo disparador de promoción: %s" -#: access/transam/xlog.c:13177 +#: access/transam/xlogrecovery.c:4410 #, 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 +#: access/transam/xlogrecovery.c:4635 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "el archivo «%s» tiene tamaño erróneo: %lld en lugar de %lld" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "hot standby no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 +#: access/transam/xlogrecovery.c:4693 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "se ha restaurado el archivo «%s» desde el área de archivado" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d es una configuración menor que en el servidor primario, donde su valor era %d." -#: access/transam/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4645 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command retornó un estado de salida cero, pero stat() falló." +msgid "If recovery is unpaused, the server will shut down." +msgstr "Si se continúa con la recuperación, el servidor se apagará." -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4646 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "no se pudo recuperar el archivo «%s»: %s" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "Luego puede reiniciar el servidor después de hacer los cambios necesarios en la configuración." -#. 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:4657 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s «%s»: %s" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "la promoción no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "no se pudo crear el archivo de estado «%s»: %m" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Reinicie el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "no se pudo escribir el archivo de estado «%s»: %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "se abortó la recuperación porque la configuración de parámetros no es suficiente" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4697 #, c-format -msgid "a backup is already in progress in this session" -msgstr "ya hay un respaldo en curso en esta sesión" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "Puede reiniciar el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +# XXX why talk about "log segment" instead of "file"? +#: access/transam/xlogutils.c:1053 #, c-format -msgid "non-exclusive backup in progress" -msgstr "respaldo no-exclusivo en curso" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "no se pudo leer del archivo de segmento %s, posición %d: %m" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +# XXX why talk about "log segment" instead of "file"? +#: access/transam/xlogutils.c:1060 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "¿Quiso usar pg_stop_backup('f')?" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "no se pudo leer del archivo de segmento %s, posición %d: leídos %d de %d" -#: 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:2510 executor/execSRF.c:738 executor/functions.c:1073 -#: 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:3328 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 -#: utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 -#: utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10017 -#: utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:253 #, 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" +msgid "expected end timeline %u but found timeline %u" +msgstr "se esperaba el timeline de término %u pero se encontró el timeline %u" -#: 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:3332 -#: 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:223 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10021 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:277 #, 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" +msgid "expected start timeline %u but found timeline %u" +msgstr "se esperaba el timeline de inicio %u pero se encontró el timeline %u" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:304 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "no hay un respaldo no-exclusivo en progreso" +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" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:355 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "¿Quiso usar pg_stop_backup('t')?" +msgid "could not rewind temporary file" +msgstr "no se puede rebobinar el archivo temporal" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:374 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "el nivel de WAL no es suficiente para crear un punto de recuperación" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "no se pudo leer el archivo temporal: se leyeron sólo %zu de %zu bytes" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:454 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "el valor es demasiado largo para un punto de recuperación (máximo %d caracteres)" +msgid "could not find any WAL files" +msgstr "no se pudo encontrar ningún archivo WAL" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "No se puede ejecutar %s durante la recuperación." +msgid "could not find WAL file \"%s\"" +msgstr "no se pudo encontrar archivo WAL «%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 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "recovery is not in progress" -msgstr "la recuperación no está en proceso" +msgid "unexpected WAL file size \"%s\"" +msgstr "tamaño del archivo WAL «%s» inesperado" -#: 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 +#: backup/basebackup.c:630 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Las funciones de control de recuperación sólo pueden ejecutarse durante la recuperación." +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +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" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:637 #, c-format -msgid "standby promotion is ongoing" -msgstr "la promoción del standby está en curso" +msgid "checksum verification failure during base backup" +msgstr "falla en verificación de checksums durante respaldo base" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, 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." +msgid "duplicate option \"%s\"" +msgstr "nombre de opción «%s» duplicada" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:734 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "«wait_seconds» no puede ser negativo o cero" +#| msgid "unrecognized object type \"%s\"" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "tipo de checkpoint no reconocido: «%s»" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:769 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "no se pudo enviar señal a postmaster: %m" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d está fuera del rango aceptable para el parámetro «%s» (%d .. %d)" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:814 #, c-format -msgid "server did not promote within %d second" -msgid_plural "server did not promote within %d seconds" -msgstr[0] "el servidor no se promovió en %d segundo" -msgstr[1] "el servidor no se promovió en %d segundos" +msgid "unrecognized manifest option: \"%s\"" +msgstr "opción de manifiesto «%s» no reconocida" -#: access/transam/xlogreader.c:354 +#: backup/basebackup.c:830 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "posición de registro no válida en %X/%X" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" -#: access/transam/xlogreader.c:362 +#: backup/basebackup.c:865 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "contrecord solicitado por %X/%X" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "algoritmo de compresión no reconocido: «%s»" -#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 +#: backup/basebackup.c:881 #, 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" +#| msgid "unrecognized column option \"%s\"" +msgid "unrecognized base backup option: \"%s\"" +msgstr "opción de respaldo base no reconocida: «%s»" -#: access/transam/xlogreader.c:429 +#: backup/basebackup.c:892 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "largo de registro %u en %X/%X demasiado largo" +msgid "manifest checksums require a backup manifest" +msgstr "la suma de comprobación del manifiesto requiere un manifiesto de la copia de seguridad" -#: access/transam/xlogreader.c:477 +#: backup/basebackup.c:901 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "no hay bandera de contrecord en %X/%X" +#| msgid "aggregates cannot have output arguments" +msgid "target detail cannot be used without target" +msgstr "no se puede usar la opción «target_detail» sin «target»" -#: access/transam/xlogreader.c:490 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" +#| msgid "operator class \"%s\" does not accept data type %s" +msgid "target \"%s\" does not accept a target detail" +msgstr "el destino «%s» no acepta un «target_detail»" -#: access/transam/xlogreader.c:741 +#: backup/basebackup.c:921 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ID de gestor de recursos %u no válido en %X/%X" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "el detalle de compresión no se puede especificar a menos que se active la compresión" -#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 +#: backup/basebackup.c:934 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "registro con prev-link %X/%X incorrecto en %X/%X" +msgid "invalid compression specification: %s" +msgstr "especificación de compresión no válida: %s" -#: access/transam/xlogreader.c:806 +#: backup/basebackup.c:1431 #, 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" +msgid "skipping special file \"%s\"" +msgstr "omitiendo el archivo especial «%s»" -#: access/transam/xlogreader.c:843 +#: backup/basebackup.c:1550 #, 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" +msgid "invalid segment number %d in file \"%s\"" +msgstr "número de segmento %d no válido en archivo «%s»" -#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 +#: backup/basebackup.c:1582 #, 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" +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 %u: el tamaño de búfer de lectura %d y el tamaño de página %d difieren" -#: access/transam/xlogreader.c:872 +#: backup/basebackup.c:1656 #, 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" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "verificación de checksums falló en archivo «%s», bloque %u: calculado %X pero se esperaba %X" -#: access/transam/xlogreader.c:880 +#: backup/basebackup.c:1663 #, 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" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "subsiguientes fallas de verificación de checksums en el archivo «%s» no se reportarán" -#: access/transam/xlogreader.c:886 +#: backup/basebackup.c:1719 #, 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" +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] "el archivo «%s» tiene un total de %d falla de verificación de checksum" +msgstr[1] "el archivo «%s» tiene un total de %d fallas de verificación de checksums" -#: access/transam/xlogreader.c:917 +#: backup/basebackup.c:1765 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u" +msgid "file name too long for tar format: \"%s\"" +msgstr "nombre de archivo demasiado largo para el formato tar: «%s»" -#: access/transam/xlogreader.c:942 +#: backup/basebackup.c:1770 #, 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" +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "destino de enlace simbólico demasiado largo para el formato tar: nombre de archivo «%s», destino «%s»" -#: access/transam/xlogreader.c:1287 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %u fuera de orden en %X/%X" +#| msgid "Bonjour is not supported by this build" +msgid "gzip compression is not supported by this build" +msgstr "la compresión gzip no está soportado en este servidor" -#: access/transam/xlogreader.c:1309 +#: backup/basebackup_gzip.c:143 #, 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" +msgid "could not initialize compression library" +msgstr "no se pudo inicializar la biblioteca de compresión" -#: access/transam/xlogreader.c:1316 +#: backup/basebackup_lz4.c:67 #, 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" +#| msgid "Bonjour is not supported by this build" +msgid "lz4 compression is not supported by this build" +msgstr "la compresión lz4 no está soportado en este servidor" -#: access/transam/xlogreader.c:1352 +#: backup/basebackup_server.c:75 #, 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" +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "debe ser superusuario o un rol con privilegios del rol pg_write_server_files para crear respaldos almacenados en el servidor" -#: access/transam/xlogreader.c:1368 +#: backup/basebackup_server.c:89 #, 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" +#| msgid "relative path not allowed for COPY to file" +msgid "relative path not allowed for backup stored on server" +msgstr "no se permiten rutas relativas para un respaldo almacenado en el servidor" -#: access/transam/xlogreader.c:1383 +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 #, 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" +msgid "could not create directory \"%s\": %m" +msgstr "no se pudo crear el directorio «%s»: %m" -#: access/transam/xlogreader.c:1398 +#: backup/basebackup_server.c:115 #, 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" +msgid "directory \"%s\" exists but is not empty" +msgstr "el directorio «%s» existe pero no está vacío" -#: access/transam/xlogreader.c:1414 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1076 #, 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 " +msgid "could not access directory \"%s\": %m" +msgstr "no se pudo acceder al directorio «%s»: %m" -#: access/transam/xlogreader.c:1426 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:487 storage/smgr/md.c:494 storage/smgr/md.c:785 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "block_id %u no válido en %X/%X" +msgid "Check free disk space." +msgstr "Verifique el espacio libre en disco." -#: access/transam/xlogreader.c:1513 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "registro con largo no válido en %X/%X" +#| 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 "no se pudo escribir el archivo «%s»: sólo se escribieron %d de %d bytes en la posición %u" + +#: backup/basebackup_target.c:146 +#, c-format +#| msgid "unrecognized reset target: \"%s\"" +msgid "unrecognized target: \"%s\"" +msgstr "destino no reconocido: «%s»" + +#: backup/basebackup_target.c:237 +#, c-format +#| msgid "parameter \"%s\" requires a Boolean value" +msgid "target \"%s\" requires a target detail" +msgstr "el destino «%s» requiere un «target_detail»" + +#: backup/basebackup_zstd.c:66 +#, c-format +#| msgid "Bonjour is not supported by this build" +msgid "zstd compression is not supported by this build" +msgstr "la compresión zstd no está soportada en este servidor" -#: access/transam/xlogreader.c:1602 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "imagen comprimida no válida en %X/%X, bloque %d" +msgid "could not set compression worker count to %d: %s" +msgstr "no se pudo definir la cantidad de procesos ayudantes de compresión a %d: %s" -#: 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 require un valor potencia de dos entre 1 MB y 1 GB" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%s requiere un valor" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" msgstr "-c %s requiere un valor" -#: 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 "Pruebe «%s --help» para mayor información.\n" -#: bootstrap/bootstrap.c:312 +#: bootstrap/bootstrap.c:305 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: argumentos de línea de órdenes no válidos\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:185 #, c-format msgid "grant options can only be granted to roles" msgstr "la opción de grant sólo puede ser otorgada a roles" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "no se otorgaron privilegios para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:312 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "no se otorgaron privilegios para «%s»" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:320 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "no todos los privilegios fueron otorgados para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:325 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "no todos los privilegios fueron otorgados para «%s»" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:336 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "ningún privilegio pudo ser revocado para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "ningún privilegio pudo ser revocado para «%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 "no todos los privilegios pudieron ser revocados para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "no todos los privilegios pudieron ser revocados para «%s»" -#: catalog/aclchk.c:379 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" msgstr "el cedente (grantor) debe ser el usuario actual" -#: 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 "el tipo de privilegio %s no es válido para una relación" -#: 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 "el tipo de privilegio %s no es válido para una secuencia" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "el tipo de privilegio %s no es válido para una base de datos" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "el tipo de privilegio %s no es válido para un dominio" -#: 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 "el tipo de privilegio %s no es válido para una función" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "el tipo de privilegio %s no es válido para un lenguaje" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "el tipo de privilegio %s no es válido para un objeto grande" -#: 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 "el tipo de privilegio %s no es válido para un esquema" -#: 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 "el tipo de privilegio %s no es válido para un procedimiento" -#: 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 "el tipo de privilegio %s no es válido para una rutina" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "el tipo de privilegio %s no es válido para un 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 "el tipo de privilegio %s no es válido para un tipo" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "el tipo de privilegio %s no es válido para un conector de datos externos" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "el tipo de privilegio %s no es válido para un servidor foráneo" -#: catalog/aclchk.c:537 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "el tipo de privilegio %s no es válido para un parámetro" + +#: catalog/aclchk.c:549 #, c-format msgid "column privileges are only valid for relations" 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 +#: 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 "no existe el objeto grande %u" -#: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 -#: commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 -#: commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 -#: commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 -#: commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 -#: commands/dbcommands.c:158 commands/dbcommands.c:167 -#: commands/dbcommands.c:176 commands/dbcommands.c:185 -#: commands/dbcommands.c:194 commands/dbcommands.c:203 -#: commands/dbcommands.c:212 commands/dbcommands.c:221 -#: commands/dbcommands.c:230 commands/dbcommands.c:239 -#: commands/dbcommands.c:261 commands/dbcommands.c:1503 -#: commands/dbcommands.c:1512 commands/dbcommands.c:1521 -#: commands/dbcommands.c:1530 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:2096 commands/functioncmds.c:2104 -#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 -#: commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 -#: commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 -#: commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 -#: 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:408 -#: replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 -#: replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 -#: replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 -#: replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "opciones contradictorias o redundantes" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "los privilegios por omisión no pueden definirse para columnas" -#: catalog/aclchk.c:1206 +#: catalog/aclchk.c:1246 #, c-format 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:557 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 -#: commands/tablecmds.c:7092 commands/tablecmds.c:7248 -#: commands/tablecmds.c:7298 commands/tablecmds.c:7372 -#: commands/tablecmds.c:7442 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7648 commands/tablecmds.c:7707 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7825 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 -#: commands/tablecmds.c:11726 commands/tablecmds.c:11907 -#: commands/tablecmds.c:12067 commands/tablecmds.c:13210 -#: commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2422 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3432 -#: parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2718 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 +#: commands/tablecmds.c:7477 commands/tablecmds.c:7551 +#: commands/tablecmds.c:7621 commands/tablecmds.c:7733 +#: commands/tablecmds.c:7827 commands/tablecmds.c:7886 +#: commands/tablecmds.c:7975 commands/tablecmds.c:8005 +#: commands/tablecmds.c:8133 commands/tablecmds.c:8215 +#: commands/tablecmds.c:8371 commands/tablecmds.c:8489 +#: commands/tablecmds.c:12218 commands/tablecmds.c:12399 +#: commands/tablecmds.c:12559 commands/tablecmds.c:13723 +#: commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2468 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2814 #, 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:1147 -#: commands/tablecmds.c:249 commands/tablecmds.c:16620 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17156 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» no es una secuencia" -#: catalog/aclchk.c:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "la secuencia «%s» sólo soporta los privilegios USAGE, SELECT, y UPDATE" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "el tipo de privilegio %s no es válido para una tabla" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "el tipo de privilegio %s no es válido para una columna" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "la secuencia «%s» sólo soporta el privilegio SELECT" -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "el lenguaje «%s» no es confiable (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 y REVOKE no están permitidos en lenguajes no confiables, porque sólo los superusuarios pueden usar lenguajes no confiables." -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "no se puede definir privilegios para tipos de array" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Defina los privilegios del tipo elemento en su lugar." -#: 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» no es un dominio" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "tipo de privilegio «%s» no reconocido" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "permiso denegado a la función de agregación %s" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "permiso denegado al ordenamiento (collation) %s" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "permiso denegado a la columna %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "permiso denegado a la conversión %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "permiso denegado a la base de datos %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "permiso denegado al dominio %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "permiso denegado al disparador por eventos %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "permiso denegado a la extensión %s" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "permiso denegado al conector de datos externos %s" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "permiso denegado al servidor foráneo %s" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "permiso denegado a la tabla foránea %s" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "permiso denegado a la función %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "permiso denegado al índice %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "permiso denegado al lenguaje %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "permiso denegado al objeto grande %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "permiso denegado a la vista materializada %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "permiso denegado a la clase de operadores %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "permiso denegado al operador %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "permiso denegado a la familia de operadores %s" -#: catalog/aclchk.c:3385 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "permiso denegado al parámetro %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "permiso denegado a la política %s" -#: catalog/aclchk.c:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "permiso denegado al procedimiento %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "permiso denegado a la publicación %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "permiso denegado a la rutina %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "permiso denegado al esquema %s" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 -#: commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 -#: commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "permiso denegado a la secuencia %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "permiso denegado al objeto de estadísticas %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "permiso denegado a la suscripción %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "permiso denegado a la tabla %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "permiso denegado al tablespace %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "permiso denegado a la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "permiso denegado a la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "permiso denegado al tipo %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "permiso denegado a la vista %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "debe ser dueño de la función de agregación %s" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "debe ser dueño del ordenamiento (collation) %s" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "debe ser dueño de la conversión %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "debe ser dueño de la base de datos %s" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "debe ser dueño del dominio %s" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "debe ser dueño del disparador por eventos %s" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "debe ser dueño de la extensión %s" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "debe ser dueño del conector de datos externos %s" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "debe ser dueño del servidor foráneo %s" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "debe ser dueño de la tabla foránea %s" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "debe ser dueño de la función %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "debe ser dueño del índice %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "debe ser dueño del lenguaje %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "debe ser dueño del objeto grande %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "debe ser dueño de la vista materializada %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "debe ser dueño de la clase de operadores %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "debe ser dueño del operador %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "debe ser dueño de la familia de operadores %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "debe ser dueño del procedimiento %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "debe ser dueño de la publicación %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "debe ser dueño de la rutina %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "debe ser dueño de la secuencia %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "debe ser dueño de la suscripción %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "debe ser dueño de la tabla %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "debe ser dueño del tipo %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "debe ser dueño de la vista %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "debe ser dueño del esquema %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "debe ser dueño del objeto de estadísticas %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "debe ser dueño del tablespace %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "debe ser dueño de la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "debe ser dueño del diccionario de búsqueda en texto %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "debe ser dueño de la relación %s" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "permiso denegado a la columna «%s» de la relación «%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 "no existe el atributo %d de la relación con OID %u" -#: 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 "no existe la relación con OID %u" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 #, c-format msgid "database with OID %u does not exist" msgstr "no existe la base de datos con OID %u" -#: 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 "no existe el ACL de parámetro con OID %u" + +#: 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 "no existe la función con OID %u" -#: 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 "no existe el lenguaje con OID %u" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "no existe el esquema con OID %u" -#: 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 "no existe el tablespace con OID %u" -#: 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 "no existe el conector de datos externos con OID %u" -#: 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 "no existe el servidor foráneo con OID %u" -#: 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 "no existe el tipo con OID %u" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "no existe el operador con OID %u" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "no existe la clase de operadores con OID %u" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "no existe la familia de operadores con OID %u" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "no existe el diccionario de búsqueda en texto con OID %u" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "no existe la configuración de búsqueda en texto con OID %u" -#: 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 "no existe el disparador por eventos con OID %u" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "no existe el ordenamiento (collation) con OID %u" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "no existe la conversión con OID %u" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "no existe la extensión con OID %u" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, 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:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "no existe la suscripción con OID %u" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "no existe el objeto de estadísticas con OID %u" -#: catalog/catalog.c:378 +#: catalog/catalog.c:447 #, 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 +#: 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] "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:405 +#: 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] "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:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "debe ser superusuario para invocar pg_nextoid()" +msgid "must be superuser to call %s()" +msgstr "debe ser superusuario para invocar %s()" -#: catalog/catalog.c:544 +#: catalog/catalog.c:614 #, 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:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "el índice «%s» no pertenece a la tabla «%s»" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la columna «%s» no es de tipo oid" -#: catalog/catalog.c:573 +#: catalog/catalog.c:643 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "«el índice %s» no es el índice para la columna «%s»" -#: catalog/dependency.c:821 catalog/dependency.c:1060 +#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#, 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:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "no se puede eliminar %s porque %s lo requiere" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Puede eliminar %s en su lugar." -#: 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s depende de %s" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "eliminando además %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4215,310 +4478,330 @@ msgstr[1] "" "\n" "y otros %d objetos (vea el registro del servidor para obtener la lista)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, 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:1197 catalog/dependency.c:1204 -#: catalog/dependency.c:1216 commands/tablecmds.c:1304 -#: commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 -#: commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1437 utils/misc/guc.c:7128 -#: utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11424 -#: utils/misc/guc.c:11458 utils/misc/guc.c:11492 utils/misc/guc.c:11535 -#: utils/misc/guc.c:11577 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11864 +#: utils/misc/guc.c:11898 utils/misc/guc.c:11932 utils/misc/guc.c:11975 +#: utils/misc/guc.c:12017 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, 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:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, 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:1882 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "no se puede usar una constante de tipo %s aquí" -#: catalog/heap.c:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "no existe la columna %d en la relación «%s»" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "se ha denegado el permiso para crear «%s.%s»" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Las modificaciones al catálogo del sistema están actualmente deshabilitadas." -#: catalog/heap.c:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 -#: commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6861 #, c-format msgid "tables can have at most %d columns" msgstr "las tablas pueden tener a lo más %d columnas" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7161 #, 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" -#: catalog/heap.c:543 +#: catalog/heap.c:500 #, c-format msgid "column name \"%s\" specified more than once" msgstr "el nombre de columna «%s» fue especificado más de una vez" #. translator: first %s is an integer not a name -#: catalog/heap.c:618 +#: catalog/heap.c:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "la columna %s de la llave de partición tiene pseudotipo %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "la columna «%s» tiene pseudotipo %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "un tipo compuesto %s no puede ser hecho miembro de sí mismo" #. translator: first %s is an integer not a name -#: catalog/heap.c:709 +#: catalog/heap.c:666 #, c-format 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:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, 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:1200 catalog/index.c:871 commands/createas.c:408 -#: commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:874 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "la relación «%s» ya existe" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 #: catalog/pg_type.c:931 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 +#: 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 "ya existe un tipo «%s»" -#: catalog/heap.c:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "el relfilenode de toast no se definió en modo de actualización binaria" + +#: catalog/heap.c:1216 #, 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:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "el valor de relfilende no se definió en modo de actualización binaria" + +#: catalog/heap.c:2127 #, 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:2731 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la restricción «check» «%s» ya existe" -#: catalog/heap.c:2901 catalog/index.c:885 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8710 +#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8863 #, 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:2908 +#: catalog/heap.c:2578 #, 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:2919 +#: catalog/heap.c:2589 #, 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:2929 +#: catalog/heap.c:2599 #, 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:2934 +#: catalog/heap.c:2604 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "mezclando la restricción «%s» con la definición heredada" -#: catalog/heap.c:3039 +#: catalog/heap.c:2709 #, 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:3041 +#: catalog/heap.c:2711 #, 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:3047 +#: catalog/heap.c:2717 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "no se puede usar una variable de fila completa (whole-row) en una expresión de generación de columna" -#: catalog/heap.c:3048 +#: catalog/heap.c:2718 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Esto causaría que la columna generada dependa de su propio valor." -#: catalog/heap.c:3101 +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" msgstr "la expresión de generación no es inmutable" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1288 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1288 #, 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:3134 commands/prepare.c:368 parser/analyze.c:2646 +#: 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:1293 #, 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:3181 +#: catalog/heap.c:2851 #, 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:3479 +#: catalog/heap.c:3149 #, 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:3480 +#: catalog/heap.c:3150 #, 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:3485 +#: catalog/heap.c:3155 #, 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:3486 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La tabla «%s» hace referencia a «%s»." -#: catalog/heap.c:3488 +#: catalog/heap.c:3158 #, 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:222 parser/parse_utilcmd.c:2183 +#: catalog/index.c:223 parser/parse_utilcmd.c:2185 #, 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:240 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "las llaves primarias no pueden ser expresiones" -#: catalog/index.c:257 +#: catalog/index.c:258 #, 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:770 catalog/index.c:1933 +#: catalog/index.c:773 catalog/index.c:1932 #, 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:810 +#: catalog/index.c:813 #, 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:825 +#: catalog/index.c:828 #, 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:834 catalog/index.c:1285 +#: catalog/index.c:837 catalog/index.c:1305 #, 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:843 +#: catalog/index.c:846 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "no se pueden crear índices compartidos después de initdb" -#: catalog/index.c:863 commands/createas.c:423 commands/sequence.c:162 +#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relación «%s» ya existe, omitiendo" -#: catalog/index.c:913 +#: catalog/index.c:916 #, 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:2230 +#: catalog/index.c:926 utils/cache/relcache.c:3743 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "el valor de relfilenode de índice no se definió en modo de actualización binaria" + +#: catalog/index.c:2231 #, 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:3626 +#: catalog/index.c:3635 #, 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:3637 commands/indexcmds.c:3555 +#: catalog/index.c:3646 commands/indexcmds.c:3543 #, 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:3653 commands/indexcmds.c:3435 commands/indexcmds.c:3579 -#: commands/tablecmds.c:3273 +#: catalog/index.c:3662 commands/indexcmds.c:3423 commands/indexcmds.c:3567 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "no se puede mover la relación de sistema «%s»" -#: catalog/index.c:3797 +#: catalog/index.c:3806 #, c-format msgid "index \"%s\" was reindexed" msgstr "el índice «%s» fue reindexado" -#: catalog/index.c:3934 +#: catalog/index.c:3943 #, 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:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5202 +#: commands/trigger.c:5781 #, 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»" @@ -4533,24 +4816,24 @@ msgstr "las tablas temporales no pueden especificar un nombre de esquema" msgid "could not obtain lock on relation \"%s.%s\"" msgstr "no se pudo bloquear un candado en la relación «%s.%s»" -#: catalog/namespace.c:402 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 "no se pudo bloquear un candado en la relación «%s»" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "no existe la relación «%s.%s»" -#: catalog/namespace.c:435 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 "no existe la relación «%s»" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1520 -#: commands/extension.c:1526 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 +#: commands/extension.c:1541 #, c-format msgid "no schema has been selected to create in" msgstr "no se ha seleccionado ningún esquema dentro del cual crear" @@ -4596,13 +4879,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:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 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:2889 parser/parse_expr.c:817 parser/parse_target.c:1262 -#: gram.y:15103 gram.y:17077 +#: catalog/namespace.c:2889 parser/parse_expr.c:813 parser/parse_target.c:1262 +#: gram.y:18258 gram.y:18298 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" @@ -4618,7 +4901,7 @@ 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:3098 commands/schemacmds.c:246 commands/schemacmds.c:326 -#: commands/tablecmds.c:1249 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "no existe el esquema «%s»" @@ -4653,234 +4936,239 @@ 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:4334 commands/tablespace.c:1216 commands/variable.c:64 -#: utils/misc/guc.c:11609 utils/misc/guc.c:11687 +#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12049 utils/misc/guc.c:12151 #, c-format msgid "List syntax is invalid." msgstr "La sintaxis de lista no es válida." -#: 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:2160 commands/tablecmds.c:6082 -#: commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12335 #, 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:6121 commands/tablecmds.c:16625 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17161 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:186 commands/tablecmds.c:261 -#: commands/tablecmds.c:16630 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17166 #, 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:6124 commands/tablecmds.c:16635 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17171 #, c-format msgid "\"%s\" is not a foreign table" msgstr "«%s» no es una tabla foránea" -#: catalog/objectaddress.c:1432 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "debe especificar nombre de relación y nombre de objeto" -#: 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 "el nombre de columna debe ser calificado" -#: catalog/objectaddress.c:1608 +#: catalog/objectaddress.c:1601 #, c-format 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: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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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 "no existe el tipo «%s»" -#: catalog/objectaddress.c:1764 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "no existe el operador %d (%s, %s) de %s" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "no existe la función %d (%s, %s) de %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 "no existe el mapeo para el usuario «%s» en el servidor «%s»" -#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "no existe el servidor «%s»" -#: catalog/objectaddress.c:1928 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "no existe la relación «%s» en la publicación «%s»" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, c-format +#| msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "no existe el esquema de publicación «%s» en la publicación «%s»" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "tipo de objeto para ACL por omisión «%c» no reconocido" -#: catalog/objectaddress.c:1991 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -msgstr "Tipos válidos de objeto son «%c», «%c», «%c», «%c» y «%c»." +msgstr "Tipos aceptables de objeto son «%c», «%c», «%c», «%c» y «%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 "no existe el ACL por omisión para el usuario «%s» en el esquema «%s» en %s" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "no existe el ACL por omisión para el usuario «%s» en %s" -#: 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 "las listas de nombres o argumentos no pueden contener nulls" -#: catalog/objectaddress.c:2108 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "tipo de objeto «%s» no soportado" -#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 -#: catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 +#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 #, c-format msgid "name list length must be exactly %d" msgstr "el largo de la lista de nombres debe ser exactamente %d" -#: catalog/objectaddress.c:2150 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "el OID de objeto grande no puede ser null" -#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 -#: catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "el largo de la lista de nombres debe ser al menos %d" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format 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:318 +#: catalog/objectaddress.c:2533 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:1583 +#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" msgstr "debe ser dueño del tipo %s o el tipo %s" -#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "debe ser superusuario" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "debe tener privilegio CREATEROLE" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, 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:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr " columna %s de %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "función %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "tipo %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "conversión de %s a %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "ordenamiento (collation) %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "restricción «%s» en %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "restricción %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "conversión %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "valor por omisión para %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "lenguaje %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "objeto grande %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "operador %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, 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:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "método de acceso %s" @@ -4889,7 +5177,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operador %d (%s, %s) de %s: %s" @@ -4898,221 +5186,231 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "regla %s en %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "disparador %s en %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "esquema %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" -msgstr "object de estadísticas %s" +msgstr "objeto de estadísticas %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "analizador de búsqueda en texto %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "diccionario de búsqueda en texto %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "plantilla de búsqueda en texto %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "configuración de búsqueda en texto %s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "rol %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "base de datos %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "conector de datos externos %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "servidor %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "mapeo para el usuario %s en el servidor %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, 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:3727 +#: catalog/objectaddress.c:3795 #, 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:3733 +#: catalog/objectaddress.c:3801 #, 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:3737 +#: catalog/objectaddress.c:3805 #, 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:3743 +#: catalog/objectaddress.c:3811 #, 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:3747 +#: catalog/objectaddress.c:3815 #, 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:3753 +#: catalog/objectaddress.c:3821 #, 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:3757 +#: catalog/objectaddress.c:3825 #, 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:3763 +#: catalog/objectaddress.c:3831 #, 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:3770 +#: catalog/objectaddress.c:3838 #, 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:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "privilegios por omisión pertenecientes al rol %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "extensión %s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "disparador por eventos %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "parámetro %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "política %s en %s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "publicación %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "publicación de esquema %s en la publicación %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "publicación de %s en la publicación %s" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "suscripción %s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "transformación para %s lenguaje %s" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "tabla %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "índice %s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "secuencia %s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "tabla toast %s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "vista %s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "vista materializada %s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "tipo compuesto %s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "tabla foránea %s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "relación %s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "familia de operadores %s para el método de acceso %s" @@ -5154,7 +5452,7 @@ msgstr "no se puede omitir el valor inicial cuando la función de transición es msgid "return type of inverse transition function %s is not %s" msgstr "el tipo de retorno de la función inversa de transición %s no es %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "la opción «strict» de las funciones de transición directa e inversa deben coincidir exactamente en la función de agregación" @@ -5169,7 +5467,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:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, 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" @@ -5184,12 +5482,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:190 catalog/pg_proc.c:224 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, 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:203 catalog/pg_proc.c:232 +#: 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 "uso inseguro de pseudotipo «internal»" @@ -5204,7 +5502,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:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "no se puede cambiar el tipo de rutina" @@ -5229,11 +5527,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: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 +#: 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 @@ -5260,37 +5558,87 @@ msgstr "la función %s requiere conversión de tipos en tiempo de ejecución" msgid "cast from type %s to type %s already exists" msgstr "ya existe una conversión del tipo %s al tipo %s" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "Esta operación no está soportada en tablas." + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "Esta operación no está soportada en índices." + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "Esta operación no está soportada en secuencias." + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "Esta operación no está soportada en tablas TOAST." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "Esta operación no está soportada en vistas." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "Esta operación no está soportada en vistas materializadas." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "Esta operación no está soportada en tipos compuestos." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "Esta operación no está soportada en tablas foráneas." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "Esta operación no está soportada en tablas particionadas." + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "Esta operación no está soportada en índices particionados." + +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "el ordenamiento «%s» ya existe, omitiendo" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "el ordenamiento «%s» para la codificación «%s» ya existe, omitiendo" -#: catalog/pg_collation.c:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "el ordenamiento «%s» ya existe" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "la codificación «%2$s» ya tiene un ordenamiento llamado «%1$s»" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "el dominio %2$s ya contiene una restricción llamada «%1$s»" -#: 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 "no existe la restricción «%s» para la tabla «%s»" -#: catalog/pg_constraint.c:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "no existe la restricción «%s» para el dominio %s" @@ -5305,27 +5653,27 @@ 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:218 commands/extension.c:3352 +#: catalog/pg_depend.c:222 commands/extension.c:3271 #, 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:225 catalog/pg_depend.c:276 commands/extension.c:3392 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s no es un miembro de la extensión «%s»" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "A una extensión no se le permite reemplazar un objeto que no posee." -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Una extensión sólo puede usar CREATE ... IF NOT EXISTS para omitir la creación de un objeto si el objeto en conflicto es uno de cual ya es dueña." -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, 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" @@ -5375,8 +5723,8 @@ msgstr "no se puede desprender la partición «%s»" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "La partición está siendo desprendida de forma concurrente o tiene un desprendimiento sin terminar." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4455 -#: commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15481 #, c-format 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." @@ -5456,44 +5804,56 @@ 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:131 parser/parse_func.c:2235 +#: catalog/pg_parameter_acl.c:52 +#, c-format +#| msgid "parameter ACL with OID %u does not exist" +msgid "parameter ACL \"%s\" does not exist" +msgstr "no existe el parámetro de ACL «%s»" + +#: catalog/pg_parameter_acl.c:87 +#, c-format +#| msgid "invalid type name \"%s\"" +msgid "invalid parameter name \"%s\"" +msgstr "el nombre de parámetro «%s» no es válido" + +#: 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] "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:375 +#: catalog/pg_proc.c:376 #, 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:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "«%s» es un índice parcial." -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "«%s» es una función de ventana deslizante." -#: catalog/pg_proc.c:413 +#: catalog/pg_proc.c:414 #, 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:414 catalog/pg_proc.c:444 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "no se puede cambiar el tipo de retorno de una función existente" @@ -5502,89 +5862,126 @@ 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:420 catalog/pg_proc.c:447 catalog/pg_proc.c:492 -#: catalog/pg_proc.c:518 catalog/pg_proc.c:544 +#: 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 "Use %s %s primero." -#: catalog/pg_proc.c:445 +#: catalog/pg_proc.c:446 #, 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:489 +#: catalog/pg_proc.c:490 #, 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:516 +#: catalog/pg_proc.c:517 #, 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:542 +#: catalog/pg_proc.c:543 #, 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:752 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "no hay ninguna función interna llamada «%s»" -#: catalog/pg_proc.c:850 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "las funciones SQL no pueden retornar el tipo %s" -#: catalog/pg_proc.c:865 +#: catalog/pg_proc.c:870 #, 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:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "función SQL «%s»" -#: catalog/pg_publication.c:60 +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 +#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "no se puede agregar la relación «%s» a la publicación" + +#: catalog/pg_publication.c:73 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "Esta operación no está soportada en tablas de sistema." + +#: catalog/pg_publication.c:81 #, c-format -msgid "Only tables can be added to publications." -msgstr "Sólo se pueden agregar tablas a las publicaciones." +msgid "This operation is not supported for temporary tables." +msgstr "Esta operación no está soportada en tablas temporales." -#: catalog/pg_publication.c:66 +#: catalog/pg_publication.c:87 #, c-format -msgid "\"%s\" is a system table" -msgstr "«%s» es una tabla de sistema" +msgid "This operation is not supported for unlogged tables." +msgstr "Esta característica no está soportada en tablas «unlogged»." -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "System tables cannot be added to publications." -msgstr "Las tablas de sistema no pueden agregarse a publicaciones." +msgid "cannot add schema \"%s\" to publication" +msgstr "no se puede agregar el esquema «%s» a la partición" -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:103 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "la tabla «%s» no puede replicarse" +#| msgid "This operation is not supported for system tables." +msgid "This operation is not supported for system schemas." +msgstr "Esta operación no está soportada en esquemas de sistema." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:111 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "Las tablas temporales o «unlogged» no pueden replicarse." +#| msgid "Temporary and unlogged relations cannot be replicated." +msgid "Temporary schemas cannot be replicated." +msgstr "Los esquemas temporales no pueden replicarse." -#: catalog/pg_publication.c:251 +#: catalog/pg_publication.c:374 #, 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:533 commands/publicationcmds.c:458 -#: commands/publicationcmds.c:786 +#: catalog/pg_publication.c:516 +#, c-format +#| msgid "cannot use system column \"%s\" in partition key" +msgid "cannot use system column \"%s\" in publication column list" +msgstr "no se puede usar la columna de sistema «%s» en lista de columnas de publicación" + +#: catalog/pg_publication.c:522 +#, c-format +#| msgid "cannot use generated column in partition key" +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "no se puede usar la columna generada «%s» en lista de columnas de publicación" + +#: catalog/pg_publication.c:528 +#, c-format +#| msgid "publication of %s in publication %s" +msgid "duplicate column \"%s\" in publication column list" +msgstr "columna duplicada «%s» en lista de columnas de publicación" + +#: catalog/pg_publication.c:618 +#, c-format +#| msgid "relation \"%s\" is already member of publication \"%s\"" +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "el esquema «%s» ya es un miembro de la publicación «%s»" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "no existe la publicación «%s»" -#: catalog/pg_shdepend.c:833 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5599,71 +5996,71 @@ msgstr[1] "" "\n" "y objetos en otras %d bases de datos (vea el registro del servidor para obtener la lista)" -#: catalog/pg_shdepend.c:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "el rol %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "el tablespace %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, 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:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "dueño de %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "privilegios para %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "destino de %s" -#: catalog/pg_shdepend.c:1263 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "tablespace para %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1271 +#: catalog/pg_shdepend.c:1267 #, 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:1382 +#: catalog/pg_shdepend.c:1331 #, 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:1529 +#: 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 "no se puede reasignar la propiedad de objetos de %s porque son requeridos por el sistema" -#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 -#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "no existe la suscripción «%s»" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "no se pudo eliminar mapeo de relación para suscripción «%s»" -#: 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 "La sincronización de tabla para la relación «%s» está en progreso y su estado es «%c»." @@ -5671,7 +6068,7 @@ msgstr "La sincronización de tabla para la relación «%s» está en progreso y #. 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 "Utilice %s para activar la suscripción si aún no está activada, o utilice %s para eliminar la suscripción." @@ -5702,7 +6099,7 @@ msgstr "el tamaño interno %d no es válido para un tipo pasado por valor" 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:328 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "los tipos de tamaño fijo deben tener almacenamiento PLAIN" @@ -5722,17 +6119,11 @@ msgstr "Falla al crear un tipo de multirango para el tipo «%s»." 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:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, 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:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 -#: commands/tablecmds.c:16490 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "«%s» no es una tabla o vista materializada" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -5813,7 +6204,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:650 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "el parámetro «parallel» debe ser SAFE, RESTRICTED o UNSAFE" @@ -5828,12 +6219,12 @@ msgstr "el parámetro «%s» debe ser READ_ONLY, SHAREABLE o READ_WRITE" msgid "event trigger \"%s\" already exists" msgstr "el disparador por eventos «%s» ya existe" -#: 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 "el conector de datos externos «%s» ya existe" -#: commands/alter.c:90 commands/foreigncmds.c:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "el servidor «%s» ya existe" @@ -5843,12 +6234,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:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "la publicación «%s» ya existe" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "la suscripción «%s» ya existe" @@ -5886,9 +6277,9 @@ msgstr "la configuración de búsqueda en texto «%s» ya existe en el esquema #: commands/alter.c:215 #, c-format msgid "must be superuser to rename %s" -msgstr "debe ser superusuario para cambiar el nombre de «%s»" +msgstr "debe ser superusuario para renombrar %s" -#: commands/alter.c:744 +#: commands/alter.c:746 #, c-format msgid "must be superuser to set schema of %s" msgstr "debe ser superusuario para definir el esquema de %s" @@ -5908,7 +6299,7 @@ msgstr "Debe ser superusuario para crear un método de acceso." msgid "access method \"%s\" already exists" msgstr "el método de acceso «%s» ya existe" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -5920,53 +6311,53 @@ 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:699 -#: parser/parse_clause.c:940 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:714 +#: parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "la función %s debe retornar el tipo %s" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "omitiendo «%s»: no se puede analizar esta tabla foránea" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "omitiendo «%s»: no se pueden analizar objetos que no son tablas, ni tablas especiales de sistema" -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analizando la jerarquía de herencia «%s.%s»" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analizando «%s.%s»" -#: commands/analyze.c:395 +#: commands/analyze.c:396 #, c-format 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:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "análisis automático de la tabla «%s.%s.%s»\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, 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:1436 +#: commands/analyze.c:1418 #, 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:1534 +#: commands/analyze.c:1516 #, 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" @@ -5996,97 +6387,98 @@ msgstr "no se puede hacer PREPARE de una transacción que ha ejecutado LISTEN, U msgid "too many notifications in the NOTIFY queue" msgstr "demasiadas notificaciones en la cola NOTIFY" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "la cola NOTIFY está %.0f%% llena" -#: commands/async.c:1618 +#: commands/async.c:1604 #, 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:1621 +#: commands/async.c:1607 #, 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 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "opción de CLUSTER «%s» no reconocida" -#: commands/cluster.c:147 commands/cluster.c:395 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "no se pueden reordenar tablas temporales de otras sesiones" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "no se puede hacer «cluster» a una tabla particionada" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format 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:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14179 commands/tablecmds.c:16060 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "no existe el índice «%s» en la tabla «%s»" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "no se puede reordenar un catálogo compartido" -#: commands/cluster.c:399 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "no se puede hacer vacuum a tablas temporales de otras sesiones" -#: commands/cluster.c:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16070 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "«%s» no es un índice de la tabla «%s»" -#: commands/cluster.c:479 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "no se puede reordenar en índice «%s» porque el método de acceso no soporta reordenamiento" -#: commands/cluster.c:491 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "no se puede reordenar en índice parcial «%s»" -#: commands/cluster.c:505 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "no se puede reordenar en el índice no válido «%s»" -#: commands/cluster.c:529 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "no se puede marcar un índice «clustered» en una tabla particionada" -#: commands/cluster.c:902 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "reordenando «%s.%s» usando un recorrido de índice en «%s»" -#: commands/cluster.c:908 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "reordenando «%s.%s» usando un recorrido secuencial y ordenamiento" -#: commands/cluster.c:939 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "haciendo vacuum a «%s.%s»" + +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "«%s»: se encontraron %.0f versiones eliminables de filas y %.0f no eliminables en %u páginas" +#| msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "«%s.%s»: se encontraron %.0f versiones de filas eliminables, %.0f no eliminables en %u páginas" -#: commands/cluster.c:943 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6100,97 +6492,127 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "el atributo de ordenamiento (collation) «%s» no es reconocido" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 +#: commands/define.c:389 commands/tablecmds.c:7808 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, c-format +msgid "conflicting or redundant options" +msgstr "opciones contradictorias o redundantes" + +#: commands/collationcmds.c:120 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LOCALE no puede configurarse junto con LC_COLLATE o LC_CTYPE." + +#: commands/collationcmds.c:126 +#, c-format +#| msgid "option \"%s\" cannot be specified with other options" +msgid "FROM cannot be specified together with any other options." +msgstr "FROM no puede especificarse junto con ninguna otra opción." + +#: commands/collationcmds.c:174 #, c-format msgid "collation \"default\" cannot be copied" msgstr "el ordenamiento «default» no puede copiarse" -#: commands/collationcmds.c:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "debe especificarse el parámetro «lc_collate»" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "debe especificarse el parámetro «lc_ctype»" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +#| msgid "parameter \"lc_collate\" must be specified" +msgid "parameter \"locale\" must be specified" +msgstr "debe especificarse el parámetro «locale»" + +#: commands/collationcmds.c:256 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "los ordenamientos no determinísticos no están soportados con este proveedor" -#: commands/collationcmds.c:227 +#: commands/collationcmds.c:275 #, 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 +#: commands/collationcmds.c:334 #, 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:296 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "ya existe un ordenamiento llamado «%s» en el esquema «%s»" -#: commands/collationcmds.c:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2398 #, c-format msgid "changing version from %s to %s" msgstr "cambiando versión de %s a %s" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2411 #, c-format msgid "version has not changed" msgstr "la versión no ha cambiado" -#: commands/collationcmds.c:473 +#: commands/collationcmds.c:532 #, 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:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "debe ser superusuario para importar ordenamientos del sistema" -#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:680 +#: 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 "no se pudo ejecutar la orden «%s»: %m" -#: commands/collationcmds.c:690 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "no se encontraron locales de sistema utilizables" -#: commands/comment.c:61 commands/dbcommands.c:842 commands/dbcommands.c:1038 -#: commands/dbcommands.c:1151 commands/dbcommands.c:1341 -#: commands/dbcommands.c:1589 commands/dbcommands.c:1703 -#: commands/dbcommands.c:2143 utils/init/postinit.c:887 -#: utils/init/postinit.c:992 utils/init/postinit.c:1009 +#: commands/comment.c:61 commands/dbcommands.c:1538 commands/dbcommands.c:1735 +#: commands/dbcommands.c:1848 commands/dbcommands.c:2042 +#: commands/dbcommands.c:2284 commands/dbcommands.c:2371 +#: commands/dbcommands.c:2481 commands/dbcommands.c:2980 +#: utils/init/postinit.c:947 utils/init/postinit.c:1052 +#: utils/init/postinit.c:1069 #, c-format 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:990 +#: commands/comment.c:101 #, 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" +#| msgid "cannot open relation \"%s\"" +msgid "cannot set comment on relation \"%s\"" +msgstr "no se puede definir un comentarion en la relación «%s»" -#: 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 "la función «%s» no fue ejecutada por el manejador de triggers" -#: 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 "la función «%s» debe ser ejecutada AFTER ROW" @@ -6227,8 +6649,8 @@ msgstr "la función de conversión de codificación %s retornó un resultado inc #: 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 "debe ser superusuario o miembro del rol pg_execute_server_program para usar COPY desde o hacia un programa externo" +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" +msgstr "debe ser superusuario o tener privilegios del rol pg_execute_server_program par hacer COPY desde o hacia un programa externo" #: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format @@ -6237,13 +6659,13 @@ msgstr "Cualquier usuario puede usar COPY hacia la salida estándar o desde la e #: 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 "debe ser superusuario o miembro del rol pg_read_server_files para hacer COPY desde un archivo" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "debe ser superusuario o tener privilegios de pg_read_server_files para hacer COPY desde un archivo" #: 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 "debe ser superusuario o miembro del rol pg_write_server_files para hacer COPY a un archivo" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgstr "debe ser superusuario o tener privilegios de pg_write_server_files para hacer COPY a un archivo" #: commands/copy.c:188 #, c-format @@ -6255,485 +6677,519 @@ msgstr "COPY FROM no está soportado con seguridad a nivel de registros" msgid "Use INSERT statements instead." msgstr "Use sentencias INSERT en su lugar." -#: commands/copy.c:377 +#: commands/copy.c:283 +#, c-format +#| msgid "\"EEEE\" not supported for input" +msgid "MERGE not supported in COPY" +msgstr "MERGE no está soportado en COPY" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "no se puede usar «%s» con HEADER en COPY TO" + +#: commands/copy.c:385 +#, c-format +#| msgid "%s requires a Boolean value" +msgid "%s requires a Boolean value or \"match\"" +msgstr "«%s» requiere un valor lógico (booleano) o «match»" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "el formato de COPY «%s» no es reconocido" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 -#: commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "el argumento de la opción «%s» debe ser una lista de nombres de columna" -#: commands/copy.c:518 +#: commands/copy.c:553 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "el argumento de la opción «%s» debe ser un nombre válido de codificación" -#: commands/copy.c:525 commands/dbcommands.c:254 commands/dbcommands.c:1537 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2232 #, c-format msgid "option \"%s\" not recognized" msgstr "no se reconoce la opción «%s»" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "no se puede especificar DELIMITER en modo BINARY" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "no se puede especificar NULL en modo BINARY" -#: commands/copy.c:564 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "el delimitador de COPY debe ser un solo carácter de un byte" -#: commands/copy.c:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "el delimitador de COPY no puede ser el carácter de nueva línea ni el de retorno de carro" -#: commands/copy.c:577 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "la representación de null de COPY no puede usar el carácter de nueva línea ni el de retorno de carro" -#: commands/copy.c:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "el delimitador de COPY no puede ser «%s»" -#: commands/copy.c:600 +#: commands/copy.c:635 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "el «header» de COPY está disponible sólo en modo CSV" +#| msgid "cannot specify DELIMITER in BINARY mode" +msgid "cannot specify HEADER in BINARY mode" +msgstr "no se puede especificar HEADER en modo BINARY" -#: commands/copy.c:606 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "el «quote» de COPY está disponible sólo en modo CSV" -#: commands/copy.c:611 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "la comilla («quote») de COPY debe ser un solo carácter de un byte" -#: commands/copy.c:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "el delimitador de COPY y la comilla («quote») deben ser diferentes" -#: commands/copy.c:622 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "escape de COPY disponible sólo en modo CSV" -#: commands/copy.c:627 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "el escape de COPY debe ser un sólo carácter de un byte" -#: commands/copy.c:633 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "el forzado de comillas de COPY sólo está disponible en modo CSV" -#: commands/copy.c:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "el forzado de comillas de COPY sólo está disponible en COPY TO" -#: commands/copy.c:643 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "el forzado de no nulos en COPY sólo está disponible en modo CSV" -#: commands/copy.c:647 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "el forzado de no nulos en COPY sólo está disponible usando COPY FROM" -#: commands/copy.c:653 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "el forzado de nulos en COPY sólo está disponible en modo CSV" -#: commands/copy.c:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "el forzado de nulos en COPY sólo está disponible usando COPY FROM" -#: commands/copy.c:664 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "el delimitador de COPY no debe aparecer en la especificación NULL" -#: commands/copy.c:671 +#: commands/copy.c:706 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "el carácter de «quote» de CSV no debe aparecer en la especificación NULL" -#: commands/copy.c:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "la columna «%s» es una columna generada" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Las columnas generadas no pueden usarse en COPY." -#: commands/copy.c:749 commands/indexcmds.c:1842 commands/statscmds.c:245 -#: commands/tablecmds.c:2347 commands/tablecmds.c:3003 -#: commands/tablecmds.c:3496 parser/parse_relation.c:3642 -#: parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1833 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "no existe la columna «%s»" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 #: 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" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, línea %s, columna %s" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, línea %llu, columna %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, línea %s" +msgid "COPY %s, line %llu" +msgstr "COPY %s, línea %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, línea %s, columna %s: «%s»" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, línea %llu, columna %s: «%s»" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, línea %s, columna %s: entrada nula" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, línea %llu, columna %s: entrada nula" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, línea %s: «%s»" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, línea %llu: «%s»" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "no se puede copiar hacia la vista «%s»" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Para posibilitar «copy» a una vista, provea un disparador INSTEAD OF INSERT." -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "no se puede copiar hacia la vista materializada «%s»" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "no se puede copiar hacia la secuencia «%s»" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "no se puede copiar hacia la relación «%s» porque no es una tabla" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "no se puede hacer COPY FREEZE a una tabla particionada" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "no se puede ejecutar COPY FREEZE debido a actividad anterior en la transacción" -#: 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 "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:612 +#: commands/copyfrom.c:1267 commands/copyto.c:611 #, 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:635 +#: commands/copyfrom.c:1290 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "la columna FORCE_NULL «%s» no es referenciada en COPY" -#: 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 "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:732 +#: commands/copyfrom.c:1531 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "«%s» es un directorio" -#: 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 "no se pudo cerrar la tubería a la orden externa: %m" -#: commands/copyfrom.c:1615 commands/copyto.c:307 +#: commands/copyfrom.c:1614 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "el programa «%s» falló" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "la signatura del archivo COPY no es reconocido" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "el encabezado del archivo COPY no es válido (faltan campos)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "encabezado de archivo COPY no válido (WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "valores requeridos no reconocidos en encabezado de COPY" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "el encabezado del archivo COPY no es válido (falta el largo)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "el encabezado del archivo COPY no es válido (largo incorrecto)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "no se pudo leer desde archivo COPY: %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 -#: tcop/postgres.c:359 +#: 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 "se encontró fin de archivo inesperado en una conexión con una transacción abierta" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "se recibió un mensaje de tipo 0x%02X inesperado durante COPY desde la entrada estándar" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "falló COPY desde la entrada estándar: %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1446 -#: commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +#| msgid "wrong number of columns: %d, expected %d" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "número de campos erróneo en la línea encabezado: se obtuvo %d, se esperaban %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "discordancia de nombre de columna en campo %d de la línea de encabezado: se obtuvo valor nulo («%s»), se esperaba «%s»" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "discordancia en nombre de columna en campo %d de la línea de encabezado: se obtuvo «%s», se esperaba «%s»" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "datos extra después de la última columna esperada" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "faltan datos en la columna «%s»" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "se recibieron datos de copy después del marcador EOF" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "la cantidad de registros es %d, pero se esperaban %d" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "se encontró un retorno de carro literal en los datos" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "se encontró un retorno de carro fuera de comillas en los datos" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Use «\\r» para representar el retorno de carro." -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Use un campo CSV entre comillas para representar el retorno de carro." -#: commands/copyfromparse.c:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "se encontró un salto de línea literal en los datos" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "se encontró un salto de línea fuera de comillas en los datos" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Use «\\n» para representar un salto de línea." -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Use un campo CSV entre comillas para representar un salto de línea." -#: commands/copyfromparse.c:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "el marcador fin-de-copy no coincide con el estilo previo de salto de línea" -#: commands/copyfromparse.c:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "marcador fin-de-copy corrupto" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "un valor entre comillas está inconcluso" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "EOF inesperado en datos de COPY" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "el tamaño de campo no es válido" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "el formato de datos binarios es incorrecto" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "no se pudo escribir al programa COPY: %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "no se pudo escribir archivo COPY: %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "no se puede copiar desde la vista «%s»" -#: 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 "Intente la forma COPY (SELECT ...) TO." -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "no se puede copiar desde la vista materializada «%s»" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "no se puede copiar desde la tabla foránea «%s»" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "no se puede copiar desde la secuencia «%s»" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "no se puede hacer copy de la tabla particionada «%s»" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format 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:451 +#: commands/copyto.c:450 #, 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:465 +#: commands/copyto.c:464 #, 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:469 +#: commands/copyto.c:468 #, 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:474 +#: commands/copyto.c:473 #, 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:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) no está soportado" -#: commands/copyto.c:501 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "la consulta COPY debe tener una cláusula RETURNING" -#: commands/copyto.c:530 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "la relación referenciada por la sentencia COPY ha cambiado" -#: commands/copyto.c:589 +#: commands/copyto.c:588 #, 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:697 +#: commands/copyto.c:696 #, 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:716 +#: commands/copyto.c:715 #, 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:719 +#: 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 indica al proceso servidor PostgreSQL escribir a un archivo. Puede desear usar facilidades del lado del cliente, como \\copy de psql." @@ -6748,297 +7204,387 @@ msgstr "se especificaron demasiados nombres de columna" msgid "policies not yet implemented for this command" msgstr "las políticas no están implementadas para esta orden" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION ya no está soportado" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Considere usar tablespaces." -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE no puede configurarse junto con LC_COLLATE o LC_CTYPE." +msgid "OIDs less than %u are reserved for system objects" +msgstr "los OIDs menores que %u están reservados para objetos del sistema" -#: commands/dbcommands.c:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d no es un código válido de codificación" -#: commands/dbcommands.c:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s no es un nombre válido de codificación" -#: commands/dbcommands.c:315 commands/dbcommands.c:1570 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "proveedor de configuración regional no reconocido: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2265 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "límite de conexión no válido: %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "se ha denegado el permiso para crear la base de datos" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "no existe la base de datos patrón «%s»" -#: commands/dbcommands.c:369 +#: commands/dbcommands.c:977 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "se ha denegado el permiso para copiar la base de datos «%s»" -#: commands/dbcommands.c:385 +#: commands/dbcommands.c:994 +#, c-format +#| msgid "invalid parameter list format: \"%s\"" +msgid "invalid create database strategy \"%s\"" +msgstr "estrategia de creación de base de datos «%s» no válida" + +#: commands/dbcommands.c:995 +#, c-format +#| msgid "Valid values are \"local\" and \"cascaded\"." +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Los valores aceptables son «wal_log» y «file_copy»." + +#: commands/dbcommands.c:1014 #, c-format msgid "invalid server encoding %d" msgstr "la codificación de servidor %d no es válida" -#: commands/dbcommands.c:391 commands/dbcommands.c:396 +#: commands/dbcommands.c:1020 commands/dbcommands.c:1025 #, c-format msgid "invalid locale name: \"%s\"" msgstr "nombre de configuración regional no válido: «%s»" -#: commands/dbcommands.c:416 +#: commands/dbcommands.c:1035 +#, c-format +#| msgid "encoding \"%s\" not supported by ICU" +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "la codificación «%s» no está soportada por ICU" + +#: commands/dbcommands.c:1045 +#, c-format +msgid "ICU locale must be specified" +msgstr "debe especificarse una configuración regional ICU" + +#: commands/dbcommands.c:1054 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "no se puede especificar una configuración regional ICU a menos que el proveedor de configuración regional sea ICU" + +#: commands/dbcommands.c:1072 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "la nueva codificación (%s) es incompatible con la codificación de la base de datos patrón (%s)" -#: commands/dbcommands.c:419 +#: commands/dbcommands.c:1075 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Use la misma codificación que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:424 +#: commands/dbcommands.c:1080 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "la nueva «collation» (%s) es incompatible con la «collation» de la base de datos patrón (%s)" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1082 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Use la misma «collation» que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:431 +#: commands/dbcommands.c:1087 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "el nuevo LC_CTYPE (%s) es incompatible con el LC_CTYPE de la base de datos patrón (%s)" -#: commands/dbcommands.c:433 +#: commands/dbcommands.c:1089 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "Use el mismo LC_CTYPE que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:455 commands/dbcommands.c:1197 +#: commands/dbcommands.c:1094 +#, c-format +#| msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "el nuevo proveedor de configuración regional (%s) no coincide con el proveedor de la base de datos patrón (%s)" + +#: commands/dbcommands.c:1096 +#, c-format +#| msgid "Use the same encoding as in the template database, or use template0 as template." +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "Use el mismo proveedor de «locale» que en la base de datos patrón, o bien use template0 como patrón." + +#: commands/dbcommands.c:1105 +#, c-format +#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "la nueva configuración regional ICU (%s) es incompatible con la configuración regional ICU de la base de datos patrón (%s)" + +#: commands/dbcommands.c:1107 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "Use la misma configuración regional («locale») que en la base de datos patrón, o bien use template0 como patrón." + +#: commands/dbcommands.c:1130 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "la base de datos patrón «%s» tiene una versión de «collation», pero no se pudo determinar una verdadera versión de «collation»" + +#: commands/dbcommands.c:1135 +#, c-format +#| msgid "template database \"%s\" does not exist" +msgid "template database \"%s\" has a collation version mismatch" +msgstr "discordancia en la versión de «collation» de la base de datos patrón «%s»" + +#: commands/dbcommands.c:1137 +#, 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 "La base de datos patrón fue creada usando la versión %s, pero el sistema operativo provee la versión %s." + +#: commands/dbcommands.c:1140 +#, 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 "Reconstruya todos los objetos de la base de datos patrón afectados por este ordenamiento y ejecute ALTER DATABASE %s REFRESH COLLATION VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." + +#: commands/dbcommands.c:1176 commands/dbcommands.c:1894 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "no puede usarse pg_global como tablespace por omisión" -#: commands/dbcommands.c:481 +#: commands/dbcommands.c:1202 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "no se puede asignar el nuevo tablespace por omisión «%s»" -#: commands/dbcommands.c:483 +#: commands/dbcommands.c:1204 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "Hay un conflicto puesto que la base de datos «%s» ya tiene algunas tablas en este tablespace." -#: commands/dbcommands.c:513 commands/dbcommands.c:1067 +#: commands/dbcommands.c:1234 commands/dbcommands.c:1764 #, c-format msgid "database \"%s\" already exists" msgstr "la base de datos «%s» ya existe" -#: commands/dbcommands.c:527 +#: commands/dbcommands.c:1248 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "la base de datos de origen «%s» está siendo utilizada por otros usuarios" -#: commands/dbcommands.c:770 commands/dbcommands.c:785 +#: commands/dbcommands.c:1270 +#, c-format +#| msgid "database \"%s\" already exists" +msgid "database OID %u is already in use by database \"%s\"" +msgstr "el OID de base de datos %u ya está siendo usado por la base de datos «%s»" + +#: commands/dbcommands.c:1276 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "el directorio de datos con el OID %u especificado ya existe" + +#: commands/dbcommands.c:1447 commands/dbcommands.c:1462 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "la codificación «%s» no coincide con la configuración regional «%s»" -#: commands/dbcommands.c:773 +#: commands/dbcommands.c:1450 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "El parámetro LC_CTYPE escogido requiere la codificación «%s»." -#: commands/dbcommands.c:788 +#: commands/dbcommands.c:1465 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "El parámetro LC_COLLATE escogido requiere la codificación «%s»." -#: commands/dbcommands.c:849 +#: commands/dbcommands.c:1545 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "no existe la base de datos «%s», omitiendo" -#: commands/dbcommands.c:873 +#: commands/dbcommands.c:1569 #, c-format msgid "cannot drop a template database" msgstr "no se puede borrar una base de datos patrón" -#: commands/dbcommands.c:879 +#: commands/dbcommands.c:1575 #, c-format msgid "cannot drop the currently open database" msgstr "no se puede eliminar la base de datos activa" -#: commands/dbcommands.c:892 +#: commands/dbcommands.c:1588 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "la base de datos «%s» está en uso por un slot de replicación activo" -#: commands/dbcommands.c:894 +#: commands/dbcommands.c:1590 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "Hay %d slot activo." msgstr[1] "Hay %d slots activos." -#: commands/dbcommands.c:908 +#: commands/dbcommands.c:1604 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "la base de datos «%s» está siendo utilizada por suscripciones de replicación lógica" -#: commands/dbcommands.c:910 +#: commands/dbcommands.c:1606 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "Hay %d suscripción." msgstr[1] "Hay %d suscripciones." -#: commands/dbcommands.c:931 commands/dbcommands.c:1089 -#: commands/dbcommands.c:1219 +#: commands/dbcommands.c:1627 commands/dbcommands.c:1786 +#: commands/dbcommands.c:1916 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "la base de datos «%s» está siendo utilizada por otros usuarios" -#: commands/dbcommands.c:1049 +#: commands/dbcommands.c:1746 #, c-format msgid "permission denied to rename database" -msgstr "se ha denegado el permiso para cambiar el nombre a la base de datos" +msgstr "se ha denegado el permiso para renombrar la base de datos" -#: commands/dbcommands.c:1078 +#: commands/dbcommands.c:1775 #, c-format msgid "current database cannot be renamed" -msgstr "no se puede cambiar el nombre de la base de datos activa" +msgstr "no se puede renombrar la base de datos activa" -#: commands/dbcommands.c:1175 +#: commands/dbcommands.c:1872 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "no se puede cambiar el tablespace de la base de datos activa" -#: commands/dbcommands.c:1278 +#: commands/dbcommands.c:1978 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "algunas relaciones de la base de datos «%s» ya están en el tablespace «%s»" -#: commands/dbcommands.c:1280 +#: commands/dbcommands.c:1980 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Debe moverlas de vuelta al tablespace por omisión de la base de datos antes de ejecutar esta orden." -#: commands/dbcommands.c:1405 commands/dbcommands.c:1981 -#: commands/dbcommands.c:2244 commands/dbcommands.c:2330 +#: commands/dbcommands.c:2107 commands/dbcommands.c:2818 +#: commands/dbcommands.c:3082 commands/dbcommands.c:3196 #, 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\"" -#: commands/dbcommands.c:1461 +#: commands/dbcommands.c:2168 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "opción de DROP DATABASE «%s» no reconocida" -#: commands/dbcommands.c:1551 +#: commands/dbcommands.c:2246 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "la opción «%s» no puede ser especificada con otras opciones" -#: commands/dbcommands.c:1607 +#: commands/dbcommands.c:2302 #, c-format msgid "cannot disallow connections for current database" msgstr "no se pueden prohibir las conexiones para la base de datos actual" -#: commands/dbcommands.c:1743 +#: commands/dbcommands.c:2521 #, c-format msgid "permission denied to change owner of database" msgstr "se ha denegado el permiso para cambiar el dueño de la base de datos" -#: commands/dbcommands.c:2087 +#: commands/dbcommands.c:2924 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "Hay otras %d sesiones y %d transacciones preparadas usando la base de datos." -#: commands/dbcommands.c:2090 +#: commands/dbcommands.c:2927 #, c-format msgid "There is %d other session using the database." 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:2095 storage/ipc/procarray.c:3894 +#: commands/dbcommands.c:2932 storage/ipc/procarray.c:3848 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "Hay %d otra transacción preparada usando la base de datos." msgstr[1] "Hay otras %d transacciones preparadas usando la base de datos." -#: commands/dbcommands.c:2201 +#: commands/dbcommands.c:3038 #, c-format msgid "missing directory \"%s\"" msgstr "directorio «%s» faltante" -#: commands/dbcommands.c:2260 commands/tablespace.c:188 -#: commands/tablespace.c:634 +#: commands/dbcommands.c:3098 commands/tablespace.c:190 +#: commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "no se pudo hacer stat al directorio «%s»: %m" -#: 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:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, c-format msgid "%s requires a parameter" msgstr "%s requiere un parámetro" -#: 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 commands/define.c:225 commands/define.c:243 #, c-format msgid "%s requires a numeric value" msgstr "%s requiere un valor numérico" -#: commands/define.c:157 +#: commands/define.c:154 #, c-format msgid "%s requires a Boolean value" msgstr "«%s» requiere un valor lógico (booleano)" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 #, c-format msgid "%s requires an integer value" msgstr "%s requiere valor entero" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "el argumento de %s debe ser un nombre" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" msgstr "el argumento de %s debe ser un nombre de tipo" -#: commands/define.c:318 +#: commands/define.c:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "argumento no válido para %s: «%s»" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 -#: utils/adt/ruleutils.c:2816 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2912 #, c-format msgid "\"%s\" is an aggregate function" msgstr "«%s» es una función de agregación" @@ -7048,19 +7594,19 @@ 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:455 commands/tablecmds.c:3580 -#: commands/tablecmds.c:3738 commands/tablecmds.c:3791 -#: commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16487 tcop/utility.c:1332 #, 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "el esquema «%s» no existe, omitiendo" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "el tipo «%s» no existe, omitiendo" @@ -7080,7 +7626,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:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "no existe el objeto de estadísticas «%s», omitiendo" @@ -7175,7 +7721,7 @@ msgstr "la regla «%s» para la relación «%s» no existe, omitiendo" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "no existe el conector de datos externos «%s», omitiendo" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "el servidor «%s» no existe, omitiendo" @@ -7208,7 +7754,7 @@ msgstr "Debe ser superusuario para crear un disparador por eventos." #: commands/event_trigger.c:136 #, c-format msgid "unrecognized event name \"%s\"" -msgstr "nomre de evento «%s» no reconocido" +msgstr "nommre de evento «%s» no reconocido" #: commands/event_trigger.c:153 #, c-format @@ -7252,12 +7798,12 @@ msgstr "El dueño de un disparador por eventos debe ser un superusuario." msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s sólo puede invocarse en una función de un disparador en el evento 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 sólo puede invocarse en una función de un disparador en el evento table_rewrite" -#: 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 sólo puede invocarse en una función de un disparador por eventos" @@ -7282,7 +7828,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:3014 +#: commands/extension.c:173 commands/extension.c:2936 #, c-format msgid "extension \"%s\" does not exist" msgstr "no existe la extensión «%s»" @@ -7339,188 +7885,205 @@ msgstr "Los nombres de versión no deben empezar ni terminar con «-»." msgid "Version names must not contain directory separator characters." msgstr "Los nombres de versión no deben contener caracteres separadores de directorio." -#: commands/extension.c:498 +#: commands/extension.c:502 +#, c-format +#| msgid "extension \"%s\" does not exist" +msgid "extension \"%s\" is not available" +msgstr "la extensión «%s» no está disponible" + +#: commands/extension.c:503 +#, c-format +#| msgid "could not open extension control file \"%s\": %m" +msgid "Could not open extension control file \"%s\": %m." +msgstr "No se pudo abrir el archivo de control de extensión «%s»: %m." + +#: commands/extension.c:505 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "La extensión debe primero ser instalada en el sistema donde PostgreSQL está ejecutándose." + +#: commands/extension.c:509 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "no se pudo abrir el archivo de control de extensión «%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 "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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "el parámetro «%s» requiere un valor lógico (booleano)" -#: commands/extension.c:577 +#: commands/extension.c:588 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: commands/extension.c:591 +#: commands/extension.c:602 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "el parámetro «%s» debe ser una lista de nombres de extensión" -#: commands/extension.c:598 +#: commands/extension.c:609 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "parámetro no reconocido «%s» en el archivo «%s»" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "el parámetro «schema» no puede ser especificado cuando «relocatable» es verdadero" -#: commands/extension.c:785 +#: commands/extension.c:796 #, c-format 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:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "se ha denegado el permiso para crear la extensión «%s»" -#: commands/extension.c:865 +#: commands/extension.c:876 #, 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:866 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Debe ser superusuario para crear esta extensión." -#: commands/extension.c:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "se ha denegado el permiso para actualizar la extensión «%s»" -#: commands/extension.c:873 +#: commands/extension.c:884 #, 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:874 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Debe ser superusuario para actualizar esta extensión." -#: commands/extension.c:1201 +#: commands/extension.c:1216 #, 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:1409 commands/extension.c:3075 +#: commands/extension.c:1424 commands/extension.c:2994 #, c-format msgid "version to install must be specified" msgstr "la versión a instalar debe ser especificada" -#: commands/extension.c:1446 +#: commands/extension.c:1461 #, 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:1480 +#: commands/extension.c:1495 #, 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:1640 +#: commands/extension.c:1655 #, 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:1645 +#: commands/extension.c:1660 #, c-format msgid "installing required extension \"%s\"" msgstr "instalando la extensión requerida «%s»" -#: commands/extension.c:1668 +#: commands/extension.c:1683 #, c-format msgid "required extension \"%s\" is not installed" msgstr "la extensión requerida «%s» no está instalada" -#: commands/extension.c:1671 +#: commands/extension.c:1686 #, 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:1706 +#: commands/extension.c:1721 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "la extensión «%s» ya existe, omitiendo" -#: commands/extension.c:1713 +#: commands/extension.c:1728 #, c-format msgid "extension \"%s\" already exists" msgstr "la extensión «%s» ya existe" -#: commands/extension.c:1724 +#: commands/extension.c:1739 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "los CREATE EXTENSION anidados no están soportados" -#: commands/extension.c:1897 +#: commands/extension.c:1903 #, 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:2458 +#: commands/extension.c:2380 #, 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:2470 +#: commands/extension.c:2392 #, c-format msgid "OID %u does not refer to a table" msgstr "el OID %u no hace referencia a una tabla" -#: commands/extension.c:2475 +#: commands/extension.c:2397 #, 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:2829 +#: commands/extension.c:2751 #, 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:2870 commands/extension.c:2933 +#: commands/extension.c:2792 commands/extension.c:2855 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "la extensión «%s» no soporta SET SCHEMA" -#: commands/extension.c:2935 +#: commands/extension.c:2857 #, 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:2994 +#: commands/extension.c:2916 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "los ALTER EXTENSION anidados no están soportados" -#: commands/extension.c:3086 +#: commands/extension.c:3005 #, 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:3298 +#: commands/extension.c:3217 #, c-format msgid "cannot add an object of this type to an extension" msgstr "no se puede añadir un objeto de este tipo a una extensión" -#: commands/extension.c:3364 +#: commands/extension.c:3283 #, 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:3458 +#: commands/extension.c:3377 #, c-format msgid "file \"%s\" is too large" msgstr "el archivo «%s» es demasiado grande" @@ -7550,77 +8113,77 @@ msgstr "Debe ser superusuario para cambiar el dueño de un conector de datos ext msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "El dueño de un conector de datos externos debe ser un superusuario." -#: 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 "no existe el conector de datos externos «%s»" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "se ha denegado el permiso para crear el conector de datos externos «%s»" -#: commands/foreigncmds.c:586 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Debe ser superusuario para crear un conector de datos externos." -#: commands/foreigncmds.c:701 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "se ha denegado el permiso para cambiar el conector de datos externos «%s»" -#: commands/foreigncmds.c:703 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Debe ser superusuario para alterar un conector de datos externos." -#: 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 "al cambiar el manejador del conector de datos externos, el comportamiento de las tablas foráneas existentes puede cambiar" -#: 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 "al cambiar el validador del conector de datos externos, las opciones para los objetos dependientes de él pueden volverse no válidas" -#: commands/foreigncmds.c:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "el servidor «%s» ya existe, omitiendo" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "el mapeo de usuario «%s» ya existe para el servidor «%s», omitiendo" -#: commands/foreigncmds.c:1158 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "el mapeo de usuario «%s» ya existe para el servidor «%s»" -#: commands/foreigncmds.c:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "no existe el mapeo de usuario «%s» para el servidor «%s»" -#: commands/foreigncmds.c:1383 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "no existe el mapeo de usuario «%s» para el servidor «%s», omitiendo" -#: commands/foreigncmds.c:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "el conector de datos externos «%s» no tiene manejador" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, c-format 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:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "importando la tabla foránea «%s»" @@ -7725,263 +8288,263 @@ msgstr "los parámetros de entrada después de uno que tenga valor por omisión msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "los parámetros OUT no pueden aparecer después de uno que tenga valor por omisión" -#: commands/functioncmds.c:612 commands/functioncmds.c:803 +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "atributo no válido en definición de procedimiento" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:701 #, 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:719 +#: commands/functioncmds.c:712 #, 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:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST debe ser positivo" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWS debe ser positivo" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "no se ha especificado un cuerpo para la función" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "se ha especificado por duplicado el cuerpo para la función" -#: commands/functioncmds.c:899 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "cuerpo de función SQL en línea solo es válido para lenguaje SQL" -#: commands/functioncmds.c:941 +#: commands/functioncmds.c:922 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "una función SQL con el cuerpo de la función fuera de comillas no puede tener argumentos polimórficos" -#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s aún no está soportado en una función SQL con el cuerpo fuera de comillas" -#: commands/functioncmds.c:1014 +#: commands/functioncmds.c:995 #, 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:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "no se ha especificado el lenguaje" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 +#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 #: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "no existe el lenguaje «%s»" -#: commands/functioncmds.c:1129 commands/functioncmds.c:2132 +#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 #, 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:1164 commands/functioncmds.c:1448 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "sólo un superusuario puede definir funciones «leakproof»" -#: commands/functioncmds.c:1215 +#: commands/functioncmds.c:1196 #, 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:1228 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "el tipo de retorno de la función debe ser especificado" -#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 +#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 #, 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:1569 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "el tipo de origen %s es un pseudotipo" -#: commands/functioncmds.c:1575 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "el tipo de retorno %s es un pseudotipo" -#: commands/functioncmds.c:1599 +#: commands/functioncmds.c:1582 #, 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:1604 +#: commands/functioncmds.c:1587 #, 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:1629 +#: commands/functioncmds.c:1612 #, 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:1633 +#: commands/functioncmds.c:1616 #, 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:1637 +#: commands/functioncmds.c:1620 #, 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:1642 +#: commands/functioncmds.c:1625 #, 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:1647 +#: commands/functioncmds.c:1630 #, 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:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "la función de conversión no debe ser volatile" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, 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:1667 +#: commands/functioncmds.c:1650 #, 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:1693 +#: commands/functioncmds.c:1676 #, 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:1708 +#: commands/functioncmds.c:1691 #, 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:1723 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "los tipos de datos compuestos no son binario-compatibles" -#: commands/functioncmds.c:1729 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "los tipos de datos enum no son binario-compatibles" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "los tipos de datos de array no son binario-compatibles" -#: commands/functioncmds.c:1752 +#: commands/functioncmds.c:1735 #, 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:1762 +#: commands/functioncmds.c:1745 #, 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:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "la función de transformación no debe ser volatile" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, 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:1803 +#: commands/functioncmds.c:1786 #, 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:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "la función de transformación debe recibir un argumento" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1794 #, 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:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "el tipo de dato %s es un pseudo-tipo" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "tipo de dato «%s» es un dominio" -#: commands/functioncmds.c:1896 +#: commands/functioncmds.c:1879 #, 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:1922 +#: commands/functioncmds.c:1905 #, 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:1951 +#: commands/functioncmds.c:1934 #, 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:2038 +#: commands/functioncmds.c:2021 #, 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:2062 +#: commands/functioncmds.c:2045 #, 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:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "no se ha especificado código" -#: commands/functioncmds.c:2163 +#: commands/functioncmds.c:2142 #, 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:2258 +#: 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" @@ -7998,299 +8561,305 @@ msgstr "debe especificar al menos una columna" msgid "cannot use more than %d columns in an index" msgstr "no se puede usar más de %d columnas en un índice" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "no se puede crear un índice en la tabla foránea «%s»" +#| msgid "cannot create index on foreign table \"%s\"" +msgid "cannot create index on relation \"%s\"" +msgstr "no se puede crear un índice en la tabla «%s»" -#: commands/indexcmds.c:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "no se puede crear un índice en la tabla particionada «%s» concurrentemente" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "no se pueden create restricciones de exclusión en la tabla particionada «%s»" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format 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:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, 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:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, 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" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "sustituyendo el método de acceso obsoleto «rtree» por «gist»" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "el método de acceso «%s» no soporta índices únicos" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "el método de acceso «%s» no soporta columnas incluidas" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "el método de acceso «%s» no soporta índices multicolumna" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "el método de acceso «%s» no soporta restricciones de exclusión" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "no se puede hacer coincidir la llave de partición a un índice usando el método de acceso «%s»" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "restricción %s no soportada con definición de llave de particionamiento" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, c-format 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:1046 +#: commands/indexcmds.c:1037 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "las restricciones unique en tablas particionadas deben incluir todas las columnas de particionamiento" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1038 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "La restricción %s en la tabla «%s» no incluye la columna «%s» que es parte de la llave de particionamiento." -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 #, c-format 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:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1276 tcop/utility.c:1518 #, 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:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1278 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La tabla «%s» contiene particiones que son tablas foráneas." -#: commands/indexcmds.c:1759 +#: commands/indexcmds.c:1750 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "las funciones utilizadas en predicados de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1837 parser/parse_utilcmd.c:2526 -#: parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1828 parser/parse_utilcmd.c:2529 +#: parser/parse_utilcmd.c:2664 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "no existe la columna «%s» en la llave" -#: commands/indexcmds.c:1861 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1852 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "las expresiones no están soportadas en columnas incluidas" -#: commands/indexcmds.c:1902 +#: commands/indexcmds.c:1893 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "las funciones utilizadas en expresiones de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1917 +#: commands/indexcmds.c:1908 #, c-format msgid "including column does not support a collation" msgstr "la columna incluida no permite un ordenamiento (collation)" -#: commands/indexcmds.c:1921 +#: commands/indexcmds.c:1912 #, c-format msgid "including column does not support an operator class" msgstr "la columna incluida no permite una clase de operadores" -#: commands/indexcmds.c:1925 +#: commands/indexcmds.c:1916 #, c-format msgid "including column does not support ASC/DESC options" msgstr "la columna incluida no permite las opciones ASC/DESC" -#: commands/indexcmds.c:1929 +#: commands/indexcmds.c:1920 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "la columna incluida no permite las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:1970 +#: commands/indexcmds.c:1961 #, c-format 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:1978 commands/tablecmds.c:16956 commands/typecmds.c:810 -#: parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 -#: utils/adt/misc.c:628 +#: commands/indexcmds.c:1969 commands/tablecmds.c:17502 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "los ordenamientos (collation) no están soportados por el tipo %s" -#: commands/indexcmds.c:2043 +#: commands/indexcmds.c:2034 #, c-format msgid "operator %s is not commutative" msgstr "el operador %s no es conmutativo" -#: commands/indexcmds.c:2045 +#: commands/indexcmds.c:2036 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Sólo operadores conmutativos pueden ser usados en restricciones de exclusión." -#: commands/indexcmds.c:2071 +#: commands/indexcmds.c:2062 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "el operador %s no es un miembro de la familia de operadores «%s»" -#: commands/indexcmds.c:2074 +#: commands/indexcmds.c:2065 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "El operador de exclusión debe estar relacionado con la clase de operadores del índice para la restricción." -#: commands/indexcmds.c:2109 +#: commands/indexcmds.c:2100 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "el método de acceso «%s» no soporta las opciones ASC/DESC" -#: commands/indexcmds.c:2114 +#: commands/indexcmds.c:2105 #, c-format 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:2160 commands/tablecmds.c:16981 -#: commands/tablecmds.c:16987 commands/typecmds.c:2317 +#: commands/indexcmds.c:2151 commands/tablecmds.c:17527 +#: commands/tablecmds.c:17533 commands/typecmds.c:2302 #, 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»" -#: commands/indexcmds.c:2162 +#: commands/indexcmds.c:2153 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Debe especificar una clase de operadores para el índice, o definir una clase de operadores por omisión para el tipo de datos." -#: commands/indexcmds.c:2191 commands/indexcmds.c:2199 +#: commands/indexcmds.c:2182 commands/indexcmds.c:2190 #: commands/opclasscmds.c:205 #, c-format 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:2213 commands/typecmds.c:2305 +#: commands/indexcmds.c:2204 commands/typecmds.c:2290 #, 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" -#: commands/indexcmds.c:2303 +#: commands/indexcmds.c:2294 #, c-format 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:2631 +#: commands/indexcmds.c:2622 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "opción de REINDEX «%s» no reconocida" -#: commands/indexcmds.c:2855 +#: commands/indexcmds.c:2846 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "la tabla «%s» no tiene índices que puedan ser reindexados concurrentemente" -#: commands/indexcmds.c:2869 +#: commands/indexcmds.c:2860 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "la tabla «%s» no tiene índices para reindexar" -#: commands/indexcmds.c:2909 commands/indexcmds.c:3416 -#: commands/indexcmds.c:3544 +#: commands/indexcmds.c:2900 commands/indexcmds.c:3404 +#: commands/indexcmds.c:3532 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "no se pueden reindexar catálogos de sistema concurrentemente" -#: commands/indexcmds.c:2932 +#: commands/indexcmds.c:2923 #, c-format msgid "can only reindex the currently open database" msgstr "sólo se puede reindexar la base de datos actualmente abierta" -#: commands/indexcmds.c:3020 +#: commands/indexcmds.c:3011 #, c-format 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:3053 +#: commands/indexcmds.c:3044 #, c-format msgid "cannot move system relations, skipping all" msgstr "no se puede mover las relaciones de sistema, omitiendo todas" -#: commands/indexcmds.c:3100 +#: commands/indexcmds.c:3090 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "al reindexar tabla particionada «%s.%s»" -#: commands/indexcmds.c:3103 +#: commands/indexcmds.c:3093 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "al reindexar índice particionado «%s.%s»" -#: commands/indexcmds.c:3296 commands/indexcmds.c:4152 +#: commands/indexcmds.c:3284 commands/indexcmds.c:4140 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la tabla «%s.%s» fue reindexada" -#: commands/indexcmds.c:3448 commands/indexcmds.c:3500 +#: commands/indexcmds.c:3436 commands/indexcmds.c:3488 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "no se puede reindexar el índice no válido «%s.%s» concurrentemente, omitiendo" -#: commands/indexcmds.c:3454 +#: commands/indexcmds.c:3442 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "no se puede reindexar el índice de restricción de exclusión «%s.%s» concurrentemente, omitiendo" -#: commands/indexcmds.c:3609 +#: commands/indexcmds.c:3597 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "no se puede reindexar este tipo de relación concurrentemente" -#: commands/indexcmds.c:3630 +#: commands/indexcmds.c:3618 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "no se puede mover relación no compartida al tablespace «%s»" -#: commands/indexcmds.c:4133 commands/indexcmds.c:4145 +#: commands/indexcmds.c:4121 commands/indexcmds.c:4133 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "el índice «%s.%s» fue reindexado" -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4123 commands/indexcmds.c:4142 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "«%s» no es una tabla o vista" +#| msgid "cannot open relation \"%s\"" +msgid "cannot lock relation \"%s\"" +msgstr "no se puede bloquear la relación «%s»" #: commands/matview.c:193 #, c-format 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:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "las opciones %s y %s no pueden usarse juntas" @@ -8305,12 +8874,12 @@ msgstr "no se puede refrescar la vista materializada «%s» concurrentemente" 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:653 #, 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:655 #, c-format msgid "Row: %s" msgstr "Fila: %s" @@ -8425,7 +8994,7 @@ msgstr "función de interpretación de opciones de la clase de operadores no vá #: commands/opclasscmds.c:1240 #, 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'." +msgstr "La signatura aceptable para la función de interpretación de opciones de una clase de operadores es '%s'." #: commands/opclasscmds.c:1259 #, c-format @@ -8587,13 +9156,13 @@ 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:89 commands/policy.c:382 commands/statscmds.c:151 -#: commands/tablecmds.c:1585 commands/tablecmds.c:2165 -#: commands/tablecmds.c:3390 commands/tablecmds.c:6064 -#: commands/tablecmds.c:8989 commands/tablecmds.c:16546 -#: commands/tablecmds.c:16581 commands/trigger.c:313 commands/trigger.c:1289 -#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9144 commands/tablecmds.c:17082 +#: commands/tablecmds.c:17117 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "permiso denegado: «%s» es un catálogo de sistema" @@ -8644,52 +9213,42 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "no se puede crear un cursor WITH HOLD dentro de una operación restringida por seguridad" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 #, c-format msgid "cursor \"%s\" does not exist" msgstr "no existe el cursor «%s»" -#: commands/prepare.c:76 +#: commands/prepare.c:75 #, c-format 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:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, 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:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "sentencias de utilidad no pueden ser preparadas" - -#: commands/prepare.c:264 commands/prepare.c:269 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "la sentencia preparada no es un SELECT" -#: commands/prepare.c:329 +#: commands/prepare.c:295 #, 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:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "Se esperaban %d parámetros pero se obtuvieron %d." -#: commands/prepare.c:364 +#: commands/prepare.c:330 #, 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:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "la sentencia preparada «%s» ya existe" -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "no existe la sentencia preparada «%s»" @@ -8699,65 +9258,216 @@ 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:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1219 +#: postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "sintaxis de entrada no válida para la opción «publish»" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "la sintaxis de lista no es válida para el parámetro «%s»" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "valor de «publish» no reconocido: «%s»" +#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "valor no reconocido para la opción de publicación «%s»: «%s»" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "parámetro de publicación no reconocido: «%s»" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +#| msgid "no schema has been selected to create in" +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "ningún esquema se ha seleccionado para CURRENT_SCHEMA" + +#: commands/publicationcmds.c:501 +#| msgid "System catalog modifications are currently disallowed." +msgid "System columns are not allowed." +msgstr "Las columnas de sistema no están permitidas." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +#| msgid "grouping operations are not allowed in %s" +msgid "User-defined operators are not allowed." +msgstr "Los operadores definidos por el usuario no están permitidos." + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "Sólo columnas, constantes, operadores built-in, tipos de datos built-in, «collations» built-in, y funciones built-in inmutables son permitidas." + +#: commands/publicationcmds.c:566 +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined types are not allowed." +msgstr "Los tipos definidos por el usuario no están permitidos." + +#: commands/publicationcmds.c:569 +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Las funciones definidas por el usuario, o las que son mutables, no están permitidas." + +#: commands/publicationcmds.c:572 +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined collations are not allowed." +msgstr "Los «collations» definidos por el usuario no están permitidos." + +#: commands/publicationcmds.c:582 +#, c-format +#| msgid "invalid publication_names syntax" +msgid "invalid publication WHERE expression" +msgstr "expresión WHERE de publicación no válida" + +#: commands/publicationcmds.c:635 +#, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "no se puede usar una cláusula WHERE para la relación «%s»" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "La cláusula WHERE no puede usarse para una tabla particionada cuando %s es falso." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "no se puede usar una lista de columnas para la relación «%s.%s» en la publicación «%s»" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "No se pueden especificar listas de columnas en publicaciones que contienen elementos FOR TABLES IN SCHEMA." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "No se pueden especificar listas de columnas para tablas particionadas cuando %s es falso." + +#: commands/publicationcmds.c:760 #, 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:250 +#: commands/publicationcmds.c:831 +#, c-format +#| msgid "must be superuser to create FOR ALL TABLES publication" +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "debe ser superusuario para crear publicaciones FOR TABLES IN SCHEMA" + +#: commands/publicationcmds.c:867 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level es insuficiente para publicar cambios lógicos" -#: commands/publicationcmds.c:251 +#: commands/publicationcmds.c:868 +#, c-format +#| msgid "Set wal_level to logical before creating subscriptions." +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "Cambie wal_level a «logical» antes de crear suscripciones." + +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +#| msgid "cannot set parameter \"%s\" within security-definer function" +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "no se puede definir el parámetro «%s» a falso para la publicación «%s»" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La publicación contiene una cláusula WHERE para la tabla particionada «%s», que no está permitido cuando «%s» es falso." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La publicación contiene una lista de columns para la tabla particionada «%s», que no está permitido cuando «%s» es falso." + +#: commands/publicationcmds.c:1298 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "Cambie wal_level a logical antes de crear suscripciones." +#| msgid "cannot add schema \"%s\" to publication" +msgid "cannot add schema to publication \"%s\"" +msgstr "no se puede agregar un esquema a la publicación «%s»" -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "No se puede agregar esquemas si alguna table que especifica lista de columnas ya es parte de la publicación." + +#: commands/publicationcmds.c:1348 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "debe ser superusuario para agregar o definir esquemas" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, 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:378 +#: commands/publicationcmds.c:1359 +#, c-format +#| msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "No se pueden agregar ni eliminar esquemas de las publicaciones FOR ALL TABLES." + +#: commands/publicationcmds.c:1367 #, 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:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +#| msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "cláusulas WHERE en conflicto o redundantes para la tabla «%s»" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +#| msgid "conflicting or redundant options" +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "listas de columnas contradictorias o redundantes para la tabla «%s»" + +#: commands/publicationcmds.c:1802 +#, 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 "la lista de columnas no debe ser especificada en ALTER PUBLICATION ... DROP" + +#: commands/publicationcmds.c:1814 #, 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:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "no se puede usar una cláusula WHERE cuando se elimina una tabla de una publicación" + +#: commands/publicationcmds.c:1881 +#, c-format +#| msgid "relation \"%s\" is not part of the publication" +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "las tablas del esquema «%s» no son parte de la publicación" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, 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:752 +#: commands/publicationcmds.c:1926 #, 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/publicationcmds.c:1933 +#, c-format +#| msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "El dueño de una publicación FOR TABLES IN SCHEMA debe ser un superusuario." + #: commands/schemacmds.c:105 commands/schemacmds.c:271 #, c-format msgid "unacceptable schema name \"%s\"" -msgstr "el nombre de schema «%s» es inaceptable" +msgstr "el nombre de esquema «%s» es inaceptable" #: commands/schemacmds.c:106 commands/schemacmds.c:272 #, c-format @@ -8769,578 +9479,660 @@ msgstr "El prefijo «pg_» está reservado para esquemas del sistema." msgid "schema \"%s\" already exists, skipping" msgstr "el esquema «%s» ya existe, omitiendo" -#: commands/seclabel.c:129 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "no se ha cargado ningún proveedor de etiquetas de seguridad" -#: commands/seclabel.c:133 +#: commands/seclabel.c:135 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "debe especificar un proveedor de etiquetas de seguridad cuando más de uno ha sido cargados" -#: commands/seclabel.c:151 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "el proveedor de etiquetas de seguridad «%s» no está cargado" -#: commands/seclabel.c:158 +#: commands/seclabel.c:160 #, c-format msgid "security labels are not supported for this type of object" -msgstr "las etiquetas de seguirdad no están soportadas para este tipo de objeto" +msgstr "las etiquetas de seguridad no están soportadas para este tipo de objeto" -#: commands/sequence.c:140 +#: commands/seclabel.c:193 #, c-format -msgid "unlogged sequences are not supported" -msgstr "las secuencias «unlogged» no están soportadas" +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot set security label on relation \"%s\"" +msgstr "no se puede definir una etiqueta de seguridad en la relación «%s»" -#: commands/sequence.c:717 +#: commands/sequence.c:755 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: se alcanzó el valor máximo de la secuencia «%s» (%s)" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: se alcanzó el máximo valor de la secuencia «%s» (%lld)" -#: commands/sequence.c:740 +#: commands/sequence.c:774 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: se alcanzó el valor mínimo de la secuencia «%s» (%s)" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: se alcanzó el valor mínimo de la secuencia «%s» (%lld)" -#: commands/sequence.c:858 +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "currval de la secuencia «%s» no está definido en esta sesión" -#: commands/sequence.c:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval no está definido en esta sesión" -#: commands/sequence.c:971 +#: commands/sequence.c:997 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: el valor %s está fuera del rango de la secuencia «%s» (%s..%s)" +#| msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: el valor %lld está fuera del rango de la secuencia «%s» (%lld..%lld)" -#: commands/sequence.c:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "opción de secuencia no válida SEQUENCE NAME" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "el tipo de columna de identidad debe ser smallint, integer o bigint" -#: commands/sequence.c:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "el tipo de secuencia debe ser smallint, integer o bigint" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT no debe ser cero" -#: commands/sequence.c:1481 +#: commands/sequence.c:1474 #, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) está fuera de rango para el tipo de dato de la secuencia %s" +#| 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 (%lld) está fuera de rango para el tipo de dato de la secuencia %s" -#: commands/sequence.c:1518 +#: commands/sequence.c:1506 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MINVALUE (%s) está fuera de rango para el tipo de dato de la secuencia %s" +#| 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 (%lld) está fuera de rango para el tipo de dato de la secuencia %s" -#: commands/sequence.c:1532 +#: commands/sequence.c:1514 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s) debe ser menor que MAXVALUE (%s)" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld) debe ser menor que MAXVALUE (%lld)" -#: commands/sequence.c:1559 +#: commands/sequence.c:1535 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "el valor START (%s) no puede ser menor que MINVALUE (%s)" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "el valor START (%lld) debe ser menor que MINVALUE (%lld)" -#: commands/sequence.c:1571 +#: commands/sequence.c:1541 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "el valor START (%s) no puede ser mayor que MAXVALUE (%s)" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "el valor START (%lld) no puede ser mayor que MAXVALUE (%lld)" -#: commands/sequence.c:1601 +#: commands/sequence.c:1565 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "el valor RESTART (%s) no puede ser menor que MINVALUE (%s)" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "el valor RESTART (%lld) no puede ser menos que MINVALUE (%lld)" -#: commands/sequence.c:1613 +#: commands/sequence.c:1571 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "el valor RESTART (%s) no puede ser mayor que MAXVALUE (%s)" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "el valor RESTART (%lld) no puede ser mayor que MAXVALUE (%lld)" -#: commands/sequence.c:1628 +#: commands/sequence.c:1582 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) debe ser mayor que cero" +#| msgid "CACHE (%s) must be greater than zero" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) debe ser mayor que cero" -#: commands/sequence.c:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "opción OWNED BY no válida" -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Especifique OWNED BY tabla.columna o OWNED BY NONE." -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "la relación referida «%s» no es una tabla o tabla foránea" +#| msgid "cannot open relation \"%s\"" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "la secuencia no puede ser poseída por la relación «%s»" -#: commands/sequence.c:1698 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "la secuencia debe tener el mismo dueño que la tabla a la que está enlazada" -#: commands/sequence.c:1702 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "la secuencia debe estar en el mismo esquema que la tabla a la que está enlazada" -#: commands/sequence.c:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "no se puede cambiar el dueño de la secuencia de identidad" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 -#: commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13870 +#: commands/tablecmds.c:16507 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La secuencia «%s» está enlazada a la tabla «%s»." -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, 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:139 +#: commands/statscmds.c:136 #, 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" +#| msgid "cannot rewrite system relation \"%s\"" +msgid "cannot define statistics for relation \"%s\"" +msgstr "no se puede definir estadística para la relación «%s»" -#: commands/statscmds.c:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "el objeto de estadísticas «%s» ya existe, omitiendo" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "el objeto de estadísticas «%s» ya existe" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, 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:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, 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:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, 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:326 +#: commands/statscmds.c:325 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" 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:347 +#: commands/statscmds.c:346 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "al crear estadísticas sobre una sola expresión, no se deben especificar tipos de estadísticas" -#: commands/statscmds.c:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "tipo de estadísticas «%s» no reconocido" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "las estadísticas extendidas requieren al menos 2 columnas" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "nombre de columna duplicado en definición de estadísticas" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" msgstr "expresión duplicada en definición de estadísticas" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8112 #, c-format msgid "statistics target %d is too low" msgstr "el valor de estadísticas %d es demasiado bajo" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8120 #, c-format msgid "lowering statistics target to %d" msgstr "bajando el valor de estadísticas a %d" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, 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:223 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "parámetro de suscripción no reconocido: «%s»" +#: commands/subscriptioncmds.c:289 +#, c-format +#| msgid "invalid option \"%s\"" +msgid "invalid WAL location (LSN): %s" +msgstr "ubicación de WAL (LSN) no válida: %s" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 -#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 -#: commands/subscriptioncmds.c:274 +#: 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 y %s son opciones mutuamente excluyentes" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "suscripción con %s también debe activar %s" -#: commands/subscriptioncmds.c:380 +#: commands/subscriptioncmds.c:433 +#, c-format +#| msgid "could not receive list of replicated tables from the publisher: %s" +msgid "could not receive list of publications from the publisher: %s" +msgstr "no se pudo recibir la lista de publicaciones desde el editor (publisher): %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +#| msgid "publication \"%s\" does not exist" +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "no existe la publicación «%s» en el “publisher”" +msgstr[1] "no existen las publicaciones «%s» en el “publisher”" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "debe ser superusuario para crear suscripciones" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 -#: replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "no se pudo connectar con el editor (publisher): %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, 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:529 +#: commands/subscriptioncmds.c:730 #, 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:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "no se puede establecer %s para la suscripción activada" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, 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:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, 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:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, 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 con «refresh» y «copy_data» no está permitido cuando «two_phase» está activo" + +#: commands/subscriptioncmds.c:1140 +#, c-format +#| msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Use ALTER SUBSCRIPTION ... SET PUBLICATION con refresh = false, o con copy_data=false, o use DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +#| msgid "Use views instead." +msgid "Use %s instead." +msgstr "Use %s en su lugar." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +#| msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Use %s con refresh = false, o con copy_data = false, o use DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1218 #, 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:1092 +#: commands/subscriptioncmds.c:1243 +#, 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 con copy_data no está permitido cuando two_phase está activo" + +#: commands/subscriptioncmds.c:1244 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Use ALTER SUBSCRIPTION ... REFRESH con copy_data = false, o use DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1263 +#, c-format +#| msgid "must be superuser to set grantor" +msgid "must be superuser to skip transaction" +msgstr "debe ser superusuario para ignorar una transacción" + +#: commands/subscriptioncmds.c:1283 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "la ubicación de WAL a saltar (LSN %X/%X) debe ser mayor que el LSN de origen %X/%X" + +#: commands/subscriptioncmds.c:1363 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "no existe la suscripción «%s», omitiendo" -#: commands/subscriptioncmds.c:1344 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "eliminando el slot de replicación «%s» en editor (publisher)" -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 #, 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): %s" -#: commands/subscriptioncmds.c:1395 +#: commands/subscriptioncmds.c:1672 #, 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:1397 +#: commands/subscriptioncmds.c:1674 #, 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:1513 +#: commands/subscriptioncmds.c:1788 #, 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:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 +#: replication/pgoutput/pgoutput.c:1072 +#, c-format +#| msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "no se pueden usar listas de columnas diferentes para la tabla «%s.%s» en distintas publicaciones" + +#: commands/subscriptioncmds.c:1860 #, 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 de replicación \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1581 +#: commands/subscriptioncmds.c:1863 #, 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:1611 +#: commands/subscriptioncmds.c:1893 #, 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:1655 +#: commands/subscriptioncmds.c:1937 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "la publicación «%s» ya existe en la suscripción «%s»" -#: commands/subscriptioncmds.c:1669 +#: commands/subscriptioncmds.c:1951 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "la publicación «%s» no está en la suscripción «%s»" -#: commands/subscriptioncmds.c:1680 +#: commands/subscriptioncmds.c:1962 #, 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 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "no existe la tabla «%s»" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "la tabla «%s» no existe, omitiendo" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "Use DROP TABLE para eliminar una tabla." -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "no existe la secuencia «%s»" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "la secuencia «%s» no existe, omitiendo" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Use DROP SEQUENCE para eliminar una secuencia." -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "no existe la vista «%s»" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "la vista «%s» no existe, omitiendo" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "Use DROP VIEW para eliminar una vista." -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "no existe la vista materializada «%s»" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "la vista materializada «%s» no existe, omitiendo" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:266 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:18437 -#: parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19005 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "no existe el índice «%s»" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "el índice «%s» no existe, omitiendo" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "Use DROP INDEX para eliminar un índice." -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "«%s» no es un tipo" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "Use DROP TYPE para eliminar un tipo." -#: commands/tablecmds.c:277 commands/tablecmds.c:13196 -#: commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13709 +#: commands/tablecmds.c:16210 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "no existe la tabla foránea «%s»" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "la tabla foránea «%s» no existe, omitiendo" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Use DROP FOREIGN TABLE para eliminar una tabla foránea." -#: commands/tablecmds.c:670 +#: commands/tablecmds.c:697 #, 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:701 +#: commands/tablecmds.c:728 #, 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:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15017 #, 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:922 +#: commands/tablecmds.c:949 #, 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." +msgstr "especificar un método de acceso de tablas no está soportado en tablas particionadas" -#: commands/tablecmds.c:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "«%s» no está particionada" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "no se puede particionar usando más de %d columnas" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, 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:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La tabla «%s» contiene índices que son únicos." -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, 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:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY no soporta CASCADE" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "no se puede eliminar el índice particionado «%s» concurrentemente" -#: commands/tablecmds.c:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "no se puede truncar ONLY una tabla particionada" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, 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:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "truncando además la tabla «%s»" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "no se puede truncar la tabla foránea «%s»" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "no se pueden truncar tablas temporales de otras sesiones" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14914 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "no se puede heredar de la tabla particionada «%s»" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "no se puede heredar de la partición «%s»" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 -#: parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2633 #, 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:2455 +#: commands/tablecmds.c:2487 #, 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:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14893 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "no se puede heredar de la tabla temporal «%s»" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14901 #, 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:2528 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "mezclando múltiples definiciones heredadas de la columna «%s»" -#: commands/tablecmds.c:2536 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "columna heredada «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:2538 commands/tablecmds.c:2561 -#: commands/tablecmds.c:2578 commands/tablecmds.c:2834 -#: commands/tablecmds.c:2864 commands/tablecmds.c:2878 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 #: 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 @@ -9351,1629 +10143,1654 @@ msgstr "columna heredada «%s» tiene conflicto de tipos" msgid "%s versus %s" msgstr "%s versus %s" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "columna heredada «%s» tiene conflicto de ordenamiento (collation)" -#: commands/tablecmds.c:2549 commands/tablecmds.c:2846 -#: commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "«%s» versus «%s»" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, 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:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "la columna «%s» tiene conflicto de método de compresión" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "columna heredada «%s» tiene conflicto de generación" -#: commands/tablecmds.c:2685 commands/tablecmds.c:2740 -#: commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 -#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12433 parser/parse_utilcmd.c:1302 +#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 +#: parser/parse_utilcmd.c:1862 #, 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:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, 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:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, 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:2820 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "mezclando la columna «%s» con la definición heredada" -#: commands/tablecmds.c:2824 +#: commands/tablecmds.c:2856 #, 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:2825 +#: commands/tablecmds.c:2857 #, 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:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la columna «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la columna «%s» tiene conflicto de ordenamientos (collation)" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "la columna «%s» tiene conflicto de parámetros de almacenamiento" -#: commands/tablecmds.c:2903 +#: commands/tablecmds.c:2935 #, 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:2905 +#: commands/tablecmds.c:2937 #, 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:2909 +#: commands/tablecmds.c:2941 #, 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:2914 +#: commands/tablecmds.c:2946 #, 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:3023 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "la columna «%s» hereda expresiones de generación en conflicto" -#: commands/tablecmds.c:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la columna «%s» hereda valores por omisión no coincidentes" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, 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:3076 +#: commands/tablecmds.c:3108 #, 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:3289 +#: commands/tablecmds.c:3321 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "no se pueden mover tablas temporales de otras sesiones" -#: commands/tablecmds.c:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" -msgstr "no se puede cambiar el nombre a una columna de una tabla tipada" +msgstr "no se puede renombrar una columna de una tabla tipada" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3410 #, 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" +#| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgid "cannot rename columns of relation \"%s\"" +msgstr "no se puede renombrar las columnas de la relación «%s»" -#: commands/tablecmds.c:3472 +#: commands/tablecmds.c:3505 #, 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" +msgstr "debe renombrar la columna heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" -msgstr "no se puede cambiar el nombre a la columna de sistema «%s»" +msgstr "no se puede renombrar la columna de sistema «%s»" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" -msgstr "no se puede cambiar el nombre a la columna heredada «%s»" +msgstr "no se puede renombrar la columna heredada «%s»" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, 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" +msgstr "debe renombrar la restricción heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3678 +#: commands/tablecmds.c:3711 #, c-format msgid "cannot rename inherited constraint \"%s\"" -msgstr "no se puede cambiar el nombre a la restricción heredada «%s»" +msgstr "no se puede renombrar la restricción heredada «%s»" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3976 +#: commands/tablecmds.c:4008 #, 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:3985 +#: commands/tablecmds.c:4017 #, 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:4453 +#: commands/tablecmds.c:4486 #, c-format 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:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "no se puede cambiar la opción de persistencia dos veces" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, c-format +#| msgid "cannot change inheritance of partitioned table" +msgid "cannot change access method of a partitioned table" +msgstr "no se puede cambiar el método de acceso de una tabla particionada" + +#: commands/tablecmds.c:4721 +#, c-format +#| msgid "cannot have multiple SET TABLESPACE subcommands" +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "no se pueden tener múltiples subórdenes SET ACCESS METHOD" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "no se puede reescribir la relación de sistema «%s»" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, 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:5437 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "no se puede reescribir tablas temporales de otras sesiones" -#: commands/tablecmds.c:5898 +#: commands/tablecmds.c:5986 #, 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:5915 +#: commands/tablecmds.c:6003 #, 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:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, 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:5940 +#: commands/tablecmds.c:6028 #, 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:6088 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:6091 -#, 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:6097 -#, 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:6100 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, 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" +#| msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "la acción ALTER %s no puede ejecutarse en la relación «%s»" -#: commands/tablecmds.c:6103 -#, 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:6106 -#, 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:6109 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "«%s» no es una tabla o tabla foránea" - -#: commands/tablecmds.c:6112 -#, 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:6115 -#, 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:6118 -#, c-format -msgid "\"%s\" is not a table or partitioned index" -msgstr "«%s» no es una tabla o índice particionado" - -#: commands/tablecmds.c:6128 -#, c-format -msgid "\"%s\" is of the wrong type" -msgstr "«%s» es tipo equivocado" - -#: commands/tablecmds.c:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, 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:6386 +#: commands/tablecmds.c:6564 #, 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:6393 +#: commands/tablecmds.c:6571 #, 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:6449 +#: commands/tablecmds.c:6627 #, 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:6451 +#: commands/tablecmds.c:6629 #, 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:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "el tipo %s no es un tipo compuesto" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "no se puede agregar una columna a una tabla tipada" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "no se puede agregar una columna a una partición" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15144 #, 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:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15151 #, 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:6626 +#: commands/tablecmds.c:6804 #, 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:6669 +#: commands/tablecmds.c:6847 #, 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:6912 +#: commands/tablecmds.c:7091 #, 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:6990 +#: commands/tablecmds.c:7169 #, 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:6997 +#: commands/tablecmds.c:7176 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "ya existe la columna «%s» en la relación «%s»" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7242 commands/tablecmds.c:12072 #, 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:7064 commands/tablecmds.c:7381 -#: commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7243 commands/tablecmds.c:7560 +#: commands/tablecmds.c:8557 commands/tablecmds.c:12073 #, c-format msgid "Do not specify the ONLY keyword." msgstr "No especifique la opción ONLY." -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 -#: commands/tablecmds.c:7449 commands/tablecmds.c:7563 -#: commands/tablecmds.c:7657 commands/tablecmds.c:7716 -#: commands/tablecmds.c:7834 commands/tablecmds.c:8000 -#: commands/tablecmds.c:8070 commands/tablecmds.c:8226 -#: commands/tablecmds.c:11735 commands/tablecmds.c:13219 -#: commands/tablecmds.c:15765 +#: commands/tablecmds.c:7280 commands/tablecmds.c:7486 +#: commands/tablecmds.c:7628 commands/tablecmds.c:7742 +#: commands/tablecmds.c:7836 commands/tablecmds.c:7895 +#: commands/tablecmds.c:8014 commands/tablecmds.c:8153 +#: commands/tablecmds.c:8223 commands/tablecmds.c:8379 +#: commands/tablecmds.c:12227 commands/tablecmds.c:13732 +#: commands/tablecmds.c:16301 #, c-format msgid "cannot alter system column \"%s\"" msgstr "no se puede alterar columna de sistema «%s»" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7286 commands/tablecmds.c:7634 #, 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:7150 +#: commands/tablecmds.c:7329 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la columna «%s» está en la llave primaria" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7334 #, 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:7178 +#: commands/tablecmds.c:7357 #, 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:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7557 commands/tablecmds.c:9040 #, 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:7379 +#: commands/tablecmds.c:7558 #, 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:7457 +#: commands/tablecmds.c:7636 #, 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:7462 +#: commands/tablecmds.c:7641 #, 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:7465 +#: commands/tablecmds.c:7644 #, 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:7574 +#: commands/tablecmds.c:7753 #, 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:7580 +#: commands/tablecmds.c:7759 #, 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:7586 +#: commands/tablecmds.c:7765 #, 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:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7842 commands/tablecmds.c:7903 #, 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:7729 +#: commands/tablecmds.c:7908 #, 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:7782 +#: commands/tablecmds.c:7961 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION se debe aplicar a las tablas hijas también" -#: commands/tablecmds.c:7804 +#: commands/tablecmds.c:7983 #, 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:7842 +#: commands/tablecmds.c:8022 #, 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:7847 +#: commands/tablecmds.c:8027 #, 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:7947 +#: commands/tablecmds.c:8100 #, 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:7990 +#: commands/tablecmds.c:8143 #, 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:8009 +#: commands/tablecmds.c:8162 #, 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:8014 +#: commands/tablecmds.c:8167 #, 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:8016 +#: commands/tablecmds.c:8169 #, 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:8206 +#: commands/tablecmds.c:8359 #, c-format msgid "invalid storage type \"%s\"" msgstr "tipo de almacenamiento no válido «%s»" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8391 #, 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:8283 +#: commands/tablecmds.c:8436 #, c-format msgid "cannot drop column from typed table" msgstr "no se pueden eliminar columnas de una tabla tipada" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8495 #, 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:8355 +#: commands/tablecmds.c:8508 #, c-format msgid "cannot drop system column \"%s\"" msgstr "no se puede eliminar la columna de sistema «%s»" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8518 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "no se puede eliminar la columna heredada «%s»" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8531 #, 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:8403 +#: commands/tablecmds.c:8556 #, 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:8607 +#: commands/tablecmds.c:8760 #, 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:8632 +#: commands/tablecmds.c:8785 #, 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:8967 +#: commands/tablecmds.c:9122 #, 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:8973 +#: commands/tablecmds.c:9128 #, 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:8976 +#: commands/tablecmds.c:9131 #, 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:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9138 commands/tablecmds.c:9604 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relación referida «%s» no es una tabla" -#: commands/tablecmds.c:9006 +#: commands/tablecmds.c:9161 #, 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:9013 +#: commands/tablecmds.c:9168 #, 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:9019 +#: commands/tablecmds.c:9174 #, 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:9023 +#: commands/tablecmds.c:9178 #, 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:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9252 commands/tablecmds.c:9258 #, 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:9111 +#: commands/tablecmds.c:9274 #, 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:9218 +#: commands/tablecmds.c:9381 #, 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:9220 +#: commands/tablecmds.c:9383 #, 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:9583 commands/tablecmds.c:9996 -#: parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9540 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "la columna «%s» referenciada en la acción ON DELETE SET debe ser parte de la llave foránea" + +#: commands/tablecmds.c:9813 commands/tablecmds.c:10281 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, 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:10373 commands/tablecmds.c:10651 -#: commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10833 commands/tablecmds.c:11111 +#: commands/tablecmds.c:12029 commands/tablecmds.c:12104 #, 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:10380 +#: commands/tablecmds.c:10840 #, 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" +msgstr "la restricción «%s» de la relación «%s» no es una restricción de llave foránea" -#: commands/tablecmds.c:10418 +#: commands/tablecmds.c:10878 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "no se puede modificar la restricción «%s» en la relación «%s»" -#: commands/tablecmds.c:10421 +#: commands/tablecmds.c:10881 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "La restricción «%s» deriva de la restricción «%s» de la relación «%s»." -#: commands/tablecmds.c:10423 +#: commands/tablecmds.c:10883 #, c-format msgid "You may alter the constraint it derives from, instead." msgstr "En su lugar, puede modificar la restricción de la cual deriva." -#: commands/tablecmds.c:10659 +#: commands/tablecmds.c:11119 #, 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:10737 +#: commands/tablecmds.c:11197 #, 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:10827 +#: commands/tablecmds.c:11287 #, 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:10833 +#: commands/tablecmds.c:11293 #, c-format -#| msgid "Generated columns cannot be used in COPY." msgid "system columns cannot be used in foreign keys" msgstr "las columnas de sistema no pueden usarse en llaves foráneas" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11297 #, 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:10902 +#: commands/tablecmds.c:11363 #, 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:10919 +#: commands/tablecmds.c:11380 #, 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:10984 +#: commands/tablecmds.c:11445 #, 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:11078 +#: commands/tablecmds.c:11539 #, 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:11083 +#: commands/tablecmds.c:11544 #, 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:11493 +#: commands/tablecmds.c:11985 #, 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:11543 +#: commands/tablecmds.c:12035 #, 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:11719 +#: commands/tablecmds.c:12211 #, 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:11746 +#: commands/tablecmds.c:12238 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "no se puede alterar la columna heredada «%s»" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12247 #, 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:11805 +#: commands/tablecmds.c:12297 #, 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:11808 +#: commands/tablecmds.c:12300 #, c-format msgid "You might need to add an explicit cast." msgstr "Puede ser necesario agregar un cast explícito." -#: commands/tablecmds.c:11812 +#: commands/tablecmds.c:12304 #, 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:11815 +#: commands/tablecmds.c:12307 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Puede ser necesario especificar «USING %s::%s»." -#: commands/tablecmds.c:11914 +#: commands/tablecmds.c:12406 #, 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:11942 +#: commands/tablecmds.c:12434 #, 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:11953 +#: commands/tablecmds.c:12445 #, 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:12078 +#: commands/tablecmds.c:12570 #, 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:12116 +#: commands/tablecmds.c:12608 #, 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:12121 +#: commands/tablecmds.c:12613 #, 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:12199 -#, 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:12200 -#, 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:12221 +#: commands/tablecmds.c:12694 #, 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:12222 commands/tablecmds.c:12241 -#: commands/tablecmds.c:12259 +#: commands/tablecmds.c:12695 commands/tablecmds.c:12714 +#: commands/tablecmds.c:12732 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s depende de la columna «%s»" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12713 #, 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:12258 +#: commands/tablecmds.c:12731 #, 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:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:12762 +#, 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:12763 +#, 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:13840 commands/tablecmds.c:13852 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "no se puede cambiar el dueño del índice «%s»" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13842 commands/tablecmds.c:13854 #, 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:13355 +#: commands/tablecmds.c:13868 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "no se puede cambiar el dueño de la secuencia «%s»" -#: commands/tablecmds.c:13369 commands/tablecmds.c:16657 +#: commands/tablecmds.c:13882 commands/tablecmds.c:17193 +#: commands/tablecmds.c:17212 #, c-format msgid "Use ALTER TYPE instead." msgstr "Considere usar ALTER TYPE." -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13891 #, 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" +#| msgid "cannot change owner of index \"%s\"" +msgid "cannot change owner of relation \"%s\"" +msgstr "no se puede cambiar el dueño de la relación «%s»" -#: commands/tablecmds.c:13717 +#: commands/tablecmds.c:14253 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "no se pueden tener múltiples subórdenes SET TABLESPACE" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14330 #, 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" +#| msgid "cannot open relation \"%s\"" +msgid "cannot set options for relation \"%s\"" +msgstr "no se puede definir opciones para la relación «%s»" -#: commands/tablecmds.c:13827 commands/view.c:505 +#: commands/tablecmds.c:14364 commands/view.c:521 #, 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:14079 +#: commands/tablecmds.c:14614 #, 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:14091 +#: commands/tablecmds.c:14626 #, 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:14183 +#: commands/tablecmds.c:14718 #, 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:14199 +#: commands/tablecmds.c:14734 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "no se encontraron relaciones coincidentes en el tablespace «%s»" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14852 #, c-format msgid "cannot change inheritance of typed table" msgstr "no se puede cambiar la herencia de una tabla tipada" -#: commands/tablecmds.c:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14857 commands/tablecmds.c:15413 #, c-format msgid "cannot change inheritance of a partition" msgstr "no puede cambiar la herencia de una partición" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14862 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "no se puede cambiar la herencia de una tabla particionada" -#: commands/tablecmds.c:14372 +#: commands/tablecmds.c:14908 #, 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:14385 +#: commands/tablecmds.c:14921 #, c-format msgid "cannot inherit from a partition" msgstr "no se puede heredar de una partición" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17301 +#: commands/tablecmds.c:14943 commands/tablecmds.c:17846 #, c-format msgid "circular inheritance not allowed" msgstr "la herencia circular no está permitida" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17302 +#: commands/tablecmds.c:14944 commands/tablecmds.c:17847 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "«%s» ya es un hijo de «%s»." -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14957 #, 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:14423 +#: commands/tablecmds.c:14959 #, 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:14626 +#: commands/tablecmds.c:15162 #, 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:14635 +#: commands/tablecmds.c:15171 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "columna «%s» en tabla hija debe ser una columna generada" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:15221 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" msgstr "la columna «%s» en tabla hija tiene una expresión de generación en conflicto" -#: commands/tablecmds.c:14713 +#: commands/tablecmds.c:15249 #, c-format msgid "child table is missing column \"%s\"" msgstr "tabla hija no tiene la columna «%s»" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15337 #, 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:14809 +#: commands/tablecmds.c:15345 #, 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:14820 +#: commands/tablecmds.c:15356 #, 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:14855 +#: commands/tablecmds.c:15391 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "tabla hija no tiene la restricción «%s»" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15477 #, c-format 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:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15506 commands/tablecmds.c:15554 #, 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:15024 +#: commands/tablecmds.c:15560 #, 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:15252 +#: commands/tablecmds.c:15788 #, c-format msgid "typed tables cannot inherit" msgstr "las tablas tipadas no pueden heredar" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15818 #, c-format msgid "table is missing column \"%s\"" msgstr "la tabla no tiene la columna «%s»" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15829 #, 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:15302 +#: commands/tablecmds.c:15838 #, 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:15316 +#: commands/tablecmds.c:15852 #, c-format msgid "table has extra column \"%s\"" msgstr "tabla tiene la columna extra «%s»" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15904 #, c-format msgid "\"%s\" is not a typed table" msgstr "«%s» no es una tabla tipada" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16078 #, 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:15548 +#: commands/tablecmds.c:16084 #, 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:15554 +#: commands/tablecmds.c:16090 #, 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:15560 +#: commands/tablecmds.c:16096 #, 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:15577 +#: commands/tablecmds.c:16113 #, 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:15584 +#: commands/tablecmds.c:16120 #, 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:15831 +#: commands/tablecmds.c:16367 #, 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" +msgstr "no se puede cambiar la condición de «logged» de la tabla «%s» porque es temporal" -#: commands/tablecmds.c:15855 +#: commands/tablecmds.c:16391 #, 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:15857 +#: commands/tablecmds.c:16393 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Las tablas «unlogged» no pueden replicarse." -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16438 #, 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:15912 +#: commands/tablecmds.c:16448 #, 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:15970 +#: commands/tablecmds.c:16506 #, 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:16077 +#: commands/tablecmds.c:16613 #, 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:16640 +#: commands/tablecmds.c:17026 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "«%s» no es una tabla o vista materializada" + +#: commands/tablecmds.c:17176 #, c-format msgid "\"%s\" is not a composite type" msgstr "«%s» no es un tipo compuesto" -#: commands/tablecmds.c:16672 +#: commands/tablecmds.c:17204 #, 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" +#| msgid "cannot change owner of index \"%s\"" +msgid "cannot change schema of index \"%s\"" +msgstr "no se puede cambiar el esquema del índice «%s»" -#: commands/tablecmds.c:16707 +#: commands/tablecmds.c:17206 commands/tablecmds.c:17218 +#, c-format +#| msgid "Change the ownership of the index's table, instead." +msgid "Change the schema of the table instead." +msgstr "Considere cambiar el esquema de la tabla en su lugar." + +#: commands/tablecmds.c:17210 +#, c-format +#| msgid "cannot change owner of index \"%s\"" +msgid "cannot change schema of composite type \"%s\"" +msgstr "no se puede cambiar el esquema del el tipo compuesto «%s»" + +#: commands/tablecmds.c:17216 +#, c-format +#| msgid "cannot change TOAST relation \"%s\"" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "no se puede cambiar el esquema de la tabla TOAST «%s»" + +#: commands/tablecmds.c:17253 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "estrategia de particionamiento «%s» no reconocida" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17261 #, 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:16781 +#: commands/tablecmds.c:17327 #, 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:16789 +#: commands/tablecmds.c:17335 #, 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:16800 commands/tablecmds.c:16914 +#: commands/tablecmds.c:17346 commands/tablecmds.c:17460 #, 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:16801 commands/tablecmds.c:16915 commands/trigger.c:653 +#: commands/tablecmds.c:17347 commands/tablecmds.c:17461 commands/trigger.c:668 #: rewrite/rewriteHandler.c:927 rewrite/rewriteHandler.c:962 #, c-format msgid "Column \"%s\" is a generated column." msgstr "La columna «%s» es una columna generada." -#: commands/tablecmds.c:16877 +#: commands/tablecmds.c:17423 #, 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:16897 +#: commands/tablecmds.c:17443 #, 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:16927 +#: commands/tablecmds.c:17473 #, c-format msgid "cannot use constant expression as partition key" msgstr "no se pueden usar expresiones constantes como llave de particionamiento" -#: commands/tablecmds.c:16948 +#: commands/tablecmds.c:17494 #, 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:16983 +#: commands/tablecmds.c:17529 #, 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:16989 +#: commands/tablecmds.c:17535 #, 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:17241 +#: commands/tablecmds.c:17786 #, c-format msgid "\"%s\" is already a partition" msgstr "«%s» ya es una partición" -#: commands/tablecmds.c:17247 +#: commands/tablecmds.c:17792 #, c-format msgid "cannot attach a typed table as partition" msgstr "no puede adjuntar tabla tipada como partición" -#: commands/tablecmds.c:17263 +#: commands/tablecmds.c:17808 #, c-format msgid "cannot attach inheritance child as partition" msgstr "no puede adjuntar hija de herencia como partición" -#: commands/tablecmds.c:17277 +#: commands/tablecmds.c:17822 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "no puede adjuntar ancestro de herencia como partición" -#: commands/tablecmds.c:17311 +#: commands/tablecmds.c:17856 #, 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:17319 +#: commands/tablecmds.c:17864 #, 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:17327 +#: commands/tablecmds.c:17872 #, 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:17334 +#: commands/tablecmds.c:17879 #, 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:17354 +#: commands/tablecmds.c:17899 #, 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:17357 +#: commands/tablecmds.c:17902 #, 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:17369 +#: commands/tablecmds.c:17914 #, 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:17371 commands/trigger.c:459 +#: commands/tablecmds.c:17916 #, 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" +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:17550 +#: commands/tablecmds.c:18095 #, 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:17553 +#: commands/tablecmds.c:18098 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "La tabla particionada «%s» contiene índices únicos." -#: commands/tablecmds.c:17873 +#: commands/tablecmds.c:18409 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "no se puede desprender particiones concurrentemente cuando existe una partición por omisión" -#: commands/tablecmds.c:17982 +#: commands/tablecmds.c:18518 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "la tabla particionada «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:17988 +#: commands/tablecmds.c:18524 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "la partición «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:18471 commands/tablecmds.c:18491 -#: commands/tablecmds.c:18511 commands/tablecmds.c:18530 -#: commands/tablecmds.c:18572 +#: commands/tablecmds.c:19039 commands/tablecmds.c:19059 +#: commands/tablecmds.c:19079 commands/tablecmds.c:19098 +#: commands/tablecmds.c:19140 #, 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:18474 +#: commands/tablecmds.c:19042 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "El índice «%s» ya está adjunto a otro índice." -#: commands/tablecmds.c:18494 +#: commands/tablecmds.c:19062 #, 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:18514 +#: commands/tablecmds.c:19082 #, c-format msgid "The index definitions do not match." msgstr "Las definiciones de los índices no coinciden." -#: commands/tablecmds.c:18533 +#: commands/tablecmds.c:19101 #, 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:18575 +#: commands/tablecmds.c:19143 #, 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:18805 +#: commands/tablecmds.c:19373 #, c-format msgid "column data type %s does not support compression" msgstr "el tipo de dato de columna %s no soporta compresión" -#: commands/tablecmds.c:18812 +#: commands/tablecmds.c:19380 #, c-format msgid "invalid compression method \"%s\"" msgstr "método de compresión «%s» no válido" -#: commands/tablespace.c:161 commands/tablespace.c:177 -#: commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 -#: 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:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "«%s» existe pero no es un directorio" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "se ha denegado el permiso para crear el tablespace «%s»" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Debe ser superusuario para crear tablespaces." -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "la ruta del tablespace no puede contener comillas simples" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "la ubicación del tablespace debe ser una ruta absoluta" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "la ruta «%s» del tablespace es demasiado larga" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format 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:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "el nombre de tablespace «%s» es inaceptable" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "El prefijo «pg_» está reservado para tablespaces del sistema." -#: commands/tablespace.c:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "el tablespace «%s» ya existe" -#: commands/tablespace.c:427 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, 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 "el valor de OID de pg_tablespace no se definió en modo de actualización binaria" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "no existe el tablespace «%s»" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "el tablespace «%s» no existe, omitiendo" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "no se puede eliminar el tablespace «%s» porque otros objetos dependen de él" -#: commands/tablespace.c:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "el tablespace «%s» no está vacío" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "no existe el directorio «%s»" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Cree este directorio para el tablespace antes de reiniciar el servidor." -#: commands/tablespace.c:618 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "no se pudo definir los permisos del directorio «%s»: %m" -#: commands/tablespace.c:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "el directorio «%s» ya está siendo usado como tablespace" -#: commands/tablespace.c:768 commands/tablespace.c:781 -#: commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 -#: storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 +#: storage/file/fd.c:3669 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "no se pudo eliminar el directorio «%s»: %m" -#: commands/tablespace.c:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "no se pudo eliminar el enlace simbólico «%s»: %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "«%s» no es un directorio o enlace simbólico" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "No existe el tablespace «%s»." -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "algunos directorios para el tablespace %u no pudieron eliminarse" -#: commands/tablespace.c:1567 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Puede eliminar los directorios manualmente, si es necesario." -#: commands/trigger.c:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "«%s» es una tabla" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Las tablas no pueden tener disparadores INSTEAD OF." -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "«%s» es una tabla particionada" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format -#| msgid "ROW triggers with transition tables are not supported on partitions." msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "Los triggers ROW con tablas de transición no están soportados en tablas particionadas." -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "«%s» es una vista" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, 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:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Las vistas no pueden tener disparadores TRUNCATE." -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 -#: commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "«%s» es una tabla foránea" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Las tablas foráneas no pueden tener disparadores INSTEAD OF." -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Las tablas foráneas no pueden tener disparadores TRUNCATE." -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Las tablas foráneas no pueden tener disparadores de restricción." -#: commands/trigger.c:377 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +#| msgid "Foreign tables cannot have TRUNCATE triggers." +msgid "relation \"%s\" cannot have triggers" +msgstr "la relación «%s» no puede tener triggers" + +#: commands/trigger.c:392 #, 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:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "los disparadores INSTEAD OF deben ser FOR EACH ROW" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "los disparadores INSTEAD OF no pueden tener condiciones WHEN" -#: commands/trigger.c:393 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "los disparadores INSTEAD OF no pueden tener listas de columnas" -#: commands/trigger.c:422 +#: commands/trigger.c:437 #, 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:423 +#: commands/trigger.c:438 #, 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:436 +#: commands/trigger.c:451 #, 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:443 +#: commands/trigger.c:458 #, 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:463 +#: commands/trigger.c:474 +#, 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/trigger.c:478 #, 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:469 +#: commands/trigger.c:484 #, 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:474 +#: commands/trigger.c:489 #, 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:491 +#: commands/trigger.c:506 #, 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:502 +#: commands/trigger.c:517 #, 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:519 +#: commands/trigger.c:534 #, 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:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE no se puede especificar varias veces" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, 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:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE no se puede especificar varias veces" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, 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:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, 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:618 +#: commands/trigger.c:633 #, 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:631 +#: commands/trigger.c:646 #, 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:636 +#: commands/trigger.c:651 #, 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:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, 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:645 +#: commands/trigger.c:660 #, 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:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "ya existe un trigger «%s» para la relación «%s»" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "disparador «%s» para la relación «%s» es un disparador interno" +#| msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "disparador «%s» para la relación «%s» es un disparador interno o heredado" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "disparador «%s» para la relación «%s» es un disparador de restricción" -#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "no existe el trigger «%s» para la tabla «%s»" -#: commands/trigger.c:1600 +#: commands/trigger.c:1568 +#, c-format +#| msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "no se puede renombrar el trigger «%s» en tabla «%s»" + +#: commands/trigger.c:1570 +#, c-format +#| msgid "Change the ownership of the index's table, instead." +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Renombre el trigger en la tabla particionada «%s» en su lugar." + +#: commands/trigger.c:1670 +#, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "renombrado el trigger «%s» en la relación «%s»" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "permiso denegado: «%s» es un trigger de sistema" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" msgstr "la función de trigger %u ha retornado un valor null" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 -#: commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3346 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT no puede retornar un valor" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, 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:2356 +#: commands/trigger.c:2586 #, 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:3104 executor/nodeModifyTable.c:1956 -#: executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3423 executor/nodeModifyTable.c:2344 +#: executor/nodeModifyTable.c:2427 #, 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:3105 executor/nodeModifyTable.c:1306 -#: executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 -#: executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3424 executor/nodeModifyTable.c:1510 +#: executor/nodeModifyTable.c:1584 executor/nodeModifyTable.c:2345 +#: executor/nodeModifyTable.c:2428 executor/nodeModifyTable.c:3058 #, 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:3134 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 -#: executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 -#: executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3465 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1526 executor/nodeModifyTable.c:2362 +#: executor/nodeModifyTable.c:2570 #, 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:3142 executor/nodeModifyTable.c:1412 -#: executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3473 executor/nodeModifyTable.c:1616 +#: executor/nodeModifyTable.c:2445 executor/nodeModifyTable.c:2594 +#: executor/nodeModifyTable.c:2946 #, 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:4203 +#: commands/trigger.c:4649 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "no se puede ejecutar un disparador postergado dentro de una operación restringida por seguridad" -#: commands/trigger.c:5253 +#: commands/trigger.c:5832 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "la restricción «%s» no es postergable" -#: commands/trigger.c:5276 +#: commands/trigger.c:5855 #, c-format msgid "constraint \"%s\" does not exist" msgstr "no existe la restricción «%s»" @@ -11083,582 +11900,581 @@ msgstr "debe ser superusuario para crear un tipo base" msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Cree el tipo como un tipo inconcluso, luego cree sus funciones de I/O, luego haga un CREATE TYPE completo." -#: 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 "el atributo de tipo «%s» no es reconocido" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "la categoría de tipo «%s» no es válida: debe ser ASCII simple" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "el tipo de elemento de array no puede ser %s" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "el alineamiento «%s» no es reconocido" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "el almacenamiento «%s» no es reconocido" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "debe especificarse la función de ingreso del tipo" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "debe especificarse la función de salida de tipo" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "la función de salida de modificadores de tipo es inútil sin una función de entrada de modificadores de tipo" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format 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 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "«%s» no es un tipo de dato base válido para un dominio" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "múltiples expresiones default" -#: 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 "las restricciones NULL/NOT NULL no coinciden" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "las restricciones «check» en dominios no pueden ser marcadas NO INHERIT" -#: 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 "no se pueden poner restricciones de unicidad a un dominio" -#: 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 "no se pueden poner restricciones de llave primaria a un dominio" -#: 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 "las restricciones de exclusión no son posibles para los dominios" -#: 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 "no se pueden poner restricciones de llave foránea a un dominio" -#: 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 "no se puede especificar la postergabilidad de las restricciones a un dominio" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s no es un enum" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "el atributo de tipo «subtype» es obligatorio" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "el subtipo de rango no puede ser %s" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "se especificó un ordenamiento (collation) al rango, pero el subtipo no soporta ordenamiento" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "no se puede especificar una función canónica sin antes crear un tipo inconcluso" -#: 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 "Cree el tipo como un tipo inconcluso, luego cree su función de canonicalización, luego haga un CREATE TYPE completo." -#: commands/typecmds.c:1981 +#: commands/typecmds.c:1966 #, 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:1999 +#: commands/typecmds.c:1984 #, 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:2015 +#: commands/typecmds.c:2000 #, 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:2043 +#: commands/typecmds.c:2028 #, 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:2050 +#: commands/typecmds.c:2035 #, 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:2079 +#: commands/typecmds.c:2064 #, 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:2097 +#: commands/typecmds.c:2082 #, 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:2104 +#: commands/typecmds.c:2089 #, 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:2132 +#: commands/typecmds.c:2117 #, 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:2139 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "la función «send» %s no debe ser volatile" -#: commands/typecmds.c:2166 +#: commands/typecmds.c:2151 #, 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:2173 +#: commands/typecmds.c:2158 #, 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:2200 +#: commands/typecmds.c:2185 #, 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:2207 +#: commands/typecmds.c:2192 #, 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:2234 +#: commands/typecmds.c:2219 #, 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:2263 +#: commands/typecmds.c:2248 #, c-format msgid "type subscripting function %s must return type %s" msgstr "la función de subindexación %s del tipo debe retornar %s" -#: commands/typecmds.c:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "los tipos definidos por el usuario no pueden usar la función de subindexación %s" -#: commands/typecmds.c:2319 +#: 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 "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:2350 +#: commands/typecmds.c:2335 #, 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:2356 +#: commands/typecmds.c:2341 #, 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:2392 +#: commands/typecmds.c:2377 #, 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:2399 +#: commands/typecmds.c:2384 #, 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:2426 +#: commands/typecmds.c:2411 #, 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:2459 +#: commands/typecmds.c:2444 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "el valor de OID de multirango de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2492 +#: commands/typecmds.c:2477 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" 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 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "la columna «%s» de la tabla «%s» contiene valores null" -#: 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 "no existe la restricción «%s» en el dominio «%s»" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "no existe la restricción «%s» en el dominio «%s», omitiendo" -#: commands/typecmds.c:3113 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "la restricción «%s» en el dominio «%s» no es una restricción «check»" -#: commands/typecmds.c:3219 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "la columna «%s» de la relación «%s» contiene valores que violan la nueva restricción" -#: 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 no es un dominio" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "el dominio «%2$s» ya contiene una restricción llamada «%1$s»" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "no se pueden usar referencias a tablas en restricción «check» para un dominio" -#: 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 es el tipo de registro de una tabla" -#: 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 "Considere usar 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 "no se puede alterar el tipo de array «%s»" -#: 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 "Puede alterar el tipo %s, lo cual alterará el tipo de array también." -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "ya existe un tipo llamado «%s» en el esquema «%s»" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "no se puede cambiar el almacenamiento del tipo a PLAIN" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "el atributo de tipo «%s» no puede ser cambiado" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "debe ser superusuario para alterar un tipo" -#: 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» no es un tipo base" -#: commands/user.c:140 +#: commands/user.c:138 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID ya no puede ser especificado" -#: commands/user.c:294 +#: commands/user.c:256 #, c-format msgid "must be superuser to create superusers" msgstr "debe ser superusuario para crear superusuarios" -#: commands/user.c:301 +#: commands/user.c:263 #, c-format msgid "must be superuser to create replication users" msgstr "debe ser superusuario para crear usuarios de replicación" -#: commands/user.c:308 +#: commands/user.c:270 #, c-format msgid "must be superuser to create bypassrls users" msgstr "debe ser superusuario para crear usuarios con bypassrls" -#: commands/user.c:315 +#: commands/user.c:277 #, c-format msgid "permission denied to create role" msgstr "se ha denegado el permiso para crear el rol" -#: commands/user.c:325 commands/user.c:1226 commands/user.c:1233 -#: utils/adt/acl.c:5248 utils/adt/acl.c:5254 gram.y:15260 gram.y:15305 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 +#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:16437 gram.y:16483 #, c-format msgid "role name \"%s\" is reserved" msgstr "el nombre de rol «%s» está reservado" -#: 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 "Los nombres de rol que empiezan con «pg_» están reservados." -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "el rol «%s» ya existe" -#: 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 "la cadena vacía no es una contraseña válida, limpiando la contraseña" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format 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:570 commands/user.c:925 -#| msgid "cannot alter inherited column \"%s\"" +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "No se pueden alterar roles reservados." -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" msgstr "debe ser superusuario para modificar roles de superusuario o cambiar atributos de superusuario" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "must be superuser to alter replication roles or change replication attribute" msgstr "debe ser superusuario para modificar roles de replicación o cambiar atributos de replicación" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "debe ser superusuario para cambiar el atributo bypassrls" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "permiso denegado" -#: 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 "debe ser superusuario para alterar superusuarios" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "debe ser superusuario para alterar parámetros globalmente" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "se ha denegado el permiso para eliminar el rol" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "no se puede usar un especificador especial de rol en DROP ROLE" -#: 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:710 +#: 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 "no existe el rol «%s»" -#: commands/user.c:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "el rol «%s» no existe, omitiendo" -#: 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 "el usuario activo no puede ser eliminado" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "no se puede eliminar un usuario de la sesión" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "debe ser superusuario para eliminar superusuarios" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "no se puede eliminar el rol «%s» porque otros objetos dependen de él" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" -msgstr "no se puede cambiar el nombre a un usuario de la sesión" +msgstr "no se puede renombrar un usuario de la sesión" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" -msgstr "no se puede cambiar el nombre al usuario activo" +msgstr "no se puede renombrar el usuario activo" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" -msgstr "debe ser superusuario para cambiar el nombre a superusuarios" +msgstr "debe ser superusuario para renombrar superusuarios" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" -msgstr "se ha denegado el permiso para cambiar el nombre al rol" +msgstr "se ha denegado el permiso para renombrar el rol" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "la contraseña MD5 fue borrada debido al cambio de nombre del rol" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "los nombres de columna no pueden ser incluidos en GRANT/REVOKE ROLE" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "se ha denegado el permiso para eliminar objetos" -#: 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 "se ha denegado el permiso para reasignar objetos" -#: 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 "debe tener opción de admin en rol «%s»" +msgstr "debe tener ADMIN OPTION en rol «%s»" -#: commands/user.c:1509 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "el rol «%s» no puede tener miembros explícitos" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "debe ser superusuario para especificar el cedente (grantor)" -#: commands/user.c:1560 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "el rol «%s» no puede ser miembro de ningún rol" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "el rol «%s» es un miembro del rol «%s»" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "el rol «%s» ya es un miembro del rol «%s»" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "el rol «%s» no es un miembro del rol «%s»" -#: commands/vacuum.c:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "opción de ANALYZE «%s» no reconocida" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, 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:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "el número de procesos paralelos para vacuum debe estar entre 0 y %d" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "opción de VACUUM «%s» no reconocida" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL no puede ser ejecutado en paralelo" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, 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:329 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s no puede ejecutarse desde VACUUM o ANALYZE" -#: commands/vacuum.c:339 +#: commands/vacuum.c:346 #, 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:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "se requiere especificar PROCESS_TOAST al hacer VACUUM FULL" @@ -11713,12 +12529,12 @@ msgstr "omitiendo analyze de «%s»: el candado no está disponible" msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "omitiendo analyze de «%s» --- la relación ya no existe" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "xmin más antiguo es demasiado antiguo" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11727,32 +12543,67 @@ 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:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "multixact más antiguo es demasiado antiguo" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, 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:1741 +#: commands/vacuum.c:1793 #, 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:1742 +#: commands/vacuum.c:1794 #, 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:1906 +#: commands/vacuum.c:1958 #, 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:11649 utils/misc/guc.c:11711 +#: commands/vacuum.c:2336 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "se recorrió el índice «%s» para eliminar %d versiones de filas" + +#: commands/vacuum.c:2355 +#, 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" + +#: commands/vacuum.c:2359 +#, 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 versiones de filas de índice fueron eliminadas.\n" +"%u páginas de índice fueron recién eliminadas.\n" +"%u páginas de índice están actualmente eliminadas, de las cuales %u son actualmente reusables." + +#: commands/vacuumparallel.c:664 +#, 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)" + +#: commands/vacuumparallel.c:670 +#, 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)" + +#: commands/variable.c:165 utils/misc/guc.c:12099 utils/misc/guc.c:12177 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Palabra clave no reconocida: «%s»." @@ -11812,7 +12663,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL debe ser llamado antes de cualquier cons msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVEL no debe ser llamado en una subtransacción" -#: 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 "no se puede utilizar el modo serializable en un hot standby" @@ -11875,34 +12726,40 @@ msgstr "no se puede cambiar el nombre de la columna «%s» de la vista a «%s»" #: commands/view.c:298 #, c-format msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." -msgstr "Use ALTER VIEW ... RENAME COLUMN ... para cambiar el nombre de una columna de una vista." +msgstr "Use ALTER VIEW ... RENAME COLUMN ... para renombrar una columna de una vista." -#: commands/view.c:304 +#: commands/view.c:309 #, c-format 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:452 +#: commands/view.c:323 +#, 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 "no se puede cambiar el “collation” de la columna «%s» de la vista de %s a %s" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "una vista no puede tener SELECT INTO" -#: commands/view.c:464 +#: commands/view.c:480 #, 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:534 +#: commands/view.c:550 #, 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:542 +#: commands/view.c:558 #, 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:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vista «%s» será una vista temporal" @@ -11938,57 +12795,57 @@ msgstr "el cursor «%s» no está posicionado en una fila" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "el cursor «%s» no es un recorrido simplemente actualizable de la tabla «%s»" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2451 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2453 #, 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)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2463 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2465 #, c-format msgid "no value found for parameter %d" msgstr "no se encontró un valor para parámetro %d" #: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 -#: executor/execExprInterp.c:4028 executor/execExprInterp.c:4045 -#: executor/execExprInterp.c:4144 executor/nodeModifyTable.c:119 -#: executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 -#: executor/nodeModifyTable.c:155 +#: executor/execExprInterp.c:4057 executor/execExprInterp.c:4074 +#: executor/execExprInterp.c:4173 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "el tipo de registro de la tabla no coincide con el tipo de registro de la consulta" -#: executor/execExpr.c:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "La consulta tiene demasiadas columnas." -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "La consulta entrega un valor para una columna eliminada en la posición %d." -#: executor/execExpr.c:650 executor/execExprInterp.c:4046 -#: executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4075 +#: executor/nodeModifyTable.c:209 #, c-format 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:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:826 #, c-format msgid "window function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de ventana deslizante" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "el tipo de destino no es un array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "la columna de ROW() es de tipo %s en lugar de ser de tipo %s" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 +#: executor/execExpr.c:2482 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" @@ -11996,310 +12853,328 @@ msgid_plural "cannot pass more than %d arguments to a function" 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:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, 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" + +#: executor/execExpr.c:2915 parser/parse_node.c:276 parser/parse_node.c:326 #, 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 soporta subíndices" -#: executor/execExpr.c:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" msgstr "el tipo %s no soporta asignación subindexada" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "El atributo %d de tipo %s ha sido eliminado" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "el atributo %d del tipo %s tiene tipo erróneo" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3057 -#: executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3059 +#: executor/execExprInterp.c:3105 #, c-format 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:1751 -#: utils/cache/typcache.c:1907 utils/cache/typcache.c:2054 -#: utils/fmgr/funcapi.c:492 +#: executor/execExprInterp.c:2005 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:570 #, c-format msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" -#: executor/execExprInterp.c:2541 +#: executor/execExprInterp.c:2543 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF no está soportado para este tipo de tabla" -#: executor/execExprInterp.c:2754 +#: executor/execExprInterp.c:2756 #, c-format msgid "cannot merge incompatible arrays" msgstr "no se puede mezclar arrays incompatibles" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2757 #, c-format 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:263 +#: executor/execExprInterp.c:2778 utils/adt/arrayfuncs.c:263 #: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 -#: utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 +#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5370 +#: utils/adt/arrayfuncs.c:5887 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format 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)" -#: executor/execExprInterp.c:2796 executor/execExprInterp.c:2831 +#: executor/execExprInterp.c:2798 executor/execExprInterp.c:2833 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "los arrays multidimensionales deben tener expresiones de arrays con dimensiones coincidentes" -#: executor/execExprInterp.c:2808 utils/adt/array_expanded.c:274 +#: executor/execExprInterp.c:2810 utils/adt/array_expanded.c:274 #: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 #: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 -#: utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 +#: utils/adt/arrayfuncs.c:5979 utils/adt/arrayfuncs.c:6320 #: 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 "el tamaño del array excede el máximo permitido (%d)" -#: executor/execExprInterp.c:3056 executor/execExprInterp.c:3102 +#: executor/execExprInterp.c:3058 executor/execExprInterp.c:3104 #, c-format msgid "attribute %d has wrong type" msgstr "el atributo %d tiene tipo erróneo" -#: executor/execExprInterp.c:3657 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3686 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "el dominio %s no permite valores null" -#: executor/execExprInterp.c:3672 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3701 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "el valor para el dominio %s viola la restricción «check» «%s»" -#: executor/execExprInterp.c:4029 +#: executor/execExprInterp.c:4058 #, 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] "La fila de la tabla contiene %d atributo, pero la consulta esperaba %d." msgstr[1] "La fila de la tabla contiene %d atributos, pero la consulta esperaba %d." -#: executor/execExprInterp.c:4145 executor/execSRF.c:977 +#: executor/execExprInterp.c:4174 executor/execSRF.c:977 #, c-format 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:567 +#: executor/execIndexing.c:571 #, 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:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "no se pudo crear la restricción de exclusión «%s»" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "La llave %s está en conflicto con la llave %s." -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Existe un conflicto de llave." -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, 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:852 +#: executor/execIndexing.c:862 #, 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:854 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "La llave está en conflicto con una llave existente." -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "no se puede cambiar la secuencia «%s»" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "no se puede cambiar la relación TOAST «%s»" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3094 -#: rewrite/rewriteHandler.c:3925 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3098 +#: rewrite/rewriteHandler.c:3972 #, c-format msgid "cannot insert into view \"%s\"" msgstr "no se puede insertar en la vista «%s»" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3097 -#: rewrite/rewriteHandler.c:3928 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3101 +#: rewrite/rewriteHandler.c:3975 #, 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:3102 -#: rewrite/rewriteHandler.c:3933 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3106 +#: rewrite/rewriteHandler.c:3980 #, c-format msgid "cannot update view \"%s\"" msgstr "no se puede actualizar la vista «%s»" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3105 -#: rewrite/rewriteHandler.c:3936 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3109 +#: rewrite/rewriteHandler.c:3983 #, 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:3110 -#: rewrite/rewriteHandler.c:3941 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3114 +#: rewrite/rewriteHandler.c:3988 #, c-format msgid "cannot delete from view \"%s\"" msgstr "no se puede eliminar de la vista «%s»" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3113 -#: rewrite/rewriteHandler.c:3944 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3117 +#: rewrite/rewriteHandler.c:3991 #, 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." -#: executor/execMain.c:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "no se puede cambiar la vista materializada «%s»" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "no se puede insertar en la tabla foránea «%s»" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "la tabla foránea «%s» no permite inserciones" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "no se puede actualizar la tabla foránea «%s»" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "la tabla foránea «%s» no permite actualizaciones" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "no se puede eliminar desde la tabla foránea «%s»" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "la tabla foránea «%s» no permite eliminaciones" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "no se puede cambiar la relación «%s»" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "no se puede bloquear registros de la secuencia «%s»" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "no se puede bloquear registros en la relación TOAST «%s»" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "no se puede bloquear registros en la vista «%s»" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "no se puede bloquear registros en la vista materializada «%s»" -#: executor/execMain.c:1173 executor/execMain.c:2555 +#: executor/execMain.c:1175 executor/execMain.c:2653 #: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "no se puede bloquear registros en la tabla foránea «%s»" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "no se puede bloquear registros en la tabla «%s»" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "el nuevo registro para la relación «%s» viola la restricción de partición" -#: 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 "La fila que falla contiene %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 "el valor nulo en la columna «%s» de la relación «%s» viola la restricción de no nulo" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "el nuevo registro para la relación «%s» viola la restricción «check» «%s»" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "el nuevo registro para la vista «%s» viola la opción check" -#: executor/execMain.c:2055 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros «%s» para la tabla «%s»" -#: executor/execMain.c:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros para la tabla «%s»" -#: executor/execMain.c:2067 +#: executor/execMain.c:2153 +#, 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 "el registro destino viola la política de seguridad de registros «%s» (expresión USING) para la tabla «%s»" + +#: executor/execMain.c:2158 +#, 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 "el registro destino viola la política de seguridad de registros (expresión USING) para la tabla «%s»" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros «%s» (expresión USING) para la tabla «%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 "el nuevo registro viola la política de seguridad de registros (expresión USING) para la tabla «%s»" -#: executor/execPartition.c:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "no se encontró una partición de «%s» para el registro" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "La llave de particionamiento de la fila que falla contiene %s." @@ -12319,50 +13194,62 @@ msgstr "actualización simultánea, reintentando" msgid "concurrent delete, retrying" msgstr "eliminacón concurrente, reintentando" -#: executor/execReplication.c:276 parser/parse_cte.c:301 +#: executor/execReplication.c:276 parser/parse_cte.c:308 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 #: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 -#: utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 +#: utils/adt/arrayfuncs.c:4208 utils/adt/arrayfuncs.c:6200 #: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "no se pudo identificar un operador de igualdad para el tipo %s" -#: executor/execReplication.c:604 +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +#| msgid "cannot update foreign table \"%s\"" +msgid "cannot update table \"%s\"" +msgstr "no se puede actualizar la tabla «%s»" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "La columna usada en la expresión WHERE de la publicación no es parte de la identidad de replicación." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "La lista de columnas usada por la publicación no incluye la identidad de replicación." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +#| msgid "cannot delete from foreign table \"%s\"" +msgid "cannot delete from table \"%s\"" +msgstr "no se puede eliminar desde la tabla «%s»" + +#: executor/execReplication.c:644 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "no se puede actualizar la tabla «%s» porque no tiene identidad de replicación y publica updates" -#: executor/execReplication.c:606 +#: executor/execReplication.c:646 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Para habilitar la actualización de la tabla, configure REPLICA IDENTITY utilizando ALTER TABLE." -#: executor/execReplication.c:610 +#: executor/execReplication.c:650 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "no se puede eliminar de la tabla «%s» porque no tiene una identidad de replicación y publica deletes" -#: executor/execReplication.c:612 +#: executor/execReplication.c:652 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "para habilitar la eliminación en la tabla, configure REPLICA IDENTITY utilizando ALTER TABLE." -#: executor/execReplication.c:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "no se puede usar la relación «%s.%s» como destino de replicación lógica" -#: executor/execReplication.c:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "«%s.%s» es una tabla foránea." - -#: executor/execReplication.c:641 -#, c-format -msgid "\"%s.%s\" is not a table." -msgstr "«%s.%s» no es una tabla." - #: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" @@ -12438,7 +13325,7 @@ 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:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s no está permitido en una función no-«volatile»" @@ -12456,7 +13343,7 @@ msgstr "función SQL «%s» durante el inicio" #: executor/functions.c:1568 #, 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" +msgstr "no está permitido invocar procedimientos con argumentos de salida en funciones SQL" #: executor/functions.c:1701 executor/functions.c:1739 #: executor/functions.c:1753 executor/functions.c:1843 @@ -12500,21 +13387,21 @@ msgstr "La sentencia final retorna muy pocas columnas." 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: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:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 #, c-format -msgid "aggregate function calls cannot be nested" -msgstr "no se pueden anidar llamadas a funciones de agregación" +msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +msgstr "fin-de-archivo inesperado para la cinta %p: se pidieron %zu bytes, se leyeron %zu bytes" -#: executor/nodeAgg.c:4187 executor/nodeWindowAgg.c:2845 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, 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" +#: executor/nodeAgg.c:3952 parser/parse_agg.c:668 parser/parse_agg.c:696 +#, c-format +msgid "aggregate function calls cannot be nested" +msgstr "no se pueden anidar llamadas a funciones de agregación" + #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12555,42 +13442,76 @@ msgstr "RIGHT JOIN sólo está soportado con condiciones que se pueden usar con msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN sólo está soportado con condiciones que se pueden usar con merge join" -#: executor/nodeModifyTable.c:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "La consulta tiene muy pocas columnas." -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1509 executor/nodeModifyTable.c:1583 #, 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:1583 +#: executor/nodeModifyTable.c:1737 #, c-format msgid "invalid ON UPDATE specification" msgstr "especificación ON UPDATE no válida" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1738 #, 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:2183 +#: executor/nodeModifyTable.c:2198 +#, 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 "no se puede mover una tupla entre particiones cuando un ancestro no-raíz de la partición de origen es referenciada directamente en una llave foránea" + +#: executor/nodeModifyTable.c:2199 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "Una llave foránea apunta al ancestro «%s» pero no al ancestro raíz «%s»." + +#: executor/nodeModifyTable.c:2202 +#, c-format +#| msgid "cannot insert into foreign table \"%s\"" +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Considere definir la llave foránea en la tabla «%s»." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2548 executor/nodeModifyTable.c:2935 #, 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" +msgid "%s command cannot affect row a second time" +msgstr "la orden %s no puede afectar una fila por segunda vez" -#: executor/nodeModifyTable.c:2184 +#: executor/nodeModifyTable.c:2550 #, 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." -#: executor/nodeSamplescan.c:259 +#: executor/nodeModifyTable.c:2937 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Asegúrese que no más de un registro de origen coincide con cada registro de destino." + +#: executor/nodeModifyTable.c:3018 +#, c-format +#| msgid "tuple to be locked was already moved to another partition due to concurrent update" +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "el registro a ser eliminado ya fue movido a otra partición por un update concurrente" + +#: executor/nodeModifyTable.c:3057 +#, 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 "el registro a ser actualizado o eliminado ya fue modificado por una operación disparada por la orden actual" + +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "el parámetro TABLESAMPLE no puede ser null" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "el parámetro TABLESAMPLE REPEATABLE no puede ser null" @@ -12631,104 +13552,104 @@ msgstr "null no está permitido en la columna «%s»" msgid "moving-aggregate transition function must not return null" msgstr "la función de transición de moving-aggregate no debe retornar valor nulo" -#: executor/nodeWindowAgg.c:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "la posición inicial del marco no debe ser null" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "la posición inicial del marco no debe ser negativa" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "la posición final del marco no debe ser null" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "la posición final del marco no debe ser negativa" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, c-format 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:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "terminación de transacción no válida" -#: executor/spi.c:256 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "no se puede comprometer mientras hay una subtransacción activa" -#: executor/spi.c:347 +#: executor/spi.c:348 #, 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:482 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "transacción dejó un stack SPI no vacío" -#: executor/spi.c:483 executor/spi.c:543 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Revise llamadas a «SPI_finish» faltantes." -#: executor/spi.c:542 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "subtransacción dejó un stack SPI no vacío" -#: executor/spi.c:1610 +#: executor/spi.c:1600 #, 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:1620 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "no se puede abrir consulta %s como cursor" -#: executor/spi.c:1726 +#: executor/spi.c:1716 #, 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:1727 parser/analyze.c:2815 +#: executor/spi.c:1717 parser/analyze.c:2861 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Los cursores declarados SCROLL deben ser READ ONLY." -#: executor/spi.c:2482 +#: executor/spi.c:2474 #, 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:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "la consulta «%s» no retorna tuplas" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "expresión SQL «%s»" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "asignación PL/pgSQL «%s»" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "sentencia SQL: «%s»" @@ -12738,747 +13659,754 @@ msgstr "sentencia SQL: «%s»" msgid "could not send tuple to shared-memory queue" msgstr "no se pudo enviar la tupla a la cola en memoria compartida" -#: foreign/foreign.c:220 +#: foreign/foreign.c:221 #, c-format msgid "user mapping not found for \"%s\"" msgstr "no se encontró un mapeo para el usuario «%s»" -#: foreign/foreign.c:672 +#: foreign/foreign.c:638 #, c-format msgid "invalid option \"%s\"" msgstr "el nombre de opción «%s» no es válido" -#: foreign/foreign.c:673 +#: foreign/foreign.c:640 #, c-format msgid "Valid options in this context are: %s" -msgstr "Las opciones válidas en este contexto son: %s" +msgstr "Las opciones aceptables en este contexto son: %s" + +#: foreign/foreign.c:642 +#, c-format +#| msgid "Valid options in this context are: %s" +msgid "There are no valid options in this context." +msgstr "No hay operaciones aceptables en este contexto." -#: 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 "no se pudo acceder al archivo «%s»: %m" -#: lib/dshash.c:246 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 +#: lib/dshash.c:254 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 "Falla en petición DSA de tamaño %zu." -#: libpq/auth-scram.c:249 +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "se esperaba una respuesta SASL, se obtuvo mensaje de tipo %d" + +#: libpq/auth-scram.c:258 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "cliente eligió un mecanismo de autentificación SASL no válido" -#: 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 "el secreto SCRAM para el usuario «%s» no es válido" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "El usuario «%s» no tiene un secreto SCRAM válido." -#: 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 "mensaje SCRAM mal formado" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "El mensaje está vacío." -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "El largo del mensaje no coincide con el largo de entrada." -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "respuesta SCRAM no válida" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "El «nonce» no coincide." -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "no se pudo generar una sal aleatoria" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Se esperaba un atributo «%c» pero se encontró «%s»." -#: 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 "Se esperaba el carácter «=» para el atributo «%c»." -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "Se esperaba un atributo, se encontró el fin de la cadena." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Se esperaba un atributo, se encontró el carácter no válido «%s»." -#: 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 "El cliente seleccionó SCRAM-SHA-256-PLUS, pero el mensaje SCRAM no incluye los datos de enlazado (binding) del canal." -#: 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 "Se esperaba una coma, se encontró el carácter «%s»." -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "error de negociación de enlazado (binding) de canal SCRAM" -#: 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 "El cliente soporta enlazado (binding) de canal SCRAM, pero piensa que el servidor no. Sin embargo, este servidor sí soporta enlazado de canal." -#: 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 "El cliente seleccionó SCRAM-SHA-256 sin enlazado de canal, pero el mensaje SCRAM incluye datos de enlazado de canal." -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "tipo de enlazado de canal SCRAM «%s» no soportado" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Indicador de enlazado de canal «%s» inesperado." -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "el cliente usa identidad de autorización, pero no está soportada" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Atributo inesperado \"%s\" en client-first-message." -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "el cliente requiere una extensión SCRAM no soportada" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "caracteres no imprimibles en el «nonce» SCRAM" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "no se pudo generar un «nonce» aleatorio" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "no se pudo codificar un «nonce» aleatorio" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "la verificación de enlazado (binding) de canal SCRAM falló" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "atributo de enlazado de canal SCRAM inesperado en client-final-message" -#: libpq/auth-scram.c:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "Prueba (proof) mal formada en 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 "Basura encontrada al final de client-final-message." -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "la autentificación falló para el usuario «%s»: anfitrión rechazado" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "la autentificación «trust» falló para el usuario «%s»" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "la autentificación Ident falló para el usuario «%s»" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "la autentificación Peer falló para el usuario «%s»" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "la autentificación password falló para el usuario «%s»" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "la autentificación GSSAPI falló para el usuario «%s»" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "la autentificación SSPI falló para el usuario «%s»" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "la autentificación PAM falló para el usuario «%s»" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "la autentificación BSD falló para el usuario «%s»" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "la autentificación LDAP falló para el usuario «%s»" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "la autentificación por certificado falló para el usuario «%s»" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "la autentificación RADIUS falló para el usuario «%s»" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "la autentificación falló para el usuario «%s»: método de autentificación no válido" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format 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 +#: libpq/auth.c:362 #, c-format msgid "authentication identifier set more than once" msgstr "identificador de autentificación establecido más de una vez" -#: libpq/auth.c:372 +#: libpq/auth.c:363 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "identificador anterior: «%s»; nuevo identificador: «%s»" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "conexión autenticada: identidad=«%s» método=%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 "los certificados de cliente sólo pueden verificarse si un almacén de certificado raíz está disponible" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format 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 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "cifrado GSS" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "cifrado SSL" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "sin cifrado" #. 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 rechaza la conexión de replicación para el servidor «%s», usuario «%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 rechaza la conexión para el servidor «%s», usuario «%s», base de datos «%s», %s" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado es coincidente." -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado no fue verificado." -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado no es coincidente." -#: libpq/auth.c:527 +#: libpq/auth.c:518 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "No se pudo traducir el nombre de host del cliente «%s» a una dirección IP: %s." -#: libpq/auth.c:532 +#: libpq/auth.c:523 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "No se pudo obtener la dirección IP del cliente a un nombre de host: %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 "no hay una línea en pg_hba.conf para la conexión de replicación desde el servidor «%s», usuario «%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 "no hay una línea en pg_hba.conf para «%s», usuario «%s», base de datos «%s», %s" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "se esperaba una respuesta de contraseña, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "el tamaño del paquete de contraseña no es válido" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "el cliente retornó una contraseña vacía" -#: 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 "la autentificación MD5 no está soportada cuando «db_user_namespace» está activo" -#: libpq/auth.c:893 +#: libpq/auth.c:886 #, c-format msgid "could not generate random MD5 salt" msgstr "no se pudo generar una sal MD5 aleatoria" -#: libpq/auth.c:959 -#, c-format -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 +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 #, c-format msgid "could not set environment: %m" msgstr "no se pudo establecer el ambiente: %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:971 #, c-format msgid "expected GSS response, got message type %d" msgstr "se esperaba una respuesta GSS, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:1184 +#: libpq/auth.c:1031 msgid "accepting GSS security context failed" msgstr "falló la aceptación del contexto de seguridad GSS" -#: libpq/auth.c:1225 +#: libpq/auth.c:1072 msgid "retrieving GSS user name failed" msgstr "falló la obtención del nombre de usuario GSS" -#: libpq/auth.c:1374 +#: libpq/auth.c:1221 msgid "could not acquire SSPI credentials" msgstr "no se pudo obtener las credenciales SSPI" -#: libpq/auth.c:1399 +#: libpq/auth.c:1246 #, 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:1477 +#: libpq/auth.c:1324 msgid "could not accept SSPI security context" msgstr "no se pudo aceptar un contexto SSPI" -#: libpq/auth.c:1539 +#: libpq/auth.c:1386 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:1678 libpq/auth.c:1697 +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format msgid "could not translate name" msgstr "no se pudo traducir el nombre" -#: libpq/auth.c:1710 +#: libpq/auth.c:1557 #, c-format msgid "realm name too long" msgstr "nombre de «realm» demasiado largo" -#: libpq/auth.c:1725 +#: libpq/auth.c:1572 #, c-format msgid "translated account name too long" msgstr "nombre de cuenta traducido demasiado largo" -#: libpq/auth.c:1906 +#: libpq/auth.c:1753 #, 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:1921 +#: libpq/auth.c:1768 #, 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:1933 +#: libpq/auth.c:1780 #, 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:1955 +#: libpq/auth.c:1802 #, 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:1972 +#: libpq/auth.c:1819 #, 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:1982 +#: libpq/auth.c:1829 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "respuesta del servidor Ident en formato no válido: «%s»" -#: libpq/auth.c:2035 +#: libpq/auth.c:1882 #, 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:2039 +#: libpq/auth.c:1886 #, c-format msgid "could not get peer credentials: %m" msgstr "no se pudo recibir credenciales: %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1898 #, 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:2152 +#: libpq/auth.c:1999 #, c-format msgid "error from underlying PAM layer: %s" msgstr "se ha recibido un error de la biblioteca PAM: %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2010 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "conversación PAM no soportada: %d/«%s»" -#: libpq/auth.c:2223 +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "no se pudo crear autenticador PAM: %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2081 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) falló: %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2113 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) falló: %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2125 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) falló: %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2138 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate falló: %s" -#: libpq/auth.c:2304 +#: libpq/auth.c:2151 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt falló: %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2162 #, c-format msgid "could not release PAM authenticator: %s" msgstr "no se pudo liberar autenticador PAM: %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2242 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "no se pudo inicializar LDAP: código de error %d" -#: libpq/auth.c:2432 +#: libpq/auth.c:2279 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "no se pudo extraer el nombre de dominio de ldapbasedn" -#: libpq/auth.c:2440 +#: libpq/auth.c:2287 #, 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:2442 +#: libpq/auth.c:2289 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Defina un nombre de servidor LDAP explícitamente." -#: libpq/auth.c:2494 +#: libpq/auth.c:2341 #, c-format msgid "could not initialize LDAP: %s" msgstr "no se pudo inicializar LDAP: %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2351 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps no está soportado con esta biblioteca LDAP" -#: libpq/auth.c:2512 +#: libpq/auth.c:2359 #, c-format msgid "could not initialize LDAP: %m" msgstr "no se pudo inicializar LDAP: %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2369 #, 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:2562 +#: libpq/auth.c:2409 #, 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:2563 +#: libpq/auth.c:2410 #, 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:2579 +#: libpq/auth.c:2426 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "no se pudo iniciar sesión de LDAP TLS: %s" -#: libpq/auth.c:2650 +#: libpq/auth.c:2497 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "servidor LDAP no especificado, y no hay ldapbasedn" -#: libpq/auth.c:2657 +#: libpq/auth.c:2504 #, c-format msgid "LDAP server not specified" msgstr "servidor LDAP no especificado" -#: libpq/auth.c:2719 +#: libpq/auth.c:2566 #, 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:2736 +#: libpq/auth.c:2583 #, 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:2765 +#: libpq/auth.c:2612 #, 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:2779 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "no existe el usuario LDAP «%s»" -#: libpq/auth.c:2780 +#: libpq/auth.c:2627 #, 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:2784 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "el usuario LDAP «%s» no es única" -#: libpq/auth.c:2785 +#: 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] "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:2805 +#: libpq/auth.c:2652 #, 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:2826 +#: libpq/auth.c:2673 #, 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:2857 +#: libpq/auth.c:2704 #, 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:2889 +#: libpq/auth.c:2736 #, c-format msgid "LDAP diagnostics: %s" msgstr "Diagnóstico LDAP: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2774 #, 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:2948 +#: libpq/auth.c:2795 #, 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»: no se pudo obtener el DN del sujeto" -#: libpq/auth.c:2971 +#: libpq/auth.c:2818 #, 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 DN" -#: libpq/auth.c:2976 +#: libpq/auth.c:2823 #, 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:3078 +#: libpq/auth.c:2925 #, c-format msgid "RADIUS server not specified" msgstr "servidor RADIUS no especificado" -#: libpq/auth.c:3085 +#: libpq/auth.c:2932 #, c-format msgid "RADIUS secret not specified" msgstr "secreto RADIUS no especificado" -#: libpq/auth.c:3099 +#: libpq/auth.c:2946 #, 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:3206 libpq/hba.c:2008 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, 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:3220 +#: libpq/auth.c:3067 #, c-format msgid "could not generate random encryption vector" msgstr "no se pudo generar un vector aleatorio de encriptación" -#: libpq/auth.c:3254 +#: libpq/auth.c:3104 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "no se pudo efectuar cifrado MD5 de la contraseña" +#| msgid "could not perform MD5 encryption of password" +msgid "could not perform MD5 encryption of password: %s" +msgstr "no se pudo efectuar cifrado MD5 de la contraseña: %s" -#: libpq/auth.c:3280 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "no se pudo crear el socket RADIUS: %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3153 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "no se pudo enlazar el socket RADIUS local: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3163 #, c-format msgid "could not send RADIUS packet: %m" msgstr "no se pudo enviar el paquete RADIUS: %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, 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:3364 +#: libpq/auth.c:3216 #, 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:3394 +#: libpq/auth.c:3246 #, c-format msgid "could not read RADIUS response: %m" msgstr "no se pudo leer la respuesta RADIUS: %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, 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:3420 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "la respuesta RADIUS desde %s es demasiado corta: %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3279 #, 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:3435 +#: libpq/auth.c:3287 #, 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:3460 +#: libpq/auth.c:3312 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "no se pudo realizar cifrado MD5 del paquete recibido" +#| msgid "could not perform MD5 encryption of received packet" +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "no se pudo realizar cifrado MD5 del paquete recibido: %s" -#: libpq/auth.c:3469 +#: libpq/auth.c:3322 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "la respuesta RADIUS desde %s tiene firma MD5 incorrecta" -#: libpq/auth.c:3487 +#: libpq/auth.c:3340 #, 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»" @@ -13535,8 +14463,8 @@ msgstr "no se pudo escribir el archivo del servidor «%s»: %m" 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:800 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 "el tamaño solicitado no puede ser negativo" @@ -13624,203 +14552,203 @@ msgstr "no se pudo aceptar un contexto de seguridad GSSAPI" msgid "GSSAPI size check error" msgstr "error de verificación de tamaño GSSAPI" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "no se pudo crear un contexto SSL: %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 "no se pudo cargar el archivo de certificado de servidor «%s»: %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 "el archivo de clave privada \"%s\" no se puede volver a cargar porque requiere una contraseña" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "no se pudo cargar el archivo de la llave privada «%s»: %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "check of private key failed: %s" msgstr "falló la revisión de la llave privada: %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 "el valor «%2$s» para la opción «%1$s» no está soportado en este servidor" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "no se pudo definir la versión mínima de protocolo SSL" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "no se pudo definir la versión máxima de protocolo SSL" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "no se pudo definir el rango de versión de protocolo SSL" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "«%s» no puede ser más alto que «%s»" -#: 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 "no se pudo establecer la lista de cifrado (no hay cifradores disponibles)" -#: libpq/be-secure-openssl.c:295 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "no se pudo cargar el archivo del certificado raíz «%s»: %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 "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s»: %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 "no se pudo cargar el directorio de lista de revocación de certificados SSL «%s»: %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 "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 +#: libpq/be-secure-openssl.c:425 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "no se pudo inicializar la conexión SSL: el contexto SSL no está instalado" -#: libpq/be-secure-openssl.c:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "no se pudo inicializar la conexión SSL: %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "no se definir un socket SSL: %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:499 #, c-format msgid "could not accept SSL connection: %m" msgstr "no se pudo aceptar una conexión SSL: %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 "no se pudo aceptar una conexión SSL: se detectó EOF" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:542 #, c-format msgid "could not accept SSL connection: %s" msgstr "no se pudo aceptar una conexión SSL: %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 "Esto puede indicar que el cliente no soporta ninguna versión del protocolo SSL entre %s and %s." +msgstr "Esto puede indicar que el cliente no soporta ninguna versión del protocolo SSL entre %s y %s." -#: 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 "código de error SSL no reconocido: %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 "el «common name» del certificado SSL contiene un carácter null" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:647 #, c-format msgid "SSL certificate's distinguished name contains embedded null" 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 +#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 #, c-format msgid "SSL error: %s" msgstr "error de SSL: %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:971 #, 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:976 +#: libpq/be-secure-openssl.c:983 #, 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:986 +#: libpq/be-secure-openssl.c:993 #, c-format msgid "invalid DH parameters: %s" msgstr "parámetros DH no válidos: %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1002 #, 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:1004 +#: libpq/be-secure-openssl.c:1011 #, 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:1165 +#: libpq/be-secure-openssl.c:1172 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: no se pudo cargar los parámetros DH" -#: libpq/be-secure-openssl.c:1173 +#: libpq/be-secure-openssl.c:1180 #, 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:1200 +#: libpq/be-secure-openssl.c:1207 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: nombre de curva no reconocida: %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1216 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: no se pudo crear la llave" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1244 msgid "no SSL error reported" msgstr "código de error SSL no reportado" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1248 #, c-format msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1407 #, c-format msgid "could not create BIO" msgstr "no se pudo crear BIO" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1417 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "no se pudo obtener NID para objeto ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1418 +#: libpq/be-secure-openssl.c:1425 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "no se pudo convertir NID %d en una estructura ASN1_OBJECT" @@ -13845,402 +14773,392 @@ msgstr "El usuario «%s» no tiene una contraseña asignada." msgid "User \"%s\" has an expired password." msgstr "El usuario «%s» tiene contraseña expirada." -#: libpq/crypt.c:179 +#: libpq/crypt.c:181 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "El usuario \"%s\" tiene una contraseña que no se puede usar con la autentificación 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 "La contraseña no coincide para el usuario «%s»." -#: libpq/crypt.c:287 +#: libpq/crypt.c:283 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "La contraseña del usuario \"%s\" está en un formato no reconocido." -#: libpq/hba.c:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "una palabra en el archivo de autentificación es demasiado larga, omitiendo: «%s»" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format 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 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" msgstr "error al enumerar interfaces de red: %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 "la opción de autentificación «%s» sólo es válida para los métodos de autentificación %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: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 +#: 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:228 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "línea %d del archivo de configuración «%s»" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "el método de autentificación «%s» requiere que el argumento «%s» esté definido" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "falta una entrada en el archivo «%s» al final de la línea %d" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "múltiples valores en campo «ident»" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "múltiples valores especificados para tipo de conexión" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Especifique exactamente un tipo de conexión por línea." -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "las conexiones locales no están soportadas en este servidor" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "el registro hostssl no puede coincidir porque SSL está deshabilitado" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Defina «ssl = on» en 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 "el registro hostssl no puede coincidir porque SSL no está soportado en esta instalación" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "Compile con --with-ssl para usar conexiones SSL." - -#: libpq/hba.c:1054 +#: libpq/hba.c:1024 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "el registro hostgssenc no puede coincidir porque GSSAPI no está soportado en esta instalación" -#: libpq/hba.c:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Compile con --with-gssapi para usar conexiones GSSAPI." - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "tipo de conexión «%s» no válido" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "fin de línea antes de especificación de base de datos" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "fin de línea antes de especificación de rol" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "fin de línea antes de especificación de dirección IP" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "múltiples valores especificados para la dirección de anfitrión" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Especifique un rango de direcciones por línea." -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "dirección IP «%s» no válida: %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "especificar tanto el nombre de host como la máscara CIDR no es válido: «%s»" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "máscara CIDR no válida en dirección «%s»" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "fin de línea antes de especificación de máscara de red" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Especifique un rango de direcciones en notación CIDR, o provea una netmask separadamente." -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "múltiples valores especificados para la máscara de red" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "máscara IP «%s» no válida: %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "La dirección y máscara IP no coinciden" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "fin de línea antes de especificación de método de autentificación" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "múltiples valores especificados para el tipo de autentificación" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Especifique exactamente un tipo de autentificación por línea." -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "método de autentificación «%s» no válido" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "método de autentificación «%s» no válido: este servidor no lo soporta" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "la autentificación gssapi no está soportada en conexiones locales" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "la autentificación peer sólo está soportada en conexiones locales" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "la autentificación cert sólo está soportada en conexiones hostssl" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "opción de autentificación en formato nombre=valor: %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 "no se puede usar ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter o ldapurl junto con ldapprefix" -#: libpq/hba.c:1577 +#: libpq/hba.c:1546 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "el método de autentificación «ldap» requiere que los argumento «ldapbasedn», «ldapprefix» o «ldapsuffix» estén definidos" -#: libpq/hba.c:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "no se puede usar ldapsearchattribute junto con ldapsearchfilter" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "la lista de servidores RADIUS no puede ser vacía" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "la lista de secretos RADIUS no puede ser vacía" -#: 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 "el número de secretos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: 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 "el número de puertos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: 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 "el número de identificadores RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: libpq/hba.c:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi y cert" -#: libpq/hba.c:1730 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert sólo puede ser configurado en líneas «hostssl»" -#: libpq/hba.c:1747 +#: libpq/hba.c:1716 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert solo acepta «verify-full» cuando se emplea autentificación «cert»" -#: libpq/hba.c:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "valor no válido para el parámetro clientcert: «%s»" -#: libpq/hba.c:1772 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname solo puede ser configurado en líneas «hostssl»" -#: libpq/hba.c:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "valor no válido para el parámetro clientname: «%s»" -#: libpq/hba.c:1825 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "no se pudo interpretar la URL LDAP «%s»: %s" -#: libpq/hba.c:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "esquema de URL LDAP no soportado: %s" -#: libpq/hba.c:1860 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "las URLs LDAP no está soportado en esta plataforma" -#: libpq/hba.c:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "valor ldapscheme no válido: «%s»" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "número de puerto LDAP no válido: «%s»" -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi y sspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "no se pudo interpretar la lista de servidores RADIUS «%s»" -#: libpq/hba.c:2037 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "no se pudo interpretar la lista de port RADIUS «%s»" -#: libpq/hba.c:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "número de puerto RADIUS no válido: «%s»" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "no se pudo interpretar la lista de secretos RADIUS «%s»" -#: libpq/hba.c:2095 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" -msgstr "no se pudo interpretar la lista de identificadoes RADIUS «%s»" +msgstr "no se pudo interpretar la lista de identificadores RADIUS «%s»" -#: libpq/hba.c:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "nombre de opción de autentificación desconocido: «%s»" -#: libpq/hba.c:2255 libpq/hba.c:2669 guc-file.l:632 +#: libpq/hba.c:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "no se pudo abrir el archivo de configuración «%s»: %m" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "el archivo de configuración «%s» no contiene líneas" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "la expresión regular «%s» no es válida: %s" -#: libpq/hba.c:2884 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "la coincidencia de expresión regular para «%s» falló: %s" -#: libpq/hba.c:2903 +#: libpq/hba.c:2456 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "la expresión regular «%s» no tiene subexpresiones según lo requiere la referencia hacia atrás en «%s»" -#: libpq/hba.c:2999 +#: libpq/hba.c:2552 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "el nombre de usuario entregado (%s) y el nombre de usuario autentificado (%s) no coinciden" -#: libpq/hba.c:3019 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "no hay coincidencia en el mapa «%s» para el usuario «%s» autentificado como «%s»" -#: libpq/hba.c:3052 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "no se pudo abrir el archivo de mapa de usuarios «%s»: %m" @@ -14308,12 +15226,12 @@ msgstr "no se pudo enlazar a la dirección %s «%s»: %m" #: libpq/pqcomm.c:534 #, c-format msgid "Is another postmaster already running on port %d?" -msgstr "¿Hay otro postmaster corriendo en el puerto %d?" +msgstr "¿Hay otro postmaster en ejecución en el puerto %d?" #: libpq/pqcomm.c:536 #, 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." +msgstr "¿Hay otro postmaster en ejecución en el puerto %d? Si no, aguarde unos segundos y reintente." #. translator: first %s is IPv4, IPv6, or Unix #: libpq/pqcomm.c:569 @@ -14355,8 +15273,7 @@ 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: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 +#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 #, c-format msgid "%s(%s) failed: %m" msgstr "%s(%s) falló: %m" @@ -14371,7 +15288,7 @@ msgstr "no hay conexión de cliente" msgid "could not receive data from client: %m" msgstr "no se pudo recibir datos del cliente: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4314 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4371 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "terminando la conexión por pérdida de sincronía del protocolo" @@ -14411,11 +15328,6 @@ msgstr "establecer el tiempo de inactividad para keepalive no está soportado" msgid "%s(%s) not supported" msgstr "%s(%s) no está soportado" -#: libpq/pqcomm.c:1968 -#, c-format -msgid "could not poll socket: %m" -msgstr "no se pudo monitorear socket: %m" - #: libpq/pqformat.c:406 #, c-format msgid "no data left in message" @@ -14430,19 +15342,19 @@ msgstr "los datos restantes del mensaje son insuficientes" #: libpq/pqformat.c:597 libpq/pqformat.c:626 #, c-format msgid "invalid string in message" -msgstr "cadena inválida en el mensaje" +msgstr "cadena no válida en el mensaje" #: libpq/pqformat.c:642 #, c-format msgid "invalid message format" msgstr "formato de mensaje no válido" -#: main/main.c:245 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup falló: %d\n" -#: main/main.c:309 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14451,7 +15363,7 @@ msgstr "" "%s es el servidor PostgreSQL.\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14462,109 +15374,109 @@ msgstr "" " %s [OPCION]...\n" "\n" -#: main/main.c:311 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: main/main.c:312 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS número de búfers de memoria compartida\n" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c VAR=VALOR definir parámetro de ejecución\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 NOMBRE imprimir valor de parámetro de configuración, luego salir\n" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 nivel de depuración\n" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR directorio de bases de datos\n" -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e usar estilo europeo de fechas (DMY)\n" -#: main/main.c:318 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F desactivar 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 NOMBRE nombre de host o dirección IP en que escuchar\n" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i activar conexiones TCP/IP\n" -#: main/main.c:321 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORIO ubicación del socket Unix\n" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l activar conexiones 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-CONN número máximo de conexiones permitidas\n" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PUERTO número de puerto en el cual escuchar\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s mostrar estadísticas después de cada consulta\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 WORK-MEM definir cantidad de memoria para ordenamientos (en kB)\n" -#: main/main.c:329 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de la versión, luego salir\n" -#: main/main.c:330 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NOMBRE=VALOR definir parámetro de ejecución\n" -#: main/main.c:331 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr "" " --describe-config\n" " mostrar parámetros de configuración y salir\n" -#: main/main.c:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help muestra esta ayuda, luego sale\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14573,44 +15485,44 @@ msgstr "" "\n" "Opciones de desarrollador:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h impedir el uso de algunos tipos de planes\n" -#: main/main.c:336 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr " -n no reinicializar memoria compartida después de salida anormal\n" -#: main/main.c:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O permitir cambios en estructura de tablas de sistema\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P desactivar índices de sistema\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 mostrar tiempos después de cada consulta\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 enviar SIGSTOP a todos los procesos backend si uno de ellos\n" " muere\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 NÚM espera NÚM segundos para permitir acoplar un depurador\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -14619,37 +15531,37 @@ msgstr "" "\n" "Opciones para modo mono-usuario:\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single selecciona modo mono-usuario (debe ser el primer argumento)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME nombre de base de datos (el valor por omisión es el nombre de usuario)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 nivel de depuración\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E mostrar las consultas antes de su ejecución\n" -#: main/main.c:348 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j no usar saltos de línea como delimitadores de consulta\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 ARCHIVO enviar salida estándar y de error a ARCHIVO\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -14658,22 +15570,23 @@ msgstr "" "\n" "Opciones para modo de inicio (bootstrapping):\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot selecciona modo de inicio (debe ser el primer argumento)\n" -#: main/main.c:353 +#: main/main.c:394 #, c-format -msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" -msgstr " DBNAME nombre de base de datos (argumento obligatorio en modo de inicio)\n" +#| msgid " --single selects single-user mode (must be first argument)\n" +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check selecciona modo de verificación (debe ser el primer argumento)\n" -#: main/main.c:355 +#: main/main.c:395 #, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM uso interno\n" +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " DBNAME nombre de base de datos (argumento obligatorio en modo de inicio)\n" -#: main/main.c:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -14690,12 +15603,12 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -14709,12 +15622,12 @@ msgstr "" "Vea la documentación para obtener más información acerca de cómo\n" "iniciar correctamente el servidor.\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: los IDs de usuario real y efectivo deben coincidir\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -14739,15 +15652,15 @@ 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 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relación «%s» no tiene un tipo compuesto" #: 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:592 +#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, c-format 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" @@ -14767,6 +15680,13 @@ msgstr "portal sin nombre con parámetros: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN sólo está soportado con condiciones que se pueden usar con merge join o hash join" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +#| msgid "cannot open relation \"%s\"" +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "no se puede ejecutar MERGE en la relación «%s»" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -14774,53 +15694,48 @@ 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:1314 parser/analyze.c:1671 parser/analyze.c:1927 -#: parser/analyze.c:3106 +#: optimizer/plan/planner.c:1342 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 no está permitido con UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1977 optimizer/plan/planner.c:3633 +#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3705 #, c-format msgid "could not implement GROUP BY" msgstr "no se pudo implementar GROUP BY" -#: optimizer/plan/planner.c:1978 optimizer/plan/planner.c:3634 -#: optimizer/plan/planner.c:4391 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2050 optimizer/plan/planner.c:3706 +#: optimizer/plan/planner.c:4349 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:4390 +#: optimizer/plan/planner.c:4348 #, c-format msgid "could not implement DISTINCT" msgstr "no se pudo implementar DISTINCT" -#: optimizer/plan/planner.c:5238 +#: optimizer/plan/planner.c:5469 #, c-format msgid "could not implement window PARTITION BY" msgstr "No se pudo implementar PARTITION BY de ventana" -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5470 #, 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:5243 +#: optimizer/plan/planner.c:5474 #, c-format msgid "could not implement window ORDER BY" msgstr "no se pudo implementar ORDER BY de ventana" -#: optimizer/plan/planner.c:5244 +#: optimizer/plan/planner.c:5475 #, 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:516 -#, c-format -msgid "too many range table entries" -msgstr "demasiadas «range table entries»" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -14837,253 +15752,252 @@ 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:4729 +#: optimizer/util/clauses.c:4777 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "función SQL «%s», durante expansión en línea" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format -#| msgid "cannot change relation \"%s\"" msgid "cannot open relation \"%s\"" msgstr "no se puede abrir la relación «%s»" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "no se puede acceder a tablas temporales o «unlogged» durante la recuperación" -#: optimizer/util/plancat.c:688 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "no están soportadas las especificaciones de inferencia de índice único de registro completo" -#: optimizer/util/plancat.c:705 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "la restricción en la cláusula ON CONFLICT no tiene un índice asociado" -#: optimizer/util/plancat.c:755 +#: optimizer/util/plancat.c:758 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE no está soportado con restricciones de exclusión" -#: optimizer/util/plancat.c:860 +#: optimizer/util/plancat.c:863 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "no hay restricción única o de exclusión que coincida con la especificación ON CONFLICT" -#: parser/analyze.c:737 parser/analyze.c:1451 +#: parser/analyze.c:780 parser/analyze.c:1494 #, c-format msgid "VALUES lists must all be the same length" msgstr "las listas VALUES deben ser todas de la misma longitud" -#: parser/analyze.c:938 +#: parser/analyze.c:981 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT tiene más expresiones que columnas de destino" -#: parser/analyze.c:956 +#: parser/analyze.c:999 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT tiene más columnas de destino que expresiones" -#: parser/analyze.c:960 +#: 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 "La fuente de inserción es una expresión de fila que contiene la misma cantidad de columnas que esperaba el INSERT. ¿Usó accidentalmente paréntesis extra?" -#: parser/analyze.c:1259 parser/analyze.c:1644 +#: parser/analyze.c:1302 parser/analyze.c:1687 #, c-format 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:1574 parser/analyze.c:3317 +#: parser/analyze.c:1617 parser/analyze.c:3363 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s no puede ser aplicado a VALUES" -#: parser/analyze.c:1810 +#: parser/analyze.c:1853 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "cláusula UNION/INTERSECT/EXCEPT ORDER BY no válida" -#: parser/analyze.c:1811 +#: parser/analyze.c:1854 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Sólo nombres de columna del resultado pueden usarse, no expresiones o funciones." -#: parser/analyze.c:1812 +#: parser/analyze.c:1855 #, c-format 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:1917 +#: parser/analyze.c:1960 #, 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:1989 +#: parser/analyze.c:2032 #, 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:2076 +#: parser/analyze.c:2119 #, 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:2477 +#: parser/analyze.c:2523 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING debe tener al menos una columna" -#: parser/analyze.c:2580 +#: parser/analyze.c:2626 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "fuente de asignación retornó %d columna" msgstr[1] "fuente de asignación retornó %d columnas" -#: parser/analyze.c:2641 +#: parser/analyze.c:2687 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %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:2765 parser/analyze.c:2773 +#: parser/analyze.c:2811 parser/analyze.c:2819 #, c-format msgid "cannot specify both %s and %s" msgstr "no se puede especificar %s junto con %s" -#: parser/analyze.c:2793 +#: parser/analyze.c:2839 #, 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:2801 +#: parser/analyze.c:2847 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s no está soportado" -#: parser/analyze.c:2804 +#: parser/analyze.c:2850 #, 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:2812 +#: parser/analyze.c:2858 #, 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:2823 +#: parser/analyze.c:2869 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s no es válido" -#: parser/analyze.c:2826 +#: parser/analyze.c:2872 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Los cursores insensitivos deben ser READ ONLY." -#: parser/analyze.c:2892 +#: parser/analyze.c:2938 #, 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:2902 +#: parser/analyze.c:2948 #, 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:2912 +#: parser/analyze.c:2958 #, 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:2924 +#: parser/analyze.c:2970 #, 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:3113 +#: parser/analyze.c:3159 #, 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:3120 +#: parser/analyze.c:3166 #, 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:3127 +#: parser/analyze.c:3173 #, 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:3134 +#: parser/analyze.c:3180 #, 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:3141 +#: parser/analyze.c:3187 #, 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:3148 +#: parser/analyze.c:3194 #, 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:3240 +#: parser/analyze.c:3286 #, 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:3290 +#: parser/analyze.c:3336 #, 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:3299 +#: parser/analyze.c:3345 #, 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:3308 +#: parser/analyze.c:3354 #, 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:3326 +#: parser/analyze.c:3372 #, 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:3335 +#: parser/analyze.c:3381 #, 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:3355 +#: parser/analyze.c:3401 #, 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" @@ -15159,526 +16073,541 @@ msgstr "no se permiten funciones de agregación en GROUPS de ventana deslizante" msgid "grouping operations are not allowed in window GROUPS" msgstr "no se permiten operaciones «grouping» en GROUPS de ventana deslizante" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:439 +#| msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "no se permiten funciones de agregación en condiciones MERGE WHEN" + +#: parser/parse_agg.c:441 +#| msgid "grouping operations are not allowed in trigger WHEN conditions" +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "no se permiten operaciones «grouping» en condiciones MERGE WHEN" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "no se permiten funciones de agregación en restricciones «check»" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "no se permiten operaciones «grouping» en restricciones «check»" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones de agregación en expresiones DEFAULT" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "no se permiten operaciones «grouping» en expresiones DEFAULT" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "no se permiten funciones de agregación en una expresión de índice" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "no se permiten operaciones «grouping» en expresiones de índice" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "no se permiten funciones de agregación en predicados de índice" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "no se permiten operaciones «grouping» en predicados de índice" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in statistics expressions" msgstr "no se permiten funciones de agregación en expresiones de estadísticas" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:499 msgid "grouping operations are not allowed in statistics expressions" msgstr "no se permiten operaciones «grouping» en expresiones de estadísticas" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "no se permiten funciones de agregación en una expresión de transformación" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "no se permiten operaciones «grouping» en expresiones de transformación" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones de agregación en un parámetro a EXECUTE" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "no se permiten operaciones «grouping» en parámetros a EXECUTE" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "no se permiten funciones de agregación en condición WHEN de un disparador" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "no se permiten operaciones «grouping» en condiciones WHEN de un disparador" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition bound" msgstr "no se permiten funciones de agregación en borde de partición" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition bound" msgstr "no se permiten operaciones «grouping» en borde de partición" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" -msgstr "no se permiten funciones de agregación en una expresión de llave de particionaiento" +msgstr "no se permiten funciones de agregación en una expresión de llave de particionamiento" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "no se permiten operaciones «grouping» en expresiones de llave de particionamiento" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:540 msgid "aggregate functions are not allowed in column generation expressions" msgstr "no se permiten funciones de agregación en expresiones de generación de columna" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:542 msgid "grouping operations are not allowed in column generation expressions" msgstr "no se permiten operaciones «grouping» en expresiones de generación de columna" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "no se permiten funciones de agregación en argumentos de CALL" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "no se permiten operaciones «grouping» en argumentos de CALL" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:556 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones de agregación en las condiciones WHERE de COPY FROM" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:558 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten las operaciones «grouping» en condiciones WHERE de COPY FROM" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:585 parser/parse_clause.c:1836 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "no se permiten funciones de agregación en %s" #. 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 "no se permiten operaciones «grouping» en %s" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:689 #, 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:760 +#: parser/parse_agg.c:767 #, 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:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 +#: parser/parse_agg.c:768 parser/parse_expr.c:1674 parser/parse_expr.c:2156 #: 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ón que retorna conjuntos a un elemento LATERAL FROM." -#: parser/parse_agg.c:766 +#: parser/parse_agg.c:773 #, 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:845 +#: parser/parse_agg.c:852 msgid "window functions are not allowed in JOIN conditions" msgstr "no se permiten funciones de ventana deslizante en condiciones JOIN" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:859 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:858 +#: parser/parse_agg.c:865 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:871 +#: parser/parse_agg.c:878 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:903 +#: parser/parse_agg.c:889 +#| msgid "window functions are not allowed in trigger WHEN conditions" +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "no se permiten funciones de ventana deslizante en condiciones MERGE WHEN" + +#: parser/parse_agg.c:913 msgid "window functions are not allowed in check constraints" msgstr "no se permiten funciones de ventana deslizante en restricciones «check»" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:917 msgid "window functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones DEFAULT" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:920 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:913 +#: parser/parse_agg.c:923 msgid "window functions are not allowed in statistics expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de estadísticas" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:926 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:919 +#: parser/parse_agg.c:929 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:922 +#: parser/parse_agg.c:932 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:925 +#: parser/parse_agg.c:935 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:928 +#: parser/parse_agg.c:938 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:931 +#: parser/parse_agg.c:941 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:934 +#: parser/parse_agg.c:944 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:937 +#: parser/parse_agg.c:947 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:940 +#: parser/parse_agg.c:950 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:973 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" msgstr "no se permiten funciones de ventana deslizante en %s" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1007 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "la ventana «%s» no existe" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1091 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "demasiados conjuntos «grouping» presentes (máximo 4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1231 #, 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:1414 +#: parser/parse_agg.c:1424 #, 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:1417 +#: parser/parse_agg.c:1427 #, 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:1422 +#: parser/parse_agg.c:1432 #, 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:1586 +#: parser/parse_agg.c:1596 #, 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" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "relación «%s» no puede ser destino de una sentencia modificadora" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "las funciones que retornan conjuntos deben aparecer en el nivel más externo del FROM" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "no se permiten múltiples definiciones de columnas para la misma función" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:645 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() con varias funciones no puede tener una lista de definición de columnas" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:646 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Ponga una lista de columnas separada para cada función dentro de ROWS FROM()." -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() con varios argumentos no puede tener una lista de definición de columnas" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:653 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Use llamadas a UNNEST() separadas dentro de ROWS FROM() y adjunte una lista de columnas a cada una." -#: parser/parse_clause.c:658 +#: parser/parse_clause.c:660 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY no puede usarse con una lista de definición de columnas" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Ponga una lista de columnas dentro de ROWS FROM()." -#: parser/parse_clause.c:759 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "sólo se permite una columna FOR ORDINALITY" -#: parser/parse_clause.c:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "el nombre de columna «%s» no es único" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "el espacio de nombres «%s» no es único" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "sólo se permite un espacio de nombres predeterminado" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "no existe el método de tablesample «%s»" -#: parser/parse_clause.c:954 +#: 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] "el método de tablesample «%s» requiere %d argumento, no %d" msgstr[1] "el método de tablesample «%s» requiere %d argumentos, no %d" -#: parser/parse_clause.c:988 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "el método de tablesample «%s» no soporta la opción REPEATABLE" -#: parser/parse_clause.c:1137 +#: parser/parse_clause.c:1139 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "la cláusula TABLESAMPLE sólo puede aplicarse a tablas y vistas materializadas" -#: parser/parse_clause.c:1327 +#: parser/parse_clause.c:1329 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "la columna «%s» aparece más de una vez en la cláusula USING" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "la columna común «%s» aparece más de una vez en la tabla izquierda" -#: parser/parse_clause.c:1351 +#: parser/parse_clause.c:1353 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "la columna «%s» especificada en la cláusula USING no existe en la tabla izquierda" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "la columna común «%s» aparece más de una vez en la tabla derecha" -#: parser/parse_clause.c:1375 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "la columna «%s» especificada en la cláusula USING no existe en la tabla derecha" -#: parser/parse_clause.c:1779 +#: parser/parse_clause.c:1781 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" 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:1804 +#: parser/parse_clause.c:1806 #, c-format msgid "argument of %s must not contain variables" msgstr "el argumento de %s no puede contener variables" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1969 +#: parser/parse_clause.c:1971 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s «%s» es ambiguo" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1998 +#: parser/parse_clause.c:1999 #, c-format msgid "non-integer constant in %s" msgstr "constante no entera en %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "la posición %2$d de %1$s no está en la lista de resultados" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE está limitado a 12 elementos" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "la ventana «%s» ya está definida" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "no se puede pasar a llevar la cláusula PARTITION BY de la ventana «%s»" -#: parser/parse_clause.c:2738 +#: parser/parse_clause.c:2739 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "no se puede pasar a llevar la cláusula ORDER BY de la ventana «%s»" -#: parser/parse_clause.c:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "no se puede copiar la ventana «%s» porque tiene una cláusula «frame»" -#: parser/parse_clause.c:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Omita el uso de paréntesis en esta cláusula OVER." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING requiere exactamente una columna ORDER BY" -#: parser/parse_clause.c:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "el modo GROUPS requiere una cláusula ORDER BY" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "en una agregación con DISTINCT, las expresiones en ORDER BY deben aparecer en la lista de argumentos" -#: parser/parse_clause.c:2890 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "para SELECT DISTINCT, las expresiones en ORDER BY deben aparecer en la lista de resultados" -#: parser/parse_clause.c:2922 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "una función de agregación con DISTINCT debe tener al menos un argumento" -#: parser/parse_clause.c:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT debe tener al menos una columna" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "las expresiones de SELECT DISTINCT ON deben coincidir con las expresiones iniciales de ORDER BY" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3101 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC no están permitidos en cláusulas ON CONFLICT" -#: parser/parse_clause.c:3105 +#: parser/parse_clause.c:3107 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST no están permitidos en cláusulas ON CONFLICT" -#: parser/parse_clause.c:3184 +#: parser/parse_clause.c:3186 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE requiere una especificación de inferencia o nombre de restricción" -#: parser/parse_clause.c:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Por ejemplo, ON CONFLICT (nombre_de_columna)." -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT no está soportado con tablas que son catálogos de sistema" -#: parser/parse_clause.c:3204 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT no está soportado en la tabla «%s» usada como catálogo de sistema" -#: parser/parse_clause.c:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "el operador «%s» no es un operador válido de ordenamiento" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Los operadores de ordenamiento deben ser miembros «<» o «>» de una familia de operadores btree." -#: parser/parse_clause.c:3647 +#: parser/parse_clause.c:3649 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING no está soportado para la columna de tipo %s" -#: parser/parse_clause.c:3653 +#: parser/parse_clause.c:3655 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING no está soportado para la columna de tipo %s y tipo de desplazamiento %s" -#: parser/parse_clause.c:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Convierta el valor de desplazamiento a un tipo apropiado." -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING tiene múltiples interpretaciones para la columna de tipo %s y tipo de desplazamiento %s" -#: parser/parse_clause.c:3664 +#: parser/parse_clause.c:3666 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Convierta el valor de desplazamiento al tipo deseado exacto." #: 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:2662 parser/parse_target.c:994 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "no se puede convertir el tipo %s a %s" @@ -15737,19 +16666,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "los argumentos declarados «%s» no son de tipos compatibles" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:523 +#: utils/fmgr/funcapi.c:601 #, 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:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:537 +#: utils/fmgr/funcapi.c:615 #, 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:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "el argumento declarado %s no es un tipo de multirango sino tipo %s" @@ -15783,7 +16712,7 @@ msgstr "el tipo emparejado con anyenum no es un tipo enum: %s" #: parser/parse_coerce.c:2559 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" -msgstr "los argumentos de la familia anycompatible no pueden convertirse a un tipo común" +msgstr "los argumentos de la familia anycompatible no pueden ser convertidos a un tipo común" #: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 #: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 @@ -15832,18 +16761,18 @@ 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." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:1004 +#: parser/parse_collate.c:1005 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "discordancia de ordenamientos (collation) entre los ordenamientos implícitos «%s» y «%s»" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:1007 +#: parser/parse_collate.c:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Puede elegir el ordenamiento aplicando la cláusula COLLATE a una o ambas expresiones." -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "discordancia de ordenamientos (collation) entre los ordenamientos explícitos «%s» y «%s»" @@ -15873,372 +16802,378 @@ msgstr "la referencia recursiva a la consulta «%s» no debe aparecer dentro de msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "la referencia recursiva a la consulta «%s» no debe aparecer dentro de EXCEPT" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, c-format +#| msgid "\"EEEE\" not supported for input" +msgid "MERGE not supported in WITH query" +msgstr "MERGE no está soportado en consultas WITH" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "el nombre de consulta WITH «%s» fue especificado más de una vez" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "no se pudo identificar un operador de desigualdad para el tipo %s" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "la cláusula WITH que contiene las sentencias que modifican datos debe estar en el nivel más externo" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "la columna %2$d en la consulta recursiva «%1$s» tiene tipo %3$s en el término no recursivo, pero %4$s en general" -#: parser/parse_cte.c:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Aplique una conversión de tipo a la salida del término no recursivo al tipo correcto." -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "la columna %2$d en la consulta recursiva «%1$s» tiene ordenamiento (collation) %3$s en el término no recursivo, pero %4$s en general" -#: parser/parse_cte.c:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Use la clásula COLLATE para definir el ordenamiento del término no-recursivo." -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "la consulta WITH no es recursiva" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "con una cláusula SEARCH o CYCLE, el lado izquierdo de UNION debe ser un SELECT" -#: parser/parse_cte.c:455 +#: parser/parse_cte.c:462 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "con una cláusula SEARCH o CYCLE, el lado derecho de UNION debe ser un SELECT" -#: parser/parse_cte.c:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "columna de búsqueda «%s» no se encuentra en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "columna de búsqueda «%s» fue especificada más de una vez" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" 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:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "la columna de ciclo «%s» no se encuentra en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "columna de ciclo «%s» fue especificada más de una vez" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" 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:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" 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:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" 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:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" 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:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" 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:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "la consulta WITH «%s» tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "la recursión mutua entre elementos de WITH no está implementada" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "la consulta recursiva «%s» no debe contener sentencias que modifiquen datos" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "la consulta recursiva «%s» no tiene la forma término-no-recursivo UNION [ALL] término-recursivo" -#: parser/parse_cte.c:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY no está implementado en una consulta recursiva" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET no está implementado en una consulta recursiva" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT no está implementado en una consulta recursiva" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE no está implementado en una consulta recursiva" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "la referencia recursiva a la consulta «%s» no debe aparecer más de una vez" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT no está permitido en este contexto" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 -#: parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "no existe la columna %s.%s" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "la columna «%s» no fue encontrado en el tipo %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "no se pudo identificar la columna «%s» en el tipo de dato record" -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:359 #, c-format 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:739 +#: parser/parse_expr.c:390 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í" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "no se pueden usar referencias a columnas en una cláusula DEFAULT" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 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:1234 +#: parser/parse_expr.c:784 parser/parse_relation.c:818 +#: parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "la referencia a la columna «%s» es ambigua" -#: parser/parse_expr.c:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:840 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 "no hay parámetro $%d" -#: parser/parse_expr.c:1044 +#: parser/parse_expr.c:1040 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF requiere que el operador = retorne boolean" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1050 parser/parse_expr.c:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s no debe retornar un conjunto" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "el número de columnas no coincide con el número de valores" -#: parser/parse_expr.c:1481 +#: parser/parse_expr.c:1477 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "el origen para un UPDATE de varias columnas debe ser una expresión sub-SELECT o ROW ()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "no se permiten funciones que retornan conjuntos en %s" -#: parser/parse_expr.c:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "no se pueden usar subconsultas en una restricción «check»" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "no se puede usar una subconsulta en una expresión DEFAULT" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "no se puede usar una subconsulta en una expresión de índice" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "no se puede usar una subconsulta en un predicado de índice" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" msgstr "no se puede usar una subconsulta en una expresión de estadísticas" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "no se puede usar una subconsulta en una expresión de transformación" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "no se puede usar una subconsulta en un parámetro a EXECUTE" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "no se puede usar una subconsulta en la condición WHEN de un disparador" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "no se puede usar una subconsulta en un borde de partición" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "no se puede usar una subconsulta en una expresión de llave de partición" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "no se puede usar una subconsulta en un argumento a CALL" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "no se puede usar una subconsulta en la condición WHERE de COPY FROM" -#: parser/parse_expr.c:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "no se puede usar una subconsulta en una expresión de generación de columna" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "la subconsulta debe retornar sólo una columna" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "la subconsulta tiene demasiadas columnas" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "la subconsulta tiene muy pocas columnas" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "no se puede determinar el tipo de un array vacío" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Agregue una conversión de tipo explícita al tipo deseado, por ejemplo ARRAY[]::integer[]." -#: parser/parse_expr.c:2015 +#: parser/parse_expr.c:2012 #, c-format msgid "could not find element type for data type %s" msgstr "no se pudo encontrar el tipo de dato de elemento para el tipo de dato %s" -#: parser/parse_expr.c:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "las expresiones ROW pueden tener a lo más %d entradas" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "el valor del atributo XML sin nombre debe ser una referencia a una columna" -#: parser/parse_expr.c:2304 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "el valor del elemento XML sin nombre debe ser una referencia a una columna" -#: parser/parse_expr.c:2319 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "el nombre de atributo XML «%s» aparece más de una vez" -#: parser/parse_expr.c:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "no se puede convertir el resultado de XMLSERIALIZE a %s" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "número desigual de entradas en expresiones de registro" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "no se pueden comparar registros de largo cero" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "el operador de comparación de registros debe retornar tipo boolean, no tipo %s" -#: parser/parse_expr.c:2777 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "el operador de comparación de registros no puede retornar un conjunto" -#: parser/parse_expr.c:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "no se pudo determinar la interpretación del operador de comparación de registros %s" -#: parser/parse_expr.c:2838 +#: parser/parse_expr.c:2835 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Los operadores de comparación de registros deben estar asociados a una familia de operadores btree." -#: parser/parse_expr.c:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Hay múltiples candidatos igualmente plausibles." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM requiere que el operador = retorne boolean" @@ -16526,59 +17461,91 @@ msgstr "no se permiten funciones que retornan conjuntos en expresiones de polít msgid "set-returning functions are not allowed in window definitions" msgstr "no se permiten funciones que retornan conjuntos definiciones de ventana deslizante" -#: parser/parse_func.c:2616 +#: parser/parse_func.c:2615 +#| msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "no se permiten funciones que retornan conjuntos en condiciones MERGE WHEN" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "no se permiten funciones de que retornan conjuntos en restricciones «check»" -#: parser/parse_func.c:2620 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones DEFAULT" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de índice" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2629 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 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de estadísticas" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de transformación" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones que retornan conjuntos en parámetros a EXECUTE" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "no se permiten funciones que retornan conjuntos en condiciones WHEN de un disparador" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "no se permiten funciones que retornan conjuntos en bordes de partición" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de llave de particionamiento" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "no se permiten funciones que retornan conjuntos en argumentos de CALL" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones que retornan conjuntos en las condiciones WHERE de COPY FROM" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de generación de columna" -#: parser/parse_node.c:87 +#: parser/parse_merge.c:119 +#, c-format +#| msgid "WHERE CURRENT OF is not supported for this table type" +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WITH RECURSIVE no está soportado para la sentencia MERGE" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "se especificó una cláusula WHEN no alcanzable después de una cláusula WHEN incondicional" + +#: parser/parse_merge.c:191 +#, c-format +#| msgid "LIKE is not supported for creating foreign tables" +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE no está soportado para tablas con reglas." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "el nombre «%s» fue especificado más de una vez" + +#: parser/parse_merge.c:210 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "El nombre es usado tanto como tabla de destino de MERGE como como tabla de origen." + +#: parser/parse_node.c:86 #, c-format msgid "target lists can have at most %d entries" msgstr "las listas de resultados pueden tener a lo más %d entradas" @@ -16649,6 +17616,11 @@ msgstr "op ANY/ALL (array) requiere un operador que no retorne un conjunto" msgid "inconsistent types deduced for parameter $%d" msgstr "para el parámetro $%d se dedujeron tipos de dato inconsistentes" +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "no se pudo determinar el tipo del parámetro $%d" + #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" @@ -16664,12 +17636,12 @@ msgstr "la referencia a la tabla %u es ambigua" msgid "table name \"%s\" specified more than once" msgstr "el nombre de tabla «%s» fue especificado más de una vez" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "referencia a la entrada de la cláusula FROM para la tabla «%s» no válida" -#: parser/parse_relation.c:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Hay una entrada para la tabla «%s», pero no puede ser referenciada desde esta parte de la consulta." @@ -16689,108 +17661,109 @@ msgstr "la referencia a columna a sistema «%s» en una restricción check no es msgid "cannot use system column \"%s\" in column generation expression" msgstr "no se puede usar la columna de sistema «%s» en una expresión de generación de columna" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 -#: parser/parse_relation.c:2343 +#: parser/parse_relation.c:711 +#, c-format +#| msgid "cannot use system column \"%s\" in partition key" +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "no se puede usar la columna de sistema «%s» en condiciones MERGE WHEN" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "la tabla «%s» tiene %d columnas pero se especificaron %d" -#: 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 "Hay un elemento WITH llamado «%s», pero no puede ser referenciada desde esta parte de la consulta." -#: 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 "Use WITH RECURSIVE, o reordene los elementos de WITH para eliminar referencias hacia adelante." -#: parser/parse_relation.c:1767 +#: parser/parse_relation.c:1778 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "una lista de definición de columnas es redundante para una función con parámetros OUT" -#: parser/parse_relation.c:1773 +#: parser/parse_relation.c:1784 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" 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 +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "sólo se permite una lista de definición de columnas en funciones que retornan «record»" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "la lista de definición de columnas es obligatoria para funciones que retornan «record»" -#: parser/parse_relation.c:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "las listas de definición de columnas pueden tener a lo más %d entradas" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "la función «%s» en FROM tiene el tipo de retorno no soportado %s" -#: parser/parse_relation.c:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "funciones en FROM pueden retornar a lo más %d columnas" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "la función %s tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "la lista VALUES «%s» tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_relation.c:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "los joins pueden tener a lo más %d columnas" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "la tabla «%s» tiene %d columnas pero se especificaron %d" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "la consulta WITH «%s» no tiene una cláusula RETURNING" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "no existe la columna %d en la relación «%s»" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Probablemente quiera hacer referencia al alias de la tabla «%s»." -#: parser/parse_relation.c:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "falta una entrada para la tabla «%s» en la cláusula FROM" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Probablemente quiera hacer referencia a la columna «%s.%s»." -#: parser/parse_relation.c:3646 +#: parser/parse_relation.c:3664 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Hay una columna llamada «%s» en la tabla «%s», pero no puede ser referenciada desde esta parte de la consulta." -#: parser/parse_relation.c:3663 +#: parser/parse_relation.c:3681 #, c-format 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»." @@ -16835,7 +17808,7 @@ msgstr "la asignación subindexada a «%s» requiere tipo %s pero la expresión 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:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * sin especificar tablas no es válido" @@ -16855,8 +17828,8 @@ msgstr "la referencia a %%TYPE es inapropiada (demasiados nombres con punto): %s msgid "type reference %s converted to %s" msgstr "la referencia al tipo %s convertida a %s" -#: 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 "el tipo «%s» está inconcluso" @@ -16866,12 +17839,12 @@ msgstr "el tipo «%s» está inconcluso" msgid "type modifier is not allowed for type \"%s\"" msgstr "un modificador de tipo no está permitido para el tipo «%s»" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "los modificadores de tipo deben ser constantes simples o identificadores" -#: 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 "el nombre de tipo «%s» no es válido" @@ -16881,330 +17854,336 @@ msgstr "el nombre de tipo «%s» no es válido" msgid "cannot create partitioned table as inheritance child" msgstr "no se puede crear una tabla particionada como hija de herencia" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "array de serial no está implementado" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, 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:684 +#: parser/parse_utilcmd.c:683 #, 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:701 +#: parser/parse_utilcmd.c:700 #, 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:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "las columnas identidad no están soportadas en particiones" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, 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:744 +#: parser/parse_utilcmd.c:743 #, 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:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "las columnas generadas no están soportadas en particiones" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, 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:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, 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:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, 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:825 +#: parser/parse_utilcmd.c:824 #, 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:833 +#: parser/parse_utilcmd.c:832 #, 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:841 +#: parser/parse_utilcmd.c:840 #, 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:906 +#: parser/parse_utilcmd.c:905 #, 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:912 +#: parser/parse_utilcmd.c:911 #, 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:977 +#: parser/parse_utilcmd.c:976 #, 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:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +#| msgid "relation \"%s\" in %s clause not found in FROM clause" +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "la relación «%s» no es válida en la cláusula LIKE" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, 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:2249 +#: parser/parse_utilcmd.c:2252 #, 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:2269 +#: parser/parse_utilcmd.c:2272 #, 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:2284 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "index \"%s\" is not valid" msgstr "el índice «%s» no es válido" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "«%s» no es un índice único" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 -#: parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, 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:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "el índice «%s» contiene expresiones" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "«%s» es un índice parcial" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "«%s» no es un índice postergable (deferrable)" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, 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:2381 +#: parser/parse_utilcmd.c:2384 #, 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:2538 +#: parser/parse_utilcmd.c:2541 #, 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:2544 +#: parser/parse_utilcmd.c:2547 #, 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:2891 +#: parser/parse_utilcmd.c:2894 #, 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:2963 +#: parser/parse_utilcmd.c:2966 #, 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:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "las reglas en vistas materializadas no están soportadas" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, 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:3142 +#: parser/parse_utilcmd.c:3145 #, 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:3160 parser/parse_utilcmd.c:3261 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 #: rewrite/rewriteHandler.c:530 rewrite/rewriteManip.c:1021 #, 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:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "una regla ON SELECT no puede usar OLD" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "una regla ON SELECT no puede usar NEW" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "una regla ON INSERT no puede usar OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "una regla ON DELETE no puede usar NEW" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, 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:3232 +#: parser/parse_utilcmd.c:3235 #, 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:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "cláusula DEFERRABLE mal puesta" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, 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:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "la cláusula NOT DEFERRABLE está mal puesta" -#: parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 gram.y:5559 +#: parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 gram.y:5937 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "una restricción declarada INITIALLY DEFERRED debe ser DEFERRABLE" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "la cláusula INITIALLY DEFERRED está mal puesta" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, 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:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "la cláusula INITIALLY IMMEDIATE está mal puesta" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, 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:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "«%s» no es una tabla particionada" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "«la tabla %s» no está particionada" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "el índice «%s» no está particionado" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, 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:4047 +#: parser/parse_utilcmd.c:4050 #, 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:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format 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:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, 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:4073 +#: parser/parse_utilcmd.c:4076 #, 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:4126 +#: parser/parse_utilcmd.c:4129 #, 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:4132 +#: parser/parse_utilcmd.c:4135 #, 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:4136 +#: parser/parse_utilcmd.c:4139 #, 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:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "no se puede especificar NULL en borde de rango" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, 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:4306 +#: parser/parse_utilcmd.c:4309 #, 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:4349 +#: parser/parse_utilcmd.c:4352 #, 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»" @@ -17217,12 +18196,12 @@ msgstr "UESCAPE debe ser seguido por un literal de cadena simple" msgid "invalid Unicode escape character" msgstr "carácter de escape Unicode no válido" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "valor de escape Unicode no válido" -#: parser/parser.c:468 utils/adt/varlena.c:6555 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6529 scan.l:684 #, c-format msgid "invalid Unicode escape" msgstr "valor de escape Unicode no válido" @@ -17232,8 +18211,8 @@ msgstr "valor de escape Unicode no válido" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Los escapes Unicode deben ser \\XXXX o \\+XXXXXX." -#: parser/parser.c:497 utils/adt/varlena.c:6580 scan.l:638 scan.l:654 -#: scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6554 scan.l:645 scan.l:661 +#: scan.l:677 #, c-format msgid "invalid Unicode surrogate pair" msgstr "par sustituto (surrogate) Unicode no válido" @@ -17243,74 +18222,74 @@ msgstr "par sustituto (surrogate) Unicode no válido" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "el identificador «%s» se truncará a «%.*s»" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, 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:2873 partitioning/partbounds.c:2892 -#: partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, 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:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "El nuevo módulo %d no es un factor de %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:2893 +#: partitioning/partbounds.c:3005 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "El nuevo módulo %d no es divisible para %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:3028 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "borde de rango vació especificado para la partición «%s»" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, 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:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partición «%s» traslaparía con la partición «%s»" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, 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:4715 +#: partitioning/partbounds.c:4828 #, c-format 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:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "«%s» es una tabla particionada por hash" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, 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:4772 +#: partitioning/partbounds.c:4885 #, 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:4804 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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 "no se pudo hacer stat al directorio de datos «%s»: %m" @@ -17352,32 +18331,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:616 port/sysv_shmem.c:616 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "no se pudo mapear memoria compartida anónima: %m" -#: port/pg_shmem.c:618 port/sysv_shmem.c:618 +#: 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 "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:686 port/sysv_shmem.c:686 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "las huge pages no están soportadas en esta plataforma" -#: port/pg_shmem.c:693 port/sysv_shmem.c:693 +#: 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 "las huge pages no están soportadas con la configuración actual de shared_memory_type" -#: port/pg_shmem.c:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: 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 "el bloque de memoria compartida preexistente (clave %lu, ID %lu) aún está en uso" -#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: 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 "Termine cualquier proceso de servidor asociado al directorio de datos «%s»." @@ -17407,37 +18386,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 "Probablemente necesita incrementar el valor SEMVMX del kernel hasta al menos %d. Examine la documentación de PostgreSQL para obtener más detalles." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "no se pudo cargar dbghelp.dll, no se puede escribir el volcado de la caída\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 "no fue posible cargar las funciones requeridas desde dbghelp.dll, no se puede escribir el volcado de la caída\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 "no se pudo abrir el archivo del volcado de caída «%s» para escritura: código de error %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "se escribió el volcado de caída en el archivo «%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 "no se pudo escribir el volcado de caída al archivo «%s»: código de error %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 "no se pudo crear tubería para escuchar señales para el PID %d: código de error %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 "no se pudo crear tubería para escuchar señales: código de error %lu; reintentando\n" @@ -17527,42 +18506,47 @@ 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:410 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "no se pudo iniciar el lanzador autovacuum: %m" -#: postmaster/autovacuum.c:1492 +#: postmaster/autovacuum.c:752 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "proceso ayudante autovacuum tomó demasiado tiempo para iniciarse; cancelado" + +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "no se pudo lanzar el proceso «autovacuum worker»: %m" -#: postmaster/autovacuum.c:2286 +#: postmaster/autovacuum.c:2265 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: eliminando tabla temporal huérfana «%s.%s.%s»" -#: postmaster/autovacuum.c:2515 +#: postmaster/autovacuum.c:2490 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "vacuum automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2518 +#: postmaster/autovacuum.c:2493 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "análisis automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2711 +#: postmaster/autovacuum.c:2686 #, 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:3397 +#: postmaster/autovacuum.c:3297 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum no fue iniciado debido a un error de configuración" -#: postmaster/autovacuum.c:3398 +#: postmaster/autovacuum.c:3298 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Active la opción «track_counts»." @@ -17572,47 +18556,48 @@ msgstr "Active la opción «track_counts»." msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "estado inconsistente de proceso ayudante (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:661 +#: postmaster/bgworker.c:666 #, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "proceso ayudante «%s»: debe acoplarse a memoria compartida para poder solicitar una conexión a base de datos" +#| msgid "background worker \"%s\": only dynamic background workers can request notification" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "proceso ayudante «%s»: no están soportados los procesos ayudantes sin memoria compartida" -#: postmaster/bgworker.c:670 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "proceso ayudante «%s»: no se puede solicitar una conexión a base de datos si está iniciando en el momento de inicio de postmaster" -#: postmaster/bgworker.c:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "proceso ayudante «%s»: intervalo de reinicio no válido" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "proceso ayudante «%s»: los ayudantes paralelos no pueden ser configurados «restart»" -#: postmaster/bgworker.c:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "terminando el proceso ayudante «%s» debido a una orden del administrador" -#: postmaster/bgworker.c:904 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "proceso ayudante «%s»: debe ser registrado en shared_preload_libraries" -#: postmaster/bgworker.c:916 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "proceso ayudante «%s»: sólo los ayudantes dinámicos pueden pedir notificaciones" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "demasiados procesos ayudantes" -#: 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." @@ -17620,12 +18605,12 @@ msgstr[0] "Hasta %d proceso ayudante puede registrarse con la configuración act msgstr[1] "Hasta %d procesos ayudantes pueden registrarse con la configuración actual." # FIXME a %s would be nice here -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Considere incrementar el parámetro de configuración «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)" @@ -17633,346 +18618,182 @@ msgstr[0] "los puntos de control están ocurriendo con demasiada frecuencia (cad msgstr[1] "los puntos de control están ocurriendo con demasiada frecuencia (cada %d segundos)" # FIXME a %s would be nice here -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Considere incrementar el parámetro de configuración «max_wal_size»." -#: postmaster/checkpointer.c:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "falló la petición de punto de control" -#: postmaster/checkpointer.c:1063 +#: postmaster/checkpointer.c:1061 #, c-format 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:365 +#: postmaster/pgarch.c:423 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode activado, pero archive_command no está definido" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode está activo, y sin embargo el archivado no está configurado" -#: postmaster/pgarch.c:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "eliminando archivo de estado huérfano «%s»" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, 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:433 +#: postmaster/pgarch.c:491 #, 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: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: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: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:545 postmaster/postmaster.c:3755 -#, 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: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: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:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "no se pudo resolver «localhost»: %s" - -#: 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: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: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: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: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: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:536 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() falló en el recolector de estadísticas: %m" - -#: 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: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: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: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: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: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:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "destino de reset no reconocido: «%s»" - -#: 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:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "no se pudo leer un mensaje de estadísticas: %m" - -#: 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: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: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: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" +msgstr "el archivado del archivo WAL «%s» falló demasiadas veces, se tratará de nuevo más tarde" -#: postmaster/pgstat.c:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 +#: postmaster/pgarch.c:798 #, 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: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:4634 -#, c-format -msgid "statistics collector's time %s is later than backend local time %s" -msgstr "la fecha del colector de estadísticas %s es posterior a la fecha local del servidor %s" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "reiniciando el proceso archivador porque el valor de «archive_library» cambió" -#: postmaster/pgstat.c:4657 +#: postmaster/pgarch.c:831 #, 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" +msgid "archive modules have to define the symbol %s" +msgstr "los módulos de archivado tienen que definir el símbolo %s" -#: postmaster/pgstat.c:4784 +#: postmaster/pgarch.c:837 #, c-format -msgid "stats_timestamp %s is later than collector's time %s for database %u" -msgstr "stats_timestamp %s es posterior a la fecha del colector %s para la base de datos %u" +msgid "archive modules must register an archive callback" +msgstr "los módulos de archivado deben registrar un callback de archivado" -#: 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" - -#: postmaster/postmaster.c:745 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: argumento no válido para la opción -f: «%s»\n" -#: postmaster/postmaster.c:824 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: argumento no válido para la opción -t: «%s»\n" -#: postmaster/postmaster.c:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: argumento no válido: «%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) debe ser menor que max_connections (%d)\n" -#: postmaster/postmaster.c:924 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "el archivador de WAL no puede activarse cuando wal_level es «minimal»" -#: postmaster/postmaster.c:927 +#: postmaster/postmaster.c:952 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "el flujo de WAL (max_wal_senders > 0) requiere wal_level «replica» o «logical»" -#: postmaster/postmaster.c:935 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: las tablas de palabras clave de fecha no son válidas, arréglelas\n" -#: postmaster/postmaster.c:1052 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "no se pudo crear el port E/S de reporte de completitud para la cola de procesos hijos" -#: postmaster/postmaster.c:1117 +#: postmaster/postmaster.c:1178 #, c-format msgid "ending log output to stderr" msgstr "terminando la salida de registro a stderr" -#: postmaster/postmaster.c:1118 +#: postmaster/postmaster.c:1179 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "La salida futura del registro será enviada al destino de log «%s»." -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "starting %s" msgstr "iniciando %s" -#: postmaster/postmaster.c:1158 postmaster/postmaster.c:1257 -#: utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "la sintaxis de lista no es válida para el parámetro «%s»" - -#: postmaster/postmaster.c:1189 +#: postmaster/postmaster.c:1250 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "no se pudo crear el socket de escucha para «%s»" -#: postmaster/postmaster.c:1195 +#: postmaster/postmaster.c:1256 #, c-format msgid "could not create any TCP/IP sockets" msgstr "no se pudo crear ningún socket TCP/IP" -#: postmaster/postmaster.c:1227 +#: postmaster/postmaster.c:1288 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() falló: código de error %ld" -#: postmaster/postmaster.c:1279 +#: postmaster/postmaster.c:1340 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "no se pudo crear el socket de dominio Unix en el directorio «%s»" -#: postmaster/postmaster.c:1285 +#: postmaster/postmaster.c:1346 #, c-format msgid "could not create any Unix-domain sockets" msgstr "no se pudo crear ningún socket de dominio Unix" -#: postmaster/postmaster.c:1297 +#: postmaster/postmaster.c:1358 #, c-format msgid "no socket created for listening" msgstr "no se creó el socket de atención" -#: 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: no se pudo cambiar los permisos del archivo de PID externo «%s»: %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: no pudo escribir en el archivo externo de PID «%s»: %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 "no se pudo cargar pg_hba.conf" -#: postmaster/postmaster.c:1391 +#: postmaster/postmaster.c:1446 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmaster se volvió multi-hilo durante la partida" -#: postmaster/postmaster.c:1392 +#: postmaster/postmaster.c:1447 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." -msgstr "Defina la variable de ambiente LC_ALL a un valor válido." +msgstr "Defina la variable de ambiente LC_ALL a un valor válido de configuración regional («locale»)." -#: postmaster/postmaster.c:1487 +#: postmaster/postmaster.c:1548 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: no se pudo localizar la ruta de mi propio ejecutable" -#: postmaster/postmaster.c:1494 +#: postmaster/postmaster.c:1555 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: no se pudo localizar el ejecutable postgres correspondiente" -#: 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 "Esto puede indicar una instalación de PostgreSQL incompleta, o que el archivo «%s» ha sido movido de la ubicación adecuada." -#: postmaster/postmaster.c:1544 +#: postmaster/postmaster.c:1605 #, c-format msgid "" "%s: could not find the database system\n" @@ -17983,232 +18804,228 @@ msgstr "" "Se esperaba encontrar en el directorio PGDATA «%s»,\n" "pero no se pudo abrir el archivo «%s»: %s\n" -#: postmaster/postmaster.c:1721 +#: postmaster/postmaster.c:1782 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() falló en postmaster: %m" -#: postmaster/postmaster.c:1857 +#: postmaster/postmaster.c:1913 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "enviando SIGKILL a procesos hijos recalcitrantes" -#: postmaster/postmaster.c:1878 +#: postmaster/postmaster.c:1934 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "ejecutando un apagado inmediato porque el archivo de bloqueo del directorio de datos no es válido" -#: postmaster/postmaster.c:1981 postmaster/postmaster.c:2009 +#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 #, c-format msgid "incomplete startup packet" msgstr "el paquete de inicio está incompleto" -#: postmaster/postmaster.c:1993 postmaster/postmaster.c:2026 +#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 #, c-format msgid "invalid length of startup packet" msgstr "el de paquete de inicio tiene largo incorrecto" -#: postmaster/postmaster.c:2055 +#: postmaster/postmaster.c:2111 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "no se pudo enviar la respuesta de negociación SSL: %m" -#: postmaster/postmaster.c:2073 +#: postmaster/postmaster.c:2129 #, c-format msgid "received unencrypted data after SSL request" msgstr "se recibieron datos no cifrados después de petición SSL" -#: postmaster/postmaster.c:2074 postmaster/postmaster.c:2118 +#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 #, 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:2099 +#: postmaster/postmaster.c:2155 #, 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:2117 +#: postmaster/postmaster.c:2173 #, 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:2141 +#: postmaster/postmaster.c:2197 #, 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:2205 utils/misc/guc.c:7126 utils/misc/guc.c:7162 -#: utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11530 -#: utils/misc/guc.c:11571 +#: postmaster/postmaster.c:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11970 +#: utils/misc/guc.c:12011 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valor no válido para el parámetro «%s»: «%s»" -#: postmaster/postmaster.c:2208 +#: postmaster/postmaster.c:2264 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "Los valores válidos son: «false», 0, «true», 1, «database»." +msgstr "Los valores aceptables son: «false», 0, «true», 1, «database»." -#: postmaster/postmaster.c:2253 +#: postmaster/postmaster.c:2309 #, 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:2270 +#: postmaster/postmaster.c:2326 #, 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:2334 +#: postmaster/postmaster.c:2390 #, c-format msgid "the database system is starting up" msgstr "el sistema de base de datos está iniciándose" -#: postmaster/postmaster.c:2340 +#: postmaster/postmaster.c:2396 #, c-format msgid "the database system is not yet accepting connections" msgstr "el sistema de bases de datos aún no está aceptando conexiones" -#: postmaster/postmaster.c:2341 +#: postmaster/postmaster.c:2397 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Aún no se ha alcanzado un estado de recuperación consistente." -#: postmaster/postmaster.c:2345 +#: postmaster/postmaster.c:2401 #, c-format msgid "the database system is not accepting connections" msgstr "el sistema de bases de datos no está aceptando conexiones" -#: postmaster/postmaster.c:2346 +#: postmaster/postmaster.c:2402 #, c-format msgid "Hot standby mode is disabled." msgstr "El modo hot standby está desactivado." -#: postmaster/postmaster.c:2351 +#: postmaster/postmaster.c:2407 #, c-format msgid "the database system is shutting down" msgstr "el sistema de base de datos está apagándose" -#: postmaster/postmaster.c:2356 +#: postmaster/postmaster.c:2412 #, 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:2361 storage/ipc/procarray.c:499 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2417 storage/ipc/procarray.c:493 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "lo siento, ya tenemos demasiados clientes" -#: postmaster/postmaster.c:2451 +#: postmaster/postmaster.c:2504 #, 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:2463 +#: postmaster/postmaster.c:2516 #, 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:2717 +#: postmaster/postmaster.c:2770 #, 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:2743 postmaster/postmaster.c:2747 +#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2798 #, c-format msgid "%s was not reloaded" msgstr "%s no fue vuelto a cargar" -#: postmaster/postmaster.c:2757 +#: postmaster/postmaster.c:2808 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuración SSL no fue vuelta a cargar" -#: postmaster/postmaster.c:2813 +#: postmaster/postmaster.c:2864 #, c-format msgid "received smart shutdown request" msgstr "se recibió petición de apagado inteligente" -#: postmaster/postmaster.c:2859 +#: postmaster/postmaster.c:2905 #, c-format msgid "received fast shutdown request" msgstr "se recibió petición de apagado rápido" -#: postmaster/postmaster.c:2877 +#: postmaster/postmaster.c:2923 #, c-format msgid "aborting any active transactions" msgstr "abortando transacciones activas" -#: postmaster/postmaster.c:2901 +#: postmaster/postmaster.c:2947 #, c-format msgid "received immediate shutdown request" msgstr "se recibió petición de apagado inmediato" -#: postmaster/postmaster.c:2978 +#: postmaster/postmaster.c:3024 #, c-format msgid "shutdown at recovery target" msgstr "apagándose al alcanzar el destino de recuperación" -#: postmaster/postmaster.c:2996 postmaster/postmaster.c:3032 +#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 msgid "startup process" msgstr "proceso de inicio" -#: postmaster/postmaster.c:2999 +#: postmaster/postmaster.c:3045 #, 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:3074 +#: postmaster/postmaster.c:3118 #, 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:3095 +#: postmaster/postmaster.c:3139 msgid "background writer process" msgstr "proceso background writer" -#: postmaster/postmaster.c:3149 +#: postmaster/postmaster.c:3186 msgid "checkpointer process" msgstr "proceso checkpointer" -#: postmaster/postmaster.c:3165 +#: postmaster/postmaster.c:3202 msgid "WAL writer process" msgstr "proceso escritor de WAL" -#: postmaster/postmaster.c:3180 +#: postmaster/postmaster.c:3217 msgid "WAL receiver process" msgstr "proceso receptor de WAL" -#: postmaster/postmaster.c:3195 +#: postmaster/postmaster.c:3232 msgid "autovacuum launcher process" msgstr "proceso lanzador de autovacuum" -#: postmaster/postmaster.c:3213 +#: postmaster/postmaster.c:3250 msgid "archiver process" msgstr "proceso de archivado" -#: postmaster/postmaster.c:3228 -msgid "statistics collector process" -msgstr "recolector de estadísticas" - -#: postmaster/postmaster.c:3242 +#: postmaster/postmaster.c:3263 msgid "system logger process" msgstr "proceso de log" -#: postmaster/postmaster.c:3306 +#: postmaster/postmaster.c:3327 #, c-format msgid "background worker \"%s\"" msgstr "proceso ayudante «%s»" -#: postmaster/postmaster.c:3390 postmaster/postmaster.c:3410 -#: postmaster/postmaster.c:3417 postmaster/postmaster.c:3435 +#: postmaster/postmaster.c:3406 postmaster/postmaster.c:3426 +#: postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 msgid "server process" msgstr "proceso de servidor" -#: postmaster/postmaster.c:3489 +#: postmaster/postmaster.c:3505 #, c-format msgid "terminating any other active server processes" msgstr "terminando todos los otros procesos de servidor activos" @@ -18233,6 +19050,11 @@ msgstr "El proceso que falló estaba ejecutando: %s" msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) fue terminado por una excepción 0x%X" +#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 +#, 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." + #. translator: %s is a noun phrase describing a child process, such as #. "server process" #: postmaster/postmaster.c:3763 @@ -18247,531 +19069,427 @@ msgstr "%s (PID %d) fue terminado por una señal %d: %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) terminó con código %d no reconocido" -#: postmaster/postmaster.c:3989 +#: postmaster/postmaster.c:3975 #, c-format msgid "abnormal database system shutdown" msgstr "apagado anormal del sistema de bases de datos" -#: postmaster/postmaster.c:4027 +#: postmaster/postmaster.c:4001 #, c-format msgid "shutting down due to startup process failure" msgstr "apagando debido a una falla en el procesamiento de inicio" -#: postmaster/postmaster.c:4033 +#: postmaster/postmaster.c:4007 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "apagando debido a que restart_after_crash está desactivado" -#: postmaster/postmaster.c:4045 +#: postmaster/postmaster.c:4019 #, c-format msgid "all server processes terminated; reinitializing" msgstr "todos los procesos fueron terminados; reinicializando" -#: postmaster/postmaster.c:4219 postmaster/postmaster.c:5570 -#: postmaster/postmaster.c:5961 +#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5519 +#: postmaster/postmaster.c:5917 #, c-format msgid "could not generate random cancel key" msgstr "no se pudo generar una llave de cancelación aleatoria" -#: postmaster/postmaster.c:4273 +#: postmaster/postmaster.c:4253 #, 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:4315 +#: postmaster/postmaster.c:4295 msgid "could not fork new process for connection: " msgstr "no se pudo lanzar el nuevo proceso para la conexión: " -#: postmaster/postmaster.c:4421 +#: postmaster/postmaster.c:4401 #, c-format msgid "connection received: host=%s port=%s" msgstr "conexión recibida: host=%s port=%s" -#: postmaster/postmaster.c:4426 +#: postmaster/postmaster.c:4406 #, c-format msgid "connection received: host=%s" msgstr "conexión recibida: host=%s" -#: postmaster/postmaster.c:4669 +#: postmaster/postmaster.c:4643 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "no se pudo lanzar el proceso servidor «%s»: %m" -#: postmaster/postmaster.c:4727 +#: postmaster/postmaster.c:4701 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "no se pudo crear mapeo de archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4736 +#: postmaster/postmaster.c:4710 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "no se pudo mapear memoria para parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4763 +#: postmaster/postmaster.c:4737 #, c-format msgid "subprocess command line too long" msgstr "orden de subproceso demasiado larga" -#: postmaster/postmaster.c:4781 +#: postmaster/postmaster.c:4755 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "llamada a CreateProcess() falló: %m (código de error %lu)" -#: postmaster/postmaster.c:4808 +#: postmaster/postmaster.c:4782 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "no se pudo desmapear la vista del archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4812 +#: postmaster/postmaster.c:4786 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "no se pudo cerrar el archivo de parámetros de servidor: código de error %lu" -#: postmaster/postmaster.c:4834 +#: postmaster/postmaster.c:4808 #, 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:4835 +#: postmaster/postmaster.c:4809 #, 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:5017 +#: postmaster/postmaster.c:4982 #, 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:5143 +#: postmaster/postmaster.c:5107 #, c-format msgid "Please report this to <%s>." msgstr "Por favor reporte esto a <%s>." -#: postmaster/postmaster.c:5230 +#: postmaster/postmaster.c:5179 #, c-format 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:5494 +#: postmaster/postmaster.c:5443 #, c-format msgid "could not fork startup process: %m" msgstr "no se pudo lanzar el proceso de inicio: %m" -#: postmaster/postmaster.c:5498 +#: postmaster/postmaster.c:5447 #, c-format msgid "could not fork archiver process: %m" msgstr "no se pudo lanzar el proceso de archivado: %m" -#: postmaster/postmaster.c:5502 +#: postmaster/postmaster.c:5451 #, c-format msgid "could not fork background writer process: %m" msgstr "no se pudo lanzar el background writer: %m" -#: postmaster/postmaster.c:5506 +#: postmaster/postmaster.c:5455 #, c-format msgid "could not fork checkpointer process: %m" msgstr "no se pudo lanzar el checkpointer: %m" -#: postmaster/postmaster.c:5510 +#: postmaster/postmaster.c:5459 #, c-format msgid "could not fork WAL writer process: %m" msgstr "no se pudo lanzar el proceso escritor de WAL: %m" -#: postmaster/postmaster.c:5514 +#: postmaster/postmaster.c:5463 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "no se pudo lanzar el proceso receptor de WAL: %m" -#: postmaster/postmaster.c:5518 +#: postmaster/postmaster.c:5467 #, c-format msgid "could not fork process: %m" msgstr "no se pudo lanzar el proceso: %m" -#: postmaster/postmaster.c:5719 postmaster/postmaster.c:5742 +#: postmaster/postmaster.c:5668 postmaster/postmaster.c:5695 #, 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:5726 postmaster/postmaster.c:5749 +#: postmaster/postmaster.c:5679 postmaster/postmaster.c:5706 #, c-format msgid "invalid processing mode in background worker" msgstr "modo de procesamiento no válido en proceso ayudante" -#: postmaster/postmaster.c:5834 +#: postmaster/postmaster.c:5791 #, c-format msgid "could not fork worker process: %m" msgstr "no se pudo lanzar el proceso ayudante: %m" -#: postmaster/postmaster.c:5947 +#: postmaster/postmaster.c:5903 #, c-format msgid "no slot available for new worker process" msgstr "no hay slot disponible para un nuevo proceso ayudante" -#: postmaster/postmaster.c:6281 +#: postmaster/postmaster.c:6234 #, 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:6313 +#: postmaster/postmaster.c:6266 #, 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:6342 +#: postmaster/postmaster.c:6295 #, 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:6349 +#: postmaster/postmaster.c:6302 #, 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:6358 +#: postmaster/postmaster.c:6311 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "no se pudo eliminar el archivo «%s»: %s\n" -#: postmaster/postmaster.c:6375 +#: postmaster/postmaster.c:6328 #, 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:6384 +#: postmaster/postmaster.c:6337 #, 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:6391 +#: postmaster/postmaster.c:6344 #, 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:6553 +#: postmaster/postmaster.c:6503 #, 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:6595 +#: postmaster/postmaster.c:6545 #, c-format msgid "could not post child completion status\n" msgstr "no se pudo publicar el estado de completitud del proceso hijo\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 -#, c-format -msgid "could not read from logger pipe: %m" -msgstr "no se pudo leer desde la tubería de log: %m" - -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 -#, c-format -msgid "could not create pipe for syslog: %m" -msgstr "no se pudo crear la tubería para syslog: %m" - -#: postmaster/syslogger.c:636 -#, c-format -msgid "could not fork system logger: %m" -msgstr "no se pudo crear el proceso de log: %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "redirigiendo la salida del registro al proceso recolector de registro" - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "La salida futura del registro aparecerá en el directorio «%s»." - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "no se pudo redirigir stdout: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "no se pudo redirigir stderr: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "no se pudo escribir al archivo de log: %s\n" - -#: postmaster/syslogger.c:1225 -#, c-format -msgid "could not open log file \"%s\": %m" -msgstr "no se pudo abrir el archivo de registro «%s»: %m" - -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 -#, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "desactivando rotación automática (use SIGHUP para reactivarla)" - -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "no se pudo determinar qué ordenamiento usar para la expresión regular" - -#: regex/regc_pg_locale.c:269 -#, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "los ordenamientos no determinísticos no están soportados para expresiones regulares" - -#: 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: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: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:353 +#: postmaster/shell_archive.c:123 #, c-format -msgid "could not rewind temporary file" -msgstr "no se puede rebobinar el archivo temporal" - -#: replication/backup_manifest.c:380 -#, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "no se pudo leer el archivo temporal: se leyeron sólo %zu de %zu bytes" - -#: replication/basebackup.c:546 -#, c-format -msgid "could not find any WAL files" -msgstr "no se pudo encontrar ningún archivo de WAL" - -#: replication/basebackup.c:561 replication/basebackup.c:577 -#: replication/basebackup.c:586 -#, c-format -msgid "could not find WAL file \"%s\"" -msgstr "no se pudo encontrar archivo de WAL «%s»" - -#: replication/basebackup.c:629 replication/basebackup.c:659 -#, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "tamaño del archivo WAL «%s» inesperado" +msgid "archive command failed with exit code %d" +msgstr "la orden de archivado falló con código de retorno %d" -#: replication/basebackup.c:644 replication/basebackup.c:1777 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "el respaldo base no pudo enviar datos, abortando el respaldo" +msgid "The failed archive command was: %s" +msgstr "La orden fallida era: «%s»" -#: replication/basebackup.c:722 +#: postmaster/shell_archive.c:132 #, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -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" +msgid "archive command was terminated by exception 0x%X" +msgstr "la orden de archivado fue terminada por una excepción 0x%X" -#: replication/basebackup.c:729 +#: postmaster/shell_archive.c:139 #, c-format -msgid "checksum verification failure during base backup" -msgstr "falla en verificación de checksums durante respaldo base" +msgid "archive command was terminated by signal %d: %s" +msgstr "la orden de archivado fue terminada por una señal %d: %s" -#: 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 +#: postmaster/shell_archive.c:148 #, c-format -msgid "duplicate option \"%s\"" -msgstr "nombre de opción «%s» duplicada" +msgid "archive command exited with unrecognized status %d" +msgstr "la orden de archivado fue terminada con código %d no reconocido" -#: replication/basebackup.c:842 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d está fuera del rango aceptable para el parámetro «%s» (%d .. %d)" +msgid "could not read from logger pipe: %m" +msgstr "no se pudo leer desde la tubería de log: %m" -#: replication/basebackup.c:887 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "opción de manifiesto «%s» no reconocida" +msgid "could not create pipe for syslog: %m" +msgstr "no se pudo crear la tubería para syslog: %m" -#: replication/basebackup.c:903 +#: postmaster/syslogger.c:677 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" +msgid "could not fork system logger: %m" +msgstr "no se pudo crear el proceso de log: %m" -#: replication/basebackup.c:918 +#: postmaster/syslogger.c:713 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "la suma de comprobación del manifiesto requiere un manifiesto de la copia de seguridad" +msgid "redirecting log output to logging collector process" +msgstr "redirigiendo la salida del registro al proceso recolector de registro" -#: replication/basebackup.c:1525 +#: postmaster/syslogger.c:714 #, c-format -msgid "skipping special file \"%s\"" -msgstr "omitiendo el archivo especial «%s»" +msgid "Future log output will appear in directory \"%s\"." +msgstr "La salida futura del registro aparecerá en el directorio «%s»." -#: replication/basebackup.c:1646 +#: postmaster/syslogger.c:722 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "número de segmento %d no válido en archivo «%s»" +msgid "could not redirect stdout: %m" +msgstr "no se pudo redirigir stdout: %m" -#: replication/basebackup.c:1684 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, 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 %u: el tamaño de búfer de lectura %d y el tamaño de página %d difieren" +msgid "could not redirect stderr: %m" +msgstr "no se pudo redirigir stderr: %m" -#: replication/basebackup.c:1757 +#: postmaster/syslogger.c:1177 #, 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 %u: calculado %X pero se esperaba %X" +msgid "could not write to log file: %s\n" +msgstr "no se pudo escribir al archivo de log: %s\n" -#: replication/basebackup.c:1764 +#: postmaster/syslogger.c:1295 #, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "subsiguientes fallas de verificación de checksums en el archivo «%s» no se reportarán" +msgid "could not open log file \"%s\": %m" +msgstr "no se pudo abrir el archivo de registro «%s»: %m" -#: replication/basebackup.c:1822 +#: postmaster/syslogger.c:1385 #, 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] "el archivo «%s» tiene un total de %d falla de verificación de checksum" -msgstr[1] "el archivo «%s» tiene un total de %d fallas de verificación de checksums" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "desactivando rotación automática (use SIGHUP para reactivarla)" -#: replication/basebackup.c:1858 +#: regex/regc_pg_locale.c:242 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "nombre de archivo demasiado largo para el formato tar: «%s»" +msgid "could not determine which collation to use for regular expression" +msgstr "no se pudo determinar qué ordenamiento usar para la expresión regular" -#: replication/basebackup.c:1863 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "destino de enlace simbólico demasiado largo para el formato tar: nombre de archivo «%s», destino «%s»" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "los ordenamientos no determinísticos no están soportados para expresiones regulares" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "no se pudo limpiar la ruta de búsqueda: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "sintaxis de cadena de conexión no válida: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "no se pudo interpretar la cadena de conexión: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, 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:371 -#: replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:384 +#: replication/libpqwalreceiver/libpqwalreceiver.c:622 #, c-format msgid "invalid response from primary server" msgstr "respuesta no válida del servidor primario" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:385 #, 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:448 -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:465 +#: replication/libpqwalreceiver/libpqwalreceiver.c:472 +#: replication/libpqwalreceiver/libpqwalreceiver.c:502 #, c-format msgid "could not start WAL streaming: %s" msgstr "no se pudo iniciar el flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:526 #, 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:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:549 #, 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:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:564 #, 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:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:574 #, 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:566 -#: replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:583 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "resultado inesperado después de CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:610 #, 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:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:623 #, 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:767 -#: replication/libpqwalreceiver/libpqwalreceiver.c:820 -#: replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:784 +#: replication/libpqwalreceiver/libpqwalreceiver.c:837 +#: replication/libpqwalreceiver/libpqwalreceiver.c:844 #, 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:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:864 #, 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:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:956 #, 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:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 #, c-format msgid "invalid query response" msgstr "respuesta no válida a consulta" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Se esperaban %d campos, se obtuvieron %d campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 #, 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:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 msgid "empty query" msgstr "consulta vacía" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 msgid "unexpected pipeline mode" msgstr "modo pipeline inesperado" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "no se pueden iniciar procesos ayudantes de replicación cuando max_replication_slots = 0" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "se agotaron los slots de procesos ayudantes de replicación" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Puede ser necesario incrementar max_logical_replication_workers." @@ -18812,112 +19530,107 @@ msgstr "decodificación lógica requiere una conexión a una base de datos" msgid "logical decoding cannot be used while in recovery" msgstr "la decodificación lógica no puede ejecutarse durante la recuperación" -#: 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 "no se puede usar un slot de replicación física para decodificación lógica" -#: 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 "el slot de replicación «%s» no fue creado en esta base de datos" -#: 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 "no se puede crear un slot de replicación lógica en una transacción que ha efectuado escrituras" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "iniciando la decodificación lógica para el slot «%s»" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Transacciones en flujo comprometiendo después de %X/%X, leyendo WAL desde %X/%X." -#: replication/logical/logical.c:696 +#: replication/logical/logical.c:720 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot «%s», plugin de salida «%s», en el callback %s, LSN asociado %X/%X" # FIXME must quote callback name? Need a translator: comment? -#: replication/logical/logical.c:702 +#: replication/logical/logical.c:726 #, c-format 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:873 replication/logical/logical.c:918 -#: replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format 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:1241 replication/logical/logical.c:1290 -#: replication/logical/logical.c:1331 replication/logical/logical.c:1417 -#: replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "el flujo lógico requiere una función callback %s" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, c-format 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/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" - -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "el nombre de slot no debe ser null" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "el array de opciones no debe ser null" -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "el array debe ser unidimensional" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "el array no debe contener nulls" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 +#: utils/adt/jsonb.c:1302 #, c-format msgid "array must have even number of elements" msgstr "el array debe tener un número par de elementos" -#: replication/logical/logicalfuncs.c:251 +#: replication/logical/logicalfuncs.c:227 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "ya no se pueden recibir cambios desde el slot de replicación «%s»" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 +#: 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 "Este slot nunca ha reservado WAL previamente, o ha sido invalidado." -#: 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 "el plugin de salida de decodificación lógica «%s» produce salida binaria, pero «%s» espera datos textuales" -#: 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 "no se puede consultar o manipular orígenes de replicación cuando max_replication_slots = 0" -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "no se puede manipular orígenes de replicación durante la recuperación" @@ -18929,18 +19642,21 @@ msgstr "no existe el origen de replicación «%s»" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "no se pudo encontrar un OID de origen de replicación libre" +#| msgid "could not find free replication origin OID" +msgid "could not find free replication origin ID" +msgstr "no se pudo encontrar un ID de origen de replicación libre" #: replication/logical/origin.c:355 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" -msgstr "no se pudo eliminar el origen de replicación con OID %d, en uso por el PID %d" +#| msgid "could not drop replication origin with OID %d, in use by PID %d" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "no se pudo eliminar el origen de replicación con ID %d, en uso por el PID %d" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "el origen de replicación con OID %u no existe" +#| msgid "replication origin with OID %u does not exist" +msgid "replication origin with ID %d does not exist" +msgstr "el origen de replicación con ID %d no existe" #: replication/logical/origin.c:741 #, c-format @@ -18954,47 +19670,50 @@ msgstr "no se pudo encontrar una estructura de replicación libre, incremente ma #: replication/logical/origin.c:790 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "se recuperó estado de replicación de nodo %u a %X/%X" +#| msgid "recovered replication state of node %u to %X/%X" +msgid "recovered replication state of node %d to %X/%X" +msgstr "se recuperó estado de replicación de nodo %d a %X/%X" #: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "el checkpoint del slot de replicación tiene suma de verificación errónea %u, se esperaba %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 "el origen de replicación con OID %d ya está activo para el PID %d" +#| msgid "replication origin with OID %d is already active for PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "el origen de replicación con ID %d ya está activo para el 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 "no se pudo encontrar un slot libre para el estado del origen de replicación con OID %u" +#| msgid "could not find free replication state slot for replication origin with OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "no se pudo encontrar un slot libre para el estado del origen de replicación con ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Aumente max_replication_slots y reintente." -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "no se puede establecer un destino de replicación cuando ya hay uno definido" -#: 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 "no hay un destino de replicación configurado" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "el nombre de origen de replicación «%s» está reservado" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Los nombres de origen que empiezan con «pg_» están reservados." @@ -19026,427 +19745,517 @@ msgstr "la relación de destino de replicación lógica «%s.%s» usa columnas d 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/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, 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:4180 -#: replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, 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:4184 -#: replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, 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:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, 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" -#: replication/logical/snapbuild.c:625 +#: replication/logical/snapbuild.c:634 #, c-format msgid "initial slot snapshot too large" msgstr "el snapshot inicial del slot es demasiado grande" # FIXME: snapshot? instantánea? -#: replication/logical/snapbuild.c:679 +#: replication/logical/snapbuild.c:688 #, 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] "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:1358 replication/logical/snapbuild.c:1465 -#: replication/logical/snapbuild.c:1996 +#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 +#: replication/logical/snapbuild.c:2003 #, 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:1360 +#: replication/logical/snapbuild.c:1369 #, c-format msgid "There are no running transactions." msgstr "No hay transacciones en ejecución." -#: replication/logical/snapbuild.c:1416 +#: replication/logical/snapbuild.c:1425 #, 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:1418 replication/logical/snapbuild.c:1442 +#: replication/logical/snapbuild.c:1427 replication/logical/snapbuild.c:1451 #, 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:1440 +#: replication/logical/snapbuild.c:1449 #, 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:1467 +#: replication/logical/snapbuild.c:1476 #, c-format msgid "There are no old transactions anymore." msgstr "Ya no hay transacciones antiguas en ejecución." # FIXME "snapbuild"? -#: replication/logical/snapbuild.c:1864 +#: replication/logical/snapbuild.c:1871 #, 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:1870 +#: replication/logical/snapbuild.c:1877 #, 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:1941 +#: replication/logical/snapbuild.c:1948 #, 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:1998 +#: replication/logical/snapbuild.c:2005 #, 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:2070 +#: replication/logical/snapbuild.c:2077 #, c-format msgid "could not parse file name \"%s\"" msgstr "no se pudo interpretar el nombre de archivo «%s»" -#: 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 "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:727 replication/logical/tablesync.c:770 +#: replication/logical/tablesync.c:422 +#, 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 "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará para activar «two_phase»" + +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 #, 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:734 +#: replication/logical/tablesync.c:738 #, 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:858 +#: replication/logical/tablesync.c:795 +#, 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 "no se pudo obtener información de la lista de columnas para la tabla «%s.%s» del editor (publisher): %s" + +#: replication/logical/tablesync.c:974 +#, 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 "no se pudo obtener información de la cláusula WHERE para la tabla «%s.%s» del editor (publisher): %s" + +#: replication/logical/tablesync.c:1111 #, 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:1059 +#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "el usuario «%s» no puede replicar en relaciones con seguridad de registros activa: «%s»" + +#: replication/logical/tablesync.c:1338 #, 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): %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1380 #, c-format msgid "replication origin \"%s\" already exists" msgstr "el origen de replicación «%s» ya existe" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1393 #, 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): %s" -#: replication/logical/worker.c:518 -#, c-format -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:593 replication/logical/worker.c:719 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "el formato de datos binarios es incorrecto en columna de replicación lógica %d" -#: replication/logical/worker.c:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format -#| msgid "could not read from streaming transaction's changes file \"%s\": %m" msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" msgstr "no se pudo leer el archivo de cambios de transacción en flujo «%s»: leídos sólo %zu de %zu bytes" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2251 +#: replication/logical/worker.c:2582 +#, c-format +#| msgid "invalid standby message type \"%c\"" +msgid "invalid logical replication message type \"%c\"" +msgstr "el tipo «%c» de mensaje de replicación lógica no es válido" + +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "el flujo de datos del publisher ha terminado" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, 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:2550 +#: replication/logical/worker.c:3059 #, 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:2564 +#: replication/logical/worker.c:3070 #, 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:2586 +#: replication/logical/worker.c:3096 #, 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á por un cambio de parámetro" -#: replication/logical/worker.c:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format -#| msgid "could not read from streaming transaction's subxact file \"%s\": %m" msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" msgstr "no se pudo leer el archivo subxact de transacción en flujo «%s»: leídos sólo %zu de %zu bytes" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, 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:3170 +#: replication/logical/worker.c:3679 #, 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:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "la suscripción no tiene un slot de replicación establecido" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "la suscripción «%s» ha sido inhabilitada debido a un error" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "iniciando el ignorado en la replicación lógica de la transacción en el LSN %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "finalizó el ignorado en la replicación lógica de la transacción en el LSN %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +#| msgid "subscription \"%s\" already exists" +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "el «skip-LSN» de la suscripción «%s» ha sido borrado" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "La ubicación de WAL (LSN) de término %X/%X de la transacción remota no coincidió con el skip-LSN %X/%X." + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s»" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» en la transacción %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» en la transacción %u, concluida en %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación de destino «%s.%s» en la transacción %u, concluida en %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación de destino «%s.%s» columna «%s» en la transacción %u, concluida en %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "proto_version no válido" -#: replication/pgoutput/pgoutput.c:201 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version «%s» fuera de rango" -#: replication/pgoutput/pgoutput.c:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "sintaxis de publication_names no válida" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "el cliente envió proto_version=%d pero sólo soportamos el protocolo %d o inferior" -#: replication/pgoutput/pgoutput.c:295 +#: replication/pgoutput/pgoutput.c:432 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "el cliente envió proto_version=%d pero sólo soportamos el protocolo %d o superior" -#: replication/pgoutput/pgoutput.c:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "parámetro publication_names faltante" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "la proto_version=%d no soporta flujo, se necesita %d o superior" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "se solicitó flujo, pero no está soportado por plugin de salida" -#: replication/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, 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 "la proto_version=%d solicitada no soporta «two-phase commit», se necesita %d o superior" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +#| msgid "streaming requested, but not supported by output plugin" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "«two-phase commit» fue solicitado, pero no está soportado por el plugin de salida" + +#: replication/slot.c:205 #, 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:189 +#: replication/slot.c:214 #, 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:202 +#: replication/slot.c:227 #, 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:204 +#: replication/slot.c:229 #, 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:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "el slot de replicación «%s» ya existe" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "todos los slots de replicación están en uso" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Libere uno o incremente max_replication_slots." -#: replication/slot.c:402 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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 "no existe el slot de replicación «%s»" -#: replication/slot.c:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, 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:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "no se pudo eliminar el directorio «%s»" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, 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:1065 +#: replication/slot.c:1133 #, 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:1250 +#: replication/slot.c:1145 +#, 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" + +#: replication/slot.c:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "terminando el proceso %d para liberar el slot de replicación «%s»" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, 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:1747 +#: replication/slot.c:1827 #, 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:1754 +#: replication/slot.c:1834 #, 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:1790 +#: replication/slot.c:1870 #, 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" +msgstr "suma de verificación no coincidente 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:1824 +#: replication/slot.c:1904 #, 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:1826 +#: replication/slot.c:1906 #, 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:1830 +#: replication/slot.c:1910 #, 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:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Cambie wal_level a replica o superior." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" -msgstr "demasiados slots de replicacion activos antes del apagado" +msgstr "demasiados slots de replicación activos antes del apagado" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "el LSN de wal de destino no es válido" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "no se puede avanzar el slot de replicación «%s»" -#: replication/slotfuncs.c:666 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "no puede avanzar un slot de replicación a %X/%X, el mínimo es %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 "no se puede copiar el slot de replicación física «%s» como slot de replicación lógica" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "no se puede copiar el slot de replicación lógica «%s» como slot de replicación física" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "no puede copiar un slot de replicación que no ha reservado WAL" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "no se pudo copiar el slot de replicación «%s»" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "El slot de replicación de origen fue modificado incompatiblemente durante la operación de copia." -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "no se puede copiar el slot de replicación lógica no terminado «%s»" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Reintente cuando el confirmed_flush_lsn del slot de replicación de origen sea válido." @@ -19486,416 +20295,428 @@ 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:161 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "terminando el proceso walreceiver debido a una orden del administrador" -#: replication/walreceiver.c:289 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "no se pudo conectar al servidor primario: %s" -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:339 #, 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:337 +#: replication/walreceiver.c:340 #, 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:348 +#: replication/walreceiver.c:351 #, 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:402 +#: replication/walreceiver.c:404 #, 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:406 +#: replication/walreceiver.c:408 #, 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:435 +#: replication/walreceiver.c:437 #, 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:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "replicación terminada por el servidor primario" -#: replication/walreceiver.c:473 +#: replication/walreceiver.c:476 #, 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:562 +#: replication/walreceiver.c:565 #, 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:600 +#: replication/walreceiver.c:603 #, 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:616 replication/walreceiver.c:1036 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "no se pudo cerrar archivo de segmento %s: %m" -#: replication/walreceiver.c:735 +#: replication/walreceiver.c:738 #, 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:927 +#: replication/walreceiver.c:933 #, 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:525 storage/smgr/md.c:1321 +#: replication/walsender.c:521 +#, c-format +#| msgid "cannot read from logical replication slot \"%s\"" +msgid "cannot use %s with a logical replication slot" +msgstr "no se puede usar %s con un slot de replicación lógica" + +#: replication/walsender.c:638 storage/smgr/md.c:1364 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "no se pudo posicionar (seek) al fin del archivo «%s»: %m" -#: replication/walsender.c:529 +#: replication/walsender.c:642 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "no se pudo posicionar (seek) al comienzo del archivo «%s»: %m" -#: replication/walsender.c:580 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM no se ha ejecutado antes de START_REPLICATION" - -#: replication/walsender.c:609 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "no se puede usar un slot de replicación lógica para replicación física" -#: replication/walsender.c:678 +#: replication/walsender.c:785 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "el punto de inicio solicitado %X/%X del timeline %u no está en la historia de este servidor" -#: replication/walsender.c:681 +#: replication/walsender.c:788 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "La historia de este servidor bifurcó desde el timeline %u en %X/%X." -#: replication/walsender.c:725 +#: replication/walsender.c:832 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "el punto de inicio solicitado %X/%X está más adelante que la posición de sincronización (flush) de WAL de este servidor %X/%X" +#: replication/walsender.c:1015 +#, c-format +#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "valor no reconocido para la opción de CREATE_REPLICATION_SLOT «%s»: «%s»" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:975 +#: replication/walsender.c:1100 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s no debe ser ejecutado dentro de una transacción" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:985 +#: replication/walsender.c:1110 #, c-format msgid "%s must be called inside a transaction" msgstr "%s no debe ser ejecutado dentro de una transacción" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:991 +#: replication/walsender.c:1116 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s debe llamarse en una transacción de modo de aislamiento REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:997 +#: replication/walsender.c:1122 #, c-format msgid "%s must be called before any query" msgstr "%s debe ser llamado antes de cualquier consulta" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s no está permitido en una subtransacción" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "no se puede leer del slot de replicación lógica «%s»" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Este slot ha sido invalidado porque excedió el máximo del tamaño de reserva." -#: replication/walsender.c:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "terminando el proceso walsender luego de la promoción" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "no puede ejecutar nuevas órdenes mientras el «WAL sender» está en modo de apagarse" -#: replication/walsender.c:1587 +#: replication/walsender.c:1739 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "no puede ejecutar órdenes SQL en el «WAL sender» para replicación física" -#: replication/walsender.c:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "se recibió orden de replicación: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 -#: tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 -#: tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "transacción abortada, las órdenes serán ignoradas hasta el fin de bloque de transacción" -#: replication/walsender.c:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "se encontró fin de archivo inesperado en la conexión standby" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "el tipo «%c» de mensaje del standby no es válido" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "mensaje de tipo «%c» inesperado" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "terminando el proceso walsender debido a que se agotó el tiempo de espera de replicación" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "ya existe una regla llamada «%s» para la relación «%s»" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, c-format +#| msgid "portal \"%s\" cannot be run" +msgid "relation \"%s\" cannot have rules" +msgstr "el portal «%s» no puede tener reglas" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "las acciones de regla en OLD no están implementadas" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "Use vistas o triggers en su lugar." -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "las acciones de regla en NEW no están implementadas" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "Use triggers en su lugar." -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "las reglas INSTEAD NOTHING en SELECT no están implementadas" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "Use vistas en su lugar." -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "las reglas de múltiples acciones en SELECT no están implementadas" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "las reglas en SELECT deben tener una acción 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 "las reglas en SELECT no deben contener sentencias que modifiquen datos en WITH" -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "las calificaciones de eventos no están implementadas para las reglas en SELECT" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "«%s» ya es una vista" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "la regla de vista para «%s» debe llamarse «%s»" -#: rewrite/rewriteDefine.c:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "no se puede convertir la tabla particionada «%s» en vista" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "no se puede convertir la partición «%s» en vista" -#: 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 "no se pudo convertir la tabla «%s» en vista porque no está vacía" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "no se pudo convertir la tabla «%s» en vista porque tiene triggers" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "En particular, la tabla no puede estar involucrada en relaciones de llave foránea." -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "no se pudo convertir la tabla «%s» en vista porque tiene índices" -#: 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 "no se pudo convertir la tabla «%s» en vista porque tiene tablas hijas" -#: 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 "no se pudo convertir la tabla «%s» en vista porque tiene tablas padres" -#: 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 "no se pudo convertir la tabla «%s» en vista porque tiene seguridad de registros activada" -#: 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 "no se pudo convertir la tabla «%s» en vista porque tiene políticas de seguridad de registros" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "no se pueden tener múltiples listas RETURNING en una regla" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "listas de RETURNING no están soportadas en reglas condicionales" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "listas de RETURNING no están soportadas en reglas que no estén marcadas INSTEAD" -#: rewrite/rewriteDefine.c:543 +#: rewrite/rewriteDefine.c:544 #, c-format -#| msgid "view rule for \"%s\" must be named \"%s\"" msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "la regla que no es de vista para «%s» no debe llamarse «%s»" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "la lista de destinos en la regla de SELECT tiene demasiadas entradas" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "la lista de RETURNING tiene demasiadas entradas" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "no se puede convertir en vista una relación que contiene columnas eliminadas" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "no se puede crear una lista RETURNING para una relación que contiene columnas eliminadas" -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "la entrada de destino %d de la regla de SELECT tiene un nombre de columna diferente de «%s»" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "La entrada de destino de SELECT tiene nombre «%s»." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "el destino %d de la regla de SELECT tiene un tipo diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:754 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "el destino %d de la lista de RETURNING tiene un tipo diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "La entrada de destino de SELECT tiene un tipo «%s», pero la columna tiene tipo «%s»." -#: rewrite/rewriteDefine.c:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "una entrada de la lista RETURNING tiene tipo %s, pero la columna tiene tipo %s." -#: rewrite/rewriteDefine.c:775 +#: rewrite/rewriteDefine.c:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "el destino %d de la regla de SELECT tiene un tamaño diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:777 +#: rewrite/rewriteDefine.c:778 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "el destino %d de la lista RETURNING tiene un tamaño diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:794 +#: rewrite/rewriteDefine.c:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "la lista de destinos de regla de SELECT tiene muy pocas entradas" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "la lista de RETURNING tiene muy pocas entradas" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "no existe la regla «%s» para la relación «%s»" -#: rewrite/rewriteDefine.c:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "no se permite cambiar el nombre de una regla ON SELECT" @@ -19940,160 +20761,160 @@ msgstr "la columna «%s» sólo puede actualizarse a DEFAULT" msgid "multiple assignments to same column \"%s\"" msgstr "hay múltiples asignaciones a la misma columna «%s»" -#: rewrite/rewriteHandler.c:2137 rewrite/rewriteHandler.c:3999 +#: rewrite/rewriteHandler.c:2141 rewrite/rewriteHandler.c:4046 #, 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:2222 +#: rewrite/rewriteHandler.c:2226 #, 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:2542 +#: rewrite/rewriteHandler.c:2546 msgid "Junk view columns are not updatable." msgstr "Las columnas «basura» de vistas no son actualizables." -#: rewrite/rewriteHandler.c:2547 +#: rewrite/rewriteHandler.c:2551 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:2550 +#: rewrite/rewriteHandler.c:2554 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:2553 +#: rewrite/rewriteHandler.c:2557 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:2614 +#: rewrite/rewriteHandler.c:2618 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Las vistas que contienen DISTINCT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2617 +#: rewrite/rewriteHandler.c:2621 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Las vistas que contienen GROUP BY no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2620 +#: rewrite/rewriteHandler.c:2624 msgid "Views containing HAVING are not automatically updatable." msgstr "Las vistas que contienen HAVING no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2623 +#: rewrite/rewriteHandler.c:2627 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:2626 +#: rewrite/rewriteHandler.c:2630 msgid "Views containing WITH are not automatically updatable." msgstr "Las vistas que contienen WITH no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2629 +#: rewrite/rewriteHandler.c:2633 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:2641 +#: rewrite/rewriteHandler.c:2645 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:2644 +#: rewrite/rewriteHandler.c:2648 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:2647 +#: rewrite/rewriteHandler.c:2651 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:2654 rewrite/rewriteHandler.c:2658 -#: rewrite/rewriteHandler.c:2666 +#: rewrite/rewriteHandler.c:2658 rewrite/rewriteHandler.c:2662 +#: rewrite/rewriteHandler.c:2670 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:2669 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Las vistas que contienen TABLESAMPLE no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2693 +#: rewrite/rewriteHandler.c:2697 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:3170 +#: rewrite/rewriteHandler.c:3174 #, 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:3178 +#: rewrite/rewriteHandler.c:3182 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "no se puede actualizar la columna «%s» vista «%s»" -#: rewrite/rewriteHandler.c:3663 +#: rewrite/rewriteHandler.c:3673 #, 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:3674 +#: rewrite/rewriteHandler.c:3684 #, 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:3688 +#: rewrite/rewriteHandler.c:3698 #, 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:3692 +#: rewrite/rewriteHandler.c:3702 #, 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:3697 +#: rewrite/rewriteHandler.c:3707 #, 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:3927 rewrite/rewriteHandler.c:3935 -#: rewrite/rewriteHandler.c:3943 +#: rewrite/rewriteHandler.c:3974 rewrite/rewriteHandler.c:3982 +#: rewrite/rewriteHandler.c:3990 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Las vistas con reglas DO INSTEAD condicionales no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:4048 +#: rewrite/rewriteHandler.c:4095 #, 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:4050 +#: rewrite/rewriteHandler.c:4097 #, 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:4055 +#: rewrite/rewriteHandler.c:4102 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, 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:4062 +#: rewrite/rewriteHandler.c:4109 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, 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:4082 +#: rewrite/rewriteHandler.c:4129 #, 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:4139 +#: rewrite/rewriteHandler.c:4186 #, 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" @@ -20144,57 +20965,57 @@ msgstr "parámetro Snowball no reconocido: «%s»" msgid "missing Language parameter" msgstr "falta un parámetro Language" -#: statistics/extended_stats.c:178 +#: statistics/extended_stats.c:179 #, 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/mcv.c:1371 utils/adt/jsonfuncs.c:1952 +#: statistics/mcv.c:1372 #, 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" -#: storage/buffer/bufmgr.c:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "no se pueden acceder tablas temporales de otras sesiones" -#: storage/buffer/bufmgr.c:843 +#: storage/buffer/bufmgr.c:851 #, 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:930 +#: storage/buffer/bufmgr.c:938 #, 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:932 +#: storage/buffer/bufmgr.c:940 #, 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:1031 +#: storage/buffer/bufmgr.c:1039 #, 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:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "no se pudo escribir el bloque %u de %s" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, 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:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "escribiendo el bloque %u de la relación %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "snapshot demasiado antiguo" @@ -20209,148 +21030,174 @@ msgstr "no hay ningún búfer local disponible" msgid "cannot access temporary tables during a parallel operation" msgstr "no se pueden acceder tablas temporales durante una operación paralela" -#: storage/file/buffile.c:323 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "no se pudo abrir archivo temporal «%s» del BufFile «%s»: %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 "no se pudo determinar el tamaño del archivo temporal «%s» del BufFile «%s»: %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "no se pudo borrar el conjunto de archivos compartidos «%s»: %m" +#| msgid "could not delete file \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "no se pudo borrar el “fileset” «%s»: %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:306 storage/smgr/md.c:866 +#: storage/file/buffile.c:941 storage/smgr/md.c:325 storage/smgr/md.c:904 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "no se pudo truncar el archivo «%s»: %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 "no se pudo sincronizar (flush) datos «sucios»: %m" -#: storage/file/fd.c:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "no se pudo determinar el tamaño de los datos «sucios»: %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "no se pudo ejecutar munmap() mientras se sincronizaban (flush) datos: %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format 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:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit falló: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1057 #, 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:1028 +#: storage/file/fd.c:1058 #, 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:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 -#: storage/file/fd.c:2677 +#: 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 "se agotaron los descriptores de archivo: %m; libere e intente nuevamente" -#: storage/file/fd.c:1453 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "archivo temporal: ruta «%s», tamaño %lu" -#: storage/file/fd.c:1584 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "no se pudo crear el directorio temporal «%s»: %m" -#: storage/file/fd.c:1591 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "no se pudo crear el subdirectorio temporal «%s»: %m" -#: storage/file/fd.c:1784 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "no se pudo crear el archivo temporal «%s»: %m" -#: storage/file/fd.c:1818 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir el archivo temporal «%s»: %m" -#: storage/file/fd.c:1859 +#: storage/file/fd.c:1939 #, 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:1947 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "no se pudo borrar el archivo «%s»: %m" -#: storage/file/fd.c:2127 +#: storage/file/fd.c:2207 #, 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:2392 storage/file/fd.c:2451 +#: storage/file/fd.c:2472 storage/file/fd.c:2531 #, 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:2496 +#: storage/file/fd.c:2576 #, 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:2653 +#: storage/file/fd.c:2733 #, 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:3183 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "archivo inesperado en directorio de archivos temporales: «%s»" -#: storage/file/fd.c:3312 +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizando el directorio de datos (syncfs), transcurrido: %ld.%02d s, ruta actual: %s" + +#: storage/file/fd.c:3401 #, 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 +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizando el directorio de datos (pre-fsync), transcurrido: %ld.%02d s, ruta actual: %s" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizando el directorio de datos (fsync), transcurrido: %ld.%02d s, ruta actual: %s" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "reseteando relaciones «unlogged» (init), transcurrido: %ld.%02d s, ruta actual: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "reseteando relaciones «unlogged» (cleanup), transcurrido: %ld.%02d s, ruta actual: %s" + +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "no se puede adjuntar a un SharedFileSet que ya está destruido" -#: storage/ipc/dsm.c:351 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "el segmento de control de memoria compartida dinámica está corrupto" -#: storage/ipc/dsm.c:415 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "el segmento de control de memoria compartida dinámica no es válido" -#: storage/ipc/dsm.c:592 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "demasiados segmentos de memoria compartida dinámica" @@ -20405,41 +21252,46 @@ msgstr "no se pudo crear el segmento de memoria compartida «%s»: %m" msgid "could not close shared memory segment \"%s\": %m" msgstr "no se pudo cerrar el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "no se pudo duplicar el «handle» para «%s»: %m" -#: storage/ipc/procarray.c:3892 +#: storage/ipc/procarray.c:3846 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "la base de datos «%s» está siendo utilizada por transacciones preparadas" -#: storage/ipc/procarray.c:3924 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3878 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "debe ser superusuario para terminar proceso de superusuario" -#: storage/ipc/procarray.c:3931 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3885 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 "debe ser miembro del rol cuyo proceso se está terminando o ser miembro de 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 "aún esperando que el proceso servidor con PID %lu acepte ProcSignalBarrier" + +#: storage/ipc/shm_mq.c:384 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "no se puede enviar un mensaje de tamaño %zu mediante la cola de memoria compartida" -#: storage/ipc/shm_mq.c:694 +#: storage/ipc/shm_mq.c:719 #, c-format msgid "invalid message size %zu in shared memory queue" 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:4258 -#: storage/lmgr/lock.c:4323 storage/lmgr/lock.c:4673 -#: storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 -#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 +#: 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:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -20470,76 +21322,77 @@ 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 utils/adt/mcxtfuncs.c:204 +#: storage/ipc/signalfuncs.c:72 #, c-format -msgid "PID %d is not a PostgreSQL server process" +#| msgid "PID %d is not a PostgreSQL server process" +msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d no es un proceso servidor de PostgreSQL" -#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1458 -#: utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "no se pudo enviar la señal al proceso %d: %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "debe ser superusuario para cancelar una consulta de superusuario" -#: 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 "debe ser miembro del rol cuya consulta se está cancelando o ser miembro de 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 "no se pudo comprobar la existencia del proceso de servidor con PID %d: %m" -#: storage/ipc/signalfuncs.c:183 +#: 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] "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:214 +#: storage/ipc/signalfuncs.c:219 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" no debe ser negativo" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:271 #, 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:268 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 "Considere usar %s, que es parte del servidor, en su lugar." -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 #, 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:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "la recuperación aún está esperando después de %ld.%03d ms: %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "la recuperación terminó de esperar después de %ld.%03d ms: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "cancelando la sentencia debido a un conflicto con la recuperación" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "La transacción del usuario causó un «deadlock» con la recuperación." @@ -20612,124 +21465,124 @@ msgstr "se ha detectado un deadlock" msgid "See server log for query details." msgstr "Vea el registro del servidor para obtener detalles de las consultas." -#: storage/lmgr/lmgr.c:831 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "mientras se actualizaba la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:834 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "mientras se borraba la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:837 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "mientras se bloqueaba la tupla (%u,%u) de la relación «%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 "mientras se bloqueaba la versión actualizada (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:843 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "mientras se insertaba la tupla de índice (%u,%u) en la relación «%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 "mientras se verificaba la unicidad de la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:849 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "mientras se verificaba la tupla actualizada (%u,%u) en la relación «%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 "mientras se verificaba una restricción de exclusión en la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1113 +#: storage/lmgr/lmgr.c:1141 #, 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:1119 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid de la base de datos %u" -#: storage/lmgr/lmgr.c:1124 +#: storage/lmgr/lmgr.c:1152 #, 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:1131 +#: storage/lmgr/lmgr.c:1159 #, 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:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "transacción %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "transacción virtual %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "token especulativo %u de la transacción %u" -#: storage/lmgr/lmgr.c:1156 +#: storage/lmgr/lmgr.c:1184 #, 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:1164 +#: storage/lmgr/lmgr.c:1192 #, 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:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "candado consultivo [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "tipo de locktag %d no reconocido" -#: 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 "no se puede adquirir candado en modo %s en objetos de la base de datos mientras la recuperación está en proceso" -#: 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 "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:4259 storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 +#: 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 "Puede ser necesario incrementar max_locks_per_transaction." -#: storage/lmgr/lock.c:3300 storage/lmgr/lock.c:3368 storage/lmgr/lock.c:3484 +#: 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 "no se puede hacer PREPARE mientras se mantienen candados a nivel de sesión y transacción simultáneamente sobre el mismo objeto" @@ -20749,82 +21602,82 @@ msgstr "Puede ser necesario ejecutar menos transacciones al mismo tiempo, o incr msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "no hay suficientes elementos en RWConflictPool para registrar un potencial conflicto read/write" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "«default_transaction_isolation» está definido a «serializable»." -#: 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 "Puede usar «SET default_transaction_isolation = 'repeatable read'» para cambiar el valor por omisión." -#: storage/lmgr/predicate.c:1746 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "una transacción que importa un snapshot no debe ser READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1825 utils/time/snapmgr.c:569 +#: 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 "no se pudo importar el snapshot solicitado" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "El proceso de origen con PID %d ya no está en ejecución." -#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:2499 -#: storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Puede ser necesario incrementar max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:4120 storage/lmgr/predicate.c:4156 -#: storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 -#: storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 -#: storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 -#: storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 -#, c-format -msgid "could not serialize access due to read/write dependencies among transactions" -msgstr "no se pudo serializar el acceso debido a dependencias read/write entre transacciones" - #: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 #: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 #: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 #: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 #: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format +msgid "could not serialize access due to read/write dependencies among transactions" +msgstr "no se pudo serializar el acceso debido a dependencias read/write entre transacciones" + +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 +#, c-format msgid "The transaction might succeed if retried." msgstr "La transacción podría tener éxito si es reintentada." -#: 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 "la cantidad de conexiones standby pedidas excede max_wal_senders (actualmente %d)" -#: storage/lmgr/proc.c:1555 +#: storage/lmgr/proc.c:1531 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "el proceso %d evitó un deadlock para %s en %s reordenando la cola después de %ld.%03d ms" -#: storage/lmgr/proc.c:1570 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "el proceso %d detectó un deadlock mientras esperaba %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1579 +#: storage/lmgr/proc.c:1555 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "el proceso %d aún espera %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1586 +#: storage/lmgr/proc.c:1562 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "el proceso %d adquirió %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1603 +#: storage/lmgr/proc.c:1579 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "el proceso %d no pudo adquirir %s en %s después de %ld.%03d ms" @@ -20834,85 +21687,80 @@ msgstr "el proceso %d no pudo adquirir %s en %s después de %ld.%03d ms" msgid "page verification failed, calculated checksum %u but expected %u" msgstr "la suma de verificación falló, se calculó %u pero se esperaba %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 "los punteros de página están corruptos: inferior = %u, superior = %u, especial = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "puntero de ítem corrupto: %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 "los largos de ítem están corruptos: total %u, espacio disponible %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 "puntero de ítem corrupto: desplazamiento = %u, tamaño = %u" -#: storage/smgr/md.c:435 +#: storage/smgr/md.c:470 #, 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:450 +#: storage/smgr/md.c:485 #, c-format msgid "could not extend file \"%s\": %m" msgstr "no se pudo extender el archivo «%s»: %m" -#: 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:456 +#: storage/smgr/md.c:491 #, 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:668 +#: storage/smgr/md.c:706 #, 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:684 +#: storage/smgr/md.c:722 #, 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:738 +#: storage/smgr/md.c:776 #, 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:743 +#: storage/smgr/md.c:781 #, 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:837 +#: storage/smgr/md.c:875 #, 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:892 +#: storage/smgr/md.c:930 #, 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:1286 +#: storage/smgr/md.c:1329 #, 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:1300 +#: storage/smgr/md.c:1343 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "no se pudo abrir el archivo «%s» (bloque buscado %u): %m" @@ -20927,8 +21775,8 @@ msgstr "no se puede llamar a la función «%s» mediante la interfaz fastpath" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "llamada a función fastpath: «%s» (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 -#: tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "duración: %s ms" @@ -20958,348 +21806,348 @@ msgstr "el tamaño de argumento %d no es válido en el mensaje de llamada a func msgid "incorrect binary data format in function argument %d" msgstr "el formato de datos binarios es incorrecto en argumento %d a función" -#: tcop/postgres.c:445 tcop/postgres.c:4738 +#: tcop/postgres.c:444 tcop/postgres.c:4823 #, c-format msgid "invalid frontend message type %d" msgstr "el tipo de mensaje de frontend %d no es válido" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "sentencia: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "duración: %s ms sentencia: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "no se pueden insertar múltiples órdenes en una sentencia preparada" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "duración: %s ms parse: %s: %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "no existe una sentencia preparada sin nombre" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" -msgstr "el mensaje de enlace (bind) tiene %d formatos de parámetro pero %d parámetros" +msgstr "el mensaje de «bind» tiene %d formatos de parámetro pero %d parámetros" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" -msgstr "el mensaje de enlace (bind) entrega %d parámetros, pero la sentencia preparada «%s» requiere %d" +msgstr "el mensaje de «bind» entrega %d parámetros, pero la sentencia preparada «%s» requiere %d" -#: tcop/postgres.c:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" -msgstr "el formato de datos binarios es incorrecto en el parámetro de enlace %d" +msgstr "el formato de datos binarios es incorrecto en el parámetro de «bind» %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "duración: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "no existe el portal «%s»" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "ejecutar fetch desde" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "ejecutar" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "duración: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "parámetros: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "razón para abortar: conflicto en la recuperación" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "El usuario mantuvo el búfer compartido «clavado» por demasiado tiempo." -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "El usuario mantuvo una relación bloqueada por demasiado tiempo." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "El usuario estaba o pudo haber estado usando un tablespace que debía ser eliminado." -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "La consulta del usuario pudo haber necesitado examinar versiones de tuplas que debían eliminarse." -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2502 #, c-format 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:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portal «%s» parámetro $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portal «%s» parámetro $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "portal sin nombre, parámetro %d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "portal sin nombre, parámetro %d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "terminando la conexión debido a una señal SIGQUIT inesperada" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "terminando la conexión debido a una falla en otro proceso servidor" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, 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 "Postmaster ha ordenado que este proceso servidor cancele la transacción en curso y finalice la conexión, porque otro proceso servidor ha terminado anormalmente y podría haber corrompido la memoria compartida." -#: tcop/postgres.c:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Dentro de un momento debería poder reconectarse y repetir la consulta." -#: tcop/postgres.c:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "terminando la conexión debido a una orden de apagado inmediato" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "excepción de coma flotante" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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 "Se ha recibido una señal de una operación de coma flotante no válida. Esto puede significar un resultado fuera de rango o una operación no válida, como una división por cero." -#: tcop/postgres.c:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "cancelando la autentificación debido a que se agotó el tiempo de espera" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "terminando el proceso autovacuum debido a una orden del administrador" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "terminando el proceso de replicación lógica debido a una orden del administrador" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "terminando la conexión debido a un conflicto con la recuperación" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "terminando la conexión debido a una orden del administrador" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "se ha perdido la conexión al cliente" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "cancelando la sentencia debido a que se agotó el tiempo de espera de candados (locks)" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "cancelando la sentencia debido a que se agotó el tiempo de espera de sentencias" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "cancelando tarea de autovacuum" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "cancelando la sentencia debido a una petición del usuario" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format 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:3369 +#: tcop/postgres.c:3383 #, 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 sesiones abiertas inactivas" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "límite de profundidad de stack alcanzado" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Incremente el parámetro de configuración «max_stack_depth» (actualmente %dkB), después de asegurarse que el límite de profundidad de stack de la plataforma es adecuado." -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "«max_stack_depth» no debe exceder %ldkB." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Incremente el límite de profundidad del stack del sistema usando «ulimit -s» o el equivalente de su sistema." -#: tcop/postgres.c:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argumentos de línea de órdenes no válidos para proceso servidor: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: argumento de línea de órdenes no válido: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: no se ha especificado base de datos ni usuario" -#: tcop/postgres.c:4640 +#: tcop/postgres.c:4725 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "subtipo %d de mensaje CLOSE no válido" -#: tcop/postgres.c:4675 +#: tcop/postgres.c:4760 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "subtipo %d de mensaje DESCRIBE no válido" -#: tcop/postgres.c:4759 +#: tcop/postgres.c:4844 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "la invocación «fastpath» de funciones no está soportada en conexiones de replicación" -#: tcop/postgres.c:4763 +#: tcop/postgres.c:4848 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "el protocolo extendido de consultas no está soportado en conexiones de replicación" -#: tcop/postgres.c:4940 +#: tcop/postgres.c:5025 #, c-format 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:638 +#: tcop/pquery.c:641 #, 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" +msgstr "el mensaje de «bind» tiene %d formatos de resultado pero la consulta tiene %d columnas" -#: tcop/pquery.c:941 tcop/pquery.c:1703 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "el cursor sólo se puede desplazar hacia adelante" -#: tcop/pquery.c:942 tcop/pquery.c:1704 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Declárelo con SCROLL para permitirle desplazar hacia atrás." #. 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 "no se puede ejecutar %s en una transacción de sólo lectura" #. 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 "no se puede ejecutar %s durante una operación paralela" #. 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 "no se puede ejecutar %s durante la recuperación" #. 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 "no se puede ejecutar %s durante una operación restringida por seguridad" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, 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 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "debe ser superusuario para ejecutar CHECKPOINT" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "debe ser superusuario o tener privilegos de pg_checkpoint para ejecutar CHECKPOINT" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -21450,19 +22298,19 @@ msgstr "marca de afijo «%s» no válida con el valor de marca «long»" msgid "could not open dictionary file \"%s\": %m" msgstr "no se pudo abrir el archivo de diccionario «%s»: %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "la expresión regular no es válida: %s" #: tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 -#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:16630 gram.y:16647 +#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:17812 gram.y:17829 #, c-format msgid "syntax error" msgstr "error de sintaxis" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "alias de afijo «%s» no válido" @@ -21492,17 +22340,17 @@ msgstr "el número de aliases excede el número especificado %d" msgid "affix file contains both old-style and new-style commands" msgstr "el archivo de «affix» contiene órdenes en estilos antiguo y nuevo" -#: 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 "la cadena es demasiado larga para tsvector (%d bytes, máximo %d bytes)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "línea %d del archivo de configuración «%s»: «%s»" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "conversión desde un wchar_t a la codificación del servidor falló: %m" @@ -21534,145 +22382,198 @@ msgstr "no se pudo abrir el archivo de stopwords «%s»: %m" msgid "text search parser does not support headline creation" msgstr "el analizador de búsqueda en texto no soporta creación de encabezados (headline)" -#: tsearch/wparser_def.c:2578 +#: tsearch/wparser_def.c:2577 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "parámetro de encabezado (headline) no reconocido: «%s»" -#: tsearch/wparser_def.c:2597 +#: tsearch/wparser_def.c:2596 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords debería ser menor que MaxWords" -#: tsearch/wparser_def.c:2601 +#: tsearch/wparser_def.c:2600 #, c-format msgid "MinWords should be positive" msgstr "MinWords debería ser positivo" -#: tsearch/wparser_def.c:2605 +#: tsearch/wparser_def.c:2604 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord debería ser >= 0" -#: tsearch/wparser_def.c:2609 +#: tsearch/wparser_def.c:2608 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments debería ser >= 0" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:421 +#, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "no se pudo eliminar el archivo permanente de estadísticas «%s»: %m" + +#: utils/activity/pgstat.c:1209 +#, c-format +#| msgid "unrecognized statistics kind \"%s\"" +msgid "invalid statistics kind: \"%s\"" +msgstr "tipo de estadísticas no válido: «%s»" + +#: utils/activity/pgstat.c:1289 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "no se pudo abrir el archivo temporal de estadísticas «%s»: %m" + +#: utils/activity/pgstat.c:1395 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "no se pudo escribir el archivo temporal de estadísticas «%s»: %m" + +#: utils/activity/pgstat.c:1404 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "no se pudo cerrar el archivo temporal de estadísticas «%s»: %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo temporal de estadísticas de «%s» a «%s»: %m" + +#: utils/activity/pgstat.c:1461 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "no se pudo abrir el archivo de estadísticas «%s»: %m" + +#: utils/activity/pgstat.c:1617 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "el archivo de estadísticas «%s» está corrupto" + +#: utils/activity/pgstat_function.c:118 +#, c-format +#| msgid "cast function must be a normal function" +msgid "function call to dropped function" +msgstr "invocación a una función eliminada" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "reseteando estadísticas existentes para el tipo %s, db=%u, oid=%u" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "el identificador es demasiado largo" -#: 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 "El identificador debe ser menor a %d caracteres." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "palabra clave no reconocida: «%s»" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Palabra clave de ACL debe ser «group» o «user»." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "falta un nombre" -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Debe venir un nombre después de una palabra clave «group» o «user»." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "falta un signo «=»" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "carácter de modo no válido: debe ser uno de «%s»" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "debe venir un nombre después del signo «/»" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "usando el cedente por omisión con ID %u" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "el array ACL contiene tipo de datos incorrecto" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "los array de ACL debe ser unidimensional" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "los arrays de ACL no pueden contener valores nulos" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "basura extra al final de la especificación de la ACL" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "la opción de grant no puede ser otorgada de vuelta a quien la otorgó" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "existen privilegios dependientes" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Use CASCADE para revocarlos también." -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert ya no está soportado" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove ya no está soportado" -#: 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 "tipo de privilegio no reconocido: «%s»" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "no existe la función «%s»" -#: utils/adt/acl.c:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "debe ser miembro del rol «%s»" #: 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/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "no se pudo determinar el tipo de dato de entrada" @@ -21683,16 +22584,16 @@ msgid "input data type is not an array" msgstr "el tipo de entrada no es un 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:1768 utils/adt/numeric.c:4231 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 -#: utils/adt/varlena.c:3422 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "entero fuera de rango" @@ -21792,7 +22693,7 @@ 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:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: 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 @@ -21815,18 +22716,18 @@ msgstr "Elemento de array inesperado." msgid "Unmatched \"%c\" character." msgstr "Carácter «%c» desemparejado." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2490 #, 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:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Basura después de la llave derecha de cierre." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 -#: utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:5883 #, c-format msgid "invalid number of dimensions: %d" msgstr "número incorrecto de dimensiones: %d" @@ -21841,7 +22742,7 @@ msgstr "opciones de array no válidas" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "los datos binarios tienen el tipo de elemento de array %u (%s) en lugar del esperado %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 +#: 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" @@ -21852,7 +22753,7 @@ msgstr "no hay una función binaria de entrada para el tipo %s" 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:1599 utils/adt/multirangetypes.c:449 +#: 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" @@ -21865,11 +22766,11 @@ msgstr "no está implementada la obtención de segmentos de arrays de largo fijo #: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 #: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 -#: utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 -#: utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5869 +#: utils/adt/arrayfuncs.c:5895 utils/adt/arrayfuncs.c:5906 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "número incorrecto de subíndices del array" @@ -21911,79 +22812,79 @@ 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:3629 utils/adt/arrayfuncs.c:3800 -#: utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:4191 #, 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:3978 utils/adt/multirangetypes.c:2742 -#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:3978 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 "no se pudo identificar una función de hash para el tipo %s" -#: utils/adt/arrayfuncs.c:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4106 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:5282 +#: utils/adt/arrayfuncs.c:5283 #, c-format msgid "data type %s is not an array type" msgstr "el tipo %s no es un array" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5338 #, c-format msgid "cannot accumulate null arrays" msgstr "no se pueden acumular arrays nulos" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5366 #, c-format msgid "cannot accumulate empty arrays" msgstr "no se pueden acumular arrays vacíos" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5393 utils/adt/arrayfuncs.c:5399 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "no se pueden acumular arrays de distinta dimensionalidad" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5767 utils/adt/arrayfuncs.c:5807 #, 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:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 #, c-format msgid "Dimension array must be one dimensional." msgstr "El array de dimensiones debe ser unidimensional." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5875 utils/adt/arrayfuncs.c:5901 #, c-format msgid "dimension values cannot be null" msgstr "los valores de dimensión no pueden ser null" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5907 #, 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:6184 +#: utils/adt/arrayfuncs.c:6185 #, 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:6461 +#: utils/adt/arrayfuncs.c:6462 #, c-format msgid "thresholds must be one-dimensional array" msgstr "los umbrales deben ser un array unidimensional" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6467 #, c-format msgid "thresholds array must not contain NULLs" msgstr "el array de umbrales no debe contener nulos" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6700 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "el número de elementos a recortar debe estar entre 0 y %d" @@ -22024,211 +22925,218 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "la conversión de codificación de %s a ASCII no está soportada" #. 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:4050 +#: 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:4660 -#: utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 -#: utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 -#: utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "la sintaxis de entrada no es válida para tipo %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:179 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 "el valor «%s» está fuera de rango para el tipo %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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 -#: 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "división por cero" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "«char» fuera de rango" -#: 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 +#, c-format +#| msgid "could not open file \"%s\": %s" +msgid "could not compute %s hash: %s" +msgstr "no se pudo calcular el hash %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 "el modificador de tipo no es válido" -#: utils/adt/date.c:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "la precisión de TIME(%d)%s no debe ser negativa" -#: utils/adt/date.c:80 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisión de TIME(%d)%s fue reducida al máximo permitido, %d" -#: 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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "fecha fuera de rango: «%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 "fecha fuera de rango" -#: 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 "valor en campo de fecha fuera de rango: %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 "fecha fuera de rango: %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "no se pueden restar fechas infinitas" -#: 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 "fecha fuera de rango para timestamp" -#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 -#, c-format -msgid "date units \"%s\" not supported" -msgstr "las unidades de «date» «%s» no están soportadas" - -#: utils/adt/date.c:1235 -#, c-format -msgid "date units \"%s\" not recognized" -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 -#: 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:5417 utils/adt/timestamp.c:5431 -#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 -#: utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 -#: utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 -#: utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 -#: utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: 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 +#, c-format +#| msgid "date units \"%s\" not supported" +msgid "unit \"%s\" not supported for type %s" +msgstr "unidades «%s» no soportada para el tipo %s" + +#: 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 +#, c-format +#| msgid "date units \"%s\" not recognized" +msgid "unit \"%s\" not recognized for type %s" +msgstr "unidad «%s» no reconocida para el tipo %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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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 fuera de rango" -#: 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:4476 #, c-format msgid "time out of range" msgstr "hora fuera de rango" -#: 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 "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:2435 -#: 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 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 "tamaño «preceding» o «following» no válido en ventana deslizante" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "las unidades de «time» «%s» no son reconocidas" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "desplazamiento de huso horario fuera de rango" -#: utils/adt/date.c:2986 utils/adt/date.c:3006 -#, c-format -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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 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 "el huso horario «%s» no es reconocido" -#: utils/adt/date.c:3129 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: 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 "el intervalo de huso horario «%s» no debe especificar meses o días" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valor de hora/fecha fuera de rango: «%s»" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Quizás necesite una configuración diferente de «datestyle»." -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valor de interval fuera de rango: «%s»" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "desplazamiento de huso horario fuera de rango: «%s»" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, c-format 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»." @@ -22238,20 +23146,21 @@ msgstr "Este nombre de huso horario aparece en el archivo de configuración para msgid "invalid Datum pointer" msgstr "puntero a Datum no válido" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "tamaño no válido: «%s»" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Nombre de unidad de tamaño no válido: «%s»." -#: utils/adt/dbsize.c:824 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Unidades válidas son «bytes«, «kB», «MB», «GB» y «TB»." +#| msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "Unidades aceptables son «bytes«, «kB», «MB», «GB», «TB» y «PB»." #: utils/adt/domains.c:92 #, c-format @@ -22304,9 +23213,9 @@ 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." #: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 -#: 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 +#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:529 +#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 +#: jsonpath_scan.l:578 #, c-format msgid "invalid input syntax for type %s" msgstr "sintaxis de entrada no válida para tipo %s" @@ -22343,390 +23252,385 @@ msgstr "no se pudo determinar el tipo enum efectivo" msgid "enum %s contains no values" msgstr "el enum %s no contiene valores" -#: utils/adt/float.c:88 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "valor fuera de rango: desbordamiento" -#: utils/adt/float.c:96 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "valor fuera de rango: desbordamiento por abajo" -#: utils/adt/float.c:265 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "«%s» está fuera de rango para el tipo 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» 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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallint fuera de rango" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, 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:3824 utils/adt/numeric.c:3936 +#: 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 "cero elevado a una potencia negativa es indefinido" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:3736 -#: utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, 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:3674 -#: utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, c-format msgid "cannot take logarithm of a negative number" msgstr "no se puede calcular logaritmo de un número negativo" -#: 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 "la entrada está fuera de rango" -#: utils/adt/float.c:2798 +#: utils/adt/float.c:2796 #, c-format 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:1708 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, 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:1719 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, 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:1724 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, 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:1738 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "el límite superior no puede ser igual al límite inferior" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "especificación de formato no válida para un valor de interval" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Los Interval no están ... a valores determinados de fechas de calendario." -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "«EEEE» debe ser el último patrón usado" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "«9» debe ir antes de «PR»" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "«0» debe ir antes de «PR»" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "hay múltiples puntos decimales" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "no se puede usar «V» y un punto decimal simultáneamente" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "no se puede usar «S» dos veces" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "no se puede usar «S» y «PL»/«MI»/«SG»/«PR» simultáneamente" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "no se puede usar «S» y «MI» simultáneamente" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "no se puede usar «S» y «PL» simultáneamente" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "no se puede usar «S» y «SG» simultáneamente" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "no se puede usar «PR» y «S»/«PL»/«MI»/«SG» simultáneamente" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "no se puede usar «EEEE» dos veces" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "«EEEE» es incompatible con otros formatos" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format 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 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "separador de formato «datetime» no válido: «%s»" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "«%s» no es un número" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "falló la conversión de mayúsculas: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 -#: utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "no se pudo determinar qué ordenamiento usar para la función %s" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" -msgstr "combinacion invalida de convenciones de fecha" +msgstr "combinación no válida de convenciones de fecha" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr " No mezclar convenciones de semana Gregorianas e ISO en una plantilla formateada" -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "valores en conflicto para le campo \"%s\" en cadena de formato" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Este valor se contradice con un seteo previo para el mismo tipo de campo" -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" -msgstr "cadena de texto fuente muy corta para campo formateado \"%s\" " +msgstr "cadena de texto fuente muy corta para campo formateado \"%s\"" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "El campo requiere %d caractéres, pero solo quedan %d." -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." -msgstr "Si su cadena de texto no es de ancho modificado, trate de usar el modificador \"FM\" " +msgstr "Si su cadena de texto no es de ancho modificado, trate de usar el modificador \"FM\"" -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 -#: utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "el valor «%s» no es válido para «%s»" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "El campo requiere %d caracteres, pero sólo %d pudieron ser analizados." -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "El valor debe ser un entero." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "el valor para «%s» en la cadena de origen está fuera de rango" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "El valor debe estar en el rango de %d a %d." -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "El valor dado no concuerda con ninguno de los valores permitidos para este campo." -#: 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "cadena traducida en cadena de formato es demasiado larga" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "separador de formato «%c» desemparejado" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "carácter de formato «%s» desemparejado" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "el campo de formato «%s» sólo está soportado en to_char" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "cadena de entrada no válida para «Y,YYY»" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "cadena de entrada muy corta para formato de fecha/hora" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "quedan caracteres al final de la cadena de entrada después del formato fecha/hora" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "falta el huso horario en la cadena de entrada para el tipo timestamptz" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptz fuera de rango" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "el formato de fecha/hora tiene huso horario pero no hora" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" msgstr "falta el huso horario en la cadena de entrada del tipo timetz" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetz fuera de rango" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "el formato de fecha/hora no tiene fecha ni hora" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "la hora «%d» no es válida para el reloj de 12 horas" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Use el reloj de 24 horas, o entregue una hora entre 1 y 12." -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "no se puede calcular el día del año sin conocer el año" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "«EEEE» no está soportado en la entrada" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "«RN» no está soportado en la entrada" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "no se permiten referencias a directorios padre («..»)" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "no se permiten rutas absolutas" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "la ruta debe estar en o debajo del directorio actual" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 -#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 -#: utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "el tamaño solicitado es demasiado grande" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "no se pudo posicionar (seek) el archivo «%s»: %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "el tamaño del archivo es demasiado grande" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "Debe ser superusuario leer archivos con adminpack 1.0." @@ -22741,8 +23645,8 @@ msgstr "especificación de línea no válida: A y B no pueden ser ambos cero" msgid "invalid line specification: must be two distinct points" msgstr "especificación de línea no válida: deben ser dos puntos distintos" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 -#: utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "se pidieron demasiados puntos" @@ -22752,98 +23656,58 @@ msgstr "se pidieron demasiados puntos" msgid "invalid number of points in external \"path\" value" msgstr "el número de puntos no es válido en el valor «path» externo" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "la función «dist_lb» no está implementada" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "la función «dist_bl» no está implementada" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "la función «close_sl» no está implementada" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "la función «close_lb» no está implementada" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "el número de puntos no es válido en «polygon» externo" -#: utils/adt/geo_ops.c:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "la función «poly_distance» no está implementada" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "la función «path_center» no está implementada" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "no se puede convertir un camino abierto en polygon" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "el radio no es válido en el valor «circle» externo" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "no se puede convertir un círculo de radio cero a polygon" -#: utils/adt/geo_ops.c:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "debe pedir al menos 2 puntos" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector tiene demasiados elementos" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "datos de int2vector no válidos" -#: utils/adt/int.c:243 utils/adt/oid.c:215 utils/adt/oid.c:296 -#, c-format -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:1616 -#: utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 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 "el tamaño de paso no puede ser cero" -#: 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:4302 +#: 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:4364 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint fuera de rango" -#: utils/adt/int8.c:1403 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID fuera de rango" @@ -22853,23 +23717,23 @@ msgstr "OID fuera de rango" msgid "key value must be scalar, not array, composite, or json" msgstr "el valor de llave debe ser escalar, no array, composite o json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, c-format msgid "could not determine data type for argument %d" msgstr "no se pudo determinar el tipo de dato para el argumento %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 #, c-format msgid "field name must not be null" msgstr "el nombre de campo no debe ser null" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 #, c-format msgid "argument list must have even number of elements" msgstr "la lista de argumentos debe tener un número par de elementos" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "El argumento de %s debe consistir de llaves y valores alternados." @@ -22884,18 +23748,18 @@ msgstr "el argumento %d no puede ser null" msgid "Object keys should be text." msgstr "Las llaves de un objeto deben ser de texto." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "un array debe tener dos columnas" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, c-format msgid "null value not allowed for object key" msgstr "no se permite el valor nulo como llave en un objeto" -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "las dimensiones de array no coinciden" @@ -22910,68 +23774,68 @@ msgstr "la cadena es demasiado larga para representarla como cadena jsonb." msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Debido a una restricción de la implementación, las cadenas en jsonb no pueden exceder los %d bytes." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "argumento %d: la llave no puede ser null" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "las llaves de un objeto deben ser cadenas" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "no se puede convertir un null jsonb a tipo %s" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "no se puede convertir un string jsonb a tipo %s" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "no se puede convertir un numérico jsonb a tipo %s" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "no se puede convertir un booleano jsonb a tipo %s" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "no se puede convertir un array jsonb a tipo %s" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "no se puede convertir un objeto jsonb a tipo %s" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "no se puede convertir un array u objeto jsonb a tipo %s" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "el número de pares en objeto jsonb excede el máximo permitido (%zu)" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "el número de elementos del array jsonb excede el máximo permitido (%zu)" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "el tamaño total de los elementos del array jsonb excede el máximo de %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:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, c-format 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" @@ -23007,19 +23871,19 @@ msgid "jsonb subscript in assignment must not be null" msgstr "subíndice jsonb en asignación no puede ser nulo" #: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 -#: utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 -#: utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "no se puede invocar %s en un escalar" #: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 -#: utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "no se puede invocar %s en un array" -#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:494 #, c-format msgid "unsupported Unicode escape sequence" msgstr "secuencia de escape Unicode no soportado" @@ -23039,177 +23903,182 @@ msgstr "no se puede obtener el largo de array de un escalar" 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:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "no se puede invocar %s en un no-objeto" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "no se puede desconstruir un array como un objeto" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "no se puede desconstruir un escalar" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "no se pueden extraer elementos de un escalar" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "no se pudo extraer elementos de un objeto" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, c-format msgid "cannot call %s on a non-array" msgstr "no se puede invocar %s en un no-array" -#: utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2544 -#: utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "se esperaba un array JSON" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Vea el valor de la llave «%s»." -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Vea el elemento %s de la llave «%s»." -#: utils/adt/jsonfuncs.c:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Veo el elemento de array %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, 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:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, 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:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, 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" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, 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:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "no se puede invocar %s en un objeto" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "no se puede eliminar de un escalar" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, 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:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "no se puede definir una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "valor JSON no debe ser null" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, 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:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "no se puede eliminar una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, 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:4944 utils/adt/jsonfuncs.c:4975 -#: utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "no se puede reemplazar una llave existente" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "La ruta asume que la llave es un objeto compuesto, pero es un valor escalar." -#: utils/adt/jsonfuncs.c:5049 +#: utils/adt/jsonfuncs.c:4937 #, 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:5153 +#: utils/adt/jsonfuncs.c:5041 #, 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:5170 +#: utils/adt/jsonfuncs.c:5058 #, c-format msgid "path element at position %d is out of range: %d" msgstr "el elemento de ruta en la posición %d está fuera de rango: %d" -#: utils/adt/jsonfuncs.c:5322 +#: utils/adt/jsonfuncs.c:5210 #, 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:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "elemento del array de opciones no es un string" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, 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:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "indicador erróneo en array de indicadores: «%s»" @@ -23292,7 +24161,7 @@ msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor num #: utils/adt/jsonpath_exec.c:1583 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" -msgstr "el operando izquiero del operador jsonpath %s no es un valor numérico escalar" +msgstr "el operando izquierdo del operador jsonpath %s no es un valor numérico escalar" #: utils/adt/jsonpath_exec.c:1590 #, c-format @@ -23364,7 +24233,7 @@ msgstr "el argumento levenshtein excede el largo máximo de %d caracteres" msgid "nondeterministic collations are not supported for LIKE" msgstr "los ordenamientos no determinísticos no están soportados para LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "no se pudo determinar qué ordenamiento (collation) usar para ILIKE" @@ -23379,27 +24248,27 @@ msgstr "los ordenamientos no determinísticos no están soportados para ILIKE" msgid "LIKE pattern must not end with escape character" msgstr "el patrón de LIKE debe no terminar con un carácter de escape" -#: 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 "cadena de escape no válida" -#: 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 "La cadena de escape debe ser vacía o un carácter." -#: utils/adt/like_support.c:988 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "no está soportada la comparación insensible a mayúsculas en bytea" -#: utils/adt/like_support.c:1090 +#: utils/adt/like_support.c:1115 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "no está soportada la comparación con expresiones regulares en bytea" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "valor de octeto no válido en valor «macaddr»: «%s»" @@ -23414,433 +24283,423 @@ msgstr "datos macaddr8 fuera de rango para convertir a 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 "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 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "debe ser superusuario para registrar contextos de memoria" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d no es un proceso servidor de PostgreSQL" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "el tablespace global nunca tiene bases de datos" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u no es un OID de tablespace" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "no reservado" -#: utils/adt/misc.c:488 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "no reservado (no puede ser nombre de función o de tipo)" -#: utils/adt/misc.c:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "reservado (puede ser nombre de función o de tipo)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "reservado" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "puede ser una etiqueta sola" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "requiere AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 -#: utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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 "la cadena no es un identificador válido: «%s»" -#: utils/adt/misc.c:761 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "La cadena tiene comillas dobles sin cerrar." -#: utils/adt/misc.c:775 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "El identificador en comillas no debe ser vacío." -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "No hay un identificador válido antes de «.»." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "No hay un identificador válido después de «.»." -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "el formato de log «%s» no está soportado" -#: utils/adt/misc.c:879 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "Los formatos de registro admitidos son \"stderr\" y \"csvlog\"." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Los formatos de log soportados son «stderr», «csvlog» y «jsonlog»." -#: 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 +#: 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 "literal de multirango mal formado: «%s»" -#: utils/adt/multirangetypes.c:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Falta llave izquierda." -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Se esperaba inicio de rango." -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." msgstr "Se esperaba una coma o el final del multirango." -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, 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:1001 +#: utils/adt/multirangetypes.c:1002 #, c-format msgid "multirange values cannot contain null members" msgstr "valores de multirango no pueden contener miembros nulos" -#: utils/adt/multirangetypes.c:1349 -#, c-format -msgid "range_agg must be called with a range" -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 "range_intersect_agg debe ser ejecutado con un multirango" - -#: utils/adt/network.c:111 +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "valor cidr no válido: «%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 "El valor tiene bits definidos a la derecha de la máscara" -#: 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 "no se pudo dar formato al valor 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 "familia de dirección no válida en valor «%s» externo" #. 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 "bits no válidos en valor «%s» externo" #. 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 "largo no válido en valor «%s» externo" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "valor externo «cidr» no válido" -#: 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 "largo de máscara no válido: %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "no se pudo dar formato al valor cidr: %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "no se pueden mezclar direcciones de familias diferentes" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "no se puede hacer AND entre valores inet de distintos tamaños" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "no se puede hacer OR entre valores inet de distintos tamaños" -#: 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 "el resultado está fuera de rango" -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "no se puede sustraer valores inet de distintos tamaños" -#: utils/adt/numeric.c:967 +#: utils/adt/numeric.c:1027 #, 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:973 +#: utils/adt/numeric.c:1033 #, 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:982 +#: utils/adt/numeric.c:1042 #, 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:1195 utils/adt/numeric.c:1209 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, 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:1200 +#: utils/adt/numeric.c:1262 #, 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" +#| msgid "NUMERIC scale %d must be between 0 and precision %d" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "escala NUMERIC %d debe estar entre %d y %d" -#: utils/adt/numeric.c:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificador de tipo NUMERIC no es válido" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "el valor de inicio no puede ser NaN" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "el valor de inicio no puede ser infinito" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "el valor de término no puede ser NaN" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "el valor de término no puede ser infinito" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "el tamaño de paso no puede ser NaN" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "el tamaño de paso no puede ser infinito" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "el factorial de un número negativo es indefinido" -#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 -#: utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 -#: utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "el valor excede el formato numeric" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 -#: utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "no se puede convertir NaN a %s" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 -#: utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "no se puede convertir infinito a %s" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn fuera de rango" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "desbordamiento de campo numeric" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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:7554 +#: utils/adt/numeric.c:7594 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Un campo con precisión %d, escala %d no puede contener un valor infinito." -#: utils/adt/numutils.c:154 -#, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "el valor «%s» está fuera de rango para un entero de 8 bits" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "datos de oidvector no válidos" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "el carácter solicitado es demasiado grande" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "el carácter pedido es demasiado largo para el encoding: %d" - -#: utils/adt/oracle_compat.c:1063 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "el carácter pedido no es válido para el encoding: %d" +#| msgid "COST must be positive" +msgid "character number must be positive" +msgstr "el número de carácter debe ser positivo" -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, c-format msgid "null character not permitted" msgstr "el carácter nulo no está permitido" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1041 utils/adt/oracle_compat.c:1094 +#, c-format +#| msgid "requested character too large for encoding: %d" +msgid "requested character too large for encoding: %u" +msgstr "el carácter pedido es demasiado largo para el encoding: %u" + +#: utils/adt/oracle_compat.c:1082 +#, c-format +#| msgid "requested character not valid for encoding: %d" +msgid "requested character not valid for encoding: %u" +msgstr "el carácter pedido no es válido para el encoding: %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 "el valor de percentil %g no está entre 0 y 1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "Aplique actualizaciones de paquetes de bibliotecas del sistema." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "no se pudo abrir el «collator» para la configuración regional «%s»: %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU no está soportado en este servidor" + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "no se pudo crear la configuración regional «%s»: %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." -msgstr "El sistema operativo no pudo encontrar datos de configuración regional para la configuración «%s»." +msgstr "El sistema operativo no pudo encontrar datos para la configuración regional «%s»." -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1608 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "los ordenamientos (collation) con valores collate y ctype diferentes no están soportados en esta plataforma" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "el proveedor de ordenamientos LIBC no está soportado en esta plataforma" -#: utils/adt/pg_locale.c:1568 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "los ordenamientos (collation) con valores collate y ctype diferentes no están soportados por ICU" - -#: 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 "no se pudo abrir el «collator» para la configuración regional «%s»: %s" - -#: utils/adt/pg_locale.c:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU no está soportado en este servidor" - -#: utils/adt/pg_locale.c:1609 +#: utils/adt/pg_locale.c:1652 #, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "la extensión «%s» no tiene versión actual, pero se especificó una versión" +#| 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 "la “collation” «%s» no tiene versión actual, pero una versión fue registrada" -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "el ordenamiento (collation) «%s» tiene una discordancia de versión" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "El ordenamiento en la base de datos fue creado usando la versión %s, pero el sistema operativo provee la versión %s." -#: utils/adt/pg_locale.c:1621 +#: utils/adt/pg_locale.c:1663 #, 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 "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 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "no se pudo cargar la configuración regional «%s»" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "no se pudo obtener la versión de «collation» para la configuración regional «%s»: código de error %lu" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" -msgstr "la codificación «%s» no estæ soportada por ICU" +msgstr "la codificación «%s» no está soportada por ICU" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "no se pudo abrir el conversor ICU para la codificación «%s»: %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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s falló: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "el carácter multibyte no es válido para esta configuración regional" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." -msgstr "La configuración regional LC_CTYPE del servidor es probablemente incompatible con la codificación de la base de datos." +msgstr "El LC_CTYPE de la configuración regional del servidor es probablemente incompatible con la codificación de la base de datos." #: utils/adt/pg_lsn.c:263 #, c-format @@ -23857,11 +24716,27 @@ msgstr "no se puede restar NaN de pg_lsn" msgid "function can only be called when server is in binary upgrade mode" msgstr "la función sólo puede invocarse cuando el servidor está en modo de actualización binaria" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:482 #, c-format msgid "invalid command name: \"%s\"" msgstr "nombre de orden no válido: «%s»" +#: utils/adt/pgstatfuncs.c:2114 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "destino de reset no reconocido: «%s»" + +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "El destino debe ser «archiver», «bgwriter», «recovery_prefetch» o «wal»." + +#: utils/adt/pgstatfuncs.c:2193 +#, c-format +#| msgid "invalid role OID: %u" +msgid "invalid subscription OID %u" +msgstr "OID de suscripción %u no válido" + #: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" @@ -23892,11 +24767,6 @@ msgstr "el resultado de la diferencia de rangos no sería contiguo" msgid "result of range union would not be contiguous" 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 "range_intersect_agg debe ser ejecutado con un rango" - #: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" @@ -23947,33 +24817,48 @@ 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:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, c-format msgid "regular expression failed: %s" msgstr "la expresión regular falló: %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 "opción de expresión regular no válida: «%.*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 "Si su intención era usar regexp_replace() con un parámetro de inicio, convierta el cuarto argumento a integer explícitamente." + +#: 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:11859 utils/misc/guc.c:11893 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "valor no válido para el parámetro «%s»: %d" + +#: utils/adt/regexp.c:922 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "la expresión regular SQL no puede contener más de dos separadores escape-comilla doble" #. 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 no soporta la opción «global»" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1298 #, c-format msgid "Use the regexp_matches function instead." msgstr "En su lugar, utilice la función regexp_matches." -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1486 #, c-format msgid "too many regular expression matches" msgstr "demasiadas coincidencias de la expresión regular" @@ -23988,18 +24873,18 @@ msgstr "existe más de una función llamada «%s»" msgid "more than one operator named %s" msgstr "existe más de un operador llamado %s" -#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8189 +#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8771 #, c-format msgid "missing argument" msgstr "falta un argumento" -#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8190 +#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8772 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Use NONE para denotar el argumento faltante de un operador unario." #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9777 utils/adt/ruleutils.c:9946 +#: utils/adt/ruleutils.c:10005 utils/adt/ruleutils.c:10174 #, c-format msgid "too many arguments" msgstr "demasiados argumentos" @@ -24011,7 +24896,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:3698 utils/adt/varlena.c:3703 +#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "la sintaxis de nombre no es válida" @@ -24036,83 +24921,83 @@ msgstr "se esperaba un nombre de tipo" msgid "improper type name" msgstr "el nombre de tipo no es válido" -#: 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 "inserción o actualización en la tabla «%s» viola la llave foránea «%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 no permite la mezcla de valores de clave nulos y no nulos." -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "la función «%s» debe ser ejecutada en INSERT" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "la función «%s» debe ser ejecutada en UPDATE" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "la función «%s» debe ser ejecutada en DELETE" -#: 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 "no hay una entrada en pg_constraint para el trigger «%s» en tabla «%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 "Elimine este trigger de integridad referencial y sus pares, y utilice ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2032 gram.y:3934 +#: utils/adt/ri_triggers.c:2098 gram.y:4172 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL no está implementada" -#: 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 "la consulta de integridad referencial en «%s» de la restricción «%s» en «%s» entregó un resultado inesperado" -#: 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 "Esto probablemente es causado por una regla que reescribió la consulta." -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "eliminar la partición «%s» viola la llave foránea «%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 "La llave (%s)=(%s) todavía es referida desde la tabla «%s»." -#: 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 "La llave (%s)=(%s) no está presente en la tabla «%s»." -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "La llave no está presente en la tabla «%s»." -#: 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 "update o delete en «%s» viola la llave foránea «%s» en la tabla «%s»" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "La llave todavía es referida desde la tabla «%s»." @@ -24175,135 +25060,119 @@ 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:5148 +#: utils/adt/ruleutils.c:2709 +#, c-format +#| msgid "cannot use subquery in index expression" +msgid "input is a query, not an expression" +msgstr "la entrada es una consulta, no una expresión" + +#: utils/adt/ruleutils.c:2721 +#, c-format +#| msgid "USING expression contains a whole-row table reference." +msgid "expression contains variables of more than one relation" +msgstr "la expresión contiene variables de más de una relación" + +#: utils/adt/ruleutils.c:2728 +#, c-format +#| msgid "argument of %s must not contain variables" +msgid "expression contains variables" +msgstr "la expresión contiene variables" + +#: utils/adt/ruleutils.c:5251 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la regla «%s» tiene el tipo de evento no soportado %d" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "la precisión de TIMESTAMP(%d)%s no debe ser negativa" -#: utils/adt/timestamp.c:115 +#: utils/adt/timestamp.c:116 #, c-format 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:12435 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12883 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp fuera de rango: «%s»" -#: utils/adt/timestamp.c:374 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "la precisión de timestamp(%d) debe estar entre %d y %d" -#: utils/adt/timestamp.c:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Los husos horarios numéricos deben tener «-» o «+» como su primer carácter." -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "huso horario numérico «%s» fuera de rango" -#: 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 fuera de rango: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:726 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "el timestamp no puede ser NaN" -#: 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 fuera de rango: «%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 "modificador de tipo INTERVAL no válido" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "la precisión de INTERVAL(%d) no debe ser negativa" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "la precisión de INTERVAL(%d) fue reducida al máximo permitido, %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "la precisión de interval(%d) debe estar entre %d y %d" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "no se pueden restar timestamps infinitos" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format msgid "origin out of range" msgstr "origen fuera de rango" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" 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 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format msgid "stride must be greater than zero" msgstr "el intervalo de paso (stride) debe ser mayor que cero" -#: 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: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: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: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: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: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:4368 utils/adt/timestamp.c:5338 +#: utils/adt/timestamp.c:4399 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "las unidades de interval «%s» no son reconocidas" +msgid "Months usually have fractional weeks." +msgstr "Los meses usualmente tienen semanas fraccionales." #: utils/adt/trigfuncs.c:42 #, c-format @@ -24411,58 +25280,63 @@ msgstr "la palabra es demasiado larga (%ld, máximo %ld bytes)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "la cadena es demasiado larga para tsvector (%ld bytes, máximo %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 "el array de lexemas no debe contener nulls" -#: utils/adt/tsvector_op.c:840 +#: utils/adt/tsvector_op.c:776 +#, c-format +#| msgid "lexeme array may not contain nulls" +msgid "lexeme array may not contain empty strings" +msgstr "el array de lexemas no debe contener cadenas vacías" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "el array de pesos no debe contener nulls" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "no se reconoce el peso: «%c»" -#: utils/adt/tsvector_op.c:2429 +#: utils/adt/tsvector_op.c:2434 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "la consulta ts_stat debe retornar una columna tsvector" -#: utils/adt/tsvector_op.c:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "la columna tsvector «%s» no existe" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "la columna «%s» no es de tipo tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "la columna de configuración «%s» no existe" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "la columna «%s» no es de tipo regconfig" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "la columna de configuración «%s» no debe ser nula" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "el nombre de la configuración de búsqueda «%s» debe ser calificada con esquema" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "la columna «%s» no es de un tipo textual" @@ -24482,7 +25356,7 @@ msgstr "no hay carácter escapado: «%s»" msgid "wrong position info in tsvector: \"%s\"" msgstr "información posicional incorrecta en tsvector: «%s»" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:413 #, c-format msgid "could not generate random values" msgstr "no se pudo generar valores aleatorios" @@ -24527,9 +25401,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:890 -#: utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3340 -#: utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "no se permite un largo negativo de subcadena" @@ -24554,7 +25428,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:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "el nuevo bit debe ser 0 o 1" @@ -24569,127 +25443,127 @@ 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:1516 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, 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:1209 utils/adt/varlena.c:1956 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 #, 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:1615 utils/adt/varlena.c:1628 +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, 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:1643 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "no se pudieron comparar las cadenas Unicode: %m" -#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "el ordenamiento falló: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "la generación de la llave de ordenamiento falló: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, 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:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, 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:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "la posición del campo no debe ser cero" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "especificador de tipo inconcluso en format()" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Para un «%%» solo, use «%%%%»." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "especificador de tipo no reconocido «%.*s» en format()" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "muy pocos argumentos para format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "el número está fuera de rango" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, 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:6069 +#: utils/adt/varlena.c:6043 #, 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:6114 +#: utils/adt/varlena.c:6088 #, 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:6240 +#: utils/adt/varlena.c:6214 #, 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:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "forma de normalización no válida: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "punto de código Unicode no válido: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Los escapes Unicode deben ser \\XXXX, \\+XXXXXX, \\uXXXX o \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "el argumento de ntile debe ser mayor que cero" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "el argumento de nth_value debe ser mayor que cero" #: utils/adt/xid8funcs.c:117 #, c-format -msgid "transaction ID %s is in the future" -msgstr "el ID de transacción %s está en el futuro" +msgid "transaction ID %llu is in the future" +msgstr "el ID de transacción %llu está en el futuro" -#: utils/adt/xid8funcs.c:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "datos externos pg_snapshot no válidos" @@ -24704,146 +25578,146 @@ msgstr "característica XML no soportada" msgid "This functionality requires the server to be built with libxml support." msgstr "Esta funcionalidad requiere que el servidor haya sido construido con soporte libxml." -#: 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 "nombre de codificación «%s» no válido" -#: 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 "comentario XML no válido" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "no es un documento 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 "instrucción de procesamiento XML no válida" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "el nombre de destino de la instrucción de procesamiento XML no puede ser «%s»." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "la instrucción de procesamiento XML no puede contener «?>»." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate no está implementado" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "no se pudo inicializar la biblioteca 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 tiene tipo char incompatible: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 tiene un tipo char incompatible: 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 "no se pudo instalar un gestor de errores 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 "Esto probablemente indica que la versión de libxml2 en uso no es compatible con los archivos de cabecera libxml2 con los que PostgreSQL fue construido." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "Valor de carácter no válido." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "Se requiere un espacio." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone acepta sólo 'yes' y 'no'." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "Declaración mal formada: falta la versión." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "Falta especificación de codificación en declaración de texto." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "Procesando declaración XML: se esperaba '?>'." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Código de error libxml no reconocido: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XML no soporta valores infinitos de fecha." -#: 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 no soporta valores infinitos de timestamp." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "consulta no válido" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4015 #, c-format msgid "invalid array for XML namespace mapping" msgstr "array no válido para mapeo de espacio de nombres 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 "El array debe ser bidimensional y el largo del segundo eje igual a 2." -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4040 #, c-format msgid "empty XPath expression" msgstr "expresion XPath vacía" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4092 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ni el espacio de nombres ni la URI pueden ser vacíos" -#: 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 "no se pudo registrar un espacio de nombres XML llamado «%s» con URI «%s»" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "el espacio de nombres DEFAULT no está soportado" -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4479 #, c-format msgid "row path filter must not be empty string" msgstr "el «path» de filtro de registros no debe ser la cadena vacía" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4510 #, c-format msgid "column path filter must not be empty string" msgstr "el «path» de filtro de columna no debe ser la cadena vacía" -#: utils/adt/xml.c:4655 +#: utils/adt/xml.c:4654 #, c-format msgid "more than one value returned by column XPath expression" msgstr "la expresión XPath de columna retornó más de un valor" @@ -24879,37 +25753,49 @@ 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:6324 +#: utils/cache/relcache.c:3753 +#, c-format +#| msgid "relfilenode value not set when in binary upgrade mode" +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "el valor de relfilende del “heap” no se definió en modo de actualización binaria" + +#: utils/cache/relcache.c:3761 +#, c-format +#| msgid "index relfilenode value not set when in binary upgrade mode" +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "petición inesperada de un nuevo relfilenode en modo de actualización binaria" + +#: utils/cache/relcache.c:6472 #, 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:6326 +#: utils/cache/relcache.c:6474 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Prosiguiendo de todas maneras, pero hay algo mal." -#: utils/cache/relcache.c:6648 +#: utils/cache/relcache.c:6796 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "no se pudo eliminar el archivo de cache «%s»: %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:590 #, c-format 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:767 +#: utils/cache/relmapper.c:836 #, 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:777 +#: utils/cache/relmapper.c:846 #, 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:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "el tipo record no ha sido registrado" @@ -24924,101 +25810,101 @@ msgstr "TRAP: ExceptionalCondition: argumentos erróneos en PID %d\n" msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" msgstr "TRAP: %s(«%s», Archivo: «%s», Línea: %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 "ocurrió un error antes de que el procesamiento de errores esté disponible\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "no se pudo reabrir «%s» para error estándar: %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "no se pudo reabrir «%s» para usar como salida estándar: %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 "[desconocido]" -#: 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 "falta un texto de mensaje de error" -#: 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 " en carácter %d" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DETALLE: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "HINT: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "CONSULTA: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "CONTEXTO: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "UBICACIÓN: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "UBICACIÓN: %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 "SENTENCIA: " -#: 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 "NOTICE" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ERROR" -#: 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 "PANIC" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "no se pudo encontrar la función «%s» en el archivo «%s»" @@ -25048,51 +25934,63 @@ msgstr "biblioteca «%s» incompatible: versión no coincide" msgid "Server is version %d, library is version %s." msgstr "Versión del servidor %d, versión de biblioteca %s." -#: utils/fmgr/dfmgr.c:346 +#: utils/fmgr/dfmgr.c:341 +#, c-format +#| msgid "incompatible library \"%s\": version mismatch" +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "biblioteca «%s» incompatible: ABI no coincide" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +#| msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "El servidor tiene ABI «%s», la librería tiene «%s»." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "El servidor tiene FUNC_MAX_ARGS = %d, la librería tiene %d" -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "El servidor tiene INDEX_MAX_KEYS = %d, la librería tiene %d" -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "El servidor tiene NAMEDATALEN = %d, la librería tiene %d" -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "El servidor tiene FLOAT8PASSBYVAL = %s, la librería tiene %s" -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "El bloque mágico tiene un largo inesperado, o una diferencia de relleno." -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "biblioteca «%s» incompatible: bloque mágico no coincide" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "no está permitido el acceso a la biblioteca «%s»" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "el nombre de macro no es válido en la ruta a biblioteca dinámica: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "se encontró componente de largo cero en el parámetro «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 "un componente en el parámetro «dynamic_library_path» no es una ruta absoluta" @@ -25117,372 +26015,375 @@ msgstr "Funciones invocables desde SQL necesitan PG_FUNCTION_INFO_V1(función) q 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 +#: utils/fmgr/fmgr.c:1985 #, 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" -#: 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 "función de validación de lenguaje %u invocada para el lenguaje %u en lugar de %u" -#: utils/fmgr/funcapi.c:420 +#: utils/fmgr/funcapi.c:498 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "no se pudo determinar el tipo verdadero de resultado para la función «%s» declarada retornando tipo %s" -#: utils/fmgr/funcapi.c:565 +#: utils/fmgr/funcapi.c:643 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "el argumento declarado %s no contiene un tipo de rango sino tipo %s" -#: utils/fmgr/funcapi.c:648 +#: utils/fmgr/funcapi.c:726 #, 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:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "el número de aliases no coincide con el número de columnas" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "no se entregó alias de columna" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "no se pudo encontrar descripción de registro de función que retorna record" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "no existe el directorio de datos «%s»" -#: utils/init/miscinit.c:319 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: utils/init/miscinit.c:327 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "el directorio de datos especificado «%s» no es un directorio" -#: utils/init/miscinit.c:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "el directorio de datos «%s» tiene dueño equivocado" -#: utils/init/miscinit.c:345 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "El servidor debe ser iniciado por el usuario dueño del directorio de datos." -#: utils/init/miscinit.c:363 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "el directorio de datos «%s» tiene permisos no válidos" -#: utils/init/miscinit.c:365 +#: utils/init/miscinit.c:380 #, c-format 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 #, 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" -#: utils/init/miscinit.c:718 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "no existe el rol con OID %u" -#: utils/init/miscinit.c:748 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "al rol «%s» no se le permite conectarse" -#: utils/init/miscinit.c:766 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "demasiadas conexiones para el rol «%s»" -#: utils/init/miscinit.c:826 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "se ha denegado el permiso para cambiar el usuario actual" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "el OID de rol no es válido: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "el sistema de bases de datos está apagado" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "no se pudo crear el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "no se pudo abrir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "no se pudo leer el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "el archivo de bloqueo «%s» está vacío" -#: utils/init/miscinit.c:1081 +#: 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 "Otro proceso servidor está iniciándose, o el archivo de bloqueo es remanente de una caída durante un inicio anterior." -#: utils/init/miscinit.c:1125 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "el archivo de bloqueo «%s» ya existe" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" -msgstr "¿Hay otro postgres (PID %d) corriendo en el directorio de datos «%s»?" +msgstr "¿Hay otro postgres (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" -msgstr "¿Hay otro postmaster (PID %d) corriendo en el directorio de datos «%s»?" +msgstr "¿Hay otro postmaster (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1134 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postgres (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1136 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postmaster (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1187 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "no se pudo eliminar el archivo de bloqueo antiguo «%s»: %m" -#: utils/init/miscinit.c:1189 +#: 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 "El archivo parece accidentalmente abandonado, pero no pudo ser eliminado. Por favor elimine el archivo manualmente e intente nuevamente." -#: utils/init/miscinit.c:1226 utils/init/miscinit.c:1240 -#: utils/init/miscinit.c:1251 +#: 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 "no se pudo escribir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10401 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10827 #, c-format msgid "could not read from file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "no se pudo abrir el archivo «%s»: %m; continuando de todas formas" -#: utils/init/miscinit.c:1517 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "el archivo de bloqueo «%s» tiene un PID erróneo: %ld en lugar de %ld" -#: utils/init/miscinit.c:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "«%s» no es un directorio de datos válido" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Falta el archivo «%s»." -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "El archivo «%s» no contiene datos válidos." -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "Puede ser necesario ejecutar initdb." -#: utils/init/miscinit.c:1584 +#: 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 "El directorio de datos fue inicializado por PostgreSQL versión %s, que no es compatible con esta versión %s." -#: utils/init/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "conexión de replicación autorizada: usuario=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "conexión autorizada: usuario=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr " base_de_datos=%s" -#: utils/init/postinit.c:263 +#: utils/init/postinit.c:267 #, c-format msgid " application_name=%s" msgstr " nombre_de_aplicación=%s" -#: utils/init/postinit.c:268 +#: utils/init/postinit.c:272 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL habilitado (protocolo=%s, cifrado=%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 (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 +#: utils/init/postinit.c:285 utils/init/postinit.c:286 +#: utils/init/postinit.c:291 utils/init/postinit.c:292 msgid "no" msgstr "no" -#: 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 "sí" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (autenticado=%s, cifrado=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "la base de datos «%s» ha desaparecido de pg_database" -#: utils/init/postinit.c:325 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Base de datos con OID %u ahora parece pertenecer a «%s»." -#: utils/init/postinit.c:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "la base de datos «%s» no acepta conexiones" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "permiso denegado a la base de datos «%s»" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "Usuario no tiene privilegios de conexión." -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "demasiadas conexiones para la base de datos «%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 "la configuración regional es incompatible con el sistema operativo" +msgstr "la configuración regional de la base de datos es incompatible con el sistema operativo" -#: 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 "La base de datos fue inicializada con LC_COLLATE «%s», el cual no es reconocido por setlocale()." -#: 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 "Recree la base de datos con otra configuración regional, o instale la configuración regional faltante." -#: 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 "La base de datos fueron inicializada con LC_CTYPE «%s», el cual no es reconocido por setlocale()." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "no hay roles definidos en esta base de datos" +#| msgid "collation \"%s\" has version mismatch" +msgid "database \"%s\" has a collation version mismatch" +msgstr "la base de datos «%s» tiene una discordancia de versión de ordenamiento (“collation”)" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Debería ejecutar imediatamente CREATE USER \"%s\" SUPERUSER;." +#| 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 "La base de datos fue creada usando la versión de ordenamiento %s, pero el sistema operativo provee la versión %s." + +#: utils/init/postinit.c:471 +#, 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 "Reconstruya todos los objetos en esta base de datos que usen el ordenamiento por omisión y ejecute ALTER COLLATION %s REFRESH COLLATION VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." -#: utils/init/postinit.c:798 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "nuevas conexiones de replicación no son permitidas durante el apagado de la base de datos" +msgid "no roles are defined in this database system" +msgstr "no hay roles definidos en esta base de datos" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "debe ser superusuario para conectarse durante el apagado de la base de datos" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Debería ejecutar imediatamente CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "debe ser superusuario para conectarse en modo de actualización binaria" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "las conexiones restantes están reservadas a superusuarios y no de replicación" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "debe ser superusuario o rol de replicación para iniciar el walsender" -#: utils/init/postinit.c:904 +#: utils/init/postinit.c:964 #, c-format msgid "database %u does not exist" msgstr "no existe la base de datos %u" -#: utils/init/postinit.c:993 +#: utils/init/postinit.c:1053 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Parece haber sido eliminada o renombrada." -#: utils/init/postinit.c:1011 +#: utils/init/postinit.c:1071 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Falta el subdirectorio de base de datos «%s»." -#: utils/init/postinit.c:1016 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "no se pudo acceder al directorio «%s»: %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -25551,1906 +26452,1981 @@ msgstr "secuencia de bytes no válida para codificación «%s»: %s" msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "carácter con secuencia de bytes %s en codificación «%s» no tiene equivalente en la codificación «%s»" -#: utils/misc/guc.c:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Sin Grupo" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Ubicaciones de Archivos" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Conexiones y Autentificación / Parámetros de Conexión" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Conexiones y Autentificación / Autentificación" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Conexiones y Autentificación / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Uso de Recursos / Memoria" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Uso de Recursos / Disco" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Uso de Recursos / Recursos del Kernel" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Uso de Recursos / Retardo de Vacuum por Costos" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Uso de Recursos / Escritor en Segundo Plano" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Uso de Recursos / Comportamiento Asíncrono" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Configuraciones" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Puntos de Control (Checkpoints)" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Archivado" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:804 +#| msgid "Write-Ahead Log / Recovery Target" +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead Log / Recuperación" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Recuperación desde Archivo" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Destino de Recuperación" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replicación / Servidores de Envío" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Replicación / Servidor Primario" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replicación / Servidores Standby" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replicación / Suscriptores" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Afinamiento de Consultas / Configuración de Métodos del Planner" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Afinamiento de Consultas / Constantes de Costo del Planner" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Afinamiento de Consultas / Optimizador Genético de Consultas" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Afinamiento de Consultas / Otras Opciones del Planner" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Reporte y Registro / Dónde Registrar" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Reporte y Registro / Cuándo Registrar" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Reporte y Registro / Qué Registrar" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Reporte y Registro / Título del Proceso" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Estadísticas / Monitoreo" -#: utils/misc/guc.c:778 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "Estadísticas / Recolector de Estadísticas de Consultas e Índices" +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "Estadísticas / Acumuladores de Consultas e Índices" -#: utils/misc/guc.c:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valores por Omisión de Conexiones / Comportamiento de Sentencias" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Valores por Omisión de Conexiones / Configuraciones Regionales y Formateo" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valores por Omisión de Conexiones / Precargado de Bibliotecas Compartidas" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Valores por Omisión de Conexiones / Otros Valores" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Manejo de Bloqueos" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Compatibilidad de Versión y Plataforma / Versiones Anteriores de PostgreSQL" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Compatibilidad de Versión y Plataforma / Otras Plataformas y Clientes" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Gestión de Errores" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Opciones Predefinidas" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Opciones Personalizadas" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Opciones de Desarrollador" -#: utils/misc/guc.c:860 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Unidades válidas para este parámetro son «B», «kB», «MB», «GB» y «TB»." +msgstr "Unidades aceptables para este parámetro son «B», «kB», «MB», «GB» y «TB»." -#: utils/misc/guc.c:897 +#: utils/misc/guc.c:955 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "Unidades válidas son para este parámetro son «us», «ms», «s», «min», «h» y «d»." +msgstr "Unidades aceptables son para este parámetro son «us», «ms», «s», «min», «h» y «d»." -#: utils/misc/guc.c:959 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Permitir el uso de planes de recorrido secuencial." -#: utils/misc/guc.c:969 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Permitir el uso de planes de recorrido de índice." -#: utils/misc/guc.c:979 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Permitir el uso de planes de recorrido de sólo-índice." -#: utils/misc/guc.c:989 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Permitir el uso de planes de recorrido de índice por mapas de bits." -#: utils/misc/guc.c:999 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Permitir el uso de planes de recorrido por TID." -#: utils/misc/guc.c:1009 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Permitir el uso de pasos explícitos de ordenamiento." -#: utils/misc/guc.c:1019 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "Permitir el uso de pasos incrementales de ordenamiento." -#: utils/misc/guc.c:1028 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Permitir el uso de planes de agregación a través de hash." -#: utils/misc/guc.c:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Permitir el uso de materialización de planes." -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Permitir el uso de memoización de planes." -#: utils/misc/guc.c:1058 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Permitir el uso de planes «nested-loop join»." -#: utils/misc/guc.c:1068 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Permitir el uso de planes «merge join»." -#: utils/misc/guc.c:1078 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Permitir el uso de planes «hash join»." -#: utils/misc/guc.c:1088 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Permitir el uso de planes «gather merge»." -#: utils/misc/guc.c:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Permitir el uso de joins por particiones." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Permitir el uso de agregación y agrupamiento por particiones." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Permitir el uso de planes «append» paralelos." -#: utils/misc/guc.c:1128 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Permitir el uso de planes «hash join» paralelos." -#: utils/misc/guc.c:1138 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "Permitir el uso de poda de particiones en tiempo de plan y ejecución." -#: utils/misc/guc.c:1139 +#: 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 "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:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "Permitir el uso de planes «append» asíncronos." -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Permitir el uso del optimizador genético de consultas." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Este algoritmo intenta planear las consultas sin hacer búsqueda exhaustiva." -#: utils/misc/guc.c:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Indica si el usuario actual es superusuario." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Permitir la publicación del servidor vía Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Recolectar tiempo de compromiso de transacciones." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Permitir conexiones SSL." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "También usar ssl_passphrase_command durante la recarga del servidor." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "Controla si ssl_passphrase_command se invoca durante un «reload» del servidor." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Da prioridad al orden de algoritmos de cifrado especificado por el servidor." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Forzar la sincronización de escrituras a disco." -#: utils/misc/guc.c:1228 -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." +#: utils/misc/guc.c:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "El servidor usará la llamada a sistema fsync() en varios lugares para asegurarse que las actualizaciones son escritas físicamente a disco. Esto asegura que las bases de datos se recuperarán a un estado consistente después de una caída de hardware o sistema operativo." -#: utils/misc/guc.c:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Continuar procesando después de una falla de suma de verificación." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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 "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." -#: utils/misc/guc.c:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Continuar procesando después de detectar encabezados de página dañados." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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 "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:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "Continuar procesando después de una falla de páginas no válidas." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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 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:1287 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Escribe páginas completas a WAL cuando son modificadas después de un punto de control." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1347 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 "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:1301 +#: utils/misc/guc.c:1360 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." 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:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Comprimir las imágenes de páginas completas al escribirlas a WAL." - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." msgstr "Escribir ceros a nuevos archivos WAL antes del primer uso." -#: utils/misc/guc.c:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." -msgstr "Reciclar archivos de WAL cambiándoles de nombre." +msgstr "Reciclar archivos WAL cambiándoles de nombre." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Registrar cada punto de control." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Registrar cada conexión exitosa." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Registrar el fin de una sesión, incluyendo su duración." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Registrar cada orden de replicación." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "Indica si el servidor actual tiene activas las aseveraciones (asserts) activas." -#: utils/misc/guc.c:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Terminar sesión ante cualquier error." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Reinicializar el servidor después de una caída de un proceso servidor." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." msgstr "Eliminar archivos temporales después de una caída de un proceso servidor." -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Registrar la duración de cada sentencia SQL ejecutada." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." -msgstr "Registrar cada arbol analizado de consulta " +msgstr "Registrar cada arbol analizado de consulta." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Registrar cada reescritura del arból analizado de consulta" -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Registrar el plan de ejecución de cada consulta." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Indentar los árboles de parse y plan." -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "Escribir estadísticas de parser al registro del servidor." -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "Escribir estadísticas de planner al registro del servidor." -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "Escribir estadísticas del executor al registro del servidor." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "Escribir estadísticas acumulativas al registro del servidor." -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 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:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Recolectar estadísticas sobre órdenes en ejecución." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "Recolectar estadísticas de actividad de la base de datos." -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 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:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O del WAL." -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 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:1555 +#: utils/misc/guc.c:1604 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:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Iniciar el subproceso de autovacuum." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Generar salida de depuración para LISTEN y NOTIFY." -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Emitir información acerca del uso de locks." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Emitir información acerca del uso de locks de usuario." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Emitir información acerca del uso de «lightweight locks»." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 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:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Registrar esperas largas de bloqueos." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "Registrar esperas por conflictos en recuperación de standby" -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "Registrar el nombre del host en la conexión." -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tratar expr=NULL como expr IS NULL." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Activar el uso de nombre de usuario locales a cada base de datos." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 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:1694 +#: utils/misc/guc.c:1743 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:1704 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "Estado por omisión de postergable de nuevas transacciones." -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1762 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:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Activar seguridad de registros." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 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:1732 +#: utils/misc/guc.c:1781 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Verificar definición de rutinas durante CREATE FUNCTION y CREATE PROCEDURE." -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Habilita el ingreso de elementos nulos en arrays." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 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:1768 +#: utils/misc/guc.c:1817 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:1777 +#: utils/misc/guc.c:1826 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:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "Emitir información acerca de uso de recursos durante los ordenamientos." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "Generar salida de depuración para recorrido sincronizado." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "Activar ordenamiento acotado usando «heap sort»." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Activar salida de depuración de WAL." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Mostrar si las fechas y horas se basan en tipos enteros." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 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:1863 +#: utils/misc/guc.c:1912 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:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Provoca que las cadenas '...' traten las barras inclinadas inversas (\\) en forma literal." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Permitir la sincronización de recorridos secuenciales." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 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:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "Permite conexiones y consultas durante la recuperación." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 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:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Muestra si hot standby está activo actualmente." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Permite modificaciones de la estructura de las tablas del sistema." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Deshabilita lectura de índices del sistema." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 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:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." -msgstr "Permite tablespaces que estén dentro de pg_tblspc, para pruebas." +msgstr "Permite tablespaces directamente dentro de pg_tblspc, para pruebas." -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 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:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "Al generar fragmentos SQL, entrecomillar todos los identificadores." -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 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:2001 +#: utils/misc/guc.c:2050 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:2011 +#: utils/misc/guc.c:2060 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:2021 +#: utils/misc/guc.c:2070 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:2022 +#: utils/misc/guc.c:2071 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?" -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Permitir compilación JIT." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "Registrar las funciones JIT compiladas con el depurador." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Escribe el bitcode LLVM para facilitar depuración de JIT." -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Permitir compilación JIT de expresiones." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "Registrar las funciones JIT compiladas con el analizador «perf»." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Permitir compilación JIT de deformación de tuplas." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 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:2119 +#: utils/misc/guc.c:2168 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:2137 -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:2186 +#| 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 "Define el tiempo a esperar antes de forzar un cambio al siguiente archivo WAL." -#: utils/misc/guc.c:2148 -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:2197 +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Define el tiempo máximo a esperar la autentificación durante el establecimiento de una conexión." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "Esto permite adjuntar un depurador al proceso." -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Definir el valor por omisión de toma de estadísticas." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 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:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 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:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 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:2204 +#: utils/misc/guc.c:2254 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:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: número de individuos en una población." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "Cero selecciona un valor por omisión razonable." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: número de iteraciones del algoritmo." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 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:2247 +#: utils/misc/guc.c:2297 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:2258 +#: utils/misc/guc.c:2308 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:2269 +#: utils/misc/guc.c:2319 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:2280 +#: utils/misc/guc.c:2330 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:2291 +#: utils/misc/guc.c:2341 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:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Número máximo de conexiones concurrentes." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "Número de conexiones reservadas para superusuarios." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Cantidad de memoria compartida dinámica reservada al iniciar." -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 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:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "Muestra el tamaño del área principal de memoria compartida del servidor (redondeado al número de MB más cercano)." + +#: utils/misc/guc.c:2410 +#| 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 "Muestra la cantidad de “huge pages” necesarias para el área de memoria compartida principal." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 indica que el valor no pudo ser determinado." + +#: utils/misc/guc.c:2421 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:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "Puerto TCP en el cual escuchará el servidor." -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Privilegios de acceso al socket Unix." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Define los privilegios para los archivos del registro del servidor." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Muestra el modo del directorio de datos." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 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:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 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:2428 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Esto incluye operaciones como VACUUM y CREATE INDEX." -#: utils/misc/guc.c:2438 +#: utils/misc/guc.c:2510 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Establece el límite de memoria que se usará para decodificación lógica." -#: utils/misc/guc.c:2439 +#: utils/misc/guc.c:2511 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 puede ser usada para cada búfer interno de ordenamiento, antes de comenzar a usar disco." -#: utils/misc/guc.c:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Establece el tamaño máximo del stack, en kilobytes." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 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:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 significa sin límite." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 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:2487 +#: utils/misc/guc.c:2559 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:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Costo de Vacuum de una página ensuciada por vacuum." -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Costo de Vacuum disponible antes de descansar." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Costo de Vacuum disponible antes de descansar, para autovacuum." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 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:2540 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Define la cantidad máxima de transacciones preparadas simultáneas." -#: utils/misc/guc.c:2551 +#: utils/misc/guc.c:2623 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:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "Se usa para evitar salida excesiva por tablas de sistema." -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 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:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "Define la duración máxima permitida de sentencias." -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Un valor de 0 desactiva el máximo." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 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:2595 +#: utils/misc/guc.c:2667 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando están dentro de una transacción." -#: utils/misc/guc.c:2606 +#: utils/misc/guc.c:2678 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando no están dentro de una transacción." -#: utils/misc/guc.c:2617 +#: utils/misc/guc.c:2689 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:2627 +#: utils/misc/guc.c:2699 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:2637 +#: utils/misc/guc.c:2709 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:2647 +#: utils/misc/guc.c:2719 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:2657 +#: utils/misc/guc.c:2729 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:2666 +#: utils/misc/guc.c:2738 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." 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:2675 +#: utils/misc/guc.c:2747 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." 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:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Cantidad máxima de candados (locks) por transacción." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 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:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 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:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 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:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 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:2746 -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:2818 +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Define el tiempo máximo a esperar antes de la autentificación al establecer una conexión." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Tamaño de búfer para lectura adelantada de WAL durante la recuperación." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Máxima distancia que leer adelantado en el WAL para pre-cargar bloques de datos referenciados." + +#: utils/misc/guc.c:2841 msgid "Sets the size of WAL files held for standby servers." -msgstr "Establece el tamaño de los archivos de WAL retenidos para los servidores standby." +msgstr "Establece el tamaño de los archivos WAL retenidos para los servidores standby." -#: utils/misc/guc.c:2768 +#: utils/misc/guc.c:2852 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:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Define el tamaño de WAL que desencadena un checkpoint." -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 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:2803 -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:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "Define el máximo tiempo antes de emitir un advertencia si los checkpoints iniciados a causa del volumen de WAL ocurren con demasiada frecuencia." -#: utils/misc/guc.c:2805 -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:2889 +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 "Escribe una advertencia al log del servidor si los checkpoints causados por el llenado de segmentos de WAL occur más frecuentemente que esta cantidad de tiempo. Cero inhabilita la advertencia." -#: utils/misc/guc.c:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 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:2828 +#: utils/misc/guc.c:2913 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:2839 +#: utils/misc/guc.c:2924 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:2850 +#: utils/misc/guc.c:2935 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:2861 +#: utils/misc/guc.c:2946 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Tamaño mínimo del nuevo archivo para hacer fsync en lugar de escribir WAL." -#: utils/misc/guc.c:2872 +#: utils/misc/guc.c:2957 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:2883 +#: utils/misc/guc.c:2968 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:2893 +#: utils/misc/guc.c:2978 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Define el tamaño máximo de WAL que puede ser reservado por slots de replicación." -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 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:2917 +#: utils/misc/guc.c:3002 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:2929 -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:3014 +#| 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 "Cantidad mínima de transacciones concurrentemente abiertas para ejecutar commit_delay." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 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:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." 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:2956 +#: utils/misc/guc.c:3041 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Cero registra una muestra de todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:3051 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Establece el tiempo mínimo de ejecución a partir del cual se registran todas las sentencias." -#: utils/misc/guc.c:2968 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Cero imprime todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc.c:2978 +#: utils/misc/guc.c:3063 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:2980 +#: utils/misc/guc.c:3065 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:2990 -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:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "Define el largo máximo en bytes de valores de parámetros «bind» enviados al log al registrar sentencias." -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 para mostrar los valores completos." -#: utils/misc/guc.c:3001 -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:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "Define el largo máximo en bytes de valores de parámetros «bind» enviados al log, en caso de error." -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "Tiempo de descanso entre rondas del background writer" -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 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:3046 +#: utils/misc/guc.c:3133 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:3064 +#: utils/misc/guc.c:3151 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:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Número máximo de procesos ayudantes concurrentes." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 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:3117 +#: utils/misc/guc.c:3205 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:3127 -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:3215 +#| msgid "Sets the maximum time to wait for WAL replication." +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Define el tiempo máximo a esperar antes de forzar el rotado de un archivo de log." -#: utils/misc/guc.c:3138 -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:3227 +#| 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 "Define el tamaño máximo que puede alcanzar un archivo de log antes de ser rotado." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Muestra la cantidad máxima de argumentos de funciones." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Muestra la cantidad máxima de claves de índices." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Muestra el largo máximo de identificadores." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Muestra el tamaño de un bloque de disco." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 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:3204 +#: utils/misc/guc.c:3294 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:3215 +#: utils/misc/guc.c:3305 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:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Muestra el tamaño de los segmentos de WAL." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Tiempo de descanso entre ejecuciones de autovacuum." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 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:3259 +#: utils/misc/guc.c:3349 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Número mínimo de inserciones de tuplas antes de ejecutar vacuum, o -1 para desactivar vacuums por inserciones." -#: utils/misc/guc.c:3268 +#: utils/misc/guc.c:3358 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:3278 +#: utils/misc/guc.c:3368 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:3293 +#: utils/misc/guc.c:3380 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:3303 +#: utils/misc/guc.c:3390 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:3313 +#: utils/misc/guc.c:3400 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:3323 +#: utils/misc/guc.c:3410 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:3334 +#: utils/misc/guc.c:3421 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:3345 +#: utils/misc/guc.c:3432 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:3356 +#: utils/misc/guc.c:3443 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:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "El valor -1 desactiva esta característica." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Tiempo entre cada emisión de TCP keepalive." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 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:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Tiempo entre retransmisiones TCP keepalive." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 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:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Cantidad máxima de retransmisiones TCP keepalive." -#: utils/misc/guc.c:3401 -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:3488 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "Número de retransmisiones consecutivas de keepalive que pueden ser perdidas antes que una conexión se considere muerta. Cero usa el valor por omisión del sistema." -#: utils/misc/guc.c:3412 +#: utils/misc/guc.c:3499 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:3423 +#: utils/misc/guc.c:3510 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:3424 +#: utils/misc/guc.c:3511 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:3435 +#: utils/misc/guc.c:3522 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:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 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:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Muestra la versión del servidor como un número entero." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 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:3470 +#: utils/misc/guc.c:3557 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:3480 +#: utils/misc/guc.c:3567 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:3491 +#: utils/misc/guc.c:3578 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:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "Tiempo de expiración de TCP." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "El tamaño de huge page que se debería solicitar." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 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:3547 +#: utils/misc/guc.c:3634 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Establece el intervalo entre revisiones de desconexión mientras se ejecutan consultas." -#: utils/misc/guc.c:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "Tiempo a esperar entre actualizaciones para operaciones largas durante el inicio." + +#: utils/misc/guc.c:3647 +#| msgid "Zero prints all queries. -1 turns this feature off." +msgid "0 turns this feature off." +msgstr "Cero desactiva esta funcionalidad." + +#: utils/misc/guc.c:3666 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:3578 +#: utils/misc/guc.c:3677 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:3589 +#: utils/misc/guc.c:3688 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:3600 +#: utils/misc/guc.c:3699 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:3611 +#: utils/misc/guc.c:3710 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:3622 +#: utils/misc/guc.c:3721 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:3633 +#: utils/misc/guc.c:3732 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:3645 +#: utils/misc/guc.c:3744 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:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 inhabilita compilación JIT." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimizar funciones compiladas en tiempo de ejecución (JIT) si la consulta es más cara." -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 inhabilita la optimización." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "Ejecutar «inlining» JIT si la consulta es más cara." -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 inhabilita el «inlining»." -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 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:3690 +#: utils/misc/guc.c:3789 +#| 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 "Estimación del tamaño promedio de la tabla de trabajo de una consulta recursiva." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: presión selectiva dentro de la población." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: semilla para la selección aleatoria de caminos." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 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:3723 +#: utils/misc/guc.c:3834 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:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "Semilla para la generación de números aleatorios." -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Tiempo de descanso de vacuum en milisegundos." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Tiempo de descanso de vacuum en milisegundos, para autovacuum." -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 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:3776 +#: utils/misc/guc.c:3887 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Número de inserts de tuplas antes de ejecutar un vacuum, como fracción de reltuples." -#: utils/misc/guc.c:3786 +#: utils/misc/guc.c:3897 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:3796 +#: utils/misc/guc.c:3907 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:3806 +#: utils/misc/guc.c:3917 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:3807 +#: utils/misc/guc.c:3918 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:3816 +#: utils/misc/guc.c:3927 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Define la fracción de transacciones desde la cual registrar en el log todas las sentencias." -#: utils/misc/guc.c:3817 +#: utils/misc/guc.c:3928 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Use un valor entre 0.0 (nunca registrar) y 1.0 (registrar todas las sentencias de todas las transacciones)." -#: utils/misc/guc.c:3836 +#: utils/misc/guc.c:3947 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:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Esto sólo se utiliza si «archive_library» no está definido." + +#: utils/misc/guc.c:3957 +#| 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 "Define la biblioteca que se invocará para archivar un archivo WAL." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "Una cadena vacía indica que «archive_command» debería usarse." + +#: utils/misc/guc.c:3967 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Orden de shell que se invocará para recuperar un archivo WAL archivado." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:3977 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:3866 +#: utils/misc/guc.c:3987 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:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Especifica la línea de tiempo a la cual recuperar." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 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:3895 +#: utils/misc/guc.c:4016 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:3904 +#: utils/misc/guc.c:4025 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:3913 +#: utils/misc/guc.c:4034 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:3922 +#: utils/misc/guc.c:4043 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:3932 +#: utils/misc/guc.c:4053 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:3942 +#: utils/misc/guc.c:4063 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:3953 +#: utils/misc/guc.c:4074 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:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Codificación del juego de caracteres del cliente." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "Controla el prefijo que antecede cada línea registrada." -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "si está en blanco, no se usa prefijo." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Define el huso horario usando en los mensajes registrados." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "Formato de salida para valores de horas y fechas." -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "También controla la interpretación de entradas ambiguas de fechas" -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 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:4017 +#: utils/misc/guc.c:4138 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:4018 +#: utils/misc/guc.c:4139 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:4028 +#: utils/misc/guc.c:4149 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:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Ruta para módulos dinámicos." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Ubicación del archivo de llave del servidor Kerberos." -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Nombre del servicio Bonjour." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Configuración regional de ordenamiento de cadenas (collation)." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 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:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Idioma en el que se despliegan los mensajes." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Configuración regional para formatos de moneda." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Configuración regional para formatos de números." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting date and time values." msgstr "Configuración regional para formatos de horas y fechas." -#: utils/misc/guc.c:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "Bibliotecas compartidas a precargar en cada proceso." -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Bibliotecas compartidas a precargar en el servidor." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Bibliotecas compartidas no privilegiadas a precargar en cada proceso." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4292 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:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." msgstr "Muestra la codificación de caracteres del servidor (base de datos)." -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Versión del servidor." -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Define el rol actual." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Define el nombre del usuario de sesión." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Define el destino de la salida del registro del servidor." -#: utils/misc/guc.c:4231 -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:4352 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "Son aceptables combinaciones de «stderr», «syslog», «csvlog», «jsonlog» y «eventlog», dependendiendo de la plataforma." -#: utils/misc/guc.c:4242 +#: utils/misc/guc.c:4363 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:4243 +#: utils/misc/guc.c:4364 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:4253 +#: utils/misc/guc.c:4374 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:4264 +#: utils/misc/guc.c:4385 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:4275 +#: utils/misc/guc.c:4396 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:4286 +#: utils/misc/guc.c:4407 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:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Selecciona un archivo de abreviaciones de huso horario." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Grupo dueño del socket de dominio Unix." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 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:4317 +#: utils/misc/guc.c:4438 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:4332 +#: utils/misc/guc.c:4453 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:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Define la ubicación del directorio de datos." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 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:4369 +#: utils/misc/guc.c:4490 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:4380 +#: utils/misc/guc.c:4501 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:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "Registra el PID de postmaster en el archivo especificado." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Muestra el nombre de la biblioteca SSL." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Ubicación del archivo de certificado SSL del servidor." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 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:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Ubicación del archivo de autoridad certificadora SSL." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 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:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." msgstr "Ubicación del directorio de lista de revocación de certificados SSL" -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Escribe los archivos temporales de estadísticas al directorio especificado." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 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:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Define la configuración de búsqueda en texto por omisión." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Define la lista de cifrados SSL permitidos." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Define la curva a usar para ECDH." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Ubicación del archivo de parámetros DH para SSL." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Orden para obtener frases clave para SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 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:4562 +#: utils/misc/guc.c:4672 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:4573 +#: utils/misc/guc.c:4683 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:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "Proveedor JIT a usar." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Registrar el backtrace para errores que se produzcan en estas funciones." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Define si «\\'» está permitido en literales de cadena." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Formato de salida para bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 msgid "Sets the message levels that are sent to the client." msgstr "Nivel de mensajes enviados al cliente." -#: utils/misc/guc.c:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 -#: utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 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:4646 -msgid "Compute query identifiers." -msgstr "Calcular identificadores de consulta." +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "Habilita el cálculo de identificadores de consulta." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 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:4657 +#: utils/misc/guc.c:4767 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:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." msgstr "Define el método de compresión por omisión para valores comprimibles." -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "Nivel de aislación (isolation level) de transacciones nuevas." -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 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:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Formato de salida para valores de intervalos." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Verbosidad de los mensajes registrados." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Nivel de mensajes registrados." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 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:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Define el tipo de sentencias que se registran." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 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:4768 +#: utils/misc/guc.c:4878 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:4778 +#: utils/misc/guc.c:4888 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:4788 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "Permite el archivado de WAL usando archive_command." -#: utils/misc/guc.c:4798 +#: utils/misc/guc.c:4908 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:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "Recolectar información de depuración relacionada con la recuperación." -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 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:4834 +#: utils/misc/guc.c:4946 +#| msgid "Sets the default statistics target." +msgid "Sets the consistency of accesses to statistics data." +msgstr "Definir la consistencia de accesos a datos de estadísticas." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Comprime las páginas completas escritas a WAL (FPI) con el método especificado." + +#: utils/misc/guc.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Establece el nivel de información escrita al WAL." -#: utils/misc/guc.c:4844 +#: utils/misc/guc.c:4976 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:4854 +#: utils/misc/guc.c:4986 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:4864 +#: utils/misc/guc.c:4996 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:4874 +#: utils/misc/guc.c:5006 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:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Usar páginas grandes (huge) en Linux o Windows." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +#| msgid "cannot execute %s during recovery" +msgid "Prefetch referenced blocks during recovery." +msgstr "Pre-cargar bloques referenciados durante la recuperación." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Busca adelantadamente en el WAL para encontrar referencias a datos que no están en cache." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Obliga al uso de la funcionalidad de consultas paralelas." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 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:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Escoge el algoritmo para cifrar contraseñas." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 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:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 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:4951 +#: utils/misc/guc.c:5093 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:4963 +#: utils/misc/guc.c:5105 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Establece el método para sincronizar el directorio de datos antes de la recuperación ante una caída." -#: utils/misc/guc.c:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "nombre de parámetro de configuración «%s» no válido" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Los nombres de los parámetros personalizados deben ser dos o más identificadores sencillos separados por puntos." -#: utils/misc/guc.c:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +#| msgid "\"%s\" is a procedure." +msgid "\"%s\" is a reserved prefix." +msgstr "«%s» es un prefijo reservado." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "parámetro de configuración «%s» no reconocido" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, 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:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27459,12 +28435,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:5880 +#: utils/misc/guc.c:6148 #, 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:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27473,7 +28449,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:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27482,7 +28458,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:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -27491,188 +28467,198 @@ 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:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "El valor excede el rango para enteros." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 #, 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:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "no se puede cambiar el parámetro «%s»" -#: utils/misc/guc.c:7374 utils/misc/guc.c:7572 utils/misc/guc.c:7666 -#: utils/misc/guc.c:7760 utils/misc/guc.c:7880 utils/misc/guc.c:7979 +#: utils/misc/guc.c:7688 utils/misc/guc.c:7908 utils/misc/guc.c:8006 +#: utils/misc/guc.c:8104 utils/misc/guc.c:8228 utils/misc/guc.c:8331 #: guc-file.l:353 #, 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" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7698 #, 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:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11357 +#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 +#: utils/misc/guc.c:11795 #, 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:7439 +#: utils/misc/guc.c:7763 #, 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:7487 +#: utils/misc/guc.c:7822 #, 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:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9574 +#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10001 #, 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»" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "debe ser superusuario o tener privilegios de pg_read_all_settings para examinar «%s»" -#: utils/misc/guc.c:8251 +#: utils/misc/guc.c:8606 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s lleva sólo un argumento" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8886 #, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "debe ser superusuario para ejecutar la orden ALTER SYSTEM" +#| msgid "permission denied for operator %s" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "permiso denegado a ejecutar ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:8580 +#: utils/misc/guc.c:8953 #, 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:8625 +#: utils/misc/guc.c:8998 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "no se pudo interpretar el contenido del archivo «%s»" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9172 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT no está implementado" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9259 #, c-format msgid "SET requires parameter name" msgstr "SET requiere el nombre de un parámetro" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9392 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "intento de cambiar la opción «%s»" -#: utils/misc/guc.c:10804 +#: utils/misc/guc.c:9719 +#, c-format +#| msgid "invalid configuration parameter name \"%s\"" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "nombre de parámetro de configuración «%s» no válido, eliminándolo" + +#: utils/misc/guc.c:9721 +#, c-format +#| msgid "\"%s\" is not a sequence" +msgid "\"%s\" is now a reserved prefix." +msgstr "«%s» es ahora un prefijo reservado." + +#: utils/misc/guc.c:11235 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "al establecer el parámetro «%s» a «%s»" -#: utils/misc/guc.c:10969 +#: utils/misc/guc.c:11404 #, c-format msgid "parameter \"%s\" could not be set" msgstr "no se pudo cambiar el parámetro «%s»" -#: utils/misc/guc.c:11061 +#: utils/misc/guc.c:11496 #, 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:11419 utils/misc/guc.c:11453 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "valor no válido para el parámetro «%s»: %d" - -#: utils/misc/guc.c:11487 +#: utils/misc/guc.c:11927 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valor no válido para el parámetro «%s»: %g" -#: utils/misc/guc.c:11774 +#: utils/misc/guc.c:12240 #, 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:11786 +#: utils/misc/guc.c:12252 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour no está soportado en este servidor" -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12265 #, c-format msgid "SSL is not supported by this build" msgstr "SSL no está soportado en este servidor" -#: utils/misc/guc.c:11811 +#: utils/misc/guc.c:12277 #, 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:11823 +#: utils/misc/guc.c:12289 #, 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:12053 +#: utils/misc/guc.c:12519 #, 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:12066 +#: utils/misc/guc.c:12532 #, c-format msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgstr "maintenance_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." -#: utils/misc/guc.c:12080 +#: utils/misc/guc.c:12546 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "huge_page_size debe ser 0 en esta plataforma." -#: utils/misc/guc.c:12094 +#: utils/misc/guc.c:12558 #, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "client_connection_check_interval debe ser 0 en plataformas que no tienen POLLRDHUP." +#| 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 debe ser 0 en esta plataforma." -#: utils/misc/guc.c:12222 +#: utils/misc/guc.c:12670 #, c-format msgid "invalid character" msgstr "carácter no válido" -#: utils/misc/guc.c:12282 +#: utils/misc/guc.c:12730 #, 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:12322 +#: utils/misc/guc.c:12770 #, c-format msgid "multiple recovery targets specified" msgstr "múltiples valores de destino de recuperación especificados" -#: utils/misc/guc.c:12323 +#: utils/misc/guc.c:12771 #, 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:12331 +#: utils/misc/guc.c:12779 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "El único valor permitido es «immediate»." @@ -27682,11 +28668,6 @@ msgstr "El único valor permitido es «immediate»." msgid "internal error: unrecognized run-time parameter type\n" msgstr "error interno: tipo parámetro no reconocido\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "tupla de retorno especificada por la consulta y el tipo retornado por la función no son compatibles" - #: 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 @@ -27708,7 +28689,7 @@ msgstr "la consulta sería afectada por la política de seguridad de registros p msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Para desactivar la política para el dueño de la tabla, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "no se pueden agregar más razones de timeout" @@ -27778,7 +28759,7 @@ msgstr "línea demasiado larga en archivo de huso horario «%s», línea %d" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE sin nombre de archivo en archivo de huso horario «%s», línea %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Falla al crear el contexto de memoria «%s»." @@ -27801,89 +28782,89 @@ msgstr "Falló una petición de tamaño %zu en el contexto de memoria «%s»." msgid "logging memory contexts of PID %d" msgstr "registrando contextos de memoria del PID %d" -#: utils/mmgr/portalmem.c:187 +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "el cursor «%s» ya existe" -#: utils/mmgr/portalmem.c:191 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "cerrando el cursor «%s» preexistente" -#: utils/mmgr/portalmem.c:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "el portal «%s» no puede ser ejecutado" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "no se puede eliminar el portal «pinned» «%s»" -#: utils/mmgr/portalmem.c:487 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "no se puede eliminar el portal activo «%s»" -#: utils/mmgr/portalmem.c:738 +#: utils/mmgr/portalmem.c:739 #, 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:1279 +#: utils/mmgr/portalmem.c:1232 #, 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 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "no se pudo posicionar (seek) en el bloque %ld del archivo temporal" -#: 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 "no se pudo leer el bloque %ld del archivo temporal: se leyeron sólo %zu de %zu bytes" -#: 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 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "no se pudo leer desde el archivo temporal del tuplestore compartido" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "trozo inesperado en archivo temporal del tuplestore compartido" -#: utils/sort/sharedtuplestore.c:570 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "no se pudo posicionar (seek) en el bloque %u en el archivo temporal del tuplestore compartido" -#: utils/sort/sharedtuplestore.c:577 +#: utils/sort/sharedtuplestore.c:579 #, 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 del tuplestore compartido: se leyeron sólo %zu de %zu bytes" -#: utils/sort/tuplesort.c:3218 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "no se pueden tener más de %d pasadas para un ordenamiento externo" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "no se pudo crear el índice único «%s»" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "La llave %s está duplicada." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Existe una llave duplicada." @@ -27953,342 +28934,382 @@ msgstr "una transacción serializable que no es de sólo lectura no puede import msgid "cannot import a snapshot from a different database" msgstr "no se puede importar un snapshot desde una base de datos diferente" -#: gram.y:1108 +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD ya no está soportado" -#: gram.y:1109 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Quite UNENCRYPTED para almacenar la contraseña en su lugar en forma cifrada." -#: gram.y:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "opción de rol «%s» no reconocida" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS no puede incluir elementos de esquema" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "no se puede cambiar la base de datos activa" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "el intervalo de huso horario debe ser HOUR o HOUR TO MINUTE" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "el número de columna debe estar en el rango de 1 a %d" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "la opción de secuencia «%s» no está soportado aquí" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "el módulo para partición de hash fue especificado más de una vez" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" -msgstr "el remanentde para partición de hash fue especificado más de una vez" +msgstr "el remanente para partición de hash fue especificado más de una vez" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "especificación de borde de partición hash «%s» no reconocida" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "el módulo para una partición hash debe ser especificado" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "remanente en partición hash debe ser especificado" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT no están permitidos con PROGRAM" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "la cláusula WHERE no está permitida con COPY TO" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL está obsoleto para la creación de tablas temporales" -#: gram.y:3666 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "para una columna generada, GENERATED ALWAYS debe ser especificado" -#: gram.y:4635 +#: gram.y:4264 +#, 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 "una lista de columnas con %s sólo está permitida para acciones ON DELETE" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM ya no está soportado" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "opción de seguridad de registro «%s» no reconocida" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "sólo se admiten actualmente políticas PERMISSIVE o RESTRICTIVE." -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER no está soportado" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "se han especificado eventos de disparador duplicados" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "propiedades de restricción contradictorias" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION no está implementado" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK ya no es requerido" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "Actualice su tipo de datos." -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "las funciones de agregación no pueden tener argumentos de salida" -#: gram.y:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION no está soportado con vistas recursivas" -#: gram.y:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "la sintaxis LIMIT #,# no está soportada" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Use cláusulas LIMIT y OFFSET separadas." -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES en FROM debe tener un alias" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Por ejemplo, FROM (VALUES ...) [AS] foo." -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "las subconsultas en FROM deben tener un alias" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Por ejemplo, FROM (SELECT ...) [AS] foo." -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "Sólo se permite un valor DEFAULT" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "sólo se permite un valor de PATH por columna" -#: gram.y:12687 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "declaraciones NULL/NOT NULL en conflicto o redundantes para la columna «%s»" -#: gram.y:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "opción de columna «%s» no reconocida" -#: gram.y:12950 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "la precisión para el tipo float debe ser al menos 1 bit" -#: gram.y:12959 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "la precisión para el tipo float debe ser menor de 54 bits" -#: gram.y:13457 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "el número de parámetros es incorrecto al lado izquierdo de la expresión OVERLAPS" -#: gram.y:13462 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "el número de parámetros es incorrecto al lado derecho de la expresión OVERLAPS" -#: gram.y:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "el predicado UNIQUE no está implementado" -#: gram.y:13989 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "no se permiten múltiples cláusulas ORDER BY con WITHIN GROUP" -#: gram.y:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "no se permite DISTINCT con WITHIN GROUP" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "no se permite VARIADIC con WITHIN GROUP" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "el inicio de «frame» no puede ser UNBOUNDED FOLLOWING" -#: gram.y:14528 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "el «frame» que se inicia desde la siguiente fila no puede terminar en la fila actual" -#: gram.y:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "el fin de «frame» no puede ser UNBOUNDED PRECEDING" -#: gram.y:14557 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "el «frame» que se inicia desde la fila actual no puede tener filas precedentes" -#: gram.y:14564 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "el «frame» que se inicia desde la fila siguiente no puede tener filas precedentes" -#: gram.y:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "el modificador de tipo no puede tener nombre de parámetro" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "el modificador de tipo no puede tener ORDER BY" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s no puede ser usado como nombre de rol aquí" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, 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" -#: gram.y:16478 gram.y:16667 +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "uso impropio de «*»" -#: gram.y:16731 +#: gram.y:17913 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "una agregación de conjunto-ordenado con un argumento directo VARIADIC debe tener al menos un argumento agregado VARIADIC del mismo tipo de datos" -#: gram.y:16768 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "no se permiten múltiples cláusulas ORDER BY" -#: gram.y:16779 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "no se permiten múltiples cláusulas OFFSET" -#: gram.y:16788 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "no se permiten múltiples cláusulas LIMIT" -#: gram.y:16797 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "no se permiten múltiples opciones limit" -#: gram.y:16824 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "no se permiten múltiples cláusulas WITH" -#: gram.y:17018 +#: gram.y:18199 #, 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:17114 +#: gram.y:18332 #, 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:17152 gram.y:17165 +#: gram.y:18370 gram.y:18383 #, 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:17178 +#: gram.y:18396 #, 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:17191 +#: gram.y:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "las restricciones %s no pueden ser marcadas NO INHERIT" +#: gram.y:18433 +#, c-format +#| msgid "invalid publication_names syntax" +msgid "invalid publication object list" +msgstr "lista de objetos de publicación no válida" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "Uno de TABLE o TABLES IN SCHEMA debe ser especificado antes de un nombre de tabla o esquema." + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "nombre de tabla no válido" + +#: gram.y:18471 +#, c-format +#| msgid "WHERE clause not allowed with COPY TO" +msgid "WHERE clause not allowed for schema" +msgstr "la cláusula WHERE no está permitida para esquemas" + +#: gram.y:18478 +#, c-format +#| msgid "grouping operations are not allowed in %s" +msgid "column specification not allowed for schema" +msgstr "no se permiten especificaciones de columna para esquemas" + +#: gram.y:18492 +#, c-format +#| msgid "invalid character" +msgid "invalid schema name" +msgstr "nombre de esquema no válido" + #: guc-file.l:314 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" @@ -28299,201 +29320,209 @@ msgstr "parámetro de configuración «%s» no reconocido en el archivo «%s» l 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:455 +#: guc-file.l:454 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "el parámetro «%s» fue cambiado a «%s»" -#: guc-file.l:497 +#: guc-file.l:496 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "el archivo de configuración «%s» contiene errores" -#: guc-file.l:502 +#: guc-file.l:501 #, 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:507 +#: guc-file.l:506 #, 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:579 +#: guc-file.l:578 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "nombre de archivo de configuración vacío: «%s»" -#: guc-file.l:596 +#: guc-file.l:595 #, 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:616 +#: guc-file.l:615 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "recursión de archivos de configuración en «%s»" -#: guc-file.l:643 +#: guc-file.l:642 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "omitiendo el archivo de configuración faltante «%s»" -#: guc-file.l:897 +#: guc-file.l:896 #, 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:907 +#: guc-file.l:906 #, 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:927 +#: guc-file.l:926 #, 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:982 +#: guc-file.l:981 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "nombre de directorio de configuración vacío: «%s»" -#: guc-file.l:1001 +#: guc-file.l:1000 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "no se pudo abrir el directorio de configuración «%s»: %m" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:530 #, c-format -msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" -msgstr "parámetro «%.*s» no reconocido en predicado LIKE_REGEX" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "Carácter de bandera «%.*s» no reconocido en predicado LIKE_REGEX." -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "la opción «x» de XQuery (expresiones regulares expandidas) no está implementada" #. 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 al final de la entrada jsonpath" #. 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 en o cerca de «%s» de la entrada jsonpath" -#: repl_gram.y:345 repl_gram.y:377 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "timeline %u no válido" -#: repl_scanner.l:150 +#: repl_scanner.l:142 msgid "invalid streaming start location" msgstr "posición de inicio de flujo de WAL no válida" -#: repl_scanner.l:206 scan.l:717 +#: repl_scanner.l:199 scan.l:724 msgid "unterminated quoted string" msgstr "una cadena de caracteres entre comillas está inconclusa" -#: scan.l:458 +#: scan.l:465 msgid "unterminated /* comment" msgstr "un comentario /* está inconcluso" -#: scan.l:478 +#: scan.l:485 msgid "unterminated bit string literal" msgstr "una cadena de bits está inconclusa" -#: scan.l:492 +#: scan.l:499 msgid "unterminated hexadecimal string literal" msgstr "una cadena hexadecimal está inconclusa" -#: scan.l:542 +#: scan.l:549 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "uso inseguro de literal de cadena con escapes 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 "Los literales de cadena con escapes Unicode no pueden usarse cuando standard_conforming_strings está desactivado." -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" msgstr "estado previo no manejado en xqs" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Los escapes Unicode deben ser \\uXXXX o \\UXXXXXXXX." -#: scan.l:689 +#: scan.l:696 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "uso inseguro de \\' en un literal de cadena" -#: scan.l:690 +#: scan.l:697 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Use '' para escribir comillas en cadenas. \\' es inseguro en codificaciones de sólo cliente." -#: scan.l:762 +#: scan.l:769 msgid "unterminated dollar-quoted string" msgstr "una cadena separada por $ está inconclusa" -#: scan.l:779 scan.l:789 +#: scan.l:786 scan.l:796 msgid "zero-length delimited identifier" msgstr "un identificador delimitado tiene largo cero" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "un identificador entre comillas está inconcluso" -#: scan.l:963 +#: scan.l:970 msgid "operator too long" msgstr "el operador es demasiado largo" +#: scan.l:983 +msgid "trailing junk after parameter" +msgstr "basura sigue después de un parámetro" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "basura sigue después de un literal numérico" + #. 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 al final de la entrada" #. 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 en o cerca de «%s»" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "uso no estandar de \\' en un literal de cadena" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Use '' para escribir comillas en cadenas, o use la sintaxis de escape de cadenas (E'...')." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "uso no estandar de \\\\ en un literal de cadena" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Use '' para escribir comillas en cadenas, o use la sintaxis de escape de cadenas (E'\\\\')." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "uso no estandar de escape en un literal de cadena" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Use la sintaxis de escape para cadenas, por ej. E'\\r\\n'." diff --git a/third_party/spanner_pg/src/backend/po/fr.po b/third_party/spanner_pg/src/backend/po/fr.po index bda5dc08..9e606a38 100644 --- a/third_party/spanner_pg/src/backend/po/fr.po +++ b/third_party/spanner_pg/src/backend/po/fr.po @@ -1,55 +1,133 @@ -# 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: 2023-10-29 12:11+0000\n" -"PO-Revision-Date: 2023-10-30 13:45+0100\n" -"Last-Translator: Christophe Courtois \n" +"POT-Creation-Date: 2023-10-29 11:57+0000\n" +"PO-Revision-Date: 2023-07-30 16:30+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 3.4\n" +"X-Generator: Poedit 3.3.2\n" + +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "cette construction ne supporte pas la compression avec %s" + +#: ../common/compression.c:203 +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:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "option de compression inconnue : « %s »" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "l'option de compression « %s » requiert une valeur" + +#: ../common/compression.c:285 +#, 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:335 +#, 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:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)" + +#: ../common/compression.c:353 +#, 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/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 +#: ../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:78 ../common/controldata_utils.c:83 commands/copyfrom.c:1522 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1521 commands/extension.c:3401 utils/adt/genfile.c:123 #, 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:96 ../common/controldata_utils.c:99 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1329 access/transam/xlog.c:3573 access/transam/xlog.c:4817 access/transam/xlog.c:11629 access/transam/xlog.c:11642 access/transam/xlog.c:12097 access/transam/xlog.c:12177 access/transam/xlog.c:12214 access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 access/transam/xlogfuncs.c:722 commands/extension.c:3492 libpq/hba.c:534 replication/basebackup.c:2026 replication/logical/origin.c:729 replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 replication/logical/snapbuild.c:1863 -#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 replication/slot.c:1727 replication/slot.c:1768 replication/walsender.c:545 storage/file/buffile.c:445 storage/file/copydir.c:195 utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 +#: access/transam/timeline.c:143 access/transam/timeline.c:362 +#: access/transam/twophase.c:1349 access/transam/xlog.c:3207 +#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1197 +#: access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 +#: access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 +#: commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1939 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: 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 "n'a pas pu lire le fichier « %s » : %m" -#: ../common/controldata_utils.c:107 ../common/controldata_utils.c:111 access/transam/xlog.c:3578 access/transam/xlog.c:4822 replication/basebackup.c:2030 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1868 replication/logical/snapbuild.c:1910 replication/logical/snapbuild.c:1937 replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 +#: replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:817 #, 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:122 ../common/controldata_utils.c:127 ../common/controldata_utils.c:286 ../common/controldata_utils.c:289 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:1341 access/transam/twophase.c:1746 access/transam/xlog.c:3442 access/transam/xlog.c:3613 access/transam/xlog.c:3618 access/transam/xlog.c:3946 access/transam/xlog.c:4787 access/transam/xlog.c:5712 access/transam/xlogfuncs.c:728 commands/copyfrom.c:1582 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:5009 replication/logical/snapbuild.c:1772 replication/logical/snapbuild.c:1945 replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 utils/cache/relmapper.c:898 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:271 ../common/controldata_utils.c:274 +#: 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:1361 +#: access/transam/twophase.c:1773 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:4738 commands/copyfrom.c:1581 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:5016 +#: replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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 "n'a pas pu fermer le fichier « %s » : %m" -#: ../common/controldata_utils.c:165 +#: ../common/controldata_utils.c:154 msgid "byte ordering mismatch" msgstr "différence de l'ordre des octets" -#: ../common/controldata_utils.c:167 +#: ../common/controldata_utils.c:156 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -63,30 +141,109 @@ msgstr "" "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:227 ../common/controldata_utils.c:233 ../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:1285 access/transam/xlog.c:3328 access/transam/xlog.c:3484 access/transam/xlog.c:3528 access/transam/xlog.c:3726 access/transam/xlog.c:3811 access/transam/xlog.c:3914 access/transam/xlog.c:4807 access/transam/xlogutils.c:803 postmaster/syslogger.c:1488 replication/basebackup.c:616 replication/basebackup.c:1616 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 replication/logical/reorderbuffer.c:4931 replication/logical/snapbuild.c:1727 replication/logical/snapbuild.c:1834 replication/slot.c:1699 replication/walsender.c:518 replication/walsender.c:2563 storage/file/copydir.c:161 storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 utils/cache/relmapper.c:842 utils/error/elog.c:1938 utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 +#: ../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:1305 +#: 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:4209 +#: access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 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:8991 utils/misc/guc.c:9040 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../common/controldata_utils.c:251 ../common/controldata_utils.c:254 access/transam/twophase.c:1719 access/transam/twophase.c:1728 access/transam/xlog.c:11386 access/transam/xlog.c:11424 access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 postmaster/postmaster.c:5684 postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:240 ../common/controldata_utils.c:243 +#: access/transam/twophase.c:1746 access/transam/twophase.c:1755 +#: access/transam/xlog.c:8674 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: utils/cache/relmapper.c:934 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: ../common/controldata_utils.c:269 ../common/controldata_utils.c:275 ../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:1740 access/transam/xlog.c:3435 access/transam/xlog.c:3607 access/transam/xlog.c:4780 access/transam/xlog.c:10869 access/transam/xlog.c:10910 replication/logical/snapbuild.c:1765 replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 storage/sync/sync.c:454 utils/cache/relmapper.c:891 -#: utils/misc/guc.c:8405 +#: ../common/controldata_utils.c:257 ../common/controldata_utils.c:262 +#: ../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:1767 +#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 +#: access/transam/xlog.c:3985 access/transam/xlog.c:7977 +#: access/transam/xlog.c:8020 backup/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1772 replication/slot.c:1684 +#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:992 storage/smgr/md.c:1033 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 #, 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:560 ../common/exec.c:605 ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 lib/dshash.c:245 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:2550 postmaster/postmaster.c:4208 postmaster/postmaster.c:5609 postmaster/postmaster.c:5973 replication/libpqwalreceiver/libpqwalreceiver.c:287 replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 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:5049 utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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:238 +#: ../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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 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:2594 postmaster/postmaster.c:4180 +#: postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2281 storage/ipc/procarray.c:2288 +#: storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3424 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 +#: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 +#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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:238 #, c-format msgid "out of memory" msgstr "mémoire épuisée" +#: ../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 "succès" + +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "tampon de destination trop petit" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "échec OpenSSL" + #: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" @@ -107,22 +264,29 @@ msgstr "n'a pas pu lire le binaire « %s »" msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, 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:299 access/transam/xlog.c:11260 replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8323 backup/basebackup.c:1340 +#: utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, c-format msgid "%s() failed: %m" msgstr "échec de %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 "mémoire épuisée\n" @@ -132,124 +296,149 @@ 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:1297 access/transam/xlog.c:11362 access/transam/xlog.c:11400 access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:227 commands/copyfrom.c:1532 commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 commands/tablespace.c:897 guc-file.l:1062 replication/basebackup.c:439 replication/basebackup.c:622 replication/basebackup.c:698 replication/logical/snapbuild.c:1644 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 storage/file/fd.c:3157 storage/file/fd.c:3361 -#: 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 utils/adt/misc.c:354 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 +#: ../common/file_utils.c:455 access/transam/twophase.c:1317 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:237 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1531 commands/copyto.c:725 commands/extension.c:3390 +#: commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 +#: postmaster/pgarch.c:597 replication/logical/snapbuild.c:1651 +#: 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 "n'a pas pu tester le fichier « %s » : %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:729 commands/tablespace.c:739 postmaster/postmaster.c:1518 storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 postmaster/postmaster.c:1579 +#: 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 "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 #, 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:1784 replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:426 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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 "n'a pas pu renommer le fichier « %s » en « %s » : %m" -#: ../common/jsonapi.c:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "erreur interne" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "La séquence d'échappement « \\%s » est invalide." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, 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:1089 +#: ../common/jsonapi.c:1098 #, 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:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Élément de tableau ou « ] » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "« , » ou « ] » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "« : » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Valeur JSON attendue, mais « %s » trouvé." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "La chaîne en entrée se ferme de manière inattendue." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Chaîne ou « } » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "« , » ou « } » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Chaîne attendue, mais « %s » trouvé." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "Le jeton « %s » n'est pas valide." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ne peut pas être converti en texte." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 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." -#: ../common/jsonapi.c:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 #, c-format 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:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 jsonpath_scan.l:527 jsonpath_scan.l:537 +#: jsonpath_scan.l:579 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute." -#: ../common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "astuce : " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -265,7 +454,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:1521 libpq/auth.c:2553 +#: ../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 "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" @@ -300,12 +489,12 @@ 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" -#: ../common/rmtree.c:79 replication/basebackup.c:1187 replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "" @@ -317,6 +506,18 @@ msgstr "" msgid "could not remove file or directory \"%s\": %m" msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %m" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "n'a pas pu encoder le sel" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "n'a pas pu encoder la clé enregistrée" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "n'a pas pu encoder la clé serveur" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -338,7 +539,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:2053 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" @@ -377,12 +578,12 @@ 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/chklocale.c:307 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "n'a pas pu déterminer l'encodage pour le codeset « %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 "n'a pas pu déterminer l'encodage pour la locale « %s » : le codeset vaut « %s »" @@ -407,32 +608,32 @@ msgstr "n'a pas pu obtenir la jonction pour « %s » : %s" msgid "could not get junction for \"%s\": %s\n" msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n" -#: ../port/open.c:126 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "n'a pas pu ouvrir le fichier « %s » : %s" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "lock violation" msgstr "violation du verrou" -#: ../port/open.c:127 +#: ../port/open.c:118 msgid "sharing violation" msgstr "violation du partage" -#: ../port/open.c:128 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Continue à tenter pendant 30 secondes." -#: ../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 "" "Vous pouvez avoir un antivirus, un outil de sauvegarde ou un logiciel\n" "similaire interférant avec le système de bases de données." -#: ../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" @@ -442,6 +643,16 @@ msgstr "n'a pas pu obtenir le répertoire de travail : %s\n" msgid "operating system error %d" msgstr "erreur %d du système d'exploitation" +#: ../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" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -464,37 +675,49 @@ 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:1036 access/brin/brin.c:1140 access/gin/ginfast.c:1043 access/transam/xlog.c:11031 access/transam/xlog.c:11568 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:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1043 +#: 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 "restauration en cours" -#: access/brin/brin.c:1037 access/brin/brin.c:1141 +#: access/brin/brin.c:1037 access/brin/brin.c:1138 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Les fonctions de contrôle BRIN ne peuvent pas être exécutées pendant la restauration." -#: access/brin/brin.c:1045 access/brin/brin.c:1149 +#: access/brin/brin.c:1042 access/brin/brin.c:1143 #, c-format -msgid "block number out of range: %s" -msgstr "numéro de bloc en dehors des limites : %s" +msgid "block number out of range: %lld" +msgstr "numéro de bloc en dehors des limites : %lld" -#: access/brin/brin.c:1089 access/brin/brin.c:1175 +#: access/brin/brin.c:1086 access/brin/brin.c:1169 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "« %s » n'est pas un index BRIN" -#: access/brin/brin.c:1105 access/brin/brin.c:1191 +#: access/brin/brin.c:1102 access/brin/brin.c:1185 #, c-format 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:2986 access/brin/brin_minmax_multi.c:3129 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 +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 +#: access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 +#: 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 "ne peut pas accepter une valeur de type %s" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 access/gist/gist.c:1461 access/spgist/spgdoinsert.c:2000 access/spgist/spgdoinsert.c:2275 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 +#: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 +#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "la taille de la ligne index, %zu, dépasse le maximum, %zu, pour l'index « %s »" @@ -509,40 +732,51 @@ msgstr "index BRIN corrompu : carte d'intervalle incohérente" msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "type de page 0x%04X dans l'index BRIN « %s », bloc %u" -#: 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 +#: 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 "" "la famille d'opérateur « %s » de la méthode d'accès %s contient la fonction %s avec\n" "le numéro de support invalide %d" -#: 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 +#: 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 "" "la famille d'opérateur « %s » de la méthode d'accès %s contient la fonction %s avec une mauvaise\n" "signature pour le numéro de support %d" -#: 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 +#: 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 "" "la famille d'opérateur « %s » de la méthode d'accès %s contient l'opérateur %s avec le numéro\n" "de stratégie invalide %d" -#: 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 +#: 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 "" "la famille d'opérateur « %s » de la méthode d'accès %s contient la spécification ORDER BY\n" "invalide pour l'opérateur %s" -#: 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 +#: 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 "la famille d'opérateur « %s » de la méthode d'accès %s contient l'opérateur %s avec une mauvaise signature" -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 +#: 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 "" @@ -556,12 +790,14 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s nécessite des fonctions de support\n" "manquantes pour les types %s et %s" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 +#: 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 "il manque un ou des opérateurs à la classe d'opérateur « %s » de la méthode d'accès %s" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 access/gist/gistvalidate.c:274 +#: 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 "la classe d'opérateur « %s » de la méthode d'accès %s nécessite la fonction de support manquante %d" @@ -598,90 +834,91 @@ msgstr "L'attribut « %s » du type %s n'existe pas dans le type %s." msgid "number of columns (%d) exceeds limit (%d)" msgstr "le nombre de colonnes (%d) dépasse la limite (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format 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:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "la ligne index requiert %zu octets, la taille maximum est %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1906 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "code de format non supporté : %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Les valeurs valides sont entre « on », « off » et « auto »." -#: access/common/reloptions.c:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Les valeurs valides sont entre « local » et « cascaded »." -#: access/common/reloptions.c:682 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "limite dépassée des types de paramètres de la relation définie par l'utilisateur" -#: access/common/reloptions.c:1225 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET ne doit pas inclure de valeurs pour les paramètres" -#: access/common/reloptions.c:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "espace de nom du paramètre « %s » non reconnu" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12538 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12987 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "les tables avec WITH OIDS ne sont pas supportées" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "paramètre « %s » non reconnu" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "le paramètre « %s » est spécifié plus d'une fois" -#: access/common/reloptions.c:1592 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "valeur invalide pour l'option booléenne « %s » : %s" -#: access/common/reloptions.c:1604 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "valeur invalide pour l'option de type integer « %s » : %s" -#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "valeur %s en dehors des limites pour l'option « %s »" -#: access/common/reloptions.c:1612 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Les valeurs valides sont entre « %d » et « %d »." -#: access/common/reloptions.c:1624 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "valeur invalide pour l'option de type float « %s » : %s" -#: access/common/reloptions.c:1632 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Les valeurs valides sont entre « %f » et « %f »." -#: access/common/reloptions.c:1654 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "valeur invalide pour l'option enum « %s » : %s" @@ -696,12 +933,8 @@ msgstr "méthode de compression lz4 non supportée" msgid "This functionality requires the server to be built with lz4 support." msgstr "Cette fonctionnalité nécessite que le serveur dispose du support de 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 "Vous devez recompiler PostgreSQL en utilisant %s." - -#: access/common/tupdesc.c:825 parser/parse_clause.c:771 parser/parse_relation.c:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "la colonne « %s » ne peut pas être déclarée SETOF" @@ -731,7 +964,7 @@ msgstr "« %s » n'est pas un index GIN" msgid "cannot access temporary indexes of other sessions" msgstr "ne peut pas accéder aux index temporaires d'autres sessions" -#: access/gin/ginget.c:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "échec pour retrouver la ligne dans l'index « %s »" @@ -748,12 +981,15 @@ 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:2169 utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6486 +#: 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" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 +#: 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 "" @@ -765,29 +1001,34 @@ msgstr "" msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "la classe d'opérateur « %s » de la méthode d'accès %s nécessite la fonction de support manquante %d ou %d" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 access/spgist/spgvalidate.c:387 +#: 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 "le numéro de fonction d'appui %d est invalide pour la méthode d'accès %s" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "l'index « %s » contient une ligne interne marquée comme invalide" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 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 "" "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: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 +#: access/gist/gist.c:762 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 "Merci d'exécuter REINDEX sur cet objet." -#: access/gist/gist.c:1194 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "correction d'une division non terminée dans l'index « %s », bloc %u" @@ -805,12 +1046,14 @@ msgstr "" "ou essayez d'utiliser la colonne comme second dans la commande\n" "CREATE INDEX." -#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:807 +#: 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 "l'index « %s » contient une page zéro inattendue au bloc %u" -#: access/gist/gistutil.c:808 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: 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 "l'index « %s » contient une page corrompue au bloc %u" @@ -829,32 +1072,40 @@ 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:278 access/hash/hashfunc.c:335 utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, 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:279 access/hash/hashfunc.c:336 catalog/heap.c:711 catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:1988 commands/tablecmds.c:16957 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:1004 utils/adt/varchar.c:733 utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1979 commands/tablecmds.c:17503 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 utils/adt/varlena.c:1499 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Utilisez la clause COLLATE pour configurer explicitement le collationnement." -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:83 #, c-format 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:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, 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." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "numéro de bloc de surcharge invalide %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 "en dehors des pages surchargées dans l'index haché « %s »" @@ -886,32 +1137,33 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "il manque un opérateur inter-type pour la famille d'opérateur « %s » de la méthode d'accès %s" -#: access/heap/heapam.c:2288 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "ne peut pas insérer de lignes dans un processus parallèle" -#: access/heap/heapam.c:2759 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "ne peut pas supprimer les lignes lors d'une opération parallèle" -#: access/heap/heapam.c:2805 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "tentative de supprimer une ligne invisible" -#: access/heap/heapam.c:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 #, 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" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3307 #, c-format msgid "attempted to update invisible tuple" msgstr "tentative de mettre à jour une ligne invisible" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 +#: access/heap/heapam.c:4972 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 »" @@ -931,7 +1183,15 @@ 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:1013 access/heap/rewriteheap.c:1131 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:3351 access/transam/xlog.c:3542 access/transam/xlog.c:4759 access/transam/xlog.c:11377 access/transam/xlog.c:11415 access/transam/xlog.c:11820 access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4633 postmaster/postmaster.c:5671 replication/logical/origin.c:587 replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1261 +#: 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:8657 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:517 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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 "n'a pas pu créer le fichier « %s » : %m" @@ -941,165 +1201,174 @@ 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:1159 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3423 access/transam/xlog.c:3598 access/transam/xlog.c:4771 postmaster/postmaster.c:4643 postmaster/postmaster.c:4653 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1741 replication/slot.c:1586 storage/file/buffile.c:506 storage/file/copydir.c:207 utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 utils/misc/guc.c:10316 utils/misc/guc.c:10330 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: 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:529 +#: postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 +#: replication/slot.c:1666 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:8721 +#: utils/misc/guc.c:8752 utils/misc/guc.c:10742 utils/misc/guc.c:10756 +#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, 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:1249 access/transam/twophase.c:1679 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:4424 replication/logical/snapbuild.c:1686 replication/logical/snapbuild.c:2102 replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 utils/time/snapmgr.c:1606 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:436 +#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 +#: replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 +#: replication/slot.c:1763 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:373 storage/smgr/md.c:432 storage/sync/sync.c:250 +#: utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: access/heap/vacuumlazy.c:773 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "exécution d'un VACUUM agressif sur « %s.%s.%s »" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "exécution du VACUUM sur « %s.%s.%s »" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "fin du VACUUM de « %s.%s.%s » : %d parcours d'index\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 "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:775 +#: access/heap/vacuumlazy.c:676 #, 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:780 +#: access/heap/vacuumlazy.c:681 #, 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:782 +#: access/heap/vacuumlazy.c:683 #, 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:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "pages : %u supprimées, %u restantes, %u parcourues (%.2f%% au total)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "lignes : %lld supprimées, %lld restantes, %lld sont mortes mais pas encore supprimables\n" + +#: access/heap/vacuumlazy.c:703 +#, c-format +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "enregistrements manquants: %lld morts à partir de %u blocs non supprimés à cause d'une contention du verrou de nettoyage\n" + +#: access/heap/vacuumlazy.c:708 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "" + +#: access/heap/vacuumlazy.c:714 #, 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" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "nouveau relfrozenxid: %u, qui est %d XID devant la valeur précédente\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:721 #, 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" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "nouveau relminmxid: %u, qui est %d MXID devant la valeur précédente\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " msgstr "parcours d'index non nécessaire : " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "parcours d'index nécessaire : " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format 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 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "parcours d'index contourné : " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "parcours d'index contourné par failsafe : " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, c-format 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:834 +#: access/heap/vacuumlazy.c:755 #, 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:846 commands/analyze.c:814 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format 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:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, 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:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, 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:857 +#: access/heap/vacuumlazy.c:785 #, c-format 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:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "utilisation du système : %s" -#: 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:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "exécution du VACUUM sur « %s.%s »" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format 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: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: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: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:1666 commands/indexcmds.c:4152 commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s." - -#: access/heap/vacuumlazy.c:1669 -#, c-format -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:2173 -#, c-format -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:2617 +#: access/heap/vacuumlazy.c:2629 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" 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:2622 +#: access/heap/vacuumlazy.c:2634 #, c-format 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:2623 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1108,104 +1377,67 @@ 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: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: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: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: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:3124 -#, 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.\n" -"%s." -msgstr "" -"%.0f versions de ligne d'index ont été supprimées.\n" -"%u blocs d'index ont été nouvellement supprimés.\n" -"%u blocs d'index sont actuellement supprimés, dont %u sont actuellement réutilisables.\n" -"%s." - -#: access/heap/vacuumlazy.c:3233 +#: access/heap/vacuumlazy.c:2878 #, 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:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "table « %s » : %u pages tronqués en %u" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format 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:3508 +#: access/heap/vacuumlazy.c:3170 #, 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:4274 +#: access/heap/vacuumlazy.c:3383 #, c-format 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:4277 +#: access/heap/vacuumlazy.c:3386 #, 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:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "lors du parcours de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4289 +#: access/heap/vacuumlazy.c:3398 #, c-format 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:4292 +#: access/heap/vacuumlazy.c:3401 #, 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:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "lors du vacuum de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, 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:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, 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:4312 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "lors du tronquage de la relation « %s.%s » à %u blocs" @@ -1220,12 +1452,14 @@ msgstr "la méthode d'accès « %s » n'est pas de type %s" msgid "index access method \"%s\" does not have a handler" msgstr "la méthode d'accès « %s » n'a pas de handler" -#: access/index/genam.c:486 +#: access/index/genam.c:489 #, c-format 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:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 commands/tablecmds.c:16655 commands/tablecmds.c:18406 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2807 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17191 commands/tablecmds.c:18974 #, c-format msgid "\"%s\" is not an index" msgstr "« %s » n'est pas un index" @@ -1235,22 +1469,23 @@ msgstr "« %s » n'est pas un index" msgid "operator class %s has no options" msgstr "la classe d'opérateur %s n'a pas d'options" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "la valeur d'une clé dupliquée rompt la contrainte unique « %s »" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "La clé « %s » existe déjà." -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Ceci peut être dû à une expression d'index immutable." -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2330 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "l'index « %s » n'est pas un btree" @@ -1260,27 +1495,27 @@ msgstr "l'index « %s » n'est pas un btree" msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "la version ne correspond pas dans l'index « %s » : version du fichier %d, version courante %d, version minimale supportée %d" -#: access/nbtree/nbtpage.c:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "l'index « %s » contient une page interne à moitié morte" -#: 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 "Ceci peut être dû à un VACUUM interrompu en version 9.3 ou antérieure, avant la mise à jour. Merci d'utiliser REINDEX." -#: access/nbtree/nbtutils.c:2680 +#: access/nbtree/nbtutils.c:2684 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "la taille de la ligne d'index, %zu, dépasse le maximum pour un btree de version %u, soit %zu, pour l'index « %s »" -#: access/nbtree/nbtutils.c:2686 +#: access/nbtree/nbtutils.c:2690 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "La ligne d'index référence le tuple (%u,%u) dans la relation « %s »." -#: access/nbtree/nbtutils.c:2690 +#: access/nbtree/nbtutils.c:2694 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1303,7 +1538,7 @@ msgstr "" 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:1017 +#: access/spgist/spgutils.c:1016 #, 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" @@ -1320,12 +1555,15 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s nécessite la fonction de support %d\n" "pour le type %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: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 » 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:13367 commands/tablecmds.c:16664 +#: 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:13880 +#: commands/tablecmds.c:17200 #, c-format msgid "\"%s\" is a composite type" msgstr "« %s » est un type composite" @@ -1340,7 +1578,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:12462 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12911 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s est trop long (%d caractères maximum)." @@ -1360,22 +1598,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:280 +#: access/transam/commit_ts.c:282 #, 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:378 +#: access/transam/commit_ts.c:380 #, 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:380 +#: access/transam/commit_ts.c:382 #, 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:382 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré." @@ -1385,7 +1623,8 @@ msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "la base de données n'accepte pas de commandes qui génèrent de nouveaux MultiXactId pour éviter les pertes de données suite à une réinitialisation de l'identifiant de transaction dans la base de données « %s »" -#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 access/transam/multixact.c:1055 access/transam/multixact.c:1064 +#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 +#: access/transam/multixact.c:1055 access/transam/multixact.c:1064 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1454,7 +1693,9 @@ msgstr "le MultiXactId %u n'existe plus : wraparound apparent" msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "le MultiXactId %u n'a pas encore été créé : wraparound apparent" -#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 access/transam/varsup.c:151 access/transam/varsup.c:158 access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 +#: 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" @@ -1523,57 +1764,116 @@ msgstr "n'a pas pu mapper le segment de mémoire partagée dynamique" msgid "invalid magic number in dynamic shared memory segment" msgstr "numéro magique invalide dans le segment de mémoire partagée dynamique" -#: access/transam/slru.c:713 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "gestionnaire de ressources d'identifiant %d non enregistré" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Inclure le module d'extension qui implémente ce gestionnaire de ressource dans shared_preload_libraries." + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "le nom du gestionnaire personnalisé de ressources est invalide" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Fournit un nom non vide pour le gestionnaire personnalisé de ressources." + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "l'identifiant du gestionnaire personnalisé de ressources %d est hors des limites" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Fournissez un identifiant de gestionnaire de ressources personnalisé compris entre %d et %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 "échec de l'enregistrement du gestionnaire de ressources personnalisé « %s » d'identifiant %d" + +#: access/transam/rmgr.c:112 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "Le gestionnaire de ressource personnalisé doit être enregistré lors de l'initialisation des modules dans shared_preload_libraries." + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Gestionnaire de ressources personnalisé « %s » déjà enregistré avec le même identifiant." + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "Le gestionnaire de ressource existant d'ID %d a le même nom." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "enregistrement du gestionnaire personnalisé de ressources « %s » avec l'identifiant %d" + +#: access/transam/slru.c:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "le fichier « %s » n'existe pas, contenu lu comme des zéros" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "n'a pas pu accéder au statut de la transaction %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "N'a pas pu ouvrir le fichier « %s » : %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "N'a pas pu se déplacer dans le fichier « %s » au décalage %u : %m." +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "N'a pas pu se déplacer dans le fichier « %s » au décalage %d : %m." -#: access/transam/slru.c:960 +#: access/transam/slru.c:961 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "N'a pas pu lire le fichier « %s » au décalage %u : %m." +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "N'a pas pu lire le fichier « %s » au décalage %d : %m." -#: access/transam/slru.c:965 +#: access/transam/slru.c:966 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "N'a pas pu lire le fichier « %s » au décalage %u : lu trop peu d'octets." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "N'a pas pu lire le fichier « %s » au décalage %d : lu trop peu d'octets." -#: access/transam/slru.c:972 +#: access/transam/slru.c:973 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "N'a pas pu écrire le fichier « %s » au décalage %u : %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "N'a pas pu écrire le fichier « %s » au décalage %d : %m." -#: access/transam/slru.c:977 +#: access/transam/slru.c:978 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "N'a pas pu écrire dans le fichier « %s » au décalage %u : écrit trop peu d'octets." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "N'a pas pu écrire dans le fichier « %s » au décalage %d : écrit trop peu d'octets." -#: access/transam/slru.c:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "N'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "N'a pas pu fermer le fichier « %s » : %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "n'a pas pu tronquer le répertoire « %s » : contournement apparent" @@ -1620,187 +1920,189 @@ msgstr "" msgid "requested timeline %u is not in this server's history" msgstr "la timeline %u requise n'est pas dans l'historique de ce serveur" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "l'identifiant de la transaction « %s » est trop long" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "les transactions préparées sont désactivées" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Configure max_prepared_transactions à une valeur différente de zéro." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:413 #, c-format 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:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, 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:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Augmentez max_prepared_transactions (actuellement %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, 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:601 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "droit refusé pour terminer la transaction préparée" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:606 #, 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:613 +#: access/transam/twophase.c:617 #, 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:614 +#: access/transam/twophase.c:618 #, 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:629 +#: access/transam/twophase.c:633 #, 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:1150 +#: access/transam/twophase.c:1170 #, 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:1305 +#: access/transam/twophase.c:1325 #, 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:1314 +#: access/transam/twophase.c:1334 #, 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:1332 +#: access/transam/twophase.c:1352 #, 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:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "nombre magique invalide dans le fichier « %s »" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "taille invalide stockée dans le fichier « %s »" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, 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:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, 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:1417 +#: access/transam/twophase.c:1425 #, 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:1422 +#: access/transam/twophase.c:1430 #, 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:1430 +#: access/transam/twophase.c:1438 #, 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:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "n'a pas pu recréer le fichier « %s » : %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, 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:2068 +#: access/transam/twophase.c:2095 #, 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:2159 +#: access/transam/twophase.c:2188 #, 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:2166 +#: access/transam/twophase.c:2195 #, 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:2179 +#: access/transam/twophase.c:2208 #, 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:2186 +#: access/transam/twophase.c:2215 #, 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:2211 +#: access/transam/twophase.c:2240 #, 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:2216 +#: access/transam/twophase.c:2245 #, 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" -#: access/transam/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" -msgstr "n'a pas pu récupérer le fichier d'état de validation en deux phases pour la transaction %u" +msgstr "n'a pas pu récupérer le fichier d'état de la validation en deux phases pour la transaction %u" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." -msgstr "Le fichier d'état de validation en deux phases a été trouvé dans l'enregistrement %X/%X des journaux de transactions, mais cette transaction a déjà été restaurée du disque." +msgstr "" -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "n'a pas pu accéder au fichier « %s » : %m" @@ -1846,191 +2148,177 @@ 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:1046 +#: access/transam/xact.c:1098 #, 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:1584 +#: access/transam/xact.c:1644 #, 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:2435 +#: access/transam/xact.c:2501 #, 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:2445 +#: access/transam/xact.c:2511 #, 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:3416 +#: access/transam/xact.c:3479 #, 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:3426 +#: access/transam/xact.c:3489 #, 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:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" -msgstr "%s ne peut pas être exécuté à l'intérieur d'un pipeline" +msgstr "%s ne peut pas être exécuté dans un pipeline" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, 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:3517 access/transam/xact.c:3832 access/transam/xact.c:3911 access/transam/xact.c:4034 access/transam/xact.c:4185 access/transam/xact.c:4254 access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 +#: access/transam/xact.c:3974 access/transam/xact.c:4097 +#: access/transam/xact.c:4248 access/transam/xact.c:4317 +#: access/transam/xact.c:4428 #, 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:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "une transaction est déjà en cours" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 +#: access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "aucune transaction en cours" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "ne peut pas valider pendant une opération parallèle" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, 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:4149 +#: access/transam/xact.c:4212 #, 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:4236 +#: access/transam/xact.c:4299 #, 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:4246 access/transam/xact.c:4297 access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 +#: access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "le point de sauvegarde « %s » n'existe pas" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, 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:4345 +#: access/transam/xact.c:4408 #, 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:4473 +#: access/transam/xact.c:4536 #, 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:4541 +#: access/transam/xact.c:4604 #, 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:5188 +#: access/transam/xact.c:5251 #, 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:1836 +#: access/transam/xlog.c:1463 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "demande pour vider après la fin du WAL généré ; demande %X/%X, position actuelle %X/%X" -#: access/transam/xlog.c:2609 +#: access/transam/xlog.c:2224 #, 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:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "Ceci est connu pour échouer de temps en temps lors d'une restauration d'archive. C'est sans danger." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 replication/walsender.c:2557 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, 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:4289 +#: access/transam/xlog.c:3756 #, c-format msgid "could not rename file \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » : %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, 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:4347 +#: access/transam/xlog.c:3814 #, 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:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3817 commands/dbcommands.c:3115 #, 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:4472 -#, 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:4610 -#, 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:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "la nouvelle timeline cible est %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3884 #, 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:4838 access/transam/xlog.c:4847 access/transam/xlog.c:4871 access/transam/xlog.c:4878 access/transam/xlog.c:4885 access/transam/xlog.c:4890 access/transam/xlog.c:4897 access/transam/xlog.c:4904 access/transam/xlog.c:4911 access/transam/xlog.c:4918 access/transam/xlog.c:4925 access/transam/xlog.c:4932 access/transam/xlog.c:4941 access/transam/xlog.c:4948 utils/init/miscinit.c:1583 +#: 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 "les fichiers de la base de données sont incompatibles avec le serveur" -#: access/transam/xlog.c:4839 +#: 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 "" @@ -2038,405 +2326,764 @@ msgstr "" "%d (0x%08x) alors que le serveur a été compilé avec un PG_CONTROL_VERSION à\n" "%d (0x%08x)." -#: access/transam/xlog.c:4843 +#: 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 "" "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:4848 +#: 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 "" "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:4851 access/transam/xlog.c:4875 access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: 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 "Il semble que vous avez besoin d'initdb." -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "somme de contrôle incorrecte dans le fichier de contrôle" -#: access/transam/xlog.c:4872 +#: 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 "" "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:4879 +#: 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 "" "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:4886 +#: 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 "" "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:4891 +#: 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 "" "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: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:4929 access/transam/xlog.c:4936 access/transam/xlog.c:4944 access/transam/xlog.c:4951 +#: 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 "Il semble que vous avez besoin de recompiler ou de relancer initdb." -#: access/transam/xlog.c:4898 +#: 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 "" "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:4905 +#: 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 "" "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:4912 +#: 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 "" "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:4919 +#: 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 "" "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:4926 +#: 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 "" "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:4933 +#: 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 "" "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:4942 +#: 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 "" "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:4949 +#: 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 "" "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:4958 +#: 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] "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:4970 +#: access/transam/xlog.c:4175 #, 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:4974 +#: access/transam/xlog.c:4179 #, 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:5408 +#: access/transam/xlog.c:4620 #, 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:5416 +#: access/transam/xlog.c:4628 #, 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:5422 +#: access/transam/xlog.c:4634 #, 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" -# /* -# * Check for old recovery API file: recovery.conf -# */ -#: access/transam/xlog.c:5483 +#: access/transam/xlog.c:4852 #, 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é" +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:5548 +#: access/transam/xlog.c:4853 #, 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" +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:5565 +#: access/transam/xlog.c:4854 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "ni primary_conninfo ni restore_command n'est spécifié" +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:5566 +#: access/transam/xlog.c:4918 #, 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." +msgid "control file contains invalid checkpoint location" +msgstr "le fichier de contrôle contient un emplacement de checkpoint invalide" -#: access/transam/xlog.c:5574 +#: access/transam/xlog.c:4929 #, 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é" +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:5612 +#: access/transam/xlog.c:4935 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "le timeline cible, %u, de la restauration n'existe pas" +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:5734 +#: access/transam/xlog.c:4941 #, c-format -msgid "archive recovery complete" -msgstr "restauration de l'archive terminée" +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:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4947 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "arrêt de la restauration après avoir atteint le point de cohérence" +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:5821 +#: access/transam/xlog.c:4949 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "arrêt de la restauration avant l'emplacement 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 "" +"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:5911 +#: access/transam/xlog.c:4955 #, 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" +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:5918 +#: access/transam/xlog.c:4957 #, 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" +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:5971 +#: access/transam/xlog.c:4963 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "restauration en arrêt au point de restauration « %s », heure %s" +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:5989 +#: access/transam/xlog.c:4969 #, 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 »" +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:6056 +#: access/transam/xlog.c:5353 #, 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" +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:6064 +#: access/transam/xlog.c:5354 #, 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" +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:6109 +#: access/transam/xlog.c:5357 #, c-format -msgid "pausing at the end of recovery" -msgstr "pause à la fin de la restauration" +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:6110 +#: access/transam/xlog.c:5405 #, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "Exécuter pg_wal_replay_resume() pour promouvoir." +msgid "selected new timeline ID: %u" +msgstr "identifiant d'un timeline nouvellement sélectionné : %u" -#: access/transam/xlog.c:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5438 #, c-format -msgid "recovery has paused" -msgstr "restauration en pause" +msgid "archive recovery complete" +msgstr "restauration de l'archive terminée" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6044 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Exécuter pg_wal_replay_resume() pour continuer." +msgid "shutting down" +msgstr "arrêt en cours" -#: access/transam/xlog.c:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6083 #, 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" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "début du restartpoint :%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6387 access/transam/xlog.c:6414 access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6095 #, 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." +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:6396 +#: access/transam/xlog.c:6155 #, 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é." +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 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:6397 +#: access/transam/xlog.c:6175 #, 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." +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 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:6408 +#: access/transam/xlog.c:6610 #, 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" +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:6418 +#: access/transam/xlog.c:7167 #, 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." +msgid "recovery restart point at %X/%X" +msgstr "la ré-exécution en restauration commence à %X/%X" -#: access/transam/xlog.c:6442 +#: access/transam/xlog.c:7169 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "restauration annulée à cause d'un paramétrage insuffisant" +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:6448 +#: access/transam/xlog.c:7416 #, 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." +msgid "restore point \"%s\" created at %X/%X" +msgstr "point de restauration « %s » créé à %X/%X" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7623 #, 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" +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:7680 +#, fuzzy, c-format +#| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "" +"identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" +"point de vérification" + +#: access/transam/xlog.c:7738 +#, fuzzy, c-format +#| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "" +"identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" +"point de vérification" -#: access/transam/xlog.c:6471 +#: access/transam/xlog.c:7767 +#, 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 "" +"identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" +"point de vérification" + +#: access/transam/xlog.c:8025 #, 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." +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:6472 +#: access/transam/xlog.c:8031 #, 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." +msgid "could not fdatasync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fdatasync) le fichier « %s » : %m" -#: access/transam/xlog.c:6541 +#: access/transam/xlog.c:8126 access/transam/xlog.c:8493 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "le fichier de contrôle contient un emplacement de checkpoint invalide" +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:6552 +#: access/transam/xlog.c:8127 access/transam/xlog.c:8494 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was shut down at %s" -msgstr "le système de bases de données a été arrêté à %s" +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:6558 +#: access/transam/xlog.c:8132 #, 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" +msgid "backup label too long (max %d bytes)" +msgstr "label de sauvegarde trop long (%d octets maximum)" + +# /* +# * Check to see if all WAL replayed during online backup +# * (i.e., since last restartpoint used as backup starting +# * checkpoint) contain full-page writes. +# */ +#: access/transam/xlog.c:8248 +#, 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:6564 +#: access/transam/xlog.c:8250 access/transam/xlog.c:8606 #, 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" +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:6570 +#: access/transam/xlog.c:8330 backup/basebackup.c:1345 utils/adt/misc.c:347 #, 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" +msgid "symbolic link \"%s\" target is too long" +msgstr "la cible du lien symbolique « %s » est trop longue" -#: access/transam/xlog.c:6572 +#: access/transam/xlog.c:8380 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgid "tablespaces are not supported on this platform" +msgstr "les tablespaces ne sont pas supportés sur cette plateforme" + +#: access/transam/xlog.c:8539 access/transam/xlog.c:8552 +#: access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 +#: access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 +#: access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "données invalides dans le fichier « %s »" + +#: access/transam/xlog.c:8556 backup/basebackup.c:1200 +#, 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:8557 backup/basebackup.c:1201 +#, c-format +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "" -"Ceci signifie probablement que des données ont été corrompues et que vous\n" -"devrez utiliser la dernière sauvegarde pour la restauration." +"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:6578 +#: access/transam/xlog.c:8604 #, c-format -msgid "database system was interrupted while in recovery at log time %s" +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:8729 +#, 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:8743 +#, 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:8745 +#, 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:8752 +#, 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:8756 +#, 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:8805 +#, fuzzy, c-format +#| msgid "aborting backup due to backend exiting before pg_stop_backup was called" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "annulation de la sauvegarde due à la déconnexion du processus serveur avant que pg_stop_backup ne soit appelé" + +#: access/transam/xlogarchive.c:215 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "le fichier d'archive « %s » a la mauvaise taille : %lld au lieu de %lld" + +#: access/transam/xlogarchive.c:224 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "restauration du journal de transactions « %s » à partir de l'archive" + +#: access/transam/xlogarchive.c:238 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command a renvoyé un code de sortie zéro, mais stat() a échoué." + +#: access/transam/xlogarchive.c:270 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive : %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:383 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s « %s »: %s" + +#: access/transam/xlogarchive.c:493 access/transam/xlogarchive.c:573 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %m" + +#: access/transam/xlogarchive.c:501 access/transam/xlogarchive.c:581 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "n'a pas pu écrire le fichier de statut d'archivage « %s » : %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "une sauvegarde est déjà en cours dans cette session" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "la sauvegarde n'est pas en cours" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "Avez-vous appelé pg_backup_start() ?" + +#: 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 "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/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "le niveau de journalisation n'est pas suffisant pour créer un point de restauration" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "valeur trop longue pour le point de restauration (%d caractères maximum)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s ne peut pas être exécuté lors de la restauration." + +#: 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 "recovery is not in progress" +msgstr "la restauration n'est pas en cours" + +#: 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 "Recovery control functions can only be executed during recovery." msgstr "" -"le système de bases de données a été interrompu lors d'une récupération à %s\n" -"(moment de la journalisation)" +"Les fonctions de contrôle de la restauration peuvent seulement être exécutées\n" +"lors de la restauration." -#: access/transam/xlog.c:6580 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, 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." +msgid "standby promotion is ongoing" +msgstr "la promotion du standby est en cours" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s ne peut pas être exécuté une fois la promotion en cours d'exécution." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "« wait_seconds » ne doit pas être négatif ou nul" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "n'a pas pu envoyer le signal au postmaster : %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +msgid "server did not promote within %d second" +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/xlogprefetcher.c:1090 +#, fuzzy, c-format +#| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" + +#: access/transam/xlogreader.c:592 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "décalage invalide de l'enregistrement %X/%X" + +#: access/transam/xlogreader.c:600 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "« contrecord » est requis par %X/%X" + +#: access/transam/xlogreader.c:641 access/transam/xlogreader.c:1106 +#, 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:730 +#, 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:743 +#, 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:1114 +#, 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:1127 access/transam/xlogreader.c:1143 +#, 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:1181 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" 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." +"somme de contrôle des données du gestionnaire de ressources incorrecte à\n" +"l'enregistrement %X/%X" -#: access/transam/xlog.c:6586 +#: access/transam/xlogreader.c:1218 #, 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" +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/xlog.c:6592 +#: access/transam/xlogreader.c:1232 access/transam/xlogreader.c:1273 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "le fichier de contrôle contient un état invalide de l'instance" +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:1247 +#, 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'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:1255 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +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:1261 +#, 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" + +#: access/transam/xlogreader.c:1292 +#, 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:1317 +#, 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:1722 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %u désordonné à %X/%X" -#: access/transam/xlog.c:6649 +#: access/transam/xlogreader.c:1746 +#, 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:1753 +#, 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:1789 +#, 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" + +#: access/transam/xlogreader.c:1805 +#, 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" + +#: access/transam/xlogreader.c:1819 +#, c-format +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" + +#: access/transam/xlogreader.c:1834 +#, c-format +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" + +#: access/transam/xlogreader.c:1850 +#, 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:1862 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "block_id %u invalide à %X/%X" + +#: access/transam/xlogreader.c:1929 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "enregistrement de longueur invalide à %X/%X" + +#: access/transam/xlogreader.c:1954 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL" + +#: access/transam/xlogreader.c:2038 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué" + +#: access/transam/xlogreader.c:2045 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d" + +#: access/transam/xlogreader.c:2072 access/transam/xlogreader.c:2089 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d" + +#: access/transam/xlogreader.c:2098 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d" + +#: access/transam/xlogreader.c:2106 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d" + +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "entre en mode standby" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, 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:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "début de la restauration de l'archive à %s" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "début de la restauration PITR à « %s »" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, 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:6668 +#: access/transam/xlogrecovery.c:564 #, 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:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "début de la restauration de l'archive" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:651 #, 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:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2447,1510 +3094,1442 @@ 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:6755 +#: access/transam/xlogrecovery.c:661 #, 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:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 #, 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:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 #, 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:6818 access/transam/xlog.c:12353 +#: access/transam/xlogrecovery.c:724 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Le fichier « %s » a été renommé en « %s »." -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:730 #, 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:6875 +#: access/transam/xlogrecovery.c:784 #, 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:6913 +#: access/transam/xlogrecovery.c:808 #, 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:6915 +#: access/transam/xlogrecovery.c:810 #, 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:6929 +#: access/transam/xlogrecovery.c:824 #, 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:6959 +#: access/transam/xlogrecovery.c:852 #, c-format msgid "invalid next transaction ID" msgstr "prochain ID de transaction invalide" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:857 #, 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:7070 +#: access/transam/xlogrecovery.c:868 #, 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:7110 +#: access/transam/xlogrecovery.c:897 #, 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:7114 +#: access/transam/xlogrecovery.c:901 #, 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:7161 +#: access/transam/xlogrecovery.c:944 #, 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:7162 +#: access/transam/xlogrecovery.c:945 #, 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:7388 -#, c-format -msgid "redo starts at %X/%X" -msgstr "la ré-exécution commence à %X/%X" - -#: access/transam/xlog.c:7613 -#, 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:7651 -#, 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:7657 -#, 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:7666 -#, c-format -msgid "redo is not required" -msgstr "la ré-exécution n'est pas nécessaire" - -#: access/transam/xlog.c:7678 +# /* +# * Check for old recovery API file: recovery.conf +# */ +#: access/transam/xlogrecovery.c:999 #, 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" +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:7762 access/transam/xlog.c:7766 +#: access/transam/xlogrecovery.c:1064 #, 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" +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:7763 +#: access/transam/xlogrecovery.c:1081 #, 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." +msgid "specified neither primary_conninfo nor restore_command" +msgstr "ni primary_conninfo ni restore_command n'est spécifié" -#: access/transam/xlog.c:7767 +#: access/transam/xlogrecovery.c:1082 #, 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." +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "" -"Une sauvegarde en ligne commencée avec pg_start_backup() doit se terminer avec\n" -"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:7770 -#, 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:7805 -#, c-format -msgid "selected new timeline ID: %u" -msgstr "identifiant d'un timeline nouvellement sélectionné : %u" - -#: access/transam/xlog.c:8249 -#, c-format -msgid "unexpected directory entry \"%s\" found in %s" -msgstr "entrée « %s » du répertoire inattendu trouvé dans %s" - -#: access/transam/xlog.c:8251 -#, c-format -msgid "All directory entries in pg_tblspc/ should be symbolic links." -msgstr "Toutes les entrées du répertoire pg_tblspc devraient être des liens symboliques." - -#: access/transam/xlog.c:8252 -#, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Supprimer ces répertoires, ou configurer allow_in_place_tablespaces à ON pour que la restauration se termine." - -#: access/transam/xlog.c:8336 -#, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "état de restauration cohérent atteint à %X/%X" - -#: access/transam/xlog.c:8545 -#, 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:8549 -#, 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:8567 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "enregistrement du point de vérification primaire invalide" - -#: access/transam/xlog.c:8571 -#, c-format -msgid "invalid checkpoint record" -msgstr "enregistrement du point de vérification invalide" - -#: access/transam/xlog.c:8582 -#, 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:8586 -#, 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:8599 -#, 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:8603 -#, 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:8614 -#, 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:8618 -#, c-format -msgid "invalid length of checkpoint record" -msgstr "longueur invalide de l'enregistrement du point de vérification" +"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:8799 +#: access/transam/xlogrecovery.c:1090 #, c-format -msgid "shutting down" -msgstr "arrêt en cours" +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é" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 +#: access/transam/xlogrecovery.c:1128 #, 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" +msgid "recovery target timeline %u does not exist" +msgstr "le timeline cible, %u, de la restauration n'existe pas" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8850 +#: access/transam/xlogrecovery.c:1278 #, 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" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "L'identifiant de timeline parsé est %u, mais %u était attendu." -#: access/transam/xlog.c:8910 +#: access/transam/xlogrecovery.c:1660 #, 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 "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" +msgid "redo starts at %X/%X" +msgstr "la ré-exécution commence à %X/%X" -#: access/transam/xlog.c:8930 +#: access/transam/xlogrecovery.c:1673 #, 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 "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" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo en cours, temps écoulé : %ld.%02d s, LSN actuel : %X/%X" -#: access/transam/xlog.c:9374 +#: access/transam/xlogrecovery.c:1765 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" +msgid "requested recovery stop point is before consistent recovery point" 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:9907 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "la ré-exécution en restauration commence à %X/%X" - -#: access/transam/xlog.c:9909 -#, 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:10155 -#, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "point de restauration « %s » créé à %X/%X" - -#: access/transam/xlog.c:10300 -#, 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" +"le point d'arrêt de la restauration demandée se trouve avant le point\n" +"cohérent de restauration" -#: access/transam/xlog.c:10309 +#: access/transam/xlogrecovery.c:1797 #, 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" +msgid "redo done at %X/%X system usage: %s" +msgstr "rejeu exécuté à %X/%X utilisation système : %s" -#: access/transam/xlog.c:10325 +#: access/transam/xlogrecovery.c:1803 #, 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" +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:10400 +#: access/transam/xlogrecovery.c:1812 #, 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" +msgid "redo is not required" +msgstr "la ré-exécution n'est pas nécessaire" -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 access/transam/xlog.c:10542 +#: access/transam/xlogrecovery.c:1823 #, 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" +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:10700 +#: access/transam/xlogrecovery.c:1998 #, 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:10915 +#: access/transam/xlogrecovery.c:2065 +#, fuzzy, c-format +#| msgid "Expected array element or \"]\", but found \"%s\"." +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "Élément de tableau ou « ] » attendu, mais « %s » trouvé." + +#: access/transam/xlogrecovery.c:2067 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier %s : %m" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "Toutes les entrées de répertoire dans pg_tblspc/ devraient être des liens symboliques." -#: access/transam/xlog.c:10921 +#: access/transam/xlogrecovery.c:2068 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "n'a pas pu synchroniser sur disque (fdatasync) le fichier « %s » : %m" +msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." +msgstr "Supprimez ces répertoires, ou configurez allow_in_place_tablespaces à on pour laisser la récupération terminer" -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 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/xlogrecovery.c:2142 #, 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." +msgid "consistent recovery state reached at %X/%X" +msgstr "état de restauration cohérent atteint à %X/%X" -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 #, 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" +msgid "WAL redo at %X/%X for %s" +msgstr "rejeu des WAL à %X/%X pour %s" -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 access/transam/xlogfuncs.c:308 +#: access/transam/xlogrecovery.c:2276 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +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/xlogrecovery.c:2285 +#, c-format +msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "" -"wal_level doit être configuré à « replica » ou « logical »\n" -"au démarrage du serveur." +"identifiant timeline %u inattendu (après %u) dans l'enregistrement du point\n" +"de vérification" -#: access/transam/xlog.c:11047 +#: access/transam/xlogrecovery.c:2301 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "label de sauvegarde trop long (%d octets maximum)" +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:11084 access/transam/xlog.c:11368 access/transam/xlog.c:11406 +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 #, c-format -msgid "a backup is already in progress" -msgstr "une sauvegarde est déjà en cours" +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:11085 +#: access/transam/xlogrecovery.c:2506 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Exécutez pg_stop_backup() et tentez de nouveau." +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "arrêt de la restauration avant l'emplacement WAL (LSN) « %X/%X »" -# /* -# * Check to see if all WAL replayed during online backup -# * (i.e., since last restartpoint used as backup starting -# * checkpoint) contain full-page writes. -# */ -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:2596 #, 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)" +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:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:2603 #, 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." +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:11267 replication/basebackup.c:1439 utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2656 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "la cible du lien symbolique « %s » est trop longue" +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:11317 commands/tablespace.c:385 commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "les tablespaces ne sont pas supportés sur cette plateforme" +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:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:2741 #, 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." +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:11594 +#: access/transam/xlogrecovery.c:2749 #, c-format -msgid "exclusive backup not in progress" -msgstr "une sauvegarde exclusive n'est pas en cours" +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:11621 +#: access/transam/xlogrecovery.c:2830 #, c-format -msgid "a backup is not in progress" -msgstr "aucune sauvegarde n'est en cours" +msgid "pausing at the end of recovery" +msgstr "pause à la fin de la restauration" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 access/transam/xlog.c:12111 access/transam/xlog.c:12117 access/transam/xlog.c:12165 access/transam/xlog.c:12245 access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2831 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "données invalides dans le fichier « %s »" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Exécuter pg_wal_replay_resume() pour promouvoir." -#: access/transam/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 #, c-format -msgid "the standby was promoted during online backup" -msgstr "le standby a été promu lors de la sauvegarde en ligne" +msgid "recovery has paused" +msgstr "restauration en pause" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2835 #, 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." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Exécuter pg_wal_replay_resume() pour continuer." -#: access/transam/xlog.c:11772 +#: access/transam/xlogrecovery.c:3101 #, 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" +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:11892 +#: access/transam/xlogrecovery.c:3306 #, 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" +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:11904 +#: access/transam/xlogrecovery.c:3312 #, 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)" +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:11906 +#: access/transam/xlogrecovery.c:3961 #, 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." +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:11913 +#: access/transam/xlogrecovery.c:3965 #, c-format -msgid "all required WAL segments have been archived" -msgstr "tous les journaux de transactions requis ont été archivés" +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:11917 +#: access/transam/xlogrecovery.c:3983 #, 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" +msgid "invalid primary checkpoint record" +msgstr "enregistrement du point de vérification primaire invalide" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:3987 #, 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é" +msgid "invalid checkpoint record" +msgstr "enregistrement du point de vérification invalide" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:3998 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "L'identifiant de timeline parsé est %u, mais %u était attendu." +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" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:4002 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "rejeu des WAL à %X/%X pour %s" +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:12342 +#: access/transam/xlogrecovery.c:4015 #, c-format -msgid "online backup mode was not canceled" -msgstr "le mode de sauvegarde en ligne n'a pas été annulé" +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:12343 +#: access/transam/xlogrecovery.c:4019 #, 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." +msgid "invalid xl_info in checkpoint record" +msgstr "xl_info invalide dans l'enregistrement du point de vérification" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:4030 #, c-format -msgid "online backup mode canceled" -msgstr "mode de sauvegarde en ligne annulé" +msgid "invalid length of primary checkpoint record" +msgstr "longueur invalide de l'enregistrement primaire du point de vérification" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:4034 #, 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 »." +msgid "invalid length of checkpoint record" +msgstr "longueur invalide de l'enregistrement du point de vérification" -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:4090 #, 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." +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:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4104 #, 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" +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:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4123 #, 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" +msgid "new target timeline is %u" +msgstr "la nouvelle timeline cible est %u" -#: access/transam/xlog.c:13079 +#: access/transam/xlogrecovery.c:4326 #, 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:13174 +#: access/transam/xlogrecovery.c:4389 #, c-format msgid "received promote request" msgstr "a reçu une demande de promotion" -#: access/transam/xlog.c:13187 +#: access/transam/xlogrecovery.c:4402 #, c-format msgid "promote trigger file found: %s" msgstr "fichier trigger de promotion trouvé : %s" -#: access/transam/xlog.c:13195 +#: access/transam/xlogrecovery.c:4410 #, 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" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4635 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "le fichier d'archive « %s » a la mauvaise taille : %lld au lieu de %lld" +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/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 +#: access/transam/xlogrecovery.c:4693 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "restauration du journal de transactions « %s » à partir de l'archive" +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/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4645 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command a renvoyé un code de sortie zéro, mais stat() a échoué." +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/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4646 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive : %s" +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." -#. 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:4657 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s « %s »: %s" +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/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %m" +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/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "n'a pas pu écrire le fichier de statut d'archivage « %s » : %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "restauration annulée à cause d'un paramétrage insuffisant" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4697 #, c-format -msgid "a backup is already in progress in this session" -msgstr "une sauvegarde est déjà en cours dans cette session" +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/xlogutils.c:1053 +#, fuzzy, c-format +#| msgid "could not read from log segment %s, offset %u: %m" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "n'a pas pu lire le journal de transactions %s, décalage %u : %m" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogutils.c:1060 +#, fuzzy, c-format +#| msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u: lu %d sur %zu" + +#: backup/backup_manifest.c:253 #, c-format -msgid "non-exclusive backup in progress" -msgstr "une sauvegarde non exclusive est en cours" +msgid "expected end timeline %u but found timeline %u" +msgstr "timeline de fin attendue %u mais a trouvé la timeline %u" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: backup/backup_manifest.c:277 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Souhaitiez-vous utiliser pg_stop_backup('f') ?" +msgid "expected start timeline %u but found timeline %u" +msgstr "timeline de début attendue %u mais a trouvé la timeline %u" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 commands/event_trigger.c:1869 commands/extension.c:1966 commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 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:3328 storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 utils/adt/jsonfuncs.c:2353 -#: utils/adt/jsonfuncs.c:3814 utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10017 utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:304 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" +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" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 commands/event_trigger.c:1873 commands/extension.c:1970 commands/extension.c:2078 commands/extension.c:2363 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:3332 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:223 utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10021 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:355 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "mode matérialisé requis mais interdit dans ce contexte" +msgid "could not rewind temporary file" +msgstr "n'a pas pu revenir au début du fichier temporaire" + +#: backup/backup_manifest.c:374 +#, fuzzy, c-format +#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +msgid "could not read from 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" -#: access/transam/xlogfuncs.c:230 +#: backup/basebackup.c:454 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "une sauvegarde non exclusive n'est pas en cours" +msgid "could not find any WAL files" +msgstr "n'a pas pu trouver un seul fichier WAL" -#: access/transam/xlogfuncs.c:231 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Souhaitiez-vous utiliser pg_stop_backup('t') ?" +msgid "could not find WAL file \"%s\"" +msgstr "n'a pas pu trouver le fichier WAL « %s »" -#: access/transam/xlogfuncs.c:307 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "le niveau de journalisation n'est pas suffisant pour créer un point de restauration" +msgid "unexpected WAL file size \"%s\"" +msgstr "taille du fichier WAL « %s » inattendue" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:630 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "valeur trop longue pour le point de restauration (%d caractères maximum)" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld erreur de vérifications des sommes de contrôle au total" +msgstr[1] "%lld erreurs de vérifications des sommes de contrôle au total" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:637 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s ne peut pas être exécuté lors de la restauration." +msgid "checksum verification failure during base backup" +msgstr "échec de la véffication de somme de controle durant la sauvegarde de base" -#: 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 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "recovery is not in progress" -msgstr "la restauration n'est pas en cours" +msgid "duplicate option \"%s\"" +msgstr "option « %s » dupliquée" -#: 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 +#: backup/basebackup.c:734 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "" -"Les fonctions de contrôle de la restauration peuvent seulement être exécutées\n" -"lors de la restauration." +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "type de checkpoint non reconnu : « %s »" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:769 #, c-format -msgid "standby promotion is ongoing" -msgstr "la promotion du standby est en cours" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:814 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s ne peut pas être exécuté une fois la promotion en cours d'exécution." +msgid "unrecognized manifest option: \"%s\"" +msgstr "option de manifeste non reconnue : « %s »" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:830 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "« wait_seconds » ne doit pas être négatif ou nul" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algorithme de somme de contrôle inconnu : « %s »" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:865 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "n'a pas pu envoyer le signal au postmaster : %m" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "algorithme de compression inconnu : « %s »" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:881 #, c-format -msgid "server did not promote within %d second" -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" +msgid "unrecognized base backup option: \"%s\"" +msgstr "option de sauvegarde de base « %s » non reconnue" -#: access/transam/xlogreader.c:323 +#: backup/basebackup.c:892 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "décalage invalide de l'enregistrement %X/%X" +msgid "manifest checksums require a backup manifest" +msgstr "les sommes de contrôles du manifeste nécessitent un manifeste de sauvegarde" -#: access/transam/xlogreader.c:331 +#: backup/basebackup.c:901 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "« contrecord » est requis par %X/%X" +msgid "target detail cannot be used without target" +msgstr "le détail de la cible ne peut pas être utilisé sans cible" -#: access/transam/xlogreader.c:372 access/transam/xlogreader.c:720 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, 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" +msgid "target \"%s\" does not accept a target detail" +msgstr "la cible « %s » n'accepte pas un détail de cible" -#: access/transam/xlogreader.c:442 +#: backup/basebackup.c:921 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "il n'existe pas de drapeau contrecord à %X/%X" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "le détail de compression ne peut pas être spécifié sauf si la compression est activée" -#: access/transam/xlogreader.c:455 +#: backup/basebackup.c:934 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" +msgid "invalid compression specification: %s" +msgstr "spécification de compression invalide : %s" -#: access/transam/xlogreader.c:728 +#: backup/basebackup.c:1431 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" +msgid "skipping special file \"%s\"" +msgstr "ignore le fichier spécial « %s »" -#: access/transam/xlogreader.c:741 access/transam/xlogreader.c:757 +#: backup/basebackup.c:1550 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" +msgid "invalid segment number %d in file \"%s\"" +msgstr "numéro de segment %d invalide dans le fichier « %s »" -#: access/transam/xlogreader.c:795 +#: backup/basebackup.c:1582 #, 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" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "n'a pas pu vérifier la somme de contrôle dans le fichier « %s », bloc %u : la taille de tampon de lecture %d et la taille de bloc %d diffèrent" -#: access/transam/xlogreader.c:832 +#: backup/basebackup.c:1656 #, 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" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : calculé %X, mais attendu %X" -#: access/transam/xlogreader.c:846 access/transam/xlogreader.c:887 +#: backup/basebackup.c:1663 #, 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" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "les prochains échec de vérification de somme de contrôle dans le fichier « %s » ne seront pas reportés" -#: access/transam/xlogreader.c:861 +#: backup/basebackup.c:1719 #, 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'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" +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] "le fichier « %s » a un total de %d échec de vérification de somme de contrôle" +msgstr[1] "le fichier « %s » a un total de %d échecs de vérification de somme de contrôle" -#: access/transam/xlogreader.c:869 +#: backup/basebackup.c:1765 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" +msgid "file name too long for tar format: \"%s\"" +msgstr "nom du fichier trop long pour le format tar : « %s »" -#: access/transam/xlogreader.c:875 +#: backup/basebackup.c:1770 #, 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" +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "cible du lien symbolique trop longue pour le format tar : nom de fichier « %s », cible « %s »" -#: access/transam/xlogreader.c:906 +#: backup/basebackup_gzip.c:67 #, 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" +msgid "gzip compression is not supported by this build" +msgstr "la compression gzip n'est pas supportée dans cette installation" -#: access/transam/xlogreader.c:931 +#: backup/basebackup_gzip.c:143 #, 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" +msgid "could not initialize compression library" +msgstr "n'a pas pu initialiser la bibliothèque de compression" -#: access/transam/xlogreader.c:1276 +#: backup/basebackup_lz4.c:67 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %u désordonné à %X/%X" +msgid "lz4 compression is not supported by this build" +msgstr "la compression lz4 n'est pas supportée dans cette installation" + +#: backup/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 backup stored on server" +msgstr "doit être super-utilisateur ou membre de pg_read_all_settings pour utiliser COPY vers un fichier" -#: access/transam/xlogreader.c:1298 +#: backup/basebackup_server.c:89 #, 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" +msgid "relative path not allowed for backup stored on server" +msgstr "chemin relatif non autorisé pour une sauvegarde conservée sur le serveur" -#: access/transam/xlogreader.c:1305 +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 #, 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" +msgid "could not create directory \"%s\": %m" +msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: access/transam/xlogreader.c:1341 +#: backup/basebackup_server.c:115 #, 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" +msgid "directory \"%s\" exists but is not empty" +msgstr "le répertoire « %s » existe mais n'est pas vide" -#: access/transam/xlogreader.c:1357 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 #, 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" +msgid "could not access directory \"%s\": %m" +msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: access/transam/xlogreader.c:1372 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 #, 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 "Check free disk space." +msgstr "Vérifiez l'espace disque disponible." -#: access/transam/xlogreader.c:1387 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, 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 "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "n'a pas pu écrire le fichier « %s » : a écrit seulement %d octets sur %d au décalage %u" -#: access/transam/xlogreader.c:1403 +#: backup/basebackup_target.c:146 #, 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" +msgid "unrecognized target: \"%s\"" +msgstr "cible non reconnu : « %s »" -#: access/transam/xlogreader.c:1415 +#: backup/basebackup_target.c:237 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "block_id %u invalide à %X/%X" +msgid "target \"%s\" requires a target detail" +msgstr "la cible « %s » requiert un détail de cible" -#: access/transam/xlogreader.c:1502 +#: backup/basebackup_zstd.c:66 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "enregistrement de longueur invalide à %X/%X" +msgid "zstd compression is not supported by this build" +msgstr "la compression zstd n'est pas supportée dans cette installation" -#: access/transam/xlogreader.c:1591 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "image compressée invalide à %X/%X, bloc %d" +msgid "could not set compression worker count to %d: %s" +msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s" -#: 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 nécessite une puissance de deux entre 1 MB et 1 GB" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%s requiert une valeur" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" msgstr "-c %s requiert une valeur" -#: 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 "Essayez « %s --help » pour plus d'informations.\n" -#: bootstrap/bootstrap.c:312 +#: bootstrap/bootstrap.c:305 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s : arguments invalides en ligne de commande\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:185 #, c-format msgid "grant options can only be granted to roles" msgstr "les options grant peuvent seulement être données aux rôles" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "aucun droit n'a pu être accordé pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:312 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "aucun droit n'a été accordé pour « %s »" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:320 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "certains droits n'ont pu être accordé pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:325 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "tous les droits n'ont pas été accordés pour « %s »" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:336 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "aucun droit n'a pu être révoqué pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "aucun droit n'a pu être révoqué pour « %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 "certains droits n'ont pu être révoqués pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "certains droits n'ont pu être révoqués pour « %s »" -#: catalog/aclchk.c:379 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" msgstr "le concédant doit être l'utilisateur actuel" -#: 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 "droit %s invalide pour la 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 "droit %s invalide pour la séquence" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "droit %s invalide pour la base de données" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "type de droit %s invalide pour le domaine" -#: 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 "droit %s invalide pour la fonction" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "droit %s invalide pour le langage" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "type de droit invalide, %s, pour le 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 "droit %s invalide pour le schéma" -#: 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 "type de droit %s invalide pour la procédure " -#: 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 "droit %s invalide pour la routine" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "droit %s invalide pour le 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 "type de droit %s invalide pour le type" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "type de droit %s invalide pour le wrapper de données distantes" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "type de droit %s invalide pour le serveur distant" -#: catalog/aclchk.c:537 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "type de droit %s invalide pour le paramètre" + +#: catalog/aclchk.c:549 #, c-format 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:287 +#: 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 "le « Large Object » %u n'existe pas" -#: catalog/aclchk.c:926 catalog/aclchk.c:935 commands/collationcmds.c:119 commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 commands/dbcommands.c:158 commands/dbcommands.c:167 commands/dbcommands.c:176 commands/dbcommands.c:185 commands/dbcommands.c:194 commands/dbcommands.c:203 commands/dbcommands.c:212 commands/dbcommands.c:221 commands/dbcommands.c:230 commands/dbcommands.c:239 commands/dbcommands.c:261 commands/dbcommands.c:1529 commands/dbcommands.c:1538 commands/dbcommands.c:1547 -#: commands/dbcommands.c:1556 commands/extension.c:1757 commands/extension.c:1767 commands/extension.c:1777 commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 commands/publicationcmds.c:87 commands/publicationcmds.c:130 commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 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:408 replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "options en conflit ou redondantes" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "les droits par défaut ne peuvent pas être configurés pour les colonnes" -#: catalog/aclchk.c:1206 +#: catalog/aclchk.c:1246 #, c-format 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:557 catalog/objectaddress.c:1522 commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 commands/tablecmds.c:7092 commands/tablecmds.c:7248 commands/tablecmds.c:7298 commands/tablecmds.c:7372 commands/tablecmds.c:7442 commands/tablecmds.c:7554 commands/tablecmds.c:7648 commands/tablecmds.c:7707 commands/tablecmds.c:7796 commands/tablecmds.c:7825 commands/tablecmds.c:7980 commands/tablecmds.c:8062 commands/tablecmds.c:8218 commands/tablecmds.c:8336 commands/tablecmds.c:11726 commands/tablecmds.c:11907 commands/tablecmds.c:12067 commands/tablecmds.c:13210 commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2460 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3432 parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 +#: commands/tablecmds.c:7477 commands/tablecmds.c:7551 +#: commands/tablecmds.c:7621 commands/tablecmds.c:7733 +#: commands/tablecmds.c:7827 commands/tablecmds.c:7886 +#: commands/tablecmds.c:7975 commands/tablecmds.c:8005 +#: commands/tablecmds.c:8133 commands/tablecmds.c:8215 +#: commands/tablecmds.c:8371 commands/tablecmds.c:8489 +#: commands/tablecmds.c:12218 commands/tablecmds.c:12399 +#: commands/tablecmds.c:12559 commands/tablecmds.c:13723 +#: commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2506 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, 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:1147 commands/tablecmds.c:249 commands/tablecmds.c:16628 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17164 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 » n'est pas une séquence" -#: catalog/aclchk.c:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "la séquence « %s » accepte seulement les droits USAGE, SELECT et UPDATE" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "type de droit %s invalide pour la table" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "type de droit %s invalide pour la colonne" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "la séquence « %s » accepte seulement le droit SELECT pour les colonnes" -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "le langage « %s » n'est pas de confiance" -#: 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 et REVOKE ne sont pas autorisés sur des langages qui ne sont pas de confiance car seuls les super-utilisateurs peuvent utiliser ces langages." -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "ne peut pas configurer les droits des types tableau" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Configurez les droits du type élément à la place." -#: 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 » n'est pas un domaine" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "type de droit « %s » non reconnu" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "droit refusé pour l'aggrégat %s" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "droit refusé pour le collationnement %s" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "droit refusé pour la colonne %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "droit refusé pour la conversion %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "droit refusé pour la base de données %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "droit refusé pour le domaine %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "droit refusé pour le trigger sur événement %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "droit refusé pour l'extension %s" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "droit refusé pour le wrapper de données distantes %s" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "droit refusé pour le serveur distant %s" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "droit refusé pour la table distante %s" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "droit refusé pour la fonction %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "droit refusé pour l'index %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "droit refusé pour le langage %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "droit refusé pour le Large Object %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "droit refusé pour la vue matérialisée %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "droit refusé pour la classe d'opérateur %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "droit refusé pour l'opérateur %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "droit refusé pour la famille d'opérateur %s" -#: catalog/aclchk.c:3385 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "droit refusé pour le paramètre %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "droit refusé pour la politique %s" -#: catalog/aclchk.c:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "droit refusé pour la procédure %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "droit refusé pour la publication %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "droit refusé pour la routine %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "droit refusé pour le schéma %s" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "droit refusé pour la séquence %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "droit refusé pour l'objet statistique %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "droit refusé pour la souscription %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "droit refusé pour la table %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "droit refusé pour le tablespace %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "droit refusé pour la configuration de recherche plein texte %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "droit refusé pour le dictionnaire de recherche plein texte %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "droit refusé pour le type %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "droit refusé pour la vue %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "doit être le propriétaire de l'aggrégat %s" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "doit être le propriétaire du collationnement %s" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "doit être le propriétaire de la conversion %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "doit être le propriétaire de la base de données %s" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "doit être le propriétaire du domaine %s" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "doit être le propriétaire du trigger sur événement %s" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "doit être le propriétaire de l'extension %s" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "doit être le propriétaire du wrapper de données distantes %s" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "doit être le propriétaire de serveur distant %s" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "doit être le propriétaire de la table distante %s" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "doit être le propriétaire de la fonction %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "doit être le propriétaire de l'index %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "doit être le propriétaire du langage %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "doit être le propriétaire du Large Object %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "doit être le propriétaire de la vue matérialisée %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "doit être le propriétaire de la classe d'opérateur %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "doit être le prorpriétaire de l'opérateur %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "doit être le prorpriétaire de la famille d'opérateur %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "doit être le prorpriétaire de la procédure %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "doit être le propriétaire de la publication %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "doit être le propriétaire de la routine %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "doit être le propriétaire de la séquence %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "doit être le propriétaire de la souscription %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "doit être le propriétaire de la table %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "doit être le propriétaire du type %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "doit être le propriétaire de la vue %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "doit être le propriétaire du schéma %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "doit être le propriétaire de l'objet statistique %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "doit être le propriétaire du tablespace %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "doit être le propriétaire de la configuration de recherche plein texte %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "doit être le propriétaire du dictionnaire de recherche plein texte %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "doit être le propriétaire de la relation %s" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "droit refusé pour la colonne « %s » de la 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 "l'attribut %d de la relation d'OID %u n'existe pas" -#: 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 "la relation d'OID %u n'existe pas" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 #, c-format msgid "database with OID %u does not exist" msgstr "la base de données d'OID %u n'existe pas" -#: 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 "les droits du paramètre d'OID %u n'existe pas" + +#: 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 "la fonction d'OID %u n'existe pas" -#: 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 "le langage d'OID %u n'existe pas" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "le schéma d'OID %u n'existe pas" -#: 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 "le tablespace d'OID %u n'existe pas" -#: 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 "le wrapper de données distantes d'OID %u n'existe pas" -#: 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 "le serveur distant d'OID %u n'existe pas" -#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:389 utils/cache/typcache.c:444 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "le type d'OID %u n'existe pas" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "l'opérateur d'OID %u n'existe pas" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "la classe d'opérateur d'OID %u n'existe pas" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "la famille d'opérateur d'OID %u n'existe pas" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "le dictionnaire de recherche plein texte d'OID %u n'existe pas" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "la configuration de recherche plein texte d'OID %u n'existe pas" -#: 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 "le trigger sur événement d'OID %u n'existe pas" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "le collationnement d'OID %u n'existe pas" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "la conversion d'OID %u n'existe pas" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "l'extension d'OID %u n'existe pas" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, 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:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "la souscription d'OID %u n'existe pas" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "l'objet statistique d'OID %u n'existe pas" -#: catalog/catalog.c:378 +#: catalog/catalog.c:447 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "recherche toujours un OID inutilisé dans la relation « %s »" -#: catalog/catalog.c:380 +#: 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] "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:405 +#: 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] "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:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "doit être un super-utilisateur pour appeller pg_nextoid()" +msgid "must be superuser to call %s()" +msgstr "doit être super-utilisateur pour appeler %s()" -#: catalog/catalog.c:544 +#: catalog/catalog.c:614 #, 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:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "l'index « %s » n'appartient pas à la table « %s »" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la colonne « %s » n'est pas de type oid" -#: catalog/catalog.c:573 +#: catalog/catalog.c:643 #, 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 »" -#: catalog/dependency.c:821 catalog/dependency.c:1060 +#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#, 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:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "n'a pas pu supprimer %s car il est requis par %s" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Vous pouvez supprimer %s à la place." -#: 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s dépend de %s" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "DROP cascade sur %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -3965,296 +4544,334 @@ msgstr[1] "" "\n" "et %d autres objets (voir le journal applicatif du serveur pour une liste)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, 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:1197 catalog/dependency.c:1204 catalog/dependency.c:1216 commands/tablecmds.c:1304 commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1447 utils/misc/guc.c:7128 utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11424 utils/misc/guc.c:11458 utils/misc/guc.c:11492 utils/misc/guc.c:11535 utils/misc/guc.c:11577 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1421 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11865 +#: utils/misc/guc.c:11899 utils/misc/guc.c:11933 utils/misc/guc.c:11976 +#: utils/misc/guc.c:12018 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, 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:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, 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:1882 +#: catalog/dependency.c:1889 #, 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" -#: catalog/heap.c:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "la colonne %d de la relation « %s » n'existe pas" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "droit refusé pour créer « %s.%s »" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Les modifications du catalogue système sont actuellement interdites." -#: catalog/heap.c:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6861 #, c-format msgid "tables can have at most %d columns" msgstr "les tables peuvent avoir au plus %d colonnes" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7161 #, 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" -#: catalog/heap.c:543 +#: catalog/heap.c:500 #, c-format msgid "column name \"%s\" specified more than once" msgstr "colonne « %s » spécifiée plus d'une fois" #. translator: first %s is an integer not a name -#: catalog/heap.c:618 +#: catalog/heap.c:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "la colonne de clé de partitionnement %s a le pseudo type %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "la colonne « %s » a le pseudo type %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "le type composite %s ne peut pas être membre de lui-même" #. translator: first %s is an integer not a name -#: catalog/heap.c:709 +#: catalog/heap.c:666 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "aucun collationnement n'a été dérivé pour la colonne « %s » sur la clé de partitionnement et de type collationnable %s" -#: catalog/heap.c:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format 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:1200 catalog/index.c:872 commands/createas.c:408 commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "la relation « %s » existe déjà" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 catalog/pg_type.c:931 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 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/pg_type.c:931 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 "le type « %s » existe déjà" -#: catalog/heap.c:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "valeur relfilenode du TOAST non configurée en mode de mise à jour binaire" + +#: catalog/heap.c:1216 #, 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:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "valeur relfilenode non configurée en mode de mise à jour binaire" + +#: catalog/heap.c:2127 #, 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:2731 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la contrainte de vérification « %s » existe déjà" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 commands/tablecmds.c:8710 +#: catalog/heap.c:2571 catalog/index.c:889 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8863 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "la contrainte « %s » de la relation « %s » existe déjà" -#: catalog/heap.c:2908 +#: catalog/heap.c:2578 #, 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:2919 +#: catalog/heap.c:2589 #, 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:2929 +#: catalog/heap.c:2599 #, 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:2934 +#: catalog/heap.c:2604 #, 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:3039 +#: catalog/heap.c:2709 #, 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:3041 +#: catalog/heap.c:2711 #, 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:3047 +#: catalog/heap.c:2717 #, 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:3048 +#: catalog/heap.c:2718 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Ceci ferait que la colonne générée dépendrait de sa propre valeur." -#: catalog/heap.c:3101 +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" msgstr "l'expression de génération n'est pas immuable" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1290 #, 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:3134 commands/prepare.c:368 parser/analyze.c:2684 parser/parse_target.c:594 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 +#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2730 +#: parser/parse_target.c:594 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, 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:3181 +#: catalog/heap.c:2851 #, 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:3479 +#: catalog/heap.c:3149 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "combinaison ON COMMIT et clé étrangère non supportée" -#: catalog/heap.c:3480 +#: catalog/heap.c:3150 #, 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:3485 +#: catalog/heap.c:3155 #, 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:3486 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La table « %s » référence « %s »." -#: catalog/heap.c:3488 +#: catalog/heap.c:3158 #, 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:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, 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:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "les clés primaires ne peuvent pas être des expressions" -#: catalog/index.c:258 +#: catalog/index.c:259 #, 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:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, 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:811 +#: catalog/index.c:814 #, 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:826 +#: catalog/index.c:829 #, 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:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, 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:844 +#: catalog/index.c:847 #, 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:864 commands/createas.c:423 commands/sequence.c:162 parser/parse_utilcmd.c:209 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relation « %s » existe déjà, poursuite du traitement" -#: catalog/index.c:914 +#: catalog/index.c:917 #, 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:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "valeur relfilenode de l'index non configurée en mode de mise à jour binaire" + +#: catalog/index.c:2232 #, 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:3637 +#: catalog/index.c:3646 #, 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:3648 commands/indexcmds.c:3572 +#: catalog/index.c:3657 commands/indexcmds.c:3560 #, 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:3664 commands/indexcmds.c:3452 commands/indexcmds.c:3596 commands/tablecmds.c:3273 +#: catalog/index.c:3673 commands/indexcmds.c:3440 commands/indexcmds.c:3584 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "ne peut pas déplacer la colonne système « %s »" -#: catalog/index.c:3808 +#: catalog/index.c:3817 #, c-format msgid "index \"%s\" was reindexed" msgstr "l'index « %s » a été réindexée" -#: catalog/index.c:3945 +#: catalog/index.c:3954 #, 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:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5233 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 +#: commands/trigger.c:5812 #, 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 »" @@ -4269,22 +4886,24 @@ msgstr "les tables temporaires ne peuvent pas spécifier un nom de schéma" msgid "could not obtain lock on relation \"%s.%s\"" msgstr "n'a pas pu obtenir un verrou sur la relation « %s.%s »" -#: catalog/namespace.c:402 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 "n'a pas pu obtenir un verrou sur la relation « %s »" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "la relation « %s.%s » n'existe pas" -#: catalog/namespace.c:435 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 "la relation « %s » n'existe pas" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1541 commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 +#: commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "aucun schéma n'a été sélectionné pour cette création" @@ -4324,17 +4943,19 @@ msgstr "le dictionnaire de recherche plein texte « %s » n'existe pas" msgid "text search template \"%s\" does not exist" msgstr "le modèle de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 utils/cache/ts_cache.c:613 +#: 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 "la configuration de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 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:2889 gram.y:15103 gram.y:17077 parser/parse_expr.c:817 parser/parse_target.c:1262 +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 +#: 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" @@ -4349,7 +4970,8 @@ 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:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 commands/tablecmds.c:1249 +#: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "le schéma « %s » n'existe pas" @@ -4384,220 +5006,238 @@ 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:4338 commands/tablespace.c:1216 commands/variable.c:64 utils/misc/guc.c:11609 utils/misc/guc.c:11687 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12050 utils/misc/guc.c:12152 #, c-format msgid "List syntax is invalid." msgstr "La syntaxe de la liste est invalide." -#: 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:2160 commands/tablecmds.c:6082 commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12335 #, 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:6121 commands/tablecmds.c:16633 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17169 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:186 commands/tablecmds.c:261 commands/tablecmds.c:16638 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17174 #, 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:6124 commands/tablecmds.c:16643 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17179 #, c-format msgid "\"%s\" is not a foreign table" msgstr "« %s » n'est pas une table distante" -#: catalog/objectaddress.c:1432 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "doit indiquer les noms de relation et d'objet" -#: 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 "le nom de la colonne doit être qualifié" -#: catalog/objectaddress.c:1608 +#: catalog/objectaddress.c:1601 #, c-format 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: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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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 "le type « %s » n'existe pas" -#: catalog/objectaddress.c:1764 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "l'opérateur %d (%s, %s) de %s n'existe pas" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "la fonction %d (%s, %s) de %s n'existe pas" -#: 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 "la correspondance pour l'utilisateur « %s » sur le serveur « %s » n'existe pas" -#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 commands/foreigncmds.c:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "le serveur « %s » n'existe pas" -#: catalog/objectaddress.c:1928 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "la relation de publication « %s » dans la publication « %s » n'existe pas" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "le schéma de publication « %s » dans la publication « %s » n'existe pas" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "type d'objet de droits par défaut non reconnu « %c »" -#: catalog/objectaddress.c:1991 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Les types d'objet valides sont « %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 "le droit par défaut pour l'utilisateur « %s » dans le schéma « %s » de %s n'existe pas" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "le droit par défaut pour l'utilisateur « %s » sur %s n'existe pas" -#: 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 "le nom ou les listes d'arguments ne peuvent pas contenir de valeurs NULL" -#: catalog/objectaddress.c:2108 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "type d'objet « %s » non supporté" -#: catalog/objectaddress.c:2128 catalog/objectaddress.c:2146 catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 +#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 #, c-format msgid "name list length must be exactly %d" msgstr "la liste de nom doit être exactement de longueur %d" -#: catalog/objectaddress.c:2150 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "l'OID du Large Object peut ne pas être NULL" -#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "la longueur de la liste de nom doit au moins être %d" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format 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:318 +#: catalog/objectaddress.c:2533 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:1583 +#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 #, 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" -#: catalog/objectaddress.c:2553 catalog/objectaddress.c:2570 +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "doit être super-utilisateur" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "doit avoir l'attribut CREATEROLE" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, 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:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "colonne %s de %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "fonction %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "type %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "conversion de %s en %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "collationnement %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "contrainte %s sur %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "contrainte %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "conversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "valeur par défaut pour %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "langage %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "« Large Object » %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "opérateur %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, 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:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "méthode d'accès %s" @@ -4606,7 +5246,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "opérateur %d (%s, %s) de %s : %s" @@ -4615,221 +5255,231 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "règle %s sur %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "trigger %s sur %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "schéma %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "objet statistique %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "analyseur %s de la recherche plein texte" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "dictionnaire %s de la recherche plein texte" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "modèle %s de la recherche plein texte" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "configuration %s de recherche plein texte" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "rôle %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "base de données %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "wrapper de données distantes %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "serveur %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "correspondance utilisateur pour %s sur le serveur %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, 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:3727 +#: catalog/objectaddress.c:3795 #, 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:3733 +#: catalog/objectaddress.c:3801 #, 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:3737 +#: catalog/objectaddress.c:3805 #, 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:3743 +#: catalog/objectaddress.c:3811 #, 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:3747 +#: catalog/objectaddress.c:3815 #, 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:3753 +#: catalog/objectaddress.c:3821 #, 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:3757 +#: catalog/objectaddress.c:3825 #, 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:3763 +#: catalog/objectaddress.c:3831 #, 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:3770 +#: catalog/objectaddress.c:3838 #, 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:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "droits par défaut appartenant au rôle %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "extension %s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "trigger sur événement %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "paramètre %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "politique %s sur %s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "publication %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "publication du schéma %s dans la publication %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "publication de %s dans la publication %s" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "souscription %s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "transformation pour %s langage %s" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "table %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "index %s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "séquence %s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "table TOAST %s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "vue %s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "vue matérialisée %s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "type composite %s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "table distante %s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "relation %s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "famille d'opérateur %s pour la méthode d'accès %s" @@ -4874,7 +5524,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "le type de retour de la fonction de transition inverse %s n'est pas %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "la fonction de transition d'agrégat en déplacement ne doit pas renvoyer null" @@ -4889,7 +5539,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:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, 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" @@ -4904,12 +5554,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:190 catalog/pg_proc.c:224 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, 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:203 catalog/pg_proc.c:232 +#: 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 "utilisation non sûre des pseudo-types « INTERNAL »" @@ -4924,7 +5574,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:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "ne peut pas modifier le type de routine" @@ -4949,7 +5599,13 @@ 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: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 +#: 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 "la fonction %s n'existe pas" @@ -4974,37 +5630,87 @@ msgstr "la fonction %s requiert une coercion sur le type à l'exécution" msgid "cast from type %s to type %s already exists" msgstr "la conversion du type %s vers le type %s existe déjà" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "Cette opération n'est pas disponible pour les tables." + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "Cette opération n'est pas disponible pour les index." + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "Cette opération n'est pas disponible pour les séquences." + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "Cette opération n'est pas disponible pour les tables TOAST." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "Cette opération n'est pas disponible pour les vues." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "Cette opération n'est pas disponible pour les vues matérialisées." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "Cette opération n'est pas disponible pour les types composites." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "Cette opération n'est pas disponible pour les tables distantes." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "Cette opération n'est pas disponible pour les tables partitionnées." + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "Cette opération n'est pas disponible pour les index partitionnés." + +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "le collationnement « %s » existe déjà, poursuite du traitement" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "le collationnement « %s » pour l'encodage « %s » existe déjà, poursuite du traitement" -#: catalog/pg_collation.c:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "le collationnement « %s » existe déjà" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "le collationnement « %s » pour l'encodage « %s » existe déjà" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "la contrainte « %s » du domaine %s existe déjà" -#: 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 "la contrainte « %s » de la table « %s » n'existe pas" -#: catalog/pg_constraint.c:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "la contrainte « %s » du domaine %s n'existe pas" @@ -5019,27 +5725,27 @@ 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:218 commands/extension.c:3370 +#: catalog/pg_depend.c:222 commands/extension.c:3289 #, 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:225 catalog/pg_depend.c:276 commands/extension.c:3410 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s n'est pas un membre de l'extension « %s »" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." -msgstr "Une extension n'est pas autorisée à remplacer un objet qu'elle ne possède pas." +msgstr "Une extension n'est pas autorisée à remplacer un objet dont elle n'est pas propriétaire." -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." -msgstr "Un extension pourrait n'utiliser CREATE ... IF NOT EXISTS que pour ne pas créer l'objet si l'objet en conflit est un objet qui lui appartient déjà." +msgstr "Une extension peut uniquement utiliser CREATE ... IF NOT EXISTS pour ne pas créer les objets si l'objet en conflit lui appartient déjà." -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, 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" @@ -5089,7 +5795,8 @@ 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 commands/tablecmds.c:4455 commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15481 #, 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." @@ -5169,44 +5876,54 @@ 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:131 parser/parse_func.c:2235 +#: catalog/pg_parameter_acl.c:52 +#, c-format +msgid "parameter ACL \"%s\" does not exist" +msgstr "le paramètre ACL « %s » n'existe pas" + +#: catalog/pg_parameter_acl.c:87 +#, c-format +msgid "invalid parameter name \"%s\"" +msgstr "nom de paramètre « %s » invalide" + +#: 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] "les fonctions ne peuvent avoir plus de %d argument" msgstr[1] "les fonctions ne peuvent avoir plus de %d arguments" -#: catalog/pg_proc.c:375 +#: catalog/pg_proc.c:376 #, 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:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "« %s » est une fonction d'agrégat." -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "« %s » est une fonction." -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "« %s » est une procédure." -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "la fonction « %s » est une fonction window." -#: catalog/pg_proc.c:413 +#: catalog/pg_proc.c:414 #, 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:414 catalog/pg_proc.c:444 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "ne peut pas modifier le type de retour d'une fonction existante" @@ -5215,91 +5932,124 @@ 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:420 catalog/pg_proc.c:447 catalog/pg_proc.c:492 catalog/pg_proc.c:518 catalog/pg_proc.c:544 +#: 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 "Utilisez tout d'abord %s %s." -#: catalog/pg_proc.c:445 +#: catalog/pg_proc.c:446 #, 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:489 +#: catalog/pg_proc.c:490 #, 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:516 +#: catalog/pg_proc.c:517 #, 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:542 +#: catalog/pg_proc.c:543 #, 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:752 +#: catalog/pg_proc.c:757 #, 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:850 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "les fonctions SQL ne peuvent pas renvoyer un type %s" -#: catalog/pg_proc.c:865 +#: catalog/pg_proc.c:870 #, 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:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "Fonction SQL « %s »" -#: catalog/pg_publication.c:60 +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 +#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "ne peut pas ajouter la relation « %s » à la publication" + +#: catalog/pg_publication.c:73 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "Cette opération n'est pas disponible pour les tables systèmes." + +#: catalog/pg_publication.c:81 #, c-format -msgid "Only tables can be added to publications." -msgstr "Seules des tables peuvent être ajoutées aux publications." +msgid "This operation is not supported for temporary tables." +msgstr "Cette opération n'est pas disponible pour les tables temporaires." -#: catalog/pg_publication.c:66 +#: catalog/pg_publication.c:87 #, c-format -msgid "\"%s\" is a system table" -msgstr "« %s » est une table système" +msgid "This operation is not supported for unlogged tables." +msgstr "Cette opération n'est pas disponible pour les tables non journalisées." -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "System tables cannot be added to publications." -msgstr "Les tables systèmes ne peuvent pas être ajoutées à une publication." +msgid "cannot add schema \"%s\" to publication" +msgstr "ne peut pas ajouter le schéma « %s » à la publication" -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:103 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "la table « %s » ne peut pas être répliquée" +msgid "This operation is not supported for system schemas." +msgstr "Cette opération n'est pas disponible pour les schémas systèmes." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:111 #, 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." +msgid "Temporary schemas cannot be replicated." +msgstr "Les schémas temporaires ne peuvent pas être répliquées." -#: catalog/pg_publication.c:251 +#: catalog/pg_publication.c:374 #, 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:533 commands/publicationcmds.c:458 commands/publicationcmds.c:786 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "ne peut pas utiliser la colonne système « %s » dans la liste de colonnes d'une publication" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "ne peut pas utiliser la colonne générée « %s » dans la liste de colonne d'une publication" + +#: catalog/pg_publication.c:528 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "colonne « %s » dans la liste de colonnes de la publication" + +#: catalog/pg_publication.c:618 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "le schéma « %s » est déjà un membre de la publication « %s »" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "la publication « %s » n'existe pas" -#: catalog/pg_shdepend.c:833 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5314,72 +6064,73 @@ 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:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "le rôle %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "le tablespace %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "la base de données %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "propriétaire de %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "droits pour %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "cible de %s" -#: catalog/pg_shdepend.c:1263 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "tablespace pour %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1271 +#: catalog/pg_shdepend.c:1267 #, 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:1382 +#: catalog/pg_shdepend.c:1331 #, 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:1529 +#: 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 "" "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:779 commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "la souscription « %s » n'existe pas" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "n'a pas pu supprimer la correspondance des relations pour la souscription « %s »" -#: 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 "La synchronization de la table « %s » est en cours et est dans l'état « %c »." @@ -5387,7 +6138,7 @@ msgstr "La synchronization de la table « %s » est en cours et est dans l'état #. 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 "Utiliser %s pour activer la souscription si elle n'est pas déjà activée ou utiliser %s pour supprimer la souscription." @@ -5402,7 +6153,8 @@ msgstr "OID de pg_type non configuré en mode de mise à jour binaire" msgid "invalid type internal size %d" msgstr "taille interne de type invalide %d" -#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 catalog/pg_type.c:297 +#: 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" @@ -5417,7 +6169,7 @@ msgstr "la taille interne %d est invalide pour le type passé par valeur" 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:328 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "les types de taille fixe doivent avoir un stockage de base" @@ -5437,16 +6189,11 @@ msgstr "Échec lors de la création d'un type multirange pour le type « %s »." 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:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, 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:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 commands/tablecmds.c:16498 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "« %s » n'est ni une table ni une vue matérialisée" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -5527,7 +6274,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:650 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "le paramètre « parallel » doit être SAFE, RESTRICTED ou UNSAFE" @@ -5542,12 +6289,12 @@ msgstr "le paramètre « %s » doit être READ_ONLY, SHAREABLE, ou READ_WRITE" msgid "event trigger \"%s\" already exists" msgstr "le trigger sur événement « %s » existe déjà" -#: 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 "le wrapper de données distantes « %s » existe déjà" -#: commands/alter.c:90 commands/foreigncmds.c:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "le serveur « %s » existe déjà" @@ -5557,12 +6304,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:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "la publication « %s » existe déjà" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "la souscription « %s » existe déjà" @@ -5602,7 +6349,7 @@ msgstr "la configuration de recherche plein texte « %s » existe déjà dans le msgid "must be superuser to rename %s" msgstr "doit être super-utilisateur pour renommer « %s »" -#: commands/alter.c:744 +#: commands/alter.c:746 #, c-format msgid "must be superuser to set schema of %s" msgstr "doit être super-utilisateur pour configurer le schéma de %s" @@ -5622,7 +6369,8 @@ msgstr "Doit être super-utilisateur pour créer une méthode d'accès." msgid "access method \"%s\" already exists" msgstr "la méthode d'accès « %s » existe déjà" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 +#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" msgstr "la méthode d'accès « %s » n'existe pas" @@ -5632,17 +6380,19 @@ 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:699 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:714 +#: parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "la fonction %s doit renvoyer le type %s" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "ignore « %s » --- ne peut pas analyser cette table distante" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "ignore « %s » --- ne peut pas analyser les objets autres que les tables et les tables système" @@ -5651,37 +6401,37 @@ msgstr "ignore « %s » --- ne peut pas analyser les objets autres que les table # (errmsg("analyzing \"%s.%s\" inheritance tree", # get_namespace_name(RelationGetNamespace(onerel)), # RelationGetRelationName(onerel)))); -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analyse de l'arbre d'héritage de « %s.%s »" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analyse « %s.%s »" -#: commands/analyze.c:395 +#: commands/analyze.c:396 #, c-format 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:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "ANALYZE automatique de la table « %s.%s.%s »\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, 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:1436 +#: commands/analyze.c:1418 #, 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:1534 +#: commands/analyze.c:1516 #, 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" @@ -5713,101 +6463,101 @@ msgstr "" msgid "too many notifications in the NOTIFY queue" msgstr "trop de notifications dans la queue NOTIFY" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "la queue NOTIFY est pleine à %.0f%%" -#: commands/async.c:1618 +#: commands/async.c:1604 #, 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:1621 +#: commands/async.c:1607 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "" "La queue NOTIFY ne peut pas être vidée jusqu'à ce que le processus finisse\n" "sa transaction en cours." -#: commands/cluster.c:119 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "option de CLUSTER « %s » non reconnue" -#: commands/cluster.c:147 commands/cluster.c:395 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "ne peut pas exécuter CLUSTER sur les tables temporaires des autres sessions" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "ne peut pas exécuter CLUSTER sur une table partitionnée" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format 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:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14179 commands/tablecmds.c:16060 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "l'index « %s » pour la table « %s » n'existe pas" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "ne peut pas exécuter CLUSTER sur un catalogue partagé" -#: commands/cluster.c:399 +#: commands/cluster.c:435 #, c-format 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:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16070 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "« %s » n'est pas un index de la table « %s »" -#: commands/cluster.c:479 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "" "ne peut pas exécuter CLUSTER sur l'index « %s » car la méthode d'accès de\n" "l'index ne gère pas cette commande" -#: commands/cluster.c:491 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "ne peut pas exécuter CLUSTER sur l'index partiel « %s »" -#: commands/cluster.c:505 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "ne peut pas exécuter la commande CLUSTER sur l'index invalide « %s »" -#: commands/cluster.c:529 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "ne peut pas marquer un index comme CLUSTER sur une table partitionnée" -#: commands/cluster.c:902 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "cluster sur « %s.%s » en utilisant un parcours d'index sur « %s »" -#: commands/cluster.c:908 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "cluster sur « %s.%s » en utilisant un parcours séquentiel puis un tri" -#: commands/cluster.c:939 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "exécution du VACUUM sur « %s.%s »" + +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "« %s » : %.0f versions de ligne supprimables, %.0f non supprimables, dans %u pages" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "« %s.%s » : a trouvé %.0f versions de ligne supprimables, %.0f non supprimables dans %u blocs" -#: commands/cluster.c:943 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -5821,92 +6571,124 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "attribut de collationnement « %s » non reconnu" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 +#: commands/define.c:389 commands/tablecmds.c:7808 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, c-format +msgid "conflicting or redundant options" +msgstr "options en conflit ou redondantes" + +#: commands/collationcmds.c:120 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LOCALE ne peut pas être spécifié avec LC_COLLATE ou LC_CTYPE." + +#: commands/collationcmds.c:126 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROM ne peut pas être utilisé avec d'autres options" + +#: commands/collationcmds.c:174 #, c-format msgid "collation \"default\" cannot be copied" msgstr "le collationnement « default » ne peut pas être copié" -#: commands/collationcmds.c:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "fournisseur de collationnement non reconnu : %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "le paramètre « lc_collate » doit être spécifié" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "le paramètre « lc_ctype » doit être spécifié" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "le paramètre « locale » doit être spécifié" + +#: commands/collationcmds.c:256 #, c-format 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:227 +#: commands/collationcmds.c:275 #, 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 +#: commands/collationcmds.c:334 #, 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:296 +#: commands/collationcmds.c:345 #, 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:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 #, c-format msgid "changing version from %s to %s" msgstr "changement de version de %s à %s" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 #, c-format msgid "version has not changed" msgstr "la version n'a pas changé" -#: commands/collationcmds.c:473 +#: commands/collationcmds.c:532 #, 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:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "doit être super-utilisateur pour importer les collationnements systèmes" -#: commands/collationcmds.c:559 commands/copyfrom.c:1506 commands/copyto.c:680 libpq/be-secure-common.c:81 +#: commands/collationcmds.c:618 commands/copyfrom.c:1505 commands/copyto.c:679 +#: 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:690 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "aucune locale système utilisable n'a été trouvée" -#: commands/comment.c:61 commands/dbcommands.c:853 commands/dbcommands.c:1064 commands/dbcommands.c:1177 commands/dbcommands.c:1367 commands/dbcommands.c:1615 commands/dbcommands.c:1737 commands/dbcommands.c:2177 utils/init/postinit.c:887 utils/init/postinit.c:993 utils/init/postinit.c:1019 +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 +#: commands/dbcommands.c:1874 commands/dbcommands.c:2068 +#: commands/dbcommands.c:2310 commands/dbcommands.c:2405 +#: commands/dbcommands.c:2515 commands/dbcommands.c:3014 +#: utils/init/postinit.c:947 utils/init/postinit.c:1011 +#: utils/init/postinit.c:1083 #, c-format msgid "database \"%s\" does not exist" msgstr "la base de données « %s » n'existe pas" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:990 +#: commands/comment.c:101 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un type composite, ni une table distante" +msgid "cannot set comment on relation \"%s\"" +msgstr "ne peut pas modifier le commentaire sur la relation « %s »" -#: 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 "la fonction « %s » n'a pas été appelée par le gestionnaire de triggers" -#: 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 "la fonction « %s » doit être exécutée pour l'instruction AFTER ROW" @@ -5943,7 +6725,7 @@ msgstr "la fonction de conversion d'encodage %s a renvoyé un résultat incorrec #: 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" +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" msgstr "doit être super-utilisateur ou membre du rôle pg_execute_server_program pour utiliser COPY avec un programme externe" #: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 @@ -5953,13 +6735,13 @@ msgstr "Tout le monde peut utiliser COPY vers stdout ou à partir de stdin. La c #: 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 "doit être super-utilisateur ou membre du rôle pg_read_all_settings pour utiliser COPY depuis un fichier" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "doit être super-utilisateur ou membre du rôle pg_read_server_files pour utiliser COPY depuis un fichier" #: 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 "doit être super-utilisateur ou membre de pg_read_all_settings pour utiliser COPY vers un fichier" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgstr "doit être super-utilisateur ou membre de pg_write_server_files pour utiliser COPY vers un fichier" #: commands/copy.c:188 #, c-format @@ -5971,486 +6753,524 @@ msgstr "COPY FROM non supporté avec la sécurité niveau ligne" msgid "Use INSERT statements instead." msgstr "Utilisez des instructions INSERT à la place." -#: commands/copy.c:377 +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "MERGE non supporté dans COPY" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "ne peut pas utiliser « %s » avec HEADER dans COPY TO" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s requiert une valeur booléenne ou « match »" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "format COPY « %s » non reconnu" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "l'argument de l'option « %s » doit être une liste de noms de colonnes" -#: commands/copy.c:518 +#: commands/copy.c:553 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "l'argument de l'option « %s » doit être un nom d'encodage valide" -#: commands/copy.c:525 commands/dbcommands.c:254 commands/dbcommands.c:1563 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 #, c-format msgid "option \"%s\" not recognized" msgstr "option « %s » non reconnue" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "ne peut pas spécifier le délimiteur (DELIMITER) en mode binaire (BINARY)" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "ne peut pas spécifier NULL en mode binaire (BINARY)" -#: commands/copy.c:564 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "le délimiteur COPY doit être un seul caractère d'un octet" -#: commands/copy.c:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "le délimiteur de COPY ne peut pas être un retour à la ligne ou un retour chariot" -#: commands/copy.c:577 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "la représentation du NULL dans COPY ne peut pas utiliser un retour à la ligne ou un retour chariot" -#: commands/copy.c:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "le délimiteur de COPY ne peut pas être « %s »" -#: commands/copy.c:600 +#: commands/copy.c:635 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADER disponible uniquement en mode CSV" +msgid "cannot specify HEADER in BINARY mode" +msgstr "ne peut pas spécifier HEADER en mode BINARY" -#: commands/copy.c:606 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "le guillemet dans COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:611 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "le guillemet dans COPY doit être un seul caractère d'un octet" -#: commands/copy.c:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "le délimiteur de COPY ne doit pas être un guillemet" -#: commands/copy.c:622 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "le caractère d'échappement COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:627 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "le caractère d'échappement COPY doit être un seul caractère d'un octet" -#: commands/copy.c:633 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "le guillemet forcé COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "le guillemet forcé pour COPY n'est disponible qu'en utilisant COPY TO" -#: commands/copy.c:643 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "« COPY force not null » n'est disponible que dans la version CSV" -#: commands/copy.c:647 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "« COPY force not null » n'est disponible qu'en utilisant COPY FROM" -#: commands/copy.c:653 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "« COPY force null » n'est disponible que dans le mode CSV" -#: commands/copy.c:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "« COPY force null » n'est disponible qu'en utilisant COPY FROM" -#: commands/copy.c:664 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "le délimiteur COPY ne doit pas apparaître dans la spécification de NULL" -#: commands/copy.c:671 +#: commands/copy.c:706 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "le caractère guillemet pour CSV ne doit pas apparaître dans la spécification de NULL" -#: commands/copy.c:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "la colonne « %s » est une colonne générée" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format 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:749 commands/indexcmds.c:1859 commands/statscmds.c:245 commands/tablecmds.c:2347 commands/tablecmds.c:3003 commands/tablecmds.c:3496 parser/parse_relation.c:3642 parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1850 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "la colonne « %s » n'existe pas" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 parser/parse_target.c:1079 parser/parse_target.c:1090 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 +#: 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" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, ligne %s, colonne %s" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, ligne %llu, colonne %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, ligne %s" +msgid "COPY %s, line %llu" +msgstr "COPY %s, ligne %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, ligne %s, colonne %s : « %s »" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, ligne %llu, colonne %s : « %s »" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, ligne %s, colonne %s : NULL en entrée" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, ligne %llu, colonne %s : NULL en entrée" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, ligne %s : « %s »" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, ligne %llu : « %s »" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "ne peut pas copier vers la vue « %s »" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Pour activer la copie d'une vue, fournissez un trigger INSTEAD OF INSERT." -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "ne peut pas copier vers la vue matérialisée « %s »" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "ne peut pas copier vers la séquence « %s »" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "ne peut pas copier vers la relation « %s », qui n'est pas une table" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "ne peut pas exécuter COPY FREEZE sur une table partitionnée" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "n'a pas pu exécuter un COPY FREEZE à cause d'une activité transactionnelle précédente" -#: 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 "n'a pas pu exécuter un COPY FREEZE parce que la table n'a pas été créée ou tronquée dans la transaction en cours" -#: commands/copyfrom.c:1264 commands/copyto.c:612 +#: commands/copyfrom.c:1267 commands/copyto.c:611 #, c-format msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_NOT_NULL n'est pas référencée par COPY" -#: commands/copyfrom.c:1287 commands/copyto.c:635 +#: commands/copyfrom.c:1290 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_NULL n'est pas référencée par COPY" -#: commands/copyfrom.c:1340 utils/mb/mbutils.c:385 +#: commands/copyfrom.c:1343 utils/mb/mbutils.c:385 #, c-format msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "" "la fonction de conversion par défaut pour l'encodage de « %s » en « %s »\n" "n'existe pas" -#: commands/copyfrom.c:1525 +#: commands/copyfrom.c:1524 #, 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 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:1538 commands/copyto.c:732 +#: commands/copyfrom.c:1537 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "« %s » est un répertoire" -#: commands/copyfrom.c:1606 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1605 commands/copyto.c:301 libpq/be-secure-common.c:105 #, c-format msgid "could not close pipe to external command: %m" msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %m" -#: commands/copyfrom.c:1621 commands/copyto.c:307 +#: commands/copyfrom.c:1620 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "le programme « %s » a échoué" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "la signature du fichier COPY n'est pas reconnue" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "en-tête du fichier COPY invalide (options manquantes)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "en-tête du fichier COPY invalide (WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "options critiques non reconnues dans l'en-tête du fichier COPY" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "en-tête du fichier COPY invalide (longueur manquante)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "en-tête du fichier COPY invalide (mauvaise longueur)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "n'a pas pu lire le fichier COPY : %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 tcop/postgres.c:359 +#: 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 "" "fin de fichier (EOF) inattendue de la connexion du client avec une\n" "transaction ouverte" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "type 0x%02X du message, inattendu, lors d'une opération COPY à partir de stdin" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "échec de la commande COPY à partir de stdin : %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1446 commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "mauvais nombre de champs dans la ligne d'entête : a obtenu %d, attendait %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "différence de nom de colonne dans le champ d'entête %d de la ligne : a obtenu une valeur (« %s »), attendait « %s »" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "différence de nom de colonne dans le champ d'entête %d de la ligne : a obtenu « %s », attendait « %s »" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "données supplémentaires après la dernière colonne attendue" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "données manquantes pour la colonne « %s »" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "a reçu des données de COPY après le marqueur de fin" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "le nombre de champs de la ligne est %d, %d attendus" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "retour chariot trouvé dans les données" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "retour chariot sans guillemet trouvé dans les données" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Utilisez « \\r » pour représenter un retour chariot." -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Utiliser le champ CSV entre guillemets pour représenter un retour chariot." -#: commands/copyfromparse.c:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "retour à la ligne trouvé dans les données" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "retour à la ligne trouvé dans les données" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Utilisez « \\n » pour représenter un retour à la ligne." -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Utiliser un champ CSV entre guillemets pour représenter un retour à la ligne." -#: commands/copyfromparse.c:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "le marqueur fin-de-copie ne correspond pas à un précédent style de fin de ligne" -#: commands/copyfromparse.c:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "marqueur fin-de-copie corrompu" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "champ CSV entre guillemets non terminé" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "fin de fichier (EOF) inattendu dans les données du COPY" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "taille du champ invalide" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "format de données binaires incorrect" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "n'a pas pu écrire vers le programme COPY : %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "n'a pas pu écrire dans le fichier COPY : %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "ne peut pas copier à partir de la vue « %s »" -#: 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 "Tentez la variante COPY (SELECT ...) TO." -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "ne peut pas copier à partir de la vue matérialisée « %s »" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "ne peut pas copier à partir de la table distante « %s »" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "ne peut pas copier à partir de la séquence « %s »" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "ne peut pas copier à partir de la table partitionnée « %s »" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "ne peut pas copier depuis la relation « %s », qui n'est pas une table" -#: commands/copyto.c:451 +#: commands/copyto.c:450 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées pour COPY" -#: commands/copyto.c:465 +#: commands/copyto.c:464 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "les règles DO INSTEAD conditionnelles ne sont pas supportées par l'instruction COPY" -#: commands/copyto.c:469 +#: commands/copyto.c:468 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "les règles DO ALSO ne sont pas supportées pour COPY" -#: commands/copyto.c:474 +#: commands/copyto.c:473 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "les règles DO INSTEAD multi-instructions ne sont pas supportées par l'instruction COPY" -#: commands/copyto.c:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) n'est pas supporté" -#: commands/copyto.c:501 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "La requête COPY doit avoir une clause RETURNING" -#: commands/copyto.c:530 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "la relation référencée par l'instruction COPY a changé" -#: commands/copyto.c:589 +#: commands/copyto.c:588 #, c-format 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:697 +#: commands/copyto.c:696 #, 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:716 +#: commands/copyto.c:715 #, 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:719 +#: 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 indique au serveur PostgreSQL d'écrire un fichier. Vous pourriez vouloir utiliser la fonctionnalité \\copy de psql pour écrire en local." @@ -6465,325 +7285,428 @@ msgstr "trop de noms de colonnes ont été spécifiés" msgid "policies not yet implemented for this command" msgstr "politiques non encore implémentées pour cette commande" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION n'est plus supporté" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Considérer l'utilisation de tablespaces." -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE ne peut pas être spécifié avec LC_COLLATE ou LC_CTYPE." +msgid "OIDs less than %u are reserved for system objects" +msgstr "les OID inférieurs à %u sont réservés aux objets systèmes" -#: commands/dbcommands.c:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d n'est pas un code d'encodage valide" -#: commands/dbcommands.c:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s n'est pas un nom d'encodage valide" -#: commands/dbcommands.c:315 commands/dbcommands.c:1596 commands/user.c:275 commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "fournisseur de locale non reconnu : %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "limite de connexion invalide : %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "droit refusé pour créer une base de données" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "la base de données modèle « %s » n'existe pas" -#: commands/dbcommands.c:367 +#: commands/dbcommands.c:975 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "ne peut pas utiliser la base de données invalide « %s » comme modèle" -#: commands/dbcommands.c:368 commands/dbcommands.c:1625 utils/init/postinit.c:1002 +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 +#: utils/init/postinit.c:1026 #, c-format msgid "Use DROP DATABASE to drop invalid databases." -msgstr "Utilisez DROP DATABASE pour supprimer des bases invalides." +msgstr "Utilisez DROP DATABASE pour les bases invalides." -#: commands/dbcommands.c:379 +#: commands/dbcommands.c:987 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "droit refusé pour copier la base de données « %s »" -#: commands/dbcommands.c:395 +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "stratégie de création de base « %s » invalide" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Les stratégies valides sont « wal_log » et « file_copy »" + +#: commands/dbcommands.c:1024 #, c-format msgid "invalid server encoding %d" msgstr "encodage serveur %d invalide" -#: commands/dbcommands.c:401 commands/dbcommands.c:406 +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 #, c-format msgid "invalid locale name: \"%s\"" msgstr "nom de locale invalide : « %s »" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "l'encodage « %s » n'est pas supporté par le fournisseur ICU" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "la locale ICU doit être précisée" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "la locale ICU ne peut pas être spécifié sauf si le fournisseur de locale est ICU" + +#: commands/dbcommands.c:1082 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "" "le nouvel encodage (%sà est incompatible avec l'encodage de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:429 +#: commands/dbcommands.c:1085 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "" "Utilisez le même encodage que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:434 +#: commands/dbcommands.c:1090 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "" "le nouveau tri (%s) est incompatible avec le tri de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:436 +#: commands/dbcommands.c:1092 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "" "Utilisez le même tri que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:441 +#: commands/dbcommands.c:1097 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "" "le nouveau LC_CTYPE (%s) est incompatible avec le LC_CTYPE de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:443 +#: commands/dbcommands.c:1099 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "" "Utilisez le même LC_CTYPE que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:465 commands/dbcommands.c:1223 +#: commands/dbcommands.c:1104 +#, fuzzy, c-format +#| msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "" +"le nouvel encodage (%sà est incompatible avec l'encodage de la base de\n" +"données modèle (%s)" + +#: commands/dbcommands.c:1106 +#, fuzzy, c-format +#| msgid "Use the same encoding as in the template database, or use template0 as template." +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "" +"Utilisez le même encodage que celui de la base de données modèle,\n" +"ou utilisez template0 comme modèle." + +#: commands/dbcommands.c:1115 +#, fuzzy, c-format +#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "" +"le nouveau tri (%s) est incompatible avec le tri de la base de\n" +"données modèle (%s)" + +#: commands/dbcommands.c:1117 +#, fuzzy, c-format +#| msgid "Use the same collation as in the template database, or use template0 as template." +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "" +"Utilisez le même tri que celui de la base de données modèle,\n" +"ou utilisez template0 comme modèle." + +#: commands/dbcommands.c:1140 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "la base de données modèle « %s » a une version de collation mais aucune version actuelle n'a pas être déterminée" + +#: commands/dbcommands.c:1145 +#, fuzzy, c-format +#| msgid "template database \"%s\" does not exist" +msgid "template database \"%s\" has a collation version mismatch" +msgstr "la base de données modèle « %s » n'existe pas" + +#: commands/dbcommands.c:1147 +#, 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 "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." + +#: commands/dbcommands.c:1150 +#, 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 "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." + +#: commands/dbcommands.c:1186 commands/dbcommands.c:1920 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global ne peut pas être utilisé comme tablespace par défaut" -#: commands/dbcommands.c:491 +#: commands/dbcommands.c:1212 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "ne peut pas affecter un nouveau tablespace par défaut « %s »" -#: commands/dbcommands.c:493 +#: commands/dbcommands.c:1214 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "" "Il existe un conflit car la base de données « %s » a déjà quelques tables\n" "dans son tablespace." -#: commands/dbcommands.c:523 commands/dbcommands.c:1093 +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 #, c-format msgid "database \"%s\" already exists" msgstr "la base de données « %s » existe déjà" -#: commands/dbcommands.c:537 +#: commands/dbcommands.c:1258 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "la base de données source « %s » est accédée par d'autres utilisateurs" -#: commands/dbcommands.c:780 commands/dbcommands.c:795 +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "la base de données d'OID %u est déjà utilisé par la base de données « %s »" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "le répertoire de donnée d'OID %u existe déjà" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "l'encodage « %s » ne correspond pas à la locale « %s »" -#: commands/dbcommands.c:783 +#: commands/dbcommands.c:1460 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Le paramètre LC_CTYPE choisi nécessite l'encodage « %s »." -#: commands/dbcommands.c:798 +#: commands/dbcommands.c:1475 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Le paramètre LC_COLLATE choisi nécessite l'encodage « %s »." -#: commands/dbcommands.c:860 +#: commands/dbcommands.c:1556 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "la base de données « %s » n'existe pas, poursuite du traitement" -#: commands/dbcommands.c:884 +#: commands/dbcommands.c:1580 #, c-format msgid "cannot drop a template database" msgstr "ne peut pas supprimer une base de données modèle" -#: commands/dbcommands.c:890 +#: commands/dbcommands.c:1586 #, c-format msgid "cannot drop the currently open database" msgstr "ne peut pas supprimer la base de données actuellement ouverte" -#: commands/dbcommands.c:903 +#: commands/dbcommands.c:1599 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "la base de données « %s » est utilisée par un slot de réplication logique actif" -#: commands/dbcommands.c:905 +#: commands/dbcommands.c:1601 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "Il existe %d slot actif." msgstr[1] "Il existe %d slots actifs." -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:1615 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "la base de données « %s » est utilisée par une souscription de réplication logique" -#: commands/dbcommands.c:921 +#: commands/dbcommands.c:1617 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "Il existe %d souscription." msgstr[1] "Il existe %d souscriptions." -#: commands/dbcommands.c:942 commands/dbcommands.c:1115 commands/dbcommands.c:1245 +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 +#: commands/dbcommands.c:1942 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "la base de données « %s » est en cours d'utilisation par d'autres utilisateurs" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1772 #, c-format msgid "permission denied to rename database" msgstr "droit refusé pour le renommage de la base de données" -#: commands/dbcommands.c:1104 +#: commands/dbcommands.c:1801 #, c-format msgid "current database cannot be renamed" msgstr "la base de données actuelle ne peut pas être renommée" -#: commands/dbcommands.c:1201 +#: commands/dbcommands.c:1898 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "ne peut pas modifier le tablespace de la base de données actuellement ouverte" -#: commands/dbcommands.c:1304 +#: commands/dbcommands.c:2004 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "certaines relations de la base de données « %s » sont déjà dans le\n" "tablespace « %s »" -#: commands/dbcommands.c:1306 +#: commands/dbcommands.c:2006 #, c-format msgid "You must move them back to the database's default tablespace before using this command." 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:1431 commands/dbcommands.c:2015 commands/dbcommands.c:2314 commands/dbcommands.c:2400 +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 +#: commands/dbcommands.c:3152 commands/dbcommands.c:3266 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "" "certains fichiers inutiles pourraient se trouver dans l'ancien répertoire\n" "de la base de données « %s »" -#: commands/dbcommands.c:1487 +#: commands/dbcommands.c:2194 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "option de DROP DATABASE « %s » non reconnue" -#: commands/dbcommands.c:1577 +#: commands/dbcommands.c:2272 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "l'option « %s » ne peut pas être spécifié avec d'autres options" -#: commands/dbcommands.c:1624 +#: commands/dbcommands.c:2319 #, c-format msgid "cannot alter invalid database \"%s\"" -msgstr "ne peut pas modifier la base de données invalide « %s »" +msgstr "ne peut pas modifier la base de données « %s » invalide" -#: commands/dbcommands.c:1641 +#: commands/dbcommands.c:2336 #, c-format msgid "cannot disallow connections for current database" msgstr "ne peut pas désactiver les connexions pour la base de données courante" -#: commands/dbcommands.c:1777 +#: commands/dbcommands.c:2555 #, c-format msgid "permission denied to change owner of database" msgstr "droit refusé pour modifier le propriétaire de la base de données" -#: commands/dbcommands.c:2121 +#: commands/dbcommands.c:2958 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "%d autres sessions et %d transactions préparées utilisent la base de données." -#: commands/dbcommands.c:2124 +#: commands/dbcommands.c:2961 #, c-format msgid "There is %d other session using the database." 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:2129 storage/ipc/procarray.c:3895 +#: commands/dbcommands.c:2966 storage/ipc/procarray.c:3848 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "%d transaction préparée utilise la base de données." msgstr[1] "%d transactions préparées utilisent la base de données." -#: commands/dbcommands.c:2271 +#: commands/dbcommands.c:3108 #, c-format msgid "missing directory \"%s\"" msgstr "répertoire « %s » manquant" -#: commands/dbcommands.c:2330 commands/tablespace.c:188 commands/tablespace.c:634 +#: commands/dbcommands.c:3168 commands/tablespace.c:190 +#: commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "n'a pas pu lire les informations sur le répertoire « %s » : %m" -#: 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:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, c-format msgid "%s requires a parameter" msgstr "%s requiert un paramètre" -#: 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 commands/define.c:225 commands/define.c:243 #, c-format msgid "%s requires a numeric value" msgstr "%s requiert une valeur numérique" -#: commands/define.c:157 +#: commands/define.c:154 #, c-format msgid "%s requires a Boolean value" msgstr "%s requiert une valeur booléenne" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 #, c-format msgid "%s requires an integer value" msgstr "%s requiert une valeur entière" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "l'argument de %s doit être un nom" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" msgstr "l'argument de %s doit être un nom de type" -#: commands/define.c:318 +#: commands/define.c:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "argument invalide pour %s : « %s »" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 utils/adt/ruleutils.c:2832 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2928 #, c-format msgid "\"%s\" is an aggregate function" msgstr "« %s » est une fonction d'agrégat" @@ -6793,17 +7716,19 @@ 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:455 commands/tablecmds.c:3580 commands/tablecmds.c:3738 commands/tablecmds.c:3791 commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16487 tcop/utility.c:1332 #, 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "le schéma « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "le type « %s » n'existe pas, poursuite du traitement" @@ -6823,7 +7748,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:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "l'objet statistique « %s » n'existe pas, poursuite du traitement" @@ -6924,7 +7849,7 @@ msgstr "la règle « %s » de la relation « %s » n'existe pas, poursuite du tr msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "le wrapper de données distantes « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "le serveur « %s » n'existe pas, poursuite du traitement" @@ -6980,7 +7905,8 @@ msgstr "les triggers sur événement ne sont pas supportés pour %s" msgid "filter variable \"%s\" specified more than once" msgstr "variable « %s » du filtre spécifiée plus d'une fois" -#: commands/event_trigger.c:377 commands/event_trigger.c:421 commands/event_trigger.c:515 +#: 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 "le trigger sur événement « %s » n'existe pas" @@ -7000,12 +7926,12 @@ msgstr "Le propriétaire du trigger sur événement doit être un super-utilisat msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s peut seulement être appelé dans une fonction de trigger sur événement 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 peut seulement être appelé dans une fonction de trigger sur événement table_rewrite" -#: 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 peut seulement être appelé dans une fonction de trigger sur événement" @@ -7030,12 +7956,13 @@ msgstr "l'option WAL d'EXPLAIN nécessite ANALYZE" msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "l'option TIMING d'EXPLAIN nécessite ANALYZE" -#: commands/extension.c:173 commands/extension.c:3032 +#: commands/extension.c:173 commands/extension.c:2954 #, c-format msgid "extension \"%s\" does not exist" msgstr "l'extension « %s » n'existe pas" -#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 commands/extension.c:303 +#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 +#: commands/extension.c:303 #, c-format msgid "invalid extension name: \"%s\"" msgstr "nom d'extension invalide : « %s »" @@ -7060,7 +7987,8 @@ msgstr "Les noms des extensions ne doivent pas commencer ou finir avec un tiret msgid "Extension names must not contain directory separator characters." msgstr "Les noms des extensions ne doivent pas contenir des caractères séparateurs de répertoire." -#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 commands/extension.c:347 +#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 +#: commands/extension.c:347 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "nom de version de l'extension invalide : « %s »" @@ -7087,205 +8015,223 @@ msgstr "" "Les noms de version ne doivent pas contenir de caractères séparateurs de\n" "répertoire." -#: commands/extension.c:498 +#: commands/extension.c:502 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "l'extension « %s » n'est pas disponible" + +#: commands/extension.c:503 +#, c-format +msgid "Could not open extension control file \"%s\": %m." +msgstr "N'a pas pu ouvrir le fichier de contrôle d'extension « %s » : %m." + +#: commands/extension.c:505 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "Les extensions doivent tout d'abord être installées sur le système où PostgreSQL est exécuté." + +#: commands/extension.c:509 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de contrôle d'extension « %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 "" "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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "le paramètre « %s » requiert une valeur booléenne" -#: commands/extension.c:577 +#: commands/extension.c:588 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "« %s » n'est pas un nom d'encodage valide" -#: commands/extension.c:591 +#: commands/extension.c:602 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "l'argument « %s » doit être une liste de noms d'extension" -#: commands/extension.c:598 +#: commands/extension.c:609 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "paramètre « %s » non reconnu dans le fichier « %s »" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "le paramètre « schema » ne peut pas être indiqué quand « relocatable » est vrai" -#: commands/extension.c:785 +#: commands/extension.c:796 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "" "les instructions de contrôle des transactions ne sont pas autorisées dans un\n" "script d'extension" -#: commands/extension.c:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "droit refusé pour créer l'extension « %s »" -#: commands/extension.c:865 +#: commands/extension.c:876 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Doit avoir le droit CREATE sur la base actuelle pour créer cette extension." -#: commands/extension.c:866 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Doit être super-utilisateur pour créer cette extension." -#: commands/extension.c:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "droit refusé pour mettre à jour l'extension « %s »" -#: commands/extension.c:873 +#: commands/extension.c:884 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Doit avoir le droit CREATE sur la base actuelle pour mettre à jour cette extension." -#: commands/extension.c:874 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Doit être super-utilisateur pour mettre à jour cette extension." -#: commands/extension.c:1003 -#, c-format +#: commands/extension.c:1018 +#, fuzzy, c-format +#| msgid "invalid mode character: must be one of \"%s\"" msgid "invalid character in extension owner: must not contain any of \"%s\"" -msgstr "caractère invalide dans le propriétaire de l'extension : ne doit pas contenir les caractères « %s »" +msgstr "mode caractère invalide : doit faire partie de « %s »" -#: commands/extension.c:1027 -#, c-format +#: commands/extension.c:1042 +#, fuzzy, c-format +#| msgid "invalid mode character: must be one of \"%s\"" msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" -msgstr "caractère invalide dans le schéma « %s » de l'extension : ne doit pas contenir les caractères « %s »" +msgstr "mode caractère invalide : doit faire partie de « %s »" -#: commands/extension.c:1222 +#: commands/extension.c:1237 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "l'extension « %s » n'a pas de chemin de mise à jour pour aller de la version « %s » à la version « %s »" -#: commands/extension.c:1430 commands/extension.c:3093 +#: commands/extension.c:1445 commands/extension.c:3012 #, c-format msgid "version to install must be specified" msgstr "la version à installer doit être précisée" -#: commands/extension.c:1467 +#: commands/extension.c:1482 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "l'extension « %s » n'a pas de script d'installation ou de chemin de mise à jour pour la version « %s »" -#: commands/extension.c:1501 +#: commands/extension.c:1516 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "l'extension « %s » doit être installée dans le schéma « %s »" -#: commands/extension.c:1661 +#: commands/extension.c:1676 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "dépendance cyclique détectée entre les extensions « %s » et « %s »" -#: commands/extension.c:1666 +#: commands/extension.c:1681 #, c-format msgid "installing required extension \"%s\"" msgstr "installation de l'extension requise « %s »" -#: commands/extension.c:1689 +#: commands/extension.c:1704 #, c-format msgid "required extension \"%s\" is not installed" msgstr "l'extension « %s » requise n'est pas installée" -#: commands/extension.c:1692 +#: commands/extension.c:1707 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Utilisez CREATE EXTENSION ... CASCADE pour installer également les extensions requises." -#: commands/extension.c:1727 +#: commands/extension.c:1742 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "l'extension « %s » existe déjà, poursuite du traitement" -#: commands/extension.c:1734 +#: commands/extension.c:1749 #, c-format msgid "extension \"%s\" already exists" msgstr "l'extension « %s » existe déjà" -#: commands/extension.c:1745 +#: commands/extension.c:1760 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "le CREATE EXTENSION imbriqué n'est pas supporté" -#: commands/extension.c:1918 +#: commands/extension.c:1924 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "ne peut pas supprimer l'extension « %s » car il est en cours de modification" -#: commands/extension.c:2479 +#: commands/extension.c:2401 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s ne peut être appelé qu'à partir d'un script SQL exécuté par CREATE EXTENSION" -#: commands/extension.c:2491 +#: commands/extension.c:2413 #, c-format msgid "OID %u does not refer to a table" msgstr "l'OID %u ne fait pas référence à une table" -#: commands/extension.c:2496 +#: commands/extension.c:2418 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "la table « %s » n'est pas un membre de l'extension en cours de création" -#: commands/extension.c:2850 +#: commands/extension.c:2772 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "" "ne peut pas déplacer l'extension « %s » dans le schéma « %s » car l'extension\n" "contient le schéma" -#: commands/extension.c:2891 commands/extension.c:2951 +#: commands/extension.c:2813 commands/extension.c:2873 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "l'extension « %s » ne supporte pas SET SCHEMA" -#: commands/extension.c:2953 +#: commands/extension.c:2875 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s n'est pas dans le schéma de l'extension « %s »" -#: commands/extension.c:3012 +#: commands/extension.c:2934 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "un ALTER EXTENSION imbriqué n'est pas supporté" -#: commands/extension.c:3104 +#: commands/extension.c:3023 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "la version « %s » de l'extension « %s » est déjà installée" -#: commands/extension.c:3316 +#: commands/extension.c:3235 #, c-format 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:3382 +#: commands/extension.c:3301 #, 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:3476 +#: commands/extension.c:3395 #, c-format msgid "file \"%s\" is too large" msgstr "le fichier « %s » est trop gros" @@ -7317,81 +8263,81 @@ msgstr "" msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Le propriétaire du wrapper de données distantes doit être un super-utilisateur." -#: 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 "le wrapper de données distantes « %s » n'existe pas" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "droit refusé pour la création du wrapper de données distantes « %s »" -#: commands/foreigncmds.c:586 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Doit être super-utilisateur pour créer un wrapper de données distantes." -#: commands/foreigncmds.c:701 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "droit refusé pour modifier le wrapper de données distantes « %s »" -#: commands/foreigncmds.c:703 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Doit être super-utilisateur pour modifier un wrapper de données distantes." -#: 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 "" "la modification du validateur de wrapper de données distantes peut modifier\n" "le comportement des tables distantes existantes" -#: 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 "" "la modification du validateur du wrapper de données distantes peut faire en\n" "sorte que les options des objets dépendants deviennent invalides" -#: commands/foreigncmds.c:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "le serveur « %s » existe déjà, poursuite du traitement" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "la correspondance d'utilisateur « %s » existe déjà pour le serveur « %s », poursuite du traitement" -#: commands/foreigncmds.c:1158 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "la correspondance d'utilisateur « %s » existe déjà pour le serveur « %s »" -#: commands/foreigncmds.c:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "la correspondance d'utilisateur « %s » n'existe pas pour le serveur « %s »" -#: commands/foreigncmds.c:1383 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "la correspondance d'utilisateur « %s » n'existe pas pour le serveur « %s », poursuite du traitement" -#: commands/foreigncmds.c:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "le wrapper de données distantes « %s » n'a pas de gestionnaire" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "le wrapper de données distantes « %s » ne supporte pas IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "import de la table distante « %s »" @@ -7498,264 +8444,265 @@ msgstr "les paramètres en entrée suivant un paramètre avec valeur par défaut 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:612 commands/functioncmds.c:803 +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "attribute invalide dans la définition de la procédure" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "la fonction de support %s doit renvoyer le type %s" -#: commands/functioncmds.c:719 +#: commands/functioncmds.c:712 #, 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:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST doit être positif" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWS doit être positif" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "aucun corps de fonction spécifié" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "corps de fonction dupliqué spécifié" -#: commands/functioncmds.c:899 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "le corps d'une fonction SQL est seulement valide pour le langage SQL" -#: commands/functioncmds.c:941 +#: commands/functioncmds.c:922 #, 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 peut pas avoir des arguments polymorphiques" -#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, 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:1014 +#: commands/functioncmds.c:995 #, 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:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "aucun langage spécifié" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 commands/proclang.c:237 +#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 +#: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "le langage « %s » n'existe pas" -#: commands/functioncmds.c:1129 commands/functioncmds.c:2132 +#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 #, 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:1164 commands/functioncmds.c:1448 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "seul un superutilisateur peut définir une fonction leakproof" -#: commands/functioncmds.c:1215 +#: commands/functioncmds.c:1196 #, 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:1228 +#: commands/functioncmds.c:1209 #, 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:1282 commands/functioncmds.c:1468 +#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 #, 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:1569 +#: commands/functioncmds.c:1552 #, 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:1575 +#: commands/functioncmds.c:1558 #, 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:1599 +#: commands/functioncmds.c:1582 #, 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:1604 +#: commands/functioncmds.c:1587 #, 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:1629 +#: commands/functioncmds.c:1612 #, 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:1633 +#: commands/functioncmds.c:1616 #, 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:1637 +#: commands/functioncmds.c:1620 #, 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:1642 +#: commands/functioncmds.c:1625 #, 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:1647 +#: commands/functioncmds.c:1630 #, 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:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "la fonction de conversion ne doit pas être volatile" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "la fonction de conversion doit être une fonction normale" -#: commands/functioncmds.c:1667 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "la fonction de conversion ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1693 +#: commands/functioncmds.c:1676 #, 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:1708 +#: commands/functioncmds.c:1691 #, 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:1723 +#: commands/functioncmds.c:1706 #, 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:1729 +#: commands/functioncmds.c:1712 #, 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:1735 +#: commands/functioncmds.c:1718 #, 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:1752 +#: commands/functioncmds.c:1735 #, 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:1762 +#: commands/functioncmds.c:1745 #, 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:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "la fonction de transformation ne doit pas être volatile" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "la fonction de transformation doit être une fonction normale" -#: commands/functioncmds.c:1803 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "la fonction de transformation ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "la fonction de transformation doit prendre de un argument" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1794 #, 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:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "le type de données %s est un pseudo-type" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "le type de données %s est un domaine" -#: commands/functioncmds.c:1896 +#: commands/functioncmds.c:1879 #, 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:1922 +#: commands/functioncmds.c:1905 #, 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:1951 +#: commands/functioncmds.c:1934 #, 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:2038 +#: commands/functioncmds.c:2021 #, 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:2062 +#: commands/functioncmds.c:2045 #, 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:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "aucun code en ligne spécifié" -#: commands/functioncmds.c:2163 +#: commands/functioncmds.c:2142 #, 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:2258 +#: 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" @@ -7772,302 +8719,313 @@ msgstr "doit spécifier au moins une colonne" msgid "cannot use more than %d columns in an index" msgstr "ne peut pas utiliser plus de %d colonnes dans un index" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "ne peut pas créer un index sur la table distante « %s »" +msgid "cannot create index on relation \"%s\"" +msgstr "ne peut pas créer un index sur la relation « %s »" -#: commands/indexcmds.c:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "ne peut pas créer un index sur la table partitionnée « %s » de manière concurrente" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "ne peut pas créer de contraintes d'exclusion sur la table partitionnée « %s »" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format 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:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, 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:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, 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" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "substitution de la méthode d'accès obsolète « rtree » par « gist »" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "la méthode d'accès « %s » ne supporte pas les index uniques" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "la méthode d'accès « %s » ne supporte pas les colonnes incluses" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "la méthode d'accès « %s » ne supporte pas les index multi-colonnes" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "la méthode d'accès « %s » ne supporte pas les contraintes d'exclusion" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "ne peut pas faire correspondre la clé de partitionnement à un index utilisant la méthode d'accès « %s »" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "contrainte %s non supportée avec la définition de clé de partitionnement" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "les contraintes %s ne peuvent pas être utilisées quand les clés de partitionnement incluent des expressions." -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1037 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "la contrainte unique sur la table partitionnée doit inclure toutes les colonnes de partitionnement" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1038 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "la contrainte %s sur la table « %s » ne contient pas la colonne « %s » qui fait partie de la clé de partitionnement." -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 #, c-format 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:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1276 tcop/utility.c:1518 #, 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:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1278 tcop/utility.c:1520 #, 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." -#: commands/indexcmds.c:1776 +#: commands/indexcmds.c:1767 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "les fonctions dans un prédicat d'index doivent être marquées comme IMMUTABLE" -#: commands/indexcmds.c:1854 parser/parse_utilcmd.c:2526 parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:2529 +#: parser/parse_utilcmd.c:2664 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "la colonne « %s » nommée dans la clé n'existe pas" -#: commands/indexcmds.c:1878 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1869 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "les expressions ne sont pas supportées dans les colonnes incluses" -#: commands/indexcmds.c:1919 +#: commands/indexcmds.c:1910 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "" "les fonctions dans l'expression de l'index doivent être marquées comme\n" "IMMUTABLE" -#: commands/indexcmds.c:1934 +#: commands/indexcmds.c:1925 #, c-format msgid "including column does not support a collation" msgstr "une colonne incluse ne supporte pas de collationnement" -#: commands/indexcmds.c:1938 +#: commands/indexcmds.c:1929 #, c-format msgid "including column does not support an operator class" msgstr "une colonne incluse ne supporte pas de classe d'opérateur" -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1933 #, c-format msgid "including column does not support ASC/DESC options" msgstr "une colonne incluse ne supporte pas d'options ASC/DESC" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1937 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "une colonne incluse ne supporte pas d'options NULLS FIRST/LAST" -#: commands/indexcmds.c:1987 +#: commands/indexcmds.c:1978 #, c-format 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:1995 commands/tablecmds.c:16964 commands/typecmds.c:810 parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 utils/adt/misc.c:628 +#: commands/indexcmds.c:1986 commands/tablecmds.c:17510 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "les collationnements ne sont pas supportés par le type %s" -#: commands/indexcmds.c:2060 +#: commands/indexcmds.c:2051 #, c-format msgid "operator %s is not commutative" msgstr "l'opérateur %s n'est pas commutatif" -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2053 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Seuls les opérateurs commutatifs peuvent être utilisés dans les contraintes d'exclusion." -#: commands/indexcmds.c:2088 +#: commands/indexcmds.c:2079 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "l'opérateur %s n'est pas un membre de la famille d'opérateur « %s »" -#: commands/indexcmds.c:2091 +#: commands/indexcmds.c:2082 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "" "L'opérateur d'exclusion doit être en relation avec la classe d'opérateur de\n" "l'index pour la contrainte." -#: commands/indexcmds.c:2126 +#: commands/indexcmds.c:2117 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "la méthode d'accès « %s » ne supporte pas les options ASC/DESC" -#: commands/indexcmds.c:2131 +#: commands/indexcmds.c:2122 #, c-format 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:2177 commands/tablecmds.c:16989 commands/tablecmds.c:16995 commands/typecmds.c:2317 +#: commands/indexcmds.c:2168 commands/tablecmds.c:17535 +#: commands/tablecmds.c:17541 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "le type de données %s n'a pas de classe d'opérateurs par défaut pour la\n" "méthode d'accès « %s »" -#: commands/indexcmds.c:2179 +#: commands/indexcmds.c:2170 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur pour l'index ou définir une\n" "classe d'opérateur par défaut pour le type de données." -#: commands/indexcmds.c:2208 commands/indexcmds.c:2216 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2199 commands/indexcmds.c:2207 +#: commands/opclasscmds.c:205 #, c-format 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:2230 commands/typecmds.c:2305 +#: commands/indexcmds.c:2221 commands/typecmds.c:2290 #, 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" -#: commands/indexcmds.c:2320 +#: commands/indexcmds.c:2311 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "il existe de nombreuses classes d'opérateur par défaut pour le type de\n" "données %s" -#: commands/indexcmds.c:2648 +#: commands/indexcmds.c:2639 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "option de REINDEX « %s » non reconnue" -#: commands/indexcmds.c:2872 +#: commands/indexcmds.c:2863 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "la table « %s » n'a pas d'index qui puisse être réindexé concuremment" -#: commands/indexcmds.c:2886 +#: commands/indexcmds.c:2877 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "la table « %s » n'a pas d'index à réindexer" -#: commands/indexcmds.c:2926 commands/indexcmds.c:3433 commands/indexcmds.c:3561 +#: commands/indexcmds.c:2917 commands/indexcmds.c:3421 +#: commands/indexcmds.c:3549 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "ne peut pas réindexer les catalogues système de manière concurrente" -#: commands/indexcmds.c:2949 +#: commands/indexcmds.c:2940 #, c-format msgid "can only reindex the currently open database" msgstr "peut seulement réindexer la base de données en cours" -#: commands/indexcmds.c:3037 +#: commands/indexcmds.c:3028 #, 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" -#: commands/indexcmds.c:3070 +#: commands/indexcmds.c:3061 #, c-format msgid "cannot move system relations, skipping all" msgstr "ne peut pas déplacer les relations systèmes, toutes ignorées" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3107 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "lors de la réindexation de la table partitionnée « %s.%s »" -#: commands/indexcmds.c:3120 +#: commands/indexcmds.c:3110 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "lors de la réindexation de l'index partitionné « %s.%s »" -#: commands/indexcmds.c:3313 commands/indexcmds.c:4169 +#: commands/indexcmds.c:3301 commands/indexcmds.c:4157 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la table « %s.%s » a été réindexée" -#: commands/indexcmds.c:3465 commands/indexcmds.c:3517 +#: commands/indexcmds.c:3453 commands/indexcmds.c:3505 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "ne peut pas réindexer l'index invalide « %s.%s » de manière concurrente, ignoré" -#: commands/indexcmds.c:3471 +#: commands/indexcmds.c:3459 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "ne peut pas réindexer l'index de contrainte d'exclusion « %s.%s » de manière concurrente, ignoré" -#: commands/indexcmds.c:3626 +#: commands/indexcmds.c:3614 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "ne peut pas réindexer ce type de relation de manière concurrente" -#: commands/indexcmds.c:3647 +#: commands/indexcmds.c:3635 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "ne peut pas déplacer la relation non partagée dans le tablespace « %s »" -#: commands/indexcmds.c:4150 commands/indexcmds.c:4162 +#: commands/indexcmds.c:4138 commands/indexcmds.c:4150 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "l'index « %s.%s » a été réindexé" -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4140 commands/indexcmds.c:4159 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "« %s » n'est ni une table ni une vue" +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 +#, c-format +msgid "cannot lock relation \"%s\"" +msgstr "ne peut pas verrouiller la relation « %s »" #: commands/matview.c:193 #, c-format 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:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "les options %s et %s ne peuvent pas être utilisées ensemble" @@ -8082,12 +9040,12 @@ msgstr "ne peut pas rafraîchir de manière concurrente la vue matérialisée « 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:653 #, 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:655 #, c-format msgid "Row: %s" msgstr "Ligne : %s" @@ -8107,12 +9065,14 @@ msgstr "la famille d'opérateur « %s » existe déjà pour la méthode d'accès msgid "must be superuser to create an operator class" msgstr "doit être super-utilisateur pour créer une classe d'opérateur" -#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 commands/opclasscmds.c:1056 +#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 +#: commands/opclasscmds.c:1056 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "numéro d'opérateur %d invalide, doit être compris entre 1 et %d" -#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 commands/opclasscmds.c:1072 +#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 +#: commands/opclasscmds.c:1072 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "numéro de fonction %d invalide, doit être compris entre 1 et %d" @@ -8374,7 +9334,13 @@ 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/statscmds.c:151 commands/tablecmds.c:1585 commands/tablecmds.c:2165 commands/tablecmds.c:3390 commands/tablecmds.c:6064 commands/tablecmds.c:8989 commands/tablecmds.c:16554 commands/tablecmds.c:16589 commands/trigger.c:313 commands/trigger.c:1289 commands/trigger.c:1398 rewrite/rewriteDefine.c:277 rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9144 commands/tablecmds.c:17090 +#: commands/tablecmds.c:17125 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "droit refusé : « %s » est un catalogue système" @@ -8424,54 +9390,45 @@ msgstr "nom de curseur invalide : il ne doit pas être vide" msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "ne peut pas créer un curseur WITH HOLD à l'intérieur d'une opération restreinte pour sécurité" -#: commands/portalcmds.c:189 commands/portalcmds.c:242 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 "le curseur « %s » n'existe pas" -#: commands/prepare.c:76 +#: commands/prepare.c:75 #, c-format msgid "invalid statement name: must not be empty" msgstr "nom de l'instruction invalide : ne doit pas être vide" -#: commands/prepare.c:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "n'a pas pu déterminer le type de données du paramètre $%d" - -#: commands/prepare.c:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "les instructions utilitaires ne peuvent pas être préparées" - -#: commands/prepare.c:264 commands/prepare.c:269 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "l'instruction préparée n'est pas un SELECT" -#: commands/prepare.c:329 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "mauvais nombre de paramètres pour l'instruction préparée « %s »" -#: commands/prepare.c:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "%d paramètres attendus mais %d reçus." -#: commands/prepare.c:364 +#: commands/prepare.c:330 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "" "le paramètre $%d de type %s ne peut être utilisé dans la coercion à cause du\n" "type %s attendu" -#: commands/prepare.c:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "l'instruction préparée « %s » existe déjà" -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "l'instruction préparée « %s » n'existe pas" @@ -8481,61 +9438,209 @@ 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:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1222 +#: postmaster/postmaster.c:1321 utils/init/miscinit.c:1651 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "syntaxe de liste invalide pour l'option « publish »" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "syntaxe de liste invalide pour le paramètre « %s »" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "type « publish » non reconnu : « %s »" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "valeur non reconnue pour l'option de publication « %s » : « %s »" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "paramètre de publication non reconnu : « %s »" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "aucun schéma n'a été sélectionné pour CURRENT_SCHEMA" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "Les colonnes systèmes ne sont pas autorisées." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "Les opérateurs définis par les utilisateurs ne sont pas autorisés." + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "Seules les colonnes, constantes, opérateurs natifs, types de données natifs, collations natives et fonctions natives immuables sont autorisées." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "Les types définis par les utilisateurs ne sont pas autorisés." + +#: commands/publicationcmds.c:569 +#, fuzzy +#| msgid "set-returning functions are not allowed in %s" +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "les fonctions renvoyant un ensemble ne sont pas autorisées dans %s" + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "Les collations définis par les utilisateurs ne sont pas autorisées." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "expression WHERE de la publication invalide" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "ne peut pas utiliser la clause WHERE de la publication pour la relation « %s »" + +#: commands/publicationcmds.c:637 +#, fuzzy, c-format +#| msgid "cannot cluster a partitioned table" +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "ne peut pas exécuter CLUSTER sur une table partitionnée" + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "ne peut pas utiliser la liste de colonnes pour la relation « %s.%s » dans la publication « %s »" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "Les listes de colonnes ne peuvent pas être indiquées pour les publications contenant des éléments FOR TABLES IN SCHEMA." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "Les listes de colonnes ne peuvent pas être spécifiées pour les tables partitionnées quand %s vaut false." + +#: commands/publicationcmds.c:760 #, 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:250 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "doit être super-utilisateur pour créer une publication « FOR TABLES IN SCHEMA »" + +#: commands/publicationcmds.c:867 #, 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:251 -#, c-format -msgid "Set wal_level to logical before creating subscriptions." +#: commands/publicationcmds.c:868 +#, fuzzy, c-format +#| msgid "Set wal_level to logical before creating subscriptions." +msgid "Set wal_level to \"logical\" before creating subscriptions." msgstr "Configurez wal_level à la valeur logical pour créer des souscriptions." -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, fuzzy, c-format +#| msgid "cannot set parameter \"%s\" within security-definer function" +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "" +"ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" +"SECURITY DEFINER" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La publication contient une clause WHERE pour la table partitionnée « %s », ce qui n'est pas autorisé quand « %s » vaut false." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La publication contient une liste de colonnes pour la table partitionnée « %s », ce qui n'est pas autorisé quand « %s » vaut false." + +#: commands/publicationcmds.c:1298 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" +msgid "cannot add schema to publication \"%s\"" +msgstr "ne peut pas modifier la relation « %s »" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "Les schémas ne peuvent pas être ajoutés si au moins une table qui spécifie une liste de colonne fait déjà partie de la publication." + +#: commands/publicationcmds.c:1348 +#, fuzzy, c-format +#| msgid "must be superuser to set schema of %s" +msgid "must be superuser to add or set schemas" +msgstr "doit être super-utilisateur pour configurer le schéma de %s" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, 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:378 +#: commands/publicationcmds.c:1359 +#, fuzzy, c-format +#| msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgid "Schemas 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:1367 #, 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:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, fuzzy, c-format +#| msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "déclarations NULL/NOT NULL en conflit ou redondantes pour la colonne « %s »" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, fuzzy, c-format +#| msgid "conflicting or redundant options" +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "options en conflit ou redondantes" + +#: commands/publicationcmds.c:1802 +#, 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 "" +"les types d'argument de l'opérateur doivent être indiqués dans ALTER\n" +"OPERATOR FAMILY" + +#: commands/publicationcmds.c:1814 #, 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:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "ne peut pas utiliser une clause WHERE lors de la suppression d'une table d'une publication" + +#: commands/publicationcmds.c:1881 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not part of the publication" +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "la relation « %s » ne fait pas partie de la publication" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, 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:752 +#: commands/publicationcmds.c:1926 #, 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." +#: commands/publicationcmds.c:1933 +#, fuzzy, c-format +#| msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "Le propriétaire d'une publication FOR ALL TABLES doit être un super-utilisateur." + #: commands/schemacmds.c:108 commands/schemacmds.c:288 #, c-format msgid "unacceptable schema name \"%s\"" @@ -8551,731 +9656,840 @@ msgstr "Le préfixe « pg_ » est réservé pour les schémas système." msgid "schema \"%s\" already exists, skipping" msgstr "la schéma « %s » existe déjà, poursuite du traitement" -#: commands/seclabel.c:129 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "aucun fournisseur de label de sécurité n'a été chargé" -#: commands/seclabel.c:133 +#: commands/seclabel.c:135 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "doit indiquer le fournisseur quand plusieurs fournisseurs de labels de sécurité sont chargés" -#: commands/seclabel.c:151 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "le fournisseur « %s » de label de sécurité n'est pas chargé" -#: commands/seclabel.c:158 +#: commands/seclabel.c:160 #, c-format msgid "security labels are not supported for this type of object" msgstr "les labels de sécurité ne sont pas supportés pour ce type d'objet" -#: commands/sequence.c:140 -#, c-format -msgid "unlogged sequences are not supported" -msgstr "les séquences non tracées ne sont pas supportées" +#: commands/seclabel.c:193 +#, fuzzy, c-format +#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgid "cannot set security label on relation \"%s\"" +msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/sequence.c:717 -#, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" +#: commands/sequence.c:755 +#, fuzzy, c-format +#| msgid "nextval: reached maximum value of sequence \"%s\" (%s)" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "nextval : valeur maximale de la séquence « %s » (%s) atteinte" -#: commands/sequence.c:740 -#, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" +#: commands/sequence.c:774 +#, fuzzy, c-format +#| msgid "nextval: reached minimum value of sequence \"%s\" (%s)" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "nextval : valeur minimale de la séquence « %s » (%s) atteinte" -#: commands/sequence.c:858 +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "" "la valeur courante (currval) de la séquence « %s » n'est pas encore définie\n" "dans cette session" -#: commands/sequence.c:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "la dernière valeur (lastval) n'est pas encore définie dans cette session" -#: commands/sequence.c:971 -#, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" +#: commands/sequence.c:997 +#, fuzzy, c-format +#| msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "setval : la valeur %s est en dehors des limites de la séquence « %s » (%s..%s)" -#: commands/sequence.c:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "option SEQUENCE NAME invalide" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "le type de colonne identité doit être smallint, integer ou bigint" -#: commands/sequence.c:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "le type de séquence doit être smallint, integer ou bigint" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "la valeur INCREMENT ne doit pas être zéro" -#: commands/sequence.c:1481 -#, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" +#: commands/sequence.c:1474 +#, 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) est hors des limites pour le type de données séquence %s" -#: commands/sequence.c:1518 -#, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" +#: commands/sequence.c:1506 +#, 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) est hors des limites pour le type de données séquence %s" -#: commands/sequence.c:1532 -#, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" +#: commands/sequence.c:1514 +#, fuzzy, c-format +#| msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "la valeur MINVALUE (%s) doit être moindre que la valeur MAXVALUE (%s)" -#: commands/sequence.c:1559 -#, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" +#: commands/sequence.c:1535 +#, fuzzy, c-format +#| msgid "START value (%s) cannot be less than MINVALUE (%s)" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "la valeur START (%s) ne peut pas être plus petite que MINVALUE (%s)" -#: commands/sequence.c:1571 -#, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" +#: commands/sequence.c:1541 +#, fuzzy, c-format +#| msgid "START value (%s) cannot be greater than MAXVALUE (%s)" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "la valeur START (%s) ne peut pas être plus grande que MAXVALUE (%s)" -#: commands/sequence.c:1601 -#, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" +#: commands/sequence.c:1565 +#, fuzzy, c-format +#| msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "la valeur RESTART (%s) ne peut pas être plus petite que celle de MINVALUE (%s)" -#: commands/sequence.c:1613 -#, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" +#: commands/sequence.c:1571 +#, fuzzy, c-format +#| msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "la valeur RESTART (%s) ne peut pas être plus grande que celle de MAXVALUE (%s)" -#: commands/sequence.c:1628 -#, c-format -msgid "CACHE (%s) must be greater than zero" +#: commands/sequence.c:1582 +#, fuzzy, c-format +#| msgid "CACHE (%s) must be greater than zero" +msgid "CACHE (%lld) must be greater than zero" msgstr "la valeur CACHE (%s) doit être plus grande que zéro" -#: commands/sequence.c:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "option OWNED BY invalide" -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Indiquer OWNED BY table.colonne ou OWNED BY NONE." -#: commands/sequence.c:1691 -#, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "la relation référencée « %s » n'est ni une table ni une table distante" +#: commands/sequence.c:1644 +#, fuzzy, c-format +#| msgid "cannot move system relation \"%s\"" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "ne peut pas déplacer la colonne système « %s »" -#: commands/sequence.c:1698 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "la séquence doit avoir le même propriétaire que la table avec laquelle elle est liée" -#: commands/sequence.c:1702 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "la séquence doit être dans le même schéma que la table avec laquelle elle est liée" -#: commands/sequence.c:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "ne peut pas modifier le propriétaire de la séquence d'identité" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13870 +#: commands/tablecmds.c:16507 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La séquence « %s » est liée à la table « %s »." -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, 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: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:136 +#, fuzzy, c-format +#| msgid "cannot rewrite system relation \"%s\"" +msgid "cannot define statistics for relation \"%s\"" +msgstr "ne peut pas ré-écrire la relation système « %s »" -#: commands/statscmds.c:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "l'objet statistique « %s » existe déjà, poursuite du traitement" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "l'objet statistique « %s » existe déjà" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, 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:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, 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:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, 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:326 +#: commands/statscmds.c:325 #, 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:347 +#: commands/statscmds.c:346 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" 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:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "type de statistique « %s » non reconnu" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "les statistiques étendues requièrent au moins 2 colonnes" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "nom de colonne dupliqué dans la définition des statistiques" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" msgstr "expression dupliquée dans la définition des statistiques" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8112 #, c-format msgid "statistics target %d is too low" msgstr "la cible statistique %d est trop basse" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8120 #, c-format msgid "lowering statistics target to %d" msgstr "abaissement de la cible statistique à %d" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, 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:223 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "paramètre de souscription non reconnu : « %s »" +#: commands/subscriptioncmds.c:289 +#, fuzzy, c-format +#| msgid "invalid WAL location: \"%s\"" +msgid "invalid WAL location (LSN): %s" +msgstr "emplacement WAL invalide : « %s »" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:237 commands/subscriptioncmds.c:243 commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 commands/subscriptioncmds.c:274 +#: 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 et %s sont des options mutuellement exclusives" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:281 commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "la souscription avec %s doit aussi configurer %s" -#: commands/subscriptioncmds.c:380 +#: commands/subscriptioncmds.c:433 +#, fuzzy, c-format +#| msgid "could not receive list of replicated tables from the publisher: %s" +msgid "could not receive list of publications from the publisher: %s" +msgstr "n'a pas pu recevoir la liste des tables répliquées à partir du publieur : %s" + +#: commands/subscriptioncmds.c:465 +#, fuzzy, c-format +#| msgid "publication \"%s\" does not exist" +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "la publication « %s » n'existe pas" +msgstr[1] "la publication « %s » n'existe pas" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "doit être super-utilisateur pour créer des souscriptions" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "n'a pas pu se connecter au publieur : %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, 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:529 +#: commands/subscriptioncmds.c:730 #, 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:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "ne peut définir %s pour une souscription active" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, 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:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, 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:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Utilisez ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, 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 avec rafraîchissement n'est pas autorisé pour les souscriptions désactivées" + +#: commands/subscriptioncmds.c:1140 +#, 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 "Utilisez ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, fuzzy, c-format +#| msgid "Use views instead." +msgid "Use %s instead." +msgstr "Utilisez les vues à la place." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Utilisez %s avec refresh = false, ou with copy_data = false, ou utilisez DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1218 #, 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:1092 +#: commands/subscriptioncmds.c:1243 +#, 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 n'est pas autorisé pour les souscriptions désactivées" + +#: commands/subscriptioncmds.c:1244 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Utilisez ALTER SUBSCRIPTION ... REFRESH with copy_data = false, ou utilisez DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1263 +#, fuzzy, c-format +#| msgid "must be superuser to switch transaction log files" +msgid "must be superuser to skip transaction" +msgstr "doit être super-utilisateur pour changer de journal de transactions" + +#: commands/subscriptioncmds.c:1283 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "" + +#: commands/subscriptioncmds.c:1363 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "la souscription « %s » n'existe pas, poursuite du traitement" -#: commands/subscriptioncmds.c:1344 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "slot de réplication « %s » supprimé sur le publieur" -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 #, 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:1395 +#: commands/subscriptioncmds.c:1672 #, 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:1397 +#: commands/subscriptioncmds.c:1674 #, 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:1513 +#: commands/subscriptioncmds.c:1788 #, 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:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 +#: replication/pgoutput/pgoutput.c:1072 +#, fuzzy, c-format +#| msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +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/subscriptioncmds.c:1860 #, 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:1581 -#, c-format +#: commands/subscriptioncmds.c:1863 +#, fuzzy, c-format +#| msgid "Use %s to disassociate the subscription from the slot." msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." -msgstr "Utilisez %s pour désactiver l'abonnement, puis utilisez %s pour le dissocier du slot" +msgstr "Utilisez %s pour dissocier la souscription du slot." -#: commands/subscriptioncmds.c:1612 +#: commands/subscriptioncmds.c:1894 #, c-format msgid "publication name \"%s\" used more than once" msgstr "nom de publication « %s » utilisé plus d'une fois" -#: commands/subscriptioncmds.c:1656 +#: commands/subscriptioncmds.c:1938 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "la publication « %s » est déjà dans la souscription « %s »" -#: commands/subscriptioncmds.c:1670 +#: commands/subscriptioncmds.c:1952 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "la publication « %s » n'est pas dans la souscription « %s »" -#: commands/subscriptioncmds.c:1681 +#: commands/subscriptioncmds.c:1963 #, c-format 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 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "la table « %s » n'existe pas" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "la table « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "Utilisez DROP TABLE pour supprimer une table." -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "la séquence « %s » n'existe pas" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "la séquence « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Utilisez DROP SEQUENCE pour supprimer une séquence." -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "la vue « %s » n'existe pas" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "la vue « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "Utilisez DROP VIEW pour supprimer une vue." -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "la vue matérialisée « %s » n'existe pas" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "la vue matérialisée « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:266 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:18449 parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19017 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "l'index « %s » n'existe pas" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "l'index « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "Utilisez DROP INDEX pour supprimer un index." -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "« %s » n'est pas un type" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "Utilisez DROP TYPE pour supprimer un type." -#: commands/tablecmds.c:277 commands/tablecmds.c:13196 commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13709 +#: commands/tablecmds.c:16210 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "la table distante « %s » n'existe pas" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "la table distante « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Utilisez DROP FOREIGN TABLE pour supprimer une table distante." -#: commands/tablecmds.c:670 +#: commands/tablecmds.c:697 #, 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:701 +#: commands/tablecmds.c:728 #, 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:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15017 #, 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:922 +#: commands/tablecmds.c:949 #, 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:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "« %s » n'est pas partitionné" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "ne peut pas partitionner en utilisant plus de %d colonnes" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, 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:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La table « %s » contient des index qui sont uniques." -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, 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:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY ne permet pas la CASCADE" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, 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:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "ne peut pas seulement tronquer une table partitionnée" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, 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:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "TRUNCATE cascade sur la table « %s »" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "ne peut pas tronquer la table distante « %s »" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "ne peut pas tronquer les tables temporaires des autres sessions" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14914 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "ne peut pas hériter de la table partitionnée « %s »" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "ne peut pas hériter de la partition « %s »" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2633 #, 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:2455 +#: commands/tablecmds.c:2487 #, 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:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14893 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "ne peut pas hériter à partir d'une relation temporaire « %s »" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14901 #, 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:2528 +#: commands/tablecmds.c:2560 #, 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:2536 +#: commands/tablecmds.c:2568 #, 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:2538 commands/tablecmds.c:2561 commands/tablecmds.c:2578 commands/tablecmds.c:2834 commands/tablecmds.c:2864 commands/tablecmds.c:2878 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 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 +#: 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:2547 +#: commands/tablecmds.c:2579 #, 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:2549 commands/tablecmds.c:2846 commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "« %s » versus « %s »" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, 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:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, 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:2591 +#: commands/tablecmds.c:2623 #, 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:2685 commands/tablecmds.c:2740 commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12433 parser/parse_utilcmd.c:1302 +#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 +#: parser/parse_utilcmd.c:1862 #, 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:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, 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:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "La contrainte « %s » contient une référence de ligne complète vers la table « %s »." -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:2852 #, 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:2824 +#: commands/tablecmds.c:2856 #, 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:2825 +#: commands/tablecmds.c:2857 #, 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:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la colonne « %s » a un conflit de type" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la colonne « %s » a un conflit sur le collationnement" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, 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:2903 +#: commands/tablecmds.c:2935 #, 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:2905 +#: commands/tablecmds.c:2937 #, 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:2909 +#: commands/tablecmds.c:2941 #, 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:2914 +#: commands/tablecmds.c:2946 #, 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:3023 +#: commands/tablecmds.c:3055 #, 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:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la colonne « %s » hérite de valeurs par défaut conflictuelles" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, 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:3076 +#: commands/tablecmds.c:3108 #, 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:3289 +#: commands/tablecmds.c:3321 #, 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:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "ne peut pas renommer une colonne d'une table typée" -#: commands/tablecmds.c:3378 -#, 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:3410 +#, fuzzy, c-format +#| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgid "cannot rename columns of relation \"%s\"" +msgstr "ne peut pas modifier la colonne héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:3472 +#: commands/tablecmds.c:3505 #, 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:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "ne peut pas renommer la colonne système « %s »" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "ne peut pas renommer la colonne héritée « %s »" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, 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:3678 +#: commands/tablecmds.c:3711 #, 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:3976 +#: commands/tablecmds.c:4008 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "" @@ -9283,1458 +10497,1502 @@ msgstr "" "des requêtes actives dans cette session" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3985 +#: commands/tablecmds.c:4017 #, 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:4453 +#: commands/tablecmds.c:4486 #, 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:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "ne peut pas modifier la configuration de la persistence deux fois" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, fuzzy, c-format +#| msgid "cannot change inheritance of partitioned table" +msgid "cannot change access method of a partitioned table" +msgstr "ne peut pas modifier l'héritage d'une table partitionnée" + +#: commands/tablecmds.c:4721 +#, fuzzy, c-format +#| msgid "cannot have multiple SET TABLESPACE subcommands" +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "ne peut pas avoir de nombreuses sous-commandes SET TABLESPACE" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "ne peut pas ré-écrire la relation système « %s »" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, 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:5437 +#: commands/tablecmds.c:5492 #, 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:5898 +#: commands/tablecmds.c:5986 #, 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:5915 +#: commands/tablecmds.c:6003 #, 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:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, 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:5940 +#: commands/tablecmds.c:6028 #, 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:6088 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:6091 -#, 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:6097 -#, 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:6100 -#, 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:6103 -#, 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:6106 -#, 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:6109 -#, 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:6112 -#, 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:6115 -#, 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:6118 -#, 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:6128 -#, c-format -msgid "\"%s\" is of the wrong type" -msgstr "« %s » est du mauvais type" +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "la relation « %s » n'est pas un parent de la relation « %s »" -#: commands/tablecmds.c:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, 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:6386 +#: commands/tablecmds.c:6564 #, 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:6393 +#: commands/tablecmds.c:6571 #, 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:6449 +#: commands/tablecmds.c:6627 #, 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:6451 +#: commands/tablecmds.c:6629 #, 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:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "le type %s n'est pas un type composite" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "ne peut pas ajouter une colonne à une table typée" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "ne peut pas ajouter une colonne à une partition" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15144 #, 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:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15151 #, 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:6626 +#: commands/tablecmds.c:6804 #, 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:6669 +#: commands/tablecmds.c:6847 #, 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:6912 +#: commands/tablecmds.c:7091 #, 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:6990 +#: commands/tablecmds.c:7169 #, 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:6997 +#: commands/tablecmds.c:7176 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "la colonne « %s » de la relation « %s » existe déjà" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7242 commands/tablecmds.c:12072 #, 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:7064 commands/tablecmds.c:7381 commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7243 commands/tablecmds.c:7560 +#: commands/tablecmds.c:8557 commands/tablecmds.c:12073 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ne spécifiez pas le mot clé ONLY." -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 commands/tablecmds.c:7449 commands/tablecmds.c:7563 commands/tablecmds.c:7657 commands/tablecmds.c:7716 commands/tablecmds.c:7834 commands/tablecmds.c:8000 commands/tablecmds.c:8070 commands/tablecmds.c:8226 commands/tablecmds.c:11735 commands/tablecmds.c:13219 commands/tablecmds.c:15765 +#: commands/tablecmds.c:7280 commands/tablecmds.c:7486 +#: commands/tablecmds.c:7628 commands/tablecmds.c:7742 +#: commands/tablecmds.c:7836 commands/tablecmds.c:7895 +#: commands/tablecmds.c:8014 commands/tablecmds.c:8153 +#: commands/tablecmds.c:8223 commands/tablecmds.c:8379 +#: commands/tablecmds.c:12227 commands/tablecmds.c:13732 +#: commands/tablecmds.c:16301 #, c-format msgid "cannot alter system column \"%s\"" msgstr "n'a pas pu modifier la colonne système « %s »" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7286 commands/tablecmds.c:7634 #, 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:7150 +#: commands/tablecmds.c:7329 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la colonne « %s » est dans une clé primaire" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7334 #, 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:7178 +#: commands/tablecmds.c:7357 #, 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:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7557 commands/tablecmds.c:9040 #, 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:7379 +#: commands/tablecmds.c:7558 #, 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:7457 +#: commands/tablecmds.c:7636 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7462 +#: commands/tablecmds.c:7641 #, 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:7465 +#: commands/tablecmds.c:7644 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP EXTENSION." -#: commands/tablecmds.c:7574 +#: commands/tablecmds.c:7753 #, 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:7580 +#: commands/tablecmds.c:7759 #, 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:7586 +#: commands/tablecmds.c:7765 #, 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:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7842 commands/tablecmds.c:7903 #, 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:7729 +#: commands/tablecmds.c:7908 #, 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:7782 +#: commands/tablecmds.c:7961 #, 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:7804 +#: commands/tablecmds.c:7983 #, 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:7842 +#: commands/tablecmds.c:8022 #, 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:7847 +#: commands/tablecmds.c:8027 #, 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:7947 +#: commands/tablecmds.c:8100 #, c-format msgid "cannot refer to non-index column by number" msgstr "impossible de référencer une colonne non liée à une table par un nombre" -#: commands/tablecmds.c:7990 +#: commands/tablecmds.c:8143 #, 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:8009 +#: commands/tablecmds.c:8162 #, 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:8014 +#: commands/tablecmds.c:8167 #, 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:8016 +#: commands/tablecmds.c:8169 #, c-format msgid "Alter statistics on table column instead." msgstr "Modifiez les statistiques sur la colonne de la table à la place." -#: commands/tablecmds.c:8206 +#: commands/tablecmds.c:8359 #, c-format msgid "invalid storage type \"%s\"" msgstr "type de stockage « %s » invalide" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8391 #, 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:8283 +#: commands/tablecmds.c:8436 #, c-format msgid "cannot drop column from typed table" msgstr "ne peut pas supprimer une colonne à une table typée" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8495 #, 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:8355 +#: commands/tablecmds.c:8508 #, c-format msgid "cannot drop system column \"%s\"" msgstr "ne peut pas supprimer la colonne système « %s »" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8518 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "ne peut pas supprimer la colonne héritée « %s »" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8531 #, 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:8403 +#: commands/tablecmds.c:8556 #, 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:8607 +#: commands/tablecmds.c:8760 #, 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:8632 +#: commands/tablecmds.c:8785 #, 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:8967 +#: commands/tablecmds.c:9122 #, 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:8973 +#: commands/tablecmds.c:9128 #, 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:8976 +#: commands/tablecmds.c:9131 #, 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:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9138 commands/tablecmds.c:9604 #, 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:9006 +#: commands/tablecmds.c:9161 #, 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:9013 +#: commands/tablecmds.c:9168 #, 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:9019 +#: commands/tablecmds.c:9174 #, 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:9023 +#: commands/tablecmds.c:9178 #, 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:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9252 commands/tablecmds.c:9258 #, 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:9111 +#: commands/tablecmds.c:9274 #, 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:9218 +#: commands/tablecmds.c:9381 #, 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:9220 +#: commands/tablecmds.c:9383 #, 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:9583 commands/tablecmds.c:9996 parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9540 +#, fuzzy, c-format +#| msgid "column \"%s\" referenced in statistics does not exist" +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "la colonne « %s » référencée dans les statistiques n'existe pas" + +#: commands/tablecmds.c:9813 commands/tablecmds.c:10281 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, 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:10373 commands/tablecmds.c:10651 commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10833 commands/tablecmds.c:11111 +#: commands/tablecmds.c:12029 commands/tablecmds.c:12104 #, 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:10380 +#: commands/tablecmds.c:10840 #, 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:10418 +#: commands/tablecmds.c:10878 #, 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:10421 +#: commands/tablecmds.c:10881 #, 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:10423 +#: commands/tablecmds.c:10883 #, 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:10659 +#: commands/tablecmds.c:11119 #, 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:10737 +#: commands/tablecmds.c:11197 #, 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:10827 +#: commands/tablecmds.c:11287 #, 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:10833 -#, c-format +#: commands/tablecmds.c:11293 +#, fuzzy, c-format +#| msgid "system columns cannot be used in an ON CONFLICT clause" msgid "system columns cannot be used in foreign keys" -msgstr "les colonnes systèmes ne peuvent pas être utilisées dans des clés étrangères" +msgstr "les colonnes systèmes ne peuvent pas être utilisées dans une clause ON CONFLICT" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11297 #, 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:10902 +#: commands/tablecmds.c:11363 #, 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:10919 +#: commands/tablecmds.c:11380 #, 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:10984 +#: commands/tablecmds.c:11445 #, 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:11078 +#: commands/tablecmds.c:11539 #, 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:11083 +#: commands/tablecmds.c:11544 #, 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:11493 +#: commands/tablecmds.c:11985 #, 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:11543 +#: commands/tablecmds.c:12035 #, 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:11719 +#: commands/tablecmds.c:12211 #, 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:11746 +#: commands/tablecmds.c:12238 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s »" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12247 #, 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:11805 +#: commands/tablecmds.c:12297 #, 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:11808 +#: commands/tablecmds.c:12300 #, c-format msgid "You might need to add an explicit cast." msgstr "Vous pouvez avoir besoin d'ajouter une conversion explicite." -#: commands/tablecmds.c:11812 +#: commands/tablecmds.c:12304 #, 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:11815 +#: commands/tablecmds.c:12307 #, 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:11914 +#: commands/tablecmds.c:12406 #, 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:11942 +#: commands/tablecmds.c:12434 #, 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:11953 +#: commands/tablecmds.c:12445 #, 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:12078 +#: commands/tablecmds.c:12570 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "ne peut pas modifier la colonne « %s » deux fois" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12608 #, 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:12121 +#: commands/tablecmds.c:12613 #, 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:12199 -#, 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:12200 -#, 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:12221 +#: commands/tablecmds.c:12694 #, 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:12222 commands/tablecmds.c:12241 commands/tablecmds.c:12259 +#: commands/tablecmds.c:12695 commands/tablecmds.c:12714 +#: commands/tablecmds.c:12732 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s dépend de la colonne « %s »" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12713 #, 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:12258 +#: commands/tablecmds.c:12731 #, 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:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:12762 +#, 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:12763 +#, 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:13840 commands/tablecmds.c:13852 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "ne peut pas modifier le propriétaire de l'index « %s »" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13842 commands/tablecmds.c:13854 #, 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:13355 +#: commands/tablecmds.c:13868 #, 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:13369 commands/tablecmds.c:16665 +#: commands/tablecmds.c:13882 commands/tablecmds.c:17201 +#: commands/tablecmds.c:17220 #, c-format msgid "Use ALTER TYPE instead." msgstr "Utilisez ALTER TYPE à la place." -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13891 #, 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" +msgid "cannot change owner of relation \"%s\"" +msgstr "ne peut pas modifier le propriétaire de la relation « %s »" -#: commands/tablecmds.c:13717 +#: commands/tablecmds.c:14253 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "ne peut pas avoir de nombreuses sous-commandes SET TABLESPACE" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14330 #, 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" +msgid "cannot set options for relation \"%s\"" +msgstr "ne peut pas configurer les options de la relation « %s »" -#: commands/tablecmds.c:13827 commands/view.c:505 +#: commands/tablecmds.c:14364 commands/view.c:521 #, 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:14079 +#: commands/tablecmds.c:14614 #, 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:14091 +#: commands/tablecmds.c:14626 #, 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:14183 +#: commands/tablecmds.c:14718 #, 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:14199 +#: commands/tablecmds.c:14734 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "aucune relation correspondante trouvée dans le tablespace « %s »" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14852 #, 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:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14857 commands/tablecmds.c:15413 #, c-format msgid "cannot change inheritance of a partition" msgstr "ne peut pas modifier l'héritage d'une partition" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14862 #, 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:14372 +#: commands/tablecmds.c:14908 #, 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:14385 +#: commands/tablecmds.c:14921 #, c-format msgid "cannot inherit from a partition" msgstr "ne peut pas hériter d'une partition" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17309 +#: commands/tablecmds.c:14943 commands/tablecmds.c:17854 #, c-format msgid "circular inheritance not allowed" msgstr "héritage circulaire interdit" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17310 +#: commands/tablecmds.c:14944 commands/tablecmds.c:17855 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "« %s » est déjà un enfant de « %s »." -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14957 #, 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:14423 +#: commands/tablecmds.c:14959 #, 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:14626 +#: commands/tablecmds.c:15162 #, 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:14635 +#: commands/tablecmds.c:15171 #, 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:14685 +#: commands/tablecmds.c:15221 #, 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:14713 +#: commands/tablecmds.c:15249 #, c-format msgid "child table is missing column \"%s\"" msgstr "la table enfant n'a pas de colonne « %s »" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15337 #, 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:14809 +#: commands/tablecmds.c:15345 #, 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:14820 +#: commands/tablecmds.c:15356 #, 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:14855 +#: commands/tablecmds.c:15391 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "la table enfant n'a pas de contrainte « %s »" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15477 #, 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:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15506 commands/tablecmds.c:15554 #, 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:15024 +#: commands/tablecmds.c:15560 #, 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:15252 +#: commands/tablecmds.c:15788 #, c-format msgid "typed tables cannot inherit" msgstr "les tables avec type ne peuvent pas hériter d'autres tables" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15818 #, c-format msgid "table is missing column \"%s\"" msgstr "la colonne « %s » manque à la table" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15829 #, 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:15302 +#: commands/tablecmds.c:15838 #, 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:15316 +#: commands/tablecmds.c:15852 #, c-format msgid "table has extra column \"%s\"" msgstr "la table a une colonne supplémentaire « %s »" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15904 #, c-format msgid "\"%s\" is not a typed table" msgstr "« %s » n'est pas une table typée" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16078 #, 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:15548 +#: commands/tablecmds.c:16084 #, 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:15554 +#: commands/tablecmds.c:16090 #, 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:15560 +#: commands/tablecmds.c:16096 #, 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:15577 +#: commands/tablecmds.c:16113 #, 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:15584 +#: commands/tablecmds.c:16120 #, 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:15831 +#: commands/tablecmds.c:16367 #, 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:15855 +#: commands/tablecmds.c:16391 #, 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:15857 +#: commands/tablecmds.c:16393 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Les relations non journalisées ne peuvent pas être répliquées." -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16438 #, 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:15912 +#: commands/tablecmds.c:16448 #, 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:15970 +#: commands/tablecmds.c:16506 #, 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:16077 +#: commands/tablecmds.c:16613 #, 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:16648 +#: commands/tablecmds.c:17034 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "« %s » n'est ni une table ni une vue matérialisée" + +#: commands/tablecmds.c:17184 #, c-format msgid "\"%s\" is not a composite type" msgstr "« %s » n'est pas un type composite" -#: commands/tablecmds.c:16680 +#: commands/tablecmds.c:17212 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "ne peut pas modifier le schéma de l'index « %s »" + +#: commands/tablecmds.c:17214 commands/tablecmds.c:17226 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Modifier à la place le propriétaire de la table." + +#: commands/tablecmds.c:17218 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "ne peut pas modifier le schéma du type composite « %s »" + +#: commands/tablecmds.c:17224 #, 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" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "ne peut pas modifier la schéma de la table TOAST « %s »" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17261 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "stratégie de partitionnement « %s » non reconnue" -#: commands/tablecmds.c:16723 +#: commands/tablecmds.c:17269 #, 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:16789 +#: commands/tablecmds.c:17335 #, 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:16797 +#: commands/tablecmds.c:17343 #, 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:16808 commands/tablecmds.c:16922 +#: commands/tablecmds.c:17354 commands/tablecmds.c:17468 #, 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:16809 commands/tablecmds.c:16923 commands/trigger.c:653 rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 +#: commands/tablecmds.c:17355 commands/tablecmds.c:17469 commands/trigger.c:668 +#: rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 #, c-format msgid "Column \"%s\" is a generated column." msgstr "la colonne « %s » est une colonne générée." -#: commands/tablecmds.c:16885 +#: commands/tablecmds.c:17431 #, 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:16905 +#: commands/tablecmds.c:17451 #, 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:16935 +#: commands/tablecmds.c:17481 #, 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:16956 +#: commands/tablecmds.c:17502 #, 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:16991 +#: commands/tablecmds.c:17537 #, 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:16997 +#: commands/tablecmds.c:17543 #, 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:17249 +#: commands/tablecmds.c:17794 #, c-format msgid "\"%s\" is already a partition" msgstr "« %s » est déjà une partition" -#: commands/tablecmds.c:17255 +#: commands/tablecmds.c:17800 #, c-format msgid "cannot attach a typed table as partition" msgstr "ne peut pas attacher une table typée à une partition" -#: commands/tablecmds.c:17271 +#: commands/tablecmds.c:17816 #, 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:17285 +#: commands/tablecmds.c:17830 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "ne peut pas attacher le parent d'héritage comme partition" -#: commands/tablecmds.c:17319 +#: commands/tablecmds.c:17864 #, 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:17327 +#: commands/tablecmds.c:17872 #, 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:17335 +#: commands/tablecmds.c:17880 #, 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:17342 +#: commands/tablecmds.c:17887 #, 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:17362 +#: commands/tablecmds.c:17907 #, 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:17365 +#: commands/tablecmds.c:17910 #, 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:17377 +#: commands/tablecmds.c:17922 #, 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:17379 commands/trigger.c:459 +#: commands/tablecmds.c:17924 #, 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" +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:17558 +#: commands/tablecmds.c:18103 #, 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:17561 +#: commands/tablecmds.c:18106 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "La table partitionnée « %s » contient des index uniques." -#: commands/tablecmds.c:17885 +#: commands/tablecmds.c:18421 #, 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:17994 +#: commands/tablecmds.c:18530 #, 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:18000 +#: commands/tablecmds.c:18536 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "la partition « %s » a été supprimée de façon concurrente" -#: commands/tablecmds.c:18483 commands/tablecmds.c:18503 commands/tablecmds.c:18523 commands/tablecmds.c:18542 commands/tablecmds.c:18584 +#: commands/tablecmds.c:19051 commands/tablecmds.c:19071 +#: commands/tablecmds.c:19091 commands/tablecmds.c:19110 +#: commands/tablecmds.c:19152 #, 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:18486 +#: commands/tablecmds.c:19054 #, 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:18506 +#: commands/tablecmds.c:19074 #, 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:18526 +#: commands/tablecmds.c:19094 #, c-format msgid "The index definitions do not match." msgstr "La définition de l'index correspond pas." -#: commands/tablecmds.c:18545 +#: commands/tablecmds.c:19113 #, 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:18587 +#: commands/tablecmds.c:19155 #, 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:18824 +#: commands/tablecmds.c:19392 #, 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:18831 +#: commands/tablecmds.c:19399 #, c-format msgid "invalid compression method \"%s\"" msgstr "méthode de compression « %s » invalide" -#: commands/tablespace.c:161 commands/tablespace.c:177 commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 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:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "« %s » existe mais n'est pas un répertoire" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "droit refusé pour créer le tablespace « %s »" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Doit être super-utilisateur pour créer un tablespace." -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "le chemin du tablespace ne peut pas contenir de guillemets simples" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "le chemin du tablespace doit être un chemin absolu" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "le chemin du tablespace « %s » est trop long" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format 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:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "nom inacceptable pour le tablespace « %s »" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, 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:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "le tablespace « %s » existe déjà" -#: commands/tablespace.c:427 commands/tablespace.c:959 commands/tablespace.c:1048 commands/tablespace.c:1117 commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "OID de pg_tablespace non configuré en mode de mise à jour binaire" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "le tablespace « %s » n'existe pas" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "le tablespace « %s » n'existe pas, poursuite du traitement" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "le tablespace « %s » ne peut pas être supprimé car d'autres objets en dépendent" -#: commands/tablespace.c:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "le tablespace « %s » n'est pas vide" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "le répertoire « %s » n'existe pas" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Créer le répertoire pour ce tablespace avant de redémarrer le serveur." -#: commands/tablespace.c:618 +#: commands/tablespace.c:638 #, c-format 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:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "répertoire « %s » déjà utilisé comme tablespace" -#: commands/tablespace.c:768 commands/tablespace.c:781 commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 +#: storage/file/fd.c:3669 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "n'a pas pu supprimer le répertoire « %s » : %m" -#: commands/tablespace.c:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, 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:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Le tablespace « %s » n'existe pas." -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, 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:1567 +#: commands/tablespace.c:1590 #, 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:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "« %s » est une table" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Les tables ne peuvent pas avoir de triggers INSTEAD OF." -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "« %s » est une table partitionnée" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." -msgstr "Les triggers ROW avec des tables de transition ne sont pas supportés sur les tables partitionnées." +msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les tables partitionnées" -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "« %s » est une vue" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, 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:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Les vues ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "« %s » est une table distante" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, 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:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers de contrainte." -#: commands/trigger.c:377 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "la relation « %s » ne peut pas avoir de triggers" + +#: commands/trigger.c:392 #, 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:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "les triggers INSTEAD OF doivent être FOR EACH ROW" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, 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:393 +#: commands/trigger.c:408 #, 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:422 +#: commands/trigger.c:437 #, 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:423 +#: commands/trigger.c:438 #, 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:436 +#: commands/trigger.c:451 #, 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:443 +#: commands/trigger.c:458 #, 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:463 +#: commands/trigger.c:474 +#, 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/trigger.c:478 #, 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:469 +#: commands/trigger.c:484 #, 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:474 +#: commands/trigger.c:489 #, 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:491 +#: commands/trigger.c:506 #, 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:502 +#: commands/trigger.c:517 #, 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:519 +#: commands/trigger.c:534 #, 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:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, 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:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, 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:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, 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:618 +#: commands/trigger.c:633 #, 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:631 +#: commands/trigger.c:646 #, 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:636 +#: commands/trigger.c:651 #, 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:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, 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:645 +#: commands/trigger.c:660 #, 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:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "le trigger « %s » de la relation « %s » existe déjà" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "le trigger « %s » de la relation « %s » est un trigger interne" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "le trigger « %s » de la relation « %s » est un trigger interne ou un trigger enfant" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, 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:1354 commands/trigger.c:1515 commands/trigger.c:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, 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:1600 +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "ne peut pas renommer le trigger « %s » sur la table « %s »" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Renommez à la place le trigger sur la table partitionnée « %s »." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "renommé le trigger « %s » sur la relation « %s »" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "droit refusé : « %s » est un trigger système" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" msgstr "la fonction trigger %u a renvoyé la valeur NULL" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3346 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT ne peut pas renvoyer une valeur" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, 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:2356 +#: commands/trigger.c:2586 #, 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:3104 executor/nodeModifyTable.c:1956 executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3423 executor/nodeModifyTable.c:2344 +#: executor/nodeModifyTable.c:2427 #, 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:3105 executor/nodeModifyTable.c:1306 executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3424 executor/nodeModifyTable.c:1510 +#: executor/nodeModifyTable.c:1584 executor/nodeModifyTable.c:2345 +#: executor/nodeModifyTable.c:2428 executor/nodeModifyTable.c:3059 #, 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:3134 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3465 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1526 executor/nodeModifyTable.c:2362 +#: executor/nodeModifyTable.c:2570 #, 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:3142 executor/nodeModifyTable.c:1412 executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3473 executor/nodeModifyTable.c:1616 +#: executor/nodeModifyTable.c:2445 executor/nodeModifyTable.c:2594 +#: executor/nodeModifyTable.c:2947 #, 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:4234 +#: commands/trigger.c:4680 #, 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:5284 +#: commands/trigger.c:5863 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "la contrainte « %s » n'est pas DEFERRABLE" -#: commands/trigger.c:5307 +#: commands/trigger.c:5886 #, c-format msgid "constraint \"%s\" does not exist" msgstr "la contrainte « %s » n'existe pas" @@ -10846,588 +12104,593 @@ msgstr "doit être super-utilisateur pour créer un type de base" msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Créez le type comme un type shell, puis créez ses fonctions I/O, puis faites un vrai CREATE TYPE." -#: 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 "attribut du type « %s » non reconnu" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "catégorie de type « %s » invalide : doit être de l'ASCII pur" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "le type d'élément tableau ne peut pas être %s" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "alignement « %s » non reconnu" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "stockage « %s » non reconnu" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "le type d'entrée de la fonction doit être spécifié" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "le type de sortie de la fonction doit être spécifié" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "" "la fonction en sortie du modificateur de type est inutile sans une fonction\n" "en entrée du modificateur de type" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format 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 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "« %s » n'est pas un type de base valide pour un domaine" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "multiples expressions par défaut" -#: 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 "contraintes NULL/NOT NULL en conflit" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "les contraintes CHECK pour les domaines ne peuvent pas être marquées NO INHERIT" -#: 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 "contraintes uniques impossible pour les domaines" -#: 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 "contraintes de clé primaire impossible pour les domaines" -#: 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 "contraintes d'exclusion impossible pour les domaines" -#: 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 "contraintes de clé étrangère impossible pour les domaines" -#: 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 "spécifier des contraintes déferrantes n'est pas supporté par les domaines" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s n'est pas un enum" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "l'attribut du sous-type est requis" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "le sous-type de l'intervalle ne peut pas être %s" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "collationnement spécifié pour l'intervalle mais le sous-type ne supporte pas les collationnements" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "ne peut pas spécifier une fonction canonique sans un type shell précédemment créé" -#: 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 "Créez le type comme un type shell, puis créez sa fonction canonisée, puis faites un vrai CREATE TYPE." -#: commands/typecmds.c:1981 +#: commands/typecmds.c:1966 #, 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:1999 +#: commands/typecmds.c:1984 #, 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:2015 +#: commands/typecmds.c:2000 #, 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:2043 +#: commands/typecmds.c:2028 #, 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:2050 +#: commands/typecmds.c:2035 #, 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:2079 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "la fonction receive du type %s a plusieurs correspondances" -#: commands/typecmds.c:2097 +#: commands/typecmds.c:2082 #, 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:2104 +#: commands/typecmds.c:2089 #, 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:2132 +#: commands/typecmds.c:2117 #, 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:2139 +#: commands/typecmds.c:2124 #, 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:2166 +#: commands/typecmds.c:2151 #, 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:2173 +#: commands/typecmds.c:2158 #, 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:2200 +#: commands/typecmds.c:2185 #, 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:2207 +#: commands/typecmds.c:2192 #, 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:2234 +#: commands/typecmds.c:2219 #, 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:2263 +#: commands/typecmds.c:2248 #, 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:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "les types utilisateurs ne peuvent pas utiliser la fonction d'indiçage %s" -#: commands/typecmds.c:2319 +#: 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 "" "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:2350 +#: commands/typecmds.c:2335 #, 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:2356 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "la fonction canonical %s du range doit être immutable" -#: commands/typecmds.c:2392 +#: commands/typecmds.c:2377 #, 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:2399 +#: commands/typecmds.c:2384 #, 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:2426 +#: commands/typecmds.c:2411 #, 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:2459 +#: commands/typecmds.c:2444 #, 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:2492 +#: commands/typecmds.c:2477 #, 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" -#: commands/typecmds.c:2791 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "la colonne « %s » de la table « %s » contient des valeurs NULL" -#: 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 "la contrainte « %s » du domaine « %s » n'existe pas" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "la contrainte « %s » du domaine « %s » n'existe pas, ignore" -#: commands/typecmds.c:3113 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "la contrainte « %s » du domaine « %s » n'est pas une contrainte de vérification" -#: commands/typecmds.c:3219 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "la colonne « %s » de la table « %s » contient des valeurs violant la\n" "nouvelle contrainte" -#: 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 n'est pas un domaine" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "la contrainte « %s » du domaine « %s » existe déjà" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "" "ne peut pas utiliser les références de table dans la contrainte de\n" "vérification du domaine" -#: 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 » est du type ligne de table" -#: 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 "Utilisez ALTER TABLE à la place." -#: 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 "ne peut pas modifier le type array %s" -#: 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 "Vous pouvez modifier le type %s, ce qui va modifier aussi le type tableau." -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "le type « %s » existe déjà dans le schéma « %s »" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "ne peut pas modifier le stockage du type en PLAIN" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "l'attribut du type « %s » ne peut pas être changé" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "doit être super-utilisateur pour modifier un type" -#: 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 » n'est pas un type de base" -#: commands/user.c:140 +#: commands/user.c:138 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID ne peut plus être spécifié" -#: commands/user.c:294 +#: commands/user.c:256 #, c-format msgid "must be superuser to create superusers" msgstr "doit être super-utilisateur pour créer des super-utilisateurs" -#: commands/user.c:301 +#: commands/user.c:263 #, c-format msgid "must be superuser to create replication users" msgstr "doit être super-utilisateur pour créer des utilisateurs avec l'attribut réplication" -#: commands/user.c:308 +#: commands/user.c:270 #, c-format msgid "must be superuser to create bypassrls users" msgstr "doit être super-utilisateur pour créer des utilisateurs avec l'attribut BYPASSRLS" -#: commands/user.c:315 +#: commands/user.c:277 #, c-format msgid "permission denied to create role" msgstr "droit refusé pour créer un rôle" -#: commands/user.c:325 commands/user.c:1226 commands/user.c:1233 gram.y:15260 gram.y:15305 utils/adt/acl.c:5248 utils/adt/acl.c:5254 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 +#: gram.y:16483 utils/adt/acl.c:5331 utils/adt/acl.c:5337 #, c-format msgid "role name \"%s\" is reserved" msgstr "le nom du rôle « %s » est réservé" -#: 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 "Les noms de rôle commençant par « pg_ » sont réservés." -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "le rôle « %s » existe déjà" -#: 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 "une chaîne vide n'est pas un mot de passe valide, effacement du mot de passe" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "la valeur d'OID de pg_authid n'est pas positionnée en mode de mise à jour binaire" -#: commands/user.c:570 commands/user.c:925 +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "Ne peut pas modifier les rôles réservés." -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" msgstr "doit être super-utilisateur pour modifier les rôles ayant l'attribut SUPERUSER ou pour changer l'attribut SUPERUSER" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "must be superuser to alter replication roles or change replication attribute" msgstr "doit être super-utilisateur pour modifier les rôles ayant l'attribut REPLICATION ou pour changer l'attribut REPLICATION" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "doit être super-utilisateur pour modifier l'attribut bypassrls" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "droit refusé" -#: 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 "doit être super-utilisateur pour modifier des super-utilisateurs" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "doit être super-utilisateur pour modifier globalement les configurations" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "droit refusé pour supprimer le rôle" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "ne peut pas être le spécificateur de rôle spécial dans DROP ROLE" -#: 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:710 +#: 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 "le rôle « %s » n'existe pas" -#: commands/user.c:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "le rôle « %s » n'existe pas, poursuite du traitement" -#: 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 "l'utilisateur actuel ne peut pas être supprimé" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "l'utilisateur de la session ne peut pas être supprimé" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "doit être super-utilisateur pour supprimer des super-utilisateurs" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "le rôle « %s » ne peut pas être supprimé car d'autres objets en dépendent" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "l'utilisateur de la session ne peut pas être renommé" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "l'utilisateur courant ne peut pas être renommé" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "doit être super-utilisateur pour renommer les super-utilisateurs" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "droit refusé pour renommer le rôle" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "mot de passe MD5 effacé à cause du renommage du rôle" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "les noms de colonne ne peuvent pas être inclus dans GRANT/REVOKE ROLE" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "droit refusé pour supprimer les objets" -#: 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 "droit refusé pour ré-affecter les objets" -#: 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 "doit avoir l'option admin sur le rôle « %s »" -#: commands/user.c:1509 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "le rôle « %s » ne peut pas avoir de membres explicites" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "doit être super-utilisateur pour configurer le « donneur de droits »" -#: commands/user.c:1560 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "le rôle « %s » n'est pas un membre de tout autre rôle" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "le rôle « %s » est un membre du rôle « %s »" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "le rôle « %s » est déjà un membre du rôle « %s »" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "le rôle « %s » n'est pas un membre du rôle « %s »" -#: commands/vacuum.c:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "option d'ANALYZE « %s » non reconnue" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "l'option parallel nécessite une valeur comprise entre 0 et %d" -#: commands/vacuum.c:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "le nombre de processus workers parallélisés pour le VACUUM doit être entre 0 et %d" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "option « %s » de la commande VACUUM non reconnue" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "Un VACUUM FULL ne peut être exécuté de façon parallélisé" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "l'option ANALYZE doit être spécifiée quand une liste de colonne est fournie" -#: commands/vacuum.c:329 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s ne peut pas être exécuté dans un VACUUM ou un ANALYZE" -#: commands/vacuum.c:339 +#: commands/vacuum.c:346 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "l'option DISABLE_PAGE_SKIPPING de la commande VACUUM ne pas être utilisée en même temps que l'option FULL" -#: commands/vacuum.c:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST requis avec VACUUM FULL" @@ -11490,12 +12753,12 @@ msgstr "ignore l'analyse de « %s » --- verrou non disponible" msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "ignore l'analyse de « %s » --- la relation n'existe plus" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "le plus ancien xmin est loin dans le passé" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11504,40 +12767,81 @@ msgstr "" "Fermer les transactions dès que possible pour éviter des problèmes de rebouclage d'identifiants de transaction.\n" "Vous pouvez avoir besoin de valider ou d'annuler les anciennes transactions préparées, ou de supprimer les slots de réplication trop anciens." -#: commands/vacuum.c:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "le plus ancien multixact est loin dans le passé" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "" "Fermez les transactions ouvertes avec multixacts rapidement pour éviter des problèmes de\n" "réinitialisation." -#: commands/vacuum.c:1755 +#: commands/vacuum.c:1807 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "certaines bases de données n'ont pas eu droit à l'opération de maintenance\n" "VACUUM depuis plus de 2 milliards de transactions" -#: commands/vacuum.c:1756 +#: commands/vacuum.c:1808 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Vous pouvez avoir déjà souffert de pertes de données suite à une\n" "réinitialisation de l'identifiant des transactions." -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1976 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" 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:11649 utils/misc/guc.c:11711 +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes" + +#: commands/vacuum.c:2373 +#, 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" + +#: commands/vacuum.c:2377 +#, fuzzy, 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.\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." +msgstr "" +"%.0f versions de ligne d'index ont été supprimées.\n" +"%u blocs d'index ont été nouvellement supprimés.\n" +"%u blocs d'index sont actuellement supprimés, dont %u sont actuellement réutilisables.\n" +"%s." + +#: commands/vacuumparallel.c:664 +#, 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)" + +#: commands/vacuumparallel.c:670 +#, 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)" + +#: commands/variable.c:165 utils/misc/guc.c:12100 utils/misc/guc.c:12178 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Mot clé non reconnu : « %s »." @@ -11605,7 +12909,7 @@ msgstr "" "SET TRANSACTION ISOLATION LEVEL ne doit pas être appelé dans une\n" "sous-transaction" -#: 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 "ne peut pas utiliser le mode sérialisable sur un serveur en « Hot Standby »" @@ -11672,32 +12976,37 @@ msgstr "ne peut pas modifier le nom de la colonne « %s » de la vue en « %s » msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "À la place, utilisez ALTER VIEW ... RENAME COLUMN ... pour modifier le nom de la colonne d'une vue." -#: commands/view.c:304 +#: commands/view.c:309 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "ne peut pas modifier le type de données de la colonne « %s » de la vue de %s à %s" -#: commands/view.c:452 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "ne peut pas modifier la collation de la colonne de vue « %s » de « %s » à « %s »" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "les vues ne peuvent pas contenir SELECT INTO" -#: commands/view.c:464 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "les vues ne peuvent pas contenir d'instructions de modifications de données avec WITH" -#: commands/view.c:534 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW spécifie plus de noms de colonnes que de colonnes" -#: commands/view.c:542 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "les vues ne peuvent pas être non tracées car elles n'ont pas de stockage" -#: commands/view.c:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vue « %s » sera une vue temporaire" @@ -11727,352 +13036,398 @@ msgstr "le curseur « %s » n'a pas de référence FOR UPDATE/SHARE pour la tabl msgid "cursor \"%s\" is not positioned on a row" msgstr "le curseur « %s » n'est pas positionné sur une ligne" -#: executor/execCurrent.c:169 executor/execCurrent.c:228 executor/execCurrent.c:239 +#: executor/execCurrent.c:169 executor/execCurrent.c:228 +#: executor/execCurrent.c:239 #, c-format msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "le curseur « %s » n'est pas un parcours modifiable de la table « %s »" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2452 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 #, 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)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2464 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2466 #, c-format msgid "no value found for parameter %d" msgstr "aucune valeur trouvée pour le paramètre %d" -#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 executor/execExprInterp.c:4033 executor/execExprInterp.c:4050 executor/execExprInterp.c:4149 executor/nodeModifyTable.c:119 executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 executor/nodeModifyTable.c:155 +#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 +#: executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 +#: executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "le type de ligne de la table et celui spécifié par la requête ne correspondent pas" -#: executor/execExpr.c:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "La requête a trop de colonnes." -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "La requête fournit une valeur pour une colonne supprimée à la position\n" "ordinale %d." -#: executor/execExpr.c:650 executor/execExprInterp.c:4051 executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 +#: executor/nodeModifyTable.c:209 #, c-format 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:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:826 #, c-format msgid "window function calls cannot be nested" msgstr "les appels à la fonction window ne peuvent pas être imbriqués" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "le type cible n'est pas un tableau" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "une colonne ROW() a le type %s au lieu du type %s" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1031 +#: executor/execExpr.c:2482 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] "ne peut pas passer plus de %d argument à une fonction" msgstr[1] "ne peut pas passer plus de %d arguments à une fonction" -#: executor/execExpr.c:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" + +#: executor/execExpr.c:2915 parser/parse_node.c:276 parser/parse_node.c:326 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "ne peut pas indicer le type %s car il ne supporte pas les indices" -#: executor/execExpr.c:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" msgstr "le type %s ne supporte pas l'affectation avec indice" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "l'attribut %d du type %s a été supprimé" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "l'attribut %d de type %s a un mauvais type" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3058 executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 +#: executor/execExprInterp.c:3106 #, c-format 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:2004 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:492 +#: executor/execExprInterp.c:2006 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:570 #, c-format msgid "type %s is not composite" msgstr "le type %s n'est pas un type composite" -#: executor/execExprInterp.c:2542 +#: executor/execExprInterp.c:2544 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF n'est pas supporté pour ce type de table" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2757 #, c-format msgid "cannot merge incompatible arrays" msgstr "ne peut pas fusionner les tableaux incompatibles" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2758 #, c-format 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:2777 utils/adt/arrayfuncs.c:263 utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:263 +#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5370 +#: utils/adt/arrayfuncs.c:5887 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)" -#: executor/execExprInterp.c:2797 executor/execExprInterp.c:2832 +#: executor/execExprInterp.c:2799 executor/execExprInterp.c:2834 #, c-format 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" -#: executor/execExprInterp.c:2809 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 +#: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 +#: utils/adt/arrayfuncs.c:5979 utils/adt/arrayfuncs.c:6320 +#: 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)" -#: executor/execExprInterp.c:3057 executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 #, c-format msgid "attribute %d has wrong type" msgstr "l'attribut %d a un mauvais type" -#: executor/execExprInterp.c:3662 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3691 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "le domaine %s n'autorise pas les valeurs NULL" -#: executor/execExprInterp.c:3677 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3706 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "la valeur pour le domaine %s viole la contrainte de vérification « %s »" -#: executor/execExprInterp.c:4034 +#: executor/execExprInterp.c:4063 #, 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] "La ligne de la table contient %d attribut alors que la requête en attend %d." msgstr[1] "La ligne de la table contient %d attributs alors que la requête en attend %d." -#: executor/execExprInterp.c:4150 executor/execSRF.c:977 +#: executor/execExprInterp.c:4179 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "Le stockage physique ne correspond pas à l'attribut supprimé à la position\n" "ordinale %d." -#: executor/execIndexing.c:567 +#: executor/execIndexing.c:571 #, 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:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "n'a pas pu créer la contrainte d'exclusion « %s »" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "La clé %s est en conflit avec la clé %s." -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Un conflit de clés est présent." -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, 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:852 +#: executor/execIndexing.c:862 #, 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:854 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "La clé est en conflit avec une clé existante." -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "ne peut pas modifier la séquence « %s »" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "ne peut pas modifier la relation TOAST « %s »" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3096 rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 +#: rewrite/rewriteHandler.c:3974 #, 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:3099 rewrite/rewriteHandler.c:3930 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 +#: rewrite/rewriteHandler.c:3977 #, 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:3104 rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 +#: rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot update view \"%s\"" msgstr "ne peut pas mettre à jour la vue « %s »" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3107 rewrite/rewriteHandler.c:3938 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 +#: rewrite/rewriteHandler.c:3985 #, 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:3112 rewrite/rewriteHandler.c:3943 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 +#: rewrite/rewriteHandler.c:3990 #, 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:3115 rewrite/rewriteHandler.c:3946 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 +#: rewrite/rewriteHandler.c:3993 #, 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." -#: executor/execMain.c:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "ne peut pas modifier la vue matérialisée « %s »" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "ne peut pas insérer dans la table distante « %s »" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "la table distante « %s » n'autorise pas les insertions" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "ne peut pas modifier la table distante « %s »" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "la table distante « %s » n'autorise pas les modifications" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "ne peut pas supprimer à partir de la table distante « %s »" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "la table distante « %s » n'autorise pas les suppressions" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "ne peut pas modifier la relation « %s »" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la séquence « %s »" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la relation TOAST « %s »" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la vue « %s »" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la vue matérialisée « %s »" -#: executor/execMain.c:1173 executor/execMain.c:2587 executor/nodeLockRows.c:136 +#: executor/execMain.c:1175 executor/execMain.c:2685 +#: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "ne peut pas verrouiller la table distante « %s »" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "n'a pas pu verrouiller les lignes dans la relation « %s »" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "la nouvelle ligne de la relation « %s » viole la contrainte de partitionnement" -#: 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 "La ligne en échec contient %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 "une valeur NULL viole la contrainte NOT NULL de la colonne « %s » dans la relation « %s »" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "la nouvelle ligne de la relation « %s » viole la contrainte de vérification « %s »" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "la nouvelle ligne viole la contrainte de vérification pour la vue « %s »" -#: executor/execMain.c:2055 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » pour la table « %s »" -#: executor/execMain.c:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne pour la table « %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 "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » (expression USING) pour la table « %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 "la nouvelle ligne viole la politique de sécurité au niveau ligne (expression USING) pour la table « %s »" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » (expression USING) pour la table « %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 "la nouvelle ligne viole la politique de sécurité au niveau ligne (expression USING) pour la table « %s »" -#: executor/execPartition.c:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "aucune partition de la relation « %s » trouvée pour la ligne" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "La clé de partitionnement de la ligne en échec contient %s." @@ -12092,46 +13447,62 @@ msgstr "mise à jour concurrente, nouvelle tentative" msgid "concurrent delete, retrying" msgstr "suppression concurrente, nouvelle tentative" -#: executor/execReplication.c:276 parser/parse_cte.c:301 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:276 parser/parse_cte.c:308 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 +#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 +#: utils/adt/arrayfuncs.c:4208 utils/adt/arrayfuncs.c:6200 +#: 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" -#: executor/execReplication.c:604 +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, fuzzy, c-format +#| msgid "cannot update foreign table \"%s\"" +msgid "cannot update table \"%s\"" +msgstr "ne peut pas modifier la table distante « %s »" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "La colonne utilisée dans l'expression WHERE de la publication ne fait pas partie de l'identité de réplica." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "La liste de colonnes utilisée par la publication ne couvre pas l'identité de réplica." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, fuzzy, c-format +#| msgid "cannot delete from foreign table \"%s\"" +msgid "cannot delete from table \"%s\"" +msgstr "ne peut pas supprimer à partir de la table distante « %s »" + +#: executor/execReplication.c:644 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "ne peut pas mettre à jour la table « %s » car elle n'a pas d'identité de réplicat et publie des mises à jour" -#: executor/execReplication.c:606 +#: executor/execReplication.c:646 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Pour permettre les mises à jour sur la table, configurez REPLICA IDENTITY en utilisant ALTER TABLE." -#: executor/execReplication.c:610 +#: executor/execReplication.c:650 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "ne peut pas supprimer à partir de la table « %s » car elle n'a pas d'identité de réplicat et publie des suppressions" -#: executor/execReplication.c:612 +#: executor/execReplication.c:652 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Pour permettre les suppressions sur la table, configurez REPLICA IDENTITY en utilisant ALTER TABLE." -#: executor/execReplication.c:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "ne peut pas utiliser la relation « %s.%s » comme cible d'une réplication logique" -#: executor/execReplication.c:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "« %s.%s » est une table distante." - -#: executor/execReplication.c:641 -#, c-format -msgid "\"%s.%s\" is not a table." -msgstr "« %s.%s » n'est pas une table." - #: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" @@ -12176,7 +13547,8 @@ msgstr[1] "La ligne renvoyée contient %d attributs mais la requête en attend % msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "A renvoyé le type %s à la position ordinale %d, mais la requête attend %s." -#: executor/execTuples.c:146 executor/execTuples.c:353 executor/execTuples.c:521 executor/execTuples.c:712 +#: 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 "ne peut pas récupérer une colonne système dans ce contexte" @@ -12208,7 +13580,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:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s n'est pas autorisé dans une fonction non volatile" @@ -12228,7 +13600,9 @@ msgstr "fonction SQL « %s » lors du lancement" msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "l'appel à des procédures avec des arguments en sortie n'est pas supporté dans les fonctions SQL" -#: executor/functions.c:1701 executor/functions.c:1739 executor/functions.c:1753 executor/functions.c:1843 executor/functions.c:1876 executor/functions.c:1890 +#: executor/functions.c:1701 executor/functions.c:1739 +#: executor/functions.c:1753 executor/functions.c:1843 +#: executor/functions.c:1876 executor/functions.c:1890 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "le type de retour ne correspond pas à la fonction déclarant renvoyer %s" @@ -12270,21 +13644,16 @@ 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:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, 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" +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" -#: executor/nodeAgg.c:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3952 parser/parse_agg.c:668 parser/parse_agg.c:696 #, 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:4187 executor/nodeWindowAgg.c:2845 -#, 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" - #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12325,47 +13694,82 @@ msgstr "RIGHT JOIN est supporté seulement avec les conditions de jointures MERG msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN est supporté seulement avec les conditions de jointures MERGE" -#: executor/nodeModifyTable.c:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "La requête n'a pas assez de colonnes." -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1509 executor/nodeModifyTable.c:1583 #, 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:1583 +#: executor/nodeModifyTable.c:1737 #, c-format msgid "invalid ON UPDATE specification" msgstr "spécification ON UPDATE invalide" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1738 #, 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:2183 +#: executor/nodeModifyTable.c:2198 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" +msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" +msgstr "ne peut pas déplacer l'enregistrement parmi des partitions quand un ancêtre de la partition source qui n'est pas la racine est directement référencée dans une clé étrangère" + +#: executor/nodeModifyTable.c:2199 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "Une clé étrangère pointe vers l'ancêtre « %s » mais pas l'ancêtre racine « %s »." + +#: executor/nodeModifyTable.c:2202 +#, fuzzy, c-format +#| msgid "cannot insert into foreign table \"%s\"" +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "ne peut pas insérer dans la table distante « %s »" + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2548 executor/nodeModifyTable.c:2936 +#, 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 "la commande ON CONFLICT DO UPDATE ne peut pas affecter une ligne la deuxième fois" -#: executor/nodeModifyTable.c:2184 +#: executor/nodeModifyTable.c:2550 #, 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." -#: executor/nodeSamplescan.c:259 +#: executor/nodeModifyTable.c:2938 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Assurez-vous que pas plus d'une ligne source correspond à une ligne cible." + +#: executor/nodeModifyTable.c:3019 +#, c-format +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" + +#: executor/nodeModifyTable.c:3058 +#, 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 "la ligne à mettre à jour était déjà modifiée par une opération déclenchée par la commande courante" + +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "le paramètre de TABLESAMPLE ne peut pas être NULL" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "le paramètre TABLESAMPLE REPEATABLE ne peut pas être NULL" -#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "plus d'une ligne renvoyée par une sous-requête utilisée comme une expression" @@ -12400,104 +13804,104 @@ msgstr "NULL n'est pas autorisé dans la colonne « %s »" msgid "moving-aggregate transition function must not return null" msgstr "la fonction de conversion de l'agrégat en déplacement ne doit pas renvoyer null" -#: executor/nodeWindowAgg.c:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "l'offset de début de frame ne doit pas être NULL" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "l'offset de début de frame ne doit pas être négatif" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "l'offset de fin de frame ne doit pas être NULL" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "l'offset de fin de frame ne doit pas être négatif" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, c-format 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:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "arrêt de transaction invalide" -#: executor/spi.c:256 +#: executor/spi.c:257 #, 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:347 +#: executor/spi.c:348 #, 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:482 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "transaction gauche non vide dans la pile SPI" -#: executor/spi.c:483 executor/spi.c:543 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Vérifiez les appels manquants à « SPI_finish »." -#: executor/spi.c:542 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "sous-transaction gauche non vide dans la pile SPI" -#: executor/spi.c:1610 +#: executor/spi.c:1600 #, 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:1620 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "ne peut pas ouvrir la requête %s comme curseur" -#: executor/spi.c:1726 +#: executor/spi.c:1716 #, 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:1727 parser/analyze.c:2853 +#: executor/spi.c:1717 parser/analyze.c:2899 #, 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:2482 +#: executor/spi.c:2474 #, 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:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "la requête %s ne renvoie pas de lignes" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "expression SQL « %s »" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "affectation PL/pgSQL « %s »" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "instruction SQL « %s »" @@ -12507,388 +13911,438 @@ msgstr "instruction SQL « %s »" msgid "could not send tuple to shared-memory queue" msgstr "n'a pas pu envoyer la ligne dans la queue en mémoire partagée" -#: foreign/foreign.c:220 +#: foreign/foreign.c:221 #, c-format msgid "user mapping not found for \"%s\"" msgstr "correspondance utilisateur non trouvée pour « %s »" -#: foreign/foreign.c:672 +#: foreign/foreign.c:638 #, c-format msgid "invalid option \"%s\"" msgstr "option « %s » invalide" -#: foreign/foreign.c:673 +#: foreign/foreign.c:640 #, c-format msgid "Valid options in this context are: %s" msgstr "Les options valides dans ce contexte sont %s" -#: gram.y:1108 +#: 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 "Les options valides dans ce contexte sont %s" + +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD n'est plus supporté" -#: gram.y:1109 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Supprimez UNENCRYPTED pour enregistrer le mot de passe dans sa forme chiffrée à la place." -#: gram.y:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "option « %s » du rôle non reconnue" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS n'inclut pas les éléments du schéma" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "la base de données actuelle ne peut pas être changée" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "l'intervalle de fuseau horaire doit être HOUR ou HOUR TO MINUTE" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "le numéro de colonne doit être dans l'intervalle entre 1 et %d" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "option de séquence « %s » non supportée ici" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "le modulo pour la partition hash est spécifié plus d'une fois" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "le reste pour la partition hash est spécifié plus d'une fois" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "spécification de limite de partition hash non reconnue « %s »" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "le modulo pour les partitions hash doit être spécifié" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "le reste pour les partition hash doit être spécifié" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT non autorisé dans PROGRAM" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "la clause WHERE n'est pas autorisée avec COPY TO" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL est obsolète dans la création de la table temporaire" -#: gram.y:3666 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "pour une colonne générée, GENERATED ALWAYS doit toujours être spécifié" -#: gram.y:3934 utils/adt/ri_triggers.c:2032 +#: gram.y:4172 utils/adt/ri_triggers.c:2098 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL non implémenté" -#: gram.y:4635 +#: gram.y:4264 +#, 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 "le type de retour %s n'est pas supporté pour les fonctions SQL" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM n'est plus supporté" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "option « %s » de sécurité de ligne non reconnue" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Seules les politiques PERMISSIVE et RESTRICTIVE sont supportées actuellement." -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER n'est pas supporté" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "événements de trigger dupliqués spécifiés" -#: gram.y:5559 parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 +#: gram.y:5937 parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "la contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "propriétés de contrainte en conflit" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION n'est pas encore implémenté" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK n'est plus nécessaire" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "Mettez à jour votre type de données." -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "les agrégats ne peuvent pas avoir d'arguments en sortie" -#: gram.y:8189 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format msgid "missing argument" msgstr "argument manquant" -#: gram.y:8190 utils/adt/regproc.c:711 utils/adt/regproc.c:752 +#: gram.y:8772 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 "Utilisez NONE pour dénoter l'argument manquant d'un opérateur unitaire." -#: gram.y:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION non supporté sur les vues récursives" -#: gram.y:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "la syntaxe LIMIT #,# n'est pas supportée" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Utilisez les clauses séparées LIMIT et OFFSET." -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES dans FROM doit avoir un alias" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Par exemple, FROM (VALUES ...) [AS] quelquechose." -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "la sous-requête du FROM doit avoir un alias" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Par exemple, FROM (SELECT...) [AS] quelquechose." -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "seule une valeur DEFAULT est autorisée" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "seule une valeur PATH par colonne est autorisée" -#: gram.y:12687 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "déclarations NULL/NOT NULL en conflit ou redondantes pour la colonne « %s »" -#: gram.y:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "option de colonne « %s » non reconnue" -#: gram.y:12950 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "la précision du type float doit être d'au moins un bit" -#: gram.y:12959 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "la précision du type float doit être inférieur à 54 bits" -#: gram.y:13457 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "mauvais nombre de paramètres sur le côté gauche de l'expression OVERLAPS" -#: gram.y:13462 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "mauvais nombre de paramètres sur le côté droit de l'expression OVERLAPS" -#: gram.y:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "prédicat UNIQUE non implémenté" -#: gram.y:13989 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ne peut pas utiliser des clauses ORDER BY multiples dans WITHIN GROUP" -#: gram.y:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "ne peut pas utiliser DISTINCT avec WITHIN GROUP" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "ne peut pas utiliser VARIADIC avec WITHIN GROUP" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "la fin du frame ne peut pas être UNBOUNDED FOLLOWING" -#: gram.y:14528 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "la frame commençant après la ligne suivante ne peut pas se terminer avec la ligne actuelle" -#: gram.y:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "la fin du frame ne peut pas être UNBOUNDED PRECEDING" -#: gram.y:14557 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "la frame commençant à la ligne courante ne peut pas avoir des lignes précédentes" -#: gram.y:14564 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "la frame commençant à la ligne suivante ne peut pas avoir des lignes précédentes" -#: gram.y:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "le modificateur de type ne peut pas avoir de nom de paramètre" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "le modificateur de type ne peut pas avoir de clause ORDER BY" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s ne peut pas être utilisé comme nom de rôle ici" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES ne peut pas être indiqué sans clause ORDER BY" -#: gram.y:16478 gram.y:16667 +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "mauvaise utilisation de « * »" -#: gram.y:16630 gram.y:16647 tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 +#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 +#: tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 #, c-format msgid "syntax error" msgstr "erreur de syntaxe" -#: gram.y:16731 +#: gram.y:17913 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "un agrégat par ensemble ordonné avec un argument VARIADIC direct doit avoir un argument VARIADIC agrégé du même type de données" -#: gram.y:16768 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "clauses ORDER BY multiples non autorisées" -#: gram.y:16779 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "clauses OFFSET multiples non autorisées" -#: gram.y:16788 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "clauses LIMIT multiples non autorisées" -#: gram.y:16797 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "options limite multiples non autorisées" -#: gram.y:16824 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "clauses WITH multiples non autorisées" -#: gram.y:17018 +#: gram.y:18199 #, 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:17114 +#: gram.y:18332 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "clauses COLLATE multiples non autorisées" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17152 gram.y:17165 +#: gram.y:18370 gram.y:18383 #, 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:17178 +#: gram.y:18396 #, 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:17191 +#: gram.y:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "les contraintes %s ne peuvent pas être marquées NO INHERIT" +#: gram.y:18433 +#, fuzzy, c-format +#| msgid "invalid publication_names syntax" +msgid "invalid publication object list" +msgstr "syntaxe publication_names invalide" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "Soit la clause TABLE soit la clause TABLES IN SCHEMA doit être spécifiée avant une table individuelle ou un schéma." + +#: gram.y:18450 +#, fuzzy, c-format +#| msgid "invalid file name argument" +msgid "invalid table name" +msgstr "argument du nom de fichier invalide" + +#: gram.y:18471 +#, fuzzy, c-format +#| msgid "WHERE clause not allowed with COPY TO" +msgid "WHERE clause not allowed for schema" +msgstr "la clause WHERE n'est pas autorisée avec COPY TO" + +#: gram.y:18478 +#, fuzzy, c-format +#| msgid "interval specification not allowed here" +msgid "column specification not allowed for schema" +msgstr "interval de spécification non autorisé ici" + +#: gram.y:18492 +#, fuzzy, c-format +#| msgid "invalid statement name \"%s\" on line %d" +msgid "invalid schema name" +msgstr "nom d'instruction « %s » invalide sur la ligne %d" + #: guc-file.l:314 #, c-format 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:353 utils/misc/guc.c:7374 utils/misc/guc.c:7572 utils/misc/guc.c:7666 utils/misc/guc.c:7760 utils/misc/guc.c:7880 utils/misc/guc.c:7979 +#: guc-file.l:353 utils/misc/guc.c:7688 utils/misc/guc.c:7908 +#: utils/misc/guc.c:8006 utils/misc/guc.c:8104 utils/misc/guc.c:8228 +#: utils/misc/guc.c:8331 #, 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" @@ -12900,376 +14354,391 @@ msgstr "" "paramètre « %s » supprimé du fichier de configuration ;\n" "réinitialisation à la valeur par défaut" -#: guc-file.l:455 +#: guc-file.l:454 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "paramètre « %s » modifié par « %s »" -#: guc-file.l:497 +#: guc-file.l:496 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "le fichier de configuration « %s » contient des erreurs" -#: guc-file.l:502 +#: guc-file.l:501 #, 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:507 +#: guc-file.l:506 #, 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:579 +#: guc-file.l:578 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "nom de fichier de configuration vide : « %s »" -#: guc-file.l:596 +#: guc-file.l:595 #, 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:616 +#: guc-file.l:615 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "le fichier de configuration « %s » contient une récursion" -#: guc-file.l:632 libpq/hba.c:2255 libpq/hba.c:2669 +#: guc-file.l:631 libpq/hba.c:2223 utils/adt/hbafuncs.c:376 #, 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:643 +#: guc-file.l:642 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "ignore le fichier de configuration « %s » manquant" -#: guc-file.l:897 +#: guc-file.l:896 #, 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:907 +#: guc-file.l:906 #, 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:927 +#: guc-file.l:926 #, 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:982 +#: guc-file.l:981 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "nom de répertoire de configuration vide : « %s »" -#: guc-file.l:1001 +#: guc-file.l:1000 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire de configuration « %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:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 utils/adt/varlena.c:336 utils/adt/varlena.c:377 +#: 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:629 utils/adt/varlena.c:335 +#: utils/adt/varlena.c:376 #, c-format msgid "invalid input syntax for type %s" msgstr "syntaxe en entrée invalide pour le type %s" -#: jsonpath_gram.y:529 -#, c-format -msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" +#: jsonpath_gram.y:530 +#, fuzzy, c-format +#| msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "caractère d'état « %.*s » non reconnu dans un prédicat LIKE_REGEX" -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "le flag XQuery « x » (expression régulière étendue) n'est pas implémenté" #. 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 à la fin de l'entrée jsonpath" #. 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 sur ou près de « %s » de l'entrée jsonpath" -#: jsonpath_scan.l:498 utils/adt/jsonfuncs.c:623 +#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:623 #, c-format msgid "unsupported Unicode escape sequence" msgstr "séquence d'échappement Unicode non supportée" -#: lib/dshash.c:246 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 utils/mmgr/dsa.c:806 +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 +#: utils/mmgr/dsa.c:806 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Échec d'une requête DSA de taille %zu." -#: libpq/auth-scram.c:249 +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "attendait une réponse SASL, a reçu le type de message %d" + +#: libpq/auth-scram.c:258 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "le client a sélectionné un mécanisme d'authentification SASL invalide" -#: 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 "secret SCRAM invalide pour l'utilisateur « %s »" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "L'utilisateur « %s » n'a pas de secret SCRAM valide." -#: 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 "message SCRAM malformé" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "Le message est vide." -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "La longueur du message ne correspond pas à la longueur en entrée." -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "réponse SCRAM invalide" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Le nonce ne correspond pas." -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "n'a pas pu générer le sel aléatoire" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Attribut attendu « %c », mais « %s » trouvé." -#: 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 "Caractère « = » attendu pour l'attribut « %c »." -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "Attribut attendu, mais fin de chaîne trouvée." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Attribut attendu, mais caractère invalide « %s » trouvé." -#: 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 "Le client a sélectionné SCRAM-SHA-256-PLUS, mais le message SCRAM n'inclut pas de données de channel-binding." -#: 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 "Virgule attendue, mais caractère « %s » trouvé." -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Erreur de négociation de channel-binding SCRAM" -#: 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 "Le client supporte le channel binding SCRAM mais pense que le serveur ne le supporte pas. Cependant, ce serveur supporte vraiment le 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 "Le client a sélectionné SCRAM-SHA-256 sans channel binding, mais le message SCRAM inclue des données de channel-binding." -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "type de channel-binding SCRAM « %s » non supporté" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Drapeau du channel-binding inattendu « %s »." -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "le client utilise une identité d'autorisation, mais elle n'est pas supportée" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Attribut « %s » inattendu dans client-first-message." -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "le client requiert une extension SCRAM non supportée" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "caractères non affichables dans le nonce SCRAM" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "n'a pas pu générer le nonce aléatoire" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "n'a pas pu chiffrer le nonce aléatoire" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "la vérification du channel-binding SCRAM a échoué" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "attribut du lien de canal SCRAM inattendu dans client-final-message" -#: libpq/auth-scram.c:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "Preuve malformée dans le 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 "Problème trouvé à la fin de client-final-message." -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "authentification échouée pour l'utilisateur « %s » : hôte rejeté" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "authentification « trust » échouée pour l'utilisateur « %s »" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Échec de l'authentification Ident pour l'utilisateur « %s »" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "authentification peer échouée pour l'utilisateur « %s »" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "authentification par mot de passe échouée pour l'utilisateur « %s »" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "authentification GSSAPI échouée pour l'utilisateur « %s »" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "authentification SSPI échouée pour l'utilisateur « %s »" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "authentification PAM échouée pour l'utilisateur « %s »" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "authentification BSD échouée pour l'utilisateur « %s »" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "authentification LDAP échouée pour l'utilisateur « %s »" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "authentification par le certificat échouée pour l'utilisateur « %s »" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "authentification RADIUS échouée pour l'utilisateur « %s »" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "authentification échouée pour l'utilisateur « %s » : méthode d'authentification invalide" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "La connexion correspond à la ligne %d du pg_hba.conf : « %s »" -#: libpq/auth.c:371 +#: libpq/auth.c:362 #, c-format msgid "authentication identifier set more than once" msgstr "identifiant d'authentification configuré plus d'une fois" -#: libpq/auth.c:372 +#: libpq/auth.c:363 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "identifiant précédent : « %s » ; nouvel identifiant : « %s »" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "connexion authentifiée : identité=\"%s\" méthode=%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 "" "les certificats cert peuvent seulement être vérifiés si un emplacement de\n" "certificat racine est disponible" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "la connexion requiert un certificat client valide" -#: libpq/auth.c:462 libpq/auth.c:508 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "chiffrement GSS" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "chiffrement SSL" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "aucun chiffrement" #. 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 "" @@ -13277,40 +14746,40 @@ msgstr "" "utilisateur « %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 rejette la connexion pour l'hôte « %s », utilisateur « %s », base\n" "de données « %s », %s" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Adresse IP du client résolue en « %s », la recherche inverse correspond bien." -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Adresse IP du client résolue en « %s », la recherche inverse n'est pas vérifiée." -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Adresse IP du client résolue en « %s », la recherche inverse ne correspond pas." -#: libpq/auth.c:527 +#: libpq/auth.c:518 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "N'a pas pu traduire le nom d'hôte « %s » du client en adresse IP : %s." -#: libpq/auth.c:532 +#: libpq/auth.c:523 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "N'a pas pu résoudre l'adresse IP du client à partir du nom d'hôte : %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 "" @@ -13318,429 +14787,428 @@ msgstr "" "l'hôte « %s », utilisateur « %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 "" "aucune entrée dans pg_hba.conf pour l'hôte « %s », utilisateur « %s »,\n" "base de données « %s », %s" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "en attente du mot de passe, a reçu un type de message %d" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "taille du paquet du mot de passe invalide" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "mot de passe vide renvoyé par le client" -#: 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 "l'authentification MD5 n'est pas supportée quand « db_user_namespace » est activé" -#: libpq/auth.c:893 +#: libpq/auth.c:886 #, c-format msgid "could not generate random MD5 salt" msgstr "n'a pas pu générer le sel MD5 aléatoire" -#: libpq/auth.c:959 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "attendait une réponse SASL, a reçu le type de message %d" - -#: 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 "n'a pas pu configurer l'environnement : %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:971 #, c-format msgid "expected GSS response, got message type %d" msgstr "en attente d'une réponse GSS, a reçu un message de type %d" -#: libpq/auth.c:1184 +#: libpq/auth.c:1031 msgid "accepting GSS security context failed" msgstr "échec de l'acceptation du contexte de sécurité GSS" -#: libpq/auth.c:1225 +#: libpq/auth.c:1072 msgid "retrieving GSS user name failed" msgstr "échec lors de la récupération du nom de l'utilisateur avec GSS" -#: libpq/auth.c:1374 +#: libpq/auth.c:1221 msgid "could not acquire SSPI credentials" msgstr "n'a pas pu obtenir les pièces d'identité SSPI" -#: libpq/auth.c:1399 +#: libpq/auth.c:1246 #, 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:1477 +#: libpq/auth.c:1324 msgid "could not accept SSPI security context" msgstr "n'a pas pu accepter le contexte de sécurité SSPI" -#: libpq/auth.c:1539 +#: libpq/auth.c:1386 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:1678 libpq/auth.c:1697 +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format msgid "could not translate name" msgstr "n'a pas pu traduit le nom" -#: libpq/auth.c:1710 +#: libpq/auth.c:1557 #, c-format msgid "realm name too long" msgstr "nom du royaume trop long" -#: libpq/auth.c:1725 +#: libpq/auth.c:1572 #, c-format msgid "translated account name too long" msgstr "traduction du nom de compte trop longue" -#: libpq/auth.c:1906 +#: libpq/auth.c:1753 #, 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:1921 +#: libpq/auth.c:1768 #, 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:1933 +#: libpq/auth.c:1780 #, 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:1955 +#: libpq/auth.c:1802 #, 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:1972 +#: libpq/auth.c:1819 #, 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:1982 +#: libpq/auth.c:1829 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "réponse mal formatée du serveur Ident : « %s »" -#: libpq/auth.c:2035 +#: libpq/auth.c:1882 #, 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:2039 +#: libpq/auth.c:1886 #, c-format msgid "could not get peer credentials: %m" msgstr "n'a pas pu obtenir l'authentification de l'autre : %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1898 #, 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:2152 +#: libpq/auth.c:1999 #, c-format msgid "error from underlying PAM layer: %s" msgstr "erreur provenant de la couche PAM : %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2010 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "conversation PAM %d/\"%s\" non supportée" -#: libpq/auth.c:2223 +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "n'a pas pu créer l'authenticateur PAM : %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2081 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) a échoué : %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2113 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) a échoué : %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2125 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) a échoué : %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2138 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate a échoué : %s" -#: libpq/auth.c:2304 +#: libpq/auth.c:2151 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt a échoué : %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2162 #, c-format msgid "could not release PAM authenticator: %s" msgstr "n'a pas pu fermer l'authenticateur PAM : %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2242 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "n'a pas pu initialiser LDAP : code d'erreur %d" -#: libpq/auth.c:2432 +#: libpq/auth.c:2279 #, 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:2440 +#: libpq/auth.c:2287 #, 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:2442 +#: libpq/auth.c:2289 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Définit un nom de serveur LDAP explicitement." -#: libpq/auth.c:2494 +#: libpq/auth.c:2341 #, c-format msgid "could not initialize LDAP: %s" msgstr "n'a pas pu initialiser LDAP : %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2351 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps non supporté avec cette bibliothèque LDAP" -#: libpq/auth.c:2512 +#: libpq/auth.c:2359 #, c-format msgid "could not initialize LDAP: %m" msgstr "n'a pas pu initialiser LDAP : %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2369 #, 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:2562 +#: libpq/auth.c:2409 #, 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:2563 +#: libpq/auth.c:2410 #, 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:2579 +#: libpq/auth.c:2426 #, 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:2650 +#: libpq/auth.c:2497 #, 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:2657 +#: libpq/auth.c:2504 #, c-format msgid "LDAP server not specified" msgstr "serveur LDAP non précisé" -#: libpq/auth.c:2719 +#: libpq/auth.c:2566 #, 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:2736 +#: libpq/auth.c:2583 #, 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:2765 +#: libpq/auth.c:2612 #, 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:2779 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "l'utilisateur LDAP « %s » n'existe pas" -#: libpq/auth.c:2780 +#: libpq/auth.c:2627 #, 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:2784 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "l'utilisateur LDAP « %s » n'est pas unique" -#: libpq/auth.c:2785 +#: 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] "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:2805 +#: libpq/auth.c:2652 #, 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:2826 +#: libpq/auth.c:2673 #, 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:2857 +#: libpq/auth.c:2704 #, 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:2889 +#: libpq/auth.c:2736 #, c-format msgid "LDAP diagnostics: %s" msgstr "diagnostique LDAP: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2774 #, 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:2948 +#: libpq/auth.c:2795 #, 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:2971 +#: libpq/auth.c:2818 #, 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:2976 +#: libpq/auth.c:2823 #, 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:3078 +#: libpq/auth.c:2925 #, c-format msgid "RADIUS server not specified" msgstr "serveur RADIUS non précisé" -#: libpq/auth.c:3085 +#: libpq/auth.c:2932 #, c-format msgid "RADIUS secret not specified" msgstr "secret RADIUS non précisé" -#: libpq/auth.c:3099 +#: libpq/auth.c:2946 #, 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:3206 libpq/hba.c:2008 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, 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:3220 +#: libpq/auth.c:3067 #, 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:3254 -#, c-format -msgid "could not perform MD5 encryption of password" +#: libpq/auth.c:3104 +#, fuzzy, c-format +#| msgid "could not perform MD5 encryption of password" +msgid "could not perform MD5 encryption of password: %s" msgstr "n'a pas pu réaliser le chiffrement MD5 du mot de passe" -#: libpq/auth.c:3280 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "n'a pas pu créer le socket RADIUS : %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3153 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "n'a pas pu se lier à la socket RADIUS : %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3163 #, c-format msgid "could not send RADIUS packet: %m" msgstr "n'a pas pu transmettre le paquet RADIUS : %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, 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:3364 +#: libpq/auth.c:3216 #, 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:3394 +#: libpq/auth.c:3246 #, c-format msgid "could not read RADIUS response: %m" msgstr "n'a pas pu lire la réponse RADIUS : %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, 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:3420 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "réponse RADIUS de %s trop courte : %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3279 #, 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:3435 +#: libpq/auth.c:3287 #, 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:3460 -#, c-format -msgid "could not perform MD5 encryption of received packet" +#: libpq/auth.c:3312 +#, fuzzy, c-format +#| msgid "could not perform MD5 encryption of received packet" +msgid "could not perform MD5 encryption of received packet: %s" msgstr "n'a pas pu réaliser le chiffrement MD5 du paquet reçu" -#: libpq/auth.c:3469 +#: libpq/auth.c:3322 #, 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:3487 +#: libpq/auth.c:3340 #, 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: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 +#: 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" @@ -13790,12 +15258,15 @@ msgstr "n'a pas pu écrire le fichier serveur « %s » : %m" msgid "large object read request is too large" msgstr "la demande de lecture du Large Object est trop grande" -#: libpq/be-fsstubs.c:800 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 "la longueur demandée ne peut pas être négative" -#: 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 +#: 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" @@ -13880,27 +15351,27 @@ msgstr "n'a pas pu accepter le contexte de sécurité GSSAPI" msgid "GSSAPI size check error" msgstr "erreur de vérification de la taille GSSAPI" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "n'a pas pu créer le contexte SSL : %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 "n'a pas pu charger le fichier du certificat serveur « %s » : %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 "le fichier de clé privée « %s » ne peut pas être rechargé car il nécessaire une phrase de passe" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "n'a pas pu charger le fichier de clé privée « %s » : %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "check of private key failed: %s" msgstr "échec de la vérification de la clé privée : %s" @@ -13909,176 +15380,177 @@ msgstr "échec de la vérification de la clé privée : %s" # guc_name, # GetConfigOption(guc_name, false, false)))); #. 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 "le paramètre %s ne supporte pas la valeur %s dans cette installation" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "n'a pas pu mettre en place la version minimum de protocole SSL" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "n'a pas pu mettre en place la version maximum de protocole SSL" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "n'a pas pu configurer l'intervalle de versions pour le protocole SSL" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "« %s » ne peut pas être supérieur à « %s »" -#: 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 "n'a pas pu configurer la liste des algorithmes de chiffrement (pas d'algorithmes valides disponibles)" -#: libpq/be-secure-openssl.c:295 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "n'a pas pu charger le fichier du certificat racine « %s » : %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 "n'a pas pu charger le fichier de liste de révocation des certificats SSL (« %s ») : %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 "n'a pas pu charger le répertoire de liste de révocation des certificats SSL « %s » : %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 "n'a pas pu charger le fichier de liste de révocation des certificats SSL (« %s ») ou répertoire %s : %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 "n'a pas pu initialiser la connexion SSL : contexte SSL non configuré" -#: libpq/be-secure-openssl.c:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "n'a pas pu initialiser la connexion SSL : %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "n'a pas pu créer le socket SSL : %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:499 #, c-format msgid "could not accept SSL connection: %m" msgstr "n'a pas pu accepter la connexion SSL : %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 "n'a pas pu accepter la connexion SSL : fin de fichier détecté" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:542 #, c-format msgid "could not accept SSL connection: %s" msgstr "n'a pas pu accepter la connexion SSL : %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 "Ceci pourrait indiquer que le client ne supporte pas la version du protocole SSL entre %s et %s." -#: 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:750 +#: libpq/be-secure-openssl.c:814 #, c-format msgid "unrecognized SSL error code: %d" msgstr "code d'erreur SSL inconnu : %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 "le nom commun du certificat SSL contient des NULL" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:653 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "le nom distingué du certificat SSL contient des NULL" -#: libpq/be-secure-openssl.c:723 libpq/be-secure-openssl.c:782 +#: libpq/be-secure-openssl.c:739 libpq/be-secure-openssl.c:798 #, c-format msgid "SSL error: %s" msgstr "erreur SSL : %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:980 #, 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:976 +#: libpq/be-secure-openssl.c:992 #, 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:986 +#: libpq/be-secure-openssl.c:1002 #, c-format msgid "invalid DH parameters: %s" msgstr "paramètres DH invalides : %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1011 #, 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:1004 +#: libpq/be-secure-openssl.c:1020 #, 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:1165 +#: libpq/be-secure-openssl.c:1181 #, 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:1173 +#: libpq/be-secure-openssl.c:1189 #, 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:1200 +#: libpq/be-secure-openssl.c:1216 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH : nome de courbe non reconnu : %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1225 #, c-format msgid "ECDH: could not create key" msgstr "ECDH : n'a pas pu créer la clé" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1253 msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1257 #, c-format msgid "SSL error code %lu" msgstr "code d'erreur SSL %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1416 #, c-format msgid "could not create BIO" msgstr "n'a pas pu créer BIO" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1426 #, 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:1418 +#: libpq/be-secure-openssl.c:1434 #, 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" @@ -14103,400 +15575,401 @@ msgstr "L'utilisateur « %s » n'a pas de mot de passe affecté." msgid "User \"%s\" has an expired password." msgstr "L'utilisateur « %s » a un mot de passe expiré." -#: libpq/crypt.c:179 +#: libpq/crypt.c:181 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "L'utilisateur « %s » a un mot de passe qui ne peut pas être utilisé avec une authentification 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 "Le mot de passe ne correspond pas pour l'utilisateur %s." -#: libpq/crypt.c:287 +#: libpq/crypt.c:283 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Le mot de passe de l'utilisateur « %s » est dans un format non reconnu." -#: libpq/hba.c:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "jeton du fichier d'authentification trop long, ignore : « %s »" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "" "n'a pas pu ouvrir le fichier d'authentification secondaire « @%s » comme\n" "« %s » : %m" -#: libpq/hba.c:859 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" msgstr "erreur lors de l'énumération des interfaces réseau : %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 "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: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 +#: 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:228 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "ligne %d du fichier de configuration « %s »" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "la méthode d'authentification « %s » requiert un argument « %s » pour être mise en place" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "entrée manquante dans le fichier « %s » à la fin de la ligne %d" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "plusieurs valeurs dans le champ ident" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "plusieurs valeurs indiquées pour le type de connexion" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Indiquez uniquement un type de connexion par ligne." -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "les connexions locales ne sont pas supportées dans cette installation" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "l'enregistrement hostssl ne peut pas correspondre car SSL est désactivé" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Configurez ssl = on dans le 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 "l'enregistrement hostssl ne peut pas correspondre parce que SSL n'est pas supporté par cette installation" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "Compilez avec --with-ssl pour utiliser les connexions SSL." - -#: libpq/hba.c:1054 +#: libpq/hba.c:1024 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "l'enregistrement hostgssenc ne peut pas correspondre parce que GSSAPI n'est pas supporté par cette installation" -#: libpq/hba.c:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Compilez avec --with-gssapi pour utiliser les connexions GSSAPI." - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "type de connexion « %s » invalide" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "fin de ligne avant la spécification de la base de données" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "fin de ligne avant la spécification du rôle" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "fin de ligne avant la spécification de l'adresse IP" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "plusieurs valeurs indiquées pour l'adresse hôte" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Indiquez un sous-réseau par ligne." -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "adresse IP « %s » invalide : %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "spécifier le nom d'hôte et le masque CIDR n'est pas valide : « %s »" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "masque CIDR invalide dans l'adresse « %s »" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "fin de ligne avant la spécification du masque réseau" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Indiquez un sous-réseau en notation CIDR ou donnez un masque réseau séparé." -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "plusieurs valeurs indiquées pour le masque réseau" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "masque IP « %s » invalide : %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "l'adresse IP et le masque ne correspondent pas" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "fin de ligne avant la méthode d'authentification" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "plusieurs valeurs indiquées pour le type d'authentification" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Indiquez uniquement un type d'authentification par ligne." -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "méthode d'authentification « %s » invalide" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "" "méthode d'authentification « %s » invalide : non supportée sur cette\n" "installation" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "" "l'authentification gssapi n'est pas supportée sur les connexions locales par\n" "socket" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "" "l'authentification peer est seulement supportée sur les connexions locales par\n" "socket" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "l'authentification cert est seulement supportée sur les connexions hostssl" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "l'option d'authentification n'est pas dans le format nom=valeur : %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 "ne peut pas utiliser ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchattribute ou ldapurl avec ldapprefix" -#: libpq/hba.c:1577 +#: libpq/hba.c:1546 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "la méthode d'authentification « ldap » requiert un argument « ldapbasedn », « ldapprefix » ou « ldapsuffix » pour être mise en place" -#: libpq/hba.c:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ne peut pas utiliser ldapsearchattribute avec ldapsearchfilter" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "la liste de serveurs RADIUS ne peut pas être vide" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "la liste des secrets RADIUS ne peut pas être vide" -#: 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 "le nombre de secrets RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: 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 "le nombre de ports RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: 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 "le nombre d'identifiants RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: libpq/hba.c:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi et cert" -#: libpq/hba.c:1730 +#: libpq/hba.c:1699 #, 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:1747 +#: libpq/hba.c:1716 #, 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:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "valeur invalide pour clientcert : « %s »" -#: libpq/hba.c:1772 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname peut seulement être configuré pour les lignes « hostssl »" -#: libpq/hba.c:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "valeur invalide pour clientname : « %s »" -#: libpq/hba.c:1825 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "n'a pas pu analyser l'URL LDAP « %s » : %s" -#: libpq/hba.c:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "méthode URL LDAP non supporté : %s" -#: libpq/hba.c:1860 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URLs LDAP non supportées sur cette plateforme" -#: libpq/hba.c:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "valeur ldapscheme invalide : « %s »" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "numéro de port LDAP invalide : « %s »" -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi et sspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, 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:2037 +#: libpq/hba.c:2005 #, 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:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "numéro de port RADIUS invalide : « %s »" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, 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:2095 +#: libpq/hba.c:2063 #, 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:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "nom d'option de l'authentification inconnu : « %s »" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "le fichier de configuration « %s » ne contient aucun enregistrement" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "expression rationnelle invalide « %s » : %s" -#: libpq/hba.c:2884 +#: libpq/hba.c:2437 #, 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:2903 +#: libpq/hba.c:2456 #, 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:2999 +#: libpq/hba.c:2552 #, 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:3019 +#: libpq/hba.c:2572 #, 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:3052 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier usermap « %s » : %m" @@ -14610,7 +16083,10 @@ 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: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 +#: 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 "échec de %s(%s) : %m" @@ -14625,7 +16101,7 @@ 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:1173 tcop/postgres.c:4316 +#: libpq/pqcomm.c:1173 tcop/postgres.c:4373 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "arrêt de la connexion à cause d'une perte de synchronisation du protocole" @@ -14668,17 +16144,13 @@ msgstr "configurer le temps d'attente du keepalive n'est pas supporté" msgid "%s(%s) not supported" msgstr "%s(%s) non supporté" -#: libpq/pqcomm.c:1968 -#, c-format -msgid "could not poll socket: %m" -msgstr "n'a pas pu interroger la socket : %m" - #: libpq/pqformat.c:406 #, c-format 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:1482 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" @@ -14693,12 +16165,12 @@ msgstr "chaîne invalide dans le message" msgid "invalid message format" msgstr "format du message invalide" -#: main/main.c:245 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s : WSAStartup a échoué : %d\n" -#: main/main.c:309 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14707,7 +16179,7 @@ msgstr "" "%s est le serveur PostgreSQL.\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14718,107 +16190,107 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: main/main.c:311 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: main/main.c:312 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS nombre de blocs dans le cache disque de PostgreSQL\n" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NOM=VALEUR configure un paramètre d'exécution\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 NOM affiche la valeur d'un paramètre en exécution, puis quitte\n" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 niveau de débogage\n" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D RÉP_DONNÉES répertoire de la base de données\n" -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e utilise le format européen de saisie des dates (DMY)\n" -#: main/main.c:318 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F désactive 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 HÔTE nom d'hôte ou adresse IP à écouter\n" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i active les connexions TCP/IP\n" -#: main/main.c:321 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k RÉPERTOIRE emplacement des sockets de domaine Unix\n" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l active les connexions 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 nombre maximum de connexions simultanées\n" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT numéro du port à écouter\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s affiche les statistiques après chaque requête\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 WORK-MEM configure la mémoire pour les tris (en ko)\n" -#: main/main.c:329 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version et quitte\n" -#: main/main.c:330 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NOM=VALEUR configure un paramètre d'exécution\n" -#: main/main.c:331 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config décrit les paramètres de configuration, puis quitte\n" -#: main/main.c:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide et quitte\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14827,48 +16299,49 @@ msgstr "" "\n" "Options pour le développeur :\n" -#: main/main.c:335 -#, c-format +#: main/main.c:376 +#, fuzzy, c-format +#| msgid " -f s|i|n|m|h forbid use of some plan types\n" msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|o|b|t|n|m|h interdit l'utilisation de certains types de plan\n" +msgstr " -f s|i|n|m|h interdit l'utilisation de certains types de plan\n" -#: main/main.c:336 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr "" " -n ne réinitialise pas la mémoire partagée après un arrêt\n" " brutal\n" -#: main/main.c:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O autorise les modifications de structure des tables systèmes\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P désactive les index systèmes\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 affiche les horodatages pour chaque requête\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 envoie SIGSTOP à tous les processus serveur si l'un d'entre\n" " eux meurt\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 NUM attends NUM secondes pour permettre l'attache d'un\n" " débogueur\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -14877,41 +16350,41 @@ msgstr "" "\n" "Options pour le mode mono-utilisateur :\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" " --single sélectionne le mode mono-utilisateur (doit être le premier\n" " argument)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " BASE nom de la base (par défaut, le même que l'utilisateur)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 surcharge le niveau de débogage\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E affiche la requête avant de l'exécuter\n" -#: main/main.c:348 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr "" " -j n'utilise pas le retour à la ligne comme délimiteur de\n" " requête\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 FICHIER envoie stdout et stderr dans le fichier indiqué\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -14920,26 +16393,29 @@ msgstr "" "\n" "Options pour le mode « bootstrapping » :\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr "" " --boot sélectionne le mode « bootstrapping » (doit être le premier\n" " argument)\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 sélectionne le mode mono-utilisateur (doit être le premier\n" +" argument)\n" + +#: main/main.c:395 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr "" " BASE nom de la base (argument obligatoire dans le mode\n" " « bootstrapping »)\n" -#: main/main.c:355 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM utilisation interne\n" - -#: main/main.c:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -14956,12 +16432,12 @@ msgstr "" "\n" "Rapportez les bogues à <%s>.\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -14974,12 +16450,12 @@ msgstr "" "tout problème possible de sécurité sur le serveur. Voir la documentation pour\n" "plus d'informations sur le lancement propre du serveur.\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s : les identifiants réel et effectif de l'utilisateur doivent correspondre\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15003,12 +16479,15 @@ 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 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, 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: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:592 +#: 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:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, 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" @@ -15030,6 +16509,13 @@ msgstr "" "FULL JOIN est supporté seulement avec les conditions de jointures MERGE et de\n" "jointures HASH JOIN" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "ne peut pas modifier la relation « %s »" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -15037,55 +16523,52 @@ 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:1316 parser/analyze.c:1709 parser/analyze.c:1965 parser/analyze.c:3144 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 +#: parser/analyze.c:3190 #, 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:1973 optimizer/plan/planner.c:3629 +#: optimizer/plan/planner.c:2045 optimizer/plan/planner.c:3702 #, c-format msgid "could not implement GROUP BY" msgstr "n'a pas pu implanter GROUP BY" -#: optimizer/plan/planner.c:1974 optimizer/plan/planner.c:3630 optimizer/plan/planner.c:4387 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2046 optimizer/plan/planner.c:3703 +#: optimizer/plan/planner.c:4346 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:4386 +#: optimizer/plan/planner.c:4345 #, c-format msgid "could not implement DISTINCT" msgstr "n'a pas pu implanter DISTINCT" -#: optimizer/plan/planner.c:5234 +#: optimizer/plan/planner.c:5466 #, c-format msgid "could not implement window PARTITION BY" msgstr "n'a pas pu implanter PARTITION BY de window" -#: optimizer/plan/planner.c:5235 +#: optimizer/plan/planner.c:5467 #, 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:5239 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window ORDER BY" msgstr "n'a pas pu implanter ORDER BY dans le window" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5472 #, 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:516 -#, c-format -msgid "too many range table entries" -msgstr "trop d'enregistrements dans la table range" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -15102,57 +16585,58 @@ 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:4729 +#: optimizer/util/clauses.c:4777 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "fonction SQL « %s » durant « inlining »" -#: optimizer/util/plancat.c:140 -#, c-format +#: optimizer/util/plancat.c:142 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" msgid "cannot open relation \"%s\"" -msgstr "ne peut pas ouvrir la relation « %s »" +msgstr "ne peut pas modifier la relation « %s »" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "ne peut pas accéder à des tables temporaires et non tracées lors de la restauration" -#: optimizer/util/plancat.c:688 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "les spécifications d'inférence d'index unique pour une ligne entière ne sont pas supportées" -#: optimizer/util/plancat.c:705 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "la contrainte de la clause ON CONFLICT n'a pas d'index associé" -#: optimizer/util/plancat.c:755 +#: optimizer/util/plancat.c:758 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE non supporté avec les contraintes d'exclusion" -#: optimizer/util/plancat.c:860 +#: optimizer/util/plancat.c:863 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "il n'existe aucune contrainte unique ou contrainte d'exclusion correspondant à la spécification ON CONFLICT" -#: parser/analyze.c:775 parser/analyze.c:1489 +#: parser/analyze.c:818 parser/analyze.c:1532 #, c-format msgid "VALUES lists must all be the same length" msgstr "les listes VALUES doivent être toutes de la même longueur" -#: parser/analyze.c:976 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT a plus d'expressions que les colonnes cibles" -#: parser/analyze.c:994 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT a plus de colonnes cibles que d'expressions" -#: parser/analyze.c:998 +#: parser/analyze.c:1041 #, 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 "" @@ -15160,201 +16644,201 @@ msgstr "" "de colonnes que celui attendu par INSERT. Auriez-vous utilisé des parenthèses\n" "supplémentaires ?" -#: parser/analyze.c:1297 parser/analyze.c:1682 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, c-format 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:1612 parser/analyze.c:3355 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s ne peut pas être appliqué à VALUES" -#: parser/analyze.c:1848 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "clause UNION/INTERSECT/EXCEPT ORDER BY invalide" -#: parser/analyze.c:1849 +#: parser/analyze.c:1892 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "Seuls les noms de colonnes résultats peuvent être utilisés, pas les\n" "expressions et les fonctions." -#: parser/analyze.c:1850 +#: parser/analyze.c:1893 #, c-format 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:1955 +#: parser/analyze.c:1998 #, 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:2027 +#: parser/analyze.c:2070 #, 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:2114 +#: parser/analyze.c:2157 #, 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:2515 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING doit avoir au moins une colonne" -#: parser/analyze.c:2618 +#: parser/analyze.c:2664 #, 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:2679 +#: parser/analyze.c:2725 #, 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:2803 parser/analyze.c:2811 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "ne peut pas spécifier à la fois %s et %s" -#: parser/analyze.c:2831 +#: parser/analyze.c:2877 #, 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:2839 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s n'est pas supporté" -#: parser/analyze.c:2842 +#: parser/analyze.c:2888 #, 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:2850 +#: parser/analyze.c:2896 #, 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:2861 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s n'est pas valide" -#: parser/analyze.c:2864 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Les curseurs insensibles doivent être en lecture seule (READ ONLY)." -#: parser/analyze.c:2930 +#: parser/analyze.c:2976 #, 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:2940 +#: parser/analyze.c:2986 #, 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:2950 +#: parser/analyze.c:2996 #, 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:2962 +#: parser/analyze.c:3008 #, 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:3151 +#: parser/analyze.c:3197 #, 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:3158 +#: parser/analyze.c:3204 #, 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:3165 +#: parser/analyze.c:3211 #, 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:3172 +#: parser/analyze.c:3218 #, 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:3179 +#: parser/analyze.c:3225 #, 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:3186 +#: parser/analyze.c:3232 #, 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:3278 +#: parser/analyze.c:3324 #, 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:3328 +#: parser/analyze.c:3374 #, 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:3337 +#: parser/analyze.c:3383 #, 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:3346 +#: parser/analyze.c:3392 #, 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:3364 +#: parser/analyze.c:3410 #, 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:3373 +#: parser/analyze.c:3419 #, 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:3393 +#: parser/analyze.c:3439 #, 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" @@ -15430,539 +16914,560 @@ msgstr "les fonctions d'agrégat ne sont pas autorisées dans le GROUPS d'un fen msgid "grouping operations are not allowed in window GROUPS" msgstr "les fonctions de regroupement ne sont pas autorisés dans le GROUPS de fenêtrage" -#: 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 "les fonctions d'agrégat ne sont pas autorisées dans les conditions WHEN des triggers" + +#: 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 "les fonctions de regroupement ne sont pas autorisés dans les conditions WHEN des triggers" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les contraintes CHECK" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "les fonctions de regroupement ne sont pas autorisés dans les contraintes CHECK" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions par défaut" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions par défaut" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions d'index" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions d'index" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les prédicats d'index" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "les fonctions de regroupement ne sont pas autorisés dans les prédicats d'index" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:497 msgid "aggregate functions are not allowed in statistics expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:499 msgid "grouping operations are not allowed in statistics expressions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de transformation" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions de transformation" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les paramètres d'EXECUTE" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "les fonctions de regroupement ne sont pas autorisés dans les paramètres d'EXECUTE" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les conditions WHEN des triggers" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:525 msgid "aggregate functions are not allowed in partition bound" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les limites de partition" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:527 msgid "grouping operations are not allowed in partition bound" msgstr "les opérations de regroupement ne sont pas autorisées dans les limites de partition" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "les opérations de regroupement ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:540 msgid "aggregate functions are not allowed in column generation expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de génération de colonne" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:542 msgid "grouping operations are not allowed in column generation expressions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les expressions de génération de colonne" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les arguments de CALL" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "les fonctions de regroupement ne sont pas autorisés dans les arguments de CALL" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:556 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions de COPY FROM WHERE" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:558 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les conditions WHERE d'un COPY FROM" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:585 parser/parse_clause.c:1836 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "les fonctions d'agrégat ne sont pas autorisées dans %s" #. 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 "les fonctions de regroupement ne sont pas autorisés dans %s" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:689 #, 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:760 +#: parser/parse_agg.c:767 #, 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:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 parser/parse_func.c:883 +#: parser/parse_agg.c:768 parser/parse_expr.c:1674 parser/parse_expr.c:2156 +#: 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:766 +#: parser/parse_agg.c:773 #, 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:845 +#: parser/parse_agg.c:852 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:852 +#: parser/parse_agg.c:859 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:858 +#: parser/parse_agg.c:865 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:871 +#: parser/parse_agg.c:878 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:903 +#: parser/parse_agg.c:889 +#, fuzzy +#| msgid "window functions are not allowed in trigger WHEN conditions" +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "les fonctions de fenêtrage ne sont pas autorisés dans les conditions WHEN des triggers" + +#: parser/parse_agg.c:913 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:907 +#: parser/parse_agg.c:917 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:910 +#: parser/parse_agg.c:920 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:913 +#: parser/parse_agg.c:923 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:916 +#: parser/parse_agg.c:926 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:919 +#: parser/parse_agg.c:929 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:922 +#: parser/parse_agg.c:932 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:925 +#: parser/parse_agg.c:935 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:928 +#: parser/parse_agg.c:938 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:931 +#: parser/parse_agg.c:941 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:934 +#: parser/parse_agg.c:944 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:937 +#: parser/parse_agg.c:947 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:940 +#: parser/parse_agg.c:950 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:973 parser/parse_clause.c:1845 #, 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:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1007 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "le window « %s » n'existe pas" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1091 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "trop d'ensembles de regroupement présents (4096 maximum)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1231 #, 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:1414 +#: parser/parse_agg.c:1424 #, 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:1417 +#: parser/parse_agg.c:1427 #, 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:1422 +#: parser/parse_agg.c:1432 #, 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:1586 +#: parser/parse_agg.c:1596 #, 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" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "la relation « %s » ne peut pas être la cible d'une instruction modifiée" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "les fonctions renvoyant des ensembles doivent apparaître au niveau haut d'un FROM" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "plusieurs listes de définition de colonnes ne sont pas autorisées pour la même fonction" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:645 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() avec plusieurs fonctions ne peut pas avoir une liste de définitions de colonnes" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:646 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Placer une liste de définitions de colonnes séparée pour chaque fonction à l'intérieur de ROWS FROM()." -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() avec plusieurs arguments ne peut pas avoir de liste de définition de colonnes" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:653 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Utiliser des appels séparés UNNEST() à l'intérieur de ROWS FROM(), et attacher une liste de définition des colonnes pour chaque." -#: parser/parse_clause.c:658 +#: parser/parse_clause.c:660 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY ne peut pas être utilisé avec une liste de définitions de colonnes" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Placez la liste de définitions des colonnes dans ROWS FROM()." -#: parser/parse_clause.c:759 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "seule une colonne FOR ORDINALITY est autorisée" -#: parser/parse_clause.c:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "le nom de colonne « %s » n'est pas unique" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "l'espace de nom « %s » n'est pas unique" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "seul un espace de nom par défaut est autorisé" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "la méthode d'échantillonage %s n'existe pas" -#: parser/parse_clause.c:954 +#: 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] "la méthode d'échantillonage %s requiert %d argument, et non pas %d" msgstr[1] "la méthode d'échantillonage %s requiert %d arguments, et non pas %d" -#: parser/parse_clause.c:988 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "la méthode d'échantillonage %s ne supporte pas REPEATABLE" -#: parser/parse_clause.c:1137 +#: parser/parse_clause.c:1139 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "la clause TABLESAMPLE n'est applicable qu'aux tables et vues matérialisées" -#: parser/parse_clause.c:1327 +#: parser/parse_clause.c:1329 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "le nom de la colonne « %s » apparaît plus d'une fois dans la clause USING" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "" "le nom commun de la colonne « %s » apparaît plus d'une fois dans la table de\n" "gauche" -#: parser/parse_clause.c:1351 +#: parser/parse_clause.c:1353 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "" "la colonne « %s » spécifiée dans la clause USING n'existe pas dans la table\n" "de gauche" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "" "le nom commun de la colonne « %s » apparaît plus d'une fois dans la table de\n" " droite" -#: parser/parse_clause.c:1375 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "" "la colonne « %s » spécifiée dans la clause USING n'existe pas dans la table\n" "de droite" -#: parser/parse_clause.c:1779 +#: parser/parse_clause.c:1781 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "un nombre de lignes ne peut pas être NULL dans une clause FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1804 +#: parser/parse_clause.c:1806 #, c-format msgid "argument of %s must not contain variables" msgstr "l'argument de « %s » ne doit pas contenir de variables" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1969 +#: parser/parse_clause.c:1971 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s « %s » est ambigu" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1998 +#: parser/parse_clause.c:1999 #, c-format msgid "non-integer constant in %s" msgstr "constante non entière dans %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "%s, à la position %d, n'est pas dans la liste SELECT" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE est limité à 12 éléments" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "le window « %s » est déjà définie" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "n'a pas pu surcharger la clause PARTITION BY de window « %s »" -#: parser/parse_clause.c:2738 +#: parser/parse_clause.c:2739 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "n'a pas pu surcharger la clause ORDER BY de window « %s »" -#: parser/parse_clause.c:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "ne peut pas copier la fenêtre « %s » car il dispose d'une clause de portée" -#: parser/parse_clause.c:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Omettre les parenthèses dans cette clause OVER." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE avec offset PRECEDING/FOLLOWING nécessite exactement une colonne ORDER BY" -#: parser/parse_clause.c:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "le mode GROUPS nécessite une clause ORDER BY" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "" "dans un agrégat avec DISTINCT, les expressions ORDER BY doivent apparaître\n" "dans la liste d'argument" -#: parser/parse_clause.c:2890 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "pour SELECT DISTINCT, ORDER BY, les expressions doivent apparaître dans la\n" "liste SELECT" -#: parser/parse_clause.c:2922 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "un agrégat avec DISTINCT doit avoir au moins un argument" -#: parser/parse_clause.c:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT doit avoir au moins une colonne" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "les expressions SELECT DISTINCT ON doivent correspondre aux expressions ORDER BY initiales" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3101 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC n'est pas autorisé avec la clause ON CONFLICT" -#: parser/parse_clause.c:3105 +#: parser/parse_clause.c:3107 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST n'est pas autorisé avec la clause ON CONFLICT" -#: parser/parse_clause.c:3184 +#: parser/parse_clause.c:3186 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE requiert une spécification d'inférence ou un nom de contrainte" -#: parser/parse_clause.c:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Par exemple, ON CONFLICT (nom_colonne)" -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT n'est pas supporté avec les catalogues systèmes" -#: parser/parse_clause.c:3204 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT n'est pas supporté sur la table « %s » utilisée comme une table catalogue" -#: parser/parse_clause.c:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "l'opérateur %s n'est pas un opérateur de tri valide" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "" "Les opérateurs de tri doivent être les membres « < » ou « > » des familles\n" "d'opérateurs btree." -#: parser/parse_clause.c:3647 +#: parser/parse_clause.c:3649 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE avec offset PRECEDING/FOLLOWING n'est pas supporté pour le type de collone %s" -#: parser/parse_clause.c:3653 +#: parser/parse_clause.c:3655 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE avec offset PRECEDING/FOLLOWING n'est pas supporté pour le type de colonne %s et le type d'ossfet %s" -#: parser/parse_clause.c:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Transtypez la valeur d'offset vers un type approprié." -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE avec offset PRECEDING/FOLLOWING a de multiples interprétations pour le type de colonne %s et le type d'offset %s" -#: parser/parse_clause.c:3664 +#: parser/parse_clause.c:3666 #, c-format 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: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:2662 parser/parse_target.c:994 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "ne peut pas convertir le type %s en %s" @@ -16013,22 +17518,27 @@ msgstr "les types d'argument %s et %s ne se correspondent pas" 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: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 +#: 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:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:523 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:601 #, 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:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:537 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:615 #, 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:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, 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" @@ -16038,7 +17548,8 @@ msgstr "l'argument déclaré %s n'est pas un type multirange mais est du type %s 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:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: 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" @@ -16065,7 +17576,9 @@ msgstr "le type déclaré anyenum n'est pas un type enum : %s" 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 +#: 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" @@ -16109,17 +17622,19 @@ msgstr "Un résultat de type %s requiert au moins une entrée de type anycompati 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." -#: parser/parse_collate.c:228 parser/parse_collate.c:475 parser/parse_collate.c:1004 +#: parser/parse_collate.c:228 parser/parse_collate.c:475 +#: parser/parse_collate.c:1005 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "le collationnement ne correspond pas aux collationnements implicites « %s » et « %s »" -#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:1007 +#: parser/parse_collate.c:231 parser/parse_collate.c:478 +#: parser/parse_collate.c:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Vous pouvez choisir le collationnement en appliquant la clause COLLATE à une ou aux deux expressions." -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "le collationnement ne correspond pas aux collationnements explicites « %s » et « %s »" @@ -16159,377 +17674,387 @@ msgstr "" "la référence récursive à la requête « %s » ne doit pas apparaître à\n" "l'intérieur d'EXCEPT" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, fuzzy, c-format +#| msgid "\"EEEE\" not supported for input" +msgid "MERGE not supported in WITH query" +msgstr "« EEEE » non supporté en entrée" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "le nom de la requête WITH « %s » est spécifié plus d'une fois" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "n'a pas pu identifier un opérateur d'inégalité pour le type %s" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "la clause WITH contenant une instruction de modification de données doit être au plus haut niveau" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "" "dans la requête récursive « %s », la colonne %d a le type %s dans le terme non\n" "récursif mais le type global %s" -#: parser/parse_cte.c:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Convertissez la sortie du terme non récursif dans le bon type." -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "requête récursive « %s » : la colonne %d a le collationnement « %s » dans un terme non récursifet un collationnement « %s » global" -#: parser/parse_cte.c:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Utilisez la clause COLLATE pour configurer le collationnement du terme non récursif." -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "la requête WITH n'est pas récursive" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "avec une clause SEARCH ou CYCLE, le côté gauche de l'UNION doit être un SELECT" -#: parser/parse_cte.c:455 +#: parser/parse_cte.c:462 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "avec une clause SEARCH ou CYCLE, le côté droit de l'UNION doit être un SELECT" -#: parser/parse_cte.c:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "colonne de recherche « %s » non présente dans la liste des colonnes de la requête WITH" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "la colonne de recherche « %s » est spécifiée plus d'une fois" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "nom de colonne « %s » de la séquence de recherche déjà utilisé dans la liste des colonnes de la requête WITH" -#: parser/parse_cte.c:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "la colonne cycle « %s » n'est pas dans la liste de colonne de la requête WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "la colonne cycle « %s » est spécifiée plus d'une fois" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "nom de colonne « %s » de marque du cycle déjà utilisé dans la liste des colonnes de la requête WITH" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "nom de colonne « %s » de chemin du cycle déjà utilisé dans la liste des colonnes de la requête WITH" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "le nom de colonne de marque du cycle est identique au nom de colonne de chemin du cycle" -#: parser/parse_cte.c:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "le nom de la colonne de séquence de recherche est identique au nom de la colonne de marque du cycle" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "le nom de la colonne de séquence de recherche est identique au nom de la colonne de chemin du cycle" -#: parser/parse_cte.c:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "la requête WITH « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "la récursion mutuelle entre des éléments WITH n'est pas implantée" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "la requête récursive « %s » ne doit pas contenir des instructions de modification de données" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "" "la requête récursive « %s » n'a pas la forme terme-non-récursive UNION [ALL]\n" "terme-récursive" -#: parser/parse_cte.c:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY dans une requête récursive n'est pas implanté" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET dans une requête récursive n'est pas implémenté" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT dans une requête récursive n'est pas implémenté" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE dans une requête récursive n'est pas implémenté" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "la référence récursive à la requête « %s » ne doit pas apparaître plus d'une fois" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT interdit dans ce contexte" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "la colonne %s.%s n'existe pas" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "colonne « %s » introuvable pour le type de données %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "n'a pas pu identifier la colonne « %s » dans le type de données de l'enregistrement" -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:359 #, c-format 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:739 +#: parser/parse_expr.c:390 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ée ici" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "ne peut pas utiliser une référence de colonne dans l'expression par défaut" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 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:1234 +#: parser/parse_expr.c:784 parser/parse_relation.c:818 +#: parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" 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 +#: parser/parse_expr.c:840 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" -#: parser/parse_expr.c:1044 +#: parser/parse_expr.c:1040 #, c-format msgid "NULLIF requires = operator to yield boolean" 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:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s ne doit pas renvoyer un ensemble" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, 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:1481 +#: parser/parse_expr.c:1477 #, 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:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "les fonctions renvoyant un ensemble ne sont pas autorisées dans %s" -#: parser/parse_expr.c:1738 +#: parser/parse_expr.c:1735 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:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "ne peut pas utiliser de sous-requête dans une expression DEFAULT" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 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:1748 +#: parser/parse_expr.c:1745 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:1751 +#: parser/parse_expr.c:1748 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:1754 +#: parser/parse_expr.c:1751 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:1757 +#: parser/parse_expr.c:1754 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:1760 +#: parser/parse_expr.c:1757 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:1763 +#: parser/parse_expr.c:1760 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:1766 +#: parser/parse_expr.c:1763 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:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "ne peut pas utiliser de sous-requête dans l'argument CALL" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 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:1775 +#: parser/parse_expr.c:1772 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:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "la sous-requête doit renvoyer une seule colonne" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "la sous-requête a trop de colonnes" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "la sous-requête n'a pas assez de colonnes" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, 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:2001 +#: parser/parse_expr.c:1998 #, 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:2015 +#: parser/parse_expr.c:2012 #, 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:2098 -#, c-format +#: parser/parse_expr.c:2095 +#, fuzzy, c-format +#| msgid "target lists can have at most %d entries" msgid "ROW expressions can have at most %d entries" -msgstr "les expressions ROW peuvent avoir au plus %d entrées" +msgstr "les listes cibles peuvent avoir au plus %d colonnes" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, 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:2304 +#: parser/parse_expr.c:2301 #, 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:2319 +#: parser/parse_expr.c:2316 #, 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:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "ne peut pas convertir le résultat XMLSERIALIZE en %s" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, 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:2745 +#: parser/parse_expr.c:2742 #, 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:2770 +#: parser/parse_expr.c:2767 #, 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:2777 +#: parser/parse_expr.c:2774 #, 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:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, 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:2838 +#: parser/parse_expr.c:2835 #, 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:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Il existe de nombreus candidats également plausibles." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM requiert que l'opérateur = retourne une valeur de type booléen" @@ -16830,59 +18355,93 @@ msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans le msgid "set-returning functions are not allowed in window definitions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les définitions de fenêtres" -#: parser/parse_func.c:2616 +#: 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 "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les conditions WHEN des triggers" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les contraintes CHECK" -#: parser/parse_func.c:2620 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions par défaut" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions d'index" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les prédicats d'index" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions de transformation" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les paramètres d'EXECUTE" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les limites de partition" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les arguments de CALL" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les conditions WHERE d'un COPY FROM" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les expressions de génération de colonne" -#: parser/parse_node.c:87 +#: 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 n'est pas supporté pour ce type de table" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "clause WHEN non atteignable spécifiée après la clause WHEN sans condition" + +#: parser/parse_merge.c:191 +#, fuzzy, c-format +#| msgid "LIKE is not supported for creating foreign tables" +msgid "MERGE is not supported for relations with rules." +msgstr "LIKE n'est pas supporté pour la création de tables distantes" + +#: parser/parse_merge.c:208 +#, fuzzy, c-format +#| msgid "table name \"%s\" specified more than once" +msgid "name \"%s\" specified more than once" +msgstr "le nom de la table « %s » est spécifié plus d'une fois" + +#: parser/parse_merge.c:210 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "Le nom est utilisé à la fois comme table cible et source de données du MERGE." + +#: parser/parse_node.c:86 #, c-format msgid "target lists can have at most %d entries" msgstr "les listes cibles peuvent avoir au plus %d colonnes" @@ -16892,7 +18451,8 @@ msgstr "les listes cibles peuvent avoir au plus %d colonnes" msgid "postfix operators are not supported" msgstr "les opérateurs postfixes ne sont pas supportés" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 utils/adt/regproc.c:723 +#: 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 "l'opérateur n'existe pas : %s" @@ -16958,6 +18518,11 @@ msgstr "op ANY/ALL (tableau) requiert que l'opérateur ne renvoie pas un ensembl msgid "inconsistent types deduced for parameter $%d" msgstr "types incohérents déduit pour le paramètre $%d" +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "n'a pas pu déterminer le type de données du paramètre $%d" + #: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" @@ -16973,12 +18538,12 @@ msgstr "la référence à la table %u est ambigüe" msgid "table name \"%s\" specified more than once" msgstr "le nom de la table « %s » est spécifié plus d'une fois" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "référence invalide d'une entrée de la clause FROM pour la table « %s »" -#: parser/parse_relation.c:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "" @@ -17000,111 +18565,117 @@ msgstr "la référence de la colonne système « %s » dans la contrainte CHECK msgid "cannot use system column \"%s\" in column generation expression" msgstr "ne peut pas utiliser la colonne système « %s » dans une expression de génération de colonne" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 parser/parse_relation.c:2343 +#: 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 "ne peut pas utiliser la colonne système « %s » comme clé de partitionnement" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: 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 "" "Il existe un élément WITH nommé « %s » mais il ne peut pas être\n" "référencée de cette partie de la requête." -#: 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 "" "Utilisez WITH RECURSIVE ou ré-ordonnez les éléments WITH pour supprimer\n" "les références en avant." -#: parser/parse_relation.c:1767 +#: parser/parse_relation.c:1778 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "une liste de définition de colonnes est redondante pour une fonction avec paramètres OUT" -#: parser/parse_relation.c:1773 +#: parser/parse_relation.c:1784 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "une liste de définition de colonnes est redondante pour une fonction renvoyant un type composite nommé" -#: 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 "une liste de définition de colonnes n'autorisée que pour les fonctions renvoyant un « record »" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "une liste de définition de colonnes est requise pour les fonctions renvoyant un « record »" -#: parser/parse_relation.c:1828 -#, c-format +#: parser/parse_relation.c:1839 +#, fuzzy, c-format +#| msgid "target lists can have at most %d entries" msgid "column definition lists can have at most %d entries" -msgstr "les listes de définition de colonnes peuvent avoir au plus %d entrées" +msgstr "les listes cibles peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "la fonction « %s » dans la clause FROM a un type de retour %s non supporté" -#: parser/parse_relation.c:1915 parser/parse_relation.c:2008 -#, c-format +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#, fuzzy, c-format +#| msgid "joins can have at most %d columns" msgid "functions in FROM can return at most %d columns" -msgstr "les fonctions dans FROM peuvent avoir au plus %d colonnes" +msgstr "les jointures peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:2036 -#, c-format +#: parser/parse_relation.c:2049 +#, fuzzy, c-format +#| msgid "table \"%s\" has %d columns available but %d columns specified" msgid "%s function has %d columns available but %d columns specified" -msgstr "la fonction « %s » a %d colonnes disponibles mais %d colonnes spécifiées" +msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "les listes de VALUES « %s » ont %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "les jointures peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:2221 -#, c-format +#: parser/parse_relation.c:2235 +#, fuzzy, c-format +#| msgid "table \"%s\" has %d columns available but %d columns specified" msgid "join expression \"%s\" has %d columns available but %d columns specified" -msgstr "l'expression de jointure « %s » a %d colonnes disponibles mais %d colonnes spécifiées" +msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "La requête WITH « %s » n'a pas de clause RETURNING" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "la colonne %d de la relation « %s » n'existe pas" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Peut-être que vous souhaitiez référencer l'alias de la table « %s »." -#: parser/parse_relation.c:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "entrée manquante de la clause FROM pour la table « %s »" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s »." -#: parser/parse_relation.c:3646 +#: parser/parse_relation.c:3664 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Il existe une colonne nommée « %s » pour la table « %s » mais elle ne peut pas être référencée dans cette partie de la requête." -#: parser/parse_relation.c:3663 +#: parser/parse_relation.c:3681 #, c-format 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 »." @@ -17153,7 +18724,7 @@ msgstr "l'affectation indicée à « %s » nécessite le type %s mais son expres 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:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "Un SELECT * sans table spécifiée n'est pas valide" @@ -17173,7 +18744,8 @@ msgstr "référence %%TYPE invalide (trop de points entre les noms) : %s" msgid "type reference %s converted to %s" msgstr "référence de type %s convertie en %s" -#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:394 utils/cache/typcache.c:449 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "le type « %s » n'est qu'une coquille" @@ -17183,12 +18755,12 @@ msgstr "le type « %s » n'est qu'une coquille" msgid "type modifier is not allowed for type \"%s\"" msgstr "le modificateur de type n'est pas autorisé pour le type « %s »" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "les modificateurs de type doivent être des constantes ou des identifiants" -#: 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 "nom de type « %s » invalide" @@ -17198,328 +18770,337 @@ msgstr "nom de type « %s » invalide" msgid "cannot create partitioned table as inheritance child" msgstr "ne peut pas créer une table partitionnée comme la fille d'un héritage" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "le tableau de type serial n'est pas implémenté" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "déclarations NULL/NOT NULL en conflit pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:684 +#: parser/parse_utilcmd.c:683 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "" "plusieurs valeurs par défaut sont spécifiées pour la colonne « %s » de la table\n" "« %s »" -#: parser/parse_utilcmd.c:701 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "les colonnes d'identité uniques ne sont pas supportées sur les tables typées" -#: parser/parse_utilcmd.c:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "les colonnes d'identité ne sont pas supportées sur les partitions" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "plusieurs spécifications d'identité pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:744 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "les colonnes générées ne sont pas supportées sur les tables typées" -#: parser/parse_utilcmd.c:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "les colonnes générées ne sont pas supportées sur les partitions" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "plusieurs expressions de géénration sont spécifiées pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "les clés primaires ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "les contraintes uniques ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:825 +#: parser/parse_utilcmd.c:824 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "une valeur par défaut et une identité ont été spécifiées pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:833 +#: parser/parse_utilcmd.c:832 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "une valeur par défaut et une expression de génération ont été spécifiées à la fois pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:841 +#: parser/parse_utilcmd.c:840 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "une identité et une expression de génération ont été spécifiées à la fois pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "les contraintes d'exclusion ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "les contraintes d'exclusion ne sont pas supportées sur les tables partitionnées" -#: parser/parse_utilcmd.c:977 +#: parser/parse_utilcmd.c:976 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE n'est pas supporté pour la création de tables distantes" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, 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 » dans une clause %s introuvable dans la clause FROM" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "l'index « %s » contient une référence de table de ligne complète" -#: parser/parse_utilcmd.c:2249 +#: parser/parse_utilcmd.c:2252 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "ne peut pas utiliser un index existant dans CREATE TABLE" -#: parser/parse_utilcmd.c:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "l'index « %s » est déjà associé à une contrainte" -#: parser/parse_utilcmd.c:2284 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "index \"%s\" is not valid" msgstr "l'index « %s » n'est pas valide" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "« %s » n'est pas un index unique" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Ne peut pas créer une clé primaire ou une contrainte unique avec cet index." -#: parser/parse_utilcmd.c:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "l'index « %s » contient des expressions" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "« %s » est un index partiel" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "« %s » est un index déferrable" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Ne peut pas créer une contrainte non-déferrable utilisant un index déferrable." -#: parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2384 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "l'index « %s », colonne numéro %d, n'a pas de tri par défaut" -#: parser/parse_utilcmd.c:2538 +#: parser/parse_utilcmd.c:2541 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "la colonne « %s » apparaît deux fois dans la contrainte de la clé primaire" -#: parser/parse_utilcmd.c:2544 +#: parser/parse_utilcmd.c:2547 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "la colonne « %s » apparaît deux fois sur une contrainte unique" -#: parser/parse_utilcmd.c:2891 +#: parser/parse_utilcmd.c:2894 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "les expressions et prédicats d'index peuvent seulement faire référence à la table en cours d'indexage" -#: parser/parse_utilcmd.c:2963 +#: parser/parse_utilcmd.c:2966 #, c-format 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:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "les règles ne sont pas supportés sur les vues matérialisées" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "" "la condition WHERE d'une règle ne devrait pas contenir de références à d'autres\n" "relations" -#: parser/parse_utilcmd.c:3142 +#: parser/parse_utilcmd.c:3145 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "les règles avec des conditions WHERE ne peuvent contenir que des actions SELECT, INSERT, UPDATE ou DELETE " -#: parser/parse_utilcmd.c:3160 parser/parse_utilcmd.c:3261 rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 +#: rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "" "les instructions conditionnelles UNION/INTERSECT/EXCEPT ne sont pas\n" "implémentées" -#: parser/parse_utilcmd.c:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "la règle ON SELECT ne peut pas utiliser OLD" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "la règle ON SELECT ne peut pas utiliser NEW" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "la règle ON INSERT ne peut pas utiliser OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "la règle ON INSERT ne peut pas utiliser NEW" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "ne peut référencer OLD dans une requête WITH" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "ne peut référencer NEW dans une requête WITH" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "clause DEFERRABLE mal placée" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "clauses DEFERRABLE/NOT DEFERRABLE multiples non autorisées" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "clause NOT DEFERRABLE mal placée" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "clause INITIALLY DEFERRED mal placée" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "clauses INITIALLY IMMEDIATE/DEFERRED multiples non autorisées" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "clause INITIALLY IMMEDIATE mal placée" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE spécifie un schéma (%s) différent de celui tout juste créé (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "« %s » n'est pas une table partitionnée" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "la table « %s » n'est pas partitionnée" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "l'index « %s » n'est pas partitionné" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "une table partitionnée par hachage ne peut pas avoir de partition par défaut" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "spécification de limite invalide pour une partition par hachage" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format 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:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "le reste pour une partition par hachage doit être inférieur au modulo" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "spécification de limite invalide pour une partition par liste" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "spécification de limite invalide pour une partition par intervalle" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM doit spécifier exactement une valeur par colonne de partitionnement" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4139 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO doit spécifier exactement une valeur par colonne de partitionnement" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "ne peut pas spécifier NULL dans la limite de l'intervalle" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "chaque limite suivant MAXVALUE doit aussi être MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4309 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "chaque limite suivant MINVALUE doit aussi être MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4352 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "la valeur spécifiée ne peut pas être convertie vers le type %s pour la colonne « %s »" @@ -17532,12 +19113,12 @@ msgstr "UESCAPE doit être suivi par une simple chaîne litérale" msgid "invalid Unicode escape character" msgstr "chaîne d'échappement Unicode invalide" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "valeur d'échappement Unicode invalide" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6555 +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 #, c-format msgid "invalid Unicode escape" msgstr "échappement Unicode invalide" @@ -17547,7 +19128,8 @@ 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:6580 +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 +#: utils/adt/varlena.c:6554 #, c-format msgid "invalid Unicode surrogate pair" msgstr "paire surrogate Unicode invalide" @@ -17557,72 +19139,74 @@ msgstr "paire surrogate Unicode invalide" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "l'identifiant « %s » sera tronqué en « %.*s »" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, c-format 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:2873 partitioning/partbounds.c:2892 partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, 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:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Le nouveau modulo %d n'est pas un facteur de %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:2893 +#: partitioning/partbounds.c:3005 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Le nouveau modulo %d n'est pas divisible par %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:3028 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "limite d'intervalle vide indiquée pour la partition « %s »" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, 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:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partition « %s » surchargerait la partition « %s »" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, 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:4715 +#: partitioning/partbounds.c:4828 #, c-format 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:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "« %s » n'est pas une table partitionnée par hachage" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, 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:4772 +#: partitioning/partbounds.c:4885 #, 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:4804 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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 "n'a pas pu lire les informations sur le répertoire des données « %s » : %m" @@ -17664,12 +19248,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:616 port/sysv_shmem.c:616 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, 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:618 port/sysv_shmem.c:618 +#: 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 "" @@ -17680,24 +19264,24 @@ msgstr "" "valeur du paramètre shared_buffers de PostgreSQL ou le paramètre\n" "max_connections." -#: port/pg_shmem.c:686 port/sysv_shmem.c:686 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "Huge Pages non supportées sur cette plateforme" -#: port/pg_shmem.c:693 port/sysv_shmem.c:693 +#: 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 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:1172 +#: 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 "" "le bloc de mémoire partagé pré-existant (clé %lu, ID %lu) est en cours\n" "d'utilisation" -#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: 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 "Terminez les anciens processus serveurs associés avec le répertoire de données « %s »." @@ -17734,39 +19318,39 @@ msgstr "" "Vous pouvez avoir besoin d'augmenter la valeur SEMVMX par noyau pour valoir\n" "au moins de %d. Regardez dans la documentation de PostgreSQL pour les détails." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "n'a pas pu charger dbghelp.dll, ne peut pas écrire le « crashdump »\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 "n'a pas pu charger les fonctions requises dans dbghelp.dll, ne peut pas écrire le « crashdump »\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 "n'a pas pu ouvrir le fichier « crashdump » « %s » en écriture : code d'erreur %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "a écrit le « crash dump » dans le fichier « %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 "n'a pas pu écrire le « crashdump » dans le fichier « %s » : code d'erreur %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 "" "n'a pas pu créer le tube d'écoute de signal pour l'identifiant de processus %d :\n" "code d'erreur %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 "n'a pas pu créer le tube d'écoute de signal : code d'erreur %lu ; nouvelle tentative\n" @@ -17791,7 +19375,8 @@ msgstr "n'a pas pu déverrouiller la sémaphore : code d'erreur %lu" msgid "could not try-lock semaphore: error code %lu" msgstr "n'a pas pu tenter le verrouillage de la sémaphore : code d'erreur %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 port/win32_shmem.c:187 +#: 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 user right \"%s\": error code %lu" msgstr "n'a pas pu activer le droit utilisateur « %s » : code d'erreur %lu" @@ -17799,11 +19384,13 @@ msgstr "n'a pas pu activer le droit utilisateur « %s » : code d'erreur %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 +#: 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 "Verrouillage des pages en mémoire" -#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 port/win32_shmem.c:188 +#: 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 "L'appel système qui a échoué était %s." @@ -17855,42 +19442,47 @@ 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:410 +#: postmaster/autovacuum.c:404 #, 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:1492 +#: postmaster/autovacuum.c:752 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "le worker de l'autovacuum a pris trop de temps pour démarrer ; annulé" + +#: postmaster/autovacuum.c:1482 #, 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:2298 +#: postmaster/autovacuum.c:2277 #, 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:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "VACUUM automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "ANALYZE automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, 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:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum non démarré à cause d'une mauvaise configuration" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Activez l'option « track_counts »." @@ -17900,59 +19492,60 @@ msgstr "Activez l'option « track_counts »." msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "état du background worker incohérent (max_worker_processes=%d, slots total =%d)" -#: postmaster/bgworker.c:661 -#, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "processus en tâche de fond « %s » : doit se lier à la mémoire partagée pour pouvoir demander une connexion à une base" +#: postmaster/bgworker.c:666 +#, fuzzy, c-format +#| msgid "background worker \"%s\": only dynamic background workers can request notification" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "processus en tâche de fond « %s » : seuls les processus en tâche de fond dynamiques peuvent demander des notifications" -#: postmaster/bgworker.c:670 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "processus en tâche de fond « %s » : ne peut pas réclamer un accès à la base s'il démarre au lancement du postmaster" -#: postmaster/bgworker.c:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "processus en tâche de fond « %s »: intervalle de redémarrage invalide" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "processus en tâche de fond « %s »: les processus parallélisés ne sont peut-être pas être configurés pour redémarrer" -#: postmaster/bgworker.c:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "arrêt du processus en tâche de fond « %s » suite à la demande de l'administrateur" -#: postmaster/bgworker.c:904 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "processus en tâche de fond « %s » : doit être listé dans shared_preload_libraries" -#: postmaster/bgworker.c:916 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "processus en tâche de fond « %s » : seuls les processus en tâche de fond dynamiques peuvent demander des notifications" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "trop de processus en tâche de fond" -#: 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] "Un maximum de %d processus en tâche de fond peut être enregistré avec la configuration actuelle." msgstr[1] "Un maximum de %d processus en tâche de fond peuvent être enregistrés avec la configuration actuelle." -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Considérez l'augmentation du paramètre « 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)" @@ -17963,361 +19556,185 @@ msgstr[1] "" "les points de vérification (checkpoints) arrivent trop fréquemment\n" "(toutes les %d secondes)" -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Considérez l'augmentation du paramètre « max_wal_size »." -#: postmaster/checkpointer.c:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "échec de la demande de point de vérification" -#: postmaster/checkpointer.c:1063 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "" "Consultez les messages récents du serveur dans les journaux applicatifs pour\n" "plus de détails." -#: postmaster/pgarch.c:365 -#, c-format -msgid "archive_mode enabled, yet archive_command is not set" +#: postmaster/pgarch.c:423 +#, 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 activé, cependant archive_command n'est pas configuré" -#: postmaster/pgarch.c:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "supprimé le fichier de statut d'archivage orphelin « %s »" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "la suppression du fichier de statut d'archive orphelin « %s » a échoué trop de fois, une nouvelle tentative aura lieu plus tard" -#: postmaster/pgarch.c:433 +#: postmaster/pgarch.c:491 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "l'archivage du journal de transactions « %s » a échoué trop de fois, nouvelle tentative repoussée" -#: postmaster/pgarch.c:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "échec de la commande d'archivage avec un code de retour %d" - -#: 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 commande d'archivage qui a échoué était : %s" - -#: postmaster/pgarch.c:543 -#, c-format -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:3758 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "" -"Voir le fichier d'en-tête C « ntstatus.h » pour une description de la valeur\n" -"hexadécimale." - -#: postmaster/pgarch.c:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "la commande d'archivage a été terminée par le signal %d : %s" - -#: postmaster/pgarch.c:559 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "la commande d'archivage a quitté avec le statut non reconnu %d" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "n'a pas pu résoudre « localhost » : %s" - -#: 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: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: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: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: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: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: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: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: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: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: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: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: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:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "cible reset non reconnu : « %s »" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "La cible doit être « archiver », « bgwriter » ou « wal »." - -#: 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: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: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: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: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: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: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: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:4657 +#: postmaster/pgarch.c:798 #, 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" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "redémarrage du processus archiver parce la valeur de « archive_library » a changé" -#: postmaster/pgstat.c:4784 +#: postmaster/pgarch.c:831 #, 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" +msgid "archive modules have to define the symbol %s" +msgstr "les modules d'archivage doivent définir le symbôle %s" -#: postmaster/pgstat.c:4997 +#: postmaster/pgarch.c:837 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "" -"corruption de la table hachée de la base de données lors du lancement\n" -"--- annulation" +msgid "archive modules must register an archive callback" +msgstr "les modules d'archivage doivent enregistrer une fonction d'appui d'archivage" -#: postmaster/postmaster.c:745 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s : argument invalide pour l'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 : argument invalide pour l'option -t : « %s »\n" -#: postmaster/postmaster.c:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s : argument invalide : « %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) doit être inférieur à max_connections (%d)\n" -#: postmaster/postmaster.c:924 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "L'archivage des journaux de transactions ne peut pas être activé quand wal_level vaut « minimal »" -#: postmaster/postmaster.c:927 +#: postmaster/postmaster.c:952 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "l'envoi d'un flux de transactions (max_wal_senders > 0) nécessite que le paramètre wal_level à « replica » ou « logical »" -#: postmaster/postmaster.c:935 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s : tables datetoken invalide, merci de corriger\n" -#: postmaster/postmaster.c:1052 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "n'a pas pu créer un port de terminaison I/O pour la queue" -#: postmaster/postmaster.c:1128 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "arrêt des traces sur stderr" -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Les traces suivantes iront sur « %s »." -#: postmaster/postmaster.c:1140 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "démarrage de %s" -#: postmaster/postmaster.c:1161 postmaster/postmaster.c:1260 utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "syntaxe de liste invalide pour le paramètre « %s »" - -#: postmaster/postmaster.c:1192 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "n'a pas pu créer le socket d'écoute pour « %s »" -#: postmaster/postmaster.c:1198 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "n'a pas pu créer de socket TCP/IP" -#: postmaster/postmaster.c:1230 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "échec de DNSServiceRegister() : code d'erreur %ld" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1343 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "n'a pas pu créer la socket de domaine Unix dans le répertoire « %s »" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "n'a pas pu créer les sockets de domaine Unix" -#: postmaster/postmaster.c:1300 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "pas de socket créé pour l'écoute" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1392 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s : n'a pas pu modifier les droits du fichier PID externe « %s » : %s\n" -#: postmaster/postmaster.c:1335 +#: postmaster/postmaster.c:1396 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s : n'a pas pu écrire le fichier PID externe « %s » : %s\n" -#: postmaster/postmaster.c:1368 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "n'a pas pu charger pg_hba.conf" -#: postmaster/postmaster.c:1394 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "le postmaster est devenu multithreadé lors du démarrage" -#: postmaster/postmaster.c:1395 +#: postmaster/postmaster.c:1450 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Configurez la variable d'environnement LC_ALL avec une locale valide." -#: postmaster/postmaster.c:1490 +#: postmaster/postmaster.c:1551 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s : n'a pas pu localiser le chemin de mon propre exécutable" -#: postmaster/postmaster.c:1497 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s : n'a pas pu localiser l'exécutable postgres correspondant" -#: postmaster/postmaster.c:1520 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 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 "Ceci peut indiquer une installation PostgreSQL incomplète, ou que le fichier « %s » a été déplacé." -#: postmaster/postmaster.c:1547 +#: postmaster/postmaster.c:1608 #, c-format msgid "" "%s: could not find the database system\n" @@ -18328,230 +19745,230 @@ msgstr "" "S'attendait à le trouver dans le répertoire « %s »,\n" "mais n'a pas réussi à ouvrir le fichier « %s »: %s\n" -#: postmaster/postmaster.c:1724 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "échec de select() dans postmaster : %m" -#: postmaster/postmaster.c:1860 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "exécution de SIGKILL pour les processus fils récalcitrants" -#: postmaster/postmaster.c:1881 +#: postmaster/postmaster.c:1937 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "forçage d'un arrêt immédiat car le fichier de verrou du répertoire de données est invalide" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "paquet de démarrage incomplet" -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "longueur invalide du paquet de démarrage" -#: postmaster/postmaster.c:2058 +#: postmaster/postmaster.c:2114 #, c-format 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:2076 +#: postmaster/postmaster.c:2132 #, 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:2077 postmaster/postmaster.c:2121 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, 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:2102 +#: postmaster/postmaster.c:2158 #, 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:2120 +#: postmaster/postmaster.c:2176 #, 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:2144 +#: postmaster/postmaster.c:2200 #, 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:2208 utils/misc/guc.c:7126 utils/misc/guc.c:7162 utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11530 utils/misc/guc.c:11571 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11971 +#: utils/misc/guc.c:12012 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valeur invalide pour le paramètre « %s » : « %s »" -#: postmaster/postmaster.c:2211 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Les valeurs valides sont : « false », « 0 », « true », « 1 », « database »." -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2312 #, 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:2273 +#: postmaster/postmaster.c:2329 #, 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:2337 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "le système de bases de données se lance" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2399 #, 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:2344 +#: postmaster/postmaster.c:2400 #, 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:2348 +#: postmaster/postmaster.c:2404 #, 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:2349 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "Le mode Hot Standby est désactivé" -#: postmaster/postmaster.c:2354 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "le système de base de données s'arrête" -#: postmaster/postmaster.c:2359 +#: postmaster/postmaster.c:2415 #, 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:2364 storage/ipc/procarray.c:499 storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "désolé, trop de clients sont déjà connectés" -#: postmaster/postmaster.c:2454 +#: postmaster/postmaster.c:2507 #, 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:2466 +#: postmaster/postmaster.c:2519 #, 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:2720 +#: postmaster/postmaster.c:2773 #, 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:2746 postmaster/postmaster.c:2750 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s n'a pas été rechargé" -#: postmaster/postmaster.c:2760 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuration SSL n'a pas été rechargée" -#: postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "a reçu une demande d'arrêt intelligent" -#: postmaster/postmaster.c:2862 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "a reçu une demande d'arrêt rapide" -#: postmaster/postmaster.c:2880 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "annulation des transactions actives" -#: postmaster/postmaster.c:2904 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "a reçu une demande d'arrêt immédiat" -#: postmaster/postmaster.c:2981 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "arrêt sur la cible de restauration" -#: postmaster/postmaster.c:2999 postmaster/postmaster.c:3035 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "processus de lancement" -#: postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:3048 #, 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:3077 +#: postmaster/postmaster.c:3121 #, 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:3098 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "processus d'écriture en tâche de fond" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "processus checkpointer" -#: postmaster/postmaster.c:3168 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "processus d'écriture des journaux de transaction" -#: postmaster/postmaster.c:3183 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "processus de réception des journaux de transaction" -#: postmaster/postmaster.c:3198 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "processus de lancement de l'autovacuum" -#: postmaster/postmaster.c:3216 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "processus d'archivage" -#: postmaster/postmaster.c:3231 -msgid "statistics collector process" -msgstr "processus de récupération des statistiques" - -#: postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "processus des journaux applicatifs" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "processus en tâche de fond « %s »" -#: postmaster/postmaster.c:3393 postmaster/postmaster.c:3413 postmaster/postmaster.c:3420 postmaster/postmaster.c:3438 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 +#: postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "processus serveur" -#: postmaster/postmaster.c:3492 +#: postmaster/postmaster.c:3508 #, c-format msgid "terminating any other active server processes" msgstr "arrêt des autres processus serveur actifs" @@ -18563,7 +19980,8 @@ msgstr "arrêt des autres processus serveur actifs" msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) a quitté avec le code de sortie %d" -#: postmaster/postmaster.c:3747 postmaster/postmaster.c:3759 postmaster/postmaster.c:3769 postmaster/postmaster.c:3780 +#: postmaster/postmaster.c:3747 postmaster/postmaster.c:3759 +#: postmaster/postmaster.c:3769 postmaster/postmaster.c:3780 #, c-format msgid "Failed process was running: %s" msgstr "Le processus qui a échoué exécutait : %s" @@ -18575,6 +19993,13 @@ msgstr "Le processus qui a échoué exécutait : %s" msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) a été arrêté par l'exception 0x%X" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "" +"Voir le fichier d'en-tête C « ntstatus.h » pour une description de la valeur\n" +"hexadécimale." + #. translator: %s is a noun phrase describing a child process, such as #. "server process" #: postmaster/postmaster.c:3766 @@ -18589,547 +20014,456 @@ msgstr "%s (PID %d) a été arrêté par le signal %d : %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) a quitté avec le statut inattendu %d" -#: postmaster/postmaster.c:3992 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "le système de base de données a été arrêté anormalement" -#: postmaster/postmaster.c:4030 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" msgstr "arrêt à cause d'un échec du processus startup" -#: postmaster/postmaster.c:4036 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "arrêt parce que restart_after_crash est configuré à off" -#: postmaster/postmaster.c:4048 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "tous les processus serveur sont arrêtés ; réinitialisation" -#: postmaster/postmaster.c:4222 postmaster/postmaster.c:5573 postmaster/postmaster.c:5964 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 +#: postmaster/postmaster.c:5920 #, 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:4276 +#: postmaster/postmaster.c:4256 #, 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:4318 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "n'a pas pu lancer le nouveau processus fils pour la connexion : " -#: postmaster/postmaster.c:4424 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "connexion reçue : hôte=%s port=%s" -#: postmaster/postmaster.c:4429 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "connexion reçue : hôte=%s" -#: postmaster/postmaster.c:4672 +#: postmaster/postmaster.c:4646 #, 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:4730 +#: postmaster/postmaster.c:4704 #, 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:4739 +#: postmaster/postmaster.c:4713 #, 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:4766 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "ligne de commande du sous-processus trop longue" -#: postmaster/postmaster.c:4784 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "échec de l'appel à CreateProcess() : %m (code d'erreur %lu)" -#: postmaster/postmaster.c:4811 +#: postmaster/postmaster.c:4785 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "n'a pas pu supprimer la vue du fichier paramètre du backend : code d'erreur %lu" -#: postmaster/postmaster.c:4815 +#: postmaster/postmaster.c:4789 #, 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:4837 +#: postmaster/postmaster.c:4811 #, 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:4838 +#: postmaster/postmaster.c:4812 #, 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:5020 +#: postmaster/postmaster.c:4985 #, 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:5146 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "Merci de signaler ceci à <%s>." -#: postmaster/postmaster.c:5233 +#: postmaster/postmaster.c:5182 #, c-format 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:5497 +#: postmaster/postmaster.c:5446 #, 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:5501 +#: postmaster/postmaster.c:5450 #, 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:5505 +#: postmaster/postmaster.c:5454 #, 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:5509 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "n'a pas pu créer le processus checkpointer : %m" -#: postmaster/postmaster.c:5513 +#: postmaster/postmaster.c:5462 #, 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:5517 +#: postmaster/postmaster.c:5466 #, 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:5521 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "n'a pas pu lancer le processus fils : %m" -#: postmaster/postmaster.c:5722 postmaster/postmaster.c:5745 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, 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:5729 postmaster/postmaster.c:5752 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, 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:5837 +#: postmaster/postmaster.c:5794 #, 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:5950 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "aucun slot disponible pour le nouveau processus worker" -#: postmaster/postmaster.c:6284 +#: postmaster/postmaster.c:6237 #, 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:6316 +#: postmaster/postmaster.c:6269 #, 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:6345 +#: postmaster/postmaster.c:6298 #, 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:6352 +#: postmaster/postmaster.c:6305 #, 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:6361 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" -#: postmaster/postmaster.c:6378 +#: postmaster/postmaster.c:6331 #, 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:6387 +#: postmaster/postmaster.c:6340 #, 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:6394 +#: postmaster/postmaster.c:6347 #, 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:6556 +#: postmaster/postmaster.c:6506 #, 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:6598 +#: postmaster/postmaster.c:6548 #, c-format msgid "could not post child completion status\n" msgstr "n'a pas pu poster le statut de fin de l'enfant\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/shell_archive.c:123 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "échec de la commande d'archivage avec un code de retour %d" + +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 +#, c-format +msgid "The failed archive command was: %s" +msgstr "La commande d'archivage qui a échoué était : %s" + +#: postmaster/shell_archive.c:132 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "la commande d'archivage a été terminée par l'exception 0x%X" + +#: postmaster/shell_archive.c:139 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "la commande d'archivage a été terminée par le signal %d : %s" + +#: postmaster/shell_archive.c:148 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "la commande d'archivage a quitté avec le statut non reconnu %d" + +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format msgid "could not read from logger pipe: %m" msgstr "n'a pas pu lire à partir du tube des journaux applicatifs : %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 "n'a pas pu créer un tube pour syslog : %m" -#: postmaster/syslogger.c:636 +#: postmaster/syslogger.c:677 #, c-format msgid "could not fork system logger: %m" msgstr "n'a pas pu lancer le processus des journaux applicatifs : %m" -#: postmaster/syslogger.c:672 +#: postmaster/syslogger.c:713 #, c-format msgid "redirecting log output to logging collector process" msgstr "redirection des traces vers le processus de récupération des traces" -#: postmaster/syslogger.c:673 +#: postmaster/syslogger.c:714 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Les prochaines traces apparaîtront dans le répertoire « %s »." -#: postmaster/syslogger.c:681 +#: postmaster/syslogger.c:722 #, c-format msgid "could not redirect stdout: %m" msgstr "n'a pas pu rediriger la sortie (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 "n'a pas pu rediriger la sortie des erreurs (stderr) : %m" -#: postmaster/syslogger.c:1108 +#: postmaster/syslogger.c:1177 #, c-format msgid "could not write to log file: %s\n" msgstr "n'a pas pu écrire dans le journal applicatif : %s\n" -#: postmaster/syslogger.c:1225 +#: postmaster/syslogger.c:1295 #, c-format msgid "could not open log file \"%s\": %m" msgstr "n'a pas pu ouvrir le journal applicatif « %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 "désactivation de la rotation automatique (utilisez SIGHUP pour la réactiver)" -#: 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 "n'a pas pu déterminer le collationnement à utiliser pour une expression rationnelle" -#: regex/regc_pg_locale.c:269 +#: regex/regc_pg_locale.c:265 #, c-format 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:345 repl_gram.y:377 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "timeline %u invalide" -#: repl_scanner.l:150 +#: repl_scanner.l:142 msgid "invalid streaming start location" msgstr "emplacement de démarrage du flux de réplication invalide" -#: repl_scanner.l:206 scan.l:717 +#: repl_scanner.l:199 scan.l:724 msgid "unterminated quoted string" -msgstr "chaîne entre guillemets non terminée" - -#: 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: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: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: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:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le fichier temporaire : a lu seulement %zu octets sur %zu" - -#: replication/basebackup.c:546 -#, c-format -msgid "could not find any WAL files" -msgstr "n'a pas pu trouver un seul fichier WAL" - -#: replication/basebackup.c:561 replication/basebackup.c:577 replication/basebackup.c:586 -#, c-format -msgid "could not find WAL file \"%s\"" -msgstr "n'a pas pu trouver le fichier WAL « %s »" - -#: replication/basebackup.c:629 replication/basebackup.c:659 -#, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "taille du fichier WAL « %s » inattendue" - -#: replication/basebackup.c:644 replication/basebackup.c:1777 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "la sauvegarde de base n'a pas pu envoyer les données, annulation de la sauvegarde" - -#: replication/basebackup.c:722 -#, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] "%lld erreur de vérifications des sommes de contrôle au total" -msgstr[1] "%lld erreurs de vérifications des sommes de contrôle au total" - -#: replication/basebackup.c:729 -#, c-format -msgid "checksum verification failure during base backup" -msgstr "échec de la véffication de somme de controle durant la sauvegarde de base" - -#: 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 "option « %s » dupliquée" - -#: replication/basebackup.c:842 -#, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" - -#: replication/basebackup.c:887 -#, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "option de manifeste non reconnue : « %s »" - -#: replication/basebackup.c:903 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "algorithme de somme de contrôle inconnu : « %s »" - -#: replication/basebackup.c:918 -#, c-format -msgid "manifest checksums require a backup manifest" -msgstr "les sommes de contrôles du manifeste nécessitent un manifeste de sauvegarde" - -#: replication/basebackup.c:1525 -#, c-format -msgid "skipping special file \"%s\"" -msgstr "ignore le fichier spécial « %s »" - -#: replication/basebackup.c:1646 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "numéro de segment %d invalide dans le fichier « %s »" - -#: replication/basebackup.c:1684 -#, c-format -msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" -msgstr "n'a pas pu vérifier la somme de contrôle dans le fichier « %s », bloc %u : la taille de tampon de lecture %d et la taille de bloc %d diffèrent" - -#: replication/basebackup.c:1757 -#, c-format -msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" -msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : calculé %X, mais attendu %X" - -#: replication/basebackup.c:1764 -#, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "les prochains échec de vérification de somme de contrôle dans le fichier « %s » ne seront pas reportés" - -#: replication/basebackup.c:1822 -#, 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] "le fichier « %s » a un total de %d échec de vérification de somme de contrôle" -msgstr[1] "le fichier « %s » a un total de %d échecs de vérification de somme de contrôle" - -#: replication/basebackup.c:1858 -#, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "nom du fichier trop long pour le format tar : « %s »" - -#: replication/basebackup.c:1863 -#, c-format -msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "cible du lien symbolique trop longue pour le format tar : nom de fichier « %s », cible « %s »" +msgstr "chaîne entre guillemets non terminée" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "n'a pas pu effacer le search_path : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "syntaxe de la chaîne de connexion invalide : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "n'a pas pu analyser la chaîne de connexion : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "" "n'a pas pu recevoir l'identifiant du système de bases de données et\n" "l'identifiant de la timeline à partir du serveur principal : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:371 replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:384 +#: replication/libpqwalreceiver/libpqwalreceiver.c:622 #, c-format msgid "invalid response from primary server" msgstr "réponse invalide du serveur principal" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:385 #, 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,\n" "attendait %d lignes et %d champs (ou plus)." -#: replication/libpqwalreceiver/libpqwalreceiver.c:448 replication/libpqwalreceiver/libpqwalreceiver.c:455 replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:465 +#: replication/libpqwalreceiver/libpqwalreceiver.c:472 +#: replication/libpqwalreceiver/libpqwalreceiver.c:502 #, c-format msgid "could not start WAL streaming: %s" msgstr "n'a pas pu démarrer l'envoi des WAL : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:526 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "n'a pas pu transmettre le message de fin d'envoi de flux au primaire : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:549 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ensemble de résultats inattendu après la fin du flux de réplication" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:564 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "erreur lors de l'arrêt de la copie en flux : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:574 #, c-format msgid "error reading result of streaming command: %s" msgstr "erreur lors de la lecture de la commande de flux : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:583 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "résultat inattendu après CommandComplete : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:610 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "n'a pas pu recevoir le fichier historique à partir du serveur principal : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:623 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Attendait 1 ligne avec 2 champs, a obtenu %d lignes avec %d champs." -#: replication/libpqwalreceiver/libpqwalreceiver.c:767 replication/libpqwalreceiver/libpqwalreceiver.c:820 replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:784 +#: replication/libpqwalreceiver/libpqwalreceiver.c:837 +#: replication/libpqwalreceiver/libpqwalreceiver.c:844 #, 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" -#: replication/libpqwalreceiver/libpqwalreceiver.c:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:864 #, c-format msgid "could not send data to WAL stream: %s" msgstr "n'a pas pu transmettre les données au flux WAL : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:956 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "n'a pas pu créer le slot de réplication « %s » : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 #, c-format msgid "invalid query response" msgstr "réponse à la requête invalide" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Attendait %d champs, a obtenu %d champs." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 #, c-format msgid "the query interface requires a database connection" msgstr "l'interface de la requête requiert une connexion à une base" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 msgid "empty query" msgstr "requête vide" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 msgid "unexpected pipeline mode" msgstr "mode pipeline inattendu" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "ne peut pas démarrer les processus worker de la réplication logique quand max_replication_slots = 0" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "plus de slots de processus worker pour la réplication logique" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Vous pourriez avoir besoin d'augmenter max_logical_replication_workers." @@ -19169,109 +20503,106 @@ msgstr "le décodage logique requiert une connexion à une base" msgid "logical decoding cannot be used while in recovery" msgstr "le décodage logique ne peut pas être utilisé lors de la restauration" -#: 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 "ne peut pas utiliser un slot de réplication physique pour le décodage logique" -#: 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 "le slot de réplication « %s » n'a pas été créé dans cette base de données" -#: 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 "ne peut pas créer un slot de réplication logique dans une transaction qui a fait des écritures" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "début du décodage logique pour le slot « %s »" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Envoi des transactions validées après %X/%X, lecture des journaux à partir de %X/%X." -#: replication/logical/logical.c:696 +#: replication/logical/logical.c:720 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot « %s », plugin de sortie « %s », dans la fonction d'appel %s, associé au LSN %X/%X" -#: replication/logical/logical.c:702 +#: replication/logical/logical.c:726 #, c-format 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:873 replication/logical/logical.c:918 replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format 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:1241 replication/logical/logical.c:1290 replication/logical/logical.c:1331 replication/logical/logical.c:1417 replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "le flux logique requiert une fonction %s" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, c-format 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 -msgid "must be superuser or replication role to use replication slots" -msgstr "" -"doit être un superutilisateur ou un rôle ayant l'attribut de réplication\n" -"pour utiliser des slots de réplication" - -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "le nom du slot ne doit pas être NULL" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "le tableau options ne doit pas être NULL" -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "le tableau doit avoir une dimension" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "le tableau ne doit pas contenir de valeurs 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:1128 +#: utils/adt/jsonb.c:1302 #, c-format msgid "array must have even number of elements" msgstr "le tableau doit avoir un nombre pair d'éléments" -#: replication/logical/logicalfuncs.c:251 +#: replication/logical/logicalfuncs.c:227 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "ne peut plus obtenir de modifications à partir du slot de réplication « %s »" -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:650 +#: 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 "Ce slot n'a jamais réservé de WAL précédemment, ou a été invalidé." -#: 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 "le plugin de sortie « %s » pour le décodage logique produit une sortie binaire, mais la fonction « %s » attend des données texte" -#: 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 "ne peut pas lire ou manipuler une originie de réplication logique quand max_replication_slots = 0" -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "ne peut pas manipuler les origines de réplication lors d'une restauration" @@ -19282,18 +20613,21 @@ msgid "replication origin \"%s\" does not exist" msgstr "l'origine de réplication « %s » n'existe pas" #: replication/logical/origin.c:319 -#, c-format -msgid "could not find free replication origin OID" +#, fuzzy, c-format +#| msgid "could not find free replication origin OID" +msgid "could not find free replication origin ID" msgstr "n'a pas pu trouver d'OID d'origine de réplication libre" #: replication/logical/origin.c:355 -#, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" +#, fuzzy, c-format +#| msgid "could not drop replication origin with OID %d, in use by PID %d" +msgid "could not drop replication origin with ID %d, in use by PID %d" msgstr "ne peut pas supprimer l'origine de réplication d'OID %d, utilisée par le PID %d" #: replication/logical/origin.c:476 -#, c-format -msgid "replication origin with OID %u does not exist" +#, fuzzy, c-format +#| msgid "replication origin with OID %u does not exist" +msgid "replication origin with ID %d does not exist" msgstr "l'origine de réplication d'OID %u n'existe pas" #: replication/logical/origin.c:741 @@ -19307,8 +20641,9 @@ msgid "could not find free replication state, increase max_replication_slots" msgstr "n'a pas pu trouver d'état de réplication libre, augmentez max_replication_slots" #: replication/logical/origin.c:790 -#, c-format -msgid "recovered replication state of node %u to %X/%X" +#, fuzzy, c-format +#| msgid "recovered replication state of node %u to %X/%X" +msgid "recovered replication state of node %d to %X/%X" msgstr "restauration de l'état de réplication du nœud %u à %X/%X" #: replication/logical/origin.c:800 @@ -19316,37 +20651,41 @@ msgstr "restauration de l'état de réplication du nœud %u à %X/%X" msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "le point de contrôle du slot de réplication à la mauvaise somme de contrôle %u, %u attendu" -#: replication/logical/origin.c:928 replication/logical/origin.c:1114 -#, c-format -msgid "replication origin with OID %d is already active for PID %d" +#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#, fuzzy, c-format +#| msgid "replication origin with OID %d is already active for PID %d" +msgid "replication origin with ID %d is already active for PID %d" msgstr "l'origine de réplication d'OID %d est déjà active pour le PID %d" -#: 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" +#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#, fuzzy, c-format +#| msgid "could not find free replication state slot for replication origin with OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" 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:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Augmentez max_replication_slots et recommencez." -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "ne peut pas configurer l'origine de réplication si une origine existe déjà" -#: 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 "aucune origine de réplication n'est configurée" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "le nom d'origine de réplication « %s » est réservé" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Les noms d'origine commençant par « pg_ » sont réservés." @@ -19378,418 +20717,525 @@ msgstr "la relation cible « %s.%s » de réplication logique utilise des colonn 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/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, 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:4180 replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, 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:4184 replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, 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:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, 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" -#: replication/logical/snapbuild.c:637 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "snapshot du slot initial trop gros" -#: replication/logical/snapbuild.c:691 +#: replication/logical/snapbuild.c:700 #, 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] "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:1370 replication/logical/snapbuild.c:1477 replication/logical/snapbuild.c:2008 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 +#: replication/logical/snapbuild.c:2015 #, 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:1372 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "Il n'existe pas de transactions en cours." -#: replication/logical/snapbuild.c:1428 +#: replication/logical/snapbuild.c:1437 #, 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:1430 replication/logical/snapbuild.c:1454 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, 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:1452 +#: replication/logical/snapbuild.c:1461 #, 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:1479 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "Il n'existe plus d'anciennes transactions." -#: replication/logical/snapbuild.c:1876 +#: replication/logical/snapbuild.c:1883 #, 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:1882 +#: replication/logical/snapbuild.c:1889 #, 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:1953 +#: replication/logical/snapbuild.c:1960 #, 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:2010 +#: replication/logical/snapbuild.c:2017 #, 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:2082 +#: replication/logical/snapbuild.c:2089 #, c-format msgid "could not parse file name \"%s\"" msgstr "n'a pas pu analyser le mode du fichier « %s »" -#: 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 "le worker de synchronisation de table en réplication logique pour la souscription « %s », table « %s », a terminé" -#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 +#: 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 "le processus apply de réplication logique pour la souscription « %s » redémarrera car un paramètre a été modifié" + +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" -#: replication/logical/tablesync.c:734 +#: replication/logical/tablesync.c:738 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "table « %s.%s » non trouvée sur le publieur" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:795 +#, 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 "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" + +#: replication/logical/tablesync.c:974 +#, 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 "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" + +#: replication/logical/tablesync.c:1111 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "n'a pas pu lancer la copie initiale du contenu de la table « %s.%s » : %s" -#: replication/logical/tablesync.c:1059 +#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "l'utilisateur « %s » ne peut pas répliquer la relation avec la sécurité niveau ligne activée : « %s »" + +#: replication/logical/tablesync.c:1338 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "la copie de table n'a pas pu démarrer la transaction sur le publieur : %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1380 #, c-format msgid "replication origin \"%s\" already exists" msgstr "l'origine de réplication « %s » existe déjà" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1393 #, c-format 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:518 -#, c-format -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:593 replication/logical/worker.c:719 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, 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:1090 replication/logical/worker.c:1105 -#, c-format +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 +#, fuzzy, c-format +#| msgid "could not read from streaming transaction's changes file \"%s\": %m" msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" -msgstr "n'a pas pu lire à partir du fichier de changements de transaction en flux « %s » : a lu seulement %zu octets sur %zu" +msgstr "n'a pas pu lire à partir du fichier de changements de transaction en flux « %s » : %m" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2251 +#: replication/logical/worker.c:2582 +#, fuzzy, c-format +#| msgid "invalid logical replication message type \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "type de message « %c » de la réplication logique invalide" + +#: replication/logical/worker.c:2746 #, 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:2402 +#: replication/logical/worker.c:2897 #, 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:2550 +#: replication/logical/worker.c:3059 #, 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:2564 +#: replication/logical/worker.c:3070 #, 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:2586 +#: replication/logical/worker.c:3096 #, 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:2751 replication/logical/worker.c:2776 -#, c-format +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 +#, fuzzy, c-format +#| msgid "could not read from streaming transaction's subxact file \"%s\": %m" msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" -msgstr "n'a pas pu lire à partir du fichier subxact de transaction en flux « %s » : a lu seulement %zu octets sur %zu" +msgstr "n'a pas pu lire à partir du fichier subxact de transaction en flux « %s » : %m" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, 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:3170 +#: replication/logical/worker.c:3679 #, 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:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "la souscription n'a aucun ensemble de slot de réplication" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, fuzzy, c-format +#| msgid "cursor \"%s\" has been declared but not opened" +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "le curseur « %s » est déclaré mais non ouvert" + +#: replication/logical/worker.c:3895 +#, fuzzy, c-format +#| msgid "cannot create logical replication slot in transaction that has performed writes" +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "ne peut pas créer un slot de réplication logique dans une transaction qui a fait des écritures" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "" + +#: replication/logical/worker.c:3991 +#, fuzzy, c-format +#| msgid "subscription \"%s\" already exists" +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "la souscription « %s » existe déjà" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "" + +#: replication/logical/worker.c:4018 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4022 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4027 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4034 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4042 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "proto_version invalide" -#: replication/pgoutput/pgoutput.c:201 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version « %s » en dehors des limites" -#: replication/pgoutput/pgoutput.c:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "syntaxe publication_names invalide" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "le client a envoyé proto_version=%d mais nous supportons seulement le protocole %d et les protocoles antérieurs" -#: replication/pgoutput/pgoutput.c:295 +#: replication/pgoutput/pgoutput.c:432 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "le client a envoyé proto_version=%d mais nous supportons seulement le protocole %d et les protocoles supérieurs" -#: replication/pgoutput/pgoutput.c:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "paramètre publication_names manquant" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "proto_version=%d demandé, mais ne supporte par le flux, nécessite %d ou supérieur" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "flux demandé, mais non supporté par le plugin de sortie" -#: replication/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, 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 "proto_version=%d demandé, mais ne supporte par le flux, nécessite %d ou supérieur" + +#: replication/pgoutput/pgoutput.c:478 +#, fuzzy, c-format +#| msgid "streaming requested, but not supported by output plugin" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "flux demandé, mais non supporté par le plugin de sortie" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "le nom du slot de réplication « %s » est trop court" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "le nom du slot de réplication « %s » est trop long" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "le nom du slot de réplication « %s » contient un caractère invalide" -#: replication/slot.c:204 +#: replication/slot.c:229 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Les noms des slots de réplication peuvent seulement contenir des lettres, des nombres et des tirets bas." -#: replication/slot.c:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "le slot de réplication « %s » existe déjà" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "tous les slots de réplication sont utilisés" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format 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:2228 +#: replication/slot.c:472 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 "le slot de réplication « %s » n'existe pas" -#: replication/slot.c:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format 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:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "n'a pas pu supprimer le répertoire « %s »" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "les slots de réplications peuvent seulement être utilisés si max_replication_slots > 0" -#: replication/slot.c:1065 +#: replication/slot.c:1133 #, c-format 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:1250 +#: replication/slot.c:1145 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "" +"doit être un superutilisateur ou un rôle ayant l'attribut de réplication\n" +"pour utiliser des slots de réplication" + +#: replication/slot.c:1330 #, 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:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, 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:1747 +#: replication/slot.c:1827 #, 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:1754 +#: replication/slot.c:1834 #, 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:1790 +#: replication/slot.c:1870 #, 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:1824 +#: replication/slot.c:1904 #, 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:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Modifiez wal_level pour valoir logical ou supérieur." -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, 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:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Modifiez wal_level pour valoir replica ou supérieur." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" msgstr "trop de slots de réplication actifs avant l'arrêt" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "WAL LSN cible invalide" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "le slot de réplication « %s » ne peut pas être avancé" -#: replication/slotfuncs.c:666 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "impossible d'avancer le slot de réplication vers %X/%X, le minimum est %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 "ne peut pas copier le slot de réplication physique « %s » en tant que slot de réplication logique" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "ne peut pas copier le slot de réplication logique « %s » en tant que slot de réplication physique" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "ne peut pas copier un slot de réplication qui n'a pas auparavant réservé de WAL" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "n'a pas pu copier le slot de réplication « %s »" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Le slot de réplication source a été modifié de manière incompatible durant l'opération de copie." -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "ne peut pas copier le slot de réplication logique non terminé « %s »" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Ré-essayez quand la valeur de confirmed_flush_lsn pour le slot de réplication source est valide." @@ -19833,424 +21279,441 @@ 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:161 +#: replication/walreceiver.c:164 #, 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:289 +#: replication/walreceiver.c:292 #, 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:336 +#: replication/walreceiver.c:339 #, 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:337 +#: replication/walreceiver.c:340 #, 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:348 +#: replication/walreceiver.c:351 #, 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:402 +#: replication/walreceiver.c:404 #, 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:406 +#: replication/walreceiver.c:408 #, 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:435 +#: replication/walreceiver.c:437 #, 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:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "réplication terminée par le serveur primaire" -#: replication/walreceiver.c:473 +#: replication/walreceiver.c:476 #, 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:562 +#: replication/walreceiver.c:565 #, 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:600 +#: replication/walreceiver.c:603 #, 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:616 replication/walreceiver.c:1036 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, 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:735 +#: replication/walreceiver.c:738 #, 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:927 +#: replication/walreceiver.c:933 #, 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, fuzzy, c-format +#| msgid "cannot read from logical replication slot \"%s\"" +msgid "cannot use %s with a logical replication slot" +msgstr "ne peut pas lire à partir du slot de réplication logique « %s »" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "n'a pas pu trouver la fin du fichier « %s » : %m" -#: replication/walsender.c:529 +#: replication/walsender.c:642 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "n'a pas pu se déplacer au début du fichier « %s » : %m" -#: replication/walsender.c:580 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM n'a pas été exécuté avant START_REPLICATION" - -#: replication/walsender.c:609 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "ne peut pas utiliser un slot de réplication logique pour une réplication physique" -#: replication/walsender.c:678 +#: replication/walsender.c:785 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "le point de reprise %X/%X de la timeline %u n'est pas dans l'historique du serveur" -#: replication/walsender.c:681 +#: replication/walsender.c:788 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "L'historique du serveur a changé à partir de la timeline %u à %X/%X." -#: replication/walsender.c:725 +#: replication/walsender.c:832 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "le point de reprise requis %X/%X est devant la position de vidage des WAL de ce serveur %X/%X" +#: replication/walsender.c:1015 +#, fuzzy, c-format +#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "valeur non reconnue pour l'option « %s » d'EXPLAIN : « %s »" + #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:975 +#: replication/walsender.c:1100 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s ne doit pas être appelé depuis une transaction" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:985 +#: replication/walsender.c:1110 #, c-format msgid "%s must be called inside a transaction" msgstr "%s doit être appelé au sein d'une transaction" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:991 +#: replication/walsender.c:1116 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s doit être appelé dans le niveau d'isolation REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:997 +#: replication/walsender.c:1122 #, c-format msgid "%s must be called before any query" msgstr "%s doit être appelé avant toute requête" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s ne doit pas être appelé depuis une sous-transaction" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "ne peut pas lire à partir du slot de réplication logique « %s »" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Ce slot a été invalidé parce qu'il dépassait la taille maximale réservée." -#: replication/walsender.c:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "arrêt du processus walreceiver suite promotion" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, 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:1587 +#: replication/walsender.c:1739 #, 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:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "commande de réplication reçu : %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, 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:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "fin de fichier (EOF) inattendue de la connexion du serveur en attente" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "type de message « %c » invalide pour le serveur en standby" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "type de message « %c » inattendu" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, 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" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "la règle « %s » existe déjà pour la relation « %s »" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not a table" +msgid "relation \"%s\" cannot have rules" +msgstr "la relation « %s » n'est pas une table" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "les actions de la règle sur OLD ne sont pas implémentées" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "Utilisez à la place des vues ou des triggers." -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "les actions de la règle sur NEW ne sont pas implémentées" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "Utilisez des triggers à la place." -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "les règles INSTEAD NOTHING sur SELECT ne sont pas implémentées" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "Utilisez les vues à la place." -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "les actions multiples pour les règles sur SELECT ne sont pas implémentées" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "les règles sur SELECT doivent avoir une action 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 "" "les règles sur SELECT ne doivent pas contenir d'instructions de modification\n" "de données avec WITH" -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "" "les qualifications d'événements ne sont pas implémentées pour les règles sur\n" "SELECT" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "« %s » est déjà une vue" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "la règle de la vue pour « %s » doit être nommée « %s »" -#: rewrite/rewriteDefine.c:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "ne peut pas convertir la table partitionnée « %s » en une vue" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "ne peut pas convertir la partition « %s » en une vue" -#: 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 "n'a pas pu convertir la table « %s » en une vue car elle n'est pas vide" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des triggers" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "" "En particulier, la table ne peut pas être impliquée dans les relations des\n" "clés étrangères." -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des index" -#: 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 "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des tables filles" -#: 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 "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des tables parents" -#: 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 "n'a pas pu convertir la table « %s » en une vue parce que le mode sécurité des lignes est activé pour elle" -#: 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 "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des politiques de sécurité" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "ne peut pas avoir plusieurs listes RETURNING dans une règle" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "les listes RETURNING ne sont pas supportés dans des règles conditionnelles" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "les listes RETURNING ne sont pas supportées dans des règles autres que INSTEAD" -#: rewrite/rewriteDefine.c:543 -#, c-format +#: rewrite/rewriteDefine.c:544 +#, fuzzy, c-format +#| msgid "view rule for \"%s\" must be named \"%s\"" msgid "non-view rule for \"%s\" must not be named \"%s\"" -msgstr "la règle d'un objet autre qu'une vue pour « %s » ne doit pas être nommée « %s »" +msgstr "la règle de la vue pour « %s » doit être nommée « %s »" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "la liste cible de la règle SELECT a trop d'entrées" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "la liste RETURNING a trop d'entrées" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "ne peut pas convertir la relation contenant les colonnes supprimées de la vue" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "ne peut pas créer une liste RETURNING pour une relation contenant des colonnes supprimées" -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un nom de colonne différent pour la colonne « %s »" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "l'entrée cible de la règle SELECT est nommée « %s »." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un type différent de la colonne « %s »" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:754 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "l'entrée %d de la liste RETURNING a un type différent de la colonne « %s »" -#: rewrite/rewriteDefine.c:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "l'entrée de la liste SELECT a le type %s alors que la colonne a le type %s." -#: rewrite/rewriteDefine.c:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "l'entrée de la liste RETURNING a le type %s alors que la colonne a le type %s." -#: rewrite/rewriteDefine.c:775 +#: rewrite/rewriteDefine.c:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un taille différente de la colonne « %s »" -#: rewrite/rewriteDefine.c:777 +#: rewrite/rewriteDefine.c:778 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "l'entrée %d de la liste RETURNING a une taille différente de la colonne « %s »" -#: rewrite/rewriteDefine.c:794 +#: rewrite/rewriteDefine.c:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "l'entrée cible de la règle SELECT n'a pas assez d'entrées" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "la liste RETURNING n'a pas assez d'entrées" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 +#: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "la règle « %s » de la relation « %s » n'existe pas" -#: rewrite/rewriteDefine.c:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "le renommage d'une règle ON SELECT n'est pas autorisé" @@ -20295,166 +21758,168 @@ msgstr "la colonne « %s » peut seulement être mise à jour en DEFAULT" msgid "multiple assignments to same column \"%s\"" msgstr "affectations multiples pour la même colonne « %s »" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, 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:2224 +#: rewrite/rewriteHandler.c:2228 #, 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:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "Les colonnes « junk » des vues ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 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:2552 +#: rewrite/rewriteHandler.c:2556 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:2555 +#: rewrite/rewriteHandler.c:2559 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:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Les vues contenant DISTINCT ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 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:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "Les vues contenant HAVING ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 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:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "Les vues contenant WITH ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 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:2643 +#: rewrite/rewriteHandler.c:2647 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:2646 +#: rewrite/rewriteHandler.c:2650 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:2649 +#: rewrite/rewriteHandler.c:2653 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:2656 rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2672 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:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Les vues contenant TABLESAMPLE ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 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:3172 +#: rewrite/rewriteHandler.c:3176 #, 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:3180 +#: rewrite/rewriteHandler.c:3184 #, 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:3665 +#: rewrite/rewriteHandler.c:3675 #, 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:3676 +#: rewrite/rewriteHandler.c:3686 #, 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:3690 +#: rewrite/rewriteHandler.c:3700 #, 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:3694 +#: rewrite/rewriteHandler.c:3704 #, 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:3699 +#: rewrite/rewriteHandler.c:3709 #, 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:3929 rewrite/rewriteHandler.c:3937 rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 +#: rewrite/rewriteHandler.c:3992 #, 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:4050 +#: rewrite/rewriteHandler.c:4097 #, 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:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, 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:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, 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:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, 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:4141 +#: rewrite/rewriteHandler.c:4188 #, 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" @@ -20475,111 +21940,120 @@ msgid "NEW variables in ON UPDATE rules cannot reference columns that are part o msgstr "les variables NEW dans des règles ON UPDATE ne peuvent pas référencer des colonnes faisant partie d'une affectation multiple dans une commande UPDATE" #: rewrite/rewriteSearchCycle.c:410 -#, c-format +#, 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 "avec une clause SEARCH ou CYCLE, la référence récursive à la requête WITH « %s » doit être au top niveai du SELECT côté droit" +msgstr "avec une clause SEARCH ou CYCLE, le côté gauche de l'UNION doit être un SELECT" -#: scan.l:458 +#: scan.l:465 msgid "unterminated /* comment" msgstr "commentaire /* non terminé" -#: scan.l:478 +#: scan.l:485 msgid "unterminated bit string literal" msgstr "chaîne bit litérale non terminée" -#: scan.l:492 +#: scan.l:499 msgid "unterminated hexadecimal string literal" msgstr "chaîne hexadécimale litérale non terminée" -#: scan.l:542 +#: scan.l:549 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "utilisation non sûre de la constante de chaîne avec des échappements 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 "" "Les constantes de chaîne avec des échappements Unicode ne peuvent pas être\n" "utilisées quand standard_conforming_strings est désactivé." -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" msgstr "état précédent non géré dans xqs" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\uXXXX ou \\UXXXXXXXX." -#: scan.l:689 +#: scan.l:696 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "utilisation non sûre de \\' dans une chaîne littérale" -#: scan.l:690 +#: scan.l:697 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "" "Utilisez '' pour écrire des guillemets dans une chaîne. \\' n'est pas sécurisé\n" "pour les encodages clients." -#: scan.l:762 +#: scan.l:769 msgid "unterminated dollar-quoted string" msgstr "chaîne entre guillemets dollars non terminée" -#: scan.l:779 scan.l:789 +#: scan.l:786 scan.l:796 msgid "zero-length delimited identifier" msgstr "identifiant délimité de longueur nulle" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "identifiant entre guillemets non terminé" -#: scan.l:963 +#: scan.l:970 msgid "operator too long" msgstr "opérateur trop long" +#: scan.l:983 +msgid "trailing junk after parameter" +msgstr "élément indésirable après le paramètre" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "élément indésirable après la valeur numérique" + #. 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 à la fin de l'entrée" #. 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 sur ou près de « %s »" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "utilisation non standard de \\' dans une chaîne littérale" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "" "Utilisez '' pour écrire des guillemets dans une chaîne ou utilisez la syntaxe de\n" "chaîne d'échappement (E'...')." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "utilisation non standard de \\\\ dans une chaîne littérale" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Utilisez la syntaxe de chaîne d'échappement pour les antislashs, c'est-à-dire E'\\\\'." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "utilisation non standard d'un échappement dans une chaîne littérale" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "" @@ -20591,7 +22065,8 @@ msgstr "" msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "aucun stemmer Snowball disponible pour la langue « %s » et l'encodage « %s »" -#: snowball/dict_snowball.c:238 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 "plusieurs paramètres StopWords" @@ -20611,63 +22086,63 @@ msgstr "paramètre Snowball non reconnu : « %s »" msgid "missing Language parameter" msgstr "paramètre Language manquant" -#: statistics/extended_stats.c:178 +#: statistics/extended_stats.c:179 #, 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/mcv.c:1371 utils/adt/jsonfuncs.c:1952 +#: statistics/mcv.c:1372 #, 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" -#: storage/buffer/bufmgr.c:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "ne peut pas accéder aux tables temporaires d'autres sessions" -#: storage/buffer/bufmgr.c:843 +#: storage/buffer/bufmgr.c:851 #, 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:930 +#: storage/buffer/bufmgr.c:938 #, 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:932 +#: storage/buffer/bufmgr.c:940 #, 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:1031 +#: storage/buffer/bufmgr.c:1039 #, 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:4533 +#: storage/buffer/bufmgr.c:4670 #, 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:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Échecs multiples --- l'erreur d'écriture pourrait être permanente." -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "écriture du bloc %u de la relation %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "snapshot trop ancien" @@ -20682,167 +22157,200 @@ msgstr "aucun tampon local vide disponible" msgid "cannot access temporary tables during a parallel operation" msgstr "ne peut pas accéder à des tables temporaires pendant une opération parallèle" -#: storage/file/buffile.c:323 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » à partir de BufFile « %s » : %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 "n'a pas pu déterminer la taille du fichier temporaire « %s » à partir de BufFile « %s » : %m" -#: storage/file/buffile.c:884 -#, c-format -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:923 +#, fuzzy, c-format +#| msgid "could not delete file \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "n'a pas pu tronquer le fichier « %s » : %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 "n'a pas pu vider les données modifiées : %m" -#: storage/file/fd.c:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "n'a pas pu déterminer la taille des données modifiées : %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "n'a pas exécuter munmap() durant la synchronisation des données : %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "n'a pas pu lier le fichier « %s » à « %s » : %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "échec de getrlimit : %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1057 #, 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:1028 +#: storage/file/fd.c:1058 #, 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:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 storage/file/fd.c:2677 +#: 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 "plus de descripteurs de fichiers : %m; quittez et ré-essayez" -#: storage/file/fd.c:1453 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "fichier temporaire : chemin « %s », taille %lu" -#: storage/file/fd.c:1584 +#: storage/file/fd.c:1658 #, 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:1591 +#: storage/file/fd.c:1665 #, 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:1784 +#: storage/file/fd.c:1862 #, 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:1818 +#: storage/file/fd.c:1898 #, 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:1859 +#: storage/file/fd.c:1939 #, 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:1947 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: storage/file/fd.c:2127 +#: storage/file/fd.c:2207 #, 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:2392 storage/file/fd.c:2451 +#: storage/file/fd.c:2472 storage/file/fd.c:2531 #, 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:2496 +#: storage/file/fd.c:2576 #, 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:2653 +#: storage/file/fd.c:2733 #, 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:3183 +#: storage/file/fd.c:3269 #, 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:3312 +#: 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 "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" -#: storage/file/sharedfileset.c:144 +#: 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 +#, fuzzy, c-format +#| msgid "resetting unlogged relations: cleanup %d init %d" +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "réinitialisation des relations non tracées : nettoyage %d initialisation %d" + +#: storage/file/reinit.c:148 +#, fuzzy, c-format +#| msgid "resetting unlogged relations: cleanup %d init %d" +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "réinitialisation des relations non tracées : nettoyage %d initialisation %d" + +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "n'a pas pu s'attacher a un SharedFileSet qui est déjà détruit" -#: storage/ipc/dsm.c:351 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "le segment contrôle de mémoire partagée dynamique est corrompu" -#: storage/ipc/dsm.c:415 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "le segment contrôle de mémoire partagée dynamique n'est pas valide" -#: storage/ipc/dsm.c:592 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "trop de segments de mémoire partagée dynamique" -#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 +#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "n'a pas pu annuler le mappage du segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 +#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "n'a pas pu supprimer le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 storage/ipc/dsm_impl.c:843 +#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 +#: storage/ipc/dsm_impl.c:843 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "n'a pas pu ouvrir le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 +#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "n'a pas pu obtenir des informations sur le segment de mémoire partagée « %s » : %m" @@ -20852,7 +22360,8 @@ msgstr "n'a pas pu obtenir des informations sur le segment de mémoire partagée msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "n'a pas pu retailler le segment de mémoire partagée « %s » en %zu octets : %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 +#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "n'a pas pu mapper le segment de mémoire partagée « %s » : %m" @@ -20872,37 +22381,47 @@ msgstr "n'a pas pu créer le segment de mémoire partagée « %s » : %m" msgid "could not close shared memory segment \"%s\": %m" msgstr "n'a pas pu fermer le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "n'a pas pu dupliquer le lien pour « %s » : %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3846 #, 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:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3878 storage/ipc/signalfuncs.c:226 #, 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:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3885 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 "doit être un membre du rôle dont le processus est en cours d'arrêt ou membre de 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 "ne peut pas envoyer un message de taille %zu via la queue en mémoire partagée" -#: storage/ipc/shm_mq.c:694 +#: storage/ipc/shm_mq.c:719 #, c-format 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:962 storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 +#: storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 +#: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "mémoire partagée épuisée" @@ -20932,75 +22451,77 @@ msgstr "pas assez de mémoire partagée pour la structure de données « %s » ( msgid "requested shared memory size overflows size_t" msgstr "la taille de la mémoire partagée demandée dépasse size_t" -#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 -#, 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 "le PID %d n'est pas un processus du serveur PostgreSQL" -#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1468 utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1442 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "n'a pas pu envoyer le signal au processus %d : %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "doit être super-utilisateur pour annuler la requête d'un super-utilisateur" -#: 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 "doit être un membre du rôle dont la requête est en cours d'annulation ou membre de 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 "n'a pas pu vérifier l'existence du processus serveur de PID %d : %m" -#: storage/ipc/signalfuncs.c:183 +#: 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] "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:214 +#: storage/ipc/signalfuncs.c:219 #, c-format msgid "\"timeout\" must not be negative" msgstr "« timeout » ne doit pas être négatif" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:271 #, 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:268 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 "Considérer l'utilisation de %s, qui fait partie de l'installation par défaut, à la place." -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 #, 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" -#: storage/ipc/standby.c:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "restauration toujours en attente après %ld.%03d ms : %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "la restauration a fini d'attendre après %ld.%03d ms : %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "annulation de la requête à cause d'un conflit avec la restauration" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "La transaction de l'utilisateur causait un verrou mortel lors de la restauration." @@ -21073,126 +22594,127 @@ msgstr "interblocage (deadlock) détecté" msgid "See server log for query details." msgstr "Voir les journaux applicatifs du serveur pour les détails sur la requête." -#: storage/lmgr/lmgr.c:831 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "lors de la mise à jour de la ligne (%u,%u) dans la relation « %s »" -#: storage/lmgr/lmgr.c:834 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "lors de la suppression de la ligne (%u,%u) dans la relation « %s »" -#: storage/lmgr/lmgr.c:837 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "lors du verrouillage de la ligne (%u,%u) dans la 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 "lors du verrou de la version mise à jour (%u, %u) de la ligne de la 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 "lors de l'insertion de l'enregistrement (%u, %u) de l'index dans la 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 "lors de la vérification de l'unicité de l'enregistrement (%u,%u) dans la 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 "lors de la re-vérification de l'enregistrement mis à jour (%u,%u) dans la 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 "lors de la vérification de la contrainte d'exclusion sur l'enregistrement (%u,%u) dans la relation « %s »" -#: storage/lmgr/lmgr.c:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1113 +#: storage/lmgr/lmgr.c:1141 #, 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:1119 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid de la base %u" -#: storage/lmgr/lmgr.c:1124 +#: storage/lmgr/lmgr.c:1152 #, 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:1131 +#: storage/lmgr/lmgr.c:1159 #, 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:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "transaction %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "transaction virtuelle %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "jeton spéculatif %u de la transaction %u" -#: storage/lmgr/lmgr.c:1156 +#: storage/lmgr/lmgr.c:1184 #, 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:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "verrou utilisateur [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "verrou informatif [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "type locktag non reconnu %d" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "" "ne peut pas acquérir le mode de verrou %s sur les objets de base de données\n" "alors que la restauration est en cours" -#: storage/lmgr/lock.c:792 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." 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:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, 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:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, 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" @@ -21214,82 +22736,92 @@ msgstr "" msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "pas assez d'éléments dans RWConflictPool pour enregistrer un conflit en lecture/écriture potentiel" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "« default_transaction_isolation » est configuré à « serializable »." -#: 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 "" "Vous pouvez utiliser « SET default_transaction_isolation = 'repeatable read' »\n" "pour modifier la valeur par défaut." -#: storage/lmgr/predicate.c:1746 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "une transaction important un snapshot ne doit pas être READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1825 utils/time/snapmgr.c:569 utils/time/snapmgr.c:575 +#: 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 "n'a pas pu importer le snapshot demandé" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Le processus source de PID %d n'est plus en cours d'exécution." -#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:2499 storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Vous pourriez avoir besoin d'augmenter max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:4120 storage/lmgr/predicate.c:4156 storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 +#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 +#: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 +#: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 +#: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 +#: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "" "n'a pas pu sérialiser un accès à cause des dépendances de lecture/écriture\n" "parmi les transactions" -#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 #, c-format msgid "The transaction might succeed if retried." msgstr "La transaction pourrait réussir après une nouvelle tentative." -#: 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 "" "le nombre de connexions demandées par le serveur en attente dépasse\n" "max_wal_senders (actuellement %d)" -#: storage/lmgr/proc.c:1565 +#: storage/lmgr/proc.c:1539 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "" "le processus %d a évité un verrou mortel pour %s sur %s en modifiant l'ordre\n" "de la queue après %ld.%03d ms" -#: storage/lmgr/proc.c:1580 +#: storage/lmgr/proc.c:1554 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "" "le processus %d a détecté un verrou mortel alors qu'il était en attente de\n" "%s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1589 +#: storage/lmgr/proc.c:1563 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "le processus %d est toujours en attente de %s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1596 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "le processus %d a acquis %s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1613 +#: storage/lmgr/proc.c:1587 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "le processus %d a échoué pour l'acquisition de %s sur %s après %ld.%03d ms" @@ -21299,88 +22831,86 @@ msgstr "le processus %d a échoué pour l'acquisition de %s sur %s après %ld.%0 msgid "page verification failed, calculated checksum %u but expected %u" msgstr "échec de la vérification de la page, somme de contrôle calculé %u, mais attendait %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 "pointeurs de page corrompus : le plus bas = %u, le plus haut = %u, spécial = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "pointeur de ligne corrompu : %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 "longueurs d'élément corrompues : total %u, espace disponible %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 "pointeur de ligne corrompu : décalage = %u, taille = %u" -#: storage/smgr/md.c:438 +#: storage/smgr/md.c:473 #, 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:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "n'a pas pu étendre le fichier « %s » : %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "Vérifiez l'espace disque disponible." - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, 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:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, 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:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, 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:1289 +#: storage/smgr/md.c:1332 #, 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:1303 +#: storage/smgr/md.c:1346 #, 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" @@ -21395,7 +22925,8 @@ msgstr "ne peut pas appeler la fonction « %s » via l'interface fastpath" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "appel de fonction fastpath : « %s » (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "durée : %s ms" @@ -21429,152 +22960,152 @@ msgstr "taille de l'argument %d invalide dans le message d'appel de la fonction" msgid "incorrect binary data format in function argument %d" msgstr "format des données binaires incorrect dans l'argument de la fonction %d" -#: tcop/postgres.c:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "type %d du message de l'interface invalide" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "instruction : %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "durée : %s ms, instruction : %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "ne peut pas insérer les commandes multiples dans une instruction préparée" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "durée : %s ms, analyse %s : %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "l'instruction préparée non nommée n'existe pas" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "le message bind a %d formats de paramètres mais %d paramètres" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "le message bind fournit %d paramètres, mais l'instruction préparée « %s » en requiert %d" -#: tcop/postgres.c:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "format des données binaires incorrect dans le paramètre bind %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "durée : %s ms, lien %s%s%s : %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "le portail « %s » n'existe pas" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "exécute fetch à partir de" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "exécute" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "durée : %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "préparation : %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "paramètres : %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "raison de l'annulation : conflit de restauration" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "L'utilisateur conservait des blocs disques en mémoire partagée depuis trop longtemps." -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "L'utilisateur conservait un verrou sur une relation depuis trop longtemps." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "L'utilisateur utilisait ou pouvait utiliser un tablespace qui doit être supprimé." -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "La requête de l'utilisateur pourrait avoir eu besoin de voir des versions de\n" "lignes qui doivent être supprimées." -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2502 #, c-format msgid "User was connected to a database that must be dropped." msgstr "L'utilisateur était connecté à une base de donnée qui doit être supprimée." -#: tcop/postgres.c:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portail « %s » paramètre $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portail « %s » paramètre $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "paramètre de portail non nommé $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "paramètre de portail non nommé $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "arrêt des connexions suite à un signal SIGQUIT inattendu" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "arrêt de la connexion à cause de l'arrêt brutal d'un autre processus serveur" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, 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 "" @@ -21582,94 +23113,94 @@ msgstr "" "courante et de quitter car un autre processus serveur a quitté anormalement\n" "et qu'il existe probablement de la mémoire partagée corrompue." -#: tcop/postgres.c:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "" "Dans un moment, vous devriez être capable de vous reconnecter à la base de\n" "données et de relancer votre commande." -#: tcop/postgres.c:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "arrêt des connexions suite à la commande d'arrêt immédiat" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "exception due à une virgule flottante" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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 "Une opération invalide sur les virgules flottantes a été signalée. Ceci signifie probablement un résultat en dehors de l'échelle ou une opération invalide telle qu'une division par zéro." -#: tcop/postgres.c:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "annulation de l'authentification à cause du délai écoulé" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "arrêt du processus autovacuum suite à la demande de l'administrateur" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "arrêt des processus workers de réplication logique suite à la demande de l'administrateur" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "arrêt de la connexion à cause d'un conflit avec la restauration" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "arrêt des connexions suite à la demande de l'administrateur" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "connexion au client perdue" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "annulation de la requête à cause du délai écoulé pour l'obtention des verrous" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "annulation de la requête à cause du délai écoulé pour l'exécution de l'instruction" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "annulation de la tâche d'autovacuum" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "annulation de la requête à la demande de l'utilisateur" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "arrêt des connexions suite à l'expiration du délai d'inactivité en transaction" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "arrêt des connexions suite à l'expiration du délai d'inactivité de la session" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "dépassement de limite (en profondeur) de la pile" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "" @@ -21677,100 +23208,100 @@ msgstr "" "être assuré que la limite de profondeur de la pile de la plateforme est\n" "adéquate." -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "« max_stack_depth » ne doit pas dépasser %ld ko." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "" "Augmenter la limite de profondeur de la pile sur votre plateforme via\n" "« ulimit -s » ou l'équivalent local." -#: tcop/postgres.c:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argument invalide en ligne de commande pour le processus serveur : %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s : argument invalide en ligne de commande : %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s : ni base de données ni utilisateur spécifié" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "sous-type %d du message CLOSE invalide" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "sous-type %d du message DESCRIBE invalide" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "appels à la fonction fastpath non supportés dans une connexion de réplication" -#: tcop/postgres.c:4768 +#: tcop/postgres.c:4853 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "protocole étendu de requêtes non supporté dans une connexion de réplication" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:5030 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" 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:638 +#: tcop/pquery.c:641 #, 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:941 tcop/pquery.c:1703 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "le curseur peut seulement parcourir en avant" -#: tcop/pquery.c:942 tcop/pquery.c:1704 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, 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." #. 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 "ne peut pas exécuter %s dans une transaction en lecture seule" #. 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 "ne peut pas exécuté %s lors d'une opération parallèle" #. 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 "ne peut pas exécuté %s lors de la restauration" #. 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 "" @@ -21778,14 +23309,15 @@ msgstr "" "pour sécurité" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, 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" +#: tcop/utility.c:953 +#, fuzzy, c-format +#| msgid "must be superuser to do CHECKPOINT" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" msgstr "doit être super-utilisateur pour exécuter un point de vérification (CHECKPOINT)" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 @@ -21912,7 +23444,8 @@ msgstr "paramètre Thesaurus non reconnu : « %s »" msgid "missing Dictionary parameter" msgstr "paramètre Dictionary manquant" -#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 tsearch/spell.c:1063 +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 +#: tsearch/spell.c:1063 #, c-format msgid "invalid affix flag \"%s\"" msgstr "drapeau d'affixe invalide « %s »" @@ -21937,12 +23470,13 @@ msgstr "drapeau d'affixe invalide « %s » avec la valeur de drapeau « long »" msgid "could not open dictionary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier dictionnaire « %s » : %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "expression rationnelle invalide : %s" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "alias d'affixe invalide « %s »" @@ -21972,27 +23506,29 @@ msgstr "le nombre d'alias excède le nombre %d spécifié" msgid "affix file contains both old-style and new-style commands" msgstr "le fichier d'affixes contient des commandes ancien et nouveau style" -#: 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 "la chaîne est trop longue (%d octets, max %d octets)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "ligne %d du fichier de configuration « %s » : « %s »" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "échec de l'encodage de wchar_t vers l'encodage du serveur : %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 tsearch/ts_parse.c:579 +#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 +#: tsearch/ts_parse.c:579 #, c-format msgid "word is too long to be indexed" msgstr "le mot est trop long pour être indexé" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 tsearch/ts_parse.c:580 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Les mots de plus de %d caractères sont ignorés." @@ -22012,142 +23548,200 @@ msgstr "n'a pas pu ouvrir le fichier des termes courants « %s » : %m" msgid "text search parser does not support headline creation" msgstr "l'analyseur de recherche plein texte ne supporte pas headline" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "paramètre headline non reconnu : « %s »" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords doit avoir une valeur plus petite que celle de MaxWords" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "MinWords doit être positif" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord devrait être positif ou nul" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments devrait être positif ou nul" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, fuzzy, c-format +#| msgid "could not open statistics file \"%s\": %m" +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier de statistiques « %s » : %m" + +#: utils/activity/pgstat.c:1226 +#, fuzzy, c-format +#| msgid "unrecognized statistics kind \"%s\"" +msgid "invalid statistics kind: \"%s\"" +msgstr "type de statistique « %s » non reconnu" + +#: utils/activity/pgstat.c:1306 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier temporaire des statistiques « %s » : %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "n'a pas pu écrire le fichier temporaire des statistiques « %s » : %m" + +#: utils/activity/pgstat.c:1421 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier temporaire des statistiques « %s » : %m" + +#: utils/activity/pgstat.c:1429 +#, 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" + +#: utils/activity/pgstat.c:1478 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier de statistiques « %s » : %m" + +#: utils/activity/pgstat.c:1634 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "fichier de statistiques « %s » corrompu" + +#: utils/activity/pgstat_function.c:118 +#, fuzzy, c-format +#| msgid "function \"%s\" is not a window function" +msgid "function call to dropped function" +msgstr "la fonction « %s » n'est pas une fonction window" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifiant trop long" -#: 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 "L'identifiant doit faire moins de %d caractères." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "mot clé non reconnu : « %s »" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "le mot clé ACL doit être soit « group » soit « user »." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "nom manquant" -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Un nom doit suivre le mot clé « group » ou « user »." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "signe « = » manquant" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "mode caractère invalide : doit faire partie de « %s »" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "un nom doit suivre le signe « / »" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "par défaut, le « donneur de droits » devient l'utilisateur d'identifiant %u" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "le tableau d'ACL contient un type de données incorrect" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "les tableaux d'ACL ne doivent avoir qu'une seule dimension" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "les tableaux d'ACL ne doivent pas contenir de valeurs NULL" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "données superflues à la fin de la spécification de l'ACL" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "les options grant ne peuvent pas être rendues à votre propre donateur" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "des privilèges dépendants existent" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Utilisez CASCADE pour les révoquer aussi." -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert n'est plus supporté" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove n'est plus supporté" -#: 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 "type de droit non reconnu : « %s »" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "la fonction « %s » n'existe pas" -#: utils/adt/acl.c:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "doit être un membre du rôle « %s »" -#: 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: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:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "n'a pas pu déterminer le type de données date en entrée" @@ -22157,7 +23751,17 @@ 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:1768 utils/adt/numeric.c:4231 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 utils/adt/varlena.c:3422 +#: 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:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "entier en dehors des limites" @@ -22167,7 +23771,9 @@ msgstr "entier en dehors des limites" msgid "argument must be empty or one-dimensional array" msgstr "l'argument doit être vide ou doit être un tableau à une dimension" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 +#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 +#: utils/adt/array_userfuncs.c:406 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "ne peut pas concaténer des tableaux non compatibles" @@ -22202,7 +23808,18 @@ 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: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 +#: 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 »" @@ -22222,7 +23839,8 @@ msgstr "Valeur manquante de la dimension du tableau." msgid "Missing \"%s\" after array dimensions." msgstr "« %s » manquant après les dimensions du tableau." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2909 utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:306 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 "la limite supérieure ne peut pas être plus petite que la limite inférieure" @@ -22242,12 +23860,16 @@ msgstr "Le contenu du tableau doit commencer par « { »." 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: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 +#: 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 "Fin de l'entrée inattendue." -#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: 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." @@ -22262,17 +23884,18 @@ msgstr "Élément de tableau inattendu." msgid "Unmatched \"%c\" character." msgstr "Caractère « %c » sans correspondance." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2490 #, 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:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Problème après la parenthèse droite fermante." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 +#: utils/adt/arrayfuncs.c:5883 #, c-format msgid "invalid number of dimensions: %d" msgstr "nombre de dimensions invalide : %d" @@ -22287,7 +23910,8 @@ msgstr "drapeaux de tableau invalides" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" 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:1378 utils/adt/multirangetypes.c:444 utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: 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 "aucune fonction d'entrée binaire disponible pour le type %s" @@ -22297,7 +23921,8 @@ msgstr "aucune fonction d'entrée binaire disponible pour le type %s" 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:1599 utils/adt/multirangetypes.c:449 utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: 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 "aucune fonction de sortie binaire disponible pour le type %s" @@ -22307,12 +23932,19 @@ msgstr "aucune fonction de sortie binaire disponible pour le type %s" 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:2256 utils/adt/arrayfuncs.c:2278 utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 +#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 +#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5869 +#: utils/adt/arrayfuncs.c:5895 utils/adt/arrayfuncs.c:5906 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "mauvais nombre d'indices du tableau" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 +#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 #, c-format msgid "array subscript out of range" msgstr "indice du tableau en dehors de l'intervalle" @@ -22349,77 +23981,80 @@ msgstr "tableau source trop petit" msgid "null array element not allowed in this context" msgstr "élément NULL de tableau interdit dans ce contexte" -#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 +#: utils/adt/arrayfuncs.c:4191 #, 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:3978 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 +#: utils/adt/arrayfuncs.c:3978 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 "n'a pas pu identifier une fonction de hachage pour le type %s" -#: utils/adt/arrayfuncs.c:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4106 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:5282 +#: utils/adt/arrayfuncs.c:5283 #, 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:5337 +#: utils/adt/arrayfuncs.c:5338 #, c-format msgid "cannot accumulate null arrays" msgstr "ne peut pas accumuler des tableaux NULL" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5366 #, c-format msgid "cannot accumulate empty arrays" msgstr "ne peut pas concaténer des tableaux vides" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5393 utils/adt/arrayfuncs.c:5399 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "ne peut pas accumuler des tableaux de dimensions différentes" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5767 utils/adt/arrayfuncs.c:5807 #, 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:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 #, c-format msgid "Dimension array must be one dimensional." msgstr "Le tableau doit avoir une seule dimension." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5875 utils/adt/arrayfuncs.c:5901 #, c-format msgid "dimension values cannot be null" msgstr "les valeurs de dimension ne peuvent pas être NULL" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5907 #, 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:6184 +#: utils/adt/arrayfuncs.c:6185 #, 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:6461 +#: utils/adt/arrayfuncs.c:6462 #, c-format msgid "thresholds must be one-dimensional array" msgstr "les limites doivent être un tableau à une dimension" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6467 #, 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:6699 +#: utils/adt/arrayfuncs.c:6700 #, 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" @@ -22460,150 +24095,217 @@ msgid "encoding conversion from %s to ASCII not supported" 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:4660 utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4050 +#: 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:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "syntaxe en entrée invalide pour le 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:179 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 "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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "division par zéro" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "« char » hors des limites" -#: utils/adt/date.c:62 utils/adt/timestamp.c:97 utils/adt/varbit.c:105 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 "n'a pas pu calculer le hachage %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 "modifieur de type invalide" -#: utils/adt/date.c:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "la précision de TIME(%d)%s ne doit pas être négative" -#: utils/adt/date.c:80 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "la précision de TIME(%d)%s a été réduite au maximum autorisée, %d" -#: 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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "date en dehors des limites : « %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 en dehors des limites" -#: 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 "valeur du champ date en dehors des limites : %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 en dehors des limites : %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "ne peut pas soustraire les valeurs dates infinies" -#: 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 "date en dehors des limites pour un 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 "unités de date « %s » non supportées" -#: 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 "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: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:5417 utils/adt/timestamp.c:5431 utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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 en dehors des limites" -#: 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:4476 #, c-format msgid "time out of range" msgstr "heure en dehors des limites" -#: 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 "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:2435 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 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 "taille précédente ou suivante invalide dans la fonction de fenêtrage" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "unités « %s » non reconnues pour le type « time »" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "déplacement du fuseau horaire en dehors des limites" -#: utils/adt/date.c:2986 utils/adt/date.c:3006 -#, c-format -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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 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 "le fuseau horaire « %s » n'est pas reconnu" -#: utils/adt/date.c:3130 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: utils/adt/date.c:3117 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 #, 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" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valeur du champ date/time en dehors des limites : « %s »" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Peut-être avez-vous besoin d'un paramétrage « datestyle » différent." -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valeur du champ interval en dehors des limites : « %s »" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "déplacement du fuseau horaire en dehors des limites : « %s »" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, c-format 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 »." @@ -22613,19 +24315,20 @@ msgstr "Ce nom du fuseau horaire apparaît dans le fichier de configuration des msgid "invalid Datum pointer" msgstr "pointeur Datum invalide" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "taille invalide : « %s »" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Unité invalide pour une taille : « %s »." -#: utils/adt/dbsize.c:824 -#, 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 "Les unités valides pour ce paramètre sont « bytes », « kB », « MB », « GB » et « TB »." #: utils/adt/domains.c:92 @@ -22688,7 +24391,8 @@ msgstr "utilisation non sûre de la nouvelle valeur « %s » du type enum %s" msgid "New enum values must be committed before they can be used." msgstr "Les nouvelles valeurs enum doivent être validées (COMMIT) avant de pouvoir être utilisées." -#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 utils/adt/enum.c:198 +#: 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 "valeur en entrée invalide pour le enum %s : « %s »" @@ -22698,7 +24402,8 @@ msgstr "valeur en entrée invalide pour le enum %s : « %s »" msgid "invalid internal value for enum: %u" msgstr "valeur interne invalide pour le enum : %u" -#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 utils/adt/enum.c:534 +#: 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 "n'a pas pu déterminer le type enum actuel" @@ -22708,376 +24413,389 @@ msgstr "n'a pas pu déterminer le type enum actuel" msgid "enum %s contains no values" msgstr "l'énumération « %s » ne contient aucune valeur" -#: utils/adt/float.c:88 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "valeur en dehors des limites : dépassement" -#: utils/adt/float.c:96 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "valeur en dehors des limites : trop petit" -#: utils/adt/float.c:265 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "« %s » est en dehors des limites du type 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 » 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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallint en dehors des limites" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, 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:3824 utils/adt/numeric.c:3936 +#: 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 "zéro à une puissance négative est indéfini" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:3736 utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, 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:3674 utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, c-format msgid "cannot take logarithm of a negative number" msgstr "ne peut pas calculer le logarithme sur un nombre négatif" -#: 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 "l'entrée est en dehors des limites" -#: utils/adt/float.c:2798 +#: utils/adt/float.c:2796 #, c-format 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:1708 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, 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:1719 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, 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:1724 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, 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:1738 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "la limite inférieure ne peut pas être plus égale à la limite supérieure" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "format de spécification invalide pour une valeur intervalle" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Les intervalles ne sont pas liés aux dates de calendriers spécifiques." -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "« EEEE » doit être le dernier motif utilisé" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "« 9 » doit être avant « PR »" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "« 0 » doit être avant « PR »" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "multiples points décimaux" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "ne peut pas utiliser « V » et le point décimal ensemble" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "ne peut pas utiliser « S » deux fois" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "ne peut pas utiliser « S » et « PL »/« MI »/« SG »/« PR » ensemble" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "ne peut pas utiliser « S » et « MI » ensemble" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "ne peut pas utiliser « S » et « PL » ensemble" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "ne peut pas utiliser « S » et « SG » ensemble" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "ne peut pas utiliser « PR » et « S »/« PL »/« MI »/« SG » ensemble" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "ne peut pas utiliser « EEEE » deux fois" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "« EEEE » est incompatible avec les autres formats" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "« EEEE » ne peut être utilisé qu'avec les motifs de chiffres et de points décimaux." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "séparateur de format datetime invalide : « %s »" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "« %s » n'est pas un nombre" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "échec de la conversion de casse : %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction %s" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "combinaison invalide des conventions de date" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "" "Ne pas mixer les conventions de jour de semaine grégorien et ISO dans un\n" "modèle de formatage." -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "valeur conflictuelle pour le champ « %s » dans la chaîne de formatage" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Cette valeur contredit une configuration précédente pour le même type de champ." -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "chaîne source trop petite pour le champ de formatage « %s »" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Le champ requiert %d caractères, mais seuls %d restent." -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "" "Si votre chaîne source n'a pas une taille fixe, essayez d'utiliser le\n" "modifieur « FM »." -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "valeur « %s » invalide pour « %s »" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Le champ nécessite %d caractères, mais seulement %d ont pu être analysés." -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "La valeur doit être un entier." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "la valeur pour « %s » dans la chaîne source est en dehors des limites" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "La valeur doit être compris entre %d et %d." -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "La valeur donnée ne correspond pas aux valeurs autorisées pour ce champ." -#: 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "chaîne localisée trop longue" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "séparateur de format « %c » sans correspondance" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "caractère de format « %s » sans correspondance" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "le formatage du champ « %s » est seulement supporté dans to_char" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "chaîne invalide en entrée pour « Y,YYY »" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "la chaîne en entrée est trop courte pour le format datetime" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "les caractères en fin de chaîne restent dans la chaîne en entrée après le format datetime" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "manque du fuseau horaire dans la chaîne en entrée pour le type timestamptz" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptz en dehors des limites" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "le format datetime a une zone de fuseau horaire mais pas d'heure" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" msgstr "manque du fuseau horaire dans la chaîne en entrée pour le type timetz" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetz en dehors des limites" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "le format datetime n'a ni date ni heure" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "l'heure « %d » est invalide pour une horloge sur 12 heures" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Utilisez une horloge sur 24 heures ou donnez une heure entre 1 et 12." -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "ne peut pas calculer le jour de l'année sans information sur l'année" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "« EEEE » non supporté en entrée" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "« RN » non supporté en entrée" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "référence non autorisée au répertoire parent (« .. »)" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "chemin absolu non autorisé" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "le chemin doit être dans ou en-dessous du répertoire courant" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "longueur demandée trop importante" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "n'a pas pu parcourir le fichier « %s » : %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "longueur du fichier trop importante" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "doit être super-utilisateur pour lire des fichiers avec adminpack 1.0" @@ -23092,7 +24810,8 @@ msgstr "spécification invalide de ligne : A et B ne peuvent pas être à zéro msgid "invalid line specification: must be two distinct points" msgstr "spécification de ligne invalide : doit être deux points distincts" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "trop de points demandé" @@ -23102,87 +24821,58 @@ msgstr "trop de points demandé" msgid "invalid number of points in external \"path\" value" msgstr "nombre de points invalide dans la valeur externe de « path »" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "la fonction « dist_lb » n'est pas implémentée" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "fonction « dist_lb » non implémentée" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "la fonction « close_sl » n'est pas implémentée" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "la fonction « close_lb » n'est pas implémentée" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "nombre de points invalide dans la valeur externe de « polygon »" -#: utils/adt/geo_ops.c:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "la fonction « poly_distance » n'est pas implémentée" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "la fonction « path_center » n'est pas implémentée" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "le chemin ouvert ne peut être converti en polygône" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "diamètre invalide pour la valeur externe de « circle »" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "ne peut pas convertir le cercle avec un diamètre zéro en un polygône" -#: utils/adt/geo_ops.c:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "doit demander au moins deux points" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector a trop d'éléments" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "données int2vector invalide" -#: 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 a trop d'éléments" - -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 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 "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:4302 utils/adt/varbit.c:1676 +#: 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:4364 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint en dehors des limites" -#: utils/adt/int8.c:1403 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID en dehors des limites" @@ -23192,23 +24882,23 @@ msgstr "OID en dehors des limites" msgid "key value must be scalar, not array, composite, or json" msgstr "la valeur clé doit être scalaire, et non pas un tableau ou une valeur composite ou un json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, c-format msgid "could not determine data type for argument %d" msgstr "n'a pas pu déterminer le type de données pour l'argument %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 #, c-format msgid "field name must not be null" msgstr "le nom du champ ne doit pas être NULL" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 #, c-format msgid "argument list must have even number of elements" msgstr "la liste d'arguments doit avoir un nombre pair d'éléments" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Les arguments de %s doivent consister en clés et valeurs alternées." @@ -23223,17 +24913,18 @@ msgstr "l'argument %d ne peut pas être NULL" msgid "Object keys should be text." msgstr "Les clés de l'objet doivent être du texte." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "le tableau doit avoir deux colonnes" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, c-format msgid "null value not allowed for object key" msgstr "valeur NULL non autorisée pour une clé d'objet" -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "dimensions du tableau non correspondantes" @@ -23248,67 +24939,68 @@ msgstr "chaîne trop longue pour être représentée en tant que chaîne jsonb" msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Dû à l'implémentation, les chaînes jsonb ne peuvent excéder %d octets." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "argument %d : la clé ne doit pas être NULL" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "les clés de l'objet doivent être du texte" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "ne peut pas convertir un jsonb NULL vers le type %s" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "ne peut pas convertir la chaîne jsonb vers le type %s" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "ne peut pas convertir le numeric jsonb vers le type %s" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "ne peut pas convertir le booléen jsonb vers le type %s" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "ne peut pas convertir le tableau jsonb vers le type %s" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "ne peut pas convertir l'objet jsonb vers le type %s" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "ne peut pas convertir le tableau ou l'objet jsonb vers le type %s" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "le nombre de paires d'objets jsonb dépasse le maximum autorisé (%zu)" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "le nombre d'éléments du tableau jsonb dépasse le maximum autorisé (%zu)" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "la taille totale des éléments du tableau jsonb dépasse le maximum de %u octets" -#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, c-format 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" @@ -23343,12 +25035,15 @@ msgstr "l'indice d'un jsonb doit être de type text" 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:561 utils/adt/jsonfuncs.c:798 utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "ne peut pas appeler %s sur un scalaire" -#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "ne peut pas appeler %s sur un tableau" @@ -23368,174 +25063,182 @@ msgstr "ne peut pas obtenir la longueur d'un scalaire" 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:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "ne peut pas appeler %s sur un non objet" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, 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:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "ne peut pas décomposer un scalaire" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "ne peut pas extraire des éléments d'un scalaire" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "ne peut pas extraire des éléments d'un objet" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, 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:2539 utils/adt/jsonfuncs.c:2544 utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "attendait un tableau JSON" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Voir la valeur de la clé « %s »." -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, 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:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Voir l'élément de tableau %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, 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:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, 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:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "mode matérialisé requis mais interdit dans ce contexte" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, 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:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "ne peut pas appeler %s sur un objet" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "ne peut pas supprimer à partir du scalaire" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, 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:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "ne peut pas initialiser le chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "la valeur JSON ne doit pas être NULL" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, 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:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "ne peut pas supprimer un chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, 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:4944 utils/adt/jsonfuncs.c:4975 utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "ne peut pas remplacer une clé existante" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, 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:5049 +#: utils/adt/jsonfuncs.c:4937 #, 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:5153 +#: utils/adt/jsonfuncs.c:5041 #, 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:5170 +#: utils/adt/jsonfuncs.c:5058 #, 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:5322 +#: utils/adt/jsonfuncs.c:5210 #, 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:5329 +#: utils/adt/jsonfuncs.c:5217 #, 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:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, 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:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "mauvais drapeau dans le drapeau de tableau : « %s »" @@ -23690,7 +25393,7 @@ msgstr "l'argument levenshtein dépasse la longueur maximale de %d caractères" msgid "nondeterministic collations are not supported for LIKE" msgstr "les collationnements non déterministes ne sont pas supportés pour LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "n'a pas pu déterminer le collationnement à utiliser pour ILIKE" @@ -23705,27 +25408,27 @@ msgstr "les collationnements non déterministes ne sont pas supportés pour ILIK msgid "LIKE pattern must not end with escape character" msgstr "le motif LIKE ne doit pas se terminer avec un caractère d'échappement" -#: 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 "chaîne d'échappement invalide" -#: 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 "La chaîne d'échappement doit être vide ou ne contenir qu'un caractère." -#: utils/adt/like_support.c:988 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "la recherche insensible à la casse n'est pas supportée avec le type bytea" -#: utils/adt/like_support.c:1090 +#: utils/adt/like_support.c:1115 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "la recherche par expression rationnelle n'est pas supportée sur le type bytea" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "valeur d'un octet invalide dans la valeur de « macaddr » : « %s »" @@ -23740,425 +25443,427 @@ msgstr "donnée macaddr8 hors de l'échelle pour être convertie en 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 "Seules les adresses qui ont FF ou FE comme valeurs dans les 4è et 5è octets à partir de la gauche, par exemple xx:xx:xx:ff:fe:xx:xx:xx, , sont éligibles à être converties de macaddr8 à macaddr." -#: utils/adt/mcxtfuncs.c:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "doit être super-utilisateur pour tracer les contextes mémoires" +msgid "PID %d is not a PostgreSQL server process" +msgstr "le PID %d n'est pas un processus du serveur PostgreSQL" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "le tablespace global n'a jamais de bases de données" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u n'est pas un OID de tablespace" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "non réservé" -#: utils/adt/misc.c:488 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "non réservé (ne peut pas être un nom de fonction ou de type)" -#: utils/adt/misc.c:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "réservé (peut être un nom de fonction ou de type)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "réservé" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "peut être un label brut" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "requiert AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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 "la chaîne n'est pas un identifiant valide : « %s »" -#: utils/adt/misc.c:761 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "La chaîne des guillements doubles non fermés." -#: utils/adt/misc.c:775 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "L'identifiant entre guillemets ne doit pas être vide." -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Pas d'identifiant valide avant « . »." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Pas d'identifiant valide après « . »." -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "le format de trace « %s » n'est pas supporté" -#: utils/adt/misc.c:879 -#, 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 "Les formats de traces supportés sont « stderr » et « 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 +#: 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 "litéral multirange mal formé : « %s »" -#: utils/adt/multirangetypes.c:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Parenthèse gauche manquante." -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Début d'intervalle attendu." -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." msgstr "Virgule ou fin de multirange attendue." -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "des multiranges ne peuvent pas être construits à partir de tableaux multidimensionnels" -#: utils/adt/multirangetypes.c:1001 +#: utils/adt/multirangetypes.c:1002 #, c-format msgid "multirange values cannot contain null members" msgstr "les valeurs multirange ne peuvent pas contenir des membres NULL" -#: utils/adt/multirangetypes.c:1349 -#, c-format -msgid "range_agg must be called with a range" -msgstr "range_agg doit être appelé avec un intervalle" - -#: utils/adt/multirangetypes.c:1420 -#, c-format -msgid "range_intersect_agg must be called with a multirange" -msgstr "range_intersect_agg doit être appelé avec un multirange" - -#: utils/adt/network.c:111 +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "valeur cidr invalide : « %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 "La valeur a des bits positionnés à la droite du masque." -#: 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 "n'a pas pu formater la valeur 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 "famille d'adresses invalide dans la valeur externe « %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 "bits invalides dans la valeur externe « %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 "longueur invalide dans la valeur externe « %s »" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "valeur externe « cidr » invalide" -#: 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 "longueur du masque invalide : %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "n'a pas pu formater la valeur cidr : %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "ne peut pas assembler les adresses de familles différentes" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "" "ne peut pas utiliser l'opérateur AND sur des champs de type inet de tailles\n" "différentes" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "" "ne peut pas utiliser l'opérateur OR sur des champs de type inet de tailles\n" "différentes" -#: 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 "le résultat est en dehors des limites" -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "ne peut pas soustraire des valeurs inet de tailles différentes" -#: utils/adt/numeric.c:967 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "signe invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:973 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "échelle invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:982 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "chiffre invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, 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:1200 -#, 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 "l'échelle NUMERIC %d doit être comprise entre 0 et le précision %d" -#: utils/adt/numeric.c:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificateur de type NUMERIC invalide" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "la valeur de démarrage ne peut pas être NaN" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "la valeur de démarrage ne peut pas être infinity" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "la valeur d'arrêt ne peut pas être NaN" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "la valeur d'arrêt ne peut pas être infinity" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "la taille du pas ne peut pas être NaN" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "la taille du pas ne peut pas être infinity" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, 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:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "la valeur dépasse le format numeric" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "ne peut pas convertir NaN en %s" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "ne peut pas convertir infinity en %s" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn hors des limites" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "champ numérique en dehors des limites" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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:7554 +#: utils/adt/numeric.c:7594 #, 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." -#: utils/adt/numutils.c:154 -#, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "la valeur « %s » est en dehors des limites des entiers sur 8 bits" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "donnée oidvector invalide" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "caractère demandé trop long" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "caractère demandé trop long pour l'encodage : %d" - -#: utils/adt/oracle_compat.c:1063 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "caractère demandé invalide pour l'encodage : %d" +#: utils/adt/oracle_compat.c:1019 +#, fuzzy, c-format +#| msgid "COST must be positive" +msgid "character number must be positive" +msgstr "COST doit être positif" -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, c-format msgid "null character not permitted" msgstr "caractère nul interdit" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1041 utils/adt/oracle_compat.c:1094 +#, fuzzy, c-format +#| msgid "requested character too large for encoding: %d" +msgid "requested character too large for encoding: %u" +msgstr "caractère demandé trop long pour l'encodage : %d" + +#: utils/adt/oracle_compat.c:1082 +#, fuzzy, c-format +#| msgid "requested character not valid for encoding: %d" +msgid "requested character not valid for encoding: %u" +msgstr "caractère demandé invalide pour l'encodage : %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 "la valeur centile %g n'est pas entre 0 et 1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "Applique les mises à jour du paquet de bibliothèque système." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "n'a pas pu ouvrir le collationneur pour la locale « %s » : %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU n'est pas supporté dans cette installation" + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "n'a pas pu créer la locale « %s » : %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Le système d'exploitation n'a pas pu trouver des données de locale pour la locale « %s »." -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1608 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "" "les collationnements avec des valeurs différents pour le tri et le jeu de\n" "caractères ne sont pas supportés sur cette plateforme" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "le fournisseur du collationnement, LIBC, n'est pas supporté sur cette plateforme" -#: utils/adt/pg_locale.c:1568 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "les collationnements avec des valeurs différentes pour le tri (collate) et le jeu de caractères (ctype) ne sont pas supportés par ICU" - -#: 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 "n'a pas pu ouvrir le collationneur pour la locale « %s » : %s" - -#: utils/adt/pg_locale.c:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU n'est pas supporté dans cette installation" - -#: utils/adt/pg_locale.c:1609 -#, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" +#: utils/adt/pg_locale.c:1652 +#, 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 "le collationnement « %s » n'a pas de version réelle mais une version était indiquée" -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "le collationnement « %s » a des versions différentes" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." -#: utils/adt/pg_locale.c:1621 +#: utils/adt/pg_locale.c:1663 #, 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 "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." -#: utils/adt/pg_locale.c:1692 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "n'a pas pu charger la locale « %s »" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "n'a pas obtenir la version du collationnement pour la locale « %s » : code d'erreur %lu" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "encodage « %s » non supporté par ICU" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "n'a pas pu ouvrir le convertisseur ICU pour l'encodage « %s » : %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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "échec de %s : %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "caractère multi-octets invalide pour la locale" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "" @@ -24180,11 +25885,28 @@ msgstr "ne peut pas soustraire NaN de pg_lsn" msgid "function can only be called when server is in binary upgrade mode" msgstr "la fonction peut seulement être appelée quand le serveur est en mode de mise à jour binaire" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "nom de commande invalide : « %s »" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "cible reset non reconnu : « %s »" + +#: utils/adt/pgstatfuncs.c:2116 +#, fuzzy, c-format +#| msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "La cible doit être « archiver », « bgwriter » ou « wal »." + +#: utils/adt/pgstatfuncs.c:2198 +#, fuzzy, c-format +#| msgid "invalid role OID: %u" +msgid "invalid subscription OID %u" +msgstr "OID du rôle invalide : %u" + #: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" @@ -24215,11 +25937,6 @@ msgstr "le résultat de la différence d'intervalle de valeur ne sera pas contig msgid "result of range union would not be contiguous" msgstr "le résultat de l'union d'intervalle pourrait ne pas être contigü" -#: utils/adt/rangetypes.c:1214 -#, c-format -msgid "range_intersect_agg must be called with a range" -msgstr "range_intersect_agg doit être appelé avec un range" - #: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" @@ -24227,17 +25944,22 @@ msgstr "" "la limite inférieure de l'intervalle de valeurs doit être inférieure ou égale\n" "à la limite supérieure de l'intervalle de valeurs" -#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 utils/adt/rangetypes.c:2139 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 +#: utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "drapeaux de limite de l'intervalle invalides" -#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 utils/adt/rangetypes.c:2140 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Les valeurs valides sont entre « [] », « [) », « (] » et « () »." -#: 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 +#: 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 "intervalle litéral mal formé : « %s »" @@ -24267,33 +25989,48 @@ 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:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, c-format msgid "regular expression failed: %s" msgstr "l'expression rationnelle a échoué : %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 "option d'expression rationnelle invalide : « %.*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 "" + +#: 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:11860 utils/misc/guc.c:11894 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "valeur invalide pour le paramètre « %s » : %d" + +#: utils/adt/regexp.c:922 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "une expression régulière SQL ne peut contenir plus de deux guillemets doubles comme séparateur d'échappement" #. 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 ne supporte pas l'option « global »" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1298 #, c-format msgid "Use the regexp_matches function instead." msgstr "Utilisez la foncction regexp_matches à la place." -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1486 #, c-format msgid "too many regular expression matches" msgstr "trop de correspondances pour l'expression rationnelle" @@ -24308,7 +26045,8 @@ 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:9800 utils/adt/ruleutils.c:9969 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 +#: utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "trop d'arguments" @@ -24318,7 +26056,9 @@ 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:3698 utils/adt/varlena.c:3703 +#: 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:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "syntaxe du nom invalide" @@ -24343,83 +26083,84 @@ msgstr "attendait un nom de type" msgid "improper type name" msgstr "nom du type invalide" -#: 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 "" "une instruction insert ou update sur la table « %s » viole la contrainte de clé\n" "étrangère « %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 n'autorise pas le mixage de valeurs clés NULL et non NULL." -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "la fonction « %s » doit être exécutée pour l'instruction INSERT" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "la fonction « %s » doit être exécutée pour l'instruction UPDATE" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "la fonction « %s » doit être exécutée pour l'instruction DELETE" -#: 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 "aucune entrée pg_constraint pour le trigger « %s » sur la table « %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 "" "Supprimez ce trigger sur une intégrité référentielle et ses enfants,\n" "puis faites un ALTER TABLE ADD CONSTRAINT." -#: 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 "" "la requête d'intégrité référentielle sur « %s » à partir de la contrainte « %s »\n" "sur « %s » donne des résultats inattendus" -#: 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 "Ceci est certainement dû à une règle qui a ré-écrit la requête." -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "la suppression de la partition « %s » viole la contrainte de clé étrangère « %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 "La clé (%s)=(%s) est toujours référencée à partir de la table « %s »." -#: 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 "La clé (%s)=(%s) n'est pas présente dans la table « %s »." -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "La clé n'est pas présente dans la table « %s »." -#: 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 "UPDATE ou DELETE sur la table « %s » viole la contrainte de clé étrangère « %s » de la table « %s »" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "La clé est toujours référencée à partir de la table « %s »." @@ -24429,7 +26170,8 @@ msgstr "La clé est toujours référencée à partir de la table « %s »." msgid "input of anonymous composite types is not implemented" msgstr "l'ajout de colonnes ayant un type composé n'est pas implémenté" -#: 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 +#: 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 "enregistrement litéral invalide : « %s »" @@ -24469,150 +26211,152 @@ msgstr "la donnée binaire a le type %u (%s) au lieu de %u (%s) dans la colonne msgid "improper binary format in record column %d" msgstr "format binaire invalide dans l'enregistrement de la colonne %d" -#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 utils/adt/rowtypes.c:1682 +#: 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 "" "ne peut pas comparer les types de colonnes non similaires %s et %s pour la\n" "colonne %d de l'enregistrement" -#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 +#: 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 "" "ne peut pas comparer les types d'enregistrement avec des numéros différents\n" "des colonnes" -#: utils/adt/ruleutils.c:5164 +#: utils/adt/ruleutils.c:2725 +#, fuzzy, c-format +#| msgid "cannot use subquery in index expression" +msgid "input is a query, not an expression" +msgstr "ne peut pas utiliser la sous-requête dans l'expression de l'index" + +#: utils/adt/ruleutils.c:2737 +#, fuzzy, c-format +#| msgid "USING expression contains a whole-row table reference." +msgid "expression contains variables of more than one relation" +msgstr "l'expression USING contient une référence de table de ligne complète." + +#: utils/adt/ruleutils.c:2744 +#, fuzzy, c-format +#| msgid "argument of %s must not contain variables" +msgid "expression contains variables" +msgstr "l'argument de « %s » ne doit pas contenir de variables" + +#: utils/adt/ruleutils.c:5267 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la règle « %s » a un type d'événement %d non supporté" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "la précision de TIMESTAMP(%d)%s ne doit pas être négative" -#: utils/adt/timestamp.c:115 +#: utils/adt/timestamp.c:116 #, c-format 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:12435 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12884 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp en dehors de limites : « %s »" -#: utils/adt/timestamp.c:374 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "la précision de timestamp(%d) doit être comprise entre %d et %d" -#: utils/adt/timestamp.c:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Les fuseaux horaires numériques doivent avoir « - » ou « + » comme premier caractère." -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "le fuseau horaire numérique « %s » est en dehors des limites" -#: 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 en dehors de limites : %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 ne peut pas valoir NaN" -#: 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 en dehors de limites : « %g »" -#: 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 +#: 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 "intervalle en dehors des limites" -#: 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 "modificateur de type INTERVAL invalide" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "la précision de l'intervalle INTERVAL(%d) ne doit pas être négative" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "La précision de l'intervalle INTERVAL(%d) doit être réduit au maximum permis, %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "la précision de interval(%d) doit être comprise entre %d et %d" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "ne peut pas soustraire les valeurs timestamps infinies" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format msgid "origin out of range" msgstr "origine hors des limites" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" 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 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format msgid "stride must be greater than zero" msgstr "le pas doit être supérieur à zéro" -#: 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: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: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: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:4346 -#, 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 "unités d'intervalle « %s » non supportées car les mois ont généralement des semaines fractionnaires" -#: 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:4368 utils/adt/timestamp.c:5338 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "les unités « %s » ne sont pas reconnues pour le type interval" - #: utils/adt/trigfuncs.c:42 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" @@ -24643,7 +26387,8 @@ msgstr "gtsvector_in n'est pas encore implémenté" 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 +#: 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 "erreur de syntaxe dans tsquery : « %s »" @@ -24720,59 +26465,65 @@ msgstr "le mot est trop long (%ld octets, max %ld octets)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "la chaîne est trop longue pour tsvector (%ld octets, max %ld octets)" -#: 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 "le tableau de lexème ne doit pas contenir de valeurs NULL" -#: 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 "le tableau de lexème ne doit pas contenir de valeurs NULL" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "le tableau de poids ne doit pas contenir de valeurs NULL" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "poids non reconnu : « %c »" -#: utils/adt/tsvector_op.c:2429 +#: utils/adt/tsvector_op.c:2434 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "la requête ts_stat doit renvoyer une colonne tsvector" -#: utils/adt/tsvector_op.c:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "la colonne tsvector « %s » n'existe pas" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "la colonne « %s » n'est pas de type tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "la colonne de configuration « %s » n'existe pas" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "la colonne « %s » n'est pas de type regconfig" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "la colonne de configuration « %s » ne doit pas être NULL" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "" "le nom de la configuration de la recherche plein texte « %s » doit être\n" "qualifié par son schéma" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "la colonne « %s » n'est pas de type caractère" @@ -24792,7 +26543,7 @@ msgstr "il n'existe pas de caractères d'échappement : « %s »" msgid "wrong position info in tsvector: \"%s\"" msgstr "mauvaise information de position dans tsvector : « %s »" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:413 #, c-format msgid "could not generate random values" msgstr "n'a pas pu générer de valeurs aléatoires" @@ -24837,7 +26588,9 @@ 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:890 utils/adt/varlena.c:953 utils/adt/varlena.c:1110 utils/adt/varlena.c:3340 utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "longueur de sous-chaîne négative non autorisée" @@ -24862,7 +26615,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:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "le nouveau bit doit valoir soit 0 soit 1" @@ -24877,127 +26630,128 @@ 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:1516 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, 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:1209 utils/adt/varlena.c:1956 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 #, 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:1615 utils/adt/varlena.c:1628 +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, 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:1643 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "n'a pas pu comparer les chaînes unicode : %m" -#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "échec du collationnement : %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "échec de génération de la clé de tri : %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, 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:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, 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:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "la position du champ ne doit pas être zéro" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "spécificateur de type pour format() non terminé" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Pour un unique \"%%\" utilisez \"%%%%\"." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "spécificateur de type « %.*s » pour format() non reconnu" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "trop peu d'arguments pour format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "le nombre est en dehors des limites" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, 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:6069 +#: utils/adt/varlena.c:6043 #, 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:6114 +#: utils/adt/varlena.c:6088 #, 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:6240 +#: utils/adt/varlena.c:6214 #, 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:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "forme de normalisation invalide : %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "point code Unicode invalide : %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, 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." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "l'argument de ntile doit être supérieur à zéro" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "l'argument de nth_value doit être supérieur à zéro" #: utils/adt/xid8funcs.c:117 -#, 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 "l'identifiant de transaction %s est dans le futur" -#: utils/adt/xid8funcs.c:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "données pg_snapshot externes invalides" @@ -25012,59 +26766,60 @@ msgstr "fonctionnalité XML non supportée" msgid "This functionality requires the server to be built with libxml support." msgstr "Cette fonctionnalité nécessite que le serveur dispose du support de libxml." -#: 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 "nom d'encodage « %s » invalide" -#: 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 "commentaire XML invalide" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "pas un document 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 "instruction de traitement XML invalide" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "le nom de la cible de l'instruction de traitement XML ne peut pas être « %s »." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "l'instruction de traitement XML ne peut pas contenir « ?> »." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate n'est pas implémenté" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "n'a pas pu initialiser la bibliothèque XML" -#: 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 a un type de caractère incompatible : sizeof(char)=%u,\n" "sizeof(xmlChar)=%u." -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1047 #, c-format msgid "could not set up XML error handler" msgstr "n'a pas pu configurer le gestionnaire d'erreurs 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 "" @@ -25072,98 +26827,99 @@ msgstr "" "n'est pas compatible avec les fichiers d'en-tête de libxml2 avec lesquels\n" "PostgreSQL a été construit." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "Valeur invalide pour le caractère." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "Espace requis." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." msgstr "la version autonome accepte seulement 'yes' et 'no'." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "Déclaration mal formée : version manquante." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "Encodage manquant dans la déclaration du texte." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "Analyse de la déclaration XML : « ?> » attendu." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Code d'erreur libxml non reconnu : %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XML ne supporte pas les valeurs infinies de date." -#: 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 ne supporte pas les valeurs infinies de timestamp." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "requête invalide" -#: utils/adt/xml.c:2768 -#, c-format +#: utils/adt/xml.c:2767 +#, fuzzy, c-format +#| msgid "%s query does not return tuples" msgid "portal \"%s\" does not return tuples" -msgstr "le portail « %s » ne renvoie pas de lignes" +msgstr "la requête %s ne renvoie pas de lignes" -#: utils/adt/xml.c:4020 +#: utils/adt/xml.c:4019 #, c-format msgid "invalid array for XML namespace mapping" msgstr "tableau invalide pour la correspondance de l'espace de nom XML" -#: utils/adt/xml.c:4021 +#: utils/adt/xml.c:4020 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "" "Le tableau doit avoir deux dimensions avec une longueur de 2 pour le\n" "deuxième axe." -#: utils/adt/xml.c:4045 +#: utils/adt/xml.c:4044 #, c-format msgid "empty XPath expression" msgstr "expression XPath vide" -#: utils/adt/xml.c:4097 +#: utils/adt/xml.c:4096 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ni le nom de l'espace de noms ni l'URI ne peuvent être NULL" -#: utils/adt/xml.c:4104 +#: utils/adt/xml.c:4103 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "n'a pas pu enregistrer l'espace de noms XML de nom « %s » et d'URI « %s »" -#: utils/adt/xml.c:4455 +#: utils/adt/xml.c:4454 #, c-format msgid "DEFAULT namespace is not supported" msgstr "l'espace de nom DEFAULT n'est pas supporté" -#: utils/adt/xml.c:4484 +#: utils/adt/xml.c:4483 #, c-format msgid "row path filter must not be empty string" msgstr "le filtre du chemin de ligne ne doit pas être une chaîne vide" -#: utils/adt/xml.c:4515 +#: utils/adt/xml.c:4514 #, c-format msgid "column path filter must not be empty string" msgstr "le filtre du chemin de colonne ne doit pas être une chaîne vide" -#: utils/adt/xml.c:4659 +#: utils/adt/xml.c:4658 #, c-format msgid "more than one value returned by column XPath expression" msgstr "plus d'une valeur renvoyée par l'expression XPath de colonne" @@ -25173,7 +26929,8 @@ msgstr "plus d'une valeur renvoyée par l'expression XPath de colonne" msgid "cast from type %s to type %s does not exist" msgstr "la conversion du type %s vers le type %s n'existe pas" -#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 +#: 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 "le type %s est seulement un shell" @@ -25198,41 +26955,53 @@ 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:6325 +#: utils/cache/relcache.c:3754 +#, fuzzy, c-format +#| msgid "pg_class index OID value not set when in binary upgrade mode" +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" + +#: utils/cache/relcache.c:3762 +#, fuzzy, c-format +#| msgid "must be superuser to connect in binary upgrade mode" +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "doit être super-utilisateur pour se connecter en mode de mise à jour binaire" + +#: utils/cache/relcache.c:6473 #, 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:6327 +#: utils/cache/relcache.c:6475 #, 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:6649 +#: utils/cache/relcache.c:6797 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier cache « %s » : %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:590 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "" "ne peut pas préparer (PREPARE) une transaction qui a modifié la correspondance\n" "de relation" -#: utils/cache/relmapper.c:767 +#: utils/cache/relmapper.c:836 #, 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:777 +#: utils/cache/relmapper.c:846 #, 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:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "le type d'enregistrement n'a pas été enregistré" @@ -25247,101 +27016,101 @@ msgstr "TRAP : ExceptionalCondition : mauvais arguments dans le PID %d\n" msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" msgstr "TRAP : %s(« %s », Fichier : « %s », Ligne : %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 "erreur survenue avant que le traitement des messages d'erreurs ne soit disponible\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "n'a pas pu ré-ouvrir le fichier « %s » comme stderr : %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "n'a pas pu ré-ouvrir le fichier « %s » comme stdout : %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 "[inconnu]" -#: 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 "texte d'erreur manquant" -#: 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 " au caractère %d" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DÉTAIL: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "ASTUCE : " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "REQUÊTE : " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "CONTEXTE : " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "EMPLACEMENT : %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "EMPLACEMENT : %s:%d\n" -#: utils/error/elog.c:3094 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "PILE D'APPEL : " -#: utils/error/elog.c:3108 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "INSTRUCTION : " -#: 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 "NOTICE" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "ATTENTION" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ERREUR" -#: 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 "PANIC" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "n'a pas pu trouver la fonction « %s » dans le fichier « %s »" @@ -25373,51 +27142,63 @@ msgstr "bibliothèque « %s » incompatible : versions différentes" msgid "Server is version %d, library is version %s." msgstr "La version du serveur est %d, celle de la bibliothèque est %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 "bibliothèque « %s » incompatible : versions différentes" + +#: 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 "Le serveur a FLOAT8PASSBYVAL = %s, la bibliothèque a %s." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "Le serveur a FUNC_MAX_ARGS = %d, la bibliothèque a %d." -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "Le serveur a INDEX_MAX_KEYS = %d, la bibliothèque a %d." -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "Le serveur a NAMEDATALEN = %d, la bibliothèque a %d." -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "Le serveur a FLOAT8PASSBYVAL = %s, la bibliothèque a %s." -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "Le bloc magique a une longueur inattendue ou une différence de padding." -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "bibliothèque « %s » incompatible : différences dans le bloc magique" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "l'accès à la bibliothèque « %s » n'est pas autorisé" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "nom de macro invalide dans le chemin des bibliothèques partagées : %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "composant de longueur zéro dans le paramètre « 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 "un composant du paramètre « dynamic_library_path » n'est pas un chemin absolu" @@ -25442,415 +27223,420 @@ msgstr "Les fonctions appelables en SQL ont besoin d'un PG_FUNCTION_INFO_V1(nom_ msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "version API %d non reconnue mais rapportée par la fonction info « %s »" -#: utils/fmgr/fmgr.c:1999 +#: utils/fmgr/fmgr.c:1985 #, c-format msgid "operator class options info is absent in function call context" msgstr "les informations sur les options de la classe d'opérateur sont absentes dans le contexte d'appel à la fonction" -#: 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 "fonction %u de validation du langage appelée pour le langage %u au lieu de %u" -#: utils/fmgr/funcapi.c:420 +#: utils/fmgr/funcapi.c:498 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "" "n'a pas pu déterminer le type du résultat actuel pour la fonction « %s »\n" "déclarant retourner le type %s" -#: utils/fmgr/funcapi.c:565 +#: utils/fmgr/funcapi.c:643 #, c-format 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:648 +#: utils/fmgr/funcapi.c:726 #, 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:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "le nombre d'alias ne correspond pas au nombre de colonnes" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "aucun alias de colonne n'a été fourni" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "" "n'a pas pu déterminer la description de la ligne pour la fonction renvoyant\n" "l'enregistrement" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "le répertoire des données « %s » n'existe pas" -#: utils/init/miscinit.c:319 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: utils/init/miscinit.c:327 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "le répertoire des données « %s » n'est pas un répertoire" -#: utils/init/miscinit.c:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "le répertoire des données « %s » a un mauvais propriétaire" -#: utils/init/miscinit.c:345 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "" "Le serveur doit être en cours d'exécution par l'utilisateur qui possède le\n" "répertoire des données." -#: utils/init/miscinit.c:363 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "le répertoire des données « %s » a des permissions non valides" -#: utils/init/miscinit.c:365 +#: utils/init/miscinit.c:380 #, c-format 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" "restreinte pour sécurité" -#: utils/init/miscinit.c:718 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "le rôle d'OID %u n'existe pas" -#: utils/init/miscinit.c:748 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "le rôle « %s » n'est pas autorisé à se connecter" -#: utils/init/miscinit.c:766 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "trop de connexions pour le rôle « %s »" -#: utils/init/miscinit.c:826 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "droit refusé pour initialiser une autorisation de session" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "OID du rôle invalide : %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "le système de base de données est arrêté" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "n'a pas pu créer le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "n'a pas pu lire le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "le fichier verrou « %s » est vide" -#: utils/init/miscinit.c:1081 +#: 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 "Soit un autre serveur est en cours de démarrage, soit le fichier verrou est un reste d'un précédent crash au démarrage du serveur." -#: utils/init/miscinit.c:1125 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "le fichier verrou « %s » existe déjà" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "" "Un autre postgres (de PID %d) est-il déjà lancé avec comme répertoire de\n" "données « %s » ?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Un autre postmaster (de PID %d) est-il déjà lancé avec comme répertoire de\n" "données « %s » ?" -#: utils/init/miscinit.c:1134 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Un autre postgres (de PID %d) est-il déjà lancé en utilisant la socket « %s » ?" -#: utils/init/miscinit.c:1136 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Un autre postmaster (de PID %d) est-il déjà lancé en utilisant la socket « %s » ?" -#: utils/init/miscinit.c:1187 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "n'a pas pu supprimer le vieux fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1189 +#: 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 "" "Le fichier semble avoir été oublié accidentellement mais il ne peut pas être\n" "supprimé. Merci de supprimer ce fichier manuellement et de ré-essayer." -#: utils/init/miscinit.c:1226 utils/init/miscinit.c:1240 utils/init/miscinit.c:1251 +#: 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 "n'a pas pu écrire le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10401 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10828 #, c-format msgid "could not read from file \"%s\": %m" msgstr "n'a pas pu lire à partir du fichier « %s » : %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "n'a pas pu ouvrir le fichier « %s » : %m ; poursuite du traitement" -#: utils/init/miscinit.c:1517 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "le fichier de verrou « %s » contient le mauvais PID : %ld au lieu de %ld" -#: utils/init/miscinit.c:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "« %s » n'est pas un répertoire de données valide" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Le fichier « %s » est manquant." -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Le fichier « %s » ne contient aucune donnée valide." -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "Vous pouvez avoir besoin d'exécuter initdb." -#: utils/init/miscinit.c:1584 +#: 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 "" "Le répertoire des données a été initialisé avec PostgreSQL version %s,\n" "qui est non compatible avec cette version %s." -#: utils/init/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "connexion de réplication autorisée : utilisateur=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "connexion autorisée : utilisateur=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr " base de données %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 activé (protocole : %s, chiffrement : %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 (authentifié=%s, chiffré=%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 "non" -#: 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 "oui" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (authentifié=%s, chiffré=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "la base de données « %s » a disparu de pg_database" -#: utils/init/postinit.c:325 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "La base de données d'OID %u semble maintenant appartenir à « %s »." -#: utils/init/postinit.c:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "la base de données « %s » n'accepte plus les connexions" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "droit refusé pour la base de données « %s »" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "L'utilisateur n'a pas le droit CONNECT." -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "trop de connexions pour la base de données « %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 "la locale de la base de données est incompatible avec le système d'exploitation" -#: 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 "" "La base de données a été initialisée avec un LC_COLLATE à « %s »,\n" "qui n'est pas reconnu par setlocale()." -#: 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 "" "Recréez la base de données avec une autre locale ou installez la locale\n" "manquante." -#: 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 "" "La base de données a été initialisée avec un LC_CTYPE à « %s »,\n" "qui n'est pas reconnu par setlocale()." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 +#, fuzzy, c-format +#| msgid "collation \"%s\" has version mismatch" +msgid "database \"%s\" has a collation version mismatch" +msgstr "le collationnement « %s » a des versions différentes" + +#: utils/init/postinit.c:468 +#, 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 "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." + +#: utils/init/postinit.c:471 +#, 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 "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." + +#: utils/init/postinit.c:839 #, c-format msgid "no roles are defined in this database system" msgstr "aucun rôle n'est défini dans le système de bases de données" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:840 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Vous devez immédiatement exécuter « CREATE USER \"%s\" CREATEUSER; »." -#: utils/init/postinit.c:798 -#, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "" -"les nouvelles connexions pour la réplication ne sont pas autorisées pendant\n" -"l'arrêt du serveur de base de données" - -#: utils/init/postinit.c:802 -#, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "" -"doit être super-utilisateur pour se connecter pendant un arrêt de la base de\n" -"données" - -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "doit être super-utilisateur pour se connecter en mode de mise à jour binaire" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "" "les emplacements de connexions restants sont réservés pour les connexions\n" "superutilisateur non relatif à la réplication" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "" "doit être un superutilisateur ou un rôle ayant l'attribut de réplication\n" "pour exécuter walsender" -#: utils/init/postinit.c:904 -#, c-format -msgid "database %u does not exist" -msgstr "la base de données « %u » n'existe pas" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Cet objet semble avoir été tout juste supprimé ou renommé." -#: utils/init/postinit.c:1001 +#: utils/init/postinit.c:1016 #, c-format +msgid "database %u does not exist" +msgstr "la base de données « %u » n'existe pas" + +#: utils/init/postinit.c:1025 +#, fuzzy, c-format +#| msgid "could not connect to database \"%s\"" msgid "cannot connect to invalid database \"%s\"" -msgstr "ne peut pas se connecter à la base de données invalide « %s »" +msgstr "n'a pas pu se connecter à la base de données « %s »" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Le sous-répertoire de la base de données « %s » est manquant." -#: utils/init/postinit.c:1026 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "n'a pas pu accéder au répertoire « %s » : %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "numéro d'encodage invalide : %d" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#: 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 "identifiant d'encodage %d inattendu pour les jeux de caractères ISO-8859" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#: 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 "identifiant d'encodage %d inattendu pour les jeux de caractères WIN" @@ -25860,7 +27646,8 @@ msgstr "identifiant d'encodage %d inattendu pour les jeux de caractères WIN" msgid "conversion between %s and %s is not supported" msgstr "la conversion entre %s et %s n'est pas supportée" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 +#: 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 "Une chaîne de %d octets est trop longue pour la conversion d'encodage." @@ -25902,323 +27689,333 @@ msgstr "" "le caractère dont la séquence d'octets est %s dans l'encodage « %s » n'a pas\n" "d'équivalent dans l'encodage « %s »" -#: utils/misc/guc.c:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Dégroupé" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Emplacement des fichiers" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Connexions et authentification / Paramétrages de connexion" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Connexions et authentification / Authentification" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Connexions et authentification / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Utilisation des ressources / Mémoire" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Utilisation des ressources / Disques" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Utilisation des ressources / Ressources noyau" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Utilisation des ressources / Délai du VACUUM basé sur le coût" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Utilisation des ressources / Processus d'écriture en tâche de fond" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Utilisation des ressources / Comportement asynchrone" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Paramétrages" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Points de vérification (Checkpoints)" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Archivage" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:804 +#, fuzzy +#| msgid "Write-Ahead Log / Recovery Target" +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead Log / Cible de restauration" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Restauration d'archive" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Cible de restauration" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Réplication / Serveurs d'envoi" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Réplication / Serveur primaire" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Réplication / Serveurs en attente" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Réplication / Abonnés" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Optimisation des requêtes / Configuration de la méthode du planificateur" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Optimisation des requêtes / Constantes des coûts du planificateur" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Optimisation des requêtes / Optimiseur génétique de requêtes" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Optimisation des requêtes / Autres options du planificateur" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Rapports et traces / Où tracer" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Rapports et traces / Quand tracer" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Rapports et traces / Que tracer" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Rapports et traces / Titre du processus" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistiques / Surveillance" -#: utils/misc/guc.c:778 -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 "Statistiques / Récupérateur des statistiques sur les requêtes et sur les index" -#: utils/misc/guc.c:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valeurs par défaut pour les connexions client / Comportement des instructions" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Valeurs par défaut pour les connexions client / Locale et formattage" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valeurs par défaut pour les connexions des clients / Préchargement des bibliothèques partagées" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Valeurs par défaut pour les connexions client / Autres valeurs par défaut" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Gestion des verrous" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Compatibilité des versions et des plateformes / Anciennes versions de PostgreSQL" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Compatibilité des versions et des plateformes / Anciennes plateformes et anciens clients" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Gestion des erreurs" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Options pré-configurées" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Options personnalisées" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Options pour le développeur" -#: utils/misc/guc.c:860 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Les unités valides pour ce paramètre sont « B », « kB », « MB », « GB » et « TB »." -#: utils/misc/guc.c:897 +#: utils/misc/guc.c:955 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Les unités valides pour ce paramètre sont «us », « ms », « s », « min », « h » et « d »." -#: utils/misc/guc.c:959 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Active l'utilisation des parcours séquentiels par le planificateur." -#: utils/misc/guc.c:969 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Active l'utilisation des parcours d'index par le planificateur." -#: utils/misc/guc.c:979 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Active l'utilisation des parcours d'index seul par le planificateur." -#: utils/misc/guc.c:989 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Active l'utilisation des parcours de bitmap par le planificateur." -#: utils/misc/guc.c:999 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Active l'utilisation de plans de parcours TID par le planificateur." -#: utils/misc/guc.c:1009 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Active l'utilisation des étapes de tris explicites par le planificateur." -#: utils/misc/guc.c:1019 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "Active l'utilisation des étapes de tris incrémentaux par le planificateur." -#: utils/misc/guc.c:1028 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Active l'utilisation de plans d'agrégats hachés par le planificateur." -#: utils/misc/guc.c:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Active l'utilisation de la matérialisation par le planificateur." -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Active l'utilisation de la mémorisation par le planificateur." -#: utils/misc/guc.c:1058 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Active l'utilisation de plans avec des jointures imbriquées par le planificateur." -#: utils/misc/guc.c:1068 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Active l'utilisation de plans de jointures MERGE par le planificateur." -#: utils/misc/guc.c:1078 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Active l'utilisation de plans de jointures hachées par le planificateur." -#: utils/misc/guc.c:1088 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Active l'utilisation de plans GATHER MERGE par le planificateur." -#: utils/misc/guc.c:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Active l'utilisation de jointures entre partitions." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Active les agrégations et regroupements par partition." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Active l'utilisation de plans Append parallèles par le planificateur." -#: utils/misc/guc.c:1128 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Active l'utilisation de plans de jointures hachées parallèles par le planificateur." -#: utils/misc/guc.c:1138 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "Active l'élagage de partition durant la planification et l'exécution." -#: utils/misc/guc.c:1139 +#: 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 "Autorise le planificateur de requête et l'exécuteur à comparer les limites des partitions avec les conditions des requêtes pour déterminer les partitions à parcourir." -#: utils/misc/guc.c:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "Active l'utilisation de plans Append asynchrones par le planificateur." -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Active l'optimisation génétique des requêtes." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Cet algorithme essaie de faire une planification sans recherche exhaustive." -#: utils/misc/guc.c:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Affiche si l'utilisateur actuel est un super-utilisateur." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Active la publication du serveur via Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Récupère l'horodatage de la validation de la transaction." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Active les connexions SSL." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." +#: utils/misc/guc.c:1268 +#, fuzzy +#| msgid "Also use ssl_passphrase_command during server reload." +msgid "Controls whether ssl_passphrase_command is called during server reload." msgstr "Utilise également ssl_passphrase_command durant le rechargement du serveur." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Donne la priorité à l'ordre des chiffrements du serveur." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Force la synchronisation des mises à jour sur le disque." -#: utils/misc/guc.c:1228 -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." +#: utils/misc/guc.c:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "" "Le serveur utilisera l'appel système fsync() à différents endroits pour\n" "s'assurer que les mises à jour sont écrites physiquement sur le disque. Ceci\n" "nous assure qu'un groupe de bases de données se retrouvera dans un état\n" "cohérent après un arrêt brutal dû au système d'exploitation ou au matériel." -#: utils/misc/guc.c:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Continue le traitement après un échec de la somme de contrôle." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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 "La détection d'une erreur de somme de contrôle a normalement pour effet de rapporter une erreur, annulant la transaction en cours. Régler ignore_checksum_failure à true permet au système d'ignorer cette erreur (mais rapporte toujours un avertissement), et continue le traitement. Ce comportement pourrait causer un arrêt brutal ou d'autres problèmes sérieux. Cela a un effet seulement si les sommes de contrôle (checksums) sont activés." -#: utils/misc/guc.c:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Continue le travail après les en-têtes de page endommagés." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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 "" "La détection d'une en-tête de page endommagée cause normalement le rapport\n" @@ -26227,199 +28024,195 @@ msgstr "" "message d'attention et continue à travailler. Ce comportement détruira des\n" "données, notamment toutes les lignes de la page endommagée." -#: utils/misc/guc.c:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "Continue la restauration après un échec des pages invalides." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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 détection des enregistrements de journaux de transactions ayant des références à des blocs invalides lors de la restauration a pour effet que PostgreSQL lève une erreur de niveau PANIC, annulant la restauration. Configurer ignore_invalid_pages à true permet au système d'ignorer les références invalides de page dans les enregistrements des journaux de transactions (tout en rapportant toujours un message d'avertissement), et continue la restauration. Ce comportement pourrait causer des arrêts brutaux, des pertes de données, propager ou cacher une corruption, ainsi que d'autres problèmes sérieux. Ce paramètre a un effet seulement lors de la restauration et en mode standby." -#: utils/misc/guc.c:1287 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "" "Écrit des pages complètes dans les WAL lors d'une première modification après\n" "un point de vérification." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1347 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 "Une page écrite au moment d'un arrêt brutal du système d'exploitation pourrait n'être écrite sur le disque que partiellement. Lors de la récupération, les modifications stockées dans le journal de transaction ne sont pas suffisantes pour terminer la récupération. Cette option écrit les pages lors de la première modification après un checkpoint afin que la récupération complète soit possible." -#: utils/misc/guc.c:1301 +#: utils/misc/guc.c:1360 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Écrit des pages complètes dans les WAL lors d'une première modification après un point de vérification, y compris pour des modifications non critiques." -#: utils/misc/guc.c:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Compresse les blocs complets écrits dans les journaux de transactions." - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." msgstr "Écrit des zéros dans les nouveaux journaux de transaction avant leur première utilisation." -#: utils/misc/guc.c:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "Recycle les journaux de transactions en les renommant." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Trace tous les points de vérification." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Trace toutes les connexions réussies." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Trace la fin d'une session, avec sa durée." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Trace chaque commande de réplication." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "Affiche si le serveur en cours d'exécution a les vérifications d'assertion activées." -#: utils/misc/guc.c:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Termine la session sans erreur." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Réinitialisation du serveur après un arrêt brutal d'un processus serveur." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 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:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Trace la durée de chaque instruction SQL terminée." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "Trace l'arbre d'analyse de chaque requête." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Trace l'arbre d'analyse réécrit de chaque requête." -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Trace le plan d'exécution de chaque requête." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Indente l'affichage des arbres d'analyse et de planification." -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 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:1475 +#: utils/misc/guc.c:1524 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:1484 +#: utils/misc/guc.c:1533 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:1493 +#: utils/misc/guc.c:1542 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:1503 +#: utils/misc/guc.c:1552 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:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Récupère les statistiques sur les commandes en exécution." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 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:1535 +#: utils/misc/guc.c:1584 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:1544 +#: utils/misc/guc.c:1593 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:1554 +#: utils/misc/guc.c:1603 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:1555 +#: utils/misc/guc.c:1604 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:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Exécute le sous-processus de l'autovacuum." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 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:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Émet des informations sur l'utilisation des verrous." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Émet des informations sur l'utilisation des verrous utilisateurs." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Émet des informations sur l'utilisation des verrous légers." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 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:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Trace les attentes longues de verrou." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "Trace les attentes sur les conflits de restauration du secondaire." -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 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:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Traite « expr=NULL » comme « expr IS NULL »." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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" @@ -26427,333 +28220,351 @@ 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Active les noms d'utilisateur par base de données." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 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:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "Affiche le statut de lecture seule de la transaction actuelle." -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 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:1713 +#: utils/misc/guc.c:1762 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:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Active la sécurité niveau ligne." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 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:1732 +#: utils/misc/guc.c:1781 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:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Active la saisie d'éléments NULL dans les tableaux." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 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:1768 +#: utils/misc/guc.c:1817 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:1777 +#: utils/misc/guc.c:1826 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:1788 +#: utils/misc/guc.c:1837 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:1802 +#: utils/misc/guc.c:1851 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:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "Active le tri limité en utilisant le tri de heap." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Émet une sortie de débogage concernant les journaux de transactions." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Indique si les types datetime sont basés sur des entiers." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 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:1863 +#: utils/misc/guc.c:1912 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:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Fait que les chaînes '...' traitent les antislashs littéralement." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Active l'utilisation des parcours séquentiels synchronisés." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 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:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "Autorise les connexions et les requêtes pendant la restauration." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 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:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Affiche si le hot standby est actuellement actif." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Permet les modifications de la structure des tables systèmes." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Désactive la lecture des index système." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 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:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." -msgstr "Autorise des tablespaces directement dans pg_tblspc, pour les tests." +msgstr "Autorise les tablespaces directement dans pg_tblspc, pour des tests." -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 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:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 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:1990 +#: utils/misc/guc.c:2039 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:2001 +#: utils/misc/guc.c:2050 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:2011 +#: utils/misc/guc.c:2060 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:2021 +#: utils/misc/guc.c:2070 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:2022 +#: utils/misc/guc.c:2071 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:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Autorise la compilation JIT." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "Enregistre les fonctions compilées avec JIT avec le debugger." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Écrire le bitcode LLVM pour faciliter de débugage JIT." -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Autorise la compilation JIT des expressions." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 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:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Autorise la compilation JIT de la décomposition des lignes." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 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:2119 +#: utils/misc/guc.c:2168 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:2137 -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:2186 +#, 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 "Initalise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Attends N secondes après l'authentification." +#: utils/misc/guc.c:2197 +#, 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 "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "Ceci permet d'attacher un débogueur au processus." -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Initialise la cible par défaut des statistiques." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 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:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 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:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 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:2204 +#: utils/misc/guc.c:2254 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:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO : nombre d'individus dans une population." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "Zéro sélectionne une valeur par défaut convenable." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO : nombre d'itérations dans l'algorithme." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 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:2247 +#: utils/misc/guc.c:2297 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:2258 +#: utils/misc/guc.c:2308 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:2269 +#: utils/misc/guc.c:2319 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:2280 +#: utils/misc/guc.c:2330 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:2291 +#: utils/misc/guc.c:2341 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:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Nombre maximum de connexions simultanées." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "Nombre de connexions réservées aux super-utilisateurs." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 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:2338 +#: utils/misc/guc.c:2388 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:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc.c:2410 +#, 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 "" +"Initialise le nombre de tampons de pages disque dans la mémoire partagée\n" +"pour les journaux de transactions." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 indique que la valeur n'a pas pu être déterminée." + +#: utils/misc/guc.c:2421 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:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "Port TCP sur lequel le serveur écoutera." -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Droits d'accès au socket domaine Unix." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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" @@ -26761,1205 +28572,1285 @@ 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Initialise les droits des fichiers de trace." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Affiche le mode du répertoire des données." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 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:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 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:2428 +#: utils/misc/guc.c:2500 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:2438 +#: utils/misc/guc.c:2510 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:2439 +#: utils/misc/guc.c:2511 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:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Initialise la profondeur maximale de la pile, en Ko." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 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:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 signifie sans limite." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 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:2487 +#: utils/misc/guc.c:2559 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:2497 +#: utils/misc/guc.c:2569 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:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Coût du VACUUM disponible avant un repos." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Coût du VACUUM disponible avant un repos, pour autovacuum." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 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:2540 +#: utils/misc/guc.c:2612 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:2551 +#: utils/misc/guc.c:2623 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:2552 +#: utils/misc/guc.c:2624 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:2561 +#: utils/misc/guc.c:2633 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:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "Initialise la durée maximum permise pour toute instruction." -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Une valeur de 0 désactive le timeout." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 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:2595 +#: utils/misc/guc.c:2667 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:2606 +#: utils/misc/guc.c:2678 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:2617 +#: utils/misc/guc.c:2689 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:2627 +#: utils/misc/guc.c:2699 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:2637 +#: utils/misc/guc.c:2709 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:2647 +#: utils/misc/guc.c:2719 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:2657 +#: utils/misc/guc.c:2729 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:2666 +#: utils/misc/guc.c:2738 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." 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:2675 +#: utils/misc/guc.c:2747 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." 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:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Initialise le nombre maximum de verrous par transaction." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 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:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 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:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 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:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 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:2746 -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:2818 +#, fuzzy +#| msgid "Set the amount of traffic to send and receive before renegotiating the encryption keys." +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "" +"Configure la quantité de trafic à envoyer et recevoir avant la renégotiation\n" +"des clés d'enchiffrement." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Taille du cache pour la lecture en avance des WAL lors d'une récupération." + +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Distance maximale à lire en avance dans les WAL pour récupérer les blocs de données référencés." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2841 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:2768 +#: utils/misc/guc.c:2852 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:2780 +#: utils/misc/guc.c:2864 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:2792 +#: utils/misc/guc.c:2876 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:2803 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." +#: utils/misc/guc.c:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." 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:2805 -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:2889 +#, 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 "" "Écrit un message dans les journaux applicatifs du serveur si les points de\n" "vérifications causées par le remplissage des journaux de transaction avec\n" "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:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 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:2828 +#: utils/misc/guc.c:2913 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:2839 +#: utils/misc/guc.c:2924 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:2850 +#: utils/misc/guc.c:2935 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:2861 +#: utils/misc/guc.c:2946 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:2872 +#: utils/misc/guc.c:2957 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:2883 +#: utils/misc/guc.c:2968 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:2893 +#: utils/misc/guc.c:2978 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:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 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:2917 +#: utils/misc/guc.c:3002 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:2929 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." +#: utils/misc/guc.c:3014 +#, 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 "" "Initialise le nombre minimum de transactions ouvertes simultanément avant le\n" "commit_delay." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 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:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 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:2956 +#: utils/misc/guc.c:3041 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:2966 +#: utils/misc/guc.c:3051 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:2968 +#: utils/misc/guc.c:3053 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:2978 +#: utils/misc/guc.c:3063 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:2980 +#: utils/misc/guc.c:3065 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:2990 -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:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 pour afficher les valeurs complètement." -#: utils/misc/guc.c:3001 -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:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 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:3023 +#: utils/misc/guc.c:3110 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:3046 +#: utils/misc/guc.c:3133 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:3064 +#: utils/misc/guc.c:3151 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:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Nombre maximum de background workers simultanés." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "Nombre maximum de processus workers de réplication logique." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "Nombre maximum de workers de synchronisation par souscription." -#: utils/misc/guc.c:3127 -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:3215 +#, 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 "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:3138 -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:3227 +#, 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 "Initialise la volumétrie maximale des journaux de transactions pouvant être réservée pour les slots de réplication." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Affiche le nombre maximum d'arguments de fonction." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Affiche le nombre maximum de clés d'index." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Affiche la longueur maximum d'un identifiant." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Affiche la taille d'un bloc de disque." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "Affiche le nombre de pages par fichier." -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 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:3215 +#: utils/misc/guc.c:3305 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:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Affiche la taille des journaux de transactions." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Durée d'endormissement entre deux exécutions d'autovacuum." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 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:3259 +#: utils/misc/guc.c:3349 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:3268 +#: utils/misc/guc.c:3358 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:3278 +#: utils/misc/guc.c:3368 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:3293 +#: utils/misc/guc.c:3380 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:3303 +#: utils/misc/guc.c:3390 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:3313 +#: utils/misc/guc.c:3400 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:3323 +#: utils/misc/guc.c:3410 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:3334 +#: utils/misc/guc.c:3421 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:3345 +#: utils/misc/guc.c:3432 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:3356 +#: utils/misc/guc.c:3443 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:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "Une valeur de -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Secondes entre l'exécution de « TCP keepalives »." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 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:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Secondes entre les retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 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:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Nombre maximum de retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3401 -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." +#: utils/misc/guc.c:3488 +#, fuzzy +#| 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." +msgid "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:3412 +#: utils/misc/guc.c:3499 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:3423 +#: utils/misc/guc.c:3510 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:3424 +#: utils/misc/guc.c:3511 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:3435 +#: utils/misc/guc.c:3522 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:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 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:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Affiche la version du serveur sous la forme d'un entier." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 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:3470 +#: utils/misc/guc.c:3557 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:3480 +#: utils/misc/guc.c:3567 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:3491 +#: utils/misc/guc.c:3578 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:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "Délai d'attente maximal TCP utilisateur." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "La taille du Huge Page devant être réclamé." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." msgstr "Vide agressivement les caches systèmes pour du débogage." -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 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:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "Durée entre des mises à jour de progression pour les opérations longues de démarrage." + +#: utils/misc/guc.c:3647 +#, fuzzy +#| msgid "Zero prints all queries. -1 turns this feature off." +msgid "0 turns this feature off." +msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." + +#: utils/misc/guc.c:3666 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:3578 +#: utils/misc/guc.c:3677 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:3589 +#: utils/misc/guc.c:3688 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:3600 +#: utils/misc/guc.c:3699 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:3611 +#: utils/misc/guc.c:3710 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:3622 +#: utils/misc/guc.c:3721 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:3633 +#: utils/misc/guc.c:3732 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:3645 +#: utils/misc/guc.c:3744 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:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 désactive la compilation JIT." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 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:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 désactive l'optimisation." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 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:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 désactive l'inlining." -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 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:3690 +#: utils/misc/guc.c:3789 +#, 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 "Initialise l'estimation du planificateur de la fraction des lignes d'un curseur à récupérer." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO : pression sélective dans la population." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO : graine pour la sélection du chemin aléatoire." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 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:3723 +#: utils/misc/guc.c:3834 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:3733 +#: utils/misc/guc.c:3844 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:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Délai d'un coût de VACUUM en millisecondes." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 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:3766 +#: utils/misc/guc.c:3877 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:3776 +#: utils/misc/guc.c:3887 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:3786 +#: utils/misc/guc.c:3897 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:3796 +#: utils/misc/guc.c:3907 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:3806 +#: utils/misc/guc.c:3917 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:3807 +#: utils/misc/guc.c:3918 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:3816 +#: utils/misc/guc.c:3927 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:3817 +#: utils/misc/guc.c:3928 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:3836 +#: utils/misc/guc.c:3947 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:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Ceci est utilisé seulement si « archive_library » n'est pas configuré." + +#: utils/misc/guc.c:3957 +#, 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 "La commande shell qui sera appelée pour archiver un journal de transaction." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "Une chaîne vide indique que « archive_command » devrait être utilisé." + +#: utils/misc/guc.c:3967 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:3856 +#: utils/misc/guc.c:3977 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:3866 +#: utils/misc/guc.c:3987 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:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Définit la timeline cible de la restauration." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 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:3895 +#: utils/misc/guc.c:4016 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:3904 +#: utils/misc/guc.c:4025 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:3913 +#: utils/misc/guc.c:4034 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:3922 +#: utils/misc/guc.c:4043 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:3932 +#: utils/misc/guc.c:4053 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:3942 +#: utils/misc/guc.c:4063 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:3953 +#: utils/misc/guc.c:4074 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:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Initialise l'encodage du client." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 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:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "Si vide, aucun préfixe n'est utilisé." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Initialise le fuseau horaire à utiliser pour les journaux applicatifs." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 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:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Contrôle aussi l'interprétation des dates ambigües en entrée." -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 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:4017 +#: utils/misc/guc.c:4138 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:4018 +#: utils/misc/guc.c:4139 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:4028 +#: utils/misc/guc.c:4149 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:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Initialise le chemin des modules chargeables dynamiquement." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 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:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Initialise le nom du service Bonjour." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Affiche la locale de tri et de groupement." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 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:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Initialise le langage dans lequel les messages sont affichés." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Initialise la locale pour le formattage des montants monétaires." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Initialise la locale pour formater les nombres." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 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:4138 +#: utils/misc/guc.c:4259 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:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Liste les bibliothèques partagées à précharger dans le serveur." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 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:4171 +#: utils/misc/guc.c:4292 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:4183 +#: utils/misc/guc.c:4304 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:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Affiche la version du serveur." -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Initialise le rôle courant." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Initialise le nom de l'utilisateur de la session." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Initialise la destination des journaux applicatifs du serveur." -#: utils/misc/guc.c:4231 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." +#: utils/misc/guc.c:4352 +#, 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 "" "Les valeurs valides sont une combinaison de « stderr », « syslog »,\n" "« csvlog » et « eventlog », suivant la plateforme." -#: utils/misc/guc.c:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "Initialise le répertoire de destination pour les journaux applicatifs." -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 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:4253 +#: utils/misc/guc.c:4374 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:4264 +#: utils/misc/guc.c:4385 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:4275 +#: utils/misc/guc.c:4396 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:4286 +#: utils/misc/guc.c:4407 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:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Sélectionne un fichier contenant les abréviations des fuseaux horaires." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Initialise le groupe d'appartenance du socket domaine Unix." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 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:4317 +#: utils/misc/guc.c:4438 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:4332 +#: utils/misc/guc.c:4453 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:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Initialise le répertoire des données du serveur." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "Voir le fichier de configuration principal du serveur." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "Initialise le fichier de configuration « hba » du serveur." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "Initialise le fichier de configuration « ident » du serveur." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 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:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Affiche le nom de la bibliothèque SSL." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Emplacement du fichier du certificat serveur SSL." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 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:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Emplacement du fichier du certificat autorité SSL." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 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:4457 +#: utils/misc/guc.c:4578 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:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Écrit les fichiers statistiques temporaires dans le répertoire indiqué." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 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:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Initialise la configuration par défaut de la recherche plein texte." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Initialise la liste des chiffrements SSL autorisés." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Initialise la courbe à utiliser pour ECDH." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Emplacement du fichier des paramètres DH SSL." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Commande pour obtenir la phrase de passe pour SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 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:4562 +#: utils/misc/guc.c:4672 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:4573 +#: utils/misc/guc.c:4683 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:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "Fournisseur JIT à utiliser." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Trace la pile pour les erreurs dans ces fonctions." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Indique si « \\' » est autorisé dans une constante de chaîne." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Initialise le format de sortie pour bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 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:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 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:4646 -msgid "Compute query identifiers." +#: utils/misc/guc.c:4756 +#, fuzzy +#| msgid "Compute query identifiers." +msgid "Enables in-core computation of query identifiers." msgstr "Calcule les identifiants de requête." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 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:4657 +#: utils/misc/guc.c:4767 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:4668 +#: utils/misc/guc.c:4778 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:4679 +#: utils/misc/guc.c:4789 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:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Initialise le format d'affichage des valeurs interval." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Initialise la verbosité des messages tracés." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Initialise les niveaux de messages tracés." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 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:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Initialise le type d'instructions tracées." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 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:4768 +#: utils/misc/guc.c:4878 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:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 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:4798 +#: utils/misc/guc.c:4908 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:4808 +#: utils/misc/guc.c:4918 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:4824 +#: utils/misc/guc.c:4935 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:4834 +#: utils/misc/guc.c:4946 +#, fuzzy +#| msgid "Sets the default statistics target." +msgid "Sets the consistency of accesses to statistics data." +msgstr "Initialise la cible par défaut des statistiques." + +#: utils/misc/guc.c:4956 +#, fuzzy +#| msgid "Compresses full-page writes written in WAL file." +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Compresse les blocs complets écrits dans les journaux de transactions." + +#: utils/misc/guc.c:4966 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:4844 +#: utils/misc/guc.c:4976 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:4854 +#: utils/misc/guc.c:4986 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:4864 +#: utils/misc/guc.c:4996 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:4874 +#: utils/misc/guc.c:5006 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:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Utilisation des HugePages sur Linux ou Windows." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +#, fuzzy +#| msgid "cannot execute %s during recovery" +msgid "Prefetch referenced blocks during recovery." +msgstr "ne peut pas exécuté %s lors de la restauration" + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Recherche en avant dans le WAL pour trouver des références à des données non présentes en cache." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Force l'utilisation des fonctionnalités de requête parallèle." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 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:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Choisit l'algorithme pour le chiffrement des mots de passe." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 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:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 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:4951 +#: utils/misc/guc.c:5093 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:4963 +#: utils/misc/guc.c:5105 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:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "paramètre de configuration « %s » invalide" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, 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:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, fuzzy, c-format +#| msgid "\"%s\" is a procedure." +msgid "\"%s\" is a reserved prefix." +msgstr "« %s » est une procédure." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "paramètre de configuration « %s » non reconnu" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, 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:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27968,12 +29859,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:5880 +#: utils/misc/guc.c:6148 #, 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:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27982,7 +29873,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:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27991,7 +29882,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:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28000,185 +29891,196 @@ 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:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "La valeur dépasse l'échelle des entiers." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 #, 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:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "le paramètre « %s » ne peut pas être changé" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7698 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "le paramètre « %s » ne peut pas être modifié maintenant" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11357 +#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 +#: utils/misc/guc.c:11796 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "droit refusé pour initialiser le paramètre « %s »" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7763 #, 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:7487 +#: utils/misc/guc.c:7822 #, 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:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9574 -#, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" +#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10002 +#, 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 "doit être super-utilisateur ou membre de pg_read_all_settings pour examiner « %s »" -#: utils/misc/guc.c:8251 +#: utils/misc/guc.c:8606 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s prend un seul argument" -#: utils/misc/guc.c:8499 -#, 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:8886 +#, fuzzy, c-format +#| msgid "permission denied for operator %s" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "droit refusé pour l'opérateur %s" -#: utils/misc/guc.c:8580 +#: utils/misc/guc.c:8953 #, 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:8625 +#: utils/misc/guc.c:8998 #, 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:8782 +#: utils/misc/guc.c:9172 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT n'est pas implémenté" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9259 #, c-format msgid "SET requires parameter name" msgstr "SET requiert le nom du paramètre" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9392 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "tentative de redéfinition du paramètre « %s »" -#: utils/misc/guc.c:10804 +#: utils/misc/guc.c:9719 +#, fuzzy, c-format +#| msgid "invalid configuration parameter name \"%s\"" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "paramètre de configuration « %s » invalide" + +#: utils/misc/guc.c:9721 +#, fuzzy, c-format +#| msgid "\"%s\" is not a regular file" +msgid "\"%s\" is now a reserved prefix." +msgstr "« %s » n'est pas un fichier standard" + +#: utils/misc/guc.c:11236 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "lors de la configuration du paramètre « %s » en « %s »" -#: utils/misc/guc.c:10969 +#: utils/misc/guc.c:11405 #, c-format msgid "parameter \"%s\" could not be set" msgstr "le paramètre « %s » n'a pas pu être configuré" -#: utils/misc/guc.c:11061 +#: utils/misc/guc.c:11497 #, 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:11419 utils/misc/guc.c:11453 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "valeur invalide pour le paramètre « %s » : %d" - -#: utils/misc/guc.c:11487 +#: utils/misc/guc.c:11928 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valeur invalide pour le paramètre « %s » : %g" -#: utils/misc/guc.c:11774 +#: utils/misc/guc.c:12241 #, 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:11786 +#: utils/misc/guc.c:12253 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour n'est pas supporté dans cette installation" -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12266 #, c-format msgid "SSL is not supported by this build" msgstr "SSL n'est pas supporté dans cette installation" -#: utils/misc/guc.c:11811 +#: utils/misc/guc.c:12278 #, 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:11823 +#: utils/misc/guc.c:12290 #, 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:12053 +#: utils/misc/guc.c:12520 #, 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:12066 +#: utils/misc/guc.c:12533 #, 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:12080 +#: utils/misc/guc.c:12547 #, 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:12094 -#, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." +#: utils/misc/guc.c:12559 +#, 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 doit être positionné à 0 sur les plateformes où POLLRDHUP manque" -#: utils/misc/guc.c:12222 +#: utils/misc/guc.c:12671 #, c-format msgid "invalid character" msgstr "caractère invalide" -#: utils/misc/guc.c:12282 +#: utils/misc/guc.c:12731 #, 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:12322 +#: utils/misc/guc.c:12771 #, c-format msgid "multiple recovery targets specified" msgstr "multiples cibles de restauration spécifiées" -#: utils/misc/guc.c:12323 +#: utils/misc/guc.c:12772 #, 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:12331 +#: utils/misc/guc.c:12780 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "La seule valeur autorisée est « immediate »." @@ -28188,12 +30090,8 @@ msgstr "La seule valeur autorisée est « immediate »." msgid "internal error: unrecognized run-time parameter type\n" msgstr "erreur interne : type de paramètre d'exécution non reconnu\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "une ligne de sortie spécifiée à la requête et un type de sortie de fonction ne sont pas compatibles" - -#: utils/misc/pg_controldata.c:63 utils/misc/pg_controldata.c:143 utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 +#: utils/misc/pg_controldata.c:63 utils/misc/pg_controldata.c:143 +#: utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 #, c-format 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" @@ -28213,7 +30111,7 @@ msgstr "la requête pourrait être affectée par une politique de sécurité au msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Pour désactiver la politique pour le propriétaire de la table, utilisez ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "ne peut pas ajouter plus de raisons de timeout" @@ -28295,7 +30193,7 @@ msgstr "" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE sans nom de fichier dans le fichier des fuseaux horaires « %s », ligne %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Échec lors de la création du contexte mémoire « %s »." @@ -28305,7 +30203,10 @@ 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: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 +#: 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 »." @@ -28315,97 +30216,104 @@ msgstr "Échec d'une requête de taille %zu dans le contexte mémoire « %s »." msgid "logging memory contexts of PID %d" msgstr "trace des contextes mémoires du PID %d" -#: utils/mmgr/portalmem.c:187 +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "le curseur « %s » existe déjà" -#: utils/mmgr/portalmem.c:191 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "fermeture du curseur existant « %s »" -#: utils/mmgr/portalmem.c:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "le portail « %s » ne peut pas être exécuté de nouveau" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "ne peut pas supprimer le portail épinglé « %s »" -#: utils/mmgr/portalmem.c:487 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "ne peut pas supprimer le portail actif « %s »" -#: utils/mmgr/portalmem.c:738 +#: utils/mmgr/portalmem.c:739 #, 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:1279 +#: utils/mmgr/portalmem.c:1232 #, 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" -#: 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 "n'a pas pu se positionner sur le bloc %ld du fichier temporaire" -#: 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 "n'a pas pu lire le bloc %ld du fichier temporaire : a lu seulement %zu octets sur %zu" -#: 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 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "n'a pas pu lire le fichier temporaire tuplestore partagé : %m" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "tronçon non attendu dans le fichier temporaire tuplestore partagé" -#: utils/sort/sharedtuplestore.c:570 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "n'a pas pu lire le bloc %u dans le fichier temporaire tuplestore partagé" -#: utils/sort/sharedtuplestore.c:577 +#: utils/sort/sharedtuplestore.c:579 #, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "n'a pas pu lire le fichier temporaire tuplestore partagé : a lu seulement %zu octets sur %zu" -#: utils/sort/tuplesort.c:3218 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "ne peut pas avoir plus de %d exécutions pour un tri externe" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "n'a pas pu créer l'index unique « %s »" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "La clé %s est dupliquée." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Des clés dupliquées existent." -#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 utils/sort/tuplestore.c:1330 +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 +#: utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 +#: utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 +#: utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 +#: utils/sort/tuplestore.c:1330 #, c-format msgid "could not seek in tuplestore temporary file" msgstr "n'a pas pu se déplacer dans le fichier temporaire tuplestore" -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 utils/sort/tuplestore.c:1548 +#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 +#: utils/sort/tuplestore.c:1548 #, c-format msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "n'a pas pu lire le fichier temporaire tuplestore : a lu seulement %zu octets sur %zu" @@ -28420,7 +30328,12 @@ msgstr "La transaction source n'est plus en cours d'exécution." msgid "cannot export a snapshot from a subtransaction" msgstr "ne peut pas exporter un snapshot dans un sous-transaction" -#: 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 +#: 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 "données invalides du snapshot dans le fichier « %s »" @@ -28469,24 +30382,100 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" #~ msgstr " -o OPTIONS passe « OPTIONS » à chaque processus serveur (obsolète)\n" +#, c-format +#~ msgid " -x NUM internal use\n" +#~ msgstr " -x NUM utilisation interne\n" + #~ msgid " in schema %s" #~ msgstr " dans le schéma %s" #~ msgid "\"%s\" has now caught up with upstream server" #~ msgstr "« %s » a maintenant rattrapé le serveur en amont" +#, c-format +#~ msgid "\"%s\" is a system table" +#~ msgstr "« %s » est une table système" + #~ msgid "\"%s\" is already an attribute of type %s" #~ msgstr "« %s » est déjà un attribut du type %s" #~ msgid "\"%s\" is not a table or a view" #~ msgstr "« %s » n'est pas une table ou une vue" +#, c-format +#~ msgid "\"%s\" is not a table or foreign table" +#~ msgstr "« %s » n'est ni une table ni une table distante" + +#, c-format +#~ msgid "\"%s\" is not a table or partitioned index" +#~ msgstr "« %s » n'est ni une table ni un index partitionné" + +#, c-format +#~ msgid "\"%s\" is not a table or view" +#~ msgstr "« %s » n'est ni une table ni une vue" + +#, 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" + #~ 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" +#, 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" + +#, 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é" + +#, 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" + +#, 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" + +#, 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" + +#, 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" + +#, c-format +#~ msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" +#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un type composite, ni une table distante" + +#, 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" + +#, 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" + +#, 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" + #~ msgid "\"%s\" is not a table, view, or composite type" #~ msgstr "« %s » n'est pas une table, une vue ou un type composite" +#, 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" + +#, 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" + +#, c-format +#~ msgid "\"%s\" is of the wrong type" +#~ msgstr "« %s » est du mauvais type" + #~ 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" @@ -28496,9 +30485,17 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "\"%s\": removed %d dead item identifiers in %u pages" #~ msgstr "« %s »: %d versions de lignes mortes supprimées dans %u blocs" +#, c-format +#~ msgid "\"%s.%s\" is a foreign table." +#~ msgstr "« %s.%s » est une table distante." + #~ msgid "\"%s.%s\" is a partitioned table." #~ msgstr "« %s.%s » est une table partitionnée." +#, c-format +#~ msgid "\"%s.%s\" is not a table." +#~ msgstr "« %s.%s » n'est pas une table." + #~ msgid "\"TZ\"/\"tz\" not supported" #~ msgstr "« TZ »/« tz » non supporté" @@ -28508,6 +30505,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "\"interval\" time zone \"%s\" not valid" #~ msgstr "le fuseau horaire « %s » n'est pas valide pour le type « interval »" +#, c-format +#~ msgid "\"time with time zone\" units \"%s\" not recognized" +#~ msgstr "unités « %s » non reconnues pour le type « time with time zone »" + +#, c-format +#~ msgid "\"time\" units \"%s\" not recognized" +#~ msgstr "unités « %s » non reconnues pour le type « time »" + #~ msgid "\"timeout\" must not be negative or zero" #~ msgstr "« timeout » ne doit pas être négatif ou nul" @@ -28542,6 +30547,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "%u pages sont entièrement vides.\n" #~ "%s." +#, 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" + #~ msgid "%s \"%s\": return code %d" #~ msgstr "%s « %s » : code de retour %d" @@ -28648,6 +30657,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "%s : le nombre de tampons (-B) doit être au moins deux fois le nombre de\n" #~ "connexions disponibles (-N) et au moins 16\n" +#, 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" + #~ msgid "%u page is entirely empty.\n" #~ msgid_plural "%u pages are entirely empty.\n" #~ msgstr[0] "%u page est entièrement vide.\n" @@ -28734,14 +30749,28 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "August" #~ msgstr "Août" +#~ msgid "Automatic log file rotation will occur after N kilobytes." +#~ msgstr "La rotation automatique des journaux applicatifs s'effectuera après N kilooctets." + +#~ msgid "Automatic log file rotation will occur after N minutes." +#~ msgstr "La rotation automatique des journaux applicatifs s'effectuera toutes les N minutes." + #~ msgid "Automatically adds missing table references to FROM clauses." #~ msgstr "" #~ "Ajoute automatiquement les références à la table manquant dans les clauses\n" #~ "FROM." +#, 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 "COPY BINARY is not supported to stdout or from stdin" #~ msgstr "COPY BINARY n'est pas supporté vers stdout ou à partir de stdin" +#, c-format +#~ msgid "COPY HEADER available only in CSV mode" +#~ msgstr "COPY HEADER disponible uniquement en mode CSV" + #~ msgid "CREATE TABLE AS cannot specify INTO" #~ msgstr "CREATE TABLE AS ne peut pas spécifier INTO" @@ -28776,6 +30805,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "Fermez les transactions ouvertes rapidement pour éviter des problèmes de\n" #~ "réinitialisation." +#, c-format +#~ msgid "Compile with --with-gssapi to use GSSAPI connections." +#~ msgstr "Compilez avec --with-gssapi pour utiliser les connexions GSSAPI." + +#, c-format +#~ msgid "Compile with --with-ssl to use SSL connections." +#~ msgstr "Compilez avec --with-ssl pour utiliser les connexions SSL." + #~ msgid "Connections and Authentication" #~ msgstr "Connexions et authentification" @@ -28816,6 +30853,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "December" #~ msgstr "Décembre" +#, c-format +#~ msgid "Did you mean to use pg_stop_backup('t')?" +#~ msgstr "Souhaitiez-vous utiliser pg_stop_backup('t') ?" + #~ 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" @@ -28846,6 +30887,11 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "Enables the planner's use of result caching." #~ msgstr "Active l'utilisation du cache de résultat par le planificateur." +#~ 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." + #~ msgid "Encrypt passwords." #~ msgstr "Chiffre les mots de passe." @@ -28867,16 +30913,33 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "February" #~ msgstr "Février" +#, 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." + +#, 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." + #~ msgid "File must be owned by the database user and must have no permissions for \"group\" or \"other\"." #~ 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." +#, 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 »." + #~ 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 "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." + #~ msgid "Found referenced table's DELETE trigger." #~ msgstr "Trigger DELETE de la table référencée trouvé." @@ -28907,6 +30970,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "GSSAPI not implemented on this server" #~ msgstr "GSSAPI non implémenté sur ce serveur" +#, c-format +#~ msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" +#~ msgstr "IDENTIFY_SYSTEM n'a pas été exécuté avant START_REPLICATION" + #~ msgid "INOUT arguments are permitted." #~ msgstr "les arguments INOUT ne sont pas autorisés." @@ -28938,6 +31005,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "d'exécution, supprimez le bloc de mémoire partagée\n" #~ "ou supprimez simplement le fichier « %s »." +#, 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." + #~ 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" @@ -29092,13 +31165,21 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "October" #~ msgstr "Octobre" +#, 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 "" +#~ "Une sauvegarde en ligne commencée avec pg_start_backup() doit se terminer avec\n" +#~ "pg_stop_backup() et tous les journaux de transactions générés entre les deux\n" +#~ "doivent être disponibles pour la restauration." + #~ msgid "Only superusers can use untrusted languages." #~ msgstr "" #~ "Seuls les super-utilisateurs peuvent utiliser des langages qui ne sont pas\n" #~ "de confiance." -#~ msgid "OpenSSL failure" -#~ msgstr "échec OpenSSL" +#, c-format +#~ msgid "Only tables can be added to publications." +#~ msgstr "Seules des tables peuvent être ajoutées aux publications." #~ msgid "PID %d is among the slowest backends." #~ msgstr "Le PID %d est parmi les processus serveur les plus lents." @@ -29163,6 +31244,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "Resource Usage" #~ msgstr "Utilisation des ressources" +#, c-format +#~ msgid "Run pg_stop_backup() and try again." +#~ msgstr "Exécutez pg_stop_backup() et tentez de nouveau." + #~ msgid "Runs the server silently." #~ msgstr "Lance le serveur de manière silencieuse." @@ -29258,11 +31343,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "Set dynamic_shared_memory_type to a value other than \"none\"." #~ msgstr "Configurez dynamic_shared_memory_type à une valeur autre que « none »." -#~ 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 "Sets immediate fsync at commit." #~ msgstr "Configure un fsync immédiat lors du commit." @@ -29301,6 +31381,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "Sets the regular expression \"flavor\"." #~ msgstr "Initialise l'expression rationnelle « flavor »." +#, 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, " + #~ msgid "Specify a USING expression to perform the conversion." #~ msgstr "Donnez une expression USING pour réaliser la conversion." @@ -29316,6 +31402,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "Sunday" #~ msgstr "Dimanche" +#, c-format +#~ msgid "System tables cannot be added to publications." +#~ msgstr "Les tables systèmes ne peuvent pas être ajoutées à une publication." + #~ msgid "Table contains duplicated values." #~ msgstr "La table contient des valeurs dupliquées." @@ -29583,6 +31673,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 "Waits N seconds on connection startup after authentication." +#~ msgstr "Attends N secondes après l'authentification." + +#~ msgid "Waits N seconds on connection startup before authentication." +#~ msgstr "Attends N secondes au lancement de la connexion avant l'authentification." + #~ msgid "Wed" #~ msgstr "Mer" @@ -29595,15 +31691,24 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "indiquer ENCRYPTED ou UNENCRYPTED, ce paramètre détermine si le mot de passe\n" #~ "doit être chiffré." +#~ 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." + #~ 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 "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." + #~ msgid "Write-Ahead Log" #~ msgstr "Write-Ahead Log" #~ msgid "Write-Ahead Log / Streaming Replication" #~ msgstr "Write-Ahead Log / Réplication en flux" +#~ msgid "Writes temporary statistics files to the specified directory." +#~ msgstr "Écrit les fichiers statistiques temporaires dans le répertoire indiqué." + #~ msgid "You can add the table partitions individually." #~ msgstr "Vous pouvez ajouter les partitions de table individuellement." @@ -29630,12 +31735,20 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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." +#, c-format +#~ msgid "You need to rebuild PostgreSQL using %s." +#~ msgstr "Vous devez recompiler PostgreSQL en utilisant %s." + #~ msgid "You need to rebuild PostgreSQL using --with-icu." #~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-icu." #~ msgid "You need to rebuild PostgreSQL using --with-libxml." #~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-libxml." +#, c-format +#~ msgid "a backup is already in progress" +#~ msgstr "une sauvegarde est déjà en cours" + #~ msgid "aborted" #~ msgstr "annulé" @@ -29721,9 +31834,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 "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 "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é" @@ -29768,6 +31878,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "autovacuum: processing database \"%s\"" #~ msgstr "autovacuum : traitement de la base de données « %s »" +#, c-format +#~ msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" +#~ msgstr "processus en tâche de fond « %s » : doit se lier à la mémoire partagée pour pouvoir demander une connexion à une base" + #~ msgid "backup label %s in file \"%s\"" #~ msgstr "label de sauvegarde %s dans le fichier « %s »" @@ -29777,6 +31891,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "backup timeline %u in file \"%s\"" #~ msgstr "timeline de sauvegarde %u dans le fichier « %s »" +#, c-format +#~ msgid "base backup could not send data, aborting backup" +#~ msgstr "la sauvegarde de base n'a pas pu envoyer les données, annulation de la sauvegarde" + #~ msgid "binary value is out of range for type bigint" #~ msgstr "la valeur binaire est en dehors des limites du type bigint" @@ -30061,9 +32179,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "cannot override frame clause of window \"%s\"" #~ msgstr "ne peut pas surcharger la frame clause du window « %s »" -#~ msgid "cannot reference partitioned table \"%s\"" -#~ msgstr "ne peut pas référencer la table partitionnée « %s »" - #~ 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" @@ -30202,6 +32317,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 »" +#, c-format +#~ msgid "collations with different collate and ctype values are not supported by ICU" +#~ msgstr "les collationnements avec des valeurs différentes pour le tri (collate) et le jeu de caractères (ctype) ne sont pas supportés par ICU" + #~ 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" @@ -30211,9 +32330,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "column \"%s\" has type \"unknown\"" #~ msgstr "la colonne « %s » est de type « unknown »" -#~ msgid "column \"%s\" referenced in statistics does not exist" -#~ msgstr "la colonne « %s » référencée dans les statistiques n'existe pas" - #, c-format #~ msgid "column alias list for \"%s\" has too many entries" #~ msgstr "la liste d'alias de colonnes pour « %s » a beaucoup trop d'entrées" @@ -30280,6 +32396,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "could not access root certificate file \"%s\": %m" #~ msgstr "n'a pas pu accéder au fichier du certificat racine « %s » : %m" +#, 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" + #~ msgid "could not change directory to \"%s\"" #~ msgstr "n'a pas pu accéder au répertoire « %s »" @@ -30310,8 +32430,8 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgstr "n'a pas pu terminer la poignée de main de renégotiation, trop d'échecs" #, c-format -#~ msgid "could not compute %s hash: %s" -#~ msgstr "n'a pas pu calculer le hachage %s : %s" +#~ msgid "could not connect socket for statistics collector: %m" +#~ msgstr "n'a pas pu connecter la socket au récupérateur de statistiques : %m" #~ msgid "could not create %s socket: %m" #~ msgstr "n'a pas pu créer le socket %s : %m" @@ -30328,11 +32448,19 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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" +#, 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" + #~ 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" +#, c-format +#~ msgid "could not delete shared fileset \"%s\": %m" +#~ msgstr "n'a pas pu supprimer l'ensemble de fichiers partagés « %s » : %m" + #~ msgid "could not determine actual result type for function declared to return type %s" #~ msgstr "" #~ "n'a pas pu déterminer le type du résultat actuel pour la fonction déclarant\n" @@ -30377,6 +32505,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "could not fork archiver: %m" #~ msgstr "n'a pas pu lancer le processus fils correspondant au processus d'archivage : %m" +#, 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" + #~ msgid "could not format \"circle\" value" #~ msgstr "n'a pas pu formater la valeur « circle »" @@ -30426,6 +32560,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" #~ "validation en deux phases : %m" +#, 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" + #~ 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" @@ -30494,6 +32632,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "could not parse transaction log location \"%s\"" #~ msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" +#, c-format +#~ msgid "could not poll socket: %m" +#~ msgstr "n'a pas pu interroger la socket : %m" + #~ msgid "could not read block %u of relation %s: %m" #~ msgstr "n'a pas pu lire le bloc %u de la relation %s : %m" @@ -30531,6 +32673,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "could not read relation mapping file \"%s\": %m" #~ msgstr "n'a pas pu lire le fichier de correspondance des relations « %s » : %m" +#, c-format +#~ msgid "could not read statistics message: %m" +#~ msgstr "n'a pas pu lire le message des statistiques : %m" + #~ msgid "could not read symbolic link \"%s\"" #~ msgstr "n'a pas pu lire le lien symbolique « %s »" @@ -30539,6 +32685,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "n'a pas pu lire le fichier d'état de la validation en deux phases nommé\n" #~ "« %s » : %m" +#, 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" + #~ 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" @@ -30576,6 +32728,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "could not reread block %d of file \"%s\": %m" #~ msgstr "n'a pas pu relire le bloc %d dans le fichier « %s » : %m" +#, c-format +#~ msgid "could not resolve \"localhost\": %s" +#~ msgstr "n'a pas pu résoudre « localhost » : %s" + #~ msgid "could not rmdir directory \"%s\": %m" #~ msgstr "n'a pas pu supprimer le répertoire « %s » : %m" @@ -30599,9 +32755,21 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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" +#, 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" + #~ msgid "could not set socket to blocking mode: %m" #~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %m" +#, 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" + #~ msgid "could not set statistics collector timer: %m" #~ msgstr "n'a pas pu configurer le timer du récupérateur de statistiques : %m" @@ -30667,6 +32835,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "database \"%s\" not found" #~ msgstr "base de données « %s » non trouvée" +#, c-format +#~ msgid "database hash table corrupted during cleanup --- abort" +#~ msgstr "" +#~ "corruption de la table hachée de la base de données lors du lancement\n" +#~ "--- annulation" + #~ msgid "database name cannot be qualified" #~ msgstr "le nom de la base de donnée ne peut être qualifié" @@ -30688,15 +32862,18 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "deferrable snapshot was unsafe; trying a new one" #~ msgstr "l'image déferrable est non sûre ; tentative avec une nouvelle image" -#~ msgid "destination buffer too small" -#~ msgstr "tampon de destination trop petit" - #~ msgid "directory \"%s\" is not empty" #~ msgstr "le répertoire « %s » n'est pas vide" #~ msgid "disabling huge pages" #~ msgstr "désactivation des Huge Pages" +#, 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" + #~ 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" @@ -30718,6 +32895,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "event trigger name cannot be qualified" #~ msgstr "le nom du trigger sur événement ne peut pas être qualifié" +#, c-format +#~ msgid "exclusive backup not in progress" +#~ msgstr "une sauvegarde exclusive n'est pas en cours" + #~ 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" @@ -30730,6 +32911,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "failed to drop all objects depending on %s" #~ msgstr "échec lors de la suppression de tous les objets dépendant de %s" +#, c-format +#~ msgid "fatal: " +#~ msgstr "fatal : " + #~ 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)" @@ -30763,15 +32948,36 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "function \"%s\" is an aggregate function" #~ msgstr "la fonction « %s » est une fonction d'agrégat" -#~ msgid "function \"%s\" is not a window function" -#~ msgstr "la fonction « %s » n'est pas une fonction window" - #~ msgid "function \"%s\" is not an aggregate function" #~ msgstr "la fonction « %s » n'est pas une fonction d'agrégat" #~ msgid "function \"%s\" must return type \"event_trigger\"" #~ msgstr "la fonction « %s » doit renvoyer le type « event_trigger »" +#, c-format +#~ msgid "function \"close_lb\" not implemented" +#~ msgstr "la fonction « close_lb » n'est pas implémentée" + +#, c-format +#~ msgid "function \"close_sl\" not implemented" +#~ msgstr "la fonction « close_sl » n'est pas implémentée" + +#, c-format +#~ msgid "function \"dist_bl\" not implemented" +#~ msgstr "fonction « dist_lb » non implémentée" + +#, c-format +#~ msgid "function \"dist_lb\" not implemented" +#~ msgstr "la fonction « dist_lb » n'est pas implémentée" + +#, c-format +#~ msgid "function \"path_center\" not implemented" +#~ msgstr "la fonction « path_center » n'est pas implémentée" + +#, c-format +#~ msgid "function \"poly_distance\" not implemented" +#~ msgstr "la fonction « poly_distance » n'est pas implémentée" + #~ msgid "function %s must return type \"fdw_handler\"" #~ msgstr "la fonction %s doit renvoyer le type « fdw_handler »" @@ -30886,6 +33092,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "incorrect hole size in record at %X/%X" #~ msgstr "taille du trou incorrect à l'enregistrement %X/%X" +#, 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" + #~ msgid "incorrect total length in record at %X/%X" #~ msgstr "longueur totale incorrecte à l'enregistrement %X/%X" @@ -30931,9 +33143,21 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "insufficient shared memory for free space map" #~ msgstr "mémoire partagée insuffisante pour la structure FSM" +#, c-format +#~ msgid "int2vector has too many elements" +#~ msgstr "int2vector a trop d'éléments" + #~ msgid "interval precision specified twice" #~ msgstr "précision d'intervalle spécifiée deux fois" +#, c-format +#~ msgid "interval units \"%s\" not recognized" +#~ msgstr "les unités « %s » ne sont pas reconnues pour le type interval" + +#, c-format +#~ msgid "interval units \"%s\" not supported" +#~ msgstr "les unités « %s » ne sont pas supportées pour le type interval" + #~ msgid "invalid LC_CTYPE setting" #~ msgstr "paramètre LC_CTYPE invalide" @@ -30950,6 +33174,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "invalid backup block size in record at %X/%X" #~ msgstr "taille du bloc de sauvegarde invalide dans l'enregistrement à %X/%X" +#, c-format +#~ msgid "invalid compressed image at %X/%X, block %d" +#~ msgstr "image compressée invalide à %X/%X, bloc %d" + #~ msgid "invalid concatenation of jsonb objects" #~ msgstr "concaténation invalide d'objets jsonb" @@ -30961,9 +33189,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "longueur invalide du « contrecord » %u dans le journal de tranasctions %u,\n" #~ "segment %u, décalage %u" -#~ msgid "invalid database name \"%s\"" -#~ msgstr "nom de base de données « %s » invalide" - #~ msgid "invalid entry in file \"%s\" at line %d, token \"%s\"" #~ msgstr "entrée invalide dans le fichier « %s » à la ligne %d, jeton « %s »" @@ -31054,6 +33279,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "invalid length of secondary checkpoint record" #~ msgstr "longueur invalide de l'enregistrement secondaire du point de vérification" +#, c-format +#~ msgid "invalid list syntax for \"publish\" option" +#~ msgstr "syntaxe de liste invalide pour l'option « publish »" + #~ msgid "invalid list syntax for \"unix_socket_directories\"" #~ msgstr "syntaxe de liste invalide pour le paramètre « unix_socket_directories »" @@ -31063,9 +33292,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "invalid list syntax for parameter \"log_destination\"" #~ msgstr "syntaxe de liste invalide pour le paramètre « log_destination »" -#~ msgid "invalid logical replication message type \"%c\"" -#~ msgstr "type de message « %c » de la réplication logique invalide" - #~ msgid "invalid ndistinct magic %08x (expected %08x)" #~ msgstr "nombre magique ndistinct invalide %08x (attendu %08x)" @@ -31170,9 +33396,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "loaded library \"%s\"" #~ msgstr "bibliothèque « %s » chargée" -#~ msgid "local user with ID %d does not exist" -#~ msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" - #~ msgid "log_restartpoints = %s" #~ msgstr "log_restartpoints = %s" @@ -31239,6 +33462,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "missing assignment operator" #~ msgstr "opérateur d'affectation manquant" +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "contrecord manquant à %X/%X" + #~ msgid "missing data for OID column" #~ msgstr "données manquantes pour la colonne OID" @@ -31263,6 +33490,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "multiple constraints named \"%s\" were dropped" #~ msgstr "les contraintes multiples nommées « %s » ont été supprimées" +#, c-format +#~ msgid "must be a superuser to log memory contexts" +#~ msgstr "doit être super-utilisateur pour tracer les contextes mémoires" + #~ 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" @@ -31282,6 +33513,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "must be superuser to alter replication users" #~ msgstr "doit être super-utilisateur pour modifier des utilisateurs ayant l'attribut réplication" +#, c-format +#~ msgid "must be superuser to call pg_nextoid()" +#~ msgstr "doit être un super-utilisateur pour appeller pg_nextoid()" + #~ msgid "must be superuser to comment on procedural language" #~ msgstr "" #~ "doit être super-utilisateur pour ajouter un commentaire sur un langage de\n" @@ -31297,6 +33532,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "doit être super-utilisateur pour ajouter un commentaire sur un modèle de\n" #~ "recherche plein texte" +#, c-format +#~ msgid "must be superuser to connect during database shutdown" +#~ msgstr "" +#~ "doit être super-utilisateur pour se connecter pendant un arrêt de la base de\n" +#~ "données" + #~ msgid "must be superuser to control recovery" #~ msgstr "doit être super-utilisateur pour contrôler la restauration" @@ -31317,6 +33558,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "must be superuser to drop text search templates" #~ msgstr "doit être super-utilisateur pour supprimer des modèles de recherche plein texte" +#, c-format +#~ msgid "must be superuser to execute ALTER SYSTEM command" +#~ msgstr "doit être super-utilisateur pour exécuter la commande ALTER SYSTEM" + #~ msgid "must be superuser to get directory listings" #~ msgstr "doit être super-utilisateur pour obtenir le contenu du répertoire" @@ -31337,9 +33582,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "must be superuser to signal the postmaster" #~ msgstr "doit être super-utilisateur pour envoyer un signal au postmaster" -#~ msgid "must be superuser to switch transaction log files" -#~ msgstr "doit être super-utilisateur pour changer de journal de transactions" - #~ msgid "must be superuser to use server-side lo_export()" #~ msgstr "doit être super-utilisateur pour utiliser lo_export() du côté serveur" @@ -31349,9 +33591,19 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "must call json_populate_recordset on an array of objects" #~ msgstr "doit appeler json_populate_recordset sur un tableau d'objets" +#, 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 input type is an array" #~ msgstr "aucun type de données n'est un tableau" +#, c-format +#~ msgid "new replication connections are not allowed during database shutdown" +#~ msgstr "" +#~ "les nouvelles connexions pour la réplication ne sont pas autorisées pendant\n" +#~ "l'arrêt du serveur de base de données" + #~ msgid "next MultiXactId: %u; next MultiXactOffset: %u" #~ msgstr "prochain MultiXactId : %u ; prochain MultiXactOffset : %u" @@ -31371,6 +33623,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "no such savepoint" #~ msgstr "aucun point de sauvegarde" +#, c-format +#~ msgid "non-exclusive backup in progress" +#~ msgstr "une sauvegarde non exclusive est en cours" + +#, c-format +#~ msgid "non-exclusive backup is not in progress" +#~ msgstr "une sauvegarde non exclusive n'est pas en cours" + #~ msgid "not enough data in file \"%s\"" #~ msgstr "données insuffisantes dans le fichier « %s »" @@ -31405,6 +33665,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "off" #~ msgstr "désactivé" +#, c-format +#~ msgid "oidvector has too many elements" +#~ msgstr "oidvector a trop d'éléments" + #~ msgid "oldest MultiXactId member is at offset %u" #~ msgstr "le membre le plus ancien du MultiXactId est au décalage %u" @@ -31416,6 +33680,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "on" #~ msgstr "activé" +#, c-format +#~ msgid "online backup mode canceled" +#~ msgstr "mode de sauvegarde en ligne annulé" + +#, c-format +#~ msgid "online backup mode was not canceled" +#~ msgstr "le mode de sauvegarde en ligne n'a pas été annulé" + #~ 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" @@ -31433,15 +33705,16 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "operator procedure must be specified" #~ msgstr "la procédure de l'opérateur doit être spécifiée" +#, 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" + #~ 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 "parameter \"recovery_target_inclusive\" requires a Boolean value" #~ msgstr "le paramètre « recovery_target_inclusive » requiert une valeur booléenne" @@ -31508,6 +33781,22 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "la requête nécessite un parcours complet, ce qui n'est pas supporté par les\n" #~ "index GIN" +#, c-format +#~ msgid "query-specified return tuple and function return type are not compatible" +#~ msgstr "une ligne de sortie spécifiée à la requête et un type de sortie de fonction ne sont pas compatibles" + +#, c-format +#~ msgid "range_agg must be called with a range" +#~ msgstr "range_agg doit être appelé avec un intervalle" + +#, c-format +#~ msgid "range_intersect_agg must be called with a multirange" +#~ msgstr "range_intersect_agg doit être appelé avec un multirange" + +#, c-format +#~ msgid "range_intersect_agg must be called with a range" +#~ msgstr "range_intersect_agg doit être appelé avec un range" + #~ msgid "received password packet" #~ msgstr "paquet du mot de passe reçu" @@ -31541,6 +33830,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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" +#, c-format +#~ msgid "reference to parent directory (\"..\") not allowed" +#~ msgstr "référence non autorisée au répertoire parent (« .. »)" + +#, c-format +#~ msgid "referenced relation \"%s\" is not a table or foreign table" +#~ msgstr "la relation référencée « %s » n'est ni une table ni une table distante" + #~ msgid "regexp_split_to_array does not support the global option" #~ msgstr "regexp_split_to_array ne supporte pas l'option globale" @@ -31570,6 +33867,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "relation « %s », TID %u/%u : ligne morte mise à jour par HOT --- n'a pas pu\n" #~ "diminuer la taille de la relation" +#, 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" + #~ msgid "relation \"%s\" page %u is uninitialized --- fixing" #~ msgstr "relation « %s » : la page %u n'est pas initialisée --- correction en cours" @@ -31611,9 +33912,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 "resetting unlogged relations: cleanup %d init %d" -#~ msgstr "réinitialisation des relations non tracées : nettoyage %d initialisation %d" - #~ msgid "restartpoint_command = '%s'" #~ msgstr "restartpoint_command = '%s'" @@ -31641,6 +33939,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "select() failed in logger process: %m" #~ msgstr "échec de select() dans le processus des journaux applicatifs : %m" +#, c-format +#~ msgid "select() failed in statistics collector: %m" +#~ msgstr "échec du select() dans le récupérateur de statistiques : %m" + #~ msgid "select() failed: %m" #~ msgstr "échec de select() : %m" @@ -31742,6 +34044,17 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "starting logical replication worker for subscription \"%s\"" #~ msgstr "lancement du processus worker de réplication logique pour la souscription « %s »" +#~ msgid "statistics collector process" +#~ msgstr "processus de récupération des statistiques" + +#, 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" + +#, 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" + #~ msgid "streaming replication successfully connected to primary" #~ msgstr "réplication de flux connecté avec succès au serveur principal" @@ -31768,9 +34081,6 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 "success" -#~ msgstr "succès" - #~ msgid "syntax error in recovery command file: %s" #~ msgstr "erreur de syntaxe dans le fichier de restauration : %s" @@ -31786,6 +34096,10 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "system usage: %s\n" #~ msgstr "utilisation du système : %s\n" +#, c-format +#~ msgid "table \"%s\" cannot be replicated" +#~ msgstr "la table « %s » ne peut pas être répliquée" + #~ msgid "table \"%s\" does not have OIDs" #~ msgstr "la table « %s » n'a pas d'OID" @@ -31795,6 +34109,14 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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" +#, c-format +#~ 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" + +#, c-format +#~ 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" + #~ msgid "table \"%s.%s\" added to subscription \"%s\"" #~ msgstr "table « %s.%s » ajoutée à la souscription « %s »" @@ -31817,6 +34139,12 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "arrêt du processus walreceiver pour forcer le serveur standby en cascade à\n" #~ "mettre à jour la timeline et à se reconnecter" +#, 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" + #~ msgid "there are multiple rules named \"%s\"" #~ msgstr "il existe de nombreuses règles nommées « %s »" @@ -31842,9 +34170,29 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ "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" +#, c-format +#~ msgid "timestamp units \"%s\" not recognized" +#~ msgstr "les unité « %s » ne sont pas reconnues pour le type timestamp" + +#, c-format +#~ msgid "timestamp units \"%s\" not supported" +#~ msgstr "les unités timestamp « %s » ne sont pas supportées" + +#, 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 »" + +#, 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 »" + #~ msgid "too few arguments for format" #~ msgstr "trop peu d'arguments pour le format" +#, c-format +#~ msgid "too many range table entries" +#~ msgstr "trop d'enregistrements dans la table range" + #~ msgid "transaction ID " #~ msgstr "ID de transaction " @@ -31868,8 +34216,9 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ 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 "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" +#, c-format +#~ msgid "trying another address for the statistics collector" +#~ msgstr "nouvelle tentative avec une autre adresse pour le récupérateur de statistiques" #~ 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" @@ -31935,12 +34284,20 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "unlogged operation performed, data may be missing" #~ msgstr "opération réalisée non tracée, les données pourraient manquer" +#, c-format +#~ msgid "unlogged sequences are not supported" +#~ msgstr "les séquences non tracées ne sont pas supportées" + #~ msgid "unrecognized \"datestyle\" key word: \"%s\"" #~ msgstr "mot clé « datestyle » non reconnu : « %s »" #~ msgid "unrecognized \"log_destination\" key word: \"%s\"" #~ msgstr "mot clé « log_destination » non reconnu : « %s »" +#, c-format +#~ msgid "unrecognized \"publish\" value: \"%s\"" +#~ msgstr "type « publish » non reconnu : « %s »" + #~ msgid "unrecognized error %d" #~ msgstr "erreur %d non reconnue" @@ -31985,9 +34342,23 @@ msgstr "ne peut pas importer un snapshot à partir d'une base de données diffé #~ msgid "using previous checkpoint record at %X/%X" #~ msgstr "utilisation du précédent enregistrement d'un point de vérification à %X/%X" +#, 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" + +#, c-format +#~ msgid "utility statements cannot be prepared" +#~ msgstr "les instructions utilitaires ne peuvent pas être préparées" + #~ msgid "validating foreign key constraint \"%s\"" #~ msgstr "validation de la contraintes de clé étrangère « %s »" +#, c-format +#~ msgid "value \"%s\" is out of range for 8-bit integer" +#~ msgstr "la valeur « %s » est en dehors des limites des entiers sur 8 bits" + #~ msgid "value \"%s\" is out of range for type bigint" #~ msgstr "la valeur « %s » est en dehors des limites du type bigint" diff --git a/third_party/spanner_pg/src/backend/po/it.po b/third_party/spanner_pg/src/backend/po/it.po index 139d84b6..51b69431 100644 --- a/third_party/spanner_pg/src/backend/po/it.po +++ b/third_party/spanner_pg/src/backend/po/it.po @@ -15,11 +15,11 @@ # msgid "" msgstr "" -"Project-Id-Version: postgres (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:08+0000\n" -"PO-Revision-Date: 2018-10-16 02:25+0100\n" -"Last-Translator: Daniele Varrazzo \n" +"Project-Id-Version: postgres (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:12+0000\n" +"PO-Revision-Date: 2022-10-30 18:50+0100\n" +"Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" "MIME-Version: 1.0\n" @@ -27,265 +27,402 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 3.2.1\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/compression.c:130 ../common/compression.c:139 ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "questa build non supporta la compressione con %s" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "trovata una stringa vuota in cui era prevista un'opzione di compressione" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "opzione di compressione non riconosciuta: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "l'opzione di compressione \"%s\" richiede un valore" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "il valore per l'opzione di compressione \"%s\" deve essere un numero intero" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "l'algoritmo di compressione \"%s\" non accetta un livello di compressione" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "l'algoritmo di compressione \"%s\" prevede un livello di compressione compreso tra %d e %d (impostazione predefinita a %d)" + +#: ../common/compression.c:353 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "l'algoritmo di compressione \"%s\" non accetta un conteggio di lavoro" + +#: ../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 registrato" -#: ../common/controldata_utils.c:58 commands/copy.c:3146 -#: commands/extension.c:3330 utils/adt/genfile.c:151 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "apertura del file \"%s\" in lettura fallita: %m" -#: ../common/controldata_utils.c:62 -#, c-format -msgid "%s: could not open file \"%s\" for reading: %s\n" -msgstr "%s: apertura del file \"%s\" in lettura fallita: %s\n" - -#: ../common/controldata_utils.c:75 access/transam/timeline.c:347 -#: access/transam/xlog.c:3440 access/transam/xlog.c:10942 -#: access/transam/xlog.c:10955 access/transam/xlog.c:11380 -#: access/transam/xlog.c:11460 access/transam/xlog.c:11499 -#: access/transam/xlog.c:11542 access/transam/xlogfuncs.c:658 -#: access/transam/xlogfuncs.c:677 commands/extension.c:3340 libpq/hba.c:499 -#: replication/logical/origin.c:719 replication/logical/origin.c:749 -#: replication/logical/reorderbuffer.c:3294 replication/walsender.c:510 -#: storage/file/copydir.c:195 utils/adt/genfile.c:168 utils/adt/misc.c:944 +#: ../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:1178 access/transam/xlogrecovery.c:1270 access/transam/xlogrecovery.c:1307 access/transam/xlogrecovery.c:1367 backup/basebackup.c:1842 commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4926 replication/logical/snapbuild.c:1848 replication/logical/snapbuild.c:1890 replication/logical/snapbuild.c:1917 replication/slot.c:1772 replication/slot.c:1813 replication/walsender.c:658 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 "lettura del file \"%s\" fallita: %m" -#: ../common/controldata_utils.c:78 -#, c-format -msgid "%s: could not read file \"%s\": %s\n" -msgstr "%s: lettura del file \"%s\" fallita: %s\n" - -#: ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 access/transam/xlog.c:3212 access/transam/xlog.c:4027 backup/basebackup.c:1846 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1853 replication/logical/snapbuild.c:1895 replication/logical/snapbuild.c:1922 replication/slot.c:1776 replication/slot.c:1817 replication/walsender.c:663 utils/cache/relmapper.c:817 #, c-format -msgid "could not read file \"%s\": read %d of %d" -msgstr "lettura del file \"%s\" fallita: letti %d di %d" +msgid "could not read file \"%s\": read %d of %zu" +msgstr "lettura del file \"%s\" fallita: letti %d di %zu" -#: ../common/controldata_utils.c:90 +#: ../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:4738 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:4984 replication/logical/snapbuild.c:1757 replication/logical/snapbuild.c:1930 replication/slot.c:1663 replication/slot.c:1824 replication/walsender.c:673 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 "%s: could not read file \"%s\": read %d of %d\n" -msgstr "%s: lettura del file \"%s\" fallita: letti %d di %d\n" +msgid "could not close file \"%s\": %m" +msgstr "chiusura del file \"%s\" fallita: %m" -#: ../common/controldata_utils.c:112 +#: ../common/controldata_utils.c:124 msgid "byte ordering mismatch" msgstr "l'ordine dei byte non combacia" -#: ../common/controldata_utils.c:114 +#: ../common/controldata_utils.c:126 #, c-format msgid "" -"WARNING: possible byte ordering mismatch\n" +"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" +"the PostgreSQL installation would be incompatible with this data directory." msgstr "" -"ATTENZIONE: l'ordine dei byte non sembra combaciare\n" -"L'ordine dei byte usato per salvare il file di pg_control potrebbe non\n" -"combaciare con quello usato da questo programma. In questo caso i risultati\n" -"seguenti sarebbero errati e l'installazione di PostgreSQL sarebbe incompatibile\n" -"con questa directory dati.\n" +"possibile mancata corrispondenza dell'ordine dei byte\n" +"L'ordine dei byte utilizzato per memorizzare il file pg_control potrebbe non corrispondere a quello\n" +"utilizzato da questo programma. In tal caso i risultati seguenti non sarebbero corretti, e\n" +"l'installazione di PostgreSQL sarebbe incompatibile con questa directory di dati." + +#: ../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:4179 access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:852 backup/basebackup.c:522 backup/basebackup.c:1519 postmaster/syslogger.c:1560 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3581 replication/logical/reorderbuffer.c:4130 replication/logical/reorderbuffer.c:4906 replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:1819 replication/slot.c:1744 replication/walsender.c:631 +#: replication/walsender.c:2722 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:524 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:9001 utils/misc/guc.c:9050 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "apertura del file \"%s\" fallita: %m" + +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 access/transam/twophase.c:1745 access/transam/twophase.c:1754 access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 backup/basebackup_server.c:173 backup/basebackup_server.c:266 postmaster/postmaster.c:5631 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 utils/cache/relmapper.c:934 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "scrittura nel file \"%s\" fallita: %m" + +#: ../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:7973 access/transam/xlog.c:8016 +#: backup/basebackup_server.c:207 replication/logical/snapbuild.c:1750 replication/slot.c:1649 replication/slot.c:1754 storage/file/fd.c:737 storage/file/fd.c:3741 storage/smgr/md.c:975 storage/smgr/md.c:1016 storage/sync/sync.c:453 utils/cache/relmapper.c:949 utils/misc/guc.c:8770 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "fsync del file \"%s\" fallito: %m" + +#: ../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:568 lib/dshash.c:253 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:5927 replication/libpqwalreceiver/libpqwalreceiver.c:296 replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1437 storage/ipc/procarray.c:2249 storage/ipc/procarray.c:2256 storage/ipc/procarray.c:2759 storage/ipc/procarray.c:3390 utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 utils/adt/formatting.c:1977 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:5202 utils/misc/guc.c:5218 utils/misc/guc.c:5231 utils/misc/guc.c:8748 utils/misc/tzparser.c:476 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:238 +#, c-format +msgid "out of memory" +msgstr "memoria esaurita" + +#: ../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 "successo" -#: ../common/exec.c:127 ../common/exec.c:241 ../common/exec.c:284 +#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "buffer di destinazione troppo piccolo" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "Errore OpenSSL" + +#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 #, c-format -msgid "could not identify current directory: %s" -msgstr "identificazione della directory corrente fallita: %s" +msgid "could not identify current directory: %m" +msgstr "impossibile identificare la directory corrente: %m" -#: ../common/exec.c:146 +#: ../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "binario non valido \"%s\"" -#: ../common/exec.c:195 +#: ../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "lettura del binario \"%s\" fallita" -#: ../common/exec.c:202 +#: ../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "programma \"%s\" da eseguire non trovato" -#: ../common/exec.c:257 ../common/exec.c:293 +#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 #, c-format -msgid "could not change directory to \"%s\": %s" -msgstr "spostamento nella directory \"%s\" fallito: %s" +msgid "could not change directory to \"%s\": %m" +msgstr "spostamento nella directory \"%s\" fallito: %m" -#: ../common/exec.c:272 +#: ../common/exec.c:299 access/transam/xlog.c:8319 backup/basebackup.c:1339 utils/adt/misc.c:342 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "lettura del link simbolico \"%s\" fallita" +msgid "could not read symbolic link \"%s\": %m" +msgstr "lettura del link simbolico \"%s\" fallita: %m" -#: ../common/exec.c:523 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1662 storage/ipc/latch.c:1788 #, c-format -msgid "pclose failed: %s" -msgstr "pclose fallita: %s" +msgid "%s() failed: %m" +msgstr "%s() non riuscito: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/psprintf.c:181 ../port/path.c:632 -#: ../port/path.c:670 ../port/path.c:687 utils/misc/ps_status.c:171 -#: utils/misc/ps_status.c:179 utils/misc/ps_status.c:209 -#: utils/misc/ps_status.c:217 +#: ../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 "memoria esaurita\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 "impossibile duplicare il puntatore nullo (errore interno)\n" -#: ../common/file_utils.c:82 ../common/file_utils.c:186 +#: ../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 backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 postmaster/pgarch.c:603 replication/logical/snapbuild.c:1629 +#: 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 "non è stato possibile ottenere informazioni sul file \"%s\": %m" + +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 commands/tablespace.c:759 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 "apertura della directory \"%s\" fallita: %m" + +#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "lettura della directory \"%s\" fallita: %m" + +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1769 replication/slot.c:693 replication/slot.c:1535 replication/slot.c:1677 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 "non è stato possibile rinominare il file \"%s\" in \"%s\": %m" + +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "errore interno" + +#: ../common/jsonapi.c:1075 +#, c-format +msgid "Escape sequence \"\\%s\" is invalid." +msgstr "La sequenza di escape \"\\%s\" non è valida." + +#: ../common/jsonapi.c:1078 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Il carattere con valore 0x%02x deve essere sottoposto ad escape." + +#: ../common/jsonapi.c:1081 #, c-format -msgid "%s: could not stat file \"%s\": %s\n" -msgstr "\"%s: lettura informazioni sul file \"%s\" fallita: %s\n" +msgid "Expected end of input, but found \"%s\"." +msgstr "Era prevista la fine dell'input, trovato \"%s\" invece." -#: ../common/file_utils.c:162 +#: ../common/jsonapi.c:1084 #, c-format -msgid "%s: could not open directory \"%s\": %s\n" -msgstr "%s: apertura della directory \"%s\" fallita: %s\n" +msgid "Expected array element or \"]\", but found \"%s\"." +msgstr "Era previsto un elemento di array oppure \"]\", trovato \"%s\" invece." -#: ../common/file_utils.c:198 +#: ../common/jsonapi.c:1087 #, c-format -msgid "%s: could not read directory \"%s\": %s\n" -msgstr "%s: lettura della directory \"%s\" fallita: %s\n" +msgid "Expected \",\" or \"]\", but found \"%s\"." +msgstr "Era previsto \",\" oppure \"]\", trovato \"%s\" invece." -#: ../common/file_utils.c:231 ../common/file_utils.c:291 -#: ../common/file_utils.c:367 +#: ../common/jsonapi.c:1090 #, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: apertura del file \"%s\" fallita: %s\n" +msgid "Expected \":\", but found \"%s\"." +msgstr "Era previsto \":\", trovato \"%s\" invece." -#: ../common/file_utils.c:304 ../common/file_utils.c:376 +#: ../common/jsonapi.c:1093 #, c-format -msgid "%s: could not fsync file \"%s\": %s\n" -msgstr "%s: sincronizzazione del file \"%s\" fallita: %s\n" +msgid "Expected JSON value, but found \"%s\"." +msgstr "Era previsto un valore JSON, trovato \"%s\" invece." + +#: ../common/jsonapi.c:1096 +msgid "The input string ended unexpectedly." +msgstr "La stringa di input è terminata inaspettatamente." -#: ../common/file_utils.c:387 +#: ../common/jsonapi.c:1098 #, c-format -msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -msgstr "%s: rinominazione del file \"%s\" in \"%s\" fallita: %s\n" +msgid "Expected string or \"}\", but found \"%s\"." +msgstr "Era prevista una stringa oppure \"}\", trovato \"%s\" invece." -#: ../common/pgfnames.c:45 +#: ../common/jsonapi.c:1101 #, c-format -msgid "could not open directory \"%s\": %s\n" -msgstr "apertura della directory \"%s\" fallita: %s\n" +msgid "Expected \",\" or \"}\", but found \"%s\"." +msgstr "Era previsto \",\" oppure \"}\", trovato \"%s\" invece." -#: ../common/pgfnames.c:72 +#: ../common/jsonapi.c:1104 #, c-format -msgid "could not read directory \"%s\": %s\n" -msgstr "lettura della directory \"%s\" fallita: %s\n" +msgid "Expected string, but found \"%s\"." +msgstr "Era prevista una stringa, trovato \"%s\" invece." -#: ../common/pgfnames.c:84 +#: ../common/jsonapi.c:1107 #, c-format -msgid "could not close directory \"%s\": %s\n" -msgstr "chiusura della directory \"%s\" fallita: %s\n" +msgid "Token \"%s\" is invalid." +msgstr "Il token \"%s\" non è valido." -#: ../common/psprintf.c:179 ../port/path.c:630 ../port/path.c:668 -#: ../port/path.c:685 access/transam/twophase.c:1383 access/transam/xlog.c:6482 -#: lib/dshash.c:246 lib/stringinfo.c:277 libpq/auth.c:1134 libpq/auth.c:1505 -#: libpq/auth.c:1573 libpq/auth.c:2091 postmaster/bgworker.c:337 -#: postmaster/bgworker.c:907 postmaster/postmaster.c:2390 -#: postmaster/postmaster.c:2412 postmaster/postmaster.c:3979 -#: postmaster/postmaster.c:4687 postmaster/postmaster.c:4762 -#: postmaster/postmaster.c:5454 postmaster/postmaster.c:5791 -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 -#: replication/logical/logical.c:174 storage/buffer/localbuf.c:436 -#: storage/file/fd.c:781 storage/file/fd.c:1219 storage/file/fd.c:1380 -#: storage/file/fd.c:2286 storage/ipc/procarray.c:1055 -#: storage/ipc/procarray.c:1543 storage/ipc/procarray.c:1550 -#: storage/ipc/procarray.c:1965 storage/ipc/procarray.c:2589 -#: utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 -#: utils/adt/formatting.c:1568 utils/adt/formatting.c:1690 -#: utils/adt/formatting.c:1813 utils/adt/pg_locale.c:468 -#: utils/adt/pg_locale.c:652 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:221 -#: utils/hash/dynahash.c:448 utils/hash/dynahash.c:557 -#: utils/hash/dynahash.c:1069 utils/mb/mbutils.c:365 utils/mb/mbutils.c:698 -#: utils/misc/guc.c:4231 utils/misc/guc.c:4247 utils/misc/guc.c:4260 -#: utils/misc/guc.c:7235 utils/misc/tzparser.c:468 utils/mmgr/aset.c:482 -#: utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:796 utils/mmgr/generation.c:249 -#: utils/mmgr/mcxt.c:796 utils/mmgr/mcxt.c:832 utils/mmgr/mcxt.c:870 -#: utils/mmgr/mcxt.c:908 utils/mmgr/mcxt.c:944 utils/mmgr/mcxt.c:975 -#: utils/mmgr/mcxt.c:1011 utils/mmgr/mcxt.c:1063 utils/mmgr/mcxt.c:1098 -#: utils/mmgr/mcxt.c:1133 utils/mmgr/slab.c:239 +#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 #, c-format -msgid "out of memory" -msgstr "memoria esaurita" +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 non può essere convertito in testo." -#: ../common/relpath.c:58 +#: ../common/jsonapi.c:1112 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" deve essere seguito da quattro cifre esadecimali." + +#: ../common/jsonapi.c:1115 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "I codici escape Unicode non possono essere usati per caratteri con codice superiore ad 007F quando l'encoding del server non è UTF8." + +#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 +#, c-format +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Un carattere surrogato alto Unicode non può seguire un altro surrogato alto." + +#: ../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 "Un carattere surrogato basso Unicode deve seguire un surrogato alto." + +#: ../common/logging.c:276 +#, c-format +msgid "error: " +msgstr "errore: " + +#: ../common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "avvertimento: " + +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "dettaglio: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "suggerimento: " + +#: ../common/pgfnames.c:74 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "impossibile chiudere la directory \"%s\": %m" + +#: ../common/relpath.c:61 #, c-format msgid "invalid fork name" -msgstr "Nome del fork non valido" +msgstr "nome del fork non valido" -#: ../common/relpath.c:59 +#: ../common/relpath.c:62 #, c-format msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Nomi di fork validi sono \"main\", \"fsm\", \"vm\" e \"init\"." -#: ../common/restricted_token.c:68 +#: ../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 "impossibile caricare la libreria \"%s\": codice di errore %lu" + +#: ../common/restricted_token.c:73 +#, c-format +msgid "cannot create restricted tokens on this platform: error code %lu" +msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu" + +#: ../common/restricted_token.c:82 #, c-format -msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -msgstr "%s: ATTENZIONE: non è possibile creare token ristretti su questa piattaforma\n" +msgid "could not open process token: error code %lu" +msgstr "impossibile aprire il token di processo: codice di errore %lu" -#: ../common/restricted_token.c:77 +#: ../common/restricted_token.c:97 #, c-format -msgid "%s: could not open process token: error code %lu\n" -msgstr "%s: apertura del token di processo fallita: codice di errore %lu\n" +msgid "could not allocate SIDs: error code %lu" +msgstr "impossibile allocare i SID: codice di errore %lu" -#: ../common/restricted_token.c:90 +#: ../common/restricted_token.c:119 #, c-format -msgid "%s: could not allocate SIDs: error code %lu\n" -msgstr "%s: allocazione dei SID fallita: codice di errore: %lu\n" +#| msgid "%s: could not create restricted token: error code %lu\n" +msgid "could not create restricted token: error code %lu" +msgstr "could not create restricted token: error code %lu" -#: ../common/restricted_token.c:110 +#: ../common/restricted_token.c:140 #, c-format -msgid "%s: could not create restricted token: error code %lu\n" -msgstr "%s: creazione del token ristretto fallita: codice di errore %lu\n" +msgid "could not start process for command \"%s\": error code %lu" +msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu" -#: ../common/restricted_token.c:132 +#: ../common/restricted_token.c:178 #, c-format -msgid "%s: could not start process for command \"%s\": error code %lu\n" -msgstr "%s: avvio del processo fallito per il comando \"%s\": codice di errore %lu\n" +msgid "could not re-execute with restricted token: error code %lu" +msgstr "impossibile rieseguire con token limitato: codice di errore %lu" -#: ../common/restricted_token.c:170 +#: ../common/restricted_token.c:193 #, c-format -msgid "%s: could not re-execute with restricted token: error code %lu\n" -msgstr "%s: ri-esecuzione con token ristretto fallita: codice di errore %lu\n" +msgid "could not get exit code from subprocess: error code %lu" +msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu" -#: ../common/restricted_token.c:186 +#: ../common/rmtree.c:79 backup/basebackup.c:1099 backup/basebackup.c:1275 #, c-format -msgid "%s: could not get exit code from subprocess: error code %lu\n" -msgstr "%s: lettura del codice di uscita del sottoprocesso fallita: codice di errore %lu\n" +msgid "could not stat file or directory \"%s\": %m" +msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m" -#: ../common/rmtree.c:77 +#: ../common/rmtree.c:101 ../common/rmtree.c:113 #, c-format -msgid "could not stat file or directory \"%s\": %s\n" -msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %s\n" +msgid "could not remove file or directory \"%s\": %m" +msgstr "impossibile rimuovere il file o la directory \"%s\": %m" + +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "non poteva codificare il sale" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "impossibile trovare la chiave esterna" -#: ../common/rmtree.c:104 ../common/rmtree.c:121 +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "impossibile trovare la chiave esterna" + +#: ../common/stringinfo.c:306 #, c-format -msgid "could not remove file or directory \"%s\": %s\n" -msgstr "rimozione del file o directory \"%s\" fallita: %s\n" +msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." +msgstr "Non è possibile aumentare il buffer della stringa contenente %d byte di altri %d byte." -#: ../common/saslprep.c:1093 +#: ../common/stringinfo.c:310 #, c-format -msgid "password too long" -msgstr "password troppo lunga" +msgid "" +"out of memory\n" +"\n" +"Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" +msgstr "" +"fuori dalla memoria\n" +"\n" +"Impossibile ingrandire il buffer di stringhe contenente %d byte di %d byte in più.\n" #: ../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "ID utente effettivo %ld non trovato: %s" +msgstr "utente con ID effettivo %ld non trovato: %s" -#: ../common/username.c:45 libpq/auth.c:2038 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "l'utente non esiste" @@ -309,32 +446,27 @@ msgstr "comando non trovato" msgid "child process exited with exit code %d" msgstr "processo figlio uscito con codice di uscita %d" -#: ../common/wait_error.c:61 +#: ../common/wait_error.c:62 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "processo figlio terminato da eccezione 0x%X" -#: ../common/wait_error.c:71 -#, c-format -msgid "child process was terminated by signal %s" -msgstr "processo figlio terminato da segnale %s" - -#: ../common/wait_error.c:75 +#: ../common/wait_error.c:66 #, c-format -msgid "child process was terminated by signal %d" -msgstr "processo figlio terminato da segnale %d" +msgid "child process was terminated by signal %d: %s" +msgstr "il processo figlio è stato terminato dal segnale %d: %s" -#: ../common/wait_error.c:80 +#: ../common/wait_error.c:72 #, c-format msgid "child process exited with unrecognized status %d" msgstr "processo figlio uscito con stato non riconosciuto %d" -#: ../port/chklocale.c:288 +#: ../port/chklocale.c:306 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "determinazione della codifica per il codeset \"%s\" fallita" -#: ../port/chklocale.c:409 ../port/chklocale.c:415 +#: ../port/chklocale.c:427 ../port/chklocale.c:433 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "non è stato possibile determinare una codifica per il locale \"%s\": il codeset è \"%s\"" @@ -359,38 +491,48 @@ msgstr "non è stato possibile ottenere la giunzione per \"%s\": %s" msgid "could not get junction for \"%s\": %s\n" msgstr "non è stato possibile ottenere la giunzione per \"%s\": %s\n" -#: ../port/open.c:111 +#: ../port/open.c:117 #, c-format msgid "could not open file \"%s\": %s" msgstr "apertura del file \"%s\" fallita: %s" -#: ../port/open.c:112 +#: ../port/open.c:118 msgid "lock violation" msgstr "violazione del lock" -#: ../port/open.c:112 +#: ../port/open.c:118 msgid "sharing violation" msgstr "violazione della condivisione" -#: ../port/open.c:113 +#: ../port/open.c:119 #, c-format msgid "Continuing to retry for 30 seconds." -msgstr "Si continuerà a provare per 30 secondi" +msgstr "Si continuerà a provare per 30 secondi." -#: ../port/open.c:114 +#: ../port/open.c:120 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Potrebbe esserci un programma di antivirus, backup o simili che interferisce sul sistema del database." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "determinazione della directory corrente fallita: %s\n" -#: ../port/strerror.c:25 +#: ../port/strerror.c:72 +#, c-format +msgid "operating system error %d" +msgstr "errore del sistema operativo %d" + +#: ../port/thread.c:100 ../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "impossibile cercare l'ID utente locale %d: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 #, c-format -msgid "unrecognized error %d" -msgstr "errore sconosciuto %d" +msgid "local user with ID %d does not exist" +msgstr "l'utente locale con ID %d non esiste" #: ../port/win32security.c:62 #, c-format @@ -407,220 +549,236 @@ msgstr "lettura del SID del gruppo PowerUsers fallita: codice di errore %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "errore nel controllo del token di appartenenza: codice di errore %lu\n" -#: access/brin/brin.c:200 +#: access/brin/brin.c:214 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "la richiesta di riassunzione dell'intervallo BRIN per l'indice \"%s\" pagina %u non è stata registrata" -#: access/brin/brin.c:877 access/brin/brin.c:954 access/gin/ginfast.c:1018 -#: access/transam/xlog.c:10354 access/transam/xlog.c:10881 -#: access/transam/xlogfuncs.c:286 access/transam/xlogfuncs.c:313 -#: access/transam/xlogfuncs.c:352 access/transam/xlogfuncs.c:373 -#: access/transam/xlogfuncs.c:394 access/transam/xlogfuncs.c:464 -#: access/transam/xlogfuncs.c:520 +#: access/brin/brin.c:1018 access/brin/brin.c:1119 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 "il ripristino è in corso" -#: access/brin/brin.c:878 access/brin/brin.c:955 +#: access/brin/brin.c:1019 access/brin/brin.c:1120 #, c-format msgid "BRIN control functions cannot be executed during recovery." -msgstr "le funzioni di controllo BRIN non possono essere eseguite durante il recupero." +msgstr "Le funzioni di controllo BRIN non possono essere eseguite durante il recupero." -#: access/brin/brin.c:886 access/brin/brin.c:963 +#: access/brin/brin.c:1024 access/brin/brin.c:1125 #, c-format -msgid "block number out of range: %s" -msgstr "numero di blocco fuori dall'intervallo consentito: %s" +msgid "block number out of range: %lld" +msgstr "numero di blocco fuori intervallo: %lld" -#: access/brin/brin.c:909 access/brin/brin.c:986 +#: access/brin/brin.c:1068 access/brin/brin.c:1151 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" non è un indice BRIN" -#: access/brin/brin.c:925 access/brin/brin.c:1002 +#: access/brin/brin.c:1084 access/brin/brin.c:1167 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "impossibile aprire la tabella padre dell'indice \"%s\"" + +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 access/brin/brin_minmax_multi.c:3008 access/brin/brin_minmax_multi.c:3151 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 "non è possibile accettare un valore del tipo %s" + +#: access/brin/brin_minmax_multi.c:2167 access/brin/brin_minmax_multi.c:2174 access/brin/brin_minmax_multi.c:2181 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 "could not open parent table of index %s" -msgstr "apertura della tabella dell'indice %s non riuscita" +msgid "interval out of range" +msgstr "il valore di interval è fuori dall'intervallo consentito" -#: access/brin/brin_pageops.c:77 access/brin/brin_pageops.c:363 -#: access/brin/brin_pageops.c:844 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1376 access/nbtree/nbtinsert.c:678 -#: access/nbtree/nbtsort.c:830 access/spgist/spgdoinsert.c:1957 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "la dimensione %zu della riga dell'indice supera il massimo %zu per l'indice \"%s\"" -#: access/brin/brin_revmap.c:382 access/brin/brin_revmap.c:388 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "indice BRIN corrotto: mappa di dominio inconsistente" -#: access/brin/brin_revmap.c:404 -#, c-format -msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" -msgstr "trovata tupla segnaposto avanzata nell'indice BRIN \"%s\", verrà cancellata" - -#: 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 "tipo di pagina inaspettato 0x%04X nell'indice BRIN \"%s\" blocco %u" -#: access/brin/brin_validate.c:116 access/gin/ginvalidate.c:149 -#: access/gist/gistvalidate.c:146 access/hash/hashvalidate.c:132 -#: access/nbtree/nbtvalidate.c:110 access/spgist/spgvalidate.c:165 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene la funzione %s con numero di supporto non valido %d" -#: access/brin/brin_validate.c:132 access/gin/ginvalidate.c:161 -#: access/gist/gistvalidate.c:158 access/hash/hashvalidate.c:115 -#: access/nbtree/nbtvalidate.c:122 access/spgist/spgvalidate.c:177 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene la funzione %s con signature errata per il numero di supporto %d" -#: access/brin/brin_validate.c:154 access/gin/ginvalidate.c:180 -#: access/gist/gistvalidate.c:178 access/hash/hashvalidate.c:153 -#: access/nbtree/nbtvalidate.c:142 access/spgist/spgvalidate.c:196 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene l'operatore %s con numero di strategia %d non valido" -#: access/brin/brin_validate.c:183 access/gin/ginvalidate.c:193 -#: access/hash/hashvalidate.c:166 access/nbtree/nbtvalidate.c:155 -#: access/spgist/spgvalidate.c:209 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene una specifica ORDER BY non valida per l'operatore %s" -#: access/brin/brin_validate.c:196 access/gin/ginvalidate.c:206 -#: access/gist/gistvalidate.c:226 access/hash/hashvalidate.c:179 -#: access/nbtree/nbtvalidate.c:168 access/spgist/spgvalidate.c:222 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene l'operatore %s con signature non valida" -#: access/brin/brin_validate.c:234 access/hash/hashvalidate.c:219 -#: access/nbtree/nbtvalidate.c:226 access/spgist/spgvalidate.c:249 +#: 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 "alla famiglia di operatori \"%s\" del metodo di accesso %s mancano operatori per i tipi %s e %s" -#: access/brin/brin_validate.c:244 +#: access/brin/brin_validate.c:246 #, c-format msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" msgstr "alla famiglia di operatori \"%s\" del metodo di accesso %s mancano funzioni di supporto per i tipi %s e %s" -#: access/brin/brin_validate.c:257 access/hash/hashvalidate.c:233 -#: access/nbtree/nbtvalidate.c:250 access/spgist/spgvalidate.c:282 +#: 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 "alla famiglia di operatori \"%s\" del metodo di accesso %s mancano operatori" -#: access/brin/brin_validate.c:268 access/gin/ginvalidate.c:247 -#: access/gist/gistvalidate.c:266 +#: 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 "alla famiglia di operatori \"%s\" del metodo di accesso %s manca la funzione di supporto %d" -#: access/common/heaptuple.c:1080 access/common/heaptuple.c:1796 +#: access/common/attmap.c:122 +#, c-format +msgid "Returned type %s does not match expected type %s in column %d." +msgstr "Il tipo restituito %s non corrisponde al tipo attesto %s nella colonna %d." + +#: access/common/attmap.c:150 +#, c-format +msgid "Number of returned columns (%d) does not match expected column count (%d)." +msgstr "Il numero di colonne restituito (%d) non coincide col numero di colonne atteso (%d)." + +#: access/common/attmap.c:229 access/common/attmap.c:241 +#, c-format +msgid "could not convert row type" +msgstr "conversione del tipo riga fallita" + +#: access/common/attmap.c:230 +#, c-format +msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." +msgstr "L'attributo \"%s\" di tipo %s non combacia con l'attributo corrispondente di tipo %s." + +#: access/common/attmap.c:242 +#, c-format +msgid "Attribute \"%s\" of type %s does not exist in type %s." +msgstr "L'attributo \"%s\" di tipo %s non esiste nel tipo %s." + +#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "il numero di colonne (%d) eccede il limite (%d)" -#: access/common/indextuple.c:63 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "il numero delle colonne dell'indice (%d) eccede il limite (%d)" -#: access/common/indextuple.c:179 access/spgist/spgutils.c:685 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "la riga dell'indice richiede %zu byte, la dimensione massima è %zu" -#: access/common/printtup.c:365 tcop/fastpath.c:180 tcop/fastpath.c:530 -#: tcop/postgres.c:1755 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "codice di formato non supportato: %d" -#: access/common/reloptions.c:568 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 +msgid "Valid values are \"on\", \"off\", and \"auto\"." +msgstr "I valori validi sono \"on\", \"off\" ed \"auto\"." + +#: access/common/reloptions.c:543 +msgid "Valid values are \"local\" and \"cascaded\"." +msgstr "Valori validi sono \"local\" e \"cascaded\"." + +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "è stato superato il limite per i tipi di parametro per la relazione definita dall'utente" -#: access/common/reloptions.c:849 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET non deve contenere valori per i parametri" -#: access/common/reloptions.c:881 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "parametro del namespace \"%s\" sconosciuto" -#: access/common/reloptions.c:1121 parser/parse_clause.c:277 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12996 +#, c-format +msgid "tables declared WITH OIDS are not supported" +msgstr "le tabelle dichiarate WITH OIDS non sono supportate" + +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "parametro \"%s\" non identificato" -#: access/common/reloptions.c:1151 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "parametro \"%s\" specificato più di una volta" -#: access/common/reloptions.c:1167 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "valore non valido per l'opzione booleana \"%s\": %s" -#: access/common/reloptions.c:1179 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "valore non valido per l'opzione intera \"%s\": %s" -#: access/common/reloptions.c:1185 access/common/reloptions.c:1205 +#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "il valore %s non rientra nei limiti previsti per l'opzione \"%s\"" -#: access/common/reloptions.c:1187 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "I valori validi sono quelli compresi fra \"%d\" e \"%d\"." -#: access/common/reloptions.c:1199 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "valore non valido per l'opzione in virgola mobile \"%s\": %s" -#: access/common/reloptions.c:1207 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "I valori validi sono quelli compresi fra \"%f\" e \"%f\"." -#: access/common/tupconvert.c:108 +#: access/common/reloptions.c:1663 #, c-format -msgid "Returned type %s does not match expected type %s in column %d." -msgstr "Il tipo restituito %s non corrisponde al tipo attesto %s nella colonna %d." - -#: access/common/tupconvert.c:136 -#, c-format -msgid "Number of returned columns (%d) does not match expected column count (%d)." -msgstr "il numero di colonne restituito (%d) non coincide col numero di colonne atteso (%d)" +msgid "invalid value for enum option \"%s\": %s" +msgstr "valore non valido per l'opzione enum \"%s\": %s" -#: access/common/tupconvert.c:329 +#: access/common/toast_compression.c:32 #, c-format -msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." -msgstr "L'attributo \"%s\" di tipo %s non combacia con l'attributo corrispondente di tipo %s." +msgid "compression method lz4 not supported" +msgstr "metodo di compressione lz4 non supportato" -#: access/common/tupconvert.c:341 +#: access/common/toast_compression.c:33 #, c-format -msgid "Attribute \"%s\" of type %s does not exist in type %s." -msgstr "L'attributo \"%s\" di tipo %s non esiste nel tipo %s." +msgid "This functionality requires the server to be built with lz4 support." +msgstr "Questa funzionalità richiede che il server sia costruito con il supporto lz4." -#: access/common/tupdesc.c:834 parser/parse_clause.c:819 -#: parser/parse_relation.c:1539 +#: access/common/tupdesc.c:825 parser/parse_clause.c:771 parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "la colonna \"%s\" non può essere dichiarata SETOF" @@ -635,82 +793,75 @@ msgstr "la lista di posting è troppo lunga" msgid "Reduce maintenance_work_mem." msgstr "Riduci maintenance_work_mem." -#: access/gin/ginfast.c:1019 +#: access/gin/ginfast.c:1036 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "La lista GIN in attesa non può essere completata durante il recupero." -#: access/gin/ginfast.c:1026 +#: access/gin/ginfast.c:1043 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" non è un indice GIN" -#: access/gin/ginfast.c:1037 +#: access/gin/ginfast.c:1054 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "non è possibile accedere ad indici temporanei di altre sessioni" -#: access/gin/ginscan.c:402 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#, c-format +msgid "failed to re-find tuple within index \"%s\"" +msgstr "non ho ritrovato la tupla nell'indice \"%s\"" + +#: access/gin/ginscan.c:431 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "i vecchi indici GIN non supportano le scansioni sull'intero indice né le ricerche di null" -#: access/gin/ginscan.c:403 +#: access/gin/ginscan.c:432 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Per correggere questo problema esegui REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:138 executor/execExpr.c:1867 -#: utils/adt/arrayfuncs.c:3789 utils/adt/arrayfuncs.c:6387 -#: utils/adt/rowtypes.c:935 +#: access/gin/ginutil.c:145 executor/execExpr.c:2165 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 "non è stato possibile trovare un operatore di confronto per il tipo %s" -#: access/gin/ginvalidate.c:93 access/gist/gistvalidate.c:93 -#: access/hash/hashvalidate.c:99 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene la funzione di supporto %s con tipi di input sinistro e destro diversi" -#: access/gin/ginvalidate.c:257 +#: access/gin/ginvalidate.c:260 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "alla classe di operatori \"%s\" del metodo di accesso %s manca la funzione di supporto %d o %d" -#: access/gist/gist.c:713 access/gist/gistvacuum.c:257 +#: 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 "la funzione di supporto numero %d non è valida per il metodo di accesso %s" + +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "l'indice \"%s\" contiene una tupla interna marcata come invalida" -#: access/gist/gist.c:715 access/gist/gistvacuum.c:259 +#: access/gist/gist.c:761 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 "Ciò è causato da una separazione di pagina incompleta al ripristino del crash prima dell'aggiornamento a PostgreSQL 9.1." -#: access/gist/gist.c:716 access/gist/gistutil.c:759 access/gist/gistutil.c:770 -#: access/gist/gistvacuum.c:260 access/hash/hashutil.c:241 -#: access/hash/hashutil.c:252 access/hash/hashutil.c:264 -#: access/hash/hashutil.c:285 access/nbtree/nbtpage.c:678 -#: access/nbtree/nbtpage.c:689 +#: access/gist/gist.c:762 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 "Si richiede l'esecuzione di REINDEX." -#: access/gist/gistbuild.c:250 -#, c-format -msgid "invalid value for \"buffering\" option" -msgstr "valore non valido per l'opzione \"buffering\"" - -#: access/gist/gistbuild.c:251 -#, c-format -msgid "Valid values are \"on\", \"off\", and \"auto\"." -msgstr "I valori validi sono \"on\", \"off\" ed \"auto\"." - -#: access/gist/gistbuildbuffers.c:778 utils/sort/logtape.c:255 +#: access/gist/gist.c:1176 #, c-format -msgid "could not write block %ld of temporary file: %m" -msgstr "scrittura del blocco %ld del file temporaneo fallita: %m" +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "correzione della divisione incompleta nell'indice \"%s\", blocco %u" #: access/gist/gistsplit.c:446 #, c-format @@ -722,45 +873,53 @@ msgstr "il metodo picksplit per la colonna %d dell'indice \"%s\" è fallito" 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 "L'indice non è ottimale. Per ottimizzarlo si contatti uno sviluppatore o si usi la colonna ponendola in seconda posizione nel comando CREATE INDEX." -#: access/gist/gistutil.c:756 access/hash/hashutil.c:238 -#: access/nbtree/nbtpage.c:675 +#: 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 "l'indice \"%s\" contiene una pagina inaspettata completamente a zero al blocco %u" -#: access/gist/gistutil.c:767 access/hash/hashutil.c:249 -#: access/hash/hashutil.c:261 access/nbtree/nbtpage.c:686 +#: 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 "l'indice \"%s\" contiene una pagina corrotta al blocco %u" -#: access/gist/gistvalidate.c:196 +#: access/gist/gistvalidate.c:203 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "la famiglia di operatori \"%s\" del metodo di accesso %s contiene una specifica ORDER BY non supportata per l'operatore %s" -#: access/gist/gistvalidate.c:207 +#: 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 "la famiglia di operatori \"%s\" del metodo di accesso %s contiene una specifica opfamily ORDER BY non corretta per l'operatore %s" +#: 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 "non è stato possibile determinare quale confronto utilizzare per l'hashing delle stringhe" + +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:668 catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:1962 commands/tablecmds.c:17431 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 utils/adt/like_support.c:1025 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 "Usa la clausola COLLATE per impostare esplicitamente l'ordinamento." + #: access/hash/hashinsert.c:83 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "la dimensione %zu della riga dell'indice supera il massimo dell'hash %zu" -#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:1961 -#: access/spgist/spgutils.c:746 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Non si possono indicizzare valori più grandi di una pagina di buffer." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "numero di blocco di overflow %u non valido" -#: access/hash/hashovfl.c:283 access/hash/hashpage.c:463 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format msgid "out of overflow pages in hash index \"%s\"" msgstr "pagine di overflow esaurite per l'indice hash \"%s\"" @@ -770,282 +929,474 @@ msgstr "pagine di overflow esaurite per l'indice hash \"%s\"" msgid "hash indexes do not support whole-index scans" msgstr "gli indici hash non supportano scansioni sull'intero indice" -#: access/hash/hashutil.c:277 +#: access/hash/hashutil.c:263 #, c-format msgid "index \"%s\" is not a hash index" msgstr "l'indice \"%s\" non è un indice hash" -#: access/hash/hashutil.c:283 +#: access/hash/hashutil.c:269 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "l'indice \"%s\" ha una versione errata dell'hash" -#: access/hash/hashvalidate.c:191 +#: access/hash/hashvalidate.c:198 #, c-format msgid "operator family \"%s\" of access method %s lacks support function for operator %s" msgstr "alla famiglia di operatori \"%s\" del metodo di accesso %s manca la funzione di supporto per l'operatore %s" -#: access/hash/hashvalidate.c:249 access/nbtree/nbtvalidate.c:266 +#: 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 "alla famiglia di operatori \"%s\" del metodo di accesso %s mancano operatori tra tipi diversi" -#: access/heap/heapam.c:1304 access/heap/heapam.c:1333 -#: access/heap/heapam.c:1366 catalog/aclchk.c:1828 -#, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" è un indice" - -#: access/heap/heapam.c:1309 access/heap/heapam.c:1338 -#: access/heap/heapam.c:1371 catalog/aclchk.c:1835 commands/tablecmds.c:10329 -#: commands/tablecmds.c:13528 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" è un tipo composito" - -#: access/heap/heapam.c:2639 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "non è possibile inserire tuple in un lavoratore parallelo" -#: access/heap/heapam.c:3083 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "non è possibile eliminare tuple durante un'operazione parallela" -#: access/heap/heapam.c:3129 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "tentativo di eliminare tuple invisibili" -#: access/heap/heapam.c:3564 access/heap/heapam.c:6401 +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "non è possibile aggiornare tuple durante un'operazione parallela" -#: access/heap/heapam.c:3712 +#: access/heap/heapam.c:3307 #, c-format msgid "attempted to update invisible tuple" msgstr "tentativo di aggiornare tuple invisibili" -#: access/heap/heapam.c:5077 access/heap/heapam.c:5115 -#: access/heap/heapam.c:5367 executor/execMain.c:2662 +#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 access/heap/heapam.c:4972 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "lock di riga nella relazione \"%s\" fallito" -#: access/heap/hio.c:338 access/heap/rewriteheap.c:670 +#: access/heap/heapam_handler.c:401 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update" +msgstr "la tupla da lockare era stata già mossa in un'altra partizione a causa di una modifica concorrente" + +#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "la riga è troppo grande: la dimensione %zu supera il massimo %zu" -#: access/heap/rewriteheap.c:930 +#: access/heap/rewriteheap.c:920 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "scrittura nel file \"%s\" fallita, scritti %d di %d: %m" -#: access/heap/rewriteheap.c:970 access/heap/rewriteheap.c:1191 -#: access/heap/rewriteheap.c:1290 access/transam/timeline.c:411 -#: access/transam/timeline.c:490 access/transam/xlog.c:3307 -#: access/transam/xlog.c:3473 replication/logical/snapbuild.c:1645 -#: replication/slot.c:1308 replication/slot.c:1400 storage/file/fd.c:639 -#: storage/file/fd.c:3515 storage/smgr/md.c:1044 storage/smgr/md.c:1277 -#: storage/smgr/md.c:1450 utils/misc/guc.c:7257 -#, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "fsync del file \"%s\" fallito: %m" - -#: access/heap/rewriteheap.c:1024 access/heap/rewriteheap.c:1143 -#: access/transam/timeline.c:314 access/transam/timeline.c:465 -#: access/transam/xlog.c:3261 access/transam/xlog.c:3411 -#: access/transam/xlog.c:10692 access/transam/xlog.c:10730 -#: access/transam/xlog.c:11133 postmaster/postmaster.c:4454 -#: replication/logical/origin.c:575 replication/slot.c:1257 -#: storage/file/copydir.c:167 storage/smgr/md.c:327 utils/time/snapmgr.c:1297 +#: 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:8653 access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:517 postmaster/postmaster.c:4597 postmaster/postmaster.c:5618 replication/logical/origin.c:587 replication/slot.c:1596 +#: 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 "creazione del file \"%s\" fallita: %m" -#: access/heap/rewriteheap.c:1153 +#: access/heap/rewriteheap.c:1141 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "troncamento del file \"%s\" a %u fallito: %m" -#: access/heap/rewriteheap.c:1161 replication/walsender.c:490 -#: storage/smgr/md.c:1986 -#, c-format -msgid "could not seek to end of file \"%s\": %m" -msgstr "non è stato possibile spostarsi alla fine del file \"%s\": %m" - -#: access/heap/rewriteheap.c:1178 access/transam/timeline.c:369 -#: access/transam/timeline.c:404 access/transam/timeline.c:482 -#: access/transam/xlog.c:3293 access/transam/xlog.c:3464 -#: postmaster/postmaster.c:4464 postmaster/postmaster.c:4474 -#: replication/logical/origin.c:590 replication/logical/origin.c:635 -#: replication/logical/origin.c:657 replication/logical/snapbuild.c:1624 -#: replication/slot.c:1291 storage/file/copydir.c:208 -#: utils/init/miscinit.c:1349 utils/init/miscinit.c:1360 -#: utils/init/miscinit.c:1368 utils/misc/guc.c:7218 utils/misc/guc.c:7249 -#: utils/misc/guc.c:9111 utils/misc/guc.c:9125 utils/time/snapmgr.c:1302 -#: utils/time/snapmgr.c:1309 +#: 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:529 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:1726 replication/slot.c:1631 +#: 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:8731 utils/misc/guc.c:8762 utils/misc/guc.c:10751 utils/misc/guc.c:10765 utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" msgstr "scrittura nel file \"%s\" fallita: %m" -#: access/heap/rewriteheap.c:1265 access/transam/xlogarchive.c:113 -#: access/transam/xlogarchive.c:469 postmaster/postmaster.c:1275 -#: postmaster/syslogger.c:1456 replication/logical/origin.c:563 -#: replication/logical/reorderbuffer.c:2800 -#: replication/logical/snapbuild.c:1567 replication/logical/snapbuild.c:1963 -#: replication/slot.c:1370 storage/file/fd.c:690 storage/file/fd.c:3118 -#: storage/file/fd.c:3180 storage/file/reinit.c:255 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:426 storage/smgr/md.c:475 storage/smgr/md.c:1397 -#: 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:1157 postmaster/syslogger.c:1537 replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4399 replication/logical/snapbuild.c:1671 replication/logical/snapbuild.c:2087 replication/slot.c:1728 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:349 storage/smgr/md.c:415 storage/sync/sync.c:250 utils/time/snapmgr.c:1606 #, c-format msgid "could not remove file \"%s\": %m" msgstr "rimozione del file \"%s\" fallita: %m" -#: access/heap/rewriteheap.c:1279 access/transam/timeline.c:111 -#: access/transam/timeline.c:236 access/transam/timeline.c:333 -#: access/transam/xlog.c:3238 access/transam/xlog.c:3356 -#: access/transam/xlog.c:3397 access/transam/xlog.c:3674 -#: access/transam/xlog.c:3752 access/transam/xlogutils.c:708 -#: postmaster/syslogger.c:1465 replication/basebackup.c:510 -#: replication/basebackup.c:1384 replication/logical/origin.c:712 -#: replication/logical/reorderbuffer.c:2294 -#: replication/logical/reorderbuffer.c:2561 -#: replication/logical/reorderbuffer.c:3274 -#: replication/logical/snapbuild.c:1610 replication/logical/snapbuild.c:1707 -#: replication/slot.c:1385 replication/walsender.c:483 -#: replication/walsender.c:2412 storage/file/copydir.c:161 -#: storage/file/fd.c:622 storage/file/fd.c:3410 storage/file/fd.c:3494 -#: storage/smgr/md.c:608 utils/error/elog.c:1879 utils/init/miscinit.c:1273 -#: utils/init/miscinit.c:1408 utils/init/miscinit.c:1485 utils/misc/guc.c:7477 -#: utils/misc/guc.c:7509 +#: access/heap/vacuumlazy.c:407 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "apertura del file \"%s\" fallita: %m" +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "aspirare aggressivamente \"%s.%s.%s\"" -#: access/index/amapi.c:83 commands/amcmds.c:163 +#: access/heap/vacuumlazy.c:412 #, c-format -msgid "access method \"%s\" is not of type %s" -msgstr "il metodo di accesso \"%s\" non è del tipo %s" +msgid "vacuuming \"%s.%s.%s\"" +msgstr "vacuuming \"%s.%s.%s\"" -#: access/index/amapi.c:99 +#: access/heap/vacuumlazy.c:663 #, c-format -msgid "index access method \"%s\" does not have a handler" -msgstr "il metodo di accesso dell'indice \"%s\" non ha un handler" +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "vacuum ultimato \"%s.%s.%s\": scansioni dell'indice: %d\n" -#: access/index/indexam.c:160 catalog/objectaddress.c:1223 -#: commands/indexcmds.c:2272 commands/tablecmds.c:249 commands/tablecmds.c:273 -#: commands/tablecmds.c:13519 commands/tablecmds.c:14750 +#: access/heap/vacuumlazy.c:674 #, c-format -msgid "\"%s\" is not an index" -msgstr "\"%s\" non è un indice" +msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "vacuum automatico aggressivo della tabella \"%s.%s.%s\": scansioni di indici: %d\n" -#: access/nbtree/nbtinsert.c:530 +#: access/heap/vacuumlazy.c:676 #, c-format -msgid "duplicate key value violates unique constraint \"%s\"" -msgstr "un valore chiave duplicato viola il vincolo univoco \"%s\"" +msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "vacuum automatico per impedire l'avvolgimento della tabella \"%s.%s.%s\": scansioni dell'indice: %d\n" -#: access/nbtree/nbtinsert.c:532 +#: access/heap/vacuumlazy.c:681 #, c-format -msgid "Key %s already exists." -msgstr "La chiave %s esiste già." +msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "vacuum automatico aggressivo della tabella \"%s.%s.%s\": scansioni di indici: %d\n" -#: access/nbtree/nbtinsert.c:599 +#: access/heap/vacuumlazy.c:683 #, c-format -msgid "failed to re-find tuple within index \"%s\"" -msgstr "non ho ritrovato la tupla nell'indice \"%s\"" +msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "vacuum automatico della tabella \"%s.%s.%s\": scan di indici: %d\n" -#: access/nbtree/nbtinsert.c:601 +#: access/heap/vacuumlazy.c:690 #, c-format -msgid "This may be because of a non-immutable index expression." -msgstr "Ciò potrebbe essere causato da un'espressione dell'indice non immutabile." +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "pagine: %u rimosse, %u rimaste, %u scansionate (%.2f%% del totale)\n" -#: access/nbtree/nbtinsert.c:681 access/nbtree/nbtsort.c:833 +#: access/heap/vacuumlazy.c:697 #, 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 "" -"Non si possono indicizzare valori più grandi di 1/3 di pagina di buffer.\n" -"Si consiglia un indice funzionale su un hash MD5 del valore o l'uso del full text indexing." +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "tuple: %lld rimosse, %lld rimaste, %lld sono morte ma non ancora rimovibili\n" -#: access/nbtree/nbtpage.c:318 access/nbtree/nbtpage.c:529 -#: access/nbtree/nbtpage.c:618 parser/parse_utilcmd.c:2056 +#: access/heap/vacuumlazy.c:703 #, c-format -msgid "index \"%s\" is not a btree" -msgstr "l'indice \"%s\" non è un btree" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "tuple mancate: %lld morti da %u pagine non rimosse a causa di un conflitto di blocco della pulizia\n" -#: access/nbtree/nbtpage.c:325 access/nbtree/nbtpage.c:536 -#: access/nbtree/nbtpage.c:625 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" -msgstr "le versioni non corrispondono per l'indice \"%s\": la versione sul file è %d, quella corrente %d, quella minima supportata %d" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "cutoff rimovibile: %u, precedente a %d XID al termine dell'operazione\n" -#: access/nbtree/nbtpage.c:1320 +#: access/heap/vacuumlazy.c:714 #, c-format -msgid "index \"%s\" contains a half-dead internal page" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "nuovo relfrozenxid: %u, che è %d XID davanti al valore precedente\n" + +#: access/heap/vacuumlazy.c:721 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "nuovo relminmxid: %u, che è %d MXID prima del valore precedente\n" + +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "scansione dell'indice non necessaria: " + +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "scansione dell'indice necessaria: " + +#: access/heap/vacuumlazy.c:731 +#, c-format +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "%u pagine dalla tabella (%.2f%% del totale) hanno rimosso %lld identificatori di elementi morti\n" + +#: access/heap/vacuumlazy.c:736 +msgid "index scan bypassed: " +msgstr "scansione dell'indice ignorata: " + +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "scansione dell'indice bypassata da failsafe: " + +#: access/heap/vacuumlazy.c:740 +#, c-format +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u pagine dalla tabella (%.2f%% del totale) hanno %lld identificatori di elementi morti\n" + +#: access/heap/vacuumlazy.c:755 +#, c-format +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "indice \"%s\": pagine: %u in totale, %u eliminate di recente, %u attualmente eliminate, %u riutilizzabili\n" + +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 +#, c-format +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "Temporizzazione I/O: lettura: %.3f ms, scrittura: %.3f ms\n" + +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#, c-format +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "velocità di lettura media: %.3f MB/s, velocità di scrittura media: %.3f MB/s\n" + +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#, c-format +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "utilizzo del buffer: %lld riscontri, %lld mancati, %lld sporco\n" + +#: access/heap/vacuumlazy.c:785 +#, c-format +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "Utilizzo WAL: %lld record, %lld immagini a pagina intera, %llu byte\n" + +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#, c-format +msgid "system usage: %s" +msgstr "utilizzo di sistema: %s" + +#: access/heap/vacuumlazy.c:2463 +#, c-format +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "tabella \"%s\": rimossi %lld identificatori di elementi morti nelle pagine %u" + +#: access/heap/vacuumlazy.c:2629 +#, c-format +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "bypassando la manutenzione non essenziale della tabella \"%s.%s.%s\" come failsafe dopo %d scansioni dell'indice" + +#: access/heap/vacuumlazy.c:2634 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "Il relfrozenxid o il relminmxid della tabella è troppo lontano nel passato." + +#: 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 "" +"Considerare di aumentare il parametro di configurazione \"maintenance_work_mem\" o \"autovacuum_work_mem\".\n" +"Potrebbe anche essere necessario considerare altri modi in cui VACUUM può tenere il passo con l'allocazione degli ID transazione." + +#: access/heap/vacuumlazy.c:2878 +#, c-format +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "\"%s\": truncate interrotto a causa di una richiesta di lock in conflitto" + +#: access/heap/vacuumlazy.c:2948 +#, c-format +msgid "table \"%s\": truncated %u to %u pages" +msgstr "tabella \"%s\": %u troncata a %u pagine" + +#: access/heap/vacuumlazy.c:3010 +#, c-format +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "tabella \"%s\": sospensione del troncamento a causa di una richiesta di blocco in conflitto" + +#: access/heap/vacuumlazy.c:3170 +#, c-format +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "disabilitando l'opzione parallela del vuoto su \"%s\" --- non è possibile aspirare le tabelle temporanee in parallelo" + +#: access/heap/vacuumlazy.c:3383 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "durante la scansione del blocco %u offset %u della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3386 +#, c-format +msgid "while scanning block %u of relation \"%s.%s\"" +msgstr "durante la scansione del blocco %u della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3390 +#, c-format +msgid "while scanning relation \"%s.%s\"" +msgstr "durante scansione della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3398 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "durante il vacuum del blocco %u offset %u della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3401 +#, c-format +msgid "while vacuuming block %u of relation \"%s.%s\"" +msgstr "durante il vacuum del blocco %u della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3405 +#, c-format +msgid "while vacuuming relation \"%s.%s\"" +msgstr "durante il vacuum della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 +#, c-format +msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" +msgstr "durante il vacuum dell'indice \"%s\" della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 +#, c-format +msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" +msgstr "durante la pulizia dell'indice \"%s\" della relazione \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3421 +#, c-format +msgid "while truncating relation \"%s.%s\" to %u blocks" +msgstr "durante il troncamento della relazione \"%s.%s\" con %u blocchi" + +#: access/index/amapi.c:83 commands/amcmds.c:143 +#, c-format +msgid "access method \"%s\" is not of type %s" +msgstr "il metodo di accesso \"%s\" non è del tipo %s" + +#: access/index/amapi.c:99 +#, c-format +msgid "index access method \"%s\" does not have a handler" +msgstr "il metodo di accesso dell'indice \"%s\" non ha un handler" + +#: access/index/genam.c:489 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "transazione interrotta durante la scansione del catalogo di sistema" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 commands/tablecmds.c:17119 commands/tablecmds.c:18887 +#, c-format +msgid "\"%s\" is not an index" +msgstr "\"%s\" non è un indice" + +#: access/index/indexam.c:973 +#, c-format +msgid "operator class %s has no options" +msgstr "la classe dell'operatore %s non ha opzioni" + +#: access/nbtree/nbtinsert.c:666 +#, c-format +msgid "duplicate key value violates unique constraint \"%s\"" +msgstr "un valore chiave duplicato viola il vincolo univoco \"%s\"" + +#: access/nbtree/nbtinsert.c:668 +#, c-format +msgid "Key %s already exists." +msgstr "La chiave %s esiste già." + +#: access/nbtree/nbtinsert.c:762 +#, c-format +msgid "This may be because of a non-immutable index expression." +msgstr "Ciò potrebbe essere causato da un'espressione dell'indice non immutabile." + +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2332 +#, c-format +msgid "index \"%s\" is not a btree" +msgstr "l'indice \"%s\" non è un btree" + +#: 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 "le versioni non corrispondono per l'indice \"%s\": la versione sul file è %d, quella corrente %d, quella minima supportata %d" + +#: access/nbtree/nbtpage.c:1874 +#, c-format +msgid "index \"%s\" contains a half-dead internal page" msgstr "l'indice \"%s\" contiene una pagina interna mezza morta" -#: access/nbtree/nbtpage.c:1322 +#: 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 "Ciò può essere causato da un VACUUM interrotto in una versione 9.3 o precedente, prima dell'aggiornamento. Si consiglia un REINDEX." -#: access/nbtree/nbtvalidate.c:236 +#: access/nbtree/nbtutils.c:2669 +#, c-format +msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" +msgstr "la dimensione della riga dell'indice %zu supera btree versione %u massimo %zu per l'indice \"%s\"" + +#: access/nbtree/nbtutils.c:2675 +#, c-format +msgid "Index row references tuple (%u,%u) in relation \"%s\"." +msgstr "La riga dell'indice fa riferimento alla tupla (%u,%u) in relazione a \"%s\"." + +#: access/nbtree/nbtutils.c:2679 +#, 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 "" +"Non si possono indicizzare valori più grandi di 1/3 di pagina di buffer.\n" +"Si consiglia un indice funzionale su un hash MD5 del valore o l'uso del full text indexing." + +#: 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 "alla famiglia di operatori \"%s\" del metodo di accesso %s manca la funzione di supporto per i tipi %s e %s" -#: access/spgist/spgutils.c:136 +#: access/spgist/spgutils.c:244 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "il metodo di compressione dev'essere definito quando il tipo foglia è diverso dal tipo di input" -#: access/spgist/spgutils.c:743 +#: access/spgist/spgutils.c:1016 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "La dimensione %zu della tupla interna SP-GiST supera il massimo %zu" -#: access/spgist/spgvalidate.c:269 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "Il tipo di dati foglia SP-GiST %s non corrisponde al tipo dichiarato %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 "alla famiglia di operatori \"%s\" del metodo di accesso %s manca la funzione di supporto %d per il tipo %s" -#: access/tablesample/bernoulli.c:152 access/tablesample/system.c:156 +#: 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\" è un indice" + +#: 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:13797 commands/tablecmds.c:17128 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" è un tipo composito" + +#: access/table/tableam.c:266 +#, c-format +msgid "tid (%u, %u) is not valid for relation \"%s\"" +msgstr "tid (%u, %u) non è valido per la relazione \"%s\"" + +#: access/table/tableamapi.c:115 +#, c-format +msgid "%s cannot be empty." +msgstr "'%s' non può essere vuoto." + +#: access/table/tableamapi.c:122 utils/misc/guc.c:12920 +#, c-format +msgid "%s is too long (maximum %d characters)." +msgstr "%s è troppo lungo (massimo %d caratteri)." + +#: access/table/tableamapi.c:145 +#, c-format +msgid "table access method \"%s\" does not exist" +msgstr "il metodo di accesso alla tabella \"%s\" non esiste" + +#: access/table/tableamapi.c:150 +#, c-format +msgid "Table access method \"%s\" does not exist." +msgstr "Il metodo di accesso \"%s\" non esiste." + +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "la percentuale dei campioni dev'essere tra 0 e 100" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "non è stato possibile ottenere l'ora di commit per la transazione %u" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "non è stato possibile ottenere i dati dell'ora di commit" -#: 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 "Assicurati che il parametro di configurazione \"%s\" sia impostato sul server master." +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "Assicurarsi che il parametro di configurazione \"%s\" sia impostato sul server primario." -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Assicurati che il parametro di configurazione \"%s\" sia impostato." -#: access/transam/multixact.c:1000 +#: 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 "il database non sta accettando comandi che generano nuovi MultiXactIds per evitare perdite di dati per wraparound nel database \"%s\"" -#: access/transam/multixact.c:1002 access/transam/multixact.c:1009 -#: access/transam/multixact.c:1033 access/transam/multixact.c:1042 +#: 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" @@ -1054,72 +1405,65 @@ msgstr "" "Esegui un VACUUM sull'intero database.\n" "Potresti anche dover eseguire il commit o il rollback di vecchie transazioni preparate, o eliminare vecchi slot di replica." -#: access/transam/multixact.c:1007 +#: 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 "il database non sta accettando comandi che generano nuovi MultiXactIds per evitare perdite di dati per wraparound nel database con OID %u" -#: access/transam/multixact.c:1028 access/transam/multixact.c:2318 +#: 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] "il database \"%s\" deve ricevere un vacuum prima che altri %u MultiXactIds siano usati" msgstr[1] "il database \"%s\" deve ricevere un vacuum prima che altri %u MultiXactIds siano usati" -#: access/transam/multixact.c:1037 access/transam/multixact.c:2327 +#: 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] "il database con OID %u deve ricevere un vacuum prima che altri %u MultiXactIds siano usati" msgstr[1] "il database con OID %u deve ricevere un vacuum prima che altri %u MultiXactIds siano usati" -#: access/transam/multixact.c:1098 +#: access/transam/multixact.c:1119 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "limite \"membri\" multixact superato" -#: access/transam/multixact.c:1099 +#: 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] "Questo comando creerebbe un multixact con %u membri, ma lo spazio restante è sufficiente solo per %u membro." msgstr[1] "Questo comando creerebbe un multixact con %u membri, ma lo spazio restante è sufficiente solo per %u membri." -#: access/transam/multixact.c:1104 +#: 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 "Esegui un VACUUM su tutto il database con OID %u con impostazioni di vacuum_multixact_freeze_min_age e vacuum_multixact_freeze_table_age ridotte." -#: access/transam/multixact.c:1135 +#: 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] "il database con OID %u deve ricevere un vacuum prima che %d altro membro multixact possa essere usato" msgstr[1] "il database con OID %u deve ricevere un vacuum prima che altri %d membri multixact possano essere usati" -#: access/transam/multixact.c:1140 +#: 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 "Esegui un VACUUM su quel database intero con impostazioni di vacuum_multixact_freeze_min_age e vacuum_multixact_freeze_table_age ridotte." -#: access/transam/multixact.c:1277 +#: access/transam/multixact.c:1300 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" -msgstr "il MultiXactId %u non esiste più -- sembra ci sia stato un wraparound" +msgstr "MultiXactId %u non esiste più -- sembra ci sia stato un wraparound" -#: access/transam/multixact.c:1285 +#: access/transam/multixact.c:1306 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" -msgstr "il MultiXactId %u non è stato ancora creato -- sembra ci sia stato un wraparound" +msgstr "MultiXactId %u non è stato ancora creato -- sembra ci sia stato un wraparound" -#: access/transam/multixact.c:2268 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "il limite di wrap di MultiXactId è %u, limitato dal database con OID %u" - -#: access/transam/multixact.c:2323 access/transam/multixact.c:2332 -#: access/transam/varsup.c:146 access/transam/varsup.c:153 -#: access/transam/varsup.c:405 access/transam/varsup.c:412 +#: 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" @@ -1128,343 +1472,385 @@ msgstr "" "Per evitare lo spegnimento del database, si deve eseguire un VACUUM su tutto il database.\n" "Potrebbe essere necessario inoltre effettuare il COMMIT o il ROLLBACK di vecchie transazioni preparate, o eliminare vecchi slot di replica." -#: access/transam/multixact.c:2602 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "il membro MultiXactId più vecchio è all'offset %u" - -#: access/transam/multixact.c:2606 +#: 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 "le protezioni di wraparound dei membri MultiXact sono disabilitate perché il il MultiXact più vecchio che abbia ricevuto un checkpoint %u non esiste sul disco" +msgstr "Le protezioni di wraparound dei membri MultiXact sono disabilitate perché il il MultiXact più vecchio che abbia ricevuto un checkpoint %u non esiste sul disco" -#: access/transam/multixact.c:2628 +#: access/transam/multixact.c:2643 #, c-format msgid "MultiXact member wraparound protections are now enabled" -msgstr "le protezioni di wraparound dei membri MultiXact ora sono abilitate" +msgstr "Le protezioni di wraparound dei membri MultiXact ora sono abilitate" -#: access/transam/multixact.c:2631 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "il limite di arresto dei membri MultiXact è ora %u basato sul MultiXact %u" - -#: access/transam/multixact.c:3011 +#: access/transam/multixact.c:3030 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" -msgstr "MultiXact più vecchio %u non trovato, il primo è il MultiXact %u, troncamento non eseguito" +msgstr "il MultiXact più vecchio %u non trovato, il primo è il MultiXact %u, troncamento non eseguito" -#: access/transam/multixact.c:3029 +#: access/transam/multixact.c:3048 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "impossibile troncare fino al MultiXact %u perché non esiste su disco, troncamento non eseguito" -#: access/transam/multixact.c:3355 +#: access/transam/multixact.c:3362 #, c-format msgid "invalid MultiXactId: %u" -msgstr "MultiXactId non valido: %u" +msgstr "rilevato MultiXactId non valido: %u" -#: access/transam/parallel.c:664 access/transam/parallel.c:787 +#: access/transam/parallel.c:718 access/transam/parallel.c:837 #, c-format msgid "parallel worker failed to initialize" msgstr "errore nell'avvio del worker parallelo" -#: access/transam/parallel.c:665 access/transam/parallel.c:788 +#: access/transam/parallel.c:719 access/transam/parallel.c:838 #, c-format msgid "More details may be available in the server log." msgstr "Potrebbero esserci più dettagli disponibili nel log del server." -#: access/transam/parallel.c:849 +#: access/transam/parallel.c:899 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "il postmaster è terminato durante una transazione parallela" -#: access/transam/parallel.c:1036 +#: access/transam/parallel.c:1086 #, c-format msgid "lost connection to parallel worker" msgstr "connessione al worker parallelo perduta" -#: access/transam/parallel.c:1102 access/transam/parallel.c:1104 +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 msgid "parallel worker" msgstr "worker parallelo" -#: access/transam/parallel.c:1249 +#: access/transam/parallel.c:1307 #, c-format msgid "could not map dynamic shared memory segment" msgstr "mappatura del segmento di memoria dinamica condivisa non riuscito" -#: access/transam/parallel.c:1254 +#: access/transam/parallel.c:1312 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "numero magico non valido nel segmento di memoria dinamica condivisa" -#: access/transam/slru.c:668 +#: access/transam/rmgr.c:84 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "gestore risorse con ID %d non registrato" + +#: access/transam/rmgr.c:85 +#, c-format +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Includere il modulo di estensione che implementa questo gestore risorse in shared_preload_libraries." + +#: access/transam/rmgr.c:101 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "il nome del gestore risorse personalizzato non è valido" + +#: access/transam/rmgr.c:102 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Fornire un nome non vuoto per il gestore risorse personalizzato." + +#: access/transam/rmgr.c:105 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "l'ID gestore risorse personalizzato %d è fuori intervallo" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Fornisci un ID gestore risorse personalizzato compreso tra %d e %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 "impossibile registrare il gestore risorse personalizzato \"%s\" con ID %d" + +#: access/transam/rmgr.c:112 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "Il gestore risorse personalizzato deve essere registrato durante l'inizializzazione dei moduli in shared_preload_libraries." + +#: access/transam/rmgr.c:117 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Gestore risorse personalizzato \"%s\" già registrato con lo stesso ID." + +#: access/transam/rmgr.c:129 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "Il gestore risorse esistente con ID %d ha lo stesso nome." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "gestore risorse personalizzato registrato \"%s\" con ID %d" + +#: access/transam/slru.c:713 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "il file \"%s\" non esiste, interpretato come zeri" -#: access/transam/slru.c:906 access/transam/slru.c:912 -#: access/transam/slru.c:919 access/transam/slru.c:926 -#: access/transam/slru.c:933 access/transam/slru.c:940 +#: 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 "non è stato possibile accedere allo stato della transazione %u" -#: access/transam/slru.c:907 +#: access/transam/slru.c:946 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Apertura del file \"%s\" fallita: %m." -#: access/transam/slru.c:913 +#: access/transam/slru.c:952 +#, c-format +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "Impossibile cercare nel file \"%s\" l'offset %d: %m." + +#: access/transam/slru.c:960 +#, c-format +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "Impossibile leggere dal file \"%s\" all'offset %d: %m." + +#: access/transam/slru.c:965 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "Spostamento nel file \"%s\" all'offset %u fallito: %m." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "Impossibile leggere dal file \"%s\" all'offset %d: leggere troppo pochi byte." -#: access/transam/slru.c:920 +#: access/transam/slru.c:972 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "Lettura dal file \"%s\" all'offset %u fallita: %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "Impossibile scrivere nel file \"%s\" all'offset %d: %m." -#: access/transam/slru.c:927 +#: access/transam/slru.c:977 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "Scrittura nel file \"%s\" all'offset %u fallita: %m." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "Impossibile scrivere nel file \"%s\" all'offset %d: scritto troppo pochi byte." -#: access/transam/slru.c:934 +#: access/transam/slru.c:984 #, c-format msgid "Could not fsync file \"%s\": %m." -msgstr "fsync del file \"%s\" fallito: %m." +msgstr "Fsync del file \"%s\" fallito: %m." -#: access/transam/slru.c:941 +#: access/transam/slru.c:991 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Chiusura del file \"%s\" fallita: %m." -#: access/transam/slru.c:1198 +#: access/transam/slru.c:1252 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "troncamento della directory \"%s\" fallito: probabile wraparound" -#: access/transam/slru.c:1253 access/transam/slru.c:1309 -#, c-format -msgid "removing file \"%s\"" -msgstr "cancellazione del file \"%s\"" - -#: access/transam/timeline.c:148 access/transam/timeline.c:153 +#: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" msgstr "errore di sintassi nel file dello storico: %s" -#: access/transam/timeline.c:149 +#: access/transam/timeline.c:164 #, c-format msgid "Expected a numeric timeline ID." msgstr "L'ID della timeline deve essere numerico." -#: access/transam/timeline.c:154 +#: access/transam/timeline.c:169 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "Attesa una locazione di switchpoint del log write-ahead." -#: access/transam/timeline.c:158 +#: access/transam/timeline.c:173 #, c-format msgid "invalid data in history file: %s" msgstr "dati non validi nel file dello storico: %s" -#: access/transam/timeline.c:159 +#: access/transam/timeline.c:174 #, c-format msgid "Timeline IDs must be in increasing sequence." -msgstr "Gli ID della timeline devono essere in ordine crescente" +msgstr "Gli ID della timeline devono essere in ordine crescente." -#: access/transam/timeline.c:179 +#: access/transam/timeline.c:194 #, c-format msgid "invalid data in history file \"%s\"" msgstr "dati non validi nel file dello storico \"%s\"" -#: access/transam/timeline.c:180 +#: access/transam/timeline.c:195 #, c-format msgid "Timeline IDs must be less than child timeline's ID." -msgstr "Gli ID della timeline devono avere valori inferiori degli ID della timeline figlia" - -#: access/transam/timeline.c:417 access/transam/timeline.c:496 -#: access/transam/xlog.c:3314 access/transam/xlog.c:3479 -#: access/transam/xlogfuncs.c:683 commands/copy.c:1742 -#: storage/file/copydir.c:219 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "chiusura del file \"%s\" fallita: %m" +msgstr "Gli ID della timeline devono avere valori inferiori degli ID della timeline figlia." -#: access/transam/timeline.c:578 +#: access/transam/timeline.c:597 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "la timeline richiesta %u non è nella storia di questo server" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:385 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "l'identificativo di transazione \"%s\" è troppo lungo" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:392 #, c-format msgid "prepared transactions are disabled" msgstr "le transazione preparate sono disabilitate" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:393 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Imposta max_prepared_transactions ad un valore non nullo." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:412 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "l'identificativo di transazione \"%s\" è già in uso" -#: access/transam/twophase.c:417 access/transam/twophase.c:2435 +#: access/transam/twophase.c:421 access/transam/twophase.c:2486 #, c-format msgid "maximum number of prepared transactions reached" msgstr "è stato raggiunto il numero massimo di transazioni preparate" -#: access/transam/twophase.c:418 access/transam/twophase.c:2436 +#: access/transam/twophase.c:422 access/transam/twophase.c:2487 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Incrementa il valore di max_prepared_transactions (il valore attuale è %d)" -#: access/transam/twophase.c:586 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "la transazione preparata con identificativo \"%s\" è in uso" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:604 #, c-format msgid "permission denied to finish prepared transaction" msgstr "non è consentito portare a termine la transazione preparata" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:605 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "È consentito solo a un superutente o all'utente che ha preparato la transazione." -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transazione preparata appartiene ad un altro database" -#: 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 "Connettersi al database in cui la transazione è stata preparata per portarla a termine." -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "la transazione preparata con identificativo \"%s\" non esiste" -#: access/transam/twophase.c:1103 +#: access/transam/twophase.c:1169 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "è stata superata la lunghezza massima del file dello stato a due fasi" -#: access/transam/twophase.c:1232 +#: access/transam/twophase.c:1324 #, c-format -msgid "could not open two-phase state file \"%s\": %m" -msgstr "apertura del file dello stato a due fasi \"%s\" fallita: %m" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "dimensione errata del file \"%s\": %lld byte" +msgstr[1] "dimensione errata del file \"%s\": %lld bytes" -#: access/transam/twophase.c:1253 +#: access/transam/twophase.c:1333 #, c-format -msgid "could not stat two-phase state file \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sul file dello stato a due fasi \"%s\": %m" +msgid "incorrect alignment of CRC offset for file \"%s\"" +msgstr "allineamento errato dell'offset CRC per il file \"%s\"" -#: access/transam/twophase.c:1292 +#: access/transam/twophase.c:1351 #, c-format -msgid "could not read two-phase state file \"%s\": %m" -msgstr "lettura del file dello stato a due fasi \"%s\" fallita: %m" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "impossibile leggere il file \"%s\": leggere %d di %lld" -#: access/transam/twophase.c:1384 access/transam/xlog.c:6483 +#: access/transam/twophase.c:1366 #, c-format -msgid "Failed while allocating a WAL reading processor." -msgstr "Errore nell'allocazione di un processore di lettura del WAL." +msgid "invalid magic number stored in file \"%s\"" +msgstr "numero magico non valido memorizzato nel file \"%s\"" -#: access/transam/twophase.c:1390 +#: access/transam/twophase.c:1372 #, c-format -msgid "could not read two-phase state from WAL at %X/%X" -msgstr "lettura dello stato a due fasi dal WAL a %X/%X fallita" +msgid "invalid size stored in file \"%s\"" +msgstr "dimensione non valida memorizzata nel file \"%s\"" -#: access/transam/twophase.c:1398 +#: access/transam/twophase.c:1384 #, c-format -msgid "expected two-phase state data is not present in WAL at %X/%X" -msgstr "i dati attesi sullo stato a due fasi non sono presenti nel WAL a %X/%X" +msgid "calculated CRC checksum does not match value stored in file \"%s\"" +msgstr "il checksum CRC calcolato non corrisponde al valore memorizzato nel file \"%s\"" -#: access/transam/twophase.c:1636 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:569 replication/logical/logical.c:206 replication/walsender.c:702 #, c-format -msgid "could not remove two-phase state file \"%s\": %m" -msgstr "rimozione del file dello stato a due fasi \"%s\" fallita: %m" +msgid "Failed while allocating a WAL reading processor." +msgstr "Errore nell'allocazione di un processore di lettura del WAL." -#: access/transam/twophase.c:1665 +#: access/transam/twophase.c:1424 #, c-format -msgid "could not recreate two-phase state file \"%s\": %m" -msgstr "ricreazione del file dello stato a due fasi \"%s\" fallita: %m" +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "impossibile leggere lo stato a due fasi del WAL a %X/%X: %s" -#: access/transam/twophase.c:1682 access/transam/twophase.c:1695 +#: access/transam/twophase.c:1429 #, c-format -msgid "could not write two-phase state file: %m" -msgstr "scrittura nel file dello stato a due fasi fallito: %m" +msgid "could not read two-phase state from WAL at %X/%X" +msgstr "lettura dello stato a due fasi dal WAL a %X/%X fallita" -#: access/transam/twophase.c:1712 +#: access/transam/twophase.c:1437 #, c-format -msgid "could not fsync two-phase state file: %m" -msgstr "fsync del file dello stato a due fasi: %m" +msgid "expected two-phase state data is not present in WAL at %X/%X" +msgstr "i dati attesi sullo stato a due fasi non sono presenti nel WAL a %X/%X" -#: access/transam/twophase.c:1719 +#: access/transam/twophase.c:1733 #, c-format -msgid "could not close two-phase state file: %m" -msgstr "chiusura del file dello stato a due fasi fallita: %m" +msgid "could not recreate file \"%s\": %m" +msgstr "creazione del file \"%s\" fallita: %m" -#: access/transam/twophase.c:1807 +#: 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 file di stato a due fasi scritto per una transazione preparata di lunga durata" msgstr[1] "%u file di stato a due fasi scritti per transazioni preparate di lunga durata" -#: access/transam/twophase.c:2036 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "recupero di %u transazioni preparate dalla memoria condivisa" -#: access/transam/twophase.c:2126 +#: access/transam/twophase.c:2187 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "vecchio file di stato a due fasi per la transazione %u rimosso" -#: access/transam/twophase.c:2133 +#: access/transam/twophase.c:2194 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "rimozione del vecchio stato a due fasi dalla memoria condivisa per la transazione %u" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2207 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "rimozione del file di stato a due fasi future per la transazione %u" -#: access/transam/twophase.c:2153 +#: access/transam/twophase.c:2214 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "rimozione dello stato a due fasi dalla memoria per la transazione %u" -#: access/transam/twophase.c:2167 access/transam/twophase.c:2186 +#: access/transam/twophase.c:2239 #, c-format -msgid "removing corrupt two-phase state file for transaction %u" +msgid "corrupted two-phase state file for transaction %u" msgstr "rimozione del file di stato a due fasi corrotto per la transazione %u" -#: access/transam/twophase.c:2193 +#: access/transam/twophase.c:2244 #, c-format -msgid "removing corrupt two-phase state from memory for transaction %u" +msgid "corrupted two-phase state in memory for transaction %u" msgstr "rimozione dello stato a due fasi corrotto dalla memoria per la transazione %u" -#: access/transam/varsup.c:124 +#: access/transam/varsup.c:129 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" msgstr "il database non accetta comandi per evitare perdita di dati per wraparound \"%s\"" -#: access/transam/varsup.c:126 access/transam/varsup.c:133 +#: 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" @@ -1473,2212 +1859,2264 @@ msgstr "" "Arresta il processo postmaster ed effettua un VACUUM su quel database in modalità a utente singolo.\n" "Potrebbe essere necessario inoltre effettuare il COMMIT o il ROLLBACK di vecchie transazioni preparate, o eliminare vecchi slot di replica." -#: access/transam/varsup.c:131 +#: access/transam/varsup.c:136 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" msgstr "il database non accetta comandi per evitare perdita di dati per wraparound nel database con OID %u" -#: access/transam/varsup.c:143 access/transam/varsup.c:402 +#: access/transam/varsup.c:148 access/transam/varsup.c:463 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "è necessario eseguire il VACUUM sul database \"%s\" entro %u transazioni" -#: access/transam/varsup.c:150 access/transam/varsup.c:409 +#: access/transam/varsup.c:155 access/transam/varsup.c:470 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "è necessario eseguire il VACUUM sul database con OID %u entro %u transazioni" -#: access/transam/varsup.c:367 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "il limite di sovrascrittura degli ID di transazione è %u, definito dal database con OID %u" - -#: access/transam/xact.c:960 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "non è possibile effettuare più di 2^32-2 comandi in una transazione" -#: access/transam/xact.c:1485 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "il numero massimo di sottotransazioni committed (%d) è stato superato" -#: access/transam/xact.c:2286 +#: access/transam/xact.c:2501 #, c-format -msgid "cannot PREPARE a transaction that has operated on temporary tables" +msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "non è possibile eseguire PREPARE in una transazione che ha operato su tabelle temporanee" -#: access/transam/xact.c:2296 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "non è possibile eseguire PREPARE in una transazione che ha esportato snapshot" -#: access/transam/xact.c:2305 -#, c-format -msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "non è possibile eseguire PREPARE in una transazione che ha manipolato i worker di replica logica" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3190 +#: access/transam/xact.c:3474 #, c-format msgid "%s cannot run inside a transaction block" msgstr "non è possibile eseguire %s all'interno di un blocco di transazione" # translator: %s represents an SQL statement name #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3200 +#: access/transam/xact.c:3484 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "non è possibile eseguire %s all'interno di una sottotransazione" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3210 +#: access/transam/xact.c:3494 #, c-format msgid "%s cannot be executed from a function" msgstr "%s non può essere eseguito da una funzione" # translator: %s represents an SQL statement name #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3279 access/transam/xact.c:3903 -#: access/transam/xact.c:3972 access/transam/xact.c:4083 +#: access/transam/xact.c:3565 access/transam/xact.c:3878 access/transam/xact.c:3957 access/transam/xact.c:4080 access/transam/xact.c:4231 access/transam/xact.c:4300 access/transam/xact.c:4411 #, c-format msgid "%s can only be used in transaction blocks" msgstr "si può usare %s solo entro blocchi di transazione" -#: access/transam/xact.c:3472 +#: access/transam/xact.c:3764 #, c-format msgid "there is already a transaction in progress" msgstr "c'è già una transazione in corso" -#: access/transam/xact.c:3583 access/transam/xact.c:3653 -#: access/transam/xact.c:3762 +#: access/transam/xact.c:3883 access/transam/xact.c:3962 access/transam/xact.c:4085 #, c-format msgid "there is no transaction in progress" msgstr "non c'è alcuna transazione in corso" -#: access/transam/xact.c:3664 +#: access/transam/xact.c:3973 #, c-format msgid "cannot commit during a parallel operation" msgstr "non è possibile effettuare un commit durante un'operazione parallela" -#: access/transam/xact.c:3773 +#: access/transam/xact.c:4096 #, c-format msgid "cannot abort during a parallel operation" msgstr "non è possibile interrompere durante un'operazione parallela" -#: access/transam/xact.c:3867 +#: access/transam/xact.c:4195 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "non è possibile definire un punto di salvataggio durante un'operazione parallela" -#: access/transam/xact.c:3954 +#: access/transam/xact.c:4282 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "non è possibile rilasciare un punto di salvataggio durante un'operazione parallela" -#: access/transam/xact.c:3964 access/transam/xact.c:4015 -#: access/transam/xact.c:4075 access/transam/xact.c:4124 +#: access/transam/xact.c:4292 access/transam/xact.c:4343 access/transam/xact.c:4403 access/transam/xact.c:4452 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "il punto di salvataggio \"%s\" non esiste" -#: access/transam/xact.c:4021 access/transam/xact.c:4130 +#: access/transam/xact.c:4349 access/transam/xact.c:4458 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "il punto di salvataggio \"%s\" non esiste al livello di punti di salvataggio corrente" -#: access/transam/xact.c:4063 +#: access/transam/xact.c:4391 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "non è possibile effettuare un rollback durante un'operazione parallela" -#: access/transam/xact.c:4191 +#: access/transam/xact.c:4519 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "non è possibile iniziare una sub-transazione durante un'operazione parallela" -#: access/transam/xact.c:4259 +#: access/transam/xact.c:4587 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "non è possibile effettuare il commit di una sub-transazione durante un'operazione parallela" -#: access/transam/xact.c:4897 +#: access/transam/xact.c:5234 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "non è possibile avere più di 2^32-1 comandi in una sottotransazione" -#: access/transam/xlog.c:2492 +#: access/transam/xlog.c:1463 #, c-format -msgid "could not seek in log file %s to offset %u: %m" -msgstr "spostamento nel file di log %s alla posizione %u fallito: %m" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "richiesta di svuotare oltre la fine del WAL generato; richiesta %X/%X, posizione attuale %X/%X" -#: access/transam/xlog.c:2514 +#: access/transam/xlog.c:2224 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "scrittura nel file di log %s in posizione %u, lunghezza %zu fallita: %m" -#: access/transam/xlog.c:2792 -#, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "punto di recupero minimo aggiornato a %X/%X sulla timeline %u" - -#: access/transam/xlog.c:3444 -#, c-format -msgid "not enough data in file \"%s\"" -msgstr "il file \"%s\" non contiene abbastanza dati" - -#: access/transam/xlog.c:3589 -#, c-format -msgid "could not open write-ahead log file \"%s\": %m" -msgstr "apertura del file di log write-ahead \"%s\" fallita: %m" - -#: access/transam/xlog.c:3778 access/transam/xlog.c:5673 -#, c-format -msgid "could not close log file %s: %m" -msgstr "chiusura del file di log %s fallita: %m" - -#: access/transam/xlog.c:3844 access/transam/xlogutils.c:703 -#: replication/walsender.c:2407 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "il segmento WAL richiesto %s è stato già rimosso" -#: access/transam/xlog.c:4051 -#, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "riciclaggio del file di log write-ahead \"%s\"" - -#: access/transam/xlog.c:4063 -#, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "rimozione del file di log write-ahead \"%s\"" - -#: access/transam/xlog.c:4083 +#: access/transam/xlog.c:3756 #, c-format -msgid "could not rename old write-ahead log file \"%s\": %m" -msgstr "rinominazione del vecchio file di log write-ahead \"%s\" fallita: %m" +msgid "could not rename file \"%s\": %m" +msgstr "rimozione del file \"%s\" fallita: %m" -#: access/transam/xlog.c:4125 access/transam/xlog.c:4135 +#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "la directory dei file WAL \"%s\" necessaria non esiste" -#: access/transam/xlog.c:4141 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "creazione della directory dei file WAL mancante \"%s\"" -#: access/transam/xlog.c:4144 +#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "creazione della directory mancante \"%s\" fallita: %m" -#: access/transam/xlog.c:4252 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "ID di timeline %u inatteso nel segmento di log %s, offset %u" - -#: access/transam/xlog.c:4380 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "la nuova timeline %u non è figlia della timeline %u del database" - -#: access/transam/xlog.c:4394 -#, c-format -msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" -msgstr "la nuova timeline %u si è staccata dalla timeline attuale %u prima del punto di recupero corrente %X/%X" - -#: access/transam/xlog.c:4413 -#, c-format -msgid "new target timeline is %u" -msgstr "la nuova timeline di destinazione %u" - -#: access/transam/xlog.c:4493 -#, c-format -msgid "could not create control file \"%s\": %m" -msgstr "creazione del file di controllo \"%s\" fallita: %m" - -#: access/transam/xlog.c:4505 access/transam/xlog.c:4759 -#, c-format -msgid "could not write to control file: %m" -msgstr "scrittura nel file di controllo fallita: %m" - -#: access/transam/xlog.c:4513 access/transam/xlog.c:4767 -#, c-format -msgid "could not fsync control file: %m" -msgstr "fsync del file di controllo fallito: %m" - -#: access/transam/xlog.c:4519 access/transam/xlog.c:4773 -#, c-format -msgid "could not close control file: %m" -msgstr "chiusura del file di controllo fallita: %m" - -#: access/transam/xlog.c:4538 access/transam/xlog.c:4747 -#, c-format -msgid "could not open control file \"%s\": %m" -msgstr "apertura del file di controllo \"%s\" fallita: %m" - -#: access/transam/xlog.c:4548 -#, c-format -msgid "could not read from control file: %m" -msgstr "lettura dal file di controllo fallita: %m" - -#: access/transam/xlog.c:4551 +#: access/transam/xlog.c:3884 #, c-format -msgid "could not read from control file: read %d bytes, expected %d" -msgstr "errore nella lettura del file di controllo: %d byte letti, %d attesi" +msgid "could not generate secret authorization token" +msgstr "generazione del token segreto di autenticazione fallita" -#: access/transam/xlog.c:4566 access/transam/xlog.c:4575 -#: access/transam/xlog.c:4599 access/transam/xlog.c:4606 -#: access/transam/xlog.c:4613 access/transam/xlog.c:4618 -#: access/transam/xlog.c:4625 access/transam/xlog.c:4632 -#: access/transam/xlog.c:4639 access/transam/xlog.c:4646 -#: access/transam/xlog.c:4653 access/transam/xlog.c:4660 -#: access/transam/xlog.c:4669 access/transam/xlog.c:4676 -#: access/transam/xlog.c:4685 access/transam/xlog.c:4692 -#: utils/init/miscinit.c:1506 +#: 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 "i file del database sono incompatibili col server" -#: access/transam/xlog.c:4567 +#: 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 "Il cluster di database è stato inizializzato con PG_CONTROL_VERSION %d (0x%08x), ma il server è stato compilato con PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4571 +#: 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 "Questo potrebbe essere un problema di ordinamento di byte che non combacia. Sembra sia necessario eseguire initdb." -#: access/transam/xlog.c:4576 +#: 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 "Il cluster di database è stato inizializzato con PG_CONTROL_VERSION %d, ma il server è stato compilato con PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4579 access/transam/xlog.c:4603 -#: access/transam/xlog.c:4610 access/transam/xlog.c:4615 +#: 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 "Sembra sia necessario eseguire initdb." -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "il checksum nel file di controllo non è corretto" -#: access/transam/xlog.c:4600 +#: 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 "Il cluster di database è stato inizializzato con CATALOG_VERSION_NO %d, ma il server è stato compilato con CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4607 +#: 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 "Il cluster di database è stato inizializzato con MAXALIGN %d, ma il server è stato compilato con MAXALIGN %d." -#: access/transam/xlog.c:4614 +#: 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 "Il cluster di database sta usando un formato per i numeri in virgola mobile diverso da quello usato dall'eseguibile del server." -#: access/transam/xlog.c:4619 +#: 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 "Il cluster di database è stato inizializzato con BLCKSZ %d, ma il server è stato compilato con BLCKSZ %d." -#: access/transam/xlog.c:4622 access/transam/xlog.c:4629 -#: access/transam/xlog.c:4636 access/transam/xlog.c:4643 -#: access/transam/xlog.c:4650 access/transam/xlog.c:4657 -#: access/transam/xlog.c:4664 access/transam/xlog.c:4672 -#: access/transam/xlog.c:4679 access/transam/xlog.c:4688 -#: access/transam/xlog.c:4695 +#: 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 "Si consiglia di ricompilare il sistema o di eseguire initdb." -#: access/transam/xlog.c:4626 +#: 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 "Il cluster di database è stato inizializzato con RELSEG_SIZE %d, ma il server è stato compilato con RELSEG_SIZE %d." -#: access/transam/xlog.c:4633 +#: 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 "Il cluster di database è stato inizializzato con XLOG_BLOCKSZ %d, ma il server è stato compilato con XLOG_BLOCKSZ %d." -#: access/transam/xlog.c:4640 +#: 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 "Il cluster di database è stato inizializzato con NAMEDATALEN %d, ma il server è stato compilato con NAMEDATALEN %d." -#: access/transam/xlog.c:4647 +#: 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 "Il cluster di database è stato inizializzato con INDEX_MAX_KEYS %d, ma il server è stato compilato con INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4654 +#: 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 "Il cluster di database è stato inizializzato con TOAST_MAX_CHUNK_SIZE %d, ma il server è stato compilato con TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4661 +#: 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 "Il cluster di database è stato inizializzato con LOBLKSIZE %d, ma il server è stato compilato con LOBLKSIZE %d." -#: access/transam/xlog.c:4670 -#, c-format -msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." -msgstr "Il cluster di database è stato inizializzato senza USE_FLOAT4_BYVAL, ma il server è stato compilato con USE_FLOAT4_BYVAL." - -#: access/transam/xlog.c:4677 -#, c-format -msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." -msgstr "Il cluster di database è stato inizializzato con USE_FLOAT4_BYVAL, ma il server è stato compilato senza USE_FLOAT4_BYVAL." - -#: access/transam/xlog.c:4686 +#: 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 "Il cluster di database è stato inizializzato senza USE_FLOAT8_BYVAL, ma il server è stato compilato con USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4693 +#: 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 "Il cluster di database è stato inizializzato con USE_FLOAT8_BYVAL, ma il server è stato compilato senza USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4702 +#: 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] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte" -msgstr[1] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte" +msgstr[0] "La dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte" +msgstr[1] "La dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte" -#: access/transam/xlog.c:4714 +#: access/transam/xlog.c:4175 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" dev'essere almeno il doppio di \"wal_segment_size\"" -#: access/transam/xlog.c:4718 +#: access/transam/xlog.c:4179 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" dev'essere almeno il doppio di \"wal_segment_size\"" -#: access/transam/xlog.c:5105 -#, c-format -msgid "could not generate secret authorization token" -msgstr "generazione del token segreto di autenticazione fallita" - -#: access/transam/xlog.c:5195 +#: access/transam/xlog.c:4620 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "scrittura del file di bootstrap del log write-ahead fallita: %m" -#: access/transam/xlog.c:5203 +#: access/transam/xlog.c:4628 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "sincronizzazione del file di bootstrap del log write-ahead fallita: %m" -#: access/transam/xlog.c:5209 +#: access/transam/xlog.c:4634 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "chiusura del file di bootstrap del log write-ahead fallita: %m" -#: access/transam/xlog.c:5291 +#: access/transam/xlog.c:4852 #, c-format -msgid "could not open recovery command file \"%s\": %m" -msgstr "apertura del file di ripristino \"%s\" fallita: %m" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "Il WAL è stato generato con wal_level=minimal, alcuni dati potrebbero mancare" -#: access/transam/xlog.c:5337 access/transam/xlog.c:5451 +#: access/transam/xlog.c:4853 #, c-format -msgid "invalid value for recovery parameter \"%s\": \"%s\"" -msgstr "valore non valido per il parametro di ripristino \"%s\": \"%s\"" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Ciò accade se imposti temporaneamente wal_level=minimal sul server." -#: access/transam/xlog.c:5340 +#: access/transam/xlog.c:4854 #, c-format -msgid "Valid values are \"pause\", \"promote\", and \"shutdown\"." -msgstr "I valori validi sono \"pause\", \"promote\" e \"shutdown\"." +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Utilizzare un backup eseguito dopo aver impostato wal_level su un valore superiore al minimo." -# da non tradurre -# DV: perché (già tradotto peraltro) -#: access/transam/xlog.c:5360 +#: access/transam/xlog.c:4918 #, c-format -msgid "recovery_target_timeline is not a valid number: \"%s\"" -msgstr "recovery_target_timeline non ha un valore numerico valido: \"%s\"" +msgid "control file contains invalid checkpoint location" +msgstr "il file di controllo contiene una posizione del checkpoint non valida" -#: access/transam/xlog.c:5377 +#: access/transam/xlog.c:4929 #, c-format -msgid "recovery_target_xid is not a valid number: \"%s\"" -msgstr "recovery_target_xid non ha un valore numerico valido: \"%s\"" +msgid "database system was shut down at %s" +msgstr "il database è stato arrestato alle %s" -#: access/transam/xlog.c:5397 +#: access/transam/xlog.c:4935 #, c-format -msgid "recovery_target_time is not a valid timestamp: \"%s\"" -msgstr "recovery_target_time non è un timestamp valido: \"%s\"" +msgid "database system was shut down in recovery at %s" +msgstr "il database è stato arrestato durante il ripristino alle %s" -#: access/transam/xlog.c:5420 +#: access/transam/xlog.c:4941 #, c-format -msgid "recovery_target_name is too long (maximum %d characters)" -msgstr "il recovery_target_name è troppo lungo (massimo %d caratteri)" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "l'arresto del database è stato interrotto; l'ultimo segno di vita risale alle %s" -#: access/transam/xlog.c:5454 +#: access/transam/xlog.c:4947 #, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "Il solo valore permesso è \"immediate\"." - -#: access/transam/xlog.c:5467 access/transam/xlog.c:5478 -#: commands/extension.c:547 commands/extension.c:555 utils/misc/guc.c:5984 +msgid "database system was interrupted while in recovery at %s" +msgstr "il database è stato interrotto alle %s mentre era in fase di ripristino" + +#: access/transam/xlog.c:4949 #, c-format -msgid "parameter \"%s\" requires a Boolean value" -msgstr "il parametro \"%s\" richiede un valore booleano" +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "Questo probabilmente significa che alcuni dati sono corrotti e dovrai usare il backup più recente per il ripristino." -#: access/transam/xlog.c:5513 +#: access/transam/xlog.c:4955 #, c-format -msgid "parameter \"%s\" requires a temporal value" -msgstr "il parametro \"%s\" richiede un valore temporale" +msgid "database system was interrupted while in recovery at log time %s" +msgstr "il database è stato interrotto all'orario di log %s mentre era in fase di ripristino" -#: access/transam/xlog.c:5515 catalog/dependency.c:969 catalog/dependency.c:970 -#: catalog/dependency.c:976 catalog/dependency.c:977 catalog/dependency.c:988 -#: catalog/dependency.c:989 commands/tablecmds.c:1069 -#: commands/tablecmds.c:10789 commands/user.c:1064 commands/view.c:509 -#: libpq/auth.c:336 replication/syncrep.c:1158 storage/lmgr/deadlock.c:1139 -#: storage/lmgr/proc.c:1324 utils/adt/acl.c:5344 utils/misc/guc.c:6006 -#: utils/misc/guc.c:6099 utils/misc/guc.c:10089 utils/misc/guc.c:10123 -#: utils/misc/guc.c:10157 utils/misc/guc.c:10191 utils/misc/guc.c:10226 +#: access/transam/xlog.c:4957 #, c-format -msgid "%s" -msgstr "%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 "Se ciò è avvenuto più di una volta, alcuni dati potrebbero essere corrotti e potresti dover scegliere una destinazione di ripristino precedente." -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:4963 #, c-format -msgid "unrecognized recovery parameter \"%s\"" -msgstr "parametro di ripristino \"%s\" sconosciuto" +msgid "database system was interrupted; last known up at %s" +msgstr "il database è stato interrotto; l'ultimo segno di vita risale alle %s" -#: access/transam/xlog.c:5533 +#: access/transam/xlog.c:4969 #, c-format -msgid "recovery command file \"%s\" specified neither primary_conninfo nor restore_command" -msgstr "il file dei comandi di ripristino \"%s\" non specifica né primary_conninfo né restore_command" +msgid "control file contains invalid database cluster state" +msgstr "il file di controllo contiene uno stato del cluster di database non valido" -#: access/transam/xlog.c:5535 +#: access/transam/xlog.c:5353 #, c-format -msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." -msgstr "Il server database ispezionerà regolarmente la sottodirectory pg_wal per controllare se vi vengono aggiunti dei file.\"" +msgid "WAL ends before end of online backup" +msgstr "Il WAL termina prima della fine del backup online" -#: access/transam/xlog.c:5542 +#: access/transam/xlog.c:5354 #, c-format -msgid "recovery command file \"%s\" must specify restore_command when standby mode is not enabled" -msgstr "il file dei comandi di ripristino \"%s\" deve specificare restore_command quando la modalità standby non è abilitata" +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "Tutti i file WAL generati mentre il backup online veniva effettuato devono essere disponibili al momento del ripristino." -#: access/transam/xlog.c:5563 +#: access/transam/xlog.c:5357 #, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "la modalità di standby non è supportata per i server a utente singolo" +msgid "WAL ends before consistent recovery point" +msgstr "Il WAL termina prima di un punto di ripristino consistente" -#: access/transam/xlog.c:5582 +#: access/transam/xlog.c:5405 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "la timeline destinazione di recupero %u non esiste" +msgid "selected new timeline ID: %u" +msgstr "l'ID della nuova timeline selezionata è %u" -#: access/transam/xlog.c:5703 +#: access/transam/xlog.c:5438 #, c-format msgid "archive recovery complete" msgstr "il ripristino dell'archivio è stato completato" -#: access/transam/xlog.c:5762 access/transam/xlog.c:6028 +#: access/transam/xlog.c:6040 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "il ripristino è stato interrotto dopo aver raggiunto la consistenza" +msgid "shutting down" +msgstr "arresto in corso" -#: access/transam/xlog.c:5783 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6079 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "il ripristino è stato interrotto prima della locazione WAL (LSN) \"%X/%X\"" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "inizio del punto di riavvio:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:5869 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6091 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "il ripristino è stato interrotto prima del commit della transazione %u, orario %s" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "inizio checkpoint:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:5876 +#: access/transam/xlog.c:6151 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "il ripristino è stato interrotto prima dell'abort della transazione %u alle %s" +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 "punto di riavvio completato: ha scritto %d buffer (%.1f%%); %d file WAL aggiunti, %d rimossi, %d riciclati; scrittura=%ld.%03d s, sincronizzazione=%ld.%03d s, totale=%ld.%03d s; file di sincronizzazione=%d, più lungo=%ld.%03d s, medio=%ld.%03d s; distanza=%d kB, stima=%d kB" -#: access/transam/xlog.c:5922 +#: access/transam/xlog.c:6171 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "il ripristino è stato interrotto al punto di ripristino \"%s\" alle %s" +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 completato: ha scritto %d buffer (%.1f%%); %d file WAL aggiunti, %d rimossi, %d riciclati; scrittura=%ld.%03d s, sincronizzazione=%ld.%03d s, totale=%ld.%03d s; file di sincronizzazione=%d, più lungo=%ld.%03d s, medio=%ld.%03d s; distanza=%d kB, stima=%d kB" -#: access/transam/xlog.c:5940 +#: access/transam/xlog.c:6606 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "il ripristino è stato interrotto dopo la locazione WAL (LSN) \"%X/%X\"" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "attività concorrente del log write-ahead mentre il database è in fase di arresto" -#: access/transam/xlog.c:6008 +#: access/transam/xlog.c:7163 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "il ripristino è stato interrotto dopo il commit della transazione %u alle %s" +msgid "recovery restart point at %X/%X" +msgstr "punto di avvio del ripristino in %X/%X" -#: access/transam/xlog.c:6016 +#: access/transam/xlog.c:7165 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "il ripristino è stato interrotto dopo l'abort della transazione %u alle %s" +msgid "Last completed transaction was at log time %s." +msgstr "L'ultima transazione completata è stata registrata all'ora %s." -#: access/transam/xlog.c:6056 +#: access/transam/xlog.c:7412 #, c-format -msgid "recovery has paused" -msgstr "ripristino in pausa" +msgid "restore point \"%s\" created at %X/%X" +msgstr "punto di ripristino \"%s\" creato in %X/%X" -#: access/transam/xlog.c:6057 +#: access/transam/xlog.c:7619 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Esegui pg_wal_replay_resume() per continuare." +msgid "online backup was canceled, recovery cannot continue" +msgstr "il backup online è stato annullato, il ripristino non può continuare" -#: access/transam/xlog.c:6265 +#: access/transam/xlog.c:7676 #, 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 "l'hot standby non è possibile perché %s = %d è un'impostazione inferiore a quella del server master (il cui valore era %d)" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "ID sequenza temporale imprevisto %u (dovrebbe essere %u) nel record del checkpoint di arresto" -#: access/transam/xlog.c:6291 +#: access/transam/xlog.c:7734 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "il WAL è stato generato con wal_level=minimal, alcuni dati potrebbero mancare" +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "ID sequenza temporale imprevisto %u (dovrebbe essere %u) nel record del checkpoint online" -#: access/transam/xlog.c:6292 +#: access/transam/xlog.c:7763 #, c-format -msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." -msgstr "Questo avviene se imposti temporaneamente wal_level=minimal senza effettuare un nuovo backup di base." +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "ID sequenza temporale imprevisto %u (dovrebbe essere %u) nel record di fine ripristino" -#: access/transam/xlog.c:6303 +#: access/transam/xlog.c:8021 #, c-format -msgid "hot standby is not possible because wal_level was not set to \"replica\" or higher on the master server" -msgstr "l'hot standby non è possibile perché il wal_level non è impostato a \"replica\" o superiore nel server master" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "impossibile sincronizzare il file write-through \"%s\": %m" -#: access/transam/xlog.c:6304 +#: access/transam/xlog.c:8027 #, c-format -msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -msgstr "Imposta il wal_level a \"replica\" sul master oppure disattiva hot_standby qui." +msgid "could not fdatasync file \"%s\": %m" +msgstr "impossibile fdatasync file \"%s\": %m" -#: access/transam/xlog.c:6356 +#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 #, c-format -msgid "control file contains invalid data" -msgstr "il file di controllo contiene dati non validi" +msgid "WAL level not sufficient for making an online backup" +msgstr "Livello WAL non sufficiente per creare un backup online" -#: access/transam/xlog.c:6362 +#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was shut down at %s" -msgstr "il database è stato arrestato alle %s" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "il wal_level deve essere impostato a \"replica\" o \"logical\" all'avvio del server." -#: access/transam/xlog.c:6367 +#: access/transam/xlog.c:8128 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "il database è stato arrestato durante il ripristino alle %s" +msgid "backup label too long (max %d bytes)" +msgstr "etichetta di backup troppo lunga (massimo %d byte)" -#: access/transam/xlog.c:6371 +#: access/transam/xlog.c:8244 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "l'arresto del database è stato interrotto; l'ultimo segno di vita risale alle %s" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "Un WAL generato con full_page_writes=off è stato riprodotto dopo l'ultimo restartpoint" -#: access/transam/xlog.c:6375 +#: access/transam/xlog.c:8246 access/transam/xlog.c:8602 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "il database è stato interrotto alle %s mentre era in fase di ripristino" +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 "Ciò significa che il backup eseguito in standby è danneggiato e non deve essere utilizzato. Abilita full_page_writes ed esegui CHECKPOINT sul primario, quindi prova di nuovo un backup online." -#: access/transam/xlog.c:6377 +#: access/transam/xlog.c:8326 backup/basebackup.c:1344 utils/adt/misc.c:347 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "Questo probabilmente significa che alcuni dati sono corrotti e dovrai usare il backup più recente per il ripristino." +msgid "symbolic link \"%s\" target is too long" +msgstr "la destinazione del link simbolico \"%s\" è troppo lunga" -#: access/transam/xlog.c:6381 +#: access/transam/xlog.c:8376 backup/basebackup.c:1359 commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "il database è stato interrotto all'orario di log %s mentre era in fase di ripristino" +msgid "tablespaces are not supported on this platform" +msgstr "i tablespace non sono supportati su questa piattaforma" -#: access/transam/xlog.c:6383 +#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 access/transam/xlogrecovery.c:1192 access/transam/xlogrecovery.c:1199 access/transam/xlogrecovery.c:1258 access/transam/xlogrecovery.c:1338 access/transam/xlogrecovery.c:1362 #, 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 "Se ciò è avvenuto più di una volta, alcuni dati potrebbero essere corrotti e potresti dover scegliere una destinazione di ripristino precedente." +msgid "invalid data in file \"%s\"" +msgstr "i dati nel file \"%s\" non sono validi" -#: access/transam/xlog.c:6387 +#: access/transam/xlog.c:8552 backup/basebackup.c:1199 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "il database è stato interrotto; l'ultimo segno di vita risale alle %s" +msgid "the standby was promoted during online backup" +msgstr "lo standby è stato promosso durante il backup online" -#: access/transam/xlog.c:6443 +#: access/transam/xlog.c:8553 backup/basebackup.c:1200 #, c-format -msgid "entering standby mode" -msgstr "inizio modalità standby" +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "Ciò vuol dire che il backup che stava venendo salvato è corrotto e non dovrebbe essere usato. Prova ad effettuare un altro backup online." -#: access/transam/xlog.c:6446 +#: access/transam/xlog.c:8600 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "avvio del ripristino point-in-time allo XID %u" +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "Un WAL generato con full_page_writes=off è stato riprodotto durante il backup online" -#: access/transam/xlog.c:6450 +#: access/transam/xlog.c:8725 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "avvio del ripristino point-in-time alle %s" +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "backup di base eseguito, in attesa dell'archiviazione dei segmenti WAL richiesti" -#: access/transam/xlog.c:6454 +#: access/transam/xlog.c:8739 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "avvio del ripristino point-in-time a \"%s\"" +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "ancora in attesa dell'archiviazione di tutti i segmenti WAL richiesti (%d secondi trascorsi)" -#: access/transam/xlog.c:6458 +#: access/transam/xlog.c:8741 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "avvio del ripristino point-in-time alla locazione WAL (LSN) \"%X/%X\"" +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 "Verifica che il comando archive_command venga eseguito correttamente. È possibile annullare in sicurezza questo backup, ma il backup del database non sarà utilizzabile senza tutti i segmenti WAL." -#: access/transam/xlog.c:6463 +#: access/transam/xlog.c:8748 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "avvio del ripristino point-in-time al precedente punto consistente" +msgid "all required WAL segments have been archived" +msgstr "tutti i segmenti WAL richiesti sono stati archiviati" -#: access/transam/xlog.c:6466 +#: access/transam/xlog.c:8752 #, c-format -msgid "starting archive recovery" -msgstr "avvio del ripristino dell'archivio" +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'archiviazione WAL non è abilitata; devi verificare che tutti i segmenti WAL richiesti vengano copiati in qualche altro modo per completare il backup" -#: access/transam/xlog.c:6520 access/transam/xlog.c:6645 +#: access/transam/xlog.c:8801 #, c-format -msgid "checkpoint record is at %X/%X" -msgstr "il record di checkpoint si trova in %X/%X" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "backup interrotto a causa dell'uscita del back-end prima della chiamata di pg_backup_stop" -#: access/transam/xlog.c:6534 +#: access/transam/xlogarchive.c:208 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "localizzazione della posizione di redo referenziata dal record di checkpoint fallita" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "il file di archivio \"%s\" ha una dimensione errata: %lld invece di %lld" -#: access/transam/xlog.c:6535 access/transam/xlog.c:6542 +#: access/transam/xlogarchive.c:217 #, c-format -msgid "If you are not restoring from a backup, try removing the file \"%s/backup_label\"." -msgstr "Se non si sta effettuando il ripristino da backup, prova a rimuovere il file \"%s/backup_label\"." +msgid "restored log file \"%s\" from archive" +msgstr "file di log \"%s\" ripristinato dall'archivio" -#: access/transam/xlog.c:6541 +#: access/transam/xlogarchive.c:231 #, c-format -msgid "could not locate required checkpoint record" -msgstr "localizzazione del record di checkpoint richiesto fallita" +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command ha restituito uno stato di uscita zero, ma stat() non è riuscito." -#: access/transam/xlog.c:6567 commands/tablespace.c:641 +#: access/transam/xlogarchive.c:263 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "creazione del link simbolico \"%s\" fallita: %m" +msgid "could not restore file \"%s\" from archive: %s" +msgstr "non è stato possibile ripristinare il file \"%s\" dall'archivio: %s" -#: access/transam/xlog.c:6599 access/transam/xlog.c:6605 +#. 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 "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "il file \"%s\" verrà ignorato perché il file \"%s\" non esiste" +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" -#: access/transam/xlog.c:6601 access/transam/xlog.c:11621 +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "Il file \"%s\" è stato rinominato in \"%s\"." +msgid "could not create archive status file \"%s\": %m" +msgstr "creazione del file di stato dell'archivio \"%s\" fallita: %m" -#: access/transam/xlog.c:6607 +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "Cambio del nome del file da \"%s\" a \"%s\" fallito: %m." +msgid "could not write archive status file \"%s\": %m" +msgstr "scrittura del file di stato dell'archivio \"%s\" fallita: %m" -#: access/transam/xlog.c:6657 +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "localizzazione di un record di checkpoint valido fallita" +msgid "a backup is already in progress in this session" +msgstr "c'è già un backup in corso in questa sessione" -#: access/transam/xlog.c:6695 +#: access/transam/xlogfuncs.c:126 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "la timeline richiesta %u non è figlia della storia di questo server" +msgid "backup is not in progress" +msgstr "il backup non è in corso" -#: access/transam/xlog.c:6697 +#: access/transam/xlogfuncs.c:127 #, 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 "L'ultimo checkpoint è a %X/%X sulla timeline %u, ma nella storia della timeline richiesta, il server si è separato da quella timeline a %X/%X." +msgid "Did you call pg_backup_start()?" +msgstr "Hai chiamato pg_backup_start()?" -#: access/transam/xlog.c:6713 +#: 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 "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "la timeline richiesta %u non contiene il punto di recupero minimo %X/%X sulla timeline %u" +msgid "WAL control functions cannot be executed during recovery." +msgstr "Le funzioni di controllo WAL non possono essere eseguite durante il ripristino." -#: access/transam/xlog.c:6744 +#: access/transam/xlogfuncs.c:198 #, c-format -msgid "invalid next transaction ID" -msgstr "l'ID della prossima transazione non è valido" +msgid "WAL level not sufficient for creating a restore point" +msgstr "Livello WAL non sufficiente per creare un punto di ripristino" -#: access/transam/xlog.c:6839 +#: access/transam/xlogfuncs.c:206 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "il redo nel record di checkpoint non è valido" +msgid "value too long for restore point (maximum %d characters)" +msgstr "il valore è troppo lungo per un punto di ripristino (massimo %d caratteri)" -#: access/transam/xlog.c:6850 +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "record di redo non valido nel checkpoint di arresto" +msgid "%s cannot be executed during recovery." +msgstr "%s non può essere eseguito durante il ripristino." -#: access/transam/xlog.c:6878 +#: 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 "database system was not properly shut down; automatic recovery in progress" -msgstr "il database non è stato arrestato correttamente; ripristino automatico in corso" +msgid "recovery is not in progress" +msgstr "il recupero non è in corso" -#: access/transam/xlog.c:6882 +#: 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 "crash recovery starts in timeline %u and has target timeline %u" -msgstr "il recupero dal crash comincia nella timeline %u e si conclude nella timeline %u" +msgid "Recovery control functions can only be executed during recovery." +msgstr "Le funzioni di controllo del recupero possono essere eseguite solo durante un recupero." -#: access/transam/xlog.c:6925 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "backup_label contiene dati non consistenti col file di controllo" +msgid "standby promotion is ongoing" +msgstr "la promozione in standby è in corso" -#: access/transam/xlog.c:6926 +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 #, c-format -msgid "This means that the backup is corrupted and you will have to use another backup for recovery." -msgstr "Questo vuol dire che il backup è corrotto e sarà necessario usare un altro backup per il ripristino." +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s non può essere eseguito dopo l'attivazione della promozione." -#: access/transam/xlog.c:7017 +#: access/transam/xlogfuncs.c:587 #, c-format -msgid "initializing for hot standby" -msgstr "inizializzazione per l'hot standby" +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" non deve essere negativo o zero" -#: access/transam/xlog.c:7149 +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 #, c-format -msgid "redo starts at %X/%X" -msgstr "il redo inizia in %X/%X" +msgid "failed to send signal to postmaster: %m" +msgstr "invio del segnale al postmaster fallito: %m" -#: access/transam/xlog.c:7383 +#: access/transam/xlogfuncs.c:643 #, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "lo stop point di ripristino è posto prima di un punto di ripristino consistente" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "il server non è stato promosso entro %d secondo" +msgstr[1] "il server non è stato promosso entro %d secondi" -#: access/transam/xlog.c:7421 +#: access/transam/xlogprefetcher.c:1090 #, c-format -msgid "redo done at %X/%X" -msgstr "redo concluso in %X/%X" +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch non è supportato su piattaforme prive di posix_fadvise()." -#: access/transam/xlog.c:7426 +#: access/transam/xlogreader.c:625 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "l'ultima transazione è stata completata all'orario di log %s" +msgid "invalid record offset at %X/%X" +msgstr "offset del record non valido a %X/%X" -#: access/transam/xlog.c:7435 +#: access/transam/xlogreader.c:633 #, c-format -msgid "redo is not required" -msgstr "redo non richiesto" +msgid "contrecord is requested by %X/%X" +msgstr "contrecord richiesto da %X/%X" -#: access/transam/xlog.c:7510 access/transam/xlog.c:7514 +#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 #, c-format -msgid "WAL ends before end of online backup" -msgstr "il WAL termina prima della fine del backup online" +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "lunghezza del record a %X/%X non valida: atteso %u, ricevuto %u" -#: access/transam/xlog.c:7511 +#: access/transam/xlogreader.c:703 #, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "Tutti i file WAL generati mentre il backup online veniva effettuato devono essere disponibili al momento del ripristino." +msgid "out of memory while trying to decode a record of length %u" +msgstr "memoria insufficiente durante il tentativo di decodificare un record di lunghezza %u" -#: access/transam/xlog.c:7515 +#: access/transam/xlogreader.c:725 #, 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 backup online iniziato con pg_start_backup() deve essere terminato con pg_stop_backup(), e tutti i file WAL fino a quel punto devono essere disponibili per il ripristino." +msgid "record length %u at %X/%X too long" +msgstr "lunghezza del record %u a %X/%X eccessiva" -#: access/transam/xlog.c:7518 +#: access/transam/xlogreader.c:774 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "il WAL termina prima di un punto di ripristino consistente" +msgid "there is no contrecord flag at %X/%X" +msgstr "non c'è un flag di contrecord a %X/%X" -#: access/transam/xlog.c:7552 +#: access/transam/xlogreader.c:787 #, c-format -msgid "selected new timeline ID: %u" -msgstr "l'ID della nuova timeline selezionata è %u" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "lunghezza contrada non valida %u (prevista %lld) a %X/%X" -#: access/transam/xlog.c:7989 +#: access/transam/xlogreader.c:922 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "è stato raggiunto uno stato di ripristino consistente a %X/%X" +msgid "missing contrecord at %X/%X" +msgstr "record mancante a %X/%X" -#: access/transam/xlog.c:8181 +#: access/transam/xlogreader.c:1129 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "il link nel file di controllo al checkpoint primario non è valido" +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ID gestore risorse %u non valido su %X/%X" -#: access/transam/xlog.c:8185 +#: access/transam/xlogreader.c:1142 access/transam/xlogreader.c:1158 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "il link al checkpoint nel file backup_label non è valido" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "record con link-precedente %X/%X non corretto a %X/%X" -#: access/transam/xlog.c:8202 +#: access/transam/xlogreader.c:1194 #, c-format -msgid "invalid primary checkpoint record" -msgstr "il record del checkpoint primario non è valido" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X" -#: access/transam/xlog.c:8206 +#: access/transam/xlogreader.c:1231 #, c-format -msgid "invalid checkpoint record" -msgstr "il record del checkpoint non è valido" +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "numero magico %04X non valido nel segmento di log %s, offset %u" -#: access/transam/xlog.c:8217 +#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1286 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "l'ID del resource manager nel record del checkpoint primario non è valido" +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "bit di info %04X non validi nel segmento di log %s, offset %u" -#: access/transam/xlog.c:8221 +#: access/transam/xlogreader.c:1260 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "l'ID del resource manager nel record del checkpoint non è valido" +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "Il file WAL proviene da un sistema di database diverso: l'identificatore del sistema del database del file WAL è %llu, l'identificatore del sistema del database pg_control è %llu" -#: access/transam/xlog.c:8234 +#: access/transam/xlogreader.c:1268 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "l'xl_info nel record del checkpoint primario non è valido" +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "Il file di WAL è di un diverso database: dimensione del segmento sbagliata nell'header di pagina" -#: access/transam/xlog.c:8238 +#: access/transam/xlogreader.c:1274 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "l'xl_info nel record del checkpoint non è valido" +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "Il file di WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina" -#: access/transam/xlog.c:8249 +#: access/transam/xlogreader.c:1305 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "la lunghezza del record del checkpoint primario non è valida" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u" -#: access/transam/xlog.c:8253 +#: access/transam/xlogreader.c:1330 #, c-format -msgid "invalid length of checkpoint record" -msgstr "la lunghezza del record del checkpoint non è valida" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "rilevato ID della timeline %u (dopo %u) fuori sequenza nel segmento di log %s, offset %u" -#: access/transam/xlog.c:8459 +#: access/transam/xlogreader.c:1735 #, c-format -msgid "shutting down" -msgstr "arresto in corso" +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id fuori sequenza %u a %X/%X" -#: access/transam/xlog.c:8779 +#: access/transam/xlogreader.c:1759 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "checkpoint saltato perché il sistema è inattivo" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X" -#: access/transam/xlog.c:8984 +#: access/transam/xlogreader.c:1766 #, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "attività concorrente del log write-ahead mentre il database è in fase di arresto" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X" -#: access/transam/xlog.c:9241 +#: access/transam/xlogreader.c:1802 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "si tralascia il restartpoint, il ripristino è ormai terminato" +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X" -#: access/transam/xlog.c:9264 +#: access/transam/xlogreader.c:1818 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "si tralascia il restartpoint, già eseguito in %X/%X" +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X" -#: access/transam/xlog.c:9431 +#: access/transam/xlogreader.c:1832 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "punto di avvio del ripristino in %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED impostato, ma blocca la lunghezza dell'immagine %u a %X/%X" -#: access/transam/xlog.c:9433 +#: access/transam/xlogreader.c:1847 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "L'ultima transazione completata è stata registrata all'ora %s." +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X" -#: access/transam/xlog.c:9567 +#: access/transam/xlogreader.c:1863 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "punto di ripristino \"%s\" creato in %X/%X" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X" -#: access/transam/xlog.c:9705 +#: access/transam/xlogreader.c:1875 #, c-format -msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "timeline precedente con ID %u non prevista (l'ID della timeline corrente è %u) nel record di checkpoint" +msgid "invalid block_id %u at %X/%X" +msgstr "block_id %u non valido a %X/%X" -#: access/transam/xlog.c:9714 +#: access/transam/xlogreader.c:1942 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "timeline ID %u imprevista (dopo %u) nel record di checkpoint" +msgid "record with invalid length at %X/%X" +msgstr "record con lunghezza non valida a %X/%X" -#: access/transam/xlog.c:9730 +#: access/transam/xlogreader.c:1967 #, c-format -msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" -msgstr "timeline ID %u imprevista nel record di checkpoint, prima di raggiungere il punto di recupero minimo %X/%X sulla timeline %u" +msgid "could not locate backup block with ID %d in WAL record" +msgstr "impossibile individuare il blocco di backup con ID %d nel record WAL" -#: access/transam/xlog.c:9806 +#: access/transam/xlogreader.c:2051 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "il backup online è stato annullato, il ripristino non può continuare" +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "impossibile ripristinare l'immagine in %X/%X con il blocco %d non valido specificato" -#: access/transam/xlog.c:9862 access/transam/xlog.c:9918 -#: access/transam/xlog.c:9941 +#: access/transam/xlogreader.c:2058 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "l'ID della timeline %u (che dovrebbe essere %u) non era prevista nel record di checkpoint" +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "impossibile ripristinare l'immagine in %X/%X con stato non valido, blocco %d" -#: access/transam/xlog.c:10222 +#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 #, c-format -msgid "could not fsync log segment %s: %m" -msgstr "fsync del segmento di log %s fallito: %m" +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "impossibile ripristinare l'immagine in %X/%X compressa con %s non supportata da build, blocco %d" -#: access/transam/xlog.c:10247 +#: access/transam/xlogreader.c:2111 #, c-format -msgid "could not fsync log file %s: %m" -msgstr "fsync del file di log %s fallito: %m" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "impossibile ripristinare l'immagine in %X/%X compressa con metodo sconosciuto, blocco %d" -#: access/transam/xlog.c:10255 +#: access/transam/xlogreader.c:2119 #, c-format -msgid "could not fsync write-through log file %s: %m" -msgstr "fsync write-through del file di log %s fallito: %m" +msgid "could not decompress image at %X/%X, block %d" +msgstr "impossibile decomprimere l'immagine in %X/%X, blocco %d" -#: access/transam/xlog.c:10264 +#: access/transam/xlogrecovery.c:526 #, c-format -msgid "could not fdatasync log file %s: %m" -msgstr "fdatasync del file di log %s fallito: %m" +msgid "entering standby mode" +msgstr "inizio modalità standby" -#: access/transam/xlog.c:10355 access/transam/xlog.c:10882 -#: access/transam/xlogfuncs.c:287 access/transam/xlogfuncs.c:314 -#: access/transam/xlogfuncs.c:353 access/transam/xlogfuncs.c:374 -#: access/transam/xlogfuncs.c:395 +#: access/transam/xlogrecovery.c:529 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "le funzioni di controllo WAL non possono essere eseguite durante il ripristino." +msgid "starting point-in-time recovery to XID %u" +msgstr "avvio del ripristino point-in-time allo XID %u" -#: access/transam/xlog.c:10364 access/transam/xlog.c:10891 +#: access/transam/xlogrecovery.c:533 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "livello WAL non sufficiente per creare un backup online" +msgid "starting point-in-time recovery to %s" +msgstr "avvio del ripristino point-in-time alle %s" -#: access/transam/xlog.c:10365 access/transam/xlog.c:10892 -#: access/transam/xlogfuncs.c:320 +#: access/transam/xlogrecovery.c:537 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "Il wal_level deve essere impostato a \"replica\" o \"logical\" all'avvio del server." +msgid "starting point-in-time recovery to \"%s\"" +msgstr "avvio del ripristino point-in-time a \"%s\"" -#: access/transam/xlog.c:10370 +#: access/transam/xlogrecovery.c:541 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "etichetta di backup troppo lunga (massimo %d byte)" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "avvio del ripristino point-in-time alla locazione WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:10407 access/transam/xlog.c:10683 -#: access/transam/xlog.c:10721 +#: access/transam/xlogrecovery.c:545 #, c-format -msgid "a backup is already in progress" -msgstr "c'è già un backup in corso" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "avvio del ripristino point-in-time al precedente punto consistente" -#: access/transam/xlog.c:10408 +#: access/transam/xlogrecovery.c:548 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Esegui pg_stop_backup() e prova di nuovo." +msgid "starting archive recovery" +msgstr "avvio del ripristino dell'archivio" -#: access/transam/xlog.c:10504 +#: access/transam/xlogrecovery.c:632 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "un WAL generato con full_page_writes=off è stato riprodotto dopo l'ultimo restartpoint" +msgid "could not find redo location referenced by checkpoint record" +msgstr "localizzazione della posizione di redo referenziata dal record di checkpoint fallita" -#: access/transam/xlog.c:10506 access/transam/xlog.c:11087 +#: access/transam/xlogrecovery.c:633 access/transam/xlogrecovery.c:643 #, 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 "Ciò vuol dire che il backup che sta venendo preso sullo standby è corrotto e non dovrebbe essere usato. Abilita full_page_writes ed esegui CHECKPOINT sul master, poi prova ad effettuare nuovamente un backup online.\"" +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 "" +"Se stai eseguendo il ripristino da un backup, tocca \"%s/recovery.signal\" e aggiungi le opzioni di ripristino richieste.\n" +"Se non stai eseguendo il ripristino da un backup, prova a rimuovere il file \"%s/backup_label\".\n" +"Fai attenzione: la rimozione di \"%s/backup_label\" risulterà in un cluster danneggiato se il ripristino da un backup." -#: access/transam/xlog.c:10574 replication/basebackup.c:1225 -#: utils/adt/misc.c:517 +#: access/transam/xlogrecovery.c:642 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "lettura del link simbolico \"%s\" fallita: %m" +msgid "could not locate required checkpoint record" +msgstr "localizzazione del record di checkpoint richiesto fallita" -#: access/transam/xlog.c:10581 replication/basebackup.c:1230 -#: utils/adt/misc.c:522 +#: access/transam/xlogrecovery.c:671 commands/tablespace.c:685 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "la destinazione del link simbolico \"%s\" è troppo lunga" +msgid "could not create symbolic link \"%s\": %m" +msgstr "creazione del link simbolico \"%s\" fallita: %m" -#: access/transam/xlog.c:10633 commands/tablespace.c:391 -#: commands/tablespace.c:553 replication/basebackup.c:1245 utils/adt/misc.c:530 +#: access/transam/xlogrecovery.c:703 access/transam/xlogrecovery.c:709 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "i tablespace non sono supportati su questa piattaforma" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "il file \"%s\" verrà ignorato perché il file \"%s\" non esiste" -#: access/transam/xlog.c:10677 access/transam/xlog.c:10715 -#: access/transam/xlog.c:10930 access/transam/xlogarchive.c:105 -#: access/transam/xlogarchive.c:265 commands/copy.c:1872 commands/copy.c:3156 -#: commands/extension.c:3319 commands/tablespace.c:782 -#: commands/tablespace.c:873 replication/basebackup.c:516 -#: replication/basebackup.c:586 replication/logical/snapbuild.c:1525 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1732 -#: storage/file/fd.c:3098 storage/file/fd.c:3277 storage/file/fd.c:3362 -#: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 -#: utils/adt/genfile.c:131 utils/adt/genfile.c:382 guc-file.l:1004 +#: access/transam/xlogrecovery.c:705 #, c-format -msgid "could not stat file \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "Il file \"%s\" è stato rinominato in \"%s\"." -#: access/transam/xlog.c:10684 access/transam/xlog.c:10722 +#: access/transam/xlogrecovery.c:711 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "Se si è certi che non ci sono backup in corso, rimuovi il file \"%s\" e prova di nuovo." +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Cambio del nome del file da \"%s\" a \"%s\" fallito: %m." -#: access/transam/xlog.c:10701 access/transam/xlog.c:10739 -#: access/transam/xlog.c:11150 postmaster/syslogger.c:1476 -#: postmaster/syslogger.c:1489 +#: access/transam/xlogrecovery.c:765 #, c-format -msgid "could not write file \"%s\": %m" -msgstr "scrittura nel file \"%s\" fallita: %m" +msgid "could not locate a valid checkpoint record" +msgstr "localizzazione di un record di checkpoint valido fallita" -#: access/transam/xlog.c:10907 +#: access/transam/xlogrecovery.c:789 #, c-format -msgid "exclusive backup not in progress" -msgstr "non c'è un backup esclusivo in corso" +msgid "requested timeline %u is not a child of this server's history" +msgstr "la timeline richiesta %u non è figlia della storia di questo server" -#: access/transam/xlog.c:10934 +#: access/transam/xlogrecovery.c:791 #, c-format -msgid "a backup is not in progress" -msgstr "non c'è un backup in esecuzione" +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 "L'ultimo checkpoint è a %X/%X sulla timeline %u, ma nella storia della timeline richiesta, il server si è separato da quella timeline a %X/%X." -#: access/transam/xlog.c:11020 access/transam/xlog.c:11033 -#: access/transam/xlog.c:11394 access/transam/xlog.c:11400 -#: access/transam/xlog.c:11448 access/transam/xlog.c:11521 -#: access/transam/xlogfuncs.c:688 +#: access/transam/xlogrecovery.c:805 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "i dati nel file \"%s\" non sono validi" +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "la timeline richiesta %u non contiene il punto di recupero minimo %X/%X sulla timeline %u" -#: access/transam/xlog.c:11037 replication/basebackup.c:1082 +#: access/transam/xlogrecovery.c:833 #, c-format -msgid "the standby was promoted during online backup" -msgstr "lo standby è stato promosso durante il backup online" +msgid "invalid next transaction ID" +msgstr "l'ID della prossima transazione non è valido" -#: access/transam/xlog.c:11038 replication/basebackup.c:1083 +#: access/transam/xlogrecovery.c:838 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "Ciò vuol dire che il backup che stava venendo salvato è corrotto e non dovrebbe essere usato. Prova ad effettuare un altro backup online." +msgid "invalid redo in checkpoint record" +msgstr "il redo nel record di checkpoint non è valido" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:849 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "un WAL generato con full_page_writes=off è stato riprodotto durante il backup online" +msgid "invalid redo record in shutdown checkpoint" +msgstr "record di redo non valido nel checkpoint di arresto" -#: access/transam/xlog.c:11205 +#: access/transam/xlogrecovery.c:878 #, c-format -msgid "pg_stop_backup cleanup done, waiting for required WAL segments to be archived" -msgstr "pulizia di pg_stop_backup effettuata, in attesa che i segmenti WAL richiesti vengano archiviati" +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "il database non è stato arrestato correttamente; ripristino automatico in corso" -#: access/transam/xlog.c:11215 +#: access/transam/xlogrecovery.c:882 #, c-format -msgid "pg_stop_backup still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "pg_stop_backup è ancora in attesa che tutti i segmenti WAL richiesti siano stati archiviati (sono passati %d secondi)" +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "il recupero dal crash comincia nella timeline %u e si conclude nella timeline %u" -#: access/transam/xlog.c:11217 +#: access/transam/xlogrecovery.c:925 #, c-format -msgid "Check that your archive_command is executing properly. pg_stop_backup can be canceled safely, but the database backup will not be usable without all the WAL segments." -msgstr "Controlla che il tuo archive_command venga eseguito correttamente. pg_stop_backup può essere interrotto in sicurezza ma il backup del database non sarà utilizzabile senza tutti i segmenti WAL." +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label contiene dati non consistenti col file di controllo" -#: access/transam/xlog.c:11224 +#: access/transam/xlogrecovery.c:926 #, c-format -msgid "pg_stop_backup complete, all required WAL segments have been archived" -msgstr "pg_stop_backup completo, tutti i segmenti WAL richiesti sono stati archiviati" +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "Questo vuol dire che il backup è corrotto e sarà necessario usare un altro backup per il ripristino." -#: access/transam/xlog.c:11228 +#: access/transam/xlogrecovery.c:980 #, 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'archiviazione WAL non è abilitata; devi verificare che tutti i segmenti WAL richiesti vengano copiati in qualche altro modo per completare il backup" +msgid "using recovery command file \"%s\" is not supported" +msgstr "l'utilizzo del file di comando di ripristino \"%s\" non è supportato" -#: access/transam/xlog.c:11431 +#: access/transam/xlogrecovery.c:1045 #, c-format -msgid "backup time %s in file \"%s\"" -msgstr "ora del backup %s nel file \"%s\"" +msgid "standby mode is not supported by single-user servers" +msgstr "la modalità di standby non è supportata per i server a utente singolo" -#: access/transam/xlog.c:11436 +#: access/transam/xlogrecovery.c:1062 #, c-format -msgid "backup label %s in file \"%s\"" -msgstr "etichetta del backup %s nel file \"%s\"" +msgid "specified neither primary_conninfo nor restore_command" +msgstr "specificato né primary_conninfo né restore_command" -#: access/transam/xlog.c:11449 +#: access/transam/xlogrecovery.c:1063 #, c-format -msgid "Timeline ID parsed is %u, but expected %u" -msgstr "L'ID della timeline letta è %u, ma era atteso %u" +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "Il server database ispezionerà regolarmente la sottodirectory pg_wal per controllare se vi vengono aggiunti dei file." -#: access/transam/xlog.c:11453 +#: access/transam/xlogrecovery.c:1071 #, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "timeline del backup %u nel file \"%s\"" +msgid "must specify restore_command when standby mode is not enabled" +msgstr "deve specificare restore_command quando la modalità standby non è abilitata" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:11561 +#: access/transam/xlogrecovery.c:1109 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "Ripristino WAL a %X/%X per %s" +msgid "recovery target timeline %u does not exist" +msgstr "la timeline destinazione di recupero %u non esiste" -#: access/transam/xlog.c:11610 +#: access/transam/xlogrecovery.c:1259 #, c-format -msgid "online backup mode was not canceled" -msgstr "la modalità di backup online non è stata annullata" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "L'ID sequenza temporale analizzato è %u, ma previsto %u." -#: access/transam/xlog.c:11611 +#: access/transam/xlogrecovery.c:1641 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Non è stato possibile rinominare il file \"%s\" in \"%s\": %m." +msgid "redo starts at %X/%X" +msgstr "il redo inizia in %X/%X" -#: access/transam/xlog.c:11620 access/transam/xlog.c:11632 -#: access/transam/xlog.c:11642 +#: access/transam/xlogrecovery.c:1654 #, c-format -msgid "online backup mode canceled" -msgstr "modalità backup online annullata" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "ripetizione in corso, tempo trascorso: %ld.%02d s, LSN corrente: %X/%X" -#: access/transam/xlog.c:11633 +#: access/transam/xlogrecovery.c:1746 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "File \"%s\" e \"%s\" rinominati rispettivamente in \"%s\" e \"%s\"." +msgid "requested recovery stop point is before consistent recovery point" +msgstr "lo stop point di ripristino è posto prima di un punto di ripristino consistente" -#: access/transam/xlog.c:11643 +#: access/transam/xlogrecovery.c:1778 #, c-format -msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." -msgstr "File \"%s\" rinominato in \"%s\", ma non è stato possibile rinominare il file \"%s\" in \"%s\": %m." +msgid "redo done at %X/%X system usage: %s" +msgstr "ripetizione eseguita con utilizzo del sistema %X/%X: %s" -#: access/transam/xlog.c:11769 access/transam/xlogutils.c:727 -#: replication/walreceiver.c:1019 replication/walsender.c:2424 +#: access/transam/xlogrecovery.c:1784 #, c-format -msgid "could not seek in log segment %s to offset %u: %m" -msgstr "spostamento nel segmento di log %s alla posizione %u fallito: %m" +msgid "last completed transaction was at log time %s" +msgstr "l'ultima transazione è stata completata all'orario di log %s" -#: access/transam/xlog.c:11785 +#: access/transam/xlogrecovery.c:1793 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "lettura del segmento di log %s, posizione %u fallita: %m" +msgid "redo is not required" +msgstr "redo non richiesto" -#: access/transam/xlog.c:12314 +#: access/transam/xlogrecovery.c:1804 #, c-format -msgid "received promote request" -msgstr "richiesta di promozione ricevuta" +msgid "recovery ended before configured recovery target was reached" +msgstr "il ripristino è terminato prima del raggiungimento della destinazione di ripristino configurata" -#: access/transam/xlog.c:12327 +#: access/transam/xlogrecovery.c:1979 #, c-format -msgid "trigger file found: %s" -msgstr "trovato il file trigger: %s" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "saltato con successo il record mancante a %X/%X, sovrascritto a %s" -#: access/transam/xlog.c:12336 +#: access/transam/xlogrecovery.c:2046 #, c-format -msgid "could not stat trigger file \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sul file trigger \"%s\": %m" +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "voce di directory imprevista \"%s\" trovata in %s" -#: access/transam/xlogarchive.c:244 +#: access/transam/xlogrecovery.c:2048 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "il file archivio \"%s\" è di dimensione errata: %lu invece di %lu" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "Tutte le voci di directory in pg_tblspc/ dovrebbero essere collegamenti simbolici." -#: access/transam/xlogarchive.c:253 +#: access/transam/xlogrecovery.c:2049 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "file di log \"%s\" ripristinato dall'archivio" +msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." +msgstr "Rimuovere quelle directory o impostare allow_in_place_tablespaces su ON transitoriamente per consentire il completamento del ripristino." -#: access/transam/xlogarchive.c:303 +#: access/transam/xlogrecovery.c:2123 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "non è stato possibile ripristinare il file \"%s\" dall'archivio: %s" +msgid "consistent recovery state reached at %X/%X" +msgstr "è stato raggiunto uno stato di ripristino consistente a %X/%X" -#. translator: First %s represents a recovery.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:416 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2161 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "WAL redo at %X/%X for %s" +msgstr "Ripristino WAL a %X/%X per %s" -#: access/transam/xlogarchive.c:459 postmaster/syslogger.c:1500 -#: replication/logical/snapbuild.c:1660 replication/slot.c:598 -#: replication/slot.c:1206 replication/slot.c:1321 storage/file/fd.c:650 -#: storage/file/fd.c:745 utils/time/snapmgr.c:1318 +#: access/transam/xlogrecovery.c:2257 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "non è stato possibile rinominare il file \"%s\" in \"%s\": %m" +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "timeline precedente con ID %u non prevista (l'ID della timeline corrente è %u) nel record di checkpoint" -#: access/transam/xlogarchive.c:526 access/transam/xlogarchive.c:590 +#: access/transam/xlogrecovery.c:2266 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "creazione del file di stato dell'archivio \"%s\" fallita: %m" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "timeline ID %u imprevista (dopo %u) nel record di checkpoint" -#: access/transam/xlogarchive.c:534 access/transam/xlogarchive.c:598 +#: access/transam/xlogrecovery.c:2282 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "scrittura del file di stato dell'archivio \"%s\" fallita: %m" +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "timeline ID %u imprevista nel record di checkpoint, prima di raggiungere il punto di recupero minimo %X/%X sulla timeline %u" -#: access/transam/xlogfuncs.c:54 +#: access/transam/xlogrecovery.c:2466 access/transam/xlogrecovery.c:2737 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "interruzione del backup perché il backend è terminato prima della chiamata di pg_stop_backup" +msgid "recovery stopping after reaching consistency" +msgstr "il ripristino è stato interrotto dopo aver raggiunto la consistenza" -#: access/transam/xlogfuncs.c:84 +#: access/transam/xlogrecovery.c:2487 #, c-format -msgid "a backup is already in progress in this session" -msgstr "c'è già un backup in corso in questa sessione" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "il ripristino è stato interrotto prima della locazione WAL (LSN) \"%X/%X\"" -#: access/transam/xlogfuncs.c:142 access/transam/xlogfuncs.c:224 +#: access/transam/xlogrecovery.c:2572 #, c-format -msgid "non-exclusive backup in progress" -msgstr "il backup in corso non è esclusivo" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "il ripristino è stato interrotto prima del commit della transazione %u, orario %s" -#: access/transam/xlogfuncs.c:143 access/transam/xlogfuncs.c:225 +#: access/transam/xlogrecovery.c:2579 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Forse intendevi usare pg_stop_backup('f')?" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "il ripristino è stato interrotto prima dell'abort della transazione %u alle %s" -#: access/transam/xlogfuncs.c:195 commands/event_trigger.c:1464 -#: commands/event_trigger.c:2016 commands/extension.c:1895 -#: commands/extension.c:2004 commands/extension.c:2228 commands/prepare.c:722 -#: executor/execExpr.c:2208 executor/execSRF.c:715 executor/functions.c:1034 -#: foreign/foreign.c:488 libpq/hba.c:2600 replication/logical/launcher.c:1127 -#: replication/logical/logicalfuncs.c:176 replication/logical/origin.c:1460 -#: replication/slotfuncs.c:200 replication/walsender.c:3203 -#: utils/adt/jsonfuncs.c:1701 utils/adt/jsonfuncs.c:1832 -#: utils/adt/jsonfuncs.c:2020 utils/adt/jsonfuncs.c:2147 -#: utils/adt/jsonfuncs.c:3576 utils/adt/pgstatfuncs.c:457 -#: utils/adt/pgstatfuncs.c:558 utils/fmgr/funcapi.c:62 utils/misc/guc.c:8820 -#: utils/mmgr/portalmem.c:1134 +#: access/transam/xlogrecovery.c:2632 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "la funzione che restituisce insiemi è chiamata in un contesto che non può accettare un insieme" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "il ripristino è stato interrotto al punto di ripristino \"%s\" alle %s" -#: access/transam/xlogfuncs.c:199 commands/event_trigger.c:1468 -#: commands/event_trigger.c:2020 commands/extension.c:1899 -#: commands/extension.c:2008 commands/extension.c:2232 commands/prepare.c:726 -#: foreign/foreign.c:493 libpq/hba.c:2604 replication/logical/launcher.c:1131 -#: replication/logical/logicalfuncs.c:180 replication/logical/origin.c:1464 -#: replication/slotfuncs.c:204 replication/walsender.c:3207 -#: utils/adt/pgstatfuncs.c:461 utils/adt/pgstatfuncs.c:562 -#: utils/misc/guc.c:8824 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1138 +#: access/transam/xlogrecovery.c:2650 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "necessaria modalità materializzata, ma non ammessa in questo contesto" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "il ripristino è stato interrotto dopo la locazione WAL (LSN) \"%X/%X\"" -#: access/transam/xlogfuncs.c:241 +#: access/transam/xlogrecovery.c:2717 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "non c'è un backup non esclusivo in corso" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "il ripristino è stato interrotto dopo il commit della transazione %u alle %s" -#: access/transam/xlogfuncs.c:242 +#: access/transam/xlogrecovery.c:2725 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Forse intendevi usare pg_stop_backup('t')?" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "il ripristino è stato interrotto dopo l'abort della transazione %u alle %s" -#: access/transam/xlogfuncs.c:319 +#: access/transam/xlogrecovery.c:2806 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "livello WAL non sufficiente per creare un punto di ripristino" +msgid "pausing at the end of recovery" +msgstr "pausa al termine del recupero" -#: access/transam/xlogfuncs.c:327 +#: access/transam/xlogrecovery.c:2807 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "il valore è troppo lungo per un punto di ripristino (massimo %d caratteri)" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Esegui pg_wal_replay_resume() per promuovere." -#: access/transam/xlogfuncs.c:465 +#: access/transam/xlogrecovery.c:2810 access/transam/xlogrecovery.c:4614 #, c-format -msgid "pg_walfile_name_offset() cannot be executed during recovery." -msgstr "pg_walfile_name_offset() non può essere eseguita in fase di recupero." +msgid "recovery has paused" +msgstr "ripristino in pausa" -#: access/transam/xlogfuncs.c:521 +#: access/transam/xlogrecovery.c:2811 #, c-format -msgid "pg_walfile_name() cannot be executed during recovery." -msgstr "pg_walfile_name() non può essere eseguita in fase di recupero." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Esegui pg_wal_replay_resume() per continuare." -#: access/transam/xlogfuncs.c:541 access/transam/xlogfuncs.c:561 -#: access/transam/xlogfuncs.c:578 +#: access/transam/xlogrecovery.c:3077 #, c-format -msgid "recovery is not in progress" -msgstr "il recupero non è in corso" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "rilevato ID di timeline %u inatteso nel segmento di log %s, offset %u" -#: access/transam/xlogfuncs.c:542 access/transam/xlogfuncs.c:562 -#: access/transam/xlogfuncs.c:579 +#: access/transam/xlogrecovery.c:3282 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Le funzioni di controllo del recupero possono essere eseguite solo durante un recupero." +msgid "could not read from log segment %s, offset %u: %m" +msgstr "lettura del segmento di log %s, posizione %u fallita: %m" -#: access/transam/xlogreader.c:299 +#: access/transam/xlogrecovery.c:3288 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "offset del record non valido a %X/%X" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "impossibile leggere dal segmento di registro %s, offset %u: leggere %d di %zu" -#: access/transam/xlogreader.c:307 +#: access/transam/xlogrecovery.c:3931 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "contrecord richiesto da %X/%X" +msgid "invalid primary checkpoint link in control file" +msgstr "il link nel file di controllo al checkpoint primario non è valido" -#: access/transam/xlogreader.c:348 access/transam/xlogreader.c:646 +#: access/transam/xlogrecovery.c:3935 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "lunghezza del record a %X/%X non valida: atteso %u, ricevuto %u" +msgid "invalid checkpoint link in backup_label file" +msgstr "il link al checkpoint nel file backup_label non è valido" -#: access/transam/xlogreader.c:363 +#: access/transam/xlogrecovery.c:3953 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "lunghezza del record %u a %X/%X eccessiva" +msgid "invalid primary checkpoint record" +msgstr "il record del checkpoint primario non è valido" -#: access/transam/xlogreader.c:404 +#: access/transam/xlogrecovery.c:3957 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "non c'è un flag di contrecord a %X/%X" +msgid "invalid checkpoint record" +msgstr "il record del checkpoint non è valido" -#: access/transam/xlogreader.c:417 +#: access/transam/xlogrecovery.c:3968 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "lunghezza di contrecord %u non valida a %X/%X" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "l'ID del resource manager nel record del checkpoint primario non è valido" -#: access/transam/xlogreader.c:654 +#: access/transam/xlogrecovery.c:3972 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ID di gestione risorse %u non valido a %X/%X" +msgid "invalid resource manager ID in checkpoint record" +msgstr "l'ID del resource manager nel record del checkpoint non è valido" -#: access/transam/xlogreader.c:668 access/transam/xlogreader.c:685 +#: access/transam/xlogrecovery.c:3985 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "record con link-precedente %X/%X non corretto a %X/%X" +msgid "invalid xl_info in primary checkpoint record" +msgstr "l'xl_info nel record del checkpoint primario non è valido" -#: access/transam/xlogreader.c:722 +#: access/transam/xlogrecovery.c:3989 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X" +msgid "invalid xl_info in checkpoint record" +msgstr "l'xl_info nel record del checkpoint non è valido" -#: access/transam/xlogreader.c:759 +#: access/transam/xlogrecovery.c:4000 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "numero magico %04X non valido nel segmento di log %s, offset %u" +msgid "invalid length of primary checkpoint record" +msgstr "la lunghezza del record del checkpoint primario non è valida" -#: access/transam/xlogreader.c:773 access/transam/xlogreader.c:824 +#: access/transam/xlogrecovery.c:4004 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "bit di info %04X non validi nel segmento di log %s, offset %u" +msgid "invalid length of checkpoint record" +msgstr "la lunghezza del record del checkpoint non è valida" -#: access/transam/xlogreader.c:799 +#: access/transam/xlogrecovery.c:4060 #, c-format -msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s" -msgstr "il file di WAL è di un database diverso: l'identificativo del file di WAL del database è %s, l'identificativo di pg_control del database è %s" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "la nuova timeline %u non è figlia della timeline %u del database" -#: access/transam/xlogreader.c:806 +#: access/transam/xlogrecovery.c:4074 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "il file di WAL è di un diverso database: dimensione del segmento sbagliata nell'header di pagina" +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "la nuova timeline %u si è staccata dalla timeline attuale %u prima del punto di recupero corrente %X/%X" -#: access/transam/xlogreader.c:812 +#: access/transam/xlogrecovery.c:4093 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "il file di WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina" +msgid "new target timeline is %u" +msgstr "la nuova timeline di destinazione %u" -#: access/transam/xlogreader.c:843 +#: access/transam/xlogrecovery.c:4296 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u" +msgid "WAL receiver process shutdown requested" +msgstr "È richiesto lo spegnimento del processo del ricevitore WAL" -#: access/transam/xlogreader.c:868 +#: access/transam/xlogrecovery.c:4359 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "ID della timeline %u (dopo %u) fuori sequenza nel segmento di log %s, offset %u" +msgid "received promote request" +msgstr "richiesta di promozione ricevuta" -#: access/transam/xlogreader.c:1113 +#: access/transam/xlogrecovery.c:4372 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id fuori sequenza %u a %X/%X" +msgid "promote trigger file found: %s" +msgstr "file trigger di promozione trovato: %s" -#: access/transam/xlogreader.c:1136 +#: access/transam/xlogrecovery.c:4380 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X" +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "impossibile stat promuovere il file di attivazione \"%s\": %m" -#: access/transam/xlogreader.c:1143 +#: access/transam/xlogrecovery.c:4605 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "hot standby non è possibile a causa di impostazioni dei parametri insufficienti" -#: access/transam/xlogreader.c:1179 +#: access/transam/xlogrecovery.c:4606 access/transam/xlogrecovery.c:4633 access/transam/xlogrecovery.c:4663 #, c-format -msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d è un'impostazione inferiore rispetto al server primario, dove il suo valore era %d." -#: access/transam/xlogreader.c:1195 +#: access/transam/xlogrecovery.c:4615 #, c-format -msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X" +msgid "If recovery is unpaused, the server will shut down." +msgstr "Se il ripristino non viene sospeso, il server si spegne." -#: access/transam/xlogreader.c:1210 +#: access/transam/xlogrecovery.c:4616 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED impostato, ma la lunghezza dell'immagine del blocco è %u a %X/%X" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "È quindi possibile riavviare il server dopo aver apportato le modifiche alla configurazione necessarie." -#: access/transam/xlogreader.c:1225 +#: access/transam/xlogrecovery.c:4627 #, c-format -msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_IS_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "la promozione non è possibile a causa di impostazioni dei parametri insufficienti" -#: access/transam/xlogreader.c:1241 +#: access/transam/xlogrecovery.c:4637 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Riavviare il server dopo aver apportato le modifiche alla configurazione necessarie." -#: access/transam/xlogreader.c:1253 +#: access/transam/xlogrecovery.c:4661 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "block_id %u non valido a %X/%X" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "ripristino interrotto a causa di impostazioni dei parametri insufficienti" -#: access/transam/xlogreader.c:1342 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "record con lunghezza non valida a %X/%X" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "È possibile riavviare il server dopo aver apportato le modifiche alla configurazione necessarie." -#: access/transam/xlogreader.c:1431 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "immagine compressa non valida a %X/%X, blocco %d" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "impossibile leggere dal segmento di registro %s, offset %d: %m" -#: access/transam/xlogutils.c:751 replication/walsender.c:2443 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "could not read from log segment %s, offset %u, length %lu: %m" -msgstr "lettura del segmento di log %s, posizione %u, lunghezza %lu fallita: %m" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "impossibile leggere dal segmento di registro %s, offset %d: leggere %d di %d" -#: bootstrap/bootstrap.c:268 +#: backup/backup_manifest.c:253 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X richiede una potenza di due tra 1 MB e 1 GB" +msgid "expected end timeline %u but found timeline %u" +msgstr "sequenza temporale di fine prevista %u ma trovata sequenza temporale %u" -#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:826 tcop/postgres.c:3558 +#: backup/backup_manifest.c:277 #, c-format -msgid "--%s requires a value" -msgstr "--%s richiede un valore" +msgid "expected start timeline %u but found timeline %u" +msgstr "sequenza temporale di inizio prevista %u ma rilevata sequenza temporale %u" -#: bootstrap/bootstrap.c:290 postmaster/postmaster.c:831 tcop/postgres.c:3563 +#: backup/backup_manifest.c:304 #, c-format -msgid "-c %s requires a value" -msgstr "-c %s richiede un valore" +msgid "start timeline %u not found in history of timeline %u" +msgstr "sequenza temporale di inizio %u non trovata nella cronologia della sequenza temporale %u" -#: bootstrap/bootstrap.c:301 postmaster/postmaster.c:843 -#: postmaster/postmaster.c:856 +#: backup/backup_manifest.c:355 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Prova \"%s --help\" per maggiori informazioni.\n" +msgid "could not rewind temporary file" +msgstr "impossibile riavvolgere il file temporaneo" -#: bootstrap/bootstrap.c:310 +#: backup/backup_manifest.c:374 #, c-format -msgid "%s: invalid command-line arguments\n" -msgstr "%s: parametri della riga di comando non validi\n" +msgid "could not read from temporary file: %m" +msgstr "impossibile leggere dal file temporaneo: %m" -#: catalog/aclchk.c:203 +#: backup/basebackup.c:454 #, c-format -msgid "grant options can only be granted to roles" -msgstr "le opzioni di concessione possono essere concesse solo ai ruoli" +msgid "could not find any WAL files" +msgstr "nessun file WAL trovato" -#: catalog/aclchk.c:326 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "no privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "nessun privilegio è stato concesso per la colonna \"%s\" della relazione \"%s\"" +msgid "could not find WAL file \"%s\"" +msgstr "file WAL \"%s\" non trovato" -#: catalog/aclchk.c:331 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "no privileges were granted for \"%s\"" -msgstr "nessun privilegio è stato concesso per \"%s\"" +msgid "unexpected WAL file size \"%s\"" +msgstr "dimensione inaspettata del file WAL \"%s\"" -#: catalog/aclchk.c:339 +#: backup/basebackup.c:630 #, c-format -msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "non tutti i privilegi sono stati concessi per la colonna \"%s\" della relazione \"%s\"" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld verifica totale del checksum non riuscita" +msgstr[1] "%lld verifica totale del checksum non riuscita" -#: catalog/aclchk.c:344 +#: backup/basebackup.c:637 #, c-format -msgid "not all privileges were granted for \"%s\"" -msgstr "non tutti i privilegi sono stati concessi per \"%s\"" +msgid "checksum verification failure during base backup" +msgstr "fallimento verifica checksum durante il backup di base" -#: catalog/aclchk.c:355 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" -msgstr "non è stato possibile revocare alcun privilegio per la colonna \"%s\" della relazione \"%s\"" +msgid "duplicate option \"%s\"" +msgstr "opzione duplicata \"%s\"" -#: catalog/aclchk.c:360 +#: backup/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "tipo di checkpoint non riconosciuto: \"%s\"" + +#: backup/basebackup.c:769 +#, c-format +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d non è compreso nell'intervallo di validità del il parametro \"%s\" (%d .. %d)" + +#: backup/basebackup.c:814 +#, c-format +msgid "unrecognized manifest option: \"%s\"" +msgstr "opzione manifest non riconosciuta: \"%s\"" + +#: backup/basebackup.c:830 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algoritmo di checksum non riconosciuto: \"%s\"" + +#: backup/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "algoritmo di compressione non riconosciuto: \"%s\"" + +#: backup/basebackup.c:881 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "opzione di backup di base non riconosciuta: \"%s\"" + +#: backup/basebackup.c:892 +#, c-format +msgid "manifest checksums require a backup manifest" +msgstr "i checksum manifest richiedono un manifest di backup" + +#: backup/basebackup.c:901 +#, c-format +msgid "target detail cannot be used without target" +msgstr "i dettagli del target non possono essere utilizzati senza target" + +#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#, c-format +msgid "target \"%s\" does not accept a target detail" +msgstr "target \"%s\" non accetta un dettaglio target" + +#: backup/basebackup.c:921 +#, c-format +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "i dettagli di compressione non possono essere specificati a meno che la compressione non sia abilitata" + +#: backup/basebackup.c:934 +#, c-format +msgid "invalid compression specification: %s" +msgstr "specifica di compressione non valida: %s" + +#: backup/basebackup.c:1430 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "file speciale \"%s\" saltato" + +#: backup/basebackup.c:1549 +#, c-format +msgid "invalid segment number %d in file \"%s\"" +msgstr "segmento numero %d non valido nel file \"%s\"" + +#: backup/basebackup.c:1589 +#, c-format +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "impossibile verificare il checksum nel file \"%s\", blocco %u: la dimensione del buffer di lettura %d e la dimensione della pagina %d differiscono" + +#: backup/basebackup.c:1663 +#, c-format +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "verifica del checksum non riuscita nel file \"%s\", blocco %u: calcolato %X ma previsto %X" + +#: backup/basebackup.c:1670 +#, c-format +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "ulteriori fallimenti del checksum di verifica nel file \"%s\" non verranno riportati" + +#: backup/basebackup.c:1717 +#, 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] "il file \"%s\" ha un totale di %d verifica del checksum non riuscita" +msgstr[1] "il file \"%s\" ha un totale di %d verifica del checksum non riuscite" + +#: backup/basebackup.c:1763 +#, c-format +msgid "file name too long for tar format: \"%s\"" +msgstr "nome del file troppo lungo per il formato tar: \"%s\"" + +#: backup/basebackup.c:1768 +#, c-format +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "destinazione del link simbolico troppo lunga per il formato tar: nome del file \"%s\", destinazione \"%s\"" + +#: backup/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "la compressione gzip non è supportata da questa build" + +#: backup/basebackup_gzip.c:143 +#, c-format +msgid "could not initialize compression library" +msgstr "inizializzazione della libreria di compressione fallita" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "la compressione lz4 non è supportata da questa build" + +#: backup/basebackup_server.c:75 +#, c-format +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "deve essere superutente o un ruolo con i privilegi del ruolo pg_write_server_files per creare un backup archiviato sul server" + +#: backup/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for backup stored on server" +msgstr "percorso relativo non consentito per il backup archiviato sul server" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 commands/tablespace.c:163 commands/tablespace.c:179 commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1523 storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "creazione della directory \"%s\" fallita: %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "la directory \"%s\" esiste ma non è vuota" + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1072 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "accesso alla directory \"%s\" fallito: %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 backup/basebackup_server.c:268 backup/basebackup_server.c:275 storage/smgr/md.c:473 storage/smgr/md.c:480 storage/smgr/md.c:771 +#, c-format +msgid "Check free disk space." +msgstr "Controlla lo spazio libero sul disco." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "impossibile scrivere il file \"%s\": ha scritto solo %d di %d byte all'offset %u" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "destinazione non riconosciuta: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "la destinazione \"%s\" richiede un dettaglio della destinazione" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "la compressione zstd non è supportata da questa build" + +#: backup/basebackup_zstd.c:117 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "impossibile impostare il conteggio degli operatori di compressione su %d: %s" + +#: bootstrap/bootstrap.c:263 +#, c-format +msgid "-X requires a power of two value between 1 MB and 1 GB" +msgstr "-X richiede una potenza di due tra 1 MB e 1 GB" + +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3894 +#, c-format +msgid "--%s requires a value" +msgstr "--%s richiede un valore" + +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3899 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s richiede un valore" + +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 postmaster/postmaster.c:876 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "Prova \"%s --help\" per maggiori informazioni.\n" + +#: bootstrap/bootstrap.c:305 +#, c-format +msgid "%s: invalid command-line arguments\n" +msgstr "%s: parametri della riga di comando non validi\n" + +#: catalog/aclchk.c:185 +#, c-format +msgid "grant options can only be granted to roles" +msgstr "le opzioni di concessione possono essere concesse solo ai ruoli" + +#: catalog/aclchk.c:307 +#, c-format +msgid "no privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "nessun privilegio è stato concesso per la colonna \"%s\" della relazione \"%s\"" + +#: catalog/aclchk.c:312 +#, c-format +msgid "no privileges were granted for \"%s\"" +msgstr "nessun privilegio è stato concesso per \"%s\"" + +#: catalog/aclchk.c:320 +#, c-format +msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "non tutti i privilegi sono stati concessi per la colonna \"%s\" della relazione \"%s\"" + +#: catalog/aclchk.c:325 +#, c-format +msgid "not all privileges were granted for \"%s\"" +msgstr "non tutti i privilegi sono stati concessi per \"%s\"" + +#: catalog/aclchk.c:336 +#, c-format +msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "non è stato possibile revocare alcun privilegio per la colonna \"%s\" della relazione \"%s\"" + +#: catalog/aclchk.c:341 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "non è stato possibile revocare alcun privilegio per \"%s\"" -#: catalog/aclchk.c:368 +#: catalog/aclchk.c:349 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "non è stato possibile revocare tutti i privilegi per la colonna \"%s\" della relazione \"%s\"" -#: catalog/aclchk.c:373 +#: catalog/aclchk.c:354 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "non è stato possibile revocare tutti i privilegi per \"%s\"" -#: catalog/aclchk.c:456 catalog/aclchk.c:995 +#: catalog/aclchk.c:386 +#, c-format +msgid "grantor must be current user" +msgstr "il concedente deve essere l'utente corrente" + +#: catalog/aclchk.c:454 catalog/aclchk.c:1029 #, c-format msgid "invalid privilege type %s for relation" msgstr "tipo di privilegio %s non valido per la relazione" -#: catalog/aclchk.c:460 catalog/aclchk.c:999 +#: catalog/aclchk.c:458 catalog/aclchk.c:1033 #, c-format msgid "invalid privilege type %s for sequence" msgstr "tipo di privilegio %s non valido per la sequenza" -#: catalog/aclchk.c:464 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "tipo di privilegio %s non valido per il database" -#: catalog/aclchk.c:468 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "tipo di privilegio %s non valido per il dominio" -#: catalog/aclchk.c:472 catalog/aclchk.c:1003 +#: catalog/aclchk.c:470 catalog/aclchk.c:1037 #, c-format msgid "invalid privilege type %s for function" msgstr "tipo di privilegio %s non valido per la funzione" -#: catalog/aclchk.c:476 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "tipo di privilegio %s non valido per il linguaggio" -#: catalog/aclchk.c:480 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "tipo di privilegio %s non valido per il large object" -#: catalog/aclchk.c:484 catalog/aclchk.c:1019 +#: catalog/aclchk.c:482 catalog/aclchk.c:1053 #, c-format msgid "invalid privilege type %s for schema" msgstr "tipo di privilegio %s non valido per lo schema" -#: catalog/aclchk.c:488 catalog/aclchk.c:1007 +#: catalog/aclchk.c:486 catalog/aclchk.c:1041 #, c-format msgid "invalid privilege type %s for procedure" msgstr "tipo di privilegio %s non valido per la procedura" -#: catalog/aclchk.c:492 catalog/aclchk.c:1011 +#: catalog/aclchk.c:490 catalog/aclchk.c:1045 #, c-format msgid "invalid privilege type %s for routine" msgstr "tipo di privilegio %s non valido per la routine" -#: catalog/aclchk.c:496 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "tipo di privilegio %s non valido per il tablespace" -#: catalog/aclchk.c:500 catalog/aclchk.c:1015 +#: catalog/aclchk.c:498 catalog/aclchk.c:1049 #, c-format msgid "invalid privilege type %s for type" msgstr "tipo di privilegio %s non valido per il tipo" -#: catalog/aclchk.c:504 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "tipo di privilegio %s non valido per il wrapper di dati esterni" -#: catalog/aclchk.c:508 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "tipo di privilegio %s non valido per il server esterno" -#: catalog/aclchk.c:547 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "tipo di privilegio non valido %s per il parametro" + +#: catalog/aclchk.c:549 #, c-format msgid "column privileges are only valid for relations" msgstr "i privilegi della colonna sono validi solo per le relazioni" -#: catalog/aclchk.c:707 catalog/aclchk.c:4131 catalog/aclchk.c:4913 -#: catalog/objectaddress.c:928 catalog/pg_largeobject.c:111 -#: storage/large_object/inv_api.c:284 +#: 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 "il large object %u non esiste" -#: catalog/aclchk.c:932 catalog/aclchk.c:941 commands/collationcmds.c:113 -#: commands/copy.c:1057 commands/copy.c:1077 commands/copy.c:1086 -#: commands/copy.c:1095 commands/copy.c:1104 commands/copy.c:1113 -#: commands/copy.c:1122 commands/copy.c:1131 commands/copy.c:1140 -#: commands/copy.c:1158 commands/copy.c:1174 commands/copy.c:1194 -#: commands/copy.c:1211 commands/dbcommands.c:155 commands/dbcommands.c:164 -#: commands/dbcommands.c:173 commands/dbcommands.c:182 -#: commands/dbcommands.c:191 commands/dbcommands.c:200 -#: commands/dbcommands.c:209 commands/dbcommands.c:218 -#: commands/dbcommands.c:227 commands/dbcommands.c:1427 -#: commands/dbcommands.c:1436 commands/dbcommands.c:1445 -#: commands/dbcommands.c:1454 commands/extension.c:1678 -#: commands/extension.c:1688 commands/extension.c:1698 -#: commands/extension.c:1708 commands/extension.c:2949 -#: commands/foreigncmds.c:537 commands/foreigncmds.c:546 -#: commands/functioncmds.c:559 commands/functioncmds.c:684 -#: commands/functioncmds.c:693 commands/functioncmds.c:702 -#: commands/functioncmds.c:711 commands/functioncmds.c:2105 -#: commands/functioncmds.c:2113 commands/publicationcmds.c:92 -#: commands/sequence.c:1256 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/subscriptioncmds.c:110 commands/subscriptioncmds.c:120 -#: commands/subscriptioncmds.c:130 commands/subscriptioncmds.c:140 -#: commands/subscriptioncmds.c:154 commands/subscriptioncmds.c:165 -#: commands/subscriptioncmds.c:179 commands/tablecmds.c:6261 -#: commands/typecmds.c:295 commands/typecmds.c:1444 commands/typecmds.c:1453 -#: commands/typecmds.c:1461 commands/typecmds.c:1469 commands/typecmds.c:1477 -#: commands/user.c:134 commands/user.c:148 commands/user.c:157 -#: commands/user.c:166 commands/user.c:175 commands/user.c:184 -#: commands/user.c:193 commands/user.c:202 commands/user.c:211 -#: commands/user.c:220 commands/user.c:229 commands/user.c:238 -#: commands/user.c:247 commands/user.c:555 commands/user.c:563 -#: commands/user.c:571 commands/user.c:579 commands/user.c:587 -#: commands/user.c:595 commands/user.c:603 commands/user.c:611 -#: commands/user.c:620 commands/user.c:628 commands/user.c:636 -#: parser/parse_utilcmd.c:407 replication/pgoutput/pgoutput.c:111 -#: replication/pgoutput/pgoutput.c:132 replication/walsender.c:804 -#: replication/walsender.c:815 replication/walsender.c:825 -#, c-format -msgid "conflicting or redundant options" -msgstr "opzioni contraddittorie o ridondanti" - -#: catalog/aclchk.c:1052 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "i privilegi predefiniti non possono essere impostati sulle colonne" -#: catalog/aclchk.c:1212 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "non è possibile usare la clausola IN SCHEMA usando GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1576 catalog/objectaddress.c:1390 commands/analyze.c:433 -#: commands/copy.c:4776 commands/sequence.c:1691 commands/tablecmds.c:5907 -#: commands/tablecmds.c:6055 commands/tablecmds.c:6112 -#: commands/tablecmds.c:6186 commands/tablecmds.c:6280 -#: commands/tablecmds.c:6339 commands/tablecmds.c:6478 -#: commands/tablecmds.c:6560 commands/tablecmds.c:6652 -#: commands/tablecmds.c:6746 commands/tablecmds.c:9082 -#: commands/tablecmds.c:9361 commands/tablecmds.c:9777 commands/trigger.c:904 -#: parser/analyze.c:2337 parser/parse_relation.c:2735 -#: parser/parse_relation.c:2798 parser/parse_target.c:1024 -#: parser/parse_type.c:127 utils/adt/acl.c:2886 utils/adt/ruleutils.c:2464 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:776 commands/sequence.c:1663 commands/tablecmds.c:7231 commands/tablecmds.c:7387 commands/tablecmds.c:7437 commands/tablecmds.c:7511 commands/tablecmds.c:7581 commands/tablecmds.c:7693 commands/tablecmds.c:7787 commands/tablecmds.c:7846 commands/tablecmds.c:7935 commands/tablecmds.c:7965 commands/tablecmds.c:8093 +#: commands/tablecmds.c:8175 commands/tablecmds.c:8331 commands/tablecmds.c:8449 commands/tablecmds.c:12135 commands/tablecmds.c:12316 commands/tablecmds.c:12476 commands/tablecmds.c:13640 commands/tablecmds.c:16228 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:3434 parser/parse_utilcmd.c:3470 parser/parse_utilcmd.c:3512 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2810 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "la colonna \"%s\" della relazione \"%s\" non esiste" -#: catalog/aclchk.c:1843 catalog/objectaddress.c:1230 commands/sequence.c:1129 -#: commands/tablecmds.c:231 commands/tablecmds.c:13492 utils/adt/acl.c:2076 -#: utils/adt/acl.c:2106 utils/adt/acl.c:2138 utils/adt/acl.c:2170 -#: utils/adt/acl.c:2198 utils/adt/acl.c:2228 +#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 commands/tablecmds.c:253 commands/tablecmds.c:17092 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\" non è una sequenza" -#: catalog/aclchk.c:1881 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "la sequenza \"%s\" supporta solo i privilegi USAGE, SELECT e UPDATE" -#: catalog/aclchk.c:1898 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "tipo di privilegio %s non valido per la tabella" -#: catalog/aclchk.c:2064 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "tipo di privilegio %s non valido per la colonna" -#: catalog/aclchk.c:2077 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "la sequenza \"%s\" supporta solo i privilegi di SELECT sulla colonna" -#: catalog/aclchk.c:2659 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "il linguaggio \"%s\" non è fidato" -#: catalog/aclchk.c:2661 +#: 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 e REVOKE non sono ammessi sui linguaggi non fidati, perché i linguaggi non fidati possono essere usati solo da superutenti." -#: catalog/aclchk.c:3175 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "non è possibile impostare privilegi su tipi array" -#: catalog/aclchk.c:3176 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Puoi impostare i privilegi del tipo dell'elemento." -#: catalog/aclchk.c:3183 catalog/objectaddress.c:1520 +#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" non è un dominio" -#: catalog/aclchk.c:3303 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "tipo di privilegio \"%s\" sconosciuto" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "permesso negato per l'aggregato %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "permesso negato per l'ordinamento %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "permesso negato per la colonna %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "permesso negato per la conversione %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "permesso negato per il database %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "permesso negato per il dominio %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "permesso negato per il trigger di evento %s" -#: catalog/aclchk.c:3385 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "permesso negato per l'estensione %s" -#: catalog/aclchk.c:3388 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "permesso negato per il wrapper di dati esterni %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "permesso negato per il server esterno %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "permesso negato per la tabella esterna %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "permesso negato per la funzione %s" -#: catalog/aclchk.c:3400 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "permesso negato per l'indice %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "permesso negato per il linguaggio %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "permesso negato per large object %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "permesso negato per la vista materializzata %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "permesso negato per la classe di operatori %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "permesso negato per l'operatore %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "permesso negato per la famiglia di operatori %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "autorizzazione negata per il parametro %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "permesso negato per la regola di sicurezza %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "permesso negato per la procedura %s" -#: catalog/aclchk.c:3427 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "permesso negato per la pubblicazione %s" -#: catalog/aclchk.c:3430 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "permesso negato per la routine %s" -#: catalog/aclchk.c:3433 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "permesso negato per lo schema %s" -#: catalog/aclchk.c:3436 commands/sequence.c:599 commands/sequence.c:833 -#: commands/sequence.c:875 commands/sequence.c:916 commands/sequence.c:1789 -#: commands/sequence.c:1853 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "permesso negato per la sequenza %s" -#: catalog/aclchk.c:3439 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "permesso negato per la statistica %s" -#: catalog/aclchk.c:3442 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "permesso negato per la sottoscrizione %s" -#: catalog/aclchk.c:3445 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "permesso negato per la tabella %s" -#: catalog/aclchk.c:3448 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "permesso negato per il tablespace %s" -#: catalog/aclchk.c:3451 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "permesso negato per la configurazione di ricerca di testo %s" -#: catalog/aclchk.c:3454 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "permesso negato per il dizionario di ricerca di testo %s" -#: catalog/aclchk.c:3457 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "permesso negato per il tipo %s" -#: catalog/aclchk.c:3460 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "permesso negato per la vista %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "bisogna essere proprietari dell'aggregato %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "bisogna essere proprietari dell'ordinamento %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "bisogna essere proprietari della conversione %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "bisogna essere proprietari del database %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "bisogna essere proprietari del dominio %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "bisogna essere proprietari del trigger di evento %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "bisogna essere proprietari dell'estensione %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "bisogna essere proprietari del wrapper di dati esterni %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "bisogna essere proprietari del server esterno %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "bisogna essere proprietari della tabella esterna %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "bisogna essere proprietari della funzione %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "bisogna essere proprietari dell'indice %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "bisogna essere proprietari del linguaggio %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "bisogna essere proprietari del large object %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "bisogna essere proprietari della vista materializzata %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "bisogna essere proprietari della classe di operatore %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "bisogna essere proprietari dell'operatore %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "bisogna essere proprietari della famiglia di operatori %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "bisogna essere proprietari della procedura %s" -#: catalog/aclchk.c:3552 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "bisogna essere proprietari della pubblicazione %s" -#: catalog/aclchk.c:3555 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "bisogna essere proprietari della routine %s" -#: catalog/aclchk.c:3558 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "bisogna essere proprietari della sequenza %s" -#: catalog/aclchk.c:3561 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "bisogna essere proprietari della sottoscrizione %s" -#: catalog/aclchk.c:3564 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "bisogna essere proprietari della tabella %s" -#: catalog/aclchk.c:3567 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "bisogna essere proprietari del tipo %s" -#: catalog/aclchk.c:3570 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "bisogna essere proprietari della vista %s" -#: catalog/aclchk.c:3573 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "bisogna essere proprietari dello schema %s" -#: catalog/aclchk.c:3576 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "bisogna essere proprietari della statistica %s" -#: catalog/aclchk.c:3579 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "bisogna essere proprietari del tablespace %s" -#: catalog/aclchk.c:3582 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "bisogna essere proprietari della configurazione di ricerca di testo %s" -#: catalog/aclchk.c:3585 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "bisogna essere proprietari del dizionario di ricerca di testo %s" -#: catalog/aclchk.c:3599 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "bisogna essere proprietari della relazione %s" -#: catalog/aclchk.c:3643 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "permesso negato per la colonna \"%s\" della relazione \"%s\"" -#: catalog/aclchk.c:3764 catalog/aclchk.c:3772 +#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "l'attributo %d della relazione con OID %u non esiste" -#: catalog/aclchk.c:3845 catalog/aclchk.c:4764 +#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 #, c-format msgid "relation with OID %u does not exist" msgstr "la relazione con OID %u non esiste" -#: catalog/aclchk.c:3944 catalog/aclchk.c:5182 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 #, c-format msgid "database with OID %u does not exist" msgstr "il database con OID %u non esiste" -#: catalog/aclchk.c:3998 catalog/aclchk.c:4842 tcop/fastpath.c:221 -#: utils/fmgr/fmgr.c:2195 +#: catalog/aclchk.c:4299 +#, c-format +msgid "parameter ACL with OID %u does not exist" +msgstr "il parametro ACL con OID %u non esiste" + +#: 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 "la funzione con OID %u non esiste" -#: catalog/aclchk.c:4052 catalog/aclchk.c:4868 +#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 #, c-format msgid "language with OID %u does not exist" msgstr "il linguaggio con OID %u non esiste" -#: catalog/aclchk.c:4216 catalog/aclchk.c:4940 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 commands/publicationcmds.c:1748 #, c-format msgid "schema with OID %u does not exist" msgstr "lo schema con OID %u non esiste" -#: catalog/aclchk.c:4270 catalog/aclchk.c:4967 +#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 #, c-format msgid "tablespace with OID %u does not exist" msgstr "il tablespace con l'OID %u non esiste" -#: catalog/aclchk.c:4329 catalog/aclchk.c:5101 commands/foreigncmds.c:324 +#: 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 "il wrapper di dati esterni con OID %u non esiste" -#: catalog/aclchk.c:4391 catalog/aclchk.c:5128 commands/foreigncmds.c:459 +#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 #, c-format msgid "foreign server with OID %u does not exist" msgstr "il server esterno con OID %u non esiste" -#: catalog/aclchk.c:4451 catalog/aclchk.c:4790 utils/cache/typcache.c:368 +#: 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 "il tipo con OID %u non esiste" -#: catalog/aclchk.c:4816 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "l'operatore con OID %u non esiste" -#: catalog/aclchk.c:4993 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "la classe di operatori con OID %u non esiste" -#: catalog/aclchk.c:5020 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "la famiglia di operatori con OID %u non esiste" -#: catalog/aclchk.c:5047 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "il dizionario di ricerca di testo con OID %u non esiste" -#: catalog/aclchk.c:5074 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "la configurazione di ricerca di testo con OID %u non esiste" -#: catalog/aclchk.c:5155 commands/event_trigger.c:590 +#: catalog/aclchk.c:5575 commands/event_trigger.c:453 #, c-format msgid "event trigger with OID %u does not exist" msgstr "il trigger di evento con OID %u non esiste" -#: catalog/aclchk.c:5208 commands/collationcmds.c:347 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "l'ordinamento con OID %u non esiste" -#: catalog/aclchk.c:5234 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "la conversione con OID %u non esiste" -#: catalog/aclchk.c:5275 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "l'estensione con OID %u non esiste" -#: catalog/aclchk.c:5302 commands/publicationcmds.c:747 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:2002 #, c-format msgid "publication with OID %u does not exist" msgstr "la pubblicazione con OID %u non esiste" -#: catalog/aclchk.c:5328 commands/subscriptioncmds.c:1098 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1737 #, c-format msgid "subscription with OID %u does not exist" msgstr "la sottoscrizione con OID %u non esiste" -#: catalog/aclchk.c:5354 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "la statistica con OID %u non esiste" -#: catalog/dependency.c:611 +#: catalog/catalog.c:447 #, c-format -msgid "cannot drop %s because %s requires it" -msgstr "non è possibile eliminare %s perché %s lo richiede" +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "sto ancora cercando un OID inutilizzato in relazione \"%s\"" -#: catalog/dependency.c:614 +#: catalog/catalog.c:449 #, c-format -msgid "You can drop %s instead." -msgstr "È invece possibile eliminare %s." +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] "I candidati OID sono stati controllati %llu tempo, ma non è stato ancora trovato alcun OID inutilizzato." +msgstr[1] "I candidati OID sono stati controllati %llu volte, ma non è stato ancora trovato alcun OID inutilizzato." + +#: 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] "è stato assegnato un nuovo OID in relazione a \"%s\" dopo %llu nuovo tentativo" +msgstr[1] "è stato assegnato un nuovo OID in relazione a \"%s\" dopo %llu tentativi" + +#: catalog/catalog.c:605 catalog/catalog.c:672 +#, c-format +msgid "must be superuser to call %s()" +msgstr "must be superuser to call %s()" + +#: catalog/catalog.c:614 +#, c-format +msgid "pg_nextoid() can only be used on system catalogs" +msgstr "pg_nextoid() può essere utilizzato solo sui cataloghi di sistema" + +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2279 +#, c-format +msgid "index \"%s\" does not belong to table \"%s\"" +msgstr "l'indice \"%s\" non appartiene alla tabella \"%s\"" + +#: catalog/catalog.c:636 +#, c-format +msgid "column \"%s\" is not of type oid" +msgstr "la colonna \"%s\" non è di tipo oid" + +#: catalog/catalog.c:643 +#, c-format +msgid "index \"%s\" is not the index for column \"%s\"" +msgstr "l'indice \"%s\" non è l'indice della colonna \"%s\"" -#: catalog/dependency.c:787 catalog/pg_shdepend.c:574 +#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "non è possibile eliminare %s perché richiesto dal sistema database" -#: catalog/dependency.c:905 +#: catalog/dependency.c:830 catalog/dependency.c:1057 #, c-format -msgid "drop auto-cascades to %s" -msgstr "l'eliminazione elimina anche %s in cascata automatica" +msgid "cannot drop %s because %s requires it" +msgstr "non è possibile eliminare %s perché %s lo richiede" + +#: catalog/dependency.c:832 catalog/dependency.c:1059 +#, c-format +msgid "You can drop %s instead." +msgstr "È invece possibile eliminare %s." -#: catalog/dependency.c:917 catalog/dependency.c:926 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s dipende da %s" -#: catalog/dependency.c:938 catalog/dependency.c:947 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "l'eliminazione elimina anche %s in cascata" -#: catalog/dependency.c:955 catalog/pg_shdepend.c:685 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -3693,621 +4131,660 @@ msgstr[1] "" "\n" "e %d altri oggetti (vedere il log del server per la lista)" -#: catalog/dependency.c:967 +#: catalog/dependency.c:1191 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "non è possibile eliminare %s perché altri oggetti dipendono da esso" -#: catalog/dependency.c:971 catalog/dependency.c:978 +#: catalog/dependency.c:1193 catalog/dependency.c:1194 catalog/dependency.c:1200 catalog/dependency.c:1201 catalog/dependency.c:1211 catalog/dependency.c:1212 commands/publicationcmds.c:593 commands/tablecmds.c:1328 commands/tablecmds.c:14282 commands/tablespace.c:476 commands/user.c:1008 commands/view.c:522 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:7412 utils/misc/guc.c:7448 utils/misc/guc.c:7518 utils/misc/guc.c:11874 utils/misc/guc.c:11908 utils/misc/guc.c:11942 utils/misc/guc.c:11985 utils/misc/guc.c:12027 +#, c-format +msgid "%s" +msgstr "%s" + +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Usa DROP ... CASCADE per eliminare anche gli oggetti dipendenti." -#: catalog/dependency.c:975 +#: catalog/dependency.c:1199 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "non è possibile eliminare gli oggetti desiderati perché altri oggetti dipendono da essi" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:984 +#: catalog/dependency.c:1207 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "l'eliminazione elimina in cascata %d altro oggetto" msgstr[1] "l'eliminazione elimina in cascata %d altri oggetti" -#: catalog/dependency.c:1644 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "un vincolo di tipo %s non può essere usato qui" -#: catalog/heap.c:286 +#: catalog/dependency.c:2410 parser/parse_relation.c:3369 parser/parse_relation.c:3379 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "la colonna %d della relazione \"%s\" non esiste" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "permesso di creare \"%s.%s\" negato" -#: catalog/heap.c:288 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Le modifiche al catalogo di sistema non sono attualmente consentite." -#: catalog/heap.c:425 commands/tablecmds.c:1861 commands/tablecmds.c:2385 -#: commands/tablecmds.c:5474 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 commands/tablecmds.c:6821 #, c-format msgid "tables can have at most %d columns" msgstr "le tabelle possono avere al massimo %d colonne" -#: catalog/heap.c:444 commands/tablecmds.c:5770 +#: catalog/heap.c:484 commands/tablecmds.c:7121 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "il nome della colonna \"%s\" è in conflitto con il nome di una colonna di sistema" -#: catalog/heap.c:460 +#: catalog/heap.c:500 #, c-format msgid "column name \"%s\" specified more than once" msgstr "nome di colonna \"%s\" specificato più di una volta" -#: catalog/heap.c:513 +#. translator: first %s is an integer not a name +#: catalog/heap.c:575 +#, c-format +msgid "partition key column %s has pseudo-type %s" +msgstr "la colonna della chiave di partizione %s ha lo pseudo-tipo %s" + +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "la colonna \"%s\" ha pseudo-tipo %s" -#: catalog/heap.c:543 +#: catalog/heap.c:611 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "il tipo composito %s non può essere fatto membro di sé stesso" -#: catalog/heap.c:585 commands/createas.c:201 commands/createas.c:498 +#. translator: first %s is an integer not a name +#: catalog/heap.c:666 #, c-format -msgid "no collation was derived for column \"%s\" with collatable type %s" -msgstr "nessun ordinamento è stato derivato per la colonna \"%s\" con tipo ordinabile %s" +msgid "no collation was derived for partition key column %s with collatable type %s" +msgstr "non sono state ricavate regole di confronto per la colonna chiave di partizione %s con tipo confrontabile %s" -#: catalog/heap.c:587 commands/createas.c:204 commands/createas.c:501 -#: commands/indexcmds.c:1578 commands/tablecmds.c:13778 commands/view.c:105 -#: regex/regc_pg_locale.c:263 utils/adt/formatting.c:1536 -#: utils/adt/formatting.c:1658 utils/adt/formatting.c:1781 utils/adt/like.c:184 -#: utils/adt/selfuncs.c:5807 utils/adt/varlena.c:1416 utils/adt/varlena.c:1881 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format -msgid "Use the COLLATE clause to set the collation explicitly." -msgstr "Usa la clausola COLLATE per impostare esplicitamente l'ordinamento." +msgid "no collation was derived for column \"%s\" with collatable type %s" +msgstr "nessun ordinamento è stato derivato per la colonna \"%s\" con tipo ordinabile %s" -#: catalog/heap.c:1076 catalog/index.c:876 commands/tablecmds.c:3148 +#: catalog/heap.c:1148 catalog/index.c:874 commands/createas.c:408 commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "la relazione \"%s\" esiste già" -#: catalog/heap.c:1092 catalog/pg_type.c:409 catalog/pg_type.c:731 -#: commands/typecmds.c:236 commands/typecmds.c:787 commands/typecmds.c:1186 -#: commands/typecmds.c:1419 commands/typecmds.c:2174 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 catalog/pg_type.c:931 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 "il tipo \"%s\" esiste già" -#: catalog/heap.c:1093 +#: catalog/heap.c:1165 #, 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 relazione ha un tipo associato con lo stesso nome, quindi devi usare nomi che non siano in conflitto con alcun tipo esistente." -#: catalog/heap.c:1122 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "valore toast relfilenode non impostato in modalità di aggiornamento binario" + +#: catalog/heap.c:1216 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "valore OID heap pg_class non impostato in modalità di aggiornamento binaria" -#: catalog/heap.c:2334 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "il valore di relfilenode non è impostato in modalità di aggiornamento binario" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "non si può aggiungere un vincolo NO INHERIT alla tabella partizionata \"%s\"" -#: catalog/heap.c:2599 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "il vincolo di controllo \"%s\" esiste già" -#: catalog/heap.c:2769 catalog/index.c:890 catalog/pg_constraint.c:917 -#: commands/tablecmds.c:7122 +#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 commands/tablecmds.c:8823 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "il vincolo \"%s\" per la relazione \"%s\" esiste già" -#: catalog/heap.c:2776 +#: catalog/heap.c:2578 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "il vincolo \"%s\" è in conflitto con un vincolo non ereditato sulla relazione \"%s\"" -#: catalog/heap.c:2787 +#: catalog/heap.c:2589 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "il vincolo \"%s\" è in conflitto con un vincolo ereditato sulla relazione \"%s\"" -#: catalog/heap.c:2797 +#: catalog/heap.c:2599 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "il vincolo \"%s\" è in conflitto con un vincolo non valido sulla relazione \"%s\"" -#: catalog/heap.c:2802 +#: catalog/heap.c:2604 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "unione del vincolo \"%s\" con una definizione ereditata" -#: catalog/heap.c:2917 +#: catalog/heap.c:2709 +#, c-format +msgid "cannot use generated column \"%s\" in column generation expression" +msgstr "impossibile utilizzare la colonna generata \"%s\" nell'espressione di generazione della colonna" + +#: catalog/heap.c:2711 +#, c-format +msgid "A generated column cannot reference another generated column." +msgstr "Una colonna generata non può fare riferimento a un'altra colonna generata." + +#: catalog/heap.c:2717 #, c-format -msgid "cannot use column references in default expression" -msgstr "non si possono usare riferimenti a colonne nell'espressione predefinita" +msgid "cannot use whole-row variable in column generation expression" +msgstr "non è possibile utilizzare la variabile a riga intera nell'espressione di generazione di colonne" -#: catalog/heap.c:2942 rewrite/rewriteHandler.c:1177 +#: catalog/heap.c:2718 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "Ciò farebbe dipendere la colonna generata dal proprio valore." + +#: catalog/heap.c:2771 +#, c-format +msgid "generation expression is not immutable" +msgstr "l'espressione di generazione non è immutabile" + +#: 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 "la colonna \"%s\" è di tipo %s ma l'espressione predefinita è di tipo %s" -#: catalog/heap.c:2947 commands/prepare.c:384 parser/parse_node.c:430 -#: parser/parse_target.c:590 parser/parse_target.c:859 -#: parser/parse_target.c:869 rewrite/rewriteHandler.c:1182 +#: 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 "Devi riscrivere o convertire il tipo dell'espressione" +msgstr "Devi riscrivere o convertire il tipo dell'espressione." -#: catalog/heap.c:2994 +#: catalog/heap.c:2851 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "solo la tabella \"%s\" può essere referenziata nel vincolo di controllo" -#: catalog/heap.c:3237 +#: catalog/heap.c:3149 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "la combinazione di COMMIT con una chiave esterna non è supportata" -#: catalog/heap.c:3238 +#: catalog/heap.c:3150 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "La tabella \"%s\" referenzia \"%s\", ma non hanno la stessa impostazione ON COMMIT." -#: catalog/heap.c:3243 +#: catalog/heap.c:3155 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "non è possibile troncare una tabella referenziata da un vincolo di chiave esterna" -#: catalog/heap.c:3244 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La tabella \"%s\" referenzia \"%s\"." -#: catalog/heap.c:3246 +#: catalog/heap.c:3158 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Troncare la tabella \"%s\" nello stesso tempo o usare TRUNCATE ... CASCADE." -#: catalog/index.c:233 parser/parse_utilcmd.c:1825 parser/parse_utilcmd.c:1912 +#: catalog/index.c:223 parser/parse_utilcmd.c:2184 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "non è possibile avere più di una chiave primaria per la tabella \"%s\"" -#: catalog/index.c:251 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "le chiavi primarie non possono essere delle espressioni" -#: catalog/index.c:820 catalog/index.c:1291 +#: catalog/index.c:258 +#, c-format +msgid "primary key column \"%s\" is not marked NOT NULL" +msgstr "la colonna della chiave primaria \"%s\" non è contrassegnata come NOT NULL" + +#: catalog/index.c:773 catalog/index.c:1932 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "non sono supportati indici definiti dall'utente sulle tabelle del catalogo di sistema" -#: catalog/index.c:830 +#: catalog/index.c:813 +#, c-format +msgid "nondeterministic collations are not supported for operator class \"%s\"" +msgstr "le regole di confronto non deterministiche non sono supportate per la classe di operatori \"%s\"" + +#: catalog/index.c:828 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "la creazione concorrente di indici sulle tabelle del catalogo di sistema non è supportata" -#: catalog/index.c:848 +#: catalog/index.c:837 catalog/index.c:1305 +#, c-format +msgid "concurrent index creation for exclusion constraints is not supported" +msgstr "la creazione simultanea dell'indice per i vincoli di esclusione non è supportata" + +#: catalog/index.c:846 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "indici condivisi non possono essere creati dopo initdb" -#: catalog/index.c:868 commands/createas.c:250 commands/sequence.c:152 -#: parser/parse_utilcmd.c:205 +#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 parser/parse_utilcmd.c:211 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relazione \"%s\" esiste già, saltata" -#: catalog/index.c:918 +#: catalog/index.c:916 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "valore OID indice pg_class non impostato in modalità di aggiornamento binaria" -#: catalog/index.c:1566 +#: catalog/index.c:926 utils/cache/relcache.c:3722 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "valore di index relfilenode non impostato in modalità di aggiornamento binario" + +#: catalog/index.c:2231 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY deve essere la prima azione della transazione" -#: catalog/index.c:2295 +#: catalog/index.c:3636 #, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "creazione seriale dell'indice \"%s\" sulla tabella \"%s\"" +msgid "cannot reindex temporary tables of other sessions" +msgstr "non è possibile reindicizzare le tabelle temporanee di altre sessioni" -#: catalog/index.c:2300 +#: catalog/index.c:3647 commands/indexcmds.c:3543 #, 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] "creazione dell'indice \"%s\" sulla tabella \"%s\" con richiesta di %d lavoratori paralleli" -msgstr[1] "creazione dell'indice \"%s\" sulla tabella \"%s\" con richiesta di %d lavoratori paralleli" +msgid "cannot reindex invalid index on TOAST table" +msgstr "impossibile reindicizzare l'indice non valido sulla tabella TOAST" -#: catalog/index.c:3689 +#: catalog/index.c:3663 commands/indexcmds.c:3423 commands/indexcmds.c:3567 commands/tablecmds.c:3305 #, c-format -msgid "cannot reindex temporary tables of other sessions" -msgstr "non è possibile reindicizzare le tabelle temporanee di altre sessioni" +msgid "cannot move system relation \"%s\"" +msgstr "non è possibile spostare la relazione \"%s\"" -#: catalog/index.c:3820 +#: catalog/index.c:3807 #, c-format msgid "index \"%s\" was reindexed" msgstr "l'indice \"%s\" è stato reindicizzato" -#: catalog/index.c:3891 +#: catalog/index.c:3944 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "REINDEX di una tabella partizionata non ancora implementato, \"%s\" saltato" +msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" +msgstr "impossibile reindicizzare l'indice non valido \"%s.%s\" sulla tabella TOAST, sto saltando" -#: catalog/namespace.c:248 catalog/namespace.c:452 catalog/namespace.c:546 -#: commands/trigger.c:5400 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5718 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "i riferimenti tra database diversi non sono implementati: \"%s.%s.%s\"" -#: catalog/namespace.c:305 +#: catalog/namespace.c:316 #, c-format msgid "temporary tables cannot specify a schema name" -msgstr "Le tabelle temporanee non possono specificare un nome di schema" +msgstr "le tabelle temporanee non possono specificare un nome di schema" -#: catalog/namespace.c:386 +#: catalog/namespace.c:397 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "lock della relazione \"%s.%s\" fallito" -#: catalog/namespace.c:391 commands/lockcmds.c:152 commands/lockcmds.c:238 +#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "lock della relazione \"%s\" fallito" -#: catalog/namespace.c:419 parser/parse_relation.c:1158 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "la relazione \"%s.%s\" non esiste" -#: catalog/namespace.c:424 parser/parse_relation.c:1171 -#: parser/parse_relation.c:1179 +#: catalog/namespace.c:435 parser/parse_relation.c:1386 parser/parse_relation.c:1394 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relazione \"%s\" non esiste" -#: catalog/namespace.c:492 catalog/namespace.c:3011 commands/extension.c:1466 -#: commands/extension.c:1472 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 commands/extension.c:1541 #, c-format msgid "no schema has been selected to create in" msgstr "nessuna schema selezionato per crearci dentro" -#: catalog/namespace.c:644 catalog/namespace.c:657 +#: catalog/namespace.c:653 catalog/namespace.c:666 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "non si possono creare relazioni in schemi temporanei di altre sessioni" -#: catalog/namespace.c:648 +#: catalog/namespace.c:657 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "non si possono creare relazioni temporanee in schemi non temporanei" -#: catalog/namespace.c:663 +#: catalog/namespace.c:672 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "solo relazioni temporanee possono essere create in schemi temporanei" -#: catalog/namespace.c:2201 +#: catalog/namespace.c:2268 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "la statistica \"%s\" non esiste" -#: catalog/namespace.c:2324 +#: catalog/namespace.c:2391 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "l'analizzatore di ricerca di testo \"%s\" non esiste" -#: catalog/namespace.c:2450 +#: catalog/namespace.c:2517 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "il dizionario di ricerca di testo \"%s\" non esiste" -#: catalog/namespace.c:2577 +#: catalog/namespace.c:2644 #, c-format msgid "text search template \"%s\" does not exist" msgstr "il modello di ricerca di testo \"%s\" non esiste" -#: catalog/namespace.c:2703 commands/tsearchcmds.c:1185 -#: utils/cache/ts_cache.c:616 +#: 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 "la configurazione di ricerca di testo \"%s\" non esiste" -#: catalog/namespace.c:2816 parser/parse_expr.c:793 parser/parse_target.c:1214 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "i riferimenti tra database diversi non sono implementati: %s" -#: catalog/namespace.c:2822 parser/parse_expr.c:800 parser/parse_target.c:1221 -#: gram.y:14712 gram.y:16144 +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "nome qualificato improprio (troppi nomi puntati): %s" -#: catalog/namespace.c:2953 +#: catalog/namespace.c:3019 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "non posso spostare oggetti dentro o fuori gli schemi temporanei" -#: catalog/namespace.c:2959 +#: catalog/namespace.c:3025 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "non posso spostare oggetti dentro o fuori lo schema TOAST" -#: catalog/namespace.c:3032 commands/schemacmds.c:256 commands/schemacmds.c:334 -#: commands/tablecmds.c:1014 +#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "lo schema \"%s\" non esiste" -#: catalog/namespace.c:3063 +#: catalog/namespace.c:3129 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "nome di relazione improprio (troppi nomi puntati): %s" -#: catalog/namespace.c:3597 +#: catalog/namespace.c:3692 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "l'ordinamento \"%s\" per la codifica \"%s\" non esiste" -#: catalog/namespace.c:3652 +#: catalog/namespace.c:3747 #, c-format msgid "conversion \"%s\" does not exist" msgstr "la conversione \"%s\" non esiste" -#: catalog/namespace.c:3860 +#: catalog/namespace.c:4011 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "permesso di creare tabelle temporanee nel database \"%s\" negato" -#: catalog/namespace.c:3876 +#: catalog/namespace.c:4027 #, c-format msgid "cannot create temporary tables during recovery" msgstr "non è possibile creare tabelle temporanee durante il recupero" -#: catalog/namespace.c:3882 +#: catalog/namespace.c:4033 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "non è possibile creare tabelle temporanee durante un'operazione parallela" -#: catalog/namespace.c:4165 commands/tablespace.c:1171 commands/variable.c:64 -#: utils/misc/guc.c:10258 utils/misc/guc.c:10336 +#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 utils/misc/guc.c:12059 utils/misc/guc.c:12161 #, c-format msgid "List syntax is invalid." msgstr "La sintassi della lista non è valida." -#: catalog/objectaddress.c:1238 catalog/pg_publication.c:66 -#: commands/policy.c:94 commands/policy.c:394 commands/policy.c:484 -#: commands/tablecmds.c:225 commands/tablecmds.c:267 commands/tablecmds.c:1719 -#: commands/tablecmds.c:4969 commands/tablecmds.c:9200 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 commands/tablecmds.c:12252 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" non è una tabella" -#: catalog/objectaddress.c:1245 commands/tablecmds.c:237 -#: commands/tablecmds.c:4999 commands/tablecmds.c:13497 commands/view.c:143 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 commands/tablecmds.c:17097 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" non è una vista" -#: catalog/objectaddress.c:1252 commands/matview.c:172 commands/tablecmds.c:243 -#: commands/tablecmds.c:13502 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 commands/tablecmds.c:17102 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" non è una vista materializzata" -#: catalog/objectaddress.c:1259 commands/tablecmds.c:261 -#: commands/tablecmds.c:5002 commands/tablecmds.c:13507 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 commands/tablecmds.c:17107 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" non è una tabella esterna" -#: catalog/objectaddress.c:1300 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "occorre specificare tabella e nome dell'oggetto" -#: catalog/objectaddress.c:1376 catalog/objectaddress.c:1429 +#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 #, c-format msgid "column name must be qualified" msgstr "il nome della colonna deve essere qualificato" -#: catalog/objectaddress.c:1472 +#: catalog/objectaddress.c:1601 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "il valore di default per la colonna \"%s\" della relazione \"%s\" non esiste" -#: catalog/objectaddress.c:1509 commands/functioncmds.c:133 -#: commands/tablecmds.c:253 commands/typecmds.c:3323 parser/parse_type.c:226 -#: parser/parse_type.c:255 parser/parse_type.c:828 utils/adt/acl.c:4452 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 commands/tablecmds.c:275 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 "il tipo \"%s\" non esiste" -#: catalog/objectaddress.c:1628 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "l'operatore %d (%s, %s) di %s non esiste" -#: catalog/objectaddress.c:1659 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "la funzione %d (%s, %s) di %s non esiste" -#: catalog/objectaddress.c:1710 catalog/objectaddress.c:1736 +#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "la mappatura per l'utente \"%s\" sul server \"%s\" non esiste" -#: catalog/objectaddress.c:1725 commands/foreigncmds.c:428 -#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1381 -#: foreign/foreign.c:688 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "il server \"%s\" non esiste" -#: catalog/objectaddress.c:1792 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "la tabella \"%s\" nella pubblicazione \"%s\" non esiste" -#: catalog/objectaddress.c:1854 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "lo schema di pubblicazione \"%s\" nella pubblicazione \"%s\" non esiste" + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "tipo di oggetto ACL di default \"%c\" non riconosciuto" -#: catalog/objectaddress.c:1855 +#: catalog/objectaddress.c:2027 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Gli oggetti validi sono \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:1906 +#: catalog/objectaddress.c:2078 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "l'ACL di default per l'utente \"%s\" nello schema \"%s\" su %s non esiste" -#: catalog/objectaddress.c:1911 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "l'ACL di default per l'utente \"%s\" su %s non esiste" -#: catalog/objectaddress.c:1938 catalog/objectaddress.c:1996 -#: catalog/objectaddress.c:2053 +#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 catalog/objectaddress.c:2225 #, c-format msgid "name or argument lists may not contain nulls" msgstr "il nome o la lista di argomenti non può contenere valori nulli" -#: catalog/objectaddress.c:1972 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "tipo di oggetto \"%s\" non supportato" -#: catalog/objectaddress.c:1992 catalog/objectaddress.c:2010 -#: catalog/objectaddress.c:2151 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 #, c-format msgid "name list length must be exactly %d" msgstr "la lunghezza della lista dei nomi dev'essere %d" -#: catalog/objectaddress.c:2014 +#: catalog/objectaddress.c:2186 #, c-format msgid "large object OID may not be null" msgstr "l'OID di large object non può essere nullo" -#: catalog/objectaddress.c:2023 catalog/objectaddress.c:2086 -#: catalog/objectaddress.c:2093 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "la lunghezza della lista dei nomi deve essere almeno %d" -#: catalog/objectaddress.c:2079 catalog/objectaddress.c:2100 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "la lunghezza della lista degli argomenti deve essere %d" -#: catalog/objectaddress.c:2330 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "occorre essere proprietari del large object %u" -#: catalog/objectaddress.c:2345 commands/functioncmds.c:1454 +#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" msgstr "occorre essere proprietari del tipo %s o del tipo %s" -#: catalog/objectaddress.c:2395 catalog/objectaddress.c:2412 +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "occorre essere superutenti" -#: catalog/objectaddress.c:2402 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "occorre avere privilegio CREATEROLE" -#: catalog/objectaddress.c:2481 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "tipo di oggetto \"%s\" non riconosciuto" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2694 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "colonna %s di %s" -#: catalog/objectaddress.c:2704 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "funzione %s" -#: catalog/objectaddress.c:2709 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "tipo %s" -#: catalog/objectaddress.c:2739 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "conversione da %s a %s" -#: catalog/objectaddress.c:2767 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "ordinamento %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2793 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "vincolo %s su %s" -#: catalog/objectaddress.c:2799 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "vincolo %s" -#: catalog/objectaddress.c:2826 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "conversione %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2865 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "valore di default per %s" -#: catalog/objectaddress.c:2874 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "linguaggio %s" -#: catalog/objectaddress.c:2879 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "large object %u" -#: catalog/objectaddress.c:2884 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "operatore %s" -#: catalog/objectaddress.c:2916 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "classe di operatori %s per il metodo di accesso %s" -#: catalog/objectaddress.c:2939 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "metodo di accesso %s" @@ -4316,7 +4793,7 @@ msgstr "metodo di accesso %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:2981 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operatore %d (%s, %s) della %s: %s" @@ -4325,254 +4802,247 @@ msgstr "operatore %d (%s, %s) della %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:3031 +#: catalog/objectaddress.c:3370 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "funzione %d (%s, %s) della %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3075 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "regola %s su %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3113 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "trigger %s su %s" -#: catalog/objectaddress.c:3129 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "schema %s" -#: catalog/objectaddress.c:3152 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "statistiche %s" -#: catalog/objectaddress.c:3179 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "analizzatore di ricerca di testo %s" -#: catalog/objectaddress.c:3205 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "dizionario di ricerca di testo %s" -#: catalog/objectaddress.c:3231 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "modello di ricerca di testo %s" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "configurazione di ricerca di testo %s" -#: catalog/objectaddress.c:3266 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "regola %s" -#: catalog/objectaddress.c:3279 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "database %s" -#: catalog/objectaddress.c:3291 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3300 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "wrapper di dati esterni %s" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "server %s" -#: catalog/objectaddress.c:3337 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "mappatura utenti per %s sul server %s" -#: catalog/objectaddress.c:3382 +#: catalog/objectaddress.c:3791 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "privilegi predefiniti sulle nuove relazioni appartenenti al ruolo %s nello schema %s" -#: catalog/objectaddress.c:3386 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "privilegi predefiniti sulle nuove relazioni appartenenti al ruolo %s" -#: catalog/objectaddress.c:3392 +#: catalog/objectaddress.c:3801 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "privilegi predefiniti sulle nuove sequenze appartenenti al ruolo %s nello schema %s" -#: catalog/objectaddress.c:3396 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "privilegi predefiniti sulle nuove sequenze appartenenti al ruolo %s" -#: catalog/objectaddress.c:3402 +#: catalog/objectaddress.c:3811 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "privilegi predefiniti sulle nuove funzioni appartenenti al ruolo %s nello schema %s" -#: catalog/objectaddress.c:3406 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "privilegi predefiniti sulle nuove funzioni appartenenti al ruolo %s" -#: catalog/objectaddress.c:3412 +#: catalog/objectaddress.c:3821 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "privilegi predefiniti sui nuovi tipi appartenenti al ruolo %s nello schema %s" -#: catalog/objectaddress.c:3416 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "privilegi predefiniti sui nuovi tipi appartenenti al ruolo %s" -#: catalog/objectaddress.c:3422 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "privilegi predefiniti sui nuovi schemi appartenenti al ruolo %s" -#: catalog/objectaddress.c:3429 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "privilegi predefiniti appartenenti al ruolo %s nello schema %s" -#: catalog/objectaddress.c:3433 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "privilegi predefiniti appartenenti al ruolo %s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "estensione %s" -#: catalog/objectaddress.c:3464 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "trigger di evento %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "parametro %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "regola di sicurezza %s su %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "pubblicazione %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "pubblicazione dello schema %s nella pubblicazione %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3535 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "pubblicazione di %s nella pubblicazione %s" -#: catalog/objectaddress.c:3544 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "sottoscrizione %s" -#: catalog/objectaddress.c:3562 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "trasformazione per %s linguaggio %s" -#: catalog/objectaddress.c:3625 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "tabella %s" -#: catalog/objectaddress.c:3630 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "indice %s" -#: catalog/objectaddress.c:3634 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "sequenza %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "tabella toast %s" -#: catalog/objectaddress.c:3642 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "vista %s" -#: catalog/objectaddress.c:3646 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "vista materializzata %s" -#: catalog/objectaddress.c:3650 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "tipo composito %s" -#: catalog/objectaddress.c:3654 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "tabella esterna %s" -#: catalog/objectaddress.c:3659 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "relazione %s" -#: catalog/objectaddress.c:3696 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "famiglia di operatori %s per il metodo d'accesso %s" -#: catalog/partition.c:180 catalog/pg_constraint.c:420 commands/analyze.c:1499 -#: commands/indexcmds.c:918 commands/tablecmds.c:941 commands/tablecmds.c:9262 -#: commands/tablecmds.c:14386 commands/tablecmds.c:14858 -#: executor/execExprInterp.c:3275 executor/execMain.c:1940 -#: executor/execMain.c:2019 executor/execMain.c:2067 executor/execMain.c:2173 -#: executor/execPartition.c:462 executor/execPartition.c:522 -#: executor/execPartition.c:638 executor/execPartition.c:741 -#: executor/execPartition.c:812 executor/execPartition.c:1010 -#: executor/nodeModifyTable.c:1859 -msgid "could not convert row type" -msgstr "conversione del tipo riga fallita" - -#: catalog/pg_aggregate.c:126 +#: 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] "gli aggregati non possono avere più di %d argomento" msgstr[1] "gli aggregati non possono avere più di %d argomenti" -#: catalog/pg_aggregate.c:149 catalog/pg_aggregate.c:159 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format msgid "cannot determine transition data type" msgstr "non è possibile determinare il tipo di dati della transizione" -#: catalog/pg_aggregate.c:150 catalog/pg_aggregate.c:160 -#, c-format -msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." -msgstr "Un aggregato che usa un tipo di transizione polimorfico deve avere almeno un argomento polimorfico." - #: catalog/pg_aggregate.c:173 #, c-format msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" @@ -4598,12 +5068,12 @@ msgstr "non si può omettere initval quando la funzione di transizione è strict msgid "return type of inverse transition function %s is not %s" msgstr "il tipo restituito dalla funzione di transizione inversa %s non è %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2838 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2978 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "le ristrettezze della trasformazione diretta ed inversa di un aggregato devono combaciare" -#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:549 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format msgid "final function with extra arguments must not be declared STRICT" msgstr "la funzione finale con argomenti aggiuntivi non deve essere dichiarata STRICT" @@ -4613,7 +5083,7 @@ msgstr "la funzione finale con argomenti aggiuntivi non deve essere dichiarata S msgid "return type of combine function %s is not %s" msgstr "il tipo restituito dalla funzione di combinazione %s non è %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:2943 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3883 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "la funzione di combinazione con il tipo di transizione %s non deve essere dichiarata STRICT" @@ -4628,296 +5098,399 @@ msgstr "il tipo restituito dalla funzione di serializzazione %s non è %s" msgid "return type of deserialization function %s is not %s" msgstr "il tipo restituito dalla funzione di deserializzazione %s non è %s" -#: catalog/pg_aggregate.c:495 catalog/pg_proc.c:240 catalog/pg_proc.c:247 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, c-format msgid "cannot determine result data type" msgstr "non è possibile determinare il tipo di dati del risultato" -#: catalog/pg_aggregate.c:496 -#, c-format -msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." -msgstr "Una funzione di aggregazione che restituisce un tipo polimorfico deve avere almeno un argomento polimorfico." - -#: catalog/pg_aggregate.c:508 catalog/pg_proc.c:253 +#: 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 "uso dello pseudo-tipo \"internal\" non sicuro" -#: catalog/pg_aggregate.c:509 catalog/pg_proc.c:254 -#, c-format -msgid "A function returning \"internal\" must have at least one \"internal\" argument." -msgstr "Una funzione che restituisce \"internal\" deve avere almeno un argomento \"internal\"." - -#: catalog/pg_aggregate.c:562 +#: catalog/pg_aggregate.c:567 #, c-format msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" msgstr "l'implementazione dell'aggregazione mobile restituisce il tipo %s ma l'implementazione semplice resituisce il tipo %s" -#: catalog/pg_aggregate.c:573 +#: catalog/pg_aggregate.c:578 #, c-format msgid "sort operator can only be specified for single-argument aggregates" msgstr "l'operatore di ordinamento può essere specificato sono per aggregati con un solo argomento" -#: catalog/pg_aggregate.c:819 commands/typecmds.c:1766 commands/typecmds.c:1817 -#: commands/typecmds.c:1848 commands/typecmds.c:1871 commands/typecmds.c:1892 -#: commands/typecmds.c:1919 commands/typecmds.c:1946 commands/typecmds.c:2023 -#: commands/typecmds.c:2065 parser/parse_func.c:408 parser/parse_func.c:437 -#: parser/parse_func.c:462 parser/parse_func.c:476 parser/parse_func.c:596 -#: parser/parse_func.c:616 parser/parse_func.c:2086 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#, c-format +msgid "cannot change routine kind" +msgstr "non è possibile cambiare il tipo di routine" + +#: catalog/pg_aggregate.c:708 +#, c-format +msgid "\"%s\" is an ordinary aggregate function." +msgstr "\"%s\" è una normale funzione aggregata." + +#: catalog/pg_aggregate.c:710 +#, c-format +msgid "\"%s\" is an ordered-set aggregate." +msgstr "\"%s\" è un insieme ordinato." + +#: catalog/pg_aggregate.c:712 +#, c-format +msgid "\"%s\" is a hypothetical-set aggregate." +msgstr "\"%s\" è un insieme ipotetico." + +#: catalog/pg_aggregate.c:717 +#, c-format +msgid "cannot change number of direct arguments of an aggregate function" +msgstr "non è possibile modificare il numero di argomenti diretti di una funzione aggregata" + +#: 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 "la funzione %s non esiste" -#: catalog/pg_aggregate.c:825 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "la funzione %s restituisce un insieme" -#: catalog/pg_aggregate.c:840 +#: catalog/pg_aggregate.c:879 #, c-format msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "la funzione %s deve accettare VARIADIC ANY per essere usata in questo aggregato" -#: catalog/pg_aggregate.c:864 +#: catalog/pg_aggregate.c:903 #, c-format msgid "function %s requires run-time type coercion" msgstr "la funzione %s richiede una coercizione di tipo a run-time" -#: catalog/pg_collation.c:92 catalog/pg_collation.c:139 +#: catalog/pg_cast.c:68 #, c-format -msgid "collation \"%s\" already exists, skipping" -msgstr "l'ordinamento \"%s\" esiste già, saltato" +msgid "cast from type %s to type %s already exists" +msgstr "la conversione dal tipo %s al tipo %s esiste già" -#: catalog/pg_collation.c:94 +#: catalog/pg_class.c:29 #, c-format -msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" -msgstr "l'ordinamento \"%s\" per l'encoding \"%s\" esiste già, saltato" +msgid "This operation is not supported for tables." +msgstr "Questa operazione non è supportata per le tabelle." -#: catalog/pg_collation.c:102 catalog/pg_collation.c:146 +#: catalog/pg_class.c:31 #, c-format -msgid "collation \"%s\" already exists" -msgstr "l'ordinamento \"%s\" esiste già" +msgid "This operation is not supported for indexes." +msgstr "Questa operazione non è supportata per gli indici." -#: catalog/pg_collation.c:104 +#: catalog/pg_class.c:33 #, c-format -msgid "collation \"%s\" for encoding \"%s\" already exists" -msgstr "l'ordinamento \"%s\" per la codifica \"%s\" esiste già" +msgid "This operation is not supported for sequences." +msgstr "Questa operazione non è supportata per le sequenze." -#: catalog/pg_constraint.c:925 +#: catalog/pg_class.c:35 #, c-format -msgid "constraint \"%s\" for domain %s already exists" +msgid "This operation is not supported for TOAST tables." +msgstr "Questa operazione non è supportata per le tabelle TOAST." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "Questa operazione non è supportata per le viste." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "Questa operazione non è supportata per le viste materializzate." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "Questa operazione non è supportata per i tipi compositi." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "This operation is not supported for foreign tables." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "Questa operazione non è supportata per le tabelle partizionate." + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "Questa operazione non è supportata per gli indici partizionati." + +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 +#, c-format +msgid "collation \"%s\" already exists, skipping" +msgstr "l'ordinamento \"%s\" esiste già, saltato" + +#: catalog/pg_collation.c:103 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" +msgstr "l'ordinamento \"%s\" per l'encoding \"%s\" esiste già, saltato" + +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 +#, c-format +msgid "collation \"%s\" already exists" +msgstr "l'ordinamento \"%s\" esiste già" + +#: catalog/pg_collation.c:113 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists" +msgstr "l'ordinamento \"%s\" per la codifica \"%s\" esiste già" + +#: catalog/pg_constraint.c:697 +#, c-format +msgid "constraint \"%s\" for domain %s already exists" msgstr "il vincolo \"%s\" per il dominio %s esiste già" -#: catalog/pg_constraint.c:1088 catalog/pg_constraint.c:1181 +#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "il vincolo \"%s\" per la tabella \"%s\" non esiste" -#: catalog/pg_constraint.c:1270 +#: catalog/pg_constraint.c:1075 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "il vincolo \"%s\" per il dominio %s non esiste" -#: catalog/pg_conversion.c:65 +#: catalog/pg_conversion.c:67 #, c-format msgid "conversion \"%s\" already exists" msgstr "la conversione \"%s\" esiste già" -#: catalog/pg_conversion.c:78 +#: catalog/pg_conversion.c:80 #, c-format msgid "default conversion for %s to %s already exists" msgstr "la conversione predefinita da %s a %s esiste già" -#: catalog/pg_depend.c:163 commands/extension.c:3218 +#: catalog/pg_depend.c:222 commands/extension.c:3271 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s fa già parte dell'estensione \"%s\"" -#: catalog/pg_depend.c:322 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 +#, c-format +msgid "%s is not a member of extension \"%s\"" +msgstr "%s non fa parte dell'estensione \"%s\"" + +#: catalog/pg_depend.c:232 +#, c-format +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "Un'estensione non può sostituire un oggetto che non possiede." + +#: catalog/pg_depend.c:283 +#, c-format +msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." +msgstr "Un'estensione può utilizzare solo CREATE ... IF NOT EXISTS per saltare la creazione dell'oggetto se l'oggetto in conflitto è già di sua proprietà." + +#: catalog/pg_depend.c:646 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "non è possibile rimuovere la dipendenza da %s perché è un oggetto di sistema" -#: catalog/pg_enum.c:115 catalog/pg_enum.c:201 catalog/pg_enum.c:488 +#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 #, c-format msgid "invalid enum label \"%s\"" msgstr "etichetta enumerata non valida \"%s\"" -#: catalog/pg_enum.c:116 catalog/pg_enum.c:202 catalog/pg_enum.c:489 +#: 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 "Le etichette devono essere lunghe %d caratteri o meno." +msgid "Labels must be %d bytes or less." +msgstr "Le etichette devono essere %d byte o meno." -#: catalog/pg_enum.c:230 +#: catalog/pg_enum.c:259 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "l'etichetta di enum \"%s\" esiste già, saltata" -#: catalog/pg_enum.c:237 catalog/pg_enum.c:532 +#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 #, c-format msgid "enum label \"%s\" already exists" msgstr "l'etichetta di enum \"%s\" esiste già" -#: catalog/pg_enum.c:292 catalog/pg_enum.c:527 +#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "\"%s\" non è un'etichetta enumerata esistente" -#: catalog/pg_enum.c:350 +#: catalog/pg_enum.c:379 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "valore di OID di pg_enum non impostato in modalità di aggiornamento binario" -#: catalog/pg_enum.c:360 +#: catalog/pg_enum.c:389 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER non è compatibile con gli aggiornamenti binari" -#: catalog/pg_namespace.c:63 commands/schemacmds.c:264 +#: catalog/pg_inherits.c:593 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "impossibile staccare la partizione \"%s\"" + +#: catalog/pg_inherits.c:595 +#, c-format +msgid "The partition is being detached concurrently or has an unfinished detach." +msgstr "La partizione viene staccata contemporaneamente o presenta un distacco non terminato." + +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 commands/tablecmds.c:15397 +#, c-format +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Utilizzare ALTER TABLE ... DETACH PARTITION ... FINALIZE per completare l'operazione di scollegamento in sospeso." + +#: catalog/pg_inherits.c:600 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "impossibile completare lo scollegamento della partizione \"%s\"" + +#: catalog/pg_inherits.c:602 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "Non ci sono distacchi simultanei in sospeso." + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:254 #, c-format msgid "schema \"%s\" already exists" msgstr "lo schema \"%s\" esiste già" -#: catalog/pg_operator.c:218 catalog/pg_operator.c:357 +#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "\"%s\" non è un nome di operatore valido" -#: catalog/pg_operator.c:366 +#: catalog/pg_operator.c:370 #, c-format msgid "only binary operators can have commutators" msgstr "solo gli operatori binari possono avere commutatori" -#: catalog/pg_operator.c:370 commands/operatorcmds.c:485 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 #, c-format msgid "only binary operators can have join selectivity" msgstr "solo gli operatori binari possono avere selettività di unione" -#: catalog/pg_operator.c:374 +#: catalog/pg_operator.c:378 #, c-format msgid "only binary operators can merge join" msgstr "solo gli operatori binari possono fare dei merge-join" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:382 #, c-format msgid "only binary operators can hash" msgstr "solo gli operatori binari possono supportare l'hash" -#: catalog/pg_operator.c:389 +#: catalog/pg_operator.c:393 #, c-format msgid "only boolean operators can have negators" msgstr "solo gli operatori booleani possono avere un negatore" -#: catalog/pg_operator.c:393 commands/operatorcmds.c:493 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "solo gli operatori booleani possono avere restrizione di selettività" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:497 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 #, c-format msgid "only boolean operators can have join selectivity" msgstr "solo gli operatori booleani possono avere selettività di unione" -#: catalog/pg_operator.c:401 +#: catalog/pg_operator.c:405 #, c-format msgid "only boolean operators can merge join" msgstr "solo gli operatori booleani possono fare dei merge-join" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:409 #, c-format msgid "only boolean operators can hash" msgstr "solo gli operatori booleani possono supportare l'hash" -#: catalog/pg_operator.c:417 +#: catalog/pg_operator.c:421 #, c-format msgid "operator %s already exists" -msgstr "l'operatore %s esiste già " +msgstr "l'operatore %s esiste già" -#: catalog/pg_operator.c:611 +#: catalog/pg_operator.c:621 #, c-format msgid "operator cannot be its own negator or sort operator" msgstr "l'operatore non può negare o ordinare se stesso" -#: catalog/pg_proc.c:128 parser/parse_func.c:2122 +#: catalog/pg_parameter_acl.c:52 #, c-format -msgid "functions cannot have more than %d argument" -msgid_plural "functions cannot have more than %d arguments" -msgstr[0] "le funzioni non possono avere più di %d argomento" -msgstr[1] "le funzioni non possono avere più di %d argomenti" +msgid "parameter ACL \"%s\" does not exist" +msgstr "il parametro ACL \"%s\" non esiste" -#: catalog/pg_proc.c:241 +#: catalog/pg_parameter_acl.c:87 #, c-format -msgid "A function returning a polymorphic type must have at least one polymorphic argument." -msgstr "Una funzione che restituisce un tipo polimorfico deve avere almeno un argomento polimorfico." +msgid "invalid parameter name \"%s\"" +msgstr "nome parametro non valido \"%s\"" -#: catalog/pg_proc.c:248 +#: catalog/pg_proc.c:132 parser/parse_func.c:2235 #, c-format -msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." -msgstr "Una funzione che restituisce \"anyrange\" deve avere almeno un argomento \"anyrange\"." +msgid "functions cannot have more than %d argument" +msgid_plural "functions cannot have more than %d arguments" +msgstr[0] "le funzioni non possono avere più di %d argomento" +msgstr[1] "le funzioni non possono avere più di %d argomenti" -#: catalog/pg_proc.c:383 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "la funzione \"%s\" esiste già, con gli stessi tipi di argomenti" -#: catalog/pg_proc.c:393 -#, c-format -msgid "cannot change routine kind" -msgstr "non è possibile cambiare il tipo di routine" - -#: catalog/pg_proc.c:395 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" è una funzione di aggregazione." -#: catalog/pg_proc.c:397 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" è una funzione." -#: catalog/pg_proc.c:399 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" è una procedura." -#: catalog/pg_proc.c:401 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" è una funzione finestra." -#: catalog/pg_proc.c:419 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "non è possibile cambiare se una funzione ha parametri di output o no" -#: catalog/pg_proc.c:420 catalog/pg_proc.c:446 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "non è possibile cambiare il tipo restituito da una funzione esistente" +#. translator: first %s is DROP FUNCTION, DROP PROCEDURE, or DROP +#. AGGREGATE +#. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:422 catalog/pg_proc.c:449 catalog/pg_proc.c:494 -#: catalog/pg_proc.c:520 catalog/pg_proc.c:548 +#: 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 "Usa %s %s prima." -#: catalog/pg_proc.c:447 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Il tipo della riga definito dai parametri di OUT è diverso." -#: catalog/pg_proc.c:491 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "non è possibile cambiare nome del parametro di ingresso \"%s\"" -#: catalog/pg_proc.c:518 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "non è possibile rimuovere i valori predefiniti dei parametri da funzioni esistenti" -#: catalog/pg_proc.c:546 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "non è possibile cambiare tipo di dati dei valori predefiniti di parametri esistenti" @@ -4935,65 +5508,79 @@ msgstr "Le funzioni SQL non possono restituire il tipo %s" #: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" -msgstr "le funzioni SQL non possono avere argomenti di tipo %s" +msgstr "Le funzioni SQL non possono avere argomenti di tipo %s" -#: catalog/pg_proc.c:958 executor/functions.c:1434 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" -msgstr "funzione SQL \"%s\"" - -#: catalog/pg_publication.c:57 commands/trigger.c:235 commands/trigger.c:253 -#, c-format -msgid "\"%s\" is a partitioned table" -msgstr "\"%s\" è una tabella partizionata" +msgstr "Funzione 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 "Adding partitioned tables to publications is not supported." -msgstr "L'aggiunta di tabelle partizionate a pubblicazioni non è supportata." +msgid "cannot add relation \"%s\" to publication" +msgstr "impossibile aggiungere la relazione \"%s\" alla pubblicazione" -#: catalog/pg_publication.c:60 +#: catalog/pg_publication.c:73 #, c-format -msgid "You can add the table partitions individually." -msgstr "Puoi aggiungere le partizioni della tabella individualmente." +msgid "This operation is not supported for system tables." +msgstr "Questa operazione non è supportata per le tabelle di sistema." -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:81 #, c-format -msgid "Only tables can be added to publications." -msgstr "Solo le tabelle possono essere aggiunte alle pubblicazioni." +msgid "This operation is not supported for temporary tables." +msgstr "Questa operazione non è supportata per le tabelle temporanee." -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:87 #, c-format -msgid "\"%s\" is a system table" -msgstr "\"%s\" è una tabella di sistema" +msgid "This operation is not supported for unlogged tables." +msgstr "Questa operazione non è supportata per le tabelle non registrate." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "System tables cannot be added to publications." -msgstr "Le tabelle di sistema non possono essere aggiunte alle pubblicazioni." +msgid "cannot add schema \"%s\" to publication" +msgstr "impossibile aggiungere lo schema \"%s\" alla pubblicazione" -#: catalog/pg_publication.c:82 +#: catalog/pg_publication.c:103 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "la tabella \"%s\" non può essere replicata" +msgid "This operation is not supported for system schemas." +msgstr "Questa operazione non è supportata per gli schemi di sistema." -#: catalog/pg_publication.c:84 +#: catalog/pg_publication.c:111 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "Le relazioni temporanee e non loggate non possono essere replicate." +msgid "Temporary schemas cannot be replicated." +msgstr "Gli schemi temporanei non possono essere replicati." -#: catalog/pg_publication.c:175 +#: catalog/pg_publication.c:374 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "la relazione \"%s\" è già membra della pubblicazione \"%s\"" -#: catalog/pg_publication.c:403 catalog/pg_publication.c:424 -#: commands/publicationcmds.c:415 commands/publicationcmds.c:716 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "impossibile utilizzare la colonna di sistema \"%s\" nell'elenco delle colonne di pubblicazione" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "impossibile utilizzare la colonna generata \"%s\" nell'elenco delle colonne della pubblicazione" + +#: catalog/pg_publication.c:528 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "colonna duplicata \"%s\" nell'elenco delle colonne della pubblicazione" + +#: catalog/pg_publication.c:618 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "lo schema \"%s\" è già membro della pubblicazione \"%s\"" + +#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1394 commands/publicationcmds.c:1433 commands/publicationcmds.c:1970 #, c-format msgid "publication \"%s\" does not exist" msgstr "la pubblicazione \"%s\" non esiste" -#: catalog/pg_shdepend.c:692 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5008,223 +5595,248 @@ msgstr[1] "" "\n" "ed oggetti in %d altri database (guarda il log per la lista)" -#: catalog/pg_shdepend.c:998 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "la regola %u è stata eliminata concorrentemente" -#: catalog/pg_shdepend.c:1017 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" -msgstr "Il tablespace %u è stato eliminato concorrentemente" +msgstr "il tablespace %u è stato eliminato concorrentemente" -#: catalog/pg_shdepend.c:1032 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" -msgstr "Il database %u è stato eliminato concorrentemente" +msgstr "il database %u è stato eliminato concorrentemente" -#: catalog/pg_shdepend.c:1077 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "proprietario di %s" -#: catalog/pg_shdepend.c:1079 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "privilegi per %s" -#: catalog/pg_shdepend.c:1081 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "destinazione di %s" +#: catalog/pg_shdepend.c:1259 +#, c-format +msgid "tablespace for %s" +msgstr "tablespace per %s" + #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1089 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d oggetto nel %s" msgstr[1] "%d oggetti nel %s" -#: catalog/pg_shdepend.c:1200 +#: catalog/pg_shdepend.c:1331 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "non è possibile eliminare oggetti di proprietà di %s perché richiesti dal database" -#: catalog/pg_shdepend.c:1315 +#: 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 "non è possibile modificare il proprietario degli oggetti di proprietà di %s perché richiesti dal database" -#: catalog/pg_subscription.c:176 commands/subscriptioncmds.c:633 -#: commands/subscriptioncmds.c:843 commands/subscriptioncmds.c:1067 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1354 commands/subscriptioncmds.c:1705 #, c-format msgid "subscription \"%s\" does not exist" msgstr "la sottoscrizione \"%s\" non esiste" -#: catalog/pg_type.c:135 catalog/pg_type.c:451 +#: catalog/pg_subscription.c:474 +#, c-format +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "impossibile eliminare la mappatura delle relazioni per la sottoscrizione \"%s\"" + +#: catalog/pg_subscription.c:476 +#, c-format +msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." +msgstr "La sincronizzazione della tabella per la relazione \"%s\" è in corso ed è nello stato \"%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 "Usa %s per abilitare l'abbonamento se non è già abilitato o usa %s per abbandonare l'abbonamento." + +#: 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 "valore di OID di pg_type non impostato in modalità di aggiornamento binaria" -#: catalog/pg_type.c:250 +#: catalog/pg_type.c:256 #, c-format msgid "invalid type internal size %d" msgstr "dimensione interna del tipo %d non valida" -#: catalog/pg_type.c:266 catalog/pg_type.c:274 catalog/pg_type.c:282 -#: catalog/pg_type.c:291 +#: 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'allineamento \"%c\" non è valido per tipi passati per valore di grandezza %d" -#: catalog/pg_type.c:298 +#: catalog/pg_type.c:304 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "la dimensione interna %d non è valida per tipi passati per valore" -#: 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 "l'allineamento \"%c\" non è valido per il tipi a lunghezza variabile" -#: catalog/pg_type.c:321 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "i tipi a dimensione fissa devono avere immagazzinamento PLAIN" -#: catalog/pg_type.c:800 +#: catalog/pg_type.c:827 #, c-format msgid "could not form array type name for type \"%s\"" msgstr "creazione del nome per il tipo array del tipo \"%s\" fallita" -#: catalog/toasting.c:105 commands/indexcmds.c:443 commands/tablecmds.c:4981 -#: commands/tablecmds.c:13385 +#: catalog/pg_type.c:932 #, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\" non è una tabella né una vista materializzata" +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "Errore durante la creazione di un tipo multirange per il tipo \"%s\"." + +#: catalog/pg_type.c:933 +#, c-format +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "E' possibile specificare manualmente un nome di tipo multirange utilizzando l'attributo \"multirange_type_name\"." -#: catalog/toasting.c:158 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, c-format -msgid "shared tables cannot be toasted after initdb" -msgstr "le tabelle condivise non possono essere trasformate in toast dopo initdb" +msgid "invalid page in block %u of relation %s" +msgstr "pagina non valida nel blocco %u della relazione %s" -#: commands/aggregatecmds.c:166 +#: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "solo gli aggregati su insiemi ordinati possono essere ipotetici" -#: commands/aggregatecmds.c:191 +#: commands/aggregatecmds.c:195 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "attributo dell'aggregato \"%s\" non riconosciuto" -#: commands/aggregatecmds.c:201 +#: commands/aggregatecmds.c:205 #, c-format msgid "aggregate stype must be specified" msgstr "l'attributo stype dell'aggregato deve essere specificato" -#: commands/aggregatecmds.c:205 +#: commands/aggregatecmds.c:209 #, c-format msgid "aggregate sfunc must be specified" msgstr "l'attributo sfunc dell'aggregato deve essere specificato" -#: commands/aggregatecmds.c:217 +#: commands/aggregatecmds.c:221 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "l'attributo msfunc dell'aggregato deve essere specificato quando mstype lo è" -#: commands/aggregatecmds.c:221 +#: commands/aggregatecmds.c:225 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "l'attributo minvfunc dell'aggregato deve essere specificato quando mstype lo è" -#: commands/aggregatecmds.c:228 +#: commands/aggregatecmds.c:232 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "l'attributo msfunc dell'aggregato non deve essere specificato se mstype non lo è" -#: commands/aggregatecmds.c:232 +#: commands/aggregatecmds.c:236 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "l'attributo minvfunc dell'aggregato non deve essere specificato se mstype non lo è" -#: commands/aggregatecmds.c:236 +#: commands/aggregatecmds.c:240 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "l'attributo mfinalfunc dell'aggregato non deve essere specificato se mstype non lo è" -#: commands/aggregatecmds.c:240 +#: commands/aggregatecmds.c:244 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "l'attributo msspace dell'aggregato non deve essere specificato se mstype non lo è" -#: commands/aggregatecmds.c:244 +#: commands/aggregatecmds.c:248 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "l'attributo minitcond dell'aggregato non deve essere specificato se mstype non lo è" -#: commands/aggregatecmds.c:273 +#: commands/aggregatecmds.c:277 #, c-format msgid "aggregate input type must be specified" msgstr "il tipo di input dell'aggregato deve essere specificato" -#: commands/aggregatecmds.c:303 +#: commands/aggregatecmds.c:307 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "il basetype è ridondante se il tipo di input è specificato per un aggregato" -#: commands/aggregatecmds.c:344 commands/aggregatecmds.c:385 +#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "il tipo di dato della transizione dell'aggregato non può essere %s" -#: commands/aggregatecmds.c:356 +#: commands/aggregatecmds.c:362 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "le funzioni di serializzazione possono essere specificate solo quando il tipo di dato di transizione dell'aggregato è %s" -#: commands/aggregatecmds.c:366 +#: commands/aggregatecmds.c:372 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "occorre specificare o entrambe le funzioni di serializzazione e deserializzazione o nessuna" -#: commands/aggregatecmds.c:431 commands/functioncmds.c:604 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "il parametro \"parallel\" deve essere SAFE, RESTRICTED o UNSAFE" -#: commands/aggregatecmds.c:486 +#: commands/aggregatecmds.c:493 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "il parametro \"%s\" deve essere READ_ONLY, SHAREABLE o READ_WRITE" -#: commands/alter.c:84 commands/event_trigger.c:236 +#: commands/alter.c:84 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" msgstr "il trigger di evento \"%s\" esiste già" -#: commands/alter.c:87 commands/foreigncmds.c:595 +#: commands/alter.c:87 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "il wrapper di dati esterni \"%s\" esiste già" -#: commands/alter.c:90 commands/foreigncmds.c:898 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "il server \"%s\" esiste già" -#: commands/alter.c:93 commands/proclang.c:363 +#: commands/alter.c:93 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "il linguaggio \"%s\" esiste già" -#: commands/alter.c:96 commands/publicationcmds.c:176 +#: commands/alter.c:96 commands/publicationcmds.c:771 #, c-format msgid "publication \"%s\" already exists" msgstr "la pubblicazione \"%s\" esiste già" -#: commands/alter.c:99 commands/subscriptioncmds.c:358 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "la sottoscrizione \"%s\" esiste già" @@ -5259,240 +5871,207 @@ msgstr "il modello di ricerca di testo \"%s\" esiste già nello schema \"%s\"" msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "la configurazione di ricerca di testo \"%s\" esiste già nello schema \"%s\"" -#: commands/alter.c:216 +#: commands/alter.c:215 #, c-format msgid "must be superuser to rename %s" msgstr "occorre essere un superutente per rinominare %s" -#: commands/alter.c:713 +#: commands/alter.c:746 #, c-format msgid "must be superuser to set schema of %s" msgstr "occorre essere un superutente per impostare lo schema di %s" -#: commands/amcmds.c:58 +#: commands/amcmds.c:60 #, c-format msgid "permission denied to create access method \"%s\"" msgstr "permesso di creare il metodo di accesso \"%s\" negato" -#: commands/amcmds.c:60 +#: commands/amcmds.c:62 #, c-format msgid "Must be superuser to create an access method." msgstr "Occorre essere un superutente per creare un metodo di accesso." -#: commands/amcmds.c:68 +#: commands/amcmds.c:71 #, c-format msgid "access method \"%s\" already exists" msgstr "il metodo di accesso \"%s\" esiste già" -#: commands/amcmds.c:123 -#, c-format -msgid "must be superuser to drop access methods" -msgstr "occorre essere un superutente per eliminare un metodo di accesso" - -#: commands/amcmds.c:174 commands/indexcmds.c:173 commands/indexcmds.c:583 -#: commands/opclasscmds.c:364 commands/opclasscmds.c:778 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" -msgstr "Il metodo di accesso \"%s\" non esiste" +msgstr "il metodo di accesso \"%s\" non esiste" -#: commands/amcmds.c:250 +#: commands/amcmds.c:243 #, c-format msgid "handler function is not specified" msgstr "funzione handler non specificata" -#: commands/amcmds.c:262 commands/event_trigger.c:245 -#: commands/foreigncmds.c:487 commands/proclang.c:116 commands/proclang.c:285 -#: commands/trigger.c:696 parser/parse_clause.c:990 +#: 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:940 #, c-format msgid "function %s must return type %s" msgstr "la funzione %s deve restituire il tipo %s" -#: commands/analyze.c:187 -#, c-format -msgid "skipping analyze of \"%s\" --- lock not available" -msgstr "analisi di \"%s\" saltata --- lock non disponibile" - -#: commands/analyze.c:192 -#, c-format -msgid "skipping analyze of \"%s\" --- relation no longer exists" -msgstr "analisi di \"%s\" saltata --- la relazione non esiste più" - -#: commands/analyze.c:209 -#, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "\"%s\" saltato --- solo un superutente può analizzarlo" - -#: commands/analyze.c:213 -#, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -msgstr "\"%s\" saltato --- solo un superutente o il proprietario del database possono analizzarlo." - -#: commands/analyze.c:217 -#, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" -msgstr "\"%s\" saltato --- solo il proprietario del database o della tabella possono analizzarlo" - -#: commands/analyze.c:275 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\" saltato --- non è possibile analizzare questa tabella esterna" -#: commands/analyze.c:292 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "\"%s\" saltato --- non è possibile analizzare non-tabelle o le tabelle speciali di sistema" -#: commands/analyze.c:373 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analisi dell'albero di ereditarietà di \"%s.%s\"" -#: commands/analyze.c:378 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analisi di \"%s.%s\"" -#: commands/analyze.c:438 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "la colonna \"%s\" della relazione \"%s\" è specificata più di una volta" -#: commands/analyze.c:718 +#: commands/analyze.c:787 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "analisi automatica della tabella \"%s.%s.%s\" uso del sistema: %s" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "analisi automatica della tabella \"%s.%s.%s\"\n" -#: commands/analyze.c:1273 +#: commands/analyze.c:1334 #, 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\": esaminate %d pagine su %u, contenenti %.0f righe vive e %.0f righe morte; %d righe nel campione, %.0f righe totali stimate" -#: commands/analyze.c:1353 +#: commands/analyze.c:1414 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "analyze dell'albero di ereditarietà \"%s.%s\" saltato --- questo albero non ha tabelle figlie" -#: commands/analyze.c:1451 +#: commands/analyze.c:1512 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "analyze dell'albero di ereditarietà \"%s.%s\" saltato --- questo albero non ha tabelle figlie analizzabili" -#: commands/async.c:558 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" -msgstr "Il nome del canale non può essere vuoto" +msgstr "il nome del canale non può essere vuoto" -#: commands/async.c:563 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "il nome del canale è troppo lungo" -#: commands/async.c:570 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "la stringa del carico è troppo lunga" -#: commands/async.c:756 +#: commands/async.c:876 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "non è possibile eseguire PREPARE in una transazione che ha eseguito LISTEN, UNLISTEN o NOTIFY" -#: commands/async.c:859 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "troppe notifiche nella coda di NOTIFY" -#: commands/async.c:1491 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" -msgstr "la coda di NOTIFY è piena al %.0f%%" +msgstr "La coda di NOTIFY è piena al %.0f%%" -#: commands/async.c:1493 +#: commands/async.c:1604 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Il processo server con PID %d è tra quelli con le transazioni più vecchie." -#: commands/async.c:1496 +#: commands/async.c:1607 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "La coda di NOTIFY non può essere svuotata finché quel processo non avrà terminato la sua transazione corrente." -#: commands/cluster.c:129 commands/cluster.c:372 +#: commands/cluster.c:128 #, c-format -msgid "cannot cluster temporary tables of other sessions" -msgstr "non è possibile raggruppare tabelle temporanee di altre sessioni" +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "opzione CLUSTER non riconosciuta \"%s\"" -#: commands/cluster.c:137 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format -msgid "cannot cluster a partitioned table" -msgstr "non è possibile eseguire CLUSTER su una tabella partizionata" +msgid "cannot cluster temporary tables of other sessions" +msgstr "non è possibile raggruppare tabelle temporanee di altre sessioni" -#: commands/cluster.c:167 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "non esiste un indice già raggruppato per la tabella \"%s\"" -#: commands/cluster.c:181 commands/tablecmds.c:10628 commands/tablecmds.c:12478 +#: commands/cluster.c:190 commands/tablecmds.c:14096 commands/tablecmds.c:15990 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "l'indice \"%s\" per la tabella \"%s\" non esiste" -#: commands/cluster.c:361 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "non è possibile raggruppare un catalogo condiviso" -#: commands/cluster.c:376 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "non è possibile ripulire tabelle temporanee di altre sessioni" -#: commands/cluster.c:439 commands/tablecmds.c:12488 +#: commands/cluster.c:511 commands/tablecmds.c:16000 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" non è un indice per la tabella \"%s\"" -#: commands/cluster.c:447 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "non è possibile raggruppare sull'indice \"%s\" perché il metodo di accesso non supporta il raggruppamento" -#: commands/cluster.c:459 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "non è possibile raggruppare sull'indice parziale \"%s\"" -#: commands/cluster.c:473 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "non è possibile raggruppare sull'indice non valido \"%s\"" -#: commands/cluster.c:497 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "non è possibile marcare un indice come raggruppato in una tabella partizionata" -#: commands/cluster.c:938 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "raggruppamento di \"%s.%s\" usando una scansione sull'indice \"%s\"" -#: commands/cluster.c:944 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "raggruppamento di \"%s.%s\" usando una scansione sequenziale e ordinamento" -#: commands/cluster.c:949 commands/vacuumlazy.c:505 +#: commands/cluster.c:959 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "pulizia di \"%s.%s\"" -#: commands/cluster.c:1106 +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "\"%s\": trovate %.0f versioni di riga removibili, %.0f non removibili in %u pagine" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%s.%s\": trovate versioni di riga %.0f rimovibili, %.0f non rimovibili nelle pagine %u" -#: commands/cluster.c:1110 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -5501,1770 +6080,1940 @@ msgstr "" "%.0f versioni di riga morte non possono ancora essere rimosse.\n" "%s." -#: commands/collationcmds.c:100 +#: commands/collationcmds.c:106 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "attributo dell'ordinamento \"%s\" non riconosciuto" -#: commands/collationcmds.c:142 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 commands/define.c:356 commands/tablecmds.c:7768 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:1001 replication/walsender.c:1023 replication/walsender.c:1033 +#, c-format +msgid "conflicting or redundant options" +msgstr "opzioni contraddittorie o ridondanti" + +#: commands/collationcmds.c:120 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LOCALE non può essere specificato insieme a LC_COLLATE o LC_CTYPE." + +#: commands/collationcmds.c:126 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROM non può essere specificato insieme ad altre opzioni." + +#: commands/collationcmds.c:174 #, c-format msgid "collation \"default\" cannot be copied" msgstr "l'ordinamento \"default\" non può essere copiato" -#: commands/collationcmds.c:172 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "fornitore di ordinamenti non riconosciuto: %s" -#: commands/collationcmds.c:181 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "il parametro \"lc_collate\" deve essere specificato" -#: commands/collationcmds.c:186 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "il parametro \"lc_ctype\" deve essere specificato" -#: commands/collationcmds.c:245 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "è necessario specificare il parametro \"locale\"" + +#: commands/collationcmds.c:256 +#, c-format +msgid "nondeterministic collations not supported with this provider" +msgstr "regole di confronto non deterministiche non supportate con questo provider" + +#: commands/collationcmds.c:275 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "la codifica del database corrente non è supportata con questo provider" + +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "l'ordinamento \"%s\" per la codifica \"%s\" già esiste nello schema \"%s\"" -#: commands/collationcmds.c:256 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "l'ordinamento \"%s\" già esiste nello schema \"%s\"" -#: commands/collationcmds.c:304 +#: commands/collationcmds.c:395 commands/dbcommands.c:2398 #, c-format msgid "changing version from %s to %s" msgstr "cambio della versione da %s a %s" -#: commands/collationcmds.c:319 +#: commands/collationcmds.c:410 commands/dbcommands.c:2411 #, c-format msgid "version has not changed" msgstr "la versione non è cambiata" -#: commands/collationcmds.c:450 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "conversione del nome di locale \"%s\" in tag di linguaggio fallita: %s" -#: commands/collationcmds.c:511 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "solo un superutente può importare gli ordinamenti di sistema" -#: commands/collationcmds.c:534 commands/copy.c:1826 commands/copy.c:3131 -#: libpq/be-secure-common.c:80 +#: 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 "esecuzione del comando \"%s\" fallita: %m" -#: commands/collationcmds.c:665 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "non è stato trovato nessun locale di sistema utilizzabile" -#: commands/comment.c:61 commands/dbcommands.c:808 commands/dbcommands.c:996 -#: commands/dbcommands.c:1100 commands/dbcommands.c:1290 -#: commands/dbcommands.c:1513 commands/dbcommands.c:1627 -#: commands/dbcommands.c:2043 utils/init/postinit.c:853 -#: utils/init/postinit.c:958 utils/init/postinit.c:975 +#: commands/comment.c:61 commands/dbcommands.c:1538 commands/dbcommands.c:1735 commands/dbcommands.c:1848 commands/dbcommands.c:2042 commands/dbcommands.c:2284 commands/dbcommands.c:2371 commands/dbcommands.c:2481 commands/dbcommands.c:2980 utils/init/postinit.c:943 utils/init/postinit.c:1048 utils/init/postinit.c:1065 #, c-format msgid "database \"%s\" does not exist" msgstr "il database \"%s\" non esiste" -#: commands/comment.c:101 commands/seclabel.c:117 parser/parse_utilcmd.c:925 +#: commands/comment.c:101 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -msgstr "\"%s\" non è una tabella, vista, vista materializzata, tipo composito né una tabella esterna" +msgid "cannot set comment on relation \"%s\"" +msgstr "impossibile impostare un commento sulla relazione \"%s\"" -#: commands/constraint.c:60 utils/adt/ri_triggers.c:2256 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "la funzione \"%s\" non è stata invocata dal trigger manager" -#: commands/constraint.c:67 utils/adt/ri_triggers.c:2265 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "la funzione \"%s\" deve essere eseguita AFTER ROW" -#: commands/constraint.c:81 +#: commands/constraint.c:84 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "la funzione \"%s\" deve essere eseguita per un INSERT o un UPDATE" -#: commands/conversioncmds.c:65 +#: commands/conversioncmds.c:67 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "la codifica di partenza \"%s\" non esiste" -#: commands/conversioncmds.c:72 +#: commands/conversioncmds.c:74 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "la codifica di destinazione \"%s\" non esiste" -#: commands/conversioncmds.c:86 -#, c-format -msgid "encoding conversion function %s must return type %s" -msgstr "la funzione di conversione della codifica %s deve restituire il tipo %s" - -#: commands/copy.c:372 commands/copy.c:406 -#, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "COPY BINARY non è supportato verso stdout o da stdin" - -#: commands/copy.c:506 -#, c-format -msgid "could not write to COPY program: %m" -msgstr "scrittura nel programma COPY fallita: %m" - -#: commands/copy.c:511 -#, c-format -msgid "could not write to COPY file: %m" -msgstr "scrittura nel file COPY fallita: %m" - -#: commands/copy.c:524 +#: commands/conversioncmds.c:87 #, c-format -msgid "connection lost during COPY to stdout" -msgstr "connessione persa durante COPY verso stdout" +msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" +msgstr "la conversione della codifica in o da \"SQL_ASCII\" non è supportata" -#: commands/copy.c:568 +#: commands/conversioncmds.c:100 #, c-format -msgid "could not read from COPY file: %m" -msgstr "lettura dal file COPY fallita: %m" - -#: commands/copy.c:584 commands/copy.c:605 commands/copy.c:609 -#: tcop/postgres.c:348 tcop/postgres.c:384 tcop/postgres.c:411 -#, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "fine-file inaspettato sulla connessione del client con una transazione aperta" - -#: commands/copy.c:622 -#, c-format -msgid "COPY from stdin failed: %s" -msgstr "COPY da stdin fallita: %s" +msgid "encoding conversion function %s must return type %s" +msgstr "la funzione di conversione della codifica %s deve restituire il tipo %s" -#: commands/copy.c:638 +#: commands/conversioncmds.c:130 #, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "messaggio del tipo inaspettato 0x%02X durante COPY da stdin" +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "la funzione di conversione della codifica %s ha restituito un risultato errato per l'input vuoto" -#: commands/copy.c:804 +#: 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 "occorre essere un superutente o membro del ruolo pg_execute_server_program per effettuare COPY da o verso un programma esterno" +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" +msgstr "deve essere superutente o disporre dei privilegi del ruolo pg_execute_server_program per COPIA da o verso un programma esterno" -#: commands/copy.c:805 commands/copy.c:814 commands/copy.c:821 +#: 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 "Chiunque può eseguire COPY verso stdout e da stdin. Anche il comando \\copy di psql funziona per chiunque." -#: commands/copy.c:813 +#: 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 "bisogna essere un superutente o membro del ruolo pg_read_server_files per eseguire COPY da un file" +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "deve essere superutente o disporre dei privilegi del ruolo pg_read_server_files per COPIA da un file" -#: commands/copy.c:820 +#: 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 "bisogna essere un superutente o membro del ruolo pg_write_server_files per eseguire COPY in un file" +msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgstr "deve essere superutente o disporre dei privilegi del ruolo pg_write_server_files per COPIA su un file" -#: commands/copy.c:883 +#: commands/copy.c:188 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM non supportato con il livello di sicurezza di righe" -#: commands/copy.c:884 +#: commands/copy.c:189 #, c-format msgid "Use INSERT statements instead." msgstr "Usa istruzioni INSERT invece." -#: commands/copy.c:1069 +#: commands/copy.c:280 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "MERGE non supportato in COPY" + +#: commands/copy.c:373 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "non è possibile utilizzare \"%s\" con HEADER in COPY TO" + +#: commands/copy.c:382 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s richiede un valore booleano o \"corrispondenza\"" + +#: commands/copy.c:441 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "Formato di COPY \"%s\" non riconosciuto" -#: commands/copy.c:1149 commands/copy.c:1165 commands/copy.c:1180 -#: commands/copy.c:1202 +#: commands/copy.c:493 commands/copy.c:506 commands/copy.c:519 commands/copy.c:538 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "l'argomento dell'opzione \"%s\" dev'essere una lista di nomi di colonne" -#: commands/copy.c:1217 +#: commands/copy.c:550 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "l'argomento dell'opzione \"%s\" dev'essere un nome di codifica valido" -#: commands/copy.c:1224 commands/dbcommands.c:242 commands/dbcommands.c:1461 +#: commands/copy.c:557 commands/dbcommands.c:849 commands/dbcommands.c:2232 #, c-format msgid "option \"%s\" not recognized" msgstr "opzione \"%s\" non riconosciuta" -#: commands/copy.c:1236 +#: commands/copy.c:569 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "non è possibile specificare DELIMITER in BINARY mode" -#: commands/copy.c:1241 +#: commands/copy.c:574 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "non è possibile specificare NULL in BINARY mode" -#: commands/copy.c:1263 +#: commands/copy.c:596 #, c-format msgid "COPY delimiter must be a single one-byte character" -msgstr "il delimitatore di COPY deve essere un solo carattere di un solo byte" +msgstr "Il delimitatore di COPY deve essere un solo carattere di un solo byte" -#: commands/copy.c:1270 +#: commands/copy.c:603 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "Il delimitatore di COPY non può essere una \"nuova riga\" o un \"ritorno carrello\"" -#: commands/copy.c:1276 +#: commands/copy.c:609 #, c-format msgid "COPY null representation cannot use newline or carriage return" -msgstr "la rappresentazione dei null in COPY non può usare \"nuova riga\" o \"ritorno carrello\"" +msgstr "La rappresentazione dei null in COPY non può usare caratteri \"nuova riga\" o \"ritorno a capo\"" -#: commands/copy.c:1293 +#: commands/copy.c:626 #, c-format msgid "COPY delimiter cannot be \"%s\"" -msgstr "il delimitatore di COPY non può essere \"%s\"" +msgstr "Il delimitatore di COPY non può essere \"%s\"" -#: commands/copy.c:1299 +#: commands/copy.c:632 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "l'HEADER di COPY è disponibile solo in modalità CSV" +msgid "cannot specify HEADER in BINARY mode" +msgstr "non è possibile specificare HEADER in modalità BINARY" -#: commands/copy.c:1305 +#: commands/copy.c:638 #, c-format msgid "COPY quote available only in CSV mode" -msgstr "il quoting di COPY è disponibile solo in modalità CSV" +msgstr "Il quoting di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1310 +#: commands/copy.c:643 #, c-format msgid "COPY quote must be a single one-byte character" -msgstr "il quote di COPY dev'essere un solo carattere di un byte" +msgstr "Il quote di COPY dev'essere un solo carattere di un byte" -#: commands/copy.c:1315 +#: commands/copy.c:648 #, c-format msgid "COPY delimiter and quote must be different" -msgstr "il delimitatore e il quote di COPY devono essere diversi" +msgstr "Il delimitatore e il quote di COPY devono essere diversi" -#: commands/copy.c:1321 +#: commands/copy.c:654 #, c-format msgid "COPY escape available only in CSV mode" -msgstr "l'escape di COPY è disponibile solo in modalità CSV" +msgstr "L'escape di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1326 +#: commands/copy.c:659 #, c-format msgid "COPY escape must be a single one-byte character" -msgstr "l'escape di COPY deve essere un solo carattere di un byte" +msgstr "L'escape di COPY deve essere un solo carattere di un byte" -#: commands/copy.c:1332 +#: commands/copy.c:665 #, c-format msgid "COPY force quote available only in CSV mode" -msgstr "il \"force quote\" di COPY è disponibile solo in modalità CSV" +msgstr "Il \"force quote\" di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1336 +#: commands/copy.c:669 #, c-format msgid "COPY force quote only available using COPY TO" -msgstr "il \"force quote\" di COPY è disponibile solo in modalità CSV" +msgstr "Il \"force quote\" di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1342 +#: commands/copy.c:675 #, c-format msgid "COPY force not null available only in CSV mode" -msgstr "il \"force not null\" di COPY è disponibile solo in modalità CSV" +msgstr "Il \"force not null\" di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1346 +#: commands/copy.c:679 #, c-format msgid "COPY force not null only available using COPY FROM" -msgstr "il \"force not null\" di COPY è disponibile solo in COPY FROM" +msgstr "Il \"force not null\" di COPY è disponibile solo in COPY FROM" -#: commands/copy.c:1352 +#: commands/copy.c:685 #, c-format msgid "COPY force null available only in CSV mode" -msgstr "il \"force null\" di COPY è disponibile solo in modalità CSV" +msgstr "Il \"force null\" di COPY è disponibile solo in modalità CSV" -#: commands/copy.c:1357 +#: commands/copy.c:690 #, c-format msgid "COPY force null only available using COPY FROM" -msgstr "il \"force null\" di COPY è disponibile solo usando COPY FROM" +msgstr "Il \"force null\" di COPY è disponibile solo usando COPY FROM" -#: commands/copy.c:1363 +#: commands/copy.c:696 #, c-format msgid "COPY delimiter must not appear in the NULL specification" -msgstr "il delimitatore di COPY non deve apparire nella specificazione di NULL" +msgstr "Il delimitatore di COPY non deve apparire nella specificazione di NULL" -#: commands/copy.c:1370 +#: commands/copy.c:703 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "Il carattere quote del CSV non deve apparire nella specificazione di NULL" -#: commands/copy.c:1431 +#: commands/copy.c:764 #, c-format -msgid "table \"%s\" does not have OIDs" -msgstr "la tabella \"%s\" non ha OID" +msgid "column \"%s\" is a generated column" +msgstr "la colonna \"%s\" è una colonna generata" -#: commands/copy.c:1448 +#: commands/copy.c:766 #, c-format -msgid "COPY (query) WITH OIDS is not supported" -msgstr "COPY (query) WITH OIDS non è supportata" +msgid "Generated columns cannot be used in COPY." +msgstr "Le colonne generate non possono essere utilizzate in COPY." -#: commands/copy.c:1469 +#: commands/copy.c:781 commands/indexcmds.c:1833 commands/statscmds.c:243 commands/tablecmds.c:2379 commands/tablecmds.c:3035 commands/tablecmds.c:3529 parser/parse_relation.c:3655 parser/parse_relation.c:3675 utils/adt/tsvector_op.c:2685 #, c-format -msgid "DO INSTEAD NOTHING rules are not supported for COPY" -msgstr "le regole DO INSTEAD NOTHING non sono supportate per COPY" +msgid "column \"%s\" does not exist" +msgstr "la colonna \"%s\" non esiste" -#: commands/copy.c:1483 +#: commands/copy.c:788 commands/tablecmds.c:2405 commands/trigger.c:967 parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format -msgid "conditional DO INSTEAD rules are not supported for COPY" -msgstr "le regole DO INSTEAD condizionali non sono supportate per COPY" +msgid "column \"%s\" specified more than once" +msgstr "la colonna \"%s\" è stata specificata più di una volta" -#: commands/copy.c:1487 +#: commands/copyfrom.c:123 #, c-format -msgid "DO ALSO rules are not supported for the COPY" -msgstr "le regole DO ALSO non sono supportate per COPY" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, riga %llu, colonna %s" -#: commands/copy.c:1492 +#: commands/copyfrom.c:128 commands/copyfrom.c:174 #, c-format -msgid "multi-statement DO INSTEAD rules are not supported for COPY" -msgstr "le regole DO INSTEAD con più istruzioni non sono supportate per COPY" +msgid "COPY %s, line %llu" +msgstr "COPY %s, riga %llu" -#: commands/copy.c:1502 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO) non è supportata" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, riga %llu, colonna %s: \"%s\"" -#: commands/copy.c:1519 +#: commands/copyfrom.c:150 #, c-format -msgid "COPY query must have a RETURNING clause" -msgstr "la query COPY deve avere una clausola RETURNING" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, riga %llu, colonna %s: input nullo" -#: commands/copy.c:1547 +#: commands/copyfrom.c:167 #, c-format -msgid "relation referenced by COPY statement has changed" -msgstr "la relazione referenziata dall'istruzione COPY è cambiata" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, riga %llu: \"%s\"" -#: commands/copy.c:1606 +#: commands/copyfrom.c:569 #, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "la colonna FORCE_QUOTE \"%s\" non è referenziata da COPY" +msgid "cannot copy to view \"%s\"" +msgstr "non è possibile copiare verso la vista \"%s\"" -#: commands/copy.c:1629 +#: commands/copyfrom.c:571 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "la colonna FORCE_NOT_NULL \"%s\" non è referenziata da COPY" +msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." +msgstr "Per consentire la copia in una vista occorre fornire un trigger INSTEAD OF INSERT." -#: commands/copy.c:1652 +#: commands/copyfrom.c:575 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "la colonna FORCE_NULL \"%s\" non è referenziata da COPY" +msgid "cannot copy to materialized view \"%s\"" +msgstr "non è possibile copiare verso la vista materializzata \"%s\"" -#: commands/copy.c:1718 libpq/be-secure-common.c:102 +#: commands/copyfrom.c:580 #, c-format -msgid "could not close pipe to external command: %m" -msgstr "chiusura della pipe per verso il comando esterno fallita: %m" +msgid "cannot copy to sequence \"%s\"" +msgstr "non è possibile copiare verso sequenza \"%s\"" -#: commands/copy.c:1722 +#: commands/copyfrom.c:585 #, c-format -msgid "program \"%s\" failed" -msgstr "programma \"%s\" fallito" +msgid "cannot copy to non-table relation \"%s\"" +msgstr "non è possibile copiare verso la relazione \"%s\" perché non è una tabella" -#: commands/copy.c:1772 +#: commands/copyfrom.c:625 #, c-format -msgid "cannot copy from view \"%s\"" -msgstr "non è possibile copiare dalla vista \"%s\"" +msgid "cannot perform COPY FREEZE on a partitioned table" +msgstr "impossibile eseguire COPY FREEZE su una tabella partizionata" -#: commands/copy.c:1774 commands/copy.c:1780 commands/copy.c:1786 -#: commands/copy.c:1797 +#: commands/copyfrom.c:640 #, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "Prova la variante COPY (SELECT ...) TO." +msgid "cannot perform COPY FREEZE because of prior transaction activity" +msgstr "non è in grado di eseguire COPY FREEZE a causa di precedenti attività di transazione" -#: commands/copy.c:1778 +#: commands/copyfrom.c:646 #, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "non è possibile copiare dalla vista materializzata \"%s\"" +msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" +msgstr "impossibile eseguire COPY FREEZE perché la tabella non è stata creata o troncata nella sottotransazione corrente" -#: commands/copy.c:1784 +#: commands/copyfrom.c:1267 commands/copyto.c:611 #, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "non è possibile copiare dalla tabella esterna \"%s\"" +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "La colonna FORCE_NOT_NULL \"%s\" non è referenziata da COPY" -#: commands/copy.c:1790 +#: commands/copyfrom.c:1290 commands/copyto.c:634 #, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "non è possibile copiare dalla sequenza \"%s\"" +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "La colonna FORCE_NULL \"%s\" non è referenziata da COPY" -#: commands/copy.c:1795 +#: commands/copyfrom.c:1518 #, c-format -msgid "cannot copy from partitioned table \"%s\"" -msgstr "non è possibile copiare dalla tabella partizionata \"%s\"" +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 fa leggere un file dal processo server PostgreSQL. Probabilmente ti serve un sistema lato client, per esempio il comando \\copy di psql." -#: commands/copy.c:1801 +#: commands/copyfrom.c:1531 commands/copyto.c:731 #, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "non è possibile copiare dalla relazione \"%s\" perché non è una tabella" +msgid "\"%s\" is a directory" +msgstr "\"%s\" è una directory" -#: commands/copy.c:1841 +#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 #, c-format -msgid "relative path not allowed for COPY to file" -msgstr "i percorsi relativi non sono consentiti per il COPY verso un file" +msgid "could not close pipe to external command: %m" +msgstr "chiusura della pipe per verso il comando esterno fallita: %m" -#: commands/copy.c:1862 +#: commands/copyfrom.c:1614 commands/copyto.c:306 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "apertura del file \"%s\" in scrittura fallita: %m" +msgid "program \"%s\" failed" +msgstr "programma \"%s\" fallito" -#: commands/copy.c:1865 +#: commands/copyfromparse.c:200 #, 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 fa scrivere un file al processo server PostgreSQL. Probabilmente ti serve un sistema lato client, per esempio il comando \\copy di psql." +msgid "COPY file signature not recognized" +msgstr "Formato del file COPY non riconosciuto" -#: commands/copy.c:1878 commands/copy.c:3162 +#: commands/copyfromparse.c:205 #, c-format -msgid "\"%s\" is a directory" -msgstr "\"%s\" è una directory" +msgid "invalid COPY file header (missing flags)" +msgstr "intestazione del file COPY non valida (flag mancanti)" -#: commands/copy.c:2204 +#: commands/copyfromparse.c:209 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, linea %s, colonna %s" +msgid "invalid COPY file header (WITH OIDS)" +msgstr "intestazione del file COPY non valida (CON OIDS)" -#: commands/copy.c:2208 commands/copy.c:2255 +#: commands/copyfromparse.c:214 #, c-format -msgid "COPY %s, line %s" -msgstr "COPY %s, linea %s" +msgid "unrecognized critical flags in COPY file header" +msgstr "alcune flag critici non sono stati riconosciuti nell'intestazione del file COPY" -#: commands/copy.c:2219 +#: commands/copyfromparse.c:220 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, linea %s, colonna %s: \"%s\"" +msgid "invalid COPY file header (missing length)" +msgstr "intestazione del file COPY non valida (manca la lunghezza)" -#: commands/copy.c:2227 +#: commands/copyfromparse.c:227 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, linea %s, colonna %s: input null" - -#: commands/copy.c:2249 -#, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, linea %s, \"%s\"" - -#: commands/copy.c:2345 -#, c-format -msgid "cannot copy to view \"%s\"" -msgstr "non è possibile copiare verso la vista \"%s\"" - -#: commands/copy.c:2347 -#, c-format -msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." -msgstr "Per consentire la copia in una vista occorre fornire un trigger INSTEAD OF INSERT." - -#: commands/copy.c:2351 -#, c-format -msgid "cannot copy to materialized view \"%s\"" -msgstr "non è possibile copiare verso la vista materializzata \"%s\"" - -#: commands/copy.c:2356 -#, c-format -msgid "cannot copy to sequence \"%s\"" -msgstr "non è possibile copiare verso sequenza \"%s\"" - -#: commands/copy.c:2361 -#, c-format -msgid "cannot copy to non-table relation \"%s\"" -msgstr "non è possibile copiare verso la relazione \"%s\" perché non è una tabella" - -#: commands/copy.c:2436 -#, c-format -msgid "cannot perform FREEZE because of prior transaction activity" -msgstr "non è possibile eseguire FREEZE a causa di precedente attività della transazione" +msgid "invalid COPY file header (wrong length)" +msgstr "intestazione del file COPY non valida (lunghezza errata)" -#: commands/copy.c:2442 +#: commands/copyfromparse.c:256 #, c-format -msgid "cannot perform FREEZE because the table was not created or truncated in the current subtransaction" -msgstr "non è possibile eseguire FREEZE perché la tabella non è stata creata o troncata nella sottotransazione corrente" +msgid "could not read from COPY file: %m" +msgstr "lettura dal file COPY fallita: %m" -#: commands/copy.c:3149 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 tcop/postgres.c:358 #, 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 TO fa leggere un file dal processo server PostgreSQL. Probabilmente ti serve un sistema lato client, per esempio il comando \\copy di psql." +msgid "unexpected EOF on client connection with an open transaction" +msgstr "fine-file inaspettato sulla connessione del client con una transazione aperta" -#: commands/copy.c:3182 +#: commands/copyfromparse.c:294 #, c-format -msgid "COPY file signature not recognized" -msgstr "formato del file COPY non riconosciuto" +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "messaggio del tipo inaspettato 0x%02X durante COPY da stdin" -#: commands/copy.c:3187 +#: commands/copyfromparse.c:317 #, c-format -msgid "invalid COPY file header (missing flags)" -msgstr "intestazione del file COPY non valida (flag mancanti)" +msgid "COPY from stdin failed: %s" +msgstr "COPY da stdin fallita: %s" -#: commands/copy.c:3193 +#: commands/copyfromparse.c:785 #, c-format -msgid "unrecognized critical flags in COPY file header" -msgstr "alcune flag critici non sono stati riconosciuti nell'intestazione del file COPY" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "numero errato di campi nella riga di intestazione: ottenuto %d, previsto %d" -#: commands/copy.c:3199 +#: commands/copyfromparse.c:801 #, c-format -msgid "invalid COPY file header (missing length)" -msgstr "intestazione del file COPY non valida (manca la lunghezza)" +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "nome della colonna non corrispondente nel campo della riga di intestazione %d: ottenuto un valore null (\"%s\"), previsto \"%s\"" -#: commands/copy.c:3206 +#: commands/copyfromparse.c:808 #, c-format -msgid "invalid COPY file header (wrong length)" -msgstr "intestazione del file COPY non valida (lunghezza errata)" +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "nome della colonna non corrispondente nel campo della riga di intestazione %d: ottenuto \"%s\", previsto \"%s\"" -#: commands/copy.c:3337 commands/copy.c:4046 commands/copy.c:4276 +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "ci sono dati in eccesso dopo l'ultima colonna attesa" -#: commands/copy.c:3347 -#, c-format -msgid "missing data for OID column" -msgstr "dati per la colonna OID mancanti" - -#: commands/copy.c:3353 -#, c-format -msgid "null OID in COPY data" -msgstr "OID nullo nei dati da COPY" - -#: commands/copy.c:3363 commands/copy.c:3487 -#, c-format -msgid "invalid OID in COPY data" -msgstr "OID non valido nei dati da COPY" - -#: commands/copy.c:3379 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "dati mancanti per la colonna \"%s\"" -#: commands/copy.c:3462 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "dati da copiare ricevuti dopo il segnalatore di fine file" -#: commands/copy.c:3469 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "il numero di campi è %d, ne erano attesi %d" -#: commands/copy.c:3810 commands/copy.c:3827 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "\"ritorno carrello\" trovato nei dati" -#: commands/copy.c:3811 commands/copy.c:3828 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "\"ritorno carrello\" non quotato trovato nei dati" -#: commands/copy.c:3813 commands/copy.c:3830 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Usa \"\\r\" per rappresentare i caratteri \"ritorno carrello\"." -#: commands/copy.c:3814 commands/copy.c:3831 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Usa un campo CSV quotato per rappresentare i caratteri \"ritorno carrello\"." -#: commands/copy.c:3843 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "\"nuova riga\" letterale trovato nei dati" -#: commands/copy.c:3844 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "\"nuova riga\" non quotato trovato nei dati" -#: commands/copy.c:3846 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Usa \"\\n\" per rappresentare i caratteri \"nuova riga\"." -#: commands/copy.c:3847 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Usa un campo CSV quotato per rappresentare i caratteri \"nuova riga\"." -#: commands/copy.c:3893 commands/copy.c:3929 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "il marcatore di fine copia non combacia con il precedente stile \"nuova riga\"" -#: commands/copy.c:3902 commands/copy.c:3918 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "il marcatore di fine copia è corrotto" -#: commands/copy.c:4360 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "campo CSV tra virgolette non terminato" -#: commands/copy.c:4437 commands/copy.c:4456 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "fine file inattesa dei dati da COPY" -#: commands/copy.c:4446 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "dimensione del campo non valida" -#: commands/copy.c:4469 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "formato di dati binari non corretto" -#: commands/copy.c:4781 commands/indexcmds.c:1463 commands/statscmds.c:206 -#: commands/tablecmds.c:1897 commands/tablecmds.c:2413 -#: commands/tablecmds.c:2824 parser/parse_relation.c:3288 -#: parser/parse_relation.c:3308 utils/adt/tsvector_op.c:2561 +#: commands/copyto.c:234 #, c-format -msgid "column \"%s\" does not exist" -msgstr "la colonna \"%s\" non esiste" +msgid "could not write to COPY program: %m" +msgstr "scrittura nel programma COPY fallita: %m" -#: commands/copy.c:4788 commands/tablecmds.c:1923 commands/tablecmds.c:2439 -#: commands/trigger.c:913 parser/parse_target.c:1040 parser/parse_target.c:1051 +#: commands/copyto.c:239 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "la colonna \"%s\" è stata specificata più di una volta" +msgid "could not write to COPY file: %m" +msgstr "scrittura nel file COPY fallita: %m" + +#: commands/copyto.c:369 +#, c-format +msgid "cannot copy from view \"%s\"" +msgstr "non è possibile copiare dalla vista \"%s\"" + +#: 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 "Prova la variante COPY (SELECT ...) TO." + +#: commands/copyto.c:375 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "non è possibile copiare dalla vista materializzata \"%s\"" + +#: commands/copyto.c:381 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "non è possibile copiare dalla tabella esterna \"%s\"" + +#: commands/copyto.c:387 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "non è possibile copiare dalla sequenza \"%s\"" + +#: commands/copyto.c:392 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "non è possibile copiare dalla tabella partizionata \"%s\"" + +#: commands/copyto.c:398 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "non è possibile copiare dalla relazione \"%s\" perché non è una tabella" + +#: commands/copyto.c:450 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "Le regole DO INSTEAD NOTHING non sono supportate per COPY" + +#: commands/copyto.c:464 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "le regole DO INSTEAD condizionali non sono supportate per COPY" + +#: commands/copyto.c:468 +#, c-format +msgid "DO ALSO rules are not supported for the COPY" +msgstr "le regole DO ALSO non sono supportate per COPY" + +#: commands/copyto.c:473 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "le regole DO INSTEAD con più istruzioni non sono supportate per COPY" + +#: commands/copyto.c:483 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) non è supportata" + +#: commands/copyto.c:500 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "la query COPY deve avere una clausola RETURNING" + +#: commands/copyto.c:529 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "la relazione referenziata dall'istruzione COPY è cambiata" + +#: commands/copyto.c:588 +#, c-format +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "la colonna FORCE_QUOTE \"%s\" non è referenziata da COPY" + +#: commands/copyto.c:696 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "i percorsi relativi non sono consentiti per il COPY verso un file" + +#: commands/copyto.c:715 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "apertura del file \"%s\" in scrittura fallita: %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 fa scrivere un file al processo server PostgreSQL. Probabilmente ti serve un sistema lato client, per esempio il comando \\copy di psql." -#: commands/createas.c:213 commands/createas.c:509 +#: commands/createas.c:215 commands/createas.c:523 #, c-format msgid "too many column names were specified" msgstr "troppi nomi di colonne specificati" -#: commands/createas.c:550 +#: commands/createas.c:546 #, c-format msgid "policies not yet implemented for this command" msgstr "regole di sicurezza non ancora implementate per questo comando" -#: commands/dbcommands.c:235 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION non è più supportato" -#: commands/dbcommands.c:236 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Puoi prendere in considerazione l'uso dei tablespace." -#: commands/dbcommands.c:262 utils/adt/ascii.c:145 +#: commands/dbcommands.c:838 +#, c-format +msgid "OIDs less than %u are reserved for system objects" +msgstr "Gli OID inferiori a %u sono riservati per gli oggetti di sistema" + +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d non è un codice di codifica valido" -#: commands/dbcommands.c:273 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s non è un nome di codifica valido" -#: commands/dbcommands.c:292 commands/dbcommands.c:1494 commands/user.c:276 -#: commands/user.c:664 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "provider locale non riconosciuto: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2265 commands/user.c:237 commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "limite di connessioni non valido: %d" -#: commands/dbcommands.c:311 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "permesso di creare il database negato" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "il modello di database \"%s\" non esiste" -#: commands/dbcommands.c:346 +#: commands/dbcommands.c:977 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "permesso di copiare il database \"%s\" negato" -#: commands/dbcommands.c:362 +#: commands/dbcommands.c:994 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "strategia di creazione database \"%s\" non valida" + +#: commands/dbcommands.c:995 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Le strategie valide sono \"wal_log\" e \"file_copy\"." + +#: commands/dbcommands.c:1014 #, c-format msgid "invalid server encoding %d" msgstr "codifica del server non valida: %d" -#: commands/dbcommands.c:368 commands/dbcommands.c:373 +#: commands/dbcommands.c:1020 commands/dbcommands.c:1025 #, c-format msgid "invalid locale name: \"%s\"" msgstr "nome locale non valido \"%s\"" -#: commands/dbcommands.c:393 +#: commands/dbcommands.c:1035 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "la codifica \"%s\" non è supportata con il provider di terapia intensiva" + +#: commands/dbcommands.c:1045 +#, c-format +msgid "ICU locale must be specified" +msgstr "È necessario specificare la lingua dell'ICU" + +#: commands/dbcommands.c:1054 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "La locale ICU non può essere specificata a meno che il provider della locale non sia ICU" + +#: commands/dbcommands.c:1072 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "la nuova codifica (%s) è incompatibile con la codifica del modello di database (%s)" -#: commands/dbcommands.c:396 +#: commands/dbcommands.c:1075 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Usa la stessa codifica del modello di database, o usa template0 come modello." -#: commands/dbcommands.c:401 +#: commands/dbcommands.c:1080 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "il nuovo ordinamento (%s) non è compatibile con l'ordinamento del modello del database (%s)" -#: commands/dbcommands.c:403 +#: commands/dbcommands.c:1082 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Usa lo stesso ordinamento del modello di database, o usa template0 come modello." -#: commands/dbcommands.c:408 +#: commands/dbcommands.c:1087 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "il nuovo LC_CTYPE (%s) è incompatibile con l'LC_CTYPE del modello del database (%s)" -#: commands/dbcommands.c:410 +#: commands/dbcommands.c:1089 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "Usa lo stesso LC_CTYPE del modello di database, o usa template0 come modello." -#: commands/dbcommands.c:432 commands/dbcommands.c:1146 +#: commands/dbcommands.c:1094 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "il nuovo provider delle impostazioni locali (%s) non corrisponde al provider delle impostazioni locali del database del modello (%s)" + +#: commands/dbcommands.c:1096 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "Utilizzare lo stesso provider di impostazioni locali del database dei modelli oppure utilizzare template0 come modello." + +#: commands/dbcommands.c:1105 +#, c-format +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "la nuova locale ICU (%s) non è compatibile con la locale ICU del database modello (%s)" + +#: commands/dbcommands.c:1107 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "Utilizzare la stessa locale ICU del database dei modelli oppure utilizzare il modello0 come modello." + +#: commands/dbcommands.c:1130 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "il database modello \"%s\" ha una versione di confronto, ma non è stato possibile determinare la versione effettiva" + +#: commands/dbcommands.c:1135 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "il database del modello \"%s\" presenta una mancata corrispondenza della versione delle regole di confronto" + +#: commands/dbcommands.c:1137 +#, c-format +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "Il database del modello è stato creato utilizzando la versione di confronto %s, ma il sistema operativo fornisce la versione %s." + +#: commands/dbcommands.c:1140 +#, 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 "Ricostruisci tutti gli oggetti nel database dei modelli che utilizzano le regole di confronto predefinite ed eseguono ALTER DATABASE %s REFRESH COLLATION VERSION, oppure compila PostgreSQL con la versione della libreria corretta." + +#: commands/dbcommands.c:1176 commands/dbcommands.c:1894 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global non può essere usato come tablespace predefinito" -#: commands/dbcommands.c:458 +#: commands/dbcommands.c:1202 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "non è possibile assegnare il nuovo tablespace predefinito \"%s\"" -#: commands/dbcommands.c:460 +#: commands/dbcommands.c:1204 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "C'è un conflitto perché il database \"%s\" ha già alcune tabelle in questo tablespace." -#: commands/dbcommands.c:480 commands/dbcommands.c:1016 +#: commands/dbcommands.c:1234 commands/dbcommands.c:1764 #, c-format msgid "database \"%s\" already exists" msgstr "il database \"%s\" esiste già" -#: commands/dbcommands.c:494 +#: commands/dbcommands.c:1248 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "il database sorgente \"%s\" ha attualmente altri utenti collegati" -#: commands/dbcommands.c:736 commands/dbcommands.c:751 +#: commands/dbcommands.c:1270 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "l'OID del database %u è già utilizzato dal database \"%s\"" + +#: commands/dbcommands.c:1276 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "esiste già una directory dati con l'OID specificato %u" + +#: commands/dbcommands.c:1447 commands/dbcommands.c:1462 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "la codifica \"%s\" non corrisponde al locale \"%s\"" -#: commands/dbcommands.c:739 +#: commands/dbcommands.c:1450 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "L'impostazione LC_CTYPE scelta richiede la codifica \"%s\"." -#: commands/dbcommands.c:754 +#: commands/dbcommands.c:1465 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "L'impostazione LC_COLLATE scelta richiede la codifica \"%s\"." -#: commands/dbcommands.c:815 +#: commands/dbcommands.c:1545 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "il database \"%s\" non esiste, saltato" -#: commands/dbcommands.c:839 +#: commands/dbcommands.c:1569 #, c-format msgid "cannot drop a template database" msgstr "non è possibile eliminare un modello di database" -#: commands/dbcommands.c:845 +#: commands/dbcommands.c:1575 #, c-format msgid "cannot drop the currently open database" msgstr "non si può eliminare il database aperto attualmente" -#: commands/dbcommands.c:858 +#: commands/dbcommands.c:1588 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "il database \"%s\" è usato da uno slot di replica attivo" -#: commands/dbcommands.c:860 +#: commands/dbcommands.c:1590 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "C'è %d slot attivo." msgstr[1] "Ci sono %d slot attivi." -#: commands/dbcommands.c:874 commands/dbcommands.c:1038 -#: commands/dbcommands.c:1168 -#, c-format -msgid "database \"%s\" is being accessed by other users" -msgstr "il database \"%s\" è attualmente utilizzato da altri utenti" - -#: commands/dbcommands.c:887 +#: commands/dbcommands.c:1604 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "il database \"%s\" è usato da una sottoscrizione di replica logica" -#: commands/dbcommands.c:889 +#: commands/dbcommands.c:1606 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "Ci sono %d sottoscrizioni." msgstr[1] "Ci sono %d sottoscrizioni." -#: commands/dbcommands.c:1007 +#: commands/dbcommands.c:1627 commands/dbcommands.c:1786 commands/dbcommands.c:1916 +#, c-format +msgid "database \"%s\" is being accessed by other users" +msgstr "il database \"%s\" è attualmente utilizzato da altri utenti" + +#: commands/dbcommands.c:1746 #, c-format msgid "permission denied to rename database" msgstr "permesso di rinominare il database negato" -#: commands/dbcommands.c:1027 +#: commands/dbcommands.c:1775 #, c-format msgid "current database cannot be renamed" msgstr "il database corrente non può essere rinominato" -#: commands/dbcommands.c:1124 +#: commands/dbcommands.c:1872 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "non è possibile cambiare il tablespace del database attualmente aperto" -#: commands/dbcommands.c:1227 +#: commands/dbcommands.c:1978 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "alcune relazioni del database \"%s\" sono già nel tablespace \"%s\"" -#: commands/dbcommands.c:1229 +#: commands/dbcommands.c:1980 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Occorre spostarle di nuovo nel tablespace di default del database prima di usare questo comando." -#: commands/dbcommands.c:1355 commands/dbcommands.c:1900 -#: commands/dbcommands.c:2104 commands/dbcommands.c:2159 -#: commands/tablespace.c:606 +#: commands/dbcommands.c:2107 commands/dbcommands.c:2818 commands/dbcommands.c:3082 commands/dbcommands.c:3196 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "alcuni file inutili possono essere stati lasciati nella vecchia directory del database \"%s\"" -#: commands/dbcommands.c:1475 +#: commands/dbcommands.c:2168 +#, c-format +msgid "unrecognized DROP DATABASE option \"%s\"" +msgstr "opzione DROP DATABASE non riconosciuta \"%s\"" + +#: commands/dbcommands.c:2246 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "l'opzione \"%s\" non può essere specificata con altre opzioni" -#: commands/dbcommands.c:1530 +#: commands/dbcommands.c:2302 #, c-format msgid "cannot disallow connections for current database" msgstr "non è possibile rifiutare connessioni per il database corrente" -#: commands/dbcommands.c:1667 +#: commands/dbcommands.c:2521 #, c-format msgid "permission denied to change owner of database" msgstr "permesso di cambiare il proprietario del database negato" -#: commands/dbcommands.c:1987 +#: commands/dbcommands.c:2924 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "Ci sono altre %d sessioni e %d transazioni preparate che stanno usando il database." -#: commands/dbcommands.c:1990 +#: commands/dbcommands.c:2927 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "Ci sono %d altra sessione che sta usando il database." msgstr[1] "Ci sono altre %d sessioni che stanno usando il database." -#: commands/dbcommands.c:1995 +#: commands/dbcommands.c:2932 storage/ipc/procarray.c:3814 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "Ci sono %d transazione preparata che sta usando il database." msgstr[1] "Ci sono %d transazioni preparate che stanno usando il database." -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 -#: commands/define.c:288 commands/define.c:334 +#: commands/dbcommands.c:3038 +#, c-format +msgid "missing directory \"%s\"" +msgstr "directory mancante \"%s\"" + +#: commands/dbcommands.c:3098 commands/tablespace.c:190 commands/tablespace.c:654 +#, c-format +msgid "could not stat directory \"%s\": %m" +msgstr "non è stato possibile ottenere informazioni sulla directory \"%s\": %m" + +#: 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 richiede un parametro" -#: 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 richiede un valore numerico" -#: commands/define.c:157 +#: commands/define.c:154 #, c-format msgid "%s requires a Boolean value" msgstr "%s richiede un valore booleano" -#: 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 richiede un valore intero" -#: commands/define.c:242 +#: commands/define.c:239 #, c-format msgid "argument of %s must be a name" msgstr "l'argomento di %s dev'essere un nome" -#: commands/define.c:272 +#: commands/define.c:269 #, c-format msgid "argument of %s must be a type name" msgstr "l'argomento di %s deve essere il nome di un tipo" -#: commands/define.c:318 +#: commands/define.c:315 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "argomento non valido per %s: \"%s\"" -#: commands/dropcmds.c:98 commands/functioncmds.c:1212 -#: utils/adt/ruleutils.c:2562 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 utils/adt/ruleutils.c:2908 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" è una funzione di aggregazione" -#: commands/dropcmds.c:100 +#: commands/dropcmds.c:102 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Usa DROP AGGREGATE per rimuovere le funzioni di aggregazione." -#: commands/dropcmds.c:149 commands/sequence.c:441 commands/tablecmds.c:2908 -#: commands/tablecmds.c:3059 commands/tablecmds.c:3102 -#: commands/tablecmds.c:12861 tcop/utility.c:1160 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 commands/tablecmds.c:3771 commands/tablecmds.c:3823 commands/tablecmds.c:16423 tcop/utility.c:1332 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "la relazione \"%s\" non esiste, saltata" -#: commands/dropcmds.c:179 commands/dropcmds.c:278 commands/tablecmds.c:1019 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "lo schema \"%s\" non esiste, saltato" -#: commands/dropcmds.c:219 commands/dropcmds.c:258 commands/tablecmds.c:254 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "il tipo \"%s\" non esiste, saltato" -#: commands/dropcmds.c:248 +#: commands/dropcmds.c:257 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "il metodo di accesso \"%s\" non esiste, saltato" -#: commands/dropcmds.c:266 +#: commands/dropcmds.c:275 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "l'ordinamento \"%s\" non esiste, saltato" -#: commands/dropcmds.c:273 +#: commands/dropcmds.c:282 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "la conversione \"%s\" non esiste, saltata" -#: commands/dropcmds.c:284 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "la statistica \"%s\" non esiste, saltata" -#: commands/dropcmds.c:291 +#: commands/dropcmds.c:300 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "l'analizzatore di ricerca di testo \"%s\" non esiste, saltato" -#: commands/dropcmds.c:298 +#: commands/dropcmds.c:307 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "il dizionario di ricerca di testo \"%s\" non esiste, saltato" -#: commands/dropcmds.c:305 +#: commands/dropcmds.c:314 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "il modello di ricerca di testo \"%s\" non esiste, saltato" -#: commands/dropcmds.c:312 +#: commands/dropcmds.c:321 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "la combinazione di ricerca di testo \"%s\" non esiste, saltato" -#: commands/dropcmds.c:317 +#: commands/dropcmds.c:326 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "l'estensione \"%s\" non esiste, saltata" -#: commands/dropcmds.c:327 +#: commands/dropcmds.c:336 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "la funzione %s(%s) non esiste, saltata" -#: commands/dropcmds.c:340 +#: commands/dropcmds.c:349 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "la procedura %s(%s) non esiste, saltata" -#: commands/dropcmds.c:353 +#: commands/dropcmds.c:362 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "la routine %s(%s) non esiste, saltata" -#: commands/dropcmds.c:366 +#: commands/dropcmds.c:375 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "la funzione di aggregazione %s(%s) non esiste, saltato" -#: commands/dropcmds.c:379 +#: commands/dropcmds.c:388 #, c-format msgid "operator %s does not exist, skipping" msgstr "l'operatore %s non esiste, saltato" -#: commands/dropcmds.c:385 +#: commands/dropcmds.c:394 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "il linguaggio \"%s\" non esiste, saltato" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:403 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "la conversione dal tipo %s al tipo %s non esiste, saltata" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:412 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "la trasformazione per il tipo %s linguaggio \"%s\" non esiste, saltata" -#: commands/dropcmds.c:411 +#: commands/dropcmds.c:420 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr "il trigger \"%s\" per la relazione \"%s\" non esiste, saltato" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:429 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "la regola di sicurezza \"%s\" per la relazione \"%s\" non esiste, saltata" -#: commands/dropcmds.c:427 +#: commands/dropcmds.c:436 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "il trigger di evento \"%s\" non esiste, saltato" -#: commands/dropcmds.c:433 +#: commands/dropcmds.c:442 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "la regola \"%s\" per la relazione \"%s\" non esiste, saltata" -#: commands/dropcmds.c:440 +#: commands/dropcmds.c:449 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "il wrapper di dati remoti \"%s\" non esiste, saltato" -#: commands/dropcmds.c:444 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "il server \"%s\" non esiste, saltato" -#: commands/dropcmds.c:453 +#: commands/dropcmds.c:462 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "la classe di operatori \"%s\" non esiste per il metodo di accesso \"%s\", saltata" -#: commands/dropcmds.c:465 +#: commands/dropcmds.c:474 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "la famiglia di operatori \"%s\" non esiste per il metodo di accesso \"%s\", saltata" -#: commands/dropcmds.c:472 +#: commands/dropcmds.c:481 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "la pubblicazione \"%s\" non esiste, saltata" -#: commands/event_trigger.c:187 +#: commands/event_trigger.c:125 #, c-format msgid "permission denied to create event trigger \"%s\"" msgstr "permesso di creare il trigger di evento \"%s\" negato" -#: commands/event_trigger.c:189 +#: commands/event_trigger.c:127 #, c-format msgid "Must be superuser to create an event trigger." msgstr "Solo un superutente può creare un trigger di evento." -#: commands/event_trigger.c:198 +#: commands/event_trigger.c:136 #, c-format msgid "unrecognized event name \"%s\"" msgstr "nome dell'evento \"%s\" sconosciuto" -#: commands/event_trigger.c:215 +#: commands/event_trigger.c:153 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "variabile filtro \"%s\" sconosciuta" -#: commands/event_trigger.c:270 +#: commands/event_trigger.c:207 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "valore del filtro \"%s\" sconosciuto per la variabile filtro \"%s\"" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:276 commands/event_trigger.c:346 +#: commands/event_trigger.c:213 commands/event_trigger.c:235 #, c-format msgid "event triggers are not supported for %s" msgstr "trigger di eventi non supportati per %s" -#: commands/event_trigger.c:369 +#: commands/event_trigger.c:248 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "la variabile filtro \"%s\" è specificata più di una volta" -#: commands/event_trigger.c:516 commands/event_trigger.c:559 -#: commands/event_trigger.c:651 +#: 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 "il trigger di evento \"%s\" non esiste" -#: commands/event_trigger.c:620 +#: commands/event_trigger.c:483 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "permesso di cambiare il proprietario del trigger di evento \"%s\" negato" -#: commands/event_trigger.c:622 +#: commands/event_trigger.c:485 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Il proprietario di un trigger di evento deve essere un superutente." -#: commands/event_trigger.c:1457 +#: commands/event_trigger.c:1304 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s può essere chiamata solo in una funzione trigger di evento sql_drop" -#: commands/event_trigger.c:1577 commands/event_trigger.c:1598 +#: 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 può essere chiamata solo in una funzione trigger di evento table_rewrite" -#: commands/event_trigger.c:2009 +#: commands/event_trigger.c:1834 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s può essere chiamata solo in una funzione trigger di evento" -#: commands/explain.c:192 +#: commands/explain.c:218 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "valore sconosciuto per l'opzione di EXPLAIN \"%s\": \"%s\"" -#: commands/explain.c:199 +#: commands/explain.c:225 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "opzione di EXPLAIN non riconosciuta \"%s\"" -#: commands/explain.c:207 +#: commands/explain.c:233 #, c-format -msgid "EXPLAIN option BUFFERS requires ANALYZE" -msgstr "l'opzione BUFFERS di EXPLAIN richiede ANALYZE" +msgid "EXPLAIN option WAL requires ANALYZE" +msgstr "L'opzione SPIEGAZIONE WAL richiede ANALISI" -#: commands/explain.c:216 +#: commands/explain.c:242 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "l'opzione TIMING di EXPLAIN richiede ANALYZE" -#: commands/extension.c:168 commands/extension.c:2907 +#: commands/extension.c:173 commands/extension.c:2936 #, c-format msgid "extension \"%s\" does not exist" msgstr "l'estensione \"%s\" non esiste" -#: commands/extension.c:267 commands/extension.c:276 commands/extension.c:288 -#: commands/extension.c:298 +#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 commands/extension.c:303 #, c-format msgid "invalid extension name: \"%s\"" msgstr "nome di estensione non valido: \"%s\"" -#: commands/extension.c:268 +#: commands/extension.c:273 #, c-format msgid "Extension names must not be empty." msgstr "I nomi delle estensioni non possono essere vuoti." -#: commands/extension.c:277 +#: commands/extension.c:282 #, c-format msgid "Extension names must not contain \"--\"." msgstr "I nomi delle estensioni non possono contenere \"--\"." -#: commands/extension.c:289 +#: commands/extension.c:294 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "I nomi delle estensioni non possono iniziare o finire con \"-\"." -#: commands/extension.c:299 +#: commands/extension.c:304 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "I nomi delle estensioni non possono contenere caratteri separatore directory." -#: commands/extension.c:314 commands/extension.c:323 commands/extension.c:332 -#: commands/extension.c:342 +#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 commands/extension.c:347 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "nome di versione dell'estensione non valido: \"%s\"" -#: commands/extension.c:315 +#: commands/extension.c:320 #, c-format msgid "Version names must not be empty." msgstr "I nomi di versione non possono essere vuoti." -#: commands/extension.c:324 +#: commands/extension.c:329 #, c-format msgid "Version names must not contain \"--\"." msgstr "I nomi di versione non possono contenere \"--\"." -#: commands/extension.c:333 +#: commands/extension.c:338 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "I nomi di versione non possono iniziare o finire con \"-\"." -#: commands/extension.c:343 +#: commands/extension.c:348 #, c-format msgid "Version names must not contain directory separator characters." msgstr "I nomi di versione non possono contenere caratteri separatore directory." -#: commands/extension.c:493 +#: commands/extension.c:502 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "l'estensione \"%s\" non è disponibile" + +#: commands/extension.c:503 +#, c-format +msgid "Could not open extension control file \"%s\": %m." +msgstr "Impossibile aprire il file di controllo dell'estensione \"%s\": %m." + +#: commands/extension.c:505 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "L'estensione deve essere prima installata sul sistema su cui è in esecuzione PostgreSQL." + +#: commands/extension.c:509 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "apertura del file di controllo dell'estensione \"%s\" fallita: %m" -#: commands/extension.c:515 commands/extension.c:525 +#: commands/extension.c:531 commands/extension.c:541 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "il parametro \"%s\" non può essere impostato in un file di controllo secondario di estensione" -#: commands/extension.c:564 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 utils/misc/guc.c:7390 +#, c-format +msgid "parameter \"%s\" requires a Boolean value" +msgstr "il parametro \"%s\" richiede un valore booleano" + +#: commands/extension.c:588 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" non è un nome di codifica valido" -#: commands/extension.c:578 +#: commands/extension.c:602 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "il parametro \"%s\" dev'essere una lista di nomi di estensioni" -#: commands/extension.c:585 +#: commands/extension.c:609 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "parametro sconosciuto \"%s\" nel file \"%s\"" -#: commands/extension.c:594 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "il parametro \"schema\" non può essere specificato quando \"relocatable\" è abilitato" -#: commands/extension.c:761 +#: commands/extension.c:796 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "le istruzioni di controllo di transazione non sono valide in uno script di estensione" -#: commands/extension.c:807 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "permesso di creare l'estensione \"%s\" negato" -#: commands/extension.c:809 +#: commands/extension.c:876 +#, c-format +msgid "Must have CREATE privilege on current database to create this extension." +msgstr "È necessario disporre del privilegio CREATE sul database corrente per creare questa estensione." + +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Solo un superutente può creare questa estensione." -#: commands/extension.c:813 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "permesso di modificare l'estensione \"%s\" negato" -#: commands/extension.c:815 +#: commands/extension.c:884 +#, c-format +msgid "Must have CREATE privilege on current database to update this extension." +msgstr "È necessario disporre del privilegio CREATE sul database corrente per aggiornare questa estensione." + +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Solo un superutente può modificare questa estensione." -#: commands/extension.c:1097 +#: commands/extension.c:1216 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "l'estensione \"%s\" non ha un percorso di aggiornamento dalla versione \"%s\" alla versione \"%s\"" -#: commands/extension.c:1304 commands/extension.c:2968 +#: commands/extension.c:1424 commands/extension.c:2994 #, c-format msgid "version to install must be specified" msgstr "il nome di versione da installare deve essere specificato" -#: commands/extension.c:1326 -#, c-format -msgid "FROM version must be different from installation target version \"%s\"" -msgstr "la versione FROM dev'essere diversa dalla versione \"%s\" oggetto dell'installazione" - -#: commands/extension.c:1391 +#: commands/extension.c:1461 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "l'estensione \"%s\" non ha uno script di installazione o un percorso di update per la versione \"%s\"" -#: commands/extension.c:1426 +#: commands/extension.c:1495 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "l'estensione \"%s\" dev'essere installata nello schema \"%s\"" -#: commands/extension.c:1579 +#: commands/extension.c:1655 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "individuata una dipendenza ciclica tra le estensioni \"%s\" e \"%s\"" -#: commands/extension.c:1584 +#: commands/extension.c:1660 #, c-format msgid "installing required extension \"%s\"" msgstr "installazione dell'estensione richiesta \"%s\"" -#: commands/extension.c:1608 +#: commands/extension.c:1683 #, c-format msgid "required extension \"%s\" is not installed" msgstr "l'estensione richiesta \"%s\" non è installata" -#: commands/extension.c:1611 +#: commands/extension.c:1686 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Usa CREATE EXTENSION ... CASCADE per installare anche le estensioni richieste." -#: commands/extension.c:1648 +#: commands/extension.c:1721 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "l'estensione \"%s\" esiste già, saltata" -#: commands/extension.c:1655 +#: commands/extension.c:1728 #, c-format msgid "extension \"%s\" already exists" msgstr "l'estensione \"%s\" esiste già" -#: commands/extension.c:1666 +#: commands/extension.c:1739 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "CREATE EXTENSION annidati non sono supportati" -#: commands/extension.c:1847 +#: commands/extension.c:1903 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "non è possibile eliminare l'estensione \"%s\" perché sta venendo modificata" -#: commands/extension.c:2349 +#: commands/extension.c:2380 #, c-format -msgid "pg_extension_config_dump() can only be called from an SQL script executed by CREATE EXTENSION" -msgstr "pg_extension_config_dump() può essere richiamata solo da uno script SQL eseguito da CREATE EXTENSION" +msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" +msgstr "%s può essere chiamato solo da uno script SQL eseguito da CREATE EXTENSION" -#: commands/extension.c:2361 +#: commands/extension.c:2392 #, c-format msgid "OID %u does not refer to a table" msgstr "l'OID %u non si riferisce ad una tabella" -#: commands/extension.c:2366 +#: commands/extension.c:2397 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "la tabella \"%s\" non è membra dell'estensione in fase di creazione" -#: commands/extension.c:2722 +#: commands/extension.c:2751 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "non è possibile spostare l'estensione \"%s\" nello schema \"%s\" perché l'estensione contiene lo schema" -#: commands/extension.c:2763 commands/extension.c:2826 +#: commands/extension.c:2792 commands/extension.c:2855 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "l'estensione \"%s\" non supporta SET SCHEMA" -#: commands/extension.c:2828 +#: commands/extension.c:2857 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s non è nello schema dell'estensione \"%s\"" -#: commands/extension.c:2887 +#: commands/extension.c:2916 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "ALTER EXTENSION annidati non sono supportati" -#: commands/extension.c:2979 +#: commands/extension.c:3005 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "la versione \"%s\" dell'estensione \"%s\" è già installata" -#: commands/extension.c:3230 +#: commands/extension.c:3217 #, c-format -msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" -msgstr "non è possibile aggiungere lo schema \"%s\" all'estensione \"%s\" perché lo schema contiene l'estensione" +msgid "cannot add an object of this type to an extension" +msgstr "non è possibile aggiungere un oggetto di questo tipo a un'estensione" -#: commands/extension.c:3258 +#: commands/extension.c:3283 #, c-format -msgid "%s is not a member of extension \"%s\"" -msgstr "%s non fa parte dell'estensione \"%s\"" +msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" +msgstr "non è possibile aggiungere lo schema \"%s\" all'estensione \"%s\" perché lo schema contiene l'estensione" -#: commands/extension.c:3324 +#: commands/extension.c:3377 #, c-format msgid "file \"%s\" is too large" msgstr "il file \"%s\" è troppo grande" -#: commands/foreigncmds.c:150 commands/foreigncmds.c:159 +#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 #, c-format msgid "option \"%s\" not found" msgstr "opzione \"%s\" non trovata" -#: commands/foreigncmds.c:169 +#: commands/foreigncmds.c:167 #, c-format msgid "option \"%s\" provided more than once" msgstr "opzione \"%s\" fornita più di una volta" -#: commands/foreigncmds.c:223 commands/foreigncmds.c:231 +#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "permesso di cambiare proprietario del wrapper di dati esterni \"%s\" negato" -#: commands/foreigncmds.c:225 +#: commands/foreigncmds.c:223 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "Solo un superutente può cambiare proprietario di un wrapper di dati esterni." -#: commands/foreigncmds.c:233 +#: commands/foreigncmds.c:231 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Il proprietario di un wrapper di dati esterni dev'essere un superutente." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:706 foreign/foreign.c:667 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "il wrapper di dati esterni \"%s\" non esiste" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "permesso di creare il wrapper di dati esterni \"%s\" negato" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Solo un superutente può creare un wrapper di dati esterni." -#: commands/foreigncmds.c:696 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "permesso di modificare il wrapper di dati esterni \"%s\" negato" -#: commands/foreigncmds.c:698 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Solo un superutente può modificare un wrapper di dati esterni." -#: commands/foreigncmds.c:729 +#: commands/foreigncmds.c:730 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "cambiare il gestore del wrapper di dati esterni può cambiare il comportamento di tabelle esterne esistenti" -#: commands/foreigncmds.c:744 +#: commands/foreigncmds.c:745 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "cambiare il validatore del wrapper di dati esterni può rendere non valide le opzioni degli oggetti dipendenti" -#: commands/foreigncmds.c:890 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "il server \"%s\" esiste già, saltato" -#: commands/foreigncmds.c:1175 +#: commands/foreigncmds.c:1144 #, c-format -msgid "user mapping for \"%s\" already exists for server %s, skipping" -msgstr "la mappatura utenti per \"%s\" esiste già per il server %s, saltata" +msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" +msgstr "la mappatura utente per \"%s\" esiste già per il server \"%s\", saltando" -#: commands/foreigncmds.c:1185 +#: commands/foreigncmds.c:1154 #, c-format -msgid "user mapping for \"%s\" already exists for server %s" -msgstr "la mappatura utenti per \"%s\" esiste già per il server %s" +msgid "user mapping for \"%s\" already exists for server \"%s\"" +msgstr "la mappatura utente per \"%s\" esiste già per il server \"%s\"" -#: commands/foreigncmds.c:1282 commands/foreigncmds.c:1397 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format -msgid "user mapping for \"%s\" does not exist for the server" -msgstr "la mappatura utenti per \"%s\" non esiste per il server" +msgid "user mapping for \"%s\" does not exist for server \"%s\"" +msgstr "mappatura utente per \"%s\" non esiste per il server \"%s\"" -#: commands/foreigncmds.c:1384 +#: commands/foreigncmds.c:1379 #, c-format -msgid "server does not exist, skipping" -msgstr "il server non esiste, saltato" +msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" +msgstr "la mappatura utente per \"%s\" non esiste per il server \"%s\", saltando" -#: commands/foreigncmds.c:1402 -#, c-format -msgid "user mapping for \"%s\" does not exist for the server, skipping" -msgstr "la mappatura utenti per \"%s\" non esiste per il server, saltata" - -#: commands/foreigncmds.c:1553 foreign/foreign.c:357 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "il wrapper di dati remoti \"%s\" non ha un handler" -#: commands/foreigncmds.c:1559 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "il wrapper di dati remoti \"%s\" non supporta IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1662 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "importazione della tabella remota \"%s\"" -#: commands/functioncmds.c:104 +#: commands/functioncmds.c:109 #, c-format msgid "SQL function cannot return shell type %s" -msgstr "la funzione SQL non può restituire il tipo non completamente definito %s" +msgstr "La funzione SQL non può restituire il tipo non completamente definito %s" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "il tipo restituito %s non è completamente definito" -#: commands/functioncmds.c:139 parser/parse_type.c:337 +#: commands/functioncmds.c:144 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "il modificatore di tipo non può essere specificato per il tipo non completamente definito \"%s\"" -#: commands/functioncmds.c:145 +#: commands/functioncmds.c:150 #, c-format msgid "type \"%s\" is not yet defined" msgstr "il tipo \"%s\" non è ancora definito" -#: commands/functioncmds.c:146 +#: commands/functioncmds.c:151 #, c-format msgid "Creating a shell type definition." msgstr "Creazione di un tipo non completamente definito." -#: commands/functioncmds.c:238 +#: commands/functioncmds.c:250 #, c-format msgid "SQL function cannot accept shell type %s" -msgstr "la funzione SQL non può accettare il tipo non completamente definito %s" +msgstr "La funzione SQL non può accettare il tipo non completamente definito %s" -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:256 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "l'aggregato non può accettare il tipo non completamente definito %s" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:261 #, c-format msgid "argument type %s is only a shell" msgstr "il tipo %s dell'argomento non è completamente definito" -#: commands/functioncmds.c:259 +#: commands/functioncmds.c:271 #, c-format msgid "type %s does not exist" msgstr "il tipo %s non esiste" -#: commands/functioncmds.c:273 +#: commands/functioncmds.c:285 #, c-format msgid "aggregates cannot accept set arguments" msgstr "gli aggregati non accettano insiemi come argomenti" -#: commands/functioncmds.c:277 +#: commands/functioncmds.c:289 #, c-format msgid "procedures cannot accept set arguments" msgstr "le procedure non accettano insiemi come argomenti" -#: commands/functioncmds.c:281 +#: commands/functioncmds.c:293 #, c-format msgid "functions cannot accept set arguments" msgstr "le funzioni non accettano insiemi come argomenti" -#: commands/functioncmds.c:289 -#, c-format -msgid "procedures cannot have OUT arguments" -msgstr "le procedure non possono avere argomenti OUT" - -#: commands/functioncmds.c:290 +#: commands/functioncmds.c:303 #, c-format -msgid "INOUT arguments are permitted." -msgstr "Argomenti INOUT sono permessi." +msgid "VARIADIC parameter must be the last input parameter" +msgstr "Il parametro VARIADIC deve essere l'ultimo dei parametri di input" -#: commands/functioncmds.c:300 +#: commands/functioncmds.c:323 #, c-format -msgid "VARIADIC parameter must be the last input parameter" -msgstr "il parametro VARIADIC deve essere l'ultimo dei parametri di input" +msgid "VARIADIC parameter must be the last parameter" +msgstr "Il parametro VARIADIC deve essere l'ultimo parametro" -#: commands/functioncmds.c:330 +#: commands/functioncmds.c:348 #, c-format msgid "VARIADIC parameter must be an array" -msgstr "il parametro VARIADIC dev'essere un array" +msgstr "Il parametro VARIADIC dev'essere un array" -#: commands/functioncmds.c:370 +#: commands/functioncmds.c:393 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "il nome di parametro \"%s\" è usato più di una volta" -#: commands/functioncmds.c:385 +#: commands/functioncmds.c:411 #, c-format msgid "only input parameters can have default values" msgstr "solo i parametri di input possono avere un valore di default" -#: commands/functioncmds.c:400 +#: commands/functioncmds.c:426 #, c-format msgid "cannot use table references in parameter default value" msgstr "non si possono usare riferimenti a tabelle nel valore predefinito dei parametri" -#: commands/functioncmds.c:424 +#: commands/functioncmds.c:450 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "i parametri di input che seguono uno con valore predefinito devono avere anch'essi un valore predefinito" -#: commands/functioncmds.c:566 commands/functioncmds.c:716 +#: commands/functioncmds.c:460 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "procedura I parametri OUT non possono comparire dopo uno con valore di default" + +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "attributo non valido nella definizione della procedura" -#: commands/functioncmds.c:747 +#: commands/functioncmds.c:701 #, c-format -msgid "no function body specified" -msgstr "non è stato specificato alcun corpo della funzione" +msgid "support function %s must return type %s" +msgstr "la funzione di supporto %s deve restituire il tipo %s" -#: commands/functioncmds.c:757 +#: commands/functioncmds.c:712 #, c-format -msgid "no language specified" -msgstr "nessun linguaggio specificato" +msgid "must be superuser to specify a support function" +msgstr "deve essere superutente per specificare una funzione di supporto" -#: commands/functioncmds.c:782 commands/functioncmds.c:1256 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST dev'essere positivo" -#: commands/functioncmds.c:790 commands/functioncmds.c:1264 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWS dev'essere positivo" -#: commands/functioncmds.c:842 +#: commands/functioncmds.c:870 +#, c-format +msgid "no function body specified" +msgstr "non è stato specificato alcun corpo della funzione" + +#: commands/functioncmds.c:875 +#, c-format +msgid "duplicate function body specified" +msgstr "corpo della funzione duplicata specificato" + +#: commands/functioncmds.c:880 +#, c-format +msgid "inline SQL function body only valid for language SQL" +msgstr "corpo della funzione SQL inline valido solo per il linguaggio SQL" + +#: commands/functioncmds.c:922 +#, c-format +msgid "SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "La funzione SQL con il corpo della funzione senza virgolette non può avere argomenti polimorfici" + +#: commands/functioncmds.c:948 commands/functioncmds.c:967 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%s non è ancora supportato nel corpo della funzione SQL senza virgolette" + +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "solo un elemento AS è necessario per il linguaggio \"%s\"" -#: commands/functioncmds.c:937 commands/functioncmds.c:2139 -#: commands/proclang.c:557 +#: commands/functioncmds.c:1100 +#, c-format +msgid "no language specified" +msgstr "nessun linguaggio specificato" + +#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "il linguaggio \"%s\" non esiste" -#: commands/functioncmds.c:939 commands/functioncmds.c:2141 +#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Usa CREATE EXTENSION per caricare il linguaggio nel database." -#: commands/functioncmds.c:974 commands/functioncmds.c:1248 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "solo un superutente può definire una funzione stagna" -#: commands/functioncmds.c:1023 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "il risultato della funzione deve essere %s per i parametri OUT" -#: commands/functioncmds.c:1036 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "il tipo di risultato della funzione dev'essere specificato" -#: commands/functioncmds.c:1088 commands/functioncmds.c:1268 +#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS è non applicabile quando la funzione non restituisce un insieme" -#: commands/functioncmds.c:1440 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "il tipo di dati di origine %s è uno pseudo-tipo" -#: commands/functioncmds.c:1446 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "il tipo di dati di destinazione %s è uno pseudo-tipo" -#: commands/functioncmds.c:1470 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "la conversione verrà ignorata perché il tipo di dato di origine è un dominio" -#: commands/functioncmds.c:1475 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "la conversione verrà ignorata perché il tipo di dato di destinazione è un dominio" -#: commands/functioncmds.c:1500 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "la funzione di conversione deve prendere da uno a tre argomenti" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1616 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "l'argomento della funzione di conversione deve combaciare o essere convertibile a livello binario dal tipo di dato di origine" -#: commands/functioncmds.c:1508 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "il secondo argomento della funzione di conversione deve essere di tipo %s" -#: commands/functioncmds.c:1513 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "il terzo argomento della funzione di conversione deve essere di tipo %s" -#: commands/functioncmds.c:1518 +#: commands/functioncmds.c:1630 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "il tipo di dato restituito dalla funzione di conversione deve combaciare o essere convertibile a livello binario nel tipo di dato di destinazione" -#: commands/functioncmds.c:1529 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "la funzione di conversione non può essere volatile" -#: commands/functioncmds.c:1534 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "la funzione di conversione dev'essere una funzione normale" -#: commands/functioncmds.c:1538 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "la funzione di conversione non può restituire un insieme" -#: commands/functioncmds.c:1564 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "occorre essere un superutente per creare un cast WITHOUT FUNCTION" -#: commands/functioncmds.c:1579 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "i tipi di dati di origine e di destinazione non sono fisicamente compatibili" -#: commands/functioncmds.c:1594 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "i tipi di dati compositi non sono compatibili a livello binario" -#: commands/functioncmds.c:1600 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "le enumerazioni non sono compatibili a livello binario" -#: commands/functioncmds.c:1606 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "i tipi di dati array non sono compatibili a livello binario" -#: commands/functioncmds.c:1623 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "i tipi di dominio non devono essere marcati come compatibili a livello binario" -#: commands/functioncmds.c:1633 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "i tipi di dati di origine e di destinazione sono gli stessi" -#: commands/functioncmds.c:1666 -#, c-format -msgid "cast from type %s to type %s already exists" -msgstr "la conversione dal tipo %s al tipo %s esiste già" - -#: commands/functioncmds.c:1739 -#, c-format -msgid "cast from type %s to type %s does not exist" -msgstr "la conversione dal tipo %s al tipo %s non esiste" - #: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" @@ -7290,598 +8039,704 @@ msgstr "la funzione di trasformazione deve poter ricevere un solo argomento" msgid "first argument of transform function must be type %s" msgstr "il primo argomento della funzione di trasformazione deve essere di tipo %s" -#: commands/functioncmds.c:1832 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "il tipo di dato %s è uno pseudo-tipo" -#: commands/functioncmds.c:1838 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "il tipo di dato %s è un dominio" -#: commands/functioncmds.c:1878 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "il tipo di dati restituito dalla funzione FROM SQL deve essere %s" -#: commands/functioncmds.c:1904 +#: commands/functioncmds.c:1905 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "il tipo di dati restituito da una funzione TO SQL dev'essere il tipo di dato della trasformazione" -#: commands/functioncmds.c:1931 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "la trasformazione per il tipo %s linguaggio \"%s\" esiste già" -#: commands/functioncmds.c:2020 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "la trasformazione per il tipo %s linguaggio \"%s\" non esiste" -#: commands/functioncmds.c:2071 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "la funzione %s esiste già nello schema \"%s\"" -#: commands/functioncmds.c:2126 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "nessun codice inline specificato" -#: commands/functioncmds.c:2172 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "il linguaggio \"%s\" non supporta l'esecuzione di codice inline" -#: commands/functioncmds.c:2271 +#: 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] "non è possibile passare più di %d argomenti ad una procedura" msgstr[1] "non è possibile passare più di %d argomenti ad una procedura" -#: commands/indexcmds.c:393 +#: commands/indexcmds.c:634 #, c-format msgid "must specify at least one column" msgstr "occorre specificare almeno una colonna" -#: commands/indexcmds.c:397 +#: commands/indexcmds.c:638 #, c-format msgid "cannot use more than %d columns in an index" msgstr "non è possibile usare più di %d colonne in un indice" -#: commands/indexcmds.c:437 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "non è possibile creare indici sulla tabella esterna \"%s\"" +msgid "cannot create index on relation \"%s\"" +msgstr "impossibile creare l'indice sulla relazione \"%s\"" -#: commands/indexcmds.c:462 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "non è possibile creare indici sulla tabella partizionata \"%s\" concorrentemente" -#: commands/indexcmds.c:467 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "non è possibile creare vincoli di esclusione sulla tabella partizionata \"%s\"" -#: commands/indexcmds.c:477 +#: commands/indexcmds.c:722 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "non è possibile creare indici su tabelle temporanee di altre sessioni" -#: commands/indexcmds.c:542 commands/tablecmds.c:614 commands/tablecmds.c:10937 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 +#, c-format +msgid "cannot specify default tablespace for partitioned relations" +msgstr "non è possibile specificare lo spazio tabella predefinito per le relazioni partizionate" + +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "solo le relazioni condivise possono essere poste nel tablespace pg_global" -#: commands/indexcmds.c:575 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "sostituzione del metodo di accesso \"gist\" per il metodo obsoleto \"rtree\"" -#: commands/indexcmds.c:593 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "il metodo di accesso \"%s\" non supporta gli indici univoci" -#: commands/indexcmds.c:598 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "il metodo di accesso \"%s\" non supporta colonne incluse" -#: commands/indexcmds.c:603 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "il metodo di accesso \"%s\" non supporta gli indici multicolonna" -#: commands/indexcmds.c:608 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "il metodo di accesso \"%s\" non supporta i vincoli di esclusione" -#: commands/indexcmds.c:720 +#: commands/indexcmds.c:986 #, c-format -msgid "unsupported %s constraint with partition key definition" +msgid "cannot match partition key to an index using access method \"%s\"" +msgstr "impossibile abbinare la chiave di partizione a un indice utilizzando il metodo di accesso \"%s\"" + +#: commands/indexcmds.c:996 +#, c-format +msgid "unsupported %s constraint with partition key definition" msgstr "vincolo %s non supportato con una definizione di chiave di partizione" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "I vincoli %s non possono essere usati quando le chiavi di partizioni includono espressioni." -#: commands/indexcmds.c:740 +#: commands/indexcmds.c:1037 #, c-format -msgid "insufficient columns in %s constraint definition" -msgstr "colonne non sufficienti nella definizione del vincolo %s" +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "il vincolo univoco sulla tabella partizionata deve includere tutte le colonne di partizionamento" -#: commands/indexcmds.c:742 +#: commands/indexcmds.c:1038 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "il vincolo %s sulla tabella \"%s\" non ha la colonna \"%s\" che è parte della chiave di partizione." -#: commands/indexcmds.c:761 commands/indexcmds.c:781 +#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 #, c-format msgid "index creation on system columns is not supported" msgstr "la creazione di indici su colonne di sistema non è supportata" -#: commands/indexcmds.c:806 +#: commands/indexcmds.c:1276 tcop/utility.c:1518 #, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%s %s creerà un indice implicito \"%s\" per la tabella \"%s\"" +msgid "cannot create unique index on partitioned table \"%s\"" +msgstr "impossibile creare un indice univoco sulla tabella partizionata \"%s\"" + +#: commands/indexcmds.c:1278 tcop/utility.c:1520 +#, c-format +msgid "Table \"%s\" contains partitions that are foreign tables." +msgstr "La tabella \"%s\" contiene partizioni che sono tabelle esterne." -#: commands/indexcmds.c:1392 +#: commands/indexcmds.c:1750 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "le funzioni nel predicato dell'indice devono essere marcate IMMUTABLE" -#: commands/indexcmds.c:1458 parser/parse_utilcmd.c:2239 -#: parser/parse_utilcmd.c:2363 +#: commands/indexcmds.c:1828 parser/parse_utilcmd.c:2528 parser/parse_utilcmd.c:2663 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "la colonna \"%s\" nominata nella chiave non esiste" -#: commands/indexcmds.c:1482 parser/parse_utilcmd.c:1588 +#: commands/indexcmds.c:1852 parser/parse_utilcmd.c:1825 #, c-format msgid "expressions are not supported in included columns" msgstr "le colonne incluse non supportano espressioni" -#: commands/indexcmds.c:1523 +#: commands/indexcmds.c:1893 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "le funzioni nell'espressione dell'indice devono essere marcate IMMUTABLE" -#: commands/indexcmds.c:1538 +#: commands/indexcmds.c:1908 #, c-format msgid "including column does not support a collation" msgstr "le colonne incluse non supportano ordinamenti" -#: commands/indexcmds.c:1542 +#: commands/indexcmds.c:1912 #, c-format msgid "including column does not support an operator class" msgstr "le colonne incluse non supportano classi di operatori" -#: commands/indexcmds.c:1546 +#: commands/indexcmds.c:1916 #, c-format msgid "including column does not support ASC/DESC options" msgstr "le colonne incluse non supportano opzioni ASC/DESC" -#: commands/indexcmds.c:1550 +#: commands/indexcmds.c:1920 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "le colonne incluse non supportano opzioni NULLS FIRST/LAST" -#: commands/indexcmds.c:1577 +#: commands/indexcmds.c:1961 #, c-format msgid "could not determine which collation to use for index expression" msgstr "non è stato possibile determinare quale ordinamento usare per l'espressione dell'indice" -#: commands/indexcmds.c:1585 commands/tablecmds.c:13785 commands/typecmds.c:833 -#: parser/parse_expr.c:2772 parser/parse_type.c:549 parser/parse_utilcmd.c:3394 -#: utils/adt/misc.c:681 +#: commands/indexcmds.c:1969 commands/tablecmds.c:17438 commands/typecmds.c:807 parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3795 utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "gli ordinamenti non sono supportati dal tipo %s" -#: commands/indexcmds.c:1623 +#: commands/indexcmds.c:2034 #, c-format msgid "operator %s is not commutative" msgstr "l'operatore %s non è commutativo" -#: commands/indexcmds.c:1625 +#: commands/indexcmds.c:2036 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Solo operatori commutativi possono essere usati nei vincoli di esclusione." -#: commands/indexcmds.c:1651 +#: commands/indexcmds.c:2062 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "l'operatore %s non è membro della famiglia di operatori \"%s\"" -#: commands/indexcmds.c:1654 +#: commands/indexcmds.c:2065 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "L'operatore di esclusione dev'essere correlato alla classe di operatori dell'indice per il vincolo." -#: commands/indexcmds.c:1689 +#: commands/indexcmds.c:2100 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "il metodo di accesso \"%s\" non supporta le opzioni ASC/DESC" -#: commands/indexcmds.c:1694 +#: commands/indexcmds.c:2105 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "il metodo di accesso \"%s\" non supporta le opzioni NULLS FIRST/LAST" -#: commands/indexcmds.c:1753 commands/typecmds.c:1996 +#: commands/indexcmds.c:2151 commands/tablecmds.c:17463 commands/tablecmds.c:17469 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "il tipo di dati %s non ha una classe di operatori predefinita per il metodo di accesso \"%s\"" -#: commands/indexcmds.c:1755 +#: commands/indexcmds.c:2153 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." -msgstr "Devi specificare una classe di operatori per l'indice o definire una classe di operatori predefinita per il tipo di dati" +msgstr "Devi specificare una classe di operatori per l'indice o definire una classe di operatori predefinita per il tipo di dati." -#: commands/indexcmds.c:1784 commands/indexcmds.c:1792 -#: commands/opclasscmds.c:206 +#: commands/indexcmds.c:2182 commands/indexcmds.c:2190 commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "la classe di operatori \"%s\" non esiste per il metodo di accesso \"%s\"" -#: commands/indexcmds.c:1805 commands/typecmds.c:1984 +#: commands/indexcmds.c:2204 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la classe di operatori \"%s\" non accetta il tipo di dati %s" -#: commands/indexcmds.c:1895 +#: commands/indexcmds.c:2294 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "il tipo di dati %s ha più di una classe di operatori predefinita" -#: commands/indexcmds.c:2310 +#: commands/indexcmds.c:2622 #, c-format -msgid "table \"%s\" has no indexes" -msgstr "la tabella \"%s\" non ha indici" +msgid "unrecognized REINDEX option \"%s\"" +msgstr "opzione REINDEX non riconosciuta \"%s\"" -#: commands/indexcmds.c:2365 +#: commands/indexcmds.c:2846 +#, c-format +msgid "table \"%s\" has no indexes that can be reindexed concurrently" +msgstr "la tabella \"%s\" non ha indici che possono essere reindicizzati contemporaneamente" + +#: commands/indexcmds.c:2860 +#, c-format +msgid "table \"%s\" has no indexes to reindex" +msgstr "la tabella \"%s\" non ha indici da reindicizzare" + +#: commands/indexcmds.c:2900 commands/indexcmds.c:3404 commands/indexcmds.c:3532 +#, c-format +msgid "cannot reindex system catalogs concurrently" +msgstr "impossibile reindicizzare i cataloghi di sistema contemporaneamente" + +#: commands/indexcmds.c:2923 #, c-format msgid "can only reindex the currently open database" msgstr "è possibile reindicizzare solo il database corrente" -#: commands/indexcmds.c:2483 +#: commands/indexcmds.c:3011 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "impossibile reindicizzare i cataloghi di sistema contemporaneamente, saltando tutto" + +#: commands/indexcmds.c:3044 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "non può spostare le relazioni di sistema, saltando tutto" + +#: commands/indexcmds.c:3090 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "durante la reindicizzazione della tabella partizionata \"%s.%s\"" + +#: commands/indexcmds.c:3093 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "durante la reindicizzazione dell'indice partizionato \"%s.%s\"" + +#: commands/indexcmds.c:3284 commands/indexcmds.c:4140 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la tabella \"%s.%s\" è stata reindicizzata" -#: commands/indexcmds.c:2505 +#: commands/indexcmds.c:3436 commands/indexcmds.c:3488 #, c-format -msgid "REINDEX is not yet implemented for partitioned indexes" -msgstr "REINDEX non ancora implementato per tabelle partizionate" +msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" +msgstr "impossibile reindicizzare l'indice non valido \"%s.%s\" contemporaneamente, saltando" -#: commands/lockcmds.c:100 +#: commands/indexcmds.c:3442 #, c-format -msgid "\"%s\" is not a table or a view" -msgstr "\"%s\" non è una tabella o una vista" +msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" +msgstr "impossibile reindicizzare l'indice di vincolo di esclusione \"%s.%s\" contemporaneamente, saltando" -#: commands/lockcmds.c:224 rewrite/rewriteHandler.c:1836 -#: rewrite/rewriteHandler.c:3532 +#: commands/indexcmds.c:3597 #, c-format -msgid "infinite recursion detected in rules for relation \"%s\"" -msgstr "ricorsione infinita individuata nelle regole per la relazione \"%s\"" +msgid "cannot reindex this type of relation concurrently" +msgstr "non può reindicizzare questo tipo di relazione contemporaneamente" + +#: commands/indexcmds.c:3618 +#, c-format +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "impossibile spostare la relazione non condivisa nel tablespace \"%s\"" + +#: commands/indexcmds.c:4121 commands/indexcmds.c:4133 +#, c-format +msgid "index \"%s.%s\" was reindexed" +msgstr "l'indice \"%s.%s\" è stato reindicizzato" + +#: commands/indexcmds.c:4123 commands/indexcmds.c:4142 +#, c-format +msgid "%s." +msgstr "%s." -#: commands/matview.c:179 +#: commands/lockcmds.c:92 +#, c-format +msgid "cannot lock relation \"%s\"" +msgstr "impossibile bloccare la relazione \"%s\"" + +#: commands/matview.c:193 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "non si può usare CONCURRENTLY quando la vista materializzata non è popolata" -#: commands/matview.c:185 +#: commands/matview.c:199 gram.y:17995 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "le opzioni CONCURRENTLY e WITH NO DATA non possono essere usate insieme" +msgid "%s and %s options cannot be used together" +msgstr "Le opzioni %s e %s non possono essere utilizzate insieme" -#: commands/matview.c:244 +#: commands/matview.c:256 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "non è possibile aggiornare la vista materializzata \"%s\" concorrentemente" -#: 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 "Crea un indice unico senza clausola WHERE su una o più colonna della vista materializzata." -#: commands/matview.c:645 +#: commands/matview.c:653 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "i nuovi dati per la vista materializzata \"%s\" contengono righe duplicate senza alcuna colonna null" -#: commands/matview.c:647 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "Riga: %s" -#: commands/opclasscmds.c:127 +#: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "la famiglia di operatori \"%s\" non esiste per il metodo di accesso \"%s\"" -#: commands/opclasscmds.c:265 +#: commands/opclasscmds.c:267 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" -msgstr "la famiglia di operatori \"%s\" per il metodo di accesso \"%s\" esiste già " +msgstr "la famiglia di operatori \"%s\" per il metodo di accesso \"%s\" esiste già" -#: commands/opclasscmds.c:403 +#: commands/opclasscmds.c:416 #, c-format msgid "must be superuser to create an operator class" msgstr "devi essere un superutente per creare una classe di operatori" -#: commands/opclasscmds.c:476 commands/opclasscmds.c:850 -#: commands/opclasscmds.c:974 +#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 commands/opclasscmds.c:1056 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "numero di operatore %d non valido, deve essere tra 1 e %d" -#: commands/opclasscmds.c:520 commands/opclasscmds.c:894 -#: commands/opclasscmds.c:989 +#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 commands/opclasscmds.c:1072 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "numero di funzione %d non valido, deve essere tra 1 e %d" -#: commands/opclasscmds.c:549 +#: commands/opclasscmds.c:567 #, c-format msgid "storage type specified more than once" msgstr "tipo di immagazzinamento specificato più di una volta" -#: commands/opclasscmds.c:576 +#: commands/opclasscmds.c:594 #, c-format msgid "storage type cannot be different from data type for access method \"%s\"" msgstr "il tipo di immagazzinamento non deve essere diverso dal tipo di dato per il metodo di accesso \"%s\"" -#: commands/opclasscmds.c:592 +#: commands/opclasscmds.c:610 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "la classe di operatori \"%s\" per il metodo di accesso \"%s\" esiste già" -#: commands/opclasscmds.c:620 +#: commands/opclasscmds.c:638 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "non è stato possibile rendere la classe di operatori \"%s\" predefinita per il tipo %s" -#: commands/opclasscmds.c:623 +#: commands/opclasscmds.c:641 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "La classe di operatori \"%s\" è già predefinita." -#: commands/opclasscmds.c:748 +#: commands/opclasscmds.c:801 #, c-format msgid "must be superuser to create an operator family" msgstr "solo un superutente può creare una famiglia di operatori" -#: commands/opclasscmds.c:804 +#: commands/opclasscmds.c:861 #, c-format msgid "must be superuser to alter an operator family" msgstr "solo un superutente può modificare una famiglia di operatori" -#: commands/opclasscmds.c:859 +#: commands/opclasscmds.c:919 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "i tipi degli argomenti dell'operatore devono essere specificati in ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:922 +#: commands/opclasscmds.c:994 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "STORAGE non può essere specificato in ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:1044 +#: commands/opclasscmds.c:1128 #, c-format msgid "one or two argument types must be specified" msgstr "devono essere specificati uno due argomenti" -#: commands/opclasscmds.c:1070 +#: commands/opclasscmds.c:1154 #, c-format msgid "index operators must be binary" msgstr "gli operatori dell'indice devono essere binari" -#: commands/opclasscmds.c:1089 +#: commands/opclasscmds.c:1173 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "il metodo di accesso \"%s\" non supporta operatori di ordinamento" -#: commands/opclasscmds.c:1100 +#: commands/opclasscmds.c:1184 #, c-format msgid "index search operators must return boolean" msgstr "gli operatori di ricerca degli indici devono restituire un booleano" -#: commands/opclasscmds.c:1144 +#: commands/opclasscmds.c:1224 +#, c-format +msgid "associated data types for operator class options parsing functions must match opclass input type" +msgstr "i tipi di dati associati per le funzioni di analisi delle opzioni della classe dell'operatore devono corrispondere al tipo di input opclass" + +#: commands/opclasscmds.c:1231 +#, c-format +msgid "left and right associated data types for operator class options parsing functions must match" +msgstr "i tipi di dati associati a sinistra ea destra per le funzioni di analisi delle opzioni della classe dell'operatore devono corrispondere" + +#: commands/opclasscmds.c:1239 +#, c-format +msgid "invalid operator class options parsing function" +msgstr "funzione di analisi delle opzioni della classe dell'operatore non valida" + +#: commands/opclasscmds.c:1240 +#, c-format +msgid "Valid signature of operator class options parsing function is %s." +msgstr "La firma valida della funzione di analisi delle opzioni della classe dell'operatore è %s." + +#: commands/opclasscmds.c:1259 #, c-format msgid "btree comparison functions must have two arguments" msgstr "le funzioni di comparazioni btree devono avere due argomenti" -#: commands/opclasscmds.c:1148 +#: commands/opclasscmds.c:1263 #, c-format msgid "btree comparison functions must return integer" msgstr "le funzioni di comparazioni btree devono restituire un intero" -#: commands/opclasscmds.c:1165 +#: commands/opclasscmds.c:1280 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "le funzioni di supporto btree devono accettare il tipo \"internal\"" -#: commands/opclasscmds.c:1169 +#: commands/opclasscmds.c:1284 #, c-format msgid "btree sort support functions must return void" msgstr "le funzioni di supporto btree devono restituire void" -#: commands/opclasscmds.c:1180 +#: commands/opclasscmds.c:1295 #, c-format msgid "btree in_range functions must have five arguments" msgstr "le funzioni in_range btree devono avere cinque argomenti" -#: commands/opclasscmds.c:1184 +#: commands/opclasscmds.c:1299 #, c-format msgid "btree in_range functions must return boolean" msgstr "le funzioni in_range btree devono restituire un booleano" -#: commands/opclasscmds.c:1203 +#: commands/opclasscmds.c:1315 +#, c-format +msgid "btree equal image functions must have one argument" +msgstr "le funzioni btree equal image devono avere un argomento" + +#: commands/opclasscmds.c:1319 +#, c-format +msgid "btree equal image functions must return boolean" +msgstr "btree funzioni di immagine uguale devono restituire booleano" + +#: commands/opclasscmds.c:1332 +#, c-format +msgid "btree equal image functions must not be cross-type" +msgstr "le funzioni btree equal image non devono essere di tipo incrociato" + +#: commands/opclasscmds.c:1342 #, c-format msgid "hash function 1 must have one argument" msgstr "la funzione di hash 1 deve avere un solo argomento" -#: commands/opclasscmds.c:1207 +#: commands/opclasscmds.c:1346 #, c-format msgid "hash function 1 must return integer" msgstr "la funzione di hash 1 deve restituire un intero" -#: commands/opclasscmds.c:1214 +#: commands/opclasscmds.c:1353 #, c-format msgid "hash function 2 must have two arguments" msgstr "la funzione di hash 2 deve avere due argomenti" -#: commands/opclasscmds.c:1218 +#: commands/opclasscmds.c:1357 #, c-format msgid "hash function 2 must return bigint" msgstr "la funzione di hash 2 deve restituire un btree" -#: commands/opclasscmds.c:1243 +#: commands/opclasscmds.c:1382 #, c-format msgid "associated data types must be specified for index support function" msgstr "occorre specificare tipi di dati associati per le funzioni di supporto dell'indice" -#: commands/opclasscmds.c:1268 +#: commands/opclasscmds.c:1407 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "la funzione numero %d per (%s,%s) compare più di una volta" -#: commands/opclasscmds.c:1275 +#: commands/opclasscmds.c:1414 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "l'operatore numero %d per (%s,%s) compare più di una volta" -#: commands/opclasscmds.c:1324 +#: commands/opclasscmds.c:1460 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "l'operatore %d(%s,%s) esiste già nella famiglia di operatori \"%s\"" -#: commands/opclasscmds.c:1438 +#: commands/opclasscmds.c:1566 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "la funzione %d(%s,%s) esiste già nella famiglia di operatori \"%s\"" -#: commands/opclasscmds.c:1526 +#: commands/opclasscmds.c:1647 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "l'operatore %d(%s,%s) non esiste nella famiglia di operatori \"%s\"" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1687 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "la funzione %d(%s,%s) non esiste nella famiglia di operatori \"%s\"" -#: commands/opclasscmds.c:1696 +#: commands/opclasscmds.c:1718 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "la classe di operatori \"%s\" per il metodo di accesso \"%s\" esiste già nello schema \"%s\"" -#: commands/opclasscmds.c:1719 +#: commands/opclasscmds.c:1741 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "la famiglia di operatori \"%s\" per il metodo di accesso \"%s\" esiste già nello schema \"%s\"" -#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 +#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 #, c-format msgid "SETOF type not allowed for operator argument" -msgstr "il tipo SETOF non è permesso come argomento dell'operatore." +msgstr "il tipo SETOF non è permesso come argomento dell'operatore" -#: commands/operatorcmds.c:154 commands/operatorcmds.c:457 +#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "attributo dell'operatore \"%s\" non riconosciuto" -#: commands/operatorcmds.c:165 +#: commands/operatorcmds.c:163 #, c-format msgid "operator function must be specified" msgstr "la funzione dell'operatore deve essere specificata" -#: commands/operatorcmds.c:176 +#: commands/operatorcmds.c:181 +#, c-format +msgid "operator argument types must be specified" +msgstr "è necessario specificare i tipi di argomenti dell'operatore" + +#: commands/operatorcmds.c:185 +#, c-format +msgid "operator right argument type must be specified" +msgstr "è necessario specificare il tipo di argomento a destra dell'operatore" + +#: commands/operatorcmds.c:186 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "almeno uno tra leftarg e rightarg deve essere specificato" +msgid "Postfix operators are not supported." +msgstr "Gli operatori Postfix non sono supportati." -#: commands/operatorcmds.c:280 +#: commands/operatorcmds.c:290 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "la funzione di stima di restrizione %s deve restituire il tipo %s" -#: commands/operatorcmds.c:326 +#: commands/operatorcmds.c:333 +#, c-format +msgid "join estimator function %s has multiple matches" +msgstr "la funzione di stima dell'unione %s ha più corrispondenze" + +#: commands/operatorcmds.c:348 #, c-format msgid "join estimator function %s must return type %s" msgstr "la funzione di stima del join %s deve restituire il tipo %s" -#: commands/operatorcmds.c:451 +#: commands/operatorcmds.c:473 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "l'attributo dell'operatore \"%s\" non può essere cambiato" -#: commands/policy.c:87 commands/policy.c:400 commands/policy.c:490 -#: commands/tablecmds.c:1275 commands/tablecmds.c:1732 -#: commands/tablecmds.c:2718 commands/tablecmds.c:4951 -#: commands/tablecmds.c:7358 commands/tablecmds.c:13418 -#: commands/tablecmds.c:13453 commands/trigger.c:316 commands/trigger.c:1526 -#: commands/trigger.c:1635 rewrite/rewriteDefine.c:272 -#: rewrite/rewriteDefine.c:924 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1609 commands/tablecmds.c:2197 commands/tablecmds.c:3423 commands/tablecmds.c:6312 commands/tablecmds.c:9104 commands/tablecmds.c:17018 commands/tablecmds.c:17053 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 "permesso negato: \"%s\" è un catalogo di sistema" -#: commands/policy.c:170 +#: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "i ruoli specificati a parte PUBLIC verranno ignorati" -#: commands/policy.c:171 +#: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "TuttiTutti i ruoli sono membri del ruolo PUBLIC." -#: commands/policy.c:514 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "non è stato possibile rimuovere il ruolo \"%s\" dalla regola di sicurezza \"%s\" su \"%s\"" - -#: commands/policy.c:720 +#: commands/policy.c:607 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK non può essere applicato a SELECT o a DELETE" -#: commands/policy.c:729 commands/policy.c:1027 +#: commands/policy.c:616 commands/policy.c:921 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "solo le espressioni WITH CHECK sono consentite per INSERT" -#: commands/policy.c:802 commands/policy.c:1247 +#: commands/policy.c:691 commands/policy.c:1144 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "la regola di sicurezza \"%s\" per la tabella \"%s\" esiste già" -#: commands/policy.c:999 commands/policy.c:1275 commands/policy.c:1347 +#: 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 regola di sicurezza \"%s\" per la tabella \"%s\" non esiste" -#: commands/policy.c:1017 +#: commands/policy.c:911 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "solo le espressioni USING sono permesse per SELECT e DELETE" -#: commands/portalcmds.c:58 commands/portalcmds.c:182 commands/portalcmds.c:234 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "nome di cursore non valido: non deve essere vuoto" -#: commands/portalcmds.c:190 commands/portalcmds.c:244 -#: executor/execCurrent.c:69 utils/adt/xml.c:2469 utils/adt/xml.c:2639 +#: commands/portalcmds.c:72 +#, c-format +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "non è possibile creare un cursore CON ATTESA nell'operazione con limitazioni di sicurezza" + +#: 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 "il cursore \"%s\" non esiste" @@ -7891,2962 +8746,3268 @@ msgstr "il cursore \"%s\" non esiste" msgid "invalid statement name: must not be empty" msgstr "nome di istruzione non valido: non deve essere vuoto" -#: commands/prepare.c:141 parser/parse_param.c:304 tcop/postgres.c:1376 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "non è stato possibile determinare il tipo di dato del parametro $%d" - -#: commands/prepare.c:159 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "le istruzioni di utilità non possono essere preparate" - -#: commands/prepare.c:269 commands/prepare.c:274 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "l'istruzione preparata non è una SELECT" -#: commands/prepare.c:342 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "numero errato di parametri per l'istruzione preparata \"%s\"" -#: commands/prepare.c:344 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "Erano attesi %d parametri ma ottenuti %d." -#: commands/prepare.c:380 +#: commands/prepare.c:330 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "il parametro $%d di tipo %s non può essere forzato al tipo previsto %s" -#: commands/prepare.c:475 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "l'istruzione preparata \"%s\" esiste già" -#: commands/prepare.c:514 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "l'istruzione preparata \"%s\" non esiste" -#: commands/proclang.c:86 +#: commands/proclang.c:68 #, c-format -msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" -msgstr "vengono usate le informazioni di pg_pltemplate invece dei parametri di CREATE LANGUAGE" +msgid "must be superuser to create custom procedural language" +msgstr "solo i superutenti possono creare un linguaggio procedurale personalizzato" -#: commands/proclang.c:96 +#: commands/publicationcmds.c:128 #, c-format -msgid "must be superuser to create procedural language \"%s\"" -msgstr "solo i superutenti possono creare il linguaggio procedurale \"%s\"" +msgid "invalid list syntax for \"publish\" option" +msgstr "sintassi di lista errata per l'opzione \"publish\"" -#: commands/proclang.c:248 +#: commands/publicationcmds.c:146 #, c-format -msgid "unsupported language \"%s\"" -msgstr "linguaggio non supportato \"%s\"" +msgid "unrecognized \"publish\" value: \"%s\"" +msgstr "valore \"publish\" non valido: \"%s\"" -#: commands/proclang.c:250 +#: commands/publicationcmds.c:159 #, c-format -msgid "The supported languages are listed in the pg_pltemplate system catalog." -msgstr "I linguaggi supportati sono elencate nel catalogo di sistema pg_pltemplate" +msgid "unrecognized publication parameter: \"%s\"" +msgstr "parametro di pubblicazione non riconosciuto: \"%s\"" -#: commands/proclang.c:258 +#: commands/publicationcmds.c:200 #, c-format -msgid "must be superuser to create custom procedural language" -msgstr "solo i superutenti possono creare un linguaggio procedurale personalizzato" +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "nessuno schema è stato selezionato per CURRENT_SCHEMA" + +#: commands/publicationcmds.c:465 +msgid "User-defined types are not allowed." +msgstr "I tipi definiti dall'utente non sono consentiti." + +#: commands/publicationcmds.c:468 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Non sono consentite funzioni modificabili definite dall'utente o integrate." + +#: commands/publicationcmds.c:471 +msgid "User-defined collations are not allowed." +msgstr "Non sono consentite regole di confronto definite dall'utente." + +#: commands/publicationcmds.c:525 +msgid "System columns are not allowed." +msgstr "Le colonne di sistema non sono consentite." -#: commands/proclang.c:277 commands/trigger.c:688 commands/typecmds.c:454 -#: commands/typecmds.c:471 +#: commands/publicationcmds.c:532 commands/publicationcmds.c:537 commands/publicationcmds.c:554 +msgid "User-defined operators are not allowed." +msgstr "Gli operatori definiti dall'utente non sono consentiti." + +#: commands/publicationcmds.c:578 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "Sono consentiti solo colonne, costanti, operatori incorporati, tipi di dati incorporati, regole di confronto predefinite e funzioni predefinite non modificabili." + +#: commands/publicationcmds.c:592 #, c-format -msgid "changing return type of function %s from %s to %s" -msgstr "modifica del tipo restituito dalla funzione %s da %s a %s" +msgid "invalid publication WHERE expression" +msgstr "pubblicazione non valida WHERE espressione" -#: commands/publicationcmds.c:109 +#: commands/publicationcmds.c:645 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "sintassi di lista errata per l'opzione \"publish\"" +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "impossibile utilizzare la clausola WHERE di pubblicazione per la relazione \"%s\"" -#: commands/publicationcmds.c:127 +#: commands/publicationcmds.c:647 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "valore \"publish\" non valido: \"%s\"" +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "La clausola WHERE non può essere utilizzata per una tabella partizionata quando %s è false." + +#: commands/publicationcmds.c:709 +#, c-format +msgid "cannot use publication column list for relation \"%s.%s\"" +msgstr "impossibile utilizzare l'elenco delle colonne di pubblicazione per la relazione \"%s.%s\"" -#: commands/publicationcmds.c:133 +#: commands/publicationcmds.c:712 #, c-format -msgid "unrecognized publication parameter: %s" -msgstr "parametro di pubblicazione non valido: %s" +msgid "Column list cannot be specified if any schema is part of the publication or specified in the list." +msgstr "Non è possibile specificare l'elenco di colonne se uno schema fa parte della pubblicazione o è specificato nell'elenco." -#: commands/publicationcmds.c:166 +#: commands/publicationcmds.c:723 +#, c-format +msgid "cannot use publication column list for relation \"%s\"" +msgstr "impossibile utilizzare l'elenco delle colonne di pubblicazione per la relazione \"%s\"" + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column list cannot be used for a partitioned table when %s is false." +msgstr "Impossibile utilizzare l'elenco di colonne per una tabella partizionata quando %s è false." + +#: commands/publicationcmds.c:760 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "solo un superutente può creare una pubblicazione FOR ALL TABLES" -#: commands/publicationcmds.c:335 +#: commands/publicationcmds.c:833 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "deve essere superutente per creare la pubblicazione FOR TABLES IN SCHEMA" + +#: commands/publicationcmds.c:870 +#, c-format +msgid "wal_level is insufficient to publish logical changes" +msgstr "wal_level non è sufficiente per pubblicare le modifiche logiche" + +#: commands/publicationcmds.c:871 +#, c-format +msgid "Set wal_level to logical before creating subscriptions." +msgstr "Impostare wal_level su logical prima di creare le sottoscrizioni." + +#: commands/publicationcmds.c:968 commands/publicationcmds.c:976 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "impossibile impostare il parametro \"%s\" su false per la pubblicazione \"%s\"" + +#: commands/publicationcmds.c:971 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La pubblicazione contiene una clausola WHERE per la tabella partizionata \"%s\", che non è consentita quando \"%s\" è falso." + +#: commands/publicationcmds.c:979 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "La pubblicazione contiene un elenco di colonne per la tabella partizionata \"%s\", che non è consentita quando \"%s\" è false." + +#: commands/publicationcmds.c:1302 +#, c-format +msgid "cannot add schema to the publication" +msgstr "impossibile aggiungere lo schema alla pubblicazione" + +#: commands/publicationcmds.c:1303 +#, c-format +msgid "Schema cannot be added if any table that specifies column list is already part of the publication." +msgstr "Non è possibile aggiungere lo schema se una tabella che specifica l'elenco di colonne fa già parte della pubblicazione." + +#: commands/publicationcmds.c:1351 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "deve essere superutente per aggiungere o impostare schemi" + +#: commands/publicationcmds.c:1360 commands/publicationcmds.c:1368 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "la pubblicazione \"%s\" è definita come FOR ALL TABLES" -#: commands/publicationcmds.c:337 +#: commands/publicationcmds.c:1362 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "Gli schemi non possono essere aggiunti o eliminati dalle pubblicazioni FOR ALL TABLES." + +#: commands/publicationcmds.c:1370 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Non è possibile aggiungere o rimuovere tabelle da pubblicazioni FOR ALL TABLES." -#: commands/publicationcmds.c:638 +#: commands/publicationcmds.c:1596 commands/publicationcmds.c:1659 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "clausole WHERE in conflitto o ridondanti per la tabella \"%s\"" + +#: commands/publicationcmds.c:1603 commands/publicationcmds.c:1671 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "elenchi di colonne in conflitto o ridondanti per la tabella \"%s\"" + +#: commands/publicationcmds.c:1805 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "l'elenco delle colonne non deve essere specificato in ALTER PUBLICATION ... DROP" + +#: commands/publicationcmds.c:1817 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "la relazione \"%s\" non è parte di una pubblicazione" -#: commands/publicationcmds.c:681 +#: commands/publicationcmds.c:1824 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "non è possibile utilizzare una clausola WHERE durante la rimozione di una tabella da una pubblicazione" + +#: commands/publicationcmds.c:1884 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "le tabelle dello schema \"%s\" non fanno parte della pubblicazione" + +#: commands/publicationcmds.c:1927 commands/publicationcmds.c:1934 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "permesso negato per cambiare proprietario della pubblicazione \"%s\"" -#: commands/publicationcmds.c:683 +#: commands/publicationcmds.c:1929 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Il proprietario di una pubblicazione FOR ALL TABLES deve essere un superutente." -#: commands/schemacmds.c:106 commands/schemacmds.c:280 +#: commands/publicationcmds.c:1936 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "Il proprietario di una pubblicazione FOR TABLES IN SCHEMA deve essere un superutente." + +#: commands/schemacmds.c:105 commands/schemacmds.c:270 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "nome dello schema \"%s\" non accettabile" -#: commands/schemacmds.c:107 commands/schemacmds.c:281 +#: commands/schemacmds.c:106 commands/schemacmds.c:271 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "Il prefisso \"pg_\" è riservato agli schemi di sistema." -#: commands/schemacmds.c:121 +#: commands/schemacmds.c:130 #, c-format msgid "schema \"%s\" already exists, skipping" msgstr "lo schema \"%s\" esiste già, saltato" -#: commands/seclabel.c:60 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "nessun fornitore di etichette di sicurezza è stato caricato" -#: commands/seclabel.c:64 +#: commands/seclabel.c:135 #, c-format msgid "must specify provider when multiple security label providers have been loaded" msgstr "occorre specificare un fornitore quando più di un fornitore di etichette di sicurezza è stato caricato" -#: commands/seclabel.c:82 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "il fornitore di etichette di sicurezza \"%s\" non è stato caricato" -#: commands/sequence.c:138 +#: commands/seclabel.c:160 #, c-format -msgid "unlogged sequences are not supported" -msgstr "le sequenze non loggate non sono supportate" +msgid "security labels are not supported for this type of object" +msgstr "le etichette di sicurezza non sono supportate per questo tipo di oggetto" -#: commands/sequence.c:698 +#: commands/seclabel.c:193 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: è stato raggiunto il valore massimo della sequenza \"%s\" (%s)" +msgid "cannot set security label on relation \"%s\"" +msgstr "impossibile impostare l'etichetta di sicurezza sulla relazione \"%s\"" -#: commands/sequence.c:721 +#: commands/sequence.c:755 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: è stato raggiunto il valore minimo della sequenza \"%s\" (%s)" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: raggiunto il valore massimo della sequenza \"%s\" (%lld)" -#: commands/sequence.c:839 +#: commands/sequence.c:774 +#, c-format +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: reached minimum value of sequence \"%s\" (%lld)" + +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "il valore corrente della sequenza \"%s\" non è stato ancora definito in questa sessione" -#: commands/sequence.c:858 commands/sequence.c:864 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval non è stato ancora definito in questa sessione" -#: commands/sequence.c:952 +#: commands/sequence.c:997 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: il valore %s non rientra nei margini della sequenza \"%s\" (%s..%s)" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: il valore %lld è fuori dai limiti per la sequenza \"%s\" (%lld..%lld)" -#: commands/sequence.c:1349 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "opzione di sequenza SEQUENCE NAME non valido" -#: commands/sequence.c:1375 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "il tipo della colonna identità deve essere smallint, integer o bigint" -#: commands/sequence.c:1376 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "il tipo della sequenza deve essere smallint, integer o bigint" -#: commands/sequence.c:1410 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT non può essere zero" -#: commands/sequence.c:1463 +#: commands/sequence.c:1474 #, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) è al di fuori dell'intervallo consentito per il tipo di dati della sequenza %s" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) non è compreso nell'intervallo per il tipo di dati della sequenza %s" -#: commands/sequence.c:1500 +#: commands/sequence.c:1506 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MINVALUE (%s) è al di fuori dell'intervallo consentito per il tipo di dati della sequenza %s" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) non è compreso nell'intervallo per il tipo di dati della sequenza %s" #: commands/sequence.c:1514 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s) deve essere minore del MAXVALUE (%s)" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld) deve essere inferiore a MAXVALUE (%lld)" -#: commands/sequence.c:1541 +#: commands/sequence.c:1535 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "il valore di START (%s) non può essere inferiore a quello di MINVALUE (%s)" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "Il valore START (%lld) non può essere inferiore a MINVALUE (%lld)" -#: commands/sequence.c:1553 +#: commands/sequence.c:1541 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "il valore di START (%s) non può essere superiore a quello di MAXVALUE (%s)" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "Il valore START (%lld) non può essere maggiore di MAXVALUE (%lld)" -#: commands/sequence.c:1583 +#: commands/sequence.c:1565 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "il valore di RESTART (%s) non può essere inferiore a quello di MINVALUE (%s)" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "Il valore RESTART (%lld) non può essere inferiore a MINVALUE (%lld)" -#: commands/sequence.c:1595 +#: commands/sequence.c:1571 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "il valore di RESTART (%s) non può essere superiore a quello di MAXVALUE (%s)" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "Il valore RESTART (%lld) non può essere maggiore di MAXVALUE (%lld)" -#: commands/sequence.c:1610 +#: commands/sequence.c:1582 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) dev'essere maggiore di zero" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) deve essere maggiore di zero" -#: commands/sequence.c:1647 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "opzione OWNED BY non valida" -#: commands/sequence.c:1648 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Specifica OWNED BY tabella.colonna oppure OWNED BY NONE." -#: commands/sequence.c:1673 +#: commands/sequence.c:1644 #, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "la relazione referenziata \"%s\" non è una tabella né una tabella esterna" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "la sequenza non può essere di proprietà della relazione \"%s\"" -#: commands/sequence.c:1680 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "la sequenza deve avere lo stesso proprietario della tabella a cui è collegata" -#: commands/sequence.c:1684 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "la sequenza deve essere nello stesso schema della tabella a cui è collegata" -#: commands/sequence.c:1706 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "non è possibile cambiare proprietario di una sequenza identità" -#: commands/sequence.c:1707 commands/tablecmds.c:10319 -#: commands/tablecmds.c:12881 +#: commands/sequence.c:1679 commands/tablecmds.c:13787 commands/tablecmds.c:16443 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La sequenza \"%s\" è collegata alla tabella \"%s\"." -#: commands/statscmds.c:93 commands/statscmds.c:102 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "solo una relazione singola è permessa in CREATE STATISTICS" -#: commands/statscmds.c:120 +#: commands/statscmds.c:136 #, c-format -msgid "relation \"%s\" is not a table, foreign table, or materialized view" -msgstr "la relazione \"%s\" non è una tabella, una tabella esterna o una vista materializzata" +msgid "cannot define statistics for relation \"%s\"" +msgstr "impossibile definire le statistiche per la relazione \"%s\"" -#: commands/statscmds.c:163 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "la statistica \"%s\" esiste già, saltata" -#: commands/statscmds.c:171 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "la statistica \"%s\" esiste già" -#: commands/statscmds.c:193 commands/statscmds.c:199 +#: commands/statscmds.c:210 #, c-format -msgid "only simple column references are allowed in CREATE STATISTICS" -msgstr "solo riferimenti a colonne semplici sono consentiti in CREATE STATISTICS" +msgid "cannot have more than %d columns in statistics" +msgstr "non è possibile avere più di %d colonne in una statistica" -#: commands/statscmds.c:214 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "la creazione di statistiche su colonne di sistema non è supportata" -#: commands/statscmds.c:221 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "la colonna \"%s\" non può essere usata in una statistica perché il suo tipo %s non ha una classe di operatori btree definita" -#: commands/statscmds.c:228 +#: commands/statscmds.c:325 #, c-format -msgid "cannot have more than %d columns in statistics" -msgstr "non è possibile avere più di %d colonne in una statistica" +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "l'espressione non può essere utilizzata nelle statistiche multivariate perché il suo tipo %s non ha una classe di operatori btree predefinita" + +#: commands/statscmds.c:346 +#, c-format +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "quando si creano statistiche su una singola espressione, i tipi di statistiche potrebbero non essere specificati" + +#: commands/statscmds.c:375 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "tipo di statistica \"%s\" sconosciuto" -#: commands/statscmds.c:243 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "una statistica estesa richiede almeno due colonne" -#: commands/statscmds.c:261 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "nome di colonna duplicato nella definizione della statistica" -#: commands/statscmds.c:289 +#: commands/statscmds.c:457 #, c-format -msgid "unrecognized statistics kind \"%s\"" -msgstr "tipo di statistica \"%s\" sconosciuto" +msgid "duplicate expression in statistics definition" +msgstr "espressione duplicata nella definizione statistica" -#: commands/subscriptioncmds.c:187 +#: commands/statscmds.c:620 commands/tablecmds.c:8072 #, c-format -msgid "unrecognized subscription parameter: %s" -msgstr "parametro di sottoscrizione sconosciuto: %s" +msgid "statistics target %d is too low" +msgstr "il target delle statistiche %d è troppo basso" -#: commands/subscriptioncmds.c:200 +#: commands/statscmds.c:628 commands/tablecmds.c:8080 #, c-format -msgid "connect = false and enabled = true are mutually exclusive options" -msgstr "connect = false ed enabled = true sono opzioni mutuamente esclusive" +msgid "lowering statistics target to %d" +msgstr "target delle statistiche abbassato a %d" -#: commands/subscriptioncmds.c:205 +#: commands/statscmds.c:651 #, c-format -msgid "connect = false and create_slot = true are mutually exclusive options" -msgstr "connect = false e create_slot = true sono opzioni mutuamente esclusive" +msgid "statistics object \"%s.%s\" does not exist, skipping" +msgstr "l'oggetto statistiche \"%s.%s\" non esiste, sto saltando" -#: commands/subscriptioncmds.c:210 +#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 #, c-format -msgid "connect = false and copy_data = true are mutually exclusive options" -msgstr "connect = false e copy_data = true sono opzioni mutuamente esclusive" +msgid "unrecognized subscription parameter: \"%s\"" +msgstr "parametro di sottoscrizione non riconosciuto: \"%s\"" -#: commands/subscriptioncmds.c:227 +#: commands/subscriptioncmds.c:289 #, c-format -msgid "slot_name = NONE and enabled = true are mutually exclusive options" -msgstr "slot_name = NONE ed enabled = true sono opzioni mutuamente esclusive" +msgid "invalid WAL location (LSN): %s" +msgstr "posizione WAL (LSN) non valida: %s" -#: commands/subscriptioncmds.c:232 +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 commands/subscriptioncmds.c:365 #, c-format -msgid "slot_name = NONE and create_slot = true are mutually exclusive options" -msgstr "slot_name = NONE e create_slot = true sono opzioni mutuamente esclusive" +msgid "%s and %s are mutually exclusive options" +msgstr "%s e %s sono opzioni che si escludono a vicenda" -#: commands/subscriptioncmds.c:237 +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format -msgid "subscription with slot_name = NONE must also set enabled = false" -msgstr "una sottoscrizione con slot_name = NONE deve avere anche enabled = false" +msgid "subscription with %s must also set %s" +msgstr "anche l'abbonamento con %s deve impostare %s" -#: commands/subscriptioncmds.c:242 +#: commands/subscriptioncmds.c:433 #, c-format -msgid "subscription with slot_name = NONE must also set create_slot = false" -msgstr "una sottoscrizione con slot_name = NONE deve avere anche create_slot = false" +msgid "could not receive list of publications from the publisher: %s" +msgstr "impossibile ricevere l'elenco delle pubblicazioni dall'editore: %s" -#: commands/subscriptioncmds.c:283 +#: commands/subscriptioncmds.c:465 #, c-format -msgid "publication name \"%s\" used more than once" -msgstr "nome di pubblicazione \"%s\" usato più di una volta" +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "la pubblicazione %s non esiste nell'editore" +msgstr[1] "le pubblicazioni %s non esistono nell'editore" -#: commands/subscriptioncmds.c:347 +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "occorre essere un superutente per creare sottoscrizioni" -#: commands/subscriptioncmds.c:427 commands/subscriptioncmds.c:520 -#: replication/logical/tablesync.c:856 replication/logical/worker.c:1722 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 replication/logical/tablesync.c:1229 replication/logical/worker.c:3722 #, c-format msgid "could not connect to the publisher: %s" msgstr "connessione alla pubblicazione fallita: %s" -#: commands/subscriptioncmds.c:469 +#: commands/subscriptioncmds.c:717 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "creazione dello slot di replica \"%s\" sulla pubblicazione" -#: commands/subscriptioncmds.c:486 -#, c-format -msgid "tables were not subscribed, you will have to run ALTER SUBSCRIPTION ... REFRESH PUBLICATION to subscribe the tables" -msgstr "le tabelle non sono state sottoscritte, è necessario eseguire ALTER SUBSCRIPTION ... REFRESH PUBLICATION per sottoscrivere le tabelle" - -#: commands/subscriptioncmds.c:576 +#. translator: %s is an SQL ALTER statement +#: commands/subscriptioncmds.c:730 #, c-format -msgid "table \"%s.%s\" added to subscription \"%s\"" -msgstr "tabella \"%s.%s\" aggiunta alla sottoscrizione \"%s\"" +msgid "tables were not subscribed, you will have to run %s to subscribe the tables" +msgstr "i tavoli non sono stati iscritti, dovrai eseguire %s per iscriverti ai tavoli" -#: commands/subscriptioncmds.c:600 +#: commands/subscriptioncmds.c:1033 #, c-format -msgid "table \"%s.%s\" removed from subscription \"%s\"" -msgstr "tabella \"%s.%s\" rimossa dalla sottoscrizione \"%s\"" +msgid "cannot set %s for enabled subscription" +msgstr "impossibile impostare %s per l'abbonamento abilitato" -#: commands/subscriptioncmds.c:669 -#, c-format -msgid "cannot set slot_name = NONE for enabled subscription" -msgstr "non è possibile impostare slot_name = NONE per le sottoscrizioni attive" - -#: commands/subscriptioncmds.c:703 +#: commands/subscriptioncmds.c:1086 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "non è possibile abilitare una sottoscrizione che non ha un nome di slot" -#: commands/subscriptioncmds.c:749 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1181 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION con refresh non consentito per sottoscrizioni disabilitate" -#: commands/subscriptioncmds.c:750 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1182 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Usa ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:768 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1191 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION con refresh e copy_data non è consentito quando two_phase è abilitato" + +#: commands/subscriptioncmds.c:1140 commands/subscriptioncmds.c:1192 +#, c-format +msgid "Use ALTER SUBSCRIPTION ...SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Utilizzare ALTER SUBSCRIPTION ...SET PUBLICATION con refresh = false o con copy_data = false oppure utilizzare DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1212 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH non è consentito per sottoscrizioni disabilitate" -#: commands/subscriptioncmds.c:847 +#: commands/subscriptioncmds.c:1237 #, c-format -msgid "subscription \"%s\" does not exist, skipping" -msgstr "la sottoscrizione \"%s\" non esiste, saltata" +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH con copy_data non è consentito quando two_phase è abilitato" -#: commands/subscriptioncmds.c:972 +#: commands/subscriptioncmds.c:1238 #, c-format -msgid "could not connect to publisher when attempting to drop the replication slot \"%s\"" -msgstr "non è possibile connettersi alla pubblicazione mentre si sta eliminando lo slot di replica \"%s\"" +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Usa ALTER SUBSCRIPTION ... AGGIORNA con copy_data = false oppure usa DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:974 commands/subscriptioncmds.c:988 -#: replication/logical/tablesync.c:905 replication/logical/tablesync.c:927 +#: commands/subscriptioncmds.c:1258 #, c-format -msgid "The error was: %s" -msgstr "L'errore è stato: %s" +msgid "must be superuser to skip transaction" +msgstr "deve essere superutente per saltare la transazione" -#: commands/subscriptioncmds.c:975 +#: commands/subscriptioncmds.c:1278 #, c-format -msgid "Use ALTER SUBSCRIPTION ... SET (slot_name = NONE) to disassociate the subscription from the slot." -msgstr "Usa ALTER SUBSCRIPTION ... SET (slot_name = NONE) per disassociare la sottoscrizione dallo slot." +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "ignora la posizione WAL (LSN %X/%X) deve essere maggiore dell'origine LSN %X/%X" -#: commands/subscriptioncmds.c:986 +#: commands/subscriptioncmds.c:1358 #, c-format -msgid "could not drop the replication slot \"%s\" on publisher" -msgstr "eliminazione dello slot di replica \"%s\" sulla pubblicazione fallita" +msgid "subscription \"%s\" does not exist, skipping" +msgstr "la sottoscrizione \"%s\" non esiste, saltata" -#: commands/subscriptioncmds.c:991 +#: commands/subscriptioncmds.c:1616 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "eliminazione dello slot di replica \"%s\" sulla pubblicazione" -#: commands/subscriptioncmds.c:1032 +#: commands/subscriptioncmds.c:1625 commands/subscriptioncmds.c:1633 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "impossibile eliminare lo slot di replica \"%s\" sull'editore: %s" + +#: commands/subscriptioncmds.c:1667 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "permesso negato nel cambiare il proprietario della sottoscrizione \"%s\"" -#: commands/subscriptioncmds.c:1034 +#: commands/subscriptioncmds.c:1669 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "Il proprietario della sottoscrizione deve essere un superutente." -#: commands/subscriptioncmds.c:1147 +#: commands/subscriptioncmds.c:1783 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "errore nell'ottenere la lista delle tabelle replicate dalla pubblicazione: %s" -#: commands/tablecmds.c:223 commands/tablecmds.c:265 +#: commands/subscriptioncmds.c:1805 replication/logical/tablesync.c:809 replication/pgoutput/pgoutput.c:1062 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "non è possibile utilizzare elenchi di colonne diversi per la tabella \"%s.%s\" in pubblicazioni diverse" + +#: commands/subscriptioncmds.c:1855 +#, c-format +msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" +msgstr "impossibile connettersi al publisher durante il tentativo di eliminare lo slot di replica \"%s\": %s" + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1858 +#, c-format +msgid "Use %s to disassociate the subscription from the slot." +msgstr "Usa %s per dissociare l'abbonamento dallo slot." + +#: commands/subscriptioncmds.c:1888 +#, c-format +msgid "publication name \"%s\" used more than once" +msgstr "nome di pubblicazione \"%s\" usato più di una volta" + +#: commands/subscriptioncmds.c:1932 +#, c-format +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "la pubblicazione \"%s\" è già in sottoscrizione \"%s\"" + +#: commands/subscriptioncmds.c:1946 +#, c-format +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "la pubblicazione \"%s\" non è nella sottoscrizione \"%s\"" + +#: commands/subscriptioncmds.c:1957 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "non può eliminare tutte le pubblicazioni da un abbonamento" + +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "la tabella \"%s\" non esiste" -#: commands/tablecmds.c:224 commands/tablecmds.c:266 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "la tabella \"%s\" non esiste, saltata" -#: commands/tablecmds.c:226 commands/tablecmds.c:268 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "Usa DROP TABLE per eliminare una tabella." -#: commands/tablecmds.c:229 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "la sequenza \"%s\" non esiste" -#: commands/tablecmds.c:230 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "la sequenza \"%s\" non esiste, saltata" -#: commands/tablecmds.c:232 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Usa DROP SEQUENCE per eliminare una sequenza." -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "la vista \"%s\" non esiste" -#: commands/tablecmds.c:236 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "la vista \"%s\" non esiste, saltata" -#: commands/tablecmds.c:238 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "Usa DROP VIEW per eliminare una vista." -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "la vista materializzata \"%s\" non esiste" -#: commands/tablecmds.c:242 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "la vista materializzata \"%s\" non esiste, saltata" -#: commands/tablecmds.c:244 +#: commands/tablecmds.c:266 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Usa DROP MATERIALIZED VIEW per rimuovere una vista materializzata." -#: commands/tablecmds.c:247 commands/tablecmds.c:271 commands/tablecmds.c:14793 -#: parser/parse_utilcmd.c:1984 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:18930 parser/parse_utilcmd.c:2260 #, c-format msgid "index \"%s\" does not exist" msgstr "l'indice \"%s\" non esiste" -#: commands/tablecmds.c:248 commands/tablecmds.c:272 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "l'indice \"%s\" non esiste, saltato" -#: commands/tablecmds.c:250 commands/tablecmds.c:274 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "Usa DROP INDEX per eliminare un indice." -#: commands/tablecmds.c:255 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" non è un tipo" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "Usa DROP TYPE per eliminare un tipo." -#: commands/tablecmds.c:259 commands/tablecmds.c:9763 -#: commands/tablecmds.c:12661 +#: commands/tablecmds.c:281 commands/tablecmds.c:13626 commands/tablecmds.c:16146 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "la tabella esterna \"%s\" non esiste" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "la tabella esterna \"%s\" non esiste, saltata" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Usa DROP FOREIGN TABLE per eliminare una tabella esterna." -#: commands/tablecmds.c:554 +#: commands/tablecmds.c:697 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT può essere usato solo con le tabelle temporanee" -#: commands/tablecmds.c:582 +#: commands/tablecmds.c:728 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "non è possibile creare la tabella temporanea nell'ambito di operazioni a sicurezza ristretta" -#: commands/tablecmds.c:683 +#: commands/tablecmds.c:764 commands/tablecmds.c:14933 +#, c-format +msgid "relation \"%s\" would be inherited from more than once" +msgstr "la relazione \"%s\" sarebbe ereditata più di una volta" + +#: commands/tablecmds.c:949 #, c-format -msgid "cannot create table with OIDs as partition of table without OIDs" -msgstr "non è possibile creare una tabella con OID come partizione di una tabella senza OID" +msgid "specifying a table access method is not supported on a partitioned table" +msgstr "la specifica di un metodo di accesso alla tabella non è supportata su una tabella partizionata" -#: commands/tablecmds.c:807 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" non è partizionata" -#: commands/tablecmds.c:888 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "non è possibile partizionare usando più di %d colonne" -#: commands/tablecmds.c:1095 +#: commands/tablecmds.c:1193 +#, c-format +msgid "cannot create foreign partition of partitioned table \"%s\"" +msgstr "impossibile creare una partizione esterna della tabella partizionata \"%s\"" + +#: commands/tablecmds.c:1195 +#, c-format +msgid "Table \"%s\" contains indexes that are unique." +msgstr "La tabella \"%s\" contiene indici univoci." + +#: commands/tablecmds.c:1358 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY non supporta l'eliminazione di più di un oggetto" -#: commands/tablecmds.c:1099 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY non supporta CASCADE" -#: commands/tablecmds.c:1381 +#: commands/tablecmds.c:1466 +#, c-format +msgid "cannot drop partitioned index \"%s\" concurrently" +msgstr "impossibile eliminare l'indice partizionato \"%s\" contemporaneamente" + +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "non è possibile troncare solo una tabella partizionata" -#: commands/tablecmds.c:1382 +#: commands/tablecmds.c:1755 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Non specificare la parola chiave ONLY, oppure usa TRUNCATE ONLY sulle partizioni direttamente." -#: commands/tablecmds.c:1451 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "truncate si propaga in cascata alla tabella \"%s\"" -#: commands/tablecmds.c:1742 +#: commands/tablecmds.c:2177 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "impossibile troncare la tabella esterna \"%s\"" + +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "non è possibile troncare tabelle temporanee di altre sessioni" -#: commands/tablecmds.c:1973 commands/tablecmds.c:11412 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14830 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "non è possibile ereditare dalla tabella partizionata \"%s\"" -#: commands/tablecmds.c:1978 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "non è possibile ereditare dalla partizione \"%s\"" -#: commands/tablecmds.c:1986 parser/parse_utilcmd.c:2201 -#: parser/parse_utilcmd.c:2324 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2490 parser/parse_utilcmd.c:2632 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "la relazione ereditata \"%s\" non è una tabella o tabella esterna" -#: commands/tablecmds.c:1998 +#: commands/tablecmds.c:2487 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "non è possibile creare una relazione temporanea come partizione della relazione permanente \"%s\"" -#: commands/tablecmds.c:2007 commands/tablecmds.c:11391 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14809 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "non è possibile ereditare dalla relazione temporanea \"%s\"" -#: commands/tablecmds.c:2017 commands/tablecmds.c:11399 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14817 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "non è possibile ereditare da una relazione temporanea di un'altra sessione" -#: commands/tablecmds.c:2034 commands/tablecmds.c:11523 -#, c-format -msgid "relation \"%s\" would be inherited from more than once" -msgstr "la relazione \"%s\" sarebbe ereditata più di una volta" - -#: commands/tablecmds.c:2083 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "unione delle definizioni multiple ereditate della colonna \"%s\"" -#: commands/tablecmds.c:2091 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "la colonna ereditata \"%s\" ha un conflitto di tipo" -#: commands/tablecmds.c:2093 commands/tablecmds.c:2116 -#: commands/tablecmds.c:2322 commands/tablecmds.c:2352 -#: parser/parse_coerce.c:1716 parser/parse_coerce.c:1736 -#: parser/parse_coerce.c:1756 parser/parse_coerce.c:1802 -#: parser/parse_coerce.c:1841 parser/parse_param.c:218 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 commands/tablecmds.c:2610 commands/tablecmds.c:2866 commands/tablecmds.c:2896 commands/tablecmds.c:2910 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 "tra %s e %s" -#: commands/tablecmds.c:2102 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "la colonna ereditata \"%s\" ha un conflitto di ordinamento" -#: commands/tablecmds.c:2104 commands/tablecmds.c:2334 -#: commands/tablecmds.c:5411 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 commands/tablecmds.c:6752 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "tra \"%s\" e \"%s\"" -#: commands/tablecmds.c:2114 +#: commands/tablecmds.c:2591 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "la colonna ereditata \"%s\" ha un conflitto di parametro di memorizzazione" -#: commands/tablecmds.c:2228 commands/tablecmds.c:9271 -#: parser/parse_utilcmd.c:1117 parser/parse_utilcmd.c:1517 -#: parser/parse_utilcmd.c:1624 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "la colonna \"%s\" presenta un conflitto di metodi di compressione" + +#: commands/tablecmds.c:2623 +#, c-format +msgid "inherited column \"%s\" has a generation conflict" +msgstr "la colonna ereditata \"%s\" presenta un conflitto di generazione" + +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 commands/tablecmds.c:12350 parser/parse_utilcmd.c:1301 parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1753 parser/parse_utilcmd.c:1861 #, c-format msgid "cannot convert whole-row table reference" msgstr "non è possibile convertire riferimenti ad una riga intera di tabella" -#: commands/tablecmds.c:2229 parser/parse_utilcmd.c:1118 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1302 +#, c-format +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "L'espressione di generazione per la colonna \"%s\" contiene un riferimento di riga intera alla tabella \"%s\"." + +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1345 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Il vincolo \"%s\" contiene un riferimento alla riga intera alla tabella \"%s\"." -#: commands/tablecmds.c:2308 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "unione della colonna \"%s\" con la definizione ereditata" -#: commands/tablecmds.c:2312 +#: commands/tablecmds.c:2856 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "spostamento e unione della colonna \"%s\" con la definizione ereditata" -#: commands/tablecmds.c:2313 +#: commands/tablecmds.c:2857 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Colonna specificata dall'utente spostata nella posizione della colonna ereditata." -#: commands/tablecmds.c:2320 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la colonna \"%s\" ha un conflitto di tipi" -#: commands/tablecmds.c:2332 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la colonna \"%s\" ha un conflitto di ordinamento" -#: commands/tablecmds.c:2350 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "la colonna \"%s\" ha un conflitto di parametri di memorizzazione" -#: commands/tablecmds.c:2461 +#: commands/tablecmds.c:2935 +#, c-format +msgid "child column \"%s\" specifies generation expression" +msgstr "la colonna figlio \"%s\" specifica l'espressione di generazione" + +#: commands/tablecmds.c:2937 +#, 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 "Omettere l'espressione di generazione nella definizione della colonna della tabella figlio per ereditare l'espressione di generazione dalla tabella padre." + +#: commands/tablecmds.c:2941 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "la colonna \"%s\" eredita dalla colonna generata ma specifica il valore predefinito" + +#: commands/tablecmds.c:2946 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "la colonna \"%s\" eredita dalla colonna generata ma specifica l'identità" + +#: commands/tablecmds.c:3055 +#, c-format +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "la colonna \"%s\" eredita le espressioni di generazione in conflitto" + +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la colonna \"%s\" eredita valori predefiniti in conflitto tra loro" -#: commands/tablecmds.c:2463 +#: commands/tablecmds.c:3062 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Per risolvere il conflitto, specificare esplicitamente un valore predefinito." -#: commands/tablecmds.c:2510 +#: commands/tablecmds.c:3108 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "il nome del vincolo di controllo \"%s\" compare più di una volta ma con espressioni diverse" -#: commands/tablecmds.c:2687 +#: commands/tablecmds.c:3321 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "non è possibile spostare tabelle temporanee di altre sessioni" + +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "non è possibile rinominare la colonna di una tabella con tipo" -#: commands/tablecmds.c:2706 +#: commands/tablecmds.c:3410 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" -msgstr "\"%s\" non è una tabella, vista, vista materializzata, tipo composito, indice né una tabella esterna" +msgid "cannot rename columns of relation \"%s\"" +msgstr "impossibile rinominare le colonne della relazione \"%s\"" -#: commands/tablecmds.c:2800 +#: commands/tablecmds.c:3505 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "la colonna ereditata \"%s\" dev'essere rinominata anche nelle tabelle figlie" -#: commands/tablecmds.c:2832 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "non è possibile rinominare la colonna di sistema \"%s\"" -#: commands/tablecmds.c:2847 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "non è possibile rinominare la colonna ereditata \"%s\"" -#: commands/tablecmds.c:2999 +#: commands/tablecmds.c:3704 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "i vincoli ereditati \"%s\" devono essere rinominati anche nelle tabelle figlie" -#: commands/tablecmds.c:3006 +#: commands/tablecmds.c:3711 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "non è possibile rinominare il vincolo ereditato \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3225 +#: commands/tablecmds.c:4008 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "non è possibile effettuare %s \"%s\" perché è in uso da query attive in questa sessione" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3235 +#: commands/tablecmds.c:4017 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "non è possibile effettuare %s \"%s\" perché ha eventi trigger in sospeso" -#: commands/tablecmds.c:4379 -#, c-format -msgid "cannot rewrite system relation \"%s\"" -msgstr "non è possibile riscrivere la relazione di sistema \"%s\"" - -#: commands/tablecmds.c:4385 -#, c-format -msgid "cannot rewrite table \"%s\" used as a catalog table" -msgstr "non è possibile riscrivere la tabella \"%s\" usata come tabella di catalogo" - -#: commands/tablecmds.c:4395 -#, c-format -msgid "cannot rewrite temporary tables of other sessions" -msgstr "non è possibile riscrivere tabelle temporanee di altre sessioni" - -#: commands/tablecmds.c:4672 -#, c-format -msgid "rewriting table \"%s\"" -msgstr "riscrittura della tabella \"%s\"" - -#: commands/tablecmds.c:4676 -#, c-format -msgid "verifying table \"%s\"" -msgstr "verifica della tabella \"%s\"" - -#: commands/tablecmds.c:4792 -#, c-format -msgid "column \"%s\" contains null values" -msgstr "la colonna \"%s\" contiene valori null" - -#: commands/tablecmds.c:4808 commands/tablecmds.c:8505 +#: commands/tablecmds.c:4486 #, c-format -msgid "check constraint \"%s\" is violated by some row" -msgstr "il vincolo di controllo \"%s\" è violato da alcune righe" +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "impossibile modificare la partizione \"%s\" con un distacco incompleto" -#: commands/tablecmds.c:4826 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format -msgid "updated partition constraint for default partition would be violated by some row" -msgstr "il nuovo vincolo di partizione per la partizione di default verrebbe violato da alcune righe" +msgid "cannot change persistence setting twice" +msgstr "non è possibile modificare l'impostazione della persistenza due volte" -#: commands/tablecmds.c:4830 +#: commands/tablecmds.c:4715 #, c-format -msgid "partition constraint is violated by some row" -msgstr "il vincolo di partizione è violato da qualche riga" +msgid "cannot change access method of a partitioned table" +msgstr "impossibile modificare il metodo di accesso di una tabella partizionata" -#: commands/tablecmds.c:4972 commands/trigger.c:310 rewrite/rewriteDefine.c:266 -#: rewrite/rewriteDefine.c:919 +#: commands/tablecmds.c:4721 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\" non è una tabella né una vista" +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "non può avere più sottocomandi SET ACCESS METHOD" -#: commands/tablecmds.c:4975 commands/trigger.c:1520 commands/trigger.c:1626 +#: commands/tablecmds.c:5476 #, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "\"%s\" non è una tabella, una vista né una tabella esterna" +msgid "cannot rewrite system relation \"%s\"" +msgstr "non è possibile riscrivere la relazione di sistema \"%s\"" -#: commands/tablecmds.c:4978 +#: commands/tablecmds.c:5482 #, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\" non è una tabella, una vista, una vista materializzata né un indice" +msgid "cannot rewrite table \"%s\" used as a catalog table" +msgstr "non è possibile riscrivere la tabella \"%s\" usata come tabella di catalogo" -#: commands/tablecmds.c:4984 +#: commands/tablecmds.c:5492 #, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" non è una tabella, una vista materializzata né un indice" +msgid "cannot rewrite temporary tables of other sessions" +msgstr "non è possibile riscrivere tabelle temporanee di altre sessioni" -#: commands/tablecmds.c:4987 +#: commands/tablecmds.c:5986 #, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\" non è una tabella, una vista materializzata né una tabella esterna" +msgid "column \"%s\" of relation \"%s\" contains null values" +msgstr "la colonna \"%s\" della relazione \"%s\" contiene valori null" -#: commands/tablecmds.c:4990 +#: commands/tablecmds.c:6003 #, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" non è una tabella né una tabella esterna" +msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" +msgstr "controlla il vincolo \"%s\" della relazione \"%s\" è violato da qualche riga" -#: commands/tablecmds.c:4993 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" non è una tabella, un tipo composito né una tabella esterna" +msgid "updated partition constraint for default partition \"%s\" would be violated by some row" +msgstr "il nuovo vincolo di partizione per la partizione di default \"%s\" verrebbe violato da alcune righe" -#: commands/tablecmds.c:4996 commands/tablecmds.c:6414 +#: commands/tablecmds.c:6028 #, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "\"%s\" non è una tabella, una vista materializzata, un indice né una tabella esterna" +msgid "partition constraint of relation \"%s\" is violated by some row" +msgstr "il vincolo di partizione della relazione \"%s\" è violato da alcune righe" -#: commands/tablecmds.c:5006 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "\"%s\" è del tipo sbagliato" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "Impossibile eseguire l'azione ALTER %s sulla relazione \"%s\"" -#: commands/tablecmds.c:5181 commands/tablecmds.c:5188 +#: commands/tablecmds.c:6510 commands/tablecmds.c:6517 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "non è possibile modificare il tipo \"%s\" perché la colonna \"%s.%s\" lo usa" -#: commands/tablecmds.c:5195 +#: commands/tablecmds.c:6524 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "non è possibile modificare la tabella esterna \"%s\" perché la colonna \"%s.%s\" usa il suo tipo di riga" -#: commands/tablecmds.c:5202 +#: commands/tablecmds.c:6531 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "non è possibile modificare la tabella \"%s\" perché la colonna \"%s.%s\" usa il suo tipo di riga" -#: commands/tablecmds.c:5256 +#: commands/tablecmds.c:6587 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "non è possibile modificare il tipo \"%s\" perché è il tipo di una tabella con tipo" -#: commands/tablecmds.c:5258 +#: commands/tablecmds.c:6589 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Usa DROP ... CASCADE per eliminare anche le tabelle con tipo." -#: commands/tablecmds.c:5304 +#: commands/tablecmds.c:6635 #, c-format msgid "type %s is not a composite type" msgstr "il tipo %s non è un tipo composito" -#: commands/tablecmds.c:5330 +#: commands/tablecmds.c:6662 #, c-format msgid "cannot add column to typed table" msgstr "non è possibile aggiungere una colonna ad una tabella con tipo" -#: commands/tablecmds.c:5374 +#: commands/tablecmds.c:6715 #, c-format msgid "cannot add column to a partition" msgstr "non è possibile aggiungere una colonna ad una partizione" -#: commands/tablecmds.c:5403 commands/tablecmds.c:11650 +#: commands/tablecmds.c:6744 commands/tablecmds.c:15060 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "la tabella figlia \"%s\" ha tipo diverso per la colonna \"%s\"" -#: commands/tablecmds.c:5409 commands/tablecmds.c:11657 +#: commands/tablecmds.c:6750 commands/tablecmds.c:15067 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "la tabella figlia \"%s\" ha ordinamento diverso per la colonna \"%s\"" -#: commands/tablecmds.c:5419 -#, c-format -msgid "child table \"%s\" has a conflicting \"%s\" column" -msgstr "la tabella figlia \"%s\" ha la colonna \"%s\" in conflitto" - -#: commands/tablecmds.c:5430 +#: commands/tablecmds.c:6764 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "unione delle definizioni della colonna \"%s\" per la tabella figlia \"%s\"" -#: commands/tablecmds.c:5454 +#: commands/tablecmds.c:6807 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "non è possibile aggiungere ricorsivamente una colonna identità ad una tabella che ha tabelle figlie" -#: commands/tablecmds.c:5703 +#: commands/tablecmds.c:7051 #, c-format msgid "column must be added to child tables too" msgstr "la colonna deve essere aggiunta anche alle tabelle figlie" -#: commands/tablecmds.c:5778 +#: commands/tablecmds.c:7129 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "la colonna \"%s\" della relazione \"%s\" esiste già, saltata" -#: commands/tablecmds.c:5785 +#: commands/tablecmds.c:7136 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "la colonna \"%s\" della relazione \"%s\" esiste già" -#: commands/tablecmds.c:5883 commands/tablecmds.c:8951 +#: commands/tablecmds.c:7202 commands/tablecmds.c:11989 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "non è possibile rimuovere un vincolo solo da una tabella partizionata se ci sono partizioni esistenti" -#: commands/tablecmds.c:5884 commands/tablecmds.c:6028 -#: commands/tablecmds.c:6812 commands/tablecmds.c:8952 +#: commands/tablecmds.c:7203 commands/tablecmds.c:7520 commands/tablecmds.c:8517 commands/tablecmds.c:11990 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Non specificare la parola chiave ONLY." -#: commands/tablecmds.c:5916 commands/tablecmds.c:6064 -#: commands/tablecmds.c:6119 commands/tablecmds.c:6195 -#: commands/tablecmds.c:6289 commands/tablecmds.c:6348 -#: commands/tablecmds.c:6498 commands/tablecmds.c:6568 -#: commands/tablecmds.c:6660 commands/tablecmds.c:9091 -#: commands/tablecmds.c:9786 +#: commands/tablecmds.c:7240 commands/tablecmds.c:7446 commands/tablecmds.c:7588 commands/tablecmds.c:7702 commands/tablecmds.c:7796 commands/tablecmds.c:7855 commands/tablecmds.c:7974 commands/tablecmds.c:8113 commands/tablecmds.c:8183 commands/tablecmds.c:8339 commands/tablecmds.c:12144 commands/tablecmds.c:13649 commands/tablecmds.c:16237 #, c-format msgid "cannot alter system column \"%s\"" msgstr "non è possibile modificare la colonna di sistema \"%s\"" -#: commands/tablecmds.c:5922 commands/tablecmds.c:6125 +#: commands/tablecmds.c:7246 commands/tablecmds.c:7594 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "la colonna \"%s\" della relazione \"%s\" è una colonna identità" -#: commands/tablecmds.c:5958 +#: commands/tablecmds.c:7289 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la colonna \"%s\" è in una chiave primaria" -#: commands/tablecmds.c:5980 +#: commands/tablecmds.c:7294 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "la colonna \"%s\" è nell'indice utilizzato come identità di replica" + +#: commands/tablecmds.c:7317 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "la colonna \"%s\" è specificata NOT NULL nella tabella padre" -#: commands/tablecmds.c:6027 +#: commands/tablecmds.c:7517 commands/tablecmds.c:9000 +#, c-format +msgid "constraint must be added to child tables too" +msgstr "il vincolo deve essere aggiunto anche alle tabelle figlie" + +#: commands/tablecmds.c:7518 #, c-format -msgid "cannot add constraint to only the partitioned table when partitions exist" -msgstr "non è possibile aggiungere un vincolo solo alla tabella partizionata se esistono partizioni" +msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." +msgstr "La colonna \"%s\" della relazione \"%s\" non è già NOT NULL." -#: commands/tablecmds.c:6127 +#: commands/tablecmds.c:7596 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Usa invece ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:6206 +#: commands/tablecmds.c:7601 +#, c-format +msgid "column \"%s\" of relation \"%s\" is a generated column" +msgstr "la colonna \"%s\" della relazione \"%s\" è una colonna generata" + +#: commands/tablecmds.c:7604 +#, c-format +msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." +msgstr "Utilizzare invece ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." + +#: commands/tablecmds.c:7713 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "la colonna \"%s\" della relazione \"%s\" deve essere dichiarata NOT NULL prima che possa essere aggiunta l'identità" -#: commands/tablecmds.c:6212 +#: commands/tablecmds.c:7719 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "la colonna \"%s\" della relazione \"%s\" è già una colonna identità" -#: commands/tablecmds.c:6218 +#: commands/tablecmds.c:7725 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "la colonna \"%s\" della relazione \"%s\" ha già un valore predefinito" -#: commands/tablecmds.c:6295 commands/tablecmds.c:6356 +#: commands/tablecmds.c:7802 commands/tablecmds.c:7863 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "la colonna \"%s\" della relazione \"%s\" non è una colonna identità" -#: commands/tablecmds.c:6361 +#: commands/tablecmds.c:7868 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "la colonna \"%s\" della relazione \"%s\" non è una colonna identità, saltata" -#: commands/tablecmds.c:6426 +#: commands/tablecmds.c:7921 #, c-format -msgid "cannot refer to non-index column by number" -msgstr "non è possibile riferirsi a colonne non-indice per numero" +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION deve essere applicato anche alle tabelle figlio" -#: commands/tablecmds.c:6457 +#: commands/tablecmds.c:7943 #, c-format -msgid "statistics target %d is too low" -msgstr "il target delle statistiche %d è troppo basso" +msgid "cannot drop generation expression from inherited column" +msgstr "impossibile eliminare l'espressione di generazione dalla colonna ereditata" -#: commands/tablecmds.c:6465 +#: commands/tablecmds.c:7982 #, c-format -msgid "lowering statistics target to %d" -msgstr "target delle statistiche abbassato a %d" +msgid "column \"%s\" of relation \"%s\" is not a stored generated column" +msgstr "la colonna \"%s\" della relazione \"%s\" non è una colonna generata archiviata" + +#: commands/tablecmds.c:7987 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" +msgstr "la colonna \"%s\" della relazione \"%s\" non è una colonna generata archiviata, saltando" + +#: commands/tablecmds.c:8060 +#, c-format +msgid "cannot refer to non-index column by number" +msgstr "non è possibile riferirsi a colonne non-indice per numero" -#: commands/tablecmds.c:6488 +#: commands/tablecmds.c:8103 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "la colonna numero %d della relazione \"%s\" non esiste" -#: commands/tablecmds.c:6507 +#: commands/tablecmds.c:8122 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "non è possibile cambiare statistiche sulla colonna inclusa \"%s\" dell'indice \"%s\"" -#: commands/tablecmds.c:6512 +#: commands/tablecmds.c:8127 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "non è possibile cambiare statistiche sulla colonna non di espressione \"%s\" dell'indice \"%s\"" -#: commands/tablecmds.c:6514 +#: commands/tablecmds.c:8129 #, c-format msgid "Alter statistics on table column instead." msgstr "Cambia le statistiche sulla colonna della tabella invece." -#: commands/tablecmds.c:6640 +#: commands/tablecmds.c:8319 #, c-format msgid "invalid storage type \"%s\"" msgstr "tipo di immagazzinamento non valido \"%s\"" -#: commands/tablecmds.c:6672 +#: commands/tablecmds.c:8351 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "il tipo di dato della colonna %s può avere solo immagazzinamento PLAIN" -#: commands/tablecmds.c:6707 +#: commands/tablecmds.c:8396 #, c-format msgid "cannot drop column from typed table" msgstr "non è possibile eliminare la colonna da una tabella con tipo" -#: commands/tablecmds.c:6752 +#: commands/tablecmds.c:8455 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "la colonna \"%s\" della relazione \"%s\" non esiste, saltato" -#: commands/tablecmds.c:6765 +#: commands/tablecmds.c:8468 #, c-format msgid "cannot drop system column \"%s\"" msgstr "non è possibile eliminare la colonna di sistema \"%s\"" -#: commands/tablecmds.c:6772 +#: commands/tablecmds.c:8478 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "non è possibile eliminare la colonna ereditata \"%s\"" -#: commands/tablecmds.c:6783 +#: commands/tablecmds.c:8491 #, c-format -msgid "cannot drop column named in partition key" -msgstr "non è possibile eliminare una colonna nominata come chiave di partizione" +msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "impossibile eliminare la colonna \"%s\" perché fa parte della chiave di partizione della relazione \"%s\"" -#: commands/tablecmds.c:6787 -#, c-format -msgid "cannot drop column referenced in partition key expression" -msgstr "non è possibile eliminare una colonna referenziata in un'espressione di partizione" - -#: commands/tablecmds.c:6811 +#: commands/tablecmds.c:8516 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "non è possibile eliminare una colonna solo dalla tabella partizionata se esistono delle partizioni" -#: commands/tablecmds.c:7016 +#: commands/tablecmds.c:8720 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX non è supportato su tabelle partizionate" -#: commands/tablecmds.c:7041 +#: commands/tablecmds.c:8745 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX rinominerà l'indice \"%s\" in \"%s\"" -#: commands/tablecmds.c:7257 -#, c-format -msgid "constraint must be added to child tables too" -msgstr "il vincolo deve essere aggiunto anche alle tabelle figlie" - -#: commands/tablecmds.c:7329 -#, c-format -msgid "cannot reference partitioned table \"%s\"" -msgstr "non è possibile referenziare la tabella partizionata \"%s\"" - -#: commands/tablecmds.c:7337 +#: commands/tablecmds.c:9082 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "non è possibile usare ONLY per la chiave esterna sulla tabella partizionata \"%s\" riferita alla relazione \"%s\"" -#: commands/tablecmds.c:7343 +#: commands/tablecmds.c:9088 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "non è possibile aggiungere la chiave esterna NON VALID sulla tabella partizionata \"%s\" riferita alla relazione \"%s\"" -#: commands/tablecmds.c:7346 +#: commands/tablecmds.c:9091 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Questa caratteristica non è ancora supportata sulle tabelle partizionate." -#: commands/tablecmds.c:7352 +#: commands/tablecmds.c:9098 commands/tablecmds.c:9564 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relazione referenziata \"%s\" non è una tabella" -#: commands/tablecmds.c:7375 +#: commands/tablecmds.c:9121 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "i vincoli su tabelle permanenti possono referenziare solo tabelle permanenti" -#: commands/tablecmds.c:7382 +#: commands/tablecmds.c:9128 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "i vincoli su tabelle non loggate possono referenziare solo tabelle permanenti o non loggate" -#: commands/tablecmds.c:7388 +#: commands/tablecmds.c:9134 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "i vincoli su tabelle temporanee possono referenziare solo tabelle temporanee" -#: commands/tablecmds.c:7392 +#: commands/tablecmds.c:9138 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "i vincoli su tabelle temporanee devono riferirsi a tabelle temporanee di questa sessione" -#: commands/tablecmds.c:7452 +#: commands/tablecmds.c:9212 commands/tablecmds.c:9218 +#, c-format +msgid "invalid %s action for foreign key constraint containing generated column" +msgstr "azione %s non valida per il vincolo di chiave esterna contenente la colonna generata" + +#: commands/tablecmds.c:9234 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "i numeri di colonne referenzianti e referenziate per la chiave esterna non combaciano" -#: commands/tablecmds.c:7559 +#: commands/tablecmds.c:9341 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "non è possibile implementare il vincolo di chiave esterna \"%s\"" -#: commands/tablecmds.c:7562 +#: commands/tablecmds.c:9343 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Le colonne chiave \"%s\" e \"%s\" hanno tipi incompatibili: %s e %s." -#: commands/tablecmds.c:7805 commands/tablecmds.c:7970 -#: commands/tablecmds.c:8919 commands/tablecmds.c:8983 +#: commands/tablecmds.c:9500 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "la colonna \"%s\" a cui si fa riferimento nell'azione ON DELETE SET deve far parte della chiave esterna" + +#: commands/tablecmds.c:9773 commands/tablecmds.c:10220 parser/parse_utilcmd.c:795 parser/parse_utilcmd.c:924 +#, c-format +msgid "foreign key constraints are not supported on foreign tables" +msgstr "i vincoli di chiave esterna non sono supportati sulle tabelle esterne" + +#: commands/tablecmds.c:10761 commands/tablecmds.c:11039 commands/tablecmds.c:11946 commands/tablecmds.c:12021 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "il vincolo \"%s\" della relazione \"%s\" non esiste" -#: commands/tablecmds.c:7812 +#: commands/tablecmds.c:10768 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "il vincolo \"%s\" della relazione \"%s\" non è una chiave esterna" -#: commands/tablecmds.c:7978 +#: commands/tablecmds.c:10806 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "impossibile modificare il vincolo \"%s\" sulla relazione \"%s\"" + +#: commands/tablecmds.c:10809 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "Il vincolo \"%s\" deriva dal vincolo \"%s\" della relazione \"%s\"." + +#: commands/tablecmds.c:10811 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "È invece possibile modificare il vincolo da cui deriva." + +#: commands/tablecmds.c:11047 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "il vincolo \"%s\" della relazione \"%s\" non è una chiave esterna o un vincolo di controllo" -#: commands/tablecmds.c:8048 +#: commands/tablecmds.c:11125 #, c-format msgid "constraint must be validated on child tables too" msgstr "i vincoli devono essere validati anche sulle tabelle figlie" -#: commands/tablecmds.c:8116 +#: commands/tablecmds.c:11209 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "la colonna \"%s\" referenziata dal vincolo di chiave esterna non esiste" -#: commands/tablecmds.c:8121 +#: commands/tablecmds.c:11214 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "non possono esserci più di %d chiavi in una chiave esterna" -#: commands/tablecmds.c:8186 +#: commands/tablecmds.c:11280 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "non è possibile usare una chiave primaria deferita per la tabella referenziata \"%s\"" -#: commands/tablecmds.c:8203 +#: commands/tablecmds.c:11297 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "la tabella referenziata \"%s\" non ha una chiave primaria" -#: commands/tablecmds.c:8268 +#: commands/tablecmds.c:11362 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "la lista di colonne referenziate dalla chiave esterna non deve contenere duplicati" -#: commands/tablecmds.c:8362 +#: commands/tablecmds.c:11456 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "non è possibile usare un vincolo univoco deferito per la tabella referenziata \"%s\"" -#: commands/tablecmds.c:8367 +#: commands/tablecmds.c:11461 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "non c'è alcun vincolo univoco che corrisponda alle chiavi indicate per la tabella referenziata \"%s\"" -#: commands/tablecmds.c:8538 -#, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "validazione del vincolo di chiave esterna \"%s\"" - -#: commands/tablecmds.c:8876 +#: commands/tablecmds.c:11902 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "non è possibile eliminare il vincolo ereditato \"%s\" della relazione \"%s\"" -#: commands/tablecmds.c:8925 +#: commands/tablecmds.c:11952 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "il vincolo \"%s\" della relazione \"%s\" non esiste, saltato" -#: commands/tablecmds.c:9075 +#: commands/tablecmds.c:12128 #, c-format msgid "cannot alter column type of typed table" msgstr "non è possibile modificare il tipo di colonna di una tabella con tipo" -#: commands/tablecmds.c:9098 +#: commands/tablecmds.c:12155 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "non è possibile modificare la colonna ereditata \"%s\"" -#: commands/tablecmds.c:9109 +#: commands/tablecmds.c:12164 #, c-format -msgid "cannot alter type of column named in partition key" -msgstr "non è possibile cambiare il tipo di una colonna in una chiave di partizione" +msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "impossibile modificare la colonna \"%s\" perché fa parte della chiave di partizione della relazione \"%s\"" -#: commands/tablecmds.c:9113 -#, c-format -msgid "cannot alter type of column referenced in partition key expression" -msgstr "non è possibile cambiare il tipo di una colonna referenziata in una espressione di partizione" - -#: commands/tablecmds.c:9163 +#: commands/tablecmds.c:12214 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "il risultato della clausola USING per la colonna \"%s\" non può essere convertito automaticamente al tipo %s" -#: commands/tablecmds.c:9166 +#: commands/tablecmds.c:12217 #, c-format msgid "You might need to add an explicit cast." msgstr "Potresti dover aggiungere una conversione esplicita." -#: commands/tablecmds.c:9170 +#: commands/tablecmds.c:12221 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "la colonna \"%s\" non può essere convertita automaticamente al tipo %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:9173 +#: commands/tablecmds.c:12224 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Potresti dover specificare \"USING %s::%s\"." -#: commands/tablecmds.c:9272 +#: commands/tablecmds.c:12323 +#, c-format +msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgstr "impossibile modificare la colonna ereditata \"%s\" della relazione \"%s\"" + +#: commands/tablecmds.c:12351 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "L'espressione USING contiene un riferimento alla riga completa della tabella." -#: commands/tablecmds.c:9283 +#: commands/tablecmds.c:12362 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "il tipo della colonna ereditata \"%s\" deve essere cambiato anche nelle tabelle figlie" -#: commands/tablecmds.c:9372 +#: commands/tablecmds.c:12487 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "non è possibile cambiare il tipo della colonna \"%s\" due volte" -#: commands/tablecmds.c:9408 +#: commands/tablecmds.c:12525 +#, c-format +msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" +msgstr "non è possibile eseguire automaticamente il cast dell'espressione di generazione per la colonna \"%s\" per digitare %s" + +#: commands/tablecmds.c:12530 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "il valore predefinito della colonna \"%s\" non può essere convertito automaticamente al tipo %s" -#: commands/tablecmds.c:9514 +#: commands/tablecmds.c:12611 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "non è possibile cambiare il tipo di una colonna usata in una vista o una regola" -#: commands/tablecmds.c:9515 commands/tablecmds.c:9534 -#: commands/tablecmds.c:9552 +#: commands/tablecmds.c:12612 commands/tablecmds.c:12631 commands/tablecmds.c:12649 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s dipende dalla colonna \"%s\"" -#: commands/tablecmds.c:9533 +#: commands/tablecmds.c:12630 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "non è possibile cambiare il tipo di una colonna usata nella definizione di un trigger" -#: commands/tablecmds.c:9551 +#: commands/tablecmds.c:12648 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "non è possibile cambiare il tipo di una colonna usata nella definizione di una regola di sicurezza" -#: commands/tablecmds.c:10289 commands/tablecmds.c:10301 +#: commands/tablecmds.c:12679 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "non può modificare il tipo di una colonna utilizzata da una colonna generata" + +#: commands/tablecmds.c:12680 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "La colonna \"%s\" viene utilizzata dalla colonna generata \"%s\"." + +#: commands/tablecmds.c:13757 commands/tablecmds.c:13769 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "non è possibile cambiare il proprietario dell'indice \"%s\"" -#: commands/tablecmds.c:10291 commands/tablecmds.c:10303 +#: commands/tablecmds.c:13759 commands/tablecmds.c:13771 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Cambia il proprietario della tabella dell'indice invece." -#: commands/tablecmds.c:10317 +#: commands/tablecmds.c:13785 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "non è possibile cambiare il proprietario della sequenza \"%s\"" -#: commands/tablecmds.c:10331 commands/tablecmds.c:13529 +#: commands/tablecmds.c:13799 commands/tablecmds.c:17129 commands/tablecmds.c:17148 #, c-format msgid "Use ALTER TYPE instead." msgstr "È possibile usare ALTER TYPE invece." -#: commands/tablecmds.c:10340 +#: commands/tablecmds.c:13808 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "\"%s\" non è una tabella, una vista, una sequenza né una tabella esterna" +msgid "cannot change owner of relation \"%s\"" +msgstr "impossibile cambiare il proprietario della relazione \"%s\"" -#: commands/tablecmds.c:10680 +#: commands/tablecmds.c:14170 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "non è possibile avere più di un sottocomando SET TABLESPACE" -#: commands/tablecmds.c:10755 +#: commands/tablecmds.c:14247 #, c-format -msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -msgstr "\"%s\" non è una tabella, una vista, una vista materializzata né una tabella TOAST" +msgid "cannot set options for relation \"%s\"" +msgstr "impossibile impostare le opzioni per la relazione \"%s\"" -#: commands/tablecmds.c:10788 commands/view.c:508 +#: commands/tablecmds.c:14281 commands/view.c:521 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION è supportato solo su viste aggiornabili automaticamente" -#: commands/tablecmds.c:10930 -#, c-format -msgid "cannot move system relation \"%s\"" -msgstr "non è possibile spostare la relazione \"%s\"" - -#: commands/tablecmds.c:10946 -#, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "non è possibile spostare tabelle temporanee di altre sessioni" - -#: commands/tablecmds.c:11082 +#: commands/tablecmds.c:14531 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "solo tabelle, indici e viste materializzate esistono nei tablespace" -#: commands/tablecmds.c:11094 +#: commands/tablecmds.c:14543 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "non è possibile spostare relazioni dentro o fuori il tablespace pg_global" -#: commands/tablecmds.c:11187 +#: commands/tablecmds.c:14635 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "interruzione perché non c'è un lock disponibile sulla relazione \"%s.%s\"" -#: commands/tablecmds.c:11203 +#: commands/tablecmds.c:14651 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "nessuna relazione corrispondente trovata nel tablespace \"%s\"" -#: commands/tablecmds.c:11270 storage/buffer/bufmgr.c:915 -#, c-format -msgid "invalid page in block %u of relation %s" -msgstr "pagina non valida nel blocco %u della relazione %s" - -#: commands/tablecmds.c:11350 +#: commands/tablecmds.c:14768 #, c-format msgid "cannot change inheritance of typed table" msgstr "non è possibile cambiare ereditarietà di tabelle con tipo" -#: commands/tablecmds.c:11355 commands/tablecmds.c:11898 +#: commands/tablecmds.c:14773 commands/tablecmds.c:15329 #, c-format msgid "cannot change inheritance of a partition" msgstr "non è possibile cambiare ereditarietà di una partizione" -#: commands/tablecmds.c:11360 +#: commands/tablecmds.c:14778 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "non è possibile cambiare ereditarietà di una tabella partizionata" -#: commands/tablecmds.c:11406 +#: commands/tablecmds.c:14824 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "non è possibile ereditare tabelle temporanee di un'altra sessione" -#: commands/tablecmds.c:11419 +#: commands/tablecmds.c:14837 #, c-format msgid "cannot inherit from a partition" msgstr "non è possibile ereditare da una partizione" -#: commands/tablecmds.c:11441 commands/tablecmds.c:14108 +#: commands/tablecmds.c:14859 commands/tablecmds.c:17782 #, c-format msgid "circular inheritance not allowed" msgstr "l'ereditarietà circolare non è consentita" -#: commands/tablecmds.c:11442 commands/tablecmds.c:14109 +#: commands/tablecmds.c:14860 commands/tablecmds.c:17783 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" è già figlia di \"%s\"." -#: commands/tablecmds.c:11450 -#, c-format -msgid "table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs" -msgstr "la tabella \"%s\" senza OID non può ereditare dalla tabella \"%s\" con OID" - -#: commands/tablecmds.c:11463 +#: commands/tablecmds.c:14873 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "il trigger \"%s\" impedisce alla tabella \"%s\" di diventare figlia di ereditarietà" -#: commands/tablecmds.c:11465 +#: commands/tablecmds.c:14875 #, c-format -msgid "ROW triggers with transition tables are not supported in inheritance hierarchies" -msgstr "i trigger ROW con tabelle di transizioni non sono supportati nelle gerarchie ereditarie" +msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." +msgstr "I trigger ROW con tabelle di transizione non sono supportati nelle gerarchie di ereditarietà." -#: commands/tablecmds.c:11668 +#: commands/tablecmds.c:15078 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "la colonna \"%s\" nella tabella figlia dev'essere marcata NOT NULL" -#: commands/tablecmds.c:11695 commands/tablecmds.c:11734 +#: commands/tablecmds.c:15087 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "la colonna \"%s\" nella tabella figlio deve essere una colonna generata" + +#: commands/tablecmds.c:15137 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "la colonna \"%s\" nella tabella figlio ha un'espressione di generazione in conflitto" + +#: commands/tablecmds.c:15165 #, c-format msgid "child table is missing column \"%s\"" msgstr "la tabella figlia non ha la colonna \"%s\"" -#: commands/tablecmds.c:11822 +#: commands/tablecmds.c:15253 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "la tabella figlia \"%s\" ha una definizione diversa del vincolo di controllo \"%s\"" -#: commands/tablecmds.c:11830 +#: commands/tablecmds.c:15261 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "il vincolo \"%s\" è in conflitto con un vincolo non ereditato nella tabella figlia \"%s\"" -#: commands/tablecmds.c:11841 +#: commands/tablecmds.c:15272 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "il vincolo \"%s\" è in conflitto con un vincolo non valido nella tabella figlia \"%s\"" -#: commands/tablecmds.c:11876 +#: commands/tablecmds.c:15307 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "la tabella figlia non ha il vincolo \"%s\"" -#: commands/tablecmds.c:11965 +#: commands/tablecmds.c:15393 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "partizione \"%s\" già in attesa di distacco nella tabella partizionata \"%s.%s\"" + +#: commands/tablecmds.c:15422 commands/tablecmds.c:15470 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "la relazione \"%s\" non è una partizione della relazione \"%s\"" -#: commands/tablecmds.c:11971 +#: commands/tablecmds.c:15476 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "la relazione \"%s\" non è genitore della relazione \"%s\"" -#: commands/tablecmds.c:12197 +#: commands/tablecmds.c:15704 #, c-format msgid "typed tables cannot inherit" msgstr "le tabelle con tipo non possono essere ereditate" -#: commands/tablecmds.c:12228 +#: commands/tablecmds.c:15734 #, c-format msgid "table is missing column \"%s\"" msgstr "la tabella non ha la colonna \"%s\"" -#: commands/tablecmds.c:12239 +#: commands/tablecmds.c:15745 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "la tabella ha la colonna \"%s\" laddove il tipo richiede \"%s\"" -#: commands/tablecmds.c:12248 +#: commands/tablecmds.c:15754 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "la tabella \"%s\" ha tipo diverso per la colonna \"%s\"" -#: commands/tablecmds.c:12262 +#: commands/tablecmds.c:15768 #, c-format msgid "table has extra column \"%s\"" msgstr "la tabella ha la colonna \"%s\" in eccesso" -#: commands/tablecmds.c:12314 +#: commands/tablecmds.c:15820 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" non è una tabella con tipo" -#: commands/tablecmds.c:12496 +#: commands/tablecmds.c:16008 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "non è possibile usare l'indice non univoco \"%s\" come identità di replica" -#: commands/tablecmds.c:12502 +#: commands/tablecmds.c:16014 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "non è possibile usare l'indice non immediato \"%s\" come identità di replica" -#: commands/tablecmds.c:12508 +#: commands/tablecmds.c:16020 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "non è possibile usare l'indice su espressione \"%s\" come identità di replica" -#: commands/tablecmds.c:12514 +#: commands/tablecmds.c:16026 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "non è possibile usare l'indice parziale \"%s\" come identità di replica" -#: commands/tablecmds.c:12520 +#: commands/tablecmds.c:16032 #, c-format msgid "cannot use invalid index \"%s\" as replica identity" msgstr "non è possibile usare l'indice non valido \"%s\" come identità di replica" -#: commands/tablecmds.c:12541 +#: commands/tablecmds.c:16049 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "l'indice \"%s\" non può essere usato come identità di replica perché la colonna %d è una colonna di sistema" -#: commands/tablecmds.c:12548 +#: commands/tablecmds.c:16056 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "l'indice \"%s\" non può essere usato come identità di replica perché la colonna \"%s\" può essere NULL" -#: commands/tablecmds.c:12741 +#: commands/tablecmds.c:16303 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "non è possibile cambiare lo stato di log della tabella \"%s\" perché è temporanea" -#: commands/tablecmds.c:12765 +#: commands/tablecmds.c:16327 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "non è possibile rendere la tabella \"%s\" non loggata perché è parte di una pubblicazione" -#: commands/tablecmds.c:12767 +#: commands/tablecmds.c:16329 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Le tabelle non loggate non possono essere replicate." -#: commands/tablecmds.c:12812 +#: commands/tablecmds.c:16374 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "non è possibile cambiare lo stato della tabella \"%s\" a loggata perché referenzia la tabella non loggata \"%s\"" -#: commands/tablecmds.c:12822 +#: commands/tablecmds.c:16384 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "non è possibile cambiare lo stato della tabella \"%s\" a non loggata perché referenzia la tabella loggata \"%s\"" -#: commands/tablecmds.c:12880 +#: commands/tablecmds.c:16442 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "non è possibile spostare una sequenza con proprietario in uno schema diverso" -#: commands/tablecmds.c:12986 +#: commands/tablecmds.c:16549 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "la relazione \"%s\" esiste già nello schema \"%s\"" -#: commands/tablecmds.c:13512 +#: commands/tablecmds.c:16962 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" non è una tabella né una vista materializzata" + +#: commands/tablecmds.c:17112 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" non è un tipo composito" -#: commands/tablecmds.c:13544 +#: commands/tablecmds.c:17140 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "impossibile modificare lo schema dell'indice \"%s\"" + +#: commands/tablecmds.c:17142 commands/tablecmds.c:17154 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Cambia invece lo schema della tabella." + +#: commands/tablecmds.c:17146 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "impossibile modificare lo schema di tipo composito \"%s\"" + +#: commands/tablecmds.c:17152 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "\"%s\" non è una tabella, una vista, una vista materializzata, una sequenza né una tabella esterna" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "impossibile modificare lo schema della tabella TOAST \"%s\"" -#: commands/tablecmds.c:13579 +#: commands/tablecmds.c:17189 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "strategia di partizionamento \"%s\" sconosciuta" -#: commands/tablecmds.c:13587 +#: commands/tablecmds.c:17197 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "non è possibile usare la strategia di partizionamento \"list\" con più di una colonna" -#: commands/tablecmds.c:13652 +#: commands/tablecmds.c:17263 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "la colonna \"%s\" nominata nella chiave di partizione non esiste" -#: commands/tablecmds.c:13659 +#: commands/tablecmds.c:17271 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "non è possibile usare la colonna di sistema \"%s\" nella chiave di partizione" -#: commands/tablecmds.c:13722 +#: commands/tablecmds.c:17282 commands/tablecmds.c:17396 #, c-format -msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "le funzioni nelle espressioni di partizione devono essere IMMUTABLE" +msgid "cannot use generated column in partition key" +msgstr "non è possibile utilizzare la colonna generata nella chiave di partizione" + +#: commands/tablecmds.c:17283 commands/tablecmds.c:17397 commands/trigger.c:667 rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "La colonna \"%s\" è una colonna generata." -#: commands/tablecmds.c:13739 +#: commands/tablecmds.c:17359 #, c-format -msgid "partition key expressions cannot contain whole-row references" -msgstr "l'espressione di partizione non può contenere riferimenti alla riga intera" +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "le funzioni nelle espressioni di partizione devono essere IMMUTABLE" -#: commands/tablecmds.c:13746 +#: commands/tablecmds.c:17379 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "l'espressione di partizione non può contenere riferimenti a colonne di sistema" -#: commands/tablecmds.c:13756 +#: commands/tablecmds.c:17409 #, c-format msgid "cannot use constant expression as partition key" msgstr "non è possibile usare un'espressione costante come chiave di partizione" -#: commands/tablecmds.c:13777 +#: commands/tablecmds.c:17430 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "non è possibile determinare quale ordinamento usare per l'espressione di partizione" -#: commands/tablecmds.c:13810 -#, c-format -msgid "data type %s has no default hash operator class" -msgstr "il tipo di dati %s non ha una classe di operatori hash di default" - -#: commands/tablecmds.c:13812 +#: commands/tablecmds.c:17465 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Devi specificare una classe di operatori hash o definire una classe di operatori hash di default per il tipo di dato." -#: commands/tablecmds.c:13816 -#, c-format -msgid "data type %s has no default btree operator class" -msgstr "il tipo di dati %s non ha una classe di operatori btree predefinita" - -#: commands/tablecmds.c:13818 +#: commands/tablecmds.c:17471 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Devi specificare una classe di operatori btree o definire una classe di operatori btree predefinita per il tipo di dati." -#: commands/tablecmds.c:13943 -#, c-format -msgid "partition constraint for table \"%s\" is implied by existing constraints" -msgstr "il vincolo di partizione per la tabella \"%s\" è implicito dai vincoli esistenti" - -#: commands/tablecmds.c:13947 partitioning/partbounds.c:621 -#: partitioning/partbounds.c:666 -#, c-format -msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -msgstr "il nuovo vincolo di partizione per la partizione di default \"%s\" è implicito grazie ai vincoli esistenti" - -#: commands/tablecmds.c:14048 +#: commands/tablecmds.c:17722 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" è già una partizione" -#: commands/tablecmds.c:14054 +#: commands/tablecmds.c:17728 #, c-format msgid "cannot attach a typed table as partition" msgstr "non è possibile agganciare una tabella con tipo come partizione" -#: commands/tablecmds.c:14070 +#: commands/tablecmds.c:17744 #, c-format msgid "cannot attach inheritance child as partition" msgstr "non è possibile agganciare una tabella figlia di ereditarietà come partizione" -#: commands/tablecmds.c:14084 +#: commands/tablecmds.c:17758 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "non è possibile agganciare una tabella padre di ereditarietà come partizione" -#: commands/tablecmds.c:14118 +#: commands/tablecmds.c:17792 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "non è possibile agganciare una relazione temporanea come partizione della relazione permanente \"%s\"" -#: commands/tablecmds.c:14126 +#: commands/tablecmds.c:17800 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "non è possibile agganciare una relazione permanente come partizione della relazione temporanea \"%s\"" -#: commands/tablecmds.c:14134 +#: commands/tablecmds.c:17808 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "non è possibile agganciare una partizione di relazione temporanea di un'altra sessione" -#: commands/tablecmds.c:14141 +#: commands/tablecmds.c:17815 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "non è possibile agganciare una relazione temporanea di un'altra sessione come partizione" -#: commands/tablecmds.c:14147 -#, c-format -msgid "cannot attach table \"%s\" without OIDs as partition of table \"%s\" with OIDs" -msgstr "non è possibile agganciare la tabella \"%s\" senza OID come partizione della tabella \"%s\" con OID" - -#: commands/tablecmds.c:14155 -#, c-format -msgid "cannot attach table \"%s\" with OIDs as partition of table \"%s\" without OIDs" -msgstr "non è possibile agganciare la tabella \"%s\" con OID come partizione della tabella \"%s\" senza OID" - -#: commands/tablecmds.c:14177 +#: commands/tablecmds.c:17835 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "la tabella \"%s\" contiene la colonna \"%s\" che non è presente nel padre \"%s\"" -#: commands/tablecmds.c:14180 +#: commands/tablecmds.c:17838 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "La partizione può contenere solo le colonne presenti nella tabella padre." -#: commands/tablecmds.c:14192 +#: commands/tablecmds.c:17850 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "il trigger \"%s\" impedisce alla tabella \"%s\" di diventare una partizione" -#: commands/tablecmds.c:14194 commands/trigger.c:462 +#: commands/tablecmds.c:17852 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" -msgstr "i trigger ROW con tabelle di transizioni non sono supportati sulle partizioni" +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "I trigger ROW con tabelle di transizione non sono supportati nelle partizioni." + +#: commands/tablecmds.c:18031 +#, c-format +msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" +msgstr "impossibile allegare la tabella esterna \"%s\" come partizione della tabella partizionata \"%s\"" + +#: commands/tablecmds.c:18034 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "La tabella partizionata \"%s\" contiene indici univoci." -#: commands/tablecmds.c:14827 commands/tablecmds.c:14846 -#: commands/tablecmds.c:14868 commands/tablecmds.c:14887 -#: commands/tablecmds.c:14943 +#: commands/tablecmds.c:18345 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "non è possibile scollegare le partizioni contemporaneamente quando esiste una partizione predefinita" + +#: commands/tablecmds.c:18454 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "la tabella partizionata \"%s\" è stata rimossa contemporaneamente" + +#: commands/tablecmds.c:18460 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "la partizione \"%s\" è stata rimossa contemporaneamente" + +#: commands/tablecmds.c:18964 commands/tablecmds.c:18984 commands/tablecmds.c:19004 commands/tablecmds.c:19023 commands/tablecmds.c:19065 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "non è possibile agganciare l'indice \"%s\" come partizione dell'indice \"%s\"" -#: commands/tablecmds.c:14830 +#: commands/tablecmds.c:18967 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "L'indice \"%s\" è già agganciato ad un altro indice." -#: commands/tablecmds.c:14849 +#: commands/tablecmds.c:18987 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "L'Indice \"%s\" non è un indice di alcuna partizione della tabella \"%s\"." -#: commands/tablecmds.c:14871 +#: commands/tablecmds.c:19007 #, c-format msgid "The index definitions do not match." msgstr "Le definizioni degli indici non corrispondono." -#: commands/tablecmds.c:14890 +#: commands/tablecmds.c:19026 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "L'indice \"%s\" appartiene ad un vincolo nella tabella \"%s\" ma non c'è alcun vincolo per l'indice \"%s\"." -#: commands/tablecmds.c:14946 +#: commands/tablecmds.c:19068 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "C'è già un altro indice agganciato per la partizione \"%s\"." -#: commands/tablespace.c:163 commands/tablespace.c:180 -#: commands/tablespace.c:191 commands/tablespace.c:199 -#: commands/tablespace.c:625 replication/slot.c:1194 storage/file/copydir.c:47 +#: commands/tablecmds.c:19298 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "creazione della directory \"%s\" fallita: %m" +msgid "column data type %s does not support compression" +msgstr "il tipo di dati della colonna %s non supporta la compressione" -#: commands/tablespace.c:210 utils/adt/genfile.c:581 +#: commands/tablecmds.c:19305 #, c-format -msgid "could not stat directory \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sulla directory \"%s\": %m" +msgid "invalid compression method \"%s\"" +msgstr "metodo di compressione \"%s\" non valido" -#: commands/tablespace.c:219 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" esiste ma non è una directory" -#: commands/tablespace.c:250 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "permesso di creare il tablespace \"%s\" negato" -#: commands/tablespace.c:252 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Solo un superutente può incrementare questo valore." -#: commands/tablespace.c:268 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "la posizione del tablespace non può contenere apici" -#: commands/tablespace.c:278 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "la posizione del tablespace dev'essere un percorso assoluto" -#: commands/tablespace.c:290 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "la posizione del tablespace \"%s\" è troppo lunga" -#: commands/tablespace.c:297 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "la locazione del tablespace non dev'essere all'interno della directory dei dati" -#: commands/tablespace.c:306 commands/tablespace.c:952 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "il nome del tablespace \"%s\" non è accettabile" -#: commands/tablespace.c:308 commands/tablespace.c:953 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Il prefisso \"pg_\" è riservato per i tablespace di sistema." -#: commands/tablespace.c:318 commands/tablespace.c:965 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "il tablespace \"%s\" esiste già" -#: commands/tablespace.c:430 commands/tablespace.c:935 -#: commands/tablespace.c:1015 commands/tablespace.c:1083 -#: commands/tablespace.c:1216 commands/tablespace.c:1416 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "pg_tablespace Il valore OID non è impostato in modalità di aggiornamento binario" + +#: commands/tablespace.c:441 commands/tablespace.c:979 commands/tablespace.c:1068 commands/tablespace.c:1137 commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "il tablespace \"%s\" non esiste" -#: commands/tablespace.c:436 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "il tablespace \"%s\" non esiste, saltato" -#: commands/tablespace.c:512 +#: commands/tablespace.c:473 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "il tablespace \"%s\" non può essere eliminato perché alcuni oggetti dipendono da esso" + +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "il tablespace \"%s\" non è vuoto" -#: commands/tablespace.c:584 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "la directory \"%s\" non esiste" -#: commands/tablespace.c:585 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Crea questa directory per il tablespace prima di riavviare il server." -#: commands/tablespace.c:590 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "impostazione dei permessi sulla directory \"%s\" fallita: %m" -#: commands/tablespace.c:620 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "la directory \"%s\" già è in uso come tablespace" -#: commands/tablespace.c:705 commands/tablespace.c:715 -#: postmaster/postmaster.c:1476 storage/file/fd.c:2680 -#: storage/file/reinit.c:122 utils/adt/genfile.c:483 utils/adt/genfile.c:554 -#: utils/adt/misc.c:436 utils/misc/tzparser.c:339 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "apertura della directory \"%s\" fallita: %m" - -#: commands/tablespace.c:744 commands/tablespace.c:757 -#: commands/tablespace.c:793 commands/tablespace.c:885 storage/file/fd.c:3110 +#: commands/tablespace.c:788 commands/tablespace.c:801 commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 storage/file/fd.c:3669 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "rimozione della directory \"%s\" fallita: %m" -#: commands/tablespace.c:806 commands/tablespace.c:894 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "rimozione del link simbolico \"%s\" fallita: %m" -#: commands/tablespace.c:816 commands/tablespace.c:903 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" non è una directory o un link simbolico" -#: commands/tablespace.c:1088 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Il tablespace \"%s\" non esiste." -#: commands/tablespace.c:1515 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "rimozioni delle directory per il tablespace %u fallita" -#: commands/tablespace.c:1517 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Puoi rimuovere le directory manualmente se necessario." -#: commands/trigger.c:207 commands/trigger.c:218 +#: commands/trigger.c:229 commands/trigger.c:240 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" non è una tabella" -#: commands/trigger.c:209 commands/trigger.c:220 +#: commands/trigger.c:231 commands/trigger.c:242 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Le tabelle non possono avere trigger INSTEAD OF." -#: commands/trigger.c:237 +#: commands/trigger.c:263 #, c-format -msgid "Partitioned tables cannot have BEFORE / FOR EACH ROW triggers." -msgstr "Le tabelle partizionate non possono avere trigger BEFORE / FOR EACH ROW." +msgid "\"%s\" is a partitioned table" +msgstr "\"%s\" è una tabella partizionata" -#: commands/trigger.c:255 +#: commands/trigger.c:265 #, c-format msgid "Triggers on partitioned tables cannot have transition tables." msgstr "I trigger su tabelle partizionate non possono avere tabelle di transizione." -#: commands/trigger.c:267 commands/trigger.c:274 commands/trigger.c:444 +#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" è una vista" -#: commands/trigger.c:269 +#: commands/trigger.c:279 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Le viste non possono avere trigger di riga BEFORE o AFTER." -#: commands/trigger.c:276 +#: commands/trigger.c:286 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Le viste non possono avere trigger TRUNCATE." -#: commands/trigger.c:284 commands/trigger.c:291 commands/trigger.c:303 -#: commands/trigger.c:437 +#: 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\" è una tabella esterna" -#: commands/trigger.c:286 +#: commands/trigger.c:296 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Le tabelle esterne non possono avere trigger INSTEAD OF." -#: commands/trigger.c:293 +#: commands/trigger.c:303 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Le tabelle esterne non possono avere trigger TRUNCATE." -#: commands/trigger.c:305 +#: commands/trigger.c:315 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Le tabelle esterne non possono avere trigger di vincolo." -#: commands/trigger.c:380 +#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "la relazione \"%s\" non può avere trigger" + +#: commands/trigger.c:391 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "i trigger TRUNCATE FOR EACH ROW non sono supportati" -#: commands/trigger.c:388 +#: commands/trigger.c:399 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "i trigger INSTEAD OF devono essere FOR EACH ROW" -#: commands/trigger.c:392 +#: commands/trigger.c:403 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "i trigger INSTEAD OF non possono avere condizioni WHEN" -#: commands/trigger.c:396 +#: commands/trigger.c:407 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "i trigger INSTEAD OF non possono avere liste di colonne" -#: commands/trigger.c:425 +#: commands/trigger.c:436 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "non è possibile nominare la variabile ROW nella clausola REFERENCING" -#: commands/trigger.c:426 +#: commands/trigger.c:437 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Usa OLD TABLE o NEW TABLE per nominare le tabelle di transizione." -#: commands/trigger.c:439 +#: commands/trigger.c:450 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "I trigger sulle tabelle esterne non possono avere tabelle di transizione." -#: commands/trigger.c:446 +#: commands/trigger.c:457 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "I trigger sulle viste non possono avere tabelle di transizione." -#: commands/trigger.c:466 +#: commands/trigger.c:473 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "i trigger ROW con tabelle di transizioni non sono supportati sulle partizioni" + +#: commands/trigger.c:477 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "i trigger ROW con tabelle di transizioni non sono supportati nei figli eredirari" -#: commands/trigger.c:472 +#: commands/trigger.c:483 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "il nome di una tabella di transizione può essere specificato solo per i trigger AFTER" -#: commands/trigger.c:477 +#: commands/trigger.c:488 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "trigger TRUNCATE con tabelle di transizione non sono supportati" -#: commands/trigger.c:494 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "non si può specificare una tabella di transizione per trigger con più di un evento" -#: commands/trigger.c:505 +#: commands/trigger.c:516 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "non si può specificare una tabella di transizione per trigger con una lista di colonne" -#: commands/trigger.c:522 +#: commands/trigger.c:533 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE può essere specificato solo per i trigger INSERT o UPDATE" -#: commands/trigger.c:527 +#: commands/trigger.c:538 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE non può essere specificato più volte" -#: commands/trigger.c:537 +#: commands/trigger.c:548 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE può essere specificato solo per i trigger DELETE o UPDATE" -#: commands/trigger.c:542 +#: commands/trigger.c:553 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE non può essere specificato più volte" -#: commands/trigger.c:552 +#: commands/trigger.c:563 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "OLD TABLE e NEW TABLE non possono avere lo stesso nome" -#: commands/trigger.c:614 commands/trigger.c:627 +#: commands/trigger.c:627 commands/trigger.c:640 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "la condizione WHEN del trigger di istruzione non può riferirsi a valori di colonna" -#: commands/trigger.c:619 +#: commands/trigger.c:632 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "la condizione WHEN dei trigger INSERT non può usare OLD" -#: commands/trigger.c:632 +#: commands/trigger.c:645 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "la condizione WHEN del trigger DELETE non può usare NEW" -#: commands/trigger.c:637 +#: commands/trigger.c:650 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "la condizione WHEN del trigger BEFORE non può usare le colonne di sistema NEW" -#: commands/trigger.c:810 commands/trigger.c:1705 +#: commands/trigger.c:658 commands/trigger.c:666 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" +msgstr "La condizione WHEN del trigger BEFORE non può fare riferimento a NUOVE colonne generate" + +#: commands/trigger.c:659 +#, c-format +msgid "A whole-row reference is used and the table contains generated columns." +msgstr "Viene utilizzato un riferimento a riga intera e la tabella contiene colonne generate." + +#: commands/trigger.c:774 commands/trigger.c:1657 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "il trigger \"%s\" per la relazione \"%s\" esiste già" -#: commands/trigger.c:1230 -msgid "Found referenced table's UPDATE trigger." -msgstr "Trovato trigger UPDATE della tabella referenziata." +#: commands/trigger.c:787 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "il trigger \"%s\" per la relazione \"%s\" è un trigger interno o figlio" -#: commands/trigger.c:1231 -msgid "Found referenced table's DELETE trigger." -msgstr "Trovato trigger DELETE della tabella referenziata." +#: commands/trigger.c:806 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "il trigger \"%s\" per la relazione \"%s\" è un trigger di vincolo" -#: commands/trigger.c:1232 -msgid "Found referencing table's trigger." -msgstr "Trovato trigger della tabella referenziante." +#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1876 +#, c-format +msgid "trigger \"%s\" for table \"%s\" does not exist" +msgstr "il trigger \"%s\" per la tabella \"%s\" non esiste" -#: commands/trigger.c:1341 commands/trigger.c:1357 +#: commands/trigger.c:1572 #, c-format -msgid "ignoring incomplete trigger group for constraint \"%s\" %s" -msgstr "ignorato gruppo di trigger incompleto per il vincolo \"%s\" %s" +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "impossibile rinominare il trigger \"%s\" nella tabella \"%s\"" -#: commands/trigger.c:1370 +#: commands/trigger.c:1574 #, c-format -msgid "converting trigger group into constraint \"%s\" %s" -msgstr "conversione del gruppo di trigger nel vincolo \"%s\" %s" +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Rinominare invece il trigger sulla tabella partizionata \"%s\"." -#: commands/trigger.c:1591 commands/trigger.c:1750 commands/trigger.c:1886 +#: commands/trigger.c:1674 #, c-format -msgid "trigger \"%s\" for table \"%s\" does not exist" -msgstr "il trigger \"%s\" per la tabella \"%s\" non esiste" +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "trigger rinominato \"%s\" sulla relazione \"%s\"" -#: commands/trigger.c:1833 +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "permesso negato: \"%s\" è un trigger di sistema" -#: commands/trigger.c:2433 +#: commands/trigger.c:2437 #, c-format msgid "trigger function %u returned null value" msgstr "la funzione trigger %u ha restituito un valore null" -#: commands/trigger.c:2499 commands/trigger.c:2714 commands/trigger.c:2953 -#: commands/trigger.c:3243 +#: commands/trigger.c:2497 commands/trigger.c:2715 commands/trigger.c:2965 commands/trigger.c:3298 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "il trigger BEFORE STATEMENT non può restituire un valore" -#: commands/trigger.c:3305 executor/nodeModifyTable.c:756 -#: executor/nodeModifyTable.c:1244 +#: commands/trigger.c:2573 +#, c-format +msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" +msgstr "lo spostamento di una riga in un'altra partizione durante un trigger BEFORE FOR EACH ROW non è supportato" + +#: commands/trigger.c:2574 +#, c-format +msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." +msgstr "Prima di eseguire il trigger \"%s\", la riga doveva trovarsi nella partizione \"%s.%s\"." + +#: commands/trigger.c:3372 executor/nodeModifyTable.c:2226 executor/nodeModifyTable.c:2309 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "la tupla da aggiornare era stata già modificata da un'operazione fatta eseguire da un comando corrente" -#: commands/trigger.c:3306 executor/nodeModifyTable.c:757 -#: executor/nodeModifyTable.c:1245 +#: commands/trigger.c:3373 executor/nodeModifyTable.c:1412 executor/nodeModifyTable.c:1486 executor/nodeModifyTable.c:2227 executor/nodeModifyTable.c:2310 executor/nodeModifyTable.c:2968 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Considera l'utilizzo di un trigger AFTER invece di un trigger BEFORE per propagare i cambiamenti ad altre righe." -#: commands/trigger.c:3320 executor/execMain.c:2727 executor/nodeLockRows.c:220 -#: executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:769 -#: executor/nodeModifyTable.c:1257 executor/nodeModifyTable.c:1433 +#: commands/trigger.c:3402 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:329 executor/nodeModifyTable.c:1428 executor/nodeModifyTable.c:2244 executor/nodeModifyTable.c:2454 #, c-format msgid "could not serialize access due to concurrent update" msgstr "serializzazione dell'accesso fallita a causa di modifiche concorrenti" -#: commands/trigger.c:3324 executor/execMain.c:2731 executor/execMain.c:2806 -#: executor/nodeLockRows.c:224 +#: commands/trigger.c:3410 executor/nodeModifyTable.c:1518 executor/nodeModifyTable.c:2327 executor/nodeModifyTable.c:2478 executor/nodeModifyTable.c:2834 #, c-format -msgid "tuple to be locked was already moved to another partition due to concurrent update" -msgstr "la tupla da lockare era stata già mossa in un'altra partizione a causa di una modifica concorrente" +msgid "could not serialize access due to concurrent delete" +msgstr "impossibile serializzare l'accesso a causa dell'eliminazione simultanea" + +#: commands/trigger.c:4586 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "non è in grado di attivare il trigger differito nell'ambito di un'operazione con limitazioni di sicurezza" -#: commands/trigger.c:5452 +#: commands/trigger.c:5769 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "il vincolo \"%s\" non è deferibile" -#: commands/trigger.c:5475 +#: commands/trigger.c:5792 #, c-format msgid "constraint \"%s\" does not exist" msgstr "il vincolo \"%s\" non esiste" -#: commands/tsearchcmds.c:115 commands/tsearchcmds.c:679 +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 #, c-format msgid "function %s should return type %s" msgstr "la funzione %s dovrebbe restituire il tipo %s" -#: commands/tsearchcmds.c:192 +#: commands/tsearchcmds.c:194 #, c-format msgid "must be superuser to create text search parsers" msgstr "solo un superutente può creare analizzatori di ricerca di testo" -#: commands/tsearchcmds.c:240 +#: commands/tsearchcmds.c:247 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "parametro dell'analizzatore di ricerca di testo \"%s\" non riconosciuto" -#: commands/tsearchcmds.c:250 +#: commands/tsearchcmds.c:257 #, c-format msgid "text search parser start method is required" msgstr "il metodo start dell'analizzatore di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:255 +#: commands/tsearchcmds.c:262 #, c-format msgid "text search parser gettoken method is required" msgstr "il metodo gettoken dell'analizzatore di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:260 +#: commands/tsearchcmds.c:267 #, c-format msgid "text search parser end method is required" msgstr "il metodo end dell'analizzatore di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:265 +#: commands/tsearchcmds.c:272 #, c-format msgid "text search parser lextypes method is required" msgstr "il metodo lextype dell'analizzatore di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:384 +#: commands/tsearchcmds.c:366 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "il modello di ricerca di testo \"%s\" non accetta opzioni" -#: commands/tsearchcmds.c:458 +#: commands/tsearchcmds.c:440 #, c-format msgid "text search template is required" msgstr "il modello di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:746 +#: commands/tsearchcmds.c:701 #, c-format msgid "must be superuser to create text search templates" msgstr "solo un superutente può creare modelli di ricerca di testo" -#: commands/tsearchcmds.c:783 +#: commands/tsearchcmds.c:743 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "parametro del modello di ricerca di testo \"%s\" non riconosciuto" -#: commands/tsearchcmds.c:793 +#: commands/tsearchcmds.c:753 #, c-format msgid "text search template lexize method is required" msgstr "il metodo lexize del modello di ricerca di testo è richiesto" -#: commands/tsearchcmds.c:1000 +#: commands/tsearchcmds.c:933 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "parametro della configurazione di ricerca di testo \"%s\" non riconosciuto" -#: commands/tsearchcmds.c:1007 +#: commands/tsearchcmds.c:940 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "non è possibile specificare sia l'opzione PARSER che COPY" -#: commands/tsearchcmds.c:1043 +#: commands/tsearchcmds.c:976 #, c-format msgid "text search parser is required" msgstr "l'analizzatore per la ricerca di testo è richiesto" -#: commands/tsearchcmds.c:1265 +#: commands/tsearchcmds.c:1200 #, c-format msgid "token type \"%s\" does not exist" msgstr "il tipo di token \"%s\" non esiste" -#: commands/tsearchcmds.c:1486 +#: commands/tsearchcmds.c:1427 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "la mappatura per il token \"%s\" non esiste" -#: commands/tsearchcmds.c:1492 +#: commands/tsearchcmds.c:1433 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "la mappatura per il token \"%s\" non esiste, saltato" -#: commands/tsearchcmds.c:1647 commands/tsearchcmds.c:1758 +#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "formato di lista di parametri non valido: \"%s\"" -#: commands/typecmds.c:180 +#: commands/typecmds.c:217 #, c-format msgid "must be superuser to create a base type" msgstr "solo un superutente può creare un tipo di base" -#: commands/typecmds.c:287 commands/typecmds.c:1483 +#: 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 "Crea il tipo come tipo di shell, quindi crea le sue funzioni di I/O, quindi esegui un CREATE TYPE completo." + +#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "attributo del tipo \"%s\" non riconosciuto" -#: commands/typecmds.c:343 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "categoria non valida \"%s\": dev'essere semplice ASCII" -#: commands/typecmds.c:362 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "il tipo di elemento dell'array non può essere %s" -#: commands/typecmds.c:394 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "allineamento \"%s\" non riconosciuto" -#: commands/typecmds.c:411 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "immagazzinamento \"%s\" non riconosciuto" -#: commands/typecmds.c:422 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "la funzione di input del tipo deve essere specificata" -#: commands/typecmds.c:426 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "la funzione di output del tipo deve essere specificata" -#: commands/typecmds.c:431 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "la funzione di output del modificatore di tipo è inutile senza una funzione di input" -#: commands/typecmds.c:461 -#, c-format -msgid "type input function %s must return type %s" -msgstr "la funzione %s di input di tipo deve restituire il tipo %s" - -#: commands/typecmds.c:478 -#, c-format -msgid "type output function %s must return type %s" -msgstr "la funzione %s di output di tipo deve restituire il tipo %s" - -#: commands/typecmds.c:487 -#, c-format -msgid "type receive function %s must return type %s" -msgstr "la funzione receive %s del tipo deve restituire il tipo %s" - -#: commands/typecmds.c:496 -#, c-format -msgid "type send function %s must return type %s" -msgstr "la funzione send %s del tipo deve restituire il tipo %s" - -#: commands/typecmds.c:561 -#, c-format -msgid "type input function %s should not be volatile" -msgstr "la funzione di input %s del tipo non può essere volatile" - -#: commands/typecmds.c:566 -#, c-format -msgid "type output function %s should not be volatile" -msgstr "la funzione di output %s del tipo non può essere volatile" - -#: commands/typecmds.c:571 -#, c-format -msgid "type receive function %s should not be volatile" -msgstr "la funzione receive %s del tipo non può essere volatile" - -#: commands/typecmds.c:576 -#, c-format -msgid "type send function %s should not be volatile" -msgstr "la funzione send %s del tipo non può essere volatile" - -#: commands/typecmds.c:581 -#, c-format -msgid "type modifier input function %s should not be volatile" -msgstr "la funzione di input del modificatore %s del tipo non può essere volatile" - -#: commands/typecmds.c:586 +#: commands/typecmds.c:512 #, c-format -msgid "type modifier output function %s should not be volatile" -msgstr "la funzione di output del modificatore %s del tipo non può essere volatile" +msgid "element type cannot be specified without a subscripting function" +msgstr "il tipo di elemento non può essere specificato senza una funzione di indicizzazione" -#: commands/typecmds.c:813 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" non è un tipo di base valido per un dominio" -#: commands/typecmds.c:899 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "più di una espressione di default" -#: commands/typecmds.c:961 commands/typecmds.c:970 +#: commands/typecmds.c:942 commands/typecmds.c:951 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "vincoli NULL/NOT NULL in conflitto" -#: commands/typecmds.c:986 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "i vincoli di controllo per i domini non possono essere NO INHERIT" -#: commands/typecmds.c:995 commands/typecmds.c:2584 +#: commands/typecmds.c:976 commands/typecmds.c:2960 #, c-format msgid "unique constraints not possible for domains" msgstr "i vincoli univoci non sono ammessi per i domini" -#: commands/typecmds.c:1001 commands/typecmds.c:2590 +#: commands/typecmds.c:982 commands/typecmds.c:2966 #, c-format msgid "primary key constraints not possible for domains" msgstr "i vincoli di chiave primaria non sono ammessi per i domini" -#: commands/typecmds.c:1007 commands/typecmds.c:2596 +#: commands/typecmds.c:988 commands/typecmds.c:2972 #, c-format msgid "exclusion constraints not possible for domains" msgstr "i vincoli di esclusione non sono ammessi per i domini" -#: commands/typecmds.c:1013 commands/typecmds.c:2602 +#: commands/typecmds.c:994 commands/typecmds.c:2978 #, c-format msgid "foreign key constraints not possible for domains" msgstr "i vincoli di chiave esterna non sono ammessi per i domini" -#: commands/typecmds.c:1022 commands/typecmds.c:2611 +#: commands/typecmds.c:1003 commands/typecmds.c:2987 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "specificare la deferibilità dei vincoli non è ammesso per i domini" -#: commands/typecmds.c:1353 utils/cache/typcache.c:2319 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s non è una enumerazione" -#: commands/typecmds.c:1491 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "l'attributo \"subtype\" del tipo è richiesto" -#: commands/typecmds.c:1496 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "il sottotipo dell'intervallo non può essere %s" -#: commands/typecmds.c:1515 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "è stato specificato un ordinamento per gli intervalli ma il sottotipo non supporta ordinamenti" -#: commands/typecmds.c:1748 +#: commands/typecmds.c:1492 +#, c-format +msgid "cannot specify a canonical function without a pre-created shell type" +msgstr "non è possibile specificare una funzione canonica senza un tipo di shell pre-creato" + +#: 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 "Crea il tipo come tipo di shell, quindi crea la sua funzione di canonicalizzazione, quindi esegui un CREATE TYPE completo." + +#: commands/typecmds.c:1966 +#, c-format +msgid "type input function %s has multiple matches" +msgstr "tipo input funzione %s ha più corrispondenze" + +#: commands/typecmds.c:1984 +#, c-format +msgid "type input function %s must return type %s" +msgstr "la funzione %s di input di tipo deve restituire il tipo %s" + +#: commands/typecmds.c:2000 +#, c-format +msgid "type input function %s should not be volatile" +msgstr "la funzione di input %s del tipo non può essere volatile" + +#: commands/typecmds.c:2028 +#, c-format +msgid "type output function %s must return type %s" +msgstr "la funzione %s di output di tipo deve restituire il tipo %s" + +#: commands/typecmds.c:2035 +#, c-format +msgid "type output function %s should not be volatile" +msgstr "la funzione di output %s del tipo non può essere volatile" + +#: commands/typecmds.c:2064 +#, c-format +msgid "type receive function %s has multiple matches" +msgstr "tipo funzione di ricezione %s ha più corrispondenze" + +#: commands/typecmds.c:2082 +#, c-format +msgid "type receive function %s must return type %s" +msgstr "la funzione receive %s del tipo deve restituire il tipo %s" + +#: commands/typecmds.c:2089 +#, c-format +msgid "type receive function %s should not be volatile" +msgstr "la funzione receive %s del tipo non può essere volatile" + +#: commands/typecmds.c:2117 #, c-format -msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" -msgstr "modifica del tipo di argomento della funzione %s da \"opaque\" a \"cstring\"" +msgid "type send function %s must return type %s" +msgstr "la funzione send %s del tipo deve restituire il tipo %s" -#: commands/typecmds.c:1799 +#: commands/typecmds.c:2124 #, c-format -msgid "changing argument type of function %s from \"opaque\" to %s" -msgstr "modifica del tipo di argomento della funzione %s da \"opaque\" a %s" +msgid "type send function %s should not be volatile" +msgstr "la funzione send %s del tipo non può essere volatile" -#: commands/typecmds.c:1898 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "la funzione %s typmod_in deve restituire il tipo %s" -#: commands/typecmds.c:1925 +#: commands/typecmds.c:2158 +#, c-format +msgid "type modifier input function %s should not be volatile" +msgstr "la funzione di input del modificatore %s del tipo non può essere volatile" + +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "la funzione %s typmod_out deve restituire il tipo %s" -#: commands/typecmds.c:1952 +#: commands/typecmds.c:2192 +#, c-format +msgid "type modifier output function %s should not be volatile" +msgstr "la funzione di output del modificatore %s del tipo non può essere volatile" + +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "la funzione %s analyze deve restituire il tipo %s" -#: commands/typecmds.c:1998 +#: commands/typecmds.c:2248 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "la funzione di indicizzazione del tipo %s deve restituire il tipo %s" + +#: commands/typecmds.c:2258 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "i tipi definiti dall'utente non possono utilizzare la funzione di indicizzazione %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 "Occorre specificare una classe di operatori per l'intervallo o definire una classe di operatori predefinita per il sottotipo." -#: commands/typecmds.c:2029 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "la funzione canonica %s dell'intervallo deve restituire un intervallo" -#: commands/typecmds.c:2035 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "la funzione canonica %s dell'intervallo deve essere immutabile" -#: commands/typecmds.c:2071 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "la funzione %s di differenza sottotipo range deve restituire il tipo %s" -#: commands/typecmds.c:2078 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "la funzione di differenza sottotipo %s deve essere immutabile" -#: commands/typecmds.c:2105 +#: commands/typecmds.c:2411 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "valore di OID array di pg_type non impostato in modalità di aggiornamento binaria" -#: commands/typecmds.c:2409 +#: commands/typecmds.c:2444 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "pg_type Valore OID multirange non impostato in modalità di aggiornamento binario" + +#: commands/typecmds.c:2477 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "pg_type Il valore OID dell'array multirange non è impostato in modalità di aggiornamento binario" + +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "la colonna \"%s\" della tabella \"%s\" contiene valori null" -#: commands/typecmds.c:2523 commands/typecmds.c:2708 +#: commands/typecmds.c:2889 commands/typecmds.c:3091 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "il vincolo \"%s\" del dominio \"%s\" non esiste" -#: commands/typecmds.c:2527 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "il vincolo \"%s\" del dominio \"%s\" non esiste, saltato" -#: commands/typecmds.c:2715 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "il vincolo \"%s\" del dominio \"%s\" non è un vincolo di controllo" -#: commands/typecmds.c:2821 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "la colonna \"%s\" della tabella \"%s\" contiene valori che violano il nuovo vincolo" -#: commands/typecmds.c:3049 commands/typecmds.c:3255 commands/typecmds.c:3337 -#: commands/typecmds.c:3524 +#: 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 non è un dominio" -#: commands/typecmds.c:3082 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "il vincolo \"%s\" del dominio \"%s\" esiste già" -#: commands/typecmds.c:3133 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "non è possibile usare riferimenti a tabelle nel vincolo di controllo del dominio" -#: commands/typecmds.c:3267 commands/typecmds.c:3349 commands/typecmds.c:3641 +#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 #, c-format msgid "%s is a table's row type" msgstr "%s è il tipo della riga di una tabella" -#: commands/typecmds.c:3269 commands/typecmds.c:3351 commands/typecmds.c:3643 +#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 #, c-format msgid "Use ALTER TABLE instead." msgstr "Usa ALTER TABLE invece." -#: commands/typecmds.c:3276 commands/typecmds.c:3358 commands/typecmds.c:3556 +#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 #, c-format msgid "cannot alter array type %s" msgstr "non è possibile modificare il tipo di array %s" -#: commands/typecmds.c:3278 commands/typecmds.c:3360 commands/typecmds.c:3558 +#: 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 "puoi modificare il tipo %s, il che modificherà il tipo dell'array come conseguenza." +msgstr "Puoi modificare il tipo %s, che altererà anche il tipo di array." -#: commands/typecmds.c:3626 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "il tipo \"%s\" esiste già nello schema \"%s\"" -#: commands/user.c:141 +#: commands/typecmds.c:4170 +#, c-format +msgid "cannot change type's storage to PLAIN" +msgstr "non è possibile modificare lo spazio di archiviazione del tipo in PLAIN" + +#: commands/typecmds.c:4263 +#, c-format +msgid "type attribute \"%s\" cannot be changed" +msgstr "l'attributo di tipo \"%s\" non può essere modificato" + +#: commands/typecmds.c:4281 +#, c-format +msgid "must be superuser to alter a type" +msgstr "deve essere superutente per modificare un tipo" + +#: commands/typecmds.c:4302 commands/typecmds.c:4311 +#, c-format +msgid "%s is not a base type" +msgstr "%s non è un tipo di base" + +#: commands/user.c:138 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID non può più essere specificato" -#: commands/user.c:295 +#: commands/user.c:256 #, c-format msgid "must be superuser to create superusers" msgstr "solo i superutenti possono creare superutenti" -#: commands/user.c:302 +#: commands/user.c:263 #, c-format msgid "must be superuser to create replication users" msgstr "solo i superutenti possono creare utenti di replica" -#: commands/user.c:309 commands/user.c:707 +#: commands/user.c:270 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "solo i superutenti possono cambiare l'attributo bypassrls" +msgid "must be superuser to create bypassrls users" +msgstr "deve essere superutente per creare utenti bypassrls" -#: commands/user.c:316 +#: commands/user.c:277 #, c-format msgid "permission denied to create role" msgstr "permesso di creare il ruolo negato" -#: commands/user.c:326 commands/user.c:1195 commands/user.c:1202 -#: utils/adt/acl.c:5342 utils/adt/acl.c:5348 gram.y:14877 gram.y:14915 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 gram.y:16483 utils/adt/acl.c:5331 utils/adt/acl.c:5337 #, c-format msgid "role name \"%s\" is reserved" msgstr "il nome di ruolo \"%s\" è riservato" -#: commands/user.c:328 commands/user.c:1197 commands/user.c:1204 +#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "I nomi di ruoli che iniziano con \"pg_\" sono riservati." -#: commands/user.c:340 commands/user.c:1210 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "il ruolo \"%s\" esiste già" -#: commands/user.c:406 commands/user.c:816 +#: commands/user.c:376 commands/user.c:754 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "la stringa vuota non è una password valida, password rimossa" -#: commands/user.c:437 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "valore di OID di pg_authid non impostato in modalità di aggiornamento binaria" -#: commands/user.c:693 commands/user.c:915 commands/user.c:1449 -#: commands/user.c:1593 +#: commands/user.c:638 #, c-format -msgid "must be superuser to alter superusers" -msgstr "solo i superutenti possono modificare superutenti" +msgid "must be superuser to alter superuser roles or change superuser attribute" +msgstr "deve essere superutente per modificare i ruoli di superutente o modificare l'attributo di superutente" + +#: commands/user.c:645 +#, c-format +msgid "must be superuser to alter replication roles or change replication attribute" +msgstr "deve essere superutente per modificare i ruoli di replica o modificare l'attributo di replica" -#: commands/user.c:700 +#: commands/user.c:652 #, c-format -msgid "must be superuser to alter replication users" -msgstr "solo i superutenti possono modificare utenti di replica" +msgid "must be superuser to change bypassrls attribute" +msgstr "solo i superutenti possono cambiare l'attributo bypassrls" -#: commands/user.c:723 commands/user.c:923 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "permesso negato" -#: commands/user.c:953 +#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 +#, c-format +msgid "must be superuser to alter superusers" +msgstr "solo i superutenti possono modificare superutenti" + +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "solo i superutenti possono alterare impostazioni globalmente" -#: commands/user.c:975 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "permesso di eliminare il ruolo negato" -#: commands/user.c:999 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "non è possibile usare lo specificatore di ruolo speciale in DROP ROLE" -#: commands/user.c:1009 commands/user.c:1166 commands/variable.c:822 -#: commands/variable.c:894 utils/adt/acl.c:5199 utils/adt/acl.c:5246 -#: utils/adt/acl.c:5274 utils/adt/acl.c:5292 utils/init/miscinit.c:607 +#: 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 "il ruolo \"%s\" non esiste" -#: commands/user.c:1014 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "il ruolo \"%s\" non esiste, saltato" -#: commands/user.c:1026 commands/user.c:1030 +#: commands/user.c:971 commands/user.c:975 #, c-format msgid "current user cannot be dropped" msgstr "l'utente corrente non può essere eliminato" -#: commands/user.c:1034 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "l'utente della sessione non può essere eliminato" -#: commands/user.c:1045 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "solo i superutenti possono eliminare superutenti" -#: commands/user.c:1061 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "il ruolo \"%s\" non può essere eliminato perché alcuni oggetti ne dipendono" -#: commands/user.c:1182 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "l'utente della sessione non può essere rinominato" -#: commands/user.c:1186 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "l'utente corrente non può essere eliminato" -#: commands/user.c:1220 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "solo i superutenti possono rinominare superutenti" -#: commands/user.c:1227 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "permesso di rinominare il ruolo negato" -#: commands/user.c:1248 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "L'MD5 della password è stato cancellato perché il ruolo è stato rinominato" -#: commands/user.c:1308 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "la colonna dei nomi non può essere inclusa in GRANT/REVOKE ROLE" -#: commands/user.c:1346 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "permesso di eliminare gli oggetti negato" -#: commands/user.c:1373 commands/user.c:1382 +#: commands/user.c:1326 commands/user.c:1335 #, c-format msgid "permission denied to reassign objects" msgstr "permesso di riassegnare gli oggetti negato" -#: commands/user.c:1457 commands/user.c:1601 +#: commands/user.c:1408 commands/user.c:1581 #, c-format msgid "must have admin option on role \"%s\"" msgstr "occorre avere l'opzione admin sul ruolo \"%s\"" -#: commands/user.c:1474 +#: commands/user.c:1422 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "il ruolo \"%s\" non può avere membri espliciti" + +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "solo i superutenti possono impostare chi ha concesso il privilegio" -#: commands/user.c:1499 +#: commands/user.c:1468 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "il ruolo \"%s\" non può essere un membro di alcun ruolo" + +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "il ruolo \"%s\" è membro del ruolo \"%s\"" -#: commands/user.c:1514 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "il ruolo \"%s\" è già membro del ruolo \"%s\"" -#: commands/user.c:1623 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "il ruolo \"%s\" non è membro del ruolo \"%s\"" -#: commands/vacuum.c:111 -#, c-format -msgid "ANALYZE option must be specified when a column list is provided" -msgstr "occorre specificare l'opzione ANALYZE quando è fornita una lista di colonne" - -#: commands/vacuum.c:203 -#, c-format -msgid "%s cannot be executed from VACUUM or ANALYZE" -msgstr "%s non può essere eseguito da VACUUM o ANALYZE" - -#: commands/vacuum.c:213 +#: commands/vacuum.c:139 #, c-format -msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" -msgstr "l'opzione DISABLE_PAGE_SKIPPING di VACUUM non può essere usata con FULL" +msgid "unrecognized ANALYZE option \"%s\"" +msgstr "opzione ANALIZZA \"%s\" non riconosciuta" -#: commands/vacuum.c:657 +#: commands/vacuum.c:177 #, c-format -msgid "oldest xmin is far in the past" -msgstr "il più vecchio xmin è molto lontano nel tempo" +msgid "parallel option requires a value between 0 and %d" +msgstr "l'opzione parallela richiede un valore compreso tra 0 e %d" -#: commands/vacuum.c:658 +#: commands/vacuum.c:189 #, 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 "" -"Chiudi presto le transazioni per evitare problemi di wraparound.\n" -"Potrebbe essere necessario inoltre effettuare il COMMIT o il ROLLBACK di vecchie transazioni preparate, o eliminare vecchi slot di replica." +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "i lavoratori paralleli per il vuoto devono essere compresi tra 0 e %d" -#: commands/vacuum.c:698 +#: commands/vacuum.c:206 #, c-format -msgid "oldest multixact is far in the past" -msgstr "il multixact più vecchio è remoto" +msgid "unrecognized VACUUM option \"%s\"" +msgstr "opzione di VACUUM \"%s\" sconosciuta" -#: commands/vacuum.c:699 +#: commands/vacuum.c:229 #, c-format -msgid "Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "Chiudi presto le transazioni con multixact per evitare problemi di wraparound." +msgid "VACUUM FULL cannot be performed in parallel" +msgstr "VACUUM FULL non può essere eseguito in parallelo" -#: commands/vacuum.c:1245 +#: commands/vacuum.c:245 #, c-format -msgid "some databases have not been vacuumed in over 2 billion transactions" -msgstr "alcuni database non sono stati ripuliti per più di 2 miliardi di transazioni" +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "occorre specificare l'opzione ANALYZE quando è fornita una lista di colonne" -#: commands/vacuum.c:1246 +#: commands/vacuum.c:335 #, c-format -msgid "You might have already suffered transaction-wraparound data loss." -msgstr "Potresti aver già subito perdita di dati dovuta al wraparound delle transazioni." +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s non può essere eseguito da VACUUM o ANALYZE" -#: commands/vacuum.c:1418 +#: commands/vacuum.c:345 #, c-format -msgid "skipping vacuum of \"%s\" --- lock not available" -msgstr "pulizia di \"%s\" saltata --- lock non disponibile" +msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" +msgstr "l'opzione DISABLE_PAGE_SKIPPING di VACUUM non può essere usata con FULL" -#: commands/vacuum.c:1423 +#: commands/vacuum.c:352 #, c-format -msgid "skipping vacuum of \"%s\" --- relation no longer exists" -msgstr "pulizia di \"%s\" saltata --- la relazione non esiste più" +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "PROCESS_TOAST richiesto con VACUUM FULL" -#: commands/vacuum.c:1447 +#: commands/vacuum.c:586 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "\"%s\" saltato --- solo i superutenti possono pulirla" -#: commands/vacuum.c:1451 +#: commands/vacuum.c:590 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "\"%s\" saltato --- solo i superutenti o il proprietario del database possono pulirla" -#: commands/vacuum.c:1455 +#: commands/vacuum.c:594 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "\"%s\" saltato --- solo il proprietario del database o della tabella possono pulirla" -#: commands/vacuum.c:1472 -#, c-format -msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" -msgstr "\"%s\" saltato --- non è possibile ripulire non-tabelle o tabelle speciali di sistema" - -#: commands/vacuumlazy.c:378 -#, c-format -msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" -msgstr "vacuum automatico aggressivo della tabella \"%s.%s.%s\": scansioni di indici: %d\n" - -#: commands/vacuumlazy.c:380 -#, c-format -msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" -msgstr "vacuum automatico della tabella \"%s.%s.%s\": scan di indici: %d\n" - -#: commands/vacuumlazy.c:386 -#, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "pagine: %u rimosse, %u restanti, %u saltate perché bloccate, %u congelate saltate\n" - -#: commands/vacuumlazy.c:392 -#, c-format -msgid "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, oldest xmin: %u\n" -msgstr "tuple: %.0f rimosse, %.0f restanti, %.0f sono morte ma non possono essere ancora rimosse, xmin più vecchio: %u\n" - -#: commands/vacuumlazy.c:398 +#: commands/vacuum.c:609 #, c-format -msgid "buffer usage: %d hits, %d misses, %d dirtied\n" -msgstr "uso dei buffer: %d colpiti, %d mancati, %d sporcati\n" +msgid "skipping \"%s\" --- only superuser can analyze it" +msgstr "\"%s\" saltato --- solo un superutente può analizzarlo" -#: commands/vacuumlazy.c:402 +#: commands/vacuum.c:613 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "velocità di lettura media: %.3f MB/s, velocità di scrittura media: %.3f MB/s\n" +msgid "skipping \"%s\" --- only superuser or database owner can analyze it" +msgstr "\"%s\" saltato --- solo un superutente o il proprietario del database possono analizzarlo" -#: commands/vacuumlazy.c:404 +#: commands/vacuum.c:617 #, c-format -msgid "system usage: %s" -msgstr "utilizzo di sistema: %s" +msgid "skipping \"%s\" --- only table or database owner can analyze it" +msgstr "\"%s\" saltato --- solo il proprietario del database o della tabella possono analizzarlo" -#: commands/vacuumlazy.c:500 +#: commands/vacuum.c:696 commands/vacuum.c:792 #, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "vacuum aggressivo di \"%s.%s\"" +msgid "skipping vacuum of \"%s\" --- lock not available" +msgstr "pulizia di \"%s\" saltata --- lock non disponibile" -#: commands/vacuumlazy.c:881 +#: commands/vacuum.c:701 #, c-format -msgid "relation \"%s\" page %u is uninitialized --- fixing" -msgstr "la relazione \"%s\" pagina %u non è inizializzata --- in correzione" +msgid "skipping vacuum of \"%s\" --- relation no longer exists" +msgstr "pulizia di \"%s\" saltata --- la relazione non esiste più" -#: commands/vacuumlazy.c:1417 +#: commands/vacuum.c:717 commands/vacuum.c:797 #, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": %.0f versioni di riga rimosse in %u pagine" +msgid "skipping analyze of \"%s\" --- lock not available" +msgstr "analisi di \"%s\" saltata --- lock non disponibile" -#: commands/vacuumlazy.c:1427 +#: commands/vacuum.c:722 #, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0f versioni di righe morte non possono essere ancora rimosse, xmin più vecchio: %u\n" +msgid "skipping analyze of \"%s\" --- relation no longer exists" +msgstr "analisi di \"%s\" saltata --- la relazione non esiste più" -#: commands/vacuumlazy.c:1429 +#: commands/vacuum.c:1041 #, c-format -msgid "There were %.0f unused item pointers.\n" -msgstr "C'erano %.0f puntatori ad elementi non usati.\n" +msgid "oldest xmin is far in the past" +msgstr "il più vecchio xmin è molto lontano nel tempo" -#: commands/vacuumlazy.c:1431 +#: commands/vacuum.c:1042 #, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "%u pagine saltate a causa di buffer pin, " -msgstr[1] "%u pagine saltate a causa di buffer pin, " +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 "" +"Chiudi presto le transazioni per evitare problemi di wraparound.\n" +"Potrebbe essere necessario inoltre effettuare il COMMIT o il ROLLBACK di vecchie transazioni preparate, o eliminare vecchi slot di replica." -#: commands/vacuumlazy.c:1435 +#: commands/vacuum.c:1085 #, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "%u pagine congelate.\n" -msgstr[1] "%u pagine congelate.\n" +msgid "oldest multixact is far in the past" +msgstr "il multixact più vecchio è remoto" -#: commands/vacuumlazy.c:1439 +#: commands/vacuum.c:1086 #, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "%u pagina è completamente vuota.\n" -msgstr[1] "%u pagina sono completamente vuote.\n" +msgid "Close open transactions with multixacts soon to avoid wraparound problems." +msgstr "Chiudi presto le transazioni con multixact per evitare problemi di wraparound." -#: commands/vacuumlazy.c:1443 +#: commands/vacuum.c:1792 #, c-format -msgid "%s." -msgstr "%s." +msgid "some databases have not been vacuumed in over 2 billion transactions" +msgstr "alcuni database non sono stati ripuliti per più di 2 miliardi di transazioni" -#: commands/vacuumlazy.c:1446 +#: commands/vacuum.c:1793 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgstr "\"%s\": trovate %.0f versioni di riga removibili, %.0f non removibili in %u pagine su %u" +msgid "You might have already suffered transaction-wraparound data loss." +msgstr "Potresti aver già subito perdita di dati dovuta al wraparound delle transazioni." -#: commands/vacuumlazy.c:1515 +#: commands/vacuum.c:1957 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": %d versioni di riga rimosse in %d pagine" +msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" +msgstr "\"%s\" saltato --- non è possibile ripulire non-tabelle o tabelle speciali di sistema" -#: commands/vacuumlazy.c:1704 +#: commands/vacuum.c:2328 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "effettuata la scansione dell'indice \"%s\" per rimuovere %d versioni di riga" -#: commands/vacuumlazy.c:1756 +#: commands/vacuum.c:2347 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "l'indice \"%s\" ora contiene %.0f versioni di riga in %u pagine" -#: commands/vacuumlazy.c:1760 +#: commands/vacuum.c:2351 #, c-format msgid "" "%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." msgstr "" -"%.0f versioni di riga dell'indice sono state rimosse.\n" -"%u pagine dell'indice sono state cancellate, %u sono attualmente riusabili.\n" -"%s." - -#: commands/vacuumlazy.c:1855 -#, c-format -msgid "\"%s\": stopping truncate due to conflicting lock request" -msgstr "\"%s\": truncate interrotto a causa di una richiesta di lock in conflitto" +"%.0f versioni di righe di indice sono state rimosse.\n" +"%u pagine di indice sono state eliminate di recente.\n" +"%u pagine di indice sono attualmente cancellate, di cui %u sono attualmente riutilizzabili." -#: commands/vacuumlazy.c:1920 +#: commands/vacuumparallel.c:664 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": %u pagine ridotte a %u" +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] "lanciato %d aspirapolvere parallelo per l'aspirazione dell'indice (pianificato: %d)" +msgstr[1] "lanciato %d aspiratori paralleli per l'aspirazione degli indici (pianificato: %d)" -#: commands/vacuumlazy.c:1985 +#: commands/vacuumparallel.c:670 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": annullamento del troncamento a causa di richieste di lock in conflitto" +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] "lanciato %d aspirapolvere parallelo per la pulizia dell'indice (pianificato: %d)" +msgstr[1] "lanciato %d aspiratori paralleli per la pulizia dell'indice (pianificato: %d)" -#: commands/variable.c:165 utils/misc/guc.c:10298 utils/misc/guc.c:10360 +#: commands/variable.c:165 utils/misc/guc.c:12109 utils/misc/guc.c:12187 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Parola chiave non riconosciuta: \"%s\"." @@ -10896,758 +12057,821 @@ msgstr "la modalità read-write dev'essere impostata prima di qualsiasi query" msgid "cannot set transaction read-write mode during recovery" msgstr "non è possibile impostare la transazione in lettura/scrittura durante il ripristino" -#: commands/variable.c:557 +#: commands/variable.c:534 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" msgstr "SET TRANSACTION ISOLATION LEVEL dev'essere invocato prima di qualsiasi query" -#: commands/variable.c:564 +#: commands/variable.c:541 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVEL non può essere invocato in una sotto-transazione" -#: commands/variable.c:571 storage/lmgr/predicate.c:1603 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "non è possibile usare la modalità SERIALIZABLE in un hot standby" -#: commands/variable.c:572 +#: commands/variable.c:549 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "Puoi utilizzare REPEATABLE READ invece." -#: commands/variable.c:620 +#: commands/variable.c:567 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" msgstr "SET TRANSACTION [NOT] DEFERRABLE non può essere invocato in una sotto-transazione" -#: commands/variable.c:626 +#: commands/variable.c:573 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" msgstr "SET TRANSACTION [NOT] DEFERRABLE dev'essere invocato prima di qualsiasi query" -#: commands/variable.c:708 +#: commands/variable.c:655 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "La conversione fra %s e %s non è supportata." -#: commands/variable.c:715 +#: commands/variable.c:662 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "Non è possibile cambiare \"client_encoding\" ora." -#: commands/variable.c:776 +#: commands/variable.c:723 #, c-format msgid "cannot change client_encoding during a parallel operation" msgstr "non è possibile cambiare client_encoding durante un'operazione parallela" -#: commands/variable.c:912 +#: commands/variable.c:890 #, c-format -msgid "permission denied to set role \"%s\"" -msgstr "permesso di impostare il ruolo \"%s\" negato" - -#: commands/view.c:54 -#, c-format -msgid "invalid value for \"check_option\" option" -msgstr "valore non valido per l'opzione \"check_option\"" +msgid "permission will be denied to set role \"%s\"" +msgstr "verrà negata l'autorizzazione per impostare il ruolo \"%s\"" -#: commands/view.c:55 +#: commands/variable.c:895 #, c-format -msgid "Valid values are \"local\" and \"cascaded\"." -msgstr "Valori validi sono \"local\" e \"cascaded\"." +msgid "permission denied to set role \"%s\"" +msgstr "permesso di impostare il ruolo \"%s\" negato" -#: commands/view.c:103 +#: commands/view.c:84 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "non è stato possibile determinare quale ordinamento usare per la colonna \"%s\"" -#: commands/view.c:117 -#, c-format -msgid "view must have at least one column" -msgstr "la vista deve avere almeno una colonna" - -#: commands/view.c:285 commands/view.c:297 +#: commands/view.c:279 commands/view.c:290 #, c-format msgid "cannot drop columns from view" msgstr "non è possibile eliminare colonne da una vista" -#: commands/view.c:302 +#: commands/view.c:295 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "non è possibile cambiare nome della colonna di vista \"%s\" in \"%s\"" -#: commands/view.c:310 +#: commands/view.c:298 +#, c-format +msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." +msgstr "Utilizzare ALTER VIEW ... RENAME COLUMN ... per cambiare invece il nome della colonna di visualizzazione." + +#: commands/view.c:309 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "non è possibile cambiare tipo di dato della colonna di vista \"%s\" da %s a %s" -#: commands/view.c:455 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "impossibile modificare le regole di confronto della colonna di visualizzazione \"%s\" da \"%s\" a \"%s\"" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "le viste non possono contenere SELECT INTO" -#: commands/view.c:467 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "una vista non può contenere istruzioni di modifica dei dati in un WITH" -#: commands/view.c:537 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW specifica più nomi di colonne che colonne" -#: commands/view.c:545 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "le viste non possono essere non loggate perché non sono immagazzinate" -#: commands/view.c:559 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vista \"%s\" sarà una vista temporanea" -#: executor/execCurrent.c:78 +#: executor/execCurrent.c:79 #, c-format msgid "cursor \"%s\" is not a SELECT query" msgstr "il cursore \"%s\" non è una query SELECT" -#: executor/execCurrent.c:84 +#: executor/execCurrent.c:85 #, c-format msgid "cursor \"%s\" is held from a previous transaction" msgstr "il cursore \"%s\" è trattenuto da una precedente transazione" -#: executor/execCurrent.c:116 +#: executor/execCurrent.c:118 #, c-format msgid "cursor \"%s\" has multiple FOR UPDATE/SHARE references to table \"%s\"" msgstr "il cursore \"%s\" ha più di un riferimento FOR UPDATE/SHARE alla tabella \"%s\"" -#: executor/execCurrent.c:125 +#: executor/execCurrent.c:127 #, c-format msgid "cursor \"%s\" does not have a FOR UPDATE/SHARE reference to table \"%s\"" msgstr "il cursore \"%s\" non ha alcun riferimento FOR UPDATE/SHARE alla tabella \"%s\"" -#: executor/execCurrent.c:135 executor/execCurrent.c:180 +#: executor/execCurrent.c:137 executor/execCurrent.c:182 #, c-format msgid "cursor \"%s\" is not positioned on a row" msgstr "il cursore \"%s\" non è posizionato su una riga" -#: executor/execCurrent.c:167 executor/execCurrent.c:226 -#: executor/execCurrent.c:238 +#: executor/execCurrent.c:169 executor/execCurrent.c:228 executor/execCurrent.c:239 #, c-format msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "il cursore \"%s\" non è una scansione semplice aggiornabile della tabella \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2284 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2453 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "il tipo del parametro %d (%s) non combacia con quello usato alla preparazione del piano (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2296 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2465 #, c-format msgid "no value found for parameter %d" msgstr "nessun valore trovato per il parametro %d" -#: executor/execExpr.c:856 parser/parse_agg.c:794 +#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 executor/execExprInterp.c:4052 executor/execExprInterp.c:4069 executor/execExprInterp.c:4168 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 "il tipo della riga della tabella e il tipo di riga specificato dalla query non corrispondono" + +#: executor/execExpr.c:633 executor/nodeModifyTable.c:219 +#, c-format +msgid "Query has too many columns." +msgstr "La query ha troppe colonne." + +#: executor/execExpr.c:640 executor/nodeModifyTable.c:247 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "La query produce un valore per una colonna eliminata in posizione %d." + +#: executor/execExpr.c:646 executor/execExprInterp.c:4070 executor/nodeModifyTable.c:230 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "La tabella ha il tipo %s in posizione %d, ma la query prevede %s." + +#: executor/execExpr.c:1110 parser/parse_agg.c:827 #, c-format msgid "window function calls cannot be nested" msgstr "le chiamate a funzioni finestra non possono essere annidate" -#: executor/execExpr.c:1314 +#: executor/execExpr.c:1614 #, c-format msgid "target type is not an array" msgstr "il tipo di destinazione non è un array" -#: executor/execExpr.c:1646 +#: executor/execExpr.c:1954 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "la colonna ROW() è di tipo %s invece di %s" -#: executor/execExpr.c:2181 executor/execSRF.c:697 parser/parse_func.c:126 -#: parser/parse_func.c:640 parser/parse_func.c:1014 +#: executor/execExpr.c:2479 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] "non è possibile passare più di %d argomento ad una funzione" msgstr[1] "non è possibile passare più di %d argomenti ad una funzione" -#: executor/execExpr.c:2479 executor/execExpr.c:2485 -#: executor/execExprInterp.c:2613 utils/adt/arrayfuncs.c:261 -#: utils/adt/arrayfuncs.c:559 utils/adt/arrayfuncs.c:1301 -#: utils/adt/arrayfuncs.c:3347 utils/adt/arrayfuncs.c:5303 -#: utils/adt/arrayfuncs.c:5820 +#: executor/execExpr.c:2506 executor/execSRF.c:738 executor/functions.c:1073 utils/adt/jsonfuncs.c:3691 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "il numero di dimensioni dell'array (%d) eccede il massimo consentito (%d)" +msgid "set-valued function called in context that cannot accept a set" +msgstr "la funzione che restituisce insiemi è chiamata in un contesto che non può accettare un insieme" + +#: executor/execExpr.c:2865 parser/parse_node.c:276 parser/parse_node.c:326 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "impossibile inserire l'indicizzazione %s perché non supporta l'indicizzazione" -#: executor/execExprInterp.c:1879 +#: executor/execExpr.c:2993 executor/execExpr.c:3015 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "il tipo %s non supporta l'assegnazione con pedice" + +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "l'attributo %d del tipo %s è stato rimosso" -#: executor/execExprInterp.c:1885 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "l'attributo %d del tipo %s ha il tipo sbagliato" -#: executor/execExprInterp.c:1887 executor/execExprInterp.c:2886 -#: executor/execExprInterp.c:2933 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3054 executor/execExprInterp.c:3100 #, c-format msgid "Table has type %s, but query expects %s." msgstr "La tabella ha il tipo %s, ma la query prevede %s." -#: executor/execExprInterp.c:2374 +#: executor/execExprInterp.c:2005 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 "il tipo %s non è composito" + +#: executor/execExprInterp.c:2543 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF non è supportato per questo tipo di tabella" -#: executor/execExprInterp.c:2591 +#: executor/execExprInterp.c:2756 #, c-format msgid "cannot merge incompatible arrays" msgstr "non è possibile unire array non compatibili" -#: executor/execExprInterp.c:2592 +#: executor/execExprInterp.c:2757 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Un array con tipo di elementi %s non può essere incluso nel costrutto ARRAY con elementi di tipo %s." -#: executor/execExprInterp.c:2633 executor/execExprInterp.c:2663 +#: executor/execExprInterp.c:2778 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 "il numero di dimensioni dell'array (%d) eccede il massimo consentito (%d)" + +#: executor/execExprInterp.c:2798 executor/execExprInterp.c:2828 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "gli array multidimensionali devono avere espressioni array di dimensioni corrispondenti" -#: executor/execExprInterp.c:2885 executor/execExprInterp.c:2932 +#: executor/execExprInterp.c:3053 executor/execExprInterp.c:3099 #, c-format msgid "attribute %d has wrong type" msgstr "l'attributo %d è di tipo errato" -#: executor/execExprInterp.c:3042 -#, c-format -msgid "array subscript in assignment must not be null" -msgstr "l'indice di un array nell'assegnamento non può essere nullo" - -#: executor/execExprInterp.c:3475 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3681 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "il DOMAIN %s non consente valori nulli" -#: executor/execExprInterp.c:3490 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3696 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "il valore per il DOMAIN %s viola il vincolo di controllo \"%s\"" -#: executor/execExprInterp.c:3861 executor/execExprInterp.c:3878 -#: executor/execExprInterp.c:3980 executor/nodeModifyTable.c:106 -#: executor/nodeModifyTable.c:117 executor/nodeModifyTable.c:134 -#: executor/nodeModifyTable.c:142 -#, c-format -msgid "table row type and query-specified row type do not match" -msgstr "il tipo della riga della tabella e il tipo di riga specificato dalla query non corrispondono" - -#: executor/execExprInterp.c:3862 +#: executor/execExprInterp.c:4053 #, 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] "La riga della tabella contiene %d attributo, ma la query ne prevede %d." msgstr[1] "La riga della tabella contiene %d attributi, ma la query ne prevede %d." -#: executor/execExprInterp.c:3879 executor/nodeModifyTable.c:118 -#, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "La tabella ha il tipo %s in posizione %d, ma la query prevede %s." - -#: executor/execExprInterp.c:3981 executor/execSRF.c:953 +#: executor/execExprInterp.c:4169 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Il tipo di immagazzinamento fisico non corrisponde per l'attributo eliminato in posizione %d." -#: executor/execIndexing.c:543 +#: executor/execIndexing.c:571 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT non supporta vincoli/esclusioni unici deferibili come arbitri" -#: executor/execIndexing.c:818 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "creazione del vincolo di esclusione \"%s\" fallita" -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "La chiave %s è in conflitto con la chiave %s." -#: executor/execIndexing.c:823 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Ci sono conflitti di chiave." -#: executor/execIndexing.c:829 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "le chiavi in conflitto violano il vincolo di esclusione \"%s\"" -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "La chiave %s è in conflitto con la chiave esistente %s." -#: executor/execIndexing.c:834 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "Conflitti di chiave con chiave esistente." -#: executor/execMain.c:1116 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "non è possibile modificare la sequenza \"%s\"" -#: executor/execMain.c:1122 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "non è possibile modificare la relazione TOAST \"%s\"" -#: executor/execMain.c:1140 rewrite/rewriteHandler.c:2773 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3068 rewrite/rewriteHandler.c:3904 #, c-format msgid "cannot insert into view \"%s\"" msgstr "non è possibile inserire nella vista \"%s\"" -#: executor/execMain.c:1142 rewrite/rewriteHandler.c:2776 +#: 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 "Per consentire inserimenti nella vista occorre fornire un trigger INSTEAD OF INSERT oppure una regola ON INSERT DO INSTEAD senza condizioni." -#: executor/execMain.c:1148 rewrite/rewriteHandler.c:2781 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3076 rewrite/rewriteHandler.c:3912 #, c-format msgid "cannot update view \"%s\"" msgstr "non è possibile modificare la vista \"%s\"" -#: executor/execMain.c:1150 rewrite/rewriteHandler.c:2784 +#: 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 "Per consentire modifiche alla vista occorre fornire un trigger INSTEAD OF UPDATE oppure una regola ON UPDATE DO INSTEAD senza condizioni." -#: executor/execMain.c:1156 rewrite/rewriteHandler.c:2789 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3084 rewrite/rewriteHandler.c:3920 #, c-format msgid "cannot delete from view \"%s\"" msgstr "non è possibile cancellare dalla vista \"%s\"" -#: executor/execMain.c:1158 rewrite/rewriteHandler.c:2792 +#: 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 "Per consentire eliminazioni dalla vista occorre fornire un trigger INSTEAD OF DELETE oppure una regola ON DELETE DO INSTEAD senza condizioni." -#: executor/execMain.c:1169 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "non è possibile modificare la vista materializzata \"%s\"" -#: executor/execMain.c:1181 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "non è possibile inserire nella tabella esterna \"%s\"" -#: executor/execMain.c:1187 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "la tabella esterna \"%s\" non consente inserimenti" -#: executor/execMain.c:1194 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "non è possibile modificare la tabella esterna \"%s\"" -#: executor/execMain.c:1200 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "la tabella esterna \"%s\" non consente modifiche" -#: executor/execMain.c:1207 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "non è possibile eliminare dalla tabella esterna \"%s\"" -#: executor/execMain.c:1213 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "la tabella esterna \"%s\" non consente cancellazioni" -#: executor/execMain.c:1224 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "non è possibile modificare la relazione \"%s\"" -#: executor/execMain.c:1251 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "non è possibile bloccare righe nella sequenza \"%s\"" -#: executor/execMain.c:1258 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "non è possibile bloccare righe nella relazione TOAST \"%s\"" -#: executor/execMain.c:1265 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "non è possibile bloccare righe vista \"%s\"" -#: executor/execMain.c:1273 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "non è possibile bloccare righe nella vista materializzata \"%s\"" -#: executor/execMain.c:1282 executor/execMain.c:2974 -#: executor/nodeLockRows.c:136 +#: executor/execMain.c:1175 executor/execMain.c:2653 executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "non è possibile bloccare righe nella tabella esterna \"%s\"" -#: executor/execMain.c:1288 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "non è possibile bloccare righe nella relazione \"%s\"" -#: executor/execMain.c:1959 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "la nuova riga per la partizione \"%s\" viola il vincolo di partizione" -#: executor/execMain.c:1961 executor/execMain.c:2041 executor/execMain.c:2088 -#: executor/execMain.c:2195 +#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 executor/execMain.c:2132 #, c-format msgid "Failing row contains %s." msgstr "La riga in errore contiene %s." -#: executor/execMain.c:2039 +#: executor/execMain.c:1970 #, c-format -msgid "null value in column \"%s\" violates not-null constraint" -msgstr "valori null nella colonna \"%s\" violano il vincolo non-null" +msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" +msgstr "il valore nullo nella colonna \"%s\" della relazione \"%s\" viola il vincolo non nullo" -#: executor/execMain.c:2086 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "la nuova riga per la relazione \"%s\" viola il vincolo di controllo \"%s\"" -#: executor/execMain.c:2193 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "la nuova riga viola l'opzione di controllo della vista \"%s\"" -#: executor/execMain.c:2203 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "la nuova riga viola la regola di sicurezza per riga \"%s\" per la tabella \"%s\"" -#: executor/execMain.c:2208 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "la nuova riga viola la regola di sicurezza per riga per la tabella \"%s\"" -#: executor/execMain.c:2215 +#: executor/execMain.c:2153 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "la riga di destinazione viola la politica di sicurezza a livello di riga \"%s\" (USING expression) per la tabella \"%s\"" + +#: executor/execMain.c:2158 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "la riga di destinazione viola la politica di sicurezza a livello di riga (USING espressione) per la tabella \"%s\"" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "la nuova riga viola la regola di sicurezza per riga \"%s\" (espressione USING) per la tabella \"%s\"" -#: executor/execMain.c:2220 +#: executor/execMain.c:2170 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "la nuova riga viola la regola di sicurezza per riga (espressione USING) per la tabella \"%s\"" -#: executor/execPartition.c:337 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "nessuna partizione della relazione \"%s\" trovata per la riga" -#: executor/execPartition.c:339 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "La chiave di partizione della riga sbagliata contiene %s." -#: executor/execReplication.c:197 executor/execReplication.c:361 +#: executor/execReplication.c:196 executor/execReplication.c:373 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "la tupla da lockare era stata già mossa in un'altra partizione a causa di una modifica concorrente, sto riprovando" -#: executor/execReplication.c:201 executor/execReplication.c:365 +#: executor/execReplication.c:200 executor/execReplication.c:377 #, c-format msgid "concurrent update, retrying" msgstr "modifica concorrente, sto riprovando" -#: executor/execReplication.c:262 parser/parse_oper.c:228 -#: utils/adt/array_userfuncs.c:719 utils/adt/array_userfuncs.c:858 -#: utils/adt/arrayfuncs.c:3625 utils/adt/arrayfuncs.c:4141 -#: utils/adt/arrayfuncs.c:6101 utils/adt/rowtypes.c:1179 +#: executor/execReplication.c:206 executor/execReplication.c:383 +#, c-format +msgid "concurrent delete, retrying" +msgstr "eliminazione simultanea, riprova" + +#: executor/execReplication.c:269 parser/parse_cte.c:509 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:4210 utils/adt/arrayfuncs.c:6202 utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "operatore di uguaglianza per il tipo %s non trovato" -#: executor/execReplication.c:578 +#: executor/execReplication.c:599 executor/execReplication.c:605 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "impossibile aggiornare la tabella \"%s\"" + +#: executor/execReplication.c:601 executor/execReplication.c:613 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "La colonna utilizzata nella pubblicazione WHERE espressione non fa parte dell'identità di replica." + +#: executor/execReplication.c:607 executor/execReplication.c:619 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "L'elenco di colonne utilizzato dalla pubblicazione non copre l'identità della replica." + +#: executor/execReplication.c:611 executor/execReplication.c:617 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "impossibile eliminare dalla tabella \"%s\"" + +#: executor/execReplication.c:637 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "non è possibile modificare la tabella \"%s\" perché non ha una identità di replica ma pubblica le righe modificate" -#: executor/execReplication.c:580 +#: executor/execReplication.c:639 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Per abilitare le modifiche della tabella imposta REPLICA IDENTITY tramite ALTER TABLE." -#: executor/execReplication.c:584 +#: executor/execReplication.c:643 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "non è possibile cancellare dalla tabella \"%s\" perché non ha una identità di replica ma pubblica le righe cancellate" -#: executor/execReplication.c:586 +#: executor/execReplication.c:645 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Per abilitare le cancellazioni sulla tabella imposta REPLICA IDENTITY tramite ALTER TABLE." -#: executor/execReplication.c:605 +#: executor/execReplication.c:661 #, c-format -msgid "logical replication target relation \"%s.%s\" is not a table" -msgstr "la relazione di destinazione per la replica logica \"%s.%s\" non è una tabella" +msgid "cannot use relation \"%s.%s\" as logical replication target" +msgstr "impossibile utilizzare la relazione \"%s.%s\" come destinazione di replica logica" -#: executor/execSRF.c:308 +#: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "le righe restituite dalla funzione non sono tutte dello stesso tipo" -#: executor/execSRF.c:356 executor/execSRF.c:647 +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "non è stato seguito il protocollo della funzione tabella per la modalità valore per chiamata" + +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "il protocollo tabella-funzione del modo di materializzazione non è stato seguito" -#: executor/execSRF.c:363 executor/execSRF.c:665 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "returnMode tabella-funzione sconosciuto: %d" -#: executor/execSRF.c:871 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "funzione che restituisce un insieme di record invocata in un contesto che non accetta il tipo record" -#: executor/execSRF.c:926 executor/execSRF.c:942 executor/execSRF.c:952 +#: 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 "il tipo di riga restituito dalla funzione e il valore specificato dalla query non combaciano" -#: executor/execSRF.c:927 +#: 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] "La riga restituita contiene %d attributo, ma la query ne prevede %d." msgstr[1] "La riga restituita contiene %d attributi, ma la query ne prevede %d." -#: executor/execSRF.c:943 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Tipo %s restituito in posizione %d, ma la query prevede %s." -#: executor/execUtils.c:687 +#: 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 "impossibile recuperare una colonna di sistema in questo contesto" + +#: executor/execUtils.c:736 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "la vista materializzata \"%s\" non è stata popolata" -#: executor/execUtils.c:689 +#: executor/execUtils.c:738 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Usa il comando REFRESH MATERIALIZED VIEW." -#: executor/functions.c:225 +#: executor/functions.c:217 #, c-format msgid "could not determine actual type of argument declared %s" msgstr "non è stato possibile determinare il tipo reale dell'argomento dichiarato %s" -#: executor/functions.c:521 +#: executor/functions.c:514 #, c-format -msgid "cannot COPY to/from client in a SQL function" -msgstr "non è possibile usare COPY da o verso il client in una funzione SQL" +msgid "cannot COPY to/from client in an SQL function" +msgstr "impossibile COPIA da/verso client in una funzione SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:527 +#: 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 non è consentito in una funzione SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:535 executor/spi.c:1409 executor/spi.c:2199 +#: 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 non è consentito in una funzione non volatile" -#: executor/functions.c:656 -#, c-format -msgid "could not determine actual result type for function declared to return type %s" -msgstr "non è stato possibile determinare il tipo reale restituito dalla funzione dichiarata con tipo restituito %s" - -#: executor/functions.c:1418 +#: executor/functions.c:1457 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "funzione SQL \"%s\" istruzione %d" -#: executor/functions.c:1444 +#: executor/functions.c:1483 #, c-format msgid "SQL function \"%s\" during startup" msgstr "funzione SQL \"%s\" durante l'avvio" -#: executor/functions.c:1537 +#: executor/functions.c:1568 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "l'esecuzione di procedure con argomenti di output non è supportata in funzioni SQL" -#: executor/functions.c:1657 executor/functions.c:1690 -#: executor/functions.c:1702 executor/functions.c:1826 -#: executor/functions.c:1859 executor/functions.c:1889 +#: executor/functions.c:1701 executor/functions.c:1739 executor/functions.c:1753 executor/functions.c:1843 executor/functions.c:1876 executor/functions.c:1890 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "il tipo restituito non combacia nella funzione dichiarata con tipo restituito %s" -#: executor/functions.c:1659 +#: executor/functions.c:1703 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "L'istruzione finale della funzione deve essere SELECT oppure INSERT/UPDATE/DELETE RETURNING." -#: executor/functions.c:1692 +#: executor/functions.c:1741 #, c-format msgid "Final statement must return exactly one column." msgstr "L'istruzione finale deve restituire esattamente una colonna." -#: executor/functions.c:1704 +#: executor/functions.c:1755 #, c-format msgid "Actual return type is %s." msgstr "Il tipo restituito realmente è %s." -#: executor/functions.c:1828 +#: executor/functions.c:1845 #, c-format msgid "Final statement returns too many columns." msgstr "L'istruzione finale restituisce troppe colonne." -#: executor/functions.c:1861 +#: executor/functions.c:1878 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "L'istruzione finale restituisce %s invece di %s alla colonna %d." -#: executor/functions.c:1891 +#: executor/functions.c:1892 #, c-format msgid "Final statement returns too few columns." msgstr "L'istruzione finale restituisce troppe poche colonne." -#: executor/functions.c:1940 +#: executor/functions.c:1920 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "il tipo di risultato %s non è supportato per le funzioni SQL" -#: executor/nodeAgg.c:2802 parser/parse_agg.c:633 parser/parse_agg.c:663 +#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 #, c-format -msgid "aggregate function calls cannot be nested" -msgstr "le chiamate a funzioni di aggregazione non possono essere annidate" +msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +msgstr "imprevisto EOF per il nastro %p: richiesti %zu byte, letti %zu byte" -#: executor/nodeAgg.c:2988 executor/nodeWindowAgg.c:2822 +#: executor/nodeAgg.c:3917 executor/nodeWindowAgg.c:2962 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "l'aggregato %u deve avere tipi di input e transizione compatibili" -#: executor/nodeCustom.c:148 executor/nodeCustom.c:159 +#: executor/nodeAgg.c:3947 parser/parse_agg.c:668 parser/parse_agg.c:696 #, c-format -msgid "custom scan \"%s\" does not support MarkPos" -msgstr "-lo scan personalizzato \"%s\" non supporta MarkPos" +msgid "aggregate function calls cannot be nested" +msgstr "le chiamate a funzioni di aggregazione non possono essere annidate" -#: executor/nodeHashjoin.c:1040 executor/nodeHashjoin.c:1070 +#: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format -msgid "could not rewind hash-join temporary file: %m" -msgstr "riavvolgimento del file temporaneo per l'hash-join fallito: %m" +msgid "custom scan \"%s\" does not support MarkPos" +msgstr "-lo scan personalizzato \"%s\" non supporta MarkPos" -#: executor/nodeHashjoin.c:1228 executor/nodeHashjoin.c:1234 +#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 #, c-format -msgid "could not write to hash-join temporary file: %m" -msgstr "scrittura nel file temporaneo per l'hash-join fallita: %m" +msgid "could not rewind hash-join temporary file" +msgstr "impossibile riavvolgere il file temporaneo di hash join" -#: executor/nodeHashjoin.c:1275 executor/nodeHashjoin.c:1285 +#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 #, c-format -msgid "could not read from hash-join temporary file: %m" -msgstr "lettura dal file temporaneo per l'hash-join fallita: %m" +msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +msgstr "impossibile leggere dal file temporaneo hash-join: leggere solo %zu di %zu byte" -#: executor/nodeIndexonlyscan.c:236 +#: executor/nodeIndexonlyscan.c:240 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "le funzioni di distanza lossy non sono supportate nelle scansioni dei soli indici" -#: executor/nodeLimit.c:264 +#: executor/nodeLimit.c:374 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET non può essere negativo" -#: executor/nodeLimit.c:290 +#: executor/nodeLimit.c:400 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT non può essere negativo" -#: executor/nodeMergejoin.c:1567 +#: executor/nodeMergejoin.c:1570 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "RIGHT JOIN è supportato solo con condizioni di join che supportano merge" -#: executor/nodeMergejoin.c:1585 +#: executor/nodeMergejoin.c:1588 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN è supportato solo con condizioni di join che supportano merge" -#: executor/nodeModifyTable.c:107 -#, c-format -msgid "Query has too many columns." -msgstr "La query ha troppe colonne." - -#: executor/nodeModifyTable.c:135 -#, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "La query produce un valore per una colonna eliminata in posizione %d." - -#: executor/nodeModifyTable.c:143 +#: executor/nodeModifyTable.c:255 #, c-format msgid "Query has too few columns." msgstr "La query ha troppe poche colonne." -#: executor/nodeModifyTable.c:773 +#: executor/nodeModifyTable.c:1411 executor/nodeModifyTable.c:1485 #, c-format -msgid "tuple to be deleted was already moved to another partition due to concurrent update" -msgstr "la tupla da cancellare era stata già mossa in un'altra partizione a causa di una modifica concorrente" +msgid "tuple to be deleted was already modified by an operation triggered by the current command" +msgstr "la tupla da eliminare è stata già modificata da un'operazione attivata dal comando corrente" -#: executor/nodeModifyTable.c:1085 +#: executor/nodeModifyTable.c:1642 #, c-format msgid "invalid ON UPDATE specification" msgstr "specifica ON UPDATE non valida" -#: executor/nodeModifyTable.c:1086 +#: executor/nodeModifyTable.c:1643 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "La tupla risultato apparterrebbe ad una partizione diversa della tupla originale." -#: executor/nodeModifyTable.c:1261 +#: executor/nodeModifyTable.c:2084 +#, 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 "non può spostare la tupla tra le partizioni quando un antenato non root della partizione di origine viene referenziato direttamente in una chiave esterna" + +#: executor/nodeModifyTable.c:2085 #, c-format -msgid "tuple to be updated was already moved to another partition due to concurrent update" -msgstr "la tupla da modificare era stata già mossa in un'altra partizione a causa di una modifica concorrente" +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "Una chiave esterna punta all'antenato \"%s\" ma non all'antenato radice \"%s\"." -#: executor/nodeModifyTable.c:1412 +#: executor/nodeModifyTable.c:2088 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" -msgstr "il comando ON CONFLICT DO UPDATE non può toccare le righe una seconda volta" +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Prendi in considerazione la definizione della chiave esterna nella tabella \"%s\"." -#: executor/nodeModifyTable.c:1413 +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2432 executor/nodeModifyTable.c:2823 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "Il comando %s non può influenzare la riga una seconda volta" + +#: executor/nodeModifyTable.c:2434 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Assicurati che non ci siano righe proposte per l'inserimento nello stesso comando che abbiano valori vincolati uguali." -#: executor/nodeSamplescan.c:279 +#: executor/nodeModifyTable.c:2825 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Assicurati che non più di una riga di origine corrisponda a una riga di destinazione." + +#: executor/nodeModifyTable.c:2928 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "la tupla da cancellare era stata già mossa in un'altra partizione a causa di una modifica concorrente" + +#: executor/nodeModifyTable.c:2967 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "la tupla da aggiornare o eliminare è stata già modificata da un'operazione attivata dal comando corrente" + +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "il parametro TABLESAMPLE non può essere null" -#: executor/nodeSamplescan.c:291 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "il parametro TABLESAMPLE REPEATABLE non può essere null" -#: executor/nodeSubplan.c:347 executor/nodeSubplan.c:386 -#: executor/nodeSubplan.c:1127 +#: 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 "più di una riga restituita da una sottoquery usata come espressione" @@ -11682,4144 +12906,5200 @@ msgstr "null non ammessi nella colonna \"%s\"" msgid "moving-aggregate transition function must not return null" msgstr "le funzioni di transizione per aggregati mobili non possono restituire null" -#: executor/nodeWindowAgg.c:2057 +#: executor/nodeWindowAgg.c:2080 #, c-format msgid "frame starting offset must not be null" msgstr "l'offset di inizio della finestra dev'essere non nullo" -#: executor/nodeWindowAgg.c:2070 +#: executor/nodeWindowAgg.c:2093 #, c-format msgid "frame starting offset must not be negative" msgstr "l'offset di inizio della finestra non può essere negativo" -#: executor/nodeWindowAgg.c:2082 +#: executor/nodeWindowAgg.c:2105 #, c-format msgid "frame ending offset must not be null" msgstr "l'offset di fine della finestra dev'essere non nullo" -#: executor/nodeWindowAgg.c:2095 +#: executor/nodeWindowAgg.c:2118 #, c-format msgid "frame ending offset must not be negative" msgstr "l'offset di fine della finestra non può essere negativo" -#: executor/nodeWindowAgg.c:2738 +#: executor/nodeWindowAgg.c:2878 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "la funzione di aggregazione %s non consente l'uso come funzione finestra" -#: executor/spi.c:233 executor/spi.c:272 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "terminazione di transazione non valida" -#: executor/spi.c:247 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "non è possibile effettuare un COMMIT mentre è attiva una sotto-transazione" -#: executor/spi.c:278 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "non è possibile effettuare un ROLLBACK mentre è attiva una sotto-transazione" -#: executor/spi.c:317 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "la transazione ha lasciato lo stack SPI non vuoto" -#: executor/spi.c:318 executor/spi.c:381 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Verifica che non ci siano chiamate \"SPI_finish\" mancanti." -#: executor/spi.c:380 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "la sottotransazione ha lasciato lo stack SPI non vuoto" -#: executor/spi.c:1270 +#: executor/spi.c:1600 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "non è possibile aprire un piano multi-query come cursore" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1275 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "non è possibile aprire una query %s come cursore" -#: executor/spi.c:1380 +#: executor/spi.c:1716 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE non è supportato" -#: executor/spi.c:1381 parser/analyze.c:2474 +#: executor/spi.c:1717 parser/analyze.c:2861 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Un cursore scorribile dev'essere READ ONLY." -#: executor/spi.c:2521 +#: executor/spi.c:2470 +#, c-format +msgid "empty query does not return tuples" +msgstr "la query vuota non restituisce tuple" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2544 +#, c-format +msgid "%s query does not return tuples" +msgstr "La query %s non restituisce tuple" + +#: executor/spi.c:2959 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "Espressione SQL \"%s\"" + +#: executor/spi.c:2964 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "Assegnazione PL/pgSQL \"%s\"" + +#: executor/spi.c:2967 #, c-format msgid "SQL statement \"%s\"" msgstr "istruzione SQL \"%s\"" -#: executor/tqueue.c:70 +#: executor/tqueue.c:74 #, c-format msgid "could not send tuple to shared-memory queue" msgstr "invio delle tuple alla coda in memoria condivisa fallito" -#: foreign/foreign.c:188 +#: foreign/foreign.c:221 #, c-format msgid "user mapping not found for \"%s\"" msgstr "mappatura utenti non trovata per \"%s\"" -#: foreign/foreign.c:640 +#: foreign/foreign.c:638 #, c-format msgid "invalid option \"%s\"" msgstr "opzione \"%s\" non valida" -#: foreign/foreign.c:641 +#: foreign/foreign.c:640 #, c-format msgid "Valid options in this context are: %s" msgstr "Le opzioni valide in questo contesto sono: %s" -#: jit/jit.c:208 utils/fmgr/dfmgr.c:201 utils/fmgr/dfmgr.c:418 -#: utils/fmgr/dfmgr.c:466 +#: foreign/foreign.c:642 #, c-format -msgid "could not access file \"%s\": %m" -msgstr "accesso al file \"%s\" fallito: %m" +msgid "There are no valid options in this context." +msgstr "Non ci sono opzioni valide in questo contesto." -#: jit/llvm/llvmjit.c:598 +#: gram.y:1146 #, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "tempo per l'inline: %.3fs, ottimizzazione: %.3fs, emissione: %.3fs" +msgid "UNENCRYPTED PASSWORD is no longer supported" +msgstr "UNENCRYPTED PASSWORD non è più supportato" -#: lib/dshash.c:247 utils/mmgr/dsa.c:715 utils/mmgr/dsa.c:797 +#: gram.y:1147 #, c-format -msgid "Failed on DSA request of size %zu." -msgstr "Errore su richiesta DSA di dimensione %zu." +msgid "Remove UNENCRYPTED to store the password in encrypted form instead." +msgstr "Rimuovi UNENCRYPTED per memorizzare la password in formato criptato." -#: lib/stringinfo.c:278 +#: gram.y:1209 #, c-format -msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." -msgstr "Non è possibile aumentare il buffer della stringa contenente %d byte di altri %d byte." +msgid "unrecognized role option \"%s\"" +msgstr "opzione di ruolo \"%s\" sconosciuta" -#: libpq/auth-scram.c:251 +#: gram.y:1474 gram.y:1490 #, c-format -msgid "client selected an invalid SASL authentication mechanism" -msgstr "il client a selezionato un meccanismo di autenticazione SASL non valido" +msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" +msgstr "CREATE SCHEMA IF NOT EXISTS non può includere elementi dello schema" -#: libpq/auth-scram.c:272 libpq/auth-scram.c:512 libpq/auth-scram.c:521 +#: gram.y:1647 #, c-format -msgid "invalid SCRAM verifier for user \"%s\"" -msgstr "verifica SCRAM non valido per l'utente \"%s\"" +msgid "current database cannot be changed" +msgstr "il database corrente non può essere cambiato" -#: libpq/auth-scram.c:283 +#: gram.y:1780 #, c-format -msgid "User \"%s\" does not have a valid SCRAM verifier." -msgstr "L'utente \"%s\" non ha una verifica SCRAM valida." +msgid "time zone interval must be HOUR or HOUR TO MINUTE" +msgstr "l'intervallo della time zone deve essere HOUR o HOUR TO MINUTE" -#: libpq/auth-scram.c:361 libpq/auth-scram.c:366 libpq/auth-scram.c:660 -#: libpq/auth-scram.c:668 libpq/auth-scram.c:779 libpq/auth-scram.c:789 -#: libpq/auth-scram.c:897 libpq/auth-scram.c:904 libpq/auth-scram.c:919 -#: libpq/auth-scram.c:934 libpq/auth-scram.c:948 libpq/auth-scram.c:966 -#: libpq/auth-scram.c:981 libpq/auth-scram.c:1267 libpq/auth-scram.c:1275 +#: gram.y:2397 #, c-format -msgid "malformed SCRAM message" -msgstr "messaggio SCRAM malformato" - -#: libpq/auth-scram.c:362 -#, c-format -msgid "The message is empty." -msgstr "Il messaggio è vuoto." +msgid "column number must be in range from 1 to %d" +msgstr "i numeri di colonne devono essere nell'intervallo tra 1 e %d" -#: libpq/auth-scram.c:367 +#: gram.y:2999 #, c-format -msgid "Message length does not match input length." -msgstr "La lunghezza del messaggio non combacia con la lunghezza dell'input." +msgid "sequence option \"%s\" not supported here" +msgstr "l'opzione della sequenza \"%s\" non è supportata qui" -#: libpq/auth-scram.c:399 +#: gram.y:3028 #, c-format -msgid "invalid SCRAM response" -msgstr "risposta SCRAM non valida" +msgid "modulus for hash partition provided more than once" +msgstr "modulo per partizione hash fornito più di una volta" -#: libpq/auth-scram.c:400 +#: gram.y:3037 #, c-format -msgid "Nonce does not match." -msgstr "Il nonce non combacia." +msgid "remainder for hash partition provided more than once" +msgstr "resto per partizione hash fornito più di una volta" -#: libpq/auth-scram.c:474 +#: gram.y:3044 #, c-format -msgid "could not generate random salt" -msgstr "errore nella generazione del sale casuale" +msgid "unrecognized hash partition bound specification \"%s\"" +msgstr "specifica di vincolo di partizione hash \"%s\" non riconosciuto" -#: libpq/auth-scram.c:661 +#: gram.y:3052 #, c-format -msgid "Expected attribute \"%c\" but found \"%s\"." -msgstr "Atteso attributo \"%c\" ma trovato \"%s\"." +msgid "modulus for hash partition must be specified" +msgstr "il modulo per la partizione hash deve essere specificato" -#: libpq/auth-scram.c:669 libpq/auth-scram.c:790 +#: gram.y:3056 #, c-format -msgid "Expected character \"=\" for attribute \"%c\"." -msgstr "Atteso carattere \"=\" per l'attributo \"%c\"." +msgid "remainder for hash partition must be specified" +msgstr "il resto per la partizione hash deve essere specificato" -#: libpq/auth-scram.c:780 +#: gram.y:3264 gram.y:3298 #, c-format -msgid "Attribute expected, but found invalid character \"%s\"." -msgstr "Atteso attributo, ma trovato carattere non valido \"%s\"." +msgid "STDIN/STDOUT not allowed with PROGRAM" +msgstr "STDIN/STDOUT non sono consentiti con PROGRAM" -#: libpq/auth-scram.c:898 libpq/auth-scram.c:920 +#: gram.y:3270 #, c-format -msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." -msgstr "Il client ha scelto SCRAM-SHA-256-PLUS, ma il messaggio di SCRAM non include dati di binding del canale." +msgid "WHERE clause not allowed with COPY TO" +msgstr "Clausola WHERE non consentita con COPY TO" -#: libpq/auth-scram.c:905 libpq/auth-scram.c:935 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format -msgid "Comma expected, but found character \"%s\"." -msgstr "Attesa virgola, ma trovato carattere \"%s\"." +msgid "GLOBAL is deprecated in temporary table creation" +msgstr "GLOBAL è deprecato nella creazione di tabelle temporanee" -#: libpq/auth-scram.c:926 +#: gram.y:3881 #, c-format -msgid "SCRAM channel binding negotiation error" -msgstr "errore di negoziazione del binding del canale SCRAM" +msgid "for a generated column, GENERATED ALWAYS must be specified" +msgstr "per una colonna generata, è necessario specificare GENERATED ALWAYS" -#: libpq/auth-scram.c:927 +#: gram.y:4172 utils/adt/ri_triggers.c:2098 #, c-format -msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." -msgstr "Il client supporta il binding del canale SCRAM ma pensa che il server non lo supporti. Invece, questo server supporta il binding del canale." +msgid "MATCH PARTIAL not yet implemented" +msgstr "il MATCH PARTIAL non è stato ancora implementato" -#: libpq/auth-scram.c:949 +#: gram.y:4264 #, c-format -msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." -msgstr "Il client ha scelto SCRAM-SHA-256 senza binding del canale, ma il messaggio SCRAM include dati di binding del canale." +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "un elenco di colonne con %s è supportato solo per le azioni ON DELETE" -#: libpq/auth-scram.c:960 +#: gram.y:4974 #, c-format -msgid "unsupported SCRAM channel-binding type \"%s\"" -msgstr "tipo di binding di canale SCRAM \"%s\" non supportato" +msgid "CREATE EXTENSION ... FROM is no longer supported" +msgstr "CREATE EXTENSION... FROM non è più supportato" -#: libpq/auth-scram.c:967 +#: gram.y:5672 #, c-format -msgid "Unexpected channel-binding flag \"%s\"." -msgstr "Flag channel-binding \"%s\" non previsto." +msgid "unrecognized row security option \"%s\"" +msgstr "opzione di sicurezza riga \"%s\" non riconosciuta" -#: libpq/auth-scram.c:977 +#: gram.y:5673 #, c-format -msgid "client uses authorization identity, but it is not supported" -msgstr "il client usa l'autorizzazione identità, ma non è supportata" +msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." +msgstr "Solo le regole PERMISSIVE o RESTRICTIVE sono attualmente supportate." -#: libpq/auth-scram.c:982 +#: gram.y:5758 #, c-format -msgid "Unexpected attribute \"%s\" in client-first-message." -msgstr "Attributo \"%s\" non atteso nel client-first-message." +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER non è supportato" -#: libpq/auth-scram.c:998 -#, c-format -msgid "client requires an unsupported SCRAM extension" -msgstr "il client richiede un'estensione SCRAM non supportata" +#: gram.y:5795 +msgid "duplicate trigger events specified" +msgstr "evento del trigger specificato più volte" -#: libpq/auth-scram.c:1012 +#: gram.y:5937 parser/parse_utilcmd.c:3716 parser/parse_utilcmd.c:3742 #, c-format -msgid "non-printable characters in SCRAM nonce" -msgstr "caratteri non stampabili nel nonce SCRAM" +msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +msgstr "un vincolo dichiarato INITIALLY DEFERRED dev'essere DEFERRABLE" -#: libpq/auth-scram.c:1129 +#: gram.y:5944 #, c-format -msgid "could not generate random nonce" -msgstr "errore nella generazione del nonce SCRAM" +msgid "conflicting constraint properties" +msgstr "proprietà del vincolo in conflitto" -#: libpq/auth-scram.c:1233 +#: gram.y:6043 #, c-format -msgid "SCRAM channel binding check failed" -msgstr "controllo di binding del canale SCRAM fallito" +msgid "CREATE ASSERTION is not yet implemented" +msgstr "CREATE ASSERTION non è stata ancora implementata" -#: libpq/auth-scram.c:1251 +#: gram.y:6451 #, c-format -msgid "unexpected SCRAM channel-binding attribute in client-final-message" -msgstr "attributo channel-binding SCRAM non previsto nel messaggio finale del client" +msgid "RECHECK is no longer required" +msgstr "RECHECK non è più richiesto" -#: libpq/auth-scram.c:1268 +#: gram.y:6452 #, c-format -msgid "Malformed proof in client-final-message." -msgstr "Verifica malformata in client-final-message." +msgid "Update your data type." +msgstr "Aggiorna il tuo tipo di dato." -#: libpq/auth-scram.c:1276 +#: gram.y:8308 #, c-format -msgid "Garbage found at the end of client-final-message." -msgstr "Dati spuri alla fine del client-final-message." +msgid "aggregates cannot have output arguments" +msgstr "gli aggregati non possono avere argomenti di output" -#: libpq/auth.c:282 +#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format -msgid "authentication failed for user \"%s\": host rejected" -msgstr "autenticazione fallita per l'utente \"%s\": host rifiutato" +msgid "missing argument" +msgstr "argomento mancante" -#: libpq/auth.c:285 +#: gram.y:8772 utils/adt/regproc.c:711 utils/adt/regproc.c:752 #, c-format -msgid "\"trust\" authentication failed for user \"%s\"" -msgstr "autenticazione \"trust\" fallita per l'utente \"%s\"" +msgid "Use NONE to denote the missing argument of a unary operator." +msgstr "Usa NONE per indicare l'argomento mancante in un operatore unario." -#: libpq/auth.c:288 +#: gram.y:10993 gram.y:11012 #, c-format -msgid "Ident authentication failed for user \"%s\"" -msgstr "autenticazione Ident fallita per l'utente \"%s\"" +msgid "WITH CHECK OPTION not supported on recursive views" +msgstr "WITH CHECK OPTION non supportato su viste ricorsive" -#: libpq/auth.c:291 +#: gram.y:12898 #, c-format -msgid "Peer authentication failed for user \"%s\"" -msgstr "autenticazione Peer fallita per l'utente \"%s\"" +msgid "LIMIT #,# syntax is not supported" +msgstr "La sintassi LIMIT #,# non è supportata" -#: libpq/auth.c:296 +#: gram.y:12899 #, c-format -msgid "password authentication failed for user \"%s\"" -msgstr "autenticazione con password fallita per l'utente \"%s\"" +msgid "Use separate LIMIT and OFFSET clauses." +msgstr "Usa separatamente le clausole LIMIT ed OFFSET." -#: libpq/auth.c:301 +#: gram.y:13252 gram.y:13278 #, c-format -msgid "GSSAPI authentication failed for user \"%s\"" -msgstr "autenticazione GSSAPI fallita per l'utente \"%s\"" +msgid "VALUES in FROM must have an alias" +msgstr "VALUES nel FROM deve avere un alias" -#: libpq/auth.c:304 +#: gram.y:13253 gram.y:13279 #, c-format -msgid "SSPI authentication failed for user \"%s\"" -msgstr "autenticazione SSPI fallita per l'utente \"%s\"" +msgid "For example, FROM (VALUES ...) [AS] foo." +msgstr "Per esempio, FROM (VALUES ...) [AS] foo." -#: libpq/auth.c:307 +#: gram.y:13258 gram.y:13284 #, c-format -msgid "PAM authentication failed for user \"%s\"" -msgstr "autenticazione PAM fallita per l'utente \"%s\"" +msgid "subquery in FROM must have an alias" +msgstr "la sottoquery in FROM deve avere un alias" -#: libpq/auth.c:310 +#: gram.y:13259 gram.y:13285 #, c-format -msgid "BSD authentication failed for user \"%s\"" -msgstr "autenticazione BSD fallita per l'utente \"%s\"" +msgid "For example, FROM (SELECT ...) [AS] foo." +msgstr "Per esempio, FROM (SELECT ...) [AS] foo." -#: libpq/auth.c:313 +#: gram.y:13803 #, c-format -msgid "LDAP authentication failed for user \"%s\"" -msgstr "autenticazione LDAP fallita per l'utente \"%s\"" +msgid "only one DEFAULT value is allowed" +msgstr "solo un valore DEFAULT è consentito" -#: libpq/auth.c:316 +#: gram.y:13812 #, c-format -msgid "certificate authentication failed for user \"%s\"" -msgstr "autenticazione con certificato fallita per l'utente \"%s\"" +msgid "only one PATH value per column is allowed" +msgstr "solo un valore PATH per colonna è consentito" -#: libpq/auth.c:319 +#: gram.y:13821 #, c-format -msgid "RADIUS authentication failed for user \"%s\"" -msgstr "autenticazione RADIUS fallita per l'utente \"%s\"" +msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgstr "dichiarazioni NULL / NOT NULL in conflitto o ridondanti per la colonna \"%s\"" -#: libpq/auth.c:322 +#: gram.y:13830 #, c-format -msgid "authentication failed for user \"%s\": invalid authentication method" -msgstr "autenticazione fallita per l'utente \"%s\": metodo di autenticazione non valido" +msgid "unrecognized column option \"%s\"" +msgstr "opzione di colonna \"%s\" non riconosciuta" -#: libpq/auth.c:326 +#: gram.y:14084 #, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "La connessione si abbina con la riga %d di pg_hba.log: \"%s\"" +msgid "precision for type float must be at least 1 bit" +msgstr "la precisione per il tipo float dev'essere di almeno un bit" -#: libpq/auth.c:373 +#: gram.y:14093 #, c-format -msgid "client certificates can only be checked if a root certificate store is available" -msgstr "il certificato del client può essere controllato solo se un root certificate store è disponibile" +msgid "precision for type float must be less than 54 bits" +msgstr "la precisione per il tipo float dev'essere inferiore a 54 bit" -#: libpq/auth.c:384 +#: gram.y:14596 #, c-format -msgid "connection requires a valid client certificate" -msgstr "la connessione richiede un certificato valido per il client" +msgid "wrong number of parameters on left side of OVERLAPS expression" +msgstr "numero errato di parametri a sinistra dell'espressione OVERLAPS" -#: libpq/auth.c:417 +#: gram.y:14601 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" -msgstr "pg_hba.conf rifiuta connessioni di replica per l'host \"%s\", utente \"%s\", %s" +msgid "wrong number of parameters on right side of OVERLAPS expression" +msgstr "numero errato di parametri a destra dell'espressione OVERLAPS" -#: libpq/auth.c:419 libpq/auth.c:435 libpq/auth.c:493 libpq/auth.c:511 -msgid "SSL off" -msgstr "SSL non abilitato" +#: gram.y:14778 +#, c-format +msgid "UNIQUE predicate is not yet implemented" +msgstr "il predicato UNIQUE non è stato ancora implementato" -#: libpq/auth.c:419 libpq/auth.c:435 libpq/auth.c:493 libpq/auth.c:511 -msgid "SSL on" -msgstr "SSL abilitato" +#: gram.y:15156 +#, c-format +msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" +msgstr "non si può usare più di una clausola ORDER BY con WITHIN GROUOP" -#: libpq/auth.c:423 +#: gram.y:15161 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "pg_hba.conf rifiuta connessioni di replica per l'host \"%s\", utente \"%s\"" +msgid "cannot use DISTINCT with WITHIN GROUP" +msgstr "non si può usare DISTINCT con WITHIN GROUP" -#: libpq/auth.c:432 +#: gram.y:15166 #, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" -msgstr "pg_hba.conf rifiuta connessioni per l'host \"%s\", utente \"%s\", database \"%s\", %s" +msgid "cannot use VARIADIC with WITHIN GROUP" +msgstr "non si può usare VARIADIC con WITHIN GROUP" -#: libpq/auth.c:439 +#: gram.y:15703 gram.y:15727 #, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "pg_hba.conf rifiuta connessioni per l'host \"%s\", user \"%s\", database \"%s\"" +msgid "frame start cannot be UNBOUNDED FOLLOWING" +msgstr "l'inizio della finestra non può essere UNBOUNDED FOLLOWING" -#: libpq/auth.c:468 +#: gram.y:15708 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup matches." -msgstr "Indirizzo IP del client risolto in \"%s\", il forward lookup combacia." +msgid "frame starting from following row cannot end with current row" +msgstr "una finestra che inizia dalla riga seguente non può terminare alla riga corrente" -#: libpq/auth.c:471 +#: gram.y:15732 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup not checked." -msgstr "Indirizzo IP del client risolto in \"%s\", forward lookup non controllato." +msgid "frame end cannot be UNBOUNDED PRECEDING" +msgstr "la fine della finestra non può essere UNBOUNDED PRECEDING" -#: libpq/auth.c:474 +#: gram.y:15738 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup does not match." -msgstr "Indirizzo IP del client risolto in \"%s\", il forward lookup non combacia." +msgid "frame starting from current row cannot have preceding rows" +msgstr "una finestra che inizia dalla riga corrente non può avere righe precedenti" -#: libpq/auth.c:477 +#: gram.y:15745 #, c-format -msgid "Could not translate client host name \"%s\" to IP address: %s." -msgstr "Conversione del nome host \"%s\" in indirizzo IP non riuscita: %s." +msgid "frame starting from following row cannot have preceding rows" +msgstr "una finestra che inizia dalla riga seguente non può avere righe precedenti" -#: libpq/auth.c:482 +#: gram.y:16370 #, c-format -msgid "Could not resolve client IP address to a host name: %s." -msgstr "Risoluzione dell'indirizzo IP del client in nome host non riuscita: %s." +msgid "type modifier cannot have parameter name" +msgstr "un modificatore di tipo non può avere un nome di parametro" -#: libpq/auth.c:491 +#: gram.y:16376 #, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" -msgstr "nessuna voce in pg_hba.conf per connessioni di replica da host \"%s\", utente \"%s\", database \"%s\"" +msgid "type modifier cannot have ORDER BY" +msgstr "un modificatore di tipo non può avere ORDER BY" -#: libpq/auth.c:498 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "nessuna voce in pg_hba.conf per connessioni di replica da host \"%s\", user \"%s\"" +msgid "%s cannot be used as a role name here" +msgstr "%s non può essere usato come nome di ruolo qui" -#: libpq/auth.c:508 +#: gram.y:16548 gram.y:17983 #, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" -msgstr "nessuna voce in pg_hba.conf per l'host \"%s\", utente \"%s\", database \"%s\", %s" +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES non può essere specificato senza la clausola ORDER BY" + +#: gram.y:17662 gram.y:17849 +msgid "improper use of \"*\"" +msgstr "uso improprio di \"*\"" -#: libpq/auth.c:516 +#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 #, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "nessuna voce in pg_hba.conf per l'host \"%s\", utente \"%s\", database \"%s\"" +msgid "syntax error" +msgstr "errore di sintassi" -#: libpq/auth.c:669 +#: gram.y:17913 #, c-format -msgid "expected password response, got message type %d" -msgstr "era attesa una risposta password, ricevuto messaggio di tipo %d" +msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" +msgstr "un aggregato su insiemi ordinati con un argomento diretto VARIADIC deve avere un argomento aggregato VARIADIC sullo stesso tipo" -#: libpq/auth.c:697 +#: gram.y:17950 #, c-format -msgid "invalid password packet size" -msgstr "dimensione del pacchetto password non valida" +msgid "multiple ORDER BY clauses not allowed" +msgstr "non è possibile avere più di una clausola ORDER BY" -#: libpq/auth.c:715 +#: gram.y:17961 #, c-format -msgid "empty password returned by client" -msgstr "il client ha restituito una password vuota" +msgid "multiple OFFSET clauses not allowed" +msgstr "non è possibile avere più di una clausola OFFSET" -#: libpq/auth.c:835 libpq/hba.c:1325 +#: gram.y:17970 #, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "l'autenticazione MD5 non è supportata quando \"db_user_namespace\" è abilitato" +msgid "multiple LIMIT clauses not allowed" +msgstr "non è possibile avere più di una clausola LIMIT" -#: libpq/auth.c:841 +#: gram.y:17979 #, c-format -msgid "could not generate random MD5 salt" -msgstr "errore nella generazione del sale casuale MD5" +msgid "multiple limit options not allowed" +msgstr "opzioni di limiti multipli non consentite" -#: libpq/auth.c:887 +#: gram.y:18006 #, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "l'autenticazione SASL non è supportata nella versione 2 del protocollo" +msgid "multiple WITH clauses not allowed" +msgstr "non è possibile avere più di una clausola WITH" -#: libpq/auth.c:920 +#: gram.y:18199 #, c-format -msgid "expected SASL response, got message type %d" -msgstr "attesa risposta SASL, ricevuto messaggio di tipo %d" +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "gli argomenti OUT e INOUT non sono permessi nelle funzioni TABLE" -#: libpq/auth.c:1112 +#: gram.y:18332 #, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "GSSAPI non è supportato con la versione 2 del protocollo" +msgid "multiple COLLATE clauses not allowed" +msgstr "non è possibile avere più di una clausola COLLATE" -#: libpq/auth.c:1172 +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18370 gram.y:18383 #, c-format -msgid "expected GSS response, got message type %d" -msgstr "era attesa una risposta GSS, ricevuto messaggio di tipo %d" +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "un vincolo %s non può essere marcato DEFERRABLE" -#: libpq/auth.c:1234 -msgid "accepting GSS security context failed" -msgstr "contesto di sicurezza accettazione GSS fallito" +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18396 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "un vincolo %s non può essere marcato NOT VALID" -#: libpq/auth.c:1260 -msgid "retrieving GSS user name failed" -msgstr "la richiesta del GSS user name è fallita" +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18409 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "un vincolo %s non può essere marcato NO INHERIT" -#: libpq/auth.c:1385 +#: gram.y:18433 #, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "SSPI non è supportato con la versione 2 del protocollo" +msgid "invalid publication object list" +msgstr "elenco oggetti pubblicazione non valido" -#: libpq/auth.c:1400 -msgid "could not acquire SSPI credentials" -msgstr "non è stato possibile ottenere le credenziali SSPI" +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "È necessario specificare uno dei TABLE o TABLES IN SCHEMA prima di una tabella autonoma o di un nome di schema." -#: libpq/auth.c:1418 +#: gram.y:18450 #, c-format -msgid "expected SSPI response, got message type %d" -msgstr "era attesa una risposta SSPI, ricevuto messaggio di tipo %d" +msgid "invalid table name at or near" +msgstr "nome tabella non valido in corrispondenza o vicino" -#: libpq/auth.c:1491 -msgid "could not accept SSPI security context" -msgstr "non è stato possibile accettare il contesto di sicurezza SSPI" +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "Clausola WHERE non consentita per lo schema" -#: libpq/auth.c:1553 -msgid "could not get token from SSPI security context" -msgstr "non è stato possibile ottenere il token dal contesto di sicurezza SSPI" +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "specifica della colonna non consentita per lo schema" -#: libpq/auth.c:1672 libpq/auth.c:1691 +#: gram.y:18492 #, c-format -msgid "could not translate name" -msgstr "non è stato possibile tradurre il nome" +msgid "invalid schema name at or near" +msgstr "specifica della colonna non consentita per lo schema" -#: libpq/auth.c:1704 +#: guc-file.l:314 #, c-format -msgid "realm name too long" -msgstr "nome di realm troppo lungo" +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "parametro di configurazione non riconosciuto \"%s\" nel file \"%s\" riga %d" -#: libpq/auth.c:1719 +#: guc-file.l:353 utils/misc/guc.c:7698 utils/misc/guc.c:7918 utils/misc/guc.c:8016 utils/misc/guc.c:8114 utils/misc/guc.c:8238 utils/misc/guc.c:8341 #, c-format -msgid "translated account name too long" -msgstr "nome di account tradotto troppo lungo" +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "il parametro \"%s\" non può essere cambiato senza riavviare il server" -#: libpq/auth.c:1905 +#: guc-file.l:389 #, c-format -msgid "could not create socket for Ident connection: %m" -msgstr "creazione del socket per la connessione Ident fallita: %m" +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "il parametro \"%s\" è stato rimosso dal file di configurazione, valore predefinito ripristinato" -#: libpq/auth.c:1920 +#: guc-file.l:454 #, c-format -msgid "could not bind to local address \"%s\": %m" -msgstr "bind sull'indirizzo locale \"%s\" fallito: %m" +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "il parametro \"%s\" è stato modificato a \"%s\"" -#: libpq/auth.c:1932 +#: guc-file.l:496 #, c-format -msgid "could not connect to Ident server at address \"%s\", port %s: %m" -msgstr "connessione al server Ident all'indirizzo \"%s\", porta %s fallita: %m" +msgid "configuration file \"%s\" contains errors" +msgstr "il file di configurazione \"%s\" contiene errori" -#: libpq/auth.c:1954 +#: guc-file.l:501 #, c-format -msgid "could not send query to Ident server at address \"%s\", port %s: %m" -msgstr "invio della query al server Ident all'indirizzo \"%s\", porta %s fallito: %m" +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "il file di configurazione \"%s\" contiene errori; i cambiamenti senza errori sono stati applicati" -#: libpq/auth.c:1971 +#: guc-file.l:506 #, c-format -msgid "could not receive response from Ident server at address \"%s\", port %s: %m" -msgstr "ricezione della risposta dal server Ident all'indirizzo \"%s\", porta %s fallita: %m" +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "il file di configurazione \"%s\" contiene errori; nessun cambiamento effettuato" -#: libpq/auth.c:1981 +#: guc-file.l:578 #, c-format -msgid "invalidly formatted response from Ident server: \"%s\"" -msgstr "risposta dal server Ident formattata in maniera non corretta: \"%s\"" +msgid "empty configuration file name: \"%s\"" +msgstr "nome file di configurazione vuoto: \"%s\"" -#: libpq/auth.c:2021 +#: guc-file.l:595 #, c-format -msgid "peer authentication is not supported on this platform" -msgstr "il metodo di autenticazione peer non è supportato su questa piattaforma" +msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "apertura del file di configurazione \"%s\" fallita: massima profondità di annidamento raggiunta" -#: libpq/auth.c:2025 +#: guc-file.l:615 #, c-format -msgid "could not get peer credentials: %m" -msgstr "non è stato possibile recuperare le credenziali del peer: %m" +msgid "configuration file recursion in \"%s\"" +msgstr "ricorsione del file di configurazione in \"%s\"" -#: libpq/auth.c:2036 +#: guc-file.l:631 libpq/hba.c:2223 utils/adt/hbafuncs.c:376 #, c-format -msgid "could not look up local user ID %ld: %s" -msgstr "ricerca dell'ID utente locale %ld fallita: %s" +msgid "could not open configuration file \"%s\": %m" +msgstr "apertura del file di configurazione \"%s\" fallita: %m" -#: libpq/auth.c:2124 +#: guc-file.l:642 #, c-format -msgid "error from underlying PAM layer: %s" -msgstr "errore dal livello PAM sottostante: %s" +msgid "skipping missing configuration file \"%s\"" +msgstr "file di configurazione mancante \"%s\" saltato" -#: libpq/auth.c:2205 +#: guc-file.l:896 #, c-format -msgid "could not create PAM authenticator: %s" -msgstr "creazione dell'autenticatore PAM fallita: %s" +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "errore di sintassi nel file \"%s\" riga %u, vicino alla fine della riga" -#: libpq/auth.c:2216 +#: guc-file.l:906 #, c-format -msgid "pam_set_item(PAM_USER) failed: %s" -msgstr "pam_set_item(PAM_USER) fallita: %s" +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "errore di sintassi nel file \"%s\" riga %u, vicino al token \"%s\"" -#: libpq/auth.c:2227 +#: guc-file.l:926 #, c-format -msgid "pam_set_item(PAM_RHOST) failed: %s" -msgstr "pam_set_item(PAM_RHOST) fallita: %s" +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "troppi errori di sintassi, file \"%s\" abbandonato" -#: libpq/auth.c:2238 +#: guc-file.l:981 #, c-format -msgid "pam_set_item(PAM_CONV) failed: %s" -msgstr "pam_set_item(PAM_CONV) fallita: %s" +msgid "empty configuration directory name: \"%s\"" +msgstr "nome della directory di configurazione vuota: \"%s\"" -#: libpq/auth.c:2249 +#: guc-file.l:1000 #, c-format -msgid "pam_authenticate failed: %s" -msgstr "pam_authenticate fallita: %s" +msgid "could not open configuration directory \"%s\": %m" +msgstr "apertura della directory di configurazione \"%s\" fallita: %m" -#: libpq/auth.c:2260 +#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 #, c-format -msgid "pam_acct_mgmt failed: %s" -msgstr "pam_acct_mgmt fallita: %s" +msgid "could not access file \"%s\": %m" +msgstr "accesso al file \"%s\" fallito: %m" -#: libpq/auth.c:2271 +#: 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 "could not release PAM authenticator: %s" -msgstr "rilascio dell'autenticatore PAM fallito: %s" +msgid "invalid input syntax for type %s" +msgstr "sintassi di input non valida per il tipo %s" -#: libpq/auth.c:2347 +#: jsonpath_gram.y:530 #, c-format -msgid "could not initialize LDAP: error code %d" -msgstr "inizializzazione LDAP fallita: codice errore %d" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "Carattere flag non riconosciuto \"%.*s\" nel predicato LIKE_REGEX." -#: libpq/auth.c:2364 +#: jsonpath_gram.y:584 #, c-format -msgid "could not initialize LDAP: %s" -msgstr "inizializzazione LDAP fallita: %s" +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "Il flag XQuery \"x\" (espressioni regolari espanse) non è implementato" -#: libpq/auth.c:2374 +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:282 #, c-format -msgid "ldaps not supported with this LDAP library" -msgstr "ldaps non supportato con questa libreria LDAP" +msgid "%s at end of jsonpath input" +msgstr "%s alla fine dell'input di jsonpath" -#: libpq/auth.c:2382 +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:289 #, c-format -msgid "could not initialize LDAP: %m" -msgstr "inizializzazione LDAP fallita: %m" +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "%s in corrispondenza o vicino a \"%s\" dell'input jsonpath" -#: libpq/auth.c:2392 +#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:617 #, c-format -msgid "could not set LDAP protocol version: %s" -msgstr "impostazione della versione del protocollo LDAP fallita: %s" +msgid "unsupported Unicode escape sequence" +msgstr "sequenza di escape Unicode non supportata" -#: libpq/auth.c:2423 +#: lib/dshash.c:254 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 #, c-format -msgid "could not load wldap32.dll" -msgstr "caricamento wldap32.dll fallito" +msgid "Failed on DSA request of size %zu." +msgstr "Errore su richiesta DSA di dimensione %zu." -#: libpq/auth.c:2431 +#: libpq/auth-sasl.c:97 #, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "caricamento della funzione _ldap_start_tls_sA in wldap32.dll fallito" +msgid "expected SASL response, got message type %d" +msgstr "attesa risposta SASL, ricevuto messaggio di tipo %d" -#: libpq/auth.c:2432 +#: libpq/auth-scram.c:258 #, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "LDAP su SSL non è supportato su questa piattaforma." +msgid "client selected an invalid SASL authentication mechanism" +msgstr "il client a selezionato un meccanismo di autenticazione SASL non valido" -#: libpq/auth.c:2447 +#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 #, c-format -msgid "could not start LDAP TLS session: %s" -msgstr "avvio della sessione TLS LDAP fallito: %s" +msgid "invalid SCRAM secret for user \"%s\"" +msgstr "segreto SCRAM non valido per l'utente \"%s\"" -#: libpq/auth.c:2510 +#: libpq/auth-scram.c:290 #, c-format -msgid "LDAP server not specified" -msgstr "server LDAP non specificato" +msgid "User \"%s\" does not have a valid SCRAM secret." +msgstr "L'utente \"%s\" non ha un segreto SCRAM valido." -#: libpq/auth.c:2565 +#: 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 "invalid character in user name for LDAP authentication" -msgstr "carattere non valido nel nome utente per l'autenticazione LDAP" +msgid "malformed SCRAM message" +msgstr "messaggio SCRAM malformato" -#: libpq/auth.c:2582 +#: libpq/auth-scram.c:369 #, c-format -msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" -msgstr "bind iniziale LDAP fallito per ldapbinddn \"%s\" sul server \"%s\": %s" +msgid "The message is empty." +msgstr "Il messaggio è vuoto." -#: libpq/auth.c:2611 +#: libpq/auth-scram.c:374 #, c-format -msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" -msgstr "ricerca in LDAP del filtro \"%s\" sul server \"%s\" fallita: %s" +msgid "Message length does not match input length." +msgstr "La lunghezza del messaggio non combacia con la lunghezza dell'input." -#: libpq/auth.c:2625 +#: libpq/auth-scram.c:406 #, c-format -msgid "LDAP user \"%s\" does not exist" -msgstr "l'utente LDAP \"%s\" non esiste" +msgid "invalid SCRAM response" +msgstr "risposta SCRAM non valida" -#: libpq/auth.c:2626 +#: libpq/auth-scram.c:407 #, c-format -msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." -msgstr "La ricerca LDAP del filtro \"%s\" sul server \"%s\" non ha restituito risultati." +msgid "Nonce does not match." +msgstr "Il nonce non combacia." -#: libpq/auth.c:2630 +#: libpq/auth-scram.c:483 #, c-format -msgid "LDAP user \"%s\" is not unique" -msgstr "L'utente LDAP \"%s\" non è unico" +msgid "could not generate random salt" +msgstr "errore nella generazione del sale casuale" -#: libpq/auth.c:2631 +#: libpq/auth-scram.c:715 #, 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 ricerca LDAP del filtro \"%s\" sul server \"%s\" ha restituito %d risultato." -msgstr[1] "La ricerca LDAP del filtro \"%s\" sul server \"%s\" ha restituito %d risultati." +msgid "Expected attribute \"%c\" but found \"%s\"." +msgstr "Atteso attributo \"%c\" ma trovato \"%s\"." -#: libpq/auth.c:2651 +#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 #, c-format -msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" -msgstr "dn per il primo risultato di \"%s\" non trovato sul server \"%s\": %s" +msgid "Expected character \"=\" for attribute \"%c\"." +msgstr "Atteso carattere \"=\" per l'attributo \"%c\"." -#: libpq/auth.c:2672 +#: libpq/auth-scram.c:828 #, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "unbinding fallito dopo aver cercato l'utente \"%s\" sul server \"%s\"" +msgid "Attribute expected, but found end of string." +msgstr "Attributo previsto, ma trovata la fine della stringa." -#: libpq/auth.c:2703 +#: libpq/auth-scram.c:841 #, c-format -msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" -msgstr "login LDAP fallito per l'utente \"%s\" sul server \"%s\": %s" +msgid "Attribute expected, but found invalid character \"%s\"." +msgstr "Atteso attributo, ma trovato carattere non valido \"%s\"." -#: libpq/auth.c:2732 +#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 #, c-format -msgid "LDAP diagnostics: %s" -msgstr "diagnostica LDAP: %s" +msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." +msgstr "Il client ha scelto SCRAM-SHA-256-PLUS, ma il messaggio di SCRAM non include dati di binding del canale." -#: libpq/auth.c:2757 +#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 #, c-format -msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" -msgstr "autenticazione con certificato fallita per l'utente \"%s\": il certificato del client non contiene alcun nome utente" +msgid "Comma expected, but found character \"%s\"." +msgstr "Attesa virgola, ma trovato carattere \"%s\"." -#: libpq/auth.c:2860 +#: libpq/auth-scram.c:987 #, c-format -msgid "RADIUS server not specified" -msgstr "server RADIUS non specificato" +msgid "SCRAM channel binding negotiation error" +msgstr "errore di negoziazione del binding del canale SCRAM" -#: libpq/auth.c:2867 +#: libpq/auth-scram.c:988 #, c-format -msgid "RADIUS secret not specified" -msgstr "segreto RADIUS non specificato" +msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." +msgstr "Il client supporta il binding del canale SCRAM ma pensa che il server non lo supporti. Invece, questo server supporta il binding del canale." -#: libpq/auth.c:2881 +#: libpq/auth-scram.c:1010 #, c-format -msgid "RADIUS authentication does not support passwords longer than %d characters" -msgstr "l'autenticazione RADIUS non supporta password più lunghe di %d caratteri" +msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." +msgstr "Il client ha scelto SCRAM-SHA-256 senza binding del canale, ma il messaggio SCRAM include dati di binding del canale." -#: libpq/auth.c:2986 libpq/hba.c:1908 +#: libpq/auth-scram.c:1021 #, c-format -msgid "could not translate RADIUS server name \"%s\" to address: %s" -msgstr "conversione del nome del server RADIUS \"%s\" in indirizzo fallita: %s" +msgid "unsupported SCRAM channel-binding type \"%s\"" +msgstr "tipo di binding di canale SCRAM \"%s\" non supportato" -#: libpq/auth.c:3000 +#: libpq/auth-scram.c:1028 #, c-format -msgid "could not generate random encryption vector" -msgstr "generazione del vettore di criptaggio casuale fallita" +msgid "Unexpected channel-binding flag \"%s\"." +msgstr "Flag channel-binding \"%s\" non previsto." -#: libpq/auth.c:3034 +#: libpq/auth-scram.c:1038 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "criptaggio MD5 della password fallito" +msgid "client uses authorization identity, but it is not supported" +msgstr "il client usa l'autorizzazione identità, ma non è supportata" -#: libpq/auth.c:3060 +#: libpq/auth-scram.c:1043 #, c-format -msgid "could not create RADIUS socket: %m" -msgstr "creazione del socket RADIUS fallita: %m" +msgid "Unexpected attribute \"%s\" in client-first-message." +msgstr "Attributo \"%s\" non atteso nel client-first-message." -#: libpq/auth.c:3082 +#: libpq/auth-scram.c:1059 #, c-format -msgid "could not bind local RADIUS socket: %m" -msgstr "bind del socket RADIUS fallito: %m" +msgid "client requires an unsupported SCRAM extension" +msgstr "il client richiede un'estensione SCRAM non supportata" -#: libpq/auth.c:3092 +#: libpq/auth-scram.c:1073 #, c-format -msgid "could not send RADIUS packet: %m" -msgstr "invio del pacchetto RADIUS fallito: %m" +msgid "non-printable characters in SCRAM nonce" +msgstr "caratteri non stampabili nel nonce SCRAM" -#: libpq/auth.c:3125 libpq/auth.c:3151 +#: libpq/auth-scram.c:1203 #, c-format -msgid "timeout waiting for RADIUS response from %s" -msgstr "timeout in attesa della risposta RADIUS da %s" +msgid "could not generate random nonce" +msgstr "errore nella generazione del nonce SCRAM" -#: libpq/auth.c:3144 +#: libpq/auth-scram.c:1213 #, c-format -msgid "could not check status on RADIUS socket: %m" -msgstr "controllo dello stato sul socket RADIUS fallito: %m" +msgid "could not encode random nonce" +msgstr "impossibile codificare nonce casuale" -#: libpq/auth.c:3174 +#: libpq/auth-scram.c:1319 #, c-format -msgid "could not read RADIUS response: %m" -msgstr "lettura della risposta RADIUS fallita: %m" +msgid "SCRAM channel binding check failed" +msgstr "controllo di binding del canale SCRAM fallito" -#: libpq/auth.c:3187 libpq/auth.c:3191 +#: libpq/auth-scram.c:1337 #, c-format -msgid "RADIUS response from %s was sent from incorrect port: %d" -msgstr "la risposta RADIUS da %s è stata inviata da una porta non valida: %d" +msgid "unexpected SCRAM channel-binding attribute in client-final-message" +msgstr "attributo channel-binding SCRAM non previsto nel messaggio finale del client" -#: libpq/auth.c:3200 +#: libpq/auth-scram.c:1356 #, c-format -msgid "RADIUS response from %s too short: %d" -msgstr "risposta RADIUS da %s troppo breve: %d" +msgid "Malformed proof in client-final-message." +msgstr "Verifica malformata in client-final-message." -#: libpq/auth.c:3207 +#: libpq/auth-scram.c:1364 #, c-format -msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" -msgstr "la risposta RADIUS da %s ha una lunghezza non valida: %d (la lunghezza reale è %d)" +msgid "Garbage found at the end of client-final-message." +msgstr "Dati spuri alla fine del client-final-message." -#: libpq/auth.c:3215 +#: libpq/auth.c:275 #, c-format -msgid "RADIUS response from %s is to a different request: %d (should be %d)" -msgstr "la risposta RADIUS da %s è di una richiesta diversa: %d (dovrebbe essere %d)" +msgid "authentication failed for user \"%s\": host rejected" +msgstr "autenticazione fallita per l'utente \"%s\": host rifiutato" -#: libpq/auth.c:3240 +#: libpq/auth.c:278 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "criptaggio MD5 dei pacchetti ricevuti fallito" +msgid "\"trust\" authentication failed for user \"%s\"" +msgstr "autenticazione \"trust\" fallita per l'utente \"%s\"" -#: libpq/auth.c:3249 +#: libpq/auth.c:281 #, c-format -msgid "RADIUS response from %s has incorrect MD5 signature" -msgstr "la risposta RADIUS da %s ha una firma MD5 non valida" +msgid "Ident authentication failed for user \"%s\"" +msgstr "Autenticazione Ident fallita per l'utente \"%s\"" -#: libpq/auth.c:3267 +#: libpq/auth.c:284 #, c-format -msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" -msgstr "La risposta RADIUS da %s ha un codice non valido (%d) per l'utente \"%s\"" +msgid "Peer authentication failed for user \"%s\"" +msgstr "Autenticazione Peer fallita per l'utente \"%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:545 +#: libpq/auth.c:289 #, c-format -msgid "invalid large-object descriptor: %d" -msgstr "descrittore di large object non valido: %d" +msgid "password authentication failed for user \"%s\"" +msgstr "autenticazione con password fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:161 +#: libpq/auth.c:294 #, c-format -msgid "large object descriptor %d was not opened for reading" -msgstr "il descrittore per il large object %d non era aperto in lettura" +msgid "GSSAPI authentication failed for user \"%s\"" +msgstr "autenticazione GSSAPI fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:552 +#: libpq/auth.c:297 #, c-format -msgid "large object descriptor %d was not opened for writing" -msgstr "il descrittore per il large object %d non era aperto in scrittura" +msgid "SSPI authentication failed for user \"%s\"" +msgstr "Autenticazione SSPI fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:212 +#: libpq/auth.c:300 #, c-format -msgid "lo_lseek result out of range for large-object descriptor %d" -msgstr "il risultato di lo_lseek è fuori dall'intervallo consentito per il descrittore di large object %d" +msgid "PAM authentication failed for user \"%s\"" +msgstr "Autenticazione PAM fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:285 +#: libpq/auth.c:303 #, c-format -msgid "lo_tell result out of range for large-object descriptor %d" -msgstr "il risultato di lo_tell è fuori dall'intervallo consentito per il descrittore di large object %d" +msgid "BSD authentication failed for user \"%s\"" +msgstr "Autenticazione BSD fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:432 +#: libpq/auth.c:306 #, c-format -msgid "could not open server file \"%s\": %m" -msgstr "apertura del file del server \"%s\" fallita: %m" +msgid "LDAP authentication failed for user \"%s\"" +msgstr "Autenticazione LDAP fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:454 +#: libpq/auth.c:309 #, c-format -msgid "could not read server file \"%s\": %m" -msgstr "lettura dal file del server \"%s\" fallita: %m" +msgid "certificate authentication failed for user \"%s\"" +msgstr "autenticazione con certificato fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:511 +#: libpq/auth.c:312 #, c-format -msgid "could not create server file \"%s\": %m" -msgstr "creazione del file del server \"%s\" fallita: %m" +msgid "RADIUS authentication failed for user \"%s\"" +msgstr "Autenticazione RADIUS fallita per l'utente \"%s\"" -#: libpq/be-fsstubs.c:523 +#: libpq/auth.c:315 #, c-format -msgid "could not write server file \"%s\": %m" -msgstr "scrittura del file del server \"%s\" fallita: %m" +msgid "authentication failed for user \"%s\": invalid authentication method" +msgstr "autenticazione fallita per l'utente \"%s\": metodo di autenticazione non valido" -#: libpq/be-fsstubs.c:752 +#: libpq/auth.c:319 #, c-format -msgid "large object read request is too large" -msgstr "la richiesta di lettura per il large object è troppo grande" +msgid "Connection matched pg_hba.conf line %d: \"%s\"" +msgstr "La connessione si abbina con la riga %d di pg_hba.log: \"%s\"" -#: libpq/be-fsstubs.c:794 utils/adt/genfile.c:231 utils/adt/genfile.c:270 -#: utils/adt/genfile.c:306 +#: libpq/auth.c:362 #, c-format -msgid "requested length cannot be negative" -msgstr "la lunghezza richiesta non può essere negativa" +msgid "authentication identifier set more than once" +msgstr "identificatore di autenticazione impostato più di una volta" -#: libpq/be-fsstubs.c:847 storage/large_object/inv_api.c:296 -#: storage/large_object/inv_api.c:308 storage/large_object/inv_api.c:512 -#: storage/large_object/inv_api.c:623 storage/large_object/inv_api.c:813 +#: libpq/auth.c:363 #, c-format -msgid "permission denied for large object %u" -msgstr "permesso per il large object %u negato" +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "identificatore precedente: \"%s\"; nuovo identificatore: \"%s\"" -#: libpq/be-secure-common.c:91 +#: libpq/auth.c:372 #, c-format -msgid "could not read from command \"%s\": %m" -msgstr "lettura fallita dal comando \"%s\": %m" +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "connessione autenticata: identity=\"%s\" metodo=%s (%s:%d)" -#: libpq/be-secure-common.c:109 +#: libpq/auth.c:411 #, c-format -msgid "command \"%s\" failed" -msgstr "comando \"%s\" fallito" +msgid "client certificates can only be checked if a root certificate store is available" +msgstr "il certificato del client può essere controllato solo se un root certificate store è disponibile" -#: libpq/be-secure-common.c:139 +#: libpq/auth.c:422 #, c-format -msgid "could not access private key file \"%s\": %m" -msgstr "accesso fallito al file della chiave privata \"%s\": %m" +msgid "connection requires a valid client certificate" +msgstr "la connessione richiede un certificato valido per il client" -#: libpq/be-secure-common.c:148 -#, c-format -msgid "private key file \"%s\" is not a regular file" -msgstr "il file di chiave privata \"%s\" non è un file regolare" +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "GSS encryption" +msgstr "Crittografia GSS" -#: libpq/be-secure-common.c:163 +#: libpq/auth.c:456 libpq/auth.c:502 +msgid "SSL encryption" +msgstr "Crittografia SSL" + +#: libpq/auth.c:458 libpq/auth.c:504 +msgid "no encryption" +msgstr "nessuna crittografia" + +#. translator: last %s describes encryption state +#: libpq/auth.c:464 #, c-format -msgid "private key file \"%s\" must be owned by the database user or root" -msgstr "il file di chiave privata \"%s\" deve essere di proprietà dell'utente del database o di root" +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf rifiuta connessioni di replica per l'host \"%s\", utente \"%s\", %s" -#: libpq/be-secure-common.c:186 +#. translator: last %s describes encryption state +#: libpq/auth.c:471 #, c-format -msgid "private key file \"%s\" has group or world access" -msgstr "il file della chiave privata \"%s\" ha accesso al gruppo o a chiunque" +msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "pg_hba.conf rifiuta connessioni per l'host \"%s\", utente \"%s\", database \"%s\", %s" -#: libpq/be-secure-common.c:188 +#: libpq/auth.c:509 #, 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 "Il file deve avere permesso u=rw (0600) o inferiore se di proprietà dell'utente database, o permesso u=rw,g=r (0640) o inferiore se di proprietà di root." +msgid "Client IP address resolved to \"%s\", forward lookup matches." +msgstr "Indirizzo IP del client risolto in \"%s\", il forward lookup combacia." -#: libpq/be-secure-openssl.c:104 +#: libpq/auth.c:512 #, c-format -msgid "could not create SSL context: %s" -msgstr "creazione del contesto SSL fallita: %s" +msgid "Client IP address resolved to \"%s\", forward lookup not checked." +msgstr "Indirizzo IP del client risolto in \"%s\", forward lookup non controllato." -#: libpq/be-secure-openssl.c:147 +#: libpq/auth.c:515 #, c-format -msgid "could not load server certificate file \"%s\": %s" -msgstr "caricamento del file di certificato del server \"%s\" fallito: %s" +msgid "Client IP address resolved to \"%s\", forward lookup does not match." +msgstr "Indirizzo IP del client risolto in \"%s\", il forward lookup non combacia." -#: libpq/be-secure-openssl.c:167 +#: libpq/auth.c:518 #, c-format -msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" -msgstr "il file della chiave privata \"%s\" non può essere ricaricato perché richiede una passphrase" +msgid "Could not translate client host name \"%s\" to IP address: %s." +msgstr "Conversione del nome host \"%s\" in indirizzo IP non riuscita: %s." -#: libpq/be-secure-openssl.c:172 +#: libpq/auth.c:523 #, c-format -msgid "could not load private key file \"%s\": %s" -msgstr "caricamento del file della chiave privata \"%s\" fallito: %s" +msgid "Could not resolve client IP address to a host name: %s." +msgstr "Risoluzione dell'indirizzo IP del client in nome host non riuscita: %s." -#: libpq/be-secure-openssl.c:181 +#. translator: last %s describes encryption state +#: libpq/auth.c:531 #, c-format -msgid "check of private key failed: %s" -msgstr "controllo della chiave privata fallito: %s" +msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" +msgstr "nessuna voce in pg_hba.conf per connessioni di replica da host \"%s\", utente \"%s\", database \"%s\"" -#: libpq/be-secure-openssl.c:208 +#. translator: last %s describes encryption state +#: libpq/auth.c:539 #, c-format -msgid "could not set the cipher list (no valid ciphers available)" -msgstr "impostazione della lista dei cifrari fallita (nessun cifrario valido disponibile)" +msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "nessuna voce in pg_hba.conf per l'host \"%s\", utente \"%s\", database \"%s\", %s" -#: libpq/be-secure-openssl.c:226 +#: libpq/auth.c:712 #, c-format -msgid "could not load root certificate file \"%s\": %s" -msgstr "caricamento del file del certificato radice \"%s\" fallito: %s" +msgid "expected password response, got message type %d" +msgstr "era attesa una risposta password, ricevuto messaggio di tipo %d" -#: libpq/be-secure-openssl.c:253 +#: libpq/auth.c:733 #, c-format -msgid "SSL certificate revocation list file \"%s\" ignored" -msgstr "il file di lista di revoche di certificati SSL \"%s\" è stato ignorato" +msgid "invalid password packet size" +msgstr "dimensione del pacchetto password non valida" -#: libpq/be-secure-openssl.c:255 +#: libpq/auth.c:751 #, c-format -msgid "SSL library does not support certificate revocation lists." -msgstr "La libreria SSL non supporta le liste di revoca dei certificati." +msgid "empty password returned by client" +msgstr "il client ha restituito una password vuota" -#: libpq/be-secure-openssl.c:262 +#: libpq/auth.c:880 libpq/hba.c:1335 #, c-format -msgid "could not load SSL certificate revocation list file \"%s\": %s" -msgstr "caricamento del file di lista di revoche di certificati SSL \"%s\" fallito: %s" +msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" +msgstr "L'autenticazione MD5 non è supportata quando \"db_user_namespace\" è abilitato" -#: libpq/be-secure-openssl.c:337 +#: libpq/auth.c:886 #, c-format -msgid "could not initialize SSL connection: SSL context not set up" -msgstr "inizializzazione della connessione SSL fallita: contesto SSL non impostato" +msgid "could not generate random MD5 salt" +msgstr "errore nella generazione del sale casuale MD5" -#: libpq/be-secure-openssl.c:345 +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 #, c-format -msgid "could not initialize SSL connection: %s" -msgstr "inizializzazione della connessione SSL fallita: %s" +msgid "could not set environment: %m" +msgstr "impossibile impostare l'ambiente: %m" -#: libpq/be-secure-openssl.c:353 +#: libpq/auth.c:971 #, c-format -msgid "could not set SSL socket: %s" -msgstr "impostazione del socket SSL fallita: %s" +msgid "expected GSS response, got message type %d" +msgstr "era attesa una risposta GSS, ricevuto messaggio di tipo %d" + +#: libpq/auth.c:1031 +msgid "accepting GSS security context failed" +msgstr "contesto di sicurezza accettazione GSS fallito" + +#: libpq/auth.c:1072 +msgid "retrieving GSS user name failed" +msgstr "la richiesta del GSS user name è fallita" + +#: libpq/auth.c:1221 +msgid "could not acquire SSPI credentials" +msgstr "non è stato possibile ottenere le credenziali SSPI" -#: libpq/be-secure-openssl.c:408 +#: libpq/auth.c:1246 #, c-format -msgid "could not accept SSL connection: %m" -msgstr "accettazione della connessione SSL fallita: %m" +msgid "expected SSPI response, got message type %d" +msgstr "era attesa una risposta SSPI, ricevuto messaggio di tipo %d" + +#: libpq/auth.c:1324 +msgid "could not accept SSPI security context" +msgstr "non è stato possibile accettare il contesto di sicurezza SSPI" -#: libpq/be-secure-openssl.c:412 libpq/be-secure-openssl.c:423 +#: libpq/auth.c:1386 +msgid "could not get token from SSPI security context" +msgstr "non è stato possibile ottenere il token dal contesto di sicurezza SSPI" + +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format -msgid "could not accept SSL connection: EOF detected" -msgstr "accettazione della connessione SSL fallita: fine file individuata" +msgid "could not translate name" +msgstr "non è stato possibile tradurre il nome" -#: libpq/be-secure-openssl.c:417 +#: libpq/auth.c:1557 #, c-format -msgid "could not accept SSL connection: %s" -msgstr "accettazione della connessione SSL fallita: %s" +msgid "realm name too long" +msgstr "nome di realm troppo lungo" -#: libpq/be-secure-openssl.c:428 libpq/be-secure-openssl.c:559 -#: libpq/be-secure-openssl.c:623 +#: libpq/auth.c:1572 #, c-format -msgid "unrecognized SSL error code: %d" -msgstr "codice di errore SSL sconosciuto: %d" +msgid "translated account name too long" +msgstr "nome di account tradotto troppo lungo" -#: libpq/be-secure-openssl.c:470 +#: libpq/auth.c:1753 #, c-format -msgid "SSL certificate's common name contains embedded null" -msgstr "Il nome comune del certificato SSL contiene un null" +msgid "could not create socket for Ident connection: %m" +msgstr "creazione del socket per la connessione Ident fallita: %m" -#: libpq/be-secure-openssl.c:548 libpq/be-secure-openssl.c:607 +#: libpq/auth.c:1768 #, c-format -msgid "SSL error: %s" -msgstr "errore SSL: %s" +msgid "could not bind to local address \"%s\": %m" +msgstr "bind sull'indirizzo locale \"%s\" fallito: %m" -#: libpq/be-secure-openssl.c:788 +#: libpq/auth.c:1780 #, c-format -msgid "could not open DH parameters file \"%s\": %m" -msgstr "errore nell'apertura del file di parametri DH \"%s\": %m" +msgid "could not connect to Ident server at address \"%s\", port %s: %m" +msgstr "connessione al server Ident all'indirizzo \"%s\", porta %s fallita: %m" -#: libpq/be-secure-openssl.c:800 +#: libpq/auth.c:1802 #, c-format -msgid "could not load DH parameters file: %s" -msgstr "errore nell'apertura del file di parametri DH: %s" +msgid "could not send query to Ident server at address \"%s\", port %s: %m" +msgstr "invio della query al server Ident all'indirizzo \"%s\", porta %s fallito: %m" -#: libpq/be-secure-openssl.c:810 +#: libpq/auth.c:1819 #, c-format -msgid "invalid DH parameters: %s" -msgstr "parametri DH non validi: %s" +msgid "could not receive response from Ident server at address \"%s\", port %s: %m" +msgstr "ricezione della risposta dal server Ident all'indirizzo \"%s\", porta %s fallita: %m" -#: libpq/be-secure-openssl.c:818 +#: libpq/auth.c:1829 #, c-format -msgid "invalid DH parameters: p is not prime" -msgstr "parametri DH non validi: p non è primo" +msgid "invalidly formatted response from Ident server: \"%s\"" +msgstr "risposta dal server Ident formattata in maniera non corretta: \"%s\"" -#: libpq/be-secure-openssl.c:826 +#: libpq/auth.c:1882 #, c-format -msgid "invalid DH parameters: neither suitable generator or safe prime" -msgstr "parametri DH non validi: né un generatore adatto o un primo sicuro" +msgid "peer authentication is not supported on this platform" +msgstr "il metodo di autenticazione peer non è supportato su questa piattaforma" -#: libpq/be-secure-openssl.c:981 +#: libpq/auth.c:1886 #, c-format -msgid "DH: could not load DH parameters" -msgstr "DH: errore nel caricamento dei parametri DH" +msgid "could not get peer credentials: %m" +msgstr "non è stato possibile recuperare le credenziali del peer: %m" -#: libpq/be-secure-openssl.c:989 +#: libpq/auth.c:1898 #, c-format -msgid "DH: could not set DH parameters: %s" -msgstr "DH: errore nell'impostazione dei parametri DH: %s" +msgid "could not look up local user ID %ld: %s" +msgstr "ricerca dell'ID utente locale %ld fallita: %s" -#: libpq/be-secure-openssl.c:1013 +#: libpq/auth.c:1999 #, c-format -msgid "ECDH: unrecognized curve name: %s" -msgstr "ECDH: nome della curva non riconosciuto: %s" +msgid "error from underlying PAM layer: %s" +msgstr "errore dal livello PAM sottostante: %s" -#: libpq/be-secure-openssl.c:1022 +#: libpq/auth.c:2010 #, c-format -msgid "ECDH: could not create key" -msgstr "ECDH: chiave non creata" +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "conversazione PAM non supportata %d/\"%s\"" -#: libpq/be-secure-openssl.c:1050 -msgid "no SSL error reported" -msgstr "nessun errore SSL riportato" +#: libpq/auth.c:2070 +#, c-format +msgid "could not create PAM authenticator: %s" +msgstr "creazione dell'autenticatore PAM fallita: %s" -#: libpq/be-secure-openssl.c:1054 +#: libpq/auth.c:2081 #, c-format -msgid "SSL error code %lu" -msgstr "codice di errore SSL: %lu" +msgid "pam_set_item(PAM_USER) failed: %s" +msgstr "pam_set_item(PAM_USER) fallita: %s" -#: libpq/be-secure.c:119 +#: libpq/auth.c:2113 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "connessione SSL da \"%s\"" +msgid "pam_set_item(PAM_RHOST) failed: %s" +msgstr "pam_set_item(PAM_RHOST) fallita: %s" -#: libpq/be-secure.c:193 libpq/be-secure.c:279 +#: libpq/auth.c:2125 #, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "la connessione è stata terminata a causa di un'uscita inattesa di postmaster" +msgid "pam_set_item(PAM_CONV) failed: %s" +msgstr "pam_set_item(PAM_CONV) fallita: %s" -#: libpq/crypt.c:51 +#: libpq/auth.c:2138 #, c-format -msgid "Role \"%s\" does not exist." -msgstr "Il ruolo \"%s\" non esiste." +msgid "pam_authenticate failed: %s" +msgstr "pam_authenticate fallita: %s" -#: libpq/crypt.c:61 +#: libpq/auth.c:2151 #, c-format -msgid "User \"%s\" has no password assigned." -msgstr "L'utente \"%s\" non ha una password assegnata." +msgid "pam_acct_mgmt failed: %s" +msgstr "pam_acct_mgmt fallita: %s" -#: libpq/crypt.c:79 +#: libpq/auth.c:2162 #, c-format -msgid "User \"%s\" has an expired password." -msgstr "L'utente \"%s\" ha la password scaduta." +msgid "could not release PAM authenticator: %s" +msgstr "rilascio dell'autenticatore PAM fallito: %s" -#: libpq/crypt.c:173 +#: libpq/auth.c:2242 #, c-format -msgid "User \"%s\" has a password that cannot be used with MD5 authentication." -msgstr "L'utente \"%s\" ha una password che non può essere usata con l'autenticazione MD5." +msgid "could not initialize LDAP: error code %d" +msgstr "inizializzazione LDAP fallita: codice errore %d" -#: libpq/crypt.c:197 libpq/crypt.c:238 libpq/crypt.c:262 +#: libpq/auth.c:2279 #, c-format -msgid "Password does not match for user \"%s\"." -msgstr "Le password non combaciano per l'utente \"%s\"." +msgid "could not extract domain name from ldapbasedn" +msgstr "impossibile estrarre il nome di dominio da ldapbasedn" -#: libpq/crypt.c:281 +#: libpq/auth.c:2287 #, c-format -msgid "Password of user \"%s\" is in unrecognized format." -msgstr "La password dell'utente \"%s\" è in un formato non riconosciuto." +msgid "LDAP authentication could not find DNS SRV records for \"%s\"" +msgstr "L'autenticazione LDAP non è riuscita a trovare i record SRV DNS per \"%s\"" -#: libpq/hba.c:235 +#: libpq/auth.c:2289 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "token del file di autenticazione troppo lungo, saltato: \"%s\"" +msgid "Set an LDAP server name explicitly." +msgstr "Impostare un nome server LDAP in modo esplicito." -#: libpq/hba.c:407 +#: libpq/auth.c:2341 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "apertura del file secondario di autenticazione \"@%s\" come \"%s\" fallita: %m" +msgid "could not initialize LDAP: %s" +msgstr "inizializzazione LDAP fallita: %s" -#: libpq/hba.c:509 +#: libpq/auth.c:2351 #, c-format -msgid "authentication file line too long" -msgstr "riga del file di autenticazione troppo lunga" +msgid "ldaps not supported with this LDAP library" +msgstr "ldaps non supportato con questa libreria LDAP" -#: 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:1011 libpq/hba.c:1020 -#: libpq/hba.c:1041 libpq/hba.c:1054 libpq/hba.c:1074 libpq/hba.c:1096 -#: libpq/hba.c:1108 libpq/hba.c:1164 libpq/hba.c:1184 libpq/hba.c:1198 -#: libpq/hba.c:1217 libpq/hba.c:1228 libpq/hba.c:1243 libpq/hba.c:1261 -#: libpq/hba.c:1277 libpq/hba.c:1289 libpq/hba.c:1326 libpq/hba.c:1367 -#: libpq/hba.c:1380 libpq/hba.c:1402 libpq/hba.c:1414 libpq/hba.c:1432 -#: libpq/hba.c:1482 libpq/hba.c:1523 libpq/hba.c:1534 libpq/hba.c:1550 -#: libpq/hba.c:1567 libpq/hba.c:1577 libpq/hba.c:1635 libpq/hba.c:1673 -#: libpq/hba.c:1689 libpq/hba.c:1779 libpq/hba.c:1797 libpq/hba.c:1891 -#: libpq/hba.c:1910 libpq/hba.c:1939 libpq/hba.c:1952 libpq/hba.c:1975 -#: libpq/hba.c:1997 libpq/hba.c:2011 tsearch/ts_locale.c:179 +#: libpq/auth.c:2359 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "riga %d del file di configurazione \"%s\"" +msgid "could not initialize LDAP: %m" +msgstr "inizializzazione LDAP fallita: %m" -#. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/auth.c:2369 #, c-format -msgid "authentication option \"%s\" is only valid for authentication methods %s" -msgstr "l'opzione di autenticazione \"%s\" è valida solo per i metodi di autenticazione %s" +msgid "could not set LDAP protocol version: %s" +msgstr "impostazione della versione del protocollo LDAP fallita: %s" -#: libpq/hba.c:885 +#: libpq/auth.c:2409 #, c-format -msgid "authentication method \"%s\" requires argument \"%s\" to be set" -msgstr "il metodo di autenticazione \"%s\" richiede che l'argomenti \"%s\" sia impostato" +msgid "could not load function _ldap_start_tls_sA in wldap32.dll" +msgstr "caricamento della funzione _ldap_start_tls_sA in wldap32.dll fallito" -#: libpq/hba.c:913 +#: libpq/auth.c:2410 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "voce mancante nel file \"%s\" alla fine della riga %d" +msgid "LDAP over SSL is not supported on this platform." +msgstr "LDAP su SSL non è supportato su questa piattaforma." -#: libpq/hba.c:924 +#: libpq/auth.c:2426 #, c-format -msgid "multiple values in ident field" -msgstr "più di un valore nel campo ident" +msgid "could not start LDAP TLS session: %s" +msgstr "avvio della sessione TLS LDAP fallito: %s" -#: libpq/hba.c:973 +#: libpq/auth.c:2497 #, c-format -msgid "multiple values specified for connection type" -msgstr "più di un valore specificato per il tipo di connessione" +msgid "LDAP server not specified, and no ldapbasedn" +msgstr "Server LDAP non specificato e nessun ldapbasedn" -#: libpq/hba.c:974 +#: libpq/auth.c:2504 #, c-format -msgid "Specify exactly one connection type per line." -msgstr "Specifica esattamente un tipo di connessione per riga." +msgid "LDAP server not specified" +msgstr "Server LDAP non specificato" -#: libpq/hba.c:988 +#: libpq/auth.c:2566 #, c-format -msgid "local connections are not supported by this build" -msgstr "le connessioni locali non sono supportate in questo binario" +msgid "invalid character in user name for LDAP authentication" +msgstr "carattere non valido nel nome utente per l'autenticazione LDAP" -#: libpq/hba.c:1009 +#: libpq/auth.c:2583 #, c-format -msgid "hostssl record cannot match because SSL is disabled" -msgstr "il record hostssl non può combaciare perché SSL è disabilitato" +msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" +msgstr "bind iniziale LDAP fallito per ldapbinddn \"%s\" sul server \"%s\": %s" -#: libpq/hba.c:1010 +#: libpq/auth.c:2612 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "Imposta ssl = on in postgresql.conf." +msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" +msgstr "ricerca in LDAP del filtro \"%s\" sul server \"%s\" fallita: %s" -#: libpq/hba.c:1018 +#: libpq/auth.c:2626 #, c-format -msgid "hostssl record cannot match because SSL is not supported by this build" -msgstr "il record hostssl non può combaciare perché SSL non è supportato da questo build" +msgid "LDAP user \"%s\" does not exist" +msgstr "L'utente LDAP \"%s\" non esiste" -#: libpq/hba.c:1019 +#: libpq/auth.c:2627 #, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "Compila con --with-openssl per usare connessioni SSL." +msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." +msgstr "La ricerca LDAP del filtro \"%s\" sul server \"%s\" non ha restituito risultati." -#: libpq/hba.c:1039 +#: libpq/auth.c:2631 #, c-format -msgid "invalid connection type \"%s\"" -msgstr "tipo di connessione \"%s\" non valido" +msgid "LDAP user \"%s\" is not unique" +msgstr "L'utente LDAP \"%s\" non è unico" -#: libpq/hba.c:1053 +#: libpq/auth.c:2632 #, c-format -msgid "end-of-line before database specification" -msgstr "fine riga prima della specificazione del database" +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 ricerca LDAP del filtro \"%s\" sul server \"%s\" ha restituito %d risultato." +msgstr[1] "La ricerca LDAP del filtro \"%s\" sul server \"%s\" ha restituito %d risultati." -#: libpq/hba.c:1073 +#: libpq/auth.c:2652 #, c-format -msgid "end-of-line before role specification" -msgstr "fine riga prima della specificazione del ruolo" +msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" +msgstr "dn per il primo risultato di \"%s\" non trovato sul server \"%s\": %s" -#: libpq/hba.c:1095 +#: libpq/auth.c:2673 #, c-format -msgid "end-of-line before IP address specification" -msgstr "fine riga prima della specificazione dell'indirizzo IP" +msgid "could not unbind after searching for user \"%s\" on server \"%s\"" +msgstr "unbinding fallito dopo aver cercato l'utente \"%s\" sul server \"%s\"" -#: libpq/hba.c:1106 +#: libpq/auth.c:2704 #, c-format -msgid "multiple values specified for host address" -msgstr "più di un valore specificato per l'indirizzo host" +msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" +msgstr "Login LDAP fallito per l'utente \"%s\" sul server \"%s\": %s" -#: libpq/hba.c:1107 +#: libpq/auth.c:2736 #, c-format -msgid "Specify one address range per line." -msgstr "Specifica un intervallo di indirizzi per riga." +msgid "LDAP diagnostics: %s" +msgstr "Diagnostica LDAP: %s" -#: libpq/hba.c:1162 +#: libpq/auth.c:2774 #, c-format -msgid "invalid IP address \"%s\": %s" -msgstr "indirizzo IP non valido \"%s\": %s" +msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" +msgstr "autenticazione con certificato fallita per l'utente \"%s\": il certificato del client non contiene alcun nome utente" -#: libpq/hba.c:1182 +#: libpq/auth.c:2795 #, c-format -msgid "specifying both host name and CIDR mask is invalid: \"%s\"" -msgstr "specificare sia un nome host che una maschera CIDR non è consentito: \"%s\"" +msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" +msgstr "autenticazione del certificato non riuscita per l'utente \"%s\": impossibile recuperare il DN soggetto" -#: libpq/hba.c:1196 +#: libpq/auth.c:2818 #, c-format -msgid "invalid CIDR mask in address \"%s\"" -msgstr "maschera CIDR non valida nell'indirizzo \"%s\"" +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" +msgstr "convalida del certificato (clientcert=verify-full) non riuscita per l'utente \"%s\": mancata corrispondenza del DN" -#: libpq/hba.c:1215 +#: libpq/auth.c:2823 #, c-format -msgid "end-of-line before netmask specification" -msgstr "fine riga prima della specificazione della maschera di rete" +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" +msgstr "convalida del certificato (clientcert=verify-full) non riuscita per l'utente \"%s\": mancata corrispondenza CN" -#: libpq/hba.c:1216 +#: libpq/auth.c:2925 #, c-format -msgid "Specify an address range in CIDR notation, or provide a separate netmask." -msgstr "Specifica un intervallo di indirizzi in notazione CIDR, oppure fornisci una maschera di rete separata." +msgid "RADIUS server not specified" +msgstr "Server RADIUS non specificato" -#: libpq/hba.c:1227 +#: libpq/auth.c:2932 #, c-format -msgid "multiple values specified for netmask" -msgstr "più di un valore specificato per la maschera di rete" +msgid "RADIUS secret not specified" +msgstr "Segreto RADIUS non specificato" -#: libpq/hba.c:1241 +#: libpq/auth.c:2946 #, c-format -msgid "invalid IP mask \"%s\": %s" -msgstr "maschera IP non valida \"%s\": %s" +msgid "RADIUS authentication does not support passwords longer than %d characters" +msgstr "L'autenticazione RADIUS non supporta password più lunghe di %d caratteri" -#: libpq/hba.c:1260 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, c-format -msgid "IP address and mask do not match" -msgstr "l'indirizzo IP e la maschera non combaciano" +msgid "could not translate RADIUS server name \"%s\" to address: %s" +msgstr "conversione del nome del server RADIUS \"%s\" in indirizzo fallita: %s" -#: libpq/hba.c:1276 +#: libpq/auth.c:3067 #, c-format -msgid "end-of-line before authentication method" -msgstr "fine riga prima del metodo di autenticazione" +msgid "could not generate random encryption vector" +msgstr "generazione del vettore di criptaggio casuale fallita" -#: libpq/hba.c:1287 +#: libpq/auth.c:3104 #, c-format -msgid "multiple values specified for authentication type" -msgstr "più di un valore specificato per il tipo di autenticazione" +msgid "could not perform MD5 encryption of password: %s" +msgstr "impossibile eseguire la crittografia MD5 della password: %s" -#: libpq/hba.c:1288 +#: libpq/auth.c:3131 #, c-format -msgid "Specify exactly one authentication type per line." -msgstr "Specifica esattamente un tipo di autenticazione per riga." +msgid "could not create RADIUS socket: %m" +msgstr "creazione del socket RADIUS fallita: %m" -#: libpq/hba.c:1365 +#: libpq/auth.c:3153 #, c-format -msgid "invalid authentication method \"%s\"" -msgstr "metodo di autenticazione \"%s\" non valido" +msgid "could not bind local RADIUS socket: %m" +msgstr "bind del socket RADIUS fallito: %m" -#: libpq/hba.c:1378 +#: libpq/auth.c:3163 #, c-format -msgid "invalid authentication method \"%s\": not supported by this build" -msgstr "metodo di autenticazione \"%s\" non valido: non supportato in questo binario" +msgid "could not send RADIUS packet: %m" +msgstr "invio del pacchetto RADIUS fallito: %m" -#: libpq/hba.c:1401 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, c-format -msgid "gssapi authentication is not supported on local sockets" -msgstr "l'autenticazione gssapi non è supportata su socket locali" +msgid "timeout waiting for RADIUS response from %s" +msgstr "timeout in attesa della risposta RADIUS da %s" -#: libpq/hba.c:1413 +#: libpq/auth.c:3216 #, c-format -msgid "peer authentication is only supported on local sockets" -msgstr "l'autenticazione peer è supportata solo su socket locali" +msgid "could not check status on RADIUS socket: %m" +msgstr "controllo dello stato sul socket RADIUS fallito: %m" -#: libpq/hba.c:1431 +#: libpq/auth.c:3246 #, c-format -msgid "cert authentication is only supported on hostssl connections" -msgstr "l'autenticazione cert è supportata solo su connessioni hostssl" +msgid "could not read RADIUS response: %m" +msgstr "lettura della risposta RADIUS fallita: %m" -#: libpq/hba.c:1481 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, c-format -msgid "authentication option not in name=value format: %s" -msgstr "opzione di autenticazione non in formato nome=valore: %s" +msgid "RADIUS response from %s was sent from incorrect port: %d" +msgstr "la risposta RADIUS da %s è stata inviata da una porta non valida: %d" -#: libpq/hba.c:1522 +#: libpq/auth.c:3272 #, c-format -msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" -msgstr "non è possibile usare ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter o ldapurl insieme a ldapprefix" +msgid "RADIUS response from %s too short: %d" +msgstr "risposta RADIUS da %s troppo breve: %d" -#: libpq/hba.c:1533 +#: libpq/auth.c:3279 #, c-format -msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" -msgstr "il metodo di autenticazione \"ldap\" richiede che gli argomenti \"ldapbasedn\", \"ldapprefix\" o \"ldapsuffix\" siano impostati" +msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" +msgstr "la risposta RADIUS da %s ha una lunghezza non valida: %d (la lunghezza reale è %d)" -#: libpq/hba.c:1549 +#: libpq/auth.c:3287 #, c-format -msgid "cannot use ldapsearchattribute together with ldapsearchfilter" -msgstr "non è possibile usare ldapsearchattribute insieme a ldapsearchfilter" +msgid "RADIUS response from %s is to a different request: %d (should be %d)" +msgstr "la risposta RADIUS da %s è di una richiesta diversa: %d (dovrebbe essere %d)" -#: libpq/hba.c:1566 +#: libpq/auth.c:3312 #, c-format -msgid "list of RADIUS servers cannot be empty" -msgstr "la lista di server RADIUS non può essere vuota" +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "impossibile eseguire la crittografia MD5 del pacchetto ricevuto: %s" -#: libpq/hba.c:1576 +#: libpq/auth.c:3322 #, c-format -msgid "list of RADIUS secrets cannot be empty" -msgstr "la lista di segreti RADIUS non può essere vuota" +msgid "RADIUS response from %s has incorrect MD5 signature" +msgstr "la risposta RADIUS da %s ha una firma MD5 non valida" -#: libpq/hba.c:1629 +#: libpq/auth.c:3340 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" -msgstr "il numero di %s (%d) deve essere 1 oppure lo stesso numero di %s (%d)" - -#: libpq/hba.c:1663 -msgid "ident, peer, gssapi, sspi, and cert" -msgstr "ident, peer, gssapi, sspi e cert" +msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" +msgstr "La risposta RADIUS da %s ha un codice non valido (%d) per l'utente \"%s\"" -#: libpq/hba.c:1672 +#: 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 "clientcert can only be configured for \"hostssl\" rows" -msgstr "il clientcert può essere configurato solo per le righe \"hostssl\"" +msgid "invalid large-object descriptor: %d" +msgstr "descrittore di large object non valido: %d" -#: libpq/hba.c:1688 +#: libpq/be-fsstubs.c:168 #, c-format -msgid "clientcert can not be set to 0 when using \"cert\" authentication" -msgstr "clientcert non può essere impostato a 0 quando si usa l'autenticazione \"cert\"" +msgid "large object descriptor %d was not opened for reading" +msgstr "il descrittore per il large object %d non era aperto in lettura" -#: libpq/hba.c:1725 +#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 #, c-format -msgid "could not parse LDAP URL \"%s\": %s" -msgstr "impossibile interpretare la URL LDAP \"%s\": %s" +msgid "large object descriptor %d was not opened for writing" +msgstr "il descrittore per il large object %d non era aperto in scrittura" -#: libpq/hba.c:1736 +#: libpq/be-fsstubs.c:219 #, c-format -msgid "unsupported LDAP URL scheme: %s" -msgstr "schema di URL LDAP non supportato: %s" +msgid "lo_lseek result out of range for large-object descriptor %d" +msgstr "il risultato di lo_lseek è fuori dall'intervallo consentito per il descrittore di large object %d" -#: libpq/hba.c:1760 +#: libpq/be-fsstubs.c:282 #, c-format -msgid "LDAP URLs not supported on this platform" -msgstr "URL LDAP non supportate su questa piattaforma" +msgid "lo_tell result out of range for large-object descriptor %d" +msgstr "il risultato di lo_tell è fuori dall'intervallo consentito per il descrittore di large object %d" -#: libpq/hba.c:1778 +#: libpq/be-fsstubs.c:424 #, c-format -msgid "invalid ldapscheme value: \"%s\"" -msgstr "valore ldapscheme non valido: \"%s\"" +msgid "could not open server file \"%s\": %m" +msgstr "apertura del file del server \"%s\" fallita: %m" -#: libpq/hba.c:1796 +#: libpq/be-fsstubs.c:447 #, c-format -msgid "invalid LDAP port number: \"%s\"" -msgstr "numero di porta LDAP non valido: \"%s\"" - -#: libpq/hba.c:1842 libpq/hba.c:1849 -msgid "gssapi and sspi" -msgstr "gssapi e sspi" - -#: libpq/hba.c:1858 libpq/hba.c:1867 -msgid "sspi" -msgstr "sspi" +msgid "could not read server file \"%s\": %m" +msgstr "lettura dal file del server \"%s\" fallita: %m" -#: libpq/hba.c:1889 +#: libpq/be-fsstubs.c:506 #, c-format -msgid "could not parse RADIUS server list \"%s\"" -msgstr "errore nell'interpretazione della lista di server RADIUS \"%s\"" +msgid "could not create server file \"%s\": %m" +msgstr "creazione del file del server \"%s\" fallita: %m" -#: libpq/hba.c:1937 +#: libpq/be-fsstubs.c:518 #, c-format -msgid "could not parse RADIUS port list \"%s\"" -msgstr "errore nell'interpretazione della lista di porte RADIUS \"%s\"" +msgid "could not write server file \"%s\": %m" +msgstr "scrittura del file del server \"%s\" fallita: %m" -#: libpq/hba.c:1951 +#: libpq/be-fsstubs.c:758 #, c-format -msgid "invalid RADIUS port number: \"%s\"" -msgstr "numero di porta RADIUS non valido: \"%s\"" +msgid "large object read request is too large" +msgstr "la richiesta di lettura per il large object è troppo grande" -#: libpq/hba.c:1973 +#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 utils/adt/genfile.c:337 #, c-format -msgid "could not parse RADIUS secret list \"%s\"" -msgstr "errore nell'interpretazione della lista di segreti RADIUS \"%s\"" +msgid "requested length cannot be negative" +msgstr "la lunghezza richiesta non può essere negativa" -#: libpq/hba.c:1995 +#: 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 "could not parse RADIUS identifiers list \"%s\"" -msgstr "errore nell'interpretazione della lista di identificatori RADIUS \"%s\"" +msgid "permission denied for large object %u" +msgstr "permesso per il large object %u negato" -#: libpq/hba.c:2009 +#: libpq/be-secure-common.c:93 #, c-format -msgid "unrecognized authentication option name: \"%s\"" -msgstr "nome di opzione di autenticazione sconosciuto: \"%s\"" +msgid "could not read from command \"%s\": %m" +msgstr "lettura fallita dal comando \"%s\": %m" -#: libpq/hba.c:2142 libpq/hba.c:2547 guc-file.l:596 +#: libpq/be-secure-common.c:113 #, c-format -msgid "could not open configuration file \"%s\": %m" -msgstr "apertura del file di configurazione \"%s\" fallita: %m" +msgid "command \"%s\" failed" +msgstr "comando \"%s\" fallito" -#: libpq/hba.c:2193 +#: libpq/be-secure-common.c:141 #, c-format -msgid "configuration file \"%s\" contains no entries" -msgstr "il file di configurazione \"%s\" non contiene alcuna voce" +msgid "could not access private key file \"%s\": %m" +msgstr "accesso fallito al file della chiave privata \"%s\": %m" -#: libpq/hba.c:2703 +#: libpq/be-secure-common.c:151 #, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "espressione regolare non valida \"%s\": %s" +msgid "private key file \"%s\" is not a regular file" +msgstr "il file di chiave privata \"%s\" non è un file regolare" -#: libpq/hba.c:2763 +#: libpq/be-secure-common.c:177 #, c-format -msgid "regular expression match for \"%s\" failed: %s" -msgstr "corrispondenza dell'espressione regolare \"%s\" fallita: %s" +msgid "private key file \"%s\" must be owned by the database user or root" +msgstr "il file di chiave privata \"%s\" deve essere di proprietà dell'utente del database o di root" -#: libpq/hba.c:2782 +#: libpq/be-secure-common.c:187 #, c-format -msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" -msgstr "l'espressione regolare \"%s\" non ha la sottoespressione richiesta dal riferimento in \"%s\"" +msgid "private key file \"%s\" has group or world access" +msgstr "il file della chiave privata \"%s\" ha accesso al gruppo o a chiunque" -#: libpq/hba.c:2879 +#: libpq/be-secure-common.c:189 #, c-format -msgid "provided user name (%s) and authenticated user name (%s) do not match" -msgstr "il nome utente fornito (%s) e il nome utente autenticato (%s) non combaciano" +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 "Il file deve avere permesso u=rw (0600) o inferiore se di proprietà dell'utente database, o permesso u=rw,g=r (0640) o inferiore se di proprietà di root." -#: libpq/hba.c:2899 -#, c-format -msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" -msgstr "nessuna corrispondenza nella mappa utenti \"%s\" per l'utente \"%s\" autenticato come \"%s\"" +# non è che mi torni tanto così +#: libpq/be-secure-gssapi.c:204 +msgid "GSSAPI wrap error" +msgstr "Errore di avvolgimento GSSAPI" -#: libpq/hba.c:2932 +#: libpq/be-secure-gssapi.c:211 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "apertura del file usermap \"%s\" fallita: %m" +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "il messaggio GSSAPI in uscita non utilizzerà la riservatezza" -#: libpq/pqcomm.c:220 +#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 #, c-format -msgid "could not set socket to nonblocking mode: %m" -msgstr "impossibile impostare il socket in modalità non bloccante: %m" +msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "il server ha tentato di inviare pacchetti GSSAPI di dimensioni eccessive (%zu > %zu)" -#: libpq/pqcomm.c:374 +#: libpq/be-secure-gssapi.c:351 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" -msgstr "Il percorso del socket di dominio unix \"%s\" è troppo lungo (massimo %d byte)" +msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" +msgstr "pacchetto GSSAPI sovradimensionato inviato dal client (%zu > %zu)" -#: libpq/pqcomm.c:395 -#, c-format -msgid "could not translate host name \"%s\", service \"%s\" to address: %s" -msgstr "conversione del nome host \"%s\", servizio \"%s\" in indirizzo fallita: %s" +# non è che mi torni tanto così +#: libpq/be-secure-gssapi.c:389 +msgid "GSSAPI unwrap error" +msgstr "Errore di annullamento del wrapping di GSSAPI" -#: libpq/pqcomm.c:399 +#: libpq/be-secure-gssapi.c:396 #, c-format -msgid "could not translate service \"%s\" to address: %s" -msgstr "conversione del servizio \"%s\" in indirizzo fallita: %s" +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "il messaggio GSSAPI in arrivo non utilizzava la riservatezza" -#: libpq/pqcomm.c:426 +#: libpq/be-secure-gssapi.c:570 #, c-format -msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" -msgstr "bind a tutti gli indirizzi richiesti fallito: MAXLISTEN (%d) superato" - -#: libpq/pqcomm.c:435 -msgid "IPv4" -msgstr "IPv4" +msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +msgstr "pacchetto GSSAPI sovradimensionato inviato dal client (%zu > %d)" -#: libpq/pqcomm.c:439 -msgid "IPv6" -msgstr "IPv6" +#: libpq/be-secure-gssapi.c:594 +msgid "could not accept GSSAPI security context" +msgstr "non è stato possibile accettare il contesto di sicurezza SSPI" -#: libpq/pqcomm.c:444 -msgid "Unix" -msgstr "Unix" +# non è che mi torni tanto così +#: libpq/be-secure-gssapi.c:689 +msgid "GSSAPI size check error" +msgstr "Errore di controllo delle dimensioni GSSAPI" -#: libpq/pqcomm.c:449 +#: libpq/be-secure-openssl.c:122 #, c-format -msgid "unrecognized address family %d" -msgstr "famiglia di indirizzi %d sconosciuto" +msgid "could not create SSL context: %s" +msgstr "creazione del contesto SSL fallita: %s" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:475 +#: libpq/be-secure-openssl.c:148 #, c-format -msgid "could not create %s socket for address \"%s\": %m" -msgstr "creazione del socket %s per l'indirizzo \"%s\" fallita: %m" +msgid "could not load server certificate file \"%s\": %s" +msgstr "caricamento del file di certificato del server \"%s\" fallito: %s" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:501 +#: libpq/be-secure-openssl.c:168 #, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "setsockopt(SO_REUSEADDR) fallita per l'indirizzo %s \"%s\": %m" +msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" +msgstr "il file della chiave privata \"%s\" non può essere ricaricato perché richiede una passphrase" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:518 +#: libpq/be-secure-openssl.c:173 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "setsockopt(IPV6_V6ONLY) fallita per l'indirizzo %s \"%s\": %m" +msgid "could not load private key file \"%s\": %s" +msgstr "caricamento del file della chiave privata \"%s\" fallito: %s" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:538 +#: libpq/be-secure-openssl.c:182 #, c-format -msgid "could not bind %s address \"%s\": %m" -msgstr "bind dell'indirizzo %s \"%s\" fallito: %m" +msgid "check of private key failed: %s" +msgstr "controllo della chiave privata fallito: %s" -#: libpq/pqcomm.c:541 +#. 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 "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -msgstr "C'è già un altro postmaster in funzione sulla porta %d? Se non c'è, rimuovi il file socket \"%s\" e riprova." +msgid "\"%s\" setting \"%s\" not supported by this build" +msgstr "L'impostazione \"%s\" \"%s\" non è supportata da questa build" -#: libpq/pqcomm.c:544 +#: libpq/be-secure-openssl.c:205 #, c-format -msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." -msgstr "C'è già un altro postmaster in funzione sulla porta %d? Se non c'è, aspetta alcuni secondi e riprova." +msgid "could not set minimum SSL protocol version" +msgstr "impossibile impostare la versione minima del protocollo SSL" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:577 +#: libpq/be-secure-openssl.c:228 #, c-format -msgid "could not listen on %s address \"%s\": %m" -msgstr "listen sull'indirizzo %s \"%s\" fallito: %m" +msgid "could not set maximum SSL protocol version" +msgstr "impossibile impostare la versione massima del protocollo SSL" -#: libpq/pqcomm.c:586 +#: libpq/be-secure-openssl.c:244 #, c-format -msgid "listening on Unix socket \"%s\"" -msgstr "in ascolto sul socket Unix \"%s\"" +msgid "could not set SSL protocol version range" +msgstr "impossibile impostare l'intervallo di versioni del protocollo SSL" -#. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:592 +#: libpq/be-secure-openssl.c:245 #, c-format -msgid "listening on %s address \"%s\", port %d" -msgstr "in ascolto sull'indirizzo %s \"%s\", porta %d" +msgid "\"%s\" cannot be higher than \"%s\"" +msgstr "\"%s\" non può essere maggiore di \"%s\"" -#: libpq/pqcomm.c:675 +#: libpq/be-secure-openssl.c:282 #, c-format -msgid "group \"%s\" does not exist" -msgstr "il gruppo \"%s\" non esiste" +msgid "could not set the cipher list (no valid ciphers available)" +msgstr "impostazione della lista dei cifrari fallita (nessun cifrario valido disponibile)" -#: libpq/pqcomm.c:685 +#: libpq/be-secure-openssl.c:302 #, c-format -msgid "could not set group of file \"%s\": %m" -msgstr "impostazione del gruppo del file \"%s\" fallita: %m" +msgid "could not load root certificate file \"%s\": %s" +msgstr "caricamento del file del certificato radice \"%s\" fallito: %s" -#: libpq/pqcomm.c:696 +#: libpq/be-secure-openssl.c:351 #, c-format -msgid "could not set permissions of file \"%s\": %m" -msgstr "impostazione dei permessi del file \"%s\" fallita: %m" +msgid "could not load SSL certificate revocation list file \"%s\": %s" +msgstr "caricamento del file di lista di revoche di certificati SSL \"%s\" fallito: %s" -#: libpq/pqcomm.c:726 +#: libpq/be-secure-openssl.c:359 #, c-format -msgid "could not accept new connection: %m" -msgstr "impossibile accettare la nuova connessione: %m" +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "impossibile caricare la directory dell'elenco di revoche dei certificati SSL \"%s\": %s" -#: libpq/pqcomm.c:927 +#: libpq/be-secure-openssl.c:367 #, c-format -msgid "there is no client connection" -msgstr "c'è alcuna connessione client" +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "impossibile caricare il file dell'elenco di revoche dei certificati SSL \"%s\" o la directory \"%s\": %s" -#: libpq/pqcomm.c:978 libpq/pqcomm.c:1074 +#: libpq/be-secure-openssl.c:425 #, c-format -msgid "could not receive data from client: %m" -msgstr "ricezione dati dal client fallita: %m" +msgid "could not initialize SSL connection: SSL context not set up" +msgstr "inizializzazione della connessione SSL fallita: contesto SSL non impostato" -#: libpq/pqcomm.c:1219 tcop/postgres.c:3997 +#: libpq/be-secure-openssl.c:436 #, c-format -msgid "terminating connection because protocol synchronization was lost" -msgstr "la connessione verrà terminata perché la sincronizzazione del protocollo è stata persa" +msgid "could not initialize SSL connection: %s" +msgstr "inizializzazione della connessione SSL fallita: %s" -#: libpq/pqcomm.c:1285 +#: libpq/be-secure-openssl.c:444 #, c-format -msgid "unexpected EOF within message length word" -msgstr "fine file inattesa nella word della lunghezza del messaggio" +msgid "could not set SSL socket: %s" +msgstr "impostazione del socket SSL fallita: %s" -#: libpq/pqcomm.c:1296 +#: libpq/be-secure-openssl.c:499 #, c-format -msgid "invalid message length" -msgstr "lunghezza del messaggio non valida" +msgid "could not accept SSL connection: %m" +msgstr "accettazione della connessione SSL fallita: %m" -#: libpq/pqcomm.c:1318 libpq/pqcomm.c:1331 +#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 #, c-format -msgid "incomplete message from client" -msgstr "messaggio incompleto dal client" +msgid "could not accept SSL connection: EOF detected" +msgstr "accettazione della connessione SSL fallita: fine file individuata" -#: libpq/pqcomm.c:1464 +#: libpq/be-secure-openssl.c:542 #, c-format -msgid "could not send data to client: %m" -msgstr "invio dati al client fallito: %m" +msgid "could not accept SSL connection: %s" +msgstr "accettazione della connessione SSL fallita: %s" -#: libpq/pqformat.c:406 +#: libpq/be-secure-openssl.c:545 #, c-format -msgid "no data left in message" -msgstr "nessun dato rimasto nel messaggio" +msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." +msgstr "Ciò potrebbe indicare che il client non supporta alcuna versione del protocollo SSL compresa tra %s e %s." -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1470 utils/adt/rowtypes.c:566 +#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 libpq/be-secure-openssl.c:805 #, c-format -msgid "insufficient data left in message" -msgstr "i dati rimasti nel messaggio non sono sufficienti" +msgid "unrecognized SSL error code: %d" +msgstr "codice di errore SSL sconosciuto: %d" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/be-secure-openssl.c:607 #, c-format -msgid "invalid string in message" -msgstr "stringa non valida nel messaggio" +msgid "SSL certificate's common name contains embedded null" +msgstr "Il nome comune del certificato SSL contiene un null" -#: libpq/pqformat.c:642 +#: libpq/be-secure-openssl.c:647 #, c-format -msgid "invalid message format" -msgstr "formato del messaggio non valido" +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "Il nome distinto del certificato SSL contiene null incorporato" -#: main/main.c:264 +#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 #, c-format -msgid "%s: WSAStartup failed: %d\n" -msgstr "%s: WSAStartup fallita: %d\n" +msgid "SSL error: %s" +msgstr "errore SSL: %s" -#: main/main.c:328 +#: libpq/be-secure-openssl.c:971 #, c-format -msgid "" -"%s is the PostgreSQL server.\n" -"\n" -msgstr "" -"%s è il server PostgreSQL.\n" -"\n" +msgid "could not open DH parameters file \"%s\": %m" +msgstr "errore nell'apertura del file di parametri DH \"%s\": %m" -#: main/main.c:329 +#: libpq/be-secure-openssl.c:983 #, c-format -msgid "" -"Usage:\n" -" %s [OPTION]...\n" -"\n" -msgstr "" -"Utilizzo:\n" -" %s [OPZIONE]...\n" -"\n" +msgid "could not load DH parameters file: %s" +msgstr "errore nell'apertura del file di parametri DH: %s" -#: main/main.c:330 +#: libpq/be-secure-openssl.c:993 #, c-format -msgid "Options:\n" -msgstr "Opzioni:\n" +msgid "invalid DH parameters: %s" +msgstr "parametri DH non validi: %s" -#: main/main.c:331 +#: libpq/be-secure-openssl.c:1002 #, c-format -msgid " -B NBUFFERS number of shared buffers\n" -msgstr " -B NBUFFERS numero di buffer condivisi\n" +msgid "invalid DH parameters: p is not prime" +msgstr "parametri DH non validi: p non è primo" -#: main/main.c:332 +#: libpq/be-secure-openssl.c:1011 #, c-format -msgid " -c NAME=VALUE set run-time parameter\n" -msgstr " -c NOME=VALORE imposta un parametro di esecuzione\n" +msgid "invalid DH parameters: neither suitable generator or safe prime" +msgstr "parametri DH non validi: né un generatore adatto o un primo sicuro" -#: main/main.c:333 +#: libpq/be-secure-openssl.c:1172 #, c-format -msgid " -C NAME print value of run-time parameter, then exit\n" -msgstr " -C NAME stampa il valore del parametro di esecuzione ed esci\n" +msgid "DH: could not load DH parameters" +msgstr "DH: errore nel caricamento dei parametri DH" -#: main/main.c:334 +#: libpq/be-secure-openssl.c:1180 #, c-format -msgid " -d 1-5 debugging level\n" -msgstr " -d 1-5 livello di debugging\n" +msgid "DH: could not set DH parameters: %s" +msgstr "DH: errore nell'impostazione dei parametri DH: %s" -#: main/main.c:335 +#: libpq/be-secure-openssl.c:1207 #, c-format -msgid " -D DATADIR database directory\n" -msgstr " -D DATADIR directory del database\n" +msgid "ECDH: unrecognized curve name: %s" +msgstr "ECDH: nome della curva non riconosciuto: %s" -#: main/main.c:336 +#: libpq/be-secure-openssl.c:1216 #, c-format -msgid " -e use European date input format (DMY)\n" -msgstr " -e usa il formato date europeo (GMA)\n" +msgid "ECDH: could not create key" +msgstr "ECDH: chiave non creata" -#: main/main.c:337 +#: libpq/be-secure-openssl.c:1244 +msgid "no SSL error reported" +msgstr "nessun errore SSL riportato" + +#: libpq/be-secure-openssl.c:1248 #, c-format -msgid " -F turn fsync off\n" -msgstr " -F disabilita fsync\n" +msgid "SSL error code %lu" +msgstr "codice di errore SSL: %lu" -#: main/main.c:338 +#: libpq/be-secure-openssl.c:1402 #, c-format -msgid " -h HOSTNAME host name or IP address to listen on\n" -msgstr " -h HOSTNAME nome host o indirizzo IP su cui ascoltare\n" +msgid "could not create BIO" +msgstr "non è stato possibile creare BIO" -#: main/main.c:339 +#: libpq/be-secure-openssl.c:1412 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i abilita le connessioni TCP/IP\n" +msgid "could not get NID for ASN1_OBJECT object" +msgstr "impossibile ottenere il NID per l'oggetto ASN1_OBJECT" -#: main/main.c:340 +#: libpq/be-secure-openssl.c:1420 #, c-format -msgid " -k DIRECTORY Unix-domain socket location\n" -msgstr " -k DIRECTORY posizione dei socket di dominio Unix\n" +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "impossibile convertire NID %d in una struttura ASN1_OBJECT" -#: main/main.c:342 +#: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format -msgid " -l enable SSL connections\n" -msgstr " -l abilita la connessione SSL\n" +msgid "terminating connection due to unexpected postmaster exit" +msgstr "la connessione è stata terminata a causa di un'uscita inattesa di postmaster" -#: main/main.c:344 +#: libpq/crypt.c:49 #, c-format -msgid " -N MAX-CONNECT maximum number of allowed connections\n" -msgstr " -N MAX-CONNECT numero massimo di connessioni consentite\n" +msgid "Role \"%s\" does not exist." +msgstr "Il ruolo \"%s\" non esiste." -#: main/main.c:345 +#: libpq/crypt.c:59 #, c-format -msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr " -o OPZIONI passa \"OPZIONI\" ad ogni processo server (obsoleto)\n" +msgid "User \"%s\" has no password assigned." +msgstr "L'utente \"%s\" non ha una password assegnata." -#: main/main.c:346 +#: libpq/crypt.c:77 #, c-format -msgid " -p PORT port number to listen on\n" -msgstr " -p PORT numero di porta sul quale ascoltare\n" +msgid "User \"%s\" has an expired password." +msgstr "L'utente \"%s\" ha la password scaduta." -#: main/main.c:347 +#: libpq/crypt.c:181 #, c-format -msgid " -s show statistics after each query\n" -msgstr " -s mostra le statistiche dopo ogni query\n" +msgid "User \"%s\" has a password that cannot be used with MD5 authentication." +msgstr "L'utente \"%s\" ha una password che non può essere usata con l'autenticazione MD5." -#: main/main.c:348 +#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 #, c-format -msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" -msgstr "" -" -S WORK-MEM imposta la dimensione della memoria per gli ordinamenti\n" -" (in kB)\n" +msgid "Password does not match for user \"%s\"." +msgstr "Le password non combaciano per l'utente \"%s\"." -#: main/main.c:349 +#: libpq/crypt.c:283 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version mostra informazioni sulla versione ed esci\n" +msgid "Password of user \"%s\" is in unrecognized format." +msgstr "La password dell'utente \"%s\" è in un formato non riconosciuto." -#: main/main.c:350 +#: libpq/hba.c:209 #, c-format -msgid " --NAME=VALUE set run-time parameter\n" -msgstr " --NOME=VALORE imposta un parametro di esecuzione\n" +msgid "authentication file token too long, skipping: \"%s\"" +msgstr "token del file di autenticazione troppo lungo, saltato: \"%s\"" -#: main/main.c:351 +#: libpq/hba.c:381 #, c-format -msgid " --describe-config describe configuration parameters, then exit\n" -msgstr " --describe-config descrivi i parametri di configurazione ed esci\n" +msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" +msgstr "apertura del file secondario di autenticazione \"@%s\" come \"%s\" fallita: %m" -#: main/main.c:352 +#: libpq/hba.c:832 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra questo aiuto ed esci\n" +msgid "error enumerating network interfaces: %m" +msgstr "errore nell'enumerazione delle interfacce di rete: %m" -#: main/main.c:354 +#. translator: the second %s is a list of auth methods +#: libpq/hba.c:859 #, c-format -msgid "" -"\n" -"Developer options:\n" -msgstr "" -"\n" -"Opzioni per gli sviluppatori:\n" +msgid "authentication option \"%s\" is only valid for authentication methods %s" +msgstr "l'opzione di autenticazione \"%s\" è valida solo per i metodi di autenticazione %s" -#: main/main.c:355 +#: 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 " -f s|i|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h vieta l'uso di alcuni tipi di piani\n" +msgid "line %d of configuration file \"%s\"" +msgstr "riga %d del file di configurazione \"%s\"" -#: main/main.c:356 +#: libpq/hba.c:879 #, c-format -msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr "" -" -n non reinizializzare la memoria condivisa dopo un'uscita\n" -" anormale\n" +msgid "authentication method \"%s\" requires argument \"%s\" to be set" +msgstr "il metodo di autenticazione \"%s\" richiede che l'argomenti \"%s\" sia impostato" -#: main/main.c:357 +#: libpq/hba.c:903 #, c-format -msgid " -O allow system table structure changes\n" -msgstr "" -" -O consenti cambiamenti alla struttura delle tabelle\n" -" di sistema\n" +msgid "missing entry in file \"%s\" at end of line %d" +msgstr "voce mancante nel file \"%s\" alla fine della riga %d" -#: main/main.c:358 +#: libpq/hba.c:915 #, c-format -msgid " -P disable system indexes\n" -msgstr " -P disabilita gli indici di sistema\n" +msgid "multiple values in ident field" +msgstr "più di un valore nel campo ident" -#: main/main.c:359 +#: libpq/hba.c:965 #, c-format -msgid " -t pa|pl|ex show timings after each query\n" -msgstr " -t pa|pl|ex mostra i tempi impiegati dopo ogni query\n" +msgid "multiple values specified for connection type" +msgstr "più di un valore specificato per il tipo di connessione" -#: main/main.c:360 +#: libpq/hba.c:966 #, c-format -msgid " -T send SIGSTOP to all backend processes if one dies\n" -msgstr " -T invia SIGSTOP a tutti i processi backend se uno muore\n" +msgid "Specify exactly one connection type per line." +msgstr "Specifica esattamente un tipo di connessione per riga." -#: main/main.c:361 +#: libpq/hba.c:980 #, c-format -msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" -msgstr "" -" -W NUM attendi NUM secondi per consentire ad un debugger\n" -" di collegarsi\n" +msgid "local connections are not supported by this build" +msgstr "le connessioni locali non sono supportate in questo binario" -#: main/main.c:363 +#: libpq/hba.c:1003 #, c-format -msgid "" -"\n" -"Options for single-user mode:\n" -msgstr "" -"\n" -"Opzione per la modalità a utente singolo:\n" +msgid "hostssl record cannot match because SSL is disabled" +msgstr "il record hostssl non può combaciare perché SSL è disabilitato" -#: main/main.c:364 +#: libpq/hba.c:1004 #, c-format -msgid " --single selects single-user mode (must be first argument)\n" -msgstr "" -" --single imposta la modalità utente singolo (deve essere il primo\n" -" argomento)\n" +msgid "Set ssl = on in postgresql.conf." +msgstr "Imposta ssl = on in postgresql.conf." -#: main/main.c:365 +#: libpq/hba.c:1012 #, c-format -msgid " DBNAME database name (defaults to user name)\n" -msgstr " DBNAME nome del database (il predefinito è il nome dell'utente)\n" +msgid "hostssl record cannot match because SSL is not supported by this build" +msgstr "il record hostssl non può combaciare perché SSL non è supportato da questo build" -#: main/main.c:366 +#: libpq/hba.c:1024 #, c-format -msgid " -d 0-5 override debugging level\n" -msgstr " -d 0-5 scavalca il livello di debugging\n" +msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" +msgstr "il record hostgssenc non può corrispondere perché GSSAPI non è supportato da questa build" -#: main/main.c:367 +#: libpq/hba.c:1044 #, c-format -msgid " -E echo statement before execution\n" -msgstr " -E stampa le istruzioni prima dell'esecuzione\n" +msgid "invalid connection type \"%s\"" +msgstr "tipo di connessione \"%s\" non valido" -#: main/main.c:368 +#: libpq/hba.c:1058 #, c-format -msgid " -j do not use newline as interactive query delimiter\n" -msgstr "" -" -j non usare \"a capo\" come delimitatore delle query\n" -" interattivo\n" +msgid "end-of-line before database specification" +msgstr "fine riga prima della specificazione del database" -#: main/main.c:369 main/main.c:374 +#: libpq/hba.c:1078 #, c-format -msgid " -r FILENAME send stdout and stderr to given file\n" -msgstr " -r NOMEFILE invia stdout e stderr al file in argomento\n" +msgid "end-of-line before role specification" +msgstr "fine riga prima della specificazione del ruolo" -#: main/main.c:371 +#: libpq/hba.c:1100 #, c-format -msgid "" -"\n" -"Options for bootstrapping mode:\n" -msgstr "" -"\n" -"Opzioni per la modalità di inizializzazione:\n" +msgid "end-of-line before IP address specification" +msgstr "fine riga prima della specificazione dell'indirizzo IP" -#: main/main.c:372 +#: libpq/hba.c:1111 #, c-format -msgid " --boot selects bootstrapping mode (must be first argument)\n" -msgstr "" -" --boot seleziona la modalità di inizializzazione (dev'essere\n" -" il primo argomento)\n" +msgid "multiple values specified for host address" +msgstr "più di un valore specificato per l'indirizzo host" -#: main/main.c:373 +#: libpq/hba.c:1112 #, c-format -msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" -msgstr "" -" DBNAME nome del database (obbligatorio in modalità di\n" -" inizializzazione)\n" +msgid "Specify one address range per line." +msgstr "Specifica un intervallo di indirizzi per riga." -#: main/main.c:375 +#: libpq/hba.c:1170 #, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM uso interno\n" +msgid "invalid IP address \"%s\": %s" +msgstr "indirizzo IP non valido \"%s\": %s" -#: main/main.c:377 +#: libpq/hba.c:1190 #, c-format -msgid "" -"\n" -"Please read the documentation for the complete list of run-time\n" -"configuration settings and how to set them on the command line or in\n" -"the configuration file.\n" -"\n" -"Report bugs to .\n" -msgstr "" -"\n" -"Si prega di leggere la documentazione per la lista completa di impostazioni\n" -"di configurazione e su come impostarle sulla riga di comando o nel file di\n" -"configurazione\n" -"\n" -"Puoi segnalare eventuali bug a .\n" +msgid "specifying both host name and CIDR mask is invalid: \"%s\"" +msgstr "specificare sia un nome host che una maschera CIDR non è consentito: \"%s\"" -#: main/main.c:391 +#: libpq/hba.c:1204 #, 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" -"possible system security compromise. See the documentation for\n" -"more information on how to properly start the server.\n" -msgstr "" -"Non è consentito eseguire il server PostgreSQL come \"root\".\n" -"Il server deve essere avviato con un ID utente non privilegiato per\n" -"prevenire possibili problemi di sicurezza. Consulta la documentazione\n" -"per avere maggiori informazioni su come avviare il server correttamente.\n" +msgid "invalid CIDR mask in address \"%s\"" +msgstr "maschera CIDR non valida nell'indirizzo \"%s\"" -#: main/main.c:408 +#: libpq/hba.c:1224 #, c-format -msgid "%s: real and effective user IDs must match\n" -msgstr "%s: utente gli ID reale e quello effettivo devono coincidere\n" +msgid "end-of-line before netmask specification" +msgstr "fine riga prima della specificazione della maschera di rete" -#: main/main.c:415 +#: libpq/hba.c:1225 #, c-format -msgid "" -"Execution of PostgreSQL by a user with administrative permissions is not\n" -"permitted.\n" -"The server must be started under an unprivileged user ID to prevent\n" -"possible system security compromises. See the documentation for\n" -"more information on how to properly start the server.\n" -msgstr "" -"Non è consentito eseguire il server PostgreSQL con un utente con permessi\n" -"amministrativi.\n" -"Il server deve essere avviato con un ID utente non privilegiato per\n" -"prevenire possibili problemi di sicurezza. Consulta la documentazione\n" -"per avere maggiori informazioni su come avviare il server correttamente.\n" +msgid "Specify an address range in CIDR notation, or provide a separate netmask." +msgstr "Specifica un intervallo di indirizzi in notazione CIDR, oppure fornisci una maschera di rete separata." -#: nodes/extensible.c:66 +#: libpq/hba.c:1236 #, c-format -msgid "extensible node type \"%s\" already exists" -msgstr "il tipo di nodo estendibile \"%s\" esiste già" +msgid "multiple values specified for netmask" +msgstr "più di un valore specificato per la maschera di rete" -#: nodes/extensible.c:114 +#: libpq/hba.c:1250 #, c-format -msgid "ExtensibleNodeMethods \"%s\" was not registered" -msgstr "ExtensibleNodeMethods \"%s\" non è stato registrato" +msgid "invalid IP mask \"%s\": %s" +msgstr "maschera IP non valida \"%s\": %s" -#: nodes/nodeFuncs.c:123 nodes/nodeFuncs.c:154 parser/parse_coerce.c:1910 -#: parser/parse_coerce.c:1938 parser/parse_coerce.c:2014 -#: parser/parse_expr.c:2119 parser/parse_func.c:695 parser/parse_oper.c:967 +#: libpq/hba.c:1270 #, c-format -msgid "could not find array type for data type %s" -msgstr "non è stato possibile trovare il tipo di array per il tipo di dati %s" +msgid "IP address and mask do not match" +msgstr "L'indirizzo IP e la maschera non combaciano" -#: optimizer/path/joinrels.c:837 +#: libpq/hba.c:1286 #, c-format -msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" -msgstr "FULL JOIN è supportato solo con condizioni di join realizzabili con merge o hash" +msgid "end-of-line before authentication method" +msgstr "fine riga prima del metodo di autenticazione" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1221 +#: libpq/hba.c:1297 #, c-format -msgid "%s cannot be applied to the nullable side of an outer join" -msgstr "%s non può essere applicato sul lato che può essere nullo di un join esterno" +msgid "multiple values specified for authentication type" +msgstr "più di un valore specificato per il tipo di autenticazione" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1767 parser/analyze.c:1651 parser/analyze.c:1848 -#: parser/analyze.c:2679 +#: libpq/hba.c:1298 #, c-format -msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" -msgstr "%s non è consentito con UNION/INTERSECT/EXCEPT" +msgid "Specify exactly one authentication type per line." +msgstr "Specifica esattamente un tipo di autenticazione per riga." -#: optimizer/plan/planner.c:2339 optimizer/plan/planner.c:4060 +#: libpq/hba.c:1375 #, c-format -msgid "could not implement GROUP BY" -msgstr "non è stato possibile implementare GROUP BY" +msgid "invalid authentication method \"%s\"" +msgstr "metodo di autenticazione \"%s\" non valido" -#: optimizer/plan/planner.c:2340 optimizer/plan/planner.c:4061 -#: optimizer/plan/planner.c:4804 optimizer/prep/prepunion.c:1080 +#: libpq/hba.c:1388 #, c-format -msgid "Some of the datatypes only support hashing, while others only support sorting." -msgstr "Alcuni dei tipi di dati supportano solo l'hashing, mentre altri supportano solo l'ordinamento." +msgid "invalid authentication method \"%s\": not supported by this build" +msgstr "metodo di autenticazione \"%s\" non valido: non supportato in questo binario" -#: optimizer/plan/planner.c:4803 +#: libpq/hba.c:1411 #, c-format -msgid "could not implement DISTINCT" -msgstr "non è stato possibile implementare DISTINCT" +msgid "gssapi authentication is not supported on local sockets" +msgstr "l'autenticazione gssapi non è supportata su socket locali" -#: optimizer/plan/planner.c:5486 +#: libpq/hba.c:1423 #, c-format -msgid "could not implement window PARTITION BY" -msgstr "non è stato possibile implementare PARTITION BY della finestra" +msgid "peer authentication is only supported on local sockets" +msgstr "l'autenticazione peer è supportata solo su socket locali" -#: optimizer/plan/planner.c:5487 +#: libpq/hba.c:1441 #, c-format -msgid "Window partitioning columns must be of sortable datatypes." -msgstr "La colonna di partizionamento della finestra dev'essere un tipo di dato ordinabile." +msgid "cert authentication is only supported on hostssl connections" +msgstr "l'autenticazione cert è supportata solo su connessioni hostssl" -#: optimizer/plan/planner.c:5491 +#: libpq/hba.c:1491 #, c-format -msgid "could not implement window ORDER BY" -msgstr "non è stato possibile implementare ORDER BY della finestra" +msgid "authentication option not in name=value format: %s" +msgstr "opzione di autenticazione non in formato nome=valore: %s" -#: optimizer/plan/planner.c:5492 +#: libpq/hba.c:1535 #, c-format -msgid "Window ordering columns must be of sortable datatypes." -msgstr "La colonna di ordinamento della finestra dev'essere un tipo di dato ordinabile." +msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" +msgstr "non è possibile usare ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter o ldapurl insieme a ldapprefix" -#: optimizer/plan/setrefs.c:414 +#: libpq/hba.c:1546 #, c-format -msgid "too many range table entries" -msgstr "troppi intervalli di tabella" +msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" +msgstr "il metodo di autenticazione \"ldap\" richiede che gli argomenti \"ldapbasedn\", \"ldapprefix\" o \"ldapsuffix\" siano impostati" -#: optimizer/prep/prepunion.c:544 +#: libpq/hba.c:1562 #, c-format -msgid "could not implement recursive UNION" -msgstr "non è stato possibile implementare la UNION ricorsiva" +msgid "cannot use ldapsearchattribute together with ldapsearchfilter" +msgstr "non è possibile usare ldapsearchattribute insieme a ldapsearchfilter" -#: optimizer/prep/prepunion.c:545 +#: libpq/hba.c:1579 #, c-format -msgid "All column datatypes must be hashable." -msgstr "Tutti i tipi di dati devono supportare l'hash." +msgid "list of RADIUS servers cannot be empty" +msgstr "la lista di server RADIUS non può essere vuota" -#. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1079 +#: libpq/hba.c:1590 #, c-format -msgid "could not implement %s" -msgstr "non è stato possibile implementare %s" +msgid "list of RADIUS secrets cannot be empty" +msgstr "la lista di segreti RADIUS non può essere vuota" -#: optimizer/util/clauses.c:4854 +#: libpq/hba.c:1607 #, c-format -msgid "SQL function \"%s\" during inlining" -msgstr "funzione SQL \"%s\" durante l'inlining" +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "il numero di segreti RADIUS (%d) deve essere 1 o uguale al numero di server RADIUS (%d)" -#: optimizer/util/plancat.c:127 +#: libpq/hba.c:1623 #, c-format -msgid "cannot access temporary or unlogged relations during recovery" -msgstr "non è possibile accedere a relazioni temporanee o non loggate durante il ripristino" +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "il numero di porte RADIUS (%d) deve essere 1 o uguale al numero di server RADIUS (%d)" -#: optimizer/util/plancat.c:651 +#: libpq/hba.c:1639 #, c-format -msgid "whole row unique index inference specifications are not supported" -msgstr "le specifiche di inferenza di indici unici per l'intera riga non sono supportate" +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "il numero di identificatori RADIUS (%d) deve essere 1 o uguale al numero di server RADIUS (%d)" -#: optimizer/util/plancat.c:668 -#, c-format -msgid "constraint in ON CONFLICT clause has no associated index" -msgstr "il vincolo nella clausola ON CONFLICT non ha indici associati" +#: libpq/hba.c:1690 +msgid "ident, peer, gssapi, sspi, and cert" +msgstr "ident, peer, gssapi, sspi e cert" -#: optimizer/util/plancat.c:719 +#: libpq/hba.c:1699 #, c-format -msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" -msgstr "ON CONFLICT DO UPDATE non supportato con vincoli di esclusione" +msgid "clientcert can only be configured for \"hostssl\" rows" +msgstr "il clientcert può essere configurato solo per le righe \"hostssl\"" -#: optimizer/util/plancat.c:824 +#: libpq/hba.c:1716 #, c-format -msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" -msgstr "non c'è alcun vincolo di unicità o esclusione che combaci con la specifica ON CONFLICT" +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "clientcert accetta solo \"verify-full\" quando si utilizza l'autenticazione \"cert\"" -#: parser/analyze.c:709 parser/analyze.c:1414 +#: libpq/hba.c:1729 #, c-format -msgid "VALUES lists must all be the same length" -msgstr "le liste VALUES devono essere tutte della stessa lunghezza" +msgid "invalid value for clientcert: \"%s\"" +msgstr "valore non valido per clientcert: \"%s\"" -#: parser/analyze.c:919 +#: libpq/hba.c:1741 #, c-format -msgid "INSERT has more expressions than target columns" -msgstr "INSERT ha più espressioni che colonne di destinazione" +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname può essere configurato solo per le righe \"hostssl\"" -#: parser/analyze.c:937 +#: libpq/hba.c:1760 #, c-format -msgid "INSERT has more target columns than expressions" -msgstr "INSERT ha più colonne di destinazione che espressioni" +msgid "invalid value for clientname: \"%s\"" +msgstr "valore non valido per nome cliente: \"%s\"" -#: parser/analyze.c:941 +#: libpq/hba.c:1793 #, 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 "L'origine dell'inserimento è un'espressione riga con lo stesso numero di colonne attese da INSERT. Forse hai usato accidentalmente parentesi in eccesso?" +msgid "could not parse LDAP URL \"%s\": %s" +msgstr "impossibile interpretare la URL LDAP \"%s\": %s" -#: parser/analyze.c:1227 parser/analyze.c:1624 +#: libpq/hba.c:1804 #, c-format -msgid "SELECT ... INTO is not allowed here" -msgstr "SELECT ... INTO non è permesso qui" +msgid "unsupported LDAP URL scheme: %s" +msgstr "schema di URL LDAP non supportato: %s" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1556 parser/analyze.c:2858 +#: libpq/hba.c:1828 #, c-format -msgid "%s cannot be applied to VALUES" -msgstr "%s non è consentito con VALUES" +msgid "LDAP URLs not supported on this platform" +msgstr "URL LDAP non supportate su questa piattaforma" -#: parser/analyze.c:1775 +#: libpq/hba.c:1846 #, c-format -msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" -msgstr "clausola UNION/INTERSECT/EXCEPT ORDER BY non valida" +msgid "invalid ldapscheme value: \"%s\"" +msgstr "valore ldapscheme non valido: \"%s\"" -#: parser/analyze.c:1776 +#: libpq/hba.c:1864 #, c-format -msgid "Only result column names can be used, not expressions or functions." -msgstr "Possono essere usati solo nomi di colonne risultanti, non espressioni o funzioni." +msgid "invalid LDAP port number: \"%s\"" +msgstr "numero di porta LDAP non valido: \"%s\"" -#: parser/analyze.c:1777 -#, c-format -msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." -msgstr "Aggiungi l'espressione/funzione ad ogni SELECT, oppure sposta la UNION in una clausola FROM." +#: libpq/hba.c:1910 libpq/hba.c:1917 +msgid "gssapi and sspi" +msgstr "gssapi e sspi" -#: parser/analyze.c:1838 -#, c-format -msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" -msgstr "INTO è permesso solo nella prima SELECT di UNION/INTERSECT/EXCEPT" +#: libpq/hba.c:1926 libpq/hba.c:1935 +msgid "sspi" +msgstr "sspi" -#: parser/analyze.c:1910 +#: libpq/hba.c:1957 #, c-format -msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" -msgstr "l'istruzione membro di UNION/INTERSECT/EXCEPT non può riferirsi al altre relazione allo stesso livello della query" +msgid "could not parse RADIUS server list \"%s\"" +msgstr "errore nell'interpretazione della lista di server RADIUS \"%s\"" -#: parser/analyze.c:1999 +#: libpq/hba.c:2005 #, c-format -msgid "each %s query must have the same number of columns" -msgstr "ogni query in %s deve avere lo stesso numero di colonne" +msgid "could not parse RADIUS port list \"%s\"" +msgstr "errore nell'interpretazione della lista di porte RADIUS \"%s\"" -#: parser/analyze.c:2392 +#: libpq/hba.c:2019 #, c-format -msgid "RETURNING must have at least one column" -msgstr "RETURNING deve avere almeno una colonna" +msgid "invalid RADIUS port number: \"%s\"" +msgstr "numero di porta RADIUS non valido: \"%s\"" -#: parser/analyze.c:2433 +#: libpq/hba.c:2041 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "non è possibile specificare sia SCROLL che NO SCROLL" +msgid "could not parse RADIUS secret list \"%s\"" +msgstr "errore nell'interpretazione della lista di segreti RADIUS \"%s\"" -#: parser/analyze.c:2452 +#: libpq/hba.c:2063 #, c-format -msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" -msgstr "DECLARE CURSOR non può contenere istruzioni di modifica dei dati nel WITH" +msgid "could not parse RADIUS identifiers list \"%s\"" +msgstr "errore nell'interpretazione della lista di identificatori RADIUS \"%s\"" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2460 +#: libpq/hba.c:2077 #, c-format -msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" -msgstr "DECLARE CURSOR WITH HOLD ... %s non è supportato" +msgid "unrecognized authentication option name: \"%s\"" +msgstr "nome di opzione di autenticazione sconosciuto: \"%s\"" -#: parser/analyze.c:2463 +#: libpq/hba.c:2274 #, c-format -msgid "Holdable cursors must be READ ONLY." -msgstr "I cursori trattenibili devono essere READ ONLY." +msgid "configuration file \"%s\" contains no entries" +msgstr "il file di configurazione \"%s\" non contiene alcuna voce" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2471 +#: libpq/hba.c:2374 #, c-format -msgid "DECLARE SCROLL CURSOR ... %s is not supported" -msgstr "DECLARE SCROLL CURSOR ... %s non è supportato" +msgid "invalid regular expression \"%s\": %s" +msgstr "espressione regolare non valida \"%s\": %s" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2482 +#: libpq/hba.c:2437 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s non è supportato" +msgid "regular expression match for \"%s\" failed: %s" +msgstr "corrispondenza dell'espressione regolare \"%s\" fallita: %s" -#: parser/analyze.c:2485 +#: libpq/hba.c:2456 #, c-format -msgid "Insensitive cursors must be READ ONLY." -msgstr "I cursori Insensitive devono essere READ ONLY." +msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" +msgstr "l'espressione regolare \"%s\" non ha la sottoespressione richiesta dal riferimento in \"%s\"" -#: parser/analyze.c:2551 +#: libpq/hba.c:2552 #, c-format -msgid "materialized views must not use data-modifying statements in WITH" -msgstr "le viste materializzate non possono usare istruzioni di modifica dei dati nel WITH" +msgid "provided user name (%s) and authenticated user name (%s) do not match" +msgstr "il nome utente fornito (%s) e il nome utente autenticato (%s) non combaciano" -#: parser/analyze.c:2561 +#: libpq/hba.c:2572 #, c-format -msgid "materialized views must not use temporary tables or views" -msgstr "le viste materializzate non possono usare tabelle temporanee o viste" +msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" +msgstr "nessuna corrispondenza nella mappa utenti \"%s\" per l'utente \"%s\" autenticato come \"%s\"" -#: parser/analyze.c:2571 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format -msgid "materialized views may not be defined using bound parameters" -msgstr "le viste materializzate non possono essere definite con parametri impostati" +msgid "could not open usermap file \"%s\": %m" +msgstr "apertura del file usermap \"%s\" fallita: %m" -#: parser/analyze.c:2583 +#: libpq/pqcomm.c:204 #, c-format -msgid "materialized views cannot be UNLOGGED" -msgstr "le viste materializzate non possono essere UNLOGGED" +msgid "could not set socket to nonblocking mode: %m" +msgstr "impossibile impostare il socket in modalità non bloccante: %m" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2686 +#: libpq/pqcomm.c:362 #, c-format -msgid "%s is not allowed with DISTINCT clause" -msgstr "%s non è consentito con la clausola DISTINCT" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "Il percorso del socket di dominio unix \"%s\" è troppo lungo (massimo %d byte)" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2693 +#: libpq/pqcomm.c:383 #, c-format -msgid "%s is not allowed with GROUP BY clause" -msgstr "%s non è consentito con la clausola GROUP BY" +msgid "could not translate host name \"%s\", service \"%s\" to address: %s" +msgstr "conversione del nome host \"%s\", servizio \"%s\" in indirizzo fallita: %s" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2700 +#: libpq/pqcomm.c:387 #, c-format -msgid "%s is not allowed with HAVING clause" -msgstr "%s non è consentito con la clausola HAVING" +msgid "could not translate service \"%s\" to address: %s" +msgstr "conversione del servizio \"%s\" in indirizzo fallita: %s" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2707 +#: libpq/pqcomm.c:414 #, c-format -msgid "%s is not allowed with aggregate functions" -msgstr "%s non è consentito con funzioni di aggregazione" +msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" +msgstr "bind a tutti gli indirizzi richiesti fallito: MAXLISTEN (%d) superato" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2714 -#, c-format -msgid "%s is not allowed with window functions" -msgstr "%s non è consentito con funzioni finestra" +#: libpq/pqcomm.c:423 +msgid "IPv4" +msgstr "IPv4" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2721 -#, c-format -msgid "%s is not allowed with set-returning functions in the target list" -msgstr "%s non è consentito con la le funzioni che restituiscono insiemi nella lista di destinazione" +#: libpq/pqcomm.c:427 +msgid "IPv6" +msgstr "IPv6" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2800 -#, c-format -msgid "%s must specify unqualified relation names" -msgstr "%s deve specificare nomi di tabelle non qualificati" +#: libpq/pqcomm.c:432 +msgid "Unix" +msgstr "Unix" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2831 +#: libpq/pqcomm.c:437 #, c-format -msgid "%s cannot be applied to a join" -msgstr "%s non può essere applicato ad un join" +msgid "unrecognized address family %d" +msgstr "famiglia di indirizzi %d sconosciuto" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2840 +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:463 #, c-format -msgid "%s cannot be applied to a function" -msgstr "%s non può essere applicato ad una funzione" +msgid "could not create %s socket for address \"%s\": %m" +msgstr "creazione del socket %s per l'indirizzo \"%s\" fallita: %m" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2849 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format -msgid "%s cannot be applied to a table function" -msgstr "%s non può essere applicato ad una funzione tabella" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s) non riuscito per %s indirizzo \"%s\": %m" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:530 #, c-format -msgid "%s cannot be applied to a WITH query" -msgstr "%s non può essere applicato ad una query WITH" +msgid "could not bind %s address \"%s\": %m" +msgstr "bind dell'indirizzo %s \"%s\" fallito: %m" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2876 +#: libpq/pqcomm.c:534 #, c-format -msgid "%s cannot be applied to a named tuplestore" -msgstr "%s non può essere applicato a un tuplestore con nome" +msgid "Is another postmaster already running on port %d?" +msgstr "Un altro postmaster è già in esecuzione sulla porta %d?" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2893 +#: libpq/pqcomm.c:536 #, c-format -msgid "relation \"%s\" in %s clause not found in FROM clause" -msgstr "la relazione \"%s\" nella clausola %s non è stata trovata nella clausola FROM" +msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." +msgstr "C'è già un altro postmaster in funzione sulla porta %d? Se non c'è, aspetta alcuni secondi e riprova." -#: parser/parse_agg.c:221 parser/parse_oper.c:222 +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:569 #, c-format -msgid "could not identify an ordering operator for type %s" -msgstr "non è stato possibile identificare un operatore di ordinamento per il tipo %s" +msgid "could not listen on %s address \"%s\": %m" +msgstr "listen sull'indirizzo %s \"%s\" fallito: %m" -#: parser/parse_agg.c:223 +#: libpq/pqcomm.c:578 +#, c-format +msgid "listening on Unix socket \"%s\"" +msgstr "in ascolto sul socket Unix \"%s\"" + +#. translator: first %s is IPv4 or IPv6 +#: libpq/pqcomm.c:584 +#, c-format +msgid "listening on %s address \"%s\", port %d" +msgstr "in ascolto sull'indirizzo %s \"%s\", porta %d" + +#: libpq/pqcomm.c:675 +#, c-format +msgid "group \"%s\" does not exist" +msgstr "il gruppo \"%s\" non esiste" + +#: libpq/pqcomm.c:685 +#, c-format +msgid "could not set group of file \"%s\": %m" +msgstr "impostazione del gruppo del file \"%s\" fallita: %m" + +#: libpq/pqcomm.c:696 +#, c-format +msgid "could not set permissions of file \"%s\": %m" +msgstr "impostazione dei permessi del file \"%s\" fallita: %m" + +#: libpq/pqcomm.c:726 +#, c-format +msgid "could not accept new connection: %m" +msgstr "impossibile accettare la nuova connessione: %m" + +#: 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) non riuscito: %m" + +#: libpq/pqcomm.c:921 +#, c-format +msgid "there is no client connection" +msgstr "c'è alcuna connessione client" + +#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#, c-format +msgid "could not receive data from client: %m" +msgstr "ricezione dati dal client fallita: %m" + +#: libpq/pqcomm.c:1173 tcop/postgres.c:4359 +#, c-format +msgid "terminating connection because protocol synchronization was lost" +msgstr "la connessione verrà terminata perché la sincronizzazione del protocollo è stata persa" + +#: libpq/pqcomm.c:1239 +#, c-format +msgid "unexpected EOF within message length word" +msgstr "fine file inattesa nella word della lunghezza del messaggio" + +#: libpq/pqcomm.c:1249 +#, c-format +msgid "invalid message length" +msgstr "lunghezza del messaggio non valida" + +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#, c-format +msgid "incomplete message from client" +msgstr "messaggio incompleto dal client" + +#: libpq/pqcomm.c:1395 +#, c-format +msgid "could not send data to client: %m" +msgstr "invio dati al client fallito: %m" + +#: libpq/pqcomm.c:1610 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) non riuscito: codice di errore %d" + +#: libpq/pqcomm.c:1699 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "l'impostazione del tempo di inattività keep-alive non è supportata" + +#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) non è supportato" + +#: libpq/pqformat.c:406 +#, c-format +msgid "no data left in message" +msgstr "nessun dato rimasto nel messaggio" + +#: 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 "i dati rimasti nel messaggio non sono sufficienti" + +#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#, c-format +msgid "invalid string in message" +msgstr "stringa non valida nel messaggio" + +#: libpq/pqformat.c:642 +#, c-format +msgid "invalid message format" +msgstr "formato del messaggio non valido" + +#: main/main.c:239 +#, c-format +msgid "%s: WSAStartup failed: %d\n" +msgstr "%s: WSAStartup fallita: %d\n" + +#: main/main.c:350 +#, c-format +msgid "" +"%s is the PostgreSQL server.\n" +"\n" +msgstr "" +"%s è il server PostgreSQL.\n" +"\n" + +#: main/main.c:351 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"Utilizzo:\n" +" %s [OPZIONE]...\n" +"\n" + +#: main/main.c:352 +#, c-format +msgid "Options:\n" +msgstr "Opzioni:\n" + +#: main/main.c:353 +#, c-format +msgid " -B NBUFFERS number of shared buffers\n" +msgstr " -B NBUFFERS numero di buffer condivisi\n" + +#: main/main.c:354 +#, c-format +msgid " -c NAME=VALUE set run-time parameter\n" +msgstr " -c NOME=VALORE imposta un parametro di esecuzione\n" + +#: main/main.c:355 +#, c-format +msgid " -C NAME print value of run-time parameter, then exit\n" +msgstr " -C NAME stampa il valore del parametro di esecuzione ed esci\n" + +#: main/main.c:356 +#, c-format +msgid " -d 1-5 debugging level\n" +msgstr " -d 1-5 livello di debugging\n" + +#: main/main.c:357 +#, c-format +msgid " -D DATADIR database directory\n" +msgstr " -D DATADIR directory del database\n" + +#: main/main.c:358 +#, c-format +msgid " -e use European date input format (DMY)\n" +msgstr " -e usa il formato date europeo (GMA)\n" + +#: main/main.c:359 +#, c-format +msgid " -F turn fsync off\n" +msgstr " -F disabilita fsync\n" + +#: main/main.c:360 +#, c-format +msgid " -h HOSTNAME host name or IP address to listen on\n" +msgstr " -h HOSTNAME nome host o indirizzo IP su cui ascoltare\n" + +#: main/main.c:361 +#, c-format +msgid " -i enable TCP/IP connections\n" +msgstr " -i abilita le connessioni TCP/IP\n" + +#: main/main.c:362 +#, c-format +msgid " -k DIRECTORY Unix-domain socket location\n" +msgstr " -k DIRECTORY posizione dei socket di dominio Unix\n" + +#: main/main.c:364 +#, c-format +msgid " -l enable SSL connections\n" +msgstr " -l abilita la connessione SSL\n" + +#: main/main.c:366 +#, c-format +msgid " -N MAX-CONNECT maximum number of allowed connections\n" +msgstr " -N MAX-CONNECT numero massimo di connessioni consentite\n" + +#: main/main.c:367 +#, c-format +msgid " -p PORT port number to listen on\n" +msgstr " -p PORT numero di porta sul quale ascoltare\n" + +#: main/main.c:368 +#, c-format +msgid " -s show statistics after each query\n" +msgstr " -s mostra le statistiche dopo ogni query\n" + +#: main/main.c:369 +#, c-format +msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" +msgstr "" +" -S WORK-MEM imposta la dimensione della memoria per gli ordinamenti\n" +" (in kB)\n" + +#: main/main.c:370 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informazioni sulla versione ed esci\n" + +#: main/main.c:371 +#, c-format +msgid " --NAME=VALUE set run-time parameter\n" +msgstr " --NOME=VALORE imposta un parametro di esecuzione\n" + +#: main/main.c:372 +#, c-format +msgid " --describe-config describe configuration parameters, then exit\n" +msgstr " --describe-config descrivi i parametri di configurazione ed esci\n" + +#: main/main.c:373 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" + +#: main/main.c:375 +#, c-format +msgid "" +"\n" +"Developer options:\n" +msgstr "" +"\n" +"Opzioni per gli sviluppatori:\n" + +#: main/main.c:376 +#, c-format +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h vieta l'uso di alcuni tipi di piani\n" + +#: main/main.c:377 +#, c-format +msgid " -n do not reinitialize shared memory after abnormal exit\n" +msgstr "" +" -n non reinizializzare la memoria condivisa dopo un'uscita\n" +" anormale\n" + +#: main/main.c:378 +#, c-format +msgid " -O allow system table structure changes\n" +msgstr "" +" -O consenti cambiamenti alla struttura delle tabelle\n" +" di sistema\n" + +#: main/main.c:379 +#, c-format +msgid " -P disable system indexes\n" +msgstr " -P disabilita gli indici di sistema\n" + +#: main/main.c:380 +#, c-format +msgid " -t pa|pl|ex show timings after each query\n" +msgstr " -t pa|pl|ex mostra i tempi impiegati dopo ogni query\n" + +#: main/main.c:381 +#, c-format +msgid " -T send SIGSTOP to all backend processes if one dies\n" +msgstr " -T invia SIGSTOP a tutti i processi backend se uno muore\n" + +#: main/main.c:382 +#, c-format +msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" +msgstr "" +" -W NUM attendi NUM secondi per consentire ad un debugger\n" +" di collegarsi\n" + +#: main/main.c:384 +#, c-format +msgid "" +"\n" +"Options for single-user mode:\n" +msgstr "" +"\n" +"Opzione per la modalità a utente singolo:\n" + +#: main/main.c:385 +#, c-format +msgid " --single selects single-user mode (must be first argument)\n" +msgstr "" +" --single imposta la modalità utente singolo (deve essere il primo\n" +" argomento)\n" + +#: main/main.c:386 +#, c-format +msgid " DBNAME database name (defaults to user name)\n" +msgstr " DBNAME nome del database (il predefinito è il nome dell'utente)\n" + +#: main/main.c:387 +#, c-format +msgid " -d 0-5 override debugging level\n" +msgstr " -d 0-5 scavalca il livello di debugging\n" + +#: main/main.c:388 +#, c-format +msgid " -E echo statement before execution\n" +msgstr " -E stampa le istruzioni prima dell'esecuzione\n" + +#: main/main.c:389 +#, c-format +msgid " -j do not use newline as interactive query delimiter\n" +msgstr "" +" -j non usare \"a capo\" come delimitatore delle query\n" +" interattivo\n" + +#: main/main.c:390 main/main.c:396 +#, c-format +msgid " -r FILENAME send stdout and stderr to given file\n" +msgstr " -r NOMEFILE invia stdout e stderr al file in argomento\n" + +#: main/main.c:392 +#, c-format +msgid "" +"\n" +"Options for bootstrapping mode:\n" +msgstr "" +"\n" +"Opzioni per la modalità di inizializzazione:\n" + +#: main/main.c:393 +#, c-format +msgid " --boot selects bootstrapping mode (must be first argument)\n" +msgstr "" +" --boot seleziona la modalità di inizializzazione (dev'essere\n" +" il primo argomento)\n" + +#: main/main.c:394 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check seleziona la modalità di verifica (deve essere il primo argomento)\n" + +#: main/main.c:395 +#, c-format +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr "" +" DBNAME nome del database (obbligatorio in modalità di\n" +" inizializzazione)\n" + +#: main/main.c:398 +#, c-format +msgid "" +"\n" +"Please read the documentation for the complete list of run-time\n" +"configuration settings and how to set them on the command line or in\n" +"the configuration file.\n" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Si prega di leggere la documentazione per l'elenco completo del runtime\n" +"impostazioni di configurazione e come impostarle sulla riga di comando o in\n" +"il file di configurazione.\n" +"\n" +"Segnala i bug a <%s>.\n" + +#: main/main.c:402 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Pagina iniziale di %s: <%s>\n" + +#: main/main.c:413 +#, 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" +"possible system security compromise. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" +"Non è consentito eseguire il server PostgreSQL come \"root\".\n" +"Il server deve essere avviato con un ID utente non privilegiato per\n" +"prevenire possibili problemi di sicurezza. Consulta la documentazione\n" +"per avere maggiori informazioni su come avviare il server correttamente.\n" + +#: main/main.c:430 +#, c-format +msgid "%s: real and effective user IDs must match\n" +msgstr "%s: utente gli ID reale e quello effettivo devono coincidere\n" + +#: main/main.c:437 +#, c-format +msgid "" +"Execution of PostgreSQL by a user with administrative permissions is not\n" +"permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromises. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" +"Non è consentito eseguire il server PostgreSQL con un utente con permessi\n" +"amministrativi.\n" +"Il server deve essere avviato con un ID utente non privilegiato per\n" +"prevenire possibili problemi di sicurezza. Consulta la documentazione\n" +"per avere maggiori informazioni su come avviare il server correttamente.\n" + +#: nodes/extensible.c:66 +#, c-format +msgid "extensible node type \"%s\" already exists" +msgstr "il tipo di nodo estendibile \"%s\" esiste già" + +#: nodes/extensible.c:114 +#, c-format +msgid "ExtensibleNodeMethods \"%s\" was not registered" +msgstr "ExtensibleNodeMethods \"%s\" non è stato registrato" + +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "la relazione \"%s\" non ha un tipo composto" + +#: 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:2023 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 "non è stato possibile trovare il tipo di array per il tipo di dati %s" + +#: nodes/params.c:417 +#, c-format +msgid "portal \"%s\" with parameters: %s" +msgstr "portale \"%s\" con parametri: %s" + +#: nodes/params.c:420 +#, c-format +msgid "unnamed portal with parameters: %s" +msgstr "portale senza nome con parametri: %s" + +#: optimizer/path/joinrels.c:855 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" +msgstr "FULL JOIN è supportato solo con condizioni di join realizzabili con merge o hash" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/initsplan.c:1192 +#, c-format +msgid "%s cannot be applied to the nullable side of an outer join" +msgstr "%s non può essere applicato sul lato che può essere nullo di un join esterno" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: 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 non è consentito con UNION/INTERSECT/EXCEPT" + +#: optimizer/plan/planner.c:2048 optimizer/plan/planner.c:3705 +#, c-format +msgid "could not implement GROUP BY" +msgstr "non è stato possibile implementare GROUP BY" + +#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3706 optimizer/plan/planner.c:4349 optimizer/prep/prepunion.c:1046 +#, c-format +msgid "Some of the datatypes only support hashing, while others only support sorting." +msgstr "Alcuni dei tipi di dati supportano solo l'hashing, mentre altri supportano solo l'ordinamento." + +#: optimizer/plan/planner.c:4348 +#, c-format +msgid "could not implement DISTINCT" +msgstr "non è stato possibile implementare DISTINCT" + +#: optimizer/plan/planner.c:5469 +#, c-format +msgid "could not implement window PARTITION BY" +msgstr "non è stato possibile implementare PARTITION BY della finestra" + +#: optimizer/plan/planner.c:5470 +#, c-format +msgid "Window partitioning columns must be of sortable datatypes." +msgstr "La colonna di partizionamento della finestra dev'essere un tipo di dato ordinabile." + +#: optimizer/plan/planner.c:5474 +#, c-format +msgid "could not implement window ORDER BY" +msgstr "non è stato possibile implementare ORDER BY della finestra" + +#: optimizer/plan/planner.c:5475 +#, c-format +msgid "Window ordering columns must be of sortable datatypes." +msgstr "La colonna di ordinamento della finestra dev'essere un tipo di dato ordinabile." + +#: optimizer/prep/prepunion.c:509 +#, c-format +msgid "could not implement recursive UNION" +msgstr "non è stato possibile implementare la UNION ricorsiva" + +#: optimizer/prep/prepunion.c:510 +#, c-format +msgid "All column datatypes must be hashable." +msgstr "Tutti i tipi di dati devono supportare l'hash." + +#. translator: %s is UNION, INTERSECT, or EXCEPT +#: optimizer/prep/prepunion.c:1045 +#, c-format +msgid "could not implement %s" +msgstr "non è stato possibile implementare %s" + +#: optimizer/util/clauses.c:4777 +#, c-format +msgid "SQL function \"%s\" during inlining" +msgstr "Funzione SQL \"%s\" durante l'inlining" + +#: optimizer/util/plancat.c:133 +#, c-format +msgid "cannot access temporary or unlogged relations during recovery" +msgstr "non è possibile accedere a relazioni temporanee o non loggate durante il ripristino" + +#: optimizer/util/plancat.c:673 +#, c-format +msgid "whole row unique index inference specifications are not supported" +msgstr "le specifiche di inferenza di indici unici per l'intera riga non sono supportate" + +#: optimizer/util/plancat.c:690 +#, c-format +msgid "constraint in ON CONFLICT clause has no associated index" +msgstr "il vincolo nella clausola ON CONFLICT non ha indici associati" + +#: optimizer/util/plancat.c:740 +#, c-format +msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" +msgstr "ON CONFLICT DO UPDATE non supportato con vincoli di esclusione" + +#: optimizer/util/plancat.c:845 +#, c-format +msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" +msgstr "non c'è alcun vincolo di unicità o esclusione che combaci con la specifica ON CONFLICT" + +#: parser/analyze.c:780 parser/analyze.c:1494 +#, c-format +msgid "VALUES lists must all be the same length" +msgstr "Le liste VALUES devono essere tutte della stessa lunghezza" + +#: parser/analyze.c:981 +#, c-format +msgid "INSERT has more expressions than target columns" +msgstr "INSERT ha più espressioni che colonne di destinazione" + +#: parser/analyze.c:999 +#, c-format +msgid "INSERT has more target columns than expressions" +msgstr "INSERT ha più colonne di destinazione che espressioni" + +#: 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 "L'origine dell'inserimento è un'espressione riga con lo stesso numero di colonne attese da INSERT. Forse hai usato accidentalmente parentesi in eccesso?" + +#: parser/analyze.c:1302 parser/analyze.c:1687 +#, c-format +msgid "SELECT ... INTO is not allowed here" +msgstr "SELECT ... INTO non è permesso qui" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:1617 parser/analyze.c:3363 +#, c-format +msgid "%s cannot be applied to VALUES" +msgstr "%s non è consentito con VALUES" + +#: parser/analyze.c:1853 +#, c-format +msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" +msgstr "clausola UNION/INTERSECT/EXCEPT ORDER BY non valida" + +#: parser/analyze.c:1854 +#, c-format +msgid "Only result column names can be used, not expressions or functions." +msgstr "Possono essere usati solo nomi di colonne risultanti, non espressioni o funzioni." + +#: parser/analyze.c:1855 +#, c-format +msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." +msgstr "Aggiungi l'espressione/funzione ad ogni SELECT, oppure sposta la UNION in una clausola FROM." + +#: parser/analyze.c:1960 +#, c-format +msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" +msgstr "INTO è permesso solo nella prima SELECT di UNION/INTERSECT/EXCEPT" + +#: parser/analyze.c:2032 +#, c-format +msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" +msgstr "l'istruzione membro di UNION/INTERSECT/EXCEPT non può riferirsi al altre relazione allo stesso livello della query" + +#: parser/analyze.c:2119 +#, c-format +msgid "each %s query must have the same number of columns" +msgstr "ogni query in %s deve avere lo stesso numero di colonne" + +#: parser/analyze.c:2523 +#, c-format +msgid "RETURNING must have at least one column" +msgstr "RETURNING deve avere almeno una colonna" + +#: parser/analyze.c:2626 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "l'origine dell'assegnazione ha restituito %d colonna" +msgstr[1] "l'origine dell'assegnazione ha restituito %d colonne" + +#: parser/analyze.c:2687 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "la variabile \"%s\" è di tipo %s ma l'espressione è di tipo %s" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2811 parser/analyze.c:2819 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "non è possibile specificare sia %s che %s" + +#: parser/analyze.c:2839 +#, c-format +msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" +msgstr "DECLARE CURSOR non può contenere istruzioni di modifica dei dati nel WITH" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2847 +#, c-format +msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" +msgstr "DECLARE CURSOR WITH HOLD ... %s non è supportato" + +#: parser/analyze.c:2850 +#, c-format +msgid "Holdable cursors must be READ ONLY." +msgstr "I cursori trattenibili devono essere READ ONLY." + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2858 +#, c-format +msgid "DECLARE SCROLL CURSOR ... %s is not supported" +msgstr "DECLARE SCROLL CURSOR ... %s non è supportato" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2869 +#, c-format +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DICHIARA CURSORE INSENSITIVO ... %s non è valido" + +#: parser/analyze.c:2872 +#, c-format +msgid "Insensitive cursors must be READ ONLY." +msgstr "I cursori Insensitive devono essere READ ONLY." + +#: parser/analyze.c:2938 +#, c-format +msgid "materialized views must not use data-modifying statements in WITH" +msgstr "le viste materializzate non possono usare istruzioni di modifica dei dati nel WITH" + +#: parser/analyze.c:2948 +#, c-format +msgid "materialized views must not use temporary tables or views" +msgstr "le viste materializzate non possono usare tabelle temporanee o viste" + +#: parser/analyze.c:2958 +#, c-format +msgid "materialized views may not be defined using bound parameters" +msgstr "le viste materializzate non possono essere definite con parametri impostati" + +#: parser/analyze.c:2970 +#, c-format +msgid "materialized views cannot be unlogged" +msgstr "le viste materializzate non possono essere annullate" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3159 +#, c-format +msgid "%s is not allowed with DISTINCT clause" +msgstr "%s non è consentito con la clausola DISTINCT" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3166 +#, c-format +msgid "%s is not allowed with GROUP BY clause" +msgstr "%s non è consentito con la clausola GROUP BY" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3173 +#, c-format +msgid "%s is not allowed with HAVING clause" +msgstr "%s non è consentito con la clausola HAVING" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3180 +#, c-format +msgid "%s is not allowed with aggregate functions" +msgstr "%s non è consentito con funzioni di aggregazione" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3187 +#, c-format +msgid "%s is not allowed with window functions" +msgstr "%s non è consentito con funzioni finestra" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3194 +#, c-format +msgid "%s is not allowed with set-returning functions in the target list" +msgstr "%s non è consentito con la le funzioni che restituiscono insiemi nella lista di destinazione" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3286 +#, c-format +msgid "%s must specify unqualified relation names" +msgstr "%s deve specificare nomi di tabelle non qualificati" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3336 +#, c-format +msgid "%s cannot be applied to a join" +msgstr "%s non può essere applicato ad un join" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3345 +#, c-format +msgid "%s cannot be applied to a function" +msgstr "%s non può essere applicato ad una funzione" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3354 +#, c-format +msgid "%s cannot be applied to a table function" +msgstr "%s non può essere applicato ad una funzione tabella" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3372 +#, c-format +msgid "%s cannot be applied to a WITH query" +msgstr "%s non può essere applicato ad una query WITH" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3381 +#, c-format +msgid "%s cannot be applied to a named tuplestore" +msgstr "%s non può essere applicato a un tuplestore con nome" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3401 +#, c-format +msgid "relation \"%s\" in %s clause not found in FROM clause" +msgstr "la relazione \"%s\" nella clausola %s non è stata trovata nella clausola FROM" + +#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#, c-format +msgid "could not identify an ordering operator for type %s" +msgstr "non è stato possibile identificare un operatore di ordinamento per il tipo %s" + +#: parser/parse_agg.c:222 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Gli aggregati con DISTINCT devono essere in grado di ordinare i loro input." -#: parser/parse_agg.c:258 +#: parser/parse_agg.c:257 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING deve avere meno di 32 argomenti" -#: parser/parse_agg.c:361 +#: parser/parse_agg.c:360 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "le funzioni di aggregazione non sono ammesse nelle condizioni di JOIN" -#: parser/parse_agg.c:363 +#: parser/parse_agg.c:362 msgid "grouping operations are not allowed in JOIN conditions" msgstr "le operazioni di raggruppamento non sono ammesse nelle condizioni di JOIN" -#: parser/parse_agg.c:375 +#: parser/parse_agg.c:374 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "le funzioni di aggregazione non sono ammesse nella clausola FROM del loro stesso livello della query" -#: parser/parse_agg.c:377 +#: parser/parse_agg.c:376 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "le operazioni di raggruppamento non sono ammesse nella clausola FROM del proprio livello di query" -#: parser/parse_agg.c:382 +#: parser/parse_agg.c:381 msgid "aggregate functions are not allowed in functions in FROM" msgstr "le funzioni di aggregazione non sono ammesse nelle funzioni in FROM" -#: parser/parse_agg.c:384 +#: parser/parse_agg.c:383 msgid "grouping operations are not allowed in functions in FROM" msgstr "le operazioni di raggruppamento non sono ammesse nelle funzioni in FROM" -#: parser/parse_agg.c:392 +#: parser/parse_agg.c:391 msgid "aggregate functions are not allowed in policy expressions" msgstr "le funzioni di aggregazione non sono ammesse nell'espressione di una regola di sicurezza" -#: parser/parse_agg.c:394 +#: parser/parse_agg.c:393 msgid "grouping operations are not allowed in policy expressions" msgstr "le funzioni di raggruppamento non sono ammesse nell'espressione di una regola di sicurezza" -#: parser/parse_agg.c:411 +#: parser/parse_agg.c:410 msgid "aggregate functions are not allowed in window RANGE" msgstr "le funzioni di aggregazione non sono ammesse nel RANGE della finestra" -#: parser/parse_agg.c:413 +#: parser/parse_agg.c:412 msgid "grouping operations are not allowed in window RANGE" msgstr "le operazioni di taggruppamento non sono ammesse nel RANGE della finestra" -#: parser/parse_agg.c:418 +#: parser/parse_agg.c:417 msgid "aggregate functions are not allowed in window ROWS" msgstr "le funzioni di aggregazione non sono ammesse nel ROWS della finestra" -#: parser/parse_agg.c:420 +#: parser/parse_agg.c:419 msgid "grouping operations are not allowed in window ROWS" msgstr "le operazioni di raggruppamento non sono ammesse nel ROWS della finestra" -#: parser/parse_agg.c:425 +#: parser/parse_agg.c:424 msgid "aggregate functions are not allowed in window GROUPS" msgstr "le funzioni di aggregazione non sono ammesse nel GROUPS della finestra" -#: parser/parse_agg.c:427 +#: parser/parse_agg.c:426 msgid "grouping operations are not allowed in window GROUPS" msgstr "le operazioni di raggruppamento non sono ammesse nel GROUPS della finestra" -#: parser/parse_agg.c:461 +#: parser/parse_agg.c:439 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "le funzioni aggregate non sono consentite nelle condizioni MERGE WHEN" + +#: parser/parse_agg.c:441 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "le operazioni di raggruppamento non sono consentite nelle condizioni MERGE WHEN" + +#: parser/parse_agg.c:467 msgid "aggregate functions are not allowed in check constraints" msgstr "le funzioni di aggregazione non sono ammesse nei vincoli di controllo" -#: parser/parse_agg.c:463 +#: parser/parse_agg.c:469 msgid "grouping operations are not allowed in check constraints" msgstr "le operazioni di raggruppamento non sono ammesse nei vincoli di controllo" -#: parser/parse_agg.c:470 +#: parser/parse_agg.c:476 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "le funzioni di aggregazione non sono ammesse nelle espressioni DEFAULT" -#: parser/parse_agg.c:472 +#: parser/parse_agg.c:478 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "le operazioni di raggruppamento non sono ammesse nelle espressioni DEFAULT" -#: parser/parse_agg.c:477 +#: parser/parse_agg.c:483 msgid "aggregate functions are not allowed in index expressions" msgstr "le funzioni di aggregazione non sono ammesse nelle espressioni degli indici" -#: parser/parse_agg.c:479 +#: parser/parse_agg.c:485 msgid "grouping operations are not allowed in index expressions" msgstr "le operazioni di raggruppamento non sono ammesse nelle espressioni degli indici" -#: parser/parse_agg.c:484 +#: parser/parse_agg.c:490 msgid "aggregate functions are not allowed in index predicates" msgstr "le funzioni di aggregazione non sono ammesse nei predicati degli indici" -#: parser/parse_agg.c:486 +#: parser/parse_agg.c:492 msgid "grouping operations are not allowed in index predicates" msgstr "le operazioni di raggruppamento non sono ammesse nei predicati degli indici" -#: parser/parse_agg.c:491 +#: parser/parse_agg.c:497 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "le funzioni aggregate non sono consentite nelle espressioni statistiche" + +#: parser/parse_agg.c:499 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "le operazioni di raggruppamento non sono consentite nelle espressioni statistiche" + +#: parser/parse_agg.c:504 msgid "aggregate functions are not allowed in transform expressions" msgstr "le funzioni di aggregazione non sono ammesse nelle espressioni di trasformazione" -#: parser/parse_agg.c:493 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "le operazioni di raggruppamento non sono ammesse nelle espressioni di trasformazione" -#: parser/parse_agg.c:498 +#: parser/parse_agg.c:511 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "le funzioni di aggregazione non sono ammesse nei parametri di EXECUTE" -#: parser/parse_agg.c:500 +#: parser/parse_agg.c:513 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "le operazioni di raggruppamento non sono ammesse nei parametri di EXECUTE" -#: parser/parse_agg.c:505 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "le funzioni di aggregazione non sono ammesse nelle condizioni WHEN dei trigger" -#: parser/parse_agg.c:507 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "le operazioni di raggruppamento non sono ammesse nelle condizioni WHEN dei trigger" -#: parser/parse_agg.c:512 +#: parser/parse_agg.c:525 +msgid "aggregate functions are not allowed in partition bound" +msgstr "le funzioni aggregate non sono consentite nella partizione associata" + +#: parser/parse_agg.c:527 +msgid "grouping operations are not allowed in partition bound" +msgstr "le operazioni di raggruppamento non sono consentite nella partizione associata" + +#: parser/parse_agg.c:532 msgid "aggregate functions are not allowed in partition key expressions" msgstr "le funzioni di aggregazione non sono ammesse nelle espressioni di partizione" -#: parser/parse_agg.c:514 +#: parser/parse_agg.c:534 msgid "grouping operations are not allowed in partition key expressions" msgstr "le operazioni di raggruppamento non sono ammesse nelle espressioni di partizione" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:540 +msgid "aggregate functions are not allowed in column generation expressions" +msgstr "le funzioni di aggregazione non sono consentite nelle espressioni di generazione di colonne" + +#: parser/parse_agg.c:542 +msgid "grouping operations are not allowed in column generation expressions" +msgstr "le operazioni di raggruppamento non sono consentite nelle espressioni di generazione di colonne" + +#: parser/parse_agg.c:548 msgid "aggregate functions are not allowed in CALL arguments" msgstr "le funzioni di aggregazione non sono ammesse in argomenti CALL" -#: parser/parse_agg.c:522 +#: parser/parse_agg.c:550 msgid "grouping operations are not allowed in CALL arguments" msgstr "le operazioni di raggruppamento non sono ammesse in argomenti CALL" +#: parser/parse_agg.c:556 +msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" +msgstr "le funzioni aggregate non sono consentite nelle condizioni COPY FROM WHERE" + +#: parser/parse_agg.c:558 +msgid "grouping operations are not allowed in COPY FROM WHERE conditions" +msgstr "le operazioni di raggruppamento non sono consentite nelle condizioni COPY FROM WHERE" + #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:545 parser/parse_clause.c:1818 +#: parser/parse_agg.c:585 parser/parse_clause.c:1834 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "le funzioni di aggregazione non sono ammesse in %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:548 +#: parser/parse_agg.c:588 #, c-format msgid "grouping operations are not allowed in %s" msgstr "le operazioni di raggruppamento non sono ammesse in %s" -#: parser/parse_agg.c:656 +#: parser/parse_agg.c:689 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "gli aggregati di livello esterno non possono contenere una variabile di livello inferiore tra gli argomenti diretti" -#: parser/parse_agg.c:735 +#: parser/parse_agg.c:768 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "le chiamate a funzioni di aggregazione non possono contenere chiamate a funzioni che restituiscono insiemi" -#: parser/parse_agg.c:736 parser/parse_expr.c:1766 parser/parse_expr.c:2246 -#: parser/parse_func.c:866 +#: parser/parse_agg.c:769 parser/parse_expr.c:1674 parser/parse_expr.c:2156 parser/parse_func.c:883 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Potresti riuscire a spostare la funzione che restituisce insiemi in un costrutto LATERAL FORM." -#: parser/parse_agg.c:741 +#: parser/parse_agg.c:774 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "le chiamate a funzioni di aggregazione non possono contenere chiamate a funzioni finestra" -#: parser/parse_agg.c:820 +#: parser/parse_agg.c:853 msgid "window functions are not allowed in JOIN conditions" msgstr "le funzioni finestra non sono ammesse nelle condizioni JOIN" -#: parser/parse_agg.c:827 +#: parser/parse_agg.c:860 msgid "window functions are not allowed in functions in FROM" msgstr "le funzioni finestra non sono ammesse nelle funzioni in FROM" -#: parser/parse_agg.c:833 +#: parser/parse_agg.c:866 msgid "window functions are not allowed in policy expressions" msgstr "le funzioni finestra non sono ammesse nell'espressione di una regola di sicurezza" -#: parser/parse_agg.c:846 +#: parser/parse_agg.c:879 msgid "window functions are not allowed in window definitions" msgstr "le funzioni finestra non sono ammesse nelle definizioni di finestre" -#: parser/parse_agg.c:878 +#: parser/parse_agg.c:890 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "le funzioni della finestra non sono consentite nelle condizioni MERGE WHEN" + +#: parser/parse_agg.c:914 msgid "window functions are not allowed in check constraints" msgstr "le funzioni finestra non sono ammesse nei vincoli di controllo" -#: parser/parse_agg.c:882 +#: parser/parse_agg.c:918 msgid "window functions are not allowed in DEFAULT expressions" msgstr "le funzioni finestra non sono ammesse nelle espressioni DEFAULT" -#: parser/parse_agg.c:885 +#: parser/parse_agg.c:921 msgid "window functions are not allowed in index expressions" msgstr "le funzioni finestra non sono ammesse nelle espressioni degli indici" -#: parser/parse_agg.c:888 +#: parser/parse_agg.c:924 +msgid "window functions are not allowed in statistics expressions" +msgstr "le funzioni della finestra non sono consentite nelle espressioni statistiche" + +#: parser/parse_agg.c:927 msgid "window functions are not allowed in index predicates" msgstr "le funzioni finestra non sono ammesse nei predicati degli indici" -#: parser/parse_agg.c:891 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in transform expressions" msgstr "le funzioni finestra non sono ammesse nelle espressioni di trasformazione" -#: parser/parse_agg.c:894 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in EXECUTE parameters" msgstr "le funzioni finestra non sono ammesse nei parametri di EXECUTE" -#: parser/parse_agg.c:897 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "le funzioni finestra non sono ammesse nelle condizioni WHEN dei trigger" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:939 +msgid "window functions are not allowed in partition bound" +msgstr "le funzioni della finestra non sono consentite nella partizione associata" + +#: parser/parse_agg.c:942 msgid "window functions are not allowed in partition key expressions" msgstr "le funzioni finestra non sono ammesse nelle espressioni di partizione" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in CALL arguments" msgstr "le funzioni finestra non sono ammesse in argomenti CALL" +#: parser/parse_agg.c:948 +msgid "window functions are not allowed in COPY FROM WHERE conditions" +msgstr "le funzioni della finestra non sono consentite nelle condizioni COPY FROM WHERE" + +#: parser/parse_agg.c:951 +msgid "window functions are not allowed in column generation expressions" +msgstr "le funzioni della finestra non sono consentite nelle espressioni di generazione di colonne" + #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:923 parser/parse_clause.c:1827 +#: parser/parse_agg.c:974 parser/parse_clause.c:1843 #, c-format msgid "window functions are not allowed in %s" msgstr "le funzioni finestra non sono ammesse in %s" -#: parser/parse_agg.c:957 parser/parse_clause.c:2663 +#: parser/parse_agg.c:1008 parser/parse_clause.c:2676 #, c-format msgid "window \"%s\" does not exist" msgstr "la finestra \"%s\" non esiste" -#: parser/parse_agg.c:1042 +#: parser/parse_agg.c:1092 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "troppi insiemi di raggruppamento presenti (il massimo è 4096)" -#: parser/parse_agg.c:1191 +#: parser/parse_agg.c:1232 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "le funzioni di aggregazione non sono ammesse nel termine ricorsivo di una query ricorsiva" -#: parser/parse_agg.c:1384 +#: 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 "la colonna \"%s.%s\" deve comparire nella clausola GROUP BY o essere usata in una funzione di aggregazione" -#: parser/parse_agg.c:1387 +#: parser/parse_agg.c:1428 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Gli argomenti diretti di un aggregato su insieme ordinato devono usare solo colonne raggruppate." -#: parser/parse_agg.c:1392 +#: parser/parse_agg.c:1433 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "la sottoquery usa la colonna non raggruppata \"%s.%s\" dalla query esterna" -#: parser/parse_agg.c:1556 +#: parser/parse_agg.c:1597 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "gli argomenti di GROUPING devono essere espressioni di raggruppamento del livello della query associato" -#: parser/parse_clause.c:199 +#: parser/parse_clause.c:190 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "la relazione \"%s\" non può essere obiettivo di un comando di modifica" -#: parser/parse_clause.c:615 parser/parse_clause.c:643 parser/parse_func.c:2284 +#: 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 "le funzioni che restituiscono insiemi devono comparire al livello superiore del FROM" -#: parser/parse_clause.c:655 +#: parser/parse_clause.c:610 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "non è consentita più di una lista di definizione di colonne multiple per la stessa funzione" -#: parser/parse_clause.c:688 +#: parser/parse_clause.c:643 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() con più di una funzione non può avere una lista di definizioni di colonne" -#: parser/parse_clause.c:689 +#: parser/parse_clause.c:644 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Specifica una lista di definizioni colonna separata per ogni funzione dentro ROWS FROM()" -#: parser/parse_clause.c:695 +#: parser/parse_clause.c:650 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() con più di un argomento non può avere una lista di definizioni di colonne" -#: parser/parse_clause.c:696 +#: 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 "Usa una invocazione di UNNEST() separata in ROWS FROM() e collega una lista di definizioni di colonne ad ognuna di esse." -#: parser/parse_clause.c:703 +#: parser/parse_clause.c:658 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY non può essere usata con una lista di definizioni di colonne" -#: parser/parse_clause.c:704 +#: parser/parse_clause.c:659 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Specifica la lista di definizioni di colonne dentro ROWS FROM()." -#: parser/parse_clause.c:807 +#: parser/parse_clause.c:759 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "solo una colonna FOR ORDINALITY consentita" -#: parser/parse_clause.c:868 +#: parser/parse_clause.c:820 #, c-format msgid "column name \"%s\" is not unique" msgstr "il nome della colonna \"%s\" non è unico" -#: parser/parse_clause.c:910 +#: parser/parse_clause.c:862 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "il nome di namespace \"%s\" non è unico" -#: parser/parse_clause.c:920 +#: parser/parse_clause.c:872 #, c-format msgid "only one default namespace is allowed" msgstr "solo un nome predefinito di namespace consentito" -#: parser/parse_clause.c:982 +#: parser/parse_clause.c:932 #, c-format msgid "tablesample method %s does not exist" msgstr "il metodo di campionamento tabella %s non esiste" -#: parser/parse_clause.c:1004 +#: 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" msgstr[0] "il metodo di campionamento %s richiede %d argumenti, not %d" msgstr[1] "il metodo di campionamento %s richiede %d argumenti, not %d" -#: parser/parse_clause.c:1038 +#: parser/parse_clause.c:988 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "il metodo di campionamento %s non supporta REPEATABLE" -#: parser/parse_clause.c:1208 +#: parser/parse_clause.c:1137 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "la clausola TABLESAMPLE può essere applicata solo a tabelle e viste materializzate" -#: parser/parse_clause.c:1378 +#: parser/parse_clause.c:1327 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "il nome della colonna \"%s\" compare più di una volta nella clausola USING" -#: parser/parse_clause.c:1393 +#: parser/parse_clause.c:1342 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "il nome comune della colonna \"%s\" compare più di una volta nella tabella di sinistra" -#: parser/parse_clause.c:1402 +#: parser/parse_clause.c:1351 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "la colonna \"%s\" specificata nella clausola USING non esiste nella tabella di sinistra" -#: parser/parse_clause.c:1416 +#: parser/parse_clause.c:1366 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "il nome comune della colonna \"%s\" compare più di una volta nella tabella di destra" -#: parser/parse_clause.c:1425 +#: parser/parse_clause.c:1375 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "la colonna \"%s\" specificata nella clausola USING non esiste nella tabella di destra" -#: parser/parse_clause.c:1479 +#: parser/parse_clause.c:1779 #, c-format -msgid "column alias list for \"%s\" has too many entries" -msgstr "la lista di alias delle colonne per \"%s\" ha troppi elementi" +msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" +msgstr "il conteggio delle righe non può essere nullo nella clausola FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1788 +#: parser/parse_clause.c:1804 #, c-format msgid "argument of %s must not contain variables" msgstr "l'argomento di %s non può contenere variabili" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1953 +#: parser/parse_clause.c:1969 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\" è ambiguo" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1982 +#: parser/parse_clause.c:1997 #, c-format msgid "non-integer constant in %s" msgstr "costante non intera in %s" # translator: %s is name of a SQL construct, eg ORDER BY #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2004 +#: parser/parse_clause.c:2019 #, c-format msgid "%s position %d is not in select list" msgstr "%s in posizione %d non è nella lista SELECT" -#: parser/parse_clause.c:2445 +#: parser/parse_clause.c:2458 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE è limitato a 12 elementi" -#: parser/parse_clause.c:2651 +#: parser/parse_clause.c:2664 #, c-format msgid "window \"%s\" is already defined" msgstr "la finestra \"%s\" è già definita" -#: parser/parse_clause.c:2712 +#: parser/parse_clause.c:2725 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "non è possibile scavalcare la clausola PARTITION BY della finestra \"%s\"" -#: parser/parse_clause.c:2724 +#: parser/parse_clause.c:2737 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "non è possibile scavalcare la clausola ORDER BY della finestra \"%s\"" -#: parser/parse_clause.c:2754 parser/parse_clause.c:2760 +#: parser/parse_clause.c:2767 parser/parse_clause.c:2773 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "non è possibile copiare la finestra \"%s\" perché ha una clausola frame" -#: parser/parse_clause.c:2762 +#: parser/parse_clause.c:2775 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Omettere le parentesi in questa clausola OVER." -#: parser/parse_clause.c:2782 +#: parser/parse_clause.c:2795 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE con offset PRECEDING/FOLLOWING richiede esattamente una colonna ORDER BY" -#: parser/parse_clause.c:2805 +#: parser/parse_clause.c:2818 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "la modalità GROUPS richiede una clausola ORDER BY" -#: parser/parse_clause.c:2875 +#: parser/parse_clause.c:2889 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "in un aggregato con DISTINCT, le espressioni ORDER BY devono figurare nella lista di argomenti" -#: parser/parse_clause.c:2876 +#: parser/parse_clause.c:2890 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "per SELECT DISTINCT, le espressioni ORDER BY devono figurare nella lista di argomenti" -#: parser/parse_clause.c:2908 +#: parser/parse_clause.c:2922 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "un aggregato con DISTINCT deve avere almeno un argomento" -#: parser/parse_clause.c:2909 +#: parser/parse_clause.c:2923 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT deve avere almeno una colonna" -#: parser/parse_clause.c:2975 parser/parse_clause.c:3007 +#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "le espressioni SELECT DISTINCT ON devono coincidere con l'espressione ORDER BY iniziale" -#: parser/parse_clause.c:3085 +#: parser/parse_clause.c:3099 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC non è permesso nelle clausole ON CONFLICT" -#: parser/parse_clause.c:3091 +#: parser/parse_clause.c:3105 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST non è permesso nelle clausole ON CONFLICT" -#: parser/parse_clause.c:3170 +#: parser/parse_clause.c:3184 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE richiede una specifica di inferenza o il nome di un vincolo" -#: parser/parse_clause.c:3171 +#: parser/parse_clause.c:3185 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Per esempio, ON CONFLICT (nome_colonna)." -#: parser/parse_clause.c:3182 +#: parser/parse_clause.c:3196 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT non è supportato sulle tabelle del catalogo di sistema" -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3204 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT non è supportato sulla tabella \"%s\" usata da una tabella di catalogo" -#: parser/parse_clause.c:3333 +#: parser/parse_clause.c:3334 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "l'operatore %s non è un operatore di ordinamento valido" -#: parser/parse_clause.c:3335 +#: parser/parse_clause.c:3336 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Gli operatori di ordinamento devono essere i membri \"<\" oppure \">\" di una famiglia di operatori btree." -#: parser/parse_clause.c:3646 +#: parser/parse_clause.c:3647 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE con offset PRECEDING/FOLLOWING non supportato per il tipo di colonna %s" -#: parser/parse_clause.c:3652 +#: parser/parse_clause.c:3653 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE con offset PRECEDING/FOLLOWING non supportato per il tipo di colonna %s e tipo di offset %s" -#: parser/parse_clause.c:3655 +#: parser/parse_clause.c:3656 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Converti il valore di offset in un tipo appropriato." -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3661 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE con offset PRECEDING/FOLLOWING ha interpretazioni multiple per il tipo di colonna %s e tipo di offset %s" -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3664 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Converti il valore di offset nel tipo esatto desiderato." -#: parser/parse_coerce.c:1017 parser/parse_coerce.c:1055 -#: parser/parse_coerce.c:1073 parser/parse_coerce.c:1088 -#: parser/parse_expr.c:2153 parser/parse_expr.c:2741 parser/parse_target.c:955 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "non è possibile convertire il tipo %s in %s" -#: parser/parse_coerce.c:1058 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "L'input ha troppe poche colonne." -#: parser/parse_coerce.c:1076 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Non è possibile convertire il tipo %s in %s nella colonna %d." -#: parser/parse_coerce.c:1091 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "L'input ha troppe colonne." #. 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:1146 parser/parse_coerce.c:1194 +#: 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'argomento di %s deve essere di tipo %s, non %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:1157 parser/parse_coerce.c:1206 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "l'argomento di %s non deve restituire un set" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1346 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "in %s i tipi %s e %s non combaciano" +#: parser/parse_coerce.c:1499 +#, c-format +msgid "argument types %s and %s cannot be matched" +msgstr "i tipi di argomento %s e %s non possono essere abbinati" + #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1413 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "in %s conversione del tipo %s in %s fallita" -#: parser/parse_coerce.c:1715 +#: 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 \"anyelement\" are not all alike" -msgstr "gli argomenti dichiarati \"anyelement\" non sono tutti simili" +msgid "arguments declared \"%s\" are not all alike" +msgstr "gli argomenti dichiarati \"%s\" non sono tutti uguali" -#: parser/parse_coerce.c:1735 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:558 #, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "gli argomenti dichiarati \"anyarray\" non sono tutti simili" +msgid "argument declared %s is not an array but type %s" +msgstr "l'argomento dichiarato %s non è un array ma di tipo %s" -#: parser/parse_coerce.c:1755 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:572 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "gli argomenti dichiarati \"anyrange\" non sono tutti simili" +msgid "argument declared %s is not a range type but type %s" +msgstr "l'argomento dichiarato %s non è un intervallo ma di tipo %s" -#: parser/parse_coerce.c:1784 parser/parse_coerce.c:1999 -#: parser/parse_coerce.c:2033 +#: 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 an array but type %s" -msgstr "l'argomento dichiarato %s non è un array ma di tipo %s" +msgid "argument declared %s is not a multirange type but type %s" +msgstr "argomento dichiarato %s non è un tipo multirange ma tipo %s" -#: parser/parse_coerce.c:1800 parser/parse_coerce.c:1839 +#: parser/parse_coerce.c:2353 #, c-format -msgid "argument declared %s is not consistent with argument declared %s" -msgstr "l'argomento dichiarato %s non è consistente con l'argomento dichiarato %s" +msgid "cannot determine element type of \"anyarray\" argument" +msgstr "impossibile determinare il tipo di elemento dell'argomento \"anyarray\"" -#: parser/parse_coerce.c:1822 parser/parse_coerce.c:2046 +#: 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 a range type but type %s" -msgstr "l'argomento dichiarato %s non è un intervallo ma di tipo %s" +msgid "argument declared %s is not consistent with argument declared %s" +msgstr "l'argomento dichiarato %s non è consistente con l'argomento dichiarato %s" -#: parser/parse_coerce.c:1860 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "errore nel determinare il tipo polimorfico perché l'input è di tipo %s" -#: parser/parse_coerce.c:1871 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "il tipo associato ad anynonarray è di tipo array: %s" -#: parser/parse_coerce.c:1881 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "il tipo associato ad anyenum non è una enumerazione: %s" -#: parser/parse_coerce.c:1921 parser/parse_coerce.c:1951 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "argomenti di qualsiasi famiglia compatibile non possono essere convertiti in un tipo comune" + +#: 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 "impossibile determinare il tipo polimorfico %s perché l'input ha il tipo %s" + +#: parser/parse_coerce.c:2587 +#, c-format +msgid "anycompatiblerange type %s does not match anycompatible type %s" +msgstr "qualsiasi tipo di intervallo compatibile %s non corrisponde a nessun tipo compatibile %s" + +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "qualsiasi tipo multirange compatibile %s non corrisponde a nessun tipo compatibile %s" + +#: parser/parse_coerce.c:2622 +#, c-format +msgid "type matched to anycompatiblenonarray is an array type: %s" +msgstr "il tipo associato ad anynonarray è di tipo array: %s" + +#: 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 risultato di tipo %s richiede almeno un input di tipo anyrange o anymultirange." + +#: 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 risultato di tipo %s richiede almeno un input di tipo anycompatiblerange o anycompatiblemultirange." + +#: 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 risultato di tipo %s richiede almeno un input di tipo anyelement, anyarray, anynonarray, anyenum, anyrange o anymultirange." + +#: parser/parse_coerce.c:2898 #, c-format -msgid "could not find range type for data type %s" -msgstr "tipo dell'intervallo non trovato per il tipo di dato %s" +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "Un risultato di tipo %s richiede almeno un input di tipo anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange o anycompatiblemultirange." + +#: parser/parse_coerce.c:2928 +msgid "A result of type internal requires at least one input of type internal." +msgstr "Un risultato di tipo internal richiede almeno un input di tipo 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:1005 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "mancata corrispondenza degli ordinamenti impliciti \"%s\" e \"%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:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Puoi scegliere l'ordinamento applicando la clausola COLLATE ad una o ad entrambe le espressioni." -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "mancata corrispondenza degli ordinamenti espliciti \"%s\" e \"%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 "il riferimento ricorsivo alla query \"%s\" non può figurare nel suo termine non ricorsivo" -#: 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 "il riferimento ricorsivo alla query \"%s\" non può figurare in una sottoquery" -#: 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 "il riferimento ricorsivo alla query \"%s\" non può figurare in un join esterno" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "il riferimento ricorsivo alla query \"%s\" non può figurare in 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 "il riferimento ricorsivo alla query \"%s\" non può figurare in EXCEPT" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE non supportato nella query WITH" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "il nome della query WITH \"%s\" è stato specificato più di una volta" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:275 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "la clausola WITH contenente un'istruzione di modifica dei dati deve apparire al livello superiore" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:324 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "nella query ricorsiva \"%s\" la colonna %d è di tipo %s nel suo termine non ricorsivo ma %s globalmente" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:330 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Converti l'output del termine non ricorsivo nel tipo corretto." -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:335 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "nella query ricorsiva \"%s\" la colonna %d ha ordinamento \"%s\" nel suo termine non ricorsivo ma \"%s\" globalmente" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:339 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Usa la clausola COLLATE per impostare l'ordinamento del termine non ricorsivo." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:357 +#, c-format +msgid "WITH query is not recursive" +msgstr "La query WITH non è ricorsiva" + +#: parser/parse_cte.c:388 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "con una clausola SEARCH o CYCLE, il lato sinistro di UNION deve essere SELECT" + +#: parser/parse_cte.c:393 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "con una clausola SEARCH o CYCLE, il lato destro di UNION deve essere SELECT" + +#: parser/parse_cte.c:408 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "colonna di ricerca \"%s\" non nell'elenco delle colonne di query WITH" + +#: parser/parse_cte.c:415 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "nome di colonna \"%s\" specificato più di una volta" + +#: parser/parse_cte.c:424 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "nome della colonna della sequenza di ricerca \"%s\" già utilizzato nell'elenco delle colonne della query WITH" + +#: parser/parse_cte.c:443 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "la colonna del ciclo \"%s\" non è nell'elenco delle colonne di query WITH" + +#: parser/parse_cte.c:450 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "colonna del ciclo \"%s\" specificata più di una volta" + +#: parser/parse_cte.c:459 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "nome della colonna del contrassegno del ciclo \"%s\" già utilizzato nell'elenco delle colonne della query WITH" + +#: parser/parse_cte.c:471 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "nome della colonna del percorso ciclabile \"%s\" già utilizzato nell'elenco delle colonne della query WITH" + +#: parser/parse_cte.c:479 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "il nome della colonna del contrassegno del ciclo e il nome della colonna del percorso del ciclo sono gli stessi" + +#: parser/parse_cte.c:515 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "impossibile identificare un operatore di disuguaglianza per il tipo %s" + +#: parser/parse_cte.c:527 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "il nome della colonna della sequenza di ricerca e il nome della colonna del contrassegno di ciclo sono gli stessi" + +#: parser/parse_cte.c:534 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "il nome della colonna della sequenza di ricerca e il nome della colonna del percorso ciclabile sono gli stessi" + +#: parser/parse_cte.c:618 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "la query WITH \"%s\" ha %d colonne disponibili ma %d colonne specificate" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:798 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "il riferimento reciproco tra elementi WITH non è implementato" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:850 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "la query ricorsiva \"%s\" non può contenere istruzioni di modifica dei dati" -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:858 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "la query ricorsiva \"%s\" non ha la forma termine-non-ricorsivo UNION [ALL] termine-ricorsivo" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:902 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY non è implementato in una query ricorsiva" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:908 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET non è implementato in una query ricorsiva" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:914 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT non è implementato in una query ricorsiva" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:920 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE non è implementato in una query ricorsiva" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:977 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "il riferimento ricorsivo alla query \"%s\" non può apparire più di una volta" -#: parser/parse_expr.c:350 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT non ammesso in questo contesto" -#: parser/parse_expr.c:403 parser/parse_relation.c:3287 -#: parser/parse_relation.c:3307 +#: parser/parse_expr.c:335 parser/parse_relation.c:3654 parser/parse_relation.c:3674 #, c-format msgid "column %s.%s does not exist" msgstr "la colonna %s.%s non esiste" -#: parser/parse_expr.c:415 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "la colonna \"%s\" non è stata trovata nel tipo di dato %s" -#: parser/parse_expr.c:421 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "la colonna \"%s\" non identificata nel tipo di dato record" -#: parser/parse_expr.c:427 +#: parser/parse_expr.c:359 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "la notazione della colonna .%s sembra essere di tipo %s, che non è un tipo composito" -#: parser/parse_expr.c:458 parser/parse_target.c:722 +#: parser/parse_expr.c:390 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "l'espansione della riga tramite \"*\" non è supportata qui" -#: parser/parse_expr.c:771 parser/parse_relation.c:689 -#: parser/parse_relation.c:789 parser/parse_target.c:1193 +#: parser/parse_expr.c:512 +msgid "cannot use column reference in DEFAULT expression" +msgstr "non è possibile utilizzare il riferimento alla colonna nell'espressione DEFAULT" + +#: parser/parse_expr.c:515 +msgid "cannot use column reference in partition bound expression" +msgstr "non è possibile utilizzare il riferimento alla colonna nell'espressione associata alla partizione" + +#: parser/parse_expr.c:784 parser/parse_relation.c:818 parser/parse_relation.c:900 parser/parse_target.c:1234 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "il riferimento alla colonna \"%s\" è ambiguo" -#: parser/parse_expr.c:827 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:840 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 "parametro $%d non presente" -#: parser/parse_expr.c:1070 +#: parser/parse_expr.c:1040 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF richiede che l'operatore = restituisca un valore booleano" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1076 parser/parse_expr.c:3057 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s non può restituire un insieme" -#: parser/parse_expr.c:1524 parser/parse_expr.c:1556 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "il numero di colonne non corrisponde al numero di valori" -#: parser/parse_expr.c:1570 +#: parser/parse_expr.c:1477 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "l'origine per un UPDATE multi-colonna deve essere una sub-SELECT o espressione ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1764 parser/parse_expr.c:2244 parser/parse_func.c:2391 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "non si possono usare funzioni che restituiscono insiemi in %s" -#: parser/parse_expr.c:1825 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "non si può usare una sottoquery nel vincolo di controllo" -#: parser/parse_expr.c:1829 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "non si può usare una sottoquery in un'espressione DEFAULT" -#: parser/parse_expr.c:1832 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "non si possono usare sottoquery nell'espressione dell'indice" -#: parser/parse_expr.c:1835 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "non è possibile usare sottoquery nel predicato dell'indice" -#: parser/parse_expr.c:1838 +#: parser/parse_expr.c:1748 +msgid "cannot use subquery in statistics expression" +msgstr "non è possibile utilizzare la sottoquery nell'espressione statistica" + +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "non è possibile usare sottoquery in un'espressione di trasformazione" -#: parser/parse_expr.c:1841 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "non si possono usare sottoquery nel parametro EXECUTE" -#: parser/parse_expr.c:1844 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "non è possibile usare sottoquery nella condizione WHEN del trigger" -#: parser/parse_expr.c:1847 +#: parser/parse_expr.c:1760 +msgid "cannot use subquery in partition bound" +msgstr "non è possibile utilizzare la sottoquery nella partizione associata" + +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "non è possibile usare sottoquery in un'espressione di partizione" -#: parser/parse_expr.c:1850 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "non è possibile usare sottoquery in argomenti CALL" -#: parser/parse_expr.c:1903 +#: parser/parse_expr.c:1769 +msgid "cannot use subquery in COPY FROM WHERE condition" +msgstr "non è possibile utilizzare la sottoquery nella condizione COPY FROM WHERE" + +#: parser/parse_expr.c:1772 +msgid "cannot use subquery in column generation expression" +msgstr "non è possibile utilizzare la sottoquery nell'espressione di generazione di colonne" + +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "la sottoquery deve restituire solo una colonna" -#: parser/parse_expr.c:1987 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "la sottoquery ha troppe colonne" -#: parser/parse_expr.c:1992 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "la sottoquery ha troppe poche colonne" -#: parser/parse_expr.c:2093 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "non è possibile determinare il tipo di un array vuoto" -#: parser/parse_expr.c:2094 +#: parser/parse_expr.c:1998 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Effettua una conversione esplicita al tipo desiderato, ad esempio ARRAY[]::integer[]." -#: parser/parse_expr.c:2108 +#: parser/parse_expr.c:2012 #, c-format msgid "could not find element type for data type %s" msgstr "tipo dell'elemento non trovato per il tipo di dato %s" -#: parser/parse_expr.c:2395 +#: parser/parse_expr.c:2095 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "Le espressioni ROW possono avere al massimo %d voci" + +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "il valore dell'attributo XML senza nome dev'essere un riferimento ad una colonna" -#: parser/parse_expr.c:2396 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "il valore dell'elemento XML senza nome dev'essere un riferimento ad una colonna" -#: parser/parse_expr.c:2411 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "l'attributo XML di nome \"%s\" compare più di una volta" -#: parser/parse_expr.c:2518 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "non è possibile convertire il risultato di XMLSERIALIZE a %s" -#: parser/parse_expr.c:2814 parser/parse_expr.c:3010 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "numero di elementi differente nelle espressioni di riga" -#: parser/parse_expr.c:2824 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "non possono comparire righe di lunghezza zero" -#: parser/parse_expr.c:2849 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "l'operatore di comparazione tra righe deve restituire il tipo booleano, non il tipo %s" -#: parser/parse_expr.c:2856 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "l'operatore di comparazione tra righe non può restituire un insieme" -#: parser/parse_expr.c:2915 parser/parse_expr.c:2956 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "non è stato possibile determinare un'interpretazione dell'operatore di comparazione tra righe %s" -#: parser/parse_expr.c:2917 +#: parser/parse_expr.c:2835 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Gli operatori di comparazione tra righe devono essere associati a famiglie di operatori btree." -#: parser/parse_expr.c:2958 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "C'è più di un candidato egualmente plausibile." -#: parser/parse_expr.c:3051 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM richiede che l'operatore = restituisca un valore booleano" -#: parser/parse_expr.c:3370 parser/parse_expr.c:3388 -#, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "cambio di precedenza di operatori: %s ora ha precedenza inferiore di %s" - -#: parser/parse_func.c:185 +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "il nome dell'argomento \"%s\" è usato più di una volta" -#: parser/parse_func.c:196 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" msgstr "gli argomenti posizionali non possono seguire gli argomenti con nome" -#: parser/parse_func.c:278 parser/parse_func.c:2184 +#: parser/parse_func.c:287 parser/parse_func.c:2369 #, c-format msgid "%s is not a procedure" msgstr "%s non è una procedura" -#: parser/parse_func.c:282 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." msgstr "Per eseguire una funzione, usa SELECT." -#: parser/parse_func.c:288 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%s è una procedura" -#: parser/parse_func.c:292 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." msgstr "Per eseguire una procedura, usa CALL." -#: parser/parse_func.c:306 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*) specificato, ma %s non è una funzione di aggregazione" -#: parser/parse_func.c:313 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCT specificato, ma %s non è una funzione di aggregazione" -#: parser/parse_func.c:319 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUP specificato, ma %s non è una funzione di aggregazione" -#: parser/parse_func.c:325 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY specificato, ma %s non è una funzione di aggregazione" -#: parser/parse_func.c:331 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTER specificato, ma %s non è una funzione di aggregazione" -#: parser/parse_func.c:337 +#: parser/parse_func.c:346 #, c-format msgid "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVER specificato, ma %s non è una funzione finestra né una funzione di aggregazione" -#: parser/parse_func.c:375 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "WITHIN GROUP è richiesto per l'aggregato su insieme ordinato %s" -#: parser/parse_func.c:381 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "OVER non è supportato per l'aggregato su insieme ordinato %s" -#: parser/parse_func.c:412 parser/parse_func.c:441 +#: 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 "Esiste un aggregato su insieme ordinato %s, ma richiede %d argomenti diretti, non %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] "Esiste un insieme ordinato %s, ma richiede %d argomento diretto, non %d." +msgstr[1] "Esiste un insieme ordinato %s, ma richiede %d argomenti diretti, non %d." -#: parser/parse_func.c:466 +#: 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 "Per usare l'aggregato su insieme ipotetico %s il numero di argomenti ipotetici diretti (qui %d) deve combaciare con quello di colonne di ordinamento (qui %d)." -#: parser/parse_func.c:480 +#: parser/parse_func.c:493 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr "Esiste un aggregato su insieme ordinato %s, ma richiede almeno %d argomenti diretti." +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] "Esiste un insieme ordinato %s, ma richiede almeno %d argomento diretto." +msgstr[1] "Esiste un insieme ordinato %s, ma richiede almeno %d argomenti diretti." -#: parser/parse_func.c:499 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "%s non è un aggregato su insieme ordinato, per cui non può avere WITHIN GROUP" -#: parser/parse_func.c:512 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "la funzione finestra %s richiede una clausola OVER" -#: parser/parse_func.c:519 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "la funzione di aggregazione %s non può avere WITHIN GROUP" -#: parser/parse_func.c:548 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "la procedura %s non è unica" -#: parser/parse_func.c:551 +#: parser/parse_func.c:566 #, c-format msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." msgstr "Non è stato possibile scegliere la procedura migliore. Potrebbe essere necessario convertire i tipi esplicitamente." -#: parser/parse_func.c:557 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "la funzione %s non è unica" -#: parser/parse_func.c:560 +#: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." msgstr "Non è stato possibile scegliere la funzione migliore. Potrebbe essere necessario convertire i tipi esplicitamente." -#: parser/parse_func.c:599 +#: 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 "Nessuna funzione di aggregazione trovata con nome e tipi di argomenti forniti. Forse hai posizionato ORDER BY male: ORDER BY deve apparire dopo tutti gli argomenti regolari della funzione di aggregazione." -#: parser/parse_func.c:607 parser/parse_func.c:2172 +#: parser/parse_func.c:622 parser/parse_func.c:2412 #, c-format msgid "procedure %s does not exist" msgstr "la procedura %s non esiste" -#: parser/parse_func.c:610 +#: 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 "Nessuna procedura trovata con nome e tipi di argomenti forniti. Potrebbe essere necessario convertire i tipi esplicitamente." -#: parser/parse_func.c:619 +#: 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 "Nessuna funzione trovata con nome e tipi di argomenti forniti. Potrebbe essere necessario convertire i tipi esplicitamente." -#: parser/parse_func.c:721 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "l'argomento VARIADIC deve essere un array" -#: parser/parse_func.c:773 parser/parse_func.c:837 +#: 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(*) dev'essere usato per richiamare una funzione di aggregazione senza parametri" -#: parser/parse_func.c:780 +#: parser/parse_func.c:797 #, c-format msgid "aggregates cannot return sets" msgstr "le funzioni di aggregazione non possono restituire insiemi" -#: parser/parse_func.c:795 +#: parser/parse_func.c:812 #, c-format msgid "aggregates cannot use named arguments" msgstr "le funzioni di aggregazione non possono usare argomenti con nome" -#: parser/parse_func.c:827 +#: parser/parse_func.c:844 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT non è implementato per funzioni finestra" -#: parser/parse_func.c:847 +#: parser/parse_func.c:864 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "ORDER BY delle funzioni di aggregazione non è implementato per funzioni finestra" +msgstr "l'ORDER BY delle funzioni di aggregazione non è implementato per funzioni finestra" -#: parser/parse_func.c:856 +#: parser/parse_func.c:873 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER non è implementato per funzioni finestra non aggregate" -#: parser/parse_func.c:865 +#: parser/parse_func.c:882 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "le funzioni finestra non possono contenere richiami a funzioni che restituiscono insiemi" -#: parser/parse_func.c:873 +#: parser/parse_func.c:890 #, c-format msgid "window functions cannot return sets" msgstr "le funzioni finestra non possono restituire insiemi" -#: parser/parse_func.c:2059 +#: parser/parse_func.c:2168 parser/parse_func.c:2441 +#, c-format +msgid "could not find a function named \"%s\"" +msgstr "funzione \"%s\" non trovata" + +#: parser/parse_func.c:2182 parser/parse_func.c:2459 #, c-format msgid "function name \"%s\" is not unique" msgstr "il nome della funzione \"%s\" non è univoco" -#: parser/parse_func.c:2061 +#: parser/parse_func.c:2184 parser/parse_func.c:2462 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Specifica l'elenco degli argomenti per selezionare la funzione senza ambiguità." -#: parser/parse_func.c:2071 +#: parser/parse_func.c:2228 #, c-format -msgid "could not find a function named \"%s\"" -msgstr "funzione \"%s\" non trovata" +msgid "procedures cannot have more than %d argument" +msgid_plural "procedures cannot have more than %d arguments" +msgstr[0] "le procedure non possono avere più di %d argomento" +msgstr[1] "le procedure non possono avere più di %d argomenti" -#: parser/parse_func.c:2153 +#: parser/parse_func.c:2359 #, c-format msgid "%s is not a function" msgstr "%s non è una funzione" -#: parser/parse_func.c:2167 +#: parser/parse_func.c:2379 +#, c-format +msgid "function %s is not an aggregate" +msgstr "la funzione %s non è una funzione di aggregazione" + +#: parser/parse_func.c:2407 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "procedura \"%s\" non trovata" -#: parser/parse_func.c:2198 +#: parser/parse_func.c:2421 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "funzione di aggregazione \"%s\" non trovata" -#: parser/parse_func.c:2203 +#: parser/parse_func.c:2426 #, c-format msgid "aggregate %s(*) does not exist" msgstr "la funzione di aggregazione %s(*) non esiste" -#: parser/parse_func.c:2208 +#: parser/parse_func.c:2431 #, c-format msgid "aggregate %s does not exist" msgstr "la funzione di aggregazione %s non esiste" -#: parser/parse_func.c:2221 +#: parser/parse_func.c:2467 #, c-format -msgid "function %s is not an aggregate" -msgstr "la funzione %s non è una funzione di aggregazione" +msgid "procedure name \"%s\" is not unique" +msgstr "il nome della procedura \"%s\" non è univoco" + +#: parser/parse_func.c:2470 +#, c-format +msgid "Specify the argument list to select the procedure unambiguously." +msgstr "Specificare l'elenco di argomenti per selezionare la procedura in modo univoco." + +#: parser/parse_func.c:2475 +#, c-format +msgid "aggregate name \"%s\" is not unique" +msgstr "il nome aggregato \"%s\" non è univoco" + +#: parser/parse_func.c:2478 +#, c-format +msgid "Specify the argument list to select the aggregate unambiguously." +msgstr "Specificare l'elenco di argomenti per selezionare l'aggregato in modo univoco." + +#: parser/parse_func.c:2483 +#, c-format +msgid "routine name \"%s\" is not unique" +msgstr "il nome della routine \"%s\" non è univoco" -#: parser/parse_func.c:2271 +#: parser/parse_func.c:2486 +#, c-format +msgid "Specify the argument list to select the routine unambiguously." +msgstr "Specificare l'elenco di argomenti per selezionare la routine senza ambiguità." + +#: parser/parse_func.c:2541 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "non si possono usare funzioni che restituiscono insiemi in condizioni JOIN" -#: parser/parse_func.c:2292 +#: parser/parse_func.c:2562 msgid "set-returning functions are not allowed in policy expressions" msgstr "non si possono usare funzioni che restituiscono insiemi nelle regole di sicurezza" -#: parser/parse_func.c:2308 +#: parser/parse_func.c:2578 msgid "set-returning functions are not allowed in window definitions" msgstr "non si possono usare funzioni che restituiscono insiemi nelle definizioni di finestre" -#: parser/parse_func.c:2346 +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "le funzioni di ritorno del set non sono consentite nelle condizioni MERGE WHEN" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "non si possono usare funzioni che restituiscono insiemi nei vincoli di controllo" -#: parser/parse_func.c:2350 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "non si possono usare funzioni che restituiscono insiemi nelle espressioni DEFAULT" -#: parser/parse_func.c:2353 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "non si possono usare funzioni che restituiscono insiemi nelle espressioni degli indici" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "non si possono usare funzioni che restituiscono insiemi nei predicati degli indici" -#: parser/parse_func.c:2359 +#: parser/parse_func.c:2632 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "le funzioni di restituzione degli insiemi non sono consentite nelle espressioni statistiche" + +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "non si possono usare funzioni che restituiscono insiemi in espressioni di trasformazione" -#: parser/parse_func.c:2362 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "non si possono usare funzioni che restituiscono insiemi in parametri EXECUTE" -#: parser/parse_func.c:2365 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "non si possono usare funzioni che restituiscono insiemi nelle condizioni WHEN dei trigger" -#: parser/parse_func.c:2368 +#: parser/parse_func.c:2644 +msgid "set-returning functions are not allowed in partition bound" +msgstr "le funzioni di restituzione di set non sono consentite nella partizione associata" + +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" -msgstr "non si possono usare funzioni che restituiscono insiemi come espressione di partizione " +msgstr "non si possono usare funzioni che restituiscono insiemi come espressione di partizione" -#: parser/parse_func.c:2371 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "non si possono usare funzioni che restituiscono insiemi in argomenti CALL" -#: parser/parse_node.c:87 +#: parser/parse_func.c:2653 +msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" +msgstr "le funzioni di restituzione del set non sono consentite nelle condizioni COPY FROM WHERE" + +#: parser/parse_func.c:2656 +msgid "set-returning functions are not allowed in column generation expressions" +msgstr "le funzioni di restituzione degli insiemi non sono consentite nelle espressioni di generazione di colonne" + +#: parser/parse_merge.c:119 #, c-format -msgid "target lists can have at most %d entries" -msgstr "le liste di destinazione possono avere al più %d elementi" +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WITH RECORSIVE non è supportato per l'istruzione MERGE" -#: parser/parse_node.c:256 +#: parser/parse_merge.c:163 #, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "non è possibile usare un indice su %s perché non è un array" +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "clausola WHEN irraggiungibile specificata dopo la clausola WHEN incondizionata" -#: parser/parse_node.c:358 parser/parse_node.c:395 +#: parser/parse_merge.c:178 parser/parse_merge.c:184 #, c-format -msgid "array subscript must have type integer" -msgstr "l'indice di un array dev'essere di tipo intero" +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "impossibile eseguire MERGE sulla relazione \"%s\"" + +#: parser/parse_merge.c:186 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE non è supportato per le relazioni con le regole." + +#: parser/parse_merge.c:203 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "nome \"%s\" specificato più di una volta" -#: parser/parse_node.c:426 +#: parser/parse_merge.c:205 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "l'assegnamento all'array richiede il tipo %s ma l'espressione è di tipo %s" +msgid "The name is used both as MERGE target table and data source." +msgstr "Il nome viene utilizzato sia come tabella di destinazione MERGE che come origine dati." -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:520 -#: utils/adt/regproc.c:704 +#: parser/parse_node.c:86 +#, c-format +msgid "target lists can have at most %d entries" +msgstr "le liste di destinazione possono avere al più %d elementi" + +#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#, c-format +msgid "postfix operators are not supported" +msgstr "gli operatori suffisso non sono supportati" + +#: 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 "l'operatore non esiste: %s" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:229 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Usa un operatore di ordinamento esplicito, oppure modifica la query." -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:485 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "l'operatore richiede una coercizione di tipo a run-time: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:641 #, c-format msgid "operator is not unique: %s" msgstr "l'operatore non è unico: %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 "Non è stato possibile scegliere l'operatore migliore. Potrebbe essere necessario convertire i tipi esplicitamente." -#: 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 "Nessun operatore trovato con nome e tipo di argomento fornito. Potrebbe essere necessario convertire il tipo esplicitamente." -#: 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 "Nessun operatore trovato con nome e tipi di argomenti forniti. Potrebbe essere necessario convertire i tipi esplicitamente." -#: 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 "l'operatore non è completamente definito: %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) richiede un array sul lato destro" -#: 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) richiede che l'operatore restituisca un valore booleano" -#: 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) richiede che l'operatore non restituisca un insieme" -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "tipi di dati dedotti per il parametro $%d non consistenti" -#: parser/parse_relation.c:176 +#: parser/parse_param.c:313 tcop/postgres.c:709 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "non è stato possibile determinare il tipo di dato del parametro $%d" + +#: parser/parse_relation.c:201 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "il riferimento alla tabella \"%s\" è ambiguo" -#: parser/parse_relation.c:220 +#: parser/parse_relation.c:245 #, c-format msgid "table reference %u is ambiguous" msgstr "il riferimento alla tabella %u è ambiguo" -#: parser/parse_relation.c:419 +#: parser/parse_relation.c:445 #, c-format msgid "table name \"%s\" specified more than once" msgstr "la tabella di nome \"%s\" è stata specificata più di una volta" -#: parser/parse_relation.c:446 parser/parse_relation.c:3227 +#: parser/parse_relation.c:474 parser/parse_relation.c:3594 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "riferimento non valido all'elemento della clausola FROM per la tabella \"%s\"" -#: parser/parse_relation.c:449 parser/parse_relation.c:3232 +#: parser/parse_relation.c:478 parser/parse_relation.c:3599 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "C'è un elemento per la tabella \"%s\", ma non può essere referenziato da questa parte della query." -#: parser/parse_relation.c:451 +#: parser/parse_relation.c:480 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Il tipo del JOIN deve essere INNER oppure LEFT per un riferimento LATERAL." -#: parser/parse_relation.c:727 +#: parser/parse_relation.c:691 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "la colonna di sistema \"%s\" referenziata nel vincolo di controllo non è valida" -#: parser/parse_relation.c:1086 parser/parse_relation.c:1366 -#: parser/parse_relation.c:1936 +#: parser/parse_relation.c:700 +#, c-format +msgid "cannot use system column \"%s\" in column generation expression" +msgstr "impossibile utilizzare la colonna di sistema \"%s\" nell'espressione di generazione della colonna" + +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "impossibile utilizzare la colonna di sistema \"%s\" nella condizione MERGE WHEN" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 parser/parse_relation.c:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "la tabella \"%s\" ha %d colonne disponibili ma %d colonne specificate" -#: parser/parse_relation.c:1173 +#: 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 "C'è un elemento di WITH di nome \"%s\", ma non può essere referenziato da questa parte della query." -#: parser/parse_relation.c:1175 +#: parser/parse_relation.c:1390 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Usa WITH RECURSIVE, oppure riordina gli elementi di WITH per rimuovere i riferimenti in avanti." -#: parser/parse_relation.c:1486 +#: parser/parse_relation.c:1778 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "un elenco di definizioni di colonna è ridondante per una funzione con parametri OUT" + +#: parser/parse_relation.c:1784 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "un elenco di definizioni di colonna è ridondante per una funzione che restituisce un tipo composto denominato" + +#: parser/parse_relation.c:1791 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "la lista di definizione di colonne è consentita solo per funzioni che restituiscono \"record\"" -#: parser/parse_relation.c:1495 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "la lista di definizione di colonne è necessaria per funzioni che restituiscono \"record\"" -#: parser/parse_relation.c:1575 +#: parser/parse_relation.c:1839 +#, c-format +msgid "column definition lists can have at most %d entries" +msgstr "gli elenchi di definizioni di colonna possono avere al massimo %d voci" + +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "la funzione \"%s\" in FROM restituisce il tipo non supportato %s" -#: parser/parse_relation.c:1764 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#, c-format +msgid "functions in FROM can return at most %d columns" +msgstr "le funzioni in FROM possono restituire al massimo %d colonne" + +#: parser/parse_relation.c:2049 +#, c-format +msgid "%s function has %d columns available but %d columns specified" +msgstr "La funzione %s ha %d colonne disponibili ma %d colonne specificate" + +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "le liste VALUES \"%s\" hanno %d colonne disponibili ma %d colonne specificate" -#: parser/parse_relation.c:1819 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "i join possono avere al più %d colonne" -#: parser/parse_relation.c:1909 +#: parser/parse_relation.c:2235 #, c-format -msgid "WITH query \"%s\" does not have a RETURNING clause" -msgstr "la query WITH \"%s\" non ha una clausola RETURNING" +msgid "join expression \"%s\" has %d columns available but %d columns specified" +msgstr "l'espressione di join \"%s\" ha %d colonne disponibili ma %d colonne specificate" -#: parser/parse_relation.c:2846 parser/parse_relation.c:2884 -#: parser/parse_relation.c:3011 +#: parser/parse_relation.c:2330 #, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "la colonna %d della relazione \"%s\" non esiste" +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "la query WITH \"%s\" non ha una clausola RETURNING" -#: parser/parse_relation.c:3230 +#: parser/parse_relation.c:3597 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Forse intendevi utilizzare l'alias \"%s\" della tabella." -#: parser/parse_relation.c:3238 +#: parser/parse_relation.c:3605 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "elemento FROM per la tabella \"%s\" mancante" -#: parser/parse_relation.c:3290 +#: parser/parse_relation.c:3657 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Forse intendevi referenziare la colonna \"%s.%s\"." -#: parser/parse_relation.c:3292 +#: parser/parse_relation.c:3659 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Esiste una colonna di nome \"%s\" nella tabella \"%s\", ma non può essere referenziata da questa parte della query." -#: parser/parse_relation.c:3309 +#: parser/parse_relation.c:3676 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Forse intendevi referenziare la colonna \"%s.%s\" o la colonna \"%s.%s\"." -#: parser/parse_target.c:483 parser/parse_target.c:784 +#: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "non è possibile assegnare alla colonna di sistema \"%s\"" -#: parser/parse_target.c:511 +#: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "non è possibile impostare gli elementi di un array a DEFAULT" -#: parser/parse_target.c:516 +#: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "non è possibile impostare un sottocampo a DEFAULT" -#: parser/parse_target.c:585 +#: parser/parse_target.c:589 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "la colonna \"%s\" è di tipo %s ma l'espressione è di tipo %s" -#: parser/parse_target.c:768 +#: 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 "non è possibile assegnare al campo \"%s\" della colonna \"%s\" perché il suo tipo %s non è un tipo composito" -#: parser/parse_target.c:777 +#: 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 "non è possibile assegnare al campo \"%s\" della colonna \"%s\" perché non questa colonna non compare nel tipo di dato %s" -#: parser/parse_target.c:854 +#: parser/parse_target.c:877 #, c-format -msgid "array assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "l'assegnamento array a \"%s\" richiede il tipo %s ma l'espressione è di tipo %s" +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "l'assegnazione con pedice a \"%s\" richiede il tipo %s ma l'espressione è di tipo %s" -#: parser/parse_target.c:864 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "il sottocampo \"%s\" è di tipo %s ma l'espressione è di tipo %s" -#: parser/parse_target.c:1283 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * senza tabelle specificate non è consentito" -#: parser/parse_type.c:83 +#: parser/parse_type.c:100 #, c-format msgid "improper %%TYPE reference (too few dotted names): %s" msgstr "riferimento %%TYPE improprio (troppi pochi nomi puntati): %s" -#: parser/parse_type.c:105 +#: parser/parse_type.c:122 #, c-format msgid "improper %%TYPE reference (too many dotted names): %s" msgstr "riferimento %%TYPE improprio (troppi nomi puntati): %s" -#: parser/parse_type.c:140 +#: parser/parse_type.c:157 #, c-format msgid "type reference %s converted to %s" msgstr "riferimento al tipo %s convertito in %s" -#: parser/parse_type.c:261 parser/parse_type.c:838 utils/cache/typcache.c:373 +#: 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 "il tipo \"%s\" non è completamente definito" -#: parser/parse_type.c:346 +#: parser/parse_type.c:363 #, c-format msgid "type modifier is not allowed for type \"%s\"" msgstr "modificatore di tipo non ammesso per il tipo \"%s\"" -#: parser/parse_type.c:388 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "i modificatori di tipo devono essere costanti o identificatori semplici" -#: parser/parse_type.c:704 parser/parse_type.c:803 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "nome di tipo \"%s\" non valido" -#: parser/parse_utilcmd.c:272 +#: parser/parse_utilcmd.c:266 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "non è possibile creare tabelle partizionate come figli di ereditarietà" -#: parser/parse_utilcmd.c:448 -#, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%s creerà la sequenza implicita \"%s\" per la colonna serial \"%s.%s\"" - -#: parser/parse_utilcmd.c:571 +#: parser/parse_utilcmd.c:579 #, c-format msgid "array of serial is not implemented" msgstr "gli array di serial non sono implementati" -#: parser/parse_utilcmd.c:647 parser/parse_utilcmd.c:659 +#: parser/parse_utilcmd.c:658 parser/parse_utilcmd.c:670 parser/parse_utilcmd.c:729 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "dichiarazioni NULL/NOT NULL in conflitto per la colonna \"%s\" della tabella \"%s\"" -#: parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:682 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "più di un valore predefinito specificato per la colonna \"%s\" della tabella \"%s\"" -#: parser/parse_utilcmd.c:688 +#: parser/parse_utilcmd.c:699 #, c-format msgid "identity columns are not supported on typed tables" msgstr "le colonne identità non sono supportate in tabelle con tipo" -#: parser/parse_utilcmd.c:692 +#: parser/parse_utilcmd.c:703 #, c-format msgid "identity columns are not supported on partitions" msgstr "le colonne identità non sono supportate nelle partizioni" -#: parser/parse_utilcmd.c:701 +#: parser/parse_utilcmd.c:712 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "specifica di identità multipla per la colonna \"%s\" della tabella \"%s\"" -#: parser/parse_utilcmd.c:724 parser/parse_utilcmd.c:823 +#: parser/parse_utilcmd.c:742 +#, c-format +msgid "generated columns are not supported on typed tables" +msgstr "le colonne generate non sono supportate nelle tabelle tipizzate" + +#: parser/parse_utilcmd.c:746 +#, c-format +msgid "generated columns are not supported on partitions" +msgstr "le colonne generate non sono supportate nelle partizioni" + +#: parser/parse_utilcmd.c:751 +#, c-format +msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" +msgstr "clausole di generazione multiple specificate per la colonna \"%s\" della tabella \"%s\"" + +#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:884 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "i vincoli di chiave primaria non sono supportati sulle tabelle esterne" -#: parser/parse_utilcmd.c:733 parser/parse_utilcmd.c:833 +#: parser/parse_utilcmd.c:778 parser/parse_utilcmd.c:894 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "i vincoli di unicità non sono supportati sulle tabelle esterne" -#: parser/parse_utilcmd.c:750 parser/parse_utilcmd.c:863 -#, c-format -msgid "foreign key constraints are not supported on foreign tables" -msgstr "i vincoli di chiave esterna non sono supportati sulle tabelle esterne" - -#: parser/parse_utilcmd.c:778 +#: parser/parse_utilcmd.c:823 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "specificati sia il default che l'identità per la colonna \"%s\" della tabella \"%s\"" -#: parser/parse_utilcmd.c:843 +#: parser/parse_utilcmd.c:831 +#, c-format +msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "sia l'espressione predefinita che quella di generazione specificate per la colonna \"%s\" della tabella \"%s\"" + +#: parser/parse_utilcmd.c:839 +#, c-format +msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "sia l'identità che l'espressione di generazione specificate per la colonna \"%s\" della tabella \"%s\"" + +#: parser/parse_utilcmd.c:904 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "i vincoli esclusione non sono supportati sulle tabelle esterne" -#: parser/parse_utilcmd.c:849 +#: parser/parse_utilcmd.c:910 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "i vincoli esclusione non sono supportati sulle tabelle partizionate" -#: parser/parse_utilcmd.c:913 +#: parser/parse_utilcmd.c:975 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE non è supportato nella creazione di tabelle esterne" -#: parser/parse_utilcmd.c:1518 parser/parse_utilcmd.c:1625 +#: parser/parse_utilcmd.c:988 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "la relazione \"%s\" non è valida nella clausola LIKE" + +#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "L'indice \"%s\" contiene un riferimento all'intera riga della tabella." -#: parser/parse_utilcmd.c:1975 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "non è possibile usare un indice preesistente in CREATE TABLE" -#: parser/parse_utilcmd.c:1995 +#: parser/parse_utilcmd.c:2271 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "l'indice \"%s\" è già associato ad un vincolo" -#: parser/parse_utilcmd.c:2003 -#, c-format -msgid "index \"%s\" does not belong to table \"%s\"" -msgstr "l'indice \"%s\" non appartiene alla tabella \"%s\"" - -#: parser/parse_utilcmd.c:2010 +#: parser/parse_utilcmd.c:2286 #, c-format msgid "index \"%s\" is not valid" msgstr "l'indice \"%s\" non è valido" -#: parser/parse_utilcmd.c:2016 +#: parser/parse_utilcmd.c:2292 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" non è un indice univoco" -#: parser/parse_utilcmd.c:2017 parser/parse_utilcmd.c:2024 -#: parser/parse_utilcmd.c:2031 parser/parse_utilcmd.c:2103 +#: parser/parse_utilcmd.c:2293 parser/parse_utilcmd.c:2300 parser/parse_utilcmd.c:2307 parser/parse_utilcmd.c:2384 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Non è possibile creare una chiave primaria o un vincolo univoco usando tale indice." -#: parser/parse_utilcmd.c:2023 +#: parser/parse_utilcmd.c:2299 #, c-format msgid "index \"%s\" contains expressions" msgstr "l'indice \"%s\" contiene espressioni" -#: parser/parse_utilcmd.c:2030 +#: parser/parse_utilcmd.c:2306 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" è un indice parziale" -#: parser/parse_utilcmd.c:2042 +#: parser/parse_utilcmd.c:2318 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" è un indice deferibile" -#: parser/parse_utilcmd.c:2043 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Non è possibile creare un vincolo non deferibile usando un indice deferibile." -#: parser/parse_utilcmd.c:2102 +#: parser/parse_utilcmd.c:2383 #, c-format -msgid "index \"%s\" does not have default sorting behavior" -msgstr "l'indice \"%s\" non ha un ordinamento predefinito" +msgid "index \"%s\" column number %d does not have default sorting behavior" +msgstr "indice \"%s\" colonna numero %d non ha un comportamento di ordinamento predefinito" -#: parser/parse_utilcmd.c:2251 +#: parser/parse_utilcmd.c:2540 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "la colonna \"%s\" appare due volte nel vincolo di chiave primaria" -#: parser/parse_utilcmd.c:2257 +#: parser/parse_utilcmd.c:2546 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "la colonna \"%s\" appare due volte nel vincolo univoco" -#: parser/parse_utilcmd.c:2580 +#: parser/parse_utilcmd.c:2893 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "le espressioni e i predicati dell'indice possono riferirsi solo alla tabella indicizzata" -#: parser/parse_utilcmd.c:2626 +#: parser/parse_utilcmd.c:2965 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "le espressioni statistiche possono fare riferimento solo alla tabella a cui si fa riferimento" + +#: parser/parse_utilcmd.c:3008 #, c-format msgid "rules on materialized views are not supported" msgstr "le regole sulle viste materializzate non sono supportate" -#: parser/parse_utilcmd.c:2687 +#: parser/parse_utilcmd.c:3071 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "le condizioni WHERE delle regole non possono avere riferimenti ad altre relazioni" -#: parser/parse_utilcmd.c:2759 +#: parser/parse_utilcmd.c:3144 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "le regole con una condizione WHERE possono avere solo azione SELECT, INSERT, UPDATE o DELETE" -#: parser/parse_utilcmd.c:2777 parser/parse_utilcmd.c:2876 -#: rewrite/rewriteHandler.c:498 rewrite/rewriteManip.c:1015 +#: parser/parse_utilcmd.c:3162 parser/parse_utilcmd.c:3263 rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "le istruzioni UNION/INTERSECT/EXCEPT condizionali non sono implementate" -#: parser/parse_utilcmd.c:2795 +#: parser/parse_utilcmd.c:3180 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "la regola ON SELECT non può usare OLD" -#: parser/parse_utilcmd.c:2799 +#: parser/parse_utilcmd.c:3184 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "la regola ON SELECT non può usare NEW" -#: parser/parse_utilcmd.c:2808 +#: parser/parse_utilcmd.c:3193 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "la regola ON INSERT non può usare OLD" -#: parser/parse_utilcmd.c:2814 +#: parser/parse_utilcmd.c:3199 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "La regola ON DELETE non può usare NEW" -#: parser/parse_utilcmd.c:2842 +#: parser/parse_utilcmd.c:3227 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "non ci si può riferire ad OLD nella query WITH" -#: parser/parse_utilcmd.c:2849 +#: parser/parse_utilcmd.c:3234 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "non ci si può riferire a NEW nella query WITH" -#: parser/parse_utilcmd.c:3287 +#: parser/parse_utilcmd.c:3688 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "clausola DEFERRABLE mal posizionata" -#: parser/parse_utilcmd.c:3292 parser/parse_utilcmd.c:3307 +#: parser/parse_utilcmd.c:3693 parser/parse_utilcmd.c:3708 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "clausole DEFERRABLE/NOT DEFERRABLE multiple non consentite" -#: parser/parse_utilcmd.c:3302 +#: parser/parse_utilcmd.c:3703 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "clausola NOT DEFERRABLE mal posizionata" -#: parser/parse_utilcmd.c:3315 parser/parse_utilcmd.c:3341 gram.y:5549 -#, c-format -msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" -msgstr "un vincolo dichiarato INITIALLY DEFERRED dev'essere DEFERRABLE" - -#: parser/parse_utilcmd.c:3323 +#: parser/parse_utilcmd.c:3724 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "clausola INITIALLY DEFERRED mal posizionata" -#: parser/parse_utilcmd.c:3328 parser/parse_utilcmd.c:3354 +#: parser/parse_utilcmd.c:3729 parser/parse_utilcmd.c:3755 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "clausole INITIALLY IMMEDIATE/DEFERRED multiple non sono consentite" -#: parser/parse_utilcmd.c:3349 +#: parser/parse_utilcmd.c:3750 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "clausola INITIALLY IMMEDIATE mal posizionata" -#: parser/parse_utilcmd.c:3540 +#: parser/parse_utilcmd.c:3941 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE specifica uno schema (%s) differente da quello che sta venendo creato (%s)" -#: parser/parse_utilcmd.c:3574 +#: parser/parse_utilcmd.c:3976 +#, c-format +msgid "\"%s\" is not a partitioned table" +msgstr "\"%s\" non è una tabella partizionata" + +#: parser/parse_utilcmd.c:3983 #, c-format msgid "table \"%s\" is not partitioned" msgstr "la tabella \"%s\" non è partizionata" -#: parser/parse_utilcmd.c:3581 +#: parser/parse_utilcmd.c:3990 #, c-format msgid "index \"%s\" is not partitioned" msgstr "l'indice \"%s\" non è partizionato" -#: parser/parse_utilcmd.c:3615 +#: parser/parse_utilcmd.c:4030 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "una tabella partizionata con un hash non può avere una partizione di default" -#: parser/parse_utilcmd.c:3632 +#: parser/parse_utilcmd.c:4047 #, c-format msgid "invalid bound specification for a hash partition" msgstr "specifica di estremità non valida per una partizione su hash" -#: parser/parse_utilcmd.c:3638 partitioning/partbounds.c:2127 +#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4824 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "il modulo per la partizione hash deve essere un intero positivo" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "modulo per la partizione hash deve essere un valore intero maggiore di zero" -#: parser/parse_utilcmd.c:3645 partitioning/partbounds.c:2135 +#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "il resto per la partizione hash deve essere inferiore al modulo" -#: parser/parse_utilcmd.c:3657 +#: parser/parse_utilcmd.c:4073 #, c-format msgid "invalid bound specification for a list partition" msgstr "specifica di estremità non valida per una partizione su lista" -#: parser/parse_utilcmd.c:3713 +#: parser/parse_utilcmd.c:4126 #, c-format msgid "invalid bound specification for a range partition" msgstr "specifica di estremità non valida per una partizione su intervallo" -#: parser/parse_utilcmd.c:3719 +#: parser/parse_utilcmd.c:4132 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM deve specificare esattamente un valore per colonna di partizionamento" -#: parser/parse_utilcmd.c:3723 +#: parser/parse_utilcmd.c:4136 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO deve specificare esattamente un valore per colonna di partizionamento" -#: parser/parse_utilcmd.c:3770 parser/parse_utilcmd.c:3784 +#: parser/parse_utilcmd.c:4250 #, c-format msgid "cannot specify NULL in range bound" msgstr "non si può specificare NULL nel limite di un margine" -#: parser/parse_utilcmd.c:3831 +#: parser/parse_utilcmd.c:4299 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "ogni limite che segue MAXVALUE dev'essere anch'esso MAXVALUE" -#: parser/parse_utilcmd.c:3838 +#: parser/parse_utilcmd.c:4306 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "ogni limite che segue MINVALUE dev'essere anch'esso MINVALUE" -#: parser/parse_utilcmd.c:3869 parser/parse_utilcmd.c:3881 +#: parser/parse_utilcmd.c:4349 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "il valore specificato non può essere trasformato nel tipo %s per la colonna \"%s\"" -#: parser/parse_utilcmd.c:3883 +#: parser/parser.c:247 +msgid "UESCAPE must be followed by a simple string literal" +msgstr "UESCAPE deve essere seguito da una semplice stringa letterale" + +#: parser/parser.c:252 +msgid "invalid Unicode escape character" +msgstr "carattere escape Unicode non valido" + +#: parser/parser.c:321 scan.l:1338 +#, c-format +msgid "invalid Unicode escape value" +msgstr "valore escape Unicode non valido" + +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 +#, c-format +msgid "invalid Unicode escape" +msgstr "escape Unicode non valido" + +#: parser/parser.c:469 #, c-format -msgid "The cast requires a non-immutable conversion." -msgstr "Il cast richiede una conversione non immutabile." +msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." +msgstr "Gli escape Unicode devono essere \\XXXX o \\+XXXXXX." -#: parser/parse_utilcmd.c:3884 +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 utils/adt/varlena.c:6554 #, c-format -msgid "Try putting the literal value in single quotes." -msgstr "Prova a mettere il valore letterale tra apici." +msgid "invalid Unicode surrogate pair" +msgstr "coppia surrogata Unicode non valida" -#: parser/scansup.c:204 +#: parser/scansup.c:101 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "l'identificativo \"%s\" sarà troncato a \"%s\"" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "l'identificatore \"%s\" verrà troncato a \"%.*s\"" -#: partitioning/partbounds.c:331 +#: partitioning/partbounds.c:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "la partizione \"%s\" è in conflitto con la partizione di default esistente \"%s\"" -#: partitioning/partbounds.c:390 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 partitioning/partbounds.c:3026 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "ogni modulo di partizione hash deve essere un fattore del successivo modulo più grande" -#: partitioning/partbounds.c:486 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "Il nuovo modulo %d non è un fattore di %d, il modulo della partizione esistente \"%s\"." + +#: partitioning/partbounds.c:3005 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "Il nuovo modulo %d non è divisibile per %d, il modulo della partizione esistente \"%s\"." + +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "intervallo vuoto specificato come limite per la partizione \"%s\"" -#: partitioning/partbounds.c:488 +#: partitioning/partbounds.c:3142 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Il limite inferiore specificato %s è maggiore o uguale al limite superiore %s." -#: partitioning/partbounds.c:585 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partizione \"%s\" si sovrapporrebbe a \"%s\"" -#: partitioning/partbounds.c:685 +#: partitioning/partbounds.c:3371 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "scansione della tabella esterna \"%s\", che è una partizione della partizione di default \"%s\", saltata" -#: partitioning/partbounds.c:724 +#: partitioning/partbounds.c:4828 #, c-format -msgid "updated partition constraint for default partition \"%s\" would be violated by some row" -msgstr "il nuovo vincolo di partizione per la partizione di default \"%s\" verrebbe violato da alcune righe" - -#: partitioning/partbounds.c:2131 -#, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "il resto per la partizione hash deve essere un intero non negativo" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "il resto per la partizione hash deve essere un valore intero maggiore o uguale a zero" -#: partitioning/partbounds.c:2158 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" non è una tabella partizionata con un hash" -#: partitioning/partbounds.c:2169 partitioning/partbounds.c:2285 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "il numero di colonne di partizionamento (%d) non combacia con il numero di chiavi di partizioni fornito (%d)" -#: partitioning/partbounds.c:2189 partitioning/partbounds.c:2221 +#: partitioning/partbounds.c:4885 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "la colonna %d della chiave di partizione è di tipo %s, ma il valore fornito è di tipo %s" + +#: partitioning/partbounds.c:4917 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "la colonna %d della chiave di partizione ha tipo \"%s\", ma il valore fornito è di tipo \"%s\"" -#: port/pg_shmem.c:196 port/sysv_shmem.c:196 +#: 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 "non è stato possibile ottenere informazioni sulla directory dati \"%s\": %m" + +#: port/pg_shmem.c:227 port/sysv_shmem.c:227 #, c-format msgid "could not create shared memory segment: %m" msgstr "creazione del segmento di memoria condivisa fallita: %m" -#: port/pg_shmem.c:197 port/sysv_shmem.c:197 +#: 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 chiamata di sistema fallita era shmget(key=%lu, size=%zu, 0%o)." -#: port/pg_shmem.c:201 port/sysv_shmem.c:201 +#: 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" @@ -15828,7 +18108,7 @@ msgstr "" "Questo errore di solito vuol dire che la richiesta di PostgreSQL di un segmento di memoria condivisa eccede il valore del parametro SHMMAX del tuo kernel, o anche che sia inferiore del parametro SHMMIN.\n" "La documentazione di PostgreSQL contiene ulteriori informazioni sulla configurazione della memoria condivisa." -#: port/pg_shmem.c:208 port/sysv_shmem.c:208 +#: 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" @@ -15837,7 +18117,7 @@ msgstr "" "Questo errore di solito vuol dire che la richiesta di PostgreSQL di un segmento di memoria condivisa eccede il valore del parametro SHMALL del tuo kernel. Potresti dover riconfigurare il kernel con uno SHMALL più grande.\n" "La documentazione di PostgreSQL contiene ulteriori informazioni sulla configurazione della memoria condivisa." -#: port/pg_shmem.c:214 port/sysv_shmem.c:214 +#: 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" @@ -15846,37 +18126,47 @@ msgstr "" "Questo errore *non* significa che è finito lo spazio su disco. Può succedere se tutti gli ID di memoria condivisa sono stati presi, nel cui caso è necessario aumentare il parametro SHMMNI del tuo kernel, oppure perché il limite globale la memoria condivisa di sistema è stato raggiunto.\n" "La documentazione di PostgreSQL contiene ulteriori informazioni sulla configurazione della memoria condivisa." -#: port/pg_shmem.c:505 port/sysv_shmem.c:505 +#: port/pg_shmem.c:633 port/sysv_shmem.c:633 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "mappatura della memoria condivisa anonima fallita: %m" -#: port/pg_shmem.c:507 port/sysv_shmem.c:507 +#: 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 "Questo errore di solito vuol dire che la richiesta di PostgreSQL di un segmento di memoria condivisa supera la memoria disponibile, lo spazio di swap o le pagine huge. Per ridurre la dimensione richiesta (attualmente %zu byte), riduci l'utilizzo di memoria condivisa di PostgreSQL, ad esempio riducendo shared_buffers o max_connections." -#: port/pg_shmem.c:573 port/sysv_shmem.c:573 +#: port/pg_shmem.c:703 port/sysv_shmem.c:703 #, c-format msgid "huge pages not supported on this platform" msgstr "pagine huge non supportate su questa piattaforma" -#: port/pg_shmem.c:668 port/sysv_shmem.c:668 +#: 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 "pagine enormi non supportate con l'attuale impostazione 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 "il blocco di memoria condivisa preesistente (key %lu, ID %lu) è ancora in uso" + +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 #, c-format -msgid "could not stat data directory \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sulla directory dati \"%s\": %m" +msgid "Terminate any old server processes associated with data directory \"%s\"." +msgstr "Termina tutti i vecchi processi del server associati alla directory dei dati \"%s\"." -#: port/sysv_sema.c:123 +#: port/sysv_sema.c:124 #, c-format msgid "could not create semaphores: %m" msgstr "creazione dei semafori fallita: %m" -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:125 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "La chiamata di sistema fallita era semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:128 +#: port/sysv_sema.c:129 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" @@ -15885,575 +18175,418 @@ msgstr "" "Questo errore *non* significa che è finito lo spazio su disco. Può succedere quando il limite di sistema per il massimo numero di semafori impostati (SEMMNI), oppure il massimo numero di semafori di sistema (SEMMNS), verrebbe superato. È necessario aumentare i rispettivi parametri del kernel. Alternativamente, riduci l'utilizzo di semafori di PostgreSQL riducendo il parametro max_connections.\n" "La documentazione di PostgreSQL contiene più informazioni su come configurare il tuo sistema per PostgreSQL." -#: port/sysv_sema.c:158 +#: port/sysv_sema.c:159 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Potresti dover aumentare il valore SEMVMX del tuo kernel ad almeno %d. Consulta la documentazione di PostgreSQL per ulteriori dettagli." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" msgstr "caricamento di dbghelp.dll fallito, impossibile salvare il crash 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 "caricamento della funzione richiesta in dbghelp.dll fallito, impossibile salvare il crash 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 "apertura del file del crash dump \"%s\" in scrittura fallito: codice errore %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 salvato nel file \"%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 "scrittura del crash dump nel file \"%s\" fallito: codice errore %lu\n" -#: port/win32/signal.c:194 +#: port/win32/signal.c:206 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "creazione della pipe di ascolto dei segnali per il PID %d fallita: codice errore %lu" -#: port/win32/signal.c:274 port/win32/signal.c:306 +#: port/win32/signal.c:261 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "creazione della pipe di ascolto dei segnali fallita: codice errore %lu; sto riprovando\n" -#: port/win32/signal.c:317 -#, c-format -msgid "could not create signal dispatch thread: error code %lu\n" -msgstr "creazione del thread per la distribuzione dei segnali fallita: codice errore %lu\n" - #: port/win32_sema.c:104 #, c-format msgid "could not create semaphore: error code %lu" msgstr "creazione del semaforo fallita: codice errore %lu" -#: port/win32_sema.c:181 +#: port/win32_sema.c:180 #, c-format msgid "could not lock semaphore: error code %lu" msgstr "lock del semaforo fallito: codice errore %lu" -#: port/win32_sema.c:201 +#: port/win32_sema.c:200 #, c-format msgid "could not unlock semaphore: error code %lu" msgstr "unlock del semaforo fallito: codice errore %lu" -#: port/win32_sema.c:231 +#: port/win32_sema.c:230 #, c-format msgid "could not try-lock semaphore: error code %lu" msgstr "try-lock del semaforo fallito: codice errore %lu" -#: port/win32_shmem.c:122 port/win32_shmem.c:130 port/win32_shmem.c:142 -#: port/win32_shmem.c:157 +#: 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 "abilitazione del privilegio Lock Pages fallito: codice di errore %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "impossibile abilitare il diritto utente \"%s\": codice di errore %lu" -#: port/win32_shmem.c:123 port/win32_shmem.c:131 port/win32_shmem.c:143 -#: port/win32_shmem.c:158 +#. 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 "Blocca le pagine in memoria" + +#: 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 "La chiamata di sistema fallita è %s." -#: port/win32_shmem.c:153 +#: port/win32_shmem.c:182 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "abilitazione del privilegio Lock Pages fallito" +msgid "could not enable user right \"%s\"" +msgstr "impossibile abilitare il diritto utente \"%s\"" -#: port/win32_shmem.c:154 +#: port/win32_shmem.c:183 #, c-format -msgid "Assign Lock Pages in Memory user right to the Windows user account which runs PostgreSQL." -msgstr "Assegna il privilegio Lock Pages in Memory all'utente Window che esegue PostgreSQL." +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "Assegna il diritto utente \"%s\" all'account utente di Windows che esegue PostgreSQL." -#: port/win32_shmem.c:210 +#: port/win32_shmem.c:241 #, c-format msgid "the processor does not support large pages" msgstr "il processore non supporta large pages" -#: port/win32_shmem.c:212 port/win32_shmem.c:217 -#, c-format -msgid "disabling huge pages" -msgstr "huge page disabilitate" - -#: port/win32_shmem.c:279 port/win32_shmem.c:315 port/win32_shmem.c:333 +#: 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 "creazione del segmento di memoria condivisa fallito: codice errore %lu" -#: port/win32_shmem.c:280 +#: port/win32_shmem.c:311 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "La funzione di sistema fallita era CreateFileMapping(size=%zu, name=%s)." -#: port/win32_shmem.c:305 +#: port/win32_shmem.c:336 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "blocco di memoria condivisa preesistente ancora in uso" -#: port/win32_shmem.c:306 +#: port/win32_shmem.c:337 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "Controlla se ci sono vecchi processi server ancora in esecuzione ed interrompili." -#: port/win32_shmem.c:316 +#: port/win32_shmem.c:347 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "La chiamata di sistema fallita era DuplicateHandle." -#: port/win32_shmem.c:334 +#: port/win32_shmem.c:365 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "La chiamata di sistema fallita era MapViewOfFileEx." -#: postmaster/autovacuum.c:406 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "fork del processo di esecuzione di autovacuum fallito: %m" -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "esecutore di autovacuum avviato" - -#: postmaster/autovacuum.c:832 +#: postmaster/autovacuum.c:752 #, c-format -msgid "autovacuum launcher shutting down" -msgstr "arresto dell'esecutore di autovacuum" +msgid "autovacuum worker took too long to start; canceled" +msgstr "il lavoratore dell'autovacuum ha impiegato troppo tempo per iniziare; annullato" -#: postmaster/autovacuum.c:1494 +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "fork del processo di lavoro di autovacuum fallito: %m" -#: postmaster/autovacuum.c:1700 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "autovacuum: elaborazione del database \"%s\"" - -#: postmaster/autovacuum.c:2269 +#: postmaster/autovacuum.c:2265 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: eliminazione della tabella temporanea orfana \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2498 +#: postmaster/autovacuum.c:2490 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "pulizia automatica della tabella \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2501 +#: postmaster/autovacuum.c:2493 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "analisi automatica della tabella \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2694 +#: postmaster/autovacuum.c:2686 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processo a lavoro sulla relazione \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3273 +#: postmaster/autovacuum.c:3297 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum non avviato a causa di configurazione errata" -#: postmaster/autovacuum.c:3274 +#: postmaster/autovacuum.c:3298 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Abilita l'opzione \"track_counts\"." -#: postmaster/bgworker.c:395 postmaster/bgworker.c:855 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "registrazione del processo di lavoro in background \"%s\"" - -#: postmaster/bgworker.c:427 +#: postmaster/bgworker.c:256 #, c-format -msgid "unregistering background worker \"%s\"" -msgstr "annullamento registrazione del processo di lavoro in background \"%s\"" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "stato di lavoro in background incoerente (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:592 +#: postmaster/bgworker.c:666 #, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "processo di lavoro in background \"%s\": occorre collegarsi al segmento di memoria per richiedere una connessione al database" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "lavoratore in background \"%s\": i lavoratori in background senza accesso alla memoria condivisa non sono supportati" -#: postmaster/bgworker.c:601 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "processo di lavoro in background \"%s\": non è possibile richiedere accesso al database se avviato all'avvio di postmaster" -#: postmaster/bgworker.c:615 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "processo di lavoro in background \"%s\": intervallo di riavvio non valido" -#: postmaster/bgworker.c:630 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "processo di lavoro in background \"%s\": i worker paralleli non possono essere configurati per il riavvio" -#: postmaster/bgworker.c:674 +#: postmaster/bgworker.c:730 tcop/postgres.c:3203 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "interruzione del processo di lavoro in background \"%s\" a causa di comando amministrativo" -#: postmaster/bgworker.c:863 +#: postmaster/bgworker.c:887 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "processo di lavoro in background \"%s\": deve essere registrato in shared_preload_libraries" -#: postmaster/bgworker.c:875 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "processo di lavoro in background \"%s\": solo i processi dinamici possono richiedere notifiche" -#: postmaster/bgworker.c:890 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "troppi processi di lavoro in background" -#: postmaster/bgworker.c:891 +#: 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] "Le impostazioni correnti consentono la registrazione di un massimo di %d processi di lavoro in background." msgstr[1] "Le impostazioni correnti consentono la registrazione di un massimo di %d processi di lavoro in background." -#: postmaster/bgworker.c:895 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Considera di incrementare il parametro di configurazione \"max_worker_processes\"." -#: postmaster/checkpointer.c:464 +#: 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] "i checkpoint stanno avvenendo troppo frequentemente (a distanza di %d secondo)" msgstr[1] "i checkpoint stanno avvenendo troppo frequentemente (a distanza di %d secondi)" -#: postmaster/checkpointer.c:468 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Considera di incrementare il parametro di configurazione \"max_wal_size\"." -#: postmaster/checkpointer.c:1082 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "richiesta di checkpoint fallita" -#: postmaster/checkpointer.c:1083 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Consulta i messaggi recenti nel log del server per i dettagli." -#: postmaster/checkpointer.c:1278 +#: postmaster/pgarch.c:429 #, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "coda di richieste di fsync ridotta da %d a %d elementi" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode abilitato, ma l'archiviazione non è configurata" -#: postmaster/pgarch.c:148 +#: postmaster/pgarch.c:451 #, c-format -msgid "could not fork archiver: %m" -msgstr "non è possibile fare un fork dell'archiver: %m" +msgid "removed orphan archive status file \"%s\"" +msgstr "rimosso il file di stato dell'archivio orfano \"%s\"" -#: postmaster/pgarch.c:456 +#: postmaster/pgarch.c:461 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode abilitato, ma archive_command non è impostato" +msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" +msgstr "rimozione del file di stato dell'archivio orfano \"%s\" non riuscita troppe volte, riproverò più tardi" -#: postmaster/pgarch.c:484 +#: postmaster/pgarch.c:497 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "archiviazione del file di log write-ahead \"%s\" fallita troppe volte, verrà riprovato più tardi" -#: postmaster/pgarch.c:587 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "comando di archiviazione fallito con codice di uscita %d" - -#: postmaster/pgarch.c:589 postmaster/pgarch.c:599 postmaster/pgarch.c:606 -#: postmaster/pgarch.c:612 postmaster/pgarch.c:621 -#, c-format -msgid "The failed archive command was: %s" -msgstr "Il comando di archiviazione fallito era: %s" - -#: postmaster/pgarch.c:596 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "comando di archiviazione terminato da eccezione 0x%X" - -#: postmaster/pgarch.c:598 postmaster/postmaster.c:3567 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Consulta il file include C \"ntstatus.h\" per una spiegazione del valore esadecimale." - -#: postmaster/pgarch.c:603 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "comando di archiviazione terminato dal segnale %d: %s" - -#: postmaster/pgarch.c:610 -#, c-format -msgid "archive command was terminated by signal %d" -msgstr "comando di archiviazione terminato dal segnale %d" - -#: postmaster/pgarch.c:619 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "processo di archiviazione uscito con stato sconosciuto %d" - -#: postmaster/pgstat.c:395 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "risoluzione di \"localhost\" fallita: %s" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "si sta tentando di usare un diverso indirizzo per il raccoglitore di statistiche" - -#: postmaster/pgstat.c:427 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "creazione del socket per il raccoglitore di statistiche fallita: %m" - -#: postmaster/pgstat.c:439 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "bind del socket per il raccoglitore di statistiche fallito: %m" - -#: postmaster/pgstat.c:450 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "non è stato possibile ottenere l'indirizzo del socket per il raccoglitore di statistiche: %m" - -#: postmaster/pgstat.c:466 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "connessione al socket per il raccoglitore statistiche fallita: %m" - -#: postmaster/pgstat.c:487 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "invio del messaggio di prova al socket per il raccoglitore di statistiche fallito: %m" - -#: postmaster/pgstat.c:513 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() fallita nel raccoglitore di statistiche: %m" - -#: postmaster/pgstat.c:528 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "il messaggio di prova non ha raggiunto il socket per il raccoglitore di statistiche" - -#: postmaster/pgstat.c:543 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "ricezione del messaggio di prova sul socket per il raccoglitore di statistiche fallito: %m" - -#: postmaster/pgstat.c:553 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "trasmissione errata del messaggio di prova per il raccoglitore di statistiche" - -#: postmaster/pgstat.c:576 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "impostazione del socket per il raccoglitore di statistiche in modalità non bloccante fallita: %m" - -#: postmaster/pgstat.c:615 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "raccoglitore di statistiche disabilitato per mancanza di un socket funzionante" - -#: postmaster/pgstat.c:762 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "fork del raccoglitore di statistiche fallito: %m" - -#: postmaster/pgstat.c:1342 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "destinazione di reset sconosciuta: \"%s\"" - -#: postmaster/pgstat.c:1343 -#, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "La destinazione deve essere \"archiver\" o \"bgwriter\"." - -#: postmaster/pgstat.c:4362 -#, c-format -msgid "could not read statistics message: %m" -msgstr "lettura del messaggio delle statistiche fallito: %m" - -#: postmaster/pgstat.c:4694 postmaster/pgstat.c:4851 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "apertura del file temporaneo delle statistiche \"%s\" fallita: %m" - -#: postmaster/pgstat.c:4761 postmaster/pgstat.c:4896 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "scrittura del file temporaneo delle statistiche \"%s\" fallita: %m" - -#: postmaster/pgstat.c:4770 postmaster/pgstat.c:4905 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "chiusura del file temporaneo delle statistiche \"%s\" fallita: %m" - -#: postmaster/pgstat.c:4778 postmaster/pgstat.c:4913 -#, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "non è stato possibile rinominare il file temporaneo delle statistiche \"%s\" in \"%s\": %m" - -#: postmaster/pgstat.c:5002 postmaster/pgstat.c:5208 postmaster/pgstat.c:5361 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "apertura del file delle statistiche \"%s\" fallita: %m" - -#: postmaster/pgstat.c:5014 postmaster/pgstat.c:5024 postmaster/pgstat.c:5045 -#: postmaster/pgstat.c:5067 postmaster/pgstat.c:5082 postmaster/pgstat.c:5145 -#: postmaster/pgstat.c:5220 postmaster/pgstat.c:5240 postmaster/pgstat.c:5258 -#: postmaster/pgstat.c:5274 postmaster/pgstat.c:5292 postmaster/pgstat.c:5308 -#: postmaster/pgstat.c:5373 postmaster/pgstat.c:5385 postmaster/pgstat.c:5397 -#: postmaster/pgstat.c:5422 postmaster/pgstat.c:5444 +#: postmaster/pgarch.c:809 #, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "file delle statistiche corrotto \"%s\"" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "riavvio del processo di archiviazione perché il valore di \"archive_library\" è stato modificato" -#: postmaster/pgstat.c:5573 +#: postmaster/pgarch.c:842 #, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "verranno utilizzate statistiche vecchie invece di quelle correnti perché il processo di raccolta statistiche non risponde" +msgid "archive modules have to define the symbol %s" +msgstr "i moduli di archivio devono definire il simbolo %s" -#: postmaster/pgstat.c:5900 +#: postmaster/pgarch.c:848 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "tabella hash del database corrotta durante la pulizia --- interruzione" +msgid "archive modules must register an archive callback" +msgstr "i moduli di archivio devono registrare una richiamata di archivio" -#: postmaster/postmaster.c:717 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: argomento non valido per l'opzione -f: \"%s\"\n" -#: postmaster/postmaster.c:803 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: argomento non valido per l'opzione -t: \"%s\"\n" -#: postmaster/postmaster.c:854 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: argomento non valido: \"%s\"\n" -#: postmaster/postmaster.c:896 +#: postmaster/postmaster.c:942 #, c-format -msgid "%s: superuser_reserved_connections (%d) plus max_wal_senders (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d) più max_wal_senders (%d) dev'essere meno di max_connections (%d)\n" +msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" +msgstr "%s: superuser_reserved_connections (%d) deve essere inferiore a max_connections (%d)\n" -#: postmaster/postmaster.c:903 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "l'archiviazione dei WAL non può essere attivata quando wal_level è \"minimal\"" -#: postmaster/postmaster.c:906 +#: postmaster/postmaster.c:952 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "lo streaming WAL (max_wal_senders > 0) richiede wal_level \"replica\" oppure \"logical\"" -#: postmaster/postmaster.c:914 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: datetoken tables non valido, per favore correggilo\n" -#: postmaster/postmaster.c:1028 postmaster/postmaster.c:1126 -#: utils/init/miscinit.c:1555 +#: postmaster/postmaster.c:1113 +#, c-format +msgid "could not create I/O completion port for child queue" +msgstr "creazione della porta di completamento I/O per la coda dei figli fallita" + +#: postmaster/postmaster.c:1178 +#, c-format +msgid "ending log output to stderr" +msgstr "terminazione dell'output del log su stderr" + +#: postmaster/postmaster.c:1179 +#, c-format +msgid "Future log output will go to log destination \"%s\"." +msgstr "L'output dei prossimi log andrà su \"%s\"." + +#: postmaster/postmaster.c:1190 +#, c-format +msgid "starting %s" +msgstr "a partire da %s" + +#: postmaster/postmaster.c:1219 postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "sintassi di lista non valida nel parametro \"%s\"" -#: postmaster/postmaster.c:1059 +#: postmaster/postmaster.c:1250 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "creazione del socket di ascolto per \"%s\" fallita" -#: postmaster/postmaster.c:1065 +#: postmaster/postmaster.c:1256 #, c-format msgid "could not create any TCP/IP sockets" msgstr "non è stato possibile creare alcun socket TCP/IP" -#: postmaster/postmaster.c:1148 +#: postmaster/postmaster.c:1288 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister() non riuscito: codice di errore %ld" + +#: postmaster/postmaster.c:1340 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "creazione del socket di dominio Unix fallita nella directory \"%s\"" -#: postmaster/postmaster.c:1154 +#: postmaster/postmaster.c:1346 #, c-format msgid "could not create any Unix-domain sockets" msgstr "creazione del socket di dominio Unix fallita" -#: postmaster/postmaster.c:1166 +#: postmaster/postmaster.c:1358 #, c-format msgid "no socket created for listening" msgstr "nessun socket per l'ascolto è stato creato" -#: postmaster/postmaster.c:1206 -#, c-format -msgid "could not create I/O completion port for child queue" -msgstr "creazione della porta di completamento I/O per la coda dei figli fallita" - -#: postmaster/postmaster.c:1235 +#: postmaster/postmaster.c:1389 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: modifica dei permessi del file PID esterno \"%s\" fallita: %s\n" -#: postmaster/postmaster.c:1239 +#: postmaster/postmaster.c:1393 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: scrittura del file PID esterno \"%s\" fallita: %s\n" -#: postmaster/postmaster.c:1296 -#, c-format -msgid "ending log output to stderr" -msgstr "terminazione dell'output del log su stderr" - -#: postmaster/postmaster.c:1297 -#, c-format -msgid "Future log output will go to log destination \"%s\"." -msgstr "L'output dei prossimi log andrà su \"%s\"." - -#: postmaster/postmaster.c:1323 utils/init/postinit.c:214 +#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "caricamento di pg_hba.conf fallito" -#: postmaster/postmaster.c:1349 +#: postmaster/postmaster.c:1446 #, c-format msgid "postmaster became multithreaded during startup" msgstr "il postmaster è diventato multithread durante l'avvio" -#: postmaster/postmaster.c:1350 +#: postmaster/postmaster.c:1447 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Imposta la variabile d'ambiente LC_ALL non corrisponde ad un locale valido." -#: postmaster/postmaster.c:1455 +#: postmaster/postmaster.c:1548 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: impossibile individuare il mio percorso eseguibile" + +#: postmaster/postmaster.c:1555 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: eseguibile postgres corrispondente non trovato" -#: postmaster/postmaster.c:1478 utils/misc/tzparser.c:341 +#: 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 "Questo potrebbe indicare una installazione di PostgreSQL incompleta, o che il file \"%s\" sia stato spostato dalla sua posizione corretta." -#: postmaster/postmaster.c:1505 +#: postmaster/postmaster.c:1605 #, c-format msgid "" "%s: could not find the database system\n" @@ -16464,3011 +18597,3383 @@ msgstr "" "Sarebbe dovuto essere nella directory \"%s\",\n" "ma l'apertura del file \"%s\" è fallita: %s\n" -#: postmaster/postmaster.c:1682 +#: postmaster/postmaster.c:1782 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() fallita in postmaster: %m" -#: postmaster/postmaster.c:1837 +#: postmaster/postmaster.c:1913 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "rilasciare SIGKILL ai bambini recalcitranti" + +#: postmaster/postmaster.c:1934 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "arresto immediato perché il file di lock della directory dati non è valido" -#: postmaster/postmaster.c:1915 postmaster/postmaster.c:1946 +#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 #, c-format msgid "incomplete startup packet" msgstr "pacchetto di avvio incompleto" -#: postmaster/postmaster.c:1927 +#: postmaster/postmaster.c:2049 #, c-format msgid "invalid length of startup packet" msgstr "dimensione del pacchetto di avvio non valida" -#: postmaster/postmaster.c:1985 +#: postmaster/postmaster.c:2104 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "invio della risposta di negoziazione SSL fallito: %m" -#: postmaster/postmaster.c:2011 +#: postmaster/postmaster.c:2122 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "ricevuto dati non crittografati dopo la richiesta SSL" + +#: 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 "Potrebbe trattarsi di un bug del software client o della prova di un tentativo di attacco man-in-the-middle." + +#: postmaster/postmaster.c:2148 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "impossibile inviare la risposta di negoziazione GSSAPI: %m" + +#: postmaster/postmaster.c:2166 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "ricevuto dati non crittografati dopo la richiesta di crittografia GSSAPI" + +#: postmaster/postmaster.c:2190 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "protocollo frontend non supportato %u.%u: il server supporta da %u.0 a %u.%u" -#: postmaster/postmaster.c:2075 utils/misc/guc.c:6004 utils/misc/guc.c:6097 -#: utils/misc/guc.c:7423 utils/misc/guc.c:10186 utils/misc/guc.c:10220 +#: postmaster/postmaster.c:2254 utils/misc/guc.c:7410 utils/misc/guc.c:7446 utils/misc/guc.c:7516 utils/misc/guc.c:8947 utils/misc/guc.c:11980 utils/misc/guc.c:12021 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valore non valido per il parametro \"%s\": \"%s\"" -#: postmaster/postmaster.c:2078 +#: postmaster/postmaster.c:2257 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "I valori validi sono: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2108 +#: postmaster/postmaster.c:2302 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "formato del pacchetto di avvio non valido: atteso il terminatore all'ultimo byte" -#: postmaster/postmaster.c:2146 +#: postmaster/postmaster.c:2319 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "nessun utente PostgreSQL specificato nel pacchetto di avvio" -#: postmaster/postmaster.c:2205 +#: postmaster/postmaster.c:2383 #, c-format msgid "the database system is starting up" msgstr "il database si sta avviando" -#: postmaster/postmaster.c:2210 +#: postmaster/postmaster.c:2389 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "il sistema di database non accetta ancora connessioni" + +#: postmaster/postmaster.c:2390 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Lo stato di ripristino coerente non è stato ancora raggiunto." + +#: postmaster/postmaster.c:2394 +#, c-format +msgid "the database system is not accepting connections" +msgstr "il sistema di database non accetta connessioni" + +#: postmaster/postmaster.c:2395 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "La modalità standby a caldo è disabilitata." + +#: postmaster/postmaster.c:2400 #, c-format msgid "the database system is shutting down" msgstr "il database si sta spegnendo" -#: postmaster/postmaster.c:2215 +#: postmaster/postmaster.c:2405 #, c-format msgid "the database system is in recovery mode" msgstr "il database è in modalità di ripristino" -#: postmaster/postmaster.c:2220 storage/ipc/procarray.c:292 -#: storage/ipc/sinvaladt.c:298 storage/lmgr/proc.c:339 +#: postmaster/postmaster.c:2410 storage/ipc/procarray.c:479 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "spiacente, troppi client già connessi" -#: postmaster/postmaster.c:2310 +#: postmaster/postmaster.c:2497 #, c-format msgid "wrong key in cancel request for process %d" msgstr "chiave sbagliata nella richiesta di annullamento per il processo %d" -#: postmaster/postmaster.c:2318 +#: postmaster/postmaster.c:2509 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "il PID %d nella richiesta di annullamento non corrisponde ad alcun processo" -#: postmaster/postmaster.c:2529 +#: postmaster/postmaster.c:2763 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP ricevuto, sto ricaricando i file di configurazione" -#: postmaster/postmaster.c:2554 -#, c-format -msgid "pg_hba.conf was not reloaded" -msgstr "pg_hba.conf non è stato ricaricato" - -#: postmaster/postmaster.c:2558 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:2787 postmaster/postmaster.c:2791 #, c-format -msgid "pg_ident.conf was not reloaded" -msgstr "pg_ident.conf non è stato ricaricato" +msgid "%s was not reloaded" +msgstr "%s non è stato ricaricato" -#: postmaster/postmaster.c:2568 +#: postmaster/postmaster.c:2801 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configurazione SSL non è stata ricaricata" -#: postmaster/postmaster.c:2616 +#: postmaster/postmaster.c:2857 #, c-format msgid "received smart shutdown request" msgstr "richiesta di arresto smart ricevuta" -#: postmaster/postmaster.c:2674 +#: postmaster/postmaster.c:2898 #, c-format msgid "received fast shutdown request" msgstr "richiesta di arresto fast ricevuta" -#: postmaster/postmaster.c:2707 +#: postmaster/postmaster.c:2916 #, c-format msgid "aborting any active transactions" msgstr "interruzione di tutte le transazioni attive" -#: postmaster/postmaster.c:2741 +#: postmaster/postmaster.c:2940 #, c-format msgid "received immediate shutdown request" msgstr "richiesta di arresto immediate ricevuta" -#: postmaster/postmaster.c:2808 +#: postmaster/postmaster.c:3017 #, c-format msgid "shutdown at recovery target" msgstr "arresto alla destinazione di recupero" -#: postmaster/postmaster.c:2824 postmaster/postmaster.c:2847 +#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 msgid "startup process" msgstr "avvio del processo" -#: postmaster/postmaster.c:2827 +#: postmaster/postmaster.c:3038 #, c-format msgid "aborting startup due to startup process failure" msgstr "avvio interrotto a causa del fallimento del processo di avvio" -#: postmaster/postmaster.c:2888 +#: postmaster/postmaster.c:3111 #, c-format msgid "database system is ready to accept connections" msgstr "il database è pronto ad accettare connessioni" -#: postmaster/postmaster.c:2909 +#: postmaster/postmaster.c:3132 msgid "background writer process" msgstr "processo di scrittura in background" -#: postmaster/postmaster.c:2963 +#: postmaster/postmaster.c:3179 msgid "checkpointer process" msgstr "processo di creazione checkpoint" -#: postmaster/postmaster.c:2979 +#: postmaster/postmaster.c:3195 msgid "WAL writer process" msgstr "processo di scrittura WAL" -#: postmaster/postmaster.c:2994 +#: postmaster/postmaster.c:3210 msgid "WAL receiver process" msgstr "processo di ricezione WAL" -#: postmaster/postmaster.c:3009 +#: postmaster/postmaster.c:3225 msgid "autovacuum launcher process" msgstr "processo del lanciatore di autovacuum" -#: postmaster/postmaster.c:3024 +#: postmaster/postmaster.c:3243 msgid "archiver process" msgstr "processo di archiviazione" -#: postmaster/postmaster.c:3040 -msgid "statistics collector process" -msgstr "processo del raccoglitore di statistiche" - -#: postmaster/postmaster.c:3054 +#: postmaster/postmaster.c:3256 msgid "system logger process" msgstr "processo del logger di sistema" -#: postmaster/postmaster.c:3116 +#: postmaster/postmaster.c:3320 #, c-format msgid "background worker \"%s\"" msgstr "processo di lavoro in background \"%s\"" -#: postmaster/postmaster.c:3200 postmaster/postmaster.c:3220 -#: postmaster/postmaster.c:3227 postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3399 postmaster/postmaster.c:3419 postmaster/postmaster.c:3426 postmaster/postmaster.c:3444 msgid "server process" msgstr "processo del server" -#: postmaster/postmaster.c:3299 +#: postmaster/postmaster.c:3498 #, c-format msgid "terminating any other active server processes" msgstr "interruzione di tutti gli altri processi attivi del server" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3555 +#: postmaster/postmaster.c:3735 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) è uscito con codice di uscita %d" -#: postmaster/postmaster.c:3557 postmaster/postmaster.c:3568 -#: postmaster/postmaster.c:3579 postmaster/postmaster.c:3588 -#: postmaster/postmaster.c:3598 +#: 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 "Il processo fallito stava eseguendo: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3565 +#: postmaster/postmaster.c:3746 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) è stato terminato dall'eccezione 0x%X" -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3575 +#: postmaster/postmaster.c:3748 postmaster/shell_archive.c:132 #, c-format -msgid "%s (PID %d) was terminated by signal %d: %s" -msgstr "%s (PID %d) è stato terminato dal segnale %d: %s" +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Consulta il file include C \"ntstatus.h\" per una spiegazione del valore esadecimale." #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3586 +#: postmaster/postmaster.c:3756 #, c-format -msgid "%s (PID %d) was terminated by signal %d" -msgstr "%s (PID %d) è stato terminato dal segnale %d" +msgid "%s (PID %d) was terminated by signal %d: %s" +msgstr "%s (PID %d) è stato terminato dal segnale %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3596 +#: postmaster/postmaster.c:3768 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) uscito con stato sconosciuto %d" -#: postmaster/postmaster.c:3783 +#: postmaster/postmaster.c:3968 #, c-format msgid "abnormal database system shutdown" msgstr "spegnimento anormale del database" -#: postmaster/postmaster.c:3823 +#: postmaster/postmaster.c:3994 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "chiusura a causa di un errore del processo di avvio" + +#: postmaster/postmaster.c:4000 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "chiusura perché restart_after_crash è disattivato" + +#: postmaster/postmaster.c:4012 #, c-format msgid "all server processes terminated; reinitializing" msgstr "tutti i processi server sono terminati; re-inizializzazione" -#: postmaster/postmaster.c:3993 postmaster/postmaster.c:5418 -#: postmaster/postmaster.c:5782 +#: postmaster/postmaster.c:4184 postmaster/postmaster.c:5520 postmaster/postmaster.c:5918 #, c-format msgid "could not generate random cancel key" msgstr "generazione della chiave di annullamento casuale fallita" -#: postmaster/postmaster.c:4047 +#: postmaster/postmaster.c:4246 #, c-format msgid "could not fork new process for connection: %m" msgstr "fork del nuovo processo per la connessione fallito: %m" -#: postmaster/postmaster.c:4089 +#: postmaster/postmaster.c:4288 msgid "could not fork new process for connection: " msgstr "fork del nuovo processo per la connessione fallito: " -#: postmaster/postmaster.c:4203 +#: postmaster/postmaster.c:4394 #, c-format msgid "connection received: host=%s port=%s" msgstr "connessione ricevuta: host=%s porta=%s" -#: postmaster/postmaster.c:4208 +#: postmaster/postmaster.c:4399 #, c-format msgid "connection received: host=%s" msgstr "connessione ricevuta: host=%s" -#: postmaster/postmaster.c:4493 +#: postmaster/postmaster.c:4636 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "esecuzione del processo del server \"%s\" fallita: %m" -#: postmaster/postmaster.c:4646 +#: postmaster/postmaster.c:4694 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "impossibile creare la mappatura del file dei parametri di backend: codice di errore %lu" + +#: postmaster/postmaster.c:4703 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "impossibile mappare la memoria dei parametri di back-end: codice di errore %lu" + +#: postmaster/postmaster.c:4730 +#, c-format +msgid "subprocess command line too long" +msgstr "riga di comando del sottoprocesso troppo lunga" + +#: postmaster/postmaster.c:4748 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "Chiamata CreateProcess() non riuscita: %m (codice errore %lu)" + +#: postmaster/postmaster.c:4775 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "impossibile annullare la mappatura della vista del file dei parametri di back-end: codice di errore %lu" + +#: postmaster/postmaster.c:4779 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "impossibile chiudere l'handle nel file dei parametri di back-end: codice di errore %lu" + +#: postmaster/postmaster.c:4801 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "mi sono arreso dopo troppi tentativi di riservare memoria condivisa" -#: postmaster/postmaster.c:4647 +#: postmaster/postmaster.c:4802 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Ciò potrebbe essere causato da ASLR o software antivirus." -#: postmaster/postmaster.c:4858 +#: postmaster/postmaster.c:4983 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "errore nel caricamento della configurazione SSL nel processo figlio" -#: postmaster/postmaster.c:4990 +#: postmaster/postmaster.c:5108 #, c-format -msgid "Please report this to ." -msgstr "Per favore segnala questo problema a ." +msgid "Please report this to <%s>." +msgstr "Segnalalo a <%s>." -#: postmaster/postmaster.c:5077 +#: postmaster/postmaster.c:5180 #, c-format -msgid "database system is ready to accept read only connections" -msgstr "il database è pronto ad accettare connessioni in sola lettura" +msgid "database system is ready to accept read-only connections" +msgstr "il sistema di database è pronto per accettare connessioni di sola lettura" -#: postmaster/postmaster.c:5346 +#: postmaster/postmaster.c:5444 #, c-format msgid "could not fork startup process: %m" msgstr "fork del processo di avvio fallito: %m" -#: postmaster/postmaster.c:5350 +#: postmaster/postmaster.c:5448 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "impossibile eseguire il fork del processo dell'archiviatore: %m" + +#: postmaster/postmaster.c:5452 #, c-format msgid "could not fork background writer process: %m" msgstr "fork del processo di scrittura in background fallito: %m" -#: postmaster/postmaster.c:5354 +#: postmaster/postmaster.c:5456 #, c-format msgid "could not fork checkpointer process: %m" msgstr "fork del processo di creazione dei checkpoint fallito: %m" -#: postmaster/postmaster.c:5358 +#: postmaster/postmaster.c:5460 #, c-format msgid "could not fork WAL writer process: %m" msgstr "fork del processo di scrittura dei WAL fallito: %m" -#: postmaster/postmaster.c:5362 +#: postmaster/postmaster.c:5464 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "fork del processo di ricezione dei WAL fallito: %m" -#: postmaster/postmaster.c:5366 +#: postmaster/postmaster.c:5468 #, c-format msgid "could not fork process: %m" msgstr "fork del processo fallito: %m" -#: postmaster/postmaster.c:5553 postmaster/postmaster.c:5576 +#: postmaster/postmaster.c:5669 postmaster/postmaster.c:5696 #, c-format msgid "database connection requirement not indicated during registration" msgstr "requisiti di connessione a database non indicati durante la registrazione" -#: postmaster/postmaster.c:5560 postmaster/postmaster.c:5583 +#: postmaster/postmaster.c:5680 postmaster/postmaster.c:5707 #, c-format msgid "invalid processing mode in background worker" msgstr "modalità di processo non valida nel processo di lavoro in background" -#: postmaster/postmaster.c:5655 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "avvio del processo di lavoro in background \"%s\"" - -#: postmaster/postmaster.c:5667 +#: postmaster/postmaster.c:5792 #, c-format msgid "could not fork worker process: %m" msgstr "fork del processo di lavoro in background fallito: %m" -#: postmaster/postmaster.c:6100 +#: postmaster/postmaster.c:5904 +#, c-format +msgid "no slot available for new worker process" +msgstr "nessuno slot disponibile per il nuovo processo di lavoro" + +#: postmaster/postmaster.c:6235 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "duplicazione del socket %d da usare nel backend fallita: codice errore %d" -#: postmaster/postmaster.c:6132 +#: postmaster/postmaster.c:6267 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "creazione del socket ereditato fallita: codice errore %d\n" -#: postmaster/postmaster.c:6161 +#: postmaster/postmaster.c:6296 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "apertura del file delle variabili del backend \"%s\" fallita: %s\n" -#: postmaster/postmaster.c:6168 +#: postmaster/postmaster.c:6303 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "lettura dal file delle variabili del backend \"%s\" fallita: %s\n" -#: postmaster/postmaster.c:6177 +#: postmaster/postmaster.c:6312 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "rimozione del file \"%s\" fallita: %s\n" -#: postmaster/postmaster.c:6194 +#: postmaster/postmaster.c:6329 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "non è stato possibile mappare la vista delle variabili del backend: codice errore %lu\n" -#: postmaster/postmaster.c:6203 +#: postmaster/postmaster.c:6338 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "non è stato possibile rimuovere la mappa della vista delle variabili del backend: codice errore %lu\n" -#: postmaster/postmaster.c:6210 +#: postmaster/postmaster.c:6345 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "chiusura dell'handle dei parametri variabili del backend fallita: codice errore %lu\n" -#: postmaster/postmaster.c:6371 +#: postmaster/postmaster.c:6519 #, c-format msgid "could not read exit code for process\n" msgstr "lettura del codice di uscita del processo fallita\n" -#: postmaster/postmaster.c:6376 +#: postmaster/postmaster.c:6524 #, c-format msgid "could not post child completion status\n" msgstr "invio dello stato di completamento del figlio fallito\n" -#: postmaster/syslogger.c:470 postmaster/syslogger.c:1146 +#: postmaster/shell_archive.c:121 #, c-format -msgid "could not read from logger pipe: %m" -msgstr "lettura dalla pipe del logger fallita: %m" +msgid "archive command failed with exit code %d" +msgstr "comando di archiviazione fallito con codice di uscita %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 "Il comando di archiviazione fallito era: %s" + +#: postmaster/shell_archive.c:130 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "comando di archiviazione terminato da eccezione 0x%X" + +#: postmaster/shell_archive.c:137 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "comando di archiviazione terminato dal segnale %d: %s" + +#: postmaster/shell_archive.c:146 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "processo di archiviazione uscito con stato sconosciuto %d" -#: postmaster/syslogger.c:520 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "logger shutting down" -msgstr "spegnimento del logger" +msgid "could not read from logger pipe: %m" +msgstr "lettura dalla pipe del logger fallita: %m" -#: postmaster/syslogger.c:564 postmaster/syslogger.c:578 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format msgid "could not create pipe for syslog: %m" msgstr "creazione della pipe per il syslog fallita: %m" -#: postmaster/syslogger.c:629 +#: postmaster/syslogger.c:677 #, c-format msgid "could not fork system logger: %m" msgstr "fork del logger di sistema fallito: %m" -#: postmaster/syslogger.c:665 +#: postmaster/syslogger.c:713 #, c-format msgid "redirecting log output to logging collector process" msgstr "redirezione dell'output ti log al processo di raccolta dei log" -#: postmaster/syslogger.c:666 +#: postmaster/syslogger.c:714 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "I prossimi output di log appariranno nella directory \"%s\"." -#: postmaster/syslogger.c:674 +#: postmaster/syslogger.c:722 #, c-format msgid "could not redirect stdout: %m" msgstr "redirezione di stdout fallita: %m" -#: postmaster/syslogger.c:679 postmaster/syslogger.c:696 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format msgid "could not redirect stderr: %m" msgstr "redirezione di stderr fallita: %m" -#: postmaster/syslogger.c:1101 +#: postmaster/syslogger.c:1177 #, c-format msgid "could not write to log file: %s\n" msgstr "scrittura nel file di log fallita: %s\n" -#: postmaster/syslogger.c:1218 +#: postmaster/syslogger.c:1295 #, c-format msgid "could not open log file \"%s\": %m" msgstr "apertura del file di log \"%s\" fallita: %m" -#: postmaster/syslogger.c:1280 postmaster/syslogger.c:1330 -#, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "rotazione automatica disabilitata (usa SIGHUP per abilitarla di nuovo)" - -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "non è stato possibile determinare quale ordinamento usare per le espressioni regolari" - -#: replication/basebackup.c:336 -#, c-format -msgid "could not stat control file \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sul file di controllo \"%s\": %m" - -#: replication/basebackup.c:443 -#, c-format -msgid "could not find any WAL files" -msgstr "nessun file WAL trovato" - -#: replication/basebackup.c:457 replication/basebackup.c:472 -#: replication/basebackup.c:481 -#, c-format -msgid "could not find WAL file \"%s\"" -msgstr "file WAL \"%s\" non trovato" - -#: replication/basebackup.c:523 replication/basebackup.c:551 -#, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "dimensione inaspettata del file WAL \"%s\"" - -#: replication/basebackup.c:537 replication/basebackup.c:1529 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "invio dati da parte del backup di base fallito, backup interrotto" - -#: replication/basebackup.c:609 -#, c-format -msgid "%s total checksum verification failures" -msgstr "%s fallimenti di verifica checksum totale" - -#: replication/basebackup.c:613 -#, c-format -msgid "checksum verification failure during base backup" -msgstr "fallimento verifica checksum durante il backup di base" - -#: replication/basebackup.c:657 replication/basebackup.c:666 -#: replication/basebackup.c:675 replication/basebackup.c:684 -#: replication/basebackup.c:693 replication/basebackup.c:704 -#: replication/basebackup.c:721 replication/basebackup.c:730 -#, c-format -msgid "duplicate option \"%s\"" -msgstr "opzione duplicata \"%s\"" - -#: replication/basebackup.c:710 utils/misc/guc.c:6014 -#, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d non è compreso nell'intervallo di validità del il parametro \"%s\" (%d .. %d)" - -#: replication/basebackup.c:984 replication/basebackup.c:1154 -#, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m" - -#: replication/basebackup.c:1309 -#, c-format -msgid "skipping special file \"%s\"" -msgstr "file speciale \"%s\" saltato" - -#: replication/basebackup.c:1414 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "segmento numero %d non valido nel file \"%s\"" - -#: replication/basebackup.c:1433 -#, c-format -msgid "cannot verify checksum in file \"%s\", block %d: read buffer size %d and page size %d differ" -msgstr "impossibile verificare il checksum nel file \"%s\", blocco %d: la dimensione del buffer di lettura %d e la dimensione della pagina %d sono diverse" - -#: replication/basebackup.c:1477 replication/basebackup.c:1493 +#: postmaster/syslogger.c:1385 #, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "errore nell'fseek nel file \"%s\": %m" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "rotazione automatica disabilitata (usa SIGHUP per abilitarla di nuovo)" -#: replication/basebackup.c:1485 +#: regex/regc_pg_locale.c:242 #, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "errore nella rilettura del blocco %d del file \"%s\": %m" +msgid "could not determine which collation to use for regular expression" +msgstr "non è stato possibile determinare quale ordinamento usare per le espressioni regolari" -#: replication/basebackup.c:1509 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "checksum verification failed in file \"%s\", block %d: calculated %X but expected %X" -msgstr "checksum di verifica fallito nel file \"%s\", blocco %d: calcolato %X ma atteso %X" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "le regole di confronto non deterministiche non sono supportate per le espressioni regolari" -#: replication/basebackup.c:1516 +#: repl_gram.y:303 repl_gram.y:335 #, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "ulteriori fallimenti del checksum di verifica nel file \"%s\" non verranno riportati" +msgid "invalid timeline %u" +msgstr "timeline %u non valida" -#: replication/basebackup.c:1574 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failures" -msgstr "il file \"%s\" ha un totale di %d fallimenti di verifiche checksum" +#: repl_scanner.l:142 +msgid "invalid streaming start location" +msgstr "posizione di avvio dello streaming non valida" -#: replication/basebackup.c:1602 -#, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "nome del file troppo lungo per il formato tar: \"%s\"" +#: repl_scanner.l:199 scan.l:724 +msgid "unterminated quoted string" +msgstr "stringa tra virgolette non terminata" -#: replication/basebackup.c:1607 +#: replication/libpqwalreceiver/libpqwalreceiver.c:240 #, c-format -msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "destinazione del link simbolico troppo lunga per il formato tar: nome del file \"%s\", destinazione \"%s\"" +msgid "could not clear search path: %s" +msgstr "impossibile cancellare il percorso di ricerca: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:235 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format msgid "invalid connection string syntax: %s" msgstr "sintassi della stringa di connessione errata: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:259 +#: replication/libpqwalreceiver/libpqwalreceiver.c:295 #, c-format msgid "could not parse connection string: %s" msgstr "interpretazione della stringa di connessione fallita: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:332 +#: replication/libpqwalreceiver/libpqwalreceiver.c:368 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "ricezione fallita dell'identificativo del database e l'ID della timeline dal server primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:343 -#: replication/libpqwalreceiver/libpqwalreceiver.c:550 +#: replication/libpqwalreceiver/libpqwalreceiver.c:380 replication/libpqwalreceiver/libpqwalreceiver.c:618 #, c-format msgid "invalid response from primary server" msgstr "risposta non valida dal server primario" -#: replication/libpqwalreceiver/libpqwalreceiver.c:344 +#: 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 "Identificazione del sistema non riuscita: ricevute %d righe and %d campi, attese %d righe e %d o più campi." -#: replication/libpqwalreceiver/libpqwalreceiver.c:410 -#: replication/libpqwalreceiver/libpqwalreceiver.c:416 -#: replication/libpqwalreceiver/libpqwalreceiver.c:441 +#: 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 "avvio dello streaming dei WAL fallito: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:460 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "invio del messaggio di fine stream al primario fallito: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:482 +#: replication/libpqwalreceiver/libpqwalreceiver.c:545 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "risultato imprevisto dopo la fine stream" -#: replication/libpqwalreceiver/libpqwalreceiver.c:496 +#: replication/libpqwalreceiver/libpqwalreceiver.c:560 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "errore nel terminare il down streaming di COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:505 +#: replication/libpqwalreceiver/libpqwalreceiver.c:570 #, c-format msgid "error reading result of streaming command: %s" msgstr "errore nella lettura del risultato del comando di streaming: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:513 -#: replication/libpqwalreceiver/libpqwalreceiver.c:741 +#: replication/libpqwalreceiver/libpqwalreceiver.c:579 replication/libpqwalreceiver/libpqwalreceiver.c:817 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "risultato imprevisto dopo CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "errore nella ricezione del file di storia della timeline dal server primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:551 +#: replication/libpqwalreceiver/libpqwalreceiver.c:619 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Attesa una tupla con 2 campi, ricevute %d tuple con %d campi." -#: replication/libpqwalreceiver/libpqwalreceiver.c:705 -#: replication/libpqwalreceiver/libpqwalreceiver.c:756 -#: replication/libpqwalreceiver/libpqwalreceiver.c:762 +#: 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 "ricezione dati dallo stream WAL fallita: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:781 +#: replication/libpqwalreceiver/libpqwalreceiver.c:860 #, c-format msgid "could not send data to WAL stream: %s" msgstr "invio dati allo stream WAL fallito: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:830 +#: replication/libpqwalreceiver/libpqwalreceiver.c:952 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "creazione dello slot di replica \"%s\" fallita: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:864 +#: replication/libpqwalreceiver/libpqwalreceiver.c:998 #, c-format msgid "invalid query response" msgstr "risposta query non valida" -#: replication/libpqwalreceiver/libpqwalreceiver.c:865 +#: replication/libpqwalreceiver/libpqwalreceiver.c:999 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Attesi %d campi, ricevuti %d campi." -#: replication/libpqwalreceiver/libpqwalreceiver.c:934 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 #, c-format msgid "the query interface requires a database connection" msgstr "l'interfaccia per le query richiede una connessione ad un database" -#: replication/libpqwalreceiver/libpqwalreceiver.c:965 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 msgid "empty query" msgstr "query vuota" -#: replication/logical/launcher.c:310 -#, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "avvio del worker di replica logica per la sottoscrizione \"%s\"" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 +msgid "unexpected pipeline mode" +msgstr "modalità pipeline imprevista" -#: replication/logical/launcher.c:317 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "non è possibile avviare worker di replica logica se max_replication_slots = 0" -#: replication/logical/launcher.c:397 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "worker di replica logica esauriti" -#: replication/logical/launcher.c:398 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Potresti dover aumentare max_logical_replication_workers." -#: replication/logical/launcher.c:453 +#: replication/logical/launcher.c:422 #, c-format msgid "out of background worker slots" msgstr "worker di lavoro in background esauriti" -#: replication/logical/launcher.c:454 +#: replication/logical/launcher.c:423 #, c-format msgid "You might need to increase max_worker_processes." msgstr "Potresti dover aumentare max_worker_processes." -#: replication/logical/launcher.c:661 +#: replication/logical/launcher.c:577 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "lo slot del worker di replica logica %d è vuoto, non è possibile agganciarsi" -#: replication/logical/launcher.c:670 +#: replication/logical/launcher.c:586 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "lo slot del worker di replica logica %d è già in uso da un altro processo, non è possibile agganciarsi" -#: replication/logical/launcher.c:988 -#, c-format -msgid "logical replication launcher started" -msgstr "lanciatore di replica logica avviato" - -#: replication/logical/logical.c:85 +#: replication/logical/logical.c:115 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "la decodifica logica richiede wal_level >= logical" -#: replication/logical/logical.c:90 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires a database connection" msgstr "la decodifica logica richiede una connessione al database" -#: replication/logical/logical.c:108 +#: replication/logical/logical.c:138 #, c-format msgid "logical decoding cannot be used while in recovery" msgstr "la decodifica logica non può essere usata in modalità di recupero" -#: replication/logical/logical.c:250 replication/logical/logical.c:381 +#: replication/logical/logical.c:348 replication/logical/logical.c:502 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "non si possono usare slot di replica fisica per la decodifica logica" -#: replication/logical/logical.c:255 replication/logical/logical.c:386 +#: replication/logical/logical.c:353 replication/logical/logical.c:507 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "lo slot di replica \"%s\" non è stato creato in questo database" -#: replication/logical/logical.c:262 +#: replication/logical/logical.c:360 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "non si possono creare slot di replica logica in transazioni che hanno effettuato scritture" -#: replication/logical/logical.c:426 +#: replication/logical/logical.c:568 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "avvio della decodifica logica per lo slot \"%s\"" -#: replication/logical/logical.c:428 +#: replication/logical/logical.c:570 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Commit delle transazioni streaming dopo %X/%X, lettura del WAL dopo %X/%X." -#: replication/logical/logical.c:578 +#: replication/logical/logical.c:718 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot \"%s\", plugin di output \"%s\", nel callback %s, LSN associato %X/%X" -#: replication/logical/logical.c:585 +#: replication/logical/logical.c:724 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot \"%s\", plugin di output \"%s\", nel callback %s" -#: replication/logical/logicalfuncs.c:114 replication/slotfuncs.c:35 +#: 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 "solo un superutente o il ruolo di replica può usare uno slot di replica" +msgid "logical replication at prepare time requires a %s callback" +msgstr "la replica logica in fase di preparazione richiede una richiamata %s" + +#: 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 "lo streaming logico richiede una richiamata %s" + +#: replication/logical/logical.c:1398 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "lo streaming logico in fase di preparazione richiede una richiamata %s" -#: replication/logical/logicalfuncs.c:153 +#: replication/logical/logicalfuncs.c:126 #, c-format msgid "slot name must not be null" msgstr "il nome dello slot non può essere nullo" -#: replication/logical/logicalfuncs.c:169 +#: replication/logical/logicalfuncs.c:142 #, c-format msgid "options array must not be null" msgstr "l'array di opzioni non può essere nullo" -#: replication/logical/logicalfuncs.c:200 +#: replication/logical/logicalfuncs.c:159 #, c-format msgid "array must be one-dimensional" msgstr "l'array deve essere monodimensionale" -#: replication/logical/logicalfuncs.c:206 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "l'array non deve contenere NULL" -#: replication/logical/logicalfuncs.c:222 utils/adt/json.c:2310 -#: utils/adt/jsonb.c:1269 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 utils/adt/jsonb.c:1302 #, c-format msgid "array must have even number of elements" msgstr "l'array deve avere un numero pari di elementi" -#: replication/logical/logicalfuncs.c:269 +#: replication/logical/logicalfuncs.c:227 #, c-format -msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" -msgstr "il plugin di output di decodifica logica \"%s\" produce dati binari, ma la funzione \"%s\" si aspetta dati testuali" +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "non è più possibile ottenere le modifiche dallo slot di replica \"%s\"" + +#: 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 "Questo slot non è mai stato prenotato in precedenza WAL o è stato invalidato." -#: replication/logical/origin.c:185 +#: replication/logical/logicalfuncs.c:241 #, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "solo i superutenti possono interrogare o replicare le origini di replica" +msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" +msgstr "il plugin di output di decodifica logica \"%s\" produce dati binari, ma la funzione \"%s\" si aspetta dati testuali" -#: replication/logical/origin.c:190 +#: replication/logical/origin.c:189 #, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" msgstr "non è possibile interrogare o manipolare le origini di replica quando max_replication_slots = 0" -#: replication/logical/origin.c:195 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "non è possibile manipolare le origini di replica durante il recupero" -#: replication/logical/origin.c:230 +#: replication/logical/origin.c:228 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "l'origine di replica \"%s\" non esiste" -#: replication/logical/origin.c:321 +#: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "non è stato trovato alcun OID di origine di replica libero" +msgid "could not find free replication origin ID" +msgstr "non è stato possibile trovare l'ID origine della replica gratuita" -#: replication/logical/origin.c:369 +#: replication/logical/origin.c:355 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" -msgstr "impossibile eliminare l'origine di replica con OID %d, in uso dal pid %d" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "impossibile eliminare l'origine della replica con ID %d, in uso dal PID %d" -#: replication/logical/origin.c:461 +#: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "l'origine di replica con OID %u non esiste" +msgid "replication origin with ID %d does not exist" +msgstr "l'origine della replica con ID %d non esiste" -#: replication/logical/origin.c:725 +#: replication/logical/origin.c:741 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "il checkpoint di replica ha numero magico sbagliato %u invece di %u" -#: replication/logical/origin.c:757 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "lettura del file \"%s\" fallita: letti %d di %zu" - -#: replication/logical/origin.c:766 +#: replication/logical/origin.c:782 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "nessuno stato di replica libero trovato, incrementa \"max_replication_slots\"" -#: replication/logical/origin.c:784 +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %d to %X/%X" +msgstr "stato di replica ripristinato dal nodo %d a %X/%X" + +#: replication/logical/origin.c:800 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "il checkpoint dello slot di replica ha il checksum sbagliato %u, atteso %u" -#: replication/logical/origin.c:908 +#: 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 "l'origine di replica con OID %d è già attiva per il PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "l'origine della replica con ID %d è già attiva per il PID %d" -#: replication/logical/origin.c:919 replication/logical/origin.c:1106 +#: 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 "nessuno slot di stato di replica trovato per l'origine di replica con OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "impossibile trovare lo slot di stato di replica libero per l'origine della replica con ID %d" -#: replication/logical/origin.c:921 replication/logical/origin.c:1108 -#: replication/slot.c:1529 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 replication/slot.c:1912 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Incrementa max_replication_slots e prova di nuovo." -#: replication/logical/origin.c:1065 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "non è possibile impostare l'origine di replica quando una è già impostata" -#: replication/logical/origin.c:1094 -#, c-format -msgid "replication identifier %d is already active for PID %d" -msgstr "l'identificativo di replica %d è già attivo per il PID %d" - -#: replication/logical/origin.c:1145 replication/logical/origin.c:1343 -#: replication/logical/origin.c:1363 +#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 replication/logical/origin.c:1400 #, c-format msgid "no replication origin is configured" msgstr "nessuna origine di replica configurata" -#: replication/logical/relation.c:255 +#: replication/logical/origin.c:1251 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "la relazione di destinazione di replica logica \"%s.%s\" non esiste" +msgid "replication origin name \"%s\" is reserved" +msgstr "il nome dell'origine della replica \"%s\" è riservato" + +#: replication/logical/origin.c:1253 +#, c-format +msgid "Origin names starting with \"pg_\" are reserved." +msgstr "I nomi di origine che iniziano con \"pg_\" sono riservati." + +#: replication/logical/relation.c:234 +#, c-format +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:237 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" -#: replication/logical/relation.c:297 +#: replication/logical/relation.c:243 #, c-format -msgid "logical replication target relation \"%s.%s\" is missing some replicated columns" -msgstr "la relazione di destinazione di replica logica \"%s.%s\" ha alcune colonne replicate mancanti" +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] "la relazione di destinazione della replica logica \"%s.%s\" manca nella colonna replicata: %s" +msgstr[1] "la relazione di destinazione della replica logica \"%s.%s\" manca nelle colonne replicate: %s" -#: replication/logical/relation.c:337 +#: replication/logical/relation.c:298 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "la relazione di destinazione di replica logica \"%s.%s\" usa colonne di sistema nell'indice REPLICA IDENTITY" -#: replication/logical/reorderbuffer.c:2493 +#: replication/logical/relation.c:390 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "la relazione di destinazione di replica logica \"%s.%s\" non esiste" + +#: replication/logical/reorderbuffer.c:3811 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "scrittura nel file di dati per lo XID %u non riuscita: %m" -#: replication/logical/reorderbuffer.c:2586 -#: replication/logical/reorderbuffer.c:2608 +#: replication/logical/reorderbuffer.c:4155 replication/logical/reorderbuffer.c:4180 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "lettura dal file spill reorderbuffer non riuscita: %m" -#: replication/logical/reorderbuffer.c:2590 -#: replication/logical/reorderbuffer.c:2612 +#: replication/logical/reorderbuffer.c:4159 replication/logical/reorderbuffer.c:4184 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "lettura dal file spill reorderbuffer non riuscita: letti %d byte invece di %u" -#: replication/logical/reorderbuffer.c:2835 +#: replication/logical/reorderbuffer.c:4434 #, c-format -msgid "could not remove file \"%s\" during removal of pg_replslot/%s/*.xid: %m" -msgstr "errore nella rimozione del file \"%s\" durante la rimozione di pg_replslot/%s/*.xid: %m" +msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" +msgstr "impossibile rimuovere il file \"%s\" durante la rimozione di pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:3301 +#: replication/logical/reorderbuffer.c:4933 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "lettura dal file \"%s\" non riuscita: letti %d byte invece di %d" -#: replication/logical/snapbuild.c:612 +#: replication/logical/snapbuild.c:627 #, c-format msgid "initial slot snapshot too large" msgstr "immagine iniziale dello slot troppo grande" -#: replication/logical/snapbuild.c:664 +#: replication/logical/snapbuild.c:681 #, 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] "snapshot di decidifica logica esportati: \"%s\" con %u ID di transazione" msgstr[1] "snapshot di decidifica logica esportati: \"%s\" con %u ID di transazione" -#: replication/logical/snapbuild.c:1269 replication/logical/snapbuild.c:1362 -#: replication/logical/snapbuild.c:1869 +#: replication/logical/snapbuild.c:1357 replication/logical/snapbuild.c:1464 replication/logical/snapbuild.c:1993 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "la decodifica logica ha trovato un punto consistente a %X/%X" -#: replication/logical/snapbuild.c:1271 +#: replication/logical/snapbuild.c:1359 #, c-format msgid "There are no running transactions." msgstr "Non ci sono transazioni in corso." -#: replication/logical/snapbuild.c:1313 +#: replication/logical/snapbuild.c:1415 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "la decodifica logica ha trovato un punto di avvio iniziale a %X/%X" -#: replication/logical/snapbuild.c:1315 replication/logical/snapbuild.c:1339 +#: replication/logical/snapbuild.c:1417 replication/logical/snapbuild.c:1441 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "In attesa che alcune transazioni (circa %d) più vecchie di %u finiscano." -#: replication/logical/snapbuild.c:1337 +#: replication/logical/snapbuild.c:1439 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "la decodifica logica ha trovato il punto iniziale consistente a %X/%X" -#: replication/logical/snapbuild.c:1364 +#: replication/logical/snapbuild.c:1466 #, c-format msgid "There are no old transactions anymore." msgstr "Non ci sono più vecchie transazioni." -#: replication/logical/snapbuild.c:1733 replication/logical/snapbuild.c:1764 -#: replication/logical/snapbuild.c:1784 replication/logical/snapbuild.c:1803 -#, c-format -msgid "could not read file \"%s\", read %d of %d: %m" -msgstr "lettura del file \"%s\" non riuscita, letti %d su %d: %m" - -#: replication/logical/snapbuild.c:1739 +#: replication/logical/snapbuild.c:1861 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "il file di stato snapbuild \"%s\" ha il numero magico sbagliato: %u invece di %u" -#: replication/logical/snapbuild.c:1744 +#: replication/logical/snapbuild.c:1867 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "il file di stato snapbuild \"%s\" ha una versione non supportata: %u invece di %u" -#: replication/logical/snapbuild.c:1816 +#: replication/logical/snapbuild.c:1938 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "il checksum del file di stato snapbuild \"%s\" non combacia: è %u, sarebbe dovuto essere %u" -#: replication/logical/snapbuild.c:1871 +#: replication/logical/snapbuild.c:1995 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "La decodifica logica inizierà usando uno snapshot salvato." -#: replication/logical/snapbuild.c:1943 +#: replication/logical/snapbuild.c:2067 #, c-format msgid "could not parse file name \"%s\"" msgstr "interpretazione del nome di file \"%s\" fallita" -#: replication/logical/tablesync.c:138 +#: replication/logical/tablesync.c:151 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "worker di replica logica di sincronizzazione tabelle per la sottoscrizione \"%s\", la tabella \"%s\" è completata" -#: replication/logical/tablesync.c:685 +#: 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 "replica logica applicare il ruolo di lavoro per la sottoscrizione \"%s\" verrà riavviato in modo da poter abilitare two_phase" + +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "errore nella lettura delle informazioni sulla tabella \"%s.%s\" per la pubblicazione: %s" -#: replication/logical/tablesync.c:691 +#: replication/logical/tablesync.c:738 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabella \"%s.%s\" non trovata sul database di pubblicazione" -#: replication/logical/tablesync.c:721 +#: replication/logical/tablesync.c:795 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "impossibile recuperare le informazioni sull'elenco delle colonne per la tabella \"%s.%s\" dall'editore: %s" + +#: replication/logical/tablesync.c:974 #, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "errore nella lettura delle informazioni sulla tabella \"%s.%s\": %s" +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "impossibile recuperare le informazioni sulla clausola WHERE della tabella per la tabella \"%s.%s\" dall'editore: %s" -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:1111 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "errore nell'avvio della copia iniziale dei contenuti per la tabella \"%s.%s\": %s" -#: replication/logical/tablesync.c:904 +#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1634 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "l'utente \"%s\" non può replicare in relazione alla sicurezza a livello di riga abilitata: \"%s\"" + +#: replication/logical/tablesync.c:1338 +#, c-format +msgid "table copy could not start transaction on publisher: %s" +msgstr "la copia della tabella non ha potuto avviare la transazione sull'editore: %s" + +#: replication/logical/tablesync.c:1387 #, c-format -msgid "table copy could not start transaction on publisher" -msgstr "inizio della transazione non riuscito per la copia della tabella sul database di pubblicazione" +msgid "replication origin \"%s\" already exists" +msgstr "l'origine della replica \"%s\" esiste già" -#: replication/logical/tablesync.c:926 +#: replication/logical/tablesync.c:1400 #, c-format -msgid "table copy could not finish transaction on publisher" -msgstr "completamento della transazione non riuscito per la copia della tabella sul database di pubblicazione" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "la copia della tabella non è riuscita a completare la transazione sull'editore: %s" -#: replication/logical/worker.c:307 +#: 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 "processo dei dati remoti per la replica della tabella di destinazione \"%s.%s\" colonna \"%s\", tipo remoto %s, tipo locale %s" +msgid "incorrect binary data format in logical replication column %d" +msgstr "formato dati binario errato nella colonna di replica logica %d" -#: replication/logical/worker.c:528 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1431 #, c-format -msgid "ORIGIN message sent out of order" -msgstr "messaggi ORIGIN inviati in ordine sbagliato" +msgid "could not read from streaming transaction's changes file \"%s\": %m" +msgstr "impossibile leggere dal file di modifiche della transazione in streaming \"%s\": %m" -#: replication/logical/worker.c:661 +#: replication/logical/worker.c:1760 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "il database di pubblicazione non ha inviato le colonne di identità di replica attese dalla relazione di destinazione di replica logica \"%s.%s\"" -#: replication/logical/worker.c:668 +#: replication/logical/worker.c:1767 #, 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 relazione di destinazione di replica logica \"%s.%s\" non ha né un indice REPLICA IDENTITY né una PRIMARY KEY e la relazione pubblicata non ha REPLICA IDENTITY FULL" -#: replication/logical/worker.c:1007 +#: replication/logical/worker.c:2570 #, c-format msgid "invalid logical replication message type \"%c\"" msgstr "messaggio di replica logica tipo \"%c\" non valido" -#: replication/logical/worker.c:1148 +#: replication/logical/worker.c:2734 #, c-format msgid "data stream from publisher has ended" msgstr "stream di dati dal database di pubblicazione terminato" -#: replication/logical/worker.c:1307 +#: replication/logical/worker.c:2885 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "arresto del worker di replica logica per timeout" -#: replication/logical/worker.c:1455 +#: replication/logical/worker.c:3047 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà fermato perché la sottoscrizione è stata rimossa" -#: replication/logical/worker.c:1469 +#: replication/logical/worker.c:3058 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà fermato perché la sottoscrizione è stata disabilitata" -#: replication/logical/worker.c:1483 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà riavviato perché l'informazione di connessione è cambiata" - -#: replication/logical/worker.c:1497 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription was renamed" -msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà riavviato perché la sottoscrizione è stata rinominata" - -#: replication/logical/worker.c:1514 +#: replication/logical/worker.c:3084 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà riavviato perché il nome dello slot di replica è cambiato" +msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgstr "replica logica applicare il ruolo di lavoro per la sottoscrizione \"%s\" verrà riavviato a causa di una modifica del parametro" -#: replication/logical/worker.c:1528 +#: replication/logical/worker.c:3208 replication/logical/worker.c:3230 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -msgstr "il worker di replica logica per la sottoscrizione \"%s\" verrà riavviato le pubblicazioni della sottoscrizione sono cambiate" +msgid "could not read from streaming transaction's subxact file \"%s\": %m" +msgstr "impossibile leggere dal file subxact della transazione in streaming \"%s\": %m" -#: replication/logical/worker.c:1631 +#: replication/logical/worker.c:3629 #, c-format msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" msgstr "il worker di replica logica per la sottoscrizione %u non verrà avviato perché la sottoscrizione è stata rimossa durante l'avvio" -#: replication/logical/worker.c:1643 +#: replication/logical/worker.c:3641 #, c-format msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "il worker di replica logica per la sottoscrizione \"%s\" non verrà avviato perché la sottoscrizione è stata disabilitata all'avvio" -#: replication/logical/worker.c:1661 +#: replication/logical/worker.c:3659 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "il worker di replica logica di sincronizzazione tabelle per la sottoscrizione \"%s\", la tabella \"%s\" è stata avviata" -#: replication/logical/worker.c:1665 +#: replication/logical/worker.c:3663 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "il worker di replica logica per la sottoscrizione \"%s\" è partito" -#: replication/logical/worker.c:1705 +#: replication/logical/worker.c:3704 #, c-format msgid "subscription has no replication slot set" msgstr "la sottoscrizione non ha uno slot di replica impostato" -#: replication/pgoutput/pgoutput.c:117 +#: replication/logical/worker.c:3840 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "la sottoscrizione \"%s\" è stata disabilitata a causa di un errore" + +#: replication/logical/worker.c:3879 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "la replica logica inizia a saltare la transazione su LSN %X/%X" + +#: replication/logical/worker.c:3893 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "replica logica completata ignorando la transazione su LSN %X/%X" + +#: replication/logical/worker.c:3975 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "skip-LSN della sottoscrizione \"%s\" cancellato" + +#: replication/logical/worker.c:3976 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "La posizione WAL finale (LSN) %X/%X della transazione remota non corrispondeva a skip-LSN %X/%X." + +#: replication/logical/worker.c:4002 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "elaborazione dei dati remoti per l'origine della replica \"%s\" durante il tipo di messaggio \"%s\"" + +#: replication/logical/worker.c:4006 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "elaborazione dei dati remoti per l'origine della replica \"%s\" durante il tipo di messaggio \"%s\" nella transazione %u" + +#: replication/logical/worker.c:4011 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "elaborazione dei dati remoti per l'origine della replica \"%s\" durante il tipo di messaggio \"%s\" nella transazione %u, terminata alle %X/%X" + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "elaborazione dei dati remoti per l'origine della replica \"%s\" durante il tipo di messaggio \"%s\" per la relazione di destinazione della replica \"%s.%s\" nella transazione %u, terminata alle %X/%X" + +#: replication/logical/worker.c:4026 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "elaborazione dei dati remoti per l'origine della replica \"%s\" durante il tipo di messaggio \"%s\" per la relazione di destinazione della replica \"%s.%s\" colonna \"%s\" nella transazione %u, terminata alle %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "proto_version non valido" -#: replication/pgoutput/pgoutput.c:122 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\" fuori dall'intervallo consentito" -#: replication/pgoutput/pgoutput.c:139 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "sintassi di publication_names non valida" -#: replication/pgoutput/pgoutput.c:181 +#: replication/pgoutput/pgoutput.c:425 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "il cliente ha inviato proto_version=%d ma solo il protocollo %d o inferiore è supportato" -#: replication/pgoutput/pgoutput.c:187 +#: replication/pgoutput/pgoutput.c:431 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "il cliente ha inviato proto_version=%d ma solo il protocollo %d o superiore è supportato" -#: replication/pgoutput/pgoutput.c:193 +#: replication/pgoutput/pgoutput.c:437 #, c-format msgid "publication_names parameter missing" msgstr "parametro publication_names mancante" -#: replication/slot.c:182 +#: replication/pgoutput/pgoutput.c:450 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "richiesto proto_version=%d non supporta lo streaming, è necessario %d o superiore" + +#: replication/pgoutput/pgoutput.c:455 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "streaming richiesto, ma non supportato dal plug-in di output" + +#: replication/pgoutput/pgoutput.c:472 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "richiesta proto_version=%d non supporta il commit a due fasi, è necessario %d o superiore" + +#: replication/pgoutput/pgoutput.c:477 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "commit in due fasi richiesto, ma non supportato dal plug-in di output" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "il nome dello slot di replica \"%s\" è troppo corto" -#: replication/slot.c:191 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "il nome dello slot di replica \"%s\" è troppo lungo" -#: replication/slot.c:204 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "il nome dello slot di replica \"%s\" contiene caratteri non validi" -#: replication/slot.c:206 +#: replication/slot.c:229 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "I nomi degli slot di replica possono contenere solo lettere minuscole, numeri e il carattere underscore." -#: replication/slot.c:253 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "lo slot di replica \"%s\" esiste già" -#: replication/slot.c:263 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "tutti gli slot di replica sono in uso" -#: replication/slot.c:264 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Liberane uno o incrementa max_replication_slots." -#: replication/slot.c:387 +#: replication/slot.c:444 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 "lo slot di replica \"%s\" non esiste" -#: replication/slot.c:398 replication/slot.c:948 +#: replication/slot.c:490 replication/slot.c:1058 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "lo slot di replica \"%s\" è attivo per il PID %d" -#: replication/slot.c:632 replication/slot.c:1136 replication/slot.c:1490 +#: replication/slot.c:726 replication/slot.c:1464 replication/slot.c:1847 #, c-format msgid "could not remove directory \"%s\"" msgstr "eliminazione della directory \"%s\" fallita" -#: replication/slot.c:978 +#: replication/slot.c:1093 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "gli slot di replica possono essere usati solo se max_replication_slots > 0" -#: replication/slot.c:983 +#: replication/slot.c:1098 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "gli slot di replica possono essere usati solo se wal_level >= replica" -#: replication/slot.c:1422 replication/slot.c:1462 +#: replication/slot.c:1110 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "solo un superutente o il ruolo di replica può usare uno slot di replica" + +#: replication/slot.c:1295 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "terminazione del processo %d per rilasciare lo slot di replica \"%s\"" + +#: replication/slot.c:1333 #, c-format -msgid "could not read file \"%s\", read %d of %u: %m" -msgstr "lettura del file \"%s\" fallita, letti %d su %u: %m" +msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" +msgstr "invalidando lo slot \"%s\" perché il suo restart_lsn %X/%X supera max_slot_wal_keep_size" -#: replication/slot.c:1431 +#: replication/slot.c:1785 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "il file dello slot di replica \"%s\" ha il numero magico sbagliato: %u invece di %u" -#: replication/slot.c:1438 +#: replication/slot.c:1792 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "il file dello slot di replica \"%s\" ha la versione non supportata %u" -#: replication/slot.c:1445 +#: replication/slot.c:1799 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "il file dello slot di replica \"%s\" ha la lunghezza corrotta %u" -#: replication/slot.c:1477 +#: replication/slot.c:1835 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "il checksum del file dello slot di replica \"%s\" non combacia: è %u, sarebbe dovuto essere %u" -#: replication/slot.c:1528 +#: replication/slot.c:1869 +#, c-format +msgid "logical replication slot \"%s\" exists, but wal_level < logical" +msgstr "lo slot di replica logica \"%s\" esiste, ma wal_level < logico" + +#: replication/slot.c:1871 +#, c-format +msgid "Change wal_level to be logical or higher." +msgstr "Cambia wal_level in modo che sia logico o superiore." + +#: replication/slot.c:1875 +#, c-format +msgid "physical replication slot \"%s\" exists, but wal_level < replica" +msgstr "lo slot di replica fisica \"%s\" esiste, ma wal_level < replica" + +#: replication/slot.c:1877 +#, c-format +msgid "Change wal_level to be replica or higher." +msgstr "Modifica wal_level in modo che sia replica o superiore." + +#: replication/slot.c:1911 #, c-format msgid "too many replication slots active before shutdown" msgstr "troppi slot di replica attivi prima dell'arresto" -#: replication/slotfuncs.c:490 +#: replication/slotfuncs.c:592 #, c-format -msgid "invalid target wal lsn" -msgstr "wal lsn di destinazione non valida" +msgid "invalid target WAL LSN" +msgstr "LSN WAL di destinazione non valido" -#: replication/slotfuncs.c:512 +#: replication/slotfuncs.c:614 #, c-format -msgid "cannot advance replication slot that has not previously reserved WAL" -msgstr "non è possibile avanzare uno slot di replica che non ha precedentemente riservato WAL" +msgid "replication slot \"%s\" cannot be advanced" +msgstr "lo slot di replica \"%s\" non può essere avanzato" -#: replication/slotfuncs.c:528 +#: replication/slotfuncs.c:632 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "non è possibile avanzare lo slot di replica a %X/%X, il minimo è %X/%X" -#: replication/syncrep.c:246 +#: replication/slotfuncs.c:739 +#, c-format +msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" +msgstr "impossibile copiare lo slot di replica fisico \"%s\" come slot di replica logica" + +#: replication/slotfuncs.c:741 +#, c-format +msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" +msgstr "impossibile copiare lo slot di replica logica \"%s\" come slot di replica fisica" + +#: replication/slotfuncs.c:748 +#, c-format +msgid "cannot copy a replication slot that doesn't reserve WAL" +msgstr "impossibile copiare uno slot di replica che non riserva WAL" + +#: replication/slotfuncs.c:825 +#, c-format +msgid "could not copy replication slot \"%s\"" +msgstr "impossibile copiare lo slot di replica \"%s\"" + +#: replication/slotfuncs.c:827 +#, c-format +msgid "The source replication slot was modified incompatibly during the copy operation." +msgstr "Lo slot di replica di origine è stato modificato in modo incompatibile durante l'operazione di copia." + +#: replication/slotfuncs.c:833 +#, c-format +msgid "cannot copy unfinished logical replication slot \"%s\"" +msgstr "impossibile copiare lo slot di replica logica \"%s\" non completato" + +#: replication/slotfuncs.c:835 +#, c-format +msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." +msgstr "Riprova quando lo slot di replica di origine confermato_flush_lsn è valido." + +#: replication/syncrep.c:268 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "annullamento dell'attesa di replica sincrona ed interruzione della connessione su comando dell'amministratore" -#: replication/syncrep.c:247 replication/syncrep.c:264 +#: 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 "La transazione ha già effettuato il commit localmente, ma potrebbe non essere stata replicata agli standby." -#: replication/syncrep.c:263 +#: replication/syncrep.c:285 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "annullamento dell'attesa di replica sincrona su richiesta utente" -#: replication/syncrep.c:397 -#, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "lo standby \"%s\" ha ora priorità di standby sincrono %u" - -#: replication/syncrep.c:458 +#: replication/syncrep.c:494 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "lo standby \"%s\" è ora uno standby sincrono con priorità %u" -#: replication/syncrep.c:462 +#: replication/syncrep.c:498 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "lo standby \"%s\" è ora un candidato al quorum di standby sincroni" -#: replication/syncrep.c:1160 +#: replication/syncrep.c:1045 #, c-format msgid "synchronous_standby_names parser failed" msgstr "interpretazione di synchronous_standby_names non riuscita" -#: replication/syncrep.c:1166 +#: replication/syncrep.c:1051 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "il numero di standby sincroni (%d) deve essere maggiore di zero" -#: replication/walreceiver.c:169 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "interruzione del processo walreceiver su comando dell'amministratore" -#: replication/walreceiver.c:309 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "connessione al server primario fallita: %s" -#: replication/walreceiver.c:359 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "l'identificativo del database è diverso tra il primario e lo standby" -#: replication/walreceiver.c:360 +#: replication/walreceiver.c:340 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "L'identificativo del primario è %s, quello dello standby è %s." -#: replication/walreceiver.c:371 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "la timeline massima %u del primario è dietro la timeline di recupero %u" -#: replication/walreceiver.c:407 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "streaming WAL avviato dal primario a %X/%X sulla timeline %u" -#: replication/walreceiver.c:412 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "streaming WAL riavviato sulla timeline %X/%X sulla timeline %u" -#: replication/walreceiver.c:441 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "non è possibile continuare lo streaming dei WAL, il recupero è già terminato" -#: replication/walreceiver.c:478 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "replica terminata dal server primario" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:476 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Fine del WAL raggiunta sulla timeline %u a %X/%X." -#: replication/walreceiver.c:574 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "walreceiver terminato a causa di timeout" -#: replication/walreceiver.c:614 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "il server primario non contiene più alcun WAL sulla timeline richiesta %u" -#: replication/walreceiver.c:629 replication/walreceiver.c:982 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "chiusura del segmento di log %s fallita: %m" -#: replication/walreceiver.c:754 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "recupero del file di storia della timeline %u dal server primario" -#: replication/walreceiver.c:1036 +#: replication/walreceiver.c:933 #, c-format msgid "could not write to log segment %s at offset %u, length %lu: %m" msgstr "scrittura nel segmento di log %s in posizione %u, lunghezza %lu fallita: %m" -#: replication/walsender.c:494 +#: replication/walsender.c:521 #, c-format -msgid "could not seek to beginning of file \"%s\": %m" -msgstr "spostamento all'inizio del file \"%s\" fallito: %m" +msgid "cannot use %s with a logical replication slot" +msgstr "impossibile utilizzare %s con uno slot di replica logica" + +#: replication/walsender.c:638 storage/smgr/md.c:1350 +#, c-format +msgid "could not seek to end of file \"%s\": %m" +msgstr "non è stato possibile spostarsi alla fine del file \"%s\": %m" -#: replication/walsender.c:535 +#: replication/walsender.c:642 #, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM non eseguito prima di START_REPLICATION" +msgid "could not seek to beginning of file \"%s\": %m" +msgstr "spostamento all'inizio del file \"%s\" fallito: %m" -#: replication/walsender.c:552 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "non si può usare una slot di replica logico per la replica fisica" -#: replication/walsender.c:615 +#: replication/walsender.c:785 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "il punto di avvio richiesto %X/%X sulla timeline %u non è nella storia di questo server" -#: replication/walsender.c:619 +#: replication/walsender.c:788 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "La storia di questo server si è separata dalla timeline %u a %X/%X." -#: replication/walsender.c:664 +#: replication/walsender.c:832 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "il punto di avvio richiesto %X/%X è più avanti della posizione di flush del WAL %X/%X di questo server" -#: replication/walsender.c:893 +#: replication/walsender.c:1015 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "valore non riconosciuto per l'opzione CREATE_REPLICATION_SLOT \"%s\": \"%s\"" + +# translator: %s represents an SQL statement name +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1100 +#, c-format +msgid "%s must not be called inside a transaction" +msgstr "%s non deve essere chiamato all'interno di una transazione" + +# translator: %s represents an SQL statement name +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1110 +#, c-format +msgid "%s must be called inside a transaction" +msgstr "%s deve essere chiamato all'interno di una transazione" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1116 #, c-format -msgid "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT must not be called inside a transaction" -msgstr "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT non può essere eseguito in una transazione" +msgid "%s must be called in REPEATABLE READ isolation mode transaction" +msgstr "%s deve essere chiamato nella transazione in modalità di isolamento REPEATABLE READ" -#: replication/walsender.c:902 +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1122 #, c-format -msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called inside a transaction" -msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT deve essere eseguito in una transazione" +msgid "%s must be called before any query" +msgstr "%s deve essere chiamato prima di qualsiasi query" -#: replication/walsender.c:907 +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1128 #, c-format -msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called in REPEATABLE READ isolation mode transaction" -msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT deve essere eseguito in una transazione in modalità REPEATABLE READ" +msgid "%s must not be called in a subtransaction" +msgstr "%s non deve essere chiamato in una sottotransazione" -#: replication/walsender.c:912 +#: replication/walsender.c:1271 #, c-format -msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called before any query" -msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT deve essere eseguito prima di qualunque query" +msgid "cannot read from logical replication slot \"%s\"" +msgstr "impossibile leggere dallo slot di replica logica \"%s\"" -#: replication/walsender.c:917 +#: replication/walsender.c:1273 #, c-format -msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must not be called in a subtransaction" -msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT non può essere eseguito in una sottotransazione" +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "Questo spazio è stato invalidato perché ha superato la dimensione massima riservata." -#: replication/walsender.c:1063 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "interruzione del processo walsender dopo la promozione" -#: replication/walsender.c:1448 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "non è possibile eseguire nuovi comandi mentre WAL sender è in modalità di arresto" -#: replication/walsender.c:1481 +#: replication/walsender.c:1739 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "non è possibile eseguire comandi SQL nel WAL sender di replica fisica" + +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "ricevuto comando di replica: %s" -#: replication/walsender.c:1497 tcop/fastpath.c:279 tcop/postgres.c:1010 -#: tcop/postgres.c:1334 tcop/postgres.c:1594 tcop/postgres.c:2000 -#: tcop/postgres.c:2373 tcop/postgres.c:2452 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 tcop/postgres.c:2602 tcop/postgres.c:2680 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "la transazione corrente è interrotta, i comandi saranno ignorati fino alla fine del blocco della transazione" -#: replication/walsender.c:1562 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "non è possibile eseguire comandi SQL nel WAL sender di replica fisica" - -#: replication/walsender.c:1610 replication/walsender.c:1626 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "fine del file inaspettato sulla connessione di standby" -#: replication/walsender.c:1640 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "tipo di messaggio di standby \"%c\" imprevisto, dopo la ricezione di CopyDone" - -#: replication/walsender.c:1678 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "tipo di messaggio \"%c\" di standby non valido" -#: replication/walsender.c:1719 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "tipo di messaggio \"%c\" inatteso" -#: replication/walsender.c:2097 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "interruzione del processo walsender a causa di timeout di replica" -#: replication/walsender.c:2181 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "\"%s\" ora è allineato al server di origine" - -#: replication/walsender.c:2290 -#, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "il numero di richieste di connessioni di standby supera max_wal_senders (attualmente %d)" - -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:980 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1001 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "la regola \"%s\" per la relazione \"%s\" esiste già" -#: rewrite/rewriteDefine.c:296 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:939 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "la relazione \"%s\" non può avere regole" + +#: rewrite/rewriteDefine.c:302 #, c-format msgid "rule actions on OLD are not implemented" msgstr "le regole di azione su OLD non sono implementate" -#: rewrite/rewriteDefine.c:297 +#: rewrite/rewriteDefine.c:303 #, c-format msgid "Use views or triggers instead." msgstr "Usa le viste o i trigger invece." -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:307 #, c-format msgid "rule actions on NEW are not implemented" msgstr "le regole di azione su NEW non sono implementate" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:308 #, c-format msgid "Use triggers instead." msgstr "Usa i trigger invece." -#: rewrite/rewriteDefine.c:315 +#: rewrite/rewriteDefine.c:321 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "le regole INSTEAD NOTHING su SELECT non sono implementate" -#: rewrite/rewriteDefine.c:316 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "Use views instead." msgstr "Usa le viste invece." -#: rewrite/rewriteDefine.c:324 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "avere più di una azione per le regole su SELECT non è implementato" -#: rewrite/rewriteDefine.c:334 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "le regole su SELECT devono avere un'azione INSTEAD SELECT" -#: rewrite/rewriteDefine.c:342 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "le regole su SELECT non possono contenere istruzioni di modifica dei dati nel WITH" -#: rewrite/rewriteDefine.c:350 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "le qualificazioni di evento non sono implementate per le regole su SELECT" -#: rewrite/rewriteDefine.c:377 +#: rewrite/rewriteDefine.c:383 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" è già una vista" -#: rewrite/rewriteDefine.c:401 +#: rewrite/rewriteDefine.c:407 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "la regola della vista \"%s\" deve essere chiamata \"%s\"" -#: rewrite/rewriteDefine.c:428 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "non è possibile convertire la tabella partizionata \"%s\" in una vista" -#: rewrite/rewriteDefine.c:434 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "non è possibile convertire la partizione \"%s\" in una vista" -#: rewrite/rewriteDefine.c:442 +#: rewrite/rewriteDefine.c:454 #, c-format msgid "could not convert table \"%s\" to a view because it is not empty" msgstr "conversione della tabella \"%s\" in vista fallita perché non è vuota" -#: rewrite/rewriteDefine.c:450 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "conversione della tabella \"%s\" in vista fallita perché ha dei trigger" -#: rewrite/rewriteDefine.c:452 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "In particolare, la tabella non può prendere parte in alcuna relazione di chiave esterna." -#: rewrite/rewriteDefine.c:457 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "conversione della tabella \"%s\" in vista fallita perché ha indici" -#: rewrite/rewriteDefine.c:463 +#: rewrite/rewriteDefine.c:476 #, c-format msgid "could not convert table \"%s\" to a view because it has child tables" msgstr "conversione della tabella \"%s\" in vista fallita perché ha tabelle figlie" -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:482 +#, c-format +msgid "could not convert table \"%s\" to a view because it has parent tables" +msgstr "non è stato possibile convertire la tabella \"%s\" in una vista perché contiene tabelle padre" + +#: rewrite/rewriteDefine.c:488 #, c-format msgid "could not convert table \"%s\" to a view because it has row security enabled" msgstr "conversione della tabella \"%s\" in vista fallita perché ha la sicurezza delle righe abilitata" -#: rewrite/rewriteDefine.c:475 +#: rewrite/rewriteDefine.c:494 #, c-format msgid "could not convert table \"%s\" to a view because it has row security policies" msgstr "conversione della tabella \"%s\" in vista fallita perché ha regole di sicurezza per riga" -#: rewrite/rewriteDefine.c:502 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "non è possibile avere più di una lista RETURNING in una regola" -#: rewrite/rewriteDefine.c:507 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "le liste RETURNING non sono supportate in regole condizionali" -#: rewrite/rewriteDefine.c:511 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "le liste RETURNING non sono supportate in regole che non siano INSTEAD" -#: rewrite/rewriteDefine.c:675 +#: rewrite/rewriteDefine.c:694 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "la lista di destinazione della regola SELECT ha troppi elementi" -#: rewrite/rewriteDefine.c:676 +#: rewrite/rewriteDefine.c:695 #, c-format msgid "RETURNING list has too many entries" msgstr "la lista RETURNING ha troppi elementi" -#: rewrite/rewriteDefine.c:703 +#: rewrite/rewriteDefine.c:722 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "non è possibile convertire una relazione contenente colonne eliminate in una vista" -#: rewrite/rewriteDefine.c:704 +#: rewrite/rewriteDefine.c:723 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "non è possibile creare una lista RETURNING per una relazione che contiene colonne eliminate" -#: rewrite/rewriteDefine.c:710 +#: rewrite/rewriteDefine.c:729 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "elemento di destinazione %d della regola SELECT ha nome di colonna diverso dalla colonna \"%s\"" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:731 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "L'elemento di destinazione di SELECT si chiama \"%s\"." -#: rewrite/rewriteDefine.c:721 +#: rewrite/rewriteDefine.c:740 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "l'elemento %d di destinazione della regola SELECT è di tipo diverso dalla colonna \"%s\"" -#: rewrite/rewriteDefine.c:723 +#: rewrite/rewriteDefine.c:742 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "l'elemento %d della lista RETURNING è di tipo diverso dalla colonna \"%s\"" -#: rewrite/rewriteDefine.c:726 rewrite/rewriteDefine.c:750 +#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "L'elemento di destinazione di SELECT è di tipo %s, ma la colonna è di tipo %s." -#: rewrite/rewriteDefine.c:729 rewrite/rewriteDefine.c:754 +#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "la lista di elementi di RETURNING è di tipo %s, ma la colonna è di tipo %s." -#: rewrite/rewriteDefine.c:745 +#: rewrite/rewriteDefine.c:764 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "l'elemento %d di destinazione della regola SELECT ha dimensione diversa dalla colonna \"%s\"" -#: rewrite/rewriteDefine.c:747 +#: rewrite/rewriteDefine.c:766 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "l'elemento %d della lista RETURNING ha dimensione diversa dalla colonna \"%s\"" -#: rewrite/rewriteDefine.c:764 +#: rewrite/rewriteDefine.c:783 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "la lista di destinazione della regola SELECT ha troppi pochi elementi" -#: rewrite/rewriteDefine.c:765 +#: rewrite/rewriteDefine.c:784 #, c-format msgid "RETURNING list has too few entries" msgstr "la lista RETURNING ha troppi pochi elementi" -#: rewrite/rewriteDefine.c:857 rewrite/rewriteDefine.c:971 -#: 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 "la regola \"%s\" per la relazione \"%s\" non esiste" -#: rewrite/rewriteDefine.c:990 +#: rewrite/rewriteDefine.c:1011 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "non è consentire rinominare una regola ON SELECT" -#: rewrite/rewriteHandler.c:541 +#: rewrite/rewriteHandler.c:554 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "la query WITH \"%s\" appare sia in una regola di azione che nella query che deve essere riscritta" -#: rewrite/rewriteHandler.c:601 +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "Le azioni della regola INSERT...SELECT non sono supportate per le query con istruzioni di modifica dei dati in WITH" + +#: rewrite/rewriteHandler.c:634 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "non è possibile avere liste RETURNING in più di una regola" -#: rewrite/rewriteHandler.c:823 +#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "non è possibile inserire nella colonna \"%s\"" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "impossibile inserire un valore non DEFAULT nella colonna \"%s\"" -#: rewrite/rewriteHandler.c:824 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 "La colonna \"%s\" è una colonna identità definita come GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:826 +#: rewrite/rewriteHandler.c:870 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Usa OVERRIDING SYSTEM VALUE per sovrascrivere." -#: rewrite/rewriteHandler.c:838 +#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la colonna \"%s\" può essere modificata solo a DEFAULT" -#: rewrite/rewriteHandler.c:1000 rewrite/rewriteHandler.c:1018 +#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "più di un assegnamento alla stessa colonna \"%s\"" -#: rewrite/rewriteHandler.c:1921 +#: rewrite/rewriteHandler.c:2111 rewrite/rewriteHandler.c:3978 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "ricorsione infinita individuata nelle regole per la relazione \"%s\"" + +#: rewrite/rewriteHandler.c:2196 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "ricorsione infinita individuata nella regola di sicurezza per la relazione \"%s\"" -#: rewrite/rewriteHandler.c:2241 +#: rewrite/rewriteHandler.c:2516 msgid "Junk view columns are not updatable." msgstr "Le colonne junk di una vista non sono aggiornabili." -#: rewrite/rewriteHandler.c:2246 +#: rewrite/rewriteHandler.c:2521 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Le colonne di vista che non sono colonne della loro relazione di base non sono aggiornabili." -#: rewrite/rewriteHandler.c:2249 +#: rewrite/rewriteHandler.c:2524 msgid "View columns that refer to system columns are not updatable." msgstr "Le colonne di vista che si riferiscono a colonne di sistema non sono aggiornabili." -#: rewrite/rewriteHandler.c:2252 +#: rewrite/rewriteHandler.c:2527 msgid "View columns that return whole-row references are not updatable." msgstr "Le colonne di vista che restituiscono riferimenti a righe intere non sono aggiornabili." -#: rewrite/rewriteHandler.c:2313 +#: rewrite/rewriteHandler.c:2588 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Le viste contenenti DISTINCT non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2316 +#: rewrite/rewriteHandler.c:2591 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Le viste contenenti GROUP BY non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2319 +#: rewrite/rewriteHandler.c:2594 msgid "Views containing HAVING are not automatically updatable." msgstr "Le viste contenenti HAVING non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2322 +#: rewrite/rewriteHandler.c:2597 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Le viste che contengono UNION, INTERSECT o EXCEPT non sono automaticamente aggiornabili." -#: rewrite/rewriteHandler.c:2325 +#: rewrite/rewriteHandler.c:2600 msgid "Views containing WITH are not automatically updatable." msgstr "Le viste contenenti WITH non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2328 +#: rewrite/rewriteHandler.c:2603 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Le viste contenenti LIMIT o OFFSET non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2340 +#: rewrite/rewriteHandler.c:2615 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Le viste che restituiscono funzioni di aggregazione non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2343 +#: rewrite/rewriteHandler.c:2618 msgid "Views that return window functions are not automatically updatable." msgstr "Le viste che restituiscono funzioni finestra non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2346 +#: rewrite/rewriteHandler.c:2621 msgid "Views that return set-returning functions are not automatically updatable." -msgstr "Le viste che restituiscono funzioni insieme non sono aggiornabili automaticamente" +msgstr "Le viste che restituiscono funzioni insieme non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2353 rewrite/rewriteHandler.c:2357 -#: rewrite/rewriteHandler.c:2365 +#: 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 "Le viste che non leggono da una singola tabella o vista non sono aggiornabili automaticamente." -#: rewrite/rewriteHandler.c:2368 +#: rewrite/rewriteHandler.c:2643 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Le viste che contengono TABLESAMPLE non sono automaticamente aggiornabili." -#: rewrite/rewriteHandler.c:2392 +#: rewrite/rewriteHandler.c:2667 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Le viste che non hanno colonne aggiornabili non sono automaticamente aggiornabili." -#: rewrite/rewriteHandler.c:2849 +#: rewrite/rewriteHandler.c:3144 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "non si può inserire nella colonna \"%s\" della vista \"%s\"" -#: rewrite/rewriteHandler.c:2857 +#: rewrite/rewriteHandler.c:3152 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "non si può modificare la colonna \"%s\" della vista \"%s\"" -#: rewrite/rewriteHandler.c:3327 +#: rewrite/rewriteHandler.c:3639 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "Le regole DO INSTEAD NOTIFY non sono supportate per le istruzioni di modifica dei dati in WITH" + +#: rewrite/rewriteHandler.c:3650 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "le regole DO INSTEAD NOTHING non sono supportate per istruzioni di modifica dei dati nel WITH" -#: rewrite/rewriteHandler.c:3341 +#: rewrite/rewriteHandler.c:3664 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "le regole DO INSTEAD NOTHING condizionali non sono supportate per istruzioni di modifica dei dati nel WITH" -#: rewrite/rewriteHandler.c:3345 +#: rewrite/rewriteHandler.c:3668 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "le regole DO ALSO non sono supportate per istruzioni di modifica dei dati nel WITH" -#: rewrite/rewriteHandler.c:3350 +#: rewrite/rewriteHandler.c:3673 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "le regole DO INSTEAD multi-istruzione non sono supportate per istruzioni di modifica dei dati nel WITH" -#: rewrite/rewriteHandler.c:3569 +#: 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 "Le viste con regole DO INSTEAD condizionali non sono aggiornabili automaticamente." + +#: rewrite/rewriteHandler.c:4015 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "non è possibile eseguire INSERT RETURNING sulla relazione \"%s\"" -#: rewrite/rewriteHandler.c:3571 +#: rewrite/rewriteHandler.c:4017 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "È necessaria una regola ON INSERT DO INSTEAD non condizionale con una clausola RETURNING." -#: rewrite/rewriteHandler.c:3576 +#: rewrite/rewriteHandler.c:4022 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "non è possibile eseguire UPDATE RETURNING sulla relazione \"%s\"" -#: rewrite/rewriteHandler.c:3578 +#: rewrite/rewriteHandler.c:4024 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "È necessaria una regola ON UPDATE DO INSTEAD non condizionale con una clausola RETURNING." -#: rewrite/rewriteHandler.c:3583 +#: rewrite/rewriteHandler.c:4029 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "non è possibile eseguire DELETE RETURNING sulla relazione \"%s\"" -#: rewrite/rewriteHandler.c:3585 +#: rewrite/rewriteHandler.c:4031 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "È necessaria una regola ON DELETE DO INSTEAD non condizionale con una clausola RETURNING." -#: rewrite/rewriteHandler.c:3603 +#: 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 con clausola ON CONFLICT non può essere usato in tabelle con una regola su INSERT o UPDATE" -#: rewrite/rewriteHandler.c:3660 +#: rewrite/rewriteHandler.c:4106 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH non può essere usato in una query che viene riscritta da regole in più di una query" -#: rewrite/rewriteManip.c:1003 +#: rewrite/rewriteManip.c:1006 #, c-format msgid "conditional utility statements are not implemented" msgstr "i comandi di utilità condizionali non sono implementati" -#: rewrite/rewriteManip.c:1169 +#: rewrite/rewriteManip.c:1172 +#, c-format +msgid "WHERE CURRENT OF on a view is not implemented" +msgstr "WHERE CURRENT OF su una vista non è implementato" + +#: rewrite/rewriteManip.c:1507 +#, c-format +msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" +msgstr "la variabile NEW nelle regole ON UPDATE non può riferirsi a colonne che fanno parte di un assegnamento multiplo nel comando UPDATE soggetto" + +#: 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 "con una clausola SEARCH o CYCLE, il riferimento ricorsivo alla query WITH \"%s\" deve essere al livello superiore della sua SELECT di destra" + +#: scan.l:465 +msgid "unterminated /* comment" +msgstr "commento /* non terminato" + +#: scan.l:485 +msgid "unterminated bit string literal" +msgstr "letterale di stringa di bit non terminato" + +#: scan.l:499 +msgid "unterminated hexadecimal string literal" +msgstr "letterale di stringa esadecimale non terminato" + +#: scan.l:549 +#, c-format +msgid "unsafe use of string constant with Unicode escapes" +msgstr "uso non sicuro di stringa costante con gli escape Unicode" + +#: scan.l:550 +#, c-format +msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." +msgstr "Le stringhe costanti con escape Unicode non possono essere usate quando standard_conforming_strings è disabilitato." + +#: scan.l:611 +msgid "unhandled previous state in xqs" +msgstr "stato precedente non gestito in xqs" + +#: scan.l:685 +#, c-format +msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +msgstr "Gli escape Unicode devono essere \\uXXXX or \\UXXXXXXXX." + +#: scan.l:696 +#, c-format +msgid "unsafe use of \\' in a string literal" +msgstr "uso non sicuro di \\' in una stringa letterale" + +#: scan.l:697 +#, c-format +msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." +msgstr "Usa '' per scrivere gli apici in una stringa. \\' non è sicuro in codifiche solo client." + +#: scan.l:769 +msgid "unterminated dollar-quoted string" +msgstr "stringa delimitata da dollari non terminata" + +#: scan.l:786 scan.l:796 +msgid "zero-length delimited identifier" +msgstr "identificativo delimitato di lunghezza zero" + +#: scan.l:807 syncrep_scanner.l:91 +msgid "unterminated quoted identifier" +msgstr "identificativo tra virgolette non terminato" + +#: scan.l:970 +msgid "operator too long" +msgstr "operatore troppo lungo" + +#: scan.l:983 +msgid "trailing junk after parameter" +msgstr "spazzatura finale dopo il parametro" + +#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 +msgid "trailing junk after numeric literal" +msgstr "spazzatura finale dopo il letterale numerico" + +#. translator: %s is typically the translation of "syntax error" +#: scan.l:1183 +#, c-format +msgid "%s at end of input" +msgstr "%s alla fine dell'input" + +#. translator: first %s is typically the translation of "syntax error" +#: scan.l:1191 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s a o presso \"%s\"" + +#: scan.l:1382 +#, c-format +msgid "nonstandard use of \\' in a string literal" +msgstr "uso non standard di \\' in una stringa letterale" + +#: scan.l:1383 +#, c-format +msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." +msgstr "Usa '' per scrivere gli apici nelle stringhe, oppure usa la sintassi di escape delle stringhe (E'...')." + +#: scan.l:1392 +#, c-format +msgid "nonstandard use of \\\\ in a string literal" +msgstr "uso non standard di \\\\ in una stringa letterale" + +#: scan.l:1393 +#, c-format +msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." +msgstr "Usa la sintassi di escape delle stringhe per i backslash, cioè E'\\\\'." + +#: scan.l:1407 #, c-format -msgid "WHERE CURRENT OF on a view is not implemented" -msgstr "WHERE CURRENT OF su una vista non è implementato" +msgid "nonstandard use of escape in a string literal" +msgstr "uso non standard dell'escape in una stringa letterale" -#: rewrite/rewriteManip.c:1503 +#: scan.l:1408 #, c-format -msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" -msgstr "la variabile NEW nelle regole ON UPDATE non può riferirsi a colonne che fanno parte di un assegnamento multiplo nel comando UPDATE soggetto" +msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." +msgstr "Usa la sintassi di escape per le stringhe per effettuare gli escape, cioè, E'\\r\\n'." -#: snowball/dict_snowball.c:177 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "non è disponibile uno stemmer Snowball per la lingua \"%s\" e la codifica \"%s\"" -#: snowball/dict_snowball.c:200 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 "più di un parametro StopWords" -#: snowball/dict_snowball.c:209 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "più di un parametro Language" -#: snowball/dict_snowball.c:216 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "parametro Snowball sconosciuto: \"%s\"" -#: snowball/dict_snowball.c:224 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "parametro Language mancante" -#: statistics/dependencies.c:534 -#, c-format -msgid "invalid zero-length item array in MVDependencies" -msgstr "elemento array a lunghezza zero non valido in MVDependencies" - -#: statistics/dependencies.c:672 statistics/dependencies.c:725 -#: statistics/mvdistinct.c:341 statistics/mvdistinct.c:394 -#: utils/adt/pseudotypes.c:94 utils/adt/pseudotypes.c:122 -#: utils/adt/pseudotypes.c:147 utils/adt/pseudotypes.c:171 -#: utils/adt/pseudotypes.c:282 utils/adt/pseudotypes.c:307 -#: utils/adt/pseudotypes.c:335 utils/adt/pseudotypes.c:363 -#: utils/adt/pseudotypes.c:393 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "non è possibile accettare un valore del tipo %s" - -#: statistics/extended_stats.c:104 +#: statistics/extended_stats.c:179 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "calcolo della statistica \"%s.%s\" fallito per la relazione \"%s.%s\"" -#: statistics/mvdistinct.c:262 -#, c-format -msgid "invalid ndistinct magic %08x (expected %08x)" -msgstr "valore magico ndistinct %08x non valido (atteso %08x)" - -#: statistics/mvdistinct.c:267 -#, c-format -msgid "invalid ndistinct type %d (expected %d)" -msgstr "tipo ndistinct %d non valido (atteso %d)" - -#: statistics/mvdistinct.c:272 -#, c-format -msgid "invalid zero-length item array in MVNDistinct" -msgstr "elemento array a lunghezza zero non valido in MVDistinct" - -#: statistics/mvdistinct.c:281 +#: statistics/mcv.c:1372 #, c-format -msgid "invalid MVNDistinct size %zd (expected at least %zd)" -msgstr "dimensione MVDistinct %zd non valida (attesa almeno %zd)" +msgid "function returning record called in context that cannot accept type record" +msgstr "funzione che restituisce record eseguita in un contesto che non può accettare il tipo record" -#: storage/buffer/bufmgr.c:544 storage/buffer/bufmgr.c:657 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "non è possibile accedere a tabelle temporanee di altre sessioni" -#: storage/buffer/bufmgr.c:807 +#: storage/buffer/bufmgr.c:851 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "impossibile estendere la relazione %s oltre %u blocchi" + +#: storage/buffer/bufmgr.c:938 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "dati oltre fine file inaspettati nel blocco %u della relazione %s" -#: storage/buffer/bufmgr.c:809 +#: storage/buffer/bufmgr.c:940 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Questo fenomeno è stato riportato con kernel difettosi: considera l'aggiornamento del tuo sistema." -#: storage/buffer/bufmgr.c:907 +#: storage/buffer/bufmgr.c:1039 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "pagina non valida nel blocco %u della relazione %s; azzeramento della pagina" -#: storage/buffer/bufmgr.c:4013 +#: storage/buffer/bufmgr.c:4669 #, c-format msgid "could not write block %u of %s" msgstr "scrittura del blocco %u di %s fallita" -#: storage/buffer/bufmgr.c:4015 +#: storage/buffer/bufmgr.c:4671 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Più di un fallimento --- l'errore in scrittura potrebbe essere permanente." -#: storage/buffer/bufmgr.c:4036 storage/buffer/bufmgr.c:4055 +#: storage/buffer/bufmgr.c:4692 storage/buffer/bufmgr.c:4711 #, c-format msgid "writing block %u of relation %s" msgstr "scrittura del blocco %u della relazione %s" -#: storage/buffer/bufmgr.c:4358 +#: storage/buffer/bufmgr.c:5015 #, c-format msgid "snapshot too old" msgstr "snapshot troppo vecchio" -#: storage/buffer/localbuf.c:199 +#: storage/buffer/localbuf.c:205 #, c-format msgid "no empty local buffer available" msgstr "nessun buffer locale vuoto disponibile" -#: storage/buffer/localbuf.c:427 +#: storage/buffer/localbuf.c:433 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "non è possibile accedere alle tabelle temporanee durante un'operazione parallela" -#: storage/file/buffile.c:317 +#: storage/file/buffile.c:333 +#, c-format +msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "impossibile aprire il file temporaneo \"%s\" da BufFile \"%s\": %m" + +#: 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 "impossibile determinare la dimensione del file temporaneo \"%s\" da BufFile \"%s\": %m" + +#: storage/file/buffile.c:923 +#, c-format +msgid "could not delete fileset \"%s\": %m" +msgstr "impossibile eliminare il set di file \"%s\": %m" + +#: storage/file/buffile.c:941 storage/smgr/md.c:310 storage/smgr/md.c:890 #, c-format -msgid "could not open BufFile \"%s\"" -msgstr "errore nell'apertura del BufFile \"%s\"" +msgid "could not truncate file \"%s\": %m" +msgstr "troncamento del file \"%s\" fallito: %m" -#: storage/file/fd.c:451 storage/file/fd.c:523 storage/file/fd.c:559 +#: 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 "non è stato possibile scaricare i dati sporchi: %m" -#: storage/file/fd.c:481 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "non è stato possibile determinare la dimensione dei dati sporchi: %m" -#: storage/file/fd.c:533 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "non è possibile effettuare munmap() mentre si stanno scaricando i dati sporchi: %m" -#: storage/file/fd.c:734 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "creazione del collegamento il file \"%s\" a \"%s\" fallita: %m" -#: storage/file/fd.c:828 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fallito: %m" -#: storage/file/fd.c:918 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "descrittori di file non sufficienti per avviare il processo server" -#: storage/file/fd.c:919 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "Il sistema ne consente %d, ne occorrono almeno %d." -#: storage/file/fd.c:970 storage/file/fd.c:2371 storage/file/fd.c:2473 -#: storage/file/fd.c:2625 +#: 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 "descrittori di file esauriti: %m; sto rilasciando e riprovando" -#: storage/file/fd.c:1312 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "file temporaneo: percorso \"%s\", dimensione %lu" -#: storage/file/fd.c:1444 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "errore nella creazione della directory temporanea \"%s\": %m" -#: storage/file/fd.c:1451 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "errore nella creazione della sottodirectory temporanea \"%s\": %m" -#: storage/file/fd.c:1644 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "errore nella creazione del file temporaneo \"%s\": %m" -#: storage/file/fd.c:1679 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "errore nell'apertura del file temporaneo \"%s\": %m" -#: storage/file/fd.c:1720 +#: storage/file/fd.c:1939 +#, c-format +msgid "could not unlink temporary file \"%s\": %m" +msgstr "impossibile scollegare il file temporaneo \"%s\": %m" + +#: storage/file/fd.c:2027 #, c-format -msgid "cannot unlink temporary file \"%s\": %m" -msgstr "errore nell'unlink del file temporaneo \"%s\": %m" +msgid "could not delete file \"%s\": %m" +msgstr "impossibile eliminare il file \"%s\": %m" -#: storage/file/fd.c:2002 +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "la dimensione del file temporaneo supera temp_file_limit (%dkB)" -#: storage/file/fd.c:2347 storage/file/fd.c:2406 +#: 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) superato tentando di aprire il file \"%s\"" -#: storage/file/fd.c:2446 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "maxAllocatedDescs (%d) superato tentando di eseguire il comando \"%s\"" -#: storage/file/fd.c:2601 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "maxAllocatedDescs (%d) superato tentando di aprire la directory \"%s\"" -#: storage/file/fd.c:2692 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "lettura della directory \"%s\" fallita: %m" - -#: storage/file/fd.c:3124 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "trovato file non previsto nella directory dei file temporanei: \"%s\"" -#: storage/file/fd.c:3443 +#: storage/file/fd.c:3387 #, c-format -msgid "could not rmdir directory \"%s\": %m" -msgstr "errore nella rimozione della directory \"%s\": %m" +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizzazione della directory dei dati (syncfs), tempo trascorso: %ld.%02d s, percorso corrente: %s" -#: storage/file/sharedfileset.c:93 +#: storage/file/fd.c:3401 #, c-format -msgid "could not attach to a SharedFileSet that is already destroyed" -msgstr "errore collegandosi ad uno SharedFileSet che è stato già distrutto" +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "impossibile sincronizzare il file system per il file \"%s\": %m" -#: storage/ipc/dsm.c:351 +#: storage/file/fd.c:3619 #, c-format -msgid "dynamic shared memory control segment is corrupt" -msgstr "il segmento di controllo della memoria dinamica condivisa è corrotto" +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizzazione della directory dei dati (pre-fsync), tempo trascorso: %ld.%02d s, percorso corrente: %s" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "sincronizzazione della directory dei dati (fsync), tempo trascorso: %ld.%02d s, percorso corrente: %s" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "ripristino delle relazioni non registrate (init), tempo trascorso: %ld.%02d s, percorso corrente: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "ripristino delle relazioni non registrate (pulizia), tempo trascorso: %ld.%02d s, percorso corrente: %s" -#: storage/ipc/dsm.c:398 +#: storage/file/sharedfileset.c:79 #, c-format -msgid "dynamic shared memory is disabled" -msgstr "la memoria dinamica condivisa è disabilitata" +msgid "could not attach to a SharedFileSet that is already destroyed" +msgstr "errore collegandosi ad uno SharedFileSet che è stato già distrutto" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:353 #, c-format -msgid "Set dynamic_shared_memory_type to a value other than \"none\"." -msgstr "Imposta dynamic_shared_memory_type ad un valore diverso da \"none\"." +msgid "dynamic shared memory control segment is corrupt" +msgstr "il segmento di controllo della memoria dinamica condivisa è corrotto" -#: storage/ipc/dsm.c:419 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "il segmento di controllo della memoria dinamica condivisa non è valido" -#: storage/ipc/dsm.c:515 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "troppi segmenti di memoria dinamica condivisa" -#: storage/ipc/dsm_impl.c:264 storage/ipc/dsm_impl.c:373 -#: storage/ipc/dsm_impl.c:594 storage/ipc/dsm_impl.c:709 -#: storage/ipc/dsm_impl.c:880 storage/ipc/dsm_impl.c:1024 +#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "unmap del segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:274 storage/ipc/dsm_impl.c:604 -#: storage/ipc/dsm_impl.c:719 storage/ipc/dsm_impl.c:890 +#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "rimozione del segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:295 storage/ipc/dsm_impl.c:790 -#: storage/ipc/dsm_impl.c:904 +#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 storage/ipc/dsm_impl.c:843 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "apertura del segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:319 storage/ipc/dsm_impl.c:620 -#: storage/ipc/dsm_impl.c:835 storage/ipc/dsm_impl.c:928 +#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "lettura informazioni sul segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:347 storage/ipc/dsm_impl.c:947 -#: storage/ipc/dsm_impl.c:997 +#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "ridimensionamento del segmento di memoria condivisa \"%s\" a %zu byte fallito: %m" -#: storage/ipc/dsm_impl.c:397 storage/ipc/dsm_impl.c:641 -#: storage/ipc/dsm_impl.c:811 storage/ipc/dsm_impl.c:1048 +#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "map del segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:576 +#: storage/ipc/dsm_impl.c:526 #, c-format msgid "could not get shared memory segment: %m" msgstr "impossibile ottenere un segmento di memoria condivisa: %m" -#: storage/ipc/dsm_impl.c:775 +#: storage/ipc/dsm_impl.c:714 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "creazione del segmento di memoria condivisa \"%s\" fallito: %m" -#: storage/ipc/dsm_impl.c:1090 storage/ipc/dsm_impl.c:1138 +#: storage/ipc/dsm_impl.c:951 +#, c-format +msgid "could not close shared memory segment \"%s\": %m" +msgstr "impossibile chiudere il segmento di memoria condivisa \"%s\": %m" + +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "duplicazione dell'handle per \"%s\" fallita: %m" -#: storage/ipc/latch.c:829 +#: storage/ipc/procarray.c:3812 +#, c-format +msgid "database \"%s\" is being used by prepared transactions" +msgstr "il database \"%s\" viene utilizzato dalle transazioni preparate" + +#: storage/ipc/procarray.c:3844 storage/ipc/signalfuncs.c:226 +#, c-format +msgid "must be a superuser to terminate superuser process" +msgstr "solo un superutente può terminare il processo di un superutente" + +#: storage/ipc/procarray.c:3851 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 "occorre essere un membro del ruolo la cui processo deve essere terminato o membro di pg_signal_backend" + +#: storage/ipc/procsignal.c:419 #, c-format -msgid "epoll_ctl() failed: %m" -msgstr "epoll_ctl() fallita: %m" +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "ancora in attesa che il backend con PID %lu accetti ProcSignalBarrier" -#: storage/ipc/latch.c:1060 +#: storage/ipc/shm_mq.c:384 #, c-format -msgid "epoll_wait() failed: %m" -msgstr "epoll_wait() fallita: %m" +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "impossibile inviare un messaggio di dimensione %zu tramite la coda di memoria condivisa" -#: storage/ipc/latch.c:1182 +#: storage/ipc/shm_mq.c:719 #, c-format -msgid "poll() failed: %m" -msgstr "poll() fallito: %m" +msgid "invalid message size %zu in shared memory queue" +msgstr "dimensione messaggio non valida %zu nella coda di memoria condivisa" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:905 -#: storage/lmgr/lock.c:943 storage/lmgr/lock.c:2730 storage/lmgr/lock.c:4055 -#: storage/lmgr/lock.c:4120 storage/lmgr/lock.c:4412 -#: storage/lmgr/predicate.c:2355 storage/lmgr/predicate.c:2370 -#: storage/lmgr/predicate.c:3762 storage/lmgr/predicate.c:4905 -#: utils/hash/dynahash.c:1065 +#: 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 "memoria condivisa esaurita" -#: storage/ipc/shmem.c:165 storage/ipc/shmem.c:246 +#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "memoria condivisa esaurita (richiesti %zu byte)" -#: storage/ipc/shmem.c:421 +#: storage/ipc/shmem.c:445 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "creazione dell'elemento ShmemIndex fallita per la struttura di dati \"%s\"" -#: storage/ipc/shmem.c:436 +#: storage/ipc/shmem.c:460 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" -msgstr "dimensione elemento ShmemIndex errata per la struttura di dati \"%s\": attesi %zu, effettivi %zu" +msgstr "Dimensione elemento ShmemIndex errata per la struttura di dati \"%s\": attesi %zu, effettivi %zu" -#: storage/ipc/shmem.c:453 +#: storage/ipc/shmem.c:479 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "memoria condivisa per la struttura di dati \"%s\" insufficiente (richiesti %zu byte)" -#: storage/ipc/shmem.c:484 storage/ipc/shmem.c:503 +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 #, c-format msgid "requested shared memory size overflows size_t" msgstr "la dimensione richiesta di memoria condivisa supera size_t" -#: storage/ipc/standby.c:558 tcop/postgres.c:3033 +#: storage/ipc/signalfuncs.c:72 +#, c-format +msgid "PID %d is not a PostgreSQL backend process" +msgstr "Il PID %d non è un processo di backend di PostgreSQL" + +#: 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 "invio del segnale al processo %d fallito: %m" + +#: storage/ipc/signalfuncs.c:124 +#, c-format +msgid "must be a superuser to cancel superuser query" +msgstr "solo un superutente può annullare la query di un superutente" + +#: 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 "occorre essere un membro del ruolo la cui query deve essere annullata o membro di pg_signal_backend" + +#: storage/ipc/signalfuncs.c:170 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "impossibile verificare l'esistenza del back-end con 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] "il back-end con PID %d non è terminato entro %lld millisecondo" +msgstr[1] "il back-end con PID %d non è terminato entro %lld millisecondi" + +#: storage/ipc/signalfuncs.c:219 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" non deve essere negativo" + +#: storage/ipc/signalfuncs.c:271 +#, c-format +msgid "must be superuser to rotate log files with adminpack 1.0" +msgstr "solo i superutenti possono rotare i file di log con adminpack 1.0" + +#. translator: %s is a SQL function name +#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 +#, c-format +msgid "Consider using %s, which is part of core, instead." +msgstr "Considera invece l'utilizzo di %s, che fa parte del core." + +#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 +#, c-format +msgid "rotation not possible because log collection not active" +msgstr "non è stato possibile eseguire la rotazione perché la raccolta dei log non è attiva" + +#: storage/ipc/standby.c:307 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "recupero ancora in attesa dopo %ld.%03d ms: %s" + +#: storage/ipc/standby.c:316 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "recupero terminato in attesa dopo %ld.%03d ms: %s" + +#: storage/ipc/standby.c:883 tcop/postgres.c:3332 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "annullamento dell'istruzione a causa di un conflitto con il ripristino" -#: storage/ipc/standby.c:559 tcop/postgres.c:2306 +#: storage/ipc/standby.c:884 tcop/postgres.c:2487 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "La transazione utente ha causato un deadlock del buffer con il ripristino." -#: storage/large_object/inv_api.c:190 +#: storage/ipc/standby.c:1423 +msgid "unknown reason" +msgstr "ragione sconosciuta" + +#: storage/ipc/standby.c:1428 +msgid "recovery conflict on buffer pin" +msgstr "conflitto di ripristino sul pin del buffer" + +#: storage/ipc/standby.c:1431 +msgid "recovery conflict on lock" +msgstr "conflitto di ripristino sul blocco" + +#: storage/ipc/standby.c:1434 +msgid "recovery conflict on tablespace" +msgstr "conflitto di ripristino sul tablespace" + +#: storage/ipc/standby.c:1437 +msgid "recovery conflict on snapshot" +msgstr "conflitto di ripristino sullo snapshot" + +#: storage/ipc/standby.c:1440 +msgid "recovery conflict on buffer deadlock" +msgstr "conflitto di ripristino in caso di deadlock del buffer" + +#: storage/ipc/standby.c:1443 +msgid "recovery conflict on database" +msgstr "conflitto di ripristino sul database" + +#: 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 "elemento pg_largeobject per OID %u, pagina %d ha la dimensione del campo dati errata %d" -#: storage/large_object/inv_api.c:271 +#: storage/large_object/inv_api.c:274 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "flag non validi per l'apertura di un large object: %d" -#: storage/large_object/inv_api.c:461 +#: storage/large_object/inv_api.c:457 #, c-format msgid "invalid whence setting: %d" msgstr "impostazione \"da dove\" non valida: %d" -#: storage/large_object/inv_api.c:633 +#: storage/large_object/inv_api.c:629 #, c-format msgid "invalid large object write request size: %d" msgstr "dimensione della richiesta di scrittura large object non valida: %d" -#: storage/lmgr/deadlock.c:1109 +#: storage/lmgr/deadlock.c:1122 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." -msgstr "Il processo %d è in attesa di %s su %s; bloccato dal processo %d" +msgstr "Il processo %d è in attesa di %s su %s; bloccato dal processo %d." -#: storage/lmgr/deadlock.c:1128 +#: storage/lmgr/deadlock.c:1141 #, c-format msgid "Process %d: %s" msgstr "Processo %d: %s" -#: storage/lmgr/deadlock.c:1137 +#: storage/lmgr/deadlock.c:1150 #, c-format msgid "deadlock detected" msgstr "rilevato deadlock" -#: storage/lmgr/deadlock.c:1140 +#: storage/lmgr/deadlock.c:1153 #, c-format msgid "See server log for query details." msgstr "Vedi i log del server per i dettagli della query." -#: storage/lmgr/lmgr.c:767 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "durante la modifica della tupla (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:770 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "durante l'eliminazione della tupla (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:773 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "durante il blocco della tupla (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:776 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "durante il blocco della versione modificata (%u,%u) della tupla nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:779 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "durante l'inserimento della tupla di indice (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:782 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "durante il controllo di univocità della tupla (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:785 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "durante il ricontrollo della tupla modificata (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:788 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "durante il controllo del vincolo di esclusione sulla tupla (%u,%u) nella relazione \"%s\"" -#: storage/lmgr/lmgr.c:1008 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "la relazione %u del database %u" -#: storage/lmgr/lmgr.c:1014 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "l'estensione della relazione %u del database %u" -#: storage/lmgr/lmgr.c:1020 +#: storage/lmgr/lmgr.c:1147 +#, c-format +msgid "pg_database.datfrozenxid of database %u" +msgstr "pg_database.datfrozenxid del database %u" + +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "la pagina %u della relazione %u del database %u" -#: storage/lmgr/lmgr.c:1027 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "la tupla (%u,%u) della relazione %u del database %u" -#: storage/lmgr/lmgr.c:1035 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "la transazione %u" -#: storage/lmgr/lmgr.c:1040 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "la transazione virtuale %d/%u" -#: storage/lmgr/lmgr.c:1046 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "token speculativo %u della transazione %u" -#: storage/lmgr/lmgr.c:1052 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "l'oggetto %u di classe %u del database %u" -#: storage/lmgr/lmgr.c:1060 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "il lock utente [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1067 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "l'advisory lock [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1075 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "tipo di locktag %d sconosciuto" -#: storage/lmgr/lock.c:740 +#: storage/lmgr/lock.c:803 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "non è possibile acquisire lock in modo %s sugli oggetti del database mentre è in corso il ripristino" -#: storage/lmgr/lock.c:742 +#: storage/lmgr/lock.c:805 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Solo RowExclusiveLock o inferiore può essere acquisito sugli oggetti database durante il ripristino." -#: storage/lmgr/lock.c:906 storage/lmgr/lock.c:944 storage/lmgr/lock.c:2731 -#: storage/lmgr/lock.c:4056 storage/lmgr/lock.c:4121 storage/lmgr/lock.c:4413 +#: 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 "Potrebbe essere necessario incrementare max_locks_per_transaction." -#: storage/lmgr/lock.c:3172 storage/lmgr/lock.c:3288 +#: 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 "non è possibile eseguire PREPARE tenendo sia lock a livello di sessione che di transazione sullo stesso oggetto" -#: storage/lmgr/predicate.c:682 +#: storage/lmgr/predicate.c:700 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "elementi non sufficienti in RWConflictPool per registrare un conflitto di lettura/scrittura" -#: storage/lmgr/predicate.c:683 storage/lmgr/predicate.c:711 +#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 #, c-format msgid "You might need to run fewer transactions at a time or increase max_connections." msgstr "Potrebbe essere necessario eseguire meno transazioni per volta oppure incrementare max_connections." -#: storage/lmgr/predicate.c:710 +#: storage/lmgr/predicate.c:728 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "elementi non sufficienti in RWConflictPool per registrare un potenziale conflitto di lettura/scrittura" -#: storage/lmgr/predicate.c:1515 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "lo snapshot deferibile era insicuro; ne sto provando uno nuovo" - -#: storage/lmgr/predicate.c:1604 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\" è impostato a \"serializable\"." -#: storage/lmgr/predicate.c:1605 +#: storage/lmgr/predicate.c:1696 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Puoi usare \"SET default_transaction_isolation = 'repeatable read'\" per cambiare il valore predefinito." -#: storage/lmgr/predicate.c:1645 +#: storage/lmgr/predicate.c:1747 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "una transazione che importa uno snapshot non può essere READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1725 utils/time/snapmgr.c:621 -#: utils/time/snapmgr.c:627 +#: 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 "non è stato possibile importare lo snapshot richiesto" -#: storage/lmgr/predicate.c:1726 utils/time/snapmgr.c:628 +#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Il processo di origine con PID %d non è più in esecuzione." -#: storage/lmgr/predicate.c:2356 storage/lmgr/predicate.c:2371 -#: storage/lmgr/predicate.c:3763 +#: 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 "Potrebbe essere necessario incrementare max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:3917 storage/lmgr/predicate.c:4006 -#: storage/lmgr/predicate.c:4014 storage/lmgr/predicate.c:4053 -#: storage/lmgr/predicate.c:4292 storage/lmgr/predicate.c:4629 -#: storage/lmgr/predicate.c:4641 storage/lmgr/predicate.c:4683 -#: storage/lmgr/predicate.c:4721 +#: 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 "serializzazione dell'accesso fallita a causa di dipendenze di lettura/scrittura tra le transazioni" -#: storage/lmgr/predicate.c:3919 storage/lmgr/predicate.c:4008 -#: storage/lmgr/predicate.c:4016 storage/lmgr/predicate.c:4055 -#: storage/lmgr/predicate.c:4294 storage/lmgr/predicate.c:4631 -#: storage/lmgr/predicate.c:4643 storage/lmgr/predicate.c:4685 -#: storage/lmgr/predicate.c:4723 +#: 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 "La transazione potrebbe riuscire se ritentata." -#: storage/lmgr/proc.c:1311 +#: storage/lmgr/proc.c:355 #, c-format -msgid "Process %d waits for %s on %s." -msgstr "Processo %d in attesa di %s su %s." - -#: storage/lmgr/proc.c:1322 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "invio di annullamento per bloccare l'autovacuum con PID %d" - -#: storage/lmgr/proc.c:1340 utils/adt/misc.c:270 -#, c-format -msgid "could not send signal to process %d: %m" -msgstr "invio del segnale al processo %d fallito: %m" +msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" +msgstr "il numero di richieste di connessioni di standby supera max_wal_senders (attualmente %d)" -#: storage/lmgr/proc.c:1442 +#: 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 "il processo %d ha evitato un deadlock per %s su %s modificando l'ordine della coda dopo %ld.%03d ms" -#: storage/lmgr/proc.c:1457 +#: storage/lmgr/proc.c:1542 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "il processo %d ha individuato un deadlock mentre era in attesa di %s su %s dopo %ld.%03d ms" -#: storage/lmgr/proc.c:1466 +#: storage/lmgr/proc.c:1551 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "il processo %d è ancora un attesa di %s su %s dopo %ld.%03d ms" -#: storage/lmgr/proc.c:1473 +#: storage/lmgr/proc.c:1558 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "il processo %d ha acquisito %s su %s dopo %ld.%03d ms" -#: storage/lmgr/proc.c:1489 +#: storage/lmgr/proc.c:1575 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "il processo %d ha fallito l'acquisizione di %s su %s dopo %ld.%03d ms" -#: storage/page/bufpage.c:151 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "verifica della pagina fallita, somma di controllo calcolata %u ma era attesa %u" -#: storage/page/bufpage.c:213 storage/page/bufpage.c:507 -#: storage/page/bufpage.c:744 storage/page/bufpage.c:877 -#: storage/page/bufpage.c:973 storage/page/bufpage.c:1083 +#: 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 "puntatore di pagina corrotto: lower = %u, upper = %u, special = %u" -#: storage/page/bufpage.c:529 +#: storage/page/bufpage.c:759 #, c-format -msgid "corrupted item pointer: %u" -msgstr "puntatore di elemento corrotto: %u" +msgid "corrupted line pointer: %u" +msgstr "puntatore di linea danneggiato: %u" -#: storage/page/bufpage.c:556 storage/page/bufpage.c:928 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "lunghezza dell'elemento corrotta: totale %u, spazio disponibile %u" -#: storage/page/bufpage.c:763 storage/page/bufpage.c:989 -#: storage/page/bufpage.c:1099 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format -msgid "corrupted item pointer: offset = %u, size = %u" -msgstr "puntatore di elemento corrotto: offset = %u, size = %u" +msgid "corrupted line pointer: offset = %u, size = %u" +msgstr "puntatore di linea danneggiato: offset = %u, dimensione = %u" -#: storage/page/bufpage.c:901 -#, c-format -msgid "corrupted item pointer: offset = %u, length = %u" -msgstr "puntatore di elemeno corrotto: offset = %u, lunghezza = %u" - -#: storage/smgr/md.c:448 storage/smgr/md.c:974 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "troncamento del file \"%s\" fallito: %m" - -#: storage/smgr/md.c:515 +#: storage/smgr/md.c:456 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "estendere il file \"%s\" oltre %u blocchi" -#: storage/smgr/md.c:537 storage/smgr/md.c:754 storage/smgr/md.c:830 -#, c-format -msgid "could not seek to block %u in file \"%s\": %m" -msgstr "spostamento al blocco %u nel file \"%s\" fallito: %m" - -#: storage/smgr/md.c:545 +#: storage/smgr/md.c:471 #, c-format msgid "could not extend file \"%s\": %m" msgstr "non è stato possibile estendere il file \"%s\": %m" -#: storage/smgr/md.c:547 storage/smgr/md.c:554 storage/smgr/md.c:857 -#, c-format -msgid "Check free disk space." -msgstr "Controlla lo spazio libero sul disco." - -#: storage/smgr/md.c:551 +#: storage/smgr/md.c:477 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "non è stato possibile estendere il file \"%s\": scritti soli %d byte di %d nel blocco %u" -#: storage/smgr/md.c:772 +#: storage/smgr/md.c:692 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "lettura del blocco %u nel file \"%s\" fallita: %m" -#: storage/smgr/md.c:788 +#: storage/smgr/md.c:708 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "lettura del blocco %u nel file \"%s\" fallita: letti soli %d byte di %d" -#: storage/smgr/md.c:848 +#: storage/smgr/md.c:762 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "scrittura del blocco %u nel file \"%s\" fallita: %m" -#: storage/smgr/md.c:853 +#: storage/smgr/md.c:767 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "lettura del blocco %u nel file \"%s\" fallita: scritti solo %d byte di %d" -#: storage/smgr/md.c:945 +#: storage/smgr/md.c:861 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "troncamento del file \"%s\" a %u blocchi fallito: ora è di soli %u blocchi" -#: storage/smgr/md.c:1000 +#: storage/smgr/md.c:916 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "troncamento del file \"%s\" a %u blocchi fallito: %m" -#: storage/smgr/md.c:1282 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "fsync del file \"%s\" fallito ma sto ritentando: %m" - -#: storage/smgr/md.c:1445 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "inoltro della richiesta di fsync fallito perché la coda di richieste è piena" - -#: storage/smgr/md.c:1951 +#: storage/smgr/md.c:1315 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "apertura del file \"%s\" fallita (blocco di destinazione %u): il segmento precedente è di soli %u blocchi" -#: storage/smgr/md.c:1965 +#: storage/smgr/md.c:1329 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "apertura del file \"%s\" fallita (blocco di destinazione %u): %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 "La dimensione dell'argomento %d non è valida nel messaggi di chiamata di funzione" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "impossibile chiamare la funzione \"%s\" tramite l'interfaccia fastpath" -#: tcop/fastpath.c:307 +#: tcop/fastpath.c:233 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "chiamata funzione fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:389 tcop/postgres.c:1195 tcop/postgres.c:1459 -#: tcop/postgres.c:1841 tcop/postgres.c:2062 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 tcop/postgres.c:2036 tcop/postgres.c:2268 #, c-format msgid "duration: %s ms" msgstr "durata: %s ms" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "durata: %s ms chiamata funzione 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 "la chiamata alla funzione contiene %d parametri ma la funzione ne richiede %d" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:360 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "la chiamata alla funzione contiene %d formati di parametri ma %d parametri" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:384 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "formato dei dati binari non corretto nell'argomento %d della funzione" +msgid "invalid argument size %d in function call message" +msgstr "la dimensione dell'argomento %d non è valida nel messaggi di chiamata di funzione" -#: tcop/postgres.c:359 tcop/postgres.c:395 tcop/postgres.c:422 +#: tcop/fastpath.c:447 #, c-format -msgid "unexpected EOF on client connection" -msgstr "fine file inaspettata nella connessione al client" +msgid "incorrect binary data format in function argument %d" +msgstr "formato dei dati binari non corretto nell'argomento %d della funzione" -#: tcop/postgres.c:445 tcop/postgres.c:457 tcop/postgres.c:468 -#: tcop/postgres.c:480 tcop/postgres.c:4385 +#: tcop/postgres.c:444 tcop/postgres.c:4811 #, c-format msgid "invalid frontend message type %d" msgstr "messaggio frontend di tipo %d non valido" -#: tcop/postgres.c:950 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "istruzione: %s" -#: tcop/postgres.c:1200 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "durata: %s ms istruzione: %s" -#: tcop/postgres.c:1250 -#, c-format -msgid "parse %s: %s" -msgstr "analisi di %s: %s" - -#: tcop/postgres.c:1307 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "non è possibile inserire comandi multipli in una istruzione preparata" -#: tcop/postgres.c:1464 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "durata: %s ms analisi di %s: %s" -#: tcop/postgres.c:1509 -#, c-format -msgid "bind %s to %s" -msgstr "bind di %s a %s" - -#: tcop/postgres.c:1528 tcop/postgres.c:2354 +#: tcop/postgres.c:1648 tcop/postgres.c:2583 #, c-format msgid "unnamed prepared statement does not exist" msgstr "l'istruzione preparata senza nome non esiste" -#: tcop/postgres.c:1571 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "il messaggio di bind ha %d formati di parametri ma %d parametri" -#: tcop/postgres.c:1577 +#: tcop/postgres.c:1695 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "il messaggio di bind fornisce %d parametri, ma l'istruzione preparata \"%s\" ne richiede %d" -#: tcop/postgres.c:1748 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "formato del dato binario errato nel parametro di bind %d" -#: tcop/postgres.c:1846 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "durata: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:1894 tcop/postgres.c:2438 +#: tcop/postgres.c:2091 tcop/postgres.c:2666 #, c-format msgid "portal \"%s\" does not exist" msgstr "il portale \"%s\" non esiste" -#: tcop/postgres.c:1979 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:1981 tcop/postgres.c:2070 +#: tcop/postgres.c:2162 tcop/postgres.c:2276 msgid "execute fetch from" msgstr "esecuzione di fetch da" -#: tcop/postgres.c:1982 tcop/postgres.c:2071 +#: tcop/postgres.c:2163 tcop/postgres.c:2277 msgid "execute" msgstr "esecuzione di" -#: tcop/postgres.c:2067 +#: tcop/postgres.c:2273 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "durata: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2193 +#: tcop/postgres.c:2419 #, c-format msgid "prepare: %s" msgstr "preparazione: %s" -#: tcop/postgres.c:2259 +#: tcop/postgres.c:2444 #, c-format msgid "parameters: %s" msgstr "parametri: %s" -#: tcop/postgres.c:2278 +#: tcop/postgres.c:2459 #, c-format msgid "abort reason: recovery conflict" msgstr "motivo dell'interruzione: conflitto di recupero" -#: tcop/postgres.c:2294 +#: tcop/postgres.c:2475 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "L'utente stava trattenendo un pin di shared buffer troppo a lungo." -#: tcop/postgres.c:2297 +#: tcop/postgres.c:2478 #, c-format msgid "User was holding a relation lock for too long." msgstr "L'utente stava trattenendo un lock di relazione troppo a lungo." -#: tcop/postgres.c:2300 +#: tcop/postgres.c:2481 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "L'utente stava usando o potrebbe aver usato un tablespace che deve essere eliminato." -#: tcop/postgres.c:2303 +#: tcop/postgres.c:2484 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "L'utente potrebbe aver avuto bisogno di vedere versioni di righe che devono essere rimosse." -#: tcop/postgres.c:2309 +#: tcop/postgres.c:2490 #, c-format msgid "User was connected to a database that must be dropped." msgstr "L'utente era connesso ad un database che deve essere eliminato." -#: tcop/postgres.c:2634 +#: tcop/postgres.c:2529 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "parametro \"%s\" del portale $%d = %s" + +#: tcop/postgres.c:2532 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "parametro \"%s\" del portale $%d" + +#: tcop/postgres.c:2538 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "parametro portale senza nome $%d = %s" + +#: tcop/postgres.c:2541 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "parametro portale senza nome $%d" + +#: tcop/postgres.c:2886 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "terminazione della connessione a causa di un segnale SIGQUIT imprevisto" + +#: tcop/postgres.c:2892 #, c-format msgid "terminating connection because of crash of another server process" msgstr "la connessione è stata terminata a causa del crash di un altro processo del server" -#: tcop/postgres.c:2635 +#: tcop/postgres.c:2893 #, 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 "Il postmaster ha obbligato questo processo del server di attuare il roll back della transazione corrente e di uscire, perché un altro processo del server è terminato anormalmente e con possibile corruzione della memoria condivisa." -#: tcop/postgres.c:2639 tcop/postgres.c:2963 +#: tcop/postgres.c:2897 tcop/postgres.c:3258 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "In un momento sarai in grado di riconnetterti al database e di ripetere il comando." -#: tcop/postgres.c:2721 +#: tcop/postgres.c:2904 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "terminazione della connessione a causa di un comando di spegnimento immediato" + +#: tcop/postgres.c:2990 #, c-format msgid "floating-point exception" msgstr "eccezione floating-point" -#: tcop/postgres.c:2722 +#: tcop/postgres.c:2991 #, 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 "Un'operazione in floating-point non valida è stata segnalata. Questo probabilmente sta a significare che il risultato è un valore fuori limite o l'operazione non è valida, ad esempio una divisione per zero." -#: tcop/postgres.c:2893 +#: tcop/postgres.c:3162 #, c-format msgid "canceling authentication due to timeout" msgstr "annullamento dell'autenticazione a causa di timeout" -#: tcop/postgres.c:2897 +#: tcop/postgres.c:3166 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "interruzione del processo autovacuum su comando dell'amministratore" -#: tcop/postgres.c:2901 +#: tcop/postgres.c:3170 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "interruzione del worker di replica logica su comando dell'amministratore" -#: tcop/postgres.c:2905 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "lanciatore di replica logica in arresto" - -#: tcop/postgres.c:2918 tcop/postgres.c:2928 tcop/postgres.c:2961 +#: tcop/postgres.c:3187 tcop/postgres.c:3197 tcop/postgres.c:3256 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "interruzione della connessione a causa di conflitto con il ripristino" -#: tcop/postgres.c:2934 +#: tcop/postgres.c:3208 #, c-format msgid "terminating connection due to administrator command" msgstr "interruzione della connessione su comando dell'amministratore" -#: tcop/postgres.c:2944 +#: tcop/postgres.c:3239 #, c-format msgid "connection to client lost" msgstr "connessione al client persa" -#: tcop/postgres.c:3010 +#: tcop/postgres.c:3309 #, c-format msgid "canceling statement due to lock timeout" msgstr "annullamento dell'istruzione a causa di timeout di lock" -#: tcop/postgres.c:3017 +#: tcop/postgres.c:3316 #, c-format msgid "canceling statement due to statement timeout" msgstr "annullamento dell'istruzione a causa di timeout" -#: tcop/postgres.c:3024 +#: tcop/postgres.c:3323 #, c-format msgid "canceling autovacuum task" msgstr "annullamento del task di autovacuum" -#: tcop/postgres.c:3047 +#: tcop/postgres.c:3346 #, c-format msgid "canceling statement due to user request" msgstr "annullamento dell'istruzione su richiesta dell'utente" -#: tcop/postgres.c:3057 +#: tcop/postgres.c:3360 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "la connessione è stata terminata a causa di timeout di inattività durante una transazione" -#: tcop/postgres.c:3171 +#: tcop/postgres.c:3371 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "terminazione della connessione a causa del timeout della sessione inattiva" + +#: tcop/postgres.c:3511 #, c-format msgid "stack depth limit exceeded" msgstr "limite di profondità dello stack superato" -#: tcop/postgres.c:3172 +#: tcop/postgres.c:3512 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Incrementa il parametro di configurazione \"max_stack_depth\" (attualmente %dkB), dopo esserti assicurato che il limite dello stack della piattaforma sia adeguato." -#: tcop/postgres.c:3235 +#: tcop/postgres.c:3575 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." -msgstr "\"max_stack_depth\" non deve superare %ldkB" +msgstr "\"max_stack_depth\" non deve superare %ldkB." -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3577 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Incrementa il limite dello stack della piattaforma usando \"ulimit -s\" on un comando equivalente." -#: tcop/postgres.c:3597 +#: tcop/postgres.c:3933 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argomento della riga di comando non valido per il processo server: %s" -#: tcop/postgres.c:3598 tcop/postgres.c:3604 +#: tcop/postgres.c:3934 tcop/postgres.c:3940 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Prova \"%s --help\" per maggiori informazioni." -#: tcop/postgres.c:3602 +#: tcop/postgres.c:3938 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: argomento della riga di comando non valido: %s" -#: tcop/postgres.c:3664 +#: tcop/postgres.c:3991 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: nessun database né nome utente specificato" -#: tcop/postgres.c:4293 +#: tcop/postgres.c:4713 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "sottotipo %d del messaggio CLOSE non valido" -#: tcop/postgres.c:4328 +#: tcop/postgres.c:4748 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "sottotipo %d del messaggio DESCRIBE non valido" -#: tcop/postgres.c:4406 +#: tcop/postgres.c:4832 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "le chiamate di funzione fastpath non sono supportate in una connessione di replica" -#: tcop/postgres.c:4410 +#: tcop/postgres.c:4836 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "il protocollo di query esteso non è supportato in una connessione di replica" -#: tcop/postgres.c:4587 +#: tcop/postgres.c:5013 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "disconnessione: tempo della sessione: %d:%02d:%02d.%03d utente=%s database=%s host=%s%s%s" -#: tcop/pquery.c:645 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "il messaggio di bind ha %d formati di risultato ma la query ha %d colonne" -#: tcop/pquery.c:952 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "il cursore effettuare solo scansioni in avanti" -#: tcop/pquery.c:953 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Dichiaralo con l'opzione SCROLL per abilitare le scansioni all'indietro." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:245 +#: tcop/utility.c:417 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "non è possibile eseguire %s in una transazione a sola lettura" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:263 +#: tcop/utility.c:435 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "non è possibile eseguire %s durante un'operazione parallela" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:282 +#: tcop/utility.c:454 #, c-format msgid "cannot execute %s during recovery" msgstr "non è possibile eseguire %s durante il recupero" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:300 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "non è possibile eseguire %s nell'ambito di operazioni a sicurezza ristretta" -#: tcop/utility.c:757 +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "solo un superutente può eseguire CHECKPOINT" +msgid "cannot execute %s within a background process" +msgstr "impossibile eseguire %s all'interno di un processo in background" -#: tcop/utility.c:1338 +#: tcop/utility.c:953 #, c-format -msgid "cannot create index on partitioned table \"%s\"" -msgstr "non è possibile creare indici sulla tabella partizionata \"%s\"" - -#: tcop/utility.c:1340 -#, c-format -msgid "Table \"%s\" contains partitions that are foreign tables." -msgstr "La tabella \"%s\" contiene partizioni che sono tabelle esterne." +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "deve essere superutente o disporre dei privilegi di pg_checkpoint per eseguire CHECKPOINT" -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:624 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format msgid "multiple DictFile parameters" msgstr "più di un parametro DictFile" @@ -19488,7 +21993,7 @@ msgstr "parametro Ispell sconosciuto: \"%s\"" msgid "missing AffFile parameter" msgstr "parametro AffFile mancante" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:648 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 #, c-format msgid "missing DictFile parameter" msgstr "parametro DictFile mancante" @@ -19538,146 +22043,137 @@ msgstr "fine della riga o del lessema inaspettata" msgid "unexpected end of line" msgstr "fine della riga non attesa" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "troppi lessemi nella voce di thesaurus" -#: 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 "la parola di esempio del thesaurus \"%s\" non è riconosciuta dal sotto-dizionario (regola %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 "la parola di esempio del thesaurus \"%s\" è una stop word (regola %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 "Usa \"?\" per rappresentare una stop word in un frase di esempio." -#: tsearch/dict_thesaurus.c:576 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "la parola sostitutiva del thesaurus \"%s\" è una stop word (regola %d)" -#: tsearch/dict_thesaurus.c:583 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "la parola sostitutiva del thesaurus \"%s\" non è riconosciuta dal sotto-dizionario (regola %d)" -#: tsearch/dict_thesaurus.c:595 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "la frase di sostituzione del thesaurus è vuota (regola %d)" -#: tsearch/dict_thesaurus.c:633 +#: tsearch/dict_thesaurus.c:624 #, c-format msgid "multiple Dictionary parameters" msgstr "più di un parametro Dictionary" -#: tsearch/dict_thesaurus.c:640 +#: tsearch/dict_thesaurus.c:631 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "parametro di Thesaurus sconosciuto: \"%s\"" -#: tsearch/dict_thesaurus.c:652 +#: tsearch/dict_thesaurus.c:643 #, c-format msgid "missing Dictionary parameter" msgstr "parametro di Dictionary mancante" -#: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1034 +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 tsearch/spell.c:1063 #, c-format msgid "invalid affix flag \"%s\"" msgstr "flag di affix non valido \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1038 +#: tsearch/spell.c:385 tsearch/spell.c:1067 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "flag di affix \"%s\" fuori dall'intervallo valido" -#: tsearch/spell.c:414 +#: tsearch/spell.c:415 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "carattere non valido nel flag affix \"%s\"" -#: tsearch/spell.c:434 +#: tsearch/spell.c:435 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "flag di affix \"%s\" con valore di flag \"long\" non valido" -#: tsearch/spell.c:522 +#: tsearch/spell.c:525 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "apertura del file dictionary \"%s\" fallita: %m" -#: tsearch/spell.c:740 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "espressione regolare non valida: %s" -#: tsearch/spell.c:954 tsearch/spell.c:971 tsearch/spell.c:988 -#: tsearch/spell.c:1005 tsearch/spell.c:1070 gram.y:15714 gram.y:15731 -#, c-format -msgid "syntax error" -msgstr "errore di sintassi" - -#: tsearch/spell.c:1161 tsearch/spell.c:1726 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "alias di affix \"%s\" non valido" -#: tsearch/spell.c:1211 tsearch/spell.c:1282 tsearch/spell.c:1431 +#: tsearch/spell.c:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "apertura del file affix \"%s\" fallita: %m" -#: tsearch/spell.c:1265 +#: tsearch/spell.c:1297 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" -msgstr "il dizionario Ispell supporta solo valori di flag \"default\", \"long\" e \"num\"" +msgstr "Il dizionario Ispell supporta solo valori di flag \"default\", \"long\" e \"num\"" -#: tsearch/spell.c:1309 +#: tsearch/spell.c:1341 #, c-format msgid "invalid number of flag vector aliases" msgstr "numero di alias nel vettore di flag non valido" -#: tsearch/spell.c:1332 +#: tsearch/spell.c:1364 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "il numero di alias è maggiore del numero specificato %d" -#: tsearch/spell.c:1547 +#: tsearch/spell.c:1579 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "il file affix contiene comandi sia vecchio stile che nuovo stile" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:271 utils/adt/tsvector_op.c:1134 +#: 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 "la stringa è troppo lunga per tsvector (%d byte, massimo %d byte)" -#: tsearch/ts_locale.c:174 +#: tsearch/ts_locale.c:227 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "riga %d del file di configurazione \"%s\": \"%s\"" -#: tsearch/ts_locale.c:291 +#: tsearch/ts_locale.c:307 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "conversione da wchar_t a codifica server fallita: %m" -#: tsearch/ts_parse.c:390 tsearch/ts_parse.c:397 tsearch/ts_parse.c:566 -#: tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:562 tsearch/ts_parse.c:569 #, c-format msgid "word is too long to be indexed" msgstr "la parola è troppo lunga per essere indicizzata" -#: tsearch/ts_parse.c:391 tsearch/ts_parse.c:398 tsearch/ts_parse.c:567 -#: tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:563 tsearch/ts_parse.c:570 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Le parole più lunghe di %d caratteri sono ignorate." @@ -19692,67 +22188,117 @@ msgstr "nome del file di configurazione di ricerca di test non valido \"%s\"" msgid "could not open stop-word file \"%s\": %m" msgstr "apertura del file delle stop word \"%s\" fallita: %m" -#: tsearch/wparser.c:322 tsearch/wparser.c:410 tsearch/wparser.c:487 +#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 #, c-format msgid "text search parser does not support headline creation" msgstr "l'analizzatore di ricerca di testo non supporta la creazione di intestazioni" -#: tsearch/wparser_def.c:2486 +#: tsearch/wparser_def.c:2578 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "parametro di intestazione sconosciuto: \"%s\"" -#: tsearch/wparser_def.c:2495 +#: tsearch/wparser_def.c:2597 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords dovrebbe essere minore di MaxWords" -#: tsearch/wparser_def.c:2499 +#: tsearch/wparser_def.c:2601 #, c-format msgid "MinWords should be positive" msgstr "MinWords dovrebbe essere positivo" -#: tsearch/wparser_def.c:2503 +#: tsearch/wparser_def.c:2605 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord dovrebbe essere >= 0" -#: tsearch/wparser_def.c:2507 +#: tsearch/wparser_def.c:2609 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments dovrebbe essere >= 0" -#: utils/adt/acl.c:171 utils/adt/name.c:91 +#: utils/activity/pgstat.c:421 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "impossibile scollegare il file delle statistiche permanenti \"%s\": %m" + +#: utils/activity/pgstat.c:1209 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "tipo di statistiche non valide: \"%s\"" + +#: utils/activity/pgstat.c:1289 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "apertura del file temporaneo delle statistiche \"%s\" fallita: %m" + +#: utils/activity/pgstat.c:1395 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "scrittura del file temporaneo delle statistiche \"%s\" fallita: %m" + +#: utils/activity/pgstat.c:1404 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "chiusura del file temporaneo delle statistiche \"%s\" fallita: %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "non è stato possibile rinominare il file temporaneo delle statistiche \"%s\" in \"%s\": %m" + +#: utils/activity/pgstat.c:1461 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "apertura del file delle statistiche \"%s\" fallita: %m" + +#: utils/activity/pgstat.c:1617 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "file delle statistiche corrotto \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "chiamata di funzione alla funzione eliminata" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "reimpostare le statistiche esistenti per il tipo %s, db=%u, oid=%u" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "l'identificativo è troppo lungo" -#: utils/adt/acl.c:172 utils/adt/name.c:92 +#: utils/adt/acl.c:169 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Gli identificatori devono essere più corti di %d caratteri." -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "parola chiave sconosciuta: \"%s\"" -#: utils/adt/acl.c:259 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "la parola chiave ACL deve essere \"group\" o \"user\"." -#: utils/adt/acl.c:264 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "manca il nome" -#: utils/adt/acl.c:265 +#: utils/adt/acl.c:259 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "le parole chiave \"group\" o \"user\" devono essere seguite da un nome." -#: utils/adt/acl.c:271 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "manca il simbolo \"=\"" @@ -19772,79 +22318,72 @@ msgstr "il simbolo \"/\" deve essere seguito da un nome" msgid "defaulting grantor to user ID %u" msgstr "l'user ID %u è ora chi concede i ruoli in maniera predefinita" -#: utils/adt/acl.c:545 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "l'array di ACL array contiene tipi di dati errati" -#: utils/adt/acl.c:549 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "gli array di ACL devono avere una sola dimensione" -#: utils/adt/acl.c:553 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "gli array di ACL non possono contenere valori nulli" -#: utils/adt/acl.c:577 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "ci sono caratteri spuri al termine della specifica dell'ACL" -#: utils/adt/acl.c:1213 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "le opzioni di concessione non possono essere concesse a chi le ha concesse a te" -#: utils/adt/acl.c:1274 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "esistono privilegi dipendenti" -#: utils/adt/acl.c:1275 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Usa CASCADE per revocare anch'essi." -#: utils/adt/acl.c:1537 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert non è più supportato" -#: utils/adt/acl.c:1547 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove non è più supportato" -#: utils/adt/acl.c:1633 utils/adt/acl.c:1687 +#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "tipo di privilegio sconosciuto: \"%s\"" -#: utils/adt/acl.c:3487 utils/adt/regproc.c:102 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 #, c-format msgid "function \"%s\" does not exist" msgstr "la funzione \"%s\" non esiste" -#: utils/adt/acl.c:4959 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "occorre far parte del ruolo \"%s\"" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:932 -#: utils/adt/arrayfuncs.c:1532 utils/adt/arrayfuncs.c:3235 -#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5910 -#: utils/adt/arrayfuncs.c:6221 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 "la dimensione dell'array supera il massimo consentito (%d)" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 -#: utils/adt/array_userfuncs.c:546 utils/adt/json.c:1829 utils/adt/json.c:1924 -#: utils/adt/json.c:1962 utils/adt/jsonb.c:1083 utils/adt/jsonb.c:1112 -#: utils/adt/jsonb.c:1504 utils/adt/jsonb.c:1668 utils/adt/jsonb.c:1678 +#: 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:1114 utils/adt/jsonb.c:1143 utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "non è stato possibile determinare il tipo di dato di input" @@ -19854,16 +22393,8 @@ msgstr "non è stato possibile determinare il tipo di dato di input" msgid "input data type is not an array" msgstr "il tipo di dati in input non è un array" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/arrayfuncs.c:1335 utils/adt/float.c:1363 utils/adt/float.c:1422 -#: utils/adt/float.c:3708 utils/adt/float.c:3722 utils/adt/int.c:755 -#: utils/adt/int.c:777 utils/adt/int.c:791 utils/adt/int.c:805 -#: utils/adt/int.c:836 utils/adt/int.c:857 utils/adt/int.c:974 -#: utils/adt/int.c:988 utils/adt/int.c:1002 utils/adt/int.c:1035 -#: utils/adt/int.c:1049 utils/adt/int.c:1063 utils/adt/int.c:1094 -#: utils/adt/int.c:1176 utils/adt/int8.c:1164 utils/adt/numeric.c:3117 -#: utils/adt/numeric.c:3126 utils/adt/varbit.c:1173 utils/adt/varbit.c:1575 -#: utils/adt/varlena.c:1053 utils/adt/varlena.c:2983 +#: 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:3391 #, c-format msgid "integer out of range" msgstr "intero fuori dall'intervallo" @@ -19873,9 +22404,7 @@ msgstr "intero fuori dall'intervallo" msgid "argument must be empty or one-dimensional array" msgstr "l'argomento deve essere vuoto o un array con una sola dimensione" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 utils/adt/array_userfuncs.c:406 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "non è possibile concatenare array non compatibili" @@ -19900,269 +22429,263 @@ msgstr "Array con elementi dalle dimensioni diverse non sono compatibili per il msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Array con dimensioni diverse non sono compatibili per il concatenamento." -#: 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 "la ricerca di elementi in array multidimensionali non è supportata" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:687 #, c-format msgid "initial position must not be null" msgstr "la posizione iniziale non può essere nulla" -#: utils/adt/arrayfuncs.c:269 utils/adt/arrayfuncs.c:283 -#: utils/adt/arrayfuncs.c:294 utils/adt/arrayfuncs.c:316 -#: utils/adt/arrayfuncs.c:331 utils/adt/arrayfuncs.c:345 -#: utils/adt/arrayfuncs.c:351 utils/adt/arrayfuncs.c:358 -#: utils/adt/arrayfuncs.c:489 utils/adt/arrayfuncs.c:505 -#: utils/adt/arrayfuncs.c:516 utils/adt/arrayfuncs.c:531 -#: utils/adt/arrayfuncs.c:552 utils/adt/arrayfuncs.c:582 -#: utils/adt/arrayfuncs.c:589 utils/adt/arrayfuncs.c:597 -#: utils/adt/arrayfuncs.c:631 utils/adt/arrayfuncs.c:654 -#: utils/adt/arrayfuncs.c:674 utils/adt/arrayfuncs.c:786 -#: utils/adt/arrayfuncs.c:795 utils/adt/arrayfuncs.c:825 -#: utils/adt/arrayfuncs.c:840 utils/adt/arrayfuncs.c:893 +#: 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 "il letterale array non è definito in modo corretto: \"%s\"" -#: utils/adt/arrayfuncs.c:270 +#: utils/adt/arrayfuncs.c:272 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\" deve introdurre un array con dimensioni specificate esplicitamente." -#: utils/adt/arrayfuncs.c:284 +#: utils/adt/arrayfuncs.c:286 #, c-format msgid "Missing array dimension value." msgstr "Valore delle dimensioni dell'array mancante." -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:332 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Manca \"%s\" dopo le dimensioni dell'array." -#: utils/adt/arrayfuncs.c:304 utils/adt/arrayfuncs.c:2883 -#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:2930 +#: 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 "il limite massimo non può essere minore del limite minimo" -#: utils/adt/arrayfuncs.c:317 +#: utils/adt/arrayfuncs.c:319 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "L'array deve iniziare con \"{\" oppure con le informazioni di dimensione." -#: utils/adt/arrayfuncs.c:346 +#: utils/adt/arrayfuncs.c:348 #, c-format msgid "Array contents must start with \"{\"." msgstr "Il contenuto dell'array deve cominciare con \"{\"." -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Le dimensioni specificate per l'array non combaciano con il contenuto." -#: utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:517 -#: utils/adt/rangetypes.c:2178 utils/adt/rangetypes.c:2186 -#: utils/adt/rowtypes.c:209 utils/adt/rowtypes.c:217 +#: 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 "L'input è terminato in modo inatteso." -#: utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:553 -#: utils/adt/arrayfuncs.c:583 utils/adt/arrayfuncs.c:632 +#: 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 "Carattere \"%c\" inatteso." -#: utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:655 +#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 #, c-format msgid "Unexpected array element." msgstr "Elemento dell'array inatteso." -#: utils/adt/arrayfuncs.c:590 +#: utils/adt/arrayfuncs.c:594 #, c-format msgid "Unmatched \"%c\" character." msgstr "Il carattere \"%c\" non combacia." -#: utils/adt/arrayfuncs.c:598 utils/adt/jsonfuncs.c:2398 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2482 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Gli array multidimensionali devono avere sotto-array con dimensioni corrispondenti." -#: utils/adt/arrayfuncs.c:675 +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Caratteri spuri dopo la parentesi chiusa." -#: utils/adt/arrayfuncs.c:1297 utils/adt/arrayfuncs.c:3343 -#: utils/adt/arrayfuncs.c:5816 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 utils/adt/arrayfuncs.c:5885 #, c-format msgid "invalid number of dimensions: %d" msgstr "numero di dimensioni non valido: %d" -#: utils/adt/arrayfuncs.c:1308 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "i flag dell'array non sono validi" -#: utils/adt/arrayfuncs.c:1316 +#: utils/adt/arrayfuncs.c:1334 #, c-format -msgid "wrong element type" -msgstr "il tipo di elemento è errato" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "i dati binari hanno il tipo di elemento dell'array %u (%s) invece del previsto %u (%s)" -#: utils/adt/arrayfuncs.c:1366 utils/adt/rangetypes.c:334 -#: utils/cache/lsyscache.c:2725 +#: 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 "non esiste una funzione di input binario per il tipo %s" -#: utils/adt/arrayfuncs.c:1506 +#: utils/adt/arrayfuncs.c:1518 #, c-format msgid "improper binary format in array element %d" msgstr "il formato binario nell'elemento dell'array %d non è corretto" -#: utils/adt/arrayfuncs.c:1587 utils/adt/rangetypes.c:339 -#: utils/cache/lsyscache.c:2758 +#: 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 "non esiste una funzione di output binario per il tipo %s" -#: utils/adt/arrayfuncs.c:2065 +#: utils/adt/arrayfuncs.c:2078 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "le sezioni di array a lunghezza fissa non sono implementate" -#: utils/adt/arrayfuncs.c:2243 utils/adt/arrayfuncs.c:2265 -#: utils/adt/arrayfuncs.c:2314 utils/adt/arrayfuncs.c:2550 -#: utils/adt/arrayfuncs.c:2861 utils/adt/arrayfuncs.c:5802 -#: utils/adt/arrayfuncs.c:5828 utils/adt/arrayfuncs.c:5839 -#: utils/adt/json.c:2323 utils/adt/json.c:2398 utils/adt/jsonb.c:1282 -#: utils/adt/jsonb.c:1368 utils/adt/jsonfuncs.c:4289 utils/adt/jsonfuncs.c:4440 -#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4532 +#: 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:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4318 utils/adt/jsonfuncs.c:4471 utils/adt/jsonfuncs.c:4583 utils/adt/jsonfuncs.c:4632 #, c-format msgid "wrong number of array subscripts" msgstr "il numero di indici di array è errato" -#: utils/adt/arrayfuncs.c:2248 utils/adt/arrayfuncs.c:2356 -#: utils/adt/arrayfuncs.c:2614 utils/adt/arrayfuncs.c:2920 +#: 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 dell'array fuori dall'intervallo" -#: utils/adt/arrayfuncs.c:2253 +#: utils/adt/arrayfuncs.c:2266 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "non è possibile assegnare un valore nullo a un elemento di un array a dimensione fissa" -#: utils/adt/arrayfuncs.c:2808 +#: utils/adt/arrayfuncs.c:2835 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "la modifica di sezioni di array a lunghezza fissa non è implementate" -#: utils/adt/arrayfuncs.c:2839 +#: utils/adt/arrayfuncs.c:2866 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "l'indice della sezione dell'array deve fornire entrambi i limiti" -#: utils/adt/arrayfuncs.c:2840 +#: 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 "Quando si assegna ad una sezione di un array vuoto, i limiti della sezione devono essere specificati interamente." -#: utils/adt/arrayfuncs.c:2851 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 #, c-format msgid "source array too small" msgstr "l'array di origine è troppo piccolo" -#: utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:3529 #, c-format msgid "null array element not allowed in this context" msgstr "in questo contesto non è consentito un elemento di array nullo" -#: utils/adt/arrayfuncs.c:3601 utils/adt/arrayfuncs.c:3772 -#: utils/adt/arrayfuncs.c:4124 +#: 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 "non è possibile confrontare array con elementi di tipo diverso" -#: utils/adt/arrayfuncs.c:3948 utils/adt/rangetypes.c:1253 -#: utils/adt/rangetypes.c:1317 +#: 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 "non è stato possibile trovare una funzione di hash per il tipo %s" -#: utils/adt/arrayfuncs.c:4040 +#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "non è stato possibile trovare una funzione di hash estesa per il tipo %s" -#: utils/adt/arrayfuncs.c:5216 +#: utils/adt/arrayfuncs.c:5285 #, c-format msgid "data type %s is not an array type" msgstr "il tipo di dati %s non è un tipo array" -#: utils/adt/arrayfuncs.c:5271 +#: utils/adt/arrayfuncs.c:5340 #, c-format msgid "cannot accumulate null arrays" msgstr "non è possibile accumulare array nulli" -#: utils/adt/arrayfuncs.c:5299 +#: utils/adt/arrayfuncs.c:5368 #, c-format msgid "cannot accumulate empty arrays" msgstr "non è possibile accumulare array vuoti" -#: utils/adt/arrayfuncs.c:5328 utils/adt/arrayfuncs.c:5334 +#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "non è possibile accumulare array di dimensioni diverse" -#: utils/adt/arrayfuncs.c:5700 utils/adt/arrayfuncs.c:5740 +#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "la dimensione dell'array o il suo limite inferiore non possono essere nulli" -#: utils/adt/arrayfuncs.c:5803 utils/adt/arrayfuncs.c:5829 +#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 #, c-format msgid "Dimension array must be one dimensional." msgstr "L'array delle dimensioni deve avere una sola dimensione." -#: utils/adt/arrayfuncs.c:5808 utils/adt/arrayfuncs.c:5834 +#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 #, c-format msgid "dimension values cannot be null" msgstr "i valori di dimensione non possono essere nulli" -#: utils/adt/arrayfuncs.c:5840 +#: utils/adt/arrayfuncs.c:5909 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "L'array dei valori inferiori ha dimensione differente dal numero di dimensioni dell'array." -#: utils/adt/arrayfuncs.c:6086 +#: utils/adt/arrayfuncs.c:6187 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "la rimozione di elementi da array multidimensionali non è supportata" -#: utils/adt/arrayfuncs.c:6363 +#: utils/adt/arrayfuncs.c:6464 #, c-format msgid "thresholds must be one-dimensional array" msgstr "la soglia dev'essere un array monodimensionale" -#: utils/adt/arrayfuncs.c:6368 +#: utils/adt/arrayfuncs.c:6469 #, c-format msgid "thresholds array must not contain NULLs" msgstr "l'array delle soglie non può contenere NULL" -#: 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 "il numero di elementi da tagliare deve essere compreso tra 0 e %d" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "l'indice di un array dev'essere di tipo intero" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "l'indice di un array nell'assegnamento non può essere nullo" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "il limite inferiore dell'array è troppo grande: %d" + +#: utils/adt/arrayutils.c:240 #, c-format msgid "typmod array must be type cstring[]" msgstr "il typmod dell'array deve essere di tipo cstring[]" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:245 #, c-format msgid "typmod array must be one-dimensional" msgstr "il typmod dell'array deve avere una sola dimensione" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:250 #, c-format msgid "typmod array must not contain nulls" msgstr "il typmod dell'array non può contenere valori nulli" @@ -20173,1214 +22696,1237 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "la conversione di codifica da %s a ASCII non è supportata" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3788 -#: utils/adt/float.c:241 utils/adt/float.c:315 utils/adt/float.c:339 -#: utils/adt/float.c:458 utils/adt/float.c:541 utils/adt/float.c:567 -#: utils/adt/geo_ops.c:155 utils/adt/geo_ops.c:165 utils/adt/geo_ops.c:177 -#: utils/adt/geo_ops.c:209 utils/adt/geo_ops.c:254 utils/adt/geo_ops.c:264 -#: utils/adt/geo_ops.c:934 utils/adt/geo_ops.c:1320 utils/adt/geo_ops.c:1355 -#: utils/adt/geo_ops.c:1363 utils/adt/geo_ops.c:3429 utils/adt/geo_ops.c:4562 -#: utils/adt/geo_ops.c:4578 utils/adt/geo_ops.c:4585 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/nabstime.c:1539 -#: utils/adt/network.c:58 utils/adt/numeric.c:604 utils/adt/numeric.c:631 -#: utils/adt/numeric.c:5662 utils/adt/numeric.c:5686 utils/adt/numeric.c:5710 -#: utils/adt/numeric.c:6516 utils/adt/numeric.c:6542 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:44 utils/adt/pg_lsn.c:50 utils/adt/tid.c:72 -#: utils/adt/tid.c:80 utils/adt/tid.c:88 utils/adt/txid.c:405 -#: utils/adt/uuid.c:136 +#: 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:4607 utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:165 utils/adt/int.c:177 utils/adt/jsonpath.c:182 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:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "sintassi di input non valida per il tipo %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:117 utils/adt/numutils.c:75 -#: utils/adt/numutils.c:82 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 "valore \"%s\" fuori dall'intervallo consentito per il tipo %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:852 utils/adt/float.c:916 utils/adt/float.c:3469 -#: utils/adt/float.c:3532 utils/adt/geo_ops.c:4092 utils/adt/int.c:820 -#: utils/adt/int.c:936 utils/adt/int.c:1016 utils/adt/int.c:1078 -#: utils/adt/int.c:1116 utils/adt/int.c:1144 utils/adt/int8.c:592 -#: utils/adt/int8.c:650 utils/adt/int8.c:850 utils/adt/int8.c:930 -#: utils/adt/int8.c:992 utils/adt/int8.c:1072 utils/adt/numeric.c:7080 -#: utils/adt/numeric.c:7369 utils/adt/numeric.c:8381 utils/adt/timestamp.c:3235 +#: 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 "divisione per zero" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "\"char\" fuori dall'intervallo consentito" -#: utils/adt/date.c:65 utils/adt/timestamp.c:95 utils/adt/varbit.c:54 -#: utils/adt/varchar.c:46 +#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "impossibile calcolare %s hash: %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 "modificatore di tipo non valido" -#: utils/adt/date.c:77 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "la precisione di TIME(%d)%s non può essere negativa" -#: utils/adt/date.c:83 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisione di TIME(%d)%s è stata ridotta al massimo consentito (%d)" -#: utils/adt/date.c:144 utils/adt/datetime.c:1193 utils/adt/datetime.c:2104 -#, c-format -msgid "date/time value \"current\" is no longer supported" -msgstr "il valore \"current\" per i tipi date/time non è più supportato" - -#: utils/adt/date.c:170 utils/adt/date.c:178 utils/adt/formatting.c:3606 -#: utils/adt/formatting.c:3615 +#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4299 utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "data fuori dall'intervallo consentito: \"%s\"" -#: utils/adt/date.c:225 utils/adt/date.c:537 utils/adt/date.c:561 -#: utils/adt/xml.c:2089 +#: 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 "data fuori dall'intervallo consentito" -#: utils/adt/date.c:271 utils/adt/timestamp.c:564 +#: utils/adt/date.c:261 utils/adt/timestamp.c:581 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "valori del campo data fuori dall'intervallo consentito: %d-%02d-%02d" -#: utils/adt/date.c:278 utils/adt/date.c:287 utils/adt/timestamp.c:570 +#: 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 "data fuori dall'intervallo consentito: %d-%02d-%02d" -#: utils/adt/date.c:325 utils/adt/date.c:348 utils/adt/date.c:374 -#: utils/adt/date.c:1118 utils/adt/date.c:1164 utils/adt/date.c:1704 -#: utils/adt/date.c:1735 utils/adt/date.c:1764 utils/adt/date.c:2596 -#: utils/adt/datetime.c:1677 utils/adt/formatting.c:3472 -#: utils/adt/formatting.c:3504 utils/adt/formatting.c:3581 -#: utils/adt/json.c:1621 utils/adt/json.c:1641 utils/adt/nabstime.c:456 -#: utils/adt/nabstime.c:499 utils/adt/nabstime.c:529 utils/adt/nabstime.c:572 -#: utils/adt/timestamp.c:230 utils/adt/timestamp.c:262 -#: utils/adt/timestamp.c:692 utils/adt/timestamp.c:701 -#: utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 -#: utils/adt/timestamp.c:2814 utils/adt/timestamp.c:2835 -#: utils/adt/timestamp.c:2848 utils/adt/timestamp.c:2857 -#: utils/adt/timestamp.c:2865 utils/adt/timestamp.c:2920 -#: utils/adt/timestamp.c:2943 utils/adt/timestamp.c:2956 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2975 -#: utils/adt/timestamp.c:3635 utils/adt/timestamp.c:3760 -#: utils/adt/timestamp.c:3801 utils/adt/timestamp.c:3891 -#: utils/adt/timestamp.c:3937 utils/adt/timestamp.c:4040 -#: utils/adt/timestamp.c:4447 utils/adt/timestamp.c:4546 -#: utils/adt/timestamp.c:4556 utils/adt/timestamp.c:4648 -#: utils/adt/timestamp.c:4750 utils/adt/timestamp.c:4760 -#: utils/adt/timestamp.c:4992 utils/adt/timestamp.c:5006 -#: utils/adt/timestamp.c:5011 utils/adt/timestamp.c:5025 -#: utils/adt/timestamp.c:5070 utils/adt/timestamp.c:5102 -#: utils/adt/timestamp.c:5109 utils/adt/timestamp.c:5142 -#: utils/adt/timestamp.c:5146 utils/adt/timestamp.c:5215 -#: utils/adt/timestamp.c:5219 utils/adt/timestamp.c:5233 -#: utils/adt/timestamp.c:5267 utils/adt/xml.c:2111 utils/adt/xml.c:2118 -#: utils/adt/xml.c:2138 utils/adt/xml.c:2145 -#, c-format -msgid "timestamp out of range" -msgstr "timestamp fuori dall'intervallo consentito" - -#: utils/adt/date.c:512 +#: utils/adt/date.c:488 #, c-format msgid "cannot subtract infinite dates" msgstr "non si possono sottrarre date infinite" -#: utils/adt/date.c:590 utils/adt/date.c:621 utils/adt/date.c:639 -#: utils/adt/date.c:2633 utils/adt/date.c:2643 +#: 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 "data fuori dall'intervallo consentito per timestamp" -#: utils/adt/date.c:1190 +#: 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 #, c-format -msgid "cannot convert reserved abstime value to date" -msgstr "non è possibile convertire un valore speciale per abstime in una data" +msgid "unit \"%s\" not supported for type %s" +msgstr "unità \"%s\" non supportata per il tipo %s" -#: utils/adt/date.c:1208 utils/adt/date.c:1214 +#: 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 #, c-format -msgid "abstime out of range for date" -msgstr "abstime fuori dall'intervallo massimo per una data" +msgid "unit \"%s\" not recognized for type %s" +msgstr "unità \"%s\" non riconosciuta per il tipo %s" -#: utils/adt/date.c:1327 utils/adt/date.c:2091 +#: 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:4141 utils/adt/formatting.c:4177 utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 utils/adt/json.c:457 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 fuori dall'intervallo consentito" + +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 #, c-format msgid "time out of range" msgstr "ora fuori dall'intervallo consentito" -#: utils/adt/date.c:1383 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 "campo temporale fuori dall'intervallo consentito: %d:%02d:%02g" -#: utils/adt/date.c:1893 utils/adt/date.c:2395 utils/adt/float.c:1202 -#: utils/adt/float.c:1271 utils/adt/int.c:612 utils/adt/int.c:659 -#: utils/adt/int.c:694 utils/adt/int8.c:491 utils/adt/numeric.c:2189 -#: utils/adt/timestamp.c:3284 utils/adt/timestamp.c:3315 -#: utils/adt/timestamp.c:3346 +#: 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 "dimensione precedente o successiva non valida nella funzione finestra" -#: utils/adt/date.c:1978 utils/adt/date.c:1991 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "unità \"%s\" di \"time\" non è riconosciuta" - -#: utils/adt/date.c:2099 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "la differenza di fuso orario è fuori dall'intervallo consentito" -#: utils/adt/date.c:2728 utils/adt/date.c:2741 -#, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "unità \"%s\" di \"time with time zone\" non è riconosciuta" - -#: utils/adt/date.c:2814 utils/adt/datetime.c:915 utils/adt/datetime.c:1835 -#: utils/adt/datetime.c:4625 utils/adt/timestamp.c:503 -#: utils/adt/timestamp.c:530 utils/adt/timestamp.c:5017 -#: utils/adt/timestamp.c:5225 +#: 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 "fuso orario \"%s\" non riconosciuto" -#: utils/adt/date.c:2846 utils/adt/timestamp.c:5059 utils/adt/timestamp.c:5256 +#: 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 "l'intervallo di fusi orari \"%s\" non può contenere mesi o giorni" -#: utils/adt/datetime.c:3761 utils/adt/datetime.c:3768 +#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valore del campo date/time fuori dall'intervallo consentito: \"%s\"" -#: utils/adt/datetime.c:3770 +#: utils/adt/datetime.c:4040 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Forse è necessario impostare un \"datestyle\" diverso." -#: utils/adt/datetime.c:3775 +#: utils/adt/datetime.c:4045 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valore del campo interval fuori dall'intervallo consentito: \"%s\"" -#: utils/adt/datetime.c:3781 +#: utils/adt/datetime.c:4051 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "la differenza di fuso orario è fuori dall'intervallo consentito: \"%s\"" -#: utils/adt/datetime.c:4627 +#: utils/adt/datetime.c:4908 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Il nome del fuso orario figura nel file di configurazione delle abbreviazioni di fuso orario \"%s\"." -#: utils/adt/datum.c:86 utils/adt/datum.c:98 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "puntatore al Datum non valido" -#: 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 "dimensione non valida: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Unità di dimensione non valida: \"%s\"." -#: utils/adt/dbsize.c:829 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Le unità valide sono \"bytes\", \"kB\", \"MB\", \"GB\" e \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "Le unità valide sono \"byte\", \"kB\", \"MB\", \"GB\", \"TB\" e \"PB\"." #: utils/adt/domains.c:92 #, c-format msgid "type %s is not a domain" msgstr "il tipo %s non è un dominio" -#: utils/adt/encode.c:55 utils/adt/encode.c:91 +#: utils/adt/encode.c:65 utils/adt/encode.c:113 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "codifica sconosciuta: \"%s\"" -#: utils/adt/encode.c:150 +#: utils/adt/encode.c:79 #, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "cifra esadecimale non valida: \"%c\"" +msgid "result of encoding conversion is too large" +msgstr "il risultato della conversione della codifica è troppo grande" -#: utils/adt/encode.c:178 +#: utils/adt/encode.c:127 +#, c-format +msgid "result of decoding conversion is too large" +msgstr "il risultato della conversione di decodifica è troppo grande" + +#: utils/adt/encode.c:186 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "cifra esadecimale non valida: \"%.*s\"" + +#: utils/adt/encode.c:216 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "i dati esadecimali non sono validi: numero dispari di cifre" -#: utils/adt/encode.c:295 +#: utils/adt/encode.c:334 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "carattere \"=\" inaspettato decodificando la sequenza base64" -#: utils/adt/encode.c:307 +#: utils/adt/encode.c:346 #, c-format -msgid "invalid symbol \"%c\" while decoding base64 sequence" -msgstr "simbolo \"%c\" inaspettato decodificando la sequenza base64" +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "simbolo \"%.*s\" non valido trovato durante la decodifica della sequenza base64" -#: utils/adt/encode.c:327 +#: utils/adt/encode.c:367 #, c-format msgid "invalid base64 end sequence" msgstr "fine sequenza base64 non valida" -#: utils/adt/encode.c:328 +#: utils/adt/encode.c:368 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "I dati di input mancano di padding, sono troncati o comunque corrotti." -#: utils/adt/encode.c:442 utils/adt/encode.c:507 utils/adt/json.c:786 -#: utils/adt/json.c:826 utils/adt/json.c:842 utils/adt/json.c:854 -#: utils/adt/json.c:864 utils/adt/json.c:915 utils/adt/json.c:947 -#: utils/adt/json.c:966 utils/adt/json.c:978 utils/adt/json.c:990 -#: utils/adt/json.c:1135 utils/adt/json.c:1149 utils/adt/json.c:1160 -#: utils/adt/json.c:1168 utils/adt/json.c:1176 utils/adt/json.c:1184 -#: utils/adt/json.c:1192 utils/adt/json.c:1200 utils/adt/json.c:1208 -#: utils/adt/json.c:1216 utils/adt/json.c:1246 utils/adt/varlena.c:296 -#: utils/adt/varlena.c:337 +#: utils/adt/enum.c:99 #, c-format -msgid "invalid input syntax for type %s" -msgstr "sintassi di input non valida per il tipo %s" +msgid "unsafe use of new value \"%s\" of enum type %s" +msgstr "uso non sicuro del nuovo valore \"%s\" di tipo enum %s" + +#: utils/adt/enum.c:102 +#, c-format +msgid "New enum values must be committed before they can be used." +msgstr "È necessario eseguire il commit dei nuovi valori enum prima di poter essere utilizzati." -#: utils/adt/enum.c:48 utils/adt/enum.c:58 utils/adt/enum.c:113 -#: utils/adt/enum.c:123 +#: 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 "la sintassi per l'enumerazione %s non è valida: \"%s\"" -#: utils/adt/enum.c:85 utils/adt/enum.c:148 utils/adt/enum.c:207 +#: 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 "il valore interno per l'enumerazione non è valido: %u" -#: utils/adt/enum.c:360 utils/adt/enum.c:389 utils/adt/enum.c:429 -#: utils/adt/enum.c:449 +#: 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 "determinazione del tipo reale di enumerazione fallita" -#: utils/adt/enum.c:368 utils/adt/enum.c:397 +#: utils/adt/enum.c:453 utils/adt/enum.c:482 #, c-format msgid "enum %s contains no values" msgstr "l'enumerazione %s non contiene valori" -#: utils/adt/expandedrecord.c:98 utils/adt/expandedrecord.c:230 -#: utils/cache/typcache.c:1563 utils/cache/typcache.c:1719 -#: utils/cache/typcache.c:1849 utils/fmgr/funcapi.c:430 -#, c-format -msgid "type %s is not composite" -msgstr "il tipo %s non è composito" - -#: utils/adt/float.c:55 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "il valore è fuori dall'intervallo consentito: overflow" -#: utils/adt/float.c:60 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "il valore è fuori dall'intervallo consentito: underflow" -#: utils/adt/float.c:309 +#: utils/adt/float.c:266 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" è fuori dall'intervallo consentito per il tipo real" -#: utils/adt/float.c:534 +#: utils/adt/float.c:478 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" è fuori dall'intervallo consentito per il tipo double precision" -#: utils/adt/float.c:1381 utils/adt/float.c:1439 utils/adt/int.c:332 -#: utils/adt/int.c:870 utils/adt/int.c:892 utils/adt/int.c:906 -#: utils/adt/int.c:920 utils/adt/int.c:952 utils/adt/int.c:1190 -#: utils/adt/int8.c:1185 utils/adt/numeric.c:3214 utils/adt/numeric.c:3223 +#: 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 "il valore è fuori dall'intervallo consentito per il tipo smallint" -#: utils/adt/float.c:1565 utils/adt/numeric.c:7802 +#: 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 "non è possibile estrarre la radice quadrata di un numero negativo" -#: utils/adt/float.c:1626 utils/adt/numeric.c:3017 +#: 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 "zero elevato a potenza negativa non è definito" -#: utils/adt/float.c:1630 utils/adt/numeric.c:3023 +#: 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 "un numero negativo elevato a potenza non intera è un valore di tipo complesso" -#: utils/adt/float.c:1696 utils/adt/float.c:1726 utils/adt/numeric.c:8068 +#: 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 "non è possibile calcolare il logaritmo di zero" -#: utils/adt/float.c:1700 utils/adt/float.c:1730 utils/adt/numeric.c:8072 +#: 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 "non è possibile calcolare il logaritmo di un numero negativo" -#: utils/adt/float.c:1760 utils/adt/float.c:1790 utils/adt/float.c:1882 -#: utils/adt/float.c:1908 utils/adt/float.c:1935 utils/adt/float.c:1961 -#: utils/adt/float.c:2108 utils/adt/float.c:2143 utils/adt/float.c:2307 -#: utils/adt/float.c:2361 utils/adt/float.c:2425 utils/adt/float.c:2480 +#: 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 "il valore di input è fuori dall'intervallo consentito" -#: utils/adt/float.c:3686 utils/adt/numeric.c:1504 +#: utils/adt/float.c:2796 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "il parametro setseed %g non rientra nell'intervallo consentito [-1,1]" + +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "il valore count dev'essere maggiore di zero" -#: utils/adt/float.c:3691 utils/adt/numeric.c:1511 +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "l'operando e i valori minimo e massimo non possono essere NaN" -#: utils/adt/float.c:3697 +#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 #, c-format msgid "lower and upper bounds must be finite" msgstr "i valori minimo e massimo devono essere finiti" -#: utils/adt/float.c:3731 utils/adt/numeric.c:1524 +#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 #, c-format msgid "lower bound cannot equal upper bound" msgstr "il valore minimo non può essere uguale a quello massimo" -#: utils/adt/formatting.c:488 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "la specifica di formato per un intervallo non è valida" -#: utils/adt/formatting.c:489 +#: utils/adt/formatting.c:562 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Gli intervalli non sono legati a specifiche date di calendario." -#: utils/adt/formatting.c:1059 +#: utils/adt/formatting.c:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" dev'essere l'ultimo pattern usato" -#: utils/adt/formatting.c:1067 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" dev'essere più avanti di \"PR\"" -#: utils/adt/formatting.c:1083 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" dev'essere più avanti di \"PR\"" -#: utils/adt/formatting.c:1110 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "troppi punti decimali" -#: utils/adt/formatting.c:1114 utils/adt/formatting.c:1197 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "non è possibile usare \"V\" ed un punto decimale insieme" -#: utils/adt/formatting.c:1126 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "non è possibile usare \"S\" due volte" -#: utils/adt/formatting.c:1130 +#: utils/adt/formatting.c:1263 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "non è possibile usare sia \"S\" che \"PL\"/\"MI\"/\"SG\"/\"PR\" insieme" -#: utils/adt/formatting.c:1150 +#: utils/adt/formatting.c:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "non è possibile usare sia \"S\" che \"MI\" insieme" -#: utils/adt/formatting.c:1160 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "non è possibile usare sia \"S\" che \"PL\" insieme" -#: utils/adt/formatting.c:1170 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "non è possibile usare sia \"S\" che \"SG\" insieme" -#: utils/adt/formatting.c:1179 +#: utils/adt/formatting.c:1312 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "non è possibile usare sia \"PR\" che \"S\"/\"PL\"/\"MI\"/\"SG\" insieme" -#: utils/adt/formatting.c:1205 +#: utils/adt/formatting.c:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "non è possibile usare \"EEEE\" due volte" -#: utils/adt/formatting.c:1211 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" non è compatibile con altri formati" -#: utils/adt/formatting.c:1212 +#: utils/adt/formatting.c:1345 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" può essere usato soltanto insieme a pattern di cifre e punti decimali." -#: utils/adt/formatting.c:1392 +#: utils/adt/formatting.c:1429 +#, c-format +msgid "invalid datetime format separator: \"%s\"" +msgstr "separatore di formato data e ora non valido: \"%s\"" + +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" non è un numero" -#: utils/adt/formatting.c:1470 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "conversione maiuscole/minuscole fallita: %s" -#: utils/adt/formatting.c:1535 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 utils/adt/formatting.c:1933 #, c-format -msgid "could not determine which collation to use for lower() function" -msgstr "non è stato possibile determinare quale ordinamento usare per la funzione lower()" +msgid "could not determine which collation to use for %s function" +msgstr "non è stato possibile determinare quale confronto utilizzare per la funzione %s" -#: utils/adt/formatting.c:1657 -#, c-format -msgid "could not determine which collation to use for upper() function" -msgstr "non è stato possibile determinare quale ordinamento usare per la funzione upper()" - -#: utils/adt/formatting.c:1780 -#, c-format -msgid "could not determine which collation to use for initcap() function" -msgstr "non è stato possibile determinare quale ordinamento usare per la funzione initcap()" - -#: utils/adt/formatting.c:2148 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "la combinazione di convenzioni di date non è valida" -#: utils/adt/formatting.c:2149 +#: utils/adt/formatting.c:2315 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Non è possibile usare la convenzione gregoriana e ISO per settimane in un modello di formattazione." -#: utils/adt/formatting.c:2166 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "sono presenti valori contraddittori per il campo \"%s\" nella stringa di formattazione" -#: utils/adt/formatting.c:2168 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." -msgstr "Questo valore contraddice una impostazione precedente per lo stesso tipo di campo" +msgstr "Questo valore contraddice una impostazione precedente per lo stesso tipo di campo." -#: utils/adt/formatting.c:2229 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "la stringa di origine è troppo corta per il campo di formattazione \"%s\"" -#: utils/adt/formatting.c:2231 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Il campo necessita di %d caratteri ma ne restano solo %d." -#: utils/adt/formatting.c:2234 utils/adt/formatting.c:2248 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Se la stringa di partenza non ha lunghezza fissa, prova ad usare il modificatore \"FM\"." -#: utils/adt/formatting.c:2244 utils/adt/formatting.c:2257 -#: utils/adt/formatting.c:2387 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "valore \"%s\" per \"%s\" non valido" -#: utils/adt/formatting.c:2246 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Il campo necessita di %d caratteri, ma è stato possibile analizzarne solo %d." -#: utils/adt/formatting.c:2259 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "Il valore deve essere un integer." -#: utils/adt/formatting.c:2264 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "il valore \"%s\" nella stringa di origine è fuori dall'intervallo consentito" -#: utils/adt/formatting.c:2266 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "Il valore deve essere compreso fra %d e %d." -#: utils/adt/formatting.c:2389 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Il valore fornito non corrisponde a nessuno di quelli consentiti per questo campo." -#: utils/adt/formatting.c:2587 utils/adt/formatting.c:2607 -#: utils/adt/formatting.c:2627 utils/adt/formatting.c:2647 -#: utils/adt/formatting.c:2666 utils/adt/formatting.c:2685 -#: utils/adt/formatting.c:2709 utils/adt/formatting.c:2727 -#: utils/adt/formatting.c:2745 utils/adt/formatting.c:2763 -#: utils/adt/formatting.c:2780 utils/adt/formatting.c:2797 +#: utils/adt/formatting.c:2886 utils/adt/formatting.c:2906 utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "valore del formato della stringa localizzata troppo lungo" -#: utils/adt/formatting.c:3084 +#: utils/adt/formatting.c:3373 +#, c-format +msgid "unmatched format separator \"%c\"" +msgstr "separatore di formato non corrispondente \"%c\"" + +#: utils/adt/formatting.c:3434 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "carattere di formato non corrispondente \"%s\"" + +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "il campo di formattazione \"%s\" è supportato solo in to_char" -#: utils/adt/formatting.c:3209 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "stringa di input non valida per \"Y,YYY\"" -#: utils/adt/formatting.c:3724 +#: utils/adt/formatting.c:3801 +#, c-format +msgid "input string is too short for datetime format" +msgstr "la stringa di input è troppo breve per il formato datetime" + +#: utils/adt/formatting.c:3809 +#, c-format +msgid "trailing characters remain in input string after datetime format" +msgstr "i caratteri finali rimangono nella stringa di input dopo il formato datetime" + +#: utils/adt/formatting.c:4370 +#, c-format +msgid "missing time zone in input string for type timestamptz" +msgstr "fuso orario mancante nella stringa di input per il tipo timestamptz" + +#: utils/adt/formatting.c:4376 +#, c-format +msgid "timestamptz out of range" +msgstr "timestampz fuori intervallo" + +#: utils/adt/formatting.c:4404 +#, c-format +msgid "datetime format is zoned but not timed" +msgstr "il formato datetime è suddiviso in zone ma non a tempo" + +#: utils/adt/formatting.c:4456 +#, c-format +msgid "missing time zone in input string for type timetz" +msgstr "fuso orario mancante nella stringa di input per il tipo timetz" + +#: utils/adt/formatting.c:4462 +#, c-format +msgid "timetz out of range" +msgstr "timetz fuori dall'intervallo previsto" + +#: utils/adt/formatting.c:4488 +#, c-format +msgid "datetime format is not dated and not timed" +msgstr "il formato datetime non è datato e non è a tempo" + +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "l'ora \"%d\" non è valida su un orologio a 12 ore" -#: utils/adt/formatting.c:3726 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Usa l'orologio a 24 ore o fornisci un'ora compresa fra 1 e 12." -#: utils/adt/formatting.c:3832 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "non è possibile calcolare il giorno dell'anno senza informazioni sull'anno" -#: utils/adt/formatting.c:4737 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "l'uso di \"EEEE\" non è supportato per l'input" -#: utils/adt/formatting.c:4749 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "l'uso di \"RN\" non è supportato per l'input" -#: utils/adt/genfile.c:79 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "i riferimenti alla directory padre (\"..\") non sono consentiti" - -#: utils/adt/genfile.c:90 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "i percorsi assoluti non sono consentiti" -#: utils/adt/genfile.c:95 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "il percorso dev'essere nella directory corrente o in una sua sottodirectory" -#: utils/adt/genfile.c:142 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:189 utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:836 utils/adt/oracle_compat.c:1139 #, c-format msgid "requested length too large" msgstr "la lunghezza richiesta è eccessiva" -#: utils/adt/genfile.c:159 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "spostamento nel file \"%s\" fallito: %m" -#: utils/adt/genfile.c:219 +#: utils/adt/genfile.c:171 #, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "solo i superutenti possono leggere file con adminpack 1.0" +msgid "file length too large" +msgstr "lunghezza del file troppo grande" -#: utils/adt/genfile.c:220 +#: utils/adt/genfile.c:248 #, c-format -msgid "Consider using pg_file_read(), which is part of core, instead." -msgstr "Considera l'uso di pg_file_read(), che è parte del core, invece." +msgid "must be superuser to read files with adminpack 1.0" +msgstr "solo i superutenti possono leggere file con adminpack 1.0" -#: utils/adt/geo_ops.c:939 +#: 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 "specificazione di linea non valida: A e B non possono essere entrambi zero" -#: utils/adt/geo_ops.c:947 +#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "specificazione di linea non valida: devono essere due punti distinti" -#: utils/adt/geo_ops.c:1341 utils/adt/geo_ops.c:3439 utils/adt/geo_ops.c:4252 -#: utils/adt/geo_ops.c:5180 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "il numero di punti richiesti è eccessivo" -#: utils/adt/geo_ops.c:1403 +#: utils/adt/geo_ops.c:1472 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "il numero di punti nel valore del \"path\" esterno non è valido" -#: utils/adt/geo_ops.c:2554 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "la funzione \"dist_lb\" non è implementata" - -#: utils/adt/geo_ops.c:3014 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "la funzione \"close_sl\" non è implementata" - -#: utils/adt/geo_ops.c:3116 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "la funzione \"close_lb\" non è implementata" - -#: utils/adt/geo_ops.c:3405 -#, c-format -msgid "cannot create bounding box for empty polygon" -msgstr "non è possibile creare un bounding box per il poligono vuoto" - -#: utils/adt/geo_ops.c:3486 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "il numero di punti nel valore \"polygon\" esterno non è valido" -#: utils/adt/geo_ops.c:4011 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "la funzione \"poly_distance\" non è implementata" - -#: utils/adt/geo_ops.c:4364 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "la funzione \"path_center\" non è implementata" - -#: utils/adt/geo_ops.c:4381 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "un path aperto non può essere convertito in un poligono" -#: utils/adt/geo_ops.c:4630 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "il raggio nel valore esterno di \"circle\" non è valido" -#: utils/adt/geo_ops.c:5166 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "non è possibile convertire un cerchio con raggio nullo in un poligono" -#: utils/adt/geo_ops.c:5171 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "devono essere richiesti almeno 2 punti" -#: utils/adt/geo_ops.c:5215 -#, c-format -msgid "cannot convert empty polygon to circle" -msgstr "non è possibile convertire un poligono vuoto in un cerchio" - -#: utils/adt/int.c:160 +#: utils/adt/int.c:188 #, c-format msgid "int2vector has too many elements" msgstr "ci sono troppi elementi nell'int2vector" -#: utils/adt/int.c:235 +#: utils/adt/int.c:261 #, c-format msgid "invalid int2vector data" msgstr "dati int2vector non validi" -#: utils/adt/int.c:241 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 "ci sono troppi elementi nell'oidvector" -#: utils/adt/int.c:1379 utils/adt/int8.c:1309 utils/adt/numeric.c:1412 -#: utils/adt/timestamp.c:5318 utils/adt/timestamp.c:5399 +#: 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 "il valore del passo non può essere uguale a zero" -#: utils/adt/int8.c:125 utils/adt/numutils.c:51 utils/adt/numutils.c:61 -#: utils/adt/numutils.c:105 -#, c-format -msgid "invalid input syntax for integer: \"%s\"" -msgstr "sintassi di input non valida per un intero: \"%s\"" - -#: utils/adt/int8.c:526 utils/adt/int8.c:549 utils/adt/int8.c:563 -#: utils/adt/int8.c:577 utils/adt/int8.c:608 utils/adt/int8.c:632 -#: utils/adt/int8.c:687 utils/adt/int8.c:701 utils/adt/int8.c:725 -#: utils/adt/int8.c:738 utils/adt/int8.c:807 utils/adt/int8.c:821 -#: utils/adt/int8.c:835 utils/adt/int8.c:866 utils/adt/int8.c:888 -#: utils/adt/int8.c:902 utils/adt/int8.c:916 utils/adt/int8.c:949 -#: utils/adt/int8.c:963 utils/adt/int8.c:977 utils/adt/int8.c:1008 -#: utils/adt/int8.c:1030 utils/adt/int8.c:1044 utils/adt/int8.c:1058 -#: utils/adt/int8.c:1218 utils/adt/int8.c:1253 utils/adt/numeric.c:3169 -#: utils/adt/varbit.c:1655 +#: 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 fuori dall'intervallo consentito" -#: utils/adt/int8.c:1266 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID fuori dall'intervallo consentito" -#: utils/adt/json.c:787 -#, c-format -msgid "Character with value 0x%02x must be escaped." -msgstr "Il carattere con valore 0x%02x deve essere sottoposto ad escape." - -#: utils/adt/json.c:828 -#, c-format -msgid "\"\\u\" must be followed by four hexadecimal digits." -msgstr "\"\\u\" deve essere seguito da quattro cifre esadecimali." - -#: utils/adt/json.c:844 -#, c-format -msgid "Unicode high surrogate must not follow a high surrogate." -msgstr "un carattere surrogato alto Unicode non può seguire un altro surrogato alto" - -#: utils/adt/json.c:855 utils/adt/json.c:865 utils/adt/json.c:917 -#: utils/adt/json.c:979 utils/adt/json.c:991 -#, c-format -msgid "Unicode low surrogate must follow a high surrogate." -msgstr "un carattere surrogato basso Unicode deve seguire un surrogato alto" - -#: utils/adt/json.c:880 utils/adt/json.c:903 -#, c-format -msgid "unsupported Unicode escape sequence" -msgstr "sequenza di escape Unicode non supportata" - -#: utils/adt/json.c:881 -#, c-format -msgid "\\u0000 cannot be converted to text." -msgstr "\\u0000 non può essere convertito in testo." - -#: utils/adt/json.c:904 -#, c-format -msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8." -msgstr "i codici escape Unicode non possono essere usati per caratteri con codice superiore ad 007F quando l'encoding del server non è UTF8" - -#: utils/adt/json.c:949 utils/adt/json.c:967 -#, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "La sequenza di escape \"\\%s\" non è valida." - -#: utils/adt/json.c:1136 -#, c-format -msgid "The input string ended unexpectedly." -msgstr "La stringa di input è terminata inaspettatamente." - -#: utils/adt/json.c:1150 -#, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Era prevista la fine dell'input, trovato \"%s\" invece." - -#: utils/adt/json.c:1161 -#, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Era previsto un valore JSON, trovato \"%s\" invece." - -#: utils/adt/json.c:1169 utils/adt/json.c:1217 -#, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Era prevista una stringa, trovato \"%s\" invece." - -#: utils/adt/json.c:1177 -#, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Era previsto un elemento di array oppure \"]\", trovato \"%s\" invece." - -#: utils/adt/json.c:1185 -#, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Era previsto \",\" oppure \"]\", trovato \"%s\" invece." - -#: utils/adt/json.c:1193 -#, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Era prevista una stringa oppure \"}\", trovato \"%s\" invece." - -#: utils/adt/json.c:1201 -#, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "Era previsto \":\", trovato \"%s\" invece." - -#: utils/adt/json.c:1209 -#, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Era previsto \",\" oppure \"}\", trovato \"%s\" invece." - -#: utils/adt/json.c:1247 -#, c-format -msgid "Token \"%s\" is invalid." -msgstr "Il token \"%s\" non è valido." - -#: utils/adt/json.c:1319 -#, c-format -msgid "JSON data, line %d: %s%s%s" -msgstr "dati JSON, riga %d: %s%s%s" - -#: utils/adt/json.c:1475 utils/adt/jsonb.c:728 +#: utils/adt/json.c:271 utils/adt/jsonb.c:757 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "la chiave deve essere uno scalare, non array, composito né json" -#: utils/adt/json.c:2076 utils/adt/json.c:2086 utils/fmgr/funcapi.c:1564 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2061 #, c-format msgid "could not determine data type for argument %d" msgstr "impossibile determinare il tipo di dato per l'argomento %d" -#: utils/adt/json.c:2110 utils/adt/jsonb.c:1694 +#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 #, c-format msgid "field name must not be null" msgstr "il nome del campo non può essere nullo" -#: utils/adt/json.c:2194 utils/adt/jsonb.c:1146 +#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 #, c-format msgid "argument list must have even number of elements" msgstr "la lista di argomenti deve avere un numero pari di elementi" -#: utils/adt/json.c:2195 +#. translator: %s is a SQL function name +#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 #, c-format -msgid "The arguments of json_build_object() must consist of alternating keys and values." -msgstr "Gli argomenti di json_build_object() devono consistere in una serie alternata di chiavi e valori." +msgid "The arguments of %s must consist of alternating keys and values." +msgstr "Gli argomenti di %s devono essere costituiti da chiavi e valori alternati." -#: utils/adt/json.c:2210 +#: utils/adt/json.c:1028 #, c-format msgid "argument %d cannot be null" msgstr "l'argomento %d non può essere nullo" -#: utils/adt/json.c:2211 +#: utils/adt/json.c:1029 #, c-format msgid "Object keys should be text." msgstr "Le chiavi degli oggetti devono essere testo." -#: utils/adt/json.c:2317 utils/adt/jsonb.c:1276 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "l'array deve avere due colonne" -#: utils/adt/json.c:2341 utils/adt/json.c:2425 utils/adt/jsonb.c:1300 -#: utils/adt/jsonb.c:1395 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1428 #, c-format msgid "null value not allowed for object key" msgstr "valori null non ammessi per le chiavi di oggetti" -#: utils/adt/json.c:2414 utils/adt/jsonb.c:1384 +#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "le dimensioni degli array non combaciano" -#: utils/adt/jsonb.c:258 +#: utils/adt/jsonb.c:287 #, c-format msgid "string too long to represent as jsonb string" msgstr "la stringa è troppo lunga per essere rappresentata come stringa jsonb" -#: utils/adt/jsonb.c:259 +#: utils/adt/jsonb.c:288 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "A causa di una restrizione nell'implementazione le stringhe jsonb non possono superare i %d byte." -#: utils/adt/jsonb.c:1147 -#, c-format -msgid "The arguments of jsonb_build_object() must consist of alternating keys and values." -msgstr "Gli argomenti di jsonb_build_object() devono essere coppie chiave-valore appaiate." - -#: utils/adt/jsonb.c:1159 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "argomento %d: la chiave non può essere null" -#: utils/adt/jsonb.c:1747 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "le chiavi dell'oggetto devono essere stringhe" -#: utils/adt/jsonb.c:1910 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "non è possibile convertire un null jsonb al tipo %s" -#: utils/adt/jsonb.c:1911 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "non è possibile convertire una stringa jsonb al tipo %s" -#: utils/adt/jsonb.c:1912 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "non è possibile convertire un numero jsonb al tipo %s" -#: utils/adt/jsonb.c:1913 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "non è possibile convertire un booleano jsonb al tipo %s" -#: utils/adt/jsonb.c:1914 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "non è possibile convertire un array jsonb al tipo %s" -#: utils/adt/jsonb.c:1915 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "non è possibile convertire un oggetto jsonb al tipo %s" -#: utils/adt/jsonb.c:1916 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "non è possibile convertire un array o oggetto jsonb al tipo %s" -#: utils/adt/jsonb_util.c:657 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "il numero di coppie dell'oggetto jsonb supera il massimo consentito (%zu)" -#: utils/adt/jsonb_util.c:698 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "il numero di elementi dell'array jsonb supera il massimo consentito (%zu)" -#: utils/adt/jsonb_util.c:1569 utils/adt/jsonb_util.c:1589 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "la dimensione totale degli elementi dell'array jsonb supera il massimo di %u byte" -#: utils/adt/jsonb_util.c:1650 utils/adt/jsonb_util.c:1685 -#: utils/adt/jsonb_util.c:1705 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 utils/adt/jsonb_util.c:1803 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "la dimensione totale degli elementi dell'oggetto jsonb supera il massimo di %u byte" -#: utils/adt/jsonfuncs.c:523 utils/adt/jsonfuncs.c:688 -#: utils/adt/jsonfuncs.c:2276 utils/adt/jsonfuncs.c:2716 -#: utils/adt/jsonfuncs.c:3473 utils/adt/jsonfuncs.c:3824 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "jsonb pedice non supporta le sezioni" + +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#, c-format +msgid "subscript type %s is not supported" +msgstr "il tipo di pedice %s non è supportato" + +#: utils/adt/jsonbsubs.c:104 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "jsonb pedice deve essere coercibile a un solo tipo, intero o testo." + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "jsonb pedice deve essere coercibile a intero o testo." + +#: utils/adt/jsonbsubs.c:139 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "jsonb pedice deve avere il tipo di testo" + +#: utils/adt/jsonbsubs.c:207 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "jsonb pedice nell'assegnazione non deve essere nullo" + +#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 utils/adt/jsonfuncs.c:2360 utils/adt/jsonfuncs.c:2800 utils/adt/jsonfuncs.c:3589 utils/adt/jsonfuncs.c:3922 #, c-format msgid "cannot call %s on a scalar" msgstr "non è possibile eseguire %s su uno scalare" -#: utils/adt/jsonfuncs.c:528 utils/adt/jsonfuncs.c:675 -#: utils/adt/jsonfuncs.c:2718 utils/adt/jsonfuncs.c:3462 +#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 utils/adt/jsonfuncs.c:2802 utils/adt/jsonfuncs.c:3578 #, c-format msgid "cannot call %s on an array" msgstr "non è possibile eseguire %s su un array" -#: utils/adt/jsonfuncs.c:1591 utils/adt/jsonfuncs.c:1626 +#: utils/adt/jsonfuncs.c:687 +#, c-format +msgid "JSON data, line %d: %s%s%s" +msgstr "dati JSON, riga %d: %s%s%s" + +#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 #, c-format msgid "cannot get array length of a scalar" msgstr "non è possibile ottenere la lunghezza di uno scalare" -#: utils/adt/jsonfuncs.c:1595 utils/adt/jsonfuncs.c:1614 +#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 #, c-format msgid "cannot get array length of a non-array" msgstr "non è possibile ottenere la lunghezza di un oggetto che non è un array" -#: utils/adt/jsonfuncs.c:1691 +#: utils/adt/jsonfuncs.c:1922 #, c-format msgid "cannot call %s on a non-object" msgstr "non è possibile eseguire %s su un argomento che non è un oggetto" -#: utils/adt/jsonfuncs.c:1709 utils/adt/jsonfuncs.c:3266 -#: utils/adt/jsonfuncs.c:3621 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "funzione che restituisce record eseguita in un contesto che non può accettare il tipo record" - -#: utils/adt/jsonfuncs.c:1949 +#: utils/adt/jsonfuncs.c:2106 #, c-format msgid "cannot deconstruct an array as an object" msgstr "non è possibile decostruire un array come un oggetto" -#: utils/adt/jsonfuncs.c:1961 +#: utils/adt/jsonfuncs.c:2118 #, c-format msgid "cannot deconstruct a scalar" msgstr "non è possibile decostruire uno scalare" -#: utils/adt/jsonfuncs.c:2007 +#: utils/adt/jsonfuncs.c:2161 #, c-format msgid "cannot extract elements from a scalar" msgstr "non è possibile estrarre elementi da uno scalare" -#: utils/adt/jsonfuncs.c:2011 +#: utils/adt/jsonfuncs.c:2165 #, c-format msgid "cannot extract elements from an object" msgstr "non è possibile estrarre elementi da un oggetto" -#: utils/adt/jsonfuncs.c:2263 utils/adt/jsonfuncs.c:3708 +#: utils/adt/jsonfuncs.c:2347 utils/adt/jsonfuncs.c:3807 #, c-format msgid "cannot call %s on a non-array" msgstr "non è possibile eseguire %s su un argomento che non è un array" -#: utils/adt/jsonfuncs.c:2333 utils/adt/jsonfuncs.c:2338 -#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:2361 +#: 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 "atteso un array JSON" -#: utils/adt/jsonfuncs.c:2334 +#: utils/adt/jsonfuncs.c:2418 #, c-format msgid "See the value of key \"%s\"." msgstr "Vedi il valore della chiave \"%s\"." -#: utils/adt/jsonfuncs.c:2356 +#: utils/adt/jsonfuncs.c:2440 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Vedi l'elemento dell'array %s della chiave \"%s\"." -#: utils/adt/jsonfuncs.c:2362 +#: utils/adt/jsonfuncs.c:2446 #, c-format msgid "See the array element %s." msgstr "Vedi l'elemento dell'array %s." -#: utils/adt/jsonfuncs.c:2397 +#: utils/adt/jsonfuncs.c:2481 #, c-format msgid "malformed JSON array" msgstr "array JSON non valido" -#: utils/adt/jsonfuncs.c:3250 utils/adt/jsonfuncs.c:3606 +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3308 #, c-format msgid "first argument of %s must be a row type" msgstr "il primo elemento di %s deve essere di tipo riga" -#: utils/adt/jsonfuncs.c:3268 utils/adt/jsonfuncs.c:3623 +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3332 +#, c-format +msgid "could not determine row type for result of %s" +msgstr "impossibile determinare il tipo di riga per il risultato di %s" + +#: utils/adt/jsonfuncs.c:3334 +#, c-format +msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." +msgstr "Fornire un argomento del record non nullo o chiamare la funzione nella clausola FROM utilizzando un elenco di definizioni di colonna." + +#: utils/adt/jsonfuncs.c:3696 utils/fmgr/funcapi.c:94 #, c-format -msgid "Try calling the function in the FROM clause using a column definition list." -msgstr "Prova ad eseguire la funzione nella clausola FROM usando una lista di definizioni di colonne." +msgid "materialize mode required, but it is not allowed in this context" +msgstr "necessaria modalità materializzata, ma non ammessa in questo contesto" -#: utils/adt/jsonfuncs.c:3725 utils/adt/jsonfuncs.c:3806 +#: utils/adt/jsonfuncs.c:3824 utils/adt/jsonfuncs.c:3904 #, c-format msgid "argument of %s must be an array of objects" msgstr "l'argomento di %s deve essere un array di oggetti" -#: utils/adt/jsonfuncs.c:3758 +#: utils/adt/jsonfuncs.c:3857 #, c-format msgid "cannot call %s on an object" msgstr "non è possibile eseguire %s su un oggetto" -#: utils/adt/jsonfuncs.c:4235 utils/adt/jsonfuncs.c:4294 -#: utils/adt/jsonfuncs.c:4374 +#: utils/adt/jsonfuncs.c:4264 utils/adt/jsonfuncs.c:4323 utils/adt/jsonfuncs.c:4403 #, c-format msgid "cannot delete from scalar" msgstr "non è possibile eliminare da uno scalare" -#: utils/adt/jsonfuncs.c:4379 +#: utils/adt/jsonfuncs.c:4408 #, c-format msgid "cannot delete from object using integer index" msgstr "non è possibile eliminare da un oggetto usando numeri interi come indici" -#: utils/adt/jsonfuncs.c:4445 utils/adt/jsonfuncs.c:4537 +#: utils/adt/jsonfuncs.c:4476 utils/adt/jsonfuncs.c:4637 #, c-format msgid "cannot set path in scalar" msgstr "non è possibile impostare un percorso in uno scalare" -#: utils/adt/jsonfuncs.c:4490 +#: utils/adt/jsonfuncs.c:4518 utils/adt/jsonfuncs.c:4560 #, c-format -msgid "cannot delete path in scalar" -msgstr "non è possibile eliminare un percorso in uno scalare" +msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" +msgstr "null_value_treatment deve essere \"delete_key\", \"return_target\", \"use_json_null\" o \"raise_exception\"" + +#: utils/adt/jsonfuncs.c:4531 +#, c-format +msgid "JSON value must not be null" +msgstr "Il valore JSON non deve essere nullo" + +#: utils/adt/jsonfuncs.c:4532 +#, c-format +msgid "Exception was raised because null_value_treatment is \"raise_exception\"." +msgstr "È stata sollevata un'eccezione perché null_value_treatment è \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4660 +#: utils/adt/jsonfuncs.c:4533 #, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "concatenazione invalida di oggetti jsonb" +msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." +msgstr "Per evitare, modificare l'argomento null_value_treatment o assicurarsi che non venga passato un NULL SQL." -#: utils/adt/jsonfuncs.c:4694 +#: utils/adt/jsonfuncs.c:4588 +#, c-format +msgid "cannot delete path in scalar" +msgstr "non è possibile eliminare un percorso in uno scalare" + +#: utils/adt/jsonfuncs.c:4804 #, c-format msgid "path element at position %d is null" msgstr "l'elemento di percorso in posizione %d è nullo" -#: utils/adt/jsonfuncs.c:4780 +#: utils/adt/jsonfuncs.c:4823 utils/adt/jsonfuncs.c:4854 utils/adt/jsonfuncs.c:4921 #, c-format msgid "cannot replace existing key" msgstr "non è possibile sostituire una chiave esistente" -#: utils/adt/jsonfuncs.c:4781 +#: utils/adt/jsonfuncs.c:4824 utils/adt/jsonfuncs.c:4855 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "Il percorso presuppone che la chiave sia un oggetto composto, ma è un valore scalare." + +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Prova ad utilizzare la funzione jsonb_set per rimpiazzare il valore della chiave." -#: utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:5026 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "l'elemento di percorso in posizione %d non è un intero: \"%s\"" -#: utils/adt/jsonfuncs.c:4982 +#: utils/adt/jsonfuncs.c:5043 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "l'elemento del percorso nella posizione %d non è compreso nell'intervallo: %d" + +#: utils/adt/jsonfuncs.c:5195 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "tipo di flag non valido, solo array e scalari sono consentiti" -#: utils/adt/jsonfuncs.c:4989 +#: utils/adt/jsonfuncs.c:5202 #, c-format msgid "flag array element is not a string" msgstr "l'elemento dell'array di flag non è una stringa" -#: utils/adt/jsonfuncs.c:4990 utils/adt/jsonfuncs.c:5012 +#: utils/adt/jsonfuncs.c:5203 utils/adt/jsonfuncs.c:5225 #, c-format -msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"" -msgstr "I valori possibili sono: \"string\", \"numeric\", \"boolean\", \"key\" e \"all\"" +msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." +msgstr "I valori possibili sono: \"string\", \"numeric\", \"boolean\", \"key\" e \"all\"." -#: utils/adt/jsonfuncs.c:5010 +#: utils/adt/jsonfuncs.c:5223 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "flag errato nell'array di flag: \"%s\"" +#: utils/adt/jsonpath.c:362 +#, c-format +msgid "@ is not allowed in root expressions" +msgstr "@ non è consentito nelle espressioni radice" + +#: utils/adt/jsonpath.c:368 +#, c-format +msgid "LAST is allowed only in array subscripts" +msgstr "LAST è consentito solo negli indici dell'array" + +#: utils/adt/jsonpath_exec.c:360 +#, c-format +msgid "single boolean result is expected" +msgstr "è previsto un singolo risultato booleano" + +#: utils/adt/jsonpath_exec.c:556 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "L'argomento \"vars\" non è un oggetto" + +#: utils/adt/jsonpath_exec.c:557 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "I parametri Jsonpath devono essere codificati come coppie chiave-valore dell'oggetto \"vars\"." + +#: utils/adt/jsonpath_exec.c:674 +#, c-format +msgid "JSON object does not contain key \"%s\"" +msgstr "L'oggetto JSON non contiene la chiave \"%s\"" + +#: utils/adt/jsonpath_exec.c:686 +#, c-format +msgid "jsonpath member accessor can only be applied to an object" +msgstr "jsonpath membro accessor può essere applicato solo a un oggetto" + +#: utils/adt/jsonpath_exec.c:715 +#, c-format +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "la funzione di accesso dell'array con caratteri jolly jsonpath può essere applicata solo a un array" + +#: utils/adt/jsonpath_exec.c:763 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "l'indice dell'array jsonpath è fuori dai limiti" + +#: utils/adt/jsonpath_exec.c:820 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "la funzione di accesso dell'array jsonpath può essere applicata solo a un array" + +#: utils/adt/jsonpath_exec.c:872 +#, c-format +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "la funzione di accesso del membro jolly jsonpath può essere applicata solo a un oggetto" + +#: utils/adt/jsonpath_exec.c:1002 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "il metodo dell'elemento jsonpath .%s() può essere applicato solo a un array" + +#: 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 "l'argomento numerico del metodo dell'elemento jsonpath .%s() è fuori dall'intervallo per il tipo double precision" + +#: 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 "argomento stringa del metodo elemento jsonpath .%s() non è una rappresentazione valida di un numero a doppia precisione" + +#: 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 item method .%s() può essere applicato solo a una stringa oa un valore numerico" + +#: utils/adt/jsonpath_exec.c:1579 +#, c-format +msgid "left operand of jsonpath operator %s is not a single numeric value" +msgstr "l'operando sinistro dell'operatore jsonpath %s non è un singolo valore numerico" + +#: utils/adt/jsonpath_exec.c:1586 +#, c-format +msgid "right operand of jsonpath operator %s is not a single numeric value" +msgstr "l'operando destro dell'operatore jsonpath %s non è un singolo valore numerico" + +#: utils/adt/jsonpath_exec.c:1654 +#, c-format +msgid "operand of unary jsonpath operator %s is not a numeric value" +msgstr "operando dell'operatore jsonpath unario %s non è un valore numerico" + +#: utils/adt/jsonpath_exec.c:1752 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a numeric value" +msgstr "il metodo dell'elemento jsonpath .%s() può essere applicato solo a un valore numerico" + +#: utils/adt/jsonpath_exec.c:1792 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a string" +msgstr "jsonpath item metodo .%s() può essere applicato solo a una stringa" + +#: utils/adt/jsonpath_exec.c:1886 +#, c-format +msgid "datetime format is not recognized: \"%s\"" +msgstr "il formato data/ora non è riconosciuto: \"%s\"" + +#: utils/adt/jsonpath_exec.c:1888 +#, c-format +msgid "Use a datetime template argument to specify the input data format." +msgstr "Utilizzare un argomento del modello datetime per specificare il formato dei dati di input." + +#: utils/adt/jsonpath_exec.c:1956 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an object" +msgstr "jsonpath item method .%s() può essere applicato solo a un oggetto" + +#: utils/adt/jsonpath_exec.c:2138 +#, c-format +msgid "could not find jsonpath variable \"%s\"" +msgstr "impossibile trovare la variabile jsonpath \"%s\"" + +#: utils/adt/jsonpath_exec.c:2402 +#, c-format +msgid "jsonpath array subscript is not a single numeric value" +msgstr "l'indice dell'array jsonpath non è un singolo valore numerico" + +#: utils/adt/jsonpath_exec.c:2414 +#, c-format +msgid "jsonpath array subscript is out of integer range" +msgstr "l'indice dell'array jsonpath non è compreso nell'intervallo di interi" + +#: utils/adt/jsonpath_exec.c:2591 +#, c-format +msgid "cannot convert value from %s to %s without time zone usage" +msgstr "impossibile convertire il valore da %s a %s senza l'utilizzo del fuso orario" + +#: utils/adt/jsonpath_exec.c:2593 +#, c-format +msgid "Use *_tz() function for time zone support." +msgstr "Utilizzare la funzione *_tz() per il supporto del fuso orario." + #: utils/adt/levenshtein.c:133 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" -msgstr "L'argomento levenshtein supera la lunghezza massima di %d caratteri" +msgstr "l'argomento levenshtein supera la lunghezza massima di %d caratteri" -#: utils/adt/like.c:183 utils/adt/selfuncs.c:5806 +#: utils/adt/like.c:160 +#, c-format +msgid "nondeterministic collations are not supported for LIKE" +msgstr "le regole di confronto non deterministiche non sono supportate per LIKE" + +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "non è stato possibile determinare quale ordinamento usare per ILIKE" -#: utils/adt/like_match.c:107 utils/adt/like_match.c:167 +#: utils/adt/like.c:201 +#, c-format +msgid "nondeterministic collations are not supported for ILIKE" +msgstr "le regole di confronto non deterministiche non sono supportate per ILIKE" + +#: utils/adt/like_match.c:108 utils/adt/like_match.c:168 #, c-format msgid "LIKE pattern must not end with escape character" msgstr "i pattern per LIKE non possono terminare con un carattere di escape" -#: utils/adt/like_match.c:292 utils/adt/regexp.c:702 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 #, c-format msgid "invalid escape string" msgstr "la stringa di escape non è valida" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:703 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 #, c-format msgid "Escape string must be empty or one character." msgstr "La stringa di escape deve essere vuota o contenere un solo carattere." -#: utils/adt/lockfuncs.c:664 +#: utils/adt/like_support.c:1014 +#, c-format +msgid "case insensitive matching not supported on type bytea" +msgstr "il confronto case insensitive sul tipo bytea non è supportato" + +#: utils/adt/like_support.c:1115 #, c-format -msgid "cannot use advisory locks during a parallel operation" -msgstr "non si possono usare advisory lock in un'operazione parallela" +msgid "regular-expression matching not supported on type bytea" +msgstr "il confronto con espressioni regolari sul tipo bytea non è supportato" -#: utils/adt/mac.c:102 +#: utils/adt/mac.c:101 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "ottetto non valido nel valore \"macaddr\": \"%s\"" @@ -21395,889 +23941,843 @@ msgstr "dato macaddr8 fuori dall'intervallo valido per convertire a 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 "Solo gli indirizzi che hanno valori FF ed FE nel 4º e 5º byte da sinistra, per esempio XX-XX-XX-ff-fe-XX-XX-XX, possono essere convertiti da macaddr8 a macaddr." -#: utils/adt/misc.c:239 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "il PID %d non è un processo del server PostgreSQL" -#: utils/adt/misc.c:290 -#, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "solo un superutente può annullare la query di un superutente" - -#: utils/adt/misc.c:295 -#, c-format -msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" -msgstr "occorre essere un membro del ruolo la cui query deve essere annullata o membro di pg_signal_backend" - -#: utils/adt/misc.c:314 -#, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "solo un superutente può terminare il processo di un superutente" - -#: utils/adt/misc.c:319 -#, c-format -msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" -msgstr "occorre essere un membro del ruolo la cui processo deve essere terminato o membro di pg_signal_backend" - -#: utils/adt/misc.c:336 -#, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "invio del segnale al postmaster fallito: %m" - -#: utils/adt/misc.c:355 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "solo i superutenti possono rotare i file di log con adminpack 1.0" - -#: utils/adt/misc.c:356 -#, c-format -msgid "Consider using pg_logfile_rotate(), which is part of core, instead." -msgstr "Considera l'uso di pg_logfile_rotate(), che è parte del core, invece." - -#: utils/adt/misc.c:361 utils/adt/misc.c:381 -#, c-format -msgid "rotation not possible because log collection not active" -msgstr "non è stato possibile eseguire la rotazione perché la raccolta dei log non è attiva" - -#: utils/adt/misc.c:418 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "il tablespace globale non contiene mai dei database" -#: utils/adt/misc.c:439 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u non è l'OID di un tablespace" -#: utils/adt/misc.c:626 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "non riservato" -#: utils/adt/misc.c:630 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "non riservato (non può essere una funzione o il nome di un tipo)" -#: utils/adt/misc.c:634 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "riservato (può essere una funzione o il nome di un tipo)" -#: utils/adt/misc.c:638 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "riservato" -#: utils/adt/misc.c:812 utils/adt/misc.c:826 utils/adt/misc.c:865 -#: utils/adt/misc.c:871 utils/adt/misc.c:877 utils/adt/misc.c:900 +#: utils/adt/misc.c:480 +msgid "can be bare label" +msgstr "può essere un'etichetta nuda" + +#: utils/adt/misc.c:485 +msgid "requires AS" +msgstr "richiede 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 "la stringa non è un identificatore valido: \"%s\"" -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "La stringa ha virgolette non chiuse." -#: utils/adt/misc.c:828 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "L'identificativo non può essere vuoto." -#: utils/adt/misc.c:867 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "L'identificativo prima del \".\" non è valido." -#: utils/adt/misc.c:873 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "L'identificativo dopo il \".\" non è valido." -#: utils/adt/misc.c:934 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "il formato di log \"%s\" non è supportato" -#: utils/adt/misc.c:935 +#: utils/adt/misc.c:854 +#, c-format +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "I formati di registro supportati sono \"stderr\", \"csvlog\" e \"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 "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "I formati supportati sono \"stderr\" e \"csvlog\"." +msgid "malformed multirange literal: \"%s\"" +msgstr "letterale multirange non corretto: \"%s\"" -#: utils/adt/nabstime.c:137 +#: utils/adt/multirangetypes.c:151 #, c-format -msgid "invalid time zone name: \"%s\"" -msgstr "il nome del fuso orario \"%s\" non è valido" +msgid "Missing left brace." +msgstr "Manca la parentesi graffa sinistra." -#: utils/adt/nabstime.c:482 utils/adt/nabstime.c:555 +#: utils/adt/multirangetypes.c:193 #, c-format -msgid "cannot convert abstime \"invalid\" to timestamp" -msgstr "non è possibile convertire il valore abstime \"invalid\" in timestamp" +msgid "Expected range start." +msgstr "Inizio intervallo previsto." -#: utils/adt/nabstime.c:782 +#: utils/adt/multirangetypes.c:263 #, c-format -msgid "invalid status in external \"tinterval\" value" -msgstr "lo stato nel valore del \"tinterval\" esterno non è valido" +msgid "Expected comma or end of multirange." +msgstr "Prevista virgola o fine di multiintervallo." -#: utils/adt/nabstime.c:852 +#: utils/adt/multirangetypes.c:976 #, c-format -msgid "cannot convert reltime \"invalid\" to interval" -msgstr "non è possibile convertire il valore reltime \"invalid\" in interval" +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "multirange non possono essere costruiti da array multidimensionali" -#: utils/adt/network.c:69 +#: utils/adt/multirangetypes.c:1002 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "i valori multirange non possono contenere membri null" + +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "il valore \"%s\" non è valido per cidr" -#: utils/adt/network.c:70 utils/adt/network.c:200 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "Il valore ha dei bit settati a destra della maschera." -#: utils/adt/network.c:111 utils/adt/network.c:592 utils/adt/network.c:617 -#: utils/adt/network.c:642 +#: 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 "formattazione del valore inet fallita: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:168 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "la famiglia di indirizzi nel valore \"%s\" esterno non è valida" #. translator: %s is inet or cidr -#: utils/adt/network.c:175 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "bit non validi nel valore esterno \"%s\"" #. translator: %s is inet or cidr -#: utils/adt/network.c:184 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "lunghezza non valida nel valore esterno \"%s\"" -#: utils/adt/network.c:199 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "valore \"cidr\" esterno non valido" -#: utils/adt/network.c:295 utils/adt/network.c:318 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "la lunghezza della maschera non è valida: %d" -#: utils/adt/network.c:660 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "formattazione del valore cidr fallita: %m" -#: utils/adt/network.c:893 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "non è possibile unire indirizzi di famiglie diverse" -#: utils/adt/network.c:1309 +#: utils/adt/network.c:1901 #, c-format msgid "cannot AND inet values of different sizes" msgstr "non è possibile eseguire l'AND fra valori di tipo inet di dimensione diversa" -#: utils/adt/network.c:1341 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "non è possibile eseguire l'OR fra valori di tipo inet di dimensione diversa" -#: utils/adt/network.c:1402 utils/adt/network.c:1478 +#: utils/adt/network.c:1994 utils/adt/network.c:2070 #, c-format msgid "result is out of range" msgstr "il risultato è fuori dall'intervallo consentito" -#: utils/adt/network.c:1443 +#: utils/adt/network.c:2035 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "non è possibile sottrarre valori di tipo inet di dimensione diversa" -#: utils/adt/numeric.c:830 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "il segno nel valore \"numeric\" esterno non è valido" -#: utils/adt/numeric.c:836 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "la scala nel valore \"numeric\" esterno non è valida" -#: utils/adt/numeric.c:845 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "una delle cifre nel valore \"numeric\" esterno non è valida" -#: utils/adt/numeric.c:1035 utils/adt/numeric.c:1049 +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "la precisione di NUMERIC (%d) deve essere compresa fra 1 e %d" -#: utils/adt/numeric.c:1040 +#: utils/adt/numeric.c:1262 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "il numero di cifre decimali di NUMERIC (%d) deve essere compreso fra 0 e la precisione %d" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "La scala NUMERICA %d deve essere compresa tra %d e %d" -#: utils/adt/numeric.c:1058 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificatore del tipo NUMERIC non valido" -#: utils/adt/numeric.c:1390 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "il valore d'inizio non può essere NaN" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1642 +#, c-format +msgid "start value cannot be infinity" +msgstr "il valore iniziale non può essere infinito" + +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "il valore di fine non può essere NaN" -#: utils/adt/numeric.c:1405 +#: utils/adt/numeric.c:1653 +#, c-format +msgid "stop value cannot be infinity" +msgstr "il valore di arresto non può essere infinito" + +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "la dimensione dell'intervallo non può essere NaN" -#: utils/adt/numeric.c:2736 utils/adt/numeric.c:5725 utils/adt/numeric.c:6170 -#: utils/adt/numeric.c:7878 utils/adt/numeric.c:8303 utils/adt/numeric.c:8417 -#: utils/adt/numeric.c:8490 +#: utils/adt/numeric.c:1670 #, c-format -msgid "value overflows numeric format" -msgstr "il valore causa un overflow nel formato numeric" +msgid "step size cannot be infinity" +msgstr "la dimensione del passo non può essere infinito" -#: utils/adt/numeric.c:3095 +#: utils/adt/numeric.c:3551 #, c-format -msgid "cannot convert NaN to integer" -msgstr "non è possibile convertire NaN in un integer" +msgid "factorial of a negative number is undefined" +msgstr "il fattoriale di un numero negativo non è definito" + +#: 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 "il valore causa un overflow nel formato numeric" -#: utils/adt/numeric.c:3161 +#: 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 "non è possibile convertire NaN in un bigint" +msgid "cannot convert NaN to %s" +msgstr "impossibile convertire NaN in %s" -#: utils/adt/numeric.c:3206 +#: 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 "non è possibile convertire NaN in uno smallint" +msgid "cannot convert infinity to %s" +msgstr "impossibile convertire l'infinito in %s" -#: utils/adt/numeric.c:3243 utils/adt/numeric.c:3314 +#: utils/adt/numeric.c:4571 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "non è possibile convertire infinity in numeric" +msgid "pg_lsn out of range" +msgstr "pg_lsn fuori portata" -#: utils/adt/numeric.c:6240 +#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 #, c-format msgid "numeric field overflow" msgstr "il campo numeric causa un overflow" -#: utils/adt/numeric.c:6241 +#: 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 "Un campo con precisione %d e %d cifre decimali deve arrotondarsi ad un valore assoluto inferiore a %s%d." -#: utils/adt/numutils.c:89 +#: utils/adt/numeric.c:7566 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "il valore \"%s\" è fuori dall'intervallo consentito per un intero a 8 bit" +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "Un campo con precisione %d, scala %d non può contenere un valore infinito." #: utils/adt/oid.c:290 #, c-format msgid "invalid oidvector data" msgstr "i dati nell'oidvector non sono validi" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:973 #, c-format msgid "requested character too large" msgstr "il carattere richiesto è troppo grande" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 +#: utils/adt/oracle_compat.c:1017 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "il carattere richiesto è troppo grande per la codifica: %d" +msgid "character number must be positive" +msgstr "il numero del carattere deve essere positivo" -#: utils/adt/oracle_compat.c:987 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "il carattere richiesto non è valido per la codifica: %d" - -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1021 #, c-format msgid "null character not permitted" msgstr "non sono consentiti caratteri nulli" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1039 utils/adt/oracle_compat.c:1092 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "carattere richiesto troppo grande per la codifica: %u" + +#: utils/adt/oracle_compat.c:1080 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "carattere richiesto non valido per la codifica: %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 "il valore percentile %g non è tra 0 e 1" -#: utils/adt/pg_locale.c:1034 +#: utils/adt/pg_locale.c:1228 #, c-format msgid "Apply system library package updates." msgstr "Applica gli aggiornamenti ai pacchetti di sistema." -#: utils/adt/pg_locale.c:1249 +#: 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 "apertura dell'ordinamento per il locale \"%s\" fallita: %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 non supportato in questo build" + +#: utils/adt/pg_locale.c:1494 #, c-format msgid "could not create locale \"%s\": %m" msgstr "creazione del locale \"%s\" fallita: %m" -#: utils/adt/pg_locale.c:1252 +#: utils/adt/pg_locale.c:1497 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Il sistema operativo non ha trovato dati di locale per il locale di nome \"%s\"." -#: utils/adt/pg_locale.c:1353 +#: utils/adt/pg_locale.c:1605 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "le collazioni con tipi diversi di ordinamento e ctype non sono supportati su questa piattaforma" -#: utils/adt/pg_locale.c:1362 +#: utils/adt/pg_locale.c:1614 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "fornitore di ordinamento LIBC non supportato su questa piattaforma" -#: utils/adt/pg_locale.c:1374 -#, c-format -msgid "collations with different collate and ctype values are not supported by ICU" -msgstr "ordinamenti con valori diversi di collate e ctype non sono supportati da ICU" - -#: utils/adt/pg_locale.c:1380 utils/adt/pg_locale.c:1468 +#: utils/adt/pg_locale.c:1649 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "apertura dell'ordinamento per il locale \"%s\" fallita: %s" - -#: utils/adt/pg_locale.c:1391 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU non supportato in questo build" - -#: utils/adt/pg_locale.c:1392 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "Occorre ricompilare PostgreSQL usando --with-icu." +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "la raccolta \"%s\" non ha una versione effettiva, ma è stata registrata una versione" -#: utils/adt/pg_locale.c:1412 -#, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "l'ordinamento \"%s\" non ha una versione, ma una versione è stata specificata" - -#: utils/adt/pg_locale.c:1419 +#: utils/adt/pg_locale.c:1655 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "la versione dell'ordinamento \"%s\" non combacia" -#: utils/adt/pg_locale.c:1421 +#: 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 "L'ordinamento nel database è stato creato usando la versione %s, ma il sistema operativo fornisce la versione %s." -#: utils/adt/pg_locale.c:1424 +#: 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 "Ricostruisci tutti gli oggetti che usano questo ordinamento ed esegui ALTER COLLATION %s REFRESH VERSION, oppure ricompila PostgreSQL con la versione giusta della libreria." -#: utils/adt/pg_locale.c:1508 +#: utils/adt/pg_locale.c:1731 #, c-format -msgid "could not open ICU converter for encoding \"%s\": %s" -msgstr "apertura del convertitore ICU per l'encoding \"%s\" fallita: %s" +msgid "could not load locale \"%s\"" +msgstr "impossibile caricare la lingua \"%s\"" + +#: utils/adt/pg_locale.c:1756 +#, c-format +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "impossibile ottenere la versione di confronto per la locale \"%s\": codice di errore %lu" + +#: utils/adt/pg_locale.c:1794 +#, c-format +msgid "encoding \"%s\" not supported by ICU" +msgstr "codifica \"%s\" non supportata da ICU" -#: utils/adt/pg_locale.c:1539 utils/adt/pg_locale.c:1548 +#: utils/adt/pg_locale.c:1801 #, c-format -msgid "ucnv_toUChars failed: %s" -msgstr "ucnv_toUChars fallito: %s" +msgid "could not open ICU converter for encoding \"%s\": %s" +msgstr "apertura del convertitore ICU per l'encoding \"%s\" fallita: %s" -#: utils/adt/pg_locale.c:1577 utils/adt/pg_locale.c:1586 +#: 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 "ucnv_fromUChars failed: %s" -msgstr "ucnv_fromUChars fallito: %s" +msgid "%s failed: %s" +msgstr "%s fallito: %s" -#: utils/adt/pg_locale.c:1758 +#: utils/adt/pg_locale.c:2179 #, c-format msgid "invalid multibyte character for locale" msgstr "carattere multibyte non valido per il locale" -#: utils/adt/pg_locale.c:1759 +#: utils/adt/pg_locale.c:2180 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Il locale LC_CTYPE del server probabilmente non è compatibile con la codifica del database." +#: utils/adt/pg_lsn.c:263 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "impossibile aggiungere NaN a pg_lsn" + +#: utils/adt/pg_lsn.c:297 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "impossibile sottrarre NaN da 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 "la funzione può essere richiamata solo quando il server è in modalità di aggiornamento binario" -#: utils/adt/pgstatfuncs.c:474 +#: utils/adt/pgstatfuncs.c:482 #, c-format msgid "invalid command name: \"%s\"" msgstr "nome di comando non valido: \"%s\"" -#: utils/adt/pseudotypes.c:247 +#: utils/adt/pgstatfuncs.c:2114 #, c-format -msgid "cannot accept a value of a shell type" -msgstr "non è possibile accettare un valore di un tipo non completamente definito" +msgid "unrecognized reset target: \"%s\"" +msgstr "destinazione di reset sconosciuta: \"%s\"" -#: utils/adt/pseudotypes.c:260 +#: utils/adt/pgstatfuncs.c:2115 #, c-format -msgid "cannot display a value of a shell type" -msgstr "non è possibile mostrare un valore di un tipo non completamente definito" +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "La destinazione deve essere \"archiver\", \"bgwriter\", \"recovery_prefetch\" o \"wal\"." -#: utils/adt/pseudotypes.c:350 utils/adt/pseudotypes.c:376 +#: utils/adt/pgstatfuncs.c:2193 #, c-format -msgid "cannot output a value of type %s" -msgstr "non è possibile emettere un valore del tipo %s" +msgid "invalid subscription OID %u" +msgstr "abbonamento non valido OID %u" -#: utils/adt/pseudotypes.c:403 +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" msgstr "non è possibile mostrare un valore del tipo %s" -#: utils/adt/rangetypes.c:405 +#: utils/adt/pseudotypes.c:321 +#, c-format +msgid "cannot accept a value of a shell type" +msgstr "non è possibile accettare un valore di un tipo non completamente definito" + +#: utils/adt/pseudotypes.c:331 +#, c-format +msgid "cannot display a value of a shell type" +msgstr "non è possibile mostrare un valore di un tipo non completamente definito" + +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "l'argomento flags del costruttore di un intervallo non può essere nullo" -#: utils/adt/rangetypes.c:992 +#: utils/adt/rangetypes.c:1003 #, c-format msgid "result of range difference would not be contiguous" msgstr "il risultato della differenza di intervalli non sarebbe continuo" -#: utils/adt/rangetypes.c:1053 +#: utils/adt/rangetypes.c:1064 #, c-format msgid "result of range union would not be contiguous" msgstr "il risultato dell'unione di intervalli non sarebbe continuo" -#: utils/adt/rangetypes.c:1597 +#: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "il limite inferiore dell'intervallo dev'essere minore o uguale del limite superiore" -#: utils/adt/rangetypes.c:1980 utils/adt/rangetypes.c:1993 -#: utils/adt/rangetypes.c:2007 +#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 utils/adt/rangetypes.c:2139 #, c-format msgid "invalid range bound flags" msgstr "flag di limiti dell'intervallo non valido" -#: utils/adt/rangetypes.c:1981 utils/adt/rangetypes.c:1994 -#: utils/adt/rangetypes.c:2008 +#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 utils/adt/rangetypes.c:2140 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "I valori validi sono \"[]\", \"[)\", \"(]\" e \"()\"." -#: utils/adt/rangetypes.c:2073 utils/adt/rangetypes.c:2090 -#: utils/adt/rangetypes.c:2103 utils/adt/rangetypes.c:2121 -#: utils/adt/rangetypes.c:2132 utils/adt/rangetypes.c:2176 -#: utils/adt/rangetypes.c:2184 +#: 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 "letterale di intervallo non definito correttamente: \"%s\"" -#: utils/adt/rangetypes.c:2075 +#: utils/adt/rangetypes.c:2207 #, c-format msgid "Junk after \"empty\" key word." msgstr "Dati spuri dopo la parola chiave \"empty\"." -#: utils/adt/rangetypes.c:2092 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Manca la parentesi aperta." -#: utils/adt/rangetypes.c:2105 +#: utils/adt/rangetypes.c:2237 #, c-format msgid "Missing comma after lower bound." msgstr "Manca la virgola dopo il limite inferiore." -#: utils/adt/rangetypes.c:2123 +#: utils/adt/rangetypes.c:2255 #, c-format msgid "Too many commas." msgstr "Troppe virgole." -#: utils/adt/rangetypes.c:2134 +#: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Caratteri spuri dopo la parentesi chiusa." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1424 utils/adt/varlena.c:4105 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, c-format msgid "regular expression failed: %s" msgstr "l'espressione regolare %s è fallita" -#: utils/adt/regexp.c:426 +#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 #, c-format -msgid "invalid regexp option: \"%c\"" -msgstr "l'opzione regexp \"%c\" non è valida" +msgid "invalid regular expression option: \"%.*s\"" +msgstr "opzione di espressione regolare non valida: \"%.*s\"" -#: utils/adt/regexp.c:866 +#: utils/adt/regexp.c:668 #, c-format -msgid "regexp_match does not support the global option" -msgstr "regexp_match non supporta l'opzione globale" +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "Se intendevi usare regexp_replace() con un parametro di avvio, esegui il cast del quarto argomento su intero in modo esplicito." -#: utils/adt/regexp.c:867 +#: 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:11869 utils/misc/guc.c:11903 #, c-format -msgid "Use the regexp_matches function instead." -msgstr "Usa la funzione regexp_matches." +msgid "invalid value for parameter \"%s\": %d" +msgstr "valore non valido per il parametro \"%s\": %d" -#: utils/adt/regexp.c:1049 +#: utils/adt/regexp.c:922 #, c-format -msgid "too many regular expression matches" -msgstr "troppe corrispondenze nell'espressione regolare" +msgid "SQL regular expression may not contain more than two escape-double-quote separators" +msgstr "L'espressione regolare SQL non può contenere più di due separatori di virgolette doppie di escape" -#: utils/adt/regexp.c:1244 +#. translator: %s is a SQL function name +#: 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 "regexp_split_to_table does not support the global option" -msgstr "regexp_split_to_table non supporta l'opzione globale" +msgid "%s does not support the \"global\" option" +msgstr "%s non supporta l'opzione \"globale\"" + +#: utils/adt/regexp.c:1298 +#, c-format +msgid "Use the regexp_matches function instead." +msgstr "Usa la funzione regexp_matches." -#: utils/adt/regexp.c:1297 +#: utils/adt/regexp.c:1486 #, c-format -msgid "regexp_split_to_array does not support the global option" -msgstr "regexp_split_to_array non supporta l'opzione globale" +msgid "too many regular expression matches" +msgstr "troppe corrispondenze nell'espressione regolare" -#: utils/adt/regproc.c:106 +#: utils/adt/regproc.c:105 #, c-format msgid "more than one function named \"%s\"" msgstr "più di una funzione si chiama \"%s\"" -#: utils/adt/regproc.c:524 +#: utils/adt/regproc.c:543 #, c-format msgid "more than one operator named %s" msgstr "più di un operatore si chiama %s" -#: utils/adt/regproc.c:691 utils/adt/regproc.c:732 gram.y:8182 -#, c-format -msgid "missing argument" -msgstr "argomento mancante" - -#: utils/adt/regproc.c:692 utils/adt/regproc.c:733 gram.y:8183 -#, c-format -msgid "Use NONE to denote the missing argument of a unary operator." -msgstr "Usa NONE per indicare l'argomento mancante in un operatore unario." - -#: utils/adt/regproc.c:696 utils/adt/regproc.c:737 utils/adt/regproc.c:1865 -#: utils/adt/ruleutils.c:9132 utils/adt/ruleutils.c:9300 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:9869 utils/adt/ruleutils.c:10038 #, c-format msgid "too many arguments" msgstr "troppi argomenti" -#: utils/adt/regproc.c:697 utils/adt/regproc.c:738 +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 #, c-format msgid "Provide two argument types for operator." msgstr "Fornisci due tipi di argomento per l'operatore." -#: utils/adt/regproc.c:1449 utils/adt/regproc.c:1473 utils/adt/regproc.c:1574 -#: utils/adt/regproc.c:1598 utils/adt/regproc.c:1700 utils/adt/regproc.c:1705 -#: utils/adt/varlena.c:3246 utils/adt/varlena.c:3251 +#: 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:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "la sintassi per il nome non è valida" -#: utils/adt/regproc.c:1763 +#: utils/adt/regproc.c:1953 #, c-format msgid "expected a left parenthesis" msgstr "era attesa un parentesi tonda aperta" -#: utils/adt/regproc.c:1779 +#: utils/adt/regproc.c:1969 #, c-format msgid "expected a right parenthesis" msgstr "era attesa un parentesi tonda chiusa" -#: utils/adt/regproc.c:1798 +#: utils/adt/regproc.c:1988 #, c-format msgid "expected a type name" msgstr "era atteso il nome di un tipo" -#: utils/adt/regproc.c:1830 +#: utils/adt/regproc.c:2020 #, c-format msgid "improper type name" msgstr "il nome del tipo non è corretto" -#: utils/adt/ri_triggers.c:308 utils/adt/ri_triggers.c:365 -#: utils/adt/ri_triggers.c:853 utils/adt/ri_triggers.c:1013 -#: utils/adt/ri_triggers.c:1198 utils/adt/ri_triggers.c:1419 -#: utils/adt/ri_triggers.c:1654 utils/adt/ri_triggers.c:1712 -#: utils/adt/ri_triggers.c:1817 utils/adt/ri_triggers.c:1997 gram.y:3817 -#, c-format -msgid "MATCH PARTIAL not yet implemented" -msgstr "il MATCH PARTIAL non è stato ancora implementato" - -#: utils/adt/ri_triggers.c:337 utils/adt/ri_triggers.c:2085 -#: utils/adt/ri_triggers.c:2842 +#: 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 "la INSERT o l'UPDATE sulla tabella \"%s\" viola il vincolo di chiave esterna \"%s\"" -#: utils/adt/ri_triggers.c:340 utils/adt/ri_triggers.c:2088 +#: 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 non consente l'uso di valori chiave nulli e non nulli insieme." -#: utils/adt/ri_triggers.c:2273 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "la funzione \"%s\" deve essere eseguita per un INSERT" -#: utils/adt/ri_triggers.c:2279 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "la funzione \"%s\" deve essere eseguita per un UPDATE" -#: utils/adt/ri_triggers.c:2285 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "la funzione \"%s\" deve essere eseguita per una DELETE" -#: utils/adt/ri_triggers.c:2308 +#: utils/adt/ri_triggers.c:2066 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "non ci sono elementi pg_constraint per il trigger \"%s\" sulla tabella \"%s\"" -#: utils/adt/ri_triggers.c:2310 +#: utils/adt/ri_triggers.c:2068 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Rimuovi questo trigger di integrità referenziale e relativi elementi collegati, poi esegui ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2689 +#: utils/adt/ri_triggers.c:2423 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "la query di integrità referenziale su \"%s\" dal vincolo \"%s\" su \"%s\" ha restituito un risultato inatteso" -#: utils/adt/ri_triggers.c:2693 +#: utils/adt/ri_triggers.c:2427 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Ciò è probabilmente dovuto ad una RULE che ha riscritto la query." -#: utils/adt/ri_triggers.c:2846 +#: utils/adt/ri_triggers.c:2588 +#, c-format +msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" +msgstr "la rimozione della partizione \"%s\" viola il vincolo di chiave esterna \"%s\"" + +#: 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 "La chiave (%s)=(%s) è ancora referenziata dalla tabella \"%s\"." + +#: utils/adt/ri_triggers.c:2602 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "La chiave (%s)=(%s) non è presente nella tabella \"%s\"." -#: utils/adt/ri_triggers.c:2849 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "La chiave non è presente nella tabella \"%s\"." -#: utils/adt/ri_triggers.c:2855 +#: utils/adt/ri_triggers.c:2611 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "l'istruzione UPDATE o DELETE sulla tabella \"%s\" viola il vincolo di chiave esterna \"%s\" sulla tabella \"%s\"" -#: utils/adt/ri_triggers.c:2860 -#, c-format -msgid "Key (%s)=(%s) is still referenced from table \"%s\"." -msgstr "La chiave (%s)=(%s) è ancora referenziata dalla tabella \"%s\"." - -#: utils/adt/ri_triggers.c:2863 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "La chiave è ancora referenziata dalla tabella \"%s\"." -#: utils/adt/rowtypes.c:103 utils/adt/rowtypes.c:481 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "l'input di un tipo composito anonimo non è implementato" -#: utils/adt/rowtypes.c:155 utils/adt/rowtypes.c:184 utils/adt/rowtypes.c:207 -#: utils/adt/rowtypes.c:215 utils/adt/rowtypes.c:267 utils/adt/rowtypes.c:275 +#: 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 "letterale record non corretto: \"%s\"" -#: utils/adt/rowtypes.c:156 +#: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." msgstr "Manca la parentesi tonda aperta." -#: utils/adt/rowtypes.c:185 +#: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." msgstr "Il numero di colonne è insufficiente." -#: utils/adt/rowtypes.c:268 +#: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." msgstr "Troppe colonne." -#: utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." msgstr "Sono presenti caratteri spuri dopo la parentesi chiusa." -#: utils/adt/rowtypes.c:530 +#: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "il numero di colonne non è corretto, %d invece di %d" -#: utils/adt/rowtypes.c:558 +#: utils/adt/rowtypes.c:574 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "il tipo di dati non è corretto, %u invece di %u" +msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "i dati binari hanno il tipo %u (%s) invece del previsto %u (%s) nella colonna del record %d" -#: utils/adt/rowtypes.c:619 +#: utils/adt/rowtypes.c:641 #, c-format msgid "improper binary format in record column %d" msgstr "il formato binario nella colonna %d del record non è corretto" -#: utils/adt/rowtypes.c:910 utils/adt/rowtypes.c:1154 utils/adt/rowtypes.c:1413 -#: utils/adt/rowtypes.c:1657 +#: 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 "non è possibile confrontare i tipi di colonne dissimili %s e %s alla colonna %d del record" -#: utils/adt/rowtypes.c:999 utils/adt/rowtypes.c:1225 utils/adt/rowtypes.c:1508 -#: utils/adt/rowtypes.c:1731 +#: 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 "non è possibile confrontare tipi di record con diverso numero di colonne" -#: utils/adt/ruleutils.c:4823 +#: utils/adt/ruleutils.c:2705 #, c-format -msgid "rule \"%s\" has unsupported event type %d" -msgstr "la regola \"%s\" ha un tipo di evento non supportato %d" +msgid "input is a query, not an expression" +msgstr "input è una query, non un'espressione" -#: utils/adt/selfuncs.c:5791 +#: utils/adt/ruleutils.c:2717 #, c-format -msgid "case insensitive matching not supported on type bytea" -msgstr "il confronto case insensitive sul tipo bytea non è supportato" +msgid "expression contains variables of more than one relation" +msgstr "espressione contiene variabili di più di una relazione" -#: utils/adt/selfuncs.c:5893 +#: utils/adt/ruleutils.c:2724 #, c-format -msgid "regular-expression matching not supported on type bytea" -msgstr "il confronto con espressioni regolari sul tipo bytea non è supportato" +msgid "expression contains variables" +msgstr "l'espressione contiene variabili" + +#: utils/adt/ruleutils.c:5247 +#, c-format +msgid "rule \"%s\" has unsupported event type %d" +msgstr "la regola \"%s\" ha un tipo di evento non supportato %d" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "la precisione di TIMESTAMP(%d)%s non può essere negativa" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:116 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisione di TIMESTAMP(%d)%s è stata ridotta al massimo consentito %d" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:416 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12893 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp fuori dall'intervallo consentito: \"%s\"" -#: utils/adt/timestamp.c:194 utils/adt/timestamp.c:434 -#: utils/adt/timestamp.c:941 -#, c-format -msgid "date/time value \"%s\" is no longer supported" -msgstr "il valore \"%s\" per i tipi date/time non è più supportato" - -#: utils/adt/timestamp.c:362 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "la precisione di timestamp(%d) deve essere compresa fra %d e %d" -#: utils/adt/timestamp.c:484 -#, c-format -msgid "invalid input syntax for numeric time zone: \"%s\"" -msgstr "sintassi di input non valida per il fuso orario numerico: \"%s\"" - -#: utils/adt/timestamp.c:486 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Il primo carattere dei fusi orari numerici deve essere \"-\" o \"+\"." -#: utils/adt/timestamp.c:499 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "fuso orario numerico \"%s\" fuori dall'intervallo consentito" -#: 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 fuori dall'intervallo consentito: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "il timestamp non può essere 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 fuori dall'intervallo consentito: \"%g\" " - -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1505 -#: utils/adt/timestamp.c:1918 utils/adt/timestamp.c:3013 -#: utils/adt/timestamp.c:3018 utils/adt/timestamp.c:3023 -#: utils/adt/timestamp.c:3073 utils/adt/timestamp.c:3080 -#: utils/adt/timestamp.c:3087 utils/adt/timestamp.c:3107 -#: utils/adt/timestamp.c:3114 utils/adt/timestamp.c:3121 -#: utils/adt/timestamp.c:3151 utils/adt/timestamp.c:3159 -#: utils/adt/timestamp.c:3203 utils/adt/timestamp.c:3630 -#: utils/adt/timestamp.c:3755 utils/adt/timestamp.c:4140 -#, c-format -msgid "interval out of range" -msgstr "il valore di interval è fuori dall'intervallo consentito" +msgstr "timestamp fuori dall'intervallo consentito: \"%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 "il modificatore di tipo su INTERVAL non è valido" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "la precisione di INTERVAL(%d) non può essere negativa" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "la precisione di INTERVAL(%d) è stata ridotta al massimo consentito %d" -#: utils/adt/timestamp.c:1462 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "la precisione di INTERVAL(%d) deve essere compresa fra %d e %d" -#: utils/adt/timestamp.c:2614 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "non è possibile sottrarre valori infiniti di TIMESTAMP" -#: utils/adt/timestamp.c:3883 utils/adt/timestamp.c:4400 -#: utils/adt/timestamp.c:4567 utils/adt/timestamp.c:4588 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "unità \"%s\" di timestamp non supportata" - -#: utils/adt/timestamp.c:3897 utils/adt/timestamp.c:4354 -#: utils/adt/timestamp.c:4598 -#, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "unità \"%s\" di timestamp non riconosciuta" - -#: utils/adt/timestamp.c:4029 utils/adt/timestamp.c:4395 -#: utils/adt/timestamp.c:4768 utils/adt/timestamp.c:4790 -#, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "unità \"%s\" di timestamp with time zone non supportata" - -#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4349 -#: utils/adt/timestamp.c:4799 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "unità \"%s\" di timestamp with time zone non riconosciuta" +msgid "origin out of range" +msgstr "origine fuori portata" -#: utils/adt/timestamp.c:4127 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "le unità di intervallo \"%s\" non sono supportate perché generalmente i mesi hanno settimane frazionali" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "i timestamp non possono essere raggruppati in intervalli contenenti mesi o anni" -#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4893 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format -msgid "interval units \"%s\" not supported" -msgstr "unità \"%s\" di interval non supportata" +msgid "stride must be greater than zero" +msgstr "il passo deve essere maggiore di zero" -#: utils/adt/timestamp.c:4149 utils/adt/timestamp.c:4916 +#: utils/adt/timestamp.c:4399 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "unità \"%s\" di interval non riconosciuta" +msgid "Months usually have fractional weeks." +msgstr "I mesi di solito hanno settimane frazionarie." #: utils/adt/trigfuncs.c:42 #, c-format @@ -22299,48 +24799,47 @@ msgstr "la funzione trigger suppress_redundant_updates deve essere invocata prim msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "la funzione trigger suppress_redundant_updates deve essere invocata su ogni riga" -#: utils/adt/tsgistidx.c:100 +#: utils/adt/tsgistidx.c:92 #, c-format msgid "gtsvector_in not implemented" msgstr "la funzione gtsvector_in non è implementata" -#: 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 "la distanza nell'operatore di frase non può essere maggiore di %d" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "l'operatore distanza nella frase deve essere un valore intero compreso tra zero e %d inclusi" -#: 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 "errore di sintassi in tsquery: \"%s\"" -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:330 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "non ci sono operandi in tsquery: \"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:534 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "il valore in tsquery è troppo grande: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:539 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "l'operando in tsquery è troppo lungo: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:567 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "la parola in tsquery è troppo lunga: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:835 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "la query di ricerca di testo non contiene alcun lessema: \"%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 troppo grande" @@ -22350,98 +24849,97 @@ msgstr "tsquery troppo grande" msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "la query di ricerca di testo contiene solo stop word o non contiene lessemi, ignorata" -#: utils/adt/tsquery_op.c:123 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "la distanza nell'operatore di frase deve essere non negativa ed inferiore a %d" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" msgstr "la query ts_rewrite deve restituire due colonne tsquery" -#: utils/adt/tsrank.c:413 +#: utils/adt/tsrank.c:412 #, c-format msgid "array of weight must be one-dimensional" msgstr "l'array dei pesi deve avere una sola dimensione" -#: utils/adt/tsrank.c:418 +#: utils/adt/tsrank.c:417 #, c-format msgid "array of weight is too short" msgstr "l'array dei pesi è troppo corto" -#: utils/adt/tsrank.c:423 +#: utils/adt/tsrank.c:422 #, c-format msgid "array of weight must not contain nulls" msgstr "l'array dei pesi non può contenere valori nulli" -#: utils/adt/tsrank.c:432 utils/adt/tsrank.c:869 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "il peso è fuori dall'intervallo consentito" -#: utils/adt/tsvector.c:214 +#: utils/adt/tsvector.c:215 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "la lunghezza della parola (%ld byte) eccede il massimo (%ld byte)" -#: utils/adt/tsvector.c:221 +#: utils/adt/tsvector.c:222 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "la lunghezza della stringa (%ld byte) eccede il massimo per un tsvector (%ld byte)" -#: utils/adt/tsvector_op.c:323 utils/adt/tsvector_op.c:610 -#: utils/adt/tsvector_op.c:778 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "l'array di lessemi non può contenere null" -#: utils/adt/tsvector_op.c:853 +#: utils/adt/tsvector_op.c:776 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "l'array lesseme non può contenere stringhe vuote" + +#: utils/adt/tsvector_op.c:846 #, c-format msgid "weight array may not contain nulls" msgstr "l'array dei pesi non può contenere null" -#: utils/adt/tsvector_op.c:877 +#: utils/adt/tsvector_op.c:870 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "peso non riconosciuto: \"%c\"" -#: utils/adt/tsvector_op.c:2314 +#: utils/adt/tsvector_op.c:2431 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "la query ts_stat deve restituire una colonna tsvector" -#: utils/adt/tsvector_op.c:2496 +#: utils/adt/tsvector_op.c:2620 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "la colonna tsvector \"%s\" non esiste" -#: utils/adt/tsvector_op.c:2503 +#: utils/adt/tsvector_op.c:2627 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "la colonna \"%s\" non è di tipo tsvector" -#: utils/adt/tsvector_op.c:2515 +#: utils/adt/tsvector_op.c:2639 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "la configurazione della colonna \"%s\" non esiste" -#: utils/adt/tsvector_op.c:2521 +#: utils/adt/tsvector_op.c:2645 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "la colonna \"%s\" non è di tipo regconfig" -#: utils/adt/tsvector_op.c:2528 +#: utils/adt/tsvector_op.c:2652 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "la colonna di configurazione \"%s\" non può essere nulla" -#: utils/adt/tsvector_op.c:2541 +#: utils/adt/tsvector_op.c:2665 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "la configurazione di ricerca di testo \"%s\" deve avere uno schema" -#: utils/adt/tsvector_op.c:2566 +#: utils/adt/tsvector_op.c:2690 #, c-format msgid "column \"%s\" is not of a character type" msgstr "la colonna \"%s\" non è di tipo carattere" @@ -22461,3691 +24959,3529 @@ msgstr "non c'è alcun carattere sottoposto ad escape: \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "le informazioni di posizione nel tsvector sono errate: \"%s\"" -#: utils/adt/txid.c:135 -#, c-format -msgid "transaction ID %s is in the future" -msgstr "l'ID di transazione %s è nel futuro" - -#: utils/adt/txid.c:624 +#: utils/adt/uuid.c:413 #, c-format -msgid "invalid external txid_snapshot data" -msgstr "dati txid_snapshot esterni non validi" +msgid "could not generate random values" +msgstr "non è stato possibile generare valori casuali" -#: utils/adt/varbit.c:59 utils/adt/varchar.c:51 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "la lunghezza per il tipo %s dev'essere almeno 1" -#: utils/adt/varbit.c:64 utils/adt/varchar.c:55 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "la lunghezza per il tipo %s non può essere superiore a %d" -#: utils/adt/varbit.c:165 utils/adt/varbit.c:477 utils/adt/varbit.c:974 +#: 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 "la lunghezza della stringa di bit supera il massimo consentito (%d)" -#: utils/adt/varbit.c:179 utils/adt/varbit.c:322 utils/adt/varbit.c:379 +#: 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 "la lunghezza della stringa di bit %d non corrisponde a quella del tipo bit(%d)" -#: utils/adt/varbit.c:201 utils/adt/varbit.c:513 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" non è una cifra binaria valida" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" non è una cifra binaria valida" -#: utils/adt/varbit.c:226 utils/adt/varbit.c:538 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" non è una cifra esadecimale valida" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" non è una cifra esadecimale valida" -#: utils/adt/varbit.c:313 utils/adt/varbit.c:629 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "la lunghezza della stringa esterna di bit non è valida" -#: utils/adt/varbit.c:491 utils/adt/varbit.c:638 utils/adt/varbit.c:732 +#: 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 "la stringa di bit è troppo lunga per il tipo bit varying(%d)" -#: utils/adt/varbit.c:1067 utils/adt/varbit.c:1169 utils/adt/varlena.c:841 -#: utils/adt/varlena.c:905 utils/adt/varlena.c:1049 utils/adt/varlena.c:2912 -#: utils/adt/varlena.c:2979 +#: 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:3309 utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "non è consentita una stringa con lunghezza negativa" -#: utils/adt/varbit.c:1226 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "non è possibile eseguire l'AND fra stringhe di bit di dimensioni diverse" -#: utils/adt/varbit.c:1268 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "non è possibile eseguire l'OR fra stringhe di bit di dimensioni diverse" -#: utils/adt/varbit.c:1315 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "non è possibile eseguire lo XOR fra stringhe di bit di dimensioni diverse" -#: utils/adt/varbit.c:1803 utils/adt/varbit.c:1861 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "l'indice %d è fuori dall'intervallo valido (0..%d)" -#: utils/adt/varbit.c:1812 utils/adt/varlena.c:3170 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "il nuovo bit deve essere 0 o 1" -#: utils/adt/varchar.c:155 utils/adt/varchar.c:308 +#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 #, c-format msgid "value too long for type character(%d)" msgstr "il valore è troppo lungo per il tipo character(%d)" -#: utils/adt/varchar.c:470 utils/adt/varchar.c:623 +#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 #, c-format msgid "value too long for type character varying(%d)" msgstr "il valore è troppo lungo per il tipo character varying(%d)" -#: utils/adt/varlena.c:1415 utils/adt/varlena.c:1880 +#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "non è stato possibile determinare quale ordinamento usare per la comparazione tra stringhe" -#: utils/adt/varlena.c:1472 utils/adt/varlena.c:1485 +#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 +#, c-format +msgid "nondeterministic collations are not supported for substring searches" +msgstr "le regole di confronto non deterministiche non sono supportate per le ricerche di sottostringhe" + +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "conversione della stringa in UTF-16 fallita: codice errore %lu" -#: utils/adt/varlena.c:1500 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "comparazione delle stringhe Unicode fallita: %m" -#: utils/adt/varlena.c:1555 utils/adt/varlena.c:2176 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "ordinamento fallito: %s" -#: utils/adt/varlena.c:2394 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "generazione della chiave di ordinamento fallita: %s" -#: utils/adt/varlena.c:3056 utils/adt/varlena.c:3087 utils/adt/varlena.c:3122 -#: utils/adt/varlena.c:3158 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "l'indice %d è fuori dall'intervallo valido, 0..%d" -#: utils/adt/varlena.c:4201 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 +#, c-format +msgid "index %lld out of valid range, 0..%lld" +msgstr "indice %lld fuori intervallo valido, 0..%lld" + +#: utils/adt/varlena.c:4640 #, c-format -msgid "field position must be greater than zero" -msgstr "il campo deve essere maggiore di zero" +msgid "field position must not be zero" +msgstr "la posizione del campo non deve essere zero" -#: utils/adt/varlena.c:5080 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "specifica di tipo per format() non terminata" -#: utils/adt/varlena.c:5081 utils/adt/varlena.c:5215 utils/adt/varlena.c:5336 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Per un singolo \"%%\" usa \"%%%%\"." -#: utils/adt/varlena.c:5213 utils/adt/varlena.c:5334 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format -msgid "unrecognized format() type specifier \"%c\"" -msgstr "specifica di tipo per format() \"%c\" non riconosciuta" +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "identificatore di tipo format() non riconosciuto \"%.*s\"" -#: utils/adt/varlena.c:5226 utils/adt/varlena.c:5283 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "numero di argomenti non sufficiente per format()" -#: utils/adt/varlena.c:5379 utils/adt/varlena.c:5561 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "il numero è al di fuori dell'intervallo consentito" -#: utils/adt/varlena.c:5442 utils/adt/varlena.c:5470 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "il formato specifica l'argomento 0, ma gli argomenti sono numerati a partire da 1" -#: utils/adt/varlena.c:5463 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "la posizione dell'argomento di larghezza deve finire con \"$\"" -#: utils/adt/varlena.c:5508 +#: utils/adt/varlena.c:6088 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "i valori vuoti non possono essere formattati come un identificativo SQL" -#: utils/adt/windowfuncs.c:243 +#: utils/adt/varlena.c:6214 +#, c-format +msgid "Unicode normalization can only be performed if server encoding is UTF8" +msgstr "La normalizzazione Unicode può essere eseguita solo se la codifica del server è UTF8" + +#: utils/adt/varlena.c:6227 +#, c-format +msgid "invalid normalization form: %s" +msgstr "modulo di normalizzazione non valido: %s" + +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "punto di codice Unicode non valido: %04X" + +#: utils/adt/varlena.c:6530 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "Gli escape Unicode devono essere \\XXXX, \\+XXXXXX, \\uXXXX o \\UXXXXXXXX." + +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "l'argomento della funzione ntile deve essere maggiore di zero" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:528 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "l'argomento della funzione nth_value deve essere maggiore di zero" -#: utils/adt/xml.c:220 +#: utils/adt/xid8funcs.c:117 +#, c-format +msgid "transaction ID %llu is in the future" +msgstr "l'ID transazione %llu è nel futuro" + +#: utils/adt/xid8funcs.c:547 +#, c-format +msgid "invalid external pg_snapshot data" +msgstr "dati pg_snapshot esterni non validi" + +#: utils/adt/xml.c:222 #, c-format msgid "unsupported XML feature" msgstr "caratteristica XML non supportata" -#: utils/adt/xml.c:221 +#: utils/adt/xml.c:223 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Per questa funzionalità è necessario che il server sia compilato con il supporto a libxml." -#: utils/adt/xml.c:222 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "Occorre configurare PostgreSQL con l'opzione --with-libxml e ricompilarlo." - -#: utils/adt/xml.c:241 utils/mb/mbutils.c:512 +#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "nome di codifica non valido \"%s\"" -#: utils/adt/xml.c:484 utils/adt/xml.c:489 +#: utils/adt/xml.c:485 utils/adt/xml.c:490 #, c-format msgid "invalid XML comment" msgstr "commento XML non valido" -#: utils/adt/xml.c:618 +#: utils/adt/xml.c:619 #, c-format msgid "not an XML document" msgstr "non è un documento XML" -#: utils/adt/xml.c:777 utils/adt/xml.c:800 +#: utils/adt/xml.c:778 utils/adt/xml.c:801 #, c-format msgid "invalid XML processing instruction" msgstr "istruzione di elaborazione XML non valida" -#: utils/adt/xml.c:778 +#: utils/adt/xml.c:779 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "Il nome di destinazione di un'istruzione di elaborazione XML non può essere \"%s\"." -#: utils/adt/xml.c:801 +#: utils/adt/xml.c:802 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "Un'istruzione di elaborazione XML non può contenere \"?>\"." -#: utils/adt/xml.c:880 +#: utils/adt/xml.c:881 #, c-format msgid "xmlvalidate is not implemented" msgstr "la funzione xmlvalidate non è implementata" -#: utils/adt/xml.c:959 +#: utils/adt/xml.c:960 #, c-format msgid "could not initialize XML library" msgstr "inizializzazione della libreria XML fallita" -#: utils/adt/xml.c:960 +#: utils/adt/xml.c:961 #, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "La libreria libxml2 ha un tipo char non compatibile: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 ha un tipo di carattere incompatibile: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1046 +#: utils/adt/xml.c:1047 #, c-format msgid "could not set up XML error handler" msgstr "impostazione del gestore di errori XML fallita" -#: utils/adt/xml.c:1047 +#: 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 "Questo vuol dire probabilmente che la versione di libxml2 in uso non è compatibile con i file di header libxml2 con cui PostgreSQL è stato compilato." -#: utils/adt/xml.c:1797 +#: utils/adt/xml.c:1935 msgid "Invalid character value." msgstr "Valore di carattere non valido." -#: utils/adt/xml.c:1800 +#: utils/adt/xml.c:1938 msgid "Space required." msgstr "È necessario uno spazio." -#: utils/adt/xml.c:1803 +#: utils/adt/xml.c:1941 msgid "standalone accepts only 'yes' or 'no'." -msgstr "Solo 'yes' o 'no' sono accettati da standalone." +msgstr "solo 'yes' o 'no' sono accettati da standalone." -#: utils/adt/xml.c:1806 +#: utils/adt/xml.c:1944 msgid "Malformed declaration: missing version." msgstr "La dichiarazione non è definita correttamente: manca la versione." -#: utils/adt/xml.c:1809 +#: utils/adt/xml.c:1947 msgid "Missing encoding in text declaration." msgstr "Manca la codifica nella dichiarazione del testo." -#: utils/adt/xml.c:1812 +#: utils/adt/xml.c:1950 msgid "Parsing XML declaration: '?>' expected." msgstr "Durante l'analisi XML è stato riscontrato che manca '?>'." -#: utils/adt/xml.c:1815 +#: utils/adt/xml.c:1953 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Codice di errore di libxml sconosciuto: %d." -#: utils/adt/xml.c:2090 +#: utils/adt/xml.c:2210 #, c-format msgid "XML does not support infinite date values." msgstr "XML non supporta i valori infiniti per il tipo date." -#: utils/adt/xml.c:2112 utils/adt/xml.c:2139 +#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML non supporta i valori infiniti per il tipo timestamp." -#: utils/adt/xml.c:2551 +#: utils/adt/xml.c:2675 #, c-format msgid "invalid query" msgstr "query non valida" -#: utils/adt/xml.c:3874 +#: utils/adt/xml.c:4015 #, c-format msgid "invalid array for XML namespace mapping" msgstr "l'array per il mapping del namespace XML non è valido" -#: utils/adt/xml.c:3875 +#: utils/adt/xml.c:4016 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "L'array deve avere due dimensioni e la lunghezza del secondo asse deve essere pari a 2." -#: utils/adt/xml.c:3899 +#: utils/adt/xml.c:4040 #, c-format msgid "empty XPath expression" msgstr "l'espressione XPath è vuota" -#: utils/adt/xml.c:3951 +#: utils/adt/xml.c:4092 #, c-format msgid "neither namespace name nor URI may be null" msgstr "né il nome del namespace né l'URI possono essere nulli" -#: utils/adt/xml.c:3958 +#: utils/adt/xml.c:4099 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "registrazione del namespace XML con nome \"%s\" ed URI \"%s\" fallita" -#: utils/adt/xml.c:4309 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "il namespace DEFAULT non è supportato" -#: utils/adt/xml.c:4338 +#: utils/adt/xml.c:4479 #, c-format msgid "row path filter must not be empty string" msgstr "il percorso del filtro di riga non può essere vuoto" -#: utils/adt/xml.c:4369 +#: utils/adt/xml.c:4510 #, c-format msgid "column path filter must not be empty string" msgstr "il percorso del filtro di colonna non può essere vuoto" -#: utils/adt/xml.c:4555 +#: utils/adt/xml.c:4654 #, c-format msgid "more than one value returned by column XPath expression" msgstr "l'espressione XPath ha restituito più di un valore" -#: utils/cache/lsyscache.c:2654 utils/cache/lsyscache.c:2687 -#: utils/cache/lsyscache.c:2720 utils/cache/lsyscache.c:2753 +#: utils/cache/lsyscache.c:1042 +#, c-format +msgid "cast from type %s to type %s does not exist" +msgstr "la conversione dal tipo %s al tipo %s non esiste" + +#: 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 "il tipo %s non è completamente definito" -#: utils/cache/lsyscache.c:2659 +#: utils/cache/lsyscache.c:2849 #, c-format msgid "no input function available for type %s" msgstr "nessuna funzione di input disponibile per il tipo %s" -#: utils/cache/lsyscache.c:2692 +#: utils/cache/lsyscache.c:2882 #, c-format msgid "no output function available for type %s" msgstr "nessuna funzione di output disponibile per il tipo %s" -#: utils/cache/partcache.c:202 +#: utils/cache/partcache.c:215 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "alla classe di operatori \"%s\" del metodi di accesso %s manca la funzione di supporto %d per il tipo %s" -#: utils/cache/plancache.c:723 +#: utils/cache/plancache.c:720 #, c-format msgid "cached plan must not change result type" msgstr "il cached plan non deve cambiare il tipo del risultato" -#: utils/cache/relcache.c:5824 +#: utils/cache/relcache.c:3732 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "valore heap relfilenode non impostato in modalità di aggiornamento binario" + +#: utils/cache/relcache.c:3740 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "richiesta imprevista per il nuovo relfilenode in modalità di aggiornamento binario" + +#: utils/cache/relcache.c:6451 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "creazione del file di inizializzazione della cache delle relazioni \"%s\" fallita: %m" -#: utils/cache/relcache.c:5826 +#: utils/cache/relcache.c:6453 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Proseguo in ogni caso, ma c'è qualcosa che non funziona." -#: utils/cache/relcache.c:6180 +#: utils/cache/relcache.c:6775 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "rimozione del file di cache \"%s\" fallita: %m" -#: utils/cache/relmapper.c:513 +#: utils/cache/relmapper.c:590 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "non è possibile eseguire PREPARE in una transazione che ha modificato la mappa delle relazioni" -#: utils/cache/relmapper.c:655 utils/cache/relmapper.c:755 -#, c-format -msgid "could not open relation mapping file \"%s\": %m" -msgstr "apertura del file della mappa delle relazioni \"%s\" fallita: %m" - -#: utils/cache/relmapper.c:669 -#, c-format -msgid "could not read relation mapping file \"%s\": %m" -msgstr "lettura del file della mappa delle relazioni \"%s\" fallita: %m" - -#: utils/cache/relmapper.c:680 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "il file della mappa delle relazioni \"%s\" contiene dati non validi" -#: utils/cache/relmapper.c:690 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "il file della mappa delle relazioni \"%s\" ha un checksum non valido" -#: utils/cache/relmapper.c:789 -#, c-format -msgid "could not write to relation mapping file \"%s\": %m" -msgstr "scrittura nel file della mappa delle relazioni \"%s\" fallita: %m" - -#: utils/cache/relmapper.c:804 -#, c-format -msgid "could not fsync relation mapping file \"%s\": %m" -msgstr "fsync del file della mappa delle relazioni \"%s\" fallito: %m" - -#: utils/cache/relmapper.c:811 -#, c-format -msgid "could not close relation mapping file \"%s\": %m" -msgstr "chiusura del file della mappa delle relazioni \"%s\" fallita: %m" - -#: utils/cache/typcache.c:1623 utils/fmgr/funcapi.c:435 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:532 #, c-format msgid "record type has not been registered" msgstr "il tipo del record non è stato registrato" -#: utils/error/assert.c:34 +#: utils/error/assert.c:39 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: argomenti non corretti\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: Condizione eccezionale: argomenti errati nel PID %d\n" -#: utils/error/assert.c:37 +#: utils/error/assert.c:42 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", File: \"%s\", Linea: %d)\n" +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "TRAP: %s(\"%s\", File: \"%s\", Riga: %d, PID: %d)\n" -#: utils/error/elog.c:322 utils/error/elog.c:1306 +#: utils/error/elog.c:404 #, c-format -msgid "error occurred at %s:%d before error message processing is available\n" -msgstr "l'errore è avvenuto a %s:%d prima che fosse possibile processare i messaggi d'errore\n" +msgid "error occurred before error message processing is available\n" +msgstr "errore verificatosi prima che l'elaborazione del messaggio di errore fosse disponibile\n" -#: utils/error/elog.c:1889 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "riapertura del file \"%s\" come stderr fallita: %m" -#: utils/error/elog.c:1902 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "riapertura del file \"%s\" come stdout fallita: %m" -#: utils/error/elog.c:2394 utils/error/elog.c:2411 utils/error/elog.c:2427 +#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 msgid "[unknown]" msgstr "[sconosciuto]" -#: utils/error/elog.c:2887 utils/error/elog.c:3190 utils/error/elog.c:3298 +#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 msgid "missing error text" msgstr "testo dell'errore mancante" -#: utils/error/elog.c:2890 utils/error/elog.c:2893 utils/error/elog.c:3301 -#: utils/error/elog.c:3304 +#: utils/error/elog.c:2840 utils/error/elog.c:2843 #, c-format msgid " at character %d" msgstr " al carattere %d" -#: utils/error/elog.c:2903 utils/error/elog.c:2910 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DETTAGLI: " -#: utils/error/elog.c:2917 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "SUGGERIMENTO: " -#: utils/error/elog.c:2924 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "QUERY: " -#: utils/error/elog.c:2931 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "CONTESTO: " -#: utils/error/elog.c:2941 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "POSIZIONE: %s, %s:%d\n" -#: utils/error/elog.c:2948 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "POSIZIONE: %s:%d\n" -#: utils/error/elog.c:2962 +#: utils/error/elog.c:2905 +msgid "BACKTRACE: " +msgstr "BACKTRACE: " + +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "ISTRUZIONE: " -#. translator: This string will be truncated at 47 -#. characters expanded. -#: utils/error/elog.c:3419 -#, c-format -msgid "operating system error %d" -msgstr "errore del sistema operativo %d" - -#: utils/error/elog.c:3617 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3621 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3624 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3627 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "NOTIFICA" -#: utils/error/elog.c:3630 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "ATTENZIONE" -#: utils/error/elog.c:3633 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ERRORE" -#: utils/error/elog.c:3636 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "FATALE" -#: utils/error/elog.c:3639 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "PANICO" -#: utils/fmgr/dfmgr.c:121 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "funzione \"%s\" non trovata nel file \"%s\"" -#: utils/fmgr/dfmgr.c:239 +#: utils/fmgr/dfmgr.c:247 #, c-format msgid "could not load library \"%s\": %s" msgstr "caricamento della libreria \"%s\" fallito: %s" -#: utils/fmgr/dfmgr.c:271 +#: utils/fmgr/dfmgr.c:279 #, c-format msgid "incompatible library \"%s\": missing magic block" msgstr "libreria \"%s\" incompatibile: manca il magic block" -#: utils/fmgr/dfmgr.c:273 +#: utils/fmgr/dfmgr.c:281 #, c-format msgid "Extension libraries are required to use the PG_MODULE_MAGIC macro." msgstr "Le librerie di estensione devono usare la macro PG_MODULE_MAGIC." -#: utils/fmgr/dfmgr.c:319 +#: utils/fmgr/dfmgr.c:327 #, c-format msgid "incompatible library \"%s\": version mismatch" msgstr "libreria incompatibile \"%s\": versione non corrispondente" -#: utils/fmgr/dfmgr.c:321 +#: utils/fmgr/dfmgr.c:329 #, c-format msgid "Server is version %d, library is version %s." msgstr "La versione del server è %d, quella della libreria è %s." -#: utils/fmgr/dfmgr.c:338 +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "libreria incompatibile \"%s\": mancata corrispondenza ABI" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "Il server ha ABI \"%s\", la libreria ha \"%s\"." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "Il server ha FUNC_MAX_ARGS = %d, la libreria ha %d." -#: utils/fmgr/dfmgr.c:347 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "Il server ha INDEX_MAX_KEYS = %d, la libreria ha %d." -#: utils/fmgr/dfmgr.c:356 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "Il server ha NAMEDATALEN = %d, la libreria %d." -#: utils/fmgr/dfmgr.c:365 -#, c-format -msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." -msgstr "Il server ha FLOAT4PASSBYVAL = %s, la libreria %s." - -#: utils/fmgr/dfmgr.c:374 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "Il server ha FLOAT8PASSBYVAL = %s, la libreria %s." -#: utils/fmgr/dfmgr.c:381 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "Il magic block ha una lunghezza imprevista o una differenza di allineamento." -#: utils/fmgr/dfmgr.c:384 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "la libreria \"%s\" non è compatibile: magic block non corrispondente" -#: utils/fmgr/dfmgr.c:548 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "l'accesso alla libreria \"%s\" non è consentito" -#: utils/fmgr/dfmgr.c:574 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "nome della macro non valido nel percorso della libreria dinamica: %s" -#: utils/fmgr/dfmgr.c:614 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "componente di lunghezza zero nel parametro \"dynamic_library_path\"" -#: utils/fmgr/dfmgr.c:633 +#: utils/fmgr/dfmgr.c:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "il componente nel parametro \"dynamic_library_path\" non è un percorso assoluto." -#: utils/fmgr/fmgr.c:236 +#: utils/fmgr/fmgr.c:238 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "la funzione interna \"%s\" non è nella tabella interna di lookup" -#: utils/fmgr/fmgr.c:485 +#: utils/fmgr/fmgr.c:484 #, c-format msgid "could not find function information for function \"%s\"" msgstr "informazioni sulla funzione \"%s\" non trovate" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:486 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "Le funzioni richiamabili da SQL devono avere un PG_FUNCTION_INFO_V1(nome) corrispondente." -#: utils/fmgr/fmgr.c:505 +#: utils/fmgr/fmgr.c:504 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "versione API sconosciuto %d riportata dalla funzione info \"%s\"" -#: utils/fmgr/fmgr.c:2210 +#: utils/fmgr/fmgr.c:1985 +#, c-format +msgid "operator class options info is absent in function call context" +msgstr "le informazioni sulle opzioni della classe dell'operatore sono assenti nel contesto della chiamata di funzione" + +#: utils/fmgr/fmgr.c:2052 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "funzione di validazione del linguaggio %u chiamata per il linguaggio %u invece di %u" -#: utils/fmgr/funcapi.c:358 +#: utils/fmgr/funcapi.c:455 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "non è stato possibile determinare il tipo reale di risultato della funzione \"%s\" dichiarata con tipo restituito %s" -#: utils/fmgr/funcapi.c:1403 utils/fmgr/funcapi.c:1435 +#: utils/fmgr/funcapi.c:600 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "l'argomento dichiarato %s non contiene un tipo di intervallo ma digita %s" + +#: utils/fmgr/funcapi.c:683 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "impossibile trovare il tipo multirange per il tipo di dati %s" + +#: utils/fmgr/funcapi.c:1900 utils/fmgr/funcapi.c:1932 #, c-format msgid "number of aliases does not match number of columns" msgstr "il numero di alias non corrisponde al numero delle colonne" -#: utils/fmgr/funcapi.c:1429 +#: utils/fmgr/funcapi.c:1926 #, c-format msgid "no column alias was provided" msgstr "non è stato fornito nessun alias colonna" -#: utils/fmgr/funcapi.c:1453 +#: utils/fmgr/funcapi.c:1950 #, c-format msgid "could not determine row description for function returning record" msgstr "non è stato possibile determinare la descrizione della riga per la funzione che restituisce record" -#: utils/init/miscinit.c:108 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "la directory dei dati \"%s\" non esiste" -#: utils/init/miscinit.c:113 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "lettura dei permessi della directory \"%s\" fallita: %m" -#: utils/init/miscinit.c:121 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "la directory dei dati specificata \"%s\" non è una directory" -#: utils/init/miscinit.c:137 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "la directory dei dati \"%s\" ha il proprietario errato" -#: utils/init/miscinit.c:139 +#: utils/init/miscinit.c:360 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Il server deve essere avviato dall'utente che possiede la directory dei dati." -#: utils/init/miscinit.c:157 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "la directory di dati \"%s\" ha permessi non validi" -#: utils/init/miscinit.c:159 +#: utils/init/miscinit.c:380 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "I permessi dovrebbero essere u=rwx (0700) o u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:218 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "spostamento nella directory \"%s\" fallito: %m" - -#: utils/init/miscinit.c:554 utils/misc/guc.c:6361 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7840 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "non è possibile impostare il parametro \"%s\" nell'ambito di operazioni a sicurezza ristretta" -#: utils/init/miscinit.c:615 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "il ruolo con OID %u non esiste" -#: utils/init/miscinit.c:645 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "al ruolo \"%s\" non è consentito effettuare il login" -#: utils/init/miscinit.c:663 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "troppe connessioni per il ruolo \"%s\"" -#: utils/init/miscinit.c:723 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "permesso di impostare l'autorizzazione della sessione negato" -#: utils/init/miscinit.c:806 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "OID del ruolo non valido: %u" -#: utils/init/miscinit.c:860 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "il database è stato arrestato" -#: utils/init/miscinit.c:947 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "creazione del file di lock \"%s\" fallita: %m" -#: utils/init/miscinit.c:961 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "apertura del file di lock \"%s\" fallita: %m" -#: utils/init/miscinit.c:968 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "lettura dal file di lock \"%s\" fallita: %m" -#: utils/init/miscinit.c:977 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "il file di lock \"%s\" è vuoto" -#: utils/init/miscinit.c:978 +#: 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 "O c'è un altro server in avvio, oppure il file di lock è rimasto da un precedente crash in avvio del server." -#: utils/init/miscinit.c:1022 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "il file di lock \"%s\" esiste già" -#: utils/init/miscinit.c:1026 +#: utils/init/miscinit.c:1144 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "C'è un altro postgres (PID %d) in esecuzione nella directory dei dati \"%s\"?" -#: utils/init/miscinit.c:1028 +#: utils/init/miscinit.c:1146 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "C'è un altro postmaster (PID %d) in esecuzione nella directory dei dati \"%s\"?" -#: utils/init/miscinit.c:1031 +#: utils/init/miscinit.c:1149 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "C'è un altro postgres (PID %d) che sta usando il file socket \"%s\"?" -#: utils/init/miscinit.c:1033 +#: utils/init/miscinit.c:1151 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "C'è un altro postmaster (PID %d) che sta usando il file socket \"%s\"?" -#: utils/init/miscinit.c:1069 -#, c-format -msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" -msgstr "il blocco di memoria condivisa preesistente (key %lu, ID %lu) è ancora in uso" - -#: utils/init/miscinit.c:1072 -#, c-format -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 "Se sei sicuro che non ci siano vecchi processi server ancora in esecuzione, rimuovi il blocco di memoria condivisa, o semplicemente cancella il file \"%s\"." - -#: utils/init/miscinit.c:1088 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "rimozione del vecchio file di lock \"%s\" fallita: %m" -#: utils/init/miscinit.c:1090 +#: 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 "Sembra che il file sia stato abbandonato accidentalmente, ma non può essere rimosso. Per favore rimuovilo manualmente e riprova." -#: utils/init/miscinit.c:1127 utils/init/miscinit.c:1141 -#: utils/init/miscinit.c:1152 +#: 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 "scrittura del file di lock \"%s\" fallita: %m" -#: utils/init/miscinit.c:1284 utils/init/miscinit.c:1427 utils/misc/guc.c:9202 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10837 #, c-format msgid "could not read from file \"%s\": %m" msgstr "lettura dal file \"%s\" fallita: %m" -#: utils/init/miscinit.c:1415 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "apertura del file \"%s\" fallita: %m; si procederà comunque" -#: utils/init/miscinit.c:1440 +#: utils/init/miscinit.c:1532 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "il file di lock \"%s\" contiene il PID sbagliato: %ld invece di %ld" -#: utils/init/miscinit.c:1479 utils/init/miscinit.c:1495 +#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" non è una directory di dati valida" -#: utils/init/miscinit.c:1481 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Il file \"%s\" è mancante." -#: utils/init/miscinit.c:1497 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Il file \"%s\" non contiene dati validi." -#: utils/init/miscinit.c:1499 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "Potrebbe essere necessario eseguire initdb." -#: utils/init/miscinit.c:1507 +#: 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 "La directory dei dati è stata inizializzata da PostgreSQL versione %s, che non è compatibile con questa versione %s." -#: utils/init/miscinit.c:1574 +#: utils/init/postinit.c:258 #, c-format -msgid "loaded library \"%s\"" -msgstr "libreria \"%s\" caricata" +msgid "replication connection authorized: user=%s" +msgstr "connessione di replica autorizzata: utente=%s" -#: utils/init/postinit.c:252 +#: utils/init/postinit.c:261 #, c-format -msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "connessione di replica autorizzata: utente=%s SSL abilitato (protocollo=%s, cifrario=%s, bit=%d, compressione=%s)" +msgid "connection authorized: user=%s" +msgstr "connessione autorizzata: utente=%s" -#: utils/init/postinit.c:257 utils/init/postinit.c:274 -msgid "off" -msgstr "disattivato" +#: utils/init/postinit.c:264 +#, c-format +msgid " database=%s" +msgstr " database %s" -#: utils/init/postinit.c:257 utils/init/postinit.c:274 -msgid "on" -msgstr "attivato" +#: utils/init/postinit.c:267 +#, c-format +msgid " application_name=%s" +msgstr " application_name=%s" -#: utils/init/postinit.c:261 +#: utils/init/postinit.c:272 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "connessione di replica autorizzata: utente=%s" +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " connessione SSL abilitata (protocollo: %s, cifrario: %s, bits: %d)" -#: utils/init/postinit.c:269 +#: utils/init/postinit.c:284 #, c-format -msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -msgstr "connessione autorizzata: utente=%s database=%s SSL abilitato (protocollo=%s, cifrario=%s, bit=%d, compressione=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgstr " GSS (autenticato=%s, crittografato=%s, principale=%s)" -#: utils/init/postinit.c:278 +#: utils/init/postinit.c:285 utils/init/postinit.c:286 utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "no" +msgstr "no" + +#: utils/init/postinit.c:285 utils/init/postinit.c:286 utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "yes" +msgstr "sì" + +#: utils/init/postinit.c:290 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "connessione autorizzata: utente=%s database=%s" +msgid " GSS (authenticated=%s, encrypted=%s)" +msgstr " GSS (autenticato=%s, crittografato=%s)" -#: utils/init/postinit.c:310 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "il database \"%s\" è scomparso da database pg_database" -#: utils/init/postinit.c:312 +#: utils/init/postinit.c:332 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "L'OID %u del database ora sembra appartenere a \"%s\"." -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "il database \"%s\" attualmente non accetta connessioni" -#: utils/init/postinit.c:345 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "permesso negato per il database \"%s\"" -#: utils/init/postinit.c:346 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "L'utente non ha il privilegio CONNECT." -#: utils/init/postinit.c:363 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "troppe connessioni al database \"%s\"" -#: utils/init/postinit.c:385 utils/init/postinit.c:392 +#: utils/init/postinit.c:409 utils/init/postinit.c:416 #, c-format msgid "database locale is incompatible with operating system" msgstr "il locale del database è incompatibile col sistema operativo" -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:410 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "Il database di database è stato inizializzato con LC_COLLATE \"%s\", che non è riconosciuto da setlocale()." -#: utils/init/postinit.c:388 utils/init/postinit.c:395 +#: 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 "Crea di nuovo il database con un altro locale oppure installa il locale mancante." -#: utils/init/postinit.c:393 +#: utils/init/postinit.c:417 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Il database è stato inizializzato con LC_CTYPE \"%s\", che non è riconosciuto da setlocale()." -#: utils/init/postinit.c:726 +#: utils/init/postinit.c:462 #, c-format -msgid "no roles are defined in this database system" -msgstr "nessun ruolo definito in questo database" +msgid "database \"%s\" has a collation version mismatch" +msgstr "il database \"%s\" ha una versione di confronto non corrispondente" -#: utils/init/postinit.c:727 +#: utils/init/postinit.c:464 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Dovresti eseguire immediatamente CREATE USER \"%s\" SUPERUSER;." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Il database è stato creato utilizzando la versione di confronto %s, ma il sistema operativo fornisce la versione %s." -#: utils/init/postinit.c:763 +#: utils/init/postinit.c:467 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "non sono accettate nuove connessioni di replica durante lo spegnimento del database" +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 "Ricostruisci tutti gli oggetti in questo database che utilizzano le regole di confronto predefinite ed eseguono ALTER DATABASE %s REFRESH COLLATION VERSION, oppure compila PostgreSQL con la versione della libreria corretta." + +#: utils/init/postinit.c:835 +#, c-format +msgid "no roles are defined in this database system" +msgstr "nessun ruolo definito in questo database" -#: utils/init/postinit.c:767 +#: utils/init/postinit.c:836 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "solo un superutente può connettersi durante lo spegnimento del database" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Dovresti eseguire immediatamente CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:777 +#: utils/init/postinit.c:868 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "solo un superutente può connettersi in modalità di aggiornamento binario" -#: utils/init/postinit.c:791 +#: utils/init/postinit.c:881 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "i rimanenti slot di connessione sono riservati a connessioni di superutenti non di replica" -#: utils/init/postinit.c:801 +#: utils/init/postinit.c:891 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "solo un superutente o il ruolo di replica può avviare walsender" -#: utils/init/postinit.c:870 +#: utils/init/postinit.c:960 #, c-format msgid "database %u does not exist" msgstr "il database %u non esiste" -#: utils/init/postinit.c:959 +#: utils/init/postinit.c:1049 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Sembra sia stato appena eliminato o rinominato." -#: utils/init/postinit.c:977 +#: utils/init/postinit.c:1067 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "La sottodirectory del database \"%s\" risulta mancante." -#: utils/init/postinit.c:982 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "accesso alla directory \"%s\" fallito: %m" - -#: utils/mb/conv.c:488 utils/mb/conv.c:680 +#: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" msgstr "il numero di codifica non è valido: %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 di codifica %d non previsto per il set di caratteri 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 di codifica %d non previsto per il set di caratteri WIN" -#: utils/mb/encnames.c:473 -#, c-format -msgid "encoding \"%s\" not supported by ICU" -msgstr "codifica \"%s\" non supportata da ICU" - -#: utils/mb/encnames.c:572 -#, c-format -msgid "encoding name too long" -msgstr "il nome della codifica è troppo lungo" - -#: utils/mb/mbutils.c:296 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "la conversione fra %s e %s non è supportata" -#: utils/mb/mbutils.c:355 +#: utils/mb/mbutils.c:385 #, c-format msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "la funzione di conversione predefinita da \"%s\" a \"%s\" non esiste" -#: utils/mb/mbutils.c:366 utils/mb/mbutils.c:699 +#: 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 "La stringa di %d byte è troppo lunga per una conversione di codifica." -#: utils/mb/mbutils.c:453 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "il nome della codifica di origine \"%s\" non è valido" -#: utils/mb/mbutils.c:458 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "il nome della codifica di destinazione \"%s\" non è valido" -#: utils/mb/mbutils.c:598 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "byte non valido per la codifica \"%s\": 0x%02x" -#: utils/mb/mbutils.c:940 +#: utils/mb/mbutils.c:877 +#, c-format +msgid "invalid Unicode code point" +msgstr "punto di codice Unicode non valido" + +#: utils/mb/mbutils.c:1146 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codeset fallito" -#: utils/mb/wchar.c:2015 +#: utils/mb/mbutils.c:1667 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "sequenza di byte non valida per la codifica \"%s\": %s" -#: utils/mb/wchar.c:2048 +#: utils/mb/mbutils.c:1700 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "il carattere con sequenza di byte %s nella codifica \"%s\" non ha un equivalente nella codifica \"%s\"" -#: utils/misc/guc.c:571 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Varie" -#: utils/misc/guc.c:573 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Posizione dei File" -#: utils/misc/guc.c:575 -msgid "Connections and Authentication" -msgstr "Connessioni ed Autenticazione" - -#: utils/misc/guc.c:577 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Connessioni ed Autenticazione / Impostazioni di Connessione" -#: utils/misc/guc.c:579 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Connessioni ed Autenticazione / Autenticazione" -#: utils/misc/guc.c:581 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Connessioni ed Autenticazione / SSL" -#: utils/misc/guc.c:583 -msgid "Resource Usage" -msgstr "Uso delle Risorse" - -#: utils/misc/guc.c:585 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Uso delle Risorse / Memoria" -#: utils/misc/guc.c:587 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Uso delle Risorse / Disco" -#: utils/misc/guc.c:589 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Uso delle Risorse / Risorse del Kernel" -#: utils/misc/guc.c:591 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Uso delle Risorse / Intervallo di Vacuum Basato sul Costo" -#: utils/misc/guc.c:593 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Uso delle Risorse / Scrittura in Background" -#: utils/misc/guc.c:595 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Uso delle Risorse / Comportamento Asincrono" -#: utils/misc/guc.c:597 -msgid "Write-Ahead Log" -msgstr "Write-Ahead Log" - -#: utils/misc/guc.c:599 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Impostazioni" -#: utils/misc/guc.c:601 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Checkpoint" -#: utils/misc/guc.c:603 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Archiviazione" -#: utils/misc/guc.c:605 -msgid "Replication" -msgstr "Replica" +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Registro di scrittura/ripristino" + +#: utils/misc/guc.c:806 +msgid "Write-Ahead Log / Archive Recovery" +msgstr "Registro write-ahead / Recupero dell'archivio" -#: utils/misc/guc.c:607 +#: utils/misc/guc.c:808 +msgid "Write-Ahead Log / Recovery Target" +msgstr "Registro write-ahead/destinazione di ripristino" + +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replica / Server di Invio" -#: utils/misc/guc.c:609 -msgid "Replication / Master Server" -msgstr "Replica / Server Master" +#: utils/misc/guc.c:812 +msgid "Replication / Primary Server" +msgstr "Replica / Server primario" -#: utils/misc/guc.c:611 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replica / Serve in Standby" -#: utils/misc/guc.c:613 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replica / Sottoscrizioni" -#: utils/misc/guc.c:615 -msgid "Query Tuning" -msgstr "Tuning delle Query" - -#: utils/misc/guc.c:617 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Tuning delle Query / Configurazione dei Metodi del Planner" -#: utils/misc/guc.c:619 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Tuning delle Query / Costanti di Costo del Planner" -#: utils/misc/guc.c:621 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Tuning delle Query / Ottimizzatore Genetico delle Query" -#: utils/misc/guc.c:623 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Tuning delle Query / Altre Opzioni del Planner" -#: utils/misc/guc.c:625 -msgid "Reporting and Logging" -msgstr "Report e Log" - -#: utils/misc/guc.c:627 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Report e Log / Dove inviare i Log" -#: utils/misc/guc.c:629 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Report e Log / Quando inviare i Log" -#: utils/misc/guc.c:631 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Report e Log / Cosa indicare nei Log" -#: utils/misc/guc.c:633 -msgid "Process Title" -msgstr "Titolo del Processo" +#: utils/misc/guc.c:832 +msgid "Reporting and Logging / Process Title" +msgstr "Reporting e registrazione / Titolo del processo" -#: utils/misc/guc.c:635 -msgid "Statistics" -msgstr "Statistiche" - -#: utils/misc/guc.c:637 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistiche / Monitoring" -#: utils/misc/guc.c:639 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "Statistiche / Raccolta delle Statistiche su Query e Indici" +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "Statistiche / Query cumulative e statistiche dell'indice" -#: utils/misc/guc.c:641 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:643 -msgid "Client Connection Defaults" -msgstr "Valori Predefiniti Connessioni Client" - -#: utils/misc/guc.c:645 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valori Predefiniti Connessioni Client / Comportamento Istruzioni" -#: utils/misc/guc.c:647 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Valori Predefiniti Connessioni Client / Locale e Formattazione" -#: utils/misc/guc.c:649 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valori Predefiniti Connessioni Client / Precaricamento Librerie Condivise" -#: utils/misc/guc.c:651 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Valori Predefiniti Connessioni Client / Altri Default" -#: utils/misc/guc.c:653 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Gestione dei Lock" -#: utils/misc/guc.c:655 -msgid "Version and Platform Compatibility" -msgstr "Versione e Compatibilità della Piattaforma" - -#: utils/misc/guc.c:657 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Versione e Compatibilità della Piattaforma / Versioni Precedenti di PostgreSQL" -#: utils/misc/guc.c:659 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Versione e Compatibilità della Piattaforma / Altre Piattaforme e Client" -#: utils/misc/guc.c:661 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Gestione degli Errori" -#: utils/misc/guc.c:663 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Opzioni Preimpostate" -#: utils/misc/guc.c:665 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Opzioni Personalizzate" -#: utils/misc/guc.c:667 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Opzioni di Sviluppo" -#: utils/misc/guc.c:721 +#: utils/misc/guc.c:918 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Le unità di misura valide per questo parametro sono \"B\", \"kB\", \"MB\", \"GB\" e \"TB\"." -#: utils/misc/guc.c:763 -msgid "Valid units for this parameter are \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "Le unità di misura valide sono \"ms\", \"s\", \"min\", \"h\" e \"d\"." +#: utils/misc/guc.c:955 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "Le unità valide per questo parametro sono \"us\", \"ms\", \"s\", \"min\", \"h\" e \"d\"." -#: utils/misc/guc.c:822 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Abilita l'uso da parte del planner dei piani di scansione sequenziale." -#: utils/misc/guc.c:831 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Abilita l'uso da parte del planner dei piani di scansione degli indici." -#: utils/misc/guc.c:840 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Abilita l'uso da parte del planner dei piani di scansione dei soli indici." -#: utils/misc/guc.c:849 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Abilita l'uso da parte del planner dei piani di scansione bitmap." -#: utils/misc/guc.c:858 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Abilita l'uso da parte del planner dei piani di scansione TID." -#: utils/misc/guc.c:867 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Abilita l'uso da parte del planner di passaggi di ordinamento esplicito." -#: utils/misc/guc.c:876 +#: utils/misc/guc.c:1077 +msgid "Enables the planner's use of incremental sort steps." +msgstr "Consente al pianificatore di utilizzare i passaggi di ordinamento incrementali." + +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Abilita l'uso da parte del planner di piani di aggregazione basati su hash." -#: utils/misc/guc.c:885 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Abilita l'uso da parte del planner di materializzazione." -#: utils/misc/guc.c:894 +#: utils/misc/guc.c:1107 +msgid "Enables the planner's use of memoization." +msgstr "Abilita l'uso della memorizzazione da parte del pianificatore." + +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Abilita l'uso da parte del planner di piani di join annidati." -#: utils/misc/guc.c:903 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Abilita l'uso da parte del planner di piani di join ad unione." -#: utils/misc/guc.c:912 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Abilita l'uso da parte del planner di piani di join basati su hash." -#: utils/misc/guc.c:921 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Abilita l'uso da parte del planner di piani gather merge." -#: utils/misc/guc.c:930 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Abilita join partizione su partizione." -#: utils/misc/guc.c:939 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Abilita aggregazione e raggruppamento partizione per partizione." -#: utils/misc/guc.c:948 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Abilita l'uso da parte del planner di piani di append paralleli." -#: utils/misc/guc.c:957 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Abilita l'uso da parte del planner di piani di hash paralleli." -#: utils/misc/guc.c:966 -msgid "Enable plan-time and run-time partition pruning." -msgstr "Abilita eliminazione delle partizioni durante la pianificazione e l'esecuzione." +#: utils/misc/guc.c:1197 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "Consente lo sfoltimento delle partizioni in fase di pianificazione e in fase di esecuzione." -#: utils/misc/guc.c:967 +#: 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 "Permetti al planner e all'esecutore di comparare i margini delle partizioni alle condizioni nelle query per determinare quali partizioni devono essere esaminate." -#: utils/misc/guc.c:977 +#: utils/misc/guc.c:1209 +msgid "Enables the planner's use of async append plans." +msgstr "Consente al pianificatore di utilizzare i piani di aggiunta asincroni." + +#: utils/misc/guc.c:1219 +msgid "Enables reordering of GROUP BY keys." +msgstr "Consente il riordino delle chiavi GROUP BY." + +#: utils/misc/guc.c:1229 msgid "Enables genetic query optimization." msgstr "Abilita l'ottimizzatore genetico di query." -#: utils/misc/guc.c:978 +#: utils/misc/guc.c:1230 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Questo algoritmo cerca di realizzare piani senza effettuare una ricerca esaustiva." -#: utils/misc/guc.c:988 +#: utils/misc/guc.c:1241 msgid "Shows whether the current user is a superuser." msgstr "Mostra se l'utente attuale è un superutente o meno." -#: utils/misc/guc.c:998 +#: utils/misc/guc.c:1251 msgid "Enables advertising the server via Bonjour." msgstr "Abilita la pubblicazione del server via Bonjour." -#: utils/misc/guc.c:1007 +#: utils/misc/guc.c:1260 msgid "Collects transaction commit time." msgstr "Raccogli l'ora di commit delle transazioni." -#: utils/misc/guc.c:1016 +#: utils/misc/guc.c:1269 msgid "Enables SSL connections." msgstr "Abilita le connessioni SSL." -#: utils/misc/guc.c:1025 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "Usa anche ssl_passphrase_command durante il riavvio del server." +#: utils/misc/guc.c:1278 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "Consente lo sfoltimento delle partizioni in fase di pianificazione e in fase di esecuzione." -#: utils/misc/guc.c:1034 +#: utils/misc/guc.c:1287 msgid "Give priority to server ciphersuite order." msgstr "Dai priorità all'ordine di cifrari del server." -#: utils/misc/guc.c:1043 +#: utils/misc/guc.c:1296 msgid "Forces synchronization of updates to disk." msgstr "Forza la sincronizzazione degli aggiornamenti sul disco." -#: utils/misc/guc.c:1044 -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." +#: 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 ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Il server userà in diversi punti la chiamata di sistema fsync() per assicurarsi che gli aggiornamenti vengano scritti fisicamente sul disco. Questo assicura che un cluster di database possa essere recuperato in uno stato consistente dopo un crash di sistema o dell'hardware." -#: utils/misc/guc.c:1055 +#: utils/misc/guc.c:1308 msgid "Continues processing after a checksum failure." msgstr "Condinua l'elaborazione dopo un errore in una somma di controllo." -#: utils/misc/guc.c:1056 +#: 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 "La rilevazione di un errore in una somma di controllo di solito fa generare a PostgreSQL un errore che fa abortire la transazione corrente. Impostare ignore_checksum_failure a \"true\" fa sì che il sistema ignori l'errore (che viene riportato come un avviso), consentendo al processo di continuare. Questo comportamento potrebbe causare crash o altri problemi gravi. Ha effetto solo se se somme di controllo sono abilitate." -#: utils/misc/guc.c:1070 +#: utils/misc/guc.c:1323 msgid "Continues processing past damaged page headers." msgstr "Continua l'esecuzione oltre le intestazioni di pagina danneggiate." -#: utils/misc/guc.c:1071 +#: 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 "Il rilevamento di una intestazione di pagina danneggiata normalmente fa sì che PostgreSQL segnali un errore, interrompendo la transazione corrente. L'attivazione di zero_damaged_pages fa sì che il sistema invece riporti un warning, azzeri la pagina danneggiata e continui l'esecuzione. Questo comportamento può distruggere dei dati, in particolare tutte quelle righe situate nella pagina danneggiata." -#: utils/misc/guc.c:1084 +#: utils/misc/guc.c:1337 +msgid "Continues recovery after an invalid pages failure." +msgstr "Continua il ripristino dopo un errore di pagine non valide." + +#: 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 "" +"Il rilevamento di record WAL con riferimenti a pagine non valide durante il ripristino fa sì che PostgreSQL generi un errore di livello PANIC, interrompendo il ripristino. L'impostazione di ignore_invalid_pages su true fa sì che il sistema ignori i riferimenti di pagina non validi nei record WAL (ma segnali comunque un avviso) e continui il ripristino. Questo comportamento può causare arresti anomali, perdita di dati, propagare o nascondere danni o altri " +"problemi gravi. Ha effetto solo durante il ripristino o in modalità standby." + +#: utils/misc/guc.c:1356 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Scrivi pagine intere nel WAL non appena modificate dopo un checkpoint." -#: utils/misc/guc.c:1085 +#: 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 "La scrittura di una pagina durante un crash del sistema operativo potrebbe essere stata scritta su disco solo parzialmente. Durante il ripristino, le variazioni di riga memorizzate nel WAL non sono sufficienti al ripristino. Questa operazione scrive le pagine nel WAL appena modificate dopo un checkpoint nel WAL in maniera da rendere possibile un ripristino completo." -#: utils/misc/guc.c:1098 -msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." -msgstr "Scrivi pagine complete nel WAL appena modificate dopo un checkpoint, anche dopo modifiche non critiche." +#: utils/misc/guc.c:1370 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." +msgstr "Scrive pagine intere su WAL alla prima modifica dopo un checkpoint, anche per una modifica non critica." + +#: utils/misc/guc.c:1380 +msgid "Writes zeroes to new WAL files before first use." +msgstr "Scrive zero nei nuovi file WAL prima del primo utilizzo." -#: utils/misc/guc.c:1108 -msgid "Compresses full-page writes written in WAL file." -msgstr "Comprimi le scritture di pagine complete scritte nel file WAL." +#: utils/misc/guc.c:1390 +msgid "Recycles WAL files by renaming them." +msgstr "Ricicla i file WAL rinominandoli." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1400 msgid "Logs each checkpoint." msgstr "Registra nel log ogni checkpoint." -#: utils/misc/guc.c:1127 +#: utils/misc/guc.c:1409 msgid "Logs each successful connection." msgstr "Registra nel log tutte le connessioni avvenute con successo." -#: utils/misc/guc.c:1136 +#: utils/misc/guc.c:1418 msgid "Logs end of a session, including duration." msgstr "Registra nel log la fine delle sessioni, compresa la sua durata." -#: utils/misc/guc.c:1145 +#: utils/misc/guc.c:1427 msgid "Logs each replication command." msgstr "Registra nel log ogni comando di replica." -#: utils/misc/guc.c:1154 +#: utils/misc/guc.c:1436 msgid "Shows whether the running server has assertion checks enabled." msgstr "Mostra se il server in esecuzione ha i controlli di assert attivi." -#: utils/misc/guc.c:1169 +#: utils/misc/guc.c:1451 msgid "Terminate session on any error." msgstr "Termina la sessione su qualunque errore." -#: utils/misc/guc.c:1178 +#: utils/misc/guc.c:1460 msgid "Reinitialize server after backend crash." msgstr "Reinizializza il server dopo un crash del backend." -#: utils/misc/guc.c:1188 +#: utils/misc/guc.c:1469 +msgid "Remove temporary files after backend crash." +msgstr "Reinizializza il server dopo un crash del backend." + +#: utils/misc/guc.c:1480 msgid "Logs the duration of each completed SQL statement." msgstr "Registra nel log la durata di ogni istruzione SQL completata." -#: utils/misc/guc.c:1197 +#: utils/misc/guc.c:1489 msgid "Logs each query's parse tree." msgstr "Registra nel log l'albero di parsing di tutte le query." -#: utils/misc/guc.c:1206 +#: utils/misc/guc.c:1498 msgid "Logs each query's rewritten parse tree." msgstr "Registra nel log l'albero di parsing riscritto di tutte le query." -#: utils/misc/guc.c:1215 +#: utils/misc/guc.c:1507 msgid "Logs each query's execution plan." msgstr "Registra nel log il piano di esecuzione di tutte le query." -#: utils/misc/guc.c:1224 +#: utils/misc/guc.c:1516 msgid "Indents parse and plan tree displays." msgstr "Indenta gli alberi di parsing e dei piani di esecuzione." -#: utils/misc/guc.c:1233 +#: utils/misc/guc.c:1525 msgid "Writes parser performance statistics to the server log." msgstr "Registra nel log del server le statistiche sulle prestazioni del parser." -#: utils/misc/guc.c:1242 +#: utils/misc/guc.c:1534 msgid "Writes planner performance statistics to the server log." msgstr "Registra nel log del server le statistiche sulle prestazioni del planner." -#: utils/misc/guc.c:1251 +#: utils/misc/guc.c:1543 msgid "Writes executor performance statistics to the server log." msgstr "Registra nel log del server le statistiche sulle prestazioni dell'esecutore." -#: utils/misc/guc.c:1260 +#: utils/misc/guc.c:1552 msgid "Writes cumulative performance statistics to the server log." msgstr "Registra nel log del server le statistiche sulle prestazioni cumulative." -#: utils/misc/guc.c:1270 +#: utils/misc/guc.c:1562 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Registra nel log statistiche sull'uso di risorse di sistema (memoria e CPU) su varie operazioni B-tree." -#: utils/misc/guc.c:1282 +#: utils/misc/guc.c:1574 msgid "Collects information about executing commands." msgstr "Raccogli informazioni sull'esecuzione dei comandi." -#: utils/misc/guc.c:1283 +#: 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 "Abilita la raccolta di informazioni sui comandi in esecuzione per ogni sessione, insieme all'orario in cui l'esecuzione del comando è iniziata." -#: utils/misc/guc.c:1293 +#: utils/misc/guc.c:1585 msgid "Collects statistics on database activity." msgstr "Raccogli statistiche sull'attività del database." -#: utils/misc/guc.c:1302 +#: utils/misc/guc.c:1594 msgid "Collects timing statistics for database I/O activity." msgstr "Raccogli statistiche sull'attività di I/O del database." -#: utils/misc/guc.c:1312 +#: utils/misc/guc.c:1603 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "Raccoglie le statistiche sui tempi per l'attività di I/O WAL." + +#: utils/misc/guc.c:1613 msgid "Updates the process title to show the active SQL command." msgstr "Aggiorna il titolo del processo per indicare il comando SQL in esecuzione." -#: utils/misc/guc.c:1313 +#: utils/misc/guc.c:1614 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Abilita l'aggiornamento del titolo del processo ogni volta che un nuovo comando SQL viene ricevuto dal server." -#: utils/misc/guc.c:1326 +#: utils/misc/guc.c:1627 msgid "Starts the autovacuum subprocess." msgstr "Avvia il sottoprocesso autovacuum." -#: utils/misc/guc.c:1336 +#: utils/misc/guc.c:1637 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Genera un output di debug per LISTEN e NOTIFY." -#: utils/misc/guc.c:1348 +#: utils/misc/guc.c:1649 msgid "Emits information about lock usage." msgstr "Emette informazioni sull'uso dei lock." -#: utils/misc/guc.c:1358 +#: utils/misc/guc.c:1659 msgid "Emits information about user lock usage." msgstr "Emette informazioni sull'uso dei lock utente." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1669 msgid "Emits information about lightweight lock usage." msgstr "Emette informazioni sull'uso dei lock leggeri." -#: utils/misc/guc.c:1378 +#: utils/misc/guc.c:1679 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Emette informazioni su tutti i lock attivi quando avviene un timeout di lock." -#: utils/misc/guc.c:1390 +#: utils/misc/guc.c:1691 msgid "Logs long lock waits." msgstr "Inserisci nel log le attese lunghe su lock." -#: utils/misc/guc.c:1400 +#: utils/misc/guc.c:1700 +msgid "Logs standby recovery conflict waits." +msgstr "Registra le attese del conflitto di ripristino in standby." + +#: utils/misc/guc.c:1709 msgid "Logs the host name in the connection logs." msgstr "Inserisci nel log lo host name delle connessioni." -#: utils/misc/guc.c:1401 +#: 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 "Normalmente, viene inserito nel log solo l'indirizzo IP dell'host connesso. Se vuoi mostrare anche il nome host puoi attivando questa parametro ma, a seconda di come è definito il sistema di risoluzione dei nomi, ciò potrebbe comportare una penalizzazione delle prestazioni non trascurabile." -#: utils/misc/guc.c:1412 +#: utils/misc/guc.c:1721 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tratta l'espressione \"expr=NULL\" come \"expr IS NULL\"." -#: utils/misc/guc.c:1413 +#: 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 "Se abilitato, le espressioni nella forma expr = NULL (o NULL = expr) vengono trattate come expr IS NULL, in modo cioè che restituiscano TRUE se expr viene valutato con valore NULL e falso in ogni altro caso. Il comportamento corretto prevede che expr = NULL valga sempre NULL (sconosciuto)." -#: utils/misc/guc.c:1425 +#: utils/misc/guc.c:1734 msgid "Enables per-database user names." msgstr "Abilita nomi di utenti diversificati per ogni database." -#: utils/misc/guc.c:1434 +#: utils/misc/guc.c:1743 msgid "Sets the default read-only status of new transactions." msgstr "Imposta lo stato predefinito di sola lettura per le nuove transazioni." -#: utils/misc/guc.c:1443 +#: utils/misc/guc.c:1753 msgid "Sets the current transaction's read-only status." msgstr "Imposta lo stato di sola lettura per la transazione corrente." -#: utils/misc/guc.c:1453 +#: utils/misc/guc.c:1763 msgid "Sets the default deferrable status of new transactions." msgstr "Imposta lo stato predefinito deferibile per le nuove transazioni." -#: utils/misc/guc.c:1462 +#: 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 "Indica se deferire una transazione serializzabile in sola lettura finché possa essere eseguita senza possibili fallimenti di serializzazione." -#: utils/misc/guc.c:1472 +#: utils/misc/guc.c:1782 msgid "Enable row security." msgstr "Abilita la sicurezza delle righe." -#: utils/misc/guc.c:1473 +#: utils/misc/guc.c:1783 msgid "When enabled, row security will be applied to all users." msgstr "Quando abilitata, la sicurezza delle righe verrà applicata a tutti gli utenti." -#: utils/misc/guc.c:1481 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "Esegui un controllo sulla definizione del corpo durante la CREATE FUNCTION." +#: utils/misc/guc.c:1791 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "Controllare i corpi di routine durante CREATE FUNCTION e CREATE PROCEDURE." -#: utils/misc/guc.c:1490 +#: utils/misc/guc.c:1800 msgid "Enable input of NULL elements in arrays." msgstr "Abilita l'input di elementi NULL negli array." -#: utils/misc/guc.c:1491 +#: 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 "Se abilitato, un NULL senza apici come valore di input in un array indica un valore nullo; altrimenti è preso letteralmente." -#: utils/misc/guc.c:1501 -msgid "Create new tables with OIDs by default." -msgstr "Crea le nuove tabella con gli OID in maniera predefinita." +#: utils/misc/guc.c:1817 +msgid "WITH OIDS is no longer supported; this can only be false." +msgstr "CON OIDS non è più supportato; questo può solo essere falso." -#: utils/misc/guc.c:1510 +#: utils/misc/guc.c:1827 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Avvia un sottoprocesso per catturare in un file di log l'output di stderr e/o di csvlog." -#: utils/misc/guc.c:1519 +#: utils/misc/guc.c:1836 msgid "Truncate existing log files of same name during log rotation." msgstr "Tronca un file di log esistente con lo stesso nome durante la rotazione dei log." -#: utils/misc/guc.c:1530 +#: utils/misc/guc.c:1847 msgid "Emit information about resource usage in sorting." msgstr "Genera informazioni sull'uso delle risorse durante gli ordinamenti." -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1861 msgid "Generate debugging output for synchronized scanning." msgstr "Genera output di debug per le scansioni sincronizzate." -#: utils/misc/guc.c:1559 +#: utils/misc/guc.c:1876 msgid "Enable bounded sorting using heap sort." msgstr "Abilita il bounded sorting usando lo heap sort." -#: utils/misc/guc.c:1572 +#: utils/misc/guc.c:1889 msgid "Emit WAL-related debugging output." msgstr "Genera output di debug relativo al WAL." -#: utils/misc/guc.c:1584 -msgid "Datetimes are integer based." -msgstr "I valori di data e tempo sono basati su interi." +#: utils/misc/guc.c:1901 +msgid "Shows whether datetimes are integer based." +msgstr "Mostra se datetime sono basate su numeri interi." -#: utils/misc/guc.c:1595 +#: utils/misc/guc.c:1912 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Imposta se i nomi di utente con Kerberos e GSSAPI debbano essere trattati come case-insensitive." -#: utils/misc/guc.c:1605 +#: utils/misc/guc.c:1922 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avverti sull'uso degli escape con backslash nei letterali stringa ordinarie." -#: utils/misc/guc.c:1615 +#: utils/misc/guc.c:1932 msgid "Causes '...' strings to treat backslashes literally." msgstr "Fa sì che le stringhe '...' trattino i backslash letteralmente." -#: utils/misc/guc.c:1626 +#: utils/misc/guc.c:1943 msgid "Enable synchronized sequential scans." msgstr "Abilita le scansioni sequenziali sincronizzate." -#: utils/misc/guc.c:1636 +#: utils/misc/guc.c:1953 +msgid "Sets whether to include or exclude transaction with recovery target." +msgstr "Imposta se includere o escludere la transazione con la destinazione di ripristino." + +#: utils/misc/guc.c:1963 msgid "Allows connections and queries during recovery." -msgstr "Consente connessioni e query durante il recupero" +msgstr "Consente connessioni e query durante il recupero." -#: utils/misc/guc.c:1646 +#: utils/misc/guc.c:1973 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." -msgstr "Consente un feedback da un hot standby al primario che eviterà conflitti di query" +msgstr "Consente un feedback da un hot standby al primario che eviterà conflitti di query." + +#: utils/misc/guc.c:1983 +msgid "Shows whether hot standby is currently active." +msgstr "Mostra se l'hot standby è attualmente attivo." -#: utils/misc/guc.c:1656 +#: utils/misc/guc.c:1994 msgid "Allows modifications of the structure of system tables." msgstr "Consente le modifiche alla struttura delle tabelle di sistema." -#: utils/misc/guc.c:1667 +#: utils/misc/guc.c:2005 msgid "Disables reading from system indexes." msgstr "Disabilita la lettura dagli indici di sistema." -#: utils/misc/guc.c:1668 +#: 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 "Non impedisce l'aggiornamento degli indici ed è perciò utilizzabile tranquillamente. Al peggio causa rallentamenti." -#: utils/misc/guc.c:1679 +#: utils/misc/guc.c:2017 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "Consente tablespace direttamente all'interno di pg_tblspc, per il test." + +#: utils/misc/guc.c:2028 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Abilita la modalità compatibile col passato del controllo dei privilegi sui large object." -#: utils/misc/guc.c:1680 +#: 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 "Evita il controllo dei privilegi quando si leggono o modificano large object, per compatibilità con versioni di PostgreSQL precedenti la 9.0." -#: utils/misc/guc.c:1690 -msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "Emetti un avviso per i costrutti che hanno cambiato significato da PostgreSQL 9.4." - -#: utils/misc/guc.c:1700 +#: utils/misc/guc.c:2039 msgid "When generating SQL fragments, quote all identifiers." msgstr "Quando vengono generati frammenti SQL, metti tra virgolette tutti gli identificatori." -#: utils/misc/guc.c:1710 +#: utils/misc/guc.c:2049 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Mostra se i checksum di dati sono attivi in questo cluster." -#: utils/misc/guc.c:1721 +#: utils/misc/guc.c:2060 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Aggiungi un numero sequenziale ai messaggi syslog per evitare la soppressione di duplicati." -#: utils/misc/guc.c:1731 +#: utils/misc/guc.c:2070 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Dividi i messaggi inviati a syslog in linee inferiori a 1024 byte." -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:2080 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Controlla se Gather e Gather Merge possano anche eseguire sottopiani." -#: utils/misc/guc.c:1742 -msgid "Should gather nodes also run subplans, or just gather tuples?" -msgstr "I nodi di raccolta possono anche eseguire sottopiani, o solo raccogliere tuple?" +#: utils/misc/guc.c:2081 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "I nodi di raccolta dovrebbero anche eseguire sottopiani o semplicemente raccogliere tuple?" -#: utils/misc/guc.c:1751 +#: utils/misc/guc.c:2091 msgid "Allow JIT compilation." msgstr "Permetti compilazione JIT." -#: utils/misc/guc.c:1761 -msgid "Register JIT compiled function with debugger." -msgstr "Registra la funzione compilata con JIT col debugger." +#: utils/misc/guc.c:2102 +msgid "Register JIT-compiled functions with debugger." +msgstr "Registra le funzioni compilate con JIT con il debugger." -#: utils/misc/guc.c:1778 +#: utils/misc/guc.c:2119 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Scrivi il bitcode LLVM per facilitare il debugging JIT." -#: utils/misc/guc.c:1789 +#: utils/misc/guc.c:2130 msgid "Allow JIT compilation of expressions." msgstr "Permetti la compilazione JIT di espressioni." -#: utils/misc/guc.c:1800 -msgid "Register JIT compiled function with perf profiler." -msgstr "Registra la funzione compilata con JIT con il perf profiler." +#: utils/misc/guc.c:2141 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "Registra le funzioni compilate con JIT con perf profiler." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:2158 msgid "Allow JIT compilation of tuple deforming." msgstr "Permetti al compilatore JIT di deformare tuple." -#: utils/misc/guc.c:1837 -msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." -msgstr "Forza il passaggio al prossimo file WAL se un nuovo file non è stato iniziato entro N secondi." +#: utils/misc/guc.c:2169 +msgid "Whether to continue running after a failure to sync data files." +msgstr "Se continuare a eseguire dopo una mancata sincronizzazione dei file di dati." -#: utils/misc/guc.c:1848 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Attendi N secondi all'avvio della connessione dopo l'autenticazione." +#: utils/misc/guc.c:2178 +msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." +msgstr "Imposta se un ricevitore WAL deve creare uno slot di replica temporaneo se non è configurato alcuno slot permanente." -#: utils/misc/guc.c:1849 utils/misc/guc.c:2400 +#: utils/misc/guc.c:2196 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "Imposta il tempo di attesa prima di forzare il passaggio al file WAL successivo." + +#: utils/misc/guc.c:2207 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Imposta il tempo di attesa dopo l'autenticazione all'avvio della connessione." + +#: utils/misc/guc.c:2209 utils/misc/guc.c:2830 msgid "This allows attaching a debugger to the process." msgstr "Ciò consente di agganciare un debugger al processo." -#: utils/misc/guc.c:1858 +#: utils/misc/guc.c:2218 msgid "Sets the default statistics target." msgstr "Definisce la destinazione delle statistiche di default." -#: utils/misc/guc.c:1859 +#: 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 "Questo vale per le colonne di tabelle che non hanno definito una destinazione specifica per colonne per mezzo di un ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:1868 +#: utils/misc/guc.c:2228 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Definisce la dimensione della lista FROM oltre la quale le sottoquery non vengono ridotte." -#: utils/misc/guc.c:1870 +#: 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 "Il planner fonderà le sottoquery nelle query superiori se la lista FROM risultante avrebbe non più di questi elementi." -#: utils/misc/guc.c:1880 +#: utils/misc/guc.c:2241 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Definisce la dimensione della lista FROM oltre la quale i costrutti JOIN non vengono più appiattiti." -#: utils/misc/guc.c:1882 +#: 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 "Il planner appiattisce i costrutti di JOIN espliciti in liste di elementi FROM ogni volta che ne risulterebbe una lista con non più di questi elementi." -#: utils/misc/guc.c:1892 +#: utils/misc/guc.c:2254 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Definisce la soglia di elementi FROM oltre la quale viene usato il GEQO." -#: utils/misc/guc.c:1901 +#: utils/misc/guc.c:2264 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: prova a definire i default per gli altri parametri di GEQO." -#: utils/misc/guc.c:1910 +#: utils/misc/guc.c:2274 msgid "GEQO: number of individuals in the population." msgstr "GEQO: numero di individui nella popolazione." -#: utils/misc/guc.c:1911 utils/misc/guc.c:1920 +#: utils/misc/guc.c:2275 utils/misc/guc.c:2285 msgid "Zero selects a suitable default value." msgstr "Lo zero selezione un valore ammissibile come default." -#: utils/misc/guc.c:1919 +#: utils/misc/guc.c:2284 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: numero di iterazioni dell'algoritmo." -#: utils/misc/guc.c:1930 +#: utils/misc/guc.c:2296 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Definisce il tempo di attesa su un lock prima di verificare si tratti di un deadlock." -#: utils/misc/guc.c:1941 +#: utils/misc/guc.c:2307 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Imposta l'intervallo massimo prima di annullare le query quando un server in hot standby sta processando dati da un WAL archiviato." -#: utils/misc/guc.c:1952 +#: utils/misc/guc.c:2318 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Imposta l'intervallo massimo prima di annullare le query quando un server in hot standby sta processando dati da un WAL streamed." -#: utils/misc/guc.c:1963 -msgid "Sets the maximum interval between WAL receiver status reports to the primary." -msgstr "Imposta l'intervallo massimo tra i rapporti di stato del ricevitore dei WAL al primario." +#: utils/misc/guc.c:2329 +msgid "Sets the minimum delay for applying changes during recovery." +msgstr "Imposta il ritardo minimo per l'applicazione delle modifiche durante il ripristino." -#: utils/misc/guc.c:1974 -msgid "Sets the maximum wait time to receive data from the primary." -msgstr "Imposta un tempo massimo di attesa per la ricezione di dati dal primario." +#: utils/misc/guc.c:2340 +msgid "Sets the maximum interval between WAL receiver status reports to the sending server." +msgstr "Imposta l'intervallo massimo tra i rapporti sullo stato del ricevitore WAL e il server di invio." -#: utils/misc/guc.c:1985 +#: utils/misc/guc.c:2351 +msgid "Sets the maximum wait time to receive data from the sending server." +msgstr "Imposta il tempo di attesa massimo per ricevere i dati dal server di invio." + +#: utils/misc/guc.c:2362 msgid "Sets the maximum number of concurrent connections." msgstr "Imposta il numero massimo di connessioni concorrenti." -#: utils/misc/guc.c:1996 +#: utils/misc/guc.c:2373 msgid "Sets the number of connection slots reserved for superusers." msgstr "Imposta il numero di slot per connessioni riservate ai superutenti." -#: utils/misc/guc.c:2010 +#: utils/misc/guc.c:2383 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "Quantità di memoria condivisa dinamica riservata all'avvio." + +#: utils/misc/guc.c:2398 msgid "Sets the number of shared memory buffers used by the server." msgstr "Imposta il numero di buffer di memoria condivisa usati dal server." -#: utils/misc/guc.c:2021 +#: utils/misc/guc.c:2409 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "Mostra la dimensione dell'area di memoria condivisa principale del server (arrotondata al MB più vicino)." + +#: utils/misc/guc.c:2420 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Mostra il numero di pagine enormi necessarie per l'area di memoria condivisa principale." + +#: utils/misc/guc.c:2421 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 indica che non è stato possibile determinare il valore." + +#: utils/misc/guc.c:2431 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Definisce il numero massimo di buffer temporanei usati da ogni sessione." -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2442 msgid "Sets the TCP port the server listens on." msgstr "Imposta il numero di porta TCP sulla quale il server è in ascolto." -#: utils/misc/guc.c:2042 +#: utils/misc/guc.c:2452 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Imposta i permessi di accesso del socket di dominio Unix." -#: utils/misc/guc.c:2043 +#: 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 "I socket di dominio Unix utilizzano i normali permessi dei file system Unix. Il valore del parametro deve essere la specifica numerica dei permessi nella stessa forma accettata dalle chiamate di sistema chmod e umask. (Per usare il classico formato ottale, il valore numerico deve iniziare con 0 (zero).)" -#: utils/misc/guc.c:2057 +#: utils/misc/guc.c:2467 msgid "Sets the file permissions for log files." msgstr "Imposta i permessi dei file di log." -#: utils/misc/guc.c:2058 +#: 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 "Il valore del parametro deve essere la specifica numerica dei permessi nella stessa forma accettata dalle chiamate di sistema chmod e umask. (Per usare il classico formato ottale, il valore numerico deve iniziare con 0 (zero).)" -#: utils/misc/guc.c:2072 -msgid "Mode of the data directory." -msgstr "Modo della directory dei dati." +#: utils/misc/guc.c:2482 +msgid "Shows the mode of the data directory." +msgstr "Mostra la modalità della directory dei dati." -#: utils/misc/guc.c:2073 +#: 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 "Il valore del parametro deve essere la specifica numerica dei permessi nella stessa forma accettata dalle chiamate di sistema chmod e umask. (Per usare il classico formato ottale, il valore numerico deve iniziare con 0 (zero).)" -#: utils/misc/guc.c:2086 +#: utils/misc/guc.c:2496 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Imposta la quantità massima di memoria utilizzabile per gli spazi di lavoro delle query." -#: utils/misc/guc.c:2087 +#: 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 "Questa quantità di memoria può essere utilizzata per ogni operazione di ordinamento interno e per ogni tabella hash prima di passare ai file temporanei su disco." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2509 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Imposta la quantità massima di memoria utilizzabile per le operazioni di manutenzione." -#: utils/misc/guc.c:2100 +#: utils/misc/guc.c:2510 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Queste includono operazioni quali VACUUM e CREATE INDEX." -#: utils/misc/guc.c:2115 +#: utils/misc/guc.c:2520 +msgid "Sets the maximum memory to be used for logical decoding." +msgstr "Imposta la memoria massima da utilizzare per la decodifica logica." + +#: utils/misc/guc.c:2521 +msgid "This much memory can be used by each internal reorder buffer before spilling to disk." +msgstr "Questa quantità di memoria può essere utilizzata da ciascun buffer di riordino interno prima di riversarsi su disco." + +#: utils/misc/guc.c:2537 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Imposta la profondità massima dello stack, in kilobyte." -#: utils/misc/guc.c:2126 +#: utils/misc/guc.c:2548 msgid "Limits the total size of all temporary files used by each process." msgstr "Limita la dimensione totale di tutti i file temporanei usata da ogni processo." -#: utils/misc/guc.c:2127 +#: utils/misc/guc.c:2549 msgid "-1 means no limit." msgstr "-1 vuol dire senza limiti." -#: utils/misc/guc.c:2137 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Costo del VACUUM per una pagina trovata nella cache dei buffer." -#: utils/misc/guc.c:2147 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Costo del VACUUM per una pagina non trovata nella cache dei buffer." -#: utils/misc/guc.c:2157 +#: utils/misc/guc.c:2579 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Costo del VACUUM per una pagina resa sporca dal VACUUM." -#: utils/misc/guc.c:2167 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping." msgstr "Costo totale del VACUUM prima della pausa." -#: utils/misc/guc.c:2177 -msgid "Vacuum cost delay in milliseconds." -msgstr "Il costo del VACUUM come ritardo in millisecondi." - -#: utils/misc/guc.c:2188 -msgid "Vacuum cost delay in milliseconds, for autovacuum." -msgstr "Il costo del VACUUM come ritardo in millisecondi, per l'autovacuum." - -#: utils/misc/guc.c:2199 +#: utils/misc/guc.c:2599 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Il costo totale del VACUUM prima della pausa, per l'autovacuum." -#: utils/misc/guc.c:2209 +#: utils/misc/guc.c:2609 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Imposta il numero massimo di file aperti contemporaneamente per ogni processo server." -#: utils/misc/guc.c:2222 +#: utils/misc/guc.c:2622 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Imposta il numero massimo di transazioni preparate contemporanee." -#: utils/misc/guc.c:2233 +#: utils/misc/guc.c:2633 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Imposta l'OID minimo delle tabelle per tracciare i lock." -#: utils/misc/guc.c:2234 +#: utils/misc/guc.c:2634 msgid "Is used to avoid output on system tables." msgstr "È usato per evitare l'output su tabelle di sistema." -#: utils/misc/guc.c:2243 +#: utils/misc/guc.c:2643 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Imposta l'OID delle tabelle con tracciamento dei lock non facoltativo." -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2655 msgid "Sets the maximum allowed duration of any statement." msgstr "Imposta la durata massima consentita per qualsiasi istruzione." -#: utils/misc/guc.c:2256 utils/misc/guc.c:2267 utils/misc/guc.c:2278 +#: 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 "Il valore 0 disabilita il timeout." -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2666 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Imposta la durata massima consentita di qualsiasi attesa per un lock." -#: utils/misc/guc.c:2277 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "Imposta la durata massima permessa per ogni transazione inattiva." +#: utils/misc/guc.c:2677 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "Imposta il tempo di inattività massimo consentito tra le query, durante una transazione." -#: utils/misc/guc.c:2288 +#: utils/misc/guc.c:2688 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "Imposta il tempo di inattività massimo consentito tra le query, quando non è in una transazione." + +#: utils/misc/guc.c:2699 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Anzianità minima alla quale il VACUUM deve congelare una riga di tabella." -#: utils/misc/guc.c:2298 +#: utils/misc/guc.c:2709 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Anzianità alla quale il VACUUM deve scandire l'intera tabella per congelarne le tuple." -#: utils/misc/guc.c:2308 +#: utils/misc/guc.c:2719 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Anzianità minima alla quale VACUUM deve congelare un MultiXactId in una riga di tabella." -#: utils/misc/guc.c:2318 +#: utils/misc/guc.c:2729 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Anzianità del multixact alla quale VACUUM deve scandire tutta la tabella per congelare le tuple." -#: utils/misc/guc.c:2328 +#: utils/misc/guc.c:2739 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Numero di transazioni per cui VACUUM e pulizia HOT devono essere deferibili, se impostata." -#: utils/misc/guc.c:2341 +#: utils/misc/guc.c:2748 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Età in cui VACUUM dovrebbe attivare il failsafe per evitare un'interruzione avvolgente." + +#: utils/misc/guc.c:2757 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Età multipla in cui VACUUM dovrebbe attivare il failsafe per evitare un'interruzione avvolgente." + +#: utils/misc/guc.c:2770 msgid "Sets the maximum number of locks per transaction." msgstr "Definisce il numero massimo di lock per transazione." -#: utils/misc/guc.c:2342 +#: 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 "La tabella degli shared lock è dimensionata secondo l'assunzione che al massimo max_locks_per_transaction * max_connections distinti oggetti avranno bisogni di essere lockati in un determinato istante." -#: utils/misc/guc.c:2353 +#: utils/misc/guc.c:2782 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Imposta il numero massimo di lock di predicato per transazione." -#: utils/misc/guc.c:2354 +#: 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 "La tabella dei lock di predicato è dimensionata secondo l'assunzione che al massimo max_pred_locks_per_transaction * max_connections distinti oggetti avranno bisogni di essere lockati in un determinato istante." -#: utils/misc/guc.c:2365 +#: utils/misc/guc.c:2794 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Imposta il numero di pagine e tuple bloccate da lock di predicato per relazione." -#: utils/misc/guc.c:2366 +#: 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 "Se più di questo numero totale di pagine e tuple nella stessa relazione sono bloccate da una connessione, questi lock verranno sostituiti da un lock a livello di relazione." -#: utils/misc/guc.c:2376 +#: utils/misc/guc.c:2805 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Imposta il numero massimo di tuple bloccate da lock di predicato per pagina." -#: utils/misc/guc.c:2377 +#: 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 "Se più di questo numero di tuple nella stessa pagina sono bloccate da una connessione, questi lock verranno sostituiti da un lock a livello di pagina." -#: utils/misc/guc.c:2387 +#: utils/misc/guc.c:2816 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Imposta il tempo massimo consentito per completare l'autenticazione del client." -#: utils/misc/guc.c:2399 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Attendi N secondi all'avvio della connessione prima dell'autenticazione." +#: utils/misc/guc.c:2828 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Imposta il tempo di attesa prima dell'autenticazione all'avvio della connessione." -#: utils/misc/guc.c:2410 -msgid "Sets the number of WAL files held for standby servers." -msgstr "Imposta il numero di file WAL trattenuti dai server in standby." +#: utils/misc/guc.c:2840 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Dimensione del buffer per la lettura in avanti nel WAL durante il ripristino." -#: utils/misc/guc.c:2420 +#: utils/misc/guc.c:2841 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Distanza massima da leggere in anticipo nel WAL per precaricare i blocchi di dati di riferimento." + +#: utils/misc/guc.c:2851 +msgid "Sets the size of WAL files held for standby servers." +msgstr "Imposta la dimensione dei file WAL conservati per i server in standby." + +#: utils/misc/guc.c:2862 msgid "Sets the minimum size to shrink the WAL to." msgstr "Imposta la dimensione minima a cui ridurre il file WAL." -#: utils/misc/guc.c:2432 +#: utils/misc/guc.c:2874 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Imosta la dimensione del WAL che fa scattare un checkpoint." -#: utils/misc/guc.c:2444 +#: utils/misc/guc.c:2886 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Imposta il tempo massimo intercorrente fra due checkpoint automatici del WAL." -#: utils/misc/guc.c:2455 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "Abilita gli avvertimenti se i segmenti dei checkpoint sono riempiti più frequentemente di questo valore." +#: utils/misc/guc.c:2897 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "Imposta il tempo massimo prima dell'avviso se i checkpoint attivati ​​dal volume WAL si verificano troppo frequentemente." -#: utils/misc/guc.c:2457 -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 "Scrive un messaggio nel log del server se i checkpoint dovuti al riempimento dei file dei segmenti dei checkpoint avvengono più frequentemente di questo numero di secondi. Il valore 0 (zero) disabilita questi avvisi." +#: 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 "Scrivere un messaggio nel registro del server se i checkpoint causati dal riempimento dei file di segmento WAL si verificano più frequentemente di questo lasso di tempo. Zero disattiva l'avviso." -#: utils/misc/guc.c:2469 utils/misc/guc.c:2626 utils/misc/guc.c:2654 +#: 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 "Numerp di pagine dopo il quale le scritture effettuate in precedenza sono scaricate su disco." -#: utils/misc/guc.c:2480 +#: utils/misc/guc.c:2923 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Imposta il numero di buffer delle pagine su disco in shared memory per il WAL." -#: utils/misc/guc.c:2491 +#: utils/misc/guc.c:2934 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Tempo tra due flush del WAL effettuati dal processo di scrittura WAL." -#: utils/misc/guc.c:2502 +#: utils/misc/guc.c:2945 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Quantità di WAL da emettere dal processo di scrittura per far scattare un flush." -#: utils/misc/guc.c:2514 +#: utils/misc/guc.c:2956 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "Dimensione minima del nuovo file da fsync invece di scrivere WAL." + +#: utils/misc/guc.c:2967 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Imposta il numero massimo di processi WAL sender in esecuzione simultanea." -#: utils/misc/guc.c:2525 +#: utils/misc/guc.c:2978 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Imposta il numero massimo di slot di replica definiti simultaneamente." -#: utils/misc/guc.c:2535 +#: utils/misc/guc.c:2988 +msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgstr "Imposta la dimensione WAL massima che può essere riservata dagli slot di replica." + +#: 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 "Gli slot di replica verranno contrassegnati come non riusciti e i segmenti verranno rilasciati per l'eliminazione o il riciclaggio, se questo spazio è occupato da WAL su disco." + +#: utils/misc/guc.c:3001 msgid "Sets the maximum time to wait for WAL replication." msgstr "Imposta il tempo di attesa massimo per una replica WAL." -#: utils/misc/guc.c:2546 +#: utils/misc/guc.c:3012 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Imposta il ritardo in microsecondi tra il commit della transazione e il flushing del WAL su disco." -#: utils/misc/guc.c:2558 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "Imposta il numero minimo di transazioni concorrenti aperte prima di eseguire un commit_delay" +#: utils/misc/guc.c:3024 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "Imposta il numero minimo di transazioni aperte simultanee richieste prima di eseguire commit_delay." -#: utils/misc/guc.c:2569 +#: utils/misc/guc.c:3035 msgid "Sets the number of digits displayed for floating-point values." msgstr "Imposta il numero di cifre visualizzate per i valori in virgola mobile." -#: utils/misc/guc.c:2570 -msgid "This affects real, double precision, and geometric data types. The parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate)." -msgstr "Ciò ha effetto sui tipi di dati real, double precision e geometrici. Il valore del parametro è sommato al numero standard di cifre (FLT_DIG o DBL_DIG a seconda dei casi)." +#: 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 "Ciò influisce sui tipi di dati reali, a doppia precisione e geometrici. Un valore di parametro zero o negativo viene aggiunto al numero standard di cifre (FLT_DIG o DBL_DIG a seconda dei casi). Qualsiasi valore maggiore di zero seleziona la modalità di uscita precisa." + +#: 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 "Imposta il tempo di esecuzione minimo al di sopra del quale verrà registrato un campione di istruzioni. Il campionamento è determinato da log_statement_sample_rate." + +#: utils/misc/guc.c:3051 +msgid "Zero logs a sample of all queries. -1 turns this feature off." +msgstr "Zero registra un campione di tutte le query. -1 disattiva questa funzione." -#: utils/misc/guc.c:2581 -msgid "Sets the minimum execution time above which statements will be logged." -msgstr "Imposta il tempo minimo di esecuzione oltre il quale le istruzioni vengono registrate nel log." +#: utils/misc/guc.c:3061 +msgid "Sets the minimum execution time above which all statements will be logged." +msgstr "Imposta il tempo di esecuzione minimo al di sopra del quale verranno registrate tutte le istruzioni." -#: utils/misc/guc.c:2583 +#: utils/misc/guc.c:3063 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Il valore 0 (zero) fa sì che tutte le query siano registrate. Il valore -1 disabilita questa caratteristica." -#: utils/misc/guc.c:2593 +#: utils/misc/guc.c:3073 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Imposta il tempo minimo di esecuzione oltre il quale le azioni dell'autovacuum vengono registrate nel log." -#: utils/misc/guc.c:2595 +#: utils/misc/guc.c:3075 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Il valore 0 (zero) fa sì che tutte le azioni siano registrate. Il valore -1 disabilita il logging dell'autovacuum." -#: utils/misc/guc.c:2605 +#: utils/misc/guc.c:3085 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "Imposta la lunghezza massima in byte di dati registrati per i valori dei parametri di collegamento durante la registrazione delle istruzioni." + +#: utils/misc/guc.c:3087 utils/misc/guc.c:3099 +msgid "-1 to print values in full." +msgstr "-1 per stampare i valori per intero." + +#: 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 "Imposta la lunghezza massima in byte di dati registrati per i valori dei parametri di collegamento durante la registrazione delle istruzioni, in caso di errore." + +#: utils/misc/guc.c:3109 msgid "Background writer sleep time between rounds." msgstr "Il tempo di pausa fra due tornate del background writer." -#: utils/misc/guc.c:2616 +#: utils/misc/guc.c:3120 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Il numero massimo di pagine LRU che il background writer scarica ad ogni tornata." -#: utils/misc/guc.c:2639 +#: utils/misc/guc.c:3143 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Il numero di richieste simultanee che possono essere gestite con efficienza dal sottosistema a dischi." -#: utils/misc/guc.c:2640 -msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -msgstr "Per i sistemi RAID, questo valore è pari all'incirca al numero di dischi fisici nell'array." +#: utils/misc/guc.c:3161 +msgid "A variant of effective_io_concurrency that is used for maintenance work." +msgstr "Una variante di Effective_io_concurrency utilizzata per i lavori di manutenzione." -#: utils/misc/guc.c:2667 +#: utils/misc/guc.c:3191 msgid "Maximum number of concurrent worker processes." msgstr "Numero massimo di processi worker concorrenti." -#: utils/misc/guc.c:2679 +#: utils/misc/guc.c:3203 msgid "Maximum number of logical replication worker processes." msgstr "Numero massimo di processi worker di replica logica." -#: utils/misc/guc.c:2691 +#: utils/misc/guc.c:3215 msgid "Maximum number of table synchronization workers per subscription." msgstr "Numero massimo di processi worker di sincronizzazione per sottoscrizione." -#: utils/misc/guc.c:2701 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "La rotazione automatica dei log avviene dopo N minuti." +#: utils/misc/guc.c:3225 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Imposta il tempo di attesa prima di forzare la rotazione del file di registro." -#: utils/misc/guc.c:2712 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "La rotazione automatica dei log avviene dopo N kilobyte." +#: utils/misc/guc.c:3237 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Imposta la dimensione massima che un file di registro può raggiungere prima di essere ruotato." -#: utils/misc/guc.c:2723 +#: utils/misc/guc.c:3249 msgid "Shows the maximum number of function arguments." msgstr "Mostra il numero massimo di argomenti delle funzioni." -#: utils/misc/guc.c:2734 +#: utils/misc/guc.c:3260 msgid "Shows the maximum number of index keys." msgstr "Mostra il numero massimo di chiavi degli indici." -#: utils/misc/guc.c:2745 +#: utils/misc/guc.c:3271 msgid "Shows the maximum identifier length." msgstr "Mostra la lunghezza massima per gli identificatori." -#: utils/misc/guc.c:2756 +#: utils/misc/guc.c:3282 msgid "Shows the size of a disk block." msgstr "Mostra la dimensione di un blocco su disco." -#: utils/misc/guc.c:2767 +#: utils/misc/guc.c:3293 msgid "Shows the number of pages per disk file." msgstr "Mostra il numero di pagine per file su disco." -#: utils/misc/guc.c:2778 +#: utils/misc/guc.c:3304 msgid "Shows the block size in the write ahead log." msgstr "Mostra la dimensione del log di write ahead." -#: utils/misc/guc.c:2789 +#: utils/misc/guc.c:3315 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Imposta il tempo di attesa prima di riprovare a recuperare un WAL dopo un tentativo fallito." -#: utils/misc/guc.c:2801 +#: utils/misc/guc.c:3327 msgid "Shows the size of write ahead log segments." -msgstr "Mostra la dimensione dei segmenti del log di write ahead" +msgstr "Mostra la dimensione dei segmenti del log di write ahead." -#: utils/misc/guc.c:2814 +#: utils/misc/guc.c:3340 msgid "Time to sleep between autovacuum runs." msgstr "Tempo di pausa fra due esecuzioni di autovacuum." -#: utils/misc/guc.c:2824 +#: utils/misc/guc.c:3350 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Numero minimo di modifiche o cancellazioni di tuple prima dell'esecuzione di un autovacuum." -#: utils/misc/guc.c:2833 +#: utils/misc/guc.c:3359 +msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." +msgstr "Numero minimo di inserti tupla prima del vuoto, o -1 per disabilitare gli inserti sottovuoto." + +#: utils/misc/guc.c:3368 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Numero minimo di inserimenti, modifiche o cancellazioni di tuple prima dell'esecuzione di un analyze." -#: utils/misc/guc.c:2843 +#: utils/misc/guc.c:3378 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Anzianità alla quale eseguire un autovacuum su una tabella per prevenire il wraparound dell'ID delle transazioni." -#: utils/misc/guc.c:2854 +#: utils/misc/guc.c:3390 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Anzianità multixaxt a cui eseguire l'autovacuum di una tabella per prevenire il wraparound del multixact." -#: utils/misc/guc.c:2864 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Imposta il numero massimo dei processi worker dell'autovacuum in esecuzione contemporanea." -#: utils/misc/guc.c:2874 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Imposta il numero massimo di processi paralleli per operazioni di manutenzione." -#: utils/misc/guc.c:2884 +#: utils/misc/guc.c:3420 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Imposta il numero massimo di processi paralleli per nodo di esecuzione." -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:3431 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Imposta il numero massimo di worker paralleli che possono essere attivi contemporaneamente." -#: utils/misc/guc.c:2904 +#: utils/misc/guc.c:3442 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Imposta la memoria massima utilizzabile da ogni processo autovacuum." -#: utils/misc/guc.c:2915 +#: utils/misc/guc.c:3453 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Tempo prima che uno snapshot sia troppo vecchio per leggere le pagine cambiate dopo che era stato effettuato." -#: utils/misc/guc.c:2916 +#: utils/misc/guc.c:3454 msgid "A value of -1 disables this feature." msgstr "Il valore -1 disabilita questa feature." -#: utils/misc/guc.c:2926 +#: utils/misc/guc.c:3464 msgid "Time between issuing TCP keepalives." msgstr "Tempo di attesa fra due keepalive TCP." -#: utils/misc/guc.c:2927 utils/misc/guc.c:2938 +#: 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 "Il valore 0 (zero) fa sì che si applichi il valore predefinito di sistema." -#: utils/misc/guc.c:2937 +#: utils/misc/guc.c:3475 msgid "Time between TCP keepalive retransmits." msgstr "Tempo che intercorre fra due ritrasmissioni del keepalive TCP." -#: utils/misc/guc.c:2948 +#: utils/misc/guc.c:3486 msgid "SSL renegotiation is no longer supported; this can only be 0." -msgstr "Il rinegoziamento SSL non è più supportato: può essere solo 0." - -#: utils/misc/guc.c:2959 -msgid "Maximum number of TCP keepalive retransmits." -msgstr "Numero massimo di ritrasmissioni del keepalive TCP." - -#: utils/misc/guc.c:2960 -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 "Ciò controlla il numero di ritrasmissioni consecutive del keepalive che possono andare perdute prima che una connessione sia considerata morta. Il valore 0 (zero) fa sì che si applichi il valore predefinito di sistema." - -#: utils/misc/guc.c:2971 -msgid "Sets the maximum allowed result for exact search by GIN." -msgstr "Imposta il risultato massimo consentito per le ricerche esatte tramite GIN." - -#: utils/misc/guc.c:2982 -msgid "Sets the planner's assumption about the size of the disk cache." -msgstr "Imposta le assunzioni del planner in merito alla dimensione della cache dei dischi." - -#: utils/misc/guc.c:2983 -msgid "That is, the portion of the kernel's disk cache that will be used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." -msgstr "Cioè la porzione della cache dei dischi nel kernel che sarà usata per i file dati di PostgreSQL. Viene misurata in pagine disco, che normalmente sono da 8 KB ciascuna." - -#: utils/misc/guc.c:2995 -msgid "Sets the minimum amount of table data for a parallel scan." -msgstr "Imposta la quantità minima di dati di una tabella per uno scan parallelo." - -#: utils/misc/guc.c:2996 -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 "Se il planner stima che leggerà un numero di pagine di tabella troppo basso per raggiungere questo limite, non verrà preso in considerazione uno scan parallelo." - -#: utils/misc/guc.c:3006 -msgid "Sets the minimum amount of index data for a parallel scan." -msgstr "Imposta la quantità minima di dati di un indice per uno scan parallelo." - -#: utils/misc/guc.c:3007 -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 "Se il planner stima che leggerà un numero di pagine di indice troppo basso per raggiungere questo limite, non verrà preso in considerazione uno scan parallelo." - -#: utils/misc/guc.c:3018 -msgid "Shows the server version as an integer." -msgstr "Mostra la versione del server come un intero." - -#: utils/misc/guc.c:3029 -msgid "Log the use of temporary files larger than this number of kilobytes." -msgstr "Registra nel log l'uso di file temporanei più grandi di questo numero di kilobyte." - -#: utils/misc/guc.c:3030 -msgid "Zero logs all files. The default is -1 (turning this feature off)." -msgstr "Il valore 0 (zero) fa registrare tutti i file. Il default è -1 (che disabilita la registrazione)." - -#: utils/misc/guc.c:3040 -msgid "Sets the size reserved for pg_stat_activity.query, in bytes." -msgstr "Imposta la dimensione in byte riservata a pg_stat_activity.query." - -#: utils/misc/guc.c:3051 -msgid "Sets the maximum size of the pending list for GIN index." -msgstr "Imposta la dimensione massima della lista di attesa per gli indici GIN." - -#: utils/misc/guc.c:3071 -msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." -msgstr "Imposta la stima del planner del costo di una pagina di disco letta sequenzialmente." - -#: utils/misc/guc.c:3081 -msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." -msgstr "Imposta la stima del planner del costo di una pagina di disco letta non sequenzialmente." - -#: utils/misc/guc.c:3091 -msgid "Sets the planner's estimate of the cost of processing each tuple (row)." -msgstr "Imposta la stima del planner del costo di elaborazione di ogni tupla (riga)." - -#: utils/misc/guc.c:3101 -msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." -msgstr "Imposta la stima del il planner del costo di elaborazione di un singolo elemento di indice durante una scansione di indice." - -#: utils/misc/guc.c:3111 -msgid "Sets the planner's estimate of the cost of processing each operator or function call." -msgstr "Imposta la stima del planner del costo di elaborazione di un singolo operatore o chiamata di funzione." - -#: utils/misc/guc.c:3121 -msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to master backend." -msgstr "Imposta la stima del planner del costo di passare ogni tupla (riga) dal worker al backend master." - -#: utils/misc/guc.c:3131 -msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." -msgstr "Imposta la stima del planner del costo di avvio dei processi worker per una query parallela." - -#: utils/misc/guc.c:3142 -msgid "Perform JIT compilation if query is more expensive." -msgstr "Effettua la compilazione JIT se la query è più costosa." - -#: utils/misc/guc.c:3143 -msgid "-1 disables JIT compilation." -msgstr "-1 disabilita la compilazione JIT." - -#: utils/misc/guc.c:3152 -msgid "Optimize JITed functions if query is more expensive." -msgstr "Ottimizza le funzioni compilate con JIT se la query è più costosa." - -#: utils/misc/guc.c:3153 -msgid "-1 disables optimization." -msgstr "-1 disabilita l'ottimizzazione." - -#: utils/misc/guc.c:3162 -msgid "Perform JIT inlining if query is more expensive." -msgstr "Effettua l'inlining JIT se la query è più costosa." - -#: utils/misc/guc.c:3163 -msgid "-1 disables inlining." -msgstr "-1 disabilita l'inlining." - -#: utils/misc/guc.c:3172 -msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." -msgstr "Imposta la stima del planner della frazione delle righe di un cursore che verranno lette." - -#: utils/misc/guc.c:3183 -msgid "GEQO: selective pressure within the population." -msgstr "GEQO: pressione selettiva all'interno della popolazione." - -#: utils/misc/guc.c:3193 -msgid "GEQO: seed for random path selection." -msgstr "GEQO: seme per la selezione casuale dei percorsi." - -#: utils/misc/guc.c:3203 -msgid "Multiple of the average buffer usage to free per round." -msgstr "Multiplo dell'utilizzo medio dei buffer da liberarsi ad ogni giro." - -#: utils/misc/guc.c:3213 -msgid "Sets the seed for random-number generation." -msgstr "Imposta il seme per la generazione di numeri casuali." - -#: utils/misc/guc.c:3224 -msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." -msgstr "Il numero di modifiche o cancellazioni di tuple prima di un VACUUM, come frazione di reltuples." - -#: utils/misc/guc.c:3233 -msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." -msgstr "Numero di inserimenti, modifiche o cancellazioni di tuple prima di un ANALYZE, come frazione di reltuples." - -#: utils/misc/guc.c:3243 -msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." -msgstr "Il tempo speso nell'eseguire il flush dei buffer sporchi durante i checkpoint, come frazione dell'intervallo di checkpoint." - -#: utils/misc/guc.c:3253 -msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "Numero di inserimenti di tuple prima della pulizia dell'indice come frazione di reltuples." - -#: utils/misc/guc.c:3272 -msgid "Sets the shell command that will be called to archive a WAL file." -msgstr "Imposta il comando di shell che verrà eseguito per archiviare un file WAL." - -#: utils/misc/guc.c:3282 -msgid "Sets the client's character set encoding." -msgstr "Imposta la codifica dei caratteri del client." - -#: utils/misc/guc.c:3293 -msgid "Controls information prefixed to each log line." -msgstr "Controlla l'informazione usata come prefisso per ogni riga di log." - -#: utils/misc/guc.c:3294 -msgid "If blank, no prefix is used." -msgstr "Se lasciata vuota non sarà usato alcun prefisso." - -#: utils/misc/guc.c:3303 -msgid "Sets the time zone to use in log messages." -msgstr "Imposta il fuso orario da usarsi nei messaggi di log." - -#: utils/misc/guc.c:3313 -msgid "Sets the display format for date and time values." -msgstr "Imposta il formato per la visualizzazione dei valori di data e ora." - -#: utils/misc/guc.c:3314 -msgid "Also controls interpretation of ambiguous date inputs." -msgstr "Controlla anche l'interpretazione di input ambigui per le date." - -#: utils/misc/guc.c:3325 -msgid "Sets the default tablespace to create tables and indexes in." -msgstr "Imposta il tablespace di default in cui create tabelle e indici." - -#: utils/misc/guc.c:3326 -msgid "An empty string selects the database's default tablespace." -msgstr "Una stringa vuota selezione il tablespace predefinito del database." - -#: utils/misc/guc.c:3336 -msgid "Sets the tablespace(s) to use for temporary tables and sort files." -msgstr "Definisce i(l) tablespace da usarsi per le tabelle temporanee e i file di ordinamento." - -#: utils/misc/guc.c:3347 -msgid "Sets the path for dynamically loadable modules." -msgstr "Definisce il percorso per i moduli caricabili dinamicamente." - -#: utils/misc/guc.c:3348 -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 "Se si deve aprire un modulo caricabile dinamicamente e il nome specificato non contiene un percorso di directory (se non contiene uno slash) il sistema cercherà il file specificato in questo percorso." - -#: utils/misc/guc.c:3361 -msgid "Sets the location of the Kerberos server key file." -msgstr "Imposta la posizione del key file del server Kerberos." - -#: utils/misc/guc.c:3372 -msgid "Sets the Bonjour service name." -msgstr "Imposta il nome del servizio Bonjour." - -#: utils/misc/guc.c:3384 -msgid "Shows the collation order locale." -msgstr "Mostra la localizzazione dell'ordine di collazione." - -#: utils/misc/guc.c:3395 -msgid "Shows the character classification and case conversion locale." -msgstr "Mostra la localizzazione per la classificazione dei caratteri e la conversione maiuscole/minuscole." - -#: utils/misc/guc.c:3406 -msgid "Sets the language in which messages are displayed." -msgstr "Mostra la lingua in cui i messaggi sono visualizzati." - -#: utils/misc/guc.c:3416 -msgid "Sets the locale for formatting monetary amounts." -msgstr "Imposta la localizzazione per la formattazione delle quantità monetarie." - -#: utils/misc/guc.c:3426 -msgid "Sets the locale for formatting numbers." -msgstr "Imposta la localizzazione per la formattazione dei numeri." - -#: utils/misc/guc.c:3436 -msgid "Sets the locale for formatting date and time values." -msgstr "Imposta la localizzazione per la formattazione per i valori di tipo data e ora." +msgstr "Il rinegoziamento SSL non è più supportato: può essere solo 0." -#: utils/misc/guc.c:3446 -msgid "Lists shared libraries to preload into each backend." -msgstr "Imposta la lista delle librerie condivise da precaricare on ogni backend." +#: utils/misc/guc.c:3497 +msgid "Maximum number of TCP keepalive retransmits." +msgstr "Numero massimo di ritrasmissioni del keepalive TCP." -#: utils/misc/guc.c:3457 -msgid "Lists shared libraries to preload into server." -msgstr "Imposta la lista delle librerie condivise da precaricare nel server." +#: utils/misc/guc.c:3498 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "Numero di ritrasmissioni keep-alive consecutive che possono essere perse prima che una connessione venga considerata morta. Un valore di 0 utilizza l'impostazione predefinita del sistema." -#: utils/misc/guc.c:3468 -msgid "Lists unprivileged shared libraries to preload into each backend." -msgstr "Imposta la lista delle librarie condivise non privilegiate da precaricare in ogni backend." +#: utils/misc/guc.c:3509 +msgid "Sets the maximum allowed result for exact search by GIN." +msgstr "Imposta il risultato massimo consentito per le ricerche esatte tramite GIN." -#: utils/misc/guc.c:3479 -msgid "Sets the schema search order for names that are not schema-qualified." -msgstr "Imposta l'ordine di ricerca degli schema per i nomi che non hanno un qualifica di schema." +#: utils/misc/guc.c:3520 +msgid "Sets the planner's assumption about the total size of the data caches." +msgstr "Imposta l'ipotesi del pianificatore sulla dimensione totale delle cache di dati." -#: utils/misc/guc.c:3491 -msgid "Sets the server (database) character set encoding." -msgstr "Imposta la codifica del set di caratteri per il server (database)." +#: 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 "Cioè, la dimensione totale delle cache (cache del kernel e buffer condivisi) utilizzate per i file di dati PostgreSQL. Questo è misurato in pagine del disco, che normalmente sono 8 kB ciascuna." -#: utils/misc/guc.c:3503 -msgid "Shows the server version." -msgstr "Mostra la versione del server." +#: utils/misc/guc.c:3532 +msgid "Sets the minimum amount of table data for a parallel scan." +msgstr "Imposta la quantità minima di dati di una tabella per uno scan parallelo." -#: utils/misc/guc.c:3515 -msgid "Sets the current role." -msgstr "Mostra il ruolo corrente." +#: 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 "Se il planner stima che leggerà un numero di pagine di tabella troppo basso per raggiungere questo limite, non verrà preso in considerazione uno scan parallelo." -#: utils/misc/guc.c:3527 -msgid "Sets the session user name." -msgstr "Mostra il nome dell'utente della sessione." +#: utils/misc/guc.c:3543 +msgid "Sets the minimum amount of index data for a parallel scan." +msgstr "Imposta la quantità minima di dati di un indice per uno scan parallelo." -#: utils/misc/guc.c:3538 -msgid "Sets the destination for server log output." -msgstr "Imposta la destinazione per l'output dei log del server." +#: 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 "Se il planner stima che leggerà un numero di pagine di indice troppo basso per raggiungere questo limite, non verrà preso in considerazione uno scan parallelo." -#: utils/misc/guc.c:3539 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." -msgstr "I valori validi sono combinazioni di \"stderr\", \"syslog\", \"csvlog\" ed \"eventlog\", a seconda delle piattaforme." +#: utils/misc/guc.c:3555 +msgid "Shows the server version as an integer." +msgstr "Mostra la versione del server come un intero." -#: utils/misc/guc.c:3550 -msgid "Sets the destination directory for log files." -msgstr "Imposta la directory di destinazione dei file di log." +#: utils/misc/guc.c:3566 +msgid "Log the use of temporary files larger than this number of kilobytes." +msgstr "Registra nel log l'uso di file temporanei più grandi di questo numero di kilobyte." -#: utils/misc/guc.c:3551 -msgid "Can be specified as relative to the data directory or as absolute path." -msgstr "Può essere specificata sia come relativa alla directory data sia come percorso assoluto." +#: utils/misc/guc.c:3567 +msgid "Zero logs all files. The default is -1 (turning this feature off)." +msgstr "Il valore 0 (zero) fa registrare tutti i file. Il default è -1 (che disabilita la registrazione)." -#: utils/misc/guc.c:3561 -msgid "Sets the file name pattern for log files." -msgstr "Imposta il pattern dei nomi dei file di log." +#: utils/misc/guc.c:3577 +msgid "Sets the size reserved for pg_stat_activity.query, in bytes." +msgstr "Imposta la dimensione in byte riservata a pg_stat_activity.query." -#: utils/misc/guc.c:3572 -msgid "Sets the program name used to identify PostgreSQL messages in syslog." -msgstr "Imposta il nome del programma da utilizzato per identificare i messaggi di PostgreSQL in syslog." +#: utils/misc/guc.c:3588 +msgid "Sets the maximum size of the pending list for GIN index." +msgstr "Imposta la dimensione massima della lista di attesa per gli indici GIN." -#: utils/misc/guc.c:3583 -msgid "Sets the application name used to identify PostgreSQL messages in the event log." -msgstr "Imposta il nome del programma da usarsi per identificare i messaggi di PostgreSQL nel registro degli eventi." +#: utils/misc/guc.c:3599 +msgid "TCP user timeout." +msgstr "Timeout utente TCP." -#: utils/misc/guc.c:3594 -msgid "Sets the time zone for displaying and interpreting time stamps." -msgstr "Imposta il fuso orario per visualizzare ed interpretare gli orari." +#: utils/misc/guc.c:3610 +msgid "The size of huge page that should be requested." +msgstr "La dimensione della pagina enorme che dovrebbe essere richiesta." -#: utils/misc/guc.c:3604 -msgid "Selects a file of time zone abbreviations." -msgstr "Seleziona un file contenente le abbreviazioni dei fusi orari." +#: utils/misc/guc.c:3621 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "Svuota in modo aggressivo le cache di sistema a scopo di debug." -#: utils/misc/guc.c:3614 -msgid "Sets the current transaction's isolation level." -msgstr "Imposta il livello di isolamento per la transazione in corso." +#: utils/misc/guc.c:3644 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "Imposta l'intervallo di tempo tra i controlli per la disconnessione durante l'esecuzione delle query." -#: utils/misc/guc.c:3625 -msgid "Sets the owning group of the Unix-domain socket." -msgstr "Imposta il gruppo di appartenenza per i socket di dominio Unix." +#: utils/misc/guc.c:3655 +msgid "Time between progress updates for long-running startup operations." +msgstr "Tempo tra gli aggiornamenti di avanzamento per le operazioni di avvio di lunga durata." -#: utils/misc/guc.c:3626 -msgid "The owning user of the socket is always the user that starts the server." -msgstr "L'utente che possiede il socket è sempre l'utente che ha avviato il server." +#: utils/misc/guc.c:3657 +msgid "0 turns this feature off." +msgstr "0 disattiva questa funzione." -#: utils/misc/guc.c:3636 -msgid "Sets the directories where Unix-domain sockets will be created." -msgstr "Imposta la directory dove i socket di dominio Unix verranno creati." +#: utils/misc/guc.c:3676 +msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." +msgstr "Imposta la stima del planner del costo di una pagina di disco letta sequenzialmente." -#: utils/misc/guc.c:3651 -msgid "Sets the host name or IP address(es) to listen to." -msgstr "Imposta il nome host o gli indirizzi IP su cui ascoltare." +#: utils/misc/guc.c:3687 +msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." +msgstr "Imposta la stima del planner del costo di una pagina di disco letta non sequenzialmente." -#: utils/misc/guc.c:3666 -msgid "Sets the server's data directory." -msgstr "Imposta la posizione della directory dati" +#: utils/misc/guc.c:3698 +msgid "Sets the planner's estimate of the cost of processing each tuple (row)." +msgstr "Imposta la stima del planner del costo di elaborazione di ogni tupla (riga)." -#: utils/misc/guc.c:3677 -msgid "Sets the server's main configuration file." -msgstr "Imposta il file primario di configurazione del server." +#: utils/misc/guc.c:3709 +msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." +msgstr "Imposta la stima del il planner del costo di elaborazione di un singolo elemento di indice durante una scansione di indice." -#: utils/misc/guc.c:3688 -msgid "Sets the server's \"hba\" configuration file." -msgstr "Imposta il file di configurazione \"hba\" del server." +#: utils/misc/guc.c:3720 +msgid "Sets the planner's estimate of the cost of processing each operator or function call." +msgstr "Imposta la stima del planner del costo di elaborazione di un singolo operatore o chiamata di funzione." -#: utils/misc/guc.c:3699 -msgid "Sets the server's \"ident\" configuration file." -msgstr "Imposta il file di configurazione \"ident\" del server." +#: 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 "Imposta la stima del pianificatore del costo del passaggio di ogni tupla (riga) dal lavoratore al leader back-end." -#: utils/misc/guc.c:3710 -msgid "Writes the postmaster PID to the specified file." -msgstr "Scrivi il PID del postmaster nel file specificato." +#: utils/misc/guc.c:3742 +msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." +msgstr "Imposta la stima del planner del costo di avvio dei processi worker per una query parallela." -#: utils/misc/guc.c:3721 -msgid "Location of the SSL server certificate file." -msgstr "Posizione del file di certificati del server SSL." +#: utils/misc/guc.c:3754 +msgid "Perform JIT compilation if query is more expensive." +msgstr "Effettua la compilazione JIT se la query è più costosa." -#: utils/misc/guc.c:3731 -msgid "Location of the SSL server private key file." -msgstr "Posizione del file della chiave privata del server SSL." +#: utils/misc/guc.c:3755 +msgid "-1 disables JIT compilation." +msgstr "-1 disabilita la compilazione JIT." -#: utils/misc/guc.c:3741 -msgid "Location of the SSL certificate authority file." -msgstr "Posizione del file di autorità dei certificati del server SSL." +#: utils/misc/guc.c:3765 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "Ottimizza le funzioni compilate da JIT se la query è più costosa." -#: utils/misc/guc.c:3751 -msgid "Location of the SSL certificate revocation list file." -msgstr "Posizione del file della lista di revoche di certificati SSL." +#: utils/misc/guc.c:3766 +msgid "-1 disables optimization." +msgstr "-1 disabilita l'ottimizzazione." -#: utils/misc/guc.c:3761 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Scrive i file di statistiche temporanee nella directory specificata." +#: utils/misc/guc.c:3776 +msgid "Perform JIT inlining if query is more expensive." +msgstr "Effettua l'inlining JIT se la query è più costosa." -#: utils/misc/guc.c:3772 -msgid "Number of synchronous standbys and list of names of potential synchronous ones." -msgstr "Numero di standby sincroni e lista dei nomi di quelli potenziali sincroni." +#: utils/misc/guc.c:3777 +msgid "-1 disables inlining." +msgstr "-1 disabilita l'inlining." -#: utils/misc/guc.c:3783 -msgid "Sets default text search configuration." -msgstr "Imposta la configurazione di ricerca di testo predefinita." +#: utils/misc/guc.c:3787 +msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +msgstr "Imposta la stima del planner della frazione delle righe di un cursore che verranno lette." -#: utils/misc/guc.c:3793 -msgid "Sets the list of allowed SSL ciphers." -msgstr "Imposta la lista di codici SSL consentiti." +#: utils/misc/guc.c:3799 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Imposta la stima del pianificatore della dimensione media della tabella di lavoro di una query ricorsiva." -#: utils/misc/guc.c:3808 -msgid "Sets the curve to use for ECDH." -msgstr "Imposta la curva da usare per l'ECHD." +#: utils/misc/guc.c:3811 +msgid "GEQO: selective pressure within the population." +msgstr "GEQO: pressione selettiva all'interno della popolazione." -#: utils/misc/guc.c:3823 -msgid "Location of the SSL DH parameters file." -msgstr "Posizione del file di parametri SSH DH." +#: utils/misc/guc.c:3822 +msgid "GEQO: seed for random path selection." +msgstr "GEQO: seme per la selezione casuale dei percorsi." -#: utils/misc/guc.c:3834 -msgid "Command to obtain passphrases for SSL." -msgstr "Comando per ottenere la passphrase per SSL." +#: utils/misc/guc.c:3833 +msgid "Multiple of work_mem to use for hash tables." +msgstr "Multiplo di work_mem da utilizzare per le tabelle hash." #: utils/misc/guc.c:3844 -msgid "Sets the application name to be reported in statistics and logs." -msgstr "Imposta il nome dell'applicazione da riportare nelle statistiche e nei log." +msgid "Multiple of the average buffer usage to free per round." +msgstr "Multiplo dell'utilizzo medio dei buffer da liberarsi ad ogni giro." -#: utils/misc/guc.c:3855 -msgid "Sets the name of the cluster, which is included in the process title." -msgstr "Imposta il nome del cluster, che è incluso nel titolo del processo." +#: utils/misc/guc.c:3854 +msgid "Sets the seed for random-number generation." +msgstr "Imposta il seme per la generazione di numeri casuali." -#: utils/misc/guc.c:3866 -msgid "Sets the WAL resource managers for which WAL consistency checks are done." -msgstr "Imposta i gestori di risorse WAL per cui vengono effettuati i controlli di consistenza WAL." +#: utils/misc/guc.c:3865 +msgid "Vacuum cost delay in milliseconds." +msgstr "Il costo del VACUUM come ritardo in millisecondi." -#: utils/misc/guc.c:3867 -msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." -msgstr "Immagini di pagine complete verranno loggate per tutti i blocchi di dati e comparati con i risultati del replay del WAL." +#: utils/misc/guc.c:3876 +msgid "Vacuum cost delay in milliseconds, for autovacuum." +msgstr "Il costo del VACUUM come ritardo in millisecondi, per l'autovacuum." -#: utils/misc/guc.c:3877 -msgid "JIT provider to use." -msgstr "Fornitore JIT da usare." +#: utils/misc/guc.c:3887 +msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." +msgstr "Il numero di modifiche o cancellazioni di tuple prima di un VACUUM, come frazione di reltuples." #: utils/misc/guc.c:3897 -msgid "Sets whether \"\\'\" is allowed in string literals." -msgstr "Imposta se \"\\'\" è consentito nei letterali stringa." +msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." +msgstr "Numero di inserti di tuple prima del vuoto come frazione di reltuple." #: utils/misc/guc.c:3907 -msgid "Sets the output format for bytea." -msgstr "Imposta il formato di output di bytea." +msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." +msgstr "Numero di inserimenti, modifiche o cancellazioni di tuple prima di un ANALYZE, come frazione di reltuples." #: utils/misc/guc.c:3917 -msgid "Sets the message levels that are sent to the client." -msgstr "Imposta quali livelli di messaggi sono inviati al client" +msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." +msgstr "Il tempo speso nell'eseguire il flush dei buffer sporchi durante i checkpoint, come frazione dell'intervallo di checkpoint." -#: utils/misc/guc.c:3918 utils/misc/guc.c:3971 utils/misc/guc.c:3982 -#: utils/misc/guc.c:4048 -msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." -msgstr "Ogni livello include tutti i livelli che lo seguono. Più avanti il livello, meno messaggi sono inviati." +#: utils/misc/guc.c:3927 +msgid "Fraction of statements exceeding log_min_duration_sample to be logged." +msgstr "Frazione di istruzioni eccedenti log_min_duration_sample da registrare." #: utils/misc/guc.c:3928 -msgid "Enables the planner to use constraints to optimize queries." -msgstr "Permette al planner di usare i vincoli per ottimizzare le query." +msgid "Use a value between 0.0 (never log) and 1.0 (always log)." +msgstr "Utilizzare un valore compreso tra 0,0 (non registrare mai) e 1,0 (registrare sempre)." -#: utils/misc/guc.c:3929 -msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." -msgstr "La scansioni delle tabelle saranno evitate se i loro vincoli garantiscono che nessuna riga corrisponda con la query." +#: utils/misc/guc.c:3937 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "Imposta la frazione di transazioni da cui registrare tutte le istruzioni." -#: utils/misc/guc.c:3939 -msgid "Sets the transaction isolation level of each new transaction." -msgstr "Imposta il livello di isolamento predefinito per ogni nuova transazione." +#: utils/misc/guc.c:3938 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "Utilizzare un valore compreso tra 0,0 (non registrare mai) e 1,0 (registrare tutte le istruzioni per tutte le transazioni)." -#: utils/misc/guc.c:3949 -msgid "Sets the display format for interval values." -msgstr "Imposta il formato di visualizzazione per intervalli." +#: utils/misc/guc.c:3957 +msgid "Sets the shell command that will be called to archive a WAL file." +msgstr "Imposta il comando di shell che verrà eseguito per archiviare un file WAL." -#: utils/misc/guc.c:3960 -msgid "Sets the verbosity of logged messages." -msgstr "Imposta la prolissità dei messaggi registrati." +#: utils/misc/guc.c:3958 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Viene utilizzato solo se \"archive_library\" non è impostato." -#: utils/misc/guc.c:3970 -msgid "Sets the message levels that are logged." -msgstr "Imposta i livelli dei messaggi registrati." +#: utils/misc/guc.c:3967 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Imposta la libreria che verrà chiamata per archiviare un file WAL." -#: utils/misc/guc.c:3981 -msgid "Causes all statements generating error at or above this level to be logged." -msgstr "Fa in modo che tutti gli eventi che generano errore a questo livello o a un livello superiore siano registrati nel log." +#: utils/misc/guc.c:3968 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "Una stringa vuota indica che deve essere utilizzato \"archive_command\"." -#: utils/misc/guc.c:3992 -msgid "Sets the type of statements logged." -msgstr "Imposta il tipo di istruzioni registrato nel log." +#: utils/misc/guc.c:3977 +msgid "Sets the shell command that will be called to retrieve an archived WAL file." +msgstr "Imposta il comando della shell che verrà chiamato per recuperare un file WAL archiviato." -#: utils/misc/guc.c:4002 -msgid "Sets the syslog \"facility\" to be used when syslog enabled." -msgstr "Imposta la \"facility\" da usare quando syslog è abilitato." +#: utils/misc/guc.c:3987 +msgid "Sets the shell command that will be executed at every restart point." +msgstr "Imposta il comando della shell che verrà eseguito ad ogni punto di riavvio." + +#: utils/misc/guc.c:3997 +msgid "Sets the shell command that will be executed once at the end of recovery." +msgstr "Imposta il comando della shell che verrà eseguito una volta al termine del ripristino." + +#: utils/misc/guc.c:4007 +msgid "Specifies the timeline to recover into." +msgstr "Specifica la sequenza temporale in cui eseguire il ripristino." #: utils/misc/guc.c:4017 -msgid "Sets the session's behavior for triggers and rewrite rules." -msgstr "Imposta il comportamento delle sessioni per i trigger e le regole di riscrittura." +msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." +msgstr "Impostare su \"immediato\" per terminare il ripristino non appena viene raggiunto uno stato coerente." -#: utils/misc/guc.c:4027 -msgid "Sets the current transaction's synchronization level." -msgstr "Imposta il livello di sincronizzazione della transazione corrente." +#: utils/misc/guc.c:4026 +msgid "Sets the transaction ID up to which recovery will proceed." +msgstr "Imposta l'ID transazione fino a cui procederà il recupero." -#: utils/misc/guc.c:4037 -msgid "Allows archiving of WAL files using archive_command." -msgstr "Consente l'archiviazione dei file WAL con l'uso di archive_command." +#: utils/misc/guc.c:4035 +msgid "Sets the time stamp up to which recovery will proceed." +msgstr "Imposta il timestamp fino al quale procederà il ripristino." -#: utils/misc/guc.c:4047 -msgid "Enables logging of recovery-related debugging information." -msgstr "Abilita il logging di informazioni di debug relative al recupero." +#: utils/misc/guc.c:4044 +msgid "Sets the named restore point up to which recovery will proceed." +msgstr "Imposta il punto di ripristino denominato fino al quale proseguirà il ripristino." + +#: utils/misc/guc.c:4053 +msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." +msgstr "Imposta l'LSN del percorso del registro write-ahead fino al quale proseguirà il ripristino." #: utils/misc/guc.c:4063 -msgid "Collects function-level statistics on database activity." -msgstr "Raccogli statistiche al livello di funzioni sull'attività del database." +msgid "Specifies a file name whose presence ends recovery in the standby." +msgstr "Specifica un nome file la cui presenza termina il ripristino in standby." #: utils/misc/guc.c:4073 -msgid "Set the level of information written to the WAL." -msgstr "Imposta il livello delle informazioni scritte nel WAL." +msgid "Sets the connection string to be used to connect to the sending server." +msgstr "Imposta la stringa di connessione da utilizzare per la connessione al server di invio." -#: utils/misc/guc.c:4083 -msgid "Selects the dynamic shared memory implementation used." -msgstr "Seleziona l'implementazione di memoria dinamica condivisa utilizzata." +#: utils/misc/guc.c:4084 +msgid "Sets the name of the replication slot to use on the sending server." +msgstr "Imposta il nome dello slot di replica da utilizzare sul server di invio." -#: utils/misc/guc.c:4093 -msgid "Selects the method used for forcing WAL updates to disk." -msgstr "Seleziona il metodo usato per forzare aggiornamenti WAL su disco." +#: utils/misc/guc.c:4094 +msgid "Sets the client's character set encoding." +msgstr "Imposta la codifica dei caratteri del client." -#: utils/misc/guc.c:4103 -msgid "Sets how binary values are to be encoded in XML." -msgstr "imposta come i valori binari devono essere codificati nel formato XML." +#: utils/misc/guc.c:4105 +msgid "Controls information prefixed to each log line." +msgstr "Controlla l'informazione usata come prefisso per ogni riga di log." -#: utils/misc/guc.c:4113 -msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." -msgstr "Imposta se qualunque dato XML nelle operazioni di parsing e serializzazione implicite debba essere considerato come un documento o frammento di un contenuto." +#: utils/misc/guc.c:4106 +msgid "If blank, no prefix is used." +msgstr "Se lasciata vuota non sarà usato alcun prefisso." -#: utils/misc/guc.c:4124 -msgid "Use of huge pages on Linux or Windows." -msgstr "Uso di hige pages su Linux o Windows." +#: utils/misc/guc.c:4115 +msgid "Sets the time zone to use in log messages." +msgstr "Imposta il fuso orario da usarsi nei messaggi di log." -#: utils/misc/guc.c:4134 -msgid "Forces use of parallel query facilities." -msgstr "Forza l'uso delle query parallele." +#: utils/misc/guc.c:4125 +msgid "Sets the display format for date and time values." +msgstr "Imposta il formato per la visualizzazione dei valori di data e ora." -#: utils/misc/guc.c:4135 -msgid "If possible, run query using a parallel worker and with parallel restrictions." -msgstr "Se possibile, effettua le query usando worker paralleli e con restrizioni di parallelismo." +#: utils/misc/guc.c:4126 +msgid "Also controls interpretation of ambiguous date inputs." +msgstr "Controlla anche l'interpretazione di input ambigui per le date." -#: utils/misc/guc.c:4144 -msgid "Encrypt passwords." -msgstr "Cripta le password." +#: utils/misc/guc.c:4137 +msgid "Sets the default table access method for new tables." +msgstr "Imposta il metodo di accesso alle tabelle predefinito per le nuove tabelle." -#: utils/misc/guc.c:4145 -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 "Quando si indica una password in CREATE USER o ALTER USER senza indicare ENCRYPTED o UNENCRYPTED, questo parametro determina se la password debba essere criptata o meno." +#: utils/misc/guc.c:4148 +msgid "Sets the default tablespace to create tables and indexes in." +msgstr "Imposta il tablespace di default in cui create tabelle e indici." -#: utils/misc/guc.c:4947 -#, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: accesso alla directory \"%s\" fallito: %s\n" +#: utils/misc/guc.c:4149 +msgid "An empty string selects the database's default tablespace." +msgstr "Una stringa vuota selezione il tablespace predefinito del database." -#: utils/misc/guc.c:4952 -#, c-format -msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" -msgstr "Esegui initdb o pg_basebackup per inizializzare una directory di dati PostgreSQL.\n" +#: utils/misc/guc.c:4159 +msgid "Sets the tablespace(s) to use for temporary tables and sort files." +msgstr "Definisce i(l) tablespace da usarsi per le tabelle temporanee e i file di ordinamento." -#: utils/misc/guc.c:4972 -#, 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 non sa dove trovare il file di configurazione del server.\n" -"Devi specificare le opzioni --config-file o -D, oppure impostare la variabile d'ambiente PGDATA.\n" +#: utils/misc/guc.c:4170 +msgid "Sets the path for dynamically loadable modules." +msgstr "Definisce il percorso per i moduli caricabili dinamicamente." + +#: 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 "Se si deve aprire un modulo caricabile dinamicamente e il nome specificato non contiene un percorso di directory (se non contiene uno slash) il sistema cercherà il file specificato in questo percorso." + +#: utils/misc/guc.c:4184 +msgid "Sets the location of the Kerberos server key file." +msgstr "Imposta la posizione del key file del server Kerberos." + +#: utils/misc/guc.c:4195 +msgid "Sets the Bonjour service name." +msgstr "Imposta il nome del servizio Bonjour." + +#: utils/misc/guc.c:4207 +msgid "Shows the collation order locale." +msgstr "Mostra la localizzazione dell'ordine di collazione." + +#: utils/misc/guc.c:4218 +msgid "Shows the character classification and case conversion locale." +msgstr "Mostra la localizzazione per la classificazione dei caratteri e la conversione maiuscole/minuscole." + +#: utils/misc/guc.c:4229 +msgid "Sets the language in which messages are displayed." +msgstr "Mostra la lingua in cui i messaggi sono visualizzati." + +#: utils/misc/guc.c:4239 +msgid "Sets the locale for formatting monetary amounts." +msgstr "Imposta la localizzazione per la formattazione delle quantità monetarie." + +#: utils/misc/guc.c:4249 +msgid "Sets the locale for formatting numbers." +msgstr "Imposta la localizzazione per la formattazione dei numeri." -#: utils/misc/guc.c:4991 -#, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: accesso al file di configurazione del server \"%s\" fallito: %s\n" +#: utils/misc/guc.c:4259 +msgid "Sets the locale for formatting date and time values." +msgstr "Imposta la localizzazione per la formattazione per i valori di tipo data e ora." -#: utils/misc/guc.c:5017 -#, 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 non sa dove trovare i dati di sistema del database.\n" -"Possono essere specificati come \"data_directory\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" +#: utils/misc/guc.c:4269 +msgid "Lists shared libraries to preload into each backend." +msgstr "Imposta la lista delle librerie condivise da precaricare on ogni backend." -#: utils/misc/guc.c:5065 -#, 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 non sa dove trovare il file di configurazione \"hba\".\n" -"Può essere specificato come \"hba_file\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" +#: utils/misc/guc.c:4280 +msgid "Lists shared libraries to preload into server." +msgstr "Imposta la lista delle librerie condivise da precaricare nel server." -#: utils/misc/guc.c:5088 -#, 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 non sa dove trovare il file di configurazione \"ident\".\n" -"Può essere specificato come \"ident_file\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" +#: utils/misc/guc.c:4291 +msgid "Lists unprivileged shared libraries to preload into each backend." +msgstr "Imposta la lista delle librarie condivise non privilegiate da precaricare in ogni backend." -#: utils/misc/guc.c:5763 utils/misc/guc.c:5810 -msgid "Value exceeds integer range." -msgstr "Il valore non rientra nel limite possibile per gli interi." +#: utils/misc/guc.c:4302 +msgid "Sets the schema search order for names that are not schema-qualified." +msgstr "Imposta l'ordine di ricerca degli schema per i nomi che non hanno un qualifica di schema." -#: utils/misc/guc.c:6033 -#, c-format -msgid "parameter \"%s\" requires a numeric value" -msgstr "il parametro \"%s\" richiede un valore numerico" +#: utils/misc/guc.c:4314 +msgid "Shows the server (database) character set encoding." +msgstr "Mostra la codifica del set di caratteri del server (database)." -#: utils/misc/guc.c:6042 -#, c-format -msgid "%g is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g non è compreso nell'intervallo di validità del il parametro \"%s\" (%g .. %g)" +#: utils/misc/guc.c:4326 +msgid "Shows the server version." +msgstr "Mostra la versione del server." -#: utils/misc/guc.c:6195 utils/misc/guc.c:7565 -#, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "non è possibile impostare parametri durante un'operazione parallela" +#: utils/misc/guc.c:4338 +msgid "Sets the current role." +msgstr "Mostra il ruolo corrente." -#: utils/misc/guc.c:6202 utils/misc/guc.c:6954 utils/misc/guc.c:7007 -#: utils/misc/guc.c:7058 utils/misc/guc.c:7394 utils/misc/guc.c:8161 -#: utils/misc/guc.c:8329 utils/misc/guc.c:10006 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "parametro di configurazione \"%s\" sconosciuto" +#: utils/misc/guc.c:4350 +msgid "Sets the session user name." +msgstr "Mostra il nome dell'utente della sessione." -#: utils/misc/guc.c:6217 utils/misc/guc.c:7406 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "il parametro \"%s\" non può essere cambiato" +#: utils/misc/guc.c:4361 +msgid "Sets the destination for server log output." +msgstr "Imposta la destinazione per l'output dei log del server." -#: utils/misc/guc.c:6240 utils/misc/guc.c:6434 utils/misc/guc.c:6524 -#: utils/misc/guc.c:6614 utils/misc/guc.c:6722 utils/misc/guc.c:6817 -#: guc-file.l:353 -#, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "il parametro \"%s\" non può essere cambiato senza riavviare il server" +#: utils/misc/guc.c:4362 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "I valori validi sono combinazioni di \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\" e \"eventlog\", a seconda della piattaforma." -#: utils/misc/guc.c:6250 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "il parametro \"%s\" non può essere cambiato ora" +#: utils/misc/guc.c:4373 +msgid "Sets the destination directory for log files." +msgstr "Imposta la directory di destinazione dei file di log." -#: utils/misc/guc.c:6268 utils/misc/guc.c:6315 utils/misc/guc.c:10022 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "permesso di impostare il parametro \"%s\" negato" +#: utils/misc/guc.c:4374 +msgid "Can be specified as relative to the data directory or as absolute path." +msgstr "Può essere specificata sia come relativa alla directory data sia come percorso assoluto." -#: utils/misc/guc.c:6305 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "il parametro \"%s\" non può essere impostato dopo l'avvio della connessione" +#: utils/misc/guc.c:4384 +msgid "Sets the file name pattern for log files." +msgstr "Imposta il pattern dei nomi dei file di log." -#: utils/misc/guc.c:6353 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "il parametro \"%s\" non può essere impostato da una funzione che ha i privilegi del creatore" +#: utils/misc/guc.c:4395 +msgid "Sets the program name used to identify PostgreSQL messages in syslog." +msgstr "Imposta il nome del programma da utilizzato per identificare i messaggi di PostgreSQL in syslog." -#: utils/misc/guc.c:6962 utils/misc/guc.c:7012 utils/misc/guc.c:8336 -#, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "occorre essere un superutente o un membro di pg_read_all_settings per esaminare \"%s\"" +#: utils/misc/guc.c:4406 +msgid "Sets the application name used to identify PostgreSQL messages in the event log." +msgstr "Imposta il nome del programma da usarsi per identificare i messaggi di PostgreSQL nel registro degli eventi." -#: utils/misc/guc.c:7103 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s accetta un unico argomento" +#: utils/misc/guc.c:4417 +msgid "Sets the time zone for displaying and interpreting time stamps." +msgstr "Imposta il fuso orario per visualizzare ed interpretare gli orari." -#: utils/misc/guc.c:7354 -#, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "solo un superutente può eseguire il comando ALTER SYSTEM" +#: utils/misc/guc.c:4427 +msgid "Selects a file of time zone abbreviations." +msgstr "Seleziona un file contenente le abbreviazioni dei fusi orari." -#: utils/misc/guc.c:7439 -#, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "il valore del parametro di ALTER SYSTEM non può contenere un \"a capo\"" +#: utils/misc/guc.c:4437 +msgid "Sets the owning group of the Unix-domain socket." +msgstr "Imposta il gruppo di appartenenza per i socket di dominio Unix." -#: utils/misc/guc.c:7484 -#, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "non è possibile analizzare il contenuto del file \"%s\"" +#: utils/misc/guc.c:4438 +msgid "The owning user of the socket is always the user that starts the server." +msgstr "L'utente che possiede il socket è sempre l'utente che ha avviato il server." -#: utils/misc/guc.c:7641 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT non è implementato" +#: utils/misc/guc.c:4448 +msgid "Sets the directories where Unix-domain sockets will be created." +msgstr "Imposta la directory dove i socket di dominio Unix verranno creati." -#: utils/misc/guc.c:7725 -#, c-format -msgid "SET requires parameter name" -msgstr "SET richiede il nome del parametro" +#: utils/misc/guc.c:4463 +msgid "Sets the host name or IP address(es) to listen to." +msgstr "Imposta il nome host o gli indirizzi IP su cui ascoltare." -#: utils/misc/guc.c:7858 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "tentativo di ridefinire il parametro \"%s\"" +#: utils/misc/guc.c:4478 +msgid "Sets the server's data directory." +msgstr "Imposta la posizione della directory dati." -#: utils/misc/guc.c:9639 -#, c-format -msgid "parameter \"%s\" could not be set" -msgstr "il parametro \"%s\" non può essere impostato" +#: utils/misc/guc.c:4489 +msgid "Sets the server's main configuration file." +msgstr "Imposta il file primario di configurazione del server." -#: utils/misc/guc.c:9726 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "non è stato possibile interpretare l'impostazione del parametro \"%s\"" +#: utils/misc/guc.c:4500 +msgid "Sets the server's \"hba\" configuration file." +msgstr "Imposta il file di configurazione \"hba\" del server." -#: utils/misc/guc.c:10084 utils/misc/guc.c:10118 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "valore non valido per il parametro \"%s\": %d" +#: utils/misc/guc.c:4511 +msgid "Sets the server's \"ident\" configuration file." +msgstr "Imposta il file di configurazione \"ident\" del server." -#: utils/misc/guc.c:10152 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "valore non valido per il parametro \"%s\": %g" +#: utils/misc/guc.c:4522 +msgid "Writes the postmaster PID to the specified file." +msgstr "Scrivi il PID del postmaster nel file specificato." -#: utils/misc/guc.c:10422 -#, c-format -msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "\"temp_buffers\" non può essere modificato dopo che la sessione ha utilizzato qualsiasi tabella temporanea." +#: utils/misc/guc.c:4533 +msgid "Shows the name of the SSL library." +msgstr "Mostra il nome della libreria SSL." -#: utils/misc/guc.c:10434 -#, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour non è supportato in questo binario" +#: utils/misc/guc.c:4548 +msgid "Location of the SSL server certificate file." +msgstr "Posizione del file di certificati del server SSL." -#: utils/misc/guc.c:10447 -#, c-format -msgid "SSL is not supported by this build" -msgstr "SSL non è supportato in questo binario" +#: utils/misc/guc.c:4558 +msgid "Location of the SSL server private key file." +msgstr "Posizione del file della chiave privata del server SSL." -#: utils/misc/guc.c:10459 -#, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "Non è possibile abilitare il parametro quando \"log_statement_stats\" è abilitato." +#: utils/misc/guc.c:4568 +msgid "Location of the SSL certificate authority file." +msgstr "Posizione del file di autorità dei certificati del server SSL." -#: utils/misc/guc.c:10471 -#, c-format -msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "Non è possibile abilitare \"log_statement_stats\" quando \"log_parser_stats\", \"log_planner_stats\" o \"log_executor_stats\" sono abilitati." +#: utils/misc/guc.c:4578 +msgid "Location of the SSL certificate revocation list file." +msgstr "Posizione del file della lista di revoche di certificati SSL." -#: utils/misc/guc.c:10687 -#, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()" -msgstr "effective_io_concurrency deve essere impostato a 0 su piattaforme che non hanno posix_fadvise()" +#: utils/misc/guc.c:4588 +msgid "Location of the SSL certificate revocation list directory." +msgstr "Posizione della directory dell'elenco di revoche dei certificati SSL." -#: utils/misc/help_config.c:131 -#, c-format -msgid "internal error: unrecognized run-time parameter type\n" -msgstr "errore interno: tipo di parametro sconosciuto\n" +#: utils/misc/guc.c:4598 +msgid "Number of synchronous standbys and list of names of potential synchronous ones." +msgstr "Numero di standby sincroni e lista dei nomi di quelli potenziali sincroni." -#: utils/misc/pg_config.c:60 -#, c-format -msgid "query-specified return tuple and function return type are not compatible" -msgstr "la tupla che la query specifica e il tipo restituito dalla funzione non sono compatibili" +#: utils/misc/guc.c:4609 +msgid "Sets default text search configuration." +msgstr "Imposta la configurazione di ricerca di testo predefinita." -#: utils/misc/pg_controldata.c:59 utils/misc/pg_controldata.c:137 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:308 -#, c-format -msgid "calculated CRC checksum does not match value stored in file" -msgstr "il CRC di controllo calcolato non combacia con quello nel file" +#: utils/misc/guc.c:4619 +msgid "Sets the list of allowed SSL ciphers." +msgstr "Imposta la lista di codici SSL consentiti." -#: utils/misc/pg_rusage.c:64 -#, c-format -msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" -msgstr "CPU: utente: %d.%02d s, sistema: %d.%02d s, passati: %d.%02d s" +#: utils/misc/guc.c:4634 +msgid "Sets the curve to use for ECDH." +msgstr "Imposta la curva da usare per l'ECHD." -#: utils/misc/rls.c:127 -#, c-format -msgid "query would be affected by row-level security policy for table \"%s\"" -msgstr "la query sarebbe influenzata dalla regola di sicurezza per riga pre la tabella \"%s\"" +#: utils/misc/guc.c:4649 +msgid "Location of the SSL DH parameters file." +msgstr "Posizione del file di parametri SSH DH." -#: utils/misc/rls.c:129 -#, c-format -msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." -msgstr "Per disabilitare la regola di sicurezza per il proprietario della tabella usa ALTER TABLE NO FORCE ROW LEVEL SECURITY." +#: utils/misc/guc.c:4660 +msgid "Command to obtain passphrases for SSL." +msgstr "Comando per ottenere la passphrase per SSL." -#: utils/misc/timeout.c:388 -#, c-format -msgid "cannot add more timeout reasons" -msgstr "non è possibile aggiungere altri motivi di timeout" +#: utils/misc/guc.c:4671 +msgid "Sets the application name to be reported in statistics and logs." +msgstr "Imposta il nome dell'applicazione da riportare nelle statistiche e nei log." -#: utils/misc/tzparser.c:61 -#, c-format -msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" -msgstr "l'abbreviazione del fuso orario \"%s\" è troppo lunga (massimo %d caratteri) nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4682 +msgid "Sets the name of the cluster, which is included in the process title." +msgstr "Imposta il nome del cluster, che è incluso nel titolo del processo." -#: utils/misc/tzparser.c:73 -#, c-format -msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" -msgstr "lo spostamento del fuso orario %d è fuori dall'intervallo consentito nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4693 +msgid "Sets the WAL resource managers for which WAL consistency checks are done." +msgstr "Imposta i gestori di risorse WAL per cui vengono effettuati i controlli di consistenza WAL." -#: utils/misc/tzparser.c:112 -#, c-format -msgid "missing time zone abbreviation in time zone file \"%s\", line %d" -msgstr "abbreviazione del fuso orario mancante nel file di fusi orari \"%s\", riga %d" +#: 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 "Immagini di pagine complete verranno loggate per tutti i blocchi di dati e comparati con i risultati del replay del WAL." -#: utils/misc/tzparser.c:121 -#, c-format -msgid "missing time zone offset in time zone file \"%s\", line %d" -msgstr "spostamento del fuso orario mancante nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4704 +msgid "JIT provider to use." +msgstr "Fornitore JIT da usare." -#: utils/misc/tzparser.c:133 -#, c-format -msgid "invalid number for time zone offset in time zone file \"%s\", line %d" -msgstr "numero non valido per lo spostamento di fuso orario nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4715 +msgid "Log backtrace for errors in these functions." +msgstr "Log backtrace per errori in queste funzioni." -#: utils/misc/tzparser.c:169 -#, c-format -msgid "invalid syntax in time zone file \"%s\", line %d" -msgstr "sintassi non valida nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4735 +msgid "Sets whether \"\\'\" is allowed in string literals." +msgstr "Imposta se \"\\'\" è consentito nei letterali stringa." -#: utils/misc/tzparser.c:237 -#, c-format -msgid "time zone abbreviation \"%s\" is multiply defined" -msgstr "l'abbreviazione di fuso orario \"%s\" è definita più di una volta" +#: utils/misc/guc.c:4745 +msgid "Sets the output format for bytea." +msgstr "Imposta il formato di output di bytea." -#: utils/misc/tzparser.c:239 -#, c-format -msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." -msgstr "Il valore nel file di fusi orari \"%s\", riga %d, è conflitto con il valore nel file \"%s\", riga %d." +#: utils/misc/guc.c:4755 +msgid "Sets the message levels that are sent to the client." +msgstr "Imposta quali livelli di messaggi sono inviati al client." -#: utils/misc/tzparser.c:301 -#, c-format -msgid "invalid time zone file name \"%s\"" -msgstr "nome del file di fusi orari non valido: \"%s\"" +#: 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 "Ogni livello include tutti i livelli che lo seguono. Più avanti il livello, meno messaggi sono inviati." -#: utils/misc/tzparser.c:314 -#, c-format -msgid "time zone file recursion limit exceeded in file \"%s\"" -msgstr "limite di ricorsione dei file di fusi orari superato nel file \"%s\"" +#: utils/misc/guc.c:4766 +msgid "Enables in-core computation of query identifiers." +msgstr "Consente il calcolo interno degli identificatori di query." -#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 -#, c-format -msgid "could not read time zone file \"%s\": %m" -msgstr "lettura del file di fusi orari \"%s\" fallita: %m" +#: utils/misc/guc.c:4776 +msgid "Enables the planner to use constraints to optimize queries." +msgstr "Permette al planner di usare i vincoli per ottimizzare le query." -#: utils/misc/tzparser.c:376 -#, c-format -msgid "line is too long in time zone file \"%s\", line %d" -msgstr "la riga è troppo lunga nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4777 +msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." +msgstr "La scansioni delle tabelle saranno evitate se i loro vincoli garantiscono che nessuna riga corrisponda con la query." -#: utils/misc/tzparser.c:399 -#, c-format -msgid "@INCLUDE without file name in time zone file \"%s\", line %d" -msgstr "@INCLUDE senza nome del file nel file di fusi orari \"%s\", riga %d" +#: utils/misc/guc.c:4788 +msgid "Sets the default compression method for compressible values." +msgstr "Imposta il metodo di compressione predefinito per i valori comprimibili." -#: utils/mmgr/aset.c:483 utils/mmgr/generation.c:250 utils/mmgr/slab.c:240 -#, c-format -msgid "Failed while creating memory context \"%s\"." -msgstr "Errore durante la creazione del contesto di memoria \"%s\"." +#: utils/misc/guc.c:4799 +msgid "Sets the transaction isolation level of each new transaction." +msgstr "Imposta il livello di isolamento predefinito per ogni nuova transazione." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1325 -#, c-format -msgid "could not attach to dynamic shared area" -msgstr "collegamento all'area dinamica condivisa fallito" +#: utils/misc/guc.c:4809 +msgid "Sets the current transaction's isolation level." +msgstr "Imposta il livello di isolamento per la transazione in corso." -#: utils/mmgr/mcxt.c:797 utils/mmgr/mcxt.c:833 utils/mmgr/mcxt.c:871 -#: utils/mmgr/mcxt.c:909 utils/mmgr/mcxt.c:945 utils/mmgr/mcxt.c:976 -#: utils/mmgr/mcxt.c:1012 utils/mmgr/mcxt.c:1064 utils/mmgr/mcxt.c:1099 -#: utils/mmgr/mcxt.c:1134 -#, c-format -msgid "Failed on request of size %zu in memory context \"%s\"." -msgstr "Errore durante la richiesta di dimensione %zu nel contesto di memoria \"%s\"." +#: utils/misc/guc.c:4820 +msgid "Sets the display format for interval values." +msgstr "Imposta il formato di visualizzazione per intervalli." -#: utils/mmgr/portalmem.c:187 -#, c-format -msgid "cursor \"%s\" already exists" -msgstr "il cursore \"%s\" esiste già" +#: utils/misc/guc.c:4831 +msgid "Sets the verbosity of logged messages." +msgstr "Imposta la prolissità dei messaggi registrati." -#: utils/mmgr/portalmem.c:191 -#, c-format -msgid "closing existing cursor \"%s\"" -msgstr "chiusura del cursore esistente \"%s\"" +#: utils/misc/guc.c:4841 +msgid "Sets the message levels that are logged." +msgstr "Imposta i livelli dei messaggi registrati." -#: utils/mmgr/portalmem.c:398 -#, c-format -msgid "portal \"%s\" cannot be run" -msgstr "il portale \"%s\" non può essere eseguito" +#: utils/misc/guc.c:4852 +msgid "Causes all statements generating error at or above this level to be logged." +msgstr "Fa in modo che tutti gli eventi che generano errore a questo livello o a un livello superiore siano registrati nel log." -#: utils/mmgr/portalmem.c:476 -#, c-format -msgid "cannot drop pinned portal \"%s\"" -msgstr "non è possibile eliminare il portale pinned \"%s\"" +#: utils/misc/guc.c:4863 +msgid "Sets the type of statements logged." +msgstr "Imposta il tipo di istruzioni registrato nel log." -#: utils/mmgr/portalmem.c:484 -#, c-format -msgid "cannot drop active portal \"%s\"" -msgstr "non è possibile eliminare il portale attivo \"%s\"" +#: utils/misc/guc.c:4873 +msgid "Sets the syslog \"facility\" to be used when syslog enabled." +msgstr "Imposta la \"facility\" da usare quando syslog è abilitato." -#: utils/mmgr/portalmem.c:729 -#, c-format -msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" -msgstr "non è possibile eseguire PREPARE in una transazione che ha creato un cursore WITH HOLD" +#: utils/misc/guc.c:4888 +msgid "Sets the session's behavior for triggers and rewrite rules." +msgstr "Imposta il comportamento delle sessioni per i trigger e le regole di riscrittura." -#: utils/mmgr/portalmem.c:1263 -#, c-format -msgid "cannot perform transaction commands inside a cursor loop that is not read-only" -msgstr "non è possibile eseguire comandi di transazioni in un loop su cursore che non sia di sola lettura" +#: utils/misc/guc.c:4898 +msgid "Sets the current transaction's synchronization level." +msgstr "Imposta il livello di sincronizzazione della transazione corrente." -#: utils/sort/logtape.c:276 -#, c-format -msgid "could not read block %ld of temporary file: %m" -msgstr "lettura del blocco %ld dal file temporaneo fallita: %m" +#: utils/misc/guc.c:4908 +msgid "Allows archiving of WAL files using archive_command." +msgstr "Consente l'archiviazione dei file WAL con l'uso di archive_command." -#: utils/sort/logtape.c:439 -#, c-format -msgid "could not determine size of temporary file \"%s\"" -msgstr "determinazione della dimensione del file temporaneo \"%s\" fallita" +#: utils/misc/guc.c:4918 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "Imposta l'azione da eseguire al raggiungimento della destinazione di ripristino." -#: utils/sort/sharedtuplestore.c:208 -#, c-format -msgid "could not write to temporary file: %m" -msgstr "scrittura nel file temporaneo fallita: %m" +#: utils/misc/guc.c:4928 +msgid "Enables logging of recovery-related debugging information." +msgstr "Abilita il logging di informazioni di debug relative al recupero." -#: utils/sort/sharedtuplestore.c:437 utils/sort/sharedtuplestore.c:446 -#: utils/sort/sharedtuplestore.c:469 utils/sort/sharedtuplestore.c:486 -#: utils/sort/sharedtuplestore.c:503 utils/sort/sharedtuplestore.c:575 -#: utils/sort/sharedtuplestore.c:581 -#, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "errore nella lettura dal file temporaneo tuplestore condiviso" +#: utils/misc/guc.c:4945 +msgid "Collects function-level statistics on database activity." +msgstr "Raccogli statistiche al livello di funzioni sull'attività del database." -#: utils/sort/sharedtuplestore.c:492 -#, c-format -msgid "unexpected chunk in shared tuplestore temporary file" -msgstr "blocco non previsto nel file temporaneo tuplestore condiviso" +#: utils/misc/guc.c:4956 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Imposta la coerenza degli accessi ai dati statistici." -#: utils/sort/tuplesort.c:2967 -#, c-format -msgid "cannot have more than %d runs for an external sort" -msgstr "non è possibile avere più di %d esecuzioni per un sort esterno" +#: utils/misc/guc.c:4966 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Comprime le scritture a pagina intera scritte nel file WAL con il metodo specificato." -#: utils/sort/tuplesort.c:4051 -#, c-format -msgid "could not create unique index \"%s\"" -msgstr "creazione dell'indice univoco \"%s\" fallita" +#: utils/misc/guc.c:4976 +msgid "Sets the level of information written to the WAL." +msgstr "Imposta il livello di informazioni scritte nel WAL." -#: utils/sort/tuplesort.c:4053 -#, c-format -msgid "Key %s is duplicated." -msgstr "La chiave %s è duplicata." +#: utils/misc/guc.c:4986 +msgid "Selects the dynamic shared memory implementation used." +msgstr "Seleziona l'implementazione di memoria dinamica condivisa utilizzata." -#: utils/sort/tuplesort.c:4054 -#, c-format -msgid "Duplicate keys exist." -msgstr "Esistono chiavi duplicate." +#: utils/misc/guc.c:4996 +msgid "Selects the shared memory implementation used for the main shared memory region." +msgstr "Seleziona l'implementazione della memoria condivisa utilizzata per l'area di memoria condivisa principale." -#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 -#: utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 -#: utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 -#: utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 -#: utils/sort/tuplestore.c:1330 -#, c-format -msgid "could not seek in tuplestore temporary file: %m" -msgstr "ricerca nel file temporaneo tuplestore fallita: %m" +#: utils/misc/guc.c:5006 +msgid "Selects the method used for forcing WAL updates to disk." +msgstr "Seleziona il metodo usato per forzare aggiornamenti WAL su disco." -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1550 -#: utils/sort/tuplestore.c:1556 -#, c-format -msgid "could not read from tuplestore temporary file: %m" -msgstr "lettura dal file temporaneo tuplestore fallita: %m" +#: utils/misc/guc.c:5016 +msgid "Sets how binary values are to be encoded in XML." +msgstr "Imposta come i valori binari devono essere codificati nel formato XML." -#: utils/sort/tuplestore.c:1518 utils/sort/tuplestore.c:1523 -#: utils/sort/tuplestore.c:1529 -#, c-format -msgid "could not write to tuplestore temporary file: %m" -msgstr "scrittura nel file temporaneo tuplestore fallita: %m" +#: 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 "Imposta se qualunque dato XML nelle operazioni di parsing e serializzazione implicite debba essere considerato come un documento o frammento di un contenuto." -#: utils/time/snapmgr.c:622 -#, c-format -msgid "The source transaction is not running anymore." -msgstr "La transazione di origine non è più in esecuzione." +#: utils/misc/guc.c:5037 +msgid "Use of huge pages on Linux or Windows." +msgstr "Uso di hige pages su Linux o Windows." -# translator: %s represents an SQL statement name -#: utils/time/snapmgr.c:1200 -#, c-format -msgid "cannot export a snapshot from a subtransaction" -msgstr "non è possibile esportare uno snapshot da una sotto-transazione" +#: utils/misc/guc.c:5047 +msgid "Prefetch referenced blocks during recovery." +msgstr "Precarica i blocchi di riferimento durante il ripristino." -#: utils/time/snapmgr.c:1359 utils/time/snapmgr.c:1364 -#: utils/time/snapmgr.c:1369 utils/time/snapmgr.c:1384 -#: utils/time/snapmgr.c:1389 utils/time/snapmgr.c:1394 -#: utils/time/snapmgr.c:1409 utils/time/snapmgr.c:1414 -#: utils/time/snapmgr.c:1419 utils/time/snapmgr.c:1519 -#: utils/time/snapmgr.c:1535 utils/time/snapmgr.c:1560 -#, c-format -msgid "invalid snapshot data in file \"%s\"" -msgstr "dati dello snapshot non validi nel file \"%s\"" +#: utils/misc/guc.c:5048 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Guarda avanti nel WAL per trovare riferimenti ai dati non memorizzati nella cache." -#: utils/time/snapmgr.c:1456 -#, c-format -msgid "SET TRANSACTION SNAPSHOT must be called before any query" -msgstr "SET TRANSACTION SNAPSHOT dev'essere invocato prima di qualunque query" +#: utils/misc/guc.c:5057 +msgid "Forces use of parallel query facilities." +msgstr "Forza l'uso delle query parallele." -#: utils/time/snapmgr.c:1465 -#, c-format -msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" -msgstr "una transazione che importa uno snapshot deve avere livello di isolamento SERIALIZABLE o REPEATABLE READ" +#: utils/misc/guc.c:5058 +msgid "If possible, run query using a parallel worker and with parallel restrictions." +msgstr "Se possibile, effettua le query usando worker paralleli e con restrizioni di parallelismo." -#: utils/time/snapmgr.c:1474 utils/time/snapmgr.c:1483 -#, c-format -msgid "invalid snapshot identifier: \"%s\"" -msgstr "identificativo di snapshot non valido: \"%s\"" +#: utils/misc/guc.c:5068 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "Sceglie l'algoritmo per la crittografia delle password." -#: utils/time/snapmgr.c:1573 -#, c-format -msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" -msgstr "una transazione serializzabile non può importare uno snapshot da una transazione non serializzabile" +#: utils/misc/guc.c:5078 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "Controlla la selezione del pianificatore del piano personalizzato o generico." -#: utils/time/snapmgr.c:1577 -#, c-format -msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" -msgstr "una transazione non di sola lettura non può importare uno snapshot da una transazione di sola lettura" +#: 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 "Le dichiarazioni preparate possono avere piani personalizzati e generici e il pianificatore tenterà di scegliere quale sia il migliore. Questo può essere impostato per sovrascrivere il comportamento predefinito." -#: utils/time/snapmgr.c:1592 -#, c-format -msgid "cannot import a snapshot from a different database" -msgstr "non è possibile importare uno snapshot da un database diverso" +#: utils/misc/guc.c:5091 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "Imposta la versione minima del protocollo SSL/TLS da utilizzare." -#: gram.y:1026 -#, c-format -msgid "UNENCRYPTED PASSWORD is no longer supported" -msgstr "UNENCRYPTED PASSWORD non è più supportato" +#: utils/misc/guc.c:5103 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "Imposta la versione massima del protocollo SSL/TLS da utilizzare." -#: gram.y:1027 -#, c-format -msgid "Remove UNENCRYPTED to store the password in encrypted form instead." -msgstr "Rimuovi UNENCRYPTED per memorizzare la password in formato criptato." +#: utils/misc/guc.c:5115 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "Imposta il metodo per sincronizzare la directory dei dati prima del ripristino in modo anomalo." -#: gram.y:1089 +#: utils/misc/guc.c:5690 utils/misc/guc.c:5706 #, c-format -msgid "unrecognized role option \"%s\"" -msgstr "opzione di ruolo \"%s\" sconosciuta" +msgid "invalid configuration parameter name \"%s\"" +msgstr "nome parametro di configurazione non valido \"%s\"" -#: gram.y:1336 gram.y:1351 +#: utils/misc/guc.c:5692 #, c-format -msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" -msgstr "CREATE SCHEMA IF NOT EXISTS non può includere elementi dello schema" +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "I nomi dei parametri personalizzati devono essere due o più identificatori semplici separati da punti." -#: gram.y:1496 +#: utils/misc/guc.c:5708 #, c-format -msgid "current database cannot be changed" -msgstr "il database corrente non può essere cambiato" +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" è un prefisso riservato." -#: gram.y:1620 +#: utils/misc/guc.c:5722 #, c-format -msgid "time zone interval must be HOUR or HOUR TO MINUTE" -msgstr "l'intervallo della time zone deve essere HOUR o HOUR TO MINUTE" +msgid "unrecognized configuration parameter \"%s\"" +msgstr "parametro di configurazione \"%s\" sconosciuto" -#: gram.y:2138 +#: utils/misc/guc.c:6114 #, c-format -msgid "column number must be in range from 1 to %d" -msgstr "i numeri di colonne devono essere nell'intervallo tra 1 e %d" +msgid "%s: could not access directory \"%s\": %s\n" +msgstr "%s: accesso alla directory \"%s\" fallito: %s\n" -#: gram.y:2677 +#: utils/misc/guc.c:6119 #, c-format -msgid "sequence option \"%s\" not supported here" -msgstr "l'opzione della sequenza \"%s\" non è supportata qui" +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "Esegui initdb o pg_basebackup per inizializzare una directory di dati PostgreSQL.\n" -#: gram.y:2706 +#: utils/misc/guc.c:6139 #, c-format -msgid "modulus for hash partition provided more than once" -msgstr "modulo per partizione hash fornito più di una volta" +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 non sa dove trovare il file di configurazione del server.\n" +"Devi specificare le opzioni --config-file o -D, oppure impostare la variabile d'ambiente PGDATA.\n" -#: gram.y:2715 +#: utils/misc/guc.c:6158 #, c-format -msgid "remainder for hash partition provided more than once" -msgstr "resto per partizione hash fornito più di una volta" +msgid "%s: could not access the server configuration file \"%s\": %s\n" +msgstr "%s: accesso al file di configurazione del server \"%s\" fallito: %s\n" -#: gram.y:2722 +#: utils/misc/guc.c:6184 #, c-format -msgid "unrecognized hash partition bound specification \"%s\"" -msgstr "specifica di vincolo di partizione hash \"%s\" non riconosciuto" +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 non sa dove trovare i dati di sistema del database.\n" +"Possono essere specificati come \"data_directory\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" -#: gram.y:2730 +#: utils/misc/guc.c:6232 #, c-format -msgid "modulus for hash partition must be specified" -msgstr "il modulo per la partizione hash deve essere specificato" +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 non sa dove trovare il file di configurazione \"hba\".\n" +"Può essere specificato come \"hba_file\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" -#: gram.y:2734 +#: utils/misc/guc.c:6255 #, c-format -msgid "remainder for hash partition must be specified" -msgstr "il resto per la partizione hash deve essere specificato" +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 non sa dove trovare il file di configurazione \"ident\".\n" +"Può essere specificato come \"ident_file\" in \"%s\", oppure dall'opzione -D, oppure dalla variabile d'ambiente PGDATA.\n" -#: gram.y:2986 gram.y:3015 -#, c-format -msgid "STDIN/STDOUT not allowed with PROGRAM" -msgstr "STDIN/STDOUT non sono consentiti con PROGRAM" +#: utils/misc/guc.c:7186 +msgid "Value exceeds integer range." +msgstr "Il valore non rientra nel limite possibile per gli interi." -#: gram.y:3325 gram.y:3332 gram.y:11465 gram.y:11473 +#: utils/misc/guc.c:7422 #, c-format -msgid "GLOBAL is deprecated in temporary table creation" -msgstr "GLOBAL è deprecato nella creazione di tabelle temporanee" +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d%s%s non rientra nell'intervallo valido per il parametro \"%s\" (%d .. %d)" -#: gram.y:5299 +#: utils/misc/guc.c:7458 #, c-format -msgid "unrecognized row security option \"%s\"" -msgstr "opzione di sicurezza riga \"%s\" non riconosciuta" +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" +msgstr "%g%s%s non rientra nell'intervallo valido per il parametro \"%s\" (%g .. %g)" -#: gram.y:5300 +#: utils/misc/guc.c:7658 utils/misc/guc.c:9106 #, c-format -msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." -msgstr "Solo le regole PERMISSIVE o RESTRICTIVE sono attualmente supportate." - -#: gram.y:5408 -msgid "duplicate trigger events specified" -msgstr "evento del trigger specificato più volte" +msgid "cannot set parameters during a parallel operation" +msgstr "non è possibile impostare parametri durante un'operazione parallela" -#: gram.y:5556 +#: utils/misc/guc.c:7675 utils/misc/guc.c:8930 #, c-format -msgid "conflicting constraint properties" -msgstr "proprietà del vincolo in conflitto" +msgid "parameter \"%s\" cannot be changed" +msgstr "il parametro \"%s\" non può essere cambiato" -#: gram.y:5662 +#: utils/misc/guc.c:7708 #, c-format -msgid "CREATE ASSERTION is not yet implemented" -msgstr "CREATE ASSERTION non è stata ancora implementata" +msgid "parameter \"%s\" cannot be changed now" +msgstr "il parametro \"%s\" non può essere cambiato ora" -#: gram.y:5677 +#: utils/misc/guc.c:7735 utils/misc/guc.c:7793 utils/misc/guc.c:8906 utils/misc/guc.c:11805 #, c-format -msgid "DROP ASSERTION is not yet implemented" -msgstr "DROP ASSERTION non è stata ancora implementata" +msgid "permission denied to set parameter \"%s\"" +msgstr "permesso di impostare il parametro \"%s\" negato" -#: gram.y:6057 +#: utils/misc/guc.c:7773 #, c-format -msgid "RECHECK is no longer required" -msgstr "RECHECK non è più richiesto" +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "il parametro \"%s\" non può essere impostato dopo l'avvio della connessione" -#: gram.y:6058 +#: utils/misc/guc.c:7832 #, c-format -msgid "Update your data type." -msgstr "Aggiorna il tuo tipo di dato." +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "il parametro \"%s\" non può essere impostato da una funzione che ha i privilegi del creatore" -#: gram.y:7794 +#: utils/misc/guc.c:8485 utils/misc/guc.c:8532 utils/misc/guc.c:10011 #, c-format -msgid "aggregates cannot have output arguments" -msgstr "gli aggregati non possono avere argomenti di output" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "deve essere superutente o avere i privilegi di pg_read_all_settings per esaminare \"%s\"" -#: gram.y:10048 gram.y:10066 +#: utils/misc/guc.c:8616 #, c-format -msgid "WITH CHECK OPTION not supported on recursive views" -msgstr "WITH CHECK OPTION non supportato su viste ricorsive" +msgid "SET %s takes only one argument" +msgstr "SET %s accetta un unico argomento" -#: gram.y:10563 +#: utils/misc/guc.c:8896 #, c-format -msgid "unrecognized VACUUM option \"%s\"" -msgstr "opzione di VACUUM \"%s\" sconosciuta" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "autorizzazione negata per eseguire ALTER SYSTEM RESET ALL" -#: gram.y:11573 +#: utils/misc/guc.c:8963 #, c-format -msgid "LIMIT #,# syntax is not supported" -msgstr "La sintassi LIMIT #,# non è supportata" +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "il valore del parametro di ALTER SYSTEM non può contenere un \"a capo\"" -#: gram.y:11574 +#: utils/misc/guc.c:9008 #, c-format -msgid "Use separate LIMIT and OFFSET clauses." -msgstr "Usa separatamente le clausole LIMIT ed OFFSET." +msgid "could not parse contents of file \"%s\"" +msgstr "non è possibile analizzare il contenuto del file \"%s\"" -#: gram.y:11872 gram.y:11897 +#: utils/misc/guc.c:9182 #, c-format -msgid "VALUES in FROM must have an alias" -msgstr "VALUES nel FROM deve avere un alias" +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT non è implementato" -#: gram.y:11873 gram.y:11898 +#: utils/misc/guc.c:9269 #, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "Per esempio, FROM (VALUES ...) [AS] foo." +msgid "SET requires parameter name" +msgstr "SET richiede il nome del parametro" -#: gram.y:11878 gram.y:11903 +#: utils/misc/guc.c:9402 #, c-format -msgid "subquery in FROM must have an alias" -msgstr "la sottoquery in FROM deve avere un alias" +msgid "attempt to redefine parameter \"%s\"" +msgstr "tentativo di ridefinire il parametro \"%s\"" -#: gram.y:11879 gram.y:11904 +#: utils/misc/guc.c:9729 #, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "Per esempio, FROM (SELECT ...) [AS] foo." +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "nome parametro di configurazione non valido \"%s\", rimuovendolo" -#: gram.y:12358 +#: utils/misc/guc.c:9731 #, c-format -msgid "only one DEFAULT value is allowed" -msgstr "solo un valore DEFAULT è consentito" +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" è ora un prefisso riservato." -#: gram.y:12367 +#: utils/misc/guc.c:11245 #, c-format -msgid "only one PATH value per column is allowed" -msgstr "solo un valore PATH per colonna è consentito" +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "durante l'impostazione del parametro \"%s\" su \"%s\"" -#: gram.y:12376 +#: utils/misc/guc.c:11414 #, c-format -msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" -msgstr "dichiarazioni NULL / NOT NULL in conflitto o ridondanti per la colonna \"%s\"" +msgid "parameter \"%s\" could not be set" +msgstr "il parametro \"%s\" non può essere impostato" -#: gram.y:12385 +#: utils/misc/guc.c:11506 #, c-format -msgid "unrecognized column option \"%s\"" -msgstr "opzione di colonna \"%s\" non riconosciuta" +msgid "could not parse setting for parameter \"%s\"" +msgstr "non è stato possibile interpretare l'impostazione del parametro \"%s\"" -#: gram.y:12639 +#: utils/misc/guc.c:11937 #, c-format -msgid "precision for type float must be at least 1 bit" -msgstr "la precisione per il tipo float dev'essere di almeno un bit" +msgid "invalid value for parameter \"%s\": %g" +msgstr "valore non valido per il parametro \"%s\": %g" -#: gram.y:12648 +#: utils/misc/guc.c:12250 #, c-format -msgid "precision for type float must be less than 54 bits" -msgstr "la precisione per il tipo float dev'essere inferiore a 54 bit" +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "\"temp_buffers\" non può essere modificato dopo che la sessione ha utilizzato qualsiasi tabella temporanea." -#: gram.y:13139 +#: utils/misc/guc.c:12262 #, c-format -msgid "wrong number of parameters on left side of OVERLAPS expression" -msgstr "numero errato di parametri a sinistra dell'espressione OVERLAPS" +msgid "Bonjour is not supported by this build" +msgstr "Bonjour non è supportato in questo binario" -#: gram.y:13144 +#: utils/misc/guc.c:12275 #, c-format -msgid "wrong number of parameters on right side of OVERLAPS expression" -msgstr "numero errato di parametri a destra dell'espressione OVERLAPS" +msgid "SSL is not supported by this build" +msgstr "SSL non è supportato in questo binario" -#: gram.y:13319 +#: utils/misc/guc.c:12287 #, c-format -msgid "UNIQUE predicate is not yet implemented" -msgstr "il predicato UNIQUE non è stato ancora implementato" +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "Non è possibile abilitare il parametro quando \"log_statement_stats\" è abilitato." -#: gram.y:13666 +#: utils/misc/guc.c:12299 #, c-format -msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" -msgstr "non si può usare più di una clausola ORDER BY con WITHIN GROUOP" +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "Non è possibile abilitare \"log_statement_stats\" quando \"log_parser_stats\", \"log_planner_stats\" o \"log_executor_stats\" sono abilitati." -#: gram.y:13671 +#: utils/misc/guc.c:12529 #, c-format -msgid "cannot use DISTINCT with WITHIN GROUP" -msgstr "non si può usare DISTINCT con WITHIN GROUP" +msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency deve essere impostato su 0 su piattaforme prive di posix_fadvise()." -#: gram.y:13676 +#: utils/misc/guc.c:12542 #, c-format -msgid "cannot use VARIADIC with WITHIN GROUP" -msgstr "non si può usare VARIADIC con WITHIN GROUP" +msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "maintenance_io_concurrency deve essere impostato su 0 su piattaforme prive di posix_fadvise()." -#: gram.y:14129 gram.y:14152 +#: utils/misc/guc.c:12556 #, c-format -msgid "frame start cannot be UNBOUNDED FOLLOWING" -msgstr "l'inizio della finestra non può essere UNBOUNDED FOLLOWING" +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size deve essere 0 su questa piattaforma." -#: gram.y:14134 +#: utils/misc/guc.c:12568 #, c-format -msgid "frame starting from following row cannot end with current row" -msgstr "una finestra che inizia dalla riga seguente non può terminare alla riga corrente" +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "client_connection_check_interval deve essere impostato su 0 su questa piattaforma." -#: gram.y:14157 +#: utils/misc/guc.c:12680 #, c-format -msgid "frame end cannot be UNBOUNDED PRECEDING" -msgstr "la fine della finestra non può essere UNBOUNDED PRECEDING" +msgid "invalid character" +msgstr "carattere non valido" -#: gram.y:14163 +# da non tradurre +# DV: perché (già tradotto peraltro) +#: utils/misc/guc.c:12740 #, c-format -msgid "frame starting from current row cannot have preceding rows" -msgstr "una finestra che inizia dalla riga corrente non può avere righe precedenti" +msgid "recovery_target_timeline is not a valid number." +msgstr "recovery_target_timeline non è un numero valido." -#: gram.y:14170 +#: utils/misc/guc.c:12780 #, c-format -msgid "frame starting from following row cannot have preceding rows" -msgstr "una finestra che inizia dalla riga seguente non può avere righe precedenti" +msgid "multiple recovery targets specified" +msgstr "più obiettivi di ripristino specificati" -#: gram.y:14813 +#: utils/misc/guc.c:12781 #, c-format -msgid "type modifier cannot have parameter name" -msgstr "un modificatore di tipo non può avere un nome di parametro" +msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." +msgstr "È possibile impostare al massimo uno tra recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid." -#: gram.y:14819 +#: utils/misc/guc.c:12789 #, c-format -msgid "type modifier cannot have ORDER BY" -msgstr "un modificatore di tipo non può avere ORDER BY" +msgid "The only allowed value is \"immediate\"." +msgstr "Il solo valore permesso è \"immediate\"." -#: gram.y:14884 gram.y:14891 +#: utils/misc/help_config.c:130 #, c-format -msgid "%s cannot be used as a role name here" -msgstr "%s non può essere usato come nome di ruolo qui" - -#: gram.y:15562 gram.y:15751 -msgid "improper use of \"*\"" -msgstr "uso improprio di \"*\"" +msgid "internal error: unrecognized run-time parameter type\n" +msgstr "errore interno: tipo di parametro sconosciuto\n" -#: gram.y:15815 +#: 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 "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" -msgstr "un aggregato su insiemi ordinati con un argomento diretto VARIADIC deve avere un argomento aggregato VARIADIC sullo stesso tipo" +msgid "calculated CRC checksum does not match value stored in file" +msgstr "il CRC di controllo calcolato non combacia con quello nel file" -#: gram.y:15852 +#: utils/misc/pg_rusage.c:64 #, c-format -msgid "multiple ORDER BY clauses not allowed" -msgstr "non è possibile avere più di una clausola ORDER BY" +msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" +msgstr "CPU: utente: %d.%02d s, sistema: %d.%02d s, passati: %d.%02d s" -#: gram.y:15863 +#: utils/misc/rls.c:127 #, c-format -msgid "multiple OFFSET clauses not allowed" -msgstr "non è possibile avere più di una clausola OFFSET" +msgid "query would be affected by row-level security policy for table \"%s\"" +msgstr "la query sarebbe influenzata dalla regola di sicurezza per riga pre la tabella \"%s\"" -#: gram.y:15872 +#: utils/misc/rls.c:129 #, c-format -msgid "multiple LIMIT clauses not allowed" -msgstr "non è possibile avere più di una clausola LIMIT" +msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." +msgstr "Per disabilitare la regola di sicurezza per il proprietario della tabella usa ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: gram.y:15881 +#: utils/misc/timeout.c:524 #, c-format -msgid "multiple WITH clauses not allowed" -msgstr "non è possibile avere più di una clausola WITH" +msgid "cannot add more timeout reasons" +msgstr "non è possibile aggiungere altri motivi di timeout" -#: gram.y:16085 +#: utils/misc/tzparser.c:60 #, c-format -msgid "OUT and INOUT arguments aren't allowed in TABLE functions" -msgstr "gli argomenti OUT e INOUT non sono permessi nelle funzioni TABLE" +msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" +msgstr "l'abbreviazione del fuso orario \"%s\" è troppo lunga (massimo %d caratteri) nel file di fusi orari \"%s\", riga %d" -#: gram.y:16186 +#: utils/misc/tzparser.c:72 #, c-format -msgid "multiple COLLATE clauses not allowed" -msgstr "non è possibile avere più di una clausola COLLATE" +msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" +msgstr "lo spostamento del fuso orario %d è fuori dall'intervallo consentito nel file di fusi orari \"%s\", riga %d" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16224 gram.y:16237 +#: utils/misc/tzparser.c:111 #, c-format -msgid "%s constraints cannot be marked DEFERRABLE" -msgstr "un vincolo %s non può essere marcato DEFERRABLE" +msgid "missing time zone abbreviation in time zone file \"%s\", line %d" +msgstr "abbreviazione del fuso orario mancante nel file di fusi orari \"%s\", riga %d" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16250 +#: utils/misc/tzparser.c:120 #, c-format -msgid "%s constraints cannot be marked NOT VALID" -msgstr "un vincolo %s non può essere marcato NOT VALID" +msgid "missing time zone offset in time zone file \"%s\", line %d" +msgstr "spostamento del fuso orario mancante nel file di fusi orari \"%s\", riga %d" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16263 +#: utils/misc/tzparser.c:132 #, c-format -msgid "%s constraints cannot be marked NO INHERIT" -msgstr "un vincolo %s non può essere marcato NO INHERIT" +msgid "invalid number for time zone offset in time zone file \"%s\", line %d" +msgstr "numero non valido per lo spostamento di fuso orario nel file di fusi orari \"%s\", riga %d" -#: guc-file.l:316 +#: utils/misc/tzparser.c:168 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "parametro di configurazione \"%s\" sconosciuto nel file \"%s\" riga %u" +msgid "invalid syntax in time zone file \"%s\", line %d" +msgstr "sintassi non valida nel file di fusi orari \"%s\", riga %d" -#: guc-file.l:389 +#: utils/misc/tzparser.c:236 #, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "il parametro \"%s\" è stato rimosso dal file di configurazione, valore predefinito ripristinato" +msgid "time zone abbreviation \"%s\" is multiply defined" +msgstr "l'abbreviazione di fuso orario \"%s\" è definita più di una volta" -#: guc-file.l:455 +#: utils/misc/tzparser.c:238 #, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "il parametro \"%s\" è stato modificato a \"%s\"" +msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." +msgstr "Il valore nel file di fusi orari \"%s\", riga %d, è conflitto con il valore nel file \"%s\", riga %d." -#: guc-file.l:497 +#: utils/misc/tzparser.c:300 #, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "il file di configurazione \"%s\" contiene errori" +msgid "invalid time zone file name \"%s\"" +msgstr "nome del file di fusi orari non valido: \"%s\"" -#: guc-file.l:502 +#: utils/misc/tzparser.c:313 #, c-format -msgid "configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "il file di configurazione \"%s\" contiene errori; i cambiamenti senza errori sono stati applicati" +msgid "time zone file recursion limit exceeded in file \"%s\"" +msgstr "limite di ricorsione dei file di fusi orari superato nel file \"%s\"" -#: guc-file.l:507 +#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 #, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "il file di configurazione \"%s\" contiene errori; nessun cambiamento effettuato" +msgid "could not read time zone file \"%s\": %m" +msgstr "lettura del file di fusi orari \"%s\" fallita: %m" -#: guc-file.l:580 +#: utils/misc/tzparser.c:376 #, c-format -msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" -msgstr "apertura del file di configurazione \"%s\" fallita: massima profondità di annidamento raggiunta" +msgid "line is too long in time zone file \"%s\", line %d" +msgstr "la riga è troppo lunga nel file di fusi orari \"%s\", riga %d" -#: guc-file.l:607 +#: utils/misc/tzparser.c:400 #, c-format -msgid "skipping missing configuration file \"%s\"" -msgstr "file di configurazione mancante \"%s\" saltato" +msgid "@INCLUDE without file name in time zone file \"%s\", line %d" +msgstr "@INCLUDE senza nome del file nel file di fusi orari \"%s\", riga %d" -#: guc-file.l:861 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format -msgid "syntax error in file \"%s\" line %u, near end of line" -msgstr "errore di sintassi nel file \"%s\" riga %u, vicino alla fine della riga" +msgid "Failed while creating memory context \"%s\"." +msgstr "Errore durante la creazione del contesto di memoria \"%s\"." -#: guc-file.l:871 +#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 #, c-format -msgid "syntax error in file \"%s\" line %u, near token \"%s\"" -msgstr "errore di sintassi nel file \"%s\" riga %u, vicino al token \"%s\"" +msgid "could not attach to dynamic shared area" +msgstr "collegamento all'area dinamica condivisa fallito" -#: guc-file.l:891 +#: 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 "too many syntax errors found, abandoning file \"%s\"" -msgstr "troppi errori di sintassi, file \"%s\" abbandonato" +msgid "Failed on request of size %zu in memory context \"%s\"." +msgstr "Errore durante la richiesta di dimensione %zu nel contesto di memoria \"%s\"." -#: guc-file.l:943 +#: utils/mmgr/mcxt.c:1052 #, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "apertura della directory di configurazione \"%s\" fallita: %m" +msgid "logging memory contexts of PID %d" +msgstr "registrazione dei contesti di memoria del PID %d" -#: repl_gram.y:336 repl_gram.y:368 +#: utils/mmgr/portalmem.c:188 #, c-format -msgid "invalid timeline %u" -msgstr "timeline %u non valida" +msgid "cursor \"%s\" already exists" +msgstr "il cursore \"%s\" esiste già" -#: repl_scanner.l:129 -msgid "invalid streaming start location" -msgstr "posizione di avvio dello streaming non valida" +#: utils/mmgr/portalmem.c:192 +#, c-format +msgid "closing existing cursor \"%s\"" +msgstr "chiusura del cursore esistente \"%s\"" -#: repl_scanner.l:180 scan.l:683 -msgid "unterminated quoted string" -msgstr "stringa tra virgolette non terminata" +#: utils/mmgr/portalmem.c:402 +#, c-format +msgid "portal \"%s\" cannot be run" +msgstr "il portale \"%s\" non può essere eseguito" -#: scan.l:445 -msgid "unterminated /* comment" -msgstr "commento /* non terminato" +#: utils/mmgr/portalmem.c:480 +#, c-format +msgid "cannot drop pinned portal \"%s\"" +msgstr "non è possibile eliminare il portale pinned \"%s\"" -#: scan.l:474 -msgid "unterminated bit string literal" -msgstr "letterale di stringa di bit non terminato" +#: utils/mmgr/portalmem.c:488 +#, c-format +msgid "cannot drop active portal \"%s\"" +msgstr "non è possibile eliminare il portale attivo \"%s\"" -#: scan.l:495 -msgid "unterminated hexadecimal string literal" -msgstr "letterale di stringa esadecimale non terminato" +#: utils/mmgr/portalmem.c:739 +#, c-format +msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" +msgstr "non è possibile eseguire PREPARE in una transazione che ha creato un cursore WITH HOLD" -#: scan.l:545 +#: utils/mmgr/portalmem.c:1232 #, c-format -msgid "unsafe use of string constant with Unicode escapes" -msgstr "uso non sicuro di stringa costante con gli escape Unicode" +msgid "cannot perform transaction commands inside a cursor loop that is not read-only" +msgstr "non è possibile eseguire comandi di transazioni in un loop su cursore che non sia di sola lettura" -#: scan.l:546 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "Le stringhe costanti con escape Unicode non possono essere usate quando standard_conforming_strings è disabilitato." +msgid "could not seek to block %ld of temporary file" +msgstr "impossibile cercare di bloccare %ld del file temporaneo" -#: scan.l:592 scan.l:791 -msgid "invalid Unicode escape character" -msgstr "carattere escape Unicode non valido" +#: utils/sort/logtape.c:295 +#, c-format +msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" +msgstr "impossibile leggere il blocco %ld del file temporaneo: leggere solo %zu di %zu byte" -#: scan.l:618 scan.l:626 scan.l:634 scan.l:635 scan.l:636 scan.l:1380 -#: scan.l:1407 scan.l:1411 scan.l:1449 scan.l:1453 scan.l:1475 scan.l:1485 -msgid "invalid Unicode surrogate pair" -msgstr "coppia surrogata Unicode non valida" +#: 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 "errore nella lettura dal file temporaneo tuplestore condiviso" -#: scan.l:640 +#: utils/sort/sharedtuplestore.c:486 #, c-format -msgid "invalid Unicode escape" -msgstr "escape Unicode non valido" +msgid "unexpected chunk in shared tuplestore temporary file" +msgstr "blocco non previsto nel file temporaneo tuplestore condiviso" -#: scan.l:641 +#: utils/sort/sharedtuplestore.c:571 #, c-format -msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." -msgstr "Gli escape Unicode devono essere \\uXXXX or \\UXXXXXXXX." +msgid "could not seek to block %u in shared tuplestore temporary file" +msgstr "impossibile cercare di bloccare %u nel file temporaneo di tuplestore condiviso" -#: scan.l:652 +#: utils/sort/sharedtuplestore.c:578 #, c-format -msgid "unsafe use of \\' in a string literal" -msgstr "uso non sicuro di \\' in una stringa letterale" +msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" +msgstr "impossibile leggere dal file temporaneo di tuplestore condiviso: leggere solo %zu di %zu byte" -#: scan.l:653 +#: utils/sort/tuplesort.c:3322 #, c-format -msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." -msgstr "Usa '' per scrivere gli apici in una stringa. \\' non è sicuro in codifiche solo client." +msgid "cannot have more than %d runs for an external sort" +msgstr "non è possibile avere più di %d esecuzioni per un sort esterno" -#: scan.l:728 -msgid "unterminated dollar-quoted string" -msgstr "stringa delimitata da dollari non terminata" +#: utils/sort/tuplesort.c:4425 +#, c-format +msgid "could not create unique index \"%s\"" +msgstr "creazione dell'indice univoco \"%s\" fallita" -#: scan.l:745 scan.l:771 scan.l:786 -msgid "zero-length delimited identifier" -msgstr "identificativo delimitato di lunghezza zero" +#: utils/sort/tuplesort.c:4427 +#, c-format +msgid "Key %s is duplicated." +msgstr "La chiave %s è duplicata." -#: scan.l:806 syncrep_scanner.l:91 -msgid "unterminated quoted identifier" -msgstr "identificativo tra virgolette non terminato" +#: utils/sort/tuplesort.c:4428 +#, c-format +msgid "Duplicate keys exist." +msgstr "Esistono chiavi duplicate." -#: scan.l:969 -msgid "operator too long" -msgstr "operatore troppo lungo" +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 utils/sort/tuplestore.c:1330 +#, c-format +msgid "could not seek in tuplestore temporary file" +msgstr "impossibile cercare nel file temporaneo di tuplestore" -#. translator: %s is typically the translation of "syntax error" -#: scan.l:1125 +#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 utils/sort/tuplestore.c:1548 #, c-format -msgid "%s at end of input" -msgstr "%s alla fine dell'input" +msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" +msgstr "impossibile leggere dal file temporaneo di tuplestore: leggere solo %zu di %zu byte" -#. translator: first %s is typically the translation of "syntax error" -#: scan.l:1133 +#: utils/time/snapmgr.c:570 #, c-format -msgid "%s at or near \"%s\"" -msgstr "%s a o presso \"%s\"" +msgid "The source transaction is not running anymore." +msgstr "La transazione di origine non è più in esecuzione." -#: scan.l:1294 scan.l:1326 -msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" -msgstr "i valori escape Unicode non possono essere usati per code point superiori a 007F se la codifica del server non è UTF8" +# translator: %s represents an SQL statement name +#: utils/time/snapmgr.c:1164 +#, c-format +msgid "cannot export a snapshot from a subtransaction" +msgstr "non è possibile esportare uno snapshot da una sotto-transazione" -#: scan.l:1322 scan.l:1467 -msgid "invalid Unicode escape value" -msgstr "valore escape Unicode non valido" +#: 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 "dati dello snapshot non validi nel file \"%s\"" -#: scan.l:1531 +#: utils/time/snapmgr.c:1420 #, c-format -msgid "nonstandard use of \\' in a string literal" -msgstr "uso non standard di \\' in una stringa letterale" +msgid "SET TRANSACTION SNAPSHOT must be called before any query" +msgstr "SET TRANSACTION SNAPSHOT dev'essere invocato prima di qualunque query" -#: scan.l:1532 +#: utils/time/snapmgr.c:1429 #, c-format -msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." -msgstr "Usa '' per scrivere gli apici nelle stringhe, oppure usa la sintassi di escape delle stringhe (E'...')." +msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" +msgstr "una transazione che importa uno snapshot deve avere livello di isolamento SERIALIZABLE o REPEATABLE READ" -#: scan.l:1541 +#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 #, c-format -msgid "nonstandard use of \\\\ in a string literal" -msgstr "uso non standard di \\\\ in una stringa letterale" +msgid "invalid snapshot identifier: \"%s\"" +msgstr "identificativo di snapshot non valido: \"%s\"" -#: scan.l:1542 +#: utils/time/snapmgr.c:1539 #, c-format -msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." -msgstr "Usa la sintassi di escape delle stringhe per i backslash, cioè E'\\\\'." +msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" +msgstr "una transazione serializzabile non può importare uno snapshot da una transazione non serializzabile" -#: scan.l:1556 +#: utils/time/snapmgr.c:1543 #, c-format -msgid "nonstandard use of escape in a string literal" -msgstr "uso non standard dell'escape in una stringa letterale" +msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" +msgstr "una transazione non di sola lettura non può importare uno snapshot da una transazione di sola lettura" -#: scan.l:1557 +#: utils/time/snapmgr.c:1558 #, c-format -msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." -msgstr "Usa la sintassi di escape per le stringhe per effettuare gli escape, cioè, E'\\r\\n'." +msgid "cannot import a snapshot from a different database" +msgstr "non è possibile importare uno snapshot da un database diverso" diff --git a/third_party/spanner_pg/src/backend/po/ja.po b/third_party/spanner_pg/src/backend/po/ja.po index 9a13c705..e1a6f930 100644 --- a/third_party/spanner_pg/src/backend/po/ja.po +++ b/third_party/spanner_pg/src/backend/po/ja.po @@ -9,54 +9,92 @@ # msgid "" msgstr "" -"Project-Id-Version: postgres (PostgreSQL 14)\n" +"Project-Id-Version: postgres (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-09-20 09:19+0900\n" -"PO-Revision-Date: 2023-09-20 09:31+0900\n" +"POT-Creation-Date: 2024-01-29 12:58+0900\n" +"PO-Revision-Date: 2024-01-29 13:06+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:130 ../common/compression.c:139 ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "このビルドでは%sによる圧縮をサポートしていません" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "圧縮オプションがあるはずの場所に空文字列が見つかりました" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "認識できない圧縮オプション: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "圧縮オプション\"%s\"には値が必要です" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "圧縮オプション\"%s\"の値は整数でなければなりません" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "圧縮アルゴリズム\"%s\"は圧縮レベルを受け付けません" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "圧縮アルゴリズム\"%s\"では%dから%dまでの圧縮レベルが指定可能です(デフォルトは%d)" + +#: ../common/compression.c:353 +#, 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/copyfrom.c:1516 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 commands/copyfrom.c:1525 commands/extension.c:3401 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:1329 access/transam/xlog.c:3573 access/transam/xlog.c:4817 access/transam/xlog.c:11629 access/transam/xlog.c:11642 access/transam/xlog.c:12097 access/transam/xlog.c:12177 access/transam/xlog.c:12214 access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 access/transam/xlogfuncs.c:722 -#: commands/extension.c:3492 libpq/hba.c:534 replication/basebackup.c:2026 replication/logical/origin.c:729 replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 replication/logical/snapbuild.c:1863 replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 replication/slot.c:1727 replication/slot.c:1768 replication/walsender.c:545 storage/file/buffile.c:445 storage/file/copydir.c:195 utils/adt/genfile.c:202 utils/adt/misc.c:888 -#: utils/cache/relmapper.c:744 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1349 access/transam/xlog.c:3209 access/transam/xlog.c:4024 access/transam/xlogrecovery.c:1223 access/transam/xlogrecovery.c:1315 access/transam/xlogrecovery.c:1352 access/transam/xlogrecovery.c:1412 backup/basebackup.c:1844 commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 replication/logical/snapbuild.c:1939 replication/slot.c:1807 replication/slot.c:1848 replication/walsender.c:658 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/xlog.c:3578 access/transam/xlog.c:4822 replication/basebackup.c:2030 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1868 replication/logical/snapbuild.c:1910 replication/logical/snapbuild.c:1937 replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 access/transam/xlog.c:3214 access/transam/xlog.c:4029 backup/basebackup.c:1848 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 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: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:1341 access/transam/twophase.c:1746 access/transam/xlog.c:3442 access/transam/xlog.c:3613 access/transam/xlog.c:3618 access/transam/xlog.c:3946 -#: access/transam/xlog.c:4787 access/transam/xlog.c:5712 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:5009 replication/logical/snapbuild.c:1772 replication/logical/snapbuild.c:1945 replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 storage/file/copydir.c:218 -#: storage/file/copydir.c:223 storage/file/fd.c:738 storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 utils/cache/relmapper.c:898 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 ../common/controldata_utils.c:271 ../common/controldata_utils.c:274 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:1361 access/transam/twophase.c:1773 access/transam/xlog.c:3056 access/transam/xlog.c:3249 access/transam/xlog.c:3254 access/transam/xlog.c:3392 +#: access/transam/xlog.c:3994 access/transam/xlog.c:4740 commands/copyfrom.c:1585 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:5016 replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 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:154 msgid "byte ordering mismatch" -msgstr "バイトオーダーの不整合" +msgstr "バイトオーダが合っていません" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:156 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -64,47 +102,59 @@ 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 "" -"バイトオーダーが異なる可能性があります。\n" -"pg_controlファイルを格納するために使用するバイトオーダーが本プログラムで使用\n" +"バイトオーダが異なる可能性があります。\n" +"pg_controlファイルを格納するために使用するバイトオーダが本プログラムで使用\n" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" -"このPostgreSQLはこのデータディレクトリと互換性がなくなります。" +"PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../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:1264 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1285 access/transam/xlog.c:3328 access/transam/xlog.c:3484 access/transam/xlog.c:3528 access/transam/xlog.c:3726 access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 postmaster/syslogger.c:1488 replication/basebackup.c:616 replication/basebackup.c:1616 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3604 replication/logical/reorderbuffer.c:4155 replication/logical/reorderbuffer.c:4931 replication/logical/snapbuild.c:1727 replication/logical/snapbuild.c:1834 replication/slot.c:1699 replication/walsender.c:518 replication/walsender.c:2563 -#: storage/file/copydir.c:161 storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 utils/cache/relmapper.c:842 utils/error/elog.c:1938 utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 ../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:1305 access/transam/xlog.c:2943 access/transam/xlog.c:3125 access/transam/xlog.c:3164 access/transam/xlog.c:3359 access/transam/xlog.c:4014 +#: access/transam/xlogrecovery.c:4243 access/transam/xlogrecovery.c:4346 access/transam/xlogutils.c:852 backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 replication/logical/reorderbuffer.c:4162 replication/logical/reorderbuffer.c:4938 replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 utils/cache/relmapper.c:792 utils/cache/relmapper.c:900 utils/error/elog.c:1933 utils/init/miscinit.c:1374 utils/init/miscinit.c:1508 utils/init/miscinit.c:1585 utils/misc/guc.c:8998 utils/misc/guc.c:9047 #, 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:1719 access/transam/twophase.c:1728 access/transam/xlog.c:11386 access/transam/xlog.c:11424 access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 postmaster/postmaster.c:5684 postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:240 ../common/controldata_utils.c:243 access/transam/twophase.c:1746 access/transam/twophase.c:1755 access/transam/xlog.c:8676 access/transam/xlogfuncs.c:600 backup/basebackup_server.c:173 backup/basebackup_server.c:266 postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 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: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:1740 access/transam/xlog.c:3435 access/transam/xlog.c:3607 access/transam/xlog.c:4780 access/transam/xlog.c:10869 access/transam/xlog.c:10910 -#: replication/logical/snapbuild.c:1765 replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: ../common/controldata_utils.c:257 ../common/controldata_utils.c:262 ../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:1767 access/transam/xlog.c:3049 access/transam/xlog.c:3243 access/transam/xlog.c:3987 access/transam/xlog.c:7979 access/transam/xlog.c:8022 +#: backup/basebackup_server.c:207 replication/logical/snapbuild.c:1772 replication/slot.c:1684 replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 storage/smgr/md.c:992 storage/smgr/md.c:1033 storage/sync/sync.c:453 utils/cache/relmapper.c:949 utils/misc/guc.c:8767 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:560 ../common/exec.c:605 ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 lib/dshash.c:245 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:2550 postmaster/postmaster.c:4208 postmaster/postmaster.c:5609 postmaster/postmaster.c:5973 replication/libpqwalreceiver/libpqwalreceiver.c:287 replication/logical/logical.c:205 replication/walsender.c:592 storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 -#: storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 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:5049 utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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:238 +#: ../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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 libpq/auth.c:1336 libpq/auth.c:1404 libpq/auth.c:1962 libpq/be-secure-gssapi.c:520 postmaster/bgworker.c:349 postmaster/bgworker.c:931 postmaster/postmaster.c:2594 postmaster/postmaster.c:4180 postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 replication/libpqwalreceiver/libpqwalreceiver.c:300 replication/logical/logical.c:205 replication/walsender.c:701 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:1451 storage/ipc/procarray.c:2280 storage/ipc/procarray.c:2287 storage/ipc/procarray.c:2792 storage/ipc/procarray.c:3423 utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 utils/adt/pg_locale.c:617 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:5192 utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8745 utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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:238 #, c-format msgid "out of memory" -msgstr "メモリ不足" +msgstr "メモリ不足です" + +#: ../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 +msgid "destination buffer too small" +msgstr "出力先バッファが小さすぎます" + +#: ../common/cryptohash_openssl.c:348 ../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" +msgstr "カレントディレクトリを識別できませんでした: %m" #: ../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" -msgstr "不正なバイナリ\"%s\"" +msgstr "バイナリ\"%s\"は不正です" #: ../common/exec.c:218 #, c-format @@ -114,151 +164,160 @@ msgstr "バイナリ\"%s\"を読み取れませんでした" #: ../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "実行対象の\"%s\"が見つかりませんでした" +msgstr "実行すべき\"%s\"がありませんでした" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../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:299 access/transam/xlog.c:11260 replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8325 backup/basebackup.c:1340 utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 storage/ipc/latch.c:1789 #, c-format 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" +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" +msgstr "nullポインタは複製できません(内部エラー)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1297 access/transam/xlog.c:11362 access/transam/xlog.c:11400 access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 commands/tablespace.c:897 guc-file.l:1063 replication/basebackup.c:439 replication/basebackup.c:622 -#: replication/basebackup.c:698 replication/logical/snapbuild.c:1644 storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 +#: ../common/file_utils.c:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1317 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:237 backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 commands/copyfrom.c:1535 commands/copyto.c:725 commands/extension.c:3390 commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1066 postmaster/pgarch.c:597 replication/logical/snapbuild.c:1651 +#: 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:166 ../common/pgfnames.c:48 commands/tablespace.c:729 commands/tablespace.c:739 postmaster/postmaster.c:1518 storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 commands/tablespace.c:759 postmaster/postmaster.c:1579 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:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../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:383 access/transam/xlogarchive.c:412 postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1784 replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:426 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 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:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "内部エラー" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "エスケープシーケンス\"\\%s\"は不正です。" -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "入力の終端を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "\":\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON値を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "文字列または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "文字列を想定していましたが、\"%s\"でした。" -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "トークン\"%s\"は不正です。" -#: ../common/jsonapi.c:1118 jsonpath_scan.l:500 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:496 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 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:1125 jsonpath_scan.l:521 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:517 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." -msgstr "Unicodeの上位サロゲートは上位サロゲートに続いてはいけません。" +msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:1127 jsonpath_scan.l:532 jsonpath_scan.l:542 jsonpath_scan.l:584 +#: ../common/jsonapi.c:1136 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:259 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " +msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "ヒント: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -274,7 +333,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:2553 +#: ../common/restricted_token.c:64 libpq/auth.c:1366 libpq/auth.c:2398 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "ライブラリ\"%s\"をロードできませんでした: エラーコード %lu" @@ -302,28 +361,40 @@ 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 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:1187 replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" -msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした: %m" +msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした。: %m" #: ../common/rmtree.c:101 ../common/rmtree.c:113 #, c-format msgid "could not remove file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリを削除できませんでした: %m" +#: ../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 msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -345,7 +416,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザーID %ld が見つかりませんでした: %s" -#: ../common/username.c:45 libpq/auth.c:2053 +#: ../common/username.c:45 libpq/auth.c:1898 msgid "user does not exist" msgstr "ユーザーが存在しません" @@ -384,12 +455,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\"です" @@ -414,30 +485,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" @@ -447,6 +518,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" @@ -467,43 +548,42 @@ msgstr "アクセストークンのメンバーシップを確認できません msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "インデックス\"%s\" ページ%uのBRIN範囲要約のリクエストは登録されていません" -#: access/brin/brin.c:1036 access/brin/brin.c:1140 access/gin/ginfast.c:1043 access/transam/xlog.c:11031 access/transam/xlog.c:11568 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:1036 access/brin/brin.c:1143 access/gin/ginfast.c:1042 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:1037 access/brin/brin.c:1141 +#: access/brin/brin.c:1037 access/brin/brin.c:1144 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN制御関数はリカバリ中は実行できません。" -#: access/brin/brin.c:1045 access/brin/brin.c:1149 +#: access/brin/brin.c:1042 access/brin/brin.c:1149 #, c-format -msgid "block number out of range: %s" -msgstr "ブロック番号が範囲外です: %s" +msgid "block number out of range: %lld" +msgstr "ブロック番号が範囲外です: %lld" -#: access/brin/brin.c:1089 access/brin/brin.c:1175 +#: access/brin/brin.c:1086 access/brin/brin.c:1175 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\"はBRINインデックスではありません" -#: access/brin/brin.c:1105 access/brin/brin.c:1191 +#: access/brin/brin.c:1102 access/brin/brin.c:1191 #, 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:3012 access/brin/brin_minmax_multi.c:3155 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 +#: access/brin/brin.c:1111 access/brin/brin.c:1207 access/gin/ginfast.c:1087 parser/parse_utilcmd.c:2287 #, c-format -msgid "cannot accept a value of type %s" -msgstr "%s型の値は受け付けられません" +msgid "index \"%s\" is not valid" +msgstr "インデックス\"%s\"は有効ではありません" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 access/brin/brin_minmax_multi.c:2185 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 +#: access/brin/brin_bloom.c:749 access/brin/brin_bloom.c:791 access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 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 "interval out of range" -msgstr "intervalが範囲外です" +msgid "cannot accept a value of type %s" +msgstr "%s型の値は受け付けられません" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 access/spgist/spgdoinsert.c:2275 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 access/gist/gist.c:1462 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を超えています" @@ -588,95 +668,95 @@ msgstr "%2$s型の属性\"%1$s\"が%3$s型の対応する属性と合致しま msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "%2$s型の属性\"%1$s\"が%3$s型の中に存在しません。" -#: access/common/heaptuple.c:1124 access/common/heaptuple.c:1459 +#: access/common/heaptuple.c:1133 access/common/heaptuple.c:1468 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "列数(%d)が上限(%d)を超えています" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "インデックス列数(%d)が上限(%d)を超えています" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:965 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "インデックス行が%zuバイトを必要としますが最大値は%zuです" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1906 +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "非サポートの書式コード: %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: 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:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "有効な値は\"local\"と\"cascaded\"です。" -#: access/common/reloptions.c:682 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "ユーザー定義リレーションのパラメータ型の制限を超えました" -#: access/common/reloptions.c:1225 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESETにはパラメータの値を含めてはいけません" -#: access/common/reloptions.c:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "認識できないパラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12538 +#: access/common/reloptions.c:1303 utils/misc/guc.c:13002 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSと定義されたテーブルはサポートされません" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "認識できないラメータ \"%s\"" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "パラメータ\"%s\"が複数回指定されました" -#: access/common/reloptions.c:1592 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "不正なブール型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1604 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "不正な整数型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 +#: 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:1612 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "有効な値の範囲は\"%d\"~\"%d\"です。" -#: access/common/reloptions.c:1624 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "不正な浮動小数点型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:1632 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "有効な値の範囲は\"%f\"~\"%f\"です。" -#: access/common/reloptions.c:1654 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "不正な列挙型オプションの値 \"%s\": %s" @@ -684,19 +764,14 @@ msgstr "不正な列挙型オプションの値 \"%s\": %s" #: access/common/toast_compression.c:32 #, c-format msgid "compression method lz4 not supported" -msgstr "圧縮方式lz4はサポートされていません" +msgstr "圧縮方式 lz4 はサポートされていません" #: access/common/toast_compression.c:33 #, c-format msgid "This functionality requires the server to be built with lz4 support." -msgstr "この機能はlz4サポートを有効にしてビルドしたサーバーを必要とします。" +msgstr "この機能はlz4lサポート付きでビルドしたサーバーを必要とします。" -#: 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 "%sを指定してPostgreSQLを再構築する必要があります。" - -#: access/common/tupdesc.c:825 parser/parse_clause.c:771 parser/parse_relation.c:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "列\"%s\"はSETOFとして宣言できません" @@ -711,22 +786,22 @@ msgstr "記録リストが長すぎます" msgid "Reduce maintenance_work_mem." msgstr "maintenance_work_mem を小さくしてください。" -#: access/gin/ginfast.c:1044 +#: access/gin/ginfast.c:1043 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "GIN保留リストはリカバリ中には処理できません。" -#: access/gin/ginfast.c:1051 +#: access/gin/ginfast.c:1050 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\"はGINインデックスではありません" -#: access/gin/ginfast.c:1062 +#: access/gin/ginfast.c:1061 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "他のセッションの一時インデックスにはアクセスできません" -#: access/gin/ginget.c:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "インデックス\"%s\"内で行の再検索に失敗しました" @@ -741,7 +816,7 @@ msgstr "古いGINインデックスはインデックス全体のスキャンや msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "これを修復するには REINDEX INDEX \"%s\" をおこなってください。" -#: access/gin/ginutil.c:145 executor/execExpr.c:2169 utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 utils/adt/arrayfuncs.c:3866 utils/adt/arrayfuncs.c:6535 utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s型の比較関数が見つかりません" @@ -761,25 +836,25 @@ msgstr "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"はサポ msgid "support function number %d is invalid for access method %s" msgstr "サポート関数番号%dはアクセスメソッド%sに対して不正です" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "インデックス\"%s\"内に無効と判断されている内部タプルがあります" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 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: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 +#: access/gist/gist.c:762 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:1175 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" -msgstr "インデックス\"%s\"、ブロック%uでの不完全は分割を修正します" +msgstr "インデックス\"%s\"内の不完全な分割を修正します、ブロック%u" #: access/gist/gistsplit.c:446 #, c-format @@ -791,12 +866,12 @@ 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:797 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:807 +#: 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:808 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: 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に破損したページがあります" @@ -811,33 +886,33 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$s 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:278 access/hash/hashfunc.c:335 utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "文字列のハッシュ値計算で使用する照合順序を特定できませんでした" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:711 catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:1988 commands/tablecmds.c:16949 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:1004 utils/adt/varchar.c:733 utils/adt/varchar.c:994 utils/adt/varchar.c:1055 -#: utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:1955 commands/tablecmds.c:17509 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 utils/adt/like_support.c:1025 utils/adt/varchar.c:733 utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 +#: 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:2004 access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1026 #, 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\"の中のオーバーフローページが足りません" @@ -867,32 +942,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:2288 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカーではタプルの挿入はできません" -#: access/heap/heapam.c:2759 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処理中はタプルの削除はできません" -#: access/heap/heapam.c:2805 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "不可視のタプルを削除しようとしました" -#: access/heap/heapam.c:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3188 access/heap/heapam.c:6032 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処理中はタプルの更新はできません" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3312 #, c-format msgid "attempted to update invisible tuple" msgstr "不可視のタプルを更新しようとしました" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4676 access/heap/heapam.c:4714 access/heap/heapam.c:4979 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"の行ロックを取得できませんでした" @@ -912,8 +987,8 @@ msgstr "行が大きすぎます: サイズは%zu、上限は%zu" msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "ファイル\"%1$s\"に書き込めませんでした、%3$dバイト中%2$dバイト書き込みました: %m" -#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:3351 access/transam/xlog.c:3542 access/transam/xlog.c:4759 access/transam/xlog.c:11377 access/transam/xlog.c:11415 access/transam/xlog.c:11820 access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4633 postmaster/postmaster.c:5671 replication/logical/origin.c:587 replication/slot.c:1551 storage/file/copydir.c:167 -#: storage/smgr/md.c:218 utils/time/snapmgr.c:1261 +#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 access/transam/timeline.c:329 access/transam/timeline.c:485 access/transam/xlog.c:2965 access/transam/xlog.c:3178 access/transam/xlog.c:3966 access/transam/xlog.c:8659 access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:517 postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 replication/logical/origin.c:587 replication/slot.c:1631 +#: 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" @@ -923,273 +998,229 @@ msgstr "ファイル\"%s\"を作成できませんでした: %m" msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3423 access/transam/xlog.c:3598 access/transam/xlog.c:4771 postmaster/postmaster.c:4643 postmaster/postmaster.c:4653 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1741 replication/slot.c:1586 storage/file/buffile.c:506 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 utils/misc/guc.c:10316 utils/misc/guc.c:10330 utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 +#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:502 access/transam/xlog.c:3037 access/transam/xlog.c:3234 access/transam/xlog.c:3978 commands/dbcommands.c:529 postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 replication/slot.c:1666 +#: storage/file/buffile.c:537 storage/file/copydir.c:207 utils/init/miscinit.c:1449 utils/init/miscinit.c:1460 utils/init/miscinit.c:1468 utils/misc/guc.c:8728 utils/misc/guc.c:8759 utils/misc/guc.c:10757 utils/misc/guc.c:10771 utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 #, c-format msgid "could not write to file \"%s\": %m" -msgstr "ファイル\"%s\"に書き込めませんでした: %m" +msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1679 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:4424 replication/logical/snapbuild.c:1686 replication/logical/snapbuild.c:2102 replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 storage/file/fd.c:3239 storage/file/reinit.c:250 -#: storage/ipc/dsm.c:315 storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 utils/time/snapmgr.c:1606 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:436 postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:773 +#: 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:775 +#: 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:780 +#: 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:782 +#: 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:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "ページ: %u削除、%u残存、%uスキャン (全体の%.2f%%)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "タプル: %lld削除、%lld残存、%lldが削除されているがまだ除去できない\n" + +#: access/heap/vacuumlazy.c:703 +#, c-format +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:708 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "削除可能限界: %u、これは処理完了時には%d XID分過去になります\n" + +#: access/heap/vacuumlazy.c:714 #, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "ページ: %uを削除、%uが残存、%uがピンによってスキップ、%uが凍結によってスキップ\n" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "新しいrelfrozenxid: %u、これは前回の値よりも%d XID分進んでいます\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:721 #, c-format -msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" -msgstr "タプル: %lldを削除, %lldが残存, %lldが参照されていないがまだ削除できない, 最古のxmin: %u\n" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "" +"新しいrelminmxid: %u、これは前回の値よりも%d MXID分進んでいます\n" +"\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " -msgstr "インデックススキャンは不要: " +msgstr "インデックススキャンは不要です: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " -msgstr "インデックススキャンが必要: " +msgstr "インデックススキャンが必要です: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" -msgstr "テーブル内の%uページ(全体の%.2f%%)には%lld個の削除行識別子がありました\n" +msgstr "テーブル内の%uページ(全体の%.2f%%)にあった%lld行の削除行識別子が削除されました\n" -#: access/heap/vacuumlazy.c:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " -msgstr "インデックスのスキャンをスキップしました: " +msgstr "インデックススキャンはスキップされました: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " -msgstr "フェイルセーフのためインデックスのスキャンがスキップされました: " +msgstr "フェイルセーフによりインデックススキャンがスキップされました: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" -msgstr "テーブル内の%uページ(全体の%.2f%%)には%lld個の削除行識別子があります\n" +msgstr "テーブル内の%uページ(全体の%.2f%%)には%lld行の削除行識別子があります\n" -#: access/heap/vacuumlazy.c:834 +#: access/heap/vacuumlazy.c:755 #, 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" +msgstr "インデックス\"%s\": ページ数: 合計%u、新規削除%u、削除済%u、再利用可%u\n" -#: access/heap/vacuumlazy.c:846 commands/analyze.c:814 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" -msgstr "I/O時間: 読み込み: %.3fミリ秒, 書き込み: %.3fミリ秒\\n\n" +msgstr "I/O時間: 読み込み: %.3fミリ秒, 書き込み: %.3fミリ秒\n" -#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, 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:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "バッファ使用: %lldヒット, %lld失敗, %lld ダーティ化\n" -#: access/heap/vacuumlazy.c:857 +#: access/heap/vacuumlazy.c:785 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" -msgstr "WAL使用量: %lldのレコード, %lldの全ページイメージ, %lluバイト\\n\n" +msgstr "WAL使用量: %lldのレコード, %lldの全ページイメージ, %lluバイト\n" -#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "システム使用状況: %s" -#: access/heap/vacuumlazy.c:933 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "\"%s.%s\"に対して積極的VACUUMを実行しています" - -#: access/heap/vacuumlazy.c:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "\"%s.%s\"に対してVACUUMを実行しています" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" -msgstr "テーブル\"%1$s\": %3$uページ中の%2$lld個の削除行識別子を除去しました" - -#: access/heap/vacuumlazy.c:1656 -#, c-format -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%lld個の削除済み行バージョンがまだ除去できません、最古のxmin: %u\\n\n" - -#: 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] "バッファピンのため%uページが、" -msgstr[1] "バッファピンのため%uページが、" - -#: access/heap/vacuumlazy.c:1662 -#, 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:1666 commands/indexcmds.c:4152 commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s。" - -#: access/heap/vacuumlazy.c:1669 -#, c-format -msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -msgstr "テーブル\"%1$s\": 全%5$uページ中%4$uページで%2$lld行の除去可 、%3$lld行の除去不可な行バージョンが見つかりました" - -#: 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個の削除行識別子があります" +msgstr "テーブル\"%1$s\": %3$uページ内の%2$lldの削除済み行識別子を除去" -#: access/heap/vacuumlazy.c:2617 +#: access/heap/vacuumlazy.c:2629 #, c-format 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\"の必須ではないメンテナンスがスキップされます" +msgstr "%4$d回のインデックススキャンののち、フェイルセーフとしてテーブル\"%1$s.%2$s.%3$s\"の必須ではないメンテナンスをスキップします" -#: access/heap/vacuumlazy.c:2622 +#: access/heap/vacuumlazy.c:2634 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "このテーブルのrelfrozenxidまたはrelminmxidは古すぎます。" -#: access/heap/vacuumlazy.c:2623 +#: 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 "" -"設定パラメータ\"maintenance_work_mem\" または \"autovacuum_work_mem\" を増加させることを検討してください。\n" -"あるいは、VACUUMがトランザクションIDの割り当てに追従できるようにする他の方法の検討が必要になるかもしれません。" - -#: 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] "インデックスのクリーンアップのために%d個の並列VACUUMワーカーを起動しました (計画値: %d)" -msgstr[1] "インデックスのクリーンアップのために%d個の並列VACUUMワーカーを起動しました (計画値: %d)" - -#: 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] "インデックスのVACUUMのために%d個の並列VACUUMワーカーを起動しました (計画値: %d)" -msgstr[1] "インデックスのVACUUMのために%d個の並列VACUUMワーカーを起動しました (計画値: %d)" - -#: access/heap/vacuumlazy.c:3063 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"をスキャンしました" - -#: 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:3124 -#, 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.\n" -"%s." -msgstr "" -"\"%.0fインデックス行バージョンが削除されました。\\n\"\n" -"\"%uインデックスページが新たに削除されました。\\n\"\n" -"\"%uインデックスページが現在削除され、そのうち%uページが現在再利用可能です。\\n\"\n" -"\"%s。\"" +"設定パラメータ\"maintenance_work_mem\"または\"autovacuum_work_mem\"を増やすことを検討してください。\n" +"VACUUMがトランザクションIDの割り当てに追従できるようにする他の方法を検討する必要があるかもしれません。" -#: access/heap/vacuumlazy.c:3233 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\":競合するロックが存在するため切り詰めを中断します" -#: access/heap/vacuumlazy.c:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "テーブル\"%s\": %uページから%uページに切り詰め" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "テーブル\"%s\": 競合するロック要求が存在するため、切り詰めを保留します" -#: access/heap/vacuumlazy.c:3508 +#: access/heap/vacuumlazy.c:3170 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "\"%s\"のVACUUMに対するパラレルオプションを無効化します --- 一時テーブルは並列にVACUUMできません" -#: access/heap/vacuumlazy.c:4274 +#: access/heap/vacuumlazy.c:3383 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "リレーション\"%3$s.%4$s\"のブロック%1$u、オフセット%2$uのスキャン中" -#: access/heap/vacuumlazy.c:4277 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" -msgstr "リレーション\"%2$s.%3$s\"のブロック%1$uのスキャン中" +msgstr "リレーション\\\"%2$s.%3$s\\\"のブロック%1$uのスキャン中" -#: access/heap/vacuumlazy.c:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"のスキャン中" -#: access/heap/vacuumlazy.c:4289 +#: 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中" +msgstr "リレーション\"%3$s.%4$s\"のブロック%1$u、オフセット%2$uのVACUUM処理中" -#: access/heap/vacuumlazy.c:4292 +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" -msgstr "リレーション\"%2$s.%3$s\"のブロック%1$uのVACUUM処理中" +msgstr "リレーション\\\"%2$s.%3$s\\\"のブロック%1$uのVACUUM処理中" -#: access/heap/vacuumlazy.c:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" -msgstr "リレーション\"%s.%s\"のVACUUM中" +msgstr "リレーション\"%s.%s\"のVACUUM処理中" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" -msgstr "リレーション\"%2$s.%3$s\"のインデックス%1$sのVACUUM処理中" +msgstr "リレーション\\\"%2$s.%3$s\\\"のインデックス%1$sのVACUUM処理中" -#: access/heap/vacuumlazy.c:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" -msgstr "リレーション\"%2$s.%3$s\"のインデックス%1$sのクリーンアップ処理中" +msgstr "リレーション\\\"%2$s.%3$s\\\"のインデックス%1$sのクリーンアップ処理中" -#: access/heap/vacuumlazy.c:4312 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" -msgstr "リレーション\"%s.%s\"を%uブロックに切り詰め中" +msgstr "リレーション \"%s.%s\"を%uブロックに切り詰め中" #: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format @@ -1201,37 +1232,37 @@ msgstr "アクセスメソッド\"%s\"のタイプが%sではありません" msgid "index access method \"%s\" does not have a handler" msgstr "インデックスアクセスメソッド\"%s\"はハンドラを持っていません" -#: access/index/genam.c:486 +#: 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:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 commands/tablecmds.c:16647 commands/tablecmds.c:18398 +#: access/index/indexam.c:203 catalog/objectaddress.c:1376 commands/indexcmds.c:2783 commands/tablecmds.c:271 commands/tablecmds.c:295 commands/tablecmds.c:17195 commands/tablecmds.c:18980 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1010 #, c-format msgid "operator class %s has no options" msgstr "演算子クラス%sにはオプションはありません" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "重複したキー値は一意性制約\"%s\"違反となります" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "キー %s はすでに存在します。" -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "これは不変でないインデックス式が原因である可能性があります" -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2330 +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "インデックス\"%s\"はbtreeではありません" @@ -1241,27 +1272,27 @@ msgstr "インデックス\"%s\"はbtreeではありません" 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:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "インデックス\"%s\"に削除処理中の内部ページがあります" -#: 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 "これは9.3かそれ以前のバージョンで、アップグレード前にVACUUMが中断された際に起きた可能性があります。REINDEXしてください。" -#: access/nbtree/nbtutils.c:2665 +#: access/nbtree/nbtutils.c:2684 #, 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:2671 +#: access/nbtree/nbtutils.c:2690 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "インデックス行はリレーション\"%3$s\"のタプル(%1$u,%2$u)を参照しています。" -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:2694 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1275,12 +1306,12 @@ 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:244 +#: access/spgist/spgutils.c:242 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "リーフ型が入力型と異なる場合は圧縮メソッドの定義が必要です" -#: access/spgist/spgutils.c:1017 +#: access/spgist/spgutils.c:1023 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST内部タプルのサイズ%zuが最大値%zuを超えています" @@ -1288,19 +1319,19 @@ msgstr "SP-GiST内部タプルのサイズ%zuが最大値%zuを超えていま #: 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と一致していません" +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:83 access/table/table.c:112 access/table/table.c:145 catalog/aclchk.c:1792 +#: 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:88 access/table/table.c:117 access/table/table.c:150 catalog/aclchk.c:1799 commands/tablecmds.c:13367 commands/tablecmds.c:16656 +#: 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:13884 commands/tablecmds.c:17204 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\"は複合型です" @@ -1315,10 +1346,10 @@ msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではあり msgid "%s cannot be empty." msgstr "%sは空にはできません。" -#: access/table/tableamapi.c:122 utils/misc/guc.c:12462 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12926 #, c-format msgid "%s is too long (maximum %d characters)." -msgstr "%sが長過ぎます(最大%d文字)。" +msgstr "%s が長過ぎます(最大%d文字)。" #: access/table/tableamapi.c:145 #, c-format @@ -1335,22 +1366,22 @@ msgstr "テーブルアクセスメソッド\"%s\"は存在しません。" msgid "sample percentage must be between 0 and 100" msgstr "サンプリングの割合は0と100の間です" -#: access/transam/commit_ts.c:280 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "トランザクション%uのコミットタイムスタンプは取得できません" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "コミットタイムスタンプ情報を取得できません" -#: access/transam/commit_ts.c:380 +#: 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:382 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"が設定されていることを確認してください。" @@ -1379,14 +1410,12 @@ msgstr "OID %u を持つデータベースは周回によるデータ損失を 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:1059 access/transam/multixact.c:2343 #, 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:1120 #, c-format @@ -1398,7 +1427,6 @@ msgstr "マルチトランザクションの\"メンバ\"が制限を超えま 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:1126 #, c-format @@ -1410,12 +1438,11 @@ msgstr "vacuum_multixact_freeze_min_age と vacuum_multixact_freeze_table_age 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:1162 #, 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を実行してください。" +msgstr "vacuum_multixact_freeze_min_age と vacuum_multixact_freeze_table_age をより小さな値に設定した上で、そのデータベースでVACUUMを実行してください。" #: access/transam/multixact.c:1301 #, c-format @@ -1425,7 +1452,7 @@ msgstr "MultiXactId %uはもう存在しません: 周回しているようで #: access/transam/multixact.c:1307 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" -msgstr "MultiXactId %uを作成できませんでした: 周回しているようです" +msgstr "MultiXactId %uを作成できませんでした: 周回している様子" #: access/transam/multixact.c:2339 access/transam/multixact.c:2348 access/transam/varsup.c:151 access/transam/varsup.c:158 access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format @@ -1439,12 +1466,12 @@ msgstr "" #: access/transam/multixact.c:2622 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" -msgstr "最古のチェックポイントの際のマルチトランザクション%uがディスク上に存在しないため、マルチトランザクションメンバーの周回防止を無効にしました" +msgstr "最古のチェックポイント済みのマルチトランザクション%uがディスク上に存在しないため、マルチトランザクションメンバーの周回防止機能を無効にしました" #: access/transam/multixact.c:2644 #, c-format msgid "MultiXact member wraparound protections are now enabled" -msgstr "マルチトランザクションメンバーの周回防止が有効になりました" +msgstr "マルチトランザクションメンバーの周回防止機能が有効になりました" #: access/transam/multixact.c:3031 #, c-format @@ -1495,60 +1522,115 @@ msgstr "動的共有メモリセグメントをマップできませんでした msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントのマジックナンバーが不正です" -#: access/transam/slru.c:713 +#: 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:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "ファイル\"%s\"が存在しません。ゼロとして読み込みます" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 access/transam/slru.c:960 access/transam/slru.c:965 access/transam/slru.c:972 access/transam/slru.c:977 access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "トランザクション%uのステータスにアクセスできませんでした" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "ファイル\"%s\"をオープンできませんでした: %m。" -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, 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:960 +#: access/transam/slru.c:961 #, 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:965 +#: access/transam/slru.c:966 #, 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:972 +#: access/transam/slru.c:973 #, 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:977 +#: access/transam/slru.c:978 #, 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:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "ファイル\"%s\"をfsyncできませんでした: %m。" -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "ファイル\"%s\"をクローズできませんでした: %m。" -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" -msgstr "ディレクトリ\"%s\"を切り詰めできませんでした: 周回しているようです" +msgstr "ディレクトリ\"%s\"を切り詰めできませんでした: 明らかに周回しています" #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format @@ -1590,181 +1672,179 @@ 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:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "トランザクション識別子\"%s\"は長すぎます" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "トランザクションの準備は無効にされているためできません。" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "max_prepared_transactionsを非ゼロに設定してください。" -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:413 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別子\"%s\"はすでに存在します" -#: access/transam/twophase.c:417 access/transam/twophase.c:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済みのトランザクションの最大数に達しました" -#: access/transam/twophase.c:418 access/transam/twophase.c:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "max_prepared_transactionsを増加してください(現状%d)。" -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "識別子\"%s\"の準備されたトランザクションのロックが取得できません" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "準備されたトランザクションの終了が拒否されました" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:606 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "スーパーユーザーまたはこのトランザクションを準備したユーザーである必要があります。" -#: access/transam/twophase.c:613 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "準備されたトランザクションは別のデータベースに属しています" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:618 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "終了させるためにはこのトランザクションを準備したデータベースに接続してください。" -#: access/transam/twophase.c:629 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "識別子\"%s\"の準備されたトランザクションはありません" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1170 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2相状態ファイルの最大長が制限を超えました" -#: access/transam/twophase.c:1305 +#: access/transam/twophase.c:1325 #, c-format 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[0] "ファイル\"%s\"のサイズが不正: %lld バイト" -#: access/transam/twophase.c:1314 +#: access/transam/twophase.c:1334 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "ファイル\"%s\"のCRCオフセットのアライメントが不正です" -#: access/transam/twophase.c:1332 +#: access/transam/twophase.c:1352 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$dバイトを読み込みました" -#: access/transam/twophase.c:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ファイル\"%s\"に格納されているマジックナンバーが不正です" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ファイル\"%s\"内に格納されているサイズが不正です" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出されたCRCチェックサムがファイル\"%s\"に格納されている値と一致しません" -#: access/transam/twophase.c:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダの割り当てに中に失敗しました。" -#: access/transam/twophase.c:1417 +#: access/transam/twophase.c:1425 #, 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:1422 +#: access/transam/twophase.c:1430 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "WALの%X/%Xから2相状態を読み取れませんでした" -#: access/transam/twophase.c:1430 +#: access/transam/twophase.c:1438 #, 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:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"を再作成できませんでした: %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, 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:2068 +#: access/transam/twophase.c:2095 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリから準備済みトランザクション%uを復元します" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2188 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "不要になったトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2166 +#: access/transam/twophase.c:2195 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "不要になったトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2179 +#: access/transam/twophase.c:2208 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "未来のトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2186 +#: access/transam/twophase.c:2215 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "未来のトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2211 +#: access/transam/twophase.c:2240 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルが破損しています" -#: access/transam/twophase.c:2216 +#: access/transam/twophase.c:2245 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上にあるトランザクション%uの2相状態が破損しています" -#: access/transam/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルを復元できませんでした" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." msgstr "2相状態ファイルがWALレコード%X/%Xで見つかりましたが、このトランザクションはすでにディスクから復元済みです。" -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" @@ -1798,549 +1878,849 @@ msgstr "データベース\"%s\"は%uトランザクション以内にVACUUMす msgid "database with OID %u must be vacuumed within %u transactions" msgstr "OID %uのデータベースは%uトランザクション以内にVACUUMを実行する必要があります" -#: access/transam/xact.c:1046 +#: 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:1584 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "コミットされたサブトランザクション数の最大値(%d)が制限を越えました" -#: access/transam/xact.c:2435 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "一時オブジェクトに対する操作を行ったトランザクションをPREPAREすることはできません" -#: access/transam/xact.c:2445 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "エクスポートされたスナップショットを持つトランザクションをPREPAREすることはできません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3416 +#: access/transam/xact.c:3479 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%sはトランザクションブロックの内側では実行できません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3426 +#: access/transam/xact.c:3489 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%sはサブトランザクションブロックの内側では実行できません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s はパイプライン内での実行はできません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, c-format msgid "%s cannot be executed from a function" msgstr "%s は関数内での実行はできません" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3517 access/transam/xact.c:3832 access/transam/xact.c:3911 access/transam/xact.c:4034 access/transam/xact.c:4185 access/transam/xact.c:4254 access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 access/transam/xact.c:3974 access/transam/xact.c:4097 access/transam/xact.c:4248 access/transam/xact.c:4317 access/transam/xact.c:4428 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%sはトランザクションブロック内でのみ使用できます" -#: access/transam/xact.c:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "すでにトランザクションが実行中です" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "実行中のトランザクションがありません" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "並列処理中にはコミットはできません" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, c-format msgid "cannot abort during a parallel operation" msgstr "パラレル処理中にロールバックはできません" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4212 #, c-format msgid "cannot define savepoints during a parallel operation" -msgstr "パラレル処理中にセーブポイントは設定できません" +msgstr "パラレル処理中にセーブポイントは定義できません" -#: access/transam/xact.c:4236 +#: access/transam/xact.c:4299 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "並列処理中はセーブポイントの解放はできません" -#: access/transam/xact.c:4246 access/transam/xact.c:4297 access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "セーブポイント\"%s\"は存在しません" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "セーブポイント\"%s\"は現在のセーブポイントレベルには存在しません" -#: access/transam/xact.c:4345 +#: access/transam/xact.c:4408 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "パラレル処理中にセーブポイントのロールバックはできません" -#: access/transam/xact.c:4473 +#: access/transam/xact.c:4536 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "並列処理中はサブトランザクションを開始できません" -#: access/transam/xact.c:4541 +#: access/transam/xact.c:4604 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "並列処理中はサブトランザクションをコミットできません" -#: access/transam/xact.c:5188 +#: access/transam/xact.c:5251 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "1トランザクション内には 2^32-1 個より多くのサブトランザクションを作成できません" -#: access/transam/xlog.c:1836 +#: access/transam/xlog.c:1465 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" -msgstr "生成済みのWALの終点以降までの書き出しが要求されました; 要求 %X/%X、現在位置 %X/%X" +msgstr "生成されたWALより先の位置までのフラッシュ要求; 要求 %X/%X, 現在位置 %X/%X" -#: access/transam/xlog.c:2609 +#: access/transam/xlog.c:2226 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "ログファイル%sのオフセット%uに長さ%zuの書き込みができませんでした: %m" -#: access/transam/xlog.c:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "これはアーカイブリカバリ中にたまに起きますが、その場合は無害であることがわかっています。" - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 replication/walsender.c:2557 +#: access/transam/xlog.c:3473 access/transam/xlogutils.c:847 replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" -#: access/transam/xlog.c:4289 +#: access/transam/xlog.c:3758 #, c-format msgid "could not rename file \"%s\": %m" msgstr "ファイル\"%s\"の名前を変更できませんでした: %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3800 access/transam/xlog.c:3810 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "WALディレクトリ\"%s\"は存在しません" -#: access/transam/xlog.c:4347 +#: access/transam/xlog.c:3816 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "なかったWALディレクトリ\"%s\"を作成しています" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3819 commands/dbcommands.c:3115 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "なかったディレクトリ\"%s\"の作成に失敗しました: %m" -#: access/transam/xlog.c:4472 -#, 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:4610 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" - -#: access/transam/xlog.c:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "新しい目標タイムラインは%uです" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3886 #, c-format msgid "could not generate secret authorization token" msgstr "秘密の認証トークンを生成できませんでした" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 access/transam/xlog.c:4871 access/transam/xlog.c:4878 access/transam/xlog.c:4885 access/transam/xlog.c:4890 access/transam/xlog.c:4897 access/transam/xlog.c:4904 access/transam/xlog.c:4911 access/transam/xlog.c:4918 access/transam/xlog.c:4925 access/transam/xlog.c:4932 access/transam/xlog.c:4941 access/transam/xlog.c:4948 utils/init/miscinit.c:1583 +#: access/transam/xlog.c:4045 access/transam/xlog.c:4054 access/transam/xlog.c:4078 access/transam/xlog.c:4085 access/transam/xlog.c:4092 access/transam/xlog.c:4097 access/transam/xlog.c:4104 access/transam/xlog.c:4111 access/transam/xlog.c:4118 access/transam/xlog.c:4125 access/transam/xlog.c:4132 access/transam/xlog.c:4139 access/transam/xlog.c:4148 access/transam/xlog.c:4155 utils/init/miscinit.c:1606 #, c-format msgid "database files are incompatible with server" msgstr "データベースファイルがサーバーと互換性がありません" -#: access/transam/xlog.c:4839 +#: access/transam/xlog.c:4046 #, 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:4843 +#: access/transam/xlog.c:4050 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." -msgstr "バイトオーダーの不整合の可能性があります。initdbを実行する必要がありそうです。" +msgstr "これはバイトオーダの不整合の可能性があります。initdbを実行する必要がありそうです。" -#: access/transam/xlog.c:4848 +#: access/transam/xlog.c:4055 #, 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:4851 access/transam/xlog.c:4875 access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: access/transam/xlog.c:4058 access/transam/xlog.c:4082 access/transam/xlog.c:4089 access/transam/xlog.c:4094 #, c-format msgid "It looks like you need to initdb." msgstr "initdbが必要のようです。" -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4069 #, c-format msgid "incorrect checksum in control file" msgstr "制御ファイル内のチェックサムが不正です" -#: access/transam/xlog.c:4872 +#: access/transam/xlog.c:4079 #, 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:4879 +#: access/transam/xlog.c:4086 #, 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:4886 +#: access/transam/xlog.c:4093 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "データベースクラスタはサーバー実行ファイルと異なる浮動小数点書式を使用しているようです。" -#: access/transam/xlog.c:4891 +#: access/transam/xlog.c:4098 #, 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: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:4929 access/transam/xlog.c:4936 access/transam/xlog.c:4944 access/transam/xlog.c:4951 +#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 access/transam/xlog.c:4115 access/transam/xlog.c:4122 access/transam/xlog.c:4129 access/transam/xlog.c:4136 access/transam/xlog.c:4143 access/transam/xlog.c:4151 access/transam/xlog.c:4158 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "再コンパイルもしくは initdb が必要そうです。" -#: access/transam/xlog.c:4898 +#: access/transam/xlog.c:4105 #, 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:4905 +#: access/transam/xlog.c:4112 #, 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:4912 +#: access/transam/xlog.c:4119 #, 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:4919 +#: access/transam/xlog.c:4126 #, 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:4926 +#: access/transam/xlog.c:4133 #, 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:4933 +#: access/transam/xlog.c:4140 #, 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:4942 +#: access/transam/xlog.c:4149 #, 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:4949 +#: access/transam/xlog.c:4156 #, 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:4958 +#: access/transam/xlog.c:4165 #, 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:4970 +#: access/transam/xlog.c:4177 #, 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:4974 +#: access/transam/xlog.c:4181 #, 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:5408 +#: access/transam/xlog.c:4622 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルに書き込めませんでした: %m" -#: access/transam/xlog.c:5416 +#: access/transam/xlog.c:4630 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをfsyncできませんでした: %m" -#: access/transam/xlog.c:5422 +#: access/transam/xlog.c:4636 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをクローズできませんでした: %m" -#: access/transam/xlog.c:5483 +#: access/transam/xlog.c:4854 #, 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:5548 +#: access/transam/xlog.c:4855 #, 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:5565 +#: access/transam/xlog.c:4856 #, 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:5566 +#: access/transam/xlog.c:4920 #, 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:5574 +#: access/transam/xlog.c:4931 #, 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:5612 +#: access/transam/xlog.c:4937 #, 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:5734 +#: access/transam/xlog.c:4943 #, c-format -msgid "archive recovery complete" -msgstr "アーカイブリカバリが完了しました" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "データベースシステムはシャットダウン中に中断されました; %s まで動作していたことは確認できます" -#: access/transam/xlog.c:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4949 #, 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:5821 +#: access/transam/xlog.c:4951 #, 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:5911 +#: access/transam/xlog.c:4957 #, 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:5918 +#: access/transam/xlog.c:4959 #, 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:5971 +#: access/transam/xlog.c:4965 #, 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:5989 +#: access/transam/xlog.c:4971 #, 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:6056 +#: access/transam/xlog.c:5355 #, 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:6064 +#: access/transam/xlog.c:5356 #, 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:6109 +#: access/transam/xlog.c:5359 #, c-format -msgid "pausing at the end of recovery" -msgstr "リカバリ完了位置で一時停止しています" +msgid "WAL ends before consistent recovery point" +msgstr "WALが一貫性があるリカバリポイントより前で終了しました" -#: access/transam/xlog.c:6110 +#: access/transam/xlog.c:5407 #, 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:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5440 #, c-format -msgid "recovery has paused" -msgstr "リカバリは一時停止中です" +msgid "archive recovery complete" +msgstr "アーカイブリカバリが完了しました" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6046 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "再開するには pg_xlog_replay_resume() を実行してください" +msgid "shutting down" +msgstr "シャットダウンしています" -#: access/transam/xlog.c:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6085 #, c-format -msgid "hot standby is not possible because of insufficient parameter settings" -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:6387 access/transam/xlog.c:6414 access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6097 #, c-format -msgid "%s = %d is a lower setting than on the primary server, where its value was %d." -msgstr "%s = %d はプライマリサーバーでの設定値%dより小さいです。" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "チェックポイント開始:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6396 +#: access/transam/xlog.c:6157 #, c-format -msgid "If recovery is unpaused, the server will shut down." -msgstr "一時停止が解除されると、サーバーはシャットダウンします。" +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:6397 +#: access/transam/xlog.c:6177 #, c-format -msgid "You can then restart the server after making the necessary configuration changes." -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 kB, 予測=%d kB" -#: access/transam/xlog.c:6408 +#: access/transam/xlog.c:6612 #, c-format -msgid "promotion is not possible because of insufficient parameter settings" -msgstr "パラメータ設定値が十分でないため昇格できません" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" -#: access/transam/xlog.c:6418 +#: access/transam/xlog.c:7169 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "必要な設定変更を行った後にサーバーを再起動してください。" +msgid "recovery restart point at %X/%X" +msgstr "リカバリ再開ポイントは%X/%Xです" -#: access/transam/xlog.c:6442 +#: access/transam/xlog.c:7171 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "パラメータの設定値が不足しているためリカバリを中断しました" +msgid "Last completed transaction was at log time %s." +msgstr "最後に完了したトランザクションはログ時刻 %s のものです" -#: access/transam/xlog.c:6448 +#: access/transam/xlog.c:7418 #, c-format -msgid "You can restart the server after making the necessary configuration changes." -msgstr "必要な設定変更を行った後、再起動することができます。" +msgid "restore point \"%s\" created at %X/%X" +msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7625 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "wal_level=minimal でWALが生成されました、リカバリは継続できません" +msgid "online backup was canceled, recovery cannot continue" +msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" -#: access/transam/xlog.c:6471 +#: access/transam/xlog.c:7682 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "これは一時的に wal_level=minimal にした場合に起こります。" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "シャットダウンチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:7740 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "wal_levelをminimalより上に設定したあとに取得されたバックアップを使用してください。" +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "オンラインチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6541 +#: access/transam/xlog.c:7769 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "制御ファイル内のチェックポイント位置が不正です" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "リカバリ終了チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:6552 +#: access/transam/xlog.c:8027 #, c-format -msgid "database system was shut down at %s" -msgstr "データベースシステムは %s にシャットダウンしました" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" -#: access/transam/xlog.c:6558 +#: access/transam/xlog.c:8033 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "データベースシステムはリカバリ中 %s にシャットダウンしました" +msgid "could not fdatasync file \"%s\": %m" +msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" -#: access/transam/xlog.c:6564 +#: access/transam/xlog.c:8128 access/transam/xlog.c:8495 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "データベースシステムはシャットダウン中に中断されました; %s まで動作していたことは確認できます" +msgid "WAL level not sufficient for making an online backup" +msgstr "オンラインバックアップを行うにはWALレベルが不十分です" -#: access/transam/xlog.c:6570 +#: access/transam/xlog.c:8129 access/transam/xlog.c:8496 access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "データベースシステムはリカバリ中 %s に中断されました" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "サーバーの開始時にwal_levelを\"replica\"または \"logical\"にセットする必要があります。" -#: access/transam/xlog.c:6572 +#: access/transam/xlog.c:8134 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "これはおそらくデータ破損があり、リカバリのために直前のバックアップを使用しなければならないことを意味します。" +msgid "backup label too long (max %d bytes)" +msgstr "バックアップラベルが長すぎます (最大%dバイト)" -#: access/transam/xlog.c:6578 +#: access/transam/xlog.c:8250 #, c-format -msgid "database system was interrupted while in recovery at log time %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:6580 +#: access/transam/xlog.c:8252 access/transam/xlog.c:8608 #, 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 "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:6586 +#: access/transam/xlog.c:8332 backup/basebackup.c:1345 utils/adt/misc.c:347 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "データベースシステムは中断されました: %s まで動作していたことは確認できます" +msgid "symbolic link \"%s\" target is too long" +msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" -#: access/transam/xlog.c:6592 +#: access/transam/xlog.c:8382 backup/basebackup.c:1360 commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "制御ファイル内のデータベース・クラスタ状態が不正です" +msgid "tablespaces are not supported on this platform" +msgstr "このプラットフォームではテーブル空間はサポートしていません" + +#: access/transam/xlog.c:8541 access/transam/xlog.c:8554 access/transam/xlogrecovery.c:1237 access/transam/xlogrecovery.c:1244 access/transam/xlogrecovery.c:1303 access/transam/xlogrecovery.c:1383 access/transam/xlogrecovery.c:1407 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "ファイル\"%s\"内の不正なデータ" + +#: access/transam/xlog.c:8558 backup/basebackup.c:1200 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "オンラインバックアップ中にスタンバイが昇格しました" + +#: access/transam/xlog.c:8559 backup/basebackup.c:1201 +#, 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:8606 +#, c-format +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "full_page_writes=offで生成されたWALはオンラインバックアップ中に再生されます" + +#: access/transam/xlog.c:8731 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" + +#: access/transam/xlog.c:8745 +#, c-format +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%d 秒経過)" + +#: access/transam/xlog.c:8747 +#, 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:8754 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "必要なすべての WAL セグメントがアーカイブされました" + +#: access/transam/xlog.c:8758 +#, 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:8807 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "バックエンドがpg_backup_stopの呼び出し前に終了したため、バックアップは異常終了しました" + +#: access/transam/xlogarchive.c:215 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "アーカイブファイル\"%s\"のサイズが不正です: %lld、正しくは%lld" + +#: access/transam/xlogarchive.c:224 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "ログファイル\"%s\"をアーカイブからリストアしました" + +#: access/transam/xlogarchive.c:238 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_commandが終了ステータス0を返却しましたが、stat()が失敗しました。" + +#: access/transam/xlogarchive.c:270 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした: %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:383 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:493 access/transam/xlogarchive.c:573 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %m" + +#: access/transam/xlogarchive.c:501 access/transam/xlogarchive.c:581 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "このセッションではすでにバックアップが進行中です" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "バックアップが進行中ではありません" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "pg_backup_start()を呼び出しましたか?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "リカバリ中はWAL制御関数は実行できません。" + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "リストアポイントを作るにはWALレベルが不足しています" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "リストアポイントとしては値が長すぎます(最大%d文字)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "リカバリ中は %s を実行できません。" + +#: 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 "recovery is not in progress" +msgstr "リカバリが進行中ではありません" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "リカバリ制御関数リカバリ中にのみを実行可能です。" + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "スタンバイの昇格を実行中です" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%sは昇格を開始した後には実行できません。" + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\"は負の値もしくはゼロにはできません" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:257 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "postmasterにシグナルを送信できませんでした: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "サーバーは%d秒以内に昇格しませんでした" + +#: access/transam/xlogprefetcher.c:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetchはposix_fadvise()を持たないプラットフォームではサポートされません。" + +#: access/transam/xlogreader.c:620 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "%X/%Xのレコードオフセットが不正です" + +#: access/transam/xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%Xでは継続レコードが必要です" + +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "%X/%Xのレコード長が不正です:長さは%uである必要がありますが、実際は%uでした" + +#: access/transam/xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "%X/%Xでcontrecordフラグがありません" + +#: access/transam/xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です" + +#: access/transam/xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "%2$X/%3$XのリソースマネージャID %1$uは不正です" + +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "%3$X/%4$Xのレコードの後方リンク%1$X/%2$Xが不正です" + +#: access/transam/xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" + +#: access/transam/xlogreader.c:1246 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは不正です" + +#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1301 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ログセグメント %2$s、オフセット%3$uの情報ビット%1$04Xは不正です" + +#: access/transam/xlogreader.c:1275 +#, 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:1283 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" + +#: access/transam/xlogreader.c:1289 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" + +#: access/transam/xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "ログセグメント%3$s、オフセット%4$uに想定外のページアドレス%1$X/%2$X" + +#: access/transam/xlogreader.c:1345 +#, 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の後)が順序通りではありません" + +#: access/transam/xlogreader.c:1750 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %uが%X/%Xで不正です" + +#: access/transam/xlogreader.c:1774 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" + +#: access/transam/xlogreader.c:1781 +#, 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です" + +#: access/transam/xlogreader.c:1817 +#, 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です" + +#: access/transam/xlogreader.c:1833 +#, 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です" + +#: access/transam/xlogreader.c:1847 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" + +#: access/transam/xlogreader.c:1862 +#, c-format +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/xlogreader.c:1878 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" + +#: access/transam/xlogreader.c:1890 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です" + +#: access/transam/xlogreader.c:1957 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "%X/%Xのレコードのサイズが不正です" + +#: access/transam/xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "WALレコード中ID %dのバックアップブロックを特定できませんでした" + +#: access/transam/xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした" + +#: access/transam/xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした" + +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "%1$X/%2$Xで、ブロック%4$dがこのビルドでサポートされない圧縮方式%3$sで圧縮されているため復元できませんでした" + +#: access/transam/xlogreader.c:2126 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした" + +#: access/transam/xlogreader.c:2134 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "%X/%Xのブロック%dが伸張できませんでした" -#: access/transam/xlog.c:6649 +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "スタンバイモードに入ります" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "XID%uまでのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "%sまでのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "\"%s\"までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "WAL位置(LSN) \"%X/%X\"までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:6668 +#: access/transam/xlogrecovery.c:564 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "最も古い一貫性確保点までのポイントインタイムリカバリを開始します" -#: access/transam/xlog.c:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "アーカイブリカバリを開始しています" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:635 +#, c-format +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "タイムラインID %5$u上でREDO LSN %1$X/%2$X、チェックポイントLSN %3$X/%4$Xからのバックアップ・リカバリを開始しました" + +#: access/transam/xlogrecovery.c:667 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "チェックポイントレコードが参照している redo 位置を見つけられませんでした" -#: access/transam/xlog.c:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:668 access/transam/xlogrecovery.c:678 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2351,1488 +2731,1394 @@ msgstr "" "バックアップからの復旧でなければ、\"%s/backup_label\"の削除を試みてください。.\n" "バックアップから復旧で\"%s/backup_label\"を削除すると、クラスタは壊れた状態で復旧されることに注意してください。" -#: access/transam/xlog.c:6755 +#: access/transam/xlogrecovery.c:677 #, c-format msgid "could not locate required checkpoint record" msgstr "必要なチェックポイントが見つかりませんでした" -#: access/transam/xlog.c:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:706 commands/tablespace.c:685 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: access/transam/xlog.c:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:738 access/transam/xlogrecovery.c:744 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ファイル\"%2$s\"が存在しないためファイル\"%1$s\"を無視します" -#: access/transam/xlog.c:6818 access/transam/xlog.c:12353 +#: access/transam/xlogrecovery.c:740 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "ファイル\"%s\"は\"%s\"にリネームされました。" -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:746 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m。" -#: access/transam/xlog.c:6875 +#: access/transam/xlogrecovery.c:785 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "REDO LSN %X/%Xのバックアプリカバリを再開しました" + +#: access/transam/xlogrecovery.c:810 #, c-format msgid "could not locate a valid checkpoint record" msgstr "有効なチェックポイントが見つかりませんでした" -#: access/transam/xlog.c:6913 +#: access/transam/xlogrecovery.c:834 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "要求されたタイムライン%uはこのサーバーの履歴からの子孫ではありません" -#: access/transam/xlog.c:6915 +#: access/transam/xlogrecovery.c:836 #, 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で分岐しています。" -#: access/transam/xlog.c:6929 +#: access/transam/xlogrecovery.c:850 #, 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を含みません" -#: access/transam/xlog.c:6959 +#: access/transam/xlogrecovery.c:878 #, c-format msgid "invalid next transaction ID" msgstr "次のトランザクションIDが不正です" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:883 #, c-format msgid "invalid redo in checkpoint record" msgstr "チェックポイントレコード内の不正なREDO" -#: access/transam/xlog.c:7070 +#: access/transam/xlogrecovery.c:894 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "シャットダウン・チェックポイントにおける不正なREDOレコード" -#: access/transam/xlog.c:7110 +#: access/transam/xlogrecovery.c:923 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "データベースシステムは正しくシャットダウンされていません; 自動リカバリを実行中" -#: access/transam/xlog.c:7114 +#: access/transam/xlogrecovery.c:927 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "タイムライン%uから、タイムライン%uを目標としてクラッシュリカバリを開始します" -#: access/transam/xlog.c:7161 +#: access/transam/xlogrecovery.c:970 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_labelに制御ファイルと整合しないデータが含まれます" -#: access/transam/xlog.c:7162 +#: access/transam/xlogrecovery.c:971 #, 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:7388 +#: access/transam/xlogrecovery.c:1025 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "リカバリコマンドファイル \"%s\"の使用はサポートされません" + +#: access/transam/xlogrecovery.c:1090 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "スタンバイモードはシングルユーザーサーバーではサポートされません" + +#: access/transam/xlogrecovery.c:1107 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "primary_conninfo と restore_command のどちらも指定されていません" + +#: access/transam/xlogrecovery.c:1108 +#, c-format +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "データベースサーバーはpg_walサブディレクトリに置かれたファイルを定期的に確認します。" + +#: access/transam/xlogrecovery.c:1116 +#, c-format +msgid "must specify restore_command when standby mode is not enabled" +msgstr "スタンバイモードを有効にしない場合は、restore_command の指定が必要です" + +#: access/transam/xlogrecovery.c:1154 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "リカバリ目標タイムライン%uが存在しません" + +#: access/transam/xlogrecovery.c:1304 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "読み取られたタイムラインIDは%uでしたが、%uであるはずです。" + +#: access/transam/xlogrecovery.c:1686 #, c-format msgid "redo starts at %X/%X" msgstr "REDOを%X/%Xから開始します" -#: access/transam/xlog.c:7613 +#: access/transam/xlogrecovery.c:1699 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "REDO進行中、経過時間 %ld.%02d秒, 現在のLSN: %X/%X" + +#: access/transam/xlogrecovery.c:1791 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "要求されたリカバリ停止ポイントは、一貫性があるリカバリポイントより前にあります" -#: access/transam/xlog.c:7651 +#: access/transam/xlogrecovery.c:1823 #, c-format msgid "redo done at %X/%X system usage: %s" -msgstr "REDOが%X/%Xで終了 システム使用状況: %s" +msgstr "REDOが%X/%Xで終了しました、システム使用状況: %s" -#: access/transam/xlog.c:7657 +#: access/transam/xlogrecovery.c:1829 #, c-format msgid "last completed transaction was at log time %s" msgstr "最後に完了したトランザクションのログ時刻は%sでした" -#: access/transam/xlog.c:7666 +#: access/transam/xlogrecovery.c:1838 #, c-format msgid "redo is not required" msgstr "REDOは必要ありません" -#: access/transam/xlog.c:7678 +#: access/transam/xlogrecovery.c:1849 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "指定したリカバリターゲットに到達する前にリカバリが終了しました" -#: access/transam/xlog.c:7762 access/transam/xlog.c:7766 -#, c-format -msgid "WAL ends before end of online backup" -msgstr "オンラインバックアップの終了より前にWALが終了しました" - -#: access/transam/xlog.c:7763 +#: access/transam/xlogrecovery.c:2024 #, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "オンラインバックアップ中に生成されたすべてのWALがリカバリで利用可能である必要があります。" - -#: access/transam/xlog.c:7767 -#, 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:7770 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WALが一貫性があるリカバリポイントより前で終了しました" - -#: access/transam/xlog.c:7805 -#, c-format -msgid "selected new timeline ID: %u" -msgstr "新しいタイムラインIDを選択: %u" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "%X/%Xで%sに上書きされて失われた継続行を正常にスキップしました" -#: access/transam/xlog.c:8249 +#: access/transam/xlogrecovery.c:2091 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "%2$s で想定外のディレクトリエントリ\"%1$s\"が見つかりました" -#: access/transam/xlog.c:8251 +#: access/transam/xlogrecovery.c:2093 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Pg_tblspc/ のすべてのディレクトリエントリは、シンボリックリンクである必要があります。" -#: access/transam/xlog.c:8252 +#: access/transam/xlogrecovery.c:2094 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." msgstr "これらのディレクトリを削除するか、またはallow_in_place_tablespacesを一時的にONに設定することでリカバリを完了させることができます。" -#: access/transam/xlog.c:8336 -#, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "%X/%X でリカバリの一貫性が確保されました" - -#: access/transam/xlog.c:8545 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "制御ファイル内の最初のチェックポイントへのリンクが不正です" - -#: access/transam/xlog.c:8549 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "backup_labelファイル内のチェックポイントへのリンクが不正です" - -#: access/transam/xlog.c:8567 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "最初のチェックポイントレコードが不正です" - -#: access/transam/xlog.c:8571 -#, c-format -msgid "invalid checkpoint record" -msgstr "チェックポイントレコードが不正です" - -#: access/transam/xlog.c:8582 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "プライマリチェックポイントレコード内のリソースマネージャIDが不正です" - -#: access/transam/xlog.c:8586 -#, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" - -#: access/transam/xlog.c:8599 +#: access/transam/xlogrecovery.c:2146 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "最初のチェックポイントレコード内のxl_infoが不正です" +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "REDO LSN%X/%X、終了LSN %X/%Xのバックアップ・リカバリが完了しました" -#: access/transam/xlog.c:8603 +#: access/transam/xlogrecovery.c:2176 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "チェックポイントレコード内のxl_infoが不正です" - -#: access/transam/xlog.c:8614 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "最初のチェックポイントレコード長が不正です" - -#: access/transam/xlog.c:8618 -#, c-format -msgid "invalid length of checkpoint record" -msgstr "チェックポイントレコード長が不正です" - -#: access/transam/xlog.c:8799 -#, c-format -msgid "shutting down" -msgstr "シャットダウン処理中" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 -#, 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:8850 -#, c-format -msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "チェックポイント開始:%s%s%s%s%s%s%s%s" - -#: access/transam/xlog.c:8910 -#, 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 kB, 予測=%d kB" - -#: access/transam/xlog.c:8930 -#, 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 "チェックポイント完了: %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:9374 -#, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" - -#: access/transam/xlog.c:9907 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "リカバリ再開ポイントは%X/%Xです" - -#: access/transam/xlog.c:9909 -#, c-format -msgid "Last completed transaction was at log time %s." -msgstr "最後に完了したトランザクションはログ時刻 %s のものです" +msgid "consistent recovery state reached at %X/%X" +msgstr "%X/%X でリカバリの一貫性が確保されました" -#: access/transam/xlog.c:10155 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2214 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" +msgid "WAL redo at %X/%X for %s" +msgstr "%X/%Xにある%sのWAL再生" -#: access/transam/xlog.c:10300 +#: access/transam/xlogrecovery.c:2310 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "チェックポイントレコードにおいて想定外の前回のタイムラインID %u(現在のタイムラインIDは%u)がありました" -#: access/transam/xlog.c:10309 +#: access/transam/xlogrecovery.c:2319 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "チェックポイントレコードにおいて想定外のタイムラインID %u (%uの後)がありました" -#: access/transam/xlog.c:10325 +#: access/transam/xlogrecovery.c:2335 #, 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。" -#: access/transam/xlog.c:10400 -#, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" - -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 access/transam/xlog.c:10542 -#, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" - -#: access/transam/xlog.c:10700 -#, c-format -msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" -msgstr "%X/%Xで%sに上書きされて失われた継続行を正常にスキップしました" - -#: access/transam/xlog.c:10915 -#, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" - -#: access/transam/xlog.c:10921 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" - -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 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 "リカバリ中はWAL制御関数は実行できません。" - -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 -#, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "オンラインバックアップを行うにはWALレベルが不十分です" - -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 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:11047 +#: access/transam/xlogrecovery.c:2519 access/transam/xlogrecovery.c:2795 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "バックアップラベルが長すぎます (最大%dバイト)" - -#: access/transam/xlog.c:11084 access/transam/xlog.c:11368 access/transam/xlog.c:11406 -#, c-format -msgid "a backup is already in progress" -msgstr "すでにバックアップが進行中です" +msgid "recovery stopping after reaching consistency" +msgstr "リカバリ処理は一貫性確保後に停止します" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:2540 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "pg_stop_backup()を実行後に再試行してください" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の前で停止します" -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:2630 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "full_page_writes=off で生成されたWALは最終リスタートポイントから再生されます" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの前に停止します" -#: access/transam/xlog.c:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:2637 #, 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 "recovery stopping before abort of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの前に停止します" -#: access/transam/xlog.c:11267 replication/basebackup.c:1439 utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2690 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "リカバリ処理は復元ポイント\"%s\"、時刻%s に停止します" -#: access/transam/xlog.c:11317 commands/tablespace.c:385 commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2708 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "このプラットフォームではテーブル空間はサポートしていません" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "リカバリ処理はWAL位置(LSN)\"%X/%X\"の後で停止します" -#: access/transam/xlog.c:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:2775 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "バックアップが進行中でないことが確かであれば、ファイル\"%s\"を削除し再実行してください。" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの後に停止します" -#: access/transam/xlog.c:11594 +#: access/transam/xlogrecovery.c:2783 #, c-format -msgid "exclusive backup not in progress" -msgstr "排他バックアップは進行中ではありません" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの後に停止します" -#: access/transam/xlog.c:11621 +#: access/transam/xlogrecovery.c:2864 #, c-format -msgid "a backup is not in progress" -msgstr "バックアップが進行中ではありません" +msgid "pausing at the end of recovery" +msgstr "リカバリ完了位置で一時停止しています" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 access/transam/xlog.c:12111 access/transam/xlog.c:12117 access/transam/xlog.c:12165 access/transam/xlog.c:12245 access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2865 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "ファイル\"%s\"内の不正なデータ" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "再開するには pg_wal_replay_resume() を実行してください" -#: access/transam/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2868 access/transam/xlogrecovery.c:4678 #, c-format -msgid "the standby was promoted during online backup" -msgstr "オンラインバックアップ中にスタンバイが昇格しました" +msgid "recovery has paused" +msgstr "リカバリは一時停止中です" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2869 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "つまり取得中のバックアップは破損しているため使用してはいけません。再度オンラインバックアップを取得してください。" +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "再開するには pg_xlog_replay_resume() を実行してください" -#: access/transam/xlog.c:11772 +#: access/transam/xlogrecovery.c:3135 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "full_page_writes=offで生成されたWALはオンラインバックアップ中に再生されます" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "ログファイル%2$s、オフセット%3$uのタイムラインID%1$uは想定外です" -#: access/transam/xlog.c:11892 +#: access/transam/xlogrecovery.c:3340 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "ログセグメント%s、オフセット%uを読み取れませんでした: %m" -#: access/transam/xlog.c:11904 +#: access/transam/xlogrecovery.c:3346 #, c-format -msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%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/xlog.c:11906 +#: access/transam/xlogrecovery.c:3995 #, 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 "invalid primary checkpoint link in control file" +msgstr "制御ファイル内の最初のチェックポイントへのリンクが不正です" -#: access/transam/xlog.c:11913 -#, c-format -msgid "all required WAL segments have been archived" -msgstr "必要なすべての WAL セグメントがアーカイブされました" +#: access/transam/xlogrecovery.c:3999 +#, c-format +msgid "invalid checkpoint link in backup_label file" +msgstr "backup_labelファイル内のチェックポイントへのリンクが不正です" -#: access/transam/xlog.c:11917 +#: access/transam/xlogrecovery.c:4017 #, 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 "invalid primary checkpoint record" +msgstr "最初のチェックポイントレコードが不正です" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:4021 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "バックエンドが pg_stop_backup の呼び出し前に終了したため、バックアップは異常終了しました" +msgid "invalid checkpoint record" +msgstr "チェックポイントレコードが不正です" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:4032 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "読み取られたタイムラインIDは%uでしたが、%uであるはずです。" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "プライマリチェックポイントレコード内のリソースマネージャIDが不正です" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:4036 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "%X/%Xにある%sのWAL再生" +msgid "invalid resource manager ID in checkpoint record" +msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" -#: access/transam/xlog.c:12342 +#: access/transam/xlogrecovery.c:4049 #, c-format -msgid "online backup mode was not canceled" -msgstr "オンラインバックアップモードはキャンセルされていません" +msgid "invalid xl_info in primary checkpoint record" +msgstr "最初のチェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlog.c:12343 +#: access/transam/xlogrecovery.c:4053 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m。" +msgid "invalid xl_info in checkpoint record" +msgstr "チェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:4064 #, c-format -msgid "online backup mode canceled" -msgstr "オンラインバックアップモードがキャンセルされました" +msgid "invalid length of primary checkpoint record" +msgstr "最初のチェックポイントレコード長が不正です" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:4068 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "ファイル\"%s\"、\"%s\"の名前はそれぞれ\"%s\"、\"%s\"へと変更されました。" +msgid "invalid length of checkpoint record" +msgstr "チェックポイントレコード長が不正です" -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:4124 #, 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 "new timeline %u is not a child of database system timeline %u" +msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" -#: access/transam/xlog.c:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4138 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "ログセグメント%s、オフセット%uを読み取れませんでした: %m" +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:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4157 #, 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 "new target timeline is %u" +msgstr "新しい目標タイムラインは%uです" -#: access/transam/xlog.c:13079 +#: access/transam/xlogrecovery.c:4360 #, c-format msgid "WAL receiver process shutdown requested" -msgstr "WAL受信プロセスのシャットダウンが要求されました" +msgstr "wal receiverプロセスのシャットダウンが要求されました" -#: access/transam/xlog.c:13174 +#: access/transam/xlogrecovery.c:4423 #, c-format msgid "received promote request" msgstr "昇格要求を受信しました" -#: access/transam/xlog.c:13187 +#: access/transam/xlogrecovery.c:4436 #, c-format msgid "promote trigger file found: %s" -msgstr "昇格トリガーファイルがあります: %s" +msgstr "昇格トリガファイルがあります: %s" -#: access/transam/xlog.c:13195 +#: access/transam/xlogrecovery.c:4444 #, c-format msgid "could not stat promote trigger file \"%s\": %m" -msgstr "昇格トリガーファイル\"%s\"のstatに失敗しました: %m" +msgstr "昇格トリガファイル\"%s\"のstatに失敗しました: %m" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4669 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "アーカイブファイル\"%s\"のサイズが不正です: %lld、正しくは%lld" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "不十分なパラメータ設定のため、ホットスタンバイを使用できません" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4670 access/transam/xlogrecovery.c:4697 access/transam/xlogrecovery.c:4727 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "ログファイル\"%s\"をアーカイブからリストアしました" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d はプライマリサーバーの設定値より小さいです、プライマリサーバーではこの値は%dでした。" -#: access/transam/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4679 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_commandが終了ステータス0を返却しましたが、stat()が失敗しました。" +msgid "If recovery is unpaused, the server will shut down." +msgstr "リカバリの一時停止を解除すると、サーバーはシャットダウンします。" -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4680 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした: %s" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "その後、必要な設定変更を行った後にサーバーを再起動できます。" -#. 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:4691 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "不十分なパラメータ設定のため、昇格できません" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4701 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %m" +msgid "Restart the server after making the necessary configuration changes." +msgstr "必要な設定変更を行ったのち、サーバーを再起動してください。" -#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4725 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "不十分なパラメータ設定値のためリカバリが停止しました" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4731 #, c-format -msgid "a backup is already in progress in this session" -msgstr "このセッションではすでにバックアップが進行中です" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "non-exclusive backup in progress" -msgstr "非排他バックアップが進行中です" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "ログセグメント%s、オフセット%dを読み取れませんでした: %m" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "pg_stop_backup('f') を実行しようとしていたのではないですか?" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "ログセグメント%1$s、オフセット%2$dを読み取れませんでした: %4$d 中 %3$d 読み取りました" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 commands/event_trigger.c:1869 commands/extension.c:1966 commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 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:3328 storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 -#: utils/misc/guc.c:10017 utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:253 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "集合を受け付けないコンテキストで集合値関数が呼び出されました" +msgid "expected end timeline %u but found timeline %u" +msgstr "最終タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 commands/event_trigger.c:1873 commands/extension.c:1970 commands/extension.c:2078 commands/extension.c:2363 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:3332 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:223 utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10021 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:277 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" +msgid "expected start timeline %u but found timeline %u" +msgstr "開始タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:304 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "非排他バックアップは進行中ではありません" +msgid "start timeline %u not found in history of timeline %u" +msgstr "開始タイムライン%uはタイムライン%uの履歴中にありません" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:355 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "pg_stop_backup('t') を実行しようとしていたのではないですか?" +msgid "could not rewind temporary file" +msgstr "一時ファイルを巻き戻しに失敗しました" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:374 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "リストアポイントを作るにはWALレベルが不足しています" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "一時ファイルからの読み込み失敗しました: %2$zuバイト中%1$zuバイト分のみ読み込みました" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:454 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "リストアポイントとしては値が長すぎます(最大%d文字)" +msgid "could not find any WAL files" +msgstr "WALファイルが全くありません" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "リカバリ中は %s を実行できません。" +msgid "could not find WAL file \"%s\"" +msgstr "WALファイル\"%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 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "recovery is not in progress" -msgstr "リカバリが進行中ではありません" +msgid "unexpected WAL file size \"%s\"" +msgstr "想定しないWALファイルのサイズ\"%s\"" -#: 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 +#: backup/basebackup.c:630 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "リカバリ制御関数リカバリ中にのみを実行可能です。" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "合計%lld個のデータチェックサム検証エラー" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:637 #, c-format -msgid "standby promotion is ongoing" -msgstr "スタンバイの昇格を実行中です" +msgid "checksum verification failure during base backup" +msgstr "ベースバックアップ中にチェックサム確認が失敗しました" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%sは昇格を開始した後には実行できません。" +msgid "duplicate option \"%s\"" +msgstr "\"%s\"オプションは重複しています" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:734 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\"は負の値もしくはゼロにはできません" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "認識されないチェックポイントタイプ: \"%s\"" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:769 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "postmasterにシグナルを送信できませんでした: %m" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%dはパラメータ\"%s\"の有効範囲を超えています(%d .. %d)" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:814 #, c-format -msgid "server did not promote within %d second" -msgid_plural "server did not promote within %d seconds" -msgstr[0] "サーバーは%d秒以内に昇格しませんでした" -msgstr[1] "サーバーは%d秒以内に昇格しませんでした" +msgid "unrecognized manifest option: \"%s\"" +msgstr "認識できない目録オプション: \"%s\"" -#: access/transam/xlogreader.c:354 +#: backup/basebackup.c:830 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "%X/%Xのレコードオフセットが不正です" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "認識できないチェックサムアルゴリズム: \"%s\"" -#: access/transam/xlogreader.c:362 +#: backup/basebackup.c:865 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "%X/%Xで継続レコードが要求されました" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "認識できない圧縮アルゴリズム: \"%s\"" -#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 +#: backup/basebackup.c:881 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "%X/%Xのレコード長が不正です: 長さは%uである必要がありますが、実際は%uでした" +msgid "unrecognized base backup option: \"%s\"" +msgstr "認識できないベースバックアップオプション: \"%s\"" -#: access/transam/xlogreader.c:429 +#: backup/basebackup.c:892 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます" +msgid "manifest checksums require a backup manifest" +msgstr "目録のチェックサムにはバックアップ目録が必要です" -#: access/transam/xlogreader.c:477 +#: backup/basebackup.c:901 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "%X/%Xで継続レコードフラグが設定されていません" +msgid "target detail cannot be used without target" +msgstr "ターゲット詳細はターゲットの指定なしでは指定できません" -#: access/transam/xlogreader.c:490 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "%3$X/%4$Xの継続レコードの長さ%1$uが不正です(%2$lldを期待していました)" +msgid "target \"%s\" does not accept a target detail" +msgstr "ターゲット\"%s\"はターゲット詳細を受け付けません" -#: access/transam/xlogreader.c:741 +#: backup/basebackup.c:921 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "%2$X/%3$XのリソースマネージャID %1$uが不正です" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "圧縮詳細は圧縮が有効でない場合は指定できません" -#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 +#: backup/basebackup.c:934 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "%3$X/%4$Xのレコードの後方リンク%1$X/%2$Xが不正です" +msgid "invalid compression specification: %s" +msgstr "不正な圧縮指定: %s" -#: access/transam/xlogreader.c:806 +#: backup/basebackup.c:1431 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" +msgid "skipping special file \"%s\"" +msgstr "スペシャルファイル\"%s\"をスキップしています" -#: access/transam/xlogreader.c:843 +#: backup/basebackup.c:1550 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは不正です" +msgid "invalid segment number %d in file \"%s\"" +msgstr "ファイル\"%2$s\"セグメント番号%1$dは不正です" -#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 +#: backup/basebackup.c:1582 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ログセグメント %2$s、オフセット%3$uの情報ビット%1$04Xは不正です" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "ファイル\"%s\"、ブロック%uでチェックサム検証に失敗しました: 読み込みバッファサイズ%dとページサイズ%dが異なっています" -#: access/transam/xlogreader.c:872 +#: backup/basebackup.c:1656 #, 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 "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "ファイル\"%s\"のブロック%uでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" -#: access/transam/xlogreader.c:880 +#: backup/basebackup.c:1663 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" -#: access/transam/xlogreader.c:886 +#: backup/basebackup.c:1719 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" +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個のチェックサムエラーが発生しました" -#: access/transam/xlogreader.c:917 +#: backup/basebackup.c:1765 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "ログセグメント%3$s、オフセット%4$uに想定外のページアドレス%1$X/%2$X" +msgid "file name too long for tar format: \"%s\"" +msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" -#: access/transam/xlogreader.c:942 +#: backup/basebackup.c:1770 #, 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 "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "シンボリックリンクのリンク先tarのフォーマットにとって長すぎます: ファイル名 \"%s\", リンク先 \"%s\"" -#: access/transam/xlogreader.c:1287 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "block_id %uが%X/%Xで不正です" +msgid "gzip compression is not supported by this build" +msgstr "このビルドではgzip圧縮はサポートされていません" -#: access/transam/xlogreader.c:1309 +#: backup/basebackup_gzip.c:143 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" +msgid "could not initialize compression library" +msgstr "圧縮ライブラリを初期化できませんでした" -#: access/transam/xlogreader.c:1316 +#: backup/basebackup_lz4.c:67 #, 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 "lz4 compression is not supported by this build" +msgstr "このビルドではlz4圧縮はサポートされていません" -#: access/transam/xlogreader.c:1352 +#: backup/basebackup_server.c:75 #, 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 "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "サーバー上に格納されるバックアップを作成するにはスーパーユーザーであるか、または pg_write_server_filesロールの権限を持つロールである必要があります" -#: access/transam/xlogreader.c:1368 +#: backup/basebackup_server.c:89 #, 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 "relative path not allowed for backup stored on server" +msgstr "サーバー上に格納されるバックアップでは相対パスは指定できません" -#: access/transam/xlogreader.c:1383 +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 commands/tablespace.c:163 commands/tablespace.c:179 commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 storage/file/copydir.c:47 #, 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 "could not create directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: access/transam/xlogreader.c:1398 +#: backup/basebackup_server.c:115 #, 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 "directory \"%s\" exists but is not empty" +msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: access/transam/xlogreader.c:1414 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" +msgid "could not access directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" -#: access/transam/xlogreader.c:1426 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 backup/basebackup_server.c:268 backup/basebackup_server.c:275 storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です" +msgid "Check free disk space." +msgstr "ディスクの空き容量をチェックしてください。" -#: access/transam/xlogreader.c:1513 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "%X/%Xのレコードのサイズが不正です" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "ファイル\"%1$s\"に書き込みできませんでした: オフセット%4$uで%3$dバイト中%2$dバイト分のみを書き出しました" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "認識できないターゲット: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "ターゲット\"%s\"にはターゲット詳細が必要です" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "このビルドではzstd圧縮はサポートされていません" -#: access/transam/xlogreader.c:1602 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "%X/%X、ブロック %d での圧縮イメージが不正です" +msgid "could not set compression worker count to %d: %s" +msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" -#: 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 オプションの値は1MBから1GBの間の2の累乗を指定します" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%sには値が必要です" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: 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 "詳細は\"%s --help\"で確認してください。\n" +msgstr "詳細については\"%s --help\"を実行してください。\n" -#: bootstrap/bootstrap.c:312 +#: 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:379 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" -msgstr "権限付与元は現在のユーザーでなければなりません" +msgstr "権限付与者は現在のユーザーでなければなりません" -#: 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 "リレーションに対する不正な権限のタイプ %s" -#: 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 "シーケンスに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "データベースに対する不正な権限タイプ %s" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "ドメインに対する不正な権限タイプ %s" -#: 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 "関数に対する不正な権限タイプ %s" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "言語に対する不正な権限タイプ %s" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "ラージオブジェクトに対する不正な権限タイプ %s" -#: 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 "スキーマに対する不正な権限タイプ %s" -#: 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 "プロシージャに対する不正な権限タイプ %s" -#: 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 "ルーチンに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "テーブル空間に対する不正な権限タイプ %s" -#: 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 "型に対する不正な権限タイプ %s" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "外部データラッパーに対する不正な権限タイプ %s" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "外部サーバーに対する不正な権限タイプ %s" -#: catalog/aclchk.c:537 +#: 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: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 +#: 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:926 catalog/aclchk.c:935 commands/collationcmds.c:119 commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 commands/dbcommands.c:158 commands/dbcommands.c:167 commands/dbcommands.c:176 commands/dbcommands.c:185 commands/dbcommands.c:194 -#: commands/dbcommands.c:203 commands/dbcommands.c:212 commands/dbcommands.c:221 commands/dbcommands.c:230 commands/dbcommands.c:239 commands/dbcommands.c:261 commands/dbcommands.c:1529 commands/dbcommands.c:1538 commands/dbcommands.c:1547 commands/dbcommands.c:1556 commands/extension.c:1757 commands/extension.c:1767 commands/extension.c:1777 commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 commands/publicationcmds.c:87 commands/publicationcmds.c:130 commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 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:408 replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "競合するオプション、あるいは余計なオプションがあります" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "デフォルト権限は列には設定できません" -#: catalog/aclchk.c:1206 +#: 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:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 commands/tablecmds.c:7092 commands/tablecmds.c:7248 commands/tablecmds.c:7298 commands/tablecmds.c:7372 commands/tablecmds.c:7442 commands/tablecmds.c:7554 commands/tablecmds.c:7648 commands/tablecmds.c:7707 commands/tablecmds.c:7796 commands/tablecmds.c:7825 commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 commands/tablecmds.c:11726 commands/tablecmds.c:11907 commands/tablecmds.c:12067 commands/tablecmds.c:13210 commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2460 parser/parse_relation.c:714 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3432 parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 commands/sequence.c:1663 commands/tablecmds.c:7275 commands/tablecmds.c:7431 commands/tablecmds.c:7481 commands/tablecmds.c:7555 commands/tablecmds.c:7625 commands/tablecmds.c:7737 commands/tablecmds.c:7831 commands/tablecmds.c:7890 commands/tablecmds.c:7979 commands/tablecmds.c:8009 commands/tablecmds.c:8137 +#: commands/tablecmds.c:8219 commands/tablecmds.c:8375 commands/tablecmds.c:8493 commands/tablecmds.c:12222 commands/tablecmds.c:12403 commands/tablecmds.c:12563 commands/tablecmds.c:13727 commands/tablecmds.c:16296 commands/trigger.c:954 parser/analyze.c:2506 parser/parse_relation.c:725 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3435 parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1147 commands/tablecmds.c:249 commands/tablecmds.c:16620 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:1172 commands/tablecmds.c:253 commands/tablecmds.c:17168 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:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE 権限のみをサポートします" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "テーブルに対する権限タイプ%sは不正です" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "列では権限タイプ %s は無効です" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE のみをサポートします" -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "言語\"%s\"は信頼されていません" -#: 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とREVOKEは信頼されない言語上では実行不可です。" -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "配列型の権限を設定できません" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "代わりに要素型の権限を設定してください。" -#: 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\"はドメインではありません" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "認識できない権限タイプ\"%s\"" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "集約 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "照合順序 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "列 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "変換 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "データベース %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "ドメイン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" -msgstr "イベントトリガー%s へのアクセスが拒否されました" +msgstr "イベントトリガ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "機能拡張 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "外部データラッパ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "外部サーバー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "外部テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "関数 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "インデックス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "言語 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "ラージオブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "実体化ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "演算子クラス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "演算子 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "演算子族 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3385 +#: 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:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "プロシージャ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "パブリケーション%sへのアクセスが拒否されました" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "ルーチン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "スキーマ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "シーケンス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "統計情報オブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "サブスクリプション %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "テーブル空間 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "テキスト検索設定 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "テキスト検索辞書 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "型 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "集約 %s の所有者である必要があります" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "照合順序 %s の所有者である必要があります" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "変換 %s の所有者である必要があります" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "データベース %s の所有者である必要があります" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "ドメイン %s の所有者である必要があります" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" -msgstr "イベントトリガー%s の所有者である必要があります" +msgstr "イベントトリガ %s の所有者である必要があります" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "機能拡張 %s の所有者である必要があります" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "外部データラッパー %s の所有者である必要があります" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "外部サーバー %s の所有者である必要があります" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "外部テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "関数 %s の所有者である必要があります" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "インデックス %s の所有者である必要があります" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "言語 %s の所有者である必要があります" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "ラージオブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "実体化ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "演算子クラス %s の所有者である必要があります" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "演算子 %s の所有者である必要があります" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "演算子族 %s の所有者である必要があります" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "プロシージャ %s の所有者である必要があります" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "パブリケーション %s の所有者である必要があります" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "ルーチン %s の所有者である必要があります" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "シーケンス %s の所有者である必要があります" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "サブスクリプション %s の所有者である必要があります" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "型 %s の所有者である必要があります" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "スキーマ %s の所有者である必要があります" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "統計情報オブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "テーブル空間 %s の所有者である必要があります" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "テキスト検索設定 %s の所有者である必要があります" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "テキスト検索辞書 %s の所有者である必要があります" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "リレーション %s の所有者である必要があります" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$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 "OID %2$uのリレーションに属性%1$dは存在しません" -#: 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 "OID %uのリレーションは存在しません" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 #, c-format msgid "database with OID %u does not exist" msgstr "OID %uのデータベースは存在しません" -#: 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 "OID %uのパラメータACLは存在しません" + +#: 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 "OID %uの関数は存在しません" -#: 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 "OID %uの言語は存在しません" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uのスキーマは存在しません" -#: 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 "OID %uのテーブル空間は存在しません" -#: 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 "OID %uの外部データラッパーは存在しません" -#: 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 "OID %uの外部サーバーは存在しません" -#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:389 utils/cache/typcache.c:444 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:390 utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "OID %uの型は存在しません" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "OID %uの演算子は存在しません" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "OID %uの演算子クラスは存在しません" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "OID %uの演算子族は存在しません" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "OID %uのテキスト検索辞書は存在しません" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "OID %uのテキスト検索設定は存在しません" -#: 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 "OID %uのイベントトリガーは存在しません" +msgstr "OID %uのイベントトリガは存在しません" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "OID %uの照合順序は存在しません" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "OID %uの変換は存在しません" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "OID %uの機能拡張は存在しません" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "OID %uのパブリケーションは存在しません" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "OID %uの統計情報オブジェクトは存在しません" -#: catalog/catalog.c:378 +#: catalog/catalog.c:447 #, c-format msgid "still searching for an unused OID in relation \"%s\"" -msgstr "リレーション\"%s\"内の未使用OIDを探索を継続中です" +msgstr "リレーション\"%s\"での未使用のOIDを探索を継続中" -#: catalog/catalog.c:380 +#: 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候補のチェックを%llu回行いましたが、使用されていないOIDはまだ見つかっていません。" -msgstr[1] "OID候補のチェックを%llu回行いましたが、使用されていないOIDはまだ見つかっていません。" -#: catalog/catalog.c:405 +#: 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が割り当てらrました" -msgstr[1] "リレーション\"%s\"で%llu回の試行後に新しいOIDが割り当てらrました" +msgstr[0] "リレーション\\\"%s\\\"で%llu回の試行後に新しいOIDが割り当てられました" -#: catalog/catalog.c:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "pg_nextoid() を呼び出すにはスーパーユーザーである必要があります" +msgid "must be superuser to call %s()" +msgstr "%s()を呼び出すにはスーパーユーザーである必要があります" -#: catalog/catalog.c:544 +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() はシステムカタログでのみ使用できます" -#: catalog/catalog.c:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "インデックス\"%s\"はテーブル\"%s\"には属していません" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "列\"%s\"はoid型ではありません" -#: catalog/catalog.c:573 +#: 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:538 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "データベースシステムが必要としているため%sを削除できません" + +#: catalog/dependency.c:830 catalog/dependency.c:1057 #, 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:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "代わりに%sを削除できます" -#: 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%sは%sに依存しています" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "削除は%sへ伝播します" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -3843,297 +4129,312 @@ msgid_plural "" msgstr[0] "" "\n" "および%d個のその他のオブジェクト(一覧についてはサーバーログを参照してください)" -msgstr[1] "" -"\n" -"および%d個のその他のオブジェクト(一覧についてはサーバーログを参照してください)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "他のオブジェクトが依存しているため%sを削除できません" -#: catalog/dependency.c:1197 catalog/dependency.c:1204 catalog/dependency.c:1216 commands/tablecmds.c:1304 commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1439 utils/misc/guc.c:7128 utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11424 utils/misc/guc.c:11458 utils/misc/guc.c:11492 utils/misc/guc.c:11535 -#: utils/misc/guc.c:11577 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 catalog/dependency.c:1212 commands/tablecmds.c:1328 commands/tablecmds.c:14369 commands/tablespace.c:476 commands/user.c:1008 commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1421 utils/misc/guc.c:7402 utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11880 utils/misc/guc.c:11914 utils/misc/guc.c:11948 utils/misc/guc.c:11991 +#: utils/misc/guc.c:12033 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "依存しているオブジェクトも削除するにはDROP ... CASCADEを使用してください" -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, 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:1882 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "%s型の定数をここで使用することはできません" -#: catalog/heap.c:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "リレーション\"%2$s\"の列\"%1$d\"は存在しません" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\"を作成する権限がありません" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "システムカタログの更新は現在禁止されています" -#: catalog/heap.c:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 commands/tablecmds.c:6865 #, c-format msgid "tables can have at most %d columns" msgstr "テーブルは最大で%d列までしか持てません" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7165 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "列名\"%s\"はシステム用の列名に使われています" -#: catalog/heap.c:543 +#: catalog/heap.c:500 #, 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:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sは疑似型%sです" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"は疑似型%sです" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, 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:666 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "照合可能な型 %2$s のパーティションキー列%1$sのための照合順序が見つかりませんでした" -#: catalog/heap.c:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "照合可能な型 %2$s を持つ列\"%1$s\"のための照合順序を決定できませんでした" -#: catalog/heap.c:1200 catalog/index.c:872 commands/createas.c:408 commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "リレーション\"%s\"はすでに存在します" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 catalog/pg_type.c:931 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 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 catalog/pg_type.c:931 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:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にTOASTのrelfilenodeの値が設定されていません" + +#: catalog/heap.c:1216 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのヒープOIDが設定されていません" -#: catalog/heap.c:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にrelfilenodeの値が設定されていません" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加できません" -#: catalog/heap.c:2731 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 commands/tablecmds.c:8710 +#: catalog/heap.c:2572 catalog/index.c:889 catalog/pg_constraint.c:689 commands/tablecmds.c:8867 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "すでに制約\"%s\"はリレーション\"%s\"に存在します" -#: catalog/heap.c:2908 +#: catalog/heap.c:2579 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承されていない制約と競合します" -#: catalog/heap.c:2919 +#: catalog/heap.c:2590 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承された制約と競合します" -#: catalog/heap.c:2929 +#: catalog/heap.c:2600 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の NOT VALID 制約と競合します" -#: catalog/heap.c:2934 +#: catalog/heap.c:2605 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:3039 +#: catalog/heap.c:2710 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生成カラム\"%s\"はカラム生成式中では使用できません" -#: catalog/heap.c:3041 +#: catalog/heap.c:2712 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生成カラムは他の生成カラムを参照できません。" -#: catalog/heap.c:3047 +#: catalog/heap.c:2718 #, c-format msgid "cannot use whole-row variable in column generation expression" -msgstr "列生成式では行全体参照は使用できません。" +msgstr "列生成式内では行全体参照は使用できません" -#: catalog/heap.c:3048 +#: catalog/heap.c:2719 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "これは生成列を自身の値に依存させることにつながります。" -#: catalog/heap.c:3101 +#: catalog/heap.c:2774 #, c-format msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2802 rewrite/rewriteHandler.c:1290 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"の型は%sですが、デフォルト式の型は%sです" -#: catalog/heap.c:3134 commands/prepare.c:368 parser/analyze.c:2684 parser/parse_target.c:594 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 +#: catalog/heap.c:2807 commands/prepare.c:334 parser/analyze.c:2730 parser/parse_target.c:594 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "式を書き換えるかキャストする必要があります。" -#: catalog/heap.c:3181 +#: catalog/heap.c:2854 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ではテーブル\"%s\"のみを参照することができます" -#: catalog/heap.c:3479 +#: catalog/heap.c:3152 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITと外部キーの組み合わせはサポートされていません" -#: catalog/heap.c:3480 +#: catalog/heap.c:3153 #, 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:3485 +#: catalog/heap.c:3158 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約で参照されているテーブルを削除できません" -#: catalog/heap.c:3486 +#: catalog/heap.c:3159 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"は\"%s\"を参照します。" -#: catalog/heap.c:3488 +#: catalog/heap.c:3161 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "同時にテーブル\"%s\"がtruncateされました。TRUNCATE ... CASCADEを使用してください。" -#: catalog/index.c:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"に複数のプライマリキーを持たせることはできません" -#: catalog/index.c:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "プライマリキーを式にすることはできません" -#: catalog/index.c:258 +#: catalog/index.c:259 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "主キー列\"%s\"がNOT NULL指定されていません" -#: catalog/index.c:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "ユーザーによるシステムカタログテーブルに対するインデックスの定義はサポートされていません" -#: catalog/index.c:811 +#: catalog/index.c:814 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" -msgstr "非決定的照合順序は演算子クラス\"%s\"ではサポートされません" +msgstr "非決定的照合順序は演算子クラス \"%s\" ではサポートされません" -#: catalog/index.c:826 +#: catalog/index.c:829 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "システムカタログテーブルの並行的インデックス作成はサポートされていません" -#: catalog/index.c:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "排他制約のためのインデックスの並列的作成はサポートされていません" -#: catalog/index.c:844 +#: catalog/index.c:847 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "initdbの後に共有インデックスを作成できません" -#: catalog/index.c:864 commands/createas.c:423 commands/sequence.c:162 parser/parse_utilcmd.c:209 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "リレーション\"%s\"はすでに存在します、スキップします" -#: catalog/index.c:914 +#: catalog/index.c:917 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのインデックスOIDが設定されていません" -#: catalog/index.c:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にインデックスのrelfilenodeの値が設定されていません" + +#: catalog/index.c:2232 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作でなければなりません" -#: catalog/index.c:3628 +#: catalog/index.c:3663 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "他のセッションの一時テーブルはインデクス再構築できません" -#: catalog/index.c:3639 commands/indexcmds.c:3572 +#: catalog/index.c:3674 commands/indexcmds.c:3536 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルの無効なインデックスの再作成はできません" -#: catalog/index.c:3655 commands/indexcmds.c:3452 commands/indexcmds.c:3596 commands/tablecmds.c:3273 +#: catalog/index.c:3690 commands/indexcmds.c:3416 commands/indexcmds.c:3560 commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "システムリレーション\"%s\"を移動できません" -#: catalog/index.c:3799 +#: catalog/index.c:3834 #, c-format msgid "index \"%s\" was reindexed" msgstr "インデックス\"%s\"のインデックス再構築が完了しました" -#: catalog/index.c:3936 +#: catalog/index.c:3971 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "TOASTテーブルの無効なインデックス \"%s.%s\"の再作成はできません、スキップします " -#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5233 +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5830 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "データベース間の参照は実装されていません: \"%s.%s.%s\"" @@ -4148,22 +4449,22 @@ msgstr "一時テーブルにはスキーマ名を指定できません" msgid "could not obtain lock on relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"のロックを取得できませんでした" -#: catalog/namespace.c:402 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 "リレーション\"%s\"のロックを取得できませんでした" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "リレーション\"%s.%s\"は存在しません" -#: catalog/namespace.c:435 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 "リレーション\"%s\"は存在しません" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1541 commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "作成先のスキーマが選択されていません" @@ -4208,12 +4509,12 @@ msgstr "テキスト検索テンプレート\"%s\"は存在しません" msgid "text search configuration \"%s\" does not exist" msgstr "テキスト検索設定\"%s\"は存在しません" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: catalog/namespace.c:2889 gram.y:15103 gram.y:17077 parser/parse_expr.c:817 parser/parse_target.c:1262 +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" @@ -4228,7 +4529,7 @@ msgstr "一時スキーマへ、または一時スキーマからオブジェク msgid "cannot move objects into or out of TOAST schema" msgstr "TOASTスキーマへ、またはTOASTスキーマからオブジェクトを移動できません" -#: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 commands/tablecmds.c:1249 +#: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "スキーマ\"%s\"は存在しません" @@ -4263,220 +4564,225 @@ msgstr "リカバリ中は一時テーブルを作成できません" msgid "cannot create temporary tables during a parallel operation" msgstr "並行処理中は一時テーブルを作成できません" -#: catalog/namespace.c:4338 commands/tablespace.c:1216 commands/variable.c:64 utils/misc/guc.c:11609 utils/misc/guc.c:11687 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 utils/misc/guc.c:12065 utils/misc/guc.c:12167 #, c-format msgid "List syntax is invalid." msgstr "リスト文法が無効です" -#: 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:2160 commands/tablecmds.c:6082 commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 commands/tablecmds.c:12339 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\"はテーブルではありません" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 commands/tablecmds.c:6121 commands/tablecmds.c:16625 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 commands/tablecmds.c:17173 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\"はビューではありません" -#: catalog/objectaddress.c:1384 commands/matview.c:186 commands/tablecmds.c:261 commands/tablecmds.c:16630 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 commands/tablecmds.c:17178 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\"は実体化ビューではありません" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 commands/tablecmds.c:6124 commands/tablecmds.c:16635 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 commands/tablecmds.c:17183 #, 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: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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 commands/tablecmds.c:275 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:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 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:2247 catalog/objectaddress.c:2331 #, 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:2265 catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "名前リストの長さは%d以上でなくてはなりません" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "引数リストの長さはちょうど%dである必要があります" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "ラージオブジェクト %u の所有者である必要があります" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1583 +#: catalog/objectaddress.c:2548 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:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "スーパーユーザーである必要があります" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "CREATEROLE 権限が必要です" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "認識されないオブジェクトタイプ\"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "%2$s の列 %1$s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "関数%s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "型%s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "%sから%sへの型変換" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "照合順序%s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "%2$sに対する制約%1$s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "制約%s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "変換%s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "%s のデフォルト値" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "言語%s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "ラージオブジェクト%u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "演算子%s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "アクセスメソッド%2$s用の演算子クラス%1$s" -#: catalog/objectaddress.c:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "アクセスメソッド%s" @@ -4485,7 +4791,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%4$sの演算子%1$d (%2$s, %3$s): %5$s" @@ -4494,221 +4800,231 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, c-format msgid "function %d (%s, %s) of %s: %s" -msgstr "%4$sの関数%1$d (%2$s, %3$s): %5$s" +msgstr "%4$s の関数 %1$d (%2$s, %3$s): %5$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" -msgstr "%2$sのルール%1$s" +msgstr "%2$s のルール %1$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" -msgstr "%2$sのトリガー%1$s" +msgstr "%2$s のトリガ %1$s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "スキーマ%s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "統計オブジェクト%s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "テキスト検索パーサ%s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "テキスト検索辞書%s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "テキスト検索テンプレート%s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "テキスト検索設定%s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "データベース%s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "テーブル空間%s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "外部データラッパー%s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "サーバー%s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "サーバー%2$s上のユーザーマッピング%1$s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいリレーションのデフォルト権限" -#: catalog/objectaddress.c:3727 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "新しいリレーションに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3801 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しいシーケンスのデフォルト権限" -#: catalog/objectaddress.c:3737 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "新しいシーケンスに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3743 +#: catalog/objectaddress.c:3811 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい関数のデフォルト権限" -#: catalog/objectaddress.c:3747 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "新しい関数に関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3753 +#: catalog/objectaddress.c:3821 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s のものである新しい型のデフォルト権限" -#: catalog/objectaddress.c:3757 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "新しい型に関するデフォルトの権限は、ロール%sに属します" -#: catalog/objectaddress.c:3763 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "ロール%sに属する新しいスキーマ上のデフォルト権限" -#: catalog/objectaddress.c:3770 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s に属するデフォルト権限" -#: catalog/objectaddress.c:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "デフォルトの権限はロール%sに属します。" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "機能拡張%s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" -msgstr "イベントトリガー%s" +msgstr "イベントトリガ%s" + +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "パラメータ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "%2$s のポリシ %1$s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "パブリケーション%s" +#: catalog/objectaddress.c:3978 +#, 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:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "パブリケーション %2$s での %1$s の発行" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "サブスクリプション%s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "言語%2$sの%1$s型に対する変換" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "テーブル%s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "インデックス%s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "シーケンス%s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "TOASTテーブル%s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "ビュー%s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "実体化ビュー%s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "複合型%s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "外部テーブル%s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "リレーション%s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "アクセスメソッド%2$sの演算子族%1$s" @@ -4718,7 +5034,6 @@ msgstr "アクセスメソッド%2$sの演算子族%1$s" 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:144 catalog/pg_aggregate.c:158 #, c-format @@ -4750,7 +5065,7 @@ msgstr "遷移関数がSTRICTかつ遷移用の型が入力型とバイナリ互 msgid "return type of inverse transition function %s is not %s" msgstr "逆遷移関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約の前進と反転の遷移関数のSTRICT属性は一致している必要があります" @@ -4765,7 +5080,7 @@ msgstr "追加の引数を持つ最終関数はSTRICT宣言できません" msgid "return type of combine function %s is not %s" msgstr "結合関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "遷移タイプ%sの結合関数はSTRICT宣言できません" @@ -4780,12 +5095,12 @@ msgstr "直列化関数%sの戻り値の型が%sではありません" msgid "return type of deserialization function %s is not %s" msgstr "復元関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 +#: 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:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 +#: 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\"疑似型の安全ではない使用" @@ -4800,7 +5115,7 @@ msgstr "移動集約の実装が%s型を返却しました、しかし普通の msgid "sort operator can only be specified for single-argument aggregates" msgstr "ソート演算子は単一引数の集約でのみ指定可能です" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "ルーチンの種別は変更できません" @@ -4825,7 +5140,7 @@ msgstr "\"%s\"は仮説集合集約です。" msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数の直接引数の数は変更できません" -#: 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 +#: 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" @@ -4841,47 +5156,97 @@ msgstr "関数%sは集合を返します" msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "この集約で使うには関数%sは VARIADIC ANY を受け付ける必要があります" -#: catalog/pg_aggregate.c:903 +#: catalog/pg_aggregate.c:903 +#, c-format +msgid "function %s requires run-time type coercion" +msgstr "関数%sは実行時の型強制が必要です" + +#: catalog/pg_cast.c:68 +#, c-format +msgid "cast from type %s to type %s already exists" +msgstr "型%sから型%sへのキャストはすでに存在しています" + +#: 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 "function %s requires run-time type coercion" -msgstr "関数%sは実行時の型強制が必要です" +msgid "This operation is not supported for partitioned tables." +msgstr "この操作はパーティション親テーブルに対してはサポートされていません。" -#: catalog/pg_cast.c:68 +#: catalog/pg_class.c:47 #, c-format -msgid "cast from type %s to type %s already exists" -msgstr "型%sから型%sへのキャストはすでに存在しています" +msgid "This operation is not supported for partitioned indexes." +msgstr "この操作はパーティションインデックスに対してはサポートされていません。" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "照合順序\"%s\"はすでに存在します、スキップします" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "エンコーディング\"%2$s\"に対する照合順序\"%1$s\"はすでに存在します、スキップします" -#: catalog/pg_collation.c:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "照合順序\"%s\"はすでに存在します" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: 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 "テーブル\"%2$s\"の制約\"%1$s\"は存在しません" -#: catalog/pg_constraint.c:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ドメイン\"%2$s\"に対する制約\"%1$s\"は存在しません" @@ -4896,27 +5261,27 @@ msgstr "変換\"%s\"はすでに存在します" msgid "default conversion for %s to %s already exists" msgstr "%sから%sへのデフォルトの変換はすでに存在します" -#: catalog/pg_depend.c:218 commands/extension.c:3370 +#: catalog/pg_depend.c:222 commands/extension.c:3289 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%sはすでに機能拡張\"%s\"のメンバです" -#: catalog/pg_depend.c:225 catalog/pg_depend.c:276 commands/extension.c:3410 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s は機能拡張\"%s\"のメンバではありません" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "機能拡張は自身が所有していないオブジェクトを置き換えることができません。" -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "機能拡張はCREATE ... IF NOT EXISTSを自身がすでに所有しているオブジェクトと競合するオブジェクトの生成をスキップするためにのみ使用することができます。" -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "システムオブジェクトであるため、%sの依存関係を削除できません。" @@ -4929,7 +5294,7 @@ msgstr "列挙ラベル\"%s\"は不正です" #: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 #, c-format msgid "Labels must be %d bytes or less." -msgstr "ラベルは%dバイト以内でなければなりません。" +msgstr "ラベルは%d文字数以内でなければなりません。" #: catalog/pg_enum.c:259 #, c-format @@ -4959,14 +5324,14 @@ msgstr "ALTER TYPE ADD BEFORE/AFTER はバイナリアップグレードでは #: catalog/pg_inherits.c:593 #, c-format msgid "cannot detach partition \"%s\"" -msgstr "パーティション子テーブル\"%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:4455 commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 commands/tablecmds.c:15485 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中の取り外し処理を完了させてください。" @@ -4974,7 +5339,7 @@ msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中 #: catalog/pg_inherits.c:600 #, c-format msgid "cannot complete detaching partition \"%s\"" -msgstr "パーティション子テーブル\"%s\"の取り外しが完了できません" +msgstr "パーティション\"%s\"の取り外しを完了できません" #: catalog/pg_inherits.c:602 #, c-format @@ -5046,44 +5411,53 @@ msgstr "演算子%sはすでに存在します" msgid "operator cannot be its own negator or sort operator" msgstr "演算子は自身の否定子やソート演算子になることはできません" -#: catalog/pg_proc.c:131 parser/parse_func.c:2235 +#: 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:375 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "同じ引数型を持つ関数\"%s\"はすでに存在します" -#: catalog/pg_proc.c:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\"は集約関数です。" -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\"は関数です。" -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\"はプロシージャです。" -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "関数\"%s\"はウィンドウ関数です。" -#: catalog/pg_proc.c:413 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "プロシージャの出力パラメータの有無は変更できません" -#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "既存の関数の戻り値型を変更できません" @@ -5092,87 +5466,117 @@ msgstr "既存の関数の戻り値型を変更できません" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: 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 +#: 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:445 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "OUTパラメータで定義された行型が異なります。" -#: catalog/pg_proc.c:489 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "入力パラメーター\"%s\"の名称を変更できません" -#: catalog/pg_proc.c:516 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "既存の関数からパラメータのデフォルト値を削除できません" -#: catalog/pg_proc.c:542 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "既存のパラメータのデフォルト値のデータ型を変更できません" -#: catalog/pg_proc.c:752 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "\"%s\"という名前の組み込み関数はありません" -#: catalog/pg_proc.c:850 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL関数は型%sを返すことができません" -#: catalog/pg_proc.c:865 +#: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL関数は型%sの引数と取ることができません" -#: catalog/pg_proc.c:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "SQL関数\"%s\"" -#: catalog/pg_publication.c:60 +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "パブリケーションにリレーション\"%s\"を追加できません" + +#: catalog/pg_publication.c:73 #, c-format -msgid "Only tables can be added to publications." -msgstr "パブリケーションにはテーブルのみが追加できます" +msgid "This operation is not supported for system tables." +msgstr "この操作はシステムテーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:66 +#: catalog/pg_publication.c:81 #, c-format -msgid "\"%s\" is a system table" -msgstr "\"%s\"はシステムテーブルです" +msgid "This operation is not supported for temporary tables." +msgstr "この操作は一時テーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:87 #, c-format -msgid "System tables cannot be added to publications." -msgstr "システムテーブルをパブリケーションに追加することはできません" +msgid "This operation is not supported for unlogged tables." +msgstr "この操作はUNLOGGEDテーブルに対してはサポートされていません。" -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "テーブル\"%s\"はレプリケーションできません" +msgid "cannot add schema \"%s\" to publication" +msgstr "パブリケーションにスキーマ\"%s\"を追加できません" -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:103 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "一時テーブルとUNLOGGEDテーブルはレプリケーションできません" +msgid "This operation is not supported for system schemas." +msgstr "この操作はシステムスキーマに対してはサポートされていません。" -#: catalog/pg_publication.c:251 +#: 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:533 commands/publicationcmds.c:458 commands/publicationcmds.c:786 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "システム列\"%s\"は発行列リスト内では使用できません" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use 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:1391 commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "パブリケーション\"%s\"は存在しません" -#: catalog/pg_shdepend.c:833 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5183,82 +5587,78 @@ msgid_plural "" msgstr[0] "" "\n" "および、他の%dのデータベース内のオブジェクト(一覧についてはサーバーログを参照してください)" -msgstr[1] "" -"\n" -"および、他の%dのデータベース内のオブジェクト(一覧についてはサーバーログを参照してください)" -#: catalog/pg_shdepend.c:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "ロール%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "テーブル空間%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "データベース%uの削除が同時に行われました" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "%sの所有者" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "%sの権限" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "%sの対象" -#: catalog/pg_shdepend.c:1263 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "%sのテーブル空間" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1271 +#: 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:1382 +#: 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:1529 +#: 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:174 commands/subscriptioncmds.c:779 commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "サブスクリプション\"%s\"は存在しません" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" -msgstr "サブスクリプション\"%s\"のリレーションマッピングは削除できません" +msgstr "サブスクリプション\"%s\"に対するリレーションマッピングを削除できませんでした" -#: 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 "リレーション\"%s\"のテーブル同期が進行中で、状態は\"%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 +#: 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を実行してこのサブスクリプションを削除してください。" @@ -5288,7 +5688,7 @@ msgstr "値渡し型の場合、内部サイズ%dは不正です" msgid "alignment \"%c\" is invalid for variable-length type" msgstr "可変長型の場合、アラインメント\"%c\"は不正です" -#: catalog/pg_type.c:328 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型の場合はPLAIN格納方式でなければなりません" @@ -5301,23 +5701,18 @@ msgstr "\"%s\"型向けの配列型の名前を形成できませんでした" #: catalog/pg_type.c:932 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." -msgstr "\"%s\"の複範囲型を作成中に失敗しました。" +msgstr "\"%s\"の複範囲型の作成中に失敗しました。" #: catalog/pg_type.c:933 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "\"multirange_type_name\"属性で複範囲型の型名を手動で指定することができます。" -#: catalog/storage.c:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, c-format msgid "invalid page in block %u of relation %s" msgstr "リレーション%2$sのブロック%1$uに不正なページ" -#: catalog/toasting.c:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 commands/tablecmds.c:16490 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\"はテーブルや実体化ビューではありません" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -5341,37 +5736,37 @@ msgstr "集約用の状態遷移関数を指定する必要があります" #: commands/aggregatecmds.c:221 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" -msgstr "mstypeを指定した場合は集約のmsfuncも設定する必要があります" +msgstr "mstype を指定した場合は集約の msfunc も設定する必要があります" #: commands/aggregatecmds.c:225 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" -msgstr "mstypeを指定した場合は集約のminvfuncも設定する必要があります" +msgstr "mstype を指定した場合は集約の minvfunc も設定する必要があります" #: commands/aggregatecmds.c:232 #, c-format msgid "aggregate msfunc must not be specified without mstype" -msgstr "集約のmsfuncはmstypeを指定してない場合は指定できません" +msgstr "集約の msfunc は mstype を指定してない場合は指定できません" #: commands/aggregatecmds.c:236 #, c-format msgid "aggregate minvfunc must not be specified without mstype" -msgstr "集約のminvfuncはmstypeを指定していない場合は指定できません" +msgstr "集約の minvfunc は mstype を指定していない場合は指定できません" #: commands/aggregatecmds.c:240 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" -msgstr "集約のmfinalfuncはmstypeを指定していない場合は指定できません" +msgstr "集約の mfinalfunc は mstype を指定していない場合は指定できません" #: commands/aggregatecmds.c:244 #, c-format msgid "aggregate msspace must not be specified without mstype" -msgstr "集約のmsspaceはmstypeを指定していない場合は指定できません" +msgstr "集約の msspace は mstype を指定していない場合は指定できません" #: commands/aggregatecmds.c:248 #, c-format msgid "aggregate minitcond must not be specified without mstype" -msgstr "集約のminitcondはmstypeを指定していない場合は指定できません" +msgstr "集約の minitcond は mstype を指定していない場合は指定できません" #: commands/aggregatecmds.c:277 #, c-format @@ -5398,7 +5793,7 @@ msgstr "直列化関数は集約遷移データの型が%sの場合にだけ指 msgid "must specify both or neither of serialization and deserialization functions" msgstr "直列化関数と復元関数は両方指定するか、両方指定しないかのどちらかである必要があります" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "パラメータ\"parallel\"はSAVE、RESTRICTEDまたはUNSAFEのいずれかでなければなりません" @@ -5411,14 +5806,14 @@ msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE で #: commands/alter.c:84 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" -msgstr "イベントトリガー\"%s\"はすでに存在します" +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:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "サーバー\"%s\"はすでに存在します" @@ -5428,12 +5823,12 @@ msgstr "サーバー\"%s\"はすでに存在します" msgid "language \"%s\" already exists" msgstr "言語\"%s\"はすでに存在します" -#: commands/alter.c:96 commands/publicationcmds.c:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" @@ -5473,7 +5868,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のスキーマを設定するにはスーパーユーザーである必要があります" @@ -5493,7 +5888,7 @@ msgstr "アクセスメソッドを作成するにはスーパーユーザーで msgid "access method \"%s\" already exists" msgstr "アクセスメソッド\"%s\"は存在しません" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" msgstr "アクセスメソッド\"%s\"は存在しません" @@ -5503,52 +5898,52 @@ 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:80 commands/trigger.c:699 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:714 parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "関数%sは型%sを返さなければなりません" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\"をスキップしています --- この外部テーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルでないものや特別なシステムテーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\"継承ツリーを解析しています" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\"を解析しています" -#: commands/analyze.c:395 +#: 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:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, 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" +msgstr "\"%1$s\": %3$uページの内%2$dをスキャン。%4$.0fの有効な行と%5$.0fの不要な行が存在。%6$d行をサンプリング。推定総行数は%7$.0f" -#: commands/analyze.c:1436 +#: commands/analyze.c:1418 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "継承ツリー\"%s.%s\"のANALYZEをスキップします --- このツリーには子テーブルがありません" -#: commands/analyze.c:1534 +#: 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\"のANALYZEをスキップします --- このツリーにはアナライズ可能な子テーブルがありません" @@ -5578,97 +5973,97 @@ msgstr "LISTEN / UNLISTEN / NOTIFY を実行しているトランザクション msgid "too many notifications in the NOTIFY queue" msgstr "NOTIFY キューで発生した通知イベントが多すぎます" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTYFY キューが %.0f%% まで一杯になっています" -#: commands/async.c:1618 +#: 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:1621 +#: 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:119 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" -msgstr "認識されないCLUSTERのオプション \"%s\"" +msgstr "認識できないCLUSTERオプション \"%s\"" -#: commands/cluster.c:147 commands/cluster.c:395 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "他のセッションの一時テーブルをクラスタ化できません" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "パーティション親テーブルに対して CLUSTER は実行できません" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "テーブル\"%s\"には事前にクラスタ化されたインデックスはありません" -#: commands/cluster.c:187 commands/tablecmds.c:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14183 commands/tablecmds.c:16064 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"にはインデックス\"%1$s\"は存在しません" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "共有カタログをクラスタ化できません" -#: commands/cluster.c:399 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対してはVACUUMを実行できません" -#: commands/cluster.c:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16074 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\"はテーブル\"%s\"のインデックスではありません" -#: commands/cluster.c:479 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "インデックス\"%s\"でクラスタ化できません。アクセスメソッドがクラスタ化をサポートしないためです" -#: commands/cluster.c:491 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "部分インデックス\"%s\"をクラスタ化できません" -#: commands/cluster.c:505 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "無効なインデックス\"%s\"ではクラスタ化できません" -#: commands/cluster.c:529 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "パーティションテーブル内のインデックスは CLUSTER 済みとマークできません`" -#: commands/cluster.c:902 +#: 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:908 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "シーケンシャルスキャンとソートを使って\"%s.%s\"をクラスタ化しています" -#: commands/cluster.c:939 +#: 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:943 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -5682,100 +6077,122 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 commands/define.c:389 commands/tablecmds.c:7812 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:1001 replication/walsender.c:1023 replication/walsender.c:1033 +#, 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:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "認識できないの照合順序プロバイダ: %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "\"lc_collate\"パラメータの指定が必要です" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "\"lc_ctype\"パラメータの指定が必要です" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "パラメータ\"locale\"の指定が必要です" + +#: commands/collationcmds.c:256 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "非決定的照合順序はこのプロバイダではサポートされません" -#: commands/collationcmds.c:227 +#: commands/collationcmds.c:275 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "現在のデータベースのエンコーディングはこのプロバイダではサポートされません" -#: commands/collationcmds.c:285 +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "エンコーディング\"%2$s\"のための照合順序\"%1$s\"はすでにスキーマ\"%3$s\"内に存在します" -#: commands/collationcmds.c:296 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "照合順序\"%s\"はすでにスキーマ\"%s\"内に存在します" -#: commands/collationcmds.c:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 #, c-format msgid "changing version from %s to %s" msgstr "バージョン%sから%sへの変更" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 #, c-format msgid "version has not changed" msgstr "バージョンが変わっていません" -#: commands/collationcmds.c:473 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "システム照合順序をインポートするにはスーパーユーザーである必要があります" -#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:680 libpq/be-secure-common.c:81 +#: commands/collationcmds.c:618 commands/copyfrom.c:1509 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:690 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "使用できるシステムロケールが見つかりません" -#: commands/comment.c:61 commands/dbcommands.c:853 commands/dbcommands.c:1064 commands/dbcommands.c:1177 commands/dbcommands.c:1367 commands/dbcommands.c:1615 commands/dbcommands.c:1737 commands/dbcommands.c:2177 utils/init/postinit.c:887 utils/init/postinit.c:993 utils/init/postinit.c:1019 +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 commands/dbcommands.c:1874 commands/dbcommands.c:2068 commands/dbcommands.c:2310 commands/dbcommands.c:2405 commands/dbcommands.c:2515 commands/dbcommands.c:3014 utils/init/postinit.c:947 utils/init/postinit.c:1011 utils/init/postinit.c:1083 #, c-format msgid "database \"%s\" does not exist" msgstr "データベース\"%s\"は存在しません" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:990 +#: 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:1948 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 #, c-format msgid "function \"%s\" was not called by trigger manager" -msgstr "関数\"%s\"はトリガー関数として呼び出されていません" +msgstr "関数\"%s\"はトリガ関数として呼び出されていません" -#: 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 "関数\"%s\"はAFTER ROWトリガーで実行してください" +msgstr "関数\"%s\"はAFTER ROWトリガで実行してください" #: commands/constraint.c:84 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" -msgstr "関数\"%s\"はINSERTまたはUPDATEトリガーで実行してください" +msgstr "関数\"%s\"はINSERTまたはUPDATEトリガで実行してください" #: commands/conversioncmds.c:67 #, c-format @@ -5800,27 +6217,27 @@ msgstr "エンコード変換関数%sは%s型を返す必要があります" #: commands/conversioncmds.c:130 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" -msgstr "エンコーディング変換関数%sが空の入力に対して正しくない結果を返しました" +msgstr "エンコーディング変換関数%sは空の入力に対して間違った結果を返却しました" #: 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: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も誰でも実行できます" +msgstr "標準入出力経由のCOPYは誰でも実行可能です。またpsqlの\\\\copyも誰でも実行できます" #: 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: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:188 #, c-format @@ -5832,477 +6249,512 @@ msgstr "COPY FROM で行レベルセキュリティはサポートされてい msgid "Use INSERT statements instead." msgstr "代わりにINSERTを文使用してください。" -#: commands/copy.c:377 +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "MERGEはCOPYではサポートされません" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "COPY TO の HEADERで\"%s\"は使用できません" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "パラメータ\"%s\"はBoolean値または\"match\"のみを取ります" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"を認識できません" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "オプション\"%s\"の引数は列名のリストでなければなりません" -#: commands/copy.c:518 +#: commands/copy.c:553 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"の引数は有効なエンコーディング名でなければなりません" -#: commands/copy.c:525 commands/dbcommands.c:254 commands/dbcommands.c:1563 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 #, c-format msgid "option \"%s\" not recognized" msgstr "タイムゾーン\"%s\"を認識できません" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "BINARYモードではDELIMITERを指定できません" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "BINARYモードではNULLを指定できません" -#: commands/copy.c:564 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYの区切り文字は単一の1バイト文字でなければなりません" -#: commands/copy.c:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYの区切り文字は改行や復帰記号とすることができません" -#: commands/copy.c:577 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYのNULL表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPYの区切り文字を\"%s\"とすることはできません" -#: commands/copy.c:600 +#: commands/copy.c:635 #, 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:606 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "COPYの引用符はCSVモードでのみ使用できます" -#: commands/copy.c:611 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYの引用符は単一の1バイト文字でなければなりません" -#: commands/copy.c:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYの区切り文字と引用符は異なる文字でなければなりません" -#: commands/copy.c:622 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "COPYのエスケープはCSVモードでのみ使用できます" -#: commands/copy.c:627 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPYのエスケープは単一の1バイト文字でなければなりません" -#: commands/copy.c:633 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "COPYのFORCE_QUOTEオプションはCSVモードでのみ使用できます" -#: commands/copy.c:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "COPYのFORCE_QUOTEオプションはCOPY TOでのみ使用できます" -#: commands/copy.c:643 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "COPYのFORCE_NOT_NULLオプションはCSVモードでのみ使用できます" -#: commands/copy.c:647 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "COPYのFORCE_NOT_NULLオプションはCOPY FROMでのみ使用できます" -#: commands/copy.c:653 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "COPYのFORCE_NULLオプションはCSVモードでのみ使用できます" -#: commands/copy.c:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "COPYのFORCE_NOT_NULLオプションはCOPY FROMでのみ使用できます" -#: commands/copy.c:664 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "COPYの区切り文字をNULLオプションの値に使用できません" -#: commands/copy.c:671 +#: commands/copy.c:706 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "COPYの引用符をNULLオプションの値に使用できません" -#: commands/copy.c:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "列\"%s\"は生成カラムです" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:749 commands/indexcmds.c:1859 commands/statscmds.c:245 commands/tablecmds.c:2347 commands/tablecmds.c:3003 commands/tablecmds.c:3496 parser/parse_relation.c:3642 parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1826 commands/statscmds.c:243 commands/tablecmds.c:2379 commands/tablecmds.c:3035 commands/tablecmds.c:3529 parser/parse_relation.c:3660 parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "列\"%s\"は存在しません" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 parser/parse_target.c:1079 parser/parse_target.c:1090 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "列\"%s\"が複数指定されました" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "%sのCOPY、行 %s、列 %s" +msgid "COPY %s, line %llu, column %s" +msgstr "%sのCOPY、行 %llu、列 %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 "%sのCOPY、行 %s" +msgid "COPY %s, line %llu" +msgstr "%sのCOPY、行 %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "%sのCOPY、行 %s、列 %s: \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "%sのCOPY、行 %llu、列 %s: \"%s\"" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "%sのCOPY、行 %s、列 %s: null が入力されました" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "%sのCOPY、行 %llu、列 %s: null が入力されました" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "%sのCOPY、行 %s: \"%s\"" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "%sのCOPY、行 %llu: \"%s\"" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "ビュー\"%s\"へのコピーはできません" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." -msgstr "ビューへのコピーを可能にするためには、INSTEAD OF INSERTトリガーを作成してください。" +msgstr "ビューへのコピーを可能にするためには、INSTEAD OF INSERTトリガを作成してください。" -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "実体化ビュー\"%s\"へのコピーはできません" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "シーケンス\"%s\"へのコピーはできません" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "テーブル以外のリレーション\"%s\"へのコピーはできません" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "パーティション親テーブルに対して COPY FREEZE は実行できません" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "先行するトランザクション処理のためCOPY FREEZEを実行することができません" -#: 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を実行することができません" -#: commands/copyfrom.c:1264 commands/copyto.c:612 +#: commands/copyfrom.c:1270 commands/copyto.c:611 #, 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 +#: commands/copyfrom.c:1293 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "FORCE_NULL指定された列\"%s\"はCOPYで参照されません" -#: commands/copyfrom.c:1519 +#: commands/copyfrom.c:1346 utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "符号化方式\"%s\"から\"%s\"用のデフォルト変換関数は存在しません" + +#: commands/copyfrom.c:1528 #, 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 のようなクライアント側の仕組みが必要かもしれません" -#: commands/copyfrom.c:1532 commands/copyto.c:732 +#: commands/copyfrom.c:1541 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\"はディレクトリです" -#: commands/copyfrom.c:1600 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1609 commands/copyto.c:301 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 +#: commands/copyfrom.c:1624 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "プログラム\"%s\"の実行に失敗しました" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "COPYファイルのシグネチャが不明です" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "COPYファイルのヘッダが不正です(フラグがありません)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "COPYファイルのヘッダが不正です(WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "COPYファイルのヘッダ内の重要なフラグが不明です" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "COPYファイルのヘッダが不正です(サイズがありません)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "COPYファイルのヘッダが不正です(サイズが不正です)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "COPYファイルから読み込めませんでした: %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 tcop/postgres.c:359 +#: 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 "トランザクションを実行中のクライアント接続で想定外のEOFがありました" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "標準入力からのCOPY中に想定外のメッセージタイプ0x%02Xがありました" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "標準入力からのCOPYが失敗しました: %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1446 commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "ヘッダ行の列数が間違っています: %dでしたが、%dを想定していました" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "ヘッダ行フィールド%dでカラム名の不一致: NULL値(\"%s\")を検出, 予期していた値\"%s\"" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "ヘッダ行フィールド%dでカラム名の不一致: \"%s\"を検出, 予期していた値\"%s\"" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "推定最終列の後に余計なデータがありました" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "列\"%s\"のデータがありません" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "EOF マーカーの後ろでコピーデータを受信しました" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "行のフィールド数は%d、その期待値は%dです" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "データの中に復帰記号そのものがありました" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "データの中に引用符のない復帰記号がありました" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "復帰記号は\"\\r\"と表現してください" -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "復帰記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copyfromparse.c:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "データの中に改行記号そのものがありました" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "データの中に引用符のない改行記号がありました" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "改行記号は\"\\n\"と表現してください" -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "改行記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copyfromparse.c:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" -msgstr "コピー終端記号がこれまでの改行方式と合致しません" +msgstr "コピー終端記号がこれまでの改行方式と一致しません" -#: commands/copyfromparse.c:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "コピー終端記号が破損しています" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "CSV引用符が閉じていません" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "COPYデータの中に想定外のEOFがあります" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "フィールドサイズが不正です" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "バイナリデータ書式が不正です" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "COPYプログラムに書き出せませんでした: %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "COPYファイルに書き出せませんでした: %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "ビュー\"%s\"からのコピーはできません" -#: 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 "COPY (SELECT ...) TO構文を試してください" -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "実体化ビュー\"%s\"からのコピーはできません" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" -msgstr "外部テーブル\"%s\"からのコピーはできません" +msgstr "外部テーブル \"%s\" からのコピーはできません" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "シーケンス\"%s\"からのコピーはできません" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"からのコピーはできません" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "テーブル以外のリレーション\"%s\"からのコピーはできません" -#: commands/copyto.c:451 +#: commands/copyto.c:450 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "DO INSTEAD NOTHING ルールは COPY ではサポートされていません" -#: commands/copyto.c:465 +#: commands/copyto.c:464 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "条件付き DO INSTEAD ルールは COPY ではサポートされていません" -#: commands/copyto.c:469 +#: commands/copyto.c:468 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "DO ALSO ルールは COPY ではサポートされていません" -#: commands/copyto.c:474 +#: commands/copyto.c:473 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "マルチステートメントの DO INSTEAD ルールは COPY ではサポートされていません" -#: commands/copyto.c:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO)はサポートされていません" -#: commands/copyto.c:501 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "COPY文中の問い合わせではRETURNING句が必須です" -#: commands/copyto.c:530 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "COPY文で参照されているリレーションが変更されました" -#: commands/copyto.c:589 +#: commands/copyto.c:588 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "FORCE_QUOTE指定された列\"%s\"はCOPYで参照されません" -#: commands/copyto.c:697 +#: commands/copyto.c:696 #, c-format msgid "relative path not allowed for COPY to file" msgstr "ファイルへのCOPYでは相対パスは指定できません" -#: commands/copyto.c:716 +#: commands/copyto.c:715 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m" -#: commands/copyto.c:719 +#: 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 のようなクライアント側の仕組みが必要かもしれません" @@ -6317,307 +6769,381 @@ msgstr "指定された列別名が多すぎます" msgid "policies not yet implemented for this command" msgstr "このコマンドにはポリシは実装されていません" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATIONはもはやサポートされません" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "代わりにテーブル空間の使用を検討してください" -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, 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:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%dは有効な符号化方式コードではありません" -#: commands/dbcommands.c:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%sは有効な符号化方式名ではありません" -#: commands/dbcommands.c:315 commands/dbcommands.c:1596 commands/user.c:275 commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "認識できない照合順序プロバイダ: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "不正な接続数制限: %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "データベースを作成する権限がありません" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "テンプレートデータベース\"%s\"は存在しません" -#: commands/dbcommands.c:367 +#: commands/dbcommands.c:975 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "無効なデータベース\"%s\"はテンプレートとして使用できません" -#: commands/dbcommands.c:368 commands/dbcommands.c:1625 utils/init/postinit.c:1002 +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 utils/init/postinit.c:1026 #, c-format msgid "Use DROP DATABASE to drop invalid databases." -msgstr "DROP DATABASEを使用して無効なデータベースを削除してください。" +msgstr "DROP DATABASEを使用して不正なデータベースを削除してください。" -#: commands/dbcommands.c:379 +#: commands/dbcommands.c:987 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "データベース\"%s\"をコピーする権限がありません" -#: commands/dbcommands.c:395 +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "データベース作成の方法\"%s\"は不正です" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "有効な方法はは\"wal_log\"と\"file_copy\"です。" + +#: commands/dbcommands.c:1024 #, c-format msgid "invalid server encoding %d" msgstr "サーバーの符号化方式%dは不正です" -#: commands/dbcommands.c:401 commands/dbcommands.c:406 +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 #, c-format msgid "invalid locale name: \"%s\"" msgstr "ロケール名\"%s\"は不正です" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "エンコーディング\"%s\"はICUではサポートされていません" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICUロケールを指定しなければなりません" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICUロケールはロケールプロバイダがICUでなければ指定できません" + +#: commands/dbcommands.c:1082 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "新しい符号化方式(%s)はテンプレートデータベースの符号化方式(%s)と互換性がありません" -#: commands/dbcommands.c:429 +#: commands/dbcommands.c:1085 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "テンプレートデータベースの符号化方式と同じものを使うか、もしくは template0 をテンプレートとして使用してください" -#: commands/dbcommands.c:434 +#: commands/dbcommands.c:1090 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "新しい照合順序(%s)はテンプレートデータベースの照合順序(%s)と互換性がありません" -#: commands/dbcommands.c:436 +#: commands/dbcommands.c:1092 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "テンプレートデータベースの照合順序と同じものを使うか、もしくは template0 をテンプレートとして使用してください" -#: commands/dbcommands.c:441 +#: commands/dbcommands.c:1097 #, 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:443 +#: commands/dbcommands.c:1099 #, 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:465 commands/dbcommands.c:1223 +#: commands/dbcommands.c:1104 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "新しいロケール・プロバイダ(%s)はテンプレートデータベースのロケール・プロバイダ(%s)と一致しません" + +#: commands/dbcommands.c:1106 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "テンプレートデータベースと同じロケールプロバイダを使うか、もしくは template0 をテンプレートとして使用してください" + +#: commands/dbcommands.c:1115 +#, 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:1117 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "テンプレートデータベースと同じICUロケールを使うか、もしくは template0 をテンプレートとして使用してください。" + +#: commands/dbcommands.c:1140 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "テンプレートデータベース\"%s\"には照合順序のバージョンが設定されていますが、実際の照合順序バージョンが特定できません" + +#: commands/dbcommands.c:1145 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "テンプレートデータベース\"%s\"では照合順序バージョンの不一致が起きています" + +#: commands/dbcommands.c:1147 +#, 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:1150 +#, 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:1186 commands/dbcommands.c:1920 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "デフォルトのテーブル空間としてpg_globalを使用できません" -#: commands/dbcommands.c:491 +#: commands/dbcommands.c:1212 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "新しいデフォルトのテーブル空間\"%s\"を割り当てられません" -#: commands/dbcommands.c:493 +#: commands/dbcommands.c:1214 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "データベース\"%s\"のいくつかテーブルはすでにこのテーブル空間にあるため、競合しています。" -#: commands/dbcommands.c:523 commands/dbcommands.c:1093 +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 #, c-format msgid "database \"%s\" already exists" msgstr "データベース\"%s\"はすでに存在します" -#: commands/dbcommands.c:537 +#: commands/dbcommands.c:1258 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "元となるデータベース\"%s\"は他のユーザーによってアクセスされています" -#: commands/dbcommands.c:780 commands/dbcommands.c:795 +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "データベースOID %uはすでにデータベース\"%s\"で使用されています" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "指定されたOID %uのデータディレクトリはすでに存在します" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "符号化方式\"%s\"がロケール\"%s\"に合いません" -#: commands/dbcommands.c:783 +#: commands/dbcommands.c:1460 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "選択されたLC_CTYPEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:798 +#: commands/dbcommands.c:1475 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "選択されたLC_COLLATEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:860 +#: commands/dbcommands.c:1556 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "データベース\"%s\"は存在しません、スキップします" -#: commands/dbcommands.c:884 +#: commands/dbcommands.c:1580 #, c-format msgid "cannot drop a template database" msgstr "テンプレートデータベースを削除できません" -#: commands/dbcommands.c:890 +#: commands/dbcommands.c:1586 #, c-format msgid "cannot drop the currently open database" msgstr "現在オープンしているデータベースを削除できません" -#: commands/dbcommands.c:903 +#: commands/dbcommands.c:1599 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "データベース\"%s\"は有効な論理レプリケーションスロットで使用中です" -#: commands/dbcommands.c:905 +#: commands/dbcommands.c:1601 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d 個のアクティブなスロットがあります。" -msgstr[1] "%d 個のアクティブなスロットがあります。" -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:1615 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "データベース\"%s\"は論理レプリケーションのサブスクリプションで使用中です" -#: commands/dbcommands.c:921 +#: commands/dbcommands.c:1617 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d個のサブスクリプションがあります" -msgstr[1] "%d個のサブスクリプションがあります" -#: commands/dbcommands.c:942 commands/dbcommands.c:1115 commands/dbcommands.c:1245 +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 commands/dbcommands.c:1942 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "データベース\"%s\"は他のユーザーからアクセスされています" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1772 #, c-format msgid "permission denied to rename database" msgstr "データベースの名前を変更する権限がありません" -#: commands/dbcommands.c:1104 +#: commands/dbcommands.c:1801 #, c-format msgid "current database cannot be renamed" msgstr "現在のデータベースの名前を変更できません" -#: commands/dbcommands.c:1201 +#: commands/dbcommands.c:1898 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "現在オープン中のデータベースのテーブルスペースは変更できません" -#: commands/dbcommands.c:1304 +#: commands/dbcommands.c:2004 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "データベース\"%s\"のリレーションの中に、テーブルスペース\"%s\"にすでに存在するものがあります" -#: commands/dbcommands.c:1306 +#: commands/dbcommands.c:2006 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "このコマンドを使う前に、データベースのデフォルトのテーブルスペースに戻す必要があります。" -#: commands/dbcommands.c:1431 commands/dbcommands.c:2015 commands/dbcommands.c:2314 commands/dbcommands.c:2400 +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 commands/dbcommands.c:3152 commands/dbcommands.c:3266 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "元のデータベースのディレクトリ\"%s\"に不要なファイルが残っているかもしれません" -#: commands/dbcommands.c:1487 +#: commands/dbcommands.c:2194 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "DROP DATABASEのオプション\"%s\"が認識できません" -#: commands/dbcommands.c:1577 +#: commands/dbcommands.c:2272 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "オプション\"%s\"は他のオプションと一緒に指定はできません" -#: commands/dbcommands.c:1624 +#: commands/dbcommands.c:2319 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "無効なデータベース\"%s\"は変更できません" -#: commands/dbcommands.c:1641 +#: commands/dbcommands.c:2336 #, c-format msgid "cannot disallow connections for current database" msgstr "現在のデータベースへの接続は禁止できません" -#: commands/dbcommands.c:1777 +#: commands/dbcommands.c:2555 #, c-format msgid "permission denied to change owner of database" msgstr "データベースの所有者を変更する権限がありません" -#: commands/dbcommands.c:2121 +#: commands/dbcommands.c:2958 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "他にこのデータベースを使っている %d 個のセッションと %d 個の準備済みトランザクションがあります。" -#: commands/dbcommands.c:2124 +#: commands/dbcommands.c:2961 #, 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:2129 storage/ipc/procarray.c:3895 +#: commands/dbcommands.c:2966 storage/ipc/procarray.c:3847 #, 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/dbcommands.c:2271 +#: commands/dbcommands.c:3108 #, c-format msgid "missing directory \"%s\"" msgstr "ディレクトリ\"%s\"がありません" -#: commands/dbcommands.c:2330 commands/tablespace.c:188 commands/tablespace.c:634 +#: commands/dbcommands.c:3168 commands/tablespace.c:190 commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "ディレクトリ\"%s\"のstatができませんでした: %m" -#: 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:258 commands/define.c:290 commands/define.c:318 commands/define.c:364 #, 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 commands/define.c:225 commands/define.c:243 #, 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:327 #, c-format msgid "%s requires an integer value" msgstr "%sは整数値が必要です" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "%sの引数は名前でなければなりません" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" msgstr "%sの引数は型名でなければなりません" -#: commands/define.c:318 +#: commands/define.c:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "%sの引数が不正です: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 utils/adt/ruleutils.c:2832 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 utils/adt/ruleutils.c:2928 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\"は集約関数です" @@ -6627,17 +7153,17 @@ msgstr "\"%s\"は集約関数です" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除するにはDROP AGGREGATEを使用してください" -#: commands/dropcmds.c:158 commands/sequence.c:455 commands/tablecmds.c:3580 commands/tablecmds.c:3738 commands/tablecmds.c:3791 commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 commands/tablecmds.c:3771 commands/tablecmds.c:3823 commands/tablecmds.c:16491 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "スキーマ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "型\"%s\"は存在しません、スキップします" @@ -6657,7 +7183,7 @@ msgstr "照合順序\"%s\"は存在しません、スキップします" msgid "conversion \"%s\" does not exist, skipping" msgstr "変換\"%sは存在しません、スキップします" -#: commands/dropcmds.c:293 commands/statscmds.c:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s\"は存在しません、スキップします" @@ -6730,7 +7256,7 @@ msgstr "型%s、言語\"%s\"に対する変換は存在しません、スキッ #: commands/dropcmds.c:420 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" -msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は存在しません、スキップします" +msgstr "リレーション\"%2$s\"のトリガ\"%1$s\"は存在しません、スキップします" #: commands/dropcmds.c:429 #, c-format @@ -6740,7 +7266,7 @@ msgstr "リレーション\"%2$s\"のポリシ\"%1$s\"は存在しません、 #: commands/dropcmds.c:436 #, c-format msgid "event trigger \"%s\" does not exist, skipping" -msgstr "イベントトリガー\"%s\"は存在しません、スキップします" +msgstr "イベントトリガ \"%s\"は存在しません、スキップします" #: commands/dropcmds.c:442 #, c-format @@ -6752,7 +7278,7 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません、 msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" @@ -6775,12 +7301,12 @@ msgstr "パブリケーション\"%s\"は存在しません、スキップしま #: commands/event_trigger.c:125 #, c-format msgid "permission denied to create event trigger \"%s\"" -msgstr "イベントトリガー\"%s\"を作成する権限がありません" +msgstr "イベントトリガ \"%s\"を作成する権限がありません" #: commands/event_trigger.c:127 #, c-format msgid "Must be superuser to create an event trigger." -msgstr "イベントトリガーを作成するにはスーパーユーザーである必要があります。" +msgstr "イベントトリガを作成するにはスーパーユーザーである必要があります。" #: commands/event_trigger.c:136 #, c-format @@ -6801,7 +7327,7 @@ msgstr "フィルタの値\"%s\"はフィルタ変数\"%s\"では認識されま #: commands/event_trigger.c:213 commands/event_trigger.c:235 #, c-format msgid "event triggers are not supported for %s" -msgstr "%sではイベントトリガーはサポートされません" +msgstr "%sではイベントトリガはサポートされません" #: commands/event_trigger.c:248 #, c-format @@ -6811,32 +7337,32 @@ msgstr "フィルタ変数\"%s\"が複数指定されました" #: 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\"は存在しません" +msgstr "イベントトリガ\"%s\"は存在しません" #: commands/event_trigger.c:483 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" -msgstr "イベントトリガー\"%s\"の所有者を変更する権限がありません" +msgstr "イベントトリガ\"%s\"の所有者を変更する権限がありません" #: commands/event_trigger.c:485 #, c-format msgid "The owner of an event trigger must be a superuser." -msgstr "イベントトリガーの所有者はスーパーユーザーでなければなりません" +msgstr "イベントトリガの所有者はスーパーユーザーでなければなりません" #: commands/event_trigger.c:1304 #, c-format msgid "%s can only be called in a sql_drop event trigger function" -msgstr "%sはsql_dropイベントトリガー関数内でのみ呼び出すことができます" +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イベントトリガー関数でのみ呼び出すことができます" +msgstr "%sはtable_rewriteイベントトリガ関数でのみ呼び出すことができます" -#: 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はイベントトリガー関数でのみ呼び出すことができます" +msgstr "%sはイベントトリガ関数でのみ呼び出すことができます" #: commands/explain.c:218 #, c-format @@ -6858,7 +7384,7 @@ msgstr "EXPLAINのオプションWALにはANALYZE指定が必要です" msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "EXPLAINオプションのTIMINGにはANALYZE指定が必要です" -#: commands/extension.c:173 commands/extension.c:3032 +#: commands/extension.c:173 commands/extension.c:2954 #, c-format msgid "extension \"%s\" does not exist" msgstr "機能拡張\"%s\"は存在しません" @@ -6913,197 +7439,212 @@ 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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 utils/misc/guc.c:7380 #, 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:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "機能拡張\"%s\"を作成する権限がありません" -#: commands/extension.c:865 +#: commands/extension.c:876 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "この機能拡張を生成するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:866 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "この機能拡張を生成するにはスーパーユーザーである必要があります。" -#: commands/extension.c:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "機能拡張\"%s\"を更新する権限がありません" -#: commands/extension.c:873 +#: commands/extension.c:884 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "この機能拡張を更新するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:874 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "この機能拡張を更新するにはスーパーユーザーである必要があります。" -#: commands/extension.c:1003 +#: commands/extension.c:1018 #, c-format msgid "invalid character in extension owner: must not contain any of \"%s\"" msgstr "機能拡張の所有者名に不正な文字: \"%s\"のいずれの文字も含むことはできません" -#: commands/extension.c:1027 +#: commands/extension.c:1042 #, c-format msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" msgstr "機能拡張\"%s\"のスキーマ名に不正な文字: \"%s\"のいずれの文字も含むことはできません" -#: commands/extension.c:1222 +#: commands/extension.c:1237 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "機能拡張\"%s\"について、バージョン\"%s\"からバージョン\"%s\"へのアップデートパスがありません" -#: commands/extension.c:1430 commands/extension.c:3093 +#: commands/extension.c:1445 commands/extension.c:3012 #, c-format msgid "version to install must be specified" msgstr "インストールするバージョンを指定してください" -#: commands/extension.c:1467 +#: commands/extension.c:1482 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "機能拡張\"%s\"にはバージョン\"%s\"のインストールスクリプトもアップデートパスもありません" -#: commands/extension.c:1501 +#: commands/extension.c:1516 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "機能拡張\"%s\"はスキーマ\"%s\"内にインストールされていなければなりません" -#: commands/extension.c:1661 +#: commands/extension.c:1676 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "機能拡張\"%s\"と\"%s\"の間に循環依存関係が検出されました" -#: commands/extension.c:1666 +#: commands/extension.c:1681 #, c-format msgid "installing required extension \"%s\"" msgstr "必要な機能拡張をインストールします:\"%s\"" -#: commands/extension.c:1689 +#: commands/extension.c:1704 #, c-format msgid "required extension \"%s\" is not installed" msgstr "要求された機能拡張\"%s\"はインストールされていません" -#: commands/extension.c:1692 +#: commands/extension.c:1707 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "必要な機能拡張を一緒にインストールするには CREATE EXTENSION ... CASCADE を使ってください。" -#: commands/extension.c:1727 +#: commands/extension.c:1742 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "機能拡張\"%s\"はすでに存在します、スキップします" -#: commands/extension.c:1734 +#: commands/extension.c:1749 #, c-format msgid "extension \"%s\" already exists" msgstr "機能拡張\"%s\"はすでに存在します" -#: commands/extension.c:1745 +#: commands/extension.c:1760 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "入れ子の CREATE EXTENSION はサポートされません" -#: commands/extension.c:1918 +#: commands/extension.c:1924 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "変更されているため拡張\"%s\"を削除できません" -#: commands/extension.c:2479 +#: commands/extension.c:2401 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s はCREATE EXTENSIONにより実行されるSQLスクリプトからのみ呼び出すことができます" -#: commands/extension.c:2491 +#: commands/extension.c:2413 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u がテーブルを参照していません" -#: commands/extension.c:2496 +#: commands/extension.c:2418 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "テーブル\"%s\"は生成されようとしている機能拡張のメンバではありません" -#: commands/extension.c:2850 +#: commands/extension.c:2772 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "機能拡張がそのスキーマを含んでいるため、機能拡張\"%s\"をスキーマ\"%s\"に移動できません" -#: commands/extension.c:2891 commands/extension.c:2951 +#: commands/extension.c:2813 commands/extension.c:2873 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "機能拡張\"%s\"は SET SCHEMA をサポートしていません" -#: commands/extension.c:2953 +#: commands/extension.c:2875 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "機能拡張のスキーマ\"%2$s\"に%1$sが見つかりません" -#: commands/extension.c:3012 +#: commands/extension.c:2934 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "入れ子になった ALTER EXTENSION はサポートされていません" -#: commands/extension.c:3104 +#: commands/extension.c:3023 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "機能拡張 \"%2$s\"のバージョン\"%1$s\"はすでにインストールされています" -#: commands/extension.c:3316 +#: commands/extension.c:3235 #, c-format msgid "cannot add an object of this type to an extension" msgstr "この型のオブジェクトは機能拡張に追加できません" -#: commands/extension.c:3382 +#: commands/extension.c:3301 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "スキーマ\"%s\"を拡張\"%s\"に追加できません。そのスキーマにその拡張が含まれているためです" -#: commands/extension.c:3476 +#: commands/extension.c:3395 #, c-format msgid "file \"%s\" is too large" msgstr "ファイル\"%s\"は大きすぎます" @@ -7133,77 +7674,77 @@ 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:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "サーバー\"%s\"はすでに存在します、スキップします" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します、スキップします" -#: commands/foreigncmds.c:1158 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します" -#: commands/foreigncmds.c:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません" -#: commands/foreigncmds.c:1383 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません、スキップします" -#: commands/foreigncmds.c:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"にはハンドラがありません" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "外部データラッパー\"%s\"は IMPORT FOREIGN SCHEMA をサポートしていません" -#: commands/foreigncmds.c:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインポートします" @@ -7271,12 +7812,12 @@ msgstr "関数は集合を引数として受け付けられません" #: commands/functioncmds.c:303 #, c-format msgid "VARIADIC parameter must be the last input parameter" -msgstr "VARIADICパラメータは最後の入力パラメータでなければなりません" +msgstr "VARIADIC パラメータは最後の入力パラメータでなければなりません" #: commands/functioncmds.c:323 #, c-format msgid "VARIADIC parameter must be the last parameter" -msgstr "VARIADICパラメータは最後のパラメータでなければなりません" +msgstr "VARIADIC パラメータは最後のパラメータでなければなりません" #: commands/functioncmds.c:348 #, c-format @@ -7306,269 +7847,268 @@ msgstr "デフォルト値を持つパラメータの後にある入力パラメ #: commands/functioncmds.c:460 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" -msgstr "プロシージャのOUTパラメータは、デフォルト値を持つパラメータの後には置けません" +msgstr "プロシージャの出力パラメータはデフォルト値を持つパラメータの後には置けません" -#: commands/functioncmds.c:612 commands/functioncmds.c:803 +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "プロシージャ定義内の不正な属性" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "サポート関数%sは%s型を返さなければなりません" -#: commands/functioncmds.c:719 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" msgstr "サポート関数を指定するにはスーパーユーザーである必要があります" -#: commands/functioncmds.c:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COSTは正数でなければなりません" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "ROWSは正数でなければなりません" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "関数本体の指定がありません" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" -msgstr "関数本体が重複指定されています" +msgstr "関数本体の指定が重複しています" -#: commands/functioncmds.c:899 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "インラインのSQL関数本体は言語指定がSQLの場合にのみ有効です" -#: commands/functioncmds.c:941 +#: commands/functioncmds.c:922 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" -msgstr "引用符で囲われない関数本体を持つSQL関数は多態型の引数を取れません" +msgstr "本体をクォートせずに定義するSQL関数は多態引き数を取れません" -#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, c-format msgid "%s is not yet supported in unquoted SQL function body" -msgstr "%sは引用符で囲われない関数本体ではまだサポートされていません" +msgstr "%sはクォートしない関数本体ではサポートされません" -#: commands/functioncmds.c:1014 +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "言語\"%s\"ではAS項目は1つだけ必要です" -#: commands/functioncmds.c:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "言語が指定されていません" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 commands/proclang.c:237 +#: 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:1129 commands/functioncmds.c:2132 +#: 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:1164 commands/functioncmds.c:1448 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "スーパーユーザーのみがリークプルーフ関数を定義することができます" -#: commands/functioncmds.c:1215 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "OUTパラメータで定義されているため、関数の戻り値型は%sでなければなりません" -#: commands/functioncmds.c:1228 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "関数の結果型を指定しなければなりません" -#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 +#: 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:1569 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "変換元データ型%sは疑似型です" -#: commands/functioncmds.c:1575 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "変換先データ型%sは疑似型です" -#: commands/functioncmds.c:1599 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "元のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1604 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "対象のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "キャスト関数の引数は1つから3つまでです" -#: commands/functioncmds.c:1633 +#: 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:1637 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "キャスト関数の第2引数は%s型でなければなりません" -#: commands/functioncmds.c:1642 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "キャスト関数の第3引数は%s型でなければなりません" -#: commands/functioncmds.c:1647 +#: 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:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "キャスト関数はvolatileではいけません" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "キャスト関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1667 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "キャスト関数は集合を返してはいけません" -#: commands/functioncmds.c:1693 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "WITHOUT FUNCTION指定のキャストを作成するにはスーパーユーザーである必要があります" -#: commands/functioncmds.c:1708 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "変換元と変換先のデータ型の間には物理的な互換性がありません" -#: commands/functioncmds.c:1723 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "複合データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1729 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "列挙データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "配列データ型はバイナリ互換ではありません" -#: commands/functioncmds.c:1752 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "ドメインデータ型はバイナリ互換としてマークされていてはなりません" -#: commands/functioncmds.c:1762 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "変換元と変換先のデータ型が同一です" -#: commands/functioncmds.c:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "変換関数はvolatileではいけません" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "変換関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1803 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "変換関数は集合を返してはいけません" -#: commands/functioncmds.c:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "変換関数は引数を1つとらなければなりません" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" msgstr "変換関数の第1引数は%s型でなければなりません" -#: commands/functioncmds.c:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "データ型%sは擬似型です" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "データ型%sはドメインです" -#: commands/functioncmds.c:1896 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQL関数の戻り値のデータ型は%sでなければなりません" -#: commands/functioncmds.c:1922 +#: 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:1951 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "型%s、言語\"%s\"の変換はすでに存在します" -#: commands/functioncmds.c:2038 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "型%s、言語\"%s\"の変換は存在しません" -#: commands/functioncmds.c:2062 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "関数%sはすでにスキーマ\"%s\"内に存在します" -#: commands/functioncmds.c:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "インラインコードの指定がありません" -#: commands/functioncmds.c:2163 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "言語\"%s\"ではインラインコード実行をサポートしていません" -#: commands/functioncmds.c:2258 +#: 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:634 #, c-format @@ -7580,292 +8120,297 @@ msgstr "少なくとも1つの列を指定しなければなりません" msgid "cannot use more than %d columns in an index" msgstr "インデックスには%dを超える列を使用できません" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "外部テーブル\"%s\"のインデックスを作成できません" +msgid "cannot create index on relation \"%s\"" +msgstr "リレーション\"%s\"のインデックスを作成できません" -#: commands/indexcmds.c:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" -msgstr "パーティション親テーブル\"%s\"に対して並列的にインデックスを作成することはできません" +msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"には排他制約を作成できません" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対するインデックスを作成できません" -#: commands/indexcmds.c:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "パーティション親リレーションにはデフォルトテーブル空間は指定できません" -#: commands/indexcmds.c:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "共有リレーションのみをpg_globalテーブル空間に格納することができます" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "古いメソッド\"rtree\"をアクセスメソッド\"gist\"に置換しています" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "アクセスメソッド\"%s\"では一意性インデックスをサポートしていません" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "アクセスメソッド\"%s\"では包含列をサポートしていません" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "アクセスメソッド\"%s\"は複数列インデックスをサポートしません" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "アクセスメソッド\"%s\"は排除制約をサポートしていません" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "パーティションキーはアクセスメソッド\"%s\"を使っているインデックスには適合させられません" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "パーティションキー定義では %s 制約はサポートしていません" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約はパーティションキーが式を含む場合は使用できません" -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1040 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "パーティション親テーブル上のユニーク制約はすべてのパーティショニング列を含まなければなりません" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1041 #, 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:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1060 commands/indexcmds.c:1079 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列へのインデックス作成はサポートされていません" -#: commands/indexcmds.c:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1279 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"にはユニークインデックスを構築できません" -#: commands/indexcmds.c:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1281 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "テーブル\"%s\"は外部テーブルを子テーブルとして含んでいます" -#: commands/indexcmds.c:1776 +#: commands/indexcmds.c:1743 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1854 parser/parse_utilcmd.c:2526 parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1821 parser/parse_utilcmd.c:2529 parser/parse_utilcmd.c:2664 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーとして指名された列\"%s\"は存在しません" -#: commands/indexcmds.c:1878 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "包含列では式はサポートされません" -#: commands/indexcmds.c:1919 +#: commands/indexcmds.c:1886 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "式インデックスの関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1934 +#: commands/indexcmds.c:1901 #, c-format msgid "including column does not support a collation" msgstr "包含列は照合順序をサポートしません" -#: commands/indexcmds.c:1938 +#: commands/indexcmds.c:1905 #, c-format msgid "including column does not support an operator class" msgstr "包含列は演算子クラスをサポートしません" -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1909 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包含列は ASC/DESC オプションをサポートしません" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1913 #, c-format msgid "including column does not support NULLS FIRST/LAST options" -msgstr "包含列はNULLS FIRST/LASTオプションをサポートしません" +msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません" -#: commands/indexcmds.c:1987 +#: commands/indexcmds.c:1954 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:1995 commands/tablecmds.c:16956 commands/typecmds.c:810 parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 utils/adt/misc.c:628 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17516 commands/typecmds.c:807 parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" -msgstr "%s型では照合順序はサポートされません" +msgstr "%s 型では照合順序はサポートされません" -#: commands/indexcmds.c:2060 +#: commands/indexcmds.c:2027 #, c-format msgid "operator %s is not commutative" -msgstr "演算子%sは可換ではありません" +msgstr "演算子 %s は可換ではありません" -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2029 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "排除制約で使えるのは可換演算子だけです" -#: commands/indexcmds.c:2088 +#: commands/indexcmds.c:2055 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "演算子%sは演算子族\"%s\"のメンバーではありません" -#: commands/indexcmds.c:2091 +#: commands/indexcmds.c:2058 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "この排除に使用する演算子はこの制約に使用するインデックス演算子に関連付けられている必要があります。" -#: commands/indexcmds.c:2126 +#: commands/indexcmds.c:2093 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポートしません" -#: commands/indexcmds.c:2131 +#: commands/indexcmds.c:2098 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:2177 commands/tablecmds.c:16981 commands/tablecmds.c:16987 commands/typecmds.c:2317 +#: commands/indexcmds.c:2144 commands/tablecmds.c:17541 commands/tablecmds.c:17547 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:2179 +#: commands/indexcmds.c:2146 #, 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:2208 commands/indexcmds.c:2216 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2175 commands/indexcmds.c:2183 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:2230 commands/typecmds.c:2305 +#: commands/indexcmds.c:2197 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算子クラス\"%s\"はデータ型%sを受け付けません" -#: commands/indexcmds.c:2320 +#: commands/indexcmds.c:2287 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sには複数のデフォルトの演算子クラスがあります" -#: commands/indexcmds.c:2648 +#: commands/indexcmds.c:2615 #, c-format msgid "unrecognized REINDEX option \"%s\"" -msgstr "認識されないREINDEXのオプション\"%s\"" +msgstr "認識できないREINDEXのオプション \"%s\"" -#: commands/indexcmds.c:2872 +#: commands/indexcmds.c:2839 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"には並行インデックス再作成が可能なインデックスがありません" -#: commands/indexcmds.c:2886 +#: commands/indexcmds.c:2853 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"には再構築すべきインデックスはありません" -#: commands/indexcmds.c:2926 commands/indexcmds.c:3433 commands/indexcmds.c:3561 +#: commands/indexcmds.c:2893 commands/indexcmds.c:3397 commands/indexcmds.c:3525 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログではインデックスの並行再構築はできません" -#: commands/indexcmds.c:2949 +#: commands/indexcmds.c:2916 #, c-format msgid "can only reindex the currently open database" msgstr "現在オープンしているデータベースのみをインデックス再構築することができます" -#: commands/indexcmds.c:3037 +#: commands/indexcmds.c:3004 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: commands/indexcmds.c:3070 +#: commands/indexcmds.c:3037 #, c-format msgid "cannot move system relations, skipping all" msgstr "システムリレーションは移動できません、すべてスキップします" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3083 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3120 +#: commands/indexcmds.c:3086 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" -msgstr "パーティションインデックス\"%s.%s\"の再構築中" +msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3313 commands/indexcmds.c:4169 +#: commands/indexcmds.c:3277 commands/indexcmds.c:4133 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" -#: commands/indexcmds.c:3465 commands/indexcmds.c:3517 +#: commands/indexcmds.c:3429 commands/indexcmds.c:3481 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "無効なインデックス \"%s.%s\"の並行再構築はできません、スキップします " -#: commands/indexcmds.c:3471 +#: commands/indexcmds.c:3435 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"を並行再構築することはできません、スキップします " -#: commands/indexcmds.c:3626 +#: commands/indexcmds.c:3590 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "このタイプのリレーションでインデックス並列再構築はできません" -#: commands/indexcmds.c:3647 +#: commands/indexcmds.c:3611 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" -msgstr "非共有リレーションをテーブルスペース\"%s\"へ移動できません" +msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:4150 commands/indexcmds.c:4162 +#: commands/indexcmds.c:4114 commands/indexcmds.c:4126 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4116 commands/indexcmds.c:4135 +#, c-format +msgid "%s." +msgstr "%s。" + +#: commands/lockcmds.c:92 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\"はテーブルやビューではありません" +msgid "cannot lock relation \"%s\"" +msgstr "リレーション\"%s\"はロックできません" #: commands/matview.c:193 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "実体化ビューにデータが投入されていない場合はCONCURRENTLYを使用することはできません" -#: commands/matview.c:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "%sオプションと%sオプションとを同時に使用することはできません" @@ -7880,12 +8425,12 @@ msgstr "実体化ビュー\"%s\"を平行的に最新化することはできま 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:652 +#: 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:654 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "行: %s" @@ -7983,22 +8528,22 @@ msgstr "インデックス検索演算子はブール型を返す必要があり #: commands/opclasscmds.c:1224 #, c-format msgid "associated data types for operator class options parsing functions must match opclass input type" -msgstr "演算子クラスオプションのパース関数に対応するデータ型は演算子クラスの入力型と合致する必要があります" +msgstr "演算子クラスのパース関数に対応するデータ型は演算子クラスの入力型と一致している必要があります" #: commands/opclasscmds.c:1231 #, c-format msgid "left and right associated data types for operator class options parsing functions must match" -msgstr "演算子クラスオプションパース関数の左右辺の関連データ型は合致しなければなりません" +msgstr "演算子クラスオプションのパース関数の左右辺の対応するデータ型は一致している必要があります" #: commands/opclasscmds.c:1239 #, c-format msgid "invalid operator class options parsing function" -msgstr "不正な演算子クラスオプションパース関数" +msgstr "不正な演算子クラスオプションのパース関数" #: commands/opclasscmds.c:1240 #, c-format msgid "Valid signature of operator class options parsing function is %s." -msgstr "演算子クラスオプションのパース関数の妥当なシグネチャは %sです。" +msgstr "演算子クラスオプションのパース関数の正しいシグネチャは %s です。" #: commands/opclasscmds.c:1259 #, c-format @@ -8128,12 +8673,12 @@ msgstr "演算子関数を指定する必要があります" #: commands/operatorcmds.c:181 #, c-format msgid "operator argument types must be specified" -msgstr "演算子の引数型の指定が必要です" +msgstr "引数型を指定する必要があります" #: commands/operatorcmds.c:185 #, c-format msgid "operator right argument type must be specified" -msgstr "演算子の右辺の引数型の指定が必要です" +msgstr "演算子の引数型を指定する必要があります" #: commands/operatorcmds.c:186 #, c-format @@ -8160,7 +8705,7 @@ msgstr "JOIN推定関数 %s は %s型を返す必要があります" msgid "operator attribute \"%s\" cannot be changed" msgstr "演算子の属性\"%s\"は変更できません" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 commands/tablecmds.c:1585 commands/tablecmds.c:2165 commands/tablecmds.c:3390 commands/tablecmds.c:6064 commands/tablecmds.c:8989 commands/tablecmds.c:16546 commands/tablecmds.c:16581 commands/trigger.c:313 commands/trigger.c:1289 commands/trigger.c:1398 rewrite/rewriteDefine.c:277 rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1609 commands/tablecmds.c:2197 commands/tablecmds.c:3423 commands/tablecmds.c:6312 commands/tablecmds.c:9148 commands/tablecmds.c:17094 commands/tablecmds.c:17129 commands/trigger.c:328 commands/trigger.c:1378 commands/trigger.c:1488 rewrite/rewriteDefine.c:278 rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "権限がありません: \"%s\"はシステムカタログです" @@ -8208,54 +8753,44 @@ msgstr "カーソル名が不正です: 空ではいけません" #: commands/portalcmds.c:72 #, c-format msgid "cannot create a cursor WITH HOLD within security-restricted operation" -msgstr "セキュリティー制限された処理中は、WITH HOLDカーソルを作成できません" +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 +#: 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:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "パラメータ$%dのデータ型が特定できませんでした" - -#: commands/prepare.c:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "ユーティリティ文は準備できません" - -#: commands/prepare.c:264 commands/prepare.c:269 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "準備された文はSELECTではありません" -#: commands/prepare.c:329 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "準備された文\"%s\"のパラメータ数が間違っています" -#: commands/prepare.c:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "%dパラメータを想定しましたが、%dパラメータでした" -#: commands/prepare.c:364 +#: 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:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "準備された文\"%s\"はすでに存在します" -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "準備された文\"%s\"は存在しません" @@ -8265,61 +8800,190 @@ msgstr "準備された文\"%s\"は存在しません" msgid "must be superuser to create custom procedural language" msgstr "手続き言語を生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1222 postmaster/postmaster.c:1321 utils/init/miscinit.c:1659 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "\"publish\"オプションのリスト構文が不正です" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "パラメータ\"%s\"のリスト構文が不正です" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "識別できない\"publish\"の値: \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "パブリケーションオプション\"%s\"に対する認識できない値: \"%s\"" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "識別できないパブリケーションのパラメータ: \"%s\"" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "SURRENT_SCHEMAでスキーマの選択ができませんでした" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "システム列は使用できません。" + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "ユーザー定義演算子は使用できません。" + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "列、定数、組み込み演算子、組み込みデータ型、組み込み照合順序、そして不変組み込み関数のみ使用可能です。" + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "ユーザー定義型は使用できません。" + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "ユーザー定義または組み込みの不変関数は使用できません。" + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "ユーザー定義照合順序は使用できません。" + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "パブリケーションのWHERE式が不正です" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "リレーション\"%s\"に対してはパブリケーションのWHERE句は使用できません" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "%sが偽のときはWHERE句をパーティション親テーブルに対して使用することはできません。" + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "パブリケーション\"%3$s\"のリレーション\"%1$s.%2$s\"に対して列リストを使用することはできません" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "FOR TABLES IN SCHEMA要素を含むパブリケーションで列リストは指定できません。" + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "%sが偽のときはパーティション親テーブルに対して列リストを使用できません。" + +#: commands/publicationcmds.c:760 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLE 指定のパブリケーションを生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:250 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "FOR TABLES IN SCHEMA設定のパブリケーションを作成するにはスーパーユーザーである必要があります" + +#: commands/publicationcmds.c:867 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level が論理更新情報のパブリッシュには不十分です" -#: commands/publicationcmds.c:251 +#: commands/publicationcmds.c:868 +#, c-format +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "サブスクリプションを作成する前にwal_levelを\"logical\"に設定にしてください。" + +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "パブリケーション\"%2$s\"に対してパラメーター\"%1$s\"を偽に設定することはできません" + +#: commands/publicationcmds.c:967 +#, 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:975 +#, 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:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "パブリケーション\"%s\"にはスキーマは追加できません" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "カラムリストが指定されているテーブルがパブリケーションに含まれている場合はスキーマの追加ができません。" + +#: commands/publicationcmds.c:1348 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "wal_levelをlogicalに設定にしてからサブスクリプションを作成してください。" +msgid "must be superuser to add or set schemas" +msgstr "スキーマを追加または設定するにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "パブリケーション\"%s\"は FOR ALL TABLES と定義されています" -#: commands/publicationcmds.c:378 +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "FOR ALL TABLES指定のパブリケーションではスキーマの追加や削除はできません。" + +#: commands/publicationcmds.c:1367 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定のパブリケーションではテーブルの追加や削除はできません。" -#: commands/publicationcmds.c:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "テーブル\"%s\"でWHERE句が衝突しているか重複しています" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "テーブル\"%s\"で列リストが衝突しているか重複しています" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "ALTER PUBLICATION ... DROPでは、列リストは指定できません" + +#: commands/publicationcmds.c:1814 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "リレーション\"%s\"はパブリケーションの一部ではありません" -#: commands/publicationcmds.c:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "テーブルをパブリケーションから削除する際にはWHERE句を指定できません" + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "スキーマ\"%s\"のテーブルはこのパブリケーションに含まれてません" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "パブリケーション\"%s\"の所有者を変更する権限がありません" -#: commands/publicationcmds.c:752 +#: commands/publicationcmds.c:1926 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "FOR ALL TABLES設定のパブリケーションの所有者はスーパーユーザーである必要があります" +#: commands/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR TABLES IN SCHEMA設定のパブリケーションの所有者はスーパーユーザーでなければなりません。" + #: commands/schemacmds.c:108 commands/schemacmds.c:288 #, c-format msgid "unacceptable schema name \"%s\"" @@ -8335,2163 +8999,2237 @@ 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:717 +#: commands/sequence.c:755 #, 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:740 +#: commands/sequence.c:774 #, 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:858 +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "本セッションでシーケンス\"%s\"のcurrvalはまだ定義されていません" -#: commands/sequence.c:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "本セッションでlastvalはまだ定義されていません" -#: commands/sequence.c:971 +#: commands/sequence.c:997 #, 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:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "不正なオプション SEQUENCE NAME" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "識別列の型はsmallint、integerまたはbigintでなくてはなりません" -#: commands/sequence.c:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "シーケンスの型はsmallint、integerまたはbigintでなくてはなりません" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENTはゼロではいけません" -#: commands/sequence.c:1481 +#: commands/sequence.c:1474 #, 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:1518 +#: commands/sequence.c:1506 #, 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:1532 +#: commands/sequence.c:1514 #, 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:1559 +#: commands/sequence.c:1535 #, 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:1571 +#: commands/sequence.c:1541 #, 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:1601 +#: commands/sequence.c:1565 #, 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:1613 +#: commands/sequence.c:1571 #, 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:1628 +#: commands/sequence.c:1582 #, 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:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "不正なOWNED BYオプションです" -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "OWNED BY table.column または OWNED BY NONEを指定してください。" -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, 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:1698 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "シーケンスは関連するテーブルと同じ所有者でなければなりません" -#: commands/sequence.c:1702 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "シーケンスは関連するテーブルと同じスキーマでなければなりません" -#: commands/sequence.c:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "識別シーケンスの所有者は変更できません" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13874 commands/tablecmds.c:16511 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "シーケンス\"%s\"はテーブル\"%s\"にリンクされています" -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "CREATE STATISTICSで指定可能なリレーションは一つのみです" -#: commands/statscmds.c:139 +#: 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:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "統計情報オブジェクト\"%s\"はすでに存在します、スキップします" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "統計情報オブジェクト\"%s\"はすでに存在します" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "統計情報は%dを超える列を使用できません" -#: commands/statscmds.c:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "システム列に対する統計情報の作成はサポートされていません" -#: commands/statscmds.c:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, 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:326 +#: commands/statscmds.c:325 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" -msgstr "結果の型%sはデフォルトのbtree演算子クラスがないため、式は多値統計情報では使用できません" +msgstr "式の型%sがデフォルトbtree演算子クラスを持たないためこの式は多値統計情報では使用できません" -#: commands/statscmds.c:347 +#: commands/statscmds.c:346 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" -msgstr "単一の式に対する統計情報を構築する際には、統計種別を指定できません" +msgstr "単一式上の統計情報の構築時には、統計種別は指定できません" -#: commands/statscmds.c:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "認識できない統計情報種別\"%s\"" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "拡張統計情報には最低でも2つの列が必要です" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "定形情報定義中の列名が重複しています" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" -msgstr "統計情報定義中の式が重複しています" +msgstr "統計情報定義内に重複した式" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8116 #, c-format msgid "statistics target %d is too low" msgstr "統計情報目標%dは小さすぎます" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8124 #, c-format msgid "lowering statistics target to %d" msgstr "統計情報目標を%dに減らします" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s.%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:223 +#: 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:237 commands/subscriptioncmds.c:243 commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 commands/subscriptioncmds.c:274 +#: 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:281 commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "%s としたサブスクリプションでは %s を設定する必要があります" -#: commands/subscriptioncmds.c:380 +#: commands/subscriptioncmds.c:433 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "パブリケーション一覧を発行者から受け取れませんでした: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "パブリケーション%sは発行サーバーには存在しません" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "サブスクリプションを生成するにはスーパーユーザーである必要があります" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 replication/logical/tablesync.c:1247 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "発行サーバーへの接続ができませんでした: %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "発行サーバーでレプリケーションスロット\"%s\"を作成しました" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:529 +#: commands/subscriptioncmds.c:730 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "テーブルは購読されていません、テーブルを購読するためには %s を実行する必要があります" -#: commands/subscriptioncmds.c:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効にされているサブスクリプションには %s を指定できません" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションを有効にはできません" -#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "refresh指定された ALTER SUBSCRIPTION は無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) を使ってください。" -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, 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:1140 +#, 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を実行してください。" + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +msgid "Use %s instead." +msgstr "代わりに%sを使用してください" + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "refresh = false または copy_data = false を指定して%sを実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" + +#: commands/subscriptioncmds.c:1218 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHは無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1092 +#: commands/subscriptioncmds.c:1243 +#, c-format +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:1244 +#, c-format +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:1263 +#, c-format +msgid "must be superuser to skip transaction" +msgstr "トランザクションをスキップするにはスーパーユーザーである必要があります" + +#: commands/subscriptioncmds.c:1283 +#, c-format +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:1363 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "サブスクリプション\"%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:1344 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "発行サーバー上のレプリケーションスロット\"%s\"を削除しました" -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "発行サーバー上のレプリケーションスロット\"%s\"の削除に失敗しました: %s" -#: commands/subscriptioncmds.c:1395 +#: commands/subscriptioncmds.c:1672 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "サブスクリプション\"%s\"の所有者を変更する権限がありません" -#: commands/subscriptioncmds.c:1397 +#: commands/subscriptioncmds.c:1674 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "サブスクリプションの所有者はスーパーユーザーでなければなりません。" -#: commands/subscriptioncmds.c:1513 +#: commands/subscriptioncmds.c:1788 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "発行テーブルの一覧を発行サーバーから受け取れませんでした: %s" -#: commands/subscriptioncmds.c:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:819 replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "テーブル\"%s.%s\"に対して、異なるパブリケーションで異なる列リストを使用することはできません" + +#: commands/subscriptioncmds.c:1860 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" -msgstr "レプリケーションスロット\"%s\"を削除するための発行サーバーへの接続に失敗しました: %s" +msgstr "レプリケーションスロット\"%s\"を削除する際に発行者サーバーへの接続に失敗しました: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1581 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "%s でサブスクリプションを無効化してから、%s でスロットとの関連付けを解除してください。" -#: commands/subscriptioncmds.c:1612 +#: commands/subscriptioncmds.c:1894 #, c-format msgid "publication name \"%s\" used more than once" msgstr "パブリケーション名\"%s\"が2回以上使われています" -#: commands/subscriptioncmds.c:1656 +#: commands/subscriptioncmds.c:1938 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にすでに存在します" -#: commands/subscriptioncmds.c:1670 +#: commands/subscriptioncmds.c:1952 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" -msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にありません" +msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にはありません" -#: commands/subscriptioncmds.c:1681 +#: commands/subscriptioncmds.c:1963 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "サブスクリプションからすべてのパブリケーションを削除することはできません" -#: commands/tablecmds.c:241 commands/tablecmds.c:283 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "テーブル\"%s\"は存在しません" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "テーブルを削除するにはDROP TABLEを使用してください。" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "シーケンス\"%s\"は存在しません" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "シーケンス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "シーケンスを削除するにはDROP SEQUENCEを使用してください。" -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "ビューを削除するにはDROP VIEWを使用してください。" -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "実体化ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "実体化ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:266 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18441 parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19023 parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "インデックス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "インデックスを削除するにはDROP INDEXを使用してください" -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\"は型ではありません" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "型を削除するにはDROP TYPEを使用してください" -#: commands/tablecmds.c:277 commands/tablecmds.c:13196 commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13713 commands/tablecmds.c:16214 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "外部テーブル\"%s\"は存在しません" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "外部テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "外部テーブルを削除するには DROP FOREIGN TABLE を使用してください。" -#: commands/tablecmds.c:670 +#: commands/tablecmds.c:697 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMITは一時テーブルでのみ使用できます" -#: commands/tablecmds.c:701 +#: commands/tablecmds.c:728 #, c-format msgid "cannot create temporary table within security-restricted operation" -msgstr "セキュリティー制限された処理中は、一時テーブルを作成できません" +msgstr "セキュリティー制限操作中は、一時テーブルを作成できません" -#: commands/tablecmds.c:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15021 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "リレーション\"%s\"が複数回継承されました" -#: commands/tablecmds.c:922 +#: commands/tablecmds.c:949 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "パーティション親テーブルではテーブルアクセスメソッドの指定はサポートされていません" -#: commands/tablecmds.c:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\"はパーティションされていません" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d以上の列を使ったパーティションはできません" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "パーティションテーブル\"%s\"では外部子テーブルを作成できません" -#: commands/tablecmds.c:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "テーブル\"%s\"はユニークインデックスを持っています" -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLYは複数オブジェクトの削除をサポートしていません" -#: commands/tablecmds.c:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLYはCASCADEをサポートしません" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "パーティション親インデックス\"%s\"は並行的に削除することはできません" -#: commands/tablecmds.c:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "パーティションの親テーブルのみの切り詰めはできません" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "ONLY キーワードを指定しないでください、もしくは子テーブルに対して直接 TRUNCATE ONLY を実行してください。" -#: commands/tablecmds.c:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "テーブル\"%s\"へのカスケードを削除します" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" -msgstr "外部テーブル\"%s\"の切り詰めができません" +msgstr "外部テーブル\"%s\"の切り詰めはできません" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "他のセッションの一時テーブルを削除できません" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14918 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "パーティション子テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 parser/parse_utilcmd.c:2633 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "継承しようとしたリレーション\"%s\"はテーブルまたは外部テーブルではありません" -#: commands/tablecmds.c:2455 +#: commands/tablecmds.c:2487 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" -msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとして作ることはできません" +msgstr "一時リレーションを永続リレーション\"%s\"のパーティション子テーブルとして作ることはできません" -#: commands/tablecmds.c:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14897 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"から継承することはできません" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14905 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "他のセッションの一時リレーションから継承することはできません" -#: commands/tablecmds.c:2528 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "複数の継承される列\"%s\"の定義をマージしています" -#: commands/tablecmds.c:2536 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "継承される列\"%s\"の型が競合しています" -#: commands/tablecmds.c:2538 commands/tablecmds.c:2561 commands/tablecmds.c:2578 commands/tablecmds.c:2834 commands/tablecmds.c:2864 commands/tablecmds.c:2878 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 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 commands/tablecmds.c:2610 commands/tablecmds.c:2866 commands/tablecmds.c:2896 commands/tablecmds.c:2910 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:2547 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "継承される列 \"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:2549 commands/tablecmds.c:2846 commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\"対\"%s\"" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "継承される列 \"%s\"の格納パラメーターが競合しています" -#: commands/tablecmds.c:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, c-format msgid "column \"%s\" has a compression method conflict" -msgstr "列\"%s\"の圧縮方法が競合しています" +msgstr "列\"%s\"の圧縮方式が競合しています" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "継承された列 \"%s\"の生成が競合しています" -#: commands/tablecmds.c:2685 commands/tablecmds.c:2740 commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 commands/tablecmds.c:12437 parser/parse_utilcmd.c:1302 parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 #, c-format msgid "cannot convert whole-row table reference" msgstr "行全体テーブル参照を変換できません" -#: commands/tablecmds.c:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"をマージしています" -#: commands/tablecmds.c:2824 +#: commands/tablecmds.c:2856 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"を移動してマージします" -#: commands/tablecmds.c:2825 +#: commands/tablecmds.c:2857 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ユーザーが指定した列が継承した列の位置に移動されました。" -#: commands/tablecmds.c:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "列\"%s\"の型が競合しています" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "列\"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "列\"%s\"の格納パラメーターが競合しています" -#: commands/tablecmds.c:2903 +#: commands/tablecmds.c:2935 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "子テーブルの列\"%s\"は生成式を指定しています" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:2937 #, 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 "親テーブルの生成式を継承するために、子テーブルのカラムの生成式定義を無視しました" +msgstr "親テーブルの生成式を継承するために、子テーブルの列の生成式定義を無視しました" -#: commands/tablecmds.c:2909 +#: commands/tablecmds.c:2941 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "列\"%s\"は生成列を継承しますが、default 指定がされています" -#: commands/tablecmds.c:2914 +#: commands/tablecmds.c:2946 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "列\"%s\"は生成列を継承しますが、識別列と指定されています" -#: commands/tablecmds.c:3023 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "列\"%s\"は競合する生成式を継承します" -#: commands/tablecmds.c:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "列\"%s\"は競合するデフォルト値を継承します" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "競合を解消するには明示的にデフォルトを指定してください" -#: commands/tablecmds.c:3076 +#: commands/tablecmds.c:3108 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "異なる式を持つ検査制約名\"%s\"が複数あります。" -#: commands/tablecmds.c:3289 +#: commands/tablecmds.c:3321 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "他のセッションの一時テーブルを移動できません" -#: commands/tablecmds.c:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "型付けされたテーブルの列をリネームできません" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3410 #, 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:3472 +#: commands/tablecmds.c:3505 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "継承される列\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "システム列%s\"の名前を変更できません" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "継承される列\"%s\"の名前を変更できません" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "継承される制約\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3678 +#: commands/tablecmds.c:3711 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "継承される制約\"%s\"の名前を変更できません" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3976 +#: commands/tablecmds.c:4008 #, 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:3985 +#: commands/tablecmds.c:4017 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" -msgstr "保留中のトリガーイベントがあるため\"%2$s\"を%1$sできません" +msgstr "保留中のトリガイベントがあるため\"%2$s\"を%1$sできません" -#: commands/tablecmds.c:4453 +#: commands/tablecmds.c:4486 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" -msgstr "未完了の取り外しが存在するパーティション\"%s\"の定義変更はできません" +msgstr "パーティション子テーブル\"%s\"は不完全な取り外し状態であるため変更できません" -#: commands/tablecmds.c:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "永続性設定の変更は2度はできません" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "パーティション親テーブルのアクセスメソッドは変更できません" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "SET ACCESS METHODサブコマンドを複数指定できません" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "システムリレーション\"%sを書き換えられません" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "カタログテーブルとして使用されているテーブル\"%s\"は書き換えられません" -#: commands/tablecmds.c:5437 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "他のセッションの一時テーブルを書き換えられません" -#: commands/tablecmds.c:5898 +#: commands/tablecmds.c:5986 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "リレーション\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/tablecmds.c:5915 +#: commands/tablecmds.c:6003 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%2$s\"の検査制約\"%1$s\"に違反してます" -#: commands/tablecmds.c:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "デフォルトパーティション\"%s\"の一部の行が更新後のパーティション制約に違反しています" -#: commands/tablecmds.c:5940 +#: commands/tablecmds.c:6028 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%s\"のパーティション制約に違反しています" -#: commands/tablecmds.c:6088 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:6091 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、インデックスではありません" - -#: commands/tablecmds.c:6097 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\"はテーブルや実体化ビュー、インデックスではありません" - -#: commands/tablecmds.c:6100 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or partitioned index" -msgstr "\"%s\"はテーブル、実体化ビュー、インデックス、またはパーティションインデックスではありません" - -#: commands/tablecmds.c:6103 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" -msgstr "\"%s\"はテーブル、実体化ビュー、インデックス、パーティションインデックス、または外部テーブルではありません" - -#: commands/tablecmds.c:6106 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\"はテーブルや実体化ビュー、または外部テーブルではありません" - -#: commands/tablecmds.c:6109 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\"はテーブルや外部テーブルではありません" - -#: commands/tablecmds.c:6112 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\"はテーブル、複合型、外部テーブルのいずれでもありません" - -#: commands/tablecmds.c:6115 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "\"%s\"はテーブルやインデックス、実体化ビュー、インデックス、外部テーブルではありません" - -#: commands/tablecmds.c:6118 -#, c-format -msgid "\"%s\" is not a table or partitioned index" -msgstr "\"%s\"はテーブルまたはパーティションインデックスではありません" - -#: commands/tablecmds.c:6128 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, 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:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "型\"%s\"を変更できません。列\"%s\".\"%s\"でその型を使用しているためです" -#: commands/tablecmds.c:6386 +#: commands/tablecmds.c:6564 #, 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:6393 +#: commands/tablecmds.c:6571 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "テーブル\"%s\"を変更できません。その行型を列\"%s\".\"%s\"で使用しているためです" -#: commands/tablecmds.c:6449 +#: commands/tablecmds.c:6627 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "型付けされたテーブルの型であるため、外部テーブル\"%s\"を変更できません。" -#: commands/tablecmds.c:6451 +#: commands/tablecmds.c:6629 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "型付けされたテーブルを変更する場合も ALTER .. CASCADE を使用してください" -#: commands/tablecmds.c:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "型 %s は複合型ではありません" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "型付けされたテーブルに列を追加できません" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "パーティションに列は追加できません" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15148 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "子テーブル\"%s\"に異なる型の列\"%s\"があります" -#: commands/tablecmds.c:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15155 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "子テーブル\"%s\"に異なる照合順序の列\"%s\"があります" -#: commands/tablecmds.c:6626 +#: commands/tablecmds.c:6804 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "子\"%2$s\"の列\"%1$s\"の定義をマージしています" -#: commands/tablecmds.c:6669 +#: commands/tablecmds.c:6851 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "子テーブルを持つテーブルに識別列を再帰的に追加することはできません" -#: commands/tablecmds.c:6912 +#: commands/tablecmds.c:7095 #, c-format msgid "column must be added to child tables too" msgstr "列は子テーブルでも追加する必要があります" -#: commands/tablecmds.c:6990 +#: commands/tablecmds.c:7173 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します、スキップします" -#: commands/tablecmds.c:6997 +#: commands/tablecmds.c:7180 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7246 commands/tablecmds.c:12076 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "パーティションが存在する場合にはパーティション親テーブルのみから制約を削除することはできません" -#: commands/tablecmds.c:7064 commands/tablecmds.c:7381 commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7247 commands/tablecmds.c:7564 commands/tablecmds.c:8561 commands/tablecmds.c:12077 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLYキーワードを指定しないでください。" -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 commands/tablecmds.c:7449 commands/tablecmds.c:7563 commands/tablecmds.c:7657 commands/tablecmds.c:7716 commands/tablecmds.c:7834 commands/tablecmds.c:8000 commands/tablecmds.c:8070 commands/tablecmds.c:8226 commands/tablecmds.c:11735 commands/tablecmds.c:13219 commands/tablecmds.c:15765 +#: commands/tablecmds.c:7284 commands/tablecmds.c:7490 commands/tablecmds.c:7632 commands/tablecmds.c:7746 commands/tablecmds.c:7840 commands/tablecmds.c:7899 commands/tablecmds.c:8018 commands/tablecmds.c:8157 commands/tablecmds.c:8227 commands/tablecmds.c:8383 commands/tablecmds.c:12231 commands/tablecmds.c:13736 commands/tablecmds.c:16305 #, c-format msgid "cannot alter system column \"%s\"" msgstr "システム列\"%s\"を変更できません" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7290 commands/tablecmds.c:7638 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列です" -#: commands/tablecmds.c:7150 +#: commands/tablecmds.c:7333 #, c-format msgid "column \"%s\" is in a primary key" msgstr "列\"%s\"はプライマリキーで使用しています" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7338 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "列\"%s\"は複製識別として使用中のインデックスに含まれています" -#: commands/tablecmds.c:7178 +#: commands/tablecmds.c:7361 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "列\"%s\"は親テーブルでNOT NULL指定されています" -#: commands/tablecmds.c:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7561 commands/tablecmds.c:9044 #, c-format msgid "constraint must be added to child tables too" msgstr "制約は子テーブルにも追加する必要があります" -#: commands/tablecmds.c:7379 +#: commands/tablecmds.c:7562 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにNOT NULLLではありません。" -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:7640 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "代わりに ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY を使ってください。" -#: commands/tablecmds.c:7462 +#: commands/tablecmds.c:7645 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成カラムです" -#: commands/tablecmds.c:7465 +#: commands/tablecmds.c:7648 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "代わりに ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION を使ってください。" -#: commands/tablecmds.c:7574 +#: commands/tablecmds.c:7757 #, 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:7580 +#: commands/tablecmds.c:7763 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに識別列です" -#: commands/tablecmds.c:7586 +#: commands/tablecmds.c:7769 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにデフォルト値が指定されています" -#: commands/tablecmds.c:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7846 commands/tablecmds.c:7907 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません" -#: commands/tablecmds.c:7729 +#: commands/tablecmds.c:7912 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません、スキップします" -#: commands/tablecmds.c:7782 +#: commands/tablecmds.c:7965 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" -msgstr "ALTER TABLE / DROP EXPRESSION は子テーブルに対しても適用する必要があります" +msgstr "ALTER TABLE / DROP EXPRESSIONは子テーブルに対しても適用されなくてはなりません" -#: commands/tablecmds.c:7804 +#: commands/tablecmds.c:7987 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "継承列から生成式を削除することはできません" -#: commands/tablecmds.c:7842 +#: commands/tablecmds.c:8026 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は格納生成列ではありません" -#: commands/tablecmds.c:7847 +#: commands/tablecmds.c:8031 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は格納生成列ではありません、スキップします" -#: commands/tablecmds.c:7947 +#: commands/tablecmds.c:8104 #, c-format msgid "cannot refer to non-index column by number" msgstr "非インデックス列を番号で参照することはできません" -#: commands/tablecmds.c:7990 +#: commands/tablecmds.c:8147 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "リレーション \"%2$s\"の列 %1$d は存在しません" -#: commands/tablecmds.c:8009 +#: commands/tablecmds.c:8166 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "インデックス\"%2$s\"の包含列\"%1$s\"への統計情報の変更はできません" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:8171 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "インデックス \"%2$s\"の非式列\"%1$s\"の統計情報の変更はできません" -#: commands/tablecmds.c:8016 +#: commands/tablecmds.c:8173 #, c-format msgid "Alter statistics on table column instead." msgstr "代わりにテーブルカラムの統計情報を変更してください。" -#: commands/tablecmds.c:8206 +#: commands/tablecmds.c:8363 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8395 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" -#: commands/tablecmds.c:8283 +#: commands/tablecmds.c:8440 #, c-format msgid "cannot drop column from typed table" msgstr "型付けされたテーブルから列を削除できません" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8499 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:8355 +#: commands/tablecmds.c:8512 #, c-format msgid "cannot drop system column \"%s\"" msgstr "システム列\"%s\"を削除できません" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8522 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "継承される列\"%s\"を削除できません" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8535 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、削除できません" -#: commands/tablecmds.c:8403 +#: commands/tablecmds.c:8560 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "子テーブルが存在する場合にはパーティション親テーブルのみから列を削除することはできません" -#: commands/tablecmds.c:8607 +#: commands/tablecmds.c:8764 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" -msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はパーティション親テーブルではサポートされていません" +msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はパーティションテーブルではサポートされていません" -#: commands/tablecmds.c:8632 +#: commands/tablecmds.c:8789 #, 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:8967 +#: commands/tablecmds.c:9126 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "パーティションテーブル\"%s\"上のリレーション\"%s\"を参照する外部キー定義ではONLY指定はできません " -#: commands/tablecmds.c:8973 +#: commands/tablecmds.c:9132 #, 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:8976 +#: commands/tablecmds.c:9135 #, c-format msgid "This feature is not yet supported on partitioned tables." -msgstr "この機能はパーティション親テーブルに対してはサポートされていません。" +msgstr "この機能はパーティションテーブルに対してはサポートされていません。" -#: commands/tablecmds.c:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9142 commands/tablecmds.c:9608 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "参照先のリレーション\"%s\"はテーブルではありません" -#: commands/tablecmds.c:9006 +#: commands/tablecmds.c:9165 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "永続テーブルの制約は永続テーブルだけを参照できます" -#: commands/tablecmds.c:9013 +#: commands/tablecmds.c:9172 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "UNLOGGEDテーブルに対する制約は、永続テーブルまたはUNLOGGEDテーブルだけを参照する場合があります" -#: commands/tablecmds.c:9019 +#: commands/tablecmds.c:9178 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "一時テーブルに対する制約は一時テーブルだけを参照する場合があります" -#: commands/tablecmds.c:9023 +#: commands/tablecmds.c:9182 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルに対する制約にはこのセッションの一時テーブルを加える必要があります" -#: commands/tablecmds.c:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9256 commands/tablecmds.c:9262 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生成カラムを含む外部キー制約に対する不正な %s 処理" -#: commands/tablecmds.c:9111 +#: commands/tablecmds.c:9278 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーの参照列数と被参照列数が合いません" -#: commands/tablecmds.c:9218 +#: commands/tablecmds.c:9385 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sは実装されていません" -#: commands/tablecmds.c:9220 +#: commands/tablecmds.c:9387 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "キーとなる列\"%s\"と\"%s\"との間で型に互換性がありません:%sと%s" -#: commands/tablecmds.c:9583 commands/tablecmds.c:9996 parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9544 +#, 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:9817 commands/tablecmds.c:10285 parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "外部テーブルでは外部キー制約はサポートされていません" -#: commands/tablecmds.c:10373 commands/tablecmds.c:10651 commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10837 commands/tablecmds.c:11115 commands/tablecmds.c:12033 commands/tablecmds.c:12108 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/tablecmds.c:10380 +#: commands/tablecmds.c:10844 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約ではありません" -#: commands/tablecmds.c:10418 +#: commands/tablecmds.c:10882 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"を変更できません" -#: commands/tablecmds.c:10421 +#: commands/tablecmds.c:10885 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." -msgstr "制約\"%1$s\"は、リレーション\"%3$s\"の制約\"%2$s\"から継承されています。" +msgstr "制約\"%1$s\"は、リレーション\"%3$s\"上の制約\"%2$s\"から派生しています。" -#: commands/tablecmds.c:10423 +#: commands/tablecmds.c:10887 #, c-format msgid "You may alter the constraint it derives from, instead." -msgstr "代わりに派生元の制約を変更することができます。" +msgstr "この制約の代わりに派生元の制約を変更することは可能です。" -#: commands/tablecmds.c:10659 +#: commands/tablecmds.c:11123 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約でも検査制約でもありません" -#: commands/tablecmds.c:10737 +#: commands/tablecmds.c:11201 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約は子テーブルでも検証される必要があります" -#: commands/tablecmds.c:10827 +#: commands/tablecmds.c:11291 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約で参照される列\"%s\"が存在しません" -#: commands/tablecmds.c:10833 +#: commands/tablecmds.c:11297 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "システム列は外部キーに使用できません" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11301 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーでは%dを超えるキーを持つことができません" -#: commands/tablecmds.c:10902 +#: commands/tablecmds.c:11367 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"には遅延可能プライマリキーは使用できません" -#: commands/tablecmds.c:10919 +#: commands/tablecmds.c:11384 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"にはプライマリキーがありません" -#: commands/tablecmds.c:10984 +#: commands/tablecmds.c:11449 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーの被参照列リストには重複があってはなりません" -#: commands/tablecmds.c:11078 +#: commands/tablecmds.c:11543 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に対しては、遅延可能な一意性制約は使用できません" -#: commands/tablecmds.c:11083 +#: commands/tablecmds.c:11548 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" -msgstr "被参照テーブル\"%s\"に、指定したキーに合致する一意性制約がありません" +msgstr "被参照テーブル\"%s\"に、指定したキーに一致する一意性制約がありません" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:11989 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を削除できません" -#: commands/tablecmds.c:11543 +#: commands/tablecmds.c:12039 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:11719 +#: commands/tablecmds.c:12215 #, c-format msgid "cannot alter column type of typed table" msgstr "型付けされたテーブルの列の型を変更できません" -#: commands/tablecmds.c:11746 +#: commands/tablecmds.c:12242 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承される列\"%s\"を変更できません" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12251 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、変更できません" -#: commands/tablecmds.c:11805 +#: commands/tablecmds.c:12301 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"に対するUSING句の結果は自動的に%s型に型変換できません" -#: commands/tablecmds.c:11808 +#: commands/tablecmds.c:12304 #, c-format msgid "You might need to add an explicit cast." msgstr "必要に応じて明示的な型変換を追加してください。" -#: commands/tablecmds.c:11812 +#: commands/tablecmds.c:12308 #, 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:11815 +#: commands/tablecmds.c:12311 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "必要に応じて\"USING %s::%s\"を追加してください。" -#: commands/tablecmds.c:11914 +#: commands/tablecmds.c:12410 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承列\"%1$s\"は変更できません" -#: commands/tablecmds.c:11942 +#: commands/tablecmds.c:12438 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING式が行全体テーブル参照を含んでいます。" -#: commands/tablecmds.c:11953 +#: commands/tablecmds.c:12449 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承される列\"%s\"の型を子テーブルで変更しなければなりません" -#: commands/tablecmds.c:12078 +#: commands/tablecmds.c:12574 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"の型を2回変更することはできません" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12612 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"に対する生成式は自動的に%s型にキャストできません" -#: commands/tablecmds.c:12121 +#: commands/tablecmds.c:12617 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"のデフォルト値を自動的に%s型にキャストできません" -#: commands/tablecmds.c:12199 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "生成カラムで使用される列の型は変更できません" - -#: commands/tablecmds.c:12200 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" - -#: commands/tablecmds.c:12221 +#: commands/tablecmds.c:12698 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ビューまたはルールで使用される列の型は変更できません" -#: commands/tablecmds.c:12222 commands/tablecmds.c:12241 commands/tablecmds.c:12259 +#: commands/tablecmds.c:12699 commands/tablecmds.c:12718 commands/tablecmds.c:12736 #, c-format msgid "%s depends on column \"%s\"" msgstr "%sは列\"%s\"に依存しています" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12717 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義で使用される列の型は変更できません" -#: commands/tablecmds.c:12258 +#: commands/tablecmds.c:12735 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ポリシ定義で使用されている列の型は変更できません" -#: commands/tablecmds.c:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:12766 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "生成カラムで使用される列の型は変更できません" + +#: commands/tablecmds.c:12767 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" + +#: commands/tablecmds.c:13844 commands/tablecmds.c:13856 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13846 commands/tablecmds.c:13858 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "代わりにインデックスのテーブルの所有者を変更してください" -#: commands/tablecmds.c:13355 +#: commands/tablecmds.c:13872 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:13369 commands/tablecmds.c:16657 +#: commands/tablecmds.c:13886 commands/tablecmds.c:17205 commands/tablecmds.c:17224 #, c-format msgid "Use ALTER TYPE instead." msgstr "代わりにALTER TYPEを使用してください。" -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13895 #, 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:13717 +#: commands/tablecmds.c:14257 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定できません" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14334 #, 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:13827 commands/view.c:505 +#: commands/tablecmds.c:14368 commands/view.c:521 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTIONは自動更新可能ビューでのみサポートされます" -#: commands/tablecmds.c:14079 +#: commands/tablecmds.c:14618 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースにはテーブル、インデックスおよび実体化ビューしかありません" -#: commands/tablecmds.c:14091 +#: commands/tablecmds.c:14630 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースとの間のリレーションの移動はできません" -#: commands/tablecmds.c:14183 +#: commands/tablecmds.c:14722 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"のロックが獲得できなかったため中断します" -#: commands/tablecmds.c:14199 +#: commands/tablecmds.c:14738 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"には合致するリレーションはありませんでした" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14856 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付けされたテーブルの継承を変更できません" -#: commands/tablecmds.c:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14861 commands/tablecmds.c:15417 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションの継承は変更できません" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14866 #, c-format msgid "cannot change inheritance of partitioned table" -msgstr "パーティション親テーブルの継承は変更できません" +msgstr "パーティションテーブルの継承は変更できません" -#: commands/tablecmds.c:14372 +#: commands/tablecmds.c:14912 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "他のセッションの一時テーブルを継承できません" -#: commands/tablecmds.c:14385 +#: commands/tablecmds.c:14925 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションからの継承はできません" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17301 +#: commands/tablecmds.c:14947 commands/tablecmds.c:17860 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行うことはできません" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17302 +#: commands/tablecmds.c:14948 commands/tablecmds.c:17861 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"はすでに\"%s\"の子です" -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14961 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" -msgstr "トリガー\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" +msgstr "トリガ\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" -#: commands/tablecmds.c:14423 +#: commands/tablecmds.c:14963 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." -msgstr "遷移テーブルを使用したROWトリガーは継承関係ではサポートされていません。" +msgstr "遷移テーブルを使用したROWトリガは継承関係ではサポートされていません。" -#: commands/tablecmds.c:14626 +#: commands/tablecmds.c:15166 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "子テーブルの列\"%s\"はNOT NULLである必要があります" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15175 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "子テーブルの列\"%s\"は生成列である必要があります" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:15225 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" -msgstr "子テーブルの列\"%s\"は競合する生成式を持っています" +msgstr "子テーブルの列\"%s\"には競合する生成式があります" -#: commands/tablecmds.c:14713 +#: commands/tablecmds.c:15253 #, c-format msgid "child table is missing column \"%s\"" msgstr "子テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15341 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "子テーブル\"%s\"では検査制約\"%s\"に異なった定義がされています" -#: commands/tablecmds.c:14809 +#: commands/tablecmds.c:15349 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"上の継承されない制約と競合します" -#: commands/tablecmds.c:14820 +#: commands/tablecmds.c:15360 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT VALID制約と衝突しています" -#: commands/tablecmds.c:14855 +#: commands/tablecmds.c:15395 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "子テーブルには制約\"%s\"がありません" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15481 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" -msgstr "パーティション子テーブル\"%s\"はすでにパーティション\"%s.%s\"で取り外しが進行中です" +msgstr "パーティション\"%s\"はすでにパーティションテーブル\"%s.%s\"からの取り外し保留中です" -#: commands/tablecmds.c:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15510 commands/tablecmds.c:15558 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"のパーティション子テーブルではありません" -#: commands/tablecmds.c:15024 +#: commands/tablecmds.c:15564 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"の親ではありません" -#: commands/tablecmds.c:15252 +#: commands/tablecmds.c:15792 #, c-format msgid "typed tables cannot inherit" msgstr "型付けされたテーブルは継承できません" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15822 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15833 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルには列\"%s\"がありますが型は\"%s\"を必要としています" -#: commands/tablecmds.c:15302 +#: commands/tablecmds.c:15842 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"では列\"%s\"の型が異なっています" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:15856 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルに余分な列\"%s\"があります" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15908 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"は型付けされたテーブルではありません" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16082 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "非ユニークインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:15548 +#: commands/tablecmds.c:16088 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "一意性を即時検査しないインデックス\"%s\"は複製識別には使用できません" -#: commands/tablecmds.c:15554 +#: commands/tablecmds.c:16094 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "式インデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:15560 +#: commands/tablecmds.c:16100 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別としては使用できません" -#: commands/tablecmds.c:15577 +#: commands/tablecmds.c:16117 #, 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:15584 +#: commands/tablecmds.c:16124 #, 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:15831 +#: commands/tablecmds.c:16371 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"は一時テーブルであるため、ログ出力設定を変更できません" -#: commands/tablecmds.c:15855 +#: commands/tablecmds.c:16395 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"はパブリケーションの一部であるため、UNLOGGEDに変更できません" -#: commands/tablecmds.c:15857 +#: commands/tablecmds.c:16397 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションはレプリケーションできません。" -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16442 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"はUNLOGGEDテーブル\"%s\"を参照しているためLOGGEDには設定できません" -#: commands/tablecmds.c:15912 +#: commands/tablecmds.c:16452 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"はLOGGEDテーブル\"%s\"を参照しているためUNLOGGEDには設定できません" -#: commands/tablecmds.c:15970 +#: commands/tablecmds.c:16510 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有するシーケンスを他のスキーマに移動することができません" -#: commands/tablecmds.c:16077 +#: commands/tablecmds.c:16617 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/tablecmds.c:16640 +#: commands/tablecmds.c:17038 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\"はテーブルや実体化ビューではありません" + +#: commands/tablecmds.c:17188 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"は複合型ではありません" -#: commands/tablecmds.c:16672 +#: commands/tablecmds.c:17216 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "インデックス\"%s\"のスキーマを変更できません" + +#: commands/tablecmds.c:17218 commands/tablecmds.c:17230 +#, c-format +msgid "Change the schema of the table instead." +msgstr "代わりにこのテーブルのスキーマを変更してください。" + +#: commands/tablecmds.c:17222 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "複合型%sのスキーマは変更できません" + +#: commands/tablecmds.c:17228 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "\"%s\"はテーブル、ビュー、実体化ビュー、シーケンス、外部テーブルではありません" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "TOASTテーブル\"%s\"のスキーマは変更できません" -#: commands/tablecmds.c:16707 +#: commands/tablecmds.c:17265 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "識別できないパーティションストラテジ \"%s\"" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17273 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジは2つ以上の列に対しては使えません" -#: commands/tablecmds.c:16781 +#: commands/tablecmds.c:17339 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "パーティションキーに指定されている列\"%s\"は存在しません" -#: commands/tablecmds.c:16789 +#: commands/tablecmds.c:17347 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーでシステム列\"%s\"は使用できません" -#: commands/tablecmds.c:16800 commands/tablecmds.c:16914 +#: commands/tablecmds.c:17358 commands/tablecmds.c:17448 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーで生成カラムは使用できません" -#: commands/tablecmds.c:16801 commands/tablecmds.c:16915 commands/trigger.c:653 rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 +#: commands/tablecmds.c:17359 commands/tablecmds.c:17449 commands/trigger.c:668 rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" -#: commands/tablecmds.c:16877 -#, c-format -msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" - -#: commands/tablecmds.c:16897 +#: commands/tablecmds.c:17431 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "パーティションキー式はシステム列への参照を含むことができません" -#: commands/tablecmds.c:16927 +#: commands/tablecmds.c:17478 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" + +#: commands/tablecmds.c:17487 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数式をパーティションキーとして使うことはできません" -#: commands/tablecmds.c:16948 +#: commands/tablecmds.c:17508 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティション式で使用する照合順序を特定できませんでした" -#: commands/tablecmds.c:16983 +#: commands/tablecmds.c:17543 #, 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:16989 +#: commands/tablecmds.c:17549 #, 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:17241 +#: commands/tablecmds.c:17800 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"はすでパーティションです" -#: commands/tablecmds.c:17247 +#: commands/tablecmds.c:17806 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付けされたテーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:17263 +#: commands/tablecmds.c:17822 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承子テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:17277 +#: commands/tablecmds.c:17836 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:17311 +#: commands/tablecmds.c:17870 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" -msgstr "一時リレーションを永続リレーション\"%s\"の子テーブルとしてアタッチすることはできません" +msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:17319 +#: commands/tablecmds.c:17878 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:17886 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションの一時リレーションのパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:17334 +#: commands/tablecmds.c:17893 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションの一時リレーションにパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:17354 +#: commands/tablecmds.c:17913 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"は親テーブル\"%3$s\"にない列\"%2$s\"を含んでいます" -#: commands/tablecmds.c:17357 +#: commands/tablecmds.c:17916 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "新しいパーティションは親に存在する列のみを含むことができます。" -#: commands/tablecmds.c:17369 +#: commands/tablecmds.c:17928 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" -msgstr "トリガー\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" +msgstr "トリガ\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" -#: commands/tablecmds.c:17371 commands/trigger.c:459 +#: commands/tablecmds.c:17930 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" -msgstr "遷移テーブルを使用するROWトリガーはパーティションではサポートされません" +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません。" -#: commands/tablecmds.c:17550 +#: commands/tablecmds.c:18109 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"はパーティションテーブル\"%s\"の子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:17553 +#: commands/tablecmds.c:18112 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." -msgstr "パーティションテーブル\"%s\"はユニークインデックスを持っています。" +msgstr "パーティション親テーブル\"%s\"はユニークインデックスを持っています。" -#: commands/tablecmds.c:17877 +#: commands/tablecmds.c:18427 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" -msgstr "デフォルトパーティションがある場合はパーティション子テーブルを並列的に取り外すことはできません" +msgstr "デフォルトパーティションを持つパーティションは並列的に取り外しはできません" -#: commands/tablecmds.c:17986 +#: commands/tablecmds.c:18536 #, c-format msgid "partitioned table \"%s\" was removed concurrently" -msgstr "パーティションテーブル\"%s\"は同時に削除されました" +msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/tablecmds.c:17992 +#: commands/tablecmds.c:18542 #, c-format msgid "partition \"%s\" was removed concurrently" -msgstr "パーティションテーブル\"%s\"は同時に削除されました" +msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:18475 commands/tablecmds.c:18495 commands/tablecmds.c:18515 commands/tablecmds.c:18534 commands/tablecmds.c:18576 +#: commands/tablecmds.c:19057 commands/tablecmds.c:19077 commands/tablecmds.c:19097 commands/tablecmds.c:19116 commands/tablecmds.c:19158 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:18478 +#: commands/tablecmds.c:19060 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:18498 +#: commands/tablecmds.c:19080 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:18518 +#: commands/tablecmds.c:19100 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:18537 +#: commands/tablecmds.c:19119 #, 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:18579 +#: commands/tablecmds.c:19161 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:18816 +#: commands/tablecmds.c:19398 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:18823 +#: commands/tablecmds.c:19405 #, c-format msgid "invalid compression method \"%s\"" -msgstr "無効な圧縮方式 \"%s\"" - -#: commands/tablespace.c:161 commands/tablespace.c:177 commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 storage/file/copydir.c:47 -#, c-format -msgid "could not create directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" +msgstr "無効な圧縮方式\"%s\"" -#: commands/tablespace.c:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\"は存在しますが、ディレクトリではありません" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "テーブル空間\"%s\"を作成する権限がありません" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "テーブル空間を生成するにはスーパーユーザーである必要があります。" -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "テーブル空間の場所には単一引用符を含めることができません" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "テーブル空間の場所は絶対パスでなければなりません" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "テーブル空間の場所\"%s\"は長すぎます" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "テーブル空間の場所はデータディレクトリの中に指定すべきではありません" -#: commands/tablespace.c:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "テーブル空間名\"%s\"を受け付けられません" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "接頭辞\"pg_\"はシステムテーブル空間用に予約されています" -#: commands/tablespace.c:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "テーブル空間\"%s\"はすでに存在します" -#: commands/tablespace.c:427 commands/tablespace.c:959 commands/tablespace.c:1048 commands/tablespace.c:1117 commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にpg_tablespaceのOID値が設定されてません" + +#: commands/tablespace.c:441 commands/tablespace.c:979 commands/tablespace.c:1068 commands/tablespace.c:1137 commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "テーブル空間\"%s\"は存在しません" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "テーブル空間\"%s\"は存在しません、スキップします" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" -msgstr "他のオブジェクトが依存しているためテーブルスペース\"%s\"は削除できません" +msgstr "一部のオブジェクトが依存しているためテーブルスペース\"%s\"は削除できません" -#: commands/tablespace.c:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "テーブル空間\"%s\"は空ではありません" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "ディレクトリ\"%s\"は存在しません" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "サーバーを再起動する前にテーブルスペース用のディレクトリを作成してください" -#: commands/tablespace.c:618 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" -#: commands/tablespace.c:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "ディレクトリ\"%s\"はすでにテーブルスペースとして使われています" -#: commands/tablespace.c:768 commands/tablespace.c:781 commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 commands/tablespace.c:837 commands/tablespace.c:929 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:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除できませんでした: %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\"はディレクトリでもシンボリックリンクでもありません" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "テーブル空間\"%s\"は存在しません" -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "テーブル空間%u用のディレクトリを削除することができませんでした" -#: commands/tablespace.c:1567 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "必要ならば手作業でこのディレクトリを削除することができます" -#: commands/trigger.c:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\"はテーブルです" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "テーブルは INSTEAD OF トリガーを持つことができません" -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\"はパーティション親テーブルです" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "遷移テーブルを使用するROWトリガはパーティション親テーブルではサポートされません。" -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\"はビューです" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "ビューは行レベルの BEFORE / AFTER トリガーを持つことができません" -#: commands/trigger.c:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "ビューは TRUNCATE トリガーを持つことができません" -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\"は外部テーブルです" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." -msgstr "外部テーブルは INSTEAD OF トリガーを持つことができません。" +msgstr "外部テーブルは INSTEAD OF トリガを持つことができません。" -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "外部テーブルは TRUNCATE トリガーを持つことができません。" +msgstr "外部テーブルは TRUNCATE トリガを持つことができません。" -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." -msgstr "外部テーブルは制約トリガーを持つことができません。" +msgstr "外部テーブルは制約トリガを持つことができません。" + +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "リレーション\"%s\"にはトリガーを設定できません" -#: commands/trigger.c:377 +#: commands/trigger.c:392 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" -msgstr "TRUNCATE FOR EACH ROW トリガーはサポートされていません" +msgstr "TRUNCATE FOR EACH ROW トリガはサポートされていません" -#: commands/trigger.c:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF トリガーは FOR EACH ROW でなければなりません" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF トリガーは WHEN 条件を持つことができません" -#: commands/trigger.c:393 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF トリガーは列リストを持つことができません" -#: commands/trigger.c:422 +#: commands/trigger.c:437 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "REFERENCING句でのROW変数の命名はサポートされていません" -#: commands/trigger.c:423 +#: commands/trigger.c:438 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "遷移テーブルを指定するには OLD TABLE または NEW TABLE を使ってください" -#: commands/trigger.c:436 +#: commands/trigger.c:451 #, c-format msgid "Triggers on foreign tables cannot have transition tables." -msgstr "外部テーブルに対するトリガーは遷移テーブルを持てません。" +msgstr "外部テーブルに対するトリガは遷移テーブルを持てません。" -#: commands/trigger.c:443 +#: commands/trigger.c:458 #, c-format msgid "Triggers on views cannot have transition tables." -msgstr "ビューに対するトリガーは遷移テーブルを持てません。" +msgstr "ビューに対するトリガは遷移テーブルを持てません。" -#: commands/trigger.c:463 +#: commands/trigger.c:474 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません" + +#: commands/trigger.c:478 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" -msgstr "遷移テーブルをもったROWトリガーは継承子テーブルではサポートされません" +msgstr "遷移テーブルをもったROWトリガは継承子テーブルではサポートされません" -#: commands/trigger.c:469 +#: commands/trigger.c:484 #, c-format msgid "transition table name can only be specified for an AFTER trigger" -msgstr "遷移テーブル名はAFTERトリガーでの指定可能です" +msgstr "遷移テーブル名はAFTERトリガでの指定可能です" -#: commands/trigger.c:474 +#: commands/trigger.c:489 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" -msgstr "遷移テーブルを使用するTRUNCATEトリガーはサポートされていません" +msgstr "遷移テーブルを使用するTRUNCATEトリガはサポートされていません" -#: commands/trigger.c:491 +#: commands/trigger.c:506 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" -msgstr "2つ以上のイベントに対するトリガーには遷移テーブルは指定できません" +msgstr "2つ以上のイベントに対するトリガには遷移テーブルは指定できません" -#: commands/trigger.c:502 +#: commands/trigger.c:517 #, c-format msgid "transition tables cannot be specified for triggers with column lists" -msgstr "列リストを指定したトリガーに対しては遷移テーブルは指定できません" +msgstr "列リストを指定したトリガに対しては遷移テーブルは指定できません" -#: commands/trigger.c:519 +#: commands/trigger.c:534 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" -msgstr "NEW TABLE はINSERTまたはUPDATEトリガーに対してのみ指定可能です" +msgstr "NEW TABLE はINSERTまたはUPDATEトリガに対してのみ指定可能です" -#: commands/trigger.c:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE は複数回指定できません" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" -msgstr "OLD TABLE はDELETEまたはUPDATEトリガーに対してのみ指定可能です" +msgstr "OLD TABLE はDELETEまたはUPDATEトリガに対してのみ指定可能です" -#: commands/trigger.c:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE は複数回指定できません" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "OLD TABLE の名前と NEW TABLE の名前は同じにはできません" -#: commands/trigger.c:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "ステートメントトリガーの WHEN 条件では列の値を参照できません" -#: commands/trigger.c:618 +#: commands/trigger.c:633 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT トリガーの WHEN 条件では OLD 値を参照できません" -#: commands/trigger.c:631 +#: commands/trigger.c:646 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE トリガーの WHEN 条件では NEW 値を参照できません" -#: commands/trigger.c:636 +#: commands/trigger.c:651 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "BEFORE トリガーの WHEN 条件では NEW システム列を参照できません" -#: commands/trigger.c:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "BEFORE トリガーの WHEN 条件では NEW の生成列を参照できません" -#: commands/trigger.c:645 +#: commands/trigger.c:660 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "行全体参照が使われていてかつ、このテーブルは生成カラムを含んでいます。" -#: commands/trigger.c:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" -msgstr "リレーション\"%2$s\"用のトリガー\"%1$s\"はすでに存在します" +msgstr "リレーション\"%2$s\"用のトリガ\"%1$s\"はすでに存在します" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は内部トリガーです" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は内部トリガーまたは子トリガーです" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は制約トリガーです" -#: commands/trigger.c:1354 commands/trigger.c:1515 commands/trigger.c:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" -msgstr "テーブル\"%2$s\"のトリガー\"%1$s\"は存在しません" +msgstr "テーブル\"%2$s\"のトリガ\"%1$s\"は存在しません" + +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "テーブル\"%2$s\"のトリガー\"%1$s\"の名前は変更できません" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "代わりにパーティション親テーブル\"%s\"でこのトリガーの名前を変更してください。" + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"の名前を変更しました" -#: commands/trigger.c:1600 +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" -msgstr "権限がありません: \"%s\"はシステムトリガーです" +msgstr "権限がありません: \"%s\"はシステムトリガです" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" -msgstr "トリガー関数%uはNULL値を返しました" +msgstr "トリガ関数%uはNULL値を返しました" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 commands/trigger.c:3364 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" -msgstr "BEFORE STATEMENTトリガーは値を返すことができません" +msgstr "BEFORE STATEMENTトリガは値を返すことができません" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" -msgstr "BEFORE FOR EACH ROWトリガーの実行では、他のパーティションへの行の移動はサポートされていません" +msgstr "BEFORE FOR EACH ROWトリガの実行では、他のパーティションへの行の移動はサポートされていません" -#: commands/trigger.c:2356 +#: commands/trigger.c:2586 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." -msgstr "トリガー\"%s\"の実行前には、この行はパーティション\"%s.%s\"に置かれるはずでした。" +msgstr "トリガ\"%s\"の実行前には、この行はパーティション\"%s.%s\"に置かれるはずでした。" -#: commands/trigger.c:3104 executor/nodeModifyTable.c:1956 executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3441 executor/nodeModifyTable.c:2350 executor/nodeModifyTable.c:2433 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "更新対象のタプルはすでに現在のコマンドによって発行された操作によって変更されています" -#: commands/trigger.c:3105 executor/nodeModifyTable.c:1306 executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3442 executor/nodeModifyTable.c:1514 executor/nodeModifyTable.c:1588 executor/nodeModifyTable.c:2351 executor/nodeModifyTable.c:2434 executor/nodeModifyTable.c:3079 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." -msgstr "他の行への変更を伝搬させるためにBEFOREトリガーではなくAFTERトリガーの使用を検討してください" +msgstr "他の行への変更を伝搬させるためにBEFOREトリガではなくAFTERトリガの使用を検討してください" -#: commands/trigger.c:3134 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3483 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:2368 executor/nodeModifyTable.c:2576 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:3142 executor/nodeModifyTable.c:1412 executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3491 executor/nodeModifyTable.c:1620 executor/nodeModifyTable.c:2451 executor/nodeModifyTable.c:2600 executor/nodeModifyTable.c:2967 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "削除が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:4234 +#: commands/trigger.c:4698 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" -msgstr "セキュリティー制限された処理中は、遅延トリガーは発火させられません" +msgstr "セキュリティー制限操作中は、遅延トリガーは発火させられません" -#: commands/trigger.c:5284 +#: commands/trigger.c:5881 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "制約\"%s\"は遅延可能ではありません" -#: commands/trigger.c:5307 +#: commands/trigger.c:5904 #, c-format msgid "constraint \"%s\" does not exist" msgstr "制約\"%s\"は存在しません" @@ -10601,579 +11339,579 @@ msgstr "基本型を作成するにはスーパーユーザーである必要が 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: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 "型の属性\"%s\"は不明です" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "型カテゴリ\"%s\"が不正です。単純なASCIIでなければなりません" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "%sを配列要素の型にすることはできません" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"は不明です" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "格納方式\"%s\"は不明です" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "型の入力関数の指定が必要です" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "型の出力関数の指定が必要です" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "型修正入力関数がない場合の型修正出力関数は意味がありません" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "添字処理関数なしで要素型を指定することはできません" -#: commands/typecmds.c:784 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\"はドメインの基本型として無効です" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "デフォルト式が複数あります" -#: 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 "NULL制約とNOT NULL制約が競合しています" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ドメインに対する検査制約はNO INHERITとマークすることができません" -#: 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 "ドメインでは一意性制約は使用できません" -#: 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 "ドメインではプライマリキー制約はできません" -#: 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 "ドメインでは排除制約は使用できません" -#: 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 "ドメイン用の外部キー制約はできません" -#: 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 "ドメインでは制約遅延の指定はサポートしていません" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s は数値ではありません" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "型の属性\"subtype\"が必要です" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "範囲の派生元型を%sにすることはできません" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲の照合順序が指定されましたが、派生もと型が照合順序をサポートしていません" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事前にシェル型を生成せずに正規化関数を指定することはできません" -#: 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 "最初に型をシェル型として生成して、続いて正規化関数を生成した後に完全な CREATE TYPE を実行してください。" -#: commands/typecmds.c:1981 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "型の入力関数%sが複数合致します" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:1984 #, c-format msgid "type input function %s must return type %s" msgstr "型の入力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2015 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s should not be volatile" msgstr "型の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2043 +#: commands/typecmds.c:2028 #, c-format msgid "type output function %s must return type %s" msgstr "型の出力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2050 +#: commands/typecmds.c:2035 #, c-format msgid "type output function %s should not be volatile" msgstr "型の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2079 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "型の受信関数 %s が複数合致しました" -#: commands/typecmds.c:2097 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" msgstr "型の受信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2104 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" msgstr "型の受信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2132 +#: commands/typecmds.c:2117 #, c-format msgid "type send function %s must return type %s" msgstr "型の送信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2139 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "型の送信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2166 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2173 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正子の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2200 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2207 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正子の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2234 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "型のANALYZE関数%sは%s型を返す必要があります" -#: commands/typecmds.c:2263 +#: commands/typecmds.c:2248 #, c-format msgid "type subscripting function %s must return type %s" -msgstr "型の添字処理関数%sは型%sを返却する必要があります" +msgstr "型の添字処理関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" -msgstr "ユーザー定義型には添字処理関数%sを使用できません" +msgstr "ユーザー定義型は添字処理関数%sを使用できません" -#: commands/typecmds.c:2319 +#: 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:2350 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "範囲の正規化関数 %s は範囲型を返す必要があります" -#: commands/typecmds.c:2356 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "範囲の正規化関数 %s は不変関数でなければなりません" -#: commands/typecmds.c:2392 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "範囲の派生元の型の差分関数 %s は %s型を返す必要があります" -#: commands/typecmds.c:2399 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "範囲の派生元の型の差分関数 %s は不変関数である必要があります" -#: commands/typecmds.c:2426 +#: 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:2459 +#: commands/typecmds.c:2444 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" -msgstr "バイナリアップグレードモード中にpg_typeの複範囲型OIDが設定されていません" +msgstr "バイナリアップグレードモード中にpg_typeの複範囲型OIDの値が設定されていません" -#: commands/typecmds.c:2492 +#: commands/typecmds.c:2477 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" -msgstr "バイナリアップグレードモード中にpg_typeの複範囲配列型OIDが設定されていません" +msgstr "バイナリアップグレードモード中にpg_typeの複範囲配列型OIDの値が設定されていません" -#: commands/typecmds.c:2791 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "テーブル\"%2$s\"の列\"%1$s\"にNULL値があります" -#: 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 "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/typecmds.c:3113 +#: 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:3219 +#: 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: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 はドメインではありません" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ドメインの検査制約ではテーブル参照を使用できません" -#: 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はテーブルの行型です" -#: 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 "代わりに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 "配列型%sを変更できません" -#: 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 "型%sを変更することができます。これは同時にその配列型も変更します。" -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "型\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "型の格納方式をPLAINには変更できません" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "型の属性\"%s\"は変更できません" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "型の変更を行うにはスーパーユーザーである必要があります" -#: 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\"は基本型ではありません" -#: 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:270 #, c-format msgid "must be superuser to create bypassrls users" -msgstr "bypassrlsユーザーを生成するにはスーパーユーザーである必要があります" +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:1226 commands/user.c:1233 gram.y:15260 gram.y:15305 utils/adt/acl.c:5248 utils/adt/acl.c:5254 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 gram.y:16483 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: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 "\"pg_\"で始まるロール名は予約されています。" -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "ロール\"%s\"はすでに存在します" -#: 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 "空の文字列はパスワードとして使えません、パスワードを消去します" -#: 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:570 commands/user.c:925 +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "予約ロールは変更できません。" -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" -msgstr "スーパーユーザーロールの更新やスーパーユーザー属性の変更を行うにはスーパーユーザーである必要があります" +msgstr "スーパーユーザーの変更やsuperuser属性の変更のためにはスーパーユーザーである必要があります" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "must be superuser to alter replication roles or change replication attribute" -msgstr "レプリケーションロールの更新やレプリケーション属性の変更を行うにはスーパーユーザーである必要があります" +msgstr "レプリケーションユーザーの変更やreplication属性の変更のためにはスーパーユーザーである必要があります" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "bypassrls属性を変更するにはスーパーユーザーである必要があります" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "権限がありません" -#: 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 "スーパーユーザーを更新するにはスーパーユーザーである必要があります" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "サーバー全体の設定を変更するにはスーパーユーザーである必要があります" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "ロールを削除する権限がありません" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE で特殊ロールの識別子は使えません" -#: 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:710 +#: 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:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "ロール\"%s\"は存在しません、スキップします" -#: 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 "現在のユーザーを削除できません" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "セッションのユーザーを削除できません" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "スーパーユーザーを削除するにはスーパーユーザーである必要があります" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "他のオブジェクトが依存していますのでロール\"%s\"を削除できません" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "セッションユーザーの名前を変更できません" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "現在のユーザーの名前を変更できません" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "スーパーユーザーの名前を変更するにはスーパーユーザーである必要があります" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "ロールの名前を変更する権限がありません" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "ロール名が変更されたためMD5パスワードがクリアされました" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "列名が GRANT/REVOKE ROLE に含まれていてはなりません" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "オブジェクトを削除する権限がありません" -#: 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 "オブジェクトを再割当てする権限がありません" -#: 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 "ロール\"%s\"の管理者オプションが必要です" -#: commands/user.c:1509 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" -msgstr "ロール\"%s\"は明示的なメンバを持てません" +msgstr "ロール\"%s\"は明示的なメンバーを持てません" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "権限付与者を指定するにはスーパーユーザーである必要があります" -#: commands/user.c:1560 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" -msgstr "ロール\"%s\"は他のロールのメンバにはなれません" +msgstr "ロール\"%s\"はどのロールのメンバーにもなれません" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "ロール\"%s\"はロール\"%s\"のメンバです" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "ロール\"%s\"はすでにロール\"%s\"のメンバです" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "ロール\"%s\"はロール\"%s\"のメンバではありません" -#: commands/vacuum.c:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "ANALYZEオプション\"%s\"が認識できません" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "パラレルオプションには0から%dまでの値である必要があります" -#: commands/vacuum.c:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" -msgstr "VACUUMの並列ワーカー数は0から%dまでの値でなければなりません" +msgstr "VACUUMの並列ワーカーの数はは0から%dまでの値でなければなりません" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "認識できないVACUUMオプション \"%s\"" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULLは並列実行できません" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "ANALYZE オプションは列リストが与えられているときのみ指定できます" -#: commands/vacuum.c:329 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%sはVACUUMやANALYZEからは実行できません" -#: commands/vacuum.c:339 +#: commands/vacuum.c:346 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM のオプションDISABLE_PAGE_SKIPPINGはFULLと同時には指定できません" -#: commands/vacuum.c:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" -msgstr "VACUUM FULLの際はPROCESS_TOASTの指定が必須です" +msgstr "VACUUM FULLではPROCESS_TOASTの指定が必須です" #: commands/vacuum.c:587 #, c-format @@ -11225,12 +11963,12 @@ msgstr "\"%s\"のANALYZEをスキップしています --- ロック獲得でき msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\"のANALYZEをスキップします --- リレーションはすでに存在しません" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "最も古いxminが古すぎます" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -11239,32 +11977,65 @@ msgstr "" "周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除が必要な場合もあります。" -#: commands/vacuum.c:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "最古のマルチトランザクションが古すぎます" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "周回問題を回避するために、マルチトランザクションを使用している実行中のトランザクションをすぐにクローズしてください。" -#: commands/vacuum.c:1755 +#: commands/vacuum.c:1807 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "データベースの一部は20億トランザクション以上の間にVACUUMを実行されていませんでした" -#: commands/vacuum.c:1756 +#: commands/vacuum.c:1808 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "トランザクションの周回によるデータ損失が発生している可能性があります" -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1976 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルではないものや、特別なシステムテーブルに対してはVACUUMを実行できません" -#: commands/variable.c:165 utils/misc/guc.c:11649 utils/misc/guc.c:11711 +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "%2$d行バージョンを削除するためインデックス\"%1$s\"をスキャンしました" + +#: commands/vacuum.c:2373 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" + +#: commands/vacuum.c:2377 +#, 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:664 +#, 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:670 +#, 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:12115 utils/misc/guc.c:12193 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "不明なキーワードです: \"%s\"" @@ -11324,7 +12095,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:1693 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ホットスタンバイ中はシリアライズモードを使用できません" @@ -11362,7 +12133,7 @@ msgstr "並列処理中は\"client_encoding\"を変更できません" #: commands/variable.c:890 #, c-format msgid "permission will be denied to set role \"%s\"" -msgstr "ロール\"%s\"を設定する権限は拒否されます" +msgstr "ロール\"%s\"を設定する権限がありません" #: commands/variable.c:895 #, c-format @@ -11389,32 +12160,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:304 +#: commands/view.c:309 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "ビューの列 \"%s\"のデータ型を %s から %s に変更できません" -#: commands/view.c:452 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "ビューの列\"%s\"の照合順序を\"%s\"から\"%s\"に変更できません" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "ビューでは SELECT INTO を使用できません" -#: commands/view.c:464 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" -msgstr "ビューではWITH句にデータを変更する文を含むことはできません" +msgstr "ビューでは WITH 句にデータを変更するステートメントを含むことはできません" -#: commands/view.c:534 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW で列よりも多くの列名が指定されています" -#: commands/view.c:542 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "ビューは自身の格納領域を持たないので、UNLOGGEDにはできません" -#: commands/view.c:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "ビュー\"%s\"は一時ビューとなります" @@ -11449,341 +12225,355 @@ msgstr "カーソル\"%s\"は行上に位置していません" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"はテーブル\"%s\"を単純な更新可能スキャンではありません" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2452 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 #, 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:2464 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2466 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 executor/execExprInterp.c:4033 executor/execExprInterp.c:4050 executor/execExprInterp.c:4149 executor/nodeModifyTable.c:119 executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 executor/nodeModifyTable.c:155 +#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" -#: executor/execExpr.c:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "問い合わせの列が多すぎます" -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:650 executor/execExprInterp.c:4051 executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 executor/nodeModifyTable.c:209 #, 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:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:837 #, c-format msgid "window function calls cannot be nested" msgstr "ウィンドウ関数の呼び出しを入れ子にすることはできません" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "対象型は配列ではありません" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()列の型が%2$sではなく%1$sです" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1031 +#: executor/execExpr.c:2482 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:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "このコンテキストで集合値の関数は集合を受け付けられません" + +#: executor/execExpr.c:2915 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には添え字をつけられません" +msgstr "添字をサポートしないため、型%sには添字をつけられません" -#: executor/execExpr.c:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" -msgstr "型%sは添字指定の代入をサポートしていません" +msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3058 executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 executor/execExprInterp.c:3106 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルの型は%sですが、問い合わせでは%sを想定しています。" -#: executor/execExprInterp.c:2004 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:492 +#: executor/execExprInterp.c:2006 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:570 #, c-format msgid "type %s is not composite" msgstr "型%sは複合型ではありません" -#: executor/execExprInterp.c:2542 +#: executor/execExprInterp.c:2544 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2757 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2758 #, 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:2777 utils/adt/arrayfuncs.c:263 utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:564 utils/adt/arrayfuncs.c:1306 utils/adt/arrayfuncs.c:3422 utils/adt/arrayfuncs.c:5419 utils/adt/arrayfuncs.c:5936 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)を超えています" +msgstr "配列の次数(%d)が上限(%d)を超えています" -#: executor/execExprInterp.c:2797 executor/execExprInterp.c:2832 +#: executor/execExprInterp.c:2799 executor/execExprInterp.c:2834 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" -msgstr "多次元配列は次元が合致する配列式でなければなりません" +msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:2809 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:937 utils/adt/arrayfuncs.c:1545 utils/adt/arrayfuncs.c:2353 utils/adt/arrayfuncs.c:2368 utils/adt/arrayfuncs.c:2630 utils/adt/arrayfuncs.c:2646 utils/adt/arrayfuncs.c:2954 utils/adt/arrayfuncs.c:2969 utils/adt/arrayfuncs.c:3310 utils/adt/arrayfuncs.c:3452 utils/adt/arrayfuncs.c:6028 utils/adt/arrayfuncs.c:6369 utils/adt/arrayutils.c:88 utils/adt/arrayutils.c:97 +#: utils/adt/arrayutils.c:104 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "配列の次数が上限(%d)を超えています" -#: executor/execExprInterp.c:3057 executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:3662 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3691 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sはnull値を許しません" -#: executor/execExprInterp.c:3677 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3706 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sの値が検査制約\"%s\"に違反しています" -#: executor/execExprInterp.c:4034 +#: executor/execExprInterp.c:4063 #, 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:4150 executor/execSRF.c:977 +#: executor/execExprInterp.c:4179 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." -msgstr "序数位置%dの削除された属性における物理格納形式が合致しません。" +msgstr "序数位置%dの削除された属性における物理格納形式が一致しません。" -#: executor/execIndexing.c:567 +#: 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:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "排除制約\"%s\"を作成できませんでした" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "キー %s がキー %s と競合しています" -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "キーの競合が存在します" -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "重複キーの値が排除制約\"%s\"に違反しています" -#: executor/execIndexing.c:852 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "キー %s が既存のキー %s と競合しています" -#: executor/execIndexing.c:854 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "キーが既存のキーと衝突しています" -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "シーケンス\"%s\"を変更できません" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOASTリレーション\"%s\"を変更できません" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3096 rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 rewrite/rewriteHandler.c:3974 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3099 rewrite/rewriteHandler.c:3930 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 rewrite/rewriteHandler.c:3977 #, 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ルールを作成してください。" +msgstr "ビューへの挿入を可能にするために、INSTEAD OF INSERTトリガまたは無条件のON INSERT DO INSTEADルールを作成してください。" -#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3104 rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3107 rewrite/rewriteHandler.c:3938 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 rewrite/rewriteHandler.c:3985 #, 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ルールを作成してください。" +msgstr "ビューへの更新を可能にするために、INSTEAD OF UPDATEトリガまたは無条件のON UPDATE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3112 rewrite/rewriteHandler.c:3943 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 rewrite/rewriteHandler.c:3990 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3115 rewrite/rewriteHandler.c:3946 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 rewrite/rewriteHandler.c:3993 #, 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ルールを作成してください。" +msgstr "ビューからの削除を可能にするために、INSTEAD OF DELETEトリガまたは無条件のON DELETE DO INSTEADルールを作成してください。" -#: executor/execMain.c:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "実体化ビュー\"%s\"を変更できません" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "外部テーブル\"%s\"への挿入ができません" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "外部テーブル\"%s\"は挿入を許しません" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "外部テーブル \"%s\"の更新ができません" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "外部テーブル\"%s\"は更新を許しません" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "外部テーブル\"%s\"からの削除ができません" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "外部テーブル\"%s\"は削除を許しません" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "リレーション\"%s\"を変更できません" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "シーケンス\"%s\"では行のロックはできません" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "TOAST リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "実体化ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1173 executor/execMain.c:2587 executor/nodeLockRows.c:136 +#: executor/execMain.c:1175 executor/execMain.c:2685 executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "外部テーブル\"%s\"では行のロックはできません" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "リレーション\"%s\"の新しい行はパーティション制約に違反しています" -#: 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 "失敗した行は%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 "リレーション\"%2$s\"の列\"%1$s\"のNULL値が非NULL制約に違反しています" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "リレーション\"%s\"の新しい行は検査制約\"%s\"に違反しています" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "新しい行はビュー\"%s\"のチェックオプションに違反しています" -#: executor/execMain.c:2055 +#: 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:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシに違反しています" -#: executor/execMain.c:2067 +#: 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:2072 +#: 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:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "行に対応するパーティションがリレーション\"%s\"に見つかりません" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "失敗した行のパーティションキーは%sを含みます。" @@ -11803,46 +12593,56 @@ msgstr "同時更新がありました、リトライします" msgid "concurrent delete, retrying" msgstr "並行する削除がありました、リトライします" -#: executor/execReplication.c:276 parser/parse_cte.c:301 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:276 parser/parse_cte.c:308 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3702 utils/adt/arrayfuncs.c:4257 utils/adt/arrayfuncs.c:6249 utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" -msgstr "型%sの等価性演算子を識別できませんでした" +msgstr "型%sの等価演算子を識別できませんでした" + +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "テーブル\"%s\"の更新ができません" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "このパブリケーションのWHERE式で使用されている列は識別列の一部ではありません。" + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "このパブリケーションで使用されてる列リストは識別列を包含していません。" + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "テーブル\"%s\"からの削除ができません" -#: executor/execReplication.c:604 +#: executor/execReplication.c:644 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "テーブル\"%s\"は複製識別を持たずかつ更新を発行しているため、更新できません" -#: executor/execReplication.c:606 +#: executor/execReplication.c:646 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "テーブルの更新を可能にするには ALTER TABLE で REPLICA IDENTITY を設定してください。" -#: executor/execReplication.c:610 +#: executor/execReplication.c:650 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "テーブル\"%s\"は複製識別がなくかつ削除を発行しているため、このテーブルでは行の削除ができません" -#: executor/execReplication.c:612 +#: executor/execReplication.c:652 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "このテーブルでの行削除を可能にするには ALTER TABLE で REPLICA IDENTITY を設定してください。" -#: executor/execReplication.c:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "リレーション\"%s.%s\"は論理レプリケーション先としては使用できません" -#: executor/execReplication.c:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "\"%s.%s\"は外部テーブルです。" - -#: executor/execReplication.c:641 -#, 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" @@ -11851,7 +12651,7 @@ msgstr "関数から戻された行はすべてが同じ行型ではありませ #: executor/execSRF.c:365 #, c-format msgid "table-function protocol for value-per-call mode was not followed" -msgstr "逐次返却モードのテーブル関数プロトコルに従っていません" +msgstr "逐次返却(value-per-call)モードのテーブル関数プロトコルに従っていません" #: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format @@ -11871,14 +12671,13 @@ msgstr "レコード集合を返す関数が、レコード型が受け付けら #: 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 "問い合わせが指定した戻り値の行と実際の関数の戻り値の行が合致しません" +msgstr "問い合わせが指定した戻り値の行と実際の関数の戻り値の行が一致しません" #: 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:967 #, c-format @@ -11888,7 +12687,7 @@ msgstr "序数位置%2$dの型%1$sが返されました。問い合わせでは% #: 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 "現在の状況ではシステムカラムは取得できません" +msgstr "この文脈ではシステム列は取り出せません" #: executor/execUtils.c:742 #, c-format @@ -11908,16 +12707,16 @@ msgstr "%sと宣言された引数の型を特定できませんでした" #: executor/functions.c:514 #, c-format msgid "cannot COPY to/from client in an SQL function" -msgstr "SQL関数の中ではクライアントとの間のCOPYはできません" +msgstr "SQL関数の中ではCOPY文によるクライアントとの間の入出力はできません" #. translator: %s is a SQL statement name #: executor/functions.c:520 #, c-format msgid "%s is not allowed in an SQL function" -msgstr "SQL関数では%sは許可されません" +msgstr "SQL関数では%sは使用不可です" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "volatile関数以外では%sは許可されません" @@ -11977,21 +12776,16 @@ msgstr "最後のステートメントが返す列が少なすぎます。" msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "テープ%dに対する予期しないEOF: %zuバイト要求しましたが、%zuバイト読み込みました" +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" -#: executor/nodeAgg.c:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3952 parser/parse_agg.c:679 parser/parse_agg.c:707 #, c-format msgid "aggregate function calls cannot be nested" msgstr "集約関数の呼び出しを入れ子にすることはできません" -#: executor/nodeAgg.c:4187 executor/nodeWindowAgg.c:2845 -#, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" - #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12032,42 +12826,73 @@ msgstr "RIGHT JOINはマージ結合可能な結合条件でのみサポート msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINはマージ結合可能な結合条件でのみサポートされています" -#: executor/nodeModifyTable.c:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "問い合わせの列が少なすぎます。" -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1513 executor/nodeModifyTable.c:1587 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "削除対象のタプルはすでに現在のコマンドによって引き起こされた操作によって変更されています" -#: executor/nodeModifyTable.c:1583 +#: executor/nodeModifyTable.c:1742 #, c-format msgid "invalid ON UPDATE specification" msgstr "不正な ON UPDATE 指定です" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1743 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "結果タプルをもとのパーティションではなく異なるパーティションに追加しようとしました。" -#: executor/nodeModifyTable.c:2183 +#: executor/nodeModifyTable.c:2204 +#, 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:2205 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "外部キーがパーティションルートテーブル\"%2$s\"ではなくパーティション親テーブル\"%1$s\"を指しています。" + +#: executor/nodeModifyTable.c:2208 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "テーブル\"%s\"上に外部キー制約を定義することを検討してください。" + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2554 executor/nodeModifyTable.c:2956 #, 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:2184 +#: executor/nodeModifyTable.c:2556 #, 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:2958 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" + +#: executor/nodeModifyTable.c:3039 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "削除対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" + +#: executor/nodeModifyTable.c:3078 +#, 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は指定できません" @@ -12107,104 +12932,104 @@ msgstr "列\"%s\"でnullは許可されません" msgid "moving-aggregate transition function must not return null" msgstr "移動集約の推移関数はnullを返却してはなりません" -#: executor/nodeWindowAgg.c:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "フレームの開始オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "フレームの開始オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "フレームの終了オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" -#: executor/spi.c:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "不正なトランザクション終了" -#: executor/spi.c:256 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "サブトランザクションの実行中はコミットできません" -#: executor/spi.c:347 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "サブトランザクションの実行中はロールバックできません" -#: executor/spi.c:482 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "トランザクションは空でないSPIスタックを残しました" -#: executor/spi.c:483 executor/spi.c:543 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "\"SPI_finish\"呼出の抜けを確認ください" -#: executor/spi.c:542 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "サブトランザクションが空でないSPIスタックを残しました" -#: executor/spi.c:1610 +#: 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:1620 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "カーソルで%s問い合わせを開くことができません" -#: executor/spi.c:1726 +#: 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:1727 parser/analyze.c:2853 +#: executor/spi.c:1717 parser/analyze.c:2899 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "スクロール可能カーソルは読み取り専用である必要があります。" -#: executor/spi.c:2482 +#: executor/spi.c:2474 #, c-format msgid "empty query does not return tuples" msgstr "空の問い合わせは結果を返却しません" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "%s問い合わせがタプルを返しません" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" -msgstr "SQL式 \"%s\"" +msgstr "SQL関数\"%s\"" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" -msgstr "PL/pgSQL代入 \"%s\"" +msgstr "PL/pgSQL代入\"%s\"" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL文 \"%s\"" @@ -12214,388 +13039,428 @@ 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:1108 +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "このコンテクストで有効なオプションはありません。" + +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD は今後サポートされません" -#: gram.y:1109 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "UNENCRYPTED を削除してください。そうすれば替わりにパスワードを暗号化形式で格納します。" -#: gram.y:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "ロールオプション\"%s\"が認識できません" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTSにはスキーマ要素を含めることはできません" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "現在のデータベースを変更できません" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "タイムゾーンの間隔はHOURまたはHOUR TO MINUTEでなければなりません" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "列番号は1から%dまでの範囲でなければなりません" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "シーケンスのオプション\"%s\"はここではサポートされていません" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "ハッシュパーティションで法(除数)が2回以上指定されています" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "ハッシュパーティションで剰余が2回以上指定されています" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "ハッシュパーティションの境界条件\"%s\"が認識できません" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "ハッシュパーティションでは法(除数)の指定が必要です" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "ハッシュパーティションでは剰余の指定が必要です" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUTはPROGRAMと同時に使用できません" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "COPY TO で WHERE 句は使用できません" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "一時テーブル作成におけるGLOBALは廃止予定です" -#: gram.y:3666 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "生成カラムに対しては GENERATED ALWAYS の指定が必須です" -#: gram.y:3934 utils/adt/ri_triggers.c:2032 +#: gram.y:4172 utils/adt/ri_triggers.c:2098 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MMATCH PARTIAL はまだ実装されていません" -#: gram.y:4635 +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "%sが指定された列リストはON DELETEのアクションに対してのみサポートされます" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM はすでにサポートされていません" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "認識できない行セキュリティオプション \"%s\"" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "現時点ではPERMISSIVEもしくはRESTRICTIVEポリシのみがサポートされています" -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" -msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER はサポートされていません" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGERはサポートされません" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "重複したトリガーイベントが指定されました" -#: gram.y:5559 parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 +#: gram.y:5937 parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERREDと宣言された制約はDEFERRABLEでなければなりません" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "制約属性の競合" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTIONはまだ実装されていません" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK はもはや必要とされません" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "データ型を更新してください" -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "集約は出力の引数を持つことができません" -#: gram.y:8189 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 #, c-format msgid "missing argument" msgstr "引数が足りません" -#: gram.y:8190 utils/adt/regproc.c:711 utils/adt/regproc.c:752 +#: gram.y:8772 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:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTIONは再帰ビューではサポートされていません" -#: gram.y:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,#構文は実装されていません" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "分割してLIMITとOFFSET句を使用してください" -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "FROM句のVALUESには別名が必要です" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "例えば、FROM (VALUES ...) [AS] foo。" -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM句の副問い合わせには別名が必要です" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "例えば、FROM (SELECT ...) [AS] foo。" -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "DEFAULT値は一つだけ指定可能です" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "列一つにつきPATH値は一つだけ指定可能です" -#: gram.y:12687 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "列\"%s\"でNULL / NOT NULL宣言が衝突しているか重複しています" -#: gram.y:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "認識できない列オプション \"%s\"" -#: gram.y:12950 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "浮動小数点数の型の精度は最低でも1ビット必要です" -#: gram.y:12959 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "浮動小数点型の精度は54ビットより低くなければなりません" -#: gram.y:13457 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS式の左辺のパラメータ数が間違っています" -#: gram.y:13462 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS式の右辺のパラメータ数が間違っています" -#: gram.y:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 述部はまだ実装されていません" -#: gram.y:13989 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "複数のORDER BY句はWITHIN GROUPと一緒には使用できません" -#: gram.y:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT は WITHIN GROUP と同時には使えません" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC は WITHIN GROUP と同時には使えません" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "フレームの開始は UNBOUNDED FOLLOWING であってはなりません" -#: gram.y:14528 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "次の行から始まるフレームは、現在行では終了できません" -#: gram.y:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "フレームの終了は UNBOUNDED PRECEDING であってはなりません" -#: gram.y:14557 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "現在行から始まるフレームは、先行する行を含むことができません" -#: gram.y:14564 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "次の行から始まるフレームは、先行する行を含むことができません" -#: gram.y:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "型修正子はパラメータ名を持つことはできません" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "型修正子はORDER BYを持つことはできません" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%sはここではロール名として使用できません" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" -msgstr "WITH TIESはORDER BY句なしで指定はできません" +msgstr "WITH TIESはORDER BY句なしでは指定できません" -#: gram.y:16478 gram.y:16667 +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:16630 gram.y:16647 tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 +#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 #, c-format msgid "syntax error" msgstr "構文エラー" -#: gram.y:16731 +#: gram.y:17913 #, 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:16768 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "複数のORDER BY句は使用できません" -#: gram.y:16779 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "複数のOFFSET句は使用できません" -#: gram.y:16788 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "複数のLIMIT句は使用できません" -#: gram.y:16797 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "複数のLIMITオプションは使用できません" -#: gram.y:16824 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "複数の WITH 句は使用できません" -#: gram.y:17018 +#: gram.y:18199 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "テーブル関数では OUT と INOUT 引数は使用できません" -#: gram.y:17114 +#: gram.y:18332 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "複数の COLLATE 句は使用できません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17152 gram.y:17165 +#: gram.y:18370 gram.y:18383 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s制約は遅延可能にはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17178 +#: gram.y:18396 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s制約をNOT VALIDとマークすることはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17191 +#: gram.y:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s制約をNO INHERITをマークすることはできません" +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "不正なパブリケーションオブジェクトリスト" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "テーブル名やスキーマ名を単独記述の前にTABLEまたはTABLES IN SCHEMAのいずれかを指定する必要があります。" + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "不正なテーブル名" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "WHERE句はスキーマに対しては使用できません" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "列指定はスキーマに対しては使用できません" + +#: gram.y:18492 +#, c-format +msgid "invalid schema name" +msgstr "不正なスキーマ名" + #: guc-file.l:315 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "ファイル\"%2$s\"、行%3$dに認識できない設定パラメータ \"%1$s\"" +msgstr "ファイル\"%2$s\"行%3$dで認識できない設定パラメータ\"%1$s\"" -#: guc-file.l:354 utils/misc/guc.c:7374 utils/misc/guc.c:7572 utils/misc/guc.c:7666 utils/misc/guc.c:7760 utils/misc/guc.c:7880 utils/misc/guc.c:7979 +#: guc-file.l:354 utils/misc/guc.c:7691 utils/misc/guc.c:7915 utils/misc/guc.c:8013 utils/misc/guc.c:8111 utils/misc/guc.c:8235 utils/misc/guc.c:8338 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "パラメータ\"%s\"を変更するにはサーバーの再起動が必要です" @@ -12605,822 +13470,821 @@ msgstr "パラメータ\"%s\"を変更するにはサーバーの再起動が必 msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "パラメーター\"%s\"が設定ファイルから削除されました。デフォルト値に戻ります。" -#: guc-file.l:456 +#: guc-file.l:455 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "パラメータ\"%s\"は\"%s\"に変更されました" -#: guc-file.l:498 +#: guc-file.l:501 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "設定ファイル\"%s\"にはエラーがあります" -#: guc-file.l:503 +#: guc-file.l:506 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。影響がない変更は適用されました" -#: guc-file.l:508 +#: guc-file.l:511 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。変更は適用されませんでした" -#: guc-file.l:580 +#: guc-file.l:583 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "空の設定ファイル名: \"%s\"" -#: guc-file.l:597 +#: guc-file.l:600 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "設定ファイル\"%s\"をオープンできませんでした: 入れ子長が上限を超えています" -#: guc-file.l:617 +#: guc-file.l:620 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "設定ファイル\"%s\"が再帰しています" -#: guc-file.l:633 libpq/hba.c:2255 libpq/hba.c:2669 +#: guc-file.l:636 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:644 +#: guc-file.l:647 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "存在しない設定ファイル\"%s\"をスキップします" -#: guc-file.l:898 +#: guc-file.l:901 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ファイル\"%s\"の行%uの行末近辺で構文エラーがありました" -#: guc-file.l:908 +#: guc-file.l:911 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ファイル\"%s\"の行%uのトークン\"%s\"近辺で構文エラーがありました" -#: guc-file.l:928 +#: guc-file.l:931 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多くの構文エラーがありました。ファイル\"%s\"を断念します" -#: guc-file.l:983 +#: guc-file.l:986 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "空の設定ディレクトリ名: \"%s\"" -#: guc-file.l:1002 +#: guc-file.l:1005 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "設定ディレクトリ\"%s\"をオープンできませんでした: %m" -#: 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:629 utils/adt/varlena.c:336 utils/adt/varlena.c:377 +#: jsonpath_gram.y:529 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:629 utils/adt/varlena.c:335 utils/adt/varlena.c:376 #, c-format msgid "invalid input syntax for type %s" msgstr "%s型に対する不正な入力構文" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:530 #, c-format -msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" -msgstr "LIKE_REGEX 述語の中に認識できないフラグ文字\"%.*s\"があります" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "LIKE_REGEX 述語の中に認識できないフラグ文字\"%.*s\"があります。" -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format 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:623 +#: jsonpath_scan.l:495 utils/adt/jsonfuncs.c:623 #, c-format msgid "unsupported Unicode escape sequence" msgstr "サポートされないUnicodeエスケープシーケンス" -#: lib/dshash.c:246 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 utils/mmgr/dsa.c:806 +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 utils/mmgr/dsa.c:806 #, c-format msgid "Failed on DSA request of size %zu." msgstr "サイズ%zuの動的共有エリアの要求に失敗しました。" -#: libpq/auth-scram.c:249 +#: 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: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 "ユーザー\"%s\"に対する不正なSCRAMシークレット" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "ユーザー\"%s\"は有効なSCRAMシークレットを持ちません。" -#: 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 "不正なフォーマットのSCRAMメッセージです" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "メッセージが空です。" -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "メッセージの長さが入力の長さと一致しません" -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "不正なSCRAM応答" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Nonce が合致しません" -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "乱数ソルトを生成できませんでした" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "属性\"%c\"を想定していましたが、\"%s\"でした。" -#: 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 "属性\"%c\"としては文字\"=\"を想定していました。" -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "属性を想定しましたが、文字列が終了しました。" -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "属性を想定しましたが、不正な文字\"%s\"でした。" -#: 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 "クライアントは SCRAM-SHA-256-PLUS を選択しましたが、SCRAM メッセージにはチャネルバインディング情報が含まれていません。" -#: 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 "カンマを想定していましたが、文字\"%s\"が見つかりました" -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "SCRAM チャネルバインディングのネゴシエーションエラー" -#: 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 "クライアントは SCRAM チャネルバインディングをサポートしていますが、サーバーではサポートされていないと思っています。しかし実際にはサポートしています。" -#: 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 "クライアントはチャネルバインディングなしの SCRAM-SHA-256 を選択しましたが、SCRAM メッセージにはチャネルバインディング情報が含まれています。" -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "SCRAM チャネルバインディングタイプ \"%s\"はサポートされていません" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "予期しないチャネル割り当てフラグ \"%s\"" -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "クライアントは認証識別子を使っていますがサポートされていません" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "client-fist-message での想定外の属性\"%s\"" -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "クライアントはサポート外のSCRAM拡張を要求しています" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM nonce の中に表示不能な文字があります" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "乱数nonceを生成できませんでした" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "乱数nonceをエンコードできませんでした" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM チャネルバインディングの確認で失敗しました" -#: libpq/auth-scram.c:1322 +#: 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:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "client-final-message 中の proof の形式が不正です" -#: libpq/auth-scram.c:1349 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "client-final-message の終端に不要なデータがあります。" -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "ユーザー\"%s\"の認証に失敗しました: ホストを拒絶しました" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の\"trust\"認証に失敗しました" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のIdent認証に失敗しました" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"で対向(peer)認証に失敗しました" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のパスワード認証に失敗しました" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のGSSAPI認証に失敗しました" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のSSPI認証に失敗しました" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のPAM認証に失敗しました" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のBSD認証に失敗しました" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のLDAP認証に失敗しました" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の証明書認証に失敗しました" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の RADIUS 認証に失敗しました" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "ユーザー\"%s\"の認証に失敗しました: 認証方式が不正です" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "接続はpg_hba.confの行%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:372 +#: libpq/auth.c:363 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "以前の識別子: \"%s\"; 新しい識別子: \"%s\"" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" -msgstr "接続を認証しました: 識別名=\"%s\" 方式=%s (%s:%d)" +msgstr "接続認証完了: 識別名=\"%s\" 方式=%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 "クライアント証明書はルート証明書ストアが利用できる場合にのみ検証されます" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "この接続には有効なクライアント証明が必要です" -#: libpq/auth.c:462 libpq/auth.c:508 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "GSS暗号化" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "SSL暗号化" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "暗号化なし" #. 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 の設定でホスト \"%s\"、ユーザー \"%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 の設定でホスト \"%s\"、ユーザー \"%s\"、データベース \"%s\", %sの接続を拒否しました" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." -msgstr "クライアントIPアドレスは\"%s\"に解決されました、前方一致しました。" +msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しました。" -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." -msgstr "クライアントIPアドレスは\"%s\"に解決されました、前方一致は確認しません。" +msgstr "クライアントIPアドレスは\"%s\"に解決されました。前方検索は検査されません。" -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." -msgstr "クライアントIPアドレスは\"%s\"に解決されました、前方一致しませんでした。" +msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しませんでした。" -#: libpq/auth.c:527 +#: 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:532 +#: libpq/auth.c:523 #, 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:540 +#: 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用のエントリがありません" #. 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 "pg_hba.conf にホスト\"%s\"、ユーザー\"%s\"、データベース\"%s, %s用のエントリがありません" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "パスワード応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "パスワードパケットのサイズが不正です" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "クライアントから空のパスワードが返されました" -#: libpq/auth.c:887 libpq/hba.c:1366 +#: libpq/auth.c:878 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:893 +#: libpq/auth.c:884 #, c-format msgid "could not generate random MD5 salt" msgstr "ランダムなMD5ソルトの生成に失敗しました" -#: libpq/auth.c:959 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "SASL応答を想定していましたが、メッセージタイプ%dを受け取りました" - -#: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:933 libpq/be-secure-gssapi.c:535 #, c-format msgid "could not set environment: %m" -msgstr "環境変数を設定できませんでした: %m" +msgstr "環境を設定できません: %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:969 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS応答を想定しましたが、メッセージタイプ %d を受け取りました" -#: libpq/auth.c:1184 +#: libpq/auth.c:1029 msgid "accepting GSS security context failed" msgstr "GSSセキュリティコンテキストの受け付けに失敗しました" -#: libpq/auth.c:1225 +#: libpq/auth.c:1070 msgid "retrieving GSS user name failed" msgstr "GSSユーザー名の受信に失敗しました" -#: libpq/auth.c:1374 +#: libpq/auth.c:1219 msgid "could not acquire SSPI credentials" -msgstr "SSPIクレデンシャルを取得できませんでした" +msgstr "SSPIの資格ハンドルを入手できませんでした" -#: libpq/auth.c:1399 +#: libpq/auth.c:1244 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:1477 +#: libpq/auth.c:1322 msgid "could not accept SSPI security context" msgstr "SSPIセキュリティコンテキストを受け付けられませんでした" -#: libpq/auth.c:1539 +#: libpq/auth.c:1384 msgid "could not get token from SSPI security context" msgstr "SSPIセキュリティコンテキストからトークンを入手できませんでした" -#: libpq/auth.c:1678 libpq/auth.c:1697 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "名前の変換ができませんでした" -#: libpq/auth.c:1710 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "realm名が長すぎます" -#: libpq/auth.c:1725 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "変換後のアカウント名が長すぎます" -#: libpq/auth.c:1906 +#: libpq/auth.c:1751 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "Ident接続用のソケットを作成できませんでした: %m" -#: libpq/auth.c:1921 +#: libpq/auth.c:1766 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "ローカルアドレス\"%s\"にバインドできませんでした: %m" -#: libpq/auth.c:1933 +#: libpq/auth.c:1778 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバーに接続できませんでした: %m" -#: libpq/auth.c:1955 +#: libpq/auth.c:1800 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバーに問い合わせを送信できませんでした: %m" -#: libpq/auth.c:1972 +#: libpq/auth.c:1817 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"、ポート%sのIdentサーバーからの応答を受信できませんでした: %m" -#: libpq/auth.c:1982 +#: libpq/auth.c:1827 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "Identサーバーからの応答の書式が不正です: \"%s\"" -#: libpq/auth.c:2035 +#: libpq/auth.c:1880 #, c-format msgid "peer authentication is not supported on this platform" msgstr "このプラットフォームでは対向(peer)認証はサポートされていません" -#: libpq/auth.c:2039 +#: libpq/auth.c:1884 #, c-format msgid "could not get peer credentials: %m" msgstr "ピアの資格証明を入手できませんでした: %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1896 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "ローカルユーザーID %ldの参照に失敗しました: %s" -#: libpq/auth.c:2152 +#: libpq/auth.c:1997 #, c-format msgid "error from underlying PAM layer: %s" msgstr "背後のPAM層でエラーがありました: %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2008 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" -msgstr "非サポートのPAM応答: %d/\"%s\"" +msgstr "非サポートのPAM変換%d/\"%s\"" -#: libpq/auth.c:2223 +#: libpq/auth.c:2068 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM authenticatorを作成できませんでした: %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2079 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER)が失敗しました: %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST)が失敗しました: %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2123 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "\"pam_set_item(PAM_CONV)が失敗しました: %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2136 #, c-format msgid "pam_authenticate failed: %s" msgstr "\"pam_authenticateが失敗しました: %s" -#: libpq/auth.c:2304 +#: libpq/auth.c:2149 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmtが失敗しました: %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2160 #, c-format msgid "could not release PAM authenticator: %s" msgstr "PAM authenticatorを解放できませんでした: %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2240 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "LDAPを初期化できませんでした: %d" -#: libpq/auth.c:2432 +#: libpq/auth.c:2277 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "ldapbasedn からドメイン名を抽出できませんでした" -#: libpq/auth.c:2440 +#: libpq/auth.c:2285 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP認証で\"%s\"に対する DNS SRV レコードが見つかりませんでした" -#: libpq/auth.c:2442 +#: libpq/auth.c:2287 #, c-format msgid "Set an LDAP server name explicitly." msgstr "LDAPサーバー名を明示的に指定してください。" -#: libpq/auth.c:2494 +#: libpq/auth.c:2339 #, c-format msgid "could not initialize LDAP: %s" msgstr "LDAPを初期化できませんでした: %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2349 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "この LDAP ライブラリでは ldaps はサポートされていません" -#: libpq/auth.c:2512 +#: libpq/auth.c:2357 #, c-format msgid "could not initialize LDAP: %m" msgstr "LDAPを初期化できませんでした: %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2367 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "LDAPプロトコルバージョンを設定できませんでした: %s" -#: libpq/auth.c:2562 +#: libpq/auth.c:2407 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "wldap32.dllの_ldap_start_tls_sA関数を読み込みできませんでした" -#: libpq/auth.c:2563 +#: libpq/auth.c:2408 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "このプラットフォームではLDAP over SSLをサポートしていません。" -#: libpq/auth.c:2579 +#: libpq/auth.c:2424 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "LDAP TLSセッションを開始できませんでした: %s" -#: libpq/auth.c:2650 +#: libpq/auth.c:2495 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP サーバーも ldapbasedn も指定されていません" -#: libpq/auth.c:2657 +#: libpq/auth.c:2502 #, c-format msgid "LDAP server not specified" msgstr "LDAP サーバーの指定がありません" -#: libpq/auth.c:2719 +#: libpq/auth.c:2564 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "LDAP 認証でユーザー名の中に不正な文字があります" -#: libpq/auth.c:2736 +#: libpq/auth.c:2581 #, 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:2765 +#: libpq/auth.c:2610 #, 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:2779 +#: libpq/auth.c:2624 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAPサーバー\"%s\"は存在しません" -#: libpq/auth.c:2780 +#: libpq/auth.c:2625 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "サーバー\"%2$s\"で、フィルタ\"%1$s\"によるLDAP検索が何も返しませんでした。" -#: libpq/auth.c:2784 +#: libpq/auth.c:2629 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAPユーザー\"%s\"は一意ではありません" -#: libpq/auth.c:2785 +#: libpq/auth.c:2630 #, 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:2805 +#: libpq/auth.c:2650 #, 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:2826 +#: libpq/auth.c:2671 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "サーバー\"%2$s\"でユーザー\"%1$s\"の検索後、unbindできませんでした" -#: libpq/auth.c:2857 +#: libpq/auth.c:2702 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "サーバー\"%2$s\"でユーザー\"%1$s\"のLDAPログインが失敗しました: %3$s" -#: libpq/auth.c:2889 +#: libpq/auth.c:2734 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP診断: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2772 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" -msgstr "ユーザー\"%s\"の証明書認証に失敗しました: クライアント証明書にユーザー名が含まれていません" +msgstr "ユーザー \"%s\" の証明書認証に失敗しました: クライアント証明書にユーザー名が含まれていません" -#: libpq/auth.c:2948 +#: libpq/auth.c:2793 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" -msgstr "ユーザー\"%s\"の証明書認証に失敗しました: 主体者DNが取得できません" +msgstr "ユーザー\"%s\"の証明書認証に失敗しました: サブジェクト識別名(DN)が取得できません" -#: libpq/auth.c:2971 +#: libpq/auth.c:2816 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" -msgstr "ユーザー\"%s\"に対する証明書の検証(clientcert=verify-full) に失敗しました: DN不一致" +msgstr "ユーザー\"%s\"に対する証明書の検証(clientcert=verify-full) に失敗しました: DN 不一致" -#: libpq/auth.c:2976 +#: libpq/auth.c:2821 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "ユーザー\"%s\"に対する証明書の検証(clientcert=verify-full) に失敗しました: CN 不一致" -#: libpq/auth.c:3078 +#: libpq/auth.c:2923 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS サーバーが指定されていません" -#: libpq/auth.c:3085 +#: libpq/auth.c:2930 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS secret が指定されていません" -#: libpq/auth.c:3099 +#: libpq/auth.c:2944 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS認証では%d文字より長いパスワードはサポートしていません" -#: libpq/auth.c:3206 libpq/hba.c:2008 +#: libpq/auth.c:3051 libpq/hba.c:1976 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "RADIUS サーバー名\"%s\"をアドレスに変換できませんでした: %s" -#: libpq/auth.c:3220 +#: libpq/auth.c:3065 #, c-format msgid "could not generate random encryption vector" msgstr "ランダムな暗号化ベクトルを生成できませんでした" -#: libpq/auth.c:3254 +#: libpq/auth.c:3102 #, 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:3280 +#: libpq/auth.c:3129 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUSのソケットを作成できませんでした: %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3151 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "ローカルの RADIUS ソケットをバインドできませんでした: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3161 #, c-format msgid "could not send RADIUS packet: %m" msgstr "RADIUS パケットを送信できませんでした: %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3195 libpq/auth.c:3221 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "%sからのRADIUSの応答待ちがタイムアウトしました" -#: libpq/auth.c:3364 +#: libpq/auth.c:3214 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "RADIUSソケットの状態をチェックできませんでした: %m" -#: libpq/auth.c:3394 +#: libpq/auth.c:3244 #, c-format msgid "could not read RADIUS response: %m" msgstr "RADIUS応答を読めませんでした: %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3257 libpq/auth.c:3261 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "%sからのRADIUS応答が誤ったポートから送られてきました: %d" -#: libpq/auth.c:3420 +#: libpq/auth.c:3270 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "%sからのRADIUS応答が短すぎます: %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3277 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "%sからのRADIUS応答が間違った長さを保持しています: %d(実際の長さは%d)" -#: libpq/auth.c:3435 +#: libpq/auth.c:3285 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "%sからのRADIUS応答は異なるリクエストに対するものです: %d (%d であるはず)" -#: libpq/auth.c:3460 +#: libpq/auth.c:3310 #, 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:3469 +#: libpq/auth.c:3320 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "%sからのRADIUS応答が間違ったMD5シグネチャを保持しています" -#: libpq/auth.c:3487 +#: libpq/auth.c:3338 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "%1$sからのRADIUS応答がユーザー\"%3$s\"にとって不正なコード(%2$d)を保持しています" @@ -13475,7 +14339,7 @@ msgstr "サーバーファイル\"%s\"を書き出せませんでした: %m" msgid "large object read request is too large" msgstr "ラージオブジェクトの読み込み要求が大きすぎます" -#: libpq/be-fsstubs.c:800 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 "負の長さを指定することはできません" @@ -13518,18 +14382,18 @@ msgstr "秘密鍵ファイル\"%s\"はグループまたは全員からアクセ #: libpq/be-secure-common.c:189 #, 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) かそれよりも低いパーミッションである必要があります" +msgstr "ファイルはデータベースユーザーの所有の場合は u=rw (0600) かそれよりも低いパーミッション、root所有の場合は u=rw,g=r (0640) かそれよりも低いパーミッションである必要があります" -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" -msgstr "GSSAPIラップエラー" +msgstr "GSSAPI名ラップエラー" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" -msgstr "送出されるGSSAPIメッセージは機密性を使用しません" +msgstr "送出されるGSSAPIメッセージに機密性が適用されません" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "サーバーは過大なサイズのGSSAPIパケットを送信しようとしました: (%zu > %zu)" @@ -13546,7 +14410,7 @@ msgstr "GSSAPIアンラップエラー" #: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" -msgstr "受信したGSSAPIメッセージは機密性を使用していませんでした" +msgstr "到着したGSSAPIメッセージには機密性が適用されていません" #: libpq/be-secure-gssapi.c:570 #, c-format @@ -13561,205 +14425,205 @@ msgstr "GSSAPIセキュリティコンテキストを受け入れられません msgid "GSSAPI size check error" msgstr "GSSAPIサイズチェックエラー" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "SSLコンテキストを作成できませんでした: %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 "サーバー証明書ファイル\"%s\"をロードできませんでした: %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 "パスフレーズが要求されたため秘密鍵ファイル\"%s\"をリロードできませんでした" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "秘密鍵ファイル\"%s\"をロードできませんでした: %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, 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: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\"を\"%s\"に設定することはできません" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "最小SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "最大SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "SSLプロトコルバージョンの範囲を設定できませんでした" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\"は\"%s\"より大きくできません" -#: 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 "暗号方式リストがセットできません (利用可能な暗号方式がありません)" -#: libpq/be-secure-openssl.c:295 +#: 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:344 +#: 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:352 +#: 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:360 +#: 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:418 +#: 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:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "SSL接続を初期化できませんでした: %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "SSLソケットを設定できませんでした: %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:500 #, c-format msgid "could not accept SSL connection: %m" msgstr "SSL接続を受け付けられませんでした: %m" -#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:504 libpq/be-secure-openssl.c:557 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "SSL接続を受け付けられませんでした: EOFを検出しました" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:543 #, c-format msgid "could not accept SSL connection: %s" msgstr "SSL接続を受け付けられませんでした: %s" -#: libpq/be-secure-openssl.c:538 +#: libpq/be-secure-openssl.c:546 #, 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:554 libpq/be-secure-openssl.c:734 libpq/be-secure-openssl.c:798 +#: libpq/be-secure-openssl.c:562 libpq/be-secure-openssl.c:751 libpq/be-secure-openssl.c:821 #, c-format msgid "unrecognized SSL error code: %d" msgstr "認識できないSSLエラーコード: %d" -#: libpq/be-secure-openssl.c:600 +#: libpq/be-secure-openssl.c:608 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL 証明書のコモンネームに null が含まれています" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:654 #, 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 +#: libpq/be-secure-openssl.c:740 libpq/be-secure-openssl.c:805 #, c-format msgid "SSL error: %s" msgstr "SSLエラー: %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:982 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "DHパラメータファイル\"%s\"をオープンできませんでした: %m" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:994 #, c-format msgid "could not load DH parameters file: %s" msgstr "DHパラメータをロードできませんでした: %s" -#: libpq/be-secure-openssl.c:986 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: %s" msgstr "不正なDHパラメータです: %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1013 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "不正なDHパラメータ: pは素数ではありません" -#: libpq/be-secure-openssl.c:1004 +#: libpq/be-secure-openssl.c:1022 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "不正なDHパラメータ: 適切な生成器も安全な素数もありません" -#: libpq/be-secure-openssl.c:1165 +#: libpq/be-secure-openssl.c:1183 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: DHパラメータをロードできませんでした" -#: libpq/be-secure-openssl.c:1173 +#: libpq/be-secure-openssl.c:1191 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: DHパラメータを設定できませんでした: %s" -#: libpq/be-secure-openssl.c:1200 +#: libpq/be-secure-openssl.c:1218 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: 認識できない曲線名: %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1227 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: キーを生成できませんでした" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1255 msgid "no SSL error reported" msgstr "SSLエラーはありませんでした" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1259 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1418 #, c-format msgid "could not create BIO" msgstr "BIOを作成できませんでした" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1428 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "ASN1_OBJECTオブジェクトのNIDを取得できませんでした" -#: libpq/be-secure-openssl.c:1418 +#: libpq/be-secure-openssl.c:1436 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" -msgstr "NID %d をASN1_OBJECT 構造体に変換できませんでした" +msgstr "NID %dをASN1_OBJECT構造体へ変換できませんでした" #: libpq/be-secure.c:209 libpq/be-secure.c:305 #, c-format @@ -13781,388 +14645,378 @@ 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:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "認証ファイルのトークンが長すぎますので、飛ばします: \"%s\"" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "セカンダリ認証ファイル\"@%s\"を\"%s\"としてオープンできませんでした: %m" -#: libpq/hba.c:859 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" -msgstr "ネットワークインタフェース列挙中にエラーが起きました: %m" +msgstr "ネットワークインターフェース列挙中のエラー: %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 "認証オプション\"%s\"は認証方式%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: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 +#: 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:228 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "設定ファイル \"%2$s\" の %1$d 行目" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "認証方式\"%s\"の場合は引数\"%s\"がセットされなければなりません" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "ファイル\"%s\"の最終行%dでエントリが足りません" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "identヂールド内の複数の値" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "接続タイプで複数の値が指定されました" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "1行に1つの接続タイプだけを指定してください" -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "このビルドではlocal接続はサポートされていません" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "SSLが無効なため、hostssl行は照合できません" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "postgresql.confで ssl = on に設定してください。" -#: 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はサポートされていないため、hostssl行は照合できません" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "SSL 接続を有効にするには --with-ssl でコンパイルしてください。" - -#: libpq/hba.c:1054 +#: 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:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "GSSAPI 接続を有効にするには --with-gssapi でコンパイルしてください。" - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" -msgstr "接続オプションタイプ\"%s\"は不正です" +msgstr "接続オプションタイプ \"%s\" は不正です" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "データベース指定の前に行末を検出しました" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "ロール指定の前に行末を検出しました" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "IP アドレス指定の前に行末を検出しました" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "ホストアドレスで複数の値が指定されました" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "1行に1つのアドレス範囲を指定してください" -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "不正なIPアドレス\"%s\": %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "ホスト名とCIDRマスクを両方指定するのは不正です: \"%s\"" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "IPアドレス\"%s\"内の CIDR マスクが不正です" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "ネットマスク指定の前に行末を検出しました" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "CIDR記法でアドレス範囲を指定してするか、ネットマスクを分けて指定してください。" -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "ネットマスクで複数の値が指定されました" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "不正なIPマスク\"%s\": %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IPアドレスとマスクが一致しません" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "認証方式指定の前に行末を検出しました" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "認証タイプで複数の値が指定されました" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "認証タイプは1行に1つだけ指定してください。" -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "不正な認証方式\"%s\"" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "不正な認証方式\"%s\": このビルドではサポートされていません" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "ローカルソケットではgssapi認証はサポートしていません" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer認証はローカルソケットでのみサポートしています" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "hostssl接続では証明書認証のみをサポートしています" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "認証オプションが 名前=値 形式になっていません: %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 またはldapurlは、ldapprefixと同時には指定できません" -#: libpq/hba.c:1577 +#: 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:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute、ldapsearchfilter と同時には指定できません" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "RADIUSサーバーのリストは空にはできません" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "RADIUSシークレットのリストは空にはできません" -#: 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 "RADIUSシークレットの数(%d)は1またはRADIUSサーバーの数(%d)と同じでなければなりません" +msgstr "RADIUSシークレットの数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" -#: 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 "RADIUSポートの数(%d)は1またはRADIUSサーバーの数(%d)と同じでなければなりません" +msgstr "RADIUSポートの数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" -#: 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 "RADIUS識別子の数(%d)は1またはRADIUSサーバーの数(%d)と同じでなければなりません" +msgstr "RADIUS識別子の数(%d)は1またはRADIUSサーバーの数(%d)と同じである必要があります" # -#: libpq/hba.c:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident、peer、gssapi、sspiおよびcert" -#: libpq/hba.c:1730 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "クライアント証明書は\"hostssl\"の行でのみ設定できます" -#: libpq/hba.c:1747 +#: libpq/hba.c:1716 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" -msgstr "\"cert\"認証使用時はclientcertは\"verify-full\"のみ受け付けます" +msgstr "\"cert\"認証使用時はclientcertは\"verify-full\"にしか設定できません" -#: libpq/hba.c:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "clientcertの値が不正です: \"%s\"" -#: libpq/hba.c:1772 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" -msgstr "clientnameは\"hostssl\"の行でのみ設定可能です" +msgstr "クライアント名は\"hostssl\"の行でのみ設定できます" -#: libpq/hba.c:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "clientnameの値が不正です: \"%s\"" -#: libpq/hba.c:1825 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "LDAP URL\"%s\"をパースできませんでした: %s" -#: libpq/hba.c:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "非サポートのLDAP URLコード: %s" -#: libpq/hba.c:1860 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "このプラットフォームではLDAP URLをサポートしていません。" -#: libpq/hba.c:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "不正な ldapscheme の値: \"%s\"" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "不正なLDAPポート番号です: \"%s\"" # -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapiおよびsspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "RADIUSサーバーのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2037 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUSポートのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "不正なRADIUSポート番号: \"%s\"" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUSシークレットのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2095 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS識別子のリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "認証オプション名を認識できません: \"%s\"" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "設定ファイル\"%s\"には何も含まれていません" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "不正な正規表現\"%s\": %s" -#: libpq/hba.c:2884 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "正規表現\"%s\"で照合に失敗しました: %s" -#: libpq/hba.c:2903 +#: 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:2999 +#: 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:3019 +#: 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:3052 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "ユーザーマップファイル\"%s\"をオープンできませんでした: %m" @@ -14219,7 +15073,7 @@ msgstr "アドレス\"%s\"に対する%sソケットの作成に失敗しまし #: libpq/pqcomm.c:489 libpq/pqcomm.c:507 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" -msgstr "%s(%s)が%sアドレス\"%s\"に対して失敗しました: %m" +msgstr "%3$sアドレス%4$sに対する%1$s(%2$s)が失敗しました: %5$m" #. translator: first %s is IPv4, IPv6, or Unix #: libpq/pqcomm.c:530 @@ -14230,7 +15084,7 @@ msgstr "%sアドレス\"%s\"のbindに失敗しました: %m" #: libpq/pqcomm.c:534 #, c-format msgid "Is another postmaster already running on port %d?" -msgstr "すでに他にpostmasterがポート%dで稼動していませんか?" +msgstr "すでに他のpostmasterがポート%dで稼動していませんか?" #: libpq/pqcomm.c:536 #, c-format @@ -14274,7 +15128,7 @@ msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" msgid "could not accept new connection: %m" msgstr "新しい接続を受け付けることができませんでした: %m" -#: 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 +#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 libpq/pqcomm.c:1652 libpq/pqcomm.c:1697 libpq/pqcomm.c:1737 libpq/pqcomm.c:1781 libpq/pqcomm.c:1820 libpq/pqcomm.c:1859 libpq/pqcomm.c:1895 libpq/pqcomm.c:1934 #, c-format msgid "%s(%s) failed: %m" msgstr "%s(%s)が失敗しました: %m" @@ -14284,62 +15138,57 @@ msgstr "%s(%s)が失敗しました: %m" msgid "there is no client connection" msgstr "クライアント接続がありません" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:977 libpq/pqcomm.c:1078 #, c-format msgid "could not receive data from client: %m" msgstr "クライアントからデータを受信できませんでした: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4316 +#: libpq/pqcomm.c:1183 tcop/postgres.c:4373 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルの同期が失われたためコネクションを終了します" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1249 #, c-format msgid "unexpected EOF within message length word" msgstr "メッセージ長ワード内のEOFは想定外です" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1259 #, c-format msgid "invalid message length" msgstr "メッセージ長が不正です" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1281 libpq/pqcomm.c:1294 #, c-format msgid "incomplete message from client" msgstr "クライアントからのメッセージが不完全です" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1405 #, c-format msgid "could not send data to client: %m" msgstr "クライアントにデータを送信できませんでした: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1620 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s)が失敗しました: エラーコード %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1709 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "キープアライブのアイドル時間の設定はサポートされていません" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1793 libpq/pqcomm.c:1868 libpq/pqcomm.c:1943 #, 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:1482 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 utils/adt/arrayfuncs.c:1483 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "メッセージ内に残るデータが不十分です" @@ -14354,12 +15203,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" @@ -14368,7 +15217,7 @@ msgstr "" "%sはPostgreSQLサーバーです\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14379,107 +15228,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" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\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" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\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" -#: 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" -#: 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" -#: 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" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 接続を待ち受けるポート番号\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" -msgstr " -s 各問い合わせの後に統計情報を表示します\n" +msgstr " -s 各問い合わせの後に統計情報を表示\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 WORK-MEM ソート用のメモリ量 (KB単位)\n" -#: main/main.c:329 +#: 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:330 +#: 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:331 +#: 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:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help このヘルプを表示し、終了します\n" +msgstr " -?, --help このヘルプを表示して終了\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14488,44 +15337,44 @@ msgstr "" "\n" "開発者向けオプション:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|o|b|t|n|m|h いくつかのプランタイプを禁止します\n" +msgstr " -f s|i|o|b|t|n|m|h いくつかのプランタイプを禁止\n" -#: main/main.c:336 +#: 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:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" -msgstr " -O システムテーブル構造の変更を許可します\n" +msgstr " -O システムテーブル構造の変更を許可\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" -msgstr " -P システムインデックスを無効にします\n" +msgstr " -P システムインデックスを無効にする\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 各問い合わせの後に時間情報を表示します\n" +msgstr " -t pa|pl|ex 各問い合わせの後に時間情報を表示\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 ひとつのバックエンドプロセスが異常停止した時に全ての\n" -" バックエンドプロセスにSIGSTOPを送信します\n" +" バックエンドプロセスにSIGSTOPを送信\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 NUM デバッガをアタッチできるようにNUM秒待機します\n" +msgstr " -W NUM デバッガをアタッチできるようにNUM秒待機\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -14534,39 +15383,39 @@ msgstr "" "\n" "シングルユーザーモード用のオプション:\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" -" --single シングルユーザーモードを選択します(最初の引数でなければ\n" -" なりません)\n" +" --single シングルユーザーモードを選択 (最初の引数でなければ\n" +" なりません)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" -msgstr " DBNAME データベース名(デフォルトはユーザー名です)\n" +msgstr " DBNAME データベース名 (デフォルトはユーザー名)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" -msgstr " -d 0-5 デバッグレベルを上書きします\n" +msgstr " -d 0-5 デバッグレベルを上書き\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" -msgstr " -E 実行前に文を表示します\n" +msgstr " -E 実行前に文を表示\n" -#: main/main.c:348 +#: 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: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 FILENAME 標準出力と標準エラー出力を指定したファイルに出力します\n" +msgstr " -r FILENAME 標準出力と標準エラー出力を指定したファイルに出力\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -14575,24 +15424,22 @@ msgstr "" "\n" "初期起動用のオプション:\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" -msgstr "" -" --boot 初期起動モードを選択します(最初の引数でなければ\n" -" なりません)\n" +msgstr " --boot 初期起動モードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:353 +#: 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:355 +#: 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:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -14608,12 +15455,12 @@ msgstr "" "\n" "不具合は<%s>まで報告してください。\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -14626,12 +15473,12 @@ msgstr "" "する必要があります。適切なサーバーの起動方法に関する詳細はドキュメントを\n" "参照してください\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: 実ユーザーIDと実効ユーザーIDは一致しなければなりません\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -14655,12 +15502,12 @@ msgstr "拡張可能ノードタイプ\"%s\"はすでに存在します" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"は登録されていません" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, 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:592 +#: 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:2023 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:670 #, c-format msgid "could not find array type for data type %s" msgstr "データ型%sの配列型がありませんでした" @@ -14668,18 +15515,23 @@ msgstr "データ型%sの配列型がありませんでした" #: nodes/params.c:417 #, c-format msgid "portal \"%s\" with parameters: %s" -msgstr "パラメータ指定されたポータル\"%s\": %s" +msgstr "パラメータを持つポータル\"%s\": %s" #: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" -msgstr "パラメータ指定された無名ポータル: %s" +msgstr "パラメータを持つ無名ポータル: %s" #: optimizer/path/joinrels.c:855 #, c-format msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN はマージ結合可能もしくはハッシュ結合可能な場合のみサポートされています" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "リレーション\"%s\"に対してMERGEは実行できません" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -14687,51 +15539,46 @@ 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:1316 parser/analyze.c:1709 parser/analyze.c:1965 parser/analyze.c:3144 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 parser/analyze.c:3190 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "UNION/INTERSECT/EXCEPTでは%sを使用できません" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 +#: optimizer/plan/planner.c:2045 optimizer/plan/planner.c:3702 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY を実行できませんでした" -#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2046 optimizer/plan/planner.c:3703 optimizer/plan/planner.c:4346 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:4392 +#: optimizer/plan/planner.c:4345 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行できませんでした" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5466 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウの PARTITION BY を実行できませんでした" -#: optimizer/plan/planner.c:5241 +#: optimizer/plan/planner.c:5467 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割に使用する列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウの ORDER BY を実行できませんでした" -#: optimizer/plan/planner.c:5246 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウの順序付けをする列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/setrefs.c:516 -#, c-format -msgid "too many range table entries" -msgstr "レンジテーブルの数が多すぎます" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -14748,844 +15595,854 @@ msgstr "すべての列のデータ型はハッシュ可能でなければなり msgid "could not implement %s" msgstr "%sを実行できませんでした" -#: optimizer/util/clauses.c:4729 +#: optimizer/util/clauses.c:4843 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"のインライン化処理中" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format msgid "cannot open relation \"%s\"" msgstr "リレーション\"%s\"はオープンできません" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "リカバリ中は一時テーブルやUNLOGGEDテーブルにはアクセスできません" -#: optimizer/util/plancat.c:688 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "行全体に渡るユニークインデックスの推定指定はサポートされていません" -#: optimizer/util/plancat.c:705 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ON CONFLICT句中の制約には関連付けられるインデックスがありません" -#: optimizer/util/plancat.c:755 +#: optimizer/util/plancat.c:758 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATEでの排除制約の使用はサポートされていません" -#: optimizer/util/plancat.c:860 +#: optimizer/util/plancat.c:863 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "ON CONFLICT 指定に合致するユニーク制約または排除制約がありません" -#: parser/analyze.c:775 parser/analyze.c:1489 +#: parser/analyze.c:818 parser/analyze.c:1532 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUESリストはすべて同じ長さでなければなりません" -#: parser/analyze.c:976 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERTに対象列よりも多くの式があります" -#: parser/analyze.c:994 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERTに式よりも多くの対象列があります" -#: parser/analyze.c:998 +#: parser/analyze.c:1041 #, 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:1297 parser/analyze.c:1682 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, 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:1612 parser/analyze.c:3355 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%sをVALUESに使用できません" -#: parser/analyze.c:1848 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "不正なUNION/INTERSECT/EXCEPT ORDER BY句です" -#: parser/analyze.c:1849 +#: parser/analyze.c:1892 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "式や関数ではなく、結果列の名前のみが使用できます。" -#: parser/analyze.c:1850 +#: parser/analyze.c:1893 #, 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:1955 +#: parser/analyze.c:1998 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTOはUNION/INTERSECT/EXCEPTの最初のSELECTでのみ使用できます" -#: parser/analyze.c:2027 +#: parser/analyze.c:2070 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPTの要素となる文では同一問い合わせレベルの他のリレーションを参照できません" -#: parser/analyze.c:2114 +#: parser/analyze.c:2157 #, c-format msgid "each %s query must have the same number of columns" msgstr "すべての%s問い合わせは同じ列数を返す必要があります" -#: parser/analyze.c:2515 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNINGには少なくとも1つの列が必要です" -#: parser/analyze.c:2618 +#: parser/analyze.c:2664 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "代入元が%d個の列を返しました" -msgstr[1] "代入元が%d個の列を返しました" -#: parser/analyze.c:2679 +#: parser/analyze.c:2725 #, 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:2803 parser/analyze.c:2811 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "%sと%sの両方を同時には指定できません" -#: parser/analyze.c:2831 +#: parser/analyze.c:2877 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" -msgstr "DECLARE CURSORではWITH句内にデータを変更する文を含んではなりません" +msgstr "DECLARE CURSOR では WITH にデータを変更する文を含んではなりません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2839 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %sはサポートされていません" -#: parser/analyze.c:2842 +#: parser/analyze.c:2888 #, 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:2850 +#: parser/analyze.c:2896 #, 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:2861 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" -msgstr "DECLARE INSENSITIVE CURSOR ... %sは不正です" +msgstr "DECLARE INSENSITIVE CURSOR ... %sはが不正です" -#: parser/analyze.c:2864 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "INSENSITIVEカーソルは読み取り専用である必要があります。" -#: parser/analyze.c:2930 +#: parser/analyze.c:2976 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "実体化ビューではWITH句にデータを変更する文を含んではなりません" -#: parser/analyze.c:2940 +#: parser/analyze.c:2986 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "実体化ビューでは一時テーブルやビューを使用してはいけません" -#: parser/analyze.c:2950 +#: parser/analyze.c:2996 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "実体化ビューは境界パラメータを用いて定義してはなりません" -#: parser/analyze.c:2962 +#: parser/analyze.c:3008 #, c-format msgid "materialized views cannot be unlogged" msgstr "実体化ビューをログ非取得にはできません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3151 +#: parser/analyze.c:3197 #, 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:3158 +#: parser/analyze.c:3204 #, 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:3165 +#: parser/analyze.c:3211 #, 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:3172 +#: parser/analyze.c:3218 #, 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:3179 +#: parser/analyze.c:3225 #, 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:3186 +#: parser/analyze.c:3232 #, 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:3278 +#: parser/analyze.c:3324 #, 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:3328 +#: parser/analyze.c:3374 #, 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:3337 +#: parser/analyze.c:3383 #, 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:3346 +#: parser/analyze.c:3392 #, 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:3364 +#: parser/analyze.c:3410 #, 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:3373 +#: parser/analyze.c:3419 #, 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:3393 +#: parser/analyze.c:3439 #, 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:227 +#: parser/parse_agg.c:208 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "型%sの順序演算子を識別できませんでした" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:210 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "DISTINCT 付きの集約関数は、入力がソート可能である必要があります。" -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:268 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPINGの引数は32より少くなければなりません" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:371 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "JOIN条件で集約関数を使用できません" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:373 msgid "grouping operations are not allowed in JOIN conditions" msgstr "グルーピング演算はJOIN条件の中では使用できません" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "集約関数は自身の問い合わせレベルのFROM句の中では使用できません" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "グルーピング演算は自身のクエリレベルのFROM句の中では使用できません" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "集約関数はFROM句内の関数では使用できません" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "グルーピング演算はFROM句内の関数では使用できません" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "集約関数はポリシ式では使用できません" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "グルーピング演算はポリシ式では使用できません" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "集約関数はウィンドウRANGEの中では集約関数を使用できません" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" -msgstr "グルーピング演算はウィンドウ定義のRANGE句の中では使用できません" +msgstr "ウィンドウ定義のRANGE句の中ではグルーピング演算は使用できません" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" -msgstr "集約関数はウィンドウ定義のROWS句では使用できません" +msgstr "ウィンドウ定義のROWS句では集約関数は使用できません" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" -msgstr "グルーピング演算はウィンドウ定義のROWS句では使用できません" +msgstr "ウィンドウ定義のROWS句ではグルーピング演算は使用できません" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" -msgstr "集約関数はウィンドウ定義のGROUPS句では使用できません" +msgstr "ウィンドウ定義のGROUPS句では集約関数は使用できません" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" -msgstr "グルーピング演算はウィンドウ定義のGROUPS句では使用できません" +msgstr "ウィンドウ定義のGROUPS句ではグルーピング演算は使用できません" + +#: parser/parse_agg.c:450 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件では集約関数を使用できません" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:452 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件ではグルーピング演算を使用できません" + +#: parser/parse_agg.c:478 msgid "aggregate functions are not allowed in check constraints" -msgstr "集約関数は検査制約では使用できません" +msgstr "検査制約では集約関数を使用できません" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:480 msgid "grouping operations are not allowed in check constraints" -msgstr "グルーピング演算は検査制約では使用できません" +msgstr "検査制約ではグルーピング演算を使用できません" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:487 msgid "aggregate functions are not allowed in DEFAULT expressions" -msgstr "集約関数はDEFAULT式では使用できません" +msgstr "DEFAULT式では集約関数を使用できません" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:489 msgid "grouping operations are not allowed in DEFAULT expressions" -msgstr "グルーピング演算はDEFAULT式では使用できません" +msgstr "DEFAULT式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:494 msgid "aggregate functions are not allowed in index expressions" -msgstr "集約関数はインデックス式では使用できません" +msgstr "インデックス式では集約関数を使用できません" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:496 msgid "grouping operations are not allowed in index expressions" -msgstr "グルーピング演算はインデックス式では使用できません" +msgstr "インデックス式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:501 msgid "aggregate functions are not allowed in index predicates" -msgstr "集約関数はインデックス述語では使用できません" +msgstr "インデックス述語では集約関数を使用できません" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:503 msgid "grouping operations are not allowed in index predicates" -msgstr "グルーピング演算はインデックス述語では使用できません" +msgstr "インデックス述語ではグルーピング演算を使用できません" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:508 msgid "aggregate functions are not allowed in statistics expressions" -msgstr "集約関数は統計情報式では使用できません" +msgstr "統計情報式では集約関数を使用できません" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:510 msgid "grouping operations are not allowed in statistics expressions" -msgstr "グルーピング演算は統計情報式では使用できません" +msgstr "統計情報式ではグルーピング演算使用できません" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:515 msgid "aggregate functions are not allowed in transform expressions" -msgstr "集約関数は変換式では使用できません" +msgstr "変換式では集約関数を使用できません" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:517 msgid "grouping operations are not allowed in transform expressions" -msgstr "グルーピング演算は変換式では使用できません" +msgstr "変換式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:522 msgid "aggregate functions are not allowed in EXECUTE parameters" -msgstr "集約関数はEXECUTEのパラメータでは使用できません" +msgstr "EXECUTEのパラメータでは集約関数を使用できません" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:524 msgid "grouping operations are not allowed in EXECUTE parameters" -msgstr "グルーピング演算はEXECUTEのパラメータでは使用できません" +msgstr "EXECUTEのパラメータではグルーピング演算を使用できません" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:529 msgid "aggregate functions are not allowed in trigger WHEN conditions" -msgstr "集約関数をはトリガーのWHEN条件では用できません" +msgstr "トリガのWHEN条件では集約関数を使用できません" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:531 msgid "grouping operations are not allowed in trigger WHEN conditions" -msgstr "グルーピング演算はトリガーのWHEN条件では使用できません" +msgstr "トリガのWHEN条件ではグルーピング演算を使用できません" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:536 msgid "aggregate functions are not allowed in partition bound" msgstr "集約関数はパーティション境界では使用できません" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:538 msgid "grouping operations are not allowed in partition bound" msgstr "グルーピング演算はパーティション境界では使用できません" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:543 msgid "aggregate functions are not allowed in partition key expressions" -msgstr "集約関数はパーティションキー式では使用できません" +msgstr "パーティションキー式では集約関数は使用できません" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:545 msgid "grouping operations are not allowed in partition key expressions" -msgstr "グルーピング演算はパーティションキー式では使用できません" +msgstr "パーティションキー式ではグルーピング演算は使用できません" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:551 msgid "aggregate functions are not allowed in column generation expressions" msgstr "集約関数はカラム生成式では使用できません" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:553 msgid "grouping operations are not allowed in column generation expressions" msgstr "グルーピング演算はカラム生成式では使用できません" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:559 msgid "aggregate functions are not allowed in CALL arguments" -msgstr "集約関数はCALLの引数では使用できません" +msgstr "CALLの引数では集約関数を使用できません" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:561 msgid "grouping operations are not allowed in CALL arguments" -msgstr "グルーピング演算はCALLの引数では使用できません" +msgstr "CALLの引数ではグルーピング演算を使用できません" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:567 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "集約関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:569 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:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:596 parser/parse_clause.c:1836 #, c-format msgid "aggregate functions are not allowed in %s" -msgstr "集約関数は%sでは使用できません" +msgstr "%sでは集約関数を使用できません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:581 +#: parser/parse_agg.c:599 #, c-format msgid "grouping operations are not allowed in %s" -msgstr "グルーピング演算は%sでは使用できません" +msgstr "%sではグルーピング演算を使用できません" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:700 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "アウタレベルの集約は直接引数に低位の変数を含むことができません" -#: parser/parse_agg.c:760 +#: parser/parse_agg.c:778 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "集合返却関数の呼び出しに集約関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 parser/parse_func.c:883 +#: parser/parse_agg.c:779 parser/parse_expr.c:1674 parser/parse_expr.c:2156 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:766 +#: parser/parse_agg.c:784 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "集約関数の呼び出しにウィンドウ関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:845 +#: parser/parse_agg.c:863 msgid "window functions are not allowed in JOIN conditions" msgstr "JOIN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:870 msgid "window functions are not allowed in functions in FROM" msgstr "FROM句内の関数ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:858 +#: parser/parse_agg.c:876 msgid "window functions are not allowed in policy expressions" -msgstr "ウィンドウ関数はポリシ式では使用できません" +msgstr "ポリシ式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:871 +#: parser/parse_agg.c:889 msgid "window functions are not allowed in window definitions" -msgstr "ウィンドウ関数はウィンドウ定義では使用できません" +msgstr "ウィンドウ定義ではウィンドウ関数は使用できません" + +#: parser/parse_agg.c:900 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:924 msgid "window functions are not allowed in check constraints" -msgstr "ウィンドウ関数は検査制約の中では使用できません" +msgstr "検査制約の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:928 msgid "window functions are not allowed in DEFAULT expressions" -msgstr "ウィンドウ関数はDEFAULT式の中では使用できません" +msgstr "DEFAULT式の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:931 msgid "window functions are not allowed in index expressions" -msgstr "ウィンドウ関数はインデックス式では使用できません" +msgstr "インデックス式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:934 msgid "window functions are not allowed in statistics expressions" -msgstr "ウィンドウ関数は統計情報式では使用できません" +msgstr "統計情報式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:937 msgid "window functions are not allowed in index predicates" -msgstr "ウィンドウ関数はインデックス述語では使用できません" +msgstr "インデックス述語ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:940 msgid "window functions are not allowed in transform expressions" -msgstr "ウィンドウ関数は変換式では使用できません" +msgstr "変換式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:943 msgid "window functions are not allowed in EXECUTE parameters" -msgstr "ウィンドウ関数はEXECUTEパラメータでは使用できません" +msgstr "EXECUTEパラメータではウィンドウ関数を使用できません" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:946 msgid "window functions are not allowed in trigger WHEN conditions" -msgstr "ウィンドウ関数はトリガーのWHEN条件では使用できません" +msgstr "トリガのWHEN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:949 msgid "window functions are not allowed in partition bound" msgstr "ウィンドウ関数はパーティション境界では使用できません" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:952 msgid "window functions are not allowed in partition key expressions" -msgstr "ウィンドウ関数はパーティションキー式では使用できません" +msgstr "パーティションキー式ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:955 msgid "window functions are not allowed in CALL arguments" -msgstr "ウィンドウ関数はCALLの引数では使用できません" +msgstr "CALLの引数ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:937 +#: parser/parse_agg.c:958 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "ウィンドウ関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:940 +#: parser/parse_agg.c:961 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:984 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" -msgstr "ウィンドウ関数は%sの中では使用できません" +msgstr "%sの中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1018 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "ウィンドウ\"%s\"は存在しません" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1102 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "グルーピングセットの数が多すぎます (最大4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1242 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "再帰問い合わせの再帰項では集約関数を使用できません" -#: parser/parse_agg.c:1414 +#: parser/parse_agg.c:1435 #, 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:1417 +#: parser/parse_agg.c:1438 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "順序集合集約の直接引数はグルーピングされた列のみを使用しなければなりません。" -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1443 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "外部問い合わせから副問い合わせがグループ化されていない列\"%s.%s\"を使用しています" -#: parser/parse_agg.c:1586 +#: parser/parse_agg.c:1607 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "GROUPINGの引数は関連するクエリレベルのグルーピング式でなければなりません" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "リレーション\"%s\"は更新文の対象にはなれません" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "集合返却関数はFROMの最上位レベルにある必要があります" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "同じ関数に対して複数の列定義リストを持つことができません" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:645 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "複数の関数を伴った ROWS FROM() は列定義リストを持つことができません" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:646 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "ROWS FROM() 内のそれぞれの関数ごとに個別の列定義リストを付けてください。" -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "複数の引数をもつUNNEST()は列定義リストを持つことができません" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:653 #, 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:658 +#: parser/parse_clause.c:660 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY は列定義リストがあるときは使えません" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ROWS FROM() の中に列定義リストをおいてください。" -#: parser/parse_clause.c:759 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY 列は一つまでです" -#: parser/parse_clause.c:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "列名\"%s\"は一意ではありません" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "名前空間名\"%s\"は一意ではありません" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "デフォルト名前空間は一つのみ指定可能です" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "テーブルサンプルメソッド%sは存在しません" -#: parser/parse_clause.c:954 +#: 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:988 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "テーブルサンプルメソッド%sはREPEATABLEをサポートしていません" -#: parser/parse_clause.c:1137 +#: parser/parse_clause.c:1139 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE句はテーブルおよび実体化ビューのみに適用可能です" -#: parser/parse_clause.c:1327 +#: parser/parse_clause.c:1329 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "USING句に列名\"%s\"が複数あります" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "左テーブルに列名\"%s\"が複数あります" -#: parser/parse_clause.c:1351 +#: parser/parse_clause.c:1353 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "USING句で指定した列\"%sが左テーブルに存在しません" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "右テーブルに列名\"%s\"が複数あります" -#: parser/parse_clause.c:1375 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "USING句で指定した列\"%sが右テーブルに存在しません" -#: parser/parse_clause.c:1779 +#: parser/parse_clause.c:1781 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" -msgstr "FETCH FIRST ... WITH TIES 節で行数にnullは指定できません" +msgstr "FETCH FIRST ... WITH TIES句で行数にNULLは指定できません" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1804 +#: parser/parse_clause.c:1806 #, 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:1969 +#: parser/parse_clause.c:1971 #, 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:1998 +#: parser/parse_clause.c:1999 #, 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:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "%sの位置%dはSELECTリストにありません" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBEは12要素に制限されています" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "ウィンドウ\"%s\"はすでに定義済みです" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"のPARTITION BY句をオーバーライドできません" -#: parser/parse_clause.c:2738 +#: parser/parse_clause.c:2739 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"のORDER BY句をオーバーライドできません" -#: parser/parse_clause.c:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "フレーム句をもっているため、ウィンドウ\"%s\"はコピーできません" -#: parser/parse_clause.c:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "このOVER句中の括弧を無視しました" -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, 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:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPSフレーム指定はORDER BY句を必要とします" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "DISTINCT や ORDER BY 表現を伴なう集約は引数リストの中に現れなければなりません" -#: parser/parse_clause.c:2890 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "SELECT DISTINCTではORDER BYの式はSELECTリスト内になければなりません" -#: parser/parse_clause.c:2922 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "DISTINCTを伴った集約は、最低でも一つの引数を取る必要があります" -#: parser/parse_clause.c:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCTには少なくとも1つの列が必要です" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "SELECT DISTINCT ONの式はORDER BY式の先頭に一致しなければなりません" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3101 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESCはON CONFLICT句では指定できません" -#: parser/parse_clause.c:3105 +#: parser/parse_clause.c:3107 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LASTはON CONFLICT句では指定できません" -#: parser/parse_clause.c:3184 +#: parser/parse_clause.c:3186 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE は推定指定または制約名を必要とします" -#: parser/parse_clause.c:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "例えば、 ON CONFLICT (column_name)。" -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "システムカタログテーブルではON CONFLICTはサポートしていません" -#: parser/parse_clause.c:3204 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT はカタログテーブルとして使用中のテーブル\"%s\"ではサポートされません" -#: parser/parse_clause.c:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "演算子\"%s\"は有効な順序付け演算子名ではありません" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "順序付け演算子はB-Tree演算子族の\"<\"または\">\"要素でなければなりません。" -#: parser/parse_clause.c:3647 +#: parser/parse_clause.c:3649 #, 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:3653 +#: parser/parse_clause.c:3655 #, 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:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "オフセット値を適切な型にキャストしてください。" -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, 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:3664 +#: parser/parse_clause.c:3666 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "オフセット値を意図した型そのものにキャストしてください。" -#: 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:2662 parser/parse_target.c:994 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "型%sから%sへの型変換ができません" @@ -15641,17 +16498,17 @@ msgstr "%sで型%sから%sへ変換できませんでした" msgid "arguments declared \"%s\" are not all alike" msgstr "\"%s\"と宣言された引数が全て同じでありません" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:523 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:601 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%sと宣言された引数が配列ではなく%s型です" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:537 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:615 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%sと宣言された引数が範囲型ではなく型%sです" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "%sと宣言された引数が複範囲型ではなく型%sです" @@ -15709,38 +16566,38 @@ msgstr "anycompatiblenonarrayに対応する型が配列型です: %s" #: 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型のの入力が最低でも一つ必要です。" +msgstr "%s型の返却値にはanyrangeまたはanymultirange型の入力が最低でも一つ必要です。" #: parser/parse_coerce.c:2874 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." -msgstr "%s型の返却値には少なくとも一つの anycompatiblerange型またはanycompatiblemultirange型の入力が必要です。" +msgstr "%s型の返却値には少なくとも一つのanycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" #: 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 "%s型の返却値には少なくとも一つの anyelement, anyarray, anynonarray, anyenum, anyrange, またはanymultirange型の入力が必要です。" +msgstr "%s型の返却値には少なくとも一つのanyelement、anyarray、anynonarray、anyenum、anyrange またはanymultirange型の入力が必要です。" #: parser/parse_coerce.c:2898 #, 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型の入力が必要です。" +msgstr "%s型の返却値には少なくとも一つのanycompatible、anycompatiblearray、anycompatiblenonarray、anycompatiblerangeまたはanycompatiblemultirange型の入力が必要です。" #: 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:1004 +#: parser/parse_collate.c:228 parser/parse_collate.c:475 parser/parse_collate.c:1005 #, 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:1007 +#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "片方もしくは両方の式に対して COLLATE 句を適用することで照合順序を選択できます" -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "明示的な照合順序\"%s\"と\"%s\"の間に照合順序のミスマッチがあります" @@ -15770,369 +16627,374 @@ msgstr "問い合わせ\"%s\"への再帰的参照が、INTERSECT内に現れて msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "問い合わせ\"%s\"への再帰的参照が、EXCEPT内で現れてはなりません" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGEはWITH問い合わせではサポートされません" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH 問い合わせ名\"%s\"が複数回指定されました" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" -msgstr "型%sの不等価性演算子を識別できませんでした" +msgstr "型%sの不等演算子を特定できませんでした" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "データを変更するようなステートメントを含む WITH 句はトップレベルでなければなりません" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, 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:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "非再帰項の出力を正しい型に変換してください。" -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, 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:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "COLLATE句を使って非再帰項の照合順序を設定してください。" -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "WITH問い合わせは再帰的ではありません" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" -msgstr "SEARCHまたはCYCLE句を指定した場合は、UNIONの左辺はSELECTでなければなりません" +msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの左辺はSELECTでなければなりません" -#: parser/parse_cte.c:455 +#: parser/parse_cte.c:462 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" -msgstr "SEARCHまたはCYCLE句を指定した場合は、UNIONの右辺はSELECTでなければなりません" +msgstr "SEARCHまたはCYCLE句を指定する場合、UNIONの右辺はSELECTでなければなりません" -#: parser/parse_cte.c:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" -msgstr "検索カラム\"%s\"はWITH問い合わせの列リストの中にありません" +msgstr "検索カラム\\\"%s\\\"はWITH問い合わせの列リストの中にありません" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" -msgstr "検索列\"%s\"が複数指定されました" +msgstr "検索列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" -msgstr "検索順序列の名前\"%s\"はすでにWITH問い合わせのカラムリストで使われています" +msgstr "検索順序列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" -msgstr "循環列\"%s\"はWITHクエリの列リストに存在しません" +msgstr "循環列\"%s\"がWITH問い合わせの列リストに存在しません" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" -msgstr "循環列\"%s\"が複数指定されました" +msgstr "循環列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" -msgstr "循環識別列の名前\"%s\"はすでにWITH問い合わせのカラムリストで使われています" +msgstr "循環識別列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" -msgstr "循環経路列の名前\"%s\"はすでにWITH問い合わせのカラムリストで使われています" +msgstr "循環経路列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "循環識別列と循環経路列の名前が同一です" -#: parser/parse_cte.c:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "検索順序列と循環識別列の名前が同一です" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "検索順序列と循環経路列の名前が同一です" -#: parser/parse_cte.c:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH問い合わせ\"%s\"には%d列しかありませんが、%d列指定されています" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH項目間の再帰は実装されていません" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "再帰問い合わせ\"%s\"はデータを更新するス文を含んでいてはなりません" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, 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:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "再帰問い合わせ内の ORDER BY は実装されていません" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "再帰問い合わせ内の OFFSET は実装されていません" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "再帰問い合わせ内の LIMIT は実装されていません" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "再帰問い合わせ内の FOR UPDATE/SHARE は実装されていません" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "問い合わせ\"%s\"への再帰参照が2回以上現れてはなりません" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "この文脈ではDEFAULTは使えません" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "列%s.%sは存在しません" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "データ型%2$sの列\"%1$s\"はありません" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "レコードデータ型の列\"%s\"を識別できませんでした" -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:359 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "列記法 .%sが型%sに使用されましたが、この型は複合型ではありません" -#: parser/parse_expr.c:395 parser/parse_target.c:739 +#: parser/parse_expr.c:390 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "\"*\"を通した行展開は、ここではサポートされていません" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "列参照はDEFAULT式では使用できません" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 msgid "cannot use column reference in partition bound expression" msgstr "列参照はパーティション境界式では使用できません" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 parser/parse_relation.c:889 parser/parse_target.c:1234 +#: parser/parse_expr.c:784 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\"が一意に特定できません" +msgstr "列参照\"%s\"は曖昧です" -#: 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 +#: parser/parse_expr.c:840 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:1044 +#: parser/parse_expr.c:1040 #, 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:1050 parser/parse_expr.c:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%sは集合を返してはなりません" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "列の数がVALUESの数と一致しません" -#: parser/parse_expr.c:1481 +#: parser/parse_expr.c:1477 #, 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:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "集合返却関数は%sでは使用できません" -#: parser/parse_expr.c:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "検査制約では副問い合わせを使用できません" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULT式には副問い合わせを使用できません" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "式インデックスには副問い合わせを使用できません" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "インデックスの述部に副問い合わせを使用できません" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" -msgstr "統計情報式では副問い合わせを使用できません" +msgstr "時計情報式では副問い合わせを使用できません" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "変換式では副問い合わせを使用できません" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTEのパラメータに副問い合わせを使用できません" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "トリガーの WHEN 条件では副問い合わせを使用できません" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "副問い合わせはパーティション境界では使用できません" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "パーティションキー式では副問い合わせを使用できません" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "CALLの引数で副問い合わせは使用できません" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "副問い合わせは COPY FROM の WHERE 条件では使用できません" -#: parser/parse_expr.c:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "副問い合わせはカラム生成式では使用できません" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "副問い合わせは1列のみを返さなければなりません" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "副問い合わせの列が多すぎます" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "副問い合わせの列が少なすぎます" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "空の配列のデータ型を決定できません" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "必要な型に明示的にキャストしてください。例: ARRAY[]::integer[]" -#: parser/parse_expr.c:2015 +#: parser/parse_expr.c:2012 #, c-format msgid "could not find element type for data type %s" msgstr "データ型%sの要素を見つけられませんでした" -#: parser/parse_expr.c:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW式は最大でも%dエントリまでしか持てません" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "無名のXML属性値は列参照でなければなりません" -#: parser/parse_expr.c:2304 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "無名のXML要素値は列参照でなければなりません" -#: parser/parse_expr.c:2319 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML属性名\"%s\"が複数あります" -#: parser/parse_expr.c:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "XMLSERIALIZE の結果を %s へキャストできません" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "行式において項目数が一致しません" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "長さ0の行を比較できません" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "行比較演算子は型%sではなくbooleanを返さなければなりません" -#: parser/parse_expr.c:2777 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "行比較演算子は集合を返してはいけません" -#: parser/parse_expr.c:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "行比較演算子%sの解釈を特定できませんでした" -#: parser/parse_expr.c:2838 +#: parser/parse_expr.c:2835 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "行比較演算子はbtree演算子族と関連付けされなければなりません。" -#: parser/parse_expr.c:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "同程度の適合度の候補が複数存在します。" -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROMでは=演算子はbooleanを返さなければなりません" @@ -16211,8 +17073,7 @@ msgstr "OVERは順序集合集約%sではサポートされていません" #, 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] "順序集合集約%1$sは存在しますが、それは%3$d個ではなく%2$d個の直接引数を必要とします。" -msgstr[1] "順序集合集約%1$sは存在しますが、それは%3$d個ではなく%2$d個の直接引数を必要とします。" +msgstr[0] "順序集合集約%1$sはありますが、それは%3$d個ではなく%2$d個の直接引数を必要とします。" #: parser/parse_func.c:479 #, c-format @@ -16223,8 +17084,7 @@ msgstr "仮説集合集約%sを使うには、仮説直接引数(今は%d)がソ #, 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] "順序集合集約%sは存在しますが、それは少なくとも%d個の直接引数を必要とします。" -msgstr[1] "順序集合集約%sは存在しますが、それは少なくとも%d個の直接引数を必要とします。" +msgstr[0] "順序集合集約%sはありますが、それは少なくとも%d個の直接引数を必要とします。" #: parser/parse_func.c:514 #, c-format @@ -16259,7 +17119,7 @@ msgstr "関数 %s は一意ではありません" #: parser/parse_func.c:575 #, c-format msgid "Could not choose a best candidate function. You might need to add explicit type casts." -msgstr "最善の候補関数を選択できませんでした。明示的な型変換が必要かもしれません" +msgstr "最善の候補関数を選択できませんでした。明示的な型キャストが必要かもしれません" #: parser/parse_func.c:614 #, c-format @@ -16346,7 +17206,6 @@ msgstr "関数を曖昧さなく選択するには引数リストを指定して 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:2359 #, c-format @@ -16420,59 +17279,88 @@ msgstr "集合返却関数はポリシ式では使用できません" msgid "set-returning functions are not allowed in window definitions" msgstr "ウィンドウ定義では集合返却関数は使用できません" -#: parser/parse_func.c:2616 +#: 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:2620 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "集合返却関数はDEFAULT式の中では使用できません" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "集合返却関数はインデックス式では使用できません" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "集合返却関数はインデックス述語では使用できません" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "集合返却関数は統計情報式では使用できません" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "集合返却関数は変換式では使用できません" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "集合返却関数はEXECUTEパラメータでは使用できません" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" -msgstr "集合返却関数はトリガーのWHEN条件では使用できません" +msgstr "集合返却関数はトリガのWHEN条件では使用できません" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "集合返却関数はパーティション境界では使用できません" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "集合返却関数はパーティションキー式では使用できません" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "CALLの引数に集合返却関数は使用できません" -#: parser/parse_func.c:2650 +#: 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:2653 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "集合返却関数はカラム生成式では使用できません" -#: parser/parse_node.c:87 +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE文ではWITH RECURSIVEはサポートされません" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "無条件WHEN句の後に指定されて到達不能なWHEN句" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGEはルールを持つリレーションに対してはサポートされません。" + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "名前\"%s\"が複数回指定されています" + +#: parser/parse_merge.c:210 +#, 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エントリまでしか持てません" @@ -16542,6 +17430,11 @@ msgstr "演算子 ANY/ALL (配列) 集合を返してはなりません" 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" @@ -16557,12 +17450,12 @@ msgstr "テーブル参照%uは曖昧です" msgid "table name \"%s\" specified more than once" msgstr "テーブル名\"%s\"が複数指定されました" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句に対する不正な参照" -#: parser/parse_relation.c:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%s\"の項目がありますが、問い合わせのこの部分からは参照できません。\"" @@ -16582,107 +17475,107 @@ msgstr "検査制約で参照されるシステム列\"%s\"は不正です" msgid "cannot use system column \"%s\" in column generation expression" msgstr "カラム生成式ではシステム列\"%s\"は使用できません" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 parser/parse_relation.c:2343 +#: 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:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "テーブル\"%s\"では%d列使用できますが、%d列指定されました" -#: 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 "\"%s\"というWITH項目はありますが、これは問い合わせのこの部分からは参照できません。" -#: 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 "WITH RECURSIVE を使うか、もしくは WITH 項目の場所を変えて前方参照をなくしてください" -#: parser/parse_relation.c:1767 +#: parser/parse_relation.c:1778 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" -msgstr "OUTパラメータを指定した関数では列定義リストは冗長です" +msgstr "OUTパラメータを持つ関数に対しては列定義リストは不要です" -#: parser/parse_relation.c:1773 +#: parser/parse_relation.c:1784 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" -msgstr "名前付き複合型を返却する関数では列定義リストは冗長です" +msgstr "名前付き複合型w返す関数に対しては列定義リストは不要です" -#: 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 "列定義リストは\"record\"を返す関数でのみ使用できます" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "\"record\"を返す関数では列定義リストが必要です" -#: parser/parse_relation.c:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "列定義リストは最大でも%dエントリまでしか持てません" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "FROM句の関数\"%s\"の戻り値型%sはサポートされていません" -#: parser/parse_relation.c:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "FROM内の関数は最大%d列までしか返却できません" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "%s関数では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUESリスト\"%s\"は%d列使用可能ですが、%d列が指定されました" -#: parser/parse_relation.c:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "JOIN で指定できるのは、最大 %d 列です" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "結合式\"%s\"では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH 問い合わせ\"%s\"にRETURNING句がありません" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "リレーション\"%2$s\"の列\"%1$d\"は存在しません" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "テーブル別名\"%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句エントリがありません" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "列\"%s.%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3646 +#: parser/parse_relation.c:3664 #, 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:3663 +#: parser/parse_relation.c:3681 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "列\"%s.%s\"または列\"%s.%s\"を参照しようとしていたようです。" @@ -16690,17 +17583,17 @@ msgstr "列\"%s.%s\"または列\"%s.%s\"を参照しようとしていたよう #: parser/parse_target.c:482 parser/parse_target.c:803 #, c-format msgid "cannot assign to system column \"%s\"" -msgstr "システム列\"%s\"には代入できません" +msgstr "システム列\"%s\"に代入できません" #: parser/parse_target.c:510 #, c-format msgid "cannot set an array element to DEFAULT" -msgstr "配列要素にはDEFAULTを設定できません" +msgstr "配列要素にDEFAULTを設定できません" #: parser/parse_target.c:515 #, c-format msgid "cannot set a subfield to DEFAULT" -msgstr "サブフィールドにはDEFAULTを設定できません" +msgstr "サブフィールドにDEFAULTを設定できません" #: parser/parse_target.c:589 #, c-format @@ -16720,14 +17613,14 @@ msgstr "データ型%3$sの列がありませんので、列\"%2$s\"のフィー #: parser/parse_target.c:877 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "\"%s\"への添字指定代入には型%sが必要ですが、式は型%sでした" +msgstr "\"%s\"への添字付き代入には型%sが必要ですが、式は型%sでした" #: 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:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "テーブル指定のないSELECT *は無効です" @@ -16747,7 +17640,7 @@ msgstr "%%TYPE参照が不適切です(ドット区切りの名前が多すぎ msgid "type reference %s converted to %s" msgstr "型参照%sは%sに変換されました" -#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:394 utils/cache/typcache.c:449 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:395 utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "型\"%s\"は単なるシェルです" @@ -16757,12 +17650,12 @@ 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:766 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "不正な型名\"%s\"" @@ -16772,322 +17665,322 @@ msgstr "不正な型名\"%s\"" msgid "cannot create partitioned table as inheritance child" msgstr "パーティション親テーブルを継承の子テーブルとして作成はできません" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "連番(SERIAL)の配列は実装されていません" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 parser/parse_utilcmd.c:730 #, 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:684 +#: parser/parse_utilcmd.c:683 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"で複数のデフォルト値の指定があります" -#: parser/parse_utilcmd.c:701 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "型付けされたテーブルでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "パーティションでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に複数の識別指定があります" -#: parser/parse_utilcmd.c:744 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "型付けされたテーブルでは生成カラムはサポートされていません" -#: parser/parse_utilcmd.c:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "パーティションでは生成カラムはサポートされていません" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に複数のGENERATED句の指定があります" -#: parser/parse_utilcmd.c:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "外部テーブルでは主キー制約はサポートされていません" -#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "外部テーブルではユニーク制約はサポートされていません" -#: parser/parse_utilcmd.c:825 +#: parser/parse_utilcmd.c:824 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "デフォルト値と識別指定の両方がテーブル\"%2$s\"の列\"%1$s\"に指定されています" -#: parser/parse_utilcmd.c:833 +#: parser/parse_utilcmd.c:832 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"にデフォルト値と生成式の両方が指定されています" -#: parser/parse_utilcmd.c:841 +#: parser/parse_utilcmd.c:840 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"の列\"%1$s\"に識別指定と生成式の両方が指定されています" -#: parser/parse_utilcmd.c:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "外部テーブルでは除外制約はサポートされていません" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, c-format msgid "exclusion constraints are not supported on partitioned tables" -msgstr "パーティション親テーブルでは除外制約はサポートされていません" +msgstr "パーティションテーブルでは除外制約はサポートされていません" -#: parser/parse_utilcmd.c:977 +#: parser/parse_utilcmd.c:976 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "外部テーブルの作成においてLIKEはサポートされていません" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "LIKE句ではリレーション\"%s\"は不正です" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "インデックス\"%s\"には行全体テーブル参照が含まれます" -#: parser/parse_utilcmd.c:2249 +#: parser/parse_utilcmd.c:2252 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE では既存のインデックスを使えません" -#: parser/parse_utilcmd.c:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"はすでに1つの制約に割り当てられています" -#: parser/parse_utilcmd.c:2284 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "インデックス\"%s\"は有効ではありません" - -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"はユニークインデックスではありません" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "このようなインデックスを使ってプライマリキーや一意性制約を作成することはできません" -#: parser/parse_utilcmd.c:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"は式を含んでいます" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"は部分インデックスです" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"は遅延可能インデックスです" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "遅延可能インデックスを使った遅延不可制約は作れません。" -#: parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2384 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "インデックス\"%s\"の列番号%dにはデフォルトのソート動作がありません" -#: parser/parse_utilcmd.c:2538 +#: parser/parse_utilcmd.c:2541 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"がプライマリキー制約内に2回出現します" -#: parser/parse_utilcmd.c:2544 +#: parser/parse_utilcmd.c:2547 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"が一意性制約内に2回出現します" -#: parser/parse_utilcmd.c:2891 +#: parser/parse_utilcmd.c:2894 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "インデックス式と述語はインデックス付けされるテーブルのみを参照できます" -#: parser/parse_utilcmd.c:2963 +#: parser/parse_utilcmd.c:2966 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "統計情報式は参照されているテーブルのみを参照できます" -#: parser/parse_utilcmd.c:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューに対するルールはサポートされません" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールのWHERE条件に他のリレーションへの参照を持たせられません" -#: parser/parse_utilcmd.c:3142 +#: parser/parse_utilcmd.c:3145 #, 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:3160 parser/parse_utilcmd.c:3261 rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "条件付きのUNION/INTERSECT/EXCEPT文は実装されていません" -#: parser/parse_utilcmd.c:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH 問い合わせ内では OLD は参照できません" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH 問い合わせ内では NEW は参照できません" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "複数のDEFERRABLE/NOT DEFERRABLE句を使用できません" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED句の場所が間違っています<" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "複数のINITIALLY IMMEDIATE/DEFERRED句を使用できません" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE句の場所が間違っています<" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATEで指定したスキーマ(%s)が作成先のスキーマ(%s)と異なります" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" -msgstr "\"%s\"はパーティション親テーブルではありません" +msgstr "\"%s\"はパーティションテーブルではありません" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ハッシュパーティションテーブルはデフォルトパーティションを持つことができません" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ハッシュパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "ハッシュパーティションの法は0より大きい整数にする必要があります" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "ハッシュパーティションの剰余は法よりも小さくなければなりません" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4139 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界でNULLは使用できません" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEに続く境界値はMAXVALUEでなければなりません" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4309 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEに続く境界値はMINVALUEでなければなりません" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4352 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定した値は列\"%s\"の%s型に変換できません" @@ -17100,12 +17993,12 @@ msgstr "UESCAPE の後には単純な文字列リテラルが続かなければ msgid "invalid Unicode escape character" msgstr "不正なUnicodeエスケープ文字" -#: parser/parser.c:321 scan.l:1330 +#: parser/parser.c:321 scan.l:1339 #, c-format msgid "invalid Unicode escape value" msgstr "不正なUnicodeエスケープシーケンスの値" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6555 +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 #, c-format msgid "invalid Unicode escape" msgstr "不正なUnicodeエスケープ" @@ -17115,7 +18008,7 @@ msgstr "不正なUnicodeエスケープ" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープは\\XXXXまたは\\+XXXXXXでなければなりません。" -#: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 utils/adt/varlena.c:6580 +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 utils/adt/varlena.c:6554 #, c-format msgid "invalid Unicode surrogate pair" msgstr "不正なUnicodeサロゲートペア" @@ -17125,72 +18018,72 @@ msgstr "不正なUnicodeサロゲートペア" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "識別子\"%s\"は\"%.*s\"に切り詰められます" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "パーティション\"%s\"は既存のデフォルトパーティション\"%s\"と重複しています" -#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 partitioning/partbounds.c:3026 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "ハッシュパーティションの法(除数)は次に大きな法の因数でなければなりません" -#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, 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の因数ではありません。" +msgstr "新しい法(除数)%1$dは既存のパーティション\"%3$s\"の法である%2$dの因数ではありません。" -#: partitioning/partbounds.c:2893 +#: partitioning/partbounds.c:3005 #, 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で割り切れません。" +msgstr "新しい法(除数)%1$dは既存のパーティション\"%3$s\"の法である%2$dで割り切れません。" -#: partitioning/partbounds.c:3028 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "リレーション\"%s\"に対して空の範囲境界が指定されました" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "指定された下限%sは上限%sより大きいか同じです。" -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "パーティション\"%s\"はパーティション\"%s\"と重複があります" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "デフォルトパーティション\"%2$s\"の子テーブルであるためテーブル\"%1$s\"のスキャンをスキップします" -#: partitioning/partbounds.c:4715 +#: partitioning/partbounds.c:4828 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" -msgstr "ハッシュパーティションの剰余は0以上の整数でなければなりません" +msgstr "ハッシュパーティションの剰余は`0以上の整数でなければなりません" -#: partitioning/partbounds.c:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\"はハッシュパーティションテーブルではありません" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "パーティション列の数(%d)と与えられたキー値の数(%d)が一致していません" -#: partitioning/partbounds.c:4772 +#: partitioning/partbounds.c:4885 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" -msgstr "パーティションキーの列%d は%s型です、しかし与えられた値は%s型です" +msgstr "パーティションキーの列%dは%s型です、しかし与えられた値は%s型です" -#: partitioning/partbounds.c:4804 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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" @@ -17232,35 +18125,35 @@ msgstr "" "このエラーはディスクの容量不足を意味していません。このエラーの要因の一つは共有メモリの識別子の枯渇です。この場合はカーネルのSHMMNIパラメータを増やす必要がありますが、そうでなければ要因はシステム全体の共有メモリの制限へ到達となります。\n" "これ以上の共有メモリの設定に関する情報は、PostgreSQLのドキュメントに記載されています。" -#: port/pg_shmem.c:616 port/sysv_shmem.c:616 +#: 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:618 port/sysv_shmem.c:618 +#: 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:686 port/sysv_shmem.c:686 +#: 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:693 port/sysv_shmem.c:693 +#: 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:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1195 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "既存の共有メモリブロック(キー%lu、ID %lu)がまだ使用中です" -#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1197 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." -msgstr "データディレクトリ \"%s\". に対応する古いサーバプロセスをすべて終了させてください。" +msgstr "データディレクトリ \"%s\". に対応する古いサーバープロセスをすべて終了させてください。" #: port/sysv_sema.c:124 #, c-format @@ -17288,37 +18181,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" @@ -17346,7 +18239,7 @@ msgstr "セマフォのロック試行に失敗しました: エラーコード #: 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 user right \"%s\": error code %lu" -msgstr "ユーザー権限\"%s\"を有効にできませんでした: エラーコード %lu" +msgstr "ユーザー権限\"%s\"を有効化できませんでした: エラーコード %lu" #. translator: This is a term from Windows and should be translated to #. match the Windows localization. @@ -17363,12 +18256,12 @@ msgstr "失敗したシステムコールは %s です。" #: port/win32_shmem.c:182 #, c-format msgid "could not enable user right \"%s\"" -msgstr "ユーザー権限\"%s\"を有効にできませんでした" +msgstr "ユーザー権限\"%s\"を有効化できませんでした" #: port/win32_shmem.c:183 #, c-format msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." -msgstr "PostgreSQLを実行するWindowsユーザーアカウントにユーザー権限”%s\"を付与してください。" +msgstr "PostgreSQL を実行するWindowsユーザーアカウントに\"%s\"権限を付与してください。" #: port/win32_shmem.c:241 #, c-format @@ -17405,42 +18298,47 @@ msgstr "失敗したシステムコールはMapViewOfFileExです。" msgid "Failed system call was MapViewOfFileEx." msgstr "失敗したシステムコールはMapViewOfFileExです。" -#: postmaster/autovacuum.c:410 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "自動VACUUM起動プロセスを fork できませんでした: %m" -#: postmaster/autovacuum.c:1492 +#: postmaster/autovacuum.c:752 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "自動VACUUMワーカーの起動に時間がかかりすぎています; キャンセルしました" + +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "自動VACUUMワーカープロセスをforkできませんでした: %m" -#: postmaster/autovacuum.c:2298 +#: postmaster/autovacuum.c:2277 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立した一時テーブル\"%s.%s.%s\"を削除します" -#: postmaster/autovacuum.c:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動VACUUM" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"の作業エントリを処理しています" -#: postmaster/autovacuum.c:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定のため自動VACUUMが起動できません" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効にしてください。" @@ -17448,399 +18346,241 @@ msgstr "\"track_counts\"オプションを有効にしてください。" #: postmaster/bgworker.c:256 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" -msgstr "バックグラウンドワーカーの状態が不整合です (max_worker_processes=%d, total_slots=%d)" +msgstr "バックグラウンドワーカー状態の矛盾 (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:661 +#: 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 workers without shared memory access are not supported" +msgstr "バックグラウンドワーカー\"%s\": 共有メモリアクセスを伴わないバックグラウンドワーカーはサポートされません" -#: postmaster/bgworker.c:670 +#: 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:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "バックグラウンドワーカー\"%s\": 不正な再起動間隔" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "バックグラウンドワーカー\"%s\": パラレルワーカーは再起動するように設定してはいけません" -#: postmaster/bgworker.c:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管理者コマンドによりバックグラウンドワーカー\"%s\"を終了しています" -#: postmaster/bgworker.c:904 +#: 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:916 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "バックグラウンドワーカー\"%s\": 動的バックグラウンドワーカーのみが通知を要求できます" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "バックグラウンドワーカーが多すぎます" -#: 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] "現在の設定では最大%dのバックグラウンドワーカーを登録することができます。" -msgstr[1] "現在の設定では最大%dのバックグラウンドワーカーを登録することができます。" -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "設定パラメータ\"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] "チェックポイントの発生周期が短すぎます(%d秒間隔)" -msgstr[1] "チェックポイントの発生周期が短すぎます(%d秒間隔)" -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "設定パラメータ\"max_wal_size\"を増やすことを検討してください" -#: postmaster/checkpointer.c:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "チェックポイント要求が失敗しました" -#: postmaster/checkpointer.c:1063 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "詳細はサーバーログの最近のメッセージを調査してください" -#: postmaster/pgarch.c:365 +#: postmaster/pgarch.c:423 #, 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:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "孤立したアーカイブステータスファイル\"%s\"を削除しました" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "孤立したアーカイブステータスファイル\"%s\"の削除の失敗回数が上限を超えました、あとでリトライします" -#: postmaster/pgarch.c:433 +#: postmaster/pgarch.c:491 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "先行書き込みログファイル\"%s\"のアーカイブ処理の失敗回数が超過しました、後で再度試します" -#: postmaster/pgarch.c:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "アーカイブコマンドがリターンコード %dで失敗しました" - -#: 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:543 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "アーカイブコマンドが例外0x%Xで終了しました" - -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3758 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" - -#: postmaster/pgarch.c:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "アーカイブコマンドはシグナル%dにより終了しました: %s" - -#: postmaster/pgarch.c:559 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "アーカイブコマンドは認識できないステータス%dで終了しました" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "\"localhost\"を解決できませんでした: %s" - -#: postmaster/pgstat.c:441 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "統計情報コレクタ用の別のアドレスを試みています" - -#: postmaster/pgstat.c:450 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "統計情報コレクタ用のソケットを作成できませんでした: %m" - -#: postmaster/pgstat.c:462 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットをバインドできませんでした: %m" - -#: postmaster/pgstat.c:473 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットからアドレスを入手できませんでした: %m" - -#: postmaster/pgstat.c:489 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットに接続できませんでした: %m" - -#: postmaster/pgstat.c:510 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットに試験メッセージを送信できませんでした: %m" - -#: postmaster/pgstat.c:536 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "統計情報コレクタでselect()が失敗しました: %m" - -#: postmaster/pgstat.c:551 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "統計情報コレクタのソケットから試験メッセージを入手できませんでした" - -#: postmaster/pgstat.c:566 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "統計情報コレクタのソケットから試験メッセージを受信できませんでした: %m" - -#: postmaster/pgstat.c:576 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "統計情報コレクタのソケットでの試験メッセージの送信が不正です" - -#: postmaster/pgstat.c:599 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "統計情報コレクタのソケットを非ブロッキングモードに設定できませんでした: %m" - -#: postmaster/pgstat.c:643 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "作業用ソケットの欠落のため統計情報コレクタを無効にしています" - -#: postmaster/pgstat.c:790 +#: postmaster/pgarch.c:798 #, c-format -msgid "could not fork statistics collector: %m" -msgstr "統計情報コレクタをforkできませんでした: %m" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "\"archive_library\"の値が変更されたためアーカイバプロセスを再起動します" -#: postmaster/pgstat.c:1444 +#: postmaster/pgarch.c:831 #, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "認識できないリセットターゲット: \"%s\"" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "対象は\"archiver\"、\"bgwriter\"、または\"wal\"でなければなりません" - -#: postmaster/pgstat.c:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "統計情報メッセージを読み取れませんでした: %m" - -#: 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:3729 postmaster/pgstat.c:3864 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" - -#: 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: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: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: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:4634 -#, c-format -msgid "statistics collector's time %s is later than backend local time %s" -msgstr "統計情報コレクタの時刻%sがバックエンドのローカル時刻%sよりも進んでいます" +msgid "archive modules have to define the symbol %s" +msgstr "アーカイブモジュールはシンボル%sを定義しなくてはなりません" -#: postmaster/pgstat.c:4657 +#: postmaster/pgarch.c:837 #, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "統計情報コレクタが応答しないため、最新の統計値の替わりに古い値を使用します" +msgid "archive modules must register an archive callback" +msgstr "アーカイブモジュールはアーカイブコールバックを登録しなくてはなりません" -#: postmaster/pgstat.c:4784 -#, c-format -msgid "stats_timestamp %s is later than collector's time %s for database %u" -msgstr "データベース%3$uに関する統計情報のタイムスタンプ%1$sが統計情報コレクタの時刻%2$sより進んでいます" - -#: postmaster/pgstat.c:4997 -#, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "整理処理においてデータベースハッシュテーブルが破損しました --- 中断します" - -#: postmaster/postmaster.c:745 +#: postmaster/postmaster.c:744 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:824 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 不正な引数: \"%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) は max_connections (%d) より小さくなければなりません\n" -#: postmaster/postmaster.c:924 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "wal_levelが\"minimal\"の時はWALアーカイブは有効にできません" -#: 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ストリーミング(max_wal_senders > 0)を行うには wal_levelを\"replica\"または\"logical\"にする必要があります" -#: postmaster/postmaster.c:935 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルが不正です、修復してください\n" -#: postmaster/postmaster.c:1052 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "子キュー向けのI/O終了ポートを作成できませんでした" -#: postmaster/postmaster.c:1128 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力へのログ出力を終了しています" -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "この後のログ出力はログ配送先\"%s\"に出力されます。" -#: postmaster/postmaster.c:1140 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "%s を起動しています" -#: postmaster/postmaster.c:1161 postmaster/postmaster.c:1260 utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "パラメータ\"%s\"のリスト構文が不正です" - -#: postmaster/postmaster.c:1192 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"に関する監視用ソケットを作成できませんでした" -#: postmaster/postmaster.c:1198 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作成できませんでした" -#: postmaster/postmaster.c:1230 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister()が失敗しました: エラーコード %ld" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1343 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"においてUnixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1300 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "監視用に作成するソケットはありません" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1392 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: 外部PIDファイル\"%s\"の権限を変更できませんでした: %s\n" -#: postmaster/postmaster.c:1335 +#: postmaster/postmaster.c:1396 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: 外部PIDファイル\"%s\"に書き出せませんでした: %s\n" -#: postmaster/postmaster.c:1368 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "pg_hba.conf の読み込みができませんでした" -#: postmaster/postmaster.c:1394 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動値処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1395 +#: postmaster/postmaster.c:1450 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用可能なロケールに設定してください。" -#: postmaster/postmaster.c:1490 +#: postmaster/postmaster.c:1551 #, c-format msgid "%s: could not locate my own executable path" -msgstr "%s: 自身の実行ファイルが見つかりませんでした" +msgstr "%s: 自身の実行ファイルのパスが特定できません" -#: postmaster/postmaster.c:1497 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1520 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 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:1547 +#: postmaster/postmaster.c:1608 #, c-format msgid "" "%s: could not find the database system\n" @@ -17851,228 +18591,224 @@ msgstr "" "ディレクトリ\"%s\"にあるものと想定していましたが、\n" "ファイル\"%s\"をオープンできませんでした: %s\n" -#: postmaster/postmaster.c:1724 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "postmasterでselect()が失敗しました: %m" -#: postmaster/postmaster.c:1860 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "手に負えない子プロセスにSIGKILLを送出します" -#: postmaster/postmaster.c:1881 +#: postmaster/postmaster.c:1937 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: postmaster/postmaster.c:2058 +#: postmaster/postmaster.c:2114 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2076 +#: postmaster/postmaster.c:2132 #, c-format msgid "received unencrypted data after SSL request" msgstr "SSL要求の後に非暗号化データを受信しました" -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, 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:2102 +#: postmaster/postmaster.c:2158 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: postmaster/postmaster.c:2120 +#: postmaster/postmaster.c:2176 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" -#: postmaster/postmaster.c:2144 +#: postmaster/postmaster.c:2200 #, 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:2208 utils/misc/guc.c:7126 utils/misc/guc.c:7162 utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11530 utils/misc/guc.c:11571 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 utils/misc/guc.c:7506 utils/misc/guc.c:8944 utils/misc/guc.c:11986 utils/misc/guc.c:12027 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"の値が不正です: \"%s\"" -#: postmaster/postmaster.c:2211 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "有効な値: \"false\", 0, \"true\", 1, \"database\"。" -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2312 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: postmaster/postmaster.c:2273 +#: postmaster/postmaster.c:2329 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザー名は存在しません" -#: postmaster/postmaster.c:2337 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "データベースシステムは起動処理中です" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2399 #, c-format msgid "the database system is not yet accepting connections" msgstr "データベースシステムはまだ接続を受け付けていません" -#: postmaster/postmaster.c:2344 +#: postmaster/postmaster.c:2400 #, c-format msgid "Consistent recovery state has not been yet reached." -msgstr "リカバリは一貫性を確保する時点に到達していません" +msgstr "リカバリの一貫性はまだ確保されていません。" -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2404 #, c-format msgid "the database system is not accepting connections" msgstr "データベースシステムは接続を受け付けていません" -#: postmaster/postmaster.c:2349 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "ホットスタンバイモードは無効です。" -#: postmaster/postmaster.c:2354 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "データベースシステムはシャットダウンしています" -#: postmaster/postmaster.c:2359 +#: postmaster/postmaster.c:2415 #, c-format msgid "the database system is in recovery mode" msgstr "データベースシステムはリカバリモードです" -#: postmaster/postmaster.c:2364 storage/ipc/procarray.c:499 storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "現在クライアント数が多すぎます" -#: postmaster/postmaster.c:2454 +#: postmaster/postmaster.c:2507 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2519 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" -#: postmaster/postmaster.c:2720 +#: postmaster/postmaster.c:2773 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2746 postmaster/postmaster.c:2750 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2760 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2862 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2880 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2904 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2981 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:2999 postmaster/postmaster.c:3035 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:3048 #, c-format msgid "aborting startup due to startup process failure" msgstr "起動プロセスの失敗のため起動を中断しています" -#: postmaster/postmaster.c:3077 +#: postmaster/postmaster.c:3121 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:3098 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:3168 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:3183 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:3198 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:3216 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:3231 -msgid "statistics collector process" -msgstr "統計情報収集プロセス" - -#: postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカー\"%s\"" -#: postmaster/postmaster.c:3393 postmaster/postmaster.c:3413 postmaster/postmaster.c:3420 postmaster/postmaster.c:3438 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "サーバープロセス" -#: postmaster/postmaster.c:3492 +#: postmaster/postmaster.c:3508 #, c-format msgid "terminating any other active server processes" msgstr "他の活動中のサーバープロセスを終了しています" @@ -18096,6 +18832,11 @@ msgstr "失敗したプロセスが実行していました: %s" msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d)は例外%Xで終了しました" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, 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:3766 @@ -18110,531 +18851,432 @@ msgstr "%s (PID %d)はシグナル%dで終了しました: %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3992 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:4030 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" -msgstr "起動プロセスの失敗のためシャットダウンします" +msgstr "起動プロセスの失敗のためシャットダウンしています" -#: postmaster/postmaster.c:4036 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" -msgstr "restart_after_crashがoffであるため、シャットダウンします" +msgstr "restart_after_crashがoffであるためシャットダウンします" -#: postmaster/postmaster.c:4048 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバープロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:4222 postmaster/postmaster.c:5573 postmaster/postmaster.c:5964 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 postmaster/postmaster.c:5920 #, c-format msgid "could not generate random cancel key" msgstr "ランダムなキャンセルキーを生成できませんでした" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4256 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4318 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:4424 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "接続を受け付けました: ホスト=%s ポート番号=%s" -#: postmaster/postmaster.c:4429 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "接続を受け付けました: ホスト=%s" -#: postmaster/postmaster.c:4672 +#: postmaster/postmaster.c:4646 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "サーバープロセス\"%s\"を実行できませんでした: %m" -#: postmaster/postmaster.c:4730 +#: postmaster/postmaster.c:4704 #, c-format msgid "could not create backend parameter file mapping: error code %lu" -msgstr "バックエンドパラメータファイルのマッピングの作成に失敗しました: エラーコード %lu" +msgstr "バックエンドパラメータファイルのファイルマッピングを作成できませんでした: エラーコード%lu" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4713 #, c-format msgid "could not map backend parameter memory: error code %lu" -msgstr "バックエンドパラメータのメモリのマップに失敗しました: エラーコード %lu" +msgstr "バックエンドパラメータのメモリをマップできませんでした: エラーコード %lu" -#: postmaster/postmaster.c:4766 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "サブプロセスのコマンドラインが長すぎます" -#: postmaster/postmaster.c:4784 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "CreateProcess() の呼び出しに失敗しました: %m (エラーコード %lu)" +msgstr "CreateProcess() の呼び出しが失敗しました: %m (エラーコード %lu)" -#: postmaster/postmaster.c:4811 +#: postmaster/postmaster.c:4785 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "バックエンドパラメータファイルのビューのマップ解除に失敗しました: エラーコード %lu" +msgstr "バックエンドパラメータファイルのビューをアンマップできませんでした: エラーコード %lu" -#: postmaster/postmaster.c:4815 +#: postmaster/postmaster.c:4789 #, c-format msgid "could not close handle to backend parameter file: error code %lu" -msgstr "バックエンドパラメータファイルのハンドルのクローズに失敗しました: エラーコード%lu" +msgstr "バックエンドパラメータファイルのハンドルをクローズできませんでした: エラーコード%lu" -#: postmaster/postmaster.c:4837 +#: postmaster/postmaster.c:4811 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "共有メモリの確保のリトライ回数が多すぎるため中断します" -#: postmaster/postmaster.c:4838 +#: postmaster/postmaster.c:4812 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "これはASLRまたはアンチウイルスソフトウェアが原因である可能性があります。" -#: postmaster/postmaster.c:5020 +#: postmaster/postmaster.c:4985 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL構成は子プロセスでは読み込めません" -#: postmaster/postmaster.c:5146 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "これを<%s>まで報告してください。" -#: postmaster/postmaster.c:5233 +#: postmaster/postmaster.c:5182 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:5497 +#: postmaster/postmaster.c:5446 #, c-format msgid "could not fork startup process: %m" msgstr "起動プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5501 +#: postmaster/postmaster.c:5450 #, c-format msgid "could not fork archiver process: %m" msgstr "アーカイバプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5505 +#: postmaster/postmaster.c:5454 #, c-format msgid "could not fork background writer process: %m" msgstr "バックグランドライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5509 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "チェックポイント処理プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5513 +#: postmaster/postmaster.c:5462 #, c-format msgid "could not fork WAL writer process: %m" msgstr "WALライタプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5517 +#: postmaster/postmaster.c:5466 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "WAL 受信プロセスを fork できませんでした: %m" -#: postmaster/postmaster.c:5521 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5722 postmaster/postmaster.c:5745 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, c-format msgid "database connection requirement not indicated during registration" msgstr "登録時にデータベース接続の必要性が示されていません" -#: postmaster/postmaster.c:5729 postmaster/postmaster.c:5752 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, c-format msgid "invalid processing mode in background worker" msgstr "バックグラウンドワーカー内の不正な処理モード" -#: postmaster/postmaster.c:5837 +#: postmaster/postmaster.c:5794 #, c-format msgid "could not fork worker process: %m" msgstr "ワーカープロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:5950 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "新しいワーカープロセスに割り当て可能なスロットがありません" -#: postmaster/postmaster.c:6284 +#: postmaster/postmaster.c:6237 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "バックエンドで使用するためにソケット%dを複製できませんでした: エラーコード %d" -#: postmaster/postmaster.c:6316 +#: postmaster/postmaster.c:6269 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "継承したソケットを作成できませんでした: エラーコード %d\n" -#: postmaster/postmaster.c:6345 +#: postmaster/postmaster.c:6298 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"をオープンできませんでした: %s\n" -#: postmaster/postmaster.c:6352 +#: postmaster/postmaster.c:6305 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "バックエンド変数ファイル\"%s\"から読み取れませんでした: %s\n" -#: postmaster/postmaster.c:6361 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "ファイル\"%s\"を削除できませんでした: %s\n" -#: postmaster/postmaster.c:6378 +#: postmaster/postmaster.c:6331 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6387 +#: postmaster/postmaster.c:6340 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "バックエンド変数のビューをアンマップできませんでした: エラーコード %lu\n" -#: postmaster/postmaster.c:6394 +#: postmaster/postmaster.c:6347 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "バックエンドパラメータ変数のハンドルをクローズできませんでした: エラーコード%lu\n" -#: postmaster/postmaster.c:6556 +#: postmaster/postmaster.c:6506 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:6598 +#: postmaster/postmaster.c:6548 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 -#, c-format -msgid "could not read from logger pipe: %m" -msgstr "ロガーパイプから読み取れませんでした: %m" - -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 -#, c-format -msgid "could not create pipe for syslog: %m" -msgstr "syslog用のパイプを作成できませんでした: %m" - -#: postmaster/syslogger.c:636 -#, c-format -msgid "could not fork system logger: %m" -msgstr "システムロガーをforkできませんでした: %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "ログ出力をログ収集プロセスにリダイレクトしています" - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "ここからのログ出力はディレクトリ\"%s\"に現れます。" - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "標準出力にリダイレクトできませんでした: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "標準エラー出力にリダイレクトできませんでした: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "ログファイルに書き出せませんでした: %s\n" - -#: postmaster/syslogger.c:1225 -#, c-format -msgid "could not open log file \"%s\": %m" -msgstr "ログファイル\"%s\"をオープンできませんでした: %m" - -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 -#, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" - -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "正規表現で使用する照合規則を特定できませんでした" - -#: regex/regc_pg_locale.c:269 -#, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "非決定的照合順序は正規表現ではサポートされていません" - -#: repl_gram.y:345 repl_gram.y:377 -#, c-format -msgid "invalid timeline %u" -msgstr "タイムライン%uは不正です" - -#: repl_scanner.l:149 -msgid "invalid streaming start location" -msgstr "ストリーミングの開始位置が不正です" - -#: repl_scanner.l:205 scan.l:717 -msgid "unterminated quoted string" -msgstr "文字列の引用符が閉じていません" - -#: replication/backup_manifest.c:251 -#, c-format -msgid "expected end timeline %u but found timeline %u" -msgstr "最終タイムライン%uを期待していましたがタイムライン%uが見つかりました" - -#: replication/backup_manifest.c:275 -#, c-format -msgid "expected start timeline %u but found timeline %u" -msgstr "開始タイムライン%uを期待していましたがタイムライン%uが見つかりました" - -#: 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:353 -#, c-format -msgid "could not rewind temporary file" -msgstr "一時ファイルを巻き戻しに失敗しました" - -#: replication/backup_manifest.c:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "一時ファイルからの読み込み失敗しました: %2$zuバイト中%1$zuバイト分のみ読み込みました" - -#: replication/basebackup.c:546 -#, c-format -msgid "could not find any WAL files" -msgstr "WALファイルが全くありません" - -#: replication/basebackup.c:561 replication/basebackup.c:577 replication/basebackup.c:586 +#: postmaster/shell_archive.c:123 #, c-format -msgid "could not find WAL file \"%s\"" -msgstr "WALファイル\"%s\"がありませんでした" +msgid "archive command failed with exit code %d" +msgstr "アーカイブコマンドがリターンコード %dで失敗しました" -#: replication/basebackup.c:629 replication/basebackup.c:659 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "想定しないWALファイルのサイズ\"%s\"" +msgid "The failed archive command was: %s" +msgstr "失敗したアーカイブコマンドは次のとおりです: %s" -#: replication/basebackup.c:644 replication/basebackup.c:1777 +#: postmaster/shell_archive.c:132 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "ベースバックアップがデータを送信できませんでした。バックアップを中止しています" +msgid "archive command was terminated by exception 0x%X" +msgstr "アーカイブコマンドが例外0x%Xで終了しました" -#: replication/basebackup.c:722 +#: postmaster/shell_archive.c:139 #, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] " 合計で %lld個のデータチェックサム検証エラー" -msgstr[1] " 合計で %lld個のデータチェックサム検証エラー" +msgid "archive command was terminated by signal %d: %s" +msgstr "アーカイブコマンドはシグナル%dにより終了しました: %s" -#: replication/basebackup.c:729 +#: postmaster/shell_archive.c:148 #, c-format -msgid "checksum verification failure during base backup" -msgstr "ベースバックアップ中にチェックサム確認が失敗しました" +msgid "archive command exited with unrecognized status %d" +msgstr "アーカイブコマンドは不明のステータス%dで終了しました" -#: 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 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "duplicate option \"%s\"" -msgstr "\"%s\"オプションは重複しています" +msgid "could not read from logger pipe: %m" +msgstr "ロガーパイプから読み取れませんでした: %m" -#: replication/basebackup.c:842 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%dはパラメータ\"%s\"の有効範囲を超えています(%d .. %d)" +msgid "could not create pipe for syslog: %m" +msgstr "syslog用のパイプを作成できませんでした: %m" -#: replication/basebackup.c:887 +#: postmaster/syslogger.c:677 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "認識できない目録オプション: \"%s\"" +msgid "could not fork system logger: %m" +msgstr "システムロガーをforkできませんでした: %m" -#: replication/basebackup.c:903 +#: postmaster/syslogger.c:713 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "認識できないチェックサムアルゴリズム: \"%s\"" +msgid "redirecting log output to logging collector process" +msgstr "ログ出力をログ収集プロセスにリダイレクトしています" -#: replication/basebackup.c:918 +#: postmaster/syslogger.c:714 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "目録のチェックサムにはバックアップ目録が必要です" +msgid "Future log output will appear in directory \"%s\"." +msgstr "ここからのログ出力はディレクトリ\"%s\"に現れます。" -#: replication/basebackup.c:1525 +#: postmaster/syslogger.c:722 #, c-format -msgid "skipping special file \"%s\"" -msgstr "スペシャルファイル\"%s\"をスキップしています" +msgid "could not redirect stdout: %m" +msgstr "標準出力にリダイレクトできませんでした: %m" -#: replication/basebackup.c:1646 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ファイル\"%2$s\"セグメント番号%1$dは不正です" +msgid "could not redirect stderr: %m" +msgstr "標準エラー出力にリダイレクトできませんでした: %m" -#: replication/basebackup.c:1684 +#: postmaster/syslogger.c:1177 #, c-format -msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" -msgstr "ファイル\"%s\"、ブロック%uでチェックサム検証に失敗しました: 読み込みバッファサイズ%dとページサイズ%dが異なっています" +msgid "could not write to log file: %s\n" +msgstr "ログファイルに書き出せませんでした: %s\n" -#: replication/basebackup.c:1757 +#: postmaster/syslogger.c:1295 #, c-format -msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" -msgstr "ファイル\"%s\"のブロック%uでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" +msgid "could not open log file \"%s\": %m" +msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: replication/basebackup.c:1764 +#: postmaster/syslogger.c:1385 #, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" -#: replication/basebackup.c:1822 +#: regex/regc_pg_locale.c:242 #, 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個のチェックサム検証エラーが発生しました" +msgid "could not determine which collation to use for regular expression" +msgstr "正規表現で使用する照合規則を特定できませんでした" -#: replication/basebackup.c:1858 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "非決定的照合順序は正規表現ではサポートされていません" -#: replication/basebackup.c:1863 +#: repl_gram.y:303 repl_gram.y:335 #, c-format -msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "シンボリックリンクのリンク先tarのフォーマットにとって長すぎます: ファイル名 \"%s\", リンク先 \"%s\"" +msgid "invalid timeline %u" +msgstr "タイムライン%uは不正です" + +#: repl_scanner.l:141 +msgid "invalid streaming start location" +msgstr "ストリーミングの開始位置が不正です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: repl_scanner.l:198 scan.l:724 +msgid "unterminated quoted string" +msgstr "文字列の引用符が閉じていません" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "search_pathを消去できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "不正な接続文字列の構文: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "接続文字列をパースできませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "プライマリサーバーからデータベースシステムの識別子とタイムライン ID を受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:371 replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:388 replication/libpqwalreceiver/libpqwalreceiver.c:626 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーバーからの応答が不正です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:389 #, 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:448 replication/libpqwalreceiver/libpqwalreceiver.c:455 replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:469 replication/libpqwalreceiver/libpqwalreceiver.c:476 replication/libpqwalreceiver/libpqwalreceiver.c:506 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ストリーミングを開始できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:530 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリにストリーミングの終了メッセージを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングの終了後の想定外の結果セット" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:568 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:578 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドの結果読み取り中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:587 replication/libpqwalreceiver/libpqwalreceiver.c:825 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete後の想定外の結果: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:614 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "プライマリサーバーからタイムライン履歴ファイルを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:627 #, 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:767 replication/libpqwalreceiver/libpqwalreceiver.c:820 replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:788 replication/libpqwalreceiver/libpqwalreceiver.c:841 replication/libpqwalreceiver/libpqwalreceiver.c:848 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームからデータを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:868 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームにデータを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:960 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1006 #, c-format msgid "invalid query response" msgstr "不正な問い合わせ応答" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1007 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個の列を期待していましたが、%d列を受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1077 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースの動作にはデータベースコネクションが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1108 msgid "empty query" msgstr "空の問い合わせ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1114 msgid "unexpected pipeline mode" -msgstr "想定外のパイプライン状態" +msgstr "想定されていないパイプラインモード" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "max_replication_slots = 0 の時は論理レプリケーションワーカーは起動できません" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" -msgstr "論理レプリケーションワーカーのスロットは全て使用中です" +msgstr "論理レプリケーションワーカースロットは全て使用中です" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "max_logical_replication_workersを増やす必要があるかもしれません。" @@ -18642,7 +19284,7 @@ msgstr "max_logical_replication_workersを増やす必要があるかもしれ #: replication/logical/launcher.c:422 #, c-format msgid "out of background worker slots" -msgstr "バックグラウンドワーカーのスロットが足りません" +msgstr "バックグラウンドワーカースロットが足りません" #: replication/logical/launcher.c:423 #, c-format @@ -18652,12 +19294,12 @@ msgstr "max_worker_processesを増やす必要があるかもしれません" #: replication/logical/launcher.c:577 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" -msgstr "論理レプリケーションワーカーのスロット%dが空いていないため接続できません" +msgstr "論理レプリケーションワーカースロット%dが空いていないため接続できません" #: replication/logical/launcher.c:586 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" -msgstr "論理レプリケーションワーカーのスロット%dが既に他のワーカーに使用されているため接続できません" +msgstr "論理レプリケーションワーカースロット%dが既に他のワーカーに使用されているため接続できません" #: replication/logical/logical.c:115 #, c-format @@ -18674,107 +19316,102 @@ msgstr "論理デコードを行うにはデータベース接続が必要です msgid "logical decoding cannot be used while in recovery" msgstr "リカバリ中は論理デコードは使用できません" -#: 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 "物理レプリケーションスロットを論理デコードに使用するとはできません" -#: 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 "レプリケーションスロット\"%s\"はこのデータベースでは作成されていません" -#: 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 "論理レプリケーションスロットは書き込みを行ったトランザクションの中で生成することはできません" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "スロット\"%s\"の論理デコードを開始します" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, 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:696 +#: replication/logical/logical.c:720 #, 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:702 +#: replication/logical/logical.c:726 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールバックの処理中" -#: replication/logical/logical.c:873 replication/logical/logical.c:918 replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format msgid "logical replication at prepare time requires a %s callback" -msgstr "PREPARE時の論理ストリーミングには%sコールバックが必要です" +msgstr "プリペア時の論理レプリケーションを行うには%sコールバックが必要です" -#: replication/logical/logical.c:1241 replication/logical/logical.c:1290 replication/logical/logical.c:1331 replication/logical/logical.c:1417 replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 replication/logical/logical.c:1355 replication/logical/logical.c:1441 replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" -msgstr "論理ストリーミングには%sコールバックが必要です" +msgstr "論理ストリーミングを行うには%sコールバックが必要です" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, c-format msgid "logical streaming at prepare time requires a %s callback" -msgstr "PREPARE時の論理ストリーミングを行うには%sコールバックが必要です" - -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 -#, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "レプリケーションスロットを使用するためにはスーパーユーザーまたはreplicationロールである必要があります" +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:1128 utils/adt/jsonb.c:1302 #, 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:650 +#: 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 "このスロットは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 "リカバリ中はレプリケーション基点を操作できません" @@ -18786,18 +19423,18 @@ msgstr "レプリケーション基点\"%s\"は存在しません" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "レプリケーション基点OIDの空きがありません" +msgid "could not find free replication origin ID" +msgstr "レプリケーション基点IDの空きがありません" #: 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で使用中です" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "ID%dのレプリケーション基点を削除できません, PID%dで使用中です" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "OIDが%uのレプリケーション基点がありません" +msgid "replication origin with ID %d does not exist" +msgstr "IDが%dのレプリケーション基点がありません" #: replication/logical/origin.c:741 #, c-format @@ -18811,45 +19448,45 @@ msgstr "使用可能なレプリケーションステートが見つかりませ #: replication/logical/origin.c:790 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "ノード%uのリカバリ状態を%X/%Xに復帰しました" +msgid "recovered replication state of node %d to %X/%X" +msgstr "ノード%dのレプリケーション状態を%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: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 "OID%dのレプリケーション基点は既にPID%dで使用中です" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "ID%dのレプリケーション基点は既に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 "OID%uのレプリケーション基点に対するレプリケーション状態スロットの空きがありません" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "ID %dのレプリケーション基点に対するレプリケーション状態スロットの空きがありません" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "max_replication_slotsを増やして再度試してください" -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "既に初期化されている場合はレプリケーション基点の初期化はできません" -#: 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 "レプリケーション基点が構成されていません" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "レプリケーション基点名\"%s\"は予約されています" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "\"pg_\"で始まる基点名は予約されています。" @@ -18868,8 +19505,7 @@ msgstr ", \"%s\"" #, 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[0] "論理レプリケーション先のリレーション\"%s.%s\"は複製された列を失っています: %s" #: replication/logical/relation.c:298 #, c-format @@ -18881,414 +19517,498 @@ msgstr "論理レプリケーションのターゲットリレーション\"%s.% msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は存在しません" -#: replication/logical/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uのためのデータファイルの書き出しに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4180 replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 replication/logical/reorderbuffer.c:4212 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4184 replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 replication/logical/reorderbuffer.c:4216 #, 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:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, 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:637 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "初期スロットスナップショットが大きすぎます" -#: replication/logical/snapbuild.c:691 +#: replication/logical/snapbuild.c:700 #, 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:1370 replication/logical/snapbuild.c:1477 replication/logical/snapbuild.c:2008 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 replication/logical/snapbuild.c:2015 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "論理デコードは一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "実行中のトランザクションはありません。" -#: replication/logical/snapbuild.c:1428 +#: replication/logical/snapbuild.c:1437 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "論理デコードは初期開始点を%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1430 replication/logical/snapbuild.c:1454 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "%2$uより古いトランザクション(おおよそ%1$d個)の完了を待っています" -#: replication/logical/snapbuild.c:1452 +#: replication/logical/snapbuild.c:1461 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "論理デコードは初期の一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1479 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "古いトランザクションはこれ以上はありません" -#: replication/logical/snapbuild.c:1876 +#: replication/logical/snapbuild.c:1883 #, 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:1882 +#: replication/logical/snapbuild.c:1889 #, 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:1953 +#: replication/logical/snapbuild.c:1960 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "スナップショット生成状態ファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/logical/snapbuild.c:2010 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "論理デコードは保存されたスナップショットを使って開始します。" -#: replication/logical/snapbuild.c:2082 +#: replication/logical/snapbuild.c:2089 #, c-format msgid "could not parse file name \"%s\"" msgstr "ファイル名\"%s\"をパースできませんでした" -#: 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 "サブスクリプション\"%s\"、テーブル\"%s\"に対する論理レプリケーションテーブル同期ワーカーが終了しました" -#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 +#: 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:741 replication/logical/tablesync.c:882 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "テーブル\"%s.%s\"のテーブル情報を発行サーバーから取得できませんでした: %s" -#: replication/logical/tablesync.c:734 +#: replication/logical/tablesync.c:748 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "テーブル\"%s.%s\"が発行サーバー上で見つかりませんでした" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:805 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "テーブル\"%s.%s\"の列リスト情報を発行サーバーから取得できませんでした: %s" + +#: replication/logical/tablesync.c:984 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "テーブル\"%s.%s\"のテーブルのテーブルWHERE句を発行サーバーから取得できませんでした: %s" + +#: replication/logical/tablesync.c:1129 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "テーブル\"%s.%s\"の初期内容のコピーを開始できませんでした: %s" -#: replication/logical/tablesync.c:1059 +#: replication/logical/tablesync.c:1341 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "ユーザー\"%s\"は行レベルセキュリティが有効なリレーションへのレプリケーションはできません: \"%s\"" + +#: replication/logical/tablesync.c:1356 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "テーブルコピー中に発行サーバー上でのトランザクション開始に失敗しました: %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1398 #, c-format msgid "replication origin \"%s\" already exists" -msgstr "レプリケーション起源\"%s\"はすでに存在します" +msgstr "レプリケーション基点\"%s\"はすでに存在します" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1411 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "テーブルコピー中に発行サーバー上でのトランザクション終了に失敗しました: %s" -#: replication/logical/worker.c:518 -#, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" -msgstr "レプリケーション先リレーション\"%s.%s\" 列\"%s\"のリモートからのデータの処理中" - -#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#: 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:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" msgstr "ストリーミングトランザクションの変更情報ファイル\"%1$s\"からの読み込みに失敗しました: %3$zuバイト中%2$zuバイト分のみ読み込みました" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "不正な論理レプリケーションのメッセージタイプ \"??? (%d)\"" -#: replication/logical/worker.c:2251 +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "発行サーバーからのデータストリームが終了しました" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, c-format msgid "terminating logical replication worker due to timeout" -msgstr "タイムアウトにより論理レプリケーションワーカーを終了します" +msgstr "タイムアウトにより論理レプリケーションワーカーを終了しています" -#: replication/logical/worker.c:2550 +#: replication/logical/worker.c:3059 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、対応する論理レプリケーション適用ワーカーが停止します" -#: replication/logical/worker.c:2564 +#: replication/logical/worker.c:3070 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、対応する論理レプリケーション適用ワーカーが停止します" -#: replication/logical/worker.c:2586 +#: replication/logical/worker.c:3096 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが再起動します" -#: replication/logical/worker.c:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" msgstr "ストリーミングトランザクションのサブトランザクションファイル\"%1$s\"からの読み込みに失敗しました: %3$zuバイト中%2$zuバイト分のみ読み込みました" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカーが起動しました" -#: replication/logical/worker.c:3170 +#: replication/logical/worker.c:3679 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが起動しました" -#: replication/logical/worker.c:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "サブスクリプション\"%s\"はエラーのため無効化されました" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "論理レプリケーションは%X/%Xででトランザクションのスキップを開始します" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "論理レプリケーションは%X/%Xでトランザクションのスキップを完了しました" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "サブスクリプションの\"%s\"スキップLSNをクリアしました" + +#: replication/logical/worker.c:3992 +#, 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:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "メッセージタイプ \"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "トランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "%4$X/%5$Xで終了したトランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "%6$X/%7$Xで終了したトランザクション%5$u中、レプリケーション先リレーション\"%3$s.%4$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "%7$X/%8$Xで終了したトランザクション%6$u中、レプリケーション先リレーション\"%3$s.%4$s\"、列\"%5$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "不正なproto_version" -#: replication/pgoutput/pgoutput.c:201 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\"は範囲外です" -#: replication/pgoutput/pgoutput.c:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "publication_namesの構文が不正です" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, 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:295 +#: replication/pgoutput/pgoutput.c:432 #, 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:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "publication_namesパラメータが指定されていません" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" -msgstr "要求されたproto_version=%dはストリーミングをサポートしていません、バージョン%d以上が必要です" +msgstr "要求されたproto_version=%dではストリーミングをサポートしていません、%d以上が必要です" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" -msgstr "ストリーミングが要求されましたが、出力プラグインではサポートされていません" +msgstr "ストリーミングが要求されましたが、出力プラグインでサポートされていません" + +#: replication/pgoutput/pgoutput.c:473 +#, 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:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "2相コミットが要求されました、しかし出力プラグインではサポートされていません" -#: replication/slot.c:180 +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "レプリケーションスロット名\"%s\"は短すぎます" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "レプリケーションスロット名\"%s\"は長すぎます" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "レプリケーションスロット名\"%s\"は不正な文字を含んでいます" -#: replication/slot.c:204 +#: replication/slot.c:229 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "レプリケーションスロット名は小文字、数字とアンダースコアのみを含むことができます。" -#: replication/slot.c:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "レプリケーションスロット\"%s\"はすでに存在します" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "レプリケーションスロットは全て使用中です" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "どれか一つを解放するか、max_replication_slots を大きくしてください。" -#: replication/slot.c:402 replication/slotfuncs.c:761 utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "レプリケーションスロット\"%s\"はPID%dで使用中です" -#: replication/slot.c:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "レプリケーションスロットは max_replication_slots > 0 のときだけ使用できます" -#: replication/slot.c:1065 +#: replication/slot.c:1133 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "レプリケーションスロットは wal_level >= replica のときだけ使用できます" -#: replication/slot.c:1250 +#: replication/slot.c:1145 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "レプリケーションスロットを使用するためにはスーパーユーザーまたはreplicationロールである必要があります" + +#: replication/slot.c:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "プロセス%dを終了してレプリケーションスロット\"%s\"を解放します" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, 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:1747 +#: replication/slot.c:1827 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"はサポート外のバージョン%uです" -#: replication/slot.c:1754 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"のサイズ%uは異常です" -#: replication/slot.c:1790 +#: replication/slot.c:1870 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "レプリケーションスロットファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/slot.c:1824 +#: replication/slot.c:1904 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "論理レプリケーションスロット\"%s\"がありますが、wal_level < logical です" -#: replication/slot.c:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "wal_level を logical もしくはそれより上位の設定にしてください。" -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "物理レプリケーションスロット\"%s\"がありますが、wal_level < replica です" -#: replication/slot.c:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "wal_level を replica もしくはそれより上位の設定にしてください。" -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウン前のアクティブなレプリケーションスロットの数が多すぎます" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "不正な目標WAL LSN" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "レプリケーションスロット\"%s\"は進められません" -#: replication/slotfuncs.c:666 +#: 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:773 +#: replication/slotfuncs.c:739 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "物理レプリケーションスロット\"%s\"を論理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "論理レプリケーションスロット\"%s\"を物理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "WAL の留保をしていないレプリケーションスロットはコピーできません" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"をコピーできませんでした" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "コピー処理中にコピー元のレプリケーションスロットが非互換的に変更されました。" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "未完成の論理レプリケーションスロット\"%s\"はコピーできません" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "このソースレプリケーションスロットの confirmed_flush_lsn が有効値になってから再度実行してください。" @@ -19329,412 +20049,422 @@ msgstr "synchronous_standby_names の読み取りに失敗しました" msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "同期スタンバイの数(%d)は1以上である必要があります" -#: replication/walreceiver.c:161 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "管理者コマンドにより WAL 受信プロセスを終了しています" -#: replication/walreceiver.c:289 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "プライマリサーバーへの接続ができませんでした: %s" -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "データベースシステムの識別子がプライマリサーバーとスタンバイサーバー間で異なります" -#: replication/walreceiver.c:337 +#: 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:348 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "プライマリの最大のタイムライン%uが、リカバリのタイムライン %uより遅れています" -#: replication/walreceiver.c:402 +#: 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:406 +#: 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:435 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "WAL ストリーミングを継続できません。リカバリはすでに終わっています。" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "プライマリサーバーによりレプリケーションが打ち切られました" -#: replication/walreceiver.c:473 +#: 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:562 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "レプリケーションタイムアウトによりwalreceiverを終了しています" -#: replication/walreceiver.c:600 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "プライマリサーバーには要求されたタイムライン%u上にこれ以上WALがありません" -#: replication/walreceiver.c:616 replication/walreceiver.c:1036 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "ログセグメント%sをクローズできませんでした: %m" -#: replication/walreceiver.c:735 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "プライマリサーバーからライムライン%u用のタイムライン履歴ファイルを取り込みしています" -#: replication/walreceiver.c:927 +#: 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "%sは論理レプリケーションスロットでは使用できません" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "ファイル\"%s\"の終端へシークできませんでした: %m" -#: replication/walsender.c:529 +#: replication/walsender.c:642 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "ファイル\"%s\"の先頭にシークできませんでした: %m" -#: replication/walsender.c:580 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "IDENTIFY_SYSTEM が START_REPLICATION の前に実行されていません" - -#: replication/walsender.c:609 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "論理レプリケーションスロットは物理レプリケーションには使用できません" -#: replication/walsender.c:678 +#: replication/walsender.c:785 #, 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:681 +#: replication/walsender.c:788 #, 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:832 #, 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:1015 +#, 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:975 +#: replication/walsender.c:1100 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sはトランザクション内では呼び出せません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:985 +#: replication/walsender.c:1110 #, c-format msgid "%s must be called inside a transaction" msgstr "%sはトランザクション内で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:991 +#: replication/walsender.c:1116 #, 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:997 +#: replication/walsender.c:1122 #, c-format msgid "%s must be called before any query" msgstr "%s は問い合わせの実行前に呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"は読み込めません" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "最大留保量を超えたため、このスロットは無効化されています。" -#: replication/walsender.c:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WAL送信プロセスが停止モードの間は新しいコマンドを実行できません" -#: replication/walsender.c:1587 +#: replication/walsender.c:1739 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" -#: replication/walsender.c:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 tcop/postgres.c:2614 tcop/postgres.c:2692 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, 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:951 +#, 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 "代わりにビューかトリガーを使用してください。" +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 "代わりにトリガーを使用してください。" +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句にデータを変更する文を含むことはできません" +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:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "パーティションテーブル\"%s\"はビューに変換できませんでした" +msgstr "パーティション親テーブル\"%s\"はビューに変換できませんでした" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "パーティション子テーブル\"%s\"はビューに変換できませんでした" -#: 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 "空ではないため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "トリガーを持っているため、テーブル\"%s\"をビューに変換できませんでした" +msgstr "トリガを持っているため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "特に、このテーブルは一切の外部キー関係に組み込むことはできません。" -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "インデックスを持っているためテーブル\"%s\"をビューに変換できませんでした" -#: 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 "子テーブルを持っているためテーブル\"%s\"をビューに変換できませんでした" -#: 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 "親テーブルが存在するためテーブル\"%s\"をビューに変換できませんでした" -#: 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 "行レベルセキュリティが有効になっているため、テーブル\"%s\"をビューに変換できませんでした" -#: 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 "行レベルセキュリティポリシがあるため、テーブル\"%s\"をビューに変換できませんでした" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "ルールは複数のRETURNINGリストを持つことができません" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "条件付のルールではRETURNINGリストはサポートされません" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "INSTEAD以外のルールではRETURNINGリストはサポートされません" -#: rewrite/rewriteDefine.c:543 +#: rewrite/rewriteDefine.c:544 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "\"%s\"に対するビュー以外のルールの名前は\"%s\"にはできません" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECTルールのターゲットリストの要素が多すぎます" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNINGリストの要素が多すぎます" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "削除された列を持つリレーションをビューに変換できませんでした" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "削除された列を持つリレーションにRETURNINGリストを生成することはできませんでした" -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECTルールのターゲットエントリ%dは列\"%s\"とは異なる列名を持っています" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECTのターゲットエントリは\"%s\"と名付けられています。" -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECTルールの対象項目%dは\"%s\"と異なる列型を持っています" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:754 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNINGリスト項目%dは\"%s\"と異なる列型を持っています" -#: rewrite/rewriteDefine.c:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECTのターゲットエントリの型は%sですが、列の型は%sです。" -#: rewrite/rewriteDefine.c:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNINGリストの要素の型は%sですが、列の型は%sです。" -#: rewrite/rewriteDefine.c:775 +#: rewrite/rewriteDefine.c:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECTルールの対象項目%dは\"%s\"と異なる列のサイズを持っています" -#: rewrite/rewriteDefine.c:777 +#: rewrite/rewriteDefine.c:778 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNINGリスト項目%dは\"%s\"と異なる列のサイズを持っています" -#: rewrite/rewriteDefine.c:794 +#: rewrite/rewriteDefine.c:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECTルールのターゲットリストの項目が少なすぎます" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNINGリストの項目が少なすぎます" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません" -#: rewrite/rewriteDefine.c:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールの名前を変更することはできません" @@ -19757,7 +20487,7 @@ msgstr "複数ルールではRETURNINGリストを持つことはできません #: rewrite/rewriteHandler.c:888 rewrite/rewriteHandler.c:927 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" -msgstr "列\"%s\"へはDEFAULT以外の値の挿入はできません" +msgstr "列\"%s\"への非デフォルト値の挿入はできません" #: rewrite/rewriteHandler.c:890 rewrite/rewriteHandler.c:956 #, c-format @@ -19779,156 +20509,156 @@ msgstr "列\"%s\"はDEFAULTにのみ更新可能です" msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2224 +#: rewrite/rewriteHandler.c:2228 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2552 +#: rewrite/rewriteHandler.c:2556 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2555 +#: rewrite/rewriteHandler.c:2559 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2647 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2646 +#: rewrite/rewriteHandler.c:2650 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2649 +#: rewrite/rewriteHandler.c:2653 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2656 rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 rewrite/rewriteHandler.c:2672 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "単一のテーブルまたはビューからselectしていないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3172 +#: rewrite/rewriteHandler.c:3176 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3184 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3665 +#: rewrite/rewriteHandler.c:3675 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" -msgstr "WITH句内のデータを変更する文では DO INSTEAD NOTIFY ルールはサポートされません" +msgstr "DO INSTEAD NOTIFYルールはWITH内のデータ更新文に対してはサポートされません" -#: rewrite/rewriteHandler.c:3676 +#: rewrite/rewriteHandler.c:3686 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" -msgstr "WITH句内のデータを変更する文では DO INSTEAD NOTHING ルールはサポートされません" +msgstr "WITH にデータを変更するステートメントがある場合は DO INSTEAD NOTHING ルールはサポートされません" -#: rewrite/rewriteHandler.c:3690 +#: rewrite/rewriteHandler.c:3700 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" -msgstr "WITH句内のデータを変更する文では、条件付き DO INSTEAD ルールはサポートされません" +msgstr "WITH にデータを変更するステートメントがある場合は、条件付き DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3694 +#: rewrite/rewriteHandler.c:3704 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" -msgstr "WITH句内のデータを変更する文では DO ALSO ルールはサポートされません" +msgstr "WITH にデータを変更するステートメントがある場合は DO ALSO ルールはサポートされません" -#: rewrite/rewriteHandler.c:3699 +#: rewrite/rewriteHandler.c:3709 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" -msgstr "WITH句内のデータを変更する文ではマルチステートメントの DO INSTEAD ルールはサポートされません" +msgstr "WITH にデータを変更するステートメントがある場合はマルチステートメントの DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3929 rewrite/rewriteHandler.c:3937 rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 rewrite/rewriteHandler.c:3992 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:4050 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, 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:4141 +#: rewrite/rewriteHandler.c:4188 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数問い合わせに対するルールにより書き換えられた問い合わせでは WITH を使用できません" @@ -19953,101 +20683,109 @@ msgstr "ON UPDATE ルールのNEW変数は、対象のUPDATEコマンドでの 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:458 +#: 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" +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'を使用してください。" @@ -20077,57 +20815,57 @@ msgstr "認識できないSnowballパラメータ: \"%s\"" msgid "missing Language parameter" msgstr "Languageパラメータがありません" -#: statistics/extended_stats.c:178 +#: 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:1371 utils/adt/jsonfuncs.c:1952 +#: statistics/mcv.c:1372 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: storage/buffer/bufmgr.c:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "他のセッションの一時テーブルにはアクセスできません" -#: storage/buffer/bufmgr.c:843 +#: storage/buffer/bufmgr.c:851 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "リレーション\"%s\"を%uブロックを超えて拡張できません" -#: storage/buffer/bufmgr.c:930 +#: storage/buffer/bufmgr.c:938 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "リレーション %2$s の %1$u ブロック目で、EOF の先に想定外のデータを検出しました" -#: storage/buffer/bufmgr.c:932 +#: storage/buffer/bufmgr.c:940 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "これはカーネルの不具合で発生した模様です。システムの更新を検討してください。" -#: storage/buffer/bufmgr.c:1031 +#: storage/buffer/bufmgr.c:1039 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "リレーション %2$s の %1$u ブロック目のページが不正です: ページをゼロで埋めました" -#: storage/buffer/bufmgr.c:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s に書き出せませんでした" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗しました ---ずっと書き込みエラーが続くかもしれません。" -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "ブロック %u を リレーション %s に書き込んでいます" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "スナップショットが古すぎます" @@ -20142,147 +20880,172 @@ msgstr "利用できる、空のローカルバッファがありません" msgid "cannot access temporary tables during a parallel operation" msgstr "並列処理中は一時テーブルにはアクセスできません" -#: storage/file/buffile.c:323 +#: 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: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 "BufFile \"%s\"の一時ファイル\"%s\"のサイズの確認に失敗しました: %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "共有ファイルセット\"%s\"を削除できませんでした: %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "ファイルセット\"%s\"を削除できませんでした: %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, 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 +#: 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:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "ダーティーデータのサイズを特定できませんでした: %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "データの書き出し中にmunmap()に失敗しました: %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"から\"%s\"へのリンクができませんでした: %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimitが失敗しました: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "サーバープロセスを起動させるために利用できるファイル記述子が不足しています" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "システムでは%d使用できますが、少なくとも%d必要です" -#: storage/file/fd.c:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 storage/file/fd.c:2677 +#: 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:1453 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "一時ファイル: パス \"%s\"、サイズ %lu" -#: storage/file/fd.c:1584 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "一時ディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1591 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "一時サブディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1784 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1818 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: storage/file/fd.c:1859 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を unlink できませんでした: %m" -#: storage/file/fd.c:1947 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: storage/file/fd.c:2127 +#: 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:2392 storage/file/fd.c:2451 +#: 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:2496 +#: 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:2653 +#: 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:3183 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "一時ファイル用ディレクトリに想定外のファイルがありました: \"%s\"" -#: storage/file/fd.c:3312 +#: 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" +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:144 +#: storage/file/sharedfileset.c:79 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" -msgstr "すでに破棄されているSharedFileSetには接続できません" +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 "動的共有メモリセグメントが多すぎます" @@ -20332,37 +21095,42 @@ msgstr "共有メモリセグメント\"%s\"を作成できませんでした: % msgid "could not close shared memory segment \"%s\": %m" msgstr "共有メモリセグメント\"%s\"をクローズできませんでした: %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "\"%s\"のハンドルの複製ができませんでした: %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3845 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "データベース\"%s\"は準備済みトランザクションで使用中です" -#: storage/ipc/procarray.c:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3877 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "スーパーユーザーのプロセスを終了させるにはスーパーユーザーである必要があります" -#: storage/ipc/procarray.c:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3884 storage/ipc/signalfuncs.c:236 #, 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_mq.c:368 +#: storage/ipc/procsignal.c:419 +#, c-format +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "PID %luのバックエンドがProcSignalBarrierを受け付けるのを待っています" + +#: storage/ipc/shm_mq.c:384 #, c-format msgid "cannot send a message of size %zu via shared memory queue" -msgstr "サイズ%zuのメッセージは共有メモリキューを経由して送信できません" +msgstr "共有メモリキュー経由で大きさ%zuのメッセージは送信できません" -#: storage/ipc/shm_mq.c:694 +#: storage/ipc/shm_mq.c:719 #, c-format msgid "invalid message size %zu in shared memory queue" -msgstr "共有メモリキューで不正なメッセージサイズ%zu" +msgstr "共有メモリキュー内の不正なメッセージ長%zu" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:962 storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "共有メモリが足りません" @@ -20392,82 +21160,81 @@ msgstr "データ構造体\"%s\"のための共有メモリが不足していま msgid "requested shared memory size overflows size_t" msgstr "要求された共有メモリのサイズはsize_tを超えています" -#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 +#: 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:99 storage/lmgr/proc.c:1460 utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1442 utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "プロセス%dにシグナルを送信できませんでした: %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "スーパーユーザーの問い合わせをキャンセルするにはスーパーユーザーである必要があります" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:134 #, 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 +#: storage/ipc/signalfuncs.c:175 #, c-format msgid "could not check the existence of the backend with PID %d: %m" -msgstr "PID %d のバックエンドの存在の確認ができませんでした: %m" +msgstr "PID %dのバックエンドの存在の確認に失敗しました: %m" -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:193 #, 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[0] "PID %dのバックエンドが%lldミリ秒で終了しませんでした" -#: storage/ipc/signalfuncs.c:214 +#: storage/ipc/signalfuncs.c:224 #, c-format msgid "\"timeout\" must not be negative" -msgstr "\"timeout\"に負数は指定できません" +msgstr "\"timeout\"は負数であってはなりません" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:276 #, 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:268 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:278 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "代わりにコアの一部である %s の使用を検討してください。" -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:284 storage/ipc/signalfuncs.c:304 #, c-format msgid "rotation not possible because log collection not active" msgstr "ログ収集が活動していませんのでローテーションを行うことができません" -#: storage/ipc/standby.c:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" -msgstr "リカバリ処理は%ld.%03dミリ秒待機中です: %s" +msgstr "リカバリは%ld.%03dミリ秒経過後待機継続中: %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" -msgstr "リカバリ処理の待機は%ld.%03dミリ秒経過後解除されました: %s" +msgstr "リカバリは%ld.%03dミリ秒で待機終了: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカバリで競合が発生したためステートメントをキャンセルしています" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカバリ時にユーザーのトランザクションがバッファのデッドロックを引き起こしました。" #: storage/ipc/standby.c:1423 msgid "unknown reason" -msgstr "原因不明" +msgstr "不明な理由" #: storage/ipc/standby.c:1428 msgid "recovery conflict on buffer pin" @@ -20475,11 +21242,11 @@ msgstr "バッファピンによるリカバリ競合" #: storage/ipc/standby.c:1431 msgid "recovery conflict on lock" -msgstr "ロック上でのリカバリ衝突" +msgstr "ロック上のリカバリ衝突" #: storage/ipc/standby.c:1434 msgid "recovery conflict on tablespace" -msgstr "テーブル空間上でのリカバリ衝突" +msgstr "テーブル空間上のリカバリ衝突" #: storage/ipc/standby.c:1437 msgid "recovery conflict on snapshot" @@ -20491,7 +21258,7 @@ msgstr "バッファのデッドロックによるリカバリ競合" #: storage/ipc/standby.c:1443 msgid "recovery conflict on database" -msgstr "データベース上でのリカバリ衝突" +msgstr "データベース上のリカバリ衝突" #: storage/large_object/inv_api.c:191 #, c-format @@ -20533,122 +21300,122 @@ msgstr "デッドロックを検出しました" msgid "See server log for query details." msgstr "問い合わせの詳細はサーバーログを参照してください" -#: storage/lmgr/lmgr.c:831 +#: 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:834 +#: 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:837 +#: 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:840 +#: 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:843 +#: 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:846 +#: 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:849 +#: 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:852 +#: 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:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "データベース%2$uのリレーション%1$u" -#: storage/lmgr/lmgr.c:1113 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "データベース%2$uのリレーション%1$uの拡張" -#: storage/lmgr/lmgr.c:1119 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "データベース%uのpg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1124 +#: 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:1131 +#: 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:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "トランザクション %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "仮想トランザクション %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "トランザクション%2$uの投機的書き込みトークン%1$u" -#: storage/lmgr/lmgr.c:1156 +#: 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:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "ユーザーロック[%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "アドバイザリ・ロック[%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "ロックタグタイプ%dは不明です" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "リカバリの実行中はデータベースオブジェクトでロックモード %s を獲得できません" -#: storage/lmgr/lock.c:792 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "リカバリの実行中は、データベースオブジェクトで RowExclusiveLock もしくはそれ以下だけが獲得できます" -#: storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "max_locks_per_transactionを増やす必要があるかもしれません" -#: storage/lmgr/lock.c:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "同一オブジェクト上にセッションレベルとトランザクションレベルのロックの両方を保持している時にPREPAREすることはできません" @@ -20668,72 +21435,72 @@ msgstr "トランザクションの同時実行数を減らすか max_connection msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "RWConflictPoolに読み書き競合の可能性を記録するための要素が不足しています" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\"が\"serializable\"に設定されました。" -#: 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 "このデフォルトを変更するためには\"SET default_transaction_isolation = 'repeatable read'\"を使用することができます。" -#: storage/lmgr/predicate.c:1746 +#: 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:1825 utils/time/snapmgr.c:569 utils/time/snapmgr.c:575 +#: 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:1826 utils/time/snapmgr.c:576 +#: 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:2484 storage/lmgr/predicate.c:2499 storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 storage/lmgr/predicate.c:3991 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "max_pred_locks_per_transaction を増やす必要があるかもしれません" -#: storage/lmgr/predicate.c:4120 storage/lmgr/predicate.c:4156 storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 +#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "トランザクション間で read/write の依存性があったため、アクセスの直列化ができませんでした" -#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 #, c-format msgid "The transaction might succeed if retried." msgstr "リトライが行われた場合、このトランザクションは成功するかもしれません" -#: 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 "要求されたスタンバイ接続が max_wal_senders を超えています(現在は %d)" -#: storage/lmgr/proc.c:1557 +#: storage/lmgr/proc.c:1539 #, 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:1572 +#: storage/lmgr/proc.c:1554 #, 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:1581 +#: storage/lmgr/proc.c:1563 #, 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:1588 +#: storage/lmgr/proc.c:1570 #, 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:1605 +#: storage/lmgr/proc.c:1587 #, 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を獲得することに失敗しました" @@ -20743,82 +21510,77 @@ msgstr "プロセス%1$dは%4$ld.%5$03d ms後に%3$s上で%2$sを獲得するこ msgid "page verification failed, calculated checksum %u but expected %u" msgstr "ページ検証が失敗しました。計算されたチェックサムは%uですが想定は%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 "ページポインタが破損しています: lower = %u, upper = %u, special = %u\"" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "ラインポインタが破損しています: %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 "アイテム長が破損しています: 合計 %u 利用可能空間 %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 "ラインポインタが破損しています: オフセット = %u サイズ = %u" -#: storage/smgr/md.c:438 +#: storage/smgr/md.c:473 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "ファイル\"%s\"を%uブロック以上に拡張できません" -#: storage/smgr/md.c:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "ファイル\"%s\"を拡張できませんでした: %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "ディスクの空き容量をチェックしてください。" - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックを読み取れませんでした: %3$m" -#: storage/smgr/md.c:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした: %3$m" -#: storage/smgr/md.c:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "ファイル\"%s\"を%uブロックに切り詰められませんでした: %m" -#: storage/smgr/md.c:1289 +#: storage/smgr/md.c:1332 #, 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:1303 +#: storage/smgr/md.c:1346 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "ファイル \"%s\"(対象ブロック %u)をオープンできませんでした: %m" @@ -20833,7 +21595,7 @@ msgstr "関数\"%s\"は高速呼び出しインタフェースでの呼び出し msgid "fastpath function call: \"%s\" (OID %u)" msgstr "近道関数呼び出し: \"%s\"(OID %u))" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "期間: %s ミリ秒" @@ -20863,150 +21625,150 @@ msgstr "関数呼び出しメッセージ内の引数サイズ%dが不正です" msgid "incorrect binary data format in function argument %d" msgstr "関数引数%dのバイナリデータ書式が不正です" -#: tcop/postgres.c:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dが不正です" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "文: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 文: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備された文に複数のコマンドを挿入できません" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "無名の準備された文が存在しません" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "バインドメッセージは%dパラメータ書式ありましたがパラメータは%dでした" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "バインドメッセージは%dパラメータを提供しましたが、準備された文\"%s\"では%d必要でした" -#: tcop/postgres.c:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "バインドパラメータ%dにおいてバイナリデータ書式が不正です" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 バインド %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "ポータル\"%s\"は存在しません" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "取り出し実行" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "期間: %s ミリ秒 %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "異常終了の理由: リカバリが衝突したため" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザーが共有バッファ・ピンを長く保持し過ぎていました" -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザーリレーションのロックを長く保持し過ぎていました" -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除されるべきテーブルスペースをユーザーが使っていました(もしくはその可能性がありました)。" -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除されるべきバージョンの行をユーザー問い合わせが参照しなければならなかった可能性がありました。" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2502 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除されるべきデータベースにユーザーが接続していました。" -#: tcop/postgres.c:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" -msgstr "ポータル\"%s\" パラメータ $%d = %s" +msgstr "ポータル\"%s\" パラメータ$%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" -msgstr "ポータル\"%s\"パラメータ $%d" +msgstr "ポータル\"%s\" パラメータ $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" -msgstr "無名ポータル パラメータ $%d = %s" +msgstr "無名ポータルパラメータ $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" -msgstr "無名ポータル パラメータ $%d" +msgstr "無名ポータルパラメータ $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" -msgstr "予期しないSIGUITシグナルのため接続を終了します" +msgstr "予期しないSIGQUITシグナルによりコネクションを終了します" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "他のサーバープロセスがクラッシュしたため接続を終了します" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, 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 "" @@ -21014,200 +21776,200 @@ msgstr "" "postmasterはこのサーバープロセスに対し、現在のトランザクションをロールバック\n" "し終了するよう指示しました。" -#: tcop/postgres.c:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "この後、データベースに再接続し、コマンドを繰り返さなければなりません。" -#: tcop/postgres.c:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" -msgstr "即時シャットダウンコマンドにより接続を終了します" +msgstr "即時シャットダウンコマンドによりコネクションを終了します" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "浮動小数点例外" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトにより認証処理をキャンセルしています" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管理者コマンドにより自動VACUUM処理を終了しています" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管理者コマンドにより、論理レプリケーションワーカーを終了します" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "リカバリで競合が発生したため、接続を終了しています" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "管理者コマンドにより接続を終了しています" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "クライアントへの接続が切れました。" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処理をキャンセルしています" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "ユーザーからの要求により文をキャンセルしています" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトのため接続を終了します" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" -msgstr "アイドルセッションタイムアウトのため接続を終了します" +msgstr "アイドルセッションタイムアウトにより接続を終了します" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "スタック長制限を越えました" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, 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:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\"は%ldkBを越えてはなりません。" -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "プラットフォームのスタック長制限を\"ulimit -s\"または同等の機能を使用して増加してください" -#: tcop/postgres.c:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーバープロセスに対する不正なコマンドライン引数: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." -msgstr "詳細は\"%s --help\"で確認してください。" +msgstr "詳細は\"%s --help\"を実行してください。" -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 不正なコマンドライン引数: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベース名もユーザー名も指定されていません" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "不正なCLOSEメッセージのサブタイプ%d" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "不正なDESCRIBEメッセージのサブタイプ%d" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続では高速関数呼び出しはサポートされていません" -#: tcop/postgres.c:4768 +#: tcop/postgres.c:4853 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続では拡張問い合わせプロトコルはサポートされていません" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:5030 #, 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:638 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "バインドメッセージは%dの結果書式がありましたが、問い合わせは%d列でした" -#: tcop/pquery.c:941 tcop/pquery.c:1703 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "カーゾルは前方へのスキャンしかできません" -#: tcop/pquery.c:942 tcop/pquery.c:1704 +#: 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:414 +#: 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:432 +#: 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:451 +#: 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:469 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" -msgstr "セキュリティー制限された処理中は %s を実行できません" +msgstr "セキュリティー制限操作の中では %s を実行できません" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, c-format msgid "cannot execute %s within a background process" msgstr "バックグラウンドプロセス内で%sを実行することはできません" -#: tcop/utility.c:945 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "CHECKPOINTを実行するにはスーパーユーザーである必要があります" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "CHECKPOINTを実行するにはスーパーユーザーであるか、またはpg_checkpointの権限を持つ必要があります" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -21354,12 +22116,12 @@ msgstr "\"long\"フラグ値を伴った不正な接辞フラグ\"%s\"" msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "正規表現が不正です: %s" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "不正な接辞の別名 \"%s\"" @@ -21389,17 +22151,17 @@ msgstr "別名の数が指定された数 %d を超えています" msgid "affix file contains both old-style and new-style commands" msgstr "接辞ファイルが新旧両方の形式のコマンドを含んでいます" -#: 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 "TSベクターのための文字列が長すぎます(%dバイト、最大は%dバイト)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "設定ファイル\"%2$s\"の%1$d行目: \"%3$s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "wchar_tからサーバー符号化方式への変換が失敗しました: %m" @@ -21429,142 +22191,192 @@ msgstr "ストップワードファイル\"%s\"をオープンできませんで msgid "text search parser does not support headline creation" msgstr "テキスト検索パーサは見出し作成をサポートしません" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "認識できない見出しパラメータ: \"%s\"" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWordsはMaxWordsより小さくなければなりません" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "MinWordsは正でなければなりません" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWordは>= 0でなければなりません" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments は 0 以上でなければなりません" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "永続統計情報ファイル\"%s\"をunlinkできませんでした: %m" + +#: utils/activity/pgstat.c:1226 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "不正な統計情報種別: \"%s\"" + +#: utils/activity/pgstat.c:1306 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" + +#: utils/activity/pgstat.c:1421 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" + +#: utils/activity/pgstat.c:1429 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" + +#: utils/activity/pgstat.c:1478 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" + +#: utils/activity/pgstat.c:1634 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "統計情報ファイル\"%s\"が破損しています" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "削除された関数の呼び出し" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "種類%s、db=%u、oid=%uの既存統計情報をリセットします" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "識別子が長すぎます" -#: 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 "識別子は%d文字より短くなければなりません。" -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "キーワードが不明です: \"%s\"" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACLキーワードは\"group\"または\"user\"でなければなりません。" -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "名前がありません" -#: utils/adt/acl.c:256 +#: 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:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "\"=\"記号がありません" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "不正なモード文字: \"%s\"の一つでなければなりません" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "\"/\"記号の後には名前が必要です" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "権限付与者をデフォルトのユーザーID %uにしています" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL配列に不正なデータ型があります。" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL配列は1次元の配列でなければなりません" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL配列にはNULL値を含めてはいけません" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" -msgstr "ACL指定の後に余計なゴミがあります" +msgstr "ACL指定の後に余計なごみがあります" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "グラントオプションでその権限付与者に権限を戻すことはできません" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "依存する権限が存在します" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "これらも取り上げるにはCASCADEを使用してください" -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsertはもうサポートされていません" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremoveはもうサポートされていません" -#: 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 "権限タイプが不明です: \"%s\"" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: 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:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "ロール\"%s\"のメンバでなければなりません" -#: 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: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:1114 utils/adt/jsonb.c:1143 utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "入力データ型を特定できませんでした" @@ -21574,8 +22386,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/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:4231 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 utils/adt/varlena.c:3422 +#: 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:777 utils/adt/int.c:799 utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 utils/adt/int.c:1262 +#: utils/adt/int.c:1330 utils/adt/int.c:1336 utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "integerの範囲外です" @@ -21620,226 +22432,226 @@ msgstr "多次元配列内の要素の検索はサポートされません" msgid "initial position must not be null" msgstr "初期位置nullであってはなりません" -#: 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 +#: utils/adt/arrayfuncs.c:272 utils/adt/arrayfuncs.c:286 utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:319 utils/adt/arrayfuncs.c:334 utils/adt/arrayfuncs.c:348 utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:521 utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:594 utils/adt/arrayfuncs.c:602 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:659 utils/adt/arrayfuncs.c:679 utils/adt/arrayfuncs.c:791 utils/adt/arrayfuncs.c:800 utils/adt/arrayfuncs.c:830 utils/adt/arrayfuncs.c:845 utils/adt/arrayfuncs.c:898 #, c-format msgid "malformed array literal: \"%s\"" msgstr "配列リテラルの書式が誤っています: \"%s\"" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:273 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\"は配列次元の明示的な指定の先頭である必要があります。" -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:287 #, c-format msgid "Missing array dimension value." msgstr "配列の次元数の値がありません。" -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:335 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "配列の次元の後に\"%s\"がありません。" -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2909 utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:2945 utils/adt/arrayfuncs.c:2990 utils/adt/arrayfuncs.c:3005 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "上限を下限より小さくすることはできません" -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:320 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "配列値は\"{\"または次元情報から始まる必要があります。" -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:349 #, c-format msgid "Array contents must start with \"{\"." msgstr "配列の内容は\"{\"で始まる必要があります。" -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:355 utils/adt/arrayfuncs.c:362 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "指定された配列の次元数が配列の内容と合致していません。" -#: 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 +#: utils/adt/arrayfuncs.c:495 utils/adt/arrayfuncs.c:522 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:510 utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:511 utils/adt/arrayfuncs.c:558 utils/adt/arrayfuncs.c:588 utils/adt/arrayfuncs.c:637 #, c-format msgid "Unexpected \"%c\" character." msgstr "想定外の文字\"%c\"。" -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:537 utils/adt/arrayfuncs.c:660 #, c-format msgid "Unexpected array element." msgstr "想定外の配列要素。" -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:595 #, c-format msgid "Unmatched \"%c\" character." msgstr "対応しない\"%c\"文字。" -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:603 utils/adt/jsonfuncs.c:2490 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "多次元配列は合致する次元の副配列を持たなければなりません。" -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:680 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." -msgstr "右括弧の後にゴミがあります。" +msgstr "右大括弧の後にごみがあります。" -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:1302 utils/adt/arrayfuncs.c:3418 utils/adt/arrayfuncs.c:5932 #, c-format msgid "invalid number of dimensions: %d" msgstr "不正な次元数: %d" -#: utils/adt/arrayfuncs.c:1312 +#: utils/adt/arrayfuncs.c:1313 #, c-format msgid "invalid array flags" msgstr "不正な配列フラグ" -#: utils/adt/arrayfuncs.c:1334 +#: utils/adt/arrayfuncs.c:1335 #, 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:1378 utils/adt/multirangetypes.c:444 utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: utils/adt/arrayfuncs.c:1379 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:1518 +#: utils/adt/arrayfuncs.c:1519 #, c-format msgid "improper binary format in array element %d" msgstr "配列要素%dのバイナリ書式が不適切です" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: utils/adt/arrayfuncs.c:1600 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:2078 +#: utils/adt/arrayfuncs.c:2079 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "固定長配列の部分配列は実装されていません" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2257 utils/adt/arrayfuncs.c:2279 utils/adt/arrayfuncs.c:2328 utils/adt/arrayfuncs.c:2582 utils/adt/arrayfuncs.c:2920 utils/adt/arrayfuncs.c:5918 utils/adt/arrayfuncs.c:5944 utils/adt/arrayfuncs.c:5955 utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "配列の添え字が不正な数値です" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2262 utils/adt/arrayfuncs.c:2386 utils/adt/arrayfuncs.c:2665 utils/adt/arrayfuncs.c:2995 #, c-format msgid "array subscript out of range" msgstr "配列の添え字が範囲外です" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2267 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "固定長配列の要素にNULL値を代入できません" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "固定長配列の部分配列の更新は実装されていません" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2898 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "配列のスライスの添え字は両方の境界を示す必要があります" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2899 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "空の配列値のスライスに代入するには、スライスの範囲は完全に指定する必要があります。" -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2910 utils/adt/arrayfuncs.c:3022 #, c-format msgid "source array too small" msgstr "元の配列が小さすぎます" -#: utils/adt/arrayfuncs.c:3527 +#: utils/adt/arrayfuncs.c:3576 #, c-format msgid "null array element not allowed in this context" msgstr "この文脈ではNULLの配列要素は許可されません" -#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:3678 utils/adt/arrayfuncs.c:3849 utils/adt/arrayfuncs.c:4240 #, c-format msgid "cannot compare arrays of different element types" msgstr "要素型の異なる配列を比較できません" -#: utils/adt/arrayfuncs.c:3978 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 +#: utils/adt/arrayfuncs.c:4027 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 "型 %s のハッシュ関数を識別できません" -#: utils/adt/arrayfuncs.c:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4155 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "型 %s の拡張ハッシュ関数を特定できませんでした" -#: utils/adt/arrayfuncs.c:5282 +#: utils/adt/arrayfuncs.c:5332 #, c-format msgid "data type %s is not an array type" msgstr "データ型%sは配列型ではありません" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5387 #, c-format msgid "cannot accumulate null arrays" msgstr "null配列は連結できません" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5415 #, c-format msgid "cannot accumulate empty arrays" msgstr "空の配列は連結できません" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5442 utils/adt/arrayfuncs.c:5448 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "次元の異なる配列は結合できません" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5816 utils/adt/arrayfuncs.c:5856 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "次元配列もしくは下限値配列が NULL であってはなりません" -#: utils/adt/arrayfuncs.c:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5919 utils/adt/arrayfuncs.c:5945 #, c-format msgid "Dimension array must be one dimensional." msgstr "次元配列は1次元でなければなりません" -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5924 utils/adt/arrayfuncs.c:5950 #, c-format msgid "dimension values cannot be null" msgstr "次元値にnullにはできません" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5956 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下限配列が次元配列のサイズと異なっています" -#: utils/adt/arrayfuncs.c:6184 +#: utils/adt/arrayfuncs.c:6234 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元配列からの要素削除はサポートされません" -#: utils/adt/arrayfuncs.c:6461 +#: utils/adt/arrayfuncs.c:6511 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値は1次元の配列でなければなりません" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6516 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値配列にはNULL値を含めてはいけません" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6749 #, c-format msgid "number of elements to trim must be between 0 and %d" -msgstr "切り詰める要素の数は0以上%d以下でなければなりません" +msgstr "削除する要素の数は0と%dとの間でなければなりません" #: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 #, c-format @@ -21851,22 +22663,22 @@ msgstr "配列の添え字は整数型でなければなりません" msgid "array subscript in assignment must not be null" msgstr "代入における配列の添え字はnullにはできません" -#: utils/adt/arrayutils.c:140 +#: utils/adt/arrayutils.c:134 #, c-format msgid "array lower bound is too large: %d" msgstr "配列の下界が大きすぎます: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:234 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmod配列はcstring[]型でなければなりません" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:239 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmod配列は1次元の配列でなければなりません" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:244 #, c-format msgid "typmod array must not contain nulls" msgstr "typmod配列にはNULL値を含めてはいけません" @@ -21877,176 +22689,171 @@ 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: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:4660 utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 -#: 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:347 +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4050 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:4607 utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, c-format msgid "invalid input syntax for type %s: \"%s\"" -msgstr "%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:179 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型の範囲外です" +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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 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:842 utils/adt/int.c:958 utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 utils/adt/numeric.c:10553 utils/adt/timestamp.c:3361 #, c-format msgid "division by zero" -msgstr "0による除算が行われました" +msgstr "0 による除算が行われました" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "\"char\"の範囲外です" -#: utils/adt/date.c:62 utils/adt/timestamp.c:97 utils/adt/varbit.c:105 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:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "(%d)%sの精度は負ではいけません" -#: utils/adt/date.c:80 +#: 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: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:4299 utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "日付が範囲外です: \"%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 "日付が範囲外です" -#: 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 "日付フィールドの値が範囲外です: %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 "日付が範囲外です: %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, 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: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 "タイムスタンプで日付が範囲外です" -#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 +#: 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:4078 utils/adt/timestamp.c:4271 utils/adt/timestamp.c:4443 utils/adt/timestamp.c:4696 utils/adt/timestamp.c:4897 utils/adt/timestamp.c:4944 utils/adt/timestamp.c:5168 utils/adt/timestamp.c:5215 utils/adt/timestamp.c:5345 #, c-format -msgid "date units \"%s\" not supported" -msgstr "日付の単位\"%s\"はサポートされていません" +msgid "unit \"%s\" not supported for type %s" +msgstr "単位\"%s\"は型%sに対してはサポートされていません" -#: utils/adt/date.c:1235 +#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 utils/adt/timestamp.c:4092 utils/adt/timestamp.c:4288 utils/adt/timestamp.c:4457 utils/adt/timestamp.c:4656 utils/adt/timestamp.c:4953 utils/adt/timestamp.c:5224 utils/adt/timestamp.c:5406 #, c-format -msgid "date units \"%s\" not recognized" -msgstr "日付の単位\"%s\"は認識できません" +msgid "unit \"%s\" not recognized for type %s" +msgstr "単位\"%s\"は型%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:5417 utils/adt/timestamp.c:5431 utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 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:4141 utils/adt/formatting.c:4177 utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 utils/adt/json.c:457 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:2961 utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2975 utils/adt/timestamp.c:3030 utils/adt/timestamp.c:3053 utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3080 utils/adt/timestamp.c:3088 utils/adt/timestamp.c:3096 utils/adt/timestamp.c:3782 utils/adt/timestamp.c:3906 utils/adt/timestamp.c:3996 +#: utils/adt/timestamp.c:4086 utils/adt/timestamp.c:4179 utils/adt/timestamp.c:4282 utils/adt/timestamp.c:4761 utils/adt/timestamp.c:5035 utils/adt/timestamp.c:5485 utils/adt/timestamp.c:5499 utils/adt/timestamp.c:5504 utils/adt/timestamp.c:5518 utils/adt/timestamp.c:5551 utils/adt/timestamp.c:5638 utils/adt/timestamp.c:5679 utils/adt/timestamp.c:5683 utils/adt/timestamp.c:5752 utils/adt/timestamp.c:5756 utils/adt/timestamp.c:5770 utils/adt/timestamp.c:5804 +#: 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: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:4476 #, c-format msgid "time out of range" msgstr "時刻が範囲外です" -#: 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 "時刻フィールドの値が範囲外です: %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:2435 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:634 utils/adt/int.c:681 utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 utils/adt/timestamp.c:3432 utils/adt/timestamp.c:3463 utils/adt/timestamp.c:3494 #, c-format msgid "invalid preceding or following size in window function" msgstr "ウィンドウ関数での不正なサイズの PRECEDING または FOLLOWING 指定" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"time\"の単位\"%s\"が不明です" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "タイムゾーンの置換が範囲外です" -#: 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\"の単位\"%s\"が不明です" - -#: 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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 utils/adt/datetime.c:4898 utils/adt/timestamp.c:516 utils/adt/timestamp.c:543 utils/adt/timestamp.c:4365 utils/adt/timestamp.c:5510 utils/adt/timestamp.c:5762 #, c-format msgid "time zone \"%s\" not recognized" msgstr "タイムゾーン\"%s\"は不明です" -#: utils/adt/date.c:3129 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: utils/adt/date.c:3117 utils/adt/timestamp.c:5540 utils/adt/timestamp.c:5793 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalによるタイムゾーン\"%s\"には月または日を含めてはいけません" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "日付時刻のフィールドが範囲外です: \"%s\"" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "他の\"datestyle\"設定が必要かもしれません。" -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervalフィールドの値が範囲外です: \"%s\"" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "タイムゾーンの置換が範囲外です: \"%s\"" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "このタイムゾーンはタイムゾーン省略名\"%s\"の構成ファイルにあるようです。" -#: utils/adt/datum.c:90 utils/adt/datum.c:102 +#: utils/adt/datum.c:91 utils/adt/datum.c:103 #, c-format msgid "invalid Datum pointer" msgstr "不正なDatumポインタ" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "不正なサイズ: \"%s\"" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "不正なサイズの単位: \"%s\"" -#: utils/adt/dbsize.c:824 +#: 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 @@ -22128,372 +22935,367 @@ msgstr "実際の列挙型を特定できませんでした" msgid "enum %s contains no values" 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 "\"%s\"は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 "\"%s\"は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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallintの範囲外です" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, c-format msgid "cannot take square root of a negative number" -msgstr "負の値の平方根は取ることができません" +msgstr "負の値の平方根を取ることができません" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 +#: 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の負数乗は定義されていません" +msgstr "0 の負数乗は定義されていません" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" -msgstr "負数の非整数乗は、結果が複素数になります" +msgstr "負数を整数でない数でべき乗すると、結果が複雑になります" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 utils/adt/numeric.c:10181 #, c-format msgid "cannot take logarithm of zero" -msgstr "ゼロの対数は取ることができません" +msgstr "ゼロの対数を取ることができません" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, c-format msgid "cannot take logarithm of a negative number" -msgstr "負の値の対数は取ることができません" +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:1708 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" -msgstr "countは0より大きくなければなりません" +msgstr "カウントは0より大きくなければなりません" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 +#: 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/numeric.c:1724 +#: 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:1738 +#: 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:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"は最終パターンでなければなりません。" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "複数の小数点があります" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\"と小数点を混在できません" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"は1回しか使用できません" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, 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:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"と\"MI\"を混在できません" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"と\"PL\"を混在できません" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"と\"SG\"を混在できません" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, 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:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"は1回しか使用できません" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"が他のフォーマットと互換性がありません。" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\"は数値または小数点パターンと共に指定してください。" -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "不正なdatetime書式のセパレータ: \"%s\"" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"は数値ではありません" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "文字ケースの変換に失敗しました: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 関数に対して使用する照合順序を特定できませんでした" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "不正な暦法の組み合わせ" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "単一の書式テンプレートの中では、グレゴリオ暦とISO歴週日付を混在させないでください。" -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "書式文字列中で\"%s\"フィールドの値が衝突しています" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "この値は同じフィールド型に対する以前の設定と矛盾しています" -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書式フィールド\"%s\"に対して元の文字列が短すぎます" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドには%d文字必要ですが、%d文字しか残っていません。" -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "元の文字列が固定長でない場合は、修飾子\"FM\"を試してみてください。" -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%2$s\"に対する不正な値\"%1$s\"" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "このフィールドには%d文字必要ですが、%d文字しかパースされませんでした。" -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "もとの文字列において\"%s\"に対応する値が範囲外です" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "値は%dから%dまでの範囲でなければなりません。" -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "与えられた値がこの項目に対して許されるいずれの値ともマッチしません。" -#: 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:2886 utils/adt/formatting.c:2906 utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "地域化した文字列のフォーマットが長すぎます" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "合致しないフォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "合致しないフォーマット文字\"%s\"" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "形式指定フィールド\"%s\"はto_charの中でのみサポートされています" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr " \"Y,YYY\"に対応する入力文字列が不正です" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書式に対して入力文字列が短すぎます" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeフォーマット後に文字が入力文字列中に残っています" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptz型に対応する入力に時間帯がありません" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptzの範囲外です" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeフォーマットで時間帯は指定されていますが、時刻が指定されていません" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetz型に対する入力文字列中に時間帯がありません" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetzの範囲外です" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeフォーマットで日付は指定されていますが、時間が指定されていません" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形式では\"%d\"時は不正です" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24時間形式を使うか、もしくは 1 から 12 の間で指定してください。" -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "年の情報なしでは年内の日数は計算できません" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"は入力としてサポートしていません" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\"は入力としてサポートしていません" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "親ディレクトリへの参照(\"..\")は許可されていません" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "絶対パスは許可されていません" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "パスはカレントディレクトリもしくはその下でなければなりません" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "要求した長さが長すぎます" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "ファイル\"%s\"をシークできませんでした: %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "ファイルが大きすぎます" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "adminpack 1.0 でファイルを読み込むにはスーパーユーザーである必要があります" @@ -22508,7 +23310,7 @@ msgstr "不正な直線の指定: AとBは同時に0にはできません" msgid "invalid line specification: must be two distinct points" msgstr "不正な直線の指定: 2つの点は異なっている必要があります" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "要求された点が多すぎます" @@ -22518,88 +23320,48 @@ msgstr "要求された点が多すぎます" msgid "invalid number of points in external \"path\" value" msgstr "\"path\"の外部値における点の数が不正です" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "関数\"dist_lb\"は実装されていません" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "関数\"dist_bl\"\"は実装されていません" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "関数\"close_sl\"は実装されていません" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "関数\"close_lb\"は実装されていません" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "\"polygon\"の外部値の点の数が不正です" -#: utils/adt/geo_ops.c:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "関数\"poly_distance\"は実装されていません" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "関数\"path_center\"は実装されていません" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "開経路を多角形に変換できません" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "\"circle\"の外部値の半径が不正です" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "半径0の円を多角形に返還できません" -#: utils/adt/geo_ops.c:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "少なくとも2ポイントを要求しなければなりません" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vectorの要素数が多すぎます" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "不正なint2vectorデータ" -#: 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:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 utils/adt/timestamp.c:5855 utils/adt/timestamp.c:5935 #, c-format msgid "step size cannot equal zero" -msgstr "加算量をゼロにすることはできません" +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:4302 utils/adt/varbit.c:1676 +#: 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:4364 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の範囲外です" @@ -22607,25 +23369,25 @@ msgstr "OIDの範囲外です" #: utils/adt/json.c:271 utils/adt/jsonb.c:757 #, c-format msgid "key value must be scalar, not array, composite, or json" -msgstr "キー値は配列でも複合型でもJSONでもなく、スカラーでなくてはなりません" +msgstr "キー値は配列でも複合型でもJSONでもなく、スカラでなくてはなりません" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "%s の引数ではキーと値が交互になっている必要があります。" @@ -22640,17 +23402,17 @@ msgstr "引数%dはnullであってはなりません" msgid "Object keys should be text." msgstr "オブジェクトキーはテキストでなければなりません。" -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, 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:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "配列の次元が合っていません" @@ -22665,67 +23427,67 @@ msgstr "文字列はjsonb文字列として表現するには長すぎます" msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "実装上の制約のため、jsonb文字列は%dバイトまでである必要があります。" -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "引数%d: キーはnullであってはなりません" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "オブエクとキーは文字列である必要があります" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "jsonb null は%s型にはキャストできません" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "jsonb文字列は%s型へはキャストできません" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "jsonb numericは%s型へはキャストできません" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "jsonbブール型は%s型へはキャストできません" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "jsonb配列は%s型へはキャストできません" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "jsonbオブジェクトは%s型へはキャストできません" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "jsonbの配列またはオブジェクトは%s型へはキャストできません" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "jsonbオブジェクトペア数が許された最大の値(%zu)を上回っています" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "jsonbの配列要素の数が許された最大の値(%zu)を上回っています" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "jsonbの配列要素の全体の大きさが許された最大値%uバイトを上回っています" -#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 utils/adt/jsonb_util.c:1803 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "jsonbのオブジェクト要素全体のサイズが最大値である%uを超えています" @@ -22733,7 +23495,7 @@ msgstr "jsonbのオブジェクト要素全体のサイズが最大値である% #: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 #, c-format msgid "jsonb subscript does not support slices" -msgstr "JSONB添字ではスライスをサポートしていません" +msgstr "jsonb添字はスライスをサポートしません" #: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 #, c-format @@ -22753,19 +23515,19 @@ msgstr "jsonbの添字はintegerまたはtextのいずれかに変換可能で #: utils/adt/jsonbsubs.c:139 #, c-format msgid "jsonb subscript must have text type" -msgstr "JSONBの添字はテキスト型でなければなりません" +msgstr "jsonb添字はテキスト型でなければなりません" #: utils/adt/jsonbsubs.c:207 #, c-format msgid "jsonb subscript in assignment must not be null" -msgstr "代入でのJSONB添字はnullであってはなりません" +msgstr "代入におけるjsonb添え字はnullにはできません" -#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" -msgstr "スカラーに対して%sを呼び出すことはできません" +msgstr "スカラに対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "配列に対して%sを呼び出すことはできません" @@ -22778,181 +23540,186 @@ msgstr "JSONデータ、%d行目: %s%s%s" #: utils/adt/jsonfuncs.c:1834 utils/adt/jsonfuncs.c:1869 #, c-format msgid "cannot get array length of a scalar" -msgstr "スカラーから配列長を得ることはできません" +msgstr "スカラから配列長を得ることはできません" #: utils/adt/jsonfuncs.c:1838 utils/adt/jsonfuncs.c:1857 #, c-format msgid "cannot get array length of a non-array" msgstr "配列では無いものから配列長を得ることはできません" -#: utils/adt/jsonfuncs.c:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "非オブジェクトに対して%sは呼び出せません" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "配列をオブジェクトとして再構築することはできません" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" -msgstr "スカラーを再構築することはできません" +msgstr "スカラを再構築することはできません" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" -msgstr "スカラーから要素を取り出すことはできません" +msgstr "スカラから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "オブジェクトから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, c-format msgid "cannot call %s on a non-array" msgstr "非配列に対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2544 utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "JSON配列を期待していました" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "キー\"%s\"の値を見てください。" -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "キー\"%s\"の配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "malformed JSON array" msgstr "不正な形式のJSON配列" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, c-format msgid "could not determine row type for result of %s" msgstr "%sの結果に対応する行の型を決定できませんでした" -#: utils/adt/jsonfuncs.c:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, c-format msgid "argument of %s must be an array of objects" msgstr "%sの引数はオブジェクト配列でなければなりません" -#: utils/adt/jsonfuncs.c:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "オブジェクトに対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" -msgstr "スカラーから削除することはできません" +msgstr "スカラから削除することはできません" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, c-format msgid "cannot delete from object using integer index" msgstr "オブジェクトから整数添字を使って削除することはできません" -#: utils/adt/jsonfuncs.c:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" -msgstr "スカラーにパスを設定することはできません" +msgstr "スカラにパスを設定することはできません" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "JSON値はnullではあってはなりません" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "null_value_treatmentが\"raise_exception\"であるため、例外が出力されました" -#: utils/adt/jsonfuncs.c:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" -msgstr "スカラーでパスを削除することはできません" +msgstr "スカラでパスを削除することはできません" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "位置%dのパス要素がnullです" -#: utils/adt/jsonfuncs.c:4944 utils/adt/jsonfuncs.c:4975 utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "既存のキーを置き換えることはできません" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." -msgstr "このパスではキーが複合オブジェクトであることを想定していますが、実際にはスカラー値です。" +msgstr "このパスではキー値は複合オブジェクトであると想定していますが、スカラー値でした" -#: utils/adt/jsonfuncs.c:5049 +#: utils/adt/jsonfuncs.c:4937 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "jsonb_set関数を使ってキー値を置き換えることを試してください。" -#: utils/adt/jsonfuncs.c:5153 +#: utils/adt/jsonfuncs.c:5041 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "位置%dのパス要素が整数ではありません: \"%s\"" -#: utils/adt/jsonfuncs.c:5170 +#: utils/adt/jsonfuncs.c:5058 #, c-format msgid "path element at position %d is out of range: %d" -msgstr "位置%dのパス要素が範囲外です: %d" +msgstr "位置%dのパス要素は範囲外です: %d" -#: utils/adt/jsonfuncs.c:5322 +#: utils/adt/jsonfuncs.c:5210 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" -msgstr "間違ったフラグのタイプ; 配列およびスカラーのみ使用可能です" +msgstr "間違ったフラグのタイプ; 配列およびスカラのみ使用可能です" -#: utils/adt/jsonfuncs.c:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "フラグ配列の要素が文字列ではありません" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "使用可能な値は: \"string\", \"numeric\", \"boolean\", \"key\"、および \"all\"。" -#: utils/adt/jsonfuncs.c:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "フラグ配列内の間違ったフラグ値: \"%s\"" @@ -23090,12 +23857,12 @@ msgstr "jsonpath配列の添え字が整数の範囲外です" #: utils/adt/jsonpath_exec.c:2604 #, c-format msgid "cannot convert value from %s to %s without time zone usage" -msgstr "時間帯を使用せずに %s から %s への値の変換はできません" +msgstr "時間帯を使用せずに%sから%sへの値の変換はできません" #: utils/adt/jsonpath_exec.c:2606 #, c-format msgid "Use *_tz() function for time zone support." -msgstr "*_tz() 関数を使用することで時間帯がサポートされます" +msgstr "*_tz() 関数を使用することで時間帯がサポートされます。" #: utils/adt/levenshtein.c:133 #, c-format @@ -23107,7 +23874,7 @@ msgstr "レーベンシュタイン距離関数の引数の長さが上限の%d msgid "nondeterministic collations are not supported for LIKE" msgstr "非決定的照合順序はLIKEではサポートされません" -#: utils/adt/like.c:193 utils/adt/like_support.c:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "ILIKE で使用する照合順序を特定できませんでした" @@ -23122,27 +23889,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:988 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "型byteaでは大文字小文字の区別をしないマッチをサポートしません" -#: utils/adt/like_support.c:1090 +#: utils/adt/like_support.c:1115 #, 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\"" @@ -23157,419 +23924,404 @@ 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/mcxtfuncs.c:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "メモリコンテキストのログ出力を行うにはスーパーユーザーである必要があります" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %dはPostgreSQLサーバープロセスではありません" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "グローバルテーブル空間にデータベースがありません" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%uはテーブル空間のOIDではありません" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "予約されていません" -#: utils/adt/misc.c:488 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "予約されていません(関数または型名にはできません)" -#: utils/adt/misc.c:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "予約されています(関数または型名にできます)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "予約されています" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "ASは省略可" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "ASが必要" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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:761 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "文字列中に閉じられていない二重引用符があります。" -#: utils/adt/misc.c:775 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "引用符で囲まれた識別子は空であってはなりません。" -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "\".\"の前に有効な識別子がありません。" -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "\".\"の後に有効な識別子がありません。" -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "ログ形式\"%s\"はサポートされていません" -#: utils/adt/misc.c:879 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "サポートされているログ形式は\"stderr\"と\"csvlog\"です。" +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "サポートされているログ形式は\"stderr\"、\"csvlog\"、そして\"jsonlog\"です。" -#: 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 +#: 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\"" +msgstr "不正な複範囲リテラル: \"%s\"" -#: utils/adt/multirangetypes.c:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." -msgstr "左波括弧がありません。" +msgstr "左大括弧がありません" -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." -msgstr "範囲の開始があるはずです" +msgstr "範囲の開始を予期していました。" -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." -msgstr "カンマまたは複範囲の終りがあるはずです" +msgstr "カンマまたは複範囲の終了を予期していました。" -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "複範囲型は多次元配列からは生成できません" -#: utils/adt/multirangetypes.c:1001 +#: utils/adt/multirangetypes.c:1002 #, 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はrange型で呼び出されなければなりません" - -#: utils/adt/multirangetypes.c:1420 -#, c-format -msgid "range_intersect_agg must be called with a multirange" -msgstr "multirange_intersect_aggは複範囲型で呼び出される必要があります" - -#: utils/adt/network.c:111 +#: 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:967 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "外部\"numeric\"の値の符号が不正です" -#: utils/adt/numeric.c:973 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "外部\"numeric\"の値の位取りが不正です" -#: utils/adt/numeric.c:982 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"の値の桁が不正です" -#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 +#: 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:1200 +#: 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:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "不正なNUMERIC型の修正子" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "開始値はNaNにはできません" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "開始値は無限大にはできません" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "終了値はNaNにはできません" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "終了値は無限大にはできません" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "加算量はNaNにはできません" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "加算量は無限大にはできません" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "負数の階乗は定義されていません" -#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" -msgstr "値はnumericの形式でオーバフローします" +msgstr "値がnumericの形式でオーバフローします" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" -msgstr "NaNは%sには変換できません" +msgstr "NaNを%sには変換できません" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" -msgstr "無限大は%sには変換できません" +msgstr "無限大を%sに変換できません" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnの範囲外です" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "numericフィールドのオーバーフロー" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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より小さな値に丸められなければなりません。" +msgstr "精度%d、位取り%dを持つフィールドは、%s%dより小さな絶対値に丸められます。" -#: utils/adt/numeric.c:7554 +#: utils/adt/numeric.c:7594 #, 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 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "不正なoidvectorデータ" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "要求された文字が大きすぎます" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 -#, c-format -msgid "requested character too large for encoding: %d" -msgstr "要求された文字は符号化するには大きすぎます: %d" - -#: utils/adt/oracle_compat.c:1063 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "要求された文字は不正なため符号化することができません: %d" +msgid "character number must be positive" +msgstr "文字番号は正数でなければなりません" -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, 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:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "要求された文字は符号化するには大きすぎます: %u" + +#: utils/adt/oracle_compat.c:1082 +#, 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:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "システムライブラリの更新を適用してください。" -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "このビルドではICUはサポートされていません" + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "ロケール\"%s\"を作成できませんでした: %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "オペレーティングシステムはロケール名\"%s\"のロケールデータを見つけられませんでした。" -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1608 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "このプラットフォームでは値が異なるcollateとctypeによる照合順序をサポートしていません" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "照合順序プロバイダLIBCはこのプラットフォームではサポートされていません" -#: 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: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:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "このビルドではICUはサポートされていません" - -#: utils/adt/pg_locale.c:1609 +#: utils/adt/pg_locale.c:1652 #, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが指定されています" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが記録されています" -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "照合順序\"%s\"でバージョンの不一致が起きています" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1660 #, 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:1621 +#: utils/adt/pg_locale.c:1663 #, 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:1692 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" -msgstr "ロケール\"%s\"を読み込みできませんでした" +msgstr "ロケール\"%s\"をロードできませんでした" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "エンコーディング\"%s\"のICU変換器をオープンできませんでした: %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:1835 utils/adt/pg_locale.c:1844 utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s が失敗しました: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールに対する不正なマルチバイト文字" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "おそらくサーバーのLC_CTYPEロケールはデータベースの符号化方式と互換性がありません" @@ -23589,11 +24341,26 @@ msgstr "pg_lsnからNaNは減算できません" msgid "function can only be called when server is in binary upgrade mode" msgstr "関数はサーバーがバイナリアップグレードモードであるときのみ呼び出せます" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "不正なコマンド名: \"%s\"" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "認識できないリセットターゲット: \"%s\"" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "対象は\"archiver\"、\"bgwriter\"、\"recovery_prefetch\"または\"wal\"でなければなりません。" + +#: utils/adt/pgstatfuncs.c:2198 +#, 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" @@ -23624,11 +24391,6 @@ msgstr "範囲の差分が連続ではありません" msgid "result of range union would not be contiguous" msgstr "範囲の和が連続ではありません" -#: 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" @@ -23672,35 +24434,45 @@ msgstr "カンマが多すぎます" #: utils/adt/rangetypes.c:2266 #, c-format msgid "Junk after right parenthesis or bracket." -msgstr "右括弧または右角括弧の後にゴミがあります" +msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, 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:11875 utils/misc/guc.c:11909 +#, 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 "正規表現のマッチが多過ぎます" @@ -23715,7 +24487,7 @@ msgstr "\"%s\"という名前の関数が複数あります" msgid "more than one operator named %s" msgstr "%sという名前の演算子が複数あります" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:9800 utils/adt/ruleutils.c:9969 +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "引数が多すぎます" @@ -23725,7 +24497,7 @@ msgstr "引数が多すぎます" msgid "Provide two argument types for operator." msgstr "演算子では2つの引数型を指定してください" -#: 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:3698 utils/adt/varlena.c:3703 +#: 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:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "不正な名前の構文" @@ -23750,77 +24522,77 @@ msgstr "型の名前を想定していました" msgid "improper type name" msgstr "型の名前が不適切です" -#: 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 "テーブル\"%s\"への挿入、更新は外部キー制約\"%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 "MACTH FULLではNULLキー値と非NULLキー値を混在できません" -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "関数\"%s\"をINSERTで発行しなければなりません" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "関数\"%s\"をUPDATEで発行しなければなりません" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "関数\"%s\"をDELETEで発行しなければなりません" -#: 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 "テーブル\"%2$s\"のトリガー\"%1$s\"用のpg_constraint項目がありません" +msgstr "テーブル\"%2$s\"のトリガ\"%1$s\"用のpg_constraint項目がありません" -#: 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 "この参照整合性トリガーとその対象を削除し、ALTER TABLE ADD CONSTRAINTを実行してください" +msgstr "この参照整合性トリガとその対象を削除し、ALTER TABLE ADD CONSTRAINTを実行してください" -#: 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 "\"%3$s\"の制約\"%2$s\"から\"%1$s\"に行われた参照整合性問い合わせが想定外の結果になりました" -#: 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 "これは概ねこの問い合わせを書き換えるルールが原因です" -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "子テーブル \"%s\"の削除は外部キー制約\"%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 "キー(%s)=(%s)はまだテーブル\"%s\"から参照されています" -#: 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 "テーブル\"%3$s\"にキー(%1$s)=(%2$s)がありません" -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "テーブル\"%s\"にキーがありません。" -#: 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 "テーブル\"%1$s\"の更新または削除は、テーブル\"%3$s\"の外部キー制約\"%2$s\"に違反します" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "テーブル\"%s\"からキーがまだ参照されています。" @@ -23833,32 +24605,32 @@ msgstr "匿名複合型の入力は実装されていません" #: 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\"" +msgstr "おかしなレコードリテラルです: \"%s\"" #: utils/adt/rowtypes.c:158 #, c-format msgid "Missing left parenthesis." -msgstr "左括弧がありません。" +msgstr "左括弧がありません" #: utils/adt/rowtypes.c:187 #, c-format msgid "Too few columns." -msgstr "列が少なすぎます。" +msgstr "列が少なすぎます" #: utils/adt/rowtypes.c:270 #, c-format msgid "Too many columns." -msgstr "列が多すぎます。" +msgstr "列が多すぎます" #: utils/adt/rowtypes.c:278 #, c-format msgid "Junk after right parenthesis." -msgstr "右括弧の後にゴミがあります。" +msgstr "右括弧の後にごみがあります" #: utils/adt/rowtypes.c:532 #, c-format msgid "wrong number of columns: %d, expected %d" -msgstr "列数が間違っています: %dですが、%dを想定していました" +msgstr "列数が間違っています: %d。%dを想定していました" #: utils/adt/rowtypes.c:574 #, c-format @@ -23880,130 +24652,121 @@ msgstr "レコードの列 %3$d において、全く異なる型 %1$s と %2$s msgid "cannot compare record types with different numbers of columns" msgstr "個数が異なる列同士ではレコード型の比較ができません" -#: utils/adt/ruleutils.c:5164 +#: utils/adt/ruleutils.c:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "入力が式ではなく文です" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "式が2つ以上のリレーションの変数を含んでいます" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "式が変数を含んでいます" + +#: utils/adt/ruleutils.c:5267 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "ルール\"%s\"はサポートしていないイベントタイプ%dを持ちます" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s の精度は負であってはなりません" -#: utils/adt/timestamp.c:115 +#: 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:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12435 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12899 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestampが範囲外です: \"%s\"" -#: utils/adt/timestamp.c:374 +#: 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:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "数字タイムゾーンは先頭の文字が\"-\"または\"+\"でなければなりません。" -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "数値タイムゾーン\"%s\"が範囲外です" -#: 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が範囲外です: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:726 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "タイムスタンプは NaN にはできません" -#: 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が範囲外です: \"%g\"" -#: utils/adt/timestamp.c:1068 utils/adt/timestamp.c:1101 +#: 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:3134 utils/adt/timestamp.c:3139 utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3194 utils/adt/timestamp.c:3201 utils/adt/timestamp.c:3208 utils/adt/timestamp.c:3228 utils/adt/timestamp.c:3235 utils/adt/timestamp.c:3242 utils/adt/timestamp.c:3329 utils/adt/timestamp.c:3404 +#: utils/adt/timestamp.c:3777 utils/adt/timestamp.c:3901 utils/adt/timestamp.c:4451 +#, 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" msgstr "不正なINTERVAL型の修正子です" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)の精度は負ではいけません" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)の精度を許容最大値%dまで減らしました" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)の精度は%dから%dまででなければなりません" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "無限大のtimestampを減算できません" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3937 utils/adt/timestamp.c:4120 #, c-format msgid "origin out of range" -msgstr "originが範囲外です" +msgstr "基点が範囲外です" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3942 utils/adt/timestamp.c:4125 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "タイムスタンプ型は月や年を含む間隔にビニングすることはできません" -#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:3949 utils/adt/timestamp.c:4132 #, c-format msgid "stride must be greater than zero" -msgstr "間隔は0より大きくなければなりません" - -#: 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: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: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 with time zoneの単位\"%s\"はサポートされていません" - -#: 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 with time zoneの単位\"%s\"は不明です" - -#: utils/adt/timestamp.c:4346 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "月は通常週を含んでいますので、intervalの単位\"%s\"はサポートされていません" - -#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "intervalの単位\"%s\"はサポートされていません" +msgstr "増分は0より大きくなければなりません" -#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5338 +#: utils/adt/timestamp.c:4445 #, 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 @@ -24033,7 +24796,7 @@ msgstr "gtsvector_inは実装されていません" #: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 #, c-format msgid "distance in phrase operator must be an integer value between zero and %d inclusive" -msgstr "フレーズ演算子で指定する距離は0以上%d以下でなくてはなりません" +msgstr "フレーズ演算子での距離は0以上%d以下の整数でなくてはなりません" #: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 utils/adt/tsvector_parser.c:133 #, c-format @@ -24110,57 +24873,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:2429 +#: utils/adt/tsvector_op.c:2434 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_statは1つのtsvector列のみを返さなければなりません" -#: utils/adt/tsvector_op.c:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "値\"%s\"は型tsvectorではありません" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "設定列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "%s列はregconfig型ではありません" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "設定列\"%s\"をNULLにすることはできません" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "テキスト検索設定名称\"%s\"はスキーマ修飾しなければなりません" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "列\"%s\"は文字型ではありません" @@ -24180,7 +24948,7 @@ 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 "乱数値を生成できませんでした" @@ -24218,17 +24986,17 @@ msgstr "\"%.*s\"は有効な16進数の数字ではありません" #: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" -msgstr "外部ビット列の長さが不正です" +msgstr "ビット列の外部値の不正な長さ" #: 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: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:3340 utils/adt/varlena.c:3418 +#: 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:3309 utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" -msgstr "負の部分文字列長は指定できません" +msgstr "負の長さのsubstringは許可されません" #: utils/adt/varbit.c:1261 #, c-format @@ -24248,9 +25016,9 @@ msgstr "サイズが異なるビット列のXORはできません" #: 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の間にありません" +msgstr "ビットのインデックス%dが有効範囲0..%dの間にありません" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "新しいビットは0か1でなければなりません" @@ -24258,134 +25026,134 @@ msgstr "新しいビットは0か1でなければなりません" #: utils/adt/varchar.c:157 utils/adt/varchar.c:310 #, c-format msgid "value too long for type character(%d)" -msgstr "値は型character(%d)に対して長すぎます" +msgstr "値は型character(%d)としては長すぎます" #: utils/adt/varchar.c:472 utils/adt/varchar.c:634 #, c-format msgid "value too long for type character varying(%d)" -msgstr "値は型character varying(%d)に対して長すぎます" +msgstr "値は型character varying(%d)としては長すぎます" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1516 +#: 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:1209 utils/adt/varlena.c:1956 +#: 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:1615 utils/adt/varlena.c:1628 +#: 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:1643 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "Unicode文字列を比較できませんでした: %m" -#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "照合順序による比較に失敗しました: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "ソートキーの生成に失敗しました: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "インデックス%dは有効範囲0..%dの間にありません" -#: utils/adt/varlena.c:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "インデックス%lldは有効範囲0..%lldの間にありません" -#: utils/adt/varlena.c:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" -msgstr "フィールド位置に0は指定できません" +msgstr "フィールド位置には0は指定できません" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "終端されていないformat()型指定子" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "一つの\"%%\"には\"%%%%\"を使ってください。" -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "認識できない format() の型指定子\"%.*s\"" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "format()の引数が少なすぎます" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "数値が範囲外です" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "書式は引数0を指定していますが、引数が1から始まっています" -#: utils/adt/varlena.c:6069 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数の位置は\"$\"で終わらなければなりません" -#: utils/adt/varlena.c:6114 +#: utils/adt/varlena.c:6088 #, c-format msgid "null values cannot be formatted as an SQL identifier" -msgstr "nullはSQL識別子として書式付けできません" +msgstr "NULLはSQL識別子として書式付けできません" -#: utils/adt/varlena.c:6240 +#: utils/adt/varlena.c:6214 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode正規化はサーバーエンコーディングがUTF-8の場合にのみ実行されます" -#: utils/adt/varlena.c:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "不正な正規化形式: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "不正なUnicodeコードポイント: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." -msgstr "Unicodeエスケープは \\XXXX, \\+XXXXXX, \\uXXXX, または \\UXXXXXXXX である必要があります。" +msgstr "Unicodeエスケープは \\XXXX、\\+XXXXXX、\\uXXXX または \\UXXXXXXXX でなければなりません。" -#: utils/adt/windowfuncs.c:243 +#: 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:117 #, 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:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "不正な外部pg_snapshotデータ" @@ -24398,153 +25166,153 @@ msgstr "非サポートのXML機能です。" #: utils/adt/xml.c:223 #, c-format msgid "This functionality requires the server to be built with libxml support." -msgstr "この機能はlibxmlサポートを付けたサーバーが必要です。" +msgstr "この機能はlibxmlサポート付きでビルドされたサーバーを必要とします。" -#: 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 "不正な符号化方式名\"%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:2768 +#: utils/adt/xml.c:2767 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "ポータル\"%s\"はタプルを返却しません" -#: utils/adt/xml.c:4020 +#: utils/adt/xml.c:4019 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML名前空間マッピングに対する不正な配列" -#: utils/adt/xml.c:4021 +#: utils/adt/xml.c:4020 #, 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:4045 +#: utils/adt/xml.c:4044 #, c-format msgid "empty XPath expression" msgstr "空のXPath式" -#: utils/adt/xml.c:4097 +#: utils/adt/xml.c:4096 #, c-format msgid "neither namespace name nor URI may be null" msgstr "名前空間名もURIもnullにはできません" -#: utils/adt/xml.c:4104 +#: utils/adt/xml.c:4103 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"という名前のXML名前空間およびURI\"%s\"を登録できませんでした" -#: utils/adt/xml.c:4455 +#: utils/adt/xml.c:4454 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルト名前空間は実装されていません" -#: utils/adt/xml.c:4484 +#: utils/adt/xml.c:4483 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタは空文字列であってはなりません" -#: utils/adt/xml.c:4515 +#: utils/adt/xml.c:4514 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列であってはなりません" -#: utils/adt/xml.c:4659 +#: utils/adt/xml.c:4658 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPath式が2つ以上の値を返却しました" @@ -24579,37 +25347,47 @@ msgstr "アクセスメソッド %2$s の演算子クラス\"%1$s\"は%4$s型に msgid "cached plan must not change result type" msgstr "キャッシュした実行計画は結果型を変更してはなりません" -#: utils/cache/relcache.c:6325 +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "バイナリアップグレードモード中にヒープのrelfilenodeの値が設定されていません" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "バイナリアップグレードモード中に、予期しない新規relfilenodeの要求がありました" + +#: utils/cache/relcache.c:6473 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "リレーションキャッシュ初期化ファイル\"%sを作成できません: %m" -#: utils/cache/relcache.c:6327 +#: utils/cache/relcache.c:6475 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "とりあえず続行しますが、何かがおかしいです。" -#: utils/cache/relcache.c:6649 +#: utils/cache/relcache.c:6797 #, 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:767 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "リレーションマッピングファイル\"%s\"に不正なデータがあります" -#: utils/cache/relmapper.c:777 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"の中に不正なチェックサムがあります" -#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "レコード型は登録されていません" @@ -24617,108 +25395,108 @@ msgstr "レコード型は登録されていません" #: utils/error/assert.c:39 #, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" -msgstr "TRAP: ExceptionalCondition: PID%dで不正な引数\n" +msgstr "TRAP: 例外条件: PID %dで不正な引数\n" #: utils/error/assert.c:42 #, c-format msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "TRAP: %s(\"%s\", ファイル: \"%s\", 行: %d、PID: %d)\n" +msgstr "TRAP: %s(\"%s\"、ファイル: \"%s\"、行: %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 "エラーメッセージの処理が可能になる前にエラーが発生しました\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "ファイル\"%s\"の標準エラー出力としての再オープンに失敗しました: %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "ファイル\"%s\"の標準出力としての再オープンに失敗しました: %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 "[不明]" -#: 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 "エラーテキストがありません" -#: 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 "(%d文字目)" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "詳細: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "ヒント: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "問い合わせ: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "文脈: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "場所: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "場所: %s:%d\n" -#: utils/error/elog.c:3094 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "バックトレース: " -#: utils/error/elog.c:3108 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "文: " -#: 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 "NOTICE" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ERROR" -#: 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 "PANIC" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "ファイル\"%2$s\"内に関数\"%1$s\"がありませんでした" @@ -24748,51 +25526,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:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "ライブラリ\"%s\"へのアクセスは許可されません" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ダイナミックライブラリパス内のマクロが不正です: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, 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:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "パラメータ\"dynamic_library_path\"内の要素が絶対パスでありません" @@ -24817,374 +25605,374 @@ msgstr "SQL呼び出し可能な関数にはPG_FUNCTION_INFO_V1(funcname)宣言 msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "info関数\"%2$s\"で報告されたAPIバージョン%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 "関数呼び出しコンテクストに演算子オプション情報がありません" +msgstr "関数呼び出しコンテクストに演算子クラスオプション情報がありません" -#: 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 "言語有効性検査関数%1$uが言語%3$uではなく%2$uに対して呼び出されました" -#: utils/fmgr/funcapi.c:420 +#: utils/fmgr/funcapi.c:498 #, 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:565 +#: utils/fmgr/funcapi.c:643 #, c-format msgid "argument declared %s does not contain a range type but type %s" -msgstr "%sと宣言された引数が範囲型ではなく%s型を含んでいます" +msgstr "%sと宣言された引数が範囲型ではなく型%sを含んでいます" -#: utils/fmgr/funcapi.c:648 +#: utils/fmgr/funcapi.c:726 #, c-format msgid "could not find multirange type for data type %s" msgstr "データ型%sの複範囲型がありませんでした" -#: utils/fmgr/funcapi.c:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "別名の数が列の数と一致しません" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "列の別名が提供されていませんでした" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "レコードを返す関数についての行定義を特定できませんでした" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "データディレクトリ\"%s\"は存在しません" -#: utils/init/miscinit.c:319 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: utils/init/miscinit.c:327 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "指定されたデータディレクトリ\"%s\"はディレクトリではありません" -#: utils/init/miscinit.c:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "データディレクトリ\"%s\"の所有者情報が間違っています" -#: utils/init/miscinit.c:345 +#: 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:363 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "データディレクトリ\"%s\"の権限設定が不正です" -#: utils/init/miscinit.c:365 +#: 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7837 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" -msgstr "セキュリティー制限された処理中はパラメーター\"%s\"を設定できません" +msgstr "セキュリティー制限操作内でパラメーター\"%s\"を設定できません" -#: utils/init/miscinit.c:718 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "OID が %u であるロールは存在しません" -#: utils/init/miscinit.c:748 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "ロール\"%s\"はログインが許可されません" -#: utils/init/miscinit.c:766 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "ロール\"%s\"からの接続が多すぎます" -#: utils/init/miscinit.c:826 +#: utils/init/miscinit.c:849 #, c-format msgid "permission denied to set session authorization" msgstr "set session authorization用の権限がありません" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:932 #, c-format msgid "invalid role OID: %u" msgstr "不正なロールID: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:986 #, c-format msgid "database system is shut down" msgstr "データベースシステムはシャットダウンしました" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1073 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を作成できませんでした: %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1087 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1094 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を読み取れませんでした: %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1103 #, c-format msgid "lock file \"%s\" is empty" msgstr "ロックファイル\"%s\"が空です" -#: utils/init/miscinit.c:1081 +#: utils/init/miscinit.c:1104 #, 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:1125 +#: utils/init/miscinit.c:1148 #, c-format msgid "lock file \"%s\" already exists" msgstr "ロックファイル\"%s\"はすでに存在します" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1152 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "他のpostgres(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1154 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "他のpostmaster(PID %d)がデータディレクトリ\"%s\"で稼動していませんか?" -#: utils/init/miscinit.c:1134 +#: utils/init/miscinit.c:1157 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "他のpostgres(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1136 +#: utils/init/miscinit.c:1159 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "他のpostmaster(PID %d)がソケットファイル\"%s\"を使用していませんか?" -#: utils/init/miscinit.c:1187 +#: utils/init/miscinit.c:1210 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "古いロックファイル\"%s\"を削除できませんでした: %m" -#: utils/init/miscinit.c:1189 +#: utils/init/miscinit.c:1212 #, 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:1226 utils/init/miscinit.c:1240 utils/init/miscinit.c:1251 +#: utils/init/miscinit.c:1249 utils/init/miscinit.c:1263 utils/init/miscinit.c:1274 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "ロックファイル\"%s\"に書き出せませんでした: %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10401 +#: utils/init/miscinit.c:1385 utils/init/miscinit.c:1527 utils/misc/guc.c:10843 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"から読み取れませんでした: %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1515 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "ファイル\"%s\"をオープンできませんでした: %m; とりあえず続けます" -#: utils/init/miscinit.c:1517 +#: utils/init/miscinit.c:1540 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "ロックファイル\"%s\"が誤ったPIDをもっています: %ld、正しくは%ld" -#: utils/init/miscinit.c:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1579 utils/init/miscinit.c:1595 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\"は有効なデータディレクトリではありません" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1581 #, c-format msgid "File \"%s\" is missing." msgstr "ファイル\"%s\"が存在しません" -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1597 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "ファイル\"%s\"に有効なデータがありません。" -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1599 #, c-format msgid "You might need to initdb." msgstr "initdbする必要があるかもしれません" -#: utils/init/miscinit.c:1584 +#: utils/init/miscinit.c:1607 #, 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/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "レプリケーション接続の認証完了: ユーザー=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "接続の認証完了: ユーザー=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" -msgstr "データベース=%s" +msgstr " データベース=%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有効 (プロトコル=%s、暗号化方式=%s、ビット長=%d)" +msgstr " SSL有効(プロトコル=%s、暗号化方式=%s、ビット長=%d)" -#: utils/init/postinit.c:280 +#: utils/init/postinit.c:284 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" msgstr " GSS (認証=%s, 暗号化=%s, プリンシパル=%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 "いいえ" -#: 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 "はい" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (認証=%s, 暗号化=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "データベース\"%s\"はpg_databaseから消失しました" -#: utils/init/postinit.c:325 +#: 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:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "現在データベース\"%s\"は接続を受け付けません" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "データベース\"%s\"へのアクセスが拒否されました" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "ユーザーはCONNECT権限を持ちません。" -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "データベース\"%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 "データベースのロケールがオペレーティングシステムと互換性がありません" -#: 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 "データベースは LC_COLLATE \"%s\"で初期化されていますが、setlocale() でこれを認識されません" -#: 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 "データベースを別のロケールで再生成するか、または不足しているロケールをインストールしてください" -#: 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 "データベースは LC_CTYPE \"%s\"で初期化されていますが、setlocale()でこれを認識されません" -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "データベースシステム内でロールが定義されていません" +msgid "database \"%s\" has a collation version mismatch" +msgstr "データベース\"%s\"で照合順序バージョンの不一致が起きています" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "すぐに CREATE USER \"%s\" SUPERUSER; を実行してください。" +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "データベースは照合順序バージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" + +#: utils/init/postinit.c:471 +#, c-format +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:798 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "データベースのシャットダウン中は、新しいレプリケーション接続は許可されません" +msgid "no roles are defined in this database system" +msgstr "データベースシステム内でロールが定義されていません" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "データベースのシャットダウン中に接続するにはスーパーユーザーである必要があります" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "すぐに CREATE USER \"%s\" SUPERUSER; を実行してください。" -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "バイナリアップグレードモード中に接続するにはスーパーユーザーである必要があります" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "残りの接続スロットはレプリケーションユーザーではないスーパーユーザー用に予約されています" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "walsenderを起動するにはスーパーユーザーまたはreplicationロールである必要があります" -#: utils/init/postinit.c:904 -#, c-format -msgid "database %u does not exist" -msgstr "データベース %u は存在しません" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "削除またはリネームされたばかりのようです。" -#: utils/init/postinit.c:1001 +#: utils/init/postinit.c:1016 +#, c-format +msgid "database %u does not exist" +msgstr "データベース %u は存在しません" + +#: utils/init/postinit.c:1025 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "無効なデータベース\"%s\"への接続はできません" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "データベースのサブディレクトリ\"%s\"がありません。" -#: utils/init/postinit.c:1026 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -25205,11 +25993,6 @@ msgstr "WIN文字セットに対する符号化方式ID %dは想定外です<" msgid "conversion between %s and %s is not supported" msgstr "%sと%s間の変換はサポートされていません" -#: utils/mb/mbutils.c:385 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "符号化方式\"%s\"から\"%s\"用のデフォルト変換関数は存在しません" - #: 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." @@ -25250,1908 +26033,1970 @@ msgstr "符号化方式\"%s\"に対する不正なバイト列です: %s" 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:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "その他" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "ファイルの位置" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "接続と認証/接続設定" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "接続と認証/認証" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "接続と認証/SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "使用リソース/メモリ" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "使用リソース/ディスク" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "使用リソース/カーネルリソース" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "使用リソース / コストベースvacuum遅延" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "使用リソース / バックグラウンド・ライタ" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "使用リソース / 非同期動作" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "先行書き込みログ / 設定" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "先行書き込みログ / アーカイビング" -#: utils/misc/guc.c:748 +#: 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:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "レプリケーション / 送信サーバー" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "レプリケーション / プライマリサーバー" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "レプリケーション / スタンバイサーバー" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "レプリケーション / 購読サーバー" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "問い合わせのチューニング / プランナ手法設定" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "問い合わせのチューニング / プランナコスト定数" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "問い合わせのチューニング / 遺伝的問い合わせオプティマイザ" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "問い合わせのチューニング / その他のプランオプション" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "レポートとログ出力 / ログの出力先" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "レポートとログ出力 / ログのタイミング" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "レポートとログ出力 / ログの内容" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" -msgstr "レポートとログ出力 / プロセスタイトル" +msgstr "レポートとログ出力 / プロセス表記" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "統計情報 / 監視" -#: utils/misc/guc.c:778 -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:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "自動VACUUM" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "クライアント接続のデフォルト設定 / 文の振舞い" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "クライアント接続のデフォルト設定 / ロケールと整形" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "クライアント接続のデフォルト設定 / ライブラリの事前読み込み" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "クライアント接続のデフォルト設定 / その他のデフォルト設定" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "ロック管理" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "バージョンおよびプラットフォーム間の互換性 / PostgreSQLの以前のバージョン" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "バージョンおよびプラットフォーム間の互換性 / 他のプラットフォームおよびクライアント" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "エラーハンドリング" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "事前設定オプション" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "独自オプション" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "開発者向けオプション" -#: utils/misc/guc.c:860 +#: 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:897 +#: 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:959 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "プランナでのシーケンシャルスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:969 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "プランナでのインデックススキャンプランの使用を有効にします。" -#: utils/misc/guc.c:979 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "プランナでのインデックスオンリースキャンプランの使用を有効にします。" -#: utils/misc/guc.c:989 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "プランナでのビットマップスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:999 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "プランナでのTIDスキャンプランの使用を有効にします。" -#: utils/misc/guc.c:1009 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "プランナでの明示的ソートの使用を有効にします。" -#: utils/misc/guc.c:1019 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "プランナでの差分ソート処理の使用を有効にします。" -#: utils/misc/guc.c:1028 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "プランナでのハッシュ集約プランの使用を有効にします。" -#: utils/misc/guc.c:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "プランナでの実体化の使用を有効にします。" -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." -msgstr "プランナでの一時記憶の使用を有効にします。" +msgstr "プランナでのメモ化の使用を有効にします。" -#: utils/misc/guc.c:1058 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "プランナでのネストループジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1068 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "プランナでのマージジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1078 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "プランナでのハッシュジョインプランの使用を有効にします。" -#: utils/misc/guc.c:1088 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "プランナでのギャザーマージプランの使用を有効にします。" -#: utils/misc/guc.c:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "パーティション単位ジョインを有効にします。" -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "パーティション単位の集約およびグルーピングを有効にします。" -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "プランナでの並列アペンドプランの使用を有効にします。" -#: utils/misc/guc.c:1128 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "プランナでの並列ハッシュプランの使用を有効にします。" -#: utils/misc/guc.c:1138 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "実行計画作成時および実行時のパーティション除外処理を有効にします。" -#: utils/misc/guc.c:1139 +#: 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:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "プランナでの非同期アペンドプランの使用を有効にします。" -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "遺伝的問い合わせ最適化を有効にします。" -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "このアルゴリズムでは、全数探索を伴わずに行う実行計画の作成を試みます。" -#: utils/misc/guc.c:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "現在のユーザーがスーパーユーザーかどうかを表示します。" -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour を経由したサーバーのアドバタイズを有効にします。" -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "トランザクションのコミット時刻を収集します。" -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "SSL接続を有効にします。" -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "サーバーリロード時にも ssl_passphrase_command を使用します。" +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "サーバーリロード時にも ssl_passphrase_command を呼び出すかどうかを指定します。" -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "サーバー側の暗号スイート順序を優先します。" -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "強制的に更新をディスクに同期します。" -#: utils/misc/guc.c:1228 -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." +#: utils/misc/guc.c:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "サーバーは、確実に更新が物理的にディスクに書き込まれるように複数の場所でfsync()システムコールを使用します。これにより、オペレーティングシステムやハードウェアがクラッシュした後でもデータベースクラスタは一貫した状態に復旧することができます。" -#: utils/misc/guc.c:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "チェックサムエラーの発生時に処理を継続します。" -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "破損したページヘッダがあっても処理を継続します。" -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "不正ページエラーの発生時に処理を継続します。" -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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:1287 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "チェックポイントの後最初に変更された際にページ全体をWALに出力します。" -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1347 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:1301 +#: utils/misc/guc.c:1360 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "チェックポイントの後最初に更新された時に、重要な更新ではなくてもページ全体をWALに書き出します。" -#: utils/misc/guc.c:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "WALファイルに出力される全ページ出力を圧縮します。" - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." msgstr "新しいWALファイルの使用前にゼロを書き込みます。" -#: utils/misc/guc.c:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "WALファイルを名前を変更して再利用します。" -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "チェックポイントをログに記録します。" -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "成功した接続を全てログに記録します。" -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "セッションの終了時刻とその期間をログに記録します。" -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "各レプリケーションコマンドをログに記録します。" -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "起動中のサーバーがアサーションチェックを有効にしているかどうかを表示します。" -#: utils/misc/guc.c:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "何からのエラーがあればセッションを終了します" -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "バックエンドがクラッシュした後サーバーを再初期化します" -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." -msgstr "バックエンドがクラッシュした後一時ファイルを削除します。" +msgstr "バックエンドのクラッシュ後に一時ファイルを削除します。" -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "完了したSQL全ての実行時間をログに記録します。" -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "問い合わせのパースツリーをログに記録します。" -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "リライト後の問い合わせのパースツリーをログに記録します。" -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "問い合わせの実行計画をログに記録します。" -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "パースツリーと実行計画ツリーの表示をインデントします。" -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "パーサの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "プランナの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "エグゼキュータの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "累積の性能統計情報をサーバーログに出力します。" -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "B-treeの各種操作に関するシステムリソース(メモリとCPU)の使用統計をログに記録します。" -#: utils/misc/guc.c:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "実行中のコマンドに関する情報を収集します。" -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "データベースの活動について統計情報を収集します。" -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." -msgstr "データベースのI/O動作に関する時間測定統計情報を収集します。" +msgstr "データベースのI/O処理時間に関する統計情報を収集します。" -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." -msgstr "WALのI/O使用に関する時間測定統計情報を収集します。" +msgstr "WALのI/O処理時間に関する統計情報を収集します。" -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 msgid "Updates the process title to show the active SQL command." msgstr "活動中のSQLコマンドを表示するようプロセスタイトルを更新します。" -#: utils/misc/guc.c:1555 +#: utils/misc/guc.c:1604 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "新しいSQLコマンドをサーバーが受信する度に行うプロセスタイトルの更新を有効にします。" -#: utils/misc/guc.c:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "autovacuumサブプロセスを起動します。" -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTENとNOTIFYコマンドのためのデバッグ出力を生成します。" -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "ロック使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "ユーザーロックの使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "軽量ロックの使用状況に関する情報を出力します。" -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "デッドロックの発生時点の全てのロックについての情報をダンプします。" -#: utils/misc/guc.c:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "長時間のロック待機をログに記録します。" -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." -msgstr "スタンバイでのリカバリ競合による待機をログ出力します。" +msgstr "スタンバイのリカバリ衝突による待機をログ出力します。" -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "接続ログ内でホスト名を出力します。" -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "\"expr=NULL\"という形の式は\"expr IS NULL\"として扱います。" -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "データベース毎のユーザー名を許可します。" -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 msgid "Sets the default read-only status of new transactions." msgstr "新しいトランザクションのリードオンリー設定のデフォルト値を設定。" -#: utils/misc/guc.c:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "現在のトランザクションのリードオンリー設定を設定。" -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "新しいトランザクションの遅延可否設定のデフォルト値を設定。" -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1762 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "リードオンリーのシリアライズ可能なトランザクションを、シリアライズに失敗することなく実行できるまで遅延させるかどうか" -#: utils/misc/guc.c:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "行セキュリティを有効にします。" -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 msgid "When enabled, row security will be applied to all users." msgstr "有効にすると、行セキュリティが全てのユーザーに適用されます。" -#: utils/misc/guc.c:1732 +#: utils/misc/guc.c:1781 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." -msgstr "CREATE FUNCTIONおよびCREATE PROCEDUREで関数本体を検査します。" +msgstr "CREATE FUNCTIONおよびCREATE PROCEDUREにおいて関数本体を検査します。" -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "配列内のNULL要素入力を有効化。" -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS は今後サポートされません; false のみに設定可能です。" -#: utils/misc/guc.c:1768 +#: utils/misc/guc.c:1817 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "標準エラー出力、CSVログ、またはその両方をログファイルに捕捉するための子プロセスを開始します。" -#: utils/misc/guc.c:1777 +#: utils/misc/guc.c:1826 msgid "Truncate existing log files of same name during log rotation." msgstr "ログローテーション時に既存の同一名称のログファイルを切り詰めます。" -#: utils/misc/guc.c:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "ソート中にリソース使用状況に関する情報を発行します。" -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "同期スキャン処理のデバッグ出力を生成します。" -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "ヒープソートを使用した境界のソート処理を有効にします" -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "WAL関連のデバッグ出力を出力します。" -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." -msgstr "日付時刻は整数ベースかどうかを示します。" +msgstr "日付時刻が整数ベースかどうかを表示します。" -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "KerberosおよびGSSAPIユーザー名を大文字小文字を区別して扱うかどうかを設定します。" -#: utils/misc/guc.c:1863 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "普通の文字列リテラル内のバックスラッシュエスケープを警告します。" -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "'...' 文字列はバックスラッシュをそのまま扱います。" -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "同期シーケンシャルスキャンを有効にします。" -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "リカバリ目標のトランザクションを含めるか除外するかを設定。" -#: utils/misc/guc.c:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "リカバリ中でも接続と問い合わせを受け付けます" -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "問い合わせの衝突を避けるためのホットスタンバイからプライマリへのフィードバックを受け付けます" -#: utils/misc/guc.c:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "現在ホットスタンバイが有効であるかどうかを示します。" -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "システムテーブル構造の変更を許可。" -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "システムインデックスの読み取りを無効にします。" -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "これはインデックスの更新は妨げないため使用しても安全です。最も大きな悪影響は低速化です。" -#: utils/misc/guc.c:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "pg_tblspc直下のテーブル空間を許可します、テスト用。" -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "ラージオブジェクトで権限チェックを行う際、後方互換性モードを有効にします。" -#: utils/misc/guc.c:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL文を生成する時に、すべての識別子を引用符で囲みます。" -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 msgid "Shows whether data checksums are turned on for this cluster." msgstr "データチェックサムがこのクラスタで有効になっているかどうかを表示します。" -#: utils/misc/guc.c:2001 +#: utils/misc/guc.c:2050 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "シーケンス番号を付加することでsyslogメッセージの重複を防ぎます。" -#: utils/misc/guc.c:2011 +#: utils/misc/guc.c:2060 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "syslogに送出するメッセージを行単位で分割して、1024バイトに収まるようにします。" -#: utils/misc/guc.c:2021 +#: utils/misc/guc.c:2070 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Gather および Gather Merge でも下位プランを実行するかどうかを制御します。" -#: utils/misc/guc.c:2022 +#: utils/misc/guc.c:2071 msgid "Should gather nodes also run subplans or just gather tuples?" -msgstr "Gather ノードでも下位プランを実行するか、もしくはただタプルの収集のみを行うかを指定します。" +msgstr "Gather ノードでも下位プランを実行するのか、もしくはただタプルの収集のみを行うのか?" -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "JITコンパイルを許可します。" -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "JITコンパイルされた関数をデバッガに登録します。" -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVMビットコードを出力して、JITデバッグを容易にします。" -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "式のJITコンパイルを許可します。" -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "perfプロファイラにJITコンパイルされた関数を登録します。" -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "タプル分解処理のJITコンパイルを許可します。" -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 msgid "Whether to continue running after a failure to sync data files." msgstr "データファイルの同期失敗の後に処理を継続するかどうか。" -#: utils/misc/guc.c:2119 +#: utils/misc/guc.c:2168 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "永続レプリケーションスロットがない場合にWALレシーバが一時スロットを作成するかどうかを設定します。" -#: utils/misc/guc.c:2137 -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:2186 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "次のWALへの強制切り替え時間を設定します。" -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "認証後、接続開始までN秒待機します。" +#: utils/misc/guc.c:2197 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "接続開始時の認証後の待ち時間を設定します。" -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "これによりデバッガがプロセスに接続できます。" -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "デフォルトの統計情報収集目標を設定。" -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "副問い合わせを展開する上限のFROMリストのサイズを設定。" -#: utils/misc/guc.c:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "JOIN式を平坦化する上限のFROMリストのサイズを設定。" -#: utils/misc/guc.c:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "この数を超えるとGEQOを使用するFROM項目数の閾値を設定。" -#: utils/misc/guc.c:2204 +#: utils/misc/guc.c:2254 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effortは他のGEQOパラメータのデフォルトを設定するために使用されます。" -#: utils/misc/guc.c:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: 集団内の個体数。" -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "0は適切なデフォルト値を選択します。" -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: アルゴリズムの反復回数です。" -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "デッドロック状態があるかどうかを調べる前にロックを待つ時間を設定。" -#: utils/misc/guc.c:2247 +#: utils/misc/guc.c:2297 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "ホットスタンバイサーバーがアーカイブされた WAL データを処理している場合は、問い合わせをキャンセルする前に遅延秒数の最大値を設定。" -#: utils/misc/guc.c:2258 +#: utils/misc/guc.c:2308 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "ホットスタンバイサーバーがストリームの WAL データを処理している場合は、問い合わせをキャンセルする前に遅延秒数の最大値を設定。" -#: utils/misc/guc.c:2269 +#: utils/misc/guc.c:2319 msgid "Sets the minimum delay for applying changes during recovery." msgstr "リカバリ中の変更の適用の最小遅延時間を設定します。" -#: utils/misc/guc.c:2280 +#: utils/misc/guc.c:2330 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "WAL受信プロセスが送出側サーバーへ行う状況報告の最大間隔を設定。" -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2341 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "送出側サーバーからのデータ受信を待機する最長時間を設定。" -#: utils/misc/guc.c:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "同時接続数の最大値を設定。" -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "スーパーユーザーによる接続用に予約される接続スロットの数を設定。" -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "起動時に予約される動的共有メモリの量。" -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 msgid "Sets the number of shared memory buffers used by the server." msgstr "サーバーで使用される共有メモリのバッファ数を設定。" -#: utils/misc/guc.c:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "サーバーの主共有メモリ領域のサイズを表示します(MB単位に切り上げられます)" + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "主共有メモリ領域に必要となるヒュージページの数を表示します。" + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1はこの値が確定できなかったことを示します。" + +#: utils/misc/guc.c:2421 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "各セッションで使用される一時バッファの最大数を設定。" -#: utils/misc/guc.c:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "サーバーが接続を監視するTCPポートを設定。" -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Unixドメインソケットのアクセス権限を設定。" -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "ログファイルのパーミッションを設定。" -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." -msgstr "データディレクトリのパーミッション値を示します。" +msgstr "データディレクトリのモードを表示します。" -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 msgid "Sets the maximum memory to be used for query workspaces." msgstr "問い合わせの作業用空間として使用されるメモリの最大値を設定。" -#: utils/misc/guc.c:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "保守作業で使用される最大メモリ量を設定。" -#: utils/misc/guc.c:2428 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "VACUUMやCREATE INDEXなどの作業が含まれます。" -#: utils/misc/guc.c:2438 +#: utils/misc/guc.c:2510 msgid "Sets the maximum memory to be used for logical decoding." msgstr "論理デコーディングで使用するメモリ量の上限を設定します。" -#: utils/misc/guc.c:2439 +#: utils/misc/guc.c:2511 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "個々の内部リオーダバッファはディスクに書き出す前にこれだけの量のメモリを使用することができます。" -#: utils/misc/guc.c:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "スタック長の最大値をキロバイト単位で設定。" -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 msgid "Limits the total size of all temporary files used by each process." msgstr "各プロセスで使用される全ての一時ファイルの合計サイズを制限します。" -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1は無制限を意味します。" -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 msgid "Vacuum cost for a page found in the buffer cache." msgstr "バッファキャッシュにある1つのページをVACUUM処理する際のコスト。" -#: utils/misc/guc.c:2487 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "バッファキャッシュにない1つのページをVACUUM処理する際のコスト。" -#: utils/misc/guc.c:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "VACUUM処理が1つのページをダーティにした際に課すコスト。" -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "VACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "自動VACUUM用のVACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "各サーバープロセスで同時にオープンできるファイルの最大数を設定。" -#: utils/misc/guc.c:2540 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "同時に準備状態にできるトランザクションの最大数を設定。" -#: utils/misc/guc.c:2551 +#: utils/misc/guc.c:2623 msgid "Sets the minimum OID of tables for tracking locks." msgstr "ロックの追跡を行うテーブルの最小のOIDを設定。" -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "システムテーブルに関するの出力を避けるために使います。" -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "無条件でロックの追跡を行うテーブルのOIDを設定。" -#: utils/misc/guc.c:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "あらゆる文に対して実行時間として許容する上限値を設定。" -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "0でこのタイムアウトは無効になります。 " -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "ロックの待機の最大許容時間を設定。" -#: utils/misc/guc.c:2595 +#: utils/misc/guc.c:2667 msgid "Sets the maximum allowed idle time between queries, when in a transaction." -msgstr "トランザクション内において、許容する問い合わせ間のアイドル時間の上限値を設定。" +msgstr "問い合わせ間のアイドル時間のトランザクション内における最大許容値を設定。" -#: utils/misc/guc.c:2606 +#: utils/misc/guc.c:2678 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." -msgstr "トランザクション外において、許容する問い合わせ間のアイドル時間の上限値を設定。" +msgstr "問い合わせ間のアイドル時間のトランザクション外における最大許容値を設定。" -#: utils/misc/guc.c:2617 +#: utils/misc/guc.c:2689 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "VACUUM にテーブル行の凍結をさせる最小のトランザクションID差分。" -#: utils/misc/guc.c:2627 +#: utils/misc/guc.c:2699 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "行の凍結のためのテーブル全体スキャンを強制させる時のトランザクションID差分。" -#: utils/misc/guc.c:2637 +#: utils/misc/guc.c:2709 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "テーブル行でのマルチトランザクションIDの凍結を強制する最小のマルチトランザクション差分。" -#: utils/misc/guc.c:2647 +#: utils/misc/guc.c:2719 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "行の凍結のためにテーブル全体スキャンを強制する時点のマルチトランザクション差分。" -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2729 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "設定していれば、VACUUMやHOTのクリーンアップを遅延させるトランザクション数。" -#: utils/misc/guc.c:2666 +#: utils/misc/guc.c:2738 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "VACUUMが周回によるデータロスを防ぐためにフェイルセーフを発動するの経過トランザクション数。" +msgstr "VACUUMにおいて周回による停止を回避するためのフェイルセーフを実行されるまでの経過トランザクション数。" -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2747 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "VACUUMが周回によるデータロスを防ぐためにフェイルセーフを発動するの経過マルチトランザクション数。" +msgstr "VACUUMにおいて周回による停止を回避するためのフェイルセーフが実行されるまでの経過マルチトランザクション数。" -#: utils/misc/guc.c:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "1トランザクション当たりのロック数の上限を設定。" -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "1トランザクション当たりの述語ロック数の上限を設定。" -#: utils/misc/guc.c:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "1リレーション当たりで述語ロックされるページとタプルの数の上限値を設定。" -#: utils/misc/guc.c:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "1ページあたりで述語ロックされるタプル数の上限値を設定。" -#: utils/misc/guc.c:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 msgid "Sets the maximum allowed time to complete client authentication." msgstr "クライアント認証の完了までの最大許容時間を設定。" -#: utils/misc/guc.c:2746 -msgid "Waits N seconds on connection startup before authentication." -msgstr "接続開始の際、認証前にN秒待機します。" +#: utils/misc/guc.c:2818 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "接続開始時の認証前の待ち時間を設定します。" + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "リカバリ中のWAL先読みバッファのサイズ。" + +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "被参照データブロックの事前読み込みのためのWAL先読みの最大量。" -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2841 msgid "Sets the size of WAL files held for standby servers." msgstr "スタンバイサーバーのために確保するWALの量を設定します。" -#: utils/misc/guc.c:2768 +#: utils/misc/guc.c:2852 msgid "Sets the minimum size to shrink the WAL to." msgstr "WALを縮小させる際の最小のサイズを設定。" -#: utils/misc/guc.c:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "チェックポイントの契機となるWALのサイズを指定。" -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "自動WALチェックポイントの最大間隔を設定。" -#: utils/misc/guc.c:2803 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "チェックポイントセグメントがこの値よりも短い時間で使い切られた時に警告します。" +#: utils/misc/guc.c:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "WALの量契機のチェックポイントが高頻度で起きる場合に、警告を発するまでの回数を設定。" -#: utils/misc/guc.c:2805 -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:2889 +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:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "すでに実行された書き込みがディスクに書き出されるまでのページ数。" -#: utils/misc/guc.c:2828 +#: utils/misc/guc.c:2913 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "共有メモリ内に割り当てられた、WALデータ用のディスクページバッファ数を設定。" -#: utils/misc/guc.c:2839 +#: utils/misc/guc.c:2924 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WALライタで実行する書き出しの時間間隔。" -#: utils/misc/guc.c:2850 +#: utils/misc/guc.c:2935 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "書き出しが実行されるまでにWALライタで出力するWALの量。" -#: utils/misc/guc.c:2861 +#: utils/misc/guc.c:2946 msgid "Minimum size of new file to fsync instead of writing WAL." -msgstr "新しいファイルでWALを出力する代わりにfsyncする最小サイズ。" +msgstr "WALを出力する代わりにfsyncを使用する新規ファイルの最小サイズ。" -#: utils/misc/guc.c:2872 +#: utils/misc/guc.c:2957 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "WAL送信プロセスの最大同時実行数を設定。" -#: utils/misc/guc.c:2883 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "同時に定義できるレプリケーションスロットの数の最大値を設定。" -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2978 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "レプリケーションスロットで確保できるWALの量の最大値を設定します。" -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 msgid "Sets the maximum time to wait for WAL replication." msgstr "WALレプリケーションを待つ時間の最大値を設定。" -#: utils/misc/guc.c:2917 +#: utils/misc/guc.c:3002 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "トランザクションのコミットからWALのディスク書き出しまでの遅延時間をマイクロ秒単位で設定。" -#: utils/misc/guc.c:2929 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "commit_delay の実行の契機となる、同時に開いているトランザクション数の最小値を設定。" +#: utils/misc/guc.c:3014 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "commit_delay の実行に必要となる、同時に開いているトランザクション数の最小値を設定。" -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 msgid "Sets the number of digits displayed for floating-point values." msgstr "浮動小数点値の表示桁数を設定。" -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 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:2956 +#: utils/misc/guc.c:3041 msgid "Zero logs a sample of all queries. -1 turns this feature off." -msgstr "ゼロにすると全ての問い合わせからサンプリングして記録します。-1はこの機能を無効にします。" +msgstr "ゼロにすると全ての問い合わせを記録します。-1はこの機能を無効にします。" -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:3051 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "全ての文のログを記録する最小の実行時間を設定。" -#: utils/misc/guc.c:2968 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." msgstr "ゼロにすると全ての問い合わせを出力します。-1はこの機能を無効にします。" -#: utils/misc/guc.c:2978 +#: utils/misc/guc.c:3063 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "自動VACUUMの活動のログを記録する最小の実行時間を設定。" -#: utils/misc/guc.c:2980 +#: utils/misc/guc.c:3065 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "ゼロはすべての活動を出力します。-1は自動VACUUMのログ記録を無効にします。" -#: utils/misc/guc.c:2990 -msgid "When logging statements, limit logged parameter values to first N bytes." -msgstr "ステートメントをログに出力する際に、記録するパラメータの値を最初のNバイトに制限します。" +#: utils/misc/guc.c:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "問い合わせ文をログ出力する際に、出力するbindパラメータ値データの最大バイト数を設定。" -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 で値を全て出力します。" -#: utils/misc/guc.c:3001 -msgid "When reporting an error, limit logged parameter values to first N bytes." -msgstr "エラー報告の際に、記録するパラメータの値を最初のNバイトに制限します。" +#: utils/misc/guc.c:3087 +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:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "バックグランドライタの周期毎の待機時間" -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "バックグランドライタが1周期で書き出すLRUページ数の最大値。" -#: utils/misc/guc.c:3046 +#: utils/misc/guc.c:3133 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "ディスクサブシステムが効率的に処理可能な同時並行リクエスト数" -#: utils/misc/guc.c:3064 +#: utils/misc/guc.c:3151 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr " effective_io_concurrency の保守作業に使用される変種。" -#: utils/misc/guc.c:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "同時に実行されるワーカープロセス数の最大値です。" -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "レプリケーションワーカープロセス数の最大値です。" -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "サブスクリプション毎のテーブル同期ワーカー数の最大値です。" -#: utils/misc/guc.c:3127 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "ログファイルの自動ローテーションはN秒経過の際に行われます。" +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "ログファイルのローテーションを行う時間間隔を設定します。" -#: utils/misc/guc.c:3138 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "ログファイルの自動ローテーションはNキロバイト書き込んだ際に行われます。" +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "ローテートされるまでに許容するログファイルの最大サイズを設定します。" -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "関数の引数の最大数を示します。" -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "インデックスキーの最大数を示します。" -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "識別子の最大長を示します。" -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "ディスクブロックサイズを示します。" -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "ディスクファイルごとのページ数を表示します。" -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "先行書き込みログ(WAL)におけるブロックサイズを表示します" -#: utils/misc/guc.c:3215 +#: utils/misc/guc.c:3305 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "WALの取り出しの失敗後に再試行する回数を設定。" -#: utils/misc/guc.c:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "先行書き込みログ(WAL)セグメントのサイズを表示します" -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "自動VACUUMの実行開始間隔。" -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "VACUUMを行うまでの、タプルを更新または削除した回数の最小値。" -#: utils/misc/guc.c:3259 +#: utils/misc/guc.c:3349 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." -msgstr "VACUUMが実行されるまでの、タプル挿入回数の最小値、または-1で挿入VACUUMを無効化します。" +msgstr "VACUUMが行われるまでの行挿入の回数の最小値、-1で挿入契機のVACUUMを無効化します。" -#: utils/misc/guc.c:3268 +#: utils/misc/guc.c:3358 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "ANALYZEが実行されるまでの、タプルを挿入、更新、削除した回数の最小値。" -#: utils/misc/guc.c:3278 +#: utils/misc/guc.c:3368 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "トランザクションID周回を防ぐためにテーブルを自動VACUUMする時点のトランザクションID差分。" -#: utils/misc/guc.c:3293 +#: utils/misc/guc.c:3380 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "マルチトランザクション周回を防止するためにテーブルを自動VACUUMする、マルチトランザクション差分。" -#: utils/misc/guc.c:3303 +#: utils/misc/guc.c:3390 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "自動VACUUMのワーカープロセスの最大同時実行数を設定。" -#: utils/misc/guc.c:3313 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "ひとつの保守作業に割り当てる並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc.c:3323 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per executor node." msgstr "エグゼキュータノードあたりの並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc.c:3334 +#: utils/misc/guc.c:3421 msgid "Sets the maximum number of parallel workers that can be active at one time." -msgstr "同時に実行可能な並列処理ワーカーの数の最大値を設定。" +msgstr "同時に活動可能な並列処理ワーカーの数の最大値を設定。" -#: utils/misc/guc.c:3345 +#: utils/misc/guc.c:3432 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "自動VACUUMプロセスで使用するメモリ量の最大値を設定。" -#: utils/misc/guc.c:3356 +#: utils/misc/guc.c:3443 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "スナップショット取得後、更新されたページが読み取れなくなるまでの時間。" -#: utils/misc/guc.c:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "-1でこの機能を無効にします。" -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "TCPキープアライブを発行する時間間隔。" -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "0でシステムのデフォルトを使用します。" -#: utils/misc/guc.c:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "TCPキープアライブの再送信の時間間隔。" -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSLの再ネゴシエーションは今後サポートされません; 0のみに設定可能です。" -#: utils/misc/guc.c:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCPキープアライブの再送信回数の最大値です。" -#: utils/misc/guc.c:3401 -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:3488 +msgid "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:3412 +#: utils/misc/guc.c:3499 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "GINによる正確な検索に対して許容する結果数の最大値を設定。" -#: utils/misc/guc.c:3423 +#: utils/misc/guc.c:3510 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "プランナが想定するデータキャッシュ全体のサイズを設定。" -#: utils/misc/guc.c:3424 +#: utils/misc/guc.c:3511 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のディスクページを単位とします。" -#: utils/misc/guc.c:3435 +#: utils/misc/guc.c:3522 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "並列スキャンを検討するテーブルデータの量の最小値を設定。" -#: utils/misc/guc.c:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "並列スキャンを検討するインデックスデータの量の最小値を設定。" -#: utils/misc/guc.c:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "サーバーのバージョンを整数値で表示します。" -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "このキロバイト数よりも大きな一時ファイルの使用をログに記録します。" -#: utils/misc/guc.c:3470 +#: utils/misc/guc.c:3557 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "ゼロにすると、全てのファイルを記録します。デフォルトは-1です(この機能を無効にします)。" -#: utils/misc/guc.c:3480 +#: utils/misc/guc.c:3567 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "pg_stat_activity.queryのために予約するサイズをバイト単位で設定。" -#: utils/misc/guc.c:3491 +#: utils/misc/guc.c:3578 msgid "Sets the maximum size of the pending list for GIN index." msgstr "GINインデックスの保留リストの最大サイズを設定。" -#: utils/misc/guc.c:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "TCPユーザータイムアウト。" -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "要求が見込まれるヒュージページのサイズ。" -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." -msgstr "デバッグを目的としてシステムキャッシュを積極的に消去します。" +msgstr "デバッグ目的のために積極的にシステムキャッシュを消去する。" -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 msgid "Sets the time interval between checks for disconnection while running queries." -msgstr "問い合わせ実行中に接続断のチェックを行う間隔を設定。" +msgstr "問い合わせ実行中に接続確認を行う時間間隔を設定します。" -#: utils/misc/guc.c:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "起動処理が長引いた際のステータス更新の時間間隔。" + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "ゼロにするとこの機能を無効にします。" + +#: utils/misc/guc.c:3666 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "ひと続きに読み込むディスクページについてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3578 +#: utils/misc/guc.c:3677 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "ひと続きでは読み込めないディスクページについてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3589 +#: utils/misc/guc.c:3688 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "一つのタプル(行)の処理についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3600 +#: utils/misc/guc.c:3699 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "インデックススキャンにおける一つのインデックスエントリの処理についてプランナで使用する見積もりコストを設定。 " -#: utils/misc/guc.c:3611 +#: utils/misc/guc.c:3710 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "一つの演算子または関数の処理についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3622 +#: utils/misc/guc.c:3721 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." -msgstr "並列処理ワーカーからリーダーバックエンドへの一つのタプルの受け渡しについてプランナが使用する見積もりコストを設定。" +msgstr "並列処理ワーカーからリーダーバックエンドへの一つのタプル(行)の受け渡しについてプランナが使用する見積もりコストを設定。" -#: utils/misc/guc.c:3633 +#: utils/misc/guc.c:3732 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "並列問い合わせ実行のためのワーカープロセスの起動についてプランナで使用する見積もりコストを設定。" -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3744 msgid "Perform JIT compilation if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルを実行します。" -#: utils/misc/guc.c:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 でJITコンパイルを禁止します。" -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数を最適化します。" -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1で最適化を行わなくなります。" -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数をインライン化します。" -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 でインライン化を禁止します。" -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "カーソルから取り出される行数の全行に対する割合についてプランナで使用する値を設定。" -#: utils/misc/guc.c:3690 +#: utils/misc/guc.c:3789 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "再帰問い合わせでプランナが使用する中間テーブルの平均見積もりサイズを設定します。" + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 集合内の選択圧力。" -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: ランダムパス選択用のシード" -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 msgid "Multiple of work_mem to use for hash tables." msgstr "ハッシュテーブルで使用するwork_memの倍率。" -#: utils/misc/guc.c:3723 +#: utils/misc/guc.c:3834 msgid "Multiple of the average buffer usage to free per round." msgstr "周期ごとに解放するバッファ数の平均バッファ使用量に対する倍数" -#: utils/misc/guc.c:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "乱数生成用のシードを設定。" -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "ミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "自動VACUUM用のミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "VACUUMが実行されるまでのタプルの更新または削除回数のreltuplesに対する割合。" -#: utils/misc/guc.c:3776 +#: utils/misc/guc.c:3887 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "VACUUMが実行されるまでのタプルの挿入行数のreltuplesに対する割合。" -#: utils/misc/guc.c:3786 +#: utils/misc/guc.c:3897 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "ANALYZEが実行されるまでのタプルの更新または削除回数のreltuplesに対する割合。" -#: utils/misc/guc.c:3796 +#: utils/misc/guc.c:3907 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "チェックポイント中にダーティバッファの書き出しに使う時間のチェックポイント間隔に対する割合。" -#: utils/misc/guc.c:3806 +#: utils/misc/guc.c:3917 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "log_min_duration_sampleを超過した文のうちログ出力を行う割合。" -#: utils/misc/guc.c:3807 +#: utils/misc/guc.c:3918 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "0.0(ログ出力しない)から1.0(すべてログ出力する)の間の値を指定してください。" -#: utils/misc/guc.c:3816 +#: utils/misc/guc.c:3927 msgid "Sets the fraction of transactions from which to log all statements." -msgstr "すべての文をログ出力するトランザクションの割合を設定。" +msgstr "すべての文をログ出力するトランザクションの割合を設定します。" -#: utils/misc/guc.c:3817 +#: utils/misc/guc.c:3928 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:3836 +#: utils/misc/guc.c:3947 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "WALファイルの保管のために呼び出されるシェルスクリプトを設定。" +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "これは\"archive_library\"が設定されていない場合にのみ使用されます。" + +# hoge +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "WALファイルのアーカイブのために呼び出すライブラリを設定します。" + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "空文字列で\"archive_command\"を使用することを示します。" + # hoge -#: utils/misc/guc.c:3846 +#: utils/misc/guc.c:3967 msgid "Sets the shell command that will be called to retrieve an archived WAL file." -msgstr "アーカイブされたWALファイルを取り出すために呼び出されるシェルコマンドを設定。" +msgstr "アーカイブされたWALファイルを取り出すために呼び出すシェルコマンドを設定します。" # hoge -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:3977 msgid "Sets the shell command that will be executed at every restart point." msgstr "リスタートポイントの時に実行するシェルコマンドを設定。" # hoge -#: utils/misc/guc.c:3866 +#: utils/misc/guc.c:3987 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "リカバリ終了時に1度だけ実行されるシェルコマンドを設定。" -#: utils/misc/guc.c:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "リカバリの目標タイムラインを指定します。" -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "\"immediate\"を指定すると一貫性が確保できた時点でリカバリを終了します。" -#: utils/misc/guc.c:3895 +#: utils/misc/guc.c:4016 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "リカバリを指定したトランザクションIDまで進めます。" -#: utils/misc/guc.c:3904 +#: utils/misc/guc.c:4025 msgid "Sets the time stamp up to which recovery will proceed." msgstr "リカバリを指定したタイムスタンプの時刻まで進めます。" -#: utils/misc/guc.c:3913 +#: utils/misc/guc.c:4034 msgid "Sets the named restore point up to which recovery will proceed." msgstr "リカバリを指定した名前のリストアポイントまで進めます。" -#: utils/misc/guc.c:3922 +#: utils/misc/guc.c:4043 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "リカバリを先行書き込みログの指定したLSNまで進めます。" -#: utils/misc/guc.c:3932 +#: utils/misc/guc.c:4053 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "作成することでスタンバイでのリカバリを終了させるファイルの名前を指定します。" -#: utils/misc/guc.c:3942 +#: utils/misc/guc.c:4063 msgid "Sets the connection string to be used to connect to the sending server." msgstr "送出側サーバーへの接続に使用する接続文字列をしています。" -#: utils/misc/guc.c:3953 +#: utils/misc/guc.c:4074 msgid "Sets the name of the replication slot to use on the sending server." msgstr "送出サーバーで使用するレプリケーションスロットの名前を設定。" -#: utils/misc/guc.c:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "クライアントの文字集合の符号化方式を設定。" -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "各ログ行の前に付ける情報を制御します。" -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "もし空であればなにも付加しません。" -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "ログメッセージ使用するタイムゾーンを設定。" -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "日付時刻値の表示用書式を設定。" -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "曖昧な日付の入力の解釈も制御します。" -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "新規テーブルで使用されるデフォルトテーブルアクセスメソッドを設定。" -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4138 msgid "Sets the default tablespace to create tables and indexes in." msgstr "テーブルとインデックスの作成先となるデフォルトのテーブル空間を設定。" -#: utils/misc/guc.c:4018 +#: utils/misc/guc.c:4139 msgid "An empty string selects the database's default tablespace." msgstr "空文字列はデータベースのデフォルトのテーブル空間を選択します。" -#: utils/misc/guc.c:4028 +#: utils/misc/guc.c:4149 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "一時テーブルとファイルのソートで使用されるテーブル空間を設定。" -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "動的ロード可能モジュールのパスを設定。" -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberosサーバーキーファイルの場所を設定。" -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Bonjour サービス名を設定。" -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "テキストデータのソート時に使用されるロケールを表示します。" -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "文字クラス分類、大文字小文字変換を決定するロケールを表示します。" -#: utils/misc/guc.c:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "表示用メッセージの言語を設定。" -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "通貨書式で使用するロケールを設定。 " -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "数字の書式で使用するロケールを設定。" -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting date and time values." msgstr "日付と時間の書式で使用するロケールを設定。" -#: utils/misc/guc.c:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "各バックエンドに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "サーバーに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "各バックエンドに事前読み込みする非特権共有ライブラリを列挙します。" -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4292 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "スキーマ部を含まない名前に対するスキーマの検索順を設定。" -#: utils/misc/guc.c:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." -msgstr "サーバー(データベース)文字セット符号化方式を表示。" +msgstr "サーバー(データベース)文字セット符号化方式を表示します。" -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "サーバーのバージョンを表示します。" -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "現在のロールを設定。" -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "セッションユーザー名を設定。" -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "サーバーログの出力先を設定。" -#: utils/misc/guc.c:4231 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." -msgstr "有効な値は、プラットフォームに依存しますが、\"stderr\"、\"syslog\"、\"csvlog\"、\"eventlog\"の組み合わせです。" +#: utils/misc/guc.c:4352 +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:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "ログファイルの格納ディレクトリを設定。" -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "データディレクトリからの相対パスでも絶対パスでも指定できます" -#: utils/misc/guc.c:4253 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "ログファイルのファイル名パターンを設定。" -#: utils/misc/guc.c:4264 +#: utils/misc/guc.c:4385 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "syslog内でPostgreSQLのメッセージを識別するために使用されるプログラム名を設定。" -#: utils/misc/guc.c:4275 +#: utils/misc/guc.c:4396 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "イベントログ内でPostgreSQLのメッセージを識別するために使用されるアプリケーション名を設定。" -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4407 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "タイムスタンプの表示と解釈に使用するタイムゾーンを設定。" -#: utils/misc/guc.c:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "タイムゾーン省略形用のファイルを選択します。" -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Unixドメインソケットを所有するグループを設定。" -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 msgid "The owning user of the socket is always the user that starts the server." -msgstr "ソケットを所有するユーザーは常にサーバーを開始したユーザー。" +msgstr "ソケットを所有するユーザーは常にサーバーを開始したユーザーです。" -#: utils/misc/guc.c:4317 +#: utils/misc/guc.c:4438 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Unixドメインソケットの作成先ディレクトリを設定。" -#: utils/misc/guc.c:4332 +#: utils/misc/guc.c:4453 msgid "Sets the host name or IP address(es) to listen to." msgstr "接続を監視するホスト名またはIPアドレスを設定。" -#: utils/misc/guc.c:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "サーバーのデータディレクトリを設定。" -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "サーバーのメイン設定ファイルを設定。" -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "サーバーの\"hba\"設定ファイルを設定。" -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "サーバーの\"ident\"設定ファイルを設定。" -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "postmasterのPIDを指定したファイルに書き込みます。" -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." -msgstr "SSLライブラリの名前を表示。" +msgstr "SSLライブラリの名前を表示します。" -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." -msgstr "SSLサーバー証明書ファイルの場所。" +msgstr "SSLサーバー証明書ファイルの場所です" -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server private key file." -msgstr "SSLサーバー秘密鍵ファイルの場所。" +msgstr "SSLサーバー秘密鍵ファイルの場所です。" -#: utils/misc/guc.c:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." -msgstr "SSL認証局ファイルの場所。" +msgstr "SSL認証局ファイルの場所です" -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." -msgstr "SSL証明書失効リストファイルの場所。" +msgstr "SSL証明書失効リストファイルの場所です。" -#: utils/misc/guc.c:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." -msgstr "SSL証明書失効リストディレクトリの場所。" - -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "一時的な統計情報ファイルを指定したディレクトリに書き込みます。" +msgstr "SSL証明書失効リストディレクトリの場所です。" -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "同期スタンバイの数と同期スタンバイ候補の名前の一覧。" -#: utils/misc/guc.c:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "デフォルトのテキスト検索設定を設定します。" -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "SSL暗号として許されるリストを設定。" -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "ECDHで使用する曲線を設定。" -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "SSLのDHパラメータファイルの場所です。" -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "SSLのパスフレーズを取得するコマンド。" -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 msgid "Sets the application name to be reported in statistics and logs." msgstr "統計やログで報告されるアプリケーション名を設定。" -#: utils/misc/guc.c:4562 +#: utils/misc/guc.c:4672 msgid "Sets the name of the cluster, which is included in the process title." msgstr "プロセスのタイトルに含まれるクラスタ名を指定。" -#: utils/misc/guc.c:4573 +#: utils/misc/guc.c:4683 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "WALの整合性チェックを行う対象とするリソースマネージャを設定。" -#: utils/misc/guc.c:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "使用するJITプロバイダ。" -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "これらの関数でエラーが起きた場合にはバックトレースをログに出力します。" -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "文字列リテラルで\"\\'\"が許可されるかどうかを設定。" -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "bytea の出力フォーマットを設定。" -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 msgid "Sets the message levels that are sent to the client." msgstr "クライアントに送信される最小のメッセージレベルを設定。" -#: utils/misc/guc.c:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 utils/misc/guc.c:4919 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr " 各レベルにはそのレベル以下の全てが含まれます。レベルを低くするほど、送信されるメッセージはより少なくなります。 " -#: utils/misc/guc.c:4646 -msgid "Compute query identifiers." -msgstr "問い合わせ識別子を計算します。" +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "問い合わせ識別子の内部生成を有効にする。" -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 msgid "Enables the planner to use constraints to optimize queries." msgstr "問い合わせの最適化の際にプランナに制約を利用させる。" -#: utils/misc/guc.c:4657 +#: utils/misc/guc.c:4767 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "制約により、問い合わせに一致する行がないことが保証されているテーブルをスキップします。" -#: utils/misc/guc.c:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." -msgstr "圧縮可能な列で使用されるデフォルト圧縮方式を設定。" +msgstr "圧縮可能な値に対して使用されるデフォルト圧縮方式を設定。" -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "新規トランザクションのトランザクション分離レベルを設定。" -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "現在のトランザクションの分離レベルを設定。" -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "インターバル値の表示フォーマットを設定。" -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "ログ出力メッセージの詳細度を設定。" -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "ログに出力するメッセージレベルを設定。" -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 msgid "Causes all statements generating error at or above this level to be logged." msgstr "このレベル以上のエラーを発生させた全てのSQL文をログに記録します。" -#: utils/misc/guc.c:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "ログ出力する文の種類を設定。" -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "syslogを有効にした場合に使用するsyslog \"facility\"を設定。" -#: utils/misc/guc.c:4768 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." -msgstr "トリガーと書き換えルールに関するセッションの動作を設定。" +msgstr "トリガと書き換えルールに関するセッションの動作を設定。" -#: utils/misc/guc.c:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "現在のトランザクションの同期レベルを設定。" -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "archive_command を使用したWALファイルのアーカイブ処理を許可。" -#: utils/misc/guc.c:4798 +#: utils/misc/guc.c:4908 msgid "Sets the action to perform upon reaching the recovery target." msgstr "リカバリ目標に到達した際の動作を設定。" -#: utils/misc/guc.c:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "リカバリ関連のデバッグ情報の記録を行う" -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 msgid "Collects function-level statistics on database activity." msgstr "データベースの動作に関して、関数レベルの統計情報を収集します。" -#: utils/misc/guc.c:4834 +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "統計情報読み出し時の一貫性レベルを設定します。" + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "WALファイルに出力される全ページ出力を指定した方式で圧縮します。" + +#: utils/misc/guc.c:4966 msgid "Sets the level of information written to the WAL." -msgstr "WALに書き出される情報のレベルを設定。" +msgstr "WALに書き出される情報のレベルを設定します。" -#: utils/misc/guc.c:4844 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "動的共有メモリで使用する実装を選択します。" -#: utils/misc/guc.c:4854 +#: utils/misc/guc.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "主共有メモリ領域に使用する共有メモリ実装を選択します。" -#: utils/misc/guc.c:4864 +#: utils/misc/guc.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "WAL更新のディスクへの書き出しを強制するめの方法を選択します。" -#: utils/misc/guc.c:4874 +#: utils/misc/guc.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "XMLでどのようにバイナリ値を符号化するかを設定します。" -#: utils/misc/guc.c:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "LinuxおよびWindowsでヒュージページを使用。" -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "リカバリ中に被参照ブロックの事前読み込みを行う。" + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "キャッシュされていないデータへの参照の検出のためにWALの先読みを行う。" + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "並列問い合わせ機構を強制的に使用します。" -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "可能であれば並列処理ワーカーを使用し、問い合わせを並列処理による制限の下で実行します。" -#: utils/misc/guc.c:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "パスワードの暗号化に使用するアルゴリズムを選択する。" -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 msgid "Controls the planner's selection of custom or generic plan." msgstr "プランナでのカスタムプランと汎用プランの選択を制御。" -#: utils/misc/guc.c:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "使用する SSL/TLSプロトコルの最小バージョンを設定。" -#: utils/misc/guc.c:4951 +#: utils/misc/guc.c:5093 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "使用可能な最大の SSL/TLS プロトコルバージョンを指定します。" -#: utils/misc/guc.c:4963 +#: utils/misc/guc.c:5105 msgid "Sets the method for synchronizing the data directory before crash recovery." -msgstr "クラッシュリカバリの前に行うデータディレクトリの同期の方法を設定します。" +msgstr "クラシュリカバリ前に行うデータディレクトリの同期の方法を設定する。" -#: utils/misc/guc.c:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" -msgstr "設定パラメータ\"%s\"は不正です" +msgstr "設定パラメータ名\"%s\"は不正です" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "独自パラメータの名前は2つ以上の単純識別子をピリオドでつないだ形式でなければなりません。" -#: utils/misc/guc.c:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\"は予約されている接頭辞です。" + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "設定パラメータ\"%s\"は不明です" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %s\n" -#: utils/misc/guc.c:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27161,12 +28006,12 @@ msgstr "" "--config-fileまたは-Dオプションを指定する、あるいはPGDATA環境変数を設\n" "定する必要があります。\n" -#: utils/misc/guc.c:5880 +#: utils/misc/guc.c:6148 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: サーバー設定ファイル\"%s\"にアクセスできません: %s\n" -#: utils/misc/guc.c:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27176,7 +28021,7 @@ msgstr "" "\"%s\"内で\"data_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27186,7 +28031,7 @@ msgstr "" "\"%s\"内で\"hba_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -27196,181 +28041,186 @@ msgstr "" "\"%s\"内で\"ident_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "値が整数範囲を超えています。" -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7649 utils/misc/guc.c:9103 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "並列処理中はパラメータの設定はできません" -#: utils/misc/guc.c:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7668 utils/misc/guc.c:8927 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7701 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "現在パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11357 +#: utils/misc/guc.c:7728 utils/misc/guc.c:7790 utils/misc/guc.c:8903 utils/misc/guc.c:11811 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "パラメータ\"%s\"を設定する権限がありません" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7770 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "接続開始後にパラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:7487 +#: utils/misc/guc.c:7829 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "セキュリティー定義用関数内でパラメーター\"%s\"を設定できません" -#: utils/misc/guc.c:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9574 +#: utils/misc/guc.c:8482 utils/misc/guc.c:8529 utils/misc/guc.c:10016 #, 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:8251 +#: utils/misc/guc.c:8613 #, c-format msgid "SET %s takes only one argument" msgstr "SET %sは1つの引数のみを取ります" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8893 #, 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:8580 +#: utils/misc/guc.c:8960 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "ALTER SYSTEMでのパラメータ値は改行を含んではいけません" -#: utils/misc/guc.c:8625 +#: utils/misc/guc.c:9005 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "ファイル\"%s\"の内容をパースできませんでした" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9179 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOTはまだ実装されていません" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9266 #, c-format msgid "SET requires parameter name" msgstr "SETにはパラメータ名が必要です" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9399 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "パラメータ\"%s\"を再定義しようとしています" -#: utils/misc/guc.c:10804 +#: utils/misc/guc.c:9726 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "設定パラメータ名\"%s\"は不正です、削除します" + +#: utils/misc/guc.c:9728 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" は予約された接頭辞になりました。" + +#: utils/misc/guc.c:11251 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "パラメータ\"%s\"の\"%s\"への変更中" -#: utils/misc/guc.c:10969 +#: utils/misc/guc.c:11420 #, c-format msgid "parameter \"%s\" could not be set" msgstr "パラメータ\"%s\"を設定できません" -#: utils/misc/guc.c:11061 +#: utils/misc/guc.c:11512 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "パラメータ\"%s\"の設定をパースできません" -#: utils/misc/guc.c:11419 utils/misc/guc.c:11453 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "パラメータ\"%s\"の値が無効です: %d" - -#: utils/misc/guc.c:11487 +#: utils/misc/guc.c:11943 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "パラメータ\"%s\"の値が無効です: %g" -#: utils/misc/guc.c:11774 +#: utils/misc/guc.c:12256 #, 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:11786 +#: utils/misc/guc.c:12268 #, c-format msgid "Bonjour is not supported by this build" msgstr "このビルドでは bonjour はサポートされていません" -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12281 #, c-format msgid "SSL is not supported by this build" msgstr "このインストレーションではSSLはサポートされていません" -#: utils/misc/guc.c:11811 +#: utils/misc/guc.c:12293 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"が真の場合、パラメータを有効にできません" -#: utils/misc/guc.c:11823 +#: utils/misc/guc.c:12305 #, 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:12053 +#: utils/misc/guc.c:12535 #, 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:12066 +#: utils/misc/guc.c:12548 #, 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:12080 +#: utils/misc/guc.c:12562 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "このプラットフォームではhuge_page_sizeを0に設定する必要があります。" -#: utils/misc/guc.c:12094 +#: utils/misc/guc.c:12574 #, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "client_connection_check_intervalはPOLLRDHUPがないプラットフォームでは0に設定しなければなりません。" +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "このプラットフォームではclient_connection_check_intervalを0に設定する必要があります。" -#: utils/misc/guc.c:12222 +#: utils/misc/guc.c:12686 #, c-format msgid "invalid character" msgstr "不正な文字" -#: utils/misc/guc.c:12282 +#: utils/misc/guc.c:12746 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timelineが妥当な数値ではありません。" -#: utils/misc/guc.c:12322 +#: utils/misc/guc.c:12786 #, c-format msgid "multiple recovery targets specified" msgstr "複数のリカバリ目標が指定されています" -#: utils/misc/guc.c:12323 +#: utils/misc/guc.c:12787 #, 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:12331 +#: utils/misc/guc.c:12795 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"のみが指定可能です。" @@ -27380,12 +28230,7 @@ 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 +#: utils/misc/pg_controldata.c:63 utils/misc/pg_controldata.c:143 utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "算出されたCRCチェックサムがファイルに格納されている値と一致しません" @@ -27405,7 +28250,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:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "これ以上のタイムアウト要因を追加できません" @@ -27475,7 +28320,7 @@ msgstr "タイムゾーンファイル\"%s\"の行%dが長すぎます。" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"の行%dにファイル名がない@INCLUDEがあります" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" @@ -27483,7 +28328,7 @@ msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" #: utils/mmgr/dsa.c:520 utils/mmgr/dsa.c:1334 #, c-format msgid "could not attach to dynamic shared area" -msgstr "動的共有領域に接続できませんでした" +msgstr "動的共有エリアをアタッチできませんでした" #: 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 @@ -27493,89 +28338,89 @@ msgstr "メモリコンテクスト\"%2$s\"でサイズ%1$zuの要求が失敗 #: utils/mmgr/mcxt.c:1052 #, c-format msgid "logging memory contexts of PID %d" -msgstr "PID %d のメモリコンテクストをログ出力しています" +msgstr "PID %dのメモリコンテクストを記録します" -#: utils/mmgr/portalmem.c:187 +#: 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:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "ポータル\"%s\"を実行できません" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "固定されたポータル\"%s\"は削除できません" -#: utils/mmgr/portalmem.c:487 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "アクティブなポータル\"%s\"は削除できません" -#: utils/mmgr/portalmem.c:738 +#: 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:1279 +#: 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:431 utils/sort/sharedtuplestore.c:440 utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 utils/sort/sharedtuplestore.c:497 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "タプルストア共有一時ファイルからの読み込みに失敗しました" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "タプルストア共有一時ファイル内に予期しないチャンクがありました" -#: utils/sort/sharedtuplestore.c:570 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" -msgstr "共有タプルストア一時ファイルのブロック%uへのシークに失敗しまし" +msgstr "共有タプルストア一時ファイルのブロック%uへのシークに失敗しました" -#: utils/sort/sharedtuplestore.c:577 +#: utils/sort/sharedtuplestore.c:579 #, 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:3218 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "外部ソートでは%d以上のラン数は扱えません" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "一意インデックス\"%s\"を作成できませんでした" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "キー%sは重複しています。" -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "重複したキーが存在します。" @@ -27634,3 +28479,9 @@ msgstr "読み取りのみのシリアライザブルトランザクションで #, c-format msgid "cannot import a snapshot from a different database" msgstr "異なるデータベースからのスナップショットを読み込むことはできません" + +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "長さ%uのレコードのデコード中のメモリ不足" + +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます" diff --git a/third_party/spanner_pg/src/backend/po/ka.po b/third_party/spanner_pg/src/backend/po/ka.po new file mode 100644 index 00000000..72aa1480 --- /dev/null +++ b/third_party/spanner_pg/src/backend/po/ka.po @@ -0,0 +1,28511 @@ +# Georgian message translation file for postgres +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the postgres (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: postgres (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-08-23 22:58+0000\n" +"PO-Revision-Date: 2023-08-24 11:51+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.3.2\n" + +#: ../common/compression.c:130 ../common/compression.c:139 ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "ამ აგებაში %s-ით შეკუმშვის მხარდაჭრა არ არსებობს" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "შეკუმშვის პარამეტრების მაგიერ მოწოდებული სტრიქონი ცარიელია" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "შეკუმშვის უცნობი პარამეტრი: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "შეკუმშვის პარამეტრ \"%s\"-ს მნიშვნელობა სჭირდება" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "შემუმშვის პარამეტრ \"%s\"-ის ნიშვნელობა მთელი რიცხვი უნდა იყოს" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "შეკუმშვის ალგორითმს \"%s\" შეკუმშვის დონე არ მიეთითება" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "შეკუმშვის ალგორითმს \"%s\" შეკუმშვის დონე %d-სა და %d-ს შორის უნდა იყოს (ნაგულისხებია %d)" + +#: ../common/compression.c:353 +#, 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:69 ../common/controldata_utils.c:73 commands/copyfrom.c:1515 commands/extension.c:3401 utils/adt/genfile.c:123 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფაილის (%s) გახსნის შეცდომა: %m" + +#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1349 access/transam/xlog.c:3207 access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1197 access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 replication/logical/snapbuild.c:1927 replication/slot.c:1807 replication/slot.c:1848 replication/walsender.c:658 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:92 ../common/controldata_utils.c:95 access/transam/xlog.c:3212 access/transam/xlog.c:4027 backup/basebackup.c:1848 replication/logical/origin.c:734 replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 utils/cache/relmapper.c:817 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წაკითხვის შეცდომა: წაკითხულია %d %zu-დან" + +#: ../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:1361 access/transam/twophase.c:1773 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:4738 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:5016 replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 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:124 +msgid "byte ordering mismatch" +msgstr "ბაიტების მიმდევრობა არ ემთხვევა" + +#: ../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 PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბაიტების მიმდევრობის შესაძლო შეუსაბამობა pg_control ფაილის შესანახად გამოყენებული \n" +"ბაიტების მიმდევრობა შესაძლოა არ ემთხვეოდეს ამ პროგრამის მიერ გამოყენებულს. ამ შემთხვევაში ქვემოთ \n" +"მოცემული შედეგები არასწორი იქნება და PostgreSQL ეს აგება ამ მონაცემთა საქაღალდესთან შეუთავსებელი იქნება." + +#: ../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:1305 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:4209 access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 replication/logical/reorderbuffer.c:4162 replication/logical/reorderbuffer.c:4938 replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 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:8991 utils/misc/guc.c:9040 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფაილის (%s) გახსნის შეცდომა: %m" + +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 access/transam/twophase.c:1746 access/transam/twophase.c:1755 access/transam/xlog.c:8674 access/transam/xlogfuncs.c:600 backup/basebackup_server.c:173 backup/basebackup_server.c:266 postmaster/postmaster.c:5630 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 utils/cache/relmapper.c:934 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m" + +#: ../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:1767 access/transam/xlog.c:3047 access/transam/xlog.c:3241 access/transam/xlog.c:3985 access/transam/xlog.c:7977 access/transam/xlog.c:8020 +#: backup/basebackup_server.c:207 replication/logical/snapbuild.c:1760 replication/slot.c:1684 replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 storage/smgr/md.c:992 storage/smgr/md.c:1033 storage/sync/sync.c:453 utils/cache/relmapper.c:949 utils/misc/guc.c:8760 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფაილის (%s) fsync-ის შეცდომა: %m" + +#: ../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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 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:2591 postmaster/postmaster.c:4177 postmaster/postmaster.c:5555 postmaster/postmaster.c:5926 replication/libpqwalreceiver/libpqwalreceiver.c:300 replication/logical/logical.c:205 replication/walsender.c:701 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:1451 storage/ipc/procarray.c:2281 storage/ipc/procarray.c:2288 storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3424 utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 utils/adt/pg_locale.c:617 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:5192 utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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:238 +#, c-format +msgid "out of memory" +msgstr "არასაკმარისი მეხსიერება" + +#: ../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 +msgid "destination buffer too small" +msgstr "სამიზნე ბუფერი ძალიან პატარაა" + +#: ../common/cryptohash_openssl.c:348 ../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:168 +#, c-format +msgid "invalid binary \"%s\"" +msgstr "არასწორი ბინარული ფაილი \"%s\"" + +#: ../common/exec.c:218 +#, c-format +msgid "could not read binary \"%s\"" +msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა" + +#: ../common/exec.c:226 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია" + +#: ../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:299 access/transam/xlog.c:8323 backup/basebackup.c:1340 utils/adt/misc.c:342 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m" + +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 storage/ipc/latch.c:1789 +#, c-format +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: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" + +#: ../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:87 ../common/file_utils.c:451 ../common/file_utils.c:455 access/transam/twophase.c:1317 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3390 commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 postmaster/pgarch.c:597 replication/logical/snapbuild.c:1639 +#: 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\" არ არსებობს: %m" + +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 commands/tablespace.c:759 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 "საქაღალდის (%s) გახსნის შეცდომა: %m" + +#: ../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:383 access/transam/xlogarchive.c:419 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1779 replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 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/hmac.c:323 +msgid "internal error" +msgstr "შიდა შეცდომა" + +#: ../common/jsonapi.c:1092 +#, c-format +msgid "Escape sequence \"\\%s\" is invalid." +msgstr "სპეციალური მიმდევრობა \"\\%s\" არასწორია." + +#: ../common/jsonapi.c:1095 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "სიმბოლო კოდით 0x%02x აუცილებლად ეკრანირებული უნდა იყოს." + +#: ../common/jsonapi.c:1098 +#, c-format +msgid "Expected end of input, but found \"%s\"." +msgstr "მოველოდი შეყვანის დასასრულს, მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1101 +#, c-format +msgid "Expected array element or \"]\", but found \"%s\"." +msgstr "მოველოდი მასივის ელემენტს ან \"]\", მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1104 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%s\"." +msgstr "მოველოდი \",\" ან \"]\", მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1107 +#, c-format +msgid "Expected \":\", but found \"%s\"." +msgstr "მოველოდი \":\", მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1110 +#, c-format +msgid "Expected JSON value, but found \"%s\"." +msgstr "მოველოდი JSON მნიშვნელობას. მივიღე \"%s\"." + +#: ../common/jsonapi.c:1113 +msgid "The input string ended unexpectedly." +msgstr "შეყვანის სტრიქონი მოულოდნელად დასრულდა." + +#: ../common/jsonapi.c:1115 +#, c-format +msgid "Expected string or \"}\", but found \"%s\"." +msgstr "მოველოდი სტრიქონს ან \"}\", მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1118 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%s\"." +msgstr "მოველოდი \",\", ან \"}\", მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1121 +#, c-format +msgid "Expected string, but found \"%s\"." +msgstr "მოველოდი სტრიქონს, მაგრამ მივიღე \"%s\"." + +#: ../common/jsonapi.c:1124 +#, c-format +msgid "Token \"%s\" is invalid." +msgstr "კოდი არასწორია: %s." + +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 +#, c-format +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ტექსტად ვერ გარდაიქმნება." + +#: ../common/jsonapi.c:1129 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" ს თექვსმეტობითი ციფრები უნდა მოჰყვებოდეს." + +#: ../common/jsonapi.c:1132 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "უნიკოდის სპეციალური კოდების გამოყენება კოდის წერტილის მნიშვნელობებად 007F-ის ზემოთ შეუძლებელია, თუ კოდირება UTF-8 არაა." + +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 +#, c-format +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "უნიკოდის მაღალ სუროგატს მაღალი სუროგატი არ უნდა მოსდევდეს." + +#: ../common/jsonapi.c:1136 jsonpath_scan.l:527 jsonpath_scan.l:537 jsonpath_scan.l:579 +#, c-format +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "უნიკოდის დაბალი სუროგატი მაღალ სუროგატს უნდა მისდევდეს." + +#: ../common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდომა: " + +#: ../common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "გაფრთხილება: " + +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტალები: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "მინიშნება: " + +#: ../common/pgfnames.c:74 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m" + +#: ../common/relpath.c:61 +#, c-format +msgid "invalid fork name" +msgstr "ფორკის არასწორი სახელი" + +#: ../common/relpath.c:62 +#, c-format +msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." +msgstr "ფორკის მისაღები სახელებია \"main\", \"fsm\", \"vm\" და \"init\"." + +#: ../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" + +#: ../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 "შეცდომა SSID-ების გამოყოფისას: შეცდომის კოდი %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:193 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "ქვეპროცესიდან გასასვლელი კოდი ვერ მივიღე: შეცდომის კოდი %lu" + +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 +#, c-format +msgid "could not stat file or directory \"%s\": %m" +msgstr "ფაილის ან საქაღალდის \"%s\" პოვნა შეუძლებელია: %m" + +#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#, c-format +msgid "could not remove file or directory \"%s\": %m" +msgstr "ფაილის ან საქაღალდე „%s“ ვერ წაიშალა: %m" + +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "მარილის კოდირების შეცდომა" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "დამახსოვრებული გასაღების კოდირების შეცდომა" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "სერვერის გასაღების კოდირების შეცდომა" + +#: ../common/stringinfo.c:306 +#, c-format +msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." +msgstr "სტრიქონების ბაფერის, რომელიც უკვე შეიცავს %d ბაიტს, %d ბაიტით ვერ გავადიდებ." + +#: ../common/stringinfo.c:310 +#, c-format +msgid "" +"out of memory\n" +"\n" +"Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" +msgstr "" +"არასაკმარისი მეხსიერების\n" +"\n" +"შეუძლებელია სტრიქონის ბუფერის (%d ბაიტიგ) აფართოება %d ბაიტით.\n" + +#: ../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მომხმარებლის ეფექტური ID-ის (%ld) ამოხსნა შეუძლებელია: %s" + +#: ../common/username.c:45 libpq/auth.c:1900 +msgid "user does not exist" +msgstr "მომხმარებელი არ არსებობს" + +#: ../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu" + +#: ../common/wait_error.c:45 +#, c-format +msgid "command not executable" +msgstr "ბრძანება გაშვებადი არაა" + +#: ../common/wait_error.c:49 +#, c-format +msgid "command not found" +msgstr "ბრძანება ვერ ვიპოვე" + +#: ../common/wait_error.c:54 +#, c-format +msgid "child process exited with exit code %d" +msgstr "შვილეული პროცესი დასრულდა სტატუსით %d" + +#: ../common/wait_error.c:62 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X" + +#: ../common/wait_error.c:66 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "პროცესი გაჩერდა სიგნალით: %d: %s" + +#: ../common/wait_error.c:72 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d" + +#: ../port/chklocale.c:306 +#, c-format +msgid "could not determine encoding for codeset \"%s\"" +msgstr "კოდირების დადგენა ვერ მოხერხდა \"%s\"-ისთვის" + +#: ../port/chklocale.c:427 ../port/chklocale.c:433 +#, c-format +msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" +msgstr "ენისთვის \"%s\" კოდირების დადგენა ვერ მოხერხდა: კოდების ნაკრები არის \"%s\"" + +#: ../port/dirmod.c:218 +#, c-format +msgid "could not set junction for \"%s\": %s" +msgstr "\"%s\"-ისთვის შეერთების დაყენება ვერ მოხერხდა: %s" + +#: ../port/dirmod.c:221 +#, c-format +msgid "could not set junction for \"%s\": %s\n" +msgstr "\"%s\"-ისთვის შეერთების დაყენება ვერ მოხერხდა: %s\n" + +#: ../port/dirmod.c:295 +#, c-format +msgid "could not get junction for \"%s\": %s" +msgstr "\"%s\"-ისთვის შეერთების მიღება ვერ მოხერხდა: %s" + +#: ../port/dirmod.c:298 +#, c-format +msgid "could not get junction for \"%s\": %s\n" +msgstr "\"%s\"-ისთვის შეერთების მიღება ვერ მოხერხდა: %s\n" + +#: ../port/open.c:117 +#, c-format +msgid "could not open file \"%s\": %s" +msgstr "ფაილის გახსნის შეცდომა \"%s\": %s" + +#: ../port/open.c:118 +msgid "lock violation" +msgstr "ბლოკის დარღვევა" + +#: ../port/open.c:118 +msgid "sharing violation" +msgstr "გაზიარების დარღვევა" + +#: ../port/open.c:119 +#, c-format +msgid "Continuing to retry for 30 seconds." +msgstr "ვაგრძელებ თავიდან ცდას 30 წამით." + +#: ../port/open.c:120 +#, c-format +msgid "You might have antivirus, backup, or similar software interfering with the database system." +msgstr "შეიძლება თქვენი ანტივირუსი, მარქაფი ან რამე სხვა პროგრამა ხელს უშლის მონაცემთა ბაზის სისტემის მუშაობას." + +#: ../port/path.c:775 +#, c-format +msgid "could not get current working directory: %s\n" +msgstr "მიმდინარე სამუშაო საქაღალდის მიღების შეცდომა: %s\n" + +#: ../port/strerror.c:72 +#, c-format +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" +msgstr "ვერ მივიღე SID ადმინისტრატორთა ჯგუფისთვის: შეცდომის კოდი %lu\n" + +#: ../port/win32security.c:72 +#, c-format +msgid "could not get SID for PowerUsers group: error code %lu\n" +msgstr "ვერ მივიღე SID PowerUsers ჯგუფისთვის: შეცდომის კოდი %lu\n" + +#: ../port/win32security.c:80 +#, c-format +msgid "could not check access token membership: error code %lu\n" +msgstr "კოდის წევრობის წვდომის შემოწმების შეცდომა: შეცდომის კოდი %lu\n" + +#: 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:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1043 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:1037 access/brin/brin.c:1138 +#, c-format +msgid "BRIN control functions cannot be executed during recovery." +msgstr "აღდგენის დროს BRIN კონტროლის ფუნქციების შესრულება შეუძლებელია." + +#: access/brin/brin.c:1042 access/brin/brin.c:1143 +#, c-format +msgid "block number out of range: %lld" +msgstr "ბლოკების რაოდენობა დიაპაზონს გარეთაა: %lld" + +#: access/brin/brin.c:1086 access/brin/brin.c:1169 +#, c-format +msgid "\"%s\" is not a BRIN index" +msgstr "\"%s\" BRIN ინდექსი არაა" + +#: access/brin/brin.c:1102 access/brin/brin.c:1185 +#, 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:3012 access/brin/brin_minmax_multi.c:3155 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:2171 access/brin/brin_minmax_multi.c:2178 access/brin/brin_minmax_multi.c:2185 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 "ინტერვალი საზღვრებს გარეთაა" + +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 +#, c-format +msgid "index row size %zu exceeds maximum %zu for index \"%s\"" +msgstr "ინდექსის მწკრივის ზომა %zu მაქსიმუმზე (%zu) მეტია ინდექსისთვის \"%s\"" + +#: 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: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: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: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: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: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: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: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" + +#: access/brin/brin_validate.c:246 +#, c-format +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: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:274 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d" +msgstr "ოპერატორის კლასს \"%s\" წვდომის მეთოდიდან %s აკლია მხარდაჭერის ფუნქცია %d" + +#: access/common/attmap.c:122 +#, c-format +msgid "Returned type %s does not match expected type %s in column %d." +msgstr "დაბრუნებული ტიპი %s არ ემთხვევა მოსალოდნელ ტიპს %s სვეტისთვის %d." + +#: access/common/attmap.c:150 +#, c-format +msgid "Number of returned columns (%d) does not match expected column count (%d)." +msgstr "სვეტების დაბრუნებული რაოდენობა (%d) არ ემთხვევა მოსალოდნელს (%d) არ ემთხვევა." + +#: access/common/attmap.c:229 access/common/attmap.c:241 +#, c-format +msgid "could not convert row type" +msgstr "მწკრივის ტიპის გადაყვანის შეცდომა" + +#: access/common/attmap.c:230 +#, c-format +msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." +msgstr "ატრიბუტი %s ტიპისთვის %s ტიპის(%s) შესაბამის ატრიბუტს არ ემთხვევა." + +#: access/common/attmap.c:242 +#, c-format +msgid "Attribute \"%s\" of type %s does not exist in type %s." +msgstr "ატრიბუტი \"%s\" ტიპისთვის \"%s\" არ არსებობს ტიპში \"%s\"." + +#: access/common/heaptuple.c:1124 access/common/heaptuple.c:1459 +#, c-format +msgid "number of columns (%d) exceeds limit (%d)" +msgstr "სვეტების რაოდენობა (%d) აღემატება ლიმიტს (%d)" + +#: access/common/indextuple.c:89 +#, c-format +msgid "number of index columns (%d) exceeds limit (%d)" +msgstr "ინდექსის სვეტების რაოდენობა (%d) აღემატება ლიმიტს (%d)" + +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 +#, c-format +msgid "index row requires %zu bytes, maximum size is %zu" +msgstr "ინდექსის მწკრივი მოითხოვს %zu ბაიტს, მაქსიმალური ზომა %zu" + +#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1921 +#, c-format +msgid "unsupported format code: %d" +msgstr "ფორმატის მხარდაუჭერელი კოდი: %d" + +#: 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:543 +msgid "Valid values are \"local\" and \"cascaded\"." +msgstr "სწორი მნიშვნელობებია \"local\" და \"cascaded\"." + +#: access/common/reloptions.c:691 +#, c-format +msgid "user-defined relation parameter types limit exceeded" +msgstr "მომხმარებლის მიერ განსაზღვრული ურთიერთობის პარამეტრის ტიპებმა ლიმიტს გადააჭარბა" + +#: access/common/reloptions.c:1234 +#, c-format +msgid "RESET must not include values for parameters" +msgstr "RESET პარამეტრების მნიშვნელობებს არ უნდა შეიცავდეს" + +#: access/common/reloptions.c:1266 +#, c-format +msgid "unrecognized parameter namespace \"%s\"" +msgstr "პარამეტრების სახელების უცნობი სივრცე: \"%s\"" + +#: access/common/reloptions.c:1303 utils/misc/guc.c:12987 +#, c-format +msgid "tables declared WITH OIDS are not supported" +msgstr "ცხრილები, აღწერილი WITH OIDS-ით, მხარდაუჭერელია" + +#: access/common/reloptions.c:1473 +#, c-format +msgid "unrecognized parameter \"%s\"" +msgstr "უცნობი პარამეტრი\"%s\"" + +#: access/common/reloptions.c:1585 +#, c-format +msgid "parameter \"%s\" specified more than once" +msgstr "პარამეტრი \"%s\" ერთზე მეტჯერაა მითთებული" + +#: access/common/reloptions.c:1601 +#, c-format +msgid "invalid value for boolean option \"%s\": %s" +msgstr "არასწორი მნიშვნელობა ლოგიკური პარამეტრისთვის \"%s\": %s" + +#: access/common/reloptions.c:1613 +#, c-format +msgid "invalid value for integer option \"%s\": %s" +msgstr "არასწორი მნიშვნელობა მთელი რიცხვის პარამეტრისთვის \"%s\": %s" + +#: 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:1621 +#, c-format +msgid "Valid values are between \"%d\" and \"%d\"." +msgstr "სწორი მნიშვნელობები \"%d\"-სა და \"%d\"-ს შორისაა." + +#: access/common/reloptions.c:1633 +#, c-format +msgid "invalid value for floating point option \"%s\": %s" +msgstr "წილადი პარამეტრის (\"%s\") არასწორი მნიშვნელობა: %s" + +#: access/common/reloptions.c:1641 +#, c-format +msgid "Valid values are between \"%f\" and \"%f\"." +msgstr "სწორი მნიშვნელობების დიაპაზონია \"%f\"-სა და \"%f\"-ს შორის." + +#: access/common/reloptions.c:1663 +#, c-format +msgid "invalid value for enum option \"%s\": %s" +msgstr "ჩამონათვალი პარამეტრის \"%s\" არასწორი მნიშვნელობა: %s" + +#: 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/tupdesc.c:825 parser/parse_clause.c:773 parser/parse_relation.c:1857 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "სვეტი \"%s\" არ შეიძლება გამოცხადდეს SETOF" + +#: access/gin/ginbulk.c:44 +#, c-format +msgid "posting list is too long" +msgstr "პოსტინგის სია ძალიან გრძელია" + +#: access/gin/ginbulk.c:45 +#, c-format +msgid "Reduce maintenance_work_mem." +msgstr "Maintenance_work_mem-ის შემცირება." + +#: access/gin/ginfast.c:1044 +#, c-format +msgid "GIN pending list cannot be cleaned up during recovery." +msgstr "GIN მოლოდინი სია აღდგენის დროს ვერ გაიწმინდება." + +#: access/gin/ginfast.c:1051 +#, c-format +msgid "\"%s\" is not a GIN index" +msgstr "\"%s\" GIN ინდექსი არაა" + +#: access/gin/ginfast.c:1062 +#, c-format +msgid "cannot access temporary indexes of other sessions" +msgstr "სხვა სესიების დროებით ინდექსებზე წვდომა შეუძლებელია" + +#: access/gin/ginget.c:273 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" +msgstr "ძველ GIN ინდექსებს არც ინდექსების სრული სკანირების მხარდაჭერა აქვს, არც ნულების ძებნის" + +#: access/gin/ginscan.c:432 +#, c-format +msgid "To fix this, do REINDEX INDEX \"%s\"." +msgstr "გასასწორებლად გაუშვით REINDEX INDEX \"%s\"." + +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6486 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: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, რომელსაც სხვადასხვა მარცხენა და მარჯვენა შეყვანები გააჩნია" + +#: access/gin/ginvalidate.c:260 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d or %d" +msgstr "ოპერატორის ოჯახი \"%s\" (წვდომის მეთოდიდან %s) აკლია მხარდაჭერის ფუნქია %d ან %d" + +#: 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:759 access/gist/gistvacuum.c:426 +#, c-format +msgid "index \"%s\" contains an inner tuple marked as invalid" +msgstr "ინდექსი (\"%s\") შეიცავს შიდა კორტეჟს, რომელიც მონიშნულია, როგორც არასწორი" + +#: access/gist/gist.c:761 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:762 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:1176 +#, 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" +msgstr "picksplit მეთოდის შეცდომა სვეტისთვის %d ინდექსიდან \"%s\"" + +#: access/gist/gistsplit.c:448 +#, c-format +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: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: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:203 +#, c-format +msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" +msgstr "ოპერატორის ოჯახი \"%s\" (წვდომის მეთოდიდან %s) ოპერატორისთვის %s მხარდაუჭერელ ORDER BY-ის სპეფიციკაციას შეიცავს" + +#: 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) ოპერატორისთვის %s არასწორ ORDER BY-ის სპეფიციკაციას შეიცავს" + +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 +#, c-format +msgid "could not determine which collation to use for string hashing" +msgstr "სტრიქონების ჰეშირებისთვის საჭირო კოლაციის გარკვევა შეუძლებელია" + +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:1979 commands/tablecmds.c:17495 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 utils/adt/like_support.c:1025 utils/adt/varchar.c:733 utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 +#: utils/adt/varlena.c:1499 +#, c-format +msgid "Use the COLLATE clause to set the collation explicitly." +msgstr "კოლაციის ხელით მისათითებლად გამოიყენეთ COLLATE." + +#: access/hash/hashinsert.c:83 +#, c-format +msgid "index row size %zu exceeds hash maximum %zu" +msgstr "ინდექსის მწკრივის ზომა %zu აჭარბებს ჰეშის მაქსიმუმს %zu" + +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 +#, c-format +msgid "Values larger than a buffer page cannot be indexed." +msgstr "ბაფერის გვერდზე დიდი მნიშვნელობების დაინდექსება შეუძლებელია." + +#: access/hash/hashovfl.c:88 +#, c-format +msgid "invalid overflow block number %u" +msgstr "გადავსებული ბლოკის არასწორი ნომერი: \"%u\"" + +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 +#, c-format +msgid "out of overflow pages in hash index \"%s\"" +msgstr "ჰეშ-ინდექსში \"%s\" გადავსების გვერდები საკმარისი არაა" + +#: access/hash/hashsearch.c:315 +#, c-format +msgid "hash indexes do not support whole-index scans" +msgstr "ჰეშის ინდექსებს სრული ინდექსების სკანირების მხარდაჭერა არ გააჩნიათ" + +#: access/hash/hashutil.c:263 +#, c-format +msgid "index \"%s\" is not a hash index" +msgstr "ინდექსი \"%s\" ჰეშ ინდექსი არაა" + +#: access/hash/hashutil.c:269 +#, c-format +msgid "index \"%s\" has wrong hash version" +msgstr "ინდექსს \"%s\" ჰეშის არასწორი ვერსია აქვს" + +#: 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: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:2226 +#, c-format +msgid "cannot insert tuples in a parallel worker" +msgstr "პარალელურ დამხმარე პროცესში კორტეჟებს ვერ ჩასვამთ" + +#: access/heap/heapam.c:2697 +#, c-format +msgid "cannot delete tuples during a parallel operation" +msgstr "პარალელური ოპერაციის დროს კორტეჟის წაშლა შეუძლებელია" + +#: access/heap/heapam.c:2743 +#, c-format +msgid "attempted to delete invisible tuple" +msgstr "უხილავი კორტეჟის წაშლის მცდელობა" + +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 +#, c-format +msgid "cannot update tuples during a parallel operation" +msgstr "პარალელური ოპერაციის დროს კორტეჟის განახლება შეუძლებელია" + +#: access/heap/heapam.c:3307 +#, c-format +msgid "attempted to update invisible tuple" +msgstr "უხილავი კორტეჟის განახლების მცდელობა" + +#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 access/heap/heapam.c:4972 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:401 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update" +msgstr "დასაბლოკი კორტეჟი პარალელური განახლების გამო უკვე სხვა დანაყოფშია გადატანილი" + +#: 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:920 +#, c-format +msgid "could not write to file \"%s\", wrote %d of %d: %m" +msgstr "ფაილში \"%s\" ჩაწერა შეუძლებელია. ჩაწერილია %d %d-დან: %m" + +#: 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:8657 access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:517 postmaster/postmaster.c:4604 postmaster/postmaster.c:5617 replication/logical/origin.c:587 replication/slot.c:1631 +#: 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:1141 +#, c-format +msgid "could not truncate file \"%s\" to %u: %m" +msgstr "ფაილის (%s) %u-მდე მოკვეთის შეცდომა: %m" + +#: 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:529 postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 replication/logical/origin.c:599 replication/logical/origin.c:641 replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 replication/slot.c:1666 +#: 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:8721 utils/misc/guc.c:8752 utils/misc/guc.c:10742 utils/misc/guc.c:10756 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:1249 access/transam/twophase.c:1706 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:4431 replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "აგრესიული დამტვერსასრუტება \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "დამტვერსასრუტება \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "მომტვერსასრუტება დასრულებულია \"%s.%s.%s\": დასკანერებული ინდექსები: %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\": ინდექსის სკანირების რიცხვი: %d\n" + +#: 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\": ინდექსის სკანირების რიცხვი: %d\n" + +#: access/heap/vacuumlazy.c:681 +#, 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:683 +#, c-format +msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "ცხრილის (\"%s.%s.%s\") ავტომატური მომტვერსასრუტება: ინდექსების სკანირება: %d\n" + +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "გვერდები: %u წაშლილი, %u რჩება, %u დასკანერებული (სულ %.2f%%)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "კორტეჟები: %lld წაიშალა, %lld დარჩა, %lld მკვდარია, მაგრამ ჯერ ვერ წავშლი\n" + +#: access/heap/vacuumlazy.c:703 +#, c-format +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "გასუფთავების ბლოკირების კონფლიქტის გამო გამოტოვებული სტრიქონების ვერსიები: %lld, %u გვერდიდან\n" + +#: access/heap/vacuumlazy.c:708 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "წაშლადი ამოჭრილი: %u, რომელიც იყო %d XID ასაკის, როცა ოპერაცია დასრულდა\n" + +#: access/heap/vacuumlazy.c:714 +#, c-format +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "ახალი relfrozenxid: %u, რომელიც წინა მნიშვნელობაზე %d XID-ით წინაა\n" + +#: access/heap/vacuumlazy.c:721 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "ახალი relminmxid: %u, რომელიც წინა მნიშვნელობაზე %d MXID-ით წინაა\n" + +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "ინდექსების სკანირება საჭირო არაა: " + +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "ინდექსების სკანირება საჭიროა: " + +#: access/heap/vacuumlazy.c:731 +#, 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:736 +msgid "index scan bypassed: " +msgstr "სკანირებისას გამოტოვებული ინდექსები: " + +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "სკანირებისას უსაფრთხოების გამო გამოტოვებული ინდექსები: " + +#: access/heap/vacuumlazy.c:740 +#, 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:755 +#, 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:767 commands/analyze.c:796 +#, c-format +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O დროები: კითხვა: %.3f მწმ, ჩაწერა: %.3f მწმ\n" + +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#, c-format +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "კითხვის საშ. სიჩქარე: %.3f მბ/წმ, ჩაწერის საშ. სიჩქარე: %.3f მბ/წმ\n" + +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#, c-format +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "ბაფერის გამოყენება: %lld მოხვედრა, %lld აცდენა, %lld ტურტლიანი\n" + +#: access/heap/vacuumlazy.c:785 +#, c-format +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL გამოყენება: %lld ჩანაწერი, %lld სრული გვერდის ასლი, %llu ბაიტი\n" + +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#, c-format +msgid "system usage: %s" +msgstr "სისტემური გამოყენება: %s" + +#: access/heap/vacuumlazy.c:2463 +#, c-format +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "ცხრილი \"%s\": წაიშალა %lld მკვდარი ჩანაწერის იდენტიფიკატორი %u გვერდზე" + +#: access/heap/vacuumlazy.c:2629 +#, 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:2634 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "ცხრილის relfrozenxid -ის და relminmxid -ის მნიშვნელობები ძალიან უკანაა წარშულში." + +#: 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 "" +"მხედველობაში იქონიეთ, რომ საჭიროა კონფიგურაციის პარამეტრის \"maintenance_work_mem\" ან \"autovacuum_work_mem\" გაზრდა.\n" +"ასევე შეიძლება დაგჭირდეთ განიხილოთ მომტვერსასრუტების სხვა გზები, რომ დაეწიოთ ტრანზაქცების ID-ების გამოყოფას." + +#: access/heap/vacuumlazy.c:2878 +#, c-format +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "%s: წაკვეთის შეჩერება ბლოკირების კონფლიქტური მოთხოვნის გამო" + +#: 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 "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "ცხრილი %s: წაკვეთის შეჩერება ბლოკირების კონფლიქტური მოთხოვნის გამო" + +#: access/heap/vacuumlazy.c:3170 +#, c-format +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "%s-ზე პარალელური მომტვერსასრუტების გამორთვა --- დროებითი ცხრილების პარალელური მომტვერსასრუტება შეუძლებელია" + +#: access/heap/vacuumlazy.c:3383 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "ურთიერთობის(%3$s.%4$s) წანაცვლების(%2$u) ბლოკის(%1$u) სკანირებისას" + +#: access/heap/vacuumlazy.c:3386 +#, c-format +msgid "while scanning block %u of relation \"%s.%s\"" +msgstr "%u ბლოკის (ურთიერთობის %s.%s) სკანირებისას" + +#: 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 "ბლოკის %u, წანაცვლება %u (ურთიერთობის \"%s.%s\") მომტვერსასრუტებისას" + +#: access/heap/vacuumlazy.c:3401 +#, c-format +msgid "while vacuuming block %u of relation \"%s.%s\"" +msgstr "ბლოკის (%u) მომტვერსასრუტებისას (ურთიერთობიდან \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3405 +#, c-format +msgid "while vacuuming relation \"%s.%s\"" +msgstr "ურთერთობის დამტვერსასრუტებისას \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 +#, c-format +msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" +msgstr "ინდექსის (%s) მომტვერსასრუტებისას (ურთიერთობიდან \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 +#, c-format +msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" +msgstr "ინდექსის \"%s\" მოსუფთავებისას, რომელიც ეკუთვნის ურთიერთობას \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3421 +#, c-format +msgid "while truncating relation \"%s.%s\" to %u blocks" +msgstr "ურთიერთობის \"%s.%s\" %u ბლოკამდე მოკვეთისას" + +#: access/index/amapi.c:83 commands/amcmds.c:143 +#, c-format +msgid "access method \"%s\" is not of type %s" +msgstr "წვდომის მეთოდი \"%s\" არ არის ტიპის %s" + +#: access/index/amapi.c:99 +#, c-format +msgid "index access method \"%s\" does not have a handler" +msgstr "ინდექსის წვდომის მეთოდს \"%s\" დამმუშავებელი არ აქვს" + +#: access/index/genam.c:489 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "ტრანზაქცია გაუქმდა სისტემური კატალოგის სკანირებისას" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 commands/indexcmds.c:2807 commands/tablecmds.c:271 commands/tablecmds.c:295 commands/tablecmds.c:17183 commands/tablecmds.c:18966 +#, c-format +msgid "\"%s\" is not an index" +msgstr "\"%s\" ინდექსი არაა" + +#: access/index/indexam.c:973 +#, c-format +msgid "operator class %s has no options" +msgstr "ოპერატორის კლასს %s პარამეტრები არ გააჩნია" + +#: access/nbtree/nbtinsert.c:666 +#, c-format +msgid "duplicate key value violates unique constraint \"%s\"" +msgstr "დუბლირებული გასაღების მნიშვნელობა არღვევს უნიკალურ შეზღუდვას \"%s\"" + +#: access/nbtree/nbtinsert.c:668 +#, c-format +msgid "Key %s already exists." +msgstr "გასაღები უკვე არსებობს: %s." + +#: access/nbtree/nbtinsert.c:762 +#, c-format +msgid "This may be because of a non-immutable index expression." +msgstr "შეიძლებa ინდექსის გამოსახულების შეცვლადობის ბრალი იყოს." + +#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 parser/parse_utilcmd.c:2333 +#, c-format +msgid "index \"%s\" is not a btree" +msgstr "ინდექსი \"%s\" ორობითი ხე არაა" + +#: 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:1874 +#, c-format +msgid "index \"%s\" contains a half-dead internal page" +msgstr "ინდექსი (\"%s\") ნახევრად მკვდარ შიდა გვერდს შეიცავს" + +#: 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 ან უფრო ძველ ვერსიაში. განახლებამდე საჭიროა REINDEX-ის გადატარება." + +#: access/nbtree/nbtutils.c:2669 +#, c-format +msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" +msgstr "ინდექსის სტრიქონის ზომა %zu btree-ის ვერსიის (%u) მაქსიმალურ (%zu) მნიშვნელობაზე მეტია, ინდექსისთვის \"%s\"" + +#: access/nbtree/nbtutils.c:2675 +#, c-format +msgid "Index row references tuple (%u,%u) in relation \"%s\"." +msgstr "ინდექსის მწკრივები გადაბმულია კორტეჟზე (%u, %u) ურთიერთობაში \"%s\"." + +#: access/nbtree/nbtutils.c:2679 +#, 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: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:244 +#, c-format +msgid "compress method must be defined when leaf type is different from input type" +msgstr "როდესაც ფოთლის ტიპი შეყვანის ტიპისგან განსხვავდება, შეკუმშვის მეთოდის მითითება აუცილებელია" + +#: access/spgist/spgutils.c:1016 +#, c-format +msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" +msgstr "SP-GiST-ის შიდა კორტეჟის ზომა%zu მაქსიმუმს %zu აჭარბებს" + +#: 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: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:88 access/table/table.c:117 access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13880 commands/tablecmds.c:17192 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" კომპოზიტური ტიპია" + +#: access/table/tableam.c:266 +#, c-format +msgid "tid (%u, %u) is not valid for relation \"%s\"" +msgstr "კორტეჟის იდენტიფიკატორი (%u, %u) არასწორია ურთიერთობისთვის: \"%s\"" + +#: access/table/tableamapi.c:115 +#, c-format +msgid "%s cannot be empty." +msgstr "%s ცარიელი არ შეიძლება იყოს." + +#: access/table/tableamapi.c:122 utils/misc/guc.c:12911 +#, c-format +msgid "%s is too long (maximum %d characters)." +msgstr "%s ძალიან გრძელია (მაქს %d სიმბოლო)" + +#: access/table/tableamapi.c:145 +#, c-format +msgid "table access method \"%s\" does not exist" +msgstr "ცხრილის წვდომის მეთოდი \"%s\" არ არსებობს" + +#: access/table/tableamapi.c:150 +#, c-format +msgid "Table access method \"%s\" does not exist." +msgstr "ცხრილის წვდომის მეთოდი \"%s\" არ არსებობს." + +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#, c-format +msgid "sample percentage must be between 0 and 100" +msgstr "უბრალო პროცენტის დიაპაზონია 0-100" + +#: access/transam/commit_ts.c:282 +#, c-format +msgid "cannot retrieve commit timestamp for transaction %u" +msgstr "ტრანზაქციის (%u) გადაცემის დროის შტამპის მიღების შეცდომა" + +#: access/transam/commit_ts.c:380 +#, c-format +msgid "could not get commit timestamp data" +msgstr "მონაცემების გადაცემის დროის მიღების შეცდომა" + +#: access/transam/commit_ts.c:382 +#, c-format +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "დარწმუნდით, რომ ძირითად სერვერზე კონფიგურაციის პარამეტრი \"%s\" დაყენებულია." + +#: access/transam/commit_ts.c:384 +#, c-format +msgid "Make sure the configuration parameter \"%s\" is set." +msgstr "დარწმუნდით, რომ კონფიგურაციის პარამეტრი \"%s\" დაყენებულია." + +#: access/transam/multixact.c:1022 +#, c-format +msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "ბაზაში (\"%s\") მონაცემების გადატანის თავიდან ასაცილებლად მონაცემთა ბაზა ბრძანებებს, რომლებიც ახალ მულტიტრანზაქციებს აგენერირებენ, არ იღებს." + +#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 access/transam/multixact.c:1055 access/transam/multixact.c:1064 +#, 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 "" +"გაუშვით მთელი ბაზის მომტვერსასრუტება.\n" +"ასევე შეიძლება დაგჭირდეთ ძველი მომზადებული ტრანზაქციების გადაცემა ან გაუქმება, ან წაშალეთ გაჭედილი რეპლიკაციის სლოტები." + +#: access/transam/multixact.c:1029 +#, 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\") მონაცემების გადატანის თავიდან ასაცილებლად მონაცემთა ბაზა ბრძანებებს, რომლებიც ახალ მულტიტრანზაქციებს აგენერირებენ, არ იღებს" + +#: access/transam/multixact.c:1050 access/transam/multixact.c:2334 +#, 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] "კიდევ %2$u მულტიტრანზაქციის გამოსაყენებლად ბაზის (%1$s) მომტვერსასრუტებაა საჭირო" +msgstr[1] "კიდევ %2$u მულტიტრანზაქციის გამოსაყენებლად ბაზის (%1$s) მომტვერსასრუტებაა საჭირო" + +#: access/transam/multixact.c:1059 access/transam/multixact.c:2343 +#, 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] "კიდევ %2$u მულტიტრანზაქციის გამოსაყენებლად OID-ი %1$u -ის მქონე ბაზა ჯერ უნდა დამტვერსასრუტდეს" +msgstr[1] "კიდევ %2$u მულტიტრანზაქციის გამოსაყენებლად OID-ი %1$u -ის მქონე ბაზა ჯერ უნდა დამტვერსასრუტდეს" + +#: access/transam/multixact.c:1120 +#, c-format +msgid "multixact \"members\" limit exceeded" +msgstr "მულტიტრანზაქციული \"წევრების\" ლიმიტი გადაჭარბებულია" + +#: access/transam/multixact.c:1121 +#, 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:1126 +#, 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 "მთელ ბაზაზე მომტვერსასრუტების შესრულება ბაზაში OID-ით %u შემცირებული vacuum_multixact_freeze_min_age და vacuum_multixact_freeze_table_age პარამეტრებით." + +#: access/transam/multixact.c:1157 +#, 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 მულტიტრანზაქციული წევრი იქნება გამოყენებული" +msgstr[1] "ბაზა OID-ით %u უნდა მომტვერსასრუტდეს მანამდე, სანამ კიდევ %d მულტიტრანზაქციული წევრი იქნება გამოყენებული" + +#: access/transam/multixact.c:1162 +#, 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 პარამეტრებით." + +#: access/transam/multixact.c:1301 +#, c-format +msgid "MultiXactId %u does no longer exist -- apparent wraparound" +msgstr "MultiXactId %u აღარ არსებობს - აშკარა გადატანა" + +#: access/transam/multixact.c:1307 +#, c-format +msgid "MultiXactId %u has not been created yet -- apparent wraparound" +msgstr "MultiXactId %u ჯერ არ არის შექმნილი - აშკარა გადატანა" + +#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 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 "" +"მონაცემთა ბაზის გამორთვის თავიდან ასაცილებლად, შეასრულეთ მონაცემთა ბაზის მასშტაბით ვაკუუმი ამ მონაცემთა ბაზაში.\n" +"თქვენ ასევე შეიძლება დაგჭირდეთ ძველი მომზადებული ტრანზაქციების ჩადენა ან დაბრუნება, ან შემორჩენილი რეპლიკაციის სლოტების წაშლა." + +#: access/transam/multixact.c:2622 +#, 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:2644 +#, c-format +msgid "MultiXact member wraparound protections are now enabled" +msgstr "მულტიტრანზაქციების ჩაციკვლისგან დაცვის მექანიზმები ახლა ჩართულია" + +#: access/transam/multixact.c:3031 +#, c-format +msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" +msgstr "უძველესი მულტიტრანზაქცია %u ვერ ვიპოვე. უახლესი მულტიტრანზაქციაა %u. წაკვეთა გამოტოვებული იქნება" + +#: access/transam/multixact.c:3049 +#, c-format +msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" +msgstr "მულტიტრანზაქციამდე %u მოკვეთა შეუძლებელია, რადგან ის დისკზე არ არსებობს. მოკვეთა გამოტოვებული იქნება" + +#: access/transam/multixact.c:3363 +#, c-format +msgid "invalid MultiXactId: %u" +msgstr "არასწორი MultiXactId: %u" + +#: access/transam/parallel.c:718 access/transam/parallel.c:837 +#, c-format +msgid "parallel worker failed to initialize" +msgstr "პარალელური დამხმარე პროცესის ინიციალიზაციის შეცდომა" + +#: 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:899 +#, c-format +msgid "postmaster exited during a parallel transaction" +msgstr "postmaster-ი დასრულდა პარალელური ტრანზაქციისას" + +#: access/transam/parallel.c:1086 +#, c-format +msgid "lost connection to parallel worker" +msgstr "პარალელური დამხმარე პროცესთან კავშირი დაკარგულია" + +#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 +msgid "parallel worker" +msgstr "პარალელური დამხმარე პროცესი" + +#: access/transam/parallel.c:1307 +#, c-format +msgid "could not map dynamic shared memory segment" +msgstr "დინამიური გაზიარებული მეხსიერების სეგმენტის მიბმის შეცდომა" + +#: access/transam/parallel.c:1312 +#, c-format +msgid "invalid magic number in dynamic shared memory segment" +msgstr "დინამიური გაზიარებული მეხსიერების სეგმენტის არასწორი მაგიური რიცხვი" + +#: 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 "შეიყვანეთ რესურსების ხელით მითითებული მმართველის %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:714 +#, c-format +msgid "file \"%s\" doesn't exist, reading as zeroes" +msgstr "ფაილი \"%s\" არ არსებობს. წაკითხული იქნება, როგორც ნულებ" + +#: access/transam/slru.c:946 access/transam/slru.c:952 access/transam/slru.c:960 access/transam/slru.c:965 access/transam/slru.c:972 access/transam/slru.c:977 access/transam/slru.c:984 access/transam/slru.c:991 +#, c-format +msgid "could not access status of transaction %u" +msgstr "ტრანზაქციის %u სტატუსის წვდომის შეცდომა" + +#: access/transam/slru.c:947 +#, c-format +msgid "Could not open file \"%s\": %m." +msgstr "ფაილის (%s) გახსნის შეცდომა: %m." + +#: access/transam/slru.c:953 +#, c-format +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "ფაილში \"%s\" წანაცვლებაზე %d გადახვევის შეცდომა: %m." + +#: access/transam/slru.c:961 +#, c-format +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "კითხვის შეცდომა ფაილიდან \"%s\" წანაცვლებასთან %d: %m." + +#: access/transam/slru.c:966 +#, c-format +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "კითხვის შეცდომა ფაილიდან \"%s\" წანაცვლებასთან %d: ყველა ბაიტის წაკითხვა შეუძლებელია." + +#: access/transam/slru.c:973 +#, c-format +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "ფაილში (\"%s\") ჩაწერის შეცდომა წანაცვლებასთან %d: %m." + +#: access/transam/slru.c:978 +#, c-format +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "ფაილში (\"%s\") ჩაწერის შეცდომა წანაცვლებასთან %d: ყველა ბაიტის ჩაწერა შეუძლებელია." + +#: access/transam/slru.c:985 +#, c-format +msgid "Could not fsync file \"%s\": %m." +msgstr "ფაილის (%s) fsync-ის შეცდომა: %m." + +#: access/transam/slru.c:992 +#, c-format +msgid "Could not close file \"%s\": %m." +msgstr "ფაილის (%s) დახურვის შეცდომა: %m." + +#: access/transam/slru.c:1253 +#, c-format +msgid "could not truncate directory \"%s\": apparent wraparound" +msgstr "საქაღალდის გასუფთავების შეცდომა: \"%s\" აშკარა ჩაციკვლა" + +#: access/transam/timeline.c:163 access/transam/timeline.c:168 +#, c-format +msgid "syntax error in history file: %s" +msgstr "სინტაქსის შეცდომა ისტორიის ფაილში: %s" + +#: access/transam/timeline.c:164 +#, c-format +msgid "Expected a numeric timeline ID." +msgstr "მოველოდი დროის ხაზის რიცხვობრივ ID-ს." + +#: access/transam/timeline.c:169 +#, c-format +msgid "Expected a write-ahead log switchpoint location." +msgstr "მოველოდი წინასწარ-ჩაწერადი ჟურნალის გადართვის წერტილის მდებარეობას." + +#: access/transam/timeline.c:173 +#, c-format +msgid "invalid data in history file: %s" +msgstr "არასწორი მონაცემები ისტორიის ფაილში \"%s\"" + +#: access/transam/timeline.c:174 +#, c-format +msgid "Timeline IDs must be in increasing sequence." +msgstr "დროის ხაზის ID-ები ზრდადობით უნდა იყოს დალაგებული." + +#: access/transam/timeline.c:194 +#, c-format +msgid "invalid data in history file \"%s\"" +msgstr "არასწორი მონაცემები ისტორიის ფაილში \"%s\"" + +#: access/transam/timeline.c:195 +#, c-format +msgid "Timeline IDs must be less than child timeline's ID." +msgstr "დროის ხაზის ID-ები შვილეული დროის ხაზის ID-ზე ნაკლები უნდა იყოს." + +#: access/transam/timeline.c:597 +#, c-format +msgid "requested timeline %u is not in this server's history" +msgstr "მოთხოვნილი დროის ხაზი %u სერვერს ისტორიაში არაა" + +#: access/transam/twophase.c:386 +#, c-format +msgid "transaction identifier \"%s\" is too long" +msgstr "ტრანზაქციის იდენტიფიკატორი \"%s\" ძალიან გრძელია" + +#: access/transam/twophase.c:393 +#, c-format +msgid "prepared transactions are disabled" +msgstr "მომზადებული ტრანზაქციები გამორთულია" + +#: access/transam/twophase.c:394 +#, c-format +msgid "Set max_prepared_transactions to a nonzero value." +msgstr "საჭიროა max_prepared_tranzactions-ის არანულოვან მნიშვნელობაზე დაყენება." + +#: access/transam/twophase.c:413 +#, c-format +msgid "transaction identifier \"%s\" is already in use" +msgstr "ტრანზაქციის იდენტიფიკატორი \"%s\" უკვე გამოიყენება" + +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 +#, c-format +msgid "maximum number of prepared transactions reached" +msgstr "მიღწეულია მომზადებული ტრანზაქციების მაქსიმალური რაოდენობა" + +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 +#, c-format +msgid "Increase max_prepared_transactions (currently %d)." +msgstr "გაზარდეთ max_prepared_transactions (ამჟამად %d)." + +#: access/transam/twophase.c:599 +#, c-format +msgid "prepared transaction with identifier \"%s\" is busy" +msgstr "მომზადებული ტრანზაქცია იდენტიფიკატორით \"%s\" დაკავებულია" + +#: access/transam/twophase.c:605 +#, c-format +msgid "permission denied to finish prepared transaction" +msgstr "მომზადებული ტრანზაქციის დასრულების წვდომა აკრძალულია" + +#: access/transam/twophase.c:606 +#, c-format +msgid "Must be superuser or the user that prepared the transaction." +msgstr "უნდა ბრძანდებოდეთ ზემომხმარებელი ან მომხმარებელი, რომელმაც ტრანზაქცია მოამზადა." + +#: access/transam/twophase.c:617 +#, c-format +msgid "prepared transaction belongs to another database" +msgstr "მომზადებული ტრანზაქცია სხვა ბაზას ეკუთვნის" + +#: access/transam/twophase.c:618 +#, c-format +msgid "Connect to the database where the transaction was prepared to finish it." +msgstr "ტრანზაქციის დასამთავრებლად დაუკავშირდით ბაზას, სადაც ის მომზადდა." + +#: access/transam/twophase.c:633 +#, c-format +msgid "prepared transaction with identifier \"%s\" does not exist" +msgstr "მომზადებული ტრანზაქცია იდენტიფიკატორით \"%s\" არ არსებობს" + +#: access/transam/twophase.c:1170 +#, c-format +msgid "two-phase state file maximum length exceeded" +msgstr "ორფაზიანი მდგომარეობის ფაილის მაქსიმალური სიგრძე გადაჭარბებულია" + +#: access/transam/twophase.c:1325 +#, c-format +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 ბაიტი" + +#: access/transam/twophase.c:1334 +#, c-format +msgid "incorrect alignment of CRC offset for file \"%s\"" +msgstr "ფაილისთვის \"%s\" CRC-ს წანაცვლების არასწორი სწორება" + +#: access/transam/twophase.c:1352 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ფაილის \"%s\" წაკითხვა შეუძლებელია: წაკითხულია %d %lld-დან" + +#: access/transam/twophase.c:1367 +#, c-format +msgid "invalid magic number stored in file \"%s\"" +msgstr "ფაილში (\"%s\") დამახსოვრებული მაგიური რიცხვი არასწორია" + +#: access/transam/twophase.c:1373 +#, c-format +msgid "invalid size stored in file \"%s\"" +msgstr "ფაილში (\"%s\") დამახსოვრებული ზომა არასწორია" + +#: access/transam/twophase.c:1385 +#, c-format +msgid "calculated CRC checksum does not match value stored in file \"%s\"" +msgstr "გამოთვლილი CRC საკონტროლო ჯამი არ ემთხვევა მნიშვნელობას, რომელიც ფაილში \"%s\" წერია" + +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 replication/logical/logical.c:206 replication/walsender.c:702 +#, c-format +msgid "Failed while allocating a WAL reading processor." +msgstr "შეცდომა WAL კითხვის პროცესორის გამოყოფისას." + +#: access/transam/twophase.c:1425 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "\"WAL\"-დან 2ფაზიანი მდგომარეობის წაკითხვის შეცდომა მისამართზე %X/%X: %s" + +#: access/transam/twophase.c:1430 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X" +msgstr "\"WAL\"-დან 2ფაზიანი მდგომარეობის წაკითხვის შეცდომა მისამართზე %X/%X" + +#: access/transam/twophase.c:1438 +#, c-format +msgid "expected two-phase state data is not present in WAL at %X/%X" +msgstr "\"WAL\"-ში მოსალოდნელი ორფაზიანი მდგომარეობის მონაცემები მისამართზე %X/%X არ არსებობს" + +#: access/transam/twophase.c:1734 +#, c-format +msgid "could not recreate file \"%s\": %m" +msgstr "ფაილის (\"%s\") თავიდან შექმნის შეცდომა: %m" + +#: access/transam/twophase.c:1861 +#, 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 ორფაზიანი მდგომარეობის ფაილი ჩაიწერა" +msgstr[1] "დიდხანს-გაშვებული მომზადებული ტრანზაქციებისთვის %u ორფაზიანი მდგომარეობის ფაილი ჩაიწერა" + +#: access/transam/twophase.c:2095 +#, c-format +msgid "recovering prepared transaction %u from shared memory" +msgstr "მიმდინარეობს გაზიარებული მეხსიერებიდან წინასწარ მომზადებული ტრანზაქციის აღდგენა: %u" + +#: access/transam/twophase.c:2188 +#, c-format +msgid "removing stale two-phase state file for transaction %u" +msgstr "ორფაზიანი მდგომარეობის გაჭედილი ფაილის მოცილება ტრანზაქციისთვის %u" + +#: access/transam/twophase.c:2195 +#, c-format +msgid "removing stale two-phase state from memory for transaction %u" +msgstr "ორფაზიანი მდგომარეობის გაჭედილი მდგომარეობის წაშლა ტრანზაქციისთვის: %u" + +#: access/transam/twophase.c:2208 +#, c-format +msgid "removing future two-phase state file for transaction %u" +msgstr "მომავალი ორფაზიანი მდგომარეობის ფაილის წაშლა ტრანზაქციისთვის %u" + +#: access/transam/twophase.c:2215 +#, c-format +msgid "removing future two-phase state from memory for transaction %u" +msgstr "მომავალი ორფაზიანი მდგომარეობის მეხსიერებიდან წაშლა ტრანზაქციისთვის %u" + +#: access/transam/twophase.c:2240 +#, c-format +msgid "corrupted two-phase state file for transaction %u" +msgstr "ორფაზიანი მდგომარეობის დაზიანებული ფაილი ტრანზაქციისთვის %u" + +#: access/transam/twophase.c:2245 +#, c-format +msgid "corrupted two-phase state in memory for transaction %u" +msgstr "ორფაზიანი მდგომარეობის დაზიანებული მეხსიერება ტრანზაქციისთვის %u" + +#: access/transam/twophase.c:2502 +#, c-format +msgid "could not recover two-phase state file for transaction %u" +msgstr "ორფაზიანი მდგომარეობის ფაილის აღდგენა ტრანზაქციისთვის %u შეუძლებელია" + +#: access/transam/twophase.c:2504 +#, c-format +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "" + +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "ფაილის (%s) წვდომის შეცდომა: %m" + +#: 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: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 "" + +#: 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:148 access/transam/varsup.c:463 +#, c-format +msgid "database \"%s\" must be vacuumed within %u transactions" +msgstr "ბაზა \"%s\" ტრანზაქციაში %u უნდა მომტვერსასრუტდეს" + +#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#, c-format +msgid "database with OID %u must be vacuumed within %u transactions" +msgstr "ბაზა \"%u\" %u ტრანზაქციის განმავლობაში უნდა მომტვერსასრუტდეს" + +#: access/transam/xact.c:1098 +#, c-format +msgid "cannot have more than 2^32-2 commands in a transaction" +msgstr "ტრანზაქციაში 2^32-2 ბრძანებაზე მეტი ვერ იქნება" + +#: access/transam/xact.c:1644 +#, c-format +msgid "maximum number of committed subtransactions (%d) exceeded" +msgstr "გადაცილებულია გადაცემული ქვეტრანზაქციების მაქსიმალური რაოდენობა: %d" + +#: access/transam/xact.c:2501 +#, c-format +msgid "cannot PREPARE a transaction that has operated on temporary objects" +msgstr "ტრანზაქციაზე, რომელიც დროებით ობიექტებზე მუშაობდა, PREPARE-ს ვერ იზამთ" + +#: access/transam/xact.c:2511 +#, c-format +msgid "cannot PREPARE a transaction that has exported snapshots" +msgstr "ტრანზაქციაზე, რომლიდანაც სწრაფი ასლები გაიტანეს, PREPARE-ს ვერ გაუშვებთ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3478 +#, c-format +msgid "%s cannot run inside a transaction block" +msgstr "%s ქვეტრანზაქციის ბლოკის შიგნით ვერ გაეშვება" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3488 +#, c-format +msgid "%s cannot run inside a subtransaction" +msgstr "%s ქვეტრანზაქციაში ვერ გაეშვება" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3498 +#, c-format +msgid "%s cannot be executed within a pipeline" +msgstr "%s ფუნქციიდან ვერ გაეშვება" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3508 +#, c-format +msgid "%s cannot be executed from a function" +msgstr "%s ფუნქციიდან ვერ გაეშვება" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3579 access/transam/xact.c:3894 access/transam/xact.c:3973 access/transam/xact.c:4096 access/transam/xact.c:4247 access/transam/xact.c:4316 access/transam/xact.c:4427 +#, c-format +msgid "%s can only be used in transaction blocks" +msgstr "%s მხოლოდ ტრანზაქციის ბლოკში შეიძლება იყოს გამოყენებული" + +#: access/transam/xact.c:3780 +#, c-format +msgid "there is already a transaction in progress" +msgstr "ტრანზაქცია უკვე მიმდინარეობს" + +#: access/transam/xact.c:3899 access/transam/xact.c:3978 access/transam/xact.c:4101 +#, c-format +msgid "there is no transaction in progress" +msgstr "ტრანზაქცია გაშვებული არაა" + +#: access/transam/xact.c:3989 +#, c-format +msgid "cannot commit during a parallel operation" +msgstr "პარალელური ოპერაციის დროს გადაცემა შეუძლებელია" + +#: access/transam/xact.c:4112 +#, c-format +msgid "cannot abort during a parallel operation" +msgstr "პარალელური ოპერაციის დროს გაუქმება შეუძლებელია" + +#: access/transam/xact.c:4211 +#, c-format +msgid "cannot define savepoints during a parallel operation" +msgstr "პარალელური ოპერაციის დროს შესანახი წერტილების აღწერა შეუძლებელია" + +#: access/transam/xact.c:4298 +#, c-format +msgid "cannot release savepoints during a parallel operation" +msgstr "პარალელური ოპერაციის დროს შესანახი წერტილების წაშლა შეუძლებელია" + +#: access/transam/xact.c:4308 access/transam/xact.c:4359 access/transam/xact.c:4419 access/transam/xact.c:4468 +#, c-format +msgid "savepoint \"%s\" does not exist" +msgstr "შესანახი წერტილი არ არსებობს: %s" + +#: access/transam/xact.c:4365 access/transam/xact.c:4474 +#, c-format +msgid "savepoint \"%s\" does not exist within current savepoint level" +msgstr "შესანახი წერტილების მიმდინარე დონეზე შესანახი წერტილი არ არსებობს: %s" + +#: access/transam/xact.c:4407 +#, c-format +msgid "cannot rollback to savepoints during a parallel operation" +msgstr "პარალელური ოპერაციის დროს შენახულ წერტილზე დაბრუნება შეუძლებელია" + +#: access/transam/xact.c:4535 +#, c-format +msgid "cannot start subtransactions during a parallel operation" +msgstr "პარალელური ოპერაციის დროს ქვეტრანსაქციების დაწყება შეუძლებელია" + +#: access/transam/xact.c:4603 +#, c-format +msgid "cannot commit subtransactions during a parallel operation" +msgstr "პარალელური ოპერაციის დროს ქვეტრანსაქციების გადაგზავნა შეუძლებელია" + +#: access/transam/xact.c:5250 +#, c-format +msgid "cannot have more than 2^32-1 subtransactions in a transaction" +msgstr "ტრანზაქციაში 2^32-1 ქვეტრანზაქციაზე მეტი ვერ იქნება" + +#: access/transam/xlog.c:1463 +#, c-format +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "" + +#: access/transam/xlog.c:2224 +#, c-format +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "ჟურნალის ფაილში (%s) ჩაწერის შეცდომა წანაცვლება %u, სიგრძე %zu: %m" + +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 replication/walsender.c:2716 +#, c-format +msgid "requested WAL segment %s has already been removed" +msgstr "მოთხოვნილი WAL სეგმენტი %s უკვე წაშლილია" + +#: access/transam/xlog.c:3756 +#, c-format +msgid "could not rename file \"%s\": %m" +msgstr "ფაილის გადარქმევის შეცდომა %s: %m" + +#: 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:3814 +#, c-format +msgid "creating missing WAL directory \"%s\"" +msgstr "ნაკლული WAL საქაღალდის შექმნა: \"%s\"" + +#: access/transam/xlog.c:3817 commands/dbcommands.c:3115 +#, c-format +msgid "could not create missing directory \"%s\": %m" +msgstr "ნაკლული საქაღალდის (\"%s\") შექმნის შეცდომა: %m" + +#: access/transam/xlog.c:3884 +#, c-format +msgid "could not generate secret authorization token" +msgstr "ავთენტიკაციისთვის ერთჯერადი კოდის გენერაციის შეცდომა" + +#: 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: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: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: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: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:4067 +#, c-format +msgid "incorrect checksum in control file" +msgstr "არასწორი საკონტროლო ჯამი pg_control-ის ფაილში" + +#: 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: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: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: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: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: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: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: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: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: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: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: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: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_BYVA -ის გარეშე, მაგრამ სერვერი აგებულია USE_FLOAT8_BYVAL-ით." + +#: 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 სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1გბ-ს შორის, მაგრამ კონტროლის ფაილში მითითებულია %d ბაიტი" +msgstr[1] "WAL სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1გბ-ს შორის, მაგრამ კონტროლის ფაილში მითითებულია %d ბაიტი" + +#: 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\"-ზე მინიმუმ ორჯერ მეტი უნდა იყოს" + +#: 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\"-ზე მინიმუმ ორჯერ მეტი უნდა იყოს" + +#: access/transam/xlog.c:4620 +#, c-format +msgid "could not write bootstrap write-ahead log file: %m" +msgstr "ფაილში წინასწარ-ჩაწერადი ჟურნალის ფაილის დასაწყისის ჩაწერის შეცდომა: %m" + +#: access/transam/xlog.c:4628 +#, c-format +msgid "could not fsync bootstrap write-ahead log file: %m" +msgstr "ფაილში წინასწარ-ჩაწერადი ჟურნალის ფაილის დასაწყისის fsync-ის შეცდომა: %m" + +#: access/transam/xlog.c:4634 +#, c-format +msgid "could not close bootstrap write-ahead log file: %m" +msgstr "ფაილში წინასწარ-ჩაწერადი ჟურნალის ფაილის დასაწყისის დახურვის შეცდომა: %m" + +#: access/transam/xlog.c:4852 +#, c-format +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "WAL-ი გენერირებუი იყო wal_level=minimal -ით. აღდგენა ვერ გაგრძელდება" + +#: access/transam/xlog.c:4853 +#, c-format +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "ეს ხდება, თუ სერვერზე დროებით wal_level=minimal -ს დააყენებთ." + +#: access/transam/xlog.c:4854 +#, c-format +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "გამოიყენეთ მარქაფი, რომელიც wal_level-ის მინიმალურზე მეტზე დაყენების შემდეგ აიღეთ." + +#: access/transam/xlog.c:4918 +#, c-format +msgid "control file contains invalid checkpoint location" +msgstr "საკონტროლო ფაილი საკონტროლო წერტილის არასწორ მდებარეობას შეიცავს" + +#: access/transam/xlog.c:4929 +#, c-format +msgid "database system was shut down at %s" +msgstr "მონაცემთა ბაზის სისტემის გათიშვის დრო: %s" + +#: access/transam/xlog.c:4935 +#, c-format +msgid "database system was shut down in recovery at %s" +msgstr "მონაცემთა ბაზის სისტემის აღდგენისას გათიშვის დრო: %s" + +#: access/transam/xlog.c:4941 +#, c-format +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "მონაცემთა ბაზა შეწყვეტილია; ბოლოს ჩართული იყო: %s" + +#: access/transam/xlog.c:4947 +#, c-format +msgid "database system was interrupted while in recovery at %s" +msgstr "მონაცემთა ბაზის სისტემის აღდგენისას გათიშვის დრო: %s" + +#: access/transam/xlog.c:4949 +#, 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:4955 +#, c-format +msgid "database system was interrupted while in recovery at log time %s" +msgstr "მონაცემთა ბაზის სისტემა გაითიშა აღდგენისას ჟურნალის დროს %s" + +#: access/transam/xlog.c:4957 +#, 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:4963 +#, c-format +msgid "database system was interrupted; last known up at %s" +msgstr "მონაცემთა ბაზა შეწყვეტილია; ბოლოს ჩართული იყო: %s" + +#: access/transam/xlog.c:4969 +#, c-format +msgid "control file contains invalid database cluster state" +msgstr "კონტროლის ფაილი ბაზის კლასტერის არასწორ მდგომარეობას შეიცავს" + +#: access/transam/xlog.c:5353 +#, c-format +msgid "WAL ends before end of online backup" +msgstr "WAL ონლაინ მარქაფის დასასრულამდე მთავრდება" + +#: access/transam/xlog.c:5354 +#, c-format +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "აღდგენისას ონლაინ მარქაფის აღებისას გენერირებული ყველა WAL-ი ხელმისაწვდომი უნდა იყოს." + +#: access/transam/xlog.c:5357 +#, c-format +msgid "WAL ends before consistent recovery point" +msgstr "WAL აღდგენის შეთანხმებულ წერტილამდე მთავრდება" + +#: access/transam/xlog.c:5405 +#, c-format +msgid "selected new timeline ID: %u" +msgstr "დროის ახალი ხაზის არჩეული ID: %u" + +#: access/transam/xlog.c:5438 +#, c-format +msgid "archive recovery complete" +msgstr "არქივიდან აღდგენა დასრულდა" + +#: access/transam/xlog.c:6044 +#, c-format +msgid "shutting down" +msgstr "მიმდინარეობს გამორთვა" + +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6083 +#, 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:6095 +#, c-format +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "საკონტროლო წერტილი იწყება:%s%s%s%s%s%s%s%s" + +#: access/transam/xlog.c:6155 +#, 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 "" + +#: access/transam/xlog.c:6175 +#, 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 "" + +#: access/transam/xlog.c:6610 +#, c-format +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "კონკურენტული წინასწარ-ჩაწერადი ჟურნალის აქტივობა, სანამ მონაცემთა ბაზა მუშაობას ასრულებს" + +#: access/transam/xlog.c:7167 +#, c-format +msgid "recovery restart point at %X/%X" +msgstr "აღდგენის გადატვირთვის წერტილი: %X/%X" + +#: access/transam/xlog.c:7169 +#, c-format +msgid "Last completed transaction was at log time %s." +msgstr "უკანასკნელად დასრულებული ტრანზაქცია მოხდა ჟურნალის დროით %s." + +#: access/transam/xlog.c:7416 +#, c-format +msgid "restore point \"%s\" created at %X/%X" +msgstr "აღდგენის წერტილი \"%s\" შექმნილია %X/%X -სთან" + +#: access/transam/xlog.c:7623 +#, c-format +msgid "online backup was canceled, recovery cannot continue" +msgstr "ონლაინ მარქაფი გაუქმდა. აღდგენა ვერ გაგრძელდება" + +#: access/transam/xlog.c:7680 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "გამორთვის საკონტროლო წერტილში ნაპოვნია დროის ხაზი %u მოულოდნელია (უნდა იყოს %u)" + +#: access/transam/xlog.c:7738 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "ჩართვის საკონტროლო წერტილში ნაპოვნია დროის ხაზი %u მოულოდნელია (უნდა იყოს %u)" + +#: access/transam/xlog.c:7767 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "აღდგენის ბოლო საკონტროლო წერტილში ნაპოვნია დროის ხაზი %u მოულოდნელია (უნდა იყოს %u)" + +#: access/transam/xlog.c:8025 +#, c-format +msgid "could not fsync write-through file \"%s\": %m" +msgstr "გამჭოლად-ჩაწერადი ფაილის (%s) fsync-ის შეცდომა: %m" + +#: access/transam/xlog.c:8031 +#, c-format +msgid "could not fdatasync file \"%s\": %m" +msgstr "ფაილის \"%s\" fdatasync შეუძლებელია: %m" + +#: access/transam/xlog.c:8126 access/transam/xlog.c:8493 +#, c-format +msgid "WAL level not sufficient for making an online backup" +msgstr "ონლაინ მარქაფისთვის WAL-ის მიმდინარე დონე საკმარისი არაა" + +#: access/transam/xlog.c:8127 access/transam/xlog.c:8494 access/transam/xlogfuncs.c:199 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "სერვისის გაშვებისას wal_level -ის მნიშვნელობა უნდა იყოს \"replica\" ან \"logical\"." + +#: access/transam/xlog.c:8132 +#, c-format +msgid "backup label too long (max %d bytes)" +msgstr "მარქაფის ჭდე ძალიან გრძელია (max %d ბაიტი)" + +#: access/transam/xlog.c:8248 +#, c-format +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "" + +#: access/transam/xlog.c:8250 access/transam/xlog.c:8606 +#, 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 და მხოლოდ შემდეგ სცადეთ ონლაინ აღდგენა." + +#: access/transam/xlog.c:8330 backup/basebackup.c:1345 utils/adt/misc.c:347 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "%s: სიმბმული ძალიან გრძელია" + +#: access/transam/xlog.c:8380 backup/basebackup.c:1360 commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#, c-format +msgid "tablespaces are not supported on this platform" +msgstr "ამ პლატფორმაზე ცხრილის სივრცეები მხარდაჭერილი არაა" + +#: access/transam/xlog.c:8539 access/transam/xlog.c:8552 access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "არასწორი მონაცემები ფაილში \"%s\"" + +#: access/transam/xlog.c:8556 backup/basebackup.c:1200 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "უქმე წახალისდა ონლაინ მარქაფის მიმდინარეობის დროს" + +#: access/transam/xlog.c:8557 backup/basebackup.c:1201 +#, 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:8604 +#, c-format +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "" + +#: access/transam/xlog.c:8729 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "ძირითადი მარქაფი დასრულდა. ველოდები აუცილებელი WAL-ის სეგმენტების დაარქივებას" + +#: access/transam/xlog.c:8743 +#, c-format +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "ჯერ კიდევ ველოდები ყველა აუცილებელი WAL სეგმენტის დაარქივებას (გასულია %d წამი)" + +#: access/transam/xlog.c:8745 +#, 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 "" + +#: access/transam/xlog.c:8752 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "ყველა საჭირო WAL სეგმენტი დაარქივებულია" + +#: access/transam/xlog.c:8756 +#, 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 "" + +#: access/transam/xlog.c:8805 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "მარქაფი გაუქმდა, რადგან უკანაბოლომ მუშაობა pg_backup_stop-ის გამოძახებამდე დაასრულა" + +#: access/transam/xlogarchive.c:208 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "არქივის ფაილის \"%s\" არასწორი ზომა: %lld. უნდა იყოს %lld" + +#: access/transam/xlogarchive.c:217 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "ჟურნალის ფაილი \"%s\" არქივიდან აღდგა" + +#: access/transam/xlogarchive.c:231 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command -მა ნულოვანი სტატუსი დააბრუნა, მაგრამ stat()-მა შეცდომა." + +#: access/transam/xlogarchive.c:263 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "ფაილის (\"%s\") არქივიდან (\"%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:376 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "არქივის სტატუსის ფაილის (%s) შექმნის შეცდომა: %m" + +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "არქივის სტატუსის ფაილის (%s) ჩაწერის შეცდომა: %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "ამ სესიაში მარქაფი უკვე მიმდინარეობს" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "მარქაფი არ მიმდინარეობს" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "თქვენ გამოიძახეთ pg_backup_start()?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "WAL კონტროლის ფუნქციების შესრულება აღდგენის დროს შეუძლებელია." + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL დონე არ არის საკმარისი აღდგენის წერტილის შესაქმნელად" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "აღდგენის წერტილისთვის მნიშვნელობა ძალიან გრძელია (მაქს. %d სიმბოლო)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s არ შეიძლება შესრულდეს აღდგენის დროს." + +#: 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 "recovery is not in progress" +msgstr "აღდგენა არ მიმდინარეობს" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "აღდგენის კონტროლის ფუნქციების შესრულება მხოლოდ აღდგენის დროს შეიძლება." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "მინდინარეობს უქმობის დაწინაურება" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "წახალისების დაწყების შემდეგ %s-ის შესრულება შეუძლებელია." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" უარყოფითი ან ნულოვანი არ უნდა იყოს" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "postmaster-ისთვის სიგნალის გაგზავნის შეცდომა: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "სერვერი არ წახალისდა %d წამში" +msgstr[1] "სერვერი არ წახალისდა %d წამში" + +#: access/transam/xlogprefetcher.c:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch პლატფორმებზე, რომლებსაც posix_fadvise() არ აქვთ, მხარდაჭერილი არაა." + +#: access/transam/xlogreader.c:625 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "ჩანაწერის არასწორი წანაცვლება მისამართზე %X/%X" + +#: access/transam/xlogreader.c:633 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "contrecord მოთხოვნილია %X/%X-ის მიერ" + +#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1117 +#, c-format +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "ჩანაწერს არასწორი ზომა მისამართზე %X/%X: მინდოდა %u, მივიღე %u" + +#: access/transam/xlogreader.c:703 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "%u სიგრძის მქონე ჩანაწერის დეკოდირებისთვის მეხსიერება საკმარისი არაა" + +#: access/transam/xlogreader.c:725 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "ჩანაწერის სიგრძე %u მისამართზე %X/%X ძალიან გრძელია" + +#: access/transam/xlogreader.c:774 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "მისამართზე %X/%X contrecord ალამი არ არსებობს" + +#: access/transam/xlogreader.c:787 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "contrecord -ის არასწორი სიგრძე %u (მოველოდი %lld) მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1125 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "რესურსის მმართველის არასწორი ID %u მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1138 access/transam/xlogreader.c:1154 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "ჩანაწერი არასწორი წინა ბმულით %X/%X მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1190 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "რესურსის მმართველის მონაცემების არასწორი საკონტროლო რიცხვი ჩანაწერში მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1227 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "არასწორი მაგიური რიცხვი %04X ჟურნალის სეგმენტში %s, წანაცვლება %u" + +#: access/transam/xlogreader.c:1241 access/transam/xlogreader.c:1282 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "არასწორი საინფორმაციო ბიტები %04X ჟურნალის სეგმენტში %s, წანაცვლება %u" + +#: access/transam/xlogreader.c:1256 +#, 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:1264 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL ფაილი სხვა მონაცემთა ბაზის სისტემიდანაა: გვერდის თავსართში მითითებული სეგმენტის ზომა არასწორია" + +#: access/transam/xlogreader.c:1270 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL ფაილი სხვა მონაცემთა ბაზის სისტემიდანაა: გვერდის თავსართში მითითებული XLOG_BLKSZ არასწორია" + +#: access/transam/xlogreader.c:1301 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "მოულოდნელი pageaddr %X/%X ჟურნალის სეგმენტში %s, წანაცვლება %u" + +#: access/transam/xlogreader.c:1326 +#, 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:1731 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "ურიგო block_id %u მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1755 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA დაყენებულია, მაგრამ მონაცემები მისამართზე %X/%X არ არსებობს" + +#: access/transam/xlogreader.c:1762 +#, 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:1798 +#, 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:1814 +#, 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:1828 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED დაყენებულია, მაგრამ ბლოკის ასლის სიგრძეა %u მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1843 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "არც BKPIMAGE_HAS_HOLE და არც BKPIMAGE_COMPRESSED დაყენებული არაა, მაგრამ ბლოკის ასლის სიგრძე %u-ა, მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1859 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL დაყენებულია, მაგრამ წინა მნიშვნელობა მითითებული არაა მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1871 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "არასწორი block_id %u %X/%X" + +#: access/transam/xlogreader.c:1938 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "ჩანაწერი არასწორი სიგრძით მისამართზე %X/%X" + +#: access/transam/xlogreader.c:1963 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "შეცდომა WAL ჩანაწერში მარქაფი ბლოკის, ID-ით %d, მოძებნისას" + +#: access/transam/xlogreader.c:2047 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "შეუძლებელია ასლის აღდგენა მისამართზე %X/%X, როცა მითითებულია არასწორი ბლოკი %d" + +#: access/transam/xlogreader.c:2054 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "არასწორად შეკუმშული ასლი მისამართზე %X/%X, ბლოკი %d" + +#: access/transam/xlogreader.c:2081 access/transam/xlogreader.c:2098 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "%3$s მეთოდით შეკუმშული ასლი მისამართზე %1$X/%2$X, ბლოკი %4$d მხარდაუჭერელია ამ აგების მიერ" + +#: access/transam/xlogreader.c:2107 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "ასლის აღდგენის შეცდომა მისამართზე %X/%X შეკუმშული უცნობი მეთოდით, ბლოკი %d" + +#: access/transam/xlogreader.c:2115 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "არასწორად შეკუმშული ასლი მისამართზე %X/%X, ბლოკი %d" + +#: access/transam/xlogrecovery.c:545 +#, c-format +msgid "entering standby mode" +msgstr "უქმე რეჟიმზე გადართვა" + +#: access/transam/xlogrecovery.c:548 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "დროში-მითითებული-წერტილით აღდგენის დასაწყისი XID-მდე %u" + +#: access/transam/xlogrecovery.c:552 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "დროში-მითითებული-წერტილით აღდგენის დასაწყისი %s" + +#: access/transam/xlogrecovery.c:556 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "დროში-მითითებული-წერტილით აღდგენის დასაწყისი \"%s\"" + +#: access/transam/xlogrecovery.c:560 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "" + +#: access/transam/xlogrecovery.c:564 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "უახლოეს თანმიმდევრულ წერტილამდე დროში-მითითებული-წერტილით აღდგენის დასაწყისი" + +#: access/transam/xlogrecovery.c:567 +#, c-format +msgid "starting archive recovery" +msgstr "არქივიდან აღდგენა დაიწყო" + +#: access/transam/xlogrecovery.c:651 +#, c-format +msgid "could not find redo location referenced by checkpoint record" +msgstr "საკონტროლო წერტილის ჩანაწერის მიერ მითითებული დაბრუნების წერტილის პოვნა შეუძლებელია" + +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 +#, 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 "" + +#: access/transam/xlogrecovery.c:661 +#, c-format +msgid "could not locate required checkpoint record" +msgstr "საკონტროლო წერტილის საჭირო ჩანაწერის მოძებნა შეუძლებელია" + +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 +#, c-format +msgid "could not create symbolic link \"%s\": %m" +msgstr "სიმბმულის შექმნის შეცდომა %s: %m" + +#: access/transam/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 +#, c-format +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "ფაილის (\"%s\") იგნორირება იმიტომ, რომ ფაილი \"%s\" არ არსებობს" + +#: access/transam/xlogrecovery.c:724 +#, c-format +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "სახელშეცვლილია '%s' -დან '%s'-ზე." + +#: access/transam/xlogrecovery.c:730 +#, c-format +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "გადარქმევის შეცდომა %s - %s: %m." + +#: access/transam/xlogrecovery.c:784 +#, c-format +msgid "could not locate a valid checkpoint record" +msgstr "სწორი საკონტროლო წერტილის ჩანაწერის მოძებნა შეუძლებელია" + +#: access/transam/xlogrecovery.c:808 +#, c-format +msgid "requested timeline %u is not a child of this server's history" +msgstr "მოთხოვნილი დროის ხაზი %u სერვერის ისტორიის შვილი არაა" + +#: access/transam/xlogrecovery.c:810 +#, 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 "" + +#: access/transam/xlogrecovery.c:824 +#, c-format +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "" + +#: access/transam/xlogrecovery.c:852 +#, c-format +msgid "invalid next transaction ID" +msgstr "შემდეგი ტრანზაქციის არასწორი ID" + +#: access/transam/xlogrecovery.c:857 +#, c-format +msgid "invalid redo in checkpoint record" +msgstr "არასწორი გამეორება საკონტროლო წერტილის ჩანაწერში" + +#: access/transam/xlogrecovery.c:868 +#, c-format +msgid "invalid redo record in shutdown checkpoint" +msgstr "გამეორების არასწორი ჩანაწერი გამორთვის საკონტროლო წერტილში" + +#: access/transam/xlogrecovery.c:897 +#, c-format +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "მონაცემთა ბაზა არასწორად გამოირთო; მიმდინარეობს ავტომატური აღდეგენა" + +#: access/transam/xlogrecovery.c:901 +#, c-format +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "ავარიიდან აღდგენა იწყება დროის ხაზზე %u და სამიზნედ დროის ხაზი %u აქვს" + +#: access/transam/xlogrecovery.c:944 +#, c-format +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label შეიცავს მონაცემებს, რომელიც კონტროლის ფაილს არ შეესაბამება" + +#: access/transam/xlogrecovery.c:945 +#, c-format +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "ეს ნიშნავს, რომ მარქაფი დაზიანებულია და აღდგენისთვის სხვა მარქაფის გამოყენება მოგიწევთ." + +#: access/transam/xlogrecovery.c:999 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "აღდგენის ბრძანების ფაილი \"%s\" მხარდაუჭერელია" + +#: access/transam/xlogrecovery.c:1064 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "ერთმომხმარებლიან სერვერებს უქმე რეჟიმი არ გააჩნიათ" + +#: access/transam/xlogrecovery.c:1081 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "მითითებულია არც primary_conninfo და არც restore_command" + +#: access/transam/xlogrecovery.c:1082 +#, c-format +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "" + +#: access/transam/xlogrecovery.c:1090 +#, c-format +msgid "must specify restore_command when standby mode is not enabled" +msgstr "როცა უქმე რეჟიმი ჩართული არაა, restore_command პარამეტრის მითითება აუცილებელია" + +#: access/transam/xlogrecovery.c:1128 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "აღდგენის სამიზნე დროის ხაზი არ არსებობს: %u" + +#: access/transam/xlogrecovery.c:1278 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "დროის დამუშავებული ID %u-ა. მოველოდი მნშვნელობას %u." + +#: access/transam/xlogrecovery.c:1660 +#, c-format +msgid "redo starts at %X/%X" +msgstr "გამეორება დაიწყება მისამართიდან %X/%X" + +#: access/transam/xlogrecovery.c:1673 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "მიმდინარეობს გამეორება. გასული დრო: %ld.%02d მიმდინარე LSN: %X/%X" + +#: access/transam/xlogrecovery.c:1765 +#, c-format +msgid "requested recovery stop point is before consistent recovery point" +msgstr "მოთხოვნილი აღდგენის წერტილი მუდმივი აღდგენის წერტილამდეა" + +#: access/transam/xlogrecovery.c:1797 +#, c-format +msgid "redo done at %X/%X system usage: %s" +msgstr "გამეორება დასრულდა %X/%X -სთან. სისტემის დატვირთვა: %s" + +#: access/transam/xlogrecovery.c:1803 +#, c-format +msgid "last completed transaction was at log time %s" +msgstr "უკანასკნელად დასრულებული ტრანზაქცია მოხდა ჟურნალის დროით %s" + +#: access/transam/xlogrecovery.c:1812 +#, c-format +msgid "redo is not required" +msgstr "გამეორება საჭირო არაა" + +#: access/transam/xlogrecovery.c:1823 +#, c-format +msgid "recovery ended before configured recovery target was reached" +msgstr "აღდგენა მითითებული აღდგენის სამიზნის მიღწევამდე დასრულდა" + +#: access/transam/xlogrecovery.c:1998 +#, c-format +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "" + +#: access/transam/xlogrecovery.c:2065 +#, c-format +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "%2$s-ში ნაპოვნია მოულოდნელი საქაღალდის ჩანაწერი \"%1$s\"" + +#: access/transam/xlogrecovery.c:2067 +#, c-format +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "ყველა საქაღალდის ტიპის ელემენტი ph_tblspc/-ში სიმბმულს უნდა წარმოადგენდეს." + +#: access/transam/xlogrecovery.c:2068 +#, c-format +msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." +msgstr "" + +#: access/transam/xlogrecovery.c:2142 +#, c-format +msgid "consistent recovery state reached at %X/%X" +msgstr "თანმიმდევრული აღდგენის მდგომარეობა მიღწეულია მისამართზე %X/%X" + +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 +#, c-format +msgid "WAL redo at %X/%X for %s" +msgstr "WAL გამეორება %X/%X %s-სთვის" + +#: access/transam/xlogrecovery.c:2276 +#, c-format +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "მოულოდნელი წინა დროის ხაზის ID %u (მიმდინარე დროის ხაზის ID %u) საკონტროლო წერტილის ჩანაწერში" + +#: access/transam/xlogrecovery.c:2285 +#, c-format +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "მოულოდნელი დროის ხაზის ID %u (%u-ის შემდეგ) საკონტროლო წერტილის ჩანაწერში" + +#: access/transam/xlogrecovery.c:2301 +#, c-format +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "" + +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 +#, c-format +msgid "recovery stopping after reaching consistency" +msgstr "აღდგენა შეთანხმებული მდგომარეობის მიღწევისას დასრულდება" + +#: access/transam/xlogrecovery.c:2506 +#, c-format +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "აღდგენა შეწყდა WAL-ის მდებარეობამდე (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:2596 +#, c-format +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "აღდგენა შეწყდა ტრანზაქციის (%u) გადაცემამდე. დრო %s" + +#: access/transam/xlogrecovery.c:2603 +#, c-format +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "აღდგენა შეწყდა ტრანზაქციის (%u) გაუქმებამდე. დრო %s" + +#: access/transam/xlogrecovery.c:2656 +#, c-format +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "აღდგენა შეწყდა აღდგენის წერტილთან \"%s\". დრო %s" + +#: access/transam/xlogrecovery.c:2674 +#, c-format +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "აღდგენა შეწყდა WAL-ის მდებარეობამდე (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:2741 +#, c-format +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "აღდგენა შეწყდა ტრანზაქციის (%u) გადაცემამდე. დრო %s" + +#: access/transam/xlogrecovery.c:2749 +#, c-format +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "აღდგენა ტრანზაქციის (%u) გაუქმების შემდეგ შეწყდა. დრო %s" + +#: access/transam/xlogrecovery.c:2830 +#, c-format +msgid "pausing at the end of recovery" +msgstr "შეჩერება აღდგენის ბოლოს" + +#: access/transam/xlogrecovery.c:2831 +#, c-format +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "წასახალისებლად გაუშვით pg_wal_replay_resume()." + +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 +#, c-format +msgid "recovery has paused" +msgstr "აღდგენა შეჩერდა" + +#: access/transam/xlogrecovery.c:2835 +#, c-format +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "გასაგრძელებლად გაუშვით pg_wal_replay_resume()." + +#: access/transam/xlogrecovery.c:3101 +#, c-format +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "" + +#: access/transam/xlogrecovery.c:3306 +#, c-format +msgid "could not read from log segment %s, offset %u: %m" +msgstr "ჟურნალის სეგმენტიდან (%s, წანაცვლება %u) წაკითხვის შეცდომა: %m" + +#: access/transam/xlogrecovery.c:3312 +#, c-format +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "ჟურნალის სეგმენტიდან (%s, წანაცვლება %u) წაკითხვის შეცდომა: წავიკითხე %d %zu-დან" + +#: access/transam/xlogrecovery.c:3961 +#, c-format +msgid "invalid primary checkpoint link in control file" +msgstr "ძირითადი საკონტროლო წერტილის არასწორი ბმული საკონტროლო ფაილში" + +#: access/transam/xlogrecovery.c:3965 +#, c-format +msgid "invalid checkpoint link in backup_label file" +msgstr "backup_label ფაილში არსებული საკონტროლო წერტილი არასწორია" + +#: access/transam/xlogrecovery.c:3983 +#, c-format +msgid "invalid primary checkpoint record" +msgstr "პირველადი საკონტროლო წერტილის არასწორი ჩანაწერი" + +#: access/transam/xlogrecovery.c:3987 +#, c-format +msgid "invalid checkpoint record" +msgstr "საკონტროლო წერტილის არასწორი ჩანაწერი" + +#: access/transam/xlogrecovery.c:3998 +#, c-format +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "ძირითად საკონტროლო წერტილში აღწერილი რესურსის მმართველის ID არასწორია" + +#: access/transam/xlogrecovery.c:4002 +#, c-format +msgid "invalid resource manager ID in checkpoint record" +msgstr "რესურსის მმართველის არასწორი ID საკონტროლო წერტილის ჩანაწერში" + +#: access/transam/xlogrecovery.c:4015 +#, c-format +msgid "invalid xl_info in primary checkpoint record" +msgstr "ძირითადი საკონტროლო წერტილის არასწორი xl_info" + +#: access/transam/xlogrecovery.c:4019 +#, c-format +msgid "invalid xl_info in checkpoint record" +msgstr "საკონტროლო წერტილის არასწორი xl_info" + +#: access/transam/xlogrecovery.c:4030 +#, c-format +msgid "invalid length of primary checkpoint record" +msgstr "ძირითადი საკონტროლო წერტილის ჩანაწერის არასწორი სიგრძე" + +#: access/transam/xlogrecovery.c:4034 +#, c-format +msgid "invalid length of checkpoint record" +msgstr "საკონტროლო წერტილის ჩანაწერის არასწორი სიგრძე" + +#: access/transam/xlogrecovery.c:4090 +#, c-format +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "ახალი დროის ხაზი %u ბაზის სისტემის დროის ხაზის %u შვილი არაა" + +#: access/transam/xlogrecovery.c:4104 +#, c-format +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "" + +#: access/transam/xlogrecovery.c:4123 +#, c-format +msgid "new target timeline is %u" +msgstr "ახალი სამიზნის დროის ხაზია %u" + +#: access/transam/xlogrecovery.c:4326 +#, c-format +msgid "WAL receiver process shutdown requested" +msgstr "მოთხოვნილია WAL-ის მიმღები პროცესის გამორთვა" + +#: access/transam/xlogrecovery.c:4389 +#, c-format +msgid "received promote request" +msgstr "მიღებულა დაწინაურების მოთხოვნა" + +#: access/transam/xlogrecovery.c:4402 +#, c-format +msgid "promote trigger file found: %s" +msgstr "ნაპოვნია წახალისების ტრიგერის ფაილი: %s" + +#: access/transam/xlogrecovery.c:4410 +#, c-format +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "წახალისების ტრიგერის ფაილი (\"%s\") არ არსებობს: %m" + +#: access/transam/xlogrecovery.c:4635 +#, c-format +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "ცხელი მომლოდინე სერვერის არსებობა შეუძლებელია არასაკმარისი პარამეტრის მნიშვნელობების გამო" + +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 access/transam/xlogrecovery.c:4693 +#, 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/xlogrecovery.c:4645 +#, c-format +msgid "If recovery is unpaused, the server will shut down." +msgstr "თუ აღდგენა გაგრძელდება, სერვერი გამოირთვება." + +#: access/transam/xlogrecovery.c:4646 +#, c-format +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "კონფიგურაციაში საჭირო ცვლილებების შეტანის შემდეგ შეგიძლიათ სერვერი დაარესტარტოთ." + +#: access/transam/xlogrecovery.c:4657 +#, c-format +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "დაწინაურება შეუძლებელია არასაკმარისი პარამეტრების მნიშვნელობების გამო" + +#: access/transam/xlogrecovery.c:4667 +#, c-format +msgid "Restart the server after making the necessary configuration changes." +msgstr "კონფიგურაციაში საჭირო ცვლილებების შეტანის შემდეგ გადატვირთეთ სერვერი." + +#: access/transam/xlogrecovery.c:4691 +#, c-format +msgid "recovery aborted because of insufficient parameter settings" +msgstr "აღდგენა შეწყვეტილია არასაკმარისი პარამეტრების მნიშვნელობების გამო" + +#: access/transam/xlogrecovery.c:4697 +#, c-format +msgid "You can restart the server after making the necessary configuration changes." +msgstr "კონფიგურაციაში საჭირო ცვლილებების შეტანის შემდეგ შეგიძლიათ სერვერი დაარესტარტოთ." + +#: access/transam/xlogutils.c:1053 +#, c-format +msgid "could not read from log segment %s, offset %d: %m" +msgstr "ჟურნალის სეგმენტიდან წაკითხვის შეცდომა %s, წანაცვლება %d: %m" + +#: access/transam/xlogutils.c:1060 +#, c-format +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "ჟურნალის სეგმენტიდან წაკითხვის შეცდომა %s, წანაცვლება %d: წაკითხულია %d %d-დან" + +#: backup/backup_manifest.c:253 +#, c-format +msgid "expected end timeline %u but found timeline %u" +msgstr "მოველოდი დროის ხაზის (%u) ბოლოს, მაგრამ ნაპოვნია დროის ხაზი %u" + +#: backup/backup_manifest.c:277 +#, c-format +msgid "expected start timeline %u but found timeline %u" +msgstr "მოველოდი დროის ხაზის (%u) დასაწყისს, მაგრამ ნაპოვნია დროის ხაზი %u" + +#: backup/backup_manifest.c:304 +#, c-format +msgid "start timeline %u not found in history of timeline %u" +msgstr "დროის ხაზის %u დასაწყისი დროის ხაზის %u ისტორიაში აღმოჩენილი არაა" + +#: backup/backup_manifest.c:355 +#, c-format +msgid "could not rewind temporary file" +msgstr "დროებითი ფაილის გადახვევის შეცდომა" + +#: backup/backup_manifest.c:374 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "დროებით ფაილიდან წაკითხვის შეცდომა: წავიკითხე მხოლოდ %zu ბაიტი %zu-დან" + +#: backup/basebackup.c:454 +#, c-format +msgid "could not find any WAL files" +msgstr "ვერცერთი WAL ფაილი ვერ ვიპოვე" + +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 +#, c-format +msgid "could not find WAL file \"%s\"" +msgstr "\"WAL\" ფაილის (\"%s\") მოძებნა შეუძლებელია" + +#: backup/basebackup.c:535 backup/basebackup.c:560 +#, c-format +msgid "unexpected WAL file size \"%s\"" +msgstr "მოულოდნელი WAL ფაილის ზომა \"%s\"" + +#: backup/basebackup.c:630 +#, c-format +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "ჯამში %lld საკონტროლო ჯამის გადამოწმების შეცდომა" +msgstr[1] "ჯამში %lld საკონტროლო ჯამის გადამოწმების შეცდომა" + +#: backup/basebackup.c:637 +#, c-format +msgid "checksum verification failure during base backup" +msgstr "ბაზის მარქაფისას საკონტროლო ჯამის შემოწმების შეცდომა" + +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 backup/basebackup.c:861 backup/basebackup.c:874 +#, c-format +msgid "duplicate option \"%s\"" +msgstr "დუბლიკატი პარამეტრი \"%s\"" + +#: backup/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "საკონტროლო წერტილის უცნობი ტიპი: \"%s\"" + +#: backup/basebackup.c:769 +#, c-format +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d პარამეტრისთვის \"%s\" დასაშვებ დიაპაზონს (%d .. %d) გარეთაა" + +#: backup/basebackup.c:814 +#, c-format +msgid "unrecognized manifest option: \"%s\"" +msgstr "მანიფესტის უცნობი პარამეტრი: \"%s\"" + +#: backup/basebackup.c:830 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "საკონტროლო ჯამის უცნობი ალგორითმი: \"%s\"" + +#: backup/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "შეკუმშვის უცხო ალგორითმი: \"%s\"" + +#: backup/basebackup.c:881 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "ბაზის მარქაფის უცნობი პარამეტრი: \"%s\"" + +#: backup/basebackup.c:892 +#, c-format +msgid "manifest checksums require a backup manifest" +msgstr "მანიფესტის საკონტროლო ჯამებს მარქაფი მანიფესტი ესაჭიროება" + +#: backup/basebackup.c:901 +#, c-format +msgid "target detail cannot be used without target" +msgstr "სამიზნის დეტალს სამიზნის გარეშე ვერ გამოიყენებთ" + +#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#, c-format +msgid "target \"%s\" does not accept a target detail" +msgstr "სამიზნეს \"%s\" სამიზნის დეტალების მხარდაჭერა არ გააჩნია" + +#: backup/basebackup.c:921 +#, c-format +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "შეკუმშვის დეტალებს ვერ დააყენებთ, სანამ შეკუმშვა ჩართული არაა" + +#: backup/basebackup.c:934 +#, c-format +msgid "invalid compression specification: %s" +msgstr "შეკუმშვის არასწორი სპეციფიკაცია: %s" + +#: backup/basebackup.c:1431 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "სპეციალური ფაილის გამოტოვება \"%s\"" + +#: backup/basebackup.c:1550 +#, c-format +msgid "invalid segment number %d in file \"%s\"" +msgstr "არასწორი სეგმენტის ნომერი %d ფაილში \"%s\"" + +#: backup/basebackup.c:1582 +#, c-format +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "საკონტროლო ჯამის გადამოწმება შეუძლებელია ფაილში \"%s\", ბლოკი %u: წაკითხვის ბუფერის ზომა %d და გვერდის ზომა %d განსხვავდება" + +#: backup/basebackup.c:1656 +#, c-format +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "საკონტროლო ჯამის გამოთვლის შეცდომა ფაილში \"%s\", ბლოკი \"%u\": გამოთვლილი საკონტროლო ჯამია %X, მაგრამ მოველოდი: %X" + +#: backup/basebackup.c:1663 +#, c-format +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "ამის შემდეგ ფაილში \"%s\" შეხვედრილი საკონტროლო ჯამის გადამოწმების ჩავარდნები ანგარიშში აღარ გამოჩნდება" + +#: backup/basebackup.c:1719 +#, 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 საკონტროლო ჯამის გადამოწმების ჩავარდნა აღმოაჩნდა" + +#: backup/basebackup.c:1765 +#, c-format +msgid "file name too long for tar format: \"%s\"" +msgstr "ფაილის სახელი ძალიან გრძელია tar ფორმატისთვის: \"%s\"" + +#: backup/basebackup.c:1770 +#, c-format +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "სიმბოლური ბმულის სამიზნე ძალიან გრძელია tar ფორმატისთვის: ფაილის სახელი '%s', სამიზნე '%s'" + +#: backup/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "ამ აგებაში gzip შეკუმშვის მხარდაჭერა არ არსებობს" + +#: backup/basebackup_gzip.c:143 +#, c-format +msgid "could not initialize compression library" +msgstr "შეკუმშვის ბიბლიოთეკის ინიციალიზაციის შეცდომა" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "ამ აგებაში lz4 შეკუმშვის მხარდაჭერა არ არსებობს" + +#: backup/basebackup_server.c:75 +#, c-format +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "სერვერზე შენახული მარქაფის შესაქმნელად ზემომხმარებლის ან pg_write_server_files როლის პრივილეგიებია საჭირო" + +#: backup/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for backup stored on server" +msgstr "სერვერზე დამახსოვრებული მარქაფისთვის ფარდობითი ბილიკი დაშვებული არაა" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 commands/tablespace.c:163 commands/tablespace.c:179 commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "საქაღალდე \"%s\" არსებობს, მაგრამ ცარიელი არაა" + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1086 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 backup/basebackup_server.c:268 backup/basebackup_server.c:275 storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 +#, c-format +msgid "Check free disk space." +msgstr "შეამოწმეთ, დისკზე ადგილი დარჩა, თუ არა." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "ფაილში \"%s\" ჩაწერის შეცდომა: ჩავწერე მხოლოდ %d ბაიტი %d-დან , წანაცვლებაზე %u" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "უცნობი სამიზნე: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "სამიზნეს \"%s\" სამიზნის დეტალები ესაჭიროება" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "ამ აგებაში zstd შეკუმშვის მხარდაჭერა არ არსებობს" + +#: backup/basebackup_zstd.c:117 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "შეკუმშვის დამხმარე პროცესების რიცხვის %d-ზე დაყენების შეცდომა: %s" + +#: bootstrap/bootstrap.c:263 +#, c-format +msgid "-X requires a power of two value between 1 MB and 1 GB" +msgstr "-X მოითხოვს მნიშვნელობას, რომელიც ორის ხარისხია და არის 1 მბ-სა და 1გბ-ს შორის" + +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 +#, c-format +msgid "--%s requires a value" +msgstr "--%s მნიშვნელობა სჭირდება" + +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s მნიშვნელობა სჭირდება" + +#: 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:305 +#, c-format +msgid "%s: invalid command-line arguments\n" +msgstr "%s: არასწორი ბრძანების სტრიქონის არგუმენტები\n" + +#: catalog/aclchk.c:185 +#, c-format +msgid "grant options can only be granted to roles" +msgstr "უფლებების უფლების მიცემა მხოლოდ როლებზეა შესაძლებელი" + +#: 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:312 +#, c-format +msgid "no privileges were granted for \"%s\"" +msgstr "ობიექტს \"%s\" პრივილეგიები მინიჭებული არ აქვს" + +#: 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:325 +#, c-format +msgid "not all privileges were granted for \"%s\"" +msgstr "\"%s\"-სთვის საჭირო ყველა უფლება მინიჭებული არ ყოფილა" + +#: 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:341 +#, c-format +msgid "no privileges could be revoked for \"%s\"" +msgstr "%s-სთვის უფლებები არ გაუქმდება" + +#: 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:354 +#, c-format +msgid "not all privileges could be revoked for \"%s\"" +msgstr "\"%s\"-ზე ყველა პრივილეგიის გაუქმება შეუძლებელია" + +#: 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:458 catalog/aclchk.c:1033 +#, c-format +msgid "invalid privilege type %s for sequence" +msgstr "მიმდევრობის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:462 +#, c-format +msgid "invalid privilege type %s for database" +msgstr "ბაზის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:466 +#, c-format +msgid "invalid privilege type %s for domain" +msgstr "დომენის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:470 catalog/aclchk.c:1037 +#, c-format +msgid "invalid privilege type %s for function" +msgstr "ფუნქციის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:474 +#, c-format +msgid "invalid privilege type %s for language" +msgstr "ენის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:478 +#, c-format +msgid "invalid privilege type %s for large object" +msgstr "დიდი ობიექტის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:482 catalog/aclchk.c:1053 +#, c-format +msgid "invalid privilege type %s for schema" +msgstr "სქემის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:486 catalog/aclchk.c:1041 +#, c-format +msgid "invalid privilege type %s for procedure" +msgstr "პროცედურის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:490 catalog/aclchk.c:1045 +#, c-format +msgid "invalid privilege type %s for routine" +msgstr "ქვეპროგრამის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:494 +#, c-format +msgid "invalid privilege type %s for tablespace" +msgstr "ცხრილის სივრცის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:498 catalog/aclchk.c:1049 +#, c-format +msgid "invalid privilege type %s for type" +msgstr "ტიპის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:502 +#, c-format +msgid "invalid privilege type %s for foreign-data wrapper" +msgstr "გარე მონაცემების გადამტანის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:506 +#, c-format +msgid "invalid privilege type %s for foreign server" +msgstr "გარე სერვერის პრივილეგიის არასწორი ტიპი: %s" + +#: 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: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:1086 +#, c-format +msgid "default privileges cannot be set for columns" +msgstr "სვეტებისთვის ნაგულისხმევი პრივილეგიების დაყენება შეუძლებელია" + +#: catalog/aclchk.c:1246 +#, c-format +msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" +msgstr "'IN SCHEMA' პირობის გამოყენება GRANT/REVOKE ON SCHEMAS-ის გამოყენებისას შეუძლებელია" + +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 commands/tablecmds.c:7477 commands/tablecmds.c:7551 commands/tablecmds.c:7621 commands/tablecmds.c:7733 commands/tablecmds.c:7827 commands/tablecmds.c:7886 commands/tablecmds.c:7975 commands/tablecmds.c:8005 commands/tablecmds.c:8133 +#: commands/tablecmds.c:8215 commands/tablecmds.c:8371 commands/tablecmds.c:8489 commands/tablecmds.c:12218 commands/tablecmds.c:12399 commands/tablecmds.c:12559 commands/tablecmds.c:13723 commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2468 parser/parse_relation.c:725 parser/parse_target.c:1063 parser/parse_type.c:144 parser/parse_utilcmd.c:3435 parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "სვეტი \"%s\" ურთიერთობაში %s არ არსებობს" + +#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 commands/tablecmds.c:253 commands/tablecmds.c:17156 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:1888 +#, c-format +msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" +msgstr "მიმდევრობა \"%s\"-ს მხოლოდ USAGE, SELECT და UPDATE პრივილეგიების მხარდაჭერა გააჩნიათ" + +#: catalog/aclchk.c:1905 +#, c-format +msgid "invalid privilege type %s for table" +msgstr "ცხრილის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:2071 +#, c-format +msgid "invalid privilege type %s for column" +msgstr "სვეტის პრივილეგიის არასწორი ტიპი: %s" + +#: catalog/aclchk.c:2084 +#, c-format +msgid "sequence \"%s\" only supports SELECT column privileges" +msgstr "მიმდევრობა \"%s\"-ს მხოლოდ SELECT სვეტის პრივილეგიების მხარდაჭერა გააჩნია" + +#: catalog/aclchk.c:2666 +#, c-format +msgid "language \"%s\" is not trusted" +msgstr "ენა \"%s\" სანდო არაა" + +#: 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:3182 +#, c-format +msgid "cannot set privileges of array types" +msgstr "მასივის ტიპების პრივილეგიის დაყენება შეუძლებელია" + +#: catalog/aclchk.c:3183 +#, c-format +msgid "Set the privileges of the element type instead." +msgstr "ნაცვლად დააყენეთ ელემენტის ტიპის პრივილეგიები." + +#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 +#, c-format +msgid "\"%s\" is not a domain" +msgstr "\"%s\" დომენი არაა" + +#: catalog/aclchk.c:3462 +#, c-format +msgid "unrecognized privilege type \"%s\"" +msgstr "პრივილეგიის უცნობი ტიპი \"%s\"" + +#: catalog/aclchk.c:3527 +#, c-format +msgid "permission denied for aggregate %s" +msgstr "წვდომა აკრძალულია აგრეგატზე: \"%s\"" + +#: catalog/aclchk.c:3530 +#, c-format +msgid "permission denied for collation %s" +msgstr "წვდომა აკრძალულია კოლაციაზე: \"%s\"" + +#: catalog/aclchk.c:3533 +#, c-format +msgid "permission denied for column %s" +msgstr "წვდომა აკრძალულია სვეტზე: \"%s\"" + +#: catalog/aclchk.c:3536 +#, c-format +msgid "permission denied for conversion %s" +msgstr "წვდომა აკრძალულია გადაყვანაზე: \"%s\"" + +#: catalog/aclchk.c:3539 +#, c-format +msgid "permission denied for database %s" +msgstr "წვდომა აკრძალულია აგრეგატზე: \"%s\"" + +#: catalog/aclchk.c:3542 +#, c-format +msgid "permission denied for domain %s" +msgstr "წვდომა აკრძალულია დომენზე: \"%s\"" + +#: catalog/aclchk.c:3545 +#, c-format +msgid "permission denied for event trigger %s" +msgstr "წვდომა აკრძალულია მოვლენის ტრიგერზე: \"%s\"" + +#: catalog/aclchk.c:3548 +#, c-format +msgid "permission denied for extension %s" +msgstr "წვდომა აკრძალულია გაფართოებაზე: \"%s\"" + +#: catalog/aclchk.c:3551 +#, c-format +msgid "permission denied for foreign-data wrapper %s" +msgstr "წვდომა აკრძალულია გარე მონაცემების გადამტანზე: \"%s\"" + +#: catalog/aclchk.c:3554 +#, c-format +msgid "permission denied for foreign server %s" +msgstr "წვდომა აკრძალულია გარე სერვერზე: \"%s\"" + +#: catalog/aclchk.c:3557 +#, c-format +msgid "permission denied for foreign table %s" +msgstr "წვდომა აკრძალულია გარე ცხრილზე: \"%s\"" + +#: catalog/aclchk.c:3560 +#, c-format +msgid "permission denied for function %s" +msgstr "წვდომა აკრძალულია ფუნქციაზე: \"%s\"" + +#: catalog/aclchk.c:3563 +#, c-format +msgid "permission denied for index %s" +msgstr "წვდომა აკრძალულია ინდექზე: \"%s\"" + +#: catalog/aclchk.c:3566 +#, c-format +msgid "permission denied for language %s" +msgstr "წვდომა აკრძალულია ენაზე: \"%s\"" + +#: catalog/aclchk.c:3569 +#, c-format +msgid "permission denied for large object %s" +msgstr "წვდომა აკრძალულია დიდ ობიექტზე: \"%s\"" + +#: catalog/aclchk.c:3572 +#, c-format +msgid "permission denied for materialized view %s" +msgstr "წვდომა აკრძალულია მატერიალიზებულ ხედზე: \"%s\"" + +#: catalog/aclchk.c:3575 +#, c-format +msgid "permission denied for operator class %s" +msgstr "წვდომა აკრძალულია ოპერატორის კლასზე: \"%s\"" + +#: catalog/aclchk.c:3578 +#, c-format +msgid "permission denied for operator %s" +msgstr "წვდომა აკრძალულია ოპერატორზე: \"%s\"" + +#: catalog/aclchk.c:3581 +#, c-format +msgid "permission denied for operator family %s" +msgstr "წვდომა აკრძალულია ოპერატორის ოჯახზე: \"%s\"" + +#: 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:3590 +#, c-format +msgid "permission denied for procedure %s" +msgstr "წვდომა აკრძალულია პროცედურაზე: \"%s\"" + +#: catalog/aclchk.c:3593 +#, c-format +msgid "permission denied for publication %s" +msgstr "წვდომა აკრძალულია პუბლიკაციაზე: \"%s\"" + +#: catalog/aclchk.c:3596 +#, c-format +msgid "permission denied for routine %s" +msgstr "წვდომა აკრძალულია ქვეპროგრამაზე: \"%s\"" + +#: catalog/aclchk.c:3599 +#, c-format +msgid "permission denied for schema %s" +msgstr "წვდომა აკრძალულია სქემაზე: \"%s\"" + +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 commands/sequence.c:1825 +#, c-format +msgid "permission denied for sequence %s" +msgstr "წვდომა აკრძალულია მიმდევრობაზე: \"%s\"" + +#: catalog/aclchk.c:3605 +#, c-format +msgid "permission denied for statistics object %s" +msgstr "წვდომა აკრძალულია სტატისტიკის ობიექტზე: \"%s\"" + +#: catalog/aclchk.c:3608 +#, c-format +msgid "permission denied for subscription %s" +msgstr "წვდომა აკრძალულია გამოწერაზე: \"%s\"" + +#: catalog/aclchk.c:3611 +#, c-format +msgid "permission denied for table %s" +msgstr "წვდომა აკრძალულია ცხრილზე: \"%s\"" + +#: catalog/aclchk.c:3614 +#, c-format +msgid "permission denied for tablespace %s" +msgstr "წვდომა აკრძალულია ცხრილების სივრცეზე: \"%s\"" + +#: catalog/aclchk.c:3617 +#, c-format +msgid "permission denied for text search configuration %s" +msgstr "წვდომა აკრძალულია ტექსტის ძებნის კონფიგურაციაზე: \"%s\"" + +#: catalog/aclchk.c:3620 +#, c-format +msgid "permission denied for text search dictionary %s" +msgstr "წვდომა აკრძალულია ტექსტის ძებნის ლექსიკონზე: \"%s\"" + +#: catalog/aclchk.c:3623 +#, c-format +msgid "permission denied for type %s" +msgstr "წვდომა აკრძალულია ტიპტზე: \"%s\"" + +#: catalog/aclchk.c:3626 +#, c-format +msgid "permission denied for view %s" +msgstr "წვდომა აკრძალულია ხედზე: \"%s\"" + +#: catalog/aclchk.c:3662 +#, c-format +msgid "must be owner of aggregate %s" +msgstr "უნდა ბრძანდებოდეთ აგრეგატის მფლობელი: %s" + +#: catalog/aclchk.c:3665 +#, c-format +msgid "must be owner of collation %s" +msgstr "უნდა ბრძანდებოდეთ კოლაციის მფლობელი: %s" + +#: catalog/aclchk.c:3668 +#, c-format +msgid "must be owner of conversion %s" +msgstr "უნდა ბრძანდებოდეთ გადაყვანის მფლობელი: %s" + +#: catalog/aclchk.c:3671 +#, c-format +msgid "must be owner of database %s" +msgstr "უნდა ბრძანდებოდეთ ბაზის მფლობელი: %s" + +#: catalog/aclchk.c:3674 +#, c-format +msgid "must be owner of domain %s" +msgstr "უნდა ბრძანდებოდეთ დომენის მფლობელი: %s" + +#: catalog/aclchk.c:3677 +#, c-format +msgid "must be owner of event trigger %s" +msgstr "უნდა ბრძანდებოდეთ მოვლენის ტრიგერის მფლობელი: %s" + +#: catalog/aclchk.c:3680 +#, c-format +msgid "must be owner of extension %s" +msgstr "უნდა ბრძანდებოდეთ გაფართოების მფლობელი: %s" + +#: catalog/aclchk.c:3683 +#, c-format +msgid "must be owner of foreign-data wrapper %s" +msgstr "უნდა ბრძანდებოდეთ გარე ინფორმაციის გადამტანის მფლობელი: %s" + +#: catalog/aclchk.c:3686 +#, c-format +msgid "must be owner of foreign server %s" +msgstr "უნდა ბრძანდებოდეთ გარე სერვერის მფლობელი: %s" + +#: catalog/aclchk.c:3689 +#, c-format +msgid "must be owner of foreign table %s" +msgstr "უნდა ბრძანდებოდეთ გარე ცხრილის მფლობელი: %s" + +#: catalog/aclchk.c:3692 +#, c-format +msgid "must be owner of function %s" +msgstr "უნდა ბრძანდებოდეთ ფუნქციის მფლობელი: %s" + +#: catalog/aclchk.c:3695 +#, c-format +msgid "must be owner of index %s" +msgstr "უნდა ბრძანდებოდეთ ინდექსის მფლობელი: %s" + +#: catalog/aclchk.c:3698 +#, c-format +msgid "must be owner of language %s" +msgstr "უნდა ბრძანდებოდეთ ენის მფლობელი: %s" + +#: catalog/aclchk.c:3701 +#, c-format +msgid "must be owner of large object %s" +msgstr "უნდა ბრძანდებოდეთ დიდი ობიექტის მფლობელი: %s" + +#: catalog/aclchk.c:3704 +#, c-format +msgid "must be owner of materialized view %s" +msgstr "უნდა ბრძანდებოდეთ მატერიალიზებული ხედის მფლობელი: %s" + +#: catalog/aclchk.c:3707 +#, c-format +msgid "must be owner of operator class %s" +msgstr "უნდა ბრძანდებოდეთ ოპერატორის კლასის მფლობელი: %s" + +#: catalog/aclchk.c:3710 +#, c-format +msgid "must be owner of operator %s" +msgstr "უნდა ბრძანდებოდეთ ოპერატორის მფლობელი: %s" + +#: catalog/aclchk.c:3713 +#, c-format +msgid "must be owner of operator family %s" +msgstr "უნდა ბრძანდებოდეთ ოპერატორის ოჯახის მფლობელი: %s" + +#: catalog/aclchk.c:3716 +#, c-format +msgid "must be owner of procedure %s" +msgstr "უნდა ბრძანდებოდეთ პროცედურის მფლობელი: %s" + +#: catalog/aclchk.c:3719 +#, c-format +msgid "must be owner of publication %s" +msgstr "უნდა ბრძანდებოდეთ გამოცემისმფლობელი: %s" + +#: catalog/aclchk.c:3722 +#, c-format +msgid "must be owner of routine %s" +msgstr "უნდა ბრძანდებოდეთ ქვეპროგრამის მფლობელი: %s" + +#: catalog/aclchk.c:3725 +#, c-format +msgid "must be owner of sequence %s" +msgstr "უნდა ბრძანდებოდეთ მიმდევრობის მფლობელი: %s" + +#: catalog/aclchk.c:3728 +#, c-format +msgid "must be owner of subscription %s" +msgstr "უნდა ბრძანდებოდეთ გამოწერის მფლობელი: %s" + +#: catalog/aclchk.c:3731 +#, c-format +msgid "must be owner of table %s" +msgstr "უნდა ბრძანდებოდეთ ცხრილის მფლობელი: %s" + +#: catalog/aclchk.c:3734 +#, c-format +msgid "must be owner of type %s" +msgstr "უნდა ბრძანდებოდეთ ტიპის მფლობელი: %s" + +#: catalog/aclchk.c:3737 +#, c-format +msgid "must be owner of view %s" +msgstr "უნდა ბრძანდებოდეთ ხედის მფლობელი: %s" + +#: catalog/aclchk.c:3740 +#, c-format +msgid "must be owner of schema %s" +msgstr "უნდა ბრძანდებოდეთ სქემის მფლობელი: %s" + +#: catalog/aclchk.c:3743 +#, c-format +msgid "must be owner of statistics object %s" +msgstr "უნდა ბრძანდებოდეთ სტატისტიკის ობიექტის მფლობელი: %s" + +#: catalog/aclchk.c:3746 +#, c-format +msgid "must be owner of tablespace %s" +msgstr "უნდა ბრძანდებოდეთ ცხრილების სივრცის მფლობელი: %s" + +#: catalog/aclchk.c:3749 +#, c-format +msgid "must be owner of text search configuration %s" +msgstr "უნდა ბრძანდებოდეთ ტექსტის ძებნის კონფიგურაციის მფლობელი: %s" + +#: catalog/aclchk.c:3752 +#, c-format +msgid "must be owner of text search dictionary %s" +msgstr "უნდა ბრძანდებოდეთ ტექსტის ძებნის ლექსიკონის მფლობელი: %s" + +#: catalog/aclchk.c:3766 +#, c-format +msgid "must be owner of relation %s" +msgstr "უნდა ბრძანდებოდეთ ურთიერთობის მფლობელი: %s" + +#: catalog/aclchk.c:3812 +#, c-format +msgid "permission denied for column \"%s\" of relation \"%s\"" +msgstr "რელაციის (%2$s) სვეტზე (%1$s) წვდომა აკრძალულია" + +#: 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:4071 catalog/aclchk.c:5184 +#, c-format +msgid "relation with OID %u does not exist" +msgstr "ურთიერთობა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 +#, c-format +msgid "database with OID %u does not exist" +msgstr "ბაზა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:4299 +#, c-format +msgid "parameter ACL with OID %u does not exist" +msgstr "პარამეტრის ACL OID-ით %u არ არსებობს" + +#: 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 "ფუნქცია OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 +#, c-format +msgid "language with OID %u does not exist" +msgstr "ენა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 commands/publicationcmds.c:1745 +#, c-format +msgid "schema with OID %u does not exist" +msgstr "სქემა OID-ით %u არ არსებობს" + +#: 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: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: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: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:5236 +#, c-format +msgid "operator with OID %u does not exist" +msgstr "ოპერატორი OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5413 +#, c-format +msgid "operator class with OID %u does not exist" +msgstr "ოპერატორის კლასი OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5440 +#, c-format +msgid "operator family with OID %u does not exist" +msgstr "ოპერატორის ოჯახი OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5467 +#, c-format +msgid "text search dictionary with OID %u does not exist" +msgstr "ტექსტის ძებნის ლექსიკონი OID-ით \"%u\" არ არსებობს" + +#: catalog/aclchk.c:5494 +#, c-format +msgid "text search configuration with OID %u does not exist" +msgstr "ტექსტის ძებნის კონფიგურაცია OID-ით \"%u\" არ არსებობს" + +#: 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:5628 commands/collationcmds.c:439 +#, c-format +msgid "collation with OID %u does not exist" +msgstr "კოლაცია OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5654 +#, c-format +msgid "conversion with OID %u does not exist" +msgstr "გადაყვანა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5695 +#, c-format +msgid "extension with OID %u does not exist" +msgstr "გაფართოება OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 +#, c-format +msgid "publication with OID %u does not exist" +msgstr "გამოცემა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "გამოწერა OID-ით %u არ არსებობს" + +#: catalog/aclchk.c:5774 +#, c-format +msgid "statistics object with OID %u does not exist" +msgstr "სტატისტიკის ობიექტი OID-ით %u არ არსებობს" + +#: 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 "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-ი ნაპოვნი არაა." + +#: 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] "ახალი OID მინიჭებულია ურთიერთობაში \"%s\" %llu ცდის შემდეგ" +msgstr[1] "ახალი OID მინიჭებულია ურთიერთობაში \"%s\" %llu ცდის შემდეგ" + +#: 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:619 parser/parse_utilcmd.c:2280 +#, c-format +msgid "index \"%s\" does not belong to table \"%s\"" +msgstr "ინდექსი %s ცხრილს \"%s\" არ მიეკუთვნება" + +#: catalog/catalog.c:636 +#, c-format +msgid "column \"%s\" is not of type oid" +msgstr "სვეტი \"%s\" oild-ის ტიპი არაა" + +#: catalog/catalog.c:643 +#, c-format +msgid "index \"%s\" is not the index for column \"%s\"" +msgstr "ინდექსი \"%s\" სვეტის \"%s\" ინდექსი არაა" + +#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "%s-ის წაშლა შეუძლებელია. საჭიროა ბაზის სისტემისთვის" + +#: catalog/dependency.c:830 catalog/dependency.c:1057 +#, c-format +msgid "cannot drop %s because %s requires it" +msgstr "%s-ის წაშლა შეუძლებელია. ის %s-ს სჭირდება" + +#: catalog/dependency.c:832 catalog/dependency.c:1059 +#, c-format +msgid "You can drop %s instead." +msgstr "სამაგიეროდ შეგიძლიათ %s წაშალოთ." + +#: catalog/dependency.c:1138 catalog/dependency.c:1147 +#, c-format +msgid "%s depends on %s" +msgstr "%s დამოკიდებულია %s -ზე" + +#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#, c-format +msgid "drop cascades to %s" +msgstr "წაშლა %s-ზეც ვრცელდება" + +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 +#, c-format +msgid "" +"\n" +"and %d other object (see server log for list)" +msgid_plural "" +"\n" +"and %d other objects (see server log for list)" +msgstr[0] "" +"\n" +"და %d სხვა ობიექტი (სიისთვის იხილეთ სერვერს ჟურნალი)" +msgstr[1] "" +"\n" +"და %d სხვა ობიექტი (სიისთვის იხილეთ სერვერს ჟურნალი)" + +#: catalog/dependency.c:1191 +#, c-format +msgid "cannot drop %s because other objects depend on it" +msgstr "%s-ის წაშლა შეუძლებელია, რადგან არის ობიექტები, რომლებიც მას ეყრდნობა" + +#: catalog/dependency.c:1194 catalog/dependency.c:1201 catalog/dependency.c:1212 commands/tablecmds.c:1328 commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11865 utils/misc/guc.c:11899 utils/misc/guc.c:11933 utils/misc/guc.c:11976 +#: utils/misc/guc.c:12018 +#, c-format +msgid "%s" +msgstr "%s" + +#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#, c-format +msgid "Use DROP ... CASCADE to drop the dependent objects too." +msgstr "თუ გნებავთ, წაშალოთ დამოკიდებული ობიექტებიც, გამოიყენეთ DROP ... CASCADE ." + +#: catalog/dependency.c:1199 +#, c-format +msgid "cannot drop desired object(s) because other objects depend on them" +msgstr "სასურველი ობიექტის წაშლა შეუძლებელია, სანამ არსებობს ობიექტები, რომლებიც მას ეყრდნობიან" + +#: catalog/dependency.c:1207 +#, 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:1889 +#, c-format +msgid "constant of the type %s cannot be used here" +msgstr "%s ტიპის კონსტანტის აქ გამოყენება არ შეიძლება" + +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "სვეტი \"%d\" ურთიერთობაში %s არ არსებობს" + +#: catalog/heap.c:324 +#, c-format +msgid "permission denied to create \"%s.%s\"" +msgstr "\"%s.%s\"-ის შექმნის წვდომა აკრძალულია" + +#: catalog/heap.c:326 +#, c-format +msgid "System catalog modifications are currently disallowed." +msgstr "სისტემური კატალოგების შეცვლა ამჟამად აკრძალულია." + +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 commands/tablecmds.c:6861 +#, c-format +msgid "tables can have at most %d columns" +msgstr "ცხრილებს მაქსიმუმ %d სვეტი შეიძლება ჰქონდეს" + +#: catalog/heap.c:484 commands/tablecmds.c:7161 +#, c-format +msgid "column name \"%s\" conflicts with a system column name" +msgstr "სვეტის სახელი კონფლიქტშია სისტემური სვეტის სახელთან: \"%s\"" + +#: catalog/heap.c:500 +#, c-format +msgid "column name \"%s\" specified more than once" +msgstr "სვეტის სახელი ერთზე მეტჯერაა მითითებული: %s" + +#. translator: first %s is an integer not a name +#: catalog/heap.c:575 +#, c-format +msgid "partition key column %s has pseudo-type %s" +msgstr "დანაყოფის საკვანძო სვეტის %s ფსევდო ტიპია %s" + +#: catalog/heap.c:580 +#, c-format +msgid "column \"%s\" has pseudo-type %s" +msgstr "სვეტს \"%s\" გააჩნია ფსევდო ტიპი \"%s\"" + +#: catalog/heap.c:611 +#, 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:666 +#, c-format +msgid "no collation was derived for partition key column %s with collatable type %s" +msgstr "" + +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#, c-format +msgid "no collation was derived for column \"%s\" with collatable type %s" +msgstr "" + +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 commands/tablecmds.c:3890 +#, c-format +msgid "relation \"%s\" already exists" +msgstr "ურთიერთობა \"%s\" უკვე არსებობს" + +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 catalog/pg_type.c:931 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:1165 +#, 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:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "" + +#: catalog/heap.c:1216 +#, c-format +msgid "pg_class heap OID value not set when in binary upgrade mode" +msgstr "ბინარული განახლების რეჟიმში pg_class-ის დროებითი მეხსიერების OID-ის მნიშვნელობა დაყენებული არაა" + +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "" + +#: catalog/heap.c:2127 +#, c-format +msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" +msgstr "დაყოფილი ცხრილს (\"%s\") NO INHERIT შეზღუდვას ვერ დაამატებთ" + +#: catalog/heap.c:2401 +#, c-format +msgid "check constraint \"%s\" already exists" +msgstr "შეზღუდვის შემმოწმებელი \"%s\" უკვე არსებობს" + +#: catalog/heap.c:2571 catalog/index.c:889 catalog/pg_constraint.c:689 commands/tablecmds.c:8863 +#, c-format +msgid "constraint \"%s\" for relation \"%s\" already exists" +msgstr "შეზღუდვა \"%s\" ურთიერთობისთვის \"%s\" უკვე არსებობს" + +#: catalog/heap.c:2578 +#, c-format +msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" +msgstr "შეზღუდვა \"%s\" კონფლიქტშია არა-მემკვიდრეობით მიღებულ შეზღუდვასთან ურთიერთობაზე \"%s\"" + +#: catalog/heap.c:2589 +#, c-format +msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" +msgstr "შეზღუდვა \"%s\" კონფლიქტშია მემკვიდრეობით მიღებულ შეზღუდვასთან ურთიერთობაზე \"%s\"" + +#: catalog/heap.c:2599 +#, c-format +msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" +msgstr "შეზღუდვა \"%s\" კონფლიქტშია შეზღუდვასთან NOT VALID ურთიერთობაზე \"%s\"" + +#: catalog/heap.c:2604 +#, c-format +msgid "merging constraint \"%s\" with inherited definition" +msgstr "შეზღუდვის (\"%s\") შერწყმა მემკვიდრეობითი აღწერით" + +#: catalog/heap.c:2709 +#, c-format +msgid "cannot use generated column \"%s\" in column generation expression" +msgstr "სვეტის გენერაციის გამოსახულებაში გენერირებული სვეტის (%s) გამოყენება შეუძლებელია" + +#: catalog/heap.c:2711 +#, c-format +msgid "A generated column cannot reference another generated column." +msgstr "გენერირებული სვეტი სხვა გენერირებული სვეტის მიმართვა ვერ იქნება." + +#: catalog/heap.c:2717 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "" + +#: catalog/heap.c:2718 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "ამან შეიძლება დაგენერირებული სვეტის თავის საკუთარ მნიშვნელობაზე დამოკიდებულება გამოიწვიოს." + +#: catalog/heap.c:2771 +#, c-format +msgid "generation expression is not immutable" +msgstr "თაობის გამოსახულება უცვლელი არაა" + +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1290 +#, c-format +msgid "column \"%s\" is of type %s but default expression is of type %s" +msgstr "სვეტის \"%s\" ტიპია %s, მაგრამ ნაგულისხმევი გამოსახულების ტიპია %s" + +#: 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:1295 +#, c-format +msgid "You will need to rewrite or cast the expression." +msgstr "საჭიროა გამოსახულების გარდაქმნა ან გადაყვანა." + +#: catalog/heap.c:2851 +#, c-format +msgid "only table \"%s\" can be referenced in check constraint" +msgstr "შემოწმების შეზღუდვაში მხოლოდ %s ცხრილზე მიმართვა შეიძლება" + +#: catalog/heap.c:3149 +#, c-format +msgid "unsupported ON COMMIT and foreign key combination" +msgstr "\"ON COMMIT\"-ისა და გარე გასაღების წყვილი მხარდაუჭერელია" + +#: catalog/heap.c:3150 +#, 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:3155 +#, c-format +msgid "cannot truncate a table referenced in a foreign key constraint" +msgstr "გარე გასაღების შეზღუდვაში მიმართული ცხრილის შემცველობის დაცარიელება შეუძლებელია" + +#: catalog/heap.c:3156 +#, c-format +msgid "Table \"%s\" references \"%s\"." +msgstr "ცხრილი \"%s\" მიუთითებს \"%s\"." + +#: catalog/heap.c:3158 +#, c-format +msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." +msgstr "წაშალეთ შემცველობა ცხრილისთვის \"%s\" პარალელურად, ან გამოიყენეთ TRUNCATE ... CASCADE." + +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 +#, c-format +msgid "multiple primary keys for table \"%s\" are not allowed" +msgstr "ცხრილისთვის \"%s\" ერთზე მეტი ძირითადი გასაღები დაუშვებელია" + +#: catalog/index.c:242 +#, c-format +msgid "primary keys cannot be expressions" +msgstr "ძირითადი გასაღები გამოსახულება არ შეიძლება იყოს" + +#: catalog/index.c:259 +#, c-format +msgid "primary key column \"%s\" is not marked NOT NULL" +msgstr "ძირითადის გასაღების ტიპის სვეტი \"%s\" არაა აღწერილი, როგორც NOT NULL" + +#: catalog/index.c:774 catalog/index.c:1933 +#, c-format +msgid "user-defined indexes on system catalog tables are not supported" +msgstr "სისტემური კატალოგების ცხრილებზე მომხმარებლის მიერ აღწერილი ინდექსების დადება შეუძლებელია" + +#: catalog/index.c:814 +#, c-format +msgid "nondeterministic collations are not supported for operator class \"%s\"" +msgstr "არადეტერმინისტული კოლაციები ოპერატორის კლასისთვის \"%s\" მხარდაჭერილი არაა" + +#: catalog/index.c:829 +#, c-format +msgid "concurrent index creation on system catalog tables is not supported" +msgstr "სისტემური კატალოგების ცხრილებზე ინდექსების პარალელური შექმნა მხარდაუჭერელია" + +#: catalog/index.c:838 catalog/index.c:1306 +#, c-format +msgid "concurrent index creation for exclusion constraints is not supported" +msgstr "პარალელური ინდექსის შექმნა გამორიცხვის შეზღუდვებისთვის მხარდაჭერილი არაა" + +#: catalog/index.c:847 +#, c-format +msgid "shared indexes cannot be created after initdb" +msgstr "გაზიარებული ინდექსების შექმნა შეუძლებელია initdb-ის შემდეგ" + +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 parser/parse_utilcmd.c:209 +#, c-format +msgid "relation \"%s\" already exists, skipping" +msgstr "შეერთება \"%s\" უკვე არსებობს, გამოტოვება" + +#: catalog/index.c:917 +#, c-format +msgid "pg_class index OID value not set when in binary upgrade mode" +msgstr "ბინარული განახლების რეჟიმში pg_class-ის ინდექსის OID-ის მნიშვნელობა დაყენებული არაა" + +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "" + +#: catalog/index.c:2232 +#, c-format +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLY ტრანზაქციის პირველი ქმედება უნდა იყოს" + +#: catalog/index.c:3637 +#, c-format +msgid "cannot reindex temporary tables of other sessions" +msgstr "სხვა სესიების დროებითი ცხრილების რეინდექსი შეუძლებელია" + +#: catalog/index.c:3648 commands/indexcmds.c:3560 +#, c-format +msgid "cannot reindex invalid index on TOAST table" +msgstr "\"TOAST\" ცხრილზე არასწორი ინდექსის რეინდექსი შეუძლებელია" + +#: catalog/index.c:3664 commands/indexcmds.c:3440 commands/indexcmds.c:3584 commands/tablecmds.c:3305 +#, c-format +msgid "cannot move system relation \"%s\"" +msgstr "სისტემური ურთიერთობის გაადაადგილება არ შეიძლება: \"%s\"" + +#: catalog/index.c:3808 +#, c-format +msgid "index \"%s\" was reindexed" +msgstr "\"%s\"-ის რეინდექსი დასრულდა" + +#: catalog/index.c:3945 +#, c-format +msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" +msgstr "'TOAST' ცხრილზე მდებარე არასწორი ინდექსის \"%s.%s\" რეინდექსი შეუძლებელია. გამოტოვება" + +#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 commands/trigger.c:5812 +#, c-format +msgid "cross-database references are not implemented: \"%s.%s.%s\"" +msgstr "ბაზებს შორის ბმულები განხორციელებული არაა: \"%s.%s.%s\"" + +#: catalog/namespace.c:316 +#, c-format +msgid "temporary tables cannot specify a schema name" +msgstr "დროებით ცხრილებს სქემის სახელი არ მიეთითებათ" + +#: catalog/namespace.c:397 +#, c-format +msgid "could not obtain lock on relation \"%s.%s\"" +msgstr "ბლოკის მიღების შეცდომა ურთიერთობაზე %s.%s\"" + +#: 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:430 parser/parse_relation.c:1373 +#, c-format +msgid "relation \"%s.%s\" does not exist" +msgstr "ურთიერთობა \"%s.%s\" არ არსებობს" + +#: 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:501 catalog/namespace.c:3076 commands/extension.c:1556 commands/extension.c:1562 +#, c-format +msgid "no schema has been selected to create in" +msgstr "შიგნით შესაქმნელი სქემა მონიშნული არაა" + +#: catalog/namespace.c:653 catalog/namespace.c:666 +#, c-format +msgid "cannot create relations in temporary schemas of other sessions" +msgstr "სხვა სესიების დროებით სქემებთან ურთიერთობის შექმნა შეუძლებელია" + +#: catalog/namespace.c:657 +#, c-format +msgid "cannot create temporary relation in non-temporary schema" +msgstr "დროებითი ურთიერთობების შექმნა არა-დროებით სქემაში შეუძლებელია" + +#: catalog/namespace.c:672 +#, c-format +msgid "only temporary relations may be created in temporary schemas" +msgstr "დროებით სქემებში მხოლოდ დროებითი ურთიერთობების შექმნა შეიძლება" + +#: catalog/namespace.c:2268 +#, c-format +msgid "statistics object \"%s\" does not exist" +msgstr "სტატისტიკის ობიექტი \"%s\" არ არსებობს" + +#: catalog/namespace.c:2391 +#, c-format +msgid "text search parser \"%s\" does not exist" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\" არ არსებობს" + +#: catalog/namespace.c:2517 +#, c-format +msgid "text search dictionary \"%s\" does not exist" +msgstr "ტექსტის ძებნის ლექსიკონი \"%s\" არ არსებობს" + +#: catalog/namespace.c:2644 +#, c-format +msgid "text search template \"%s\" does not exist" +msgstr "ტექსტის ძებნის შაბლონი \"%s\" არ არსებობს" + +#: 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:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "ბაზებს შორის ბმულები განხორციელებული არაა: %s" + +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 parser/parse_target.c:1262 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "არასწორი სრული სახელი (ძალიან ბევრი წერტილიანი სახელი): %s" + +#: catalog/namespace.c:3019 +#, c-format +msgid "cannot move objects into or out of temporary schemas" +msgstr "ობიექტის დროებითი სქემიდან გამოტანა ან სქემაში შეტანა შეუძლებელია" + +#: catalog/namespace.c:3025 +#, c-format +msgid "cannot move objects into or out of TOAST schema" +msgstr "\"TOAST\" სქემიდან ობიექტს ვერც გამოიტანთ, ვერც შეიტანთ" + +#: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 commands/tablecmds.c:1273 +#, c-format +msgid "schema \"%s\" does not exist" +msgstr "სქემა \"%s\" არ არსებობს" + +#: catalog/namespace.c:3129 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "ურთიერთობის არასწორი სახელი (ძალიან ბევრი წერტილიანი სახელი): %s" + +#: catalog/namespace.c:3696 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" does not exist" +msgstr "კოლაცია \"%s\" კოდირებისთვის \"%s\" არ არსებობს" + +#: catalog/namespace.c:3751 +#, c-format +msgid "conversion \"%s\" does not exist" +msgstr "გადაყვანა \"%s\" არ არსებობს" + +#: catalog/namespace.c:4015 +#, c-format +msgid "permission denied to create temporary tables in database \"%s\"" +msgstr "ბაზაში \"%s\" დროებითი ცხრილების შექმნის წვდომა აკრძალულია" + +#: catalog/namespace.c:4031 +#, c-format +msgid "cannot create temporary tables during recovery" +msgstr "აღდგენისას დროებითი ცხრილების შექმნა შეუძლებელია" + +#: catalog/namespace.c:4037 +#, c-format +msgid "cannot create temporary tables during a parallel operation" +msgstr "პარალელური ოპერაციის მიმდინარეობისას დროებითი ცხრილების შექმნა შეუძლებელია" + +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 utils/misc/guc.c:12050 utils/misc/guc.c:12152 +#, c-format +msgid "List syntax is invalid." +msgstr "სია სინტაქსი არასწორია." + +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 commands/tablecmds.c:12335 +#, c-format +msgid "\"%s\" is not a table" +msgstr "\"%s\" ცხრილი არაა" + +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 commands/tablecmds.c:17161 commands/view.c:119 +#, c-format +msgid "\"%s\" is not a view" +msgstr "\"%s\" ხედი არაა" + +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 commands/tablecmds.c:17166 +#, c-format +msgid "\"%s\" is not a materialized view" +msgstr "\"%s\" არ არის მატერიალიზებული ხედი" + +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 commands/tablecmds.c:17171 +#, c-format +msgid "\"%s\" is not a foreign table" +msgstr "\"%s\" გარე ცხრილი არაა" + +#: catalog/objectaddress.c:1453 +#, c-format +msgid "must specify relation and object name" +msgstr "ურთიერთობის და ობიექტის სახელის მითითება აუცილებელია" + +#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 +#, c-format +msgid "column name must be qualified" +msgstr "სვეტს სახელი სრულად უნდა მიუთითოთ" + +#: 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:1638 commands/functioncmds.c:138 commands/tablecmds.c:275 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:1757 +#, c-format +msgid "operator %d (%s, %s) of %s does not exist" +msgstr "ოპერატორი %d (%s, %s) %s-დან არ არსებობს" + +#: catalog/objectaddress.c:1788 +#, c-format +msgid "function %d (%s, %s) of %s does not exist" +msgstr "ფუნქცია %d (%s, %s) %s-დან არ არსებობს" + +#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 +#, c-format +msgid "user mapping for user \"%s\" on server \"%s\" does not exist" +msgstr "სერვერზე (%2$s) მომხმარებლის ბმა %1$s-სთვის არ არსებობს" + +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 +#, c-format +msgid "server \"%s\" does not exist" +msgstr "სერვერი \"%s\" არ არსებობს" + +#: catalog/objectaddress.c:1921 +#, c-format +msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgstr "გამოცემის ურთიერთობა %s გამოცემაში %s არ არსებობ" + +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "გამოცემის სქემა %s გამოცემაში %s არ არსებობს" + +#: catalog/objectaddress.c:2026 +#, c-format +msgid "unrecognized default ACL object type \"%c\"" +msgstr "ნაგულისხმევი ACL ობიექტის უცნობი ტიპი \"%c\"" + +#: 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:2078 +#, c-format +msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" +msgstr "ნაგულისხმევი ACL მომხმარებლისთვის %s სქემაში %s %s-ზე არ არსებობს" + +#: catalog/objectaddress.c:2083 +#, c-format +msgid "default ACL for user \"%s\" on %s does not exist" +msgstr "ნაგულისხმევი ACL მომხმარებლისთვის \"%s\" \"%s\"-ზე არ არსებობს" + +#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 catalog/objectaddress.c:2225 +#, c-format +msgid "name or argument lists may not contain nulls" +msgstr "სახელი ან არგუმენტი არ შეიძლება ნულოვან სიმბოლოს შეიცავდეს" + +#: catalog/objectaddress.c:2144 +#, c-format +msgid "unsupported object type \"%s\"" +msgstr "ობიექტის მხარდაუჭერელი ტიპი: \"%s\"" + +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 +#, c-format +msgid "name list length must be exactly %d" +msgstr "სახელების სიის სიგრძე ზუსტად %d უნდა იყოს" + +#: catalog/objectaddress.c:2186 +#, c-format +msgid "large object OID may not be null" +msgstr "დიდი ობიექტის OID ნულის ტოლი არ შეიძლება იყოს" + +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 catalog/objectaddress.c:2272 +#, c-format +msgid "name list length must be at least %d" +msgstr "სახელების სიის სიგრძე ყველაზე ცოტა %d უნდა იყოს" + +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 +#, c-format +msgid "argument list length must be exactly %d" +msgstr "არგუმენტების სიის სიგრძე ზუსტად %d უნდა იყოს" + +#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 +#, c-format +msgid "must be owner of large object %u" +msgstr "უნდა ბრძანდებოდეთ დიდი ობიექტის მფლობელი: %u" + +#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 +#, c-format +msgid "must be owner of type %s or type %s" +msgstr "უნდა ბრძანდებოდეთ მფლობელი ტიპისა %s ან %s" + +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 +#, c-format +msgid "must be superuser" +msgstr "უნდა იყოს ზემომხმარებელი" + +#: catalog/objectaddress.c:2605 +#, c-format +msgid "must have CREATEROLE privilege" +msgstr "უნდა გქონდეთ CREATEROLE პრივილეგია" + +#: catalog/objectaddress.c:2686 +#, c-format +msgid "unrecognized object type \"%s\"" +msgstr "ობიექტის უცნობი ტიპი: %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:2978 +#, c-format +msgid "column %s of %s" +msgstr "სვეტი %s %s-ზე" + +#: catalog/objectaddress.c:2993 +#, c-format +msgid "function %s" +msgstr "ფუნქცია %s" + +#: catalog/objectaddress.c:3006 +#, c-format +msgid "type %s" +msgstr "ტიპი %s" + +#: catalog/objectaddress.c:3043 +#, c-format +msgid "cast from %s to %s" +msgstr "%s-დან %s" + +#: catalog/objectaddress.c:3076 +#, c-format +msgid "collation %s" +msgstr "კოლაცია %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3107 +#, c-format +msgid "constraint %s on %s" +msgstr "%s-ის შეზღუდვა %s-ზე" + +#: catalog/objectaddress.c:3113 +#, c-format +msgid "constraint %s" +msgstr "შეზღუდვა %s" + +#: catalog/objectaddress.c:3145 +#, c-format +msgid "conversion %s" +msgstr "გარდაქმნა: %s" + +#. translator: %s is typically "column %s of table %s" +#: catalog/objectaddress.c:3167 +#, c-format +msgid "default value for %s" +msgstr "%s-ის ნაგულისხმევი მნიშვნელობა" + +#: catalog/objectaddress.c:3178 +#, c-format +msgid "language %s" +msgstr "ენა %s" + +#: catalog/objectaddress.c:3186 +#, c-format +msgid "large object %u" +msgstr "დიდი ობიექტი %u" + +#: catalog/objectaddress.c:3199 +#, c-format +msgid "operator %s" +msgstr "ოპერატორი %s" + +#: catalog/objectaddress.c:3236 +#, c-format +msgid "operator class %s for access method %s" +msgstr "ოპერატორის კლასის %s წვდომის მეთოდისთვის %s" + +#: catalog/objectaddress.c:3264 +#, c-format +msgid "access method %s" +msgstr "წვდომის მეთოდი: %s" + +#. translator: %d is the operator strategy (a number), the +#. 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:3313 +#, c-format +msgid "operator %d (%s, %s) of %s: %s" +msgstr "ოპერატორი %d (%s, %s) of %s: %s" + +#. translator: %d is the function number, the 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 +#. function with arguments. +#: catalog/objectaddress.c:3370 +#, c-format +msgid "function %d (%s, %s) of %s: %s" +msgstr "ფუნქცია %d (%s, %s) of %s: %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3422 +#, c-format +msgid "rule %s on %s" +msgstr "წესი %s %s-ზე" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3468 +#, c-format +msgid "trigger %s on %s" +msgstr "ტრიგერი %s %s-ზე" + +#: catalog/objectaddress.c:3488 +#, c-format +msgid "schema %s" +msgstr "სქემა %s" + +#: catalog/objectaddress.c:3516 +#, c-format +msgid "statistics object %s" +msgstr "სტატისტიკის ობიექტი %s" + +#: catalog/objectaddress.c:3547 +#, c-format +msgid "text search parser %s" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\"" + +#: catalog/objectaddress.c:3578 +#, c-format +msgid "text search dictionary %s" +msgstr "ტექსტის ძებნის ლექსიკონი %s" + +#: catalog/objectaddress.c:3609 +#, c-format +msgid "text search template %s" +msgstr "ტექსტის ძებნის შაბლონი %s" + +#: catalog/objectaddress.c:3640 +#, c-format +msgid "text search configuration %s" +msgstr "ტექსტის ძებნის კონფიგურაცია \"%s\"" + +#: catalog/objectaddress.c:3653 +#, c-format +msgid "role %s" +msgstr "როლი %s" + +#: catalog/objectaddress.c:3669 +#, c-format +msgid "database %s" +msgstr "ბაზა: %s" + +#: catalog/objectaddress.c:3685 +#, c-format +msgid "tablespace %s" +msgstr "ცხრილების სივრცე %s" + +#: catalog/objectaddress.c:3696 +#, c-format +msgid "foreign-data wrapper %s" +msgstr "გარე-მონაცემების გადამტანი %s" + +#: catalog/objectaddress.c:3706 +#, c-format +msgid "server %s" +msgstr "სერვერი %s" + +#: catalog/objectaddress.c:3739 +#, c-format +msgid "user mapping for %s on server %s" +msgstr "მომხმარებლის ბმა %s-სთვის სერვერზე %s" + +#: catalog/objectaddress.c:3791 +#, c-format +msgid "default privileges on new relations belonging to role %s in schema %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ ურთიერთობებზე, რომელიც ეკუთვნის როლს %s, სქემაში %s" + +#: catalog/objectaddress.c:3795 +#, c-format +msgid "default privileges on new relations belonging to role %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ ურთიერთობებზე, რომელიც ეკუთვნის როლს %s" + +#: catalog/objectaddress.c:3801 +#, c-format +msgid "default privileges on new sequences belonging to role %s in schema %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ მიმდევრობებზე, რომელიც ეკუთვნის როლს %s სქემაში %s" + +#: catalog/objectaddress.c:3805 +#, c-format +msgid "default privileges on new sequences belonging to role %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ მიმდევრობებზე, რომელიც ეკუთვნის როლს %s" + +#: catalog/objectaddress.c:3811 +#, c-format +msgid "default privileges on new functions belonging to role %s in schema %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ ფუნქციებზე, რომელიც ეკუთვნის როლს %s სქემაში %s" + +#: catalog/objectaddress.c:3815 +#, c-format +msgid "default privileges on new functions belonging to role %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ ფუნქციებზე, რომელიც ეკუთვნის როლს %s" + +#: catalog/objectaddress.c:3821 +#, c-format +msgid "default privileges on new types belonging to role %s in schema %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ სქემაზე, რომელიც ეკუთვნის როლს %s სქემაში %s" + +#: catalog/objectaddress.c:3825 +#, c-format +msgid "default privileges on new types belonging to role %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ ტიპებზე, რომელიც ეკუთვნის როლს %s" + +#: catalog/objectaddress.c:3831 +#, c-format +msgid "default privileges on new schemas belonging to role %s" +msgstr "ნაგულისხმევი პრივილეგიები ახალ სქემაზე, რომელიც ეკუთვნის როლს %s" + +#: catalog/objectaddress.c:3838 +#, c-format +msgid "default privileges belonging to role %s in schema %s" +msgstr "სქემაში (%s) როლის (%s) ნაგულისხმევი პრივილეგიები" + +#: catalog/objectaddress.c:3842 +#, c-format +msgid "default privileges belonging to role %s" +msgstr "როლის (%s) ნაგულისხმევი პრივილეგიები" + +#: catalog/objectaddress.c:3864 +#, c-format +msgid "extension %s" +msgstr "გაფართოებa %s" + +#: catalog/objectaddress.c:3881 +#, c-format +msgid "event trigger %s" +msgstr "მოვლენის ტრიგერი %s" + +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "პარამეტრი %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3951 +#, c-format +msgid "policy %s on %s" +msgstr "წესი %s %s-ზე" + +#: catalog/objectaddress.c:3965 +#, c-format +msgid "publication %s" +msgstr "პუბლიკაცია %s" + +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "სქემის (%s) გამოცემა გამოცემაში %s" + +#. translator: first %s is, e.g., "table %s" +#: catalog/objectaddress.c:4009 +#, c-format +msgid "publication of %s in publication %s" +msgstr "%s-ის გამოცემა გამოცემაში %s" + +#: catalog/objectaddress.c:4022 +#, c-format +msgid "subscription %s" +msgstr "გამოწერა %s" + +#: catalog/objectaddress.c:4043 +#, c-format +msgid "transform for %s language %s" +msgstr "გარდაქმნა %s-სთვის, ენისთვის %s" + +#: catalog/objectaddress.c:4114 +#, c-format +msgid "table %s" +msgstr "ცხრილი %s" + +#: catalog/objectaddress.c:4119 +#, c-format +msgid "index %s" +msgstr "ინდექსი %s" + +#: catalog/objectaddress.c:4123 +#, c-format +msgid "sequence %s" +msgstr "თანმიმდევრობა %s" + +#: catalog/objectaddress.c:4127 +#, c-format +msgid "toast table %s" +msgstr "toast ცხრილი \"%s\"" + +#: catalog/objectaddress.c:4131 +#, c-format +msgid "view %s" +msgstr "%s-ის ხედი" + +#: catalog/objectaddress.c:4135 +#, c-format +msgid "materialized view %s" +msgstr "მატერიალიზებული ხედი %s" + +#: catalog/objectaddress.c:4139 +#, c-format +msgid "composite type %s" +msgstr "კომპოზიტის ტიპი \"%s\"" + +#: catalog/objectaddress.c:4143 +#, c-format +msgid "foreign table %s" +msgstr "გარე ცხრილი \"%s\"" + +#: catalog/objectaddress.c:4148 +#, c-format +msgid "relation %s" +msgstr "ურთიერთობა %s" + +#: catalog/objectaddress.c:4189 +#, c-format +msgid "operator family %s for access method %s" +msgstr "ოპერატორის ოჯახი %s წვდომის მეთოდისთვის %s" + +#: 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:144 catalog/pg_aggregate.c:158 +#, c-format +msgid "cannot determine transition data type" +msgstr "მონაცემების გარდამავალი ტიპის განსაზღვრა შეუძლებელია" + +#: catalog/pg_aggregate.c:173 +#, c-format +msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" +msgstr "" + +#: 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: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: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:335 +#, c-format +msgid "return type of inverse transition function %s is not %s" +msgstr "ინვერსიული გარდამავალი ფუნქციის (\"%s\") დაბრუნების ტიპი %s არაა" + +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 +#, c-format +msgid "strictness of aggregate's forward and inverse transition functions must match" +msgstr "" + +#: 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:427 +#, c-format +msgid "return type of combine function %s is not %s" +msgstr "ტიპი, რომელსაც კომბინირებული ფუნქცია %s-ი აბრუნებს, %s არაა" + +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 +#, c-format +msgid "combine function with transition type %s must not be declared STRICT" +msgstr "კომბინირებული ფუნქცია გარდასვლის ტიპით %s არ შეიძლება აღწერილი იყოს, როგორც STRICT" + +#: catalog/pg_aggregate.c:458 +#, c-format +msgid "return type of serialization function %s is not %s" +msgstr "სერიალიზაციის ფუნქციის (%s) დაბრუნების ტიპი %s არაა" + +#: catalog/pg_aggregate.c:479 +#, c-format +msgid "return type of deserialization function %s is not %s" +msgstr "დესერიალიზაციის ფუნქციის (%s) დაბრუნების ტიპი %s არაა" + +#: 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: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:567 +#, c-format +msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" +msgstr "" + +#: catalog/pg_aggregate.c:578 +#, c-format +msgid "sort operator can only be specified for single-argument aggregates" +msgstr "" + +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#, c-format +msgid "cannot change routine kind" +msgstr "ქვეპროგრამის ტიპის შეცვლა შეუძლებელია" + +#: catalog/pg_aggregate.c:708 +#, c-format +msgid "\"%s\" is an ordinary aggregate function." +msgstr "\"%s\" ჩვეულებრივი აგრეგატული ფუნქციაა." + +#: catalog/pg_aggregate.c:710 +#, c-format +msgid "\"%s\" is an ordered-set aggregate." +msgstr "\"%s\" დალაგებული-სეტის აგრეგატია." + +#: catalog/pg_aggregate.c:712 +#, c-format +msgid "\"%s\" is a hypothetical-set aggregate." +msgstr "\"%s\" ჰიპოთეტიკური-სეტის აგრეგატია." + +#: catalog/pg_aggregate.c:717 +#, c-format +msgid "cannot change number of direct arguments of an aggregate function" +msgstr "" + +#: 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:864 +#, c-format +msgid "function %s returns a set" +msgstr "ფუნქცია %s სეტს აბრუნებს" + +#: 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:903 +#, c-format +msgid "function %s requires run-time type coercion" +msgstr "" + +#: catalog/pg_cast.c:68 +#, c-format +msgid "cast from type %s to type %s already exists" +msgstr "დაკასტვა ტიპიდან %s ტიპამდე %s უკვე არსებობს" + +#: 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:101 catalog/pg_collation.c:159 +#, c-format +msgid "collation \"%s\" already exists, skipping" +msgstr "კოლაცია \"%s\" უკვე არსებობს, გამოტოვება" + +#: catalog/pg_collation.c:103 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" +msgstr "კოლაცია \"%s\" კოდირებისთვის \"%s\" უკვე არსებობს. გამოტოვება" + +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 +#, c-format +msgid "collation \"%s\" already exists" +msgstr "კოლაცია \"%s\" უკვე არსებობს" + +#: catalog/pg_collation.c:113 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists" +msgstr "კოლაცია \"%s\" კოდირებისთვის \"%s\" უკვე არსებობს" + +#: catalog/pg_constraint.c:697 +#, c-format +msgid "constraint \"%s\" for domain %s already exists" +msgstr "შეზღუდვა \"%s\" დომენისთვის %s უკვე არსებობს" + +#: 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:1086 +#, c-format +msgid "constraint \"%s\" for domain %s does not exist" +msgstr "დომენის (%2$s) შეზღუდვა (%1$s) არ არსებობს" + +#: catalog/pg_conversion.c:67 +#, c-format +msgid "conversion \"%s\" already exists" +msgstr "გადაყვანა უკვე არსებობს: \"%s\"" + +#: catalog/pg_conversion.c:80 +#, c-format +msgid "default conversion for %s to %s already exists" +msgstr "%s-დან %s-ზე ნაგულისხმევი გადაყვანა უკვე არსებობს" + +#: catalog/pg_depend.c:222 commands/extension.c:3289 +#, c-format +msgid "%s is already a member of extension \"%s\"" +msgstr "%s გაფართოების (\"%s\") წევრს უკვე წარმოადგენს" + +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 +#, c-format +msgid "%s is not a member of extension \"%s\"" +msgstr "%s გაფართოების \"%s\"წევრი არაა" + +#: catalog/pg_depend.c:232 +#, c-format +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "გაფართოებას უფლება, ჩაანაცვლოს ობიექტი, რომელიც მას არ ეკუთვნის, არ გააჩნია." + +#: catalog/pg_depend.c:283 +#, c-format +msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." +msgstr "გაფართოებას CREATE … IF NOT EXISTS-ის გამოყენება მხოლოდ იმისთვის შეუძლიათ, რომ გამოტოვონ ობიექტის შექმნა, თუ კონფლიქტური ობიექტი მას უკვე ეკუთვნის." + +#: catalog/pg_depend.c:646 +#, c-format +msgid "cannot remove dependency on %s because it is a system object" +msgstr "%s-ზე დამოკიდებულებას ვერ მოაცილებთ. ის სისტემური ობიექტია" + +#: 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:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#, c-format +msgid "Labels must be %d bytes or less." +msgstr "ჭდეები %d ან ნაკლები ბაიტი უნდა იყოს." + +#: catalog/pg_enum.c:259 +#, c-format +msgid "enum label \"%s\" already exists, skipping" +msgstr "ჩამონათვალის ჭდე (\"%s\") უკვე არსებობს, გამოტოვება" + +#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 +#, c-format +msgid "enum label \"%s\" already exists" +msgstr "ჩამონათვალის ჭდე (\"%s\") უკვე არსებობს" + +#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 +#, c-format +msgid "\"%s\" is not an existing enum label" +msgstr "\"%s\" ჩამონათვალის არსებულ ჭდეს არ წარმოადგენს" + +#: catalog/pg_enum.c:379 +#, c-format +msgid "pg_enum OID value not set when in binary upgrade mode" +msgstr "ბინარული განახლების რეჟიმში pg_enum-ის OID-ის მნიშვნელობა დაყენებული არაა" + +#: catalog/pg_enum.c:389 +#, c-format +msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" +msgstr "ALTER TYPE ADD წინასწარ/ შემდეგ შეუთავსებელია ორობითი განახლებასთან" + +#: 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:4488 commands/tablecmds.c:15481 +#, 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:272 +#, c-format +msgid "schema \"%s\" already exists" +msgstr "სქემა \"%s\" უკვე არსებობს" + +#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#, c-format +msgid "\"%s\" is not a valid operator name" +msgstr "ოპერატორის არასწორი სახელი: \"%s\"" + +#: catalog/pg_operator.c:370 +#, c-format +msgid "only binary operators can have commutators" +msgstr "კომუტატორები მხოლოდ ბინარულ ოპერატორებს შეიძლება ჰქონდეთ" + +#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 +#, c-format +msgid "only binary operators can have join selectivity" +msgstr "შეერთების არჩევადობა მხოლოდ" + +#: catalog/pg_operator.c:378 +#, c-format +msgid "only binary operators can merge join" +msgstr "შერწყმა მხოლოდ ბინარულ ოპერაციებს შეუძლიათ" + +#: catalog/pg_operator.c:382 +#, c-format +msgid "only binary operators can hash" +msgstr "ჰეში მხოლოდ ბინარულ ოპერატორებს შეუძლიათ" + +#: catalog/pg_operator.c:393 +#, c-format +msgid "only boolean operators can have negators" +msgstr "" + +#: 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:519 +#, c-format +msgid "only boolean operators can have join selectivity" +msgstr "შეერთების არჩევადობა მხოლოდ ლოგიკურ ოპერატორებს შეიძლება ჰქონდეთ" + +#: catalog/pg_operator.c:405 +#, c-format +msgid "only boolean operators can merge join" +msgstr "შეერთების შერწყმა მხოლოდ ლოგიკურ ოპერატორებს შეუძლიათ" + +#: catalog/pg_operator.c:409 +#, c-format +msgid "only boolean operators can hash" +msgstr "ჰეშობა მხოლოდ ლოგიკურ ოპერატორებს შეუძლიათ" + +#: catalog/pg_operator.c:421 +#, c-format +msgid "operator %s already exists" +msgstr "ოპერატორი %s უკვე არსებობს" + +#: catalog/pg_operator.c:621 +#, c-format +msgid "operator cannot be its own negator or sort operator" +msgstr "" + +#: 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:376 +#, c-format +msgid "function \"%s\" already exists with same argument types" +msgstr "ფუნქცია \"%s\" უკვე არსებობს იგივე არგუმენტის ტიპებით" + +#: catalog/pg_proc.c:388 +#, c-format +msgid "\"%s\" is an aggregate function." +msgstr "\"%s\" აგრეგატული ფუნქციაა." + +#: catalog/pg_proc.c:390 +#, c-format +msgid "\"%s\" is a function." +msgstr "\"%s\" ფუნქციაა." + +#: catalog/pg_proc.c:392 +#, c-format +msgid "\"%s\" is a procedure." +msgstr "\"%s\" პროცედურაა." + +#: catalog/pg_proc.c:394 +#, c-format +msgid "\"%s\" is a window function." +msgstr "\"%s\" ფანჯრის ფუნქციაა." + +#: catalog/pg_proc.c:414 +#, c-format +msgid "cannot change whether a procedure has output parameters" +msgstr "ფაქტს, აქვს თუ არა პროცედურას გამოტანის პარამეტრები, ვერ შეცვლით" + +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#, c-format +msgid "cannot change return type of existing function" +msgstr "არსებული ფუნქციის მნიშვნელობის დაბრუნების ტიპს ვერ შეცვლით" + +#. translator: first %s is DROP FUNCTION, DROP PROCEDURE, or DROP +#. AGGREGATE +#. +#. translator: first %s is DROP FUNCTION or DROP PROCEDURE +#: 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:446 +#, c-format +msgid "Row type defined by OUT parameters is different." +msgstr "OUT პარამეტრების მიერ აღწერილი მწკრივის ტიპი განსხვავებულია." + +#: catalog/pg_proc.c:490 +#, c-format +msgid "cannot change name of input parameter \"%s\"" +msgstr "შეყვანის პარამეტრის სახელის შეცვლა შეუძლებელია: \"%s\"" + +#: catalog/pg_proc.c:517 +#, c-format +msgid "cannot remove parameter defaults from existing function" +msgstr "არსებული ფუნქციიდან პარამეტრის ნაგულისხმევი მნიშვნელობების წაშლა შეუძლებელია" + +#: catalog/pg_proc.c:543 +#, c-format +msgid "cannot change data type of existing parameter default value" +msgstr "არსებული პარამეტრის ნაგულისხმევი მნიშვნელობის მონაცემის ტიპს ვერ შეცვლით" + +#: catalog/pg_proc.c:757 +#, c-format +msgid "there is no built-in function named \"%s\"" +msgstr "ჩაშენებული ფუნქცია სახელით \"%s\" არ არსებობს" + +#: catalog/pg_proc.c:855 +#, c-format +msgid "SQL functions cannot return type %s" +msgstr "SQL ფუნქციებს %s ტიპის დაბრუნება არ შეუძლიათ" + +#: catalog/pg_proc.c:870 +#, c-format +msgid "SQL functions cannot have arguments of type %s" +msgstr "SQL ფუნქციებს \"%s\" ტიპის არგუმენტები ვერ იქნება" + +#: catalog/pg_proc.c:1000 executor/functions.c:1473 +#, c-format +msgid "SQL function \"%s\"" +msgstr "SQL ფუნქცია \"%s\"" + +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "გამოცემისთვის ურთიერთობის დამატება შეუძლებელია: %s" + +#: catalog/pg_publication.c:73 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "ეს ოპერაცია სისტემური ცხრილებისთვის მხარდაჭერილი არაა." + +#: catalog/pg_publication.c:81 +#, c-format +msgid "This operation is not supported for temporary tables." +msgstr "ეს ოპერაცია დროებითი ცხრილებისთვის მხარდაჭერილი არაა." + +#: catalog/pg_publication.c:87 +#, c-format +msgid "This operation is not supported for unlogged tables." +msgstr "ეს ოპერაცია არაჟურნალირებადი ცხრილებისთვის მხარდაჭერილი არაა." + +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 +#, c-format +msgid "cannot add schema \"%s\" to publication" +msgstr "გამოცემისთვის სქემის დამატება შეუძლებელია: %s" + +#: 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:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "პუბლიკაციის სვეტების სიაში სისტემური სვეტის (\"%s\") გამოყენება შეუძლებელია" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use 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:1391 commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "გამოცემა \"%s\" არ არსებობს" + +#: catalog/pg_shdepend.c:829 +#, c-format +msgid "" +"\n" +"and objects in %d other database (see server log for list)" +msgid_plural "" +"\n" +"and objects in %d other databases (see server log for list)" +msgstr[0] "" +"\n" +"და ობიექტები %d სხვა ბაზაში (სიისთვის იხილეთ სერვერის ჟურნალი)" +msgstr[1] "" +"\n" +"და ობიექტები %d სხვა ბაზაში (სიისთვის იხილეთ სერვერის ჟურნალი)" + +#: catalog/pg_shdepend.c:1176 +#, c-format +msgid "role %u was concurrently dropped" +msgstr "როლი %u სხვა პროცესის მიერ წაიშალა" + +#: catalog/pg_shdepend.c:1188 +#, c-format +msgid "tablespace %u was concurrently dropped" +msgstr "ცხრილების სივრცე %u სხვა პროცესის მიერ წაიშალა" + +#: catalog/pg_shdepend.c:1202 +#, c-format +msgid "database %u was concurrently dropped" +msgstr "ბაზა %u სხვა პროცესის მიერ წაიშალა" + +#: catalog/pg_shdepend.c:1253 +#, c-format +msgid "owner of %s" +msgstr "%s -ის მფლობელი" + +#: catalog/pg_shdepend.c:1255 +#, c-format +msgid "privileges for %s" +msgstr "პრივილეგიები %s-სთვის" + +#: 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:1267 +#, c-format +msgid "%d object in %s" +msgid_plural "%d objects in %s" +msgstr[0] "%d ობიექტი %s-ში" +msgstr[1] "%d ობიექტი %s-ში" + +#: 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: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:216 commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 +#, c-format +msgid "subscription \"%s\" does not exist" +msgstr "გამოწერა \"%s\" არ არსებობს" + +#: 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:256 +#, c-format +msgid "invalid type internal size %d" +msgstr "ტიპის არასწორი შიდა ზომა: %d" + +#: 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:304 +#, c-format +msgid "internal size %d is invalid for passed-by-value type" +msgstr "შიდა ზომა %d მნიშვნელობით-გადაცემული ტიპისთვის არასწორია" + +#: 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:328 commands/typecmds.c:4151 +#, c-format +msgid "fixed-size types must have storage PLAIN" +msgstr "ფიქსირებული ზომის ტიპებს უნდა PLAIN ტიპის საცავი უნდა ჰქონდეთ" + +#: catalog/pg_type.c:827 +#, c-format +msgid "could not form array type name for type \"%s\"" +msgstr "ტიპისთვის (%s) მასივის ტიპის სახელის ფორმირება შეუძლებელია" + +#: catalog/pg_type.c:932 +#, c-format +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "შეცდომა მრავალდიაპაზონიანი ტიპის შექმნისას ტიპისთვის \"%s\"." + +#: catalog/pg_type.c:933 +#, c-format +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:1047 +#, c-format +msgid "invalid page in block %u of relation %s" +msgstr "ურთიერთობის (%2$s) ბლოკის (%1$u) არასწორ გვერდი" + +#: commands/aggregatecmds.c:170 +#, c-format +msgid "only ordered-set aggregates can be hypothetical" +msgstr "ჰიპოთეზური მხოლოდ დალაგებული-სეტის აგრეგატები შეიძლება, იყოს" + +#: commands/aggregatecmds.c:195 +#, c-format +msgid "aggregate attribute \"%s\" not recognized" +msgstr "აგრეგატის უცნობი ატრიბუტი: %s" + +#: commands/aggregatecmds.c:205 +#, c-format +msgid "aggregate stype must be specified" +msgstr "აგრეგატის style-ის მითითება აუცილებელია" + +#: commands/aggregatecmds.c:209 +#, c-format +msgid "aggregate sfunc must be specified" +msgstr "აგრეგატის sfunc -ის მითითება აუცილებელია" + +#: commands/aggregatecmds.c:221 +#, c-format +msgid "aggregate msfunc must be specified when mstype is specified" +msgstr "როცა mstype მითითებულია, აგრეგატის msfunc-იც აუცილებლად უნდა იყოს მითითებული" + +#: commands/aggregatecmds.c:225 +#, c-format +msgid "aggregate minvfunc must be specified when mstype is specified" +msgstr "როცა minvfunc მითითებულია, აგრეგატის msfunc-იც აუცილებლად უნდა იყოს მითითებული" + +#: commands/aggregatecmds.c:232 +#, c-format +msgid "aggregate msfunc must not be specified without mstype" +msgstr "mstype-ის გარეშე აგრეგატი msfunc მითითებული არ უნდა იყოს" + +#: commands/aggregatecmds.c:236 +#, c-format +msgid "aggregate minvfunc must not be specified without mstype" +msgstr "mstype-ის გარეშე აგრეგატი minvfunc მითითებული არ უნდა იყოს" + +#: commands/aggregatecmds.c:240 +#, c-format +msgid "aggregate mfinalfunc must not be specified without mstype" +msgstr "mstype-ის გარეშე აგრეგატი mfinalfunc მითითებული არ უნდა იყოს" + +#: commands/aggregatecmds.c:244 +#, c-format +msgid "aggregate msspace must not be specified without mstype" +msgstr "mstype-ის გარეშე აგრეგატი msspace მითითებული არ უნდა იყოს" + +#: commands/aggregatecmds.c:248 +#, c-format +msgid "aggregate minitcond must not be specified without mstype" +msgstr "mstype-ის გარეშე აგრეგატი minitcond მითითებული არ უნდა იყოს" + +#: commands/aggregatecmds.c:277 +#, c-format +msgid "aggregate input type must be specified" +msgstr "აგრეგატის შეყვანის ტიპის მითითება აუცილებელია" + +#: commands/aggregatecmds.c:307 +#, c-format +msgid "basetype is redundant with aggregate input type specification" +msgstr "" + +#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 +#, c-format +msgid "aggregate transition data type cannot be %s" +msgstr "აგრეგატის მონაცემების გარდამავალი ტიპი %s არ შეიძლება იყოს" + +#: 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:372 +#, c-format +msgid "must specify both or neither of serialization and deserialization functions" +msgstr "აუცილებელია მიუთითოთ ან ორივე, სერიალიზაციის და დესერიალიზაციის ფუნქციები, ან არც ერთი" + +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 +#, c-format +msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" +msgstr "პარამეტრი \"parallel\" SAFE, RESTRICTED ან UNSAFE -ს შეიძლება უდრიდეს" + +#: commands/aggregatecmds.c:493 +#, c-format +msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" +msgstr "პარამეტრი \"%s\" READ_ONLY, SHAREABLE, ან READ_WRITE უნდა იყოს" + +#: commands/alter.c:84 commands/event_trigger.c:174 +#, c-format +msgid "event trigger \"%s\" already exists" +msgstr "მოვლენის ტრიგერი უკვე არსებობს: %s" + +#: 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:884 +#, c-format +msgid "server \"%s\" already exists" +msgstr "სერვერი \"%s\" უკვე არსებობს" + +#: commands/alter.c:93 commands/proclang.c:133 +#, c-format +msgid "language \"%s\" already exists" +msgstr "ენა \"%s\" უკვე არსებობს" + +#: commands/alter.c:96 commands/publicationcmds.c:770 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "გამოცემა \"%s\" უკვე არსებობს" + +#: commands/alter.c:99 commands/subscriptioncmds.c:567 +#, c-format +msgid "subscription \"%s\" already exists" +msgstr "გამოწერა \"%s\" უკვე არსებობს" + +#: commands/alter.c:122 +#, c-format +msgid "conversion \"%s\" already exists in schema \"%s\"" +msgstr "გადაყვანა \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:126 +#, c-format +msgid "statistics object \"%s\" already exists in schema \"%s\"" +msgstr "სტატისტიკის ობიექტი \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:130 +#, c-format +msgid "text search parser \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:134 +#, c-format +msgid "text search dictionary \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძებნის ლექსიკონი \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:138 +#, c-format +msgid "text search template \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძიების შაბლონი \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:142 +#, c-format +msgid "text search configuration \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძიების კონფიგურაცია \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/alter.c:215 +#, c-format +msgid "must be superuser to rename %s" +msgstr "%s -ის სახელის გადარქმევისთვის საჭიროა ზემომხმარებლის უფლებები" + +#: commands/alter.c:746 +#, c-format +msgid "must be superuser to set schema of %s" +msgstr "%s-ის სქემის დასაყენებლად საჭიროა ზემომხმარებლის უფლებები" + +#: commands/amcmds.c:60 +#, c-format +msgid "permission denied to create access method \"%s\"" +msgstr "წვდომის მეთოდის (\"%s\") შესაქმნელად წვდომა აკრძალულია" + +#: commands/amcmds.c:62 +#, c-format +msgid "Must be superuser to create an access method." +msgstr "წვდომის მეთოდის შესაქმნელად საჭიროა ზემომხმარებლის უფლებები." + +#: commands/amcmds.c:71 +#, c-format +msgid "access method \"%s\" already exists" +msgstr "წვდომის მეთოდი \"%s\" უკვე არსებობს" + +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#, c-format +msgid "access method \"%s\" does not exist" +msgstr "წვდომის მეთოდი \"%s\" არ არსებობს" + +#: commands/amcmds.c:243 +#, c-format +msgid "handler function is not specified" +msgstr "დამმუშავებელი ფუნქცია მითითებული არაა" + +#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:714 parser/parse_clause.c:942 +#, c-format +msgid "function %s must return type %s" +msgstr "ფუნქციამ (%s) აუცილებლად უნდა დააბრუნოს ტიპი %s" + +#: commands/analyze.c:228 +#, c-format +msgid "skipping \"%s\" --- cannot analyze this foreign table" +msgstr "%s-ის გამოტოვება --- გარე ცხრილის ანალიზი შეუძლებელია" + +#: commands/analyze.c:245 +#, c-format +msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" +msgstr "%s-ის გამოტოვება --- არაცხრილების და სპეციალური სისტემური ცხრილების ანალიზი შეუძლებელია" + +#: commands/analyze.c:325 +#, c-format +msgid "analyzing \"%s.%s\" inheritance tree" +msgstr "\"%s.%s\" -ის მემკვიდრეობითი ხის ანალიზი" + +#: commands/analyze.c:330 +#, c-format +msgid "analyzing \"%s.%s\"" +msgstr "\"%s.%s\"-ის ანალიზი" + +#: commands/analyze.c:396 +#, c-format +msgid "column \"%s\" of relation \"%s\" appears more than once" +msgstr "ურთიერთობის (%2$s) სვეტი (%1$s) ერთზე მეტჯერ ჩნდება" + +#: commands/analyze.c:787 +#, c-format +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "ცხრილის ავტომატური ანალიზი \"%s.%s.%s\"\n" + +#: commands/analyze.c:1334 +#, 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:1418 +#, c-format +msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" +msgstr "\"%s.%s\"-ის მემკვიდრეობის ხის ანალიზის გამოტოვება --- მემკვიდრეობითობის ხე შვილ ცხრილებს არ შეიცავს" + +#: 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:646 +#, c-format +msgid "channel name cannot be empty" +msgstr "არხის სახელი ცარიელი არ შეიძლება იყოს" + +#: commands/async.c:652 +#, c-format +msgid "channel name too long" +msgstr "არხის სახელი ძალიან გრძელია" + +#: commands/async.c:657 +#, c-format +msgid "payload string too long" +msgstr "სასარგებლო დატვირთვის სტრიქონი ძალიან გრძელია" + +#: commands/async.c:876 +#, c-format +msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" +msgstr "შეუძლებელია განვახორციელო PREPARE ტრანზაქციაზე, რომელმაც შეასრულა LISTEN, UNLSTEN ან NOTIFY" + +#: commands/async.c:980 +#, c-format +msgid "too many notifications in the NOTIFY queue" +msgstr "\"NOTIFY\" რიგში მეტისმეტად ბევრი გაფრთხილებაა" + +#: commands/async.c:1602 +#, c-format +msgid "NOTIFY queue is %.0f%% full" +msgstr "NOTIFY-ის რიგი %.0f%% -ით სავსეა" + +#: 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:1607 +#, c-format +msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." +msgstr "რიგის NOTIFY დაცარიელება პროცესის მიერ მიმდინარე ტრანზაქციის დასრულებამდე შეუძლებელია." + +#: commands/cluster.c:128 +#, c-format +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "\"CLUSTER\"-ის უცნობი პარამეტრი \"%s\"" + +#: commands/cluster.c:158 commands/cluster.c:431 +#, c-format +msgid "cannot cluster temporary tables of other sessions" +msgstr "სხვა სესიების დროებით ცხრილების დაკლასტერება შეუძლებელია" + +#: commands/cluster.c:176 +#, c-format +msgid "there is no previously clustered index for table \"%s\"" +msgstr "ცხრილისთვის \"%s\" წინასწარ დაკლასტერებული ინდექსი არ არსებობს" + +#: commands/cluster.c:190 commands/tablecmds.c:14179 commands/tablecmds.c:16060 +#, c-format +msgid "index \"%s\" for table \"%s\" does not exist" +msgstr "ინდექსი %s ცხრილისთვის %s არ არსებობს" + +#: commands/cluster.c:420 +#, c-format +msgid "cannot cluster a shared catalog" +msgstr "გაზიარებული კატალოგის დაკლასტერება შეუძლებელია" + +#: commands/cluster.c:435 +#, c-format +msgid "cannot vacuum temporary tables of other sessions" +msgstr "სხვა სესიების დროებითი ცხრილების მომტვერსასრუტება შეუძლებელია" + +#: commands/cluster.c:511 commands/tablecmds.c:16070 +#, c-format +msgid "\"%s\" is not an index for table \"%s\"" +msgstr "\"%s\" არ წარმოადგენს ინდექსს ცხრილისთვის \"%s\"" + +#: commands/cluster.c:519 +#, c-format +msgid "cannot cluster on index \"%s\" because access method does not support clustering" +msgstr "" + +#: commands/cluster.c:531 +#, c-format +msgid "cannot cluster on partial index \"%s\"" +msgstr "ნაწილობრივი ინდექსის (\"%s\") დაკლასტერება შეუძლებელია" + +#: commands/cluster.c:545 +#, c-format +msgid "cannot cluster on invalid index \"%s\"" +msgstr "არასწორი ინდექსის (\"%s\") დაკლასტერება შეუძლებელია" + +#: commands/cluster.c:569 +#, c-format +msgid "cannot mark index clustered in partitioned table" +msgstr "დაყოფილ ცხრილში ინდექსის დაკლასტერებულად მონიშვნა შეუძლებელია" + +#: commands/cluster.c:948 +#, c-format +msgid "clustering \"%s.%s\" using index scan on \"%s\"" +msgstr "\"%s.%s\"-ის დაკლასტერება ინდექსის სკანირების გამოყენებით \"%s\"" + +#: commands/cluster.c:954 +#, c-format +msgid "clustering \"%s.%s\" using sequential scan and sort" +msgstr "\"%s.%s\"-ის დაკლასტერება თანმიმდევრული სკანირების და დახარისხების გამოყენებით" + +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "დამტვერსასრუტება \"%s.%s\"" + +#: commands/cluster.c:985 +#, c-format +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%s.%s\": აღმოჩენილია %.0f წაშლადი და %.0f არაწაშლადი მწკრივის ვერსია %u გვერდში" + +#: commands/cluster.c:990 +#, c-format +msgid "" +"%.0f dead row versions cannot be removed yet.\n" +"%s." +msgstr "" +"%.0f მკვდარი მწკრივის ვერსების წაშლა ჯერჯერობით შეუძლებელია.\n" +"%s." + +#: commands/collationcmds.c:106 +#, c-format +msgid "collation attribute \"%s\" not recognized" +msgstr "კოლაციის უცნობი ატრიბუტი: \"%s\"" + +#: commands/collationcmds.c:119 commands/collationcmds.c:125 commands/define.c:389 commands/tablecmds.c:7808 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:1001 replication/walsender.c:1023 replication/walsender.c:1033 +#, 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 "LC_COLLATE-სთან და LC_TYPE-სთან ერთად LOCALE-ს ვერ მიუთითებთ." + +#: 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 "კოლაციის \"ნაგულისხმევი\" კოპირება შეუძლებელია" + +#: commands/collationcmds.c:204 +#, c-format +msgid "unrecognized collation provider: %s" +msgstr "კოლაციის უცნობი მომწოდებელი: %s" + +#: commands/collationcmds.c:232 +#, c-format +msgid "parameter \"lc_collate\" must be specified" +msgstr "უნდა იყოს მითითებული პარამეტრი \"lc_collate\"" + +#: commands/collationcmds.c:237 +#, c-format +msgid "parameter \"lc_ctype\" must be specified" +msgstr "უნდა იყოს მითითებული პარამეტრი \"lc_ctype\"" + +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "უნდა იყოს მითითებული პარამეტრი \"locale\"" + +#: commands/collationcmds.c:256 +#, c-format +msgid "nondeterministic collations not supported with this provider" +msgstr "არადემინისტური კოლაციები, რომლებიც არ არის მხარდაჭერილი ამ მომწოდებელთან" + +#: commands/collationcmds.c:275 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "მონაცემთა ბაზის კოდირება არ არის მხარდაჭერილი ამ მომწოდებელთან" + +#: commands/collationcmds.c:334 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" +msgstr "კოლაცია \"%s\" კოდირებისთვის \"%s\" სქემაში \"%s\" უკვე არსებობს" + +#: commands/collationcmds.c:345 +#, c-format +msgid "collation \"%s\" already exists in schema \"%s\"" +msgstr "კოლაცია \"%s\" უკვე არსებობს სქემაში \"%s\"" + +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 +#, c-format +msgid "changing version from %s to %s" +msgstr "ვერსიის შეცვლა %s-დან %s-ზე" + +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 +#, c-format +msgid "version has not changed" +msgstr "ვერსია არ შეცვლილა" + +#: commands/collationcmds.c:532 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "მდებარეობის კოდის \"%s\" ენის ჭდეში (%s) გადაყვანის შეცდომა" + +#: commands/collationcmds.c:590 +#, c-format +msgid "must be superuser to import system collations" +msgstr "სისტემური კოლაციების შემოსატანად საჭიროა ზემომხმარებლის უფლებები" + +#: 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 "ბრძანების (\"%s\") შესრულების შეცდომა: %m" + +#: commands/collationcmds.c:753 +#, c-format +msgid "no usable system locales were found" +msgstr "გამოყენებადი სისტემური ენები ნაპოვნი არაა" + +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 commands/dbcommands.c:1874 commands/dbcommands.c:2068 commands/dbcommands.c:2310 commands/dbcommands.c:2405 commands/dbcommands.c:2515 commands/dbcommands.c:3014 utils/init/postinit.c:947 utils/init/postinit.c:1053 utils/init/postinit.c:1079 +#, c-format +msgid "database \"%s\" does not exist" +msgstr "მონაცემთა ბაზა \"%s\" არ არსებობს" + +#: commands/comment.c:101 +#, c-format +msgid "cannot set comment on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" კომენტარის დადება შეუძლებელია" + +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 +#, c-format +msgid "function \"%s\" was not called by trigger manager" +msgstr "ფუნქცია ტრიგერის მმართველის მიერ არ გამოძახებულა: %s" + +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 +#, c-format +msgid "function \"%s\" must be fired AFTER ROW" +msgstr "ფუნქცია %s AFTER-ის ტრიგერით უნდა გაეშვას" + +#: commands/constraint.c:84 +#, c-format +msgid "function \"%s\" must be fired for INSERT or UPDATE" +msgstr "ფუნქცია %s INSERT-ის ან UPDATE-ის ტრიგერით უნდა გაეშვას" + +#: commands/conversioncmds.c:67 +#, c-format +msgid "source encoding \"%s\" does not exist" +msgstr "საწყისი კოდირება არ არსებობს: \"%s\"" + +#: commands/conversioncmds.c:74 +#, c-format +msgid "destination encoding \"%s\" does not exist" +msgstr "სამიზნე კოდირება \"%s\" არ არსებობს" + +#: commands/conversioncmds.c:87 +#, c-format +msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" +msgstr "\"SQL_ASCII\"-დან ან მასში კოდირების გადაყვანა მხარდაჭერილი არაა" + +#: commands/conversioncmds.c:100 +#, c-format +msgid "encoding conversion function %s must return type %s" +msgstr "კოდირების გადაყვანის ფუნქცია %s-ი %s ტიპს უნდა აბრუნებდეს" + +#: commands/conversioncmds.c:130 +#, c-format +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "დაშიფვრის ფუნქციამ %s ცარიელი შეყვანისთვის არასწორი პასუხი დააბრუნა" + +#: commands/copy.c:86 +#, c-format +msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" +msgstr "" + +#: 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 stdin-დან და stdout-ში ყველას შეუძლია. plsql-ის ბრძანება \\copy-იც ყველასთვის მუშაობს." + +#: commands/copy.c:95 +#, c-format +msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgstr "" + +#: commands/copy.c:102 +#, c-format +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:188 +#, c-format +msgid "COPY FROM not supported with row-level security" +msgstr "მწკრივის-დონის უსაფრთხოებით COPY FROM მხარდაჭერილი არაა" + +#: commands/copy.c:189 +#, c-format +msgid "Use INSERT statements instead." +msgstr "უკეთესია გამოიყენოთ INSERT ოპერატორი." + +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "COPY-ში MERGE მხარდაჭერილი არაა" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "\"COPY TO\"-ში %s-ის HEADER-თან ერთად გამოყენება შეუძლებელია" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s -ს ლოგიკური მნიშვნელობა უნდა ჰქონდეს, ან \"match\"" + +#: commands/copy.c:444 +#, c-format +msgid "COPY format \"%s\" not recognized" +msgstr "COPY-ის უცნობი ფორმატი: \"%s\"" + +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 commands/copy.c:541 +#, c-format +msgid "argument to option \"%s\" must be a list of column names" +msgstr "პარამეტრის (%s) არგუმენტი სვეტების სახელების სია უნდა იყოს" + +#: commands/copy.c:553 +#, c-format +msgid "argument to option \"%s\" must be a valid encoding name" +msgstr "პარამეტრის (%s) არგუმენტი კოდირების სწორი სახელი უნდა იყოს" + +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 +#, c-format +msgid "option \"%s\" not recognized" +msgstr "უცნობი პარამეტრი: %s" + +#: commands/copy.c:572 +#, c-format +msgid "cannot specify DELIMITER in BINARY mode" +msgstr "რეჟიმში BINARY \"DELIMITER\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:577 +#, c-format +msgid "cannot specify NULL in BINARY mode" +msgstr "რეჟიმში BINARY \"NULL\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:599 +#, c-format +msgid "COPY delimiter must be a single one-byte character" +msgstr "COPY-ის გამყოფი ერთბაიტიანი სიმბოლო უნდა იყოს" + +#: commands/copy.c:606 +#, c-format +msgid "COPY delimiter cannot be newline or carriage return" +msgstr "COPY-ის გამყოფი ხაზის გადატანა ან კარეტის დაბრუნება არ უნდა იყოს" + +#: commands/copy.c:612 +#, c-format +msgid "COPY null representation cannot use newline or carriage return" +msgstr "COPY-ის ნულოვან რეპრეზენტაციას ახალი ხაზის ან კარეტის დაბრუნება გამოყენება არ შეუძლია" + +#: commands/copy.c:629 +#, c-format +msgid "COPY delimiter cannot be \"%s\"" +msgstr "COPY-ის გამყოფი \"%s\" არ შეიძლება იყოს" + +#: commands/copy.c:635 +#, c-format +msgid "cannot specify HEADER in BINARY mode" +msgstr "რეჟიმში BINARY \"HEADER\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:641 +#, c-format +msgid "COPY quote available only in CSV mode" +msgstr "COPY-ის ბრჭყალი მხოლოდ CSV -ის რეჟიმშია ხელმისაწვდომი" + +#: commands/copy.c:646 +#, c-format +msgid "COPY quote must be a single one-byte character" +msgstr "COPY-ის ბრჭყალი ერთბაიტიანი სიმბოლო უნდა იყოს" + +#: commands/copy.c:651 +#, c-format +msgid "COPY delimiter and quote must be different" +msgstr "COPY-ის გამყოფი და ბრჭყალი სხვადასხვა სიმბოლო უნდა იყოს" + +#: commands/copy.c:657 +#, c-format +msgid "COPY escape available only in CSV mode" +msgstr "COPY-ის სპეცსიმბოლო მხოლოდ CSV -ის რეჟიმშია ხელმისაწვდომი" + +#: commands/copy.c:662 +#, c-format +msgid "COPY escape must be a single one-byte character" +msgstr "COPY-ის სპეცსიმბოლო ერთბაიტიანი სიმბოლო უნდა იყოს" + +#: commands/copy.c:668 +#, c-format +msgid "COPY force quote available only in CSV mode" +msgstr "COPY-ის პარამეტრი force quote მხოლოდ CSV რეჟიმში შეგიძლიათ, გამოიყენოთ" + +#: commands/copy.c:672 +#, c-format +msgid "COPY force quote only available using COPY TO" +msgstr "COPY-ის პარამეტრი force quote მხოლოდ COPY TO-ის გამოყენების დროსაა ხელმისაწვდომი" + +#: commands/copy.c:678 +#, c-format +msgid "COPY force not null available only in CSV mode" +msgstr "COPY-ის პარამეტრი force not null მხოლოდ CSV რეჟიმში შეგიძლიათ, გამოიყენოთ" + +#: commands/copy.c:682 +#, c-format +msgid "COPY force not null only available using COPY FROM" +msgstr "COPY-ის პარამეტრი force not null მხოლოდ COPY FROM-ის გამოყენების დროსაა ხელმისაწვდომი" + +#: commands/copy.c:688 +#, c-format +msgid "COPY force null available only in CSV mode" +msgstr "COPY-ის პარამეტრი force null მხოლოდ CSV რეჟიმში შეგიძლიათ, გამოიყენოთ" + +#: commands/copy.c:693 +#, c-format +msgid "COPY force null only available using COPY FROM" +msgstr "COPY-ის პარამეტრი force null მხოლოდ COPY FROM-ის გამოყენების დროსაა ხელმისაწვდომი" + +#: commands/copy.c:699 +#, c-format +msgid "COPY delimiter must not appear in the NULL specification" +msgstr "COPY-ის გამყოფი NULL-ის სპეციფიკაციაში არ უნდა გამოჩნდეს" + +#: commands/copy.c:706 +#, c-format +msgid "CSV quote character must not appear in the NULL specification" +msgstr "CSV-ის ბრჭყალის სიმბოლო NULL-ის სპეციფიკაციაში არ უნდა გამოჩნდეს" + +#: commands/copy.c:767 +#, c-format +msgid "column \"%s\" is a generated column" +msgstr "სვეტი \"%s\" გენერირებული სვეტია" + +#: commands/copy.c:769 +#, c-format +msgid "Generated columns cannot be used in COPY." +msgstr "გენერირებული სვეტები COPY-ში არ გამოიყენება." + +#: commands/copy.c:784 commands/indexcmds.c:1850 commands/statscmds.c:243 commands/tablecmds.c:2379 commands/tablecmds.c:3035 commands/tablecmds.c:3529 parser/parse_relation.c:3660 parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 +#, c-format +msgid "column \"%s\" does not exist" +msgstr "სვეტი არ არსებობს: \"%s\"" + +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 parser/parse_target.c:1079 parser/parse_target.c:1090 +#, c-format +msgid "column \"%s\" specified more than once" +msgstr "სვეტი ერთზე მეტჯერაა მითითებული: \"%s\"" + +#: commands/copyfrom.c:123 +#, c-format +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, ხაზი %llu, სვეტი %s" + +#: commands/copyfrom.c:128 commands/copyfrom.c:174 +#, c-format +msgid "COPY %s, line %llu" +msgstr "COPY %s, ხაზი %llu" + +#: commands/copyfrom.c:140 +#, c-format +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, ხაზი %llu, სვეტი %s: \"%s\"" + +#: commands/copyfrom.c:150 +#, c-format +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, ხაზი %llu, სვეტი %s: ნულოვანი შეყვანა" + +#: commands/copyfrom.c:167 +#, c-format +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, ხაზი %llu: \"%s\"" + +#: commands/copyfrom.c:569 +#, c-format +msgid "cannot copy to view \"%s\"" +msgstr "ხედზე კოპირების შეცდომა: \"%s\"" + +#: commands/copyfrom.c:571 +#, c-format +msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." +msgstr "ხედში კოპირებისთვის INSTEAD OF INSERT ტრიგერი წარმოადგინეთ." + +#: commands/copyfrom.c:575 +#, c-format +msgid "cannot copy to materialized view \"%s\"" +msgstr "მატერიალიზებულ ხედში კოპირების შეცდომა: %s" + +#: commands/copyfrom.c:580 +#, c-format +msgid "cannot copy to sequence \"%s\"" +msgstr "მიმდევრობაში კოპირების შეცდომა: %s" + +#: commands/copyfrom.c:585 +#, c-format +msgid "cannot copy to non-table relation \"%s\"" +msgstr "არა-ცხრილოვან ურთიერთობაში კოპირების შეცდომა: %s" + +#: commands/copyfrom.c:625 +#, c-format +msgid "cannot perform COPY FREEZE on a partitioned table" +msgstr "\"COPY FREEZE\"-ის გამოყენება დაყოფილ ცხრილზე შეუძლებელია" + +#: commands/copyfrom.c:640 +#, c-format +msgid "cannot perform COPY FREEZE because of prior transaction activity" +msgstr "\"COPY FREEZE\"-ის გამოყენება შეუძლებელია წინა ტრანზაქციის აქტივობის გამო" + +#: 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'-ის განხორციელება შეუძლებელია, რადგან ცხრილი მიმდინარე ქვეტრანზაქციაში არც შექმნილა და არც მოკვეთილა" + +#: commands/copyfrom.c:1267 commands/copyto.c:611 +#, c-format +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NOT_NULL სვეტი \"%s\" COPY-ის მიერ მითითებული არაა" + +#: commands/copyfrom.c:1290 commands/copyto.c:634 +#, c-format +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NULL სვეტი \"%s\" COPY-ის მიერ მითითებული არაა" + +#: 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 "ინსტრუქცია 'COPY TO' PostgreSQL-ის სერვერის პროცესს ფაილიდან წაკითხვას უბრძანებს. შეიძლება გნებავთ კლიენტის მხარე, როგორიცაა psql-ის \\copy." + +#: commands/copyfrom.c:1531 commands/copyto.c:731 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" საქაღალდეა" + +#: 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 "გარე ბრძანებამდე ფაიფის დახურვის შეცდომა: %m" + +#: commands/copyfrom.c:1614 commands/copyto.c:306 +#, c-format +msgid "program \"%s\" failed" +msgstr "პროგრამის (\"%s\") შეცდომა" + +#: commands/copyfromparse.c:200 +#, c-format +msgid "COPY file signature not recognized" +msgstr "COPY-ის ფაილის უცნობი სიგნატურა" + +#: commands/copyfromparse.c:205 +#, c-format +msgid "invalid COPY file header (missing flags)" +msgstr "\"COPY\"-ის ფაილის არასწორი თავსართი (აკლია ალმები)" + +#: commands/copyfromparse.c:209 +#, c-format +msgid "invalid COPY file header (WITH OIDS)" +msgstr "\"COPY\"-ის ფაილის არასწორი თავსართი (WITH OIDS)" + +#: commands/copyfromparse.c:214 +#, c-format +msgid "unrecognized critical flags in COPY file header" +msgstr "აღმოჩენილია უცნობი კრიტიკული ალმები COPY ფაილის თავსართში" + +#: commands/copyfromparse.c:220 +#, c-format +msgid "invalid COPY file header (missing length)" +msgstr "\"COPY\"-ის ფაილის არასწორი თავსართი (აკლია სიგრძე)" + +#: commands/copyfromparse.c:227 +#, c-format +msgid "invalid COPY file header (wrong length)" +msgstr "\"COPY\"-ის ფაილის არასწორი თავსართი (არასწორი სიგრძე)" + +#: commands/copyfromparse.c:256 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "\"COPY\" ფაილიდან წაკითხვის შეცდომა: %m" + +#: 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 "მოულოდნელი EOF ღია ტრანზაქციის მქონე კლიენტის შეერთებაზე" + +#: commands/copyfromparse.c:294 +#, c-format +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "stdin-დან COPY ოპერაციისას მიღებულია მოულოდნელი შეტყობინების ტიპი 0x%02X" + +#: commands/copyfromparse.c:317 +#, c-format +msgid "COPY from stdin failed: %s" +msgstr "COPY-ი stdin-დან წარუმატებელია: %s" + +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "ველების არასწორი რაოდენობა თავსართის ხაზში: მივიღე %d, მოველოდი %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "სვეტი სახელი არ ემთხვევა თავსართის %d ხაზის ველზე: მიღებულია ნულოვანი მნიშვნელობა (\"%s\"). მოველოდი: \"%s\"" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "სვეტი სახელი არ ემთხვევა თავსართის %d ხაზის ველზე: მიღებულია მნიშვნელობა: \"%s\". მოველოდი: \"%s\"" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 commands/copyfromparse.c:1725 +#, c-format +msgid "extra data after last expected column" +msgstr "დამატებითი მონაცემები ბოლო მოსალოდნელი სვეტის შემდეგ" + +#: commands/copyfromparse.c:904 +#, c-format +msgid "missing data for column \"%s\"" +msgstr "არ არსებობს მონაცემები სვეტისთვის \"%s\"" + +#: commands/copyfromparse.c:982 +#, c-format +msgid "received copy data after EOF marker" +msgstr "მიღებულია კოპირების მონაცემები EOF ნიშნის შემდეგ" + +#: commands/copyfromparse.c:989 +#, c-format +msgid "row field count is %d, expected %d" +msgstr "მწკრივების ველის რაოდენობაა %d. ველოდებოდი %d" + +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 +#, c-format +msgid "literal carriage return found in data" +msgstr "მონაცემებში აღმოჩენილია აშკარა ხაზის გადატანის სიმბოლო" + +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 +#, c-format +msgid "unquoted carriage return found in data" +msgstr "" + +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 +#, c-format +msgid "Use \"\\r\" to represent carriage return." +msgstr "კარეტის დაბრუნების სიმბოლოსთვის გამოიყენეთ \"\\r\"." + +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 +#, c-format +msgid "Use quoted CSV field to represent carriage return." +msgstr "CSV-ის ველში კარეტის დაბრუნების სიმბოლოს ბრჭყალებში ჩასმა." + +#: commands/copyfromparse.c:1310 +#, c-format +msgid "literal newline found in data" +msgstr "მონაცემებში აღმოჩენილია ხაზის გადატანის სიმბოლო" + +#: commands/copyfromparse.c:1311 +#, c-format +msgid "unquoted newline found in data" +msgstr "მონაცემებში აღმოჩენილია ხაზის გადატანის სიმბოლო ბრჭყალების გარეშე" + +#: commands/copyfromparse.c:1313 +#, c-format +msgid "Use \"\\n\" to represent newline." +msgstr "ახალი ხაზს წარმოსადგენად გამოიყენეთ \"\\n\"." + +#: commands/copyfromparse.c:1314 +#, c-format +msgid "Use quoted CSV field to represent newline." +msgstr "CSV-ის ველში ახალი ხაზის სიმბოლოს ბრჭყალებში ჩასმა." + +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 +#, c-format +msgid "end-of-copy marker does not match previous newline style" +msgstr "კოპირების-დასასრულის მარკერი წინა ახალი ხაზის სტილს არ ემთხვევა" + +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 +#, c-format +msgid "end-of-copy marker corrupt" +msgstr "კოპირების-დასასრულის სანიშნი დაზიანებულია" + +#: commands/copyfromparse.c:1809 +#, c-format +msgid "unterminated CSV quoted field" +msgstr "\"CSV\"-ის ველის დამხურავი ბრჭყალი არ არსებობს" + +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 +#, c-format +msgid "unexpected EOF in COPY data" +msgstr "\"COPY\"-ის მონაცემებში ნაპოვნია მოულოდნელი EOF" + +#: commands/copyfromparse.c:1894 +#, c-format +msgid "invalid field size" +msgstr "ველის არასწორი ზომა" + +#: commands/copyfromparse.c:1917 +#, c-format +msgid "incorrect binary data format" +msgstr "ბინარულ მონაცემების არასწორი ფორმატი" + +#: commands/copyto.c:234 +#, c-format +msgid "could not write to COPY program: %m" +msgstr "\"COPY\"-ის პროგრამაში ჩაწერის შეცდომა: %m" + +#: commands/copyto.c:239 +#, c-format +msgid "could not write to COPY file: %m" +msgstr "\"COPY\"-ის ფაილში ჩაწერის შეცდომა: %m" + +#: commands/copyto.c:369 +#, c-format +msgid "cannot copy from view \"%s\"" +msgstr "ხედიდან კოპირების შეცდომა: \"%s\"" + +#: 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 "სცადეთ 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 "" + +#: 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:523 +#, c-format +msgid "too many column names were specified" +msgstr "მითითებულია მეტისმეტად ბევრი სვეტის სახელი" + +#: commands/createas.c:546 +#, c-format +msgid "policies not yet implemented for this command" +msgstr "ამ ბრძანებისთვის წესები ჯერ არ არსებობს" + +#: commands/dbcommands.c:812 +#, c-format +msgid "LOCATION is not supported anymore" +msgstr "LOCATION მხარდაჭერილი აღარაა" + +#: commands/dbcommands.c:813 +#, c-format +msgid "Consider using tablespaces instead." +msgstr "მის მაგიერ სჯობს ცხრილის სივრცეები გამოიყენოთ." + +#: commands/dbcommands.c:838 +#, c-format +msgid "OIDs less than %u are reserved for system objects" +msgstr "%u-ზე მცირე OID-ები დაცულია სისტემური ობიექტებისთვის" + +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 +#, c-format +msgid "%d is not a valid encoding code" +msgstr "\"%d\" კოდირების სწორ კოდს არ წარმოადგენს" + +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 +#, c-format +msgid "%s is not a valid encoding name" +msgstr "\"%s\" კოდირების სწორ სახელს არ წარმოადგენს" + +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "ენის უცნობი მომწოდებელი: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 commands/user.c:611 +#, c-format +msgid "invalid connection limit: %d" +msgstr "კავშირის არასწორი ლიმიტი: %d" + +#: commands/dbcommands.c:941 +#, c-format +msgid "permission denied to create database" +msgstr "ბაზის შექმნის წვდომა აკრძალულია" + +#: commands/dbcommands.c:965 +#, c-format +msgid "template database \"%s\" does not exist" +msgstr "შაბლონური ბაზა \"%s\" არ არსებობს" + +#: commands/dbcommands.c:975 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "არასწორი მონაცემთა ბაზის \"%s\" შაბლონად გამოყენება შეუძლებელია" + +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 utils/init/postinit.c:1062 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "არასწორი მონაცემთა ბაზების წასაშლელად გამოიყენეთ ბრძანება DROP DATABASE." + +#: commands/dbcommands.c:987 +#, c-format +msgid "permission denied to copy database \"%s\"" +msgstr "ბაზის (\"%s\") კოპირების წვდომა აკრძალულია" + +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "ბაზის შექმნის არასწორი სტრატეგია \"%s\"" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "სწორი სტრატეგიებია \"wal_log\" და \"file_copy\"." + +#: commands/dbcommands.c:1024 +#, c-format +msgid "invalid server encoding %d" +msgstr "სერვერის არასწორი კოდირება %d" + +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 +#, c-format +msgid "invalid locale name: \"%s\"" +msgstr "ენის არასწორი სახელი: \"%s\"" + +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "მონაცემთა ბაზის კოდირება \"%s\" ICU მომწოდებელთან ერთად მხარდაჭერილი არაა" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "საჭროა ICU ენის მითითება" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU-ის ენის მითითება მანამდე, სანამ ლოკალის მომწოდებელი ICU არაა, შეუძლებელია" + +#: commands/dbcommands.c:1082 +#, c-format +msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +msgstr "ახალი კოდირება (%s) შაბლონის ბაზის (%s) კოდირებასთან თავსებადი არაა" + +#: commands/dbcommands.c:1085 +#, c-format +msgid "Use the same encoding as in the template database, or use template0 as template." +msgstr "გამოიყენეთ იგივე კოდირება, რაც შაბლონის ბაზას გააჩნია, ან შაბლონად template0 გამოიყენეთ." + +#: commands/dbcommands.c:1090 +#, c-format +msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgstr "ახალი კოლაცია (%s) შაბლონის ბაზის (%s) კოლაციასთან თავსებადი არაა" + +#: commands/dbcommands.c:1092 +#, c-format +msgid "Use the same collation as in the template database, or use template0 as template." +msgstr "გამოიყენეთ იგივე კოლაცია, რაც შაბლონის ბაზას გააჩნია, ან შაბლონად template0 გამოიყენეთ." + +#: commands/dbcommands.c:1097 +#, c-format +msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" +msgstr "ახალი LC_TYPE (%s) შაბლონის ბაზის (%s) LC_TYPE-სთან თავსებადი არაა" + +#: commands/dbcommands.c:1099 +#, 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:1104 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "ახალი ლოკალის მომწოდებელი (%s) შაბლონის ბაზის (%s) ლოკალის მომწოდებელს არ ემთხვევა" + +#: commands/dbcommands.c:1106 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "გამოიყენეთ იგივე ლოკალის მომწოდებელი, რაც შაბლონის ბაზას გააჩნია, ან შაბლონად template0 გამოიყენეთ." + +#: commands/dbcommands.c:1115 +#, c-format +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "ახალი ICU ლოკალი (%s) შაბლონის ბაზის (%s) ICU ლოკალთან თავსებადი არაა" + +#: commands/dbcommands.c:1117 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "გამოიყენეთ იგივე ICU ლოკალი, რაც შაბლონის ბაზას გააჩნია, ან შაბლონად template0 გამოიყენეთ." + +#: commands/dbcommands.c:1140 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "შაბლონის ბაზას \"%s\" კოლაცია გააჩნია, მაგრამ ნამდვილი კოლაციის ვერსიის დადგენა შეუძლებელია" + +#: commands/dbcommands.c:1145 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "შაბლონული ბაზის (%s) კოლაციის ვერსია არ ემთხვევა" + +#: commands/dbcommands.c:1147 +#, 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:1150 +#, 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:1186 commands/dbcommands.c:1920 +#, c-format +msgid "pg_global cannot be used as default tablespace" +msgstr "pg_global არ შეიძლება გამოყენებულ იქნას როგორც ნაგულისხმევი ცხრილის სივრცე" + +#: commands/dbcommands.c:1212 +#, c-format +msgid "cannot assign new default tablespace \"%s\"" +msgstr "ცხრილების ახალი ნაგულისხმევი სივრცის \"%s\" მინიჭება შეუძლებელია" + +#: commands/dbcommands.c:1214 +#, c-format +msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." +msgstr "არსებობს კონფლიქტი, რადგან მონაცემთა ბაზას \"%s\" ამ ცხრილების სივრცეში ცხრილები უკვე გააჩნია." + +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 +#, c-format +msgid "database \"%s\" already exists" +msgstr "ბაზა \"%s\" უკვე არსებობს" + +#: commands/dbcommands.c:1258 +#, c-format +msgid "source database \"%s\" is being accessed by other users" +msgstr "საწყის ბაზა %s-სთან ამჟამად სხვა მომხმარებლებიცაა მიერთებული" + +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "ბაზის OID %u უკვე გამოიყენება ბაზის \"%s\" მიერ" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "მონაცემების საქაღალდე მითითებული OID-ით (%u) უკვე არსებობს" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 +#, c-format +msgid "encoding \"%s\" does not match locale \"%s\"" +msgstr "კოდირება (%s) ენას (%s) არ ემთხვევა" + +#: commands/dbcommands.c:1460 +#, c-format +msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." +msgstr "\"LC_CTYPE\"-ის არჩეულ პარამეტრს სჭირდება კოდირება: \"%s\"." + +#: commands/dbcommands.c:1475 +#, c-format +msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." +msgstr "\"LC_COLLATE\"-ის არჩეულ პარამეტრს სჭირდება კოდირება: \"%s\"." + +#: commands/dbcommands.c:1556 +#, c-format +msgid "database \"%s\" does not exist, skipping" +msgstr "მონაცემთა ბაზა \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dbcommands.c:1580 +#, c-format +msgid "cannot drop a template database" +msgstr "შაბლონური ბაზის წაშლა შეუძლებელია" + +#: commands/dbcommands.c:1586 +#, c-format +msgid "cannot drop the currently open database" +msgstr "ღია ბაზის წაშლა შეუძლებელია" + +#: commands/dbcommands.c:1599 +#, c-format +msgid "database \"%s\" is used by an active logical replication slot" +msgstr "ბაზა %s აქტიური ლოგიკური რეპლიკაციის სლოტის მიერ გამოიყენება" + +#: commands/dbcommands.c:1601 +#, c-format +msgid "There is %d active slot." +msgid_plural "There are %d active slots." +msgstr[0] "ხელმისაწვდომია %d აქტიური სლოტი." +msgstr[1] "ხელმისაწვდომია %d აქტიური სლოტი." + +#: commands/dbcommands.c:1615 +#, c-format +msgid "database \"%s\" is being used by logical replication subscription" +msgstr "ბაზა %s ლოგიკური რეპლიკაციის გამოწერის მიერ გამოიყენება" + +#: commands/dbcommands.c:1617 +#, c-format +msgid "There is %d subscription." +msgid_plural "There are %d subscriptions." +msgstr[0] "აღმოჩენილია %d გამოწერა." +msgstr[1] "აღმოჩენილია %d გამოწერა." + +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 commands/dbcommands.c:1942 +#, c-format +msgid "database \"%s\" is being accessed by other users" +msgstr "ბაზა %s-სთან ამჟამად სხვა მომხმარებლებიცაა მიერთებული" + +#: commands/dbcommands.c:1772 +#, c-format +msgid "permission denied to rename database" +msgstr "ბაზის სახელის გადარქმევის წვდომა აკრძალულია" + +#: commands/dbcommands.c:1801 +#, c-format +msgid "current database cannot be renamed" +msgstr "მიმდინარე ბაზის სახელის გადარქმევა შეუძლებელია" + +#: commands/dbcommands.c:1898 +#, c-format +msgid "cannot change the tablespace of the currently open database" +msgstr "ღია ბაზის ცხრილების სივრცის შეცვლა შეუძლებელია" + +#: commands/dbcommands.c:2004 +#, c-format +msgid "some relations of database \"%s\" are already in tablespace \"%s\"" +msgstr "ბაზის (%s) ზოგიერთი ურთიერთობა ცხრილების სივრცეში \"%s\" უკვე იმყოფება" + +#: commands/dbcommands.c:2006 +#, c-format +msgid "You must move them back to the database's default tablespace before using this command." +msgstr "ამ ბრძანების გამოყენებამდე ბაზის ნაგულისხმევ ცხრილების სივრცეში უნდა დაბრუნდეთ." + +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 commands/dbcommands.c:3152 commands/dbcommands.c:3266 +#, c-format +msgid "some useless files may be left behind in old database directory \"%s\"" +msgstr "ძველი ბაზის საქაღალდეში \"%s\" შეიძლება რამდენიმე გამოუსადეგარი ფაილი დარჩა" + +#: commands/dbcommands.c:2194 +#, c-format +msgid "unrecognized DROP DATABASE option \"%s\"" +msgstr "\"DROP DATABASE\"-ის უცნობი პარამეტრი \"%s\"" + +#: commands/dbcommands.c:2272 +#, c-format +msgid "option \"%s\" cannot be specified with other options" +msgstr "პარამეტრის \"%s\" მითითება სხვა პარამეტრებთან ერთად აკრძალულია" + +#: commands/dbcommands.c:2319 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "არასწორი ბაზის (\"%s\") შეცვლა შეუძლებელია" + +#: commands/dbcommands.c:2336 +#, c-format +msgid "cannot disallow connections for current database" +msgstr "მიმდინარე ბაზასთან დაკავშირების უარყოფა შეუძლებელია" + +#: commands/dbcommands.c:2555 +#, c-format +msgid "permission denied to change owner of database" +msgstr "ბაზის მფლობელის შეცვლის წვდომა აკრძალულია" + +#: commands/dbcommands.c:2958 +#, c-format +msgid "There are %d other session(s) and %d prepared transaction(s) using the database." +msgstr "ამ ბაზას %d სხვა სესია და %d მომზადებული ტრანზაქცია იყენებს." + +#: commands/dbcommands.c:2961 +#, 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:2966 storage/ipc/procarray.c:3848 +#, 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/dbcommands.c:3108 +#, c-format +msgid "missing directory \"%s\"" +msgstr "ნაკლული საქაღალდე \"%s\"" + +#: commands/dbcommands.c:3168 commands/tablespace.c:190 commands/tablespace.c:654 +#, c-format +msgid "could not stat directory \"%s\": %m" +msgstr "საქაღალდის \"%s\" პოვნა შეუძლებელია: %m" + +#: commands/define.c:54 commands/define.c:258 commands/define.c:290 commands/define.c:318 commands/define.c:364 +#, c-format +msgid "%s requires a parameter" +msgstr "%s მოითხოვს პარამეტრს" + +#: commands/define.c:87 commands/define.c:98 commands/define.c:192 commands/define.c:210 commands/define.c:225 commands/define.c:243 +#, c-format +msgid "%s requires a numeric value" +msgstr "%s მოითხოვს რიცხვით მნიშვნელობას" + +#: commands/define.c:154 +#, c-format +msgid "%s requires a Boolean value" +msgstr "%s მოითხოვს ლოგიკურ მნიშვნელობას" + +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 +#, c-format +msgid "%s requires an integer value" +msgstr "%s-ის მნიშვნელობა მთელი რიცხვი უნდა იყოს" + +#: commands/define.c:272 +#, c-format +msgid "argument of %s must be a name" +msgstr "%s-ის არგუმენტი სახელი უნდა იყოს" + +#: commands/define.c:302 +#, c-format +msgid "argument of %s must be a type name" +msgstr "%s-ის არგუმენტი ტიპის სახელი უნდა იყოს" + +#: commands/define.c:348 +#, c-format +msgid "invalid argument for %s: \"%s\"" +msgstr "%s-ის არასწორი არგუმენტი: \"%s\"" + +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 utils/adt/ruleutils.c:2928 +#, c-format +msgid "\"%s\" is an aggregate function" +msgstr "\"%s\" აგრეგატული ფუნქციაა" + +#: commands/dropcmds.c:102 +#, c-format +msgid "Use DROP AGGREGATE to drop aggregate functions." +msgstr "აგრეგირებული ფუნქციების წასაშლელად გამოიყენეთ DROP AGGREGATE." + +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 commands/tablecmds.c:3771 commands/tablecmds.c:3823 commands/tablecmds.c:16487 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:1278 +#, c-format +msgid "schema \"%s\" does not exist, skipping" +msgstr "სქემა \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 +#, c-format +msgid "type \"%s\" does not exist, skipping" +msgstr "ტიპი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:257 +#, c-format +msgid "access method \"%s\" does not exist, skipping" +msgstr "წვდომის მეთოდი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:275 +#, c-format +msgid "collation \"%s\" does not exist, skipping" +msgstr "კოლაცია \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:282 +#, c-format +msgid "conversion \"%s\" does not exist, skipping" +msgstr "გადაყვანა\"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:293 commands/statscmds.c:655 +#, c-format +msgid "statistics object \"%s\" does not exist, skipping" +msgstr "სტატისტიკის ობიექტი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:300 +#, c-format +msgid "text search parser \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:307 +#, c-format +msgid "text search dictionary \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის ლექსიკონი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:314 +#, c-format +msgid "text search template \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის შაბლონი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:321 +#, c-format +msgid "text search configuration \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის კონფიგურაცია \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:326 +#, c-format +msgid "extension \"%s\" does not exist, skipping" +msgstr "გაფართოება \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:336 +#, c-format +msgid "function %s(%s) does not exist, skipping" +msgstr "ფუნქცია %s (%s) არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:349 +#, c-format +msgid "procedure %s(%s) does not exist, skipping" +msgstr "პროცედურა %s (%s) არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:362 +#, c-format +msgid "routine %s(%s) does not exist, skipping" +msgstr "ქვეპროგრამა %s (%s) არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:375 +#, c-format +msgid "aggregate %s(%s) does not exist, skipping" +msgstr "აგრეგატი %s (%s) არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:388 +#, c-format +msgid "operator %s does not exist, skipping" +msgstr "ოპერატორი %s არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:394 +#, c-format +msgid "language \"%s\" does not exist, skipping" +msgstr "ენა \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:403 +#, c-format +msgid "cast from type %s to type %s does not exist, skipping" +msgstr "დაკასტვა ტიპიდან %s ტიპამდე %s არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:412 +#, c-format +msgid "transform for type %s language \"%s\" does not exist, skipping" +msgstr "გადაყვანა ტიპისთვის %s ენა \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:420 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "ურთიერთობისთვის \"%2$s\" ტრიგერი \"%1$s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:429 +#, c-format +msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "ურთიერთობისთვის \"%2$s\" წესი \"%1$s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:436 +#, c-format +msgid "event trigger \"%s\" does not exist, skipping" +msgstr "მოვლენის ტრიგერი (\"%s\") არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:442 +#, c-format +msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "წესი %s ურთიერთობისთვის \"%s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:449 +#, c-format +msgid "foreign-data wrapper \"%s\" does not exist, skipping" +msgstr "გარე მონაცემების გადამტანი \"%s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#, c-format +msgid "server \"%s\" does not exist, skipping" +msgstr "სერვერი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/dropcmds.c:462 +#, c-format +msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" +msgstr "ოპერატორის კლასი \"%s\" წვდომის მეთოდისთვის \"%s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:474 +#, c-format +msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" +msgstr "ოპერატორების ოჯახი \"%s\" წვდომის მეთოდისთვის \"%s\" არ არსებობს. გამოტოვება" + +#: commands/dropcmds.c:481 +#, c-format +msgid "publication \"%s\" does not exist, skipping" +msgstr "გამოცემა \"%s\" არ არსებობს, გამოტოვება" + +#: commands/event_trigger.c:125 +#, c-format +msgid "permission denied to create event trigger \"%s\"" +msgstr "მოვლენის ტრიგერის (\"%s\") შექმნის წვდომა აკრძალულია" + +#: commands/event_trigger.c:127 +#, c-format +msgid "Must be superuser to create an event trigger." +msgstr "მოვლენის ტრიგერის შესაქმნელად საჭიროა ზემომხმარებლის პრივილეგიები." + +#: commands/event_trigger.c:136 +#, c-format +msgid "unrecognized event name \"%s\"" +msgstr "მოვლენის უცნობი სახელი \"%s\"" + +#: commands/event_trigger.c:153 +#, c-format +msgid "unrecognized filter variable \"%s\"" +msgstr "ფილტრის უცნობი ცვლადი \"%s\"" + +#: commands/event_trigger.c:207 +#, c-format +msgid "filter value \"%s\" not recognized for filter variable \"%s\"" +msgstr "ფილტრის მნიშვნელობა \"%s\" ფილტრის ცვლადისთვის \"%s\" უცნობია" + +#. translator: %s represents an SQL statement name +#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#, c-format +msgid "event triggers are not supported for %s" +msgstr "მოვლენის ტრიგერები %s-ისთვის მხარდაჭერილი არაა" + +#: commands/event_trigger.c:248 +#, c-format +msgid "filter variable \"%s\" specified more than once" +msgstr "ფილტრის ცვლადი ერთზე მეტჯერაა მითითებული: %s" + +#: 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:483 +#, c-format +msgid "permission denied to change owner of event trigger \"%s\"" +msgstr "მოვლენის ტრიგერის მფლობელის შეცვლის წვდომა აკრძალულია: %s" + +#: commands/event_trigger.c:485 +#, c-format +msgid "The owner of an event trigger must be a superuser." +msgstr "მოვლენის ტრიგერის მფლობელი ზემომხმარებელი უნდა იყოს." + +#: 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: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:1834 +#, c-format +msgid "%s can only be called in an event trigger function" +msgstr "%s-ის გამოძახება მხოლოდ მოვლენის ტრიგერის ფუნქციიდან შეგიძლიათ" + +#: commands/explain.c:218 +#, c-format +msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgstr "\"EXPLAIN\"-ის უცნობი პარამეტრი \"%s\": \"%s\"" + +#: commands/explain.c:225 +#, c-format +msgid "unrecognized EXPLAIN option \"%s\"" +msgstr "\"EXPLAIN\"-ის უცნობი პარამეტრი \"%s\"" + +#: commands/explain.c:233 +#, c-format +msgid "EXPLAIN option WAL requires ANALYZE" +msgstr "EXPLAIN -ის პარამეტრ WAL-ს ANALYZE სჭირდება" + +#: commands/explain.c:242 +#, c-format +msgid "EXPLAIN option TIMING requires ANALYZE" +msgstr "EXPLAIN -ის პარამეტრ TIMING-ს ANALYZE სჭირდება" + +#: commands/extension.c:173 commands/extension.c:2954 +#, c-format +msgid "extension \"%s\" does not exist" +msgstr "გაფართოება %s არ არსებობს" + +#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 commands/extension.c:303 +#, c-format +msgid "invalid extension name: \"%s\"" +msgstr "გაფართოების არასწორი სახელი: \"%s\"" + +#: commands/extension.c:273 +#, c-format +msgid "Extension names must not be empty." +msgstr "გაფართოების სახელები ცარიელი არ უნდა იყოს." + +#: commands/extension.c:282 +#, c-format +msgid "Extension names must not contain \"--\"." +msgstr "გაფართოების სახელები არ უნდა შეიცავდეს \"---\"." + +#: commands/extension.c:294 +#, c-format +msgid "Extension names must not begin or end with \"-\"." +msgstr "გაფართოების სახელები არ უნდა დაიწყოს ან დასრულდეს \"-\"." + +#: commands/extension.c:304 +#, c-format +msgid "Extension names must not contain directory separator characters." +msgstr "გაფართოების სახელები არ უნდა შეიცავდეს საქაღალდის გამყოფი სიმბოლოს." + +#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 commands/extension.c:347 +#, c-format +msgid "invalid extension version name: \"%s\"" +msgstr "გაფართოების არასწორი ვერსია: \"%s\"" + +#: commands/extension.c:320 +#, c-format +msgid "Version names must not be empty." +msgstr "ვერსიის სახელები არ უნდა იყოს ცარიელი." + +#: commands/extension.c:329 +#, c-format +msgid "Version names must not contain \"--\"." +msgstr "ვერსიის სახელები არ უნდა შეიცავდეს \"---\"." + +#: commands/extension.c:338 +#, c-format +msgid "Version names must not begin or end with \"-\"." +msgstr "ვერსიის სახელები არ უნდა დაიწყოს ან დასრულდეს \"-\"." + +#: commands/extension.c:348 +#, c-format +msgid "Version names must not contain directory separator characters." +msgstr "ვერსიის სახელები არ უნდა შეიცავდეს საქაღალდის გამყოფ სიმბოლოებს." + +#: 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:531 commands/extension.c:541 +#, c-format +msgid "parameter \"%s\" cannot be set in a secondary extension control file" +msgstr "პარამეტრს \"%s\" მეორადი გაფართოების კონტროლის ფაილში ვერ დააყენებთ" + +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 utils/misc/guc.c:7380 +#, c-format +msgid "parameter \"%s\" requires a Boolean value" +msgstr "პარამეტრს %s ლოგიკური მნიშვნელობა სჭირდება" + +#: commands/extension.c:588 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" კოდირების სწორ სახელს არ წარმოადგენს" + +#: commands/extension.c:602 +#, c-format +msgid "parameter \"%s\" must be a list of extension names" +msgstr "პარამეტრი \"%s\" გაფართოებების სახელების სიას უნდა შეიცავდეს" + +#: commands/extension.c:609 +#, c-format +msgid "unrecognized parameter \"%s\" in file \"%s\"" +msgstr "უცნობი პარამეტრი \"%s\" ფაილში \"%s\"" + +#: commands/extension.c:618 +#, c-format +msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" +msgstr "როცა \"relocatable\" ჭეშმარიტია, პარამეტრს \"schema\" ვერ მიუთითებთ" + +#: commands/extension.c:796 +#, c-format +msgid "transaction control statements are not allowed within an extension script" +msgstr "გაფართოების სკრიპტში ტრანზაქციის კონტროლის გამოსახულებები დაშვებული არაა" + +#: commands/extension.c:873 +#, c-format +msgid "permission denied to create extension \"%s\"" +msgstr "გაფართოების (\"%s\") შექმნის წვდომა აკრძალულა" + +#: commands/extension.c:876 +#, c-format +msgid "Must have CREATE privilege on current database to create this extension." +msgstr "ამ გაფართოების შესაქმნელად აუცილებელია მიმდინარე ბაზაზე პრივილეგია CREATE-ის ქონა." + +#: commands/extension.c:877 +#, c-format +msgid "Must be superuser to create this extension." +msgstr "გაფართოების შესაქმნელად საჭიროა ზემომხმარებლის უფლებები." + +#: commands/extension.c:881 +#, c-format +msgid "permission denied to update extension \"%s\"" +msgstr "გაფართოების (\"%s\") განახლების წვდომა აკრძალულია" + +#: commands/extension.c:884 +#, c-format +msgid "Must have CREATE privilege on current database to update this extension." +msgstr "ამ გაფართოების განახლებისთვის აუცილებელია მიმდინარე ბაზაზე პრივილეგია CREATE-ის ქონა." + +#: commands/extension.c:885 +#, c-format +msgid "Must be superuser to update this extension." +msgstr "გაფართოების გასაახლებლად საჭიროა ზემომხმარებლის უფლებები." + +#: commands/extension.c:1018 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "არასწორი სიმბოლო გაფართოების მფლობელში: არ უნდა შეიცავდეს სიმბოლოებს სიიდან \"%s\"" + +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "არასწორი სიმბოლო გაფართოებაში \"%s\": სქემა: არ უნდა შეიცავდეს სიმბოლოებს სიიდან \"%s\"" + +#: commands/extension.c:1237 +#, c-format +msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" +msgstr "გაფართოებას \"%s\" ვერსიიდან \"%s\" ვერსიამდე \"%s\" განახლების ბილიკი არ გააჩნია" + +#: commands/extension.c:1445 commands/extension.c:3012 +#, c-format +msgid "version to install must be specified" +msgstr "საჭიროა დასაყენებელი ვერსიის მითითება" + +#: commands/extension.c:1482 +#, c-format +msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" +msgstr "გაფართოებას \"%s\" ვერსიისთვის \"%s\" არც დაყენების სკრიპტი გააჩნია, არც განახლების ბილიკი" + +#: commands/extension.c:1516 +#, c-format +msgid "extension \"%s\" must be installed in schema \"%s\"" +msgstr "გაფართოება \"%s\" დაყენებული უნდა იყოს სქემაში \"%s\"" + +#: commands/extension.c:1676 +#, c-format +msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" +msgstr "აღმოჩენილია ციკლური დამოკიდებულებები \"%s\" და \"%s\" გაფართოებებს შორის" + +#: commands/extension.c:1681 +#, c-format +msgid "installing required extension \"%s\"" +msgstr "მოთხოვნილი გაფართოების დაყენება: \"%s\"" + +#: commands/extension.c:1704 +#, c-format +msgid "required extension \"%s\" is not installed" +msgstr "მოთხოვნილი გაფართოება დაყენებული არაა: %s" + +#: commands/extension.c:1707 +#, c-format +msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." +msgstr "საჭირო გაფართოებების დასაყენებლად გამოიყენეთ CREATE EXTENSION ... CASCADE." + +#: commands/extension.c:1742 +#, c-format +msgid "extension \"%s\" already exists, skipping" +msgstr "გაფართოება \"%s\" უკვე არსებობს, გამოტოვება" + +#: commands/extension.c:1749 +#, c-format +msgid "extension \"%s\" already exists" +msgstr "გაფართოება \"%s\" უკვე არსებობს" + +#: commands/extension.c:1760 +#, c-format +msgid "nested CREATE EXTENSION is not supported" +msgstr "ჩადგმული CREATE EXTENSION მხარდაუჭერელია" + +#: commands/extension.c:1924 +#, c-format +msgid "cannot drop extension \"%s\" because it is being modified" +msgstr "გაფართოების \"%s\" წაშლა შეუძლებელია, რადგან მიმდინარეობს მისი ჩასწორება" + +#: commands/extension.c:2401 +#, c-format +msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" +msgstr "%s-ის გამოძახება მხოლოდ CREATE EXTENSION-ის მიერ შესრულებულ SQL სკრიპტიდან შეგიძლიათ" + +#: commands/extension.c:2413 +#, c-format +msgid "OID %u does not refer to a table" +msgstr "OID %u ცხრილს არ ეხება" + +#: commands/extension.c:2418 +#, c-format +msgid "table \"%s\" is not a member of the extension being created" +msgstr "ცხრილი (%s) არ წარმოადგენს იმ გაფართოების წევრს, რომლის შექმნაც მიმდინარეობს" + +#: commands/extension.c:2772 +#, c-format +msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" +msgstr "გაფართოების (\"%s\") სქემაში (\"%s\") გადატანა შეუძლებელია იმიტომ, რომ გაფართოება სქემას შეიცავს" + +#: commands/extension.c:2813 commands/extension.c:2873 +#, c-format +msgid "extension \"%s\" does not support SET SCHEMA" +msgstr "გაფართოებას SET SCHEMA-ის მხარდაჭერა არ გააჩნია: %s" + +#: commands/extension.c:2875 +#, c-format +msgid "%s is not in the extension's schema \"%s\"" +msgstr "%s არ წარმოადგენს გაფართოების სქემას \"%s\"" + +#: commands/extension.c:2934 +#, c-format +msgid "nested ALTER EXTENSION is not supported" +msgstr "ჩადგმული ALTER EXTENSION მხარდაუჭერელია" + +#: commands/extension.c:3023 +#, c-format +msgid "version \"%s\" of extension \"%s\" is already installed" +msgstr "გაფართოების %2$s ვერსია %1$s უკვე დაყენებულია" + +#: commands/extension.c:3235 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "ამ ტიპის ობიექტის გაფართოებაზე დამატება შეუძლებელია" + +#: commands/extension.c:3301 +#, c-format +msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" +msgstr "სქემის (\"%s\") გაფართოებაში (\"%s\") ჩამატება შეუძლებელია, რადგან სქემა გაფართოებას შეიცავს" + +#: commands/extension.c:3395 +#, c-format +msgid "file \"%s\" is too large" +msgstr "%s: ფაილი ძალიან დიდია" + +#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#, c-format +msgid "option \"%s\" not found" +msgstr "პარამეტრი \"%s\" არ არსებობს" + +#: commands/foreigncmds.c:167 +#, c-format +msgid "option \"%s\" provided more than once" +msgstr "პარამეტრი ერთზე მეტჯერაა მითითებული: \"%s\"" + +#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#, c-format +msgid "permission denied to change owner of foreign-data wrapper \"%s\"" +msgstr "გარე მონაცემების გადამტანის მფლობელის შეცვლის წვდომა აკრძალულია : \"%s\"" + +#: commands/foreigncmds.c:223 +#, c-format +msgid "Must be superuser to change owner of a foreign-data wrapper." +msgstr "გარე მონაცემების გადამტანის მფლობელის შეცვლას ზემომხმარებლის წვდომები სჭირდება." + +#: commands/foreigncmds.c:231 +#, c-format +msgid "The owner of a foreign-data wrapper must be a superuser." +msgstr "გარე მონაცემების გადამტანის მფლობელი ზემომხმარებელი უნდა იყოს." + +#: 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:580 +#, c-format +msgid "permission denied to create foreign-data wrapper \"%s\"" +msgstr "გარე მონაცემების გადამტანის შექმნის წვდომა აკრძალულია: %s" + +#: commands/foreigncmds.c:582 +#, c-format +msgid "Must be superuser to create a foreign-data wrapper." +msgstr "გარე მონაცემების გადამტანის შესაქმნელად ზემომხმარებელი უნდა ბრძანდებოდეთ." + +#: commands/foreigncmds.c:697 +#, c-format +msgid "permission denied to alter foreign-data wrapper \"%s\"" +msgstr "გარე მონაცემების გადამტანის შეცვლის წვდომა აკრძალულია: %s" + +#: commands/foreigncmds.c:699 +#, c-format +msgid "Must be superuser to alter a foreign-data wrapper." +msgstr "გარე მონაცემების გადამტანის შესაცვლელად ზემომხმარებელი უნდა ბრძანდებოდეთ." + +#: commands/foreigncmds.c:730 +#, c-format +msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" +msgstr "გარე მონაცემების გადამტანის დამმუშავებლის შეცვლას შეუძლია არსებული გარე ცხრილების ქცევა შეცვალოს" + +#: 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:876 +#, c-format +msgid "server \"%s\" already exists, skipping" +msgstr "სერვერი \"%s\" უკვე არსებობს, გამოტოვება" + +#: commands/foreigncmds.c:1144 +#, c-format +msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" +msgstr "მომხმარებლის ბმა %s სერვერისთვის %s უკვე არსებობს. გამოტოვება" + +#: commands/foreigncmds.c:1154 +#, c-format +msgid "user mapping for \"%s\" already exists for server \"%s\"" +msgstr "მომხმარებლის ბმა %s სერვერისთვის %s უკვე არსებობს" + +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#, c-format +msgid "user mapping for \"%s\" does not exist for server \"%s\"" +msgstr "მომხმარებლის ბმა %s სერვერისთვის %s არ არსებობს" + +#: commands/foreigncmds.c:1379 +#, c-format +msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" +msgstr "მომხმარებლის ბმა %s სერვერისთვის %s არ არსებობს, გამოტოვება" + +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 +#, c-format +msgid "foreign-data wrapper \"%s\" has no handler" +msgstr "გარე-მონაცემების გადამტანს დამმუშავებელი არ გააჩნია: %s" + +#: commands/foreigncmds.c:1513 +#, c-format +msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" +msgstr "გარე მონაცემების გადამტანს IMPORT FOREIGN SCHEMA-ის მხარდაჭერა არ გააჩნია: %s" + +#: commands/foreigncmds.c:1615 +#, c-format +msgid "importing foreign table \"%s\"" +msgstr "გარე ცხრილის შემოტანა (\"%s\")" + +#: commands/functioncmds.c:109 +#, c-format +msgid "SQL function cannot return shell type %s" +msgstr "SQL ფუნქციებს %s გარსის ტიპის დაბრუნება არ შეუძლიათ" + +#: commands/functioncmds.c:114 +#, c-format +msgid "return type %s is only a shell" +msgstr "დაბრუნებადი ტიპი %s ცარიელია" + +#: 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:150 +#, c-format +msgid "type \"%s\" is not yet defined" +msgstr "ტიპი \"%s\" ჯერ არ არის განსაზღვრული" + +#: commands/functioncmds.c:151 +#, c-format +msgid "Creating a shell type definition." +msgstr "გარსის ტიპის აღწერის შექმნა." + +#: commands/functioncmds.c:250 +#, c-format +msgid "SQL function cannot accept shell type %s" +msgstr "SQL ფუნქციებს %s გარსის ტიპის მიღება არ შეუძლიათ" + +#: commands/functioncmds.c:256 +#, c-format +msgid "aggregate cannot accept shell type %s" +msgstr "აგრეგატს არ შეუძლია ცარიელი ტიპის მიღება: %s" + +#: commands/functioncmds.c:261 +#, c-format +msgid "argument type %s is only a shell" +msgstr "არგუმენტის ტიპი %s მხოლოდ გარსია" + +#: commands/functioncmds.c:271 +#, c-format +msgid "type %s does not exist" +msgstr "ტიპი \"%s\" არ არსებობს" + +#: commands/functioncmds.c:285 +#, c-format +msgid "aggregates cannot accept set arguments" +msgstr "აგრეგატებს არგუმენტების სეტის მიღება არ შეუძლიათ" + +#: commands/functioncmds.c:289 +#, c-format +msgid "procedures cannot accept set arguments" +msgstr "პროცედურებს არგუმენტების სეტის მიღება არ შეუძლიათ" + +#: commands/functioncmds.c:293 +#, c-format +msgid "functions cannot accept set arguments" +msgstr "ფუნქციებს არგუმენტების სეტის მიღება არ შეუძლიათ" + +#: commands/functioncmds.c:303 +#, c-format +msgid "VARIADIC parameter must be the last input parameter" +msgstr "VARIADIC პარამეტრი ბოლო შეყვანის პარამეტრი უნდა იყოს" + +#: 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:393 +#, c-format +msgid "parameter name \"%s\" used more than once" +msgstr "პარამეტრის სახელი \"%s\" ერთზე მეტჯერ გამოიყენება" + +#: commands/functioncmds.c:411 +#, c-format +msgid "only input parameters can have default values" +msgstr "ნაგულისხმევი მნიშვნელობების დაყენება მხოლოდ შემომავალ პარამეტრებზეა შესაძლებელი" + +#: commands/functioncmds.c:426 +#, c-format +msgid "cannot use table references in parameter default value" +msgstr "ცხრილის ბმის პარამეტრის ნაგულისხმევ მნიშვნელობად გამოყენება შეუძლებელია" + +#: commands/functioncmds.c:450 +#, c-format +msgid "input parameters after one with a default value must also have defaults" +msgstr "შეყვანის პარამეტრებში, მას შემდეგ, რაც ერთს აქვს ნაგულისხმევი მნიშვნელობა, ის სხვებსაც უნდა ჰქონდეთ" + +#: commands/functioncmds.c:460 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "პროცედური OUT პარამეტრები ვერ გამოჩნდება ერთის შემდეგ, რომელსაც ნაგულისხმევი მნიშვნელობა გააჩნია" + +#: commands/functioncmds.c:605 commands/functioncmds.c:784 +#, c-format +msgid "invalid attribute in procedure definition" +msgstr "პროცედურის აღწერაში ნაპოვნია არასწორი ატრიბუტი" + +#: commands/functioncmds.c:701 +#, c-format +msgid "support function %s must return type %s" +msgstr "მხარდაჭერის ფუნქციამ (%s) უნდა დააბრუნოს ტიპი %s" + +#: commands/functioncmds.c:712 +#, c-format +msgid "must be superuser to specify a support function" +msgstr "მხარდაჭერის ფუნქციის მისათითებლად ზემომხმარებლის წვდომელია საჭირო" + +#: 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:875 +#, c-format +msgid "duplicate function body specified" +msgstr "მითითებულია ფუნქციის დუბლირებული ტანი" + +#: commands/functioncmds.c:880 +#, c-format +msgid "inline SQL function body only valid for language SQL" +msgstr "" + +#: commands/functioncmds.c:922 +#, c-format +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 ბრჭყალგარეშე SQL ფუნქციის სხეულში ჯერ მხარდაჭერილი არაა" + +#: commands/functioncmds.c:995 +#, c-format +msgid "only one AS item needed for language \"%s\"" +msgstr "ენისთვის მხოლოდ ერთი AS არის საჭირო: %s" + +#: 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:1110 commands/functioncmds.c:2111 +#, c-format +msgid "Use CREATE EXTENSION to load the language into the database." +msgstr "ენის ბაზაში შესატვირთად გამოიყენეთ CREATE EXTENSION." + +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 +#, c-format +msgid "only superuser can define a leakproof function" +msgstr "leakproof ატრიბუტის მქონე ფუნქციის აღწერა მხოლოდ ზემომხმარებელს შეუძლია" + +#: commands/functioncmds.c:1196 +#, c-format +msgid "function result type must be %s because of OUT parameters" +msgstr "\"OUT\" პარამეტრების გამო ფუნქციის შედეგის ტიპი %s უნდა იყოს" + +#: commands/functioncmds.c:1209 +#, c-format +msgid "function result type must be specified" +msgstr "ფუნქციის შედეგის ტიპის მითითება აუცილებელია" + +#: 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:1552 +#, c-format +msgid "source data type %s is a pseudo-type" +msgstr "საწყისი მონაცემთა ტიპი %s ფსევდო ტიპია" + +#: commands/functioncmds.c:1558 +#, c-format +msgid "target data type %s is a pseudo-type" +msgstr "საბოლოო მონაცემთა ტიპი %s ფსევდო ტიპია" + +#: commands/functioncmds.c:1582 +#, c-format +msgid "cast will be ignored because the source data type is a domain" +msgstr "მოხდება გარდაქმნის დაიგნორება იმის გამო, რომ მონაცემების საწყისი ტიპი დომენს წარმოადგენს" + +#: commands/functioncmds.c:1587 +#, c-format +msgid "cast will be ignored because the target data type is a domain" +msgstr "მოხდება გარდაქმნის დაიგნორება იმის გამო, რომ მონაცემების სამიზნე ტიპი დომენს წარმოადგენს" + +#: commands/functioncmds.c:1612 +#, c-format +msgid "cast function must take one to three arguments" +msgstr "გარდაქმნის ფუნქციამ ერთიდან სამ არგუმენტამდე უნდა მიიღოს" + +#: 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:1620 +#, c-format +msgid "second argument of cast function must be type %s" +msgstr "გარდაქმნის ფუნქციის მეორე არგუმენტის ტიპი %s უნდა იყოს" + +#: commands/functioncmds.c:1625 +#, c-format +msgid "third argument of cast function must be type %s" +msgstr "გარდაქმნის ფუნქციის მესამე არგუმენტის ტიპი %s უნდა იყოს" + +#: 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:1641 +#, c-format +msgid "cast function must not be volatile" +msgstr "გარდაქმნის ფუნქცია ცვალებადი არ უნდა იყოს" + +#: commands/functioncmds.c:1646 +#, c-format +msgid "cast function must be a normal function" +msgstr "გარდაქმნის ფუნქცია ნორმალური ფუნქცია უნდა იყოს" + +#: commands/functioncmds.c:1650 +#, c-format +msgid "cast function must not return a set" +msgstr "გარდაქმნის ფუნქციამ სეტი არ უნდა დააბრუნოს" + +#: commands/functioncmds.c:1676 +#, c-format +msgid "must be superuser to create a cast WITHOUT FUNCTION" +msgstr "\"WITHOUT FUNCTION\"-ის გარდაქმნის შესაქმნელად ზეომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/functioncmds.c:1691 +#, c-format +msgid "source and target data types are not physically compatible" +msgstr "საწყისი და სამიზნე მონაცემის ტიპები ფიზიკურად შეუთავსებელია" + +#: commands/functioncmds.c:1706 +#, c-format +msgid "composite data types are not binary-compatible" +msgstr "მონაცემების კომპოზიტური ტიპები შეუთავსებელია ორობით დონეზე" + +#: commands/functioncmds.c:1712 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "მონაცემების ჩამონათვალის ტიპები შეუთავსებელია ორობით დონეზე" + +#: commands/functioncmds.c:1718 +#, c-format +msgid "array data types are not binary-compatible" +msgstr "მასივის მონაცემების ტიპები შეუთავსებელია ორობით დონეზე" + +#: commands/functioncmds.c:1735 +#, c-format +msgid "domain data types must not be marked binary-compatible" +msgstr "დომენის მონაცემების ტიპები შეუთავსებელია ორობით დონეზე" + +#: commands/functioncmds.c:1745 +#, c-format +msgid "source data type and target data type are the same" +msgstr "საწყისი და სამიზნე მონაცემების ტიპები ერთი და იგივეა" + +#: commands/functioncmds.c:1778 +#, c-format +msgid "transform function must not be volatile" +msgstr "გარდაქმნის ფუნქცია ცვალებადი არ უნდა იყოს" + +#: commands/functioncmds.c:1782 +#, c-format +msgid "transform function must be a normal function" +msgstr "გარდაქმნის ფუნქცია ნორმალური ფუნქცია უნდა იყოს" + +#: commands/functioncmds.c:1786 +#, c-format +msgid "transform function must not return a set" +msgstr "გარდაქმნის ფუნქციამ სეტი არ უნდა დააბრუნოს" + +#: commands/functioncmds.c:1790 +#, c-format +msgid "transform function must take one argument" +msgstr "გარდაქმნის ფუნქციამ ერთი არგუმენტი უნდა მიიღოს" + +#: commands/functioncmds.c:1794 +#, c-format +msgid "first argument of transform function must be type %s" +msgstr "გარდაქმნის ფუნქციის პირველი არგუმენტის ტიპი %s უნდა იყოს" + +#: commands/functioncmds.c:1833 +#, c-format +msgid "data type %s is a pseudo-type" +msgstr "მონაცემთა ტიპი %s ფსევდო ტიპია" + +#: commands/functioncmds.c:1839 +#, c-format +msgid "data type %s is a domain" +msgstr "მონაცემების ტიპი %s დომენია" + +#: commands/functioncmds.c:1879 +#, c-format +msgid "return data type of FROM SQL function must be %s" +msgstr "\"FROM SQL\" ფუნქციის დაბრუნებული მონაცემები აუცილებლად უნდა იყოს: %s" + +#: commands/functioncmds.c:1905 +#, c-format +msgid "return data type of TO SQL function must be the transform data type" +msgstr "" + +#: commands/functioncmds.c:1934 +#, c-format +msgid "transform for type %s language \"%s\" already exists" +msgstr "გადაყვანა ტიპისთვის %s ენა \"%s\" უკვე არსებობს" + +#: commands/functioncmds.c:2021 +#, c-format +msgid "transform for type %s language \"%s\" does not exist" +msgstr "გადაყვანა ტიპისთვის %s ენა \"%s\" არ არსებობს" + +#: commands/functioncmds.c:2045 +#, c-format +msgid "function %s already exists in schema \"%s\"" +msgstr "ფუნქცია (%s) სქემაში (%s) უკვე არსებობს" + +#: commands/functioncmds.c:2096 +#, c-format +msgid "no inline code specified" +msgstr "ჩადგმული კოდი მითითებული არაა" + +#: commands/functioncmds.c:2142 +#, c-format +msgid "language \"%s\" does not support inline code execution" +msgstr "" + +#: 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:634 +#, c-format +msgid "must specify at least one column" +msgstr "უნდა მიეთითოს მინიმუმ ერთი სვეტი" + +#: commands/indexcmds.c:638 +#, c-format +msgid "cannot use more than %d columns in an index" +msgstr "ინდექსში %d სვეტზე მეტს ვერ გამოიყენებთ" + +#: commands/indexcmds.c:681 +#, c-format +msgid "cannot create index on relation \"%s\"" +msgstr "ურთიერთბაზე \"%s\" ინდექსის შექმნა შეიძლებელია" + +#: commands/indexcmds.c:707 +#, c-format +msgid "cannot create index on partitioned table \"%s\" concurrently" +msgstr "ინდექსს დაყოფილ ცხრილზე %s პარალელურად ვერ შექმნით" + +#: commands/indexcmds.c:712 +#, c-format +msgid "cannot create exclusion constraints on partitioned table \"%s\"" +msgstr "დაყოფილ ცხრილზე (\"%s\") ექსკლუზიური შეზღუდვების შექმნა შეუძლებელია" + +#: commands/indexcmds.c:722 +#, c-format +msgid "cannot create indexes on temporary tables of other sessions" +msgstr "სხვა სესიების დროებითი ცხრილებზე ინდექსების შექმნა შეუძლებელია" + +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 +#, c-format +msgid "cannot specify default tablespace for partitioned relations" +msgstr "დაყოფილი ურთიერთობებისთვის ნაგულისხმევი ცხრილის სივრცეების მითითება შეუძლებელია" + +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 +#, c-format +msgid "only shared relations can be placed in pg_global tablespace" +msgstr "pg_global ცხრილის სივრცეში მხოლოდ გაზიარებული ურთიერთობების მოთავსება შეგიძლიათ" + +#: commands/indexcmds.c:825 +#, c-format +msgid "substituting access method \"gist\" for obsolete method \"rtree\"" +msgstr "მოძველებული მეთოდი \"rtree\" წვდომის მეთოდით \"gist\" ჩანაცვლდება" + +#: commands/indexcmds.c:846 +#, c-format +msgid "access method \"%s\" does not support unique indexes" +msgstr "სწვდომის მეთოდს (%s) უნიკალური ინდექსების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:851 +#, c-format +msgid "access method \"%s\" does not support included columns" +msgstr "სწვდომის მეთოდს (%s) ჩასმული სვეტების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:856 +#, c-format +msgid "access method \"%s\" does not support multicolumn indexes" +msgstr "სწვდომის მეთოდს (%s) მრავალსვეტიანი ინდექსების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:861 +#, c-format +msgid "access method \"%s\" does not support exclusion constraints" +msgstr "სწვდომის მეთოდს (%s) გამორიცხვის შეზღუდვების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:986 +#, c-format +msgid "cannot match partition key to an index using access method \"%s\"" +msgstr "წვდომის მეთოდით \"%s\" დანაყოფის გასაღების ინდექსთან დამთხვევა შეუძლებელია" + +#: commands/indexcmds.c:996 +#, c-format +msgid "unsupported %s constraint with partition key definition" +msgstr "მხარდაუჭერელი %s შეზღუდვა დანაყოფის გასაღების აღწერით" + +#: commands/indexcmds.c:998 +#, c-format +msgid "%s constraints cannot be used when partition keys include expressions." +msgstr "" + +#: commands/indexcmds.c:1037 +#, c-format +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "დაყოფილ ცხრილზე არსებული უნიკალური შეზღუდვა ყველა დაყოფის სვეტს უნდა შეიცავდეს" + +#: commands/indexcmds.c:1038 +#, c-format +msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." +msgstr "" + +#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 +#, c-format +msgid "index creation on system columns is not supported" +msgstr "სისტემური სვეტებზე ინდექსების შექმნა მხარდაუჭერელია" + +#: commands/indexcmds.c:1276 tcop/utility.c:1518 +#, c-format +msgid "cannot create unique index on partitioned table \"%s\"" +msgstr "დაყოფილ ცხრილზე (%s) უნიკალური ინდექსის შექმნა შეუძლებელია" + +#: commands/indexcmds.c:1278 tcop/utility.c:1520 +#, c-format +msgid "Table \"%s\" contains partitions that are foreign tables." +msgstr "ცხრილი (%s) შეიცავს დანაყოფებს, რომლებც გარე ცხრილებია." + +#: commands/indexcmds.c:1767 +#, c-format +msgid "functions in index predicate must be marked IMMUTABLE" +msgstr "ფუნქციები ინდექსის პრედიკატში მონიშნეთ, როგორც IMMUTABLE" + +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:2529 parser/parse_utilcmd.c:2664 +#, c-format +msgid "column \"%s\" named in key does not exist" +msgstr "გასაღებში დასახელებული სვეტი არ არსებობს: %s" + +#: commands/indexcmds.c:1869 parser/parse_utilcmd.c:1826 +#, c-format +msgid "expressions are not supported in included columns" +msgstr "ჩასმულ სვეტებში გამოსახულებები მხარდაჭერილი არაა" + +#: commands/indexcmds.c:1910 +#, c-format +msgid "functions in index expression must be marked IMMUTABLE" +msgstr "ფუნქციები ინდექსის გამოსახულებაში მონიშნეთ, როგორც IMMUTABLE" + +#: commands/indexcmds.c:1925 +#, c-format +msgid "including column does not support a collation" +msgstr "ჩასმულ სვეტს კოლაციის მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:1929 +#, c-format +msgid "including column does not support an operator class" +msgstr "ჩასმულ სვეტს ოპერატორის კლასის მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:1933 +#, c-format +msgid "including column does not support ASC/DESC options" +msgstr "ჩასმულ სვეტს ASC/DESC პარამეტრების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:1937 +#, c-format +msgid "including column does not support NULLS FIRST/LAST options" +msgstr "ჩასმულ სვეტს NULLS FIRST/LAST მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:1978 +#, c-format +msgid "could not determine which collation to use for index expression" +msgstr "ინდექსის გამოსახულებისთვის გამოსაყენებელი კოლაციის გამოცნობა შეუძლებელია" + +#: commands/indexcmds.c:1986 commands/tablecmds.c:17502 commands/typecmds.c:807 parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 utils/adt/misc.c:601 +#, c-format +msgid "collations are not supported by type %s" +msgstr "ტიპის \"%s\" კოლაციების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:2051 +#, c-format +msgid "operator %s is not commutative" +msgstr "ოპერატორი %s არაკომუტაციურია" + +#: commands/indexcmds.c:2053 +#, c-format +msgid "Only commutative operators can be used in exclusion constraints." +msgstr "გამორიცხვის შეზღუდვებში მხოლოდ კომუტაციური ოპერატორების გამოყენება შეგიძლიათ." + +#: commands/indexcmds.c:2079 +#, c-format +msgid "operator %s is not a member of operator family \"%s\"" +msgstr "ოპერატორი (%s) ოპერატორის ოჯახის (%s) წევრი არაა" + +#: commands/indexcmds.c:2082 +#, c-format +msgid "The exclusion operator must be related to the index operator class for the constraint." +msgstr "" + +#: commands/indexcmds.c:2117 +#, c-format +msgid "access method \"%s\" does not support ASC/DESC options" +msgstr "წვდომის მეთოდს \"%s\" ASC/DESC პარამეტრების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:2122 +#, c-format +msgid "access method \"%s\" does not support NULLS FIRST/LAST options" +msgstr "წვდომის მეთოდს \"%s\" 'NULLS FIRST/LAST' პარამეტრების მხარდაჭერა არ გააჩნია" + +#: commands/indexcmds.c:2168 commands/tablecmds.c:17527 commands/tablecmds.c:17533 commands/typecmds.c:2302 +#, c-format +msgid "data type %s has no default operator class for access method \"%s\"" +msgstr "მონაცემის ტიპს %s წვდომის მეთოდისთვის \"%s\" ნაგულისხმევი ოპერატორის კლასი არ გააჩნია" + +#: commands/indexcmds.c:2170 +#, 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:2199 commands/indexcmds.c:2207 commands/opclasscmds.c:205 +#, c-format +msgid "operator class \"%s\" does not exist for access method \"%s\"" +msgstr "ოპერატორის კლასი \"%s\" წვდომის მეთოდისთვის \"%s\" არ არსებობს" + +#: commands/indexcmds.c:2221 commands/typecmds.c:2290 +#, c-format +msgid "operator class \"%s\" does not accept data type %s" +msgstr "ოპერატორის კლასი \"%s\" მონაცემების ტიპს %s არ იღებს" + +#: commands/indexcmds.c:2311 +#, c-format +msgid "there are multiple default operator classes for data type %s" +msgstr "მონაცემის ტიპისთვის %s ერთზე მეტი ნაგულისხმევი ოპერატორის კლასი არსებობს" + +#: commands/indexcmds.c:2639 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "\"REINDEX\"-ის უცნობი პარამეტრი \"%s\"" + +#: commands/indexcmds.c:2863 +#, c-format +msgid "table \"%s\" has no indexes that can be reindexed concurrently" +msgstr "ცხრილს \"%s\" არ გააჩნია ინდექსები, რომლების პარალელური რეინდექსიც შესაძლებელია" + +#: commands/indexcmds.c:2877 +#, c-format +msgid "table \"%s\" has no indexes to reindex" +msgstr "ცხრილს \"%s\" რეინდექსისთვის ცხრილები არ არ გააჩნია" + +#: commands/indexcmds.c:2917 commands/indexcmds.c:3421 commands/indexcmds.c:3549 +#, c-format +msgid "cannot reindex system catalogs concurrently" +msgstr "სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია" + +#: commands/indexcmds.c:2940 +#, c-format +msgid "can only reindex the currently open database" +msgstr "შესაძლებელია მხოლოდ ამჟამად ღია ბაზის რეინდექსი" + +#: commands/indexcmds.c:3028 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია. ყველას გამოტოვება" + +#: commands/indexcmds.c:3061 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "სისტემური დანაყოფების გადაადგილება შეუძლებელია. ყველას გამოტოვება" + +#: commands/indexcmds.c:3107 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "დაყოფილი ცხრილის რეინდექსისას: \"%s.%s\"" + +#: commands/indexcmds.c:3110 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "დაყოფილი ინდექსის რეინდექსისას: \"%s.%s\"" + +#: commands/indexcmds.c:3301 commands/indexcmds.c:4157 +#, c-format +msgid "table \"%s.%s\" was reindexed" +msgstr "\"%s.%s\"-ის რეინდექსი დასრულდა" + +#: commands/indexcmds.c:3453 commands/indexcmds.c:3505 +#, c-format +msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" +msgstr "არასწორი ინდექსის \"%s.%s\" პარალელური რეინდექსი შეუძლებელია. გამოტოვება" + +#: commands/indexcmds.c:3459 +#, c-format +msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" +msgstr "გამორიცხვის შეზღუდვის ინდექსის \"%s.%s\" პარალელური რეინდექსი შეუძლებელია. გამოტოვება" + +#: commands/indexcmds.c:3614 +#, c-format +msgid "cannot reindex this type of relation concurrently" +msgstr "ამ ტიპის ურთიერთობის პარალელური რეინდექსი შეუძლებელია" + +#: commands/indexcmds.c:3635 +#, c-format +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "არაგაზიარებული ურთიერთობის ცხრილების სივრცეში \"%s\" გადატანა შეუძლებელია" + +#: commands/indexcmds.c:4138 commands/indexcmds.c:4150 +#, c-format +msgid "index \"%s.%s\" was reindexed" +msgstr "\"%s.%s\"-ის რეინდექსი დასრულდა" + +#: commands/indexcmds.c:4140 commands/indexcmds.c:4159 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 +#, c-format +msgid "cannot lock relation \"%s\"" +msgstr "ურთიერთობის დაბლოკვა (\"%s\") შეუძლებელია" + +#: commands/matview.c:193 +#, c-format +msgid "CONCURRENTLY cannot be used when the materialized view is not populated" +msgstr "CONCURRENTLY-ის გამოყენება შეუძლებელია, როცა მატერიალიზებული ხედი შევსებული არაა" + +#: commands/matview.c:199 gram.y:17995 +#, c-format +msgid "%s and %s options cannot be used together" +msgstr "პარამეტრები %s და %s შეუთავსებლებია" + +#: commands/matview.c:256 +#, c-format +msgid "cannot refresh materialized view \"%s\" concurrently" +msgstr "მატერიალიზებული ხედის (%s) პარალელური განახლება შეუძლებელია" + +#: 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 "" + +#: commands/matview.c:653 +#, c-format +msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" +msgstr "ახალი მონაცემები მატერიალიზებულ ხედისთვის \"%s\" დუბლირებულ მწკრივებს შეიცავს, ნულოვანი მწკრივების გარეშე" + +#: commands/matview.c:655 +#, c-format +msgid "Row: %s" +msgstr "მწკრივი: %s" + +#: commands/opclasscmds.c:124 +#, c-format +msgid "operator family \"%s\" does not exist for access method \"%s\"" +msgstr "წვდომის მეთოდისთვის (%2$s) ოპერატორის ოჯახი (%1$s) არ არსებობს" + +#: commands/opclasscmds.c:267 +#, c-format +msgid "operator family \"%s\" for access method \"%s\" already exists" +msgstr "წვდომის მეთოდისთვის (%2$s) ოპერატორის ოჯახი (%1$s) უკვე არსებობს" + +#: commands/opclasscmds.c:416 +#, c-format +msgid "must be superuser to create an operator class" +msgstr "ოპერატორის კლასის შესაქმნელად ზემომხმარებლის უფლებება საჭირო" + +#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 commands/opclasscmds.c:1056 +#, c-format +msgid "invalid operator number %d, must be between 1 and %d" +msgstr "ოპერატორის არასწორი ნომერი: %d. უნდა იყოს დიაპაზონში 1..%d" + +#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 commands/opclasscmds.c:1072 +#, c-format +msgid "invalid function number %d, must be between 1 and %d" +msgstr "ფუნქციის არასწორი ნომერი: %d. უნდა იყოს დიაპაზონში 1..%d" + +#: commands/opclasscmds.c:567 +#, c-format +msgid "storage type specified more than once" +msgstr "საცავის ტიპი ერთზე მეტჯერაა მითითებული" + +#: commands/opclasscmds.c:594 +#, c-format +msgid "storage type cannot be different from data type for access method \"%s\"" +msgstr "წვდომის მეთოდისთვის \"%s\" საცავის ტიპი არ შეიძლება, მონაცემის ტიპისგან განსხვავდებოდეს" + +#: commands/opclasscmds.c:610 +#, c-format +msgid "operator class \"%s\" for access method \"%s\" already exists" +msgstr "ოპერატორის კლასი \"%s\" წვდომის მეთოდისთვის \"%s\" უკვე არსებობს" + +#: commands/opclasscmds.c:638 +#, c-format +msgid "could not make operator class \"%s\" be default for type %s" +msgstr "ოპერატორის კლასის \"%s\" ტიპისთვის %s ნაგულისხმევად დაყენება შეუძლებელია" + +#: commands/opclasscmds.c:641 +#, c-format +msgid "Operator class \"%s\" already is the default." +msgstr "ოპერატორის კლასი \"%s\" უკვე ნაგულისხმევია." + +#: commands/opclasscmds.c:801 +#, c-format +msgid "must be superuser to create an operator family" +msgstr "ოპერატორის ოჯახის შესაქმნელად საჭიროა ზემომხმარებლის უფლებები" + +#: commands/opclasscmds.c:861 +#, c-format +msgid "must be superuser to alter an operator family" +msgstr "ოპერატორის ოჯახის შესაცვლელად საჭიროა ზემომხმარებლის უფლებები" + +#: commands/opclasscmds.c:919 +#, c-format +msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" +msgstr "'ALTER OPERATOR FAMILY'-ში ოპერატორის არგუმენის ტიპების მითითება აუცილებელია" + +#: commands/opclasscmds.c:994 +#, c-format +msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" +msgstr "ALTER OPERATOR FAMILY-ში STORAGE-ს ვერ მიუთითებთ" + +#: commands/opclasscmds.c:1128 +#, c-format +msgid "one or two argument types must be specified" +msgstr "უნდა იყოს მითითებული ერთი ან ორი არგუმენტის ტიპი" + +#: commands/opclasscmds.c:1154 +#, c-format +msgid "index operators must be binary" +msgstr "ინდექსის ოპერატორები ბინარული უნდა იყოს" + +#: commands/opclasscmds.c:1173 +#, c-format +msgid "access method \"%s\" does not support ordering operators" +msgstr "სწვდომის მეთოდს (%s) ოპერატორების დალაგების მხარდაჭერა არ გააჩნია" + +#: commands/opclasscmds.c:1184 +#, c-format +msgid "index search operators must return boolean" +msgstr "ინდექსის ძებნის ოპერატორებმა ლოგიკური მნიშვნელობა უნდა დააბრუნონ" + +#: commands/opclasscmds.c:1224 +#, c-format +msgid "associated data types for operator class options parsing functions must match opclass input type" +msgstr "ოპერატორის კლასის პარამეტრების დამუშავების ფუნქციებისთვის ასოცირებული მონაცემის ტიპები opclass-ის შეყვანის ტიპებს უნდა ემთხვეოდეს" + +#: commands/opclasscmds.c:1231 +#, c-format +msgid "left and right associated data types for operator class options parsing functions must match" +msgstr "" + +#: commands/opclasscmds.c:1239 +#, c-format +msgid "invalid operator class options parsing function" +msgstr "კლასის კლასის პარამეტრების დამუშავების ფუნქციის არასწორი ოპერატორი" + +#: commands/opclasscmds.c:1240 +#, c-format +msgid "Valid signature of operator class options parsing function is %s." +msgstr "ოპერატორის კლასის პარამეტრების დამმუშავებელი ფუნქციის სწორი სიგნატურაა %s." + +#: commands/opclasscmds.c:1259 +#, c-format +msgid "btree comparison functions must have two arguments" +msgstr "ორობითი ხის შედარებით ფუნქციებს ორი არგუმენტი უნდა ჰქონდეთ" + +#: commands/opclasscmds.c:1263 +#, c-format +msgid "btree comparison functions must return integer" +msgstr "ორობითი ხის შედარებით ფუნქციებმა ორი მთელი რიცხვი უნდა დააბრუნოს" + +#: commands/opclasscmds.c:1280 +#, c-format +msgid "btree sort support functions must accept type \"internal\"" +msgstr "ორობითი ხის დალაგების ფუნქციები უნდა იღებდნენ ტიპს \"internal\"" + +#: commands/opclasscmds.c:1284 +#, c-format +msgid "btree sort support functions must return void" +msgstr "ორობითი ხის დალაგების ფუნქციებმა არაფერი უნდა დააბრუნონ" + +#: commands/opclasscmds.c:1295 +#, c-format +msgid "btree in_range functions must have five arguments" +msgstr "btree in_range ფუნქციებს 5 არგუმენტი უნდა ჰქონდეთ" + +#: commands/opclasscmds.c:1299 +#, c-format +msgid "btree in_range functions must return boolean" +msgstr "ორობითი ხის in_range ფუნქციები ლოგიკურ მნიშვნელობებს უნდა აბრუნებდნენ" + +#: commands/opclasscmds.c:1315 +#, c-format +msgid "btree equal image functions must have one argument" +msgstr "ორობითი ტოლობის ასლის ფუნქციებს ერთი არგუმენტი უნდა ჰქონდეთ" + +#: commands/opclasscmds.c:1319 +#, c-format +msgid "btree equal image functions must return boolean" +msgstr "ორობითი ტოლობის ასლის ფუნქციებმა ლოგიკური მნიშვნელობა უნდა დააბრუნონ" + +#: commands/opclasscmds.c:1332 +#, c-format +msgid "btree equal image functions must not be cross-type" +msgstr "ორობითი ტოლობის ასლის ფუნქციები ჯვარედინი ტიპის არ უნდა იყოს" + +#: commands/opclasscmds.c:1342 +#, c-format +msgid "hash function 1 must have one argument" +msgstr "ჰეშის ფუნქცია 1-ს ერთი არგუმენტი უნდა ჰქონდეს" + +#: commands/opclasscmds.c:1346 +#, c-format +msgid "hash function 1 must return integer" +msgstr "ჰეშის ფუნქცია 1-მა მთელი რიცხვი უნდა დააბრუნოს" + +#: commands/opclasscmds.c:1353 +#, c-format +msgid "hash function 2 must have two arguments" +msgstr "ჰეშის ფუნქცია 2-ს ორი არგუმენტი უნდა ჰქონდეს" + +#: commands/opclasscmds.c:1357 +#, c-format +msgid "hash function 2 must return bigint" +msgstr "ჰეშის ფუნქცია 2-მა bigint უნდა დააბრინოს" + +#: commands/opclasscmds.c:1382 +#, c-format +msgid "associated data types must be specified for index support function" +msgstr "ინდექსის მხარდაჭერის ფუნქციისთვის ასოცირებული მონაცემის ტიპების მითითება აუცილებელია" + +#: commands/opclasscmds.c:1407 +#, c-format +msgid "function number %d for (%s,%s) appears more than once" +msgstr "ფუნქციის ნომერი %d (%s,%s)-სთვის ერთზე მეტჯერ ჩნდება" + +#: commands/opclasscmds.c:1414 +#, c-format +msgid "operator number %d for (%s,%s) appears more than once" +msgstr "ოპერატორის ნომერი %d (%s,%s)-სთვის ერთზე მეტჯერ ჩნდება" + +#: commands/opclasscmds.c:1460 +#, c-format +msgid "operator %d(%s,%s) already exists in operator family \"%s\"" +msgstr "ოპერატორი %d(%s,%s) ოპერატორების ოჯახში \"%s\" უკვე არსებობს" + +#: commands/opclasscmds.c:1566 +#, c-format +msgid "function %d(%s,%s) already exists in operator family \"%s\"" +msgstr "ფუნქცია %d(%s,%s) ოპერატორების ოჯახში \"%s\" უკვე არსებობს" + +#: commands/opclasscmds.c:1647 +#, c-format +msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "ოპერატორი %d(%s,%s) ოპერატორების ოჯახში \"%s\" არ არსებობს" + +#: commands/opclasscmds.c:1687 +#, c-format +msgid "function %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "ფუნქცია %d(%s,%s) ოპერატორების ოჯახში \"%s\" არ არსებობს" + +#: commands/opclasscmds.c:1718 +#, c-format +msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "ოპერატორის კლასი \"%s\" წვდომის მეთოდისთვის \"%s\" სქემაში \"%s\" უკვე არსებობს" + +#: commands/opclasscmds.c:1741 +#, c-format +msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "ოპერატორის ოჯახი \"%s\" წვდომის მეთოდისთვის \"%s\" სქემაში \"%s\" უკვე არსებობს" + +#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 +#, c-format +msgid "SETOF type not allowed for operator argument" +msgstr "ტიპის \"SETOF\" ოპერატორის არგუმენტად გამოყენება აკრძალულია" + +#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 +#, c-format +msgid "operator attribute \"%s\" not recognized" +msgstr "ოპერატორის ატრიბუტი უცნობია: \"%s\"" + +#: commands/operatorcmds.c:163 +#, c-format +msgid "operator function must be specified" +msgstr "ოპერატორის ფუნქციის მითითება აუცილებელია" + +#: 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 "Postfix operators are not supported." +msgstr "პოსტფიქსური ოპერატორები მხარდაუჭერელია." + +#: commands/operatorcmds.c:290 +#, c-format +msgid "restriction estimator function %s must return type %s" +msgstr "" + +#: commands/operatorcmds.c:333 +#, c-format +msgid "join estimator function %s has multiple matches" +msgstr "შეერთების შემფასებელ ფუნქციას %s ერთზე მეტი დამთხვევა გააჩნია" + +#: commands/operatorcmds.c:348 +#, c-format +msgid "join estimator function %s must return type %s" +msgstr "შეერთების შემფასებელ ფუნქცია %s ტიპს %s უნდა აბრუნებდეს" + +#: commands/operatorcmds.c:473 +#, c-format +msgid "operator attribute \"%s\" cannot be changed" +msgstr "ოპერატორის ატრიბუტის შეცვლა შეუძლებელია: %s" + +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1609 commands/tablecmds.c:2197 commands/tablecmds.c:3423 commands/tablecmds.c:6312 commands/tablecmds.c:9144 commands/tablecmds.c:17082 commands/tablecmds.c:17117 commands/trigger.c:328 commands/trigger.c:1378 commands/trigger.c:1488 rewrite/rewriteDefine.c:278 rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 +#, c-format +msgid "permission denied: \"%s\" is a system catalog" +msgstr "წვდომა აკრძალულია: '%s\" სისტემური კატალოგია" + +#: commands/policy.c:172 +#, c-format +msgid "ignoring specified roles other than PUBLIC" +msgstr "'PUBLIC'-ის გარდა ყველა მითითებული როლი გამოტოვებული იქნება" + +#: commands/policy.c:173 +#, c-format +msgid "All roles are members of the PUBLIC role." +msgstr "ყველა როლი PUBLIC როლის წევრია." + +#: commands/policy.c:607 +#, c-format +msgid "WITH CHECK cannot be applied to SELECT or DELETE" +msgstr "SELECT-ზე და DELETE-ზე WITH CHECK-ის გადატარება შეუძლებელია" + +#: 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:691 commands/policy.c:1144 +#, c-format +msgid "policy \"%s\" for table \"%s\" already exists" +msgstr "წესი \"%s\" ცხრილისთვის \"%s\" უკვე არსებობს" + +#: 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:911 +#, c-format +msgid "only USING expression allowed for SELECT, DELETE" +msgstr "\"SELECT\" და DELETE-სთვის მხოლოდ USING გამოსახულებაა ნებადართული" + +#: 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: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:75 +#, c-format +msgid "invalid statement name: must not be empty" +msgstr "ოეპრატორის არასწორი სახელი: ცარიელი არ უნდა იყოს" + +#: commands/prepare.c:230 commands/prepare.c:235 +#, c-format +msgid "prepared statement is not a SELECT" +msgstr "მომზადებული ოპერატორი SELECT არაა" + +#: commands/prepare.c:295 +#, c-format +msgid "wrong number of parameters for prepared statement \"%s\"" +msgstr "პარამეტრების არასწორი რაოდენობა მომზადებული გამოსახულებისთვის \"%s\"" + +#: commands/prepare.c:297 +#, c-format +msgid "Expected %d parameters but got %d." +msgstr "მოსალოდნელი %d პარამეტრის მაგიერ მივიღე %d." + +#: commands/prepare.c:330 +#, c-format +msgid "parameter $%d of type %s cannot be coerced to the expected type %s" +msgstr "" + +#: commands/prepare.c:414 +#, c-format +msgid "prepared statement \"%s\" already exists" +msgstr "მომზადებული ოპერატორი \"%s\" უკვე არსებობს" + +#: 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:130 postmaster/postmaster.c:1219 postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 +#, c-format +msgid "invalid list syntax in parameter \"%s\"" +msgstr "არასწორი სიის სინტაქსი პარამეტრში \"%s\"" + +#: commands/publicationcmds.c:149 +#, c-format +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "გამოცემის პარამეტრის (\"%s\") უცნობი მნიშვნელობა: \"%s\"" + +#: commands/publicationcmds.c:163 +#, c-format +msgid "unrecognized publication parameter: \"%s\"" +msgstr "გამოცემის უცნობი პარამეტრი: \"%s\"" + +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "'CURRENT_SCHEMA'-სთვის სქემა არჩეული არაა" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "სისტემური სვეტები დაუშვებელია." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "მომხმარებლის მიერ აღწერილი ოპერატორები დაშვებული არაა." + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "დაშვებულია მხოლოდ სვეტები, მუდმივები, ჩაშენებული ოპერატორები, ჩაშენებული მონაცემის ტიპები, ჩაშენებული კოლაციები და არადადუმებადი ჩაშენებული ფუნქციები." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "მომხმარებლის მიერ განსაზღვრული ტიპები დაშვებული არაა." + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "მომხმარებლის-მიერ-აღწერილი ან ჩაშენებული დადუმებადი ფუნქციები დაშვებული არაა." + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "მომხმარებლის მიერ განსაზღვრული კოლაციები დაუშვებელია." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "პუბლიკაციის არასწორი WHERE გამოსახულება" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "ურთიერთობისთვის \"%s\"გამოცემის პირობას WHERE ვერ გამოიყენებთ" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "დაყოფილ ცხრილზე პირობის WHERE გამოყენება შეუძლებელია, როცა %s ჭეშმარიტი არაა." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "შეუძლებელია სვეტების სიის გამოყენება ურთიერთობისთვის \"%s.%s\" გამოცემაში \"%s\"" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "გამოცემებში რომლებიც ელემენტებს FOR TABLES IN SCHEMA შეიცავენ, სვეტების სიას ვერ მიუთითებთ." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "სვეტების სია შეუძლებელია მიუთითოთ დაყოფილ ცხრილს, როცა %s false-ა." + +#: commands/publicationcmds.c:760 +#, c-format +msgid "must be superuser to create FOR ALL TABLES publication" +msgstr "'FOR ALL TABLES' პუბლიკაციის შექმნისთვის ზემომხმარებლის უფლებები აუცილებელია" + +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "\"FOR TABLES IN SCHEMA\" გამოცემის შესაქმნელად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/publicationcmds.c:867 +#, c-format +msgid "wal_level is insufficient to publish logical changes" +msgstr "wal_level არასაკმარისია ლოგიკური ცვლილებების გამოსაქვეყნებლად" + +#: commands/publicationcmds.c:868 +#, c-format +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "გამოწერების შექმნამდე საჭიროა wal_level -ის \"logical\" (ლოგიკურზე) დაყენება." + +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "პარამეტრის (\"%s\") false-ზე დაყენება პუბლიკაციისთვის \"%s\" შეუძლებელია" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "გამოცემა შეიცავს პირობას WHERE დაყოფილი ცხრილისთვის \"%s\", რაც, მაშინ, როცა \"%s\" ჭეშმარიტი არა, დაშვებული არაა." + +#: commands/publicationcmds.c:975 +#, 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:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "გამოცემისთვის (%s) სქემის დამატება შეუძლებელია" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "სქემების დამატება შეუძლებელია, თუ ნებისმიერი ცხრილი, რომელიც შეიცავს სვეტების სიას, რომელიც უკვე გამოცემის ნაწილია." + +#: commands/publicationcmds.c:1348 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "სქემის დამატების ან დაყენებისთვის ზემომხმარებლის უფლებებია საჭირო" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 +#, c-format +msgid "publication \"%s\" is defined as FOR ALL TABLES" +msgstr "გამოცემა %s აღწერილია, როგორც FOR ALL TABLES" + +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "სქემების FOR ALL TABLES გამოცემებიდან წაშლა ან მასში ჩამატება შეუძლებელია." + +#: commands/publicationcmds.c:1367 +#, c-format +msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "FOR ALL TABLES გამოცემებში ცხრილების ჩამატება ან მათი წაშლა შეუძლებელია." + +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "კონფლიქტური ან ზედმეტი WHERE პირობები ცხრილისთვის \"%s\"" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "კონფლიქტური ან ზედმეტი სვეტის სიები ცხრილისთვის \"%s\"" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "" + +#: commands/publicationcmds.c:1814 +#, c-format +msgid "relation \"%s\" is not part of the publication" +msgstr "ურთიერთობა (%s) გამოცემის ნაწილს არ წარმოადგენს" + +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "გამოცემის ცხრილიდან წაშლისას პირობას WHERE ვერ გამოიყენებთ" + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "ცხრილი სქემიდან \"%s\" გამოცემის ნაწილს არ წარმოადგენს" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 +#, c-format +msgid "permission denied to change owner of publication \"%s\"" +msgstr "გამოცემის (%s) მფლობელის შეცვლის წვდომა აკრძალულია" + +#: commands/publicationcmds.c:1926 +#, c-format +msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgstr "FOR ALL TABLES გამოცემის მფლობელი ზემომხმარებელი უნდა იყოს." + +#: commands/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR TABLES IN SCHEMA გამოცემის მფლობელი ზემომხმარებელი უნდა იყოს." + +#: commands/schemacmds.c:108 commands/schemacmds.c:288 +#, c-format +msgid "unacceptable schema name \"%s\"" +msgstr "სქემის დაუშვებელი სახელი: \"%s\"" + +#: commands/schemacmds.c:109 commands/schemacmds.c:289 +#, c-format +msgid "The prefix \"pg_\" is reserved for system schemas." +msgstr "პრეფიქსი \"pg_\" დაცულია სისტემური სქემებისთვის." + +#: commands/schemacmds.c:133 +#, c-format +msgid "schema \"%s\" already exists, skipping" +msgstr "სქემა (\"%s\") უკვე არსებობს, გამოტოვება" + +#: commands/seclabel.c:131 +#, c-format +msgid "no security label providers have been loaded" +msgstr "უსაფრთხოების ჭდის მომწოდებლები არ ჩატვირთულა" + +#: commands/seclabel.c:135 +#, c-format +msgid "must specify provider when multiple security label providers have been loaded" +msgstr "როცა ჩატვირთულია ერთზე მეტი უსაფრთხოების ჭდის მომწოდებელი, მისი აშკარად მითითება აუცილებელია" + +#: commands/seclabel.c:153 +#, c-format +msgid "security label provider \"%s\" is not loaded" +msgstr "უსაფრთხოების ჭდის მომწოდებელი \"%s\" ჯერ ჩატვირთული არააა" + +#: commands/seclabel.c:160 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "ამ ტიპის ობიექტისთვის უსაფრთხოების ჭდეები მხარდაჭერილი არაა" + +#: commands/seclabel.c:193 +#, c-format +msgid "cannot set security label on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" უსაფრთხოების ჭდის დადება შეუძლებელია" + +#: commands/sequence.c:755 +#, c-format +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: მიღწეულია მაქსიმალური მნიშვნელობა მიმდევრობისთვის \"%s\" (%lld)" + +#: commands/sequence.c:774 +#, c-format +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: მიღწეულია მინიმალური მნიშვნელობა მიმდევრობისთვის \"%s\" (%lld)" + +#: commands/sequence.c:892 +#, c-format +msgid "currval of sequence \"%s\" is not yet defined in this session" +msgstr "მიმდევრობის \"%s\" მიმდინარე მნიშვნელობა ამ სესიაში ჯერ აღწერილი არაა" + +#: commands/sequence.c:911 commands/sequence.c:917 +#, c-format +msgid "lastval is not yet defined in this session" +msgstr "ამ სესიაში lastval ჯერ აღწერილი არაა" + +#: commands/sequence.c:997 +#, c-format +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: მნიშვნელობა %lld საზღვრებს გარეთაა მიმდევრობისთვის \"%s\" (%lld..%lld)" + +#: commands/sequence.c:1365 +#, c-format +msgid "invalid sequence option SEQUENCE NAME" +msgstr "მიმდევრობის არასწორი პარამეტრი SEQUENCE NAME" + +#: commands/sequence.c:1391 +#, c-format +msgid "identity column type must be smallint, integer, or bigint" +msgstr "იდენტიფიკაციის სვეტის ტიპი smallint, integer ან bigint უნდა იყოს" + +#: commands/sequence.c:1392 +#, c-format +msgid "sequence type must be smallint, integer, or bigint" +msgstr "მიმდევრობის ტიპი smallint, integer ან bigint უნდა იყოს" + +#: commands/sequence.c:1426 +#, c-format +msgid "INCREMENT must not be zero" +msgstr "INCREMENT ნული არ უნდა იყოს" + +#: commands/sequence.c:1474 +#, c-format +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) მიმდევრობის მონაცემის ტიპის დიაპაზონს გარეთაა %s" + +#: commands/sequence.c:1506 +#, c-format +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) მიმდევრობის მონაცემის ტიპის დიაპაზონს გარეთაა %s" + +#: commands/sequence.c:1514 +#, c-format +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld)-ი MAXVALUE (%lld)-ზე ნაკლები არ უნდა იყოს" + +#: commands/sequence.c:1535 +#, c-format +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "START -ის მნიშვნელობა (%lld)-ი MINVALUE (%lld)-ზე ნაკლები არ უნდა იყოს" + +#: commands/sequence.c:1541 +#, c-format +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "START -ის მნიშვნელობა (%lld)-ი MAXVALUE (%lld)-ზე მეტი არ უნდა იყოს" + +#: commands/sequence.c:1565 +#, c-format +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "RESTART -ის მნიშვნელობა (%lld) MINVALUE (%lld)-ზე ნაკლები არ უნდა იყოს" + +#: commands/sequence.c:1571 +#, c-format +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "RESTART -ის მნიშვნელობა (%lld) MAXVALUE (%lld)-ზე დიდი არ უნდა იყოს" + +#: commands/sequence.c:1582 +#, c-format +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) ნულზე მეტი უნდა იყოს" + +#: commands/sequence.c:1618 +#, c-format +msgid "invalid OWNED BY option" +msgstr "არასწორი პარამეტრი OWNED BY" + +#: commands/sequence.c:1619 +#, c-format +msgid "Specify OWNED BY table.column or OWNED BY NONE." +msgstr "მიუთითეთ OWNED BY ცხრილი.სვეტი ან OWNED BY NONE." + +#: commands/sequence.c:1644 +#, c-format +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "მიმდევრობის მფლობელი ურთიერთობა %s ვერ იქნება" + +#: commands/sequence.c:1652 +#, c-format +msgid "sequence must have same owner as table it is linked to" +msgstr "მიმდევრობას იგივე მფლობელი უნდა ჰყავდეს, რაც ცხრილს, რომელზედაც ის მიბმულია" + +#: commands/sequence.c:1656 +#, c-format +msgid "sequence must be in same schema as table it is linked to" +msgstr "მიმდევრობას იგივე სქემა უნდა ჰქონდეს, რაც ცხრილს, რომელზედაც ის მიბმულია" + +#: commands/sequence.c:1678 +#, c-format +msgid "cannot change ownership of identity sequence" +msgstr "იდენტიფიკაციის მიმდევრობის მფლობელის შეცვლა შეუძლებელია" + +#: commands/sequence.c:1679 commands/tablecmds.c:13870 commands/tablecmds.c:16507 +#, c-format +msgid "Sequence \"%s\" is linked to table \"%s\"." +msgstr "მიმდევრობა %s მიბმულია ცხრილზე \"%s\"." + +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 +#, c-format +msgid "only a single relation is allowed in CREATE STATISTICS" +msgstr "'CREATE STATISTICS'-ში მხოლოდ ერთი ურთიერთობაა დაშვებული" + +#: commands/statscmds.c:136 +#, c-format +msgid "cannot define statistics for relation \"%s\"" +msgstr "სტატისტიკის აღწერა ურთიერთობისთვის %s შეუძლებელია" + +#: commands/statscmds.c:191 +#, c-format +msgid "statistics object \"%s\" already exists, skipping" +msgstr "სტატისტიკის ობიექტის %s უკვე არსებობს. გამოტოვება" + +#: commands/statscmds.c:199 +#, c-format +msgid "statistics object \"%s\" already exists" +msgstr "სტატისტიკის ობიექტი უკვე არსებობს: %s" + +#: commands/statscmds.c:210 +#, c-format +msgid "cannot have more than %d columns in statistics" +msgstr "სტატისტიკაში %d-ზე მეტი სვეტი ვერ გექნებათ" + +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 +#, c-format +msgid "statistics creation on system columns is not supported" +msgstr "სისტემურ სვეტებზე სტატისტიკის შექმნა შეუძლებელია" + +#: commands/statscmds.c:258 commands/statscmds.c:281 +#, c-format +msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" +msgstr "სვეტს \"%s\" სტატისტიკაში ვერ გამოიყენებთ, რადგან მის ტიპს (\"%s\") ნაგულისხმევი ორობითი ხის ოპერატორის კლასი არ გააჩნია" + +#: commands/statscmds.c:325 +#, c-format +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "" + +#: commands/statscmds.c:346 +#, c-format +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "როცა სტატისტიკის აგება ერთ გამოსახულებაზე მიმდინარეობს, სტატისტიკის ტიპის მითითება შეუძლებელია" + +#: commands/statscmds.c:375 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "სტატისტიკის უცნობი ტიპი: \"%s\"" + +#: commands/statscmds.c:404 +#, c-format +msgid "extended statistics require at least 2 columns" +msgstr "გაფართოებულ სტატისტიკას მინიმუმ 2 სვეტი სჭირდება" + +#: commands/statscmds.c:422 +#, c-format +msgid "duplicate column name in statistics definition" +msgstr "სვეტის დუბლირებული სახელი სტატისტიკის აღწერაში" + +#: commands/statscmds.c:457 +#, c-format +msgid "duplicate expression in statistics definition" +msgstr "დუბლირებული გამოსახულება სტატისტიკის აღწერაში" + +#: commands/statscmds.c:620 commands/tablecmds.c:8112 +#, c-format +msgid "statistics target %d is too low" +msgstr "სტატისტიკის სამიზნე %d ძალიან დაბალია" + +#: commands/statscmds.c:628 commands/tablecmds.c:8120 +#, c-format +msgid "lowering statistics target to %d" +msgstr "სტატისტიკის სამიზნის ჩამოწევა %d-მდე" + +#: commands/statscmds.c:651 +#, c-format +msgid "statistics object \"%s.%s\" does not exist, skipping" +msgstr "სტატისტიკის ობიექტი \"%s.%s\" არ არსებობს, გამოტოვება" + +#: 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: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:355 commands/subscriptioncmds.c:371 +#, c-format +msgid "subscription with %s must also set %s" +msgstr "%s-ის გამოწერამ %s-იც უნდა დააყენოს" + +#: commands/subscriptioncmds.c:433 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "გამომცემლისგან გამოცემების სიის მიღება შეუძლებელია: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "გამოცემა \"%s\" არ არსებობს" +msgstr[1] "გამოცემა \"%s\" არ არსებობს" + +#: commands/subscriptioncmds.c:547 +#, c-format +msgid "must be superuser to create subscriptions" +msgstr "გამოწერის შესაქმნელად ზემომხმარებლის პრივილეგიებია საჭირო" + +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 +#, c-format +msgid "could not connect to the publisher: %s" +msgstr "პუბლიკაციის სერვერთან მიერთების პრობლემა: %s" + +#: commands/subscriptioncmds.c:717 +#, c-format +msgid "created replication slot \"%s\" on publisher" +msgstr "გამომცემელზე შექმნილია რეპლიკაციის სეტი \"%s\"" + +#. translator: %s is an SQL ALTER statement +#: commands/subscriptioncmds.c:730 +#, c-format +msgid "tables were not subscribed, you will have to run %s to subscribe the tables" +msgstr "" + +#: commands/subscriptioncmds.c:1033 +#, c-format +msgid "cannot set %s for enabled subscription" +msgstr "ჩართული გამოწერისთვის %s-ის დაყენება შეუძლებელია" + +#: commands/subscriptioncmds.c:1086 +#, c-format +msgid "cannot enable subscription that does not have a slot name" +msgstr "გამოწერების, რომლებსაც სლოტის სახელი არ აქვთ, ჩართვა შეუძლებელია" + +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" +msgstr "ALTER SUBSCRIPTION განახლებით დაუშვებელია გათიშული გამოწერებისთვის" + +#: commands/subscriptioncmds.c:1130 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." +msgstr "გამოიყენეთ ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (განახლება = გამორთულია)." + +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... განახლებით და copy_data-ით დაუშვებელია, როცა two_phase ჩართულია" + +#: commands/subscriptioncmds.c:1140 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "გამოიყენეთ ALTER SUBSCRIPTION ... SET PUBLICATION refresh = false-ით, copy_data = false-ით ან გამოიყენეთ DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +msgid "Use %s instead." +msgstr "ამის ნაცვლად %s გამოიყენეთ." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "გამოიყენეთ %s 'refresh = false'-ით ან 'copy_data = false'-ით ან გამოიყენეთ DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1218 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +msgstr "ALTER SUBSCRIPTION ... REFRESH დაუშვებელია გათიშული გამოწერებისთვის" + +#: commands/subscriptioncmds.c:1243 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH -ი copy_data-ით დაუშვებელია, როცა two_phase ჩართულია" + +#: commands/subscriptioncmds.c:1244 +#, c-format +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:1263 +#, c-format +msgid "must be superuser to skip transaction" +msgstr "ტრანზაქციის გამოსატოვებლად ზემომხმარებლის უფლებებია საჭირო" + +#: commands/subscriptioncmds.c:1283 +#, c-format +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:1363 +#, c-format +msgid "subscription \"%s\" does not exist, skipping" +msgstr "გამოწერა \"%s\" არ არსებობს. გამოტოვება" + +#: commands/subscriptioncmds.c:1621 +#, c-format +msgid "dropped replication slot \"%s\" on publisher" +msgstr "გამომცემელზე რეპლიკაციის სეტი \"%s\" წაშლილია" + +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "შეუძლებელია რეპლიკაციის სლოტის \"%s\" წაშლა გამომცემელზე: %s" + +#: commands/subscriptioncmds.c:1672 +#, c-format +msgid "permission denied to change owner of subscription \"%s\"" +msgstr "" + +#: commands/subscriptioncmds.c:1674 +#, c-format +msgid "The owner of a subscription must be a superuser." +msgstr "" + +#: commands/subscriptioncmds.c:1788 +#, c-format +msgid "could not receive list of replicated tables from the publisher: %s" +msgstr "შეცდომა რეპლიცირებული ცხრილების სიის მიგება გამომცემლისგან: %s" + +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "" + +#: commands/subscriptioncmds.c:1860 +#, 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:1863 +#, c-format +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "გამოწერის გასათიშად გამოიყენეთ %s, შემდეგ კი, სლოტთან ასოცირების მოსახსნელად, %s გამოიყენეთ." + +#: commands/subscriptioncmds.c:1894 +#, c-format +msgid "publication name \"%s\" used more than once" +msgstr "პუბლიკაციის სახელი \"%s\" ერთზე მეტჯერ გამოიყენება" + +#: commands/subscriptioncmds.c:1938 +#, c-format +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "გამოცემა \"%s\" უკვე \"%s\" გამოწერაშია" + +#: commands/subscriptioncmds.c:1952 +#, c-format +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "გამოცემა \"%s\" \"%s\" გამოწერაში არაა" + +#: commands/subscriptioncmds.c:1963 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "გამოწერიდან ყველა გამოცემას ვერ წაშლით" + +#: commands/tablecmds.c:245 commands/tablecmds.c:287 +#, c-format +msgid "table \"%s\" does not exist" +msgstr "ცხრილი არ არსებობს: %s" + +#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#, c-format +msgid "table \"%s\" does not exist, skipping" +msgstr "ცხრილი \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:248 commands/tablecmds.c:290 +msgid "Use DROP TABLE to remove a table." +msgstr "ცხრილის წასაშლელად გამოიყენეთ DROP TABLE." + +#: commands/tablecmds.c:251 +#, c-format +msgid "sequence \"%s\" does not exist" +msgstr "მიმდევრობა \"%s\" არ არსებობს" + +#: commands/tablecmds.c:252 +#, c-format +msgid "sequence \"%s\" does not exist, skipping" +msgstr "მიმდევრობა \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:254 +msgid "Use DROP SEQUENCE to remove a sequence." +msgstr "მიმდევრობის წასაშლელად გამოიყენეთ DROP SEQUENCE." + +#: commands/tablecmds.c:257 +#, c-format +msgid "view \"%s\" does not exist" +msgstr "ხედი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:258 +#, c-format +msgid "view \"%s\" does not exist, skipping" +msgstr "ხედი \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:260 +msgid "Use DROP VIEW to remove a view." +msgstr "ხედის წასაშლელად გამოიყენეთ DROP VIEW." + +#: commands/tablecmds.c:263 +#, c-format +msgid "materialized view \"%s\" does not exist" +msgstr "მატერიალიზებული ხედი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:264 +#, c-format +msgid "materialized view \"%s\" does not exist, skipping" +msgstr "მატერიალიზებული ხედი \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:266 +msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." +msgstr "მატერიალიზებული ხედის წასაშლელად გამოიყენეთ DROP MATERIALIZED VIEW." + +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19009 parser/parse_utilcmd.c:2261 +#, c-format +msgid "index \"%s\" does not exist" +msgstr "ინდექსი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:270 commands/tablecmds.c:294 +#, c-format +msgid "index \"%s\" does not exist, skipping" +msgstr "ინდექსი \"%s\" არ არსებობს, გამოტოვება" + +#: commands/tablecmds.c:272 commands/tablecmds.c:296 +msgid "Use DROP INDEX to remove an index." +msgstr "ინდექსის წასაშლელად გამოიყენეთ DROP INDEX." + +#: commands/tablecmds.c:277 +#, c-format +msgid "\"%s\" is not a type" +msgstr "\"%s\" ტიპი არაა" + +#: commands/tablecmds.c:278 +msgid "Use DROP TYPE to remove a type." +msgstr "ტიპის წასაშლელად გამოიყენეთ DROP TYPE." + +#: commands/tablecmds.c:281 commands/tablecmds.c:13709 commands/tablecmds.c:16210 +#, c-format +msgid "foreign table \"%s\" does not exist" +msgstr "გარე ცხრილი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:282 +#, c-format +msgid "foreign table \"%s\" does not exist, skipping" +msgstr "გარე ცხრილი \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:284 +msgid "Use DROP FOREIGN TABLE to remove a foreign table." +msgstr "გარე ცხრილის წასაშლელად DROP FOREIGN TABLE გამოიყენეთ." + +#: commands/tablecmds.c:697 +#, c-format +msgid "ON COMMIT can only be used on temporary tables" +msgstr "ON COMMIT მხოლოდ დროებით ცხრილებზე გამოიყენება" + +#: commands/tablecmds.c:728 +#, c-format +msgid "cannot create temporary table within security-restricted operation" +msgstr "უსაფრთხოებაზე-შეზღუდული ოპერაციის შიგნით დროებითი ცხრილის შექმნა შეუძლებელია" + +#: commands/tablecmds.c:764 commands/tablecmds.c:15017 +#, c-format +msgid "relation \"%s\" would be inherited from more than once" +msgstr "ურთიერთობა \"%s\" მემკვირდრეობით ერზე მეტჯერ იქნებოდა მიღებული" + +#: commands/tablecmds.c:949 +#, c-format +msgid "specifying a table access method is not supported on a partitioned table" +msgstr "ცხრილთან წვდომის მითითება დაყოფილ ცხრილზე მხარდაჭერილი არაა" + +#: commands/tablecmds.c:1042 +#, c-format +msgid "\"%s\" is not partitioned" +msgstr "\"%s\" დაყოფილი არაა" + +#: commands/tablecmds.c:1137 +#, c-format +msgid "cannot partition using more than %d columns" +msgstr "%d-ზე მეტი სვეტის გამოყენებით დაყოფა შეუძლებელია" + +#: commands/tablecmds.c:1193 +#, c-format +msgid "cannot create foreign partition of partitioned table \"%s\"" +msgstr "დაყოფილი ცხრილის (%s) გარე დანაყოფს ვერ შექმნით" + +#: commands/tablecmds.c:1195 +#, c-format +msgid "Table \"%s\" contains indexes that are unique." +msgstr "ცხრილი %s შეიცავს სვეტებს, რომლებიც უნიკალურია." + +#: commands/tablecmds.c:1358 +#, c-format +msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" +msgstr "DROP INDEX CONCURRENTLY-ს ერთზე მეტი ობიექტის წაშლის მხარდაჭერა არ გააჩნია" + +#: commands/tablecmds.c:1362 +#, c-format +msgid "DROP INDEX CONCURRENTLY does not support CASCADE" +msgstr "DROP INDEX CONCURRENTLY-ს CASCADE-ის მხარდაჭერა არ გააჩნია" + +#: commands/tablecmds.c:1466 +#, c-format +msgid "cannot drop partitioned index \"%s\" concurrently" +msgstr "დაყოფილ ინდექსს \"%s\" პარალელურად ვერ წაშლით" + +#: commands/tablecmds.c:1754 +#, c-format +msgid "cannot truncate only a partitioned table" +msgstr "თვითონ დაყოფილი ცხრილის დაცარიელება შეუძლებელია" + +#: commands/tablecmds.c:1755 +#, c-format +msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." +msgstr "არ მიუთითოთ საკვანძო სიტყვა ONLY, ან პირდაპირ დანაყოფებზე გამოიყენეთ TRUNCATE ONLY." + +#: commands/tablecmds.c:1827 +#, c-format +msgid "truncate cascades to table \"%s\"" +msgstr "მოკვეთა გადაეცემა ცხრილამდე %s" + +#: commands/tablecmds.c:2177 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "გარე ცხრილის (\"%s\") მოკვეთის შეცდომა" + +#: commands/tablecmds.c:2234 +#, c-format +msgid "cannot truncate temporary tables of other sessions" +msgstr "სხვა სესიების დროებითი ცხრილების მოკვეთის შეცდომა" + +#: commands/tablecmds.c:2462 commands/tablecmds.c:14914 +#, c-format +msgid "cannot inherit from partitioned table \"%s\"" +msgstr "დაყოფილი ცხრილიდან \"%s\" მემკვიდრეობის მიღება შეუძლებელია" + +#: commands/tablecmds.c:2467 +#, c-format +msgid "cannot inherit from partition \"%s\"" +msgstr "დანაყოფიდან \"%s\" მემკვიდრეობის მიღება შეუძლებელია" + +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 parser/parse_utilcmd.c:2633 +#, c-format +msgid "inherited relation \"%s\" is not a table or foreign table" +msgstr "მემკვიდრეობით მიღებული ურთიერთობა \"%s\" ცხრილს ან გარე ცხრილს არ წარმოადგენს" + +#: commands/tablecmds.c:2487 +#, c-format +msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" +msgstr "შეუძლებელია შექმნათ დროებით ურთიერთობა, რომელიც მუდმივი ურთიერთობის \"%s\" დანაყოფი იქნება" + +#: commands/tablecmds.c:2496 commands/tablecmds.c:14893 +#, c-format +msgid "cannot inherit from temporary relation \"%s\"" +msgstr "დროებითი ურთიერთობიდან (%s) მემკვიდრეობითობა შეუძლებელია" + +#: commands/tablecmds.c:2506 commands/tablecmds.c:14901 +#, c-format +msgid "cannot inherit from temporary relation of another session" +msgstr "სხვა სესიის დროებითი ურთიერთობიდან მემკვიდრეობითობა შეუძლებელია" + +#: commands/tablecmds.c:2560 +#, c-format +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "მიმდინარეობს სვეტის (\"%s\") მიერ მემკვიდრეობით მიღებული აღწერების შერწყმა" + +#: commands/tablecmds.c:2568 +#, c-format +msgid "inherited column \"%s\" has a type conflict" +msgstr "მემკივდრეობითი სვეტის \"%s\" ტიპის კონფლიქტი" + +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 commands/tablecmds.c:2610 commands/tablecmds.c:2866 commands/tablecmds.c:2896 commands/tablecmds.c:2910 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:2579 +#, c-format +msgid "inherited column \"%s\" has a collation conflict" +msgstr "მემკივდრეობითი სვეტის \"%s\" კოლაციის კონფლიქტი" + +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 commands/tablecmds.c:6792 +#, c-format +msgid "\"%s\" versus \"%s\"" +msgstr "'%s\" -ი \"%s\"-ის წინააღმდეგ" + +#: commands/tablecmds.c:2591 +#, c-format +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "მემკივდრეობითი სვეტის \"%s\" საცავის პარამეტრის კონფლიქტი" + +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "სვეტის (%s) შეკუმშვის მეთოდის კონფლიქტი" + +#: commands/tablecmds.c:2623 +#, c-format +msgid "inherited column \"%s\" has a generation conflict" +msgstr "მემკივდრეობითი სვეტის \"%s\" თაობის კონფლიქტი" + +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 commands/tablecmds.c:12433 parser/parse_utilcmd.c:1302 parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#, c-format +msgid "cannot convert whole-row table reference" +msgstr "" + +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 +#, c-format +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "" + +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 +#, c-format +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "" + +#: commands/tablecmds.c:2852 +#, c-format +msgid "merging column \"%s\" with inherited definition" +msgstr "სვეტის (\"%s\") შერწყმა მემკვიდრეობითი აღწერით" + +#: commands/tablecmds.c:2856 +#, c-format +msgid "moving and merging column \"%s\" with inherited definition" +msgstr "" + +#: commands/tablecmds.c:2857 +#, c-format +msgid "User-specified column moved to the position of the inherited column." +msgstr "" + +#: commands/tablecmds.c:2864 +#, c-format +msgid "column \"%s\" has a type conflict" +msgstr "ტიპის კონფლიქტი სვეტში \"%s\"" + +#: commands/tablecmds.c:2876 +#, c-format +msgid "column \"%s\" has a collation conflict" +msgstr "კოლაციის კონფლიქტი სვეტში \"%s\"" + +#: commands/tablecmds.c:2894 +#, c-format +msgid "column \"%s\" has a storage parameter conflict" +msgstr "საცავის პარამეტრის კონფლიქტი სვეტში \"%s\"" + +#: commands/tablecmds.c:2935 +#, c-format +msgid "child column \"%s\" specifies generation expression" +msgstr "შვილი სვეტისთვის \"%s\" მითითებულია გენერაციის გამოსახულება" + +#: commands/tablecmds.c:2937 +#, 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:2941 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "ცხრილი \"%s\" მემკვიდრეობით იღებს გენერირებული ცხრილიდან, მაგრამ ნაგულისხმევიც მითითებულია" + +#: commands/tablecmds.c:2946 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "ცხრილი \"%s\" მემკვიდრეობით იღებს გენერირებული ცხრილიდან, მაგრამ იდენტიფიკაციაც მითითებულია" + +#: commands/tablecmds.c:3055 +#, c-format +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "სვეტი \"%s\" მემკვიდრეობით კონფლიქტის მქონე გენერაციის გამოსახულებას იღებს" + +#: commands/tablecmds.c:3060 +#, c-format +msgid "column \"%s\" inherits conflicting default values" +msgstr "სვეტი \"%s\" მემკვიდრეობით ურთიერთგამომრიცხავ ნაგულისხმევ მნიშვნელობებს იღებს" + +#: commands/tablecmds.c:3062 +#, c-format +msgid "To resolve the conflict, specify a default explicitly." +msgstr "კონფლიქტის გადასაჭრელად ნაგულისხმევი აშკარად მიუთითეთ." + +#: commands/tablecmds.c:3108 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "შემოწმების შეზღუდვის სახელი \"%s\" ბევრჯერ გამოჩნდა, მაგრამ სხვადასხვა გამოსახულებებთან ერთად" + +#: commands/tablecmds.c:3321 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "სხვა სესიების დროებითი ცხრილების გადაადგილება შეუძლებელია" + +#: commands/tablecmds.c:3391 +#, c-format +msgid "cannot rename column of typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის გარდაქმნა შეუძლებელია" + +#: commands/tablecmds.c:3410 +#, c-format +msgid "cannot rename columns of relation \"%s\"" +msgstr "ურთიერთობის (\"%s\") სვეტების სახელის გადარქმევა შეუძლებელია" + +#: commands/tablecmds.c:3505 +#, c-format +msgid "inherited column \"%s\" must be renamed in child tables too" +msgstr "მემკვიდრეობით მიღებული სვეტს (\"%s\") სახელი შვილ ცხრილებშიც უნდა გადაერქვას" + +#: commands/tablecmds.c:3537 +#, c-format +msgid "cannot rename system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" გადარქმევა შეუძლებელია" + +#: commands/tablecmds.c:3552 +#, c-format +msgid "cannot rename inherited column \"%s\"" +msgstr "მემკვიდრეობითი სვეტის (\"%s\") სახელის გადარქმევა შეუძლებელია" + +#: commands/tablecmds.c:3704 +#, c-format +msgid "inherited constraint \"%s\" must be renamed in child tables too" +msgstr "მემკვიდრეობით მიღებული შეზღუდვას (\"%s\") სახელი შვილ ცხრილებშიც უნდა გადაერქვას" + +#: commands/tablecmds.c:3711 +#, c-format +msgid "cannot rename inherited constraint \"%s\"" +msgstr "მემკვიდრეობითი შეზღუდვის (\"%s\") სახელის გადარქმევა შეუძლებელია" + +#. translator: first %s is a SQL command, eg ALTER TABLE +#: commands/tablecmds.c:4008 +#, 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:4017 +#, c-format +msgid "cannot %s \"%s\" because it has pending trigger events" +msgstr "%s-ის \"%s\" შეუძლებელია, რადგან მას დარჩენილი ტრიგერის მოვლენები გააჩნია" + +#: commands/tablecmds.c:4486 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "არასრული მოხსნის მქონე დანაყოფის \"%s\" შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 +#, c-format +msgid "cannot change persistence setting twice" +msgstr "შენახვის პარამეტრების ორჯერ შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "დაყოფილი ცხრილის წვდომის მეთოდის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "ერთზე მეტი SET ACCESS METHOD ქვებრძანება ვერ გექნებათ" + +#: commands/tablecmds.c:5476 +#, c-format +msgid "cannot rewrite system relation \"%s\"" +msgstr "სისტემური შეერთების \"%s\" გადაწერა შეუძლებელია" + +#: commands/tablecmds.c:5482 +#, c-format +msgid "cannot rewrite table \"%s\" used as a catalog table" +msgstr "კატალოგის ცხრილად გამოყენებული ცხრილის \"%s\" თავიდან ჩაწერა შეუძლებელია" + +#: commands/tablecmds.c:5492 +#, c-format +msgid "cannot rewrite temporary tables of other sessions" +msgstr "სხვა სესიების დროებით ცხრილებს ვერ გადააწერთ" + +#: commands/tablecmds.c:5986 +#, c-format +msgid "column \"%s\" of relation \"%s\" contains null values" +msgstr "ურთიერთობის %2$s სვეტი %1$s ნულოვან მნიშვნელობებს შეიცავს" + +#: commands/tablecmds.c:6003 +#, c-format +msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" +msgstr "ურთიერთობის (\"%2$s\") შემოწმების შეზღუდვა \"%1$s\" რომელიღაც მწკრივის მიერ ირღვევა" + +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 +#, c-format +msgid "updated partition constraint for default partition \"%s\" would be violated by some row" +msgstr "განახებული დანაყოფის შეზღუდვა ნაგულისხმევი დანაყოფისთვის \"%s\" რომელიღაც მწკრივის მიერ დაირღვეოდა" + +#: commands/tablecmds.c:6028 +#, c-format +msgid "partition constraint of relation \"%s\" is violated by some row" +msgstr "ურთიერთობის (\"%s\") დანაყოფის შეზღუდვა რომელიღაც მწკრივის მიერ ირღვევა" + +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 +#, c-format +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "ALTER-ის ქმედებას %s ურთიერთობაზე \"%s\" ვერ შეასრულებთ" + +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 +#, c-format +msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" +msgstr "ტიპის \"%s\" შეცვლა შეუძლებელია, რადგან მას სვეტი \"%s.%s\" იყენებს" + +#: commands/tablecmds.c:6564 +#, c-format +msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "გარე ცხრილის \"%s\" შეცვლა შეუძლებელია, რადგან სვეტი \"%s.%s\" თავისი მწკრივის ტიპს იყენებს" + +#: commands/tablecmds.c:6571 +#, c-format +msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "ცხრილის \"%s\" შეცვლა შეუძლებელია, რადგან სვეტი \"%s.%s\" თავისი მწკრივის ტიპს იყენებს" + +#: commands/tablecmds.c:6627 +#, c-format +msgid "cannot alter type \"%s\" because it is the type of a typed table" +msgstr "ტიპის \"%s\" შეცვლა შეუძლებელია, რადგან ის ტიპიზირებული ცხრილის ტიპისაა" + +#: commands/tablecmds.c:6629 +#, c-format +msgid "Use ALTER ... CASCADE to alter the typed tables too." +msgstr "ტიპიზირებული ცხრილების ჩასასწორებლად გამოიყენეთ ALTER ... CASCADE." + +#: commands/tablecmds.c:6675 +#, c-format +msgid "type %s is not a composite type" +msgstr "ტიპი %s კომპოზიტური არაა" + +#: commands/tablecmds.c:6702 +#, c-format +msgid "cannot add column to typed table" +msgstr "ტიპიზირებულ ცხრილში სვეტების ჩამატება შეუძლებელია" + +#: commands/tablecmds.c:6755 +#, c-format +msgid "cannot add column to a partition" +msgstr "დანაყოფს სვეტს ვერ დაუმატებთ" + +#: commands/tablecmds.c:6784 commands/tablecmds.c:15144 +#, c-format +msgid "child table \"%s\" has different type for column \"%s\"" +msgstr "შვილ ცხრილს \"%s\" სვეტისთვის \"%s\" სხვა ტიპი გააჩნია" + +#: commands/tablecmds.c:6790 commands/tablecmds.c:15151 +#, c-format +msgid "child table \"%s\" has different collation for column \"%s\"" +msgstr "შვილ ცხრილს \"%s\" სვეტისთვის \"%s\" სხვა კოლაცია გააჩნია" + +#: commands/tablecmds.c:6804 +#, c-format +msgid "merging definition of column \"%s\" for child \"%s\"" +msgstr "მიმდინარეობს აღწერის შერწყმა სვეტისთვის \"%s\" შვილისთვის \"%s\"" + +#: commands/tablecmds.c:6847 +#, c-format +msgid "cannot recursively add identity column to table that has child tables" +msgstr "ცხრილისთვის, რომელსაც შვილი ცხრილები გააჩნია, იდენტიფიკაციის სვეტის რეკურსიული დამატება შეუძლებელია" + +#: commands/tablecmds.c:7091 +#, c-format +msgid "column must be added to child tables too" +msgstr "სვეტი შვილეულ ცხრილებსაც უნდა დაემატოთ" + +#: commands/tablecmds.c:7169 +#, c-format +msgid "column \"%s\" of relation \"%s\" already exists, skipping" +msgstr "ურთიერთობის (%2$s) სვეტი %1$s უკვე რსებობს. გამოტოვება" + +#: commands/tablecmds.c:7176 +#, c-format +msgid "column \"%s\" of relation \"%s\" already exists" +msgstr "ურთიერთობის (%2$s) სვეტი %1$s უკვე რსებობს" + +#: commands/tablecmds.c:7242 commands/tablecmds.c:12072 +#, c-format +msgid "cannot remove constraint from only the partitioned table when partitions exist" +msgstr "შეზღუდვის წაშლა მხოლოდ დაყოფილი ცხრილიდან მაშინ, როცა დანაყოფები არსებობს, შეუძლებელია" + +#: commands/tablecmds.c:7243 commands/tablecmds.c:7560 commands/tablecmds.c:8557 commands/tablecmds.c:12073 +#, c-format +msgid "Do not specify the ONLY keyword." +msgstr "ONLY არ მიუთითოთ." + +#: commands/tablecmds.c:7280 commands/tablecmds.c:7486 commands/tablecmds.c:7628 commands/tablecmds.c:7742 commands/tablecmds.c:7836 commands/tablecmds.c:7895 commands/tablecmds.c:8014 commands/tablecmds.c:8153 commands/tablecmds.c:8223 commands/tablecmds.c:8379 commands/tablecmds.c:12227 commands/tablecmds.c:13732 commands/tablecmds.c:16301 +#, c-format +msgid "cannot alter system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:7286 commands/tablecmds.c:7634 +#, c-format +msgid "column \"%s\" of relation \"%s\" is an identity column" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკატორი სვეტია" + +#: commands/tablecmds.c:7329 +#, c-format +msgid "column \"%s\" is in a primary key" +msgstr "სვეტი \"%s\" პირველადი გასაღებია" + +#: commands/tablecmds.c:7334 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "სვეტი \"%s\" რეპლიკის იდენტიფიკატორად გამოყენებული ინდექსია" + +#: commands/tablecmds.c:7357 +#, c-format +msgid "column \"%s\" is marked NOT NULL in parent table" +msgstr "სვეტი \"%s\" მშობელ ცხრილში NOT NULL-ით დანიშნული არაა" + +#: commands/tablecmds.c:7557 commands/tablecmds.c:9040 +#, c-format +msgid "constraint must be added to child tables too" +msgstr "შეზღუდვა შვილეულ ცხრილებსაც უნდა დაემატოთ" + +#: commands/tablecmds.c:7558 +#, c-format +msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" უკვე NOT NULL არაა." + +#: commands/tablecmds.c:7636 +#, c-format +msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." +msgstr "სანაცვლოდ გამოიყენეთ ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." + +#: commands/tablecmds.c:7641 +#, c-format +msgid "column \"%s\" of relation \"%s\" is a generated column" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" გენერირებული სვეტია" + +#: commands/tablecmds.c:7644 +#, c-format +msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." +msgstr "სანაცვლოდ გამოიყენეთ ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." + +#: commands/tablecmds.c:7753 +#, c-format +msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" უნდა აღწეროთ როგორც NOT NULL მანამდე, სანამ იდენტიფიკაციას დაამატებთ" + +#: commands/tablecmds.c:7759 +#, c-format +msgid "column \"%s\" of relation \"%s\" is already an identity column" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" უკვე იდენტიფიკატორი სვეტია" + +#: commands/tablecmds.c:7765 +#, c-format +msgid "column \"%s\" of relation \"%s\" already has a default value" +msgstr "ურთიერთობის \"%2$s\" სვეტს \"%1$s\" ნაგულისხმევი მნიშვნელობა უკვე გააჩნია" + +#: commands/tablecmds.c:7842 commands/tablecmds.c:7903 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not an identity column" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკატორი სვეტი არაა" + +#: commands/tablecmds.c:7908 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკატორი სვეტი არაა. გამოტოვება" + +#: commands/tablecmds.c:7961 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION შვილეულ ცხრილებზეც უნდა გადატარდეს" + +#: commands/tablecmds.c:7983 +#, c-format +msgid "cannot drop generation expression from inherited column" +msgstr "მემკვიდრეობითი სვეტიდან გენერაციის გამოსახულების წაშლა შეუძლებელია" + +#: commands/tablecmds.c:8022 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a stored generated column" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" დამახსოვრებული გენერირებული სვეტი არაა" + +#: commands/tablecmds.c:8027 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" +msgstr "ურთიერთობის \"%2$s\" სვეტი \"%1$s\" დამახსოვრებული გენერირებული სვეტი არაა. გამოტოვება" + +#: commands/tablecmds.c:8100 +#, c-format +msgid "cannot refer to non-index column by number" +msgstr "არა-ინდექსი სვეტის ნომრით მიმართვა შეუძლებელია" + +#: commands/tablecmds.c:8143 +#, c-format +msgid "column number %d of relation \"%s\" does not exist" +msgstr "ურთიერთობის (%2$s) სვეტი (%1$d) არ არსებობს" + +#: commands/tablecmds.c:8162 +#, c-format +msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" +msgstr "ინდექსის \"%2$s\" ჩასმული სვეტის \"%1$s\" სტატისტიკის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:8167 +#, c-format +msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" +msgstr "" + +#: commands/tablecmds.c:8169 +#, c-format +msgid "Alter statistics on table column instead." +msgstr "ამის ნაცვლად ცხრილის სვეტის სტატისტიკა შეცვალეთ." + +#: commands/tablecmds.c:8359 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "საცავის არასწორი ტიპი \"%s\"" + +#: commands/tablecmds.c:8391 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "სვეტის მონაცემების ტიპს %s საცავის ტიპად მხოლოდ PLAIN შეიძლება, ჰქონდეს" + +#: commands/tablecmds.c:8436 +#, c-format +msgid "cannot drop column from typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის წაშლა შეუძლებელია" + +#: commands/tablecmds.c:8495 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "სვეტი \"%s\" ურთიერთობაში \"%s\" არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:8508 +#, c-format +msgid "cannot drop system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" წაშლა შეუძლებელია" + +#: commands/tablecmds.c:8518 +#, c-format +msgid "cannot drop inherited column \"%s\"" +msgstr "მემკვიდრეობით მიღებული სვეტის \"%s\" წაშლა შეუძლებელია" + +#: commands/tablecmds.c:8531 +#, c-format +msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:8556 +#, c-format +msgid "cannot drop column from only the partitioned table when partitions exist" +msgstr "" + +#: commands/tablecmds.c:8760 +#, 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:8785 +#, 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:9122 +#, c-format +msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:9128 +#, c-format +msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:9131 +#, c-format +msgid "This feature is not yet supported on partitioned tables." +msgstr "ეს ოპერაცია დაყოფილი ცხრილებისთვის ჯერჯერობით მხარდაჭერილი არაა." + +#: commands/tablecmds.c:9138 commands/tablecmds.c:9604 +#, c-format +msgid "referenced relation \"%s\" is not a table" +msgstr "მითითებული ურთიერთობა \"%s\" ცხრილი არაა" + +#: commands/tablecmds.c:9161 +#, c-format +msgid "constraints on permanent tables may reference only permanent tables" +msgstr "მუდმივ ცხრილებზე არსებული შეზღუდვები მხოლოდ მუდმივ ცხრილებზე შეიძლება, მიუთითებდეს" + +#: commands/tablecmds.c:9168 +#, c-format +msgid "constraints on unlogged tables may reference only permanent or unlogged tables" +msgstr "ჟურნალის გარეშე მყოფი ცხრილების შეზღუდვები მხოლოდ მუდმივ ან ჟურნალის გარეშე მყოფ ცხრილებზე შეიძლება, მიუთითებდეს" + +#: commands/tablecmds.c:9174 +#, c-format +msgid "constraints on temporary tables may reference only temporary tables" +msgstr "დროებით ცხრილებზე არსებული შეზღუდვები მხოლოდ დროებით ცხრილებზე შეიძლება, მიუთითებდეს" + +#: commands/tablecmds.c:9178 +#, c-format +msgid "constraints on temporary tables must involve temporary tables of this session" +msgstr "დროებითი ცხრილის შეზღუდვები მიმდინარე სესიის დროებით ცხრილებს უნდა მიმართავდეს" + +#: commands/tablecmds.c:9252 commands/tablecmds.c:9258 +#, c-format +msgid "invalid %s action for foreign key constraint containing generated column" +msgstr "არასწორი ქმედება %s გარე გასაღების შეზღუდვის შემცველი გენერირებული სვეტისთვის" + +#: commands/tablecmds.c:9274 +#, c-format +msgid "number of referencing and referenced columns for foreign key disagree" +msgstr "" + +#: commands/tablecmds.c:9381 +#, c-format +msgid "foreign key constraint \"%s\" cannot be implemented" +msgstr "გარე გასაღების შეზღუდვის \"%s\" განხორციელება შეუძლებელია" + +#: commands/tablecmds.c:9383 +#, c-format +msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." +msgstr "გასაღების სვეტები \"%s\" და \"%s\" შეუთავსებელი ტიპებისაა: %s და %s." + +#: commands/tablecmds.c:9540 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" + +#: commands/tablecmds.c:9813 commands/tablecmds.c:10281 parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 +#, c-format +msgid "foreign key constraints are not supported on foreign tables" +msgstr "გარე გასაღების შეზღუდვები გარე ცხრილებზე მხარდაჭერილი არაა" + +#: commands/tablecmds.c:10833 commands/tablecmds.c:11111 commands/tablecmds.c:12029 commands/tablecmds.c:12104 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" does not exist" +msgstr "ურთიერთობის \"%2$s\" შეზღუდვა \"%1$s\" არ არსებობს" + +#: commands/tablecmds.c:10840 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" +msgstr "ურთიერთობის (\"%2$s\") შეზღუდვა \"%1$s\" გარე გასაღების შეზღუდვა არაა" + +#: commands/tablecmds.c:10878 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "ურთიერთობაზე \"%2$s\" შეზღუდვის \"%1$s\" შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:10881 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "შეზღუდვა \"%1$s\" ურთიერთობის \"%3$s\" შეზღუდვიდანა \"%2$s\"-ია ნაწარმოები." + +#: commands/tablecmds.c:10883 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "" + +#: commands/tablecmds.c:11119 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" +msgstr "ურთიერთობის (\"%2$s\") შეზღუდვა \"%1$s\" გარე გასაღები ან შემოწმების შეზღუდვა არაა" + +#: commands/tablecmds.c:11197 +#, c-format +msgid "constraint must be validated on child tables too" +msgstr "შეზღუდვა შვილ ცხრილებზეც უნდა გადამოწმდეს" + +#: commands/tablecmds.c:11287 +#, c-format +msgid "column \"%s\" referenced in foreign key constraint does not exist" +msgstr "გარე გასაღების შეზღუდვაში მითითებული სვეტი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:11293 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "უცხო გასაღებებში სისტემურ სვეტებს ვერ გამოიყენებთ" + +#: commands/tablecmds.c:11297 +#, c-format +msgid "cannot have more than %d keys in a foreign key" +msgstr "გარე გასაღებში %d გასაღებზე მეტი ვერ გექნებათ" + +#: commands/tablecmds.c:11363 +#, c-format +msgid "cannot use a deferrable primary key for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:11380 +#, c-format +msgid "there is no primary key for referenced table \"%s\"" +msgstr "მითითებული ცხრილისთვის \"%s\" ძირითადი გასაღები არ არსებობს" + +#: commands/tablecmds.c:11445 +#, c-format +msgid "foreign key referenced-columns list must not contain duplicates" +msgstr "" + +#: commands/tablecmds.c:11539 +#, c-format +msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:11544 +#, c-format +msgid "there is no unique constraint matching given keys for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:11985 +#, c-format +msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" +msgstr "მემკვიდრეობით მიღებული ურთიერთობის \"%2$s\" შეზღუდვის \"%1$s\" წაშლა შეუძლებელია" + +#: commands/tablecmds.c:12035 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "ურთიერთობის (\"%2$s\") შეზღუდვა (\"%1$s\") არ არსებობს. გამოტოვება" + +#: commands/tablecmds.c:12211 +#, c-format +msgid "cannot alter column type of typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12238 +#, c-format +msgid "cannot alter inherited column \"%s\"" +msgstr "მემკვიდრეობით მიღებული სვეტის \"%s\" შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12247 +#, c-format +msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "სვეტის \"%s\" შეცვლა შეუძლებელია, რადგან ის ურთიერთობის \"%s\" დანაყოფის გასაღების ნაწილია" + +#: commands/tablecmds.c:12297 +#, c-format +msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:12300 +#, c-format +msgid "You might need to add an explicit cast." +msgstr "შეიძლება აშკარა დაკასტვა უნდა დაამატოთ." + +#: commands/tablecmds.c:12304 +#, 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:12307 +#, c-format +msgid "You might need to specify \"USING %s::%s\"." +msgstr "შეიძლება, გჭირდებათ, მიუთითოთ \"USING %s::%s\"." + +#: commands/tablecmds.c:12406 +#, c-format +msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgstr "ურთიერთობის \"%2$s\" სვეტის \"%1$s\" შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12434 +#, c-format +msgid "USING expression contains a whole-row table reference." +msgstr "" + +#: commands/tablecmds.c:12445 +#, c-format +msgid "type of inherited column \"%s\" must be changed in child tables too" +msgstr "" + +#: commands/tablecmds.c:12570 +#, c-format +msgid "cannot alter type of column \"%s\" twice" +msgstr "სვეტის (\"%s\") ტიპის ორჯერ შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12608 +#, c-format +msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:12613 +#, c-format +msgid "default for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:12694 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "ხედის ან წესის მიერ გამოყენებული სვეტის ტიპის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12695 commands/tablecmds.c:12714 commands/tablecmds.c:12732 +#, c-format +msgid "%s depends on column \"%s\"" +msgstr "%s ეყრდნობა სვეტს \"%s\"" + +#: commands/tablecmds.c:12713 +#, c-format +msgid "cannot alter type of a column used in a trigger definition" +msgstr "ტრიგერის აღწერაში გამოყენებული სვეტის ტიპის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12731 +#, c-format +msgid "cannot alter type of a column used in a policy definition" +msgstr "პოლიტიკის აღწერაში გამოყენებული სვეტის ტიპის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12762 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "გენერირებული სვეტის მიერ გამოყენებული სვეტის ტიპის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:12763 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "სვეტი (%s\") გენერირებული სვეტის (%s) მიერ გამოიყენება." + +#: commands/tablecmds.c:13840 commands/tablecmds.c:13852 +#, c-format +msgid "cannot change owner of index \"%s\"" +msgstr "ინდექსის \"%s\" მფლობელის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:13842 commands/tablecmds.c:13854 +#, c-format +msgid "Change the ownership of the index's table, instead." +msgstr "ამის მაგიერ ინდექსის ცხრილის მფლობელი შეცვალეთ." + +#: commands/tablecmds.c:13868 +#, c-format +msgid "cannot change owner of sequence \"%s\"" +msgstr "მიმდევრობის \"%s\" მფლობელის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:13882 commands/tablecmds.c:17193 commands/tablecmds.c:17212 +#, c-format +msgid "Use ALTER TYPE instead." +msgstr "ამის ნაცვლად გამოიყენეთ ALTER TYPE." + +#: commands/tablecmds.c:13891 +#, c-format +msgid "cannot change owner of relation \"%s\"" +msgstr "ურთიერთობის \"%s\" მფლობელის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:14253 +#, c-format +msgid "cannot have multiple SET TABLESPACE subcommands" +msgstr "ერთზე მეტი SET TABLESPACE ქვებრძანება ვერ გექნებათ" + +#: commands/tablecmds.c:14330 +#, c-format +msgid "cannot set options for relation \"%s\"" +msgstr "ურთიერთობის (%s) პარამეტრების დაყენება შეუძლებელია" + +#: commands/tablecmds.c:14364 commands/view.c:521 +#, c-format +msgid "WITH CHECK OPTION is supported only on automatically updatable views" +msgstr "WITH CHECK OPTION მხოლოდ ავტომატურად განახლებად ხედებზეა მხარდაჭერილი" + +#: commands/tablecmds.c:14614 +#, c-format +msgid "only tables, indexes, and materialized views exist in tablespaces" +msgstr "ცხრილის სივრცეში მხოლოდ ცხრილები, ინდექსები და მატერიალიზებული ხედები შეიძლება არსებობდეს" + +#: commands/tablecmds.c:14626 +#, c-format +msgid "cannot move relations in to or out of pg_global tablespace" +msgstr "ცხრილების სივრცეში pg_globl ურთიერთობების შეტანა/გამოტანა შეუძლებელია" + +#: commands/tablecmds.c:14718 +#, c-format +msgid "aborting because lock on relation \"%s.%s\" is not available" +msgstr "შეწყვეტა, რადგან ბლოკი ურთიერთობაზე \"%s.%s\" ხელმისაწვდომი არაა" + +#: commands/tablecmds.c:14734 +#, c-format +msgid "no matching relations in tablespace \"%s\" found" +msgstr "ცხრილების სივრცეში \"%s\" ურთიერთობა, რომელიც ემთხვევა, ვერ ვიპოვე" + +#: commands/tablecmds.c:14852 +#, c-format +msgid "cannot change inheritance of typed table" +msgstr "ტიპიზირებული ცხრილის მემკვიდრეობითობის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:14857 commands/tablecmds.c:15413 +#, c-format +msgid "cannot change inheritance of a partition" +msgstr "დანაყოფის მემკვიდრეობითობის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:14862 +#, c-format +msgid "cannot change inheritance of partitioned table" +msgstr "დაყოფილი ცხრილის მემკვიდრეობითობის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:14908 +#, c-format +msgid "cannot inherit to temporary relation of another session" +msgstr "სხვა სესიის დროებითი ურთიერთობის მემკვიდრეობით მიღება შეუძლებელია" + +#: commands/tablecmds.c:14921 +#, c-format +msgid "cannot inherit from a partition" +msgstr "დანაყოფიდან მემკვიდრეობითობა შეუძლებელია" + +#: commands/tablecmds.c:14943 commands/tablecmds.c:17846 +#, c-format +msgid "circular inheritance not allowed" +msgstr "წრიული მემკვიდრეობითობა დაუშვებელია" + +#: commands/tablecmds.c:14944 commands/tablecmds.c:17847 +#, c-format +msgid "\"%s\" is already a child of \"%s\"." +msgstr "\"%s\" უკვე \"%s\"-ის შვილია." + +#: commands/tablecmds.c:14957 +#, c-format +msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" +msgstr "ტრიგერი \"%s\" ხელს უშლის ცხრილს \"%s\" მემკვიდრეობის შვილად გადაიქცეს" + +#: commands/tablecmds.c:14959 +#, c-format +msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." +msgstr "ROW ტრიგერები, რომლებსაც გარდამავალი ცხრილები გააჩნიათ, მემკვიდრეობითობის იერარქიებში მხარდაჭერილი არაა." + +#: commands/tablecmds.c:15162 +#, c-format +msgid "column \"%s\" in child table must be marked NOT NULL" +msgstr "სვეტი \"%s\" შვილ ცხრილში NOT NULL-ით უნდა იყოს დანიშნული" + +#: commands/tablecmds.c:15171 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "" + +#: commands/tablecmds.c:15221 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "" + +#: commands/tablecmds.c:15249 +#, c-format +msgid "child table is missing column \"%s\"" +msgstr "შვილეულ ცხრილს აკლია სვეტი \"%s\"" + +#: commands/tablecmds.c:15337 +#, c-format +msgid "child table \"%s\" has different definition for check constraint \"%s\"" +msgstr "შვილ ცხრილს \"%s\" შემოწმების შეზღუდვისთვის \"%s\" სხვა განსაზღვრება გააჩნია" + +#: commands/tablecmds.c:15345 +#, c-format +msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" +msgstr "შეზღუდვა \"%s\" კონფლიქტშია არა-მემკვიდრეობით მიღებულ შეზღუდვასთან შვილ ცხრილზე \"%s\"" + +#: commands/tablecmds.c:15356 +#, c-format +msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" +msgstr "შეზღუდვა \"%s\" კონფლიქტშია შეზღუდვასთან NOT VALID შვილ ცხრილზე \"%s\"" + +#: commands/tablecmds.c:15391 +#, c-format +msgid "child table is missing constraint \"%s\"" +msgstr "შვილეულ ცხრილს აკლია შეზღუდვა \"%s\"" + +#: commands/tablecmds.c:15477 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "დანაყოფი \"%s\" უკვე დაყოფილი ცხრილიდან \"%s.%s\" მოხსნის რიგშია" + +#: commands/tablecmds.c:15506 commands/tablecmds.c:15554 +#, c-format +msgid "relation \"%s\" is not a partition of relation \"%s\"" +msgstr "ურთიერთობა \"%s\" ურთიერთობის \"%s\" დანაყოფს არ წარმოადგენს" + +#: commands/tablecmds.c:15560 +#, c-format +msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgstr "ურთიერთობა \"%s\" ურთიერთობის \"%s\" მშობელს არ წარმოადგენს" + +#: commands/tablecmds.c:15788 +#, c-format +msgid "typed tables cannot inherit" +msgstr "ტიპიზირებულ ცხრილებს მემკვიდრეობითობა არ შეუძლიათ" + +#: commands/tablecmds.c:15818 +#, c-format +msgid "table is missing column \"%s\"" +msgstr "ცხრილს აკლია სვეტი \"%s\"" + +#: commands/tablecmds.c:15829 +#, c-format +msgid "table has column \"%s\" where type requires \"%s\"" +msgstr "ცხრილს აქვს სვეტი \"%s\" მაშინ, როცა ტიპი \"%s\"-ს მოითხოვს" + +#: commands/tablecmds.c:15838 +#, c-format +msgid "table \"%s\" has different type for column \"%s\"" +msgstr "ცხრილს \"%s\" სვეტისთვის \"%s\" სხვა ტიპი აქვს" + +#: commands/tablecmds.c:15852 +#, c-format +msgid "table has extra column \"%s\"" +msgstr "ცხრილს აქვს დამატებითი სვეტი \"%s\"" + +#: commands/tablecmds.c:15904 +#, c-format +msgid "\"%s\" is not a typed table" +msgstr "\"%s\" ტიპიზირებული ცხრილი არაა" + +#: commands/tablecmds.c:16078 +#, c-format +msgid "cannot use non-unique index \"%s\" as replica identity" +msgstr "არაუნიკალურ ინდექსს \"%s\" რეპლიკის იდენტიფიკაციისთვის ვერ გამოიყენებთ" + +#: commands/tablecmds.c:16084 +#, c-format +msgid "cannot use non-immediate index \"%s\" as replica identity" +msgstr "არასაუყოვნებლივ ინდექსს \"%s\" რეპლიკის იდენფიტიკაციისთვის ვერ გამოიყენებთ" + +#: commands/tablecmds.c:16090 +#, c-format +msgid "cannot use expression index \"%s\" as replica identity" +msgstr "გამოსახულების ინდექსს \"%s\" რეპლიკის იდენტიფიკაციისთვის ვერ გამოიყენებთ" + +#: commands/tablecmds.c:16096 +#, c-format +msgid "cannot use partial index \"%s\" as replica identity" +msgstr "ნაწილობრივი ინდექსის (\"%s\") რეპლიკის იდენტიფიკატორად გამოყენება შეუძლებელია" + +#: commands/tablecmds.c:16113 +#, c-format +msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" +msgstr "ინდექსს \"%s\" რეპლიკის იდენტიფიკაციისთვის ვერ გამოიყენებთ, რადგან სვეტი %d სისტემური სვეტია" + +#: commands/tablecmds.c:16120 +#, c-format +msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" +msgstr "ინდექსს \"%s\" რეპლიკის იდენტიფიკაციისთვის ვერ გამოიყენებთ, რადგან სვეტი %s განულებადია" + +#: commands/tablecmds.c:16367 +#, c-format +msgid "cannot change logged status of table \"%s\" because it is temporary" +msgstr "ცხრილის \"%s\" ჟურნალში ჩაწერის სტატუსის შეცვლა შეუძლებელია, რადგან ის დროებითია" + +#: commands/tablecmds.c:16391 +#, c-format +msgid "cannot change table \"%s\" to unlogged because it is part of a publication" +msgstr "" + +#: commands/tablecmds.c:16393 +#, c-format +msgid "Unlogged relations cannot be replicated." +msgstr "უჟურნალო ურთიერთობების რეპლიკაცია შეუძლებელია." + +#: commands/tablecmds.c:16438 +#, c-format +msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:16448 +#, c-format +msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:16506 +#, c-format +msgid "cannot move an owned sequence into another schema" +msgstr "" + +#: commands/tablecmds.c:16613 +#, c-format +msgid "relation \"%s\" already exists in schema \"%s\"" +msgstr "სქემაში (%2$s) ურთიერთობა (%1$s) უკვე არსებობს" + +#: commands/tablecmds.c:17026 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" ცხრილი ან მატერიალიზებული ხედი არაა" + +#: commands/tablecmds.c:17176 +#, c-format +msgid "\"%s\" is not a composite type" +msgstr "ტიპი %s კომპოზიტური არაა" + +#: commands/tablecmds.c:17204 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "ინდექსის (%s) სქემის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:17206 commands/tablecmds.c:17218 +#, c-format +msgid "Change the schema of the table instead." +msgstr "ამის მაგიერ ცხრილის სქემა შეცვლათ." + +#: commands/tablecmds.c:17210 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "კომპოზიტური ტიპის (%s) სქემის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:17216 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "\"TOAST\" ცხრილის (%s) სქემის შეცვლა შეუძლებელია" + +#: commands/tablecmds.c:17253 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "დაყოფის უცნობი სტრატეგია: %s" + +#: commands/tablecmds.c:17261 +#, c-format +msgid "cannot use \"list\" partition strategy with more than one column" +msgstr "ერთზე მეტ სვეტთან ერთად დაყოფის სტრატეგიას \"list\" ვერ გამოიყენებთ" + +#: commands/tablecmds.c:17327 +#, c-format +msgid "column \"%s\" named in partition key does not exist" +msgstr "დანაყოფის გასაღებში დასახელებული სვეტი \"%s\" არ არსებობს" + +#: commands/tablecmds.c:17335 +#, c-format +msgid "cannot use system column \"%s\" in partition key" +msgstr "დანაყოფის გასაღებში სისტემური სვეტის (%s) გამოყენება შეუძლებელია" + +#: commands/tablecmds.c:17346 commands/tablecmds.c:17460 +#, c-format +msgid "cannot use generated column in partition key" +msgstr "გენერირებულ სვეტს დანაყოფის გასაღებში ვერ გამოიყენებთ" + +#: commands/tablecmds.c:17347 commands/tablecmds.c:17461 commands/trigger.c:668 rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "სვეტი \"%s\" გენერირებული სვეტია." + +#: commands/tablecmds.c:17423 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "ფუნქცია დანაყოფის გასაღების გამოსახულებაში აუცილებლად უნდა იყოს მონიშნული, როგორც IMMUTABLE" + +#: commands/tablecmds.c:17443 +#, c-format +msgid "partition key expressions cannot contain system column references" +msgstr "დანაყოფის გასაღების გამოსახულებები, არ შეიძლება, სისტემურ სვეტზე მითითებებს შეიცავდნენ" + +#: commands/tablecmds.c:17473 +#, c-format +msgid "cannot use constant expression as partition key" +msgstr "დაყოფის გასაღების გამოსახულებაში მუდმივ გამოსახულებას ვერ გამოიყენებთ" + +#: commands/tablecmds.c:17494 +#, c-format +msgid "could not determine which collation to use for partition expression" +msgstr "დანაყოფის გამოსახულებისათვის კოლაციის დადგენა შეუძლებელია" + +#: commands/tablecmds.c:17529 +#, 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:17535 +#, c-format +msgid "You must specify a btree operator class or define a default btree operator class for the data type." +msgstr "" + +#: commands/tablecmds.c:17786 +#, c-format +msgid "\"%s\" is already a partition" +msgstr "\"%s\" უკვე დანაყოფია" + +#: commands/tablecmds.c:17792 +#, c-format +msgid "cannot attach a typed table as partition" +msgstr "ტიპიზირებული ცხრილის, როგორც დანაყოფის მიბმა შეუძლებელია" + +#: commands/tablecmds.c:17808 +#, c-format +msgid "cannot attach inheritance child as partition" +msgstr "მემკვიდრეობის შვილის დანაყოფად მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17822 +#, c-format +msgid "cannot attach inheritance parent as partition" +msgstr "მემკვიდრეობის მშობლის დანაყოფად მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17856 +#, c-format +msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" +msgstr "დროებითი ურითერთობის, როგორც მუდმივი ურთიერთობის (\"%s\") დანაყოფის მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17864 +#, c-format +msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" +msgstr "მუდმივი ურთიერთობის, როგორც დროებითი ურთიერთობის (%s) დანაყოფის მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17872 +#, c-format +msgid "cannot attach as partition of temporary relation of another session" +msgstr "სხვა სესიის დროებითი ურთიერთობის დანაყოფის მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17879 +#, c-format +msgid "cannot attach temporary relation of another session as partition" +msgstr "სხვა სესიის დროებითი ურთიერთობის დანაყოფად მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:17899 +#, c-format +msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" +msgstr "ცხრილი \"%s\" შეიცავს სვეტს \"%s\", რომელიც მშობელში \"%s\" აღმოჩენილი არაა" + +#: commands/tablecmds.c:17902 +#, c-format +msgid "The new partition may contain only the columns present in parent." +msgstr "ახალი დანაყოფი მხოლოდ მშობელში არსებულ სვეტებს შეიძლება, შეიცავდეს." + +#: commands/tablecmds.c:17914 +#, c-format +msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" +msgstr "ტრიგერი \"%s\" ხელს უშლის ცხრილს \"%s\" დანაყოფად გადაიქცეს" + +#: commands/tablecmds.c:17916 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "დანაყოფებზე იდენტიფიკაციის სვეტები მხარდაჭერილი არაა." + +#: commands/tablecmds.c:18095 +#, c-format +msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" +msgstr "გარე ცხრილის \"%s\" დაყოფილი ცხრილის (\"%s\") დანაყოფის სახით მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:18098 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "დაყოფილი ცხრილი \"%s\" უნიკალურ ცხრილებს შეიცავს." + +#: commands/tablecmds.c:18413 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "ნაგულისხმევი დანაყოფის არსებობის შემთხვევაში დანაყოფების ერთდროული მოხსნა შეუძლებელია" + +#: commands/tablecmds.c:18522 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "დაყოფილი ცხრილი \"%s\" ერთდროულად წაიშალა" + +#: commands/tablecmds.c:18528 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "დანაყოფი \"%s\" ერთდროულად წაიშალა" + +#: commands/tablecmds.c:19043 commands/tablecmds.c:19063 commands/tablecmds.c:19083 commands/tablecmds.c:19102 commands/tablecmds.c:19144 +#, c-format +msgid "cannot attach index \"%s\" as a partition of index \"%s\"" +msgstr "ერთი ინდექსის ინდექსის (%s) მეორე ინდექსის (\"%s) დანაყოფად მიმაგრება შეუძლებელია" + +#: commands/tablecmds.c:19046 +#, c-format +msgid "Index \"%s\" is already attached to another index." +msgstr "ინდექსი %s სხვა ინდექსზეა უკვე მიმაგრებული." + +#: commands/tablecmds.c:19066 +#, c-format +msgid "Index \"%s\" is not an index on any partition of table \"%s\"." +msgstr "ინდექსი %s ცხრილის (%s) არცერთი დანაყოფის ინდექსი არაა." + +#: commands/tablecmds.c:19086 +#, c-format +msgid "The index definitions do not match." +msgstr "ინდექსის აღწერები არ ემთხვევა." + +#: commands/tablecmds.c:19105 +#, c-format +msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." +msgstr "" + +#: commands/tablecmds.c:19147 +#, c-format +msgid "Another index is already attached for partition \"%s\"." +msgstr "ცხრილისთვის %s სხვა ინდექსი უკვე მიმაგრებულია." + +#: commands/tablecmds.c:19384 +#, c-format +msgid "column data type %s does not support compression" +msgstr "სვეტის მონაცემის ტიპს (%s) შეკუმშვის მხარდაჭერა არ გააჩნია" + +#: commands/tablecmds.c:19391 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "შეკუმშვის არასწორი მეთოდი \"%s\"" + +#: commands/tablespace.c:199 commands/tablespace.c:665 +#, c-format +msgid "\"%s\" exists but is not a directory" +msgstr "%s არსებობს, მაგრამ საქაღალდე არაა" + +#: commands/tablespace.c:231 +#, c-format +msgid "permission denied to create tablespace \"%s\"" +msgstr "ცხრილების სივრცის შექმნის წვდომა აკრძალულია: \"%s\"" + +#: commands/tablespace.c:233 +#, c-format +msgid "Must be superuser to create a tablespace." +msgstr "ცხრილის სივრცეების შესაქმნელად საჭიროა ზემომხმარებლის უფლებები." + +#: commands/tablespace.c:249 +#, c-format +msgid "tablespace location cannot contain single quotes" +msgstr "ცხრილის სივრცის მდებარეობა ერთმაგ ფრჩხილებს არ შეიცავს" + +#: commands/tablespace.c:262 +#, c-format +msgid "tablespace location must be an absolute path" +msgstr "ცხრილის სივრცის მდებარეობა აბსოლუტური ბილიკი უნდა იყოს" + +#: commands/tablespace.c:274 +#, c-format +msgid "tablespace location \"%s\" is too long" +msgstr "ცხრილის სივრცის მდებარეობა \"%s\" ძალიან გრძელია" + +#: commands/tablespace.c:281 +#, c-format +msgid "tablespace location should not be inside the data directory" +msgstr "ცხრილის სივრცის მდებარეობა მონაცემების საქაღალდის შიგნით არ უნდა მდებარეობდეს" + +#: commands/tablespace.c:290 commands/tablespace.c:996 +#, c-format +msgid "unacceptable tablespace name \"%s\"" +msgstr "ცხრილის სივრცის დაუშვებელი სახელი: %s" + +#: commands/tablespace.c:292 commands/tablespace.c:997 +#, c-format +msgid "The prefix \"pg_\" is reserved for system tablespaces." +msgstr "პრეფიქსი \"pg_\" დაცულია სისტემური ცხრილის სივრცეებისთვის." + +#: commands/tablespace.c:311 commands/tablespace.c:1018 +#, c-format +msgid "tablespace \"%s\" already exists" +msgstr "ცხრილის სივრცე უკვე არსებობს: %s" + +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "ბინარული განახლების რეჟიმში pg_tablespace-ის OID-ის მნიშვნელობა დაყენებული არაა" + +#: commands/tablespace.c:441 commands/tablespace.c:979 commands/tablespace.c:1068 commands/tablespace.c:1137 commands/tablespace.c:1283 commands/tablespace.c:1486 +#, c-format +msgid "tablespace \"%s\" does not exist" +msgstr "ცხრილის სივრცე არ არსებობს: %s" + +#: commands/tablespace.c:447 +#, c-format +msgid "tablespace \"%s\" does not exist, skipping" +msgstr "ცხრილის სივრცე არ არსებობს: %s, გამოტოვება" + +#: commands/tablespace.c:473 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "ცხრილების სივრცის (%s) წაშლა შეუძლებელია. მას სხვა ობიექტები ეყრდნობა" + +#: commands/tablespace.c:540 +#, c-format +msgid "tablespace \"%s\" is not empty" +msgstr "ცხრილის სივრცე %s ცარიელი არაა" + +#: commands/tablespace.c:632 +#, c-format +msgid "directory \"%s\" does not exist" +msgstr "საქაღალდე არ არსებობს: %s" + +#: commands/tablespace.c:633 +#, c-format +msgid "Create this directory for the tablespace before restarting the server." +msgstr "სერვერის გადატვირთვამდე ცხრილის სივრცეებისთვის საქაღალდე შექმენით ." + +#: commands/tablespace.c:638 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "საქაღალდეზე \"%s\" წვდომების დაყენების შეცდომა: %m" + +#: commands/tablespace.c:670 +#, c-format +msgid "directory \"%s\" already in use as a tablespace" +msgstr "საქაღალდე \"%s\" ცხრილების სივრცის მიერ უკვე გამოიყენება" + +#: commands/tablespace.c:788 commands/tablespace.c:801 commands/tablespace.c:837 commands/tablespace.c:929 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:850 commands/tablespace.c:938 +#, c-format +msgid "could not remove symbolic link \"%s\": %m" +msgstr "სიმბმულის წაშლის შეცდომა %s: %m" + +#: commands/tablespace.c:860 commands/tablespace.c:947 +#, c-format +msgid "\"%s\" is not a directory or symbolic link" +msgstr "%s საქაღალდეს ან სიმბმულს არ წარმოადგენს" + +#: commands/tablespace.c:1142 +#, c-format +msgid "Tablespace \"%s\" does not exist." +msgstr "ცხრილის სივრცე არ არსებობს: %s." + +#: commands/tablespace.c:1588 +#, c-format +msgid "directories for tablespace %u could not be removed" +msgstr "ცხრილების სივრცის (%u) საქაღალდეების წაშლა შეუძლებელია" + +#: commands/tablespace.c:1590 +#, c-format +msgid "You can remove the directories manually if necessary." +msgstr "თუ გჭირდებათ, საქაღალდეები შეგიძლიათ ხელითაც წაშალოთ." + +#: commands/trigger.c:230 commands/trigger.c:241 +#, c-format +msgid "\"%s\" is a table" +msgstr "\"%s\" ცხრილია" + +#: commands/trigger.c:232 commands/trigger.c:243 +#, c-format +msgid "Tables cannot have INSTEAD OF triggers." +msgstr "ცხრილებს INSTEAD OF ტიპის ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:264 +#, c-format +msgid "\"%s\" is a partitioned table" +msgstr "\"%s\" დაყოფილი ცხრილია" + +#: commands/trigger.c:266 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitioned tables." +msgstr "დანაყოფებზე იდენტიფიკაციის სვეტები მხარდაჭერილი არაა." + +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 +#, c-format +msgid "\"%s\" is a view" +msgstr "\"%s\" ხედია" + +#: commands/trigger.c:280 +#, c-format +msgid "Views cannot have row-level BEFORE or AFTER triggers." +msgstr "ხედებს მწკრივის დონის BEFORE და AFTER ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:287 +#, c-format +msgid "Views cannot have TRUNCATE triggers." +msgstr "ხედებს TRUNCATE ტიპის ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 commands/trigger.c:449 +#, c-format +msgid "\"%s\" is a foreign table" +msgstr "\"%s\" გარე ცხრილია" + +#: commands/trigger.c:297 +#, c-format +msgid "Foreign tables cannot have INSTEAD OF triggers." +msgstr "გარე ცხრილებს INSTEAD OF ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:304 +#, c-format +msgid "Foreign tables cannot have TRUNCATE triggers." +msgstr "გარე ცხრილებს TRUNCATE ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:316 +#, c-format +msgid "Foreign tables cannot have constraint triggers." +msgstr "გარე ცხრილებს შეზღუდვის ტრიგერები ვერ ექნებათ." + +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "ურთიერთობას \"%s\" ტრიგერები არ შეიძლება ჰქონდეთ" + +#: commands/trigger.c:392 +#, c-format +msgid "TRUNCATE FOR EACH ROW triggers are not supported" +msgstr "TRUNCATE FOR EACH ROW ტრიგერები მხარდაუჭერელია" + +#: commands/trigger.c:400 +#, c-format +msgid "INSTEAD OF triggers must be FOR EACH ROW" +msgstr "INSTEAD OF ტრიგერები უნდა იყოს FOR EACH ROW" + +#: commands/trigger.c:404 +#, c-format +msgid "INSTEAD OF triggers cannot have WHEN conditions" +msgstr "INSTEAD OF ტრიგერებს WHEN პირობები არ შეიძლება ჰქონდეს" + +#: commands/trigger.c:408 +#, c-format +msgid "INSTEAD OF triggers cannot have column lists" +msgstr "INSTEAD OF ტრიგერებს სვეტების სიები არ შეიძლება ჰქონდეთ" + +#: commands/trigger.c:437 +#, c-format +msgid "ROW variable naming in the REFERENCING clause is not supported" +msgstr "" + +#: commands/trigger.c:438 +#, c-format +msgid "Use OLD TABLE or NEW TABLE for naming transition tables." +msgstr "გარდამავალი ცხრილების სახელებისთვის OLD TABLE ან NEW TABLE გამოიყენეთ." + +#: commands/trigger.c:451 +#, c-format +msgid "Triggers on foreign tables cannot have transition tables." +msgstr "გარე ცხრილებზე არსებულ ტრიგერებს გარდამავალი ცხრილები ვერ ექნებათ." + +#: commands/trigger.c:458 +#, c-format +msgid "Triggers on views cannot have transition tables." +msgstr "ხედებზე არსებულ ტრიგერებს გარდამავალი ცხრილები ვერ ექნებათ." + +#: commands/trigger.c:474 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "ROW ტრიგერები გარდამავალი ცხრილებით დანაყოფებზე მხარდაჭერილი არაა" + +#: commands/trigger.c:478 +#, c-format +msgid "ROW triggers with transition tables are not supported on inheritance children" +msgstr "ROW ტრიგერები გარდამავალი ცხრილებით მემკვიდრეობის შვილებზე მხარდაჭერილი არაა" + +#: commands/trigger.c:484 +#, c-format +msgid "transition table name can only be specified for an AFTER trigger" +msgstr "გარდამავალი ცხრილის სახელი მხოლოდ ტრიგერისთვის AFTER შეგიძლიათ, მიუთითოთ" + +#: commands/trigger.c:489 +#, c-format +msgid "TRUNCATE triggers with transition tables are not supported" +msgstr "ტრიგერები TRUNCATE გარდამავალი ცხრილებით მხარდაჭერილი არაა" + +#: commands/trigger.c:506 +#, c-format +msgid "transition tables cannot be specified for triggers with more than one event" +msgstr "გარდამავალი ცხრილების მითითება ტრიგერებისთვის, რომლებსაც ერთზე მეტი მოვლენა გააჩნიათ, შეუძლებელია" + +#: commands/trigger.c:517 +#, c-format +msgid "transition tables cannot be specified for triggers with column lists" +msgstr "გარდამავალი ცხრილების მითითება ტრიგერებისთვის, რომლებსაც სვეტების სიები გააჩნიათ, შეუძლებელია" + +#: commands/trigger.c:534 +#, c-format +msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" +msgstr "NEW TABLE მხოლოდ INSERT ან UPDATE ტრიგერისთვის შეგიძლიათ, მიუთითოთ" + +#: commands/trigger.c:539 +#, c-format +msgid "NEW TABLE cannot be specified multiple times" +msgstr "NEW TABLE -ის რამდენჯერმე მითითება აკრძალულია" + +#: commands/trigger.c:549 +#, c-format +msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" +msgstr "OLD TABLE მხოლოდ DELETE ან UPDATE ტრიგერისთვის შეგიძლიათ, მიუთითოთ" + +#: commands/trigger.c:554 +#, c-format +msgid "OLD TABLE cannot be specified multiple times" +msgstr "OLD TABLE -ის რამდენჯერმე მითითება აკრძალულია" + +#: commands/trigger.c:564 +#, c-format +msgid "OLD TABLE name and NEW TABLE name cannot be the same" +msgstr "OLD TABLE-ის და NEW TABLE-ის სახელები ერთი და იგივე ვერ იქნება" + +#: commands/trigger.c:628 commands/trigger.c:641 +#, c-format +msgid "statement trigger's WHEN condition cannot reference column values" +msgstr "გამოსახულების ტრიგერის WHEN პირობა არ შეუძლება, სვეტის მნიშვნელობებზე მიუთითებდეს" + +#: commands/trigger.c:633 +#, c-format +msgid "INSERT trigger's WHEN condition cannot reference OLD values" +msgstr "INSERT-ის ტრიგერის WHEN პირობა არ შეიძლება, OLD მნიშვნელობებზე მიუთითებდეს" + +#: commands/trigger.c:646 +#, c-format +msgid "DELETE trigger's WHEN condition cannot reference NEW values" +msgstr "DELETE-ის ტრიგერის WHEN პირობა არ შეიძლება, NEW მნიშვნელობებზე მიუთითებდეს" + +#: commands/trigger.c:651 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" +msgstr "BEFORE-ის ტრიგერის WHEN პირობა არ შეიძლება, NEW სისტემურ სვეტებზე მიუთითებდეს" + +#: commands/trigger.c:659 commands/trigger.c:667 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" +msgstr "BEFORE-ის ტრიგერის WHEN პირობა არ შეიძლება, NEW გენერირებულ სვეტებზე მიუთითებდეს" + +#: commands/trigger.c:660 +#, c-format +msgid "A whole-row reference is used and the table contains generated columns." +msgstr "" + +#: commands/trigger.c:775 commands/trigger.c:1653 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" already exists" +msgstr "ტრიგერი \"%s\" ურთიერთობისთვის \"%s\" უკვე არსებობს" + +#: commands/trigger.c:788 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "ტრიგერი \"%s\" ურთიერთობისთვის \"%s\" შიდა ან შვილეული ტრიგერია" + +#: commands/trigger.c:807 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "ტრიგერი \"%s\" ურთიერთობისთვის \"%s\", შეზღუდვის ტრიგერია" + +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 +#, c-format +msgid "trigger \"%s\" for table \"%s\" does not exist" +msgstr "ტრიგერი \"%s\" ცხრილისთვის \"%s\" არ არსებობს" + +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "ტრიგერის (%s) (ცხრილზე %s) სახელის გადარქმევა შეუძლებელია" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "ამის მაგიერ დაყოფილ ცხრილზე ('%s\") ტრიგერს გადაარქვით სახელი." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "ურთიერთობაზე \"%2$s\" ტრიგერს \"%1$s\" სახელი გადაერქვა" + +#: commands/trigger.c:1816 +#, c-format +msgid "permission denied: \"%s\" is a system trigger" +msgstr "წვდომა აკრძალულია: %s სისტემური ტრიგერია" + +#: commands/trigger.c:2449 +#, c-format +msgid "trigger function %u returned null value" +msgstr "ტრიგერის ფუნქციამ %u ნულოვანი მნიშვნელობა დააბრუნა" + +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 commands/trigger.c:3346 +#, c-format +msgid "BEFORE STATEMENT trigger cannot return a value" +msgstr "BEFORE STATEMENT ტრიგერს მნიშვნელობის დაბრუნება არ შეუძლია" + +#: commands/trigger.c:2585 +#, 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:2586 +#, c-format +msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." +msgstr "ტრიგერის \"%s\" შესრულებამდე სვეტი დანაყოფში \"%s.%s\" უნდა ყოფილიყო." + +#: commands/trigger.c:3423 executor/nodeModifyTable.c:2344 executor/nodeModifyTable.c:2427 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "" + +#: commands/trigger.c:3424 executor/nodeModifyTable.c:1510 executor/nodeModifyTable.c:1584 executor/nodeModifyTable.c:2345 executor/nodeModifyTable.c:2428 executor/nodeModifyTable.c:3059 +#, c-format +msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." +msgstr "" + +#: commands/trigger.c:3465 executor/nodeLockRows.c:229 executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 executor/nodeModifyTable.c:1526 executor/nodeModifyTable.c:2362 executor/nodeModifyTable.c:2570 +#, c-format +msgid "could not serialize access due to concurrent update" +msgstr "ერთდროული განახლების გამო წვდომის სერიალიზაცია შეუძლებელია" + +#: commands/trigger.c:3473 executor/nodeModifyTable.c:1616 executor/nodeModifyTable.c:2445 executor/nodeModifyTable.c:2594 executor/nodeModifyTable.c:2947 +#, c-format +msgid "could not serialize access due to concurrent delete" +msgstr "ერთდროული წაშლის გამო წვდომის სერიალიზაცია შეუძლებელია" + +#: commands/trigger.c:4680 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "" + +#: commands/trigger.c:5863 +#, c-format +msgid "constraint \"%s\" is not deferrable" +msgstr "შეზღუდვა გადადებადი არაა %s" + +#: commands/trigger.c:5886 +#, c-format +msgid "constraint \"%s\" does not exist" +msgstr "შეზღუდვა \"%s\" არ არსებობს" + +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#, c-format +msgid "function %s should return type %s" +msgstr "ფუნქციამ %s უნდა დააბრუნოს ტიპი %s" + +#: commands/tsearchcmds.c:194 +#, c-format +msgid "must be superuser to create text search parsers" +msgstr "ტექსტის ძებნის დამმუშავებლების შესაქმნელად საჭიროა ზემომხმარებლის წვდომელი" + +#: commands/tsearchcmds.c:247 +#, c-format +msgid "text search parser parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის დამმუშავებლის პარამეტრი \"%s\" უცნობია" + +#: commands/tsearchcmds.c:257 +#, c-format +msgid "text search parser start method is required" +msgstr "ტექსტის ძებნის დამმუშავებლის გაშვების მეთოდი აუცილებელია" + +#: commands/tsearchcmds.c:262 +#, c-format +msgid "text search parser gettoken method is required" +msgstr "ტექსტის ძებნის დამმუშავებლის gettoken მეთოდი აუცილებელია" + +#: commands/tsearchcmds.c:267 +#, c-format +msgid "text search parser end method is required" +msgstr "ტექსტის ძებნის დამმუშავებლის end მეთოდი აუცილებელია" + +#: commands/tsearchcmds.c:272 +#, c-format +msgid "text search parser lextypes method is required" +msgstr "" + +#: commands/tsearchcmds.c:366 +#, c-format +msgid "text search template \"%s\" does not accept options" +msgstr "ტექსტის ძებნის შაბლონი '%s\" პარამეტრებს არ იღებს" + +#: commands/tsearchcmds.c:440 +#, c-format +msgid "text search template is required" +msgstr "ტექსტის ძებნის შაბლონი აუცილებელია" + +#: commands/tsearchcmds.c:701 +#, c-format +msgid "must be superuser to create text search templates" +msgstr "ტექსტის ძებნის შაბლონების შესაქმნელად ზემომხმარებლის უფლებებია საჭირო" + +#: commands/tsearchcmds.c:743 +#, c-format +msgid "text search template parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის შაბლონის უცნობი პარამეტრი: \"%s\"" + +#: commands/tsearchcmds.c:753 +#, c-format +msgid "text search template lexize method is required" +msgstr "საჭიროა ტექსტის ძებნის შაბლონის lexize მეთოდი" + +#: commands/tsearchcmds.c:933 +#, c-format +msgid "text search configuration parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის კონფიგურაციის უცნობი პარამეტრი: \"%s\"" + +#: commands/tsearchcmds.c:940 +#, c-format +msgid "cannot specify both PARSER and COPY options" +msgstr "ორივე, PARSER და COPY პარამეტრებს ვერ მიუთითებთ" + +#: commands/tsearchcmds.c:976 +#, c-format +msgid "text search parser is required" +msgstr "საჭიროა ტექსტის ძებნის დამმუშავებლი" + +#: commands/tsearchcmds.c:1200 +#, c-format +msgid "token type \"%s\" does not exist" +msgstr "კოდის ტიპი არ არსებობს: %s" + +#: commands/tsearchcmds.c:1427 +#, c-format +msgid "mapping for token type \"%s\" does not exist" +msgstr "მიბმა კოდის ტიპისთვის %s არ არსებობს" + +#: commands/tsearchcmds.c:1433 +#, c-format +msgid "mapping for token type \"%s\" does not exist, skipping" +msgstr "მიბმა კოდის ტიპისთვის %s არ არსებობს, გამოტოვება" + +#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#, c-format +msgid "invalid parameter list format: \"%s\"" +msgstr "პარამეტრების სიის არასწორი ფორმატი: \"%s\"" + +#: commands/typecmds.c:217 +#, c-format +msgid "must be superuser to create a base type" +msgstr "საბაზისო ტიპის შესაცვლელად საჭიროა ზემომხმარებლის პრივილეგიები" + +#: 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 "" + +#: 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:382 +#, c-format +msgid "invalid type category \"%s\": must be simple ASCII" +msgstr "არასწორი ტიპის კატეგორია \"%s\": უნდა წარმოადგენდეს უბრალო ASCII-ს" + +#: commands/typecmds.c:401 +#, c-format +msgid "array element type cannot be %s" +msgstr "%s მასივის ელემენტის ტიპი არ შეიძლება იყოს" + +#: commands/typecmds.c:433 +#, c-format +msgid "alignment \"%s\" not recognized" +msgstr "სწორება \"%s\" უცნობია" + +#: commands/typecmds.c:450 commands/typecmds.c:4142 +#, c-format +msgid "storage \"%s\" not recognized" +msgstr "საცავი \"%s\" უცნობია" + +#: commands/typecmds.c:461 +#, c-format +msgid "type input function must be specified" +msgstr "აუცილებელია ტიპის შეყვანის ფუნქციის მითითება" + +#: commands/typecmds.c:465 +#, c-format +msgid "type output function must be specified" +msgstr "აუცილებელია ტიპის გამოტანის ფუნქციის მითითება" + +#: commands/typecmds.c:470 +#, c-format +msgid "type modifier output function is useless without a type modifier input function" +msgstr "ტიპის მოდიფიკატორის გამოტანის ფუნქცია ტიპის მოდიფიკატორის შეყვანის ფუნქციის გარეშე უაზროა" + +#: 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:879 +#, c-format +msgid "multiple default expressions" +msgstr "ერთზე მეტი ნაგულისხმევი გამოსახულება" + +#: commands/typecmds.c:942 commands/typecmds.c:951 +#, c-format +msgid "conflicting NULL/NOT NULL constraints" +msgstr "კონფლიქტური NULL/NOT NULL შეზღუდვები" + +#: commands/typecmds.c:967 +#, c-format +msgid "check constraints for domains cannot be marked NO INHERIT" +msgstr "დომენის შემოწმების შეზღუდვების, როგორც NO INHERIT, მონიშვნა შეუძლებელია" + +#: commands/typecmds.c:976 commands/typecmds.c:2960 +#, c-format +msgid "unique constraints not possible for domains" +msgstr "უნიკალური შეზღუდვები დომენებისთვის შეუძლებელია" + +#: commands/typecmds.c:982 commands/typecmds.c:2966 +#, c-format +msgid "primary key constraints not possible for domains" +msgstr "ძირითადი გასაღების შეზღუდვა დომენებისთვის შეუძლებელია" + +#: commands/typecmds.c:988 commands/typecmds.c:2972 +#, c-format +msgid "exclusion constraints not possible for domains" +msgstr "გაშვების შეზღუდვა დომენებისთვის შეუძლებელია" + +#: commands/typecmds.c:994 commands/typecmds.c:2978 +#, c-format +msgid "foreign key constraints not possible for domains" +msgstr "გარე გასაღების შეზღუდვა დომენებისთვის შეუძლებელია" + +#: commands/typecmds.c:1003 commands/typecmds.c:2987 +#, c-format +msgid "specifying constraint deferrability not supported for domains" +msgstr "" + +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 +#, c-format +msgid "%s is not an enum" +msgstr "%s ჩამონათვალი არაა" + +#: commands/typecmds.c:1458 +#, c-format +msgid "type attribute \"subtype\" is required" +msgstr "ტიპის ატრიბუტი \"subtype\" აუცილებელია" + +#: commands/typecmds.c:1463 +#, c-format +msgid "range subtype cannot be %s" +msgstr "%s დიაპაზონის ქვეტიპი ვერ იქნება" + +#: commands/typecmds.c:1482 +#, c-format +msgid "range collation specified but subtype does not support collation" +msgstr "" + +#: commands/typecmds.c:1492 +#, c-format +msgid "cannot specify a canonical function without a pre-created shell type" +msgstr "" + +#: 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 "" + +#: commands/typecmds.c:1966 +#, c-format +msgid "type input function %s has multiple matches" +msgstr "ტიპის შეყვანის ფუნქციის (%s) რამდენიმე ასლი არსებობს" + +#: commands/typecmds.c:1984 +#, c-format +msgid "type input function %s must return type %s" +msgstr "ტიპის შეყვანის ფუნქციამ (\"%s\") უნდა დააბრუნოს ტიპი \"%s\"" + +#: commands/typecmds.c:2000 +#, c-format +msgid "type input function %s should not be volatile" +msgstr "ტიპის შეყვანის ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2028 +#, c-format +msgid "type output function %s must return type %s" +msgstr "ტიპის გამოტანის ფუნქციამ (%s) უნდა დააბრუნოს ტიპი \"%s\"" + +#: commands/typecmds.c:2035 +#, c-format +msgid "type output function %s should not be volatile" +msgstr "ტიპის გამოტანის ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2064 +#, c-format +msgid "type receive function %s has multiple matches" +msgstr "ტიპის მიღების ფუქნციის (%s) რამდენიმე ასლი არსებობს" + +#: commands/typecmds.c:2082 +#, c-format +msgid "type receive function %s must return type %s" +msgstr "ტიპის მიღების ფუნქციამ (%s) უნდა დააბრუნოს ტიპი %s" + +#: commands/typecmds.c:2089 +#, c-format +msgid "type receive function %s should not be volatile" +msgstr "ტიპის მიღების ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2117 +#, c-format +msgid "type send function %s must return type %s" +msgstr "ტიპის გაგზავნის ფუნქციამ (%s) უნდა დააბრუნოს ტიპი \"%s\"" + +#: commands/typecmds.c:2124 +#, c-format +msgid "type send function %s should not be volatile" +msgstr "ტიპის გაგზავნის ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2151 +#, c-format +msgid "typmod_in function %s must return type %s" +msgstr "typmod_in ფუნქციამ (%s) უნდა დააბრუნოს ტიპი %s" + +#: commands/typecmds.c:2158 +#, c-format +msgid "type modifier input function %s should not be volatile" +msgstr "ტიპის მოდიფიკატორის შეყვანის ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2185 +#, c-format +msgid "typmod_out function %s must return type %s" +msgstr "typmod_out ფუნქციამ (%s) უნდა დააბრუნოს ტიპი %s" + +#: commands/typecmds.c:2192 +#, c-format +msgid "type modifier output function %s should not be volatile" +msgstr "ტიპის მოდიფიკატორის გამოტანის ფუნქცია (%s) ცვალებადი არ უნდა იყოს" + +#: commands/typecmds.c:2219 +#, c-format +msgid "type analyze function %s must return type %s" +msgstr "ტიპის ანალიზის ფუნქციამ (%s) უნდა დააბრუნოს ტიპი %s" + +#: commands/typecmds.c:2248 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "" + +#: commands/typecmds.c:2258 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "" + +#: 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:2335 +#, c-format +msgid "range canonical function %s must return range type" +msgstr "კანონიკური დიაპაზონის ფუნქციამ (%s) დიაპაზონის ტიპი უნდა დააბრუნოს" + +#: commands/typecmds.c:2341 +#, c-format +msgid "range canonical function %s must be immutable" +msgstr "კანონიკური დიაპაზონის ფუნქცია (%s) მუდმივი უნდა იყოს" + +#: commands/typecmds.c:2377 +#, c-format +msgid "range subtype diff function %s must return type %s" +msgstr "დიაპაზონის ქვეტიპის განსხვავების ფუნქციამ (%s) უნდა დააბრუნოს ტიპი: %s" + +#: commands/typecmds.c:2384 +#, c-format +msgid "range subtype diff function %s must be immutable" +msgstr "დიაპაზონის ქვეტიპის განსხვავების ფუნქცია (%s) უცვლელი უნდა იყოს" + +#: 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: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 "სვეტი \"%s\" (ცხრილში %s) ნულოვან მნიშვნელობებს შეიცავს" + +#: 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:2893 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" +msgstr "დომენის (\"%2$s\") შეზღუდვა (\"%1$s\") არ არსებობს. გამოტოვება" + +#: 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:3204 +#, c-format +msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" +msgstr "სვეტი \"%s\" ცხრილიდან \"%s\" შეიცავს მნიშვნელობებს, რომელიც ახალ შეზღუდვას არღვევს" + +#: 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:3465 +#, c-format +msgid "constraint \"%s\" for domain \"%s\" already exists" +msgstr "შეზღუდვა \"%s\" დომენისთვის %s უკვე არსებობს" + +#: commands/typecmds.c:3516 +#, c-format +msgid "cannot use table references in domain check constraint" +msgstr "" + +#: 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:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 +#, c-format +msgid "Use ALTER TABLE instead." +msgstr "ამის ნაცვლად გამოიყენეთ ALTER TABLE." + +#: 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: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:4002 +#, c-format +msgid "type \"%s\" already exists in schema \"%s\"" +msgstr "ტიპი \"%s\" სქემაში \"%s\" უკვე არსებობს" + +#: commands/typecmds.c:4170 +#, c-format +msgid "cannot change type's storage to PLAIN" +msgstr "ტიპის საცავს PLAIN-ზე ვერ შეცვლით" + +#: commands/typecmds.c:4263 +#, c-format +msgid "type attribute \"%s\" cannot be changed" +msgstr "ტიპის ატრიბუტის შეცვლა შეუძლებელია: %s" + +#: commands/typecmds.c:4281 +#, c-format +msgid "must be superuser to alter a type" +msgstr "ტიპის შესაცვლელად ზემომხმარებლის უფლებებია საჭირო" + +#: commands/typecmds.c:4302 commands/typecmds.c:4311 +#, c-format +msgid "%s is not a base type" +msgstr "%s საბაზისო ტიპი არაა" + +#: commands/user.c:138 +#, c-format +msgid "SYSID can no longer be specified" +msgstr "SYSID-ის შეცვლა ახლა უკვე შეუძლებელია" + +#: commands/user.c:256 +#, c-format +msgid "must be superuser to create superusers" +msgstr "ზემომხმარებლის შესაქმნელად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/user.c:263 +#, c-format +msgid "must be superuser to create replication users" +msgstr "რეპლიკაციის მომხმარებლების შესაქმნელად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/user.c:270 +#, c-format +msgid "must be superuser to create bypassrls users" +msgstr "bypassrls მომხმარებლების შესაქმნელად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/user.c:277 +#, c-format +msgid "permission denied to create role" +msgstr "როლის შექმნის წვდომა აკრზალულია" + +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 gram.y:16483 utils/adt/acl.c:5331 utils/adt/acl.c:5337 +#, c-format +msgid "role name \"%s\" is reserved" +msgstr "როლის სახელი \"%s\" დაცულია" + +#: 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:310 commands/user.c:1163 +#, c-format +msgid "role \"%s\" already exists" +msgstr "როლი \"%s\" უკვე არსებობს" + +#: commands/user.c:376 commands/user.c:754 +#, c-format +msgid "empty string is not a valid password, clearing password" +msgstr "ცარიელი სტრიქონი არ არის სწორი პაროლი, პაროლის გაწმენდა" + +#: 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:524 commands/user.c:838 +msgid "Cannot alter reserved roles." +msgstr "დარეზერვებულია როლების შეცვლა შეუძლებელია." + +#: commands/user.c:638 +#, c-format +msgid "must be superuser to alter superuser roles or change superuser attribute" +msgstr "" + +#: commands/user.c:645 +#, c-format +msgid "must be superuser to alter replication roles or change replication attribute" +msgstr "" + +#: commands/user.c:652 +#, c-format +msgid "must be superuser to change bypassrls attribute" +msgstr "" + +#: commands/user.c:661 commands/user.c:866 +#, c-format +msgid "permission denied" +msgstr "წვდომა აკრძალულია" + +#: 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:918 +#, c-format +msgid "permission denied to drop role" +msgstr "როლის წაშლის წვდომა აკრძალულია" + +#: commands/user.c:943 +#, c-format +msgid "cannot use special role specifier in DROP ROLE" +msgstr "სპეციალური როლის მიმთითებლის გამოყენება DROP ROLE-ში შეუძლებელია" + +#: 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:958 +#, c-format +msgid "role \"%s\" does not exist, skipping" +msgstr "როლი არ არსებობს: \"%s\". გამოტოვება" + +#: commands/user.c:971 commands/user.c:975 +#, c-format +msgid "current user cannot be dropped" +msgstr "მიმდინარე მომხმარებლის წაშლა შეუძლებელია" + +#: commands/user.c:979 +#, c-format +msgid "session user cannot be dropped" +msgstr "სესიის მომხმარებლის წაშლა შეუძლებელია" + +#: commands/user.c:989 +#, c-format +msgid "must be superuser to drop superusers" +msgstr "ზემომხმარებლის წასაშლელად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/user.c:1005 +#, c-format +msgid "role \"%s\" cannot be dropped because some objects depend on it" +msgstr "როლის (\"%s\") წაშლა შეუძლებელია, რადგან არსებობენ ობიექტები, რომლებიც მას ეყრდნობიან" + +#: commands/user.c:1126 +#, c-format +msgid "session user cannot be renamed" +msgstr "სესიის მომხმარებლის გადარქმევა შეუძლებელია" + +#: commands/user.c:1130 +#, c-format +msgid "current user cannot be renamed" +msgstr "იმდინარე მომხმარებლის გადარქმევა შეუძლებელია" + +#: commands/user.c:1173 +#, c-format +msgid "must be superuser to rename superusers" +msgstr "ზემომხმარებლის სახელის გადასარქმევად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: commands/user.c:1180 +#, c-format +msgid "permission denied to rename role" +msgstr "როლის სახელის გადარქმევის წვდომა აკრძალულია" + +#: commands/user.c:1201 +#, c-format +msgid "MD5 password cleared because of role rename" +msgstr "MD5 პაროლი გასუფთავდა როლის სახელის შეცვლის გამო" + +#: commands/user.c:1261 +#, c-format +msgid "column names cannot be included in GRANT/REVOKE ROLE" +msgstr "'GRANT/REVOKE ROLE'-ში სვეტის სახელებს ვერ ჩასვამთ" + +#: commands/user.c:1299 +#, c-format +msgid "permission denied to drop objects" +msgstr "ობიექტების წაშლის წვდომა აკრძალულია" + +#: commands/user.c:1326 commands/user.c:1335 +#, c-format +msgid "permission denied to reassign objects" +msgstr "ობიექტების თავიდან მინიჭების უფლება აკრძალულია" + +#: commands/user.c:1408 commands/user.c:1581 +#, c-format +msgid "must have admin option on role \"%s\"" +msgstr "საჭიროა ადმინისტრატორის უფლება როლზე \"%s\"" + +#: 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: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:1496 +#, c-format +msgid "role \"%s\" is already a member of role \"%s\"" +msgstr "" + +#: commands/user.c:1603 +#, c-format +msgid "role \"%s\" is not a member of role \"%s\"" +msgstr "" + +#: commands/vacuum.c:140 +#, c-format +msgid "unrecognized ANALYZE option \"%s\"" +msgstr "\"ANALYZE\"-ის უცნობი პარამეტრი: %s" + +#: commands/vacuum.c:178 +#, c-format +msgid "parallel option requires a value between 0 and %d" +msgstr "პარალელურ პარამეტრს ესაჭიროება მნიშვნელობა 0-სა და %d-ს შორის" + +#: commands/vacuum.c:190 +#, c-format +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "პარალელური დამხმარე პროცესების რაოდენობა მომტვერსასრუტებისთვის 0-სა და %d-ს შორის უნდა იყოს" + +#: commands/vacuum.c:207 +#, c-format +msgid "unrecognized VACUUM option \"%s\"" +msgstr "\"VACUUM\"-ის უცნობი პარამეტრი: %s" + +#: commands/vacuum.c:230 +#, c-format +msgid "VACUUM FULL cannot be performed in parallel" +msgstr "VACUUM FULL პარალელურად ვერ შესრულდება" + +#: commands/vacuum.c:246 +#, c-format +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "როცა მიწოდებულია სვეტების სია, პარამეტრის ANALYZE მითითება აუცილებელია" + +#: commands/vacuum.c:336 +#, c-format +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s-ს VACUUM-დან ან ANALYZE-დან ვერ შეასარულებთ" + +#: commands/vacuum.c:346 +#, c-format +msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" +msgstr "VACUUM-ის პარამეტრს 'DISABLE_PAGE_SKIPPING' FULL-თან ერთად ვერ გამოიყენებთ" + +#: commands/vacuum.c:353 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULL-თან ერთად PROCESS_TOAST აუცილებელია" + +#: commands/vacuum.c:587 +#, c-format +msgid "skipping \"%s\" --- only superuser can vacuum it" +msgstr "" + +#: commands/vacuum.c:591 +#, c-format +msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" +msgstr "" + +#: commands/vacuum.c:595 +#, c-format +msgid "skipping \"%s\" --- only table or database owner can vacuum it" +msgstr "" + +#: commands/vacuum.c:610 +#, c-format +msgid "skipping \"%s\" --- only superuser can analyze it" +msgstr "" + +#: commands/vacuum.c:614 +#, c-format +msgid "skipping \"%s\" --- only superuser or database owner can analyze it" +msgstr "" + +#: commands/vacuum.c:618 +#, c-format +msgid "skipping \"%s\" --- only table or database owner can analyze it" +msgstr "" + +#: commands/vacuum.c:697 commands/vacuum.c:793 +#, c-format +msgid "skipping vacuum of \"%s\" --- lock not available" +msgstr "\"%s\"-ის მომტვერსასრუტება გამოტოვებულია -- ბლოკი ხელმისაწვდომი არაა" + +#: commands/vacuum.c:702 +#, c-format +msgid "skipping vacuum of \"%s\" --- relation no longer exists" +msgstr "\"%s\"-ის მომტვერსასრუტება გამოტოვებულია -- ურთიერთობა აღარ არსებობს" + +#: commands/vacuum.c:718 commands/vacuum.c:798 +#, c-format +msgid "skipping analyze of \"%s\" --- lock not available" +msgstr "\"%s\"-ის ანალიზი გამოტოვებულია -- ბლოკი ხელმისაწვდომი არაა" + +#: commands/vacuum.c:723 +#, c-format +msgid "skipping analyze of \"%s\" --- relation no longer exists" +msgstr "\"%s\"-ის ანალიზი გამოტოვებულია -- ურთიერთობა აღარ არსებობს" + +#: commands/vacuum.c:1042 +#, c-format +msgid "oldest xmin is far in the past" +msgstr "" + +#: commands/vacuum.c:1043 +#, 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 "" + +#: commands/vacuum.c:1086 +#, c-format +msgid "oldest multixact is far in the past" +msgstr "" + +#: commands/vacuum.c:1087 +#, c-format +msgid "Close open transactions with multixacts soon to avoid wraparound problems." +msgstr "" + +#: commands/vacuum.c:1807 +#, c-format +msgid "some databases have not been vacuumed in over 2 billion transactions" +msgstr "ზოგიერთი ბაზა 2 მილიარდ ტრანზაქციაზე მეტია, რაც არ მომტვერსასრუტებულა" + +#: commands/vacuum.c:1808 +#, c-format +msgid "You might have already suffered transaction-wraparound data loss." +msgstr "" + +#: commands/vacuum.c:1976 +#, c-format +msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" +msgstr "" + +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "სკანირებული ინდექსი \"%s\" %d მწკრივის ვერსიას აპირებს" + +#: commands/vacuum.c:2373 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "ინდექსი \"%s\" ახლა %.0f მწკრივის ვერსიას შეიცავს, %u გვერდში" + +#: commands/vacuum.c:2377 +#, 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 "" + +#: commands/vacuumparallel.c:664 +#, 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 პარალელური მომტვერსასრუტების დამხმარე პროცესი (დაგეგმილია: %d)" +msgstr[1] "ინდექსის მომტვერსასრუტებისთვის გაშვებულია %d პარალელური მომტვერსასრუტების დამხმარე პროცესი (დაგეგმილია: %d)" + +#: commands/vacuumparallel.c:670 +#, 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 პარალელური მომტვერსასრუტების დამხმარე პროცესი (დაგეგმილია: %d)" +msgstr[1] "ინდექსის გასუფთავებისთვის გაშვებულია %d პარალელური მომტვერსასრუტების დამხმარე პროცესი (დაგეგმილია: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:12100 utils/misc/guc.c:12178 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "უცნობი საკვანძო სიტყვა: \"%s\"." + +#: commands/variable.c:177 +#, c-format +msgid "Conflicting \"datestyle\" specifications." +msgstr "კონფლიქტური \"datestyle\"-ის სპეციფიკაციები." + +#: commands/variable.c:299 +#, c-format +msgid "Cannot specify months in time zone interval." +msgstr "დროის სარტყელის ინტერვალში თვეებს ვერ მიუთითებთ." + +#: commands/variable.c:305 +#, c-format +msgid "Cannot specify days in time zone interval." +msgstr "დროის სარტყელის ინტერვალში დღეებს ვერ მიუთითებთ." + +#: commands/variable.c:343 commands/variable.c:425 +#, c-format +msgid "time zone \"%s\" appears to use leap seconds" +msgstr "დროის სარტყელი \"%s\", როგორც ჩანს, დამატებით წამებს იყენებს" + +#: commands/variable.c:345 commands/variable.c:427 +#, c-format +msgid "PostgreSQL does not support leap seconds." +msgstr "PostgreSQL-ს დამატებითი წამების მხარდაჭერა არ გააჩნია." + +#: commands/variable.c:354 +#, c-format +msgid "UTC timezone offset is out of range." +msgstr "UTC დროის სარტყელი ზღვარს მიღმაა." + +#: commands/variable.c:494 +#, c-format +msgid "cannot set transaction read-write mode inside a read-only transaction" +msgstr "მხოლოდ-კითხვადი ტრანზაქციის შიგნით ტრანზაქციის რეჟიმის ჩაწერა-წაკითხვის რეჟიმზე გადართვა შეუძლებელია" + +#: commands/variable.c:501 +#, c-format +msgid "transaction read-write mode must be set before any query" +msgstr "ტრანზაქცის ჩაწერა-წაკითხვის რეჟიმი ყველა მოთხოვნის წინ უნდა იქნეს დაყენებული" + +#: commands/variable.c:508 +#, c-format +msgid "cannot set transaction read-write mode during recovery" +msgstr "აღდგენისას ტრანზაქციის ჩაწერა-წაკითხვის რეჟიმის დაყენება შეუძლებელია" + +#: commands/variable.c:534 +#, c-format +msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" +msgstr "SET TRANSACTION ISOLATION LEVEL ყველა მოთხოვნაზე ადრე უნდა გამოიძახოთ" + +#: commands/variable.c:541 +#, c-format +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:1694 +#, c-format +msgid "cannot use serializable mode in a hot standby" +msgstr "ცხელი მოლოდინში სერიალიზებადი რეჟიმის გამოყენება შეუძლებელია" + +#: commands/variable.c:549 +#, c-format +msgid "You can use REPEATABLE READ instead." +msgstr "სამაგიეროდ, შეგიძლიათ, REPEATABLE READ გამოიყენოთ." + +#: commands/variable.c:567 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" +msgstr "SET TRANSACTION [NOT] DEFERRABLE-ს ქვეტრანზაქციაში ვერ გამოიძახებთ" + +#: commands/variable.c:573 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" +msgstr "SET TRANSACTION [NOT] DEFERRABLE ყველა მოთხოვნაზე ადრე უნდა გამოიძახოთ" + +#: commands/variable.c:655 +#, c-format +msgid "Conversion between %s and %s is not supported." +msgstr "%s-დან %s-ზე გადაყვანა მხარდაჭერილი არაა." + +#: commands/variable.c:662 +#, c-format +msgid "Cannot change \"client_encoding\" now." +msgstr "ახლა \"client_encoding\"-ს ვერ შეცვლით." + +#: commands/variable.c:723 +#, c-format +msgid "cannot change client_encoding during a parallel operation" +msgstr "პარალელური ოპერაციის დროს client_encoding პარამეტრს ვერ შეცვლით" + +#: 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\") დაყენების წვდომა აკრძალულია" + +#: commands/view.c:84 +#, c-format +msgid "could not determine which collation to use for view column \"%s\"" +msgstr "კოლაციის გამოცნობის შეცდომა ხედის სვეტისთვის \"%s\"" + +#: commands/view.c:279 commands/view.c:290 +#, c-format +msgid "cannot drop columns from view" +msgstr "ხედიდან სვეტების წაშლა შეუძლებელია" + +#: commands/view.c:295 +#, c-format +msgid "cannot change name of view column \"%s\" to \"%s\"" +msgstr "ხედის სვეტის სახელის \"%s\" \"%s\"-ზე გადარქმევა შეუძლებელია" + +#: commands/view.c:298 +#, c-format +msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." +msgstr "ხედის სვეტის სახელის შესაცვლელად შეგიძლიათ ALTER VIEW ... RENAME COLUMN ... გამოიყენოთ." + +#: commands/view.c:309 +#, c-format +msgid "cannot change data type of view column \"%s\" from %s to %s" +msgstr "ხედის სვეტის (\"%s\") მონაცემის ტიპის შეცვლა %s-დან %s-ზე შეუძლებელია" + +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "ხედის სვეტის (\"%s\") კოლაციის შეცვლა %s-დან %s-ზე შეუძლებელია" + +#: commands/view.c:468 +#, c-format +msgid "views must not contain SELECT INTO" +msgstr "ხედები SELECT INTO-ს არ უნდა შეიცავდნენ" + +#: commands/view.c:480 +#, c-format +msgid "views must not contain data-modifying statements in WITH" +msgstr "ხედები WITH-ში მონაცემების შემცვლელ გამოსახულებებს არ უნდა შეიცავდნენ" + +#: commands/view.c:550 +#, c-format +msgid "CREATE VIEW specifies more column names than columns" +msgstr "CREATE VIEW აღწერს მეტ სვეტის სახელს, ვიდრე სვეტს" + +#: commands/view.c:558 +#, c-format +msgid "views cannot be unlogged because they do not have storage" +msgstr "" + +#: commands/view.c:572 +#, c-format +msgid "view \"%s\" will be a temporary view" +msgstr "ხედი დროებითი იქნება: \"%s\"" + +#: executor/execCurrent.c:79 +#, c-format +msgid "cursor \"%s\" is not a SELECT query" +msgstr "კურსორი SELECT მოთხოვნა არაა: \"%s\"" + +#: executor/execCurrent.c:85 +#, c-format +msgid "cursor \"%s\" is held from a previous transaction" +msgstr "კურსორი \"%s\" წინა ტრანზაქციიდანაა შემორჩენილი" + +#: executor/execCurrent.c:118 +#, c-format +msgid "cursor \"%s\" has multiple FOR UPDATE/SHARE references to table \"%s\"" +msgstr "კურსორს \"%s\" ცხრილამდე \"%s\" ერთზე მეტი FOR UPDATE/SHARE მიმართვა გააჩნია" + +#: executor/execCurrent.c:127 +#, c-format +msgid "cursor \"%s\" does not have a FOR UPDATE/SHARE reference to table \"%s\"" +msgstr "კურსორს \"%s\" ცხრილამდე \"%s\" 'FOR UPDATE/SHARE' მიმართვა არ გააჩნია" + +#: executor/execCurrent.c:137 executor/execCurrent.c:182 +#, c-format +msgid "cursor \"%s\" is not positioned on a row" +msgstr "კურსორი \"%s\" მწკრივზე არ მდებარეობს" + +#: executor/execCurrent.c:169 executor/execCurrent.c:228 executor/execCurrent.c:239 +#, c-format +msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" +msgstr "კურსორი \"%s\" ცხრილის (\"%s\") მარტივადი განახლებადი სკანირებას არ წარმოადგენს" + +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 +#, 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:2466 +#, c-format +msgid "no value found for parameter %d" +msgstr "პარამეტრისთვის მნიშვნელობების პოვნა შეუძლებელია: %d" + +#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:233 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "" + +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 +#, c-format +msgid "Query has too many columns." +msgstr "მოთხოვნას მეტისმეტად ბევრი სვეტ აქვს." + +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "" + +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 executor/nodeModifyTable.c:209 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "" + +#: executor/execExpr.c:1098 parser/parse_agg.c:826 +#, c-format +msgid "window function calls cannot be nested" +msgstr "ფანჯრის ფუნქციის გამოძახებებს ერთმანეთში ვერ ჩადგამთ" + +#: executor/execExpr.c:1617 +#, c-format +msgid "target type is not an array" +msgstr "სამიზნე ტიპი მასივი არაა" + +#: executor/execExpr.c:1957 +#, c-format +msgid "ROW() column has type %s instead of type %s" +msgstr "ROW() სვეტს %s ტიპის მაგიერ %s აქვს" + +#: executor/execExpr.c:2482 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:2509 executor/execSRF.c:738 executor/functions.c:1073 utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "ფუნქცია, რომელიც სეტს აბრუნებს, გამოძახებულია კონტექსტში, რომელიც სეტებს ვერ იღებს" + +#: executor/execExpr.c:2915 parser/parse_node.c:276 parser/parse_node.c:326 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "" + +#: executor/execExpr.c:3043 executor/execExpr.c:3065 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "" + +#: executor/execExprInterp.c:1918 +#, c-format +msgid "attribute %d of type %s has been dropped" +msgstr "%2$s ტიპის ატრიბუტი %1$d წაიშალა" + +#: executor/execExprInterp.c:1924 +#, c-format +msgid "attribute %d of type %s has wrong type" +msgstr "%2$s ტიპის ატრიბუტის %1$d ტიპი არასწორია" + +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 executor/execExprInterp.c:3106 +#, c-format +msgid "Table has type %s, but query expects %s." +msgstr "ცხრილის ტიპია %s, მოთხოვნა კი %s-ს მოელოდა." + +#: executor/execExprInterp.c:2006 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:570 +#, c-format +msgid "type %s is not composite" +msgstr "ტიპი %s კომპოზიტური არაა" + +#: executor/execExprInterp.c:2544 +#, c-format +msgid "WHERE CURRENT OF is not supported for this table type" +msgstr "WHERE CURRENT OF ამ ტიპის ცხრილისთვის მხარდაუჭერელია" + +#: executor/execExprInterp.c:2757 +#, c-format +msgid "cannot merge incompatible arrays" +msgstr "შეუთავსებელი მასივების შერწყმა შეუძლებელია" + +#: executor/execExprInterp.c:2758 +#, c-format +msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." +msgstr "" + +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:263 utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5370 utils/adt/arrayfuncs.c:5887 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:2799 executor/execExprInterp.c:2834 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "მრავალგანზომილებიან მასივებს უნდა ჰქონდეთ მასივის გამოსახულებები შესაბამისი ზომებით" + +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 utils/adt/arrayfuncs.c:5979 utils/adt/arrayfuncs.c:6320 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) აჭარბებს" + +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 +#, c-format +msgid "attribute %d has wrong type" +msgstr "ატრიბუტის არასწორი ტიპი: %d" + +#: executor/execExprInterp.c:3691 utils/adt/domains.c:149 +#, c-format +msgid "domain %s does not allow null values" +msgstr "დომენ %s-ს ნულოვანი მნიშვნელობების მხარდაჭერა არ გააჩნია" + +#: executor/execExprInterp.c:3706 utils/adt/domains.c:184 +#, c-format +msgid "value for domain %s violates check constraint \"%s\"" +msgstr "მნიშვნელობა დომენისთვის %s არღვევს შემოწმების შეზღუდვას \"%s\"" + +#: executor/execExprInterp.c:4063 +#, 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:4179 executor/execSRF.c:977 +#, c-format +msgid "Physical storage mismatch on dropped attribute at ordinal position %d." +msgstr "" + +#: executor/execIndexing.c:571 +#, c-format +msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" +msgstr "" + +#: executor/execIndexing.c:848 +#, c-format +msgid "could not create exclusion constraint \"%s\"" +msgstr "გამორიცხვის შეზღუდვის (\"%s\") შექმნა შეუძლებელია" + +#: executor/execIndexing.c:851 +#, c-format +msgid "Key %s conflicts with key %s." +msgstr "გასაღები %s კონფლიქტობს გასაღებ %s-სთან." + +#: executor/execIndexing.c:853 +#, c-format +msgid "Key conflicts exist." +msgstr "აღმოჩენილია გასაღებების კონფლიქტი." + +#: executor/execIndexing.c:859 +#, c-format +msgid "conflicting key value violates exclusion constraint \"%s\"" +msgstr "კონფლიქტის მქონე გასაღების მნიშვნელობა არღვევს უნიკალურ შეზღუდვას \"%s\"" + +#: executor/execIndexing.c:862 +#, c-format +msgid "Key %s conflicts with existing key %s." +msgstr "გასაღები %s კონფლიქტობს არსებულ გასაღებ %s-სთან." + +#: executor/execIndexing.c:864 +#, c-format +msgid "Key conflicts with existing key." +msgstr "გასაღები აქტიურ გასაღებთან კონფლიქტობს." + +#: executor/execMain.c:1009 +#, c-format +msgid "cannot change sequence \"%s\"" +msgstr "მიმდევრობის შეცვლა შეუძლებელია: \"%s\"" + +#: executor/execMain.c:1015 +#, c-format +msgid "cannot change TOAST relation \"%s\"" +msgstr "'TOAST' ტიპის ურთიერთობის \"%s\" შეცვლა შეუძლებელია" + +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 rewrite/rewriteHandler.c:3974 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "ხედში ჩამატება შეუძლებელია: %s" + +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 rewrite/rewriteHandler.c:3977 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "" + +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 rewrite/rewriteHandler.c:3982 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "ხედის განახლება შეუძლებელია: %s" + +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 rewrite/rewriteHandler.c:3985 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "" + +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 rewrite/rewriteHandler.c:3990 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "ხედიდან წაშლა შეუძლებელია: %s" + +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 rewrite/rewriteHandler.c:3993 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "" + +#: executor/execMain.c:1062 +#, c-format +msgid "cannot change materialized view \"%s\"" +msgstr "მატერიალიზებული ხედის შეცვლა შეუძლებელია: %s" + +#: executor/execMain.c:1074 +#, c-format +msgid "cannot insert into foreign table \"%s\"" +msgstr "გარე ცხრილში ჩამატების შეცდომა: %s" + +#: executor/execMain.c:1080 +#, c-format +msgid "foreign table \"%s\" does not allow inserts" +msgstr "გარე ცხრილი ჩამატების საშუალებას არ იძლევა: %s" + +#: executor/execMain.c:1087 +#, c-format +msgid "cannot update foreign table \"%s\"" +msgstr "გარე ცხრილის განახლების შეცდომა: %s" + +#: executor/execMain.c:1093 +#, c-format +msgid "foreign table \"%s\" does not allow updates" +msgstr "გარე ცხრილი განახლებების საშუალებას არ იძლევა: %s" + +#: executor/execMain.c:1100 +#, c-format +msgid "cannot delete from foreign table \"%s\"" +msgstr "გარე ცხრილიდან წაშლის შეცდომა: %s" + +#: executor/execMain.c:1106 +#, c-format +msgid "foreign table \"%s\" does not allow deletes" +msgstr "გარე ცხრილი წაშლის საშუალებას არ იძლევა: %s" + +#: executor/execMain.c:1117 +#, c-format +msgid "cannot change relation \"%s\"" +msgstr "ურთიერთობის შეცვლის შეცდომა: %s" + +#: executor/execMain.c:1144 +#, c-format +msgid "cannot lock rows in sequence \"%s\"" +msgstr "მიმდევრობაში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1151 +#, c-format +msgid "cannot lock rows in TOAST relation \"%s\"" +msgstr "\"TOAST\" ურთიერთობაში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1158 +#, c-format +msgid "cannot lock rows in view \"%s\"" +msgstr "ხედში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1166 +#, c-format +msgid "cannot lock rows in materialized view \"%s\"" +msgstr "მატერიალიზებულ ხედში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1175 executor/execMain.c:2685 executor/nodeLockRows.c:136 +#, c-format +msgid "cannot lock rows in foreign table \"%s\"" +msgstr "გარე ცხრილში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1181 +#, c-format +msgid "cannot lock rows in relation \"%s\"" +msgstr "ურთიერთობაში მწკრივების ჩაკეტვა შეუძლებელია: %s" + +#: executor/execMain.c:1888 +#, c-format +msgid "new row for relation \"%s\" violates partition constraint" +msgstr "ახალი მწკრივი ურთიერთობისთვის \"%s\" დანაყოფის შეზღუდვას არღვევს" + +#: 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:1970 +#, c-format +msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" +msgstr "ნულოვანი მნიშვნელობა სვეტში \"%s\" ურთიერთობისთვის \"%s\" არანულოვან შეზღუდვას არღვევს" + +#: executor/execMain.c:2021 +#, c-format +msgid "new row for relation \"%s\" violates check constraint \"%s\"" +msgstr "ახალი მწკრივი ურთიერთობისთვის \"%s\" არღვევს შემოწმების შეზღუდვას \"%s\"" + +#: executor/execMain.c:2130 +#, c-format +msgid "new row violates check option for view \"%s\"" +msgstr "ახალი მწკრივი არღვევს შემოწმების პარამეტრს ხედისთვის \"%s\"" + +#: executor/execMain.c:2140 +#, c-format +msgid "new row violates row-level security policy \"%s\" for table \"%s\"" +msgstr "ახალი მწკრივი არღვევს მწკრივის-დონის უსაფრთხოების პოლიტიკას \"%s\" ცხრილისთვის \"%s\"" + +#: executor/execMain.c:2145 +#, c-format +msgid "new row violates row-level security policy for table \"%s\"" +msgstr "ახალი მწკრივი ცხრილისთვის \"%s\" მწკრივის-დონის უსაფრთხოების პოლიტიკა არღვევს" + +#: executor/execMain.c:2153 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2158 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2165 +#, c-format +msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2170 +#, c-format +msgid "new row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execPartition.c:330 +#, c-format +msgid "no partition of relation \"%s\" found for row" +msgstr "მწკრივისთვის ურთიერთობის \"%s\" დანაყოფი ვერ ვიპოვე" + +#: executor/execPartition.c:333 +#, c-format +msgid "Partition key of the failing row contains %s." +msgstr "შეცდომიანი მწკრივის დანაყოფის გასაღები \"%s\"-ს შეიცავს." + +#: executor/execReplication.c:196 executor/execReplication.c:380 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" +msgstr "დასაბლოკი კორტეჟი პარალელური განახლების გამო უკვე სხვა დანაყოფშია გადატანილი. თავიდან ვცდი" + +#: executor/execReplication.c:200 executor/execReplication.c:384 +#, c-format +msgid "concurrent update, retrying" +msgstr "ერთდროული განახლება. თავიდან ვცდი" + +#: executor/execReplication.c:206 executor/execReplication.c:390 +#, c-format +msgid "concurrent delete, retrying" +msgstr "ერთდროული წაშლა. თავიდან ვცდი" + +#: executor/execReplication.c:276 parser/parse_cte.c:308 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 utils/adt/arrayfuncs.c:4208 utils/adt/arrayfuncs.c:6200 utils/adt/rowtypes.c:1203 +#, c-format +msgid "could not identify an equality operator for type %s" +msgstr "ტიპისთვის \"%s\" ტოლობის ფუნქცია ვერ ვიპოვე" + +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "ცხრილის განახლების შეცდომა: %s" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "გამოცემის WHERE გამოსახულებაში გამოყენებული სვეტი რეპლიკის იდენტიფიკაციის ნაწილს არ წარმოადგენს." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "გამოცემის მიერ გამოყენებული სვეტების სია რეპლიკის იდენტიფიკაციას არ ფარავს." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "ცხრილიდან წაშლის შეცდომა: %s" + +#: executor/execReplication.c:644 +#, c-format +msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" +msgstr "ცხრილის \"%s\" განახლება შეუძლებელია, რადგან მას რეპლიკის იდენტიფიკაცია არ გააჩნია და განახლებებს აქვეყნებს" + +#: executor/execReplication.c:646 +#, c-format +msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "ცხრილის განახლების ჩასართავად ALTER TABLE-ით REPLICA IDENTITY დააყენეთ." + +#: executor/execReplication.c:650 +#, c-format +msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" +msgstr "ცხრილიდან \"%s\" წაშლა შეუძლებელია, რადგან მას რეპლიკის იდენტიფიკაცია არ გააჩნია და წაშლებს აქვეყნებს" + +#: executor/execReplication.c:652 +#, c-format +msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "ცხრილიდან წაშლის ჩასართავად ALTER TABLE-ის გამოყენებით REPLICA IDENTITY დააყენეთ." + +#: executor/execReplication.c:668 +#, c-format +msgid "cannot use relation \"%s.%s\" as logical replication target" +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: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:380 executor/execSRF.c:685 +#, c-format +msgid "unrecognized table-function returnMode: %d" +msgstr "" + +#: executor/execSRF.c:894 +#, c-format +msgid "function returning setof record called in context that cannot accept type record" +msgstr "" + +#: 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: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] "" +msgstr[1] "" + +#: executor/execSRF.c:967 +#, c-format +msgid "Returned type %s at ordinal position %d, but query expects %s." +msgstr "" + +#: 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:742 +#, c-format +msgid "materialized view \"%s\" has not been populated" +msgstr "მატერიალიზებული ხედი \"%s\" შევსებული არაა" + +#: executor/execUtils.c:744 +#, c-format +msgid "Use the REFRESH MATERIALIZED VIEW command." +msgstr "გამოიყენეთ ბრძანება REFRESH MATERIALIZED VIEW." + +#: executor/functions.c:217 +#, c-format +msgid "could not determine actual type of argument declared %s" +msgstr "არგუმენტის, აღწერილის, როგორც '%s' ტიპის დადგენა შეუძლებელია" + +#: executor/functions.c:514 +#, c-format +msgid "cannot COPY to/from client in an SQL function" +msgstr "'SQL' ფუნქციაში კლიენტიდან/კლიენტამდე COPY შეუძლებელია" + +#. translator: %s is a SQL statement name +#: executor/functions.c:520 +#, c-format +msgid "%s is not allowed in an SQL function" +msgstr "%s SQL ფუნქციაში დაშვებული არაა" + +#. translator: %s is a SQL statement name +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 +#, c-format +msgid "%s is not allowed in a non-volatile function" +msgstr "%s-ის გამოყენება არააქროლად ფუნქციაში დაუშვებელია" + +#: executor/functions.c:1457 +#, c-format +msgid "SQL function \"%s\" statement %d" +msgstr "SQL ფუნქცია \"%s\" გამოსახულება %d" + +#: executor/functions.c:1483 +#, c-format +msgid "SQL function \"%s\" during startup" +msgstr "SQL ფუნქცია \"%s\" გაშვებისას" + +#: executor/functions.c:1568 +#, c-format +msgid "calling procedures with output arguments is not supported in SQL functions" +msgstr "გამოტანის არგუმენტების მქონე პროცედურების გამოძახება SQL-ის ფუნქციებში მხარდაჭერილი არაა" + +#: executor/functions.c:1701 executor/functions.c:1739 executor/functions.c:1753 executor/functions.c:1843 executor/functions.c:1876 executor/functions.c:1890 +#, c-format +msgid "return type mismatch in function declared to return %s" +msgstr "დაბრუნების ტიპის შეცდომა ფუნქციაში, რომელსაც აღწერილი აქვს, დააბრუნოს %s" + +#: executor/functions.c:1703 +#, c-format +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." +msgstr "ფუნქციის ბოლო გამოსახულება SELECT ან INSERT/UPDATE/DELETE RETURNING უნდა იყოს." + +#: executor/functions.c:1741 +#, c-format +msgid "Final statement must return exactly one column." +msgstr "პირველი გამოსახულება ზუსტად ერთ სვეტს უნდა აბრუნებდეს." + +#: executor/functions.c:1755 +#, c-format +msgid "Actual return type is %s." +msgstr "დაბრუნების ნამდვილი ტიპია %s." + +#: executor/functions.c:1845 +#, c-format +msgid "Final statement returns too many columns." +msgstr "პირველი გამოსახულება მეტისმეტად ბევრ სვეტს აბრუნებს." + +#: executor/functions.c:1878 +#, c-format +msgid "Final statement returns %s instead of %s at column %d." +msgstr "" + +#: executor/functions.c:1892 +#, c-format +msgid "Final statement returns too few columns." +msgstr "ბოლო გამოსახულება მეტისმეტად ცოტა სვეტს აბრუნებს." + +#: executor/functions.c:1920 +#, c-format +msgid "return type %s is not supported for SQL functions" +msgstr "დაბრუნების ტიპი %s SQL ფუნქციებში მხარდაჭერილი არაა" + +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 +#, c-format +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "" + +#: executor/nodeAgg.c:3952 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" +msgstr "" + +#: executor/nodeHashjoin.c:1076 executor/nodeHashjoin.c:1106 +#, c-format +msgid "could not rewind hash-join temporary file" +msgstr "" + +#: executor/nodeHashjoin.c:1294 executor/nodeHashjoin.c:1305 +#, c-format +msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +msgstr "" + +#: executor/nodeIndexonlyscan.c:240 +#, c-format +msgid "lossy distance functions are not supported in index-only scans" +msgstr "" + +#: executor/nodeLimit.c:374 +#, c-format +msgid "OFFSET must not be negative" +msgstr "OFFSET უარყოფითი უნდა იყოს" + +#: executor/nodeLimit.c:400 +#, c-format +msgid "LIMIT must not be negative" +msgstr "LIMIT უარყოფითი არ უნდა იყოს" + +#: executor/nodeMergejoin.c:1570 +#, c-format +msgid "RIGHT JOIN is only supported with merge-joinable join conditions" +msgstr "" + +#: executor/nodeMergejoin.c:1588 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable join conditions" +msgstr "" + +#: executor/nodeModifyTable.c:234 +#, c-format +msgid "Query has too few columns." +msgstr "მოთხოვნას ძალიან ცოტა სვეტი აქვს." + +#: executor/nodeModifyTable.c:1509 executor/nodeModifyTable.c:1583 +#, c-format +msgid "tuple to be deleted was already modified by an operation triggered by the current command" +msgstr "" + +#: executor/nodeModifyTable.c:1737 +#, c-format +msgid "invalid ON UPDATE specification" +msgstr "\"ON UPDATE\"-ის არასწორი სპეციფიკაცია" + +#: executor/nodeModifyTable.c:1738 +#, c-format +msgid "The result tuple would appear in a different partition than the original tuple." +msgstr "" + +#: executor/nodeModifyTable.c:2198 +#, 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:2199 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "" + +#: executor/nodeModifyTable.c:2202 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "განიხილეთ გარე გასაღების აღწერა ცხრილზე \"%s\"." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2548 executor/nodeModifyTable.c:2936 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "ბრძანებას %s მწკრივის მეორედ შეცვლა არ შეუძლია" + +#: executor/nodeModifyTable.c:2550 +#, c-format +msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." +msgstr "" + +#: executor/nodeModifyTable.c:2938 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "" + +#: executor/nodeModifyTable.c:3019 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "წასაშლელი კორტეჟები პარალელური განახლების გამო უკვე სხვა დანაყოფშია გადატანილი" + +#: executor/nodeModifyTable.c:3058 +#, 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 პარამეტრი ნულოვანი ვერ იქნება" + +#: executor/nodeSamplescan.c:272 +#, c-format +msgid "TABLESAMPLE REPEATABLE parameter cannot be null" +msgstr "TABLESAMPLE REPEATABLE პარამეტრი ნულოვანი ვერ იქნება" + +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 +#, c-format +msgid "more than one row returned by a subquery used as an expression" +msgstr "" + +#: executor/nodeTableFuncscan.c:375 +#, c-format +msgid "namespace URI must not be null" +msgstr "სახელების სივრცის URI ნულოვანი არ შეიძლება, იყოს" + +#: executor/nodeTableFuncscan.c:389 +#, c-format +msgid "row filter expression must not be null" +msgstr "მწკრივის ფილტრის გამოსახულება ნულოვანი არ შეიძლება, იყოს" + +#: executor/nodeTableFuncscan.c:415 +#, c-format +msgid "column filter expression must not be null" +msgstr "სვეტის ფილტრის გამოსახულება ნულოვანი არ შეიძლება, იყოს" + +#: executor/nodeTableFuncscan.c:416 +#, c-format +msgid "Filter for column \"%s\" is null." +msgstr "ფილტრი სვეტისთვის \"%s\" ნულოვანია." + +#: executor/nodeTableFuncscan.c:506 +#, c-format +msgid "null is not allowed in column \"%s\"" +msgstr "სვეტში \"%s\" ნულოვანი მნიშვნელობა დაშვებული არაა" + +#: executor/nodeWindowAgg.c:356 +#, c-format +msgid "moving-aggregate transition function must not return null" +msgstr "" + +#: executor/nodeWindowAgg.c:2081 +#, c-format +msgid "frame starting offset must not be null" +msgstr "ჩარჩოს საწყისი წანაცვლება ნულის ტოლი ვერ იქნება" + +#: executor/nodeWindowAgg.c:2094 +#, c-format +msgid "frame starting offset must not be negative" +msgstr "ჩარჩოს საწყისი წანაცვლება უარყოფითი ვერ იქნება" + +#: executor/nodeWindowAgg.c:2106 +#, c-format +msgid "frame ending offset must not be null" +msgstr "ჩარჩოს ბოლოს წანაცვლება ნულის ტოლი ვერ იქნება" + +#: executor/nodeWindowAgg.c:2119 +#, c-format +msgid "frame ending offset must not be negative" +msgstr "ჩარჩოს ბოლოს წანაცვლება უარყოფითი ვერ იქნება" + +#: executor/nodeWindowAgg.c:2907 +#, c-format +msgid "aggregate function %s does not support use as a window function" +msgstr "აგრეგატულ ფუნქციას %s ფანჯრის ფუნქციად გაშვების მხარდაჭერა არ გააჩნია" + +#: executor/spi.c:242 executor/spi.c:342 +#, c-format +msgid "invalid transaction termination" +msgstr "ტრანზაქციის არასწორი დასასრული" + +#: executor/spi.c:257 +#, c-format +msgid "cannot commit while a subtransaction is active" +msgstr "როცა ქვეტრანზაქცია აქტიურია, კომიტი შეუძლებელია" + +#: executor/spi.c:348 +#, c-format +msgid "cannot roll back while a subtransaction is active" +msgstr "როცა ქვეტრანზაქცია აქტიურია, ტრანზაქციის გაუქმება შეუძლებელია" + +#: executor/spi.c:472 +#, c-format +msgid "transaction left non-empty SPI stack" +msgstr "ტრანზაქცის შემდეგ დარჩენილი SPI სტეკი ცარიელი არაა" + +#: executor/spi.c:473 executor/spi.c:533 +#, c-format +msgid "Check for missing \"SPI_finish\" calls." +msgstr "ნაკლულ \"SPI_finish\" გამოძახებებზე შემოწმება." + +#: executor/spi.c:532 +#, c-format +msgid "subtransaction left non-empty SPI stack" +msgstr "ქვეტრანზაქცის შემდეგ დარჩენილი SPI სტეკი ცარიელი არაა" + +#: 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:1610 +#, c-format +msgid "cannot open %s query as cursor" +msgstr "%s გამოსახულების კურსორის სახით გახნა შეუძლებელია" + +#: 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:1717 parser/analyze.c:2861 +#, c-format +msgid "Scrollable cursors must be READ ONLY." +msgstr "გადახვევადი კურსორები READ ONLY უნდა იყოს." + +#: executor/spi.c:2474 +#, c-format +msgid "empty query does not return tuples" +msgstr "ცარიელი მოთხოვნა კორტეჟებს არ აბრუნებს" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2548 +#, c-format +msgid "%s query does not return tuples" +msgstr "მოთხოვნა %s კორტეჟებს არ აბრუნებს" + +#: executor/spi.c:2963 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL გამოსახულება \"%s\"" + +#: executor/spi.c:2968 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL მინიჭება \"%s\"" + +#: executor/spi.c:2971 +#, c-format +msgid "SQL statement \"%s\"" +msgstr "SQL ოპერატორი \"%s\"" + +#: executor/tqueue.c:74 +#, c-format +msgid "could not send tuple to shared-memory queue" +msgstr "გაზიარებული-მეხსიერების მქონე რიგში კორტეჟის გაგზავნა შეუძლებელია" + +#: foreign/foreign.c:221 +#, c-format +msgid "user mapping not found for \"%s\"" +msgstr "\"%s\"-სთვის მომხმარებლის მიბმა ვერ ვიპოვე" + +#: foreign/foreign.c:638 +#, c-format +msgid "invalid option \"%s\"" +msgstr "არასწორი პარამეტრი \"%s\"" + +#: foreign/foreign.c:640 +#, c-format +msgid "Valid options in this context are: %s" +msgstr "" + +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "ამ კონტექსტში სწორი პარამეტრები არ არსებობს." + +#: gram.y:1146 +#, c-format +msgid "UNENCRYPTED PASSWORD is no longer supported" +msgstr "UNENCRYPTED PASSWORD მხარდაჭერილი აღარაა" + +#: gram.y:1147 +#, c-format +msgid "Remove UNENCRYPTED to store the password in encrypted form instead." +msgstr "პაროლის დაშიფრულ ფორმაში დასამახსოვრებლად წაშალეთ UNENCRYPTED." + +#: gram.y:1209 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "როლის უცნობი პარამეტრი: \"%s\"" + +#: gram.y:1474 gram.y:1490 +#, c-format +msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" +msgstr "CREATE SCHEMA IF NOT EXISTS არ შეიძლება, სქემის ელემენტებს შეიცავდეს" + +#: gram.y:1647 +#, c-format +msgid "current database cannot be changed" +msgstr "მიმდინარე ბაზის შეცვლა შეუძლებელია" + +#: gram.y:1780 +#, c-format +msgid "time zone interval must be HOUR or HOUR TO MINUTE" +msgstr "დროის სარტყლის ინტერვალი HOUR ან HOUR TO MINUTE უნდა იყოს" + +#: gram.y:2397 +#, c-format +msgid "column number must be in range from 1 to %d" +msgstr "სვეტის ნომერი უნდა იყოს 1-დან %d-მდე" + +#: gram.y:2999 +#, c-format +msgid "sequence option \"%s\" not supported here" +msgstr "მიმდევრობის პარამეტრი \"%s\" აქ მხარდაჭერილი არაა" + +#: gram.y:3028 +#, c-format +msgid "modulus for hash partition provided more than once" +msgstr "ჰეშ-დანაყოფის მოდული ერთზე მეტჯერაა მითითებული" + +#: gram.y:3037 +#, c-format +msgid "remainder for hash partition provided more than once" +msgstr "დარჩენილი ნაწილი ჰეშ-დანაყოფისთვის ერთზე მეტჯერაა მითითებული" + +#: gram.y:3044 +#, c-format +msgid "unrecognized hash partition bound specification \"%s\"" +msgstr "" + +#: gram.y:3052 +#, c-format +msgid "modulus for hash partition must be specified" +msgstr "საჭიროა ჰეშ დანაყოფის მოდულის მითითება" + +#: gram.y:3056 +#, c-format +msgid "remainder for hash partition must be specified" +msgstr "საჭიროა ჰეშ დანაყოფის ნაშთის მითითება" + +#: gram.y:3264 gram.y:3298 +#, c-format +msgid "STDIN/STDOUT not allowed with PROGRAM" +msgstr "STDIN/STDOUT-ი PROGRAM-თან ერთად დაშვებული არაა" + +#: gram.y:3270 +#, c-format +msgid "WHERE clause not allowed with COPY TO" +msgstr "პირობა 'WHERE' 'COPY TO'-სთან ერთად დაშვებული არაა" + +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 +#, c-format +msgid "GLOBAL is deprecated in temporary table creation" +msgstr "დროებითი ცხრილის შექმნაში GLOBAL-ი მოძველებულია" + +#: gram.y:3881 +#, c-format +msgid "for a generated column, GENERATED ALWAYS must be specified" +msgstr "გენერირებული სვეტისთვის GENERATED ALWAYS-ის მითითება აუცილებელია" + +#: gram.y:4172 utils/adt/ri_triggers.c:2098 +#, c-format +msgid "MATCH PARTIAL not yet implemented" +msgstr "MATCH PARTIAL ჯერ განხორციელებული არაა" + +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "" + +#: gram.y:4974 +#, c-format +msgid "CREATE EXTENSION ... FROM is no longer supported" +msgstr "CREATE EXTENSION ... FROM უკვე მხარდაუჭერელია" + +#: gram.y:5672 +#, c-format +msgid "unrecognized row security option \"%s\"" +msgstr "მწკრივის უსაფრთხოების უცნობი პარამეტრი:\"%s\"" + +#: gram.y:5673 +#, c-format +msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." +msgstr "" + +#: gram.y:5758 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER მხარდაუჭერელია" + +#: gram.y:5795 +msgid "duplicate trigger events specified" +msgstr "მითითებულია ტრიგერი მეორდება" + +#: gram.y:5937 parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 +#, c-format +msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +msgstr "" + +#: gram.y:5944 +#, c-format +msgid "conflicting constraint properties" +msgstr "ერთმანეთთან შეუთავსებელი შეზღუდვის თვისებები" + +#: gram.y:6043 +#, c-format +msgid "CREATE ASSERTION is not yet implemented" +msgstr "CREATE ASSERTION ჯერ განუხორცელებია" + +#: gram.y:6451 +#, c-format +msgid "RECHECK is no longer required" +msgstr "RECHECK საჭირო აღარაა" + +#: gram.y:6452 +#, c-format +msgid "Update your data type." +msgstr "განაახლეთ თქვენი მონაცემთა ტიპი." + +#: gram.y:8308 +#, c-format +msgid "aggregates cannot have output arguments" +msgstr "აგრეგატებს გამოტანის არგუმენტები ვერ ექნება" + +#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#, c-format +msgid "missing argument" +msgstr "ნაკლული არგუმენტი" + +#: gram.y:8772 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 "" + +#: gram.y:10993 gram.y:11012 +#, c-format +msgid "WITH CHECK OPTION not supported on recursive views" +msgstr "WITH CHECK OPTION რეკურსიულ ხედებზე მხარდაუჭერელია" + +#: gram.y:12898 +#, c-format +msgid "LIMIT #,# syntax is not supported" +msgstr "LIMIT #,# სინტაქსი მხარდაჭერილი არაა" + +#: gram.y:12899 +#, c-format +msgid "Use separate LIMIT and OFFSET clauses." +msgstr "გამოიყენეთ განცალკევებული LIMIT და OFFSET პირობები." + +#: gram.y:13252 gram.y:13278 +#, c-format +msgid "VALUES in FROM must have an alias" +msgstr "FROM-ში VALUES-ს აუცილებელია მეტსახელი ჰქონდეს" + +#: gram.y:13253 gram.y:13279 +#, c-format +msgid "For example, FROM (VALUES ...) [AS] foo." +msgstr "მაგალითად, FROM (VALUES ...) [AS] foo." + +#: gram.y:13258 gram.y:13284 +#, c-format +msgid "subquery in FROM must have an alias" +msgstr "ქვემოთხოვნას \"FROM\"-ში მეტსახელი უნდა ჰქონდეს" + +#: gram.y:13259 gram.y:13285 +#, c-format +msgid "For example, FROM (SELECT ...) [AS] foo." +msgstr "მაგალითად, FROM (SELECT ...) [AS] foo." + +#: gram.y:13803 +#, c-format +msgid "only one DEFAULT value is allowed" +msgstr "დასაშვებია DEFAULT_ის მხოლოდ ერთი მნიშვნელობა" + +#: gram.y:13812 +#, c-format +msgid "only one PATH value per column is allowed" +msgstr "ყოველ სვეტზე PATH-ის მხოლოდ ერთი მნიშვნელობაა დასაშვები" + +#: gram.y:13821 +#, c-format +msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgstr "" + +#: gram.y:13830 +#, c-format +msgid "unrecognized column option \"%s\"" +msgstr "სვეტის უცნობი პარამეტრი %s" + +#: gram.y:14084 +#, c-format +msgid "precision for type float must be at least 1 bit" +msgstr "წილადი რიცხვების სიზუსტე 1 ბიტი მაინც უნდა იყოს" + +#: gram.y:14093 +#, c-format +msgid "precision for type float must be less than 54 bits" +msgstr "წილადი რიცხვების სიზუსტე 54 ბიტზე მეტი ვერ იქნება" + +#: gram.y:14596 +#, c-format +msgid "wrong number of parameters on left side of OVERLAPS expression" +msgstr "" + +#: gram.y:14601 +#, c-format +msgid "wrong number of parameters on right side of OVERLAPS expression" +msgstr "" + +#: gram.y:14778 +#, c-format +msgid "UNIQUE predicate is not yet implemented" +msgstr "პრედიკატი UNIQUE ჯერ განხორციელებული არაა" + +#: gram.y:15156 +#, c-format +msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" +msgstr "'WITHIN GROUP'-თან ერთად ერთზე მეტი ORDER BY პირობის გამოყენება შეუძლებელია" + +#: gram.y:15161 +#, c-format +msgid "cannot use DISTINCT with WITHIN GROUP" +msgstr "\"DISTINCT\"-ს \"WITHIN GROUP\"-თან ერთად ვერ გამოიყენებთ" + +#: gram.y:15166 +#, c-format +msgid "cannot use VARIADIC with WITHIN GROUP" +msgstr "\"VARIADIC\"-ს \"WITHIN GROUP\"-თან ერთად ვერ გამოიყენებთ" + +#: gram.y:15703 gram.y:15727 +#, c-format +msgid "frame start cannot be UNBOUNDED FOLLOWING" +msgstr "ჩარჩოს დასაწყისი UNBOUNDED FOLLOWING ვერ იქნება" + +#: gram.y:15708 +#, c-format +msgid "frame starting from following row cannot end with current row" +msgstr "ჩარჩო, რომელიც შემდეგი მწკრივიდან იწყება, მიმდინარე მწკრივზე ვერ დასრულდება" + +#: gram.y:15732 +#, c-format +msgid "frame end cannot be UNBOUNDED PRECEDING" +msgstr "ჩარჩოს დასასრული UNBOUNDED PRECEDING ვერ იქნება" + +#: gram.y:15738 +#, c-format +msgid "frame starting from current row cannot have preceding rows" +msgstr "ჩარჩოს, რომელიც მიმდინარე მწკრივიდან იწყება, წინა ჩარჩოები ვერ ექნება" + +#: gram.y:15745 +#, c-format +msgid "frame starting from following row cannot have preceding rows" +msgstr "ჩარჩოს, რომელიც შემდეგი მწკრივიდან იწყება, წინა ჩარჩოები ვერ ექნება" + +#: gram.y:16370 +#, c-format +msgid "type modifier cannot have parameter name" +msgstr "ტიპის მოდიფიკატორს პარამეტრის სახელი ვერ ექნება" + +#: gram.y:16376 +#, c-format +msgid "type modifier cannot have ORDER BY" +msgstr "ტიპის მოდიფიკატორს ORDER BY ვერ ექნება" + +#: gram.y:16444 gram.y:16451 gram.y:16458 +#, c-format +msgid "%s cannot be used as a role name here" +msgstr "%s აქ როგორც როლის სახელს ვერ გამოიყენებთ" + +#: gram.y:16548 gram.y:17983 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES-ს ORDER BY პირობის გარეშე ვერ მიუთითებთ" + +#: gram.y:17662 gram.y:17849 +msgid "improper use of \"*\"" +msgstr "\"*\"-ის არასათანადო გამოყენება" + +#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 +#, c-format +msgid "syntax error" +msgstr "სინტაქსური შეცდომა" + +#: gram.y:17913 +#, c-format +msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" +msgstr "" + +#: gram.y:17950 +#, c-format +msgid "multiple ORDER BY clauses not allowed" +msgstr "\"ORDER BY\"-ის გამოყენება მხოლოდ ერთხელ შეგიძლიათ" + +#: gram.y:17961 +#, c-format +msgid "multiple OFFSET clauses not allowed" +msgstr "\"OFFSET\"-ის გამოყენება მხოლოდ ერთხელ შეგიძლიათ" + +#: gram.y:17970 +#, c-format +msgid "multiple LIMIT clauses not allowed" +msgstr "\"LIMIT\"-ის გამოყენება მხოლოდ ერთხელ შეგიძლიათ" + +#: gram.y:17979 +#, c-format +msgid "multiple limit options not allowed" +msgstr "ლიმიტის პარამეტრების მითითება მხოლოდ ერთხელ შეგიძლიათ" + +#: gram.y:18006 +#, c-format +msgid "multiple WITH clauses not allowed" +msgstr "\"WITH\"-ის გამოყენება მხოლოდ ერთხელ შეგიძლიათ" + +#: gram.y:18199 +#, c-format +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "" + +#: gram.y:18332 +#, c-format +msgid "multiple COLLATE clauses not allowed" +msgstr "\"COLLATE\"-ის გამოყენება მხოლოდ ერთხელ შეგიძლიათ" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18370 gram.y:18383 +#, c-format +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "%s -ის შეზღუდვებიs, როგორც DEFERRABLE, მონიშვნა შეუძლებელია" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18396 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "%s -ის შეზღუდვებიs, როგორც NOT VALID, მონიშვნა შეუძლებელია" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18409 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "%s -ის შეზღუდვებიs, როგორც NO INHERIT, მონიშვნა შეუძლებელია" + +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "პუბლიკაციების ობიექტების არასწორი სია" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "" + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "არასწორი ცხრილის სახელი" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "WHERE პირობა სქემისთვის დაშვებული არაა" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "სქემისთვის სვეტის მითითება დაშვებული არაა" + +#: gram.y:18492 +#, c-format +msgid "invalid schema name" +msgstr "არასწორი სქემის სახელი" + +#: guc-file.l:314 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "უცნობი კონფიგურაციის პარამეტრი \"%s\" ფაილში \"%s\" ხაზზე %d" + +#: guc-file.l:353 utils/misc/guc.c:7688 utils/misc/guc.c:7908 utils/misc/guc.c:8006 utils/misc/guc.c:8104 utils/misc/guc.c:8228 utils/misc/guc.c:8331 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "პარამეტრი \"%s\" -ის შეცვლა სერვერის გადატვირთვის გარეშე შეუძლებელია" + +#: guc-file.l:389 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "პარამეტრი \"%s\" წაიშალა კონფიგურაციის ფაილიდან. დაბრუნდა ნაგულისხმევ მნიშვნელობაზე" + +#: guc-file.l:454 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "პარამეტრი \"%s\" შეიცვალა \"%s\"-ზე" + +#: guc-file.l:496 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "კონფიგურაციის ფაილი \"%s\" შეცდომებს შეიცავს" + +#: guc-file.l:501 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "კონფიგურაციის ფაილი \"%s\" შეცდომებს შეიცავს; გამოყენებული იქნება მხოლოდ სწორი ნაწილი" + +#: guc-file.l:506 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "კონფიგურაციის ფაილი \"%s\" შეცდომებს შეიცავს; ცვლილებები არ მოხდება" + +#: guc-file.l:578 +#, c-format +msgid "empty configuration file name: \"%s\"" +msgstr "კონფიგურაციის ფაილის ცარიელი სახელი: \"%s\"" + +#: guc-file.l:595 +#, c-format +msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "კონფიგურაციის ფაილის (\"%s\") გახსნა შეუძლებელია: ჩალაგების სიღრმე გადაცილებულია" + +#: guc-file.l:615 +#, c-format +msgid "configuration file recursion in \"%s\"" +msgstr "კონფიგურაციის ფაილის რეკურსია \"%s\"-ში" + +#: guc-file.l:631 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:642 +#, c-format +msgid "skipping missing configuration file \"%s\"" +msgstr "კონფიგურაციის ფაილის გამოტოვება \"%s\"" + +#: guc-file.l:896 +#, c-format +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "სინტაქსის შეცდომა ფაილში \"%s\" ხაზზე %u, ხაზის ბოლოსთან ახლოს" + +#: guc-file.l:906 +#, c-format +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "სინტაქსის შეცდომა ფაილში \"%s\" ხაზზე %u, ახლოს კოდთან \"%s\"" + +#: guc-file.l:926 +#, c-format +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "აღმოჩენილია მეტისმეტად ბევრი შეცდომა. ფაილი \"%s\" მიტოვებულია" + +#: guc-file.l:981 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "კონფიგურაციის საქაღალდის სახელი ცარიელია: \"%s\"" + +#: guc-file.l:1000 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "კონფიგურაციის საქაღალდის (\"%s\") გახსნის შეცდომა: %m" + +#: 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:629 utils/adt/varlena.c:335 utils/adt/varlena.c:376 +#, c-format +msgid "invalid input syntax for type %s" +msgstr "არასწორი შეყვანის სინტაქსი ტიპისთვის %s" + +#: jsonpath_gram.y:530 +#, c-format +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "უცნობი ალმის სიმბოლო \"%.*s\" LIKE_REGEX პრედიკატში." + +#: jsonpath_gram.y:584 +#, c-format +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "ენის XQuery ალამი \"x\" (გაფართოებული რეგულარული გამოსახულებები) განხორციელებული არაა" + +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:282 +#, c-format +msgid "%s at end of jsonpath input" +msgstr "%s jsonpath-ის შეყვანის ბოლოში" + +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:289 +#, c-format +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "" + +#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:623 +#, c-format +msgid "unsupported Unicode escape sequence" +msgstr "უნიკოდის სპეცკოდის მხარდაუჭერელი მიმდევრობა" + +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 utils/mmgr/dsa.c:806 +#, c-format +msgid "Failed on DSA request of size %zu." +msgstr "შეცდომა DSA მეხსიერების გამოთხოვისას (ზომა %zu ბაიტი)." + +#: 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:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 +#, c-format +msgid "invalid SCRAM secret for user \"%s\"" +msgstr "არასწორი SCRAM საიდუმლო მომხმარებლისთვის \"%s\"" + +#: libpq/auth-scram.c:290 +#, c-format +msgid "User \"%s\" does not have a valid SCRAM secret." +msgstr "მომხმარებელს \"%s\" სწორი SCRAM საიდუმლო არ გააჩნია." + +#: 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:369 +#, c-format +msgid "The message is empty." +msgstr "შეტყობინება ცარიელია." + +#: libpq/auth-scram.c:374 +#, c-format +msgid "Message length does not match input length." +msgstr "შეტყობინების სიგრძე შეყვანის სიგრძეს არემთხვევა." + +#: libpq/auth-scram.c:406 +#, c-format +msgid "invalid SCRAM response" +msgstr "არასწორი SCRAM პასუხი" + +#: libpq/auth-scram.c:407 +#, c-format +msgid "Nonce does not match." +msgstr "ერთჯერადი რიცხვები არ ემთხვევა." + +#: libpq/auth-scram.c:483 +#, c-format +msgid "could not generate random salt" +msgstr "შემთხვევითი მარილის გენერაციის შეცდომა" + +#: libpq/auth-scram.c:715 +#, c-format +msgid "Expected attribute \"%c\" but found \"%s\"." +msgstr "მოველოდი ატრიბუტს \"%c\" მაგრამ მივიღე \"%s\"." + +#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 +#, c-format +msgid "Expected character \"=\" for attribute \"%c\"." +msgstr "მოველოდი სიმბოლოს \"=\" ატრიბუტისთვის \"%c\"." + +#: libpq/auth-scram.c:828 +#, c-format +msgid "Attribute expected, but found end of string." +msgstr "მოველოდი ატრიბუტს, მაგრამ სტრიქონის ბოლო მივიღე." + +#: libpq/auth-scram.c:841 +#, c-format +msgid "Attribute expected, but found invalid character \"%s\"." +msgstr "მოველოდი ატრიბუტს, მაგრამ მივიღე არასწორი სიმბოლო \"%s\"." + +#: 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:966 libpq/auth-scram.c:996 +#, c-format +msgid "Comma expected, but found character \"%s\"." +msgstr "მოველოდი მძიმეს, მაგრამ აღმოჩენილია სიმბოლო \"%s\"." + +#: libpq/auth-scram.c:987 +#, c-format +msgid "SCRAM channel binding negotiation error" +msgstr "SCRAM არხზე მიბმის მოლაპარაკების შეცდომა" + +#: 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: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:1021 +#, c-format +msgid "unsupported SCRAM channel-binding type \"%s\"" +msgstr "მხარდაუჭერელი SCRAM-ის არხზე მიბმის ტიპი \"%s\"" + +#: libpq/auth-scram.c:1028 +#, c-format +msgid "Unexpected channel-binding flag \"%s\"." +msgstr "არხზე მიბმის მოულოდნელი ალამი: \"%s\"." + +#: libpq/auth-scram.c:1038 +#, c-format +msgid "client uses authorization identity, but it is not supported" +msgstr "კლიენტი იყენებს ავტორიზაციის იდენტიფიკაციას, მაგრამ ის მხარდაჭერილი არაა" + +#: libpq/auth-scram.c:1043 +#, c-format +msgid "Unexpected attribute \"%s\" in client-first-message." +msgstr "" + +#: libpq/auth-scram.c:1059 +#, c-format +msgid "client requires an unsupported SCRAM extension" +msgstr "კლიენტი მოითხოვს SCRAM გაფართოებას, რომელიც მხარდაჭერილი არაა" + +#: libpq/auth-scram.c:1073 +#, c-format +msgid "non-printable characters in SCRAM nonce" +msgstr "" + +#: libpq/auth-scram.c:1203 +#, c-format +msgid "could not generate random nonce" +msgstr "ერთჯერადი კოდის გენერაციის შეცდომა" + +#: libpq/auth-scram.c:1213 +#, c-format +msgid "could not encode random nonce" +msgstr "ერთჯერადი კოდის კოდირების შეცდომა" + +#: libpq/auth-scram.c:1319 +#, c-format +msgid "SCRAM channel binding check failed" +msgstr "SCRAM არხზე მიბმის შემოწმების შეცდომა" + +#: libpq/auth-scram.c:1337 +#, c-format +msgid "unexpected SCRAM channel-binding attribute in client-final-message" +msgstr "" + +#: libpq/auth-scram.c:1356 +#, c-format +msgid "Malformed proof in client-final-message." +msgstr "" + +#: libpq/auth-scram.c:1364 +#, c-format +msgid "Garbage found at the end of client-final-message." +msgstr "კლიენტის-საბოლოო-შეტყობინების ბოლოში აღმოჩენილია ნაგავი." + +#: libpq/auth.c:275 +#, c-format +msgid "authentication failed for user \"%s\": host rejected" +msgstr "ავთენტიკაციის შეცდომა მომხმარებლისთვის \"%s\": ჰოსტმა ის უარყო" + +#: libpq/auth.c:278 +#, c-format +msgid "\"trust\" authentication failed for user \"%s\"" +msgstr "\"ნდობით\" ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:281 +#, c-format +msgid "Ident authentication failed for user \"%s\"" +msgstr "იდენტიფიკაციით ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:284 +#, c-format +msgid "Peer authentication failed for user \"%s\"" +msgstr "პარტნიორის ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:289 +#, c-format +msgid "password authentication failed for user \"%s\"" +msgstr "პაროლით ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:294 +#, c-format +msgid "GSSAPI authentication failed for user \"%s\"" +msgstr "GSSAPI ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:297 +#, c-format +msgid "SSPI authentication failed for user \"%s\"" +msgstr "SSPI ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:300 +#, c-format +msgid "PAM authentication failed for user \"%s\"" +msgstr "PAM ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:303 +#, c-format +msgid "BSD authentication failed for user \"%s\"" +msgstr "BSD ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:306 +#, c-format +msgid "LDAP authentication failed for user \"%s\"" +msgstr "LDAP ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:309 +#, c-format +msgid "certificate authentication failed for user \"%s\"" +msgstr "სერტიფიკატით ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:312 +#, c-format +msgid "RADIUS authentication failed for user \"%s\"" +msgstr "რადიუსით ავთენტიფიკაცია მომხმარებლისთვის \"%s\" ვერ მოხერხდა" + +#: libpq/auth.c:315 +#, c-format +msgid "authentication failed for user \"%s\": invalid authentication method" +msgstr "ავთენტიკაციის შეცდომა მომხმარებლისთვის \"%s\": არასწორი ავთენტიკაციის მეთოდი" + +#: libpq/auth.c:319 +#, c-format +msgid "Connection matched pg_hba.conf line %d: \"%s\"" +msgstr "" + +#: libpq/auth.c:362 +#, c-format +msgid "authentication identifier set more than once" +msgstr "ავთენტიფიკაციის იდენტიფიკატორი ერთზე მეტჯერაა დაყენებული" + +#: 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:422 +#, c-format +msgid "connection requires a valid client certificate" +msgstr "მიერთების მცდელობას კლიენტის სწორი სერტიფიკატი ესაჭიროება" + +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "GSS encryption" +msgstr "GSS დაშიფვრა" + +#: libpq/auth.c:456 libpq/auth.c:502 +msgid "SSL encryption" +msgstr "SSL დაშიფვრა" + +#: libpq/auth.c:458 libpq/auth.c:504 +msgid "no encryption" +msgstr "დაშიფვრის გარეშე" + +#. translator: last %s describes encryption state +#: libpq/auth.c:464 +#, c-format +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf უარყოფს რეპლიკაციის მიერთებას ჰოსტისთვის \"%s\", მომხმარებელი \"%s\", %s" + +#. 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:509 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup matches." +msgstr "კლიენტის IP მისამართი იხსნება \"%s\" პირდაპირი DNS ემთხვევა." + +#: libpq/auth.c:512 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup not checked." +msgstr "კლიენტის IP მისამართი იხსნება \"%s\" პირდაპირი DNS არ შემოწმებულა." + +#: libpq/auth.c:515 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup does not match." +msgstr "კლიენტის IP მისამართი იხსნება \"%s\" პირდაპირი DNS არ ემთხვევა." + +#: 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:523 +#, 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: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 აღმოჩენილი არაა" + +#. 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:712 +#, c-format +msgid "expected password response, got message type %d" +msgstr "მოველოდი პაროლის პასუხს, მივიღე შეტყობინების ტიპი %d" + +#: libpq/auth.c:733 +#, c-format +msgid "invalid password packet size" +msgstr "პაროლის პაკეტის არასწორი ზომა" + +#: libpq/auth.c:751 +#, c-format +msgid "empty password returned by client" +msgstr "კლიენტმა ცარიელი პაროლი დააბრუნა" + +#: libpq/auth.c:880 libpq/hba.c:1335 +#, c-format +msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" +msgstr "MD5 ავთენტიკაცია მაშინ, როცა \"db_user_namespace\" ჩართულია, მხარდაჭერილი არაა" + +#: libpq/auth.c:886 +#, c-format +msgid "could not generate random MD5 salt" +msgstr "შემთხვევითი MD5 მარილის გენერაციის შეცდომა" + +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 +#, c-format +msgid "could not set environment: %m" +msgstr "გარემოს მორგების შეცდომა: %m" + +#: libpq/auth.c:971 +#, c-format +msgid "expected GSS response, got message type %d" +msgstr "მოველოდი GSS პასუხს, მივიღე შეტყობინების ტიპი %d" + +#: libpq/auth.c:1031 +msgid "accepting GSS security context failed" +msgstr "'GSS'-ის უსაფრთხოების კონტექსტის მიღების შეცდომა" + +#: libpq/auth.c:1072 +msgid "retrieving GSS user name failed" +msgstr "'GSS'-ის მომხმარებლის სახელის მიღების შეცდომა" + +#: libpq/auth.c:1221 +msgid "could not acquire SSPI credentials" +msgstr "შეცდომა SSPI-ის მომხმ./პაროლის მიღებისას" + +#: libpq/auth.c:1246 +#, c-format +msgid "expected SSPI response, got message type %d" +msgstr "მოველოდი SSPI პასუხს, მივიღე შეტყობინების ტიპი %d" + +#: libpq/auth.c:1324 +msgid "could not accept SSPI security context" +msgstr "'SSPI'-ის უსაფრთხოების კონტექსტის მიღების შეცდომა" + +#: libpq/auth.c:1386 +msgid "could not get token from SSPI security context" +msgstr "'SSPI'-ის უსაფრთხოების კონტექსტიდან კოდის მიღების შეცდომა" + +#: libpq/auth.c:1525 libpq/auth.c:1544 +#, c-format +msgid "could not translate name" +msgstr "სახელის თარგმნა შეუძლებელია" + +#: libpq/auth.c:1557 +#, c-format +msgid "realm name too long" +msgstr "რეალმის სახელი ძალიან გრძელია" + +#: libpq/auth.c:1572 +#, c-format +msgid "translated account name too long" +msgstr "ანგარიშის ნათარგმნი სახელი ძალიან გრძელია" + +#: libpq/auth.c:1753 +#, c-format +msgid "could not create socket for Ident connection: %m" +msgstr "ident მიერთებისთვის სოკეტის შექმნა შეუძლებელია: %m" + +#: libpq/auth.c:1768 +#, c-format +msgid "could not bind to local address \"%s\": %m" +msgstr "ლოკალურ მისამართზე \"%s\" მიბმის შეცდომა: %m" + +#: libpq/auth.c:1780 +#, c-format +msgid "could not connect to Ident server at address \"%s\", port %s: %m" +msgstr "შეცდომა LDAP სერვერთან მიერთებისას. მისამართი - \"%s\",პორტი - %s: %m" + +#: libpq/auth.c:1802 +#, c-format +msgid "could not send query to Ident server at address \"%s\", port %s: %m" +msgstr "შეცდომა LDAP სერვერზე მოთხოვნის გაგზავნისას. მისამართი - \"%s\", პორტი - %s: %m" + +#: libpq/auth.c:1819 +#, c-format +msgid "could not receive response from Ident server at address \"%s\", port %s: %m" +msgstr "პასუხი Ident-ის სერვერიდან მისამართით \"%s\" პორტზე %s ვერ მივიღე: %m" + +#: libpq/auth.c:1829 +#, c-format +msgid "invalidly formatted response from Ident server: \"%s\"" +msgstr "არასწორად დაფორმატებული პასუხი Ident სერვერიდან: \"%s\"" + +#: libpq/auth.c:1882 +#, c-format +msgid "peer authentication is not supported on this platform" +msgstr "ამ პლატფორმაზე პარტნიორის ავთენტიკაცია მხარდაჭერილი არაა" + +#: libpq/auth.c:1886 +#, c-format +msgid "could not get peer credentials: %m" +msgstr "პარტნიორის ავტორიზაციის დეტალების მიღების შეცდომა: %m" + +#: libpq/auth.c:1898 +#, c-format +msgid "could not look up local user ID %ld: %s" +msgstr "ლოკალური მომხმარებლის ID-ით %ld მოძებნა შეუძლებელია: %s" + +#: libpq/auth.c:1999 +#, c-format +msgid "error from underlying PAM layer: %s" +msgstr "შეცდომა ქვედა PAM ფენიდან: %s" + +#: 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 ავთენტიკატორის შექმნისას: %s" + +#: libpq/auth.c:2081 +#, c-format +msgid "pam_set_item(PAM_USER) failed: %s" +msgstr "pam_set_item(PAM_USER) -ის შეცდომა: %s" + +#: libpq/auth.c:2113 +#, c-format +msgid "pam_set_item(PAM_RHOST) failed: %s" +msgstr "pam_set_item(PAM_RHOST) -ის შეცდომა: %s" + +#: libpq/auth.c:2125 +#, c-format +msgid "pam_set_item(PAM_CONV) failed: %s" +msgstr "pam_set_item(PAM_CONV) -ის შეცდომა: %s" + +#: libpq/auth.c:2138 +#, c-format +msgid "pam_authenticate failed: %s" +msgstr "pam_authenticate -ის შეცდომა: %s" + +#: libpq/auth.c:2151 +#, c-format +msgid "pam_acct_mgmt failed: %s" +msgstr "pam_acct_mgmt-ის შეცდომა: %s" + +#: libpq/auth.c:2162 +#, c-format +msgid "could not release PAM authenticator: %s" +msgstr "შეცდომა PAM ავთენტიკატორის მოხსნისას: %s" + +#: libpq/auth.c:2242 +#, c-format +msgid "could not initialize LDAP: error code %d" +msgstr "შეცდომა LDAP-ის ინიციალიზაციისას: შეცდომის კოდი %d" + +#: libpq/auth.c:2279 +#, c-format +msgid "could not extract domain name from ldapbasedn" +msgstr "ldapbasedn-დან დომენის სახელის გამოღება შეუძლებელია" + +#: 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:2289 +#, c-format +msgid "Set an LDAP server name explicitly." +msgstr "LDAP სერვერის სახელი აშკარად უნდა დააყენოთ." + +#: libpq/auth.c:2341 +#, c-format +msgid "could not initialize LDAP: %s" +msgstr "\"LDAP\"-ის ინიციალიზაციის შეცდომა: %s" + +#: libpq/auth.c:2351 +#, c-format +msgid "ldaps not supported with this LDAP library" +msgstr "ამ LDAP ბიბლიოთეკას ldaps-ის მხარდაჭერა არ გააჩნია" + +#: libpq/auth.c:2359 +#, c-format +msgid "could not initialize LDAP: %m" +msgstr "\"LDAP\"-ის ინიციალიზაციის შეცდომა: %m" + +#: libpq/auth.c:2369 +#, c-format +msgid "could not set LDAP protocol version: %s" +msgstr "\"LDAP\"-ის ვერსიის დაყენების შეცდომა: %s" + +#: libpq/auth.c:2409 +#, c-format +msgid "could not load function _ldap_start_tls_sA in wldap32.dll" +msgstr "" + +#: libpq/auth.c:2410 +#, c-format +msgid "LDAP over SSL is not supported on this platform." +msgstr "" + +#: libpq/auth.c:2426 +#, c-format +msgid "could not start LDAP TLS session: %s" +msgstr "\"LDAP TLS\" სესიის დაწყების შეცდომა: %s" + +#: libpq/auth.c:2497 +#, c-format +msgid "LDAP server not specified, and no ldapbasedn" +msgstr "LDAP სერვერი და ldapbasedn მითითებული არაა" + +#: libpq/auth.c:2504 +#, c-format +msgid "LDAP server not specified" +msgstr "LDAP სერვერი მითითებული არაა" + +#: libpq/auth.c:2566 +#, c-format +msgid "invalid character in user name for LDAP authentication" +msgstr "არასწორი სიმბოლო მომხმარებლის სახელში LDAP-ით ავთენტიკაციისას" + +#: libpq/auth.c:2583 +#, c-format +msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" +msgstr "ldapbinddn \"%s\"-სთვის სერვერზე \"%s\" საწყისი LDAP მიბმა ვერ განვახორციელე: %s" + +#: libpq/auth.c:2612 +#, c-format +msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" +msgstr "ფილტრისთვის \"%s\" სერვერზე \"%s\" LDAP ძებნის გაშვება შეუძლებელია: %s" + +#: libpq/auth.c:2626 +#, c-format +msgid "LDAP user \"%s\" does not exist" +msgstr "LDAP-ის მომხმარებელი \"%s\" არ არსებობს" + +#: libpq/auth.c:2627 +#, c-format +msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." +msgstr "LDAP ძებნამ ფილტრისთვის \"%s\" სერვერზე \"%s\" ჩანაწერები არ დააბრუნა." + +#: libpq/auth.c:2631 +#, c-format +msgid "LDAP user \"%s\" is not unique" +msgstr "LDAP-ის მომხმარებელი \"%s\" უნიკალური არაა" + +#: 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 ძებნამ ფილტრისთვის \"%s\" სერვერზე \"%s\" %d ჩანაწერი დააბრუნა." +msgstr[1] "LDAP ძებნამ ფილტრისთვის \"%s\" სერვერზე \"%s\" %d ჩანაწერი დააბრუნა." + +#: libpq/auth.c:2652 +#, c-format +msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" +msgstr "" + +#: libpq/auth.c:2673 +#, c-format +msgid "could not unbind after searching for user \"%s\" on server \"%s\"" +msgstr "" + +#: libpq/auth.c:2704 +#, c-format +msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" +msgstr "LDAP-ით შესვლის შეცდომა მომხმარებლისთვის \"%s\" სერვერზე \"%s\": %s" + +#: libpq/auth.c:2736 +#, c-format +msgid "LDAP diagnostics: %s" +msgstr "LDAP-ის დიაგნოსტიკა: %s" + +#: libpq/auth.c:2774 +#, c-format +msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" +msgstr "სერტიფიკატით ავთენტიკაციის შეცდომა მომხმარებლისთვის \"%s\": კლიენტის სერტიფიკატი მომხმარებლის სახელს არ შეიცავს" + +#: 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 "სერტიფიკატის გადამოწმების (clientcert=verify-full) შეცდომა მომხმარებლისთვის \"%s\": DN არ ემთხვევა" + +#: libpq/auth.c:2823 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" +msgstr "სერტიფიკატის გადამოწმების (clientcert=verify-full) შეცდომა მომხმარებლისთვის \"%s\": CN არ ემთხვევა" + +#: libpq/auth.c:2925 +#, c-format +msgid "RADIUS server not specified" +msgstr "RADIUS სერვერი მითითებული არაა" + +#: libpq/auth.c:2932 +#, c-format +msgid "RADIUS secret not specified" +msgstr "RADIUS-ის პაროლი მითითებული არაა" + +#: libpq/auth.c:2946 +#, c-format +msgid "RADIUS authentication does not support passwords longer than %d characters" +msgstr "RADIUS-ით ავთენტიკაციისას %d სიმბოლოზე გრძელი პაროლები მხარდაჭერილი არაა" + +#: 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:3067 +#, c-format +msgid "could not generate random encryption vector" +msgstr "შემთხვევითი დაშიფვრის ვექტორის გენერაციის შეცდომა" + +#: libpq/auth.c:3104 +#, c-format +msgid "could not perform MD5 encryption of password: %s" +msgstr "პაროლის MD5-ით დაშიფვრა შეუძლებელია: %s" + +#: libpq/auth.c:3131 +#, c-format +msgid "could not create RADIUS socket: %m" +msgstr "შეცდომა RADIUS სოკეტის შექმნისას: %m" + +#: libpq/auth.c:3153 +#, c-format +msgid "could not bind local RADIUS socket: %m" +msgstr "ლოკალურ RADIUS სოკეტზე მიბმის შეცდომა: %m" + +#: libpq/auth.c:3163 +#, c-format +msgid "could not send RADIUS packet: %m" +msgstr "შეცდომა RADIUS პაკეტის გაგზავნისას: %m" + +#: libpq/auth.c:3197 libpq/auth.c:3223 +#, c-format +msgid "timeout waiting for RADIUS response from %s" +msgstr "%s-დან RADIUS პასუხის მოლოდინის ვადა ამოიწურა" + +#: libpq/auth.c:3216 +#, c-format +msgid "could not check status on RADIUS socket: %m" +msgstr "შეცდომა RADIUS სოკეტის სტატუსის შემოწმებისას: %m" + +#: libpq/auth.c:3246 +#, c-format +msgid "could not read RADIUS response: %m" +msgstr "შეცდომა RADIUS პასუხის წაკითხვისას: %m" + +#: libpq/auth.c:3259 libpq/auth.c:3263 +#, c-format +msgid "RADIUS response from %s was sent from incorrect port: %d" +msgstr "RADIUS პასუხი \"%s\" გამოგზავნილია არასწორი პორტიდან: %d" + +#: libpq/auth.c:3272 +#, c-format +msgid "RADIUS response from %s too short: %d" +msgstr "RADIUS პასუხი %s-დან მეტისმეტად მოკლეა: %d" + +#: libpq/auth.c:3279 +#, c-format +msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" +msgstr "RADIUS პასუხს %s-დან დაზიანებული სიგრძე გააჩნია: %d (რეალური სიგრძე %d)" + +#: libpq/auth.c:3287 +#, c-format +msgid "RADIUS response from %s is to a different request: %d (should be %d)" +msgstr "RADIUS პასუხი %s-დან სხვა მოთხოვნას ეკუთვნის: %d (უნდა იყოს %d)" + +#: libpq/auth.c:3312 +#, c-format +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "მიღებული პაკეტის MD5-ით დაშიფვრა შეუძლებელია: %s" + +#: libpq/auth.c:3322 +#, c-format +msgid "RADIUS response from %s has incorrect MD5 signature" +msgstr "%s-დან მიღებული RADIUS პასუხის MD5 ხელმოწერა არასწორია" + +#: libpq/auth.c:3340 +#, c-format +msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" +msgstr "%s-დან მიღებულ RADIUS-ს პასუხს არასწორი კოდი (%d) გააჩნია მომხმარებლისთვის \"%s\"" + +#: 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:168 +#, c-format +msgid "large object descriptor %d was not opened for reading" +msgstr "დიდი ობიექტის დესკრიპტორი %d წაკითხვისთვის არ გახსნილა" + +#: 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:219 +#, c-format +msgid "lo_lseek result out of range for large-object descriptor %d" +msgstr "lo_lseek-ის შედეგი დიაპაზონს გარეთაა დიდი-ობიექტის დესკრიპტორისთვის %d" + +#: 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:424 +#, c-format +msgid "could not open server file \"%s\": %m" +msgstr "სერვერის ფაილის (\"%s\") გახსნის შეცდომა: %m" + +#: libpq/be-fsstubs.c:447 +#, c-format +msgid "could not read server file \"%s\": %m" +msgstr "სერვერის ფაილის (\"%s\") წაკითხვის შეცდომა: %m" + +#: libpq/be-fsstubs.c:506 +#, c-format +msgid "could not create server file \"%s\": %m" +msgstr "სერვერის ფაილის (\"%s\") შექმნის შეცდომა: %m" + +#: libpq/be-fsstubs.c:518 +#, c-format +msgid "could not write server file \"%s\": %m" +msgstr "სერვერის ფაილში (\"%s\") ჩაწერის შეცდომა: %m" + +#: libpq/be-fsstubs.c:758 +#, c-format +msgid "large object read request is too large" +msgstr "დიდი ობიექტის წაკითხვის მოთხოვნა მეტისმეტად დიდია" + +#: 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: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\"" + +#: libpq/be-secure-common.c:93 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძანებიდან \"%s\" წაკითხვის შეცდომა: %m" + +#: libpq/be-secure-common.c:113 +#, c-format +msgid "command \"%s\" failed" +msgstr "ბრძანების (\"%s\") შეცდომა" + +#: libpq/be-secure-common.c:141 +#, c-format +msgid "could not access private key file \"%s\": %m" +msgstr "პირადი გასაღების ფაილთან (%s) წვდომის შეცდომა: %m" + +#: libpq/be-secure-common.c:151 +#, c-format +msgid "private key file \"%s\" is not a regular file" +msgstr "პირადი გასაღების ფაილი \"%s\" ჩვეულებრივი ფაილი არაა" + +#: libpq/be-secure-common.c:177 +#, c-format +msgid "private key file \"%s\" must be owned by the database user or root" +msgstr "პირადი გასაღების ფაილის \"%s\" მფლობელი ბაზის მონაცემთა ბაზის მომხმარებელი ან root უნდა იყოს" + +#: libpq/be-secure-common.c:187 +#, c-format +msgid "private key file \"%s\" has group or world access" +msgstr "პირადი გასაღების ფაილზე \"%s\" ჯგუფისთვის ან დანარჩენი ყველასთვის წვდომა არსებობს" + +#: libpq/be-secure-common.c:189 +#, 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), თუ მფლობელი root-ია." + +#: libpq/be-secure-gssapi.c:204 +msgid "GSSAPI wrap error" +msgstr "GSSAPI -ის გადატანის შეცდომა" + +#: libpq/be-secure-gssapi.c:211 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "გამავალი GSSAPI შეტყობინება კონფიდენციალობას ვერ იყენებს" + +#: 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:351 +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" +msgstr "კლიენტის მიერ გამოგზავნილი GSSAPI-ის პაკეტი ძალიან დიდია (%zu > %zu)" + +#: libpq/be-secure-gssapi.c:389 +msgid "GSSAPI unwrap error" +msgstr "GSSAPI-ის გადატანის მოხსნის შეცდომა" + +#: libpq/be-secure-gssapi.c:396 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "შემომავალი GSSAPI შეტყობინება კონფიდენციალობას ვერ იყენებს" + +#: 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:594 +msgid "could not accept GSSAPI security context" +msgstr "\"GSSAPI\"-ის უსაფრთხოების კონტექსტის მიღების შეცდომა" + +#: libpq/be-secure-gssapi.c:689 +msgid "GSSAPI size check error" +msgstr "GSSAPI-ის ზომის შემოწმების შეცდომა" + +#: libpq/be-secure-openssl.c:122 +#, c-format +msgid "could not create SSL context: %s" +msgstr "შეცდომა SSL კონტექსტის შექმნისას: %s" + +#: 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:168 +#, c-format +msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" +msgstr "პირადი გასაღების ფაილის \"%s\" თავიდან ჩატვირთვა შეუძლებელია, რადგან მას საკვანძო ფრაზა ესაჭიროება" + +#: libpq/be-secure-openssl.c:173 +#, c-format +msgid "could not load private key file \"%s\": %s" +msgstr "პირადი გასაღების ფაილის \"%s\" ჩატვირთვის შეცდომა: %s" + +#: libpq/be-secure-openssl.c:182 +#, 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: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:205 +#, c-format +msgid "could not set minimum SSL protocol version" +msgstr "'SSL' პროტოკოლის ვერსიის მინიმალური მნიშვნელობის დაყენების შეცდომა" + +#: libpq/be-secure-openssl.c:228 +#, c-format +msgid "could not set maximum SSL protocol version" +msgstr "'SSL' პროტოკოლის ვერსიის მაქსიმალური მნიშვნელობის დაყენების შეცდომა" + +#: libpq/be-secure-openssl.c:244 +#, c-format +msgid "could not set SSL protocol version range" +msgstr "'SSL' პროტოკოლის ვერსიის დიაპაზონის დაყენების შეცდომა" + +#: libpq/be-secure-openssl.c:245 +#, c-format +msgid "\"%s\" cannot be higher than \"%s\"" +msgstr "\"%s\"-ი \"%s\"-ზე დიდი ვერ იქნება" + +#: 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:302 +#, c-format +msgid "could not load root certificate file \"%s\": %s" +msgstr "root სერტიფიკატის ფაილის (\"%s\") წაკითხვის შეცდომა: %s" + +#: libpq/be-secure-openssl.c:351 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:359 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:367 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:425 +#, c-format +msgid "could not initialize SSL connection: SSL context not set up" +msgstr "" + +#: libpq/be-secure-openssl.c:436 +#, c-format +msgid "could not initialize SSL connection: %s" +msgstr "\"SSL\" შეერთების ინიციალიზაციის შეცდომა: %s" + +#: libpq/be-secure-openssl.c:444 +#, c-format +msgid "could not set SSL socket: %s" +msgstr "\"SSL\" სოკეტის დაყენების შეცდომა: %s" + +#: libpq/be-secure-openssl.c:499 +#, c-format +msgid "could not accept SSL connection: %m" +msgstr "'SSL' შეერთების მიღების შეცდომა: %m" + +#: 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:542 +#, c-format +msgid "could not accept SSL connection: %s" +msgstr "'SSL' შეერთების მიღების შეცდომა: %s" + +#: 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 "" + +#: 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:607 +#, c-format +msgid "SSL certificate's common name contains embedded null" +msgstr "SSL სერტიფიკატის საერთო სახელი ჩადგმულ ნულოვანს შეიცავს" + +#: libpq/be-secure-openssl.c:647 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "SSL სერტიფიკატის გამორჩეული სახელი ჩადგმულ ნულოვანს შეიცავს" + +#: 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:971 +#, c-format +msgid "could not open DH parameters file \"%s\": %m" +msgstr "dh პარამეტრების ფაილის (\"%s\") გახსნის შეცდომა: %m" + +#: libpq/be-secure-openssl.c:983 +#, c-format +msgid "could not load DH parameters file: %s" +msgstr "dh პარამეტრების ფაილის ჩატვირთვის შეცდომა: %s" + +#: libpq/be-secure-openssl.c:993 +#, c-format +msgid "invalid DH parameters: %s" +msgstr "\"DH\"-ის არასწორ პარამეტრებ: %s" + +#: libpq/be-secure-openssl.c:1002 +#, c-format +msgid "invalid DH parameters: p is not prime" +msgstr "არასწორი DH-ის პარამეტრები: p მარტივი რიცხვი არაა" + +#: libpq/be-secure-openssl.c:1011 +#, c-format +msgid "invalid DH parameters: neither suitable generator or safe prime" +msgstr "" + +#: libpq/be-secure-openssl.c:1172 +#, c-format +msgid "DH: could not load DH parameters" +msgstr "DH: DH-ის პარამეტრების ჩატვირთვის შეცდომა" + +#: 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:1207 +#, c-format +msgid "ECDH: unrecognized curve name: %s" +msgstr "ECDH: მრუდის უცნობი სახელი: %s" + +#: libpq/be-secure-openssl.c:1216 +#, c-format +msgid "ECDH: could not create key" +msgstr "ECDH: გასაღების შექნის შეცდომა" + +#: libpq/be-secure-openssl.c:1244 +msgid "no SSL error reported" +msgstr "შეცდომა SSL-ში არ დაფიქსირებულა" + +#: libpq/be-secure-openssl.c:1248 +#, c-format +msgid "SSL error code %lu" +msgstr "SSL-ის შეცდომის კოდი %lu" + +#: libpq/be-secure-openssl.c:1407 +#, c-format +msgid "could not create BIO" +msgstr "\"BIO\"-ს შექმნის შეცდომა" + +#: libpq/be-secure-openssl.c:1417 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "'ASN1_OBJECT' ტიპის ობიექტისთვის NID-ის მიღება შეუძლებელია" + +#: libpq/be-secure-openssl.c:1425 +#, 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-ის მოულოდნელი გასვლის გამო" + +#: libpq/crypt.c:49 +#, c-format +msgid "Role \"%s\" does not exist." +msgstr "როლი არ არსებობს: \"%s\"." + +#: libpq/crypt.c:59 +#, c-format +msgid "User \"%s\" has no password assigned." +msgstr "მომხმარებელს პაროლი მინიჭებული არ აქვს: %s." + +#: libpq/crypt.c:77 +#, c-format +msgid "User \"%s\" has an expired password." +msgstr "მომხმარებლის პაროლის ვადა გასულია: %s." + +#: 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:202 libpq/crypt.c:244 libpq/crypt.c:264 +#, c-format +msgid "Password does not match for user \"%s\"." +msgstr "პაროლი არ ემთხვევა მომხმარებელს \"%s." + +#: libpq/crypt.c:283 +#, c-format +msgid "Password of user \"%s\" is in unrecognized format." +msgstr "მომხმარებლის (\"%s\") პაროლის უცნობი ფორმატი." + +#: libpq/hba.c:209 +#, c-format +msgid "authentication file token too long, skipping: \"%s\"" +msgstr "ავთენტიკაციის ფაილის კოდი ძალიან გრძელია. გამოტოვება: \"%s\"" + +#: libpq/hba.c:381 +#, c-format +msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" +msgstr "" + +#: libpq/hba.c:832 +#, c-format +msgid "error enumerating network interfaces: %m" +msgstr "ქსელის ინტერფეისების ჩამონათვალის მიღების შეცდომა: %m" + +#. translator: the second %s is a list of auth methods +#: libpq/hba.c:859 +#, c-format +msgid "authentication option \"%s\" is only valid for authentication methods %s" +msgstr "ავთენტიკაციის პარამეტრი \"%s\" მხოლოდ ავთენტიკაციის მეთოდებისთვის %s შეგიძლიათ, გამოიყენოთ" + +#: 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:228 +#, 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:903 +#, c-format +msgid "missing entry in file \"%s\" at end of line %d" +msgstr "" + +#: libpq/hba.c:915 +#, c-format +msgid "multiple values in ident field" +msgstr "ერთზე მეტი მნიშვნელობა ველში ident" + +#: libpq/hba.c:965 +#, c-format +msgid "multiple values specified for connection type" +msgstr "მიერთების ტიპში მითითებულია ერთზე მეტი მნიშვნელობა" + +#: libpq/hba.c:966 +#, c-format +msgid "Specify exactly one connection type per line." +msgstr "ერთ ხაზზე ზუსტად ერთი მიერთების ტიპი უნდა მიუთითოთ." + +#: libpq/hba.c:980 +#, c-format +msgid "local connections are not supported by this build" +msgstr "" + +#: libpq/hba.c:1003 +#, c-format +msgid "hostssl record cannot match because SSL is disabled" +msgstr "hostssl-ის ჩანაწერის დამთხვევა შეუძლებელია, რადგან SSL გათიშულია" + +#: libpq/hba.c:1004 +#, c-format +msgid "Set ssl = on in postgresql.conf." +msgstr "დააყენეთ ssl = on postgresql.conf-ში." + +#: libpq/hba.c:1012 +#, c-format +msgid "hostssl record cannot match because SSL is not supported by this build" +msgstr "hostssl-ის ჩანაწერის დამთხვევა შეუძლებელია, რადგან SSL-ის მხარდაჭერა ამ აგებისას ჩართული არ იყო" + +#: libpq/hba.c:1024 +#, c-format +msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" +msgstr "hostgssenc-ის ჩანაწერის დამთხვევა შეუძლებელია, რადგან GSSAPI -ის მხარდაჭერა ამ აგებისას ჩართული არ იყო" + +#: libpq/hba.c:1044 +#, c-format +msgid "invalid connection type \"%s\"" +msgstr "შეერთების არასწორი ტიპი: %s" + +#: libpq/hba.c:1058 +#, c-format +msgid "end-of-line before database specification" +msgstr "ხაზის-დასასრული ბაზის მითითებამდე" + +#: libpq/hba.c:1078 +#, c-format +msgid "end-of-line before role specification" +msgstr "ხაზის-დასასრული როლის მითითებამდე" + +#: libpq/hba.c:1100 +#, c-format +msgid "end-of-line before IP address specification" +msgstr "ხაზის-დასასრული IP მისამართის მითითებამდე" + +#: libpq/hba.c:1111 +#, c-format +msgid "multiple values specified for host address" +msgstr "მითითებულია ჰოსტის მისამართის ერთზე მეტი მნიშვნელობა" + +#: libpq/hba.c:1112 +#, c-format +msgid "Specify one address range per line." +msgstr "ერთ ხაზზე ერთი მისამართების დიაპაზონი მიუთითეთ." + +#: libpq/hba.c:1170 +#, c-format +msgid "invalid IP address \"%s\": %s" +msgstr "არასწორი IP მისამართი \"%s\": %s" + +#: libpq/hba.c:1190 +#, c-format +msgid "specifying both host name and CIDR mask is invalid: \"%s\"" +msgstr "ორივეს, ჰოსტის სახელის და CIDR-ის ნიღბის მითითება არასწორია: \"%s\"" + +#: libpq/hba.c:1204 +#, c-format +msgid "invalid CIDR mask in address \"%s\"" +msgstr "არასწორი CIDR ნიღაბი მისამართში \"%s\"" + +#: libpq/hba.c:1224 +#, c-format +msgid "end-of-line before netmask specification" +msgstr "ხაზის-დასასრული ქსელური ნიღბის მითითებამდე" + +#: libpq/hba.c:1225 +#, c-format +msgid "Specify an address range in CIDR notation, or provide a separate netmask." +msgstr "" + +#: libpq/hba.c:1236 +#, c-format +msgid "multiple values specified for netmask" +msgstr "მითითებულია ქსელის ნიღბის ერთზე მეტი მნიშვნელობა" + +#: libpq/hba.c:1250 +#, c-format +msgid "invalid IP mask \"%s\": %s" +msgstr "არასწორი IP ნიღაბი \"%s\": %s" + +#: libpq/hba.c:1270 +#, c-format +msgid "IP address and mask do not match" +msgstr "IP მისამართი და ნიღაბი არ ემთხვევა" + +#: libpq/hba.c:1286 +#, c-format +msgid "end-of-line before authentication method" +msgstr "ხაზის-დასასრული ავთენტიკაციის მეთოდამდე" + +#: libpq/hba.c:1297 +#, c-format +msgid "multiple values specified for authentication type" +msgstr "ავთენტიკაციის ტიპში მითითებულია ერთზე მეტი მნიშვნელობა" + +#: libpq/hba.c:1298 +#, c-format +msgid "Specify exactly one authentication type per line." +msgstr "ერთ ხაზზე ზუსტად ერთი ავთენტიკაციის ტიპი უნდა მიუთითოთ." + +#: libpq/hba.c:1375 +#, c-format +msgid "invalid authentication method \"%s\"" +msgstr "არასწორი ავთენტიკაციის მეთოდი \"%s\"" + +#: libpq/hba.c:1388 +#, c-format +msgid "invalid authentication method \"%s\": not supported by this build" +msgstr "არასწორი ავთენტიკაციის მეთოდი \"%s\": მხარდაუჭერელია ამ ვერსიის მიერ" + +#: libpq/hba.c:1411 +#, c-format +msgid "gssapi authentication is not supported on local sockets" +msgstr "gssapi ავთენტიკაცია ლოკალურ სოკეტებზე მხარდაუჭერელია" + +#: libpq/hba.c:1423 +#, c-format +msgid "peer authentication is only supported on local sockets" +msgstr "პარტნიორის ავთენტიკაცია მხოლოდ ლოკალურ სოკეტებზეა მხარდაჭერილი" + +#: libpq/hba.c:1441 +#, c-format +msgid "cert authentication is only supported on hostssl connections" +msgstr "სერტიფიკატით ავთენტიკაცია მხოლოდ hostssl მიერთებებზეა მხარდაჭერილი" + +#: libpq/hba.c:1491 +#, c-format +msgid "authentication option not in name=value format: %s" +msgstr "ავთენტიკაციის პარამეტრი სახელი=მნიშვნელობა ფორმატში არაა: %s" + +#: 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:1546 +#, c-format +msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" +msgstr "ავთენტიკაციის მეთოდს \"ldap\" არგუმენტების \"ldapbasedn\", \"ldapprefix\", ან \"ldapsuffix\" დაყენება სჭირდება" + +#: libpq/hba.c:1562 +#, c-format +msgid "cannot use ldapsearchattribute together with ldapsearchfilter" +msgstr "ldapsearchattribute-ს და ldapsearchfilter-ს ერთად ვერ გამოიყენებთ" + +#: 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 "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: libpq/hba.c:1690 +msgid "ident, peer, gssapi, sspi, and cert" +msgstr "ident, peer, gssapi, sspi, და cert" + +#: libpq/hba.c:1699 +#, c-format +msgid "clientcert can only be configured for \"hostssl\" rows" +msgstr "clientcert-ის მორგება მხოლოდ \"hostssl\" ხაზებისთვის შეგიძლიათ" + +#: libpq/hba.c:1716 +#, c-format +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "\"cert\" ტიპის ავთენტიკაციის გამოყენებისას clientcert-ს მხოლოდ \"verify-full\" შეგიძლიათ, მიუთითოთ" + +#: libpq/hba.c:1729 +#, c-format +msgid "invalid value for clientcert: \"%s\"" +msgstr "invalid value for clientcert: \"%s\"" + +#: libpq/hba.c:1741 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname-ის მორგება მხოლოდ \"hostssl\" ხაზებისთვის შეგიძლიათ" + +#: libpq/hba.c:1760 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "არასწორი მნიშვნელობა კლიენტის სახელისთვის: \"%s\"" + +#: libpq/hba.c:1793 +#, c-format +msgid "could not parse LDAP URL \"%s\": %s" +msgstr "\"LDAP URL\"-ის (%s) დამუშავების შეცდომა: %s" + +#: libpq/hba.c:1804 +#, c-format +msgid "unsupported LDAP URL scheme: %s" +msgstr "\"LDAP URL\"-ის მხარდაუჭერელი სქემა: %s" + +#: libpq/hba.c:1828 +#, c-format +msgid "LDAP URLs not supported on this platform" +msgstr "ამ პლატფორმაზე LDAP URL მხარდაჭერილი არაა" + +#: libpq/hba.c:1846 +#, c-format +msgid "invalid ldapscheme value: \"%s\"" +msgstr "ldapscheme -ის არასწორი მნიშვნელობა: \"%s\"" + +#: libpq/hba.c:1864 +#, c-format +msgid "invalid LDAP port number: \"%s\"" +msgstr "\"LDAP\"-ის პორტის არასწორი ნომერი: %s" + +#: libpq/hba.c:1910 libpq/hba.c:1917 +msgid "gssapi and sspi" +msgstr "gssapi და sspi" + +#: libpq/hba.c:1926 libpq/hba.c:1935 +msgid "sspi" +msgstr "sspi" + +#: libpq/hba.c:1957 +#, c-format +msgid "could not parse RADIUS server list \"%s\"" +msgstr "\"RADIUS\"-ის სერვერების სიის დამუშავება შეუძლებელია: %s" + +#: libpq/hba.c:2005 +#, c-format +msgid "could not parse RADIUS port list \"%s\"" +msgstr "\"RADIUS\"-ის პორტების სიის დამუშავება შეუძლებელია: %s" + +#: libpq/hba.c:2019 +#, c-format +msgid "invalid RADIUS port number: \"%s\"" +msgstr "\"RADIUS\"-ის არასწორი პორტი: \"%s\"" + +#: libpq/hba.c:2041 +#, c-format +msgid "could not parse RADIUS secret list \"%s\"" +msgstr "'RADIUS'-ის საიდუმლოების სიის დამუშავება შეუძლებელია: %s" + +#: libpq/hba.c:2063 +#, c-format +msgid "could not parse RADIUS identifiers list \"%s\"" +msgstr "'RADIUS'-ის იდენტიფიკატორების ჩამონათვალის \"%s\" დამუშავება შეუძლებელია" + +#: libpq/hba.c:2077 +#, c-format +msgid "unrecognized authentication option name: \"%s\"" +msgstr "უცნობი ავთნტიკაციის პარამეტრის სახელი: \"%s\"" + +#: libpq/hba.c:2274 +#, c-format +msgid "configuration file \"%s\" contains no entries" +msgstr "კონფიგურაციის ფაილი \"%s\" ჩანაწერებს არ შეიცავს" + +#: libpq/hba.c:2374 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "არასწორი რეგულარული გამოსახულება (%s): %s" + +#: libpq/hba.c:2437 +#, c-format +msgid "regular expression match for \"%s\" failed: %s" +msgstr "რეგულარული გამოსახულების დამთხვევა \"%s\"-სთვის ჩავარდა: %s" + +#: libpq/hba.c:2456 +#, c-format +msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" +msgstr "" + +#: libpq/hba.c:2552 +#, c-format +msgid "provided user name (%s) and authenticated user name (%s) do not match" +msgstr "" + +#: libpq/hba.c:2572 +#, c-format +msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" +msgstr "" + +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 +#, c-format +msgid "could not open usermap file \"%s\": %m" +msgstr "" + +#: libpq/pqcomm.c:204 +#, c-format +msgid "could not set socket to nonblocking mode: %m" +msgstr "სოკეტის არაბლოკირებული რეჟიმის დაყენების შეცდომა: %m" + +#: 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:383 +#, c-format +msgid "could not translate host name \"%s\", service \"%s\" to address: %s" +msgstr "ჰოსტის სახელის \"%s\" და სერვისის სახელის \"%s\" მისამართში თარგმნა შეუძლებელია: %s" + +#: libpq/pqcomm.c:387 +#, c-format +msgid "could not translate service \"%s\" to address: %s" +msgstr "სერვისის \"%s\" მისამართში თარგმნა შეუძლებელია: %s" + +#: libpq/pqcomm.c:414 +#, c-format +msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" +msgstr "ყველა მოთხოვნილ მისამართზე მიმაგრება შეუძლებელია: MAXLISTEN (%d) გადაცილებულია" + +#: libpq/pqcomm.c:423 +msgid "IPv4" +msgstr "IPv4" + +#: libpq/pqcomm.c:427 +msgid "IPv6" +msgstr "IPv6" + +#: libpq/pqcomm.c:432 +msgid "Unix" +msgstr "Unix" + +#: libpq/pqcomm.c:437 +#, c-format +msgid "unrecognized address family %d" +msgstr "მისამართის არასწორი ოჯახი %d" + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:463 +#, c-format +msgid "could not create %s socket for address \"%s\": %m" +msgstr "%s სოკეტის შექმნის შეცდომა მისამართისთვის \"%s\": %m" + +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 +#, c-format +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:530 +#, c-format +msgid "could not bind %s address \"%s\": %m" +msgstr "%s მისამართზე \"%s\" მიბმის შეცდომა: %m" + +#: libpq/pqcomm.c:534 +#, c-format +msgid "Is another postmaster already running on port %d?" +msgstr "იქნებ პორტზე %d სხვა postmaster პროცესი უკვე უსმენს?" + +#: 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:569 +#, c-format +msgid "could not listen on %s address \"%s\": %m" +msgstr "%s მისამართზე \"%s\" მოსმენა შეუძლებელია: %m" + +#: 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:584 +#, c-format +msgid "listening on %s address \"%s\", port %d" +msgstr "ვუსმენ %s მისამართი \"%s\", პორტი %d" + +#: libpq/pqcomm.c:675 +#, c-format +msgid "group \"%s\" does not exist" +msgstr "ჯგუფი \"%s\" არ არსებობს" + +#: libpq/pqcomm.c:685 +#, c-format +msgid "could not set group of file \"%s\": %m" +msgstr "ფაილის \"%s\" ჯგუფის დაყენება შეუძლებელია: %m" + +#: libpq/pqcomm.c:696 +#, c-format +msgid "could not set permissions of file \"%s\": %m" +msgstr "" + +#: libpq/pqcomm.c:726 +#, c-format +msgid "could not accept new connection: %m" +msgstr "ახალი მიერთების მიღება შეუძლებელია: %m" + +#: 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:972 libpq/pqcomm.c:1068 +#, c-format +msgid "could not receive data from client: %m" +msgstr "კლიენტიდან მონაცემების მიღების შეცდომა: %m" + +#: libpq/pqcomm.c:1173 tcop/postgres.c:4373 +#, c-format +msgid "terminating connection because protocol synchronization was lost" +msgstr "მიერთება შეწყდება, რადგან პროტოკოლის სინქრონიზაცია დაიკარგა" + +#: libpq/pqcomm.c:1239 +#, c-format +msgid "unexpected EOF within message length word" +msgstr "მოულოდნელი EOF შეტყობინების სიგრძის სიტყვაში" + +#: libpq/pqcomm.c:1249 +#, c-format +msgid "invalid message length" +msgstr "შეტყობინების არასწორი სიგრძე" + +#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#, c-format +msgid "incomplete message from client" +msgstr "კლიენტიდან მიღებული შეტყობინება დაუსრულებელია" + +#: 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:1482 utils/adt/rowtypes.c:588 +#, c-format +msgid "insufficient data left in message" +msgstr "შეტყობინებაში დარჩენილი მონაცემები არასაკმარისია" + +#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#, c-format +msgid "invalid string in message" +msgstr "არასწორი სტრიქონი შეტყობინებაში" + +#: libpq/pqformat.c:642 +#, c-format +msgid "invalid message format" +msgstr "არასწორი შეტყობინების ფორმატი" + +#: main/main.c:239 +#, c-format +msgid "%s: WSAStartup failed: %d\n" +msgstr "%s: WSAStartup-ის შეცდომა: %d\n" + +#: main/main.c:350 +#, c-format +msgid "" +"%s is the PostgreSQL server.\n" +"\n" +msgstr "" +"%s PostgreSQL სერვერია.\n" +"\n" + +#: main/main.c:351 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"გამოყენება:\n" +"%s [პარამეტრი]..\n" +"\n" +"\n" + +#: main/main.c:352 +#, c-format +msgid "Options:\n" +msgstr "პარამეტრები:\n" + +#: main/main.c:353 +#, c-format +msgid " -B NBUFFERS number of shared buffers\n" +msgstr " -B NBUFFERS გაზიარებული ბაფერების რაოდენობა\n" + +#: main/main.c:354 +#, c-format +msgid " -c NAME=VALUE set run-time parameter\n" +msgstr " -c სახელი=მნიშვნელობა გაშვებული პროცესის პარამეტრის დაყენება\n" + +#: main/main.c:355 +#, c-format +msgid " -C NAME print value of run-time parameter, then exit\n" +msgstr " -C სახელი გაშვებული პროცესის პარამეტრის გამოტანა და გასვლა\n" + +#: main/main.c:356 +#, c-format +msgid " -d 1-5 debugging level\n" +msgstr " -d 1-5 გამართვის დონე\n" + +#: main/main.c:357 +#, c-format +msgid " -D DATADIR database directory\n" +msgstr " -D DATADIR მონაცემთა ბაზის დირექტორია\n" + +#: main/main.c:358 +#, c-format +msgid " -e use European date input format (DMY)\n" +msgstr " -e ევროპული თარიღის შეყვანის ფორმატის (DMY) გამოყენება\n" + +#: main/main.c:359 +#, c-format +msgid " -F turn fsync off\n" +msgstr " -F fsync-ის გამორთვა\n" + +#: main/main.c:360 +#, c-format +msgid " -h HOSTNAME host name or IP address to listen on\n" +msgstr " -h ჰოსტის სახელი ჰოსტის სახელი ან IP მისამართი, რომელზეც უნდა მოვუსმინო\n" + +#: main/main.c:361 +#, c-format +msgid " -i enable TCP/IP connections\n" +msgstr " -i TCP/IP-ის ჩართვა\n" + +#: main/main.c:362 +#, c-format +msgid " -k DIRECTORY Unix-domain socket location\n" +msgstr " -k საქაღალდე Unix-დომენის სოკეტის მდებარეობა\n" + +#: main/main.c:364 +#, c-format +msgid " -l enable SSL connections\n" +msgstr " -l SSL-ის ჩართვა\n" + +#: main/main.c:366 +#, c-format +msgid " -N MAX-CONNECT maximum number of allowed connections\n" +msgstr " -N მაქს-მიერთ მიერთებების დაშვებული მაქსიმალური რაოდენობა\n" + +#: main/main.c:367 +#, c-format +msgid " -p PORT port number to listen on\n" +msgstr " -p პორტი მოსასმენი პორტის ნომერი\n" + +#: main/main.c:368 +#, c-format +msgid " -s show statistics after each query\n" +msgstr " -s ყოველი მოთხოვნის შემდეგ სტატისტიკსი ჩვენება\n" + +#: main/main.c:369 +#, c-format +msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" +msgstr " -S სამუშ-მეხს დალაგებისთვის გამოყოფილი მეხსიერების დაყენება (კილობაიტებში)\n" + +#: main/main.c:370 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n" + +#: main/main.c:371 +#, c-format +msgid " --NAME=VALUE set run-time parameter\n" +msgstr " --სახელი=მნიშვნელობა გაშვებული პროცესის პარამეტრის დაყენება\n" + +#: main/main.c:372 +#, c-format +msgid " --describe-config describe configuration parameters, then exit\n" +msgstr " --describe-config კონფიგურაციის პარამეტრის ახსნის გამოტანა და გასვლა\n" + +#: main/main.c:373 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n" + +#: main/main.c:375 +#, c-format +msgid "" +"\n" +"Developer options:\n" +msgstr "" +"\n" +"პროგრამისტის პარამეტრები:\n" + +#: main/main.c:376 +#, c-format +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h ზოგიერთი გეგმის ტიპის გამოყენების აკრძალვა\n" + +#: main/main.c:377 +#, c-format +msgid " -n do not reinitialize shared memory after abnormal exit\n" +msgstr "" + +#: main/main.c:378 +#, c-format +msgid " -O allow system table structure changes\n" +msgstr " -O სისტემური ცხრილის სტრუქტურის შეცვლის დაშვება\n" + +#: main/main.c:379 +#, c-format +msgid " -P disable system indexes\n" +msgstr " -P სისტემური ინდექსების გამორთვა\n" + +#: main/main.c:380 +#, c-format +msgid " -t pa|pl|ex show timings after each query\n" +msgstr " -t pa|pl|ex ყოველი მოთხოვნის დროის მნიშვნელობების ჩვენება\n" + +#: main/main.c:381 +#, c-format +msgid " -T send SIGSTOP to all backend processes if one dies\n" +msgstr "" + +#: main/main.c:382 +#, c-format +msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" +msgstr " -W რიცხვი გამმართველისგან მიმაგრებისას მითითებული რაოდენობის წამების დაცდა\n" + +#: main/main.c:384 +#, c-format +msgid "" +"\n" +"Options for single-user mode:\n" +msgstr "" +"\n" +"ერთმომხმარებლიანი რეჟიმის პარამეტრები:\n" + +#: main/main.c:385 +#, c-format +msgid " --single selects single-user mode (must be first argument)\n" +msgstr " --single ერთმომხმარებლიანი რეჟიმი (უნდა იყოს პირველი არგუმენტი)\n" + +#: main/main.c:386 +#, c-format +msgid " DBNAME database name (defaults to user name)\n" +msgstr " DBNAME ბაზის სახელი (ნაგულისხმევი მნიშვნელობა მომხმარებლის სახელია)\n" + +#: main/main.c:387 +#, c-format +msgid " -d 0-5 override debugging level\n" +msgstr " -d 0-5 პროგრამის გამართვის დონის მითითება\n" + +#: main/main.c:388 +#, c-format +msgid " -E echo statement before execution\n" +msgstr " -E ოპერატორის გამოტანა მის შესრულებამდე\n" + +#: main/main.c:389 +#, c-format +msgid " -j do not use newline as interactive query delimiter\n" +msgstr " -j ახალ ხაზზე გადატანა ინტერაქტიური მოთხოვნის გამყოფად გამოყენებული არ იქნება\n" + +#: main/main.c:390 main/main.c:396 +#, c-format +msgid " -r FILENAME send stdout and stderr to given file\n" +msgstr " -r FILENAME stdout-ის და stderr-ის მითითებულ ფაილში გაგზავნა\n" + +#: main/main.c:392 +#, c-format +msgid "" +"\n" +"Options for bootstrapping mode:\n" +msgstr "" +"\n" +"სამუშაოდ მომზადების პარამეტრები\n" + +#: main/main.c:393 +#, c-format +msgid " --boot selects bootstrapping mode (must be first argument)\n" +msgstr " --boot სამუშაოდ მომზადების რეჟიმი (უნდა იყოს პირველი არგუმენტი)\n" + +#: main/main.c:394 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check შემოწმების რეჟიმი (უნდა იყოს პირველი არგუმენტი)\n" + +#: main/main.c:395 +#, c-format +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " DBNAME ბაზის სახელი (აუცილებელი არგუმენტი სამუშაოდ მომზადებისას)\n" + +#: main/main.c:398 +#, c-format +msgid "" +"\n" +"Please read the documentation for the complete list of run-time\n" +"configuration settings and how to set them on the command line or in\n" +"the configuration file.\n" +"\n" +"Report bugs to <%s>.\n" +msgstr "" + +#: main/main.c:402 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s-ის საწყისი გვერდია: <%s>\n" + +#: main/main.c:413 +#, 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" +"possible system security compromise. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" + +#: main/main.c:430 +#, c-format +msgid "%s: real and effective user IDs must match\n" +msgstr "%s: რეალური და მიმდინარე მომხმარებლის ID-ები უნდა ემთხვეოდეს\n" + +#: main/main.c:437 +#, c-format +msgid "" +"Execution of PostgreSQL by a user with administrative permissions is not\n" +"permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromises. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" + +#: nodes/extensible.c:66 +#, c-format +msgid "extensible node type \"%s\" already exists" +msgstr "გაფართოებადი კვანძის ტიპი \"%s\" უკვე არსებობს" + +#: nodes/extensible.c:114 +#, c-format +msgid "ExtensibleNodeMethods \"%s\" was not registered" +msgstr "ExtensibleNodeMethods \"%s\" რეგისტრირებული არ იყო" + +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 +#, 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:2023 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:670 +#, c-format +msgid "could not find array type for data type %s" +msgstr "მონაცემების ტიპისთვის %s მასივის ტიპი ვერ ვიპოვე" + +#: nodes/params.c:417 +#, c-format +msgid "portal \"%s\" with parameters: %s" +msgstr "პორტალი \"%s\" პარამეტრებით: %s" + +#: nodes/params.c:420 +#, c-format +msgid "unnamed portal with parameters: %s" +msgstr "უსახელო პორტალი პარამეტრებით: %s" + +#: optimizer/path/joinrels.c:855 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" +msgstr "" + +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" MERGE-ს ვერ გაუშვებთ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/initsplan.c:1192 +#, c-format +msgid "%s cannot be applied to the nullable side of an outer join" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/planner.c:1344 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 აკრძალულია UNION/INTERSECT/EXCEPT-სთან ერთად" + +#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 +#, c-format +msgid "could not implement GROUP BY" +msgstr "\"GROUP BY\"-ის განხორციელება შეუძლებელია" + +#: optimizer/plan/planner.c:2052 optimizer/plan/planner.c:3708 optimizer/plan/planner.c:4351 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:4350 +#, c-format +msgid "could not implement DISTINCT" +msgstr "\"DISTINCT\"-ის განხორციელება შეუძლებელია" + +#: optimizer/plan/planner.c:5471 +#, c-format +msgid "could not implement window PARTITION BY" +msgstr "ფანჯრის, \"PARTITION BY\" განხორციელება შეუძლებელია" + +#: optimizer/plan/planner.c:5472 +#, c-format +msgid "Window partitioning columns must be of sortable datatypes." +msgstr "ფანჯრის დამყოფი სვეტები დალაგებადი მონაცემის ტიპის უნდა იყოს." + +#: optimizer/plan/planner.c:5476 +#, c-format +msgid "could not implement window ORDER BY" +msgstr "ფანჯრის, \"ORDER BY\" განხორციელება შეუძლებელია" + +#: optimizer/plan/planner.c:5477 +#, c-format +msgid "Window ordering columns must be of sortable datatypes." +msgstr "ფანჯრის დამლაგებელი სვეტები დალაგებადი მონაცემის ტიპის უნდა იყოს." + +#: optimizer/prep/prepunion.c:509 +#, c-format +msgid "could not implement recursive UNION" +msgstr "რეკურსიული UNION_ის განხორციელება შეუძლებელია" + +#: 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:1045 +#, c-format +msgid "could not implement %s" +msgstr "ვერ განხორციელდა %s" + +#: optimizer/util/clauses.c:4777 +#, c-format +msgid "SQL function \"%s\" during inlining" +msgstr "SQL ფუნქცია \"%s\" ხაზში ჩასმისას" + +#: optimizer/util/plancat.c:142 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "ურთიერთობის (\"%s\") გახსნა შეუძლებელია" + +#: optimizer/util/plancat.c:151 +#, c-format +msgid "cannot access temporary or unlogged relations during recovery" +msgstr "აღდგენისას დროებით ან უჟურნალო ურთიერთობებთან წვდომა შეუძლებელია" + +#: optimizer/util/plancat.c:691 +#, c-format +msgid "whole row unique index inference specifications are not supported" +msgstr "" + +#: optimizer/util/plancat.c:708 +#, c-format +msgid "constraint in ON CONFLICT clause has no associated index" +msgstr "შეზღუდვას ON CONFLICT პირობაში ასოცირებული ინდექსი არ გააჩნია" + +#: optimizer/util/plancat.c:758 +#, c-format +msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" +msgstr "ON CONFLICT DO UPDATE გამორიცხვის შეზღუდვებთან ერთად მხარდაჭერილი არაა" + +#: optimizer/util/plancat.c:863 +#, c-format +msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" +msgstr "უნიკალური ან გამორიცხვის შეზღუდვა, რომელიც ON CONFLICT-ის აღწერას ემთხვევა, არ არსებობს" + +#: parser/analyze.c:780 parser/analyze.c:1494 +#, c-format +msgid "VALUES lists must all be the same length" +msgstr "VALUES-ის სიები ყველა ტოლი სიგრძის უნდა იყოს" + +#: parser/analyze.c:981 +#, c-format +msgid "INSERT has more expressions than target columns" +msgstr "INSERT-ს მეტი გამოსახულება გააჩნია, ვიდრე სამიზნე სვეტი" + +#: parser/analyze.c:999 +#, c-format +msgid "INSERT has more target columns than expressions" +msgstr "INSERT-ს მეტი სამიზნე სვეტი გააჩნია, ვიდრე გამოსახულება" + +#: 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 "" + +#: 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:1617 parser/analyze.c:3363 +#, c-format +msgid "%s cannot be applied to VALUES" +msgstr "%s-ს VALUES-ზე ვერ გამოიყენებთ" + +#: parser/analyze.c:1853 +#, c-format +msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" +msgstr "არასწორი UNION/INTERSECT/EXCEPT ORDER BY პირობა" + +#: parser/analyze.c:1854 +#, c-format +msgid "Only result column names can be used, not expressions or functions." +msgstr "" + +#: parser/analyze.c:1855 +#, c-format +msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." +msgstr "" + +#: parser/analyze.c:1960 +#, c-format +msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" +msgstr "" + +#: parser/analyze.c:2032 +#, c-format +msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" +msgstr "" + +#: parser/analyze.c:2119 +#, c-format +msgid "each %s query must have the same number of columns" +msgstr "ყოველ %s მოთხოვნას სვეტების ტოლი რაოდენობა უნდა ჰქონდეს" + +#: parser/analyze.c:2523 +#, c-format +msgid "RETURNING must have at least one column" +msgstr "RETURNING-ს ერთი სვეტი მაინც უნდა ჰქონდეს" + +#: parser/analyze.c:2626 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "მინიჭების წყარომ %d სვეტი დააბრუნა" +msgstr[1] "მინიჭების წყარომ %d სვეტი დააბრუნა" + +#: parser/analyze.c:2687 +#, 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:2811 parser/analyze.c:2819 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "ორივე, %s და %s ერთად მითითება შეუძლებელია" + +#: parser/analyze.c:2839 +#, 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:2847 +#, c-format +msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" +msgstr "DECLARE CURSOR WITH HOLD ... %s მხარდაჭერილი არაა" + +#: parser/analyze.c:2850 +#, 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:2858 +#, 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:2869 +#, c-format +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s არასწორია" + +#: parser/analyze.c:2872 +#, c-format +msgid "Insensitive cursors must be READ ONLY." +msgstr "დამოუკიდებელი კურსორები READ ONLY ტიპის უნდა იყოს." + +#: parser/analyze.c:2938 +#, c-format +msgid "materialized views must not use data-modifying statements in WITH" +msgstr "მატერიალიზებულმა ხედებმა WITH-ში მონაცემების-შემცვლელი გამოსახულებები არ უნდა გამოიყენონ" + +#: parser/analyze.c:2948 +#, c-format +msgid "materialized views must not use temporary tables or views" +msgstr "მატერიალიზებულმა ხედებმა დროებითი ცხრილები ან ხედები არ უნდა გამოიყენონ" + +#: parser/analyze.c:2958 +#, c-format +msgid "materialized views may not be defined using bound parameters" +msgstr "მატერიალიზებული ხედის აღწერა მიმაგრებული პარამეტრების გამოყენებით შეუძლებელია" + +#: parser/analyze.c:2970 +#, c-format +msgid "materialized views cannot be unlogged" +msgstr "მატერიალიზებული ხედების ჟურნალის გამორთვა შეუძლებელია" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3159 +#, 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:3166 +#, 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:3173 +#, 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:3180 +#, 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:3187 +#, 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:3194 +#, 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:3286 +#, c-format +msgid "%s must specify unqualified relation names" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3336 +#, c-format +msgid "%s cannot be applied to a join" +msgstr "%s join-ზე ვერ გადატარდება" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3345 +#, 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:3354 +#, 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:3372 +#, 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:3381 +#, c-format +msgid "%s cannot be applied to a named tuplestore" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3401 +#, c-format +msgid "relation \"%s\" in %s clause not found in FROM clause" +msgstr "" + +#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#, c-format +msgid "could not identify an ordering operator for type %s" +msgstr "ტიპისთვის %s დალაგების ოპერატორის იდენტიფიკაცია შეუძლებელია" + +#: parser/parse_agg.c:222 +#, c-format +msgid "Aggregates with DISTINCT must be able to sort their inputs." +msgstr "DISTINCT-ის მქონე აგრეგატებს შეყვანილი ინფორმაციის დალაგება თვითონ უნდა შეეძლოთ." + +#: parser/parse_agg.c:257 +#, c-format +msgid "GROUPING must have fewer than 32 arguments" +msgstr "GROUPING-ის არგუმენტების რიცხვი 32-ზე ნაკლები უნდა იყოს" + +#: parser/parse_agg.c:360 +msgid "aggregate functions are not allowed in JOIN conditions" +msgstr "აგრეგატულ ფუნქციებს JOIN-ის პირობებში ვერ გამოიყენებთ" + +#: parser/parse_agg.c:362 +msgid "grouping operations are not allowed in JOIN conditions" +msgstr "დაჯგუფების ოპერაციებს JOIN-ის პირობებში ვერ გამოიყენებთ" + +#: parser/parse_agg.c:374 +msgid "aggregate functions are not allowed in FROM clause of their own query level" +msgstr "აგრეგატული ფუნქციები მათი საკუთარი მოთხოვნის დონის FROM პირობაში დაშვებული არაა" + +#: parser/parse_agg.c:376 +msgid "grouping operations are not allowed in FROM clause of their own query level" +msgstr "დაჯგუფების ფუნქციები მათი საკუთარი მოთხოვნის დონის FROM პირობაში დაშვებული არაა" + +#: parser/parse_agg.c:381 +msgid "aggregate functions are not allowed in functions in FROM" +msgstr "აგრეგატულ ფუნქციებს FROM-ში ვერ გამოიყენებთ" + +#: parser/parse_agg.c:383 +msgid "grouping operations are not allowed in functions in FROM" +msgstr "დაჯგუფების ოპერაციებს FROM-ში ვერ გამოიყენებთ" + +#: parser/parse_agg.c:391 +msgid "aggregate functions are not allowed in policy expressions" +msgstr "წესის გამოსახულებებში აგრეგატული ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:393 +msgid "grouping operations are not allowed in policy expressions" +msgstr "წესის გამოსახულებებში დაჯგუფების ოპერაციები დაუშვებელია" + +#: parser/parse_agg.c:410 +msgid "aggregate functions are not allowed in window RANGE" +msgstr "ფანჯრის RANGE-ში აგრეგატული ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:412 +msgid "grouping operations are not allowed in window RANGE" +msgstr "ფანჯრის RANGE-ში დაჯგუფების ოპერაციები დაუშვებელია" + +#: parser/parse_agg.c:417 +msgid "aggregate functions are not allowed in window ROWS" +msgstr "ფანჯრის ROWS-ში აგრეგატული ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:419 +msgid "grouping operations are not allowed in window ROWS" +msgstr "ფანჯრის ROWS_ში დაჯგუფების ოპერაციები დაუშვებელია" + +#: parser/parse_agg.c:424 +msgid "aggregate functions are not allowed in window GROUPS" +msgstr "აგრეგატული ფუნქციები ფანჯრის GROUPS-ში დაშვებული არაა" + +#: parser/parse_agg.c:426 +msgid "grouping operations are not allowed in window GROUPS" +msgstr "დაჯგუფების ფუნქციები ფანჯრის GROUPS-ში დაშვებული არაა" + +#: 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:469 +msgid "grouping operations are not allowed in check constraints" +msgstr "დაჯგუფების ფუნქციები შეზღუდვის შემოწმებებში დაშვებული არაა" + +#: parser/parse_agg.c:476 +msgid "aggregate functions are not allowed in DEFAULT expressions" +msgstr "აგრეგატული ფუნქციები DEFAULT გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:478 +msgid "grouping operations are not allowed in DEFAULT expressions" +msgstr "დაჯგუფების ფუნქციები DEFAULT გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:483 +msgid "aggregate functions are not allowed in index expressions" +msgstr "აგრეგატული ფუნქციები ინდექსის გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:485 +msgid "grouping operations are not allowed in index expressions" +msgstr "დაჯგუფების ფუნქციები ინდექსის გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:490 +msgid "aggregate functions are not allowed in index predicates" +msgstr "აგრეგატული ფუნქციები ინდექსის პრედიკატებში დაშვებული არაა" + +#: parser/parse_agg.c:492 +msgid "grouping operations are not allowed in index predicates" +msgstr "დაშვებული ფუნქციები ინდექსის პრედიკატებში დაშვებული არაა" + +#: 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:506 +msgid "grouping operations are not allowed in transform expressions" +msgstr "დაჯგუფების ფუნქციები გადაყვანის გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:511 +msgid "aggregate functions are not allowed in EXECUTE parameters" +msgstr "აგრეგატული ფუნქციები EXECUTE-ის პარამეტრებში დაშვებული არაა" + +#: parser/parse_agg.c:513 +msgid "grouping operations are not allowed in EXECUTE parameters" +msgstr "დაჯგუფების ფუნქციები EXECUTE-ის პარამეტრებში დაშვებული არაა" + +#: parser/parse_agg.c:518 +msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgstr "აგრეგატული ფუნქციები WHEN-ის ტრიგერის პირობებში დაშვებული არაა" + +#: parser/parse_agg.c:520 +msgid "grouping operations are not allowed in trigger WHEN conditions" +msgstr "დაჯგუფების ფუნქციები WHEN-ის ტრიგერის პირობებში დაშვებული არაა" + +#: parser/parse_agg.c:525 +msgid "aggregate functions are not allowed in partition bound" +msgstr "აგრეგატული ფუნქციები დანაყოფის საზღვარში დაშვებული არაა" + +#: parser/parse_agg.c:527 +msgid "grouping operations are not allowed in partition bound" +msgstr "დაჯგუფების ფუნქციები დანაყოფის საზღვარში დაშვებული არაა" + +#: parser/parse_agg.c:532 +msgid "aggregate functions are not allowed in partition key expressions" +msgstr "აგრეგატული ფუნქციები დანაყოფის გასაღების გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:534 +msgid "grouping operations are not allowed in partition key expressions" +msgstr "დაჯგუფების ფუნქციები დანაყოფის გასაღების გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:540 +msgid "aggregate functions are not allowed in column generation expressions" +msgstr "აგრეგატული ფუნქციები სვეტის გენერაციის გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:542 +msgid "grouping operations are not allowed in column generation expressions" +msgstr "დაჯგუფების ფუნქციები სვეტის გენერაციის გამოსახულებებში დაშვებული არაა" + +#: parser/parse_agg.c:548 +msgid "aggregate functions are not allowed in CALL arguments" +msgstr "აგრეგატული ფუნქციები CALL-ის არგუმენტებში დაშვებული არაა" + +#: parser/parse_agg.c:550 +msgid "grouping operations are not allowed in CALL arguments" +msgstr "დაჯგუფების ფუნქციები CALL-ის არგუმენტებში დაშვებული არაა" + +#: parser/parse_agg.c:556 +msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" +msgstr "აგრეგატული ფუნქციები COPY FROM WHERE პირობებში დაშვებული არაა" + +#: 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:585 parser/parse_clause.c:1836 +#, 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:588 +#, c-format +msgid "grouping operations are not allowed in %s" +msgstr "დაჯგუფების ფუნქციები %s-ში დაშვებული არაა" + +#: 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:767 +#, c-format +msgid "aggregate function calls cannot contain set-returning function calls" +msgstr "აგრეგატული ფუნქციის გამოძახებები არ შეძლება, სეტების დამბრუნებელი ფუნქციის გამოძახებებს შეიცავდეს" + +#: parser/parse_agg.c:768 parser/parse_expr.c:1674 parser/parse_expr.c:2156 parser/parse_func.c:883 +#, c-format +msgid "You might be able to move the set-returning function into a LATERAL FROM item." +msgstr "" + +#: parser/parse_agg.c:773 +#, c-format +msgid "aggregate function calls cannot contain window function calls" +msgstr "აგრეგატული ფუნქციის გამოძახებები არ შეიძლება, ფანჯრის ფუნქციის გამოძახებებს შეიცავდეს" + +#: parser/parse_agg.c:852 +msgid "window functions are not allowed in JOIN conditions" +msgstr "\"JOIN\"-ის პირობებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:859 +msgid "window functions are not allowed in functions in FROM" +msgstr "\"FROM\"-ის ფუნქციებში ფანჯრების ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:865 +msgid "window functions are not allowed in policy expressions" +msgstr "წესების გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:878 +msgid "window functions are not allowed in window definitions" +msgstr "ფანჯრის აღწერებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:889 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "\"MERGE WHEN\" პირობებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:913 +msgid "window functions are not allowed in check constraints" +msgstr "შეზღუდვის შემოწმებაში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:917 +msgid "window functions are not allowed in DEFAULT expressions" +msgstr "ნაგულისხმევ გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:920 +msgid "window functions are not allowed in index expressions" +msgstr "ინდექსის გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:923 +msgid "window functions are not allowed in statistics expressions" +msgstr "სტატისტიკის გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:926 +msgid "window functions are not allowed in index predicates" +msgstr "ინდექსის პრედიკატებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:929 +msgid "window functions are not allowed in transform expressions" +msgstr "გადაყვანის გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:932 +msgid "window functions are not allowed in EXECUTE parameters" +msgstr "\"EXECUTE\"-ის პარამეტრებში ფანჯრის ფუნქციები დაუშვებელია\"" + +#: parser/parse_agg.c:935 +msgid "window functions are not allowed in trigger WHEN conditions" +msgstr "\"WHEN\"-ის პირობების ტრიგერში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:938 +msgid "window functions are not allowed in partition bound" +msgstr "დანაყოფის საზღვარში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:941 +msgid "window functions are not allowed in partition key expressions" +msgstr "დანაყოფის გასაღების გამოსახულებებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:944 +msgid "window functions are not allowed in CALL arguments" +msgstr "\"CALL\"-ის არგუმენტებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:947 +msgid "window functions are not allowed in COPY FROM WHERE conditions" +msgstr "\"COPY FROM WHERE\"-ის პირობებში ფანჯრის ფუნქციები დაუშვებელია" + +#: parser/parse_agg.c:950 +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:973 parser/parse_clause.c:1845 +#, c-format +msgid "window functions are not allowed in %s" +msgstr "ფანჯრის ფუნქციები არ არის დაშვებული %s-ში" + +#: parser/parse_agg.c:1007 parser/parse_clause.c:2678 +#, c-format +msgid "window \"%s\" does not exist" +msgstr "ფანჯარა \"%s\" არ არსებობს" + +#: parser/parse_agg.c:1091 +#, c-format +msgid "too many grouping sets present (maximum 4096)" +msgstr "ძალიან ბევრი დაჯგუფების ნაკრებია (მაქსიმუმ 4096)" + +#: parser/parse_agg.c:1231 +#, c-format +msgid "aggregate functions are not allowed in a recursive query's recursive term" +msgstr "" + +#: parser/parse_agg.c:1424 +#, c-format +msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" +msgstr "" + +#: parser/parse_agg.c:1427 +#, c-format +msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." +msgstr "" + +#: parser/parse_agg.c:1432 +#, c-format +msgid "subquery uses ungrouped column \"%s.%s\" from outer query" +msgstr "ქვემოთხოვნა outer მოთხოვნიდან დაუჯგუფებელ სვეტს \"%s.%s\" იყენებს" + +#: parser/parse_agg.c:1596 +#, c-format +msgid "arguments to GROUPING must be grouping expressions of the associated query level" +msgstr "" + +#: parser/parse_clause.c:192 +#, c-format +msgid "relation \"%s\" cannot be the target of a modifying statement" +msgstr "ურთიერთობა \"%s\" არ შეიძლება, შემცვლელი გამოსახულების სამიზნეს წარმოადგენდეს" + +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 +#, c-format +msgid "set-returning functions must appear at top level of FROM" +msgstr "სეტების დამბრუნებელი ფუნქციები FROM-ის ზედა დონეზე უნდა გამოჩნდნენ" + +#: parser/parse_clause.c:612 +#, c-format +msgid "multiple column definition lists are not allowed for the same function" +msgstr "იგივე ფუნქციისთვის ერთზე მეტი სვეტის აღწერის სიები დაშვებული არაა" + +#: parser/parse_clause.c:645 +#, c-format +msgid "ROWS FROM() with multiple functions cannot have a column definition list" +msgstr "ერთზე მეტი ფუნქციის მქონე ROW FROM ()-ს არ შეიძლება, სვეტის აღწერების სია ჰქონდეს" + +#: parser/parse_clause.c:646 +#, c-format +msgid "Put a separate column definition list for each function inside ROWS FROM()." +msgstr "" + +#: parser/parse_clause.c:652 +#, c-format +msgid "UNNEST() with multiple arguments cannot have a column definition list" +msgstr "" + +#: parser/parse_clause.c:653 +#, c-format +msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." +msgstr "" + +#: parser/parse_clause.c:660 +#, c-format +msgid "WITH ORDINALITY cannot be used with a column definition list" +msgstr "WITH ORDINALITY სვეტების აღწერის სიასთან ერთად არ უნდა გამოიყენოთ" + +#: parser/parse_clause.c:661 +#, c-format +msgid "Put the column definition list inside ROWS FROM()." +msgstr "სვეტის აღწერის სია ROWS FROM()-ის შიგნით გადაიტანეთ." + +#: parser/parse_clause.c:761 +#, c-format +msgid "only one FOR ORDINALITY column is allowed" +msgstr "დაშვებულია მხოლოდ FOR ORDINALITY სვეტი" + +#: parser/parse_clause.c:822 +#, c-format +msgid "column name \"%s\" is not unique" +msgstr "სვეტის სახელი \"%s\" არ არის უნიკალური" + +#: parser/parse_clause.c:864 +#, c-format +msgid "namespace name \"%s\" is not unique" +msgstr "სახელების სივრცის სახელი \"%s\" უნიკალური არაა" + +#: parser/parse_clause.c:874 +#, c-format +msgid "only one default namespace is allowed" +msgstr "დასაშვებია მხოლოდ ერთი ნაგულისხმევი სახელის სივრცე" + +#: parser/parse_clause.c:934 +#, c-format +msgid "tablesample method %s does not exist" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: parser/parse_clause.c:990 +#, c-format +msgid "tablesample method %s does not support REPEATABLE" +msgstr "" + +#: parser/parse_clause.c:1139 +#, c-format +msgid "TABLESAMPLE clause can only be applied to tables and materialized views" +msgstr "" + +#: parser/parse_clause.c:1329 +#, c-format +msgid "column name \"%s\" appears more than once in USING clause" +msgstr "პირობაში USIN სვეტის სახელი \"%s\" ერთზე მეტჯერ გამოჩნდა" + +#: parser/parse_clause.c:1344 +#, c-format +msgid "common column name \"%s\" appears more than once in left table" +msgstr "საერთო სვეტის სახელი \"%s\" ერთხელ, მარცხენა ცხრილში გამოჩნდა" + +#: parser/parse_clause.c:1353 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in left table" +msgstr "სვეტი \"%s\", რომელიც USING პირობაშია მითითებული, მარცხენა ცხრილში არ არსებობს" + +#: parser/parse_clause.c:1368 +#, c-format +msgid "common column name \"%s\" appears more than once in right table" +msgstr "საერთო სვეტის სახელი \"%s\" ერთხელ, მარჯვენა ცხრილში გამოჩნდა" + +#: parser/parse_clause.c:1377 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in right table" +msgstr "სვეტი \"%s\", რომელიც USING პირობაშია მითითებული, მარჯვენა ცხრილში არ არსებობს" + +#: parser/parse_clause.c:1781 +#, c-format +msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" +msgstr "'FETCH FIRST ... WITH TIES' პირობაში მწკრივების რაოდენობა ნულოვანი ვერ იქნება" + +#. translator: %s is name of a SQL construct, eg LIMIT +#: parser/parse_clause.c:1806 +#, 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:1971 +#, 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:1999 +#, 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:2021 +#, c-format +msgid "%s position %d is not in select list" +msgstr "" + +#: parser/parse_clause.c:2460 +#, c-format +msgid "CUBE is limited to 12 elements" +msgstr "CUBE-ის ლიმიტია 12 ელემენტი" + +#: parser/parse_clause.c:2666 +#, c-format +msgid "window \"%s\" is already defined" +msgstr "ფანჯარა \"%s\" უკვე განსაზღვრულია" + +#: parser/parse_clause.c:2727 +#, c-format +msgid "cannot override PARTITION BY clause of window \"%s\"" +msgstr "ფანჯრის \"%s\" 'PARTITION BY' პირობის გადაფარვა შეუძლებელია" + +#: parser/parse_clause.c:2739 +#, c-format +msgid "cannot override ORDER BY clause of window \"%s\"" +msgstr "ფანჯრის \"%s\" 'ORDER BY' პირობის გადაფარვა შეუძლებელია" + +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 +#, c-format +msgid "cannot copy window \"%s\" because it has a frame clause" +msgstr "ფანჯრის \"%s\" კოპირება შეუძლებელია, რადგან მას ჩარჩოს პირობა გააჩნია" + +#: parser/parse_clause.c:2777 +#, c-format +msgid "Omit the parentheses in this OVER clause." +msgstr "" + +#: parser/parse_clause.c:2797 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" +msgstr "PRECEDING/FOLLOWING წანაცვლებების მქონე RANGE-ებს ზუსტად ერთი ORDER BY სვეტი უნდა გქონდეთ" + +#: parser/parse_clause.c:2820 +#, c-format +msgid "GROUPS mode requires an ORDER BY clause" +msgstr "რეჟიმს 'GROUPS' 'ORDER BY' პირობა სჭირდება" + +#: parser/parse_clause.c:2891 +#, c-format +msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" +msgstr "აგრეგატში არგუმენტების სიაში DISTINCT და ORDER BY გამოსახულებების ქონა აუცილებელია" + +#: parser/parse_clause.c:2892 +#, c-format +msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" +msgstr "" + +#: parser/parse_clause.c:2924 +#, c-format +msgid "an aggregate with DISTINCT must have at least one argument" +msgstr "აგრეგატს, რომელსაც DISTINCT აქვს, ერთი არგუმენტი მაინც უნდა ჰქონდეს" + +#: parser/parse_clause.c:2925 +#, c-format +msgid "SELECT DISTINCT must have at least one column" +msgstr "SELECT DISTINCT-ს ერთი სვეტი მაინც უნდა ჰქონდეს" + +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 +#, c-format +msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" +msgstr "SELECT DISTINCT ON ტიპის გამოსახულებები საწყის ORDER BY გამოსახულებებს უნდა ემთხვეოდეს" + +#: parser/parse_clause.c:3101 +#, c-format +msgid "ASC/DESC is not allowed in ON CONFLICT clause" +msgstr "ASC/DESC პირობაზე ON CONFLICT დაშვებული არაა" + +#: parser/parse_clause.c:3107 +#, c-format +msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" +msgstr "NULLS FIRST/LAST პირობაზე ON CONFLICT დაშვებული არაა" + +#: parser/parse_clause.c:3186 +#, c-format +msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" +msgstr "" + +#: parser/parse_clause.c:3187 +#, c-format +msgid "For example, ON CONFLICT (column_name)." +msgstr "მაგალითად, ON CONFLICT (column_name)." + +#: parser/parse_clause.c:3198 +#, c-format +msgid "ON CONFLICT is not supported with system catalog tables" +msgstr "ON CONFLICT სისტემური კატალოგის ცხრილებთან ერთად მხარდაჭერილი არაა" + +#: parser/parse_clause.c:3206 +#, c-format +msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" +msgstr "კატალოგის ცხრილად გამოყენებული ცხრილზე \"%s\" ბრძანება ON CONFLICT მხარდაჭერილი არაა" + +#: parser/parse_clause.c:3336 +#, c-format +msgid "operator %s is not a valid ordering operator" +msgstr "ოპერატორი %s სწორი დამლაგებელი ოპერატორი არაა" + +#: parser/parse_clause.c:3338 +#, c-format +msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." +msgstr "" + +#: parser/parse_clause.c:3649 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" +msgstr "" + +#: parser/parse_clause.c:3655 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3658 +#, c-format +msgid "Cast the offset value to an appropriate type." +msgstr "წანაცვლების მნიშვნელობის დამაკმაყოფილებელ ტიპში დაკასტვა." + +#: parser/parse_clause.c:3663 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3666 +#, c-format +msgid "Cast the offset value to the exact intended type." +msgstr "წანაცვლების მნიშვნელობის ზუსტად განსაზღვრულ ტიპში დაკასტვა." + +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 +#, c-format +msgid "cannot cast type %s to %s" +msgstr "%s ტიპის %s-ში გადაყვანა შეუძლებელია" + +#: parser/parse_coerce.c:1091 +#, c-format +msgid "Input has too few columns." +msgstr "შეყვანას ძალიან ცოტა სვეტი აქვს." + +#: 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: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: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: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:1383 +#, c-format +msgid "%s types %s and %s cannot be matched" +msgstr "%s-ის ტიპები %s და %s არ შეიძლება, ერთმანეთს ემთხვეოდეს" + +#: 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:1551 +#, c-format +msgid "%s could not convert type %s to %s" +msgstr "%s-მა ტიპი %s-დან %s-ში ვერ გადაიყვანა" + +#: 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 "\"%s\"-ად აღწერილი არგუმენტები ყველა ერთნაირი არაა" + +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:601 +#, c-format +msgid "argument declared %s is not an array but type %s" +msgstr "\"%s\"-ად აღწერილი არგუმენტი მასივი არაა, მაგრამ მისი ტიპია %s" + +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:615 +#, c-format +msgid "argument declared %s is not a range type but type %s" +msgstr "\"%s\"-ად აღწერილი არგუმენტი დიაპაზონის მაგიერ არის %s" + +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 +#, 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: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 "" + +#: parser/parse_coerce.c:2474 +#, c-format +msgid "could not determine polymorphic type because input has type %s" +msgstr "" + +#: parser/parse_coerce.c:2488 +#, c-format +msgid "type matched to anynonarray is an array type: %s" +msgstr "ტიპი, რომელიც anytoarray-ს ემთხვევა, მასივის ტიპისაა: %s" + +#: parser/parse_coerce.c:2498 +#, c-format +msgid "type matched to anyenum is not an enum type: %s" +msgstr "ტიპი, რომელიც anytoenum-ს ემთხვევა, ჩამონათვალის ტიპის არაა: %s" + +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "" + +#: 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 "" + +#: parser/parse_coerce.c:2587 +#, c-format +msgid "anycompatiblerange type %s does not match anycompatible type %s" +msgstr "" + +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "" + +#: parser/parse_coerce.c:2622 +#, c-format +msgid "type matched to anycompatiblenonarray is an array type: %s" +msgstr "" + +#: parser/parse_coerce.c:2857 +#, c-format +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "" + +#: parser/parse_coerce.c:2874 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "" + +#: 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 "" + +#: parser/parse_coerce.c:2898 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "" + +#: parser/parse_coerce.c:2928 +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:1005 +#, c-format +msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" +msgstr "" + +#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:1008 +#, c-format +msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." +msgstr "" + +#: parser/parse_collate.c:855 +#, c-format +msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" +msgstr "" + +#: parser/parse_cte.c:46 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" +msgstr "" + +#: parser/parse_cte.c:48 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within a subquery" +msgstr "" + +#: parser/parse_cte.c:50 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within an outer join" +msgstr "" + +#: parser/parse_cte.c:52 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within INTERSECT" +msgstr "" + +#: parser/parse_cte.c:54 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within EXCEPT" +msgstr "" + +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "\"MERGE\"-ი \"WITH\" მოთხოვნაში მხარდაუჭერელია" + +#: parser/parse_cte.c:143 +#, c-format +msgid "WITH query name \"%s\" specified more than once" +msgstr "WITH მოთხოვნის სახელი \"%s\" ერთზე მეტჯერაა მითითებული" + +#: parser/parse_cte.c:314 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "" + +#: parser/parse_cte.c:341 +#, c-format +msgid "WITH clause containing a data-modifying statement must be at the top level" +msgstr "WITH პირობის შემცველი მონაცემების-შემცვლელი გამოსახულება უმაღლეს დონეზე უნდა იიყოს" + +#: parser/parse_cte.c:390 +#, c-format +msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" +msgstr "" + +#: parser/parse_cte.c:396 +#, c-format +msgid "Cast the output of the non-recursive term to the correct type." +msgstr "" + +#: parser/parse_cte.c:401 +#, c-format +msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" +msgstr "" + +#: parser/parse_cte.c:405 +#, c-format +msgid "Use the COLLATE clause to set the collation of the non-recursive term." +msgstr "" + +#: parser/parse_cte.c:426 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH მოთხოვნა რეკურსიული არაა" + +#: parser/parse_cte.c:457 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:462 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:477 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "ძებნის სვეტი \"%s\" WITH მოთხოვნის სვეტების სიაში არაა" + +#: parser/parse_cte.c:484 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "ძებნის სვეტი \"%s\" ერთზე მეტჯერაა მითითებული" + +#: parser/parse_cte.c:493 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:510 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "ციკლის სვეტი \"%s\" WITH მოთხოვნის სვეტების სიაში არაა" + +#: parser/parse_cte.c:517 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "ციკლის სვეტი \"%s\" ერთზემეტჯერაა მითითებული" + +#: parser/parse_cte.c:526 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:533 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:541 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:551 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "" + +#: parser/parse_cte.c:558 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:642 +#, c-format +msgid "WITH query \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_cte.c:822 +#, c-format +msgid "mutual recursion between WITH items is not implemented" +msgstr "\"WITH\"-ის ჩანაწერებს შორის ურთიერთრეკურსია მხარდაჭერილი არაა" + +#: parser/parse_cte.c:874 +#, c-format +msgid "recursive query \"%s\" must not contain data-modifying statements" +msgstr "" + +#: parser/parse_cte.c:882 +#, c-format +msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" +msgstr "" + +#: parser/parse_cte.c:926 +#, c-format +msgid "ORDER BY in a recursive query is not implemented" +msgstr "რეკურსიულ მოთხოვნაში ORDER BY განხორციელებული არაა" + +#: parser/parse_cte.c:932 +#, c-format +msgid "OFFSET in a recursive query is not implemented" +msgstr "რეკურსიულ მოთხოვნაში OFFSET განხორციელებული არაა" + +#: parser/parse_cte.c:938 +#, c-format +msgid "LIMIT in a recursive query is not implemented" +msgstr "რეკურსიულ მოთხოვნაში LIMIT განხორციელებული არაა" + +#: parser/parse_cte.c:944 +#, c-format +msgid "FOR UPDATE/SHARE in a recursive query is not implemented" +msgstr "რეკურსიულ მოთხოვნაში FOR UPDATE/SHARE განხორციელებული არაა" + +#: parser/parse_cte.c:1001 +#, c-format +msgid "recursive reference to query \"%s\" must not appear more than once" +msgstr "" + +#: parser/parse_expr.c:282 +#, c-format +msgid "DEFAULT is not allowed in this context" +msgstr "ამ კონტექსტში ნაგულისხმევს ვერ გამოიყენებთ" + +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 parser/parse_relation.c:3679 +#, c-format +msgid "column %s.%s does not exist" +msgstr "სვეტი %s.%s არ არსებობს" + +#: parser/parse_expr.c:347 +#, c-format +msgid "column \"%s\" not found in data type %s" +msgstr "სვეტი \"%s\" მონაცემის ტიპში %s აღმოჩენილი არაა" + +#: parser/parse_expr.c:353 +#, c-format +msgid "could not identify column \"%s\" in record data type" +msgstr "ჩანაწერის მონაცემის ტიპში სვეტის \"%s\" იდენტიფიკაცია შეუძლებელია" + +#: parser/parse_expr.c:359 +#, c-format +msgid "column notation .%s applied to type %s, which is not a composite type" +msgstr "" + +#: parser/parse_expr.c:390 parser/parse_target.c:739 +#, c-format +msgid "row expansion via \"*\" is not supported here" +msgstr "" + +#: parser/parse_expr.c:512 +msgid "cannot use column reference in DEFAULT expression" +msgstr "" + +#: parser/parse_expr.c:515 +msgid "cannot use column reference in partition bound expression" +msgstr "" + +#: parser/parse_expr.c:784 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:840 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:1040 +#, c-format +msgid "NULLIF requires = operator to yield boolean" +msgstr "" + +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 +#, c-format +msgid "%s must not return a set" +msgstr "%s -მა სეტი არ უნდა დააბრუნოს" + +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 +#, c-format +msgid "number of columns does not match number of values" +msgstr "" + +#: parser/parse_expr.c:1477 +#, c-format +msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" +msgstr "" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 +#, c-format +msgid "set-returning functions are not allowed in %s" +msgstr "%s-ში სეტის-დამბრუნებელი ფუნქციები დაშვებული არაა" + +#: parser/parse_expr.c:1735 +msgid "cannot use subquery in check constraint" +msgstr "შეზღუდვის შემმოწმებელში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1739 +msgid "cannot use subquery in DEFAULT expression" +msgstr "ნაგულისხმევ გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1742 +msgid "cannot use subquery in index expression" +msgstr "ინდექსის გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1745 +msgid "cannot use subquery in index predicate" +msgstr "ინდექსის პრედიკატში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1748 +msgid "cannot use subquery in statistics expression" +msgstr "სტატისტიკის გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1751 +msgid "cannot use subquery in transform expression" +msgstr "გარდაქმნის გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1754 +msgid "cannot use subquery in EXECUTE parameter" +msgstr "პარამეტრში \"EXECUTE\" ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1757 +msgid "cannot use subquery in trigger WHEN condition" +msgstr "\"WHEN\" პირობის ტრიგერში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1760 +msgid "cannot use subquery in partition bound" +msgstr "დანაყოფის საზღვარში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1763 +msgid "cannot use subquery in partition key expression" +msgstr "დანაყოფის გასაღების გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1766 +msgid "cannot use subquery in CALL argument" +msgstr "\"CALL\"-ის არგუმენტში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1769 +msgid "cannot use subquery in COPY FROM WHERE condition" +msgstr "\"COPY FROM WHERE\" პირობაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1772 +msgid "cannot use subquery in column generation expression" +msgstr "სვეტების გენერაციის გამოსახულებაში ქვემოთხოვნას ვერ გამოიყენებთ" + +#: parser/parse_expr.c:1825 +#, c-format +msgid "subquery must return only one column" +msgstr "ქვემოთხოვნამ მხოლოდ ერთი სვეტი უნდა დააბრუნოს" + +#: parser/parse_expr.c:1896 +#, c-format +msgid "subquery has too many columns" +msgstr "ქვემოთხოვნას ძალიან ბევრი სვეტი აქვს" + +#: parser/parse_expr.c:1901 +#, c-format +msgid "subquery has too few columns" +msgstr "ქვემოთხოვნას ძალიან ცოტა სვეტი აქვს" + +#: parser/parse_expr.c:1997 +#, c-format +msgid "cannot determine type of empty array" +msgstr "ცარიელი მასივის ტიპის დადგენა შეუძლებელია" + +#: parser/parse_expr.c:1998 +#, c-format +msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." +msgstr "" + +#: parser/parse_expr.c:2012 +#, c-format +msgid "could not find element type for data type %s" +msgstr "" + +#: parser/parse_expr.c:2095 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "ROW გამოსახულებებს მაქსიმუმ %d ელემენტი შეიძლება ჰქონდეს" + +#: parser/parse_expr.c:2300 +#, c-format +msgid "unnamed XML attribute value must be a column reference" +msgstr "უსახელო XML ატრიბუტის მნიშვნელობა სვეტის მიმართვას უნდა წარმოადგენდეს" + +#: parser/parse_expr.c:2301 +#, c-format +msgid "unnamed XML element value must be a column reference" +msgstr "უსახელო XML ელემენტის მნიშვნელობა სვეტის მიმართვას უნდა წარმოადგენდეს" + +#: parser/parse_expr.c:2316 +#, c-format +msgid "XML attribute name \"%s\" appears more than once" +msgstr "XML ატრიბუტის სახელი \"%s\" ერთზე მეტჯერ გამოჩნდა" + +#: parser/parse_expr.c:2423 +#, c-format +msgid "cannot cast XMLSERIALIZE result to %s" +msgstr "'XMLSERIALIZE'-ის შედეგის %s-ში დაკასტვა შეუძლებელია" + +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 +#, c-format +msgid "unequal number of entries in row expressions" +msgstr "მწკრივის გამოსახულებებში ჩანაწერების რაოდენობა ტოლი არაა" + +#: parser/parse_expr.c:2742 +#, c-format +msgid "cannot compare rows of zero length" +msgstr "ნულოვანი სიგრძის მწკრივების შედარება შეუძლებელია" + +#: parser/parse_expr.c:2767 +#, c-format +msgid "row comparison operator must yield type boolean, not type %s" +msgstr "მწკრივის შედარების ოპერატორმა ლოგიკური მნიშვნელობა უნდა დააბრუნოს და არა ტიპი %s" + +#: parser/parse_expr.c:2774 +#, c-format +msgid "row comparison operator must not return a set" +msgstr "მწკრივის შედარების ოპერატორმა სეტი არ უნდა დააბრუნოს" + +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 +#, c-format +msgid "could not determine interpretation of row comparison operator %s" +msgstr "მწკრივის შედარების ოპერატორის %s ინტერპრეტაციის დადგენა შეუძლებელია" + +#: parser/parse_expr.c:2835 +#, c-format +msgid "Row comparison operators must be associated with btree operator families." +msgstr "მწკრივის შედარების ოპერატორები ბინარული ხის ოპერატორის ოჯახებთან უნდა იყოს ასოცირებული." + +#: parser/parse_expr.c:2876 +#, c-format +msgid "There are multiple equally-plausible candidates." +msgstr "" + +#: parser/parse_expr.c:2969 +#, c-format +msgid "IS DISTINCT FROM requires = operator to yield boolean" +msgstr "IS DISTINCT FROM-ს სჭირდება, რომ ოპერატორი '=' ლოგიკურ მნიშვნელობას აბრუნებდეს" + +#: parser/parse_func.c:194 +#, c-format +msgid "argument name \"%s\" used more than once" +msgstr "არგუმენტის სახელი \"%s\" ერთზე მეტჯერ გამოიყენება" + +#: parser/parse_func.c:205 +#, c-format +msgid "positional argument cannot follow named argument" +msgstr "" + +#: parser/parse_func.c:287 parser/parse_func.c:2369 +#, c-format +msgid "%s is not a procedure" +msgstr "%s არ არის პროცედურა" + +#: parser/parse_func.c:291 +#, c-format +msgid "To call a function, use SELECT." +msgstr "ფუნქციის გამოსაძახებლად გამოიყენეთ SELECT." + +#: parser/parse_func.c:297 +#, c-format +msgid "%s is a procedure" +msgstr "\"%s\" პროცედურაა" + +#: parser/parse_func.c:301 +#, c-format +msgid "To call a procedure, use CALL." +msgstr "პროცედურის გამოსაძახებლად გამოიყენეთ CALL." + +#: parser/parse_func.c:315 +#, c-format +msgid "%s(*) specified, but %s is not an aggregate function" +msgstr "%s(*) მითითებულია, მაგრამ %s აგრეგატული ფუნქცია არაა" + +#: parser/parse_func.c:322 +#, c-format +msgid "DISTINCT specified, but %s is not an aggregate function" +msgstr "DISTINCT მითითებულია, მაგრამ %s აგრეგატული ფუნქცია არაა" + +#: 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:334 +#, c-format +msgid "ORDER BY specified, but %s is not an aggregate function" +msgstr "ORDER BY მითითებულია, მაგრამ %s აგრეგატული ფუნქცია არაა" + +#: parser/parse_func.c:340 +#, c-format +msgid "FILTER specified, but %s is not an aggregate function" +msgstr "FILTER მითითებულია, მაგრამ %s აგრეგატული ფუნქცია არაა" + +#: parser/parse_func.c:346 +#, c-format +msgid "OVER specified, but %s is not a window function nor an aggregate function" +msgstr "" + +#: parser/parse_func.c:384 +#, c-format +msgid "WITHIN GROUP is required for ordered-set aggregate %s" +msgstr "" + +#: parser/parse_func.c:390 +#, c-format +msgid "OVER is not supported for ordered-set aggregate %s" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#: 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] "" +msgstr[1] "" + +#: parser/parse_func.c:514 +#, c-format +msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" +msgstr "" + +#: parser/parse_func.c:527 +#, c-format +msgid "window function %s requires an OVER clause" +msgstr "ფანჯრის ფუნქციას %s პირობა OVER ესაჭიროება" + +#: parser/parse_func.c:534 +#, c-format +msgid "window function %s cannot have WITHIN GROUP" +msgstr "ფანჯრის ფუნქციას '%s' 'WITHIN GROUP' ვერ ექნება" + +#: parser/parse_func.c:563 +#, c-format +msgid "procedure %s is not unique" +msgstr "პროცედურა უნიკალური არაა: %s" + +#: 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:572 +#, c-format +msgid "function %s is not unique" +msgstr "ფუნქცია უნიკალური არაა: %s" + +#: 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: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 "" + +#: parser/parse_func.c:622 parser/parse_func.c:2412 +#, c-format +msgid "procedure %s does not exist" +msgstr "პროცედურა %s არ არსებობს" + +#: 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: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:736 +#, c-format +msgid "VARIADIC argument must be an array" +msgstr "VARIADIC -ის არგუმენტი მასივი უნდა იყოს" + +#: 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:797 +#, c-format +msgid "aggregates cannot return sets" +msgstr "აგრეგატებს სეტების დაბრუნება არ შეუძლიათ" + +#: parser/parse_func.c:812 +#, c-format +msgid "aggregates cannot use named arguments" +msgstr "აგრეგატები სახელიან არგუმენტებს ვერ იყენებენ" + +#: parser/parse_func.c:844 +#, c-format +msgid "DISTINCT is not implemented for window functions" +msgstr "ფანჯრის ფუნქციებისთვის DISTINCT განხორციელებული არაა" + +#: parser/parse_func.c:864 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "ფანჯრის ფუნქციებისთვის აგრეგატული ORDER BY განხორციელებული არაა" + +#: parser/parse_func.c:873 +#, c-format +msgid "FILTER is not implemented for non-aggregate window functions" +msgstr "არააგრეგატული ფანჯრის ფუნქციებისთვის FILTER განხორციელებული არაა" + +#: parser/parse_func.c:882 +#, c-format +msgid "window function calls cannot contain set-returning function calls" +msgstr "ფანჯრის ფუნქციის გამოძახებები არ შეიძლება, სეტების დამბრუნებელი ფუნქციის გამოძახებებს შეიცავდეს" + +#: parser/parse_func.c:890 +#, c-format +msgid "window functions cannot return sets" +msgstr "ფანჯრის ფუნქციებს სეტების დაბრუნება არ შეუძლიათ" + +#: 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:2182 parser/parse_func.c:2459 +#, c-format +msgid "function name \"%s\" is not unique" +msgstr "ფუნქციის სახელი უნიკალური არაა: %s" + +#: 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: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:2359 +#, c-format +msgid "%s is not a function" +msgstr "%s არ არის ფუნქცია" + +#: parser/parse_func.c:2379 +#, c-format +msgid "function %s is not an aggregate" +msgstr "ფუნქცია %s არ არის აგრეგატი" + +#: parser/parse_func.c:2407 +#, c-format +msgid "could not find a procedure named \"%s\"" +msgstr "პროცედურა სახელით \"%s\" არ არსებობს" + +#: parser/parse_func.c:2421 +#, c-format +msgid "could not find an aggregate named \"%s\"" +msgstr "აგრეგატი სახელით \"%s\" არ არსებობს" + +#: parser/parse_func.c:2426 +#, c-format +msgid "aggregate %s(*) does not exist" +msgstr "აგრეგატი %s (*) არ არსებობს" + +#: parser/parse_func.c:2431 +#, c-format +msgid "aggregate %s does not exist" +msgstr "აგრეგატი %s არ არსებობს" + +#: parser/parse_func.c:2467 +#, c-format +msgid "procedure name \"%s\" is not unique" +msgstr "პროცედურის სახელი უნიკალური არაა: %s" + +#: parser/parse_func.c:2470 +#, c-format +msgid "Specify the argument list to select the procedure unambiguously." +msgstr "" + +#: parser/parse_func.c:2475 +#, c-format +msgid "aggregate name \"%s\" is not unique" +msgstr "აგრეგატის სახელი უნიკალური არაა: %s" + +#: parser/parse_func.c:2478 +#, c-format +msgid "Specify the argument list to select the aggregate unambiguously." +msgstr "" + +#: parser/parse_func.c:2483 +#, c-format +msgid "routine name \"%s\" is not unique" +msgstr "ქვეპროგრამის სახელი უნიკალური არაა: %s" + +#: parser/parse_func.c:2486 +#, c-format +msgid "Specify the argument list to select the routine unambiguously." +msgstr "" + +#: parser/parse_func.c:2541 +msgid "set-returning functions are not allowed in JOIN conditions" +msgstr "სეტების დამბრუნებელი ფუნქციების JOIN-ის პირობებში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2562 +msgid "set-returning functions are not allowed in policy expressions" +msgstr "სეტების დამბრუნებელი ფუნქციების წესების გამოსახულების პირობებში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2578 +msgid "set-returning functions are not allowed in window definitions" +msgstr "სეტების დამბრუნებელი ფუნქციების ფანჯრის აღწერებში გამოყენება აკრძალულია" + +#: 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:2623 +msgid "set-returning functions are not allowed in DEFAULT expressions" +msgstr "ფუნქციები, რომლებიც სეტებს აბრუნებენ, DEFAULT გამოსახულებებში არ გამოიყენება" + +#: parser/parse_func.c:2626 +msgid "set-returning functions are not allowed in index expressions" +msgstr "სეტების დამბრუნებელი ფუნქციების ინდექსის გამოსახულებაში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2629 +msgid "set-returning functions are not allowed in index predicates" +msgstr "სეტების დამბრუნებელი ფუნქციების ინდექსის პრედიკატებში გამოყენება აკრძალულია" + +#: 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:2638 +msgid "set-returning functions are not allowed in EXECUTE parameters" +msgstr "სეტების დამბრუნებელი ფუნქციების EXECUTE-ის პარამეტრებში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2641 +msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgstr "სეტების დამბრუნებელი ფუნქციების WHEN-ის ტრიგერში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2644 +msgid "set-returning functions are not allowed in partition bound" +msgstr "სეტების დამბრუნებელი ფუნქციების დანაყოფის საზღვარში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2647 +msgid "set-returning functions are not allowed in partition key expressions" +msgstr "სეტების დამბრუნებელი ფუნქციების დანაყოფის გასაღების გამოსახულებებში გამოყენება აკრძალულია" + +#: parser/parse_func.c:2650 +msgid "set-returning functions are not allowed in CALL arguments" +msgstr "სეტების დამბრუნებელი ფუნქციების CALL-ის არგუმენტებში გამოყენება აკრძალულია" + +#: 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:2656 +msgid "set-returning functions are not allowed in column generation expressions" +msgstr "სეტების დამბრუნებელი ფუნქციების სვეტების გენერაციის გამოსახულებებში გამოყენება აკრძალულია" + +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE გამოსახულებისთვის WITH RECURSIVE მხარდაჭერილი არაა" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "წესების მქონე ურთიერთობებისთვის MERGE მხარდაჭერილი არაა." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "სახელი ერთზე მეტჯერაა მითითებული: %s" + +#: parser/parse_merge.c:210 +#, 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_oper.c:123 parser/parse_oper.c:690 +#, c-format +msgid "postfix operators are not supported" +msgstr "პოსტფიქსური ოპერატორები მხარდაუჭერელია" + +#: 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:229 +#, c-format +msgid "Use an explicit ordering operator or modify the query." +msgstr "გამოიყენეთ აშკარა დალაგების ოპერატორი ან შეცვალეთ მოთხოვნა." + +#: parser/parse_oper.c:485 +#, c-format +msgid "operator requires run-time type coercion: %s" +msgstr "" + +#: parser/parse_oper.c:641 +#, c-format +msgid "operator is not unique: %s" +msgstr "ოპერატორი უნიკალური არაა: %s" + +#: 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: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: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:714 parser/parse_oper.c:828 +#, c-format +msgid "operator is only a shell: %s" +msgstr "ოპერატორი მხოლოდ გარსია: %s" + +#: parser/parse_oper.c:816 +#, c-format +msgid "op ANY/ALL (array) requires array on right side" +msgstr "" + +#: parser/parse_oper.c:858 +#, c-format +msgid "op ANY/ALL (array) requires operator to yield boolean" +msgstr "" + +#: parser/parse_oper.c:863 +#, c-format +msgid "op ANY/ALL (array) requires operator not to return a set" +msgstr "" + +#: parser/parse_param.c:225 +#, c-format +msgid "inconsistent types deduced for parameter $%d" +msgstr "" + +#: 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" +msgstr "" + +#: parser/parse_relation.c:245 +#, c-format +msgid "table reference %u is ambiguous" +msgstr "" + +#: parser/parse_relation.c:445 +#, c-format +msgid "table name \"%s\" specified more than once" +msgstr "" + +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 +#, c-format +msgid "invalid reference to FROM-clause entry for table \"%s\"" +msgstr "" + +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 +#, c-format +msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:480 +#, c-format +msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." +msgstr "" + +#: parser/parse_relation.c:691 +#, c-format +msgid "system column \"%s\" reference in check constraint is invalid" +msgstr "" + +#: parser/parse_relation.c:700 +#, c-format +msgid "cannot use system column \"%s\" in column generation expression" +msgstr "სვეტის გენერაციის გამოსახულებაში სისტემურ სვეტს \"%s\" ვერ გამოიყენებთ" + +#: 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:2357 +#, c-format +msgid "table \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: 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 "" + +#: parser/parse_relation.c:1390 +#, c-format +msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." +msgstr "" + +#: parser/parse_relation.c:1778 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "" + +#: parser/parse_relation.c:1784 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "" + +#: parser/parse_relation.c:1791 +#, c-format +msgid "a column definition list is only allowed for functions returning \"record\"" +msgstr "" + +#: parser/parse_relation.c:1802 +#, c-format +msgid "a column definition list is required for functions returning \"record\"" +msgstr "" + +#: parser/parse_relation.c:1839 +#, c-format +msgid "column definition lists can have at most %d entries" +msgstr "სვეტის აღწერის სიებს მაქსიმუმ %d ჩანაწერი შეიძლება ჰქონდეს" + +#: parser/parse_relation.c:1899 +#, c-format +msgid "function \"%s\" in FROM has unsupported return type %s" +msgstr "" + +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#, c-format +msgid "functions in FROM can return at most %d columns" +msgstr "ფუნქციებს FROM-შ მაქსიმუმ %d სვეტის დაბრუნება შეუძლიათ" + +#: parser/parse_relation.c:2049 +#, c-format +msgid "%s function has %d columns available but %d columns specified" +msgstr "ფუნქციას %s %d სვეტი ჰქონდა ხელმისაწვდომი, მითითებული კი %d" + +#: parser/parse_relation.c:2138 +#, c-format +msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_relation.c:2210 +#, c-format +msgid "joins can have at most %d columns" +msgstr "შეერთებებს მაქსიმუმ %d სვეტი შეიძლება, ჰქონდეთ" + +#: parser/parse_relation.c:2235 +#, c-format +msgid "join expression \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_relation.c:2330 +#, c-format +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "WITH მოთხოვნას \"%s\" RETURNING პირობა არ გააჩნია" + +#: parser/parse_relation.c:3602 +#, c-format +msgid "Perhaps you meant to reference the table alias \"%s\"." +msgstr "" + +#: parser/parse_relation.c:3610 +#, c-format +msgid "missing FROM-clause entry for table \"%s\"" +msgstr "" + +#: parser/parse_relation.c:3662 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "" + +#: parser/parse_relation.c:3664 +#, c-format +msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:3681 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." +msgstr "" + +#: 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:510 +#, c-format +msgid "cannot set an array element to DEFAULT" +msgstr "მასივის ელემენტების DEFAULT-ზე დაყენება შეუძლებელია" + +#: parser/parse_target.c:515 +#, c-format +msgid "cannot set a subfield to DEFAULT" +msgstr "ქვეველის DEFAULT მნიშვნელობის დაყენების შეცდომა" + +#: parser/parse_target.c:589 +#, c-format +msgid "column \"%s\" is of type %s but expression is of type %s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: parser/parse_target.c:877 +#, c-format +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "" + +#: parser/parse_target.c:887 +#, c-format +msgid "subfield \"%s\" is of type %s but expression is of type %s" +msgstr "" + +#: parser/parse_target.c:1323 +#, c-format +msgid "SELECT * with no tables specified is not valid" +msgstr "" + +#: parser/parse_type.c:100 +#, c-format +msgid "improper %%TYPE reference (too few dotted names): %s" +msgstr "" + +#: parser/parse_type.c:122 +#, c-format +msgid "improper %%TYPE reference (too many dotted names): %s" +msgstr "" + +#: parser/parse_type.c:157 +#, c-format +msgid "type reference %s converted to %s" +msgstr "ტიპის მიმართვა %s გადაყვანილია %s-ში" + +#: 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\" მხოლოდ გარსია" + +#: parser/parse_type.c:363 +#, c-format +msgid "type modifier is not allowed for type \"%s\"" +msgstr "ტიპის მოდიფიკატორი ტიპისთვის \"%s\" დაუშვებელია" + +#: parser/parse_type.c:409 +#, c-format +msgid "type modifiers must be simple constants or identifiers" +msgstr "ტიპის მოდიფიკატორების მარტივი შეზღუდვები ან იდენტიფიკატორები უნდა იყოს" + +#: parser/parse_type.c:725 parser/parse_type.c:770 +#, c-format +msgid "invalid type name \"%s\"" +msgstr "ტიპის არასწორი სახელი: \"%s\"" + +#: parser/parse_utilcmd.c:264 +#, c-format +msgid "cannot create partitioned table as inheritance child" +msgstr "" + +#: parser/parse_utilcmd.c:580 +#, c-format +msgid "array of serial is not implemented" +msgstr "სერიალების მასივი განხორციელებული არაა" + +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 parser/parse_utilcmd.c:730 +#, c-format +msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:683 +#, c-format +msgid "multiple default values specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:700 +#, c-format +msgid "identity columns are not supported on typed tables" +msgstr "ტიპიზირებულ ცხრილებზე იდენტიფიკაციის სვეტები მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:704 +#, c-format +msgid "identity columns are not supported on partitions" +msgstr "დანაყოფებზე იდენტიფიკაციის სვეტები მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:713 +#, c-format +msgid "multiple identity specifications for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:743 +#, c-format +msgid "generated columns are not supported on typed tables" +msgstr "ტიპიზირებულ ცხრილებზე გენერირებული სვეტები მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:747 +#, c-format +msgid "generated columns are not supported on partitions" +msgstr "" + +#: parser/parse_utilcmd.c:752 +#, c-format +msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 +#, c-format +msgid "primary key constraints are not supported on foreign tables" +msgstr "ძირითადი გასაღების შეზღუდვები გარე ცხრილებზე მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 +#, c-format +msgid "unique constraints are not supported on foreign tables" +msgstr "გარე ცხრილებზე უნიკალური შეზღუდვები მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:824 +#, c-format +msgid "both default and identity specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:832 +#, c-format +msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:840 +#, c-format +msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:905 +#, c-format +msgid "exclusion constraints are not supported on foreign tables" +msgstr "" + +#: parser/parse_utilcmd.c:911 +#, c-format +msgid "exclusion constraints are not supported on partitioned tables" +msgstr "" + +#: parser/parse_utilcmd.c:976 +#, c-format +msgid "LIKE is not supported for creating foreign tables" +msgstr "გარე ცხრილების შექმნისთვის LIKE მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "პირობაში LIKE ურთიერთობა \"%s\" არასწორია" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 +#, c-format +msgid "Index \"%s\" contains a whole-row table reference." +msgstr "" + +#: parser/parse_utilcmd.c:2252 +#, c-format +msgid "cannot use an existing index in CREATE TABLE" +msgstr "'CREATE TABLE'-ში არსებულ ინდექსს ვერ გამოიყენებთ" + +#: parser/parse_utilcmd.c:2272 +#, c-format +msgid "index \"%s\" is already associated with a constraint" +msgstr "ინდექსი \"%s\" შეზღუდვასთან უკვე ასოცირებულია" + +#: parser/parse_utilcmd.c:2287 +#, c-format +msgid "index \"%s\" is not valid" +msgstr "ინდექსი არასწორია: \"%s\"" + +#: parser/parse_utilcmd.c:2293 +#, c-format +msgid "\"%s\" is not a unique index" +msgstr "\"%s\" უნიკალური ინდექსი არაა" + +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 +#, c-format +msgid "Cannot create a primary key or unique constraint using such an index." +msgstr "" + +#: parser/parse_utilcmd.c:2300 +#, c-format +msgid "index \"%s\" contains expressions" +msgstr "ინდექსი \"%s\" გამოსახულებებს შეიცავს" + +#: parser/parse_utilcmd.c:2307 +#, c-format +msgid "\"%s\" is a partial index" +msgstr "\"%s\" ნაწილობრივი ინდექსია" + +#: parser/parse_utilcmd.c:2319 +#, c-format +msgid "\"%s\" is a deferrable index" +msgstr "\"%s\" გადადებადი ინდექსია" + +#: parser/parse_utilcmd.c:2320 +#, c-format +msgid "Cannot create a non-deferrable constraint using a deferrable index." +msgstr "" + +#: parser/parse_utilcmd.c:2384 +#, c-format +msgid "index \"%s\" column number %d does not have default sorting behavior" +msgstr "" + +#: parser/parse_utilcmd.c:2541 +#, c-format +msgid "column \"%s\" appears twice in primary key constraint" +msgstr "" + +#: parser/parse_utilcmd.c:2547 +#, c-format +msgid "column \"%s\" appears twice in unique constraint" +msgstr "" + +#: parser/parse_utilcmd.c:2894 +#, c-format +msgid "index expressions and predicates can refer only to the table being indexed" +msgstr "" + +#: parser/parse_utilcmd.c:2966 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "" + +#: parser/parse_utilcmd.c:3009 +#, c-format +msgid "rules on materialized views are not supported" +msgstr "მატერიალიზებულ ხედებზე წესები მხარდაჭერილი არაა" + +#: parser/parse_utilcmd.c:3072 +#, c-format +msgid "rule WHERE condition cannot contain references to other relations" +msgstr "" + +#: parser/parse_utilcmd.c:3145 +#, c-format +msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" +msgstr "" + +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 +#, c-format +msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" +msgstr "პირობითი UNION/INTERSECT/EXCEPT ოპერატორები განხორციელებული არაა" + +#: parser/parse_utilcmd.c:3181 +#, c-format +msgid "ON SELECT rule cannot use OLD" +msgstr "ON SELECT წესში OLD-ს ვერ გამოიყენებთ" + +#: parser/parse_utilcmd.c:3185 +#, c-format +msgid "ON SELECT rule cannot use NEW" +msgstr "ON SELECT წესში NEW-ს ვერ გამოიყენებთ" + +#: parser/parse_utilcmd.c:3194 +#, c-format +msgid "ON INSERT rule cannot use OLD" +msgstr "ON INSERT წესში OLD-ს ვერ გამოიყენებთ" + +#: parser/parse_utilcmd.c:3200 +#, c-format +msgid "ON DELETE rule cannot use NEW" +msgstr "ON DELETE წესში NEW-ს ვერ გამოიყენებთ" + +#: parser/parse_utilcmd.c:3228 +#, c-format +msgid "cannot refer to OLD within WITH query" +msgstr "'WITH' მოთხოვნაში OLD-ზე მიმართვა შეუძლებელია" + +#: parser/parse_utilcmd.c:3235 +#, c-format +msgid "cannot refer to NEW within WITH query" +msgstr "'WITH' მოთხოვნაში NEW-ზე მიმართვა შეუძლებელია" + +#: parser/parse_utilcmd.c:3689 +#, c-format +msgid "misplaced DEFERRABLE clause" +msgstr "არასწორ ადგილას დასმული DEFERRABLE პირობა" + +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 +#, c-format +msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" +msgstr "ერთზე მეტი DEFERRABLE/NOT DEFERRABLE პირობა დაშვებული არაა" + +#: parser/parse_utilcmd.c:3704 +#, c-format +msgid "misplaced NOT DEFERRABLE clause" +msgstr "არასწორ ადგილას დასმული NOT DEFERRABLE პირობა" + +#: parser/parse_utilcmd.c:3725 +#, c-format +msgid "misplaced INITIALLY DEFERRED clause" +msgstr "არასწორ ადგილას დასმული INITIALLY DEFERRABLE პირობა" + +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 +#, c-format +msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" +msgstr "ერთზე მეტი INITIALLY IMMEDIATE/DEFERRED დაშვებული არაა" + +#: parser/parse_utilcmd.c:3751 +#, c-format +msgid "misplaced INITIALLY IMMEDIATE clause" +msgstr "არასწორ ადგილას დასმული INITIALLY IMMEDIATE პირობა" + +#: parser/parse_utilcmd.c:3944 +#, c-format +msgid "CREATE specifies a schema (%s) different from the one being created (%s)" +msgstr "" + +#: parser/parse_utilcmd.c:3979 +#, c-format +msgid "\"%s\" is not a partitioned table" +msgstr "\"%s\" დაყოფილი ცხრილი არაა" + +#: parser/parse_utilcmd.c:3986 +#, c-format +msgid "table \"%s\" is not partitioned" +msgstr "ცხრილი \"%s\" დაყოფილი არაა" + +#: parser/parse_utilcmd.c:3993 +#, c-format +msgid "index \"%s\" is not partitioned" +msgstr "ინდექსი \"%s\" დაყოფილი არაა" + +#: parser/parse_utilcmd.c:4033 +#, c-format +msgid "a hash-partitioned table may not have a default partition" +msgstr "" + +#: parser/parse_utilcmd.c:4050 +#, c-format +msgid "invalid bound specification for a hash partition" +msgstr "" + +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 +#, c-format +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "" + +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 +#, c-format +msgid "remainder for hash partition must be less than modulus" +msgstr "" + +#: parser/parse_utilcmd.c:4076 +#, c-format +msgid "invalid bound specification for a list partition" +msgstr "" + +#: parser/parse_utilcmd.c:4129 +#, c-format +msgid "invalid bound specification for a range partition" +msgstr "" + +#: parser/parse_utilcmd.c:4135 +#, c-format +msgid "FROM must specify exactly one value per partitioning column" +msgstr "" + +#: parser/parse_utilcmd.c:4139 +#, c-format +msgid "TO must specify exactly one value per partitioning column" +msgstr "" + +#: parser/parse_utilcmd.c:4253 +#, c-format +msgid "cannot specify NULL in range bound" +msgstr "დიაპაზონის საზღვრებში NULL-ის მითითება შეუძლებელია" + +#: parser/parse_utilcmd.c:4302 +#, c-format +msgid "every bound following MAXVALUE must also be MAXVALUE" +msgstr "ყოველი MAXVALUE საზღვის შემდეგ ყველა MAXVALUE უნდა იყოს" + +#: parser/parse_utilcmd.c:4309 +#, c-format +msgid "every bound following MINVALUE must also be MINVALUE" +msgstr "ყოველი MINVALUE საზღვის შემდეგ ყველა MINVALUE უნდა იყოს" + +#: parser/parse_utilcmd.c:4352 +#, c-format +msgid "specified value cannot be cast to type %s for column \"%s\"" +msgstr "" + +#: parser/parser.c:247 +msgid "UESCAPE must be followed by a simple string literal" +msgstr "" + +#: parser/parser.c:252 +msgid "invalid Unicode escape character" +msgstr "უნიკოდის სპეცკოდის არასწორი სიმბოლო" + +#: parser/parser.c:321 scan.l:1338 +#, c-format +msgid "invalid Unicode escape value" +msgstr "უნიკოდის სპეცკოდის არასწორი მნიშვნელობა" + +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 +#, c-format +msgid "invalid Unicode escape" +msgstr "უნიკოდის არასწორი სპეცკოდი" + +#: parser/parser.c:469 +#, c-format +msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." +msgstr "უნიკოდის სპეცკოდების შესაძლო ვარიანტებია \\XXXX და \\+XXXXXXXX." + +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 utils/adt/varlena.c:6554 +#, c-format +msgid "invalid Unicode surrogate pair" +msgstr "უნკოდის არასწორი სუროგატული წყვილი" + +#: parser/scansup.c:101 +#, c-format +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "" + +#: partitioning/partbounds.c:2933 +#, c-format +msgid "partition \"%s\" conflicts with existing default partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 partitioning/partbounds.c:3026 +#, c-format +msgid "every hash partition modulus must be a factor of the next larger modulus" +msgstr "" + +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "" + +#: partitioning/partbounds.c:3005 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "" + +#: partitioning/partbounds.c:3140 +#, c-format +msgid "empty range bound specified for partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:3142 +#, c-format +msgid "Specified lower bound %s is greater than or equal to upper bound %s." +msgstr "" + +#: partitioning/partbounds.c:3254 +#, c-format +msgid "partition \"%s\" would overlap partition \"%s\"" +msgstr "დანაყოფი \"%s\" გადაფარავდა დანაყოფს \"%s\"" + +#: partitioning/partbounds.c:3371 +#, c-format +msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:4828 +#, c-format +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "" + +#: partitioning/partbounds.c:4852 +#, c-format +msgid "\"%s\" is not a hash partitioned table" +msgstr "\"%s\" ჰეშით დაყოფილი ცხრილია" + +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 +#, c-format +msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" +msgstr "დამყოფი სვეტების რაოდენობა (%d) მოწოდებული დაყოფის გასაღებების რაოდენობას (%d) არ ემთხვევა" + +#: partitioning/partbounds.c:4885 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "" + +#: partitioning/partbounds.c:4917 +#, c-format +msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" +msgstr "" + +#: 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) პოვნა შეუძლებელია: %m" + +#: 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: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: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 "" + +#: 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 "" + +#: 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 "" + +#: 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: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 ბაიტი) PostgreSQL-ის გაზიარებული მეხსიერების გამოყენება, ალბათ shared_buffers-ის ან max_connections-ის შემცირებით." + +#: 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: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: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 "" + +#: port/sysv_sema.c:124 +#, c-format +msgid "could not create semaphores: %m" +msgstr "სემაფორების შექმნის შეცდომა: %m" + +#: port/sysv_sema.c:125 +#, c-format +msgid "Failed system call was semget(%lu, %d, 0%o)." +msgstr "ავარიული სისტემური ფუნქცია იყო semget(%lu, %d, 0%o)." + +#: port/sysv_sema.c:129 +#, c-format +msgid "" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." +msgstr "" + +#: port/sysv_sema.c:159 +#, c-format +msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." +msgstr "" + +#: 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: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: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:165 +#, c-format +msgid "wrote crash dump to file \"%s\"\n" +msgstr "ავარიის დამპი ჩაიწერა ფაილში \"%s\"\n" + +#: 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:206 +#, c-format +msgid "could not create signal listener pipe for PID %d: error code %lu" +msgstr "" + +#: port/win32/signal.c:261 +#, c-format +msgid "could not create signal listener pipe: error code %lu; retrying\n" +msgstr "" + +#: port/win32_sema.c:104 +#, c-format +msgid "could not create semaphore: error code %lu" +msgstr "სემაფორის შექმნა შეუძლებელია. შეცდომის კოდი %lu" + +#: port/win32_sema.c:180 +#, c-format +msgid "could not lock semaphore: error code %lu" +msgstr "სემაფორის დაბლოკვა შეუძლებელია. შეცდომის კოდი %lu" + +#: port/win32_sema.c:200 +#, c-format +msgid "could not unlock semaphore: error code %lu" +msgstr "სემაფორის განბლოკვა შეუძლებელია. შეცდომის კოდი %lu" + +#: port/win32_sema.c:230 +#, c-format +msgid "could not try-lock semaphore: error code %lu" +msgstr "" + +#: 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 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: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:182 +#, c-format +msgid "could not enable user right \"%s\"" +msgstr "მომხმარებლის უფლების ჩართვის შეცდომა: %s" + +#: port/win32_shmem.c:183 +#, c-format +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "" + +#: port/win32_shmem.c:241 +#, c-format +msgid "the processor does not support large pages" +msgstr "პროცესორს დიდი გვერდების მხარდაჭერა არ გააჩნია" + +#: 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 "" + +#: port/win32_shmem.c:311 +#, c-format +msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." +msgstr "" + +#: port/win32_shmem.c:336 +#, c-format +msgid "pre-existing shared memory block is still in use" +msgstr "წინასწარ არსებული გაზიარებული მეხსიერების ბლოკ ჯერ კიდევ გამოიყენება" + +#: 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:347 +#, c-format +msgid "Failed system call was DuplicateHandle." +msgstr "წარუმატებლად გამოძახებული სისტემური ფუნქცია: DuplicateHandle." + +#: port/win32_shmem.c:365 +#, c-format +msgid "Failed system call was MapViewOfFileEx." +msgstr "წარუმატებლად გამოძახებული სისტემური ფუნქცია: MapViewOfFileEx." + +#: postmaster/autovacuum.c:404 +#, c-format +msgid "could not fork autovacuum launcher process: %m" +msgstr "გამშვების პროცესის ავტომომტვერსასრუტების პრობლემა: %m" + +#: 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 "ავტომომტვერსასრუტების დამხმარე პროცესის ფორკის შეცდომა: %m" + +#: postmaster/autovacuum.c:2277 +#, c-format +msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" +msgstr "ავტომომტვერსასრუტება: წაიშლება მიტოვებული დროებითი ცხრილი \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2502 +#, c-format +msgid "automatic vacuum of table \"%s.%s.%s\"" +msgstr "ცხრილის ავტოდამტვერსასრუტება: \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2505 +#, c-format +msgid "automatic analyze of table \"%s.%s.%s\"" +msgstr "ცხრილის ავტოანალიზი: \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2698 +#, c-format +msgid "processing work entry for relation \"%s.%s.%s\"" +msgstr "" + +#: postmaster/autovacuum.c:3309 +#, c-format +msgid "autovacuum not started because of misconfiguration" +msgstr "ავტომომტვერსასრუტება არ გაშვებულა კონფიგურაციის შეცდომის გამო" + +#: postmaster/autovacuum.c:3310 +#, c-format +msgid "Enable the \"track_counts\" option." +msgstr "ჩართეთ \"track_counts\" პარამეტრი." + +#: postmaster/bgworker.c:256 +#, c-format +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "" + +#: postmaster/bgworker.c:666 +#, c-format +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "" + +#: postmaster/bgworker.c:677 +#, c-format +msgid "background worker \"%s\": cannot request database access if starting at postmaster start" +msgstr "" + +#: postmaster/bgworker.c:691 +#, c-format +msgid "background worker \"%s\": invalid restart interval" +msgstr "ფონური დამხმარე პროცესი \"%s\": არასწორი გადატვირთვის ინტერვალი" + +#: postmaster/bgworker.c:706 +#, c-format +msgid "background worker \"%s\": parallel workers may not be configured for restart" +msgstr "" + +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 +#, c-format +msgid "terminating background worker \"%s\" due to administrator command" +msgstr "" + +#: 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:899 +#, c-format +msgid "background worker \"%s\": only dynamic background workers can request notification" +msgstr "ფონური დახმამრე პროცესი \"%s\": გაფრთხილების მოთხოვნა მხოლოდ დინამიკურ ფონურ დამხმარე პროცესებს შეუძლიათ" + +#: postmaster/bgworker.c:914 +#, c-format +msgid "too many background workers" +msgstr "მეტისმეტად ბევრი ფონური დამხმარე პროცესი" + +#: 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] "" +msgstr[1] "" + +#: postmaster/bgworker.c:919 +#, c-format +msgid "Consider increasing the configuration parameter \"max_worker_processes\"." +msgstr "გაითვალისწინეთ, რომ შეიძლება კონფიგურაციის პარამეტრის \"max_worker_processes\" გაზრდა გჭირდებათ." + +#: 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:436 +#, c-format +msgid "Consider increasing the configuration parameter \"max_wal_size\"." +msgstr "გაითვალისწინეთ, რომ შეიძლება კონფიგურაციის პარამეტრის \"max_wal_size\" გაზრდა გჭირდებათ." + +#: postmaster/checkpointer.c:1060 +#, c-format +msgid "checkpoint request failed" +msgstr "საკონტროლო წერტილის მოთხოვნის შეცდომა" + +#: postmaster/checkpointer.c:1061 +#, c-format +msgid "Consult recent messages in the server log for details." +msgstr "დეტალებისთვის იხილეთ სერვერის ჟურნალის უახლესი შეტყობინებები." + +#: postmaster/pgarch.c:423 +#, c-format +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode ჩართულია, მაგრამ დაარქივება ჯერ მორგებული არაა" + +#: postmaster/pgarch.c:445 +#, c-format +msgid "removed orphan archive status file \"%s\"" +msgstr "წაიშალა მიტოვებული არქივის სტატუსის ფაილი \"%s\"" + +#: postmaster/pgarch.c:455 +#, c-format +msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" +msgstr "" + +#: postmaster/pgarch.c:491 +#, c-format +msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" +msgstr "" + +#: postmaster/pgarch.c:798 +#, c-format +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "" + +#: postmaster/pgarch.c:831 +#, c-format +msgid "archive modules have to define the symbol %s" +msgstr "" + +#: postmaster/pgarch.c:837 +#, c-format +msgid "archive modules must register an archive callback" +msgstr "" + +#: postmaster/postmaster.c:744 +#, c-format +msgid "%s: invalid argument for option -f: \"%s\"\n" +msgstr "%s: -f პარამეტრის არასწორი არგუმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:823 +#, c-format +msgid "%s: invalid argument for option -t: \"%s\"\n" +msgstr "%s: -t პარამეტრის არასწორი არგუმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:874 +#, c-format +msgid "%s: invalid argument: \"%s\"\n" +msgstr "%s: არასწორი არგუმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:942 +#, c-format +msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" +msgstr "" + +#: postmaster/postmaster.c:949 +#, c-format +msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" +msgstr "" + +#: postmaster/postmaster.c:952 +#, c-format +msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" +msgstr "" + +#: postmaster/postmaster.c:960 +#, c-format +msgid "%s: invalid datetoken tables, please fix\n" +msgstr "" + +#: postmaster/postmaster.c:1113 +#, c-format +msgid "could not create I/O completion port for child queue" +msgstr "" + +#: postmaster/postmaster.c:1178 +#, c-format +msgid "ending log output to stderr" +msgstr "ჟურნალის stderr-ზე გამოტანის დასრულება" + +#: postmaster/postmaster.c:1179 +#, c-format +msgid "Future log output will go to log destination \"%s\"." +msgstr "" + +#: postmaster/postmaster.c:1190 +#, c-format +msgid "starting %s" +msgstr "\"%s\"-ის გაშვება" + +#: postmaster/postmaster.c:1250 +#, c-format +msgid "could not create listen socket for \"%s\"" +msgstr "მოსმენის სოკეტის შექმნა \"%s\"-სთვის შეუძლებელია" + +#: postmaster/postmaster.c:1256 +#, c-format +msgid "could not create any TCP/IP sockets" +msgstr "\"TCP/IP\" სოკეტების შექმნის შეცდომა" + +#: postmaster/postmaster.c:1288 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister()-ის შეცდომა: შეცდომის კოდი %ld" + +#: postmaster/postmaster.c:1340 +#, c-format +msgid "could not create Unix-domain socket in directory \"%s\"" +msgstr "შეცდომა Unix სოკეტის შექმნისას საქაღალდეში \"%s\"" + +#: postmaster/postmaster.c:1346 +#, c-format +msgid "could not create any Unix-domain sockets" +msgstr "\"Unix-domain\" სოკეტების შექმნის შეცდომა" + +#: postmaster/postmaster.c:1358 +#, c-format +msgid "no socket created for listening" +msgstr "მოსასმენი სოკეტი არ შექმნილა" + +#: postmaster/postmaster.c:1389 +#, c-format +msgid "%s: could not change permissions of external PID file \"%s\": %s\n" +msgstr "%s: გარე PID ფაილის \"%s\" წვდომების შეცვლა შეუძლებელია: %s\n" + +#: postmaster/postmaster.c:1393 +#, c-format +msgid "%s: could not write external PID file \"%s\": %s\n" +msgstr "%s: გარე PID ფაილის ჩაწერის შეცდომა \"%s\": %s\n" + +#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 +#, c-format +msgid "could not load pg_hba.conf" +msgstr "pg_hba.conf -ის ჩატვირთვის სეცდომა" + +#: postmaster/postmaster.c:1446 +#, c-format +msgid "postmaster became multithreaded during startup" +msgstr "პროცესი postmaster გაშვებისას მრავალნაკადიანი გახდა" + +#: postmaster/postmaster.c:1447 +#, c-format +msgid "Set the LC_ALL environment variable to a valid locale." +msgstr "დააყენეთ LC_ALL გარემოს ცვლადი სწორ ლოკალზე." + +#: postmaster/postmaster.c:1548 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: ჩემი საკუთარი გამშვები ფაილის ბილიკის მოძებნა შეუძლებელია" + +#: postmaster/postmaster.c:1555 +#, c-format +msgid "%s: could not locate matching postgres executable" +msgstr "%s: გამშვები ფაილი postgres ვერ ვიპოვე" + +#: 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 "" + +#: postmaster/postmaster.c:1605 +#, c-format +msgid "" +"%s: could not find the database system\n" +"Expected to find it in the directory \"%s\",\n" +"but could not open file \"%s\": %s\n" +msgstr "" + +#: postmaster/postmaster.c:1782 +#, c-format +msgid "select() failed in postmaster: %m" +msgstr "" + +#: postmaster/postmaster.c:1913 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "" + +#: postmaster/postmaster.c:1934 +#, c-format +msgid "performing immediate shutdown because data directory lock file is invalid" +msgstr "" + +#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 +#, c-format +msgid "incomplete startup packet" +msgstr "გაშვების დაუსრულებელი პაკეტი" + +#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 +#, c-format +msgid "invalid length of startup packet" +msgstr "გაშვების პაკეტის არასწორი სიგრძე" + +#: postmaster/postmaster.c:2111 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "შეცდომა SSL მოლაპარაკების პასუხის გაგზავნისას: %m" + +#: postmaster/postmaster.c:2129 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "'SSL'-ის მოთხოვნის შემდეგ მიღებულია დაუშიფრავი მონაცემები" + +#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "" + +#: postmaster/postmaster.c:2155 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "შეცდომა GSSAPI მოლაპარაკების პასუხის გაგზავნისას: %m" + +#: postmaster/postmaster.c:2173 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "'GSSAPI' დაშიფვრის მოთხოვნის შემდეგ მიღებული მონაცემები დაუშიფრავია" + +#: postmaster/postmaster.c:2197 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "" + +#: postmaster/postmaster.c:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11971 utils/misc/guc.c:12012 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "არასწორი მნიშვნელობა პარამეტრისთვის \"%s\": \"%s\"" + +#: postmaster/postmaster.c:2264 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "სწორი მნიშვნელობებია: \"false\", 0, \"true\", 1, \"database\"." + +#: postmaster/postmaster.c:2309 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "" + +#: postmaster/postmaster.c:2326 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "გაშვების პაკეტში PostgreSQL-ის მომხმარებლის სახელი მითითებული არაა" + +#: postmaster/postmaster.c:2390 +#, c-format +msgid "the database system is starting up" +msgstr "მიმდინარეობს მონაცემთა ბაზის სისტემის გაშვება" + +#: postmaster/postmaster.c:2396 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "მონაცემთა ბაზის სისტემა ჯერ მიერთებებს არ იღებს" + +#: postmaster/postmaster.c:2397 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "" + +#: postmaster/postmaster.c:2401 +#, c-format +msgid "the database system is not accepting connections" +msgstr "მონაცემთა ბაზის სისტემა მიერთებებს არ იღებს" + +#: postmaster/postmaster.c:2402 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "ცხელი ლოდინის რეჟიმი გამორთულია." + +#: postmaster/postmaster.c:2407 +#, c-format +msgid "the database system is shutting down" +msgstr "მონაცემთა ბაზის სისტემა ითიშება" + +#: postmaster/postmaster.c:2412 +#, c-format +msgid "the database system is in recovery mode" +msgstr "მონაცემთა ბაზის სისტემა აღდგენის რეჟიმშია" + +#: postmaster/postmaster.c:2417 storage/ipc/procarray.c:493 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 +#, c-format +msgid "sorry, too many clients already" +msgstr "უკაცრავად, უკვე მეტისმეტად ბევრი კლიენტია" + +#: postmaster/postmaster.c:2504 +#, c-format +msgid "wrong key in cancel request for process %d" +msgstr "არასწორი გასაღები გაუქმების მოთხოვნაში პროცესისთვის %d" + +#: postmaster/postmaster.c:2516 +#, c-format +msgid "PID %d in cancel request did not match any process" +msgstr "PID %d, მოთხოვნილი გაუქმების მოთხოვნაში, არც ერთ პროცესს არ ემთხვევა" + +#: postmaster/postmaster.c:2770 +#, c-format +msgid "received SIGHUP, reloading configuration files" +msgstr "მიღებულია SIGHUP, მიმდინარეობს კონფიგურაციის ფაილების თავიდან ჩატვირთვა" + +#. translator: %s is a configuration file +#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2798 +#, c-format +msgid "%s was not reloaded" +msgstr "%s არ გადატვირთულა" + +#: postmaster/postmaster.c:2808 +#, c-format +msgid "SSL configuration was not reloaded" +msgstr "SSL კონფიგურაცია არ იყო გადატვირთული" + +#: postmaster/postmaster.c:2864 +#, c-format +msgid "received smart shutdown request" +msgstr "მიღებულია ჭკვიანი გამორთვის მოთხოვნა" + +#: postmaster/postmaster.c:2905 +#, c-format +msgid "received fast shutdown request" +msgstr "მიღებულია სწრაფი გამორთვის მოთხოვნა" + +#: postmaster/postmaster.c:2923 +#, c-format +msgid "aborting any active transactions" +msgstr "ყველა აქტიური ტრანზაქციის შეწყვეტა" + +#: postmaster/postmaster.c:2947 +#, c-format +msgid "received immediate shutdown request" +msgstr "მიღებულია დაუყოვნებლივი გამორთვის მოთხოვნა" + +#: postmaster/postmaster.c:3024 +#, c-format +msgid "shutdown at recovery target" +msgstr "გამორთვა აღდგენის სამიზნეზე" + +#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 +msgid "startup process" +msgstr "გაშვების პროცესი" + +#: postmaster/postmaster.c:3045 +#, c-format +msgid "aborting startup due to startup process failure" +msgstr "გაშვების გაუქმება გაშვების პროცესის შეცდომის გამო" + +#: postmaster/postmaster.c:3118 +#, c-format +msgid "database system is ready to accept connections" +msgstr "მონაცემთა ბაზის სისტემა მზადაა შეერთებების მისაღებად" + +#: postmaster/postmaster.c:3139 +msgid "background writer process" +msgstr "ფონური ჩამწერი პროცესი" + +#: postmaster/postmaster.c:3186 +msgid "checkpointer process" +msgstr "საკონტროლო წერტილის პროცესი" + +#: postmaster/postmaster.c:3202 +msgid "WAL writer process" +msgstr "WAL-ის ჩამწერი პროცესი" + +#: postmaster/postmaster.c:3217 +msgid "WAL receiver process" +msgstr "WAL-ის მიმღები პროცესი" + +#: postmaster/postmaster.c:3232 +msgid "autovacuum launcher process" +msgstr "ავტომომტვერსასრუტების გამშვები პროცესი" + +#: postmaster/postmaster.c:3250 +msgid "archiver process" +msgstr "არქივის პროცესი" + +#: postmaster/postmaster.c:3263 +msgid "system logger process" +msgstr "სისტემური ჟურნალის პროცესი" + +#: postmaster/postmaster.c:3327 +#, c-format +msgid "background worker \"%s\"" +msgstr "ფონური დამხმარე პროცესი \"%s\"" + +#: postmaster/postmaster.c:3406 postmaster/postmaster.c:3426 postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 +msgid "server process" +msgstr "სერვერის პროცესი" + +#: postmaster/postmaster.c:3505 +#, 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:3742 +#, c-format +msgid "%s (PID %d) exited with exit code %d" +msgstr "%s (PID %d) დასრულდა სტატუსით %d" + +#: postmaster/postmaster.c:3744 postmaster/postmaster.c:3756 postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 +#, 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:3753 +#, c-format +msgid "%s (PID %d) was terminated by exception 0x%X" +msgstr "%s (PID %d) დასრულდა შეცდომის კოდით 0x%X" + +#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "თექვსმეტობითი მნიშვნელობის აღწერისთვის იხილეთ C-ის ჩასასმელი ფაილი \"ntstatus.h\"." + +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3763 +#, 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:3775 +#, c-format +msgid "%s (PID %d) exited with unrecognized status %d" +msgstr "%s (PID %d) დასრულდა უცნობი სტატუსით %d" + +#: postmaster/postmaster.c:3975 +#, c-format +msgid "abnormal database system shutdown" +msgstr "მონაცემთა ბაზის სისტემის არანორმალური გამორთვა" + +#: postmaster/postmaster.c:4001 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "მუშაობის დასრულება გამშვები პროცესის შეცდომის გამო" + +#: postmaster/postmaster.c:4007 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "მუშაობა დასრულდება. restart_after_crash გამორთულია" + +#: postmaster/postmaster.c:4019 +#, c-format +msgid "all server processes terminated; reinitializing" +msgstr "სერვერის ყველა პროცესი დასრულდა; მიმდინარეობს რეინიციალიზაცია" + +#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5519 postmaster/postmaster.c:5917 +#, c-format +msgid "could not generate random cancel key" +msgstr "შემთხვევითი გაუქმების გასაღების გენერაცია შეუძლებელია" + +#: postmaster/postmaster.c:4253 +#, c-format +msgid "could not fork new process for connection: %m" +msgstr "ახალი პროცესის ფორკის შეცდომა შეერთებისთვის: %m" + +#: postmaster/postmaster.c:4295 +msgid "could not fork new process for connection: " +msgstr "ახალი პროცესის ფორკის შეცდომა შეერთებისთვის: " + +#: postmaster/postmaster.c:4401 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "შემოსული დაკავშირება: ჰოსტი=%s პორტი=%s" + +#: postmaster/postmaster.c:4406 +#, c-format +msgid "connection received: host=%s" +msgstr "შემოსული დაკავშირება: ჰოსტი=%s" + +#: postmaster/postmaster.c:4643 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "სერვერის პროცესის (\"%s\") შესრულების შეცდომა: %m" + +#: postmaster/postmaster.c:4701 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "უკანაბოლოს პარამეტრის ფაილის მიბმის შექმნის შეცდომა. შეცდომის კოდი: %lu" + +#: postmaster/postmaster.c:4710 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "უკანაბოლოს პარამეტრის მეხსიერების მიმაგრების პრობლემა: შეცდომის კოდი %lu" + +#: postmaster/postmaster.c:4737 +#, c-format +msgid "subprocess command line too long" +msgstr "ქვეპროექტების ბრძანების სტრიქონი ძალიან გრძელია" + +#: postmaster/postmaster.c:4755 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "გამოძახების შეცდომა: CreateProcess(): %m (შეცდომის კოდი %lu)" + +#: postmaster/postmaster.c:4782 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "უკანაბოლოს პარამეტრის ფაილის ხედის მოხსნის შეცდომა. შეცდომის კოდი: %lu" + +#: postmaster/postmaster.c:4786 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "უკანაბოლოს პარამეტრის ფაილის დამმუშავების დახურვა შეუძლებელია. შეცდომის კოდი: %lu" + +#: postmaster/postmaster.c:4808 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "გაზიარებული მეხსიერების გამოყოფის მეტისმეტად ბევრი ცდის შემდეგ შევეშვი ცდას" + +#: postmaster/postmaster.c:4809 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "ეს შეიძლება გამოწვეული იყოს ASLR ან ანტივირუსული პროგრამული უზრუნველყოფის მიერ." + +#: postmaster/postmaster.c:4982 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "SSL კონფიგურაციის შვილეულ პროცესში შეტვირთვის შეცდომა" + +#: postmaster/postmaster.c:5107 +#, c-format +msgid "Please report this to <%s>." +msgstr "გთხოვთ, შეატყობინოთ <%s>." + +#: postmaster/postmaster.c:5179 +#, c-format +msgid "database system is ready to accept read-only connections" +msgstr "მონაცემთა ბაზის სისტემა მზადაა მხოლოდ-კითხვადი შეერთებების მისაღებად" + +#: postmaster/postmaster.c:5443 +#, c-format +msgid "could not fork startup process: %m" +msgstr "გამშვები პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5447 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "არქივატორის პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5451 +#, c-format +msgid "could not fork background writer process: %m" +msgstr "ფონური ჩამწერის პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5455 +#, c-format +msgid "could not fork checkpointer process: %m" +msgstr "საკონტროლო წერტილების პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5459 +#, c-format +msgid "could not fork WAL writer process: %m" +msgstr "\"WAL\" -ის ჩამწერი პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5463 +#, c-format +msgid "could not fork WAL receiver process: %m" +msgstr "\"WAL\"-ის მიმღების პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5467 +#, c-format +msgid "could not fork process: %m" +msgstr "პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5668 postmaster/postmaster.c:5695 +#, c-format +msgid "database connection requirement not indicated during registration" +msgstr "" + +#: postmaster/postmaster.c:5679 postmaster/postmaster.c:5706 +#, c-format +msgid "invalid processing mode in background worker" +msgstr "არასწორი დამუშავების რეჟიმი ფონურ დამხმარე პროცესში" + +#: postmaster/postmaster.c:5791 +#, c-format +msgid "could not fork worker process: %m" +msgstr "დამხმარე პროცესის ფორკის შეცდომა: %m" + +#: postmaster/postmaster.c:5903 +#, c-format +msgid "no slot available for new worker process" +msgstr "ახალი დამხმარე პროცესისთვის სლოტები ხელმიუწვდომელია" + +#: postmaster/postmaster.c:6234 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "" + +#: postmaster/postmaster.c:6266 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "მემკვიდრეობით მიღებული სოკეტის შექმნა შეუძლებელია: შეცდომის კოდი %d\n" + +#: postmaster/postmaster.c:6295 +#, c-format +msgid "could not open backend variables file \"%s\": %s\n" +msgstr "უკანაბოლოს ცვლადების ფაილის \"%s\" გახსნა შეუძლებელია: %s\n" + +#: postmaster/postmaster.c:6302 +#, c-format +msgid "could not read from backend variables file \"%s\": %s\n" +msgstr "უკანაბოლოს ცვლადების ფაილიდან \"%s\" წაკითხვა შეუძლებელია: %s\n" + +#: postmaster/postmaster.c:6311 +#, c-format +msgid "could not remove file \"%s\": %s\n" +msgstr "ფაილის წაშლის შეცდომა \"%s\": %s\n" + +#: postmaster/postmaster.c:6328 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "უკანაბოლოს ცვლადების ხედის მიბმა შეუძლებელია: შეცდომის კოდი %lu\n" + +#: postmaster/postmaster.c:6337 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "უკანაბოლოს ცვლადების ხედის მოხსნა შეუძლებელია: შეცდომის კოდი %lu\n" + +#: postmaster/postmaster.c:6344 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "უკანაბოლოს პარამეტრის ცვლადების დამმუშავებლის დახურვა შეუძლებელია. შეცდომის კოდი: %lu\n" + +#: postmaster/postmaster.c:6503 +#, c-format +msgid "could not read exit code for process\n" +msgstr "პროცესის გამოსვლის კოდის წაკითხვის შეცდომა\n" + +#: postmaster/postmaster.c:6545 +#, c-format +msgid "could not post child completion status\n" +msgstr "შვილეული პროცესის დასრულების სტატუსის წაკითხვის შეცდომა\n" + +#: postmaster/shell_archive.c:123 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "არქივაციის ბრძანების შეცდომა. შეცდომის კოდი: %d" + +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 +#, c-format +msgid "The failed archive command was: %s" +msgstr "არქივირების წარუმატებლად გაშვებული ბრძანება იყო: %s" + +#: postmaster/shell_archive.c:132 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "არქივაციის ბრძანება დასრულდა გამონაკლისით 0x%X" + +#: postmaster/shell_archive.c:139 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "არქივაციის ბრძანება დასრულდა სიგნალით %d: %s" + +#: postmaster/shell_archive.c:148 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "არქივის ბრძანება უცნობი სტატუსით დასრულდა: %d" + +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#, c-format +msgid "could not read from logger pipe: %m" +msgstr "ჟურნალის ფაიფიდან წაკითხვა შეუძლებელია: %m" + +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#, c-format +msgid "could not create pipe for syslog: %m" +msgstr "სისტემური ჟურნალისთვის ფაიფის შექმნა შეუძლებელია: %m" + +#: postmaster/syslogger.c:677 +#, c-format +msgid "could not fork system logger: %m" +msgstr "სისტემის ჟურნალის ფორკის შეცდომა: %m" + +#: postmaster/syslogger.c:713 +#, c-format +msgid "redirecting log output to logging collector process" +msgstr "ჟურნალის გამოტანის გადამისამართება ჟურნალის შემგროვებლის პროცესისკენ" + +#: postmaster/syslogger.c:714 +#, c-format +msgid "Future log output will appear in directory \"%s\"." +msgstr "" + +#: postmaster/syslogger.c:722 +#, c-format +msgid "could not redirect stdout: %m" +msgstr "stdout-ის გადამისამართების შეცდომა: %m" + +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#, c-format +msgid "could not redirect stderr: %m" +msgstr "stderr-ის გადამისამართების შეცდომა: %m" + +#: postmaster/syslogger.c:1177 +#, c-format +msgid "could not write to log file: %s\n" +msgstr "ჟურნალის ფაილში ჩაწერის შეცდომა: %s\n" + +#: postmaster/syslogger.c:1295 +#, c-format +msgid "could not open log file \"%s\": %m" +msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m" + +#: postmaster/syslogger.c:1385 +#, c-format +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "" + +#: 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:265 +#, c-format +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "" + +#: repl_gram.y:303 repl_gram.y:335 +#, c-format +msgid "invalid timeline %u" +msgstr "დროის არასწორი ხაზი: %u" + +#: repl_scanner.l:142 +msgid "invalid streaming start location" +msgstr "ნაკადის დასაწყისის არასწორი მდებარეობა" + +#: repl_scanner.l:199 scan.l:724 +msgid "unterminated quoted string" +msgstr "ბრჭყალებში ჩასმული ციტატის დაუსრულებელი სტრიქონი" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 +#, c-format +msgid "could not clear search path: %s" +msgstr "ძებნის ბილიკების გასუფთავების შეცდომა: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 +#, c-format +msgid "invalid connection string syntax: %s" +msgstr "შეერთების სტრიქონის არასწორი სინტაქსი: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 +#, c-format +msgid "could not parse connection string: %s" +msgstr "შეერთების სტრიქონის დამუშავების შეცდომა: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#, c-format +msgid "could not receive database system identifier and timeline ID from the primary server: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:384 replication/libpqwalreceiver/libpqwalreceiver.c:622 +#, c-format +msgid "invalid response from primary server" +msgstr "ძირითადი სერვერის არასწორი პასუხი" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:385 +#, c-format +msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:465 replication/libpqwalreceiver/libpqwalreceiver.c:472 replication/libpqwalreceiver/libpqwalreceiver.c:502 +#, c-format +msgid "could not start WAL streaming: %s" +msgstr "wal ნაკადის დაწყების შეცდომა: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:526 +#, c-format +msgid "could not send end-of-streaming message to primary: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:549 +#, c-format +msgid "unexpected result set after end-of-streaming" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:564 +#, c-format +msgid "error while shutting down streaming COPY: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:574 +#, c-format +msgid "error reading result of streaming command: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:583 replication/libpqwalreceiver/libpqwalreceiver.c:821 +#, c-format +msgid "unexpected result after CommandComplete: %s" +msgstr "მოულოდნელი შედეგი CommandComplete-ის შემდეგ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:610 +#, c-format +msgid "could not receive timeline history file from the primary server: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#, c-format +msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:784 replication/libpqwalreceiver/libpqwalreceiver.c:837 replication/libpqwalreceiver/libpqwalreceiver.c:844 +#, c-format +msgid "could not receive data from WAL stream: %s" +msgstr "\"WAL\" ნაკადიდან მონაცემების მიღების შეცდომა: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:864 +#, c-format +msgid "could not send data to WAL stream: %s" +msgstr "'WAL' ნაკადისთვის მონაცემების გაგზავნა შეუძლებელია: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:956 +#, c-format +msgid "could not create replication slot \"%s\": %s" +msgstr "რეპლიკაციის სლოტის \"%s\" შექმნის შეცდომა: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 +#, c-format +msgid "invalid query response" +msgstr "მოთხოვნის არასწორი პასუხი" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#, c-format +msgid "Expected %d fields, got %d fields." +msgstr "მოველოდი %d ველს. მივიღე %d." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 +#, c-format +msgid "the query interface requires a database connection" +msgstr "მოთხოვნის ინტერფეისს ბაზასთან მიერთება სჭირდება" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 +msgid "empty query" +msgstr "ცარიელი მოთხოვნა" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 +msgid "unexpected pipeline mode" +msgstr "არხის მოულოდნელი რეჟიმი" + +#: replication/logical/launcher.c:285 +#, c-format +msgid "cannot start logical replication workers when max_replication_slots = 0" +msgstr "" + +#: replication/logical/launcher.c:365 +#, c-format +msgid "out of logical replication worker slots" +msgstr "ლოგიკური რეპლიკაციის დამხმარე პროგრამის სლოტები არასაკმარისია" + +#: replication/logical/launcher.c:366 +#, c-format +msgid "You might need to increase max_logical_replication_workers." +msgstr "" + +#: replication/logical/launcher.c:422 +#, c-format +msgid "out of background worker slots" +msgstr "ფონური დამხმარე პროცესების სლოტები არასაკმარისია" + +#: replication/logical/launcher.c:423 +#, c-format +msgid "You might need to increase max_worker_processes." +msgstr "" + +#: replication/logical/launcher.c:577 +#, c-format +msgid "logical replication worker slot %d is empty, cannot attach" +msgstr "" + +#: replication/logical/launcher.c:586 +#, c-format +msgid "logical replication worker slot %d is already used by another worker, cannot attach" +msgstr "" + +#: replication/logical/logical.c:115 +#, c-format +msgid "logical decoding requires wal_level >= logical" +msgstr "ლოგიკურ გაშიფვრას wal_level >= logical ესაჭიროება" + +#: replication/logical/logical.c:120 +#, c-format +msgid "logical decoding requires a database connection" +msgstr "ლოგიკურ გაშიფვრას ბაზასთან მიერთება ესაჭიროება" + +#: replication/logical/logical.c:138 +#, c-format +msgid "logical decoding cannot be used while in recovery" +msgstr "" + +#: 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:353 replication/logical/logical.c:507 +#, c-format +msgid "replication slot \"%s\" was not created in this database" +msgstr "რეპლიკაციის სლოტი \"%s\" ამ ბაზაში არ შექმნილა" + +#: replication/logical/logical.c:360 +#, c-format +msgid "cannot create logical replication slot in transaction that has performed writes" +msgstr "შეუძლებელია ლოგიკური რეპლიკაციის სლოტის შექმნა ტრანზაქციაში, რომელიც ჩაწერებს ახორციელებს" + +#: replication/logical/logical.c:570 +#, c-format +msgid "starting logical decoding for slot \"%s\"" +msgstr "იწყება ლოგიკური გაშიფვრა სლოტისთვის \"%s\"" + +#: replication/logical/logical.c:572 +#, c-format +msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." +msgstr "" + +#: replication/logical/logical.c:720 +#, c-format +msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" +msgstr "" + +#: replication/logical/logical.c:726 +#, c-format +msgid "slot \"%s\", output plugin \"%s\", in the %s callback" +msgstr "" + +#: replication/logical/logical.c:897 replication/logical/logical.c:942 replication/logical/logical.c:987 replication/logical/logical.c:1033 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "" + +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 replication/logical/logical.c:1355 replication/logical/logical.c:1441 replication/logical/logical.c:1490 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "" + +#: replication/logical/logical.c:1400 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "" + +#: replication/logical/logicalfuncs.c:126 +#, c-format +msgid "slot name must not be null" +msgstr "სლოტის სახელი ნულოვანი ვერ იქნება" + +#: replication/logical/logicalfuncs.c:142 +#, c-format +msgid "options array must not be null" +msgstr "პარამეტრების მასივი ნულოვანი ვერ იქნება" + +#: replication/logical/logicalfuncs.c:159 +#, c-format +msgid "array must be one-dimensional" +msgstr "მასივი ერთგანზომილებიანი უნდა იყოს" + +#: replication/logical/logicalfuncs.c:165 +#, c-format +msgid "array must not contain nulls" +msgstr "მასივი ნულოვან მნიშვნელობებს არ უნდა შეიცავდეს" + +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 utils/adt/jsonb.c:1302 +#, c-format +msgid "array must have even number of elements" +msgstr "მასივს ლუწი რაოდენობის ელემენტები უნდა ჰქონდეს" + +#: replication/logical/logicalfuncs.c:227 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "რეპლიკაციის სლოტიდან \"%s\" ცვლილებების მიღება უკვე შეუძლებელია" + +#: 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 "" + +#: replication/logical/logicalfuncs.c:241 +#, c-format +msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" +msgstr "" + +#: replication/logical/origin.c:189 +#, c-format +msgid "cannot query or manipulate replication origin when max_replication_slots = 0" +msgstr "" + +#: replication/logical/origin.c:194 +#, c-format +msgid "cannot manipulate replication origins during recovery" +msgstr "აღდგენისა რეპლიკაციის წყაროებს ვერ შეცვლით" + +#: replication/logical/origin.c:228 +#, c-format +msgid "replication origin \"%s\" does not exist" +msgstr "რეპლიკაციის წყარო \"%s\" არ არსებობს" + +#: replication/logical/origin.c:319 +#, c-format +msgid "could not find free replication origin ID" +msgstr "თავისუფალი რეპლიკაციის წყაროს ID-ის პოვნა შეუძლებელია" + +#: replication/logical/origin.c:355 +#, c-format +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "რეპლიკაციის წყაროს, ID-ით %d გადაგდების შეცდომა. გამოიყენება PID-ის მიერ %d" + +#: replication/logical/origin.c:476 +#, c-format +msgid "replication origin with ID %d does not exist" +msgstr "რეპლიკაციის წყარო ID-ით %d არ არსებობს" + +#: replication/logical/origin.c:741 +#, c-format +msgid "replication checkpoint has wrong magic %u instead of %u" +msgstr "" + +#: replication/logical/origin.c:782 +#, c-format +msgid "could not find free replication state, increase max_replication_slots" +msgstr "" + +#: replication/logical/origin.c:790 +#, c-format +msgid "recovered replication state of node %d to %X/%X" +msgstr "აღდგენილია კვანძის %d რეპლიკაციის მდგომარეობა %X/%X-მდე" + +#: replication/logical/origin.c:800 +#, c-format +msgid "replication slot checkpoint has wrong checksum %u, expected %u" +msgstr "" + +#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#, c-format +msgid "replication origin with ID %d is already active for PID %d" +msgstr "რეპლიკაციის წყარო ID-ით %d უკვე აქტიურია PID-სთვის %d" + +#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#, c-format +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "" + +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 replication/slot.c:1947 +#, c-format +msgid "Increase max_replication_slots and try again." +msgstr "გაზარდეთ max_replication_slots-ის მნიშვნელობა და თავიდან სცადეთ." + +#: replication/logical/origin.c:1088 +#, c-format +msgid "cannot setup replication origin when one is already setup" +msgstr "რეპლიკაციის წყაროს მორგება მაშინ, როცა ის უკვე მორგებულია, შეუძლებელია" + +#: 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:1251 +#, c-format +msgid "replication origin name \"%s\" is reserved" +msgstr "რეპლიკაციის წყაროს სახელი \"%s\" დაცულია" + +#: replication/logical/origin.c:1253 +#, c-format +msgid "Origin names starting with \"pg_\" are reserved." +msgstr "" + +#: replication/logical/relation.c:234 +#, c-format +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] "" +msgstr[1] "" + +#: replication/logical/relation.c:298 +#, c-format +msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" +msgstr "" + +#: replication/logical/relation.c:390 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "" + +#: replication/logical/reorderbuffer.c:3841 +#, c-format +msgid "could not write to data file for XID %u: %m" +msgstr "შეცდომა მონაცემის ფაილში ჩაწერისას XID-სთვის %u: %m" + +#: replication/logical/reorderbuffer.c:4187 replication/logical/reorderbuffer.c:4212 +#, c-format +msgid "could not read from reorderbuffer spill file: %m" +msgstr "" + +#: replication/logical/reorderbuffer.c:4191 replication/logical/reorderbuffer.c:4216 +#, c-format +msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" +msgstr "" + +#: replication/logical/reorderbuffer.c:4466 +#, c-format +msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" +msgstr "" + +#: replication/logical/reorderbuffer.c:4965 +#, c-format +msgid "could not read from file \"%s\": read %d instead of %d bytes" +msgstr "" + +#: replication/logical/snapbuild.c:634 +#, c-format +msgid "initial slot snapshot too large" +msgstr "საწყისი სლოტის სწრაფი ასლი ძალიან დიდია" + +#: replication/logical/snapbuild.c:688 +#, 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] "" +msgstr[1] "" + +#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 replication/logical/snapbuild.c:2003 +#, c-format +msgid "logical decoding found consistent point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1369 +#, c-format +msgid "There are no running transactions." +msgstr "გაშვებული ტრანზაქციების გარეშე." + +#: replication/logical/snapbuild.c:1425 +#, c-format +msgid "logical decoding found initial starting point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1427 replication/logical/snapbuild.c:1451 +#, c-format +msgid "Waiting for transactions (approximately %d) older than %u to end." +msgstr "" + +#: replication/logical/snapbuild.c:1449 +#, c-format +msgid "logical decoding found initial consistent point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1476 +#, c-format +msgid "There are no old transactions anymore." +msgstr "ძველი ტრანზაქციები აღარ დარჩა." + +#: replication/logical/snapbuild.c:1871 +#, c-format +msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" +msgstr "" + +#: replication/logical/snapbuild.c:1877 +#, c-format +msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" +msgstr "" + +#: replication/logical/snapbuild.c:1948 +#, c-format +msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" +msgstr "" + +#: replication/logical/snapbuild.c:2005 +#, c-format +msgid "Logical decoding will begin using saved snapshot." +msgstr "ლოგიკური გაშიფვრა შენახული სწრაფი ასლის გამოყენებას დაიწყებს." + +#: replication/logical/snapbuild.c:2077 +#, c-format +msgid "could not parse file name \"%s\"" +msgstr "ფაილის სახელის დამუშავების შეცდომა: \"%s\"" + +#: replication/logical/tablesync.c:151 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" +msgstr "" + +#: 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 "" + +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 +#, c-format +msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:738 +#, c-format +msgid "table \"%s.%s\" not found on publisher" +msgstr "ცხრილი \"%s.%s\" გამომცემელზე ნაპოვნი არაა" + +#: replication/logical/tablesync.c:795 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:974 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:1111 +#, c-format +msgid "could not start initial contents copy for table \"%s.%s\": %s" +msgstr "" + +#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" + +#: replication/logical/tablesync.c:1338 +#, c-format +msgid "table copy could not start transaction on publisher: %s" +msgstr "ცხრილის კოპირებამ ვერ გაუშვა ტრანზაქცია გამომცემელზე: %s" + +#: replication/logical/tablesync.c:1380 +#, c-format +msgid "replication origin \"%s\" already exists" +msgstr "რეპლიკაციის წყარო \"%s\" უკვე არსებობს" + +#: replication/logical/tablesync.c:1393 +#, c-format +msgid "table copy could not finish transaction on publisher: %s" +msgstr "ცხრილის კოპირებამ ვერ დაასრულა ტრანზაქცია გამომცემელზე: %s" + +#: replication/logical/worker.c:671 replication/logical/worker.c:786 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "" + +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 +#, c-format +msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" +msgstr "შეკუმშული ფაილის (\"%s\") წაკითხვის შეცდომა: წაკითხულია %zu %zu-დან" + +#: replication/logical/worker.c:1761 +#, c-format +msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" +msgstr "" + +#: replication/logical/worker.c:1768 +#, 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 "" + +#: replication/logical/worker.c:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "არასწორი ლოგიკური რეპლიკაციის შეტყობინების ტიპი \"??? (%d)\"" + +#: replication/logical/worker.c:2746 +#, c-format +msgid "data stream from publisher has ended" +msgstr "გამომცემლის მონაცემების ნაკადი დასრულდა" + +#: replication/logical/worker.c:2897 +#, c-format +msgid "terminating logical replication worker due to timeout" +msgstr "ლოგიკური რეპლიკაციის დამხმარე პროცესის შეწყვეტა მოლოდინის ვადის ამოწურვის გამო" + +#: replication/logical/worker.c:3059 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "" + +#: replication/logical/worker.c:3070 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "" + +#: replication/logical/worker.c:3096 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgstr "" + +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 +#, c-format +msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" +msgstr "შეკუმშული ფაილის (\"%s\") წაკითხვის შეცდომა: წაკითხულია %zu ბაიტი %zu-დან" + +#: replication/logical/worker.c:3645 +#, c-format +msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +msgstr "" + +#: replication/logical/worker.c:3657 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "" + +#: replication/logical/worker.c:3675 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" +msgstr "" + +#: replication/logical/worker.c:3679 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "გაეშვა ლოგიკური რეპლიკაციის გადატარების დამხმარე პროცესი გამოწერისთვის \"%s\"" + +#: replication/logical/worker.c:3720 +#, c-format +msgid "subscription has no replication slot set" +msgstr "გამოწერას რეპლიკაციის სლოტი დაყენებული არ აქვს" + +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "გამოწერა \"%s\" გაითიშა შეცდომის გამო" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "ლოგიკური რეპლიკაცია იწყებს ტრანზაქციის გამოტოვებას მისამართზე LSN %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "ლოგიკურმა რეპლიკაციამ დაასრულა ტრანზაქციის გამოტოვება მისამართზე LSN %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "skip-LSN გამოწერისთვის \"%s\" გასუფთავებულია" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "" + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/pgoutput/pgoutput.c:319 +#, c-format +msgid "invalid proto_version" +msgstr "არასწორი proto_version" + +#: replication/pgoutput/pgoutput.c:324 +#, c-format +msgid "proto_version \"%s\" out of range" +msgstr "proto_version \"%s\" დიაპაზონს გარეთაა" + +#: replication/pgoutput/pgoutput.c:341 +#, c-format +msgid "invalid publication_names syntax" +msgstr "არასწორი publication_names syntax" + +#: replication/pgoutput/pgoutput.c:426 +#, c-format +msgid "client sent proto_version=%d but we only support protocol %d or lower" +msgstr "" + +#: replication/pgoutput/pgoutput.c:432 +#, c-format +msgid "client sent proto_version=%d but we only support protocol %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:438 +#, c-format +msgid "publication_names parameter missing" +msgstr "აკლა პარამეტრი publication_names" + +#: replication/pgoutput/pgoutput.c:451 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:456 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "" + +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "" + +#: replication/slot.c:205 +#, c-format +msgid "replication slot name \"%s\" is too short" +msgstr "რეპლიკაციის სლოტის სახელი \"%s\" ძალიან მოკლეა" + +#: replication/slot.c:214 +#, c-format +msgid "replication slot name \"%s\" is too long" +msgstr "რეპლიკაციის სლოტის სახელი \"%s\" ძალიან გრძელია" + +#: replication/slot.c:227 +#, c-format +msgid "replication slot name \"%s\" contains invalid character" +msgstr "რეპლიკაციის სლოტის სახელი \"%s\" არასწორ სიმბოლოს შეიცავს" + +#: replication/slot.c:229 +#, c-format +msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." +msgstr "" + +#: replication/slot.c:283 +#, c-format +msgid "replication slot \"%s\" already exists" +msgstr "რეპლიკაციის სლოტი \"%s\" უკვე არსებობს" + +#: replication/slot.c:293 +#, c-format +msgid "all replication slots are in use" +msgstr "ყველა რეპლიკაციის სლოტი გამოიყენება" + +#: replication/slot.c:294 +#, c-format +msgid "Free one or increase max_replication_slots." +msgstr "გაათავისუფლეთ ერთი მაინც ან გაზარდეთ max_replication_slots." + +#: replication/slot.c:472 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:518 replication/slot.c:1093 +#, c-format +msgid "replication slot \"%s\" is active for PID %d" +msgstr "რეპლიკაციის სლოტი (%s) აქტიურია PID-ისთვის %d" + +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 +#, c-format +msgid "could not remove directory \"%s\"" +msgstr "საქაღალდის (\"%s\") წაშლის შეცდომა" + +#: replication/slot.c:1128 +#, c-format +msgid "replication slots can only be used if max_replication_slots > 0" +msgstr "რეპლიკაციის სლოტების გამოყენება შესაძლებელია მხოლოდ როცა max_replication_slots > 0" + +#: replication/slot.c:1133 +#, c-format +msgid "replication slots can only be used if wal_level >= replica" +msgstr "რეპლიკაციის სლოტების გამოყენება შესაძლებელია მხოლოდ როცა wal_level >= replica" + +#: replication/slot.c:1145 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "რეპლიკაციის სლოტების შექმნისთვის ზემომხმარებლის ან რეპლიკაციის წვდომებია საჭირო" + +#: replication/slot.c:1330 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "რეპლიკაციის სლოტის (%2$s) გასათავისუფლებლად მოხდება პროცესის მოკვლა: %1$d" + +#: replication/slot.c:1368 +#, c-format +msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" +msgstr "" + +#: replication/slot.c:1820 +#, c-format +msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" +msgstr "რეპლიკაციის სლოტის (%s) ფაილის არასწორი მაგიური რიცხვი: %u (უნდა იყოს %u)" + +#: replication/slot.c:1827 +#, c-format +msgid "replication slot file \"%s\" has unsupported version %u" +msgstr "რეპლიკაციის სლოტის ფაილის (%s) მხარდაუჭერელი ვერსია %u" + +#: replication/slot.c:1834 +#, c-format +msgid "replication slot file \"%s\" has corrupted length %u" +msgstr "რეპლიკაციის სლოტის ფაილის (%s) დაზიანებული სიგრძე: %u" + +#: replication/slot.c:1870 +#, c-format +msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" +msgstr "" + +#: replication/slot.c:1904 +#, c-format +msgid "logical replication slot \"%s\" exists, but wal_level < logical" +msgstr "ლოგიკური რეპლიკაციის სლოტი\"%s\" აარსებობს, მაგრამ wal_level < logical" + +#: replication/slot.c:1906 +#, c-format +msgid "Change wal_level to be logical or higher." +msgstr "შეცვალეთ wal_level ლოგიკურზე ან უფრო მაღალზე." + +#: replication/slot.c:1910 +#, c-format +msgid "physical replication slot \"%s\" exists, but wal_level < replica" +msgstr "ფიზიკური რეპლიკაციის სლოტი\"%s\" აარსებობს, მაგრამ wal_level < replica" + +#: replication/slot.c:1912 +#, c-format +msgid "Change wal_level to be replica or higher." +msgstr "შეცვალეთ wal_level replica-ზე ან ზემოთ." + +#: replication/slot.c:1946 +#, c-format +msgid "too many replication slots active before shutdown" +msgstr "გამორთვამდე მეტისმეტად ბევრი რეპლიკაციის სლოტი იყო აქტიური" + +#: replication/slotfuncs.c:592 +#, c-format +msgid "invalid target WAL LSN" +msgstr "არასწორი სამიზნე WAL LSN" + +#: replication/slotfuncs.c:614 +#, c-format +msgid "replication slot \"%s\" cannot be advanced" +msgstr "რეპლიკაციის სლოტის (%s) წინ წაწევა შეუძლებელია" + +#: replication/slotfuncs.c:632 +#, c-format +msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" +msgstr "" + +#: replication/slotfuncs.c:739 +#, c-format +msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" +msgstr "ფიზიკური რეპლიკაციის სლოტის (%s) ლოგიკურ სლოტად კოპირება შეუძლებელია" + +#: replication/slotfuncs.c:741 +#, c-format +msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" +msgstr "ლოგიკური რეპლიკაციის სლოტის (%s) ფიზიკურ სლოტად კოპირება შეუძლებელია" + +#: replication/slotfuncs.c:748 +#, c-format +msgid "cannot copy a replication slot that doesn't reserve WAL" +msgstr "რეპლიკაციის სლოტის, რომელიც WAL რეზერვაციას არ აკეთებს, კოპირება შეუძლებელია" + +#: replication/slotfuncs.c:825 +#, c-format +msgid "could not copy replication slot \"%s\"" +msgstr "რეპლიკაციის სლოტის კოპირების შეცდომა: %s" + +#: replication/slotfuncs.c:827 +#, c-format +msgid "The source replication slot was modified incompatibly during the copy operation." +msgstr "კოპირების ოპერაციისას საწყისი რეპლიკაციის სლოტი შეუთავსებლად შეიცვალა." + +#: replication/slotfuncs.c:833 +#, c-format +msgid "cannot copy unfinished logical replication slot \"%s\"" +msgstr "დაუმთავრებელი ლოგიკური რეპლიკაციის სლოტის კოპირება შეუძლებელია: %s" + +#: replication/slotfuncs.c:835 +#, c-format +msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." +msgstr "" + +#: replication/syncrep.c:268 +#, c-format +msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" +msgstr "" + +#: 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:285 +#, c-format +msgid "canceling wait for synchronous replication due to user request" +msgstr "სინქრონული რეპლიკაციის მოლოდინის გაუქმება მომხმარებლის მოთხოვნის გამო" + +#: replication/syncrep.c:494 +#, c-format +msgid "standby \"%s\" is now a synchronous standby with priority %u" +msgstr "" + +#: replication/syncrep.c:498 +#, c-format +msgid "standby \"%s\" is now a candidate for quorum synchronous standby" +msgstr "" + +#: replication/syncrep.c:1045 +#, c-format +msgid "synchronous_standby_names parser failed" +msgstr "synchronous_standby_names -ოს დამმუშავებლის შეცდომა" + +#: replication/syncrep.c:1051 +#, c-format +msgid "number of synchronous standbys (%d) must be greater than zero" +msgstr "სინქრონული მომლოდინეების რაოდენობა (%d) ნულზე მეტი უნდა იყოს" + +#: replication/walreceiver.c:164 +#, c-format +msgid "terminating walreceiver process due to administrator command" +msgstr "walreceiver პროგრამის შეწყვეტა ადმინისტრატორის ბრძანების გამო" + +#: replication/walreceiver.c:292 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "შეუძლებელია მიერთება ძირითად სერვერთან: %s" + +#: replication/walreceiver.c:339 +#, c-format +msgid "database system identifier differs between the primary and standby" +msgstr "ბაზის სისტემის იდენტიფიკატორი განსხვავდება ძირითადსა და მომლოდინეს შორის" + +#: 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:351 +#, c-format +msgid "highest timeline %u of the primary is behind recovery timeline %u" +msgstr "" + +#: replication/walreceiver.c:404 +#, c-format +msgid "started streaming WAL from primary at %X/%X on timeline %u" +msgstr "" + +#: replication/walreceiver.c:408 +#, c-format +msgid "restarted WAL streaming at %X/%X on timeline %u" +msgstr "" + +#: replication/walreceiver.c:437 +#, c-format +msgid "cannot continue WAL streaming, recovery has already ended" +msgstr "" + +#: replication/walreceiver.c:475 +#, c-format +msgid "replication terminated by primary server" +msgstr "რეპლიკაცია შეწყვეტილია ძირითადი სერვერის მიერ" + +#: replication/walreceiver.c:476 +#, c-format +msgid "End of WAL reached on timeline %u at %X/%X." +msgstr "" + +#: replication/walreceiver.c:565 +#, c-format +msgid "terminating walreceiver due to timeout" +msgstr "walreceiver პროგრამის შეწყვეტა მოლოდინის ვადის ამოწურვის გამო" + +#: replication/walreceiver.c:603 +#, c-format +msgid "primary server contains no more WAL on requested timeline %u" +msgstr "" + +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 +#, c-format +msgid "could not close log segment %s: %m" +msgstr "" + +#: replication/walreceiver.c:738 +#, c-format +msgid "fetching timeline history file for timeline %u from primary server" +msgstr "" + +#: replication/walreceiver.c:933 +#, c-format +msgid "could not write to log segment %s at offset %u, length %lu: %m" +msgstr "" + +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "%s-ის გამოყენება ლოგიკური რეპლიკაციის სლოტთან ერთად შეუძლებელია" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 +#, c-format +msgid "could not seek to end of file \"%s\": %m" +msgstr "ფაილის (\"%s\") ბოლოში გადახვევის პრობლემა: %m" + +#: replication/walsender.c:642 +#, c-format +msgid "could not seek to beginning of file \"%s\": %m" +msgstr "ფაილის (\"%s\") დასაწყისში გადახვევის პრობლემა: %m" + +#: replication/walsender.c:719 +#, c-format +msgid "cannot use a logical replication slot for physical replication" +msgstr "" + +#: replication/walsender.c:785 +#, c-format +msgid "requested starting point %X/%X on timeline %u is not in this server's history" +msgstr "" + +#: replication/walsender.c:788 +#, c-format +msgid "This server's history forked from timeline %u at %X/%X." +msgstr "" + +#: replication/walsender.c:832 +#, c-format +msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" +msgstr "" + +#: replication/walsender.c:1015 +#, 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:1100 +#, c-format +msgid "%s must not be called inside a transaction" +msgstr "%s ტრანზაქცის შიგნიდან არ უნდა გამოიძახოთ" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1110 +#, c-format +msgid "%s must be called inside a transaction" +msgstr "%s ტრანზაქციის შიგნიდან უნდა გამოიძახოთ" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1116 +#, c-format +msgid "%s must be called in REPEATABLE READ isolation mode transaction" +msgstr "" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1122 +#, c-format +msgid "%s must be called before any query" +msgstr "%s ყველა მოთხოვნაზე ადრე უნდა გამოიძახოთ" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1128 +#, c-format +msgid "%s must not be called in a subtransaction" +msgstr "%s ქვეტრანზაქციაში არ უნდა გამოიძახოთ" + +#: replication/walsender.c:1271 +#, c-format +msgid "cannot read from logical replication slot \"%s\"" +msgstr "" + +#: replication/walsender.c:1273 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "" + +#: replication/walsender.c:1283 +#, c-format +msgid "terminating walsender process after promotion" +msgstr "walsender პროცესის შეწყვეტა დაწინაურების შემდეგ" + +#: replication/walsender.c:1704 +#, c-format +msgid "cannot execute new commands while WAL sender is in stopping mode" +msgstr "'WAL'-გამგზავნის გაჩერების რეჟიმში ყოფნის დროს ახალი ბრძანებების შესრულება შეუძლებელია" + +#: replication/walsender.c:1739 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "ფიზიკური რეპლიკაციისთვის WAL-ის გამგზავნში SQL ბრძანებების შესრულება შეუძლებელია" + +#: replication/walsender.c:1772 +#, c-format +msgid "received replication command: %s" +msgstr "მიღებულია რეპლიკაციის ბრძანება: %s" + +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 tcop/postgres.c:2614 tcop/postgres.c:2692 +#, c-format +msgid "current transaction is aborted, commands ignored until end of transaction block" +msgstr "" + +#: replication/walsender.c:1922 replication/walsender.c:1957 +#, c-format +msgid "unexpected EOF on standby connection" +msgstr "მოულოდნელი EOF მომლოდინის მიერთებაზე" + +#: replication/walsender.c:1945 +#, c-format +msgid "invalid standby message type \"%c\"" +msgstr "არასწორი მომლოდინის შეტყობინების ტიპი \"%c\"" + +#: replication/walsender.c:2034 +#, c-format +msgid "unexpected message type \"%c\"" +msgstr "შეტყობინების მოულოდნელი ტიპი: \"%c\"" + +#: replication/walsender.c:2447 +#, c-format +msgid "terminating walsender process due to replication timeout" +msgstr "walsender პროცესის შეწყვეტა რეპლიკაციის მოლოდინის ვადის ამოწურვის გამო" + +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 +#, c-format +msgid "rule \"%s\" for relation \"%s\" already exists" +msgstr "წესი \"%s\" ურთიერთობისთვის \"%s\" უკვე არსებობს" + +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, 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:303 +#, c-format +msgid "Use views or triggers instead." +msgstr "გამოიყენეთ ხედები ან ტრიგერები." + +#: rewrite/rewriteDefine.c:307 +#, c-format +msgid "rule actions on NEW are not implemented" +msgstr "\"NEW\"-ზე წესის ქმედებები განხორციელებული არა" + +#: rewrite/rewriteDefine.c:308 +#, c-format +msgid "Use triggers instead." +msgstr "ამის ნაცვლად ტრიგერები გამოიყენეთ." + +#: rewrite/rewriteDefine.c:321 +#, c-format +msgid "INSTEAD NOTHING rules on SELECT are not implemented" +msgstr "SELECT-ზე INSTEAD NOTHING წესები განხორციელებული არაა" + +#: rewrite/rewriteDefine.c:322 +#, c-format +msgid "Use views instead." +msgstr "ამის ნაცვლად ხედები გამოიყენეთ." + +#: rewrite/rewriteDefine.c:330 +#, c-format +msgid "multiple actions for rules on SELECT are not implemented" +msgstr "\"SELECT\"-ზე ერთზე მეტი წესის ქმედება მხარდაუჭერელია" + +#: rewrite/rewriteDefine.c:340 +#, c-format +msgid "rules on SELECT must have action INSTEAD SELECT" +msgstr "\"SELECT\"-ზე არსებულ წესებს ქმედება INSTEAD SELECT აუცილებლად უნდა ჰქონდეთ" + +#: rewrite/rewriteDefine.c:348 +#, c-format +msgid "rules on SELECT must not contain data-modifying statements in WITH" +msgstr "\"SELECT\"-ზე არსებულ წესები \"WITH\"-ში მონაცემების შემცვლელ ოპერატორებს არ უნდა შეიცავდნენ" + +#: rewrite/rewriteDefine.c:356 +#, c-format +msgid "event qualifications are not implemented for rules on SELECT" +msgstr "'SELECT'-ზე წესებისთვის პირობების ქონა განხორციელებული არაა" + +#: rewrite/rewriteDefine.c:383 +#, c-format +msgid "\"%s\" is already a view" +msgstr "\"%s\" უკვე ხედია" + +#: rewrite/rewriteDefine.c:407 +#, c-format +msgid "view rule for \"%s\" must be named \"%s\"" +msgstr "ხედის წესის \"%s\" სახელი \"%s\" უნდა იყოს" + +#: rewrite/rewriteDefine.c:436 +#, c-format +msgid "cannot convert partitioned table \"%s\" to a view" +msgstr "" + +#: rewrite/rewriteDefine.c:445 +#, c-format +msgid "cannot convert partition \"%s\" to a view" +msgstr "" + +#: rewrite/rewriteDefine.c:454 +#, c-format +msgid "could not convert table \"%s\" to a view because it is not empty" +msgstr "" + +#: rewrite/rewriteDefine.c:463 +#, c-format +msgid "could not convert table \"%s\" to a view because it has triggers" +msgstr "" + +#: rewrite/rewriteDefine.c:465 +#, c-format +msgid "In particular, the table cannot be involved in any foreign key relationships." +msgstr "" + +#: rewrite/rewriteDefine.c:470 +#, c-format +msgid "could not convert table \"%s\" to a view because it has indexes" +msgstr "" + +#: rewrite/rewriteDefine.c:476 +#, c-format +msgid "could not convert table \"%s\" to a view because it has child tables" +msgstr "" + +#: rewrite/rewriteDefine.c:482 +#, c-format +msgid "could not convert table \"%s\" to a view because it has parent tables" +msgstr "" + +#: rewrite/rewriteDefine.c:488 +#, c-format +msgid "could not convert table \"%s\" to a view because it has row security enabled" +msgstr "" + +#: rewrite/rewriteDefine.c:494 +#, c-format +msgid "could not convert table \"%s\" to a view because it has row security policies" +msgstr "" + +#: rewrite/rewriteDefine.c:521 +#, c-format +msgid "cannot have multiple RETURNING lists in a rule" +msgstr "წესში ერთზე მეტი RETURNING ტიპის სია ვერ გექნებათ" + +#: rewrite/rewriteDefine.c:526 +#, c-format +msgid "RETURNING lists are not supported in conditional rules" +msgstr "RETURNING ტიპის სიები პირობის მქონე წესებში მხარდაჭერილი არაა" + +#: rewrite/rewriteDefine.c:530 +#, c-format +msgid "RETURNING lists are not supported in non-INSTEAD rules" +msgstr "სიები RETURNING არა-INSTEAD წესებში მხარდაჭერილი არაა" + +#: rewrite/rewriteDefine.c:544 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "კურსორს %s არგუმენტი სახელად %s არ გააჩნია" + +#: rewrite/rewriteDefine.c:706 +#, c-format +msgid "SELECT rule's target list has too many entries" +msgstr "SELECT-ის წესის სამიზნე სია მეტისმეტად ბევრ ელემენტს ჩანაწერს შეიცავს" + +#: rewrite/rewriteDefine.c:707 +#, c-format +msgid "RETURNING list has too many entries" +msgstr "RETURNING ტიპის სიაში მეტისმეტად ბევრი ჩანაწერია" + +#: rewrite/rewriteDefine.c:734 +#, c-format +msgid "cannot convert relation containing dropped columns to view" +msgstr "" + +#: rewrite/rewriteDefine.c:735 +#, c-format +msgid "cannot create a RETURNING list for a relation containing dropped columns" +msgstr "" + +#: rewrite/rewriteDefine.c:741 +#, c-format +msgid "SELECT rule's target entry %d has different column name from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:743 +#, c-format +msgid "SELECT target entry is named \"%s\"." +msgstr "SELECT-ის სამიზნე ჩანაწერის სახელია \"%s\"." + +#: rewrite/rewriteDefine.c:752 +#, c-format +msgid "SELECT rule's target entry %d has different type from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:754 +#, c-format +msgid "RETURNING list's entry %d has different type from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 +#, c-format +msgid "SELECT target entry has type %s, but column has type %s." +msgstr "" + +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 +#, c-format +msgid "RETURNING list entry has type %s, but column has type %s." +msgstr "" + +#: rewrite/rewriteDefine.c:776 +#, c-format +msgid "SELECT rule's target entry %d has different size from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:778 +#, c-format +msgid "RETURNING list's entry %d has different size from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:795 +#, c-format +msgid "SELECT rule's target list has too few entries" +msgstr "" + +#: rewrite/rewriteDefine.c:796 +#, c-format +msgid "RETURNING list has too few entries" +msgstr "RETURNING ტიპის სიაში მეტისმეტად ცოტა ჩანაწერია" + +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 rewrite/rewriteSupport.c:109 +#, c-format +msgid "rule \"%s\" for relation \"%s\" does not exist" +msgstr "წესი %s ურთიერთობისთვის \"%s\" არ არსებობს" + +#: rewrite/rewriteDefine.c:1023 +#, c-format +msgid "renaming an ON SELECT rule is not allowed" +msgstr "'ON SELECT' წესზე სახელის გადარქმევა დაუშვებელია" + +#: rewrite/rewriteHandler.c:576 +#, c-format +msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" +msgstr "" + +#: rewrite/rewriteHandler.c:603 +#, c-format +msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:656 +#, c-format +msgid "cannot have RETURNING lists in multiple rules" +msgstr "" + +#: rewrite/rewriteHandler.c:888 rewrite/rewriteHandler.c:927 +#, c-format +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:890 rewrite/rewriteHandler.c:956 +#, c-format +msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." +msgstr "" + +#: rewrite/rewriteHandler.c:892 +#, c-format +msgid "Use OVERRIDING SYSTEM VALUE to override." +msgstr "გადასაფარად გამოიყენეთ OVERRIDING SYSTEM VALUE." + +#: rewrite/rewriteHandler.c:954 rewrite/rewriteHandler.c:962 +#, c-format +msgid "column \"%s\" can only be updated to DEFAULT" +msgstr "სვეტი \"%s\" მხოლოდ DEFAULT-მდე შეიძლება, განახლდეს" + +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 +#, c-format +msgid "multiple assignments to same column \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:2228 +#, c-format +msgid "infinite recursion detected in policy for relation \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:2548 +msgid "Junk view columns are not updatable." +msgstr "ნაგვის ნახვის სვეტები განახლებადი არაა." + +#: rewrite/rewriteHandler.c:2553 +msgid "View columns that are not columns of their base relation are not updatable." +msgstr "ხედის სვეტები, რომლებიც მათი საბაზისო ურთიერთობის სვეტები არიან, განახლებადი არაა." + +#: rewrite/rewriteHandler.c:2556 +msgid "View columns that refer to system columns are not updatable." +msgstr "ხედის სვეტები, რომლებიც სისტემურ სვეტებზეა მიბმული, განახლებადი არაა." + +#: rewrite/rewriteHandler.c:2559 +msgid "View columns that return whole-row references are not updatable." +msgstr "ხედის სვეტები, რომლებიც მთელ-მწკრივიან ბმებზე მიუთითებენ, განახლებადი არაა." + +#: rewrite/rewriteHandler.c:2620 +msgid "Views containing DISTINCT are not automatically updatable." +msgstr "\"DISTINCT\"-ის შემცველი ხედები განახლებადი არაა." + +#: rewrite/rewriteHandler.c:2623 +msgid "Views containing GROUP BY are not automatically updatable." +msgstr "\"GROUP BY\"-ის შემცველი ხედები თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2626 +msgid "Views containing HAVING are not automatically updatable." +msgstr "\"HAVING\"-ის შემცველი ხედები თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2629 +msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." +msgstr "\"UNION\"-ის, \"INTERSECT\"-ის და \"EXCEPT\"-ის შემცველი ხედები თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2632 +msgid "Views containing WITH are not automatically updatable." +msgstr "\"WITH\"-ის შემცველი ხედები თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2635 +msgid "Views containing LIMIT or OFFSET are not automatically updatable." +msgstr "\"LIMIT\"-ის და \"OFFSET\"-ის შემცველი ხედები თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2647 +msgid "Views that return aggregate functions are not automatically updatable." +msgstr "ხედები, რომლებიც აგრეგატულ ფუნქციებს აბრუნებენ, თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2650 +msgid "Views that return window functions are not automatically updatable." +msgstr "ხედები, რომლებიც ფანჯრის ფუნქციებს აბრუნებენ, თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2653 +msgid "Views that return set-returning functions are not automatically updatable." +msgstr "ხედები, რომლებიც აბრუნებენ ფუნქციებს, რომლებიც სეტებს აბრუნებენ, თვითგანახლებადი არაა." + +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 rewrite/rewriteHandler.c:2672 +msgid "Views that do not select from a single table or view are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:2675 +msgid "Views containing TABLESAMPLE are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:2699 +msgid "Views that have no updatable columns are not automatically updatable." +msgstr "ხედები, რომლებსაც განახლებადი ცხრილები არ გააჩნია, ავტომატურად განახლებადები არ არიან." + +#: rewrite/rewriteHandler.c:3176 +#, c-format +msgid "cannot insert into column \"%s\" of view \"%s\"" +msgstr "ხედის (\"%2$s\") სვეტში \"%1$s\" მონაცემის ჩასმა შეუძლებელია" + +#: rewrite/rewriteHandler.c:3184 +#, c-format +msgid "cannot update column \"%s\" of view \"%s\"" +msgstr "ხედის (\"%2$s\") სვეტის \"%1$s\" განახლება შეუძლებელია" + +#: rewrite/rewriteHandler.c:3675 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3686 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3700 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3704 +#, c-format +msgid "DO ALSO rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3709 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 rewrite/rewriteHandler.c:3992 +#, c-format +msgid "Views with conditional DO INSTEAD rules are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:4097 +#, c-format +msgid "cannot perform INSERT RETURNING on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" 'INSERT RETURNING'-ის განხორციელება შეუძლებელია" + +#: rewrite/rewriteHandler.c:4099 +#, c-format +msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4104 +#, c-format +msgid "cannot perform UPDATE RETURNING on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" 'UPDATE RETURNING'-ის განხორციელება შეუძლებელია" + +#: rewrite/rewriteHandler.c:4106 +#, c-format +msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4111 +#, c-format +msgid "cannot perform DELETE RETURNING on relation \"%s\"" +msgstr "ურთიერთობაზე \"%s\" 'DELETE RETURNING'-ის განხორციელება შეუძლებელია" + +#: rewrite/rewriteHandler.c:4113 +#, c-format +msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4131 +#, c-format +msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" +msgstr "" + +#: rewrite/rewriteHandler.c:4188 +#, c-format +msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" +msgstr "" + +#: rewrite/rewriteManip.c:1009 +#, c-format +msgid "conditional utility statements are not implemented" +msgstr "პირობითი სამსახურეობრივი გამოსახულებები განხორციელებული არაა" + +#: rewrite/rewriteManip.c:1175 +#, c-format +msgid "WHERE CURRENT OF on a view is not implemented" +msgstr "WHERE CURRENT OF ხედზე განხორციელებული არაა" + +#: rewrite/rewriteManip.c:1510 +#, c-format +msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" +msgstr "" + +#: 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 "" + +#: scan.l:465 +msgid "unterminated /* comment" +msgstr "დაუსრულებელი /* კომენტარი" + +#: scan.l:485 +msgid "unterminated bit string literal" +msgstr "გაწყვეტილი ბიტური სტრიქონი" + +#: scan.l:499 +msgid "unterminated hexadecimal string literal" +msgstr "გაწყვეტილი თექვსმეტობითი სტრიქონი" + +#: scan.l:549 +#, c-format +msgid "unsafe use of string constant with Unicode escapes" +msgstr "" + +#: scan.l:550 +#, c-format +msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." +msgstr "" + +#: scan.l:611 +msgid "unhandled previous state in xqs" +msgstr "დაუმუშავებელი წინა მდგომარეობა დამხურავი ბრჭყალის აღმოჩენისას" + +#: scan.l:685 +#, c-format +msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +msgstr "უნიკოდის სპეცკოდების შესაძლო ვარიანტებია \\uXXXX და \\UXXXXXXXX." + +#: scan.l:696 +#, c-format +msgid "unsafe use of \\' in a string literal" +msgstr "სტრიქონში \\'-ის გამოყენება უსაფრთხო არაა" + +#: scan.l:697 +#, c-format +msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." +msgstr "" + +#: scan.l:769 +msgid "unterminated dollar-quoted string" +msgstr "$-ით დაწყებული სტრიქონ დაუმთავრებელია" + +#: scan.l:786 scan.l:796 +msgid "zero-length delimited identifier" +msgstr "გამყოფის ნულოვანი სიგრძის იდენტიფიკატორი" + +#: scan.l:807 syncrep_scanner.l:91 +msgid "unterminated quoted identifier" +msgstr "დაუსრულებელი იდენტიფიკატორი ბრჭყალებში" + +#: 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:1183 +#, c-format +msgid "%s at end of input" +msgstr "%s შეყვანის ბოლოს" + +#. translator: first %s is typically the translation of "syntax error" +#: scan.l:1191 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s \"%s\"-სთან ან ახლოს" + +#: scan.l:1382 +#, c-format +msgid "nonstandard use of \\' in a string literal" +msgstr "სტრიქონში \\' არასტანდარტულადაა გამოყენებული" + +#: scan.l:1383 +#, c-format +msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." +msgstr "" + +#: scan.l:1392 +#, c-format +msgid "nonstandard use of \\\\ in a string literal" +msgstr "სტრიქონში \\\\ არასტანდარტულადაა გამოყენებული" + +#: scan.l:1393 +#, c-format +msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." +msgstr "" + +#: scan.l:1407 +#, c-format +msgid "nonstandard use of escape in a string literal" +msgstr "" + +#: scan.l:1408 +#, c-format +msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." +msgstr "" + +#: snowball/dict_snowball.c:215 +#, c-format +msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" +msgstr "" + +#: 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:247 +#, c-format +msgid "multiple Language parameters" +msgstr "გამეორებადი Language პარამეტრი" + +#: snowball/dict_snowball.c:254 +#, c-format +msgid "unrecognized Snowball parameter: \"%s\"" +msgstr "" + +#: snowball/dict_snowball.c:262 +#, c-format +msgid "missing Language parameter" +msgstr "აკლია პარამეტრი Language" + +#: statistics/extended_stats.c:179 +#, c-format +msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" +msgstr "" + +#: statistics/mcv.c:1372 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "ფუნქცია, რომელიც ჩანაწერს აბრუნებს, გამოძახებულია კონტექსტში, რომელსაც ჩანაწერის მიღება არ შეუძლია" + +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 +#, c-format +msgid "cannot access temporary tables of other sessions" +msgstr "სხვა სესიების დროებით ცხრილებთან წვდომა შეუძლებელია" + +#: storage/buffer/bufmgr.c:851 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "" + +#: storage/buffer/bufmgr.c:938 +#, c-format +msgid "unexpected data beyond EOF in block %u of relation %s" +msgstr "" + +#: storage/buffer/bufmgr.c:940 +#, c-format +msgid "This has been seen to occur with buggy kernels; consider updating your system." +msgstr "" + +#: storage/buffer/bufmgr.c:1039 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "" + +#: storage/buffer/bufmgr.c:4670 +#, c-format +msgid "could not write block %u of %s" +msgstr "%2$s-ის %1$u ბლოკის ჩაწერა შეუძლებელია" + +#: storage/buffer/bufmgr.c:4672 +#, c-format +msgid "Multiple failures --- write error might be permanent." +msgstr "ბევრი შეცდომა --- ჩაწერის შეცდომა შეიძლება მუდმივი იყოს." + +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 +#, c-format +msgid "writing block %u of relation %s" +msgstr "" + +#: storage/buffer/bufmgr.c:5016 +#, c-format +msgid "snapshot too old" +msgstr "სწრაფი ასლი ძალიან ძველია" + +#: storage/buffer/localbuf.c:205 +#, c-format +msgid "no empty local buffer available" +msgstr "ცარიელი ლოკალური ბაფერები მიუწვდომელია" + +#: storage/buffer/localbuf.c:433 +#, c-format +msgid "cannot access temporary tables during a parallel operation" +msgstr "" + +#: storage/file/buffile.c:333 +#, c-format +msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "" + +#: 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 "" + +#: 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:328 storage/smgr/md.c:907 +#, 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 "" + +#: storage/file/fd.c:552 +#, c-format +msgid "could not determine dirty data size: %m" +msgstr "" + +#: storage/file/fd.c:604 +#, c-format +msgid "could not munmap() while flushing data: %m" +msgstr "" + +#: storage/file/fd.c:843 +#, c-format +msgid "could not link file \"%s\" to \"%s\": %m" +msgstr "" + +#: storage/file/fd.c:967 +#, c-format +msgid "getrlimit failed: %m" +msgstr "getrlimit-ის შეცდომა: %m" + +#: storage/file/fd.c:1057 +#, c-format +msgid "insufficient file descriptors available to start server process" +msgstr "სერვერის პროცესის გასაშვებად საკმარისი ფაილის დესკრიპტორების ხელმისაწვდომი არაა" + +#: storage/file/fd.c:1058 +#, c-format +msgid "System allows %d, we need at least %d." +msgstr "" + +#: 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:1527 +#, c-format +msgid "temporary file: path \"%s\", size %lu" +msgstr "დროებითი ფაილი: ბილიკი \"%s\", ზომა %lu" + +#: storage/file/fd.c:1658 +#, c-format +msgid "cannot create temporary directory \"%s\": %m" +msgstr "დროებითი საქაღალდის (%s) შექმნის შეცდომა: %m" + +#: storage/file/fd.c:1665 +#, c-format +msgid "cannot create temporary subdirectory \"%s\": %m" +msgstr "დროებითი ქვესაქაღალდის (%s) შექმნის შეცდომა: %m" + +#: storage/file/fd.c:1862 +#, c-format +msgid "could not create temporary file \"%s\": %m" +msgstr "დროებითი ფაილის (%s) შექმნის შეცდომა: %m" + +#: storage/file/fd.c:1898 +#, c-format +msgid "could not open temporary file \"%s\": %m" +msgstr "დროებითი ფაილის (\"%s\") გახსნის შეცდომა: %m" + +#: storage/file/fd.c:1939 +#, c-format +msgid "could not unlink temporary file \"%s\": %m" +msgstr "დროებითი ფაილის (%s) ბმულის მოხსნის შეცდომა: %m" + +#: 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კბ) აჭარბებს" + +#: 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) როცა ვცდილობდი, გამეხსნა ფაილი \"%s\"" + +#: storage/file/fd.c:2576 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" +msgstr "გადაცილებულია maxAllocatedDescs (%d) როცა ვცდილობდი, გამეშვა ბრძანება \"%s\"" + +#: storage/file/fd.c:2733 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" +msgstr "გადაცილებულია maxAllocatedDescs (%d) როცა ვცდილობდი, გამეხსნა საქაღალდე \"%s\"" + +#: storage/file/fd.c:3269 +#, c-format +msgid "unexpected file found in temporary-files directory: \"%s\"" +msgstr "დროებითი ფაილების საქაღალდეში აღმოჩენილია მოულოდნელი ფაილი: \"%s\"" + +#: 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 "" + +#: 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 "" + +#: storage/ipc/dsm.c:353 +#, c-format +msgid "dynamic shared memory control segment is corrupt" +msgstr "დინამიური გაზიარებული მეხსიერების კონტროლის სეგმენტი დაზიანებულია" + +#: storage/ipc/dsm.c:418 +#, c-format +msgid "dynamic shared memory control segment is not valid" +msgstr "დინამიური გაზიარებული მეხსიერების კონტროლის სეგმენტი არასწორია" + +#: storage/ipc/dsm.c:600 +#, c-format +msgid "too many dynamic shared memory segments" +msgstr "მეტისმეტად ბევრი დინამიური გაზიარებული მეხსიერების სეგმენტი" + +#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#, c-format +msgid "could not unmap shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") მიბმის მოხსნის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#, c-format +msgid "could not remove shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") წაშლის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 storage/ipc/dsm_impl.c:843 +#, c-format +msgid "could not open shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") გახსნის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#, c-format +msgid "could not stat shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") პოვნის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 +#, c-format +msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") ზომის %zu ბაიტამე გაზრდის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#, c-format +msgid "could not map shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") მიბმის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:526 +#, c-format +msgid "could not get shared memory segment: %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის მიღების შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:714 +#, c-format +msgid "could not create shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") შექმნის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:951 +#, c-format +msgid "could not close shared memory segment \"%s\": %m" +msgstr "მეხსიერების გაზიარებული სეგმენტის (\"%s\") დახურვის შეცდომა: %m" + +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 +#, c-format +msgid "could not duplicate handle for \"%s\": %m" +msgstr "\"%s\"-ის დამმუშავებლის დუბლირება შეუძლებელია: %m" + +#: storage/ipc/procarray.c:3846 +#, c-format +msgid "database \"%s\" is being used by prepared transactions" +msgstr "მონაცემთა ბაზა \"%s\" მომზადებული ტრანზაქციების მიერ გამოიყენება" + +#: storage/ipc/procarray.c:3878 storage/ipc/signalfuncs.c:226 +#, c-format +msgid "must be a superuser to terminate superuser process" +msgstr "ზემომხმარებლის პროცესის დასასრულებლად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: storage/ipc/procarray.c:3885 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 "" + +#: 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 "გაზიარებული მეხსიერების რიგის გავლით %zu ბაიტის ზომის მქონე შეტყობინების გაგზავნა შეუძლებელია" + +#: storage/ipc/shm_mq.c:719 +#, 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:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 utils/hash/dynahash.c:1112 +#, c-format +msgid "out of shared memory" +msgstr "არასაკმარისი გაზიარებული მეხსიერება" + +#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#, c-format +msgid "out of shared memory (%zu bytes requested)" +msgstr "არასაკმარისი გაზიარებული მეხსიერება (მოთხოვნილი იყო %zu ბაიტი)" + +#: storage/ipc/shmem.c:445 +#, c-format +msgid "could not create ShmemIndex entry for data structure \"%s\"" +msgstr "" + +#: storage/ipc/shmem.c:460 +#, c-format +msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" +msgstr "" + +#: storage/ipc/shmem.c:479 +#, c-format +msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" +msgstr "" + +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#, c-format +msgid "requested shared memory size overflows size_t" +msgstr "მოთხოვნილი გაზიარებული მეხსიერების ზომა site_t-ის გადავსებას იწვევს" + +#: storage/ipc/signalfuncs.c:72 +#, c-format +msgid "PID %d is not a PostgreSQL backend process" +msgstr "პროცესი PID-ით %d PostgreSQL-ის უკანაბოლოს პროცესს არ წარმოადგენს" + +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 utils/adt/mcxtfuncs.c:190 +#, c-format +msgid "could not send signal to process %d: %m" +msgstr "პროცესისთვის %d სიგნალის გაგზავნა შეუძლებელია: %m" + +#: storage/ipc/signalfuncs.c:124 +#, c-format +msgid "must be a superuser to cancel superuser query" +msgstr "" + +#: 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 "" + +#: storage/ipc/signalfuncs.c:170 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#. translator: %s is a SQL function name +#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 +#, c-format +msgid "Consider using %s, which is part of core, instead." +msgstr "" + +#: 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:307 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "" + +#: storage/ipc/standby.c:316 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "" + +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 +#, c-format +msgid "canceling statement due to conflict with recovery" +msgstr "გამოსახულების გაუქმება აღდგენასთან კონფლიქტის გამო" + +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 +#, 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 "" + +#: 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:457 +#, c-format +msgid "invalid whence setting: %d" +msgstr "არასწორი ორიენტირის პარამეტრი: %d" + +#: storage/large_object/inv_api.c:629 +#, c-format +msgid "invalid large object write request size: %d" +msgstr "არასწორი დიდი ობიექტის ჩაწერის ზომა: %d" + +#: storage/lmgr/deadlock.c:1121 +#, c-format +msgid "Process %d waits for %s on %s; blocked by process %d." +msgstr "" + +#: storage/lmgr/deadlock.c:1140 +#, c-format +msgid "Process %d: %s" +msgstr "პროცესი %d: %s" + +#: storage/lmgr/deadlock.c:1149 +#, c-format +msgid "deadlock detected" +msgstr "ნაპოვნია ურთიერთბლოკირება" + +#: storage/lmgr/deadlock.c:1152 +#, c-format +msgid "See server log for query details." +msgstr "მოთხოვნის დეტალებისთვის იხილეთ სერვერის ჟურნალი." + +#: storage/lmgr/lmgr.c:859 +#, c-format +msgid "while updating tuple (%u,%u) in relation \"%s\"" +msgstr "კორტეჟის (%u,%u) განახლებისას ურთიერთობაში \"%s\"" + +#: storage/lmgr/lmgr.c:862 +#, c-format +msgid "while deleting tuple (%u,%u) in relation \"%s\"" +msgstr "კორტეჟის (%u,%u) წაშლისას ურთიერთობაში \"%s\"" + +#: storage/lmgr/lmgr.c:865 +#, c-format +msgid "while locking tuple (%u,%u) in relation \"%s\"" +msgstr "კორტეჟის (%u,%u) დაბლოკვისას ურთიერთობაში \"%s\"" + +#: storage/lmgr/lmgr.c:868 +#, c-format +msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" +msgstr "კორტეჟის (%u,%u) განახლებული ვერსიის დაბლოკვისას ურთიერთობაში \"%s\"" + +#: storage/lmgr/lmgr.c:871 +#, c-format +msgid "while inserting index tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:874 +#, c-format +msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:877 +#, c-format +msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:880 +#, c-format +msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:1135 +#, c-format +msgid "relation %u of database %u" +msgstr "ურთიერთობა %u ბაზისთვის %u" + +#: storage/lmgr/lmgr.c:1141 +#, c-format +msgid "extension of relation %u of database %u" +msgstr "ურთიერთობის %u გაფართოება ბაზისთვის %u" + +#: storage/lmgr/lmgr.c:1147 +#, c-format +msgid "pg_database.datfrozenxid of database %u" +msgstr "pg_database.datfrozenxid ბაზისთვის %u" + +#: storage/lmgr/lmgr.c:1152 +#, c-format +msgid "page %u of relation %u of database %u" +msgstr "გვერდი %u ურთიერთობისთვის %u ბაზისთვის %u" + +#: storage/lmgr/lmgr.c:1159 +#, c-format +msgid "tuple (%u,%u) of relation %u of database %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1167 +#, c-format +msgid "transaction %u" +msgstr "ტრანზაქცია %u" + +#: storage/lmgr/lmgr.c:1172 +#, c-format +msgid "virtual transaction %d/%u" +msgstr "ვირტუალური ტრანზაქცია %d/%u" + +#: storage/lmgr/lmgr.c:1178 +#, c-format +msgid "speculative token %u of transaction %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1184 +#, c-format +msgid "object %u of class %u of database %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1192 +#, c-format +msgid "user lock [%u,%u,%u]" +msgstr "მომხმარებლის ბლოკი [%u,%u,%u]" + +#: storage/lmgr/lmgr.c:1199 +#, c-format +msgid "advisory lock [%u,%u,%u,%u]" +msgstr "რეკომენდებული ბლოკი [%u,%u,%u,%u]" + +#: storage/lmgr/lmgr.c:1207 +#, c-format +msgid "unrecognized locktag type %d" +msgstr "locktag-ის უცნობი ტიპი %d" + +#: storage/lmgr/lock.c:791 +#, c-format +msgid "cannot acquire lock mode %s on database objects while recovery is in progress" +msgstr "" + +#: storage/lmgr/lock.c:793 +#, c-format +msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." +msgstr "" + +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 +#, c-format +msgid "You might need to increase max_locks_per_transaction." +msgstr "" + +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 +#, c-format +msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" +msgstr "" + +#: storage/lmgr/predicate.c:700 +#, c-format +msgid "not enough elements in RWConflictPool to record a read/write conflict" +msgstr "" + +#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#, c-format +msgid "You might need to run fewer transactions at a time or increase max_connections." +msgstr "" + +#: storage/lmgr/predicate.c:728 +#, c-format +msgid "not enough elements in RWConflictPool to record a potential read/write conflict" +msgstr "" + +#: storage/lmgr/predicate.c:1695 +#, c-format +msgid "\"default_transaction_isolation\" is set to \"serializable\"." +msgstr "\"default_transaction_isolation\"-ი \"serializable\"-ზეა დაყენებული." + +#: storage/lmgr/predicate.c:1696 +#, c-format +msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." +msgstr "" + +#: storage/lmgr/predicate.c:1747 +#, c-format +msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" +msgstr "" + +#: 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: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:2486 storage/lmgr/predicate.c:2501 storage/lmgr/predicate.c:3991 +#, c-format +msgid "You might need to increase max_pred_locks_per_transaction." +msgstr "" + +#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 +#, c-format +msgid "could not serialize access due to read/write dependencies among transactions" +msgstr "" + +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 +#, c-format +msgid "The transaction might succeed if retried." +msgstr "ტრანზაქცია შეიძლება გაიტანოს, თუ გაიმეორებთ." + +#: storage/lmgr/proc.c:355 +#, c-format +msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" +msgstr "" + +#: storage/lmgr/proc.c:1531 +#, c-format +msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1546 +#, c-format +msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1555 +#, c-format +msgid "process %d still waiting for %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1562 +#, c-format +msgid "process %d acquired %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1579 +#, c-format +msgid "process %d failed to acquire %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/page/bufpage.c:152 +#, c-format +msgid "page verification failed, calculated checksum %u but expected %u" +msgstr "" + +#: 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 "" + +#: storage/page/bufpage.c:759 +#, c-format +msgid "corrupted line pointer: %u" +msgstr "ხაზის დაზიანებული მაჩვენებელი: %u" + +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 +#, c-format +msgid "corrupted item lengths: total %u, available space %u" +msgstr "" + +#: 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 "" + +#: storage/smgr/md.c:473 +#, c-format +msgid "cannot extend file \"%s\" beyond %u blocks" +msgstr "" + +#: storage/smgr/md.c:488 +#, c-format +msgid "could not extend file \"%s\": %m" +msgstr "ფაილის გაფართოების შეცდომა \"%s\": %m" + +#: storage/smgr/md.c:494 +#, c-format +msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgstr "" + +#: storage/smgr/md.c:709 +#, c-format +msgid "could not read block %u in file \"%s\": %m" +msgstr "ბლოკის %u წაკითხვის შეცდომა ფაილში \"%s\": %m" + +#: storage/smgr/md.c:725 +#, c-format +msgid "could not read block %u in file \"%s\": read only %d of %d bytes" +msgstr "" + +#: storage/smgr/md.c:779 +#, c-format +msgid "could not write block %u in file \"%s\": %m" +msgstr "ბლოკის %u ჩაწერის შეცდომა ფაილში \"%s\": %m" + +#: storage/smgr/md.c:784 +#, c-format +msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" +msgstr "" + +#: storage/smgr/md.c:878 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" +msgstr "" + +#: storage/smgr/md.c:933 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: %m" +msgstr "" + +#: storage/smgr/md.c:1332 +#, c-format +msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" +msgstr "" + +#: storage/smgr/md.c:1346 +#, c-format +msgid "could not open file \"%s\" (target block %u): %m" +msgstr "" + +#: tcop/fastpath.c:148 +#, c-format +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "" + +#: tcop/fastpath.c:233 +#, c-format +msgid "fastpath function call: \"%s\" (OID %u)" +msgstr "" + +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 tcop/postgres.c:2036 tcop/postgres.c:2280 +#, c-format +msgid "duration: %s ms" +msgstr "ხანგრძლივობა: %s მწმ" + +#: tcop/fastpath.c:316 +#, c-format +msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" +msgstr "" + +#: tcop/fastpath.c:352 +#, c-format +msgid "function call message contains %d arguments but function requires %d" +msgstr "" + +#: tcop/fastpath.c:360 +#, c-format +msgid "function call message contains %d argument formats but %d arguments" +msgstr "" + +#: tcop/fastpath.c:384 +#, c-format +msgid "invalid argument size %d in function call message" +msgstr "" + +#: tcop/fastpath.c:447 +#, c-format +msgid "incorrect binary data format in function argument %d" +msgstr "" + +#: tcop/postgres.c:444 tcop/postgres.c:4828 +#, c-format +msgid "invalid frontend message type %d" +msgstr "არასწორი წინაბოლოს შეტყობინების ტიპი %d" + +#: tcop/postgres.c:1051 +#, c-format +msgid "statement: %s" +msgstr "ოპერატორი: %s" + +#: tcop/postgres.c:1346 +#, c-format +msgid "duration: %s ms statement: %s" +msgstr "ხანგრძლივობა: %s მწმ გამოსახულება: %s" + +#: tcop/postgres.c:1452 +#, c-format +msgid "cannot insert multiple commands into a prepared statement" +msgstr "" + +#: tcop/postgres.c:1582 +#, c-format +msgid "duration: %s ms parse %s: %s" +msgstr "ხანგრძლივობა: %s მწმ %s-ის დამუშავება: %s" + +#: tcop/postgres.c:1648 tcop/postgres.c:2595 +#, c-format +msgid "unnamed prepared statement does not exist" +msgstr "" + +#: tcop/postgres.c:1689 +#, c-format +msgid "bind message has %d parameter formats but %d parameters" +msgstr "" + +#: tcop/postgres.c:1695 +#, c-format +msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" +msgstr "" + +#: tcop/postgres.c:1914 +#, c-format +msgid "incorrect binary data format in bind parameter %d" +msgstr "" + +#: tcop/postgres.c:2041 +#, c-format +msgid "duration: %s ms bind %s%s%s: %s" +msgstr "ხანგრძლივობა: %s მწმ მიბმა %s%s%s: %s" + +#: tcop/postgres.c:2091 tcop/postgres.c:2678 +#, c-format +msgid "portal \"%s\" does not exist" +msgstr "პორტალი \"%s\" არ არსებობს" + +#: tcop/postgres.c:2160 +#, c-format +msgid "%s %s%s%s: %s" +msgstr "%s %s%s%s: %s" + +#: tcop/postgres.c:2162 tcop/postgres.c:2288 +msgid "execute fetch from" +msgstr "" + +#: tcop/postgres.c:2163 tcop/postgres.c:2289 +msgid "execute" +msgstr "გაშვება" + +#: tcop/postgres.c:2285 +#, c-format +msgid "duration: %s ms %s %s%s%s: %s" +msgstr "ხანგრძლივობა: %s მწმs %s %s%s%s: %s" + +#: tcop/postgres.c:2431 +#, c-format +msgid "prepare: %s" +msgstr "მომზადება: %s" + +#: tcop/postgres.c:2456 +#, c-format +msgid "parameters: %s" +msgstr "პარამეტრები: %s" + +#: tcop/postgres.c:2471 +#, c-format +msgid "abort reason: recovery conflict" +msgstr "გაუქმების მიზეზი: აღდგენის კონფლიქტი" + +#: tcop/postgres.c:2487 +#, c-format +msgid "User was holding shared buffer pin for too long." +msgstr "" + +#: tcop/postgres.c:2490 +#, c-format +msgid "User was holding a relation lock for too long." +msgstr "" + +#: tcop/postgres.c:2493 +#, c-format +msgid "User was or might have been using tablespace that must be dropped." +msgstr "" + +#: tcop/postgres.c:2496 +#, c-format +msgid "User query might have needed to see row versions that must be removed." +msgstr "" + +#: tcop/postgres.c:2502 +#, c-format +msgid "User was connected to a database that must be dropped." +msgstr "" + +#: tcop/postgres.c:2541 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "პორტალის \"%s\" პარამეტრი $%d = %s" + +#: tcop/postgres.c:2544 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "პორტალის \"%s\" პარამეტრი $%d" + +#: tcop/postgres.c:2550 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "უსახელო პორტალის პარამეტრი $%d = %s" + +#: tcop/postgres.c:2553 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "უსახელო პორტალის პარამეტრი $%d" + +#: tcop/postgres.c:2898 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "" + +#: tcop/postgres.c:2904 +#, c-format +msgid "terminating connection because of crash of another server process" +msgstr "" + +#: tcop/postgres.c:2905 +#, 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:2909 tcop/postgres.c:3270 +#, c-format +msgid "In a moment you should be able to reconnect to the database and repeat your command." +msgstr "" + +#: tcop/postgres.c:2916 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "მიერთების შეწყვეტა დაუყოვნებლივი გამორთვის ბრძანების გამო" + +#: tcop/postgres.c:3002 +#, c-format +msgid "floating-point exception" +msgstr "წილადი რიცხვების ანგარიშის შეცდომა" + +#: tcop/postgres.c:3003 +#, 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:3174 +#, c-format +msgid "canceling authentication due to timeout" +msgstr "ავთენტიკაცია გაუქმდა მოლოდინის ვადის ამოწურვის გამო" + +#: tcop/postgres.c:3178 +#, c-format +msgid "terminating autovacuum process due to administrator command" +msgstr "ავტომომტვერსასრუტების პროცესის შეწყვეტა ადმინისტრატორის ბრძანების გამო" + +#: tcop/postgres.c:3182 +#, c-format +msgid "terminating logical replication worker due to administrator command" +msgstr "ლოგიკური რეპლიკაციის დამხმარე პროცესის შეწყვეტა ადმინისტრატორის ბრძანების გამო" + +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "მიერთების შეწყვეტა აღდგენასთან კონფლიქტის გამო" + +#: tcop/postgres.c:3220 +#, c-format +msgid "terminating connection due to administrator command" +msgstr "მიერთების შეწყვეტა ადმინისტრატორის ბრძანების გამო" + +#: tcop/postgres.c:3251 +#, c-format +msgid "connection to client lost" +msgstr "კლიენტთან შეერთების შეცდომა" + +#: tcop/postgres.c:3321 +#, c-format +msgid "canceling statement due to lock timeout" +msgstr "გამოსახულება გაუქმდება ბლოკის მოლოდინის ვადის ამოწურვის გამო" + +#: tcop/postgres.c:3328 +#, c-format +msgid "canceling statement due to statement timeout" +msgstr "" + +#: tcop/postgres.c:3335 +#, c-format +msgid "canceling autovacuum task" +msgstr "ავტომომტვერსასრუტების ამოცანის გაუქმება" + +#: tcop/postgres.c:3358 +#, c-format +msgid "canceling statement due to user request" +msgstr "" + +#: tcop/postgres.c:3372 +#, c-format +msgid "terminating connection due to idle-in-transaction timeout" +msgstr "" + +#: tcop/postgres.c:3383 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "" + +#: tcop/postgres.c:3523 +#, c-format +msgid "stack depth limit exceeded" +msgstr "გადაცილებულია სტეკის სიღრმის ლიმიტი" + +#: tcop/postgres.c:3524 +#, c-format +msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." +msgstr "" + +#: tcop/postgres.c:3587 +#, c-format +msgid "\"max_stack_depth\" must not exceed %ldkB." +msgstr "\"max_stack_depth\" %ldკბ-ს არ უნდა ცდებოდეს." + +#: tcop/postgres.c:3589 +#, c-format +msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." +msgstr "" + +#: tcop/postgres.c:3945 +#, c-format +msgid "invalid command-line argument for server process: %s" +msgstr "" + +#: tcop/postgres.c:3946 tcop/postgres.c:3952 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'." + +#: tcop/postgres.c:3950 +#, c-format +msgid "%s: invalid command-line argument: %s" +msgstr "%s: არასწორი ბრძანების სტრიქონის არგუმენტი: %s" + +#: tcop/postgres.c:4003 +#, c-format +msgid "%s: no database nor user name specified" +msgstr "%s: არც ბაზა, არც მომხმარებელი მითითებული არაა" + +#: tcop/postgres.c:4730 +#, c-format +msgid "invalid CLOSE message subtype %d" +msgstr "არასწორი CLOSE შეტყობინების ქვეტიპი %d" + +#: tcop/postgres.c:4765 +#, c-format +msgid "invalid DESCRIBE message subtype %d" +msgstr "არასწორი DESCRIBE შეტყობინების ქვეტიპი %d" + +#: tcop/postgres.c:4849 +#, c-format +msgid "fastpath function calls not supported in a replication connection" +msgstr "" + +#: tcop/postgres.c:4853 +#, c-format +msgid "extended query protocol not supported in a replication connection" +msgstr "" + +#: tcop/postgres.c:5030 +#, c-format +msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" +msgstr "" + +#: tcop/pquery.c:641 +#, c-format +msgid "bind message has %d result formats but query has %d columns" +msgstr "" + +#: tcop/pquery.c:944 tcop/pquery.c:1701 +#, c-format +msgid "cursor can only scan forward" +msgstr "კურსორს მხოლოდ წინ სკანირება შეუძლია" + +#: tcop/pquery.c:945 tcop/pquery.c:1702 +#, c-format +msgid "Declare it with SCROLL option to enable backward scan." +msgstr "" + +#. translator: %s is name of a SQL command, eg CREATE +#: tcop/utility.c:417 +#, c-format +msgid "cannot execute %s in a read-only transaction" +msgstr "" + +#. translator: %s is name of a SQL command, eg CREATE +#: 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:454 +#, c-format +msgid "cannot execute %s during recovery" +msgstr "აღდგენის დროს %s შესრულება შეუძლებელია" + +#. translator: %s is name of a SQL command, eg PREPARE +#: tcop/utility.c:472 +#, c-format +msgid "cannot execute %s within security-restricted operation" +msgstr "" + +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "ფონის პროცესში %s-ის შესრულება შეუძლებელია" + +#: tcop/utility.c:953 +#, c-format +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "\"COPY\"-ის ფაილში ჩასაწერად ზემომხმარებლის ან pg_write_server_files როლის პრივილეგიებია საჭირო" + +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 +#, c-format +msgid "multiple DictFile parameters" +msgstr "გამეორებადი DictFile პარამეტრი" + +#: tsearch/dict_ispell.c:63 +#, c-format +msgid "multiple AffFile parameters" +msgstr "გამეორებადი AffFile პარამეტრი" + +#: tsearch/dict_ispell.c:82 +#, c-format +msgid "unrecognized Ispell parameter: \"%s\"" +msgstr "უცნობი lspell-ის პარამეტრი: \"%s\"" + +#: tsearch/dict_ispell.c:96 +#, c-format +msgid "missing AffFile parameter" +msgstr "აკლია პარამეტრი AffFile" + +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 +#, c-format +msgid "missing DictFile parameter" +msgstr "აკლია პარამეტრი DictFile" + +#: tsearch/dict_simple.c:58 +#, c-format +msgid "multiple Accept parameters" +msgstr "გამეორებადი Accept პარამეტრი" + +#: tsearch/dict_simple.c:66 +#, c-format +msgid "unrecognized simple dictionary parameter: \"%s\"" +msgstr "უცნობი მარტივი ლექსიკონის პარამეტრი: \"%s\"" + +#: tsearch/dict_synonym.c:118 +#, c-format +msgid "unrecognized synonym parameter: \"%s\"" +msgstr "უცნობი სინონიმის პარამეტრი: \"%s\"" + +#: tsearch/dict_synonym.c:125 +#, c-format +msgid "missing Synonyms parameter" +msgstr "აკლია პარამეტრი Synonyms" + +#: tsearch/dict_synonym.c:132 +#, c-format +msgid "could not open synonym file \"%s\": %m" +msgstr "სინონიმს ფაილი \"%s\" ვერ გავხსენი: %m" + +#: tsearch/dict_thesaurus.c:179 +#, c-format +msgid "could not open thesaurus file \"%s\": %m" +msgstr "განმარტებითი ლექსიკონის ფაილი \"%s\" ვერ გავხსენი: %m" + +#: tsearch/dict_thesaurus.c:212 +#, c-format +msgid "unexpected delimiter" +msgstr "მოულოდნელი გამყოფი" + +#: tsearch/dict_thesaurus.c:262 tsearch/dict_thesaurus.c:278 +#, c-format +msgid "unexpected end of line or lexeme" +msgstr "" + +#: tsearch/dict_thesaurus.c:287 +#, c-format +msgid "unexpected end of line" +msgstr "ხაზის მოულოდნელი დასასრული" + +#: tsearch/dict_thesaurus.c:292 +#, c-format +msgid "too many lexemes in thesaurus entry" +msgstr "" + +#: tsearch/dict_thesaurus.c:416 +#, c-format +msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:422 +#, c-format +msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:425 +#, c-format +msgid "Use \"?\" to represent a stop word within a sample phrase." +msgstr "" + +#: tsearch/dict_thesaurus.c:567 +#, c-format +msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:574 +#, c-format +msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:586 +#, c-format +msgid "thesaurus substitute phrase is empty (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:624 +#, c-format +msgid "multiple Dictionary parameters" +msgstr "განმეორებადი პარამეტრი Dictionary" + +#: tsearch/dict_thesaurus.c:631 +#, c-format +msgid "unrecognized Thesaurus parameter: \"%s\"" +msgstr "გამოუცნობი განმარტებითი ლექსიკონის პარამეტრი: \"%s\"" + +#: tsearch/dict_thesaurus.c:643 +#, c-format +msgid "missing Dictionary parameter" +msgstr "აკლია პარამეტრი Dictionary" + +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 tsearch/spell.c:1063 +#, c-format +msgid "invalid affix flag \"%s\"" +msgstr "აფიქსის არასწორი ალამი: %s" + +#: tsearch/spell.c:385 tsearch/spell.c:1067 +#, c-format +msgid "affix flag \"%s\" is out of range" +msgstr "აფიქსის ალამი დიაპაზონს გარეთაა: %s" + +#: tsearch/spell.c:415 +#, c-format +msgid "invalid character in affix flag \"%s\"" +msgstr "არასწორი სიმბოლო აფიქსის ალამში: %s" + +#: tsearch/spell.c:435 +#, c-format +msgid "invalid affix flag \"%s\" with \"long\" flag value" +msgstr "აფიქსის არასწორი ალამი \"%s\" ალამის მნიშვნელობით \"long\"" + +#: tsearch/spell.c:525 +#, c-format +msgid "could not open dictionary file \"%s\": %m" +msgstr "ლექსიკონის ფაილის (%s) გახსნის შეცდომა: %m" + +#: tsearch/spell.c:764 utils/adt/regexp.c:209 +#, c-format +msgid "invalid regular expression: %s" +msgstr "არასწორი რეგულარული გამოსახულება: %s" + +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 tsearch/spell.c:1767 tsearch/spell.c:1772 +#, c-format +msgid "invalid affix alias \"%s\"" +msgstr "აფისქსის არასწორი მეტსახელი: %s" + +#: tsearch/spell.c:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 +#, c-format +msgid "could not open affix file \"%s\": %m" +msgstr "აფიქსის ფაილის (%s) გახსნის შეცდომა: %m" + +#: tsearch/spell.c:1297 +#, c-format +msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" +msgstr "" + +#: tsearch/spell.c:1341 +#, c-format +msgid "invalid number of flag vector aliases" +msgstr "ალმის ვექტორის მეტსახელების არასწორი რიცხვი" + +#: tsearch/spell.c:1364 +#, c-format +msgid "number of aliases exceeds specified number %d" +msgstr "მეტსახელების რიცხვი მითითებულ მნიშვნელობაზე მეტია: %d" + +#: tsearch/spell.c:1579 +#, c-format +msgid "affix file contains both old-style and new-style commands" +msgstr "აფიქსის ფაილი ორივე, ახალი და ძველი სტილის ბრძანებებს შეიცავს" + +#: 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 "სტრიქონი tsvector-ისთვის ძალიანგრძელია (%d ბაიტი, მაქს %d ბაიტი)" + +#: tsearch/ts_locale.c:223 +#, c-format +msgid "line %d of configuration file \"%s\": \"%s\"" +msgstr "კონფიგურაციის ფაილის \"%2$s\" %1$d-ე ხაზზე: \"%3$s\"" + +#: tsearch/ts_locale.c:302 +#, c-format +msgid "conversion from wchar_t to server encoding failed: %m" +msgstr "" + +#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 tsearch/ts_parse.c:579 +#, c-format +msgid "word is too long to be indexed" +msgstr "სიტყვა ძალიან გრძელია, რომ დაინდექსდეს" + +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 tsearch/ts_parse.c:580 +#, c-format +msgid "Words longer than %d characters are ignored." +msgstr "%d სიმბოლოზე გრძელი სიტყვები იგნორირდება." + +#: tsearch/ts_utils.c:51 +#, c-format +msgid "invalid text search configuration file name \"%s\"" +msgstr "ტექსტის ძებნის კონფიგურაციის ფაილის არასწორი სახელი: \"%s\"" + +#: tsearch/ts_utils.c:83 +#, c-format +msgid "could not open stop-word file \"%s\": %m" +msgstr "" + +#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#, c-format +msgid "text search parser does not support headline creation" +msgstr "" + +#: tsearch/wparser_def.c:2592 +#, c-format +msgid "unrecognized headline parameter: \"%s\"" +msgstr "" + +#: tsearch/wparser_def.c:2611 +#, c-format +msgid "MinWords should be less than MaxWords" +msgstr "MinWords MaxWords-ზე ნაკლები უნდა იყოს" + +#: tsearch/wparser_def.c:2615 +#, c-format +msgid "MinWords should be positive" +msgstr "MinWords დადებით უნდა იყოს" + +#: tsearch/wparser_def.c:2619 +#, c-format +msgid "ShortWord should be >= 0" +msgstr "ShortWord >= 0 უნდა იყოს" + +#: tsearch/wparser_def.c:2623 +#, c-format +msgid "MaxFragments should be >= 0" +msgstr "MaxFragments >= 0 უნდა იყოს" + +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "" + +#: utils/activity/pgstat.c:1226 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "სტატისტიკის არასწორი ტიპი: \"%s\"" + +#: utils/activity/pgstat.c:1306 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "სტატისტიკის დროებითი ფაილის (\"%s\") გახსნა შეუძლებელია: %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "სტატისტიკის დროებითი ფაილში (\"%s\") ჩაწერა შეუძლებელია: %m" + +#: utils/activity/pgstat.c:1421 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "სტატისტიკის დროებითი ფაილის (\"%s\") დახურვა შეუძლებელია: %m" + +#: utils/activity/pgstat.c:1429 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "სტატისტიკის დროებითი ფაილის \"%s\"-დან \"%s\" -მდე სახელის გადარქმევა შეუძლებელია: %m" + +#: utils/activity/pgstat.c:1478 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "სტატისტიკის ფაილის (\"%s\") გახსნა შეუძლებელია: %m" + +#: utils/activity/pgstat.c:1634 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "სტატისტიკის დაზიანებული ფაილი \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "ფუნქცია წაშლილ ფუნქციას იძახებს" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 +#, c-format +msgid "identifier too long" +msgstr "იდენტიფიკატორი ძალიან გრძელია" + +#: utils/adt/acl.c:169 utils/adt/name.c:94 +#, c-format +msgid "Identifier must be less than %d characters." +msgstr "" + +#: utils/adt/acl.c:252 +#, c-format +msgid "unrecognized key word: \"%s\"" +msgstr "უცნობი საკვანძო სიტყვა: \"%s\"" + +#: utils/adt/acl.c:253 +#, c-format +msgid "ACL key word must be \"group\" or \"user\"." +msgstr "ACL-ის საკვანძო სიტყვა უნდა იყოს \"group\" ან \"user\"." + +#: utils/adt/acl.c:258 +#, c-format +msgid "missing name" +msgstr "სახელი აკლია" + +#: utils/adt/acl.c:259 +#, c-format +msgid "A name must follow the \"group\" or \"user\" key word." +msgstr "" + +#: utils/adt/acl.c:265 +#, c-format +msgid "missing \"=\" sign" +msgstr "აკლია \"=\" ნიშანი" + +#: utils/adt/acl.c:324 +#, c-format +msgid "invalid mode character: must be one of \"%s\"" +msgstr "არასწორი რეჟიმის სიმბოლო: უნდა იყოს ერთ-ერთი სიიდან \"%s\"" + +#: utils/adt/acl.c:346 +#, c-format +msgid "a name must follow the \"/\" sign" +msgstr "\"/\" სიმბოლოს სახელი უნდა მოჰყვებოდეს" + +#: utils/adt/acl.c:354 +#, c-format +msgid "defaulting grantor to user ID %u" +msgstr "" + +#: utils/adt/acl.c:540 +#, c-format +msgid "ACL array contains wrong data type" +msgstr "ACL-ის მასივი მონაცემების არასწორ ტიპს შეიცავს" + +#: utils/adt/acl.c:544 +#, c-format +msgid "ACL arrays must be one-dimensional" +msgstr "ACL-ის მასივები ერთგანზომილებიანი უნდა იყოს" + +#: utils/adt/acl.c:548 +#, c-format +msgid "ACL arrays must not contain null values" +msgstr "ACL-ის მასივები ნულოვან მნიშვნელობებს არ უნდა შეიცავდეს" + +#: utils/adt/acl.c:572 +#, c-format +msgid "extra garbage at the end of the ACL specification" +msgstr "" + +#: utils/adt/acl.c:1214 +#, c-format +msgid "grant options cannot be granted back to your own grantor" +msgstr "" + +#: utils/adt/acl.c:1275 +#, c-format +msgid "dependent privileges exist" +msgstr "დამოკიდებული პრივილეგიები არსებობს" + +#: utils/adt/acl.c:1276 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "მათ გასაუქმებლადაც CASCADE გამოიყენეთ." + +#: utils/adt/acl.c:1530 +#, c-format +msgid "aclinsert is no longer supported" +msgstr "aclinsert მხარდაჭერილი აღარაა" + +#: utils/adt/acl.c:1540 +#, c-format +msgid "aclremove is no longer supported" +msgstr "aclremove მხარდაჭერილი აღარაა" + +#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 +#, c-format +msgid "unrecognized privilege type: \"%s\"" +msgstr "პრივილეგიის უცნობი ტიპი \"%s\"" + +#: 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:5008 +#, c-format +msgid "must be member of role \"%s\"" +msgstr "უნდა იყოს როლის (%s) ნაწილი" + +#: 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:1114 utils/adt/jsonb.c:1143 utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 +#, c-format +msgid "could not determine input data type" +msgstr "შეყვანილი მონაცემების ტიპის განსაზღვრა შეუძლებელია" + +#: utils/adt/array_userfuncs.c:85 +#, c-format +msgid "input data type is not an array" +msgstr "შემოტანის მონაცემების ტიპი მასივი არაა" + +#: 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:777 utils/adt/int.c:799 utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 utils/adt/int.c:1262 +#: utils/adt/int.c:1330 utils/adt/int.c:1336 utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 utils/adt/varlena.c:3391 +#, c-format +msgid "integer out of range" +msgstr "მთელი მნიშვნელობა დიაპაზონს გარეთაა" + +#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#, c-format +msgid "argument must be empty or one-dimensional array" +msgstr "არგუმენტი ცარიელი ან ერთგანზომილებიანი მასივი უნდა იყოს" + +#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 utils/adt/array_userfuncs.c:406 +#, c-format +msgid "cannot concatenate incompatible arrays" +msgstr "" + +#: utils/adt/array_userfuncs.c:274 +#, c-format +msgid "Arrays with element types %s and %s are not compatible for concatenation." +msgstr "%s და %s ტიპის ელემენტების მქონე მასივები შერწყმისთვის თავსებადები არ არიან." + +#: utils/adt/array_userfuncs.c:313 +#, c-format +msgid "Arrays of %d and %d dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:350 +#, c-format +msgid "Arrays with differing element dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#, c-format +msgid "Arrays with differing dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:816 +#, c-format +msgid "searching for elements in multidimensional arrays is not supported" +msgstr "" + +#: utils/adt/array_userfuncs.c:691 +#, c-format +msgid "initial position must not be null" +msgstr "საწყისი მდებარეობა ნულოვან ვერ იქნება" + +#: 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 "" + +#: utils/adt/arrayfuncs.c:272 +#, c-format +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "" + +#: utils/adt/arrayfuncs.c:286 +#, c-format +msgid "Missing array dimension value." +msgstr "აკლია მასივის განზომილების მნიშვნელობა." + +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#, c-format +msgid "Missing \"%s\" after array dimensions." +msgstr "მასივის განზომილებების შემდეგ აკლია \"%s\"." + +#: utils/adt/arrayfuncs.c:306 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 "" + +#: utils/adt/arrayfuncs.c:319 +#, c-format +msgid "Array value must start with \"{\" or dimension information." +msgstr "მასივის მნიშვნელობა \"{\"-ით ან მასივის ინფორმაციით უნდა იწყებოდეს." + +#: utils/adt/arrayfuncs.c:348 +#, c-format +msgid "Array contents must start with \"{\"." +msgstr "მასივის შემცველობა \"{\"-ით უნდა დაიწყოს." + +#: 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: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: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:536 utils/adt/arrayfuncs.c:659 +#, c-format +msgid "Unexpected array element." +msgstr "მასივის მოულოდნელი ელემენტი." + +#: utils/adt/arrayfuncs.c:594 +#, c-format +msgid "Unmatched \"%c\" character." +msgstr "სიმბოლო \"%c\" არ ემთხვევა." + +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2490 +#, c-format +msgid "Multidimensional arrays must have sub-arrays with matching dimensions." +msgstr "მრავალგანზომილებიან მასივებს უნდა ჰქონდეთ ქვე-მასივები იგივე ზომებით." + +#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 +#, c-format +msgid "Junk after closing right brace." +msgstr "ნაგავი დამხურავი მარჯვენა ფრჩხილის შემდეგ." + +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 utils/adt/arrayfuncs.c:5883 +#, c-format +msgid "invalid number of dimensions: %d" +msgstr "განზომილებების არასწორი რაოდენობა: %d" + +#: utils/adt/arrayfuncs.c:1312 +#, c-format +msgid "invalid array flags" +msgstr "მასივის არასწორი ალმები" + +#: utils/adt/arrayfuncs.c:1334 +#, c-format +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "" + +#: 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 "" + +#: utils/adt/arrayfuncs.c:1518 +#, c-format +msgid "improper binary format in array element %d" +msgstr "" + +#: 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 "" + +#: utils/adt/arrayfuncs.c:2078 +#, c-format +msgid "slices of fixed-length arrays not implemented" +msgstr "" + +#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5869 utils/adt/arrayfuncs.c:5895 utils/adt/arrayfuncs.c:5906 utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 +#, c-format +msgid "wrong number of array subscripts" +msgstr "მასივის ქვესკრიპტების არასწორი რაოდენობა" + +#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#, c-format +msgid "array subscript out of range" +msgstr "მასივის ინდექსი დიაპაზონს გარეთაა" + +#: utils/adt/arrayfuncs.c:2266 +#, c-format +msgid "cannot assign null value to an element of a fixed-length array" +msgstr "" + +#: utils/adt/arrayfuncs.c:2834 +#, c-format +msgid "updates on slices of fixed-length arrays not implemented" +msgstr "" + +#: utils/adt/arrayfuncs.c:2865 +#, c-format +msgid "array slice subscript must provide both boundaries" +msgstr "" + +#: 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:2877 utils/adt/arrayfuncs.c:2973 +#, c-format +msgid "source array too small" +msgstr "საწყისი მასივი ძალიან პატარაა" + +#: utils/adt/arrayfuncs.c:3527 +#, c-format +msgid "null array element not allowed in this context" +msgstr "ნულოვანი მასივის ელემენტი ამ კონტექსტში დაშვებული არაა" + +#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 utils/adt/arrayfuncs.c:4191 +#, c-format +msgid "cannot compare arrays of different element types" +msgstr "განსხვავებული ელემენტის ტიპების მქონე მასივების შედარება შეუძლებელია" + +#: utils/adt/arrayfuncs.c:3978 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 "ტიპისთვის \"%s\" ჰეშის ფუნქცია ვერ ვიპოვე" + +#: utils/adt/arrayfuncs.c:4106 utils/adt/rowtypes.c:1979 +#, c-format +msgid "could not identify an extended hash function for type %s" +msgstr "ტიპისთვის \"%s\" გაფართოებული ჰეშის ფუნქცია ვერ ვიპოვე" + +#: utils/adt/arrayfuncs.c:5283 +#, c-format +msgid "data type %s is not an array type" +msgstr "მონაცემის ტიპი %s მასივის ტიპი არაა" + +#: utils/adt/arrayfuncs.c:5338 +#, c-format +msgid "cannot accumulate null arrays" +msgstr "ნულოვანი მასივების დაგროვება შეუძლებელია" + +#: utils/adt/arrayfuncs.c:5366 +#, c-format +msgid "cannot accumulate empty arrays" +msgstr "ცარიელი მასივების დაგროვება შეუძლებელია" + +#: utils/adt/arrayfuncs.c:5393 utils/adt/arrayfuncs.c:5399 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "სხვადასხვა განსაზღვრების მქონე მასივების შეგროვება შეუძლებელია" + +#: utils/adt/arrayfuncs.c:5767 utils/adt/arrayfuncs.c:5807 +#, c-format +msgid "dimension array or low bound array cannot be null" +msgstr "" + +#: utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 +#, c-format +msgid "Dimension array must be one dimensional." +msgstr "განზომილების მასივი ერთგანზომილებიანი უნდა იყოს." + +#: utils/adt/arrayfuncs.c:5875 utils/adt/arrayfuncs.c:5901 +#, c-format +msgid "dimension values cannot be null" +msgstr "განზომილების მნიშვნელობები ნულოვანი ვერ იქნება" + +#: utils/adt/arrayfuncs.c:5907 +#, c-format +msgid "Low bound array has different size than dimensions array." +msgstr "" + +#: utils/adt/arrayfuncs.c:6185 +#, c-format +msgid "removing elements from multidimensional arrays is not supported" +msgstr "" + +#: utils/adt/arrayfuncs.c:6462 +#, c-format +msgid "thresholds must be one-dimensional array" +msgstr "" + +#: utils/adt/arrayfuncs.c:6467 +#, c-format +msgid "thresholds array must not contain NULLs" +msgstr "" + +#: utils/adt/arrayfuncs.c:6700 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "მასივის ქვესკრიპტის ტიპი integer უნდა ჰქონდეს" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "" + +#: 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:245 +#, c-format +msgid "typmod array must be one-dimensional" +msgstr "typmod ტიპის მასივი ერთგანზომილებიანი უნდა იყოს" + +#: utils/adt/arrayutils.c:250 +#, c-format +msgid "typmod array must not contain nulls" +msgstr "typmod ტიპის მასივი ნულოვან მონაცემებს არ შეიძლება, შეიცავდეს" + +#: utils/adt/ascii.c:76 +#, c-format +msgid "encoding conversion from %s to ASCII not supported" +msgstr "" + +#. translator: first %s is inet or cidr +#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4050 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:4607 utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 +#, c-format +msgid "invalid input syntax for type %s: \"%s\"" +msgstr "არასწორი შეყვანის სინტაქსი ტიპისთვის %s: \"%s\"" + +#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 utils/adt/cash.c:289 utils/adt/int.c:179 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 "" + +#: 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:842 utils/adt/int.c:958 utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 +#, c-format +msgid "division by zero" +msgstr "ნულზე გაყოფა" + +#: utils/adt/char.c:196 +#, c-format +msgid "\"char\" out of range" +msgstr "\"char\" დიაპაზონს გარეთაა" + +#: 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:75 +#, c-format +msgid "TIME(%d)%s precision must not be negative" +msgstr "TIME(%d)%s-ის სიზუსტე უარყოფით არ უნდა იყოს" + +#: utils/adt/date.c:81 +#, c-format +msgid "TIME(%d)%s precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4299 utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 utils/adt/formatting.c:4424 +#, c-format +msgid "date out of range: \"%s\"" +msgstr "თარიღი დიაპაზონს გარეთაა: \"%s\"" + +#: 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: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: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:488 +#, c-format +msgid "cannot subtract infinite dates" +msgstr "უსასრულო თარიღების გამოკლება შეუძლებელია" + +#: 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: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 +#, 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: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 +#, 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:4141 utils/adt/formatting.c:4177 utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 utils/adt/json.c:457 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 "დროის შტამპი დიაპაზონს გარეთაა" + +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 +#, c-format +msgid "time out of range" +msgstr "დროის მნიშვნელობა დიაპაზონს გარეთაა" + +#: 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:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 utils/adt/float.c:1124 utils/adt/int.c:634 utils/adt/int.c:681 utils/adt/int.c:716 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 "" + +#: utils/adt/date.c:2334 +#, c-format +msgid "time zone displacement out of range" +msgstr "დროის სარტყლის წანაცვლება დიაპაზონს გარეთაა" + +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 utils/adt/datetime.c:4898 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 "უცნობი დროის სარტყელი: %s" + +#: 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 "ინტერვალის დროის სარტყელი \"%s\" თვეებს ან დღეებს არ უნდა შეიცავდეს" + +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 +#, c-format +msgid "date/time field value out of range: \"%s\"" +msgstr "დროის/თარიღის ველის მნიშვნელობა დიაპაზონს გარეთაა: \"%s\"" + +#: utils/adt/datetime.c:4032 +#, c-format +msgid "Perhaps you need a different \"datestyle\" setting." +msgstr "" + +#: utils/adt/datetime.c:4037 +#, c-format +msgid "interval field value out of range: \"%s\"" +msgstr "ინტერვალის ველის მნიშვნელობა დიაპაზონს გარეთაა: \"%s\"" + +#: utils/adt/datetime.c:4043 +#, c-format +msgid "time zone displacement out of range: \"%s\"" +msgstr "" + +#: utils/adt/datetime.c:4900 +#, c-format +msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." +msgstr "" + +#: utils/adt/datum.c:90 utils/adt/datum.c:102 +#, c-format +msgid "invalid Datum pointer" +msgstr "არასწორი მაჩვენებელი: Datum" + +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 +#, c-format +msgid "invalid size: \"%s\"" +msgstr "არასწორი ზომა: %s" + +#: utils/adt/dbsize.c:814 +#, c-format +msgid "Invalid size unit: \"%s\"." +msgstr "ერთეულის არასწორი ზომა: \"%s\"." + +#: utils/adt/dbsize.c:815 +#, c-format +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "პარამეტრის სწორი ერთეულებია \"ბ\", \"კბ\", \"მბ\", \"გბ\" და \"ტბ\"." + +#: utils/adt/domains.c:92 +#, c-format +msgid "type %s is not a domain" +msgstr "ტიპი \"%s\" დომენი არაა" + +#: utils/adt/encode.c:65 utils/adt/encode.c:113 +#, c-format +msgid "unrecognized encoding: \"%s\"" +msgstr "უცნობი კოდირება \"%s\"" + +#: utils/adt/encode.c:79 +#, c-format +msgid "result of encoding conversion is too large" +msgstr "დაშიფვრის შედეგი ძალიან დიდია" + +#: utils/adt/encode.c:127 +#, c-format +msgid "result of decoding conversion is too large" +msgstr "გაშიფვრის შედეგი ძალიან დიდია" + +#: utils/adt/encode.c:186 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "არასწორი თექვსმეტობითი რიცხვი: \"%.*s\"" + +#: utils/adt/encode.c:216 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "არასწორი თექვსმეტობითი მონაცემები: ციფრების კენტი რაოდენობა" + +#: utils/adt/encode.c:334 +#, c-format +msgid "unexpected \"=\" while decoding base64 sequence" +msgstr "base64 მიმდევრობის გაშიფვრისას აღმოჩენილია მოულოდნელი \"=\"" + +#: utils/adt/encode.c:346 +#, c-format +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "base64 მიმდევრობის გაშიფვრისას აღმოჩენილია არასწორი სიმბოლო \"%.*s\"" + +#: utils/adt/encode.c:367 +#, c-format +msgid "invalid base64 end sequence" +msgstr "base64-ის არასწორი დასრულების მიმდევრობა" + +#: utils/adt/encode.c:368 +#, c-format +msgid "Input data is missing padding, is truncated, or is otherwise corrupted." +msgstr "" + +#: utils/adt/enum.c:99 +#, c-format +msgid "unsafe use of new value \"%s\" of enum type %s" +msgstr "" + +#: utils/adt/enum.c:102 +#, c-format +msgid "New enum values must be committed before they can be used." +msgstr "" + +#: 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: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: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:453 utils/adt/enum.c:482 +#, c-format +msgid "enum %s contains no values" +msgstr "ჩამონათვალი %s მნიშვნელობებს არ შეიცავს" + +#: utils/adt/float.c:89 +#, c-format +msgid "value out of range: overflow" +msgstr "მნიშვნელობა დიაპაზონს გარეთაა: გადავსება" + +#: utils/adt/float.c:97 +#, c-format +msgid "value out of range: underflow" +msgstr "მნიშვნელობა დიაპაზონს გარეთაა: არავსება" + +#: utils/adt/float.c:266 +#, c-format +msgid "\"%s\" is out of range for type real" +msgstr "%s დიაპაზონს გარეთაა ტიპისთვის: real" + +#: utils/adt/float.c:478 +#, c-format +msgid "\"%s\" is out of range for type double precision" +msgstr "%s დიაპაზონს გარეთაა ტიპისთვის: double precision" + +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 +#, c-format +msgid "smallint out of range" +msgstr "smallint დიაპაზონს გარეთაა" + +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 +#, c-format +msgid "cannot take square root of a negative number" +msgstr "უარყოფითი რიცხვიდან ფესვის ამოღება შეუძლებელია" + +#: 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 "ნული უარყოფით ხარისხში განუსაზღვრელია" + +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 +#, c-format +msgid "a negative number raised to a non-integer power yields a complex result" +msgstr "" + +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 utils/adt/numeric.c:10181 +#, c-format +msgid "cannot take logarithm of zero" +msgstr "ნულის ლოგარითმის აღება შეუძლებელია" + +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 +#, c-format +msgid "cannot take logarithm of a negative number" +msgstr "უარყოფითი რიცხვის ლოგარითმის აღება შეუძლებელია" + +#: 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:2796 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "" + +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 +#, c-format +msgid "count must be greater than zero" +msgstr "რაოდენობა ნულზე მეტი უნდა იყოს" + +#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 +#, c-format +msgid "operand, lower bound, and upper bound cannot be NaN" +msgstr "" + +#: 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:4069 utils/adt/numeric.c:1800 +#, c-format +msgid "lower bound cannot equal upper bound" +msgstr "ქვედა ზღვარი ზედა ზღვარის ტოლი ვერ იქნება" + +#: utils/adt/formatting.c:561 +#, c-format +msgid "invalid format specification for an interval value" +msgstr "ინტერვალის მნიშვნელობის ფორმატის არასწორი სპეციფიკაცია" + +#: utils/adt/formatting.c:562 +#, c-format +msgid "Intervals are not tied to specific calendar dates." +msgstr "" + +#: utils/adt/formatting.c:1192 +#, c-format +msgid "\"EEEE\" must be the last pattern used" +msgstr "\"EEEE\" ბოლო გამოყენებული შაბლონი უნდა იყოს" + +#: utils/adt/formatting.c:1200 +#, c-format +msgid "\"9\" must be ahead of \"PR\"" +msgstr "\"9\" \"PR\"-ზე წინ უნდა იყოს" + +#: utils/adt/formatting.c:1216 +#, c-format +msgid "\"0\" must be ahead of \"PR\"" +msgstr "\"0\" \"PR\"-ზე წინ უნდა იყოს" + +#: utils/adt/formatting.c:1243 +#, c-format +msgid "multiple decimal points" +msgstr "ბევრი ათობითი წერტილი" + +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 +#, c-format +msgid "cannot use \"V\" and decimal point together" +msgstr "\"V\"-ს და ათობით წერტილს ერთად ვერ გამოიყენებთ" + +#: utils/adt/formatting.c:1259 +#, c-format +msgid "cannot use \"S\" twice" +msgstr "\"S\"-ს ორჯერ ვერ გამოიყენებთ" + +#: utils/adt/formatting.c:1263 +#, c-format +msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" +msgstr "\"S\"-ის და \"PL\"/\"MI\"/\"SG\"/\"PR\"-ის ერთად გამოყენება შეუძლებელია" + +#: utils/adt/formatting.c:1283 +#, c-format +msgid "cannot use \"S\" and \"MI\" together" +msgstr "\"S\"-ის და \"MI\"-ის ერთად გამოყენება შეუძლებელია" + +#: utils/adt/formatting.c:1293 +#, c-format +msgid "cannot use \"S\" and \"PL\" together" +msgstr "\"S\"-ის და \"PL\"-ის ერთად გამოყენება შეუძლებელია" + +#: utils/adt/formatting.c:1303 +#, c-format +msgid "cannot use \"S\" and \"SG\" together" +msgstr "\"S\"-ის და \"SG\"-ის ერთად გამოყენება შეუძლებელია" + +#: utils/adt/formatting.c:1312 +#, c-format +msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" +msgstr "\"PR\"-ის და \"S\"/\"PL\"/\"MI\"/\"SG\"-ის ერთად გამოყენება შეუძლებელია" + +#: utils/adt/formatting.c:1338 +#, c-format +msgid "cannot use \"EEEE\" twice" +msgstr "\"EEEE\"-ს ორჯერ ვერ გამოყენებთ" + +#: utils/adt/formatting.c:1344 +#, c-format +msgid "\"EEEE\" is incompatible with other formats" +msgstr "\"EEEE\" სხვა ფორმატებთან შეუთავსებელია" + +#: utils/adt/formatting.c:1345 +#, c-format +msgid "\"EEEE\" may only be used together with digit and decimal point patterns." +msgstr "" + +#: utils/adt/formatting.c:1429 +#, c-format +msgid "invalid datetime format separator: \"%s\"" +msgstr "თარიღი/დროის არასწორი გამყოფი: \"%s\"" + +#: utils/adt/formatting.c:1556 +#, c-format +msgid "\"%s\" is not a number" +msgstr "\"%s\" რიცხვი არაა" + +#: utils/adt/formatting.c:1634 +#, c-format +msgid "case conversion failed: %s" +msgstr "სიმბოლოების ზომის გარდაქმნის შეცდომა: %s" + +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 utils/adt/formatting.c:1933 +#, c-format +msgid "could not determine which collation to use for %s function" +msgstr "" + +#: utils/adt/formatting.c:2314 +#, c-format +msgid "invalid combination of date conventions" +msgstr "თარიღის გარდაქმნის არასწორი კომბინაცია" + +#: utils/adt/formatting.c:2315 +#, c-format +msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." +msgstr "" + +#: utils/adt/formatting.c:2338 +#, c-format +msgid "conflicting values for \"%s\" field in formatting string" +msgstr "" + +#: utils/adt/formatting.c:2341 +#, c-format +msgid "This value contradicts a previous setting for the same field type." +msgstr "ეს მნიშვნელობა იგივე ველის ტიპისთვის წინა პარამეტრს ეწინააღმდეგება." + +#: utils/adt/formatting.c:2412 +#, c-format +msgid "source string too short for \"%s\" formatting field" +msgstr "" + +#: utils/adt/formatting.c:2415 +#, c-format +msgid "Field requires %d characters, but only %d remain." +msgstr "ველს %d სიმბოლო სჭირდება, მაგრამ მხოლოდ %d-ღაა დარჩენილი." + +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 +#, c-format +msgid "If your source string is not fixed-width, try using the \"FM\" modifier." +msgstr "" + +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 utils/adt/formatting.c:2665 +#, c-format +msgid "invalid value \"%s\" for \"%s\"" +msgstr "მნიშვნელობა \"%s\" \"%s\"-თვის არასწორია" + +#: utils/adt/formatting.c:2430 +#, c-format +msgid "Field requires %d characters, but only %d could be parsed." +msgstr "" + +#: utils/adt/formatting.c:2444 +#, c-format +msgid "Value must be an integer." +msgstr "მნიშვნელობა მთელი რიცხვი უნდა იყოს." + +#: utils/adt/formatting.c:2449 +#, c-format +msgid "value for \"%s\" in source string is out of range" +msgstr "საწყის სტრიქონში \"%s\"-ის მნიშვნელობა დიაპაზონს გარეთაა" + +#: utils/adt/formatting.c:2451 +#, c-format +msgid "Value must be in the range %d to %d." +msgstr "მნიშვნელობა უნდა იყოს დიაპაზონიდან %d-%d." + +#: utils/adt/formatting.c:2667 +#, c-format +msgid "The given value did not match any of the allowed values for this field." +msgstr "" + +#: utils/adt/formatting.c:2886 utils/adt/formatting.c:2906 utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 +#, c-format +msgid "localized string format value too long" +msgstr "ლოკალიზებული სტრიქონის ფორმატის მნიშვნელობა მეტისმეტად გრძელია" + +#: utils/adt/formatting.c:3373 +#, c-format +msgid "unmatched format separator \"%c\"" +msgstr "" + +#: utils/adt/formatting.c:3434 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "" + +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 +#, c-format +msgid "formatting field \"%s\" is only supported in to_char" +msgstr "" + +#: utils/adt/formatting.c:3715 +#, c-format +msgid "invalid input string for \"Y,YYY\"" +msgstr "არასწორი შეყვანილი სტრიქონი \"Y,YYY\"-სთვის" + +#: utils/adt/formatting.c:3801 +#, c-format +msgid "input string is too short for datetime format" +msgstr "შეყვანილი სტრიქონი datetime ფორმატისთვის მეტისმეტად მოკლეა" + +#: utils/adt/formatting.c:3809 +#, c-format +msgid "trailing characters remain in input string after datetime format" +msgstr "" + +#: utils/adt/formatting.c:4370 +#, c-format +msgid "missing time zone in input string for type timestamptz" +msgstr "" + +#: utils/adt/formatting.c:4376 +#, c-format +msgid "timestamptz out of range" +msgstr "timestamptz დიაპაზონს გარეთაა" + +#: utils/adt/formatting.c:4404 +#, c-format +msgid "datetime format is zoned but not timed" +msgstr "" + +#: utils/adt/formatting.c:4456 +#, c-format +msgid "missing time zone in input string for type timetz" +msgstr "" + +#: utils/adt/formatting.c:4462 +#, c-format +msgid "timetz out of range" +msgstr "timetz დიაპაზონს გარეთაა" + +#: utils/adt/formatting.c:4488 +#, c-format +msgid "datetime format is not dated and not timed" +msgstr "" + +#: utils/adt/formatting.c:4621 +#, c-format +msgid "hour \"%d\" is invalid for the 12-hour clock" +msgstr "საათი \"%d\" არასწორია 12-საათიანი ათვლისთვის" + +#: utils/adt/formatting.c:4623 +#, c-format +msgid "Use the 24-hour clock, or give an hour between 1 and 12." +msgstr "გამოიყენეთ 24-საათიანი ათვლა ან მიუთითეთ საათი დიაპაზონიდან 1-12." + +#: utils/adt/formatting.c:4734 +#, c-format +msgid "cannot calculate day of year without year information" +msgstr "წლის დღის გამოთვლა წლის მითითების გარეშე შეუძლებელია" + +#: utils/adt/formatting.c:5653 +#, c-format +msgid "\"EEEE\" not supported for input" +msgstr "\"EEEE\" შეყვანისთვის მხარდაჭერილი არაა" + +#: utils/adt/formatting.c:5665 +#, c-format +msgid "\"RN\" not supported for input" +msgstr "\"RN\" შეყვანისთვის მხარდაჭერილი არაა" + +#: utils/adt/genfile.c:84 +#, c-format +msgid "absolute path not allowed" +msgstr "აბსოლუტური ბილიკი დაშვებული არაა" + +#: utils/adt/genfile.c:89 +#, c-format +msgid "path must be in or below the current directory" +msgstr "" + +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 utils/adt/oracle_compat.c:1141 +#, c-format +msgid "requested length too large" +msgstr "მოთხოვნილი სიგრძე ძალიან დიდია" + +#: utils/adt/genfile.c:131 +#, c-format +msgid "could not seek in file \"%s\": %m" +msgstr "ფაილში (%s) გადახვევის პრობლემა: %m" + +#: utils/adt/genfile.c:171 +#, c-format +msgid "file length too large" +msgstr "ფალის სიგრძე მეტისმეად დიდია" + +#: utils/adt/genfile.c:248 +#, c-format +msgid "must be superuser to read files with adminpack 1.0" +msgstr "" + +#: 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 "არასწორი ხაზის განსაზღვრება: A და B ორივე ნულის ტოლი ვერ იქნება" + +#: 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:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 utils/adt/geo_ops.c:5210 +#, c-format +msgid "too many points requested" +msgstr "მოთხოვნილია მეტისმეტად ბევრი წერტილი" + +#: utils/adt/geo_ops.c:1472 +#, c-format +msgid "invalid number of points in external \"path\" value" +msgstr "არასწორი წერტილების რაოდენობა გარე ცვლადის \"path\" მნიშვნელობაში" + +#: utils/adt/geo_ops.c:3449 +#, c-format +msgid "invalid number of points in external \"polygon\" value" +msgstr "არასწორი წერტილების რაოდენობა გარე ცვლადის \"polygon\" მნიშვნელობაში" + +#: utils/adt/geo_ops.c:4425 +#, c-format +msgid "open path cannot be converted to polygon" +msgstr "გახსნილ ბილიკს პოლიგონად ვერ გადააკეთებთ" + +#: utils/adt/geo_ops.c:4675 +#, c-format +msgid "invalid radius in external \"circle\" value" +msgstr "არასწორი რადიუსი გარე ცვლადის \"circle\" მნიშვნელობაში" + +#: utils/adt/geo_ops.c:5196 +#, c-format +msgid "cannot convert circle with radius zero to polygon" +msgstr "" + +#: utils/adt/geo_ops.c:5201 +#, c-format +msgid "must request at least 2 points" +msgstr "უნდა მოითხოვოთ სულ ცოტა 2 წერტილი" + +#: utils/adt/int.c:263 +#, c-format +msgid "invalid int2vector data" +msgstr "int2vector -ის არასწორი მონაცემები" + +#: utils/adt/int.c:1528 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 "ბიჯის ზომა ნულის ტოლი ვერ იქნება" + +#: 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:4364 utils/adt/varbit.c:1676 +#, c-format +msgid "bigint out of range" +msgstr "bigint დიაპაზონს გარეთაა" + +#: utils/adt/int8.c:1361 +#, c-format +msgid "OID out of range" +msgstr "OID დიაპაზონს გარეთაა" + +#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#, c-format +msgid "key value must be scalar, not array, composite, or json" +msgstr "" + +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 +#, c-format +msgid "could not determine data type for argument %d" +msgstr "არგუმენტისთვის %d მონაცემების ტიპის განსაზღვრა შეუძლებელია" + +#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 +#, c-format +msgid "field name must not be null" +msgstr "ველის სახელი ნულოვანი ვერ იქნება" + +#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 +#, 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:1179 +#, c-format +msgid "The arguments of %s must consist of alternating keys and values." +msgstr "%s-ის არგუმენტები პარამეტრებისა და მნიშვნელობების მონაცვლეობით სიას უნდა წარმოადგენდეს." + +#: utils/adt/json.c:1028 +#, c-format +msgid "argument %d cannot be null" +msgstr "არგუმენტი %d ნულოვანი ვერ იქნება" + +#: utils/adt/json.c:1029 +#, c-format +msgid "Object keys should be text." +msgstr "ობიექტის გასაღებები ტექსტი უნდა იყოს." + +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 +#, c-format +msgid "array must have two columns" +msgstr "მასივს ორი სვეტი უნდა ჰქონდეს" + +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1428 +#, c-format +msgid "null value not allowed for object key" +msgstr "ობიექტის გასაღებისთვის ნულოვანი მნიშვნელობა დაშვებული არაა" + +#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 +#, c-format +msgid "mismatched array dimensions" +msgstr "მასივის ზომები არ ემთხვევა" + +#: utils/adt/jsonb.c:287 +#, c-format +msgid "string too long to represent as jsonb string" +msgstr "" + +#: utils/adt/jsonb.c:288 +#, c-format +msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." +msgstr "" + +#: utils/adt/jsonb.c:1192 +#, c-format +msgid "argument %d: key must not be null" +msgstr "არგუმენტი %d: გასაღები ნულოვან ვერ იქნება" + +#: utils/adt/jsonb.c:1780 +#, c-format +msgid "object keys must be strings" +msgstr "ობიექტის გასაღებები სტრიქონები უნდა იყოს" + +#: utils/adt/jsonb.c:1943 +#, c-format +msgid "cannot cast jsonb null to type %s" +msgstr "jsonb null-ის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1944 +#, c-format +msgid "cannot cast jsonb string to type %s" +msgstr "jsonb სტრიქონის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1945 +#, c-format +msgid "cannot cast jsonb numeric to type %s" +msgstr "jsonb რიცხვის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1946 +#, c-format +msgid "cannot cast jsonb boolean to type %s" +msgstr "jsonb ლოგიკური მნიშვნელობის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1947 +#, c-format +msgid "cannot cast jsonb array to type %s" +msgstr "jsonb მასივის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1948 +#, c-format +msgid "cannot cast jsonb object to type %s" +msgstr "jsonb ობიექტის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb.c:1949 +#, c-format +msgid "cannot cast jsonb array or object to type %s" +msgstr "jsonb ობიექტის ან მასივის %s-ის ტიპში გადაყვანა შეუძლებელია" + +#: utils/adt/jsonb_util.c:752 +#, c-format +msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" +msgstr "" + +#: utils/adt/jsonb_util.c:793 +#, c-format +msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" +msgstr "" + +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 +#, c-format +msgid "total size of jsonb array elements exceeds the maximum of %u bytes" +msgstr "" + +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 utils/adt/jsonb_util.c:1803 +#, c-format +msgid "total size of jsonb object elements exceeds the maximum of %u bytes" +msgstr "" + +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "" + +#: 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 "" + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "" + +#: 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 "" + +#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 +#, c-format +msgid "cannot call %s on a scalar" +msgstr "%s-ის გამოძახება სკალარზე შეუძლებელია" + +#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 +#, c-format +msgid "cannot call %s on an array" +msgstr "%s-ის გამოძახება მასივზე შეუძლებელია" + +#: utils/adt/jsonfuncs.c:694 +#, c-format +msgid "JSON data, line %d: %s%s%s" +msgstr "JSON მონაცემი, ხაზი %d: %s%s%s" + +#: utils/adt/jsonfuncs.c:1834 utils/adt/jsonfuncs.c:1869 +#, c-format +msgid "cannot get array length of a scalar" +msgstr "სკალარის მასივის სიგრძის მიღება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:1838 utils/adt/jsonfuncs.c:1857 +#, c-format +msgid "cannot get array length of a non-array" +msgstr "არა-მასივის მასივის სიგრძის მიღება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:1931 +#, c-format +msgid "cannot call %s on a non-object" +msgstr "არა-ობიექტზე %s-ის გამოძახება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:2115 +#, c-format +msgid "cannot deconstruct an array as an object" +msgstr "მასივის დეკონსტრუქცია ობიექტად შეუძლებელია" + +#: utils/adt/jsonfuncs.c:2127 +#, c-format +msgid "cannot deconstruct a scalar" +msgstr "სკალარის დეკონსტრუქცია შეუძლებელია" + +#: utils/adt/jsonfuncs.c:2170 +#, c-format +msgid "cannot extract elements from a scalar" +msgstr "სკალარიდან ელემენტების გამოღება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:2174 +#, c-format +msgid "cannot extract elements from an object" +msgstr "ობიექტიდან ელემენტების გამოღება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 +#, c-format +msgid "cannot call %s on a non-array" +msgstr "არა-მასივზე %s-ს ვერ გამოიძახებთ" + +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 +#, c-format +msgid "expected JSON array" +msgstr "მოველოდი JSON მასივს" + +#: utils/adt/jsonfuncs.c:2426 +#, c-format +msgid "See the value of key \"%s\"." +msgstr "იხილეთ მასივის ელემენტი \"%s\"." + +#: utils/adt/jsonfuncs.c:2448 +#, c-format +msgid "See the array element %s of key \"%s\"." +msgstr "იხილეთ მასივის ელემენტი %s გასაღებიდან \"%s\"." + +#: utils/adt/jsonfuncs.c:2454 +#, c-format +msgid "See the array element %s." +msgstr "იხილეთ მასივის ელემენტი %s." + +#: utils/adt/jsonfuncs.c:2489 +#, c-format +msgid "malformed JSON array" +msgstr "დამახინჯებული JSON მასივი" + +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3316 +#, 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:3340 +#, c-format +msgid "could not determine row type for result of %s" +msgstr "%s-ის შედეგის მწკრივის ტიპის დადგენა შეუძლებელია" + +#: utils/adt/jsonfuncs.c:3342 +#, c-format +msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." +msgstr "" + +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "საჭიროა მატერიალიზებული რეჟიმი, მაგრამ ამ კონტექსტში ეს დაუშვებელია" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 +#, c-format +msgid "argument of %s must be an array of objects" +msgstr "%s-ის არგუმენტი ობიექტების მასივს უნდა წარმოადგენდეს" + +#: utils/adt/jsonfuncs.c:3865 +#, c-format +msgid "cannot call %s on an object" +msgstr "%s-ს ობიექტზე ვერ გამოიძახებთ" + +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 utils/adt/jsonfuncs.c:4412 +#, c-format +msgid "cannot delete from scalar" +msgstr "სკალარიდან წაშლა შეუძლებელია" + +#: utils/adt/jsonfuncs.c:4417 +#, c-format +msgid "cannot delete from object using integer index" +msgstr "ობიექტიდან წაშლა მთელი რიცხვის ინდექსის გამოყენებით შეუძლებელია" + +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 +#, c-format +msgid "cannot set path in scalar" +msgstr "სკალარში ბილიკის დაყენება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 +#, c-format +msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" +msgstr "" + +#: utils/adt/jsonfuncs.c:4540 +#, c-format +msgid "JSON value must not be null" +msgstr "JSON მნიშვნელობა ნულოვანი ვერ იქნება" + +#: utils/adt/jsonfuncs.c:4541 +#, c-format +msgid "Exception was raised because null_value_treatment is \"raise_exception\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:4542 +#, c-format +msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." +msgstr "" + +#: utils/adt/jsonfuncs.c:4597 +#, c-format +msgid "cannot delete path in scalar" +msgstr "სკალარში ბილიკის წაშლა შეუძლებელია" + +#: utils/adt/jsonfuncs.c:4813 +#, c-format +msgid "path element at position %d is null" +msgstr "ბილიკის ელემენტი პოზიციაზე %d ნულოვანია" + +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 utils/adt/jsonfuncs.c:4936 +#, c-format +msgid "cannot replace existing key" +msgstr "არსებული გასაღების ჩანაცვლება შეუძლებელია" + +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "" + +#: utils/adt/jsonfuncs.c:4937 +#, c-format +msgid "Try using the function jsonb_set to replace key value." +msgstr "" + +#: utils/adt/jsonfuncs.c:5041 +#, c-format +msgid "path element at position %d is not an integer: \"%s\"" +msgstr "" + +#: utils/adt/jsonfuncs.c:5058 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "" + +#: utils/adt/jsonfuncs.c:5210 +#, c-format +msgid "wrong flag type, only arrays and scalars are allowed" +msgstr "არასწორი ალმის ტიპი. დაშვებულია მხოლოდ მასივები და სკალარები" + +#: utils/adt/jsonfuncs.c:5217 +#, c-format +msgid "flag array element is not a string" +msgstr "ალმის მასივის ელემენტი სტრიქონი არაა" + +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 +#, c-format +msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:5238 +#, c-format +msgid "wrong flag in flag array: \"%s\"" +msgstr "არასწორი ალამი ალმების მასივში: \"%s\"" + +#: utils/adt/jsonpath.c:362 +#, c-format +msgid "@ is not allowed in root expressions" +msgstr "" + +#: utils/adt/jsonpath.c:368 +#, c-format +msgid "LAST is allowed only in array subscripts" +msgstr "" + +#: utils/adt/jsonpath_exec.c:360 +#, 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 "" + +#: utils/adt/jsonpath_exec.c:674 +#, c-format +msgid "JSON object does not contain key \"%s\"" +msgstr "JSON ობიექტი არ შეიცავს გასაღებს \"%s\"" + +#: utils/adt/jsonpath_exec.c:686 +#, c-format +msgid "jsonpath member accessor can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:715 +#, c-format +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:763 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "" + +#: utils/adt/jsonpath_exec.c:820 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:872 +#, c-format +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1006 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1059 +#, c-format +msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1080 +#, c-format +msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1093 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1583 +#, c-format +msgid "left operand of jsonpath operator %s is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1590 +#, c-format +msgid "right operand of jsonpath operator %s is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1658 +#, c-format +msgid "operand of unary jsonpath operator %s is not a numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1756 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1796 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a string" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1899 +#, c-format +msgid "datetime format is not recognized: \"%s\"" +msgstr "datetime-ის ფორმატი უცნობია: \"%s\"" + +#: utils/adt/jsonpath_exec.c:1901 +#, c-format +msgid "Use a datetime template argument to specify the input data format." +msgstr "" + +#: utils/adt/jsonpath_exec.c:1969 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2151 +#, c-format +msgid "could not find jsonpath variable \"%s\"" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2415 +#, c-format +msgid "jsonpath array subscript is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2427 +#, c-format +msgid "jsonpath array subscript is out of integer range" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2604 +#, c-format +msgid "cannot convert value from %s to %s without time zone usage" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2606 +#, c-format +msgid "Use *_tz() function for time zone support." +msgstr "" + +#: utils/adt/levenshtein.c:133 +#, c-format +msgid "levenshtein argument exceeds maximum length of %d characters" +msgstr "" + +#: utils/adt/like.c:160 +#, c-format +msgid "nondeterministic collations are not supported for LIKE" +msgstr "" + +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 +#, c-format +msgid "could not determine which collation to use for ILIKE" +msgstr "" + +#: utils/adt/like.c:201 +#, c-format +msgid "nondeterministic collations are not supported for ILIKE" +msgstr "" + +#: utils/adt/like_match.c:108 utils/adt/like_match.c:168 +#, c-format +msgid "LIKE pattern must not end with escape character" +msgstr "" + +#: 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:787 +#, c-format +msgid "Escape string must be empty or one character." +msgstr "" + +#: utils/adt/like_support.c:1014 +#, c-format +msgid "case insensitive matching not supported on type bytea" +msgstr "" + +#: utils/adt/like_support.c:1115 +#, c-format +msgid "regular-expression matching not supported on type bytea" +msgstr "" + +#: utils/adt/mac.c:101 +#, c-format +msgid "invalid octet value in \"macaddr\" value: \"%s\"" +msgstr "" + +#: utils/adt/mac8.c:563 +#, c-format +msgid "macaddr8 data out of range to convert to macaddr" +msgstr "" + +#: utils/adt/mac8.c:564 +#, c-format +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 "" + +#: 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 "ცხრილების სივრცეში 'global' მონაცემთა ბაზები არასოდეს ყოფილა" + +#: utils/adt/misc.c:238 +#, c-format +msgid "%u is not a tablespace OID" +msgstr "ცხრილების სივრცე OID-ით %u არ არსებობს" + +#: utils/adt/misc.c:457 +msgid "unreserved" +msgstr "რეზერვირებული არაა" + +#: utils/adt/misc.c:461 +msgid "unreserved (cannot be function or type name)" +msgstr "რეზერვირებული არაა (ფუნქციის ან ტიპის სახელი არ შეიძლება იყოს)" + +#: utils/adt/misc.c:465 +msgid "reserved (can be function or type name)" +msgstr "რეზერვირებული (შეიძლება იყოს ფუნქციის ან ტიპის სახელი)" + +#: utils/adt/misc.c:469 +msgid "reserved" +msgstr "რეზერვირებული" + +#: utils/adt/misc.c:480 +msgid "can be bare label" +msgstr "შეიძლება იყოს შიშველი ჭდე" + +#: 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:734 +#, c-format +msgid "String has unclosed double quotes." +msgstr "სტრიქონს დაუხურავი ორმაგი ბრჭყალი გააჩნია." + +#: utils/adt/misc.c:748 +#, c-format +msgid "Quoted identifier must not be empty." +msgstr "" + +#: utils/adt/misc.c:787 +#, c-format +msgid "No valid identifier before \".\"." +msgstr "" + +#: utils/adt/misc.c:793 +#, c-format +msgid "No valid identifier after \".\"." +msgstr "" + +#: utils/adt/misc.c:853 +#, c-format +msgid "log format \"%s\" is not supported" +msgstr "ჟურნალის ფორმატი \"%s\" მხარდაჭერილი არაა" + +#: utils/adt/misc.c:854 +#, c-format +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "" + +#: 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 "" + +#: utils/adt/multirangetypes.c:151 +#, c-format +msgid "Missing left brace." +msgstr "აკლია მარცხენა ფრჩხილი." + +#: utils/adt/multirangetypes.c:193 +#, c-format +msgid "Expected range start." +msgstr "მოველოდი დიაპაზონის დასაწყისს." + +#: 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 "მულტიდიაპაზონიანი მნიშვნელობები ნულოვან მწკრივებს არ შეიძლება შეიცავდეს" + +#: utils/adt/network.c:110 +#, c-format +msgid "invalid cidr value: \"%s\"" +msgstr "cidr-ის არასწორი მნიშვნელობა: %s" + +#: 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: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:209 +#, c-format +msgid "invalid address family in external \"%s\" value" +msgstr "არასწორი მისამართის ოჯახი გარე \"%s\"-ის მნიშვნელობაში" + +#. translator: %s is inet or cidr +#: 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:225 +#, c-format +msgid "invalid length in external \"%s\" value" +msgstr "არასწორი სიგრძე გარე \"%s\"-ის მნიშვნელობაში" + +#: utils/adt/network.c:240 +#, c-format +msgid "invalid external \"cidr\" value" +msgstr "გარე cidr-ს არასწორი მნიშვნელობა" + +#: utils/adt/network.c:336 utils/adt/network.c:359 +#, c-format +msgid "invalid mask length: %d" +msgstr "ნიღბის არასწორი სიგრძე: %d" + +#: utils/adt/network.c:1252 +#, c-format +msgid "could not format cidr value: %m" +msgstr "cird-ის მნიშვნელობის ფორმატის შეცდომა: %m" + +#: utils/adt/network.c:1485 +#, c-format +msgid "cannot merge addresses from different families" +msgstr "სხვადასხვა ოჯახის მისამართების შერწყმა შეუძლებელია" + +#: utils/adt/network.c:1901 +#, c-format +msgid "cannot AND inet values of different sizes" +msgstr "განსხვავებული ზომის მქონე inet-ის მნიშვნელობების AND შეუძლებელია" + +#: utils/adt/network.c:1933 +#, c-format +msgid "cannot OR inet values of different sizes" +msgstr "განსხვავებული ზომის მქონე inet-ის მნიშვნელობების OR შეუძლებელია" + +#: utils/adt/network.c:1994 utils/adt/network.c:2070 +#, c-format +msgid "result is out of range" +msgstr "შედეგი დიაპაზონს გარეთაა" + +#: utils/adt/network.c:2035 +#, c-format +msgid "cannot subtract inet values of different sizes" +msgstr "" + +#: utils/adt/numeric.c:1027 +#, c-format +msgid "invalid sign in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1033 +#, c-format +msgid "invalid scale in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1042 +#, c-format +msgid "invalid digit in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 +#, c-format +msgid "NUMERIC precision %d must be between 1 and %d" +msgstr "" + +#: utils/adt/numeric.c:1262 +#, c-format +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "" + +#: utils/adt/numeric.c:1280 +#, c-format +msgid "invalid NUMERIC type modifier" +msgstr "არასწორი NUMERIC ტიპის მოდიფიკატორი" + +#: utils/adt/numeric.c:1638 +#, c-format +msgid "start value cannot be NaN" +msgstr "საწყისი მნიშვნელობა NaN ვერ იქნება" + +#: utils/adt/numeric.c:1642 +#, c-format +msgid "start value cannot be infinity" +msgstr "საწყისი მნიშვნელობა უსასრულო ვერ იქნება" + +#: utils/adt/numeric.c:1649 +#, c-format +msgid "stop value cannot be NaN" +msgstr "საბოლოო მნიშვნელობა NaN ვერ იქნება" + +#: utils/adt/numeric.c:1653 +#, c-format +msgid "stop value cannot be infinity" +msgstr "საბოლოო მნიშვნელობა უსასრულო ვერ იქნება" + +#: utils/adt/numeric.c:1666 +#, c-format +msgid "step size cannot be NaN" +msgstr "ბიჯის ზომა NaN ვერ იქნება" + +#: utils/adt/numeric.c:1670 +#, c-format +msgid "step size cannot be infinity" +msgstr "ბიჯის ზომა უსასრულო ვერ იქნება" + +#: utils/adt/numeric.c:3551 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "უასრყოფითი რიცხვის ფაქტორიალი გაურკვეველია" + +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 utils/adt/numeric.c:10662 +#, c-format +msgid "value overflows numeric format" +msgstr "მნიშვნელობა გადაავსებს რიცხვის ფორმატს" + +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 utils/adt/numeric.c:4586 +#, c-format +msgid "cannot convert NaN to %s" +msgstr "\"NaN\"-ის %s-ში გადაყვანა შეუძლებელია" + +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 utils/adt/numeric.c:4590 +#, c-format +msgid "cannot convert infinity to %s" +msgstr "უსასრულობის %s-ში გადაყვანა შეუძლებელია" + +#: utils/adt/numeric.c:4599 +#, c-format +msgid "pg_lsn out of range" +msgstr "pg_lsn დიაპაზონს გარეთაა" + +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 +#, c-format +msgid "numeric field overflow" +msgstr "რიცხვითი ველის გადავსება" + +#: utils/adt/numeric.c:7548 +#, c-format +msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." +msgstr "" + +#: utils/adt/numeric.c:7594 +#, c-format +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "" + +#: utils/adt/oid.c:293 +#, c-format +msgid "invalid oidvector data" +msgstr "oidvevtor-ის არასწორი მონაცემები" + +#: utils/adt/oracle_compat.c:975 +#, c-format +msgid "requested character too large" +msgstr "მოთხოვნილი სიმბოლო ძალიან დიდია" + +#: utils/adt/oracle_compat.c:1019 +#, c-format +msgid "character number must be positive" +msgstr "cost დადებით უნდა იყოს" + +#: utils/adt/oracle_compat.c:1023 +#, c-format +msgid "null character not permitted" +msgstr "ნულოვანი სიმბოლო ადუშვებელია" + +#: utils/adt/oracle_compat.c:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "მოთხოვნილი სიმბოლო ძალიან დიდია კოდირებისთვის: %u" + +#: utils/adt/oracle_compat.c:1082 +#, 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 "" + +#: utils/adt/pg_locale.c:1231 +#, c-format +msgid "Apply system library package updates." +msgstr "" + +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ამ აგებაში ICU-ის მხარდაჭერა არ არსებბს" + +#: utils/adt/pg_locale.c:1497 +#, c-format +msgid "could not create locale \"%s\": %m" +msgstr "ლოკალის \"%s\" შექმნა შეუძლებელია: %m" + +#: utils/adt/pg_locale.c:1500 +#, c-format +msgid "The operating system could not find any locale data for the locale name \"%s\"." +msgstr "" + +#: utils/adt/pg_locale.c:1608 +#, c-format +msgid "collations with different collate and ctype values are not supported on this platform" +msgstr "" + +#: utils/adt/pg_locale.c:1617 +#, c-format +msgid "collation provider LIBC is not supported on this platform" +msgstr "კოლაციის მომწოდებელი LIBC ამ პლატფორმაზე მხარდაჭერილი არაა" + +#: utils/adt/pg_locale.c:1652 +#, c-format +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "" + +#: utils/adt/pg_locale.c:1658 +#, c-format +msgid "collation \"%s\" has version mismatch" +msgstr "კოლაციის ვერსია არ ემთხვევა: %s" + +#: utils/adt/pg_locale.c:1660 +#, c-format +msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgstr "" + +#: utils/adt/pg_locale.c:1663 +#, 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 "" + +#: utils/adt/pg_locale.c:1734 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "ენის ჩატვირთვის შეცდომა: %s" + +#: utils/adt/pg_locale.c:1759 +#, c-format +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "" + +#: utils/adt/pg_locale.c:1797 +#, c-format +msgid "encoding \"%s\" not supported by ICU" +msgstr "კოდირება \"%s\" ICU-ის მიერ მხარდაჭერილი არაა" + +#: utils/adt/pg_locale.c:1804 +#, c-format +msgid "could not open ICU converter for encoding \"%s\": %s" +msgstr "შეცდომა ICU გარდამქმნელის გახსნისას კოდირებისთვის \"%s\": %s" + +#: utils/adt/pg_locale.c:1835 utils/adt/pg_locale.c:1844 utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 +#, c-format +msgid "%s failed: %s" +msgstr "%s ვერ მოხერხდა: %s" + +#: utils/adt/pg_locale.c:2182 +#, c-format +msgid "invalid multibyte character for locale" +msgstr "არასწორი მრავალბაიტიანი სიმბოლო ლოკალისთვის" + +#: utils/adt/pg_locale.c:2183 +#, c-format +msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." +msgstr "" + +#: utils/adt/pg_lsn.c:263 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "pg_lsn-ში NaN-ის დამატება შეუძლებელია" + +#: utils/adt/pg_lsn.c:297 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "pg_lsn-დან NaN-ის გამოკლება შეუძლებელია" + +#: 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:483 +#, c-format +msgid "invalid command name: \"%s\"" +msgstr "არასწორი ბრძანების სახელი: \"%s\"" + +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "მოთხოვნილია უცნობი მთვლელის განულება: %s" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "" + +#: utils/adt/pgstatfuncs.c:2198 +#, 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:321 +#, c-format +msgid "cannot accept a value of a shell type" +msgstr "გარსის ტიპის მნიშვნელობის მიღება შეუძლებელია" + +#: utils/adt/pseudotypes.c:331 +#, c-format +msgid "cannot display a value of a shell type" +msgstr "გარსის ტიპის მნიშვნელობის ჩვენება შეუძლებელია" + +#: utils/adt/rangetypes.c:404 +#, c-format +msgid "range constructor flags argument must not be null" +msgstr "" + +#: utils/adt/rangetypes.c:1003 +#, c-format +msgid "result of range difference would not be contiguous" +msgstr "" + +#: utils/adt/rangetypes.c:1064 +#, c-format +msgid "result of range union would not be contiguous" +msgstr "" + +#: 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:2112 utils/adt/rangetypes.c:2125 utils/adt/rangetypes.c:2139 +#, c-format +msgid "invalid range bound flags" +msgstr "" + +#: 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: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:2207 +#, c-format +msgid "Junk after \"empty\" key word." +msgstr "ნაგავი საკვანძო სიტყვა \"empty\"-ის შემდეგ." + +#: utils/adt/rangetypes.c:2224 +#, c-format +msgid "Missing left parenthesis or bracket." +msgstr "აკლია მარცხენა ფრჩხილი ან მრგვალი ფრჩხილი." + +#: utils/adt/rangetypes.c:2237 +#, c-format +msgid "Missing comma after lower bound." +msgstr "ქვედა ზღვარის შემდეგ მძიმე აკლია." + +#: utils/adt/rangetypes.c:2255 +#, c-format +msgid "Too many commas." +msgstr "ძალიან ბევრი მძიმე." + +#: utils/adt/rangetypes.c:2266 +#, c-format +msgid "Junk after right parenthesis or bracket." +msgstr "ნაგავი მარჯვენა ფრჩხილის ან მრგვალი ფრჩხილის შემდეგ." + +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 +#, c-format +msgid "regular expression failed: %s" +msgstr "რეგულარული გამოსახულების შეცდომა: %s" + +#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "რეგულარული გამოსახულების არასწორი პარამეტრი: \"%.*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:11860 utils/misc/guc.c:11894 +#, 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 "" + +#. translator: %s is a SQL function name +#: 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:1298 +#, c-format +msgid "Use the regexp_matches function instead." +msgstr "სამაგიეროდ ფუნქცია regexp_matches გამოიყენეთ." + +#: utils/adt/regexp.c:1486 +#, c-format +msgid "too many regular expression matches" +msgstr "რეგულარული გამოსახულების ძალიან ბევრი დამთხვევა" + +#: utils/adt/regproc.c:105 +#, c-format +msgid "more than one function named \"%s\"" +msgstr "ერთზე მეტი ფუნქცია სახელწოდებით \"%s\"" + +#: utils/adt/regproc.c:543 +#, c-format +msgid "more than one operator named %s" +msgstr "ერთზე მეტი ოპერატორი, სახელად %s" + +#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 utils/adt/ruleutils.c:10021 utils/adt/ruleutils.c:10190 +#, c-format +msgid "too many arguments" +msgstr "მეტისმეტად ბევრი არგუმენტი" + +#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 +#, c-format +msgid "Provide two argument types for operator." +msgstr "ოპერატორისთვის ორი არგუმენტის ტიპი მიაწოდეთ." + +#: 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:3667 utils/adt/varlena.c:3672 +#, c-format +msgid "invalid name syntax" +msgstr "სახელის არასწორი სინტაქსი" + +#: utils/adt/regproc.c:1953 +#, c-format +msgid "expected a left parenthesis" +msgstr "მოველოდი მარცხენა ფრჩხილს" + +#: utils/adt/regproc.c:1969 +#, c-format +msgid "expected a right parenthesis" +msgstr "მოველოდი მარჯვენა ფრჩხილს" + +#: utils/adt/regproc.c:1988 +#, c-format +msgid "expected a type name" +msgstr "მოველოდი ტიპის სახელს" + +#: utils/adt/regproc.c:2020 +#, c-format +msgid "improper type name" +msgstr "არასწორი ტიპის სახელი" + +#: 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 "" + +#: 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 "" + +#: utils/adt/ri_triggers.c:2031 +#, c-format +msgid "function \"%s\" must be fired for INSERT" +msgstr "\"INSERT\"-ისთვის საჭიროა %s ფუნქციის გაშვება" + +#: utils/adt/ri_triggers.c:2037 +#, c-format +msgid "function \"%s\" must be fired for UPDATE" +msgstr "\"UPDATE\"-ისთვის საჭიროა %s ფუნქციის გაშვება" + +#: utils/adt/ri_triggers.c:2043 +#, c-format +msgid "function \"%s\" must be fired for DELETE" +msgstr "\"DELETE\"-ისთვის საჭიროა %s ფუნქციის გაშვება" + +#: utils/adt/ri_triggers.c:2066 +#, c-format +msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:2068 +#, c-format +msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." +msgstr "" + +#: utils/adt/ri_triggers.c:2423 +#, c-format +msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" +msgstr "" + +#: utils/adt/ri_triggers.c:2427 +#, c-format +msgid "This is most likely due to a rule having rewritten the query." +msgstr "დიდი შანსია, ეს გამოიწვია წესმა, რომელმაც მოთხოვნა თავიდან დაწერა." + +#: utils/adt/ri_triggers.c:2588 +#, c-format +msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" +msgstr "" + +#: 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 "" + +#: utils/adt/ri_triggers.c:2602 +#, c-format +msgid "Key (%s)=(%s) is not present in table \"%s\"." +msgstr "" + +#: utils/adt/ri_triggers.c:2605 +#, c-format +msgid "Key is not present in table \"%s\"." +msgstr "ცხრილში \"%s\" გასაღები არ არსებობს." + +#: utils/adt/ri_triggers.c:2611 +#, c-format +msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:2619 +#, c-format +msgid "Key is still referenced from table \"%s\"." +msgstr "" + +#: 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: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:158 +#, c-format +msgid "Missing left parenthesis." +msgstr "აკლია მარცხენა ფრჩხილი." + +#: utils/adt/rowtypes.c:187 +#, c-format +msgid "Too few columns." +msgstr "მეტისმეტად ცოტა სვეტი." + +#: utils/adt/rowtypes.c:270 +#, c-format +msgid "Too many columns." +msgstr "მეტისმეტად ბევრი სვეტი." + +#: utils/adt/rowtypes.c:278 +#, c-format +msgid "Junk after right parenthesis." +msgstr "მაგავი მარჯვენა დამხურავი ფრჩხილის შემდეგ." + +#: utils/adt/rowtypes.c:532 +#, c-format +msgid "wrong number of columns: %d, expected %d" +msgstr "სვეტების არასწორი რაოდენობა: %d, მოველოდი %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 "" + +#: utils/adt/rowtypes.c:641 +#, c-format +msgid "improper binary format in record column %d" +msgstr "" + +#: 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 "" + +#: 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:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "შეყვანა არის მოთხოვნა და არა გამოსახულება" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "გამოხატულება შეიცავს ცვლადებს" + +#: utils/adt/ruleutils.c:5267 +#, c-format +msgid "rule \"%s\" has unsupported event type %d" +msgstr "წესს \"%s\" გააჩნია მხარდაუჭერელი მოვლენის ტიპი %d" + +#: utils/adt/timestamp.c:110 +#, c-format +msgid "TIMESTAMP(%d)%s precision must not be negative" +msgstr "TIMESTAMP(%d)%s-ის სიზუსტე უარყოფით არ უნდა იყოს" + +#: utils/adt/timestamp.c:116 +#, c-format +msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12884 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "დროის შტამპი დიაპაზონს გარეთაა: \"%s\"" + +#: utils/adt/timestamp.c:375 +#, c-format +msgid "timestamp(%d) precision must be between %d and %d" +msgstr "" + +#: utils/adt/timestamp.c:499 +#, c-format +msgid "Numeric time zones must have \"-\" or \"+\" as first character." +msgstr "" + +#: utils/adt/timestamp.c:512 +#, c-format +msgid "numeric time zone \"%s\" out of range" +msgstr "რიცხვითი დროის სარტყელი \"%s\" დიაპაზონს გარეთაა" + +#: 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 "დროის შტამპი დიაპაზონს გარეთაა: %d-%02d-%02d %d:%02d:%02g" + +#: utils/adt/timestamp.c:727 +#, c-format +msgid "timestamp cannot be NaN" +msgstr "დროის შტამპი NaN ვერ იქნება" + +#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#, c-format +msgid "timestamp out of range: \"%g\"" +msgstr "დროის შტამპი დიაპაზონს გარეთაა: \"%g\"" + +#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#, c-format +msgid "invalid INTERVAL type modifier" +msgstr "\"INTERVAL\" ტიპის არასწორი მოდიფიკატორი" + +#: utils/adt/timestamp.c:1078 +#, c-format +msgid "INTERVAL(%d) precision must not be negative" +msgstr "INTERVAL(%d)-ის სიზუსტე უარყოფით არ უნდა იყოს" + +#: utils/adt/timestamp.c:1084 +#, c-format +msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/timestamp.c:1466 +#, c-format +msgid "interval(%d) precision must be between %d and %d" +msgstr "" + +#: utils/adt/timestamp.c:2689 +#, c-format +msgid "cannot subtract infinite timestamps" +msgstr "უსასრულო დროის შტამპების გამოკლება შეუძლებელია" + +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#, c-format +msgid "origin out of range" +msgstr "წყარო დიაპაზონს გარეთაა" + +#: 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:3903 utils/adt/timestamp.c:4086 +#, c-format +msgid "stride must be greater than zero" +msgstr "ბიჯი ნულზე მეტი უნდა იყოს" + +#: utils/adt/timestamp.c:4399 +#, c-format +msgid "Months usually have fractional weeks." +msgstr "თვეში როგორც წესი გაყოფადი რაოდენობის კვირებია." + +#: utils/adt/trigfuncs.c:42 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called as trigger" +msgstr "suppress_redundant_updates_trigger: უნდა გამოიძახოთ, როგორც ტრიგერი" + +#: utils/adt/trigfuncs.c:48 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called on update" +msgstr "suppress_redundant_updates_trigger: უნდა გამოიძახოთ განახლებისას" + +#: utils/adt/trigfuncs.c:54 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called before update" +msgstr "suppress_redundant_updates_trigger: უნდა გამოიძახოთ განახლებამდე" + +#: utils/adt/trigfuncs.c:60 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called for each row" +msgstr "suppress_redundant_updates_trigger: უნდა გამოიძახოთ თითოეული მწკრივისთვის" + +#: utils/adt/tsgistidx.c:92 +#, c-format +msgid "gtsvector_in not implemented" +msgstr "gtsvector_in განხორციელებული არაა" + +#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 +#, c-format +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "" + +#: 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:330 +#, c-format +msgid "no operand in tsquery: \"%s\"" +msgstr "tsquery-ში ოპერანდი არ არსებობს: \"%s\"" + +#: utils/adt/tsquery.c:534 +#, c-format +msgid "value is too big in tsquery: \"%s\"" +msgstr "tsquery-ის მნიშვნელობა ძალიან დიდია: %s" + +#: utils/adt/tsquery.c:539 +#, c-format +msgid "operand is too long in tsquery: \"%s\"" +msgstr "tsquery-ში ოპერანდი ძალიან გრძელია: %s" + +#: utils/adt/tsquery.c:567 +#, c-format +msgid "word is too long in tsquery: \"%s\"" +msgstr "tsquery-ში სიტყვა ძალიან გრძელია: %s" + +#: utils/adt/tsquery.c:835 +#, c-format +msgid "text-search query doesn't contain lexemes: \"%s\"" +msgstr "" + +#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 +#, c-format +msgid "tsquery is too large" +msgstr "tsquery ძალიან დიდია" + +#: utils/adt/tsquery_cleanup.c:407 +#, c-format +msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" +msgstr "" + +#: utils/adt/tsquery_rewrite.c:321 +#, c-format +msgid "ts_rewrite query must return two tsquery columns" +msgstr "ts_rewrite მოთხოვნამ ორი tsquery სვეტი უნდა დააბრუნოს" + +#: utils/adt/tsrank.c:412 +#, c-format +msgid "array of weight must be one-dimensional" +msgstr "წონის მასივი ერთგანზომილებიანი უნდა იყოს" + +#: utils/adt/tsrank.c:417 +#, c-format +msgid "array of weight is too short" +msgstr "წონის მასივი ძალიან მოკლეა" + +#: utils/adt/tsrank.c:422 +#, c-format +msgid "array of weight must not contain nulls" +msgstr "წონის მასივი არ შეიძლება, ნულოვან მნიშვნელობებს შეიცავდეს" + +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 +#, c-format +msgid "weight out of range" +msgstr "სიმძიმე დიაპაზონს გარეთაა" + +#: utils/adt/tsvector.c:215 +#, c-format +msgid "word is too long (%ld bytes, max %ld bytes)" +msgstr "სიტყვა მეტისმეტად მოკლეა (%ld ბაიტი, მაქს %ld ბაიტი)" + +#: utils/adt/tsvector.c:222 +#, c-format +msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" +msgstr "" + +#: utils/adt/tsvector_op.c:771 +#, c-format +msgid "lexeme array may not contain nulls" +msgstr "ლექსემის მასივი არ შეიძლება, ნულოვან მნიშვნელობებს შეიცავდეს" + +#: 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 "წონების მასივი არ შეიძლება ნულოვან მნიშვნელობებს შეიცავდეს" + +#: utils/adt/tsvector_op.c:870 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "უცნობი სიმძიმე: \"%c\"" + +#: utils/adt/tsvector_op.c:2434 +#, c-format +msgid "ts_stat query must return one tsvector column" +msgstr "მოთხოვნამ ts_stat ერთი tsvector სვეტი უნდა დააბრუნოს" + +#: utils/adt/tsvector_op.c:2623 +#, c-format +msgid "tsvector column \"%s\" does not exist" +msgstr "tsvector სვეტი %s არ არსებობს" + +#: utils/adt/tsvector_op.c:2630 +#, c-format +msgid "column \"%s\" is not of tsvector type" +msgstr "სვეტი \"%s\" tsvector-ის ტიპის არაა" + +#: utils/adt/tsvector_op.c:2642 +#, c-format +msgid "configuration column \"%s\" does not exist" +msgstr "კონფიგურაციის სვეტი \"%s\" არ არსებობს" + +#: utils/adt/tsvector_op.c:2648 +#, c-format +msgid "column \"%s\" is not of regconfig type" +msgstr "სვეტი regconfig ტიპის არაა: %s" + +#: utils/adt/tsvector_op.c:2655 +#, c-format +msgid "configuration column \"%s\" must not be null" +msgstr "კონფიგურაციის სვეტ %s ნულოვანი არ უნდა იყოს" + +#: utils/adt/tsvector_op.c:2668 +#, c-format +msgid "text search configuration name \"%s\" must be schema-qualified" +msgstr "" + +#: utils/adt/tsvector_op.c:2693 +#, c-format +msgid "column \"%s\" is not of a character type" +msgstr "სვეტი სტრიქონის ტიპის არაა: %s" + +#: utils/adt/tsvector_parser.c:134 +#, c-format +msgid "syntax error in tsvector: \"%s\"" +msgstr "სინტაქსის შეცდომა tsvector-ში: \"%s\"" + +#: utils/adt/tsvector_parser.c:200 +#, c-format +msgid "there is no escaped character: \"%s\"" +msgstr "სპეციალური სიმბოლო \"%s\" ვერ ვიპოვე" + +#: utils/adt/tsvector_parser.c:318 +#, c-format +msgid "wrong position info in tsvector: \"%s\"" +msgstr "" + +#: utils/adt/uuid.c:413 +#, c-format +msgid "could not generate random values" +msgstr "შემთხვევითი რიცხვების გენერაციის შეცდომა" + +#: 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:115 utils/adt/varchar.c:57 +#, c-format +msgid "length for type %s cannot exceed %d" +msgstr "ტიპის (%s) სიგრძე %d-ზე მეტი ვერ იქნება" + +#: 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 "" + +#: 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 "" + +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 +#, c-format +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" არასწორი ორობითი რიცხვია" + +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 +#, c-format +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" არასწორი თექვსმეტობითი რიცხვია" + +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 +#, c-format +msgid "invalid length in external bit string" +msgstr "გარე ბიტური სტრიქონის არასწორი სიგრძე" + +#: 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 "" + +#: 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:3309 utils/adt/varlena.c:3387 +#, c-format +msgid "negative substring length not allowed" +msgstr "ქვესტრიქონის სიგრძე უარყოფითი არ შეიძლება იყოს" + +#: utils/adt/varbit.c:1261 +#, c-format +msgid "cannot AND bit strings of different sizes" +msgstr "განსხვავებული სიგრძის სტრიქონებზე AND ოპერაციას ვერ განახორციელებთ" + +#: utils/adt/varbit.c:1302 +#, c-format +msgid "cannot OR bit strings of different sizes" +msgstr "განსხვავებული სიგრძის სტრიქონებზე OR ოპერაციას ვერ განახორციელებთ" + +#: utils/adt/varbit.c:1342 +#, c-format +msgid "cannot XOR bit strings of different sizes" +msgstr "განსხვავებული სიგრძის სტრიქონებზე XOR ოპერაციას ვერ განახორციელებთ" + +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 +#, c-format +msgid "bit index %d out of valid range (0..%d)" +msgstr "" + +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 +#, c-format +msgid "new bit must be 0 or 1" +msgstr "ახალი ბიტი უნდა იყოს 0 ან 1" + +#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 +#, c-format +msgid "value too long for type character(%d)" +msgstr "მნიშვნელობა სიმბოლოს ტიპისთვის ძალიან გრძელია (%d)" + +#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 +#, c-format +msgid "value too long for type character varying(%d)" +msgstr "" + +#: 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:1208 utils/adt/varlena.c:1947 +#, c-format +msgid "nondeterministic collations are not supported for substring searches" +msgstr "" + +#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "" + +#: utils/adt/varlena.c:1624 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "უნიკოდის სტრიქონების შედარება შეუძლებელია: %m" + +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 +#, c-format +msgid "collation failed: %s" +msgstr "კოლაციის შეცდომა: %s" + +#: utils/adt/varlena.c:2582 +#, c-format +msgid "sort key generation failed: %s" +msgstr "დალაგების გასაღების გენერაციის შეცდომა: %s" + +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 +#, c-format +msgid "index %d out of valid range, 0..%d" +msgstr "ინდექსი %d დასაშვებ დიაპაზონს (0..%d) გარეთაა" + +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 +#, c-format +msgid "index %lld out of valid range, 0..%lld" +msgstr "ინდექსი %lld დასაშვებ დიაპაზონს (0..%lld) გარეთაა" + +#: utils/adt/varlena.c:4640 +#, c-format +msgid "field position must not be zero" +msgstr "ველის მდებარეობა ნულოვანი ვერ იქნება" + +#: utils/adt/varlena.c:5660 +#, c-format +msgid "unterminated format() type specifier" +msgstr "" + +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 +#, c-format +msgid "For a single \"%%\" use \"%%%%\"." +msgstr "ერთი \"%%\"-სთვის გამოიყენეთ \"%%%%\"." + +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 +#, c-format +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "" + +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 +#, c-format +msgid "too few arguments for format()" +msgstr "format()-ის არგუმენტები საკმარისი არაა" + +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 +#, c-format +msgid "number is out of range" +msgstr "რიცხვი დიაპაზონს გარეთაა" + +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 +#, c-format +msgid "format specifies argument 0, but arguments are numbered from 1" +msgstr "" + +#: utils/adt/varlena.c:6043 +#, c-format +msgid "width argument position must be ended by \"$\"" +msgstr "" + +#: utils/adt/varlena.c:6088 +#, c-format +msgid "null values cannot be formatted as an SQL identifier" +msgstr "" + +#: utils/adt/varlena.c:6214 +#, c-format +msgid "Unicode normalization can only be performed if server encoding is UTF8" +msgstr "" + +#: utils/adt/varlena.c:6227 +#, c-format +msgid "invalid normalization form: %s" +msgstr "ნორმალიზაციის არასწორი ფორმა: %s" + +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "უნიკოდის კოდის არასწორი წერტილი: %04X" + +#: utils/adt/varlena.c:6530 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "" + +#: utils/adt/windowfuncs.c:306 +#, c-format +msgid "argument of ntile must be greater than zero" +msgstr "ntile -ის არგუმენტი ნულზე მეტი უნდა იყოს" + +#: utils/adt/windowfuncs.c:528 +#, c-format +msgid "argument of nth_value must be greater than zero" +msgstr "nth_value-ის არგუმენტი ნულზე მეტი უნდა იყოს" + +#: utils/adt/xid8funcs.c:117 +#, c-format +msgid "transaction ID %llu is in the future" +msgstr "ტრანზაქციის ID მომავალშია: %llu" + +#: utils/adt/xid8funcs.c:547 +#, c-format +msgid "invalid external pg_snapshot data" +msgstr "pg_snapshot-ის არასწორი გარე მონაცემები" + +#: utils/adt/xml.c:222 +#, c-format +msgid "unsupported XML feature" +msgstr "\"XML\"-ის მხარდაუჭერელი ფუნქცია" + +#: utils/adt/xml.c:223 +#, c-format +msgid "This functionality requires the server to be built with libxml support." +msgstr "" + +#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 +#, c-format +msgid "invalid encoding name \"%s\"" +msgstr "კოდირების არასწორი სახელი: \"%s\"" + +#: utils/adt/xml.c:485 utils/adt/xml.c:490 +#, c-format +msgid "invalid XML comment" +msgstr "არასწორი XML კომენტარი" + +#: utils/adt/xml.c:619 +#, c-format +msgid "not an XML document" +msgstr "არ არის XML დოკუმენტი" + +#: utils/adt/xml.c:778 utils/adt/xml.c:801 +#, c-format +msgid "invalid XML processing instruction" +msgstr "xml-ის დამუშავების არასწორი ინსტრუქცია" + +#: utils/adt/xml.c:779 +#, c-format +msgid "XML processing instruction target name cannot be \"%s\"." +msgstr "" + +#: utils/adt/xml.c:802 +#, c-format +msgid "XML processing instruction cannot contain \"?>\"." +msgstr "" + +#: utils/adt/xml.c:881 +#, c-format +msgid "xmlvalidate is not implemented" +msgstr "xmlvalidate განხორციელებული არაა" + +#: utils/adt/xml.c:960 +#, c-format +msgid "could not initialize XML library" +msgstr "xml ბიბლიოთეკის ინიციალიზება ვერ მოხერხდა" + +#: utils/adt/xml.c:961 +#, c-format +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 აქვს შეუთავსებელი char ტიპის: ზომა (char)=%zu, sizeof(xmlChar)=%zu." + +#: utils/adt/xml.c:1047 +#, c-format +msgid "could not set up XML error handler" +msgstr "\"XML\" შეცდომების დამმუშავებლის მორგების შეცდომა" + +#: 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 "" + +#: utils/adt/xml.c:1935 +msgid "Invalid character value." +msgstr "სტრიქონის არასწორი მნშვნელობა." + +#: utils/adt/xml.c:1938 +msgid "Space required." +msgstr "საჭიროა გამოტოვება." + +#: utils/adt/xml.c:1941 +msgid "standalone accepts only 'yes' or 'no'." +msgstr "standalone-ის მნიშვნელობა შეიძლება იყოს \"yes\"(დიახ) ან \"no\"(არა)." + +#: utils/adt/xml.c:1944 +msgid "Malformed declaration: missing version." +msgstr "არასწორი აღწერა: ვერსია მითითებული არაა." + +#: utils/adt/xml.c:1947 +msgid "Missing encoding in text declaration." +msgstr "ტექსტის აღწერაში კოდირება მითითებული არაა." + +#: utils/adt/xml.c:1950 +msgid "Parsing XML declaration: '?>' expected." +msgstr "" + +#: utils/adt/xml.c:1953 +#, c-format +msgid "Unrecognized libxml error code: %d." +msgstr "Libxml-ის შეცდომის უცნობი კოდი: %d." + +#: utils/adt/xml.c:2210 +#, c-format +msgid "XML does not support infinite date values." +msgstr "XML-ს უსასრულო თარიღის მნიშვნელობების მხარდაჭერა არ გააჩნია." + +#: 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:2675 +#, c-format +msgid "invalid query" +msgstr "არასწორი მოთხოვნა" + +#: utils/adt/xml.c:4015 +#, c-format +msgid "invalid array for XML namespace mapping" +msgstr "" + +#: utils/adt/xml.c:4016 +#, c-format +msgid "The array must be two-dimensional with length of the second axis equal to 2." +msgstr "" + +#: utils/adt/xml.c:4040 +#, c-format +msgid "empty XPath expression" +msgstr "ცარიელი XPath გამოხატულება" + +#: utils/adt/xml.c:4092 +#, c-format +msgid "neither namespace name nor URI may be null" +msgstr "სახელების სივრცის სახელი და URI ნულოვანი არ შეიძლება, იყოს" + +#: utils/adt/xml.c:4099 +#, c-format +msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" +msgstr "" + +#: utils/adt/xml.c:4450 +#, c-format +msgid "DEFAULT namespace is not supported" +msgstr "სახელების სივრცე DEFAULT მხარდაუჭერელია" + +#: utils/adt/xml.c:4479 +#, c-format +msgid "row path filter must not be empty string" +msgstr "მწკრივის ბილიკის ფილტრი ცარიელი სტრიქონი არ შეიძლება იყოს" + +#: utils/adt/xml.c:4510 +#, c-format +msgid "column path filter must not be empty string" +msgstr "სვეტის ბილიკის ფილტრი ცარიელი სტრიქონი არ შეიძლება იყოს" + +#: utils/adt/xml.c:4654 +#, c-format +msgid "more than one value returned by column XPath expression" +msgstr "" + +#: utils/cache/lsyscache.c:1042 +#, c-format +msgid "cast from type %s to type %s does not exist" +msgstr "" + +#: 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:2849 +#, c-format +msgid "no input function available for type %s" +msgstr "ტიპისთვის %s შეყვანის ფუნქცია არ არ ასებობს" + +#: utils/cache/lsyscache.c:2882 +#, c-format +msgid "no output function available for type %s" +msgstr "ტიპისთვის %s გამოტანის ფუნქცია არ არ ასებობს" + +#: utils/cache/partcache.c:215 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" +msgstr "" + +#: utils/cache/plancache.c:722 +#, c-format +msgid "cached plan must not change result type" +msgstr "დაკეშილი გეგმა შედეგის ტიპს არ უნდა ცვლიდეს" + +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "ბინარული განახლების რეჟიმში pg_class-ის ინდექსის OID-ის მნიშვნელობა დაყენებული არაა" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "" + +#: utils/cache/relcache.c:6473 +#, c-format +msgid "could not create relation-cache initialization file \"%s\": %m" +msgstr "" + +#: utils/cache/relcache.c:6475 +#, c-format +msgid "Continuing anyway, but there's something wrong." +msgstr "მაინც ვაგრძელებ, მაგრამ რაღაც ცუდი ხდება." + +#: utils/cache/relcache.c:6797 +#, c-format +msgid "could not remove cache file \"%s\": %m" +msgstr "კეშის ფაილის \"%s\" წაშლის შეცდომა: %m" + +#: utils/cache/relmapper.c:590 +#, c-format +msgid "cannot PREPARE a transaction that modified relation mapping" +msgstr "" + +#: utils/cache/relmapper.c:836 +#, c-format +msgid "relation mapping file \"%s\" contains invalid data" +msgstr "ურთიერთობის მიბმის ფაილი \"%s\" არასწორ მონაცემებს შეიცავს" + +#: utils/cache/relmapper.c:846 +#, c-format +msgid "relation mapping file \"%s\" contains incorrect checksum" +msgstr "ურთიერთობის მიბმის ფაილი \"%s\" არასწორ საკონტროლო ჯამს შეიცავს" + +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 +#, c-format +msgid "record type has not been registered" +msgstr "ჩანაწერის ტიპი რეგისტრირებული არ არის" + +#: utils/error/assert.c:39 +#, c-format +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "" + +#: utils/error/assert.c:42 +#, c-format +msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgstr "ხაფანგი: %s(\"%s\", ფაილი: \"%s\", ხაზი: %d, PID: %d)\n" + +#: utils/error/elog.c:404 +#, c-format +msgid "error occurred before error message processing is available\n" +msgstr "აღმოჩენილია შეცდომა მანამდე, სანამ შეცდომის შეტყობინებების დამუშავება ხელმისაწვდომი გახდებოდა\n" + +#: utils/error/elog.c:1943 +#, c-format +msgid "could not reopen file \"%s\" as stderr: %m" +msgstr "" + +#: utils/error/elog.c:1956 +#, c-format +msgid "could not reopen file \"%s\" as stdout: %m" +msgstr "" + +#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 +msgid "[unknown]" +msgstr "[უცნობი]" + +#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 +msgid "missing error text" +msgstr "შეცდომის ტექსტი ხელმიუწვდომელია" + +#: utils/error/elog.c:2840 utils/error/elog.c:2843 +#, c-format +msgid " at character %d" +msgstr " სიმბოლოსთან %d" + +#: utils/error/elog.c:2853 utils/error/elog.c:2860 +msgid "DETAIL: " +msgstr "დეტალები: " + +#: utils/error/elog.c:2867 +msgid "HINT: " +msgstr "მინიშნება: " + +#: utils/error/elog.c:2874 +msgid "QUERY: " +msgstr "მოთხოვნა: " + +#: utils/error/elog.c:2881 +msgid "CONTEXT: " +msgstr "კონტექსტი: " + +#: utils/error/elog.c:2891 +#, c-format +msgid "LOCATION: %s, %s:%d\n" +msgstr "მდებარეობა: %s, %s:%d\n" + +#: utils/error/elog.c:2898 +#, c-format +msgid "LOCATION: %s:%d\n" +msgstr "მდებარეობა: %s:%d\n" + +#: utils/error/elog.c:2905 +msgid "BACKTRACE: " +msgstr "სტეკი: " + +#: utils/error/elog.c:2917 +msgid "STATEMENT: " +msgstr "ოპერატორი: " + +#: utils/error/elog.c:3310 +msgid "DEBUG" +msgstr "გამართვა" + +#: utils/error/elog.c:3314 +msgid "LOG" +msgstr "ჟურნალი" + +#: utils/error/elog.c:3317 +msgid "INFO" +msgstr "ინფორმაცია" + +#: utils/error/elog.c:3320 +msgid "NOTICE" +msgstr "გაფრთხილება" + +#: utils/error/elog.c:3324 +msgid "WARNING" +msgstr "გაფრთხილება" + +#: utils/error/elog.c:3327 +msgid "ERROR" +msgstr "შეცდომა" + +#: utils/error/elog.c:3330 +msgid "FATAL" +msgstr "ფატალური" + +#: utils/error/elog.c:3333 +msgid "PANIC" +msgstr "პანიკა" + +#: utils/fmgr/dfmgr.c:128 +#, c-format +msgid "could not find function \"%s\" in file \"%s\"" +msgstr "ფაილში \"%1$s\" ფუნქცია \"%2$s\" არ არსებობს" + +#: utils/fmgr/dfmgr.c:247 +#, c-format +msgid "could not load library \"%s\": %s" +msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: %s" + +#: utils/fmgr/dfmgr.c:279 +#, c-format +msgid "incompatible library \"%s\": missing magic block" +msgstr "არათავსებადი ბიბლიოთეკა \"%s\": მაგიური ბლოკი აღმოჩენილი არაა" + +#: utils/fmgr/dfmgr.c:281 +#, c-format +msgid "Extension libraries are required to use the PG_MODULE_MAGIC macro." +msgstr "გაფართოების ბიბლიოთეკების მიერ PG_MODULE_MAGIC მაკროს გამოყენება აუცილებელია." + +#: utils/fmgr/dfmgr.c:327 +#, c-format +msgid "incompatible library \"%s\": version mismatch" +msgstr "არათავსებადი ბიბლიოთეკა \"%s\": შეუსაბამო ვერსია" + +#: utils/fmgr/dfmgr.c:329 +#, c-format +msgid "Server is version %d, library is version %s." +msgstr "სერვერის ვერსიაა %d. ბიბლიოთეკის კი %s." + +#: 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:370 +#, c-format +msgid "Server has INDEX_MAX_KEYS = %d, library has %d." +msgstr "სერვერის INDEX_MAX_KEYS = %d, ბიბლიოთეკას კი %d." + +#: utils/fmgr/dfmgr.c:379 +#, c-format +msgid "Server has NAMEDATALEN = %d, library has %d." +msgstr "სერვერის NAMEDATALEN = %d, ბიბლიოთეკას კი %d." + +#: utils/fmgr/dfmgr.c:388 +#, c-format +msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." +msgstr "სერვერის FLOAT8PASSBYVAL = %s, ბიბლიოთეკას კი %s." + +#: utils/fmgr/dfmgr.c:395 +msgid "Magic block has unexpected length or padding difference." +msgstr "" + +#: utils/fmgr/dfmgr.c:398 +#, c-format +msgid "incompatible library \"%s\": magic block mismatch" +msgstr "არათავსებადი ბიბლიოთეკა \"%s\": მაგიური ბლოკი არ ემთხვევა" + +#: utils/fmgr/dfmgr.c:492 +#, c-format +msgid "access to library \"%s\" is not allowed" +msgstr "წვდომა ბიბლიოთეკასთან \"%s\"" + +#: utils/fmgr/dfmgr.c:518 +#, c-format +msgid "invalid macro name in dynamic library path: %s" +msgstr "მაკროს არასწორი სახელი დინამიკური ბიბლიოთეკის ბილიკში: %s" + +#: utils/fmgr/dfmgr.c:558 +#, c-format +msgid "zero-length component in parameter \"dynamic_library_path\"" +msgstr "" + +#: utils/fmgr/dfmgr.c:577 +#, c-format +msgid "component in parameter \"dynamic_library_path\" is not an absolute path" +msgstr "პარამეტრში \"dynamic_library_path\" კომპონენტი აბსოლუტური ბილიკი არაა" + +#: utils/fmgr/fmgr.c:238 +#, c-format +msgid "internal function \"%s\" is not in internal lookup table" +msgstr "შიდა ფუნქცია \"%s\" შიდა ძებნის ცხრილში აღმოჩენილი არაა" + +#: utils/fmgr/fmgr.c:484 +#, c-format +msgid "could not find function information for function \"%s\"" +msgstr "ფუნქციისთვის \"%s\" ფუნქციის ინფორმაციის პოვნა შეუძლებელია" + +#: utils/fmgr/fmgr.c:486 +#, c-format +msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." +msgstr "" + +#: utils/fmgr/fmgr.c:504 +#, c-format +msgid "unrecognized API version %d reported by info function \"%s\"" +msgstr "" + +#: utils/fmgr/fmgr.c:1985 +#, c-format +msgid "operator class options info is absent in function call context" +msgstr "" + +#: utils/fmgr/fmgr.c:2052 +#, c-format +msgid "language validation function %u called for language %u instead of %u" +msgstr "" + +#: utils/fmgr/funcapi.c:498 +#, c-format +msgid "could not determine actual result type for function \"%s\" declared to return type %s" +msgstr "" + +#: utils/fmgr/funcapi.c:643 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "" + +#: utils/fmgr/funcapi.c:726 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "მონაცემების ტიპისთვის %s მრავალდიაპაზონიანი ტიპი ვერ ვიპოვე" + +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 +#, c-format +msgid "number of aliases does not match number of columns" +msgstr "მეტსახელების რიცხვი სვეტების რაოდენობას არ ემთხვევა" + +#: utils/fmgr/funcapi.c:1969 +#, c-format +msgid "no column alias was provided" +msgstr "სვეტის მეტსახელი მითითებული არაა" + +#: utils/fmgr/funcapi.c:1993 +#, c-format +msgid "could not determine row description for function returning record" +msgstr "ჩანაწერის დამბრუნებელი ფუნქციისთვის მწკრივის აღწერის დადგენა შეუძლებელია" + +#: utils/init/miscinit.c:329 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "მონაცემების საქაღალდე არ არსებობს: \"%s\"" + +#: utils/init/miscinit.c:334 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "საქაღალდის წვდომების წაკითხვა შეუძლებელია \"%s\": %m" + +#: utils/init/miscinit.c:342 +#, c-format +msgid "specified data directory \"%s\" is not a directory" +msgstr "მონაცემების მითითებული საქაღალდე \"%s\" საქაღალდე არაა" + +#: utils/init/miscinit.c:358 +#, c-format +msgid "data directory \"%s\" has wrong ownership" +msgstr "მონაცემების მითითებული საქაღალდის (\"%s\") მფლობელი არასწორია" + +#: 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:378 +#, c-format +msgid "data directory \"%s\" has invalid permissions" +msgstr "მონაცემების საქაღალდის \"%s\" წვდომები არასწორია" + +#: 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:665 utils/misc/guc.c:7830 +#, c-format +msgid "cannot set parameter \"%s\" within security-restricted operation" +msgstr "" + +#: utils/init/miscinit.c:733 +#, c-format +msgid "role with OID %u does not exist" +msgstr "როლი OID-ით %u არ არსებობს" + +#: utils/init/miscinit.c:763 +#, c-format +msgid "role \"%s\" is not permitted to log in" +msgstr "როლს შესვლის უფლება არ აქვს: %s" + +#: utils/init/miscinit.c:781 +#, c-format +msgid "too many connections for role \"%s\"" +msgstr "მეტისმეტად ბევრი კავშირი როლისთვის \"%s\"" + +#: utils/init/miscinit.c:841 +#, c-format +msgid "permission denied to set session authorization" +msgstr "სესიის ავტორიზაციის დასაყენებლად წვდომა აკრძალულია" + +#: utils/init/miscinit.c:924 +#, c-format +msgid "invalid role OID: %u" +msgstr "როლის არასწორი OID: %u" + +#: utils/init/miscinit.c:978 +#, c-format +msgid "database system is shut down" +msgstr "მონაცემთა ბაზის სისტემა გათიშულია" + +#: utils/init/miscinit.c:1065 +#, c-format +msgid "could not create lock file \"%s\": %m" +msgstr "ბლოკის ფაილის (%s) შექმნის შეცდომა: %m" + +#: utils/init/miscinit.c:1079 +#, c-format +msgid "could not open lock file \"%s\": %m" +msgstr "ბლოკის ფაილის (%s) გახსნის შეცდომა: %m" + +#: utils/init/miscinit.c:1086 +#, c-format +msgid "could not read lock file \"%s\": %m" +msgstr "ბლოკის ფაილის (%s) წაკითხვის შეცდომა: %m" + +#: utils/init/miscinit.c:1095 +#, c-format +msgid "lock file \"%s\" is empty" +msgstr "ბლოკის ფაილი (\"%s\") ცარიელია" + +#: 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:1140 +#, c-format +msgid "lock file \"%s\" already exists" +msgstr "ბლოკის ფაილი (\"%s\") უკვე არსებობს" + +#: 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:1146 +#, c-format +msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" +msgstr "არის სხვა postmaster (PID %d) გაშვებული მონაცემების საქაღლდეში \"%s\"?" + +#: 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:1151 +#, c-format +msgid "Is another postmaster (PID %d) using socket file \"%s\"?" +msgstr "იყენებს სხვა postmaster (PID %d) სოკეტის ფაილს \"%s\"?" + +#: utils/init/miscinit.c:1202 +#, c-format +msgid "could not remove old lock file \"%s\": %m" +msgstr "ბლოკის ძველი ფაილის წაშლის შეცდომა \"%s\": %m" + +#: 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: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:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10828 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "ფაილიდან (\"%s\") წაკითხვის შეცდომა: %m" + +#: utils/init/miscinit.c:1507 +#, c-format +msgid "could not open file \"%s\": %m; continuing anyway" +msgstr "შეცდომა ფაილის (\"%s\") გახსნისას: %m; მაინც ვაგრძელებ" + +#: 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:1571 utils/init/miscinit.c:1587 +#, c-format +msgid "\"%s\" is not a valid data directory" +msgstr "%s მონაცემების არასწორი საქაღალდეა" + +#: utils/init/miscinit.c:1573 +#, c-format +msgid "File \"%s\" is missing." +msgstr "ფაილი \"%s\" აკლია." + +#: utils/init/miscinit.c:1589 +#, c-format +msgid "File \"%s\" does not contain valid data." +msgstr "ფაილი \"%s\" სწორ მონაცემებს არ შეიცავს." + +#: utils/init/miscinit.c:1591 +#, c-format +msgid "You might need to initdb." +msgstr "როგორც ჩანს, initdb გჭირდებათ." + +#: 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/postinit.c:258 +#, c-format +msgid "replication connection authorized: user=%s" +msgstr "რეპლიკაციის შეერთება ავტორიზებულია: მომხმარებელი=%s" + +#: utils/init/postinit.c:261 +#, c-format +msgid "connection authorized: user=%s" +msgstr "შეერთება ავტორიზებულია: მომხმარებელი=%s" + +#: utils/init/postinit.c:264 +#, c-format +msgid " database=%s" +msgstr " ბაზა=%s" + +#: utils/init/postinit.c:267 +#, c-format +msgid " application_name=%s" +msgstr " აპლიკაციის_სახელი=%s" + +#: utils/init/postinit.c:272 +#, c-format +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " SSL ჩართულია (პროტოკოლი=%s, შიფრი=%s, ბიტები=%d)" + +#: utils/init/postinit.c:284 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgstr " GSS (ავთენტიფიცირებული=%s, დაშიფრული=%s, პრინციპალი=%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:285 utils/init/postinit.c:286 utils/init/postinit.c:291 utils/init/postinit.c:292 +msgid "yes" +msgstr "დიახ" + +#: utils/init/postinit.c:290 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s)" +msgstr " GSS (ავთენტიფიცირებული=%s, დაშიფრული=%s)" + +#: utils/init/postinit.c:330 +#, c-format +msgid "database \"%s\" has disappeared from pg_database" +msgstr "ბაზა \"%s\" pg_database-დან გაქრა" + +#: 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:352 +#, c-format +msgid "database \"%s\" is not currently accepting connections" +msgstr "ბაზა \"%s\" ამჟამად მიერთებებს არ იღებს" + +#: utils/init/postinit.c:365 +#, c-format +msgid "permission denied for database \"%s\"" +msgstr "წვდომა აკრძალულია ბაზაზე: \"%s\"" + +#: utils/init/postinit.c:366 +#, c-format +msgid "User does not have CONNECT privilege." +msgstr "მომხმარებელს CONNECT პრივილეგია არ გააჩნია." + +#: utils/init/postinit.c:383 +#, c-format +msgid "too many connections for database \"%s\"" +msgstr "ძალიან ბევრი კავშირი ბაზისთვის \"%s\"" + +#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#, c-format +msgid "database locale is incompatible with operating system" +msgstr "ბაზის ენა ოპერაციულ სისტემასთან შეუთავსებელია" + +#: utils/init/postinit.c:410 +#, 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 +#, c-format +msgid "Recreate the database with another locale or install the missing locale." +msgstr "თავიდან შექმენით ბაზა სხვა ლოკალით ან დააყენეთ ლოკალი, რომელიც ვერ ვიპოვე." + +#: utils/init/postinit.c:417 +#, 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:466 +#, c-format +msgid "database \"%s\" has a collation version mismatch" +msgstr "ბაზის (%s) კოლაციის ვერსია არ ემთხვევა" + +#: utils/init/postinit.c:468 +#, c-format +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "" + +#: utils/init/postinit.c:471 +#, c-format +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 "" + +#: utils/init/postinit.c:839 +#, c-format +msgid "no roles are defined in this database system" +msgstr "ამ მონაცემთა ბაზაში როლები აღწერილი არაა" + +#: utils/init/postinit.c:840 +#, c-format +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "მაშინვე უნდა გაუშვათ CREATE USER \"%s\" SUPERUSER;." + +#: utils/init/postinit.c:872 +#, c-format +msgid "must be superuser to connect in binary upgrade mode" +msgstr "ორობითი განახლებისას მისაერთებლად ზემომხმარებელი უნდა ბრძანდებოდეთ" + +#: utils/init/postinit.c:885 +#, c-format +msgid "remaining connection slots are reserved for non-replication superuser connections" +msgstr "" + +#: utils/init/postinit.c:895 +#, c-format +msgid "must be superuser or replication role to start walsender" +msgstr "" + +#: utils/init/postinit.c:964 +#, c-format +msgid "database %u does not exist" +msgstr "ბაზა არ არსებობს: %u" + +#: utils/init/postinit.c:1054 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "როგორც ჩანს, ახლახანს წაიშალა ან სახელი გადაერქვა." + +#: utils/init/postinit.c:1061 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "არასწორ მონაცემთა ბაზასთან \"%s\" დაკავშირება ვერ მოხერხდა" + +#: utils/init/postinit.c:1081 +#, c-format +msgid "The database subdirectory \"%s\" is missing." +msgstr "ბაზის ქვესაქაღალდე არ არსებობს: %s." + +#: 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: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: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:900 +#, c-format +msgid "conversion between %s and %s is not supported" +msgstr "%s-დან %s-ზე გადაყვანა მხარდაჭერილი არაა" + +#: utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "" + +#: 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:568 +#, c-format +msgid "invalid source encoding name \"%s\"" +msgstr "წყაროს კოდირების არასწორი სახელი: \"%s\"" + +#: utils/mb/mbutils.c:573 +#, c-format +msgid "invalid destination encoding name \"%s\"" +msgstr "სამიზნის კოდირების არასწორი სახელი: \"%s\"" + +#: utils/mb/mbutils.c:713 +#, c-format +msgid "invalid byte value for encoding \"%s\": 0x%02x" +msgstr "არასწორი ბაიტის მნიშვნელობა კოდირებისთვის \"%s\": 0x%02x" + +#: utils/mb/mbutils.c:877 +#, c-format +msgid "invalid Unicode code point" +msgstr "უნიკოდის კოდის არასწორი წერტილი" + +#: utils/mb/mbutils.c:1146 +#, c-format +msgid "bind_textdomain_codeset failed" +msgstr "bind_textdomain_codeset-ის შეცდომა" + +#: utils/mb/mbutils.c:1667 +#, c-format +msgid "invalid byte sequence for encoding \"%s\": %s" +msgstr "ბაიტების არასწორი მიმდევრობა კოდირებისთვის \"%s\": %s" + +#: utils/mb/mbutils.c:1700 +#, c-format +msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" +msgstr "" + +#: utils/misc/guc.c:776 +msgid "Ungrouped" +msgstr "დაჯგუფება მოხსნილია" + +#: utils/misc/guc.c:778 +msgid "File Locations" +msgstr "ფაილის მდებარეობები" + +#: utils/misc/guc.c:780 +msgid "Connections and Authentication / Connection Settings" +msgstr "დაკავშირება და ავთენტიკაცია / შეერთების პარამეტრები" + +#: utils/misc/guc.c:782 +msgid "Connections and Authentication / Authentication" +msgstr "დაკავშირება და ავთენტიკაცია / ავთენტიკაცია" + +#: utils/misc/guc.c:784 +msgid "Connections and Authentication / SSL" +msgstr "დაკავშირება და ავთენტიკაცია / SSL" + +#: utils/misc/guc.c:786 +msgid "Resource Usage / Memory" +msgstr "რესურსების გამოყენება / მეხსიერება" + +#: utils/misc/guc.c:788 +msgid "Resource Usage / Disk" +msgstr "რესურსების გამოყენება / დისკი" + +#: utils/misc/guc.c:790 +msgid "Resource Usage / Kernel Resources" +msgstr "რესურსების გამოყენება / ბირთვის რესურსები" + +#: utils/misc/guc.c:792 +msgid "Resource Usage / Cost-Based Vacuum Delay" +msgstr "რესურსების გამოყენება / ფასზე-დამოკიდებული დამტვერსასრუტების დაყოვნება" + +#: utils/misc/guc.c:794 +msgid "Resource Usage / Background Writer" +msgstr "რესურსების გამოყენება / ფონური ჩამწერი" + +#: utils/misc/guc.c:796 +msgid "Resource Usage / Asynchronous Behavior" +msgstr "რესურსების გამოყენება / ასინქრონული ქცევა" + +#: utils/misc/guc.c:798 +msgid "Write-Ahead Log / Settings" +msgstr "წინასწარ-ჩაწერი ჟურნალი / მორგება" + +#: utils/misc/guc.c:800 +msgid "Write-Ahead Log / Checkpoints" +msgstr "წინასწარ-ჩაწერი ჟურნალი / საკონტროლო წერტილები" + +#: utils/misc/guc.c:802 +msgid "Write-Ahead Log / Archiving" +msgstr "წინასწარ-ჩაწერი ჟურნალი / არქივირება" + +#: 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:808 +msgid "Write-Ahead Log / Recovery Target" +msgstr "წინასწარ-ჩაწერი ჟურნალი / სამიზნის აღდგენა" + +#: utils/misc/guc.c:810 +msgid "Replication / Sending Servers" +msgstr "რეპლიკაცია / სერვერების გაგზავნა" + +#: utils/misc/guc.c:812 +msgid "Replication / Primary Server" +msgstr "რეპლიკაცია / ძირითადი სერვერი" + +#: utils/misc/guc.c:814 +msgid "Replication / Standby Servers" +msgstr "რეპლიკაცია / უქმე სერვერები" + +#: utils/misc/guc.c:816 +msgid "Replication / Subscribers" +msgstr "რეპლიკაცია / გამომწერები" + +#: utils/misc/guc.c:818 +msgid "Query Tuning / Planner Method Configuration" +msgstr "მოთხოვნის მორგება / დამგეგმავის მეთოდის კონფიგურაცია" + +#: utils/misc/guc.c:820 +msgid "Query Tuning / Planner Cost Constants" +msgstr "მოთხოვნის მორგება / დამგეგმავის ფასის შეზღუდვები" + +#: utils/misc/guc.c:822 +msgid "Query Tuning / Genetic Query Optimizer" +msgstr "მოთხოვნის მორგება / მოთხოვნის ზოგადი ოპტიმიზატორი" + +#: utils/misc/guc.c:824 +msgid "Query Tuning / Other Planner Options" +msgstr "მოთხოვნის მორგება / დამგეგმავის სხვა პარამეტრები" + +#: utils/misc/guc.c:826 +msgid "Reporting and Logging / Where to Log" +msgstr "ანგარიშები და ჟურნალი / სად ჩავწერო ჟურნალი" + +#: utils/misc/guc.c:828 +msgid "Reporting and Logging / When to Log" +msgstr "ანგარიშები და ჟურნალი / როდის ჩავწერო ჟურნალი" + +#: utils/misc/guc.c:830 +msgid "Reporting and Logging / What to Log" +msgstr "ანგარიშები და ჟურნალი / რა ჩავწერო ჟურნალში" + +#: utils/misc/guc.c:832 +msgid "Reporting and Logging / Process Title" +msgstr "ანგარიშები და ჟურნალი / პროცესის სათაური" + +#: utils/misc/guc.c:834 +msgid "Statistics / Monitoring" +msgstr "სტატისტიკა / მონიტორინგი" + +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "სტატისტიკა / კუმულაციური მოთხოვნისა და ინდექსის სტატისტიკა" + +#: utils/misc/guc.c:838 +msgid "Autovacuum" +msgstr "ავტომომტვერსასრუტება" + +#: utils/misc/guc.c:840 +msgid "Client Connection Defaults / Statement Behavior" +msgstr "კლიენტის შეერთების ნაგულისხმევი პარამეტრები / ბრძანების ქცევა" + +#: utils/misc/guc.c:842 +msgid "Client Connection Defaults / Locale and Formatting" +msgstr "კლიენტის შეერთების ნაგულისხმევი პარამეტრები / ენა და ფორმატირება" + +#: utils/misc/guc.c:844 +msgid "Client Connection Defaults / Shared Library Preloading" +msgstr "კლიენტის შეერთების ნაგულისხმევი პარამეტრები / გაზიარებული ბიბლიოთეკის წინასწარი ჩატვირთვა" + +#: utils/misc/guc.c:846 +msgid "Client Connection Defaults / Other Defaults" +msgstr "კლიენტის შეერთების ნაგულისხმევი პარამეტრები / სხვა ნაგულისხმევი პარამეტრები" + +#: utils/misc/guc.c:848 +msgid "Lock Management" +msgstr "ბლოკის მართვა" + +#: utils/misc/guc.c:850 +msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" +msgstr "ვერსიისა და პლატფორმის თავსებადობა / PostgreSQL-ის წინა ვერსიები" + +#: utils/misc/guc.c:852 +msgid "Version and Platform Compatibility / Other Platforms and Clients" +msgstr "ვერსიისა და პლატფორმის თავსებადობა / სხვა პლატფორმები და კლიენტები" + +#: utils/misc/guc.c:854 +msgid "Error Handling" +msgstr "შეცდომების დამუშავება" + +#: utils/misc/guc.c:856 +msgid "Preset Options" +msgstr "პრესეტის მორგება" + +#: utils/misc/guc.c:858 +msgid "Customized Options" +msgstr "ხელით მითითებული პარამეტრები" + +#: utils/misc/guc.c:860 +msgid "Developer Options" +msgstr "პროგრამისტის პარამეტრები" + +#: utils/misc/guc.c:918 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "პარამეტრის სწორი ერთეულებია \"ბ\", \"კბ\", \"მბ\", \"გბ\" და \"ტბ\"." + +#: utils/misc/guc.c:955 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "პარამეტრის სწორი ერთეულებია \"მკწმ\", \"მწმ\", \"წმ\", \"წთ\", \"სთ\" და \"დღე\"." + +#: utils/misc/guc.c:1017 +msgid "Enables the planner's use of sequential-scan plans." +msgstr "დამგეგმავისთვის მიმდევრობითი სკანირების გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1027 +msgid "Enables the planner's use of index-scan plans." +msgstr "დამგეგმავისთვის ინდექსის სკანირების გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1037 +msgid "Enables the planner's use of index-only-scan plans." +msgstr "დამგეგმავისთვის მხოლოდ ინდექსის სკანირების გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1047 +msgid "Enables the planner's use of bitmap-scan plans." +msgstr "დამგეგმავისთვის ბიტური რუკების სკანირების გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1057 +msgid "Enables the planner's use of TID scan plans." +msgstr "დამგეგმავისთვის TID-ის სკანირების გეგმების გამოყენების უფლები მიცემა." + +#: utils/misc/guc.c:1067 +msgid "Enables the planner's use of explicit sort steps." +msgstr "დამგეგმავისთვის აშკარა დალაგების ნაბიჯების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1077 +msgid "Enables the planner's use of incremental sort steps." +msgstr "დამგეგმავისთვის ინკრემენტული დალაგების ნაბიჯების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1087 +msgid "Enables the planner's use of hashed aggregation plans." +msgstr "დამგეგმავისთვის დაჰეშიილი აგრეგაციის გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1097 +msgid "Enables the planner's use of materialization." +msgstr "დამგეგმავისთვის მატერიალიზაციის გამოყენების უფლების მიცემა." + +#: 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:1127 +msgid "Enables the planner's use of merge join plans." +msgstr "დამგეგმავისთვის შეერთების გეგმების შერწყმის გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1137 +msgid "Enables the planner's use of hash join plans." +msgstr "დამგეგმავისთვის ჰეშის შეერთების გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1147 +msgid "Enables the planner's use of gather merge plans." +msgstr "დამგეგმავისთვის შერწყმის გეგმების შეგროვების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1157 +msgid "Enables partitionwise join." +msgstr "დანაყოფის გათვალისწინებით შეერთების ჩართვა." + +#: utils/misc/guc.c:1167 +msgid "Enables partitionwise aggregation and grouping." +msgstr "დანაყოფის გათვალისწინებით აგრეგაციისა და დაჯგუფებს ჩართვა." + +#: utils/misc/guc.c:1177 +msgid "Enables the planner's use of parallel append plans." +msgstr "დამგეგმავისთვის პარალელური ბოლოში მიწერის გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1187 +msgid "Enables the planner's use of parallel hash plans." +msgstr "დამგეგმავისთვის პარალელური ჰეშის გეგმების გამოყენების უფლების მიცემა." + +#: utils/misc/guc.c:1197 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "" + +#: 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:1209 +msgid "Enables the planner's use of async append plans." +msgstr "" + +#: utils/misc/guc.c:1219 +msgid "Enables genetic query optimization." +msgstr "მოთხოვნების ზოგადი ოპტიმიზაციის ჩართვა." + +#: utils/misc/guc.c:1220 +msgid "This algorithm attempts to do planning without exhaustive searching." +msgstr "" + +#: utils/misc/guc.c:1231 +msgid "Shows whether the current user is a superuser." +msgstr "აჩვენებს, არის მიმდინარე მომხმარებელი ზემომხმარებელი, თუ არა." + +#: utils/misc/guc.c:1241 +msgid "Enables advertising the server via Bonjour." +msgstr "სერვისის Bonjour-ით გამოქვეყნების ჩართვა." + +#: utils/misc/guc.c:1250 +msgid "Collects transaction commit time." +msgstr "აგროვებს ტრანზაქციის გადაცემის დროს." + +#: utils/misc/guc.c:1259 +msgid "Enables SSL connections." +msgstr "SSL შეერთებების ჩართვა." + +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "" + +#: utils/misc/guc.c:1277 +msgid "Give priority to server ciphersuite order." +msgstr "" + +#: utils/misc/guc.c:1286 +msgid "Forces synchronization of updates to disk." +msgstr "დისკის განახლებების ნაძალადევი სინქრონიზაცია." + +#: utils/misc/guc.c:1287 +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 "" + +#: utils/misc/guc.c:1298 +msgid "Continues processing after a checksum failure." +msgstr "აგრძელებს დამუშავებას საკონტროლო ჯამის ჩავარდნის შემდეგ." + +#: utils/misc/guc.c:1299 +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 "" + +#: utils/misc/guc.c:1313 +msgid "Continues processing past damaged page headers." +msgstr "აგრძელებს დამუშავებას დაზიანებული გვერდის თავსართების შემდეგ." + +#: utils/misc/guc.c:1314 +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 "" + +#: utils/misc/guc.c:1327 +msgid "Continues recovery after an invalid pages failure." +msgstr "აგრძელებს აღდგენას არასწორი გვერდის ჩავარდნების შემდეგ." + +#: utils/misc/guc.c:1328 +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 "" + +#: utils/misc/guc.c:1346 +msgid "Writes full pages to WAL when first modified after a checkpoint." +msgstr "" + +#: utils/misc/guc.c:1347 +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 "" + +#: utils/misc/guc.c:1360 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." +msgstr "" + +#: utils/misc/guc.c:1370 +msgid "Writes zeroes to new WAL files before first use." +msgstr "ახალ WAL-ის ფაილებში მათ პირველ გამოყენებამდე ნულიანების ჩაწერა." + +#: utils/misc/guc.c:1380 +msgid "Recycles WAL files by renaming them." +msgstr "WAL-ის ფაილების თავიდან გამოყენება მათი სახელის გადარქმევით." + +#: utils/misc/guc.c:1390 +msgid "Logs each checkpoint." +msgstr "საკონტროლო წერტილების ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1399 +msgid "Logs each successful connection." +msgstr "ყოველი წარმატებული შესვლის ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1408 +msgid "Logs end of a session, including duration." +msgstr "სესიის დასრულების ჟურნალში ჩაწერა, ხანგრძლივობის ჩართვლით." + +#: utils/misc/guc.c:1417 +msgid "Logs each replication command." +msgstr "რეპლიკაციის ყოველი ბრძანების ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1426 +msgid "Shows whether the running server has assertion checks enabled." +msgstr "" + +#: utils/misc/guc.c:1441 +msgid "Terminate session on any error." +msgstr "სესიის დასრულება ნებისმიერი შეცდომის შემთხვევაში." + +#: utils/misc/guc.c:1450 +msgid "Reinitialize server after backend crash." +msgstr "უკანაბოლოს ავარიის შემდეგ სერვერის თავიდან ინიციალიზაცია." + +#: utils/misc/guc.c:1459 +msgid "Remove temporary files after backend crash." +msgstr "უკანაბოლოს ავარიის შემდეგ დროებითი ფაილების წაშლა." + +#: utils/misc/guc.c:1470 +msgid "Logs the duration of each completed SQL statement." +msgstr "თითოეული დასრულებული SQL გამოსახულების ხანგრძლივობის ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1479 +msgid "Logs each query's parse tree." +msgstr "ჟურნალში თითოეული მოთხოვნის დამუშავების ხის ჩაწერა." + +#: utils/misc/guc.c:1488 +msgid "Logs each query's rewritten parse tree." +msgstr "ჟურნალში თითოეული მოთხოვნის გადაწერილი დამუშავების ხის ჩაწერა." + +#: utils/misc/guc.c:1497 +msgid "Logs each query's execution plan." +msgstr "ჟურნალში თითოეული მოთხოვნის შესრულების გეგმის ჩაწერა." + +#: utils/misc/guc.c:1506 +msgid "Indents parse and plan tree displays." +msgstr "" + +#: utils/misc/guc.c:1515 +msgid "Writes parser performance statistics to the server log." +msgstr "დამმუშავებლის წარმადობის სტატისტიკას სერვერის ჟურნალში ჩაწერს." + +#: utils/misc/guc.c:1524 +msgid "Writes planner performance statistics to the server log." +msgstr "დამგეგმავის წარმადობის სტატისტიკას სერვერის ჟურნალში ჩაწერს." + +#: utils/misc/guc.c:1533 +msgid "Writes executor performance statistics to the server log." +msgstr "შემსრულებლის წარმადობის სტატისტიკას სერვერის ჟურნალში ჩაწერს." + +#: utils/misc/guc.c:1542 +msgid "Writes cumulative performance statistics to the server log." +msgstr "საერთო წარმადობის სტატისტიკას სერვერის ჟურნალში ჩაწერს." + +#: utils/misc/guc.c:1552 +msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." +msgstr "" + +#: utils/misc/guc.c:1564 +msgid "Collects information about executing commands." +msgstr "აგროვებს ინფორმაციას ბრძანებების შესრულების შესახებ." + +#: utils/misc/guc.c:1565 +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:1575 +msgid "Collects statistics on database activity." +msgstr "აგროვებს სტატისტიკას ბაზის აქტივობების შესახებ." + +#: utils/misc/guc.c:1584 +msgid "Collects timing statistics for database I/O activity." +msgstr "აგროვებს ბაზის შეყვანა/გამოტანის აქტივობების დროით სტატისტიკას." + +#: utils/misc/guc.c:1593 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "აგროვებს WAL-ის შეყვანა/გამოტანის აქტივობების დროით სტატისტიკას." + +#: utils/misc/guc.c:1603 +msgid "Updates the process title to show the active SQL command." +msgstr "განახლებს პროცესის სათაურს, რათა მან აქტიური SQL ბრძანება აჩვენოს." + +#: utils/misc/guc.c:1604 +msgid "Enables updating of the process title every time a new SQL command is received by the server." +msgstr "" + +#: utils/misc/guc.c:1617 +msgid "Starts the autovacuum subprocess." +msgstr "ავტომომტვერსასრუტების ქვეპროცესის გაშვება." + +#: utils/misc/guc.c:1627 +msgid "Generates debugging output for LISTEN and NOTIFY." +msgstr "LISTEN-ის და NOTIFY-ის გამართვის შეტყობინებების გენერაცია." + +#: utils/misc/guc.c:1639 +msgid "Emits information about lock usage." +msgstr "ბლოკის გამოყენების შესახებ ინფორმაციის გამოტანა." + +#: utils/misc/guc.c:1649 +msgid "Emits information about user lock usage." +msgstr "მომხმარებლის ბლოკის გამოყენების შესახებ ინფორმაციის გამოტანა." + +#: utils/misc/guc.c:1659 +msgid "Emits information about lightweight lock usage." +msgstr "მსუბუქი ბლოკის გამოყენების შესახებ ინფორმაციის გამოტანა." + +#: utils/misc/guc.c:1669 +msgid "Dumps information about all current locks when a deadlock timeout occurs." +msgstr "" + +#: utils/misc/guc.c:1681 +msgid "Logs long lock waits." +msgstr "ბლოკირების დიდხნიანია ლოდინის ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1690 +msgid "Logs standby recovery conflict waits." +msgstr "მომლოდინის აღდგენის კონფლიქტის ლოდინების ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:1699 +msgid "Logs the host name in the connection logs." +msgstr "ჟურნალში ჰოსტის სახელის ჩაწერა." + +#: utils/misc/guc.c:1700 +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 "" + +#: utils/misc/guc.c:1711 +msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." +msgstr "\"expr=NULL\" მიღებული იქნება, როგორც \"expr IS NULL\"." + +#: utils/misc/guc.c:1712 +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 "" + +#: utils/misc/guc.c:1724 +msgid "Enables per-database user names." +msgstr "თითოეული ბაზისთვის საკუთარი მომხმარებლის სახელების ჩართვა." + +#: utils/misc/guc.c:1733 +msgid "Sets the default read-only status of new transactions." +msgstr "ახალი ტრანზაქციების მხოლოდ კითხვადობის სტატუსის ნაგულისხმევად დაყენება." + +#: utils/misc/guc.c:1743 +msgid "Sets the current transaction's read-only status." +msgstr "მიმდინარე ტრანზაქციის მხოლოდ-კითხვადობის სტატუსის დაყენება." + +#: utils/misc/guc.c:1753 +msgid "Sets the default deferrable status of new transactions." +msgstr "" + +#: utils/misc/guc.c:1762 +msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." +msgstr "" + +#: utils/misc/guc.c:1772 +msgid "Enable row security." +msgstr "მწკრივების უსაფრთხოების ჩართვა." + +#: utils/misc/guc.c:1773 +msgid "When enabled, row security will be applied to all users." +msgstr "თუ ჩართავთ, მწკრივის უსაფრთხოება ყველა მომხმარებელზე გადატარდება." + +#: utils/misc/guc.c:1781 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "ქვეპროგრამის სხეულების შემოწმება CREATE FUNCTION-ის და CREATE PROCEDURE-ის დროს." + +#: utils/misc/guc.c:1790 +msgid "Enable input of NULL elements in arrays." +msgstr "მასივებში NULL ტიპის ელემენტების შეყვანის ჩართვა." + +#: utils/misc/guc.c:1791 +msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." +msgstr "" + +#: utils/misc/guc.c:1807 +msgid "WITH OIDS is no longer supported; this can only be false." +msgstr "WITH OIDS მხარდაჭერილი აღარაა. ის ყოველთვის ნულის ტოლია." + +#: utils/misc/guc.c:1817 +msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." +msgstr "" + +#: utils/misc/guc.c:1826 +msgid "Truncate existing log files of same name during log rotation." +msgstr "" + +#: utils/misc/guc.c:1837 +msgid "Emit information about resource usage in sorting." +msgstr "ინფორმაციის გამოტანა დალაგების მიერ რესურსების გამოყენების შესახებ." + +#: utils/misc/guc.c:1851 +msgid "Generate debugging output for synchronized scanning." +msgstr "სინქრონიზებული სკანირების შესახებ გამართვის ინფორმაციის გამოტანა." + +#: utils/misc/guc.c:1866 +msgid "Enable bounded sorting using heap sort." +msgstr "" + +#: utils/misc/guc.c:1879 +msgid "Emit WAL-related debugging output." +msgstr "'WAL'-თან დაკავშირებული გამართვის ინფორმაციის გამოტანა." + +#: utils/misc/guc.c:1891 +msgid "Shows whether datetimes are integer based." +msgstr "აჩვენებს, არის თუ არა თარიღი და დრო მთელი რიცხვი." + +#: utils/misc/guc.c:1902 +msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." +msgstr "იქნება Kerberos-ის და GSSAPI-ის მომხმარებლის სახელები რეგისტრზე-დამოკიდებული, თუ არა." + +#: utils/misc/guc.c:1912 +msgid "Warn about backslash escapes in ordinary string literals." +msgstr "" + +#: utils/misc/guc.c:1922 +msgid "Causes '...' strings to treat backslashes literally." +msgstr "" + +#: utils/misc/guc.c:1933 +msgid "Enable synchronized sequential scans." +msgstr "სინქრონული მიმდევრობითი სკანირებების ჩართვა." + +#: utils/misc/guc.c:1943 +msgid "Sets whether to include or exclude transaction with recovery target." +msgstr "აყენებს იქნება ჩასმული ტრანზაქცია აღდგენის სამიზნესთან ერთად, თუ არა." + +#: utils/misc/guc.c:1953 +msgid "Allows connections and queries during recovery." +msgstr "აღდგენისას მიერთებების და მოთხოვნების დაშვება." + +#: utils/misc/guc.c:1963 +msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." +msgstr "" + +#: utils/misc/guc.c:1973 +msgid "Shows whether hot standby is currently active." +msgstr "აჩვენებს, ამჟამად ცხელი მომლოდინე აქტიურია, თუ არა." + +#: utils/misc/guc.c:1984 +msgid "Allows modifications of the structure of system tables." +msgstr "სისტემური ცხრილების სტრუქტურის ცვლილების დაშვება." + +#: utils/misc/guc.c:1995 +msgid "Disables reading from system indexes." +msgstr "სისტემური ინდექსებიდან კითხვის გამორთვა." + +#: utils/misc/guc.c:1996 +msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." +msgstr "ის ინდექსების განახლებას ხელს არ უშლის, ასე რომ, გამოსაყენებლად უსაფრთხოა. ყველაზე ცუდი, რაც სჭირს, ნელია." + +#: utils/misc/guc.c:2007 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "გამოსაცდელად ცხრილის სივრცეების პირდაპირ ph_tblspc-ში დაშვება." + +#: utils/misc/guc.c:2018 +msgid "Enables backward compatibility mode for privilege checks on large objects." +msgstr "დიდი ობიექტების პრივილეგიების შემოწმების წინა ვერსიებთან თავსებადი რეჟიმის ჩართვა." + +#: utils/misc/guc.c:2019 +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:2029 +msgid "When generating SQL fragments, quote all identifiers." +msgstr "SQL ფრაგმენტების გენერაციისას ყველა იდენტიფიკატორის ბრჭყალებში ჩასმა." + +#: utils/misc/guc.c:2039 +msgid "Shows whether data checksums are turned on for this cluster." +msgstr "აჩვენებს, ამ კლასტერზე მონაცემების საკონტროლო ჯამები ჩართულია, თუ არა." + +#: utils/misc/guc.c:2050 +msgid "Add sequence number to syslog messages to avoid duplicate suppression." +msgstr "დუბლირებული შეტყობინებების შეკვეცის თავიდან ასაცილებლად ჟურნალში გაგზავნილი შეტყობინებებისთვის მიმდევრობის ნომრის დამატება." + +#: utils/misc/guc.c:2060 +msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." +msgstr "Syslog-ისთვის გაგზავნილი შეტყობინებების დაჭრა და 1024 ბაიტში ჩატევა." + +#: utils/misc/guc.c:2070 +msgid "Controls whether Gather and Gather Merge also run subplans." +msgstr "" + +#: utils/misc/guc.c:2071 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "" + +#: utils/misc/guc.c:2081 +msgid "Allow JIT compilation." +msgstr "JIT კომპილაციის ჩართვა." + +#: utils/misc/guc.c:2092 +msgid "Register JIT-compiled functions with debugger." +msgstr "JIT-ით კომპილირებული ფუნქციების გამმართველთან რეგისტრაცია." + +#: utils/misc/guc.c:2109 +msgid "Write out LLVM bitcode to facilitate JIT debugging." +msgstr "" + +#: utils/misc/guc.c:2120 +msgid "Allow JIT compilation of expressions." +msgstr "გამოსახულებების JIT კომპილაციის დაშვება." + +#: utils/misc/guc.c:2131 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "" + +#: utils/misc/guc.c:2148 +msgid "Allow JIT compilation of tuple deforming." +msgstr "კორტეჟის დეფორმაციის JIT კომპილაციის დაშვება." + +#: utils/misc/guc.c:2159 +msgid "Whether to continue running after a failure to sync data files." +msgstr "გაგრძელდება მუშაობა მონაცემის ფაილების სინქრონიზაციის ჩავარდნის შემდეგ, თუ არა." + +#: utils/misc/guc.c:2168 +msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." +msgstr "" + +#: utils/misc/guc.c:2186 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "" + +#: utils/misc/guc.c:2197 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "" + +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 +msgid "This allows attaching a debugger to the process." +msgstr "პროცესისთვის გამმართველის მიბმის უფლების მიცემა." + +#: utils/misc/guc.c:2208 +msgid "Sets the default statistics target." +msgstr "სტატისტიკის ნაგულისხმევი სამიზნის დაყენება." + +#: utils/misc/guc.c:2209 +msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." +msgstr "" + +#: utils/misc/guc.c:2218 +msgid "Sets the FROM-list size beyond which subqueries are not collapsed." +msgstr "" + +#: utils/misc/guc.c:2220 +msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." +msgstr "" + +#: utils/misc/guc.c:2231 +msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." +msgstr "" + +#: utils/misc/guc.c:2233 +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 "" + +#: utils/misc/guc.c:2244 +msgid "Sets the threshold of FROM items beyond which GEQO is used." +msgstr "" + +#: utils/misc/guc.c:2254 +msgid "GEQO: effort is used to set the default for other GEQO parameters." +msgstr "" + +#: utils/misc/guc.c:2264 +msgid "GEQO: number of individuals in the population." +msgstr "GEQO: ინდივიდების რაოდენობა პოპულაციაში." + +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 +msgid "Zero selects a suitable default value." +msgstr "ნული შესაბამის ნაგულისხმევ მნიშვნელობას აირჩევს." + +#: utils/misc/guc.c:2274 +msgid "GEQO: number of iterations of the algorithm." +msgstr "GEQO: ალგორითმის იტერაციების რაოდენობა." + +#: utils/misc/guc.c:2286 +msgid "Sets the time to wait on a lock before checking for deadlock." +msgstr "" + +#: utils/misc/guc.c:2297 +msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." +msgstr "" + +#: utils/misc/guc.c:2308 +msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." +msgstr "" + +#: utils/misc/guc.c:2319 +msgid "Sets the minimum delay for applying changes during recovery." +msgstr "აღდგენისას ცვლილებების გადატარების მინიმალური დაყოვნების დაყენება." + +#: utils/misc/guc.c:2330 +msgid "Sets the maximum interval between WAL receiver status reports to the sending server." +msgstr "" + +#: utils/misc/guc.c:2341 +msgid "Sets the maximum wait time to receive data from the sending server." +msgstr "" + +#: utils/misc/guc.c:2352 +msgid "Sets the maximum number of concurrent connections." +msgstr "აყენებს ერთდროული შეერთებების მაქსიმალურ რაოდენობას." + +#: utils/misc/guc.c:2363 +msgid "Sets the number of connection slots reserved for superusers." +msgstr "აყენებს ზემომხმარებლებისთვის რეზერვირებული შეერთების სლოტებს." + +#: utils/misc/guc.c:2373 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "გაშვებისას დარეზერვებული დინამიური გაზიარებული მეხსიერების რაოდენობა." + +#: utils/misc/guc.c:2388 +msgid "Sets the number of shared memory buffers used by the server." +msgstr "სერვერის მიერ გამოყენებული გაზიარებული მეხსიერების ბაფერების რაოდენობის დაყენება." + +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "" + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 ნიშნავს, რომ მნიშვნელობა ვერ განისაზღვრა." + +#: utils/misc/guc.c:2421 +msgid "Sets the maximum number of temporary buffers used by each session." +msgstr "" + +#: utils/misc/guc.c:2432 +msgid "Sets the TCP port the server listens on." +msgstr "TCP პორტის მითითება, რომელზეც სერვერი უსმენს." + +#: utils/misc/guc.c:2442 +msgid "Sets the access permissions of the Unix-domain socket." +msgstr "Unix-დომენის სოკეტზე წვდომის უფლებების დაყენება." + +#: utils/misc/guc.c:2443 +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 "" + +#: utils/misc/guc.c:2457 +msgid "Sets the file permissions for log files." +msgstr "ჟურნალის ფაილების წვდომების დაყენება." + +#: utils/misc/guc.c:2458 +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 "" + +#: utils/misc/guc.c:2472 +msgid "Shows the mode of the data directory." +msgstr "მონაცემების საქაღალდის წვდომის ჩვენება." + +#: utils/misc/guc.c:2473 +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 "" + +#: utils/misc/guc.c:2486 +msgid "Sets the maximum memory to be used for query workspaces." +msgstr "მოთხოვნის სამუშაო სივრცის მიერ გამოყენებული მეხსიერების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:2487 +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:2499 +msgid "Sets the maximum memory to be used for maintenance operations." +msgstr "ტექნიკური ოპერაციებისთვის გამოყენებული მეხსიერების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:2500 +msgid "This includes operations such as VACUUM and CREATE INDEX." +msgstr "მოიცავს ისეთ ოპერაციებს, როგორებიცაა VACUUM და CREATE INDEX." + +#: utils/misc/guc.c:2510 +msgid "Sets the maximum memory to be used for logical decoding." +msgstr "ლოგიკური გაშიფვრისთვის გამოყენებული მეხსიერების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:2511 +msgid "This much memory can be used by each internal reorder buffer before spilling to disk." +msgstr "" + +#: utils/misc/guc.c:2527 +msgid "Sets the maximum stack depth, in kilobytes." +msgstr "სტეკის მაქსიმალური სიღრმე კილობაიტებში." + +#: utils/misc/guc.c:2538 +msgid "Limits the total size of all temporary files used by each process." +msgstr "" + +#: utils/misc/guc.c:2539 +msgid "-1 means no limit." +msgstr "-1 ნიშნავს ლიმიტის გარეშე." + +#: utils/misc/guc.c:2549 +msgid "Vacuum cost for a page found in the buffer cache." +msgstr "ბაფერის ქეშში ნაპოვნი გვერდის მომტვერსასრუტების ფასი." + +#: utils/misc/guc.c:2559 +msgid "Vacuum cost for a page not found in the buffer cache." +msgstr "ბაფერის ქეშში გვერდის მომტვერსასრუტების ფასი ნაპოვნი არაა." + +#: utils/misc/guc.c:2569 +msgid "Vacuum cost for a page dirtied by vacuum." +msgstr "" + +#: utils/misc/guc.c:2579 +msgid "Vacuum cost amount available before napping." +msgstr "" + +#: utils/misc/guc.c:2589 +msgid "Vacuum cost amount available before napping, for autovacuum." +msgstr "" + +#: utils/misc/guc.c:2599 +msgid "Sets the maximum number of simultaneously open files for each server process." +msgstr "" + +#: utils/misc/guc.c:2612 +msgid "Sets the maximum number of simultaneously prepared transactions." +msgstr "" + +#: utils/misc/guc.c:2623 +msgid "Sets the minimum OID of tables for tracking locks." +msgstr "" + +#: utils/misc/guc.c:2624 +msgid "Is used to avoid output on system tables." +msgstr "გამოიყენება სისტემურ ცხრილებზე გამოტანის თავიდან ასაცილებლად." + +#: utils/misc/guc.c:2633 +msgid "Sets the OID of the table with unconditionally lock tracing." +msgstr "" + +#: utils/misc/guc.c:2645 +msgid "Sets the maximum allowed duration of any statement." +msgstr "აყენებს ნებისმიერი გამოსახულების დაშვებულ მაქსიმალურ ხანგრძლივობას." + +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 utils/misc/guc.c:2679 +msgid "A value of 0 turns off the timeout." +msgstr "0 მოლოდინის ვადას გამორთავს." + +#: utils/misc/guc.c:2656 +msgid "Sets the maximum allowed duration of any wait for a lock." +msgstr "აყენებს ბლოკირების ნებისმიერი მოლოდინისთვის დაშვებულ მაქსიმალურ ხანგრძლივობას." + +#: utils/misc/guc.c:2667 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "აყენებს მაქსიმალურ დაყოვნებას მოთხოვნებს შორის, როცა ის ტრანზაქციაშია." + +#: utils/misc/guc.c:2678 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "აყენებს მაქსიმალურ დაყოვნებას მოთხოვნებს შორის, როცა ის ტრანზაქციაში არაა." + +#: utils/misc/guc.c:2689 +msgid "Minimum age at which VACUUM should freeze a table row." +msgstr "" + +#: utils/misc/guc.c:2699 +msgid "Age at which VACUUM should scan whole table to freeze tuples." +msgstr "" + +#: utils/misc/guc.c:2709 +msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." +msgstr "" + +#: utils/misc/guc.c:2719 +msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." +msgstr "" + +#: utils/misc/guc.c:2729 +msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." +msgstr "" + +#: utils/misc/guc.c:2738 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" + +#: utils/misc/guc.c:2747 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" + +#: utils/misc/guc.c:2760 +msgid "Sets the maximum number of locks per transaction." +msgstr "ტრანზაქციაში ბლოკების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:2761 +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 "" + +#: utils/misc/guc.c:2772 +msgid "Sets the maximum number of predicate locks per transaction." +msgstr "" + +#: utils/misc/guc.c:2773 +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 "" + +#: utils/misc/guc.c:2784 +msgid "Sets the maximum number of predicate-locked pages and tuples per relation." +msgstr "" + +#: utils/misc/guc.c:2785 +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:2795 +msgid "Sets the maximum number of predicate-locked tuples per page." +msgstr "" + +#: utils/misc/guc.c:2796 +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:2806 +msgid "Sets the maximum allowed time to complete client authentication." +msgstr "კლიენტის ავთენტიკაციის დასრულებისთვის დაშვებული მაქსიმალური დროის დაყენება." + +#: utils/misc/guc.c:2818 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "" + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "აღდგენისას WAL-ში წინასწარ-კითხვის ბაფერის ზომა." + +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" + +#: utils/misc/guc.c:2841 +msgid "Sets the size of WAL files held for standby servers." +msgstr "მომლოდინე სერვერებისთვის WAL ფაილებისთვის შენახული ზომის დაყენება." + +#: utils/misc/guc.c:2852 +msgid "Sets the minimum size to shrink the WAL to." +msgstr "WAL-ის შემცირების მინიმალური ზომის დაყენება." + +#: utils/misc/guc.c:2864 +msgid "Sets the WAL size that triggers a checkpoint." +msgstr "აყენებს WAL-ის ზომას, რომელიც საკონტროლო წერტილს ატრიგერებს." + +#: utils/misc/guc.c:2876 +msgid "Sets the maximum time between automatic WAL checkpoints." +msgstr "ავტომატური WAL საკონტროლო წერტილებს შორის მაქსიმალური დროის დაყენება." + +#: utils/misc/guc.c:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "" + +#: utils/misc/guc.c:2889 +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:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 +msgid "Number of pages after which previously performed writes are flushed to disk." +msgstr "" + +#: utils/misc/guc.c:2913 +msgid "Sets the number of disk-page buffers in shared memory for WAL." +msgstr "" + +#: utils/misc/guc.c:2924 +msgid "Time between WAL flushes performed in the WAL writer." +msgstr "" + +#: utils/misc/guc.c:2935 +msgid "Amount of WAL written out by WAL writer that triggers a flush." +msgstr "" + +#: utils/misc/guc.c:2946 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "" + +#: utils/misc/guc.c:2957 +msgid "Sets the maximum number of simultaneously running WAL sender processes." +msgstr "" + +#: utils/misc/guc.c:2968 +msgid "Sets the maximum number of simultaneously defined replication slots." +msgstr "" + +#: utils/misc/guc.c:2978 +msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgstr "" + +#: utils/misc/guc.c:2979 +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 "" + +#: utils/misc/guc.c:2991 +msgid "Sets the maximum time to wait for WAL replication." +msgstr "WAL რეპლიკაციის მოლოდინის მაქსიმალური ვადის დაყენება." + +#: utils/misc/guc.c:3002 +msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." +msgstr "" + +#: utils/misc/guc.c:3014 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "" + +#: utils/misc/guc.c:3025 +msgid "Sets the number of digits displayed for floating-point values." +msgstr "" + +#: utils/misc/guc.c:3026 +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 "" + +#: utils/misc/guc.c:3038 +msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." +msgstr "" + +#: utils/misc/guc.c:3041 +msgid "Zero logs a sample of all queries. -1 turns this feature off." +msgstr "" + +#: utils/misc/guc.c:3051 +msgid "Sets the minimum execution time above which all statements will be logged." +msgstr "" + +#: utils/misc/guc.c:3053 +msgid "Zero prints all queries. -1 turns this feature off." +msgstr "0-ს ყველა მოთხოვნა გამოაქვს, -1 გამორთავს ამ ფუნქციას." + +#: utils/misc/guc.c:3063 +msgid "Sets the minimum execution time above which autovacuum actions will be logged." +msgstr "" + +#: utils/misc/guc.c:3065 +msgid "Zero prints all actions. -1 turns autovacuum logging off." +msgstr "0-ს ყველა ქმედება გამოაქვს. -1 გამორთავს ავტომომტვერსასრუტებას." + +#: utils/misc/guc.c:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" + +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 +msgid "-1 to print values in full." +msgstr "-1 მნიშვნელობების სრულად გამოსატანად." + +#: utils/misc/guc.c:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" + +#: utils/misc/guc.c:3099 +msgid "Background writer sleep time between rounds." +msgstr "" + +#: utils/misc/guc.c:3110 +msgid "Background writer maximum number of LRU pages to flush per round." +msgstr "" + +#: utils/misc/guc.c:3133 +msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." +msgstr "" + +#: utils/misc/guc.c:3151 +msgid "A variant of effective_io_concurrency that is used for maintenance work." +msgstr "" + +#: utils/misc/guc.c:3181 +msgid "Maximum number of concurrent worker processes." +msgstr "ერთდროულად გაშვებული დამხმარე პროცესების მაქსიმალური რაოდენობა." + +#: utils/misc/guc.c:3193 +msgid "Maximum number of logical replication worker processes." +msgstr "ლოგიკური რეპლიკაციის დამხმარე პროცესების მაქსიმალური რაოდენობა." + +#: utils/misc/guc.c:3205 +msgid "Maximum number of table synchronization workers per subscription." +msgstr "თითოეული გამოწერის ცხრილის სინქრონიზაციის დამხმარე პროცესების მაქსიმალური რაოდენობა." + +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "" + +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "" + +#: utils/misc/guc.c:3239 +msgid "Shows the maximum number of function arguments." +msgstr "ფუნქციის არგუმენტების მაქსიმალური რაოდენობის ჩვენება." + +#: utils/misc/guc.c:3250 +msgid "Shows the maximum number of index keys." +msgstr "ინდექსის გასაღებების მაქსიმალური რაოდენობის ჩვენება." + +#: utils/misc/guc.c:3261 +msgid "Shows the maximum identifier length." +msgstr "იდენტიფიკატორის მაქსიმალური სიგრძის ჩვენება." + +#: utils/misc/guc.c:3272 +msgid "Shows the size of a disk block." +msgstr "დისკის ბლოკის ზომის ჩვენება." + +#: utils/misc/guc.c:3283 +msgid "Shows the number of pages per disk file." +msgstr "ფაილში არსებული გვერდების რაოდენობის ჩვენება." + +#: utils/misc/guc.c:3294 +msgid "Shows the block size in the write ahead log." +msgstr "წინასწარ-ჩაწერადი ჟურნალის ბლოკის ზომის ჩვენება." + +#: utils/misc/guc.c:3305 +msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +msgstr "" + +#: utils/misc/guc.c:3317 +msgid "Shows the size of write ahead log segments." +msgstr "წინასწარ-ჩაწერადი ჟურნალის სეგმენტების ზომის ჩვენება." + +#: utils/misc/guc.c:3330 +msgid "Time to sleep between autovacuum runs." +msgstr "ძილის დრო ავტომომტვერსასრუტებების გაშვებებს შორის." + +#: utils/misc/guc.c:3340 +msgid "Minimum number of tuple updates or deletes prior to vacuum." +msgstr "" + +#: utils/misc/guc.c:3349 +msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." +msgstr "" + +#: utils/misc/guc.c:3358 +msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." +msgstr "" + +#: utils/misc/guc.c:3368 +msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." +msgstr "" + +#: utils/misc/guc.c:3380 +msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." +msgstr "" + +#: utils/misc/guc.c:3390 +msgid "Sets the maximum number of simultaneously running autovacuum worker processes." +msgstr "ერთდროულად გაშვებული ავტომომტვერსასრუტების დამხმარე პროცესების რაოდენობის დაყენება." + +#: utils/misc/guc.c:3400 +msgid "Sets the maximum number of parallel processes per maintenance operation." +msgstr "თითოეული რემონტის ოპერაციისთვის პარალელური პროცესების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:3410 +msgid "Sets the maximum number of parallel processes per executor node." +msgstr "თითოეული შემსრულებელი კვანძისთვის პარალელურად გაშვებული პროცესების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:3421 +msgid "Sets the maximum number of parallel workers that can be active at one time." +msgstr "ერთდროულად აქტიური პარალელური დამხმარე პროცესების მაქსიმალური რაოდენობის დაყენება." + +#: utils/misc/guc.c:3432 +msgid "Sets the maximum memory to be used by each autovacuum worker process." +msgstr "თითოეული ავტომომტვერსასრუტების დამხმარე პროცესის მიერ გამოყენებული მაქსიმალური მეხსიერების რაოდენობის დაყენება." + +#: utils/misc/guc.c:3443 +msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." +msgstr "" + +#: utils/misc/guc.c:3444 +msgid "A value of -1 disables this feature." +msgstr "მნიშვნელობა -1 გამორთავს ამ ფუნქციას." + +#: utils/misc/guc.c:3454 +msgid "Time between issuing TCP keepalives." +msgstr "დაყოვნება TCP keepalive პაკეტებს შორის." + +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 +msgid "A value of 0 uses the system default." +msgstr "სისტემური ნაგულისხმევი მნიშვნელობის გამოსაყენებლად მიუთითეთ 0." + +#: utils/misc/guc.c:3465 +msgid "Time between TCP keepalive retransmits." +msgstr "დაყოვნება TCP keepalive პაკეტების გადაგზავნებს შორის." + +#: utils/misc/guc.c:3476 +msgid "SSL renegotiation is no longer supported; this can only be 0." +msgstr "SSL-ის თავიდან დაყენება უკვე მხარდაუჭერელია. შეგიძლიათ დააყენოთ მხოლოდ 0." + +#: utils/misc/guc.c:3487 +msgid "Maximum number of TCP keepalive retransmits." +msgstr "TCP Keepalive-ების გადაგზავნის მაქსიმალური რაოდენობა." + +#: utils/misc/guc.c:3488 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "" + +#: utils/misc/guc.c:3499 +msgid "Sets the maximum allowed result for exact search by GIN." +msgstr "" + +#: utils/misc/guc.c:3510 +msgid "Sets the planner's assumption about the total size of the data caches." +msgstr "" + +#: utils/misc/guc.c:3511 +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 "" + +#: utils/misc/guc.c:3522 +msgid "Sets the minimum amount of table data for a parallel scan." +msgstr "ცხრილის მონაცემების მინიმალური რაოდენობა პარალელური სკანირებისთვის." + +#: utils/misc/guc.c:3523 +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:3533 +msgid "Sets the minimum amount of index data for a parallel scan." +msgstr "" + +#: utils/misc/guc.c:3534 +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:3545 +msgid "Shows the server version as an integer." +msgstr "სერვერის ვერსიას, როგორც მთელ რიცხვს, ისე აჩვენებს." + +#: utils/misc/guc.c:3556 +msgid "Log the use of temporary files larger than this number of kilobytes." +msgstr "მითითებული რაოდენობა კილობაიტზე უფრო დიდი დროებითი ფაილების გამოყენების ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:3557 +msgid "Zero logs all files. The default is -1 (turning this feature off)." +msgstr "" + +#: utils/misc/guc.c:3567 +msgid "Sets the size reserved for pg_stat_activity.query, in bytes." +msgstr "'pg_stat_activity.query'-სთვის დაცული მეხსიერების ზომის დაყნება, ბაიტებში." + +#: utils/misc/guc.c:3578 +msgid "Sets the maximum size of the pending list for GIN index." +msgstr "" + +#: utils/misc/guc.c:3589 +msgid "TCP user timeout." +msgstr "TCP მომხმარებლის ლოდინის ვადა." + +#: utils/misc/guc.c:3600 +msgid "The size of huge page that should be requested." +msgstr "მოსათხოვი უზარმაზარი გვერდების (hugepages) ზომა." + +#: utils/misc/guc.c:3611 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "" + +#: utils/misc/guc.c:3634 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "" + +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "" + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "0 გამორთავს ამ ფუნქციას." + +#: utils/misc/guc.c:3666 +msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." +msgstr "" + +#: utils/misc/guc.c:3677 +msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." +msgstr "" + +#: utils/misc/guc.c:3688 +msgid "Sets the planner's estimate of the cost of processing each tuple (row)." +msgstr "" + +#: utils/misc/guc.c:3699 +msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." +msgstr "" + +#: utils/misc/guc.c:3710 +msgid "Sets the planner's estimate of the cost of processing each operator or function call." +msgstr "" + +#: utils/misc/guc.c:3721 +msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." +msgstr "" + +#: utils/misc/guc.c:3732 +msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." +msgstr "" + +#: utils/misc/guc.c:3744 +msgid "Perform JIT compilation if query is more expensive." +msgstr "თუ მოთხოვნა უფრო ძვირია, JIT კომპილაციის შესრულება." + +#: utils/misc/guc.c:3745 +msgid "-1 disables JIT compilation." +msgstr "-1 JIT კომპილაციას გამორთავს." + +#: utils/misc/guc.c:3755 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "" + +#: utils/misc/guc.c:3756 +msgid "-1 disables optimization." +msgstr "-1 ოპტიმიზაციას გამორთავს." + +#: utils/misc/guc.c:3766 +msgid "Perform JIT inlining if query is more expensive." +msgstr "" + +#: utils/misc/guc.c:3767 +msgid "-1 disables inlining." +msgstr "-1 გამორთავს კოდის ჩადგმას." + +#: utils/misc/guc.c:3777 +msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +msgstr "" + +#: utils/misc/guc.c:3789 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "" + +#: utils/misc/guc.c:3801 +msgid "GEQO: selective pressure within the population." +msgstr "GEQO: შერჩევითი ზეწოლა პოპულაციაში." + +#: utils/misc/guc.c:3812 +msgid "GEQO: seed for random path selection." +msgstr "" + +#: utils/misc/guc.c:3823 +msgid "Multiple of work_mem to use for hash tables." +msgstr "" + +#: utils/misc/guc.c:3834 +msgid "Multiple of the average buffer usage to free per round." +msgstr "" + +#: utils/misc/guc.c:3844 +msgid "Sets the seed for random-number generation." +msgstr "" + +#: utils/misc/guc.c:3855 +msgid "Vacuum cost delay in milliseconds." +msgstr "დამტვერსასრუტების დაყოვნება მილიწამებში." + +#: utils/misc/guc.c:3866 +msgid "Vacuum cost delay in milliseconds, for autovacuum." +msgstr "დამტვერსასრუტების დაყოვნება მილიწამებში, ავტოდამტვერსასრუტებისთვის." + +#: utils/misc/guc.c:3877 +msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc.c:3887 +msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc.c:3897 +msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc.c:3907 +msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." +msgstr "" + +#: utils/misc/guc.c:3917 +msgid "Fraction of statements exceeding log_min_duration_sample to be logged." +msgstr "" + +#: utils/misc/guc.c:3918 +msgid "Use a value between 0.0 (never log) and 1.0 (always log)." +msgstr "გამოიყენეთ მნიშვნელობები 0.0-დან (არასოდეს ჩაწერო ჟურნალში) და 1.0-ს (ჟურნალში ყოველთვის ჩაწერა) შუა." + +#: utils/misc/guc.c:3927 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "ადგენს ტრანზაქციის ნაწილს, რომლის შემდეგაც ყველა ოპერატორი ჟურნალში ჩაიწერება." + +#: utils/misc/guc.c:3928 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "" + +#: utils/misc/guc.c:3947 +msgid "Sets the shell command that will be called to archive a WAL file." +msgstr "" + +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "" + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "" + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc.c:3967 +msgid "Sets the shell command that will be called to retrieve an archived WAL file." +msgstr "არქივირებული WAL ფაილის მისაღებად გამოსაძახებელი გარსის ბრძანების დაყენება." + +#: utils/misc/guc.c:3977 +msgid "Sets the shell command that will be executed at every restart point." +msgstr "ყოველ გადატვირთვის წერტილზე გასაშვები გარსის ბრძანების დაყენება." + +#: utils/misc/guc.c:3987 +msgid "Sets the shell command that will be executed once at the end of recovery." +msgstr "" + +#: utils/misc/guc.c:3997 +msgid "Specifies the timeline to recover into." +msgstr "აღდგენისთვის დროის მითითება." + +#: utils/misc/guc.c:4007 +msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." +msgstr "" + +#: utils/misc/guc.c:4016 +msgid "Sets the transaction ID up to which recovery will proceed." +msgstr "ტრანზაქციის ID, რომლამდეც აღდგენა მოხდება." + +#: utils/misc/guc.c:4025 +msgid "Sets the time stamp up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc.c:4034 +msgid "Sets the named restore point up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc.c:4043 +msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc.c:4053 +msgid "Specifies a file name whose presence ends recovery in the standby." +msgstr "" + +#: utils/misc/guc.c:4063 +msgid "Sets the connection string to be used to connect to the sending server." +msgstr "" + +#: utils/misc/guc.c:4074 +msgid "Sets the name of the replication slot to use on the sending server." +msgstr "" + +#: utils/misc/guc.c:4084 +msgid "Sets the client's character set encoding." +msgstr "კლიენტის სიმბოლოების კოდირების დაყენება." + +#: utils/misc/guc.c:4095 +msgid "Controls information prefixed to each log line." +msgstr "ჟურნალის თითოეული ჩანაწერის პრეფიქსის კონტროლი." + +#: utils/misc/guc.c:4096 +msgid "If blank, no prefix is used." +msgstr "თუ ცარიელია, პრეფიქსი არ გამოიყენება." + +#: utils/misc/guc.c:4105 +msgid "Sets the time zone to use in log messages." +msgstr "ჟურნალის შეტყობინებების დასამახსოვრებლად გამოყენებული დროის სარტყლის დაყენება." + +#: utils/misc/guc.c:4115 +msgid "Sets the display format for date and time values." +msgstr "თარიღისა და დროის მნიშვნელობების ფორმატის დაყენება." + +#: utils/misc/guc.c:4116 +msgid "Also controls interpretation of ambiguous date inputs." +msgstr "" + +#: utils/misc/guc.c:4127 +msgid "Sets the default table access method for new tables." +msgstr "ახალი ცხრილების ნაგულისხმევი წვდომის უფლებების მითითება." + +#: utils/misc/guc.c:4138 +msgid "Sets the default tablespace to create tables and indexes in." +msgstr "" + +#: utils/misc/guc.c:4139 +msgid "An empty string selects the database's default tablespace." +msgstr "ცარიელი სტრიქონი ბაზის ნაგულისხმევ ცხრილების სივრცეს აირჩევს." + +#: utils/misc/guc.c:4149 +msgid "Sets the tablespace(s) to use for temporary tables and sort files." +msgstr "" + +#: utils/misc/guc.c:4160 +msgid "Sets the path for dynamically loadable modules." +msgstr "დინამიურად ჩატვირთული მოდულების ბილიკის დაყენება." + +#: utils/misc/guc.c:4161 +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:4174 +msgid "Sets the location of the Kerberos server key file." +msgstr "Kerberos-ის სერვერის გასაღების ფაილის მდებარეობის მითითება." + +#: utils/misc/guc.c:4185 +msgid "Sets the Bonjour service name." +msgstr "Bonjour-ის სერვისის სახელის დაყენება." + +#: utils/misc/guc.c:4197 +msgid "Shows the collation order locale." +msgstr "დალაგების წესის ჩვენება." + +#: utils/misc/guc.c:4208 +msgid "Shows the character classification and case conversion locale." +msgstr "სიმბოლოების ზომის გადაყვანისა და სიმბოლოების კლასიფიკაციის ენის ჩვენება." + +#: utils/misc/guc.c:4219 +msgid "Sets the language in which messages are displayed." +msgstr "შეტყობინებების საჩვენებელი ენის მითითება." + +#: utils/misc/guc.c:4229 +msgid "Sets the locale for formatting monetary amounts." +msgstr "თანხის რიცხვების ფორმატირების სტანდარტის დაყენება." + +#: utils/misc/guc.c:4239 +msgid "Sets the locale for formatting numbers." +msgstr "რიცხვების ფორმატირების ენის დაყენება." + +#: utils/misc/guc.c:4249 +msgid "Sets the locale for formatting date and time values." +msgstr "თარიღისა და დროის ფორმატირების ენის დაყენება." + +#: utils/misc/guc.c:4259 +msgid "Lists shared libraries to preload into each backend." +msgstr "თითოეული უკანაბოლოსთვის გაშვებამდე ჩასატვირთი გაზიარებული ბიბლიოთეკების სია." + +#: utils/misc/guc.c:4270 +msgid "Lists shared libraries to preload into server." +msgstr "სერვერის გაშვებამდე ჩასატვირთი გაზიარებული ბიბლიოთეკების სია." + +#: utils/misc/guc.c:4281 +msgid "Lists unprivileged shared libraries to preload into each backend." +msgstr "თითოეული უკანაბოლოსთვის გაშვებამდე ჩასატვირთი არაპრივილეგირებული გაზიარებული ბიბლიოთეკების სია." + +#: utils/misc/guc.c:4292 +msgid "Sets the schema search order for names that are not schema-qualified." +msgstr "" + +#: utils/misc/guc.c:4304 +msgid "Shows the server (database) character set encoding." +msgstr "სერვერის (ბაზის) სიმბოლოების კოდირების ჩვენება." + +#: utils/misc/guc.c:4316 +msgid "Shows the server version." +msgstr "სერვერის ვერსიის ჩვენება." + +#: utils/misc/guc.c:4328 +msgid "Sets the current role." +msgstr "მიმდინარე როლის დაყენება." + +#: utils/misc/guc.c:4340 +msgid "Sets the session user name." +msgstr "სესიის მომხმარებლი სახელის დაყენება." + +#: utils/misc/guc.c:4351 +msgid "Sets the destination for server log output." +msgstr "სერვერის ჟურნალის გამოტანის სამიზნის დაყენება." + +#: utils/misc/guc.c:4352 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "" + +#: utils/misc/guc.c:4363 +msgid "Sets the destination directory for log files." +msgstr "ჟურნალის ფაილების საქაღალდის დაყენება." + +#: utils/misc/guc.c:4364 +msgid "Can be specified as relative to the data directory or as absolute path." +msgstr "" + +#: utils/misc/guc.c:4374 +msgid "Sets the file name pattern for log files." +msgstr "ჟურნალის ფაილების სახელის შაბლონის დაყენება." + +#: utils/misc/guc.c:4385 +msgid "Sets the program name used to identify PostgreSQL messages in syslog." +msgstr "Syslog-ში PostgreSQL-ის შეტყობინებების იდენტიფიკატორი პროგრამის სახელის დაყენება." + +#: utils/misc/guc.c:4396 +msgid "Sets the application name used to identify PostgreSQL messages in the event log." +msgstr "მოვლენების ჟურნალში PostgreSQL-ის შეტყობინებების იდენტიფიკატორი აპლიკაციის სახელის დაყენება." + +#: utils/misc/guc.c:4407 +msgid "Sets the time zone for displaying and interpreting time stamps." +msgstr "" + +#: utils/misc/guc.c:4417 +msgid "Selects a file of time zone abbreviations." +msgstr "დროის სარტყლების აბრევიატურების ფაილის მითითება." + +#: utils/misc/guc.c:4427 +msgid "Sets the owning group of the Unix-domain socket." +msgstr "Unix-დომენის სოკეტის მფლობლის ჯგუფის დაყენება." + +#: utils/misc/guc.c:4428 +msgid "The owning user of the socket is always the user that starts the server." +msgstr "სოკეტის მფლობელი მომხმარებელი ყოველთვის იგივე მომხმარებელია, ვინც სერვერი გაუშვა." + +#: utils/misc/guc.c:4438 +msgid "Sets the directories where Unix-domain sockets will be created." +msgstr "აყენებს საქაღალდეებს, სადაც Unix-ის სოკეტები შეიქმნება." + +#: utils/misc/guc.c:4453 +msgid "Sets the host name or IP address(es) to listen to." +msgstr "მოსასმენი IP მისამართი ან ჰოსტის სახელი." + +#: utils/misc/guc.c:4468 +msgid "Sets the server's data directory." +msgstr "სერვერის მონაცმების საქაღალდის დაყენება." + +#: utils/misc/guc.c:4479 +msgid "Sets the server's main configuration file." +msgstr "სერვერის კონფიგურაციის მთავარი ფაილის დაყენება." + +#: utils/misc/guc.c:4490 +msgid "Sets the server's \"hba\" configuration file." +msgstr "სერვერის hba კონფიგურაციის ფაილის დაყენება." + +#: utils/misc/guc.c:4501 +msgid "Sets the server's \"ident\" configuration file." +msgstr "სერვერის ident კონფიგურაციის ფაილის დაყენება." + +#: utils/misc/guc.c:4512 +msgid "Writes the postmaster PID to the specified file." +msgstr "Postmaster-ის PID-ის მითითებულ ფაილში ჩაწერა." + +#: utils/misc/guc.c:4523 +msgid "Shows the name of the SSL library." +msgstr "SSL ბიბლიოთეკის სახელის ჩვენება." + +#: utils/misc/guc.c:4538 +msgid "Location of the SSL server certificate file." +msgstr "SSL სერვერის სერტიფიკატის ფაილის მდებარეობა." + +#: utils/misc/guc.c:4548 +msgid "Location of the SSL server private key file." +msgstr "SSL სერვერის პირადი გასაღების ფაილის მდებარეობა." + +#: utils/misc/guc.c:4558 +msgid "Location of the SSL certificate authority file." +msgstr "SSL სერვერის CA ფაილის მდებარეობა." + +#: utils/misc/guc.c:4568 +msgid "Location of the SSL certificate revocation list file." +msgstr "SSL სერვერის გაუქმებული სერტიფიკატების სიის ფაილის მდებარეობა." + +#: utils/misc/guc.c:4578 +msgid "Location of the SSL certificate revocation list directory." +msgstr "SSL სერვერის გაუქმებული სერტიფიკატების სიის საქაღალდის მდებარეობა." + +#: utils/misc/guc.c:4588 +msgid "Number of synchronous standbys and list of names of potential synchronous ones." +msgstr "" + +#: utils/misc/guc.c:4599 +msgid "Sets default text search configuration." +msgstr "ტექსტის ძებნის ნაგულისხმევი კონფიგურაციის დაყენება." + +#: utils/misc/guc.c:4609 +msgid "Sets the list of allowed SSL ciphers." +msgstr "ჩართული SSL შიფრაციების სიის დაყენება." + +#: utils/misc/guc.c:4624 +msgid "Sets the curve to use for ECDH." +msgstr "ECDH-სთვის გამოყენებული მრუდის დაყენება." + +#: utils/misc/guc.c:4639 +msgid "Location of the SSL DH parameters file." +msgstr "SSH DH პარამეტრების ფაილის მდებარეობა." + +#: utils/misc/guc.c:4650 +msgid "Command to obtain passphrases for SSL." +msgstr "SSL-ის საკვანძო ფრაზების მისაღები ბრძანება." + +#: utils/misc/guc.c:4661 +msgid "Sets the application name to be reported in statistics and logs." +msgstr "" + +#: utils/misc/guc.c:4672 +msgid "Sets the name of the cluster, which is included in the process title." +msgstr "" + +#: utils/misc/guc.c:4683 +msgid "Sets the WAL resource managers for which WAL consistency checks are done." +msgstr "" + +#: utils/misc/guc.c:4684 +msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." +msgstr "" + +#: utils/misc/guc.c:4694 +msgid "JIT provider to use." +msgstr "JIT სერვისის მომწოდებელი." + +#: utils/misc/guc.c:4705 +msgid "Log backtrace for errors in these functions." +msgstr "მითითებულ ფუნქციებში შეცდომის შემთხვევაში სტეკის ჟურნალში ჩაწერა." + +#: utils/misc/guc.c:4725 +msgid "Sets whether \"\\'\" is allowed in string literals." +msgstr "შეიძლება თუ არა ტექსტურ სტრიქონებში \"\\\" სიმბოლოს გამოყენება." + +#: utils/misc/guc.c:4735 +msgid "Sets the output format for bytea." +msgstr "\"bytea\"-ის გამოსატანი ფორმატის დაყენება." + +#: utils/misc/guc.c:4745 +msgid "Sets the message levels that are sent to the client." +msgstr "კლიენტთან გაგზავნილი შეტყობინების დონეების დაყენება." + +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 utils/misc/guc.c:4919 +msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." +msgstr "" + +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "მოთხოვნის იდენტიფიკატორის ბირთვის-შიდა გამოთვლის ჩართვა." + +#: utils/misc/guc.c:4766 +msgid "Enables the planner to use constraints to optimize queries." +msgstr "მგეგმავისთვის შეზღუდვების ჩართვა, მოთხოვნების ოპტიმიზაციისთვის." + +#: utils/misc/guc.c:4767 +msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." +msgstr "" + +#: utils/misc/guc.c:4778 +msgid "Sets the default compression method for compressible values." +msgstr "შეკუმშვადი მნიშვნელობების ნაგულისხმევი შეკუმშვის მეთოდის დაყენება." + +#: utils/misc/guc.c:4789 +msgid "Sets the transaction isolation level of each new transaction." +msgstr "ახალი ტრანზაქციების იზოლაციის დონის დაყენება." + +#: utils/misc/guc.c:4799 +msgid "Sets the current transaction's isolation level." +msgstr "მიმდინარე ტრანზაქციის იზოლაციის დონის დაყენება." + +#: utils/misc/guc.c:4810 +msgid "Sets the display format for interval values." +msgstr "ინტერვალის მნიშვნელობების საჩვენებელი ფორმატის დაყენება." + +#: utils/misc/guc.c:4821 +msgid "Sets the verbosity of logged messages." +msgstr "ჟურნალში ჩაწერილი შეტყობინებების დეტალურობის დაყენება." + +#: utils/misc/guc.c:4831 +msgid "Sets the message levels that are logged." +msgstr "ჟურნალში ჩასაწერი შეტყობინების დონეების დაყენება." + +#: utils/misc/guc.c:4842 +msgid "Causes all statements generating error at or above this level to be logged." +msgstr "შეცდომის მითითებული ან უფრო ზედა კოდების ჟურნალში ჩაწერის მითითება." + +#: utils/misc/guc.c:4853 +msgid "Sets the type of statements logged." +msgstr "ჟურნალში ჩასაწერი ოპერატორის ტიპების დაყენება." + +#: utils/misc/guc.c:4863 +msgid "Sets the syslog \"facility\" to be used when syslog enabled." +msgstr "თუ სისტემურ ჟურნალში ჩაწერა ჩართულია, მიუთითებს syslog-ის \"facility\"-ის." + +#: utils/misc/guc.c:4878 +msgid "Sets the session's behavior for triggers and rewrite rules." +msgstr "სესიის ქცევის დაყენება ტრიგერებისა და გადაწერის წესებისთვის." + +#: utils/misc/guc.c:4888 +msgid "Sets the current transaction's synchronization level." +msgstr "მიმდინარე ტრანზაქციის სინქრონიზაციის დონის დაყენება." + +#: utils/misc/guc.c:4898 +msgid "Allows archiving of WAL files using archive_command." +msgstr "'WAL' ფაილების დაარქივების დაშვება 'archive_command'-ის გამოყენებით." + +#: utils/misc/guc.c:4908 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "" + +#: utils/misc/guc.c:4918 +msgid "Enables logging of recovery-related debugging information." +msgstr "აღდგენასთან კავშირში მყოფი გამართვის ინფორმაციის ჟურნალში ჩაწერის ჩართვა." + +#: utils/misc/guc.c:4935 +msgid "Collects function-level statistics on database activity." +msgstr "აგროვებს ფუნქციის დონის სტატისტიკას ბაზის აქტივობების შესახებ." + +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "სტატისტიკის მონაცემებთან წვდომის მიმდევრობის დაყენება." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "'WAL' ფაილში მითითებული მეთოდით ჩაწერილი სრული გვერდის ჩაწერების შეკუმშვა." + +#: utils/misc/guc.c:4966 +msgid "Sets the level of information written to the WAL." +msgstr "WAL-ში ჩაწერილი ინფორმაციის დონის დაყენება." + +#: utils/misc/guc.c:4976 +msgid "Selects the dynamic shared memory implementation used." +msgstr "გამოყენებული გაზიარებული მეხსიერების განხორციელების არჩევა." + +#: utils/misc/guc.c:4986 +msgid "Selects the shared memory implementation used for the main shared memory region." +msgstr "" + +#: utils/misc/guc.c:4996 +msgid "Selects the method used for forcing WAL updates to disk." +msgstr "WAL-ისთვის დისკზე განახლებების ნაძალადევად ჩაწერის მეთოდის დაყენება." + +#: utils/misc/guc.c:5006 +msgid "Sets how binary values are to be encoded in XML." +msgstr "XML-ში ბინარული მნიშვნელობების კოდირების ტიპის დაყენება." + +#: utils/misc/guc.c:5016 +msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." +msgstr "" + +#: utils/misc/guc.c:5027 +msgid "Use of huge pages on Linux or Windows." +msgstr "Linux-ზე და Windows-ზე უზარმაზარი გვერდების გამოყენება." + +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "აღდგენისას მიბმული ბლოკების წინასწარ გამოთხოვა." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "" + +#: utils/misc/guc.c:5047 +msgid "Forces use of parallel query facilities." +msgstr "მოთხოვნის პარალელური შესრულების ნაძალადევი ჩართვა." + +#: utils/misc/guc.c:5048 +msgid "If possible, run query using a parallel worker and with parallel restrictions." +msgstr "" + +#: utils/misc/guc.c:5058 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "აირჩიეთ პაროლების დასაშიფრად გამოყენებული ალგორითმი." + +#: utils/misc/guc.c:5068 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "" + +#: utils/misc/guc.c:5069 +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:5081 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "SSL/TLS-ის პროტოკოლის მინიმალური ვერსიის დაყენება." + +#: utils/misc/guc.c:5093 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "SSL/TLS-ის პროტოკოლის მაქსიმალური ვერსიის დაყენება." + +#: utils/misc/guc.c:5105 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "" + +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "კონფიგურაციის პარამეტრის არასწორი სახელი: %s" + +#: utils/misc/guc.c:5682 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "მომხმარებლის პარამეტრის სახელები ორი ან მეტი მარტივი, წერტილებით გამოყოფილი იდენტიფიკატორი უნდა იყოს." + +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" დაცული პრეფიქსია." + +#: utils/misc/guc.c:5712 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "კონფიგურაციის უცნობი პარამეტრი: \"%s\"" + +#: utils/misc/guc.c:6104 +#, c-format +msgid "%s: could not access directory \"%s\": %s\n" +msgstr "%s საქაღალდესთან %s წვდომის უფლება არ გაქვთ: %s\n" + +#: utils/misc/guc.c:6109 +#, c-format +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "PostgreSQL-ის მონაცემების საქაღალდის ინიციალიზაციისთვის initdb ან pg_basebackup გაუშვით.\n" + +#: utils/misc/guc.c:6129 +#, 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 "" + +#: utils/misc/guc.c:6148 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %s\n" +msgstr "" + +#: utils/misc/guc.c:6174 +#, 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 "" + +#: utils/misc/guc.c:6222 +#, 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 "" + +#: utils/misc/guc.c:6245 +#, 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 "" + +#: utils/misc/guc.c:7176 +msgid "Value exceeds integer range." +msgstr "\"lo_write\" -ის არგუმენტიმთელი რიცხვის დასაშვებ საზღვრებს სცდება." + +#: utils/misc/guc.c:7412 +#, 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:7448 +#, 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:7648 utils/misc/guc.c:9096 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "პარალელური ოპერაციის დროს პარამეტრების დაყენება შეუძლებელია" + +#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "პარამეტრი \"%s\" არ შეიძლება შეიცვალოს" + +#: utils/misc/guc.c:7698 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "პარამეტრი \"%s\" ახლა არ შეიძლება შეიცვალოს" + +#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 utils/misc/guc.c:11796 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "პარამეტრის (\"%s\") დაყენების წვდომა აკრძალულია" + +#: utils/misc/guc.c:7763 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "პარამეტრი \"%s\"-ის დაყენება კავშირის დამყარების შემდეგ შეუძლებელია" + +#: utils/misc/guc.c:7822 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "უსაფრთხოების აღმწერ ფუნქციაში პარამეტრ \"%s\"-ს ვერ გამოიყენებთ" + +#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10002 +#, c-format +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "" + +#: utils/misc/guc.c:8606 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s მხოლოდ ერთ არგუმენტს იღებს" + +#: utils/misc/guc.c:8886 +#, c-format +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "\"ALTER SYSTEM RESET ALL\"-ის შესრულების წვდომა აკრძალულია" + +#: utils/misc/guc.c:8953 +#, c-format +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "პარამეტრის მნიშვნელობა ALTER SYSTEM-სთვის არ შეიძლება, ახალი ხაზის სიმბოლოს შეიცავდეს" + +#: utils/misc/guc.c:8998 +#, c-format +msgid "could not parse contents of file \"%s\"" +msgstr "ფაილის დშემცველობის ამუშავების შეცდომა \"%s\"" + +#: utils/misc/guc.c:9172 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT განხორციელებული არაა" + +#: utils/misc/guc.c:9259 +#, c-format +msgid "SET requires parameter name" +msgstr "SET მოითხოვს პარამეტრის სახელს" + +#: utils/misc/guc.c:9392 +#, c-format +msgid "attempt to redefine parameter \"%s\"" +msgstr "პარამეტრის თავიდან აღწერის მცდელობა: \"%s\"" + +#: utils/misc/guc.c:9719 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "კონფიგურაციის პარამეტრის არასწორი სახელი: \"%s\". წაიშლება" + +#: utils/misc/guc.c:9721 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" ახლა დაცული პრეფიქსია." + +#: utils/misc/guc.c:11236 +#, c-format +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "პარამეტრის \"%s\" \"%s\"-ზე დაყენებისას" + +#: utils/misc/guc.c:11405 +#, c-format +msgid "parameter \"%s\" could not be set" +msgstr "პარამეტრის დაყენების შეცდომა: \"%s\"" + +#: utils/misc/guc.c:11497 +#, c-format +msgid "could not parse setting for parameter \"%s\"" +msgstr "პარამეტრის მნიშვნელობის დამუშავების შეცდომა: %s" + +#: utils/misc/guc.c:11928 +#, c-format +msgid "invalid value for parameter \"%s\": %g" +msgstr "არასწორი მნიშვნელობა პარამეტრისთვის \"%s\": %g" + +#: utils/misc/guc.c:12241 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "" + +#: utils/misc/guc.c:12253 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "ამ აგებაში Bonjour -ის მხარდაჭერა არ არსებბს" + +#: utils/misc/guc.c:12266 +#, c-format +msgid "SSL is not supported by this build" +msgstr "ამ აგებაში SSL-ის მხარდაჭერა არ არსებბს" + +#: utils/misc/guc.c:12278 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "პარამეტრის ჩართვა მაშინ, როცა \"log_statement_stats\" ჩართულია, შეუძლებელია." + +#: utils/misc/guc.c:12290 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "" + +#: utils/misc/guc.c:12520 +#, 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:12533 +#, 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:12547 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "ამ პლატფორმაზე huge_page_size 0 უნდა იყოს." + +#: utils/misc/guc.c:12559 +#, c-format +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "ამ პლატფორმაზე huge_page_size 0 უნდა იყოს." + +#: utils/misc/guc.c:12671 +#, c-format +msgid "invalid character" +msgstr "არასწორი სიმბოლო" + +#: utils/misc/guc.c:12731 +#, c-format +msgid "recovery_target_timeline is not a valid number." +msgstr "recovery_target_timeline სწორი რიცხვი არაა." + +#: utils/misc/guc.c:12771 +#, c-format +msgid "multiple recovery targets specified" +msgstr "მითითებულია აღდგენის მრავალი სამიზნე" + +#: utils/misc/guc.c:12772 +#, 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:12780 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "დაშვებულია მხოლოდ ერთი მნიშვნელობა: \"immediate\"." + +#: utils/misc/help_config.c:130 +#, c-format +msgid "internal error: unrecognized run-time parameter type\n" +msgstr "შიდა შეცდომა: გაშვების დროს გამოყენებული ტიპი უცნობია\n" + +#: 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" +msgstr "გამოთვლილი CRC საკონტროლო ჯამი ფაილში დამახსოვრებულ მნიშვნელობას არ ემთხვევა" + +#: utils/misc/pg_rusage.c:64 +#, c-format +msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" +msgstr "CPU: მომხმარებელი: %d.%02d წმ, სისტემა: %d.%02d წმ, გავიდა: %d.%02d წმ" + +#: utils/misc/rls.c:127 +#, c-format +msgid "query would be affected by row-level security policy for table \"%s\"" +msgstr "" + +#: utils/misc/rls.c:129 +#, c-format +msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." +msgstr "" + +#: utils/misc/timeout.c:524 +#, c-format +msgid "cannot add more timeout reasons" +msgstr "კავშირის დროის გასვლის მეტი მიზეზის დამატება შეუძლებელია" + +#: utils/misc/tzparser.c:60 +#, c-format +msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:72 +#, c-format +msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:111 +#, c-format +msgid "missing time zone abbreviation in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:120 +#, c-format +msgid "missing time zone offset in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:132 +#, c-format +msgid "invalid number for time zone offset in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:168 +#, c-format +msgid "invalid syntax in time zone file \"%s\", line %d" +msgstr "დროის სარტყელის ფაილის (\"%s\") არასწორი სინტაქსი ხაზზე %d" + +#: utils/misc/tzparser.c:236 +#, c-format +msgid "time zone abbreviation \"%s\" is multiply defined" +msgstr "დროის სარტყელის აბრევიატურა ერთზე მეტჯერაა აღწერილი: %s" + +#: utils/misc/tzparser.c:238 +#, c-format +msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." +msgstr "" + +#: utils/misc/tzparser.c:300 +#, c-format +msgid "invalid time zone file name \"%s\"" +msgstr "დროის სარტყელის ფაილის არასწორი ფაილი\"%s\"" + +#: utils/misc/tzparser.c:313 +#, c-format +msgid "time zone file recursion limit exceeded in file \"%s\"" +msgstr "დროის სარტყლის ფაილის რეკურსიის ლიმიტი გადაცილებულია ფაილში \"%s\"" + +#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#, c-format +msgid "could not read time zone file \"%s\": %m" +msgstr "დროის სარტყელის ფაილის წაკითხვის შეცდომა \"%s\": %m" + +#: utils/misc/tzparser.c:376 +#, c-format +msgid "line is too long in time zone file \"%s\", line %d" +msgstr "დროის სარტყელის ფაილის (\"%s\") ძალიან გრძელი ხაზი (\"%d\")" + +#: utils/misc/tzparser.c:400 +#, c-format +msgid "@INCLUDE without file name in time zone file \"%s\", line %d" +msgstr "" + +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 +#, c-format +msgid "Failed while creating memory context \"%s\"." +msgstr "შეცდომა მეხსიერების კონტექსტის შექმნისას \"%s\"." + +#: utils/mmgr/dsa.c:520 utils/mmgr/dsa.c:1334 +#, c-format +msgid "could not attach to dynamic shared area" +msgstr "დინამიური გაზიარებული მეხსიერების მიმაგრების შეცდომა" + +#: 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:188 +#, c-format +msgid "cursor \"%s\" already exists" +msgstr "კურსორი \"%s\" უკვე არსებობს" + +#: utils/mmgr/portalmem.c:192 +#, c-format +msgid "closing existing cursor \"%s\"" +msgstr "არსებული კურსორის დახურვა \"%s\"" + +#: utils/mmgr/portalmem.c:402 +#, c-format +msgid "portal \"%s\" cannot be run" +msgstr "პორტალის \"%s\" გაშვება შეუძლებელია" + +#: utils/mmgr/portalmem.c:480 +#, c-format +msgid "cannot drop pinned portal \"%s\"" +msgstr "მიჭიკარტებული პორტალის წაშლა შეუძლებელია:\"%s\"" + +#: utils/mmgr/portalmem.c:488 +#, c-format +msgid "cannot drop active portal \"%s\"" +msgstr "აქტიური პორტალის წაშლა სეუძლებელია: %s" + +#: utils/mmgr/portalmem.c:739 +#, c-format +msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" +msgstr "" + +#: 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:266 utils/sort/logtape.c:289 +#, c-format +msgid "could not seek to block %ld of temporary file" +msgstr "დროებითი ფაილის %ld-ე ბაიტზე გადახვევა შეუძლებელია" + +#: utils/sort/logtape.c:295 +#, c-format +msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" +msgstr "" + +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 utils/sort/sharedtuplestore.c:498 +#, c-format +msgid "could not read from shared tuplestore temporary file" +msgstr "" + +#: utils/sort/sharedtuplestore.c:487 +#, c-format +msgid "unexpected chunk in shared tuplestore temporary file" +msgstr "" + +#: utils/sort/sharedtuplestore.c:572 +#, c-format +msgid "could not seek to block %u in shared tuplestore temporary file" +msgstr "" + +#: utils/sort/sharedtuplestore.c:579 +#, c-format +msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" +msgstr "" + +#: utils/sort/tuplesort.c:3322 +#, c-format +msgid "cannot have more than %d runs for an external sort" +msgstr "" + +#: utils/sort/tuplesort.c:4425 +#, c-format +msgid "could not create unique index \"%s\"" +msgstr "უნიკალური ინდექსის შექმნა შეუძლებელია: \"%s\"" + +#: utils/sort/tuplesort.c:4427 +#, c-format +msgid "Key %s is duplicated." +msgstr "გასაღები %s დუბლირებულია." + +#: utils/sort/tuplesort.c:4428 +#, c-format +msgid "Duplicate keys exist." +msgstr "არსებობს დუბლიკატი გასაღებები." + +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 utils/sort/tuplestore.c:1330 +#, c-format +msgid "could not seek in tuplestore temporary file" +msgstr "კორტეჟების საცავი დროებითი ფაილის გადახვევა შეუძლებელია" + +#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 utils/sort/tuplestore.c:1548 +#, c-format +msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" +msgstr "" + +#: utils/time/snapmgr.c:570 +#, c-format +msgid "The source transaction is not running anymore." +msgstr "საწყისი ტრანზაქცია გაშვებული აღარაა." + +#: utils/time/snapmgr.c:1164 +#, c-format +msgid "cannot export a snapshot from a subtransaction" +msgstr "ქვეტრანზაქციიდან სწრაფი ასლის გამოტანა შეუძლებელია" + +#: 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:1420 +#, c-format +msgid "SET TRANSACTION SNAPSHOT must be called before any query" +msgstr "SET TRANSACTION SNAPSHOT ყველა მოთხოვნაზე ადრე უნდა გამოიძახოთ" + +#: utils/time/snapmgr.c:1429 +#, c-format +msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" +msgstr "" + +#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 +#, c-format +msgid "invalid snapshot identifier: \"%s\"" +msgstr "სწრაფი ასლის არასწორი იდენტიფიკატორი: \"%s\"" + +#: 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:1543 +#, c-format +msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" +msgstr "" + +#: utils/time/snapmgr.c:1558 +#, c-format +msgid "cannot import a snapshot from a different database" +msgstr "სხვა ბაზიდან სწრაფი ასლის შემოტანა შეუძლებელია" + +#~ msgid "Enables reordering of GROUP BY keys." +#~ msgstr "გასაღების (GROUP BY) გადალაგების ჩართვა." + +#, c-format +#~ msgid "JSON_TABLE column names must be distinct from one another" +#~ msgstr "JSON_TABLE-ის სვეტის სახელები ერთმანეთისგან უნდა განსხვავდებოდნენ" + +#, c-format +#~ msgid "SQL/JSON item cannot be cast to target type" +#~ msgstr "SQL/JSON ჩანაწერი მითითებულ ტიპში ვერ გადავა" + +#, c-format +#~ msgid "Triggers on partitioned tables cannot have transition tables." +#~ msgstr "დაყოფილ ცხრილებზე არსებულ ტრიგერებს გარდამავალი ცხრილები ვერ ექნებათ." + +#, c-format +#~ msgid "cannot move table \"%s\" to schema \"%s\"" +#~ msgstr "ცხრილის (%s) სქემაში (%s) გადატანა შეუძლებელია" + +#, c-format +#~ msgid "duplicate JSON key %s" +#~ msgstr "დუბლირებული JSON გასაღები %s" + +#, c-format +#~ msgid "duplicate JSON_TABLE column name: %s" +#~ msgstr "სვეტის (JSON_TABLE ) დუბლიკატი სახელი: %s" + +#, c-format +#~ msgid "int2vector has too many elements" +#~ msgstr "int2vector -ს მეტისმეტად ბევრი ელემენტი აქვს" + +#, c-format +#~ msgid "invalid JSON_TABLE expression" +#~ msgstr "\"JSON_TABLE\"-ის არასწორი გამოსახულება" + +#, c-format +#~ msgid "invalid JSON_TABLE plan" +#~ msgstr "\"JSON_TABLE\"-ის არასწორი გეგმა" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "მისამართზე %X/%X contrecord ალამი არ არსებობს" + +#, c-format +#~ msgid "no SQL/JSON item" +#~ msgstr "\"SQL/JSON\" ჩანაწერების გარეშე" + +#, c-format +#~ msgid "oidvector has too many elements" +#~ msgstr "oidvector-ს მეტისმეტად ბევრი ელემენტი აქვს" + +#, c-format +#~ msgid "only UTF8 JSON encoding is supported" +#~ msgstr "მხარდაჭერილია მხოლოდ UTF8 JSON კოდირება" + +#, c-format +#~ msgid "unknown compression option \"%s\"" +#~ msgstr "შეკუმშვის უცნობი პარამეტრი: \"%s\"" + +#, c-format +#~ msgid "unlinked permanent statistics file \"%s\"" +#~ msgstr "სტატისტიკის მუდმივი ფაილი მოხსნილია: %s" + +#, c-format +#~ msgid "unrecognized \"publish\" value: \"%s\"" +#~ msgstr "\"publish\"-ის უცნობი მნიშვნელობა: \"%s\"" + +#, c-format +#~ msgid "unsupported JSON encoding" +#~ msgstr "\"JSON\"-ის არასწორი კოდირება" diff --git a/third_party/spanner_pg/src/backend/po/ko.po b/third_party/spanner_pg/src/backend/po/ko.po index f330f3da..b458383d 100644 --- a/third_party/spanner_pg/src/backend/po/ko.po +++ b/third_party/spanner_pg/src/backend/po/ko.po @@ -3,10 +3,10 @@ # 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-10-05 20:39+0000\n" -"PO-Revision-Date: 2020-10-27 14:19+0900\n" +"POT-Creation-Date: 2023-04-12 00:40+0000\n" +"PO-Revision-Date: 2023-05-04 16:23+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,6 +15,49 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "이 서버는 %s 압축을 지원하지 않습니다." + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "압축 옵션 값이 와야할 자리에 빈 문자열이 있습니다." + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "알 수 없는 압축 옵션 \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "\"%s\" 압축 옵션은 해당 값을 지정해야 합니다" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "\"%s\" 압축 옵션의 값은 정수형으로 지정해야 합니다." + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "\"%s\" 압축 알고리즘은 압축 수준을 지정할 수 없습니다." + +#: ../common/compression.c:342 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"\"%s\" 압축 알고리즘의 압축 수준값은 %d부터 %d까지만 가능합니다. (기본값 %d)" + +#: ../common/compression.c:353 +#, 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 @@ -22,69 +65,66 @@ msgstr "" 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 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 +#: commands/copyfrom.c:1515 commands/extension.c:3383 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 +#: ../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:1197 +#: access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 +#: access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 +#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 +#: replication/logical/snapbuild.c:1927 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: 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: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 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 +#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:817 #, 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 +#: ../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:4738 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:5016 +#: replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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" @@ -99,132 +139,152 @@ msgstr "" "지 않으며\n" "현재 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/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: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: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:4209 +#: access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:538 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:8991 utils/misc/guc.c:9040 #, 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 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 +#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 +#: access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5630 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: 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: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/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:7973 +#: access/transam/xlog.c:8016 backup/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1760 replication/slot.c:1684 +#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:989 storage/smgr/md.c:1030 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 #, 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: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:587 lib/dshash.c:253 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:2591 postmaster/postmaster.c:4177 +#: postmaster/postmaster.c:5555 postmaster/postmaster.c:5926 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2281 storage/ipc/procarray.c:2288 +#: storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3424 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 +#: utils/misc/tzparser.c:476 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:238 +#, c-format +msgid "out of memory" +msgstr "메모리 부족" + +#: ../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 +msgid "destination buffer too small" +msgstr "대상 버퍼가 너무 작습니다." + +#: ../common/cryptohash_openssl.c:348 ../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\" 바이너리 파일을 읽을 수 없음" # translator: %s is IPv4, IPv6, or Unix -#: ../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: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 "\"%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:8319 backup/basebackup.c:1340 +#: 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: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: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:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, 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 +#: ../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" @@ -235,112 +295,115 @@ msgstr "메모리 부족\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null 포인터를 중복할 수 없음 (내부 오류)\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:1316 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 +#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:597 +#: replication/logical/snapbuild.c:1639 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 guc-file.l:1061 #, 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:749 +#: commands/tablespace.c:759 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 "\"%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 "\"%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:1779 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "잘못된 이스케이프 조합: \"\\%s\"" -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x 값의 문자는 이스케이프 처리를 해야함." -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "입력 자료의 끝을 기대했는데, \"%s\" 값이 더 있음." -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "\"]\" 가 필요한데 \"%s\"이(가) 있음" -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "\",\" 또는 \"]\"가 필요한데 \"%s\"이(가) 있음" -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "\":\"가 필요한데 \"%s\"이(가) 있음" -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "JSON 값을 기대했는데, \"%s\" 값임" -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "입력 문자열이 예상치 않게 끝났음." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "\"}\"가 필요한데 \"%s\"이(가) 있음" -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "\",\" 또는 \"}\"가 필요한데 \"%s\"이(가) 있음" -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "문자열 값을 기대했는데, \"%s\" 값임" -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "잘못된 토큰: \"%s\"" -#: ../common/jsonapi.c:1099 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 값은 text 형으로 변환할 수 없음." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." -msgstr "\"\\u\" 표기법은 뒤에 4개의 16진수가 와야합니다." +msgstr "\"\\u\" 표기법은 뒤에 4개의 16진수가 와야 합니다." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1132 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -348,32 +411,37 @@ msgstr "" "서버 인코딩이 UTF8이 아닌 경우 007F보다 큰 코드 지점 값에는 유니코드 이스케이" "프 값을 사용할 수 없음" -#: ../common/jsonapi.c:1106 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "유니코드 상위 surrogate(딸림 코드)는 상위 딸림 코드 뒤에 오면 안됨." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 jsonpath_scan.l:527 jsonpath_scan.l:537 +#: jsonpath_scan.l:579 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "유니코드 상위 surrogate(딸림 코드) 뒤에는 하위 딸림 코드가 있어야 함." -#: ../common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심각: " - -#: ../common/logging.c:243 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../common/logging.c:250 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "상세정보: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -389,7 +457,7 @@ msgstr "잘못된 포크 이름" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "유효한 포크 이름은 \"main\", \"fsm\" 및 \"vm\"입니다." -#: ../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" @@ -424,13 +492,12 @@ msgstr "\"%s\" 명령용 프로세스를 시작할 수 없음: 오류 코드 %lu msgid "could not re-execute with restricted token: error code %lu" msgstr "restricted 토큰으로 재실행할 수 없음: 오류 코드 %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:1171 -#: replication/basebackup.c:1347 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "파일 또는 디렉터리 \"%s\"의 상태를 확인할 수 없음: %m" @@ -440,11 +507,17 @@ msgstr "파일 또는 디렉터리 \"%s\"의 상태를 확인할 수 없음: %m" msgid "could not remove file or directory \"%s\": %m" msgstr "\"%s\" 디렉터리나 파일을 삭제할 수 없음: %m" -# # nonun 부분 begin -#: ../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 "저장 키를 인코드할 수 없음" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "서버 키를 인코드할 수 없음" #: ../common/stringinfo.c:306 #, c-format @@ -467,7 +540,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "%ld UID를 찾을 수 없음: %s" -#: ../common/username.c:45 libpq/auth.c:2027 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "사용자 없음" @@ -506,12 +579,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 "" @@ -537,25 +610,25 @@ 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 " @@ -564,7 +637,7 @@ msgstr "" "바이러스 백신 프로그램, 백업 또는 유사한 소프트웨어가 데이터베이스 시스템을 " "방해할 수 있습니다." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "현재 작업 디렉터리를 알 수 없음: %s\n" @@ -574,6 +647,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 "UID %d에 해당하는 로컬 사용자를 찾을 수 없음: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "%d OID에 해당하는 로컬 사용자가 없음" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -589,63 +672,89 @@ msgstr "PowerUsers 그룹의 SID를 가져올 수 없음: 오류 코드 %lu\n" 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 "\"%s\" 인덱스에서 BRIN 범위 요약 요청이 기록되지 못함, 해당 페이지: %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/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:1025 access/brin/brin.c:1126 access/gin/ginfast.c:1038 +#: 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:874 access/brin/brin.c:951 +#: access/brin/brin.c:1026 access/brin/brin.c:1127 #, 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:1031 access/brin/brin.c:1132 #, c-format -msgid "block number out of range: %s" -msgstr "블록 번호가 범위를 벗어남: %s" +msgid "block number out of range: %lld" +msgstr "블록 번호가 범위를 벗어남: %lld" -#: access/brin/brin.c:905 access/brin/brin.c:982 +#: access/brin/brin.c:1075 access/brin/brin.c:1158 #, 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:1091 access/brin/brin.c:1174 +#, 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:3012 access/brin/brin_minmax_multi.c:3155 +#: 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 "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:2171 access/brin/brin_minmax_multi.c:2178 +#: access/brin/brin_minmax_multi.c:2185 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 "간격이 범위를 벗어남" #: 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/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 +#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, 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 페이지 타입: \"%s\" BRIN 인덱스 %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 " @@ -655,8 +764,8 @@ msgstr "" "로 지정되었습니다." #: 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 " @@ -666,8 +775,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 " @@ -677,8 +786,8 @@ msgstr "" "못되었습니다." #: 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 " @@ -688,8 +797,8 @@ msgstr "" "합니다." #: 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 " @@ -697,8 +806,8 @@ msgid "" 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 " @@ -715,14 +824,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" @@ -764,97 +873,107 @@ msgstr "\"%s\" 속성(대상 자료형 %s)이 %s 자료형에는 없습니다." msgid "number of columns (%d) exceeds limit (%d)" msgstr "칼럼 개수(%d)가 최대값(%d)을 초과했습니다" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format 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:209 access/spgist/spgutils.c:958 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "인덱스 행(row)은 %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:1921 #, 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 "\"%s\" 매개 변수 네임스페이스를 인식할 수 없음" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12004 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12986 #, 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\" enum 옵션 값이 잘못됨: %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/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "\"%s\" 칼럼은 SETOF를 지정할 수 없습니다" @@ -869,22 +988,22 @@ msgstr "포스팅 목록이 너무 깁니다" msgid "Reduce maintenance_work_mem." msgstr "maintenance_work_mem 설정값을 줄이세요." -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1039 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "GIN 팬딩 목록은 복구 작업 중에는 정리될 수 없습니다." -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1046 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" 개체는 GIN 인덱스가 아닙니다" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1057 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "다른 세션의 임시 인덱스는 접근할 수 없음" -#: 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 "\"%s\" 인덱스에서 튜플 재검색 실패" @@ -901,15 +1020,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:2168 +#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6486 +#: 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 " @@ -926,12 +1045,18 @@ msgid "" 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:759 access/gist/gistvacuum.c:426 #, 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:761 access/gist/gistvacuum.c:428 #, c-format msgid "" "This is caused by an incomplete page split at crash recovery before " @@ -940,15 +1065,20 @@ 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:762 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 "REINDEX 명령으로 다시 인덱스를 만드세요" +#: access/gist/gist.c:1176 +#, 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" @@ -963,19 +1093,19 @@ msgstr "" "인덱스가 최적화되지 않았습니다. 최적화하려면 개발자에게 문의하거나, CREATE " "INDEX 명령에서 해당 칼럼을 두 번째 인덱스로 사용하십시오." -#: 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 "\"%s\" 인덱스의 %u번째 블럭에서 예상치 않은 zero page가 있습니다" -#: 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 "\"%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 " @@ -984,7 +1114,7 @@ msgstr "" "\"%s\" 연산자 패밀리(접근 방법: %s)에 %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 " @@ -993,41 +1123,40 @@ msgstr "" "\"%s\" 연산자 패밀리(접근 방법: %s)에 %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:335 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "문자열 해시 작업에 사용할 정렬규칙(collation)을 결정할 수 없음" -#: 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:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17495 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 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:764 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, 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\" 해시 인덱스에서 오버플로우 페이지 초과" @@ -1047,114 +1176,130 @@ 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)에 cross-type 연산자가 빠졌음" -#: access/heap/heapam.c:2024 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "병렬 작업자는 튜플을 추가 할 수 없음" -#: access/heap/heapam.c:2442 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "병렬 작업 중에는 튜플을 지울 수 없음" -#: access/heap/heapam.c:2488 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "볼 수 없는 튜플을 삭제 하려고 함" -#: access/heap/heapam.c:2914 access/heap/heapam.c:5703 +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "병렬 작업 중에 튜플 갱신은 할 수 없음" -#: access/heap/heapam.c:3047 +#: access/heap/heapam.c:3307 #, 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:4669 access/heap/heapam.c:4707 +#: access/heap/heapam.c:4972 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 " "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 "\"%s\" 파일 쓰기 실패, %d / %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:8653 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:517 +#: postmaster/postmaster.c:4604 postmaster/postmaster.c:5617 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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/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: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:3035 access/transam/xlog.c:3232 +#: access/transam/xlog.c:3976 commands/dbcommands.c:529 +#: postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 +#: replication/slot.c:1666 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:8721 +#: utils/misc/guc.c:8752 utils/misc/guc.c:10741 utils/misc/guc.c:10755 +#: 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: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:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 +#: replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 +#: replication/slot.c:1763 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:370 storage/smgr/md.c:429 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\" 청소 중" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "\"%s.%s.%s\" 청소 중" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "\"%s.%s.%s\" 테이블 청소 끝남: 인덱스 탐색: %d\n" + +#: access/heap/vacuumlazy.c:674 #, c-format msgid "" "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": " @@ -1163,234 +1308,227 @@ msgstr "" "트랙젝션 ID 겹침 방지를 위한 적극적인 \"%s.%s.%s\" 테이블 자동 청소: 인덱스 " "탐색: %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 "" -"트랙젝션 ID 겹침 방지를 위한 \"%s.%s.%s\" 테이블 자동 청소: 인덱스 " -"탐색: %d\n" +"트랙젝션 ID 겹침 방지를 위한 \"%s.%s.%s\" 테이블 자동 청소: 인덱스 탐색: %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\" 테이블 자동 청소: 인덱스 탐색: %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\" 테이블 자동 청소: 인덱스 탐색: %d\n" -#: access/heap/vacuumlazy.c:664 +#: access/heap/vacuumlazy.c:690 #, c-format -msgid "" -"pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "페이지: %u 삭제됨, %u 남음, %u 핀닝으로 건너뜀, %u 동결되어 건너뜀\n" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "페이지: %u 삭제됨, %u 남음, %u 검사됨 (전체의 %.2f%%)\n" -#: access/heap/vacuumlazy.c:670 +#: access/heap/vacuumlazy.c:697 #, c-format msgid "" -"tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, " -"oldest xmin: %u\n" +"tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "" -"튜플: %.0f 삭제됨, %.0f 남음, %.0f 삭제할 수 없는 죽은 튜플, 제일 늙은 xmin: " -"%u\n" +"튜플: %.lld 삭제됨, %lld 남음, 아직 %lld 개의 튜플을 지워야하지만 못지웠음\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:703 #, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "버퍼 사용량: %lld 조회, %lld 놓침, %lld 변경됨\n" +msgid "" +"tuples missed: %lld dead from %u pages not removed due to cleanup lock " +"contention\n" +msgstr "" +"놓친 튜플: %lld 개의 죽은 튜플이 %u 개의 페이지 안에 있음: cleanup 잠금 " +"연결 때문\n" -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "평균 읽기 속도: %.3f MB/s, 평균 쓰기 속도: %.3f MB/s\n" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "삭제 가능한 컷오프: %u, which was %d XIDs old when operation ended\n" -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:714 #, c-format -msgid "system usage: %s\n" -msgstr "시스템 사용량: %s\n" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "새 relfrozenxid: %u, which is %d XIDs ahead of previous value\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:721 #, c-format -msgid "WAL usage: %ld records, %ld full page images, %llu bytes" -msgstr "WAL 사용량: %ld 레코드, %ld 페이지 전체 이미지, %llu 바이트" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "새 relminmxid: %u, which is %d MXIDs ahead of previous value\n" -#: access/heap/vacuumlazy.c:795 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "적극적으로 \"%s.%s\" 청소 중" +#: access/heap/vacuumlazy.c:727 +msgid "index scan not needed: " +msgstr "인덱스 검사 필요 없음: " -#: access/heap/vacuumlazy.c:800 commands/cluster.c:874 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "\"%s.%s\" 청소 중" +#: access/heap/vacuumlazy.c:729 +msgid "index scan needed: " +msgstr "인덱스 검사 필요함: " -#: access/heap/vacuumlazy.c:837 +#: access/heap/vacuumlazy.c:731 #, c-format msgid "" -"disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " -"tables in parallel" +"%u pages from table (%.2f%% of total) had %lld dead item identifiers " +"removed\n" msgstr "" -"\"%s\" 청소 작업에서의 병렬 옵션은 무시함 --- 임시 테이블은 병렬 처리로 " -"청소 할 수 없음" +"테이블의 %u개 페이지(전체의 %.2f%%)에서 %lld 개의 죽은 항목 식별자를 " +"지웠음\n" -#: access/heap/vacuumlazy.c:1725 -#, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": %.0f개의 행 버전을 %u개 페이지에서 삭제했습니다." - -#: access/heap/vacuumlazy.c:1735 -#, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0f개의 죽은 로우 버전을 아직 지울 수 없습니다, 제일 늙은 xmin: %u\n" +#: access/heap/vacuumlazy.c:736 +msgid "index scan bypassed: " +msgstr "인덱스 검사 통과됨: " -#: access/heap/vacuumlazy.c:1737 -#, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "%.0f개의 사용되지 않은 아이템 식별자들이 있습니다.\n" +#: access/heap/vacuumlazy.c:738 +msgid "index scan bypassed by failsafe: " +msgstr "failsafe의 의해 인덱스 검사 통과됨: " -#: access/heap/vacuumlazy.c:1739 +#: access/heap/vacuumlazy.c:740 #, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "%u 페이지를 버퍼 핀닝으로 건너 뛰었습니다, " +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "" +"테이블의 %u 개 페이지(전체의 %.2f%%)에서 %lld 개의 죽은 항목 식별자가 있음\n" -#: access/heap/vacuumlazy.c:1743 +#: access/heap/vacuumlazy.c:755 #, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "" +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:1747 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O 속도: 읽기: %.3f ms, 쓰기: %.3f ms\n" -#: access/heap/vacuumlazy.c:1751 commands/indexcmds.c:3487 -#: commands/indexcmds.c:3505 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format -msgid "%s." -msgstr "%s." +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:1754 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format -msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u " -"pages" -msgstr "" -"\"%s\": 지울 수 있는 자료 %.0f개, 지울 수 없는 자료 %.0f개를 %u/%u개 페이지에" -"서 찾았음" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "버퍼 사용량: %lld 조회, %lld 놓침, %lld 변경됨\n" -#: access/heap/vacuumlazy.c:1888 +#: access/heap/vacuumlazy.c:785 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": %d 개 자료를 %d 페이지에서 삭제했음" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL 사용량: %lld 레코드, %lld full page 이미지, %llu 바이트\n" -#: access/heap/vacuumlazy.c:2143 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, 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] "" +msgid "system usage: %s" +msgstr "시스템 사용량: %s" -#: access/heap/vacuumlazy.c:2149 +#: access/heap/vacuumlazy.c:2463 #, 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] "" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "\"%s\" 테이블: %lld 개의 죽은 항목 실별자를 %u 개의 페이지에서 " +"삭제했음" -#: access/heap/vacuumlazy.c:2441 +#: access/heap/vacuumlazy.c:2629 #, c-format msgid "" -"scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -msgstr "" -"\"%s\" 인덱스를 스캔해서 %d개의 행 버전들을 병렬 vacuum 작업자가 지웠습니다" +"bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " +"%d index scans" +msgstr "\"%s.%s.%s\" 테이블의 불필요한 관리 작업은 통과했음, %d 번의 인덱스 검사로 " +"굳이 필요 없음" -#: access/heap/vacuumlazy.c:2443 +#: access/heap/vacuumlazy.c:2634 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "\"%s\" 인덱스를 스캔해서 %d개의 행 버전들을 지웠습니다" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "해당 테이블의 relfrozenxid 나 relminmxid 값이 너무 오래 된 것입니다." -#: access/heap/vacuumlazy.c:2501 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" -"index \"%s\" now contains %.0f row versions in %u pages as reported by " -"parallel vacuum worker" +"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 "" -"\"%s\" 인덱스는 %.0f 행 버전을 %u 페이지에서 포함있음을 " -"병렬 vacuum 작업자가 보고함" +"\"maintenance_work_mem\" 또는 \"autovacuum_work_mem\" 환경 설정 매개 변수값 " +"늘리는 것을 고려해 보세요.\n" +"VACUUM 작업이 트랜잭션 ID가 증가하는 것을 따라 잡을 있는 다른 방법도 " +"해 봐야 할 것 같습니다." -#: access/heap/vacuumlazy.c:2503 +#: access/heap/vacuumlazy.c:2878 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "\"%s\" 인덱스는 %.0f 행 버전을 %u 페이지에서 포함하고 있습니다." +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "\"%s\": 잠금 요청 충돌로 자료 비우기 작업을 중지합니다" -#: access/heap/vacuumlazy.c:2510 +#: access/heap/vacuumlazy.c:2948 #, c-format -msgid "" -"%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." -msgstr "" -"%.0f개의 인덱스 행 버전을 삭제했습니다.\n" -"%u개 인덱스 페이지를 삭제해서, %u개 페이지를 다시 사용합니다.\n" -"%s." +msgid "table \"%s\": truncated %u to %u pages" +msgstr "\"%s\" 테이블: %u 에서 %u 페이지로 정리했음" -#: access/heap/vacuumlazy.c:2613 +#: access/heap/vacuumlazy.c:3010 #, c-format -msgid "\"%s\": stopping truncate due to conflicting lock request" -msgstr "\"%s\": 잠금 요청 충돌로 자료 비우기 작업을 중지합니다" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "\"%s\" 테이블: 잠금 요청 충돌로 자료 비우기 작업이 지연되고 있음" -#: access/heap/vacuumlazy.c:2679 +#: access/heap/vacuumlazy.c:3170 #, 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:2744 +#: access/heap/vacuumlazy.c:3383 #, 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:3583 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "%u 블록(해당 릴레이션: \"%s.%s\")을 탐색 중" -#: access/heap/vacuumlazy.c:3586 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "\"%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 "%u 블록 %u 오프셋 청소 중 (해당 릴레이션: \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "%u 블록(해당 릴레이션: \"%s.%s\")을 청소 중" -#: access/heap/vacuumlazy.c:3595 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "\"%s.%s\" 릴레이션 청소 중" -#: access/heap/vacuumlazy.c:3600 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "\"%s\" 인덱스(해당 릴레이션 \"%s.%s\") 청소 중" -#: access/heap/vacuumlazy.c:3605 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "\"%s\" 인덱스 (해당 릴레이션 \"%s.%s\")을 정돈(clean up) 중" -#: access/heap/vacuumlazy.c:3611 +#: access/heap/vacuumlazy.c:3421 #, 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 자료형에는 쓸 수 없음" @@ -1400,40 +1538,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: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 "시스템 카탈로그 탐색 중 트랜잭션 중지됨" + +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17183 commands/tablecmds.c:18962 #, 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: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:747 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "이 문제는 non-immutable 인덱스 표현식 때문인듯 합니다." -#: 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:2335 #, c-format msgid "index \"%s\" is not a btree" msgstr "\"%s\" 인덱스는 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, " @@ -1442,12 +1585,12 @@ msgstr "" "\"%s\" 인덱스의 버전이 틀립니다: 파일 버전 %d, 현재 버전 %d, 최소 지원 버전 " "%d" -#: access/nbtree/nbtpage.c:1501 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "\"%s\" 인덱스에 반쯤 죽은(half-dead) 내부 페이지가 있음" -#: 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 " @@ -1456,7 +1599,7 @@ msgstr "" "이 문제는 9.3 버전 이하 환경에서 VACUUM 작업이 중지되고, 그 상태로 업그레이드" "되었을 가능성이 큽니다. 해당 인덱스를 다시 만드십시오." -#: 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\"" @@ -1464,12 +1607,12 @@ msgstr "" "인덱스 행 크기(%zu)가 btree(%u 버전)의 최대값(%zu)을 초과함 (해당 인덱스: " "\"%s\")" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:2675 #, 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:2679 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1479,7 +1622,7 @@ 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 " @@ -1488,18 +1631,23 @@ 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" msgstr "입력 자료형에서 리프 유형이 다를 때 압축 방법은 반드시 정의해야 함" -#: access/spgist/spgutils.c:761 +#: access/spgist/spgutils.c:1016 #, 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 "%s 형이 SP-GiST 리프 자료형인데, 선언은 %s 형으로 했음" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "" "operator family \"%s\" of access method %s is missing support function %d " @@ -1508,19 +1656,20 @@ 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: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: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:13880 +#: commands/tablecmds.c:17192 #, 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\"" @@ -1530,7 +1679,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:12910 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s 설정값이 너무 깁니다 (최대 %d 문자)" @@ -1550,28 +1699,28 @@ 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 master server." -msgstr "운영 서버에서 \"%s\" 환경 설정 매개 변수값을 지정 하세요." +"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:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "\"%s\" 환경 설정 매개 변수를 지정하세요." -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1022 #, c-format msgid "" "database is not accepting commands that generate new MultiXactIds to avoid " @@ -1580,8 +1729,8 @@ msgstr "" "\"%s\" 데이터베이스 자료 손실을 막기 위해 새로운 MultiXactId 만드는 작업을 " "더 이상 할 수 없습니다." -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 -#: access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 +#: access/transam/multixact.c:1055 access/transam/multixact.c:1064 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1592,7 +1741,7 @@ msgstr "" "또한 오래된 트랜잭션을 커밋또는 롤백하거나 잠긴 복제 슬롯을 지울 필요가 있습" "니다." -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1029 #, c-format msgid "" "database is not accepting commands that generate new MultiXactIds to avoid " @@ -1601,7 +1750,7 @@ msgstr "" "%u OID 데이터베이스 자료 손실을 막기 위해 새로운 MultiXactId 만드는 작업을 " "더 이상 할 수 없습니다." -#: access/transam/multixact.c:1030 access/transam/multixact.c:2320 +#: access/transam/multixact.c:1050 access/transam/multixact.c:2334 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "" @@ -1610,7 +1759,7 @@ msgstr[0] "" "\"%s\" 데이터베이스는 %u번의 트랜잭션이 발생되기 전에 VACUUM 작업을 해야 합니" "다." -#: access/transam/multixact.c:1039 access/transam/multixact.c:2329 +#: access/transam/multixact.c:1059 access/transam/multixact.c:2343 #, c-format msgid "" "database with OID %u must be vacuumed before %u more MultiXactId is used" @@ -1620,12 +1769,12 @@ msgstr[0] "" "%u OID 데이터베이스는 %u번의 트랜잭션이 발생되기 전에 VACUUM 작업을 해야 합니" "다." -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1120 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "multixact \"회수\" 초과" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1121 #, c-format msgid "" "This command would create a multixact with %u members, but the remaining " @@ -1636,7 +1785,7 @@ msgid_plural "" msgstr[0] "" "이 명령은 %u 개의 multixact를 써야하는데, 쓸 수 있는 공간은 %u 개 뿐입니다." -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1126 #, c-format msgid "" "Execute a database-wide VACUUM in database with OID %u with reduced " @@ -1646,7 +1795,7 @@ msgstr "" "vacuum_multixact_freeze_min_age, vacuum_multixact_freeze_table_age 값을 조정" "하고, %u OID 데이터베이스 대상으로 VACUUM 작업을 하십시오." -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1157 #, c-format msgid "" "database with OID %u must be vacuumed before %d more multixact member is used" @@ -1657,7 +1806,7 @@ msgstr[0] "" "%u OID 데이터베이스는 %d 개의 멀티트랜잭션을 사용하기 전에 vacuum 작업을 해" "야 합니다." -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1162 #, c-format msgid "" "Execute a database-wide VACUUM in that database with reduced " @@ -1667,24 +1816,19 @@ msgstr "" "vacuum_multixact_freeze_min_age 설정값과 vacuum_multixact_freeze_table_age 값" "을 줄여서 데이터베이스 단위로 VACUUM 작업을 진행하세요." -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1301 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "%u번 MultiXactId 더이상 없음 -- 번호 겹침 현상 발생" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1307 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "%u번 MultiXactId를 만들 수 없음 -- 번호 겹침 현상 발생" -#: access/transam/multixact.c:2270 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "MultiXactId 겹침 한계는 %u 입니다. %u OID 데이터베이스에서 제한됨" - -#: 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:2339 access/transam/multixact.c:2348 +#: 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 " @@ -1697,12 +1841,7 @@ msgstr "" "또한 오래된 트랜잭션을 커밋또는 롤백 하거나, 잠긴 복제 슬롯을 지울 필요가 있" "습니다." -#: 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:2622 #, c-format msgid "" "MultiXact member wraparound protections are disabled because oldest " @@ -1711,24 +1850,19 @@ msgstr "" "가장 오래된 체크포인트 작업이 완료된 %u 멀티 트랜잭션 번호가 디스크에 없기 때" "문에, 멀티 트랜잭션 번호 겹침 방지 기능이 비활성화 되어 있습니다." -#: access/transam/multixact.c:2630 +#: access/transam/multixact.c:2644 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "멀티 트랜잭션 번호 겹침 방지 기능이 활성화 되었음" -#: access/transam/multixact.c:2633 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "멀티 트랜잭션 중지 제한 번호는 %u 입니다. (%u 멀티트랜잭션에 기초함)" - -#: access/transam/multixact.c:3013 +#: access/transam/multixact.c:3031 #, c-format msgid "" "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "" "가장 오래된 멀티 트랜잭션 번호는 %u, 가장 최신 것은 %u, truncate 작업 건너뜀" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3049 #, c-format msgid "" "cannot truncate up to MultiXact %u because it does not exist on disk, " @@ -1737,108 +1871,167 @@ msgstr "" "디스크에 해당 멀티 트랜잭션 번호가 없어, %u 멀티 트랜잭션 번호로 truncate 못" "함, truncate 작업 건너뜀" -#: access/transam/multixact.c:3345 +#: access/transam/multixact.c:3363 #, 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 "%d ID의 자원 관리자가 등록되어 있지 않음" + +#: 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 "사용자 정의 자원 관리자 %d ID 번호의 범위가 벗어남" + +#: 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\" 사용자 정의 자원 관리자를 %d ID로 등록할 수 없음" + +#: 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 "%d ID 자원 관리자가 같은 이름입니다." + +#: access/transam/rmgr.c:135 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "\"%s\" 사용자 정의 자원 관리자가 %d ID로 등록됨" + +#: access/transam/slru.c:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "\"%s\" 파일 없음, 0으로 읽음" -#: 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:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "%u 트랜잭션의 상태를 액세스할 수 없음" -#: access/transam/slru.c:938 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "\"%s\" 파일을 열 수 없음: %m." -#: access/transam/slru.c:944 +#: access/transam/slru.c:953 #, 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:952 +#: access/transam/slru.c:961 #, 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:957 +#: access/transam/slru.c:966 #, 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:964 +#: access/transam/slru.c:973 #, 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:969 +#: access/transam/slru.c:978 #, 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:976 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "\"%s\" 파일 fsync 실패: %m." -#: access/transam/slru.c:983 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "\"%s\" 파일을 닫을 수 없음: %m." -#: access/transam/slru.c:1258 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "\"%s\" 디렉터리를 비울 수 없음: 랩어라운드 발생" -#: access/transam/slru.c:1313 access/transam/slru.c:1369 -#, 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" @@ -1862,7 +2055,7 @@ msgstr "작업내역 파일에 잘못된 자료가 있음: %s" #: access/transam/timeline.c:174 #, c-format msgid "Timeline IDs must be in increasing sequence." -msgstr "타임라인 ID 값은 그 값이 증가하는 순번값이어야합니다." +msgstr "타임라인 ID 값은 그 값이 증가하는 순번값이어야 합니다." #: access/transam/timeline.c:194 #, c-format @@ -1879,119 +2072,130 @@ 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 설정값을 0이 아닌 값으로 설정하십시오." -#: 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:2368 +#: 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:2369 +#: 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:586 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "\"%s\" 이름의 준비된 트랜잭션 식별자가 여러 곳에서 쓰이고 있습니다" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:604 #, c-format msgid "permission denied to finish prepared transaction" msgstr "준비된 트랜잭션 끝내기 작업 권한 없음" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:605 #, c-format msgid "Must be superuser or the user that prepared the transaction." -msgstr "해당 준비된 트랜잭션의 소유주이거나 superuser여야합니다" +msgstr "해당 준비된 트랜잭션의 소유주이거나 superuser여야 합니다" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:616 #, c-format msgid "prepared transaction belongs to another database" msgstr "준비된 트랜잭션이 다른 데이터베이스에 속해 있음" -#: 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 "작업을 마치려면 그 준비된 트랜잭션이 있는 데이터베이스에 연결하십시오." -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:632 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "\"%s\" 이름의 준비된 트랜잭션이 없습니다" -#: access/transam/twophase.c:1098 +#: access/transam/twophase.c:1169 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2단계 상태 파일 최대 길이를 초과함" -#: 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] "\"%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:1261 +#: access/transam/twophase.c:1333 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "\"%s\" 파일의 CRC 값 맞춤 실패" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1351 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "\"%s\" 파일을 읽을 수 없음: %d 읽음, 전체 %lld" + +#: access/transam/twophase.c:1366 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "\"%s\" 파일에 잘못된 매직 번호가 저장되어 있음" -#: access/transam/twophase.c:1300 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "\"%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 "계산된 CRC 체크섬 값이 파일에 \"%s\" 파일에 저장된 값과 다름" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6494 +#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WAL 읽기 프로세서를 할당하는 중에 오류 발생" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1424 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "two-phase 상태정보을 읽을 수 없음 WAL 위치: %X/%X, %s" + +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "two-phase 상태정보을 읽을 수 없음 WAL 위치: %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 "WAL %X/%X 위치에 2단계 커밋 상태 자료가 없습니다" -#: access/transam/twophase.c:1637 +#: access/transam/twophase.c:1733 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "\"%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" @@ -2000,43 +2204,43 @@ msgid_plural "" msgstr[0] "" "긴 실행 미리 준비된 트랜잭션 용 %u 개의 2단계 상태 파일이 저장되었음" -#: access/transam/twophase.c:1998 +#: access/transam/twophase.c:2094 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "공유 메모리에서 %u 준비된 트랜잭션을 복구함" -#: access/transam/twophase.c:2089 +#: access/transam/twophase.c:2187 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "%u 트랜잭션에서 사용하는 오래된 two-phase 상태정보 파일을 삭제함" -#: access/transam/twophase.c:2096 +#: access/transam/twophase.c:2194 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "" "%u 트랜잭션에서 사용하는 오래된 two-phase 상태정보를 공유 메모리에서 삭제함" -#: access/transam/twophase.c:2109 +#: access/transam/twophase.c:2207 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "%u 트랜잭션에서 사용하는 future two-phase 상태정보 파일을 삭제함" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2214 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "%u 트랜잭션에서 사용하는 future two-phase 상태정보를 메모리에서 삭제함" -#: access/transam/twophase.c:2141 +#: access/transam/twophase.c:2239 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "%u 트랜잭션에서 사용하는 two-phase 상태정보 파일이 손상되었음" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2244 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "%u 트랜잭션에서 사용하는 메모리에 있는 two-phase 상태정보가 손상되었음" -#: 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 " @@ -2045,7 +2249,7 @@ msgstr "" "\"%s\" 데이터베이스 트랜잭션 ID 겹침에 의한 자료 손실을 방지하기 위해 더 이" "상 자료 조작 작업을 허용하지 않습니다" -#: 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" @@ -2057,7 +2261,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 " @@ -2066,222 +2270,189 @@ msgstr "" "%u OID 데이터베이스에서 자료 겹침으로 발생할 수 있는 자료 손실을 방지하기 위" "해 명령을 수락하지 않음" -#: 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 "%u OID 데이터베이스는 %u번의 트랜잭션이 발생되기 전에 청소해야 합니다" -#: access/transam/varsup.c:409 -#, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "트랜잭션 ID 겹침 제한은 %u번 입니다., %u OID 데이터베이스에서 제한됨" - -#: 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 "하나의 트랜잭션 안에서는 2^32-2 개의 명령을 초과할 수 없음" -#: access/transam/xact.c:1555 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "커밋된 하위 트랜잭션 수(%d)가 최대치를 초과함" -#: access/transam/xact.c:2395 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "임시 개체 대해 실행된 트랜잭션을 PREPARE할 수 없음" -#: access/transam/xact.c:2405 +#: access/transam/xact.c:2511 #, 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:3478 #, 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:3488 #, 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:3498 +#, c-format +msgid "%s cannot be executed within a pipeline" +msgstr "%s 절은 파이프라인에서 실행될 수 없음" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3508 #, 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:3579 access/transam/xact.c:3894 +#: access/transam/xact.c:3973 access/transam/xact.c:4096 +#: access/transam/xact.c:4247 access/transam/xact.c:4316 +#: access/transam/xact.c:4427 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s 명령은 트랜잭션 블럭에서만 사용될 수 있음" -#: access/transam/xact.c:3640 +#: access/transam/xact.c:3780 #, 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:3899 access/transam/xact.c:3978 +#: access/transam/xact.c:4101 #, c-format msgid "there is no transaction in progress" msgstr "현재 트랜잭션 작업을 하지 않고 있습니다" -#: access/transam/xact.c:3849 +#: access/transam/xact.c:3989 #, c-format msgid "cannot commit during a parallel operation" msgstr "데이터베이스 트랜잭션을 commit 할 수 없음" -#: access/transam/xact.c:3972 +#: access/transam/xact.c:4112 #, c-format msgid "cannot abort during a parallel operation" msgstr "병렬 작업 중에는 중지 할 수 없음" -#: access/transam/xact.c:4071 +#: access/transam/xact.c:4211 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "병렬 작업 중에는 savepoint 지정을 할 수 없음" -#: access/transam/xact.c:4158 +#: access/transam/xact.c:4298 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "병렬 작업 중에는 savepoint를 지울 수 없음" -#: access/transam/xact.c:4168 access/transam/xact.c:4219 -#: access/transam/xact.c:4279 access/transam/xact.c:4328 +#: access/transam/xact.c:4308 access/transam/xact.c:4359 +#: access/transam/xact.c:4419 access/transam/xact.c:4468 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "\"%s\" 이름의 저장위치가 없음" -#: access/transam/xact.c:4225 access/transam/xact.c:4334 +#: access/transam/xact.c:4365 access/transam/xact.c:4474 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "현재 저장위치 수준에서 \"%s\" 이름의 저장위치가 없음" -#: access/transam/xact.c:4267 +#: access/transam/xact.c:4407 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "병렬 작업 중에는 savepoint 지정 취소 작업을 할 수 없음" -#: access/transam/xact.c:4395 +#: access/transam/xact.c:4535 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "병렬 처리 중에는 하위트랜잭션을 시작할 수 없음" -#: access/transam/xact.c:4463 +#: access/transam/xact.c:4603 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "병렬 처리 중에는 하위트랜잭션을 커밋할 수 없음" -#: access/transam/xact.c:5103 +#: access/transam/xact.c:5250 #, 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: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의 끝을 지난 flush 요청, 요청위치: %X/%X, 현재위치: " +"%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 "최소 복구 지점: %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:3471 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "요청한 %s WAL 조각 파일은 이미 지워졌음" -#: 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:3756 #, 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:3798 access/transam/xlog.c:3808 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "필요한 WAL 디렉터리 \"%s\"이(가) 없음" -#: access/transam/xlog.c:4277 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "누락된 WAL 디렉터리 \"%s\"을(를) 만드는 중" -#: access/transam/xlog.c:4280 +#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "누락된 \"%s\" 디렉터리를 만들 수 없음: %m" -#: access/transam/xlog.c:4383 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "예상치 못한 타임라인 ID %u, 로그 조각: %s, 위치: %u" - -#: access/transam/xlog.c:4521 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "요청한 %u 타임라인은 %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 "" - -#: access/transam/xlog.c:4554 -#, c-format -msgid "new target timeline is %u" -msgstr "새 대상 타임라인: %u" - -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:3884 #, 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: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:4750 +#: access/transam/xlog.c:4044 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2290,7 +2461,7 @@ msgstr "" "데이터베이스 클러스터는 PG_CONTROL_VERSION %d (0x%08x)(으)로 초기화되었지만 " "서버는 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 " @@ -2298,7 +2469,7 @@ msgid "" msgstr "" "이것은 바이트 순서 불일치 문제일 수 있습니다. 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 " @@ -2307,18 +2478,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: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:4773 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "컨트롤 파일에 잘못된 체크섬 값이 있습니다" -#: 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 " @@ -2327,7 +2498,7 @@ msgstr "" "이 데이터베이스 클러스터는 CATALOG_VERSION_NO %d 버전으로 초기화 되었지만, 서" "버는 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 " @@ -2336,7 +2507,7 @@ msgstr "" "이 데이터베이스 클러스터는 MAXALIGN %d (으)로 초기화 되었지만, 서버는 " "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 " @@ -2345,7 +2516,7 @@ msgstr "" "데이터베이스 클러스터와 서버 실행 파일이 서로 다른 부동 소수점 숫자 형식을 사" "용하고 있습니다." -#: 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 " @@ -2354,18 +2525,18 @@ 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: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:4809 +#: access/transam/xlog.c:4103 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2374,7 +2545,7 @@ msgstr "" "이 데이터베이스 클러스터는 RELSEG_SIZE %d (으)로 초기화 되었지만, 서버는 " "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 " @@ -2383,7 +2554,7 @@ msgstr "" "이 데이터베이스 클러스터는 XLOG_BLCKSZ %d (으)로 초기화 되었지만, 서버는 " "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 " @@ -2392,7 +2563,7 @@ msgstr "" "이 데이터베이스 클러스터는 NAMEDATALEN %d (으)로 초기화 되었지만, 서버는 " "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 " @@ -2401,7 +2572,7 @@ msgstr "" "이 데이터베이스 클러스터는 INDEX_MAX_KEYS %d (으)로 초기화 되었지만, 서버는 " "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 " @@ -2410,7 +2581,7 @@ msgstr "" "데이터베이스 클러스터는 TOAST_MAX_CHUNK_SIZE %d(으)로 초기화되었지만 서버는 " "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 " @@ -2419,7 +2590,7 @@ msgstr "" "이 데이터베이스 클러스터는 LOBLKSIZE %d(으)로 초기화 되었지만, 서버는 " "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 " @@ -2428,7 +2599,7 @@ msgstr "" "데이터베이스 클러스터는 USE_FLOAT8_BYVAL 없이 초기화되었지만, 서버는 " "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 " @@ -2437,7 +2608,7 @@ msgstr "" "데이터베이스 클러스터는 USE_FLOAT8_BYVAL을 사용하여 초기화되었지만, 서버는 " "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 " @@ -2449,281 +2620,715 @@ msgstr[0] "" "WAL 조각 파일은 1MB부터 1GB 사이 2^n 크기여야 하지만, 컨트롤 파일에는 %d 바이" "트로 지정되었음" -#: 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\" 값은 \"wal_segment_size\" 값의 최소 2배 이상이어야 함" -#: 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\" 값은 \"wal_segment_size\" 값의 최소 2배 이상이어야 함" -#: access/transam/xlog.c:5318 +#: access/transam/xlog.c:4620 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파일을 쓸 수 없음: %m" -#: access/transam/xlog.c:5326 +#: access/transam/xlog.c:4628 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파일을 fsync할 수 없음: %m" -#: access/transam/xlog.c:5332 +#: access/transam/xlog.c:4634 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파일을 닫을 수 없음: %m" -#: access/transam/xlog.c:5393 +#: access/transam/xlog.c:4852 #, 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 내용이 wal_level=minimal 설정으로 만들여졌습니다. 복원 작업을 계속 할 " +"수 없음" -#: access/transam/xlog.c:5458 +#: access/transam/xlog.c:4853 #, 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:5475 +#: access/transam/xlog.c:4854 #, 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:5476 +#: access/transam/xlog.c:4918 #, 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:5484 +#: access/transam/xlog.c:4929 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "" -"대기 모드를 활성화 하지 않았다면(standby_mode = off), restore_command 설정은 " -"반드시 있어야 함" +msgid "database system was shut down at %s" +msgstr "데이터베이스 시스템 마지막 가동 중지 시각: %s" -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:4935 #, 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:5644 +#: access/transam/xlog.c:4941 #, c-format -msgid "archive recovery complete" -msgstr "아카이브 복구 완료" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "" +"데이터베이스 시스템 셧다운 작업이 비정상적으로 종료되었음; 마지막 운영시간: " +"%s" -#: access/transam/xlog.c:5710 access/transam/xlog.c:5983 +#: access/transam/xlog.c:4947 #, 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:5731 +#: access/transam/xlog.c:4949 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "복구 중지 위치(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:5817 +#: access/transam/xlog.c:4955 #, 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:5824 +#: access/transam/xlog.c:4957 #, 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 "" +"이 사태로 몇몇 자료가 손상되었을 수도 있는데, 이런 경우라면,확인해 보고, 필요" +"하다면, 마지막 백업 자료로 복구해서 사용하세요." -#: access/transam/xlog.c:5877 +#: access/transam/xlog.c:4963 #, 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:5895 +#: access/transam/xlog.c:4969 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "복구 중지 위치(LSN): \"%X/%X\" 이후" +msgid "control file contains invalid database cluster state" +msgstr "컨트롤 파일에 잘못된 데이터베이스 클러스터 상태값이 있습니다" -#: access/transam/xlog.c:5963 +#: access/transam/xlog.c:5353 #, 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:5971 +#: access/transam/xlog.c:5354 #, 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:6020 +#: access/transam/xlog.c:5357 #, c-format -msgid "pausing at the end of recovery" -msgstr "복구 끝에 기다리는 중" +msgid "WAL ends before consistent recovery point" +msgstr "WAL이 일치하는 복구 지점 앞에서 종료됨" -#: access/transam/xlog.c:6021 +#: access/transam/xlog.c:5405 #, 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:6024 +#: access/transam/xlog.c:5438 #, c-format -msgid "recovery has paused" -msgstr "복구 작업이 일시 중지 됨" +msgid "archive recovery complete" +msgstr "아카이브 복구 완료" -#: access/transam/xlog.c:6025 +#: access/transam/xlog.c:6040 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "계속 진행하려면, pg_wal_replay_resume() 함수를 호출하세요." +msgid "shutting down" +msgstr "서비스를 멈추고 있습니다" -#: access/transam/xlog.c:6242 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6079 +#, c-format +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "restartpoint 시작:%s%s%s%s%s%s%s%s" + +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6091 +#, c-format +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "체크포인트 시작:%s%s%s%s%s%s%s%s" + +#: access/transam/xlog.c:6151 #, c-format msgid "" -"hot standby is not possible because %s = %d is a lower setting than on the " -"master server (its value was %d)" +"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 "" -"읽기 전용 대기 서버로 운영이 불가능합니다. 현재 %s = %d 설정은 주 서버의 설정" -"값(%d)보다 낮게 설정 되어 있기 때문입니다." +"restartpoint 작업완료: %d개(%.1f%%) 버퍼 씀; %d개 WAL 파일 추가됨, %d개 " +"지웠음, %d개 재활용; 쓰기시간: %ld.%03d s, 동기화시간: %ld.%03d s, 전체시간: %ld.%03d s; " +"동기화 파일 개수: %d, 최장시간: %ld.%03d s, 평균시간: %ld.%03d s; 실제작업량: %d kB, " +"예상한작업량: %d kB" + +#: access/transam/xlog.c:6171 +#, 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 "" +"채크포인트 작업완료: %d개(%.1f%%) 버퍼 씀; %d개 WAL 파일 추가됨, %d개 " +"지웠음, %d개 재활용; 쓰기시간: %ld.%03d s, 동기화시간: %ld.%03d s, 전체시간: %ld.%03d s; " +"동기화 파일 개수: %d, 최장시간: %ld.%03d s, 평균시간: %ld.%03d s; 실제작업량: %d kB, " +"예상한작업량: %d kB" + +#: access/transam/xlog.c:6606 +#, c-format +msgid "" +"concurrent write-ahead log activity while database system is shutting down" +msgstr "데이터베이스 시스템이 중지되는 동안 동시 트랜잭션 로그가 활성화 되었음" + +#: access/transam/xlog.c:7163 +#, c-format +msgid "recovery restart point at %X/%X" +msgstr "%X/%X에서 복구 작업 시작함" + +#: access/transam/xlog.c:7165 +#, c-format +msgid "Last completed transaction was at log time %s." +msgstr "마지막 완료된 트랜잭션 기록 시간은 %s 입니다." + +#: access/transam/xlog.c:7412 +#, c-format +msgid "restore point \"%s\" created at %X/%X" +msgstr "\"%s\" 이름의 복구 위치는 %X/%X에 만들었음" + +#: access/transam/xlog.c:7619 +#, c-format +msgid "online backup was canceled, recovery cannot continue" +msgstr "온라인 백어이 취소되었음, 복구를 계속 할 수 없음" + +#: access/transam/xlog.c:7676 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "셧다운 체크포인트 레코드에 잘못된 타임라인 ID 값: %u (기대값: %u)" + +#: access/transam/xlog.c:7734 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "온라인 체크포인트 레코드에 잘못된 타임라인 ID 값: %u (기대값: %u)" + +#: access/transam/xlog.c:7763 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "복원끝 레코드에 잘못된 타임라인 ID 값: %u (기대값: %u)" + +#: access/transam/xlog.c:8021 +#, c-format +msgid "could not fsync write-through file \"%s\": %m" +msgstr "\"%s\" write-through 파일을 fsync할 수 없음: %m" + +#: access/transam/xlog.c:8027 +#, c-format +msgid "could not fdatasync file \"%s\": %m" +msgstr "\"%s\" 파일 fdatasync 실패: %m" + +#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 +#, c-format +msgid "WAL level not sufficient for making an online backup" +msgstr "온라인 백업 작업을 하기 위한 WAL 수준이 충분치 않습니다." + +#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 +#: access/transam/xlogfuncs.c:199 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "" +"wal_level 값을 \"replica\" 또는 \"logical\"로 지정하고 서버를 실행하십시오." + +#: access/transam/xlog.c:8128 +#, c-format +msgid "backup label too long (max %d bytes)" +msgstr "백업 라벨 이름이 너무 긺(최대 %d 바이트)" + +#: access/transam/xlog.c:8244 +#, 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:8246 access/transam/xlog.c:8602 +#, 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 명령을 " +"실행하고, 온라인 백업을 다시 해서 사용하세요." + +#: access/transam/xlog.c:8326 backup/basebackup.c:1345 utils/adt/misc.c:347 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "\"%s\" 심볼릭 링크의 대상이 너무 긺" + +#: access/transam/xlog.c:8376 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#, c-format +msgid "tablespaces are not supported on this platform" +msgstr "테이블스페이스 기능은 이 플랫폼에서는 지원하지 않습니다." + +#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 +#: access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 +#: access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 +#: access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "\"%s\" 파일에 유효하지 않은 자료가 있습니다" -#: access/transam/xlog.c:6266 +#: access/transam/xlog.c:8552 backup/basebackup.c:1200 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" +msgid "the standby was promoted during online backup" +msgstr "대기 서버가 온라인 백업 중 주 서버로 전환되었습니다" + +#: access/transam/xlog.c:8553 backup/basebackup.c:1201 +#, c-format +msgid "" +"This means that the backup being taken is corrupt and should not be used. " +"Try taking another online backup." msgstr "" -"WAL 내용이 wal_level=minimal 설정으로 만들여졌습니다. 자료가 손실 될 수 있습" +"이런 경우, 해당 백업 자료가 손상되었을 가능성이 있습니다. 다른 백업본을 이용" +"하세요." + +#: access/transam/xlog.c:8600 +#, c-format +msgid "" +"WAL generated with full_page_writes=off was replayed during online backup" +msgstr "" +"온라인 백업 도중 full_page_writes=off 설정으로 만들어진 WAL 내용이 재반영되었" +"습니다." + +#: access/transam/xlog.c:8725 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "" +"베이스 백업이 끝났습니다. 필요한 WAL 조각 파일이 아카이브 되길 기다리고 있습" "니다." -#: access/transam/xlog.c:6267 +#: access/transam/xlog.c:8739 #, c-format msgid "" -"This happens if you temporarily set wal_level=minimal without taking a new " -"base backup." +"still waiting for all required WAL segments to be archived (%d seconds " +"elapsed)" msgstr "" -"이 문제는 새 베이스 백업을 받지 않은 상태에서 서버가 일시적으로 " -"wal_level=minimal 설정으로 운영된 적이 있다면 발생합니다." +"필요한 WAL 조각 파일 아카이빙이 완료되기를 계속 기다리고 있음 (%d초 경과)" -#: access/transam/xlog.c:6278 +#: access/transam/xlog.c:8741 #, c-format msgid "" -"hot standby is not possible because wal_level was not set to \"replica\" or " -"higher on the master server" +"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 "" -"주 서버 wal_level 설정이 \"replica\" 또는 그 이상 수준으로 설정되지 않아, 읽" -"기 전용 보조 서버로 운영될 수 없음" +"archive_command 설정을 살펴보세요. 이 백업 작업은 안전하게 취소 할 수 있지" +"만, 데이터베이스 백업은 모든 WAL 조각 없이는 사용될 수 없습니다." + +#: access/transam/xlog.c:8748 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "모든 필요한 WAL 조각들이 아카이브 되었습니다." -#: access/transam/xlog.c:6279 +#: access/transam/xlog.c:8752 #, c-format msgid "" -"Either set wal_level to \"replica\" on the master, or turn off hot_standby " -"here." +"WAL archiving is not enabled; you must ensure that all required WAL segments " +"are copied through other means to complete the backup" msgstr "" -"운영 서버의 환경 설정에서 wal_leve = \"replica\" 형태로 지정하든가 " -"hot_standby = off 형태로 지정하십시오." +"WAL 아카이브 기능이 비활성화 되어 있습니다; 이 경우는 백업 뒤 복구에 필요한 " +"모든 WAL 조각 파일들을 직접 찾아서 따로 보관해 두어야 바르게 복구 할 수 있습" +"니다." -#: access/transam/xlog.c:6341 +#: access/transam/xlog.c:8801 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "컨트롤 파일에 잘못된 체크포인트 위치가 있습니다" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "" +"pg_backup_stop 작업이 호출되기 전에 백엔드가 종료되어 백업을 중지합니다." -#: access/transam/xlog.c:6352 +#: access/transam/xlogarchive.c:208 #, c-format -msgid "database system was shut down at %s" -msgstr "데이터베이스 시스템 마지막 가동 중지 시각: %s" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "\"%s\" 아카이브 파일의 크기가 이상합니다: 현재값 %lld, 기대값 %lld" -#: access/transam/xlog.c:6358 +#: access/transam/xlogarchive.c:217 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "복구 중 데이터베이스 시스템 마지막 가동 중지 시각: %s" +msgid "restored log file \"%s\" from archive" +msgstr "아카이브에서 \"%s\" 로그파일을 복구했음" -#: access/transam/xlog.c:6364 +#: access/transam/xlogarchive.c:231 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command 작업이 0을 반환했지만, stat() 작업 실패." + +#: access/transam/xlogarchive.c:263 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "아카이브에서 \"%s\" 파일 복원 실패: %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:376 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "\"%s\" archive status 파일을 만들 수 없습니다: %m" + +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "\"%s\" archive status 파일에 쓸 수 없습니다: %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "이미 이 세션에서 백업 작업이 진행 중입니다" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "현재 백업 작업을 하지 않고 있습니다" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "pg_backup_start() 함수를 호출했나요?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "WAL 제어 함수는 복구 작업 중에는 실행 될 수 없음" + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL 수준이 복원 위치를 만들 수 없는 수준입니다" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "복원 위치 이름이 너무 깁니다. (최대값, %d 글자)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "복구 작업 중에는 %s 명령을 실행할 수 없습니다." + +#: 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 "recovery is not in progress" +msgstr "현재 복구 작업 상태가 아닙니다" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "복구 제어 함수는 복구 작업일 때만 실행할 수 있습니다." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "대기 서버가 운영 서버로 전환 중입니다." + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s 함수는 운영 전환 중에는 실행될 수 없음." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" 값은 음수나 0을 사용할 수 없음" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "postmaster로 시그널 보내기 실패: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "%d 초 이내에 운영 전환을 하지 못했습니다." + +#: access/transam/xlogprefetcher.c:1090 +#, c-format +msgid "" +"recovery_prefetch is not supported on platforms that lack posix_fadvise()." msgstr "" -"데이터베이스 시스템 셧다운 작업이 비정상적으로 종료되었음; 마지막 운영시간: " -"%s" +"이 OS는 posix_fadvise() 함수를 지원하지 않아, recovery_prefetch " +"설정을 지원하지 않습니다." -#: access/transam/xlog.c:6370 +#: access/transam/xlogreader.c:625 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "데이터베이스 시스템 복구하는 도중 비정상적으로 가동 중지된 시각: %s" +msgid "invalid record offset at %X/%X" +msgstr "잘못된 레코드 위치: %X/%X" + +#: access/transam/xlogreader.c:633 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%X에서 contrecord를 필요로 함" + +#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 +#, c-format +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "잘못된 레코드 길이: %X/%X, 기대값 %u, 실재값 %u" + +#: access/transam/xlogreader.c:703 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "%u 길이의 레코드를 디코딩하는 중 메모리 부족" + +#: access/transam/xlogreader.c:725 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "너무 긴 길이(%u)의 레코드가 %X/%X에 있음" + +#: access/transam/xlogreader.c:774 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "%X/%X 위치에 contrecord 플래그가 없음" + +#: access/transam/xlogreader.c:787 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "잘못된 contrecord 길이 %u (기대값: %lld), 위치 %X/%X" + +#: access/transam/xlogreader.c:922 +#, c-format +msgid "missing contrecord at %X/%X" +msgstr "%X/%X 위치에 contrecord 없음" + +#: access/transam/xlogreader.c:1129 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "잘못된 자원 관리 ID %u, 위치: %X/%X" -#: access/transam/xlog.c:6372 +#: access/transam/xlogreader.c:1142 access/transam/xlogreader.c:1158 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "레코드의 잘못된 프리링크 %X/%X, 해당 레코드 %X/%X" + +#: access/transam/xlogreader.c:1194 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "잘못된 자원관리자 데이터 체크섬, 위치: %X/%X 레코드" + +#: access/transam/xlogreader.c:1231 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "%04X 매직 번호가 잘못됨, 로그 파일 %s, 위치 %u" + +#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1286 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "잘못된 정보 비트 %04X, 로그 파일 %s, 위치 %u" + +#: access/transam/xlogreader.c:1260 #, c-format msgid "" -"This probably means that some data is corrupted and you will have to use the " -"last backup for recovery." +"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:6378 +#: access/transam/xlogreader.c:1268 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "데이터베이스 시스템이 로그 시간 %s에 복구 도중 중지 되었음" +msgid "" +"WAL file is from different database system: incorrect segment size in page " +"header" +msgstr "" +"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더에 지정된 값이 잘" +"못된 조각 크기임" -#: access/transam/xlog.c:6380 +#: access/transam/xlogreader.c:1274 #, 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." +"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " +"header" msgstr "" -"이 사태로 몇몇 자료가 손상되었을 수도 있는데, 이런 경우라면,확인해 보고, 필요" -"하다면, 마지막 백업 자료로 복구해서 사용하세요." +"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더의 XLOG_BLCKSZ 값" +"이 바르지 않음" -#: access/transam/xlog.c:6386 +#: access/transam/xlogreader.c:1305 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "데이터베이스 시스템이 비정상적으로 종료되었음; 마지막 운영시간: %s" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "잘못된 페이지 주소 %X/%X, 로그 파일 %s, 위치 %u" -#: access/transam/xlog.c:6392 +#: access/transam/xlogreader.c:1330 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "컨트롤 파일에 잘못된 데이터베이스 클러스터 상태값이 있습니다" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "타임라인 범위 벗어남 %u (이전 번호 %u), 로그 파일 %s, 위치 %u" + +#: access/transam/xlogreader.c:1735 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" + +#: access/transam/xlogreader.c:1759 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X 에 자료가 없음" + +#: access/transam/xlogreader.c:1766 +#, 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/xlog.c:6449 +#: access/transam/xlogreader.c:1802 +#, 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:1818 +#, 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:1832 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "" +"BKPIMAGE_COMPRESSED 설정이 되어 있지만, 블록 이미지 길이: %u, 대상: %X/%X" + +#: access/transam/xlogreader.c:1847 +#, c-format +msgid "" +"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " +"length is %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안되어 있으나, 블록 이미지 길" +"이는 %u, 대상: %X/%X" + +#: access/transam/xlogreader.c:1863 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL 설정이 되어 있지만, %X/%X 에 이전 릴레이션 없음" + +#: access/transam/xlogreader.c:1875 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "잘못된 block_id %u, 위치 %X/%X" + +#: access/transam/xlogreader.c:1942 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "잘못된 레코드 길이, 위치 %X/%X" + +#: access/transam/xlogreader.c:1967 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "WAL 레코드에서 %d ID의 백업 블록을 찾을 수 없음" + +#: access/transam/xlogreader.c:2051 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "%X/%X 위치에 이미지를 복원할 수 없음 %d 블록이 잘못 지정됨" + +#: access/transam/xlogreader.c:2058 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "%X/%X 위치에 이미지를 복원할 수 없음, %d 블록의 상태가 이상함" + +#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with %s not supported by build, " +"block %d" +msgstr "%X/%X 위치에 압축된 이미지 복원 실패, %s 지원 하지 않음, 해당 블록: %d" + +#: access/transam/xlogreader.c:2111 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "알 수 없는 방법으로 이미지 압축 복원 실패: 위치 %X/%X, 블록 %d" + +#: access/transam/xlogreader.c:2119 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "이미지 압축 풀기 실패, 위치 %X/%X, 블록 %d" + +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "대기 모드로 전환합니다" -#: access/transam/xlog.c:6452 +#: access/transam/xlogrecovery.c:548 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "%u XID까지 시점 기반 복구 작업을 시작합니다" -#: access/transam/xlog.c:6456 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "%s 까지 시점 복구 작업을 시작합니다" -#: access/transam/xlog.c:6460 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "\"%s\" 복구 대상 이름까지 시점 복구 작업을 시작합니다" -#: access/transam/xlog.c:6464 +#: access/transam/xlogrecovery.c:560 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "\"%X/%X\" 위치(LSN)까지 시점 복구 작업을 시작합니다" -#: access/transam/xlog.c:6469 +#: access/transam/xlogrecovery.c:564 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "동기화 할 수 있는 마지막 지점까지 시점 복구 작업을 시작합니다" -#: access/transam/xlog.c:6472 +#: access/transam/xlogrecovery.c:567 #, 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/xlogrecovery.c:651 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "체크포인트 기록으로 참조하는 재실행 위치를 찾을 수 없음" -#: access/transam/xlog.c:6547 access/transam/xlog.c:6557 +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add " @@ -2733,43 +3338,49 @@ msgid "" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if " "restoring from a backup." msgstr "" +"백업을 복원하려면, \"%s/recovery.signal\" 파일을 만들고, " +"복구 관련 옵션을 지정하세요.\n" +"백업 복원을 하는게 아니라면, \"%s/backup_label\" 파일을 " +"지우고 사용할 수 있습니다.\n" +"주의: 백업 복원 작업을 하는데, \"%s/backup_label\" 파일을 " +"지운다면, 클러스터가 손상 될 수 있습니다." -#: access/transam/xlog.c:6556 +#: access/transam/xlogrecovery.c:661 #, c-format msgid "could not locate required checkpoint record" msgstr "요청된 체크포인트 레코드의 위치를 바르게 잡을 수 없음" -#: access/transam/xlog.c:6585 commands/tablespace.c:654 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 #, 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/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 #, 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/xlogrecovery.c:724 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿨습니다." -#: access/transam/xlog.c:6625 +#: access/transam/xlogrecovery.c:730 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿀 수 없음: %m" -#: access/transam/xlog.c:6676 +#: access/transam/xlogrecovery.c:784 #, c-format msgid "could not locate a valid checkpoint record" msgstr "체크포인트 레코드의 위치를 바르게 잡을 수 없음" -#: access/transam/xlog.c:6714 +#: access/transam/xlogrecovery.c:808 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "요청한 %u 타임라인은 서버 타임라인의 하위가 아님" -#: access/transam/xlog.c:6716 +#: access/transam/xlogrecovery.c:810 #, c-format msgid "" "Latest checkpoint is at %X/%X on timeline %u, but in the history of the " @@ -2778,7 +3389,7 @@ msgstr "" "마지막 체크포인트 위치는 %X/%X (%u 타임라인)입니다. 하지만, 요청받은 타임라" "인 내역파일에는 그 타임라인 %X/%X 위치에서 분기되었습니다." -#: access/transam/xlog.c:6732 +#: access/transam/xlogrecovery.c:824 #, c-format msgid "" "requested timeline %u does not contain minimum recovery point %X/%X on " @@ -2786,22 +3397,22 @@ msgid "" msgstr "" "요청한 %u 타임라인은 %X/%X 최소 복구 위치가 없습니다, 기존 타임라인: %u" -#: access/transam/xlog.c:6763 +#: access/transam/xlogrecovery.c:852 #, c-format msgid "invalid next transaction ID" msgstr "잘못된 다음 트랜잭션 ID" -#: access/transam/xlog.c:6857 +#: access/transam/xlogrecovery.c:857 #, c-format msgid "invalid redo in checkpoint record" msgstr "체크포인트 레코드 안에 잘못된 redo 정보가 있음" -#: access/transam/xlog.c:6868 +#: access/transam/xlogrecovery.c:868 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "운영 중지 체크포인트에서 잘못된 재실행 정보 발견" -#: access/transam/xlog.c:6902 +#: access/transam/xlogrecovery.c:897 #, c-format msgid "" "database system was not properly shut down; automatic recovery in progress" @@ -2809,18 +3420,18 @@ msgstr "" "데이터베이스 시스템이 정상적으로 종료되지 못했습니다, 자동 복구 작업을 진행합" "니다" -#: access/transam/xlog.c:6906 +#: access/transam/xlogrecovery.c:901 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" "%u 타임라인으로 비정상 중지에 대한 복구작업을 시작함, 기존 타임라인: %u" -#: access/transam/xlog.c:6953 +#: access/transam/xlogrecovery.c:944 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label 파일 안에 컨트롤 파일과 일관성이 맞지 않는 자료가 있음" -#: access/transam/xlog.c:6954 +#: access/transam/xlogrecovery.c:945 #, c-format msgid "" "This means that the backup is corrupted and you will have to use another " @@ -2829,172 +3440,118 @@ msgstr "" "이 문제는 백업 자료 자체가 손상 되었음을 말합니다. 다른 백업본으로 복구 작업" "을 진행해야 합니다." -#: access/transam/xlog.c:7045 -#, c-format -msgid "initializing for hot standby" -msgstr "읽기 전용 보조 서버로 초기화 중입니다." - -#: access/transam/xlog.c:7178 +#: access/transam/xlogrecovery.c:999 #, c-format -msgid "redo starts at %X/%X" -msgstr "%X/%X에서 redo 작업 시작됨" - -#: access/transam/xlog.c:7402 -#, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "요청한 복구 중지 지점이 일치하는 복구 지점 앞에 있음" - -#: access/transam/xlog.c:7440 -#, c-format -msgid "redo done at %X/%X" -msgstr "%X/%X에서 redo 작업 완료" - -#: access/transam/xlog.c:7445 -#, c-format -msgid "last completed transaction was at log time %s" -msgstr "마지막 완료된 트랜잭션 기록 시간: %s" - -#: access/transam/xlog.c:7454 -#, c-format -msgid "redo is not required" -msgstr "재반영해야 할 트랜잭션이 없음" +msgid "using recovery command file \"%s\" is not supported" +msgstr "\"%s\" 복구 명령 파일을 사용하는 것을 지원하지 않습니다" -#: access/transam/xlog.c:7466 +#: access/transam/xlogrecovery.c:1064 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "" +msgid "standby mode is not supported by single-user servers" +msgstr "단일 사용자 서버를 대상으로 대기 모드를 사용할 수 없습니다." -#: access/transam/xlog.c:7545 access/transam/xlog.c:7549 +#: access/transam/xlogrecovery.c:1081 #, c-format -msgid "WAL ends before end of online backup" -msgstr "온라인 백업 작업 끝나기전에 WAL 작업 종료됨" +msgid "specified neither primary_conninfo nor restore_command" +msgstr "primary_conninfo 설정도, restore_command 설정도 없음" -#: access/transam/xlog.c:7546 +#: access/transam/xlogrecovery.c:1082 #, c-format msgid "" -"All WAL generated while online backup was taken must be available at " -"recovery." +"The database server will regularly poll the pg_wal subdirectory to check for " +"files placed there." msgstr "" -"온라인 백업 중 만들어진 WAL 조각 파일은 복구 작업에서 반드시 모두 있어야 합니" -"다." +"데이터베이스 서버는 일반적으로 주 서버에서 발생한 트랜잭션 로그를 반영하기 위" +"해 pg_wal 하위 디렉터리를 조사할 것입니다." -#: access/transam/xlog.c:7550 +#: access/transam/xlogrecovery.c:1090 #, 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." +msgid "must specify restore_command when standby mode is not enabled" msgstr "" -"pg_start_backup() 함수를 호출해서 시작한 온라인 백업은 pg_stop_backup() 함수" -"로 종료되어야 하며, 그 사이 만들어진 WAL 조각 파일은 복구 작업에서 모두 필요" -"합니다." - -#: access/transam/xlog.c:7553 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL이 일치하는 복구 지점 앞에서 종료됨" - -#: access/transam/xlog.c:7588 -#, c-format -msgid "selected new timeline ID: %u" -msgstr "지정한 새 타임라인 ID: %u" - -#: access/transam/xlog.c:8036 -#, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "%X/%X 위치에서 복구 일관성을 맞춤" - -#: access/transam/xlog.c:8246 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "컨트롤 파일에서 잘못된 primary checkpoint 링크 발견" - -#: access/transam/xlog.c:8250 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "백업 라벨 파일에서 잘못된 체크포인트 링크 발견" - -#: access/transam/xlog.c:8268 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "잘못된 primary checkpoint 레코드" +"대기 모드를 활성화 하지 않았다면(standby_mode = off), restore_command 설정은 " +"반드시 있어야 함" -#: access/transam/xlog.c:8272 +#: access/transam/xlogrecovery.c:1128 #, c-format -msgid "invalid checkpoint record" -msgstr "잘못된 checkpoint 레코드" +msgid "recovery target timeline %u does not exist" +msgstr "%u 복구 대상 타임라인이 없음" -#: access/transam/xlog.c:8283 +#: access/transam/xlogrecovery.c:1278 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "primary checkpoint 레코드에서 잘못된 자원 관리자 ID 발견" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "타임라인 ID가 %u 값으로 분석했지만, 기대값은 %u 임" -#: access/transam/xlog.c:8287 +#: access/transam/xlogrecovery.c:1660 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "checkpoint 레코드에서 잘못된 자원 관리자 ID 발견" +msgid "redo starts at %X/%X" +msgstr "%X/%X에서 redo 작업 시작됨" -#: access/transam/xlog.c:8300 +#: access/transam/xlogrecovery.c:1673 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "primary checkpoint 레코드에서 잘못된 xl_info 발견" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo 진행 중, 예상시간: %ld.%02d s, 현재 LSN: %X/%X" -#: access/transam/xlog.c:8304 +#: access/transam/xlogrecovery.c:1765 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "checkpoint 레코드에서 잘못된 xl_info 발견" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "요청한 복구 중지 지점이 일치하는 복구 지점 앞에 있음" -#: access/transam/xlog.c:8315 +#: access/transam/xlogrecovery.c:1797 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "primary checkpoint 레코드 길이가 잘못되었음" +msgid "redo done at %X/%X system usage: %s" +msgstr "%X/%X에서 redo 작업 완료, 시스템 사용량: %s" -#: access/transam/xlog.c:8319 +#: access/transam/xlogrecovery.c:1803 #, c-format -msgid "invalid length of checkpoint record" -msgstr "checkpoint 레코드 길이가 잘못되었음" +msgid "last completed transaction was at log time %s" +msgstr "마지막 완료된 트랜잭션 기록 시간: %s" -#: access/transam/xlog.c:8499 +#: access/transam/xlogrecovery.c:1812 #, c-format -msgid "shutting down" -msgstr "서비스를 멈추고 있습니다" +msgid "redo is not required" +msgstr "재반영해야 할 트랜잭션이 없음" -#: access/transam/xlog.c:8819 +#: access/transam/xlogrecovery.c:1823 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "시스템이 놀고 있어 체크포인트 작업 건너뜀" +msgid "recovery ended before configured recovery target was reached" +msgstr "지정한 recovery target 도달 전에 복원 끝남" -#: access/transam/xlog.c:9019 +#: access/transam/xlogrecovery.c:1998 #, c-format -msgid "" -"concurrent write-ahead log activity while database system is shutting down" -msgstr "데이터베이스 시스템이 중지되는 동안 동시 트랜잭션 로그가 활성화 되었음" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "%X/%X에 빠진 contrecord를 건너뜀, %s에 덮어씀" -#: access/transam/xlog.c:9276 +#: access/transam/xlogrecovery.c:2065 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "다시 시작 지점을 건너뜀, 복구가 이미 종료됨" +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "잘못된 디렉터리 엔트리 \"%s\", 위치: %s" -#: access/transam/xlog.c:9299 +#: access/transam/xlogrecovery.c:2067 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "다시 시작 지점을 건너뜀, %X/%X에서 이미 수행됨" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "pg_tblspc/ 안 모든 디렉터리 엔트리는 심볼릭 링크여야 함" -#: access/transam/xlog.c:9467 +#: access/transam/xlogrecovery.c:2068 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "%X/%X에서 복구 작업 시작함" +msgid "" +"Remove those directories, or set allow_in_place_tablespaces to ON " +"transiently to let recovery complete." +msgstr "" +"그 디렉터리를 지우든가, allow_in_place_tablespaces 설정을 ON으로 바꿔 " +"임시로 복원 작업을 완료하든가 하세요." -#: access/transam/xlog.c:9469 +#: access/transam/xlogrecovery.c:2142 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "마지막 완료된 트랜잭션 기록 시간은 %s 입니다." +msgid "consistent recovery state reached at %X/%X" +msgstr "%X/%X 위치에서 복구 일관성을 맞춤" -#: access/transam/xlog.c:9711 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "\"%s\" 이름의 복구 위치는 %X/%X에 만들었음" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL redo 위치: %X/%X, 대상: %s" -#: access/transam/xlog.c:9856 +#: access/transam/xlogrecovery.c:2276 #, c-format msgid "" "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " @@ -3002,12 +3559,12 @@ msgid "" msgstr "" "체크포인트 레코드에 예기치 않은 이전 타임라인ID %u(현재 타임라인ID: %u)" -#: access/transam/xlog.c:9865 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "체크포인트 레코드에 예기치 않은 타임라인 ID %u이(가) 있음(%u 뒤)" -#: access/transam/xlog.c:9881 +#: access/transam/xlogrecovery.c:2301 #, c-format msgid "" "unexpected timeline ID %u in checkpoint record, before reaching minimum " @@ -3016,839 +3573,707 @@ msgstr "" "체크포인트 내역 안에 %u 타임라인 ID가 기대한 것과 다릅니다. 발생 위치: %X/%X " "(타임라인: %u) 최소 복구 위치 이전" -#: access/transam/xlog.c:9957 -#, 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 -#, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "체크포인트 레코드에 예기치 않은 타임라인 ID %u이(가) 있음(%u이어야 함)" - -#: access/transam/xlog.c:10418 -#, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "\"%s\" write-through 파일을 fsync할 수 없음: %m" - -#: access/transam/xlog.c:10424 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "\"%s\" 파일 fdatasync 실패: %m" - -#: 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 -#, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "WAL 제어 함수는 복구 작업 중에는 실행 될 수 없음" - -#: access/transam/xlog.c:10532 access/transam/xlog.c:11070 -#, 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/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 -#, 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 -#, c-format -msgid "a backup is already in progress" -msgstr "이미 백업 작업이 진행 중입니다" - -#: access/transam/xlog.c:10576 +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "pg_stop_backup() 함수를 실행하고 나서 다시 시도하세요." - -#: access/transam/xlog.c:10672 -#, c-format -msgid "" -"WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "" -"마지막 재시작 위치부터 재반영된 WAL 내용이 full_page_writes=off 설정으로 만들" -"어진 내용입니다." +msgid "recovery stopping after reaching consistency" +msgstr "일관성을 다 맞추어 복구 작업을 중지합니다." -#: access/transam/xlog.c:10674 access/transam/xlog.c:11266 +#: access/transam/xlogrecovery.c:2506 #, 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 "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "복구 중지 위치(LSN): \"%X/%X\" 이전" -#: access/transam/xlog.c:10757 replication/basebackup.c:1423 -#: utils/adt/misc.c:342 +#: access/transam/xlogrecovery.c:2596 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "\"%s\" 심볼릭 링크의 대상이 너무 긺" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "%u 트랜잭션 커밋 전 복구 중지함, 시간 %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/xlogrecovery.c:2603 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "테이블스페이스 기능은 이 플랫폼에서는 지원하지 않습니다." +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "%u 트랜잭션 중단 전 복구 중지함, 시간 %s" -#: access/transam/xlog.c:10861 access/transam/xlog.c:10899 +#: access/transam/xlogrecovery.c:2656 #, c-format -msgid "" -"If you're sure there is no backup in progress, remove file \"%s\" and try " -"again." -msgstr "" -"실재로는 백업 작업을 안하고 있다고 확신한다면, \"%s\" 파일을 삭제하고 다시 시" -"도해 보십시오." +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "복구 중지함, 복구 위치 \"%s\", 시간 %s" -#: access/transam/xlog.c:11086 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "exclusive backup not in progress" -msgstr "exclusive 백업 작업을 하지 않고 있습니다" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "복구 중지 위치(LSN): \"%X/%X\" 이후" -#: access/transam/xlog.c:11113 +#: access/transam/xlogrecovery.c:2741 #, c-format -msgid "a backup is not in progress" -msgstr "현재 백업 작업을 하지 않고 있습니다" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "%u 트랜잭션 커밋 후 복구 중지함, 시간 %s" -#: 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:2749 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "\"%s\" 파일에 유효하지 않은 자료가 있습니다" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "%u 트랜잭션 중단 후 복구 중지함, 시간 %s" -#: access/transam/xlog.c:11216 replication/basebackup.c:1271 +#: access/transam/xlogrecovery.c:2830 #, c-format -msgid "the standby was promoted during online backup" -msgstr "대기 서버가 온라인 백업 중 주 서버로 전환되었습니다" +msgid "pausing at the end of recovery" +msgstr "복구 끝에 기다리는 중" -#: access/transam/xlog.c:11217 replication/basebackup.c:1272 +#: access/transam/xlogrecovery.c:2831 #, c-format -msgid "" -"This means that the backup being taken is corrupt and should not be used. " -"Try taking another online backup." -msgstr "" -"이런 경우, 해당 백업 자료가 손상되었을 가능성이 있습니다. 다른 백업본을 이용" -"하세요." +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "운영 서버로 바꾸려면, pg_wal_replay_resume() 함수를 호출하세요." -#: access/transam/xlog.c:11264 +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 #, c-format -msgid "" -"WAL generated with full_page_writes=off was replayed during online backup" -msgstr "" -"온라인 백업 도중 full_page_writes=off 설정으로 만들어진 WAL 내용이 재반영되었" -"습니다." +msgid "recovery has paused" +msgstr "복구 작업이 일시 중지 됨" -#: access/transam/xlog.c:11384 +#: access/transam/xlogrecovery.c:2835 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "" -"베이스 백업이 끝났습니다. 필요한 WAL 조각 파일이 아카이브 되길 기다리고 있습" -"니다." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "계속 진행하려면, pg_wal_replay_resume() 함수를 호출하세요." -#: access/transam/xlog.c:11396 +#: access/transam/xlogrecovery.c:3101 #, c-format -msgid "" -"still waiting for all required WAL segments to be archived (%d seconds " -"elapsed)" -msgstr "" -"필요한 WAL 조각 파일 아카이빙이 완료되기를 계속 기다리고 있음 (%d초 경과)" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "예상치 못한 타임라인 ID %u, 로그 조각: %s, 위치: %u" -#: access/transam/xlog.c:11398 +#: access/transam/xlogrecovery.c:3306 #, 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 read from log segment %s, offset %u: %m" +msgstr "%s 로그 조각에서 읽기 실패, 위치: %u: %m" -#: access/transam/xlog.c:11405 +#: access/transam/xlogrecovery.c:3312 #, c-format -msgid "all required WAL segments have been archived" -msgstr "모든 필요한 WAL 조각들이 아카이브 되었습니다." +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "%s 로그 조각에서 읽기 실패, 위치: %u, %d / %zu 읽음" -#: access/transam/xlog.c:11409 +#: access/transam/xlogrecovery.c:3961 #, 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 "invalid primary checkpoint link in control file" +msgstr "컨트롤 파일에서 잘못된 primary checkpoint 링크 발견" -#: access/transam/xlog.c:11462 +#: access/transam/xlogrecovery.c:3965 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "" -"pg_stop_backup 작업이 호출되기 전에 백엔드가 종료되어 백업을 중지합니다." +msgid "invalid checkpoint link in backup_label file" +msgstr "백업 라벨 파일에서 잘못된 체크포인트 링크 발견" -#: access/transam/xlog.c:11638 +#: access/transam/xlogrecovery.c:3983 #, c-format -msgid "backup time %s in file \"%s\"" -msgstr "백업 시간: %s, 저장된 파일: \"%s\"" +msgid "invalid primary checkpoint record" +msgstr "잘못된 primary checkpoint 레코드" -#: access/transam/xlog.c:11643 +#: access/transam/xlogrecovery.c:3987 #, c-format -msgid "backup label %s in file \"%s\"" -msgstr "백업 라벨: %s, 저장된 파일: \"%s\"" +msgid "invalid checkpoint record" +msgstr "잘못된 checkpoint 레코드" -#: access/transam/xlog.c:11656 +#: access/transam/xlogrecovery.c:3998 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "타임라인 ID가 %u 값으로 분석했지만, 기대값은 %u 임" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "primary checkpoint 레코드에서 잘못된 자원 관리자 ID 발견" -#: access/transam/xlog.c:11660 +#: access/transam/xlogrecovery.c:4002 #, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "백업 타임라인: %u, 저장된 파일: \"%s\"" +msgid "invalid resource manager ID in checkpoint record" +msgstr "checkpoint 레코드에서 잘못된 자원 관리자 ID 발견" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:11768 +#: access/transam/xlogrecovery.c:4015 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL redo 위치: %X/%X, 대상: %s" +msgid "invalid xl_info in primary checkpoint record" +msgstr "primary checkpoint 레코드에서 잘못된 xl_info 발견" -#: access/transam/xlog.c:11817 +#: access/transam/xlogrecovery.c:4019 #, c-format -msgid "online backup mode was not canceled" -msgstr "온라인 백업 모드가 취소되지 않았음" +msgid "invalid xl_info in checkpoint record" +msgstr "checkpoint 레코드에서 잘못된 xl_info 발견" -#: access/transam/xlog.c:11818 +#: access/transam/xlogrecovery.c:4030 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿀 수 없음: %m." +msgid "invalid length of primary checkpoint record" +msgstr "primary checkpoint 레코드 길이가 잘못되었음" -#: access/transam/xlog.c:11827 access/transam/xlog.c:11839 -#: access/transam/xlog.c:11849 +#: access/transam/xlogrecovery.c:4034 #, c-format -msgid "online backup mode canceled" -msgstr "온라인 백업 모드가 취소됨" +msgid "invalid length of checkpoint record" +msgstr "checkpoint 레코드 길이가 잘못되었음" -#: access/transam/xlog.c:11840 +#: access/transam/xlogrecovery.c:4090 #, c-format -msgid "" -"Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "" -"예상한 것처럼, \"%s\", \"%s\" 파일을 \"%s\", \"%s\" 이름으로 바꿨습니다." +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "요청한 %u 타임라인은 %u 데이터베이스 시스템 타임라인의 하위가 아님" -#: access/transam/xlog.c:11850 +#: access/transam/xlogrecovery.c:4104 #, c-format msgid "" -"File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to " -"\"%s\": %m." +"new timeline %u forked off current database system timeline %u before " +"current recovery point %X/%X" msgstr "" -"\"%s\" 파일은 \"%s\" 이름으로 바꿨지만, \"%s\" 파일은 \"%s\" 이름으로 바꾸지 " -"못했습니다: %m." - -#: access/transam/xlog.c:11983 access/transam/xlogutils.c:971 -#, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "%s 로그 조각에서 읽기 실패, 위치: %u: %m" +"복구 위치까지 복구하기 전에 새 타임라인 %u번으로 분기됨, 기존 " +"데이터베이스 타임라인: %u, 기대한 복구 위치 %X/%X" -#: access/transam/xlog.c:11989 access/transam/xlogutils.c:978 +#: access/transam/xlogrecovery.c:4123 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "%s 로그 조각에서 읽기 실패, 위치: %u, %d / %zu 읽음" +msgid "new target timeline is %u" +msgstr "새 대상 타임라인: %u" -#: access/transam/xlog.c:12518 +#: access/transam/xlogrecovery.c:4326 #, c-format msgid "WAL receiver process shutdown requested" msgstr "WAL receiver 프로세스가 중지 요청을 받았습니다." -#: access/transam/xlog.c:12624 +#: access/transam/xlogrecovery.c:4389 #, c-format msgid "received promote request" msgstr "운영 전환 신호를 받았습니다." -#: access/transam/xlog.c:12637 +#: access/transam/xlogrecovery.c:4402 #, c-format msgid "promote trigger file found: %s" msgstr "마스터 전환 트리거 파일이 있음: %s" -#: access/transam/xlog.c:12646 +#: access/transam/xlogrecovery.c:4410 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "\"%s\" 마스터 전환 트리거 파일의 상태값을 알 수 없음: %m" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4635 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "\"%s\" 기록 파일의 크기가 이상합니다: 현재값 %lu, 원래값 %lu" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "불충분한 서버 설정으로 hot standby 서버를 운영할 수 없음" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 +#: access/transam/xlogrecovery.c:4693 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "아카이브에서 \"%s\" 로그파일을 복구했음" +msgid "" +"%s = %d is a lower setting than on the primary server, where its value was " +"%d." +msgstr "" +"이 서버의 현재 %s = %d 설정은 주 서버의 설정" +"값(%d)보다 낮게 설정 되어 있기 때문입니다." -#: access/transam/xlogarchive.c:259 +#: access/transam/xlogrecovery.c:4645 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "아카이브에서 \"%s\" 파일 복원 실패: %s" +msgid "If recovery is unpaused, the server will shut down." +msgstr "복원 후 멈춰 있을 수 없으면 서버는 종료될 것입니다." -#. 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:4646 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "" +"You can then restart the server after making the necessary configuration " +"changes." +msgstr "" +"환경 설정을 바꾸어 서버를 다시 시작할 수 있습니다." -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#: access/transam/xlogrecovery.c:4657 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "\"%s\" archive status 파일을 만들 수 없습니다: %m" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "운영 서버로 전환할 수 없습니다. 설정이 불충분합니다." -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "\"%s\" archive status 파일에 쓸 수 없습니다: %m" +msgid "Restart the server after making the necessary configuration changes." +msgstr "필요한 설정을 바꾸어 서버를 다시 시작하세요." -#: access/transam/xlogfuncs.c:74 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "a backup is already in progress in this session" -msgstr "이미 이 세션에서 백업 작업이 진행 중입니다" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "복원 작업이 불충분한 설정으로 중지 되었습니다." -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogrecovery.c:4697 #, c-format -msgid "non-exclusive backup in progress" -msgstr "non-exclusive 백업 진행 중입니다" +msgid "" +"You can restart the server after making the necessary configuration changes." +msgstr "필요한 설정을 바꾸어 서버를 다시 시작할 수 있습니다." -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "pg_stop_backup('f') 형태로 함수를 호출했나요?" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "%s 로그 조각에서 읽기 실패, 위치: %d: %m" -#: 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/xlogutils.c:1060 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"set-values 함수(테이블 리턴 함수)가 set 정의 없이 사용되었습니다 (테이블과 해" -"당 열 alias 지정하세요)" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "%s 로그 조각에서 읽기 실패, 위치: %d, %d 읽음(전체: %d)" -#: 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 +#: backup/backup_manifest.c:253 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "materialize 모드가 필요합니다만, 이 구문에서는 허용되지 않습니다" +msgid "expected end timeline %u but found timeline %u" +msgstr "%u 타임라인이 끝이어야하는데, %u 타임라인임" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:277 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "non-exclusive 백업 상태가 아닙니다" +msgid "expected start timeline %u but found timeline %u" +msgstr "시작 타임라인이 %u 여야하는데, %u 타임라인임" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:304 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "pg_stop_backup('t') 형태로 함수를 호출했나요?" +msgid "start timeline %u not found in history of timeline %u" +msgstr "%u 시작 타임라인이 %u 타임라인 내역안에 없음" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:355 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "WAL 수준이 복원 위치를 만들 수 없는 수준입니다" +msgid "could not rewind temporary file" +msgstr "임시 파일을 되감을 수 없음" -#: access/transam/xlogfuncs.c:315 +#: backup/backup_manifest.c:374 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "복원 위치 이름이 너무 깁니다. (최대값, %d 글자)" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "임시 파일을 읽을 수 없음: %zu 바이트만 읽음 (전체: %zu)" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:454 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "복구 작업 중에는 %s 명령을 실행할 수 없습니다." +msgid "could not find any WAL files" +msgstr "어떤 WAL 파일도 찾을 수 없음" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 -#: access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "recovery is not in progress" -msgstr "현재 복구 작업 상태가 아닙니다" +msgid "could not find WAL file \"%s\"" +msgstr "\"%s\" WAL 파일 찾기 실패" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 -#: access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "복구 제어 함수는 복구 작업일 때만 실행할 수 있습니다." +msgid "unexpected WAL file size \"%s\"" +msgstr "\"%s\" WAL 파일의 크기가 알맞지 않음" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: backup/basebackup.c:630 #, c-format -msgid "standby promotion is ongoing" -msgstr "대기 서버가 운영 서버로 전환 중입니다." +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld 전체 체크섬 검사 실패" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: backup/basebackup.c:637 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s 함수는 운영 전환 중에는 실행될 수 없음." +msgid "checksum verification failure during base backup" +msgstr "베이스 백업 중 체크섬 검사 실패" -#: access/transam/xlogfuncs.c:728 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\" 값은 음수나 0을 사용할 수 없음" +msgid "duplicate option \"%s\"" +msgstr "\"%s\" 옵션을 두 번 지정했습니다" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: backup/basebackup.c:734 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "postmaster로 시그널 보내기 실패: %m" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "알 수 없는 체크포인트 종류: \"%s\"" -#: access/transam/xlogfuncs.c:784 +#: backup/basebackup.c:769 #, c-format -msgid "server did not promote within %d seconds" -msgstr "%d 초 이내에 운영 전환을 하지 못했습니다." +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "" +"%d 값은 \"%s\" 매개 변수의 값으로 타당한 범위(%d .. %d)를 벗어났습니다." -#: access/transam/xlogreader.c:349 +#: backup/basebackup.c:814 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "잘못된 레코드 위치: %X/%X" +msgid "unrecognized manifest option: \"%s\"" +msgstr "인식할 수 없는 메니페스트 옵션 \"%s\"" -#: access/transam/xlogreader.c:357 +#: backup/basebackup.c:830 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "%X/%X에서 contrecord를 필요로 함" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "알 수 없는 체크섬 알고리즘: \"%s\"" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: backup/basebackup.c:865 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "잘못된 레코드 길이: %X/%X, 기대값 %u, 실재값 %u" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "알 수 없는 압축 알고리즘: \"%s\"" -#: access/transam/xlogreader.c:422 +#: backup/basebackup.c:881 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "너무 긴 길이(%u)의 레코드가 %X/%X에 있음" +msgid "unrecognized base backup option: \"%s\"" +msgstr "인식할 수 없는 베이스 백업 옵션: \"%s\"" -#: access/transam/xlogreader.c:454 +#: backup/basebackup.c:892 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "%X/%X 위치에 contrecord 플래그가 없음" +msgid "manifest checksums require a backup manifest" +msgstr "매니페스트 체크섬은 하나의 백업 메니페스트를 필요로 함" -#: access/transam/xlogreader.c:467 +#: backup/basebackup.c:901 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "잘못된 contrecord 길이 %u, 위치 %X/%X" +msgid "target detail cannot be used without target" +msgstr "타켓 지정 없이 타켓 세부정보를 지정할 수 없음" -#: access/transam/xlogreader.c:703 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "잘못된 자원 관리 ID %u, 위치: %X/%X" +msgid "target \"%s\" does not accept a target detail" +msgstr "\"%s\" 타켓은 타켓 세부정보를 지정할 수 없음" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: backup/basebackup.c:921 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "레코드의 잘못된 프리링크 %X/%X, 해당 레코드 %X/%X" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "압축을 사용하지 않으면 압축 세부 정보를 지정할 수 없음" -#: access/transam/xlogreader.c:771 +#: backup/basebackup.c:934 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "잘못된 자원관리자 데이터 체크섬, 위치: %X/%X 레코드" +msgid "invalid compression specification: %s" +msgstr "잘못된 압축 명세: %s" -#: access/transam/xlogreader.c:808 +#: backup/basebackup.c:1431 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "%04X 매직 번호가 잘못됨, 로그 파일 %s, 위치 %u" +msgid "skipping special file \"%s\"" +msgstr "\"%s\" 특수 파일을 건너뜀" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: backup/basebackup.c:1550 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "잘못된 정보 비트 %04X, 로그 파일 %s, 위치 %u" +msgid "invalid segment number %d in file \"%s\"" +msgstr "잘못된 조각 번호 %d, 해당 파일: \"%s\"" -#: access/transam/xlogreader.c:837 +#: backup/basebackup.c:1582 #, c-format msgid "" -"WAL file is from different database system: WAL file database system " -"identifier is %llu, pg_control database system identifier is %llu" +"could not verify checksum in file \"%s\", block %u: read buffer size %d and " +"page size %d differ" msgstr "" -"WAL 파일이 다른 시스템의 것입니다. WAL 파일의 시스템 식별자는 %llu, pg_control " -"의 식별자는 %llu" +"\"%s\" 파일(%u 블록)에서 체크섬 검사 실패: 읽기 버퍼(%d)와 " +"페이지 크기(%d)가 서로 다름" -#: access/transam/xlogreader.c:845 +#: backup/basebackup.c:1656 #, c-format msgid "" -"WAL file is from different database system: incorrect segment size in page " -"header" +"checksum verification failed in file \"%s\", block %u: calculated %X but " +"expected %X" msgstr "" -"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더에 지정된 값이 잘" -"못된 조각 크기임" +"\"%s\" 파일 체크섬 검사 실패(해당 블럭 %u): 계산된 체크섬 %X (기" +"대값 %X)" -#: access/transam/xlogreader.c:851 +#: backup/basebackup.c:1663 #, c-format msgid "" -"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " -"header" +"further checksum verification failures in file \"%s\" will not be reported" msgstr "" -"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더의 XLOG_BLCKSZ 값" -"이 바르지 않음" +"계속해서 발생하는 \"%s\"에서의 체크섬 검사 실패는 더 이상 보고하지 않을 " +"것입니다." -#: access/transam/xlogreader.c:882 +#: backup/basebackup.c:1719 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "잘못된 페이지 주소 %X/%X, 로그 파일 %s, 위치 %u" +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 건 체크섬 검사 실패" -#: access/transam/xlogreader.c:907 +#: backup/basebackup.c:1765 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "타임라인 범위 벗어남 %u (이전 번호 %u), 로그 파일 %s, 위치 %u" +msgid "file name too long for tar format: \"%s\"" +msgstr "tar 파일로 묶기에는 파일 이름이 너무 긺: \"%s\"" -#: access/transam/xlogreader.c:1247 +#: backup/basebackup.c:1770 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" +msgid "" +"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "" +"tar 포멧을 사용하기에는 심볼릭 링크의 대상 경로가 너무 깁니다: 파일 이름 \"%s" +"\", 대상 \"%s\"" -#: access/transam/xlogreader.c:1270 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X 에 자료가 없음" +msgid "gzip compression is not supported by this build" +msgstr "gzip 압축 기능을 뺀 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:1277 +#: backup/basebackup_gzip.c:143 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길이의 자료가 있음, 위치 %X/%X" +msgid "could not initialize compression library" +msgstr "압축 라이브러리를 초기화할 수 없음" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "lz4 기능을 뺀 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:1313 +#: backup/basebackup_server.c:75 #, c-format msgid "" -"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " -"%X/%X" +"must be superuser or a role with privileges of the pg_write_server_files " +"role to create backup stored on server" msgstr "" -"BKPIMAGE_HAS_HOLE 설정이 되어 있지만, 옵셋: %u, 길이: %u, 블록 이미지 길이: " -"%u, 대상: %X/%X" +"서버에 백업 결과를 파일로 저장하려면, 슈퍼유저이거나 pg_write_server_files 롤 " +"구성원이어야 합니다." -#: access/transam/xlogreader.c:1329 +#: backup/basebackup_server.c:89 #, 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" +msgid "relative path not allowed for backup stored on server" +msgstr "백업을 서버에 저장할 경로 이름으로 상대경로는 사용할 수 없습니다" -#: access/transam/xlogreader.c:1344 +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "" -"BKPIMAGE_IS_COMPRESSED 설정이 되어 있지만, 블록 이미지 길이: %u, 대상: %X/%X" +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 없음: %m" -#: access/transam/xlogreader.c:1359 +#: backup/basebackup_server.c:115 #, 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" +msgid "directory \"%s\" exists but is not empty" +msgstr "\"%s\" 디렉터리가 비어있지 않습니다." -#: access/transam/xlogreader.c:1375 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1076 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL 설정이 되어 있지만, %X/%X 에 이전 릴레이션 없음" +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" -#: access/transam/xlogreader.c:1387 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:487 storage/smgr/md.c:494 storage/smgr/md.c:785 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "잘못된 block_id %u, 위치 %X/%X" +msgid "Check free disk space." +msgstr "디스크 여유 공간을 확인해 주십시오." -#: access/transam/xlogreader.c:1476 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "잘못된 레코드 길이, 위치 %X/%X" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "\"%s\" 파일 쓰기 실패: %d 바이트만 썼음(전체: %d), 해당 블록: %u" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "알 수 없는 타겟: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "\"%s\" 타겟은 타겟 세부 설정이 필요합니다." + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "zstd 압축 기능을 뺀 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:1565 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "잘못된 압축 이미지, 위치 %X/%X, 블록 %d" +msgid "could not set compression worker count to %d: %s" +msgstr "압축 작업자 수를 %d 값으로 지정할 수 없음: %s" -#: 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 값은 1 MB ~ 1 GB 사이 2^n 값이어야 함" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:842 tcop/postgres.c:3705 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" -msgstr "--%s 옵션은 해당 값을 지정해야합니다" +msgstr "--%s 옵션은 해당 값을 지정해야 합니다" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:847 tcop/postgres.c:3710 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" -msgstr "-c %s 옵션은 해당 값을 지정해야합니다" +msgstr "-c %s 옵션은 해당 값을 지정해야 합니다" -#: 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 "자제한 사항은 \"%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 "grant 옵션들은 롤에서만 지정될 수 있습니다" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:307 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레이션: \"%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 "\"%s\" 칼럼(해당 릴레이션: \"%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 "\"%s\" 칼럼(해당 릴레이션: \"%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 "\"%s\" 칼럼(해당 릴레이션: \"%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 권한은 스키마(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 "프로시져용 %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: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 "%u large object 없음" -#: 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 "상충하거나 중복된 옵션들" - -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "default privileges 설정은 칼럼 대상으로 할 수 없음" -#: 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: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:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 +#: commands/tablecmds.c:7477 commands/tablecmds.c:7551 +#: commands/tablecmds.c:7621 commands/tablecmds.c:7733 +#: commands/tablecmds.c:7827 commands/tablecmds.c:7886 +#: commands/tablecmds.c:7975 commands/tablecmds.c:8005 +#: commands/tablecmds.c:8133 commands/tablecmds.c:8215 +#: commands/tablecmds.c:8371 commands/tablecmds.c:8489 +#: commands/tablecmds.c:12218 commands/tablecmds.c:12399 +#: commands/tablecmds.c:12559 commands/tablecmds.c:13723 +#: commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2468 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3437 +#: parser/parse_utilcmd.c:3473 parser/parse_utilcmd.c:3515 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "\"%s\" 칼럼은 \"%s\" 릴레이션(relation)에 없음" -#: 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17156 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:1859 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "\"%s\" 시퀀스는 USAGE, SELECT 및 UPDATE 권한만 지원함" -#: catalog/aclchk.c:1876 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "%s 권한은 테이블에서 사용할 수 없은 권한 형태임" -#: catalog/aclchk.c:2042 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "%s 권한 형식은 칼럼에서 유효하지 않음" -#: catalog/aclchk.c:2055 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "\"%s\" 시퀀스는 SELECT 열 권한만 지원함" -#: catalog/aclchk.c:2637 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "\"%s\" 프로시주얼 언어는 안전하지 못합니다" -#: catalog/aclchk.c:2639 +#: catalog/aclchk.c:2668 #, c-format msgid "" "GRANT and REVOKE are not allowed on untrusted languages, because only " @@ -3857,516 +4282,544 @@ msgstr "" "안전하지 않은 프로시져 언어에 대해서는 GRANT 또는 REVOKE 작업을 허용하지 않습" "니다, 안전하지 않은 프로시져 언어는 슈퍼유저만 사용할 수 있기 때문입니다." -#: catalog/aclchk.c:3153 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "배열형 자료형에 권한 설정을 할 수 없음" -#: catalog/aclchk.c:3154 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "그 배열 요소에 해당하는 자료형에 대해서 접근 권한 설정을 하세요." -#: 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\" 이름의 개체는 도메인이 아닙니다" -#: catalog/aclchk.c:3281 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "알 수 없는 권한 타입 \"%s\"" -#: catalog/aclchk.c:3342 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "%s 집계함수에 대한 접근 권한 없음" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "%s 정렬정의(collation) 접근 권한 없음" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "%s 칼럼에 대한 접근 권한 없음" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "%s 문자코드변환규칙(conversion) 접근 권한 없음" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "%s 데이터베이스 접근 권한 없음" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "%s 도메인에 대한 접근 권한 없음" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "%s 이벤트 트리거 접근 권한 없음" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "%s 확장 모듈 접근 권한 없음" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "%s 외부 데이터 래퍼 접근 권한 없음" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "%s 외부 서버 접근 권한 없음" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "%s 외부 테이블 접근 권한 없음" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "%s 함수 접근 권한 없음" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "%s 인덱스 접근 권한 없음" -#: catalog/aclchk.c:3381 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "%s 프로시주얼 언어 접근 권한 없음" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "%s 대형 개체 접근 권한 없음" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "%s 구체화된 뷰에 대한 접근 권한 없음" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "%s 연산자 클래스 접근 권한 없음" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "%s 연산자 접근 권한 없음" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "%s 연산자 패밀리 접근 권한 없음" -#: catalog/aclchk.c:3399 +#: 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:3402 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "%s 프로시져에 대한 접근 권한 없음" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "%s 발행 접근 권한 없음" -#: catalog/aclchk.c:3408 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "%s 루틴에 대한 접근 권한 없음" -#: catalog/aclchk.c:3411 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "%s 스키마(schema) 접근 권한 없음" -#: 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:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "%s 시퀀스 접근 권한 없음" -#: catalog/aclchk.c:3417 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "%s 개체 통계정보 접근 권한 없음" -#: catalog/aclchk.c:3420 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "%s 구독 접근 권한 없음" -#: catalog/aclchk.c:3423 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "%s 테이블에 대한 접근 권한 없음" -#: catalog/aclchk.c:3426 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "%s 테이블스페이스 접근 권한 없음" -#: catalog/aclchk.c:3429 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "%s 전문 검색 구성 접근 권한 없음" -#: catalog/aclchk.c:3432 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "%s 전문 검색 사전 접근 권한 없음" -#: catalog/aclchk.c:3435 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "%s 자료형 접근 권한 없음" -#: catalog/aclchk.c:3438 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "%s 뷰에 대한 접근 권한 없음" -#: catalog/aclchk.c:3473 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "%s 집계함수의 소유주여야만 합니다" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "%s 정렬정의(collation)의 소유주여야만 합니다" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "%s 문자코드변환규칙(conversion)의 소유주여야만 합니다" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "%s 데이터베이스의 소유주여야만 합니다" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "%s 도메인의 소유주여야만 합니다" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "%s 이벤트 트리거의 소유주여야만 합니다" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "%s 확장 모듈의 소유주여야만 합니다" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "%s 외부 데이터 래퍼의 소유주여야 함" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "%s 외부 서버의 소유주여야 함" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "%s 외부 테이블의 소유주여야 함" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "%s 함수의 소유주여야만 합니다" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "%s 인덱스의 소유주여야만 합니다" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "%s 프로시주얼 언어의 소유주여야만 합니다" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "%s 대형 개체의 소유주여야만 합니다" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "%s 구체화된 뷰의 소유주여야만 합니다" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "%s 연산자 클래스의 소유주여야만 합니다" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "%s 연산자의 소유주여야만 합니다" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "%s 연산자 패밀리의 소유주여야 함" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "%s 프로시져의 소유주여야만 합니다" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "%s 발행의 소유주여야만 합니다" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "%s 루틴의 소유주여야만 합니다" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "%s 시퀀스의 소유주여야만 합니다" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "%s 구독의 소유주여야만 합니다" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "%s 테이블의 소유주여야만 합니다" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "%s 자료형의 소유주여야만 합니다" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "%s 뷰의 소유주여야만 합니다" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "%s 스키마(schema)의 소유주여야만 합니다" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "%s 통계정보 개체의 소유주여야만 합니다" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "%s 테이블스페이스의 소유주여야만 합니다" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "%s 전문 검색 구성의 소유주여야 함" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "%s 전문 검색 사전의 소유주여야 함" -#: catalog/aclchk.c:3577 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "%s 릴레이션(relation)의 소유주여야만 합니다" -#: catalog/aclchk.c:3621 +#: catalog/aclchk.c:3812 #, 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:3957 catalog/aclchk.c:3976 #, 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:4071 catalog/aclchk.c:5184 #, c-format msgid "relation with OID %u does not exist" msgstr "OID %u 릴레이션(relation) 없음" -#: catalog/aclchk.c:3913 catalog/aclchk.c:5151 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 #, 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: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:2037 #, c-format msgid "function with OID %u does not exist" msgstr "OID %u 함수 없음" -#: 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 "OID %u 언어 없음" -#: catalog/aclchk.c:4185 catalog/aclchk.c:4909 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, 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: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: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 "OID가 %u인 외부 데이터 래퍼가 없음" -#: 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 "OID가 %u인 외부 서버가 없음" -#: 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 "OID %u 자료형 없음" -#: catalog/aclchk.c:4785 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "OID %u 연산자 없음" -#: catalog/aclchk.c:4962 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "OID %u 연산자 클래스 없음" -#: catalog/aclchk.c:4989 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "OID가 %u인 연산자 패밀리가 없음" -#: catalog/aclchk.c:5016 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "OID가 %u인 전문 검색 사전이 없음" -#: catalog/aclchk.c:5043 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "OID가 %u인 텍스트 검색 구성이 없음" -#: 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 "OID %u 이벤트 트리거가 없음" -#: 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 "OID %u 정렬정의(collation) 없음" -#: catalog/aclchk.c:5203 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "OID %u 인코딩 변환규칙(conversion) 없음" -#: catalog/aclchk.c:5244 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "OID %u 확장 모듈이 없음" -#: catalog/aclchk.c:5271 commands/publicationcmds.c:794 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "OID %u 발행 없음" -#: catalog/aclchk.c:5297 commands/subscriptioncmds.c:1112 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %u 구독 없음" -#: catalog/aclchk.c:5323 +#: 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 "" +"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: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\" 릴레이션의 새 OID를 %llu 시도 끝에 배정함" + +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "pg_nextoid() 함수를 호출 하려면 슈퍼유져여야함" +msgid "must be superuser to call %s()" +msgstr "%s() 호출은 슈퍼유저만 할 수 있음" -#: catalog/catalog.c:493 +#: 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:2191 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2282 #, 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:823 catalog/dependency.c:1061 +#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "%s 개체는 데이터베이스 시스템에서 필요하기 때문에 삭제 될 수 없음" + +#: catalog/dependency.c:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "%s 삭제할 수 없음, %s에서 필요로함" -#: catalog/dependency.c:825 catalog/dependency.c:1063 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "대신에, drop %s 명령을 사용할 수 있음." -#: catalog/dependency.c:933 catalog/pg_shdepend.c:640 -#, 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 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s 의존대상: %s" @@ -4376,7 +4829,7 @@ msgstr "%s 의존대상: %s" msgid "drop cascades to %s" msgstr "%s 개체가 덩달아 삭제됨" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:769 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4393,16 +4846,14 @@ msgstr[0] "" 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:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11864 +#: utils/misc/guc.c:11898 utils/misc/guc.c:11932 utils/misc/guc.c:11975 +#: utils/misc/guc.c:12017 #, c-format msgid "%s" msgstr "%s" @@ -4419,62 +4870,67 @@ msgstr "" 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:1207 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "%d개의 다른 개체에 대한 관련 항목 삭제" -#: catalog/dependency.c:1875 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "%s 자료형은 여기서 사용할 수 없음" -#: catalog/heap.c:330 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "%d번째 칼럼이 없습니다. 해당 릴레이션: \"%s\"" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\" 만들 권한이 없음" -#: catalog/heap.c:332 +#: catalog/heap.c:326 #, 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:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6861 #, c-format msgid "tables can have at most %d columns" msgstr "한 테이블에 지정할 수 있는 최대 열 수는 %d입니다" -#: catalog/heap.c:518 commands/tablecmds.c:6468 +#: catalog/heap.c:484 commands/tablecmds.c:7161 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "\"%s\" 열 이름은 시스템 열 이름과 충돌합니다" -#: catalog/heap.c:534 +#: catalog/heap.c:500 #, 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:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "\"%s\" 파티션 키 칼럼은 %s 의사 자료형(pseudo-type)을 사용합니다" -#: catalog/heap.c:614 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "\"%s\" 칼럼은 %s 의사 자료형(pseudo-type)을 사용합니다" -#: catalog/heap.c:645 +#: catalog/heap.c:611 #, 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:666 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -4482,25 +4938,27 @@ msgstr "" "\"%s\" 파티션 키 칼럼에 사용하는 %s 자료형에서 사용할 정렬규칙을 결정할 수없" "습니다." -#: catalog/heap.c:706 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, 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:1148 catalog/index.c:874 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "\"%s\" 이름의 릴레이션(relation)이 이미 있습니다" -#: 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:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/pg_type.c:931 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:1172 +#: catalog/heap.c:1165 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -4509,92 +4967,112 @@ msgstr "" "하나의 릴레이션은 그 이름과 같은 자료형과 관계합니다. 그래서, 이미 같은 이름" "의 자료형이 있다면 해당 릴레이션을 만들 수 없습니다. 다른 이름을 사용하세요." -#: catalog/heap.c:1201 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때, toast relfilenode 값이 지정되지 않았습니다" + +#: catalog/heap.c:1216 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "이진 업그레이드 작업 때, pg_class 자료 OID 값이 지정되지 않았습니다" -#: catalog/heap.c:2400 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때, relfilenode 값이 지정되지 않았습니다" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "\"%s\" 파티션 테이블에는 NO INHERIT 조건을 사용할 수 없음" -#: catalog/heap.c:2670 +#: catalog/heap.c:2401 #, 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:2571 catalog/index.c:888 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8863 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "" "\"%s\" 제약 조건이 이미 \"%s\" 릴레이션(relation)에서 사용되고 있습니다" -#: catalog/heap.c:2847 +#: catalog/heap.c:2578 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "\"%s\" 제약 조건이 비상속 제약 조건과 충돌합니다, 해당 릴레이션: \"%s\"" -#: catalog/heap.c:2858 +#: catalog/heap.c:2589 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "\"%s\" 제약 조건이 상속 제약 조건과 충돌합니다, 해당 릴레이션: \"%s\"" -#: catalog/heap.c:2868 +#: catalog/heap.c:2599 #, 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:2604 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "\"%s\" 제약 조건을 상속된 정의와 병합하는 중" -#: catalog/heap.c:2975 +#: catalog/heap.c:2709 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "\"%s\" 계산된 칼럼은 칼럼 생성 표현식에서는 사용될 수 없음" -#: catalog/heap.c:2977 +#: catalog/heap.c:2711 #, c-format msgid "A generated column cannot reference another generated column." msgstr "계산된 칼럼은 다른 계산된 칼럼을 참조할 수 없음" -#: catalog/heap.c:3029 +#: catalog/heap.c:2717 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "미리 계산된 칼럼 생성 표현식에 row 전체 변수는 사용할 수 없음" + +#: catalog/heap.c:2718 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "이 오류는 미리 계산된 칼럼 자체를 그 칼럼 값으로 지정할 때 발생합니다." + +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" -msgstr "생성 표현식은 불변형일 수 없음" +msgstr "미리 계산되는 생성 표현식 결과가 immutable이 아님" -#: catalog/heap.c:3057 rewrite/rewriteHandler.c:1192 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1288 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "" "\"%s\" 칼럼의 자료형은 %s 인데, default 표현식에서는 %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:1293 #, c-format msgid "You will need to rewrite or cast the expression." -msgstr "다시 정의하거나 형변화자를 사용해보십시오" +msgstr "다시 정의하거나 형변환자를 사용해보십시오" -#: catalog/heap.c:3109 +#: catalog/heap.c:2851 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "\"%s\" 테이블만이 체크 제약 조건에서 참조될 수 있습니다" -#: catalog/heap.c:3366 +#: catalog/heap.c:3149 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMIT 및 외래 키 조합이 지원되지 않음" -#: catalog/heap.c:3367 +#: catalog/heap.c:3150 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -4602,486 +5080,483 @@ msgid "" msgstr "" "\"%s\" 테이블에서 \"%s\" 테이블을 참조하는데 ON COMMIT 설정이 같지 않습니다." -#: catalog/heap.c:3372 +#: catalog/heap.c:3155 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "" "_^_ 테이블 내용을 모두 삭제할 수 없음, 참조키(foreign key) 제약 조건 안에서" -#: catalog/heap.c:3373 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "\"%s\" 테이블은 \"%s\" 개체를 참조합니다." -#: catalog/heap.c:3375 +#: catalog/heap.c:3158 #, 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:223 parser/parse_utilcmd.c:2187 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "\"%s\" 테이블에는 이미 기본키가 있습니다" -#: catalog/index.c:237 +#: catalog/index.c:241 #, c-format msgid "primary keys cannot be expressions" msgstr "기본기(primary key)를 표현할 수 없음" -#: catalog/index.c:254 +#: catalog/index.c:258 #, 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:773 catalog/index.c:1932 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "시스템 카탈로그 테이블에는 사용자 정의 인덱스를 지정할 수 없습니다" -#: catalog/index.c:804 +#: catalog/index.c:813 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "\"%s\" 연산자 클래스용으로 자동 결정 가능한 정렬 규칙은 지원하지 않음" -#: catalog/index.c:819 +#: catalog/index.c:828 #, 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:837 catalog/index.c:1305 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "exclusion 제약 조건용 잠금 없는 인덱스 만들기는 지원하지 않습니다" -#: catalog/index.c:837 +#: catalog/index.c:846 #, 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:866 commands/createas.c:423 commands/sequence.c:158 +#: parser/parse_utilcmd.c:211 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 릴레이션(relation)이 이미 있습니다, 건너뜀" -#: 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 인덱스 OID 값이 지정되지 않았습니다" -#: catalog/index.c:2128 -#, c-format -msgid "DROP INDEX CONCURRENTLY must be first action in transaction" -msgstr "DROP INDEX CONCURRENTLY 명령은 트랜잭션 내 가장 처음에 있어야 합니다" - -#: catalog/index.c:2859 +#: catalog/index.c:926 utils/cache/relcache.c:3743 #, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "\"%s\" 인덱스를 \"%s\" 테이블에 이어 만드는 중" +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때, 인덱스 relfilenode 값이 지정되지 않았습니다" -#: catalog/index.c:2864 +#: 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] "\"%s\" 인덱스를 \"%s\" 테이블에서 만드는 중, 병렬 작업자수: %d" +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLY 명령은 트랜잭션 내 가장 처음에 있어야 합니다" -#: catalog/index.c:3492 +#: catalog/index.c:3635 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "임시 테이블의 인덱스 재생성 작업은 다른 세션에서 할 수 없음" -#: catalog/index.c:3503 +#: catalog/index.c:3646 commands/indexcmds.c:3543 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOAST 테이블에 딸린 잘못된 인덱스에 대해 재색인 작업을 할 수 없음" -#: catalog/index.c:3625 +#: catalog/index.c:3662 commands/indexcmds.c:3423 commands/indexcmds.c:3567 +#: commands/tablecmds.c:3305 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "\"%s\" 인덱스가 다시 만들어졌음" +msgid "cannot move system relation \"%s\"" +msgstr "\"%s\" 시스템 릴레이션입니다. 이동할 수 없습니다" -#: catalog/index.c:3701 commands/indexcmds.c:3023 +#: catalog/index.c:3806 #, 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:3943 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" -"TOAST 테이블에 지정된 유효하지 않은 \"%s.%s\" 인덱스는 재색인 작업을 할 수 없음, 건너뜀" +"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:5781 #, 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\" 이름의 릴레이션(relation)이 없습니다" -#: 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\" 이름의 릴레이션(relation)이 없습니다" -#: 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:1535 +#: commands/extension.c:1541 #, 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: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 "\"%s\" 전문 검색 구성이 없음" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 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:14981 gram.y:16435 +#: catalog/namespace.c:2889 parser/parse_expr.c:813 parser/parse_target.c:1262 +#: gram.y:18258 gram.y:18298 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "적당하지 않은 qualified 이름 입니다 (너무 많은 점이 있네요): %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 스키마로(에서) 개체를 이동할 수 없습니다" -#: catalog/namespace.c:3052 commands/schemacmds.c:256 commands/schemacmds.c:336 -#: commands/tablecmds.c:1194 +#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "\"%s\" 스키마(schema) 없음" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3129 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "" "적당하지 않은 릴레이션(relation) 이름 입니다 (너무 많은 점이 있네요): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:3692 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "\"%s\" 정렬정의(collation)가 \"%s\" 인코딩에서는 쓸 수 없음" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:3747 #, c-format msgid "conversion \"%s\" does not exist" msgstr "\"%s\" 문자코드변환규칙(conversion) 없음" -#: 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:11116 utils/misc/guc.c:11194 +#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12049 utils/misc/guc.c:12151 #, 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:5626 commands/tablecmds.c:11089 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12335 #, 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:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17161 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:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17166 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" 개체는 구체화된 뷰(materialized view)가 아닙니다" -#: catalog/objectaddress.c:1296 commands/tablecmds.c:266 -#: commands/tablecmds.c:5659 commands/tablecmds.c:15721 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17171 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" 개체는 외부 테이블이 아님" -#: catalog/objectaddress.c:1337 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "릴레이션과 개체 이름을 지정해야 합니다" -#: 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 "칼럼 이름으로 적당하지 않습니다" -#: catalog/objectaddress.c:1513 +#: catalog/objectaddress.c:1601 #, 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:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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:1669 +#: catalog/objectaddress.c:1757 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "%d (%s, %s) 연산자(대상 %s) 없음" -#: catalog/objectaddress.c:1700 +#: catalog/objectaddress.c:1788 #, 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: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: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:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "\"%s\" 이름의 서버가 없음" -#: catalog/objectaddress.c:1833 +#: catalog/objectaddress.c:1921 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "\"%s\" 발행 릴레이션은 \"%s\" 발행에 없습니다." -#: catalog/objectaddress.c:1895 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "\"%s\" 발행 스키마는 \"%s\" 발행에 없습니다." + +#: catalog/objectaddress.c:2026 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "알 수 없는 기본 ACL 개체 타입 \"%c\"" -#: catalog/objectaddress.c:1896 +#: 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:1947 +#: catalog/objectaddress.c:2078 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "\"%s\" 사용자용 기본 ACL 없음. (해당 스키마: \"%s\", 해당 개체: %s)" -#: catalog/objectaddress.c:1952 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "\"%s\" 사용자용 기본 ACL 없음. (해당 개체: %s)" -#: 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 "이름이나 인자 목록에는 null이 포함되지 않아야 함" -#: catalog/objectaddress.c:2013 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "\"%s\" 형 지원하지 않음" -#: catalog/objectaddress.c:2033 catalog/objectaddress.c:2051 -#: catalog/objectaddress.c:2192 +#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 +#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 #, c-format msgid "name list length must be exactly %d" msgstr "이름 목록 길이는 %d 이어야 합니다." -#: catalog/objectaddress.c:2055 +#: catalog/objectaddress.c:2186 #, 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:2195 catalog/objectaddress.c:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "이름 목록 길이는 적어도 %d 개 이상이어야 함" -#: catalog/objectaddress.c:2120 catalog/objectaddress.c:2141 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "인자 목록은 %d 개여야 함" -#: catalog/objectaddress.c:2393 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2533 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:2548 commands/functioncmds.c:1566 #, c-format msgid "must be owner of type %s or type %s" -msgstr "%s, %s 자료형의 소유주여야합니다" +msgstr "%s, %s 자료형의 소유주여야 합니다" -#: catalog/objectaddress.c:2458 catalog/objectaddress.c:2475 +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "슈퍼유져여야함" -#: catalog/objectaddress.c:2465 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "CREATEROLE 권한이 있어야 함" -#: catalog/objectaddress.c:2544 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "알 수 없는 개체 형태 \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2772 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr " %s 칼럼(%s 의)" -#: catalog/objectaddress.c:2782 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "%s 함수" -#: catalog/objectaddress.c:2787 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "%s 자료형" -#: catalog/objectaddress.c:2817 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "%s 자료형을 %s 자료형으로 바꾸는 작업" -#: catalog/objectaddress.c:2845 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "collation %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2871 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "%s 제약 조건(해당 개체: %s)" -#: catalog/objectaddress.c:2877 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "%s 제약 조건" -#: catalog/objectaddress.c:2904 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "%s 문자코드변환규칙" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2943 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "%s 용 기본값" -#: catalog/objectaddress.c:2952 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "프로시주얼 언어 %s" -#: catalog/objectaddress.c:2957 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "%u 대형 개체" -#: catalog/objectaddress.c:2962 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "%s 연산자" -#: catalog/objectaddress.c:2994 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "%s 연산자 클래스, %s 인덱스 액세스 방법" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "%s 접근 방법" @@ -5090,7 +5565,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:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%d (%s, %s) 연산자 (연산자 패밀리: %s): %s" @@ -5099,257 +5574,269 @@ 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:3370 #, 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:3422 #, c-format msgid "rule %s on %s" msgstr "%s 룰(rule), 해당 테이블: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "%s 트리거, 해당 테이블: %s" -#: catalog/objectaddress.c:3207 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "%s 스키마" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "%s 통계정보 개체" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "%s 전문 검색 파서" -#: catalog/objectaddress.c:3283 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "%s 전문 검색 사전" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "%s 전문 검색 템플릿" -#: catalog/objectaddress.c:3335 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "%s 전문 검색 구성" -#: catalog/objectaddress.c:3344 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "%s 롤" -#: catalog/objectaddress.c:3357 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "%s 데이터베이스" -#: catalog/objectaddress.c:3369 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "%s 테이블스페이스" -#: catalog/objectaddress.c:3378 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "%s 외부 데이터 래퍼" -#: catalog/objectaddress.c:3387 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "%s 서버" -#: catalog/objectaddress.c:3415 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "%s에 대한 사용자 매핑, 해당 서버: %s" -#: catalog/objectaddress.c:3460 +#: catalog/objectaddress.c:3791 #, 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:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "%s 롤이 새 테이블을 만들 때 기본적으로 지정할 접근 권한" -#: catalog/objectaddress.c:3470 +#: catalog/objectaddress.c:3801 #, 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:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "%s 롤이 새 시퀀스를 만들 때 기본적으로 지정할 접근 권한" -#: catalog/objectaddress.c:3480 +#: catalog/objectaddress.c:3811 #, 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:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "%s 롤이 새 함수를 만들 때 기본적으로 지정할 접근 권한" -#: catalog/objectaddress.c:3490 +#: catalog/objectaddress.c:3821 #, 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:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "%s 롤이 새 자료형을 만들 때 기본적으로 지정할 접근 권한" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "%s 롤이 새 시퀀스를 만들 때 기본적으로 지정할 접근 권한" -#: catalog/objectaddress.c:3507 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "%s 롤(해당 스키마: %s)의 기본 접근 권한" -#: catalog/objectaddress.c:3511 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "%s 롤의 기본 접근 권한" -#: catalog/objectaddress.c:3529 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "%s 확장 모듈" -#: catalog/objectaddress.c:3542 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "%s 이벤트 트리거" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "매개 변수 %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "%s 정책(%s 의)" -#: catalog/objectaddress.c:3588 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "%s 발행" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "%s 스키마 발행 (해당 발행이름: %s)" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3614 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "%s 발행 (해당 발행이름: %s)" -#: catalog/objectaddress.c:3623 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "%s 구독" -#: catalog/objectaddress.c:3642 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "%s 형 변환자, 대상언어: %s" -#: catalog/objectaddress.c:3705 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "%s 테이블" -#: catalog/objectaddress.c:3710 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "%s 인덱스" -#: catalog/objectaddress.c:3714 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "%s 시퀀스" -#: catalog/objectaddress.c:3718 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "%s 토스트 테이블" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "%s 뷰" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "%s 구체화된 뷰" -#: catalog/objectaddress.c:3730 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "%s 복합 자료형" -#: catalog/objectaddress.c:3734 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "%s 외부 테이블" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "%s 릴레이션" -#: catalog/objectaddress.c:3776 +#: catalog/objectaddress.c:4189 #, 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" msgstr[0] "집계 함수에는 %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 aggregate)의 인자는 그것과 대응하는 " +"실함수의 인자와 일치해야합니다." -#: 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 이름의 transition 함수의 리턴 자료형이 %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 " @@ -5358,152 +5845,206 @@ 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 inverse transition 함수의 반환 자료형이 %s 형이 아닙니다." -#: catalog/pg_aggregate.c:351 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, 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 combine 함수의 반환 자료형이 %s 형이 아닙니다" -#: catalog/pg_aggregate.c:438 executor/nodeAgg.c:4177 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, 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 serialization 함수의 반환 자료형이 %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 deserialization 함수의 반환 자료형이 %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\" 개체는 ordinary 집계 함수입니다" -#: 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 "집계 함수의 direct 인자 번호는 바꿀 수 없음" -#: 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: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:876 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "%s 함수는 한 set을 리턴함" -#: 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 함수는 run-time type coercion을 필요로 함" -#: 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 형으로 변환하는 형변환 규칙(cast)이 이미 있습니다" -#: 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:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 정렬규칙이 이미 있습니다, 건너뜀" -#: catalog/pg_collation.c:95 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "\"%s\" 정렬규칙이 \"%s\" 인코딩에 이미 지정되어 있습니다, 건너뜀" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:147 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "\"%s\" 정렬규칙이 이미 있습니다" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "\"%s\" 정렬규칙이 \"%s\" 인코딩에 이미 지정되어 있습니다" -#: catalog/pg_constraint.c:676 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "\"%s\" 제약 조건이 %s 도메인에 이미 지정되어 있습니다" -#: 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 "\"%s\" 제약 조건은 \"%s\" 테이블에 없음" -#: catalog/pg_constraint.c:1056 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "\"%s\" 제약 조건은 %s 도메인에 없음" @@ -5518,25 +6059,44 @@ msgstr "\"%s\" 이름의 변환규칙(conversion)이 이미 있음" msgid "default conversion for %s to %s already exists" msgstr "%s 코드에서 %s 코드로 변환하는 기본 변환규칙(conversion)은 이미 있음" -#: catalog/pg_depend.c:162 commands/extension.c:3324 +#: catalog/pg_depend.c:222 commands/extension.c:3271 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s 개체는 \"%s\" 확장모듈에 이미 구성원입니다" -#: catalog/pg_depend.c:538 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 +#, c-format +msgid "%s is not a member of extension \"%s\"" +msgstr "\"%s\" 개체는 \"%s\" 확장 모듈의 구성 요소가 아닙니다" + +#: catalog/pg_depend.c:232 +#, c-format +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "확장 모듈이 자기 소유 객체가 아닌 객체를 덮어 쓸 수는 없습니다." + +#: catalog/pg_depend.c:283 +#, c-format +msgid "" +"An extension may only use CREATE ... IF NOT EXISTS to skip object creation " +"if the conflicting object is one that it already owns." +msgstr "" +"이미 있는 객체와 충돌을 피하기 위해 이미 있는 객체 생성을 건너뛰려면, " +"확장 모듈에서 CREATE ... IF NOT EXISTS 구문을 사용해야합니다." + +#: catalog/pg_depend.c:646 #, c-format msgid "cannot remove dependency on %s because it is a system object" -msgstr "%s 의존개체들은 시스템 개체이기 때문에 삭제 될 수 없습니다" +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 @@ -5564,7 +6124,40 @@ 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 "" +"이 파티션은 이미 concurrently 옵션을 사용해서 떼기 작업을 했거나, 아직 " +"떼기가 안 끝났습니다." + +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15481 +#, 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:254 #, c-format msgid "schema \"%s\" already exists" msgstr "\"%s\" 이름의 스키마(schema)가 이미 있음" @@ -5577,34 +6170,34 @@ msgstr "\"%s\" 타당한 연산자 이름이 아님" #: catalog/pg_operator.c:370 #, c-format msgid "only binary operators can have commutators" -msgstr "_^_ 바이너리 연산자만이 commutator를 가질 수 있음" +msgstr "바이너리 연산자만이 commutator를 가질 수 있음" -#: 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 "_^_ 바이너리 연산자만이 join selectivity를 가질 수 있음" +msgstr "바이너리 연산자만이 join selectivity를 가질 수 있음" #: catalog/pg_operator.c:378 #, c-format msgid "only binary operators can merge join" -msgstr "_^_ 바이너리 연산자만이 merge join할 수 있음" +msgstr "바이너리 연산자만이 merge join할 수 있음" #: catalog/pg_operator.c:382 #, c-format msgid "only binary operators can hash" -msgstr "_^_ 바이너리 연산자만이 해시할 수 있음" +msgstr "바이너리 연산자만이 해시할 수 있음" #: catalog/pg_operator.c:393 #, c-format 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 "부울 연산자만 조인 선택을 포함할 수 있음" @@ -5629,43 +6222,53 @@ msgstr "%s 연산자가 이미 있음" msgid "operator cannot be its own negator or sort operator" msgstr "연산자는 자신의 negator나 sort 연산자가 될 수 없습니다" -#: 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 "\"%s\" 매개 변수 ACL이 없음" + +#: 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개 이상의 인자를 사용할 수 없음" -#: 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 "이미 있는 함수의 리턴 자료형은 바꿀 수 없습니다" @@ -5674,89 +6277,120 @@ 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:748 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "\"%s\" 이름의 내장 함수가 없음" -#: catalog/pg_proc.c:846 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL 함수는 %s 자료형을 리턴할 수 없음" -#: catalog/pg_proc.c:861 +#: catalog/pg_proc.c:870 #, 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:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "\"%s\" SQL 함수" -#: 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 "이 작업은 언로그드 테이블 대상으로 지원하지 않습니다." -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, 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:762 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "\"%s\" 칼럼은 시스템 칼럼입니다. 발행 칼럼 목록에 포함될 수 없습니다." + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use 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:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "\"%s\" 이름의 발행은 없습니다" -#: catalog/pg_shdepend.c:776 +#: catalog/pg_shdepend.c:829 #, c-format msgid "" "\n" @@ -5766,44 +6400,49 @@ msgid_plural "" "and objects in %d other databases (see server log for list)" msgstr[0] "" -#: 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:1253 #, c-format msgid "owner of %s" msgstr "%s 개체의 소유주" -#: catalog/pg_shdepend.c:1163 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "\"%s\"에 대한 권한" -#: catalog/pg_shdepend.c:1165 +#: 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:1173 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d 개체(데이터베이스: %s)" -#: catalog/pg_shdepend.c:1284 +#: catalog/pg_shdepend.c:1331 #, c-format msgid "" "cannot drop objects owned by %s because they are required by the database " @@ -5812,7 +6451,7 @@ msgstr "" "%s 소유주의 개체 삭제는 그 데이터베이스 시스템에서 필요하기 때문에 삭제 될 " "수 없음" -#: catalog/pg_shdepend.c:1431 +#: catalog/pg_shdepend.c:1477 #, c-format msgid "" "cannot reassign ownership of objects owned by %s because they are required " @@ -5821,148 +6460,183 @@ msgstr "" "%s 소유주의 개체 삭제는 그 데이터베이스 시스템에서 필요하기 때문에 삭제 될 " "수 없음" -#: catalog/pg_subscription.c:171 commands/subscriptioncmds.c:644 -#: commands/subscriptioncmds.c:858 commands/subscriptioncmds.c:1080 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, 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 "\"%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:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "_^_ 고정크기 자료형은 PLAIN 저장방법을 가져야만 합니다" -#: catalog/pg_type.c:839 +#: catalog/pg_type.c:827 #, 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:932 #, c-format -msgid "invalid page in block %u of relation %s" -msgstr "%u 블록(해당 릴레이션: %s)에 잘못된 페이지가 있음" +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "\"%s\" 자료형용 다중 범위 자료형를 만들기 실패." -#: catalog/toasting.c:106 commands/indexcmds.c:639 commands/tablecmds.c:5638 -#: commands/tablecmds.c:15576 +#: catalog/pg_type.c:933 #, 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:1047 +#, c-format +msgid "invalid page in block %u of relation %s" +msgstr "%u 블록(해당 릴레이션: %s)에 잘못된 페이지가 있음" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" -msgstr "순서 있는 세트 집계함수만 가설적일 수 있습니다" +msgstr "순서 있는 집합 집계함수만 가상 집합 집계 함수로 쓸 수 있습니다." -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:195 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "\"%s\" 속성을 aggregate에서 알 수 없음" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:205 #, c-format msgid "aggregate stype must be specified" -msgstr "aggregate stype 값을 지정하셔야합니다" +msgstr "aggregate stype 값을 지정하셔야 합니다" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:209 #, c-format msgid "aggregate sfunc must be specified" -msgstr "aggregate sfunc 값을 지정하셔야합니다" +msgstr "aggregate sfunc 값을 지정하셔야 합니다" -#: 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 "aggregate 입력 자료형을 지정해야 합니다" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:307 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "집계 입력 형식 지정에서 basetype이 중복됨" -#: 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 자료형은 aggregate transition 자료형으로 사용할 수 없습니다" +msgstr "%s 자료형은 STYPE 자료형으로 사용할 수 없습니다" -#: 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 "" +"SERIALFUNC 함수는 STYPE 자료형이 %s 형일때만 지정할 수 있습니다." -#: commands/aggregatecmds.c:371 +#: commands/aggregatecmds.c:372 #, c-format msgid "" "must specify both or neither of serialization and deserialization functions" msgstr "" +"SERIALFUNC, DESERIALFUNC 함수를 모두 지정하거나 모두 지정하지 않거나 하세요." -#: 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\" 옵션 값은 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 셋 중 하나여야 함" @@ -5972,27 +6646,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:903 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, 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:770 #, c-format msgid "publication \"%s\" already exists" msgstr "\"%s\" 이름의 발행이 이미 있습니다" -#: commands/alter.c:99 commands/subscriptioncmds.c:371 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "\"%s\" 이름의 구독이 이미 있습니다" @@ -6032,10 +6706,10 @@ 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의 스키마 지정은 슈퍼유져여야합니다" +msgstr "%s의 스키마 지정은 슈퍼유져여야 합니다" #: commands/amcmds.c:60 #, c-format @@ -6052,61 +6726,56 @@ 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:213 commands/indexcmds.c:833 +#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, 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:714 +#: 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\" 건너뜀 --- 외부 테이블은 분석할 수 없음" -#: commands/analyze.c:243 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "" "\"%s\" 건너뜀 --- 테이블이 아니거나, 특수 시스템 테이블들은 분석할 수 없음" -#: commands/analyze.c:329 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\" 상속 관계 분석중" -#: commands/analyze.c:334 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\" 자료 통계 수집 중" -#: commands/analyze.c:394 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "\"%s\" 칼럼이 \"%s\" 릴레이션에서 두 번 이상 사용되었음" -#: commands/analyze.c:700 +#: commands/analyze.c:787 #, 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:1334 #, c-format msgid "" "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead " @@ -6115,7 +6784,7 @@ 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 " @@ -6124,7 +6793,7 @@ msgstr "" "\"%s.%s\" 상속 나무의 통계 수집 건너뜀 --- 이 상속 나무에는 하위 테이블이 없" "음" -#: commands/analyze.c:1347 +#: commands/analyze.c:1516 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6133,46 +6802,46 @@ msgstr "" "\"%s.%s\" 상속 나무의 통계 수집 건너뜀 --- 이 상속 나무에는 통계 수집할 하위 " "테이블이 없음" -#: commands/async.c:634 +#: commands/async.c:646 #, c-format msgid "channel name cannot be empty" msgstr "채널 이름은 비워둘 수 없음" -#: commands/async.c:640 +#: commands/async.c:652 #, c-format msgid "channel name too long" msgstr "채널 이름이 너무 긺" # # nonun 부분 begin -#: commands/async.c:645 +#: commands/async.c:657 #, c-format msgid "payload string too long" msgstr "payload 문자열이 너무 긺" -#: commands/async.c:864 +#: 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:970 +#: commands/async.c:980 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "NOTIFY 큐에 너무 많은 알림이 있습니다" -#: commands/async.c:1636 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTIFY 큐 사용률: %.0f%%" -#: commands/async.c:1638 +#: commands/async.c:1604 #, c-format msgid "" "The server process with PID %d is among those with the oldest transactions." msgstr "%d PID 서버 프로세스가 가장 오래된 트랜잭션을 사용하고 있습니다." -#: commands/async.c:1641 +#: commands/async.c:1607 #, c-format msgid "" "The NOTIFY queue cannot be emptied until that process ends its current " @@ -6180,42 +6849,42 @@ msgid "" msgstr "" "이 프로세스의 현재 트랜잭션을 종료하지 않으면, NOTIFY 큐를 비울 수 없습니다" -#: commands/cluster.c:125 commands/cluster.c:362 +#: commands/cluster.c:128 #, c-format -msgid "cannot cluster temporary tables of other sessions" -msgstr "다른 세션의 임시 테이블은 cluster 작업을 할 수 없습니다" +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 "파티션 된 테이블은 클러스터 작업을 할 수 없음" +msgid "cannot cluster temporary tables of other sessions" +msgstr "다른 세션의 임시 테이블은 cluster 작업을 할 수 없습니다" -#: commands/cluster.c:151 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "\"%s\" 테이블을 위한 previously clustered 인덱스가 없음" -#: commands/cluster.c:165 commands/tablecmds.c:12853 commands/tablecmds.c:14659 +#: commands/cluster.c:190 commands/tablecmds.c:14179 commands/tablecmds.c:16060 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" 인덱스는 \"%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:14669 +#: commands/cluster.c:511 commands/tablecmds.c:16070 #, 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 " @@ -6223,41 +6892,46 @@ msgid "" msgstr "" "\"%s\" 인덱스는 자료 액세스 방법이 cluster 작업을 할 수 없는 방법입니다." -#: commands/cluster.c:452 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "" "\"%s\" 인덱스가 부분인덱스(partial index)라서 cluster 작업을 할 수 없습니다" -#: 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 "파티션된 테이블 대상으로 인덱스 클러스터 표시를 할 수 없음" -#: commands/cluster.c:863 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr " \"%s.%s\" 클러스터링 중 (사용 인덱스: \"%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\" 청소 중" + +#: commands/cluster.c:985 #, c-format msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +"\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "" -"\"%s\": 삭제가능한 %.0f개, 삭제불가능한 %.0f개의 행 버전을 %u 페이지에서 발견" +"\"%s.%s\": 삭제가능한 %.0f개, 삭제불가능한 %.0f개의 행 버전을 %u 페이지에서 발견" "했음." -#: commands/cluster.c:904 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6266,101 +6940,129 @@ 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:389 commands/tablecmds.c:7808 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, 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 값과 함께 지정할 수 없음" + +#: 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:256 #, c-format msgid "nondeterministic collations not supported with this provider" -msgstr "" +msgstr "이 제공자는 DETERMINISTIC = false 옵션을 지원하지 않음" + +#: commands/collationcmds.c:275 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "이 제공자는 현재 데이터베이스 인코딩을 지원하지 않음" -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 정렬규칙(대상 인코딩: \"%s\")이 \"%s\" 스키마 안에 이미 있음" -#: commands/collationcmds.c:276 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 정렬규칙이 \"%s\" 스키마에 이미 있습니다" -#: commands/collationcmds.c:324 +#: commands/collationcmds.c:395 commands/dbcommands.c:2398 #, c-format msgid "changing version from %s to %s" msgstr "%s에서 %s 버전으로 바꿉니다" -#: commands/collationcmds.c:339 +#: commands/collationcmds.c:410 commands/dbcommands.c:2411 #, c-format msgid "version has not changed" msgstr "버전이 바뀌지 않았습니다" -#: commands/collationcmds.c:470 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "\"%s\" 로케일 이름을 언어 태그로 변환할 수 없음: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:590 #, 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: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 "\"%s\" 명령을 실행할 수 없음: %m" -#: commands/collationcmds.c:685 +#: commands/collationcmds.c:753 #, 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:888 -#: utils/init/postinit.c:993 utils/init/postinit.c:1010 +#: commands/comment.c:61 commands/dbcommands.c:1538 commands/dbcommands.c:1735 +#: commands/dbcommands.c:1848 commands/dbcommands.c:2042 +#: commands/dbcommands.c:2284 commands/dbcommands.c:2371 +#: commands/dbcommands.c:2481 commands/dbcommands.c:2980 +#: utils/init/postinit.c:947 utils/init/postinit.c:1052 +#: utils/init/postinit.c:1069 #, 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 #, 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:2014 #, 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:2023 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "AFTER ROW에서 \"%s\" 함수를 실행해야 함" @@ -6370,420 +7072,299 @@ msgstr "AFTER ROW에서 \"%s\" 함수를 실행해야 함" msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "INSERT 또는 UPDATE에 대해 \"%s\" 함수를 실행해야 함" -#: 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 -#, 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 "열린 트랜잭션과 함께 클라이언트 연결에서 예상치 않은 EOF 발견됨" - -#: commands/copy.c:678 -#, c-format -msgid "COPY from stdin failed: %s" -msgstr "COPY 명령에서 stdin으로 자료 가져오기 실패: %s" - -#: commands/copy.c:694 +#: commands/conversioncmds.c:130 #, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "" -"COPY 명령으로 stdin으로 자료를 가져오는 동안 예상치 않은 메시지 타입 0x%02X " -"발견됨" +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 " -"to or from an external program" +"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 롤 " +"외부 프로그램을 이용하는 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 " "for anyone." msgstr "일반 사용자인데, 이 작업이 필요하면, 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 " -"a file" +"must be superuser or have privileges of the pg_read_server_files role to " +"COPY from a file" msgstr "" "파일을 읽어 COPY 명령으로 자료를 저장하려면, 슈퍼유저이거나 " -"pg_read_server_files 롤 구성원이어야 합니다." +"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 " -"file" +"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: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:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "COPY에서는 MERGE 구문을 지원하지 않습니다" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "COPY TO 명령에서는 HEADER 값으로 \"%s\" 값을 사용할 수 없음" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s 값은 boolean 값 또는 \"match\" 이어야 합니다." + +#: commands/copy.c:444 #, 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:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "\"%s\" 옵션에 대한 인자는 칼럼 이름 목록이어야 합니다." -#: commands/copy.c:1285 +#: commands/copy.c:553 #, 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:560 commands/dbcommands.c:849 commands/dbcommands.c:2232 #, c-format msgid "option \"%s\" not recognized" msgstr "\"%s\" 옵션은 타당하지 않습니다." -#: commands/copy.c:1304 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "BINARY 모드에서는 DELIMITER 값을 지정할 수 없음" -#: commands/copy.c:1309 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "BINARY 모드에서는 NULL 값을 지정할 수 없음" -#: commands/copy.c:1331 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPY 구분자는 1바이트의 단일 문자여야 함" -#: commands/copy.c:1338 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPY 명령에서 사용할 칼럼 구분자로 줄바꿈 문자들을 사용할 수 없습니다" -#: commands/copy.c:1344 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPY null 표현에서 줄바꿈 또는 캐리지 리턴을 사용할 수 없음" -#: commands/copy.c:1361 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPY 구분자는 \"%s\"일 수 없음" -#: commands/copy.c:1367 +#: commands/copy.c:635 #, 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:1373 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "COPY 따옴표는 CSV 모드에서만 사용할 수 있음" -#: commands/copy.c:1378 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPY 따옴표는 1바이트의 단일 문자여야 함" -#: commands/copy.c:1383 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPY 구분자 및 따옴표는 서로 달라야 함" -#: commands/copy.c:1389 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "COPY 이스케이프는 CSV 모드에서만 사용할 수 있음" -#: commands/copy.c:1394 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPY 이스케이프는 1바이트의 단일 문자여야 함" -#: commands/copy.c:1400 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "COPY force quote는 CSV 모드에서만 사용할 수 있음" -#: commands/copy.c:1404 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "COPY force quote는 COPY TO에서만 사용할 수 있음" -#: commands/copy.c:1410 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "COPY force not null은 CSV 모드에서만 사용할 수 있음" -#: commands/copy.c:1414 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "COPY force not null은 COPY FROM에서만 사용할 수 있음" -#: commands/copy.c:1420 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "COPY force null은 CSV 모드에서만 사용할 수 있음" -#: commands/copy.c:1425 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "COPY force null은 COPY FROM에서만 사용할 수 있음" -#: commands/copy.c:1431 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "COPY 구분자는 NULL 지정에 표시되지 않아야 함" -#: commands/copy.c:1438 +#: commands/copy.c:706 #, 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 룰(rule)은 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 룰(rule)은 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 -#, 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 "\"%s\" FORCE_QUOTE 칼럼은 COPY에서 참조되지 않음" - -#: commands/copy.c:1685 -#, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "\"%s\" FORCE_NOT_NULL 칼럼은 COPY에서 참조되지 않음" - -#: commands/copy.c:1708 -#, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "\"%s\" FORCE_NULL 칼럼은 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\" 이름의 개체는 뷰(view)입니다. 자료를 내보낼 수 없습니다" - -#: 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\" 개체는 테이블이 아닌 릴레이션(relation)이기에 자료를 내보낼 수 없습니" -"다" - -#: commands/copy.c:1909 +#: commands/copy.c:767 #, 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:769 #, 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:784 commands/indexcmds.c:1833 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, 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 "column \"%s\" does not exist" +msgstr "\"%s\" 이름의 칼럼은 없습니다" -#: commands/copy.c:1944 commands/copy.c:3511 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 +#: 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:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "%s 복사, %s번째 줄, %s 열" +msgid "COPY %s, line %llu, column %s" +msgstr "%s 복사, %llu번째 줄, %s 열" -#: commands/copy.c:2250 commands/copy.c:2297 +#: commands/copyfrom.c:128 commands/copyfrom.c:174 #, c-format -msgid "COPY %s, line %s" -msgstr "%s 복사, %s번째 줄" +msgid "COPY %s, line %llu" +msgstr "%s 복사, %llu번째 줄" -#: commands/copy.c:2261 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "%s 복사, %s번째 줄, %s 열: \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "%s 복사, %llu번째 줄, %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 입력" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, %llu행, %s 열: null 입력" -#: commands/copy.c:2291 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "%s 복사, %s번째 줄: \"%s\"" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "%s 복사, %llu번째 줄: \"%s\"" -#: commands/copy.c:2692 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "\"%s\" 뷰로 복사할 수 없음" -#: commands/copy.c:2694 +#: commands/copyfrom.c:571 #, 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:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "\"%s\" 구체화된 뷰(view)에 복사할 수 없음" -#: commands/copy.c:2703 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "\"%s\" 시퀀스에 복사할 수 없음" -#: commands/copy.c:2708 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "\"%s\" 개체는 테이블이 아닌 릴레이션(relation)이기에 복사할 수 없음" -#: commands/copy.c:2748 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "파티션 된 테이블에는 COPY FREEZE 수행할 수 없음" -#: commands/copy.c:2763 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "" "먼저 시작한 다른 트랜잭션이 아직 활성 상태여서 COPY FREEZE 작업은 진행할 수 " "없음" -#: commands/copy.c:2769 +#: commands/copyfrom.c:646 #, c-format msgid "" "cannot perform COPY FREEZE because the table was not created or truncated in " @@ -6792,7 +7373,17 @@ msgstr "" "현재 하위 트랜잭션에서 만들어지거나 비워진 테이블이 아니기 때문에 COPY " "FREEZE 작업을 할 수 없음" -#: commands/copy.c:3498 +#: commands/copyfrom.c:1267 commands/copyto.c:611 +#, c-format +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "\"%s\" FORCE_NOT_NULL 칼럼은 COPY에서 참조되지 않음" + +#: commands/copyfrom.c:1290 commands/copyto.c:634 +#, c-format +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "\"%s\" FORCE_NULL 칼럼은 COPY에서 참조되지 않음" + +#: commands/copyfrom.c:1518 #, c-format msgid "" "COPY FROM instructs the PostgreSQL server process to read a file. You may " @@ -6802,225 +7393,401 @@ msgstr "" "언트 쪽에 있는 파일을 읽어 처리 하려면, psql의 \\copy 내장 명령어를 사용하세" "요." -#: commands/copy.c:3526 +#: commands/copyfrom.c:1531 commands/copyto.c:731 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" 디렉터리임" + +#: 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 "외부 명령으로 파이프를 닫을 수 없음: %m" + +#: commands/copyfrom.c:1614 commands/copyto.c:306 +#, c-format +msgid "program \"%s\" failed" +msgstr "\"%s\" 프로그램 실패" + +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "COPY 파일 signature 인식되지 않았음" -#: commands/copy.c:3531 +#: commands/copyfromparse.c:205 +#, c-format +msgid "invalid COPY file header (missing flags)" +msgstr "COPY 명령에서 잘못된 파일 헤더를 사용함(플래그 빠졌음)" + +#: commands/copyfromparse.c:209 +#, c-format +msgid "invalid COPY file header (WITH OIDS)" +msgstr "COPY 파일 해더 잘못됨 (WITH OIDS)" + +#: commands/copyfromparse.c:214 +#, c-format +msgid "unrecognized critical flags in COPY file header" +msgstr "COPY 파일 헤더안에 critical flags 값들을 인식할 수 없음" + +#: commands/copyfromparse.c:220 +#, c-format +msgid "invalid COPY file header (missing length)" +msgstr "COPY 파일 헤더에 length 값이 빠졌음" + +#: commands/copyfromparse.c:227 +#, c-format +msgid "invalid COPY file header (wrong length)" +msgstr "COPY 파일 헤더에 length 값이 잘못되었음" + +#: commands/copyfromparse.c:256 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "COPY 명령에 사용할 파일을 읽을 수 없습니다: %m" + +#: 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 "열린 트랜잭션과 함께 클라이언트 연결에서 예상치 않은 EOF 발견됨" + +#: 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 명령으로 stdin으로 자료를 가져오는 동안 예상치 않은 메시지 타입 0x%02X " +"발견됨" -#: commands/copy.c:3535 +#: 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 명령에서 stdin으로 자료 가져오기 실패: %s" -#: commands/copy.c:3540 +#: commands/copyfromparse.c:785 #, c-format -msgid "unrecognized critical flags in COPY file header" -msgstr "COPY 파일 헤더안에 critical flags 값들을 인식할 수 없음" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "헤더 줄에 필드 수가 잘못됨: %d개 확인, 기대값: %d개" -#: commands/copy.c:3546 +#: commands/copyfromparse.c:801 #, c-format -msgid "invalid COPY file header (missing length)" -msgstr "COPY 파일 헤더에 length 값이 빠졌음" +msgid "" +"column name mismatch in header line field %d: got null value (\"%s\"), " +"expected \"%s\"" +msgstr "" +"헤더 %d 번째 필드의 칼럼 이름이 일치하지 않음: null 값 발견(\"%s\"), " +"기대값=\"%s\"" -#: commands/copy.c:3553 +#: commands/copyfromparse.c:808 #, c-format -msgid "invalid COPY file header (wrong length)" -msgstr "COPY 파일 헤더에 length 값이 잘못되었음" +msgid "" +"column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "" +"헤더 줄 %d 번째 필드의 칼럼 이름이 일치하지 않음: 해당이름=\"%s\", " +"기대값=\"%s\"" -#: commands/copy.c:3672 commands/copy.c:4337 commands/copy.c:4567 +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "마지막 칼럼을 초과해서 또 다른 데이터가 있음" -#: commands/copy.c:3686 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "\"%s\" 칼럼의 자료가 빠졌음" -#: commands/copy.c:3769 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "EOF 표시 뒤에도 복사 데이터를 받았음" -#: commands/copy.c:3776 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "행(row) 필드 갯수가 %d 임, 예상값은 %d" -#: commands/copy.c:4096 commands/copy.c:4113 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "데이터에 carriage return 값이 잘못되었음" -#: commands/copy.c:4097 commands/copy.c:4114 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "데이터에 carriage return 값 표기가 잘못 되었음" -#: commands/copy.c:4099 commands/copy.c:4116 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "carriage return값으로 \"\\r\" 문자를 사용하세요" -#: commands/copy.c:4100 commands/copy.c:4117 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "" "carriage return 문자를 그대로 적용하려면, quoted CSV 필드를 사용하세요." -#: commands/copy.c:4129 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "데이터에 newline 값이 잘못되었음" -#: commands/copy.c:4130 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "데이터에 newline 값이 잘못 되었음" -#: commands/copy.c:4132 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "newline 값으로 \"\\n\" 문자를 사용하세요" -#: commands/copy.c:4133 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "newline 문자를 그대로 적용하려면, quoted CSV 필드를 사용하세요." -#: commands/copy.c:4179 commands/copy.c:4215 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "end-of-copy 마크는 이전 newline 모양가 틀립니다" -#: commands/copy.c:4188 commands/copy.c:4204 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "end-of-copy 마크가 잘못되었음" -#: commands/copy.c:4651 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "종료되지 않은 CSV 따옴표 필드" -#: commands/copy.c:4728 commands/copy.c:4747 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "복사 자료 안에 예상치 않은 EOF 발견" -#: commands/copy.c:4737 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "잘못된 필드 크기" -#: commands/copy.c:4760 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "잘못된 바이너리 자료 포맷" -#: commands/copy.c:5068 +#: 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:5070 +#: 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:5085 commands/indexcmds.c:1699 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:369 #, c-format -msgid "column \"%s\" does not exist" -msgstr "\"%s\" 이름의 칼럼은 없습니다" +msgid "cannot copy from view \"%s\"" +msgstr "\"%s\" 이름의 개체는 뷰(view)입니다. 자료를 내보낼 수 없습니다" -#: 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: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\" 개체는 테이블이 아닌 릴레이션(relation)이기에 자료를 내보낼 수 없습니" +"다" + +#: commands/copyto.c:450 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "DO INSTEAD NOTHING 룰(rule)은 COPY 구문에서 지원하지 않습니다." -#: commands/createas.c:215 commands/createas.c:497 +#: 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 룰(rule)은 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 "\"%s\" FORCE_QUOTE 칼럼은 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:523 #, c-format msgid "too many column names were specified" msgstr "너무 많은 칼럼 이름을 지정했습니다." -#: commands/createas.c:539 +#: commands/createas.c:546 #, c-format msgid "policies not yet implemented for this command" msgstr "이 명령을 위한 정책은 아직 구현되어 있지 않습니다" -#: commands/dbcommands.c:246 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION 예약어는 이제 더이상 지원하지 않습니다" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "대신에 테이블스페이스를 이용하세요." -#: commands/dbcommands.c:261 +#: commands/dbcommands.c:838 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE 값은 LC_COLLATE 또는 LC_CTYPE 값과 함께 지정할 수 없음" +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:869 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:880 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:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "알 수 없는 로케일 제공자 이름: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2265 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "잘못된 연결 제한: %d" -#: commands/dbcommands.c:333 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "데이터베이스를 만들 권한이 없음" -#: commands/dbcommands.c:356 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "\"%s\" 템플릿 데이터베이스 없음" -#: commands/dbcommands.c:368 +#: commands/dbcommands.c:977 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "\"%s\" 데이터베이스를 복사할 권한이 없음" -#: commands/dbcommands.c:384 +#: commands/dbcommands.c:994 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "잘못된 데이터베이스 만들기 전략: \"%s\"" + +#: commands/dbcommands.c:995 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "사용할 수 있는 값은 \"wal_log\" 또는 \"file_copy\" 입니다." + +#: commands/dbcommands.c:1014 #, c-format msgid "invalid server encoding %d" msgstr "잘못된 서버 인코딩 %d" -#: commands/dbcommands.c:390 commands/dbcommands.c:395 +#: commands/dbcommands.c:1020 commands/dbcommands.c:1025 #, c-format msgid "invalid locale name: \"%s\"" msgstr "\"%s\" 로케일 이름이 잘못됨" -#: commands/dbcommands.c:415 +#: commands/dbcommands.c:1035 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "\"%s\" 인코딩은 ICU 제공자에서 지원하지 않음" + +#: commands/dbcommands.c:1045 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU 로케일을 지정해야 합니다." + +#: commands/dbcommands.c:1054 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU 로케일은 ICU 로케일 제공자를 지정해야만 쓸 수 있습니다." + +#: commands/dbcommands.c:1072 #, 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:1075 #, c-format msgid "" "Use the same encoding as in the template database, or use template0 as " @@ -7029,7 +7796,7 @@ msgstr "" "템플릿 데이터베이스와 동일한 인코딩을 사용하거나 template0을 템플릿으로 사용" "하십시오." -#: commands/dbcommands.c:423 +#: commands/dbcommands.c:1080 #, c-format msgid "" "new collation (%s) is incompatible with the collation of the template " @@ -7038,7 +7805,7 @@ msgstr "" "새 데이터 정렬 규칙 (%s)이 템플릿 데이터베이스의 데이터 정렬 규칙(%s)과 호환" "되지 않음" -#: commands/dbcommands.c:425 +#: commands/dbcommands.c:1082 #, c-format msgid "" "Use the same collation as in the template database, or use template0 as " @@ -7047,14 +7814,14 @@ msgstr "" "템플릿 데이터베이스와 동일한 데이터 정렬 규칙을 사용하거나 template0을 템플릿" "으로 사용하십시오." -#: commands/dbcommands.c:430 +#: commands/dbcommands.c:1087 #, c-format msgid "" "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database " "(%s)" msgstr "새 LC_CTYPE (%s)이 템플릿 데이터베이스의 LC_CTYPE (%s)과 호환되지 않음" -#: commands/dbcommands.c:432 +#: commands/dbcommands.c:1089 #, c-format msgid "" "Use the same LC_CTYPE as in the template database, or use template0 as " @@ -7063,17 +7830,85 @@ msgstr "" "템플릿 데이터베이스와 동일한 LC_CTYPE을 사용하거나 template0을 템플릿으로 사" "용하십시오." -#: commands/dbcommands.c:454 commands/dbcommands.c:1196 +#: commands/dbcommands.c:1094 +#, c-format +msgid "" +"new locale provider (%s) does not match locale provider of the template " +"database (%s)" +msgstr "새 로케일 제공자(%s)는 템플릿 데이터베이스의 로케일 제공자(%s)와 같지 않음" + +#: commands/dbcommands.c:1096 +#, c-format +msgid "" +"Use the same locale provider as in the template database, or use template0 " +"as template." +msgstr "" +"템플릿 데이터베이스와 동일한 로케일 제공자를 사용하거나 " +"template0을 템플릿으로 사용하십시오." + +#: commands/dbcommands.c:1105 +#, 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:1107 +#, c-format +msgid "" +"Use the same ICU locale as in the template database, or use template0 as " +"template." +msgstr "" +"템플릿 데이터베이스와 동일한 ICU 로케일을 사용하거나 " +"template0을 템플릿으로 사용하십시오." + +#: commands/dbcommands.c:1130 +#, c-format +msgid "" +"template database \"%s\" has a collation version, but no actual collation " +"version could be determined" +msgstr "" +"\"%s\" 템플릿 데이터베이스에는 문자 정렬 규칙 버전이 있는데, 그 실제 버전을 " +"알 수 없음" + +#: commands/dbcommands.c:1135 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "\"%s\" 템플릿 데이터베이스의 문자 정렬 규칙 버전이 바르지 않음" + +#: commands/dbcommands.c:1137 +#, 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:1140 +#, 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:1176 commands/dbcommands.c:1894 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global을 기본 테이블스페이스로 사용할 수 없음" -#: commands/dbcommands.c:480 +#: commands/dbcommands.c:1202 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "새 \"%s\" 테이블스페이스를 지정할 수 없습니다." -#: commands/dbcommands.c:482 +#: commands/dbcommands.c:1204 #, c-format msgid "" "There is a conflict because database \"%s\" already has some tables in this " @@ -7082,96 +7917,106 @@ msgstr "" "\"%s\" 데이터베이스 소속 몇몇 테이블들이 이 테이블스페이스안에 있어서 충돌이 " "일어납니다." -#: commands/dbcommands.c:512 commands/dbcommands.c:1066 +#: commands/dbcommands.c:1234 commands/dbcommands.c:1764 #, c-format msgid "database \"%s\" already exists" msgstr "\"%s\" 이름의 데이터베이스는 이미 있음" -#: commands/dbcommands.c:526 +#: commands/dbcommands.c:1248 #, 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:1270 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "%u OID 데이터베이스는 이미 \"%s\" 데이터베이스가 쓰고 있음" + +#: commands/dbcommands.c:1276 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "%u OID에 해당하는 데이터 디렉터리가 이미 있습니다." + +#: commands/dbcommands.c:1447 commands/dbcommands.c:1462 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "\"%s\" 인코딩은 \"%s\" 로케일과 일치하지 않음" -#: commands/dbcommands.c:772 +#: commands/dbcommands.c:1450 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "선택한 LC_CTYPE 설정에는 \"%s\" 인코딩이 필요합니다." -#: commands/dbcommands.c:787 +#: commands/dbcommands.c:1465 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "선택한 LC_COLLATE 설정에는 \"%s\" 인코딩이 필요합니다." -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:1545 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "\"%s\" 데이터베이스 없음, 건너 뜀" -#: commands/dbcommands.c:872 +#: commands/dbcommands.c:1569 #, c-format msgid "cannot drop a template database" msgstr "템플릿 데이터베이스는 삭제할 수 없습니다" -#: commands/dbcommands.c:878 +#: commands/dbcommands.c:1575 #, c-format msgid "cannot drop the currently open database" msgstr "현재 열려 있는 데이터베이스는 삭제할 수 없습니다" -#: commands/dbcommands.c:891 +#: commands/dbcommands.c:1588 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "\"%s\" 데이터베이스는 논리 복제 슬롯이 활성화 되어 있습니다" -#: commands/dbcommands.c:893 +#: commands/dbcommands.c:1590 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d 개의 활성 슬롯이 있습니다." -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:1604 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "\"%s\" 데이터베이스가 논리 복제 구독으로 사용되었음" -#: commands/dbcommands.c:909 +#: commands/dbcommands.c:1606 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d 개의 구독이 있습니다." -#: commands/dbcommands.c:930 commands/dbcommands.c:1088 -#: commands/dbcommands.c:1218 +#: commands/dbcommands.c:1627 commands/dbcommands.c:1786 +#: commands/dbcommands.c:1916 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "\"%s\" 데이터베이스를 다른 사용자가 액세스하기 시작했습니다" -#: commands/dbcommands.c:1048 +#: commands/dbcommands.c:1746 #, c-format msgid "permission denied to rename database" msgstr "데이터베이스 이름을 바꿀 권한이 없습니다" -#: commands/dbcommands.c:1077 +#: commands/dbcommands.c:1775 #, c-format msgid "current database cannot be renamed" msgstr "현재 데이터베이스의 이름을 바꿀 수 없음" -#: commands/dbcommands.c:1174 +#: commands/dbcommands.c:1872 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "현재 열려 있는 데이터베이스의 테이블스페이스를 바꿀 수 없음" -#: commands/dbcommands.c:1277 +#: commands/dbcommands.c:1978 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "\"%s\" 데이터베이스의 일부 릴레이션들이 \"%s\" 테이블스페이스에 이미 있음" -#: commands/dbcommands.c:1279 +#: commands/dbcommands.c:1980 #, c-format msgid "" "You must move them back to the database's default tablespace before using " @@ -7180,35 +8025,34 @@ msgstr "" "이 명령을 사용하기 전에 데이터베이스의 기본 테이블스페이스로 다시 이동해야 합" "니다." -#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 -#: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:619 +#: commands/dbcommands.c:2107 commands/dbcommands.c:2818 +#: commands/dbcommands.c:3082 commands/dbcommands.c:3196 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "" "불필요한 일부 파일이 이전 데이터베이스 디렉터리 \"%s\"에 남아 있을 수 있음" -#: commands/dbcommands.c:1460 +#: commands/dbcommands.c:2168 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "알 수 없는 DROP DATABASE 옵션: \"%s\"" -#: commands/dbcommands.c:1550 +#: commands/dbcommands.c:2246 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "\"%s\" 옵션은 다른 옵션들과 함께 사용할 수 없습니다." -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:2302 #, c-format msgid "cannot disallow connections for current database" msgstr "현재 데이터베이스 연결을 허용하지 않습니다." -#: commands/dbcommands.c:1742 +#: commands/dbcommands.c:2521 #, c-format msgid "permission denied to change owner of database" msgstr "데이터베이스 소유주를 바꿀 권한이 없습니다" -#: commands/dbcommands.c:2086 +#: commands/dbcommands.c:2924 #, c-format msgid "" "There are %d other session(s) and %d prepared transaction(s) using the " @@ -7216,57 +8060,68 @@ msgid "" msgstr "" "데이터베이스를 사용하는 %d개의 다른 세션과 %d개의 준비된 트랜잭션이 있습니다." -#: commands/dbcommands.c:2089 +#: commands/dbcommands.c:2927 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "데이터베이스를 사용하는 %d개의 다른 세션이 있습니다." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3016 +#: commands/dbcommands.c:2932 storage/ipc/procarray.c:3848 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "데이터베이스를 사용하는 %d개의 준비된 트랜잭션이 있습니다." -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 -#: commands/define.c:288 commands/define.c:334 +#: commands/dbcommands.c:3038 +#, c-format +msgid "missing directory \"%s\"" +msgstr "\"%s\" 디렉터리가 빠졌음" + +#: commands/dbcommands.c:3098 commands/tablespace.c:190 +#: commands/tablespace.c:654 +#, c-format +msgid "could not stat directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 상태를 파악할 수 없음: %m" + +#: commands/define.c:54 commands/define.c:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, 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 commands/define.c:225 commands/define.c:243 #, 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 값이어야합니다." +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:327 #, c-format msgid "%s requires an integer value" msgstr "%s 하나의 정수값이 필요함" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "%s의 인자는 이름이어야 합니다" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" -msgstr "%s의 인자는 자료형 이름이어야합니다" +msgstr "%s의 인자는 자료형 이름이어야 합니다" -#: commands/define.c:318 +#: commands/define.c:348 #, 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\" 함수는 집계 함수입니다" @@ -7276,19 +8131,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:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16487 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:1199 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "\"%s\" 스키마(schema) 없음, 건너뜀" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:259 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "\"%s\" 자료형 없음, 건너뜀" @@ -7308,7 +8163,7 @@ msgstr "\"%s\" 정렬규칙 없음, 건너뜀" msgid "conversion \"%s\" does not exist, skipping" msgstr "\"%s\" 문자코드변환규칙(conversion) 없음, 건너뜀" -#: commands/dropcmds.c:293 commands/statscmds.c:479 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "\"%s\" 통계정보 개체 없음, 무시함" @@ -7403,7 +8258,7 @@ msgstr " \"%s\" 룰(rule)이 \"%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:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "\"%s\" 서버가 없음, 건너뜀" @@ -7461,59 +8316,59 @@ 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: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:1883 +#: commands/event_trigger.c:1834 #, 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 "\"%s\" EXPLAIN 옵션에서 쓸 수 없는 값: \"%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:2936 #, c-format msgid "extension \"%s\" does not exist" msgstr "\"%s\" 이름의 확장 모듈이 없습니다" @@ -7570,84 +8425,104 @@ 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:6749 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, c-format msgid "parameter \"%s\" requires a Boolean value" -msgstr "\"%s\" 매개 변수의 값은 boolean 값이어야합니다." +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 "알 수 없는 \"%s\" 매개 변수가 \"%s\" 파일 안에 있습니다." -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "" "\"relocatable\" 값이 true 인 경우 \"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 권한이 있어야합니다." +"이 확장 모듈을 설치하려면 현재 데이터베이스에 대해서 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 권한이 있어야합니다." +"이 확장 모듈을 업데이트 하려면 현재 데이터베이스에 대해서 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:1216 #, c-format msgid "" "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" @@ -7655,12 +8530,12 @@ msgstr "" "\"%s\" 확장 모듈을 \"%s\" 버전에서 \"%s\" 버전으로 업데이트할 방법이 없습니" "다." -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1424 commands/extension.c:2994 #, c-format msgid "version to install must be specified" msgstr "설치할 버전을 지정해야 합니다." -#: commands/extension.c:1445 +#: commands/extension.c:1461 #, c-format msgid "" "extension \"%s\" has no installation script nor update path for version \"%s" @@ -7668,98 +8543,103 @@ msgid "" msgstr "" "\"%s\" 확장 모듈에는 \"%s\" 버전용 설치나 업데이트 스크립트가 없습니다." -#: commands/extension.c:1479 +#: commands/extension.c:1495 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "\"%s\" 확장 모듈은 \"%s\" 스키마 안에 설치되어야 합니다." -#: commands/extension.c:1639 +#: commands/extension.c:1655 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "\"%s\" 확장 모듈과 \"%s\" 확장 모듈이 서로 의존 관계입니다" -#: commands/extension.c:1644 +#: commands/extension.c:1660 #, c-format msgid "installing required extension \"%s\"" msgstr "\"%s\" 확장 모듈이 필요해서 실치 하는 중" -#: commands/extension.c:1667 +#: commands/extension.c:1683 #, c-format msgid "required extension \"%s\" is not installed" msgstr "\"%s\" 확장 모듈이 필요한데, 설치되어 있지 않습니다." -#: commands/extension.c:1670 +#: commands/extension.c:1686 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "" "필요한 모듈을 함께 설치하려면, CREATE EXTENSION ... CASCADE 구문을 사용하세" "요." -#: commands/extension.c:1705 +#: commands/extension.c:1721 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "\"%s\" 확장 모듈이 이미 있음, 건너뜀" -#: commands/extension.c:1712 +#: commands/extension.c:1728 #, c-format msgid "extension \"%s\" already exists" msgstr "\"%s\" 이름의 확장 모듈이 이미 있습니다" -#: commands/extension.c:1723 +#: commands/extension.c:1739 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "중첩된 CREATE EXTENSION 구문은 지원하지 않습니다." -#: commands/extension.c:1896 +#: commands/extension.c:1903 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "%s 의존개체들은 시스템 개체이기 때문에 삭제 될 수 없습니다" -#: commands/extension.c:2457 +#: commands/extension.c:2380 #, 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:2392 #, c-format msgid "OID %u does not refer to a table" msgstr "%u OID 자료가 테이블에 없습니다" -#: commands/extension.c:2474 +#: commands/extension.c:2397 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "\"%s\" 테이블은 만들려고 하는 확장 모듈의 구성 요소가 아닙니다." -#: commands/extension.c:2828 +#: commands/extension.c:2751 #, 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:2792 commands/extension.c:2855 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "\"%s\" 확장 모듈은 SET SCHEMA 구문을 지원하지 않음" -#: commands/extension.c:2934 +#: commands/extension.c:2857 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s 개체가 확장 모듈 스키마인 \"%s\" 안에 없음" -#: commands/extension.c:2993 +#: commands/extension.c:2916 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "중첩된 ALTER EXTENSION 구문을 지원하지 않음" -#: commands/extension.c:3085 +#: commands/extension.c:3005 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "\"%s\" 버전의 \"%s\" 확장 모듈이 이미 설치 되어 있음" -#: commands/extension.c:3336 +#: commands/extension.c:3217 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "해당 확장 모듈에 이런 형태의 객체는 추가 할 수 없음" + +#: commands/extension.c:3283 #, c-format msgid "" "cannot add schema \"%s\" to extension \"%s\" because the schema contains the " @@ -7768,12 +8648,7 @@ msgstr "" "\"%s\" 스키마에 \"%s\" 확장 모듈을 추가할 수 없음, 이미 해당 스키마 안에 포" "함되어 있음" -#: commands/extension.c:3364 -#, c-format -msgid "%s is not a member of extension \"%s\"" -msgstr "\"%s\" 개체는 \"%s\" 확장 모듈의 구성 요소가 아닙니다" - -#: commands/extension.c:3430 +#: commands/extension.c:3377 #, c-format msgid "file \"%s\" is too large" msgstr "\"%s\" 파일이 너무 큽니다." @@ -7803,32 +8678,32 @@ 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 " @@ -7837,7 +8712,7 @@ msgstr "" "외부 자료 랩퍼 핸들러를 바꾸면, 그것을 사용하는 외부 테이블의 내용이 바뀔 수 " "있습니다." -#: commands/foreigncmds.c:749 +#: commands/foreigncmds.c:745 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -7846,247 +8721,270 @@ msgstr "" "외부 자료 래퍼 유효성 검사기를 바꾸면 종속 개체에 대한 옵션이 유효하지 않을 " "수 있음" -#: commands/foreigncmds.c:895 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 외부 서버가 이미 있음, 건너뜀" -#: commands/foreigncmds.c:1183 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\" 사용자 매핑이 \"%s\" 서버용으로 이미 있음, 건너뜀" -#: commands/foreigncmds.c:1193 +#: commands/foreigncmds.c:1154 #, 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:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\" 사용자 매핑이 \"%s\" 서버용으로 없음" -#: commands/foreigncmds.c:1418 +#: commands/foreigncmds.c:1379 #, 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:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "\"%s\" 외부 자료 래퍼용 핸들러가 없음" -#: commands/foreigncmds.c:1575 +#: commands/foreigncmds.c:1513 #, 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:1615 #, 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 함수는 shell type %s 리턴할 수 없음" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:114 #, c-format msgid "return type %s is only a shell" msgstr "_^_ %s 리턴 자료형은 하나의 shell만 있습니다" -#: 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: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 support 함수는 %s 자료형을 반환해야 함" -#: commands/functioncmds.c:684 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" -msgstr "support 함수를 지정하려면 슈퍼유져여야합니다" +msgstr "support 함수를 지정하려면 슈퍼유져여야 합니다" + +#: 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:800 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "함수 본문(body) 부분이 빠졌습니다" -#: commands/functioncmds.c:810 +#: commands/functioncmds.c:875 #, c-format -msgid "no language specified" -msgstr "처리할 프로시주얼 언어를 지정하지 않았습니다" +msgid "duplicate function body specified" +msgstr "함수 본문(body) 부분을 중복 지정했습니다" -#: 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 "함수의 language 값이 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 구문은 따옴표 없는 SQL 함수 본문 안에서 지원하지 않음" -#: commands/functioncmds.c:897 +#: commands/functioncmds.c:995 #, 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: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:2050 +#: 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 "슈퍼유저만 leakproof 함수를 만들 수 있습니다" -#: 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 원본 자료형이 의사자료형(pseudo-type) 입니다" -#: commands/functioncmds.c:1437 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "%s 대상 자료형이 의사자료형(pseudo-type) 입니다" -#: 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 " @@ -8095,17 +8993,17 @@ msgstr "" "형변환 함수의 인자로 쓸 자료형은 원본 자료형과 일치하거나 바이너리 차원으로 " "같은 자료형이어야 함" -#: commands/functioncmds.c:1499 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" -msgstr "형변화 함수의 두번째 인자 자료형은 반드시 %s 형이여야합니다" +msgstr "형변화 함수의 두번째 인자 자료형은 반드시 %s 형이여야 합니다" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" -msgstr "형변화 함수의 세번째 인자 자료형은 반드시 %s 형이여야합니다" +msgstr "형변화 함수의 세번째 인자 자료형은 반드시 %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 " @@ -8114,318 +9012,314 @@ msgstr "" "형변환 함수의 반환 자료형은 대상 자료형과 일치하거나 바이너리 차원으로 같은 " "자료형이어야 함" -#: commands/functioncmds.c:1520 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" -msgstr "형변환 함수는 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 "형변환 함수는 세트(set)를 리턴할 수 없습니다" -#: commands/functioncmds.c:1555 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "CREATE CAST ... 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:1682 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" -msgstr "형변환 함수는 volatile 특성이 없어야합니다" +msgstr "형변환 함수는 volatile 특성이 없어야 합니다" -#: commands/functioncmds.c:1686 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" -msgstr "형변환 함수는 일반 함수여야합니다." +msgstr "형변환 함수는 일반 함수여야 합니다." -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "형변환 함수는 세트(set)를 리턴할 수 없습니다" -#: commands/functioncmds.c:1694 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "형변환 함수는 1개의 인자만 지정할 수 있습니다" -#: commands/functioncmds.c:1698 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" -msgstr "형변화 함수의 첫번째 인자 자료형은 반드시 %s 형이여야합니다" +msgstr "형변화 함수의 첫번째 인자 자료형은 반드시 %s 형이여야 합니다" -#: commands/functioncmds.c:1736 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "%s 자료형은 의사자료형(pseudo-type) 입니다" -#: commands/functioncmds.c:1742 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "%s 자료형은 도메인입니다" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQL 함수의 반환 자료형은 %s 형이어야 함" -#: commands/functioncmds.c:1808 +#: 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:1837 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "%s 자료형(대상 언어: \"%s\")을 위한 형변환 규칙은 이미 있습니다." -#: commands/functioncmds.c:1929 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "%s 자료형(대상 언어: \"%s\")을 위한 형변환 규칙은 없습니다." -#: commands/functioncmds.c:1980 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "%s 함수는 이미 \"%s\" 스키마안에 있습니다" -#: commands/functioncmds.c:2035 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "내장 코드가 빠졌습니다" -#: commands/functioncmds.c:2081 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "\"%s\" 프로시주얼 언어는 내장 코드 실행 기능을 지원하지 않습니다" -#: commands/functioncmds.c:2193 +#: 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개의 인자 이상을 전달할 수 없음" -#: commands/indexcmds.c:590 +#: commands/indexcmds.c:634 #, c-format msgid "must specify at least one column" msgstr "적어도 하나 이상의 칼럼을 지정해 주십시오" -#: commands/indexcmds.c:594 +#: commands/indexcmds.c:638 #, c-format msgid "cannot use more than %d columns in an index" msgstr "하나의 인덱스에서는 %d개보다 많은 칼럼을 사용할 수 없습니다" -#: commands/indexcmds.c:633 +#: commands/indexcmds.c:681 #, 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:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "\"%s\" 파티션된 테이블 대상으로 동시에 인덱스를 만들 수 없음" -#: commands/indexcmds.c:669 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "\"%s\" 파티션된 테이블 대상으로 제외 제약조건을 만들 수 없음" -#: commands/indexcmds.c:679 +#: commands/indexcmds.c:722 #, 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:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, 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:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "공유 관계만 pg_global 테이블스페이스에 배치할 수 있음" -#: commands/indexcmds.c:782 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "사용하지 않는 \"rtree\" 방법을 \"gist\" 액세스 방법으로 대체하는 중" -#: commands/indexcmds.c:803 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "\"%s\" 인덱스 접근 방법은 고유 인덱스를 지원하지 않습니다" -#: commands/indexcmds.c:808 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "\"%s\" 인덱스 접근 방법은 포함된 칼럼을 지원하지 않습니다" -#: commands/indexcmds.c:813 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "\"%s\" 인덱스 접근 방법은 다중 열 인덱스를 지원하지 않습니다" -#: commands/indexcmds.c:818 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "\"%s\" 인덱스 접근 방법은 제외 제약 조건을 지원하지 않습니다" -#: commands/indexcmds.c:941 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "\"%s\" 접근 방법을 사용하는 인덱스와 파티션 키가 일치하지 않습니다" -#: commands/indexcmds.c:951 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "파티션 키 정의에는 %s 제약조건을 지원하지 않음" -#: commands/indexcmds.c:953 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 제약조건은 파티션 키 포함 표현식에 사용할 수 없습니다" -#: commands/indexcmds.c:992 +#: commands/indexcmds.c:1037 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" msgstr "하위 테이블 용 유니크 제약조건에는 모든 파티션 칼럼이 포함되어야 함" -#: commands/indexcmds.c:993 +#: commands/indexcmds.c:1038 #, 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:1012 commands/indexcmds.c:1031 +#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 #, 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:1197 tcop/utility.c:1495 +#: commands/indexcmds.c:1276 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "\"%s\" 파티션된 테이블 대상으로 유니크 인덱스를 만들 수 없음" -#: commands/indexcmds.c:1199 tcop/utility.c:1497 +#: commands/indexcmds.c:1278 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "\"%s\" 테이블은 하위 테이블로 외부 테이블을 사용함." -#: commands/indexcmds.c:1628 +#: commands/indexcmds.c:1750 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "" -"인덱스 술어(predicate)에서 사용하는 함수는 IMMUTABLE 특성이 있어야합니다" +"인덱스 술어(predicate)에서 사용하는 함수는 IMMUTABLE 특성이 있어야 합니다" -#: commands/indexcmds.c:1694 parser/parse_utilcmd.c:2440 -#: parser/parse_utilcmd.c:2575 +#: commands/indexcmds.c:1828 parser/parse_utilcmd.c:2531 +#: parser/parse_utilcmd.c:2666 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "키에서 지정한 \"%s\" 칼럼이 없습니다" -#: commands/indexcmds.c:1718 parser/parse_utilcmd.c:1776 +#: commands/indexcmds.c:1852 parser/parse_utilcmd.c:1828 #, c-format msgid "expressions are not supported in included columns" msgstr "포함된 칼럼에 쓰인 표현식을 지원하지 않음" -#: commands/indexcmds.c:1759 +#: commands/indexcmds.c:1893 #, c-format msgid "functions in index expression must be marked IMMUTABLE" -msgstr "인덱스 식(expression)에 사용하는 함수는 IMMUTABLE 특성이 있어야합니다" +msgstr "인덱스 식(expression)에 사용하는 함수는 IMMUTABLE 특성이 있어야 합니다" -#: commands/indexcmds.c:1774 +#: commands/indexcmds.c:1908 #, c-format msgid "including column does not support a collation" msgstr "포함된 칼럼은 문자정렬규칙을 지원하지 않음" -#: commands/indexcmds.c:1778 +#: commands/indexcmds.c:1912 #, c-format msgid "including column does not support an operator class" msgstr "포함된 칼럼은 연산자 클래스를 지원하지 않음" -#: commands/indexcmds.c:1782 +#: commands/indexcmds.c:1916 #, c-format msgid "including column does not support ASC/DESC options" msgstr "포함된 칼럼은 ASC/DESC 옵션을 지원하지 않음" -#: commands/indexcmds.c:1786 +#: commands/indexcmds.c:1920 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "포함된 칼럼은 NULLS FIRST/LAST 옵션을 지원하지 않음" -#: commands/indexcmds.c:1813 +#: commands/indexcmds.c:1961 #, c-format msgid "could not determine which collation to use for index expression" msgstr "해당 인덱스에서 사용할 정렬규칙(collation)을 결정할 수 없습니다." -#: commands/indexcmds.c:1821 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:1969 commands/tablecmds.c:17502 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3798 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "%s 자료형은 collation 지원 안함" -#: commands/indexcmds.c:1859 +#: commands/indexcmds.c:2034 #, c-format msgid "operator %s is not commutative" msgstr "%s 연산자는 교환법칙이 성립하지 않습니다" -#: commands/indexcmds.c:1861 +#: commands/indexcmds.c:2036 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "exclude 제약조건용 인덱스를 만들 때는 교환법칙이 성립하는 연산자만 사용할 수 " "있습니다." -#: commands/indexcmds.c:1887 +#: commands/indexcmds.c:2062 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "%s 연산자는 \"%s\" 연산자 패밀리 구성원이 아닙니다." -#: commands/indexcmds.c:1890 +#: commands/indexcmds.c:2065 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -8433,90 +9327,110 @@ msgid "" msgstr "" "제외 연산자는 해당 제약 조건용 인덱스 연산자 클래스의 소속이어야 합니다." -#: commands/indexcmds.c:1925 +#: commands/indexcmds.c:2100 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "\"%s\" 접근 방법은 ASC/DESC 옵션을 지원하지 않음" -#: commands/indexcmds.c:1930 +#: commands/indexcmds.c:2105 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "\"%s\" 접근 방법은 NULLS FIRST/LAST 옵션을 지원하지 않음" -#: commands/indexcmds.c:1976 commands/tablecmds.c:16067 -#: commands/tablecmds.c:16073 commands/typecmds.c:1945 +#: commands/indexcmds.c:2151 commands/tablecmds.c:17527 +#: commands/tablecmds.c:17533 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "%s 자료형은 \"%s\" 인덱스 액세스 방법을 위한 기본 연산자 클래스(operator " "class)가 없습니다. " -#: commands/indexcmds.c:1978 +#: commands/indexcmds.c:2153 #, 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:2007 commands/indexcmds.c:2015 -#: commands/opclasscmds.c:208 +#: commands/indexcmds.c:2182 commands/indexcmds.c:2190 +#: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "" "\"%s\" 연산자 클래스는 \"%s\" 인덱스 액세스 방법에서 사용할 수 없습니다" -#: commands/indexcmds.c:2029 commands/typecmds.c:1933 +#: commands/indexcmds.c:2204 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "\"%s\" 연산자 클래스는 %s 자료형을 사용할 수 없습니다" -#: commands/indexcmds.c:2119 +#: commands/indexcmds.c:2294 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "%s 자료형을 위한 기본 연산자 클래스가 여러개 있습니다" -#: commands/indexcmds.c:2568 +#: commands/indexcmds.c:2622 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "알 수 없는 REINDEX 옵션: \"%s\"" + +#: commands/indexcmds.c:2846 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "\"%s\" 테이블에는 잠금 없는 재색인 작업을 할 대상 인덱스가 없음" -#: commands/indexcmds.c:2579 +#: commands/indexcmds.c:2860 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "\"%s\" 테이블에는 재색인 작업을 할 인덱스가 없습니다" -#: commands/indexcmds.c:2618 commands/indexcmds.c:2899 -#: commands/indexcmds.c:2992 +#: commands/indexcmds.c:2900 commands/indexcmds.c:3404 +#: commands/indexcmds.c:3532 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "시스템 카탈로그 테이블 대상으로 잠금 없는 인덱스를 만들 수 없음" -#: commands/indexcmds.c:2641 +#: commands/indexcmds.c:2923 #, c-format msgid "can only reindex the currently open database" msgstr "열려있는 현재 데이터베이스에서만 reindex 명령을 사용할 수 있습니다" -#: commands/indexcmds.c:2732 +#: commands/indexcmds.c:3011 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "시스템 카탈로그 테이블 대상으로 잠금 없는 재색인 작업을 할 수 없음, 모두 건너" "뜀" -#: commands/indexcmds.c:2784 commands/indexcmds.c:3503 +#: commands/indexcmds.c:3044 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "시스템 릴레이션은 이동할 수 없습니다, 모두 건너뜀" + +#: commands/indexcmds.c:3090 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "\"%s.%s\" 파티션된 테이블 대상으로 인덱스 다시 만드는 중" + +#: commands/indexcmds.c:3093 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "\"%s.%s\" 파티션된 인덱스를 다시 만드는 중" + +#: commands/indexcmds.c:3284 commands/indexcmds.c:4140 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "\"%s.%s\" 테이블의 인덱스들을 다시 만들었습니다." -#: commands/indexcmds.c:2914 commands/indexcmds.c:2960 +#: commands/indexcmds.c:3436 commands/indexcmds.c:3488 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "" "유효하지 않은 \"%s.%s\" 인덱스는 잠금 없는 재색인 작업을 할 수 없음, 건너뜀" -#: commands/indexcmds.c:2920 +#: commands/indexcmds.c:3442 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -8524,58 +9438,49 @@ msgstr "" "\"%s.%s\" exclusion 제약조건을 대상으로 잠금 없는 재색인 작업을 할 수 없음, " "건너뜀" -#: commands/indexcmds.c:3002 -#, c-format -msgid "cannot reindex invalid index on TOAST table concurrently" -msgstr "" -"TOAST 테이블에 지정된 유효하지 않은 인덱스는 잠금 없는 재색인 작업을 할 수 없음" - -#: commands/indexcmds.c:3030 +#: commands/indexcmds.c:3597 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "해당 개체에 대해서는 잠금 없는 재색인 작업을 할 수 없음" -#: commands/indexcmds.c:3485 commands/indexcmds.c:3496 +#: commands/indexcmds.c:3618 #, 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:3528 +#: commands/indexcmds.c:4121 commands/indexcmds.c:4133 #, 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/indexcmds.c:4123 commands/indexcmds.c:4142 #, 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\" 릴레이션(relation)에서 지정된 룰에서 잘못된 재귀호출이 발견되었습니다" +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:17995 #, 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 " @@ -8584,7 +9489,7 @@ msgstr "" "구체화된 뷰의 하나 또는 하나 이상의 칼럼에 대한 WHERE 절 없는 고유 인덱스를 " "만드세요." -#: commands/matview.c:641 +#: commands/matview.c:653 #, c-format msgid "" "new data for materialized view \"%s\" contains duplicate rows without any " @@ -8593,230 +9498,234 @@ msgstr "" "\"%s\" 구체화된 뷰의 새 자료에 아무런 null 칼럼 없이 중복된 로우를 포함하고 " "있습니다" -#: commands/matview.c:643 +#: commands/matview.c:655 #, 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:267 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "\"%s\" 연산자 패밀리가 이미 있음, 해당 접근 방법: \"%s\"" -#: commands/opclasscmds.c:414 +#: commands/opclasscmds.c:416 #, 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:493 commands/opclasscmds.c:910 +#: commands/opclasscmds.c:1056 #, 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:538 commands/opclasscmds.c:960 +#: commands/opclasscmds.c:1072 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "잘못된 함수 번호: %d, 타당한 번호는 1부터 %d까지 입니다" -#: commands/opclasscmds.c:559 +#: commands/opclasscmds.c:567 #, c-format msgid "storage type specified more than once" msgstr "저장 방법이 중복되었습니다" -#: commands/opclasscmds.c:586 +#: commands/opclasscmds.c:594 #, c-format msgid "" "storage type cannot be different from data type for access method \"%s\"" msgstr "스토리지 자료형은 \"%s\" 접근 방법의 자료형과 같아야 합니다." -#: commands/opclasscmds.c:602 +#: commands/opclasscmds.c:610 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "\"%s\" 연산자 클래스에는 이미 \"%s\" 액세스 방법이 사용되고 있습니다" -#: commands/opclasscmds.c:630 +#: commands/opclasscmds.c:638 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "\"%s\" 연산자 클래스를 %s 자료형의 기본값으로 지정할 수 없습니다" -#: commands/opclasscmds.c:633 +#: commands/opclasscmds.c:641 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "\"%s\" 연산자 클래스는 이미 기본 연산자 클래스입니다" -#: commands/opclasscmds.c:761 +#: commands/opclasscmds.c:801 #, c-format msgid "must be superuser to create an operator family" msgstr "슈퍼유저만 연산자 패밀리를 만들 수 있음" -#: commands/opclasscmds.c:821 +#: commands/opclasscmds.c:861 #, c-format msgid "must be superuser to alter an operator family" msgstr "슈퍼유저만 연산자 패밀리를 변경할 수 있음" -#: commands/opclasscmds.c:878 +#: commands/opclasscmds.c:919 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "연산자 인자 형식이 ALTER OPERATOR FAMILY에 지정되어 있어야 함" -#: commands/opclasscmds.c:941 +#: commands/opclasscmds.c:994 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "ALTER OPERATOR FAMILY에서 STORAGE를 지정할 수 없음" -#: commands/opclasscmds.c:1063 +#: commands/opclasscmds.c:1128 #, c-format msgid "one or two argument types must be specified" msgstr "한두 개의 인자 형식을 지정해야 함" -#: commands/opclasscmds.c:1089 +#: commands/opclasscmds.c:1154 #, c-format msgid "index operators must be binary" msgstr "인덱스 연산자는 바이너리여야 함" -#: commands/opclasscmds.c:1108 +#: commands/opclasscmds.c:1173 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "\"%s\" 접근 방법은 정렬 작업을 지원하지 않음" -#: commands/opclasscmds.c:1119 +#: commands/opclasscmds.c:1184 #, c-format msgid "index search operators must return boolean" msgstr "인덱스 검색 연산자는 부울형을 반환해야 함" -#: commands/opclasscmds.c:1159 +#: commands/opclasscmds.c:1224 #, 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:1231 #, 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:1239 #, c-format msgid "invalid operator class options parsing function" msgstr "잘못된 연산자 클래스 옵션 구문 분석 함수" -#: commands/opclasscmds.c:1175 +#: commands/opclasscmds.c:1240 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "바른 연산자 클래스 옵션 구문 분석 함수는 %s." -#: commands/opclasscmds.c:1194 +#: commands/opclasscmds.c:1259 #, c-format msgid "btree comparison functions must have two arguments" msgstr "btree 비교 함수는 두 개의 인자가 있어야 함" -#: commands/opclasscmds.c:1198 +#: commands/opclasscmds.c:1263 #, c-format msgid "btree comparison functions must return integer" msgstr "btree 비교 함수는 반드시 integer 자료형을 반환해야 함" -#: commands/opclasscmds.c:1215 +#: commands/opclasscmds.c:1280 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "" "btree 정렬 지원 함수는 반드시 \"internal\" 자료형 입력 인자로 사용해야함" -#: commands/opclasscmds.c:1219 +#: commands/opclasscmds.c:1284 #, c-format msgid "btree sort support functions must return void" msgstr "btree 정렬 지원 함수는 반드시 void 값을 반환해야 함" -#: commands/opclasscmds.c:1230 +#: commands/opclasscmds.c:1295 #, c-format msgid "btree in_range functions must have five arguments" msgstr "btree in_range 함수는 다섯개의 인자가 필요합니다" -#: commands/opclasscmds.c:1234 +#: commands/opclasscmds.c:1299 #, c-format msgid "btree in_range functions must return boolean" -msgstr "btree in_range 함수는 boolean 자료형을 반환해야합니다" +msgstr "btree in_range 함수는 boolean 자료형을 반환해야 합니다" -#: commands/opclasscmds.c:1250 +#: commands/opclasscmds.c:1315 #, c-format msgid "btree equal image functions must have one argument" msgstr "btree equal image 함수는 한 개의 인자가 필요합니다" -#: commands/opclasscmds.c:1254 +#: commands/opclasscmds.c:1319 #, c-format msgid "btree equal image functions must return boolean" -msgstr "btree equal image 함수는 boolean 자료형을 반환해야합니다" +msgstr "btree equal image 함수는 boolean 자료형을 반환해야 합니다" -#: commands/opclasscmds.c:1267 +#: commands/opclasscmds.c:1332 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "btree equal image 함수는 교차형(cross-type)이 아니여야 합니다" -#: commands/opclasscmds.c:1277 +#: commands/opclasscmds.c:1342 #, c-format msgid "hash function 1 must have one argument" msgstr "해시 함수는 1개의 인자만 지정할 수 있습니다" -#: commands/opclasscmds.c:1281 +#: commands/opclasscmds.c:1346 #, c-format msgid "hash function 1 must return integer" msgstr "해시 프로시저는 정수를 반환해야 함" -#: commands/opclasscmds.c:1288 +#: commands/opclasscmds.c:1353 #, c-format msgid "hash function 2 must have two arguments" msgstr "해시 함수 2는 2개의 인자만 지정할 수 있습니다" -#: commands/opclasscmds.c:1292 +#: commands/opclasscmds.c:1357 #, c-format msgid "hash function 2 must return bigint" msgstr "해시 함수 2는 bigint형을 반환해야 함" -#: commands/opclasscmds.c:1317 +#: commands/opclasscmds.c:1382 #, c-format msgid "associated data types must be specified for index support function" msgstr "인덱스 지원 함수에 대해 관련 데이터 형식을 지정해야 함" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1407 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "함수 번호 %d이(가) (%s,%s)에 대해 여러 번 표시됨" -#: commands/opclasscmds.c:1349 +#: commands/opclasscmds.c:1414 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "연산자 번호 %d이(가) (%s,%s)에 대해 여러 번 표시됨" -#: commands/opclasscmds.c:1398 +#: commands/opclasscmds.c:1460 #, 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:1566 #, 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:1647 #, 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:1687 #, 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:1718 #, c-format msgid "" "operator class \"%s\" for access method \"%s\" already exists in schema \"%s" @@ -8825,7 +9734,7 @@ msgstr "" "\"%s\" 연산자 클래스(\"%s\" 액세스 방법을 사용하는)는 이미 \"%s\" 스키마 안" "에 있습니다" -#: commands/opclasscmds.c:1799 +#: commands/opclasscmds.c:1741 #, c-format msgid "" "operator family \"%s\" for access method \"%s\" already exists in schema \"%s" @@ -8837,7 +9746,7 @@ msgstr "\"%s\" 연산자 패밀리(접근 방법: \"%s\")가 \"%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\" 연산자 속성을 처리할 수 없음" @@ -8847,388 +9756,547 @@ 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 "postfix 연산자는 지원하지 않습니다" -#: 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:381 commands/policy.c:471 -#: 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:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9144 commands/tablecmds.c:17082 +#: commands/tablecmds.c:17117 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 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 "USING 구문만 SELECT, DELETE 작업에 쓸 수 있음" -#: 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 "utility 명령문들은 미리 준비할 수 없습니다" - -#: 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 "prepared statement \"%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 "??? parameter $%d of type %s 는 expected type %s 로 강요할 수 없다" -#: commands/prepare.c:449 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "\"%s\" 이름의 준비된 명령문(prepared statement)이 이미 있습니다" -#: commands/prepare.c:488 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "\"%s\" 이름의 준비된 명령문(prepared statement) 없음" -#: 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:130 postmaster/postmaster.c:1219 +#: postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "\"publish\" 옵션의 목록 문법이 잘못됨" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "\"%s\" 매개 변수 구문이 잘못 되었습니다" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "알 수 없는 \"publish\" 값: \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "발행용 \"%s\" 옵션에서 쓸 수 없는 값: \"%s\"" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "인식할 수 없는 발행 매개 변수: \"%s\"" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "CURRENT_SCHEMA 용 실제 스키마 없음" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "시스템 칼럼은 허용하지 않음." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "사용자 정의 연산자는 허용하지 않음." + +#: commands/publicationcmds.c:554 +msgid "" +"Only columns, constants, built-in operators, built-in data types, built-in " +"collations, and immutable built-in functions are allowed." +msgstr "" +"칼럼, 상수, 내장 연산자, 내장 자료형, 내장 문자 정렬 규칙, 불변형 내장 함수만 " +"허용합니다." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "사용자 정의 자료형은 허용하지 않음." + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "사용자 정의나 내장 함수가 mutable 인 경우 허용하지 않음." + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "사용자 정의 문자 정렬 규칙은 허용하지 않음." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "잘못된 구독 WHERE 절 구문" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "\"%s\" 릴레이션용 구독 WHERE 절은 사용할 수 없음" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "%s 값이 false 일때, 파티션 된 테이블에서는 WHERE 절을 사용할 수 없음." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "\"%s.%s\" 릴레이션용 칼럼 목록을 사용할 수 없음(해당 구독: \"%s\")" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "" +"Column lists cannot be specified in publications containing FOR TABLES IN " +"SCHEMA elements." +msgstr "" +"FOR TABLES IN SCHEMA 구문을 이용해서 구독을 만들 때는 칼럼 목록을 지정할 수 " +"없습니다." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "" +"Column lists cannot be specified for partitioned tables when %s is false." +msgstr "" +"%s 값이 false 일때, 파티션 상위 테이블을 위한 칼럼 목록은 지정할 수 없습니다." + +#: commands/publicationcmds.c:760 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLES 옵션의 발행을 만드려면 슈퍼유저여야만 합니다" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "FOR TABLES IN SCHEMA 구문을 사용하는 구독은 슈퍼 유저만 쓸 수 있음" + +#: commands/publicationcmds.c:867 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "wal_level 수준이 논리 변경 사항 발행을 하기에는 부족합니다" -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:868 +#, c-format +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "wal_level 값을 \"logical\"로 바꾸고 구독을 만들세요" + +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "\"%s\" 매개 변수 값으로 false를 지정할 수 없음, 해당 구독: \"%s\"" + +#: commands/publicationcmds.c:967 +#, 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\" 값이 false 때는 이 조건을 허용하지 않습니다." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "" +"The publication contains a column list for partitioned table \"%s\", which " +"is not allowed when \"%s\" is false." +msgstr "" +"이 구독은 \"%s\" 파티션 상위테이블 대상 칼럼 목록을 포함하고 있습니다. " +"\"%s\" 값이 false 때는 이런 사용을 허용하지 않습니다." + +#: commands/publicationcmds.c:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "\"%s\" 구독에 스키마는 추가 할 수 없음" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "" +"Schemas cannot be added if any tables that specify a column list are already " +"part of the publication." +msgstr "" +"이미 해당 발행에 한 부분으로 어떤 테이블의 칼럼 목록을 사용하고 있다면, " +"그 테이블이 있는 그 스키마는 스키마 단위로 발행에 추가 할 수 없습니다." + +#: commands/publicationcmds.c:1348 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "wal_level 값을 logical로 바꾸고 구독을 만들세요" +msgid "must be superuser to add or set schemas" +msgstr "스키마 지정은 슈퍼유져여야 합니다" -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "\"%s\" 발행은 FOR ALL TABLES 옵션으로 정의되어 있습니다." -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "" +"FOR ALL TABLES 발행에 스키마를 추가하거나 뺄 수 없습니다." + +#: commands/publicationcmds.c:1367 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "" "FOR ALL TABLES 발행에 새 테이블을 추가하거나 한 테이블을 뺄 수 없습니다." -#: commands/publicationcmds.c:683 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "\"%s\" 테이블 용 WHERE 절이 충돌나거나, 중복되었음" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "\"%s\" 테이블 용 칼럼 목록이 충돌나거나, 중복되었음" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "ALTER PUBLICATION ... DROP 구문에서는 칼럼 목록을 지정하지 말아야함" + +#: commands/publicationcmds.c:1814 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "\"%s\" 릴레이션은 해당 발행에 포함되어 있지 않습니다" -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "발행에서 테이블을 뺄 때, WHERE 절은 사용할 수 없습니다." + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "\"%s\" 스키마의 테이블들은 해당 발행에 포함되어 있지 않습니다" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "\"%s\" 발행의 소유주를 바꿀 권한이 없습니다" -#: commands/publicationcmds.c:728 +#: commands/publicationcmds.c:1926 #, 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/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR ALL TABLES IN SCHEMA 구독의 소유주는 슈퍼유저여야만 합니다" + +#: commands/schemacmds.c:105 commands/schemacmds.c:270 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "\"%s\" 스키마 이름이 적당하지 못합니다" -#: commands/schemacmds.c:106 commands/schemacmds.c:282 +#: commands/schemacmds.c:106 commands/schemacmds.c:271 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "" "\"pg_\" 문자로 시작하는 스키마는 시스템에서 사용하는 예약된 스키마입니다." -#: commands/schemacmds.c:120 +#: commands/schemacmds.c:130 #, c-format msgid "schema \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 스키마(schema)가 이미 있음, 건너뜀" -#: commands/seclabel.c:60 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "로드된 보안 라벨 제공자가 없음" -#: commands/seclabel.c:64 +#: commands/seclabel.c:135 #, c-format msgid "" "must specify provider when multiple security label providers have been loaded" msgstr "다중 보안 레이블 제공자가 로드 될 때 제공자를 지정해야 합니다." -#: commands/seclabel.c:82 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "\"%s\" 이름의 보안 라벨 제공자가 로드되어 있지 않음" -#: commands/sequence.c:140 +#: commands/seclabel.c:160 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "이 객체 형태는 보안 라벨을 지원하지 않음" + +#: commands/seclabel.c:193 #, c-format -msgid "unlogged sequences are not supported" -msgstr "로그를 남기지 않는 시퀀스는 지원하지 않음" +msgid "cannot set security label on relation \"%s\"" +msgstr "\"%s\" 릴레이션에 보안 라벨을 지정할 수 없음" -#: commands/sequence.c:709 +#: commands/sequence.c:755 #, 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:774 #, 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:892 #, 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:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "이 세션에는 lastval 값이 아직까지 지정되지 않았습니다" -#: commands/sequence.c:963 +#: commands/sequence.c:997 #, 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:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "잘못된 SEQUENCE NAME 시퀀스 옵션" -#: commands/sequence.c:1386 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "식별 칼럼에 쓸 자료형은 smallint, integer, bigint 자료형만 쓸 수 있음" -#: commands/sequence.c:1387 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "시퀀스에 쓸 자료형은 smallint, integer, bigint 자료형만 쓸 수 있음" -#: commands/sequence.c:1421 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT 값은 0(zero)이 될 수 없습니다" #: commands/sequence.c:1474 #, 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:1506 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) 값이 허용 범위 밖임, 해당 시퀀스 자료형: %s" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) 값이 허용 범위 밖임, 해당 시퀀스 자료형: %s" -#: commands/sequence.c:1525 +#: commands/sequence.c:1514 #, 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:1535 #, 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:1541 #, 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:1565 #, 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:1571 #, 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:1582 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) 값은 0(zero)보다 커야합니다" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) 값은 0(zero)보다 커야 합니다" -#: commands/sequence.c:1658 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "잘못된 OWNED BY 옵션" -#: commands/sequence.c:1659 +#: commands/sequence.c:1619 #, 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:1644 #, 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:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "시퀀스 및 이 시퀀스가 연결된 테이블의 소유주가 같아야 함" -#: commands/sequence.c:1695 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "시퀀스 및 이 시퀀스가 연결된 테이블이 같은 스키마에 있어야 함" -#: commands/sequence.c:1717 +#: commands/sequence.c:1678 #, 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:1679 commands/tablecmds.c:13870 +#: commands/tablecmds.c:16507 #, 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:1876 #, 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:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 통계정보 개체가 이미 있습니다, 건너뜀" -#: commands/statscmds.c:182 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "\"%s\" 이름의 통계정보 개체가 이미 있음" -#: commands/statscmds.c:204 commands/statscmds.c:210 +#: commands/statscmds.c:210 #, 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:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "시스템 칼럼에 대한 통계정보 개체 만들기는 지원하지 않습니다" -#: commands/statscmds.c:232 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, c-format msgid "" "column \"%s\" cannot be used in statistics because its type %s has no " @@ -9237,110 +10305,128 @@ msgstr "" "\"%s\" 칼럼은 사용자 통계정보 수집이 불가능합니다. %s 자료형은 기본 btree 연" "산자 클래스를 정의하지 않았습니다" -#: commands/statscmds.c:239 +#: commands/statscmds.c:325 #, 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:346 +#, c-format +msgid "" +"when building statistics on a single expression, statistics kinds may not be " +"specified" +msgstr "" +"단일 표현식으로 통계 정보를 만들 때, 통계 정보 종류는 지정할 수 없습니다." + +#: commands/statscmds.c:375 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "알 수 없는 통계정보 종류 \"%s\"" -#: commands/statscmds.c:254 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "확장된 통계정보는 두 개 이상의 칼럼이 필요합니다." -#: commands/statscmds.c:272 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "통계정보 정의에서 사용하는 칼럼이 중복되었습니다" -#: commands/statscmds.c:306 +#: commands/statscmds.c:457 #, 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:620 commands/tablecmds.c:8112 #, c-format msgid "statistics target %d is too low" msgstr "대상 통계값(%d)이 너무 낮습니다" -#: commands/statscmds.c:452 commands/tablecmds.c:7424 +#: commands/statscmds.c:628 commands/tablecmds.c:8120 #, c-format msgid "lowering statistics target to %d" msgstr "%d 값으로 대상 통계값을 낮춥니다" -#: commands/statscmds.c:475 +#: commands/statscmds.c:651 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "\"%s.%s\" 통계정보 개체 없음, 무시함" -#: commands/subscriptioncmds.c:181 +#: 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:195 commands/subscriptioncmds.c:201 -#: commands/subscriptioncmds.c:207 commands/subscriptioncmds.c:226 -#: commands/subscriptioncmds.c:232 +#: 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:239 commands/subscriptioncmds.c:245 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "%s 구독하려면, %s 설정이 필요함" -#: commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:433 #, c-format -msgid "publication name \"%s\" used more than once" -msgstr "\"%s\" 발행 이름이 여러 번 사용 됨" +msgid "could not receive list of publications from the publisher: %s" +msgstr "발행자에게서 발행 목록을 받을 수 없음: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "해당 발행자에게는 \"%s\" 이름의 발행은 없습니다" -#: commands/subscriptioncmds.c:351 +#: commands/subscriptioncmds.c:547 #, 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:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "발행 서버에 연결 할 수 없음: %s" -#: commands/subscriptioncmds.c:484 +#: commands/subscriptioncmds.c:717 #, 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:730 #, 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:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "구독 활성화를 위해서는 %s 설정은 할 수 없음" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:1086 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "슬롯 이름 없이는 구독을 활성화 할 수 없음" -#: commands/subscriptioncmds.c:763 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" @@ -9348,14 +10434,47 @@ msgstr "" "비활성화 상태인 구독에 대해서는 ALTER SUBSCRIPTION 명령으로 갱신할 수 없습니" "다" -#: commands/subscriptioncmds.c:764 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" -"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) 명령을 " -"사용하세요." +"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) 명령을 사용" +"하세요." + +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, c-format +msgid "" +"ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " +"is enabled" +msgstr "" +"two_phase 값이 true인 상태에서는 ALTER SUBSCRIPTION 명령에서 refresh나 copy_data " +"옵션을 사용할 수 없습니다." + +#: commands/subscriptioncmds.c:1140 +#, c-format +msgid "" +"Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " +"copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" +"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH 다음 refresh = false 또는 " +"copy_data = false 구문을 추가하거나 DROP/CREATE SUBSCRIPTION 작업을 하세요." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +msgid "Use %s instead." +msgstr "대신에 %s 명령을 사용하십시오." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "" +"Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " +"SUBSCRIPTION." +msgstr "%s 명령에서 refresh = false 또는 copy_data = false 옵션을 추가하거나, " +"DROP/CREATE SUBSCRIPTION 작업을 하세요." -#: commands/subscriptioncmds.c:782 +#: commands/subscriptioncmds.c:1218 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" @@ -9363,212 +10482,264 @@ msgstr "" "비활성화 상태인 구독에 대해서는 ALTER SUBSCRIPTION ... REFRESH 명령을 허용하" "지 않습니다." -#: commands/subscriptioncmds.c:862 +#: commands/subscriptioncmds.c:1243 #, 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 값이 true인 상태에서는 ALTER SUBSCRIPTION 명령에서 copy_data " +"옵션을 사용할 수 없습니다." -#: commands/subscriptioncmds.c:987 +#: commands/subscriptioncmds.c:1244 #, c-format msgid "" -"could not connect to publisher when attempting to drop the replication slot " -"\"%s\"" -msgstr "\"%s\" 복제 슬롯을 삭제하는 중에는 발행 서버로 접속할 수 없음" +"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:989 commands/subscriptioncmds.c:1004 -#: replication/logical/tablesync.c:906 replication/logical/tablesync.c:928 +#: commands/subscriptioncmds.c:1263 #, 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:991 +#: commands/subscriptioncmds.c:1283 #, 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:1002 +#: commands/subscriptioncmds.c:1363 #, 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:1007 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "발행에서 \"%s\" 복제 슬롯을 삭제했음" -#: commands/subscriptioncmds.c:1044 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "발행용 \"%s\" 복제 슬롯을 삭제 할 수 없음: %s" + +#: commands/subscriptioncmds.c:1672 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "\"%s\" 구독 소유주를 변경할 권한이 없음" -#: commands/subscriptioncmds.c:1046 +#: commands/subscriptioncmds.c:1674 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "구독 소유주는 슈퍼유저여야 합니다." -#: commands/subscriptioncmds.c:1161 +#: commands/subscriptioncmds.c:1788 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "구독에서 복제 테이블 목록을 구할 수 없음: %s" +msgstr "해당 발행자로부터 복제 테이블 목록을 구할 수 없음: %s" + +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 +#: replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "" +"cannot use different column lists for table \"%s.%s\" in different " +"publications" +msgstr "" +"서로 다른 발행에서 \"%s.%s\" 테이블에 대한 서로 다른 칼럼 목록을 사용할 수 없음." + +#: commands/subscriptioncmds.c:1860 +#, 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:1863 +#, c-format +msgid "Use %s to disassociate the subscription from the slot." +msgstr "구독과 슬롯을 분리할 때는 %s 명령을 사용하세요." + +#: commands/subscriptioncmds.c:1893 +#, c-format +msgid "publication name \"%s\" used more than once" +msgstr "\"%s\" 발행 이름이 여러 번 사용 됨" + +#: commands/subscriptioncmds.c:1937 +#, c-format +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "\"%s\" 이름의 발행이 \"%s\" 구독 안에 이미 있습니다" + +#: commands/subscriptioncmds.c:1951 +#, c-format +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "\"%s\" 발행이 \"%s\" 구독 안에 없습니다" + +#: commands/subscriptioncmds.c:1962 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "한 구독안에 있는 모든 발행은 지울 수 없음" -#: commands/tablecmds.c:228 commands/tablecmds.c:270 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "\"%s\" 테이블 없음" -#: commands/tablecmds.c:229 commands/tablecmds.c:271 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "\"%s\" 테이블 없음, 무시함" -#: commands/tablecmds.c:231 commands/tablecmds.c:273 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "테이블을 삭제하려면, DROP TABLE 명령을 사용하세요." -#: commands/tablecmds.c:234 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "\"%s\" 시퀀스 없음" -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "\"%s\" 시퀀스 없음, 무시함" -#: commands/tablecmds.c:237 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "시퀀스를 삭제하려면 DROP SEQUENCE 명령을 사용하세요." -#: commands/tablecmds.c:240 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "\"%s\" 뷰(view) 없음" -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "\"%s\" 뷰(view) 없음, 무시함" -#: commands/tablecmds.c:243 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "뷰를 삭제하려면, DROP VIEW 명령을 사용하세요." -#: commands/tablecmds.c:246 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "\"%s\" 이름의 구체화된 뷰가 없음" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "\"%s\" 구체화된 뷰 없음, 건너뜀" -#: commands/tablecmds.c:249 +#: commands/tablecmds.c:266 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:269 commands/tablecmds.c:293 commands/tablecmds.c:19005 +#: parser/parse_utilcmd.c:2263 #, c-format msgid "index \"%s\" does not exist" msgstr "\"%s\" 인덱스 없음" -#: commands/tablecmds.c:253 commands/tablecmds.c:277 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "\"%s\" 인덱스 없음, 무시함" -#: commands/tablecmds.c:255 commands/tablecmds.c:279 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "인덱스를 삭제하려면, DROP INDEX 명령을 사용하세요." -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" 개체는 자료형이 아님" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:278 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:281 commands/tablecmds.c:13709 +#: commands/tablecmds.c:16210 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "\"%s\" 외부 테이블 없음" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "\"%s\" 외부 테이블 없음, 건너뜀" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "외부 테이블을 삭제하려면, DROP FOREIGN TABLE 명령을 사용하세요." -#: commands/tablecmds.c:620 +#: commands/tablecmds.c:697 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT 옵션은 임시 테이블에서만 사용될 수 있습니다" -#: commands/tablecmds.c:651 +#: commands/tablecmds.c:728 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "보안 제한 작업 내에서 임시 테이블을 만들 수 없음" -#: commands/tablecmds.c:687 commands/tablecmds.c:13742 +#: commands/tablecmds.c:764 commands/tablecmds.c:15017 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "\"%s\" 테이블이 여러 번 상속됨" -#: commands/tablecmds.c:868 +#: commands/tablecmds.c:949 #, c-format msgid "" "specifying a table access method is not supported on a partitioned table" msgstr "테이블 접근 방법은 파티션된 테이블에서는 사용할 수 없음" -#: commands/tablecmds.c:964 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" 파티션 된 테이블 아님" -#: commands/tablecmds.c:1058 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d개보다 많은 칼럼을 이용해서 파티션할 수 없음" -#: commands/tablecmds.c:1114 +#: commands/tablecmds.c:1193 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "\"%s\" 파티션된 테이블의 외부 파티션을 만들 수 없음" -#: commands/tablecmds.c:1116 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "\"%s\" 테이블은 유니크 인덱스를 포함 하고 있음." -#: commands/tablecmds.c:1279 +#: commands/tablecmds.c:1358 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY 명령은 하나의 인덱스만 지울 수 있습니다" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY 명령에서는 CASCADE 옵션을 사용할 수 없음" -#: commands/tablecmds.c:1384 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" -msgstr "\"%s\" 파티션된 테이블의 인덱스에 대해서는 CONCURRENTLY 옵션을 사용할 수 없음" +msgstr "" +"\"%s\" 파티션된 테이블의 인덱스에 대해서는 CONCURRENTLY 옵션을 사용할 수 없음" -#: commands/tablecmds.c:1654 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "파티션 된 테이블만 truncate 할 수 없음" -#: commands/tablecmds.c:1655 +#: commands/tablecmds.c:1755 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -9577,33 +10748,38 @@ msgstr "" "ONLY 옵션을 빼고 사용하거나, 하위 파티션 테이블을 대상으로 직접 TRUNCATE " "ONLY 명령을 사용하세요." -#: commands/tablecmds.c:1724 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "\"%s\" 개체의 자료도 함께 삭제됨" -#: commands/tablecmds.c:2031 +#: commands/tablecmds.c:2177 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "\"%s\" 외부 테이블에 자료를 비울 수 없음" + +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "다른 세션의 임시 테이블 자료는 비울(truncate) 수 없습니다" -#: commands/tablecmds.c:2259 commands/tablecmds.c:13639 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14914 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "\"%s\" 파티션 된 테이블로부터 상속할 수 없습니다" -#: commands/tablecmds.c:2264 +#: commands/tablecmds.c:2467 #, 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:2475 parser/parse_utilcmd.c:2493 +#: parser/parse_utilcmd.c:2635 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "상속할 \"%s\" 릴레이션(relation)은 테이블도, 외부 테이블도 아닙니다" -#: commands/tablecmds.c:2284 +#: commands/tablecmds.c:2487 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -9611,148 +10787,159 @@ msgstr "" "\"%s\" 테이블은 일반 테이블입니다. 임시 테이블을 이것의 파티션 테이블로 만들 " "수 없습니다" -#: commands/tablecmds.c:2293 commands/tablecmds.c:13618 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14893 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "\"%s\" 임시 테이블입니다, 그래서 상속 대상이 될 수 없습니다" -#: commands/tablecmds.c:2303 commands/tablecmds.c:13626 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14901 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "다른 세션의 임시 테이블입니다, 그래서 상속 대상이 될 수 없습니다" -#: commands/tablecmds.c:2357 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "\"%s\" 칼럼이 중복되어 상속됩니다." -#: commands/tablecmds.c:2365 +#: commands/tablecmds.c:2568 #, 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:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 +#: 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:2579 #, 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:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" 형과 \"%s\" 형" -#: commands/tablecmds.c:2388 +#: commands/tablecmds.c:2591 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "상속 받은 \"%s\" 칼럼의 스토리지 설정값에서 충돌합니다" -#: commands/tablecmds.c:2404 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "\"%s\" 칼럼의 압축 방법이 충돌합니다" + +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" -msgstr "" +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:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12433 parser/parse_utilcmd.c:1304 +#: parser/parse_utilcmd.c:1347 parser/parse_utilcmd.c:1756 +#: parser/parse_utilcmd.c:1864 #, c-format msgid "cannot convert whole-row table reference" msgstr "전체 로우 테이블 참조형으로 변환할 수 없음" -#: commands/tablecmds.c:2491 parser/parse_utilcmd.c:1253 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1305 #, c-format msgid "" "Generation expression for column \"%s\" contains a whole-row reference to " "table \"%s\"." -msgstr "\"%s\" 칼럼용 미리 계산된 칼럼 생성식에 \"%s\" 테이블 전체 로우 참조가 있습니다" +msgstr "" +"\"%s\" 칼럼용 미리 계산된 칼럼 생성식에 \"%s\" 테이블 전체 로우 참조가 있습니" +"다" -#: commands/tablecmds.c:2546 parser/parse_utilcmd.c:1296 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1348 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "\"%s\" 제약조건에 \"%s\" 테이블 전체 로우 참조가 있습니다" -#: commands/tablecmds.c:2625 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "\"%s\" 칼럼을 상속된 정의와 병합하는 중" -#: commands/tablecmds.c:2629 +#: commands/tablecmds.c:2856 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "\"%s\" 칼럼을 상속된 정의와 이동, 병합하는 중" -#: commands/tablecmds.c:2630 +#: commands/tablecmds.c:2857 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "사용자 지정 칼럼이 상속된 칼럼의 위치로 이동되었습니다" -#: commands/tablecmds.c:2637 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "\"%s\" 칼럼의 자료형이 충돌합니다" -#: commands/tablecmds.c:2649 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "\"%s\" 칼럼의 정렬규칙이 충돌합니다" -#: commands/tablecmds.c:2667 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "\"%s\" 칼럼의 스토리지 설정값이 충돌합니다" -#: commands/tablecmds.c:2695 +#: commands/tablecmds.c:2935 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "" "\"%s\" 칼럼은 상속 받은 칼럼임. 미리 계산된 칼럼의 생성식을 사용할 수 없음" -#: commands/tablecmds.c:2697 +#: commands/tablecmds.c:2937 #, 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:2941 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "상속 받은 \"%s\" 칼럼은 미리 계산된 칼럼인데, 기본값이 설정되어 있음" -#: commands/tablecmds.c:2706 +#: commands/tablecmds.c:2946 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "상속 받은 \"%s\" 칼럼은 미리 계산된 칼럼인데, 일련번호 식별 옵션이 있음" +msgstr "" +"상속 받은 \"%s\" 칼럼은 미리 계산된 칼럼인데, 일련번호 식별 옵션이 있음" -#: commands/tablecmds.c:2815 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "" -"상속 받는 \"%s\" 칼럼에 지정된 미리 계산된 생성식이 충돌함" -"다" +msgstr "상속 받는 \"%s\" 칼럼에 지정된 미리 계산된 생성식이 충돌함다" -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "상속 받는 \"%s\" 칼럼의 default 값이 충돌함" -#: commands/tablecmds.c:2822 +#: commands/tablecmds.c:3062 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "이 충돌을 피하려면, default 값을 바르게 지정하십시오." -#: commands/tablecmds.c:2868 +#: commands/tablecmds.c:3108 #, c-format msgid "" "check constraint name \"%s\" appears multiple times but with different " @@ -9760,101 +10947,109 @@ msgid "" msgstr "" "\"%s\" 체크 제약 조건 이름이 여러 번 나타나지만, 각각 다른 식으로 되어있음" -#: commands/tablecmds.c:3045 +#: commands/tablecmds.c:3321 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "다른 세션의 임시 테이블들은 이동할 수 없습니다" + +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "칼럼 이름을 바꿀 수 없음" -#: commands/tablecmds.c:3064 +#: commands/tablecmds.c:3410 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, composite type, index, or " -"foreign table" +msgid "cannot rename columns of relation \"%s\"" msgstr "" -"\"%s\" 개체는 테이블도, 뷰도, 구체화된 뷰도, 복합 자료형도, 인덱스도, 외부 테" -"이블도 아닙니다." +"\"%s\" 릴레이션의 칼럼 이름을 바꿀 수 없음" -#: commands/tablecmds.c:3158 +#: commands/tablecmds.c:3505 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "하위 테이블에서도 상속된 \"%s\" 칼럼의 이름을 바꾸어야 함" -#: commands/tablecmds.c:3190 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "\"%s\" 이름의 칼럼은 시스템 칼럼입니다, 이름을 바꿀 수 없습니다" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "\"%s\" 이름의 칼럼은 상속 받은 칼럼입니다, 이름을 바꿀 수 없습니다" -#: commands/tablecmds.c:3357 +#: commands/tablecmds.c:3704 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "하위 테이블에서도 상속된 \"%s\" 제약조건은 하위 테이블에서도 이름이 바뀌어야 " "함" -#: commands/tablecmds.c:3364 +#: commands/tablecmds.c:3711 #, 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:4008 #, 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:4017 #, 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:4486 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "\"%s\" 파티션 테이블은 불완전한 detach 상태이기에 alter 작업을 할 수 없음" + +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "로그 사용/미사용 옵션을 중복 해서 지정했음" -#: commands/tablecmds.c:4969 +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "파티션 된 테이블의 접근 방법은 바꿀 수 없음" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "다중 SET ACCESS METHOD 구문은 사용할 수 없음" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "\"%s\" 시스템 릴레이션을 다시 쓰기(rewrite) 할 수 없음" -#: commands/tablecmds.c:4975 +#: commands/tablecmds.c:5482 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "카탈로그 테이블로 사용되어 \"%s\" 테이블을 rewrite 못함" -#: commands/tablecmds.c:4985 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "다른 세션의 임시 테이블을 다시 쓰기(rewrite) 할 수 없음" -#: 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:5986 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "\"%s\" 열(해당 릴레이션 \"%s\")의 자료 가운데 null 값이 있습니다" -#: commands/tablecmds.c:5460 +#: commands/tablecmds.c:6003 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" -msgstr "\"%s\" 체크 제약 조건(해당 릴레이션 \"%s\")을 위반하는 몇몇 자료가 있습니다" +msgstr "" +"\"%s\" 체크 제약 조건(해당 릴레이션 \"%s\")을 위반하는 몇몇 자료가 있습니다" -#: commands/tablecmds.c:5479 partitioning/partbounds.c:3235 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -9862,311 +11057,280 @@ msgid "" msgstr "" "몇몇 자료가 \"%s\" 기본 파티션용에서 변경된 파티션 제약조건을 위배한 것 같음" -#: commands/tablecmds.c:5485 +#: commands/tablecmds.c:6028 #, 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 -#, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "\"%s\" 개체는 테이블, 뷰, 외부 테이블 그 어느 것도 아닙니다" - -#: commands/tablecmds.c:5635 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\" 개체는 테이블, 뷰, 구체화된 뷰, 인덱스 그 어느 것도 아닙니다" - -#: commands/tablecmds.c:5641 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" 개체는 테이블, 구체화된 뷰, 인덱스 그 어느 것도 아닙니다" - -#: commands/tablecmds.c:5644 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\" 개체는 테이블, 구체화된 뷰, 외부 테이블 그 어느 것도 아닙니다." - -#: commands/tablecmds.c:5647 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" 개체는 테이블도 외부 테이블도 아닙니다" - -#: commands/tablecmds.c:5650 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" 개체는 테이블, 복합 자료형, 외부 테이블 그 어느 것도 아닙니다." - -#: commands/tablecmds.c:5653 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "" -"\"%s\" 개체는 테이블, 구체화된 뷰, 인덱스, 외부 테이블 그 어느 것도 아닙니다." - -#: commands/tablecmds.c:5663 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "\"%s\" 개체는 잘못된 개체형입니다." +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "%s ALTER 작업은 \"%s\" 릴레이션 대상으로 수행할 수 없음" -#: commands/tablecmds.c:5866 commands/tablecmds.c:5873 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "\"%s\" 자료형 변경할 수 없음(\"%s.%s\" 칼럼에서 해당 형식을 사용함)" -#: commands/tablecmds.c:5880 +#: commands/tablecmds.c:6564 #, 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:6571 #, 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:6627 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "" "\"%s\" 자료형을 변경할 수 없음, 이 자료형은 typed 테이블의 자료형이기 때문" -#: commands/tablecmds.c:5945 +#: commands/tablecmds.c:6629 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "이 개체와 관계된 모든 개체들을 함께 변경하려면 ALTER ... CASCADE 명령을 사용" "하십시오" -#: commands/tablecmds.c:5991 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "%s 자료형은 복합 자료형이 아닙니다" -#: commands/tablecmds.c:6018 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "typed 테이블에는 칼럼을 추가 할 수 없음" -#: commands/tablecmds.c:6069 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "파티션 테이블에는 칼럼을 추가 할 수 없습니다" -#: commands/tablecmds.c:6098 commands/tablecmds.c:13869 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15144 #, 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:6790 commands/tablecmds.c:15151 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "\"%s\" 상속된 테이블의 \"%s\" 칼럼 정렬규칙이 상위 테이블의 정렬규칙과 틀립니" "다" -#: commands/tablecmds.c:6118 +#: commands/tablecmds.c:6804 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "\"%s\" 열(\"%s\" 하위)의 정의를 병합하는 중" -#: commands/tablecmds.c:6161 +#: commands/tablecmds.c:6847 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "하위 테이블에 재귀적으로 식별 칼럼을 추가할 수는 없음" -#: commands/tablecmds.c:6398 +#: commands/tablecmds.c:7091 #, c-format msgid "column must be added to child tables too" msgstr "하위 테이블에도 칼럼을 추가해야 함" -#: commands/tablecmds.c:6476 +#: commands/tablecmds.c:7169 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "\"%s\" 이름의 칼럼이 \"%s\" 릴레이션에 이미 있습니다, 건너뜀" -#: commands/tablecmds.c:6483 +#: commands/tablecmds.c:7176 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "\"%s\" 이름의 칼럼은 \"%s\" 릴레이션에 이미 있습니다" -#: commands/tablecmds.c:6549 commands/tablecmds.c:10826 +#: commands/tablecmds.c:7242 commands/tablecmds.c:12072 #, 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:7243 commands/tablecmds.c:7560 +#: commands/tablecmds.c:8557 commands/tablecmds.c:12073 #, 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:7280 commands/tablecmds.c:7486 +#: commands/tablecmds.c:7628 commands/tablecmds.c:7742 +#: commands/tablecmds.c:7836 commands/tablecmds.c:7895 +#: commands/tablecmds.c:8014 commands/tablecmds.c:8153 +#: commands/tablecmds.c:8223 commands/tablecmds.c:8379 +#: commands/tablecmds.c:12227 commands/tablecmds.c:13732 +#: commands/tablecmds.c:16301 #, c-format msgid "cannot alter system column \"%s\"" msgstr "\"%s\" 칼럼은 시스템 칼럼입니다. 그래서 변경될 수 없습니다" -#: commands/tablecmds.c:6593 commands/tablecmds.c:6928 +#: commands/tablecmds.c:7286 commands/tablecmds.c:7634 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "\"%s\" 칼럼(해당 테이블: \"%s\")은 식별 칼럼입니다." -#: commands/tablecmds.c:6629 +#: commands/tablecmds.c:7329 #, c-format msgid "column \"%s\" is in a primary key" msgstr "\"%s\" 칼럼은 기본키 칼럼입니다" -#: commands/tablecmds.c:6651 +#: commands/tablecmds.c:7334 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "\"%s\" 칼럼 대상 인덱스는 복제 식별자로 사용 됨" + +#: commands/tablecmds.c:7357 #, 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:7557 commands/tablecmds.c:9040 #, c-format msgid "constraint must be added to child tables too" msgstr "하위 테이블에도 제약 조건을 추가해야 함" -#: commands/tablecmds.c:6852 +#: commands/tablecmds.c:7558 #, 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 "" - -#: commands/tablecmds.c:6930 +#: commands/tablecmds.c:7636 #, 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:7641 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "\"%s\" 칼럼(해당 테이블: \"%s\")은 계산된 칼럼입니다." -#: commands/tablecmds.c:6938 +#: commands/tablecmds.c:7644 #, 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:7753 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " "can be added" msgstr "" -"식별자 옵션을 사용하려면, \"%s\" 칼럼(해당 릴레이션: \"%s\")에 NOT NULL " -"옵션이 있어야 합니다." +"식별자 옵션을 사용하려면, \"%s\" 칼럼(해당 릴레이션: \"%s\")에 NOT NULL 옵션" +"이 있어야 합니다." -#: commands/tablecmds.c:7053 +#: commands/tablecmds.c:7759 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "\"%s\" 이름의 칼럼(해당 릴레이션: \"%s\")은 이미 식별 칼럼입니다" -#: commands/tablecmds.c:7059 +#: commands/tablecmds.c:7765 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "\"%s\" 이름의 칼럼(해당 릴레이션: \"%s\")은 이미 default 입니다" -#: commands/tablecmds.c:7136 commands/tablecmds.c:7197 +#: commands/tablecmds.c:7842 commands/tablecmds.c:7903 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "\"%s\" 이름의 칼럼(해당 릴레이션: \"%s\")은 식별 칼럼이 아닙니다" -#: commands/tablecmds.c:7202 +#: commands/tablecmds.c:7908 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "\"%s\" 이름의 칼럼(해당 릴레이션: \"%s\")은 식별 칼럼이 아님, 건너뜀" -#: commands/tablecmds.c:7261 +#: commands/tablecmds.c:7961 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION 작업은 하위 테이블에도 적용되어야함" + +#: commands/tablecmds.c:7983 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "상속 받은 칼럼에서는 미리 계산된 표현식을 못 없앰" -#: commands/tablecmds.c:7299 +#: commands/tablecmds.c:8022 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "\"%s\" 칼럼(해당 릴레이션: \"%s\")은 미리 계산된 칼럼이 아님" -#: commands/tablecmds.c:7304 +#: commands/tablecmds.c:8027 #, 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:8100 #, c-format msgid "cannot refer to non-index column by number" -msgstr "" +msgstr "숫자로 인덱스 사용하지 않는 칼럼을 참조할 수 없음" -#: commands/tablecmds.c:7447 +#: commands/tablecmds.c:8143 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "%d번째 칼럼이 없습니다. 해당 릴레이션: \"%s\"" -#: commands/tablecmds.c:7466 +#: commands/tablecmds.c:8162 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "" "\"%s\" 포함된 칼럼 (해당 인덱스: \"%s\") 관련 통계정보를 수정할 수 없음" -#: commands/tablecmds.c:7471 +#: commands/tablecmds.c:8167 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "\"%s\" 비표현식 칼럼 (해당 인덱스: \"%s\") 관련 통계정보를 수정할 수 없음" -#: commands/tablecmds.c:7473 +#: commands/tablecmds.c:8169 #, c-format msgid "Alter statistics on table column instead." msgstr "대신에 테이블 칼럼 대상으로 통계정보를 수정하세요." -#: commands/tablecmds.c:7600 +#: commands/tablecmds.c:8359 #, c-format msgid "invalid storage type \"%s\"" msgstr "잘못된 STORAGE 값: \"%s\"" -#: commands/tablecmds.c:7632 +#: commands/tablecmds.c:8391 #, c-format msgid "column data type %s can only have storage PLAIN" -msgstr "%s 자료형의 column의 STORAGE 값은 반드시 PLAIN 이어야합니다" +msgstr "%s 자료형의 column의 STORAGE 값은 반드시 PLAIN 이어야 합니다" -#: commands/tablecmds.c:7714 +#: commands/tablecmds.c:8436 #, c-format msgid "cannot drop column from typed table" msgstr "typed 테이블에서 칼럼을 삭제할 수 없음" -#: commands/tablecmds.c:7773 +#: commands/tablecmds.c:8495 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "\"%s\" 칼럼은 \"%s\" 릴레이션에 없음, 건너뜀" -#: commands/tablecmds.c:7786 +#: commands/tablecmds.c:8508 #, c-format msgid "cannot drop system column \"%s\"" msgstr "\"%s\" 칼럼은 시스템 칼럼입니다, 삭제될 수 없습니다" -#: commands/tablecmds.c:7796 +#: commands/tablecmds.c:8518 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "\"%s\" 칼럼은 상속받은 칼럼입니다, 삭제될 수 없습니다" -#: commands/tablecmds.c:7809 +#: commands/tablecmds.c:8531 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -10174,14 +11338,14 @@ msgid "" msgstr "" "\"%s\" 칼럼은 \"%s\" 릴레이션의 파티션 키로 사용되고 있어 삭제 될 수 없음" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:8556 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" msgstr "" "파티션 테이블이 있는 파티션된 테이블에서 그 테이블만 칼럼을 삭제 할 수 없음" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:8760 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -10190,7 +11354,7 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX 작업은 파티션 된 테이블 대상으로는 " "지원하지 않음" -#: commands/tablecmds.c:8039 +#: commands/tablecmds.c:8785 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" @@ -10198,14 +11362,16 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX 작업은 \"%s\" 인덱스를 \"%s\" 이름으" "로 바꿀 것입니다." -#: commands/tablecmds.c:8373 +#: commands/tablecmds.c:9122 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " "relation \"%s\"" msgstr "" +"\"%s\" 파티션 상위 테이블의 참조키에는 ONLY 옵션을 사용할 수 없음. " +"이 테이블은 \"%s\" 릴레이션을 참조 함" -#: commands/tablecmds.c:8379 +#: commands/tablecmds.c:9128 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -10214,22 +11380,22 @@ msgstr "" "\"%s\" 파타션된 테이블에 NOT VALID 참조키를 추가할 수 없음 (참조 하는 테이" "블: \"%s\")" -#: commands/tablecmds.c:8382 +#: commands/tablecmds.c:9131 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "이 기능은 파티션 된 테이블 대상으로는 아직 지원하지 않습니다." -#: commands/tablecmds.c:8389 commands/tablecmds.c:8794 +#: commands/tablecmds.c:9138 commands/tablecmds.c:9604 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "참조된 \"%s\" 릴레이션은 테이블이 아닙니다" -#: commands/tablecmds.c:8412 +#: commands/tablecmds.c:9161 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "영구 저장용 테이블의 제약 조건은 영구 저장용 테이블을 참조 합니다." -#: commands/tablecmds.c:8419 +#: commands/tablecmds.c:9168 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -10238,132 +11404,154 @@ msgstr "" "unlogged 테이블의 제약 조건은 영구 저장용 테이블 또는 unlogged 테이블을 참조" "합니다." -#: commands/tablecmds.c:8425 +#: commands/tablecmds.c:9174 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "임시 테이블의 제약 조건은 임시 테이블에 대해서만 참조할 것입니다." -#: commands/tablecmds.c:8429 +#: commands/tablecmds.c:9178 #, 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:9252 commands/tablecmds.c:9258 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" msgstr "계산된 칼럼을 포함하는 참조키 제약조건용 %s 액션은 잘못 되었음" -#: commands/tablecmds.c:8517 +#: commands/tablecmds.c:9274 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "참조키(foreign key) disagree를 위한 참조하는, 또는 참조되는 열 수" -#: commands/tablecmds.c:8624 +#: commands/tablecmds.c:9381 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "\"%s\" 참조키(foreign key) 제약 조건은 구현되어질 수 없습니다" -#: commands/tablecmds.c:8626 +#: commands/tablecmds.c:9383 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "" "\"%s\" 열과 \"%s\" 열 인덱스는 함께 사용할 수 없는 자료형입니다: %s and %s." -#: commands/tablecmds.c:8989 commands/tablecmds.c:9382 -#: parser/parse_utilcmd.c:764 parser/parse_utilcmd.c:893 +#: commands/tablecmds.c:9540 +#, 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:9813 commands/tablecmds.c:10281 +#: parser/parse_utilcmd.c:798 parser/parse_utilcmd.c:927 #, 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:10833 commands/tablecmds.c:11111 +#: commands/tablecmds.c:12029 commands/tablecmds.c:12104 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "\"%s\" 제약 조건이 \"%s\" 릴레이션에 없습니다." -#: commands/tablecmds.c:9755 +#: commands/tablecmds.c:10840 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "\"%s\" 제약 조건(해당 테이블: \"%s\")은 참조키 제약조건이 아닙니다." -#: commands/tablecmds.c:9919 +#: commands/tablecmds.c:10878 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "\"%s\" 제약 조건(해당 테이블: \"%s\")을 변경할 수 없음" + +#: commands/tablecmds.c:10881 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "\"%s\" 제약 조건은 \"%s\" 제약 조건에서 파생되었음, 해당 릴레이션: \"%s\"" + +#: commands/tablecmds.c:10883 +#, c-format +msgid "You may alter the constraint it derives from, instead." +msgstr "대신에, 원 제약 조건을 변경 하세요." + +#: commands/tablecmds.c:11119 #, 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:11197 #, c-format msgid "constraint must be validated on child tables too" msgstr "하위 테이블에도 제약 조건이 유효해야 함" -#: commands/tablecmds.c:10081 +#: commands/tablecmds.c:11287 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "참조키(foreign key) 제약 조건에서 참조하는 \"%s\" 칼럼이 없음" -#: commands/tablecmds.c:10086 +#: commands/tablecmds.c:11293 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "시스템 칼럼은 참조키로 사용될 수 없음" + +#: commands/tablecmds.c:11297 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "참조키(foreign key)에서 %d 키 개수보다 많이 가질 수 없음" -#: commands/tablecmds.c:10151 +#: commands/tablecmds.c:11363 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "참조되는 \"%s\" 테이블의 지연 가능한 기본키를 사용할 수 없음" -#: commands/tablecmds.c:10168 +#: commands/tablecmds.c:11380 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "참조되는 \"%s\" 테이블에는 기본키(primary key)가 없습니다" -#: commands/tablecmds.c:10233 +#: commands/tablecmds.c:11445 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "참조키의 참조 칼럼 목록에 칼럼이 중복되면 안됩니다" -#: commands/tablecmds.c:10327 +#: commands/tablecmds.c:11539 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "참조되는 \"%s\" 테이블의 지연 가능한 유니크 제약 조건을 사용할 수 없음" -#: commands/tablecmds.c:10332 +#: commands/tablecmds.c:11544 #, 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:11985 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "상속된 \"%s\" 제약 조건(해당 테이블: \"%s\")을 삭제할 수 없음" -#: commands/tablecmds.c:10789 +#: commands/tablecmds.c:12035 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "\"%s\" 제약 조건(해당 테이블: \"%s\")이 없음, 건너뜀" -#: commands/tablecmds.c:10965 +#: commands/tablecmds.c:12211 #, c-format msgid "cannot alter column type of typed table" msgstr "typed 테이블의 칼럼 자료형은 변경할 수 없음" -#: commands/tablecmds.c:10992 +#: commands/tablecmds.c:12238 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "\"%s\" 이름의 칼럼은 상속 받은 칼럼입니다, 이름을 바꿀 수 없습니다" -#: commands/tablecmds.c:11001 +#: commands/tablecmds.c:12247 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -10372,7 +11560,7 @@ msgstr "" "\"%s\" 칼럼은 \"%s\" 테이블의 파티션 키 가운데 하나이기 때문에, alter 작업" "을 할 수 없음" -#: commands/tablecmds.c:11051 +#: commands/tablecmds.c:12297 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -10380,203 +11568,192 @@ msgid "" msgstr "" "\"%s\" 칼럼에서 쓰인 USING 절의 결과가 %s 자료형으로 자동 형변환을 할 수 없음" -#: commands/tablecmds.c:11054 +#: commands/tablecmds.c:12300 #, c-format msgid "You might need to add an explicit cast." msgstr "명시적 형변환을 해야할 것 같습니다." -#: commands/tablecmds.c:11058 +#: commands/tablecmds.c:12304 #, 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:12307 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "\"USING %s::%s\" 구문을 추가해야 할 것 같습니다." -#: commands/tablecmds.c:11161 +#: commands/tablecmds.c:12406 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "" "\"%s\" 칼럼은 \"%s\" 테이블의 상속된 칼럼이기에 alter 작업을 할 수 없음" -#: commands/tablecmds.c:11189 +#: commands/tablecmds.c:12434 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING 표현식에서 전체 로우 테이블 참조를 포함하고 있습니다." -#: commands/tablecmds.c:11200 +#: commands/tablecmds.c:12445 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "하위 테이블에서도 상속된 \"%s\" 칼럼의 형식을 바꾸어야 함" -#: commands/tablecmds.c:11325 +#: commands/tablecmds.c:12570 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "\"%s\" 칼럼은 시스템 칼럼입니다. 그래서 변경될 수 없습니다" -#: commands/tablecmds.c:11363 +#: commands/tablecmds.c:12608 #, 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:12613 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "\"%s\" 칼럼의 기본 값을 %s 형으로 형변환할 수 없음" -#: commands/tablecmds.c:11446 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "미리 계산된 칼럼의 자료형을 바꿀 수 없음" - -#: commands/tablecmds.c:11447 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "\"%s\" 칼럼은 미리 계산된 칼럼인 \"%s\"에서 사용되고 있음." - -#: commands/tablecmds.c:11468 +#: commands/tablecmds.c:12694 #, 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:12695 commands/tablecmds.c:12714 +#: commands/tablecmds.c:12732 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s 의존대상 열: \"%s\"" -#: commands/tablecmds.c:11487 +#: commands/tablecmds.c:12713 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "트리거 정의에서 사용하는 칼럼의 자료형을 변경할 수 없음" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:12731 #, 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:12762 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "미리 계산된 칼럼의 자료형을 바꿀 수 없음" + +#: commands/tablecmds.c:12763 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "\"%s\" 칼럼은 미리 계산된 칼럼인 \"%s\"에서 사용되고 있음." + +#: commands/tablecmds.c:13840 commands/tablecmds.c:13852 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "\"%s\" 인덱스의 소유주를 바꿀 수 없음" -#: commands/tablecmds.c:12516 commands/tablecmds.c:12528 +#: commands/tablecmds.c:13842 commands/tablecmds.c:13854 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "대신에 그 인덱스의 해당 테이블 소유자을 변경하세요." -#: commands/tablecmds.c:12542 +#: commands/tablecmds.c:13868 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "\"%s\" 시퀀스의 소유주를 바꿀 수 없음" -#: commands/tablecmds.c:12556 commands/tablecmds.c:15743 +#: commands/tablecmds.c:13882 commands/tablecmds.c:17193 +#: commands/tablecmds.c:17212 #, c-format msgid "Use ALTER TYPE instead." msgstr "대신 ALTER TYPE을 사용하십시오." -#: commands/tablecmds.c:12565 +#: commands/tablecmds.c:13891 #, 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:12905 +#: commands/tablecmds.c:14253 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACE 구문이 중복 사용되었습니다" -#: commands/tablecmds.c:12982 -#, 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 -#, c-format -msgid "WITH CHECK OPTION is supported only on automatically updatable views" -msgstr "" -"WITH CHECK OPTION 옵션은 자동 갱신 가능한 뷰에 대해서만 사용할 수 있습니다" - -#: commands/tablecmds.c:13155 +#: commands/tablecmds.c:14330 #, c-format -msgid "cannot move system relation \"%s\"" -msgstr "\"%s\" 시스템 릴레이션입니다. 이동할 수 없습니다" +msgid "cannot set options for relation \"%s\"" +msgstr "\"%s\" 릴레이션용 옵션을 지정할 수 없음" -#: commands/tablecmds.c:13171 +#: commands/tablecmds.c:14364 commands/view.c:521 #, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "다른 세션의 임시 테이블들은 이동할 수 없습니다" +msgid "WITH CHECK OPTION is supported only on automatically updatable views" +msgstr "" +"WITH CHECK OPTION 옵션은 자동 갱신 가능한 뷰에 대해서만 사용할 수 있습니다" -#: commands/tablecmds.c:13341 +#: commands/tablecmds.c:14614 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "테이블스페이스에 테이블과 인덱스와 구체화된 뷰만 있습니다." -#: commands/tablecmds.c:13353 +#: commands/tablecmds.c:14626 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "" "해당 개체를 pg_global 테이블스페이스로 옮기거나 그 반대로 작업할 수 없음" -#: commands/tablecmds.c:13445 +#: commands/tablecmds.c:14718 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "\"%s.%s\" 릴레이션을 잠글 수 없어 중지 중입니다" -#: commands/tablecmds.c:13461 +#: commands/tablecmds.c:14734 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "검색조건에 일치하는 릴레이션이 \"%s\" 테이블스페이스에 없음" -#: commands/tablecmds.c:13577 +#: commands/tablecmds.c:14852 #, c-format msgid "cannot change inheritance of typed table" msgstr "typed 테이블의 상속 정보는 변경할 수 없음" -#: commands/tablecmds.c:13582 commands/tablecmds.c:14078 +#: commands/tablecmds.c:14857 commands/tablecmds.c:15413 #, c-format msgid "cannot change inheritance of a partition" msgstr "파티션 테이블의 상속 정보는 바꿀 수 없음" -#: commands/tablecmds.c:13587 +#: commands/tablecmds.c:14862 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "파티션된 테이블의 상속 정보는 바꿀 수 없음" -#: commands/tablecmds.c:13633 +#: commands/tablecmds.c:14908 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "다른 세션의 임시 테이블을 상속할 수 없음" -#: commands/tablecmds.c:13646 +#: commands/tablecmds.c:14921 #, c-format msgid "cannot inherit from a partition" msgstr "파티션 테이블에서 상속 할 수 없음" -#: commands/tablecmds.c:13668 commands/tablecmds.c:16383 +#: commands/tablecmds.c:14943 commands/tablecmds.c:17846 #, c-format msgid "circular inheritance not allowed" msgstr "순환 되는 상속은 허용하지 않습니다" -#: commands/tablecmds.c:13669 commands/tablecmds.c:16384 +#: commands/tablecmds.c:14944 commands/tablecmds.c:17847 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" 개체는 이미 \"%s\" 개체로부터 상속받은 상태입니다." -#: commands/tablecmds.c:13682 +#: commands/tablecmds.c:14957 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "\"%s\" 트리거(해당 테이블 \"%s\")은 하위테이블 상속과 관련되어 보호되고 있습" "니다." -#: commands/tablecmds.c:13684 +#: commands/tablecmds.c:14959 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -10584,22 +11761,32 @@ msgid "" msgstr "" "transition 테이블의 ROW 트리거들은 계층적 상속 테이블에서는 지원하지 않음" -#: commands/tablecmds.c:13887 +#: commands/tablecmds.c:15162 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" -msgstr "자식 테이블의 \"%s\" 칼럼은 NOT NULL 속성이 있어야합니다" +msgstr "자식 테이블의 \"%s\" 칼럼은 NOT NULL 속성이 있어야 합니다" -#: commands/tablecmds.c:13914 +#: commands/tablecmds.c:15171 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "자식 테이블의 \"%s\" 칼럼은 미리 계산된 칼럼이어야 함" + +#: commands/tablecmds.c:15221 +#, c-format +msgid "column \"%s\" in child table has a conflicting generation expression" +msgstr "자식 테이블의 \"%s\" 칼럼에 지정된 미리 계산된 생성식이 충돌합니다" + +#: commands/tablecmds.c:15249 #, c-format msgid "child table is missing column \"%s\"" msgstr "자식 테이블에는 \"%s\" 칼럼이 없습니다" -#: commands/tablecmds.c:14002 +#: commands/tablecmds.c:15337 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "\"%s\" 하위 테이블에 \"%s\" 체크 제약 조건에 대한 다른 정의가 있음" -#: commands/tablecmds.c:14010 +#: commands/tablecmds.c:15345 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s" @@ -10607,85 +11794,86 @@ msgid "" msgstr "" "\"%s\" 제약 조건이 \"%s\" 하위 테이블에 있는 비 상속 제약 조건과 충돌합니다" -#: commands/tablecmds.c:14021 +#: commands/tablecmds.c:15356 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "" "\"%s\" 제약 조건이 \"%s\" 하위 테이블에 있는 NOT VALID 제약 조건과 충돌합니다" -#: commands/tablecmds.c:14056 +#: commands/tablecmds.c:15391 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "자식 테이블에 \"%s\" 제약 조건이 없습니다" -#: commands/tablecmds.c:14145 +#: commands/tablecmds.c:15477 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "" +"\"%s\" 하위 파티션과 \"%s.%s\" 상위 파티션 테이블과 분리 작업을 " +"이미 진행, 지연 되고 있습니다." + +#: commands/tablecmds.c:15506 commands/tablecmds.c:15554 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "\"%s\" 릴레이션은 \"%s\" 릴레이션의 파티션이 아닙니다" -#: commands/tablecmds.c:14151 +#: commands/tablecmds.c:15560 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "\"%s\" 릴레이션은 \"%s\" 릴레이션의 부모가 아닙니다" -#: commands/tablecmds.c:14379 +#: commands/tablecmds.c:15788 #, c-format msgid "typed tables cannot inherit" msgstr "typed 테이블은 상속할 수 없음" -#: commands/tablecmds.c:14409 +#: commands/tablecmds.c:15818 #, c-format msgid "table is missing column \"%s\"" msgstr "테이블에는 \"%s\" 칼럼이 없습니다" -#: commands/tablecmds.c:14420 +#: commands/tablecmds.c:15829 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "\"%s\" 칼럼은 \"%s\" 자료형입니다." -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:15838 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "\"%s\" 테이블의 \"%s\" 칼럼 자료형 틀립니다" -#: commands/tablecmds.c:14443 +#: commands/tablecmds.c:15852 #, c-format msgid "table has extra column \"%s\"" msgstr "\"%s\" 칼럼은 확장형입니다" -#: commands/tablecmds.c:14495 +#: commands/tablecmds.c:15904 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" 테이블은 typed 테이블이 아닙니다" -#: commands/tablecmds.c:14677 +#: commands/tablecmds.c:16078 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "\"%s\" 인덱스는 유니크 인덱스가 아니여서, 복제 식별자로 사용할 수 없음" -#: commands/tablecmds.c:14683 +#: commands/tablecmds.c:16084 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "\"%s\" non-immediate 인덱스는 복제 식별자로 사용할 수 없음" -#: commands/tablecmds.c:14689 +#: commands/tablecmds.c:16090 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "\"%s\" 인덱스는 expression 인덱스여서, 복제 식별자로 사용할 수 없음" -#: commands/tablecmds.c:14695 +#: commands/tablecmds.c:16096 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "\"%s\" 인덱스가 부분인덱스여서, 복제 식별자로 사용할 수 없음" -#: commands/tablecmds.c:14701 -#, c-format -msgid "cannot use invalid index \"%s\" as replica identity" -msgstr "" -"\"%s\" 인덱스는 사용할 수 없는 인덱스여서, 복제 식별자로 사용할 수 없음" - -#: commands/tablecmds.c:14718 +#: commands/tablecmds.c:16113 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -10693,7 +11881,7 @@ msgid "" msgstr "" "\"%s\" 인덱스는 복제 식별자로 사용할 수 없음, %d 번째 칼럼이 시스템 칼럼임" -#: commands/tablecmds.c:14725 +#: commands/tablecmds.c:16120 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -10702,23 +11890,23 @@ msgstr "" "\"%s\" 인덱스는 복제 식별자로 사용할 수 없음, \"%s\" 칼럼이 null 값 사용가능 " "속성임" -#: commands/tablecmds.c:14918 +#: commands/tablecmds.c:16367 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "\"%s\" 테이블은 임시 테이블이기에, 통계 정보를 변경 할 수 없음" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:16391 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "\"%s\" 테이블은 발생에 사용하고 있어, unlogged 속성으로 바꿀 수 없음" -#: commands/tablecmds.c:14944 +#: commands/tablecmds.c:16393 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "unlogged 릴레이션 복제할 수 없습니다." -#: commands/tablecmds.c:14989 +#: commands/tablecmds.c:16438 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -10727,7 +11915,7 @@ msgstr "" "\"%s\" 테이블이 \"%s\" unlogged 테이블을 참조하고 있어 logged 속성으로 바꿀 " "수 없음" -#: commands/tablecmds.c:14999 +#: commands/tablecmds.c:16448 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -10736,581 +11924,645 @@ msgstr "" "\"%s\" 테이블이 \"%s\" logged 테이블을 참조하고 있어 unlogged 속성으로 바꿀 " "수 없음" -#: commands/tablecmds.c:15057 +#: commands/tablecmds.c:16506 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "소유된 시퀀스를 다른 스키마로 이동할 수 없음" -#: commands/tablecmds.c:15163 +#: commands/tablecmds.c:16613 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 릴레이션이 \"%s\" 스키마에 이미 있습니다" -#: commands/tablecmds.c:15726 +#: commands/tablecmds.c:17026 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" 개체는 테이블도 구체화된 뷰도 아닙니다" + +#: commands/tablecmds.c:17176 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" 개체는 복합 자료형입니다" -#: commands/tablecmds.c:15758 +#: commands/tablecmds.c:17204 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "" -"\"%s\" 개체는 테이블, 뷰, 구체화된 뷰, 시퀀스, 외부 테이블 그 어느 것도 아닙" -"니다" +msgid "cannot change schema of index \"%s\"" +msgstr "\"%s\" 인덱스의 스키마를 바꿀 수 없음" + +#: commands/tablecmds.c:17206 commands/tablecmds.c:17218 +#, c-format +msgid "Change the schema of the table instead." +msgstr "대신에 그 인덱스의 해당 테이블 스키마를 변경하세요." + +#: commands/tablecmds.c:17210 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "\"%s\" 복합 자료형의 스키마를 바꿀 수 없음" + +#: commands/tablecmds.c:17216 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "\"%s\" TOAST 테이블의 스키마를 바꿀 수 없음" -#: commands/tablecmds.c:15793 +#: commands/tablecmds.c:17253 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "알 수 없는 파티션 규칙 \"%s\"" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:17261 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "둘 이상의 칼럼을 사용할 \"list\" 파티션은 사용할 수 없습니다" -#: commands/tablecmds.c:15867 +#: commands/tablecmds.c:17327 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "\"%s\" 칼럼이 파티션 키로 사용되고 있지 않습니다" -#: commands/tablecmds.c:15875 +#: commands/tablecmds.c:17335 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "\"%s\" 칼럼은 시스템 칼럼입니다. 그래서 파티션 키로 사용될 수 없습니다" -#: commands/tablecmds.c:15886 commands/tablecmds.c:16000 +#: commands/tablecmds.c:17346 commands/tablecmds.c:17460 #, 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:17347 commands/tablecmds.c:17461 commands/trigger.c:668 +#: rewrite/rewriteHandler.c:927 rewrite/rewriteHandler.c:962 #, c-format msgid "Column \"%s\" is a generated column." msgstr "\"%s\" 칼럼은 미리 계산된 칼럼입니다." -#: commands/tablecmds.c:15963 +#: commands/tablecmds.c:17423 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "파티션 키로 사용할 함수는 IMMUTABLE 특성이 있어야합니다" +msgstr "파티션 키로 사용할 함수는 IMMUTABLE 특성이 있어야 합니다" -#: commands/tablecmds.c:15983 +#: commands/tablecmds.c:17443 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "파티션 키 표현식에서는 시스템 칼럼 참조를 포함할 수 없습니다" -#: commands/tablecmds.c:16013 +#: commands/tablecmds.c:17473 #, c-format msgid "cannot use constant expression as partition key" msgstr "파티션 키로 상수는 쓸 수 없습니다" -#: commands/tablecmds.c:16034 +#: commands/tablecmds.c:17494 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "파티션 표현식에 쓸 문자 정렬 규칙을 결정할 수 없습니다" -#: commands/tablecmds.c:16069 +#: commands/tablecmds.c:17529 #, 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:17535 #, 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 "" - -#: 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 "" +"를 정의해 두어야 합니다" -#: commands/tablecmds.c:16323 +#: commands/tablecmds.c:17786 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" 이름의 파티션 테이블이 이미 있습니다" -#: commands/tablecmds.c:16329 +#: commands/tablecmds.c:17792 #, c-format msgid "cannot attach a typed table as partition" msgstr "파티션 테이블로 typed 테이블을 추가할 수 없음" -#: commands/tablecmds.c:16345 +#: commands/tablecmds.c:17808 #, c-format msgid "cannot attach inheritance child as partition" msgstr "파티션 테이블로 상속을 이용한 하위 테이블을 추가할 수 없음" -#: commands/tablecmds.c:16359 +#: commands/tablecmds.c:17822 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "파티션 테이블로 상속용 상위 테이블을 추가할 수 없음" -#: commands/tablecmds.c:16393 +#: commands/tablecmds.c:17856 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "" "\"%s\" 테이블은 일반 테이블입니다, 임시 파티션 테이블을 추가할 수 없습니다" -#: commands/tablecmds.c:16401 +#: commands/tablecmds.c:17864 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "" "\"%s\" 테이블은 임시 테이블입니다, 일반 파티션 테이블을 추가할 수 없습니다" -#: commands/tablecmds.c:16409 +#: commands/tablecmds.c:17872 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "다른 세션의 임시 테이블을 파티션 테이블로 추가할 수 없습니다" -#: commands/tablecmds.c:16416 +#: commands/tablecmds.c:17879 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "다른 세션의 임시 테이블을 파티션 테이블로 추가할 수 없습니다" -#: commands/tablecmds.c:16436 +#: commands/tablecmds.c:17899 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "\"%s\" 테이블의 \"%s\" 칼럼이 상위 테이블인 \"%s\"에 없음" -#: commands/tablecmds.c:16439 +#: commands/tablecmds.c:17902 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "새 파티션 테이블은 상위 테이블의 칼럼과 동일해야 합니다." -#: commands/tablecmds.c:16451 +#: commands/tablecmds.c:17914 #, 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:17916 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" +msgid "ROW triggers with transition tables are not supported on partitions." msgstr "" -"ROW 트리거들이 있는 테이블을 파티션 테이블로 포함하는 기능은 지원하지 않습니" -"다" +"transition 테이블의 ROW 트리거들은 파티션 하위 테이블에서는 쓸 수 없습니다." -#: commands/tablecmds.c:16616 +#: commands/tablecmds.c:18095 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "\"%s\" 외부 테이블을 파티션된 \"%s\" 테이블의 부분으로 추가 할 수 없음" -#: commands/tablecmds.c:16619 +#: commands/tablecmds.c:18098 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "\"%s\" 파티션 상위 테이블에 유니크 인덱스가 있습니다." + +#: commands/tablecmds.c:18409 #, 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:18518 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "\"%s\" 파티션 상위 테이블이 온라인 모드로 삭제 되었음" + +#: commands/tablecmds.c:18524 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "\"%s\" 파티션 하위 테이블이 온라인 모드로 삭제 되었음" + +#: commands/tablecmds.c:19039 commands/tablecmds.c:19059 +#: commands/tablecmds.c:19079 commands/tablecmds.c:19098 +#: commands/tablecmds.c:19140 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "\"%s\" 인덱스를 \"%s\" 인덱스의 파티션으로 추가할 수 없음" -#: commands/tablecmds.c:17268 +#: commands/tablecmds.c:19042 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "\"%s\" 인덱스는 이미 다른 인덱스에 추가되어 있음." -#: commands/tablecmds.c:17288 +#: commands/tablecmds.c:19062 #, 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:19082 #, c-format msgid "The index definitions do not match." msgstr "인덱스 정의가 일치하지 않습니다." -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:19101 #, 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:19143 #, 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:1373 storage/file/copydir.c:47 +#: commands/tablecmds.c:19373 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 만들 수 없음: %m" +msgid "column data type %s does not support compression" +msgstr "%s 형의 칼럼 자료형은 압축을 지원하지 않음" -#: commands/tablespace.c:209 +#: commands/tablecmds.c:19380 #, c-format -msgid "could not stat directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 상태를 파악할 수 없음: %m" +msgid "invalid compression method \"%s\"" +msgstr "잘못된 압축 방법: \"%s\"" -#: commands/tablespace.c:218 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" 파일이 존재하지만 디렉터리가 아닙니다" -#: commands/tablespace.c:249 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "\"%s\" 테이블스페이스를 만들 권한이 없습니다" -#: commands/tablespace.c:251 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "테이블스페이스는 슈퍼유저만 만들 수 있습니다." -#: commands/tablespace.c:267 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "테이블스페이스 위치에는 작은 따옴표를 사용할 수 없음" -#: commands/tablespace.c:277 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" -msgstr "테이블스페이스 경로는 절대경로여야합니다" +msgstr "테이블스페이스 경로는 절대경로여야 합니다" -#: commands/tablespace.c:289 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "테이블스페이스 경로가 너무 깁니다: \"%s\"" -#: commands/tablespace.c:296 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "테이블스페이스 경로는 데이터 디렉터리 안에 있으면 안됩니다" -#: commands/tablespace.c:305 commands/tablespace.c:965 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "\"%s\" 테이블스페이스 이름은 적당치 않습니다" -#: commands/tablespace.c:307 commands/tablespace.c:966 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "\"pg_\" 문자로 시작하는 테이블스페이스는 시스템 테이블스페이스입니다." -#: commands/tablespace.c:326 commands/tablespace.c:987 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, 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:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때 pg_tablespace OID 값이 지정되지 않음" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "\"%s\" 테이블스페이스 없음" -#: commands/tablespace.c:448 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "\"%s\" 테이블스페이스 없음, 건너 뜀" -#: commands/tablespace.c:525 +#: commands/tablespace.c:473 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "몇 객체들이 의존관계를 가져 \"%s\" 테이블스페이스를 삭제할 수 없음" + +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "\"%s\" 테이블스페이스는 비어있지 않음" -#: commands/tablespace.c:597 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "\"%s\" 디렉터리 없음" -#: commands/tablespace.c:598 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "이 서버를 재시작하기 전에 이 테이블스페이스 용 디렉터리를 만드세요." -#: commands/tablespace.c:603 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "\"%s\" 디렉터리 액세스 권한을 지정할 수 없음: %m" -#: commands/tablespace.c:633 +#: commands/tablespace.c:670 #, 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:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 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:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "\"%s\" 심벌릭 링크를 삭제할 수 없음: %m" -#: commands/tablespace.c:829 commands/tablespace.c:916 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" 디렉터리도, 심볼릭 링크도 아님" -#: commands/tablespace.c:1111 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "\"%s\" 테이블스페이스 없음" -#: commands/tablespace.c:1554 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "%u OID 테이블스페이스용 디렉터리는 삭제될 수 없음" -#: commands/tablespace.c:1556 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "필요하다면 OS 작업으로 그 디레터리를 삭제하세요" -#: commands/trigger.c:204 commands/trigger.c:215 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" -msgstr "\"%s\" 개체는 테이블입니다." +msgstr "\"%s\" 개체는 테이블임" -#: commands/trigger.c:206 commands/trigger.c:217 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "테이블에 INSTEAD OF 트리거는 설정할 수 없음" -#: commands/trigger.c:238 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" -msgstr "\"%s\" 개체는 파티션된 테이블임" +msgstr "\"%s\" 개체는 파티션 상위 테이블임" -#: commands/trigger.c:240 +#: commands/trigger.c:266 #, c-format -msgid "Triggers on partitioned tables cannot have transition tables." -msgstr "파티션된 테이블에 지정된 트리거는 전달 테이블을 가질 수 없음." +msgid "" +"ROW triggers with transition tables are not supported on partitioned tables." +msgstr "" +"transition 테이블의 ROW 트리거들은 파티션 상위 테이블에서 지원하지 않음." -#: commands/trigger.c:252 commands/trigger.c:259 commands/trigger.c:429 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" -msgstr "\"%s\" 개체는 뷰입니다." +msgstr "\"%s\" 개체는 뷰임" -#: commands/trigger.c:254 +#: commands/trigger.c:280 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "뷰에 로우 단위 BEFORE, AFTER 트리거는 설정할 수 없음" -#: commands/trigger.c:261 +#: commands/trigger.c:287 #, 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:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" -msgstr "\"%s\" 개체는 외부 테이블입니다." +msgstr "\"%s\" 개체는 외부 테이블임" -#: commands/trigger.c:271 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "외부테이블에 INSTEAD OF 트리거는 설정할 수 없음" -#: commands/trigger.c:278 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "외부 테이블에는 TRUNCATE 트리거를 사용할 수 없음" -#: commands/trigger.c:290 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "외부 테이블에 제약 조건 트리거는 설정할 수 없음" -#: commands/trigger.c:365 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "\"%s\" 릴레이션에는 트리거를 지정할 수 없음" + +#: commands/trigger.c:392 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW 트리거는 지원되지 않음" -#: commands/trigger.c:373 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF 트리거는 FOR EACH ROW 옵션으로 설정해야 함" -#: commands/trigger.c:377 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF 트리거는 WHEN 조건을 사용할 수 없음" -#: commands/trigger.c:381 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF 트리거는 칼럼 목록을 사용할 수 없음" -#: commands/trigger.c:410 +#: commands/trigger.c:437 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" -msgstr "" +msgstr "REFERENCING 절에 ROW 변수 이름 붙이기를 지원하지 않습니다." -#: commands/trigger.c:411 +#: commands/trigger.c:438 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." -msgstr "" +msgstr "이름 기반 전환 테이블은 OLD TABLE 또는 NEW TABLE 을 사용하세요." -#: commands/trigger.c:424 +#: commands/trigger.c:451 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "외부 테이블의 트리거들은 전환 테이블을 가질 수 없음." -#: commands/trigger.c:431 +#: commands/trigger.c:458 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "뷰에 정의한 트리거들은 전환 테이블을 가질 수 없음." -#: commands/trigger.c:451 +#: commands/trigger.c:474 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "" +"ROW 트리거들이 있는 테이블을 파티션 테이블로 포함하는 기능은 지원하지 않습니" +"다" + +#: commands/trigger.c:478 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" msgstr "" +"전환 테이블용 ROW 트리거는 하위 상속 테이블에서는 지정할 수 없습니다." -#: commands/trigger.c:457 +#: commands/trigger.c:484 #, c-format msgid "transition table name can only be specified for an AFTER trigger" -msgstr "" +msgstr "전환 테이블 이름은 AFTER 트리거에서만 사용할 수 있습니다." -#: commands/trigger.c:462 +#: commands/trigger.c:489 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "전환 테이블에서 TRUNCATE 트리거는 지원하지 않습니다" -#: commands/trigger.c:479 +#: commands/trigger.c:506 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" msgstr "전환 테이블은 하나 이상의 이벤트에 대한 트리거를 지정할 수 없습니다" -#: commands/trigger.c:490 +#: commands/trigger.c:517 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "전환 테이블은 칼럼 목록들에 대한 트리거를 지정할 수 없습니다" -#: commands/trigger.c:507 +#: commands/trigger.c:534 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" -msgstr "" +msgstr "NEW TABLE 옵션은 INSERT 또는 UPDATE 트리거에서만 사용할 수 있습니다." -#: commands/trigger.c:512 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" -msgstr "" +msgstr "NEW TABLE 옵션은 중복해서 사용할 수 없음" -#: commands/trigger.c:522 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" -msgstr "" +msgstr "OLD TABLE 옵션은 DELETE 또는 UPDATE 트리거에서만 사용할 수 있습니다." -#: commands/trigger.c:527 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" -msgstr "" +msgstr "OLD TABLE 옵션은 중복해서 사용할 수 없음" -#: commands/trigger.c:537 +#: commands/trigger.c:564 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" -msgstr "" +msgstr "OLD TABLE 과 NEW TABLE 뒤에 오는 이름이 같을 수는 없습니다." -#: commands/trigger.c:601 commands/trigger.c:614 +#: commands/trigger.c:628 commands/trigger.c:641 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "트리거의 WHEN 조건에는 칼럼 값을 참조할 수는 없음" -#: commands/trigger.c:606 +#: commands/trigger.c:633 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT 트리거에서의 WHEN 조건에는 OLD 값을 참조할 수 없음" -#: commands/trigger.c:619 +#: commands/trigger.c:646 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE 트리거에서의 WHEN 조건에는 NEW 값을 참조할 수 없음" -#: commands/trigger.c:624 +#: commands/trigger.c:651 #, 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:659 commands/trigger.c:667 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "WHEN 조건절이 있는 BEFORE 트리거는 NEW 미리 계산된 칼럼을 참조할 수 없음" -#: commands/trigger.c:633 +#: commands/trigger.c:660 #, c-format msgid "A whole-row reference is used and the table contains generated columns." -msgstr "" +msgstr "로우 전체 참조가 사용되었고, 그 테이블에는 미리 계산된 칼럼이 있습니다." -#: commands/trigger.c:780 commands/trigger.c:1385 +#: commands/trigger.c:775 commands/trigger.c:1653 #, 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:788 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "\"%s\" 트리거가 \"%s\" 테이블에 내장 또는 하위 트리거로 있음" + +#: commands/trigger.c:807 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr " \"%s\" 트리거가 \"%s\" 릴레이션에 제약 조건 트리거로 있음" + +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" 트리거는 \"%s\" 테이블에 없음" -#: commands/trigger.c:1515 +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "\"%s\" 트리거(해당 테이블: \"%s\") 이름을 바꿀 수 없음" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "대신에 상위 파티션 테이블인 \"%s\" 테이블의 트리거 이름을 바꾸세요." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "\"%s\" 트리거(해당 테이블: \"%s\") 이름을 바꿨음" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "액세스 권한 없음: \"%s\" 개체는 시스템 트리거임" -#: commands/trigger.c:2116 +#: commands/trigger.c:2449 #, 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:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3346 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENT 트리거는 리턴값이 있으면 안됩니다" -#: commands/trigger.c:2250 +#: commands/trigger.c:2585 #, 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:2586 #, 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 "" - -#: commands/trigger.c:2996 executor/nodeModifyTable.c:1380 -#: executor/nodeModifyTable.c:1449 +#: commands/trigger.c:3423 executor/nodeModifyTable.c:2338 +#: executor/nodeModifyTable.c:2421 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -11318,9 +12570,9 @@ msgid "" msgstr "" "현재 명령으로 실행된 트리거 작업으로 변경해야할 자료가 이미 바뀌었습니다." -#: commands/trigger.c:2997 executor/nodeModifyTable.c:840 -#: executor/nodeModifyTable.c:914 executor/nodeModifyTable.c:1381 -#: executor/nodeModifyTable.c:1450 +#: commands/trigger.c:3424 executor/nodeModifyTable.c:1504 +#: executor/nodeModifyTable.c:1578 executor/nodeModifyTable.c:2339 +#: executor/nodeModifyTable.c:2422 executor/nodeModifyTable.c:3052 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -11329,334 +12581,361 @@ 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:3465 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1520 executor/nodeModifyTable.c:2356 +#: executor/nodeModifyTable.c:2564 #, 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:3473 executor/nodeModifyTable.c:1610 +#: executor/nodeModifyTable.c:2439 executor/nodeModifyTable.c:2588 +#: executor/nodeModifyTable.c:2940 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "동시 삭제 작업 때문에 순차적 액세스가 불가능합니다" -#: commands/trigger.c:5094 +#: commands/trigger.c:4649 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "보안 제한 작업 내에서는 지연 속성 트리거를 실행할 수 없음" + +#: commands/trigger.c:5832 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "\"%s\" 제약 조건은 DEFERRABLE 속성으로 만들어지지 않았습니다" -#: commands/trigger.c:5117 +#: commands/trigger.c:5855 #, 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 "" +"쉘 타입으로 그 자료형을 만들고, 그것을 쓰기 위한 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 "잘못된 ALIGNMENT 값: \"%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 "잘못된 STORAGE 값: \"%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 "" +"요소 자료형은 하위요소 지정 함수(subscripting function) 없이 정의" +"할 수 없음" + +#: 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 "default 표현식 여러개 있음" -#: 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 "exclusion 제약 조건은 도메인에는 사용할 수 없음" -#: 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 "참조키(foreign key) 제약 조건은 도메인(domain) 정의에 사용할 수 없음" -#: 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 "range subtype은 %s 아니여야 함" -#: commands/typecmds.c:1426 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "range 형에 정렬 규칙을 지정했지만, 소속 자료형이 그 정렬 규칙을 지원하지 않습" "니다" -#: commands/typecmds.c:1436 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "미리 만들어진 쉘 타입 없는 canonical 함수를 지정할 수 없음" -#: 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 "" +"먼저 쉘 타입 자료형을 만들고, canonical 함수를 만든 다음 " +"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 자료형을 반환해야합니다" +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 특성이 없어야합니다" +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 자료형을 반환해야합니다" +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 특성이 없어야합니다" +msgstr "%s 자료형 출력 함수는 volatile 특성이 없어야 합니다" -#: commands/typecmds.c:1746 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "%s 자료형 receive 함수가 여러 개 있습니다" -#: commands/typecmds.c:1764 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" -msgstr "%s 자료형 receive 함수는 %s 자료형을 반환해야합니다" +msgstr "%s 자료형 receive 함수는 %s 자료형을 반환해야 합니다" -#: commands/typecmds.c:1771 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" -msgstr "%s 자료형 수신 함수는 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 자료형을 반환해야합니다" +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 특성이 없어야합니다" +msgstr "%s 자료형 송신 함수는 volatile 특성이 없어야 합니다" -#: commands/typecmds.c:1833 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "%s typmod_in 함수는 %s 자료형을 반환해야 함" -#: commands/typecmds.c:1840 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" -msgstr "%s 자료형 형변환 입력 함수는 volatile 특성이 없어야합니다" +msgstr "%s 자료형 형변환 입력 함수는 volatile 특성이 없어야 합니다" -#: commands/typecmds.c:1867 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "%s typmod_out 함수는 %s 자료형을 반환해야 함" -#: commands/typecmds.c:1874 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" -msgstr "%s 자료형 형변환 출력 함수는 volatile 특성이 없어야합니다" +msgstr "%s 자료형 형변환 출력 함수는 volatile 특성이 없어야 합니다" -#: commands/typecmds.c:1901 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "%s 자료형 분석 함수는 %s 자료형을 반환해야 함" -#: commands/typecmds.c:1947 +#: commands/typecmds.c:2248 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "%s subscripting 함수의 반환값 자료형은 %s 형이어야 함" + +#: commands/typecmds.c:2258 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "사용자 정의 자료형은 %s subscripting 함수에서 쓸 수 없음" + +#: commands/typecmds.c:2304 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -11665,52 +12944,62 @@ msgstr "" "subtype을 위한 기본 연산자 클래스나 range 자료형을 위한 하나의 연산자 클래스" "를 지정해야 합니다" -#: commands/typecmds.c:1978 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" -msgstr "%s 범위 기준 함수는 range 자료형을 반환해야합니다" +msgstr "%s 범위 기준 함수는 range 자료형을 반환해야 합니다" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "%s 범위 기준 함수는 immutable 속성이어야 합니다" -#: commands/typecmds.c:2020 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" -msgstr "%s 범위 하위 자료 비교 함수는 %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 범위 하위 자료 비교 함수는 immutable 속성이어야 합니다" -#: 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 multirange OID 값이 지정되지 않았습니다" + +#: commands/typecmds.c:2477 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때 pg_type multirange 배열 OID 값이 지정되지 않았습니다" + +#: commands/typecmds.c:2776 #, 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:2889 commands/typecmds.c:3091 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "\"%s\" 제약 조건 \"%s\" 도메인에 포함되어 있지 않습니다." -#: commands/typecmds.c:2469 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "\"%s\" 제약 조건 \"%s\" 도메인에 포함되어 있지 않음, 건너뜀" -#: commands/typecmds.c:2674 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "\"%s\" 제약 조건(해당 도메인: \"%s\")은 check 제약조건이 아님" -#: commands/typecmds.c:2780 +#: commands/typecmds.c:3204 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" @@ -11718,346 +13007,378 @@ msgstr "" "\"%s\" 열(해당 테이블 \"%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 "\"%s\" 제약 조건이 \"%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 자료형은 테이블의 행 자료형(row type)입니다" -#: 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 -#: utils/adt/acl.c:5327 utils/adt/acl.c:5333 gram.y:15146 gram.y:15184 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 +#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:16437 gram.y:16483 #, 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:524 commands/user.c:838 +msgid "Cannot alter reserved roles." +msgstr "예약된 롤은 수정할 수 없습니다." + +#: 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 "슈퍼유저 롤 수정 또는 슈퍼유저 속성 바꾸기는 슈퍼유저만 할 수 있음" + +#: commands/user.c:645 +#, c-format +msgid "" +"must be superuser to alter replication roles or change replication attribute" +msgstr "" +"복제 슬롯 롤 수정 또는 복제 속성 바꾸기는 슈퍼유저만 할 수 있습니다." -#: 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:675 +#: 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\" 롤(role) 없음" -#: commands/user.c:1043 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "\"%s\" 룰(rule) 없음, 건너 뜀" -#: 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 "superuser를 사용자를 삭제하려면 superuser여야만 합니다" -#: 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 "superuser의 이름을 바꾸려면 superuser여야 합니다" -#: 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 옵션이 있어야 함" -#: 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 "grantor(?)를 지정하려면 슈퍼유져여야합니다" +msgstr "grantor를 지정하려면 슈퍼유져여야 합니다" + +#: commands/user.c:1468 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "\"%s\" 롤은 다른 롤의 맴버가 될 수 없음" -#: commands/user.c:1535 +#: 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 "role \"%s\" is already a member of role \"%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:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "알 수 없는 ANALYZE 옵션: \"%s\"" -#: commands/vacuum.c:151 +#: commands/vacuum.c:178 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "병렬 옵션은 0부터 %d까지 값만 사용할 수 있음" -#: commands/vacuum.c:163 +#: commands/vacuum.c:190 #, 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:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "알 수 없는 VACUUM 옵션 \"%s\"" -#: commands/vacuum.c:203 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" -msgstr "" +msgstr "VACUUM FULL 작업은 병렬로 처리할 수 없음" -#: commands/vacuum.c:219 +#: commands/vacuum.c:246 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "ANALYZE 옵션은 칼럼 목록이 제공될 때 사용할 수 있습니다" -#: commands/vacuum.c:309 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s 명령은 VACUUM, ANALYZE 명령에서 실행 될 수 없음" -#: commands/vacuum.c:319 +#: commands/vacuum.c:346 #, 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:353 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULL 작업은 PROCESS_TOAST 옵션이 포함되어야 함" + +#: commands/vacuum.c:587 #, c-format msgid "skipping \"%s\" --- only superuser can vacuum it" msgstr "\"%s\" 건너뜀 --- 슈퍼유저만 청소할 수 있음" -#: commands/vacuum.c:564 +#: commands/vacuum.c:591 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" msgstr "\"%s\" 건너뜀 --- 슈퍼유저 또는 데이터베이스 소유주만 청소할 수 있음" -#: commands/vacuum.c:568 +#: commands/vacuum.c:595 #, c-format msgid "skipping \"%s\" --- only table or database owner can vacuum it" msgstr "\"%s\" 건너뜀 --- 이 테이블이나 데이터베이스의 소유주만 청소할 수 있음" -#: commands/vacuum.c:583 +#: commands/vacuum.c:610 #, c-format msgid "skipping \"%s\" --- only superuser can analyze it" msgstr "\"%s\" 분석 건너뜀 --- 슈퍼유저만 분석할 수 있음" -#: commands/vacuum.c:587 +#: commands/vacuum.c:614 #, c-format msgid "skipping \"%s\" --- only superuser or database owner can analyze it" msgstr "" "\"%s\" 분석 건너뜀 --- 슈퍼유저 또는 데이터베이스 소유주만 분석할 수 있음" -#: commands/vacuum.c:591 +#: commands/vacuum.c:618 #, 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:697 commands/vacuum.c:793 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\" 개체 vacuum 건너뜀 --- 사용 가능한 잠금이 없음" -#: commands/vacuum.c:675 +#: commands/vacuum.c:702 #, 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:718 commands/vacuum.c:798 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\" 분석 건너뜀 --- 잠글 수 없음" -#: commands/vacuum.c:696 +#: commands/vacuum.c:723 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\" 분석 건너뜀 --- 릴레이션어 없음" # # search5 부분 -#: commands/vacuum.c:994 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "가장 오래된 xmin이 너무 옛날 것입니다." -#: commands/vacuum.c:995 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12070,12 +13391,12 @@ msgstr "" "합니다." # # search5 부분 -#: commands/vacuum.c:1036 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "가장 오래된 multixact 값이 너무 옛날 것입니다." -#: commands/vacuum.c:1037 +#: commands/vacuum.c:1087 #, c-format msgid "" "Close open transactions with multixacts soon to avoid wraparound problems." @@ -12083,26 +13404,61 @@ msgstr "" "멀티 트랜잭션 ID 겹침 사고를 막기 위해 빨리 열린 멀티 트랜잭션들을 닫으십시" "오." -#: commands/vacuum.c:1623 +#: commands/vacuum.c:1793 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "몇몇 데이터베이스가 20억 이상의 트랜잭션을 처리했음에도 불구하고 청소가되지 " "않았습니다" -#: commands/vacuum.c:1624 +#: commands/vacuum.c:1794 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "이미 트래잭션 ID 겹침 현상으로 자료 손실이 발생했을 수도 있습니다." -#: commands/vacuum.c:1784 +#: commands/vacuum.c:1958 #, 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/vacuum.c:2336 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "\"%s\" 인덱스를 스캔해서 %d개의 행 버전들을 지웠습니다" + +#: commands/vacuum.c:2355 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "\"%s\" 인덱스는 %.0f 행 버전을 %u 페이지에서 포함하고 있습니다." + +#: commands/vacuum.c:2359 +#, 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:664 +#, 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 개의 병렬 청소 작업자가 실행됨 (예상값: %d)" + +#: commands/vacuumparallel.c:670 +#, 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] "인덱스 cleanup을 위해 %d 개의 병렬 청소 작업자가 실행됨 (예상값: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:12099 utils/misc/guc.c:12177 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "알 수 없는 키워드: \"%s\"" @@ -12162,7 +13518,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 "읽기 전용 보조 서버 상태에서는 serializable 모드를 사용할 수 없음" @@ -12199,7 +13555,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\" 롤 권한을 지정할 수 없음" @@ -12209,49 +13570,55 @@ msgstr "\"%s\" 롤 권한을 지정할 수 없음" msgid "could not determine which collation to use for view column \"%s\"" msgstr "\"%s\" 칼럼 자료 처리를 위한 정렬 규칙을 결정할 수 없음" -#: commands/view.c:265 commands/view.c:276 +#: commands/view.c:279 commands/view.c:290 #, c-format msgid "cannot drop columns from view" msgstr "뷰에서 칼럼을 삭제할 수 없음" -#: commands/view.c:281 +#: commands/view.c:295 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "뷰에서 \"%s\" 칼럼 이름을 \"%s\"(으)로 바꿀 수 없음" -#: commands/view.c:284 +#: commands/view.c:298 #, c-format 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:309 #, 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:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "뷰에서 \"%s\" 칼럼 자료형의 문자 정렬 규칙을 \"%s\"에서 \"%s\"(으)로 바꿀 수 없음" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "뷰에는 SELECT INTO 구문을 포함할 수 없음" -#: commands/view.c:453 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "뷰로 사용될 쿼리의 WITH 절에는 자료 변경 구문이 있으면 안됩니다." -#: commands/view.c:523 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW 는 columns 보다는 좀더 많은 열 이름을 명시해야 한다" -#: commands/view.c:531 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "" "뷰는 저장 공간을 사용하지 않기 때문에 unlogged 속성을 지정할 수 없습니다." -#: commands/view.c:545 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "\"%s\" 뷰는 임시적인 뷰로 만들어집니다" @@ -12289,76 +13656,120 @@ 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:2453 #, 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:2465 #, c-format msgid "no value found for parameter %d" msgstr "%d번째 매개 변수 값이 없습니다" -#: executor/execExpr.c:859 parser/parse_agg.c:816 +#: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 +#: executor/execExprInterp.c:4057 executor/execExprInterp.c:4074 +#: executor/execExprInterp.c:4173 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "테이블 행 형식과 쿼리 지정 행 형식이 일치하지 않음" + +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 +#, c-format +msgid "Query has too many columns." +msgstr "쿼리에 칼럼이 너무 많습니다." + +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "쿼리에서 서수 위치 %d에 있는 삭제된 칼럼의 값을 제공합니다." + +#: executor/execExpr.c:650 executor/execExprInterp.c:4075 +#: executor/nodeModifyTable.c:209 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "" +"테이블에는 %s 형식이 있는데(서수 위치 %d) 쿼리에는 %s이(가) 필요합니다." + +#: executor/execExpr.c:1098 parser/parse_agg.c:826 #, c-format msgid "window function calls cannot be nested" msgstr "윈도우 함수 호출을 중첩할 수 없음" -#: executor/execExpr.c:1318 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "대상 자료형이 배열이 아닙니다." -#: executor/execExpr.c:1651 +#: executor/execExpr.c:1957 #, 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:2482 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개의 인자를 전달할 수 있음" -#: 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:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 #, 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 "" +"set-values 함수(테이블 리턴 함수)가 set 정의 없이 사용되었습니다 (테이블과 해" +"당 열 alias 지정하세요)" + +#: executor/execExpr.c:2915 parser/parse_node.c:276 parser/parse_node.c:326 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "" +"이 자료형은 subscript 형을 지원하지 않기 때문에, %s subscript 자료형을 사용할 수 없음" + +#: executor/execExpr.c:3043 executor/execExpr.c:3065 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "%s 자료형은 subscript 지정을 지원하지 않음" -#: executor/execExprInterp.c:1894 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%d 번째 속성(대상 자료형 %s)이 삭제되었음" -#: executor/execExprInterp.c:1900 +#: executor/execExprInterp.c:1924 #, 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:1926 executor/execExprInterp.c:3059 +#: executor/execExprInterp.c:3105 #, c-format msgid "Table has type %s, but query expects %s." msgstr "테이블에는 %s 자료형이지만, 쿼리에서는 %s 자료형입니다." -#: executor/execExprInterp.c:2494 +#: executor/execExprInterp.c:2005 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:570 +#, c-format +msgid "type %s is not composite" +msgstr "%s 자료형은 복합 자료형이 아닙니다" + +#: executor/execExprInterp.c:2543 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF 구문은 이 테이블 형 대상으로 지원하지 않습니다." -#: executor/execExprInterp.c:2708 +#: executor/execExprInterp.c:2756 #, c-format msgid "cannot merge incompatible arrays" msgstr "배열 형태가 서로 틀려 병합할 수 없습니다" -#: executor/execExprInterp.c:2709 +#: executor/execExprInterp.c:2757 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -12367,59 +13778,59 @@ msgstr "" "%s 자료형의 요소로 구성된 배열은 %s 자료형의 요소로 구성된 ARRAY 구문에 포함" "될 수 없습니다." -#: executor/execExprInterp.c:2750 executor/execExprInterp.c:2780 +#: executor/execExprInterp.c:2778 utils/adt/arrayfuncs.c:263 +#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5370 +#: utils/adt/arrayfuncs.c:5887 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:2798 executor/execExprInterp.c:2833 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" msgstr "다차원 배열에는 일치하는 차원이 포함된 배열 식이 있어야 함" -#: executor/execExprInterp.c:3001 executor/execExprInterp.c:3048 +#: executor/execExprInterp.c:2810 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 +#: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 +#: utils/adt/arrayfuncs.c:5979 utils/adt/arrayfuncs.c:6320 +#: utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 +#: utils/adt/arrayutils.c:110 #, c-format -msgid "attribute %d has wrong type" -msgstr "%d 속성의 형식이 잘못됨" +msgid "array size exceeds the maximum allowed (%d)" +msgstr "배열 크기가 최대치 (%d)를 초과했습니다" -#: executor/execExprInterp.c:3158 +#: executor/execExprInterp.c:3058 executor/execExprInterp.c:3104 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "배열 하위 스크립트로 지정하는 값으로 null 값을 사용할 수 없습니다" +msgid "attribute %d has wrong type" +msgstr "%d 속성의 형식이 잘못됨" -#: executor/execExprInterp.c:3588 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3686 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:3701 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:4058 #, 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개가 필요합니다." -#: 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:4174 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 " @@ -12428,54 +13839,54 @@ msgstr "" "지연 가능한 고유 제약조건이나 제외 제약 조건은 ON CONFLICT 판별자로 사용할 " "수 없습니다." -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "\"%s\" exclusion 제약 조건을 만들 수 없음" -#: executor/execIndexing.c:824 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "%s 키와 %s 가 충돌함" -#: executor/execIndexing.c:826 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "키 충돌 발생" -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "\"%s\" exclusion 제약 조건에 따라 키 값 충돌이 발생했습니다." -#: executor/execIndexing.c:835 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "%s 키가 이미 있는 %s 키와 충돌합니다." -#: executor/execIndexing.c:837 +#: executor/execIndexing.c:864 #, 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 "\"%s\" TOAST 릴레이션을 바꿀 수 없음" -#: executor/execMain.c:1115 rewrite/rewriteHandler.c:2934 -#: rewrite/rewriteHandler.c:3708 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3098 +#: rewrite/rewriteHandler.c:3972 #, 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:1035 rewrite/rewriteHandler.c:3101 +#: rewrite/rewriteHandler.c:3975 #, c-format msgid "" "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " @@ -12484,14 +13895,14 @@ 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:3106 +#: rewrite/rewriteHandler.c:3980 #, 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:3109 +#: rewrite/rewriteHandler.c:3983 #, c-format msgid "" "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " @@ -12500,14 +13911,14 @@ 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:3114 +#: rewrite/rewriteHandler.c:3988 #, 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:3117 +#: rewrite/rewriteHandler.c:3991 #, c-format msgid "" "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " @@ -12516,116 +13927,135 @@ 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 "\"%s\" TOAST 릴레이션에서 로우를 잠글 수 없음" -#: 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 "\"%s\" 칼럼(해당 릴레이션 \"%s\")의 null 값이 not null 제약조건을 위반했습니다." +msgstr "" +"\"%s\" 칼럼(해당 릴레이션 \"%s\")의 null 값이 not 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 "" "새 자료가 \"%s\" 로우 단위 보안 정책을 위반했습니다, 해당 테이블: \"%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\" 로우 단위 보안 정책(USING 절 사용)을 위반했습니다, 해당 테이" +"블: \"%s\"" + +#: 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 " @@ -12634,7 +14064,7 @@ msgstr "" "새 자료가 \"%s\" 로우 단위 보안 정책(USING 절 사용)을 위반했습니다, 해당 테이" "블: \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2170 #, c-format msgid "" "new row violates row-level security policy (USING expression) for table \"%s" @@ -12642,17 +14072,17 @@ msgid "" msgstr "" "새 자료가 \"%s\" 테이블의 로우 단위 보안 정책(USING 절 사용)을 위반했습니다." -#: executor/execPartition.c:341 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "해당 로우를 위한 \"%s\" 릴레이션용 파티션이 없음" -#: executor/execPartition.c:344 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "실패한 로우의 파티션 키 값: %s" -#: executor/execReplication.c:196 executor/execReplication.c:373 +#: executor/execReplication.c:196 executor/execReplication.c:380 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " @@ -12660,26 +14090,52 @@ msgid "" msgstr "" "다른 업데이트 작업으로 잠굴 튜플이 이미 다른 파티션으로 이동되었음, 재시도함" -#: executor/execReplication.c:200 executor/execReplication.c:377 +#: executor/execReplication.c:200 executor/execReplication.c:384 +#, c-format +msgid "concurrent update, retrying" +msgstr "동시 업데이트, 다시 시도 중" + +#: executor/execReplication.c:206 executor/execReplication.c:390 +#, c-format +msgid "concurrent delete, retrying" +msgstr "동시 삭제, 다시 시도 중" + +#: executor/execReplication.c:276 parser/parse_cte.c:308 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 +#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3653 +#: utils/adt/arrayfuncs.c:4208 utils/adt/arrayfuncs.c:6200 +#: utils/adt/rowtypes.c:1203 +#, c-format +msgid "could not identify an equality operator for type %s" +msgstr "" +"%s 자료형에서 사용할 동등 연산자(equality operator)를 찾을 수 없습니다." + +#: executor/execReplication.c:606 executor/execReplication.c:612 #, c-format -msgid "concurrent update, retrying" -msgstr "동시 업데이트, 다시 시도 중" +msgid "cannot update table \"%s\"" +msgstr "\"%s\" 테이블에 자료를 변경 할 수 없음" -#: executor/execReplication.c:206 executor/execReplication.c:383 +#: executor/execReplication.c:608 executor/execReplication.c:620 #, c-format -msgid "concurrent delete, retrying" -msgstr "동시 삭제, 다시 시도 중" +msgid "" +"Column used in the publication WHERE expression is not part of the replica " +"identity." +msgstr "" +"발행의 WHERE 절에서 사용한 칼럼이 복제 식별자의 한 부분이 아닙니다." -#: 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:614 executor/execReplication.c:626 #, c-format -msgid "could not identify an equality operator for type %s" +msgid "" +"Column list used by the publication does not cover the replica identity." msgstr "" -"%s 자료형에서 사용할 동등 연산자(equality operator)를 찾을 수 없습니다." +"발행에서 사용되는 칼럼 목록이 복제 식별자를 모두 포함하지 못했습니다." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "\"%s\" 테이블에 자료를 삭제 할 수 없음" -#: executor/execReplication.c:586 +#: executor/execReplication.c:644 #, c-format msgid "" "cannot update table \"%s\" because it does not have a replica identity and " @@ -12688,56 +14144,51 @@ msgstr "" "\"%s\" 테이블 업데이트 실패, 이 테이블에는 복제용 식별자를 지정하지 않았거" "나, updates 옵션 없이 발행했습니다" -#: executor/execReplication.c:588 +#: executor/execReplication.c:646 #, 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:650 #, c-format msgid "" "cannot delete from table \"%s\" because it does not have a replica identity " "and publishes deletes" msgstr "\"%s\" 테이블 자료 삭제 실패, 복제 식별자와 deletes 발행을 안함" -#: executor/execReplication.c:594 +#: executor/execReplication.c:652 #, 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:668 #, 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 "materialize 모드를 위한 테이블 함수 프로토콜이 뒤이어 오지 않았습니다" -#: 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 " @@ -12745,79 +14196,85 @@ msgid "" msgstr "" "setof 레코드 반환 함수가 type 레코드를 허용하지 않는 컨텍스트에서 호출됨" -#: 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개가 필요합니다." -#: 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:742 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "\"%s\" 구체화된 뷰가 아직 구체화되지 못했습니다." -#: executor/execUtils.c:752 +#: executor/execUtils.c:744 #, 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 to/from 작업을 할 수 없음" #. 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:1471 executor/spi.c:2257 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s 구문은 비휘발성 함수(non-volatile function)에서 허용하지 않습니다" -#: executor/functions.c:1430 +#: executor/functions.c:1457 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL 함수 \"%s\"의 문 %d" -#: executor/functions.c:1456 +#: executor/functions.c:1483 #, c-format msgid "SQL function \"%s\" during startup" msgstr "시작 중 SQL 함수 \"%s\"" -#: executor/functions.c:1549 +#: executor/functions.c:1568 #, 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:1701 executor/functions.c:1739 +#: executor/functions.c:1753 executor/functions.c:1843 +#: executor/functions.c:1876 executor/functions.c:1890 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "리턴 자료형이 함수 정의에서 지정한 %s 리턴 자료형과 틀립니다" -#: executor/functions.c:1673 +#: executor/functions.c:1703 #, c-format msgid "" "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." @@ -12825,70 +14282,70 @@ msgstr "" "함수 내용의 맨 마지막 구문은 SELECT 또는 INSERT/UPDATE/DELETE RETURNING이어" "야 합니다." -#: executor/functions.c:1710 +#: executor/functions.c:1741 #, c-format msgid "Final statement must return exactly one column." msgstr "맨 마지막 구문은 정확히 하나의 칼럼만 반환해야 합니다." -#: executor/functions.c:1724 +#: executor/functions.c:1755 #, c-format msgid "Actual return type is %s." msgstr "실재 반환 자료형은 %s" -#: executor/functions.c:1814 +#: executor/functions.c:1845 #, c-format msgid "Final statement returns too many columns." msgstr "맨 마지막 구문이 너무 많은 칼럼을 반환합니다." -#: executor/functions.c:1847 +#: executor/functions.c:1878 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "" "맨 마지막 구문이 %s(기대되는 자료형: %s) 자료형을 %d 번째 칼럼에서 반환합니" "다." -#: executor/functions.c:1861 +#: executor/functions.c:1892 #, c-format msgid "Final statement returns too few columns." msgstr "맨 마지막 구문이 너무 적은 칼럼을 반환합니다." -#: executor/functions.c:1889 +#: executor/functions.c:1920 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "반환 자료형인 %s 자료형은 SQL 함수에서 지원되지 않음" -#: executor/nodeAgg.c:3075 executor/nodeAgg.c:3084 executor/nodeAgg.c:3096 -#, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "" - -#: executor/nodeAgg.c:4026 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:4234 executor/nodeWindowAgg.c:2836 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "%u OID 집계함수에 호환 가능한 입력 형식과 변환 형식이 있어야 함" +#: executor/nodeAgg.c:3952 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" msgstr "\"%s\" 이름의 칼럼 탐색은 MarkPos 기능을 지원하지 않음" -#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 +#: executor/nodeHashjoin.c:1076 executor/nodeHashjoin.c:1106 #, c-format msgid "could not rewind hash-join temporary file" msgstr "해시-조인 임시 파일을 되감을 수 없음" -#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 +#: executor/nodeHashjoin.c:1294 executor/nodeHashjoin.c:1305 #, c-format msgid "" "could not read from hash-join temporary file: read only %zu of %zu bytes" 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 "lossy distance 함수들은 인덱스 단독 탐색을 지원하지 않음" @@ -12913,64 +14370,97 @@ 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:234 #, c-format msgid "Query has too few columns." msgstr "쿼리에 칼럼이 너무 적습니다." -#: executor/nodeModifyTable.c:839 executor/nodeModifyTable.c:913 +#: executor/nodeModifyTable.c:1503 executor/nodeModifyTable.c:1577 #, 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:1731 #, c-format msgid "invalid ON UPDATE specification" msgstr "잘못된 ON UPDATE 옵션" -#: executor/nodeModifyTable.c:1221 +#: executor/nodeModifyTable.c:1732 #, c-format msgid "" "The result tuple would appear in a different partition than the original " "tuple." msgstr "" +"결과 튜플이 원래 튜플이 아닌 다른 파티션에서 나타날 것입니다." + +#: executor/nodeModifyTable.c:2192 +#, 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:1592 +#: executor/nodeModifyTable.c:2193 #, 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 "" +"참조키가 \"%s\" 하위 파티션 테이블을 대상으로 합니다. 상위 파티션 테이블은 \"%s\" 테이블입니다." + +#: executor/nodeModifyTable.c:2196 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "\"%s\" 테이블에 참조키 정의를 고려하세요." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2542 executor/nodeModifyTable.c:2929 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "%s 명령은 두번째 작업에는 아무런 영향을 주 않음" -#: executor/nodeModifyTable.c:1593 +#: executor/nodeModifyTable.c:2544 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " "duplicate constrained values." +msgstr "동일한 명령 내에서 삽입하도록 제안된 행에 중복된 제한 값이 없는지 확인하십시오." + +#: executor/nodeModifyTable.c:2931 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "둘 이상의 소스 행이 하나의 대상 행과 일치하지 않는지 확인하십시오." + +#: executor/nodeModifyTable.c:3012 +#, c-format +msgid "" +"tuple to be deleted was already moved to another partition due to concurrent " +"update" +msgstr "동시 업데이트로 삭제할 튜플이 이미 다른 파티션으로 옮겨졌음" + +#: executor/nodeModifyTable.c:3051 +#, c-format +msgid "" +"tuple to be updated or deleted was already modified by an operation " +"triggered by the current command" msgstr "" +"현재 명령으로 실행된 트리거 작업으로 변경하거나 지울 자료가 이미 바뀌었습니다." -#: executor/nodeSamplescan.c:259 +#: executor/nodeSamplescan.c:260 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "TABLESAMPLE 절에는 반드시 부가 옵션값들이 있어야 합니다" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:272 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "TABLESAMPLE REPEATABLE 절은 더 이상의 부가 옵션을 쓰면 안됩니다." -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1151 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "표현식에 사용된 서브쿼리 결과가 하나 이상의 행을 리턴했습니다" @@ -13000,88 +14490,109 @@ msgstr "\"%s\" 칼럼용 필터가 null입니다." msgid "null is not allowed in column \"%s\"" msgstr "\"%s\" 칼럼은 null 값을 허용하지 않습니다" -#: executor/nodeWindowAgg.c:355 +#: executor/nodeWindowAgg.c:356 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "moving-aggregate transition 함수는 null 값을 반환하면 안됩니다." -#: executor/nodeWindowAgg.c:2058 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "프래임 시작 위치값으로 null 값을 사용할 수 없습니다." -#: executor/nodeWindowAgg.c:2071 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "프래임 시작 위치으로 음수 값을 사용할 수 없습니다." -#: executor/nodeWindowAgg.c:2083 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "프래임 끝 위치값으로 null 값을 사용할 수 없습니다." -#: executor/nodeWindowAgg.c:2096 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "프래임 끝 위치값으로 음수 값을 사용할 수 없습니다." -#: executor/nodeWindowAgg.c:2752 +#: executor/nodeWindowAgg.c:2907 #, c-format 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:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "잘못된 트랜잭션 마침" -#: executor/spi.c:242 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "하위트랜잭션이 활성화 된 상태에서는 커밋 할 수 없음" -#: executor/spi.c:303 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "하위트랜잭션이 활성화 된 상태에서는 롤백 할 수 없음" -#: executor/spi.c:372 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "트랜잭션이 비어있지 않은 SPI 스택을 남겼습니다" -#: executor/spi.c:373 executor/spi.c:435 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "\"SPI_finish\" 호출이 빠졌는지 확인하세요" -#: executor/spi.c:434 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "하위 트랜잭션이 비어있지 않은 SPI 스택을 남겼습니다" -#: executor/spi.c:1335 +#: 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:1340 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "%s 쿼리로 커서를 열 수 없음." -#: executor/spi.c:1445 +#: 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:1446 parser/analyze.c:2508 +#: executor/spi.c:1717 parser/analyze.c:2861 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "스크롤 가능 커서는 READ ONLY여야 합니다." -#: executor/spi.c:2560 +#: executor/spi.c:2474 +#, c-format +msgid "empty query does not return tuples" +msgstr "빈 쿼리는 튜플을 반환하지 않습니다." + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2548 +#, c-format +msgid "%s query does not return tuples" +msgstr "%s 쿼리는 집합을 반환할 수 없습니다." + +#: executor/spi.c:2963 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL 표현식: \"%s\"" + +#: executor/spi.c:2968 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL 지정: \"%s\"" + +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL 구문: \"%s\"" @@ -13091,270 +14602,295 @@ 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" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 -#: utils/fmgr/dfmgr.c:465 +#: foreign/foreign.c:642 #, c-format -msgid "could not access file \"%s\": %m" -msgstr "\"%s\" 파일에 액세스할 수 없음: %m" +msgid "There are no valid options in this context." +msgstr "이 컨텍스트에서 유효한 옵션이 없음." -#: jit/llvm/llvmjit.c:595 +#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 #, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "" +msgid "could not access file \"%s\": %m" +msgstr "\"%s\" 파일에 액세스할 수 없음: %m" -#: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 +#: lib/dshash.c:254 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인 DSA 요청에서 오류가 발생했습니다." -#: 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 secret" -#: 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 secret이 없습니다." -#: 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 "토큰 불일치" -#: 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\" 속성에는 \"=\" 문자가 와야합니다." +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 "" +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 "" +msgstr "클라이언트는 authorization identity를 사용하지만, 이것을 지원하지 않습니다." -#: libpq/auth-scram.c:1022 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." -msgstr "" +msgstr "client-first-message 안에 \"%s\" 속성이 잘못됨" -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" -msgstr "" +msgstr "클라이언트가 지원하지 않는 SCRAM 확장을 요구합니다." -#: libpq/auth-scram.c:1052 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM 토큰에 인쇄할 수 없는 문자가 있음" -#: libpq/auth-scram.c:1169 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "무작위 토큰을 만들 수 없음" -#: 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 "" +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 "" +msgstr "client-final-message 안에 예상치 못한 SCRAM 채널 바인딩 속성이 있음" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." -msgstr "" +msgstr "client-final-message 안에 잘못된 증명" -#: libpq/auth-scram.c:1330 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." -msgstr "" +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\"의 password 인증을 실패했습니다" -#: 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 "인증 식별자가 여러 번 사용 됨" + +#: 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 " @@ -13362,19 +14898,25 @@ msgid "" 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 "" +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "GSS encryption" +msgstr "GSS 암호화" + +#: libpq/auth.c:456 libpq/auth.c:502 +msgid "SSL encryption" +msgstr "SSL 암호화" -#: libpq/auth.c:426 +#: libpq/auth.c:458 libpq/auth.c:504 +msgid "no encryption" +msgstr "암호화 안함" + +#. translator: last %s describes encryption state +#: libpq/auth.c:464 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -13382,22 +14924,8 @@ msgstr "" "호스트 \"%s\", 사용자 \"%s\", %s 연결이 복제용 연결로는 pg_hba.conf 파일 설정" "에 따라 거부됩니다" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL off" -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:432 -#, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "" -"호스트 \"%s\", 사용자 \"%s\" 연결이 복제용 연결로는 pg_hba.conf 파일 설정에 " -"따라 거부됩니다" - -#: 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" @@ -13406,43 +14934,36 @@ msgstr "" "호스트 \"%s\", 사용자 \"%s\", 데이터베이스 \"%s\", %s 연결이 pg_hba.conf 파" "일 설정에 따라 거부됩니다" -#: libpq/auth.c:448 -#, c-format -msgid "" -"pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "" -"호스트 \"%s\", 사용자 \"%s\", 데이터베이스 \"%s\" 연결이 pg_hba.conf 파일 설" -"정에 따라 거부됩니다" - -#: 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\" 클라이언트 호스트 이름을 %s IP 주소로 전환할 수 없음." -#: 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" @@ -13451,276 +14972,252 @@ msgstr "" "호스트 \"%s\", 사용자 \"%s\", %s 연결이 복제용 연결로 pg_hba.conf 파일에 설정" "되어 있지 않습니다" -#: libpq/auth.c:507 -#, c-format -msgid "" -"no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "" -"호스트 \"%s\", 사용자 \"%s\" 연결이 복제용 연결로 pg_hba.conf 파일에 설정되" -"어 있지 않습니다" - -#: 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 "" "호스트 \"%s\", 사용자 \"%s\", 데이터베이스 \"%s\", %s 연결에 대한 설정이 " "pg_hba.conf 파일에 없습니다." -#: libpq/auth.c:525 -#, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "" -"호스트 \"%s\", 사용자 \"%s\", 데이터베이스 \"%s\" 연결에 대한 설정이 pg_hba." -"conf 파일에 없습니다." - -#: 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 -#, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "프로토콜 버전 2에서는 SASL 인증을 지원되지 않음" - -#: libpq/auth.c:939 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "SASL 응답이 필요한데 메시지 형식 %d을(를) 받음" - -#: libpq/auth.c:1068 +#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 #, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "프로토콜 버전 2에서는 GSSAPI가 지원되지 않음" +msgid "could not set environment: %m" +msgstr "환경변수를 지정할 수 없음: %m" -#: 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 "UID %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 conversation %d/\"%s\"" + +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM 인증자를 생성할 수 없습니다: %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 인증 실패: %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 인증자를 릴리즈할 수 없습니다: %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 "\"%s\"용 LDAP 인증 작업에서 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 인증으로 사용할 수 없는 LDAP 라이브러리" -#: 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 "could not load function _ldap_start_tls_sA in wldap32.dll" -#: libpq/auth.c:2530 +#: libpq/auth.c:2410 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "이 플랫폼에서는 SSL을 이용한 LDAP 기능을 지원하지 않음." -#: 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\": " @@ -13729,55 +15226,55 @@ msgstr "" "\"%s\" ldapbinddn (해당 서버: \"%s\") 설정에 대한 LDAP 바인드 초기화를 할 수 " "없음: %s" -#: libpq/auth.c:2732 +#: libpq/auth.c:2612 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "\"%s\" 필터로 LDAP 검색 실패함, 대상 서버: \"%s\": %s" -#: libpq/auth.c:2746 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "\"%s\" LDAP 사용자가 없음" -#: libpq/auth.c:2747 +#: libpq/auth.c:2627 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "\"%s\" 필터로 \"%s\" 서버에서 LDAP 검색을 했으나, 해당 자료가 없음" -#: libpq/auth.c:2751 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "\"%s\" LDAP 사용자가 유일하지 않습니다" -#: 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] "\"%s\" 필터로 \"%s\" 서버에서 LDAP 검색 결과 %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 "\"%s\" 첫번째 항목 조회용 dn 값을 \"%s\" 서버에서 찾을 수 없음: %s" -#: libpq/auth.c:2793 +#: libpq/auth.c:2673 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "\"%s\" 사용자 검색 후 unbind 작업을 \"%s\" 서버에서 할 수 없음" -#: libpq/auth.c:2824 +#: libpq/auth.c:2704 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "\"%s\" 사용자의 \"%s\" LDAP 서버 로그인 실패: %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 " @@ -13786,173 +15283,189 @@ 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\" 사용자를 위한 인증서 유효성 검사를 실패 함: 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 비밀키가 지정되지 않음" -#: 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:1954 +#: libpq/auth.c:3053 libpq/hba.c:1976 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "\"%s\" RADIUS 서버 이름을 주소로 바꿀 수 없음: %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" # translator: %s is IPv4, IPv6, or Unix -#: libpq/auth.c:3198 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUS 소켓을 생성할 수 없습니다: %m" # translator: %s is IPv4, IPv6, or Unix -#: 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 응답 대기 시간 초과" # translator: %s is IPv4, IPv6, or Unix -#: 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 "%s에서 RADIUS 응답이 바르지 않은 값임 (%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 "%d번 대형 개체 기술자에 대한 lo_lseek 반환값이 범위를 벗어남" -#: 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 "%d번 대형 개체 기술자에 대한 lo_tell 반환값이 범위를 벗어남" -#: 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 대형 개체에 대한 접근 권한 없음" @@ -13972,23 +15485,23 @@ msgstr "\"%s\" 명령 실패" msgid "could not access private key file \"%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\" 개인 키 파일은 일반 파일이 아님" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:177 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "" "\"%s\" 개인 키 파일의 소유주는 데이터베이스 사용자이거나 root 여야 합니다." -#: libpq/be-secure-common.c:188 +#: libpq/be-secure-common.c:187 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "\"%s\" 개인 키 파일에 그룹 또는 익명 액세스 권한이 있음" -#: libpq/be-secure-common.c:190 +#: libpq/be-secure-common.c:189 #, c-format msgid "" "File must have permissions u=rw (0600) or less if owned by the database " @@ -13998,58 +15511,58 @@ msgstr "" "(0600) 또는 더 작게 설정하고, root가 소유주라면 u=rw,g=r (0640) 권한으로 지정" "하세요" -#: libpq/be-secure-gssapi.c:195 +#: libpq/be-secure-gssapi.c:204 msgid "GSSAPI wrap error" -msgstr "" +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 "" +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 "" +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 "" +msgstr "클라이언트가 너무 큰 GSSAPI 패킷을 보냈습니다(%zu > %zu)." -#: libpq/be-secure-gssapi.c:364 +#: libpq/be-secure-gssapi.c:389 msgid "GSSAPI unwrap error" -msgstr "" +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 "" +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 "" +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" @@ -14057,169 +15570,201 @@ 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" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:182 #, 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: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 프로토콜 버전을 설정할 수 없음" -#: 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 "cipher 목록을 설정할 수 없음 (유요한 cipher가 없음)" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:302 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "root 인증서 파일 \"%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 "\"%s\" SSL 인증서 회수 목록 파일을 불러들일 수 없습니다: %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 "\"%s\" SSL 인증서 회수 목록 디렉터리를 불러들일 수 없습니다: %s" + +#: libpq/be-secure-openssl.c:367 +#, c-format +msgid "" +"could not load SSL certificate revocation list file \"%s\" or directory \"%s" +"\": %s" +msgstr "" +"\"%s\" SSL 인증서 회수 목록 파일이나 \"%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 "" +"이런 경우는 클라이언트가 %s부터 %s까지 SSL 프로토콜 버전을 지원하지 않는 " +"경우에 발생하기도 합니다." -#: 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 "\"%s\" DH 매개 변수 파일을 열 수 없습니다: %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는 prime 아님" -#: 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 "" +msgstr "잘못된 DH 매개 변수값: 타당한 생성자도 아니고, 안전한 prime도 아님" -#: 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: 알 수 없는 curve 이름: %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:1407 +#, c-format +msgid "could not create BIO" +msgstr "BIO 만들기 실패" + +#: libpq/be-secure-openssl.c:1417 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "ASN1_OBJECT 객체용 NID 구할 수 없음" + +#: libpq/be-secure-openssl.c:1425 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "\"%s\" 로부터의 SSL 연결" +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "ASN1_OBJECT 구조체에서 %d NID를 변환할 수 없음" -#: 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 "postmaster의 예상치 못한 종료로 연결을 종료합니다" @@ -14239,249 +15784,230 @@ 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 "" +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 "" +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 "2차 인증파일 \"%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: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 "%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: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:228 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "%d번째 줄(\"%s\" 환경 설정 파일)" + +#: 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 "한 줄에 하나의 연결 형태만 지정해야 합니다" -#: libpq/hba.c:988 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "로컬 접속 기능을 뺀 채로 서버가 만들어졌습니다." -#: libpq/hba.c:1011 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" -msgstr "" +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 "" "이 서버는 ssl 접속 기능을 지원하지 않아 hostssl 인증을 지원하지 않습니다." -#: libpq/hba.c:1021 -#, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "" -"SSL 연결을 사용하기 위해 --enable-ssl 옵션을 사용해서 서버를 다시 컴파일 하세" -"요" - -#: 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 "한 줄에 하나의 주소 범위가 있어야 합니다." -#: libpq/hba.c:1177 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "\"%s\" 형태는 잘못된 IP 주소 형태입니다: %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 "\"%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 "하나의 인증 방법에 대해서 한 줄씩 지정해야 합니다" -#: 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 "" - -#: 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 "cert 인증은 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, " @@ -14490,7 +16016,7 @@ 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" @@ -14499,230 +16025,253 @@ 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:1607 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "RADIUS 비밀키 목록은 비어 있을 수 없음" -#: 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 "" +"RADIUS 비밀번호 개수(%d)는 하나이거나, 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)는 하나이거나, RADIUS 서버 개수(%d)와 " +"같아야 함" + +#: 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) / %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)는 하나이거나, RADIUS 서버 개수(%d)와 " +"같아야 함" -#: libpq/hba.c:1694 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi 및 cert" -#: libpq/hba.c:1703 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert는 \"hostssl\" 행에 대해서만 구성할 수 있음" -#: libpq/hba.c:1725 +#: libpq/hba.c:1716 #, c-format msgid "" -"clientcert cannot be set to \"no-verify\" when using \"cert\" authentication" +"clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "" -"\"cert\" 인증을 사용하는 경우 clientcert를 \"no-verify\"로 설정할 수 없음" +"\"cert\" 인증을 사용하는 경우 clientcert 값은 \"verify-full\" 만 허용함" -#: libpq/hba.c:1737 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "잘못된 clientcert 값: \"%s\"" -#: libpq/hba.c:1771 +#: libpq/hba.c:1741 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname 설정은 \"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 "\"%s\" LDAP URL을 분석할 수 없음: %s" -#: libpq/hba.c:1782 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "지원하지 않는 LDAP URL 스킴: %s" -#: libpq/hba.c:1806 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "이 플랫폼에서는 LDAP URL 기능을 지원하지 않음." -#: libpq/hba.c:1824 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "잘못된 ldapscheme 값: \"%s\"" -#: libpq/hba.c:1842 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "LDAP 포트 번호가 잘못됨: \"%s\"" -#: libpq/hba.c:1888 libpq/hba.c:1895 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi 및 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 "RADIUS 서버 목록 분석 실패: \"%s\"" -#: libpq/hba.c:1983 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUS 서버 포트 목록 분석 실패: \"%s\"" -#: libpq/hba.c:1997 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "RADIUS 포트 번호가 잘못됨: \"%s\"" # translator: %s is IPv4, IPv6, or Unix -#: libpq/hba.c:2019 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUS 서버 비밀키 목록 분석 실패: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS 서버 식별자 목록 분석 실패: \"%s\"" -#: libpq/hba.c:2055 +#: libpq/hba.c:2077 #, 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:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "\"%s\" 설정 파일 을 열수 없습니다: %m" -#: libpq/hba.c:2250 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "\"%s\" 설정 파일에 구성 항목이 없음" -#: libpq/hba.c:2768 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "\"%s\" 정규식이 잘못됨: %s" -#: libpq/hba.c:2828 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "\"%s\"에 대한 정규식 일치 실패: %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 "\"%s\" 정규식에는 \"%s\"의 backreference에서 요청된 하위 식이 없음" -#: libpq/hba.c:2943 +#: 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:2963 +#: libpq/hba.c:2572 #, 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: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 "소켓을 nonblocking 모드로 지정할 수 없음: %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\" 유닉스 도메인 소켓 경로가 너무 깁니다 (최대 %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 "유닉스" -#: 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 setsockopt(SO_REUSEADDR) 실패, 대상 주소: \"%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 "%s setsockopt(IPV6_V6ONLY) 실패, 대상 주소: \"%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." +msgid "Is another postmaster already running on port %d?" msgstr "" -"다른 postmaster 가 포트 %d에서 이미 실행중인것 같습니다? 그렇지 않다면 소켓 " -"파일 \"%s\"을 제거하고 다시 시도해보십시오" +"다른 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 " @@ -14732,85 +16281,108 @@ msgstr "" "를 기다렸다가 다시 시도해보십시오." #. 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" # translator: %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:578 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "\"%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:4371 #, 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 "keepalive idle time 지정하는 것은 지원하지 않음" + +#: 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: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 "부족한 데이터는 메시지 안에 넣어져 있습니다" @@ -14827,12 +16399,12 @@ msgstr "메시지 포맷이 유효하지 않습니다." # # search5 끝 # # advance 부분 -#: main/main.c:246 +#: main/main.c:239 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup 작업 실패: %d\n" -#: main/main.c:310 +#: main/main.c:350 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14841,7 +16413,7 @@ msgstr "" "%s 프로그램은 PostgreSQL 서버입니다.\n" "\n" -#: main/main.c:311 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -14852,115 +16424,107 @@ msgstr "" " %s [옵션]...\n" "\n" -#: main/main.c:312 +#: main/main.c:352 #, c-format msgid "Options:\n" msgstr "옵션들:\n" -#: main/main.c:313 +#: main/main.c:353 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS 공유 버퍼 개수\n" -#: main/main.c:314 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE 실시간 매개 변수 지정\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 NAME 실시간 매개 변수 값을 보여주고 마침\n" -#: main/main.c:316 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 디버깅 수준\n" -#: main/main.c:317 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR 데이터 디렉터리\n" -#: main/main.c:318 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e 날짜 입력 양식이 유럽형(DMY)을 사용함\n" -#: main/main.c:319 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F 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 HOSTNAME 서버로 사용할 호스트 이름 또는 IP\n" -#: main/main.c:321 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\n" msgstr " -i TCP/IP 연결 사용함\n" -#: main/main.c:322 +#: main/main.c:362 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY 유닉스 도메인 소켓 위치\n" -#: main/main.c:324 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l SSL 연결 기능 사용함\n" -#: main/main.c:326 +#: main/main.c:366 #, 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 개별 서버 프로세스를 \"OPTIONS\" 옵션으로 실행 (옛기" -"능)\n" - -#: main/main.c:328 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 서버 포트 번호\n" -#: main/main.c:329 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s 각 쿼리 뒤에 통계정보를 보여줌\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 정렬작업에 사용할 메모리 크기(kb 단위)를 지정\n" -#: main/main.c:331 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보 보여주고 마침\n" -#: main/main.c:332 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE 실시간 매개 변수 지정\n" -#: main/main.c:333 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config 서버 환경 설정값에 대한 설명을 보여주고 마침\n" -#: main/main.c:334 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 이 도움말을 보여주고 마침\n" -#: main/main.c:336 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -14969,34 +16533,34 @@ msgstr "" "\n" "개발자 옵션들:\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 쿼리최적화기의 기능을 제한 함\n" +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h 쿼리최적화기의 기능을 제한 함\n" -#: main/main.c:338 +#: main/main.c:377 #, c-format msgid "" " -n do not reinitialize shared memory after abnormal exit\n" msgstr "" " -n 비정상적 종료 뒤에 공유 메모리를 초기화 하지 않음\n" -#: main/main.c:339 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O 시스템 테이블의 구조를 바꿀 수 있도록 함\n" -#: main/main.c:340 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P 시스템 인덱스들을 사용하지 않음\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 각 쿼리 다음 작업시간을 보여줌\n" -#: main/main.c:342 +#: main/main.c:381 #, c-format msgid "" " -T send SIGSTOP to all backend processes if one dies\n" @@ -15004,13 +16568,13 @@ msgstr "" " -T 하나의 하위 서버 프로세스가 비정상으로 마치며 모든\n" " 다른 서버 프로세스에게 SIGSTOP 신호를 보냄\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 디버그 작업을 위해 지정한 숫자의 초만큼 기다린다\n" -#: main/main.c:345 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -15019,28 +16583,28 @@ msgstr "" "\n" "단일사용자 모드에서 사용할 수 있는 옵션들:\n" -#: main/main.c:346 +#: main/main.c:385 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" msgstr " --single 단일 사용자 모드 선택 (인자의 첫번째로 와야함)\n" -#: main/main.c:347 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME 데이터베이스 이름 (초기값: 사용자이름)\n" -#: main/main.c:348 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 디버깅 수준\n" -#: main/main.c:349 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E 실행하기 전에 작업명령을 출력함\n" -#: main/main.c:350 +#: main/main.c:389 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -15048,14 +16612,14 @@ msgstr "" " -j 대화형 쿼리의 명령 실행 구분 문자로 줄바꿈문자를 쓰지 않" "음\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 FILENAME stdout, stderr 쪽으로 보내는 내용을 FILENAME 파일로 저장" "함\n" -#: main/main.c:353 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -15064,25 +16628,25 @@ msgstr "" "\n" "부트스트랩 모드에서 사용할 수 있는 옵션들:\n" -#: main/main.c:354 +#: main/main.c:393 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot 부트스트랩 모드로 실행 (첫번째 인자로 와야함)\n" -#: main/main.c:355 +#: main/main.c:394 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check 체크 모드 선택 (첫번째 인자로 와야함)\n" + +#: main/main.c:395 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " "mode)\n" msgstr " DBNAME 데이터베이스 이름 (부트스트랩 모드에서 필수)\n" -#: main/main.c:357 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM 내부적인 옵션\n" - -#: main/main.c:359 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -15099,12 +16663,12 @@ msgstr "" "\n" "문제점 보고 주소: <%s>\n" -#: main/main.c:363 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페이지: <%s>\n" -#: main/main.c:374 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15117,12 +16681,12 @@ msgstr "" "반드시 일반 사용자 ID(시스템 관리자 권한이 없는 ID)로 서버를 실행하십시오.\n" "Server를 어떻게 안전하게 기동하는가 하는 것은 문서를 참조하시기 바랍니다.\n" -#: main/main.c:391 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: real 또는 effective user ID 들은 반드시 일치되어야 한다.\n" -#: main/main.c:398 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15146,23 +16710,28 @@ msgstr "\"%s\" 이름의 확장가능한 노드 형이 이미 있습니다" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "\"%s\" ExtensibleNodeMethods가 등록되어 있지 않음" -#: 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:2336 +#, 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:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, 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 "" +msgstr "\"%s\" 포탈의 매개 변수: %s" -#: nodes/params.c:362 +#: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" -msgstr "" +msgstr "이름 없는 포탈의 매개 변수: %s" #: optimizer/path/joinrels.c:855 #, c-format @@ -15173,8 +16742,14 @@ msgstr "" "FULL JOIN 구문은 머지 조인이나, 해시 조인이 가능한 상황에서만 사용할 수 있습" "니다" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "\"%s\" 릴레이션에서 MERGE 명령을 실행할 수 없음" + #. 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 "" @@ -15182,97 +16757,97 @@ msgstr "" "다" #. 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:1344 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 구문은 UNION/INTERSECT/EXCEPT 예약어들과 함께 사용할 수 없습니다." -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 #, 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:2052 optimizer/plan/planner.c:3708 +#: optimizer/plan/planner.c:4351 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:4350 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCT를 구현할 수 없음" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window PARTITION BY" msgstr "창 PARTITION BY를 구현할 수 없음" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "창 분할 칼럼은 정렬 가능한 데이터 형식이어야 합니다." -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:5476 #, c-format msgid "could not implement window ORDER BY" msgstr "창 ORDER BY를 구현할 수 없음" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:5477 #, 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:4777 #, c-format msgid "SQL function \"%s\" during inlining" -msgstr "" +msgstr "\"%s\" SQL 함수를 인라인으로 바꾸는 중" + +#: optimizer/util/plancat.c:142 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "\"%s\" 릴레이션을 열 수 없음" -#: optimizer/util/plancat.c:132 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "복구 작업 중에는 임시 테이블이나, 언로그드 테이블을 접근할 수 없음" -#: optimizer/util/plancat.c:662 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" -msgstr "" +msgstr "전체 로우 유니크 인덱스 인터페이스 규약은 지원하지 않습니다." -#: optimizer/util/plancat.c:679 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ON CONFLICT 처리를 위해 관련된 인덱스가 없습니다" -#: optimizer/util/plancat.c:729 +#: optimizer/util/plancat.c:758 #, 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:863 #, c-format msgid "" "there is no unique or exclusion constraint matching the ON CONFLICT " @@ -15280,63 +16855,65 @@ msgid "" msgstr "" "ON CONFLICT 절을 사용하는 경우, unique 나 exclude 제약 조건이 있어야 함" -#: 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 구문에 target columns 보다 더 많은 표현식이 존재하고 있다" -#: parser/analyze.c:922 +#: parser/analyze.c:999 #, c-format msgid "INSERT has more target columns than expressions" msgstr "" "INSERT 구문에 target columns 보다 더 많은 표현식(expressions)이 존재하고 있다" -#: 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:3363 #, 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 " @@ -15345,22 +16922,34 @@ 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 query 는 같은 수의 columns 를 가져야 한다." -#: parser/analyze.c:2426 +#: parser/analyze.c:2523 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING 절에는 적어도 하나 이상의 칼럼이 있어야 합니다" -#: 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] "" + +#: parser/analyze.c:2687 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "SCROLL 과 NO SCROLL 둘다를 명시할 수 없다" +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "변수 \"%s\" 는 %s 자료형인데 표현식은 %s 자료형입니다." -#: parser/analyze.c:2486 +#. translator: %s is a SQL keyword +#: parser/analyze.c:2811 parser/analyze.c:2819 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "%s, %s 둘다를 명시할 수 없다" + +#: parser/analyze.c:2839 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "" @@ -15368,133 +16957,133 @@ msgstr "" "다" #. 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 구문은 지원되지 않음" -#: parser/analyze.c:2497 +#: parser/analyze.c:2850 #, 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:2858 #, 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:2869 #, 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:2872 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "민감하지 않은 커서는 READ ONLY여야 합니다." -#: parser/analyze.c:2585 +#: parser/analyze.c:2938 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "구체화된 뷰 정의에 사용한 WITH 절 안에는 자료 변경 구문이 없어야 합니다" -#: parser/analyze.c:2595 +#: parser/analyze.c:2948 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "구체화된 뷰는 임시 테이블이나 뷰를 사용할 수 없습니다" -#: parser/analyze.c:2605 +#: parser/analyze.c:2958 #, c-format msgid "materialized views may not be defined using bound parameters" -msgstr "" +msgstr "구체화딘 뷰는 바운드 매개 변수를 이용해서 정의할 수 없습니다" -#: parser/analyze.c:2617 +#: parser/analyze.c:2970 #, c-format msgid "materialized views cannot be unlogged" msgstr "구체화된 뷰는 UNLOGGED 옵션을 사용할 수 없습니다." #. 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 절은 DISTINCT 절과 함께 사용할 수 없습니다" #. 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 절은 GROUP BY 절과 함께 사용할 수 없습니다" #. 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 절은 HAVING 절과 함께 사용할 수 없습니다" #. 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 절은 집계 함수와 함께 사용할 수 없습니다" #. 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 절은 윈도우 함수와 함께 사용할 수 없습니다" #. 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 절은 대상 목록에서 세트 반환 함수와 함께 사용할 수 없습니다." #. 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 절에는 unqualified 릴레이션 이름을 지정해야 합니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#: parser/analyze.c:3336 #, 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:3345 #, 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:3354 #, 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:3372 #, 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:3381 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s 절은 named tuplestore에 적용할 수 없음" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2932 +#: parser/analyze.c:3401 #, 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 자료형에서 사용할 순서 정하는 연산자를 찾을 수 없습니다." @@ -15526,7 +17115,7 @@ msgstr "집계 함수는 자신의 쿼리 수준의 FROM 절에서는 사용할 #: parser/parse_agg.c:376 msgid "" "grouping operations are not allowed in FROM clause of their own query level" -msgstr "" +msgstr "자체 쿼리 수준의 FROM 절에는 그룹핑 작업을 허용하지 않습니다." #: parser/parse_agg.c:381 msgid "aggregate functions are not allowed in functions in FROM" @@ -15568,226 +17157,251 @@ 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 "transform 식(expression)에 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:506 msgid "grouping operations are not allowed in transform expressions" msgstr "transform 식(expression)에 그룹핑 작업를 사용할 수 없습니다" -#: 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:1836 #, 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:767 #, 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:768 parser/parse_expr.c:1674 parser/parse_expr.c:2156 +#: 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:773 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "집계 함수 호출은 윈도우 함수 호출을 포함할 수 없음" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:852 msgid "window functions are not allowed in JOIN conditions" msgstr "윈도우 함수는 JOIN 조건에 사용할 수 없음" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:859 msgid "window functions are not allowed in functions in FROM" msgstr "윈도우 함수는 FROM 절에 있는 함수로 사용할 수 없음" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:865 msgid "window functions are not allowed in policy expressions" msgstr "윈도우 함수는 정책 식에 사용할 수 없음" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:878 msgid "window functions are not allowed in window definitions" msgstr "윈도우 함수는 윈도우 함수 정의에 사용할 수 없음" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:889 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "윈도우 함수는 MERGE WHEN 조건절에서 사용할 수 없음" + +#: parser/parse_agg.c:913 msgid "window functions are not allowed in check constraints" msgstr "윈도우 함수는 check 제약조건에 사용할 수 없음" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:917 msgid "window functions are not allowed in DEFAULT expressions" msgstr "윈도우 함수는 DEFAULT 식에서 사용할 수 없음" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:920 msgid "window functions are not allowed in index expressions" msgstr "윈도우 함수는 인덱스 식에서 사용할 수 없음" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:923 +msgid "window functions are not allowed in statistics expressions" +msgstr "윈도우 함수는 통계 정보식에 사용할 수 없음" + +#: parser/parse_agg.c:926 msgid "window functions are not allowed in index predicates" msgstr "윈도우 함수는 함수 기반 인덱스에서 사용할 수 없음" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:929 msgid "window functions are not allowed in transform expressions" msgstr "윈도우 함수는 transform 식에서 사용할 수 없음" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:932 msgid "window functions are not allowed in EXECUTE parameters" msgstr "윈도우 함수는 EXECUTE 매개 변수 설정 값으로 사용할 수 없음" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:935 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "윈도우 함수는 트리거의 WHEN 조건절에서 사용할 수 없음" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:938 msgid "window functions are not allowed in partition bound" msgstr "윈도우 함수는 파티션 범위 표현식에서 사용할 수 없음" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:941 msgid "window functions are not allowed in partition key expressions" msgstr "윈도우 함수는 파티션 키 표현식에서 사용할 수 없음" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:944 msgid "window functions are not allowed in CALL arguments" msgstr "윈도우 함수는 CALL 매개 변수 설정 값으로 사용할 수 없음" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:947 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "윈도우 함수는 COPY FROM WHERE 조건에 사용할 수 없음" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:950 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:973 parser/parse_clause.c:1845 #, 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:1007 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "\"%s\" 윈도우 함수가 없음" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1091 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "너무 많은 그룹핑 세트가 있습니다 (최대값 4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1231 #, 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:1424 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -15796,216 +17410,217 @@ msgstr "" "column \"%s.%s\" 는 반드시 GROUP BY 절내에 있어야 하던지 또는 집계 함수 내에" "서 사용되어져야 한다" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1427 #, 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:1432 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "subquery 가 outer query 에서 그룹화 되지 않은 열인 \"%s.%s\"를 사용합니다" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1596 #, 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:192 #, 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:572 parser/parse_clause.c:600 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:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "다중 칼럼 정의 목록은 같은 함수용으로 허용하지 않음" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:645 #, 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:646 #, c-format msgid "" "Put a separate column definition list for each function inside ROWS FROM()." -msgstr "" +msgstr "ROWS FROM() 안 각 함수용 칼럼 정의 목록을 구분해 주세요." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" -msgstr "" +msgstr "여러 인자를 사용하는 UNNEST()에서는 칼럼 정의 목록을 사용할 수 없습니다." -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:653 #, 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:660 #, 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:661 #, 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 "" +msgstr "하나의 FOR ORDINALITY 칼럼만 허용합니다." -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "\"%s\" 칼럼은 유일성을 가지지 못합니다(not unique)" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "\"%s\" 네임스페이스는 유일성을 가지지 못합니다(not unique)" -#: 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개)" -#: 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:1139 #, 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:1329 #, 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:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "left table 내에 common column 이름 \"%s\" 가 한번 이상 사용되었다" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1353 #, 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:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "common column name \"%s\"가 right table 에 한번 이상 사용되었다" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "USING 조건절에서 지정한 \"%s\" 칼럼이 오른쪽 테이블에 없음" -#: parser/parse_clause.c:1447 -#, c-format -msgid "column alias list for \"%s\" has too many entries" -msgstr " \"%s\" 를 위한 열 alias list 에 너무 많은 entry 가 포함되어 있다" - -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1781 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" -msgstr "" +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:1806 #, 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:1971 #, 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:1999 #, 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:2021 #, c-format msgid "%s position %d is not in select list" msgstr "%s position %d 가 select list 에 포함되어 있지 않습니다" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE 인자로는 12개 이하의 인자만 허용합니다" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "\"%s\" 이름의 윈도우 함수가 이미 정의됨" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "\"%s\" 창의 PARTITION BY 절을 재정의할 수 없음" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2739 #, 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:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "프래임 절이 있어, \"%s\" 윈도우를 복사할 수 없음." -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "OVER 절에 괄호가 빠졌음" -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2797 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "" +"PRECEDING/FOLLOWING 옵셋용 RANGE는 하나의 ORDER BY 칼럼이 필요합니다." -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS 모드는 ORDER BY 구문이 필요함" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:2891 #, c-format msgid "" "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument " @@ -16014,317 +17629,361 @@ msgstr "" "DISTINCT, ORDER BY 표현식을 집계 함수와 쓸 때는, 반드시 select list 에 나타나" "야만 합니다" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "SELECT DISTINCT, ORDER BY 표현식을 위해서 반드시 select list 에 나타나야만 합" "니다" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "DISTINCT 예약어로 집계를 할 경우 적어도 하나의 인자는 있어야 함" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:2925 #, 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:2991 parser/parse_clause.c:3023 #, 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:3101 #, 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:3107 #, 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:3186 #, 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:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "사용예, ON CONFLICT (칼럼이름)." -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT 절은 시스템 카탈로그 테이블에서는 사용할 수 없습니다" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "" "\"%s\" 테이블에는 ON CONFLICT 기능을 사용할 수 없습니다. 이 테이블은 카탈로" "그 테이블로 사용됩니다." -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "%s 연산자는 유효한 순서 지정 연산자가 아님" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3338 #, c-format msgid "" "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "" "순서 지정 연산자는 btree 연산자 패밀리의 \"<\" or \">\" 멤버여야 합니다." -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3649 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE 구문은 칼럼의 %s 자로형을 지원하지 않습니다." -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3655 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s " "and offset type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE 구문은 %s 자료형 칼럼과 %s 옵셋 형식을 " +"지원하지 않습니다." -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." -msgstr "" +msgstr "옵셋 값을 적당한 자료형으로 변환하세요." -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3663 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for " "column type %s and offset type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE 구문이 %s 자료형 칼럼과 " +"%s 옵셋 형식 계산에서 여러 가지로 해석될 수 있습니다." -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3666 #, c-format msgid "Cast the offset value to the exact intended type." -msgstr "" +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:2057 parser/parse_expr.c:2659 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 의 인자는 set(집합) 을 return할수 없습니다." #. 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 "\"anyarray\" 로 선언된 인자들이 모두 같지 않습니다." +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:601 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%s 이름으로 선언된 인자가 array가 아니고, %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:615 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%s 로 선언된 인자가 range 자료형이 아니고, %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:633 utils/fmgr/funcapi.c:698 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "%s 로 선언된 인자가 multirange 자료형이 아니고, %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 자료형을 찾을 수 없음" +"%s 자료형이 anycompatiblerange인데, 해당 %s anycompatible 자료형을 찾을 수 없" +"음" + +#: 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:2242 +#: 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 형 반환 자료형은 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, 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 "" +msgstr "internal 형의 결과는 적어도 하나 이상의 internal 형의 입력 자료형이 필요합니다." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:981 +#: parser/parse_collate.c:1005 #, 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:1008 #, 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:855 #, 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\" 쿼리에 대한 재귀 참조가 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 "\"%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:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "WITH 쿼리 안에 MERGE 구문은 쓸 수 없음" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "\"%s\" WITH 쿼리 이름이 여러 번 지정됨" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:314 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "%s 자료형용 부등식 연산자를 알 수 없음" + +#: parser/parse_cte.c:341 #, 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:390 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -16333,12 +17992,12 @@ msgstr "" "\"%s\" 재귀 쿼리의 %d 번째 칼럼은 비재귀 조건에 %s 자료형을 포함하는데 전체적" "으로는 %s 자료형임" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:396 #, 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:401 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -16347,401 +18006,493 @@ msgstr "" "\"%s\" 재귀 쿼리의 %d 번째 칼럼은 비재귀 조건에 %s 자료형을 포함하는데 전체적" "으로는 %s 자료형임" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." +msgstr "비 재귀형 요소들의 문자 정렬 규칙을 지정할 때는 COLLATE 절을 추가하세요." + +#: parser/parse_cte.c:426 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH 쿼리가 재귀 쿼리 형식이 아님" + +#: parser/parse_cte.c:457 +#, 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:462 +#, 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:477 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "\"%s\" search용 칼럼이 WITH 쿼리 칼럼 목록에 없음" + +#: parser/parse_cte.c:484 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "\"%s\" search용 칼럼을 하나 이상 지정했음" + +#: parser/parse_cte.c:493 +#, c-format +msgid "" +"search sequence column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" 이름의 search sequence 칼럼 이름은 WITH 쿼리 칼럼 목록 안에서 이미 사용되고 있습니다." + +#: parser/parse_cte.c:510 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "\"%s\" cycle용 칼럼이 WITH 쿼리 칼럼 목록에 없습니다" + +#: parser/parse_cte.c:517 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "\"%s\" cycle용 칼럼을 하나 이상 지정했음" + +#: parser/parse_cte.c:526 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" cycle mark 칼럼 이름이 WITH 쿼리 칼럼 목록 안에서 이미 사용되고 있습니다." + +#: parser/parse_cte.c:533 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" cycle path 칼럼 이름이 WITH 쿼리 칼럼 목록 안에서 이미 사용되고 있습니다." + +#: parser/parse_cte.c:541 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "" +"cycle mark 칼럼 이름과 cycle path 칼럼 이름이 같습니다." + +#: parser/parse_cte.c:551 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "" +"search sequence 칼럼 이름과 cycle mark 칼럼 이름이 같습니다." + +#: parser/parse_cte.c:558 +#, c-format +msgid "search sequence column name and cycle path column name are the same" msgstr "" +"search sequence 칼럼 이름과 cycle path 칼럼 이름이 같습니다." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "" "\"%s\" WITH 쿼리에는 %d개의 칼럼을 사용할 수 있는데 %d개의 칼럼이 지정됨" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH 항목 간의 상호 재귀가 구현되지 않음" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "\"%s\" 재귀 쿼리에 자료 변경 구문이 포함될 수 없습니다." -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:882 #, 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:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "재귀 쿼리의 ORDER BY가 구현되지 않음" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "재귀 쿼리의 OFFSET이 구현되지 않음" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "재귀 쿼리의 LIMIT가 구현되지 않음" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:944 #, 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:1001 #, 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:282 #, 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:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "%s.%s 칼럼 없음" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "\"%s\" 칼럼은 %s 자료형을 찾을 수 없음" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "레코드 데이터 형식에서 \"%s\" 칼럼을 식별할 수 없음" -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:359 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "" ".%s 표현이 %s 자료형 사용되었는데, 이는 복소수형 (complex type)이 아닙니다" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:390 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:512 msgid "cannot use column reference in DEFAULT expression" msgstr "DEFAULT 표현식에서는 열 reference를 사용할 수 없음" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:515 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:784 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:840 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:1040 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULIF 절은 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:1046 parser/parse_expr.c:2975 #, 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:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "칼럼의 개수와, values의 개수가 틀립니다" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1477 #, 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:1672 parser/parse_expr.c:2154 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:1735 msgid "cannot use subquery in check constraint" msgstr "체크 제약 조건에서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULT 식에서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "인덱스 식(expression)에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "인덱스 술어(predicate)에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1748 +msgid "cannot use subquery in statistics expression" +msgstr "통계 정보 표현식에 서브쿼리를 사용할 수 없습니다" + +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "transform 식(expression)에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTE 매개 변수로 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "트리거 WHEN 조건절에서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "파티션 범위 표현식에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "파티션 키 표현식에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "CALL 매개 변수로 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "COPY FROM WHERE 조건절에서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "미리 계산된 칼럼 생성 표현식에 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "subquery는 오로지 한개의 열만을 돌려 주어야 합니다." -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "subquery 에가 너무 많은 칼럼을 가집니다" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "subquery 에 명시된 열 수가 너무 적다" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "빈 배열의 자료형을 확인할 수 없음" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:1998 #, 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:2012 #, c-format msgid "could not find element type for data type %s" msgstr "%s 자료형의 요소 자료형을 찾을 수 없음" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2095 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "ROW 표현식은 최대 %d 개의 항목을 지정할 수 있습니다" + +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "이름이 지정되지 않은 XML 속성 값은 열 참조여야 함" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "이름이 지정되지 않은 XML 요소 값은 열 참조여야 함" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "\"%s\" XML 속성 이름이 여러 번 표시됨" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2423 #, 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:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "행 표현식에서 항목 수가 일치하지 않습니다" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "길이가 영(0)인 행들은 비교할 수 없습니다" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" -"행 비교 연산자는 boolean형을 리턴해야합니다. %s 자료형을 사용할 수 없습니다" +"행 비교 연산자는 boolean형을 리턴해야 합니다. %s 자료형을 사용할 수 없습니다" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "행 비교 연산자는 set을 리턴할 수 없습니다" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "%s 행 비교 연산자의 구문을 분석할 수 없습니다" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2835 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "로우 비교 연산자를 btree 연산자 패밀리와 연결해야 함" -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "여러 가지 등식들이 성립할 수 있는 가능성이 있습니다" -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:2969 #, 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 -#, 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 "" +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 "" +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 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개를 쓰고 있습니다." -#: 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 " +"argument." +msgid_plural "" +"There is an ordered-set aggregate %s, but it requires at least %d direct " "arguments." -msgstr "" +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 프로시져는 유일성을 가지지 못합니다(not unique)" -#: 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 " @@ -16750,12 +18501,12 @@ msgstr "" "가장 적당한 프로시져를 선택할 수 없습니다. 명시적 형변환자를 추가해야 할 수" "도 있습니다." -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "함수 %s 는 유일성을 가지지 못합니다(not unique)" -#: 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 " @@ -16764,7 +18515,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 " @@ -16775,12 +18526,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 " @@ -16789,7 +18540,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 " @@ -16798,238 +18549,261 @@ 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\" 함수 이름은 유일성을 가지지 못합니다(not unique)" -#: 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개 이상의 인자를 사용할 수 없음" -#: 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\" 프로시져는 유일성을 가지지 못합니다(not unique)" -#: 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\" 집계 함수가 유일성을 가지지 못합니다(not unique)" -#: 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\" 루틴 이름은 유일성을 가지지 못합니다(not unique)" -#: 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 "집합 반환 함수는 check 제약조건에 사용할 수 없음" -#: 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 "집합 반환 함수는 transform 식에서 사용할 수 없음" -#: 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_merge.c:119 #, c-format -msgid "target lists can have at most %d entries" -msgstr "대상 목록은 최대 %d 개의 항목을 지정할 수 있습니다" +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE 명령에서는 WITH RECURSIVE 구문을 지원하지 않습니다." -#: parser/parse_node.c:235 +#: parser/parse_merge.c:161 #, c-format -msgid "cannot subscript type %s because it is not an array" +msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "" -"자료형 %s 는 배열이 아니기 때문에 배열 하위 스크립트를 기술할 수 없습니다." +"WHEN 조건절 판단을 하지 못하는 상황에서 그 뒤에 오는 조건 검사는 할 수 없습니다." -#: parser/parse_node.c:340 parser/parse_node.c:377 +#: parser/parse_merge.c:191 #, c-format -msgid "array subscript must have type integer" -msgstr "배열 하위 스크립트는 반드시 정수형이어야 합니다." +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE 명령은 룰을 사용하는 릴레이션에서 사용할 수 없습니다." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "\"%s\" 이름이 한번 이상 명시되어 있습니다." + +#: parser/parse_merge.c:210 +#, 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 "postfix 연산자는 지원하지 않습니다" -#: 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 "" "명시적으로 순차연산자(ordering operator) 를 사용하던지, 또는 query 를 수정하" "도록 하세요." -#: 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 " @@ -17038,7 +18812,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 " @@ -17047,7 +18821,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 " @@ -17056,31 +18830,36 @@ 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 (array) 는 우측에 배열이 있어야 합니다." -#: 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) 는 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) 는 set 을 return 하지 않는 연산자가 요구 됩니다." -#: parser/parse_param.c:216 +#: parser/parse_param.c:225 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "inconsistent types deduced for parameter $%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" @@ -17091,17 +18870,17 @@ msgstr "테이블 참조 \"%s\" 가 명확하지 않습니다 (ambiguous)." msgid "table reference %u is ambiguous" msgstr "테이블 참조 %u 가 명확하지 않습니다 (ambiguous)." -#: 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:3599 #, 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:3604 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -17109,37 +18888,42 @@ msgid "" 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 "" +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 "\"%s\" 칼럼은 시스템 칼럼입니다. MERGE WHEN 조건절에서 사용될 수 없음" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, 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." @@ -17147,65 +18931,98 @@ 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 "" +"칼럼 정의 목록이 이름 기반 복합 자료형을 반환하는 함수에서 중복되었음" + +#: parser/parse_relation.c:1791 #, c-format msgid "" "a column definition list is only allowed for functions returning \"record\"" msgstr "" -"열 정의 리스트 (column definition list) 는 오로지 \"record\" 를 리턴하는 함" +"칼럼 정의 목록는 오로지 \"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 "" -"열 정의 리스트(column definition list)는 \"record\" 를 리턴하는 함수를 필요" +"칼럼 정의 목록은 \"record\" 를 리턴하는 함수를 필요" "로 합니다" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1839 +#, c-format +msgid "column definition lists can have at most %d entries" +msgstr "칼럼 정의 목록은 최대 %d 개의 항목을 지정할 수 있습니다" + +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "FROM 절 내의 함수 \"%s\" 에 지원되지 않는 return 자료형 %s 이 있습니다." -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#, c-format +msgid "functions in FROM can return at most %d columns" +msgstr "FROM 절에 쓰는 함수는 최대 %d개의 칼럼을 반환하는 것이여야 함" + +#: parser/parse_relation.c:2049 +#, c-format +msgid "%s function has %d columns available but %d columns specified" +msgstr "" +"%s 함수는 %d 개의 칼럼을 반환하는데, %d 개의 칼럼만 명시되었습니다." + +#: parser/parse_relation.c:2138 #, 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:2210 #, c-format msgid "joins can have at most %d columns" msgstr "조인에는 최대 %d개의 칼럼을 포함할 수 있음" #: parser/parse_relation.c:2235 #, c-format -msgid "WITH query \"%s\" does not have a RETURNING clause" +msgid "" +"join expression \"%s\" has %d columns available but %d columns specified" msgstr "" +"\"%s\" 조인식에는 %d 개의 칼럼이 있는데, %d 개의 칼럼만 명시되었습니다." -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:2330 #, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "%d번째 칼럼이 없습니다. 해당 릴레이션: \"%s\"" +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "\"%s\" WITH 쿼리에 RETURNING 절이 없습니다." -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "아 \"%s\" alias를 참조해야 할 것 같습니다." -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "테이블 \"%s\"에 FROM 절이 빠져 있습니다." -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "아마 \"%s.%s\" 칼럼을 참조하는 것 같습니다." -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3664 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -17214,33 +19031,33 @@ msgstr "" "\"%s\" 이름의 칼럼이 \"%s\" 테이블에 있지만, 이 쿼리의 이 부분에서는 참조될 " "수 없습니다." -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3681 #, 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 " @@ -17249,7 +19066,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 " @@ -17258,19 +19075,20 @@ 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\" subscript 자료형은 %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 * 구문은 유효하지 않습니다." @@ -17292,8 +19110,8 @@ msgstr "" msgid "type reference %s converted to %s" msgstr "ype reference %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\" 는 오로지 shell 에만 있습니다. " @@ -17303,203 +19121,212 @@ msgstr "자료형 \"%s\" 는 오로지 shell 에만 있습니다. " 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:264 +#: parser/parse_utilcmd.c:266 #, 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\" serial 열 때문)" - -#: parser/parse_utilcmd.c:559 +#: parser/parse_utilcmd.c:582 #, c-format msgid "array of serial is not implemented" msgstr "serial 배열이 구현되지 않음" -#: parser/parse_utilcmd.c:637 parser/parse_utilcmd.c:649 +#: parser/parse_utilcmd.c:661 parser/parse_utilcmd.c:673 +#: parser/parse_utilcmd.c:732 #, c-format msgid "" "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "NULL/NOT NULL 선언이 서로 충돌합니다 : column \"%s\" of table \"%s\"" -#: parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:685 #, 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:702 #, c-format msgid "identity columns are not supported on typed tables" msgstr "" "식별 칼럼은 타입드 테이블(typed table - 자료형으로써 테이블)에서는 쓸 수 없음" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:706 #, c-format msgid "identity columns are not supported on partitions" msgstr "식별 칼럼은 파티션된 테이블에서는 사용할 수 없음" -#: parser/parse_utilcmd.c:691 +#: parser/parse_utilcmd.c:715 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" 테이블)에 대해 여러 개의 식별자 지정이 사용되었음" -#: parser/parse_utilcmd.c:711 +#: parser/parse_utilcmd.c:745 #, c-format msgid "generated columns are not supported on typed tables" msgstr "" "미리 계산된 칼럼은 타입드 테이블(typed table - 자료형으로써 테이블)에서는 쓸 " "수 없음" -#: parser/parse_utilcmd.c:715 +#: parser/parse_utilcmd.c:749 #, c-format msgid "generated columns are not supported on partitions" msgstr "미리 계산된 칼럼은 파티션된 테이블에서는 사용할 수 없음" -#: parser/parse_utilcmd.c:720 +#: parser/parse_utilcmd.c:754 #, 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:772 parser/parse_utilcmd.c:887 #, 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:781 parser/parse_utilcmd.c:897 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "유니크 제약 조건은 외부 테이블에서는 사용할 수 없음" -#: parser/parse_utilcmd.c:792 +#: parser/parse_utilcmd.c:826 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" 테이블)에 대해 default와 식별자 정의가 함께 있음" -#: parser/parse_utilcmd.c:800 +#: parser/parse_utilcmd.c:834 #, c-format msgid "" "both default and generation expression specified for column \"%s\" of table " "\"%s\"" -msgstr "\"%s\" 칼럼(해당 테이블 \"%s\")에 대해 default 정의와 미리 계산된 표현식이 함께 있음" +msgstr "" +"\"%s\" 칼럼(해당 테이블 \"%s\")에 대해 default 정의와 미리 계산된 표현식이 함" +"께 있음" -#: parser/parse_utilcmd.c:808 +#: parser/parse_utilcmd.c:842 #, c-format msgid "" "both identity and generation expression specified for column \"%s\" of table " "\"%s\"" -msgstr "\"%s\" 칼럼(해당 테이블 \"%s\")에 대해 identity 정의와 미리 계산된 표현식이 함께 있음" +msgstr "" +"\"%s\" 칼럼(해당 테이블 \"%s\")에 대해 identity 정의와 미리 계산된 표현식이 " +"함께 있음" -#: parser/parse_utilcmd.c:873 +#: parser/parse_utilcmd.c:907 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "제외 제약 조건은 외부 테이블에서는 사용할 수 없음" -#: parser/parse_utilcmd.c:879 +#: parser/parse_utilcmd.c:913 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "제외 제약 조건은 파티션된 테이블에서는 사용할 수 없음" -#: parser/parse_utilcmd.c:944 +#: parser/parse_utilcmd.c:978 #, 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:991 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "\"%s\" 릴레이션은 LIKE 절에서 바르지 않음" + +#: parser/parse_utilcmd.c:1757 parser/parse_utilcmd.c:1865 #, c-format msgid "Index \"%s\" contains a whole-row table reference." -msgstr "" +msgstr "\"%s\" 인덱스는 전체 로우 테이블 참조를 포함하고 있습니다." -#: parser/parse_utilcmd.c:2163 +#: parser/parse_utilcmd.c:2254 #, c-format msgid "cannot use an existing index in CREATE TABLE" -msgstr "" +msgstr "CREATE TABLE 명령에서 이미 있는 인덱스는 사용할 수 없습니다." -#: parser/parse_utilcmd.c:2183 +#: parser/parse_utilcmd.c:2274 #, c-format msgid "index \"%s\" is already associated with a constraint" -msgstr "" +msgstr "\"%s\" 인덱스는 이미 한 제약 조건에서 사용 중입니다." -#: parser/parse_utilcmd.c:2198 +#: parser/parse_utilcmd.c:2289 #, c-format msgid "index \"%s\" is not valid" msgstr "\"%s\" 인덱스는 사용가능 상태가 아님" -#: parser/parse_utilcmd.c:2204 +#: parser/parse_utilcmd.c:2295 #, 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:2296 parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2310 parser/parse_utilcmd.c:2387 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." -msgstr "" +msgstr "이 인덱스를 이용하는 기본키나 유니크 제약조건은 만들 수 없습니다." -#: parser/parse_utilcmd.c:2211 +#: parser/parse_utilcmd.c:2302 #, c-format msgid "index \"%s\" contains expressions" msgstr "\"%s\" 인덱스에 표현식이 포함되어 있음" -#: parser/parse_utilcmd.c:2218 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" 개체는 부분 인덱스임" -#: parser/parse_utilcmd.c:2230 +#: parser/parse_utilcmd.c:2321 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" 개체는 지연가능한 인덱스임" -#: parser/parse_utilcmd.c:2231 +#: parser/parse_utilcmd.c:2322 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." -msgstr "" +msgstr "지연 가능한 인덱스를 사용해서 지연 불가능한 제약 조건은 만들 수 없습니다." -#: parser/parse_utilcmd.c:2295 +#: parser/parse_utilcmd.c:2386 #, 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:2543 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "기본키 제약 조건에서 \"%s\" 칼럼이 두 번 지정되었습니다" -#: parser/parse_utilcmd.c:2458 +#: parser/parse_utilcmd.c:2549 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "고유 제약 조건에서 \"%s\" 칼럼이 두 번 지정되었습니다" -#: parser/parse_utilcmd.c:2811 +#: parser/parse_utilcmd.c:2896 #, 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:2968 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "통계 정보 식은 참조되는 테이블만 대상이어야 함" + +#: parser/parse_utilcmd.c:3011 #, c-format msgid "rules on materialized views are not supported" msgstr "구체화된 뷰에서의 룰은 지원하지 않음" -#: parser/parse_utilcmd.c:2920 +#: parser/parse_utilcmd.c:3074 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "룰에서 지정한 WHERE 조건에 다른 릴레이션에 대한 참조를 포함할 수 없음" -#: parser/parse_utilcmd.c:2994 +#: parser/parse_utilcmd.c:3147 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -17508,232 +19335,241 @@ 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:3165 parser/parse_utilcmd.c:3266 +#: rewrite/rewriteHandler.c:530 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "conditional UNION/INTERSECT/EXCEPT 구문은 구현되어 있지 않다" -#: parser/parse_utilcmd.c:3030 +#: parser/parse_utilcmd.c:3183 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECT 룰은 OLD를 사용할 수 없음" -#: parser/parse_utilcmd.c:3034 +#: parser/parse_utilcmd.c:3187 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECT 룰은 NEW를 사용할 수 없음" -#: parser/parse_utilcmd.c:3043 +#: parser/parse_utilcmd.c:3196 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERT 룰은 OLD를 사용할 수 없음" -#: parser/parse_utilcmd.c:3049 +#: parser/parse_utilcmd.c:3202 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETE 룰은 NEW를 사용할 수 없음" -#: parser/parse_utilcmd.c:3077 +#: parser/parse_utilcmd.c:3230 #, c-format msgid "cannot refer to OLD within WITH query" -msgstr "" +msgstr "WITH 쿼리 안에서 OLD 예약어를 참조할 수 없습니다." -#: parser/parse_utilcmd.c:3084 +#: parser/parse_utilcmd.c:3237 #, c-format msgid "cannot refer to NEW within WITH query" -msgstr "" +msgstr "WITH 쿼리 안에서 NEW 예약어를 참조할 수 없습니다." -#: parser/parse_utilcmd.c:3542 +#: parser/parse_utilcmd.c:3691 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERABLE 절이 잘못 놓여져 있습니다" -#: parser/parse_utilcmd.c:3547 parser/parse_utilcmd.c:3562 +#: parser/parse_utilcmd.c:3696 parser/parse_utilcmd.c:3711 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "여러 개의 DEFERRABLE/NOT DEFERRABLE절은 사용할 수 없습니다" -#: parser/parse_utilcmd.c:3557 +#: parser/parse_utilcmd.c:3706 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERABLE 절이 잘못 놓여 있습니다" -#: parser/parse_utilcmd.c:3570 parser/parse_utilcmd.c:3596 gram.y:5593 +#: parser/parse_utilcmd.c:3719 parser/parse_utilcmd.c:3745 gram.y:5937 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERRED 로 선언된 조건문은 반드시 DEFERABLE 여야만 한다" -#: parser/parse_utilcmd.c:3578 +#: parser/parse_utilcmd.c:3727 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED 절이 잘못 놓여 있습니다" -#: parser/parse_utilcmd.c:3583 parser/parse_utilcmd.c:3609 +#: parser/parse_utilcmd.c:3732 parser/parse_utilcmd.c:3758 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "여러 개의 INITIALLY IMMEDIATE/DEFERRED 절은 허용되지 않습니다" -#: parser/parse_utilcmd.c:3604 +#: parser/parse_utilcmd.c:3753 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE 절이 잘못 놓여 있습니다" -#: parser/parse_utilcmd.c:3795 +#: parser/parse_utilcmd.c:3944 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE 구문에 명시된 schema (%s) 가 생성된 (%s) 의 것과 다릅니다" -#: parser/parse_utilcmd.c:3830 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" 개체는 파티션된 테이블이 아님" -#: parser/parse_utilcmd.c:3837 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "\"%s\" 테이블은 파티션되어 있지 않음" -#: parser/parse_utilcmd.c:3844 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "\"%s\" 인덱스는 파티션 된 인덱스가 아님" -#: parser/parse_utilcmd.c:3884 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "해시 파티션된 테이블은 기본 파티션을 가질 수 없음" -#: parser/parse_utilcmd.c:3901 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "해시 파티션용 범위 명세가 잘못됨" -#: parser/parse_utilcmd.c:3907 partitioning/partbounds.c:4691 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, 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:3914 partitioning/partbounds.c:4699 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "해시 파티션용 나머지 처리기는 modulus 보다 작아야 함" -#: parser/parse_utilcmd.c:3927 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "list 파티션을 위한 범위 설정이 잘못됨" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "range 파티션을 위한 범위 설정이 잘못됨" -#: parser/parse_utilcmd.c:3986 +#: parser/parse_utilcmd.c:4135 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM에는 파티션 칼럼 당 딱 하나의 값만 지정해야 함" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:4139 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO에는 파티션 칼럼 당 딱 하나의 값만 지정해야 함" -#: parser/parse_utilcmd.c:4104 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "range 범위에는 NULL 값을 사용할 수 없음" -#: parser/parse_utilcmd.c:4153 +#: parser/parse_utilcmd.c:4302 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "" +"MAXVALUE 뒤에 오는 모든 범위는 MAXVALUE 여야합니다." -#: parser/parse_utilcmd.c:4160 +#: parser/parse_utilcmd.c:4309 #, 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:4352 #, 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 "" +msgstr "UESCAPE 표현식은 앞에 한글자만 있어야합니다." -#: parser/parser.c:233 +#: parser/parser.c:252 msgid "invalid Unicode escape character" msgstr "잘못된 유니코드 이스케이프 문자" -#: parser/parser.c:302 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "잘못된 유니코드 이스케이프 값" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6529 scan.l:684 #, c-format msgid "invalid Unicode escape" msgstr "잘못된 유니코드 이스케이프 값" -#: parser/parser.c:450 +#: parser/parser.c:469 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "유니코드 이스케이프는 \\XXXX 또는 \\+XXXXXX 형태여야 합니다." -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6554 scan.l:645 scan.l:661 +#: scan.l:677 #, c-format msgid "invalid Unicode surrogate pair" msgstr "잘못된 유니코드 대리 쌍" -#: 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:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "\"%s\" 파티션이 \"%s\" 기본 파티션과 겹칩니다." -#: partitioning/partbounds.c:2890 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, c-format msgid "" "every hash partition modulus must be a factor of the next larger modulus" msgstr "" +"모든 해시 파티션 구분값은 최대값보다 작아야합니다." -#: partitioning/partbounds.c:2986 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, c-format -msgid "empty range bound specified for partition \"%s\"" +msgid "" +"The new modulus %d is not a factor of %d, the modulus of existing partition " +"\"%s\"." +msgstr "" +"새 해시 파티션 구분값(나머지값) %d 값은 %d의 인수가 아닙니다. 이미 있는 " +"\"%s\" 하위 파티션은 이 값을 구분값으로 사용합니다." + +#: partitioning/partbounds.c:3005 +#, 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:3140 +#, c-format +msgid "empty range bound specified for partition \"%s\"" +msgstr "\"%s\" 파티션용 범위 지정이 비어있습니다." -#: partitioning/partbounds.c:2988 +#: partitioning/partbounds.c:3142 #, 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:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "\"%s\" 파티션이 \"%s\" 파티션과 겹칩니다." -#: partitioning/partbounds.c:3202 +#: partitioning/partbounds.c:3371 #, c-format msgid "" "skipped scanning foreign table \"%s\" which is a partition of default " @@ -17742,47 +19578,57 @@ msgstr "" "\"%s\" 외부 테이블 탐색은 생략함, 이 테이블은 \"%s\" 기본 파티션 테이블의 파" "티션이기 때문" -#: partitioning/partbounds.c:4695 +#: partitioning/partbounds.c:4828 #, 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보다 크거나 같은 정수값이어야 함" -#: partitioning/partbounds.c:4722 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" 개체는 해시 파티션된 테이블이 아님" -#: partitioning/partbounds.c:4733 partitioning/partbounds.c:4850 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, 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:4885 +#, 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:4917 #, 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: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\" 데이터 디렉터리 상태를 파악할 수 없음: %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 " @@ -17795,7 +19641,7 @@ msgstr "" "값보다 크거나, 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 " @@ -17808,7 +19654,7 @@ msgstr "" "큰 경우 발생합니다. 커널 환경 변수인 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 " @@ -17824,12 +19670,12 @@ msgstr "" "확보하세요.\n" "공유 메모리 설정에 대한 보다 자세한 내용은 PostgreSQL 문서를 참조하십시오." -#: 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 "가용 공유 메모리 확보 실패: %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 " @@ -17842,21 +19688,26 @@ msgstr "" "여 보십시오. 줄이는 방법은, shared_buffers 값을 줄이거나 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 "huge page 기능은 이 플랫폼에서 지원되지 않음" -#: 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 "현재 shared_memory_type 설정은 huge page 사용을 지원하지 않습니다." + +#: 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 키, %lu ID)이 여전히 사용중입니다" -#: 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 "" +msgstr "\"%s\" 데이터 디렉터리를 사용하는 옛 서버 프로세스들을 모두 중지시키세요." #: port/sysv_sema.c:124 #, c-format @@ -17898,38 +19749,38 @@ msgstr "" "커널의 SEMVMX 값을 적어도 %d 정도로 늘려야할 필요가 있는 것 같습니다. 자세" "한 것은 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 "" +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 "" +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 "%d pid를 위한 시그널 리슨너 파이프를 만들 수 없음: 오류 번호 %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" @@ -17954,169 +19805,164 @@ msgstr "세마포어 잠금을 해제할 수 없음: 오류 번호 %lu" 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 "Lock pages in memory" -#: 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" +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\" 권한을 부여하세요." -#: 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:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "autovacuum 실행기 프로세스를 실행할 수 없음: %m" -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "autovacuum 실행기가 시작됨" - -#: postmaster/autovacuum.c:839 +#: postmaster/autovacuum.c:752 #, c-format -msgid "autovacuum launcher shutting down" -msgstr "autovacuum 실행기를 종료하는 중" +msgid "autovacuum worker took too long to start; canceled" +msgstr "autovacuum 작업자가 너무 오래전에 시작되어 중지됨" -#: postmaster/autovacuum.c:1477 +#: postmaster/autovacuum.c:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "autovacuum 작업자 프로세스를 실행할 수 없음: %m" -#: postmaster/autovacuum.c:1686 -#, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "autovacuum: \"%s\" 데이터베이스 처리 중" - -#: postmaster/autovacuum.c:2256 +#: postmaster/autovacuum.c:2265 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "" "autovacuum: 더 이상 사용하지 않는 \"%s.%s.%s\" 임시 테이블을 삭제하는 중" -#: postmaster/autovacuum.c:2485 +#: postmaster/autovacuum.c:2490 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" 테이블 대상으로 자동 vacuum 작업 함" -#: postmaster/autovacuum.c:2488 +#: postmaster/autovacuum.c:2493 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" 테이블 자동 분석" -#: postmaster/autovacuum.c:2681 +#: postmaster/autovacuum.c:2686 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" 릴레이션 작업 항목 작업 중" -#: postmaster/autovacuum.c:3285 +#: postmaster/autovacuum.c:3297 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "서버 설정 정보가 잘못되어 자동 청소 작업이 실행되지 못했습니다." -#: postmaster/autovacuum.c:3286 +#: postmaster/autovacuum.c:3298 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\" 옵션을 사용하십시오." -#: postmaster/bgworker.c:394 postmaster/bgworker.c:841 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "" - -#: postmaster/bgworker.c:426 +#: postmaster/bgworker.c:256 #, c-format -msgid "unregistering background worker \"%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" +"background worker \"%s\": background workers 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:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "관리자 명령에 의해 \"%s\" 백그라운드 작업자를 종료합니다." -#: postmaster/bgworker.c:849 +#: postmaster/bgworker.c:887 #, c-format msgid "" "background worker \"%s\": must be registered in shared_preload_libraries" @@ -18124,7 +19970,7 @@ msgstr "" "\"%s\" 백그라운드 작업자: 먼저 shared_preload_libraries 설정값으로 등록되어" "야 합니다." -#: postmaster/bgworker.c:861 +#: postmaster/bgworker.c:899 #, c-format msgid "" "background worker \"%s\": only dynamic background workers can request " @@ -18132,66 +19978,57 @@ msgid "" msgstr "" "\"%s\" 백그라운드 작업자: 동적 백그라운드 작업자만 알림을 요청할 수 있음" -#: postmaster/bgworker.c:876 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "백그라운드 작업자가 너무 많음" -#: 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] "현재 설정으로는 %d개의 백그라운드 작업자를 사용할 수 있습니다." -#: postmaster/bgworker.c:881 +#: 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초 간격)" -#: 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 +#: postmaster/pgarch.c:423 #, c-format -msgid "compacted fsync request queue from %d entries to %d entries" +msgid "archive_mode enabled, yet archiving is not configured" msgstr "" +"archive_mode가 활성화 되었는데 아카이브 관련 세부 설정이 되어있지 않음" -#: postmaster/pgarch.c:155 -#, c-format -msgid "could not fork archiver: %m" -msgstr "archiver 할당(fork) 실패: %m" - -#: postmaster/pgarch.c:425 -#, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode가 사용 설정되었는데 archive_command가 설정되지 않음" - -#: postmaster/pgarch.c:447 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "필요 없는 \"%s\" 아카이브 상태 파일이 삭제됨" -#: postmaster/pgarch.c:457 +#: postmaster/pgarch.c:455 #, c-format msgid "" "removal of orphan archive status file \"%s\" failed too many times, will try " @@ -18200,7 +20037,7 @@ msgstr "" "필요 없는 \"%s\" 아카이브 상태 파일 삭제 작업이 계속 실패하고 있습니다. 다음" "에 또 시도할 것입니다." -#: postmaster/pgarch.c:493 +#: postmaster/pgarch.c:491 #, c-format msgid "" "archiving write-ahead log file \"%s\" failed too many times, will try again " @@ -18209,190 +20046,39 @@ msgstr "" "\"%s\" 트랜잭션 로그 파일 아카이브 작업이 계속 실패하고 있습니다. 다음에 또 " "시도할 것입니다." -#: postmaster/pgarch.c:594 -#, 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 -#, c-format -msgid "The failed archive command was: %s" -msgstr "실패한 아카이브 명령: %s" - -#: postmaster/pgarch.c:603 -#, 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:798 #, c-format msgid "" -"See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "16진수 값에 대한 설명은 C 포함 파일 \"ntstatus.h\"를 참조하십시오." - -#: postmaster/pgarch.c:610 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "%d번 시그널로 인해 아카이브 명령이 종료됨: %s" - -#: postmaster/pgarch.c:619 -#, 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\" 이름의 호스트 IP를 구할 수 없습니다: %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 "통계 수집기에서 사용할 소켓과 bind할 수 없습니다: %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" +"restarting archiver process because value of \"archive_library\" was changed" msgstr "" -"통계 수집기에서 사용하는 소켓 모드를 nonblocking 모드로 지정할 수 없습니다: " -"%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:4561 -#, c-format -msgid "could not read statistics message: %m" -msgstr "통계 메시지를 읽을 수 없음: %m" - -#: postmaster/pgstat.c:4883 postmaster/pgstat.c:5046 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파일을 열 수 없음: %m" - -#: postmaster/pgstat.c:4956 postmaster/pgstat.c:5091 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파일에 쓰기 실패: %m" - -#: postmaster/pgstat.c:4965 postmaster/pgstat.c:5100 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파일을 닫을 수 없습니다: %m" - -#: postmaster/pgstat.c:4973 postmaster/pgstat.c:5108 -#, 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 -#, 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 -#, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "\"%s\" 통계 파일이 손상되었음" +"\"archive_library\" 설정값이 바뀌어서 archiver 프로세스를 다시 시작 합니다." -#: postmaster/pgstat.c:5799 +#: postmaster/pgarch.c:831 #, c-format -msgid "" -"using stale statistics instead of current ones because stats collector is " -"not responding" -msgstr "" -"현재 통계 수집기가 반응하지 않아 부정확한 통계정보가 사용되고 있습니다." +msgid "archive modules have to define the symbol %s" +msgstr "아카이브 모듈은 %s 심볼을 정의해야합니다." -#: postmaster/pgstat.c:6129 +#: postmaster/pgarch.c:837 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "정리하는 동안 데이터베이스 해시 테이블이 손상 되었습니다 --- 중지함" +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: -f 옵션의 잘못된 인자: \"%s\"\n" -#: postmaster/postmaster.c:819 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -t 옵션의 잘못된 인자: \"%s\"\n" -#: postmaster/postmaster.c:870 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 잘못된 인자: \"%s\"\n" -#: postmaster/postmaster.c:912 +#: postmaster/postmaster.c:942 #, c-format msgid "" "%s: superuser_reserved_connections (%d) must be less than max_connections " @@ -18401,12 +20087,12 @@ msgstr "" "%s: superuser_reserved_connections (%d) 값은 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_level 값이 \"minimal\"일 때는 아카이브 작업을 할 수 없습니다." -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:952 #, c-format msgid "" "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or " @@ -18415,93 +20101,97 @@ msgstr "" "WAL 스트리밍 작업(max_wal_senders > 0 인경우)은 wal_level 값이 \"replica\" 또" "는 \"logical\" 이어야 합니다." -#: postmaster/postmaster.c:930 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: 잘못된 datetoken 테이블들, 복구하십시오.\n" -#: postmaster/postmaster.c:1047 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "하위 대기열에 대해 I/O 완료 포트를 만들 수 없음" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1178 #, c-format msgid "ending log output to stderr" msgstr "stderr 쪽 로그 출력을 중지합니다." -#: postmaster/postmaster.c:1114 +#: postmaster/postmaster.c:1179 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "자세한 로그는 \"%s\" 쪽으로 기록됩니다." -#: postmaster/postmaster.c:1125 +#: postmaster/postmaster.c:1190 #, c-format msgid "starting %s" -msgstr "" - -#: postmaster/postmaster.c:1154 postmaster/postmaster.c:1252 -#: utils/init/miscinit.c:1597 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "\"%s\" 매개 변수 구문이 잘못 되었습니다" +msgstr "%s 서버를 시작합니다." -#: postmaster/postmaster.c:1185 +#: postmaster/postmaster.c:1250 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\" 응당 소켓을 만들 수 없습니다" -#: postmaster/postmaster.c:1191 +#: postmaster/postmaster.c:1256 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IP 소켓을 만들 수 없습니다." -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1288 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister() 실패: 오류 코드 %ld" + +#: postmaster/postmaster.c:1340 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "\"%s\" 디렉터리에 유닉스 도메인 소켓을 만들 수 없습니다" -#: postmaster/postmaster.c:1280 +#: postmaster/postmaster.c:1346 #, c-format msgid "could not create any Unix-domain sockets" msgstr "유닉스 도메인 소켓을 만들 수 없습니다" -#: postmaster/postmaster.c:1292 +#: postmaster/postmaster.c:1358 #, c-format msgid "no socket created for listening" msgstr "서버 접속 대기 작업을 위한 소켓을 만들 수 없음" -#: postmaster/postmaster.c:1323 +#: postmaster/postmaster.c:1389 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: \"%s\" 외부 PID 파일의 접근 권한을 바꿀 수 없음: %s\n" -#: postmaster/postmaster.c:1327 +#: postmaster/postmaster.c:1393 #, 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:1420 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "pg_hba.conf를 로드할 수 없음" -#: postmaster/postmaster.c:1386 +#: postmaster/postmaster.c:1446 #, c-format msgid "postmaster became multithreaded during startup" -msgstr "" +msgstr "포스트마스터가 시작하면서 멀티쓰레드 환경이 되었습니다." -#: postmaster/postmaster.c:1387 +#: postmaster/postmaster.c:1447 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL 환경 설정값으로 알맞은 로케일 이름을 지정하세요." -#: postmaster/postmaster.c:1488 +#: postmaster/postmaster.c:1548 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: 실행 가능 경로를 확정할 수 없음" + +#: postmaster/postmaster.c:1555 #, 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:1578 utils/misc/tzparser.c:340 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -18510,7 +20200,7 @@ msgstr "" "이 문제는 PostgreSQL 설치가 불완전하게 되었거나, \"%s\" 파일이 올바른 위치에 " "있지 않아서 발생했습니다." -#: postmaster/postmaster.c:1538 +#: postmaster/postmaster.c:1605 #, c-format msgid "" "%s: could not find the database system\n" @@ -18521,640 +20211,591 @@ msgstr "" "\"%s\" 디렉터리 안에 해당 자료가 있기를 기대했는데,\n" "\"%s\" 파일을 열 수가 없었습니다: %s\n" -#: postmaster/postmaster.c:1715 +#: postmaster/postmaster.c:1782 #, c-format msgid "select() failed in postmaster: %m" msgstr "postmaster에서 select() 작동 실패: %m" -#: postmaster/postmaster.c:1870 +#: postmaster/postmaster.c:1913 +#, c-format +msgid "issuing SIGKILL to recalcitrant children" +msgstr "정상 종료되지 않는 하위 프로세스로 SIGKILL 신호 보냅니다." + +#: postmaster/postmaster.c:1934 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" -msgstr "" +msgstr "데이터 디렉터리 잠금 파일이 잘못되어 즉시 종료 작업을 진행합니다." -#: postmaster/postmaster.c:1973 postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 #, c-format msgid "incomplete startup packet" msgstr "아직 완료되지 않은 시작 패킷" -#: postmaster/postmaster.c:1985 +#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 #, c-format msgid "invalid length of startup packet" msgstr "시작 패킷의 길이가 잘못 되었습니다" -#: postmaster/postmaster.c:2043 +#: postmaster/postmaster.c:2111 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSL 연결 작업에 오류가 발생했습니다: %m" -#: postmaster/postmaster.c:2074 +#: postmaster/postmaster.c:2129 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "SSL 요청 뒤에 암호화 되지 않은 데이터를 받았음" + +#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 +#, c-format +msgid "" +"This could be either a client-software bug or evidence of an attempted man-" +"in-the-middle attack." +msgstr "" +"이 현상은 클라이언트 소프트웨어 버그이거나, 중간자 공격으로 발생했을 것입니다." + +#: postmaster/postmaster.c:2155 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPI 협상 응답을 보내지 못했습니다: %m" -#: postmaster/postmaster.c:2104 +#: postmaster/postmaster.c:2173 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "GSSAPI 암호화 요청 뒤에 암호화 되지 않은 데이터를 받았습니다." + +#: postmaster/postmaster.c:2197 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "" "지원하지 않는 frontend 프로토콜 %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:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11970 +#: utils/misc/guc.c:12011 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "잘못된 \"%s\" 매개 변수의 값: \"%s\"" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:2264 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "" +msgstr "사용할 수 있는 값: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2216 +#: postmaster/postmaster.c:2309 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "잘못된 시작 패킷 레이아웃: 마지막 바이트로 종결문자가 발견되었음" -#: postmaster/postmaster.c:2254 +#: postmaster/postmaster.c:2326 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "시작 패킷에서 지정한 사용자는 PostgreSQL 사용자 이름이 아닙니다" -#: postmaster/postmaster.c:2318 +#: postmaster/postmaster.c:2390 #, c-format msgid "the database system is starting up" msgstr "데이터베이스 시스템이 새로 가동 중입니다." -#: postmaster/postmaster.c:2323 +#: postmaster/postmaster.c:2396 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "해당 데이터베이스 시스템은 아직 접속을 허용하지 않습니다." + +#: postmaster/postmaster.c:2397 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "일관성 복원 작업을 아직 끝내지 못했습니다." + +#: postmaster/postmaster.c:2401 +#, c-format +msgid "the database system is not accepting connections" +msgstr "해당 데이터베이스 시스템은 접속을 허용하지 않습니다." + +#: postmaster/postmaster.c:2402 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Hot standby 모드가 비활성화 되었습니다." + +#: postmaster/postmaster.c:2407 #, c-format msgid "the database system is shutting down" msgstr "데이터베이스 시스템이 중지 중입니다" -#: postmaster/postmaster.c:2328 +#: postmaster/postmaster.c:2412 #, 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:2417 storage/ipc/procarray.c:493 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "최대 동시 접속자 수를 초과했습니다." -#: postmaster/postmaster.c:2423 +#: postmaster/postmaster.c:2504 #, c-format msgid "wrong key in cancel request for process %d" msgstr "프로세스 %d에 대한 취소 요청에 잘못된 키가 있음" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:2516 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "취소 요청의 PID %d과(와) 일치하는 프로세스가 없음" -#: postmaster/postmaster.c:2706 +#: postmaster/postmaster.c:2770 #, 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:2794 postmaster/postmaster.c:2798 #, c-format msgid "%s was not reloaded" msgstr "%s 파일을 다시 불러오지 않았음" -#: postmaster/postmaster.c:2746 +#: postmaster/postmaster.c:2808 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL 설정이 다시 로드되지 않았음" -#: postmaster/postmaster.c:2802 +#: postmaster/postmaster.c:2864 #, c-format msgid "received smart shutdown request" msgstr "smart 중지 요청을 받았습니다." -#: postmaster/postmaster.c:2848 +#: postmaster/postmaster.c:2905 #, c-format msgid "received fast shutdown request" msgstr "fast 중지 요청을 받았습니다." -#: postmaster/postmaster.c:2866 +#: postmaster/postmaster.c:2923 #, c-format msgid "aborting any active transactions" msgstr "모든 활성화 되어있는 트랜잭션을 중지하고 있습니다." -#: postmaster/postmaster.c:2890 +#: postmaster/postmaster.c:2947 #, c-format msgid "received immediate shutdown request" msgstr "immediate 중지 요청을 받았습니다." -#: postmaster/postmaster.c:2965 +#: postmaster/postmaster.c:3024 #, c-format msgid "shutdown at recovery target" msgstr "복구 타겟에서 중지함" -#: postmaster/postmaster.c:2983 postmaster/postmaster.c:3019 +#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 msgid "startup process" msgstr "시작 프로세스" -#: postmaster/postmaster.c:2986 +#: postmaster/postmaster.c:3045 #, c-format msgid "aborting startup due to startup process failure" msgstr "시작 프로세스 실패 때문에 서버 시작이 중지 되었습니다" -#: postmaster/postmaster.c:3061 +#: postmaster/postmaster.c:3118 #, c-format msgid "database system is ready to accept connections" msgstr "이제 데이터베이스 서버로 접속할 수 있습니다" -#: postmaster/postmaster.c:3082 +#: postmaster/postmaster.c:3139 msgid "background writer process" msgstr "백그라운드 writer 프로세스" -#: postmaster/postmaster.c:3136 +#: postmaster/postmaster.c:3186 msgid "checkpointer process" msgstr "체크포인트 프로세스" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3202 msgid "WAL writer process" msgstr "WAL 쓰기 프로세스" -#: postmaster/postmaster.c:3167 +#: postmaster/postmaster.c:3217 msgid "WAL receiver process" msgstr "WAL 수신 프로세스" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:3232 msgid "autovacuum launcher process" msgstr "autovacuum 실행기 프로세스" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:3250 msgid "archiver process" msgstr "archiver 프로세스" -#: postmaster/postmaster.c:3213 -msgid "statistics collector process" -msgstr "통계 수집기 프로세스" - -#: postmaster/postmaster.c:3227 +#: postmaster/postmaster.c:3263 msgid "system logger process" msgstr "시스템 로그 프로세스" -#: postmaster/postmaster.c:3291 +#: postmaster/postmaster.c:3327 #, 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:3406 postmaster/postmaster.c:3426 +#: postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 msgid "server process" msgstr "서버 프로세스" -#: postmaster/postmaster.c:3474 +#: postmaster/postmaster.c:3505 #, 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:3742 #, 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:3744 postmaster/postmaster.c:3756 +#: postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 #, c-format msgid "Failed process was running: %s" -msgstr "" +msgstr "프로세스 실행 실패: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3740 +#: postmaster/postmaster.c:3753 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) 프로세스가 0x%X 예외로 인해 종료됨" +#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 +#, 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:3750 +#: postmaster/postmaster.c:3763 #, 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:3775 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) 프로세스가 인식할 수 없는 %d 상태로 종료됨" -#: postmaster/postmaster.c:3970 +#: postmaster/postmaster.c:3975 #, c-format msgid "abnormal database system shutdown" msgstr "비정상적인 데이터베이스 시스템 서비스를 중지" -#: postmaster/postmaster.c:4010 +#: postmaster/postmaster.c:4001 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "시작 작업 실패로 중지합니다." + +#: postmaster/postmaster.c:4007 +#, c-format +msgid "shutting down because restart_after_crash is off" +msgstr "restart_after_crash 값이 off 로 지정되어 중지합니다." + +#: postmaster/postmaster.c:4019 #, c-format msgid "all server processes terminated; reinitializing" msgstr "모든 서버 프로세스가 중지 되었습니다; 재 초기화 중" -#: postmaster/postmaster.c:4180 postmaster/postmaster.c:5599 -#: postmaster/postmaster.c:5986 +#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5519 +#: postmaster/postmaster.c:5917 #, c-format msgid "could not generate random cancel key" msgstr "무작위 취소 키를 만들 수 없음" -#: postmaster/postmaster.c:4234 +#: postmaster/postmaster.c:4253 #, c-format msgid "could not fork new process for connection: %m" msgstr "연결을 위한 새 프로세스 할당(fork) 실패: %m" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4295 msgid "could not fork new process for connection: " msgstr "연결을 위한 새 프로세스 할당(fork) 실패: " -#: postmaster/postmaster.c:4393 +#: postmaster/postmaster.c:4401 #, c-format msgid "connection received: host=%s port=%s" msgstr "접속 수락: host=%s port=%s" -#: postmaster/postmaster.c:4398 +#: postmaster/postmaster.c:4406 #, c-format msgid "connection received: host=%s" msgstr "접속 수락: host=%s" -#: postmaster/postmaster.c:4668 +#: postmaster/postmaster.c:4643 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "\"%s\" 서버 프로세스를 실행할 수 없음: %m" -#: postmaster/postmaster.c:4827 +#: postmaster/postmaster.c:4701 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "백엔드 매개 변수 맵핑 파일을 만들 수 없음: 오류 코드 %lu" + +#: postmaster/postmaster.c:4710 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "백엔드 매개 변수 메모리를 맵핑할 수 없음: 오류 코드 %lu" + +#: postmaster/postmaster.c:4737 +#, c-format +msgid "subprocess command line too long" +msgstr "서브프로세스 명령행이 너무 깁니다." + +#: postmaster/postmaster.c:4755 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "CreateProcess() 호출 실패: %m (오류 코드 %lu)" + +#: postmaster/postmaster.c:4782 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "백엔드 매개 변수 파일의 view를 unmap할 수 없음: 오류 코드 %lu" + +#: postmaster/postmaster.c:4786 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "백엔드 매개 변수 파일을 닫을 수 없음: 오류 코드 %lun" + +#: postmaster/postmaster.c:4808 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "공유 메모리 확보 작업을 여러 번 시도했으나 실패 함" -#: postmaster/postmaster.c:4828 +#: postmaster/postmaster.c:4809 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "이 현상은 ASLR 또는 바이러스 검사 소프트웨어 때문일 수 있습니다." -#: postmaster/postmaster.c:5034 +#: postmaster/postmaster.c:4982 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "하위 프로세스에서 SSL 환경 설정을 못했음" -#: postmaster/postmaster.c:5166 +#: postmaster/postmaster.c:5107 #, c-format msgid "Please report this to <%s>." msgstr "이 내용을 <%s> 주소로 보고하십시오." -#: postmaster/postmaster.c:5259 +#: postmaster/postmaster.c:5179 #, 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:5527 +#: postmaster/postmaster.c:5443 #, c-format msgid "could not fork startup process: %m" msgstr "시작 프로세스 할당(fork) 실패: %m" -#: postmaster/postmaster.c:5531 +#: postmaster/postmaster.c:5447 +#, c-format +msgid "could not fork archiver process: %m" +msgstr "archiver 프로세스를 할당(fork)할 수 없음: %m" + +#: postmaster/postmaster.c:5451 #, c-format msgid "could not fork background writer process: %m" -msgstr "백그라운 writer 프로세스를 할당(fork)할 수 없습니다: %m" +msgstr "background writer 프로세스를 할당(fork)할 수 없습니다: %m" -#: postmaster/postmaster.c:5535 +#: postmaster/postmaster.c:5455 #, c-format msgid "could not fork checkpointer process: %m" -msgstr "체크포인트 프로세스를 할당(fork)할 수 없습니다: %m" +msgstr "checkpointer 프로세스를 할당(fork)할 수 없습니다: %m" -#: postmaster/postmaster.c:5539 +#: postmaster/postmaster.c:5459 #, c-format msgid "could not fork WAL writer process: %m" -msgstr "WAL 쓰기 프로세스를 할당(fork)할 수 없음: %m" +msgstr "WAL writer 프로세스를 할당(fork)할 수 없음: %m" -#: postmaster/postmaster.c:5543 +#: postmaster/postmaster.c:5463 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "WAL 수신 프로세스를 할당(fork)할 수 없음: %m" -#: postmaster/postmaster.c:5547 +#: postmaster/postmaster.c:5467 #, c-format msgid "could not fork process: %m" msgstr "프로세스 할당(fork) 실패: %m" -#: postmaster/postmaster.c:5744 postmaster/postmaster.c:5767 +#: postmaster/postmaster.c:5668 postmaster/postmaster.c:5695 #, c-format msgid "database connection requirement not indicated during registration" -msgstr "" +msgstr "백그라운드 프로세스 초기화 중에 데이터베이스 연결 요구 사항이 충족되지 않았습니다." -#: postmaster/postmaster.c:5751 postmaster/postmaster.c:5774 +#: postmaster/postmaster.c:5679 postmaster/postmaster.c:5706 #, 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:5791 #, c-format msgid "could not fork worker process: %m" msgstr "작업자 프로세스를 할당(fork)할 수 없음: %m" -#: postmaster/postmaster.c:5972 +#: postmaster/postmaster.c:5903 #, c-format msgid "no slot available for new worker process" msgstr "새 작업자 프로세스에서 쓸 슬롯이 없음" -#: postmaster/postmaster.c:6307 +#: postmaster/postmaster.c:6234 #, 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:6266 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "상속된 소켓을 만들 수 없음: 오류 코드 %d\n" -#: postmaster/postmaster.c:6368 +#: postmaster/postmaster.c:6295 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "\"%s\" 백엔드 변수 파일을 열 수 없음: %s\n" -#: postmaster/postmaster.c:6375 -#, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "\"%s\" 백엔드 변수 파일을 읽을 수 없음: %s\n" - -#: postmaster/postmaster.c:6384 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "\"%s\" 파일을 삭제할 수 없음: %s\n" - -#: postmaster/postmaster.c:6401 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "백엔드 변수 파일의 view를 map할 수 없음: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6410 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "백엔드 변수 파일의 view를 unmap할 수 없음: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6417 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "백엔드 변수 파일을 닫을 수 없음: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6595 -#, c-format -msgid "could not read exit code for process\n" -msgstr "프로세스의 종료 코드를 읽을 수 없음\n" - -#: postmaster/postmaster.c:6600 -#, c-format -msgid "could not post child completion status\n" -msgstr "하위 완료 상태를 게시할 수 없음\n" - -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 -#, c-format -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" -msgstr "syslog에서 사용할 파이프를 만들 수 없습니다: %m" - -#: postmaster/syslogger.c:636 -#, c-format -msgid "could not fork system logger: %m" -msgstr "시스템 로거(logger)를 확보하질 못 했습니다: %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "서버 로그를 로그 수집 프로세스로 보냅니다." - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "이제부터 서버 로그는 \"%s\" 디렉터리에 보관됩니다." - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "표준출력을 redirect 하지 못했습니다: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "표준오류(stderr)를 redirect 하지 못했습니다: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "로그파일 쓰기 실패: %s\n" - -#: postmaster/syslogger.c:1225 -#, c-format -msgid "could not open log file \"%s\": %m" -msgstr "\"%s\" 잠금파일을 열 수 없음: %m" - -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 -#, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "" -"로그파일 자동 교체 기능을 금지합니다(교체하려면 SIGHUP 시그널을 사용함)" - -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "정규식을 사용해서 사용할 정렬규칙(collation)을 찾을 수 없음" - -#: regex/regc_pg_locale.c:269 -#, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "정규식을 사용해서 사용할 정렬규칙(collation)을 찾을 수 없음" - -#: replication/backup_manifest.c:231 -#, c-format -msgid "expected end timeline %u but found timeline %u" -msgstr "%u 타임라인이 끝이어야하는데, %u 타임라인임" - -#: replication/backup_manifest.c:248 -#, c-format -msgid "expected start timeline %u but found timeline %u" -msgstr "" -"시작 타임라인이 %u 여야하는데, %u 타임라인임" - -#: replication/backup_manifest.c:275 -#, c-format -msgid "start timeline %u not found in history of timeline %u" -msgstr "" -"%u 시작 타임라인이 %u 타임라인 내역안에 없음" - -#: replication/backup_manifest.c:322 +#: postmaster/postmaster.c:6302 #, c-format -msgid "could not rewind temporary file" -msgstr "임시 파일을 되감을 수 없음" +msgid "could not read from backend variables file \"%s\": %s\n" +msgstr "\"%s\" 백엔드 변수 파일을 읽을 수 없음: %s\n" -#: replication/backup_manifest.c:349 +#: postmaster/postmaster.c:6311 #, c-format -msgid "could not read from temporary file: %m" -msgstr "임시 파일을 읽을 수 없음: %m" +msgid "could not remove file \"%s\": %s\n" +msgstr "\"%s\" 파일을 삭제할 수 없음: %s\n" -#: replication/basebackup.c:108 +#: postmaster/postmaster.c:6328 #, c-format -msgid "could not read from file \"%s\"" -msgstr "\"%s\" 파일을 읽을 수 없음" +msgid "could not map view of backend variables: error code %lu\n" +msgstr "백엔드 변수 파일의 view를 map할 수 없음: 오류 코드 %lu\n" -#: replication/basebackup.c:551 +#: postmaster/postmaster.c:6337 #, c-format -msgid "could not find any WAL files" -msgstr "어떤 WAL 파일도 찾을 수 없음" +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "백엔드 변수 파일의 view를 unmap할 수 없음: 오류 코드 %lu\n" -#: replication/basebackup.c:566 replication/basebackup.c:582 -#: replication/basebackup.c:591 +#: postmaster/postmaster.c:6344 #, c-format -msgid "could not find WAL file \"%s\"" -msgstr "\"%s\" WAL 파일 찾기 실패" +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "백엔드 변수 파일을 닫을 수 없음: 오류 코드 %lu\n" -#: replication/basebackup.c:634 replication/basebackup.c:665 +#: postmaster/postmaster.c:6503 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "\"%s\" WAL 파일의 크기가 알맞지 않음" +msgid "could not read exit code for process\n" +msgstr "프로세스의 종료 코드를 읽을 수 없음\n" -#: replication/basebackup.c:648 replication/basebackup.c:1752 +#: postmaster/postmaster.c:6545 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "베이스 백업에서 자료를 보낼 수 없음. 백업을 중지합니다." +msgid "could not post child completion status\n" +msgstr "하위 완료 상태를 게시할 수 없음\n" -#: replication/basebackup.c:724 +#: postmaster/shell_archive.c:123 #, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] "%lld 전체 체크섬 검사 실패" +msgid "archive command failed with exit code %d" +msgstr "아카이브 명령 실패, 종료 코드: %d" -#: replication/basebackup.c:731 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "checksum verification failure during base backup" -msgstr "베이스 백업 중 체크섬 검사 실패" +msgid "The failed archive command was: %s" +msgstr "실패한 아카이브 명령: %s" -#: 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 +#: postmaster/shell_archive.c:132 #, c-format -msgid "duplicate option \"%s\"" -msgstr "\"%s\" 옵션을 두 번 지정했습니다" +msgid "archive command was terminated by exception 0x%X" +msgstr "0x%X 예외로 인해 아카이브 명령이 종료됨" -#: replication/basebackup.c:837 +#: postmaster/shell_archive.c:139 #, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "" -"%d 값은 \"%s\" 매개 변수의 값으로 타당한 범위(%d .. %d)를 벗어났습니다." +msgid "archive command was terminated by signal %d: %s" +msgstr "%d번 시그널로 인해 아카이브 명령이 종료됨: %s" -#: replication/basebackup.c:882 +#: postmaster/shell_archive.c:148 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "인식할 수 없는 메니페스트 옵션 \"%s\"" +msgid "archive command exited with unrecognized status %d" +msgstr "아카이브 명령이 인식할 수 없는 %d 상태로 종료됨" -#: replication/basebackup.c:898 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "알 수 없는 체크섬 알고리즘: \"%s\"" +msgid "could not read from logger pipe: %m" +msgstr "로그 파이프에서 읽기 실패: %m" -#: replication/basebackup.c:913 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "" +msgid "could not create pipe for syslog: %m" +msgstr "syslog에서 사용할 파이프를 만들 수 없습니다: %m" -#: replication/basebackup.c:1504 +#: postmaster/syslogger.c:677 #, c-format -msgid "skipping special file \"%s\"" -msgstr "\"%s\" 특수 파일을 건너뜀" +msgid "could not fork system logger: %m" +msgstr "시스템 로거(logger)를 확보하질 못 했습니다: %m" -#: replication/basebackup.c:1623 +#: postmaster/syslogger.c:713 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "잘못된 조각 번호 %d, 해당 파일: \"%s\"" +msgid "redirecting log output to logging collector process" +msgstr "서버 로그를 로그 수집 프로세스로 보냅니다." -#: replication/basebackup.c:1642 +#: postmaster/syslogger.c:714 #, c-format -msgid "" -"could not verify checksum in file \"%s\", block %d: read buffer size %d and " -"page size %d differ" -msgstr "" +msgid "Future log output will appear in directory \"%s\"." +msgstr "이제부터 서버 로그는 \"%s\" 디렉터리에 보관됩니다." -#: replication/basebackup.c:1686 replication/basebackup.c:1716 +#: postmaster/syslogger.c:722 #, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "\"%s\" 파일에서 fseek 작업을 할 수 없음: %m" +msgid "could not redirect stdout: %m" +msgstr "표준출력을 redirect 하지 못했습니다: %m" -#: replication/basebackup.c:1708 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "%d 블럭을 \"%s\" 파일에서 다시 읽을 수 없음: %m" +msgid "could not redirect stderr: %m" +msgstr "표준오류(stderr)를 redirect 하지 못했습니다: %m" -#: replication/basebackup.c:1732 +#: postmaster/syslogger.c:1177 #, c-format -msgid "" -"checksum verification failed in file \"%s\", block %d: calculated %X but " -"expected %X" -msgstr "" -"\"%s\" 파일 체크섬 검사 실패(해당 블럭 %d): 계산된 체크섬은 %X 값이지만, 기" -"대값 %X" +msgid "could not write to log file: %s\n" +msgstr "로그파일 쓰기 실패: %s\n" -#: replication/basebackup.c:1739 +#: postmaster/syslogger.c:1295 #, c-format -msgid "" -"further checksum verification failures in file \"%s\" will not be reported" -msgstr "" +msgid "could not open log file \"%s\": %m" +msgstr "\"%s\" 잠금파일을 열 수 없음: %m" -#: replication/basebackup.c:1807 +#: postmaster/syslogger.c:1385 #, 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 건 체크섬 검사 실패" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "" +"로그파일 자동 교체 기능을 금지합니다(교체하려면 SIGHUP 시그널을 사용함)" -#: replication/basebackup.c:1843 +#: regex/regc_pg_locale.c:242 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "tar 파일로 묶기에는 파일 이름이 너무 긺: \"%s\"" +msgid "could not determine which collation to use for regular expression" +msgstr "정규식을 사용해서 사용할 정렬규칙(collation)을 찾을 수 없음" -#: replication/basebackup.c:1848 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "" -"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "" -"tar 포멧을 사용하기에는 심볼릭 링크의 대상 경로가 너무 깁니다: 파일 이름 \"%s" -"\", 대상 \"%s\"" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "정규식을 사용해서 사용할 정렬규칙(collation)을 찾을 수 없음" -#: replication/libpqwalreceiver/libpqwalreceiver.c:227 +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "search path를 지울 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "잘못된 연결 문자열 구문: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "접속 문자열을 분석할 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, c-format msgid "" "could not receive database system identifier and timeline ID from the " @@ -19162,13 +20803,13 @@ msgid "" msgstr "" "주 서버에서 데이터베이스 시스템 식별번호와 타임라인 번호를 받을 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 -#: replication/libpqwalreceiver/libpqwalreceiver.c:576 +#: replication/libpqwalreceiver/libpqwalreceiver.c:384 +#: replication/libpqwalreceiver/libpqwalreceiver.c:622 #, c-format msgid "invalid response from primary server" msgstr "주 서버에서 잘못된 응답이 왔음" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:385 #, c-format msgid "" "Could not identify system: got %d rows and %d fields, expected %d rows and " @@ -19177,159 +20818,154 @@ msgstr "" "시스템을 식별할 수 없음: 로우수 %d, 필드수 %d, 예상값: 로우수 %d, 필드수 %d " "이상" -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 -#: replication/libpqwalreceiver/libpqwalreceiver.c:438 -#: replication/libpqwalreceiver/libpqwalreceiver.c:463 +#: replication/libpqwalreceiver/libpqwalreceiver.c:465 +#: replication/libpqwalreceiver/libpqwalreceiver.c:472 +#: replication/libpqwalreceiver/libpqwalreceiver.c:502 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL 스트리밍 작업을 시작할 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:486 +#: replication/libpqwalreceiver/libpqwalreceiver.c:526 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "주 서버로 스트리밍 종료 메시지를 보낼 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:549 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "스트리밍 종료 요청에 대한 잘못된 응답을 받음" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:564 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "COPY 스트리밍 종료 중 오류 발생: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:531 +#: replication/libpqwalreceiver/libpqwalreceiver.c:574 #, 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:583 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete 작업 후 예상치 못한 결과를 받음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:565 +#: replication/libpqwalreceiver/libpqwalreceiver.c:610 #, 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:623 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "2개의 칼럼으로 된 하나의 튜플을 예상하지만, %d 튜플 (%d 칼럼)을 수신함" -#: replication/libpqwalreceiver/libpqwalreceiver.c:737 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 -#: replication/libpqwalreceiver/libpqwalreceiver.c:794 +#: replication/libpqwalreceiver/libpqwalreceiver.c:784 +#: replication/libpqwalreceiver/libpqwalreceiver.c:837 +#: replication/libpqwalreceiver/libpqwalreceiver.c:844 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL 스트림에서 자료 받기 실패: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:864 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL 스트림에 데이터를 보낼 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:956 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "\"%s\" 복제 슬롯을 만들 수 없음: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:911 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 #, c-format msgid "invalid query response" msgstr "잘못된 쿼리 응답" -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d개의 칼럼을 예상하지만, %d개의 칼럼을 수신함" -#: replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 #, c-format msgid "the query interface requires a database connection" msgstr "이 쿼리 인터페이스는 데이터베이스 연결이 필요합니다" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1012 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 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:1110 +msgid "unexpected pipeline mode" +msgstr "예기치 않은 파이프라인 모드" -#: replication/logical/launcher.c:302 +#: replication/logical/launcher.c:285 #, 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:365 #, c-format msgid "out of logical replication worker slots" msgstr "더 이상의 논리 복제 작업자용 슬롯이 없습니다" -#: replication/logical/launcher.c:383 +#: replication/logical/launcher.c:366 #, 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 "" +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:348 replication/logical/logical.c:502 #, 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:353 replication/logical/logical.c:507 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "\"%s\" 복제 슬롯이 이 데이터베이스 만들어져있지 않음" -#: replication/logical/logical.c:270 +#: replication/logical/logical.c:360 #, c-format msgid "" "cannot create logical replication slot in transaction that has performed " @@ -19337,483 +20973,650 @@ msgid "" msgstr "" "자료 변경 작업이 있는 트랜잭션 안에서는 논리적 복제 슬롯을 만들 수 없음" -#: replication/logical/logical.c:444 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "\"%s\" 이름의 논리적 복제 슬롯을 만드는 중" -#: replication/logical/logical.c:446 +#: replication/logical/logical.c:572 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." -msgstr "" +msgstr "%X/%X 이후 트랜잭션 커밋 정보를 스트리밍 하는 중, %X/%X 위치부터 WAL 읽는 중" -#: replication/logical/logical.c:593 +#: replication/logical/logical.c:720 #, 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:726 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" -msgstr "" +msgstr "슬롯: \"%s\", 출력 플러그인: \"%s\", 해당 콜백함수: %s" -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "" -"복제 슬롯은 superuser 또는 replication 롤 옵션을 포함한 사용자만 사용할 수 있" -"습니다." +msgid "logical replication at prepare time requires a %s callback" +msgstr "준비 시간에 논리 복제가 %s 콜백을 필요로 합니다." + +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "논리적 스트리밍이 %s 콜백을 필요로 합니다" -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logical.c:1400 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "준비 시간에 논리적 스트리밍이 %s 콜백을 필요로 합니다" + +#: 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 "배열은 일차원 배열이어야합니다" +msgstr "배열은 일차원 배열이어야 합니다" -#: 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:1128 +#: utils/adt/jsonb.c:1302 #, 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 -#, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "슈퍼유저만 복제 원본에 대한 쿼리나, 관리를 할 수 있습니다." +"\"%s\" 논리 복제 출력 플러그인은 이진 자료를 출력하지만, \"%s\" 함수는 텍스" +"트 자료를 사용함" -#: 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 "" +"max_replication_slots = 0 상황에서는 복제 오리진을 질의하거나 관리할 수 없음" -#: replication/logical/origin.c:198 +#: replication/logical/origin.c:194 #, c-format msgid "cannot manipulate replication origins during recovery" -msgstr "" +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" +msgid "could not find free replication origin ID" 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 "" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "%d ID의 복제 오리진은 삭제 될 수 없음, %d PID가 사용중임" -#: replication/logical/origin.c:464 +#: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "OID %u 복제 오리진이 없음" +msgid "replication origin with ID %d does not exist" +msgstr "%d ID의 복제 오리진이 없음" -#: 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 %d to %X/%X" +msgstr "%d 노드 %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:1117 #, c-format -msgid "replication origin with OID %d is already active for PID %d" -msgstr "" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "%d ID의 복제 오리진이 %d PID 프로세스가 사용중입니다." -#: 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 "%u OID 복제 오리진을 위한 여유 복제 슬롯을 찾을 수 없음" +"could not find free replication state slot for replication origin with ID %d" +msgstr "%d ID 복제 오리진을 위한 여유 복제 슬롯을 찾을 수 없음" -#: 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:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "max_replication_slots 값을 늘린 후 다시 시도해 보세요" -#: replication/logical/origin.c:1073 +#: replication/logical/origin.c:1088 #, 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:1168 replication/logical/origin.c:1380 +#: replication/logical/origin.c:1400 #, c-format msgid "no replication origin is configured" msgstr "복제 오리진 설정이 없습니다" -#: replication/logical/origin.c:1236 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "\"%s\" 복제 오리진 이름은 사용할 수 없음" -#: replication/logical/origin.c:1238 +#: replication/logical/origin.c:1253 #, 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:345 +#: 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 some replicated " -"columns" -msgstr "" +"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:385 +#: replication/logical/relation.c:298 #, c-format msgid "" "logical replication target relation \"%s.%s\" uses system columns in REPLICA " "IDENTITY index" msgstr "" +"\"%s.%s\" 논리 복제 대상 릴레이션이 REPLICA IDENTITY 인덱스에서 시스템 칼럼을 사용하고 있습니다." + +#: replication/logical/relation.c:390 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "\"%s.%s\" 이름의 논리 복제 대상 릴레이션이 없습니다." -#: replication/logical/reorderbuffer.c:2663 +#: replication/logical/reorderbuffer.c:3841 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "%u XID 내용을 데이터 파일에 쓸 수 없음: %m" -#: replication/logical/reorderbuffer.c:2850 -#: replication/logical/reorderbuffer.c:2875 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "reorderbuffer 처리용 파일에서 읽기 실패: %m" -#: replication/logical/reorderbuffer.c:2854 -#: replication/logical/reorderbuffer.c:2879 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "" "reorderbuffer 처리용 파일에서 읽기 실패: %d 바이트 읽음, 기대값 %u 바이트" -#: replication/logical/reorderbuffer.c:3114 +#: replication/logical/reorderbuffer.c:4466 #, 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:4965 #, 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:634 #, c-format msgid "initial slot snapshot too large" msgstr "초기 슬롯 스냅샷이 너무 큽니다." -#: replication/logical/snapbuild.c:660 +#: replication/logical/snapbuild.c:688 #, 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] "" -#: replication/logical/snapbuild.c:1265 replication/logical/snapbuild.c:1358 -#: replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 +#: replication/logical/snapbuild.c:2003 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "논리적 디코딩 이어서 시작할 위치: %X/%X" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1369 #, c-format msgid "There are no running transactions." msgstr "실행할 트랜잭션이 없음" -#: replication/logical/snapbuild.c:1309 +#: replication/logical/snapbuild.c:1425 #, 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:1427 replication/logical/snapbuild.c:1451 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." -msgstr "" +msgstr "(대략 %d개) %u 보다 오래된 트랜잭션이 종료되길 기다리고 있습니다." -#: replication/logical/snapbuild.c:1333 +#: replication/logical/snapbuild.c:1449 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "논리적 디코딩을 이어서 시작할 위치: %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1476 #, c-format msgid "There are no old transactions anymore." msgstr "더이상 오래된 트랜잭션이 없습니다." -#: replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1871 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "\"%s\" snapbuild 상태 파일의 매직 번호가 이상함: 현재값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1760 +#: replication/logical/snapbuild.c:1877 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "\"%s\" snapbuild 상태 파일의 버전이 이상함: 현재값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1859 +#: replication/logical/snapbuild.c:1948 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" -msgstr "" +msgstr "\"%s\" snapbuild 상태 파일의 체크섬이 일치하지 않음: 조회값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1914 +#: replication/logical/snapbuild.c:2005 #, c-format msgid "Logical decoding will begin using saved snapshot." -msgstr "" +msgstr "저장된 스냅샷을 이용해서 논리적 디코딩을 시작할 것입니다." -#: replication/logical/snapbuild.c:1986 +#: replication/logical/snapbuild.c:2077 #, 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: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:664 +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 #, 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:738 #, c-format msgid "table \"%s.%s\" not found on publisher" -msgstr "" +msgstr " \"%s.%s\" 테이블이 발행 안에 없습니다." + +#: replication/logical/tablesync.c:795 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "\"%s.%s\" 테이블용 칼럼 목록 정보를 구할 수 없습니다, 해당 발행: %s" -#: replication/logical/tablesync.c:704 +#: replication/logical/tablesync.c:974 #, 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:1111 #, 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:1323 replication/logical/worker.c:1635 +#, c-format +msgid "" +"user \"%s\" cannot replicate into relation with row-level security enabled: " +"\"%s\"" +msgstr "" +"\"%s\" 사용자는 로우 수준 보안 활성화 상태에서 릴레이션으로 복제할 수 없음: \"%s\"" + +#: replication/logical/tablesync.c:1338 #, 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:1380 #, 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:1393 #, c-format -msgid "" -"processing remote data for replication target relation \"%s.%s\" column \"%s" -"\", remote type %s, local type %s" -msgstr "" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "발행 서버에서 테이블 복사 트랜잭션을 마칠 수 없음: %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 "" +msgid "incorrect binary data format in logical replication column %d" +msgstr "%d 번째 논리 복제 칼럼 안에 잘못된 바이너리 자료 형식 발견됨" + +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 +#, c-format +msgid "" +"could not read from streaming transaction's changes file \"%s\": read only " +"%zu of %zu bytes" +msgstr "\"%s\" 스트리밍 트랜잭션 변경 파일 파일을 읽을 수 없음: " +"%zu / %zu 바이트만 읽음" -#: replication/logical/worker.c:702 +#: replication/logical/worker.c:1761 #, 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:1768 #, 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 +#: replication/logical/worker.c:2582 #, c-format msgid "invalid logical replication message type \"%c\"" msgstr "잘못된 논리 복제 메시지 형태 \"%c\"" -#: replication/logical/worker.c:1537 +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" -msgstr "" +msgstr "발행 서버로부터의 데이터 스트림이 끝났습니다" -#: replication/logical/worker.c:1692 +#: replication/logical/worker.c:2897 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "시간 제한으로 논리 복제 작업자를 중지합니다." -#: replication/logical/worker.c:1837 +#: replication/logical/worker.c:3059 #, 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:3070 #, 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 "" - -#: replication/logical/worker.c:1879 -#, c-format -msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription was renamed" -msgstr "" - -#: replication/logical/worker.c:1896 +#: replication/logical/worker.c:3096 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will restart " -"because the replication slot name was changed" +"because of a parameter change" msgstr "" +"매개 변수가 바뀌어서 \"%s\" 구독을 위해 논리 복제 반영 작업자가 다시" +" 시작됩니다." -#: replication/logical/worker.c:1910 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription's publications were changed" +"could not read from streaming transaction's subxact file \"%s\": read only " +"%zu of %zu bytes" msgstr "" +"\"%s\" 스트리밍 트랜잭션 subxact 파일을 읽을 수 없음: %zu / %zu 바이트만 읽음" -#: replication/logical/worker.c:2006 +#: replication/logical/worker.c:3645 #, 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:3657 #, 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:3675 #, 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:3679 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" +"\"%s\" 구독을 위한 논리 복제 반영 작업자가 시작되었습니다." -#: replication/logical/worker.c:2079 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" +msgstr "구독에서 사용할 복제 슬롯 세트가 없습니다." + +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "\"%s\" 구독이 오류로 비활성화 되었습니다." + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "" +"%X/%X LSN 에서 트랜잭션 건너 뛰어 논리 복제를 시작함" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "" +"논리 복제가 %X/%X LSN까지 트랜잭션을 건너뛰었습니다." + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "\"%s\" 이름의 구독의 LSN 건너뛰기 완료함" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "" +"Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " +"%X/%X." +msgstr "" +"원력 트랜잭션 마침 WAL 위치 %X/%X LSN이 skip-LSN %X/%X와 같지 않음" + +#: replication/logical/worker.c:4018 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type \"%s" +"\"" +msgstr "\"%s\" 복제 오리진용 원격 데이터를 처리합니다. 해당 메시지 유형: \"%s\"" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type \"%s" +"\" in transaction %u" +msgstr "" +"\"%s\" 복제 오리진용 원격 데이터를 처리합니다. 해당 메시지 유형: " +"\"%s\", 해당 트랜잭션: %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type \"%s" +"\" in transaction %u, finished at %X/%X" +msgstr "" +"\"%s\" 복제 오리진용 원격 데이터를 처리합니다. 해당 메시지 유형: " +"\"%s\", 해당 트랜잭션: %u, 마침 위치: %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type \"%s" +"\" for replication target relation \"%s.%s\" in transaction %u, finished at " +"%X/%X" +msgstr "" +"\"%s\" 복제 오리진용 원격 데이터를 처리합니다. 해당 메시지 유형: " +"\"%s\", 해당 복제 대상 릴레이션: \"%s.%s\", 해당 트랜잭션: %u, 마침 위치: %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type \"%s" +"\" for replication target relation \"%s.%s\" column \"%s\" in transaction " +"%u, finished at %X/%X" msgstr "" +"\"%s\" 복제 오리진용 원격 데이터를 처리합니다. 해당 메시지 유형: " +"\"%s\", 해당 복제 대상 릴레이션: \"%s.%s\", 해당 칼럼 \"%s\", 해당 " +"트랜잭션: %u, 마침 위치: %X/%X" -#: replication/pgoutput/pgoutput.c:147 +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "잘못된 proto_version" -#: replication/pgoutput/pgoutput.c:152 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_verson \"%s\" 범위 벗어남" -#: replication/pgoutput/pgoutput.c:169 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "잘못된 publication_names 구문" -#: replication/pgoutput/pgoutput.c:211 +#: replication/pgoutput/pgoutput.c:426 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or lower" msgstr "" +"클라이언트가 %d 버전으로 proto_version을 보냈지만, %d 버전 또는 그 이하 " +"버전 프로토콜만 지원합니다." -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:432 #, c-format msgid "client sent proto_version=%d but we only support protocol %d or higher" msgstr "" +"클라이언트가 %d 버전으로 proto_version을 보냈지만, %d 버전 또는 그 이상 " +"버전 프로토콜만 지원합니다." -#: replication/pgoutput/pgoutput.c:223 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "publication_names 매개 변수가 빠졌음" -#: replication/slot.c:183 +#: replication/pgoutput/pgoutput.c:451 +#, c-format +msgid "" +"requested proto_version=%d does not support streaming, need %d or higher" +msgstr "" +"요청한 %d 버전 proto_version은 스트리밍을 지원하지 않습니다. %d 또는 그 이상 " +"버전이 필요합니다." + +#: replication/pgoutput/pgoutput.c:456 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "스트리밍을 요청했지만, 출력 플러그인이 지원하지 않습니다." + +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "" +"requested proto_version=%d does not support two-phase commit, need %d or " +"higher" +msgstr "" +"요청한 %d 버전 proto_version은 2PC를 지원하지 않습니다. %d 또는 그 이상 " +"버전이 필요합니다." + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "2PC를 요청했지만, 출력 플러그인이 지원하지 않습니다." + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "\"%s\" 복제 슬롯 이름이 너무 짧음" -#: replication/slot.c:192 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "\"%s\" 복제 슬롯 이름이 너무 긺" -#: replication/slot.c:205 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "\"%s\" 복제 슬롯 이름에 사용할 수 없는 문자가 있음" -#: replication/slot.c:207 +#: replication/slot.c:229 #, c-format msgid "" "Replication slot names may only contain lower case letters, numbers, and the " @@ -19822,161 +21625,168 @@ msgstr "" "복제 슬롯 이름으로 사용할 수 있는 문자는 영문 소문자, 숫자, 밑줄(_) 문자입니" "다." -#: replication/slot.c:254 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "\"%s\" 이름의 복제 슬롯이 이미 있습니다." -#: replication/slot.c:264 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "모든 복제 슬롯이 사용 중입니다." -#: replication/slot.c:265 +#: replication/slot.c:294 #, 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:472 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:1006 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "\"%s\" 이름의 복제 슬롯을 %d PID 프로세스가 사용중입니다." -#: replication/slot.c:683 replication/slot.c:1314 replication/slot.c:1697 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "\"%s\" 디렉터리를 삭제할 수 없음" -#: replication/slot.c:1041 +#: replication/slot.c:1128 #, 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:1133 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "복제 슬롯은 wal_level >= replica 상태에서 사용될 수 있습니다." -#: replication/slot.c:1202 +#: replication/slot.c:1145 #, c-format -msgid "" -"terminating process %d because replication slot \"%s\" is too far behind" -msgstr "%d번 프로세스를 중지합니다. \"%s\" 복제 슬롯이 너무 옛날 것입니다." +msgid "must be superuser or replication role to use replication slots" +msgstr "" +"복제 슬롯은 superuser 또는 replication 롤 옵션을 포함한 사용자만 사용할 수 있" +"습니다." + +#: replication/slot.c:1330 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "%d번 프로세스를 중지합니다. \"%s\" 복제 슬롯이 삭제될 것입니다." -#: replication/slot.c:1221 +#: replication/slot.c:1368 #, c-format msgid "" "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " "max_slot_wal_keep_size" msgstr "" -"\"%s\" 슬롯이 바르지 않음. %X/%X restart_lsn 값이 " -"max_slot_wal_keep_size 값을 초과했음" +"\"%s\" 슬롯이 바르지 않음. %X/%X restart_lsn 값이 max_slot_wal_keep_size 값" +"을 초과했음" -#: replication/slot.c:1635 +#: replication/slot.c:1820 #, 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:1827 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "\"%s\" 복제 슬롯 파일은 지원하지 않는 %u 버전 파일입니다" -#: replication/slot.c:1649 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "\"%s\" 복제 슬롯 파일이 %u 길이로 손상되었습니다." -#: replication/slot.c:1685 +#: replication/slot.c:1870 #, 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:1904 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "\"%s\" 논리 복제 슬롯이 있지만, wal_level < logical" -#: replication/slot.c:1721 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." -msgstr "" +msgstr "wal_level 값을 logical 또는 그 이상으로 지정하세요." -#: replication/slot.c:1725 +#: replication/slot.c:1910 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "\"%s\" 물리 복제 슬롯이 있지만, wal_level < replica " +msgstr "\"%s\" 물리 복제 슬롯이 있지만, wal_level < replica" -#: replication/slot.c:1727 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." -msgstr "" +msgstr "wal_level 값을 replica 또는 그 이상으로 지정하세요." -#: replication/slot.c:1761 +#: replication/slot.c:1946 #, 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 "" +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 "" +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 "" +msgstr "원본 복제 슬롯의 confirmed_flush_lsn 값이 타당할 때 다시 시도하세요." -#: replication/syncrep.c:257 +#: replication/syncrep.c:268 #, c-format msgid "" "canceling the wait for synchronous replication and terminating connection " @@ -19984,7 +21794,7 @@ msgid "" 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 " @@ -19993,209 +21803,215 @@ 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)는 0보다 커야 합니다." -#: 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 "주 서버의 WAL 스트리밍 시작 위치: %X/%X (타임라인 %u)" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "WAL 스트리밍 재시작 위치: %X/%X (타임라인 %u)" -#: 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 "시간 제한으로 wal 수신기를 중지합니다." -#: 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:938 +#: 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:985 +#: 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 a logical replication slot" +msgstr "논리 복제 슬롯으로 %s 사용할 수 없음" + +#: replication/walsender.c:638 storage/smgr/md.c:1364 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "\"%s\" 파일의 끝을 찾을 수 없음: %m" -#: replication/walsender.c:527 +#: replication/walsender.c:642 #, 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 "" - -#: replication/walsender.c:607 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "물리적 복제에서 논리적 복제 슬롯을 사용할 수 없음" -#: replication/walsender.c:676 +#: replication/walsender.c:785 #, 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:680 +#: replication/walsender.c:788 #, 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:832 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " "server %X/%X" -msgstr "" +msgstr "%X/%X 위치는 서버의 %X/%X 보다 미래의 것입니다." + +#: replication/walsender.c:1015 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "\"%s\" CREATE_REPLICATION_SLOT 옵션에서 쓸 수 없는 값: \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:976 +#: replication/walsender.c:1100 #, 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:1110 #, 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:1116 #, 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:1122 #, 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:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s 명령은 서브트랜잭션 블럭안에서 실행할 수 없음" -#: replication/walsender.c:1148 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "\"%s\" 논리 복제 슬롯에서 읽기 실패" -#: replication/walsender.c:1150 +#: replication/walsender.c:1273 #, c-format msgid "" "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "" +"최대 예약 크기를 초과해서 이 슬롯은 정상적이지 않은 것으로 바꿨습니다." -#: replication/walsender.c:1160 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "운영전환 뒤 wal 송신기 프로세스를 중지합니다." -#: replication/walsender.c:1534 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" -msgstr "" +msgstr "WAL 송신기가 중지 중일 때는 새 명령을 실행할 수 없습니다." + +#: replication/walsender.c:1739 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "물리적 복제를 위한 WAL 송신기에서 SQL 명령을 실행할 수 없음" -#: replication/walsender.c:1567 +#: replication/walsender.c:1772 #, 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:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -20204,571 +22020,611 @@ msgstr "" "현재 트랜잭션은 중지되어 있습니다. 이 트랜잭션을 종료하기 전까지는 모든 명령" "이 무시될 것입니다" -#: replication/walsender.c:1669 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "물리적 복제를 위한 WAL 송신기에서 SQL 명령을 실행할 수 없음" - -#: replication/walsender.c:1714 replication/walsender.c:1730 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "대기 서버 연결에서 예상치 못한 EOF 발견함" -#: replication/walsender.c:1744 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "" - -#: replication/walsender.c:1782 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "잘못된 대기 서버 메시지 형태 \"%c\"" -#: replication/walsender.c:1823 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "예상치 못한 메시지 형태: \"%c\"" -#: replication/walsender.c:2241 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "복제 시간 제한으로 wal 송신기 프로세스를 종료합니다." -#: 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:1013 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "\"%s\" 이름의 룰(rule)이 \"%s\" 테이블에 이미 지정되어있습니다" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, 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에 대한 실행 룰(rule)은 아직 구현되지 않았습니다" -#: 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에 대한 실행 룰(rule)은 아직 구현되지 않았습니다" -#: 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 룰(rule)은 구현되지 않았습니다" -#: 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에 대한 다중 실행 룰(rule)은 구현되지 않았습니다" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:340 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "" "SELECT에 대한 룰(rule)은 그 지정에 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 "" +msgstr "SELECT 룰에는 WITH 절 안에 자료 변경 구문을 포함할 수 없습니다." -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "" "이벤트 자격(event qualifications)은 SELECT 룰(rule)에서 구현되지 않았습니다" -#: 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\" 위한 뷰 룰(view rule)의 이름은 \"%s\" 여야만합니다" -#: rewrite/rewriteDefine.c:434 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" 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 "하나의 rule에서 여러개의 RETURNING 목록을 지정할 수 없습니다" -#: rewrite/rewriteDefine.c:515 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING 목록은 conditional rule에서는 지원하지 않습니다" -#: rewrite/rewriteDefine.c:519 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING 목록은 non-INSTEAD rule에서는 지원하지 않습니다" -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:544 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "\"%s\" 위한 뷰가 아닌 룰 이름은 \"%s\" 아니여야 합니다." + +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECT 룰(rule)의 대상 목록이 너무 많은 엔트리를 가지고 있습니다" -#: rewrite/rewriteDefine.c:684 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING 목록이 너무 많은 항목를 가지고 있습니다" -#: rewrite/rewriteDefine.c:711 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "뷰에서 삭제된 칼럼을 포함하고 있는 릴레이션을 변환할 수 없습니다" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "릴레이션에 삭제된 칼럼을 포함하고 있는 RETURNING 목록을 만들 수 없습니다." -#: rewrite/rewriteDefine.c:718 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECT 룰(rule)의 대상 엔트리 번호가(%d)가 \"%s\" 칼럼 이름과 틀립니다" -#: rewrite/rewriteDefine.c:720 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT 대상 엔트리 이름은 \"%s\" 입니다." -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECT 룰(rule)의 대상 엔트리 번호(%d)가 \"%s\" 칼럼 자료형과 틀립니다" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:754 #, 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:757 rewrite/rewriteDefine.c:781 #, 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:760 rewrite/rewriteDefine.c:785 #, 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:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECT 룰(rule)의 대상 엔트리 번호(%d)가 \"%s\" 칼럼 크기와 틀립니다" -#: rewrite/rewriteDefine.c:755 +#: rewrite/rewriteDefine.c:778 #, 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:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECT 룰(rule)의 대상 목록이 너무 적은 엔트리를 가지고 있습니다" -#: rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING 목록에 너무 적은 항목이 있습니다" -#: rewrite/rewriteDefine.c:866 rewrite/rewriteDefine.c:980 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr " \"%s\" 룰(rule)이 \"%s\" 관계(relation)에 지정된 것이 없음" -#: rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECT 룰의 이름 바꾸기는 허용하지 않습니다" -#: rewrite/rewriteHandler.c:545 +#: rewrite/rewriteHandler.c:574 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " "rewritten" msgstr "" +"\"%s\" 이름의 WITH 쿼리가 룰 동작과 쿼리 재작성 두 곳 모두에 보입니다." + +#: rewrite/rewriteHandler.c:601 +#, 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:605 +#: rewrite/rewriteHandler.c:654 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "multiple rule에 RETURNING 목록을 지정할 수 없습니다" -#: rewrite/rewriteHandler.c:816 rewrite/rewriteHandler.c:828 +#: rewrite/rewriteHandler.c:886 rewrite/rewriteHandler.c:925 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "\"%s\" 칼럼에 자료를 입력할 수 없습니다" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "\"%s\" 칼럼에 non-DEFAULT 값을 입력할 수 없습니다" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:839 +#: rewrite/rewriteHandler.c:888 rewrite/rewriteHandler.c:954 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." -msgstr "" +msgstr "\"%s\" 칼럼은 GENERATED ALWAYS 속성의 식별자 칼럼입니다." -#: rewrite/rewriteHandler.c:819 +#: rewrite/rewriteHandler.c:890 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." -msgstr "" +msgstr "이 속성을 무시하려면, OVERRIDING SYSTEM VALUE 옵션을 사용하세요." -#: rewrite/rewriteHandler.c:838 rewrite/rewriteHandler.c:845 +#: rewrite/rewriteHandler.c:952 rewrite/rewriteHandler.c:960 #, 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:1107 rewrite/rewriteHandler.c:1125 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "같은 \"%s\" 열에 지정값(assignment)이 중복되었습니다" -#: rewrite/rewriteHandler.c:2062 +#: rewrite/rewriteHandler.c:2141 rewrite/rewriteHandler.c:4046 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "" +"\"%s\" 릴레이션(relation)에서 지정된 룰에서 잘못된 재귀호출이 발견되었습니다" + +#: rewrite/rewriteHandler.c:2226 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "\"%s\" 릴레이션의 정책에서 무한 재귀 호출이 발견 됨" -#: rewrite/rewriteHandler.c:2382 +#: rewrite/rewriteHandler.c:2546 msgid "Junk view columns are not updatable." msgstr "정크 뷰 칼럼은 업데이트할 수 없습니다." -#: rewrite/rewriteHandler.c:2387 +#: rewrite/rewriteHandler.c:2551 msgid "" "View columns that are not columns of their base relation are not updatable." -msgstr "" +msgstr "뷰의 바탕이 되는 릴레이션의 칼럼이 아닌 뷰 칼럼은 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2390 +#: rewrite/rewriteHandler.c:2554 msgid "View columns that refer to system columns are not updatable." -msgstr "" +msgstr "시스템 칼럼이 원본인 뷰 칼럼은 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2393 +#: rewrite/rewriteHandler.c:2557 msgid "View columns that return whole-row references are not updatable." -msgstr "" +msgstr "로우 전체를 참조하는 뷰 칼럼은 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2454 +#: rewrite/rewriteHandler.c:2618 msgid "Views containing DISTINCT are not automatically updatable." -msgstr "" +msgstr "DISTINCT 조건이 있는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2457 +#: rewrite/rewriteHandler.c:2621 msgid "Views containing GROUP BY are not automatically updatable." -msgstr "" +msgstr "GROUP BY 절이 있는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2460 +#: rewrite/rewriteHandler.c:2624 msgid "Views containing HAVING are not automatically updatable." -msgstr "" +msgstr "HAVING 절이 있는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2463 +#: rewrite/rewriteHandler.c:2627 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." -msgstr "" +msgstr "UNION, INTERSECT, EXCEPT를 포함하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2466 +#: rewrite/rewriteHandler.c:2630 msgid "Views containing WITH are not automatically updatable." -msgstr "" +msgstr "WITH 절을 포함하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2469 +#: rewrite/rewriteHandler.c:2633 msgid "Views containing LIMIT or OFFSET are not automatically updatable." -msgstr "" +msgstr "LIMIT 또는 OFFSET 구문을 포함하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2481 +#: rewrite/rewriteHandler.c:2645 msgid "Views that return aggregate functions are not automatically updatable." -msgstr "" +msgstr "집계 함수를 반환하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2484 +#: rewrite/rewriteHandler.c:2648 msgid "Views that return window functions are not automatically updatable." -msgstr "" +msgstr "윈도우 함수를 반환하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2487 +#: rewrite/rewriteHandler.c:2651 msgid "" "Views that return set-returning functions are not automatically updatable." -msgstr "" +msgstr "집합 반환 함수를 반환하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2494 rewrite/rewriteHandler.c:2498 -#: rewrite/rewriteHandler.c:2506 +#: rewrite/rewriteHandler.c:2658 rewrite/rewriteHandler.c:2662 +#: rewrite/rewriteHandler.c:2670 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." -msgstr "" +msgstr "단일 테이블 또는 단일 뷰를 SELECT 하지 않는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2509 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing TABLESAMPLE are not automatically updatable." -msgstr "" +msgstr "TABLESAMPLE 구문을 포함하는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2697 msgid "Views that have no updatable columns are not automatically updatable." -msgstr "" +msgstr "업데이트 가능한 칼럼이 없는 뷰는 자동으로 업데이트 될 수 없습니다." -#: rewrite/rewriteHandler.c:3010 +#: rewrite/rewriteHandler.c:3174 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "\"%s\" 칼럼 (해당 뷰: \"%s\")에 자료를 입력할 수 없습니다" -#: rewrite/rewriteHandler.c:3018 +#: rewrite/rewriteHandler.c:3182 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "\"%s\" 칼럼 (해당 뷰: \"%s\")에 자료를 갱신할 수 없습니다" -#: rewrite/rewriteHandler.c:3496 +#: rewrite/rewriteHandler.c:3673 +#, c-format +msgid "" +"DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " +"WITH" +msgstr "" +"DO INSTEAD NOTIFY 룰에서는 WITH 절 안에 자료 변경 구문이 없어야 합니다" + +#: rewrite/rewriteHandler.c:3684 #, 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:3698 #, 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:3702 #, 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:3707 #, 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:3974 rewrite/rewriteHandler.c:3982 +#: rewrite/rewriteHandler.c:3990 #, c-format msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "" "선택적 DO INSTEAD 룰을 포함한 뷰는 자동 업데이트 기능을 사용할 수 없습니다." -#: rewrite/rewriteHandler.c:3819 +#: rewrite/rewriteHandler.c:4095 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레이션에서 INSERT RETURNING 관련을 구성할 수 없음" -#: rewrite/rewriteHandler.c:3821 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "" "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" -"RETURNING 절에서는 무조건 ON INSERT DO INSTEAD 속성으로 rule이 사용되어야합니" -"다." +"RETURNING 절에서는 무조건 ON INSERT DO INSTEAD 속성으로 rule이 사용되어야 합" +"니다." -#: rewrite/rewriteHandler.c:3826 +#: rewrite/rewriteHandler.c:4102 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레이션에서 UPDATE RETURNING 관련을 구성할 수 없습니다." -#: rewrite/rewriteHandler.c:3828 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "" "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" -"RETURNING 절에서는 무조건 ON UPDATE DO INSTEAD 속성으로 rule이 사용되어야합니" -"다." +"RETURNING 절에서는 무조건 ON UPDATE DO INSTEAD 속성으로 rule이 사용되어야 합" +"니다." -#: rewrite/rewriteHandler.c:3833 +#: rewrite/rewriteHandler.c:4109 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레이션에서 DELETE RETURNING 관련을 구성할 수 없습니다." -#: rewrite/rewriteHandler.c:3835 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "" "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" -"TURNING 절에서는 무조건 ON DELETE DO INSTEAD 속성으로 rule이 사용되어야합니다" +"TURNING 절에서는 무조건 ON DELETE DO INSTEAD 속성으로 rule이 사용되어야 합니" +"다" -#: rewrite/rewriteHandler.c:3853 +#: rewrite/rewriteHandler.c:4129 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " "UPDATE rules" msgstr "" +"INSERT 또는 UPDATE 룰이 지정된 테이블을 대상으로 INSERT ... ON CONFLICT " +"구문은 사용할 수 없습니다." -#: rewrite/rewriteHandler.c:3910 +#: rewrite/rewriteHandler.c:4186 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " "queries" msgstr "" +"WITH 절은 다중 쿼리 작업을 하는 룰로 재작성되는 쿼리 안에서는 사용할 수 없습니다." -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1009 #, c-format msgid "conditional utility statements are not implemented" msgstr "" "조건 유틸리티 명령 구문(conditional utility statement)은 구현되어있지 않습니" "다" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1175 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "뷰에 대한 WHERE CURRENT OF 구문이 구현되지 않음" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1510 #, c-format 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 구문안에 다중으로 지정된 칼럼 " +"가운데 한 부분인 칼럼을 참조할 수 없습니다." + +#: 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 "" +"재귀 호출을 이용하는 \"%s\" WITH 쿼리를 SEARCH 또는 CYCLE 절과 함께 쓸 때는 " +"오른편 SELECT는 최상위 수준이어야 합니다." -#: snowball/dict_snowball.c:199 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "\"%s\" 언어 및 \"%s\" 인코딩에 사용 가능한 Snowball stemmer가 없음" -#: 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 "여러 개의 언어 매개 변수가 있음" -#: 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: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 "반환 자료형이 record인데 함수가 그 자료형으로 반환하지 않음" -#: storage/buffer/bufmgr.c:588 storage/buffer/bufmgr.c:669 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "다른 세션의 임시 테이블에 액세스할 수 없음" -#: storage/buffer/bufmgr.c:825 +#: storage/buffer/bufmgr.c:851 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "%s 릴레이션은 %u개 블록을 초과하여 확장할 수 없음" + +#: storage/buffer/bufmgr.c:938 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "%u 블록(해당 릴레이션: %s)에 EOF 범위를 넘는 예기치 않은 데이터가 있음" -#: storage/buffer/bufmgr.c:827 +#: storage/buffer/bufmgr.c:940 #, 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:1039 #, 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:4670 #, c-format msgid "could not write block %u of %s" msgstr "%u/%s 블록을 쓸 수 없음" -#: storage/buffer/bufmgr.c:4213 +#: storage/buffer/bufmgr.c:4672 #, 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:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "%u 블록(해당 릴레이션: %s)을 쓰는 중" -#: storage/buffer/bufmgr.c:4556 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" -msgstr "" +msgstr "스냅샷 너무 오래됨" #: storage/buffer/localbuf.c:205 #, c-format @@ -20780,43 +22636,53 @@ 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 "\"%s\" 임시 파일을 열 수 없음, 버퍼파일: \"%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 "\"%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:325 storage/smgr/md.c:904 +#, 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 "dirty 자료를 flush 할 수 없음: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "dirty 자료 크기를 확인할 수 없음: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "자료 flush 작업 도중 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 "" @@ -20824,167 +22690,205 @@ 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\" 임시 파일을 지울 수 없음: %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 (%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 "" +msgstr "maxAllocatedDescs (%d) 초과됨, \"%s\" 파일 열기 시도 중에." -#: storage/file/fd.c:2437 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" -msgstr "" +msgstr "maxAllocatedDescs (%d) 초과됨, \"%s\" 명령을 시도 중에." -#: storage/file/fd.c:2594 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" -msgstr "" +msgstr "maxAllocatedDescs (%d) 초과됨, \"%s\" 디렉터리 열기 시도 중에." -#: 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, 현재 경로: %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-fsync), 소요 시간: %ld.%02d s, 현재 경로: %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, 현재 경로: %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, 현재 경로: %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, 현재 경로: %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:338 +#: storage/ipc/dsm.c:353 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "동적 공유 메모리 제어 조각이 손상되었음" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:418 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "동적 공유 메모리 제어 조각이 타당하지 않음" -#: storage/ipc/dsm.c:494 +#: storage/ipc/dsm.c:600 #, 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:235 storage/ipc/dsm_impl.c:544 +#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 조각을 unmap 할 수 없음: %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:245 storage/ipc/dsm_impl.c:554 +#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 #, 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:269 storage/ipc/dsm_impl.c:729 +#: storage/ipc/dsm_impl.c:843 #, 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:294 storage/ipc/dsm_impl.c:570 +#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 #, 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:313 storage/ipc/dsm_impl.c:918 #, 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:335 storage/ipc/dsm_impl.c:591 +#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 조각을 map 할 수 없음: %m" -#: storage/ipc/dsm_impl.c:508 +#: storage/ipc/dsm_impl.c:526 #, c-format msgid "could not get shared memory segment: %m" msgstr "공유 메모리 조각을 가져올 수 없음: %m" -#: storage/ipc/dsm_impl.c:696 +#: storage/ipc/dsm_impl.c:714 #, 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:951 #, 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:991 storage/ipc/dsm_impl.c:1040 #, 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:3846 #, 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:3878 storage/ipc/signalfuncs.c:226 #, 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:3885 storage/ipc/signalfuncs.c:231 #, c-format msgid "" "must be a member of the role whose process is being terminated or member of " @@ -20993,12 +22897,27 @@ msgstr "" "세션을 종료하려면 접속자의 소속 맴버이거나 pg_signal_backend 소속 맴버여야 합" "니다" +#: storage/ipc/procsignal.c:419 +#, c-format +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "%lu PID 백엔드 프로세스가 ProcSignalBarrier 작업을 수락하기를 기다리고 있음" + +#: 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:719 +#, 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: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:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 +#: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" msgstr "공유 메모리 부족" @@ -21008,12 +22927,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 "\"%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, " @@ -21021,33 +22940,34 @@ msgid "" 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:1366 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "%d 프로세스로 시스템신호(signal)를 보낼 수 없습니다: %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 " @@ -21056,172 +22976,226 @@ 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 "%d PID 백엔드 프로세스의 존재를 확인할 수 없음: %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] "%d PID 백엔드 프로세스를 %lld ms 내에 종료하지 못했음" + +#: 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 확장 모듈을 사용하면 로그 전환하려면 슈퍼유저여야 합니다." +"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 ms 기다린 뒤에도 여전히 복구 중: %s" + +#: storage/ipc/standby.c:316 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "%ld.%03d ms 기다려서 복구 완료: %s" + +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "복구 작업 중 충돌이 발생해 작업을 중지합니다." -#: storage/ipc/standby.c:581 tcop/postgres.c:2469 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, 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 "" +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 "" +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 "deadlock 발생했음" -#: 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:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플(해당 릴레이션 \"%s\")을 갱신하는 중에 발생" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플(해당 릴레이션 \"%s\")을 삭제하는 중에 발생" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플을 \"%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 "%u,%u 업데이트된 버전 튜플(해당 릴레이션 \"%s\")을 잠그는 중에 발생" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:871 #, 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:874 #, 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:877 #, 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:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "%u,%u 튜플(해당 릴레이션: \"%s\")의 제외 제약 조건을 검사하는 중에 발생" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "릴레이션 %u, 데이터베이스 %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "%u 관계(%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 "페이지 %u, 릴레이션 %u, 데이터베이스 %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "튜플 (%u,%u), 릴레이션 %u, 데이터베이스 %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 "%u 위험한 토큰, 대상 트랜잭션 %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "개체 %u, 클래스 %u, 데이터베이스 %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "user lock [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "advisory lock [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "알 수 없는 locktag 형태 %d" @@ -21231,6 +23205,7 @@ msgstr "알 수 없는 locktag 형태 %d" msgid "" "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "" +"복구 작업 중 데이터베이스 객체 대상 %s 잠금 상태 취득 실패" #: storage/lmgr/lock.c:805 #, c-format @@ -21238,24 +23213,28 @@ 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: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 작업은 할 수 없습니다." #: storage/lmgr/predicate.c:700 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "" +"읽기/쓰기 충돌을 기록하기 위한 RWConflictPool 안에 충분한 요소가 없음" #: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 #, c-format @@ -21263,6 +23242,7 @@ msgid "" "You might need to run fewer transactions at a time or increase " "max_connections." msgstr "" +"동시 발생하는 트랜잭션 수를 줄이든가, max_connections 값을 늘리세요." #: storage/lmgr/predicate.c:728 #, c-format @@ -21270,83 +23250,73 @@ 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: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 "" +msgstr "요청한 스냅샷 가지오기 실패" -#: 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 "%d PID 소스 프로세스는 더이상 실행 중이지 않습니다." -#: storage/lmgr/predicate.c:2402 storage/lmgr/predicate.c:2417 -#: storage/lmgr/predicate.c:3899 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, 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:4122 storage/lmgr/predicate.c:4158 +#: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 +#: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 +#: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 +#: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format msgid "" "could not serialize access due to read/write dependencies among transactions" msgstr "트랜잭션간 읽기/쓰기 의존성 때문에 serialize 접근을 할 수 없음" -#: 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:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 #, c-format msgid "The transaction might succeed if retried." msgstr "재시도하면 그 트랜잭션이 성공할 것입니다." -#: 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 "대기 서버 연결 수가 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 "%d PID autovacuum 블럭킹하기 위해 취소 신호를 보냅니다" - -#: storage/lmgr/proc.c:1468 +#: storage/lmgr/proc.c:1531 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -21355,220 +23325,189 @@ msgstr "" "%d PID 프로세스는 %s(%s)에 대해 교착 상태가 발생하지 않도록 %ld.%03dms 후에 " "대기열 순서를 다시 조정함" -#: storage/lmgr/proc.c:1483 +#: storage/lmgr/proc.c:1546 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스에서 %s(%s) 대기중 %ld.%03dms 후에 교착 상태를 감지함" -#: storage/lmgr/proc.c:1492 +#: storage/lmgr/proc.c:1555 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스에서 여전히 %s(%s) 작업을 기다리고 있음(%ld.%03dms 후)" -#: storage/lmgr/proc.c:1499 +#: storage/lmgr/proc.c:1562 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스가 %s(%s) 작업을 위해 잠금 취득함(%ld.%03dms 후)" -#: storage/lmgr/proc.c:1515 +#: storage/lmgr/proc.c:1579 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "프로세스 %d에서 %s(%s)을(를) 취득하지 못함(%ld.%03dms 후)" -#: 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 "손상된 페이지 위치: 하위값 = %u, 상위값 = %u, 특수값 = %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:470 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "\"%s\" 파일을 %u개 블록을 초과하여 확장할 수 없음" -#: storage/smgr/md.c:422 +#: storage/smgr/md.c:485 #, 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:491 #, 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:706 #, 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:722 #, 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:776 #, 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:781 #, 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:875 #, 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:930 #, 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 "요청 큐가 가득차 forward fsync 요청을 처리할 수 없음" - -#: storage/smgr/md.c:1256 +#: storage/smgr/md.c:1329 #, 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:1343 #, 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 "fastpath 인터페이스를 이용한 \"%s\" 함수 호출 실패" -#: 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:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "실행시간: %s ms" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:316 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "작업시간: %s ms 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 "클라이언트 연결에서 예상치 않은 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:4823 #, c-format msgid "invalid frontend message type %d" msgstr "잘못된 frontend 메시지 형태 %d" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "명령 구문: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "실행시간: %s ms 명령 구문: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "구문 %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "준비된 명령 구문에는 다중 명령을 삽입할 수 없습니다" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "실행시간: %s ms %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:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "이름없는 준비된 명령 구문(unnamed prepared statement) 없음" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "바인드 메시지는 %d 매개 변수 형태지만, %d 매개 변수여야함" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1695 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -21577,85 +23516,110 @@ msgstr "" "바인드 메시지는 %d개의 매개 변수를 지원하지만, \"%s\" 준비된 명령 구문" "(prepared statement)에서는%d 개의 매개 변수가 필요합니다" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "바인드 매개 변수 %d 안에 잘못된 바이너리 자료 형태가 있음" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "실행시간: %s ms %s%s%s 접속: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "\"%s\" portal 없음" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2160 #, 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:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "자료뽑기" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "쿼리실행" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "수행시간: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "매개 변수: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "중지 이유: 복구 충돌" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." -msgstr "" +msgstr "사용자가 너무 오랫동안 공유 버퍼 핀을 붙잡고 있습니다." -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." -msgstr "" +msgstr "사용자가 너무 오랫동안 릴레이션 잠금을 하고 있습니다." -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." -msgstr "" +msgstr "삭제할 테이블스페이스를 사용자가 사용했거나, 사용하고 있습니다." -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." -msgstr "" +msgstr "사용자 쿼리가 삭제해야할 로우 버전를 볼 필요가 있는 것 같습니다." -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2502 #, c-format msgid "User was connected to a database that must be dropped." -msgstr "삭제 되어져야할 데이터베이스 사용자 접속해 있습니다." +msgstr "삭제 되어져야할 데이터베이스에 사용자가 접속해 있습니다." -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2541 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "\"%s\" 포탈 $%d 매개 변수 = %s" + +#: tcop/postgres.c:2544 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "\"%s\" 포탈 $%d 매개 변수" + +#: tcop/postgres.c:2550 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "이름없는 포탈 $%d 매개 변수 = %s" + +#: tcop/postgres.c:2553 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "이름없는 포탈 $%d 매개 변수" + +#: tcop/postgres.c:2898 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "예상치 못한 SIGQUIT 신호로 연결을 끝냅니다" + +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "다른 서버 프로세스가 손상을 입어 현재 연결을 중지합니다" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2905 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -21666,19 +23630,24 @@ msgstr "" "와의 연결을 끊으라는 명령을 보냈습니다. 왜냐하면, 다른 서버 프로세스가 비정상" "적으로 중지되어 공유 메모리가 손상되었을 가능성이 있기 때문입니다" -#: tcop/postgres.c:2801 tcop/postgres.c:3107 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, 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:2916 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "immediate 종료 명령으로 연결을 끝냅니다" + +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "부동소수점 예외발생" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:3003 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -21687,72 +23656,72 @@ msgstr "" "잘못된 부동소수점 작업이 감지 되었습니다. 이것은 아마도 결과값 범위초과나 0으" "로 나누는 작업과 같은 잘못된 연산 때문에 발생한 것 같습니다" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "시간 초과로 인증 작업을 취소합니다." -#: tcop/postgres.c:3041 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" -msgstr "관리자 명령으로 인해 자동 청소 프로세스를 종료하는 중" +msgstr "관리자 명령으로 인해 자동 청소 프로세스를 끝냅니다" -#: tcop/postgres.c:3045 +#: tcop/postgres.c:3182 #, 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:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" -msgstr "복구 작업 중 충돌로 연결을 종료합니다." +msgstr "복구 작업 중 충돌로 연결을 끝냅니다" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "관리자 요청에 의해서 연결을 끝냅니다" -#: tcop/postgres.c:3088 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "서버로부터 연결이 끊어졌습니다." -#: tcop/postgres.c:3154 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "잠금 대기 시간 초과로 작업을 취소합니다." -#: tcop/postgres.c:3161 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "명령실행시간 초과로 작업을 취소합니다." -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "자동 청소 작업을 취소하는 중" -#: tcop/postgres.c:3191 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "사용자 요청에 의해 작업을 취소합니다." -#: tcop/postgres.c:3201 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "idle-in-transaction 시간 초과로 연결을 끝냅니다" -#: tcop/postgres.c:3318 +#: tcop/postgres.c:3383 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "idle-session 시간 초과로 연결을 끝냅니다" + +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "스택 깊이를 초과했습니다" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3524 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -21761,59 +23730,59 @@ msgstr "" "먼저 OS에서 지원하는 스택 depth 최대값을 확인한 뒤, 허용범위 안에서 " "\"max_stack_depth\" (현재값: %dkB) 매개 변수 값의 설정치를 증가시키세요." -#: tcop/postgres.c:3382 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" 값은 %ldkB를 초과할 수 없습니다" -#: tcop/postgres.c:3384 +#: tcop/postgres.c:3589 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " "equivalent." msgstr "OS의 \"ulimit -s\" 명령과 같은 것으로 스택 깊이를 늘려주십시오." -#: tcop/postgres.c:3744 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "서버 프로세스의 명령행 인자가 잘못되었습니다: %s" -#: tcop/postgres.c:3745 tcop/postgres.c:3751 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요." -#: tcop/postgres.c:3749 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 잘못된 명령행 인자: %s" -#: tcop/postgres.c:3811 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: 데이터베이스와 사용자를 지정하지 않았습니다" -#: tcop/postgres.c:4447 +#: tcop/postgres.c:4725 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "잘못된 CLOSE 메시지 서브타입 %d" -#: tcop/postgres.c:4482 +#: tcop/postgres.c:4760 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "잘못된 DESCRIBE 메시지 서브타입 %d" -#: tcop/postgres.c:4560 +#: tcop/postgres.c:4844 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "복제 연결에서는 fastpath 함수 호출을 지원하지 않습니다" -#: tcop/postgres.c:4564 +#: tcop/postgres.c:4848 #, c-format msgid "extended query protocol not supported in a replication connection" -msgstr "" +msgstr "복제 연결에서는 확장된 쿼리 프로토콜을 지원하지 않습니다" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:5025 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s" @@ -21822,53 +23791,59 @@ 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 "cannot execute %s within a background process" +msgstr "백그라운드 프로세스에서는 %s 명령을 실행할 수 없습니다." + +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "CHECKPOINT 명령은 슈퍼유저만 사용할 수 있습니다" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "CHECKPOINT 명령은 슈퍼유저나 pg_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 매개 변수가 여러 개 있음" @@ -21888,7 +23863,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 매개 변수가 누락됨" @@ -21938,152 +23913,152 @@ 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 "인식할 수 없는 Thesaurus 매개 변수: \"%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:381 tsearch/spell.c:398 tsearch/spell.c:407 +#: tsearch/spell.c:1063 #, c-format msgid "invalid affix flag \"%s\"" msgstr "잘못된 affix 플래그: \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:385 tsearch/spell.c:1067 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "affix 플래그 범위 초과: \"%s\"" -#: tsearch/spell.c:414 +#: tsearch/spell.c:415 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "affix 플래그에 이상한 문자가 있음: \"%s\"" -#: tsearch/spell.c:434 +#: tsearch/spell.c:435 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" -msgstr "" +msgstr "\"long\" 플래그 값을 포함하는 잘못된 affix 플래그: \"%s\"" -#: tsearch/spell.c:524 +#: tsearch/spell.c:525 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "\"%s\" 사전 파일을 열 수 없음: %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, 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:983 tsearch/spell.c:1000 tsearch/spell.c:1017 +#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:17812 gram.y:17829 #, 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:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, 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:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "\"%s\" affix 파일을 열 수 없음: %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1297 #, 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:1341 #, c-format msgid "invalid number of flag vector aliases" msgstr "잘못된 플래그 백터 별칭 개수" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1364 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "alias 수가 지정한 %d 개수를 초과함" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1579 #, 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:1127 #, 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:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "%d번째 줄(해당 파일: \"%s\"): \"%s\"" -#: tsearch/ts_locale.c:329 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "wchar_t에서 서버 인코딩으로 변환하지 못함: %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:562 -#: tsearch/ts_parse.c:569 +#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 +#: tsearch/ts_parse.c:579 #, c-format msgid "word is too long to be indexed" msgstr "단어가 너무 길어서 인덱싱할 수 없음" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:563 -#: tsearch/ts_parse.c:570 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "Words longer than %d characters are ignored." msgstr "%d자보다 긴 단어는 무시됩니다." @@ -22103,155 +24078,196 @@ msgstr "\"%s\" 중지 단어 파일을 열 수 없음: %m" msgid "text search parser does not support headline creation" msgstr "전문 검색 분석기에서 헤드라인 작성을 지원하지 않음" -#: tsearch/wparser_def.c:2585 +#: tsearch/wparser_def.c:2577 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "인식할 수 없는 headline 매개 변수: \"%s\"" -#: tsearch/wparser_def.c:2604 +#: tsearch/wparser_def.c:2596 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords는 MaxWords보다 작아야 함" -#: tsearch/wparser_def.c:2608 +#: tsearch/wparser_def.c:2600 #, c-format msgid "MinWords should be positive" msgstr "MinWords는 양수여야 함" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2604 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord는 0보다 크거나 같아야 함" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2608 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments는 0보다 크거나 같아야 함" +#: utils/activity/pgstat.c:421 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "\"%s\" 매개 변수 통계 파일을 지울 수 없음: %m" + +#: utils/activity/pgstat.c:1209 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "잘못된 통계정보 종류: \"%s\"" + +#: utils/activity/pgstat.c:1289 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파일을 열 수 없음: %m" + +#: utils/activity/pgstat.c:1395 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파일에 쓰기 실패: %m" + +#: utils/activity/pgstat.c:1404 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파일을 닫을 수 없습니다: %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 임시 통계 파일 이름을 \"%s\" (으)로 바꿀 수 없습니다: %m" + +#: utils/activity/pgstat.c:1461 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "\"%s\" 통계 파일을 열 수 없음: %m" + +#: utils/activity/pgstat.c:1617 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "\"%s\" 통계 파일이 손상되었음" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "삭제될 함수를 호출함" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "%s 종류의 기존 통계 정보를 초기화합니다, db=%u, oid=%u" + # # nonun 부분 begin -#: 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 "식별자(identifier)가 너무 깁니다." -#: 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 "식별자(Identifier)는 %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 "%u 사용자 ID에서 기본 권한자로 할당하고 있습니다" -#: 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 배열은 일차원 배열이어야합니다" +msgstr "ACL 배열은 일차원 배열이어야 합니다" -#: 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 "aclremovie 더이상 지원하지 않음" -#: 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: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 "\"%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: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 -#, 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:645 utils/adt/json.c:740 +#: utils/adt/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "입력 자료형을 결정할 수 없음" @@ -22262,16 +24278,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:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "정수 범위를 벗어남" @@ -22311,271 +24327,293 @@ 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:2909 +#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 #, 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:2490 #, 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 "오른쪽 닫기 괄호 뒤에 정크" -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3344 -#: utils/adt/arrayfuncs.c:5817 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 +#: utils/adt/arrayfuncs.c:5883 #, 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: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: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: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: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/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:2565 +#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5869 +#: utils/adt/arrayfuncs.c:5895 utils/adt/arrayfuncs.c:5906 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "잘못된 배열 하위 스크립트(1,2...차원 배열 표시 문제)" -#: 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:2632 utils/adt/arrayfuncs.c:2946 #, 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: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 "" +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:3527 #, 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:3629 utils/adt/arrayfuncs.c:3800 +#: utils/adt/arrayfuncs.c:4191 #, 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:3978 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 "%s 자료형에서 사용할 해시 함수를 찾을 수 없습니다." -#: utils/adt/arrayfuncs.c:4044 +#: utils/adt/arrayfuncs.c:4106 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:5283 #, c-format msgid "data type %s is not an array type" msgstr "%s 자료형은 배열이 아닙니다." -#: utils/adt/arrayfuncs.c:5276 +#: utils/adt/arrayfuncs.c:5338 #, c-format msgid "cannot accumulate null arrays" msgstr "null 배열을 누적할 수 없음" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5366 #, c-format msgid "cannot accumulate empty arrays" msgstr "빈 배열을 누적할 수 없음" -#: utils/adt/arrayfuncs.c:5331 utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5393 utils/adt/arrayfuncs.c:5399 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "배열 차수가 서로 틀린 배열은 누적할 수 없음" -#: utils/adt/arrayfuncs.c:5701 utils/adt/arrayfuncs.c:5741 +#: utils/adt/arrayfuncs.c:5767 utils/adt/arrayfuncs.c:5807 #, 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:5870 utils/adt/arrayfuncs.c:5896 #, c-format msgid "Dimension array must be one dimensional." msgstr "차원 배열은 일차원 배열이어야 합니다." -#: utils/adt/arrayfuncs.c:5809 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:5875 utils/adt/arrayfuncs.c:5901 #, c-format msgid "dimension values cannot be null" msgstr "차원 값은 null일 수 없음" -#: utils/adt/arrayfuncs.c:5841 +#: utils/adt/arrayfuncs.c:5907 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "하한 배열의 크기가 차원 배열과 다릅니다." -#: utils/adt/arrayfuncs.c:6117 +#: utils/adt/arrayfuncs.c:6185 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "다차원 배열에서 요소 삭제기능은 지원되지 않음" -#: utils/adt/arrayfuncs.c:6394 +#: utils/adt/arrayfuncs.c:6462 #, c-format msgid "thresholds must be one-dimensional array" msgstr "threshold 값은 1차원 배열이어야 합니다." -#: utils/adt/arrayfuncs.c:6399 +#: utils/adt/arrayfuncs.c:6467 #, c-format msgid "thresholds array must not contain NULLs" msgstr "threshold 배열에는 null이 포함되지 않아야 함" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6700 +#, 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 "배열 lower bound가 너무 큽니다: %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이 포함되지 않아야 함" @@ -22586,713 +24624,719 @@ 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:276 utils/adt/datetime.c:4050 +#: 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:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, 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:179 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: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/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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "0으로는 나눌수 없습니다." -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "\"char\" 범위를 벗어났습니다." -#: 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 +#, 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 "TIME(%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: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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, 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: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: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 +#: 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: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 +#, 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: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 +#, 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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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 "타임스탬프 범위를 벗어남" + +#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 #, 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: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:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 +#: utils/adt/float.c:1124 utils/adt/int.c:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 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 "윈도우 함수에서 앞에 오거나 뒤에 따라오는 크기가 잘못됨" -#: utils/adt/date.c:2046 utils/adt/date.c:2059 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"%s\" 는 \"time\" 자료형 단위가 아닙니다." - -#: 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 "\"%s\" 는 \"time with time zone\" 자료형의 단위가 아닙니다." - -#: 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:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 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 "\"%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:5494 utils/adt/timestamp.c:5747 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" "\"%s\" 시간대 간격(interval time zone) 값으로 달(month) 또는 일(day)을 포함" "할 수 없습니다" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "날짜/시간 필드의 값이 범위를 벗어남: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "날짜 표현 방식(\"datestyle\")을 다른 것으로 사용하고 있는 듯 합니다." -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "interval 필드의 값이 범위를 벗어남: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "표준시간대 범위를 벗어남: \"%s\"" -#: utils/adt/datetime.c:4603 +#: utils/adt/datetime.c:4900 #, 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\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "" -"이 매개 변수에 유효한 단위는 \"bytes\",\"kB\", \"MB\", \"GB\", \"TB\"입니다." +"이 매개 변수에 유효한 단위는 \"bytes\",\"kB\", \"MB\", \"GB\", \"TB\", \"PB\"입니다." #: utils/adt/domains.c:92 #, c-format 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 "잘못된 16진수: \"%c\"" +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "잘못된 16진수: \"%.*s\"" -#: utils/adt/encode.c:212 +#: utils/adt/encode.c:216 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "잘못된 16진수 데이터: 데이터의 길이가 홀수 입니다." -#: 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 "base64 자료를 디코딩 하는 중 잘못된 \"%c\" 기호 발견" +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 -#: 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:629 +#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:529 +#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 +#: jsonpath_scan.l:578 #, 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 "" +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 "" +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 "\"%s\"는 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\"는 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:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallint의 범위를 벗어났습니다." -#: utils/adt/float.c:1468 utils/adt/numeric.c:8329 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, 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: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:1540 utils/adt/numeric.c:3245 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, c-format msgid "cannot take logarithm of zero" msgstr "0의 대수를 구할 수 없습니다." -#: 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:10185 #, 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: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:2706 +#: utils/adt/float.c:2796 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "" +msgstr "%g setseed 매개 변수가 [-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 "카운트 값은 0 보다 커야합니다" +msgstr "카운트 값은 0 보다 커야 합니다" -#: 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 "피연산자, 하한 및 상한은 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 "하한 및 상한은 유한한 값이어야 함" -#: 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 "하한값은 상한값과 같을 수 없습니다" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:561 #, c-format msgid "invalid format specification for an interval value" msgstr "간격 값에 대한 형식 지정이 잘못됨" -#: 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:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" -msgstr "" +msgstr "\"EEEE\"는 사용된 마지막 패턴이어야 합니다." -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" -msgstr "???\"9\"는 \"PR\" 앞이어야 한다." +msgstr "\"9\"는 \"PR\" 앞에 있어야 합니다." -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" -msgstr "???\"0\"은 \"PR\" 앞이어야 한다." +msgstr "\"0\"은 \"PR\" 앞에 있어야 합니다." -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" -msgstr "???여러개의 소숫점" +msgstr "소숫점이 여러개 있습니다." -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\" 와 소숫점을 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"를 두 번 사용할 수 없음" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, 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:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\" 와 \"MI\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\" 와 \"PL\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\" 와 \"SG\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, 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:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"를 두 번 사용할 수 없음" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"는 다른 포맷과 호환하지 않습니다" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format msgid "" "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "" +"\"EEEE\"는 숫자와 소수점 패턴, 이 두 형식과 함께 사용되어야 합니다." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "잘못된 datetime 양식 구분자: \"%s\"" -#: utils/adt/formatting.c:1522 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"는 숫자가 아닙니다." -#: utils/adt/formatting.c:1600 +#: utils/adt/formatting.c:1634 #, 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:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 함수에서 사용할 정렬규칙(collation)을 결정할 수 없음" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "날짜 변환을 위한 잘못된 조합" -#: utils/adt/formatting.c:2287 +#: utils/adt/formatting.c:2315 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "" "형식 템플릿에 그레고리오력과 ISO week date 변환을 함께 사용하지 마십시오." -#: utils/adt/formatting.c:2310 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "형식 문자열에서 \"%s\" 필드의 값이 충돌함" -#: utils/adt/formatting.c:2313 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "이 값은 동일한 필드 형식의 이전 설정과 모순됩니다." -#: utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "소스 문자열이 너무 짧아서 \"%s\" 형식 필드에 사용할 수 없음" -#: utils/adt/formatting.c:2387 +#: utils/adt/formatting.c:2415 #, 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:2418 utils/adt/formatting.c:2433 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "소스 문자열이 고정 너비가 아닌 경우 \"FM\" 한정자를 사용해 보십시오." -#: utils/adt/formatting.c:2400 utils/adt/formatting.c:2414 -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%s\" 값은 \"%s\"에 유효하지 않음" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2430 #, 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:2444 #, c-format msgid "Value must be an integer." msgstr "값은 정수여야 합니다." -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "소스 문자열의 \"%s\" 값이 범위를 벗어남" -#: utils/adt/formatting.c:2423 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "값은 %d에서 %d 사이의 범위에 있어야 합니다." -#: utils/adt/formatting.c:2639 +#: utils/adt/formatting.c:2667 #, 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" -msgstr "" +msgstr "자국어화 문자열 포멧 값이 너무 깁니다" -#: utils/adt/formatting.c:3300 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" -msgstr "" +msgstr "맞지 않는 구분자 포멧 \"%c\"" -#: utils/adt/formatting.c:3361 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "짝이 안 맞는 \"%s\" 문자" -#: utils/adt/formatting.c:3467 utils/adt/formatting.c:3811 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, 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:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "\"Y,YYY\"에 대한 입력 문자열이 잘못됨" -#: utils/adt/formatting.c:3728 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "입력 문자열이 datetime 양식용으로는 너무 짧습니다" -#: utils/adt/formatting.c:3736 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" -msgstr "" +msgstr "날짜 및 시간 형식 후 입력 문자열에 남은 문자가 있습니다." -#: utils/adt/formatting.c:4281 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" -msgstr "" +msgstr "timestamptz 자료형을 위한 입력 문자열에 시간대가 누락되었습니다." -#: utils/adt/formatting.c:4287 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptz 범위를 벗어남" -#: utils/adt/formatting.c:4315 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetime 양식이 지역시간대값이 있는데, 시간값이 아님" -#: utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" -msgstr "" +msgstr "timetz 자료형을 위한 입력 문자열에 시간대가 누락되었습니다." -#: utils/adt/formatting.c:4373 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetz 범위를 벗어남" -#: utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" -msgstr "" +msgstr "날짜시간 형식이 날짜도 아니고, 시간도 아닙니다." -#: utils/adt/formatting.c:4532 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "시간 \"%d\"은(는) 12시간제에 유효하지 않음" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4623 #, 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:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "연도 정보 없이 몇번째 날(day of year) 인지 계산할 수 없습니다." -#: utils/adt/formatting.c:5564 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" 입력 양식은 지원되지 않습니다." -#: utils/adt/formatting.c:5576 +#: utils/adt/formatting.c:5665 #, 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:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, 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\" 파일에서 seek 작업을 할 수 없음: %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 확장 모듈을 사용할 때는 파일을 읽으려면 슈퍼유져여야함" @@ -23302,114 +25346,74 @@ 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 "선 정의가 잘못된: 두 점은 서로 다른 위치여야 함" -#: 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:4330 +#: utils/adt/geo_ops.c:5210 #, 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\" 의 값에 잘못된 갯수의 point들" -#: 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\" 값에 잘못된 갯수의 point들" -#: 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:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "닫히지 않은 path 는 폴리곤으로 변환할 수 없습니다." -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "부적절한 \"circle\" 값의 반지름" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "반지름이 0인 원은 폴리곤으로 변환할 수 없습니다." -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "적어도 2개의 point들이 필요합니다." -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector 는 너무 많은 요소를 가지고 있습니다." - -#: utils/adt/int.c:239 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "잘못된 int2vector 자료" -#: utils/adt/int.c:245 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:1528 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 "단계 크기는 0일 수 없음" -#: 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:4364 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint의 범위를 벗어났습니다." -#: utils/adt/int8.c:1396 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID의 범위를 벗어났습니다." @@ -23420,23 +25424,23 @@ 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:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "%s 함수의 인자들은 각각 key, value 쌍으로 있어야 합니다." @@ -23451,18 +25455,18 @@ msgstr "%d 번째 인자는 null 이면 안됩니다" msgid "Object keys should be text." msgstr "개체 키는 문자열이어야 합니다." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "배열은 두개의 칼럼이어야 함" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "배열 차수가 안맞음" @@ -23478,174 +25482,204 @@ msgid "" "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "구현상 제한으로 jsonb 문자열은 %d 바이트를 넘을 수 없습니다." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "%d 번째 인자: 키 값은 null이면 안됩니다." -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "개체 키는 문자열이어야 합니다" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "jsonb null 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "jsonb 문자열 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "jsonb 숫자 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "jsonb 불린 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "jsonb 배열 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "jsonb object 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "jsonb object나 배열 값을 %s 자료형으로 형 변환 할 수 없음" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:752 #, 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:793 #, 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:1667 utils/adt/jsonb_util.c:1687 #, 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:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, 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 서브스크립트가 slice를 지원하지 않음" + +#: 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 서브스크립트로는 숫자 또는 문자열 중 하나만 쓸 수 있음" + +#: utils/adt/jsonbsubs.c:118 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "jsonb 서브스크립트로는 숫자 또는 문자열 중 하나만 쓸 수 있음" + +#: utils/adt/jsonbsubs.c:139 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "배열 서브스크립트는 반드시 문자열이어야합니다." + +#: utils/adt/jsonbsubs.c:207 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "jsonb 서브스크립트로 null 값이 올 수 없음" + +#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, 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:566 utils/adt/jsonfuncs.c:785 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "배열형에서는 %s 호출 할 수 없음" -#: utils/adt/jsonfuncs.c:613 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:494 #, c-format msgid "unsupported Unicode escape sequence" msgstr "지원하지 않는 유니코드 이스케이프 조합" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:694 #, 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:1834 utils/adt/jsonfuncs.c:1869 #, 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:1838 utils/adt/jsonfuncs.c:1857 #, c-format msgid "cannot get array length of a non-array" msgstr "비배열형 자료의 배열 길이를 구할 수 없음" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "비개체형에서 %s 호출 할 수 없음" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" -msgstr "" +msgstr "배열을 객체로 해체할 수 없음" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "스칼라형으로 재구축할 수 없음" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "스칼라형에서 요소를 추출할 수 없음" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "개체형에서 요소를 추출할 수 없음" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, 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:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "예기치 않은 json 배열" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "\"%s\" 키의 값을 지정하세요" -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "%s 배열 요소, 해당 키: \"%s\" 참조" -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "배열 요소: %s 참조" -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2489 #, 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:3316 #, c-format msgid "first argument of %s must be a row type" msgstr "%s의 첫번째 인자는 row 형이어야 합니다" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3340 #, c-format msgid "could not determine row type for result of %s" msgstr "%s 함수의 반환 로우 자료형을 알수가 없음" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3342 #, c-format msgid "" "Provide a non-null record argument, or call the function in the FROM clause " @@ -23654,108 +25688,123 @@ msgstr "" "non-null 레코드 인자를 지정하거나, 함수를 호출 할 때 FROM 절에서 칼럼 정의 목" "록도 함께 지정해야 합니다." -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, 이 구문에서는 허용되지 않습니다" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, c-format msgid "argument of %s must be an array of objects" msgstr "%s의 인자는 개체의 배열이어야 합니다" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:3865 #, 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:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "스칼라형에서 삭제 할 수 없음" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4417 #, 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:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "스칼라형에는 path 를 지정할 수 없음" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4540 #, c-format msgid "JSON value must not be null" msgstr "JSON 값으로 null을 사용할 수 없음" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4541 #, c-format msgid "" "Exception was raised because null_value_treatment is \"raise_exception\"." -msgstr "" +msgstr "null_value_treatment 설정값이 \"raise_exception\"으로 되어 있어 예외를 일으켰습니다." -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4542 #, 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:4597 #, c-format msgid "cannot delete path in scalar" msgstr "스칼라형에서 path를 지울 수 없음" -#: utils/adt/jsonfuncs.c:4776 -#, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "jsonb 개체들의 잘못된 결합" - -#: utils/adt/jsonfuncs.c:4810 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "%d 위치의 path 요소는 null 입니다." -#: utils/adt/jsonfuncs.c:4896 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "이미 있는 키로는 대체할 수 없음" -#: utils/adt/jsonfuncs.c:4897 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "path assumes key는 복합 자료형인데, 스칼라 값이 사용되고 있습니다." + +#: utils/adt/jsonfuncs.c:4937 #, 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:5041 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "%d 번째 위치의 path 요소는 정수가 아님: \"%s\"" -#: utils/adt/jsonfuncs.c:5098 +#: utils/adt/jsonfuncs.c:5058 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "%d 번째 위치의 path 요소는 범위를 벗어남: %d" + +#: utils/adt/jsonfuncs.c:5210 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" -msgstr "" +msgstr "잘못된 플래그 자료형, 배열이나, 스칼라 형만 허용합니다." -#: utils/adt/jsonfuncs.c:5105 +#: utils/adt/jsonfuncs.c:5217 #, 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:5218 utils/adt/jsonfuncs.c:5240 #, 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:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" -msgstr "" +msgstr "플래그 배열 안에 잘못된 플래그: \"%s\"" #: utils/adt/jsonpath.c:362 #, c-format @@ -23775,28 +25824,29 @@ msgstr "단일 불리언 반환값이 예상 됨" #: utils/adt/jsonpath_exec.c:556 #, c-format msgid "\"vars\" argument is not an object" -msgstr "" +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\" 객체의 키-값 쌍으로 인코드 되어야합니다." #: utils/adt/jsonpath_exec.c:674 #, c-format msgid "JSON object does not contain key \"%s\"" -msgstr "" +msgstr "JSON 객체 안에 \"%s\" 이름의 키가 없습니다." #: utils/adt/jsonpath_exec.c:686 #, c-format msgid "jsonpath member accessor can only be applied to an object" -msgstr "" +msgstr "jsonpath member accessor는 하나의 객체를 대상으로 합니다." #: utils/adt/jsonpath_exec.c:715 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" -msgstr "" +msgstr "jsonpath wildcard array accessor는 하나의 배열을 대상으로 합니다." #: utils/adt/jsonpath_exec.c:763 #, c-format @@ -23806,17 +25856,17 @@ msgstr "jsonpath 배열 하위 스크립트 범위를 초과했습니다" #: utils/adt/jsonpath_exec.c:820 #, c-format msgid "jsonpath array accessor can only be applied to an array" -msgstr "" +msgstr "jsonpath array accessor는 하나의 배열을 대상으로 합니다." -#: 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 "" +msgstr "jsonpath wildcard member accessor는 하나의 객체를 대상으로 합니다." -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1006 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "" +msgstr "jsonpath .%s() item method는 하나의 배열을 대상으로 합니다." #: utils/adt/jsonpath_exec.c:1059 #, c-format @@ -23824,8 +25874,8 @@ msgid "" "numeric argument of jsonpath item method .%s() is out of range for type " "double precision" msgstr "" -"jsonpath 아이템 메서드 .%s() 의 숫자 인자가 double precision 형의 " -"범위를 벗어남" +"jsonpath 아이템 메서드 .%s() 의 숫자 인자가 double precision 형의 범위를 벗어" +"남" #: utils/adt/jsonpath_exec.c:1080 #, c-format @@ -23833,37 +25883,40 @@ msgid "" "string argument of jsonpath item method .%s() is not a valid representation " "of a double precision number" msgstr "" +"jsonpath item method .%s()의 문자열 인자가 double precision 숫자로 표현되는 " +"형식이 아닙니다." #: utils/adt/jsonpath_exec.c:1093 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "" +"jsonpath item method .%s() 대상은 문자열이나, 숫자 값만 허용합니다." #: utils/adt/jsonpath_exec.c:1583 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" -msgstr "" +msgstr "jsonpath %s 연산자의 왼쪽 값이 단일 숫자값이 아닙니다." #: utils/adt/jsonpath_exec.c:1590 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" -msgstr "" +msgstr "jsonpath %s 연산자의 오른쪽 값이 단일 숫자값이 아닙니다." #: utils/adt/jsonpath_exec.c:1658 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" -msgstr "" +msgstr "jsonpath %s 단항 연산용 값이 숫자가 아닙니다." #: utils/adt/jsonpath_exec.c:1756 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" -msgstr "" +msgstr "jsonpath .%s() 항목 메서드는 숫자값만 대상으로 합니다." #: utils/adt/jsonpath_exec.c:1796 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" -msgstr "" +msgstr "jsonpath .%s() 항목 메서드는 문자열만 대상으로 합니다." #: utils/adt/jsonpath_exec.c:1890 #, c-format @@ -23873,37 +25926,37 @@ msgstr "알 수 없는 datetime 양식: \"%s\"" #: utils/adt/jsonpath_exec.c:1892 #, c-format msgid "Use a datetime template argument to specify the input data format." -msgstr "" +msgstr "입력 자료 형식을 지정하는 datetime 템플릿 인자를 사용하세요." #: utils/adt/jsonpath_exec.c:1960 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" -msgstr "" +msgstr "jsonpath .%s() 항목 메서드는 객체만 대상으로 합니다." -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2142 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "\"%s\" jsonpath 변수 찾기 실패" -#: utils/adt/jsonpath_exec.c:2407 +#: utils/adt/jsonpath_exec.c:2406 #, c-format msgid "jsonpath array subscript is not a single numeric value" -msgstr "" +msgstr "jsonpath 배열 첨자가 단일 숫자값이 아닙니다." -#: utils/adt/jsonpath_exec.c:2419 +#: utils/adt/jsonpath_exec.c:2418 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath 배열 하위 스크립트가 정수 범위를 초과했음" -#: utils/adt/jsonpath_exec.c:2596 +#: utils/adt/jsonpath_exec.c:2595 #, c-format msgid "cannot convert value from %s to %s without time zone usage" -msgstr "" +msgstr "지역 시간대 지정 없이는 %s에서 %s로 값을 바꿀 수 없습니다." -#: utils/adt/jsonpath_exec.c:2598 +#: utils/adt/jsonpath_exec.c:2597 #, c-format msgid "Use *_tz() function for time zone support." -msgstr "" +msgstr "지역 시간대를 지정하려면, *_tz() 함수를 사용하세요." #: utils/adt/levenshtein.c:133 #, c-format @@ -23915,7 +25968,7 @@ msgstr "levenshtein 인자값으로 그 길이가 %d 문자의 최대 길이를 msgid "nondeterministic collations are not supported for LIKE" msgstr "LIKE 연산에서 사용할 비결정 정렬규칙(collation)은 지원하지 않음" -#: utils/adt/like.c:193 utils/adt/like_support.c:1002 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "ILIKE 연산에서 사용할 정렬규칙(collation)을 결정할 수 없음" @@ -23930,27 +25983,27 @@ msgstr "ILIKE 연산에서 사용할 비결정 정렬규칙(collation)은 지원 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 "이스케이프 문자열은 비어있거나 한개의 문자여야 합니다." -#: utils/adt/like_support.c:987 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "bytea 형식에서는 대/소문자를 구분하지 않는 일치가 지원되지 않음" -#: utils/adt/like_support.c:1089 +#: utils/adt/like_support.c:1115 #, 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\"에 대한 잘못된 옥텟(octet) 값: \"%s\"" @@ -23968,220 +26021,282 @@ msgid "" "from macaddr8 to macaddr." msgstr "" -#: 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 "" + +#: utils/adt/misc.c:485 +msgid "requires AS" +msgstr "" + +#: 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 "" + +#: 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 "비정상적인 multirange 문자열: \"%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\"." +msgid "Expected range start." +msgstr "범위 시작값 없음" + +#: utils/adt/multirangetypes.c:263 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "multirange 구분자(,) 또는 끝이 없습니다." + +#: utils/adt/multirangetypes.c:976 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "" -#: utils/adt/network.c:111 +#: utils/adt/multirangetypes.c:1002 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "multirange의 한 범위로 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 값에서 서로 크기가 틀리게 부분 추출(subtract)할 수 없음" -#: utils/adt/numeric.c:827 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "외부 \"numeric\" 값의 부호가 잘못됨" -#: utils/adt/numeric.c:833 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "외부 \"numeric\" 값의 잘못된 스케일" -#: utils/adt/numeric.c:842 +#: utils/adt/numeric.c:1042 #, 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: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:1045 +#: 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:1063 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "잘못된 NUMERIC 형식 한정자" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "시작값은 NaN 일 수 없음" -#: utils/adt/numeric.c:1400 +#: utils/adt/numeric.c:1642 +#, c-format +msgid "start value cannot be infinity" +msgstr "시작 값은 무한일 수 없음" + +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "종료값은 NaN 일 수 없음" -#: utils/adt/numeric.c:1410 +#: utils/adt/numeric.c:1653 +#, c-format +msgid "stop value cannot be infinity" +msgstr "종료값은 무한일 수 없음" + +#: utils/adt/numeric.c:1666 #, 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:1670 #, c-format -msgid "value overflows numeric format" -msgstr "값이 수치 형식에 넘처남" +msgid "step size cannot be infinity" +msgstr "단계 크기는 무한일 수 없음" -#: utils/adt/numeric.c:3417 +#: utils/adt/numeric.c:3551 #, c-format -msgid "cannot convert NaN to integer" -msgstr "NaN 값을 정수형으로 변환할 수 없습니다" +msgid "factorial of a negative number is undefined" +msgstr "음수 거듭제곱이 정의되어 있지 않음" + +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 +#, c-format +msgid "value overflows numeric format" +msgstr "값이 수치 형식에 넘처남" -#: utils/adt/numeric.c:3500 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, 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:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, 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:4599 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "무한(infinity)은 숫자로 변환할 수 없음" +msgid "pg_lsn out of range" +msgstr "pg_lsn 값의 범위를 벗어났습니다." -#: utils/adt/numeric.c:6606 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "수치 필드 오버플로우" -#: utils/adt/numeric.c:6607 +#: utils/adt/numeric.c:7548 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -24190,60 +26305,77 @@ msgstr "" "전체 자릿수 %d, 소수 자릿수 %d의 필드는 %s%d보다 작은 절대 값으로 반올림해야 " "합니다." -#: utils/adt/numutils.c:154 +#: utils/adt/numeric.c:7594 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "값 \"%s\"은(는) 8비트 정수의 범위를 벗어남" +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "" +"전체 자릿수 %d, 소수 자릿수 %d의 필드는 무한 값을 처리할 수 없음." -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "잘못된 oidvector 자료" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:975 #, 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:1019 #, 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:1023 #, 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:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "요청한 문자가 너무 커서 인코딩할 수 없음: %u" + +#: utils/adt/oracle_compat.c:1082 +#, 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:1262 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "OS 라이브러리 패키지를 업데이트 하세요." -#: utils/adt/pg_locale.c:1477 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "\"%s\" 로케일용 문자 정렬 규칙 열기 실패: %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU 지원 기능을 뺀 채로 서버가 만들어졌습니다." + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "\"%s\" 로케일을 만들 수 없음: %m" -#: utils/adt/pg_locale.c:1480 +#: utils/adt/pg_locale.c:1500 #, 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:1608 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -24252,193 +26384,222 @@ msgstr "" "이 플랫폼에서는 서로 다른 정렬규칙(collation)과 문자집합(ctype)을 함께 쓸 수 " "없습니다." -#: utils/adt/pg_locale.c:1591 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "이 플랫폼에서는 LIBC 문자 정렬 제공자 기능(ICU)을 지원하지 않음." -#: utils/adt/pg_locale.c:1603 -#, c-format -msgid "" -"collations with different collate and ctype values are not supported by ICU" -msgstr "" -"ICU 지원 기능에서는 서로 다른 정렬규칙(collation)과 문자집합(ctype)을 함께 " -"쓸 수 없습니다." - -#: 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 "\"%s\" 로케일용 문자 정렬 규칙 열기 실패: %s" - -#: utils/adt/pg_locale.c:1623 -#, 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 "--with-icu 옵션을 사용하여 PostgreSQL을 다시 빌드해야 합니다." - -#: utils/adt/pg_locale.c:1644 +#: utils/adt/pg_locale.c:1652 #, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "\"%s\" 정렬규칙은 분명한 버전이 없는데 버전을 지정했음" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "\"%s\" 문자 정렬 규칙은 버전이 없는데 버전을 지정했음" -#: utils/adt/pg_locale.c:1651 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" -msgstr "\"%s\" 정렬규칙은 버전이 맞지 않음" +msgstr "\"%s\" 문자 정렬 규칙은 버전이 맞지 않음" -#: utils/adt/pg_locale.c:1653 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "" "The collation in the database was created using version %s, but the " "operating system provides version %s." msgstr "" +"데이터베이스를 만들때 %s 버전으로 문자 정렬 규칙을 만들었는데, " +"현재 OS는 %s 버전을 제공하고 있습니다." -#: utils/adt/pg_locale.c:1656 +#: utils/adt/pg_locale.c:1663 #, 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:1734 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "\"%s\" 로케일을 만들 수 없음: %m" -#: utils/adt/pg_locale.c:1747 +#: utils/adt/pg_locale.c:1759 #, 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:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "\"%s\" 인코딩은 ICU 기능을 지원하지 않음" -#: utils/adt/pg_locale.c:1791 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "\"%s\" 인코딩용 ICU 변환기 열기 실패: %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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s 실패: %s" -#: utils/adt/pg_locale.c:2142 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "로케일을 위한 잘못된 멀티바이트 문자" -#: utils/adt/pg_locale.c:2143 +#: utils/adt/pg_locale.c:2183 #, 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 "pg_lsn 에서는 NaN 형을 빼낼 수 없습니다" + #: 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: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 "shell 형식의 값은 표시할 수 없음" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:404 #, c-format msgid "range constructor flags argument must not be null" msgstr "range 자료형 구성자 플래그 인자로 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 "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 "잘못된 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 "유효한 값은 \"[]\", \"[)\", \"(]\", \"()\"." -#: 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 "비정상적인 range 문자: \"%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:4528 #, 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: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() 함수 사용인 경우, 네번째 " +"인자는 정수형을 지정해야합니다." + +#: 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:11859 utils/misc/guc.c:11893 #, c-format -msgid "invalid regular expression option: \"%c\"" -msgstr "잘못된 정규식 옵션: \"%c\"" +msgid "invalid value for parameter \"%s\": %d" +msgstr "잘못된 \"%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 " @@ -24446,113 +26607,115 @@ msgid "" msgstr "" #. 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 "너무 많음 정규식 매치" -#: 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:8771 #, 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:8772 #, 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: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:9877 utils/adt/ruleutils.c:10046 #, 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:3667 utils/adt/varlena.c:3672 #, 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: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 "" "\"%s\" 테이블에서 자료 추가, 갱신 작업이 \"%s\" 참조키(foreign key) 제약 조건" "을 위배했습니다" -#: 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에 null 키 값과 nonnull 키 값을 함께 사용할 수 없습니다." -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "INSERT에 대해 \"%s\" 함수를 실행해야 함" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "UPDATE에 대해 \"%s\" 함수를 실행해야 함" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "DELETE에 대해 \"%s\" 함수를 실행해야 함" -#: 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 "\"%s\" 트리거(해당 테이블: \"%s\")에 대한 pg_constraint 항목이 없음" -#: 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 " @@ -24561,12 +26724,12 @@ msgstr "" "해당 트리거 관련 개체를 제거한 후 ALTER TABLE ADD CONSTRAINT 명령으로 추가하" "세요" -#: utils/adt/ri_triggers.c:2007 gram.y:3818 +#: utils/adt/ri_triggers.c:2098 gram.y:4172 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL 기능은 아직 구현 안되었습니다" -#: 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 " @@ -24575,32 +26738,32 @@ msgstr "" "\"%s\"에 대한 참조 무결성 쿼리(제약조건: \"%s\", 해당 릴레이션: \"%s\")를 실" "행하면 예기치 않은 결과가 발생함" -#: 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 "이 문제는 주로 룰이 재작성 되었을 때 발생합니다." -#: utils/adt/ri_triggers.c:2460 +#: utils/adt/ri_triggers.c:2588 #, 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:2591 utils/adt/ri_triggers.c:2616 #, 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:2602 #, 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:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "\"%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 " @@ -24609,133 +26772,136 @@ msgstr "" "\"%s\" 테이블의 자료 갱신, 삭제 작업이 \"%s\" 참조키(foreign key) 제약 조건 " "- \"%s\" 테이블 - 을 위반했습니다" -#: utils/adt/ri_triggers.c:2491 +#: utils/adt/ri_triggers.c:2619 #, 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 "" -#: 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:2707 +#, c-format +msgid "input is a query, not an expression" +msgstr "입력값이 expression이 아니라, query 임" + +#: utils/adt/ruleutils.c:2719 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "expression이 하나 이상의 릴레이션 변수를 포함하고 있음" + +#: utils/adt/ruleutils.c:2726 +#, c-format +msgid "expression contains variables" +msgstr "expression이 변수들을 포함하고 있음" + +#: utils/adt/ruleutils.c:5249 #, 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:11901 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12883 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "타임스탬프 값이 범위를 벗어났음: \"%s\"" -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:375 #, 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: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 "타임스탬프 값이 범위를 벗어났음: %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 "타임스탬프 값이 범위를 벗어났음: \"%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 #, c-format msgid "invalid INTERVAL type modifier" @@ -24756,51 +26922,30 @@ msgstr "INTERVAL(%d) 정밀도는 허용 최대치(%d)로 감소 되었습니다 msgid "interval(%d) precision must be between %d and %d" msgstr "간격(%d) 정밀도는 %d에서 %d 사이여야 함" -#: utils/adt/timestamp.c:2643 +#: utils/adt/timestamp.c:2689 #, 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 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "\"%s\" timestamp 유닛은 지원하지 않습니다" - -#: utils/adt/timestamp.c:3926 utils/adt/timestamp.c:4459 -#: utils/adt/timestamp.c:4698 -#, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "\"%s\" timestamp 유닛을 처리하지 못했습니다" - -#: utils/adt/timestamp.c:4056 utils/adt/timestamp.c:4500 -#: utils/adt/timestamp.c:4863 utils/adt/timestamp.c:4885 -#, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "\"%s\" 시간대 유닛이 있는 timestamp 자료형은 지원하지 않습니다" - -#: utils/adt/timestamp.c:4073 utils/adt/timestamp.c:4454 -#: utils/adt/timestamp.c:4894 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "\"%s\" 시간대 유닛이 있는 timestamp 값을 처리하지 못했습니다" +msgid "origin out of range" +msgstr "오리진의 범위를 벗어났습니다." -#: utils/adt/timestamp.c:4231 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format -msgid "" -"interval units \"%s\" not supported because months usually have fractional " -"weeks" -msgstr "" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "timestamp값은 월이나 년을 포함하는 interval 형으로 바인드할 수 없음" -#: utils/adt/timestamp.c:4237 utils/adt/timestamp.c:4988 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format -msgid "interval units \"%s\" not supported" -msgstr "\"%s\" 유닛 간격(interval units)은 지원하지 않습니다" +msgid "stride must be greater than zero" +msgstr "stride 값은 0 보다 커야 합니다" -#: utils/adt/timestamp.c:4253 utils/adt/timestamp.c:5011 +#: utils/adt/timestamp.c:4399 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "\"%s\" 유닛 간격(interval units)을 처리하지 못했습니다" +msgid "Months usually have fractional weeks." +msgstr "달에는 보통 분수형태의 주간이 있습니다." #: utils/adt/trigfuncs.c:42 #, c-format @@ -24827,43 +26972,45 @@ 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" +msgid "" +"distance in phrase operator must be an integer value between zero and %d " +"inclusive" 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 길이가 너무 깁니다" @@ -24877,11 +27024,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" @@ -24902,7 +27044,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 "가중치가 범위를 벗어남" @@ -24918,58 +27060,62 @@ msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "" "문자열이 너무 길어서 tsvector에 사용할 수 없음(%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:2434 #, 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:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "\"%s\" tsvector 칼럼이 없음" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "\"%s\" 칼럼은 tsvector 형식이 아님" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "\"%s\" 구성 칼럼이 없음" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "\"%s\" 칼럼은 regconfig 형이 아님" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "\"%s\" 구성 칼럼은 null이 아니어야 함" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2668 #, 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:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "\"%s\" 칼럼은 문자형이 아님" @@ -24989,83 +27135,83 @@ 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 이상이어야합니다" +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 이하여야합니다" +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\" 문자는 2진수 문자가 아닙니다" +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 "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" 문자는 16진수 문자가 아닙니다" +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:3309 +#: utils/adt/varlena.c:3387 #, 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:3591 #, c-format msgid "new bit must be 0 or 1" -msgstr "새 비트값은 0 또는 1 이어야합니다" +msgstr "새 비트값은 0 또는 1 이어야 합니다" #: utils/adt/varchar.c:157 utils/adt/varchar.c:310 #, c-format @@ -25077,116 +27223,126 @@ 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 "문자열 비교 작업에 사용할 정렬규칙(collation)을 결정할 수 없음" -#: 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 "문자열 검색 작업에 사용할 비결정 정렬규칙(collation)을 지원하지 않음" -#: 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 "유니코드 문자열 비교 실패: %m" -#: utils/adt/varlena.c:1653 utils/adt/varlena.c:2367 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "문자열 정렬: %s" -#: utils/adt/varlena.c:2575 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "정렬 키 생성 실패: %s" -#: utils/adt/varlena.c:3450 utils/adt/varlena.c:3517 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, 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:3506 utils/adt/varlena.c:3578 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "%lld 인덱스의 범위를 벗어남, 0..%lld" -#: utils/adt/varlena.c:4590 +#: utils/adt/varlena.c:4640 #, 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:5660 #, 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:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "하나의 \"%%\" 문자를 표시하려면, \"%%%%\" 형태로 사용하세요" -#: utils/adt/varlena.c:5589 utils/adt/varlena.c:5710 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, 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:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "format() 작업을 위한 인자가 너무 적음" -#: utils/adt/varlena.c:5755 utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "수치 범위를 벗어남" -#: utils/adt/varlena.c:5818 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "" "format 함수에서 사용할 수 있는 인자 위치 번호는 0이 아니라, 1부터 시작합니다" -#: utils/adt/varlena.c:5839 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "넓이 인자 위치값은 \"$\" 문자로 끝나야 합니다" -#: utils/adt/varlena.c:5884 +#: utils/adt/varlena.c:6088 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "null 값은 SQL 식별자로 포멧될 수 없음" -#: utils/adt/varlena.c:6010 +#: utils/adt/varlena.c:6214 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "" -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "잘못된 normalization 형식: %s" -#: utils/adt/windowfuncs.c:243 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "잘못된 유니코드 코드 포인트: %04X" + +#: utils/adt/varlena.c:6530 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "유니코드 이스케이프는 \\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 +#: utils/adt/xid8funcs.c:117 #, c-format -msgid "transaction ID %s is in the future" -msgstr "%s 트랜잭션 ID는 미래의 것입니다" +msgid "transaction ID %llu is in the future" +msgstr "%llu 트랜잭션 ID는 미래의 것입니다" #: utils/adt/xid8funcs.c:547 #, c-format @@ -25203,64 +27359,59 @@ 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 "--with-libxml을 사용하여 PostgreSQL을 다시 빌드해야 합니다." - -#: 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 "xmlvalidate가 구현되어 있지 않음" -#: 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." +"libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "" -"libxml2에 호환되지 않는 문자 자료형 있음: sizeof(char)=%u, sizeof(xmlChar)=%u" +"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 " @@ -25269,116 +27420,116 @@ msgstr "" "이 문제는 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 "독립 실행형은 '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 "" "이 배열은 key, value로 구성된 배열을 요소로 하는 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\" 및 URI \"%s\"을(를) 사용하여 XML 네임스페이스를 등록할 수 없음" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4450 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT 네임스페이스는 지원하지 않습니다." -#: 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 표현식에 사용된 결과가 하나 이상의 값을 사용합니다" -#: 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 형으로 바꾸는 형변환 규칙(cast)가 없음" # # nonun 부분 end -#: 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 자료형을 위한 출력 함수가 없습니다" @@ -25392,152 +27543,161 @@ 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:3753 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "이진 업그레이드 작업 때, 힙 relfilenode 값이 지정되지 않았습니다" + +#: utils/cache/relcache.c:3761 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "바이너리 업그레이드 모드 중에 새 relfilenode 값 요청이 실패" + +#: utils/cache/relcache.c:6472 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "\"%s\" 릴레이션-캐시 초기화 파일을 만들 수 없음: %m" -#: utils/cache/relcache.c:6080 +#: utils/cache/relcache.c:6474 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "어쨌든 계속하는데, 뭔가 잘못 된 것이 있습니다." -#: utils/cache/relcache.c:6402 +#: utils/cache/relcache.c:6796 #, 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\" 릴레이션 맵핑 파일에 잘못된 checksum 값이 있음" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, 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: %d PID 안에 잘못된 인자\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 "stderr 로 사용하기 위해 \"%s\" 파일 다시 열기 실패: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" -msgstr "표준출력(stdout)으로 사용하기 위해 \"%s\" 파일을 여는 도중 실패: %m" +msgstr "표준출력(stdout)으로 사용하기 위해 \"%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: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 "오류 내용을 뺍니다" -#: 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 " %d 번째 문자 부근" -#: utils/error/elog.c:2909 utils/error/elog.c:2916 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "상세정보: " -#: utils/error/elog.c:2923 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "힌트: " -#: utils/error/elog.c:2930 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "쿼리:" -#: utils/error/elog.c:2937 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "내용: " -#: utils/error/elog.c:2947 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "위치: %s, %s:%d\n" -#: utils/error/elog.c:2954 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "위치: %s:%d\n" -#: utils/error/elog.c:2961 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " -msgstr "" +msgstr "역추적: " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "명령 구문: " -#: utils/error/elog.c:3364 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "디버그" -#: utils/error/elog.c:3368 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "로그" -#: utils/error/elog.c:3371 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "정보" -#: utils/error/elog.c:3374 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "알림" -#: utils/error/elog.c:3377 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "경고" -#: utils/error/elog.c:3380 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "오류" -#: utils/error/elog.c:3383 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "치명적오류" -#: utils/error/elog.c:3386 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "손상" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "\"%s\" 함수를 \"%s\" 파일에서 찾을 수 없음" @@ -25567,51 +27727,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\", 라이브러리 ABI는 \"%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\" 라이브러리는 사용할 수 없습니다: magic black 틀림" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "\"%s\" 라이브러리 사용이 금지되어있습니다" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "동적 라이브러리 경로에서 잘못된 매크로 이름: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, 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:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "\"dynamic_library_path\" 매개 변수 값으로 절대 경로를 사용할 수 없음" @@ -25621,190 +27791,200 @@ 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 "" +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 "_^_ %d 알수 없는 API 버전이 \"%s\" 함수에 의해서 보고되었음" +msgstr "%d 알수 없는 API 버전이 \"%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 "" +msgstr "연산자 클래스 옵션 정보가 함수 호출 컨텍스트에서 빠졌음" -#: 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 "" "%u OID 언어 유효성 검사 함수가 %u OID 프로시져 언어용으로 호출되었음, 원래 언" "어는 %u" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:498 #, 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:643 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "%s 로 선언된 인자가 range 자료형이 아니고, %s 자료형입니다" + +#: utils/fmgr/funcapi.c:726 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "%s 자료형용 multirange 형을 찾을 수 없음" + +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "alias 수가 열 수와 틀립니다" -#: utils/fmgr/funcapi.c:1677 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "열 별칭이 제공되지 않았음" -#: utils/fmgr/funcapi.c:1701 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "레코드를 리턴하는 함수를 위한 행(row) 구성 정보를 구할 수 없음" -#: utils/init/miscinit.c:285 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "\"%s\" 데이터 디렉터리 없음" -#: utils/init/miscinit.c:290 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "\"%s\" 디렉터리 읽기 권한 없음: %m" -#: utils/init/miscinit.c:298 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "지정한 \"%s\" 데이터 디렉터리는 디렉터리가 아님" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "\"%s\" 데이터 디렉터리 소유주가 잘못 되었습니다." -#: 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 "서버는 지정한 데이터 디렉터리의 소유주 권한으로 시작되어야합니다." +msgstr "서버는 지정한 데이터 디렉터리의 소유주 권한으로 시작되어야 합니다." -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "\"%s\" 데이터 디렉터리 접근 권한에 문제가 있습니다." -#: 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 "액세스 권한은 u=rwx (0700) 또는 u=rwx,o=rx (0750) 값이어야 합니다." -#: utils/init/miscinit.c:615 utils/misc/guc.c:7139 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "보안 제한 작업 내에서 \"%s\" 매개 변수를 설정할 수 없음" -#: utils/init/miscinit.c:683 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "%u OID 롤이 없음" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "\"%s\" 롤은 접속을 허용하지 않음" -#: utils/init/miscinit.c:731 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "\"%s\" 롤의 최대 동시 접속수를 초과했습니다" -#: utils/init/miscinit.c:791 +#: utils/init/miscinit.c:841 #, c-format msgid "permission denied to set session authorization" msgstr "세션 인증을 지정하기 위한 권한이 없음" -#: utils/init/miscinit.c:874 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "잘못된 롤 OID: %u" -#: utils/init/miscinit.c:928 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "데이터베이스 시스템 서비스를 중지했습니다" -#: utils/init/miscinit.c:1015 +#: utils/init/miscinit.c:1065 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "\"%s\" 잠금 파일을 만들 수 없음: %m" -#: utils/init/miscinit.c:1029 +#: utils/init/miscinit.c:1079 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "\"%s\" 잠금파일을 열 수 없음: %m" -#: utils/init/miscinit.c:1036 +#: utils/init/miscinit.c:1086 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "\"%s\" 잠금 파일을 읽을 수 없음: %m" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "\"%s\" 잠금 파일이 비었음" -#: 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 "" -#: utils/init/miscinit.c:1090 +#: utils/init/miscinit.c:1140 #, c-format msgid "lock file \"%s\" already exists" msgstr "\"%s\" 잠금 파일이 이미 있음" -#: utils/init/miscinit.c:1094 +#: 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:1096 +#: 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:1099 +#: 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:1101 +#: 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:1152 +#: utils/init/miscinit.c:1202 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "\"%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 " @@ -25814,48 +27994,48 @@ msgstr "" "셸 명령을 이용해서 파일을 삭제 하고 다시 시도해 보십시오. - 내용 참 거시기 하" "네" -#: 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 "\"%s\" 잠금 파일에 쓸 수 없음: %m" -#: utils/init/miscinit.c:1327 utils/init/miscinit.c:1469 utils/misc/guc.c:10038 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10827 #, c-format msgid "could not read from file \"%s\": %m" msgstr "\"%s\" 파일을 읽을 수 없음: %m" -#: utils/init/miscinit.c:1457 +#: utils/init/miscinit.c:1507 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "\"%s\" 파일을 열 수 없음: %m; 어째든 계속 진행함" -#: utils/init/miscinit.c:1482 +#: 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: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\" 값은 바른 데이터디렉터리가 아닙니다" -#: utils/init/miscinit.c:1523 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "\"%s\" 파일이 없습니다." -#: utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1589 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "\"%s\" 파일에 잘못된 자료가 기록되어 있습니다." -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1591 #, c-format msgid "You might need to initdb." msgstr "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 " @@ -25864,103 +28044,77 @@ msgstr "" "이 데이터 디렉터리는 PostgreSQL %s 버전으로 초기화 되어있는데, 이 서버의 %s " "버전은 이 버전과 호환성이 없습니다." -#: utils/init/miscinit.c:1616 +#: utils/init/postinit.c:258 #, c-format -msgid "loaded library \"%s\"" -msgstr "\"%s\" 라이브러리 로드 완료" +msgid "replication connection authorized: user=%s" +msgstr "복제 연결 인증: user=%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)" - -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "off" -msgstr "off" - -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "on" -msgstr "on" +msgid "connection authorized: user=%s" +msgstr "연결 인증: user=%s" -#: 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 " database=%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 활성화 (protocol=%s, cipher=%s, bits=%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 (authenticated=%s, encrypted=%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 "" -"연결 인증: 사용자=%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 "no" -#: 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 "yes" -#: 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 (authenticated=%s, encrypted=%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\" 데이터베이스 최대 접속수를 초과했습니다" @@ -25995,83 +28149,93 @@ msgstr "" "setlocale()에서 인식할 수 없는 \"%s\" LC_CTYPE 값으로 데이터베이스가 초기화되" "었습니다." -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "이 데이터베이스에는 어떠한 롤 정의도 없습니다" +msgid "database \"%s\" has a collation version mismatch" +msgstr "\"%s\" 데이터베이스의 문자 정렬 규칙은 버전이 맞지 않음" -#: utils/init/postinit.c:763 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "다음 명령을 먼저 실행하십시오: CREATE USER \"%s\" SUPERUSER;." +msgid "" +"The database was created using collation version %s, but the operating " +"system provides version %s." +msgstr "" +"데이터베이스를 만들때 %s 버전으로 문자 정렬 규칙을 만들었는데, " +"현재 OS는 %s 버전을 제공하고 있습니다." + +#: utils/init/postinit.c:471 +#, c-format +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 COLLATION %s REFRESH VERSION 명령을 실행하거나, " +"바른 라이브러리 버전을 지정해서, PostgreSQL을 빌드하세요." -#: utils/init/postinit.c:799 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "데이터베이스 중지 중에는 새로운 복제 연결을 할 수 없습니다." +msgid "no roles are defined in this database system" +msgstr "이 데이터베이스에는 어떠한 롤 정의도 없습니다" -#: utils/init/postinit.c:803 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "슈퍼유저만 데이터베이스 종료 중에 연결할 수 있음" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "다음 명령을 먼저 실행하십시오: CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:813 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "슈퍼유저만 바이너리 업그레이드 모드 중에 연결 할 수 있음" -#: utils/init/postinit.c:826 +#: utils/init/postinit.c:885 #, c-format msgid "" "remaining connection slots are reserved for non-replication superuser " "connections" msgstr "남은 연결 슬롯은 non-replication 슈퍼유저 연결용으로 남겨 놓았음" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "" "superuser 또는 replication 권한을 가진 롤만 walsender 프로세스를 시작할 수 있" "음" -#: utils/init/postinit.c:905 +#: utils/init/postinit.c:964 #, c-format msgid "database %u does not exist" msgstr "%u 데이터베이스가 없음" -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1053 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "삭제되었거나 이름이 바뀐 것 같습니다." -#: utils/init/postinit.c:1012 +#: utils/init/postinit.c:1071 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "데이터베이스 디렉터리에 \"%s\" 하위 디렉터리가 없습니다" -#: utils/init/postinit.c:1017 -#, 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 문자 집합에 대한 예기치 않은 인코딩 ID임" -#: 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 문자 집합에 대한 예기치 않은 인코딩 ID임" -#: 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 인코딩 사이의 변환은 지원하지 않습니다" @@ -26083,43 +28247,43 @@ msgid "" msgstr "" "\"%s\" 인코딩을 \"%s\" 인코딩으로 변환할 기본 변환규칙(conversion)이 없음" -#: 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 "잘못된 유니코드 코드 포인트" -#: 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 " @@ -26128,217 +28292,185 @@ msgstr "" "%s 바이트로 조합된 문자(인코딩: \"%s\")와 대응되는 문자 코드가 \"%s\" 인코딩" "에는 없습니다" -#: utils/misc/guc.c:679 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "소속그룹없음" -#: utils/misc/guc.c:681 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "파일 위치" -#: utils/misc/guc.c:683 -msgid "Connections and Authentication" -msgstr "연결과 인증" - -#: utils/misc/guc.c:685 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "연결과 인증 / 연결 설정값" -#: utils/misc/guc.c:687 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "연결과 인증 / 인증" -#: utils/misc/guc.c:689 +#: utils/misc/guc.c:784 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:786 msgid "Resource Usage / Memory" msgstr "자원 사용량 / 메모리" -#: utils/misc/guc.c:695 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "자원 사용량 / 디스크" -#: utils/misc/guc.c:697 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "자원 사용량 / 커널 자원" -#: utils/misc/guc.c:699 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "자원 사용량 / 비용기반 청소 지연" -#: utils/misc/guc.c:701 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "자원 사용량 / 백그라운드 쓰기" -#: utils/misc/guc.c:703 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "자원 사용량 / 비동기 기능" -#: utils/misc/guc.c:705 -msgid "Write-Ahead Log" -msgstr "Write-Ahead 로그" - -#: utils/misc/guc.c:707 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead 로그 / 설정값" -#: utils/misc/guc.c:709 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead 로그 / 체크포인트" -#: utils/misc/guc.c:711 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead 로그 / 아카이브" -#: utils/misc/guc.c:713 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead 로그 / 복구" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead 로그 / 아카이브 복구" -#: utils/misc/guc.c:715 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead 로그 / 복구 대상" -#: utils/misc/guc.c:717 -msgid "Replication" -msgstr "복제" - -#: utils/misc/guc.c:719 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "복제 / 보내기 서버" -#: utils/misc/guc.c:721 -msgid "Replication / Master Server" +#: utils/misc/guc.c:812 +msgid "Replication / Primary Server" msgstr "복제 / 주 서버" -#: utils/misc/guc.c:723 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "복제 / 대기 서버" -#: utils/misc/guc.c:725 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "복제 / 구독" -#: utils/misc/guc.c:727 -msgid "Query Tuning" -msgstr "쿼리 튜닝" - -#: utils/misc/guc.c:729 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "쿼리 튜닝 / 실행계획기 메서드 설정" -#: utils/misc/guc.c:731 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "쿼리 튜닝 / 실행계획기 비용 상수" -#: utils/misc/guc.c:733 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "쿼리 튜닝 / 일반적인 쿼리 최적화기" -#: utils/misc/guc.c:735 +#: utils/misc/guc.c:824 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:826 msgid "Reporting and Logging / Where to Log" msgstr "보고와 로그 / 로그 위치" -#: utils/misc/guc.c:741 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "보고와 로그 / 로그 시점" -#: utils/misc/guc.c:743 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "보고와 로그 / 로그 내용" -#: utils/misc/guc.c:745 -msgid "Process Title" -msgstr "프로세스 제목" +#: utils/misc/guc.c:832 +msgid "Reporting and Logging / Process Title" +msgstr "보고와 로그 / 프로세스 타이틀" -#: utils/misc/guc.c:747 -msgid "Statistics" -msgstr "통계" - -#: utils/misc/guc.c:749 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "통계 / 모니터링" -#: utils/misc/guc.c:751 -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:753 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:755 -msgid "Client Connection Defaults" -msgstr "클라이언트 연결 초기값" - -#: utils/misc/guc.c:757 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "클라이언트 연결 초기값 / 구문 특성" -#: utils/misc/guc.c:759 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "클라이언트 연결 초기값 / 로케일과 출력양식" -#: utils/misc/guc.c:761 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "클라이언트 연결 초기값 / 공유 라이브러리 미리 로딩" -#: utils/misc/guc.c:763 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "클라이언트 연결 초기값 / 기타 초기값" -#: utils/misc/guc.c:765 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "잠금 관리" -#: utils/misc/guc.c:767 -msgid "Version and Platform Compatibility" -msgstr "버전과 플랫폼 호환성" - -#: utils/misc/guc.c:769 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "버전과 플랫폼 호환성 / 이전 PostgreSQL 버전" -#: utils/misc/guc.c:771 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "버전과 플랫폼 호환성 / 다른 플랫폼과 클라이언트" -#: utils/misc/guc.c:773 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "오류 처리" -#: utils/misc/guc.c:775 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "프리셋 옵션들" -#: utils/misc/guc.c:777 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "사용자 정의 옵션들" -#: utils/misc/guc.c:779 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "개발자 옵션들" -#: utils/misc/guc.c:837 +#: 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:874 +#: utils/misc/guc.c:955 msgid "" "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " "and \"d\"." @@ -26346,124 +28478,132 @@ msgstr "" "이 매개 변수에 유효한 단위는 \"us\", \"ms\", \"s\", \"min\", \"h\", \"d\" 입" "니다." -#: utils/misc/guc.c:936 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "실행계획자가 순차적-스캔(sequential-sca) 계획을 사용함" -#: utils/misc/guc.c:946 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "실행계획자가 인덱스-스캔 계획을 사용함." -#: utils/misc/guc.c:956 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "실행계획자가 인덱스-전용-탐색 계획을 사용함." -#: utils/misc/guc.c:966 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "실행계획기가 bitmap-scan 계획을 사용하도록 함" -#: utils/misc/guc.c:976 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "실행계획자가 TID 스캔 계획을 사용함" -#: utils/misc/guc.c:986 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "실행계획자가 명시 정렬 단계(explicit sort step)를 사용함" -#: utils/misc/guc.c:996 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "실행계획자가 증분 정렬 단계(incremental sort step)를 사용함" -#: utils/misc/guc.c:1005 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "실행계획자가 해시된 집계 계획을 사용함" -#: utils/misc/guc.c:1015 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "실행계획자가 materialization 계획을 사용함" -#: utils/misc/guc.c:1025 +#: utils/misc/guc.c:1107 +msgid "Enables the planner's use of memoization." +msgstr "실행계획자가 memoization 계획을 사용함" + +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "실행계획자가 근접순환 조인(nested-loop join) 계획을 사용함" -#: utils/misc/guc.c:1035 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "실행계획자가 병합 조인(merge join) 계획을 사용함" -#: utils/misc/guc.c:1045 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "실행계획자가 해시 조인(hash join) 계획을 사용함" -#: utils/misc/guc.c:1055 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "실행계획자가 병합 수집(gather merge) 계획을 사용함" -#: utils/misc/guc.c:1065 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." -msgstr "" +msgstr "partitionwise join 활성화" -#: utils/misc/guc.c:1075 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." -msgstr "" +msgstr "partitionwise 집계 및 그룹핑 활성화" -#: utils/misc/guc.c:1085 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "실행계획자가 병렬 추가 계획을 사용함" -#: utils/misc/guc.c:1095 +#: utils/misc/guc.c:1187 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:1197 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "파티션 프루닝 계획수립 및 실행 시간 활성화" -#: 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 "" -#: utils/misc/guc.c:1117 +#: utils/misc/guc.c:1209 +msgid "Enables the planner's use of async append plans." +msgstr "실행계획자가 비동기 추가 계획을 사용함" + +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "유전적 쿼리 최적화(GEQO)를 사용함" -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "이 알고리즘은 실행계획기의 과도한 작업 비용을 낮춥니다" -#: utils/misc/guc.c:1129 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "현재 사용자가 슈퍼유저인지 보여줍니다." -#: utils/misc/guc.c:1139 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour 서버 사용" -#: utils/misc/guc.c:1148 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "트랜잭션 커밋 시간을 수집함" -#: utils/misc/guc.c:1157 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "SSL 연결을 가능하게 함." -#: utils/misc/guc.c:1166 -msgid "Also use ssl_passphrase_command during server reload." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." msgstr "" -#: utils/misc/guc.c:1175 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "SSL 인증 알고리즘 우선 순위를 정함" -#: utils/misc/guc.c:1184 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "강제로 변경된 버퍼 자료를 디스크와 동기화 시킴." -#: utils/misc/guc.c:1185 +#: utils/misc/guc.c:1287 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 " +"that updates are physically written to disk. This ensures that a database " "cluster will recover to a consistent state after an operating system or " "hardware crash." msgstr "" @@ -26472,11 +28612,11 @@ msgstr "" "스템의 비정상적인 동작이나, 하드웨어에서 오류가 발생되었을 경우에도 자료를 안" "전하게 지킬 수 있도록 도와줄 것입니다." -#: utils/misc/guc.c:1196 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "체크섬 실패 후 처리 계속 함" -#: utils/misc/guc.c:1197 +#: utils/misc/guc.c:1299 msgid "" "Detection of a checksum failure normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting ignore_checksum_failure to " @@ -26491,11 +28631,11 @@ msgstr "" "니다. 이 설정은 데이터 클러스터에서 체크섬 기능이 활성화 되어 있는 경우에만 " "영향을 받습니다." -#: utils/misc/guc.c:1211 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "손상된 자료 헤더 발견시 작업 진행 여부 선택" -#: utils/misc/guc.c:1212 +#: utils/misc/guc.c:1314 msgid "" "Detection of a damaged page header normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting zero_damaged_pages to true " @@ -26504,16 +28644,17 @@ msgid "" "rows on the damaged page." msgstr "" "일반적으로 손상된 페이지 헤더를 발견하게 되면, PostgreSQL에서는 오류를 발생하" -"고, 현재 트랜잭션을 중지합니다. zero_damaged_pages 값을 true로 지정하면, 이런 손상된 페이지" -"를 발견하면, 경고 메시지를 보여주고, 그 페이지의 크기를 0으로 만들고 작업을 " -"계속 진행합니다. 이 기능을 사용한다 함은 손상된 자료를 없애겠다는 것을 의미합" -"니다. 이것은 곧 저장되어있는 자료가 삭제 될 수도 있음을 의미하기도 합니다." +"고, 현재 트랜잭션을 중지합니다. zero_damaged_pages 값을 true로 지정하면, 이" +"런 손상된 페이지를 발견하면, 경고 메시지를 보여주고, 그 페이지의 크기를 0으" +"로 만들고 작업을 계속 진행합니다. 이 기능을 사용한다 함은 손상된 자료를 없애" +"겠다는 것을 의미합니다. 이것은 곧 저장되어있는 자료가 삭제 될 수도 있음을 의" +"미하기도 합니다." -#: utils/misc/guc.c:1225 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "잘못된 페이지 실패 후 복구 계속 함" -#: utils/misc/guc.c:1226 +#: utils/misc/guc.c:1328 msgid "" "Detection of WAL records having references to invalid pages during recovery " "causes PostgreSQL to raise a PANIC-level error, aborting the recovery. " @@ -26523,18 +28664,18 @@ msgid "" "corruption, or other serious problems. Only has an effect during recovery or " "in standby mode." msgstr "" -"PostgreSQL은 WAL 기반 복구 작업에서 해당 페이지가 잘못되어 있으면, " -"PANIC 오류를 내고 복구 작업을 중지하고 멈춥니다. ignore_invalid_pages 값을 " -" true로 지정하면, 이런 손상된 페이지가 있을 때, 경고 메시지를 보여주고, " -"복구 작업 계속 진행합니다. 이 기능을 사용하면 서버 비정상 종료나 자료 손실 " -"숨은 손상, 기타 심각한 문제가 일어 날 수 있습니다. 이 설정은 복구 작업 때나 " -"대기 모드 상태에서만 작동합니다." +"PostgreSQL은 WAL 기반 복구 작업에서 해당 페이지가 잘못되어 있으면, PANIC 오류" +"를 내고 복구 작업을 중지하고 멈춥니다. ignore_invalid_pages 값을 true로 지" +"정하면, 이런 손상된 페이지가 있을 때, 경고 메시지를 보여주고, 복구 작업 계속 " +"진행합니다. 이 기능을 사용하면 서버 비정상 종료나 자료 손실 숨은 손상, 기타 " +"심각한 문제가 일어 날 수 있습니다. 이 설정은 복구 작업 때나 대기 모드 상태에" +"서만 작동합니다." -#: utils/misc/guc.c:1244 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "체크포인트 후 처음 수정할 때 전체 페이지를 WAL에 씁니다." -#: utils/misc/guc.c:1245 +#: utils/misc/guc.c:1347 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 " @@ -26546,101 +28687,101 @@ msgstr "" "없을 수도 있습니다. 이 옵션은 안전하게 복구가 가능하도록 체크포인트 후 처음 " "수정한 페이지는 그 페이지 전체를 WAL에 씁니다." -#: utils/misc/guc.c:1258 +#: utils/misc/guc.c:1360 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 -msgid "Compresses full-page writes written in WAL file." -msgstr "WAL 파일에 기록되는 전체 페이지를 압축함" +"체크포인트 작업 후 자료 페이지에 첫 변경이 있는 경우, 치명적인 변경이 아닐지라도 " +"해당 페이지 전체를 기록합니다." -#: utils/misc/guc.c:1278 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." -msgstr "" +msgstr "처음 사용 되기 전에 WAL 파일을 0으로 채웁니다." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." -msgstr "" +msgstr "파일 이름 변경으로 WAL 파일을 재사용합니다." -#: utils/misc/guc.c:1298 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "체크포인트 관련 정보를 기록합니다." -#: utils/misc/guc.c:1307 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "연결 성공한 정보들 모두를 기록함" -#: utils/misc/guc.c:1316 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "기간을 포함하여 세션의 끝을 기록합니다." -#: utils/misc/guc.c:1325 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "복제 관련 작업 내역을 기록합니다." -#: utils/misc/guc.c:1334 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "서버가 assertion 검사 기능이 활성화 되어 실행되는지 보여 줌" -#: utils/misc/guc.c:1349 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "어떤 오류가 생기면 세션을 종료함" -#: utils/misc/guc.c:1358 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "백엔드가 비정상 종료되면 서버를 재초기화함" -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1459 +msgid "Remove temporary files after backend crash." +msgstr "백엔드 비정상 종료 뒤에는 임시 파일을 지웁니다." + +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "SQL 명령 구문의 실행완료 시간을 기록함" -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "각 쿼리의 구문 분석 트리를 기록합니다." -#: utils/misc/guc.c:1386 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "각 쿼리의 재작성된 구문 분석 트리를 기록합니다." -#: utils/misc/guc.c:1395 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "각 쿼리의 실행 계획을 기록합니다." -#: utils/misc/guc.c:1404 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "구문과 실행계획을 보여 줄때, 들여쓰기를 함." -#: utils/misc/guc.c:1413 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "구문분석 성능 통계를 서버 로그에 기록함." -#: utils/misc/guc.c:1422 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "실행계획자 성능 통계를 서버 로그에 기록함." -#: utils/misc/guc.c:1431 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "실행자 성능 통계를 서버 로그에 기록함." -#: utils/misc/guc.c:1440 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "누적 성능 통계를 서버 로그에 기록함." -#: utils/misc/guc.c:1450 +#: utils/misc/guc.c:1552 msgid "" "Logs system resource usage statistics (memory and CPU) on various B-tree " "operations." msgstr "다양한 B트리 작업에 자원(메모리, CPU) 사용 통계를 기록에 남기" -#: utils/misc/guc.c:1462 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "명령 실행에 대한 정보를 수집함" -#: utils/misc/guc.c:1463 +#: utils/misc/guc.c:1565 msgid "" "Enables the collection of information on the currently executing command of " "each session, along with the time at which that command began execution." @@ -26648,59 +28789,67 @@ msgstr "" "각 세션에서 사용하고 있는 현재 실행 중인 명령의 수행 시간, 명령 내용등에 대" "한 정보를 수집하도록 함" -#: utils/misc/guc.c:1473 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "데이터베이스 활동에 대한 통계를 수집합니다." -#: utils/misc/guc.c:1482 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." msgstr "데이터베이스 I/O 활동에 대한 통계를 수집합니다." -#: utils/misc/guc.c:1492 +#: utils/misc/guc.c:1593 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "WAL I/O 활동에 작업 시간 통계를 수집합니다." + +#: utils/misc/guc.c:1603 msgid "Updates the process title to show the active SQL command." msgstr "활성 SQL 명령을 표시하도록 프로세스 제목을 업데이트합니다." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1604 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:1617 msgid "Starts the autovacuum subprocess." msgstr "자동 청소 하위 프로세스를 실행함" -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTEN, NOTIFY 명령 사용을 위한 디버깅 출력을 만듦." -#: utils/misc/guc.c:1528 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "잠금 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1538 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "사용자 잠금 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1548 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "가벼운 잠금 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1558 +#: utils/misc/guc.c:1669 msgid "" "Dumps information about all current locks when a deadlock timeout occurs." msgstr "교착 잠금 시간 제한 상황이 발생하면 그 때의 모든 잠금 정보를 보여줌" -#: utils/misc/guc.c:1570 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "긴 잠금 대기를 기록합니다." -#: utils/misc/guc.c:1580 +#: utils/misc/guc.c:1690 +msgid "Logs standby recovery conflict waits." +msgstr "대기 서버 복구 충돌에 따른 대기 정보를 로그에 남깁니다." + +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "연결 기록에서 호스트 이름을 기록함." -#: utils/misc/guc.c:1581 +#: utils/misc/guc.c:1700 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 " @@ -26711,38 +28860,38 @@ msgstr "" "true로 바꾼다면, 이 IP의 호스트 이름을 구해서 이 이름을 사용합니다 이것의 성" "능은 OS의 IP에서 이름구하기 성능과 관계됩니다." -#: utils/misc/guc.c:1592 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." -msgstr "\"표현=NULL\" 식을 \"표현 IS NULL\"로 취급함." +msgstr "\"표현식=NULL\" 식을 \"표현식 IS NULL\"로 취급함." -#: utils/misc/guc.c:1593 +#: utils/misc/guc.c:1712 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 "" -"표현 = NULL 의 바른 처리는 항상 null 값을 리턴해야하지만, 편의성을 위해서 " -"expr = NULL 구문을 expr IS NULL 구문으로 바꾸어서 처리하도록 함이렇게하면, " -"윗 구문은 true 를 리턴함" +"표현식 = NULL 의 바른 처리는 항상 null 값을 리턴해야하지만, 편의성을 위해서 " +"표현식 = NULL 구문을 표현식 IS NULL 구문으로 바꾸어서 처리하도록 해서 " +"계산에 따라 true, false를 반환합니다." -#: utils/misc/guc.c:1605 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "per-database 사용자 이름 활성화." -#: utils/misc/guc.c:1614 +#: utils/misc/guc.c:1733 msgid "Sets the default read-only status of new transactions." msgstr "새로운 트랜잭션의 상태를 초기값으로 읽기전용으로 설정합니다." -#: utils/misc/guc.c:1623 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "현재 트랜잭셕의 읽기 전용 상태를 지정합니다." -#: utils/misc/guc.c:1633 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "새 트랜잭션의 기본 지연 가능한 상태를 지정" -#: utils/misc/guc.c:1642 +#: utils/misc/guc.c:1762 msgid "" "Whether to defer a read-only serializable transaction until it can be " "executed with no possible serialization failures." @@ -26750,24 +28899,24 @@ msgstr "" "읽기 전용 직렬화 가능한 트랜잭션이 직렬 처리에서 오류가 없을 때까지 그 트랜잭" "션을 지연할 것이지 결정함" -#: utils/misc/guc.c:1652 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "로우 단위 보안 기능을 활성화" -#: utils/misc/guc.c:1653 +#: utils/misc/guc.c:1773 msgid "When enabled, row security will be applied to all users." msgstr "이 값이 활성화 되면 로우 단위 보안 기능이 모든 사용자 대상으로 적용됨" -#: utils/misc/guc.c:1661 -msgid "Check function bodies during CREATE FUNCTION." +#: utils/misc/guc.c:1781 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "" -"CREATE FUNCTION 명령으로 함수를 만들 때, 함수 본문 부분의 구문을 검사합니다." +"CREATE FUNCTION, CREATE PROCEDURE 명령을 실행할 때 본문 부분의 구문을 검사합니다." -#: utils/misc/guc.c:1670 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "배열에 NULL 요소가 입력될 수 있도록 합니다." -#: utils/misc/guc.c:1671 +#: utils/misc/guc.c:1791 msgid "" "When turned on, unquoted NULL in an array input value means a null value; " "otherwise it is taken literally." @@ -26775,42 +28924,42 @@ msgstr "" "이 값이 on이면 배열 입력 값에 따옴표 없이 입력된 NULL이 null 값을 의미하고, " "그렇지 않으면 문자 그대로 처리됩니다." -#: utils/misc/guc.c:1687 +#: utils/misc/guc.c:1807 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "" -#: utils/misc/guc.c:1697 +#: utils/misc/guc.c:1817 msgid "" "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "로그 기록 하위 프로세스를 시작하여 stderr 출력 및/또는 csvlog를 로그 파일에 " "씁니다." -#: utils/misc/guc.c:1706 +#: utils/misc/guc.c:1826 msgid "Truncate existing log files of same name during log rotation." msgstr "로그 회전 중 동일한 이름의 기존 로그 파일을 자릅니다." -#: utils/misc/guc.c:1717 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "정렬 시 리소스 사용 정보를 내보냅니다." -#: utils/misc/guc.c:1731 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "동기화된 스캔을 위해 디버깅 출력을 생성합니다." -#: utils/misc/guc.c:1746 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "힙 정렬을 통해 제한적 정렬을 사용합니다." -#: utils/misc/guc.c:1759 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "WAL 관련 디버깅 출력을 내보냅니다." -#: utils/misc/guc.c:1771 -msgid "Datetimes are integer based." -msgstr "datetime 형을 정수형으로 사용함" +#: utils/misc/guc.c:1891 +msgid "Shows whether datetimes are integer based." +msgstr "date, time 값을 정수 기반으로 할지를 보여줍니다." -#: utils/misc/guc.c:1782 +#: utils/misc/guc.c:1902 msgid "" "Sets whether Kerberos and GSSAPI user names should be treated as case-" "insensitive." @@ -26818,42 +28967,46 @@ msgstr "" "Kerberos 및 GSSAPI 사용자 이름에서 대/소문자를 구분하지 않을지 여부를 설정합" "니다." -#: utils/misc/guc.c:1792 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "일반 문자열 리터럴의 백슬래시 이스케이프에 대해 경고합니다." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "'...' 문자열에서 백슬래시가 리터럴로 처리되도록 합니다." -#: utils/misc/guc.c:1813 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "동기화된 순차적 스캔을 사용합니다." -#: utils/misc/guc.c:1823 +#: utils/misc/guc.c:1943 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "복구 대상에서 트랜잭션을 포함할지 제외할지 선택합니다." -#: utils/misc/guc.c:1833 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "복구 중에서도 접속과 쿼리 사용을 허용함" -#: utils/misc/guc.c:1843 +#: utils/misc/guc.c:1963 msgid "" "Allows feedback from a hot standby to the primary that will avoid query " "conflicts." msgstr "" "읽기 전용 보조 서버가 보내는 쿼리 충돌을 피하기 위한 피드백을 주 서버가 받음" -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1973 +msgid "Shows whether hot standby is currently active." +msgstr "" + +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "시스템 테이블의 구조를 수정할 수 있도록 합니다." -#: utils/misc/guc.c:1864 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "시스템 인덱스 읽기를 금지함" -#: utils/misc/guc.c:1865 +#: utils/misc/guc.c:1996 msgid "" "It does not prevent updating the indexes, so it is safe to use. The worst " "consequence is slowness." @@ -26861,12 +29014,16 @@ msgstr "" "이 설정이 활성화 되어도 그 인덱스는 갱신되어 사용하는데는 안전합니다. 하지" "만 서버가 전체적으로 늦어질 수 있습니다." -#: utils/misc/guc.c:1876 +#: utils/misc/guc.c:2007 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "" + +#: utils/misc/guc.c:2018 msgid "" "Enables backward compatibility mode for privilege checks on large objects." msgstr "대형 개체에 대한 접근 권한 검사를 위한 하위 호환성이 있게 함" -#: utils/misc/guc.c:1877 +#: utils/misc/guc.c:2019 msgid "" "Skips privilege checks when reading or modifying large objects, for " "compatibility with PostgreSQL releases prior to 9.0." @@ -26874,89 +29031,83 @@ 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:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL 구문을 만들 때, 모든 식별자는 따옴표를 사용함" -#: utils/misc/guc.c:1907 +#: utils/misc/guc.c:2039 msgid "Shows whether data checksums are turned on for this cluster." msgstr "" -#: utils/misc/guc.c:1918 +#: utils/misc/guc.c:2050 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "syslog 사용시 메시지 중복을 방지하기 위해 일련 번호를 매깁니다." -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:2060 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:2070 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:2071 +msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "" -#: utils/misc/guc.c:1949 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "" -#: utils/misc/guc.c:1960 -msgid "Register JIT compiled function with debugger." +#: utils/misc/guc.c:2092 +msgid "Register JIT-compiled functions with debugger." msgstr "" -#: utils/misc/guc.c:1977 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "" -#: utils/misc/guc.c:1988 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "" -#: utils/misc/guc.c:1999 -msgid "Register JIT compiled function with perf profiler." +#: utils/misc/guc.c:2131 +msgid "Register JIT-compiled functions with perf profiler." msgstr "" -#: utils/misc/guc.c:2016 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "" -#: utils/misc/guc.c:2027 +#: utils/misc/guc.c:2159 msgid "Whether to continue running after a failure to sync data files." msgstr "" -#: utils/misc/guc.c:2036 +#: utils/misc/guc.c:2168 msgid "" "Sets whether a WAL receiver should create a temporary replication slot if no " "permanent slot is configured." msgstr "" -#: utils/misc/guc.c:2054 +#: utils/misc/guc.c:2186 msgid "" -"Forces a switch to the next WAL file if a new file has not been started " -"within N seconds." +"Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "" -"새 파일이 N초 내에 시작되지 않은 경우 강제로 다음 WAL 파일로 전환합니다." -#: utils/misc/guc.c:2065 -msgid "Waits N seconds on connection startup after authentication." -msgstr "연결 작업에서 인증이 끝난 뒤 N초 기다림" +#: utils/misc/guc.c:2197 +msgid "" +"Sets the amount of time to wait after authentication on connection startup." +msgstr "연결 작업시 인증이 끝난 뒤 대기 시간 지정" -#: utils/misc/guc.c:2066 utils/misc/guc.c:2624 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "이렇게 하면 디버거를 프로세스에 연결할 수 있습니다." -#: utils/misc/guc.c:2075 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "기본 통계 대상을 지정합니다." -#: utils/misc/guc.c:2076 +#: utils/misc/guc.c:2209 msgid "" "This applies to table columns that have not had a column-specific target set " "via ALTER TABLE SET STATISTICS." @@ -26964,12 +29115,12 @@ msgstr "" "특정 칼럼을 지정하지 않고 ALTER TABLE SET STATISTICS 명령을 사용했을 때, 통" "계 대상이 될 칼럼을 지정합니다." -#: utils/misc/guc.c:2085 +#: utils/misc/guc.c:2218 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "이 크기를 초과할 경우 하위 쿼리가 축소되지 않는 FROM 목록 크기를 설정합니다." -#: utils/misc/guc.c:2087 +#: utils/misc/guc.c:2220 msgid "" "The planner will merge subqueries into upper queries if the resulting FROM " "list would have no more than this many items." @@ -26977,12 +29128,12 @@ msgstr "" "결과 FROM 목록에 포함된 항목이 이 개수를 넘지 않는 경우 계획 관리자가 하" "위 쿼리를 상위 쿼리에 병합합니다." -#: utils/misc/guc.c:2098 +#: utils/misc/guc.c:2231 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "이 크기를 초과할 경우 JOIN 구문이 결합되지 않는 FROM 목록 크기를 설정합니다." -#: utils/misc/guc.c:2100 +#: utils/misc/guc.c:2233 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." @@ -26990,32 +29141,32 @@ msgstr "" "결과 목록에 포함된 항목이 이 개수를 넘지 않을 때마다 계획 관리자가 명시" "적 JOIN 구문을 FROM 항목 목록에 결합합니다." -#: utils/misc/guc.c:2111 +#: utils/misc/guc.c:2244 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "" "이 임계값을 초과할 경우 GEQO가 사용되는 FROM 항목의 임계값을 설정합니다." -#: utils/misc/guc.c:2121 +#: utils/misc/guc.c:2254 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:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: 모집단의 개인 수입니다." -#: utils/misc/guc.c:2132 utils/misc/guc.c:2142 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "0을 지정하면 적절한 기본 값이 선택됩니다." -#: utils/misc/guc.c:2141 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: 알고리즘의 반복 수입니다." -#: utils/misc/guc.c:2153 +#: utils/misc/guc.c:2286 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "교착 상태를 확인하기 전에 잠금을 기다릴 시간을 설정합니다." -#: utils/misc/guc.c:2164 +#: utils/misc/guc.c:2297 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing archived WAL data." @@ -27023,54 +29174,73 @@ msgstr "" "읽기 전용 보조 서버가 아카이브된 WAL 자료를 처리할 때, 지연될 수 있는 최대 시" "간" -#: utils/misc/guc.c:2175 +#: utils/misc/guc.c:2308 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing streamed WAL data." msgstr "" "읽기 전용 보조 서버가 스트림 WAL 자료를 처리할 때, 지연될 수 있는 최대 시간" -#: utils/misc/guc.c:2186 +#: utils/misc/guc.c:2319 msgid "Sets the minimum delay for applying changes during recovery." msgstr "" -#: utils/misc/guc.c:2197 +#: utils/misc/guc.c:2330 msgid "" "Sets the maximum interval between WAL receiver status reports to the sending " "server." msgstr "WAL 정보를 보내는 서버에게 WAL 수신기 상태를 보고하는 최대 간격" -#: utils/misc/guc.c:2208 +#: utils/misc/guc.c:2341 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "" "WAL 정보를 보내는 서버로부터 보낸 자료를 받기위해 기다릴 수 있는 최대 허용 시" "간을 설정합니다." -#: utils/misc/guc.c:2219 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "최대 동시 접속수를 지정합니다." -#: utils/misc/guc.c:2230 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "superuser 동시 접속수를 지정합니다." -#: utils/misc/guc.c:2244 +#: utils/misc/guc.c:2373 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "시작시 확보할 동적 공유 메모리 크기" + +#: utils/misc/guc.c:2388 msgid "Sets the number of shared memory buffers used by the server." -msgstr "서버에서 사용할 공유 메모리의 개수를 지정함" +msgstr "서버에서 사용할 공유 메모리 버퍼 개수를 지정함" + +#: utils/misc/guc.c:2399 +msgid "" +"Shows the size of the server's main shared memory area (rounded up to the " +"nearest MB)." +msgstr "" +"서버의 메인 공유 메모리 영역 크기를 보여줌(MB 단위로 근사값처리함)" + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "메인 공유 메모리 영역용 huge 페이지 개수를 보여줌" + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 은 사용하지 않음을 뜻함" -#: utils/misc/guc.c:2255 +#: utils/misc/guc.c:2421 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "각 세션에서 사용하는 임시 버퍼의 최대 개수를 지정" -#: utils/misc/guc.c:2266 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "TCP 포트 번호를 지정함." -#: utils/misc/guc.c:2276 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "유닉스 도메인 소켓 파일의 액세스 권한을 지정함" -#: utils/misc/guc.c:2277 +#: utils/misc/guc.c:2443 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 " @@ -27081,11 +29251,11 @@ msgstr "" "수 값은 chmod 및 umask 시스템 호출에서 수락되는 형태의 숫자 모드 지정이어야 " "합니다. (일반적인 8진수 형식을 사용하려면 숫자가 0으로 시작해야 합니다.)" -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "로그 파일의 파일 접근 권한을 지정합니다." -#: utils/misc/guc.c:2292 +#: utils/misc/guc.c:2458 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 " @@ -27095,11 +29265,11 @@ msgstr "" "이어야 합니다. (일반적인 8진수 형식을 사용하려면 숫자가 0으로 시작해야 합니" "다.)" -#: utils/misc/guc.c:2306 -msgid "Mode of the data directory." -msgstr "데이터 디렉터리의 모드" +#: utils/misc/guc.c:2472 +msgid "Shows the mode of the data directory." +msgstr "데이터 디렉터리의 모드값을 보여줌" -#: utils/misc/guc.c:2307 +#: utils/misc/guc.c:2473 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 " @@ -27109,11 +29279,11 @@ msgstr "" "이어야 합니다. (일반적인 8진수 형식을 사용하려면 숫자가 0으로 시작해야 합니" "다.)" -#: utils/misc/guc.c:2320 +#: utils/misc/guc.c:2486 msgid "Sets the maximum memory to be used for query workspaces." msgstr "쿼리 작업공간을 위해 사용될 메모리의 최대값을 지정함." -#: utils/misc/guc.c:2321 +#: utils/misc/guc.c:2487 msgid "" "This much memory can be used by each internal sort operation and hash table " "before switching to temporary disk files." @@ -27121,124 +29291,144 @@ msgstr "" "임시 디스크 파일로 전환하기 전에 각 내부 정렬 작업과 해시 테이블에서 이 크기" "의 메모리를 사용할 수 있습니다." -#: utils/misc/guc.c:2333 +#: utils/misc/guc.c:2499 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "관리 작업을 위해 사용될 메모리의 최대값을 지정함." -#: utils/misc/guc.c:2334 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "관리작업은 VACUUM, CREATE INDEX 같은 작업을 뜻합니다." -#: utils/misc/guc.c:2344 +#: utils/misc/guc.c:2510 msgid "Sets the maximum memory to be used for logical decoding." msgstr "논리 디코딩 작업을 위해 사용될 메모리의 최대값을 지정함." -#: utils/misc/guc.c:2345 +#: utils/misc/guc.c:2511 msgid "" "This much memory can be used by each internal reorder buffer before spilling " "to disk." -msgstr "" -"이 메모리는 디스크 기록 전에 각 내부 재정렬 버퍼로 사용될 수 있습니다." +msgstr "이 메모리는 디스크 기록 전에 각 내부 재정렬 버퍼로 사용될 수 있습니다." -#: utils/misc/guc.c:2361 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "스택깊이(KB 단위) 최대값을 지정합니다." -#: utils/misc/guc.c:2372 +#: utils/misc/guc.c:2538 msgid "Limits the total size of all temporary files used by each process." msgstr "각 프로세스에서 사용하는 모든 임시 파일의 총 크기 제한" -#: utils/misc/guc.c:2373 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1은 제한 없음" -#: utils/misc/guc.c:2383 +#: utils/misc/guc.c:2549 msgid "Vacuum cost for a page found in the buffer cache." msgstr "버퍼 캐시에 있는 페이지의 청소 비용입니다." -#: utils/misc/guc.c:2393 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "버퍼 캐시에 없는 페이지의 청소 비용입니다." -#: utils/misc/guc.c:2403 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "청소로 페이지 변경 시 부과되는 비용입니다." -#: utils/misc/guc.c:2413 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "청소가 중지되는 청소 비용 합계입니다." -#: utils/misc/guc.c:2423 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "자동 청소에 대한 청소가 중지되는 청소 비용 합계입니다." -#: utils/misc/guc.c:2433 +#: utils/misc/guc.c:2599 msgid "" "Sets the maximum number of simultaneously open files for each server process." msgstr "각각의 서버 프로세스에서 동시에 열릴 수 있는 최대 파일 갯수를 지정함." -#: utils/misc/guc.c:2446 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "동시에 준비된 트랜잭션 최대 개수 지정" -#: utils/misc/guc.c:2457 +#: utils/misc/guc.c:2623 msgid "Sets the minimum OID of tables for tracking locks." msgstr "잠금 추적을 위한 테이블의 최소 OID 지정" -#: utils/misc/guc.c:2458 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "" -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2633 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "" -#: utils/misc/guc.c:2479 +#: utils/misc/guc.c:2645 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:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "이 값이 0이면 이런 제한이 없음." -#: utils/misc/guc.c:2490 +#: utils/misc/guc.c:2656 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 "idle-in-transaction 상태로 있을 수 있는 최대 시간" +#: utils/misc/guc.c:2667 +msgid "" +"Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "idle-in-transaction 상태로 있을 수 있는 최대 시간 지정" + +#: utils/misc/guc.c:2678 +msgid "" +"Sets the maximum allowed idle time between queries, when not in a " +"transaction." +msgstr "idle 상태로 있을 수 있는 최대 시간 지정" -#: utils/misc/guc.c:2512 +#: utils/misc/guc.c:2689 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "VACUUM에서 테이블 행을 동결할 때까지의 최소 기간입니다." -#: utils/misc/guc.c:2522 +#: utils/misc/guc.c:2699 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "" "VACUUM에서 튜플을 동결하기 위해 전체 테이블을 스캔할 때까지의 기간입니다." -#: utils/misc/guc.c:2532 +#: utils/misc/guc.c:2709 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:2719 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "VACUUM에서 튜플을 동결하기 위해 전체 테이블을 스캔할 때까지의 멀티트랜잭션 기" "간입니다." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2729 msgid "" "Number of transactions by which VACUUM and HOT cleanup should be deferred, " "if any." msgstr "" -#: utils/misc/guc.c:2565 +#: utils/misc/guc.c:2738 +msgid "" +"Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" +"VACUUM 작업에서 트랜잭션ID 겹침 방지를 피하기 위한 freeze 작업을 하는 테이블 나이" + +#: utils/misc/guc.c:2747 +msgid "" +"Multixact age at which VACUUM should trigger failsafe to avoid a wraparound " +"outage." +msgstr "" +"VACUUM 작업에서 트랜잭션ID 겹침 방지를 피하기 위한 freeze 작업을 하는 멀티트랜잭션 나이" + +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "하나의 트랜잭션에서 사용할 수 있는 최대 잠금 횟수를 지정함." -#: utils/misc/guc.c:2566 +#: utils/misc/guc.c:2761 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 " @@ -27248,11 +29438,11 @@ msgstr "" "max_locks_per_transaction * max_connections를 넘지 않는다는 가정 하에 크기가 " "지정됩니다." -#: utils/misc/guc.c:2577 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "하나의 트랜잭션에서 사용할 수 있는 최대 잠금 횟수를 지정함." -#: utils/misc/guc.c:2578 +#: utils/misc/guc.c:2773 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 " @@ -27262,127 +29452,139 @@ msgstr "" "max_pred_locks_per_transaction * max_connections를 넘지 않는다는 가정 하에 크" "기가 지정됩니다." -#: utils/misc/guc.c:2589 +#: utils/misc/guc.c:2784 msgid "" "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "하나의 트랜잭션에서 사용할 수 있는 페이지와 튜플의 최대수 지정함." -#: utils/misc/guc.c:2590 +#: utils/misc/guc.c:2785 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:2795 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "페이지당 잠금 튜플 최대 수 지정." -#: utils/misc/guc.c:2601 +#: utils/misc/guc.c:2796 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:2806 msgid "Sets the maximum allowed time to complete client authentication." msgstr "클라이언트 인증을 완료할 수 있는 최대 허용 시간을 설정합니다." -#: utils/misc/guc.c:2623 -msgid "Waits N seconds on connection startup before authentication." -msgstr "인증 전에 연결이 시작되도록 N초 동안 기다립니다." +#: utils/misc/guc.c:2818 +msgid "" +"Sets the amount of time to wait before authentication on connection startup." +msgstr "연결 할 때 인증 전 기다리는 시간 지정" + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "복구에서 WAL 미리 읽을 버퍼 크기" -#: utils/misc/guc.c:2634 +#: utils/misc/guc.c:2831 +msgid "" +"Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" + +#: utils/misc/guc.c:2841 msgid "Sets the size of WAL files held for standby servers." msgstr "대기 서버를 위해 보관하고 있을 WAL 파일 크기를 지정" -#: utils/misc/guc.c:2645 +#: utils/misc/guc.c:2852 msgid "Sets the minimum size to shrink the WAL to." msgstr "WAL 최소 크기" -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "체크포인트 작업을 할 WAL 크기 지정" -#: utils/misc/guc.c:2669 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "자동 WAL 체크포인트 사이의 최대 간격을 설정합니다." -#: utils/misc/guc.c:2680 +#: utils/misc/guc.c:2887 msgid "" -"Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "지정 시간 안에 체크포인트 조각이 모두 채워지면 경고를 냄" +"Sets the maximum time before warning if checkpoints triggered by WAL volume " +"happen too frequently." +msgstr "WAL 기록 때문에 자주 발생하는 체크포인트 경고를 보이지 않는 최대 시간 지정" -#: utils/misc/guc.c:2682 +#: utils/misc/guc.c:2889 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." +"WAL segment files happen more frequently than this amount of time. 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:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 msgid "" "Number of pages after which previously performed writes are flushed to disk." msgstr "" -#: utils/misc/guc.c:2705 +#: utils/misc/guc.c:2913 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "" "WAL 기능을 위해 공유 메모리에서 사용할 디스크 페이지 버퍼 개수를 지정함." -#: utils/misc/guc.c:2716 +#: utils/misc/guc.c:2924 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WAL 기록자가 지정 시간 만큼 쉬고 쓰기 작업을 반복함" -#: utils/misc/guc.c:2727 +#: utils/misc/guc.c:2935 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "" -#: utils/misc/guc.c:2738 -msgid "Size of new file to fsync instead of writing WAL." +#: utils/misc/guc.c:2946 +msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "" -#: utils/misc/guc.c:2749 +#: utils/misc/guc.c:2957 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "동시에 작동할 WAL 송신 프로세스 최대 수 지정" -#: utils/misc/guc.c:2760 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "동시에 사용할 수 있는 복제 슬롯 최대 수 지정" -#: utils/misc/guc.c:2770 +#: utils/misc/guc.c:2978 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "복제 슬롯을 위해 보관할 최대 WAL 크기 지정" -#: utils/misc/guc.c:2771 +#: utils/misc/guc.c:2979 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 "" -#: utils/misc/guc.c:2783 +#: utils/misc/guc.c:2991 msgid "Sets the maximum time to wait for WAL replication." msgstr "WAL 복제를 위해 기다릴 최대 시간 설정" -#: utils/misc/guc.c:2794 +#: utils/misc/guc.c:3002 msgid "" "Sets the delay in microseconds between transaction commit and flushing WAL " "to disk." msgstr "" "트랜잭션과 트랜잭션 로그의 적용 사이의 간격을 microsecond 단위로 지정함" -#: utils/misc/guc.c:2806 +#: utils/misc/guc.c:3014 msgid "" -"Sets the minimum concurrent open transactions before performing commit_delay." +"Sets the minimum number of concurrent open transactions required before " +"performing commit_delay." msgstr "commit_delay 처리하기 전에 있는 최소 동시 열려 있는 트랜잭션 개수." -#: utils/misc/guc.c:2817 +#: utils/misc/guc.c:3025 msgid "Sets the number of digits displayed for floating-point values." msgstr "부동소수형 값을 표기할 때 " -#: utils/misc/guc.c:2818 +#: utils/misc/guc.c:3026 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 " @@ -27390,33 +29592,29 @@ msgid "" "output mode." msgstr "" "이 값은 real, duoble 부동 소숫점과 지리정보 자료형에 영향을 끼칩니다. 이 값" -"은 정수여야합니다(FLT_DIG or DBL_DIG as appropriate - 무슨 말인지). 음수면 " +"은 정수여야 합니다(FLT_DIG or DBL_DIG as appropriate - 무슨 말인지). 음수면 " "그 만큼 소숫점 자리를 더 많이 생략해서 정확도를 떨어뜨립니다." -#: utils/misc/guc.c:2830 +#: utils/misc/guc.c:3038 msgid "" "Sets the minimum execution time above which a sample of statements will be " "logged. Sampling is determined by log_statement_sample_rate." msgstr "" -"" -#: utils/misc/guc.c:2833 +#: utils/misc/guc.c:3041 msgid "Zero logs a sample of all queries. -1 turns this feature off." -msgstr "" -"0을 지정하면 모든 쿼리를 로깅하고, -1을 지정하면 이 기능이 해제됩니다." +msgstr "0을 지정하면 모든 쿼리를 로깅하고, -1을 지정하면 이 기능이 해제됩니다." -#: utils/misc/guc.c:2843 +#: utils/misc/guc.c:3051 msgid "" "Sets the minimum execution time above which all statements will be logged." -msgstr "" -"모든 실행 쿼리문을 로그로 남길 최소 실행 시간을 설정합니다." +msgstr "모든 실행 쿼리문을 로그로 남길 최소 실행 시간을 설정합니다." -#: utils/misc/guc.c:2845 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." -msgstr "" -"0을 지정하면 모든 쿼리를 로깅하고, -1을 지정하면 이 기능이 해제됩니다." +msgstr "0을 지정하면 모든 쿼리를 로깅하고, -1을 지정하면 이 기능이 해제됩니다." -#: utils/misc/guc.c:2855 +#: utils/misc/guc.c:3063 msgid "" "Sets the minimum execution time above which autovacuum actions will be " "logged." @@ -27424,208 +29622,204 @@ msgstr "" "이 시간을 초과할 경우 자동 청소 작업 로그를 남길 최소 실행 시간을 설정합니" "다." -#: utils/misc/guc.c:2857 +#: utils/misc/guc.c:3065 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "" -"0을 지정하면 모든 작업을 로깅하고, -1을 지정하면 자동 청소관련 로그를 남기지 않음" +"0을 지정하면 모든 작업을 로깅하고, -1을 지정하면 자동 청소관련 로그를 남기지 " +"않음" -#: utils/misc/guc.c:2867 +#: utils/misc/guc.c:3075 msgid "" -"When logging statements, limit logged parameter values to first N bytes." +"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:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "" -#: utils/misc/guc.c:2878 +#: utils/misc/guc.c:3087 msgid "" -"When reporting an error, limit logged parameter values to first N bytes." +"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:3099 msgid "Background writer sleep time between rounds." msgstr "백그라운드 기록자의 잠자는 시간" -#: utils/misc/guc.c:2900 +#: utils/misc/guc.c:3110 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "라운드당 플러시할 백그라운드 작성기 최대 LRU 페이지 수입니다." -#: utils/misc/guc.c:2923 +#: utils/misc/guc.c:3133 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:3151 msgid "" "A variant of effective_io_concurrency that is used for maintenance work." msgstr "" -#: utils/misc/guc.c:2970 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "동시 작업자 프로세스의 최대 수" -#: utils/misc/guc.c:2982 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "논리 복제 작업자 프로세스의 최대 수" -#: utils/misc/guc.c:2994 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "구독을 위한 테이블 동기화 작업자의 최대 수" -#: utils/misc/guc.c:3004 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "N분 후에 자동 로그 파일 회전이 발생합니다." +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "강제 로그 파일 바꾸기 전 대기 시간 지정" -#: utils/misc/guc.c:3015 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "N킬로바이트 후에 자동 로그 파일 회전이 발생합니다." +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "로그 파일 바꾸기 전 최대 로그 파일 크기 지정" -#: utils/misc/guc.c:3026 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "함수 인자의 최대 갯수를 보여줍니다" -#: utils/misc/guc.c:3037 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "인덱스 키의 최대개수를 보여줍니다." -#: utils/misc/guc.c:3048 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "최대 식별자 길이를 표시합니다." -#: utils/misc/guc.c:3059 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "디스크 블록의 크기를 표시합니다." -#: utils/misc/guc.c:3070 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "디스크 파일당 페이지 수를 표시합니다." -#: utils/misc/guc.c:3081 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "미리 쓰기 로그의 블록 크기를 표시합니다." -#: utils/misc/guc.c:3092 +#: utils/misc/guc.c:3305 msgid "" "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "" -#: utils/misc/guc.c:3104 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "미리 쓰기 로그 세그먼트당 페이지 크기를 표시합니다." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "자동 청소 실행 사이의 절전 모드 시간입니다." -#: utils/misc/guc.c:3127 +#: utils/misc/guc.c:3340 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "청소 전의 최소 튜플 업데이트 또는 삭제 수입니다." -#: utils/misc/guc.c:3136 +#: utils/misc/guc.c:3349 msgid "" "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert " "vacuums." msgstr "청소를 위한 최소 튜플 삽입 수입니다. -1은 insert는 vacuum에서 제외" -#: utils/misc/guc.c:3145 +#: utils/misc/guc.c:3358 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "통계 정보 수집을 위한 최소 튜플 삽입, 업데이트 또는 삭제 수입니다." -#: utils/misc/guc.c:3155 +#: utils/misc/guc.c:3368 msgid "" "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "" "트랜잭션 ID 겹침 방지를 위해 테이블에 대해 autovacuum 작업을 수행할 테이블 나" "이를 지정합니다." -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3380 msgid "" "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "" "멀티 트랜잭션 ID 겹침 방지를 위해 테이블에 대해 autovacuum 작업을 수행할 트랜" "잭션 나이를 지정합니다." -#: utils/misc/guc.c:3176 +#: utils/misc/guc.c:3390 msgid "" "Sets the maximum number of simultaneously running autovacuum worker " "processes." msgstr "동시에 작업할 수 있는 autovacuum 작업자 최대 수 지정" -#: utils/misc/guc.c:3186 +#: utils/misc/guc.c:3400 msgid "" "Sets the maximum number of parallel processes per maintenance operation." msgstr "유지보수 작업에서 사용할 병렬 프로세스 최대 수를 지정" -#: utils/misc/guc.c:3196 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per executor node." msgstr "실행 노드당 최대 병렬 처리 수 지정" -#: utils/misc/guc.c:3207 +#: utils/misc/guc.c:3421 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:3432 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "각 autovacuum 작업자 프로세스가 사용할 메모리 최대치" -#: utils/misc/guc.c:3229 +#: utils/misc/guc.c:3443 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:3444 msgid "A value of -1 disables this feature." msgstr "이 값이 -1 이면 이 기능 사용 안함" -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "TCP 연결 유지 실행 간격입니다." -#: utils/misc/guc.c:3241 utils/misc/guc.c:3252 utils/misc/guc.c:3376 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "이 값이 0이면 시스템 기본 값" -#: utils/misc/guc.c:3251 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "TCP keepalive 시간 설정" -#: utils/misc/guc.c:3262 +#: utils/misc/guc.c:3476 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "" -#: utils/misc/guc.c:3273 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCP keepalive 확인 최대 횟수" -#: utils/misc/guc.c:3274 +#: utils/misc/guc.c:3488 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." +"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을 지정하면 시스템 기본 값이 사용됩니다." +"연결이 중단된 것으로 간주되기 전에 연결 유지 요청을 위한 연속적인 " +"keepalive 패킷 전송 수. 0을 지정하면 시스템 기본 값이 사용됩니다." -#: utils/misc/guc.c:3285 +#: utils/misc/guc.c:3499 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "정확한 GIN 기준 검색에 허용되는 최대 결과 수를 설정합니다." -#: utils/misc/guc.c:3296 +#: utils/misc/guc.c:3510 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "디스크 캐시 총 크기에 대한 계획 관리자의 가정을 설정합니다." -#: utils/misc/guc.c:3297 +#: utils/misc/guc.c:3511 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 " @@ -27634,59 +29828,81 @@ msgstr "" "즉, PostgreSQL에서 사용하는 총 캐시 크기입니다(커널 캐시와 공유 버퍼 모두 포" "함). 이 값은 디스크 페이지 단위로 측정되며, 일반적으로 각각 8kB입니다." -#: utils/misc/guc.c:3308 +#: utils/misc/guc.c:3522 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "병렬 조회를 위한 최소 테이블 자료량 지정" -#: utils/misc/guc.c:3309 +#: utils/misc/guc.c:3523 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:3533 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "병렬 조회를 위한 최소 인덱스 자료량 지정" -#: utils/misc/guc.c:3320 +#: utils/misc/guc.c:3534 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:3545 msgid "Shows the server version as an integer." msgstr "서버 버전을 정수형으로 보여줍니다" -#: utils/misc/guc.c:3342 +#: utils/misc/guc.c:3556 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "이 킬로바이트 수보다 큰 임시 파일의 사용을 기록합니다." -#: utils/misc/guc.c:3343 +#: utils/misc/guc.c:3557 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:3567 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:3578 msgid "Sets the maximum size of the pending list for GIN index." msgstr "GIN 인덱스를 위한 팬딩(pending) 목록의 최대 크기 지정" -#: utils/misc/guc.c:3375 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "" -#: utils/misc/guc.c:3395 +#: utils/misc/guc.c:3600 +msgid "The size of huge page that should be requested." +msgstr "" + +#: utils/misc/guc.c:3611 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "" + +#: utils/misc/guc.c:3634 +msgid "" +"Sets the time interval between checks for disconnection while running " +"queries." +msgstr "쿼리 실행 중에 연결을 끊을지 검사하는 간격을 지정합니다." + +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "연결 작업이 오래 진행되는 경우 진행 상태 갱신 주기" + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "0을 지정하면 이 기능이 해제됩니다." + +#: utils/misc/guc.c:3666 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:3677 msgid "" "Sets the planner's estimate of the cost of a nonsequentially fetched disk " "page." @@ -27694,11 +29910,11 @@ msgstr "" "비순차적으로 접근하는 디스크 페이지에 대한 계획 관리자의 예상 비용을 설정합니" "다." -#: utils/misc/guc.c:3417 +#: utils/misc/guc.c:3688 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "각 튜플(행)에 대한 계획 관리자의 예상 처리 비용을 설정합니다." -#: utils/misc/guc.c:3428 +#: utils/misc/guc.c:3699 msgid "" "Sets the planner's estimate of the cost of processing each index entry " "during an index scan." @@ -27706,7 +29922,7 @@ msgstr "" "실행 계획기의 비용 계산에 사용될 인덱스 스캔으로 각 인덱스 항목을 처리하는 예" "상 처리 비용을 설정합니다." -#: utils/misc/guc.c:3439 +#: utils/misc/guc.c:3710 msgid "" "Sets the planner's estimate of the cost of processing each operator or " "function call." @@ -27714,77 +29930,84 @@ msgstr "" "실행 계획기의 비용 계산에 사용될 함수 호출이나 연산자 연산 처리하는 예상 처" "리 비용을 설정합니다." -#: utils/misc/guc.c:3450 +#: utils/misc/guc.c:3721 msgid "" "Sets the planner's estimate of the cost of passing each tuple (row) from " -"worker to master backend." -msgstr "각 튜플(행)에 대한 계획 관리자의 예상 처리 비용을 설정합니다." +"worker to leader backend." +msgstr "각 튜플(행)을 작업자에서 리더 백엔드로 보내는 예상 비용을 실행계획기에 설정합니다." -#: utils/misc/guc.c:3461 +#: utils/misc/guc.c:3732 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:3744 msgid "Perform JIT compilation if query is more expensive." -msgstr "" +msgstr "쿼리 수행 예상 비용이 이 값보다 크면, JIT 짜깁기를 수행" -#: utils/misc/guc.c:3474 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." -msgstr "" +msgstr "-1 = JIT 짜깁기 안함" -#: utils/misc/guc.c:3484 -msgid "Optimize JITed functions if query is more expensive." -msgstr "" +#: utils/misc/guc.c:3755 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "쿼리 수행 예상 비용이 이 값보다 크면, JIT-컴파일된 함수 최적화 함" -#: utils/misc/guc.c:3485 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." -msgstr "-1 최적화 비활성화" +msgstr "-1 = 최적화 비활성화" -#: utils/misc/guc.c:3495 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." -msgstr "" +msgstr "쿼리 수행 예상 비용이 이 값보다 크면, JIT 인라인 작업 수행" -#: utils/misc/guc.c:3496 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." -msgstr "" +msgstr "-1 = 인라인 기능 끔" -#: utils/misc/guc.c:3506 +#: utils/misc/guc.c:3777 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:3789 +msgid "" +"Sets the planner's estimate of the average size of a recursive query's " +"working table." +msgstr "재귀 호출 쿼리 대상 테이블의 평균 크기를 실행 계획기에 설정 함" + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 모집단 내의 선택 압력입니다." -#: utils/misc/guc.c:3529 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: 무작위 경로 선택을 위한 씨드" -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3823 msgid "Multiple of work_mem to use for hash tables." msgstr "" -#: utils/misc/guc.c:3551 +#: utils/misc/guc.c:3834 msgid "Multiple of the average buffer usage to free per round." msgstr "라운드당 해제할 평균 버퍼 사용의 배수입니다." -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "난수 생성 속도를 설정합니다." -#: utils/misc/guc.c:3572 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "청소 비용 지연(밀리초)입니다." -#: utils/misc/guc.c:3583 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "자동 청소에 대한 청소 비용 지연(밀리초)입니다." -#: utils/misc/guc.c:3594 +#: utils/misc/guc.c:3877 msgid "" "Number of tuple updates or deletes prior to vacuum as a fraction of " "reltuples." @@ -27792,11 +30015,11 @@ msgstr "" "vacuum 작업을 진행할 update, delete 작업량을 전체 자료에 대한 분수값으로 지정" "합니다." -#: utils/misc/guc.c:3604 +#: utils/misc/guc.c:3887 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "" -#: utils/misc/guc.c:3614 +#: utils/misc/guc.c:3897 msgid "" "Number of tuple inserts, updates, or deletes prior to analyze as a fraction " "of reltuples." @@ -27804,139 +30027,145 @@ msgstr "" "통계 수집 작업을 진행할 insert, update, delete 작업량을 전체 자료에 대한 분수" "값으로 지정합니다." -#: utils/misc/guc.c:3624 +#: utils/misc/guc.c:3907 msgid "" "Time spent flushing dirty buffers during checkpoint, as fraction of " "checkpoint interval." -msgstr "" -"체크포인트 반복 주기 안에 작업을 완료할 분수값(1=100%)" - -#: utils/misc/guc.c:3634 -msgid "" -"Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "" +msgstr "체크포인트 반복 주기 안에 작업을 완료할 분수값(1=100%)" -#: utils/misc/guc.c:3644 +#: utils/misc/guc.c:3917 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "" -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3918 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "" -#: utils/misc/guc.c:3654 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "새 트랜잭션에 대해서 로그에 남길 트랜잭션 비율을 설정합니다." +#: utils/misc/guc.c:3927 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "모든 구문을 로그로 남기려고 할 때, 그 남길 비율" -#: utils/misc/guc.c:3655 +#: utils/misc/guc.c:3928 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 "" +"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:3947 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:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "이 설정은 \"archive_library\" 설정이 안되어 있을 때만 작동합니다." + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "WAL 파일을 아카이빙하기 위해 호출될 셸 명령을 설정합니다." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc.c:3967 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:3977 msgid "Sets the shell command that will be executed at every restart point." msgstr "매 복구 작업이 끝난 다음 실행할 쉘 명령어를 설정합니다." -#: utils/misc/guc.c:3705 +#: utils/misc/guc.c:3987 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:3997 msgid "Specifies the timeline to recover into." msgstr "복구할 타임라인을 지정합니다." -#: utils/misc/guc.c:3725 +#: utils/misc/guc.c:4007 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:4016 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "" -#: utils/misc/guc.c:3743 +#: utils/misc/guc.c:4025 msgid "Sets the time stamp up to which recovery will proceed." msgstr "" -#: utils/misc/guc.c:3752 +#: utils/misc/guc.c:4034 msgid "Sets the named restore point up to which recovery will proceed." msgstr "" -#: utils/misc/guc.c:3761 +#: utils/misc/guc.c:4043 msgid "" "Sets the LSN of the write-ahead log location up to which recovery will " "proceed." msgstr "" -#: utils/misc/guc.c:3771 +#: utils/misc/guc.c:4053 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "" -#: utils/misc/guc.c:3781 +#: utils/misc/guc.c:4063 msgid "Sets the connection string to be used to connect to the sending server." msgstr "" -#: utils/misc/guc.c:3792 +#: utils/misc/guc.c:4074 msgid "Sets the name of the replication slot to use on the sending server." msgstr "복제 슬롯 이름을 지정합니다." -#: utils/misc/guc.c:3802 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "클라이언트 문자 세트 인코딩을 지정함" -#: utils/misc/guc.c:3813 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "각 로그 줄 앞에 추가할 정보를 제어합니다." -#: utils/misc/guc.c:3814 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "비워 두면 접두사가 사용되지 않습니다." -#: utils/misc/guc.c:3823 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "로그 메시지에 사용할 표준 시간대를 설정합니다." -#: utils/misc/guc.c:3833 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "날짜와 시간 값을 나타내는 모양을 지정합니다." -#: utils/misc/guc.c:3834 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "또한 모호한 날짜 입력의 해석을 제어합니다." -#: utils/misc/guc.c:3845 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "새 테이블에서 사용할 기본 테이블 접근 방법을 지정합니다." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:4138 msgid "Sets the default tablespace to create tables and indexes in." msgstr "테이블 및 인덱스를 만들 기본 테이블스페이스를 설정합니다." -#: utils/misc/guc.c:3857 +#: utils/misc/guc.c:4139 msgid "An empty string selects the database's default tablespace." msgstr "빈 문자열을 지정하면 데이터베이스의 기본 테이블스페이스가 선택됩니다." -#: utils/misc/guc.c:3867 +#: utils/misc/guc.c:4149 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "임시 테이블 및 정렬 파일에 사용할 테이블스페이스를 설정합니다." -#: utils/misc/guc.c:3878 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "동적으로 불러올 수 있는 모듈들이 있는 경로를 지정함." -#: utils/misc/guc.c:3879 +#: utils/misc/guc.c:4161 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 " @@ -27946,242 +30175,242 @@ msgstr "" "소가 없는 경우(즉, 이름에 슬래시가 없음) 시스템은 이 경로에서 지정한 파일을 " "검색합니다." -#: utils/misc/guc.c:3892 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberos 서버 키 파일의 위치를 지정함." -#: utils/misc/guc.c:3903 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Bonjour 서비스 이름을 지정" -#: utils/misc/guc.c:3915 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "데이터 정렬 순서 로케일을 표시합니다." -#: utils/misc/guc.c:3926 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "문자 분류 및 대/소문자 변환 로케일을 표시합니다." -#: utils/misc/guc.c:3937 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "보여질 메시지로 사용할 언어 지정." -#: utils/misc/guc.c:3947 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "통화금액 표현 양식으로 사용할 로케일 지정." -#: utils/misc/guc.c:3957 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "숫자 표현 양식으로 사용할 로케일 지정." -#: utils/misc/guc.c:3967 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting date and time values." msgstr "날짜와 시간 값을 표현할 양식으로 사용할 로케일 지정." -#: utils/misc/guc.c:3977 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "각각의 백엔드에 미리 불러올 공유 라이브러리들을 지정합니다" -#: utils/misc/guc.c:3988 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "서버에 미리 불러올 공유 라이브러리들을 지정합니다" -#: utils/misc/guc.c:3999 +#: utils/misc/guc.c:4281 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "" "각각의 백엔드에 미리 불러올 접근제한 없는 공유 라이브러리들을 지정합니다" -#: utils/misc/guc.c:4010 +#: utils/misc/guc.c:4292 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:4304 +msgid "Shows the server (database) character set encoding." +msgstr "서버 (데이터베이스) 문자 세트 인코딩 보여줌" -#: utils/misc/guc.c:4034 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "서버 버전 보임." -#: utils/misc/guc.c:4046 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "현재 롤을 지정" -#: utils/misc/guc.c:4058 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "세션 사용자 이름 지정." -#: utils/misc/guc.c:4069 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "서버 로그 출력을 위한 대상을 지정합니다." -#: utils/misc/guc.c:4070 +#: utils/misc/guc.c:4352 msgid "" -"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and " -"\"eventlog\", depending on the platform." +"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", " +"\"jsonlog\", and \"eventlog\", depending on the platform." msgstr "" -"유효한 값은 플랫폼에 따라 \"stderr\", \"syslog\", \"csvlog\" 및 \"eventlog" +"유효한 값은 플랫폼에 따라 \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\" 및 \"eventlog" "\"의 조합입니다." -#: utils/misc/guc.c:4081 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "로그 파일의 대상 디렉터리를 설정합니다." -#: utils/misc/guc.c:4082 +#: utils/misc/guc.c:4364 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "데이터 디렉터리의 상대 경로 또는 절대 경로로 지정할 수 있습니다." -#: utils/misc/guc.c:4092 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "로그 파일의 파일 이름 패턴을 설정합니다." -#: utils/misc/guc.c:4103 +#: utils/misc/guc.c:4385 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "syslog에서 구분할 PostgreSQL 메시지에 사용될 프로그램 이름을 지정." -#: utils/misc/guc.c:4114 +#: utils/misc/guc.c:4396 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:4407 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "시간대(time zone)를 지정함." -#: utils/misc/guc.c:4135 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "표준 시간대 약어 파일을 선택합니다." -#: utils/misc/guc.c:4145 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "유닉스 도메인 소켓의 소유주를 지정" -#: utils/misc/guc.c:4146 +#: utils/misc/guc.c:4428 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:4438 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "유닉스 도메인 소켓을 만들 디렉터리를 지정합니다." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4453 msgid "Sets the host name or IP address(es) to listen to." msgstr "서비스할 호스트이름이나, IP를 지정함." -#: utils/misc/guc.c:4186 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "서버의 데이터 디렉터리 위치를 지정합니다." -#: utils/misc/guc.c:4197 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "서버의 기본 환경설정 파일 경로를 지정합니다." -#: utils/misc/guc.c:4208 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "서버의 \"hba\" 구성 파일을 설정합니다." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "서버의 \"ident\" 구성 파일을 설정합니다." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "postmaster PID가 기록된 파일의 경로를 지정합니다." -#: utils/misc/guc.c:4241 -msgid "Name of the SSL library." +#: utils/misc/guc.c:4523 +msgid "Shows the name of the SSL library." msgstr "" -#: utils/misc/guc.c:4256 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "서버 인증서 파일 위치를 지정함" -#: utils/misc/guc.c:4266 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server private key file." msgstr "SSL 서버 개인 키 파일의 위치를 지정함." -#: utils/misc/guc.c:4276 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "" -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." msgstr "SSL 인증서 파기 목록 파일의 위치" -#: utils/misc/guc.c:4296 -msgid "Writes temporary statistics files to the specified directory." -msgstr "지정한 디렉터리에 임시 통계 파일을 씁니다." +#: utils/misc/guc.c:4578 +msgid "Location of the SSL certificate revocation list directory." +msgstr "SSL 인증서 파기 목록 디렉터리 위치" -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4588 msgid "" "Number of synchronous standbys and list of names of potential synchronous " "ones." msgstr "" -#: utils/misc/guc.c:4318 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "기본 텍스트 검색 구성을 설정합니다." -#: utils/misc/guc.c:4328 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "허용되는 SSL 암호 목록을 설정합니다." -#: utils/misc/guc.c:4343 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "ECDH에 사용할 curve 설정" -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "SSL DH 매개 변수 파일의 위치." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "" -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4661 msgid "Sets the application name to be reported in statistics and logs." msgstr "" -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4672 msgid "Sets the name of the cluster, which is included in the process title." msgstr "" -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4683 msgid "" "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "" -#: utils/misc/guc.c:4403 +#: utils/misc/guc.c:4684 msgid "" "Full-page images will be logged for all data blocks and cross-checked " "against the results of WAL replay." msgstr "" -#: utils/misc/guc.c:4413 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "사용할 JIT 제공자" -#: utils/misc/guc.c:4424 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "이 함수들 안에 오류 추적용 로그를 남김" -#: utils/misc/guc.c:4444 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "문자열에서 \"\\'\" 문자 사용을 허용할 것인지를 정하세요" -#: utils/misc/guc.c:4454 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "bytea 값의 표시 형식을 설정합니다." -#: utils/misc/guc.c:4464 +#: utils/misc/guc.c:4745 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:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 msgid "" "Each level includes all the levels that follow it. The later the level, the " "fewer messages are sent." @@ -28189,11 +30418,15 @@ msgstr "" "각 수준에는 이 수준 뒤에 있는 모든 수준이 포함됩니다. 수준이 뒤에 있을수" "록 전송되는 메시지 수가 적습니다." -#: utils/misc/guc.c:4475 +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "" + +#: utils/misc/guc.c:4766 msgid "Enables the planner to use constraints to optimize queries." msgstr "실행계획기가 쿼리 최적화 작업에서 제약 조건을 사용하도록 함" -#: utils/misc/guc.c:4476 +#: utils/misc/guc.c:4767 msgid "" "Table scans will be skipped if their constraints guarantee that no rows " "match the query." @@ -28201,87 +30434,99 @@ msgstr "" "제약 조건에 의해 쿼리와 일치하는 행이 없는 경우 테이블 스캔을 건너뜁니" "다." -#: utils/misc/guc.c:4487 +#: utils/misc/guc.c:4778 +msgid "Sets the default compression method for compressible values." +msgstr "압축 가능한 값을 압축하기 위한 기본 압축 방법을 지정합니다." + +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "각 새 트랜잭션의 트랜잭션 격리 수준을 설정합니다." -#: utils/misc/guc.c:4497 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "현재 트랜잭션 독립성 수준(isolation level)을 지정함." -#: utils/misc/guc.c:4508 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "간격 값의 표시 형식을 설정합니다." -#: utils/misc/guc.c:4519 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "기록되는 메시지의 상세 정도를 지정합니다." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "서버 로그에 기록될 메시지 수준을 지정함." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4842 msgid "" "Causes all statements generating error at or above this level to be logged." msgstr "" "오류가 있는 모든 쿼리문이나 지정한 로그 레벨 이상의 쿼리문을 로그로 남김" -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "서버로그에 기록될 구문 종류를 지정합니다." -#: utils/misc/guc.c:4561 +#: utils/misc/guc.c:4863 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "syslog 기능을 사용할 때, 사용할 syslog \"facility\" 값을 지정." -#: utils/misc/guc.c:4576 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "트리거 및 다시 쓰기 규칙에 대한 세션의 동작을 설정합니다." -#: utils/misc/guc.c:4586 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "현재 트랜잭션 격리 수준(isolation level)을 지정함." -#: utils/misc/guc.c:4596 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "archive_command를 사용하여 WAL 파일을 따로 보관하도록 설정합니다." -#: utils/misc/guc.c:4606 +#: utils/misc/guc.c:4908 msgid "Sets the action to perform upon reaching the recovery target." msgstr "" -#: utils/misc/guc.c:4616 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "복구 작업과 관련된 디버깅 정보를 기록하도록 합니다." -#: utils/misc/guc.c:4632 +#: utils/misc/guc.c:4935 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:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "통계 자료 접근의 동시성을 지정합니다." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "WAL 파일에 페이지 전체를 기록할 때 사용할 압축 방법" + +#: utils/misc/guc.c:4966 +msgid "Sets the level of information written to the WAL." msgstr "WAL에 저장할 내용 수준을 지정합니다." -#: utils/misc/guc.c:4652 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "사용할 동적 공유 메모리 관리방식을 선택합니다." -#: utils/misc/guc.c:4662 +#: utils/misc/guc.c:4986 msgid "" "Selects the shared memory implementation used for the main shared memory " "region." msgstr "사용할 동적 공유 메모리 관리방식을 선택합니다." -#: utils/misc/guc.c:4672 +#: utils/misc/guc.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "디스크에 대한 강제 WAL 업데이트에 사용되는 방법을 선택합니다." -#: utils/misc/guc.c:4682 +#: utils/misc/guc.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "XML에서 바이너리 값이 인코딩되는 방식을 설정합니다." -#: utils/misc/guc.c:4692 +#: utils/misc/guc.c:5016 msgid "" "Sets whether XML data in implicit parsing and serialization operations is to " "be considered as documents or content fragments." @@ -28289,49 +30534,84 @@ msgstr "" "암시적 구문 분석 및 직렬화 작업의 XML 데이터를 문서 또는 내용 조각으로 간주할" "지 여부를 설정합니다." -#: utils/misc/guc.c:4703 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "리눅스 또는 Windows huge 페이지 사용 여부" -#: utils/misc/guc.c:4713 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "복구 작업 중에 참조하는 블록을 미리 준비하는 방법." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "" + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "병렬 쿼리 기능을 활성화" -#: utils/misc/guc.c:4714 +#: utils/misc/guc.c:5048 msgid "" "If possible, run query using a parallel worker and with parallel " "restrictions." msgstr "" -#: utils/misc/guc.c:4724 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "" -#: utils/misc/guc.c:4734 +#: utils/misc/guc.c:5068 msgid "Controls the planner's selection of custom or generic plan." msgstr "" -#: utils/misc/guc.c:4735 +#: utils/misc/guc.c:5069 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:5081 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "사용할 최소 SSL/TLS 프로토콜 버전을 지정합니다." -#: utils/misc/guc.c:4759 +#: utils/misc/guc.c:5093 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "사용할 최대 SSL/TLS 프로토콜 버전을 지정합니다." -#: utils/misc/guc.c:5562 +#: utils/misc/guc.c:5105 +msgid "" +"Sets the method for synchronizing the data directory before crash recovery." +msgstr "" + +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "알 수 없는 환경 매개 변수 이름 \"%s\"" + +#: utils/misc/guc.c:5682 +#, c-format +msgid "" +"Custom parameter names must be two or more simple identifiers separated by " +"dots." +msgstr "" + +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" 이름은 예약된 접두사입니다." + +#: utils/misc/guc.c:5712 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "알 수 없는 환경 매개 변수 이름: \"%s\"" + +#: utils/misc/guc.c:6104 #, 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:6109 #, c-format msgid "" "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" @@ -28339,7 +30619,7 @@ msgstr "" "initdb 명령이나, pg_basebackup 명령으로 PostgreSQL 데이터 디렉터리를 초기화 " "하세요.\n" -#: utils/misc/guc.c:5587 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -28351,12 +30631,12 @@ msgstr "" "PGDATA 이름의 환경 변수를 만들고 그 값으로 해당 디렉터리를 지정한 뒤,\n" "이 프로그램을 다시 실행해 보십시오.\n" -#: utils/misc/guc.c:5606 +#: utils/misc/guc.c:6148 #, 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:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -28369,7 +30649,7 @@ msgstr "" "PGDATA 이름의 환경 변수를 만들고 그 값으로 해당 디렉터리를 지정한 뒤,\n" "이 프로그램을 다시 실행해 보십시오.\n" -#: utils/misc/guc.c:5680 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -28382,7 +30662,7 @@ msgstr "" "PGDATA 이름의 환경 변수를 만들고 그 값으로 해당 디렉터리를 지정한 뒤,\n" "이 프로그램을 다시 실행해 보십시오.\n" -#: utils/misc/guc.c:5703 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28395,131 +30675,133 @@ msgstr "" "PGDATA 이름의 환경 변수를 만들고 그 값으로 해당 디렉터리를 지정한 뒤,\n" "이 프로그램을 다시 실행해 보십시오.\n" -#: utils/misc/guc.c:6545 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "값이 정수 범위를 초과합니다." -#: utils/misc/guc.c:6781 +#: utils/misc/guc.c:7412 #, 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:7448 #, 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:7648 utils/misc/guc.c:9096 #, 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:7665 utils/misc/guc.c:8920 #, 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:7688 utils/misc/guc.c:7908 utils/misc/guc.c:8006 +#: utils/misc/guc.c:8104 utils/misc/guc.c:8228 utils/misc/guc.c:8331 +#: 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:7698 #, 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:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 +#: utils/misc/guc.c:11795 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "\"%s\" 매개 변수를 지정할 권한이 없습니다." -#: utils/misc/guc.c:7083 +#: utils/misc/guc.c:7763 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "\"%s\" 매개 변수값은 연결 시작한 뒤에는 변경할 수 없습니다" -#: utils/misc/guc.c:7131 +#: utils/misc/guc.c:7822 #, 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:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10001 #, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "\"%s\" 검사를 위한 pg_read_all_settings의 맴버는 superuser여야합니다" +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:7881 +#: utils/misc/guc.c:8606 #, c-format msgid "SET %s takes only one argument" -msgstr "SET %s 명령은 하나의 값만 지정해야합니다" +msgstr "SET %s 명령은 하나의 값만 지정해야 합니다" -#: utils/misc/guc.c:8129 +#: utils/misc/guc.c:8886 #, 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:8214 +#: utils/misc/guc.c:8953 #, 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:8998 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "\"%s\" 파일의 내용을 분석할 수 없음" -#: utils/misc/guc.c:8416 +#: utils/misc/guc.c:9172 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT 명령은 아직 구현 되지 않았습니다" -#: utils/misc/guc.c:8500 +#: utils/misc/guc.c:9259 #, c-format msgid "SET requires parameter name" msgstr "SET 명령은 매개 변수 이름이 필요합니다" -#: utils/misc/guc.c:8633 +#: utils/misc/guc.c:9392 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "\"%s\" 매개 변수를 다시 정의하려고 함" -#: utils/misc/guc.c:10426 +#: utils/misc/guc.c:9719 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "알 수 없는 환경 매개 변수 이름 \"%s\", 이 설정은 지웁니다." + +#: utils/misc/guc.c:9721 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" 이름은 현재 예약된 접두사입니다." + +#: utils/misc/guc.c:11235 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "\"%s\" 매개 변수 값을 \"%s\" (으)로 바꾸는 중" -#: utils/misc/guc.c:10494 +#: utils/misc/guc.c:11404 #, c-format msgid "parameter \"%s\" could not be set" msgstr "\"%s\" 매개 변수는 설정할 수 없음" -#: utils/misc/guc.c:10584 +#: utils/misc/guc.c:11496 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "지정한 \"%s\" 매개 변수값의 구문분석을 실패했습니다." -#: utils/misc/guc.c:10942 utils/misc/guc.c:10976 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "잘못된 \"%s\" 매개 변수의 값: %d" - -#: utils/misc/guc.c:11010 +#: utils/misc/guc.c:11927 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "잘못된 \"%s\" 매개 변수의 값: %g" -#: utils/misc/guc.c:11280 +#: utils/misc/guc.c:12240 #, c-format msgid "" "\"temp_buffers\" cannot be changed after any temporary tables have been " @@ -28528,22 +30810,22 @@ msgstr "" "해당 세션에서 어떤 임시 테이블도 사용하고 있지 않아야 \"temp_buffers\" 설정" "을 변경할 수 있습니다." -#: utils/misc/guc.c:11292 +#: utils/misc/guc.c:12252 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour 기능을 뺀 채로 서버가 만들어졌습니다." -#: utils/misc/guc.c:11305 +#: utils/misc/guc.c:12265 #, c-format msgid "SSL is not supported by this build" msgstr "SSL 접속 기능을 뺀 채로 서버가 만들어졌습니다." -#: utils/misc/guc.c:11317 +#: utils/misc/guc.c:12277 #, 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:12289 #, c-format msgid "" "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " @@ -28552,43 +30834,53 @@ msgstr "" "\"log_parser_stats\", \"log_planner_stats\", \"log_executor_stats\" 설정값들 " "중 하나가 true 일 때는 \"log_statement_stats\" 설정을 활성화할 수 없습니다" -#: utils/misc/guc.c:11559 +#: utils/misc/guc.c:12519 #, c-format msgid "" "effective_io_concurrency must be set to 0 on platforms that lack " "posix_fadvise()." msgstr "" -#: utils/misc/guc.c:11572 +#: utils/misc/guc.c:12532 #, c-format msgid "" "maintenance_io_concurrency must be set to 0 on platforms that lack " "posix_fadvise()." msgstr "" -#: utils/misc/guc.c:11688 +#: utils/misc/guc.c:12546 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size 값은 이 플랫폼에서는 0이어야 합니다." + +#: utils/misc/guc.c:12558 +#, c-format +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "" + +#: utils/misc/guc.c:12670 #, c-format msgid "invalid character" msgstr "잘못된 문자" -#: utils/misc/guc.c:11748 +#: utils/misc/guc.c:12730 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline 값으로 잘못된 숫자입니다." -#: utils/misc/guc.c:11788 +#: utils/misc/guc.c:12770 #, c-format msgid "multiple recovery targets specified" msgstr "복구 대상을 다중 지정했음" -#: utils/misc/guc.c:11789 +#: utils/misc/guc.c:12771 #, 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 "" -#: utils/misc/guc.c:11797 +#: utils/misc/guc.c:12779 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "이 값으로는 \"immediate\" 만 허용합니다." @@ -28598,12 +30890,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 @@ -28629,7 +30915,7 @@ 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 "시간 초과로 더이상 추가할 수 없음" @@ -28700,65 +30986,70 @@ msgstr "\"%s\" 파일에서 time zone 파일 재귀호출 최대치를 초과했 msgid "could not read time zone file \"%s\": %m" msgstr "\"%s\" time zone 파일을 읽을 수 없음: %m" -#: utils/misc/tzparser.c:375 +#: utils/misc/tzparser.c:376 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "\"%s\" 표준 시간대 파일의 %d번째 줄이 너무 깁니다." -#: utils/misc/tzparser.c:398 +#: utils/misc/tzparser.c:400 #, c-format 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:239 #, 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/portalmem.c:187 +#: utils/mmgr/mcxt.c:1052 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "" + +#: 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\" portal 실행할 수 없음" -#: 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-" @@ -28775,46 +31066,46 @@ msgstr "임시 파일의 %ld 블럭을 찾을 수 없음" msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" msgstr "%ld 블럭을 임시 파일에서 읽을 수 없음: %zu / %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:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "tuplestore 임시 파일을 읽을 수 없음" -#: utils/sort/sharedtuplestore.c:485 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "공유된 tuplestore 임시 파일에서 예상치 못한 청크" -#: utils/sort/sharedtuplestore.c:569 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "공유 tuplestore 임시 파일에서 %u 블록을 찾을 수 없음" -#: utils/sort/sharedtuplestore.c:576 +#: utils/sort/sharedtuplestore.c:579 #, c-format msgid "" "could not read from shared tuplestore temporary file: read only %zu of %zu " "bytes" msgstr "공유 tuplestore 임시 파일을 읽을 수 없음: %zu / %zu 바이트만 읽음" -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "외부 정렬을 위해 %d 개 이상의 런을 만들 수 없음" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "\"%s\" 고유 인덱스를 만들 수 없음" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "%s 키가 중복됨" -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "중복된 키가 있음" @@ -28835,32 +31126,32 @@ msgid "" "could not read from tuplestore temporary file: read only %zu of %zu bytes" msgstr "tuplestore 임시 파일을 읽을 수 없음: %zu / %zu 바이트만 읽음" -#: utils/time/snapmgr.c:624 +#: utils/time/snapmgr.c:570 #, c-format msgid "The source transaction is not running anymore." msgstr "소스 트랜잭션이 더 이상 실행중이지 않음" -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1164 #, 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: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:1488 +#: utils/time/snapmgr.c:1420 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "쿼리보다 먼저 SET TRANSACTION SNAPSHOP 명령을 호출해야 함" -#: utils/time/snapmgr.c:1497 +#: utils/time/snapmgr.c:1429 #, c-format msgid "" "a snapshot-importing transaction must have isolation level SERIALIZABLE or " @@ -28869,12 +31160,12 @@ msgstr "" "스냅샷 가져오기 트랜잭션은 그 격리 수준이 SERIALIZABLE 또는 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 "잘못된 스냅샷 식별자: \"%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 " @@ -28883,7 +31174,7 @@ msgstr "" "직렬화 가능한 트랜잭션은 직렬화 가능하지 않은 트랜잭션에서 스냅샷을 가져올 " "수 없음" -#: 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 " @@ -28891,353 +31182,395 @@ msgid "" msgstr "" "읽기-쓰기 직렬화된 트랜잭션이 읽기 전용 트랜잭션의 스냅샷을 가져올 수 없음" -#: utils/time/snapmgr.c:1626 +#: utils/time/snapmgr.c:1558 #, c-format msgid "cannot import a snapshot from a different database" msgstr "서로 다른 데이터베이스를 대상으로는 스냅샷을 가져올 수 없음" -#: gram.y:1047 +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD 옵션은 더이상 지원하지 않음" -#: gram.y:1048 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "" -#: gram.y:1110 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "인식할 수 없는 롤 옵션 \"%s\"" -#: gram.y:1357 gram.y:1372 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "" "CREATE SCHEMA IF NOT EXISTS 구문에서는 스키마 요소들을 포함할 수 없습니다." -#: gram.y:1518 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "현재 데이터베이스를 바꿀 수 없음" -#: gram.y:1642 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "" "지역시간대 간격(time zone interval) 값은 시(HOUR) 또는 시분(HOUR TO MINUTE) " -"값이어야합니다" +"값이어야 합니다" -#: gram.y:2177 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "칼럼 번호는 1 - %d 사이의 범위에 있어야 합니다." -#: gram.y:2709 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "\"%s\" 시퀀스 옵션은 지원되지 않음" -#: gram.y:2738 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "해시 파티션용 모듈을 한 번 이상 지정했습니다" -#: gram.y:2747 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "해시 파티션용 나머지 처리기를 한 번 이상 지정했습니다" -#: gram.y:2754 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "잘못된 해시 파티션 범위 명세 \"%s\"" -#: gram.y:2762 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "해시 파티션용 모듈을 지정하세요" -#: gram.y:2766 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "해시 파티션용 나머지 처리기를 지정하세요" -#: gram.y:2967 gram.y:3000 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "PROGRAM 옵션과 STDIN/STDOUT 옵션은 함께 쓸 수 없습니다" -#: gram.y:2973 +#: gram.y:3270 #, 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:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL 예약어는 임시 테이블 만들기에서 더 이상 사용하지 않습니다" -#: gram.y:3552 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "" -#: gram.y:4512 +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "%s의 칼럼 목록은 ON DELETE 액션용으로만 지원합니다." + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM 구문은 지원하지 않습니다." -#: gram.y:5338 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "인식할 수 없는 로우 단위 보안 옵션 \"%s\"" -#: gram.y:5339 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "" -#: gram.y:5452 +#: gram.y:5758 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER 구문은 지원하지 않습니다." + +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "중복 트리거 이벤트가 지정됨" -#: gram.y:5600 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "제약조건 속성이 충돌함" -#: gram.y:5696 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION 명령은 아직 구현 되지 않았습니다" -#: gram.y:6079 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK는 더 이상 필요하지 않음" -#: gram.y:6080 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "자료형을 업데이트하십시오." -#: gram.y:7831 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "집계 함수는 output 인자를 지정할 수 없음" -#: gram.y:10153 gram.y:10171 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION 구문은 재귀적인 뷰에서 지원하지 않습니다" -#: gram.y:11779 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,# 구문은 지원하지 않습니다." -#: gram.y:11780 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "LIMIT # OFFSET # 구문을 사용하세요." -#: gram.y:12106 gram.y:12131 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" -msgstr "FROM 안의 VALUES는 반드시 alias가 있어야합니다" +msgstr "FROM 안의 VALUES는 반드시 alias가 있어야 합니다" -#: gram.y:12107 gram.y:12132 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "예, FROM (VALUES ...) [AS] foo." -#: gram.y:12112 gram.y:12137 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM 절 내의 subquery 에는 반드시 alias 를 가져야만 합니다" -#: gram.y:12113 gram.y:12138 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "예, FROM (SELECT ...) [AS] foo." -#: gram.y:12591 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "" -#: gram.y:12600 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "" -#: gram.y:12609 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "NULL/NOT NULL 선언이 서로 충돌합니다 : \"%s\" 칼럼" -#: gram.y:12618 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "인식할 수 없는 칼럼 옵션 \"%s\"" -#: gram.y:12872 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" -msgstr "실수형 자료의 정밀도 값으로는 적어도 1 bit 이상을 지정해야합니다." +msgstr "실수형 자료의 정밀도 값으로는 적어도 1 bit 이상을 지정해야 합니다." -#: gram.y:12881 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "실수형 자료의 정밀도 값으로 최대 54 bit 까지입니다." -#: gram.y:13372 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS 식의 왼쪽에 있는 매개 변수 수가 잘못됨" -#: gram.y:13377 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS 식의 오른쪽에 있는 매개 변수 수가 잘못됨" -#: gram.y:13552 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 술어는 아직 구현되지 못했습니다" -#: gram.y:13915 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "WITHIN GROUP 구문 안에서 중복된 ORDER BY 구문은 허용하지 않습니다" -#: gram.y:13920 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT과 WITHIN GROUP을 함께 쓸 수 없습니다" -#: gram.y:13925 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC과 WITHIN GROUP을 함께 쓸 수 없습니다" -#: gram.y:14391 gram.y:14414 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "프레임 시작은 UNBOUNDED FOLLOWING일 수 없음" -#: gram.y:14396 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "따라오는 로우의 프레임 시작은 현재 로우의 끝일 수 없습니다" -#: gram.y:14419 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "프레임 끝은 UNBOUNDED PRECEDING일 수 없음" -#: gram.y:14425 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "현재 로우의 프레임 시작은 선행하는 로우를 가질 수 없습니다" -#: gram.y:14432 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "따라오는 로우의 프레임 시작은 선행하는 로우를 가질 수 없습니다" -#: gram.y:15082 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "자료형 한정자는 매개 변수 이름을 사용할 수 없음" -#: gram.y:15088 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "자료형 한정자는 ORDER BY 구문을 사용할 수 없음" -#: gram.y:15153 gram.y:15160 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s 이름은 여기서 롤 이름으로 사용할 수 없음" -#: gram.y:15841 gram.y:16030 +#: gram.y:16548 gram.y:17983 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "" + +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "\"*\" 사용이 잘못됨" -#: gram.y:16094 +#: gram.y:17913 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " "VARIADIC aggregated argument of the same data type" msgstr "" -#: gram.y:16131 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "중복된 ORDER BY 구문은 허용하지 않습니다" -#: gram.y:16142 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "중복된 OFFSET 구문은 허용하지 않습니다" -#: gram.y:16151 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "중복된 LIMIT 구문은 허용하지 않습니다" -#: gram.y:16160 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "중복된 limit 옵션은 허용하지 않음" -#: gram.y:16164 -#, c-format -msgid "WITH TIES cannot be specified without ORDER BY clause" -msgstr "" - -#: gram.y:16172 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "중복된 WITH 절은 허용하지 않음" -#: gram.y:16376 +#: gram.y:18199 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT 및 INOUT 인자는 TABLE 함수에 사용할 수 없음" -#: gram.y:16472 +#: gram.y:18332 #, 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:18370 gram.y:18383 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s 제약조건에는 DEFERRABLE 옵션을 쓸 수 없음" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16536 +#: gram.y:18396 #, 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:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s 제약조건에는 NO INHERIT 옵션을 쓸 수 없음" -#: guc-file.l:315 +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "잘못된 발행 객체 목록" + +#: gram.y:18434 +#, c-format +msgid "" +"One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " +"or schema name." +msgstr "" + +#: gram.y:18450 +#, c-format +msgid "invalid table name at or near" +msgstr "잘못된 테이블 이름이거나 그 부근" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "WHERE 절은 스키마용으로 허용하지 않음" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "칼럼 명세는 스키마용으로 허용하지 않음" + +#: gram.y:18492 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "알 수 없는 환경 매개 변수 이름: \"%s\", 해당 파일: \"%s\", 줄번호: %u" +msgid "invalid schema name at or near" +msgstr "잘못된 스키마 이름이거나 그 부근" -#: guc-file.l:388 +#: guc-file.l:314 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "알 수 없는 환경 매개 변수 이름 \"%s\", 해당 파일: \"%s\", 줄번호: %d" + +#: guc-file.l:389 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "환경설정 파일에 \"%s\" 매개 변수가 빠졌음, 초기값을 사용함" @@ -29309,60 +31642,60 @@ msgstr "비어 있는 환경 설정 디렉터리 이름: \"%s\"" msgid "could not open configuration directory \"%s\": %m" msgstr "\"%s\" 환경 설정 디렉터리를 열 수 없습니다: %m" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:530 #, c-format -msgid "unrecognized flag character \"%c\" in LIKE_REGEX predicate" -msgstr "LIKE_REGEX 한정자 안에, 알 수 없는 플래그 문자: \"%c\"" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "LIKE_REGEX 구문에서 알 수 없는 플래그 문자: \"%.*s\"" -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" -msgstr "" +msgstr "XQuery \"x\" 플래그 (확장된 정규 표현식)는 구현되지 않았습니다." #. 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, jsonpath 입력 끝부분" #. 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, jsonpath 입력 \"%s\" 부근" -#: 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:142 msgid "invalid streaming start location" msgstr "잘못된 스트리밍 시작 위치" -#: repl_scanner.l:182 scan.l:717 +#: repl_scanner.l:199 scan.l:724 msgid "unterminated quoted string" msgstr "마무리 안된 따옴표 안의 문자열" # # advance 끝 -#: scan.l:458 +#: 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 "유니코드 이스케이프와 함께 문자열 상수를 사용하는 것은 안전하지 않음" -#: scan.l:543 +#: scan.l:550 #, c-format msgid "" "String constants with Unicode escapes cannot be used when " @@ -29371,21 +31704,21 @@ msgstr "" "standard_conforming_strings = off 인 경우 문자열 상수 표기에서 유니코드 이스" "케이프를 사용할 수 없습니다." -#: scan.l:604 +#: scan.l:611 msgid "unhandled previous state in xqs" -msgstr "" +msgstr "xqs 안에 처리할 수 없는 이전 상태" -#: scan.l:678 +#: scan.l:685 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "유니코드 이스케이프는 \\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." @@ -29393,62 +31726,70 @@ 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 "길이가 0인 구분 식별자" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:807 syncrep_scanner.l:91 msgid "unterminated quoted identifier" msgstr "마무리 안된 따옴표 안의 식별자" # # nonun 부분 begin -#: 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:1171 +#: scan.l:1183 #, c-format msgid "%s at end of input" msgstr "%s, 입력 끝부분" #. 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, \"%s\" 부근" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "문자열 안에 있는 \\' 문자는 표준이 아닙니다" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "" "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "작은 따옴표는 '' 형태니, 인용부호 표기법(E'...') 형태로 사용하십시오." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "문자열 안에 있는 \\\\ 문자는 표준이 아닙니다" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "백슬래시 표기는 인용부호 표기법으로 사용하세요, 예, E'\\\\'." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "문자열 안에 비표준 escape 문자를 사용하고 있습니다" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "인용부호 표기법을 사용하세요, 예, E'\\r\\n'." diff --git a/third_party/spanner_pg/src/backend/po/ru.po b/third_party/spanner_pg/src/backend/po/ru.po index 5070dec3..040010f7 100644 --- a/third_party/spanner_pg/src/backend/po/ru.po +++ b/third_party/spanner_pg/src/backend/po/ru.po @@ -4,14 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Maxim Yablokov , 2021, 2022. msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-11-03 09:09+0300\n" -"PO-Revision-Date: 2023-11-03 10:37+0300\n" +"POT-Creation-Date: 2024-02-02 18:11+0300\n" +"PO-Revision-Date: 2024-02-02 19:00+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,6 +21,50 @@ 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/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "эта сборка программы не поддерживает сжатие %s" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "вместо указания параметра сжатия получена пустая строка" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "нераспознанный параметр сжатия: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "для параметра сжатия \"%s\" требуется значение" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "значение параметра сжатия \"%s\" должно быть целочисленным" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "для алгоритма сжатия \"%s\" нельзя задать уровень сжатия" + +#: ../common/compression.c:342 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"для алгоритма сжатия \"%s\" ожидается уровень сжатия от %d до %d (по " +"умолчанию %d)" + +#: ../common/compression.c:353 +#, 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 @@ -28,68 +72,66 @@ msgstr "" msgid "not recorded" msgstr "не записано" -#: ../common/controldata_utils.c:78 ../common/controldata_utils.c:83 -#: commands/copyfrom.c:1522 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1525 commands/extension.c:3401 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: ../common/controldata_utils.c:96 ../common/controldata_utils.c:99 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1329 access/transam/xlog.c:3573 -#: access/transam/xlog.c:4817 access/transam/xlog.c:11629 -#: access/transam/xlog.c:11642 access/transam/xlog.c:12097 -#: access/transam/xlog.c:12177 access/transam/xlog.c:12214 -#: access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3492 libpq/hba.c:534 -#: replication/basebackup.c:2026 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 -#: replication/logical/snapbuild.c:1863 replication/logical/snapbuild.c:1905 -#: replication/logical/snapbuild.c:1932 replication/slot.c:1727 -#: replication/slot.c:1768 replication/walsender.c:545 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: access/transam/twophase.c:1349 access/transam/xlog.c:3209 +#: access/transam/xlog.c:4024 access/transam/xlogrecovery.c:1223 +#: access/transam/xlogrecovery.c:1315 access/transam/xlogrecovery.c:1352 +#: access/transam/xlogrecovery.c:1412 backup/basebackup.c:1844 +#: commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1939 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: storage/file/buffile.c:463 storage/file/copydir.c:195 +#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:816 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: ../common/controldata_utils.c:107 ../common/controldata_utils.c:111 -#: access/transam/xlog.c:3578 access/transam/xlog.c:4822 -#: replication/basebackup.c:2030 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1868 -#: replication/logical/snapbuild.c:1910 replication/logical/snapbuild.c:1937 -#: replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 -#: utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3214 access/transam/xlog.c:4029 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 +#: replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:820 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" -#: ../common/controldata_utils.c:122 ../common/controldata_utils.c:127 -#: ../common/controldata_utils.c:286 ../common/controldata_utils.c:289 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:271 ../common/controldata_utils.c:274 #: 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:1341 -#: access/transam/twophase.c:1746 access/transam/xlog.c:3442 -#: access/transam/xlog.c:3613 access/transam/xlog.c:3618 -#: access/transam/xlog.c:3946 access/transam/xlog.c:4787 -#: access/transam/xlog.c:5712 access/transam/xlogfuncs.c:728 -#: commands/copyfrom.c:1582 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:5009 -#: replication/logical/snapbuild.c:1772 replication/logical/snapbuild.c:1945 -#: replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 -#: utils/cache/relmapper.c:898 +#: access/transam/timeline.c:516 access/transam/twophase.c:1361 +#: access/transam/twophase.c:1773 access/transam/xlog.c:3056 +#: access/transam/xlog.c:3249 access/transam/xlog.c:3254 +#: access/transam/xlog.c:3392 access/transam/xlog.c:3994 +#: access/transam/xlog.c:4740 commands/copyfrom.c:1585 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:5016 +#: replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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:831 +#: utils/cache/relmapper.c:968 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалось закрыть файл \"%s\": %m" -#: ../common/controldata_utils.c:165 +#: ../common/controldata_utils.c:154 msgid "byte ordering mismatch" msgstr "несоответствие порядка байт" -#: ../common/controldata_utils.c:167 +#: ../common/controldata_utils.c:156 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -103,82 +145,85 @@ msgstr "" "этой программой. В этом случае результаты будут неверными и\n" "установленный PostgreSQL будет несовместим с этим каталогом данных." -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:233 +#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 #: ../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:1285 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3484 -#: access/transam/xlog.c:3528 access/transam/xlog.c:3726 -#: access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1616 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 -#: replication/logical/reorderbuffer.c:4931 -#: replication/logical/snapbuild.c:1727 replication/logical/snapbuild.c:1834 -#: replication/slot.c:1699 replication/walsender.c:518 -#: replication/walsender.c:2563 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 -#: storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 -#: utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: access/transam/timeline.c:348 access/transam/twophase.c:1305 +#: access/transam/xlog.c:2943 access/transam/xlog.c:3125 +#: access/transam/xlog.c:3164 access/transam/xlog.c:3359 +#: access/transam/xlog.c:4014 access/transam/xlogrecovery.c:4243 +#: access/transam/xlogrecovery.c:4346 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 utils/cache/relmapper.c:795 +#: utils/cache/relmapper.c:912 utils/error/elog.c:1933 +#: utils/init/miscinit.c:1374 utils/init/miscinit.c:1508 +#: utils/init/miscinit.c:1585 utils/misc/guc.c:8998 utils/misc/guc.c:9047 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: ../common/controldata_utils.c:251 ../common/controldata_utils.c:254 -#: access/transam/twophase.c:1719 access/transam/twophase.c:1728 -#: access/transam/xlog.c:11386 access/transam/xlog.c:11424 -#: access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5684 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:240 ../common/controldata_utils.c:243 +#: access/transam/twophase.c:1746 access/transam/twophase.c:1755 +#: access/transam/xlog.c:8676 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: utils/cache/relmapper.c:946 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" -#: ../common/controldata_utils.c:269 ../common/controldata_utils.c:275 +#: ../common/controldata_utils.c:257 ../common/controldata_utils.c:262 #: ../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:1740 -#: access/transam/xlog.c:3435 access/transam/xlog.c:3607 -#: access/transam/xlog.c:4780 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10910 replication/logical/snapbuild.c:1765 -#: replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 -#: storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 -#: storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: access/transam/timeline.c:510 access/transam/twophase.c:1767 +#: access/transam/xlog.c:3049 access/transam/xlog.c:3243 +#: access/transam/xlog.c:3987 access/transam/xlog.c:7979 +#: access/transam/xlog.c:8022 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1772 +#: replication/slot.c:1684 replication/slot.c:1789 storage/file/fd.c:737 +#: storage/file/fd.c:3741 storage/smgr/md.c:992 storage/smgr/md.c:1033 +#: storage/sync/sync.c:453 utils/cache/relmapper.c:961 utils/misc/guc.c:8767 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 -#: lib/dshash.c:245 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:2550 -#: postmaster/postmaster.c:4208 postmaster/postmaster.c:5609 -#: postmaster/postmaster.c:5973 -#: replication/libpqwalreceiver/libpqwalreceiver.c:287 -#: replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 -#: storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 -#: storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 -#: storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 -#: 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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 libpq/auth.c:1336 +#: libpq/auth.c:1404 libpq/auth.c:1962 libpq/be-secure-gssapi.c:520 +#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 +#: postmaster/postmaster.c:2594 postmaster/postmaster.c:4180 +#: postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2280 storage/ipc/procarray.c:2287 +#: storage/ipc/procarray.c:2792 storage/ipc/procarray.c:3423 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5049 -#: utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8745 #: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 -#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 utils/mmgr/generation.c:234 +#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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 @@ -187,6 +232,22 @@ msgstr "не удалось синхронизировать с ФС файл \" msgid "out of memory" msgstr "нехватка памяти" +#: ../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 +msgid "destination buffer too small" +msgstr "буфер назначения слишком мал" + +#: ../common/cryptohash_openssl.c:348 ../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" @@ -207,28 +268,28 @@ msgstr "не удалось прочитать исполняемый файл \ msgid "could not find a \"%s\" to execute" msgstr "не удалось найти запускаемый файл \"%s\"" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../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:299 access/transam/xlog.c:11260 -#: replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8325 backup/basebackup.c:1340 +#: utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 -#: storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 -#: storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, c-format 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 +#: ../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" @@ -240,112 +301,114 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" #: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1297 -#: access/transam/xlog.c:11362 access/transam/xlog.c:11400 -#: access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 -#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1532 -#: commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 -#: commands/tablespace.c:897 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1644 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 -#: storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 guc-file.l:1062 +#: ../common/file_utils.c:455 access/transam/twophase.c:1317 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:237 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1535 commands/copyto.c:725 commands/extension.c:3390 +#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:597 +#: replication/logical/snapbuild.c:1651 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 guc-file.l:1061 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:729 -#: commands/tablespace.c:739 postmaster/postmaster.c:1518 -#: storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 postmaster/postmaster.c:1579 +#: 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:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../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:383 access/transam/xlogarchive.c:412 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1784 -#: replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 -#: storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:426 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "внутренняя ошибка" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%s\"." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ожидалось \":\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ожидалась строка, но обнаружено \"%s\"." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "Ошибочный элемент текста \"%s\"." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -353,33 +416,38 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../common/jsonapi.c:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../common/jsonapi.c:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 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 должно следовать за старшим словом." -#: ../common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "важно: " - -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "ошибка: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "предупреждение: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "подробности: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "подсказка: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -395,7 +463,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:2553 +#: ../common/restricted_token.c:64 libpq/auth.c:1366 libpq/auth.c:2398 #, c-format msgid "could not load library \"%s\": error code %lu" msgstr "не удалось загрузить библиотеку \"%s\" (код ошибки: %lu)" @@ -430,13 +498,12 @@ msgstr "не удалось запустить процесс для коман 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:1187 -#: replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m" @@ -446,6 +513,18 @@ msgstr "не удалось получить информацию о файле msgid "could not remove file or directory \"%s\": %m" msgstr "ошибка при удалении файла или каталога \"%s\": %m" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "не удалось закодировать соль" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "не удалось закодировать сохранённый ключ" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "не удалось закодировать ключ сервера" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -469,7 +548,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../common/username.c:45 libpq/auth.c:2053 +#: ../common/username.c:45 libpq/auth.c:1898 msgid "user does not exist" msgstr "пользователь не существует" @@ -508,12 +587,12 @@ msgstr "дочерний процесс завершён по сигналу %d: 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 "" @@ -539,25 +618,25 @@ msgstr "не удалось получить связь для каталога 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 " @@ -566,7 +645,7 @@ msgstr "" "Возможно, работе СУБД мешает антивирус, программа резервного копирования или " "что-то подобное." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format msgid "could not get current working directory: %s\n" msgstr "не удалось определить текущий рабочий каталог: %s\n" @@ -576,6 +655,16 @@ msgstr "не удалось определить текущий рабочий 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 "найти локального пользователя по идентификатору (%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" @@ -602,47 +691,46 @@ msgstr "" "запрос на расчёт сводки диапазона BRIN для индекса \"%s\" страницы %u не был " "записан" -#: access/brin/brin.c:1036 access/brin/brin.c:1146 access/gin/ginfast.c:1042 -#: access/transam/xlog.c:11031 access/transam/xlog.c:11568 -#: 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:1036 access/brin/brin.c:1143 access/gin/ginfast.c:1042 +#: 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:1037 access/brin/brin.c:1147 +#: access/brin/brin.c:1037 access/brin/brin.c:1144 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Функции управления BRIN нельзя использовать в процессе восстановления." -#: access/brin/brin.c:1045 access/brin/brin.c:1155 +#: access/brin/brin.c:1042 access/brin/brin.c:1149 #, c-format -msgid "block number out of range: %s" -msgstr "номер блока вне диапазона: %s" +msgid "block number out of range: %lld" +msgstr "номер блока вне диапазона: %lld" -#: access/brin/brin.c:1089 access/brin/brin.c:1181 +#: access/brin/brin.c:1086 access/brin/brin.c:1175 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" - это не индекс BRIN" -#: access/brin/brin.c:1105 access/brin/brin.c:1197 +#: access/brin/brin.c:1102 access/brin/brin.c:1191 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "не удалось открыть родительскую таблицу индекса \"%s\"" -#: access/brin/brin.c:1114 access/brin/brin.c:1213 access/gin/ginfast.c:1087 -#: parser/parse_utilcmd.c:2284 +#: access/brin/brin.c:1111 access/brin/brin.c:1207 access/gin/ginfast.c:1087 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "index \"%s\" is not valid" msgstr "индекс \"%s\" - нерабочий" -#: access/brin/brin_bloom.c:751 access/brin/brin_bloom.c:793 +#: access/brin/brin_bloom.c:749 access/brin/brin_bloom.c:791 #: access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 -#: 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 +#: 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" @@ -650,8 +738,8 @@ msgstr "значение типа %s нельзя ввести" #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 #: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1461 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "" @@ -789,91 +877,91 @@ msgstr "Атрибут \"%s\" типа %s не существует в типе msgid "number of columns (%d) exceeds limit (%d)" msgstr "число столбцов (%d) превышает предел (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "число столбцов индекса (%d) превышает предел (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:965 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "строка индекса требует байт: %zu, при максимуме: %zu" #: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1906 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "неподдерживаемый код формата: %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: 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:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Допускаются только значения \"local\" и \"cascaded\"." -#: access/common/reloptions.c:682 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "превышен предел пользовательских типов реляционных параметров" -#: access/common/reloptions.c:1225 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "В RESET не должно передаваться значение параметров" -#: access/common/reloptions.c:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нераспознанное пространство имён параметров \"%s\"" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12546 +#: access/common/reloptions.c:1303 utils/misc/guc.c:13002 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы со свойством WITH OIDS не поддерживаются" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нераспознанный параметр \"%s\"" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр \"%s\" указан неоднократно" -#: access/common/reloptions.c:1592 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неверное значение для логического параметра \"%s\": %s" -#: access/common/reloptions.c:1604 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неверное значение для целочисленного параметра \"%s\": %s" -#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 +#: 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:1612 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Допускаются значения только от \"%d\" до \"%d\"." -#: access/common/reloptions.c:1624 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неверное значение для численного параметра \"%s\": %s" -#: access/common/reloptions.c:1632 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Допускаются значения только от \"%f\" до \"%f\"." -#: access/common/reloptions.c:1654 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неверное значение для параметра-перечисления \"%s\": %s" @@ -888,14 +976,8 @@ msgstr "метод сжатия lz4 не поддерживается" 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:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "столбец \"%s\" не может быть объявлен как SETOF" @@ -925,7 +1007,7 @@ msgstr "\"%s\" - это не индекс GIN" msgid "cannot access temporary indexes of other sessions" msgstr "обращаться к временным индексам других сеансов нельзя" -#: access/gin/ginget.c:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не удалось повторно найти кортеж в индексе \"%s\"" @@ -941,8 +1023,8 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Для исправления выполните REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3866 utils/adt/arrayfuncs.c:6535 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -972,12 +1054,12 @@ msgstr "" msgid "support function number %d is invalid for access method %s" msgstr "номер опорной функции %d не подходит для метода доступа %s" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "индекс \"%s\" содержит внутренний кортеж, отмеченный как ошибочный" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 #, c-format msgid "" "This is caused by an incomplete page split at crash recovery before " @@ -986,8 +1068,8 @@ msgstr "" "Это вызвано неполным разделением страницы при восстановлении после сбоя в " "PostgreSQL до версии 9.1." -#: 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/gist/gist.c:762 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 @@ -995,7 +1077,7 @@ msgstr "" msgid "Please REINDEX it." msgstr "Пожалуйста, выполните REINDEX для него." -#: access/gist/gist.c:1194 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "исправление неполного разделения в индексе \"%s\" (блок: %u)" @@ -1015,13 +1097,13 @@ msgstr "" "разработчиками или попробуйте указать этот столбец в команде CREATE INDEX " "вторым." -#: access/gist/gistutil.c:797 access/hash/hashutil.c:224 +#: 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:808 access/hash/hashutil.c:235 +#: 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" @@ -1046,41 +1128,41 @@ msgstr "" "определение ORDER BY для оператора %s" #: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "" "не удалось определить, какое правило сортировки использовать для хеширования " "строк" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1988 commands/tablecmds.c:16957 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:1004 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1955 commands/tablecmds.c:17513 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 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:2004 -#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1026 #, 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\" не хватает страниц переполнения" @@ -1116,33 +1198,33 @@ msgid "" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2288 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2759 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2805 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3188 access/heap/heapam.c:6032 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3312 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4676 access/heap/heapam.c:4714 +#: access/heap/heapam.c:4979 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" @@ -1168,13 +1250,13 @@ msgstr "не удалось записать в файл \"%s\" (записан #: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3351 access/transam/xlog.c:3542 -#: access/transam/xlog.c:4759 access/transam/xlog.c:11377 -#: access/transam/xlog.c:11415 access/transam/xlog.c:11820 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4633 -#: postmaster/postmaster.c:5671 replication/logical/origin.c:587 -#: replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1261 +#: access/transam/xlog.c:2965 access/transam/xlog.c:3178 +#: access/transam/xlog.c:3966 access/transam/xlog.c:8659 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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" @@ -1186,34 +1268,49 @@ msgstr "не удалось обрезать файл \"%s\" до нужного #: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3423 access/transam/xlog.c:3598 -#: access/transam/xlog.c:4771 postmaster/postmaster.c:4643 -#: postmaster/postmaster.c:4653 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1741 replication/slot.c:1586 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 -#: utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 -#: utils/misc/guc.c:10324 utils/misc/guc.c:10338 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: access/transam/xlog.c:3037 access/transam/xlog.c:3234 +#: access/transam/xlog.c:3978 commands/dbcommands.c:506 +#: postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 +#: replication/slot.c:1666 storage/file/buffile.c:537 +#: storage/file/copydir.c:207 utils/init/miscinit.c:1449 +#: utils/init/miscinit.c:1460 utils/init/miscinit.c:1468 utils/misc/guc.c:8728 +#: utils/misc/guc.c:8759 utils/misc/guc.c:10757 utils/misc/guc.c:10771 +#: 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:1249 access/transam/twophase.c:1679 -#: 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:4424 -#: replication/logical/snapbuild.c:1686 replication/logical/snapbuild.c:2102 -#: replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 -#: storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:436 +#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 +#: replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 +#: replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:773 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "агрессивная очистка \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "очистка \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "закончена очистка \"%s.%s.%s\": сканирований индекса: %d\n" + +#: access/heap/vacuumlazy.c:674 #, c-format msgid "" "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": " @@ -1222,7 +1319,7 @@ msgstr "" "автоматическая агрессивная очистка, предотвращающая зацикливание, таблицы " "\"%s.%s.%s\": сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:775 +#: access/heap/vacuumlazy.c:676 #, c-format msgid "" "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: " @@ -1231,45 +1328,73 @@ msgstr "" "автоматическая очистка, предотвращающая зацикливание, таблицы \"%s.%s.%s\": " "сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:780 +#: access/heap/vacuumlazy.c:681 #, 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:782 +#: access/heap/vacuumlazy.c:683 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "" "автоматическая очистка таблицы \"%s.%s.%s\": сканирований индекса: %d\n" -#: access/heap/vacuumlazy.c:789 +#: access/heap/vacuumlazy.c:690 #, 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 "" -"страниц удалено: %u, осталось: %u, пропущено закреплённых: %u, пропущено " -"замороженных: %u\n" +"страниц удалено: %u, осталось: %u, просканировано: %u (%.2f%% от общего " +"числа)\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:697 #, c-format msgid "" -"tuples: %lld removed, %lld remain, %lld are dead but not yet removable, " -"oldest xmin: %u\n" +"tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "" "версий строк: удалено: %lld, осталось: %lld, «мёртвых», но ещё не подлежащих " -"удалению: %lld, старейший xmin: %u\n" +"удалению: %lld\n" + +#: access/heap/vacuumlazy.c:703 +#, c-format +msgid "" +"tuples missed: %lld dead from %u pages not removed due to cleanup lock " +"contention\n" +msgstr "" +"из-за конфликта блокировки очистки пропущено версий строк: %lld, на " +"страницах: %u\n" + +#: access/heap/vacuumlazy.c:708 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "" +"XID отсечки удаления: %u, на момент завершения операции он имел возраст: %d " +"XID\n" + +#: access/heap/vacuumlazy.c:714 +#, c-format +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "" +"новое значение relfrozenxid: %u, оно продвинулось вперёд от предыдущего " +"значения на %d XID\n" + +#: access/heap/vacuumlazy.c:721 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "" +"новое значение relminmxid: %u, оно продвинулось вперёд от предыдущего " +"значения на %d MXID\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " msgstr "сканирование индекса не требуется: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "сканирование индекса требуется: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format msgid "" "%u pages from table (%.2f%% of total) had %lld dead item identifiers " @@ -1278,22 +1403,22 @@ msgstr "" "на страницах таблицы (%u, %.2f%% от общего числа) удалено мёртвых " "идентификаторов элементов: %lld\n" -#: access/heap/vacuumlazy.c:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "сканирование индекса пропущено: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "сканирование индекса пропущено из-за защиты: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, 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:834 +#: access/heap/vacuumlazy.c:755 #, c-format msgid "" "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u " @@ -1302,99 +1427,43 @@ msgstr "" "индекс \"%s\": всего страниц: %u, сейчас удалено: %u, удалено на данный " "момент: %u, свободно: %u\n" -#: access/heap/vacuumlazy.c:846 commands/analyze.c:814 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "время ввода/вывода: чтение: %.3f мс, запись: %.3f мс\n" -#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "" "средняя скорость чтения: %.3f МБ/с, средняя скорость записи: %.3f МБ/с\n" -#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "" "использование буфера: попаданий: %lld, промахов: %lld, «грязных» записей: " "%lld\n" -#: access/heap/vacuumlazy.c:857 +#: access/heap/vacuumlazy.c:785 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "" "использование WAL: записей: %lld, полных образов страниц: %lld, байт: %llu\n" -#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, 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:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "очистка \"%s.%s\"" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "" "таблица \"%s\": удалено мёртвых идентификаторов элементов: %lld, на " "страницах: %u" -#: access/heap/vacuumlazy.c:1656 -#, c-format -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "" -"в данный момент нельзя удалить \"мёртвых\" строк: %lld, старейший xmin: %u\n" - -#: 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] "Пропущено страниц, закреплённых в буфере: %u," -msgstr[1] "Пропущено страниц, закреплённых в буфере: %u," -msgstr[2] "Пропущено страниц, закреплённых в буфере: %u," - -#: access/heap/vacuumlazy.c:1662 -#, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "замороженных страниц: %u.\n" -msgstr[1] "замороженных страниц: %u.\n" -msgstr[2] "замороженных страниц: %u.\n" - -#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:4152 -#: commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s." - -#: 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 +#: access/heap/vacuumlazy.c:2629 #, c-format msgid "" "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " @@ -1403,12 +1472,12 @@ msgstr "" "несущественная операция обслуживания таблицы \"%s.%s.%s\" пропускается в " "качестве меры защиты после %d сканирований индекса" -#: access/heap/vacuumlazy.c:2622 +#: access/heap/vacuumlazy.c:2634 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "Значение relfrozenxid или relminmxid таблицы слишком далеко в прошлом." -#: access/heap/vacuumlazy.c:2623 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or " @@ -1421,77 +1490,23 @@ msgstr "" "Также можно рассмотреть другие способы обеспечения производительности " "VACUUM, соответствующей скорости выделения идентификаторов транзакций." -#: 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] "" -"запущен %d параллельный процесс очистки для уборки индекса (планировалось: " -"%d)" -msgstr[1] "" -"запущено %d параллельных процесса очистки для уборки индекса (планировалось: " -"%d)" -msgstr[2] "" -"запущено %d параллельных процессов очистки для уборки индекса " -"(планировалось: %d)" - -#: 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] "" -"запущен %d параллельный процесс очистки для очистки индекса (планировалось: " -"%d)" -msgstr[1] "" -"запущен %d параллельных процесса очистки для очистки индекса (планировалось: " -"%d)" -msgstr[2] "" -"запущено %d параллельных процессов очистки для очистки индекса " -"(планировалось: %d)" - -#: access/heap/vacuumlazy.c:3063 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "просканирован индекс \"%s\", удалено версий строк: %d" - -#: 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:3124 -#, 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.\n" -"%s." -msgstr "" -"Удалено версий строк индекса: %.0f.\n" -"Сейчас удалено страниц индекса: %u.\n" -"На данный момент удалено страниц индекса: %u, из них свободны для " -"использования: %u.\n" -"%s." - -#: access/heap/vacuumlazy.c:3233 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": остановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблица \"%s\": усечение (было страниц: %u, стало: %u)" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "" "таблица \"%s\": приостановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:3508 +#: access/heap/vacuumlazy.c:3170 #, c-format msgid "" "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " @@ -1500,47 +1515,47 @@ msgstr "" "отключение параллельного режима очистки \"%s\" --- создавать временные " "таблицы в параллельном режиме нельзя" -#: access/heap/vacuumlazy.c:4274 +#: access/heap/vacuumlazy.c:3383 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "при сканировании блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4277 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "при сканировании блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "при сканировании отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4289 +#: access/heap/vacuumlazy.c:3398 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "при очистке блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4292 +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "при очистке блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "при очистке отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "при очистке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "при уборке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:4312 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "при усечении отношения \"%s.%s\" до %u блок." @@ -1555,40 +1570,40 @@ msgstr "метод доступа \"%s\" имеет не тип %s" msgid "index access method \"%s\" does not have a handler" msgstr "для метода доступа индекса \"%s\" не задан обработчик" -#: access/index/genam.c:486 +#: 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:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16655 commands/tablecmds.c:18406 +#: access/index/indexam.c:203 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2783 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17199 commands/tablecmds.c:18984 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1010 #, c-format msgid "operator class %s has no options" msgstr "у класса операторов %s нет параметров" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторяющееся значение ключа нарушает ограничение уникальности \"%s\"" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Ключ \"%s\" уже существует." -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Возможно, это вызвано переменной природой индексного выражения." #: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2330 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "индекс \"%s\" не является b-деревом" @@ -1602,12 +1617,12 @@ msgstr "" "несовпадение версии в индексе \"%s\": версия файла: %d, версия кода: %d, " "минимальная поддерживаемая версия: %d" -#: access/nbtree/nbtpage.c:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "индекс \"%s\" содержит полумёртвую внутреннюю страницу" -#: 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 " @@ -1616,7 +1631,7 @@ msgstr "" "Причиной тому могло быть прерывание операции VACUUM в версии 9.3 или старее, " "до обновления. Этот индекс нужно перестроить (REINDEX)." -#: access/nbtree/nbtutils.c:2680 +#: access/nbtree/nbtutils.c:2684 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1624,12 +1639,12 @@ msgstr "" "размер строки индекса (%zu) больше предельного для btree версии %u размера " "(%zu) (индекс \"%s\")" -#: access/nbtree/nbtutils.c:2686 +#: access/nbtree/nbtutils.c:2690 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Строка индекса ссылается на кортеж (%u,%u) в отношении \"%s\"." -#: access/nbtree/nbtutils.c:2690 +#: access/nbtree/nbtutils.c:2694 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1650,7 +1665,7 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет опорной функции для " "типов %s и %s" -#: access/spgist/spgutils.c:244 +#: access/spgist/spgutils.c:242 #, c-format msgid "" "compress method must be defined when leaf type is different from input type" @@ -1658,7 +1673,7 @@ msgstr "" "метод сжатия должен быть определён, когда тип листьев отличается от входного " "типа" -#: access/spgist/spgutils.c:1017 +#: access/spgist/spgutils.c:1023 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "внутренний размер кортежа SP-GiST (%zu) превышает максимум (%zu)" @@ -1680,14 +1695,14 @@ msgstr "" "типа %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\" - это индекс" #: 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:13367 -#: commands/tablecmds.c:16664 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13888 +#: commands/tablecmds.c:17208 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" - это составной тип" @@ -1703,7 +1718,7 @@ msgid "%s cannot be empty." msgstr "Значение %s не может быть пустым." # well-spelled: симв -#: access/table/tableamapi.c:122 utils/misc/guc.c:12470 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12926 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "Длина %s превышает предел (%d симв.)." @@ -1723,24 +1738,24 @@ msgstr "Табличный метод доступа \"%s\" не существ msgid "sample percentage must be between 0 and 100" msgstr "процент выборки должен задаваться числом от 0 до 100" -#: access/transam/commit_ts.c:280 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не удалось получить метку времени фиксации транзакции %u" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "не удалось получить отметку времени фиксации" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:382 #, c-format msgid "" "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "" "Убедитесь, что в конфигурации ведущего сервера установлен параметр \"%s\"." -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Убедитесь, что в конфигурации установлен параметр \"%s\"." @@ -1960,62 +1975,128 @@ msgstr "не удалось отобразить динамический сег msgid "invalid magic number in dynamic shared memory segment" msgstr "неверное магическое число в динамическом сегменте разделяемой памяти" -#: access/transam/slru.c:713 +#: 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 "идентификатор пользовательского менеджера ресурсов %d вне диапазона" + +#: access/transam/rmgr.c:106 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Задайте идентификатор менеджера ресурсов от %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:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не существует, считается нулевым" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "не удалось получить состояние транзакции %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Не удалось открыть файл \"%s\": %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, 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:960 +#: access/transam/slru.c:961 #, 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:965 +#: access/transam/slru.c:966 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "" -"Не удалось прочитать файл \"%s\" (по смещению %u): прочитаны не все байты." +"Не удалось прочитать файл \"%s\" (по смещению %d): прочитаны не все байты." -#: access/transam/slru.c:972 +#: access/transam/slru.c:973 #, 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:977 +#: access/transam/slru.c:978 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "" -"Не удалось записать в файл \"%s\" (по смещению %u): записаны не все байты." +"Не удалось записать в файл \"%s\" (по смещению %d): записаны не все байты." -#: access/transam/slru.c:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Не удалось синхронизировать с ФС файл \"%s\": %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Не удалось закрыть файл \"%s\": %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не удалось очистить каталог \"%s\": видимо, произошло зацикливание" @@ -2061,59 +2142,59 @@ msgstr "" msgid "requested timeline %u is not in this server's history" msgstr "в истории сервера нет запрошенной линии времени %u" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "идентификатор транзакции \"%s\" слишком длинный" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "подготовленные транзакции отключены" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Установите ненулевое значение параметра max_prepared_transactions." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:413 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "идентификатор транзакции \"%s\" уже используется" -#: access/transam/twophase.c:417 access/transam/twophase.c:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, c-format msgid "maximum number of prepared transactions reached" msgstr "достигнут предел числа подготовленных транзакций" -#: access/transam/twophase.c:418 access/transam/twophase.c:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Увеличьте параметр max_prepared_transactions (текущее значение %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "подготовленная транзакция с идентификатором \"%s\" занята" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "нет доступа для завершения подготовленной транзакции" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:606 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "" "Это разрешено только суперпользователю и пользователю, подготовившему " "транзакцию." -#: access/transam/twophase.c:613 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "подготовленная транзакция относится к другой базе данных" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:618 #, c-format msgid "" "Connect to the database where the transaction was prepared to finish it." @@ -2122,17 +2203,17 @@ msgstr "" "подготовлена." # [SM]: TO REVIEW -#: access/transam/twophase.c:629 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "подготовленной транзакции с идентификатором \"%s\" нет" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1170 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "превышен предельный размер файла состояния 2PC" -#: access/transam/twophase.c:1305 +#: access/transam/twophase.c:1325 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -2140,61 +2221,62 @@ msgstr[0] "некорректный размер файла \"%s\": %lld Б" msgstr[1] "некорректный размер файла \"%s\": %lld Б" msgstr[2] "некорректный размер файла \"%s\": %lld Б" -#: access/transam/twophase.c:1314 +#: access/transam/twophase.c:1334 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "некорректное выравнивание смещения CRC для файла \"%s\"" -#: access/transam/twophase.c:1332 +#: access/transam/twophase.c:1352 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %lld)" -#: access/transam/twophase.c:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверная сигнатура" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверный размер" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "" "вычисленная контрольная сумма (CRC) не соответствует значению, сохранённому " "в файле \"%s\"" -#: access/transam/twophase.c:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не удалось разместить обработчик журнала транзакций." -#: access/transam/twophase.c:1417 +#: access/transam/twophase.c:1425 #, 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:1422 +#: access/transam/twophase.c:1430 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не удалось прочитать состояние 2PC из WAL в позиции %X/%X" -#: access/transam/twophase.c:1430 +#: access/transam/twophase.c:1438 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "ожидаемые данные состояния двухфазной фиксации отсутствуют в WAL в позиции " "%X/%X" -#: access/transam/twophase.c:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "пересоздать файл \"%s\" не удалось: %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, c-format msgid "" "%u two-phase state file was written for a long-running prepared transaction" @@ -2207,47 +2289,47 @@ msgstr[1] "" msgstr[2] "" "для длительных подготовленных транзакций записано файлов состояния 2PC: %u" -#: access/transam/twophase.c:2068 +#: access/transam/twophase.c:2095 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "восстановление подготовленной транзакции %u из разделяемой памяти" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2188 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "удаление устаревшего файла состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2166 +#: access/transam/twophase.c:2195 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "удаление из памяти устаревшего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2179 +#: access/transam/twophase.c:2208 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "удаление файла будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2186 +#: access/transam/twophase.c:2215 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "удаление из памяти будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2211 +#: access/transam/twophase.c:2240 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "испорчен файл состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2216 +#: access/transam/twophase.c:2245 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "испорчено состояние 2PC в памяти для транзакции %u" -#: access/transam/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "не удалось восстановить файл состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "" "Two-phase state file has been found in WAL record %X/%X, but this " @@ -2256,8 +2338,8 @@ msgstr "" "Для WAL-записи %X/%X найден файл состояния двухфазной фиксации, но эта " "транзакция уже была восстановлена с диска." -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 -#: utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "нет доступа к файлу \"%s\": %m" @@ -2304,124 +2386,124 @@ msgid "database with OID %u must be vacuumed within %u transactions" msgstr "" "база данных с OID %u должна быть очищена (предельное число транзакций: %u)" -#: access/transam/xact.c:1046 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одной транзакции не может быть больше 2^32-2 команд" -#: access/transam/xact.c:1584 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "превышен предел числа зафиксированных подтранзакций (%d)" -#: access/transam/xact.c:2435 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "" "нельзя выполнить PREPARE для транзакции, оперирующей с временными объектами" -#: access/transam/xact.c:2445 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "нельзя выполнить PREPARE для транзакции, снимки которой экспортированы" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3416 +#: access/transam/xact.c:3479 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s не может выполняться внутри блока транзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3426 +#: access/transam/xact.c:3489 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s не может выполняться внутри подтранзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s нельзя выполнять в конвейере" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, c-format msgid "%s cannot be executed from a function" msgstr "%s нельзя выполнять внутри функции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3517 access/transam/xact.c:3832 -#: access/transam/xact.c:3911 access/transam/xact.c:4034 -#: access/transam/xact.c:4185 access/transam/xact.c:4254 -#: access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 +#: access/transam/xact.c:3974 access/transam/xact.c:4097 +#: access/transam/xact.c:4248 access/transam/xact.c:4317 +#: access/transam/xact.c:4428 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s может выполняться только внутри блоков транзакций" -#: access/transam/xact.c:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "транзакция уже выполняется" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 -#: access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 +#: access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "нет незавершённой транзакции" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "фиксировать транзакции во время параллельных операций нельзя" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, c-format msgid "cannot abort during a parallel operation" msgstr "прерывание во время параллельных операций невозможно" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4212 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "определять точки сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4236 +#: access/transam/xact.c:4299 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "высвобождать точки сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4246 access/transam/xact.c:4297 -#: access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 +#: access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка сохранения \"%s\" не существует" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "" "точка сохранения \"%s\" на текущем уровне точек сохранения не существует" -#: access/transam/xact.c:4345 +#: access/transam/xact.c:4408 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "откатиться к точке сохранения во время параллельных операций нельзя" -#: access/transam/xact.c:4473 +#: access/transam/xact.c:4536 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "запускать подтранзакции во время параллельных операций нельзя" -#: access/transam/xact.c:4541 +#: access/transam/xact.c:4604 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "фиксировать подтранзакции во время параллельных операций нельзя" -#: access/transam/xact.c:5188 +#: access/transam/xact.c:5251 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одной транзакции не может быть больше 2^32-1 подтранзакций" -#: access/transam/xlog.c:1836 +#: access/transam/xlog.c:1465 #, c-format msgid "" "request to flush past end of generated WAL; request %X/%X, current position " @@ -2430,89 +2512,55 @@ msgstr "" "запрос на сброс данных за концом сгенерированного WAL; запрошена позиция %X/" "%X, текущая позиция %X/%X" -#: access/transam/xlog.c:2609 +#: access/transam/xlog.c:2226 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "не удалось записать в файл журнала %s (смещение: %u, длина: %zu): %m" -#: access/transam/xlog.c:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "" -"This is known to fail occasionally during archive recovery, where it is " -"harmless." -msgstr "" -"Это известная и безвредная ошибка, иногда возникающая при восстановлении " -"архива." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 -#: replication/walsender.c:2557 +#: access/transam/xlog.c:3473 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" -#: access/transam/xlog.c:4289 +#: access/transam/xlog.c:3758 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не удалось переименовать файл \"%s\": %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3800 access/transam/xlog.c:3810 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "требуемый каталог WAL \"%s\" не существует" -#: access/transam/xlog.c:4347 +#: access/transam/xlog.c:3816 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "создаётся отсутствующий каталог WAL \"%s\"" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3819 commands/dbcommands.c:3115 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не удалось создать отсутствующий каталог \"%s\": %m" -#: access/transam/xlog.c:4472 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "неожиданный ID линии времени %u в сегменте журнала %s, смещение %u" - -#: access/transam/xlog.c:4610 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "" -"новая линия времени %u не является ответвлением линии времени системы БД %u" - -#: access/transam/xlog.c:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "новая целевая линия времени %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3886 #, c-format msgid "could not generate secret authorization token" msgstr "не удалось сгенерировать случайное число для аутентификации" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 -#: access/transam/xlog.c:4871 access/transam/xlog.c:4878 -#: access/transam/xlog.c:4885 access/transam/xlog.c:4890 -#: access/transam/xlog.c:4897 access/transam/xlog.c:4904 -#: access/transam/xlog.c:4911 access/transam/xlog.c:4918 -#: access/transam/xlog.c:4925 access/transam/xlog.c:4932 -#: access/transam/xlog.c:4941 access/transam/xlog.c:4948 -#: utils/init/miscinit.c:1583 +#: access/transam/xlog.c:4045 access/transam/xlog.c:4054 +#: access/transam/xlog.c:4078 access/transam/xlog.c:4085 +#: access/transam/xlog.c:4092 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 +#: access/transam/xlog.c:4118 access/transam/xlog.c:4125 +#: access/transam/xlog.c:4132 access/transam/xlog.c:4139 +#: access/transam/xlog.c:4148 access/transam/xlog.c:4155 +#: utils/init/miscinit.c:1606 #, c-format msgid "database files are incompatible with server" msgstr "файлы базы данных несовместимы с сервером" -#: access/transam/xlog.c:4839 +#: access/transam/xlog.c:4046 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2521,7 +2569,7 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d (0x%08x), но " "сервер скомпилирован с PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4843 +#: access/transam/xlog.c:4050 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2530,7 +2578,7 @@ msgstr "" "Возможно, проблема вызвана разным порядком байт. Кажется, вам надо выполнить " "initdb." -#: access/transam/xlog.c:4848 +#: access/transam/xlog.c:4055 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2539,18 +2587,18 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d, но сервер " "скомпилирован с PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4851 access/transam/xlog.c:4875 -#: access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: access/transam/xlog.c:4058 access/transam/xlog.c:4082 +#: access/transam/xlog.c:4089 access/transam/xlog.c:4094 #, c-format msgid "It looks like you need to initdb." msgstr "Кажется, вам надо выполнить initdb." -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4069 #, c-format msgid "incorrect checksum in control file" msgstr "ошибка контрольной суммы в файле pg_control" -#: access/transam/xlog.c:4872 +#: access/transam/xlog.c:4079 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2559,7 +2607,7 @@ msgstr "" "Кластер баз данных был инициализирован с CATALOG_VERSION_NO %d, но сервер " "скомпилирован с CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4879 +#: access/transam/xlog.c:4086 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2568,7 +2616,7 @@ msgstr "" "Кластер баз данных был инициализирован с MAXALIGN %d, но сервер " "скомпилирован с MAXALIGN %d." -#: access/transam/xlog.c:4886 +#: access/transam/xlog.c:4093 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2577,7 +2625,7 @@ msgstr "" "Кажется, в кластере баз данных и в программе сервера используются разные " "форматы чисел с плавающей точкой." -#: access/transam/xlog.c:4891 +#: access/transam/xlog.c:4098 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2586,16 +2634,16 @@ msgstr "" "Кластер баз данных был инициализирован с BLCKSZ %d, но сервер скомпилирован " "с BLCKSZ %d." -#: 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:4929 -#: access/transam/xlog.c:4936 access/transam/xlog.c:4944 -#: access/transam/xlog.c:4951 +#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 +#: access/transam/xlog.c:4115 access/transam/xlog.c:4122 +#: access/transam/xlog.c:4129 access/transam/xlog.c:4136 +#: access/transam/xlog.c:4143 access/transam/xlog.c:4151 +#: access/transam/xlog.c:4158 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Кажется, вам надо перекомпилировать сервер или выполнить initdb." -#: access/transam/xlog.c:4898 +#: access/transam/xlog.c:4105 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2604,7 +2652,7 @@ msgstr "" "Кластер баз данных был инициализирован с RELSEG_SIZE %d, но сервер " "скомпилирован с RELSEG_SIZE %d." -#: access/transam/xlog.c:4905 +#: access/transam/xlog.c:4112 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2613,7 +2661,7 @@ msgstr "" "Кластер баз данных был инициализирован с XLOG_BLCKSZ %d, но сервер " "скомпилирован с XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4912 +#: access/transam/xlog.c:4119 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2622,7 +2670,7 @@ msgstr "" "Кластер баз данных был инициализирован с NAMEDATALEN %d, но сервер " "скомпилирован с NAMEDATALEN %d." -#: access/transam/xlog.c:4919 +#: access/transam/xlog.c:4126 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2631,7 +2679,7 @@ msgstr "" "Кластер баз данных был инициализирован с INDEX_MAX_KEYS %d, но сервер " "скомпилирован с INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4926 +#: access/transam/xlog.c:4133 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2640,7 +2688,7 @@ msgstr "" "Кластер баз данных был инициализирован с TOAST_MAX_CHUNK_SIZE %d, но сервер " "скомпилирован с TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4933 +#: access/transam/xlog.c:4140 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2649,7 +2697,7 @@ msgstr "" "Кластер баз данных был инициализирован с LOBLKSIZE %d, но сервер " "скомпилирован с LOBLKSIZE %d." -#: access/transam/xlog.c:4942 +#: access/transam/xlog.c:4149 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2658,7 +2706,7 @@ msgstr "" "Кластер баз данных был инициализирован без USE_FLOAT8_BYVAL, но сервер " "скомпилирован с USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4949 +#: access/transam/xlog.c:4156 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -2667,7 +2715,7 @@ msgstr "" "Кластер баз данных был инициализирован с USE_FLOAT8_BYVAL, но сервер был " "скомпилирован без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4958 +#: access/transam/xlog.c:4165 #, c-format msgid "" "WAL segment size must be a power of two between 1 MB and 1 GB, but the " @@ -2685,1526 +2733,1738 @@ msgstr[2] "" "размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 " "ГБ, но в управляющем файле указано значение: %d" -#: access/transam/xlog.c:4970 +#: access/transam/xlog.c:4177 #, 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:4974 +#: access/transam/xlog.c:4181 #, 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:5408 +#: access/transam/xlog.c:4622 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не удалось записать начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5416 +#: access/transam/xlog.c:4630 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не удалось сбросить на диск начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5422 +#: access/transam/xlog.c:4636 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не удалось закрыть начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5483 -#, c-format -msgid "using recovery command file \"%s\" is not supported" -msgstr "" -"использование файла с конфигурацией восстановления \"%s\" не поддерживается" - -#: access/transam/xlog.c:5548 +#: access/transam/xlog.c:4854 #, c-format -msgid "standby mode is not supported by single-user servers" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "" -"режим резервного сервера не поддерживается однопользовательским сервером" +"WAL был создан с параметром wal_level=minimal, продолжение восстановления " +"невозможно" -#: access/transam/xlog.c:5565 +#: access/transam/xlog.c:4855 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "не указано ни primary_conninfo, ни restore_command" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Это происходит, если вы на время устанавливали wal_level=minimal." -#: access/transam/xlog.c:5566 +#: access/transam/xlog.c:4856 #, c-format -msgid "" -"The database server will regularly poll the pg_wal subdirectory to check for " -"files placed there." +msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "" -"Сервер БД будет регулярно опрашивать подкаталог pg_wal и проверять " -"содержащиеся в нём файлы." +"Используйте резервную копию, сделанную после переключения wal_level на любой " +"уровень выше minimal." -#: access/transam/xlog.c:5574 +#: access/transam/xlog.c:4920 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "" -"необходимо задать restore_command, если не выбран режим резервного сервера" +msgid "control file contains invalid checkpoint location" +msgstr "файл pg_control содержит неправильную позицию контрольной точки" -#: access/transam/xlog.c:5612 +#: access/transam/xlog.c:4931 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "целевая линия времени для восстановления %u не существует" +msgid "database system was shut down at %s" +msgstr "система БД была выключена: %s" -#: access/transam/xlog.c:5734 +#: access/transam/xlog.c:4937 #, c-format -msgid "archive recovery complete" -msgstr "восстановление архива завершено" +msgid "database system was shut down in recovery at %s" +msgstr "система БД была выключена в процессе восстановления: %s" -#: access/transam/xlog.c:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4943 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "" -"восстановление останавливается после достижения согласованного состояния" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "выключение системы БД было прервано; последний момент работы: %s" -#: access/transam/xlog.c:5821 +#: access/transam/xlog.c:4949 #, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "восстановление останавливается перед позицией в WAL (LSN) \"%X/%X\"" +msgid "database system was interrupted while in recovery at %s" +msgstr "работа системы БД была прервана во время восстановления: %s" -#: access/transam/xlog.c:5911 +#: access/transam/xlog.c:4951 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" +msgid "" +"This probably means that some data is corrupted and you will have to use the " +"last backup for recovery." msgstr "" -"восстановление останавливается перед фиксированием транзакции %u, время %s" +"Это скорее всего означает, что некоторые данные повреждены и вам придётся " +"восстановить БД из последней резервной копии." -#: access/transam/xlog.c:5918 +#: access/transam/xlog.c:4957 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" +msgid "database system was interrupted while in recovery at log time %s" msgstr "" -"восстановление останавливается перед прерыванием транзакции %u, время %s" +"работа системы БД была прервана в процессе восстановления, время в журнале: " +"%s" -#: access/transam/xlog.c:5971 +#: access/transam/xlog.c:4959 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "восстановление останавливается в точке восстановления \"%s\", время %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 "" +"Если это происходит постоянно, возможно, какие-то данные были испорчены и " +"для восстановления стоит выбрать более раннюю точку." -#: access/transam/xlog.c:5989 +#: access/transam/xlog.c:4965 #, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "восстановление останавливается после позиции в WAL (LSN) \"%X/%X\"" +msgid "database system was interrupted; last known up at %s" +msgstr "работа системы БД была прервана; последний момент работы: %s" -#: access/transam/xlog.c:6056 +#: access/transam/xlog.c:4971 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "" -"восстановление останавливается после фиксирования транзакции %u, время %s" +msgid "control file contains invalid database cluster state" +msgstr "файл pg_control содержит неверный код состояния кластера" -#: access/transam/xlog.c:6064 +#: access/transam/xlog.c:5355 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" +msgid "WAL ends before end of online backup" +msgstr "WAL закончился без признака окончания копирования" + +#: access/transam/xlog.c:5356 +#, c-format +msgid "" +"All WAL generated while online backup was taken must be available at " +"recovery." msgstr "" -"восстановление останавливается после прерывания транзакции %u, время %s" +"Все журналы WAL, созданные во время резервного копирования \"на ходу\", " +"должны быть в наличии для восстановления." -#: access/transam/xlog.c:6109 +#: access/transam/xlog.c:5359 #, c-format -msgid "pausing at the end of recovery" -msgstr "остановка в конце восстановления" +msgid "WAL ends before consistent recovery point" +msgstr "WAL закончился до согласованной точки восстановления" -#: access/transam/xlog.c:6110 +#: access/transam/xlog.c:5407 #, 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:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5440 #, c-format -msgid "recovery has paused" -msgstr "восстановление приостановлено" +msgid "archive recovery complete" +msgstr "восстановление архива завершено" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6046 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Выполните pg_wal_replay_resume() для продолжения." +msgid "shutting down" +msgstr "выключение" -#: access/transam/xlog.c:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6085 #, c-format -msgid "hot standby is not possible because of insufficient parameter settings" -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:6387 access/transam/xlog.c:6414 -#: access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6097 +#, c-format +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "начата контрольная точка:%s%s%s%s%s%s%s%s" + +# well-spelled: синхр +#: access/transam/xlog.c:6157 #, c-format msgid "" -"%s = %d is a lower setting than on the primary server, where its value was " -"%d." +"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 "" -"Параметр %s = %d меньше, чем на ведущем сервере, где его значение было %d." +"точка перезапуска завершена: записано буферов: %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:6396 +# well-spelled: синхр +#: access/transam/xlog.c:6177 #, c-format -msgid "If recovery is unpaused, the server will shut down." -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%%); добавлено файлов " +"WAL %d, удалено: %d, переработано: %d; запись=%ld.%03d сек., синхр.=%ld.%03d " +"сек., всего=%ld.%03d сек.; синхронизировано_файлов=%d, самая_долгая_синхр." +"=%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB" -#: access/transam/xlog.c:6397 +#: access/transam/xlog.c:6612 #, c-format msgid "" -"You can then restart the server after making the necessary configuration " -"changes." +"concurrent write-ahead log activity while database system is shutting down" msgstr "" -"Затем вы можете перезапустить сервер после внесения необходимых изменений " -"конфигурации." +"во время выключения системы баз данных отмечена активность в журнале " +"предзаписи" -#: access/transam/xlog.c:6408 +#: access/transam/xlog.c:7169 #, c-format -msgid "promotion is not possible because of insufficient parameter settings" -msgstr "повышение невозможно из-за отсутствия достаточных значений параметров" +msgid "recovery restart point at %X/%X" +msgstr "точка перезапуска восстановления в позиции %X/%X" -#: access/transam/xlog.c:6418 +#: access/transam/xlog.c:7171 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "" -"Перезапустите сервер после внесения необходимых изменений конфигурации." +msgid "Last completed transaction was at log time %s." +msgstr "Последняя завершённая транзакция была выполнена в %s." -#: access/transam/xlog.c:6442 +#: access/transam/xlog.c:7418 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "" -"восстановление прервано из-за отсутствия достаточных значений параметров" +msgid "restore point \"%s\" created at %X/%X" +msgstr "точка восстановления \"%s\" создана в позиции %X/%X" -#: access/transam/xlog.c:6448 +#: access/transam/xlog.c:7625 #, c-format -msgid "" -"You can restart the server after making the necessary configuration changes." +msgid "online backup was canceled, recovery cannot continue" msgstr "" -"Вы можете перезапустить сервер после внесения необходимых изменений " -"конфигурации." +"резервное копирование \"на ходу\" было отменено, продолжить восстановление " +"нельзя" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7682 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "" -"WAL был создан с параметром wal_level=minimal, продолжение восстановления " -"невозможно" +"неожиданный ID линии времени %u (должен быть %u) в записи точки выключения" -#: access/transam/xlog.c:6471 +#: access/transam/xlog.c:7740 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Это происходит, если вы на время устанавливали wal_level=minimal." +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "" +"неожиданный ID линии времени %u (должен быть %u) в записи точки активности" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:7769 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "" -"Используйте резервную копию, сделанную после переключения wal_level на любой " -"уровень выше minimal." +"неожиданный ID линии времени %u (должен быть %u) в записи конец-" +"восстановления" -#: access/transam/xlog.c:6541 +#: access/transam/xlog.c:8027 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "файл pg_control содержит неправильную позицию контрольной точки" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" -#: access/transam/xlog.c:6552 +#: access/transam/xlog.c:8033 #, c-format -msgid "database system was shut down at %s" -msgstr "система БД была выключена: %s" +msgid "could not fdatasync file \"%s\": %m" +msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:6558 +#: access/transam/xlog.c:8128 access/transam/xlog.c:8495 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "система БД была выключена в процессе восстановления: %s" +msgid "WAL level not sufficient for making an online backup" +msgstr "" +"Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" -#: access/transam/xlog.c:6564 +#: access/transam/xlog.c:8129 access/transam/xlog.c:8496 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "выключение системы БД было прервано; последний момент работы: %s" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "Установите wal_level \"replica\" или \"logical\" при запуске сервера." -#: access/transam/xlog.c:6570 +#: access/transam/xlog.c:8134 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "работа системы БД была прервана во время восстановления: %s" +msgid "backup label too long (max %d bytes)" +msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:6572 +#: access/transam/xlog.c:8250 #, 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:6578 -#, c-format -msgid "database system was interrupted while in recovery at log time %s" +"WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "" -"работа системы БД была прервана в процессе восстановления, время в журнале: " -"%s" +"После последней точки перезапуска был воспроизведён WAL, созданный в режиме " +"full_page_writes=off." -#: access/transam/xlog.c:6580 +#: access/transam/xlog.c:8252 access/transam/xlog.c:8608 #, 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." +"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:6586 +#: access/transam/xlog.c:8332 backup/basebackup.c:1345 utils/adt/misc.c:347 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "работа системы БД была прервана; последний момент работы: %s" +msgid "symbolic link \"%s\" target is too long" +msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: access/transam/xlog.c:6592 +#: access/transam/xlog.c:8382 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "файл pg_control содержит неверный код состояния кластера" +msgid "tablespaces are not supported on this platform" +msgstr "табличные пространства не поддерживаются на этой платформе" -#: access/transam/xlog.c:6649 +#: access/transam/xlog.c:8541 access/transam/xlog.c:8554 +#: access/transam/xlogrecovery.c:1237 access/transam/xlogrecovery.c:1244 +#: access/transam/xlogrecovery.c:1303 access/transam/xlogrecovery.c:1383 +#: access/transam/xlogrecovery.c:1407 #, c-format -msgid "entering standby mode" -msgstr "переход в режим резервного сервера" +msgid "invalid data in file \"%s\"" +msgstr "неверные данные в файле \"%s\"" -#: access/transam/xlog.c:6652 +#: access/transam/xlog.c:8558 backup/basebackup.c:1200 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "начинается восстановление точки во времени до XID %u" +msgid "the standby was promoted during online backup" +msgstr "" +"дежурный сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:6656 +#: access/transam/xlog.c:8559 backup/basebackup.c:1201 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "начинается восстановление точки во времени до %s" +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:6660 +#: access/transam/xlog.c:8606 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "начинается восстановление точки во времени до \"%s\"" +msgid "" +"WAL generated with full_page_writes=off was replayed during online backup" +msgstr "" +"В процессе резервного копирования \"на ходу\" был воспроизведён WAL, " +"созданный в режиме full_page_writes=off" -#: access/transam/xlog.c:6664 +#: access/transam/xlog.c:8731 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" -"начинается восстановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" +"базовое копирование выполнено, ожидается архивация нужных сегментов WAL" -#: access/transam/xlog.c:6668 +#: access/transam/xlog.c:8745 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" +msgid "" +"still waiting for all required WAL segments to be archived (%d seconds " +"elapsed)" msgstr "" -"начинается восстановление точки во времени до первой точки согласованности" +"продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" -#: access/transam/xlog.c:6671 +#: access/transam/xlog.c:8747 #, c-format -msgid "starting archive recovery" -msgstr "начинается восстановление архива" +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:6745 +#: access/transam/xlog.c:8754 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "не удалось найти положение REDO, указанное записью контрольной точки" +msgid "all required WAL segments have been archived" +msgstr "все нужные сегменты WAL заархивированы" -#: access/transam/xlog.c:6746 access/transam/xlog.c:6756 +#: access/transam/xlog.c:8758 #, 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." +"WAL archiving is not enabled; you must ensure that all required WAL segments " +"are copied through other means to complete the backup" msgstr "" -"Если вы восстанавливаете резервную копию, создайте \"%s/recovery.signal\" и " -"задайте обязательные параметры восстановления.\n" -"В других случаях попытайтесь удалить файл \"%s/backup_label\".\n" -"Будьте осторожны: при восстановлении резервной копии удаление \"%s/" -"backup_label\" приведёт к повреждению кластера." - -#: access/transam/xlog.c:6755 -#, c-format -msgid "could not locate required checkpoint record" -msgstr "не удалось считать нужную запись контрольной точки" +"архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " +"сегментов WAL другими средствами для получения резервной копии" -#: access/transam/xlog.c:6784 commands/tablespace.c:665 +#: access/transam/xlog.c:8807 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "не удалось создать символическую ссылку \"%s\": %m" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "" +"прерывание резервного копирования из-за завершения обслуживающего процесса " +"до вызова pg_backup_stop" -#: access/transam/xlog.c:6816 access/transam/xlog.c:6822 +#: access/transam/xlogarchive.c:215 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "файл \"%s\" игнорируется ввиду отсутствия файла \"%s\"" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "файл архива \"%s\" имеет неправильный размер: %lld вместо %lld" -#: access/transam/xlog.c:6818 access/transam/xlog.c:12353 +#: access/transam/xlogarchive.c:224 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "Файл \"%s\" был переименован в \"%s\"." +msgid "restored log file \"%s\" from archive" +msgstr "файл журнала \"%s\" восстановлен из архива" -#: access/transam/xlog.c:6824 +#: access/transam/xlogarchive.c:238 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "Не удалось переименовать файл \"%s\" в \"%s\" (%m)." +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "" +"Команда restore_command возвратила нулевой код состояния, но stat() выдала " +"ошибку." -#: access/transam/xlog.c:6875 +#: access/transam/xlogarchive.c:270 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "не удалось считать правильную запись контрольной точки" +msgid "could not restore file \"%s\" from archive: %s" +msgstr "восстановить файл \"%s\" из архива не удалось: %s" -#: access/transam/xlog.c:6913 +#. 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:383 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "в истории сервера нет ответвления запрошенной линии времени %u" +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" -#: access/transam/xlog.c:6915 +#: access/transam/xlogarchive.c:493 access/transam/xlogarchive.c:573 #, 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." +msgid "could not create archive status file \"%s\": %m" +msgstr "не удалось создать файл состояния архива \"%s\": %m" -#: access/transam/xlog.c:6929 +#: access/transam/xlogarchive.c:501 access/transam/xlogarchive.c:581 #, c-format -msgid "" -"requested timeline %u does not contain minimum recovery point %X/%X on " -"timeline %u" -msgstr "" -"запрошенная линия времени %u не содержит минимальную точку восстановления %X/" -"%X на линии времени %u" +msgid "could not write archive status file \"%s\": %m" +msgstr "не удалось записать файл состояния архива \"%s\": %m" -#: access/transam/xlog.c:6959 +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 #, c-format -msgid "invalid next transaction ID" -msgstr "неверный ID следующей транзакции" +msgid "a backup is already in progress in this session" +msgstr "резервное копирование уже выполняется в этом сеансе" -#: access/transam/xlog.c:7059 +#: access/transam/xlogfuncs.c:126 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "неверная запись REDO в контрольной точке" +msgid "backup is not in progress" +msgstr "резервное копирование не выполняется" -#: access/transam/xlog.c:7070 +#: access/transam/xlogfuncs.c:127 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "неверная запись REDO в контрольной точке выключения" +msgid "Did you call pg_backup_start()?" +msgstr "Вы вызывали pg_backup_start()?" -#: access/transam/xlog.c:7110 +#: 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 "" -"database system was not properly shut down; automatic recovery in progress" -msgstr "" -"система БД была остановлена нештатно; производится автоматическое " -"восстановление" +msgid "WAL control functions cannot be executed during recovery." +msgstr "Функции управления WAL нельзя использовать в процессе восстановления." -#: access/transam/xlog.c:7114 +#: access/transam/xlogfuncs.c:198 #, c-format -msgid "crash recovery starts in timeline %u and has target timeline %u" -msgstr "" -"восстановление после сбоя начинается на линии времени %u, целевая линия " -"времени: %u" +msgid "WAL level not sufficient for creating a restore point" +msgstr "Выбранный уровень WAL не достаточен для создания точки восстановления" -#: access/transam/xlog.c:7161 +# well-spelled: симв +#: access/transam/xlogfuncs.c:206 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "backup_label содержит данные, не согласованные с файлом pg_control" +msgid "value too long for restore point (maximum %d characters)" +msgstr "значение для точки восстановления превышает предел (%d симв.)" -#: access/transam/xlog.c:7162 +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 #, c-format -msgid "" -"This means that the backup is corrupted and you will have to use another " -"backup for recovery." -msgstr "" -"Это означает, что резервная копия повреждена и для восстановления БД " -"придётся использовать другую копию." +msgid "%s cannot be executed during recovery." +msgstr "выполнить %s во время восстановления нельзя." -#: access/transam/xlog.c:7388 +#: 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 "redo starts at %X/%X" -msgstr "запись REDO начинается со смещения %X/%X" +msgid "recovery is not in progress" +msgstr "восстановление не выполняется" -#: access/transam/xlog.c:7613 +#: 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 "requested recovery stop point is before consistent recovery point" +msgid "Recovery control functions can only be executed during recovery." msgstr "" -"запрошенная точка остановки восстановления предшествует согласованной точке " -"восстановления" +"Функции управления восстановлением можно использовать только в процессе " +"восстановления." -#: access/transam/xlog.c:7651 +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 #, c-format -msgid "redo done at %X/%X system usage: %s" -msgstr "записи REDO обработаны до смещения %X/%X, нагрузка системы: %s" +msgid "standby promotion is ongoing" +msgstr "производится повышение ведомого" -#: access/transam/xlog.c:7657 +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "последняя завершённая транзакция была выполнена в %s" +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s нельзя выполнять, когда производится повышение." -#: access/transam/xlog.c:7666 +#: access/transam/xlogfuncs.c:587 #, c-format -msgid "redo is not required" -msgstr "данные REDO не требуются" +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "значение \"wait_seconds\" не должно быть отрицательным или нулевым" -#: access/transam/xlog.c:7678 +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:257 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "восстановление окончилось до достижения заданной цели восстановления" +msgid "failed to send signal to postmaster: %m" +msgstr "отправить сигнал процессу postmaster не удалось: %m" -#: access/transam/xlog.c:7762 access/transam/xlog.c:7766 +#: access/transam/xlogfuncs.c:643 #, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL закончился без признака окончания копирования" +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/xlog.c:7763 +#: access/transam/xlogprefetcher.c:1090 #, c-format msgid "" -"All WAL generated while online backup was taken must be available at " -"recovery." +"recovery_prefetch is not supported on platforms that lack posix_fadvise()." msgstr "" -"Все журналы WAL, созданные во время резервного копирования \"на ходу\", " -"должны быть в наличии для восстановления." +"recovery_prefetch не поддерживается на платформах, где отсутствует " +"posix_fadvise()." -#: access/transam/xlog.c:7767 +#: access/transam/xlogreader.c:620 #, 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 "invalid record offset at %X/%X" +msgstr "неверное смещение записи в позиции %X/%X" -#: access/transam/xlog.c:7770 +#: access/transam/xlogreader.c:628 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL закончился до согласованной точки восстановления" +msgid "contrecord is requested by %X/%X" +msgstr "в позиции %X/%X запрошено продолжение записи" -#: access/transam/xlog.c:7805 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format -msgid "selected new timeline ID: %u" -msgstr "выбранный ID новой линии времени: %u" +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "неверная длина записи в позиции %X/%X: ожидалось %u, получено %u" -#: access/transam/xlog.c:8249 +#: access/transam/xlogreader.c:758 #, c-format -msgid "unexpected directory entry \"%s\" found in %s" -msgstr "в %2$s обнаружен недопустимый элемент-каталог \"%1$s\"" +msgid "there is no contrecord flag at %X/%X" +msgstr "нет флага contrecord в позиции %X/%X" -#: access/transam/xlog.c:8251 +#: access/transam/xlogreader.c:771 #, c-format -msgid "All directory entries in pg_tblspc/ should be symbolic links." -msgstr "" -"Все элементы-каталоги в pg_tblspc/ должны быть символическими ссылками." +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: access/transam/xlog.c:8252 +#: access/transam/xlogreader.c:1142 #, c-format -msgid "" -"Remove those directories, or set allow_in_place_tablespaces to ON " -"transiently to let recovery complete." -msgstr "" -"Удалите эти каталоги или на время установите в allow_in_place_tablespaces " -"значение ON, чтобы восстановление завершилось." +msgid "invalid resource manager ID %u at %X/%X" +msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: access/transam/xlog.c:8336 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "согласованное состояние восстановления достигнуто в позиции %X/%X" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: access/transam/xlog.c:8545 +#: access/transam/xlogreader.c:1209 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "неверная ссылка на первичную контрольную точку в файле pg_control" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "" +"некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " +"%X/%X" -#: access/transam/xlog.c:8549 +#: access/transam/xlogreader.c:1246 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "неверная ссылка на контрольную точку в файле backup_label" +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u" -#: access/transam/xlog.c:8567 +#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1301 #, c-format -msgid "invalid primary checkpoint record" -msgstr "неверная запись первичной контрольной точки" +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u" -#: access/transam/xlog.c:8571 +#: access/transam/xlogreader.c:1275 #, c-format -msgid "invalid checkpoint record" -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 принадлежит другой СУБД: в нём указан идентификатор системы БД " +"%llu, а идентификатор системы pg_control: %llu" -#: access/transam/xlog.c:8582 +#: access/transam/xlogreader.c:1283 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "неверный ID менеджера ресурсов в записи первичной контрольной точки" +msgid "" +"WAL file is from different database system: incorrect segment size in page " +"header" +msgstr "" +"файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " +"страницы" -#: access/transam/xlog.c:8586 +#: access/transam/xlogreader.c:1289 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "неверный ID менеджера ресурсов в записи контрольной точки" +msgid "" +"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " +"header" +msgstr "" +"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " +"страницы" -#: access/transam/xlog.c:8599 +#: access/transam/xlogreader.c:1320 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "неверные флаги xl_info в записи первичной контрольной точки" +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u" -#: access/transam/xlog.c:8603 +#: access/transam/xlogreader.c:1345 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "неверные флаги xl_info в записи контрольной точки" +msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgstr "" +"нарушение последовательности ID линии времени %u (после %u) в сегменте " +"журнала %s, смещение %u" -#: access/transam/xlog.c:8614 +#: access/transam/xlogreader.c:1750 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "неверная длина записи первичной контрольной точки" +msgid "out-of-order block_id %u at %X/%X" +msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: access/transam/xlog.c:8618 +#: access/transam/xlogreader.c:1774 #, c-format -msgid "invalid length of checkpoint record" -msgstr "неверная длина записи контрольной точки" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: access/transam/xlog.c:8799 +#: access/transam/xlogreader.c:1781 #, c-format -msgid "shutting down" -msgstr "выключение" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "" +"BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 +#: access/transam/xlogreader.c:1817 #, c-format -msgid "restartpoint starting:%s%s%s%s%s%s%s%s" -msgstr "начата точка перезапуска:%s%s%s%s%s%s%s%s" +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" -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8850 +#: access/transam/xlogreader.c:1833 #, c-format -msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "начата контрольная точка:%s%s%s%s%s%s%s%s" +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " +"%u в позиции %X/%X" -# well-spelled: синхр -#: access/transam/xlog.c:8910 +#: access/transam/xlogreader.c:1847 #, 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" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" -"точка перезапуска завершена: записано буферов: %d (%.1f%%); добавлено файлов " -"WAL %d, удалено: %d, переработано: %d; запись=%ld.%03d сек., синхр.=%ld.%03d " -"сек., всего=%ld.%03d сек.; синхронизировано_файлов=%d, самая_долгая_синхр." -"=%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB" +"BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" +"%X" -# well-spelled: синхр -#: access/transam/xlog.c:8930 +#: access/transam/xlogreader.c:1862 #, 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" +"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " +"length is %u at %X/%X" msgstr "" -"контрольная точка завершена: записано буферов: %d (%.1f%%); добавлено файлов " -"WAL %d, удалено: %d, переработано: %d; запись=%ld.%03d сек., синхр.=%ld.%03d " -"сек., всего=%ld.%03d сек.; синхронизировано_файлов=%d, самая_долгая_синхр." -"=%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB" +"ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " +"блока равна %u в позиции %X/%X" -#: access/transam/xlog.c:9374 +#: access/transam/xlogreader.c:1878 #, c-format -msgid "" -"concurrent write-ahead log activity while database system is shutting down" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" -"во время выключения системы баз данных отмечена активность в журнале " -"предзаписи" +"BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" +"%X" -#: access/transam/xlog.c:9907 +#: access/transam/xlogreader.c:1890 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "точка перезапуска восстановления в позиции %X/%X" +msgid "invalid block_id %u at %X/%X" +msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlog.c:9909 +#: access/transam/xlogreader.c:1957 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Последняя завершённая транзакция была выполнена в %s." +msgid "record with invalid length at %X/%X" +msgstr "запись с неверной длиной в позиции %X/%X" -#: access/transam/xlog.c:10155 +#: access/transam/xlogreader.c:1982 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "точка восстановления \"%s\" создана в позиции %X/%X" +msgid "could not locate backup block with ID %d in WAL record" +msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: access/transam/xlog.c:10300 +#: access/transam/xlogreader.c:2066 #, c-format -msgid "" -"unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " -"record" +msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" -"неожиданный ID предыдущей линии времени %u (ID текущей линии времени %u) в " -"записи контрольной точки" +"не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: access/transam/xlog.c:10309 +#: access/transam/xlogreader.c:2073 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "неожиданный ID линии времени %u (после %u) в записи контрольной точки" +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "" +"не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -# skip-rule: capital-letter-first -#: access/transam/xlog.c:10325 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "" -"unexpected timeline ID %u in checkpoint record, before reaching minimum " -"recovery point %X/%X on timeline %u" +"could not restore image at %X/%X compressed with %s not supported by build, " +"block %d" msgstr "" -"неожиданный ID линии времени %u в записи контрольной точки, до достижения " -"минимальной к. т. %X/%X на линии времени %u" +"не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " +"поддерживается этой сборкой, блок %d" -#: access/transam/xlog.c:10400 +#: access/transam/xlogreader.c:2126 #, c-format -msgid "online backup was canceled, recovery cannot continue" +msgid "" +"could not restore image at %X/%X compressed with unknown method, block %d" msgstr "" -"резервное копирование \"на ходу\" было отменено, продолжить восстановление " -"нельзя" +"не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " +"блок %d" -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 -#: access/transam/xlog.c:10542 +#: access/transam/xlogreader.c:2134 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "" -"неожиданный ID линии времени %u (должен быть %u) в записи точки " -"восстановления" +msgid "could not decompress image at %X/%X, block %d" +msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" -#: access/transam/xlog.c:10700 +#: access/transam/xlogrecovery.c:545 #, c-format -msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" -msgstr "" -"успешно пропущена отсутствующая запись contrecord в %X/%X, перезаписанная в " -"%s" +msgid "entering standby mode" +msgstr "переход в режим резервного сервера" -#: access/transam/xlog.c:10915 +#: access/transam/xlogrecovery.c:548 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" +msgid "starting point-in-time recovery to XID %u" +msgstr "начинается восстановление точки во времени до XID %u" -#: access/transam/xlog.c:10921 +#: access/transam/xlogrecovery.c:552 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" +msgid "starting point-in-time recovery to %s" +msgstr "начинается восстановление точки во времени до %s" -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 -#: 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/xlogrecovery.c:556 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "Функции управления WAL нельзя использовать в процессе восстановления." +msgid "starting point-in-time recovery to \"%s\"" +msgstr "начинается восстановление точки во времени до \"%s\"" -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 +#: access/transam/xlogrecovery.c:560 #, c-format -msgid "WAL level not sufficient for making an online backup" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "" -"Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" +"начинается восстановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 -#: access/transam/xlogfuncs.c:308 +#: access/transam/xlogrecovery.c:564 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "Установите wal_level \"replica\" или \"logical\" при запуске сервера." +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "" +"начинается восстановление точки во времени до первой точки согласованности" -#: access/transam/xlog.c:11047 +#: access/transam/xlogrecovery.c:567 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "длина метки резервной копии превышает предел (%d байт)" +msgid "starting archive recovery" +msgstr "начинается восстановление архива" -#: access/transam/xlog.c:11084 access/transam/xlog.c:11368 -#: access/transam/xlog.c:11406 +#: access/transam/xlogrecovery.c:635 #, c-format -msgid "a backup is already in progress" -msgstr "резервное копирование уже выполняется" +msgid "" +"starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on " +"timeline ID %u" +msgstr "" +"начинается восстановление копии с LSN redo %X/%X, LSN контрольной точки %X/" +"%X, на линии времени %u" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:667 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Выполните pg_stop_backup() и повторите операцию." +msgid "could not find redo location referenced by checkpoint record" +msgstr "не удалось найти положение REDO, указанное записью контрольной точки" -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:668 access/transam/xlogrecovery.c:678 #, c-format msgid "" -"WAL generated with full_page_writes=off was replayed since last restartpoint" +"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 "" -"После последней точки перезапуска был воспроизведён WAL, созданный в режиме " -"full_page_writes=off." +"Если вы восстанавливаете резервную копию, создайте \"%s/recovery.signal\" и " +"задайте обязательные параметры восстановления.\n" +"В других случаях попытайтесь удалить файл \"%s/backup_label\".\n" +"Будьте осторожны: при восстановлении резервной копии удаление \"%s/" +"backup_label\" приведёт к повреждению кластера." -#: access/transam/xlog.c:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:677 #, 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 "could not locate required checkpoint record" +msgstr "не удалось считать нужную запись контрольной точки" -#: access/transam/xlog.c:11267 replication/basebackup.c:1439 -#: utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:706 commands/tablespace.c:685 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "целевой путь символической ссылки \"%s\" слишком длинный" +msgid "could not create symbolic link \"%s\": %m" +msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: access/transam/xlog.c:11317 commands/tablespace.c:385 -#: commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:738 access/transam/xlogrecovery.c:744 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "табличные пространства не поддерживаются на этой платформе" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "файл \"%s\" игнорируется ввиду отсутствия файла \"%s\"" -#: access/transam/xlog.c:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:740 #, c-format -msgid "" -"If you're sure there is no backup in progress, remove file \"%s\" and try " -"again." -msgstr "" -"Если вы считаете, что информация о резервном копировании неверна, удалите " -"файл \"%s\" и попробуйте снова." +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "Файл \"%s\" был переименован в \"%s\"." -#: access/transam/xlog.c:11594 +#: access/transam/xlogrecovery.c:746 #, c-format -msgid "exclusive backup not in progress" -msgstr "монопольное резервное копирование не выполняется" +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Не удалось переименовать файл \"%s\" в \"%s\" (%m)." -#: access/transam/xlog.c:11621 +#: access/transam/xlogrecovery.c:785 #, c-format -msgid "a backup is not in progress" -msgstr "резервное копирование не выполняется" +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "перезапуск восстановления копии с LSN redo %X/%X" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 -#: access/transam/xlog.c:12111 access/transam/xlog.c:12117 -#: access/transam/xlog.c:12165 access/transam/xlog.c:12245 -#: access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:810 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "неверные данные в файле \"%s\"" +msgid "could not locate a valid checkpoint record" +msgstr "не удалось считать правильную запись контрольной точки" -#: access/transam/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:834 #, c-format -msgid "the standby was promoted during online backup" -msgstr "" -"дежурный сервер был повышен в процессе резервного копирования \"на ходу\"" +msgid "requested timeline %u is not a child of this server's history" +msgstr "в истории сервера нет ответвления запрошенной линии времени %u" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:836 #, c-format msgid "" -"This means that the backup being taken is corrupt and should not be used. " -"Try taking another online backup." +"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:11772 +#: access/transam/xlogrecovery.c:850 #, 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:11892 -#, c-format -msgid "base backup done, waiting for required WAL segments to be archived" +"requested timeline %u does not contain minimum recovery point %X/%X on " +"timeline %u" msgstr "" -"базовое копирование выполнено, ожидается архивация нужных сегментов WAL" +"запрошенная линия времени %u не содержит минимальную точку восстановления %X/" +"%X на линии времени %u" -#: access/transam/xlog.c:11904 +#: access/transam/xlogrecovery.c:878 #, c-format -msgid "" -"still waiting for all required WAL segments to be archived (%d seconds " -"elapsed)" -msgstr "" -"продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" +msgid "invalid next transaction ID" +msgstr "неверный ID следующей транзакции" -#: access/transam/xlog.c:11906 +#: access/transam/xlogrecovery.c:883 #, 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 "invalid redo in checkpoint record" +msgstr "неверная запись REDO в контрольной точке" -#: access/transam/xlog.c:11913 +#: access/transam/xlogrecovery.c:894 #, c-format -msgid "all required WAL segments have been archived" -msgstr "все нужные сегменты WAL заархивированы" +msgid "invalid redo record in shutdown checkpoint" +msgstr "неверная запись REDO в контрольной точке выключения" -#: access/transam/xlog.c:11917 +#: access/transam/xlogrecovery.c:923 #, 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" +"database system was not properly shut down; automatic recovery in progress" msgstr "" -"архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " -"сегментов WAL другими средствами для получения резервной копии" +"система БД была остановлена нештатно; производится автоматическое " +"восстановление" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:927 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" +msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" -"прерывание резервного копирования из-за завершения обслуживающего процесса " -"до вызова pg_stop_backup" +"восстановление после сбоя начинается на линии времени %u, целевая линия " +"времени: %u" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:970 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Получен идентификатор линии времени %u, но ожидался %u." +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label содержит данные, не согласованные с файлом pg_control" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:971 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "запись REDO в WAL в позиции %X/%X для %s" +msgid "" +"This means that the backup is corrupted and you will have to use another " +"backup for recovery." +msgstr "" +"Это означает, что резервная копия повреждена и для восстановления БД " +"придётся использовать другую копию." -#: access/transam/xlog.c:12342 +#: access/transam/xlogrecovery.c:1025 #, c-format -msgid "online backup mode was not canceled" -msgstr "режим копирования \"на ходу\" не был отменён" +msgid "using recovery command file \"%s\" is not supported" +msgstr "" +"использование файла с конфигурацией восстановления \"%s\" не поддерживается" -#: access/transam/xlog.c:12343 +#: access/transam/xlogrecovery.c:1090 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Не удалось переименовать файл \"%s\" в \"%s\": %m." +msgid "standby mode is not supported by single-user servers" +msgstr "" +"режим резервного сервера не поддерживается однопользовательским сервером" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 -#: access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:1107 #, c-format -msgid "online backup mode canceled" -msgstr "режим копирования \"на ходу\" отменён" +msgid "specified neither primary_conninfo nor restore_command" +msgstr "не указано ни primary_conninfo, ни restore_command" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:1108 #, c-format msgid "" -"Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." +"The database server will regularly poll the pg_wal subdirectory to check for " +"files placed there." msgstr "" -"Файлы \"%s\" и \"%s\" были переименованы в \"%s\" и \"%s\", соответственно." +"Сервер БД будет регулярно опрашивать подкаталог pg_wal и проверять " +"содержащиеся в нём файлы." -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:1116 #, c-format -msgid "" -"File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to " -"\"%s\": %m." +msgid "must specify restore_command when standby mode is not enabled" msgstr "" -"Файл \"%s\" был переименован в \"%s\", но переименовать \"%s\" в \"%s\" не " -"удалось: %m." +"необходимо задать restore_command, если не выбран режим резервного сервера" -#: access/transam/xlog.c:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:1154 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "не удалось прочитать сегмент журнала %s, смещение %u: %m" +msgid "recovery target timeline %u does not exist" +msgstr "целевая линия времени для восстановления %u не существует" -#: access/transam/xlog.c:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:1304 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "" -"не удалось прочитать из сегмента журнала %s по смещению %u (прочитано байт: " -"%d из %zu)" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Получен идентификатор линии времени %u, но ожидался %u." -#: access/transam/xlog.c:13079 +#: access/transam/xlogrecovery.c:1686 #, c-format -msgid "WAL receiver process shutdown requested" -msgstr "получен запрос на выключение процесса приёмника WAL" +msgid "redo starts at %X/%X" +msgstr "запись REDO начинается со смещения %X/%X" -#: access/transam/xlog.c:13174 +#: access/transam/xlogrecovery.c:1699 #, c-format -msgid "received promote request" -msgstr "получен запрос повышения статуса" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "" +"выполняется воспроизведение, прошло времени: %ld.%02d с, текущий LSN: %X/%X" -#: access/transam/xlog.c:13187 +#: access/transam/xlogrecovery.c:1791 #, c-format -msgid "promote trigger file found: %s" -msgstr "найден файл триггера повышения: %s" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "" +"запрошенная точка остановки восстановления предшествует согласованной точке " +"восстановления" -#: access/transam/xlog.c:13195 +#: access/transam/xlogrecovery.c:1823 #, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "не удалось получить информацию о файле триггера повышения \"%s\": %m" +msgid "redo done at %X/%X system usage: %s" +msgstr "записи REDO обработаны до смещения %X/%X, нагрузка системы: %s" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:1829 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "файл архива \"%s\" имеет неправильный размер: %lld вместо %lld" +msgid "last completed transaction was at log time %s" +msgstr "последняя завершённая транзакция была выполнена в %s" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:1838 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "файл журнала \"%s\" восстановлен из архива" +msgid "redo is not required" +msgstr "данные REDO не требуются" -#: access/transam/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:1849 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "" -"Команда restore_command возвратила нулевой код состояния, но stat() выдала " -"ошибку." +msgid "recovery ended before configured recovery target was reached" +msgstr "восстановление окончилось до достижения заданной цели восстановления" -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:2024 #, 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 "" +"успешно пропущена отсутствующая запись contrecord в %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:369 +#: access/transam/xlogrecovery.c:2091 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "в %2$s обнаружен недопустимый элемент-каталог \"%1$s\"" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:2093 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "не удалось создать файл состояния архива \"%s\": %m" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "" +"Все элементы-каталоги в pg_tblspc/ должны быть символическими ссылками." -#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:2094 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "не удалось записать файл состояния архива \"%s\": %m" +msgid "" +"Remove those directories, or set allow_in_place_tablespaces to ON " +"transiently to let recovery complete." +msgstr "" +"Удалите эти каталоги или на время установите в allow_in_place_tablespaces " +"значение ON, чтобы восстановление завершилось." -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:2146 #, c-format -msgid "a backup is already in progress in this session" -msgstr "резервное копирование уже выполняется в этом сеансе" +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "завершено восстановление копии с LSN redo %X/%X и конечным LSN %X/%X" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogrecovery.c:2176 #, c-format -msgid "non-exclusive backup in progress" -msgstr "выполняется не монопольное резервное копирование" +msgid "consistent recovery state reached at %X/%X" +msgstr "согласованное состояние восстановления достигнуто в позиции %X/%X" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2214 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Вероятно, подразумевалось pg_stop_backup('f')?" +msgid "WAL redo at %X/%X for %s" +msgstr "запись REDO в WAL в позиции %X/%X для %s" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1966 -#: commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 -#: executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 -#: 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:3328 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 -#: utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 -#: utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10024 -#: utils/mmgr/portalmem.c:1145 +#: access/transam/xlogrecovery.c:2310 #, c-format -msgid "set-valued function called in context that cannot accept a set" +msgid "" +"unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " +"record" msgstr "" -"функция, возвращающая множество, вызвана в контексте, где ему нет места" +"неожиданный ID предыдущей линии времени %u (ID текущей линии времени %u) в " +"записи контрольной точки" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1970 -#: commands/extension.c:2078 commands/extension.c:2363 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:3332 -#: 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:223 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10028 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: access/transam/xlogrecovery.c:2319 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "требуется режим материализации, но он недопустим в этом контексте" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "неожиданный ID линии времени %u (после %u) в записи контрольной точки" -#: access/transam/xlogfuncs.c:230 +# skip-rule: capital-letter-first +#: access/transam/xlogrecovery.c:2335 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "немонопольное резервное копирование не выполняется" +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/xlogfuncs.c:231 +#: access/transam/xlogrecovery.c:2519 access/transam/xlogrecovery.c:2795 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Вероятно, подразумевалось pg_stop_backup('t')?" +msgid "recovery stopping after reaching consistency" +msgstr "" +"восстановление останавливается после достижения согласованного состояния" -#: access/transam/xlogfuncs.c:307 +#: access/transam/xlogrecovery.c:2540 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "Выбранный уровень WAL не достаточен для создания точки восстановления" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "восстановление останавливается перед позицией в WAL (LSN) \"%X/%X\"" -# well-spelled: симв -#: access/transam/xlogfuncs.c:315 +#: access/transam/xlogrecovery.c:2630 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "значение для точки восстановления превышает предел (%d симв.)" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "" +"восстановление останавливается перед фиксированием транзакции %u, время %s" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: access/transam/xlogrecovery.c:2637 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "выполнить %s во время восстановления нельзя." +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "" +"восстановление останавливается перед прерыванием транзакции %u, время %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:2690 #, c-format -msgid "recovery is not in progress" -msgstr "восстановление не выполняется" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "восстановление останавливается в точке восстановления \"%s\", время %s" -#: 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:2708 #, c-format -msgid "Recovery control functions can only be executed during recovery." +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "восстановление останавливается после позиции в WAL (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:2775 +#, c-format +msgid "recovery stopping after commit of transaction %u, time %s" msgstr "" -"Функции управления восстановлением можно использовать только в процессе " -"восстановления." +"восстановление останавливается после фиксирования транзакции %u, время %s" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: access/transam/xlogrecovery.c:2783 #, c-format -msgid "standby promotion is ongoing" -msgstr "производится повышение ведомого" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "" +"восстановление останавливается после прерывания транзакции %u, время %s" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: access/transam/xlogrecovery.c:2864 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s нельзя выполнять, когда производится повышение." +msgid "pausing at the end of recovery" +msgstr "остановка в конце восстановления" -#: access/transam/xlogfuncs.c:769 +#: access/transam/xlogrecovery.c:2865 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "значение \"wait_seconds\" не должно быть отрицательным или нулевым" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Выполните pg_wal_replay_resume() для повышения." -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: access/transam/xlogrecovery.c:2868 access/transam/xlogrecovery.c:4678 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "отправить сигнал процессу postmaster не удалось: %m" +msgid "recovery has paused" +msgstr "восстановление приостановлено" -#: access/transam/xlogfuncs.c:825 +#: access/transam/xlogrecovery.c:2869 #, c-format -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 секунд" +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Выполните pg_wal_replay_resume() для продолжения." -#: access/transam/xlogreader.c:323 +#: access/transam/xlogrecovery.c:3135 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "неверное смещение записи в позиции %X/%X" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "неожиданный ID линии времени %u в сегменте журнала %s, смещение %u" -#: access/transam/xlogreader.c:331 +#: access/transam/xlogrecovery.c:3340 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "в позиции %X/%X запрошено продолжение записи" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "не удалось прочитать сегмент журнала %s, смещение %u: %m" -#: access/transam/xlogreader.c:372 access/transam/xlogreader.c:720 +#: access/transam/xlogrecovery.c:3346 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "неверная длина записи в позиции %X/%X: ожидалось %u, получено %u" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "" +"не удалось прочитать из сегмента журнала %s по смещению %u (прочитано байт: " +"%d из %zu)" -#: access/transam/xlogreader.c:442 +#: access/transam/xlogrecovery.c:3995 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "нет флага contrecord в позиции %X/%X" +msgid "invalid primary checkpoint link in control file" +msgstr "неверная ссылка на первичную контрольную точку в файле pg_control" -#: access/transam/xlogreader.c:455 +#: access/transam/xlogrecovery.c:3999 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" +msgid "invalid checkpoint link in backup_label file" +msgstr "неверная ссылка на контрольную точку в файле backup_label" -#: access/transam/xlogreader.c:728 +#: access/transam/xlogrecovery.c:4017 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" +msgid "invalid primary checkpoint record" +msgstr "неверная запись первичной контрольной точки" -#: access/transam/xlogreader.c:741 access/transam/xlogreader.c:757 +#: access/transam/xlogrecovery.c:4021 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" +msgid "invalid checkpoint record" +msgstr "неверная запись контрольной точки" -#: access/transam/xlogreader.c:795 +#: access/transam/xlogrecovery.c:4032 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "" -"некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " -"%X/%X" +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "неверный ID менеджера ресурсов в записи первичной контрольной точки" -#: access/transam/xlogreader.c:832 +#: access/transam/xlogrecovery.c:4036 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u" +msgid "invalid resource manager ID in checkpoint record" +msgstr "неверный ID менеджера ресурсов в записи контрольной точки" -#: access/transam/xlogreader.c:846 access/transam/xlogreader.c:887 +#: access/transam/xlogrecovery.c:4049 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u" +msgid "invalid xl_info in primary checkpoint record" +msgstr "неверные флаги xl_info в записи первичной контрольной точки" -#: access/transam/xlogreader.c:861 +#: access/transam/xlogrecovery.c:4053 #, 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 принадлежит другой СУБД: в нём указан идентификатор системы БД " -"%llu, а идентификатор системы pg_control: %llu" +msgid "invalid xl_info in checkpoint record" +msgstr "неверные флаги xl_info в записи контрольной точки" -#: access/transam/xlogreader.c:869 +#: access/transam/xlogrecovery.c:4064 #, c-format -msgid "" -"WAL file is from different database system: incorrect segment size in page " -"header" -msgstr "" -"файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " -"страницы" +msgid "invalid length of primary checkpoint record" +msgstr "неверная длина записи первичной контрольной точки" -#: access/transam/xlogreader.c:875 +#: access/transam/xlogrecovery.c:4068 #, c-format -msgid "" -"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " -"header" -msgstr "" -"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " -"страницы" +msgid "invalid length of checkpoint record" +msgstr "неверная длина записи контрольной точки" -#: access/transam/xlogreader.c:906 +#: access/transam/xlogrecovery.c:4124 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "" +"новая линия времени %u не является ответвлением линии времени системы БД %u" -#: access/transam/xlogreader.c:931 +#: access/transam/xlogrecovery.c:4138 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgid "" +"new timeline %u forked off current database system timeline %u before " +"current recovery point %X/%X" msgstr "" -"нарушение последовательности ID линии времени %u (после %u) в сегменте " -"журнала %s, смещение %u" +"новая линия времени %u ответвилась от текущей линии времени базы данных %u " +"до текущей точки восстановления %X/%X" -#: access/transam/xlogreader.c:1276 +#: access/transam/xlogrecovery.c:4157 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" +msgid "new target timeline is %u" +msgstr "новая целевая линия времени %u" -#: access/transam/xlogreader.c:1298 +#: access/transam/xlogrecovery.c:4360 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" +msgid "WAL receiver process shutdown requested" +msgstr "получен запрос на выключение процесса приёмника WAL" -#: access/transam/xlogreader.c:1305 +#: access/transam/xlogrecovery.c:4423 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "" -"BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" +msgid "received promote request" +msgstr "получен запрос повышения статуса" -#: access/transam/xlogreader.c:1341 +#: access/transam/xlogrecovery.c:4436 #, 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" +msgid "promote trigger file found: %s" +msgstr "найден файл триггера повышения: %s" -#: access/transam/xlogreader.c:1357 +#: access/transam/xlogrecovery.c:4444 #, 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" +msgid "could not stat promote trigger file \"%s\": %m" +msgstr "не удалось получить информацию о файле триггера повышения \"%s\": %m" -#: access/transam/xlogreader.c:1372 +#: access/transam/xlogrecovery.c:4669 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" +msgid "hot standby is not possible because of insufficient parameter settings" msgstr "" -"BKPIMAGE_IS_COMPRESSED установлен, но длина образа блока равна %u в позиции " -"%X/%X" +"режим горячего резерва невозможен из-за отсутствия достаточных значений " +"параметров" -#: access/transam/xlogreader.c:1387 +#: access/transam/xlogrecovery.c:4670 access/transam/xlogrecovery.c:4697 +#: access/transam/xlogrecovery.c:4727 #, c-format msgid "" -"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image " -"length is %u at %X/%X" +"%s = %d is a lower setting than on the primary server, where its value was " +"%d." msgstr "" -"ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_IS_COMPRESSED не установлены, но длина " -"образа блока равна %u в позиции %X/%X" +"Параметр %s = %d меньше, чем на ведущем сервере, где его значение было %d." -#: access/transam/xlogreader.c:1403 +#: access/transam/xlogrecovery.c:4679 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgid "If recovery is unpaused, the server will shut down." +msgstr "В случае возобновления восстановления сервер отключится." + +#: access/transam/xlogrecovery.c:4680 +#, c-format +msgid "" +"You can then restart the server after making the necessary configuration " +"changes." msgstr "" -"BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" -"%X" +"Затем вы можете перезапустить сервер после внесения необходимых изменений " +"конфигурации." -#: access/transam/xlogreader.c:1415 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "неверный идентификатор блока %u в позиции %X/%X" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "повышение невозможно из-за отсутствия достаточных значений параметров" -#: access/transam/xlogreader.c:1502 +#: access/transam/xlogrecovery.c:4701 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "запись с неверной длиной в позиции %X/%X" +msgid "Restart the server after making the necessary configuration changes." +msgstr "" +"Перезапустите сервер после внесения необходимых изменений конфигурации." -#: access/transam/xlogreader.c:1591 +#: access/transam/xlogrecovery.c:4725 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "неверный сжатый образ в позиции %X/%X, блок %d" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "" +"восстановление прервано из-за отсутствия достаточных значений параметров" -#: bootstrap/bootstrap.c:270 +#: access/transam/xlogrecovery.c:4731 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" +msgid "" +"You can restart the server after making the necessary configuration changes." msgstr "" -"для -X требуется число, равное степени двух, в интервале от 1 МБ до 1 ГБ" +"Вы можете перезапустить сервер после внесения необходимых изменений " +"конфигурации." -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "--%s requires a value" -msgstr "для --%s требуется значение" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "не удалось прочитать сегмент журнала %s, смещение %d: %m" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "-c %s requires a value" -msgstr "для -c %s требуется значение" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "" +"не удалось прочитать из сегмента журнала %s по смещению %d (прочитано байт: " +"%d из %d)" -#: bootstrap/bootstrap.c:303 postmaster/postmaster.c:864 -#: postmaster/postmaster.c:877 +#: backup/backup_manifest.c:253 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" +msgid "expected end timeline %u but found timeline %u" +msgstr "ожидался конец линии времени %u, но обнаружена линия времени %u" -#: bootstrap/bootstrap.c:312 +#: backup/backup_manifest.c:277 #, c-format -msgid "%s: invalid command-line arguments\n" -msgstr "%s: неверные аргументы командной строки\n" +msgid "expected start timeline %u but found timeline %u" +msgstr "ожидалось начало линии времени %u, но обнаружена линия времени %u" -#: catalog/aclchk.c:181 +#: backup/backup_manifest.c:304 #, c-format -msgid "grant options can only be granted to roles" -msgstr "право назначения прав можно давать только ролям" +msgid "start timeline %u not found in history of timeline %u" +msgstr "начальная линия времени %u не найдена в истории линии времени %u" -#: catalog/aclchk.c:300 +#: backup/backup_manifest.c:355 #, c-format -msgid "no privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "для столбца \"%s\" отношения \"%s\" не были назначены никакие права" +msgid "could not rewind temporary file" +msgstr "не удалось переместиться во временном файле" -#: catalog/aclchk.c:305 +#: backup/backup_manifest.c:374 #, c-format -msgid "no privileges were granted for \"%s\"" -msgstr "для объекта \"%s\" не были назначены никакие права" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "не удалось прочитать временный файл (прочитано байт: %zu из %zu)" -#: catalog/aclchk.c:313 +#: backup/basebackup.c:454 #, c-format -msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "" -"для столбца \"%s\" отношения \"%s\" были назначены не все запрошенные права" +msgid "could not find any WAL files" +msgstr "не удалось найти ни одного файла WAL" -#: catalog/aclchk.c:318 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "not all privileges were granted for \"%s\"" -msgstr "для объекта \"%s\" были назначены не все запрошенные права" +msgid "could not find WAL file \"%s\"" +msgstr "не удалось найти файл WAL \"%s\"" -#: catalog/aclchk.c:329 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" -msgstr "для столбца \"%s\" отношения \"%s\" не были отозваны никакие права" +msgid "unexpected WAL file size \"%s\"" +msgstr "неприемлемый размер файла WAL \"%s\"" -#: catalog/aclchk.c:334 +#: backup/basebackup.c:630 +#, c-format +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "всего ошибок контрольных сумм: %lld" +msgstr[1] "всего ошибок контрольных сумм: %lld" +msgstr[2] "всего ошибок контрольных сумм: %lld" + +#: backup/basebackup.c:637 +#, c-format +msgid "checksum verification failure during base backup" +msgstr "при базовом резервном копировании выявлены ошибки контрольных сумм" + +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 +#, c-format +msgid "duplicate option \"%s\"" +msgstr "повторяющийся параметр \"%s\"" + +#: backup/basebackup.c:734 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "нераспознанный тип контрольной точки: \"%s\"" + +#: backup/basebackup.c:769 +#, c-format +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" + +#: backup/basebackup.c:814 +#, c-format +msgid "unrecognized manifest option: \"%s\"" +msgstr "нераспознанный параметр в манифесте: \"%s\"" + +#: backup/basebackup.c:830 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\"" + +#: backup/basebackup.c:865 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нераспознанный алгоритм сжатия: \"%s\"" + +#: backup/basebackup.c:881 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "нераспознанный параметр операции базового копирования: \"%s\"" + +#: backup/basebackup.c:892 +#, c-format +msgid "manifest checksums require a backup manifest" +msgstr "контрольные суммы не могут рассчитываться без манифеста копии" + +# skip-rule: capital-letter-first +#: backup/basebackup.c:901 +#, c-format +msgid "target detail cannot be used without target" +msgstr "доп. информацию о получателе нельзя задать без указания получателя" + +# skip-rule: capital-letter-first +#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#, c-format +msgid "target \"%s\" does not accept a target detail" +msgstr "получатель \"%s\" не принимает доп. информацию" + +#: backup/basebackup.c:921 +#, c-format +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "параметры сжатия нельзя указывать, если не включено сжатие" + +#: backup/basebackup.c:934 +#, c-format +msgid "invalid compression specification: %s" +msgstr "неправильное указание сжатия: %s" + +#: backup/basebackup.c:1431 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "специальный файл \"%s\" пропускается" + +#: backup/basebackup.c:1550 +#, c-format +msgid "invalid segment number %d in file \"%s\"" +msgstr "неверный номер сегмента %d в файле \"%s\"" + +#: backup/basebackup.c:1582 +#, c-format +msgid "" +"could not verify checksum in file \"%s\", block %u: read buffer size %d and " +"page size %d differ" +msgstr "" +"не удалось проверить контрольную сумму в файле \"%s\", блоке %u: размер " +"прочитанного буфера (%d) отличается от размера страницы (%d)" + +#: backup/basebackup.c:1656 +#, c-format +msgid "" +"checksum verification failed in file \"%s\", block %u: calculated %X but " +"expected %X" +msgstr "" +"ошибка контрольной суммы в файле \"%s\", блоке %u: вычислено значение %X, но " +"ожидалось %X" + +#: backup/basebackup.c:1663 +#, c-format +msgid "" +"further checksum verification failures in file \"%s\" will not be reported" +msgstr "" +"о дальнейших ошибках контрольных сумм в файле \"%s\" сообщаться не будет" + +#: backup/basebackup.c:1719 +#, 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" +msgstr[2] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" + +#: backup/basebackup.c:1765 +#, c-format +msgid "file name too long for tar format: \"%s\"" +msgstr "слишком длинное имя файла для формата tar: \"%s\"" + +#: backup/basebackup.c:1770 +#, c-format +msgid "" +"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "" +"цель символической ссылки слишком длинная для формата tar: имя файла \"%s\", " +"цель \"%s\"" + +#: backup/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "сжатие gzip не поддерживается в данной сборке" + +#: backup/basebackup_gzip.c:143 +#, c-format +msgid "could not initialize compression library" +msgstr "не удалось инициализировать библиотеку сжатия" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "сжатие lz4 не поддерживается в данной сборке" + +#: backup/basebackup_server.c:75 +#, c-format +msgid "" +"must be superuser or a role with privileges of the pg_write_server_files " +"role to create backup stored on server" +msgstr "" +"для создания копии, сохраняемой на стороне сервера, нужно быть " +"суперпользователем или иметь права роли pg_write_server_files" + +#: backup/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for backup stored on server" +msgstr "" +"для копии, сохраняемой на стороне сервера, нельзя указывать относительный " +"путь" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не удалось создать каталог \"%s\": %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" существует, но он не пуст" + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ошибка доступа к каталогу \"%s\": %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 +#, c-format +msgid "Check free disk space." +msgstr "Проверьте, есть ли место на диске." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "" +"не удалось записать файл \"%s\" (записано байт: %d из %d по смещению %u)" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "нераспознанный получатель: \"%s\"" + +# skip-rule: capital-letter-first +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "для получателя \"%s\" требуется доп. информация" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "сжатие zstd не поддерживается в данной сборке" + +#: backup/basebackup_zstd.c:117 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "не удалось установить для zstd число потоков %d: %s" + +#: bootstrap/bootstrap.c:263 +#, c-format +msgid "-X requires a power of two value between 1 MB and 1 GB" +msgstr "" +"для -X требуется число, равное степени двух, в интервале от 1 МБ до 1 ГБ" + +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 +#, c-format +msgid "--%s requires a value" +msgstr "для --%s требуется значение" + +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 +#, c-format +msgid "-c %s requires a value" +msgstr "для -c %s требуется значение" + +#: 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:305 +#, c-format +msgid "%s: invalid command-line arguments\n" +msgstr "%s: неверные аргументы командной строки\n" + +#: catalog/aclchk.c:185 +#, c-format +msgid "grant options can only be granted to roles" +msgstr "право назначения прав можно давать только ролям" + +#: catalog/aclchk.c:307 +#, c-format +msgid "no privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "для столбца \"%s\" отношения \"%s\" не были назначены никакие права" + +#: catalog/aclchk.c:312 +#, c-format +msgid "no privileges were granted for \"%s\"" +msgstr "для объекта \"%s\" не были назначены никакие права" + +#: catalog/aclchk.c:320 +#, c-format +msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "" +"для столбца \"%s\" отношения \"%s\" были назначены не все запрошенные права" + +#: catalog/aclchk.c:325 +#, c-format +msgid "not all privileges were granted for \"%s\"" +msgstr "для объекта \"%s\" были назначены не все запрошенные права" + +#: catalog/aclchk.c:336 +#, c-format +msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "для столбца \"%s\" отношения \"%s\" не были отозваны никакие права" + +#: 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 "для столбца \"%s\" отношения \"%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:379 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" msgstr "праводателем должен быть текущий пользователь" -#: 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 "право %s неприменимо для отношений" -#: 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 "право %s неприменимо для последовательностей" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "право %s неприменимо для баз данных" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "право %s неприменимо для домена" -#: 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 "право %s неприменимо для функций" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "право %s неприменимо для языков" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "право %s неприменимо для больших объектов" -#: 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 "право %s неприменимо для схем" -#: 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 "право %s неприменимо для процедур" -#: 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 "право %s неприменимо для подпрограмм" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "право %s неприменимо для табличных пространств" -#: 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 "право %s неприменимо для типа" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "право %s неприменимо для обёрток сторонних данных" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "право %s неприменимо для сторонних серверов" -#: catalog/aclchk.c:537 +#: 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:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 -#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 +#: 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:926 catalog/aclchk.c:935 commands/collationcmds.c:119 -#: commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 -#: commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 -#: commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 -#: commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 -#: commands/dbcommands.c:158 commands/dbcommands.c:167 -#: commands/dbcommands.c:176 commands/dbcommands.c:185 -#: commands/dbcommands.c:194 commands/dbcommands.c:203 -#: commands/dbcommands.c:212 commands/dbcommands.c:221 -#: commands/dbcommands.c:230 commands/dbcommands.c:239 -#: commands/dbcommands.c:261 commands/dbcommands.c:1529 -#: commands/dbcommands.c:1538 commands/dbcommands.c:1547 -#: commands/dbcommands.c:1556 commands/extension.c:1757 -#: commands/extension.c:1767 commands/extension.c:1777 -#: commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 -#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 -#: commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 -#: commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 -#: commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 -#: 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:408 -#: replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 -#: replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 -#: replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 -#: replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "конфликтующие или избыточные параметры" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "права по умолчанию нельзя определить для столбцов" -#: catalog/aclchk.c:1206 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "предложение IN SCHEMA нельзя использовать в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 -#: commands/tablecmds.c:7092 commands/tablecmds.c:7248 -#: commands/tablecmds.c:7298 commands/tablecmds.c:7372 -#: commands/tablecmds.c:7442 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7648 commands/tablecmds.c:7707 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7825 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 -#: commands/tablecmds.c:11726 commands/tablecmds.c:11907 -#: commands/tablecmds.c:12067 commands/tablecmds.c:13210 -#: commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2460 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3432 -#: parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7275 commands/tablecmds.c:7431 +#: commands/tablecmds.c:7481 commands/tablecmds.c:7555 +#: commands/tablecmds.c:7625 commands/tablecmds.c:7737 +#: commands/tablecmds.c:7831 commands/tablecmds.c:7890 +#: commands/tablecmds.c:7979 commands/tablecmds.c:8009 +#: commands/tablecmds.c:8137 commands/tablecmds.c:8219 +#: commands/tablecmds.c:8375 commands/tablecmds.c:8493 +#: commands/tablecmds.c:12226 commands/tablecmds.c:12407 +#: commands/tablecmds.c:12567 commands/tablecmds.c:13731 +#: commands/tablecmds.c:16300 commands/trigger.c:954 parser/analyze.c:2506 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "столбец \"%s\" в таблице \"%s\" не существует" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1147 -#: commands/tablecmds.c:249 commands/tablecmds.c:16628 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17172 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:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "" "для последовательности \"%s\" применимы только права USAGE, SELECT и UPDATE" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "право %s неприменимо для таблиц" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "право %s неприменимо для столбцов" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "для последовательности \"%s\" применимо только право SELECT" # TO REVIEW -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "язык \"%s\" не является доверенным" -#: catalog/aclchk.c:2625 +#: catalog/aclchk.c:2668 #, c-format msgid "" "GRANT and REVOKE are not allowed on untrusted languages, because only " @@ -4213,476 +4473,487 @@ msgstr "" "GRANT и REVOKE не допускаются для недоверенных языков, так как использовать " "такие языки могут только суперпользователи." -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "для типов массивов нельзя определить права" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Вместо этого установите права для типа элемента." -#: 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\" - это не домен" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нераспознанное право: \"%s\"" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "нет доступа к агрегату %s" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "нет доступа к правилу сортировки %s" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "нет доступа к столбцу %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "нет доступа к преобразованию %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "нет доступа к базе данных %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "нет доступа к домену %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "нет доступа к событийному триггеру %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "нет доступа к расширению %s" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "нет доступа к обёртке сторонних данных %s" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "нет доступа к стороннему серверу %s" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "нет доступа к сторонней таблице %s" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "нет доступа к функции %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "нет доступа к индексу %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "нет доступа к языку %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "нет доступа к большому объекту %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "нет доступа к материализованному представлению %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "нет доступа к классу операторов %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "нет доступа к оператору %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "нет доступа к семейству операторов %s" -#: catalog/aclchk.c:3385 +#: 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:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "нет доступа к процедуре %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "нет доступа к публикации %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "нет доступа к подпрограмме %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "нет доступа к схеме %s" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 -#: commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 -#: commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "нет доступа к последовательности %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "нет доступа к объекту статистики %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "нет доступа к подписке %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "нет доступа к таблице %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "нет доступа к табличному пространству %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "нет доступа к конфигурации текстового поиска %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "нет доступа к словарю текстового поиска %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "нет доступа к типу %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "нет доступа к представлению %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "нужно быть владельцем агрегата %s" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "нужно быть владельцем правила сортировки %s" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "нужно быть владельцем преобразования %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "нужно быть владельцем базы %s" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "нужно быть владельцем домена %s" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "нужно быть владельцем событийного триггера %s" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "нужно быть владельцем расширения %s" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "нужно быть владельцем обёртки сторонних данных %s" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "нужно быть \"владельцем\" стороннего сервера %s" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "нужно быть владельцем сторонней таблицы %s" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "нужно быть владельцем функции %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "нужно быть владельцем индекса %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "нужно быть владельцем языка %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "нужно быть владельцем большого объекта %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "нужно быть владельцем материализованного представления %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "нужно быть владельцем класса операторов %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "нужно быть владельцем оператора %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "нужно быть владельцем семейства операторов %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "нужно быть владельцем процедуры %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "нужно быть владельцем публикации %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "нужно быть владельцем подпрограммы %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "нужно быть владельцем последовательности %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "нужно быть владельцем подписки %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "нужно быть владельцем таблицы %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "нужно быть владельцем типа %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "нужно быть владельцем представления %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "нужно быть владельцем схемы %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "нужно быть владельцем объекта статистики %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "нужно быть владельцем табличного пространства %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "нужно быть владельцем конфигурации текстового поиска %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "нужно быть владельцем словаря текстового поиска %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "нужно быть владельцем отношения %s" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "нет доступа к столбцу \"%s\" отношения \"%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 "атрибут %d отношения с OID %u не существует" -#: 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 "отношение с OID %u не существует" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 #, c-format msgid "database with OID %u does not exist" msgstr "база данных с OID %u не существует" -#: 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 "ACL параметра с OID %u не существует" + +#: 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 "функция с OID %u не существует" -#: 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 "язык с OID %u не существует" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: 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 "табличное пространство с OID %u не существует" -#: 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 "обёртка сторонних данных с OID %u не существует" -#: 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 "сторонний сервер с OID %u не существует" -#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:389 -#: utils/cache/typcache.c:444 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "тип с OID %u не существует" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "оператор с OID %u не существует" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "класс операторов с OID %u не существует" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "семейство операторов с OID %u не существует" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "словарь текстового поиска с OID %u не существует" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "конфигурация текстового поиска с OID %u не существует" -#: 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 "событийный триггер с OID %u не существует" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "правило сортировки с OID %u не существует" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "преобразование с OID %u не существует" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "расширение с OID %u не существует" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "публикация с OID %u не существует" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "объект статистики с OID %u не существует" -#: catalog/catalog.c:378 +#: catalog/catalog.c:447 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "продолжается поиск неиспользованного OID в отношении \"%s\"" -#: catalog/catalog.c:380 +#: catalog/catalog.c:449 #, c-format msgid "" "OID candidates have been checked %llu time, but no unused OID has been found " @@ -4700,7 +4971,7 @@ msgstr[2] "" "Потенциальные OID были проверены %llu раз, но неиспользуемые OID ещё не были " "найдены." -#: catalog/catalog.c:405 +#: 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" @@ -4708,57 +4979,57 @@ msgstr[0] "новый OID был назначен в отношении \"%s\" msgstr[1] "новый OID был назначен в отношении \"%s\" после %llu попыток" msgstr[2] "новый OID был назначен в отношении \"%s\" после %llu попыток" -#: catalog/catalog.c:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "выполнять pg_nextoid() может только суперпользователь" +msgid "must be superuser to call %s()" +msgstr "вызывать %s() может только суперпользователь" -#: catalog/catalog.c:544 +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можно использовать только для системных каталогов" -#: catalog/catalog.c:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "индекс \"%s\" не принадлежит таблице \"%s\"" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "столбец \"%s\" имеет тип не oid" -#: catalog/catalog.c:573 +#: 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:538 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "удалить объект %s нельзя, так как он нужен системе баз данных" + +#: catalog/dependency.c:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "удалить объект %s нельзя, так как он нужен объекту %s" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Однако можно удалить %s." -#: 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s зависит от объекта %s" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "удаление распространяется на объект %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4776,36 +5047,35 @@ msgstr[2] "" "\n" "и ещё %d объектов (см. список в протоколе сервера)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "удалить объект %s нельзя, так как от него зависят другие объекты" -#: catalog/dependency.c:1197 catalog/dependency.c:1204 -#: catalog/dependency.c:1216 commands/tablecmds.c:1304 -#: commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 -#: commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1447 utils/misc/guc.c:7128 -#: utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11432 -#: utils/misc/guc.c:11466 utils/misc/guc.c:11500 utils/misc/guc.c:11543 -#: utils/misc/guc.c:11585 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14373 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1421 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11880 +#: utils/misc/guc.c:11914 utils/misc/guc.c:11948 utils/misc/guc.c:11991 +#: utils/misc/guc.c:12033 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Для удаления зависимых объектов используйте DROP ... CASCADE." -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -4813,55 +5083,61 @@ msgstr[0] "удаление распространяется на ещё %d об msgstr[1] "удаление распространяется на ещё %d объекта" msgstr[2] "удаление распространяется на ещё %d объектов" -#: catalog/dependency.c:1882 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "константу типа %s здесь использовать нельзя" -#: catalog/heap.c:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "столбец %d отношения \"%s\" не существует" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "нет прав для создания отношения \"%s.%s\"" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Изменение системного каталога в текущем состоянии запрещено." -#: catalog/heap.c:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 -#: commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6865 #, c-format msgid "tables can have at most %d columns" msgstr "максимальное число столбцов в таблице: %d" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7165 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "имя столбца \"%s\" конфликтует с системным столбцом" -#: catalog/heap.c:543 +#: catalog/heap.c:500 #, 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:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "столбец \"%s\" ключа разбиения имеет псевдотип %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "столбец \"%s\" имеет псевдотип %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, 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:666 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -4869,28 +5145,28 @@ msgstr "" "для входящего в ключ разбиения столбца \"%s\" с сортируемым типом %s не " "удалось получить правило сортировки" -#: catalog/heap.c:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "" "для столбца \"%s\" с сортируемым типом %s не удалось получить правило " "сортировки" -#: catalog/heap.c:1200 catalog/index.c:872 commands/createas.c:408 -#: commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "отношение \"%s\" уже существует" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 #: catalog/pg_type.c:931 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 +#: 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:1217 +#: catalog/heap.c:1165 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -4899,43 +5175,53 @@ msgstr "" "С отношением уже связан тип с таким же именем; выберите имя, не " "конфликтующее с существующими типами." -#: catalog/heap.c:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "значение relfilenode для TOAST не задано в режиме двоичного обновления" + +#: catalog/heap.c:1216 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значение OID кучи в pg_class не задано в режиме двоичного обновления" -#: catalog/heap.c:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "значение relfilenode не задано в режиме двоичного обновления" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к секционированной таблице \"%s\" нельзя" -#: catalog/heap.c:2731 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже существует" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8710 +#: catalog/heap.c:2572 catalog/index.c:889 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8867 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ограничение \"%s\" для отношения \"%s\" уже существует" -#: catalog/heap.c:2908 +#: catalog/heap.c:2579 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2919 +#: catalog/heap.c:2590 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с наследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2929 +#: catalog/heap.c:2600 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -4943,64 +5229,64 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2934 +#: catalog/heap.c:2605 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "слияние ограничения \"%s\" с унаследованным определением" -#: catalog/heap.c:3039 +#: catalog/heap.c:2710 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "использовать генерируемый столбец \"%s\" в выражении генерируемого столбца " "нельзя" -#: catalog/heap.c:3041 +#: catalog/heap.c:2712 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый столбец не может ссылаться на другой генерируемый столбец." -#: catalog/heap.c:3047 +#: catalog/heap.c:2718 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "" "в выражении генерируемого столбца нельзя использовать переменные «вся строка»" -#: catalog/heap.c:3048 +#: catalog/heap.c:2719 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "" "Это сделало бы генерируемый столбец зависимым от собственного значения." -#: catalog/heap.c:3101 +#: catalog/heap.c:2774 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2802 rewrite/rewriteHandler.c:1290 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, но тип выражения по умолчанию %s" -#: catalog/heap.c:3134 commands/prepare.c:368 parser/analyze.c:2684 +#: catalog/heap.c:2807 commands/prepare.c:334 parser/analyze.c:2730 #: parser/parse_target.c:594 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." -#: catalog/heap.c:3181 +#: catalog/heap.c:2854 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ссылаться только на таблицу \"%s\"" -#: catalog/heap.c:3479 +#: catalog/heap.c:3152 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое сочетание внешнего ключа с ON COMMIT" -#: catalog/heap.c:3480 +#: catalog/heap.c:3153 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -5008,107 +5294,113 @@ msgid "" msgstr "" "Таблица \"%s\" ссылается на \"%s\", и для них задан разный режим ON COMMIT." -#: catalog/heap.c:3485 +#: catalog/heap.c:3158 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опустошить таблицу, на которую ссылается внешний ключ, нельзя" -#: catalog/heap.c:3486 +#: catalog/heap.c:3159 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ссылается на \"%s\"." -#: catalog/heap.c:3488 +#: catalog/heap.c:3161 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" "Опустошите таблицу \"%s\" параллельно или используйте TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблица \"%s\" не может иметь несколько первичных ключей" -#: catalog/index.c:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "первичные ключи не могут быть выражениями" -#: catalog/index.c:258 +#: catalog/index.c:259 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "столбец первичного ключа \"%s\" не помечен как NOT NULL" -#: catalog/index.c:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "" "пользовательские индексы в таблицах системного каталога не поддерживаются" -#: catalog/index.c:811 +#: catalog/index.c:814 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "" "недетерминированные правила сортировки не поддерживаются для класса " "операторов \"%s\"" -#: catalog/index.c:826 +#: catalog/index.c:829 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "параллельное создание индекса в таблицах системного каталога не " "поддерживается" -#: catalog/index.c:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "" "параллельное создание индекса для ограничений-исключений не поддерживается" -#: catalog/index.c:844 +#: catalog/index.c:847 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "нельзя создать разделяемые индексы после initdb" -#: catalog/index.c:864 commands/createas.c:423 commands/sequence.c:162 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "отношение \"%s\" уже существует, пропускается" -#: catalog/index.c:914 +#: catalog/index.c:917 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "" "значение OID индекса в pg_class не задано в режиме двоичного обновления" -#: catalog/index.c:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "" +"значение relfilenode для индекса не задано в режиме двоичного обновления" + +#: catalog/index.c:2232 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY должен быть первым действием в транзакции" -#: catalog/index.c:3637 +#: catalog/index.c:3663 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3648 commands/indexcmds.c:3572 +#: catalog/index.c:3674 commands/indexcmds.c:3536 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3664 commands/indexcmds.c:3452 commands/indexcmds.c:3596 -#: commands/tablecmds.c:3273 +#: catalog/index.c:3690 commands/indexcmds.c:3416 commands/indexcmds.c:3560 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "переместить системную таблицу \"%s\" нельзя" -#: catalog/index.c:3808 +#: catalog/index.c:3834 #, c-format msgid "index \"%s\" was reindexed" msgstr "индекс \"%s\" был перестроен" -#: catalog/index.c:3945 +#: catalog/index.c:3971 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" @@ -5116,7 +5408,7 @@ msgstr "" "пропускается" #: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5233 +#: commands/trigger.c:5830 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ссылки между базами не реализованы: \"%s.%s.%s\"" @@ -5131,24 +5423,24 @@ msgstr "для временных таблиц имя схемы не указы msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не удалось получить блокировку таблицы \"%s.%s\"" -#: catalog/namespace.c:402 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 "не удалось получить блокировку таблицы \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "отношение \"%s.%s\" не существует" -#: catalog/namespace.c:435 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 "отношение \"%s\" не существует" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1541 -#: commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 +#: commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "схема для создания объектов не выбрана" @@ -5188,19 +5480,19 @@ msgstr "словарь текстового поиска \"%s\" не сущес msgid "text search template \"%s\" does not exist" msgstr "шаблон текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 +#: catalog/namespace.c:2770 commands/tsearchcmds.c:1127 #: utils/cache/ts_cache.c:613 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "конфигурация текстового поиска \"%s\" не существует" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: catalog/namespace.c:2889 parser/parse_expr.c:817 parser/parse_target.c:1262 -#: gram.y:15103 gram.y:17077 +#: catalog/namespace.c:2889 parser/parse_expr.c:813 parser/parse_target.c:1262 +#: gram.y:18258 gram.y:18298 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" @@ -5216,7 +5508,7 @@ msgid "cannot move objects into or out of TOAST schema" msgstr "перемещать объекты в/из схем TOAST нельзя" #: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 -#: commands/tablecmds.c:1249 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "схема \"%s\" не существует" @@ -5251,238 +5543,242 @@ msgstr "создавать временные таблицы в процессе msgid "cannot create temporary tables during a parallel operation" msgstr "создавать временные таблицы во время параллельных операций нельзя" -#: catalog/namespace.c:4338 commands/tablespace.c:1216 commands/variable.c:64 -#: utils/misc/guc.c:11617 utils/misc/guc.c:11695 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12065 utils/misc/guc.c:12167 #, c-format msgid "List syntax is invalid." msgstr "Ошибка синтаксиса в списке." -#: 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:2160 commands/tablecmds.c:6082 -#: commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12343 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6121 commands/tablecmds.c:16633 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17177 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" -#: catalog/objectaddress.c:1384 commands/matview.c:186 commands/tablecmds.c:261 -#: commands/tablecmds.c:16638 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17182 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 -#: commands/tablecmds.c:6124 commands/tablecmds.c:16643 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17187 #, 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 "" "значение по умолчанию для столбца \"%s\" отношения \"%s\" не существует" -#: 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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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 "оператор %d (%s, %s) из семейства %s не существует" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "функция %d (%s, %s) из семейства %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:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 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 "публикуемое отношение \"%s\" в публикации \"%s\" не существует" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "публикуемая схема \"%s\" в публикации \"%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 "" "ACL по умолчанию для пользователя \"%s\" в схеме \"%s\" для объекта %s не " "существует" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "" "ACL по умолчанию для пользователя \"%s\" и для объекта %s не существует" -#: 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:2247 catalog/objectaddress.c:2331 #, 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:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "длина списка аргументов должна быть не меньше %d" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "длина списка аргументов должна быть равна %d" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "нужно быть владельцем большого объекта %u" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1583 +#: catalog/objectaddress.c:2548 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:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "требуются права суперпользователя" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "требуется право CREATEROLE" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нераспознанный тип объекта \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "столбец %s отношения %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "функция %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "приведение %s к %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "правило сортировки %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "ограничение %s в отношении %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "ограничение %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "преобразование %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "значение по умолчанию для %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "язык %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "большой объект %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "класс операторов %s для метода доступа %s" -#: catalog/objectaddress.c:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "метод доступа %s" @@ -5491,7 +5787,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) из семейства \"%s\": %s" @@ -5500,226 +5796,236 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "правило %s для отношения %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "триггер %s в отношении %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "объект статистики %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "анализатор текстового поиска %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "словарь текстового поиска %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "шаблон текстового поиска %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "конфигурация текстового поиска %s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "база данных %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "табличное пространство %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "обёртка сторонних данных %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "сопоставление для пользователя %s на сервере %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых отношений, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3727 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права по умолчанию для новых отношений, принадлежащих роли %s" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3801 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s в " "схеме %s" -#: catalog/objectaddress.c:3737 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "" "права по умолчанию для новых последовательностей, принадлежащих роли %s" -#: catalog/objectaddress.c:3743 +#: catalog/objectaddress.c:3811 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3747 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права по умолчанию для новых функций, принадлежащих роли %s" -#: catalog/objectaddress.c:3753 +#: catalog/objectaddress.c:3821 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3757 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права по умолчанию для новых типов, принадлежащих роли %s" -#: catalog/objectaddress.c:3763 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права по умолчанию для новых схем, принадлежащих роли %s" -#: catalog/objectaddress.c:3770 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "" "права по умолчанию для новых объектов, принадлежащих роли %s в схеме %s" -#: catalog/objectaddress.c:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "права по умолчанию для новых объектов, принадлежащих роли %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "расширение %s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "событийный триггер %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "параметр %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "политика %s отношения %s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "публикация %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "публикация схемы %s в публикации %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "публикуемое отношение %s в публикации %s" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "подписка %s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "преобразование для %s, языка %s" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "таблица %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "индекс %s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "последовательность %s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "TOAST-таблица %s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "представление %s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "материализованное представление %s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "составной тип %s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "сторонняя таблица %s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "отношение %s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "семейство операторов %s для метода доступа %s" @@ -5772,7 +6078,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "обратная функция перехода %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" @@ -5791,7 +6097,7 @@ msgstr "" msgid "return type of combine function %s is not %s" msgstr "комбинирующая функция %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "" @@ -5808,12 +6114,12 @@ msgstr "функция сериализации %s должна возвраща msgid "return type of deserialization function %s is not %s" msgstr "функция десериализации %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 +#: 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:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 +#: 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\"" @@ -5834,7 +6140,7 @@ msgstr "" "оператор сортировки можно указать только для агрегатных функций с одним " "аргументом" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "тип подпрограммы изменить нельзя" @@ -5859,11 +6165,11 @@ msgstr "\"%s\" — гипотезирующая агрегатная функц msgid "cannot change number of direct arguments of an aggregate function" msgstr "изменить число непосредственных аргументов агрегатной функции нельзя" -#: 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 +#: 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 @@ -5892,38 +6198,88 @@ msgstr "функции %s требуется приведение типов в msgid "cast from type %s to type %s already exists" msgstr "приведение типа %s к типу %s уже существует" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: 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:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "правило сортировки \"%s\" уже существует, пропускается" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "" "правило сортировки \"%s\" для кодировки \"%s\" уже существует, пропускается" -#: catalog/pg_collation.c:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "правило сортировки \"%s\" уже существует" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортировки \"%s\" для кодировки \"%s\" уже существует" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ограничение \"%s\" для домена %s уже существует" -#: 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 "ограничение \"%s\" для таблицы \"%s\" не существует" -#: catalog/pg_constraint.c:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ограничение \"%s\" для домена %s не существует" @@ -5938,23 +6294,23 @@ msgstr "преобразование \"%s\" уже существует" msgid "default conversion for %s to %s already exists" msgstr "преобразование по умолчанию из %s в %s уже существует" -#: catalog/pg_depend.c:218 commands/extension.c:3370 +#: catalog/pg_depend.c:222 commands/extension.c:3289 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s уже относится к расширению \"%s\"" -#: catalog/pg_depend.c:225 catalog/pg_depend.c:276 commands/extension.c:3410 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не относится к расширению \"%s\"" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "" "Расширениям не разрешается заменять объекты, которые им не принадлежат." -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "" "An extension may only use CREATE ... IF NOT EXISTS to skip object creation " @@ -5963,7 +6319,7 @@ msgstr "" "Расширение может выполнять CREATE ... IF NOT EXISTS только для того, чтобы " "не создавать объект, когда оно уже владеет конфликтующим объектом." -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "" @@ -6019,8 +6375,8 @@ msgstr "" "Эта секция отсоединяется параллельно или для неё не была завершена операция " "отсоединения." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4455 -#: commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15489 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -6111,7 +6467,17 @@ msgid "operator cannot be its own negator or sort operator" msgstr "" "оператор не может быть обратным к себе или собственным оператором сортировки" -#: catalog/pg_proc.c:131 parser/parse_func.c:2235 +#: 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" @@ -6119,37 +6485,37 @@ msgstr[0] "функции не могут иметь больше %d аргум msgstr[1] "функции не могут иметь больше %d аргументов" msgstr[2] "функции не могут иметь больше %d аргументов" -#: catalog/pg_proc.c:375 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "функция \"%s\" с аргументами таких типов уже существует" -#: catalog/pg_proc.c:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" — агрегатная функция." -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" — функция." -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" — процедура." -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" — оконная функция." -#: catalog/pg_proc.c:413 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "определить выходные параметры для процедуры нельзя" -#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "изменить тип возврата существующей функции нельзя" @@ -6158,94 +6524,127 @@ msgstr "изменить тип возврата существующей фун #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: 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 +#: 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:445 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметры OUT определяют другой тип строки." -#: catalog/pg_proc.c:489 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "изменить имя входного параметра \"%s\" нельзя" -#: catalog/pg_proc.c:516 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "" "для существующей функции нельзя убрать значения параметров по умолчанию" -#: catalog/pg_proc.c:542 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "" "для существующего значения параметра по умолчанию нельзя изменить тип данных" -#: catalog/pg_proc.c:752 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "встроенной функции \"%s\" нет" -#: catalog/pg_proc.c:850 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL-функции не могут возвращать тип %s" -#: catalog/pg_proc.c:865 +#: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL-функции не могут иметь аргументы типа %s" -#: catalog/pg_proc.c:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-функция \"%s\"" -#: catalog/pg_publication.c:60 +#: 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:66 +#: 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:68 +#: 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:74 +#: 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 "Эта операция не поддерживается для нежурналируемых таблиц." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "Временные и нежурналируемые отношения не поддерживают репликацию." +msgid "cannot add schema \"%s\" to publication" +msgstr "добавить схему \"%s\" в публикацию нельзя" -#: catalog/pg_publication.c:251 +#: catalog/pg_publication.c:103 #, c-format -msgid "relation \"%s\" is already member of publication \"%s\"" -msgstr "отношение \"%s\" уже включено в публикацию \"%s\"" +msgid "This operation is not supported for system schemas." +msgstr "Эта операция не поддерживается для системных схем." -#: catalog/pg_publication.c:533 commands/publicationcmds.c:458 -#: commands/publicationcmds.c:786 +#: catalog/pg_publication.c:111 #, c-format -msgid "publication \"%s\" does not exist" -msgstr "публикация \"%s\" не существует" +msgid "Temporary schemas cannot be replicated." +msgstr "Временные схемы нельзя реплицировать." -#: catalog/pg_shdepend.c:833 +#: catalog/pg_publication.c:374 #, c-format -msgid "" -"\n" +msgid "relation \"%s\" is already member of publication \"%s\"" +msgstr "отношение \"%s\" уже включено в публикацию \"%s\"" + +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "" +"в списке публикуемых столбцов нельзя использовать системный столбец \"%s\"" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use 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:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "публикация \"%s\" не существует" + +#: catalog/pg_shdepend.c:829 +#, c-format +msgid "" +"\n" "and objects in %d other database (see server log for list)" msgid_plural "" "\n" @@ -6260,43 +6659,43 @@ msgstr[2] "" "\n" "и объекты в %d других базах данных (см. список в протоколе сервера)" -#: catalog/pg_shdepend.c:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u удалена другим процессом" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличное пространство %u удалено другим процессом" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "база данных %u удалена другим процессом" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "владелец объекта %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "права доступа к объекту %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "субъект политики %s" -#: catalog/pg_shdepend.c:1263 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "табличное пространство для %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1271 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -6304,7 +6703,7 @@ msgstr[0] "%d объект (%s)" msgstr[1] "%d объекта (%s)" msgstr[2] "%d объектов (%s)" -#: catalog/pg_shdepend.c:1382 +#: catalog/pg_shdepend.c:1331 #, c-format msgid "" "cannot drop objects owned by %s because they are required by the database " @@ -6313,7 +6712,7 @@ msgstr "" "удалить объекты, принадлежащие роли %s, нельзя, так как они нужны системе " "баз данных" -#: catalog/pg_shdepend.c:1529 +#: catalog/pg_shdepend.c:1477 #, c-format msgid "" "cannot reassign ownership of objects owned by %s because they are required " @@ -6322,18 +6721,18 @@ msgstr "" "изменить владельца объектов, принадлежащих роли %s, нельзя, так как они " "нужны системе баз данных" -#: catalog/pg_subscription.c:174 commands/subscriptioncmds.c:779 -#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "подписка \"%s\" не существует" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "удалить сопоставление отношений для подписки \"%s\" не получилось" -#: 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 " @@ -6343,7 +6742,7 @@ msgstr "Выполняется синхронизация отношения \"% #. 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 " @@ -6380,7 +6779,7 @@ msgstr "внутренний размер %d не подходит для тип msgid "alignment \"%c\" is invalid for variable-length type" msgstr "выравнивание \"%c\" не подходит для типа переменной длины" -#: catalog/pg_type.c:328 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типов постоянного размера применим только режим хранения PLAIN" @@ -6404,17 +6803,11 @@ msgstr "" "Имя мультидиапазонного типа можно указать вручную, воспользовавшись " "атрибутом \"multirange_type_name\"." -#: catalog/storage.c:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неверная страница в блоке %u отношения %s" -#: catalog/toasting.c:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 -#: commands/tablecmds.c:16498 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\" - это не таблица и не материализованное представление" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -6500,7 +6893,7 @@ msgid "" "must specify both or neither of serialization and deserialization functions" msgstr "функции сериализации и десериализации должны задаваться совместно" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "" @@ -6518,12 +6911,12 @@ msgstr "" 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:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" @@ -6533,12 +6926,12 @@ msgstr "сервер \"%s\" уже существует" msgid "language \"%s\" already exists" msgstr "язык \"%s\" уже существует" -#: commands/alter.c:96 commands/publicationcmds.c:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "подписка \"%s\" уже существует" @@ -6578,7 +6971,7 @@ msgstr "конфигурация текстового поиска \"%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 нужно быть суперпользователем" @@ -6598,7 +6991,7 @@ msgstr "Для создания метода доступа нужно быть msgid "access method \"%s\" already exists" msgstr "метод доступа \"%s\" уже существует" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6610,45 +7003,45 @@ msgid "handler function is not specified" msgstr "не указана функция-обработчик" #: 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 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:714 +#: parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "функция %s должна возвращать тип %s" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\" пропускается --- анализировать эту стороннюю таблицу нельзя" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "" "\"%s\" пропускается --- анализировать не таблицы или специальные системные " "таблицы нельзя" -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "анализируется дерево наследования \"%s.%s\"" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "анализируется \"%s.%s\"" -#: commands/analyze.c:395 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "столбец \"%s\" отношения \"%s\" указан неоднократно" -#: commands/analyze.c:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "автоматический анализ таблицы \"%s.%s.%s\"\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, c-format msgid "" "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead " @@ -6658,7 +7051,7 @@ msgstr "" "%.0f, \"мёртвых\" строк: %.0f; строк в выборке: %d, примерное общее число " "строк: %.0f" -#: commands/analyze.c:1436 +#: commands/analyze.c:1418 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6667,7 +7060,7 @@ msgstr "" "пропускается анализ дерева наследования \"%s.%s\" --- это дерево " "наследования не содержит дочерних таблиц" -#: commands/analyze.c:1534 +#: commands/analyze.c:1516 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6704,12 +7097,12 @@ msgstr "" msgid "too many notifications in the NOTIFY queue" msgstr "слишком много уведомлений в очереди NOTIFY" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "очередь NOTIFY заполнена на %.0f%%" -#: commands/async.c:1618 +#: commands/async.c:1604 #, c-format msgid "" "The server process with PID %d is among those with the oldest transactions." @@ -6717,7 +7110,7 @@ msgstr "" "В число серверных процессов с самыми старыми транзакциями входит процесс с " "PID %d." -#: commands/async.c:1621 +#: commands/async.c:1607 #, c-format msgid "" "The NOTIFY queue cannot be emptied until that process ends its current " @@ -6726,47 +7119,42 @@ msgstr "" "Очередь NOTIFY можно будет освободить, только когда этот процесс завершит " "текущую транзакцию." -#: commands/cluster.c:119 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "нераспознанный параметр CLUSTER: \"%s\"" -#: commands/cluster.c:147 commands/cluster.c:395 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "кластеризовать временные таблицы других сеансов нельзя" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "кластеризовать секционированную таблицу нельзя" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:187 commands/tablecmds.c:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14187 commands/tablecmds.c:16068 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "кластеризовать разделяемый каталог нельзя" -#: commands/cluster.c:399 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16078 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" -#: commands/cluster.c:479 +#: commands/cluster.c:519 #, c-format msgid "" "cannot cluster on index \"%s\" because access method does not support " @@ -6774,41 +7162,46 @@ msgid "" msgstr "" "кластеризация по индексу \"%s\" невозможна, её не поддерживает метод доступа" -#: commands/cluster.c:491 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "кластеризовать по частичному индексу \"%s\" нельзя" -#: commands/cluster.c:505 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "нельзя кластеризовать таблицу по неверному индексу \"%s\"" -#: commands/cluster.c:529 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "пометить индекс как кластеризованный в секционированной таблице нельзя" -#: commands/cluster.c:902 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "кластеризация \"%s.%s\" путём сканирования индекса \"%s\"" -#: commands/cluster.c:908 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "" "кластеризация \"%s.%s\" путём последовательного сканирования и сортировки" -#: commands/cluster.c:939 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "очистка \"%s.%s\"" + +#: commands/cluster.c:985 #, c-format msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +"\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "" -"\"%s\": найдено удаляемых версий строк: %.0f, неудаляемых - %.0f, " +"\"%s.%s\": найдено удаляемых версий строк: %.0f, неудаляемых: %.0f, " "просмотрено страниц: %u" -#: commands/cluster.c:943 +#: commands/cluster.c:990 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6822,104 +7215,127 @@ msgstr "" msgid "collation attribute \"%s\" not recognized" msgstr "атрибут COLLATION \"%s\" не распознан" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 +#: commands/define.c:389 commands/tablecmds.c:7812 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, 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." + +#: 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:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераспознанный провайдер правил сортировки: %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "необходимо указать параметр \"lc_collate\"" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "необходимо указать параметр \"lc_ctype\"" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "необходимо указать параметр \"locale\"" + +#: commands/collationcmds.c:256 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "" "недетерминированные правила сортировки не поддерживаются данным провайдером" -#: commands/collationcmds.c:227 +#: commands/collationcmds.c:275 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "кодировка текущей БД не поддерживается данным провайдером" -#: commands/collationcmds.c:285 +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "" "правило сортировки \"%s\" для кодировки \"%s\" уже существует в схеме \"%s\"" -#: commands/collationcmds.c:296 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило сортировки \"%s\" уже существует в схеме \"%s\"" -#: commands/collationcmds.c:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 #, c-format msgid "changing version from %s to %s" msgstr "изменение версии с %s на %s" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 #, c-format msgid "version has not changed" msgstr "версия не была изменена" -#: commands/collationcmds.c:473 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не удалось получить из названия локали \"%s\" метку языка: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "" "импортировать системные правила сортировки может только суперпользователь" -#: commands/collationcmds.c:559 commands/copyfrom.c:1506 commands/copyto.c:680 +#: commands/collationcmds.c:618 commands/copyfrom.c:1509 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:690 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "пригодные системные локали не найдены" -#: commands/comment.c:61 commands/dbcommands.c:853 commands/dbcommands.c:1064 -#: commands/dbcommands.c:1177 commands/dbcommands.c:1367 -#: commands/dbcommands.c:1615 commands/dbcommands.c:1737 -#: commands/dbcommands.c:2177 utils/init/postinit.c:887 -#: utils/init/postinit.c:993 utils/init/postinit.c:1019 +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 +#: commands/dbcommands.c:1874 commands/dbcommands.c:2068 +#: commands/dbcommands.c:2310 commands/dbcommands.c:2405 +#: commands/dbcommands.c:2515 commands/dbcommands.c:3014 +#: utils/init/postinit.c:947 utils/init/postinit.c:1011 +#: utils/init/postinit.c:1083 #, c-format msgid "database \"%s\" does not exist" msgstr "база данных \"%s\" не существует" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:990 +#: 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:1948 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "функция \"%s\" была вызвана не менеджером триггеров" -#: 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 "функция \"%s\" должна запускаться в триггере AFTER для строк" @@ -6960,11 +7376,11 @@ msgstr "" #: 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" +"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" +"или иметь права роли pg_execute_server_program" #: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 #, c-format @@ -6978,20 +7394,20 @@ msgstr "" #: 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" +"must be superuser or have privileges of the pg_read_server_files role to " +"COPY from a file" msgstr "" -"для выполнения COPY с чтением файла нужно быть суперпользователем или членом " -"роли pg_read_server_files" +"для выполнения COPY с чтением файла нужно быть суперпользователем или иметь " +"права роли pg_read_server_files" #: 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" +"must be superuser or have privileges of the pg_write_server_files role to " +"COPY to a file" msgstr "" -"для выполнения COPY с записью в файл нужно быть суперпользователем или " -"членом роли pg_write_server_files" +"для выполнения COPY с записью в файл нужно быть суперпользователем или иметь " +"права роли pg_write_server_files" #: commands/copy.c:188 #, c-format @@ -7003,218 +7419,233 @@ msgstr "COPY FROM не поддерживается с защитой на ур msgid "Use INSERT statements instead." msgstr "Используйте операторы INSERT." -#: commands/copy.c:377 +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "MERGE не поддерживается в COPY" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "использовать \"%s\" с параметром HEADER в COPY TO нельзя" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s требует логическое значение или \"match\"" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "формат \"%s\" для COPY не распознан" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 -#: commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом параметра \"%s\" должен быть список имён столбцов" -#: commands/copy.c:518 +#: commands/copy.c:553 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом параметра \"%s\" должно быть название допустимой кодировки" -#: commands/copy.c:525 commands/dbcommands.c:254 commands/dbcommands.c:1563 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не распознан" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "в режиме BINARY нельзя указывать DELIMITER" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "в режиме BINARY нельзя указывать NULL" -#: commands/copy.c:564 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "разделитель для COPY должен быть однобайтным символом" -#: commands/copy.c:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "" "разделителем для COPY не может быть символ новой строки или возврата каретки" -#: commands/copy.c:577 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "" "представление NULL для COPY не может включать символ новой строки или " "возврата каретки" -#: commands/copy.c:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "\"%s\" не может быть разделителем для COPY" -#: commands/copy.c:600 +#: commands/copy.c:635 #, 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:606 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "определить кавычки для COPY можно только в режиме CSV" -#: commands/copy.c:611 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "символ кавычек для COPY должен быть однобайтным" -#: commands/copy.c:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "символ кавычек для COPY должен отличаться от разделителя" -#: commands/copy.c:622 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "определить спецсимвол для COPY можно только в режиме CSV" -#: commands/copy.c:627 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "спецсимвол для COPY должен быть однобайтным" -#: commands/copy.c:633 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "параметр force quote для COPY можно использовать только в режиме CSV" -#: commands/copy.c:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "параметр force quote для COPY можно использовать только с COPY TO" -#: commands/copy.c:643 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "" "параметр force not null для COPY можно использовать только в режиме CSV" -#: commands/copy.c:647 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "параметр force not null для COPY можно использовать только с COPY FROM" -#: commands/copy.c:653 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "параметр force null для COPY можно использовать только в режиме CSV" -#: commands/copy.c:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "параметр force null для COPY можно использовать только с COPY FROM" -#: commands/copy.c:664 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "разделитель для COPY не должен присутствовать в представлении NULL" -#: commands/copy.c:671 +#: commands/copy.c:706 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "символ кавычек в CSV не должен присутствовать в представлении NULL" -#: commands/copy.c:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "столбец \"%s\" — генерируемый" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Генерируемые столбцы нельзя использовать в COPY." -#: commands/copy.c:749 commands/indexcmds.c:1859 commands/statscmds.c:245 -#: commands/tablecmds.c:2347 commands/tablecmds.c:3003 -#: commands/tablecmds.c:3496 parser/parse_relation.c:3642 -#: parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1826 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "столбец \"%s\" не существует" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 #: parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "столбец \"%s\" указан неоднократно" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, строка %s, столбец %s" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, строка %llu, столбец %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, строка %s" +msgid "COPY %s, line %llu" +msgstr "COPY %s, строка %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, строка %s, столбец %s: \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, строка %llu, столбец %s: \"%s\"" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, строка %s, столбец %s: значение NULL" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, строка %llu, столбец %s: значение NULL" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, строка %s: \"%s\"" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, строка %llu: \"%s\"" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "копировать в представление \"%s\" нельзя" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "" "Чтобы представление допускало копирование данных в него, установите триггер " "INSTEAD OF INSERT." -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "копировать в материализованное представление \"%s\" нельзя" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "копировать в последовательность \"%s\" нельзя" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "копировать в отношение \"%s\", не являющееся таблицей, нельзя" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "выполнить COPY FREEZE в секционированной таблице нельзя" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "выполнить COPY FREEZE нельзя из-за предыдущей активности в транзакции" -#: commands/copyfrom.c:643 +#: commands/copyfrom.c:646 #, c-format msgid "" "cannot perform COPY FREEZE because the table was not created or truncated in " @@ -7223,24 +7654,24 @@ msgstr "" "выполнить COPY FREEZE нельзя, так как таблица не была создана или усечена в " "текущей подтранзакции" -#: commands/copyfrom.c:1264 commands/copyto.c:612 +#: commands/copyfrom.c:1270 commands/copyto.c:611 #, 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 +#: commands/copyfrom.c:1293 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "столбец FORCE_NULL \"%s\" не фигурирует в COPY" -#: commands/copyfrom.c:1340 utils/mb/mbutils.c:385 +#: commands/copyfrom.c:1346 utils/mb/mbutils.c:385 #, c-format msgid "" "default conversion function for encoding \"%s\" to \"%s\" does not exist" msgstr "" "стандартной функции преобразования из кодировки \"%s\" в \"%s\" не существует" -#: commands/copyfrom.c:1525 +#: commands/copyfrom.c:1528 #, c-format msgid "" "COPY FROM instructs the PostgreSQL server process to read a file. You may " @@ -7250,260 +7681,282 @@ msgstr "" "файла. Возможно, на самом деле вам нужно клиентское средство, например, " "\\copy в psql." -#: commands/copyfrom.c:1538 commands/copyto.c:732 +#: commands/copyfrom.c:1541 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\" - это каталог" -#: commands/copyfrom.c:1606 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1609 commands/copyto.c:301 libpq/be-secure-common.c:105 #, c-format msgid "could not close pipe to external command: %m" msgstr "не удалось закрыть канал сообщений с внешней командой: %m" -#: commands/copyfrom.c:1621 commands/copyto.c:307 +#: commands/copyfrom.c:1624 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "сбой программы \"%s\"" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "подпись COPY-файла не распознана" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "неверный заголовок файла COPY (отсутствуют флаги)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "неверный заголовок файла COPY (WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "не распознаны важные флаги в заголовке файла COPY" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "неверный заголовок файла COPY (отсутствует длина)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "неверный заголовок файла COPY (неправильная длина)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "не удалось прочитать файл COPY: %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 -#: tcop/postgres.c:359 +#: 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 "неожиданный обрыв соединения с клиентом при открытой транзакции" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "неожиданный тип сообщения 0x%02X при вводе данных COPY из stdin" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "ошибка при вводе данных COPY из stdin: %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1446 -#: commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "неверное число полей в строке заголовка: %d, ожидалось: %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "" +"column name mismatch in header line field %d: got null value (\"%s\"), " +"expected \"%s\"" +msgstr "" +"несоответствие имени столбца в поле %d строки заголовка: получено значение " +"null (\"%s\"), ожидалось \"%s\"" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "" +"column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "" +"несоответствие имени столбца в поле %d строки заголовка: получено \"%s\", " +"ожидалось \"%s\"" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "лишние данные после содержимого последнего столбца" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "нет данных для столбца \"%s\"" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "после маркера конца файла продолжаются данные COPY" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "количество полей в строке: %d, ожидалось: %d" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "в данных обнаружен явный возврат каретки" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "в данных обнаружен возврат каретки не в кавычках" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Представьте возврат каретки как \"\\r\"." -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Заключите возврат каретки в кавычки CSV." -#: commands/copyfromparse.c:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "в данных обнаружен явный символ новой строки" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "в данных обнаружен явный символ новой строки не в кавычках" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Представьте символ новой строки как \"\\n\"." -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Заключите символ новой строки в кавычки CSV." -#: commands/copyfromparse.c:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"конец копии\" не соответствует предыдущему стилю новой строки" -#: commands/copyfromparse.c:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"конец копии\" испорчен" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "незавершённое поле в кавычках CSV" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "неожиданный конец данных COPY" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "неверный размер поля" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "неверный двоичный формат данных" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "не удалось записать в канал программы COPY: %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "не удалось записать в файл COPY: %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "копировать из представления \"%s\" нельзя" -#: 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 "Попробуйте вариацию COPY (SELECT ...) TO." -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "копировать из материализованного представления \"%s\" нельзя" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "копировать из сторонней таблицы \"%s\" нельзя" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "копировать из последовательности \"%s\" нельзя" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "копировать из секционированной таблицы \"%s\" нельзя" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "копировать из отношения \"%s\", не являющегося таблицей, нельзя" -#: commands/copyto.c:451 +#: commands/copyto.c:450 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "правила DO INSTEAD NOTHING не поддерживаются с COPY" -#: commands/copyto.c:465 +#: commands/copyto.c:464 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "условные правила DO INSTEAD не поддерживаются с COPY" -#: commands/copyto.c:469 +#: commands/copyto.c:468 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "правила DO ALSO не поддерживаются с COPY" -#: commands/copyto.c:474 +#: commands/copyto.c:473 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "составные правила DO INSTEAD не поддерживаются с COPY" -#: commands/copyto.c:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) не поддерживается" -#: commands/copyto.c:501 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "в запросе COPY должно быть предложение RETURNING" -#: commands/copyto.c:530 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "отношение, задействованное в операторе COPY, изменилось" -#: commands/copyto.c:589 +#: commands/copyto.c:588 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "столбец FORCE_QUOTE \"%s\" не фигурирует в COPY" -#: commands/copyto.c:697 +#: commands/copyto.c:696 #, c-format msgid "relative path not allowed for COPY to file" msgstr "при выполнении COPY в файл нельзя указывать относительный путь" -#: commands/copyto.c:716 +#: commands/copyto.c:715 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не удалось открыть файл \"%s\" для записи: %m" -#: commands/copyto.c:719 +#: commands/copyto.c:718 #, c-format msgid "" "COPY TO instructs the PostgreSQL server process to write a file. You may " @@ -7523,74 +7976,104 @@ msgstr "указано слишком много имён столбцов" msgid "policies not yet implemented for this command" msgstr "политики для этой команды ещё не реализованы" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION больше не поддерживается" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Рассмотрите возможность использования табличных пространств." -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE нельзя указать вместе с LC_COLLATE или LC_CTYPE." +msgid "OIDs less than %u are reserved for system objects" +msgstr "значения OID меньше %u зарезервированы для системных объектов" -#: commands/dbcommands.c:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d не является верным кодом кодировки" -#: commands/dbcommands.c:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s не является верным названием кодировки" -#: commands/dbcommands.c:315 commands/dbcommands.c:1596 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "нераспознанный провайдер локали: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "неверный предел подключений: %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "нет прав на создание базы данных" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "шаблон базы данных \"%s\" не существует" -#: commands/dbcommands.c:367 +#: commands/dbcommands.c:975 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "использовать некорректную базу \"%s\" в качестве шаблона нельзя" -#: commands/dbcommands.c:368 commands/dbcommands.c:1625 -#: utils/init/postinit.c:1002 +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 +#: utils/init/postinit.c:1026 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Выполните DROP DATABASE для удаления некорректных баз данных." -#: commands/dbcommands.c:379 +#: commands/dbcommands.c:987 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "нет прав на копирование базы данных \"%s\"" -#: commands/dbcommands.c:395 +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "неверная стратегия создания БД \"%s\"" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Возможные стратегии: \"wal_log\" и \"file_copy\"." + +#: commands/dbcommands.c:1024 #, c-format msgid "invalid server encoding %d" msgstr "неверная кодировка для сервера: %d" -#: commands/dbcommands.c:401 commands/dbcommands.c:406 +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 #, c-format msgid "invalid locale name: \"%s\"" msgstr "неверное имя локали: \"%s\"" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "кодировка \"%s\" не поддерживается провайдером ICU" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "необходимо задать локаль ICU" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "локаль ICU можно указать, только если выбран провайдер локали ICU" + +#: commands/dbcommands.c:1082 #, c-format msgid "" "new encoding (%s) is incompatible with the encoding of the template database " @@ -7598,7 +8081,7 @@ msgid "" msgstr "" "новая кодировка (%s) несовместима с кодировкой шаблона базы данных (%s)" -#: commands/dbcommands.c:429 +#: commands/dbcommands.c:1085 #, c-format msgid "" "Use the same encoding as in the template database, or use template0 as " @@ -7607,7 +8090,7 @@ msgstr "" "Используйте кодировку шаблона базы данных или выберите в качестве шаблона " "template0." -#: commands/dbcommands.c:434 +#: commands/dbcommands.c:1090 #, c-format msgid "" "new collation (%s) is incompatible with the collation of the template " @@ -7616,7 +8099,7 @@ msgstr "" "новое правило сортировки (%s) несовместимо с правилом в шаблоне базы данных " "(%s)" -#: commands/dbcommands.c:436 +#: commands/dbcommands.c:1092 #, c-format msgid "" "Use the same collation as in the template database, or use template0 as " @@ -7625,7 +8108,7 @@ msgstr "" "Используйте то же правило сортировки, что и в шаблоне базы данных, или " "выберите в качестве шаблона template0." -#: commands/dbcommands.c:441 +#: commands/dbcommands.c:1097 #, c-format msgid "" "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database " @@ -7634,7 +8117,7 @@ msgstr "" "новый параметр LC_CTYPE (%s) несовместим с LC_CTYPE в шаблоне базы данных " "(%s)" -#: commands/dbcommands.c:443 +#: commands/dbcommands.c:1099 #, c-format msgid "" "Use the same LC_CTYPE as in the template database, or use template0 as " @@ -7643,18 +8126,87 @@ msgstr "" "Используйте тот же LC_CTYPE, что и в шаблоне базы данных, или выберите в " "качестве шаблона template0." -#: commands/dbcommands.c:465 commands/dbcommands.c:1223 +#: commands/dbcommands.c:1104 +#, c-format +msgid "" +"new locale provider (%s) does not match locale provider of the template " +"database (%s)" +msgstr "" +"новый провайдер локали (%s) не соответствует провайдеру локали в базе-" +"шаблоне (%s)" + +#: commands/dbcommands.c:1106 +#, c-format +msgid "" +"Use the same locale provider as in the template database, or use template0 " +"as template." +msgstr "" +"Используйте тот же провайдер локали, что и в базе-шаблоне, или выберите в " +"качестве шаблона template0." + +#: commands/dbcommands.c:1115 +#, 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:1117 +#, c-format +msgid "" +"Use the same ICU locale as in the template database, or use template0 as " +"template." +msgstr "" +"Используйте ту же локаль ICU, что и в базе-шаблоне, или выберите в качестве " +"шаблона template0." + +#: commands/dbcommands.c:1140 +#, c-format +msgid "" +"template database \"%s\" has a collation version, but no actual collation " +"version could be determined" +msgstr "" +"в шаблоне \"%s\" имеется версия правила сортировки, но фактическую версию " +"правила сортировки определить нельзя" + +#: commands/dbcommands.c:1145 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "" +"в базе-шаблоне \"%s\" обнаружено несоответствие версии правила сортировки" + +#: commands/dbcommands.c:1147 +#, 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:1150 +#, 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:1186 commands/dbcommands.c:1920 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "" "pg_global нельзя использовать в качестве табличного пространства по умолчанию" -#: commands/dbcommands.c:491 +#: commands/dbcommands.c:1212 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "не удалось назначить новое табличное пространство по умолчанию \"%s\"" -#: commands/dbcommands.c:493 +#: commands/dbcommands.c:1214 #, c-format msgid "" "There is a conflict because database \"%s\" already has some tables in this " @@ -7663,52 +8215,62 @@ msgstr "" "База данных \"%s\" содержит таблицы, которые уже находятся в этом табличном " "пространстве." -#: commands/dbcommands.c:523 commands/dbcommands.c:1093 +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 #, c-format msgid "database \"%s\" already exists" msgstr "база данных \"%s\" уже существует" -#: commands/dbcommands.c:537 +#: commands/dbcommands.c:1258 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "исходная база \"%s\" занята другими пользователями" -#: commands/dbcommands.c:780 commands/dbcommands.c:795 +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "OID базы данных %u уже используется базой данных \"%s\"" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "каталог данных с указанным OID %u уже существует" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодировка \"%s\" не соответствует локали \"%s\"" -#: commands/dbcommands.c:783 +#: commands/dbcommands.c:1460 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Для выбранного параметра LC_CTYPE требуется кодировка \"%s\"." -#: commands/dbcommands.c:798 +#: commands/dbcommands.c:1475 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Для выбранного параметра LC_COLLATE требуется кодировка \"%s\"." -#: commands/dbcommands.c:860 +#: commands/dbcommands.c:1556 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "база данных \"%s\" не существует, пропускается" -#: commands/dbcommands.c:884 +#: commands/dbcommands.c:1580 #, c-format msgid "cannot drop a template database" msgstr "удалить шаблон базы данных нельзя" -#: commands/dbcommands.c:890 +#: commands/dbcommands.c:1586 #, c-format msgid "cannot drop the currently open database" msgstr "удалить базу данных, открытую в данный момент, нельзя" -#: commands/dbcommands.c:903 +#: commands/dbcommands.c:1599 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "база \"%s\" используется активным слотом логической репликации" -#: commands/dbcommands.c:905 +#: commands/dbcommands.c:1601 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." @@ -7716,12 +8278,12 @@ msgstr[0] "Обнаружен %d активный слот." msgstr[1] "Обнаружены %d активных слота." msgstr[2] "Обнаружено %d активных слотов." -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:1615 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "база \"%s\" используется в подписке с логической репликацией" -#: commands/dbcommands.c:921 +#: commands/dbcommands.c:1617 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." @@ -7729,36 +8291,36 @@ msgstr[0] "Обнаружена %d подписка." msgstr[1] "Обнаружены %d подписки." msgstr[2] "Обнаружено %d подписок." -#: commands/dbcommands.c:942 commands/dbcommands.c:1115 -#: commands/dbcommands.c:1245 +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 +#: commands/dbcommands.c:1942 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "база данных \"%s\" занята другими пользователями" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1772 #, c-format msgid "permission denied to rename database" msgstr "нет прав на переименование базы данных" -#: commands/dbcommands.c:1104 +#: commands/dbcommands.c:1801 #, c-format msgid "current database cannot be renamed" msgstr "нельзя переименовать текущую базу данных" -#: commands/dbcommands.c:1201 +#: commands/dbcommands.c:1898 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "" "изменить табличное пространство открытой в данный момент базы данных нельзя" -#: commands/dbcommands.c:1304 +#: commands/dbcommands.c:2004 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "некоторые отношения базы данных \"%s\" уже находятся в табличном " "пространстве \"%s\"" -#: commands/dbcommands.c:1306 +#: commands/dbcommands.c:2006 #, c-format msgid "" "You must move them back to the database's default tablespace before using " @@ -7767,38 +8329,38 @@ msgstr "" "Прежде чем выполнять эту команду, вы должны вернуть их назад в табличное " "пространство по умолчанию для этой базы данных." -#: commands/dbcommands.c:1431 commands/dbcommands.c:2015 -#: commands/dbcommands.c:2314 commands/dbcommands.c:2400 +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 +#: commands/dbcommands.c:3152 commands/dbcommands.c:3266 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "в старом каталоге базы данных \"%s\" могли остаться ненужные файлы" -#: commands/dbcommands.c:1487 +#: commands/dbcommands.c:2194 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "нераспознанный параметр DROP DATABASE: \"%s\"" -#: commands/dbcommands.c:1577 +#: commands/dbcommands.c:2272 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "параметр \"%s\" нельзя задать с другими параметрами" -#: commands/dbcommands.c:1624 +#: commands/dbcommands.c:2319 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "изменить свойства некорректной базы \"%s\" нельзя" -#: commands/dbcommands.c:1641 +#: commands/dbcommands.c:2336 #, c-format msgid "cannot disallow connections for current database" msgstr "запретить подключения к текущей базе данных нельзя" -#: commands/dbcommands.c:1777 +#: commands/dbcommands.c:2555 #, c-format msgid "permission denied to change owner of database" msgstr "нет прав на изменение владельца базы данных" -#: commands/dbcommands.c:2121 +#: commands/dbcommands.c:2958 #, c-format msgid "" "There are %d other session(s) and %d prepared transaction(s) using the " @@ -7807,7 +8369,7 @@ msgstr "" "С этой базой данных связаны другие сеансы (%d) и подготовленные транзакции " "(%d)." -#: commands/dbcommands.c:2124 +#: commands/dbcommands.c:2961 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." @@ -7815,7 +8377,7 @@ msgstr[0] "Эта база данных используется ещё в %d с msgstr[1] "Эта база данных используется ещё в %d сеансах." msgstr[2] "Эта база данных используется ещё в %d сеансах." -#: commands/dbcommands.c:2129 storage/ipc/procarray.c:3895 +#: commands/dbcommands.c:2966 storage/ipc/procarray.c:3847 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -7823,56 +8385,56 @@ msgstr[0] "С этой базой данных связана %d подгото msgstr[1] "С этой базой данных связаны %d подготовленные транзакции." msgstr[2] "С этой базой данных связаны %d подготовленных транзакций." -#: commands/dbcommands.c:2271 +#: commands/dbcommands.c:3108 #, c-format msgid "missing directory \"%s\"" msgstr "отсутствует каталог \"%s\"" -#: commands/dbcommands.c:2330 commands/tablespace.c:188 -#: commands/tablespace.c:634 +#: commands/dbcommands.c:3168 commands/tablespace.c:190 +#: commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "не удалось получить информацию о каталоге \"%s\": %m" -#: 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:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, 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 commands/define.c:225 commands/define.c:243 #, 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 требует логическое значение" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 #, c-format msgid "%s requires an integer value" msgstr "%s требует целое значение" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "аргументом %s должно быть имя" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" msgstr "аргументом %s должно быть имя типа" -#: commands/define.c:318 +#: commands/define.c:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "неверный аргумент для %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 -#: utils/adt/ruleutils.c:2832 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2928 #, c-format msgid "\"%s\" is an aggregate function" msgstr "функция \"%s\" является агрегатной" @@ -7882,19 +8444,19 @@ msgstr "функция \"%s\" является агрегатной" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Используйте DROP AGGREGATE для удаления агрегатных функций." -#: commands/dropcmds.c:158 commands/sequence.c:455 commands/tablecmds.c:3580 -#: commands/tablecmds.c:3738 commands/tablecmds.c:3791 -#: commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16495 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схема \"%s\" не существует, пропускается" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "тип \"%s\" не существует, пропускается" @@ -7914,7 +8476,7 @@ msgstr "правило сортировки \"%s\" не существует, п msgid "conversion \"%s\" does not exist, skipping" msgstr "преобразование \"%s\" не существует, пропускается" -#: commands/dropcmds.c:293 commands/statscmds.c:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "объект статистики \"%s\" не существует, пропускается" @@ -8009,7 +8571,7 @@ msgstr "правило \"%s\" для отношения \"%s\" не сущест msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка сторонних данных \"%s\" не существует, пропускается" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "сервер \"%s\" не существует, пропускается" @@ -8090,12 +8652,12 @@ 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:1862 +#: commands/event_trigger.c:1834 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции" @@ -8120,7 +8682,7 @@ msgstr "параметр WAL оператора EXPLAIN требует указ msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "параметр TIMING оператора EXPLAIN требует указания ANALYZE" -#: commands/extension.c:173 commands/extension.c:3032 +#: commands/extension.c:173 commands/extension.c:2954 #, c-format msgid "extension \"%s\" does not exist" msgstr "расширение \"%s\" не существует" @@ -8178,91 +8740,109 @@ 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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" требует логическое значение" -#: 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 "нераспознанный параметр \"%s\" в файле \"%s\"" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "" "параметр \"schema\" не может быть указан вместе с \"relocatable\" = true" -#: 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:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "нет прав на создание расширения \"%s\"" -#: commands/extension.c:865 +#: commands/extension.c:876 #, c-format msgid "" "Must have CREATE privilege on current database to create this extension." msgstr "Для создания этого расширения нужно иметь право CREATE в текущей базе." -#: commands/extension.c:866 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Для создания этого расширения нужно быть суперпользователем." -#: commands/extension.c:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "нет прав на изменение расширения \"%s\"" -#: commands/extension.c:873 +#: commands/extension.c:884 #, c-format msgid "" "Must have CREATE privilege on current database to update this extension." msgstr "" "Для обновления этого расширения нужно иметь право CREATE в текущей базе." -#: commands/extension.c:874 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Для изменения этого расширения нужно быть суперпользователем." -#: commands/extension.c:1003 +#: commands/extension.c:1018 #, c-format msgid "invalid character in extension owner: must not contain any of \"%s\"" msgstr "" "недопустимый символ в имени владельца расширения: имя не должно содержать " "\"%s\"" -#: commands/extension.c:1027 +#: commands/extension.c:1042 #, c-format msgid "" "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" @@ -8270,7 +8850,7 @@ msgstr "" "недопустимый символ в имени схемы расширения \"%s\": имя не должно содержать " "\"%s\"" -#: commands/extension.c:1222 +#: commands/extension.c:1237 #, c-format msgid "" "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" @@ -8278,12 +8858,12 @@ msgstr "" "для расширения \"%s\" не определён путь обновления с версии \"%s\" до версии " "\"%s\"" -#: commands/extension.c:1430 commands/extension.c:3093 +#: commands/extension.c:1445 commands/extension.c:3012 #, c-format msgid "version to install must be specified" msgstr "нужно указать версию для установки" -#: commands/extension.c:1467 +#: commands/extension.c:1482 #, c-format msgid "" "extension \"%s\" has no installation script nor update path for version " @@ -8292,71 +8872,71 @@ msgstr "" "для расширения \"%s\" не определён путь установки или обновления для версии " "\"%s\"" -#: commands/extension.c:1501 +#: commands/extension.c:1516 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "расширение \"%s\" должно устанавливаться в схему \"%s\"" -#: commands/extension.c:1661 +#: commands/extension.c:1676 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "выявлена циклическая зависимость между расширениями \"%s\" и \"%s\"" -#: commands/extension.c:1666 +#: commands/extension.c:1681 #, c-format msgid "installing required extension \"%s\"" msgstr "установка требуемого расширения \"%s\"" -#: commands/extension.c:1689 +#: commands/extension.c:1704 #, c-format msgid "required extension \"%s\" is not installed" msgstr "требуемое расширение \"%s\" не установлено" -#: commands/extension.c:1692 +#: commands/extension.c:1707 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "" "Выполните CREATE EXTENSION ... CASCADE, чтобы установить также требуемые " "расширения." -#: commands/extension.c:1727 +#: commands/extension.c:1742 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "расширение \"%s\" уже существует, пропускается" -#: commands/extension.c:1734 +#: commands/extension.c:1749 #, c-format msgid "extension \"%s\" already exists" msgstr "расширение \"%s\" уже существует" -#: commands/extension.c:1745 +#: commands/extension.c:1760 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вложенные операторы CREATE EXTENSION не поддерживаются" -#: commands/extension.c:1918 +#: commands/extension.c:1924 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "удалить расширение \"%s\" нельзя, так как это модифицируемый объект" -#: commands/extension.c:2479 +#: commands/extension.c:2401 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "" "%s можно вызывать только из SQL-скрипта, запускаемого командой CREATE " "EXTENSION" -#: commands/extension.c:2491 +#: commands/extension.c:2413 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не относится к таблице" -#: commands/extension.c:2496 +#: commands/extension.c:2418 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "таблица \"%s\" не относится к созданному расширению" -#: commands/extension.c:2850 +#: commands/extension.c:2772 #, c-format msgid "" "cannot move extension \"%s\" into schema \"%s\" because the extension " @@ -8365,32 +8945,32 @@ msgstr "" "переместить расширение \"%s\" в схему \"%s\" нельзя, так как оно содержит " "схему" -#: commands/extension.c:2891 commands/extension.c:2951 +#: commands/extension.c:2813 commands/extension.c:2873 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "расширение \"%s\" не поддерживает SET SCHEMA" -#: commands/extension.c:2953 +#: commands/extension.c:2875 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "объект %s не принадлежит схеме расширения \"%s\"" -#: commands/extension.c:3012 +#: commands/extension.c:2934 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вложенные операторы ALTER EXTENSION не поддерживаются" -#: commands/extension.c:3104 +#: commands/extension.c:3023 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "версия \"%s\" расширения \"%s\" уже установлена" -#: commands/extension.c:3316 +#: commands/extension.c:3235 #, c-format msgid "cannot add an object of this type to an extension" msgstr "добавить объект этого типа к расширению нельзя" -#: commands/extension.c:3382 +#: commands/extension.c:3301 #, c-format msgid "" "cannot add schema \"%s\" to extension \"%s\" because the schema contains the " @@ -8399,7 +8979,7 @@ msgstr "" "добавить схему \"%s\" к расширению \"%s\" нельзя, так как схема содержит " "расширение" -#: commands/extension.c:3476 +#: commands/extension.c:3395 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" слишком большой" @@ -8430,32 +9010,32 @@ 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 " @@ -8464,7 +9044,7 @@ msgstr "" "при изменении обработчика в обёртке сторонних данных может измениться " "поведение существующих сторонних таблиц" -#: commands/foreigncmds.c:749 +#: commands/foreigncmds.c:745 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -8473,46 +9053,46 @@ msgstr "" "при изменении функции проверки в обёртке сторонних данных параметры " "зависимых объектов могут стать неверными" -#: commands/foreigncmds.c:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" уже существует, пропускается" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует, " "пропускается" -#: commands/foreigncmds.c:1158 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует" -#: commands/foreigncmds.c:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" не существует" -#: commands/foreigncmds.c:1383 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" не существует, " "пропускается" -#: commands/foreigncmds.c:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка сторонних данных \"%s\" не имеет обработчика" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "обёртка сторонних данных \"%s\" не поддерживает IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "импорт сторонней таблицы \"%s\"" @@ -8621,47 +9201,47 @@ msgstr "" "в объявлении процедуры параметры OUT не могут находиться после параметра со " "значением по умолчанию" -#: commands/functioncmds.c:612 commands/functioncmds.c:803 +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "некорректный атрибут в определении процедуры" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "вспомогательная функция %s должна возвращать тип %s" -#: commands/functioncmds.c:719 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" msgstr "для указания вспомогательной функции нужно быть суперпользователем" -#: commands/functioncmds.c:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "значение COST должно быть положительным" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "значение ROWS должно быть положительным" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "не указано тело функции" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "тело функции задано неоднократно" -#: commands/functioncmds.c:899 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "встроенное тело функции SQL допускается только для языка SQL" -#: commands/functioncmds.c:941 +#: commands/functioncmds.c:922 #, c-format msgid "" "SQL function with unquoted function body cannot have polymorphic arguments" @@ -8669,84 +9249,84 @@ msgstr "" "у SQL-функции с телом, задаваемым не в кавычках, не может быть полиморфных " "аргументов" -#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "" "%s на данный момент не поддерживается в теле SQL-функции, задаваемом не в " "кавычках" -#: commands/functioncmds.c:1014 +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "для языка \"%s\" нужно только одно выражение AS" -#: commands/functioncmds.c:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "язык не указан" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 +#: 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:1129 commands/functioncmds.c:2132 +#: 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:1164 commands/functioncmds.c:1448 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "" "только суперпользователь может определить функцию с атрибутом LEAKPROOF" -#: commands/functioncmds.c:1215 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "" "результат функции должен иметь тип %s (в соответствии с параметрами OUT)" -#: commands/functioncmds.c:1228 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "необходимо указать тип результата функции" -#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 +#: 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:1569 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "исходный тип данных %s является псевдотипом" -#: commands/functioncmds.c:1575 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "целевой тип данных %s является псевдотипом" -#: commands/functioncmds.c:1599 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "" "приведение будет проигнорировано, так как исходные данные имеют тип домен" -#: commands/functioncmds.c:1604 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "" "приведение будет проигнорировано, так как целевые данные имеют тип домен" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "функция приведения должна принимать от одного до трёх аргументов" -#: commands/functioncmds.c:1633 +#: commands/functioncmds.c:1616 #, c-format msgid "" "argument of cast function must match or be binary-coercible from source data " @@ -8755,17 +9335,17 @@ msgstr "" "аргумент функции приведения должен совпадать или быть двоично-совместимым с " "исходным типом данных" -#: commands/functioncmds.c:1637 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "второй аргумент функции приведения должен иметь тип %s" -#: commands/functioncmds.c:1642 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "третий аргумент функции приведения должен иметь тип %s" -#: commands/functioncmds.c:1647 +#: commands/functioncmds.c:1630 #, c-format msgid "" "return data type of cast function must match or be binary-coercible to " @@ -8774,127 +9354,127 @@ msgstr "" "тип возвращаемых данных функции приведения должен совпадать или быть двоично-" "совместимым с целевым типом данных" -#: commands/functioncmds.c:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "функция приведения не может быть изменчивой (volatile)" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "функция приведения должна быть обычной функцией" -#: commands/functioncmds.c:1667 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "функция приведения не может возвращать множество" -#: commands/functioncmds.c:1693 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "для создания приведения WITHOUT FUNCTION нужно быть суперпользователем" -#: commands/functioncmds.c:1708 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "исходный и целевой типы данных несовместимы физически" -#: commands/functioncmds.c:1723 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "составные типы данных несовместимы на двоичном уровне" -#: commands/functioncmds.c:1729 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "типы-перечисления несовместимы на двоичном уровне" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "типы-массивы несовместимы на двоичном уровне" -#: commands/functioncmds.c:1752 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типы-домены не могут считаться двоично-совместимыми" -#: commands/functioncmds.c:1762 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "исходный тип данных совпадает с целевым" -#: commands/functioncmds.c:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "функция преобразования не может быть изменчивой" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "функция преобразования должна быть обычной функцией" -#: commands/functioncmds.c:1803 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "функция преобразования не может возвращать множество" -#: commands/functioncmds.c:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "функция преобразования должна принимать один аргумент" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" msgstr "первый аргумент функции преобразования должен иметь тип %s" -#: commands/functioncmds.c:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип данных %s является псевдотипом" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "тип данных \"%s\" является доменом" -#: commands/functioncmds.c:1896 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функции FROM SQL должен иметь тип %s" -#: commands/functioncmds.c:1922 +#: 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:1951 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "преобразование для типа %s, языка \"%s\" уже существует" -#: commands/functioncmds.c:2038 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "преобразование для типа %s, языка \"%s\" не существует" -#: commands/functioncmds.c:2062 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "функция %s уже существует в схеме \"%s\"" -#: commands/functioncmds.c:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "нет внедрённого кода" -#: commands/functioncmds.c:2163 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "язык \"%s\" не поддерживает выполнение внедрённого кода" -#: commands/functioncmds.c:2258 +#: 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" @@ -8912,87 +9492,87 @@ msgstr "нужно указать минимум один столбец" msgid "cannot use more than %d columns in an index" msgstr "число столбцов в индексе не может превышать %d" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "создать индекс в сторонней таблице \"%s\" нельзя" +msgid "cannot create index on relation \"%s\"" +msgstr "создать индекс для отношения \"%s\" нельзя" -#: commands/indexcmds.c:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "" "создать индекс в секционированной таблице \"%s\" параллельным способом нельзя" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "" "создать ограничение-исключение в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "создавать индексы во временных таблицах других сеансов нельзя" -#: commands/indexcmds.c:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "" "для секционированных отношений нельзя назначить табличное пространство по " "умолчанию" -#: commands/indexcmds.c:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "" "в табличное пространство pg_global можно поместить только разделяемые таблицы" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "устаревший метод доступа \"rtree\" подменяется методом \"gist\"" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "метод доступа \"%s\" не поддерживает уникальные индексы" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "метод доступа \"%s\" не поддерживает включаемые столбцы" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступа \"%s\" не поддерживает индексы по многим столбцам" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступа \"%s\" не поддерживает ограничения-исключения" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "" "сопоставить ключ секционирования с индексом, использующим метод доступа " "\"%s\", нельзя" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "" "неподдерживаемое ограничение \"%s\" с определением ключа секционирования" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "" "Ограничения %s не могут использоваться, когда ключи секционирования включают " "выражения." -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1040 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" @@ -9000,7 +9580,7 @@ msgstr "" "ограничение уникальности в секционированной таблице должно включать все " "секционирующие столбцы" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1041 #, c-format msgid "" "%s constraint on table \"%s\" lacks column \"%s\" which is part of the " @@ -9009,92 +9589,92 @@ msgstr "" "В ограничении %s таблицы \"%s\" не хватает столбца \"%s\", входящего в ключ " "секционирования." -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1060 commands/indexcmds.c:1079 #, c-format msgid "index creation on system columns is not supported" msgstr "создание индекса для системных столбцов не поддерживается" -#: commands/indexcmds.c:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1279 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "создать уникальный индекс в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1281 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблица \"%s\" содержит секции, являющиеся сторонними таблицами." -#: commands/indexcmds.c:1776 +#: commands/indexcmds.c:1743 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функции в предикате индекса должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1854 parser/parse_utilcmd.c:2526 -#: parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1821 parser/parse_utilcmd.c:2529 +#: parser/parse_utilcmd.c:2664 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "указанный в ключе столбец \"%s\" не существует" -#: commands/indexcmds.c:1878 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "выражения во включаемых столбцах не поддерживаются" -#: commands/indexcmds.c:1919 +#: commands/indexcmds.c:1886 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функции в индексном выражении должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1934 +#: commands/indexcmds.c:1901 #, c-format msgid "including column does not support a collation" msgstr "включаемые столбцы не поддерживают правила сортировки" -#: commands/indexcmds.c:1938 +#: commands/indexcmds.c:1905 #, c-format msgid "including column does not support an operator class" msgstr "включаемые столбцы не поддерживают классы операторов" -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1909 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включаемые столбцы не поддерживают сортировку ASC/DESC" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1913 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включаемые столбцы не поддерживают указания NULLS FIRST/LAST" -#: commands/indexcmds.c:1987 +#: commands/indexcmds.c:1954 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:1995 commands/tablecmds.c:16964 commands/typecmds.c:810 -#: parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 -#: utils/adt/misc.c:628 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17520 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: commands/indexcmds.c:2060 +#: commands/indexcmds.c:2027 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не коммутативен" -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2029 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "В ограничениях-исключениях могут использоваться только коммутативные " "операторы." -#: commands/indexcmds.c:2088 +#: commands/indexcmds.c:2055 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор \"%s\" не входит в семейство операторов \"%s\"" -#: commands/indexcmds.c:2091 +#: commands/indexcmds.c:2058 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -9103,25 +9683,25 @@ msgstr "" "Оператор исключения для ограничения должен относиться к классу операторов " "индекса." -#: commands/indexcmds.c:2126 +#: commands/indexcmds.c:2093 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступа \"%s\" не поддерживает сортировку ASC/DESC" -#: commands/indexcmds.c:2131 +#: commands/indexcmds.c:2098 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2177 commands/tablecmds.c:16989 -#: commands/tablecmds.c:16995 commands/typecmds.c:2317 +#: commands/indexcmds.c:2144 commands/tablecmds.c:17545 +#: commands/tablecmds.c:17551 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "для типа данных %s не определён класс операторов по умолчанию для метода " "доступа \"%s\"" -#: commands/indexcmds.c:2179 +#: commands/indexcmds.c:2146 #, c-format msgid "" "You must specify an operator class for the index or define a default " @@ -9130,86 +9710,86 @@ msgstr "" "Вы должны указать класс операторов для индекса или определить класс " "операторов по умолчанию для этого типа данных." -#: commands/indexcmds.c:2208 commands/indexcmds.c:2216 +#: commands/indexcmds.c:2175 commands/indexcmds.c:2183 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "класс операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/indexcmds.c:2230 commands/typecmds.c:2305 +#: commands/indexcmds.c:2197 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "класс операторов \"%s\" не принимает тип данных %s" -#: commands/indexcmds.c:2320 +#: commands/indexcmds.c:2287 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2648 +#: commands/indexcmds.c:2615 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нераспознанный параметр REINDEX: \"%s\"" -#: commands/indexcmds.c:2872 +#: commands/indexcmds.c:2839 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:2886 +#: commands/indexcmds.c:2853 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:2926 commands/indexcmds.c:3433 -#: commands/indexcmds.c:3561 +#: commands/indexcmds.c:2893 commands/indexcmds.c:3397 +#: commands/indexcmds.c:3525 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:2949 +#: commands/indexcmds.c:2916 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:3037 +#: commands/indexcmds.c:3004 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:3070 +#: commands/indexcmds.c:3037 #, c-format msgid "cannot move system relations, skipping all" msgstr "переместить системные отношения нельзя, все они пропускаются" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3083 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3120 +#: commands/indexcmds.c:3086 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3313 commands/indexcmds.c:4169 +#: commands/indexcmds.c:3277 commands/indexcmds.c:4133 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:3465 commands/indexcmds.c:3517 +#: commands/indexcmds.c:3429 commands/indexcmds.c:3481 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "" "перестроить нерабочий индекс \"%s.%s\" неблокирующим способом нельзя, он " "пропускается" -#: commands/indexcmds.c:3471 +#: commands/indexcmds.c:3435 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -9217,28 +9797,32 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3626 +#: commands/indexcmds.c:3590 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3647 +#: commands/indexcmds.c:3611 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4150 commands/indexcmds.c:4162 +#: commands/indexcmds.c:4114 commands/indexcmds.c:4126 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4116 commands/indexcmds.c:4135 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\" - это не таблица и не представление" +msgid "cannot lock relation \"%s\"" +msgstr "заблокировать отношение \"%s\" нельзя" #: commands/matview.c:193 #, c-format @@ -9247,7 +9831,7 @@ msgstr "" "CONCURRENTLY нельзя использовать, когда материализованное представление не " "наполнено" -#: commands/matview.c:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметры %s и %s исключают друг друга" @@ -9266,7 +9850,7 @@ msgstr "" "Создайте уникальный индекс без предложения WHERE для одного или нескольких " "столбцов материализованного представления." -#: commands/matview.c:652 +#: commands/matview.c:653 #, c-format msgid "" "new data for materialized view \"%s\" contains duplicate rows without any " @@ -9275,7 +9859,7 @@ msgstr "" "новые данные для материализованного представления \"%s\" содержат " "дублирующиеся строки (без учёта столбцов с NULL)" -#: commands/matview.c:654 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "Строка: %s" @@ -9573,13 +10157,13 @@ msgstr "функция оценки соединения %s должна воз msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" нельзя изменить" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 -#: commands/tablecmds.c:1585 commands/tablecmds.c:2165 -#: commands/tablecmds.c:3390 commands/tablecmds.c:6064 -#: commands/tablecmds.c:8989 commands/tablecmds.c:16554 -#: commands/tablecmds.c:16589 commands/trigger.c:313 commands/trigger.c:1289 -#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9148 commands/tablecmds.c:17098 +#: commands/tablecmds.c:17133 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доступ запрещён: \"%s\" - это системный каталог" @@ -9632,55 +10216,45 @@ msgstr "" "HOLD" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: executor/execCurrent.c:70 utils/adt/xml.c:2603 utils/adt/xml.c:2773 #, 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:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "не удалось определить тип данных параметра $%d" - -#: commands/prepare.c:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "служебные SQL-операторы нельзя подготовить" - # [SM]: TO REVIEW -#: commands/prepare.c:264 commands/prepare.c:269 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "подготовленный оператор - не SELECT" -#: commands/prepare.c:329 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "неверное число параметров для подготовленного оператора \"%s\"" -#: commands/prepare.c:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "Ожидалось параметров: %d, получено: %d." -#: commands/prepare.c:364 +#: commands/prepare.c:330 #, 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:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "подготовленный оператор \"%s\" уже существует" # [SM]: TO REVIEW -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "подготовленный оператор \"%s\" не существует" @@ -9691,63 +10265,225 @@ msgid "must be superuser to create custom procedural language" msgstr "" "для создания дополнительного процедурного языка нужно быть суперпользователем" -#: commands/publicationcmds.c:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1222 +#: postmaster/postmaster.c:1321 utils/init/miscinit.c:1659 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "неверный синтаксис параметра \"publish\"" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "неверный формат списка в параметре \"%s\"" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "нераспознанное значение \"publish\": \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "нераспознанное значение параметра публикации \"%s\": \"%s\"" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "нераспознанный параметр репликации: \"%s\"" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "для CURRENT_SCHEMA требуется, чтобы была выбрана схема" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "Системные столбцы не допускаются." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "Пользовательские операторы не допускаются." + +#: commands/publicationcmds.c:554 +msgid "" +"Only columns, constants, built-in operators, built-in data types, built-in " +"collations, and immutable built-in functions are allowed." +msgstr "" +"Допускаются только столбцы, константы, встроенные операторы, встроенные типы " +"данных, встроенные правила сортировки и встроенные постоянные функции." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "Пользовательские типы не допускаются." + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Пользовательские или встроенные непостоянные функции не допускаются." + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "Пользовательские правила сортировки не допускаются." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "неверное выражение в предложении WHERE публикации" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "" +"использовать в публикации предложение WHERE для отношения \"%s\" нельзя" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "" +"Предложение WHERE нельзя использовать для секционированной таблицы, когда %s " +"равен false." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "" +"использовать список столбцов отношения \"%s.%s\" в публикации \"%s\" нельзя" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "" +"Column lists cannot be specified in publications containing FOR TABLES IN " +"SCHEMA elements." +msgstr "" +"Списки столбцов нельзя задавать в публикациях, содержащих элементы FOR " +"TABLES IN SCHEMA." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "" +"Column lists cannot be specified for partitioned tables when %s is false." +msgstr "" +"Списки столбцов нельзя задавать для секционированных таблиц, когда %s равен " +"false." + +#: commands/publicationcmds.c:760 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "для создания публикации всех таблиц нужно быть суперпользователем" -#: commands/publicationcmds.c:250 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "" +"для создания публикации вида FOR ALL TABLES IN SCHEMA нужно быть " +"суперпользователем" + +#: commands/publicationcmds.c:867 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "уровень wal_level недостаточен для публикации логических изменений" -#: commands/publicationcmds.c:251 +#: commands/publicationcmds.c:868 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "Задайте для wal_level значение logical до создания подписок." +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "Задайте для wal_level значение \"logical\" до создания подписок." -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "параметру \"%s\" публикации \"%s\" нельзя присвоить false" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "" +"The publication contains a WHERE clause for partitioned table \"%s\", which " +"is not allowed when \"%s\" is false." +msgstr "" +"Публикация содержит предложение WHERE для секционированной таблицы \"%s\", " +"что не допускается, когда \"%s\" равен false." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "" +"The publication contains a column list for partitioned table \"%s\", which " +"is not allowed when \"%s\" is false." +msgstr "" +"Публикация содержит список столбцов для секционированной таблицы \"%s\", что " +"не допускается, когда \"%s\" равен false." + +#: commands/publicationcmds.c:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "добавить схему в публикацию \"%s\" нельзя" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "" +"Schemas cannot be added if any tables that specify a column list are already " +"part of the publication." +msgstr "" +"Схемы нельзя добавлять в публикацию, если в неё уже добавлены таблицы, для " +"которых задан список столбцов." + +#: commands/publicationcmds.c:1348 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "для добавления или замены схем нужно быть суперпользователем" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "публикация \"%s\" определена для всех таблиц (FOR ALL TABLES)" -#: commands/publicationcmds.c:378 +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "В публикации вида FOR ALL TABLES нельзя добавлять или удалять таблицы." + +#: commands/publicationcmds.c:1367 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "В публикации всех таблиц нельзя добавлять или удалять таблицы." -#: commands/publicationcmds.c:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "конфликтующие или избыточные предложения WHERE для таблицы \"%s\"" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "конфликтующие или избыточные списки столбцов для таблицы \"%s\"" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "в ALTER PUBLICATION ... DROP не должен задаваться список столбцов" + +#: commands/publicationcmds.c:1814 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "отношение \"%s\" не включено в публикацию" -#: commands/publicationcmds.c:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "использовать WHERE при удалении таблицы из публикации нельзя" + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "таблицы из схемы \"%s\" не являются частью публикации" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "нет прав на изменение владельца публикации \"%s\"" -#: commands/publicationcmds.c:752 +#: commands/publicationcmds.c:1926 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "" "Владельцем публикации всех таблиц (FOR ALL TABLES) должен быть " "суперпользователь." +#: commands/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "" +"Владельцем публикации вида FOR TABLES IN SCHEMA должен быть " +"суперпользователь." + #: commands/schemacmds.c:108 commands/schemacmds.c:288 #, c-format msgid "unacceptable schema name \"%s\"" @@ -9763,12 +10499,12 @@ 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" @@ -9776,185 +10512,185 @@ 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 "нежурналируемые последовательности не поддерживаются" +msgid "cannot set security label on relation \"%s\"" +msgstr "задать метку безопасности для отношения \"%s\" нельзя" -#: commands/sequence.c:717 +#: commands/sequence.c:755 #, 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:740 +#: commands/sequence.c:774 #, 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:858 +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "" "текущее значение (currval) для последовательности \"%s\" ещё не определено в " "этом сеансе" -#: commands/sequence.c:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "последнее значение (lastval) ещё не определено в этом сеансе" -#: commands/sequence.c:971 +#: commands/sequence.c:997 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "" -"setval передано значение %s вне пределов последовательности \"%s\" (%s..%s)" +"функции setval передано значение %lld вне пределов последовательности " +"\"%s\" (%lld..%lld)" -#: commands/sequence.c:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неверное свойство последовательности SEQUENCE NAME" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "" "типом столбца идентификации может быть только smallint, integer или bigint" -#: commands/sequence.c:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "" "типом последовательности может быть только smallint, integer или bigint" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не может быть нулевым" -#: commands/sequence.c:1481 +#: commands/sequence.c:1474 #, 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:1518 +#: commands/sequence.c:1506 #, 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:1532 +#: commands/sequence.c:1514 #, 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:1559 +#: commands/sequence.c:1535 #, 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:1571 +#: commands/sequence.c:1541 #, 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:1601 +#: commands/sequence.c:1565 #, 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:1613 +#: commands/sequence.c:1571 #, 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:1628 +#: commands/sequence.c:1582 #, 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:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "неверное указание OWNED BY" # skip-rule: no-space-after-period -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Укажите OWNED BY таблица.столбец или OWNED BY NONE." -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, 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:1698 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "" "последовательность должна иметь того же владельца, что и таблица, с которой " "она связана" -#: commands/sequence.c:1702 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "" "последовательность должна быть в той же схеме, что и таблица, с которой она " "связана" -#: commands/sequence.c:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 -#: commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13878 +#: commands/tablecmds.c:16515 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можно указать только одно отношение" -#: commands/statscmds.c:139 +#: 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:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "объект статистики \"%s\" уже существует, пропускается" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "объект статистики \"%s\" уже существует" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "в статистике не может быть больше %d столбцов" -#: commands/statscmds.c:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "создание статистики для системных столбцов не поддерживается" -#: commands/statscmds.c:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, c-format msgid "" "column \"%s\" cannot be used in statistics because its type %s has no " @@ -9963,7 +10699,7 @@ msgstr "" "столбец \"%s\" нельзя использовать в статистике, так как для его типа %s не " "определён класс операторов B-дерева по умолчанию" -#: commands/statscmds.c:326 +#: commands/statscmds.c:325 #, c-format msgid "" "expression cannot be used in multivariate statistics because its type %s has " @@ -9972,7 +10708,7 @@ msgstr "" "выражение нельзя использовать в многовариантной статистике, так как для его " "типа %s не определён класс операторов btree по умолчанию" -#: commands/statscmds.c:347 +#: commands/statscmds.c:346 #, c-format msgid "" "when building statistics on a single expression, statistics kinds may not be " @@ -9981,78 +10717,96 @@ msgstr "" "при построении статистики по единственному выражению указывать виды " "статистики нельзя" -#: commands/statscmds.c:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "нераспознанный вид статистики \"%s\"" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "для расширенной статистики требуются минимум 2 столбца" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "повторяющееся имя столбца в определении статистики" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" msgstr "повторяющееся выражение в определении статистики" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8116 #, c-format msgid "statistics target %d is too low" msgstr "ориентир статистики слишком мал (%d)" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8124 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир статистики снижается до %d" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "объект статистики \"%s.%s\" не существует, пропускается" -#: commands/subscriptioncmds.c:223 +#: 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:237 commands/subscriptioncmds.c:243 -#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 -#: commands/subscriptioncmds.c:274 +#: 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:281 commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "для подписки с параметром %s необходимо также задать %s" -#: commands/subscriptioncmds.c:380 +#: commands/subscriptioncmds.c:433 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "не удалось получить список публикаций с публикующего сервера: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "публикация %s не существует на публикующем сервере" +msgstr[1] "публикации %s не существуют на публикующем сервере" +msgstr[2] "публикации %s не существуют на публикующем сервере" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "для создания подписок нужно быть суперпользователем" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 -#: replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1247 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалось подключиться к серверу публикации: %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервере публикации создан слот репликации \"%s\"" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:529 +#: commands/subscriptioncmds.c:730 #, c-format msgid "" "tables were not subscribed, you will have to run %s to subscribe the tables" @@ -10060,67 +10814,140 @@ msgstr "" "в подписке отсутствуют таблицы; потребуется выполнить %s, чтобы подписаться " "на таблицы" -#: commands/subscriptioncmds.c:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "для включённой подписки нельзя задать %s" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "включить подписку, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "" "ALTER SUBSCRIPTION с обновлением для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" "Выполните ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 #, c-format msgid "" -"ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" -msgstr "ALTER SUBSCRIPTION ... REFRESH для отключённых подписок не допускается" +"ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " +"is enabled" +msgstr "" +"ALTER SUBSCRIPTION с параметром публикации refresh в режиме copy_data не " +"допускается, когда включён параметр two_phase" -#: commands/subscriptioncmds.c:1092 +#: commands/subscriptioncmds.c:1140 #, c-format -msgid "subscription \"%s\" does not exist, skipping" -msgstr "подписка \"%s\" не существует, пропускается" +msgid "" +"Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " +"copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" +"Выполните ALTER SUBSCRIPTION ... SET PUBLICATION с refresh = false или с " +"copy_data = false либо выполните DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1344 +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 #, c-format -msgid "dropped replication slot \"%s\" on publisher" -msgstr "слот репликации \"%s\" удалён на сервере репликации" +msgid "Use %s instead." +msgstr "Выполните %s." -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 #, c-format -msgid "could not drop replication slot \"%s\" on publisher: %s" -msgstr "слот репликации \"%s\" на сервере публикации не был удалён: %s" +msgid "" +"Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " +"SUBSCRIPTION." +msgstr "" +"Выполните %s с refresh = false или с copy_data = false либо выполните DROP/" +"CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1395 +#: commands/subscriptioncmds.c:1218 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "нет прав на изменение владельца подписки \"%s\"" +msgid "" +"ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +msgstr "ALTER SUBSCRIPTION ... REFRESH для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:1397 +#: commands/subscriptioncmds.c:1243 +#, c-format +msgid "" +"ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase " +"is enabled" +msgstr "" +"ALTER SUBSCRIPTION ... REFRESH в режиме copy_data не допускается, когда " +"включён параметр two_phase" + +#: commands/subscriptioncmds.c:1244 +#, c-format +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:1263 +#, c-format +msgid "must be superuser to skip transaction" +msgstr "чтобы пропустить транзакцию, нужно быть суперпользователем" + +#: commands/subscriptioncmds.c:1283 +#, c-format +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:1363 +#, c-format +msgid "subscription \"%s\" does not exist, skipping" +msgstr "подписка \"%s\" не существует, пропускается" + +#: commands/subscriptioncmds.c:1621 +#, c-format +msgid "dropped replication slot \"%s\" on publisher" +msgstr "слот репликации \"%s\" удалён на сервере репликации" + +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "слот репликации \"%s\" на сервере публикации не был удалён: %s" + +#: commands/subscriptioncmds.c:1672 +#, c-format +msgid "permission denied to change owner of subscription \"%s\"" +msgstr "нет прав на изменение владельца подписки \"%s\"" + +#: commands/subscriptioncmds.c:1674 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "Владельцем подписки должен быть суперпользователь." -#: commands/subscriptioncmds.c:1513 +#: commands/subscriptioncmds.c:1788 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "" "не удалось получить список реплицируемых таблиц с сервера репликации: %s" -#: commands/subscriptioncmds.c:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:819 +#: replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "" +"cannot use different column lists for table \"%s.%s\" in different " +"publications" +msgstr "" +"использовать различные списки столбцов таблицы \"%s.%s\" в разных " +"публикациях нельзя" + +#: commands/subscriptioncmds.c:1860 #, c-format msgid "" "could not connect to publisher when attempting to drop replication slot " @@ -10130,7 +10957,7 @@ msgstr "" "\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1581 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "" "Use %s to disable the subscription, and then use %s to disassociate it from " @@ -10139,141 +10966,141 @@ msgstr "" "Выполните %s, чтобы отключить подписку, а затем выполните %s, чтобы отвязать " "её от слота." -#: commands/subscriptioncmds.c:1612 +#: commands/subscriptioncmds.c:1894 #, c-format msgid "publication name \"%s\" used more than once" msgstr "имя публикации \"%s\" используется неоднократно" -#: commands/subscriptioncmds.c:1656 +#: commands/subscriptioncmds.c:1938 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публикация \"%s\" уже имеется в подписке \"%s\"" -#: commands/subscriptioncmds.c:1670 +#: commands/subscriptioncmds.c:1952 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публикация \"%s\" отсутствует в подписке \"%s\"" -#: commands/subscriptioncmds.c:1681 +#: commands/subscriptioncmds.c:1963 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "удалить все публикации из подписки нельзя" -#: commands/tablecmds.c:241 commands/tablecmds.c:283 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "таблица \"%s\" не существует" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "таблица \"%s\" не существует, пропускается" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "Выполните DROP TABLE для удаления таблицы." -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "последовательность \"%s\" не существует" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "последовательность \"%s\" не существует, пропускается" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Выполните DROP SEQUENCE для удаления последовательности." -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "представление \"%s\" не существует" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "представление \"%s\" не существует, пропускается" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "Выполните DROP VIEW для удаления представления." -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "материализованное представление \"%s\" не существует" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "материализованное представление \"%s\" не существует, пропускается" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:266 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18449 -#: parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19027 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "индекс \"%s\" не существует" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "индекс \"%s\" не существует, пропускается" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "Выполните DROP INDEX для удаления индекса." -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" - это не тип" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:277 commands/tablecmds.c:13196 -#: commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13717 +#: commands/tablecmds.c:16218 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "сторонняя таблица \"%s\" не существует, пропускается" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Выполните DROP FOREIGN TABLE для удаления сторонней таблицы." -#: commands/tablecmds.c:670 +#: commands/tablecmds.c:697 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можно использовать только для временных таблиц" -#: commands/tablecmds.c:701 +#: commands/tablecmds.c:728 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15025 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" -#: commands/tablecmds.c:922 +#: commands/tablecmds.c:949 #, c-format msgid "" "specifying a table access method is not supported on a partitioned table" @@ -10281,47 +11108,47 @@ msgstr "" "указание табличного метода доступа для секционированных таблиц не " "поддерживаются" -#: commands/tablecmds.c:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "отношение \"%s\" не является секционированным" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "число столбцов в ключе секционирования не может превышать %d" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "создать стороннюю секцию для секционированной таблицы \"%s\" нельзя" -#: commands/tablecmds.c:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" содержит индексы, являющиеся уникальными." -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не поддерживает удаление нескольких объектов" -#: commands/tablecmds.c:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не поддерживает режим CASCADE" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "удалить секционированный индекс \"%s\" параллельным способом нельзя" -#: commands/tablecmds.c:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "опустошить собственно секционированную таблицу нельзя" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -10330,39 +11157,39 @@ msgstr "" "Не указывайте ключевое слово ONLY или выполните TRUNCATE ONLY " "непосредственно для секций." -#: commands/tablecmds.c:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "опустошение распространяется на таблицу %s" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "опустошить стороннюю таблицу \"%s\" нельзя" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14922 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "наследование от секции \"%s\" не допускается" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 -#: parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2633 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "" "наследуемое отношение \"%s\" не является таблицей или сторонней таблицей" -#: commands/tablecmds.c:2455 +#: commands/tablecmds.c:2487 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -10370,29 +11197,29 @@ msgstr "" "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14901 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14909 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:2528 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "слияние нескольких наследованных определений столбца \"%s\"" -#: commands/tablecmds.c:2536 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфликт типов в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2538 commands/tablecmds.c:2561 -#: commands/tablecmds.c:2578 commands/tablecmds.c:2834 -#: commands/tablecmds.c:2864 commands/tablecmds.c:2878 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 #: 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 @@ -10403,41 +11230,41 @@ msgstr "конфликт типов в наследованном столбце msgid "%s versus %s" msgstr "%s и %s" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2549 commands/tablecmds.c:2846 -#: commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" и \"%s\"" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "в столбце \"%s\" возник конфликт методов сжатия" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфликт свойства генерирования в наследованном столбце \"%s\"" -#: commands/tablecmds.c:2685 commands/tablecmds.c:2740 -#: commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 -#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12441 parser/parse_utilcmd.c:1302 +#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 +#: parser/parse_utilcmd.c:1862 #, c-format msgid "cannot convert whole-row table reference" msgstr "преобразовать ссылку на тип всей строки таблицы нельзя" -#: commands/tablecmds.c:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, c-format msgid "" "Generation expression for column \"%s\" contains a whole-row reference to " @@ -10446,48 +11273,48 @@ msgstr "" "Генерирующее выражение столбца \"%s\" ссылается на тип всей строки в таблице " "\"%s\"." -#: commands/tablecmds.c:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Ограничение \"%s\" ссылается на тип всей строки в таблице \"%s\"." -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "слияние столбца \"%s\" с наследованным определением" -#: commands/tablecmds.c:2824 +#: commands/tablecmds.c:2856 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "перемещение и слияние столбца \"%s\" с наследуемым определением" -#: commands/tablecmds.c:2825 +#: commands/tablecmds.c:2857 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "" "Определённый пользователем столбец перемещён в позицию наследуемого столбца." -#: commands/tablecmds.c:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфликт типов в столбце \"%s\"" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в столбце \"%s\"" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в столбце \"%s\"" -#: commands/tablecmds.c:2903 +#: commands/tablecmds.c:2935 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "для дочернего столбца \"%s\" указано генерирующее выражение" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:2937 #, c-format msgid "" "Omit the generation expression in the definition of the child table column " @@ -10496,36 +11323,36 @@ msgstr "" "Уберите генерирующее выражение из определения столбца в дочерней таблице, " "чтобы это выражение наследовалось из родительской." -#: commands/tablecmds.c:2909 +#: commands/tablecmds.c:2941 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "значение по умолчанию" -#: commands/tablecmds.c:2914 +#: commands/tablecmds.c:2946 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "свойство идентификации" -#: commands/tablecmds.c:3023 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "столбец \"%s\" наследует конфликтующие генерирующие выражения" -#: commands/tablecmds.c:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "столбец \"%s\" наследует конфликтующие значения по умолчанию" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для решения конфликта укажите желаемое значение по умолчанию." -#: commands/tablecmds.c:3076 +#: commands/tablecmds.c:3108 #, c-format msgid "" "check constraint name \"%s\" appears multiple times but with different " @@ -10534,56 +11361,52 @@ msgstr "" "имя ограничения-проверки \"%s\" фигурирует несколько раз, но с разными " "выражениями" -#: commands/tablecmds.c:3289 +#: commands/tablecmds.c:3321 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "перемещать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "переименовать столбец типизированной таблицы нельзя" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3410 #, 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:3472 +#: commands/tablecmds.c:3505 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "" "наследованный столбец \"%s\" должен быть также переименован в дочерних " "таблицах" -#: commands/tablecmds.c:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "нельзя переименовать системный столбец \"%s\"" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "нельзя переименовать наследованный столбец \"%s\"" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "наследуемое ограничение \"%s\" должно быть также переименовано в дочерних " "таблицах" -#: commands/tablecmds.c:3678 +#: commands/tablecmds.c:3711 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "нельзя переименовать наследованное ограничение \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3976 +#: commands/tablecmds.c:4008 #, c-format msgid "" "cannot %s \"%s\" because it is being used by active queries in this session" @@ -10592,49 +11415,59 @@ msgstr "" "запросами в данном сеансе" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3985 +#: commands/tablecmds.c:4017 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "" "нельзя выполнить %s \"%s\", так как с этим объектом связаны отложенные " "события триггеров" -#: commands/tablecmds.c:4453 +#: commands/tablecmds.c:4486 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "нельзя изменить секцию \"%s\", которая не полностью отсоединена" -#: commands/tablecmds.c:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "изменить характеристику хранения дважды нельзя" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "менять метод доступа для секционированной таблицы нельзя" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "множественные подкоманды SET ACCESS METHOD не допускаются" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписать системное отношение \"%s\" нельзя" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписать таблицу \"%s\", используемую как таблицу каталога, нельзя" -#: commands/tablecmds.c:5437 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "перезаписывать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:5898 +#: commands/tablecmds.c:5986 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "столбец \"%s\" отношения \"%s\" содержит значения NULL" -#: commands/tablecmds.c:5915 +#: commands/tablecmds.c:6003 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "ограничение-проверку \"%s\" отношения \"%s\" нарушает некоторая строка" -#: commands/tablecmds.c:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -10643,85 +11476,24 @@ msgstr "" "изменённое ограничение секции для секции по умолчанию \"%s\" будет нарушено " "некоторыми строками" -#: commands/tablecmds.c:5940 +#: commands/tablecmds.c:6028 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "ограничение секции отношения \"%s\" нарушает некоторая строка" -#: commands/tablecmds.c:6088 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:6091 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "" -"\"%s\" - это не таблица, представление, материализованное представление или " -"индекс" - -#: commands/tablecmds.c:6097 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" - это не таблица, материализованное представление или индекс" - -#: commands/tablecmds.c:6100 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or partitioned index" -msgstr "" -"\"%s\" - это не таблица, материализованное представление, индекс или " -"секционированный индекс" - -#: commands/tablecmds.c:6103 -#, c-format -msgid "" -"\"%s\" is not a table, materialized view, index, partitioned index, or " -"foreign table" -msgstr "" -"\"%s\" - это не таблица, материализованное представление, индекс, " -"секционированный индекс или сторонняя таблица" - -#: commands/tablecmds.c:6106 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "" -"\"%s\" - это не таблица, материализованное представление или сторонняя " -"таблица" - -#: commands/tablecmds.c:6109 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" - это не таблица и не сторонняя таблица" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "действие ALTER %s нельзя выполнить с отношением \"%s\"" -#: commands/tablecmds.c:6112 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" - это не таблица, составной тип или сторонняя таблица" - -#: commands/tablecmds.c:6115 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "" -"\"%s\" - это не таблица, материализованное представление, индекс или " -"сторонняя таблица" - -#: commands/tablecmds.c:6118 -#, c-format -msgid "\"%s\" is not a table or partitioned index" -msgstr "\"%s\" - это не таблица и не секционированный индекс" - -#: commands/tablecmds.c:6128 -#, c-format -msgid "\"%s\" is of the wrong type" -msgstr "неправильный тип \"%s\"" - -#: commands/tablecmds.c:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "" "изменить тип \"%s\" нельзя, так как он задействован в столбце \"%s.%s\"" -#: commands/tablecmds.c:6386 +#: commands/tablecmds.c:6564 #, c-format msgid "" "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" @@ -10729,77 +11501,77 @@ msgstr "" "изменить стороннюю таблицу \"%s\" нельзя, так как столбец \"%s.%s\" " "задействует тип её строки" -#: commands/tablecmds.c:6393 +#: commands/tablecmds.c:6571 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "изменить таблицу \"%s\" нельзя, так как столбец \"%s.%s\" задействует тип её " "строки" -#: commands/tablecmds.c:6449 +#: commands/tablecmds.c:6627 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "изменить тип \"%s\", так как это тип типизированной таблицы" -#: commands/tablecmds.c:6451 +#: commands/tablecmds.c:6629 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "Чтобы изменить также типизированные таблицы, выполните ALTER ... CASCADE." -#: commands/tablecmds.c:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не является составным" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "добавить столбец в типизированную таблицу нельзя" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15152 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15159 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "дочерняя таблица \"%s\" имеет другое правило сортировки для столбца \"%s\"" -#: commands/tablecmds.c:6626 +#: commands/tablecmds.c:6804 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "объединение определений столбца \"%s\" для потомка \"%s\"" -#: commands/tablecmds.c:6669 +#: commands/tablecmds.c:6851 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "" "добавить столбец идентификации в таблицу, у которой есть дочерние, нельзя" -#: commands/tablecmds.c:6912 +#: commands/tablecmds.c:7095 #, c-format msgid "column must be added to child tables too" msgstr "столбец также должен быть добавлен к дочерним таблицам" -#: commands/tablecmds.c:6990 +#: commands/tablecmds.c:7173 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "столбец \"%s\" отношения \"%s\" уже существует, пропускается" -#: commands/tablecmds.c:6997 +#: commands/tablecmds.c:7180 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "столбец \"%s\" отношения \"%s\" уже существует" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7246 commands/tablecmds.c:12080 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " @@ -10808,70 +11580,70 @@ msgstr "" "удалить ограничение только из секционированной таблицы, когда существуют " "секции, нельзя" -#: commands/tablecmds.c:7064 commands/tablecmds.c:7381 -#: commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7247 commands/tablecmds.c:7564 +#: commands/tablecmds.c:8561 commands/tablecmds.c:12081 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не указывайте ключевое слово ONLY." -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 -#: commands/tablecmds.c:7449 commands/tablecmds.c:7563 -#: commands/tablecmds.c:7657 commands/tablecmds.c:7716 -#: commands/tablecmds.c:7834 commands/tablecmds.c:8000 -#: commands/tablecmds.c:8070 commands/tablecmds.c:8226 -#: commands/tablecmds.c:11735 commands/tablecmds.c:13219 -#: commands/tablecmds.c:15765 +#: commands/tablecmds.c:7284 commands/tablecmds.c:7490 +#: commands/tablecmds.c:7632 commands/tablecmds.c:7746 +#: commands/tablecmds.c:7840 commands/tablecmds.c:7899 +#: commands/tablecmds.c:8018 commands/tablecmds.c:8157 +#: commands/tablecmds.c:8227 commands/tablecmds.c:8383 +#: commands/tablecmds.c:12235 commands/tablecmds.c:13740 +#: commands/tablecmds.c:16309 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7290 commands/tablecmds.c:7638 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "столбец \"%s\" отношения \"%s\" является столбцом идентификации" -#: commands/tablecmds.c:7150 +#: commands/tablecmds.c:7333 #, c-format msgid "column \"%s\" is in a primary key" msgstr "столбец \"%s\" входит в первичный ключ" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7338 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "столбец \"%s\" входит в индекс, используемый для идентификации реплики" -#: commands/tablecmds.c:7178 +#: commands/tablecmds.c:7361 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "столбец \"%s\" в родительской таблице помечен как NOT NULL" -#: commands/tablecmds.c:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7561 commands/tablecmds.c:9044 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" -#: commands/tablecmds.c:7379 +#: commands/tablecmds.c:7562 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Столбец \"%s\" отношения \"%s\" уже имеет свойство NOT NULL." -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:7640 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Вместо этого выполните ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7462 +#: commands/tablecmds.c:7645 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "столбец \"%s\" отношения \"%s\" является генерируемым" -#: commands/tablecmds.c:7465 +#: commands/tablecmds.c:7648 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "" "Вместо этого выполните ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." -#: commands/tablecmds.c:7574 +#: commands/tablecmds.c:7757 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " @@ -10880,46 +11652,46 @@ msgstr "" "столбец \"%s\" отношения \"%s\" должен быть объявлен как NOT NULL, чтобы его " "можно было сделать столбцом идентификации" -#: commands/tablecmds.c:7580 +#: commands/tablecmds.c:7763 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "столбец \"%s\" отношения \"%s\" уже является столбцом идентификации" -#: commands/tablecmds.c:7586 +#: commands/tablecmds.c:7769 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "столбец \"%s\" отношения \"%s\" уже имеет значение по умолчанию" -#: commands/tablecmds.c:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7846 commands/tablecmds.c:7907 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "столбец \"%s\" отношения \"%s\" не является столбцом идентификации" -#: commands/tablecmds.c:7729 +#: commands/tablecmds.c:7912 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "" "столбец \"%s\" отношения \"%s\" не является столбцом идентификации, " "пропускается" -#: commands/tablecmds.c:7782 +#: commands/tablecmds.c:7965 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "" "ALTER TABLE / DROP EXPRESSION нужно применять также к дочерним таблицам" -#: commands/tablecmds.c:7804 +#: commands/tablecmds.c:7987 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "нельзя удалить генерирующее выражение из наследуемого столбца" -#: commands/tablecmds.c:7842 +#: commands/tablecmds.c:8026 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "" "столбец \"%s\" отношения \"%s\" не является сохранённым генерируемым столбцом" -#: commands/tablecmds.c:7847 +#: commands/tablecmds.c:8031 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" @@ -10927,63 +11699,63 @@ msgstr "" "столбец \"%s\" отношения \"%s\" пропускается, так как не является " "сохранённым генерируемым столбцом" -#: commands/tablecmds.c:7947 +#: commands/tablecmds.c:8104 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ссылаться только на столбец в индексе" -#: commands/tablecmds.c:7990 +#: commands/tablecmds.c:8147 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "столбец с номером %d отношения \"%s\" не существует" -#: commands/tablecmds.c:8009 +#: commands/tablecmds.c:8166 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить статистику включённого столбца \"%s\" индекса \"%s\" нельзя" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:8171 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить статистику столбца \"%s\" (не выражения) индекса \"%s\" нельзя" -#: commands/tablecmds.c:8016 +#: commands/tablecmds.c:8173 #, c-format msgid "Alter statistics on table column instead." msgstr "Вместо этого измените статистику для столбца в таблице." -#: commands/tablecmds.c:8206 +#: commands/tablecmds.c:8363 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8395 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" -#: commands/tablecmds.c:8283 +#: commands/tablecmds.c:8440 #, c-format msgid "cannot drop column from typed table" msgstr "нельзя удалить столбец в типизированной таблице" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8499 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "столбец \"%s\" в таблице\"%s\" не существует, пропускается" -#: commands/tablecmds.c:8355 +#: commands/tablecmds.c:8512 #, c-format msgid "cannot drop system column \"%s\"" msgstr "нельзя удалить системный столбец \"%s\"" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8522 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "нельзя удалить наследованный столбец \"%s\"" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8535 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -10992,7 +11764,7 @@ msgstr "" "удалить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:8403 +#: commands/tablecmds.c:8560 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -11000,7 +11772,7 @@ msgstr "" "удалить столбец только из секционированной таблицы, когда существуют секции, " "нельзя" -#: commands/tablecmds.c:8607 +#: commands/tablecmds.c:8764 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -11009,14 +11781,14 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживается с " "секционированными таблицами" -#: commands/tablecmds.c:8632 +#: commands/tablecmds.c:8789 #, 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:8967 +#: commands/tablecmds.c:9126 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " @@ -11025,7 +11797,7 @@ msgstr "" "нельзя использовать ONLY для стороннего ключа в секционированной таблице " "\"%s\", ссылающегося на отношение \"%s\"" -#: commands/tablecmds.c:8973 +#: commands/tablecmds.c:9132 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -11034,25 +11806,25 @@ msgstr "" "нельзя добавить с характеристикой NOT VALID сторонний ключ в " "секционированной таблице \"%s\", ссылающийся на отношение \"%s\"" -#: commands/tablecmds.c:8976 +#: commands/tablecmds.c:9135 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "" "Эта функциональность с секционированными таблицами пока не поддерживается." -#: commands/tablecmds.c:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9142 commands/tablecmds.c:9608 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "указанный объект \"%s\" не является таблицей" -#: commands/tablecmds.c:9006 +#: commands/tablecmds.c:9165 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "" "ограничения в постоянных таблицах могут ссылаться только на постоянные " "таблицы" -#: commands/tablecmds.c:9013 +#: commands/tablecmds.c:9172 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -11061,13 +11833,13 @@ msgstr "" "ограничения в нежурналируемых таблицах могут ссылаться только на постоянные " "или нежурналируемые таблицы" -#: commands/tablecmds.c:9019 +#: commands/tablecmds.c:9178 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "ограничения во временных таблицах могут ссылаться только на временные таблицы" -#: commands/tablecmds.c:9023 +#: commands/tablecmds.c:9182 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" @@ -11075,7 +11847,7 @@ msgstr "" "ограничения во временных таблицах должны ссылаться только на временные " "таблицы текущего сеанса" -#: commands/tablecmds.c:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9256 commands/tablecmds.c:9262 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" @@ -11083,55 +11855,63 @@ msgstr "" "некорректное действие %s для ограничения внешнего ключа, содержащего " "генерируемый столбец" -#: commands/tablecmds.c:9111 +#: commands/tablecmds.c:9278 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число столбцов в источнике и назначении внешнего ключа не совпадает" -#: commands/tablecmds.c:9218 +#: commands/tablecmds.c:9385 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "ограничение внешнего ключа \"%s\" нельзя реализовать" -#: commands/tablecmds.c:9220 +#: commands/tablecmds.c:9387 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Столбцы ключа \"%s\" и \"%s\" имеют несовместимые типы: %s и %s." -#: commands/tablecmds.c:9583 commands/tablecmds.c:9996 -#: parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9544 +#, c-format +msgid "" +"column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" +"столбец \"%s\", фигурирующий в действии ON DELETE SET, должен входить во " +"внешний ключ" + +#: commands/tablecmds.c:9817 commands/tablecmds.c:10285 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "ограничения внешнего ключа для сторонних таблиц не поддерживаются" -#: commands/tablecmds.c:10373 commands/tablecmds.c:10651 -#: commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10837 commands/tablecmds.c:11115 +#: commands/tablecmds.c:12037 commands/tablecmds.c:12112 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "ограничение \"%s\" в таблице \"%s\" не существует" -#: commands/tablecmds.c:10380 +#: commands/tablecmds.c:10844 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не является внешним ключом" -#: commands/tablecmds.c:10418 +#: commands/tablecmds.c:10882 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:10421 +#: commands/tablecmds.c:10885 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "" "Ограничение \"%s\" является производным от ограничения \"%s\" таблицы \"%s\"." -#: commands/tablecmds.c:10423 +#: commands/tablecmds.c:10887 #, c-format msgid "You may alter the constraint it derives from, instead." msgstr "Вместо этого вы можете изменить родительское ограничение." -#: commands/tablecmds.c:10659 +#: commands/tablecmds.c:11123 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" @@ -11139,51 +11919,51 @@ msgstr "" "ограничение \"%s\" в таблице \"%s\" не является внешним ключом или " "ограничением-проверкой" -#: commands/tablecmds.c:10737 +#: commands/tablecmds.c:11201 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно соблюдаться в дочерних таблицах" -#: commands/tablecmds.c:10827 +#: commands/tablecmds.c:11291 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "столбец \"%s\", указанный в ограничении внешнего ключа, не существует" -#: commands/tablecmds.c:10833 +#: commands/tablecmds.c:11297 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "системные столбцы нельзя использовать во внешних ключах" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11301 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d столбцов" -#: commands/tablecmds.c:10902 +#: commands/tablecmds.c:11367 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "использовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзя" -#: commands/tablecmds.c:10919 +#: commands/tablecmds.c:11384 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:10984 +#: commands/tablecmds.c:11453 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в списке столбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:11078 +#: commands/tablecmds.c:11547 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "использовать откладываемое ограничение уникальности в целевой внешней " "таблице \"%s\" нельзя" -#: commands/tablecmds.c:11083 +#: commands/tablecmds.c:11552 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -11191,27 +11971,27 @@ msgstr "" "в целевой внешней таблице \"%s\" нет ограничения уникальности, " "соответствующего данным ключам" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:11993 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наследованное ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:11543 +#: commands/tablecmds.c:12043 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не существует, пропускается" -#: commands/tablecmds.c:11719 +#: commands/tablecmds.c:12219 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип столбца в типизированной таблице нельзя" -#: commands/tablecmds.c:11746 +#: commands/tablecmds.c:12246 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наследованный столбец \"%s\" нельзя" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12255 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -11220,7 +12000,7 @@ msgstr "" "изменить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:11805 +#: commands/tablecmds.c:12305 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -11228,45 +12008,45 @@ msgid "" msgstr "" "результат USING для столбца \"%s\" нельзя автоматически привести к типу %s" -#: commands/tablecmds.c:11808 +#: commands/tablecmds.c:12308 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить явное приведение." -#: commands/tablecmds.c:11812 +#: commands/tablecmds.c:12312 #, 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:11815 +#: commands/tablecmds.c:12315 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:11914 +#: commands/tablecmds.c:12414 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наследованный столбец \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:11942 +#: commands/tablecmds.c:12442 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ссылается на тип всей строки таблицы." -#: commands/tablecmds.c:11953 +#: commands/tablecmds.c:12453 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наследованного столбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:12078 +#: commands/tablecmds.c:12578 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "нельзя изменить тип столбца \"%s\" дважды" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12616 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -11275,156 +12055,153 @@ msgstr "" "генерирующее выражение для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:12121 +#: commands/tablecmds.c:12621 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:12199 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" - -#: commands/tablecmds.c:12200 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." - -#: commands/tablecmds.c:12221 +#: commands/tablecmds.c:12702 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "" "изменить тип столбца, задействованного в представлении или правиле, нельзя" -#: commands/tablecmds.c:12222 commands/tablecmds.c:12241 -#: commands/tablecmds.c:12259 +#: commands/tablecmds.c:12703 commands/tablecmds.c:12722 +#: commands/tablecmds.c:12740 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s зависит от столбца \"%s\"" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12721 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип столбца, задействованного в определении триггера, нельзя" -#: commands/tablecmds.c:12258 +#: commands/tablecmds.c:12739 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип столбца, задействованного в определении политики, нельзя" -#: commands/tablecmds.c:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:12770 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" + +#: commands/tablecmds.c:12771 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." + +#: commands/tablecmds.c:13848 commands/tablecmds.c:13860 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13850 commands/tablecmds.c:13862 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:13355 +#: commands/tablecmds.c:13876 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:13369 commands/tablecmds.c:16665 +#: commands/tablecmds.c:13890 commands/tablecmds.c:17209 +#: commands/tablecmds.c:17228 #, c-format msgid "Use ALTER TYPE instead." msgstr "Используйте ALTER TYPE." -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13899 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "" -"\"%s\" - это не таблица, TOAST-таблица, индекс, представление или " -"последовательность" +msgid "cannot change owner of relation \"%s\"" +msgstr "сменить владельца отношения \"%s\" нельзя" -#: commands/tablecmds.c:13717 +#: commands/tablecmds.c:14261 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14338 #, 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:13827 commands/view.c:505 +#: commands/tablecmds.c:14372 commands/view.c:521 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:14079 +#: commands/tablecmds.c:14622 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:14091 +#: commands/tablecmds.c:14634 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:14183 +#: commands/tablecmds.c:14726 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:14199 +#: commands/tablecmds.c:14742 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14860 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14865 commands/tablecmds.c:15421 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14870 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:14372 +#: commands/tablecmds.c:14916 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:14385 +#: commands/tablecmds.c:14929 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17309 +#: commands/tablecmds.c:14951 commands/tablecmds.c:17864 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17310 +#: commands/tablecmds.c:14952 commands/tablecmds.c:17865 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14965 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:14423 +#: commands/tablecmds.c:14967 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -11433,36 +12210,36 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:14626 +#: commands/tablecmds.c:15170 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "столбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15179 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:15229 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" msgstr "" "столбец \"%s\" в дочерней таблице содержит конфликтующее генерирующее " "выражение" -#: commands/tablecmds.c:14713 +#: commands/tablecmds.c:15257 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15345 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки " "\"%s\"" -#: commands/tablecmds.c:14809 +#: commands/tablecmds.c:15353 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -11471,7 +12248,7 @@ msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:14820 +#: commands/tablecmds.c:15364 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -11479,82 +12256,82 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:14855 +#: commands/tablecmds.c:15399 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15485 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "" "секция \"%s\" уже ожидает отсоединения от секционированной таблицы \"%s.%s\"" -#: commands/tablecmds.c:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15514 commands/tablecmds.c:15562 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:15024 +#: commands/tablecmds.c:15568 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:15252 +#: commands/tablecmds.c:15796 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15826 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15837 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:15302 +#: commands/tablecmds.c:15846 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:15860 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15912 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16086 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:15548 +#: commands/tablecmds.c:16092 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс " "\"%s\"" -#: commands/tablecmds.c:15554 +#: commands/tablecmds.c:16098 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:15560 +#: commands/tablecmds.c:16104 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:15577 +#: commands/tablecmds.c:16121 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -11563,7 +12340,7 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:15584 +#: commands/tablecmds.c:16128 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -11572,13 +12349,13 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:15831 +#: commands/tablecmds.c:16375 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:15855 +#: commands/tablecmds.c:16399 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -11586,12 +12363,12 @@ msgstr "" "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:15857 +#: commands/tablecmds.c:16401 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16446 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -11600,7 +12377,7 @@ msgstr "" "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:15912 +#: commands/tablecmds.c:16456 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -11609,85 +12386,102 @@ msgstr "" "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:15970 +#: commands/tablecmds.c:16514 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:16077 +#: commands/tablecmds.c:16621 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:16648 +#: commands/tablecmds.c:17042 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" - это не таблица и не материализованное представление" + +#: commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:16680 +#: commands/tablecmds.c:17220 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "" -"\"%s\" - это не таблица, представление, мат. представление, " -"последовательность или сторонняя таблица" +msgid "cannot change schema of index \"%s\"" +msgstr "сменить схему индекса \"%s\" нельзя" + +#: commands/tablecmds.c:17222 commands/tablecmds.c:17234 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Однако возможно сменить владельца таблицы." + +#: commands/tablecmds.c:17226 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "сменить схему составного типа \"%s\" нельзя" + +#: commands/tablecmds.c:17232 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "сменить схему TOAST-таблицы \"%s\" нельзя" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17269 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нераспознанная стратегия секционирования \"%s\"" -#: commands/tablecmds.c:16723 +#: commands/tablecmds.c:17277 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:16789 +#: commands/tablecmds.c:17343 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:16797 +#: commands/tablecmds.c:17351 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:16808 commands/tablecmds.c:16922 +#: commands/tablecmds.c:17362 commands/tablecmds.c:17452 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:16809 commands/tablecmds.c:16923 commands/trigger.c:653 +#: commands/tablecmds.c:17363 commands/tablecmds.c:17453 commands/trigger.c:668 #: rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Столбец \"%s\" является генерируемым." -#: commands/tablecmds.c:16885 -#, c-format -msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "" -"функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" - -#: commands/tablecmds.c:16905 +#: commands/tablecmds.c:17435 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:16935 +#: commands/tablecmds.c:17482 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "" +"функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" + +#: commands/tablecmds.c:17491 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:16956 +#: commands/tablecmds.c:17512 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:16991 +#: commands/tablecmds.c:17547 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -11696,7 +12490,7 @@ msgstr "" "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:16997 +#: commands/tablecmds.c:17553 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -11705,27 +12499,27 @@ msgstr "" "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:17249 +#: commands/tablecmds.c:17804 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:17255 +#: commands/tablecmds.c:17810 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:17271 +#: commands/tablecmds.c:17826 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:17285 +#: commands/tablecmds.c:17840 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:17319 +#: commands/tablecmds.c:17874 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -11733,7 +12527,7 @@ msgstr "" "подключить временное отношение в качестве секции постоянного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:17882 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -11741,92 +12535,92 @@ msgstr "" "подключить постоянное отношение в качестве секции временного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:17335 +#: commands/tablecmds.c:17890 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:17342 +#: commands/tablecmds.c:17897 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:17362 +#: commands/tablecmds.c:17917 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:17365 +#: commands/tablecmds.c:17920 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:17377 +#: commands/tablecmds.c:17932 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:17379 commands/trigger.c:459 +#: commands/tablecmds.c:17934 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" -msgstr "триггеры ROW с переходными таблицами для секций не поддерживаются" +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "Триггеры ROW с переходными таблицами для секций не поддерживаются." -#: commands/tablecmds.c:17558 +#: commands/tablecmds.c:18113 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:17561 +#: commands/tablecmds.c:18116 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:17885 +#: commands/tablecmds.c:18431 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " "умолчанию" -#: commands/tablecmds.c:17994 +#: commands/tablecmds.c:18540 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секционированная таблица \"%s\" была параллельно удалена" -#: commands/tablecmds.c:18000 +#: commands/tablecmds.c:18546 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:18483 commands/tablecmds.c:18503 -#: commands/tablecmds.c:18523 commands/tablecmds.c:18542 -#: commands/tablecmds.c:18584 +#: commands/tablecmds.c:19061 commands/tablecmds.c:19081 +#: commands/tablecmds.c:19101 commands/tablecmds.c:19120 +#: commands/tablecmds.c:19162 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:18486 +#: commands/tablecmds.c:19064 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:18506 +#: commands/tablecmds.c:19084 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:18526 +#: commands/tablecmds.c:19104 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:18545 +#: commands/tablecmds.c:19123 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -11835,171 +12629,169 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:18587 +#: commands/tablecmds.c:19165 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:18824 +#: commands/tablecmds.c:19402 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:18831 +#: commands/tablecmds.c:19409 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablespace.c:161 commands/tablespace.c:177 -#: commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 -#: storage/file/copydir.c:47 -#, c-format -msgid "could not create directory \"%s\": %m" -msgstr "не удалось создать каталог \"%s\": %m" - -#: commands/tablespace.c:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" существует, но это не каталог" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "нет прав на создание табличного пространства \"%s\"" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Для создания табличного пространства нужно быть суперпользователем." -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "в пути к табличному пространству не должно быть одинарных кавычек" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "путь к табличному пространству должен быть абсолютным" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "путь к табличному пространству \"%s\" слишком длинный" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "табличное пространство не должно располагаться внутри каталога данных" -#: commands/tablespace.c:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприемлемое имя табличного пространства: \"%s\"" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Префикс \"pg_\" зарезервирован для системных табличных пространств." -#: commands/tablespace.c:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличное пространство \"%s\" уже существует" -#: commands/tablespace.c:427 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "значение OID в pg_tablespace не задано в режиме двоичного обновления" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличное пространство \"%s\" не существует" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "табличное пространство \"%s\" не существует, пропускается" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "" "табличное пространство \"%s\" нельзя удалить, так как есть зависящие от него " "объекты" -#: commands/tablespace.c:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "табличное пространство \"%s\" не пусто" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "каталог \"%s\" не существует" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "" "Создайте этот каталог для табличного пространства до перезапуска сервера." -#: commands/tablespace.c:618 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалось установить права для каталога \"%s\": %m" -#: commands/tablespace.c:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" уже используется как табличное пространство" -#: commands/tablespace.c:768 commands/tablespace.c:781 -#: commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 -#: storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 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:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении символической ссылки \"%s\": %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - это не каталог или символическая ссылка" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличное пространство \"%s\" не существует." -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "удалить каталоги табличного пространства %u не удалось" -#: commands/tablespace.c:1567 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "При необходимости вы можете удалить их вручную." -#: commands/trigger.c:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - это таблица" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "У таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" - секционированная таблица" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format msgid "" "ROW triggers with transition tables are not supported on partitioned tables." @@ -12007,84 +12799,94 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в секционированных " "таблицах." -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - это представление" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "У представлений не может быть строковых триггеров BEFORE/AFTER." -#: commands/trigger.c:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "У представлений не может быть триггеров TRUNCATE." -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 -#: commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - сторонняя таблица" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "У сторонних таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "У сторонних таблиц не может быть триггеров TRUNCATE." -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "У сторонних таблиц не может быть ограничивающих триггеров." -#: commands/trigger.c:377 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "в отношении \"%s\" не может быть триггеров" + +#: commands/trigger.c:392 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "триггеры TRUNCATE FOR EACH ROW не поддерживаются" -#: commands/trigger.c:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "триггеры INSTEAD OF должны иметь тип FOR EACH ROW" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "триггеры INSTEAD OF несовместимы с условиями WHEN" -#: commands/trigger.c:393 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "для триггеров INSTEAD OF нельзя задать список столбцов" -#: commands/trigger.c:422 +#: commands/trigger.c:437 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "" "указание переменной типа кортеж в предложении REFERENCING не поддерживается" -#: commands/trigger.c:423 +#: commands/trigger.c:438 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Используйте OLD TABLE или NEW TABLE для именования переходных таблиц." -#: commands/trigger.c:436 +#: commands/trigger.c:451 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Триггеры сторонних таблиц не могут использовать переходные таблицы." -#: commands/trigger.c:443 +#: commands/trigger.c:458 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Триггеры представлений не могут использовать переходные таблицы." -#: commands/trigger.c:463 +#: commands/trigger.c:474 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "триггеры ROW с переходными таблицами для секций не поддерживаются" + +#: commands/trigger.c:478 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" @@ -12092,17 +12894,17 @@ msgstr "" "триггеры ROW с переходными таблицами для потомков в иерархии наследования не " "поддерживаются" -#: commands/trigger.c:469 +#: commands/trigger.c:484 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "имя переходной таблицы можно задать только для триггера AFTER" -#: commands/trigger.c:474 +#: commands/trigger.c:489 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "триггеры TRUNCATE с переходными таблицами не поддерживаются" -#: commands/trigger.c:491 +#: commands/trigger.c:506 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" @@ -12110,112 +12912,127 @@ msgstr "" "переходные таблицы нельзя задать для триггеров, назначаемых для нескольких " "событий" -#: commands/trigger.c:502 +#: commands/trigger.c:517 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "переходные таблицы нельзя задать для триггеров со списками столбцов" -#: commands/trigger.c:519 +#: commands/trigger.c:534 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можно задать только для триггеров INSERT или UPDATE" -#: commands/trigger.c:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE нельзя задать несколько раз" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можно задать только для триггеров DELETE или UPDATE" -#: commands/trigger.c:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE нельзя задать несколько раз" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "имя OLD TABLE не должно совпадать с именем NEW TABLE" -#: commands/trigger.c:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "в условии WHEN для операторного триггера нельзя ссылаться на значения " "столбцов" -#: commands/trigger.c:618 +#: commands/trigger.c:633 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "в условии WHEN для триггера INSERT нельзя ссылаться на значения OLD" -#: commands/trigger.c:631 +#: commands/trigger.c:646 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "в условии WHEN для триггера DELETE нельзя ссылаться на значения NEW" -#: commands/trigger.c:636 +#: commands/trigger.c:651 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на системные столбцы NEW" -#: commands/trigger.c:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на генерируемые столбцы " "NEW" -#: commands/trigger.c:645 +#: commands/trigger.c:660 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "" "Используется ссылка на всю строку таблицы, а таблица содержит генерируемые " "столбцы." -#: commands/trigger.c:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "триггер \"%s\" для отношения \"%s\" уже существует" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "триггер \"%s\" для отношения \"%s\" не является внутренним" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "триггер \"%s\" для отношения \"%s\" является внутренним или дочерним" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, 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:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "триггер \"%s\" для таблицы \"%s\" не существует" -#: commands/trigger.c:1600 +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "переименовать триггер \"%s\" в таблице \"%s\" нельзя" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Однако можно переименовать триггер в секционированной таблице \"%s\"." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "триггер \"%s\" в отношении \"%s\" переименован" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "нет доступа: \"%s\" - это системный триггер" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" msgstr "триггерная функция %u вернула значение NULL" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 -#: commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3364 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "триггер BEFORE STATEMENT не может возвращать значение" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " @@ -12223,7 +13040,7 @@ msgid "" msgstr "" "в триггере BEFORE FOR EACH ROW нельзя перемещать строку в другую секцию" -#: commands/trigger.c:2356 +#: commands/trigger.c:2586 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." @@ -12231,8 +13048,8 @@ msgstr "" "До выполнения триггера \"%s\" строка должна была находиться в секции \"%s." "%s\"." -#: commands/trigger.c:3104 executor/nodeModifyTable.c:1956 -#: executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3441 executor/nodeModifyTable.c:2350 +#: executor/nodeModifyTable.c:2433 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -12241,9 +13058,9 @@ msgstr "" "кортеж, который должен быть изменён, уже модифицирован в операции, вызванной " "текущей командой" -#: commands/trigger.c:3105 executor/nodeModifyTable.c:1306 -#: executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 -#: executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3442 executor/nodeModifyTable.c:1514 +#: executor/nodeModifyTable.c:1588 executor/nodeModifyTable.c:2351 +#: executor/nodeModifyTable.c:2434 executor/nodeModifyTable.c:3079 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -12252,129 +13069,130 @@ msgstr "" "Возможно, для распространения изменений в другие строки следует использовать " "триггер AFTER вместо BEFORE." -#: commands/trigger.c:3134 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 -#: executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 -#: executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3483 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:2368 +#: executor/nodeModifyTable.c:2576 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалось сериализовать доступ из-за параллельного изменения" -#: commands/trigger.c:3142 executor/nodeModifyTable.c:1412 -#: executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3491 executor/nodeModifyTable.c:1620 +#: executor/nodeModifyTable.c:2451 executor/nodeModifyTable.c:2600 +#: executor/nodeModifyTable.c:2967 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" -#: commands/trigger.c:4234 +#: commands/trigger.c:4698 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя вызвать отложенный " "триггер" -#: commands/trigger.c:5284 +#: commands/trigger.c:5881 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не является откладываемым" -#: commands/trigger.c:5307 +#: commands/trigger.c:5904 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не существует" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "функция %s должна возвращать тип %s" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "" "для создания анализаторов текстового поиска нужно быть суперпользователем" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "параметр анализатора текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "для анализатора текстового поиска требуется метод start" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "для анализатора текстового поиска требуется метод gettoken" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "для анализатора текстового поиска требуется метод end" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "для анализатора текстового поиска требуется метод lextypes" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "шаблон текстового поиска \"%s\" не принимает параметры" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "требуется шаблон текстового поиска" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "для создания шаблонов текстового поиска нужно быть суперпользователем" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "параметр шаблона текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "для шаблона текстового поиска требуется метод lexize" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "параметр конфигурации текстового поиска \"%s\" не распознан" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "указать и PARSER, и COPY одновременно нельзя" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "требуется анализатор текстового поиска" -#: commands/tsearchcmds.c:1200 +#: commands/tsearchcmds.c:1236 #, c-format msgid "token type \"%s\" does not exist" msgstr "тип фрагмента \"%s\" не существует" -#: commands/tsearchcmds.c:1427 +#: commands/tsearchcmds.c:1464 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "сопоставление для типа фрагмента \"%s\" не существует" -#: commands/tsearchcmds.c:1433 +#: commands/tsearchcmds.c:1470 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "сопоставление для типа фрагмента \"%s\" не существует, пропускается" -#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#: commands/tsearchcmds.c:1631 commands/tsearchcmds.c:1746 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "неверный формат списка параметров: \"%s\"" @@ -12393,42 +13211,42 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции ввода-вывода " "и в завершение выполните полноценную команду CREATE TYPE." -#: 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 "атрибут типа \"%s\" не распознан" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "неверная категория типа \"%s\": допустим только ASCII-символ" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "типом элемента массива не может быть %s" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип выравнивания \"%s\" не распознан" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "неизвестная стратегия хранения \"%s\"" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "необходимо указать функцию ввода типа" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "необходимо указать функцию вывода типа" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "" "type modifier output function is useless without a type modifier input " @@ -12437,89 +13255,89 @@ msgstr "" "функция вывода модификатора типа бесполезна без функции ввода модификатора " "типа" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "" "тип элемента нельзя задать без указания обработчика обращения по индексу" -#: commands/typecmds.c:784 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - неподходящий базовый тип для домена" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "неоднократное определение значения типа по умолчанию" -#: 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 "конфликтующие ограничения NULL/NOT NULL" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "" "ограничения-проверки для доменов не могут иметь характеристики NO INHERIT" -#: 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 "ограничения уникальности невозможны для доменов" -#: 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 "ограничения первичного ключа невозможны для доменов" -#: 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 "ограничения-исключения невозможны для доменов" -#: 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 "ограничения внешних ключей невозможны для доменов" -#: 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 "" "возможность определения отложенных ограничений для доменов не поддерживается" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "\"%s\" не является перечислением" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "требуется атрибут типа \"subtype\"" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "%s не может быть подтипом диапазона" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "указано правило сортировки для диапазона, но подтип не поддерживает " "сортировку" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "" "функцию получения канонического диапазона нельзя задать без предварительно " "созданного типа-пустышки" -#: commands/typecmds.c:1508 +#: commands/typecmds.c:1493 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " @@ -12528,96 +13346,96 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции приведения к " "каноническому виду и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:1981 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "функция ввода типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:1984 #, c-format msgid "type input function %s must return type %s" msgstr "функция ввода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2015 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s should not be volatile" msgstr "функция ввода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2043 +#: commands/typecmds.c:2028 #, c-format msgid "type output function %s must return type %s" msgstr "функция вывода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2050 +#: commands/typecmds.c:2035 #, c-format msgid "type output function %s should not be volatile" msgstr "функция вывода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2079 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "функция получения типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:2097 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" msgstr "функция получения типа %s должна возвращать тип %s" -#: commands/typecmds.c:2104 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" msgstr "функция получения типа %s не должна быть изменчивой" -#: commands/typecmds.c:2132 +#: commands/typecmds.c:2117 #, c-format msgid "type send function %s must return type %s" msgstr "функция отправки типа %s должна возвращать тип %s" -#: commands/typecmds.c:2139 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "функция отправки типа %s не должна быть изменчивой" -#: commands/typecmds.c:2166 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функция TYPMOD_IN %s должна возвращать тип %s" -#: commands/typecmds.c:2173 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функция ввода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2200 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функция TYPMOD_OUT %s должна возвращать тип %s" -#: commands/typecmds.c:2207 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функция вывода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2234 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "функция анализа типа %s должна возвращать тип %s" -#: commands/typecmds.c:2263 +#: commands/typecmds.c:2248 #, c-format msgid "type subscripting function %s must return type %s" msgstr "" "функция %s, реализующая для типа обращение по индексу, должна возвращать тип " "%s" -#: commands/typecmds.c:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "" "для пользовательских типов нельзя использовать функцию-обработчик обращения " "по индексу %s" -#: commands/typecmds.c:2319 +#: commands/typecmds.c:2304 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -12626,198 +13444,198 @@ msgstr "" "Вы должны указать класс операторов для типа диапазона или определить класс " "операторов по умолчанию для этого подтипа." -#: commands/typecmds.c:2350 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "" "функция получения канонического диапазона %s должна возвращать диапазон" -#: commands/typecmds.c:2356 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "" "функция получения канонического диапазона %s должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2392 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функция различий для подтипа диапазона (%s) должна возвращать тип %s" -#: commands/typecmds.c:2399 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "функция различий для подтипа диапазона (%s) должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2426 +#: commands/typecmds.c:2411 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значение OID массива в pg_type не задано в режиме двоичного обновления" -#: commands/typecmds.c:2459 +#: commands/typecmds.c:2444 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "" "значение OID мультидиапазона в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2492 +#: commands/typecmds.c:2477 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "" "значение OID массива мультидиапазонов в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2791 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "столбец \"%s\" таблицы \"%s\" содержит значения NULL" -#: 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 "ограничение \"%s\" для домена \"%s\" не существует" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" для домена \"%s\" не существует, пропускается" -#: commands/typecmds.c:3113 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "" "ограничение \"%s\" для домена \"%s\" не является ограничением-проверкой" -#: commands/typecmds.c:3219 +#: commands/typecmds.c:3204 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "столбец \"%s\" таблицы \"%s\" содержит значения, нарушающие новое ограничение" -#: 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\" - это не домен" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ограничение \"%s\" для домена \"%s\" уже существует" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "в ограничении-проверке для домена нельзя ссылаться на таблицы" -#: 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 - это тип строк таблицы" -#: 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 "Изменить его можно с помощью 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 "изменить тип массива \"%s\" нельзя" -#: 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 "Однако можно изменить тип %s, что повлечёт изменение типа массива." -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" уже существует в схеме \"%s\"" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "сменить вариант хранения типа на PLAIN нельзя" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "у типа нельзя изменить атрибут \"%s\"" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "для модификации типа нужно быть суперпользователем" -#: 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 — не базовый тип" -#: 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:270 #, c-format msgid "must be superuser to create bypassrls users" msgstr "" "для создания пользователей c атрибутом 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:1226 commands/user.c:1233 -#: utils/adt/acl.c:5248 utils/adt/acl.c:5254 gram.y:15260 gram.y:15305 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 +#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:16437 gram.y:16483 #, c-format msgid "role name \"%s\" is reserved" msgstr "имя роли \"%s\" зарезервировано" -#: 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 "Имена ролей, начинающиеся с \"pg_\", зарезервированы." -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "роль \"%s\" уже существует" -#: 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 "пустая строка не является допустимым паролем; пароль сбрасывается" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "значение OID в pg_authid не задано в режиме двоичного обновления" -#: commands/user.c:570 commands/user.c:925 +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "Изменять зарезервированные роли нельзя." # skip-rule: translate-superuser -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "" "must be superuser to alter superuser roles or change superuser attribute" @@ -12825,7 +13643,7 @@ msgstr "" "для модификации ролей суперпользователей или изменения атрибута superuser " "нужно быть суперпользователем" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "" "must be superuser to alter replication roles or change replication attribute" @@ -12833,186 +13651,186 @@ msgstr "" "для модификации ролей репликации или изменения атрибута replication нужно " "быть суперпользователем" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "для изменения атрибута bypassrls нужно быть суперпользователем" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "нет доступа" -#: 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 "для модификации суперпользователей нужно быть суперпользователем" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "для глобального изменения параметров нужно быть суперпользователем" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "нет прав для удаления роли" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "использовать специальную роль в DROP ROLE нельзя" -#: 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:710 +#: 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:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "роль \"%s\" не существует, пропускается" -#: 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 "пользователь не может удалить сам себя" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "пользователя текущего сеанса нельзя удалить" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "для удаления суперпользователей нужно быть суперпользователем" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "роль \"%s\" нельзя удалить, так как есть зависящие от неё объекты" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "пользователя текущего сеанса нельзя переименовать" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "пользователь не может переименовать сам себя" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "для переименования суперпользователей нужно быть суперпользователем" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "нет прав на переименование роли" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "в результате переименования роли очищен MD5-хеш пароля" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "в GRANT/REVOKE ROLE нельзя включать названия столбцов" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "нет прав на удаление объектов" -#: 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 "нет прав для переназначения объектов" -#: 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 для роли \"%s\"" -#: commands/user.c:1509 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "роль \"%s\" не может содержать явных членов" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "для назначения права управления правами нужно быть суперпользователем" -#: commands/user.c:1560 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "роль \"%s\" не может быть членом другой роли" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" включена в роль \"%s\"" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "роль \"%s\" уже включена в роль \"%s\"" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "роль \"%s\" не включена в роль \"%s\"" -#: commands/vacuum.c:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нераспознанный параметр ANALYZE: \"%s\"" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "для параметра parallel требуется значение от 0 до %d" -#: commands/vacuum.c:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "" "число параллельных исполнителей для выполнения очистки должно быть от 0 до %d" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нераспознанный параметр VACUUM: \"%s\"" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL нельзя выполнять в параллельном режиме" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "если задаётся список столбцов, необходимо указать ANALYZE" -#: commands/vacuum.c:329 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s нельзя выполнить в ходе VACUUM или ANALYZE" -#: commands/vacuum.c:339 +#: commands/vacuum.c:346 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING нельзя использовать с FULL" -#: commands/vacuum.c:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "VACUUM FULL работает только с PROCESS_TOAST" @@ -13078,12 +13896,12 @@ msgstr "анализ \"%s\" пропускается --- блокировка н msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "анализ \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "самый старый xmin далеко в прошлом" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13095,12 +13913,12 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: commands/vacuum.c:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "самый старый multixact далеко в прошлом" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, c-format msgid "" "Close open transactions with multixacts soon to avoid wraparound problems." @@ -13108,27 +13926,79 @@ msgstr "" "Скорее закройте открытые транзакции в мультитранзакциях, чтобы избежать " "проблемы зацикливания." -#: commands/vacuum.c:1755 +#: commands/vacuum.c:1807 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "есть базы данных, которые не очищались на протяжении более чем 2 миллиардов " "транзакций" -#: commands/vacuum.c:1756 +#: commands/vacuum.c:1808 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Возможно, вы уже потеряли данные в результате зацикливания ID транзакций." -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1976 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" пропускается --- очищать не таблицы или специальные системные таблицы " "нельзя" -#: commands/variable.c:165 utils/misc/guc.c:11657 utils/misc/guc.c:11719 +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "просканирован индекс \"%s\", удалено версий строк: %d" + +#: commands/vacuum.c:2373 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "индекс \"%s\" теперь содержит версий строк: %.0f, в страницах: %u" + +#: commands/vacuum.c:2377 +#, 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:664 +#, 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 параллельный процесс очистки для очистки индекса (планировалось: " +"%d)" +msgstr[1] "" +"запущен %d параллельных процесса очистки для очистки индекса (планировалось: " +"%d)" +msgstr[2] "" +"запущено %d параллельных процессов очистки для очистки индекса " +"(планировалось: %d)" + +#: commands/vacuumparallel.c:670 +#, 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 параллельный процесс очистки для уборки индекса (планировалось: " +"%d)" +msgstr[1] "" +"запущено %d параллельных процесса очистки для уборки индекса (планировалось: " +"%d)" +msgstr[2] "" +"запущено %d параллельных процессов очистки для уборки индекса " +"(планировалось: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:12115 utils/misc/guc.c:12193 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "нераспознанное ключевое слово: \"%s\"." @@ -13195,7 +14065,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:1693 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "использовать сериализуемый режим в горячем резерве нельзя" @@ -13268,33 +14138,40 @@ msgstr "" "Чтобы изменить имя столбца представления, выполните ALTER VIEW ... RENAME " "COLUMN ..." -#: commands/view.c:304 +#: commands/view.c:309 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "изменить тип столбца представления \"%s\" с %s на %s нельзя" -#: commands/view.c:452 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "" +"изменить правило сортировки для столбца представления \"%s\" с \"%s\" на " +"\"%s\" нельзя" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "представления не должны содержать SELECT INTO" -#: commands/view.c:464 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "представления не должны содержать операторы, изменяющие данные в WITH" -#: commands/view.c:534 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "в CREATE VIEW указано больше имён столбцов, чем самих столбцов" -#: commands/view.c:542 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "" "представления не могут быть нежурналируемыми, так как они нигде не хранятся" -#: commands/view.c:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "представление \"%s\" будет создано как временное" @@ -13332,7 +14209,7 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "" "для курсора \"%s\" не выполняется обновляемое сканирование таблицы \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2452 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -13340,55 +14217,55 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2464 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2466 #, c-format msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" #: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 -#: executor/execExprInterp.c:4033 executor/execExprInterp.c:4050 -#: executor/execExprInterp.c:4149 executor/nodeModifyTable.c:119 -#: executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 -#: executor/nodeModifyTable.c:155 +#: executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 +#: executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип строки таблицы отличается от типа строки-результата запроса" -#: executor/execExpr.c:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "Запрос возвращает больше столбцов." -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." -#: executor/execExpr.c:650 executor/execExprInterp.c:4051 -#: executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 +#: executor/nodeModifyTable.c:209 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "" "В таблице определён тип %s (номер столбца: %d), а в запросе предполагается " "%s." -#: executor/execExpr.c:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:837 #, c-format msgid "window function calls cannot be nested" msgstr "вложенные вызовы оконных функций недопустимы" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "целевой тип не является массивом" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "столбец ROW() имеет тип %s, а должен - %s" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 +#: executor/execExpr.c:2482 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" @@ -13397,53 +14274,60 @@ msgstr[0] "функции нельзя передать больше %d аргу msgstr[1] "функции нельзя передать больше %d аргументов" msgstr[2] "функции нельзя передать больше %d аргументов" -#: executor/execExpr.c:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "" +"функция, возвращающая множество, вызвана в контексте, где ему нет места" + +#: executor/execExpr.c:2915 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:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не поддерживает изменение элемента по индексу" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типа %s был удалён" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типа %s имеет неправильный тип" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3058 -#: executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 +#: executor/execExprInterp.c:3106 #, c-format msgid "Table has type %s, but query expects %s." msgstr "В таблице задан тип %s, а в запросе ожидается %s." -#: executor/execExprInterp.c:2004 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:492 +#: executor/execExprInterp.c:2006 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:570 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" -#: executor/execExprInterp.c:2542 +#: executor/execExprInterp.c:2544 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиц такого типа не поддерживается" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2757 #, c-format msgid "cannot merge incompatible arrays" msgstr "не удалось объединить несовместимые массивы" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2758 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -13452,16 +14336,16 @@ msgstr "" "Массив с типом элементов %s нельзя включить в конструкцию ARRAY с типом " "элементов %s." -#: executor/execExprInterp.c:2777 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 -#: utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:264 +#: utils/adt/arrayfuncs.c:564 utils/adt/arrayfuncs.c:1306 +#: utils/adt/arrayfuncs.c:3422 utils/adt/arrayfuncs.c:5419 +#: utils/adt/arrayfuncs.c:5936 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:2797 executor/execExprInterp.c:2832 +#: executor/execExprInterp.c:2799 executor/execExprInterp.c:2834 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -13469,32 +14353,35 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: executor/execExprInterp.c:2809 utils/adt/array_expanded.c:274 -#: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 -#: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 -#: utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 -#: utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 -#: utils/adt/arrayutils.c:110 +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:937 utils/adt/arrayfuncs.c:1545 +#: utils/adt/arrayfuncs.c:2353 utils/adt/arrayfuncs.c:2368 +#: utils/adt/arrayfuncs.c:2630 utils/adt/arrayfuncs.c:2646 +#: utils/adt/arrayfuncs.c:2954 utils/adt/arrayfuncs.c:2969 +#: utils/adt/arrayfuncs.c:3310 utils/adt/arrayfuncs.c:3452 +#: utils/adt/arrayfuncs.c:6028 utils/adt/arrayfuncs.c:6369 +#: utils/adt/arrayutils.c:88 utils/adt/arrayutils.c:97 +#: utils/adt/arrayutils.c:104 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "размер массива превышает предел (%d)" -#: executor/execExprInterp.c:3057 executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d имеет неверный тип" -#: executor/execExprInterp.c:3662 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3691 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускает значения null" -#: executor/execExprInterp.c:3677 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3706 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значение домена %s нарушает ограничение-проверку \"%s\"" -#: executor/execExprInterp.c:4034 +#: executor/execExprInterp.c:4063 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -13502,14 +14389,14 @@ msgstr[0] "Строка таблицы содержит %d атрибут, а в msgstr[1] "Строка таблицы содержит %d атрибута, а в запросе ожидается %d." msgstr[2] "Строка таблицы содержит %d атрибутов, а в запросе ожидается %d." -#: executor/execExprInterp.c:4150 executor/execSRF.c:977 +#: executor/execExprInterp.c:4179 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "Несоответствие параметров физического хранения удалённого атрибута (под " "номером %d)." -#: executor/execIndexing.c:567 +#: executor/execIndexing.c:571 #, c-format msgid "" "ON CONFLICT does not support deferrable unique constraints/exclusion " @@ -13518,54 +14405,54 @@ msgstr "" "ON CONFLICT не поддерживает откладываемые ограничения уникальности/" "ограничения-исключения в качестве определяющего индекса" -#: executor/execIndexing.c:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не удалось создать ограничение-исключение \"%s\"" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфликтует с ключом %s." -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Обнаружен конфликт ключей." -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфликтующее значение ключа нарушает ограничение-исключение \"%s\"" -#: executor/execIndexing.c:852 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфликтует с существующим ключом %s." -#: executor/execIndexing.c:854 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфликтует с уже существующим." -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "последовательность \"%s\" изменить нельзя" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3096 -#: rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставить данные в представление \"%s\" нельзя" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3099 -#: rewrite/rewriteHandler.c:3930 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 +#: rewrite/rewriteHandler.c:3977 #, c-format msgid "" "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " @@ -13574,14 +14461,14 @@ msgstr "" "Чтобы представление допускало добавление данных, установите триггер INSTEAD " "OF INSERT или безусловное правило ON INSERT DO INSTEAD." -#: executor/execMain.c:1039 rewrite/rewriteHandler.c:3104 -#: rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 +#: rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot update view \"%s\"" msgstr "изменить данные в представлении \"%s\" нельзя" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3107 -#: rewrite/rewriteHandler.c:3938 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 +#: rewrite/rewriteHandler.c:3985 #, c-format msgid "" "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " @@ -13590,14 +14477,14 @@ msgstr "" "Чтобы представление допускало изменение данных, установите триггер INSTEAD " "OF UPDATE или безусловное правило ON UPDATE DO INSTEAD." -#: executor/execMain.c:1047 rewrite/rewriteHandler.c:3112 -#: rewrite/rewriteHandler.c:3943 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 +#: rewrite/rewriteHandler.c:3990 #, c-format msgid "cannot delete from view \"%s\"" msgstr "удалить данные из представления \"%s\" нельзя" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3115 -#: rewrite/rewriteHandler.c:3946 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 +#: rewrite/rewriteHandler.c:3993 #, c-format msgid "" "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " @@ -13606,119 +14493,137 @@ msgstr "" "Чтобы представление допускало удаление данных, установите триггер INSTEAD OF " "DELETE или безусловное правило ON DELETE DO INSTEAD." -#: executor/execMain.c:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "изменить материализованное представление \"%s\" нельзя" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставлять данные в стороннюю таблицу \"%s\" нельзя" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "сторонняя таблица \"%s\" не допускает добавления" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "изменять данные в сторонней таблице \"%s\"" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "сторонняя таблица \"%s\" не допускает изменения" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "удалять данные из сторонней таблицы \"%s\" нельзя" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "сторонняя таблица \"%s\" не допускает удаления" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "отношение \"%s\" изменить нельзя" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокировать строки в последовательности \"%s\" нельзя" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокировать строки в TOAST-отношении \"%s\" нельзя" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокировать строки в представлении \"%s\" нельзя" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокировать строки в материализованном представлении \"%s\" нельзя" -#: executor/execMain.c:1173 executor/execMain.c:2587 +#: executor/execMain.c:1175 executor/execMain.c:2685 #: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокировать строки в сторонней таблице \"%s\" нельзя" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокировать строки в отношении \"%s\" нельзя" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новая строка в отношении \"%s\" нарушает ограничение секции" -#: 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 "Ошибочная строка содержит %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 в столбце \"%s\" отношения \"%s\" нарушает ограничение NOT NULL" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новая строка в отношении \"%s\" нарушает ограничение-проверку \"%s\"" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новая строка нарушает ограничение-проверку для представления \"%s\"" -#: executor/execMain.c:2055 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" для таблицы " "\"%s\"" -#: executor/execMain.c:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "" "новая строка нарушает политику защиты на уровне строк для таблицы \"%s\"" -#: executor/execMain.c:2067 +#: executor/execMain.c:2153 +#, c-format +msgid "" +"target row violates row-level security policy \"%s\" (USING expression) for " +"table \"%s\"" +msgstr "" +"целевая строка нарушает политику защиты на уровне строк \"%s\" (выражение " +"USING) для таблицы \"%s\"" + +#: executor/execMain.c:2158 +#, c-format +msgid "" +"target row violates row-level security policy (USING expression) for table " +"\"%s\"" +msgstr "" +"новая строка нарушает политику защиты на уровне строк (выражение USING) для " +"таблицы \"%s\"" + +#: executor/execMain.c:2165 #, c-format msgid "" "new row violates row-level security policy \"%s\" (USING expression) for " @@ -13727,7 +14632,7 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк \"%s\" (выражение " "USING) для таблицы \"%s\"" -#: executor/execMain.c:2072 +#: executor/execMain.c:2170 #, c-format msgid "" "new row violates row-level security policy (USING expression) for table " @@ -13736,12 +14641,12 @@ msgstr "" "новая строка нарушает политику защиты на уровне строк (выражение USING) для " "таблицы \"%s\"" -#: executor/execPartition.c:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "для строки не найдена секция в отношении \"%s\"" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ секционирования для неподходящей строки содержит %s." @@ -13765,16 +14670,43 @@ msgstr "параллельное изменение; следует повтор msgid "concurrent delete, retrying" msgstr "параллельное удаление; следует повторная попытка" -#: executor/execReplication.c:276 parser/parse_cte.c:301 +#: executor/execReplication.c:276 parser/parse_cte.c:308 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 -#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 -#: utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 +#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3702 +#: utils/adt/arrayfuncs.c:4257 utils/adt/arrayfuncs.c:6249 #: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не удалось найти оператор равенства для типа %s" -#: executor/execReplication.c:604 +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "изменять данные в таблице \"%s\" нельзя" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "" +"Column used in the publication WHERE expression is not part of the replica " +"identity." +msgstr "" +"Столбец, фигурирующий в выражении WHERE публикации, не входит в " +"идентификатор реплики." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "" +"Column list used by the publication does not cover the replica identity." +msgstr "" +"Список столбцов, используемых в публикации, не покрывает идентификатор " +"реплики." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "удалять данные из таблицы \"%s\" нельзя" + +#: executor/execReplication.c:644 #, c-format msgid "" "cannot update table \"%s\" because it does not have a replica identity and " @@ -13783,14 +14715,14 @@ msgstr "" "изменение в таблице \"%s\" невозможно, так как в ней отсутствует " "идентификатор реплики, но она публикует изменения" -#: executor/execReplication.c:606 +#: executor/execReplication.c:646 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "" "Чтобы эта таблица поддерживала изменение, установите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:610 +#: executor/execReplication.c:650 #, c-format msgid "" "cannot delete from table \"%s\" because it does not have a replica identity " @@ -13799,7 +14731,7 @@ msgstr "" "удаление из таблицы \"%s\" невозможно, так как в ней отсутствует " "идентификатор реплики, но она публикует удаления" -#: executor/execReplication.c:612 +#: executor/execReplication.c:652 #, c-format msgid "" "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." @@ -13807,23 +14739,13 @@ msgstr "" "Чтобы эта таблица поддерживала удаление, установите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "" "в качестве целевого отношения для логической репликации нельзя использовать " "\"%s.%s\"" -#: executor/execReplication.c:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "\"%s.%s\" — сторонняя таблица." - -#: executor/execReplication.c:641 -#, 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" @@ -13906,7 +14828,7 @@ msgid "%s is not allowed in an SQL function" msgstr "%s нельзя использовать в SQL-функции" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s нельзя использовать в не изменчивой (volatile) функции" @@ -13973,23 +14895,17 @@ msgstr "Последний оператор возвращает слишком msgid "return type %s is not supported for SQL functions" msgstr "для SQL-функций тип возврата %s не поддерживается" -#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" +msgid "aggregate %u needs to have compatible input type and transition type" msgstr "" -"неожиданный конец файла для ленты %d: запрашивалось байт: %zu, прочитано: %zu" +"агрегатная функция %u должна иметь совместимые входной и переходный типы" -#: executor/nodeAgg.c:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3952 parser/parse_agg.c:679 parser/parse_agg.c:707 #, c-format msgid "aggregate function calls cannot be nested" msgstr "вложенные вызовы агрегатных функций недопустимы" -#: executor/nodeAgg.c:4187 executor/nodeWindowAgg.c:2845 -#, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "" -"агрегатная функция %u должна иметь совместимые входной и переходный типы" - #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -14038,12 +14954,12 @@ msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение слиянием" -#: executor/nodeModifyTable.c:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "Запрос возвращает меньше столбцов." -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1513 executor/nodeModifyTable.c:1587 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " @@ -14052,12 +14968,12 @@ msgstr "" "кортеж, который должен быть удалён, уже модифицирован в операции, вызванной " "текущей командой" -#: executor/nodeModifyTable.c:1583 +#: executor/nodeModifyTable.c:1742 #, c-format msgid "invalid ON UPDATE specification" msgstr "неверное указание ON UPDATE" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1743 #, c-format msgid "" "The result tuple would appear in a different partition than the original " @@ -14066,26 +14982,73 @@ msgstr "" "Результирующий кортеж окажется перемещённым из секции исходного кортежа в " "другую." -#: executor/nodeModifyTable.c:2183 +#: executor/nodeModifyTable.c:2204 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" -msgstr "команда ON CONFLICT DO UPDATE не может менять строку повторно" +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:2184 +#: executor/nodeModifyTable.c:2205 #, c-format msgid "" -"Ensure that no rows proposed for insertion within the same command have " -"duplicate constrained values." +"A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" -"Проверьте, не содержат ли строки, которые должна добавить команда, " -"дублирующиеся значения, подпадающие под ограничения." +"Внешний ключ ссылается на предка \"%s\", а не на корневого предка \"%s\"." -#: executor/nodeSamplescan.c:259 +#: executor/nodeModifyTable.c:2208 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Возможно, имеет смысл перенацелить внешний ключ на таблицу \"%s\"." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2554 executor/nodeModifyTable.c:2956 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "команда %s не может подействовать на строку дважды" + +#: executor/nodeModifyTable.c:2556 +#, c-format +msgid "" +"Ensure that no rows proposed for insertion within the same command have " +"duplicate constrained values." +msgstr "" +"Проверьте, не содержат ли строки, которые должна добавить команда, " +"дублирующиеся значения, подпадающие под ограничения." + +#: executor/nodeModifyTable.c:2958 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "" +"Проверьте, не может ли какой-либо целевой строке соответствовать более одной " +"исходной строки." + +#: executor/nodeModifyTable.c:3039 +#, c-format +msgid "" +"tuple to be deleted was already moved to another partition due to concurrent " +"update" +msgstr "" +"кортеж, подлежащий удалению, был перемещён в другую секцию в результате " +"параллельного изменения" + +#: executor/nodeModifyTable.c:3078 +#, 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" @@ -14126,106 +15089,106 @@ msgstr "в столбце \"%s\" не допускается NULL" msgid "moving-aggregate transition function must not return null" msgstr "функция перехода движимого агрегата не должна возвращать NULL" -#: executor/nodeWindowAgg.c:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "смещение начала рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "смещение начала рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "смещение конца рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "смещение конца рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "" "агрегатная функция %s не поддерживает использование в качестве оконной " "функции" -#: executor/spi.c:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "неверное завершение транзакции" -#: executor/spi.c:256 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "фиксировать транзакцию при наличии активных подтранзакций нельзя" -#: executor/spi.c:347 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "откатить транзакцию при наличии активных подтранзакций нельзя" -#: executor/spi.c:482 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "после транзакции остался непустой стек SPI" -#: executor/spi.c:483 executor/spi.c:543 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Проверьте наличие вызова \"SPI_finish\"." -#: executor/spi.c:542 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "после подтранзакции остался непустой стек SPI" -#: executor/spi.c:1610 +#: 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:1620 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "не удалось открыть запрос %s как курсор" -#: executor/spi.c:1726 +#: 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:1727 parser/analyze.c:2853 +#: executor/spi.c:1717 parser/analyze.c:2899 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Прокручиваемые курсоры должны быть READ ONLY." -#: executor/spi.c:2482 +#: executor/spi.c:2474 #, c-format msgid "empty query does not return tuples" msgstr "пустой запрос не возвращает кортежи" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "запрос %s не возвращает кортежи" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL-выражение \"%s\"" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "присваивание PL/pgSQL \"%s\"" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор: \"%s\"" @@ -14235,98 +15198,108 @@ 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" -#: lib/dshash.c:246 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "В данном контексте недопустимы никакие параметры." + +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 #: utils/mmgr/dsa.c:806 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Ошибка при запросе памяти DSA (%zu Б)." -#: libpq/auth-scram.c:249 +#: 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: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 "неверная запись секрета SCRAM для пользователя \"%s\"" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Для пользователя \"%s\" нет подходящей записи секрета SCRAM." -#: 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 "неправильное сообщение SCRAM" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "Сообщение пустое." -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "Длина сообщения не соответствует входной длине." -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "неверный ответ SCRAM" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Разовый код не совпадает." -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "не удалось сгенерировать случайную соль" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Ожидался атрибут \"%c\", но обнаружено \"%s\"." -#: 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 "Ожидался символ \"=\" для атрибута \"%c\"." -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "Ожидался атрибут, но обнаружен конец строки." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Ожидался атрибут, но обнаружен неправильный символ \"%s\"." -#: 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 " @@ -14335,17 +15308,17 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256-PLUS, но в сообщении SCRAM отсутствуют " "данные связывания каналов." -#: 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 "Ожидалась запятая, но обнаружен символ \"%s\"." -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Ошибка согласования связывания каналов SCRAM" -#: 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. " @@ -14354,7 +15327,7 @@ msgstr "" "Клиент поддерживает связывание каналов SCRAM, но полагает, что оно не " "поддерживается сервером. Однако сервер тоже поддерживает связывание каналов." -#: 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 " @@ -14363,155 +15336,155 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256 без связывания каналов, но сообщение " "SCRAM содержит данные связывания каналов." -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "неподдерживаемый тип связывания каналов SCRAM \"%s\"" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Неожиданный флаг связывания каналов \"%s\"." -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клиент передал идентификатор для авторизации, но это не поддерживается" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Неожиданный атрибут \"%s\" в первом сообщении клиента." -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клиенту требуется неподдерживаемое расширение SCRAM" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "непечатаемые символы в разовом коде SCRAM" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "не удалось сгенерировать разовый код" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "не удалось оформить разовый код" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "ошибка проверки связывания каналов SCRAM" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "" "неожиданный атрибут связывания каналов в последнем сообщении клиента SCRAM" -#: libpq/auth-scram.c:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "Некорректное подтверждение в последнем сообщении клиента." -#: libpq/auth-scram.c:1349 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Мусор в конце последнего сообщения клиента." -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: не разрешённый компьютер" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (\"trust\")" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Ident)" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Peer)" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по паролю)" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (GSSAPI)" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (SSPI)" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (PAM)" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (BSD)" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (LDAP)" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по сертификату)" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (RADIUS)" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: неверный метод проверки" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "Подключение соответствует строке %d в pg_hba.conf: \"%s\"" -#: libpq/auth.c:371 +#: libpq/auth.c:362 #, c-format msgid "authentication identifier set more than once" msgstr "аутентификационный идентификатор указан повторно" -#: libpq/auth.c:372 +#: libpq/auth.c:363 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "предыдущий идентификатор: \"%s\"; новый: \"%s\"" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "соединение аутентифицировано: идентификатор=\"%s\" метод=%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 " @@ -14520,25 +15493,25 @@ msgstr "" "сертификаты клиентов могут проверяться, только если доступно хранилище " "корневых сертификатов" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "для подключения требуется годный сертификат клиента" -#: libpq/auth.c:462 libpq/auth.c:508 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "Шифрование GSS" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "Шифрование SSL" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "без шифрования" #. 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" @@ -14547,7 +15520,7 @@ msgstr "" "пользователь \"%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 " @@ -14556,38 +15529,38 @@ msgstr "" "pg_hba.conf отвергает подключение: компьютер \"%s\", пользователь \"%s\", " "база данных \"%s\", %s" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "IP-адрес клиента разрешается в \"%s\", соответствует прямому преобразованию." -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "IP-адрес клиента разрешается в \"%s\", прямое преобразование не проверялось." -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "IP-адрес клиента разрешается в \"%s\", это не соответствует прямому " "преобразованию." -#: libpq/auth.c:527 +#: 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:532 +#: libpq/auth.c:523 #, 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:540 +#: libpq/auth.c:531 #, c-format msgid "" "no pg_hba.conf entry for replication connection from host \"%s\", user " @@ -14597,29 +15570,29 @@ msgstr "" "компьютера \"%s\" для пользователя \"%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 "" "в pg_hba.conf нет записи для компьютера \"%s\", пользователя \"%s\", базы " "\"%s\", %s" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "ожидался ответ с паролем, но получено сообщение %d" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "неверный размер пакета с паролем" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "клиент возвратил пустой пароль" -#: libpq/auth.c:887 libpq/hba.c:1366 +#: libpq/auth.c:878 libpq/hba.c:1335 #, c-format msgid "" "MD5 authentication is not supported when \"db_user_namespace\" is enabled" @@ -14627,230 +15600,225 @@ msgstr "" "проверка подлинности MD5 не поддерживается, когда включён режим " "\"db_user_namespace\"" -#: libpq/auth.c:893 +#: libpq/auth.c:884 #, c-format msgid "could not generate random MD5 salt" msgstr "не удалось сгенерировать случайную соль для MD5" -#: libpq/auth.c:959 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "ожидался ответ SASL, но получено сообщение %d" - -#: libpq/auth.c:1088 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:933 libpq/be-secure-gssapi.c:535 #, c-format msgid "could not set environment: %m" msgstr "не удалось задать переменную окружения: %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:969 #, c-format msgid "expected GSS response, got message type %d" msgstr "ожидался ответ GSS, но получено сообщение %d" -#: libpq/auth.c:1184 +#: libpq/auth.c:1029 msgid "accepting GSS security context failed" msgstr "принять контекст безопасности GSS не удалось" -#: libpq/auth.c:1225 +#: libpq/auth.c:1070 msgid "retrieving GSS user name failed" msgstr "получить имя пользователя GSS не удалось" -#: libpq/auth.c:1374 +#: libpq/auth.c:1219 msgid "could not acquire SSPI credentials" msgstr "не удалось получить удостоверение SSPI" -#: libpq/auth.c:1399 +#: libpq/auth.c:1244 #, c-format msgid "expected SSPI response, got message type %d" msgstr "ожидался ответ SSPI, но получено сообщение %d" -#: libpq/auth.c:1477 +#: libpq/auth.c:1322 msgid "could not accept SSPI security context" msgstr "принять контекст безопасности SSPI не удалось" -#: libpq/auth.c:1539 +#: libpq/auth.c:1384 msgid "could not get token from SSPI security context" msgstr "не удалось получить маркер из контекста безопасности SSPI" -#: libpq/auth.c:1678 libpq/auth.c:1697 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "не удалось преобразовать имя" -#: libpq/auth.c:1710 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "имя области слишком длинное" -#: libpq/auth.c:1725 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "преобразованное имя учётной записи слишком длинное" -#: libpq/auth.c:1906 +#: libpq/auth.c:1751 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не удалось создать сокет для подключения к серверу Ident: %m" -#: libpq/auth.c:1921 +#: libpq/auth.c:1766 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не удалось привязаться к локальному адресу \"%s\": %m" -#: libpq/auth.c:1933 +#: libpq/auth.c:1778 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не удалось подключиться к серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1955 +#: libpq/auth.c:1800 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось отправить запрос серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1972 +#: libpq/auth.c:1817 #, c-format msgid "" "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось получить ответ от сервера Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1982 +#: libpq/auth.c:1827 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неверно форматированный ответ от сервера Ident: \"%s\"" -#: libpq/auth.c:2035 +#: libpq/auth.c:1880 #, c-format msgid "peer authentication is not supported on this platform" msgstr "проверка подлинности peer в этой ОС не поддерживается" -#: libpq/auth.c:2039 +#: libpq/auth.c:1884 #, c-format msgid "could not get peer credentials: %m" msgstr "не удалось получить данные пользователя через механизм peer: %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1896 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "найти локального пользователя по идентификатору (%ld) не удалось: %s" -#: libpq/auth.c:2152 +#: libpq/auth.c:1997 #, c-format msgid "error from underlying PAM layer: %s" msgstr "ошибка в нижележащем слое PAM: %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2008 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "неподдерживаемое сообщение ответа PAM %d/\"%s\"" -#: libpq/auth.c:2223 +#: libpq/auth.c:2068 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не удалось создать аутентификатор PAM: %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2079 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "ошибка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "ошибка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2123 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "ошибка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2136 #, c-format msgid "pam_authenticate failed: %s" msgstr "ошибка в pam_authenticate: %s" -#: libpq/auth.c:2304 +#: libpq/auth.c:2149 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "ошибка в pam_acct_mgmt: %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2160 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не удалось освободить аутентификатор PAM: %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2240 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не удалось инициализировать LDAP (код ошибки: %d)" -#: libpq/auth.c:2432 +#: libpq/auth.c:2277 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не удалось извлечь имя домена из ldapbasedn" -#: libpq/auth.c:2440 +#: libpq/auth.c:2285 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "для аутентификации LDAP не удалось найти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2442 +#: libpq/auth.c:2287 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Задайте имя сервера LDAP явным образом." -#: libpq/auth.c:2494 +#: libpq/auth.c:2339 #, c-format msgid "could not initialize LDAP: %s" msgstr "не удалось инициализировать LDAP: %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2349 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps с текущей библиотекой LDAP не поддерживается" -#: libpq/auth.c:2512 +#: libpq/auth.c:2357 #, c-format msgid "could not initialize LDAP: %m" msgstr "не удалось инициализировать LDAP: %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2367 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не удалось задать версию протокола LDAP: %s" -#: libpq/auth.c:2562 +#: libpq/auth.c:2407 #, c-format msgid "could not load function _ldap_start_tls_sA in wldap32.dll" msgstr "не удалось найти функцию _ldap_start_tls_sA в wldap32.dll" -#: libpq/auth.c:2563 +#: libpq/auth.c:2408 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "LDAP через SSL не поддерживается в этой ОС." -#: libpq/auth.c:2579 +#: libpq/auth.c:2424 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не удалось начать сеанс LDAP TLS: %s" -#: libpq/auth.c:2650 +#: libpq/auth.c:2495 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-сервер не задан и значение ldapbasedn не определено" -#: libpq/auth.c:2657 +#: libpq/auth.c:2502 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не определён" -#: libpq/auth.c:2719 +#: libpq/auth.c:2564 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "недопустимый символ в имени пользователя для проверки подлинности LDAP" -#: libpq/auth.c:2736 +#: libpq/auth.c:2581 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -14859,28 +15827,28 @@ msgstr "" "не удалось выполнить начальную привязку LDAP для ldapbinddn \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2765 +#: libpq/auth.c:2610 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "" "не удалось выполнить LDAP-поиск по фильтру \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2779 +#: libpq/auth.c:2624 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "в LDAP нет пользователя \"%s\"" -#: libpq/auth.c:2780 +#: libpq/auth.c:2625 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" не вернул результатов" -#: libpq/auth.c:2784 +#: libpq/auth.c:2629 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "пользователь LDAP \"%s\" не уникален" -#: libpq/auth.c:2785 +#: libpq/auth.c:2630 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" @@ -14889,7 +15857,7 @@ msgstr[0] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" msgstr[1] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записи." msgstr[2] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записей." -#: libpq/auth.c:2805 +#: libpq/auth.c:2650 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" @@ -14897,24 +15865,24 @@ msgstr "" "не удалось получить dn для первого результата, соответствующего \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2826 +#: libpq/auth.c:2671 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "" "не удалось отвязаться после поиска пользователя \"%s\" на сервере \"%s\"" -#: libpq/auth.c:2857 +#: libpq/auth.c:2702 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "" "ошибка при регистрации в LDAP пользователя \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2889 +#: libpq/auth.c:2734 #, c-format msgid "LDAP diagnostics: %s" msgstr "Диагностика LDAP: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2772 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -14923,7 +15891,7 @@ msgstr "" "ошибка проверки подлинности пользователя \"%s\" по сертификату: сертификат " "клиента не содержит имя пользователя" -#: libpq/auth.c:2948 +#: libpq/auth.c:2793 #, c-format msgid "" "certificate authentication failed for user \"%s\": unable to retrieve " @@ -14932,7 +15900,7 @@ msgstr "" "пользователь \"%s\" не прошёл проверку подлинности по сертификату: не " "удалось получить DN субъекта" -#: libpq/auth.c:2971 +#: libpq/auth.c:2816 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": DN " @@ -14941,7 +15909,7 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается DN" -#: libpq/auth.c:2976 +#: libpq/auth.c:2821 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " @@ -14950,99 +15918,99 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается CN" -#: libpq/auth.c:3078 +#: libpq/auth.c:2923 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не определён" -#: libpq/auth.c:3085 +#: libpq/auth.c:2930 #, c-format msgid "RADIUS secret not specified" msgstr "секрет RADIUS не определён" # well-spelled: симв -#: libpq/auth.c:3099 +#: libpq/auth.c:2944 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "проверка подлинности RADIUS не поддерживает пароли длиннее %d симв." -#: libpq/auth.c:3206 libpq/hba.c:2008 +#: libpq/auth.c:3051 libpq/hba.c:1976 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не удалось преобразовать имя сервера RADIUS \"%s\" в адрес: %s" -#: libpq/auth.c:3220 +#: libpq/auth.c:3065 #, c-format msgid "could not generate random encryption vector" msgstr "не удалось сгенерировать случайный вектор шифрования" -#: libpq/auth.c:3254 +#: libpq/auth.c:3102 #, 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:3280 +#: libpq/auth.c:3129 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не удалось создать сокет RADIUS: %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3151 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не удалось привязаться к локальному сокету RADIUS: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3161 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не удалось отправить пакет RADIUS: %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3195 libpq/auth.c:3221 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "превышено время ожидания ответа RADIUS от %s" -#: libpq/auth.c:3364 +#: libpq/auth.c:3214 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не удалось проверить состояние сокета RADIUS: %m" -#: libpq/auth.c:3394 +#: libpq/auth.c:3244 #, c-format msgid "could not read RADIUS response: %m" msgstr "не удалось прочитать ответ RADIUS: %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3257 libpq/auth.c:3261 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "ответ RADIUS от %s был отправлен с неверного порта: %d" -#: libpq/auth.c:3420 +#: libpq/auth.c:3270 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "слишком короткий ответ RADIUS от %s: %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3277 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "в ответе RADIUS от %s испорчена длина: %d (фактическая длина %d)" -#: libpq/auth.c:3435 +#: libpq/auth.c:3285 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "пришёл ответ RADIUS от %s на другой запрос: %d (ожидался %d)" -#: libpq/auth.c:3460 +#: libpq/auth.c:3310 #, 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:3469 +#: libpq/auth.c:3320 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "ответ RADIUS от %s содержит неверную подпись MD5" -#: libpq/auth.c:3487 +#: libpq/auth.c:3338 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "ответ RADIUS от %s содержит неверный код (%d) для пользователя \"%s\"" @@ -15103,8 +16071,8 @@ msgstr "не удалось записать файл сервера \"%s\": %m" msgid "large object read request is too large" msgstr "при чтении большого объекта запрошен чрезмерный размер" -#: libpq/be-fsstubs.c:800 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 "запрошенная длина не может быть отрицательной" @@ -15158,16 +16126,16 @@ msgstr "" "он принадлежит пользователю сервера, либо u=rw,g=r (0640) или более строгие, " "если он принадлежит root." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "сервер попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" @@ -15199,82 +16167,82 @@ msgstr "принять контекст безопасности GSSAPI не у msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "не удалось создать контекст SSL: %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 "не удалось загрузить сертификат сервера \"%s\": %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 "" "файл закрытого ключа \"%s\" нельзя перезагрузить, так как он защищён паролем" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, 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: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\" значение \"%s\" не поддерживается в данной сборке" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не удалось задать минимальную версию протокола SSL" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не удалось задать максимальную версию протокола SSL" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "не удалось задать диапазон версий протокола SSL" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "Версия \"%s\" не может быть выше \"%s\"" -#: 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 "не удалось установить список шифров (подходящие шифры отсутствуют)" -#: libpq/be-secure-openssl.c:295 +#: 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:344 +#: 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:352 +#: 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:360 +#: libpq/be-secure-openssl.c:367 #, c-format msgid "" "could not load SSL certificate revocation list file \"%s\" or directory " @@ -15283,38 +16251,38 @@ msgstr "" "не удалось загрузить списки отзыва сертификатов SSL из файла \"%s\" или " "каталога \"%s\": %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 "" "инициализировать SSL-подключение не удалось: контекст SSL не установлен" -#: libpq/be-secure-openssl.c:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "инициализировать SSL-подключение не удалось: %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "не удалось создать SSL-сокет: %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:500 #, c-format msgid "could not accept SSL connection: %m" msgstr "не удалось принять SSL-подключение: %m" -#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:504 libpq/be-secure-openssl.c:557 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не удалось принять SSL-подключение: обрыв данных" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:543 #, c-format msgid "could not accept SSL connection: %s" msgstr "не удалось принять SSL-подключение: %s" -#: libpq/be-secure-openssl.c:538 +#: libpq/be-secure-openssl.c:546 #, c-format msgid "" "This may indicate that the client does not support any SSL protocol version " @@ -15323,94 +16291,94 @@ msgstr "" "Это может указывать на то, что клиент не поддерживает ни одну версию " "протокола SSL между %s и %s." -#: libpq/be-secure-openssl.c:554 libpq/be-secure-openssl.c:734 -#: libpq/be-secure-openssl.c:798 +#: libpq/be-secure-openssl.c:562 libpq/be-secure-openssl.c:751 +#: libpq/be-secure-openssl.c:821 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нераспознанный код ошибки SSL: %d" -#: libpq/be-secure-openssl.c:600 +#: libpq/be-secure-openssl.c:608 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Имя SSL-сертификата включает нулевой байт" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:654 #, 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 +#: libpq/be-secure-openssl.c:740 libpq/be-secure-openssl.c:805 #, c-format msgid "SSL error: %s" msgstr "ошибка SSL: %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:982 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не удалось открыть файл параметров DH \"%s\": %m" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:994 #, c-format msgid "could not load DH parameters file: %s" msgstr "не удалось загрузить файл параметров DH: %s" -#: libpq/be-secure-openssl.c:986 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: %s" msgstr "неверные параметры DH: %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1013 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неверные параметры DH: p - не простое число" -#: libpq/be-secure-openssl.c:1004 +#: libpq/be-secure-openssl.c:1022 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "" "неверные параметры DH: нет подходящего генератора или небезопасное простое " "число" -#: libpq/be-secure-openssl.c:1165 +#: libpq/be-secure-openssl.c:1183 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: не удалось загрузить параметры DH" -#: libpq/be-secure-openssl.c:1173 +#: libpq/be-secure-openssl.c:1191 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не удалось задать параметры DH: %s" -#: libpq/be-secure-openssl.c:1200 +#: libpq/be-secure-openssl.c:1218 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нераспознанное имя кривой: %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1227 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не удалось создать ключ" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1255 msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1259 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1418 #, c-format msgid "could not create BIO" msgstr "не удалось создать BIO" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1428 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "не удалось получить NID для объекта ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1418 +#: libpq/be-secure-openssl.c:1436 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "не удалось преобразовать NID %d в структуру ASN1_OBJECT" @@ -15435,118 +16403,113 @@ 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:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "" "слишком длинный элемент в файле конфигурации безопасности пропускается: " "\"%s\"" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "" "не удалось открыть дополнительный файл конфигурации безопасности \"@%s\" как " "\"%s\": %m" -#: libpq/hba.c:859 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" msgstr "ошибка при перечислении сетевых интерфейсов: %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 "параметр проверки подлинности \"%s\" допускается только для методов %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: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 +#: 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:228 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "строка %d файла конфигурации \"%s\"" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "" "для метода проверки подлинности \"%s\" требуется определить аргумент \"%s\"" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "отсутствует запись в файле \"%s\" в конце строки %d" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "множественные значения в поле ident" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "для типа подключения указано несколько значений" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Определите в строке единственный тип подключения." -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "локальные подключения не поддерживаются в этой сборке" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "запись с hostssl недействительна, так как поддержка SSL отключена" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Установите ssl = on в 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 недействительна, так как SSL не поддерживается в этой сборке" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "Для работы с SSL скомпилируйте postgresql с ключом --with-ssl." - -#: libpq/hba.c:1054 +#: libpq/hba.c:1024 #, c-format msgid "" "hostgssenc record cannot match because GSSAPI is not supported by this build" @@ -15554,131 +16517,126 @@ msgstr "" "запись с hostgssenc недействительна, так как GSSAPI не поддерживается в этой " "сборке" -#: libpq/hba.c:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Для работы с GSSAPI скомпилируйте postgresql с ключом --with-gssapi." - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "неверный тип подключения \"%s\"" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "конец строки перед определением базы данных" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "конец строки перед определением роли" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "конец строки перед определением IP-адресов" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "для адреса узла указано несколько значений" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Определите в строке один диапазон адресов." -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неверный IP-адрес \"%s\": %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "указать одновременно и имя узла, и маску CIDR нельзя: \"%s\"" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "неверная маска CIDR в адресе \"%s\"" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "конец строки перед определением маски сети" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "" "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "" "Укажите диапазон адресов в формате CIDR или задайте отдельную маску сети." -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "для сетевой маски указано несколько значений" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "неверная маска IP \"%s\": %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IP-адрес не соответствует маске" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "конец строки перед методом проверки подлинности" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "для типа проверки подлинности указано несколько значений" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Определите в строке единственный тип проверки подлинности." -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неверный метод проверки подлинности \"%s\"" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "" "неверный метод проверки подлинности \"%s\": не поддерживается в этой сборке" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "проверка подлинности gssapi для локальных сокетов не поддерживается" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "проверка подлинности peer поддерживается только для локальных сокетов" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "" "проверка подлинности cert поддерживается только для подключений hostssl" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр проверки подлинности указан не в формате имя=значение: %s" -#: libpq/hba.c:1566 +#: libpq/hba.c:1535 #, c-format msgid "" "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, " @@ -15687,7 +16645,7 @@ msgstr "" "нельзя использовать ldapbasedn, ldapbinddn, ldapbindpasswd, " "ldapsearchattribute, ldapsearchfilter или ldapurl вместе с ldapprefix" -#: libpq/hba.c:1577 +#: libpq/hba.c:1546 #, c-format msgid "" "authentication method \"ldap\" requires argument \"ldapbasedn\", " @@ -15696,22 +16654,22 @@ msgstr "" "для метода проверки подлинности \"ldap\" требуется установить аргументы " "\"ldapbasedn\" и \"ldapprefix\" или \"ldapsuffix\"" -#: libpq/hba.c:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "нельзя использовать ldapsearchattribute вместе с ldapsearchfilter" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "список серверов RADIUS не может быть пустым" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "список секретов RADIUS не может быть пустым" -#: 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 " @@ -15720,7 +16678,7 @@ msgstr "" "количество секретов RADIUS (%d) должно равняться 1 или количеству серверов " "RADIUS (%d)" -#: 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 " @@ -15729,7 +16687,7 @@ msgstr "" "количество портов RADIUS (%d) должно равняться 1 или количеству серверов " "RADIUS (%d)" -#: 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 " @@ -15738,16 +16696,16 @@ msgstr "" "количество идентификаторов RADIUS (%d) должно равняться 1 или количеству " "серверов RADIUS (%d)" -#: libpq/hba.c:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi и cert" -#: libpq/hba.c:1730 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert можно определить только в строках \"hostssl\"" -#: libpq/hba.c:1747 +#: libpq/hba.c:1716 #, c-format msgid "" "clientcert only accepts \"verify-full\" when using \"cert\" authentication" @@ -15755,105 +16713,105 @@ msgstr "" "с проверкой подлинности \"cert\" для clientcert допускается только значение " "\"verify-full\"" -#: libpq/hba.c:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неверное значение для clientcert: \"%s\"" -#: libpq/hba.c:1772 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname можно определить только в строках \"hostssl\"" -#: libpq/hba.c:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "неверное значение для clientname: \"%s\"" -#: libpq/hba.c:1825 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не удалось разобрать URL-адрес LDAP \"%s\": %s" -#: libpq/hba.c:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "неподдерживаемая схема в URL-адресе LDAP: %s" -#: libpq/hba.c:1860 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреса LDAP не поддерживаются в этой ОС" -#: libpq/hba.c:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "неверное значение ldapscheme: \"%s\"" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "неверный номер порта LDAP: \"%s\"" -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi и sspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не удалось разобрать список серверов RADIUS \"%s\"" -#: libpq/hba.c:2037 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не удалось разобрать список портов RADIUS \"%s\"" -#: libpq/hba.c:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "неверный номер порта RADIUS: \"%s\"" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не удалось разобрать список секретов RADIUS \"%s\"" -#: libpq/hba.c:2095 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не удалось разобрать список идентификаторов RADIUS \"%s\"" -#: libpq/hba.c:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нераспознанное имя атрибута проверки подлинности: \"%s\"" -#: libpq/hba.c:2255 libpq/hba.c:2669 guc-file.l:632 +#: libpq/hba.c:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "открыть файл конфигурации \"%s\" не удалось: %m" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфигурации \"%s\" не содержит записей" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "неверное регулярное выражение \"%s\": %s" -#: libpq/hba.c:2884 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "ошибка при поиске по регулярному выражению для \"%s\": %s" -#: libpq/hba.c:2903 +#: libpq/hba.c:2456 #, c-format msgid "" "regular expression \"%s\" has no subexpressions as requested by " @@ -15862,21 +16820,21 @@ msgstr "" "в регулярном выражении \"%s\" нет подвыражений, требуемых для обратной " "ссылки в \"%s\"" -#: libpq/hba.c:2999 +#: 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:3019 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "нет соответствия в файле сопоставлений \"%s\" для пользователя \"%s\", " "прошедшего проверку как \"%s\"" -#: libpq/hba.c:3052 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "не удалось открыть файл сопоставлений пользователей \"%s\": %m" @@ -15995,10 +16953,9 @@ msgid "could not accept new connection: %m" msgstr "не удалось принять новое подключение: %m" #: 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 +#: libpq/pqcomm.c:1652 libpq/pqcomm.c:1697 libpq/pqcomm.c:1737 +#: libpq/pqcomm.c:1781 libpq/pqcomm.c:1820 libpq/pqcomm.c:1859 +#: libpq/pqcomm.c:1895 libpq/pqcomm.c:1934 #, c-format msgid "%s(%s) failed: %m" msgstr "ошибка в %s(%s): %m" @@ -16008,63 +16965,58 @@ msgstr "ошибка в %s(%s): %m" msgid "there is no client connection" msgstr "нет клиентского подключения" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:977 libpq/pqcomm.c:1078 #, c-format msgid "could not receive data from client: %m" msgstr "не удалось получить данные от клиента: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4316 +#: libpq/pqcomm.c:1183 tcop/postgres.c:4373 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "закрытие подключения из-за потери синхронизации протокола" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1249 #, c-format msgid "unexpected EOF within message length word" msgstr "неожиданный обрыв данных в слове длины сообщения" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1259 #, c-format msgid "invalid message length" msgstr "неверная длина сообщения" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1281 libpq/pqcomm.c:1294 #, c-format msgid "incomplete message from client" msgstr "неполное сообщение от клиента" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1405 #, c-format msgid "could not send data to client: %m" msgstr "не удалось послать данные клиенту: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1620 #, c-format msgid "%s(%s) failed: error code %d" msgstr "ошибка в %s(%s): код ошибки %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1709 #, 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 +#: libpq/pqcomm.c:1793 libpq/pqcomm.c:1868 libpq/pqcomm.c:1943 #, 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:1482 utils/adt/rowtypes.c:588 +#: utils/adt/arrayfuncs.c:1483 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "недостаточно данных осталось в сообщении" @@ -16079,12 +17031,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" @@ -16093,7 +17045,7 @@ msgstr "" "%s - сервер PostgreSQL.\n" "\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "" "Usage:\n" @@ -16104,109 +17056,109 @@ 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 ЧИСЛО_БУФ число разделяемых буферов\n" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\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 ИМЯ вывести значение параметра выполнения и выйти\n" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 уровень отладочных сообщений\n" -#: main/main.c:316 +#: main/main.c:357 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D КАТАЛОГ каталог с данными\n" # well-spelled: ДМГ -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e использовать европейский формат дат (ДМГ)\n" -#: main/main.c:318 +#: main/main.c:359 #, c-format msgid " -F turn fsync off\n" msgstr " -F выключить синхронизацию с ФС\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 ИМЯ имя или IP-адрес для приёма сетевых соединений\n" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\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 КАТАЛОГ расположение Unix-сокетов\n" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\n" msgstr " -l разрешить SSL-подключения\n" # well-spelled: ПОДКЛ -#: main/main.c:325 +#: main/main.c:366 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N МАКС_ПОДКЛ предельное число подключений\n" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p ПОРТ номер порта для приёма подключений\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s показывать статистику после каждого запроса\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 РАБ_ПАМЯТЬ задать объём памяти для сортировки (в КБ)\n" -#: main/main.c:329 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: main/main.c:330 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --ИМЯ=ЗНАЧЕНИЕ установить параметр выполнения\n" -#: main/main.c:331 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config вывести параметры конфигурации и выйти\n" -#: main/main.c:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "" "\n" @@ -16215,12 +17167,12 @@ msgstr "" "\n" "Параметры для разработчиков:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h запретить некоторые типы планов\n" -#: main/main.c:336 +#: main/main.c:377 #, c-format msgid "" " -n do not reinitialize shared memory after abnormal exit\n" @@ -16228,22 +17180,22 @@ msgstr "" " -n не переинициализировать разделяемую память после\n" " аварийного выхода\n" -#: main/main.c:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O разрешить изменять структуру системных таблиц\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P отключить системные индексы\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 показать время каждого запроса\n" -#: main/main.c:340 +#: main/main.c:381 #, c-format msgid "" " -T send SIGSTOP to all backend processes if one dies\n" @@ -16251,13 +17203,13 @@ msgstr "" " -T посылать сигнал SIGSTOP всем серверным процессам\n" " при отключении одного\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 СЕК ждать заданное число секунд для подключения отладчика\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "" "\n" @@ -16266,7 +17218,7 @@ msgstr "" "\n" "Параметры для монопольного режима:\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" @@ -16274,22 +17226,22 @@ msgstr "" " --single включить монопольный режим\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " ИМЯ_БД база данных (по умолчанию - имя пользователя)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 переопределить уровень отладочных сообщений\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E выводить SQL-операторы перед выполнением\n" -#: main/main.c:348 +#: main/main.c:389 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -16297,12 +17249,12 @@ msgstr "" " -j не считать конец строки разделителем интерактивных " "запросов\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 ИМЯ_ФАЙЛА перенаправить STDOUT и STDERR в указанный файл\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "" "\n" @@ -16311,7 +17263,7 @@ msgstr "" "\n" "Параметры для режима инициализации:\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" @@ -16319,7 +17271,14 @@ msgstr "" " --boot включить режим инициализации\n" " (этот аргумент должен быть первым)\n" -#: main/main.c:353 +#: main/main.c:394 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr "" +" --check включить режим проверки (этот аргумент должен быть " +"первым)\n" + +#: main/main.c:395 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " @@ -16327,12 +17286,7 @@ msgid "" msgstr "" " ИМЯ_БД имя базы данных (необходимо в режиме инициализации)\n" -#: main/main.c:355 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x ЧИСЛО параметр для внутреннего использования\n" - -#: main/main.c:357 +#: main/main.c:398 #, c-format msgid "" "\n" @@ -16349,12 +17303,12 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16367,12 +17321,12 @@ msgstr "" "должен запускать обычный пользователь. Подробнее о том, как\n" "правильно запускать сервер, вы можете узнать в документации.\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: фактический и эффективный ID пользователя должны совпадать\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16397,15 +17351,15 @@ msgstr "расширенный тип узла \"%s\" уже существуе msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "методы расширенного узла \"%s\" не зарегистрированы" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, 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:592 +#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, c-format msgid "could not find array type for data type %s" msgstr "тип массива для типа данных %s не найден" @@ -16429,6 +17383,12 @@ msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение " "слиянием или хеш-соединение" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "выполнить MERGE для отношение \"%s\" нельзя" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -16436,19 +17396,19 @@ 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:1316 parser/analyze.c:1709 parser/analyze.c:1965 -#: parser/analyze.c:3144 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 +#: parser/analyze.c:3190 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несовместимо с UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1973 optimizer/plan/planner.c:3629 +#: optimizer/plan/planner.c:2045 optimizer/plan/planner.c:3702 #, c-format msgid "could not implement GROUP BY" msgstr "не удалось реализовать GROUP BY" -#: optimizer/plan/planner.c:1974 optimizer/plan/planner.c:3630 -#: optimizer/plan/planner.c:4387 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2046 optimizer/plan/planner.c:3703 +#: optimizer/plan/planner.c:4346 optimizer/prep/prepunion.c:1046 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " @@ -16457,36 +17417,31 @@ msgstr "" "Одни типы данных поддерживают только хеширование, а другие - только " "сортировку." -#: optimizer/plan/planner.c:4386 +#: optimizer/plan/planner.c:4345 #, c-format msgid "could not implement DISTINCT" msgstr "не удалось реализовать DISTINCT" -#: optimizer/plan/planner.c:5234 +#: optimizer/plan/planner.c:5466 #, c-format msgid "could not implement window PARTITION BY" msgstr "не удалось реализовать PARTITION BY для окна" -#: optimizer/plan/planner.c:5235 +#: optimizer/plan/planner.c:5467 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Столбцы, разбивающие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/planner.c:5239 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window ORDER BY" msgstr "не удалось реализовать ORDER BY для окна" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Столбцы, сортирующие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/setrefs.c:516 -#, c-format -msgid "too many range table entries" -msgstr "слишком много элементов RTE" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -16503,41 +17458,41 @@ msgstr "Все столбцы должны иметь хешируемые ти msgid "could not implement %s" msgstr "не удалось реализовать %s" -#: optimizer/util/clauses.c:4729 +#: optimizer/util/clauses.c:4843 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "внедрённая в код SQL-функция \"%s\"" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format msgid "cannot open relation \"%s\"" msgstr "открыть отношение \"%s\" нельзя" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "" "обращаться к временным или нежурналируемым отношениям в процессе " "восстановления нельзя" -#: optimizer/util/plancat.c:688 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "" "указания со ссылкой на всю строку для выбора уникального индекса не " "поддерживаются" -#: optimizer/util/plancat.c:705 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ограничению в ON CONFLICT не соответствует индекс" -#: optimizer/util/plancat.c:755 +#: optimizer/util/plancat.c:758 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не поддерживается с ограничениями-исключениями" -#: optimizer/util/plancat.c:860 +#: optimizer/util/plancat.c:863 #, c-format msgid "" "there is no unique or exclusion constraint matching the ON CONFLICT " @@ -16546,22 +17501,22 @@ msgstr "" "нет уникального ограничения или ограничения-исключения, соответствующего " "указанию ON CONFLICT" -#: parser/analyze.c:775 parser/analyze.c:1489 +#: parser/analyze.c:818 parser/analyze.c:1532 #, c-format msgid "VALUES lists must all be the same length" msgstr "списки VALUES должны иметь одинаковую длину" -#: parser/analyze.c:976 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT содержит больше выражений, чем целевых столбцов" -#: parser/analyze.c:994 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT содержит больше целевых столбцов, чем выражений" -#: parser/analyze.c:998 +#: parser/analyze.c:1041 #, c-format msgid "" "The insertion source is a row expression containing the same number of " @@ -16570,29 +17525,29 @@ msgstr "" "Источником данных является строка, включающая столько же столбцов, сколько " "требуется для INSERT. Вы намеренно использовали скобки?" -#: parser/analyze.c:1297 parser/analyze.c:1682 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, 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:1612 parser/analyze.c:3355 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s нельзя применять к VALUES" -#: parser/analyze.c:1848 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неверное предложение UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1849 +#: parser/analyze.c:1892 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "Допустимо использование только имён столбцов, но не выражений или функций." -#: parser/analyze.c:1850 +#: parser/analyze.c:1893 #, c-format msgid "" "Add the expression/function to every SELECT, or move the UNION into a FROM " @@ -16601,12 +17556,12 @@ msgstr "" "Добавьте выражение/функцию в каждый SELECT или перенесите UNION в " "предложение FROM." -#: parser/analyze.c:1955 +#: parser/analyze.c:1998 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO можно добавить только в первый SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2027 +#: parser/analyze.c:2070 #, c-format msgid "" "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of " @@ -16615,17 +17570,17 @@ msgstr "" "оператор, составляющий UNION/INTERSECT/EXCEPT, не может ссылаться на другие " "отношения на том же уровне запроса" -#: parser/analyze.c:2114 +#: parser/analyze.c:2157 #, c-format msgid "each %s query must have the same number of columns" msgstr "все запросы в %s должны возвращать одинаковое число столбцов" -#: parser/analyze.c:2515 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "в RETURNING должен быть минимум один столбец" -#: parser/analyze.c:2618 +#: parser/analyze.c:2664 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" @@ -16633,348 +17588,356 @@ msgstr[0] "источник присваиваемого значения выд msgstr[1] "источник присваиваемого значения выдал %d столбца" msgstr[2] "источник присваиваемого значения выдал %d столбцов" -#: parser/analyze.c:2679 +#: parser/analyze.c:2725 #, 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:2803 parser/analyze.c:2811 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "указать %s и %s одновременно нельзя" -#: parser/analyze.c:2831 +#: parser/analyze.c:2877 #, 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:2839 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не поддерживается" -#: parser/analyze.c:2842 +#: parser/analyze.c:2888 #, 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:2850 +#: parser/analyze.c:2896 #, 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:2861 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s не допускается" -#: parser/analyze.c:2864 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Независимые курсоры должны быть READ ONLY." -#: parser/analyze.c:2930 +#: parser/analyze.c:2976 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "в материализованных представлениях не должны использоваться операторы, " "изменяющие данные в WITH" -#: parser/analyze.c:2940 +#: parser/analyze.c:2986 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "" "в материализованных представлениях не должны использоваться временные " "таблицы и представления" -#: parser/analyze.c:2950 +#: parser/analyze.c:2996 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "" "определять материализованные представления со связанными параметрами нельзя" -#: parser/analyze.c:2962 +#: parser/analyze.c:3008 #, c-format msgid "materialized views cannot be unlogged" msgstr "материализованные представления не могут быть нежурналируемыми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3151 +#: parser/analyze.c:3197 #, 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:3158 +#: parser/analyze.c:3204 #, 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:3165 +#: parser/analyze.c:3211 #, 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:3172 +#: parser/analyze.c:3218 #, 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:3179 +#: parser/analyze.c:3225 #, 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:3186 +#: parser/analyze.c:3232 #, 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:3278 +#: parser/analyze.c:3324 #, 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:3328 +#: parser/analyze.c:3374 #, 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:3337 +#: parser/analyze.c:3383 #, 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:3346 +#: parser/analyze.c:3392 #, 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:3364 +#: parser/analyze.c:3410 #, 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:3373 +#: parser/analyze.c:3419 #, 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:3393 +#: parser/analyze.c:3439 #, 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:227 +#: parser/parse_agg.c:208 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "для типа %s не удалось найти оператор сортировки" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:210 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Агрегатным функциям с DISTINCT необходимо сортировать входные данные." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:268 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "у GROUPING должно быть меньше 32 аргументов" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:371 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "агрегатные функции нельзя применять в условиях JOIN" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:373 msgid "grouping operations are not allowed in JOIN conditions" msgstr "операции группировки нельзя применять в условиях JOIN" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "" "aggregate functions are not allowed in FROM clause of their own query level" msgstr "" "агрегатные функции нельзя применять в предложении FROM их уровня запроса" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "" "grouping operations are not allowed in FROM clause of their own query level" msgstr "" "операции группировки нельзя применять в предложении FROM их уровня запроса" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "агрегатные функции нельзя применять в функциях во FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "операции группировки нельзя применять в функциях во FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "агрегатные функции нельзя применять в выражениях политик" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "операции группировки нельзя применять в выражениях политик" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "агрегатные функции нельзя применять в указании RANGE для окна" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "операции группировки нельзя применять в указании RANGE для окна" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "агрегатные функции нельзя применять в указании ROWS для окна" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "операции группировки нельзя применять в указании ROWS для окна" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "агрегатные функции нельзя применять в указании GROUPS для окна" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "операции группировки нельзя применять в указании GROUPS для окна" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:450 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "агрегатные функции нельзя применять в условиях MERGE WHEN" + +#: parser/parse_agg.c:452 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "операции группировки нельзя применять в условиях MERGE WHEN" + +#: parser/parse_agg.c:478 msgid "aggregate functions are not allowed in check constraints" msgstr "агрегатные функции нельзя применять в ограничениях-проверках" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:480 msgid "grouping operations are not allowed in check constraints" msgstr "операции группировки нельзя применять в ограничениях-проверках" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:487 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "агрегатные функции нельзя применять в выражениях DEFAULT" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:489 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "операции группировки нельзя применять в выражениях DEFAULT" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:494 msgid "aggregate functions are not allowed in index expressions" msgstr "агрегатные функции нельзя применять в выражениях индексов" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:496 msgid "grouping operations are not allowed in index expressions" msgstr "операции группировки нельзя применять в выражениях индексов" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:501 msgid "aggregate functions are not allowed in index predicates" msgstr "агрегатные функции нельзя применять в предикатах индексов" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:503 msgid "grouping operations are not allowed in index predicates" msgstr "операции группировки нельзя применять в предикатах индексов" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:508 msgid "aggregate functions are not allowed in statistics expressions" msgstr "агрегатные функции нельзя применять в выражениях статистики" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:510 msgid "grouping operations are not allowed in statistics expressions" msgstr "операции группировки нельзя применять в выражениях статистики" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:515 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатные функции нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:517 msgid "grouping operations are not allowed in transform expressions" msgstr "операции группировки нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:522 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатные функции нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:524 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операции группировки нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:529 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатные функции нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:531 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операции группировки нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:536 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатные функции нельзя применять в выражении границы секции" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:538 msgid "grouping operations are not allowed in partition bound" msgstr "операции группировки нельзя применять в выражении границы секции" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:543 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатные функции нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:545 msgid "grouping operations are not allowed in partition key expressions" msgstr "" "операции группировки нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:551 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатные функции нельзя применять в выражениях генерируемых столбцов" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:553 msgid "grouping operations are not allowed in column generation expressions" msgstr "" "операции группировки нельзя применять в выражениях генерируемых столбцов" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:559 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатные функции нельзя применять в аргументах CALL" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:561 msgid "grouping operations are not allowed in CALL arguments" msgstr "операции группировки нельзя применять в аргументах CALL" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:567 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатные функции нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:569 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:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:596 parser/parse_clause.c:1836 #, 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:581 +#: parser/parse_agg.c:599 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операции группировки нельзя применять в конструкции %s" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:700 #, c-format msgid "" "outer-level aggregate cannot contain a lower-level variable in its direct " @@ -16983,14 +17946,14 @@ msgstr "" "агрегатная функция внешнего уровня не может содержать в своих аргументах " "переменные нижнего уровня" -#: parser/parse_agg.c:760 +#: parser/parse_agg.c:778 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "" "вызовы агрегатных функций не могут включать вызовы функций, возвращающих " "множества" -#: parser/parse_agg.c:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 +#: parser/parse_agg.c:779 parser/parse_expr.c:1674 parser/parse_expr.c:2156 #: parser/parse_func.c:883 #, c-format msgid "" @@ -17000,103 +17963,107 @@ msgstr "" "Исправить ситуацию можно, переместив функцию, возвращающую множество, в " "элемент LATERAL FROM." -#: parser/parse_agg.c:766 +#: parser/parse_agg.c:784 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "вызовы агрегатных функций не могут включать вызовы оконных функции" -#: parser/parse_agg.c:845 +#: parser/parse_agg.c:863 msgid "window functions are not allowed in JOIN conditions" msgstr "оконные функции нельзя применять в условиях JOIN" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:870 msgid "window functions are not allowed in functions in FROM" msgstr "оконные функции нельзя применять в функциях во FROM" -#: parser/parse_agg.c:858 +#: parser/parse_agg.c:876 msgid "window functions are not allowed in policy expressions" msgstr "оконные функции нельзя применять в выражениях политик" -#: parser/parse_agg.c:871 +#: parser/parse_agg.c:889 msgid "window functions are not allowed in window definitions" msgstr "оконные функции нельзя применять в определении окна" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:900 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "оконные функции нельзя применять в условиях MERGE WHEN" + +#: parser/parse_agg.c:924 msgid "window functions are not allowed in check constraints" msgstr "оконные функции нельзя применять в ограничениях-проверках" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:928 msgid "window functions are not allowed in DEFAULT expressions" msgstr "оконные функции нельзя применять в выражениях DEFAULT" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:931 msgid "window functions are not allowed in index expressions" msgstr "оконные функции нельзя применять в выражениях индексов" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:934 msgid "window functions are not allowed in statistics expressions" msgstr "оконные функции нельзя применять в выражениях статистики" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:937 msgid "window functions are not allowed in index predicates" msgstr "оконные функции нельзя применять в предикатах индексов" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:940 msgid "window functions are not allowed in transform expressions" msgstr "оконные функции нельзя применять в выражениях преобразований" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:943 msgid "window functions are not allowed in EXECUTE parameters" msgstr "оконные функции нельзя применять в параметрах EXECUTE" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:946 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "оконные функции нельзя применять в условиях WHEN для триггеров" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:949 msgid "window functions are not allowed in partition bound" msgstr "оконные функции нельзя применять в выражении границы секции" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:952 msgid "window functions are not allowed in partition key expressions" msgstr "оконные функции нельзя применять в выражениях ключа секционирования" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:955 msgid "window functions are not allowed in CALL arguments" msgstr "оконные функции нельзя применять в аргументах CALL" -#: parser/parse_agg.c:937 +#: parser/parse_agg.c:958 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "оконные функции нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_agg.c:940 +#: parser/parse_agg.c:961 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:984 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" msgstr "оконные функции нельзя применять в конструкции %s" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1018 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "окно \"%s\" не существует" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1102 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "слишком много наборов группирования (при максимуме 4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1242 #, c-format msgid "" "aggregate functions are not allowed in a recursive query's recursive term" msgstr "" "в рекурсивной части рекурсивного запроса агрегатные функции недопустимы" -#: parser/parse_agg.c:1414 +#: parser/parse_agg.c:1435 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -17105,7 +18072,7 @@ msgstr "" "столбец \"%s.%s\" должен фигурировать в предложении GROUP BY или " "использоваться в агрегатной функции" -#: parser/parse_agg.c:1417 +#: parser/parse_agg.c:1438 #, c-format msgid "" "Direct arguments of an ordered-set aggregate must use only grouped columns." @@ -17113,13 +18080,13 @@ msgstr "" "Прямые аргументы сортирующей агрегатной функции могут включать только " "группируемые столбцы." -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1443 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "подзапрос использует негруппированный столбец \"%s.%s\" из внешнего запроса" -#: parser/parse_agg.c:1586 +#: parser/parse_agg.c:1607 #, c-format msgid "" "arguments to GROUPING must be grouping expressions of the associated query " @@ -17128,25 +18095,25 @@ msgstr "" "аргументами GROUPING должны быть выражения группирования для " "соответствующего уровня запроса" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "отношение \"%s\" не может быть целевым в операторе, изменяющем данные" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "" "функции, возвращающие множества, должны находиться на верхнем уровне FROM" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "" "для одной и той же функции нельзя задать разные списки с определениями " "столбцов" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:645 #, c-format msgid "" "ROWS FROM() with multiple functions cannot have a column definition list" @@ -17154,7 +18121,7 @@ msgstr "" "у ROWS FROM() с несколькими функциями не может быть списка с определениями " "столбцов" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:646 #, c-format msgid "" "Put a separate column definition list for each function inside ROWS FROM()." @@ -17162,14 +18129,14 @@ msgstr "" "Добавьте отдельные списки с определениями столбцов для каждой функции в ROWS " "FROM()." -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "" "у UNNEST() с несколькими аргументами не может быть списка с определениями " "столбцов" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:653 #, c-format msgid "" "Use separate UNNEST() calls inside ROWS FROM(), and attach a column " @@ -17178,43 +18145,43 @@ msgstr "" "Напишите отдельные вызовы UNNEST() внутри ROWS FROM() и добавьте список " "определений столбцов к каждому." -#: parser/parse_clause.c:658 +#: parser/parse_clause.c:660 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "" "WITH ORDINALITY нельзя использовать со списком с определениями столбцов" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Поместите список определений столбцов внутрь ROWS FROM()." -#: parser/parse_clause.c:759 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY допускается только для одного столбца" -#: parser/parse_clause.c:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "имя столбца \"%s\" не уникально" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "имя пространства имён \"%s\" не уникально" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "допускается только одно пространство имён по умолчанию" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s для получения выборки не существует" -#: parser/parse_clause.c:954 +#: 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" @@ -17222,104 +18189,104 @@ msgstr[0] "метод %s для получения выборки требует msgstr[1] "метод %s для получения выборки требует аргументов: %d, получено: %d" msgstr[2] "метод %s для получения выборки требует аргументов: %d, получено: %d" -#: parser/parse_clause.c:988 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s для получения выборки не поддерживает REPEATABLE" -#: parser/parse_clause.c:1137 +#: parser/parse_clause.c:1139 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "" "предложение TABLESAMPLE можно применять только к таблицам и " "материализованным представлениям" -#: parser/parse_clause.c:1327 +#: parser/parse_clause.c:1329 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "имя столбца \"%s\" фигурирует в предложении USING неоднократно" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "имя общего столбца \"%s\" фигурирует в таблице слева неоднократно" -#: parser/parse_clause.c:1351 +#: parser/parse_clause.c:1353 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблице слева нет столбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "имя общего столбца \"%s\" фигурирует в таблице справа неоднократно" -#: parser/parse_clause.c:1375 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблице справа нет столбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1779 +#: parser/parse_clause.c:1781 #, 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:1804 +#: parser/parse_clause.c:1806 #, 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:1969 +#: parser/parse_clause.c:1971 #, 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:1998 +#: parser/parse_clause.c:1999 #, 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:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "в списке выборки %s нет элемента %d" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE имеет ограничение в 12 элементов" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "окно \"%s\" уже определено" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "переопределить предложение PARTITION BY для окна \"%s\" нельзя" -#: parser/parse_clause.c:2738 +#: parser/parse_clause.c:2739 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "переопределить предложение ORDER BY для окна \"%s\" нельзя" -#: parser/parse_clause.c:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "скопировать окно \"%s\", имеющее предложение рамки, нельзя" -#: parser/parse_clause.c:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Уберите скобки в предложении OVER." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" @@ -17327,12 +18294,12 @@ msgstr "" "для RANGE со смещением PRECEDING/FOLLOWING требуется ровно один столбец в " "ORDER BY" -#: parser/parse_clause.c:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "для режима GROUPS требуется предложение ORDER BY" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, c-format msgid "" "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument " @@ -17341,68 +18308,68 @@ msgstr "" "для агрегатной функции с DISTINCT, выражения ORDER BY должны быть в списке " "аргументов" -#: parser/parse_clause.c:2890 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "в конструкции SELECT DISTINCT выражения ORDER BY должны быть в списке выборки" -#: parser/parse_clause.c:2922 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатной функции с DISTINCT нужен минимум один аргумент" -#: parser/parse_clause.c:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "в SELECT DISTINCT нужен минимум один столбец" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "" "выражения SELECT DISTINCT ON должны соответствовать начальным выражениям " "ORDER BY" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3101 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC нельзя использовать в ON CONFLICT" -#: parser/parse_clause.c:3105 +#: parser/parse_clause.c:3107 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST нельзя использовать в ON CONFLICT" -#: parser/parse_clause.c:3184 +#: parser/parse_clause.c:3186 #, c-format msgid "" "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "" "в ON CONFLICT DO UPDATE требуется наводящее указание или имя ограничения" -#: parser/parse_clause.c:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Например: ON CONFLICT (имя_столбца)." -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT с таблицами системного каталога не поддерживается" -#: parser/parse_clause.c:3204 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "" "ON CONFLICT не поддерживается для таблицы \"%s\", служащей таблицей каталога" -#: parser/parse_clause.c:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не годится для сортировки" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, c-format msgid "" "Ordering operators must be \"<\" or \">\" members of btree operator families." @@ -17410,14 +18377,14 @@ msgstr "" "Операторы сортировки должны быть членами \"<\" или \">\" семейств операторов " "btree." -#: parser/parse_clause.c:3647 +#: parser/parse_clause.c:3649 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "" "RANGE со смещением PRECEDING/FOLLOWING не поддерживается для типа столбца %s" -#: parser/parse_clause.c:3653 +#: parser/parse_clause.c:3655 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s " @@ -17426,12 +18393,12 @@ msgstr "" "RANGE со смещением PRECEDING/FOLLOWING не поддерживается для типа столбца %s " "и типа смещения %s" -#: parser/parse_clause.c:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведите значение смещения к подходящему типу." -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for " @@ -17440,14 +18407,14 @@ msgstr "" "RANGE со смещением PRECEDING/FOLLOWING допускает несколько интерпретаций для " "типа столбца %s и типа смещения %s" -#: parser/parse_clause.c:3664 +#: parser/parse_clause.c:3666 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведите значение смещения в точности к желаемому типу." #: 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:2662 parser/parse_target.c:994 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "привести тип %s к %s нельзя" @@ -17506,19 +18473,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "аргументы, объявленные как \"%s\", должны быть однотипными" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:523 +#: utils/fmgr/funcapi.c:601 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, объявленный как \"%s\", оказался не массивом, а типом %s" #: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:537 +#: utils/fmgr/funcapi.c:615 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, объявленный как \"%s\", имеет не диапазонный тип, а %s" #: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "аргумент, объявленный как \"%s\", имеет не мультидиапазонный тип, а %s" @@ -17631,13 +18598,13 @@ msgstr "" "Для результата типа internal требуется минимум один аргумент типа internal." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:1004 +#: parser/parse_collate.c:1005 #, 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:1007 +#: parser/parse_collate.c:1008 #, c-format msgid "" "You can choose the collation by applying the COLLATE clause to one or both " @@ -17646,7 +18613,7 @@ msgstr "" "Правило сортировки можно выбрать явно, применив предложение COLLATE к одному " "или обоим выражениям." -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "явно указанные правила сортировки \"%s\" и \"%s\" несовместимы" @@ -17684,17 +18651,22 @@ msgstr "рекурсивная ссылка на запрос \"%s\" не дол msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в EXCEPT" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE не поддерживается в запросе WITH" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "имя запроса WITH \"%s\" указано неоднократно" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "не удалось найти оператор неравенства для типа %s" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "" "WITH clause containing a data-modifying statement must be at the top level" @@ -17702,7 +18674,7 @@ msgstr "" "предложение WITH, содержащее оператор, изменяющий данные, должно быть на " "верхнем уровне" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -17711,12 +18683,12 @@ msgstr "" "в рекурсивном запросе \"%s\" столбец %d имеет тип %s в нерекурсивной части, " "но в результате тип %s" -#: parser/parse_cte.c:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведите результат нерекурсивной части к правильному типу." -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -17725,43 +18697,43 @@ msgstr "" "в рекурсивном запросе \"%s\" у столбца %d правило сортировки \"%s\" в не " "рекурсивной части, но в результате правило \"%s\"" -#: parser/parse_cte.c:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "" "Измените правило сортировки в нерекурсивной части, добавив предложение " "COLLATE." -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "запрос WITH не рекурсивный" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, 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:455 +#: parser/parse_cte.c:462 #, 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:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "столбец поиска \"%s\" отсутствует в списке столбцов запроса WITH" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "столбец поиска \"%s\" указан неоднократно" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "" "search sequence column name \"%s\" already used in WITH query column list" @@ -17769,64 +18741,64 @@ msgstr "" "имя столбца последовательности поиска \"%s\" уже используется в списке " "столбцов запроса WITH" -#: parser/parse_cte.c:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "столбец цикла \"%s\" отсутствует в списке столбцов запроса WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "столбец цикла \"%s\" указан неоднократно" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "" "имя столбца пометки цикла \"%s\" уже используется в списке столбцов запроса " "WITH" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "" "имя столбца пути цикла \"%s\" уже используется в списке столбцов запроса WITH" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "имя столбца пометки цикла совпадает с именем столбца пути цикла" -#: parser/parse_cte.c:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "" "имя столбца последовательности поиска совпадает с именем столбца пометки " "цикла" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "" "имя столбца последовательности поиска совпадает с именем столбца пути цикла" -#: parser/parse_cte.c:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "запрос WITH \"%s\" содержит столбцов: %d, но указано: %d" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаимная рекурсия между элементами WITH не реализована" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "" "рекурсивный запрос \"%s\" не должен содержать операторов, изменяющих данные" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, c-format msgid "" "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] " @@ -17835,101 +18807,101 @@ msgstr "" "рекурсивный запрос \"%s\" должен иметь форму {нерекурсивная часть} UNION " "[ALL] {рекурсивная часть}" -#: parser/parse_cte.c:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурсивная ссылка на запрос \"%s\" указана неоднократно" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допускается в данном контексте" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 -#: parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "столбец %s.%s не существует" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "столбец \"%s\" не найден в типе данных %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не удалось идентифицировать столбец \"%s\" в типе записи" # skip-rule: space-before-period -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:359 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "" "запись имени столбца .%s применена к типу %s, который не является составным" -#: parser/parse_expr.c:395 parser/parse_target.c:739 +#: parser/parse_expr.c:390 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "расширение строки через \"*\" здесь не поддерживается" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "в выражении DEFAULT (по умолчанию) нельзя ссылаться на столбцы" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 msgid "cannot use column reference in partition bound expression" msgstr "в выражении границы секции нельзя ссылаться на столбцы" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 -#: parser/parse_relation.c:889 parser/parse_target.c:1234 +#: parser/parse_expr.c:784 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:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:840 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:1044 +#: parser/parse_expr.c:1040 #, 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:1050 parser/parse_expr.c:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s не должна возвращать множество" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "число столбцов не равно числу значений" -#: parser/parse_expr.c:1481 +#: parser/parse_expr.c:1477 #, c-format msgid "" "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() " @@ -17939,158 +18911,158 @@ msgstr "" "SELECT или выражение ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функции, возвращающие множества, нельзя применять в конструкции %s" -#: parser/parse_expr.c:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "в ограничении-проверке нельзя использовать подзапросы" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "в выражении DEFAULT нельзя использовать подзапросы" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "в индексном выражении нельзя использовать подзапросы" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "в предикате индекса нельзя использовать подзапросы" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" msgstr "в выражении статистики нельзя использовать подзапросы" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "нельзя использовать подзапрос в выражении преобразования" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "в качестве параметра EXECUTE нельзя использовать подзапрос" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "в условии WHEN для триггера нельзя использовать подзапросы" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "в выражении границы секции нельзя использовать подзапросы" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "в выражении ключа секционирования нельзя использовать подзапросы" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "в качестве аргумента CALL нельзя использовать подзапрос" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "в условии COPY FROM WHERE нельзя использовать подзапросы" -#: parser/parse_expr.c:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "в выражении генерируемого столбца нельзя использовать подзапросы" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "подзапрос должен вернуть только один столбец" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "в подзапросе слишком много столбцов" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "в подзапросе недостаточно столбцов" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого массива определить нельзя" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "" "Приведите его к желаемому типу явным образом, например ARRAY[]::integer[]." -#: parser/parse_expr.c:2015 +#: parser/parse_expr.c:2012 #, c-format msgid "could not find element type for data type %s" msgstr "не удалось определить тип элемента для типа данных %s" -#: parser/parse_expr.c:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "число элементов в выражениях ROW ограничено %d" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "вместо значения XML-атрибута без имени должен указываться столбец" -#: parser/parse_expr.c:2304 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "вместо значения XML-элемента без имени должен указываться столбец" -#: parser/parse_expr.c:2319 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "имя XML-атрибута \"%s\" указано неоднократно" -#: parser/parse_expr.c:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE к типу %s нельзя" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "разное число элементов в строках" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "строки нулевой длины сравнивать нельзя" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "оператор сравнения строк должен выдавать результат логического типа, а не %s" -#: parser/parse_expr.c:2777 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор сравнения строк не должен возвращать множество" -#: parser/parse_expr.c:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не удалось выбрать интерпретацию оператора сравнения строк %s" -#: parser/parse_expr.c:2838 +#: parser/parse_expr.c:2835 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "" "Операторы сравнения строк должны быть связаны с семейством операторов btree." -#: parser/parse_expr.c:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Оказалось несколько равноценных кандидатур." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "" @@ -18434,73 +19406,104 @@ msgstr "функции, возвращающие множества, нельз msgid "set-returning functions are not allowed in window definitions" msgstr "функции, возвращающие множества, нельзя применять в определении окна" -#: parser/parse_func.c:2616 +#: 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:2620 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "функции, возвращающие множества, нельзя применять в выражениях DEFAULT" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях индексов" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "" "функции, возвращающие множества, нельзя применять в предикатах индексов" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях статистики" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях преобразований" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "функции, возвращающие множества, нельзя применять в параметрах EXECUTE" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях WHEN для " "триггеров" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "" "функции, возвращающие множества, нельзя применять в выражении границы секции" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях ключа " "секционирования" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "функции, возвращающие множества, нельзя применять в аргументах CALL" -#: parser/parse_func.c:2650 +#: 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:2653 +#: parser/parse_func.c:2656 msgid "" "set-returning functions are not allowed in column generation expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях генерируемых " "столбцов" -#: parser/parse_node.c:87 +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "предложение WITH RECURSIVE не поддерживается с оператором MERGE" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" +"после безусловного предложения WHEN указано недостижимое предложение WHEN" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE не поддерживается для отношений с правилами." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "имя \"%s\" указано больше одного раза" + +#: parser/parse_merge.c:210 +#, 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" @@ -18587,6 +19590,11 @@ msgstr "" 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" @@ -18602,12 +19610,12 @@ msgstr "ссылка на таблицу %u неоднозначна" msgid "table name \"%s\" specified more than once" msgstr "имя таблицы \"%s\" указано больше одного раза" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в элементе предложения FROM неверная ссылка на таблицу \"%s\"" -#: parser/parse_relation.c:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -18633,13 +19641,18 @@ msgstr "" "системный столбец \"%s\" нельзя использовать в выражении генерируемого " "столбца" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 -#: parser/parse_relation.c:2343 +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "системный столбец \"%s\" нельзя использовать в условии MERGE WHEN" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "в таблице \"%s\" содержится столбцов: %d, но указано: %d" -#: 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 " @@ -18648,7 +19661,7 @@ msgstr "" "В WITH есть элемент \"%s\", но на него нельзя ссылаться из этой части " "запроса." -#: 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." @@ -18656,13 +19669,13 @@ msgstr "" "Используйте WITH RECURSIVE или исключите ссылки вперёд, переупорядочив " "элементы WITH." -#: parser/parse_relation.c:1767 +#: 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:1773 +#: parser/parse_relation.c:1784 #, c-format msgid "" "a column definition list is redundant for a function returning a named " @@ -18671,82 +19684,77 @@ msgstr "" "список определений столбцов не нужен для функции, возвращающий именованный " "составной тип" -#: 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 "" "список определений столбцов может быть только у функций, возвращающих запись" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "" "у функций, возвращающих запись, должен быть список определений столбцов" -#: parser/parse_relation.c:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "число элементов в списках определения столбцов ограничено %d" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "функция \"%s\", используемая во FROM, возвращает неподдерживаемый тип %s" -#: parser/parse_relation.c:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "число столбцов, возвращаемых функциями во FROM, ограничено %d" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "функция %s выдаёт столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "в списках VALUES \"%s\" содержится столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "число столбцов в соединениях ограничено %d" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "" "join expression \"%s\" has %d columns available but %d columns specified" msgstr "в выражении соединения \"%s\" имеется столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "в запросе \"%s\" в WITH нет предложения RETURNING" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "столбец %d отношения \"%s\" не существует" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Возможно, предполагалась ссылка на псевдоним таблицы \"%s\"." -#: parser/parse_relation.c:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблица \"%s\" отсутствует в предложении FROM" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Возможно, предполагалась ссылка на столбец \"%s.%s\"." -#: parser/parse_relation.c:3646 +#: parser/parse_relation.c:3664 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -18755,7 +19763,7 @@ msgstr "" "Столбец \"%s\" есть в таблице \"%s\", но на него нельзя ссылаться из этой " "части запроса." -#: parser/parse_relation.c:3663 +#: parser/parse_relation.c:3681 #, c-format msgid "" "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." @@ -18814,7 +19822,7 @@ msgstr "" msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "вложенное поле \"%s\" имеет тип %s, а выражение - %s" -#: parser/parse_target.c:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * должен ссылаться на таблицы" @@ -18834,8 +19842,8 @@ msgstr "неправильное указание %%TYPE (слишком мно msgid "type reference %s converted to %s" msgstr "ссылка на тип %s преобразована в тип %s" -#: parser/parse_type.c:278 parser/parse_type.c:803 utils/cache/typcache.c:394 -#: utils/cache/typcache.c:449 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" является пустышкой" @@ -18845,12 +19853,12 @@ 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:766 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "неверное имя типа \"%s\"" @@ -18860,74 +19868,74 @@ msgstr "неверное имя типа \"%s\"" msgid "cannot create partitioned table as inheritance child" msgstr "создать секционированную таблицу в виде потомка нельзя" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "массивы с типом serial не реализованы" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, c-format msgid "" "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "конфликт NULL/NOT NULL в объявлении столбца \"%s\" таблицы \"%s\"" -#: parser/parse_utilcmd.c:684 +#: parser/parse_utilcmd.c:683 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" указано несколько значений по умолчанию" -#: parser/parse_utilcmd.c:701 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "столбцы идентификации не поддерживаются с типизированными таблицами" -#: parser/parse_utilcmd.c:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "столбцы идентификации не поддерживаются с секциями" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" свойство identity задано неоднократно" -#: parser/parse_utilcmd.c:744 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "генерируемые столбцы не поддерживаются с типизированными таблицами" -#: parser/parse_utilcmd.c:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "генерируемые столбцы не поддерживаются с секциями" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" указано несколько генерирующих выражений" -#: parser/parse_utilcmd.c:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "ограничения первичного ключа для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "ограничения уникальности для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:825 +#: parser/parse_utilcmd.c:824 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и свойство " "identity" -#: parser/parse_utilcmd.c:833 +#: parser/parse_utilcmd.c:832 #, c-format msgid "" "both default and generation expression specified for column \"%s\" of table " @@ -18936,7 +19944,7 @@ msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и " "генерирующее выражение" -#: parser/parse_utilcmd.c:841 +#: parser/parse_utilcmd.c:840 #, c-format msgid "" "both identity and generation expression specified for column \"%s\" of table " @@ -18945,88 +19953,93 @@ msgstr "" "для столбца \"%s\" таблицы \"%s\" задано и генерирующее выражение, и " "свойство identity" -#: parser/parse_utilcmd.c:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "ограничения-исключения для сторонних таблиц не поддерживаются" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "ограничения-исключения для секционированных таблиц не поддерживаются" -#: parser/parse_utilcmd.c:977 +#: parser/parse_utilcmd.c:976 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE при создании сторонних таблиц не поддерживается" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "отношение \"%s\" не подходит для предложения LIKE" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Индекс \"%s\" ссылается на тип всей строки таблицы." -#: parser/parse_utilcmd.c:2249 +#: parser/parse_utilcmd.c:2252 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "в CREATE TABLE нельзя использовать существующий индекс" -#: parser/parse_utilcmd.c:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "индекс \"%s\" уже связан с ограничением" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не является уникальным индексом" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 -#: parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "" "Создать первичный ключ или ограничение уникальности для такого индекса " "нельзя." -#: parser/parse_utilcmd.c:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "индекс \"%s\" содержит выражения" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" - частичный индекс" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" - откладываемый индекс" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "" "Создать не откладываемое ограничение на базе откладываемого индекса нельзя." -#: parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2384 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "" "в индексе \"%s\" для столбца номер %d не определено поведение сортировки по " "умолчанию" -#: parser/parse_utilcmd.c:2538 +#: parser/parse_utilcmd.c:2541 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "столбец \"%s\" фигурирует в первичном ключе дважды" -#: parser/parse_utilcmd.c:2544 +#: parser/parse_utilcmd.c:2547 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "столбец \"%s\" фигурирует в ограничении уникальности дважды" -#: parser/parse_utilcmd.c:2891 +#: parser/parse_utilcmd.c:2894 #, c-format msgid "" "index expressions and predicates can refer only to the table being indexed" @@ -19034,22 +20047,22 @@ msgstr "" "индексные выражения и предикаты могут ссылаться только на индексируемую " "таблицу" -#: parser/parse_utilcmd.c:2963 +#: parser/parse_utilcmd.c:2966 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "выражения статистики могут ссылаться только на целевую таблицу" -#: parser/parse_utilcmd.c:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "правила для материализованных представлений не поддерживаются" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в условиях WHERE для правил нельзя ссылаться на другие отношения" -#: parser/parse_utilcmd.c:3142 +#: parser/parse_utilcmd.c:3145 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -19058,158 +20071,158 @@ msgstr "" "правила с условиями WHERE могут содержать только действия SELECT, INSERT, " "UPDATE или DELETE" -#: parser/parse_utilcmd.c:3160 parser/parse_utilcmd.c:3261 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 #: rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "условные операторы UNION/INTERSECT/EXCEPT не реализованы" -#: parser/parse_utilcmd.c:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "в правиле ON SELECT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "в правиле ON SELECT нельзя использовать NEW" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "в правиле ON INSERT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "в правиле ON DELETE нельзя использовать NEW" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "в запросе WITH нельзя ссылаться на OLD" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "в запросе WITH нельзя ссылаться на NEW" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "предложение DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "DEFERRABLE/NOT DEFERRABLE можно указать только один раз" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "предложение NOT DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 gram.y:5559 +#: parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 gram.y:5937 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "" "ограничение с характеристикой INITIALLY DEFERRED должно быть объявлено как " "DEFERRABLE" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "предложение INITIALLY DEFERRED расположено неправильно" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "INITIALLY IMMEDIATE/DEFERRED можно указать только один раз" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "предложение INITIALLY IMMEDIATE расположено неправильно" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "в CREATE указана схема (%s), отличная от создаваемой (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" — не секционированная таблица" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблица \"%s\" не является секционированной" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "индекс \"%s\" не секционирован" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у секционированной по хешу таблицы не может быть секции по умолчанию" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неправильное указание ограничения для хеш-секции" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "модуль для хеш-секции должен быть положительным целым" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "остаток для хеш-секции должен быть меньше модуля" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "неправильное указание ограничения для секции по списку" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "неправильное указание ограничения для секции по диапазону" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "" "во FROM должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4139 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "" "в TO должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "указать NULL в диапазонном ограничении нельзя" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за границей MAXVALUE могут следовать только границы MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4309 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за границей MINVALUE могут следовать только границы MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4352 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "указанное значение нельзя привести к типу %s столбца \"%s\"" @@ -19222,12 +20235,12 @@ msgstr "За UESCAPE должна следовать простая строко msgid "invalid Unicode escape character" msgstr "неверный символ спецкода Unicode" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "неверное значение спецкода Unicode" -#: parser/parser.c:468 utils/adt/varlena.c:6555 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6529 scan.l:684 #, c-format msgid "invalid Unicode escape" msgstr "неверный спецкод Unicode" @@ -19237,8 +20250,8 @@ msgstr "неверный спецкод Unicode" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спецкоды Unicode должны иметь вид \\XXXX или \\+XXXXXX." -#: parser/parser.c:497 utils/adt/varlena.c:6580 scan.l:638 scan.l:654 -#: scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6554 scan.l:645 scan.l:661 +#: scan.l:677 #, c-format msgid "invalid Unicode surrogate pair" msgstr "неверная суррогатная пара Unicode" @@ -19248,20 +20261,20 @@ msgstr "неверная суррогатная пара Unicode" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "идентификатор \"%s\" будет усечён до \"%.*s\"" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "секция \"%s\" конфликтует с существующей секцией по умолчанию \"%s\"" -#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 -#: partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, c-format msgid "" "every hash partition modulus must be a factor of the next larger modulus" msgstr "" "модуль каждой хеш-секции должен быть делителем модулей, превышающих его" -#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, c-format msgid "" "The new modulus %d is not a factor of %d, the modulus of existing partition " @@ -19269,29 +20282,29 @@ msgid "" msgstr "" "Новый модуль %d не является делителем %d, модуля существующей секции \"%s\"." -#: partitioning/partbounds.c:2893 +#: partitioning/partbounds.c:3005 #, 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 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "для секции \"%s\" заданы границы, образующие пустой диапазон" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Указанная нижняя граница %s больше или равна верхней границе %s." -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "секция \"%s\" пересекается с секцией \"%s\"" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, c-format msgid "" "skipped scanning foreign table \"%s\" which is a partition of default " @@ -19300,19 +20313,19 @@ msgstr "" "пропущено сканирование сторонней таблицы \"%s\", являющейся секцией секции " "по умолчанию \"%s\"" -#: partitioning/partbounds.c:4715 +#: partitioning/partbounds.c:4828 #, c-format msgid "" "remainder for hash partition must be an integer value greater than or equal " "to zero" msgstr "значение остатка для хеш-секции должно быть неотрицательным целым" -#: partitioning/partbounds.c:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не является таблицей, секционированной по хешу" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, c-format msgid "" "number of partitioning columns (%d) does not match number of partition keys " @@ -19321,7 +20334,7 @@ msgstr "" "число секционирующих столбцов (%d) не равно числу представленных ключей " "секционирования (%d)" -#: partitioning/partbounds.c:4772 +#: partitioning/partbounds.c:4885 #, c-format msgid "" "column %d of the partition key has type %s, but supplied value is of type %s" @@ -19329,7 +20342,7 @@ msgstr "" "столбец %d ключа секционирования имеет тип %s, но для него передано значение " "типа %s" -#: partitioning/partbounds.c:4804 +#: partitioning/partbounds.c:4917 #, c-format msgid "" "column %d of the partition key has type \"%s\", but supplied value is of " @@ -19338,8 +20351,8 @@ msgstr "" "столбец %d ключа секционирования имеет тип \"%s\", но для него передано " "значение типа \"%s\"" -#: 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 +#: 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\": %m" @@ -19400,12 +20413,12 @@ msgstr "" "Подробная информация о настройке разделяемой памяти содержится в " "документации PostgreSQL." -#: port/pg_shmem.c:616 port/sysv_shmem.c:616 +#: 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:618 port/sysv_shmem.c:618 +#: 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 " @@ -19419,25 +20432,25 @@ msgstr "" "можно снизить использование разделяемой памяти, возможно, уменьшив " "shared_buffers или max_connections." -#: port/pg_shmem.c:686 port/sysv_shmem.c:686 +#: 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:693 port/sysv_shmem.c:693 +#: 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:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1195 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "ранее выделенный блок разделяемой памяти (ключ %lu, ID %lu) по-прежнему " "используется" -#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1197 #, c-format msgid "" "Terminate any old server processes associated with data directory \"%s\"." @@ -19483,12 +20496,12 @@ msgstr "" "Возможно, вам следует увеличить параметр ядра SEMVMX минимум до %d. " "Подробнее об этом написано в документации 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" @@ -19496,29 +20509,29 @@ 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 "" @@ -19616,43 +20629,48 @@ msgstr "Ошибка в системном вызове DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Ошибка в системном вызове MapViewOfFileEx." -#: postmaster/autovacuum.c:410 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "породить процесс запуска автоочистки не удалось: %m" -#: postmaster/autovacuum.c:1492 +#: 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 "не удалось породить рабочий процесс автоочистки: %m" # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2298 +#: postmaster/autovacuum.c:2277 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: удаление устаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматическая очистка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматический анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей записи для отношения \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." @@ -19666,16 +20684,16 @@ msgstr "" "несогласованное состояние фонового рабочего процесса " "(max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:661 +#: postmaster/bgworker.c:666 #, c-format msgid "" -"background worker \"%s\": must attach to shared memory in order to request a " -"database connection" +"background worker \"%s\": background workers without shared memory access " +"are not supported" msgstr "" -"фоновый процесс \"%s\" должен иметь доступ к общей памяти, чтобы запросить " -"подключение к БД" +"фоновый процесс \"%s\": фоновые процессы, не обращающиеся к общей памяти, не " +"поддерживаются" -#: postmaster/bgworker.c:670 +#: postmaster/bgworker.c:677 #, c-format msgid "" "background worker \"%s\": cannot request database access if starting at " @@ -19684,12 +20702,12 @@ msgstr "" "фоновый процесс \"%s\" не может получить доступ к БД, если он запущен при " "старте главного процесса" -#: postmaster/bgworker.c:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновый процесс \"%s\": неправильный интервал перезапуска" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "" "background worker \"%s\": parallel workers may not be configured for restart" @@ -19697,19 +20715,19 @@ msgstr "" "фоновый процесс \"%s\": параллельные исполнители не могут быть настроены для " "перезапуска" -#: postmaster/bgworker.c:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершение фонового процесса \"%s\" по команде администратора" -#: postmaster/bgworker.c:904 +#: 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:916 +#: postmaster/bgworker.c:899 #, c-format msgid "" "background worker \"%s\": only dynamic background workers can request " @@ -19718,12 +20736,12 @@ msgstr "" "фоновый процесс \"%s\": только динамические фоновые процессы могут " "запрашивать уведомление" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "слишком много фоновых процессов" -#: 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 "" @@ -19735,13 +20753,13 @@ msgstr[1] "" msgstr[2] "" "Максимально возможное число фоновых процессов при текущих параметрах: %d." -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "" "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Возможно, стоит увеличить параметр \"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)" @@ -19749,32 +20767,32 @@ msgstr[0] "контрольные точки происходят слишком msgstr[1] "контрольные точки происходят слишком часто (через %d сек.)" msgstr[2] "контрольные точки происходят слишком часто (через %d сек.)" -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Возможно, стоит увеличить параметр \"max_wal_size\"." -#: postmaster/checkpointer.c:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "сбой при запросе контрольной точки" -#: postmaster/checkpointer.c:1063 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Смотрите подробности в протоколе сервера." -#: postmaster/pgarch.c:365 +#: postmaster/pgarch.c:423 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "режим архивации включён, но команда архивации не задана" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "режим архивации включён, но архивирование ещё не настроено" -#: postmaster/pgarch.c:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "удалён ненужный файл состояния архива \"%s\"" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, c-format msgid "" "removal of orphan archive status file \"%s\" failed too many times, will try " @@ -19783,7 +20801,7 @@ msgstr "" "удалить ненужный файл состояния архива \"%s\" не получилось много раз " "подряд; следующая попытка будет сделана позже" -#: postmaster/pgarch.c:433 +#: postmaster/pgarch.c:491 #, c-format msgid "" "archiving write-ahead log file \"%s\" failed too many times, will try again " @@ -19792,329 +20810,153 @@ msgstr "" "заархивировать файл журнала предзаписи \"%s\" не удалось много раз подряд; " "следующая попытка будет сделана позже" -#: postmaster/pgarch.c:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "команда архивации завершилась ошибкой с кодом %d" - -#: 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:543 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "команда архивации была прервана исключением 0x%X" - -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3758 +#: postmaster/pgarch.c:798 #, c-format msgid "" -"See C include file \"ntstatus.h\" for a description of the hexadecimal value." +"restarting archiver process because value of \"archive_library\" was changed" msgstr "" -"Описание этого шестнадцатеричного значения ищите во включаемом C-файле " -"\"ntstatus.h\"" - -#: postmaster/pgarch.c:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "команда архивации завершена по сигналу %d: %s" +"процесс архиватора перезапускается, так как было изменено значение " +"\"archive_library\"" -#: postmaster/pgarch.c:559 +#: postmaster/pgarch.c:831 #, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "команда архивации завершилась с неизвестным кодом состояния %d" +msgid "archive modules have to define the symbol %s" +msgstr "в модулях архивирования должен объявляться символ %s" -#: postmaster/pgstat.c:418 +#: postmaster/pgarch.c:837 #, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "не удалось разрешить \"localhost\": %s" +msgid "archive modules must register an archive callback" +msgstr "модули архивирования должны регистрировать обработчик вызова архивации" -#: postmaster/pgstat.c:441 +#: postmaster/postmaster.c:744 #, c-format -msgid "trying another address for the statistics collector" -msgstr "проба другого адреса для сборщика статистики" +msgid "%s: invalid argument for option -f: \"%s\"\n" +msgstr "%s: неверный аргумент для параметра -f: \"%s\"\n" -#: postmaster/pgstat.c:450 +#: postmaster/postmaster.c:823 #, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "не удалось создать сокет для сборщика статистики: %m" +msgid "%s: invalid argument for option -t: \"%s\"\n" +msgstr "%s: неверный аргумент для параметра -t: \"%s\"\n" -#: postmaster/pgstat.c:462 +#: postmaster/postmaster.c:874 #, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "не удалось привязаться к сокету для сборщика статистики: %m" +msgid "%s: invalid argument: \"%s\"\n" +msgstr "%s: неверный аргумент: \"%s\"\n" -#: postmaster/pgstat.c:473 +#: postmaster/postmaster.c:942 #, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "не удалось получить адрес сокета для сборщика статистики: %m" +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/pgstat.c:489 +#: postmaster/postmaster.c:949 #, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "не удалось подключить сокет для сборщика статистики: %m" +msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" +msgstr "Архивацию WAL нельзя включить, если установлен wal_level \"minimal\"" -#: postmaster/pgstat.c:510 +#: postmaster/postmaster.c:952 #, c-format -msgid "could not send test message on socket for statistics collector: %m" +msgid "" +"WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or " +"\"logical\"" msgstr "" -"не удалось послать тестовое сообщение в сокет для сборщика статистики: %m" +"Для потоковой трансляции WAL (max_wal_senders > 0) wal_level должен быть " +"\"replica\" или \"logical\"" -#: postmaster/pgstat.c:536 +#: postmaster/postmaster.c:960 #, c-format -msgid "select() failed in statistics collector: %m" -msgstr "сбой select() в сборщике статистики: %m" +msgid "%s: invalid datetoken tables, please fix\n" +msgstr "%s: ошибка в таблицах маркеров времени, требуется исправление\n" -#: postmaster/pgstat.c:551 +#: postmaster/postmaster.c:1113 #, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "тестовое сообщение не прошло через сокет для сборщика статистики" +msgid "could not create I/O completion port for child queue" +msgstr "не удалось создать порт завершения ввода/вывода для очереди потомков" -#: postmaster/pgstat.c:566 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "" -"тестовое сообщение через сокет для сборщика статистики получить не удалось: " -"%m" - -#: postmaster/pgstat.c:576 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "тестовое сообщение через сокет для сборщика статистики прошло неверно" - -#: postmaster/pgstat.c:599 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "" -"не удалось переключить сокет сборщика статистики в неблокирующий режим: %m" - -#: postmaster/pgstat.c:643 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "сборщик статистики отключается из-за нехватки рабочего сокета" - -#: postmaster/pgstat.c:790 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "не удалось породить процесс сборщика статистики: %m" - -#: postmaster/pgstat.c:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "запрошен сброс неизвестного счётчика: \"%s\"" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "Допустимый счётчик: \"archiver\", \"bgwriter\" или \"wal\"." - -#: postmaster/pgstat.c:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "не удалось прочитать сообщение статистики: %m" - -#: 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:3729 postmaster/pgstat.c:3864 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "не удалось записать во временный файл статистики \"%s\": %m" - -#: 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: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: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: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: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 " -"not responding" -msgstr "" -"используется просроченная статистика вместо текущей, так как сборщик " -"статистики не отвечает" - -#: 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:745 -#, c-format -msgid "%s: invalid argument for option -f: \"%s\"\n" -msgstr "%s: неверный аргумент для параметра -f: \"%s\"\n" - -#: postmaster/postmaster.c:824 -#, c-format -msgid "%s: invalid argument for option -t: \"%s\"\n" -msgstr "%s: неверный аргумент для параметра -t: \"%s\"\n" - -#: postmaster/postmaster.c:875 -#, c-format -msgid "%s: invalid argument: \"%s\"\n" -msgstr "%s: неверный аргумент: \"%s\"\n" - -#: 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:924 -#, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "Архивацию WAL нельзя включить, если установлен wal_level \"minimal\"" - -#: 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:935 -#, c-format -msgid "%s: invalid datetoken tables, please fix\n" -msgstr "%s: ошибка в таблицах маркеров времени, требуется исправление\n" - -#: postmaster/postmaster.c:1052 -#, c-format -msgid "could not create I/O completion port for child queue" -msgstr "не удалось создать порт завершения ввода/вывода для очереди потомков" - -#: postmaster/postmaster.c:1128 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "завершение вывода в stderr" -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "В дальнейшем протокол будет выводиться в \"%s\"." -#: postmaster/postmaster.c:1140 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "запускается %s" -#: postmaster/postmaster.c:1161 postmaster/postmaster.c:1260 -#: utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "неверный формат списка в параметре \"%s\"" - -#: postmaster/postmaster.c:1192 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не удалось создать принимающий сокет для \"%s\"" -#: postmaster/postmaster.c:1198 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не удалось создать сокеты TCP/IP" -#: postmaster/postmaster.c:1230 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "функция DNSServiceRegister() выдала ошибку с кодом %ld" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1343 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не удалось создать Unix-сокет в каталоге \"%s\"" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "ни один Unix-сокет создать не удалось" -#: postmaster/postmaster.c:1300 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "отсутствуют принимающие сокеты" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1392 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: не удалось поменять права для внешнего файла PID \"%s\": %s\n" -#: postmaster/postmaster.c:1335 +#: postmaster/postmaster.c:1396 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: не удалось записать внешний файл PID \"%s\": %s\n" -#: postmaster/postmaster.c:1368 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "не удалось загрузить pg_hba.conf" -#: postmaster/postmaster.c:1394 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "процесс postmaster стал многопоточным при запуске" -#: postmaster/postmaster.c:1395 +#: postmaster/postmaster.c:1450 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Установите в переменной окружения LC_ALL правильную локаль." -#: postmaster/postmaster.c:1490 +#: postmaster/postmaster.c:1551 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не удалось найти путь к собственному исполняемому файлу" -#: postmaster/postmaster.c:1497 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: подходящий исполняемый файл postgres не найден" -#: postmaster/postmaster.c:1520 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 utils/misc/tzparser.c:340 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -20123,7 +20965,7 @@ msgstr "" "Возможно, PostgreSQL установлен не полностью или файла \"%s\" нет в " "положенном месте." -#: postmaster/postmaster.c:1547 +#: postmaster/postmaster.c:1608 #, c-format msgid "" "%s: could not find the database system\n" @@ -20134,45 +20976,45 @@ msgstr "" "Ожидалось найти её в каталоге \"%s\",\n" "но открыть файл \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:1724 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "сбой select() в postmaster'е: %m" # well-spelled: неподчиняющимся -#: postmaster/postmaster.c:1860 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "неподчиняющимся потомкам посылается SIGKILL" -#: postmaster/postmaster.c:1881 +#: postmaster/postmaster.c:1937 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" msgstr "" "немедленное отключение из-за ошибочного файла блокировки каталога данных" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "неполный стартовый пакет" -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "неверная длина стартового пакета" -#: postmaster/postmaster.c:2058 +#: postmaster/postmaster.c:2114 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "не удалось отправить ответ в процессе SSL-согласования: %m" -#: postmaster/postmaster.c:2076 +#: postmaster/postmaster.c:2132 #, c-format msgid "received unencrypted data after SSL request" msgstr "после запроса SSL получены незашифрованные данные" -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, c-format msgid "" "This could be either a client-software bug or evidence of an attempted man-" @@ -20181,195 +21023,191 @@ msgstr "" "Это может свидетельствовать об ошибке в клиентском ПО или о попытке атаки " "MITM." -#: postmaster/postmaster.c:2102 +#: postmaster/postmaster.c:2158 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "не удалось отправить ответ в процессе согласования GSSAPI: %m" -#: postmaster/postmaster.c:2120 +#: postmaster/postmaster.c:2176 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "после запроса шифрования GSSAPI получены незашифрованные данные" -#: postmaster/postmaster.c:2144 +#: postmaster/postmaster.c:2200 #, 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:2208 utils/misc/guc.c:7126 utils/misc/guc.c:7162 -#: utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11538 -#: utils/misc/guc.c:11579 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8944 utils/misc/guc.c:11986 +#: utils/misc/guc.c:12027 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неверное значение для параметра \"%s\": \"%s\"" -#: postmaster/postmaster.c:2211 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Допустимые значения: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2312 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "неверная структура стартового пакета: последним байтом должен быть терминатор" -#: postmaster/postmaster.c:2273 +#: postmaster/postmaster.c:2329 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "в стартовом пакете не указано имя пользователя PostgreSQL" -#: postmaster/postmaster.c:2337 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "система баз данных запускается" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2399 #, c-format msgid "the database system is not yet accepting connections" msgstr "система БД ещё не принимает подключения" -#: postmaster/postmaster.c:2344 +#: postmaster/postmaster.c:2400 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Согласованное состояние восстановления ещё не достигнуто." -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2404 #, c-format msgid "the database system is not accepting connections" msgstr "система БД не принимает подключения" -#: postmaster/postmaster.c:2349 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "Режим горячего резерва отключён." -#: postmaster/postmaster.c:2354 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "система баз данных останавливается" -#: postmaster/postmaster.c:2359 +#: postmaster/postmaster.c:2415 #, c-format msgid "the database system is in recovery mode" msgstr "система баз данных в режиме восстановления" -#: postmaster/postmaster.c:2364 storage/ipc/procarray.c:499 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "извините, уже слишком много клиентов" -#: postmaster/postmaster.c:2454 +#: postmaster/postmaster.c:2507 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильный ключ в запросе на отмену процесса %d" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2519 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "процесс с кодом %d, полученным в запросе на отмену, не найден" -#: postmaster/postmaster.c:2720 +#: postmaster/postmaster.c:2773 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "получен SIGHUP, файлы конфигурации перезагружаются" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2746 postmaster/postmaster.c:2750 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s не был перезагружен" -#: postmaster/postmaster.c:2760 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "конфигурация SSL не была перезагружена" -#: postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "получен запрос на \"вежливое\" выключение" -#: postmaster/postmaster.c:2862 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "получен запрос на быстрое выключение" -#: postmaster/postmaster.c:2880 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "прерывание всех активных транзакций" -#: postmaster/postmaster.c:2904 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "получен запрос на немедленное выключение" -#: postmaster/postmaster.c:2981 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "выключение при достижении цели восстановления" -#: postmaster/postmaster.c:2999 postmaster/postmaster.c:3035 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "стартовый процесс" -#: postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:3048 #, c-format msgid "aborting startup due to startup process failure" msgstr "прерывание запуска из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:3077 +#: postmaster/postmaster.c:3121 #, c-format msgid "database system is ready to accept connections" msgstr "система БД готова принимать подключения" -#: postmaster/postmaster.c:3098 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "процесс фоновой записи" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "процесс контрольных точек" -#: postmaster/postmaster.c:3168 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "процесс записи WAL" -#: postmaster/postmaster.c:3183 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "процесс считывания WAL" -#: postmaster/postmaster.c:3198 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "процесс запуска автоочистки" -#: postmaster/postmaster.c:3216 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "процесс архивации" -#: postmaster/postmaster.c:3231 -msgid "statistics collector process" -msgstr "процесс сбора статистики" - -#: postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "процесс системного протоколирования" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "фоновый процесс \"%s\"" -#: postmaster/postmaster.c:3393 postmaster/postmaster.c:3413 -#: postmaster/postmaster.c:3420 postmaster/postmaster.c:3438 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 +#: postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "процесс сервера" -#: postmaster/postmaster.c:3492 +#: postmaster/postmaster.c:3508 #, c-format msgid "terminating any other active server processes" msgstr "завершение всех остальных активных серверных процессов" @@ -20394,6 +21232,14 @@ msgstr "Завершившийся процесс выполнял действ msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) был прерван исключением 0x%X" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, c-format +msgid "" +"See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "" +"Описание этого шестнадцатеричного значения ищите во включаемом C-файле " +"\"ntstatus.h\"" + #. translator: %s is a noun phrase describing a child process, such as #. "server process" #: postmaster/postmaster.c:3766 @@ -20408,453 +21254,333 @@ msgstr "%s (PID %d) был завершён по сигналу %d: %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершился с неизвестным кодом состояния %d" -#: postmaster/postmaster.c:3992 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "аварийное выключение системы БД" -#: postmaster/postmaster.c:4030 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" msgstr "сервер останавливается из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:4036 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "сервер останавливается, так как параметр restart_after_crash равен off" -#: postmaster/postmaster.c:4048 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "все серверные процессы завершены... переинициализация" -#: postmaster/postmaster.c:4222 postmaster/postmaster.c:5573 -#: postmaster/postmaster.c:5964 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 +#: postmaster/postmaster.c:5920 #, c-format msgid "could not generate random cancel key" msgstr "не удалось сгенерировать случайный ключ отмены" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4256 #, c-format msgid "could not fork new process for connection: %m" msgstr "породить новый процесс для соединения не удалось: %m" -#: postmaster/postmaster.c:4318 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "породить новый процесс для соединения не удалось: " -#: postmaster/postmaster.c:4424 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "принято подключение: узел=%s порт=%s" -#: postmaster/postmaster.c:4429 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "принято подключение: узел=%s" -#: postmaster/postmaster.c:4672 +#: postmaster/postmaster.c:4646 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "запустить серверный процесс \"%s\" не удалось: %m" -#: postmaster/postmaster.c:4730 +#: postmaster/postmaster.c:4704 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "" "создать отображение файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4739 +#: postmaster/postmaster.c:4713 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "" "отобразить файл серверных параметров в память не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4766 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "слишком длинная командная строка подпроцесса" -#: postmaster/postmaster.c:4784 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "ошибка в CreateProcess(): %m (код ошибки: %lu)" -#: postmaster/postmaster.c:4811 +#: postmaster/postmaster.c:4785 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "" "отключить отображение файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4815 +#: postmaster/postmaster.c:4789 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "" "закрыть указатель файла серверных параметров не удалось (код ошибки: %lu)" -#: postmaster/postmaster.c:4837 +#: postmaster/postmaster.c:4811 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "" "число повторных попыток резервирования разделяемой памяти достигло предела" -#: postmaster/postmaster.c:4838 +#: postmaster/postmaster.c:4812 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Это может быть вызвано антивирусным ПО или механизмом ASLR." -#: postmaster/postmaster.c:5020 +#: postmaster/postmaster.c:4985 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "не удалось загрузить конфигурацию SSL в дочерний процесс" -#: postmaster/postmaster.c:5146 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "Пожалуйста, напишите об этой ошибке по адресу <%s>." -#: postmaster/postmaster.c:5233 +#: postmaster/postmaster.c:5182 #, c-format msgid "database system is ready to accept read-only connections" msgstr "система БД готова принимать подключения в режиме \"только чтение\"" -#: postmaster/postmaster.c:5497 +#: postmaster/postmaster.c:5446 #, c-format msgid "could not fork startup process: %m" msgstr "породить стартовый процесс не удалось: %m" -#: postmaster/postmaster.c:5501 +#: postmaster/postmaster.c:5450 #, c-format msgid "could not fork archiver process: %m" msgstr "породить процесс архиватора не удалось: %m" -#: postmaster/postmaster.c:5505 +#: postmaster/postmaster.c:5454 #, c-format msgid "could not fork background writer process: %m" msgstr "породить процесс фоновой записи не удалось: %m" -#: postmaster/postmaster.c:5509 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "породить процесс контрольных точек не удалось: %m" -#: postmaster/postmaster.c:5513 +#: postmaster/postmaster.c:5462 #, c-format msgid "could not fork WAL writer process: %m" msgstr "породить процесс записи WAL не удалось: %m" -#: postmaster/postmaster.c:5517 +#: postmaster/postmaster.c:5466 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "породить процесс считывания WAL не удалось: %m" -#: postmaster/postmaster.c:5521 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "породить процесс не удалось: %m" -#: postmaster/postmaster.c:5722 postmaster/postmaster.c:5745 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, c-format msgid "database connection requirement not indicated during registration" msgstr "" "при регистрации фонового процесса не указывалось, что ему требуется " "подключение к БД" -#: postmaster/postmaster.c:5729 postmaster/postmaster.c:5752 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, c-format msgid "invalid processing mode in background worker" msgstr "неправильный режим обработки в фоновом процессе" -#: postmaster/postmaster.c:5837 +#: postmaster/postmaster.c:5794 #, c-format msgid "could not fork worker process: %m" msgstr "породить рабочий процесс не удалось: %m" -#: postmaster/postmaster.c:5950 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "для нового рабочего процесса не нашлось свободного слота" -#: postmaster/postmaster.c:6284 +#: postmaster/postmaster.c:6237 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "" "продублировать сокет %d для серверного процесса не удалось (код ошибки: %d)" -#: postmaster/postmaster.c:6316 +#: postmaster/postmaster.c:6269 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "создать наследуемый сокет не удалось (код ошибки: %d)\n" -#: postmaster/postmaster.c:6345 +#: postmaster/postmaster.c:6298 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "открыть файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6352 +#: postmaster/postmaster.c:6305 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "прочитать файл серверных переменных \"%s\" не удалось: %s\n" -#: postmaster/postmaster.c:6361 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "не удалось стереть файл \"%s\": %s\n" -#: postmaster/postmaster.c:6378 +#: postmaster/postmaster.c:6331 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "отобразить файл серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6387 +#: postmaster/postmaster.c:6340 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "" "отключить отображение файла серверных переменных не удалось (код ошибки: " "%lu)\n" -#: postmaster/postmaster.c:6394 +#: postmaster/postmaster.c:6347 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "" "закрыть указатель файла серверных переменных не удалось (код ошибки: %lu)\n" -#: postmaster/postmaster.c:6556 +#: postmaster/postmaster.c:6506 #, c-format msgid "could not read exit code for process\n" msgstr "прочитать код завершения процесса не удалось\n" -#: postmaster/postmaster.c:6598 +#: postmaster/postmaster.c:6548 #, c-format msgid "could not post child completion status\n" msgstr "отправить состояние завершения потомка не удалось\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/shell_archive.c:123 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "команда архивации завершилась ошибкой с кодом %d" + +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Команда архивации с ошибкой: %s" + +#: postmaster/shell_archive.c:132 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "команда архивации была прервана исключением 0x%X" + +#: postmaster/shell_archive.c:139 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "команда архивации завершена по сигналу %d: %s" + +#: postmaster/shell_archive.c:148 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "команда архивации завершилась с неизвестным кодом состояния %d" + +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format 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 "не удалось породить процесс системного протоколирования: %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 "не удалось перенаправить 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 "не удалось перенаправить stderr: %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 "" "недетерминированные правила сортировки не поддерживаются для регулярных " "выражений" -#: replication/backup_manifest.c:251 -#, c-format -msgid "expected end timeline %u but found timeline %u" -msgstr "ожидался конец линии времени %u, но обнаружена линия времени %u" - -#: replication/backup_manifest.c:275 -#, c-format -msgid "expected start timeline %u but found timeline %u" -msgstr "ожидалось начало линии времени %u, но обнаружена линия времени %u" - -#: 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:353 -#, c-format -msgid "could not rewind temporary file" -msgstr "не удалось переместиться во временном файле" - -#: replication/backup_manifest.c:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "не удалось прочитать временный файл (прочитано байт: %zu из %zu)" - -#: replication/basebackup.c:546 -#, c-format -msgid "could not find any WAL files" -msgstr "не удалось найти ни одного файла WAL" - -#: 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:629 replication/basebackup.c:659 -#, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "неприемлемый размер файла WAL \"%s\"" - -#: replication/basebackup.c:644 replication/basebackup.c:1777 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "" -"в процессе базового резервного копирования не удалось передать данные, " -"копирование прерывается" - -#: replication/basebackup.c:722 -#, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] "всего ошибок контрольных сумм: %lld" -msgstr[1] "всего ошибок контрольных сумм: %lld" -msgstr[2] "всего ошибок контрольных сумм: %lld" - -#: replication/basebackup.c:729 -#, c-format -msgid "checksum verification failure during base backup" -msgstr "при базовом резервном копировании выявлены ошибки контрольных сумм" - -#: 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:842 -#, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" - -#: replication/basebackup.c:887 -#, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "нераспознанный параметр в манифесте: \"%s\"" - -#: replication/basebackup.c:903 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\"" - -#: replication/basebackup.c:918 -#, c-format -msgid "manifest checksums require a backup manifest" -msgstr "контрольные суммы не могут рассчитываться без манифеста копии" - -#: replication/basebackup.c:1525 -#, c-format -msgid "skipping special file \"%s\"" -msgstr "специальный файл \"%s\" пропускается" - -#: replication/basebackup.c:1646 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "неверный номер сегмента %d в файле \"%s\"" - -#: replication/basebackup.c:1684 -#, c-format -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:1757 -#, c-format -msgid "" -"checksum verification failed in file \"%s\", block %u: calculated %X but " -"expected %X" -msgstr "" -"ошибка контрольной суммы в файле \"%s\", блоке %u: вычислено значение %X, но " -"ожидалось %X" - -#: replication/basebackup.c:1764 -#, c-format -msgid "" -"further checksum verification failures in file \"%s\" will not be reported" -msgstr "" -"о дальнейших ошибках контрольных сумм в файле \"%s\" сообщаться не будет" - -#: replication/basebackup.c:1822 -#, 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" -msgstr[2] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" - -#: replication/basebackup.c:1858 -#, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "слишком длинное имя файла для формата tar: \"%s\"" - -#: replication/basebackup.c:1863 -#, c-format -msgid "" -"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "" -"цель символической ссылки слишком длинная для формата tar: имя файла \"%s\", " -"цель \"%s\"" - -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "не удалось очистить путь поиска: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "ошибочный синтаксис строки подключения: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "не удалось разобрать строку подключения: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, c-format msgid "" "could not receive database system identifier and timeline ID from the " @@ -20863,13 +21589,13 @@ msgstr "" "не удалось получить идентификатор СУБД и код линии времени с главного " "сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:371 -#: replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:388 +#: replication/libpqwalreceiver/libpqwalreceiver.c:626 #, c-format msgid "invalid response from primary server" msgstr "неверный ответ главного сервера" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:389 #, c-format msgid "" "Could not identify system: got %d rows and %d fields, expected %d rows and " @@ -20878,102 +21604,102 @@ msgstr "" "Не удалось идентифицировать систему, получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))." -#: replication/libpqwalreceiver/libpqwalreceiver.c:448 -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:469 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:506 #, c-format msgid "could not start WAL streaming: %s" msgstr "не удалось начать трансляцию WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:530 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не удалось отправить главному серверу сообщение о конце передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неожиданный набор данных после конца передачи" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:568 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ошибка при остановке потоковой операции COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:578 #, c-format msgid "error reading result of streaming command: %s" msgstr "ошибка при чтении результата команды передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 -#: replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:825 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неожиданный результат после CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:614 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не удалось получить файл истории линии времени с главного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:627 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Ожидался 1 кортеж с 2 полями, однако получено кортежей: %d, полей: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:767 -#: replication/libpqwalreceiver/libpqwalreceiver.c:820 -#: replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:841 +#: replication/libpqwalreceiver/libpqwalreceiver.c:848 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалось получить данные из потока WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:868 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не удалось отправить данные в поток WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:960 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не удалось создать слот репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1006 #, c-format msgid "invalid query response" msgstr "неверный ответ на запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1007 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Ожидалось полей: %d, получено: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1077 #, c-format msgid "the query interface requires a database connection" msgstr "для интерфейса запросов требуется подключение к БД" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1108 msgid "empty query" msgstr "пустой запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1114 msgid "unexpected pipeline mode" msgstr "неожиданный режим канала" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "нельзя запустить процессы-обработчики логической репликации при " "max_replication_slots = 0" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "недостаточно слотов для процессов логической репликации" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Возможно, следует увеличить параметр max_logical_replication_workers." @@ -21018,18 +21744,18 @@ msgstr "для логического декодирования требует msgid "logical decoding cannot be used while in recovery" msgstr "логическое декодирование нельзя использовать в процессе восстановления" -#: 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 "" "физический слот репликации нельзя использовать для логического декодирования" -#: 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 "слот репликации \"%s\" создан не в этой базе данных" -#: replication/logical/logical.c:359 +#: replication/logical/logical.c:360 #, c-format msgid "" "cannot create logical replication slot in transaction that has performed " @@ -21037,93 +21763,86 @@ msgid "" msgstr "" "нельзя создать слот логической репликации в транзакции, осуществляющей запись" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "начинается логическое декодирование для слота \"%s\"" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Передача транзакций, фиксируемых после %X/%X, чтение WAL с %X/%X." -#: replication/logical/logical.c:696 +#: replication/logical/logical.c:720 #, 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:702 +#: replication/logical/logical.c:726 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "слот \"%s\", модуль вывода \"%s\", в обработчике %s" -#: replication/logical/logical.c:873 replication/logical/logical.c:918 -#: replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "для логической репликации во время подготовки требуется обработчик %s" -#: replication/logical/logical.c:1241 replication/logical/logical.c:1290 -#: replication/logical/logical.c:1331 replication/logical/logical.c:1417 -#: replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "для логической потоковой репликации требуется обработчик %s" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, 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" -msgstr "" -"для использования слотов репликации требуется роль репликации или права " -"суперпользователя" - -#: 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 "массив должен быть одномерным" -#: 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:1128 +#: utils/adt/jsonb.c:1302 #, 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:650 +#: 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 "Для этого слота ранее не резервировался WAL либо слот был аннулирован." -#: replication/logical/logicalfuncs.c:265 +#: replication/logical/logicalfuncs.c:241 #, c-format msgid "" "logical decoding output plugin \"%s\" produces binary output, but function " @@ -21132,7 +21851,7 @@ 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" @@ -21140,7 +21859,7 @@ 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 "модифицировать источники репликации во время восстановления нельзя" @@ -21152,20 +21871,20 @@ msgstr "источник репликации \"%s\" не существует" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "найти свободный OID для источника репликации не удалось" +msgid "could not find free replication origin ID" +msgstr "найти свободный ID для источника репликации не удалось" #: replication/logical/origin.c:355 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" +msgid "could not drop replication origin with ID %d, in use by PID %d" msgstr "" -"удалить источник репликации с OID %d нельзя, он используется процессом с PID " +"удалить источник репликации с ID %d нельзя, он используется процессом с PID " "%d" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "источник репликации с OID %u не существует" +msgid "replication origin with ID %d does not exist" +msgstr "источник репликации с ID %d не существует" #: replication/logical/origin.c:741 #, c-format @@ -21182,8 +21901,8 @@ msgstr "" #: replication/logical/origin.c:790 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "состояние репликации узла %u восстановлено до %X/%X" +msgid "recovered replication state of node %d to %X/%X" +msgstr "состояние репликации узла %d восстановлено до %X/%X" #: replication/logical/origin.c:800 #, c-format @@ -21192,42 +21911,42 @@ msgstr "" "неверная контрольная сумма файла контрольной точки для слота репликации (%u " "вместо %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 "источник репликации с OID %d уже занят процессом с PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "источник репликации с ID %d уже занят процессом с 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" +"could not find free replication state slot for replication origin with ID %d" msgstr "" "не удалось найти свободный слот состояния репликации для источника " -"репликации с OID %u" +"репликации с ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Увеличьте параметр max_replication_slots и повторите попытку." -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "нельзя настроить источник репликации, когда он уже настроен" -#: 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 "ни один источник репликации не настроен" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "имя источника репликации \"%s\" зарезервировано" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Имена источников, начинающиеся с \"pg_\", зарезервированы." @@ -21274,19 +21993,19 @@ msgstr "" msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логической репликации \"%s.%s\" не существует" -#: replication/logical/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:4180 -#: replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать из файла подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:4184 -#: replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -21294,25 +22013,25 @@ msgstr "" "не удалось прочитать из файла подкачки буфера пересортировки (прочитано " "байт: %d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "" "не удалось прочитать из файла \"%s\" (прочитано байт: %d, требовалось: %d)" -#: replication/logical/snapbuild.c:637 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "изначальный снимок слота слишком большой" # skip-rule: capital-letter-first -#: replication/logical/snapbuild.c:691 +#: replication/logical/snapbuild.c:700 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "" @@ -21324,68 +22043,68 @@ msgstr[1] "" msgstr[2] "" "экспортирован снимок логического декодирования: \"%s\" (ид. транзакций: %u)" -#: replication/logical/snapbuild.c:1370 replication/logical/snapbuild.c:1477 -#: replication/logical/snapbuild.c:2008 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 +#: replication/logical/snapbuild.c:2015 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "процесс логического декодирования достиг точки согласованности в %X/%X" -#: replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "Больше активных транзакций нет." -#: replication/logical/snapbuild.c:1428 +#: replication/logical/snapbuild.c:1437 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "" "процесс логического декодирования нашёл начальную стартовую точку в %X/%X" -#: replication/logical/snapbuild.c:1430 replication/logical/snapbuild.c:1454 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Ожидание транзакций (примерно %d), старее %u до конца." -#: replication/logical/snapbuild.c:1452 +#: replication/logical/snapbuild.c:1461 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "" "при логическом декодировании найдена начальная точка согласованности в %X/%X" -#: replication/logical/snapbuild.c:1479 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "Больше старых транзакций нет." -#: replication/logical/snapbuild.c:1876 +#: replication/logical/snapbuild.c:1883 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/logical/snapbuild.c:1882 +#: replication/logical/snapbuild.c:1889 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную версию (%u вместо %u)" -#: replication/logical/snapbuild.c:1953 +#: replication/logical/snapbuild.c:1960 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "в файле состояния snapbuild \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/logical/snapbuild.c:2010 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логическое декодирование начнётся с сохранённого снимка." -#: replication/logical/snapbuild.c:2082 +#: replication/logical/snapbuild.c:2089 #, c-format msgid "could not parse file name \"%s\"" msgstr "не удалось разобрать имя файла \"%s\"" -#: replication/logical/tablesync.c:144 +#: replication/logical/tablesync.c:151 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -21394,58 +22113,83 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" закончил обработку" -#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 +#: replication/logical/tablesync.c:422 #, c-format -msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "" +"logical replication apply worker for subscription \"%s\" will restart so " +"that two_phase can be enabled" +msgstr "" +"применяющий процесс логической репликации для подписки \"%s\" будет " +"перезапущен, чтобы можно было включить режим two_phase" + +#: replication/logical/tablesync.c:741 replication/logical/tablesync.c:882 +#, c-format +msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о таблице \"%s.%s\" с сервера публикации: %s" -#: replication/logical/tablesync.c:734 +#: replication/logical/tablesync.c:748 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблица \"%s.%s\" не найдена на сервере публикации" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:805 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "" +"не удалось получить информацию о списке столбцов таблицы \"%s.%s\" с сервера " +"публикации: %s" + +#: replication/logical/tablesync.c:984 +#, c-format +msgid "" +"could not fetch table WHERE clause info for table \"%s.%s\" from publisher: " +"%s" +msgstr "" +"не удалось получить информацию о предложении WHERE таблицы \"%s.%s\" с " +"сервера публикации: %s" + +#: replication/logical/tablesync.c:1129 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1059 +#: replication/logical/tablesync.c:1341 replication/logical/worker.c:1635 +#, c-format +msgid "" +"user \"%s\" cannot replicate into relation with row-level security enabled: " +"\"%s\"" +msgstr "" +"пользователь \"%s\" не может реплицировать данные в отношение с включённой " +"защитой на уровне строк: \"%s\"" + +#: replication/logical/tablesync.c:1356 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось начать транзакцию на сервере публикации: " "%s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1398 #, c-format msgid "replication origin \"%s\" already exists" msgstr "источник репликации \"%s\" уже существует" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1411 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось завершить транзакцию на сервере " "публикации: %s" -#: replication/logical/worker.c:518 -#, c-format -msgid "" -"processing remote data for replication target relation \"%s.%s\" column " -"\"%s\"" -msgstr "" -"обработка внешних данных для целевого отношения репликации \"%s.%s\" столбца " -"\"%s\"" - -#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#: 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:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format msgid "" "could not read from streaming transaction's changes file \"%s\": read only " @@ -21454,7 +22198,7 @@ msgstr "" "не удалось прочитать файл изменений потоковых транзакций \"%s\" (прочитано " "байт: %zu из %zu)" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -21463,7 +22207,7 @@ msgstr "" "сервер публикации не передал столбец идентификации реплики, ожидаемый для " "целевого отношения логической репликации \"%s.%s\"" -#: replication/logical/worker.c:1353 +#: replication/logical/worker.c:1768 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -21474,17 +22218,22 @@ msgstr "" "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характеристики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2251 +#: replication/logical/worker.c:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "неверный тип сообщения логической репликации \"??? (%d)\"" + +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных с сервера публикации закончился" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логической репликации из-за тайм-аута" -#: replication/logical/worker.c:2550 +#: replication/logical/worker.c:3059 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will stop because " @@ -21493,7 +22242,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "остановлен, так как подписка была удалена" -#: replication/logical/worker.c:2564 +#: replication/logical/worker.c:3070 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will stop because " @@ -21502,7 +22251,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "остановлен, так как подписка была отключена" -#: replication/logical/worker.c:2586 +#: replication/logical/worker.c:3096 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will restart " @@ -21511,7 +22260,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "перезапущен вследствие изменения параметров" -#: replication/logical/worker.c:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "" "could not read from streaming transaction's subxact file \"%s\": read only " @@ -21520,7 +22269,7 @@ msgstr "" "не удалось прочитать файл потоковых подтранзакций \"%s\" (прочитано байт: " "%zu из %zu)" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, c-format msgid "" "logical replication apply worker for subscription %u will not start because " @@ -21529,7 +22278,7 @@ msgstr "" "применяющий процесс логической репликации для подписки %u не будет запущен, " "так как подписка была удалена при старте" -#: replication/logical/worker.c:3148 +#: replication/logical/worker.c:3657 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will not start " @@ -21538,7 +22287,7 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" не будет " "запущен, так как подписка была отключена при старте" -#: replication/logical/worker.c:3166 +#: replication/logical/worker.c:3675 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -21547,50 +22296,130 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:3170 +#: replication/logical/worker.c:3679 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запускается применяющий процесс логической репликации для подписки \"%s\"" -#: replication/logical/worker.c:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "подписка \"%s\" была отключена из-за ошибки" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "" +"обработчик логической репликации начинает пропускать транзакцию с LSN %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "" +"обработчик логической репликации завершил пропуск транзакции с LSN %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "значение skip-LSN для подписки \"%s\" очищено" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "" +"Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " +"%X/%X." +msgstr "" +"Позиция завершения удалённой транзакции в WAL (LSN) %X/%X не совпала со " +"значением skip-LSN %X/%X." + +#: replication/logical/worker.c:4018 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\"" +msgstr "" +"обработка внешних данных для источника репликации \"%s\" в контексте " +"сообщения типа \"%s\"" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" in transaction %u" +msgstr "" +"обработка внешних данных из источника репликации \"%s\" в контексте " +"сообщения типа \"%s\" в транзакции %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" in transaction %u, finished at %X/%X" +msgstr "" +"обработка внешних данных для источника репликации \"%s\" в контексте " +"сообщения типа \"%s\" в транзакции %u, конечная позиция %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" in transaction %u, finished " +"at %X/%X" +msgstr "" +"обработка внешних данных для источника репликации \"%s\" в контексте " +"сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " +"транзакции %u, конечная позиция %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" column \"%s\" in " +"transaction %u, finished at %X/%X" +msgstr "" +"обработка внешних данных для источника репликации \"%s\" в контексте " +"сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " +"\"%s\", в транзакции %u, конечная позиция %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "неверное значение proto_version" -#: replication/pgoutput/pgoutput.c:201 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значение proto_verson \"%s\" вне диапазона" -#: replication/pgoutput/pgoutput.c:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "неверный синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, 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:295 +#: replication/pgoutput/pgoutput.c:432 #, 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:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "отсутствует параметр publication_names" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "" "requested proto_version=%d does not support streaming, need %d or higher" @@ -21598,27 +22427,41 @@ msgstr "" "запрошенная версия proto_version=%d не поддерживает потоковую передачу, " "требуется версия %d или выше" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запрошена потоковая передача, но она не поддерживается модулем вывода" -#: replication/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "" +"requested proto_version=%d does not support two-phase commit, need %d or " +"higher" +msgstr "" +"запрошенная версия proto_version=%d не поддерживает двухфазную фиксацию, " +"требуется версия %d или выше" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "запрошена двухфазная фиксация, но она не поддерживается модулем вывода" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "имя слота репликации \"%s\" слишком короткое" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "имя слота репликации \"%s\" слишком длинное" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "имя слота репликации \"%s\" содержит недопустимый символ" -#: replication/slot.c:204 +#: replication/slot.c:229 #, c-format msgid "" "Replication slot names may only contain lower case letters, numbers, and the " @@ -21627,54 +22470,61 @@ msgstr "" "Имя слота репликации может содержать только буквы в нижнем регистре, цифры и " "знак подчёркивания." -#: replication/slot.c:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "слот репликации \"%s\" уже существует" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "используются все слоты репликации" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Освободите ненужные или увеличьте параметр max_replication_slots." -#: replication/slot.c:402 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот репликации \"%s\" занят процессом с PID %d" -#: replication/slot.c:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "" "слоты репликации можно использовать, только если max_replication_slots > 0" -#: replication/slot.c:1065 +#: replication/slot.c:1133 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "слоты репликации можно использовать, только если wal_level >= replica" -#: replication/slot.c:1250 +#: replication/slot.c:1145 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "" +"для использования слотов репликации требуется роль репликации или права " +"суперпользователя" + +#: replication/slot.c:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "завершение процесса %d для освобождения слота репликации \"%s\"" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, c-format msgid "" "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " @@ -21683,70 +22533,70 @@ msgstr "" "слот \"%s\" аннулируется, так как его позиция restart_lsn %X/%X превышает " "max_slot_wal_keep_size" -#: replication/slot.c:1740 +#: replication/slot.c:1820 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл слота репликации \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/slot.c:1747 +#: replication/slot.c:1827 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл состояния snapbuild \"%s\" имеет неподдерживаемую версию %u" -#: replication/slot.c:1754 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла слота репликации \"%s\" неверная длина: %u" -#: replication/slot.c:1790 +#: replication/slot.c:1870 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле слота репликации \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/slot.c:1824 +#: replication/slot.c:1904 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "существует слот логической репликации \"%s\", но wal_level < logical" -#: replication/slot.c:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Смените wal_level на logical или более высокий уровень." -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "существует слот физической репликации \"%s\", но wal_level < replica" -#: replication/slot.c:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Смените wal_level на replica или более высокий уровень." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно слишком много слотов репликации" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "неверный целевой LSN" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "слот репликации \"%s\" нельзя продвинуть вперёд" -#: replication/slotfuncs.c:666 +#: 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:773 +#: replication/slotfuncs.c:739 #, c-format msgid "" "cannot copy physical replication slot \"%s\" as a logical replication slot" @@ -21754,7 +22604,7 @@ msgstr "" "слот физической репликации \"%s\" нельзя скопировать как слот логической " "репликации" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "" "cannot copy logical replication slot \"%s\" as a physical replication slot" @@ -21762,17 +22612,17 @@ msgstr "" "слот логической репликации \"%s\" нельзя скопировать как слот физической " "репликации" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "скопировать слот репликации, для которого не резервируется WAL, нельзя" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не удалось скопировать слот репликации \"%s\"" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "" "The source replication slot was modified incompatibly during the copy " @@ -21781,14 +22631,14 @@ msgstr "" "Исходный слот репликации был модифицирован несовместимым образом во время " "копирования." -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "" "скопировать слот логической репликации \"%s\" в незавершённом состоянии " "нельзя" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "" @@ -21840,120 +22690,120 @@ msgstr "ошибка при разборе synchronous_standby_names" msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "число синхронных резервных серверов (%d) должно быть больше нуля" -#: replication/walreceiver.c:161 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершение процесса считывания журнала по команде администратора" -#: replication/walreceiver.c:289 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "не удалось подключиться к главному серверу: %s" -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "идентификаторы СУБД на главном и резервном серверах различаются" -#: replication/walreceiver.c:337 +#: 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:348 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "последняя линия времени %u на главном сервере отстаёт от восстанавливаемой " "линии времени %u" -#: replication/walreceiver.c:402 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "" "начало передачи журнала с главного сервера, с позиции %X/%X на линии времени " "%u" -#: replication/walreceiver.c:406 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуск передачи журнала с позиции %X/%X на линии времени %u" -#: replication/walreceiver.c:435 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продолжить передачу WAL нельзя, восстановление уже окончено" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "репликация прекращена главным сервером" -#: replication/walreceiver.c:473 +#: replication/walreceiver.c:476 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "На линии времени %u в %X/%X достигнут конец журнала." -#: replication/walreceiver.c:562 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершение приёма журнала из-за тайм-аута" -#: replication/walreceiver.c:600 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "" "на главном сервере больше нет журналов для запрошенной линии времени %u" -#: replication/walreceiver.c:616 replication/walreceiver.c:1036 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "не удалось закрыть сегмент журнала %s: %m" -#: replication/walreceiver.c:735 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "загрузка файла истории для линии времени %u с главного сервера" -#: replication/walreceiver.c:927 +#: 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "использовать %s со слотом логической репликации нельзя" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не удалось перейти к концу файла \"%s\": %m" -#: replication/walsender.c:529 +#: replication/walsender.c:642 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не удалось перейти к началу файла \"%s\": %m" -#: replication/walsender.c:580 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "Команда IDENTIFY_SYSTEM не выполнялась до START_REPLICATION" - -#: replication/walsender.c:609 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "" "слот логической репликации нельзя использовать для физической репликации" -#: replication/walsender.c:678 +#: replication/walsender.c:785 #, 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:681 +#: replication/walsender.c:788 #, 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:832 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " @@ -21962,42 +22812,48 @@ msgstr "" "запрошенная начальная точка %X/%X впереди позиции сброшенных данных журнала " "на этом сервере (%X/%X)" +#: replication/walsender.c:1015 +#, 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:975 +#: replication/walsender.c:1100 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s требуется выполнять не в транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:985 +#: replication/walsender.c:1110 #, c-format msgid "%s must be called inside a transaction" msgstr "%s требуется выполнять внутри транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:991 +#: replication/walsender.c:1116 #, 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:997 +#: replication/walsender.c:1122 #, c-format msgid "%s must be called before any query" msgstr "%s требуется выполнять до каких-либо запросов" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуется вызывать не в подтранзакции" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "прочитать из слота логической репликации \"%s\" нельзя" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, c-format msgid "" "This slot has been invalidated because it exceeded the maximum reserved size." @@ -22005,33 +22861,33 @@ msgstr "" "Этот слот был аннулирован из-за превышения максимального зарезервированного " "размера." -#: replication/walsender.c:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процесса передачи журнала после повышения" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "нельзя выполнять новые команды, пока процесс передачи WAL находится в режиме " "остановки" -#: replication/walsender.c:1587 +#: replication/walsender.c:1739 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "" "нельзя выполнять команды SQL в процессе, передающем WAL для физической " "репликации" -#: replication/walsender.c:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 -#: tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 -#: tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -22039,145 +22895,150 @@ msgid "" msgstr "" "текущая транзакция прервана, команды до конца блока транзакции игнорируются" -#: replication/walsender.c:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв соединения с резервным сервером" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип сообщения резервного сервера: \"%c\"" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процесса передачи журнала из-за тайм-аута репликации" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" для отношения \"%s\" уже существует" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, 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 "правила INSTEAD NOTHING для SELECT не реализованы" -#: 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:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "преобразовать секционированную таблицу \"%s\" в представление нельзя" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "преобразовать секцию \"%s\" в представление нельзя" -#: 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 "" "не удалось преобразовать таблицу \"%s\" в представление, так как она не " "пуста1" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она " "содержит триггеры" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "" "In particular, the table cannot be involved in any foreign key relationships." msgstr "" "Кроме того, таблица не может быть задействована в ссылках по внешнему ключу." -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "индексы" -#: 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 "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "подчинённые таблицы" -#: 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 "" "не удалось преобразовать таблицу \"%s\" в представление, так как она имеет " "родительские таблицы" -#: 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" @@ -22185,7 +23046,7 @@ msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как для неё " "включена защита на уровне строк" -#: 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" @@ -22193,51 +23054,51 @@ msgstr "" "не удалось преобразовать таблицу \"%s\" в представление, так как к ней " "применены политики защиты строк" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "в правиле нельзя указать несколько списков RETURNING" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "списки RETURNING в условных правилах не поддерживаются" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "списки RETURNING поддерживаются только в правилах INSTEAD" -#: rewrite/rewriteDefine.c:543 +#: rewrite/rewriteDefine.c:544 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "" "не относящееся к представлению правило для \"%s\" не может называться \"%s\"" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "список результата правила для SELECT содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "список RETURNING содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "" "преобразовать отношение, содержащее удалённые столбцы, в представление нельзя" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "создать список RETURNING для отношения, содержащего удалённые столбцы, нельзя" -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" @@ -22245,62 +23106,62 @@ msgstr "" "элементу %d результата правила для SELECT присвоено имя, отличное от имени " "столбца \"%s\"" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Имя элемента результата SELECT: \"%s\"." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет тип, отличный от типа столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:754 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "элемент %d списка RETURNING имеет тип, отличный от типа столбца \"%s\"" -#: rewrite/rewriteDefine.c:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Элемент результата SELECT имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Элемент списка RETURNING имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:775 +#: rewrite/rewriteDefine.c:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет размер, отличный от столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:777 +#: rewrite/rewriteDefine.c:778 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "элемент %d списка RETURNING имеет размер, отличный от столбца \"%s\"" -#: rewrite/rewriteDefine.c:794 +#: rewrite/rewriteDefine.c:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "список результата правила для SELECT содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "список RETURNING содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" для отношения\"%s\" не существует" -#: rewrite/rewriteDefine.c:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "переименовывать правило ON SELECT нельзя" @@ -22354,82 +23215,82 @@ msgstr "столбцу \"%s\" можно присвоить только зна msgid "multiple assignments to same column \"%s\"" msgstr "многочисленные присвоения одному столбцу \"%s\"" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в правилах для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2224 +#: rewrite/rewriteHandler.c:2228 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в политике для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "Утилизируемые столбцы представлений не обновляются." -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" "Столбцы представлений, не являющиеся столбцами базовых отношений, не " "обновляются." -#: rewrite/rewriteHandler.c:2552 +#: rewrite/rewriteHandler.c:2556 msgid "View columns that refer to system columns are not updatable." msgstr "" "Столбцы представлений, ссылающиеся на системные столбцы, не обновляются." -#: rewrite/rewriteHandler.c:2555 +#: rewrite/rewriteHandler.c:2559 msgid "View columns that return whole-row references are not updatable." msgstr "" "Столбцы представлений, возвращающие ссылки на всю строку, не обновляются." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Представления с DISTINCT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Представления с GROUP BY не обновляются автоматически." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "Представления с HAVING не обновляются автоматически." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" "Представления с UNION, INTERSECT или EXCEPT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "Представления с WITH не обновляются автоматически." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Представления с LIMIT или OFFSET не обновляются автоматически." -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2647 msgid "Views that return aggregate functions are not automatically updatable." msgstr "" "Представления, возвращающие агрегатные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2646 +#: rewrite/rewriteHandler.c:2650 msgid "Views that return window functions are not automatically updatable." msgstr "" "Представления, возвращающие оконные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2649 +#: rewrite/rewriteHandler.c:2653 msgid "" "Views that return set-returning functions are not automatically updatable." msgstr "" "Представления, возвращающие функции с результатом-множеством, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:2656 rewrite/rewriteHandler.c:2660 -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2672 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." @@ -22437,27 +23298,27 @@ msgstr "" "Представления, выбирающие данные не из одной таблицы или представления, не " "обновляются автоматически." -#: rewrite/rewriteHandler.c:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Представления, содержащие TABLESAMPLE, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 msgid "Views that have no updatable columns are not automatically updatable." msgstr "" "Представления, не содержащие обновляемых столбцов, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:3172 +#: rewrite/rewriteHandler.c:3176 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставить данные в столбец \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3184 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "изменить данные в столбце \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3665 +#: rewrite/rewriteHandler.c:3675 #, c-format msgid "" "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " @@ -22466,7 +23327,7 @@ msgstr "" "правила DO INSTEAD NOTIFY не поддерживаются в операторах, изменяющих данные, " "в WITH" -#: rewrite/rewriteHandler.c:3676 +#: rewrite/rewriteHandler.c:3686 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " @@ -22475,7 +23336,7 @@ msgstr "" "правила DO INSTEAD NOTHING не поддерживаются в операторах, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3690 +#: rewrite/rewriteHandler.c:3700 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " @@ -22484,13 +23345,13 @@ msgstr "" "условные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3694 +#: rewrite/rewriteHandler.c:3704 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "" "правила DO ALSO не поддерживаются для операторов, изменяющих данные, в WITH" -#: rewrite/rewriteHandler.c:3699 +#: rewrite/rewriteHandler.c:3709 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " @@ -22499,8 +23360,8 @@ msgstr "" "составные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3929 rewrite/rewriteHandler.c:3937 -#: rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 +#: rewrite/rewriteHandler.c:3992 #, c-format msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." @@ -22508,43 +23369,43 @@ msgstr "" "Представления в сочетании с правилами DO INSTEAD с условиями не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:4050 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "выполнить INSERT RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "выполнить UPDATE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "выполнить DELETE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " @@ -22553,7 +23414,7 @@ msgstr "" "INSERT c предложением ON CONFLICT нельзя использовать с таблицей, для " "которой заданы правила INSERT или UPDATE" -#: rewrite/rewriteHandler.c:4141 +#: rewrite/rewriteHandler.c:4188 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " @@ -22616,36 +23477,36 @@ msgstr "нераспознанный параметр Snowball: \"%s\"" msgid "missing Language parameter" msgstr "отсутствует параметр Language" -#: statistics/extended_stats.c:178 +#: 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:1371 utils/adt/jsonfuncs.c:1952 +#: statistics/mcv.c:1372 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: storage/buffer/bufmgr.c:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "обращаться к временным таблицам других сеансов нельзя" -#: storage/buffer/bufmgr.c:843 +#: storage/buffer/bufmgr.c:851 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не удалось увеличить отношение \"%s\" до блока %u" -#: storage/buffer/bufmgr.c:930 +#: storage/buffer/bufmgr.c:938 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неожиданные данные после EOF в блоке %u отношения %s" -#: storage/buffer/bufmgr.c:932 +#: storage/buffer/bufmgr.c:940 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " @@ -22654,27 +23515,27 @@ msgstr "" "Эта ситуация может возникать из-за ошибок в ядре; возможно, вам следует " "обновить ОС." -#: storage/buffer/bufmgr.c:1031 +#: storage/buffer/bufmgr.c:1039 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "неверная страница в блоке %u отношения %s; страница обнуляется" -#: storage/buffer/bufmgr.c:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "не удалось запись блок %u файла %s" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Множественные сбои - возможно, постоянная ошибка записи." -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "запись блока %u отношения %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "снимок слишком стар" @@ -22689,13 +23550,13 @@ msgstr "нет пустого локального буфера" msgid "cannot access temporary tables during a parallel operation" msgstr "обращаться к временным таблицам во время параллельных операций нельзя" -#: storage/file/buffile.c:323 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "" "не удалось открыть временный файл \"%s\", входящий в BufFile \"%s\": %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" @@ -22703,140 +23564,183 @@ msgstr "" "не удалось определить размер временного файла \"%s\", входящего в BufFile " "\"%s\": %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "ошибка удаления разделяемого набора файлов \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "ошибка удаления набора файлов \"%s\": %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, 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 +#: 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:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "не удалось определить размер грязных данных: %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ошибка в munmap() при сбросе данных на диск: %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "для файла \"%s\" не удалось создать ссылку \"%s\": %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "ошибка в getrlimit(): %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостаточно дескрипторов файлов для запуска серверного процесса" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "Система выделяет: %d, а требуется минимум: %d." -#: storage/file/fd.c:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 -#: storage/file/fd.c:2677 +#: 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:1453 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "временный файл: путь \"%s\", размер %lu" -#: storage/file/fd.c:1584 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "не удалось создать временный каталог \"%s\": %m" -#: storage/file/fd.c:1591 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "не удалось создать временный подкаталог \"%s\": %m" -#: storage/file/fd.c:1784 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "не удалось создать временный файл \"%s\": %m" -#: storage/file/fd.c:1818 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: storage/file/fd.c:1859 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "ошибка удаления временного файла \"%s\": %m" -#: storage/file/fd.c:1947 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ошибка удаления файла \"%s\": %m" -#: storage/file/fd.c:2127 +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "размер временного файла превышает предел temp_file_limit (%d КБ)" -#: storage/file/fd.c:2392 storage/file/fd.c:2451 +#: 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) при попытке открыть файл \"%s\"" -#: storage/file/fd.c:2496 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке выполнить команду \"%s\"" -#: storage/file/fd.c:2653 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке открыть каталог \"%s\"" -#: storage/file/fd.c:3183 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "в каталоге временных файлов обнаружен неуместный файл: \"%s\"" -#: storage/file/fd.c:3312 +#: 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/sharedfileset.c:144 +#: storage/file/fd.c:3619 +#, c-format +msgid "" +"syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: " +"%s" +msgstr "" +"синхронизация каталога данных (подготовка к fsync), прошло времени: %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 "" +"сброс нежурналируемых отношений (инициализация), прошло времени: %ld.%02d s, " +"текущий путь: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "" +"resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current " +"path: %s" +msgstr "" +"сброс нежурналируемых отношений (очистка), прошло времени: %ld.%02d s, " +"текущий путь: %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 "слишком много сегментов динамической разделяемой памяти" @@ -22892,22 +23796,22 @@ msgstr "не удалось создать сегмент разделяемой msgid "could not close shared memory segment \"%s\": %m" msgstr "не удалось закрыть сегмент разделяемой памяти \"%s\": %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не удалось продублировать указатель для \"%s\": %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3845 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база \"%s\" используется подготовленными транзакциями" -#: storage/ipc/procarray.c:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3877 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "прерывать процесс суперпользователя может только суперпользователь" -#: storage/ipc/procarray.c:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3884 storage/ipc/signalfuncs.c:236 #, c-format msgid "" "must be a member of the role whose process is being terminated or member of " @@ -22916,22 +23820,29 @@ msgstr "" "необходимо быть членом роли, процесс которой прерывается, или роли " "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 "" +"продолжается ожидание получения сигнала ProcSignalBarrier обслуживающим " +"процессом с PID %lu" + +#: 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:694 +#: storage/ipc/shm_mq.c:719 #, 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:962 -#: storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 -#: storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 -#: storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 -#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 +#: storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -22969,23 +23880,23 @@ msgstr "" msgid "requested shared memory size overflows size_t" msgstr "запрошенный размер разделяемой памяти не умещается в size_t" -#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 +#: 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:99 storage/lmgr/proc.c:1468 -#: utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1442 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "отправить сигнал процессу %d не удалось: %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "для отмены запроса суперпользователя нужно быть суперпользователем" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:134 #, c-format msgid "" "must be a member of the role whose query is being canceled or member of " @@ -22994,13 +23905,13 @@ msgstr "" "необходимо быть членом роли, запрос которой отменяется, или роли " "pg_signal_backend" -#: storage/ipc/signalfuncs.c:165 +#: storage/ipc/signalfuncs.c:175 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "" "не удалось проверить существование обслуживающего процесса с PID %d: %m" -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:193 #, 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" @@ -23008,12 +23919,12 @@ msgstr[0] "обслуживающий процесс с PID %d не заверш msgstr[1] "обслуживающий процесс с PID %d не завершился за %lld мс" msgstr[2] "обслуживающий процесс с PID %d не завершился за %lld мс" -#: storage/ipc/signalfuncs.c:214 +#: storage/ipc/signalfuncs.c:224 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" не может быть отрицательным" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:276 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "" @@ -23021,33 +23932,33 @@ msgstr "" "суперпользователь" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:268 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:278 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Рассмотрите возможность использования функции %s, включённой в ядро." -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:284 storage/ipc/signalfuncs.c:304 #, c-format msgid "rotation not possible because log collection not active" msgstr "прокрутка невозможна, так как протоколирование отключено" -#: storage/ipc/standby.c:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "процесс восстановления продолжает ожидание после %ld.%03d мс: %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "процесс восстановления завершил ожидание после %ld.%03d мс: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "" "выполнение оператора отменено из-за конфликта с процессом восстановления" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "" @@ -23124,108 +24035,108 @@ msgstr "обнаружена взаимоблокировка" msgid "See server log for query details." msgstr "Подробности запроса смотрите в протоколе сервера." -#: storage/lmgr/lmgr.c:831 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при изменении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:834 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при удалении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:837 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокировке кортежа (%u,%u) в отношении \"%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 "при блокировке изменённой версии (%u,%u) кортежа в отношении \"%s\"" -#: storage/lmgr/lmgr.c:843 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при добавлении кортежа индекса (%u,%u) в отношении \"%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 "при проверке уникальности кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:849 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "при перепроверке изменённого кортежа (%u,%u) в отношении \"%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 "" "при проверке ограничения-исключения для кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "отношение %u базы данных %u" -#: storage/lmgr/lmgr.c:1113 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "расширение отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1119 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid базы %u" -#: storage/lmgr/lmgr.c:1124 +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "страница %u отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1131 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "транзакция %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "виртуальная транзакция %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "спекулятивный маркер %u транзакции %u" -#: storage/lmgr/lmgr.c:1156 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "объект %u класса %u базы данных %u" -#: storage/lmgr/lmgr.c:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "пользовательская блокировка [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендательная блокировка [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "нераспознанный тип блокировки %d" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, c-format msgid "" "cannot acquire lock mode %s on database objects while recovery is in progress" @@ -23233,7 +24144,7 @@ msgstr "" "пока выполняется восстановление, нельзя получить блокировку объектов базы " "данных в режиме %s" -#: storage/lmgr/lock.c:792 +#: storage/lmgr/lock.c:793 #, c-format msgid "" "Only RowExclusiveLock or less can be acquired on database objects during " @@ -23242,13 +24153,13 @@ msgstr "" "В процессе восстановления для объектов базы данных может быть получена " "только блокировка RowExclusiveLock или менее сильная." -#: storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 -#: storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Возможно, следует увеличить параметр max_locks_per_transaction." -#: storage/lmgr/lock.c:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, c-format msgid "" "cannot PREPARE while holding both session-level and transaction-level locks " @@ -23280,13 +24191,13 @@ msgstr "" "в пуле недостаточно элементов для записи о потенциальном конфликте чтения/" "записи" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "" "Параметр \"default_transaction_isolation\" имеет значение \"serializable\"." -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1696 #, c-format msgid "" "You can use \"SET default_transaction_isolation = 'repeatable read'\" to " @@ -23295,34 +24206,34 @@ msgstr "" "Чтобы изменить режим по умолчанию, выполните \"SET " "default_transaction_isolation = 'repeatable read'\"." -#: storage/lmgr/predicate.c:1746 +#: 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:1825 utils/time/snapmgr.c:569 +#: 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:1826 utils/time/snapmgr.c:576 +#: 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:2484 storage/lmgr/predicate.c:2499 -#: storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "" "Возможно, следует увеличить значение параметра max_locks_per_transaction." -#: storage/lmgr/predicate.c:4120 storage/lmgr/predicate.c:4156 -#: storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 -#: storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 -#: storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 -#: storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 +#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 +#: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 +#: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 +#: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 +#: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format msgid "" "could not serialize access due to read/write dependencies among transactions" @@ -23330,16 +24241,16 @@ msgstr "" "не удалось сериализовать доступ из-за зависимостей чтения/записи между " "транзакциями" -#: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 -#: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 -#: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 -#: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 -#: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 #, c-format msgid "The transaction might succeed if retried." msgstr "Транзакция может завершиться успешно при следующей попытке." -#: storage/lmgr/proc.c:357 +#: storage/lmgr/proc.c:355 #, c-format msgid "" "number of requested standby connections exceeds max_wal_senders (currently " @@ -23348,7 +24259,7 @@ msgstr "" "число запрошенных подключений резервных серверов превосходит max_wal_senders " "(сейчас: %d)" -#: storage/lmgr/proc.c:1565 +#: storage/lmgr/proc.c:1539 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -23357,7 +24268,7 @@ msgstr "" "процесс %d избежал взаимоблокировки, ожидая в режиме %s блокировку \"%s\", " "изменив порядок очереди через %ld.%03d мс" -#: storage/lmgr/proc.c:1580 +#: storage/lmgr/proc.c:1554 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" @@ -23365,19 +24276,19 @@ msgstr "" "процесс %d обнаружил взаимоблокировку, ожидая в режиме %s блокировку \"%s\" " "в течение %ld.%03d мс" -#: storage/lmgr/proc.c:1589 +#: storage/lmgr/proc.c:1563 #, 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:1596 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процесс %d получил в режиме %s блокировку \"%s\" через %ld.%03d мс" -#: storage/lmgr/proc.c:1613 +#: storage/lmgr/proc.c:1587 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "" @@ -23389,83 +24300,78 @@ msgid "page verification failed, calculated checksum %u but expected %u" msgstr "" "ошибка проверки страницы: получена контрольная сумма %u, а ожидалась - %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 "" "испорченные указатели страницы: нижний = %u, верхний = %u, спецобласть = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "испорченный линейный указатель: %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 "испорченный размер элемента (общий размер: %u, доступно: %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 "испорченный линейный указатель: смещение = %u, размер = %u" -#: storage/smgr/md.c:438 +#: storage/smgr/md.c:473 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не удалось увеличить файл \"%s\" до блока %u" -#: storage/smgr/md.c:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не удалось увеличить файл \"%s\": %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "Проверьте, есть ли место на диске." - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не удалось прочитать блок %u в файле \"%s\": %m" -#: storage/smgr/md.c:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не удалось записать блок %u в файл \"%s\": %m" -#: storage/smgr/md.c:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не удалось обрезать файл \"%s\" до нужного числа блоков (%u): %m" -#: storage/smgr/md.c:1289 +#: storage/smgr/md.c:1332 #, c-format msgid "" "could not open file \"%s\" (target block %u): previous segment is only %u " @@ -23474,7 +24380,7 @@ msgstr "" "не удалось открыть файл file \"%s\" (целевой блок %u): недостаточно блоков в " "предыдущем сегменте (всего %u)" -#: storage/smgr/md.c:1303 +#: storage/smgr/md.c:1346 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не удалось открыть файл file \"%s\" (целевой блок %u): %m" @@ -23489,8 +24395,8 @@ msgstr "вызвать функцию \"%s\" через интерфейс fastp msgid "fastpath function call: \"%s\" (OID %u)" msgstr "вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 -#: tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "продолжительность: %s мс" @@ -23525,44 +24431,44 @@ msgstr "неверный размер аргумента (%d) в сообщен msgid "incorrect binary data format in function argument %d" msgstr "неправильный формат двоичных данных в аргументе функции %d" -#: tcop/postgres.c:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "неправильный тип клиентского сообщения %d" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "продолжительность: %s мс, оператор: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "в подготовленный оператор нельзя вставить несколько команд" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "продолжительность: %s мс, разбор %s: %s" # [SM]: TO REVIEW -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "безымянный подготовленный оператор не существует" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "" "неверное число форматов параметров в сообщении Bind (%d, а параметров %d)" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -23571,113 +24477,113 @@ msgstr "" "в сообщении Bind передано неверное число параметров (%d, а подготовленный " "оператор \"%s\" требует %d)" -#: tcop/postgres.c:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "неверный формат двоичных данных в параметре Bind %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "продолжительность: %s мс, сообщение Bind %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не существует" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "выборка из" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "выполнение" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "продолжительность: %s мс %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "подготовка: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "параметры: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "причина прерывания: конфликт при восстановлении" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Пользователь удерживал фиксатор разделяемого буфера слишком долго." -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "Пользователь удерживал блокировку таблицы слишком долго." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "" "Пользователь использовал табличное пространство, которое должно быть удалено." -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "Запросу пользователя нужно было видеть версии строк, которые должны быть " "удалены." -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2502 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Пользователь был подключён к базе данных, которая должна быть удалена." -#: tcop/postgres.c:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "портал \"%s\", параметр $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "портал \"%s\", параметр $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "неименованный портал, параметр $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "неименованный портал, параметр $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "закрытие подключения из-за неожиданного сигнала SIGQUIT" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "закрытие подключения из-за краха другого серверного процесса" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -23688,7 +24594,7 @@ msgstr "" "транзакцию и завершиться, так как другой серверный процесс завершился " "аварийно и, возможно, разрушил разделяемую память." -#: tcop/postgres.c:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, c-format msgid "" "In a moment you should be able to reconnect to the database and repeat your " @@ -23697,18 +24603,18 @@ msgstr "" "Вы сможете переподключиться к базе данных и повторить вашу команду сию " "минуту." -#: tcop/postgres.c:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "" "закрытие подключения вследствие получения команды для немедленного отключения" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "исключение в операции с плавающей точкой" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -23718,72 +24624,72 @@ msgstr "" "оказался вне допустимых рамок или произошла ошибка вычисления, например, " "деление на ноль." -#: tcop/postgres.c:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "отмена проверки подлинности из-за тайм-аута" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "прекращение процесса автоочистки по команде администратора" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершение обработчика логической репликации по команде администратора" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "закрытие подключения из-за конфликта с процессом восстановления" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "закрытие подключения по команде администратора" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "подключение к клиенту потеряно" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "выполнение оператора отменено из-за тайм-аута блокировки" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "выполнение оператора отменено из-за тайм-аута" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "отмена задачи автоочистки" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "выполнение оператора отменено по запросу пользователя" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "закрытие подключения из-за тайм-аута простоя в транзакции" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "закрытие подключения из-за тайм-аута простоя сеанса" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "превышен предел глубины стека" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -23793,12 +24699,12 @@ msgstr "" "КБ), предварительно убедившись, что ОС предоставляет достаточный размер " "стека." -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значение \"max_stack_depth\" не должно превышать %ld КБ." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " @@ -23807,49 +24713,49 @@ msgstr "" "Увеличьте предел глубины стека в системе с помощью команды \"ulimit -s\" или " "эквивалента в вашей ОС." -#: tcop/postgres.c:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неверный аргумент командной строки для серверного процесса: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неверный аргумент командной строки: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: не указаны ни база данных, ни пользователь" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неверный подтип сообщения CLOSE: %d" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неверный подтип сообщения DESCRIBE: %d" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "" "вызовы функций через fastpath не поддерживаются для реплицирующих соединений" -#: tcop/postgres.c:4768 +#: tcop/postgres.c:4853 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "" "протокол расширенных запросов не поддерживается для реплицирующих соединений" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:5030 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s " @@ -23858,57 +24764,59 @@ msgstr "" "отключение: время сеанса: %d:%02d:%02d.%03d пользователь=%s база данных=%s " "компьютер=%s%s%s" -#: tcop/pquery.c:638 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "" "число форматов результатов в сообщении Bind (%d) не равно числу столбцов в " "запросе (%d)" -#: tcop/pquery.c:941 tcop/pquery.c:1703 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "курсор может сканировать только вперёд" -#: tcop/pquery.c:942 tcop/pquery.c:1704 +#: 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:414 +#: 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:432 +#: 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:451 +#: 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:469 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "в рамках операции с ограничениями по безопасности нельзя выполнить %s" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, c-format msgid "cannot execute %s within a background process" msgstr "выполнять %s в фоновом процессе нельзя" -#: tcop/utility.c:945 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "для выполнения CHECKPOINT нужно быть суперпользователем" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "" +"для выполнения CHECKPOINT нужно быть суперпользователем или иметь права роли " +"pg_checkpoint" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -24060,19 +24968,19 @@ msgstr "неверный флаг аффиксов \"%s\" со значение msgid "could not open dictionary file \"%s\": %m" msgstr "не удалось открыть файл словаря \"%s\": %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "неверное регулярное выражение: %s" #: tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 -#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:16630 gram.y:16647 +#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:17812 gram.y:17829 #, c-format msgid "syntax error" msgstr "ошибка синтаксиса" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неверное указание аффикса \"%s\"" @@ -24106,17 +25014,17 @@ msgstr "количество псевдонимов превышает зада msgid "affix file contains both old-style and new-style commands" msgstr "файл аффиксов содержит команды и в старом, и в новом стиле" -#: 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 "строка слишком длинна для tsvector (%d Б, при максимуме %d)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "строка %d файла конфигурации \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "преобразовать wchar_t в кодировку сервера не удалось: %m" @@ -24148,145 +25056,196 @@ msgstr "не удалось открыть файл стоп-слов \"%s\": %m msgid "text search parser does not support headline creation" msgstr "анализатор текстового поиска не поддерживает создание выдержек" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нераспознанный параметр функции выдержки: \"%s\"" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "Значение MinWords должно быть меньше MaxWords" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "Значение MinWords должно быть положительным" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "Значение ShortWord должно быть >= 0" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "Значение MaxFragments должно быть >= 0" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "ошибка удаления постоянного файла статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1229 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "неверный вид статистики: \"%s\"" + +#: utils/activity/pgstat.c:1309 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "не удалось открыть временный файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1415 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "не удалось записать во временный файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1424 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "не удалось закрыть временный файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1432 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "" +"не удалось переименовать временный файл статистики из \"%s\" в \"%s\": %m" + +#: utils/activity/pgstat.c:1481 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "не удалось открыть файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1637 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "файл статистики \"%s\" испорчен" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "вызвана функция, которая была удалена" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "сбрасывается существующая статистика вида %s, db=%u, oid=%u" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "слишком длинный идентификатор" -#: 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 "Идентификатор должен быть короче %d байт." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нераспознанное ключевое слово: \"%s\"" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключевым словом ACL должно быть \"group\" или \"user\"." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "отсутствует имя" -#: utils/adt/acl.c:256 +#: 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:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "отсутствует знак \"=\"" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неверный символ режима: должен быть один из \"%s\"" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" должно следовать имя" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "назначившим права считается пользователь с ID %u" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "Массив ACL содержит неверный тип данных" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Массивы ACL должны быть одномерными" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "Массивы ACL не должны содержать значения null" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "лишний мусор в конце спецификации ACL" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "привилегию назначения прав нельзя вернуть тому, кто назначил её вам" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "существуют зависимые права" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Используйте CASCADE, чтобы отозвать и их." -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert больше не поддерживается" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove больше не поддерживается" -#: 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 "нераспознанный тип прав: \"%s\"" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: 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:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "нужно быть членом роли \"%s\"" #: 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/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "не удалось определить тип входных данных" @@ -24297,16 +25256,16 @@ msgid "input data type is not an array" msgstr "тип входных данных не является массивом" #: 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:4231 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 -#: utils/adt/varlena.c:3422 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "целое вне диапазона" @@ -24356,167 +25315,167 @@ msgstr "поиск элементов в многомерных массивах msgid "initial position must not be null" msgstr "начальная позиция не может быть NULL" -#: 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 +#: utils/adt/arrayfuncs.c:272 utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:334 utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:510 +#: utils/adt/arrayfuncs.c:521 utils/adt/arrayfuncs.c:536 +#: utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 +#: utils/adt/arrayfuncs.c:594 utils/adt/arrayfuncs.c:602 +#: utils/adt/arrayfuncs.c:636 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:679 utils/adt/arrayfuncs.c:791 +#: utils/adt/arrayfuncs.c:800 utils/adt/arrayfuncs.c:830 +#: utils/adt/arrayfuncs.c:845 utils/adt/arrayfuncs.c:898 #, c-format msgid "malformed array literal: \"%s\"" msgstr "ошибочный литерал массива: \"%s\"" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:273 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "За \"[\" должны следовать явно задаваемые размерности массива." -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:287 #, c-format msgid "Missing array dimension value." msgstr "Отсутствует значение размерности массива." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:335 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "После размерностей массива отсутствует \"%s\"." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2909 -#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:2945 +#: utils/adt/arrayfuncs.c:2990 utils/adt/arrayfuncs.c:3005 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "верхняя граница не может быть меньше нижней" -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:320 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Значение массива должно начинаться с \"{\" или указания размерности." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:349 #, c-format msgid "Array contents must start with \"{\"." msgstr "Содержимое массива должно начинаться с \"{\"." -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:355 utils/adt/arrayfuncs.c:362 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Указанные размерности массива не соответствуют его содержимому." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: utils/adt/arrayfuncs.c:495 utils/adt/arrayfuncs.c:522 +#: 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:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:511 utils/adt/arrayfuncs.c:558 +#: utils/adt/arrayfuncs.c:588 utils/adt/arrayfuncs.c:637 #, c-format msgid "Unexpected \"%c\" character." msgstr "Неожиданный знак \"%c\"." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:537 utils/adt/arrayfuncs.c:660 #, c-format msgid "Unexpected array element." msgstr "Неожиданный элемент массива." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:595 #, c-format msgid "Unmatched \"%c\" character." msgstr "Непарный знак \"%c\"." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:603 utils/adt/jsonfuncs.c:2490 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "" "Для многомерных массивов должны задаваться вложенные массивы с " "соответствующими размерностями." -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:680 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Мусор после закрывающей фигурной скобки." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 -#: utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:1302 utils/adt/arrayfuncs.c:3418 +#: utils/adt/arrayfuncs.c:5932 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное число размерностей: %d" -#: utils/adt/arrayfuncs.c:1312 +#: utils/adt/arrayfuncs.c:1313 #, c-format msgid "invalid array flags" msgstr "неверные флаги массива" -#: utils/adt/arrayfuncs.c:1334 +#: utils/adt/arrayfuncs.c:1335 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "" "с бинарными данными связан тип элемента массива %u (%s) вместо ожидаемого %u " "(%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 +#: utils/adt/arrayfuncs.c:1379 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:1518 +#: utils/adt/arrayfuncs.c:1519 #, c-format msgid "improper binary format in array element %d" msgstr "неподходящий двоичный формат в элементе массива %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 +#: utils/adt/arrayfuncs.c:1600 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:2078 +#: utils/adt/arrayfuncs.c:2079 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "разрезание массивов постоянной длины не поддерживается" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 -#: utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 -#: utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2257 utils/adt/arrayfuncs.c:2279 +#: utils/adt/arrayfuncs.c:2328 utils/adt/arrayfuncs.c:2582 +#: utils/adt/arrayfuncs.c:2920 utils/adt/arrayfuncs.c:5918 +#: utils/adt/arrayfuncs.c:5944 utils/adt/arrayfuncs.c:5955 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "неверное число индексов массива" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2262 utils/adt/arrayfuncs.c:2386 +#: utils/adt/arrayfuncs.c:2665 utils/adt/arrayfuncs.c:2995 #, c-format msgid "array subscript out of range" msgstr "индекс массива вне диапазона" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2267 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "нельзя присвоить значение null элементу массива фиксированной длины" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "изменения в срезах массивов фиксированной длины не поддерживаются" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2898 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "в указании среза массива должны быть заданы обе границы" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2899 #, c-format msgid "" "When assigning to a slice of an empty array value, slice boundaries must be " @@ -24525,90 +25484,90 @@ msgstr "" "При присвоении значений срезу в пустом массиве, должны полностью задаваться " "обе границы." -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2910 utils/adt/arrayfuncs.c:3022 #, c-format msgid "source array too small" msgstr "исходный массив слишком мал" -#: utils/adt/arrayfuncs.c:3527 +#: utils/adt/arrayfuncs.c:3576 #, c-format msgid "null array element not allowed in this context" msgstr "элемент массива null недопустим в данном контексте" -#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 -#: utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:3678 utils/adt/arrayfuncs.c:3849 +#: utils/adt/arrayfuncs.c:4240 #, c-format msgid "cannot compare arrays of different element types" msgstr "нельзя сравнивать массивы с элементами разных типов" -#: utils/adt/arrayfuncs.c:3978 utils/adt/multirangetypes.c:2742 -#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:4027 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 "не удалось найти функцию хеширования для типа %s" -#: utils/adt/arrayfuncs.c:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4155 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не удалось найти функцию расширенного хеширования для типа %s" -#: utils/adt/arrayfuncs.c:5282 +#: utils/adt/arrayfuncs.c:5332 #, c-format msgid "data type %s is not an array type" msgstr "тип данных %s не является типом массива" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5387 #, c-format msgid "cannot accumulate null arrays" msgstr "аккумулировать NULL-массивы нельзя" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5415 #, c-format msgid "cannot accumulate empty arrays" msgstr "аккумулировать пустые массивы нельзя" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5442 utils/adt/arrayfuncs.c:5448 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "аккумулировать массивы различной размерности нельзя" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5816 utils/adt/arrayfuncs.c:5856 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "массив размерностей или массив нижних границ не может быть null" -#: utils/adt/arrayfuncs.c:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5919 utils/adt/arrayfuncs.c:5945 #, c-format msgid "Dimension array must be one dimensional." msgstr "Массив размерностей должен быть одномерным." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5924 utils/adt/arrayfuncs.c:5950 #, c-format msgid "dimension values cannot be null" msgstr "значения размерностей не могут быть null" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5956 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Массив нижних границ и массив размерностей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6184 +#: utils/adt/arrayfuncs.c:6234 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление элементов из многомерных массивов не поддерживается" -#: utils/adt/arrayfuncs.c:6461 +#: utils/adt/arrayfuncs.c:6511 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаваться одномерным массивом" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6516 #, c-format msgid "thresholds array must not contain NULLs" msgstr "массив границ не должен содержать NULL" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6749 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "число удаляемых элементов должно быть от 0 до %d" @@ -24623,22 +25582,22 @@ msgstr "индекс элемента массива должен быть це msgid "array subscript in assignment must not be null" msgstr "индекс элемента массива в присваивании не может быть NULL" -#: utils/adt/arrayutils.c:140 +#: utils/adt/arrayutils.c:134 #, c-format msgid "array lower bound is too large: %d" msgstr "нижняя граница массива слишком велика: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:234 #, c-format msgid "typmod array must be type cstring[]" msgstr "массив typmod должен иметь тип cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:239 #, c-format msgid "typmod array must be one-dimensional" msgstr "массив typmod должен быть одномерным" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:244 #, c-format msgid "typmod array must not contain nulls" msgstr "массив typmod не должен содержать элементы null" @@ -24649,212 +25608,217 @@ 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: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:4050 +#: 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:4660 -#: utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 -#: utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 -#: utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, 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:179 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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 -#: 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3361 #, c-format msgid "division by zero" msgstr "деление на ноль" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "значение \"char\" вне диапазона" -#: 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 +#, 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:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s: точность должна быть неотрицательной" -#: utils/adt/date.c:80 +#: 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: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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%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:2219 #, c-format msgid "date out of range" msgstr "дата вне диапазона" -#: 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 "значение поля типа date вне диапазона: %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 "дата вне диапазона: %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, 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: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 "дата вне диапазона для типа timestamp" -#: 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:5417 utils/adt/timestamp.c:5431 -#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 -#: utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 -#: utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 -#: utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 -#: utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: 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:4078 +#: utils/adt/timestamp.c:4271 utils/adt/timestamp.c:4443 +#: utils/adt/timestamp.c:4696 utils/adt/timestamp.c:4897 +#: utils/adt/timestamp.c:4944 utils/adt/timestamp.c:5168 +#: utils/adt/timestamp.c:5215 utils/adt/timestamp.c:5345 +#, 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:4092 utils/adt/timestamp.c:4288 +#: utils/adt/timestamp.c:4457 utils/adt/timestamp.c:4656 +#: utils/adt/timestamp.c:4953 utils/adt/timestamp.c:5224 +#: utils/adt/timestamp.c:5406 +#, 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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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:2961 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2975 +#: utils/adt/timestamp.c:3030 utils/adt/timestamp.c:3053 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3080 +#: utils/adt/timestamp.c:3088 utils/adt/timestamp.c:3096 +#: utils/adt/timestamp.c:3782 utils/adt/timestamp.c:3906 +#: utils/adt/timestamp.c:3996 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:4179 utils/adt/timestamp.c:4282 +#: utils/adt/timestamp.c:4761 utils/adt/timestamp.c:5035 +#: utils/adt/timestamp.c:5485 utils/adt/timestamp.c:5499 +#: utils/adt/timestamp.c:5504 utils/adt/timestamp.c:5518 +#: utils/adt/timestamp.c:5551 utils/adt/timestamp.c:5638 +#: utils/adt/timestamp.c:5679 utils/adt/timestamp.c:5683 +#: utils/adt/timestamp.c:5752 utils/adt/timestamp.c:5756 +#: utils/adt/timestamp.c:5770 utils/adt/timestamp.c:5804 utils/adt/xml.c:2241 +#: utils/adt/xml.c:2248 utils/adt/xml.c:2268 utils/adt/xml.c:2275 #, c-format msgid "timestamp out of range" msgstr "timestamp вне диапазона" -#: 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:4476 #, c-format msgid "time out of range" msgstr "время вне диапазона" -#: 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 "значение поля типа time вне диапазона: %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:2435 -#: 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 +#: utils/adt/timestamp.c:3432 utils/adt/timestamp.c:3463 +#: utils/adt/timestamp.c:3494 #, c-format msgid "invalid preceding or following size in window function" msgstr "неверное смещение PRECEDING или FOLLOWING в оконной функции" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"время\" содержит нераспознанные единицы \"%s\"" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "смещение часового пояса вне диапазона" -#: 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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 utils/adt/timestamp.c:516 +#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4365 +#: utils/adt/timestamp.c:5510 utils/adt/timestamp.c:5762 #, c-format msgid "time zone \"%s\" not recognized" msgstr "часовой пояс \"%s\" не распознан" -#: utils/adt/date.c:3130 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: utils/adt/date.c:3117 utils/adt/timestamp.c:5540 utils/adt/timestamp.c:5793 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" "интервал \"%s\", задающий часовой пояс, не должен содержать дней или месяцев" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "значение поля типа date/time вне диапазона: \"%s\"" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Возможно, вам нужно изменить настройку \"datestyle\"." -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "значение поля interval вне диапазона: \"%s\"" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "смещение часового пояса вне диапазона: \"%s\"" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, c-format msgid "" "This time zone name appears in the configuration file for time zone " @@ -24868,21 +25832,22 @@ msgstr "" msgid "invalid Datum pointer" msgstr "неверный указатель Datum" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "некорректная величина: \"%s\"" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Неверная единица измерения величины: \"%s\"." -#: utils/adt/dbsize.c:824 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "" -"Допустимые единицы измерения: \"bytes\", \"kB\", \"MB\", \"GB\" и \"TB\"." +"Допустимые единицы измерения: \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\" и " +"\"PB\"." #: utils/adt/domains.c:92 #, c-format @@ -24936,9 +25901,9 @@ msgstr "" "Входные данные лишены выравнивания, обрезаны или повреждены иным образом." #: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 -#: 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 +#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:529 +#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 +#: jsonpath_scan.l:578 #, c-format msgid "invalid input syntax for type %s" msgstr "неверный синтаксис для типа %s" @@ -24976,205 +25941,205 @@ msgstr "не удалось определить фактический тип msgid "enum %s contains no values" 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 "\"%s\" вне диапазона для типа 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\" вне диапазона для типа 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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 +#: 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 "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:3736 -#: utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 -#: utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, 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:1708 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 +#: 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/numeric.c:1724 +#: 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:1738 +#: 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 "неправильная спецификация формата для целого числа" -#: 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:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" может быть только последним шаблоном" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" должна стоять до \"PR\"" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" должен стоять до \"PR\"" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "многочисленные десятичные точки" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "нельзя использовать \"V\" вместе с десятичной точкой" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "нельзя использовать \"S\" дважды" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, 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:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "нельзя использовать \"S\" вместе с \"MI\"" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "нельзя использовать \"S\" вместе с \"PL\"" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "нельзя использовать \"S\" вместе с \"SG\"" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, 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:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "нельзя использовать \"EEEE\" дважды" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" несовместим с другими форматами" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format msgid "" "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "" "\"EEEE\" может использоваться только с шаблонами цифр и десятичной точки." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неверный разделитель в формате datetime: \"%s\"" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не является числом" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "преобразовать регистр не удалось: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 -#: utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "" "не удалось определить, какое правило сортировки использовать для функции %s" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "неверное сочетание стилей дат" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." @@ -25182,27 +26147,27 @@ msgstr "" "Не смешивайте Григорианский стиль дат (недель) с ISO в одном шаблоне " "форматирования." -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфликтующие значения поля \"%s\" в строке форматирования" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Это значение противоречит предыдущему значению поля того же типа." -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "входная строка короче, чем требует поле форматирования \"%s\"" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Требуется символов: %d, а осталось только %d." -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." @@ -25210,169 +26175,164 @@ msgstr "" "Если входная строка имеет переменную длину, попробуйте использовать " "модификатор \"FM\"." -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 -#: utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неверное значение \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле должно поглотить символов: %d, но удалось разобрать только %d." -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "Значение должно быть целым числом." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значение \"%s\" во входной строке вне диапазона" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значение должно быть в интервале %d..%d." -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "" "Данное значение не соответствует ни одному из допустимых значений для этого " "поля." -#: 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "слишком длинное значение формата локализованной строки" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "нет соответствия для заданного в формате разделителя \"%c\"" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "нет соответствия для заданного в формате символа \"%s\"" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "поле форматирования \"%s\" поддерживается только в функции to_char" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ошибка синтаксиса в значении для шаблона \"Y,YYY\"" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "входная строка короче, чем требует формат datetime" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "" "после разбора формата datetime во входной строке остались дополнительные " "символы" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "во входной строке для типа timestamptz нет указания часового пояса" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "значение timestamptz вне диапазона" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "в формате datetime указан часовой пояс, но отсутствует время" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" msgstr "во входной строке для типа timetz нет указания часового пояса" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "значение timetz вне диапазона" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "в формате datetime нет ни даты, ни времени" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "час \"%d\" не соответствует 12-часовому формату времени" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Используйте 24-часовой формат или передавайте часы от 1 до 12." -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "нельзя рассчитать день года без информации о годе" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не поддерживается при вводе" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не поддерживается при вводе" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "ссылка на родительский каталог (\"..\") недопустима" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "абсолютный путь недопустим" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "путь должен указывать в текущий или вложенный каталог" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 -#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 -#: utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "запрошенная длина слишком велика" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не удалось переместиться в файле \"%s\": %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "длина файла слишком велика" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "читать файлы, используя adminpack 1.0, может только суперпользователь" @@ -25387,8 +26347,8 @@ msgstr "неверное определение линии: A и B вдвоём msgid "invalid line specification: must be two distinct points" msgstr "неверное определение линии: требуются две различных точки" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 -#: utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "запрошено слишком много точек" @@ -25398,98 +26358,58 @@ msgstr "запрошено слишком много точек" msgid "invalid number of points in external \"path\" value" msgstr "недопустимое число точек во внешнем представлении типа \"path\"" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "функция \"dist_lb\" не реализована" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "функция \"dist_bl\" не реализована" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "функция \"close_sl\" не реализована" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "функция \"close_lb\" не реализована" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "недопустимое число точек во внешнем представлении типа \"polygon\"" -#: utils/adt/geo_ops.c:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "функция \"poly_distance\" не реализована" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "функция \"path_center\" не реализована" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "открытый путь нельзя преобразовать во многоугольник" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "недопустимый радиус во внешнем представлении типа \"circle\"" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг с нулевым радиусом нельзя преобразовать в многоугольник" -#: utils/adt/geo_ops.c:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "точек должно быть минимум 2" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector содержит слишком много элементов" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "неверные данные int2vector" -#: 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:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 -#: utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 +#: utils/adt/timestamp.c:5855 utils/adt/timestamp.c:5935 #, 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:4302 +#: 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:4364 #: 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 вне диапазона" @@ -25500,23 +26420,23 @@ 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:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Аргументы %s должны состоять из пар ключ-значение." @@ -25531,18 +26451,18 @@ msgstr "аргумент %d не может быть NULL" msgid "Object keys should be text." msgstr "Ключи объектов должны быть текстовыми." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "массив должен иметь два столбца" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "неподходящие размерности массива" @@ -25559,68 +26479,68 @@ msgid "" msgstr "" "Из-за ограничений реализации строки jsonb не могут быть длиннее %d байт." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "аргумент %d: ключ не может быть NULL" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "ключи объектов должны быть строковыми" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "привести значение jsonb null к типу %s нельзя" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "привести строку jsonb к типу %s нельзя" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "привести числовое значение jsonb к типу %s нельзя" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "привести логическое значение jsonb к типу %s нельзя" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "привести массив jsonb к типу %s нельзя" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "привести объект jsonb к типу %s нельзя" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "привести массив или объект jsonb к типу %s нельзя" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "число пар объекта jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "число элементов массива jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "общий размер элементов массива jsonb превышает предел (%u байт)" -#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 -#: utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "общий размер элементов объекта jsonb превышает предел (%u байт)" @@ -25658,19 +26578,19 @@ msgid "jsonb subscript in assignment must not be null" msgstr "индекс элемента jsonb в присваивании не может быть NULL" #: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 -#: utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 -#: utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "вызывать %s со скаляром нельзя" #: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 -#: utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "вызывать %s с массивом нельзя" -#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:494 #, c-format msgid "unsupported Unicode escape sequence" msgstr "неподдерживаемая спецпоследовательность Unicode" @@ -25690,75 +26610,75 @@ msgstr "получить длину скаляра нельзя" msgid "cannot get array length of a non-array" msgstr "получить длину массива для не массива нельзя" -#: utils/adt/jsonfuncs.c:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "вызывать %s с не объектом нельзя" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "извлечь массив в виде объекта нельзя" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "извлечь скаляр нельзя" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "извлечь элементы из скаляра нельзя" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "извлечь элементы из объекта нельзя" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, c-format msgid "cannot call %s on a non-array" msgstr "вызывать %s с не массивом нельзя" -#: utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2544 -#: utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "ожидался массив JSON" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Проверьте значение ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Проверьте элемент массива %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Проверьте элемент массива %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "malformed JSON array" msgstr "неправильный массив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, c-format msgid "could not determine row type for result of %s" msgstr "не удалось определить тип строки для результата %s" -#: utils/adt/jsonfuncs.c:3456 +#: utils/adt/jsonfuncs.c:3342 #, c-format msgid "" "Provide a non-null record argument, or call the function in the FROM clause " @@ -25767,33 +26687,38 @@ msgstr "" "Передайте отличный от NULL аргумент-запись или вызовите эту функцию в " "предложении FROM, используя список определений столбцов." -#: utils/adt/jsonfuncs.c:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "требуется режим материализации, но он недопустим в этом контексте" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s должен быть массив объектов" -#: utils/adt/jsonfuncs.c:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "вызывать %s с объектом нельзя" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "удаление из скаляра невозможно" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, c-format msgid "cannot delete from object using integer index" msgstr "удаление из объекта по числовому индексу невозможно" -#: utils/adt/jsonfuncs.c:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "задать путь в скаляре нельзя" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, c-format msgid "" "null_value_treatment must be \"delete_key\", \"return_target\", " @@ -25802,12 +26727,12 @@ msgstr "" "значением null_value_treatment должно быть \"delete_key\", " "\"return_target\", \"use_json_null\" или \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "значение JSON не может быть NULL" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, c-format msgid "" "Exception was raised because null_value_treatment is \"raise_exception\"." @@ -25815,7 +26740,7 @@ msgstr "" "Выдано исключение, так как значением null_value_treatment является " "\"raise_exception\"." -#: utils/adt/jsonfuncs.c:4654 +#: utils/adt/jsonfuncs.c:4542 #, c-format msgid "" "To avoid, either change the null_value_treatment argument or ensure that an " @@ -25824,55 +26749,55 @@ msgstr "" "Чтобы исключения не было, либо измените аргумент null_value_treatment, либо " "не допускайте передачи SQL NULL." -#: utils/adt/jsonfuncs.c:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "удалить путь в скаляре нельзя" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "элемент пути в позиции %d равен NULL" -#: utils/adt/jsonfuncs.c:4944 utils/adt/jsonfuncs.c:4975 -#: utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "заменить существующий ключ нельзя" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "" "Для заданного пути значение ключа должно быть составным объектом, но оно " "оказалось скаляром." -#: utils/adt/jsonfuncs.c:5049 +#: utils/adt/jsonfuncs.c:4937 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Попробуйте применить функцию jsonb_set для замены значения ключа." -#: utils/adt/jsonfuncs.c:5153 +#: utils/adt/jsonfuncs.c:5041 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "элемент пути в позиции %d - не целочисленный: \"%s\"" -#: utils/adt/jsonfuncs.c:5170 +#: utils/adt/jsonfuncs.c:5058 #, c-format msgid "path element at position %d is out of range: %d" msgstr "элемент пути в позиции %d вне диапазона: %d" -#: utils/adt/jsonfuncs.c:5322 +#: utils/adt/jsonfuncs.c:5210 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неверный тип флага, допускаются только массивы и скаляры" -#: utils/adt/jsonfuncs.c:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "элемент массива флагов не является строкой" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, c-format msgid "" "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and " @@ -25880,7 +26805,7 @@ msgid "" msgstr "" "Допустимые значения: \"string\", \"numeric\", \"boolean\", \"key\" и \"all\"." -#: utils/adt/jsonfuncs.c:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неверный флаг в массиве флагов: \"%s\"" @@ -26065,7 +26990,7 @@ msgstr "длина аргумента levenshtein() превышает макс msgid "nondeterministic collations are not supported for LIKE" msgstr "недетерминированные правила сортировки не поддерживаются для LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "не удалось определить, какой порядок сортировки использовать для ILIKE" @@ -26080,27 +27005,27 @@ msgstr "недетерминированные правила сортировк 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 "Защитный символ должен быть пустым или состоять из одного байта." -#: utils/adt/like_support.c:988 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "регистронезависимое сравнение не поддерживается для типа bytea" -#: utils/adt/like_support.c:1090 +#: utils/adt/like_support.c:1115 #, 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\"" @@ -26120,292 +27045,282 @@ msgstr "" "Преобразование из macaddr8 в macaddr возможно только для адресов, содержащих " "FF и FE в 4-ом и 5-ом байтах слева, например xx:xx:xx:ff:fe:xx:xx:xx." -#: utils/adt/mcxtfuncs.c:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "получать информацию о содержимом памяти может только суперпользователь" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d не относится к серверному процессу PostgreSQL" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "в табличном пространстве global никогда не было баз данных" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u - это не OID табличного пространства" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "не зарезервировано" -#: utils/adt/misc.c:488 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервировано (но не может быть именем типа или функции)" -#: utils/adt/misc.c:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "зарезервировано (но может быть именем типа или функции)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "зарезервировано" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "может быть открытой меткой" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "требует AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 -#: utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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:761 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "В строке не закрыты кавычки." -#: utils/adt/misc.c:775 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "Идентификатор в кавычках не может быть пустым." -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" нет допустимого идентификатора." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "После \".\" нет допустимого идентификатора." -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журнала \"%s\" не поддерживается" -#: utils/adt/misc.c:879 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "Поддерживаются форматы журналов \"stderr\" и \"csvlog\"." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Поддерживаются форматы журналов \"stderr\", \"csvlog\" и \"jsonlog\"." -#: 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 +#: 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:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Отсутствует левая фигурная скобка." -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Ожидалось начало диапазона." -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." msgstr "Ожидалась запятая или конец мультидиапазона." -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "мультидиапазоны нельзя получить из массивов мультидиапазонов" -#: utils/adt/multirangetypes.c:1001 +#: utils/adt/multirangetypes.c:1002 #, 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 +#: 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 "нельзя использовать \"И\" (AND) для значений inet разного размера" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "нельзя использовать \"ИЛИ\" (OR) для значений inet разного размера" -#: 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:967 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неверный знак во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:973 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неверный порядок числа во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:982 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "неверная цифра во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 +#: 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:1200 +#: 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:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неверный модификатор типа NUMERIC" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "начальное значение не может быть NaN" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "начальное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "конечное значение не может быть NaN" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "конечное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "размер шага не может быть NaN" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "размер шага не может быть бесконечностью" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 -#: utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 -#: utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "значение переполняет формат numeric" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 -#: utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 -#: utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -26414,66 +27329,77 @@ msgstr "" "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." -#: utils/adt/numeric.c:7554 +#: utils/adt/numeric.c:7594 #, 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-битового integer" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "неверные данные oidvector" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "запрошенный символ больше допустимого" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "код запрошенного символа слишком велик для кодировки: %d" +msgid "character number must be positive" +msgstr "номер символа должен быть положительным" -#: utils/adt/oracle_compat.c:1063 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "запрошенный символ не подходит для кодировки: %d" - -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, 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:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "код запрошенного символа слишком велик для кодировки: %u" + +#: utils/adt/oracle_compat.c:1082 +#, 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:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "Обновите пакет с системной библиотекой." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "не удалось открыть сортировщик для локали \"%s\": %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU не поддерживается в данной сборке" + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не удалось создать локаль \"%s\": %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, c-format msgid "" "The operating system could not find any locale data for the locale name " "\"%s\"." msgstr "Операционная система не может найти данные локали с именем \"%s\"." -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1608 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -26482,40 +27408,22 @@ msgstr "" "правила сортировки с разными значениями collate и ctype не поддерживаются на " "этой платформе" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "провайдер правил сортировки LIBC не поддерживается на этой платформе" -#: utils/adt/pg_locale.c:1568 +#: utils/adt/pg_locale.c:1652 #, c-format -msgid "" -"collations with different collate and ctype values are not supported by ICU" -msgstr "" -"ICU не поддерживает правила сортировки с разными значениями collate и ctype" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "для правила сортировки \"%s\", лишённого версии, была записана версия" -#: 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:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU не поддерживается в данной сборке" - -#: 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:1616 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "несовпадение версии для правила сортировки \"%s\"" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1660 #, c-format msgid "" "The collation in the database was created using version %s, but the " @@ -26524,7 +27432,7 @@ msgstr "" "Правило сортировки в базе данных было создано с версией %s, но операционная " "система предоставляет версию %s." -#: utils/adt/pg_locale.c:1621 +#: utils/adt/pg_locale.c:1663 #, c-format msgid "" "Rebuild all objects affected by this collation and run ALTER COLLATION %s " @@ -26534,40 +27442,40 @@ msgstr "" "ALTER COLLATION %s REFRESH VERSION либо соберите PostgreSQL с правильной " "версией библиотеки." -#: utils/adt/pg_locale.c:1692 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "не удалось загрузить локаль \"%s\"" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "" "не удалось получить версию правила сортировки для локали \"%s\" (код ошибки: " "%lu)" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не поддерживает кодировку \"%s\"" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не удалось открыть преобразователь ICU для кодировки \"%s\": %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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "ошибка %s: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "неверный многобайтный символ для локали" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " @@ -26591,11 +27499,29 @@ msgid "function can only be called when server is in binary upgrade mode" msgstr "" "функцию можно вызывать только когда сервер в режиме двоичного обновления" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "неверное имя команды: \"%s\"" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "запрошен сброс неизвестного счётчика: \"%s\"" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "" +"Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "" +"Допустимый счётчик: \"archiver\", \"bgwriter\", \"recovery_prefetch\" или " +"\"wal\"." + +#: utils/adt/pgstatfuncs.c:2198 +#, 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" @@ -26626,11 +27552,6 @@ msgstr "результат вычитания диапазонов будет н msgid "result of range union would not be contiguous" msgstr "результат объединения диапазонов будет не непрерывным" -#: 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" @@ -26681,17 +27602,34 @@ msgstr "Слишком много запятых." msgid "Junk after right parenthesis or bracket." msgstr "Мусор после правой скобки." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, 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, явно приведите " +"четвёртый аргумент к целочисленному типу." + +#: 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:11875 utils/misc/guc.c:11909 +#, 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 " @@ -26701,17 +27639,19 @@ msgstr "" "(экранированных кавычек)" #. 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 "слишком много совпадений для регулярного выражения" @@ -26726,19 +27666,19 @@ msgstr "имя \"%s\" имеют несколько функций" msgid "more than one operator named %s" msgstr "имя %s имеют несколько операторов" -#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8189 +#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8771 #, c-format msgid "missing argument" msgstr "отсутствует аргумент" -#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8190 +#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8772 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9800 utils/adt/ruleutils.c:9969 +#: utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -26750,7 +27690,7 @@ msgstr "Предоставьте для оператора два типа ар #: 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:3698 utils/adt/varlena.c:3703 +#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "ошибка синтаксиса в имени" @@ -26775,39 +27715,39 @@ msgstr "ожидалось имя типа" msgid "improper type name" msgstr "ошибочное имя типа" -#: 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 "" "INSERT или UPDATE в таблице \"%s\" нарушает ограничение внешнего ключа \"%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 не позволяет смешивать в значении ключа null и не null." -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "функция \"%s\" должна запускаться для INSERT" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "функция \"%s\" должна запускаться для UPDATE" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "функция \"%s\" должна запускаться для DELETE" -#: 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 "для триггера \"%s\" таблицы \"%s\" нет записи pg_constraint" -#: 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 " @@ -26816,12 +27756,12 @@ msgstr "" "Удалите этот триггер ссылочной целостности и связанные объекты, а затем " "выполните ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2032 gram.y:3934 +#: utils/adt/ri_triggers.c:2098 gram.y:4172 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "выражение MATCH PARTIAL ещё не реализовано" -#: 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 " @@ -26830,33 +27770,33 @@ msgstr "" "неожиданный результат запроса ссылочной целостности к \"%s\" из ограничения " "\"%s\" таблицы \"%s\"" -#: 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 "Скорее всего это вызвано правилом, переписавшим запрос." -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "" "при удалении секции \"%s\" нарушается ограничение внешнего ключа \"%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 "На ключ (%s)=(%s) всё ещё есть ссылки в таблице \"%s\"." -#: 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 "Ключ (%s)=(%s) отсутствует в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ отсутствует в таблице \"%s\"." -#: 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 " @@ -26865,7 +27805,7 @@ msgstr "" "UPDATE или DELETE в таблице \"%s\" нарушает ограничение внешнего ключа " "\"%s\" таблицы \"%s\"" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "На ключ всё ещё есть ссылки в таблице \"%s\"." @@ -26931,154 +27871,132 @@ msgstr "не удалось сравнить различные типы сто msgid "cannot compare record types with different numbers of columns" msgstr "сравнивать типы записей с разным числом столбцов нельзя" -#: utils/adt/ruleutils.c:5164 +#: utils/adt/ruleutils.c:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "на вход поступил запрос, а не выражение" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "выражение содержит переменные из нескольких отношений" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "выражение содержит переменные" + +#: utils/adt/ruleutils.c:5267 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" имеет неподдерживаемый тип событий %d" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s: точность должна быть неотрицательна" -#: utils/adt/timestamp.c:115 +#: 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:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12443 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12899 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp вне диапазона: \"%s\"" -#: utils/adt/timestamp.c:374 +#: 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:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "" "Запись числового часового пояса должна начинаться с символа \"-\" или \"+\"." -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "числовой часовой пояс \"%s\" вне диапазона" -#: 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 вне диапазона: %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 не может быть NaN" -#: 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 вне диапазона: \"%g\"" -#: 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 +#: 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:3134 utils/adt/timestamp.c:3139 +#: utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3194 +#: utils/adt/timestamp.c:3201 utils/adt/timestamp.c:3208 +#: utils/adt/timestamp.c:3228 utils/adt/timestamp.c:3235 +#: utils/adt/timestamp.c:3242 utils/adt/timestamp.c:3329 +#: utils/adt/timestamp.c:3404 utils/adt/timestamp.c:3777 +#: utils/adt/timestamp.c:3901 utils/adt/timestamp.c:4451 #, c-format msgid "interval out of range" msgstr "interval вне диапазона" -#: 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 "неверный модификатор типа INTERVAL" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d): точность должна быть неотрицательна" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d): точность уменьшена до максимально возможной: %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "точность interval(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "вычитать бесконечные значения timestamp нельзя" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3937 utils/adt/timestamp.c:4120 #, c-format msgid "origin out of range" msgstr "начало вне диапазона" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3942 utils/adt/timestamp.c:4125 #, 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 +#: utils/adt/timestamp.c:3949 utils/adt/timestamp.c:4132 #, 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: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: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: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:4346 -#, c-format -msgid "" -"interval units \"%s\" not supported because months usually have fractional " -"weeks" -msgstr "" -"единицы интервала \"%s\" не поддерживаются, так как в месяцах дробное число " -"недель" - -#: 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:4368 utils/adt/timestamp.c:5338 +#: utils/adt/timestamp.c:4445 #, 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 @@ -27200,58 +28118,62 @@ msgstr "слово слишком длинное (%ld Б, при максиму msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "строка слишком длинна для tsvector (%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:2429 +#: utils/adt/tsvector_op.c:2434 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запрос ts_stat должен вернуть один столбец tsvector" -#: utils/adt/tsvector_op.c:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "столбец \"%s\" типа tsvector не существует" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "столбец \"%s\" должен иметь тип tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "столбец конфигурации \"%s\" не существует" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "столбец \"%s\" должен иметь тип regconfig" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значение столбца конфигурации \"%s\" не должно быть null" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "имя конфигурации текстового поиска \"%s\" должно указываться со схемой" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "столбец \"%s\" имеет не символьный тип" @@ -27272,7 +28194,7 @@ 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 "не удалось сгенерировать случайные значения" @@ -27317,9 +28239,9 @@ msgstr "неверная длина во внешней строке битов" msgid "bit string too long for type bit varying(%d)" msgstr "строка битов не умещается в тип bit varying(%d)" -#: 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:3340 -#: utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "подстрока должна иметь неотрицательную длину" @@ -27345,7 +28267,7 @@ msgstr "" msgid "bit index %d out of valid range (0..%d)" msgstr "индекс бита %d вне диапазона 0..%d" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "значением бита должен быть 0 или 1" @@ -27360,198 +28282,200 @@ 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:1516 +#: 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:1209 utils/adt/varlena.c:1956 +#: 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:1615 utils/adt/varlena.c:1628 +#: 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:1643 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не удалось сравнить строки в Unicode: %m" -#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "ошибка в библиотеке сортировки: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "не удалось сгенерировать ключ сортировки: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "индекс %d вне диапазона 0..%d" -#: utils/adt/varlena.c:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "индекс %lld вне диапазона 0..%lld" -#: utils/adt/varlena.c:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "позиция поля должна быть отлична от 0" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "незавершённый спецификатор типа format()" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Для представления одного знака \"%%\" запишите \"%%%%\"." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "нераспознанный спецификатор типа format(): \"%.*s\"" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "мало аргументов для format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "число вне диапазона" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат ссылается на аргумент 0, но аргументы нумеруются с 1" -#: utils/adt/varlena.c:6069 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "указание аргумента ширины должно оканчиваться \"$\"" -#: utils/adt/varlena.c:6114 +#: utils/adt/varlena.c:6088 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "значения null нельзя представить в виде SQL-идентификатора" -#: utils/adt/varlena.c:6240 +#: utils/adt/varlena.c:6214 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "" "нормализацию Unicode можно выполнять, только если кодировка сервера — UTF8" -#: utils/adt/varlena.c:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "неверная форма нормализации: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "неверный код символа Unicode: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "" "Спецкоды Unicode должны иметь вид \\XXXX, \\+XXXXXX, \\uXXXX или \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "аргумент ntile должен быть больше нуля" -#: 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 должен быть больше нуля" #: utils/adt/xid8funcs.c:117 #, c-format -msgid "transaction ID %s is in the future" -msgstr "идентификатор транзакции %s относится к будущему" +msgid "transaction ID %llu is in the future" +msgstr "ID транзакции %llu относится к будущему" -#: utils/adt/xid8funcs.c:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "неверное внешнее представление pg_snapshot" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:232 #, c-format msgid "unsupported XML feature" msgstr "XML-функции не поддерживаются" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:233 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Для этой функциональности в сервере не хватает поддержки libxml." -#: utils/adt/xml.c:243 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:252 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:495 utils/adt/xml.c:500 #, c-format msgid "invalid XML comment" msgstr "ошибка в XML-комментарии" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:629 #, c-format msgid "not an XML document" msgstr "не XML-документ" -#: utils/adt/xml.c:779 utils/adt/xml.c:802 +#: utils/adt/xml.c:788 utils/adt/xml.c:811 #, c-format msgid "invalid XML processing instruction" msgstr "неправильная XML-инструкция обработки (PI)" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:789 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "назначением XML-инструкции обработки (PI) не может быть \"%s\"." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:812 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-инструкция обработки (PI) не может содержать \"?>\"." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:891 #, c-format msgid "xmlvalidate is not implemented" msgstr "функция xmlvalidate не реализована" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:970 #, c-format msgid "could not initialize XML library" msgstr "не удалось инициализировать библиотеку XML" -#: utils/adt/xml.c:962 +#: utils/adt/xml.c:971 #, c-format msgid "" -"libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "другой тип char в libxml2: sizeof(char)=%u, sizeof(xmlChar)=%u." +"libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "" +"В libxml2 оказался несовместимый тип char: sizeof(char)=%zu, " +"sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1057 #, c-format msgid "could not set up XML error handler" msgstr "не удалось установить обработчик XML-ошибок" -#: utils/adt/xml.c:1049 +#: utils/adt/xml.c:1058 #, c-format msgid "" "This probably indicates that the version of libxml2 being used is not " @@ -27560,99 +28484,99 @@ msgstr "" "Возможно, это означает, что используемая версия libxml2 несовместима с " "заголовочными файлами libxml2, с которыми был собран PostgreSQL." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:1945 msgid "Invalid character value." msgstr "Неверный символ." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:1948 msgid "Space required." msgstr "Требуется пробел." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:1951 msgid "standalone accepts only 'yes' or 'no'." msgstr "значениями атрибута standalone могут быть только 'yes' и 'no'." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:1954 msgid "Malformed declaration: missing version." msgstr "Ошибочное объявление: не указана версия." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:1957 msgid "Missing encoding in text declaration." msgstr "В объявлении не указана кодировка." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:1960 msgid "Parsing XML declaration: '?>' expected." msgstr "Ошибка при разборе XML-объявления: ожидается '?>'." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:1963 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Нераспознанный код ошибки libxml: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2220 #, 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:2242 utils/adt/xml.c:2269 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML не поддерживает бесконечность в timestamp." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:2685 #, c-format msgid "invalid query" msgstr "неверный запрос" -#: utils/adt/xml.c:2768 +#: utils/adt/xml.c:2777 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "портал \"%s\" не возвращает кортежи" -#: utils/adt/xml.c:4020 +#: utils/adt/xml.c:4029 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неправильный массив с сопоставлениями пространств имён XML" -#: utils/adt/xml.c:4021 +#: utils/adt/xml.c:4030 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Массив должен быть двухмерным и содержать 2 элемента по второй оси." -#: utils/adt/xml.c:4045 +#: utils/adt/xml.c:4054 #, c-format msgid "empty XPath expression" msgstr "пустое выражение XPath" -#: utils/adt/xml.c:4097 +#: utils/adt/xml.c:4106 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ни префикс, ни URI пространства имён не может быть null" -#: utils/adt/xml.c:4104 +#: utils/adt/xml.c:4113 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "не удалось зарегистрировать пространство имён XML с префиксом \"%s\" и URI " "\"%s\"" -#: utils/adt/xml.c:4455 +#: utils/adt/xml.c:4464 #, c-format msgid "DEFAULT namespace is not supported" msgstr "пространство имён DEFAULT не поддерживается" -#: utils/adt/xml.c:4484 +#: utils/adt/xml.c:4493 #, c-format msgid "row path filter must not be empty string" msgstr "путь отбираемых строк не должен быть пустым" -#: utils/adt/xml.c:4515 +#: utils/adt/xml.c:4524 #, c-format msgid "column path filter must not be empty string" msgstr "путь отбираемого столбца не должен быть пустым" -#: utils/adt/xml.c:4659 +#: utils/adt/xml.c:4668 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее столбец, возвратило более одного значения" @@ -27692,38 +28616,49 @@ msgstr "" msgid "cached plan must not change result type" msgstr "в кешированном плане не должен изменяться тип результата" -#: utils/cache/relcache.c:6325 +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "значение relfilenode для кучи не задано в режиме двоичного обновления" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "" +"неожиданный запрос нового значения relfilenode в режиме двоичного обновления" + +#: utils/cache/relcache.c:6473 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "создать файл инициализации для кеша отношений \"%s\" не удалось: %m" -#: utils/cache/relcache.c:6327 +#: utils/cache/relcache.c:6475 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продолжаем всё равно, хотя что-то не так." -#: utils/cache/relcache.c:6649 +#: utils/cache/relcache.c:6797 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не удалось стереть файл кеша \"%s\": %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:591 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "" "выполнить PREPARE для транзакции, изменившей сопоставление отношений, нельзя" -#: utils/cache/relmapper.c:767 +#: utils/cache/relmapper.c:839 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл сопоставления отношений \"%s\" содержит неверные данные" -#: utils/cache/relmapper.c:777 +#: utils/cache/relmapper.c:849 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "ошибка контрольной суммы в файле сопоставления отношений \"%s\"" -#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "тип записи не зарегистрирован" @@ -27738,101 +28673,101 @@ msgstr "ЛОВУШКА: Исключительное условие: невер msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" msgstr "ЛОВУШКА: %s(\"%s\", файл: \"%s\", строка: %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 "произошла ошибка до готовности подсистемы обработки сообщений\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "открыть файл \"%s\" как stderr не удалось: %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "открыть файл \"%s\" как stdout не удалось: %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 "[н/д]" -#: 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 "отсутствует текст ошибки" -#: 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 " (символ %d)" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "ПОДРОБНОСТИ: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "ПОДСКАЗКА: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "ЗАПРОС: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "КОНТЕКСТ: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "ПОЛОЖЕНИЕ: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "ПОЛОЖЕНИЕ: %s:%d\n" -#: utils/error/elog.c:3094 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "СТЕК: " -#: utils/error/elog.c:3108 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "ОПЕРАТОР: " -#: utils/error/elog.c:3496 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "ОТЛАДКА" -#: utils/error/elog.c:3500 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "СООБЩЕНИЕ" -#: utils/error/elog.c:3503 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "ИНФОРМАЦИЯ" -#: utils/error/elog.c:3506 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "ЗАМЕЧАНИЕ" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "ПРЕДУПРЕЖДЕНИЕ" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ОШИБКА" -#: utils/error/elog.c:3516 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "ВАЖНО" -#: utils/error/elog.c:3519 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "ПАНИКА" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "не удалось найти функцию \"%s\" в файле \"%s\"" @@ -27862,51 +28797,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:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "доступ к библиотеке \"%s\" не разрешён" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "неправильный макрос в пути динамической библиотеки: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "параметр 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 "" @@ -27937,19 +28882,19 @@ msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "" "версия API (%d), выданная информационной функцией \"%s\", не поддерживается" -#: utils/fmgr/fmgr.c:1999 +#: utils/fmgr/fmgr.c:1985 #, c-format msgid "operator class options info is absent in function call context" msgstr "" "информация о параметрах класса операторов отсутствует в контексте вызова " "функции" -#: 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 "функция языковой проверки %u вызвана для языка %u (а не %u)" -#: utils/fmgr/funcapi.c:420 +#: utils/fmgr/funcapi.c:498 #, c-format msgid "" "could not determine actual result type for function \"%s\" declared to " @@ -27958,126 +28903,126 @@ msgstr "" "не удалось определить действительный тип результата для функции \"%s\", " "объявленной как возвращающая тип %s" -#: utils/fmgr/funcapi.c:565 +#: utils/fmgr/funcapi.c:643 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "" "аргумент, объявленный как \"%s\", содержит не диапазонный тип, а тип %s" -#: utils/fmgr/funcapi.c:648 +#: utils/fmgr/funcapi.c:726 #, c-format msgid "could not find multirange type for data type %s" msgstr "тип мультидиапазона для типа данных %s не найден" -#: utils/fmgr/funcapi.c:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "число псевдонимов не совпадает с числом столбцов" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "псевдоним столбца не указан" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "не удалось определить описание строки для функции, возвращающей запись" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:319 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не удалось считать права на каталог \"%s\": %m" -#: utils/init/miscinit.c:327 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "указанный каталог данных \"%s\" не существует" -#: utils/init/miscinit.c:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "владелец каталога данных \"%s\" определён неверно" -#: utils/init/miscinit.c:345 +#: 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:363 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "для каталога данных \"%s\" установлены неправильные права доступа" -#: utils/init/miscinit.c:365 +#: 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7837 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "параметр \"%s\" нельзя задать в рамках операции с ограничениями по " "безопасности" -#: utils/init/miscinit.c:718 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: utils/init/miscinit.c:748 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для роли \"%s\" вход запрещён" -#: utils/init/miscinit.c:766 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "слишком много подключений для роли \"%s\"" -#: utils/init/miscinit.c:826 +#: utils/init/miscinit.c:849 #, c-format msgid "permission denied to set session authorization" msgstr "нет прав для смены объекта авторизации в сеансе" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:932 #, c-format msgid "invalid role OID: %u" msgstr "неверный OID роли: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:986 #, c-format msgid "database system is shut down" msgstr "система БД выключена" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1073 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не удалось создать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1087 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не удалось открыть файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1094 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не удалось прочитать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1103 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокировки \"%s\" пуст" -#: utils/init/miscinit.c:1081 +#: utils/init/miscinit.c:1104 #, c-format msgid "" "Either another server is starting, or the lock file is the remnant of a " @@ -28086,38 +29031,38 @@ msgstr "" "Либо сейчас запускается другой сервер, либо этот файл остался в результате " "сбоя при предыдущем запуске." -#: utils/init/miscinit.c:1125 +#: utils/init/miscinit.c:1148 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокировки \"%s\" уже существует" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1152 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1154 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Другой экземпляр postmaster (PID %d) работает с каталогом данных \"%s\"?" -#: utils/init/miscinit.c:1134 +#: utils/init/miscinit.c:1157 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postgres (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1136 +#: utils/init/miscinit.c:1159 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Другой экземпляр postmaster (PID %d) использует файл сокета \"%s\"?" -#: utils/init/miscinit.c:1187 +#: utils/init/miscinit.c:1210 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не удалось стереть старый файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1189 +#: utils/init/miscinit.c:1212 #, c-format msgid "" "The file seems accidentally left over, but it could not be removed. Please " @@ -28126,48 +29071,48 @@ msgstr "" "Кажется, файл сохранился по ошибке, но удалить его не получилось. " "Пожалуйста, удалите файл вручную и повторите попытку." -#: utils/init/miscinit.c:1226 utils/init/miscinit.c:1240 -#: utils/init/miscinit.c:1251 +#: utils/init/miscinit.c:1249 utils/init/miscinit.c:1263 +#: utils/init/miscinit.c:1274 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не удалось записать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10409 +#: utils/init/miscinit.c:1385 utils/init/miscinit.c:1527 utils/misc/guc.c:10843 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1515 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не удалось открыть файл \"%s\": %m; ошибка игнорируется" -#: utils/init/miscinit.c:1517 +#: utils/init/miscinit.c:1540 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокировки \"%s\" содержит неверный PID: %ld вместо %ld" -#: utils/init/miscinit.c:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1579 utils/init/miscinit.c:1595 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не является каталогом данных" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1581 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" отсутствует." -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1597 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" содержит неприемлемые данные." -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1599 #, c-format msgid "You might need to initdb." msgstr "Возможно, вам нужно выполнить initdb." -#: utils/init/miscinit.c:1584 +#: utils/init/miscinit.c:1607 #, c-format msgid "" "The data directory was initialized by PostgreSQL version %s, which is not " @@ -28176,87 +29121,87 @@ msgstr "" "Каталог данных инициализирован сервером PostgreSQL версии %s, несовместимой " "с данной версией (%s)." -#: utils/init/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "подключение для репликации авторизовано: пользователь=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "подключение авторизовано: пользователь=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr " база=%s" -#: utils/init/postinit.c:263 +#: utils/init/postinit.c:267 #, c-format msgid " application_name=%s" msgstr " приложение=%s" -#: utils/init/postinit.c:268 +#: utils/init/postinit.c:272 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL включён (протокол=%s, шифр=%s, битов=%d)" -#: utils/init/postinit.c:280 +#: utils/init/postinit.c:284 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" msgstr " GSS (аутентификация=%s, шифрование=%s, принципал=%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 "нет" -#: 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 "да" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (аутентификация=%s, шифрование=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "база данных \"%s\" исчезла из pg_database" -#: utils/init/postinit.c:325 +#: 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:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "база \"%s\" не принимает подключения в данный момент" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "доступ к базе \"%s\" запрещён" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "Пользователь не имеет привилегии CONNECT." -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "слишком много подключений к БД \"%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 "локаль БД несовместима с операционной системой" -#: utils/init/postinit.c:399 +#: utils/init/postinit.c:410 #, c-format msgid "" "The database was initialized with LC_COLLATE \"%s\", which is not " @@ -28265,7 +29210,7 @@ msgstr "" "База данных была инициализирована с параметром LC_COLLATE \"%s\", но сейчас " "setlocale() не воспринимает его." -#: 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." @@ -28273,7 +29218,7 @@ msgstr "" "Пересоздайте базу данных с другой локалью или установите поддержку нужной " "локали." -#: 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 " @@ -28282,36 +29227,49 @@ msgstr "" "База данных была инициализирована с параметром LC_CTYPE \"%s\", но сейчас " "setlocale() не воспринимает его." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "в этой системе баз данных не создано ни одной роли" +msgid "database \"%s\" has a collation version mismatch" +msgstr "несовпадение версии для правила сортировки в базе данных \"%s\"" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Вы должны немедленно выполнить CREATE USER \"%s\" CREATEUSER;." +msgid "" +"The database was created using collation version %s, but the operating " +"system provides version %s." +msgstr "" +"База данных была создана с версией правила сортировки %s, но операционная " +"система предоставляет версию %s." -#: utils/init/postinit.c:798 +#: utils/init/postinit.c:471 #, c-format -msgid "new replication connections are not allowed during database shutdown" +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:802 +#: utils/init/postinit.c:839 #, 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:840 +#, c-format +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Вы должны немедленно выполнить CREATE USER \"%s\" CREATEUSER;." -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "" "нужно быть суперпользователем, чтобы подключиться в режиме двоичного " "обновления" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "" "remaining connection slots are reserved for non-replication superuser " @@ -28320,38 +29278,33 @@ msgstr "" "оставшиеся слоты подключений зарезервированы для подключений " "суперпользователя (не для репликации)" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "" "для запуска процесса walsender требуется роль репликации или права " "суперпользователя" -#: utils/init/postinit.c:904 -#, c-format -msgid "database %u does not exist" -msgstr "база данных %u не существует" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Похоже, она только что была удалена или переименована." -#: utils/init/postinit.c:1001 +#: utils/init/postinit.c:1016 +#, c-format +msgid "database %u does not exist" +msgstr "база данных %u не существует" + +#: utils/init/postinit.c:1025 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "подключиться к некорректной базе \"%s\" нельзя" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Подкаталог базы данных \"%s\" отсутствует." -#: utils/init/postinit.c:1026 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "ошибка доступа к каталогу \"%s\": %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -28419,185 +29372,189 @@ msgstr "" "для символа с последовательностью байт %s из кодировки \"%s\" нет " "эквивалента в \"%s\"" -#: utils/misc/guc.c:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Разное" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Расположения файлов" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Подключения и аутентификация / Параметры подключений" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Подключения и аутентификация / Аутентификация" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Подключения и аутентификация / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Использование ресурсов / Память" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Использование ресурсов / Диск" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Использование ресурсов / Ресурсы ядра" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Использование ресурсов / Задержка очистки по стоимости" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Использование ресурсов / Фоновая запись" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Использование ресурсов / Асинхронное поведение" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Журнал WAL / Параметры" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Журнал WAL / Контрольные точки" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Журнал WAL / Архивация" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Журнал WAL / Восстановление" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Журнал WAL / Восстановление из архива" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Журнал WAL / Цель восстановления" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Репликация / Передающие серверы" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Репликация / Ведущий сервер" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Репликация / Резервные серверы" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Репликация / Подписчики" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Настройка запросов / Конфигурация методов планировщика" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Настройка запросов / Константы стоимости для планировщика" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Настройка запросов / Генетический оптимизатор запросов" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Настройка запросов / Другие параметры планировщика" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Отчёты и протоколы / Куда записывать" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Отчёты и протоколы / Когда записывать" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Отчёты и протоколы / Что записывать" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Отчёты и протоколы / Заголовок процесса" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Статистика / Мониторинг" -#: utils/misc/guc.c:778 -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:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Автоочистка" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Параметры клиентских подключений по умолчанию / Поведение команд" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "" "Параметры клиентских подключений по умолчанию / Языковая среда и форматы" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "" "Параметры клиентских подключений по умолчанию / Предзагрузка разделяемых " "библиотек" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Параметры клиентских подключений по умолчанию / Другие параметры" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Управление блокировками" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Версия и совместимость платформ / Предыдущие версии PostgreSQL" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Версия и совместимость платформ / Другие платформы и клиенты" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Обработка ошибок" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Предопределённые параметры" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Внесистемные параметры" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Параметры для разработчиков" -#: utils/misc/guc.c:860 +#: 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:897 +#: utils/misc/guc.c:955 msgid "" "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " "and \"d\"." @@ -28605,91 +29562,91 @@ msgstr "" "Допустимые единицы измерения для этого параметра: \"us\", \"ms\", \"s\", " "\"min\", \"h\" и \"d\"." -#: utils/misc/guc.c:959 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "" "Разрешает планировщику использовать планы последовательного сканирования." -#: utils/misc/guc.c:969 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Разрешает планировщику использовать планы сканирования по индексу." -#: utils/misc/guc.c:979 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Разрешает планировщику использовать планы сканирования только индекса." -#: utils/misc/guc.c:989 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "" "Разрешает планировщику использовать планы сканирования по битовой карте." -#: utils/misc/guc.c:999 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Разрешает планировщику использовать планы сканирования TID." -#: utils/misc/guc.c:1009 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Разрешает планировщику использовать шаги с явной сортировкой." -#: utils/misc/guc.c:1019 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "" "Разрешает планировщику использовать шаги с инкрементальной сортировкой." -#: utils/misc/guc.c:1028 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Разрешает планировщику использовать планы агрегирования по хешу." -#: utils/misc/guc.c:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Разрешает планировщику использовать материализацию." # well-spelled: мемоизацию -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Разрешает планировщику использовать мемоизацию." -#: utils/misc/guc.c:1058 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "" "Разрешает планировщику использовать планы соединения с вложенными циклами." -#: utils/misc/guc.c:1068 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Разрешает планировщику использовать планы соединения слиянием." -#: utils/misc/guc.c:1078 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Разрешает планировщику использовать планы соединения по хешу." -#: utils/misc/guc.c:1088 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Разрешает планировщику использовать планы сбора слиянием." -#: utils/misc/guc.c:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Включает соединения с учётом секционирования." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Включает агрегирование и группировку с учётом секционирования." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Разрешает планировщику использовать планы параллельного добавления." -#: utils/misc/guc.c:1128 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "" "Разрешает планировщику использовать планы параллельного соединения по хешу." -#: utils/misc/guc.c:1138 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "" "Включает устранение секций во время планирования и во время выполнения " "запросов." -#: utils/misc/guc.c:1139 +#: 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." @@ -28697,62 +29654,64 @@ msgstr "" "Разрешает планировщику и исполнителю запросов сопоставлять границы секций с " "условиями в запросе и выделять отдельные секции для сканирования." -#: utils/misc/guc.c:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "Разрешает планировщику использовать планы асинхронного добавления." -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Включает генетическую оптимизацию запросов." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Этот алгоритм пытается построить план без полного перебора." -#: utils/misc/guc.c:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Показывает, является ли текущий пользователь суперпользователем." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Включает объявление сервера посредством Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Записывает время фиксации транзакций." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Разрешает SSL-подключения." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "Также использовать ssl_passphrase_command при перезагрузке сервера." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "" +"Определяет, будет ли вызываться ssl_passphrase_command при перезагрузке " +"сервера." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Назначает более приоритетным набор шифров сервера." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Принудительная запись изменений на диск." -#: utils/misc/guc.c:1228 +#: utils/misc/guc.c:1287 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 " +"that updates are physically written to disk. This ensures that a database " "cluster will recover to a consistent state after an operating system or " "hardware crash." msgstr "" -"Сервер будет вызывать системную функцию fsync() в разных местах для гарантии " -"физической записи данных на диск. Это позволит привести кластер БД в " -"целостное состояние после отказа ОС или оборудования." +"Сервер будет вызывать в определённые моменты системную функцию fsync(), " +"обеспечивающую физическую запись данных на диск. Тем самым гарантируется, " +"что кластер БД придёт в целостное состояние после отказа ОС или оборудования." -#: utils/misc/guc.c:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Продолжает обработку при ошибке контрольной суммы." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 msgid "" "Detection of a checksum failure normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting ignore_checksum_failure to " @@ -28766,11 +29725,11 @@ msgstr "" "что может привести к сбоям или другим серьёзным проблемам. Это имеет место, " "только если включён контроль целостности страниц." -#: utils/misc/guc.c:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Продолжает обработку при повреждении заголовков страниц." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 msgid "" "Detection of a damaged page header normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting zero_damaged_pages to true " @@ -28784,12 +29743,12 @@ msgstr "" "продолжит работу. Это приведёт к потере данных, а именно строк в " "повреждённой странице." -#: utils/misc/guc.c:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "" "Продолжает восстановление после ошибок, связанных с неправильными страницами." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 msgid "" "Detection of WAL records having references to invalid pages during recovery " "causes PostgreSQL to raise a PANIC-level error, aborting the recovery. " @@ -28808,12 +29767,12 @@ msgstr "" "проблемам. Данный параметр действует только при восстановлении или в режиме " "резервного сервера." -#: utils/misc/guc.c:1287 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "" "Запись полных страниц в WAL при первом изменении после контрольной точки." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1347 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 " @@ -28826,7 +29785,7 @@ msgstr "" "при первом изменении после контрольной точки, что позволяет полностью " "восстановить данные." -#: utils/misc/guc.c:1301 +#: utils/misc/guc.c:1360 msgid "" "Writes full pages to WAL when first modified after a checkpoint, even for a " "non-critical modification." @@ -28834,87 +29793,83 @@ msgstr "" "Запись полных страниц в WAL при первом изменении после контрольной точки, " "даже при некритическом изменении." -#: utils/misc/guc.c:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Сжимать данные при записи полных страниц в журнал." - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." msgstr "Записывать нули в новые файлы WAL перед первым использованием." -#: utils/misc/guc.c:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "Перерабатывать файлы WAL, производя переименование." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Протоколировать каждую контрольную точку." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Протоколировать устанавливаемые соединения." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Протоколировать конец сеанса, отмечая длительность." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Протоколировать каждую команду репликации." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показывает, включены ли проверки истинности на работающем сервере." -#: utils/misc/guc.c:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Завершать сеансы при любой ошибке." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Перезапускать систему БД при аварии серверного процесса." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." msgstr "Удалять временные файлы после аварии обслуживающего процесса." -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Протоколировать длительность каждого выполненного SQL-оператора." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "Протоколировать дерево разбора для каждого запроса." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Протоколировать перезаписанное дерево разбора для каждого запроса." -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Протоколировать план выполнения каждого запроса." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Отступы при отображении деревьев разбора и плана запросов." -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "Запись статистики разбора запросов в протокол сервера." -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "Запись статистики планирования в протокол сервера." -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "Запись статистики выполнения запросов в протокол сервера." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "Запись общей статистики производительности в протокол сервера." -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 msgid "" "Logs system resource usage statistics (memory and CPU) on various B-tree " "operations." @@ -28922,11 +29877,11 @@ msgstr "" "Фиксировать статистику использования системных ресурсов (памяти и " "процессора) при различных операциях с b-деревом." -#: utils/misc/guc.c:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Собирает информацию о выполняющихся командах." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 msgid "" "Enables the collection of information on the currently executing command of " "each session, along with the time at which that command began execution." @@ -28934,70 +29889,70 @@ msgstr "" "Включает сбор информации о командах, выполняющихся во всех сеансах, а также " "время запуска команды." -#: utils/misc/guc.c:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "Собирает статистику активности в БД." -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." msgstr "Собирает статистику по времени активности ввода/вывода." -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." msgstr "Собирает статистику по времени активности ввода/вывода WAL." -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 msgid "Updates the process title to show the active SQL command." msgstr "Выводит в заголовок процесса активную SQL-команду." -#: utils/misc/guc.c:1555 +#: utils/misc/guc.c:1604 msgid "" "Enables updating of the process title every time a new SQL command is " "received by the server." msgstr "Отражает в заголовке процесса каждую SQL-команду, поступающую серверу." -#: utils/misc/guc.c:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Запускает подпроцесс автоочистки." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерирует отладочные сообщения для LISTEN и NOTIFY." -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Выдавать информацию о применяемых блокировках." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Выдавать информацию о применяемых пользовательских блокировках." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Выдавать информацию о применяемых лёгких блокировках." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 msgid "" "Dumps information about all current locks when a deadlock timeout occurs." msgstr "" "Выводить информацию обо всех текущих блокировках в случае тайм-аута при " "взаимоблокировке." -#: utils/misc/guc.c:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Протоколировать длительные ожидания в блокировках." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "" "Протоколировать события ожидания разрешения конфликтов при восстановлении на " "ведомом." -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "Записывать имя узла в протоколы подключений." -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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 " @@ -29009,11 +29964,11 @@ msgstr "" "параметр, но учтите, что это может значительно повлиять на " "производительность." -#: utils/misc/guc.c:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Обрабатывать \"expr=NULL\" как \"expr IS NULL\"." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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 " @@ -29025,25 +29980,25 @@ msgstr "" "совпадает с NULL, и false в противном случае. По правилам expr = NULL всегда " "должно возвращать null (неопределённость)." -#: utils/misc/guc.c:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Включает связывание имён пользователей с базами данных." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 msgid "Sets the default read-only status of new transactions." msgstr "" "Устанавливает режим \"только чтение\" по умолчанию для новых транзакций." -#: utils/misc/guc.c:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "Устанавливает режим \"только чтение\" для текущей транзакции." -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "" "Устанавливает режим отложенного выполнения по умолчанию для новых транзакций." -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1762 msgid "" "Whether to defer a read-only serializable transaction until it can be " "executed with no possible serialization failures." @@ -29051,26 +30006,26 @@ msgstr "" "Определяет, откладывать ли сериализуемую транзакцию \"только чтение\" до " "момента, когда сбой сериализации будет исключён." -#: utils/misc/guc.c:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Включает защиту на уровне строк." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 msgid "When enabled, row security will be applied to all users." msgstr "" "Когда включена, защита на уровне строк распространяется на всех " "пользователей." -#: utils/misc/guc.c:1732 +#: utils/misc/guc.c:1781 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "" "Проверять тело подпрограмм в момент CREATE FUNCTION и CREATE PROCEDURE." -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Разрешать ввод элементов NULL в массивах." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 msgid "" "When turned on, unquoted NULL in an array input value means a null value; " "otherwise it is taken literally." @@ -29078,73 +30033,73 @@ msgstr "" "Когда этот параметр включён, NULL без кавычек при вводе в массив " "воспринимается как значение NULL, иначе — как строка." -#: utils/misc/guc.c:1758 +#: utils/misc/guc.c:1807 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "" "WITH OIDS более не поддерживается; единственное допустимое значение — false." -#: utils/misc/guc.c:1768 +#: utils/misc/guc.c:1817 msgid "" "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "Запускает подпроцесс для чтения stderr и/или csv-файлов и записи в файлы " "протоколов." -#: utils/misc/guc.c:1777 +#: utils/misc/guc.c:1826 msgid "Truncate existing log files of same name during log rotation." msgstr "" "Очищать уже существующий файл с тем же именем при прокручивании протокола." -#: utils/misc/guc.c:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "Выдавать сведения об использовании ресурсов при сортировке." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "Выдавать отладочные сообщения для синхронного сканирования." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "" "Разрешить ограниченную сортировку с применением пирамидальной сортировки." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Выдавать отладочные сообщения, связанные с WAL." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Показывает, является ли реализация даты/времени целочисленной." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 msgid "" "Sets whether Kerberos and GSSAPI user names should be treated as case-" "insensitive." msgstr "" "Включает регистронезависимую обработку имён пользователей Kerberos и GSSAPI." -#: utils/misc/guc.c:1863 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Предупреждения о спецсимволах '\\' в обычных строках." -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Включает буквальную обработку символов '\\' в строках '...'." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Включить синхронизацию последовательного сканирования." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Определяет, включать ли транзакцию в целевую точку восстановления." -#: utils/misc/guc.c:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "" "Разрешает принимать новые подключения и запросы в процессе восстановления." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 msgid "" "Allows feedback from a hot standby to the primary that will avoid query " "conflicts." @@ -29152,19 +30107,19 @@ msgstr "" "Разрешает обратную связь сервера горячего резерва с основным для " "предотвращения конфликтов при длительных запросах." -#: utils/misc/guc.c:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Показывает, активен ли в настоящий момент режим горячего резерва." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Разрешает модифицировать структуру системных таблиц." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Запрещает использование системных индексов." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 msgid "" "It does not prevent updating the indexes, so it is safe to use. The worst " "consequence is slowness." @@ -29172,20 +30127,20 @@ msgstr "" "При этом индексы продолжают обновляться, так что данное поведение безопасно. " "Худшее следствие - замедление." -#: utils/misc/guc.c:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "" "Позволяет размещать табличные пространства внутри pg_tblspc; предназначается " "для тестирования." -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 msgid "" "Enables backward compatibility mode for privilege checks on large objects." msgstr "" "Включает режим обратной совместимости при проверке привилегий для больших " "объектов." -#: utils/misc/guc.c:1970 +#: utils/misc/guc.c:2019 msgid "" "Skips privilege checks when reading or modifying large objects, for " "compatibility with PostgreSQL releases prior to 9.0." @@ -29193,66 +30148,66 @@ msgstr "" "Пропускает проверки привилегий при чтении или изменении больших объектов " "(для совместимости с версиями PostgreSQL до 9.0)." -#: utils/misc/guc.c:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "" "Генерируя SQL-фрагменты, заключать все идентификаторы в двойные кавычки." -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показывает, включён ли в этом кластере контроль целостности данных." -#: utils/misc/guc.c:2001 +#: utils/misc/guc.c:2050 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "" "Добавлять последовательный номер в сообщения syslog во избежание подавления " "повторов." -#: utils/misc/guc.c:2011 +#: utils/misc/guc.c:2060 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "" "Разбивать сообщения, передаваемые в syslog, по строкам размером не больше " "1024 байт." -#: utils/misc/guc.c:2021 +#: utils/misc/guc.c:2070 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "" "Определяет, будут ли узлы сбора и сбора слиянием также выполнять подпланы." -#: utils/misc/guc.c:2022 +#: utils/misc/guc.c:2071 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "" "Должны ли узлы сбора также выполнять подпланы или только собирать кортежи?" -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Включить JIT-компиляцию." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "Регистрировать JIT-скомпилированные функции в отладчике." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Выводить битовый код LLVM для облегчения отладки JIT." -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Включить JIT-компиляцию выражений." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "Регистрировать JIT-компилируемые функции в профилировщике perf." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Разрешить JIT-компиляцию кода преобразования кортежей." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 msgid "Whether to continue running after a failure to sync data files." msgstr "Продолжать работу после ошибки при сохранении файлов данных на диске." -#: utils/misc/guc.c:2119 +#: utils/misc/guc.c:2168 msgid "" "Sets whether a WAL receiver should create a temporary replication slot if no " "permanent slot is configured." @@ -29260,27 +30215,28 @@ msgstr "" "Определяет, должен ли приёмник WAL создавать временный слот репликации, если " "не настроен постоянный слот." -#: utils/misc/guc.c:2137 +#: utils/misc/guc.c:2186 msgid "" -"Forces a switch to the next WAL file if a new file has not been started " -"within N seconds." +"Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "" -"Принудительно переключаться на следующий файл WAL, если начать новый файл за " -"N секунд не удалось." +"Задаёт время задержки перед принудительным переключением на следующий файл " +"WAL." -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Ждать N секунд при подключении после проверки подлинности." +#: utils/misc/guc.c:2197 +msgid "" +"Sets the amount of time to wait after authentication on connection startup." +msgstr "" +"Задаёт время ожидания после аутентификации при установлении соединения." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "Это позволяет подключить к процессу отладчик." -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Устанавливает ориентир статистики по умолчанию." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 msgid "" "This applies to table columns that have not had a column-specific target set " "via ALTER TABLE SET STATISTICS." @@ -29288,13 +30244,13 @@ msgstr "" "Это значение распространяется на столбцы таблицы, для которых ориентир " "статистики не задан явно через ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2168 +#: utils/misc/guc.c:2218 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "Задаёт предел для списка FROM, при превышении которого подзапросы не " "сворачиваются." -#: utils/misc/guc.c:2170 +#: utils/misc/guc.c:2220 msgid "" "The planner will merge subqueries into upper queries if the resulting FROM " "list would have no more than this many items." @@ -29302,13 +30258,13 @@ msgstr "" "Планировщик объединит вложенные запросы с внешними, если в полученном списке " "FROM будет не больше заданного числа элементов." -#: utils/misc/guc.c:2181 +#: utils/misc/guc.c:2231 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "Задаёт предел для списка FROM, при превышении которого конструкции JOIN " "сохраняются." -#: utils/misc/guc.c:2183 +#: utils/misc/guc.c:2233 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." @@ -29316,34 +30272,34 @@ msgstr "" "Планировщик будет сносить явные конструкции JOIN в списки FROM, пока в " "результирующем списке не больше заданного числа элементов." -#: utils/misc/guc.c:2194 +#: utils/misc/guc.c:2244 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "" "Задаёт предел для списка FROM, при превышении которого применяется GEQO." -#: utils/misc/guc.c:2204 +#: utils/misc/guc.c:2254 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "" "GEQO: оценка усилий для планирования, задающая значения по умолчанию для " "других параметров GEQO." -#: utils/misc/guc.c:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: число особей в популяции." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "При нуле выбирается подходящее значение по умолчанию." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: число итераций алгоритма." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Задаёт интервал ожидания в блокировке до проверки на взаимоблокировку." -#: utils/misc/guc.c:2247 +#: utils/misc/guc.c:2297 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing archived WAL data." @@ -29351,7 +30307,7 @@ msgstr "" "Задаёт максимальную задержку до отмены запроса, когда сервер горячего " "резерва обрабатывает данные WAL из архива." -#: utils/misc/guc.c:2258 +#: utils/misc/guc.c:2308 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing streamed WAL data." @@ -29359,13 +30315,13 @@ msgstr "" "Задаёт максимальную задержку до отмены запроса, когда сервер горячего " "резерва обрабатывает данные WAL из потока." -#: utils/misc/guc.c:2269 +#: utils/misc/guc.c:2319 msgid "Sets the minimum delay for applying changes during recovery." msgstr "" "Задаёт минимальную задержку для применения изменений в процессе " "восстановления." -#: utils/misc/guc.c:2280 +#: utils/misc/guc.c:2330 msgid "" "Sets the maximum interval between WAL receiver status reports to the sending " "server." @@ -29373,41 +30329,59 @@ msgstr "" "Задаёт максимальный интервал между отчётами о состоянии приёмника WAL, " "отправляемыми передающему серверу." -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2341 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "" "Задаёт предельное время ожидания для получения данных от передающего сервера." -#: utils/misc/guc.c:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Задаёт максимально возможное число подключений." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "" "Определяет, сколько слотов подключений забронировано для суперпользователей." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Объём динамической разделяемой памяти, резервируемый при запуске." -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 msgid "Sets the number of shared memory buffers used by the server." msgstr "Задаёт количество буферов в разделяемой памяти, используемых сервером." -#: utils/misc/guc.c:2349 +#: utils/misc/guc.c:2399 +msgid "" +"Shows the size of the server's main shared memory area (rounded up to the " +"nearest MB)." +msgstr "" +"Показывает объём основной области общей памяти сервера (округляется до " +"ближайшего значения в мегабайтах)." + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "" +"Показывает количество огромных страниц, необходимое для основной области " +"общей памяти." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "Значение -1 показывает, что определить это количество не удалось." + +#: utils/misc/guc.c:2421 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Задаёт предельное число временных буферов на один сеанс." -#: utils/misc/guc.c:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "Задаёт TCP-порт для работы сервера." -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Задаёт права доступа для Unix-сокета." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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 " @@ -29419,11 +30393,11 @@ msgstr "" "воспринимаемом системными функциями chmod и umask. (Чтобы использовать " "привычный восьмеричный формат, добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Задаёт права доступа к файлам протоколов." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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 " @@ -29433,11 +30407,11 @@ msgstr "" "функциями chmod и umask. (Чтобы использовать привычный восьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Показывает режим каталога данных." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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 " @@ -29447,11 +30421,11 @@ msgstr "" "функциями chmod и umask. (Чтобы использовать привычный восьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2414 +#: utils/misc/guc.c:2486 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Задаёт предельный объём памяти для рабочих пространств запросов." -#: utils/misc/guc.c:2415 +#: utils/misc/guc.c:2487 msgid "" "This much memory can be used by each internal sort operation and hash table " "before switching to temporary disk files." @@ -29459,19 +30433,19 @@ msgstr "" "Такой объём памяти может использоваться каждой внутренней операцией " "сортировки и таблицей хешей до переключения на временные файлы на диске." -#: utils/misc/guc.c:2427 +#: utils/misc/guc.c:2499 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Задаёт предельный объём памяти для операций по обслуживанию." -#: utils/misc/guc.c:2428 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Подразумеваются в частности операции VACUUM и CREATE INDEX." -#: utils/misc/guc.c:2438 +#: utils/misc/guc.c:2510 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Задаёт предельный объём памяти для логического декодирования." -#: utils/misc/guc.c:2439 +#: utils/misc/guc.c:2511 msgid "" "This much memory can be used by each internal reorder buffer before spilling " "to disk." @@ -29479,85 +30453,85 @@ msgstr "" "Такой объём памяти может использоваться каждым внутренним буфером " "пересортировки до вымещения данных на диск." -#: utils/misc/guc.c:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Задаёт максимальную глубину стека (в КБ)." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 msgid "Limits the total size of all temporary files used by each process." msgstr "" "Ограничивает общий размер всех временных файлов, доступный для каждого " "процесса." -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 отключает ограничение." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Стоимость очистки для страницы, найденной в кеше." -#: utils/misc/guc.c:2487 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Стоимость очистки для страницы, не найденной в кеше." -#: utils/misc/guc.c:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Стоимость очистки для страницы, которая не была \"грязной\"." -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Суммарная стоимость очистки, при которой нужна передышка." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "" "Суммарная стоимость очистки, при которой нужна передышка, для автоочистки." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 msgid "" "Sets the maximum number of simultaneously open files for each server process." msgstr "" "Задаёт предельное число одновременно открытых файлов для каждого серверного " "процесса." -#: utils/misc/guc.c:2540 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Задаёт предельное число одновременно подготовленных транзакций." -#: utils/misc/guc.c:2551 +#: utils/misc/guc.c:2623 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Задаёт минимальный OID таблиц, для которых отслеживаются блокировки." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "Применяется для игнорирования системных таблиц." -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Задаёт OID таблицы для безусловного отслеживания блокировок." -#: utils/misc/guc.c:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "Задаёт предельную длительность для любого оператора." -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Нулевое значение отключает тайм-аут." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Задаёт максимальную продолжительность ожидания блокировок." -#: utils/misc/guc.c:2595 +#: utils/misc/guc.c:2667 msgid "" "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "" "Задаёт предельно допустимую длительность простоя между запросами в " "транзакции." -#: utils/misc/guc.c:2606 +#: utils/misc/guc.c:2678 msgid "" "Sets the maximum allowed idle time between queries, when not in a " "transaction." @@ -29565,30 +30539,30 @@ msgstr "" "Задаёт предельно допустимую длительность простоя между запросами вне " "транзакций." -#: utils/misc/guc.c:2617 +#: utils/misc/guc.c:2689 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "" "Минимальный возраст строк таблицы, при котором VACUUM может их заморозить." -#: utils/misc/guc.c:2627 +#: utils/misc/guc.c:2699 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Возраст, при котором VACUUM должен сканировать всю таблицу с целью " "заморозить кортежи." -#: utils/misc/guc.c:2637 +#: utils/misc/guc.c:2709 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "" "Минимальный возраст, при котором VACUUM будет замораживать MultiXactId в " "строке таблицы." -#: utils/misc/guc.c:2647 +#: utils/misc/guc.c:2719 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Возраст multixact, при котором VACUUM должен сканировать всю таблицу с целью " "заморозить кортежи." -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2729 msgid "" "Number of transactions by which VACUUM and HOT cleanup should be deferred, " "if any." @@ -29596,14 +30570,14 @@ msgstr "" "Определяет, на сколько транзакций следует задержать старые строки, выполняя " "VACUUM или \"горячее\" обновление." -#: utils/misc/guc.c:2666 +#: utils/misc/guc.c:2738 msgid "" "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "" "Возраст, при котором VACUUM должен включить защиту от зацикливания во " "избежание отказа." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2747 msgid "" "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound " "outage." @@ -29611,11 +30585,11 @@ msgstr "" "Возраст мультитранзакций, при котором VACUUM должен включить защиту от " "зацикливания во избежание отказа." -#: utils/misc/guc.c:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Задаёт предельное число блокировок на транзакцию." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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 " @@ -29625,11 +30599,11 @@ msgstr "" "один момент времени потребуется заблокировать не больше чем " "max_locks_per_transaction * max_connections различных объектов." -#: utils/misc/guc.c:2700 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Задаёт предельное число предикатных блокировок на транзакцию." -#: utils/misc/guc.c:2701 +#: utils/misc/guc.c:2773 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 " @@ -29639,14 +30613,14 @@ msgstr "" "предположения, что в один момент времени потребуется заблокировать не больше " "чем max_pred_locks_per_transaction * max_connections различных объектов." -#: utils/misc/guc.c:2712 +#: utils/misc/guc.c:2784 msgid "" "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "" "Задаёт максимальное число страниц и кортежей, блокируемых предикатными " "блокировками в одном отношении." -#: utils/misc/guc.c:2713 +#: utils/misc/guc.c:2785 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." @@ -29654,13 +30628,13 @@ msgstr "" "Если одним соединением блокируется больше этого общего числа страниц и " "кортежей, эти блокировки заменяются блокировкой на уровне отношения." -#: utils/misc/guc.c:2723 +#: utils/misc/guc.c:2795 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "" "Задаёт максимальное число кортежей, блокируемых предикатными блокировками в " "одной странице." -#: utils/misc/guc.c:2724 +#: utils/misc/guc.c:2796 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." @@ -29668,91 +30642,104 @@ msgstr "" "Если одним соединением блокируется больше этого числа кортежей на одной " "странице, эти блокировки заменяются блокировкой на уровне страницы." -#: utils/misc/guc.c:2734 +#: utils/misc/guc.c:2806 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Ограничивает время, за которое клиент должен пройти аутентификацию." -#: utils/misc/guc.c:2746 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Ждать N секунд при подключении до проверки подлинности." +#: utils/misc/guc.c:2818 +msgid "" +"Sets the amount of time to wait before authentication on connection startup." +msgstr "Задаёт время ожидания до аутентификации при установлении соединения." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Размер буфера для упреждающего чтения WAL во время восстановления." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2831 +msgid "" +"Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" +"Максимальный объём WAL, прочитываемый наперёд для осуществления предвыборки " +"изменяемых блоков данных." + +#: utils/misc/guc.c:2841 msgid "Sets the size of WAL files held for standby servers." msgstr "" "Определяет предельный объём файлов WAL, сохраняемых для резервных серверов." -#: utils/misc/guc.c:2768 +#: utils/misc/guc.c:2852 msgid "Sets the minimum size to shrink the WAL to." msgstr "Задаёт минимальный размер WAL при сжатии." -#: utils/misc/guc.c:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Задаёт размер WAL, при котором инициируется контрольная точка." -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "" "Задаёт максимальное время между автоматическими контрольными точками WAL." -#: utils/misc/guc.c:2803 +#: utils/misc/guc.c:2887 msgid "" -"Enables warnings if checkpoint segments are filled more frequently than this." +"Sets the maximum time before warning if checkpoints triggered by WAL volume " +"happen too frequently." msgstr "" -"Выдаёт предупреждения, когда сегменты контрольных точек заполняются за это " -"время." +"Задаёт максимальный интервал, в котором выдаётся предупреждение о том, что " +"контрольные точки, вызванные активностью WAL, происходят слишком часто." -#: utils/misc/guc.c:2805 +#: utils/misc/guc.c:2889 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." +"WAL segment files happen more frequently than this amount of time. Zero " +"turns off the warning." msgstr "" -"Записывает в протокол сервера сообщения, когда контрольные точки, вызванные " -"переполнением файлов сегментов, происходят за столько секунд. Нулевое " -"значение отключает эти предупреждения." +"В журнал сервера будет записываться сообщение, когда интервал между " +"контрольными точками, вызванными заполнением файлов сегментов WAL, меньше " +"заданного значения. Нулевое значение отключает эти предупреждения." -#: utils/misc/guc.c:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 msgid "" "Number of pages after which previously performed writes are flushed to disk." msgstr "" "Число страниц, по достижении которого ранее выполненные операции записи " "сбрасываются на диск." -#: utils/misc/guc.c:2828 +#: utils/misc/guc.c:2913 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Задаёт число буферов дисковых страниц в разделяемой памяти для WAL." -#: utils/misc/guc.c:2839 +#: utils/misc/guc.c:2924 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Задержка между сбросом WAL в процессе, записывающем WAL." -#: utils/misc/guc.c:2850 +#: utils/misc/guc.c:2935 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "" "Объём WAL, обработанный пишущим WAL процессом, при котором инициируется " "сброс журнала на диск." -#: utils/misc/guc.c:2861 +#: utils/misc/guc.c:2946 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "" "Размер нового файла, при достижении которого файл не пишется в WAL, а " "сбрасывается на диск." -#: utils/misc/guc.c:2872 +#: utils/misc/guc.c:2957 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "" "Задаёт предельное число одновременно работающих процессов передачи WAL." -#: utils/misc/guc.c:2883 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Задаёт предельное число одновременно существующих слотов репликации." -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2978 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "" "Задаёт максимальный размер WAL, который могут резервировать слоты репликации." -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2979 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." @@ -29761,11 +30748,11 @@ msgstr "" "помечены как нерабочие, а сегменты будут освобождены для удаления или " "переработки." -#: utils/misc/guc.c:2906 +#: utils/misc/guc.c:2991 msgid "Sets the maximum time to wait for WAL replication." msgstr "Задаёт предельное время ожидания репликации WAL." -#: utils/misc/guc.c:2917 +#: utils/misc/guc.c:3002 msgid "" "Sets the delay in microseconds between transaction commit and flushing WAL " "to disk." @@ -29773,18 +30760,19 @@ msgstr "" "Задаёт задержку в микросекундах между фиксированием транзакций и сбросом WAL " "на диск." -#: utils/misc/guc.c:2929 +#: utils/misc/guc.c:3014 msgid "" -"Sets the minimum concurrent open transactions before performing commit_delay." +"Sets the minimum number of concurrent open transactions required before " +"performing commit_delay." msgstr "" -"Задаёт минимальное число одновременно открытых транзакций для применения " -"commit_delay." +"Задаёт минимальное число одновременно открытых транзакций, которое требуется " +"для применения commit_delay." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 msgid "Sets the number of digits displayed for floating-point values." msgstr "Задаёт число выводимых цифр для чисел с плавающей точкой." -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3026 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 " @@ -29796,7 +30784,7 @@ msgstr "" "(FLT_DIG или DBL_DIG соответственно). Положительное значение включает режим " "точного вывода." -#: utils/misc/guc.c:2953 +#: utils/misc/guc.c:3038 msgid "" "Sets the minimum execution time above which a sample of statements will be " "logged. Sampling is determined by log_statement_sample_rate." @@ -29805,22 +30793,22 @@ msgstr "" "которого он выводится в журнал. Выборка определяется параметром " "log_statement_sample_rate." -#: utils/misc/guc.c:2956 +#: utils/misc/guc.c:3041 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 выводятся все запросы в выборке; -1 отключает эти сообщения." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:3051 msgid "" "Sets the minimum execution time above which all statements will be logged." msgstr "" "Задаёт предельное время выполнения любого оператора, при превышении которого " "он выводится в журнал." -#: utils/misc/guc.c:2968 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 выводятся все запросы; -1 отключает эти сообщения." -#: utils/misc/guc.c:2978 +#: utils/misc/guc.c:3063 msgid "" "Sets the minimum execution time above which autovacuum actions will be " "logged." @@ -29828,40 +30816,42 @@ msgstr "" "Задаёт предельное время выполнения автоочистки, при превышении которого эта " "операция протоколируется в журнале." -#: utils/misc/guc.c:2980 +#: utils/misc/guc.c:3065 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "" "При 0 протоколируются все операции автоочистки; -1 отключает эти сообщения." -#: utils/misc/guc.c:2990 +#: utils/misc/guc.c:3075 msgid "" -"When logging statements, limit logged parameter values to first N bytes." +"Sets the maximum length in bytes of data logged for bind parameter values " +"when logging statements." msgstr "" -"Обрезать длинные значения параметров выводимых в журнал операторов до первых " -"N байт." +"Задаёт максимальный размер данных (в байтах), выводимых в значениях " +"привязанных параметров при протоколировании операторов." -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "При -1 значения выводятся полностью." -#: utils/misc/guc.c:3001 +#: utils/misc/guc.c:3087 msgid "" -"When reporting an error, limit logged parameter values to first N bytes." +"Sets the maximum length in bytes of data logged for bind parameter values " +"when logging statements, on error." msgstr "" -"Обрезать значения параметров, выводимые в сообщениях об ошибках, до первых N " -"байт." +"Задаёт максимальный размер данных (в байтах), выводимых в значениях " +"привязанных параметров при протоколировании операторов в случае ошибки." -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "Время простоя в процессе фоновой записи между подходами." -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "" "Максимальное число LRU-страниц, сбрасываемых за один подход, в процессе " "фоновой записи." -#: utils/misc/guc.c:3046 +#: utils/misc/guc.c:3133 msgid "" "Number of simultaneous requests that can be handled efficiently by the disk " "subsystem." @@ -29869,80 +30859,83 @@ msgstr "" "Число одновременных запросов, которые могут быть эффективно обработаны " "дисковой подсистемой." -#: utils/misc/guc.c:3064 +#: utils/misc/guc.c:3151 msgid "" "A variant of effective_io_concurrency that is used for maintenance work." msgstr "" "Вариация параметра effective_io_concurrency, предназначенная для операций " "обслуживания БД." -#: utils/misc/guc.c:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Задаёт максимально возможное число рабочих процессов." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "" "Задаёт максимально возможное число рабочих процессов логической репликации." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "" "Задаёт максимально возможное число процессов синхронизации таблиц для одной " "подписки." -#: utils/misc/guc.c:3127 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Автоматическая прокрутка файла протокола через каждые N минут." +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "" +"Задаёт время задержки перед принудительным переключением на следующий файл " +"журнала." -#: utils/misc/guc.c:3138 -msgid "Automatic log file rotation will occur after N kilobytes." +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." msgstr "" -"Автоматическая прокрутка файла протокола при выходе за предел N килобайт." +"Задаёт максимальный размер, которого может достичь файл журнала до " +"переключения на другой файл." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Показывает максимально возможное число аргументов функций." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Показывает максимально возможное число ключей в индексе." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Показывает максимально возможную длину идентификатора." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Показывает размер дискового блока." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "Показывает число страниц в одном файле." -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "Показывает размер блока в журнале WAL." -#: utils/misc/guc.c:3215 +#: utils/misc/guc.c:3305 msgid "" "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "" "Задаёт время задержки перед повторной попыткой обращения к WAL после неудачи." -#: utils/misc/guc.c:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Показывает размер сегментов журнала предзаписи." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Время простоя между запусками автоочистки." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Минимальное число изменений или удалений кортежей, вызывающее очистку." -#: utils/misc/guc.c:3259 +#: utils/misc/guc.c:3349 msgid "" "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert " "vacuums." @@ -29950,27 +30943,27 @@ msgstr "" "Минимальное число добавлений кортежей, вызывающее очистку; при -1 такая " "очистка отключается." -#: utils/misc/guc.c:3268 +#: utils/misc/guc.c:3358 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "" "Минимальное число добавлений, изменений или удалений кортежей, вызывающее " "анализ." -#: utils/misc/guc.c:3278 +#: utils/misc/guc.c:3368 msgid "" "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "" "Возраст, при котором необходима автоочистка таблицы для предотвращения " "зацикливания ID транзакций." -#: utils/misc/guc.c:3293 +#: utils/misc/guc.c:3380 msgid "" "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "" "Возраст multixact, при котором необходима автоочистка таблицы для " "предотвращения зацикливания multixact." -#: utils/misc/guc.c:3303 +#: utils/misc/guc.c:3390 msgid "" "Sets the maximum number of simultaneously running autovacuum worker " "processes." @@ -29978,30 +30971,30 @@ msgstr "" "Задаёт предельное число одновременно выполняющихся рабочих процессов " "автоочистки." -#: utils/misc/guc.c:3313 +#: utils/misc/guc.c:3400 msgid "" "Sets the maximum number of parallel processes per maintenance operation." msgstr "" "Задаёт максимальное число параллельных процессов на одну операцию " "обслуживания." -#: utils/misc/guc.c:3323 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Задаёт максимальное число параллельных процессов на узел исполнителя." -#: utils/misc/guc.c:3334 +#: utils/misc/guc.c:3421 msgid "" "Sets the maximum number of parallel workers that can be active at one time." msgstr "" "Задаёт максимальное число параллельных процессов, которые могут быть активны " "одновременно." -#: utils/misc/guc.c:3345 +#: utils/misc/guc.c:3432 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "" "Задаёт предельный объём памяти для каждого рабочего процесса автоочистки." -#: utils/misc/guc.c:3356 +#: utils/misc/guc.c:3443 msgid "" "Time before a snapshot is too old to read pages changed after the snapshot " "was taken." @@ -30009,51 +31002,50 @@ msgstr "" "Срок, по истечении которого снимок считается слишком старым для получения " "страниц, изменённых после создания снимка." -#: utils/misc/guc.c:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "Значение -1 отключает это поведение." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Интервал между TCP-пакетами пульса (keep-alive)." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "При нулевом значении действует системный параметр." -#: utils/misc/guc.c:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Интервал между повторениями TCP-пакетов пульса (keep-alive)." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "" "Повторное согласование SSL более не поддерживается; единственное допустимое " "значение - 0." -#: utils/misc/guc.c:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Максимальное число повторений TCP-пакетов пульса (keep-alive)." -#: utils/misc/guc.c:3401 +#: utils/misc/guc.c:3488 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." +"Number of consecutive keepalive retransmits that can be lost before a " +"connection is considered dead. A value of 0 uses the system default." msgstr "" -"Этот параметр определяет, сколько пакетов пульса подряд может быть потеряно, " -"прежде чем соединение будет считаться пропавшим. При нулевом значении " -"действует системный параметр." +"Количество идущих подряд пакетов пульса, которое может быть потеряно, прежде " +"чем соединение будет считаться пропавшим. При нулевом значении действует " +"системный параметр." -#: utils/misc/guc.c:3412 +#: utils/misc/guc.c:3499 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Ограничивает результат точного поиска с использованием GIN." -#: utils/misc/guc.c:3423 +#: utils/misc/guc.c:3510 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Подсказывает планировщику примерный общий размер кешей данных." -#: utils/misc/guc.c:3424 +#: utils/misc/guc.c:3511 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 " @@ -30063,12 +31055,12 @@ msgstr "" "попадают файлы данных PostgreSQL. Размер задаётся в дисковых страницах " "(обычно это 8 КБ)." -#: utils/misc/guc.c:3435 +#: utils/misc/guc.c:3522 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в таблице для параллельного сканирования." -#: utils/misc/guc.c:3436 +#: utils/misc/guc.c:3523 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." @@ -30077,12 +31069,12 @@ msgstr "" "задано этим ограничением, он исключает параллельное сканирование из " "рассмотрения." -#: utils/misc/guc.c:3446 +#: utils/misc/guc.c:3533 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в индексе для параллельного сканирования." -#: utils/misc/guc.c:3447 +#: utils/misc/guc.c:3534 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." @@ -30091,54 +31083,64 @@ msgstr "" "задано этим ограничением, он исключает параллельное сканирование из " "рассмотрения." -#: utils/misc/guc.c:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Показывает версию сервера в виде целого числа." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "" "Фиксирует в протоколе превышение временными файлами заданного размера (в КБ)." -#: utils/misc/guc.c:3470 +#: utils/misc/guc.c:3557 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "При 0 отмечаются все файлы; при -1 эти сообщения отключаются (по умолчанию)." -#: utils/misc/guc.c:3480 +#: utils/misc/guc.c:3567 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Задаёт размер, резервируемый для pg_stat_activity.query (в байтах)." -#: utils/misc/guc.c:3491 +#: utils/misc/guc.c:3578 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Задаёт максимальный размер списка-очереди для GIN-индекса." -#: utils/misc/guc.c:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "Пользовательский таймаут TCP." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "Запрашиваемый размер огромных страниц." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." msgstr "Включает агрессивный сброс системных кешей для целей отладки." -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 msgid "" "Sets the time interval between checks for disconnection while running " "queries." msgstr "" "Задаёт интервал между проверками подключения во время выполнения запросов." -#: utils/misc/guc.c:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "" +"Интервал между обновлениями состояния длительных операций, выполняемых при " +"запуске." + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "При 0 эта функциональность отключается." + +#: utils/misc/guc.c:3666 msgid "" "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "Задаёт для планировщика ориентир стоимости последовательного чтения страницы." -#: utils/misc/guc.c:3578 +#: utils/misc/guc.c:3677 msgid "" "Sets the planner's estimate of the cost of a nonsequentially fetched disk " "page." @@ -30146,13 +31148,13 @@ msgstr "" "Задаёт для планировщика ориентир стоимости непоследовательного чтения " "страницы." -#: utils/misc/guc.c:3589 +#: utils/misc/guc.c:3688 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого кортежа " "(строки)." -#: utils/misc/guc.c:3600 +#: utils/misc/guc.c:3699 msgid "" "Sets the planner's estimate of the cost of processing each index entry " "during an index scan." @@ -30160,7 +31162,7 @@ msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого элемента " "индекса в процессе сканирования индекса." -#: utils/misc/guc.c:3611 +#: utils/misc/guc.c:3710 msgid "" "Sets the planner's estimate of the cost of processing each operator or " "function call." @@ -30168,7 +31170,7 @@ msgstr "" "Задаёт для планировщика ориентир стоимости обработки каждого оператора или " "вызова функции." -#: utils/misc/guc.c:3622 +#: utils/misc/guc.c:3721 msgid "" "Sets the planner's estimate of the cost of passing each tuple (row) from " "worker to leader backend." @@ -30176,7 +31178,7 @@ msgstr "" "Задаёт для планировщика ориентир стоимости передачи каждого кортежа (строки) " "ведущему процессу от рабочего." -#: utils/misc/guc.c:3633 +#: utils/misc/guc.c:3732 msgid "" "Sets the planner's estimate of the cost of starting up worker processes for " "parallel query." @@ -30184,70 +31186,78 @@ msgstr "" "Задаёт для планировщика ориентир стоимости запуска рабочих процессов для " "параллельного выполнения запроса." -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3744 msgid "Perform JIT compilation if query is more expensive." msgstr "Стоимость запроса, при превышении которой производится JIT-компиляция." -#: utils/misc/guc.c:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 отключает JIT-компиляцию." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "" "Стоимость запроса, при превышении которой оптимизируются JIT-" "скомпилированные функции." -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 отключает оптимизацию." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "Стоимость запроса, при которой выполняется встраивание JIT." -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 отключает встраивание кода." -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 msgid "" "Sets the planner's estimate of the fraction of a cursor's rows that will be " "retrieved." msgstr "" "Задаёт для планировщика ориентир доли требуемых строк курсора в общем числе." -#: utils/misc/guc.c:3690 +#: utils/misc/guc.c:3789 +msgid "" +"Sets the planner's estimate of the average size of a recursive query's " +"working table." +msgstr "" +"Задаёт для планировщика ориентир среднего размера рабочей таблицы в " +"рекурсивном запросе." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: селективное давление в популяции." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: отправное значение для случайного выбора пути." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 msgid "Multiple of work_mem to use for hash tables." msgstr "Множитель work_mem, определяющий объём памяти для хеш-таблиц." -#: utils/misc/guc.c:3723 +#: utils/misc/guc.c:3834 msgid "Multiple of the average buffer usage to free per round." msgstr "" "Множитель для среднего числа использованных буферов, определяющий число " "буферов, освобождаемых за один подход." -#: utils/misc/guc.c:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "Задаёт отправное значение для генератора случайных чисел." -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Задержка очистки (в миллисекундах)." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Задержка очистки для автоочистки (в миллисекундах)." -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 msgid "" "Number of tuple updates or deletes prior to vacuum as a fraction of " "reltuples." @@ -30255,13 +31265,13 @@ msgstr "" "Отношение числа обновлений или удалений кортежей к reltuples, определяющее " "потребность в очистке." -#: utils/misc/guc.c:3776 +#: utils/misc/guc.c:3887 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "" "Отношение числа добавлений кортежей к reltuples, определяющее потребность в " "очистке." -#: utils/misc/guc.c:3786 +#: utils/misc/guc.c:3897 msgid "" "Number of tuple inserts, updates, or deletes prior to analyze as a fraction " "of reltuples." @@ -30269,7 +31279,7 @@ msgstr "" "Отношение числа добавлений, обновлений или удалений кортежей к reltuples, " "определяющее потребность в анализе." -#: utils/misc/guc.c:3796 +#: utils/misc/guc.c:3907 msgid "" "Time spent flushing dirty buffers during checkpoint, as fraction of " "checkpoint interval." @@ -30277,25 +31287,25 @@ msgstr "" "Отношение продолжительности сброса \"грязных\" буферов во время контрольной " "точки к интервалу контрольных точек." -#: utils/misc/guc.c:3806 +#: utils/misc/guc.c:3917 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "" "Доля записываемых в журнал операторов с длительностью, превышающей " "log_min_duration_sample." -#: utils/misc/guc.c:3807 +#: utils/misc/guc.c:3918 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "" "Может задаваться значением от 0.0 (не записывать никакие операторы) и 1.0 " "(записывать все)." -#: utils/misc/guc.c:3816 +#: utils/misc/guc.c:3927 msgid "Sets the fraction of transactions from which to log all statements." msgstr "" "Задаёт долю транзакций, все операторы которых будут записываться в журнал " "сервера." -#: utils/misc/guc.c:3817 +#: utils/misc/guc.c:3928 msgid "" "Use a value between 0.0 (never log) and 1.0 (log all statements for all " "transactions)." @@ -30303,34 +31313,48 @@ msgstr "" "Значение 0.0 означает — не записывать никакие транзакции, а значение 1.0 — " "записывать все операторы всех транзакций." -#: utils/misc/guc.c:3836 +#: utils/misc/guc.c:3947 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Задаёт команду оболочки, вызываемую для архивации файла WAL." -#: utils/misc/guc.c:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Это параметр используется, только если не задан \"archive_library\"." + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Задаёт библиотеку, вызываемую для архивации файла WAL." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" +"Пустая строка указывает, что должен использоваться параметр " +"\"archive_command\"." + +#: utils/misc/guc.c:3967 msgid "" "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "" "Задаёт команду оболочки, которая будет вызываться для извлечения из архива " "файла WAL." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:3977 msgid "Sets the shell command that will be executed at every restart point." msgstr "" "Задаёт команду оболочки, которая будет выполняться при каждой точке " "перезапуска." -#: utils/misc/guc.c:3866 +#: utils/misc/guc.c:3987 msgid "" "Sets the shell command that will be executed once at the end of recovery." msgstr "" "Задаёт команду оболочки, которая будет выполняться в конце восстановления." -#: utils/misc/guc.c:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Указывает линию времени для выполнения восстановления." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 msgid "" "Set to \"immediate\" to end recovery as soon as a consistent state is " "reached." @@ -30338,24 +31362,24 @@ msgstr "" "Задайте значение \"immediate\", чтобы восстановление остановилось сразу " "после достижения согласованного состояния." -#: utils/misc/guc.c:3895 +#: utils/misc/guc.c:4016 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "" "Задаёт идентификатор транзакции, вплоть до которой будет производиться " "восстановление." -#: utils/misc/guc.c:3904 +#: utils/misc/guc.c:4025 msgid "Sets the time stamp up to which recovery will proceed." msgstr "" "Задаёт момент времени, вплоть до которого будет производиться восстановление." -#: utils/misc/guc.c:3913 +#: utils/misc/guc.c:4034 msgid "Sets the named restore point up to which recovery will proceed." msgstr "" "Задаёт именованную точку восстановления, до которой будет производиться " "восстановление." -#: utils/misc/guc.c:3922 +#: utils/misc/guc.c:4043 msgid "" "Sets the LSN of the write-ahead log location up to which recovery will " "proceed." @@ -30363,71 +31387,71 @@ msgstr "" "Задаёт в виде LSN позицию в журнале предзаписи, до которой будет " "производиться восстановление." -#: utils/misc/guc.c:3932 +#: utils/misc/guc.c:4053 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "" "Задаёт имя файла, присутствие которого выводит ведомый из режима " "восстановления." -#: utils/misc/guc.c:3942 +#: utils/misc/guc.c:4063 msgid "Sets the connection string to be used to connect to the sending server." msgstr "" "Задаёт строку соединения, которая будет использоваться для подключения к " "передающему серверу." -#: utils/misc/guc.c:3953 +#: utils/misc/guc.c:4074 msgid "Sets the name of the replication slot to use on the sending server." msgstr "" "Задаёт имя слота репликации, который будет использоваться на передающем " "сервере." -#: utils/misc/guc.c:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Задаёт кодировку символов, используемую клиентом." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "Определяет содержимое префикса каждой строки протокола." -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "При пустом значении префикс также отсутствует." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Задаёт часовой пояс для вывода времени в сообщениях протокола." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "Устанавливает формат вывода дат и времени." -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Также помогает разбирать неоднозначно заданные вводимые даты." -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "Задаёт табличный метод доступа по умолчанию для новых таблиц." -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4138 msgid "Sets the default tablespace to create tables and indexes in." msgstr "" "Задаёт табличное пространство по умолчанию для новых таблиц и индексов." -#: utils/misc/guc.c:4018 +#: utils/misc/guc.c:4139 msgid "An empty string selects the database's default tablespace." msgstr "При пустом значении используется табличное пространство базы данных." -#: utils/misc/guc.c:4028 +#: utils/misc/guc.c:4149 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "" "Задаёт табличное пространство(а) для временных таблиц и файлов сортировки." -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Задаёт путь для динамически загружаемых модулей." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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 " @@ -30437,104 +31461,104 @@ msgstr "" "указан путь (нет символа '/'), система будет искать этот файл в заданном " "пути." -#: utils/misc/guc.c:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Задаёт размещение файла с ключом Kerberos для данного сервера." -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Задаёт название службы Bonjour." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Показывает правило сортировки." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "Показывает правило классификации символов и преобразования регистра." -#: utils/misc/guc.c:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Задаёт язык выводимых сообщений." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Задаёт локаль для форматирования денежных сумм." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Задаёт локаль для форматирования чисел." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting date and time values." msgstr "Задаёт локаль для форматирования дат и времени." -#: utils/misc/guc.c:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "" "Список разделяемых библиотек, заранее загружаемых в каждый обслуживающий " "процесс." -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Список разделяемых библиотек, заранее загружаемых в память сервера." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "" "Список непривилегированных разделяемых библиотек, заранее загружаемых в " "каждый обслуживающий процесс." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4292 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Задаёт порядок просмотра схемы при поиске неполных имён." -#: utils/misc/guc.c:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." msgstr "Показывает кодировку символов сервера (базы данных)." -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Показывает версию сервера." -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Задаёт текущую роль." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Задаёт имя пользователя в сеансе." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Определяет, куда будет выводиться протокол сервера." -#: utils/misc/guc.c:4231 +#: utils/misc/guc.c:4352 msgid "" -"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and " -"\"eventlog\", depending on the platform." +"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", " +"\"jsonlog\", and \"eventlog\", depending on the platform." msgstr "" -"Значение может включать сочетание слов \"stderr\", \"syslog\", \"csvlog\" и " -"\"eventlog\", в зависимости от платформы." +"Значение может включать сочетание слов \"stderr\", \"syslog\", \"csvlog\", " +"\"jsonlog\" и \"eventlog\", в зависимости от платформы." -#: utils/misc/guc.c:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "Задаёт целевой каталог для файлов протоколов." -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "" "Путь может быть абсолютным или указываться относительно каталога данных." -#: utils/misc/guc.c:4253 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "Задаёт шаблон имени для файлов протоколов." -#: utils/misc/guc.c:4264 +#: utils/misc/guc.c:4385 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Задаёт имя программы для идентификации сообщений PostgreSQL в syslog." -#: utils/misc/guc.c:4275 +#: utils/misc/guc.c:4396 msgid "" "Sets the application name used to identify PostgreSQL messages in the event " "log." @@ -30542,125 +31566,121 @@ msgstr "" "Задаёт имя приложения для идентификации сообщений PostgreSQL в журнале " "событий." -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4407 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "" "Задаёт часовой пояс для вывода и разбора строкового представления времени." -#: utils/misc/guc.c:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Выбирает файл с сокращёнными названиями часовых поясов." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Задаёт группу-владельца Unix-сокета." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 msgid "" "The owning user of the socket is always the user that starts the server." msgstr "" "Собственно владельцем сокета всегда будет пользователь, запускающий сервер." -#: utils/misc/guc.c:4317 +#: utils/misc/guc.c:4438 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Задаёт каталоги, где будут создаваться Unix-сокеты." -#: utils/misc/guc.c:4332 +#: utils/misc/guc.c:4453 msgid "Sets the host name or IP address(es) to listen to." msgstr "Задаёт имя узла или IP-адрес(а) для привязки." -#: utils/misc/guc.c:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Определяет каталог данных сервера." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "Определяет основной файл конфигурации сервера." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"hba\"." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"ident\"." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "Файл, в который будет записан код процесса postmaster." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Показывает имя библиотеки SSL." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Размещение файла сертификата сервера для SSL." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server private key file." msgstr "Размещение файла с закрытым ключом сервера для SSL." -#: utils/misc/guc.c:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Размещение файла центра сертификации для SSL." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." msgstr "Размещение файла со списком отзыва сертификатов для SSL." -#: utils/misc/guc.c:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." msgstr "Размещение каталога со списками отзыва сертификатов для SSL." -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Каталог, в который будут записываться временные файлы статистики." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 msgid "" "Number of synchronous standbys and list of names of potential synchronous " "ones." msgstr "" "Количество потенциально синхронных резервных серверов и список их имён." -#: utils/misc/guc.c:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Задаёт конфигурацию текстового поиска по умолчанию." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Задаёт список допустимых алгоритмов шифрования для SSL." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Задаёт кривую для ECDH." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Размещение файла с параметрами SSL DH." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Команда, позволяющая получить пароль для SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 msgid "Sets the application name to be reported in statistics and logs." msgstr "" "Задаёт имя приложения, которое будет выводиться в статистике и протоколах." -#: utils/misc/guc.c:4562 +#: utils/misc/guc.c:4672 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Задаёт имя кластера, которое будет добавляться в название процесса." -#: utils/misc/guc.c:4573 +#: utils/misc/guc.c:4683 msgid "" "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "" "Задаёт перечень менеджеров ресурсов WAL, для которых выполняются проверки " "целостности WAL." -#: utils/misc/guc.c:4574 +#: utils/misc/guc.c:4684 msgid "" "Full-page images will be logged for all data blocks and cross-checked " "against the results of WAL replay." @@ -30668,28 +31688,28 @@ msgstr "" "При этом в журнал будут записываться образы полных страниц для всех блоков " "данных для сверки с результатами воспроизведения WAL." -#: utils/misc/guc.c:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "Используемый провайдер JIT." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Записывать в журнал стек в случае ошибок в перечисленных функциях." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Определяет, можно ли использовать \"\\'\" в текстовых строках." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Задаёт формат вывода данных типа bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 msgid "Sets the message levels that are sent to the client." msgstr "Ограничивает уровень сообщений, передаваемых клиенту." -#: utils/misc/guc.c:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 -#: utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 msgid "" "Each level includes all the levels that follow it. The later the level, the " "fewer messages are sent." @@ -30697,16 +31717,16 @@ msgstr "" "Каждый уровень включает все последующие. Чем выше уровень, тем меньше " "сообщений." -#: utils/misc/guc.c:4646 -msgid "Compute query identifiers." -msgstr "Вычислять идентификаторы запросов." +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "Включает внутреннее вычисление идентификаторов запросов." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 msgid "Enables the planner to use constraints to optimize queries." msgstr "" "Разрешает планировщику оптимизировать запросы, полагаясь на ограничения." -#: utils/misc/guc.c:4657 +#: utils/misc/guc.c:4767 msgid "" "Table scans will be skipped if their constraints guarantee that no rows " "match the query." @@ -30714,81 +31734,89 @@ msgstr "" "Сканирование таблицы не будет выполняться, если её ограничения гарантируют, " "что запросу не удовлетворяют никакие строки." -#: utils/misc/guc.c:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." msgstr "Задаёт выбираемый по умолчанию метод сжатия для сжимаемых значений." -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "Задаёт уровень изоляции транзакций для новых транзакций." -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "Задаёт текущий уровень изоляции транзакций." -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Задаёт формат отображения для внутренних значений." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Задаёт детализацию протоколируемых сообщений." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Ограничивает уровни протоколируемых сообщений." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 msgid "" "Causes all statements generating error at or above this level to be logged." msgstr "" "Включает протоколирование для SQL-операторов, выполненных с ошибкой этого " "или большего уровня." -#: utils/misc/guc.c:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Задаёт тип протоколируемых операторов." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Задаёт получателя сообщений, отправляемых в syslog." -#: utils/misc/guc.c:4768 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "" "Задаёт режим срабатывания триггеров и правил перезаписи для текущего сеанса." -#: utils/misc/guc.c:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "Задаёт уровень синхронизации текущей транзакции." -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "Разрешает архивацию файлов WAL командой archive_command." -#: utils/misc/guc.c:4798 +#: utils/misc/guc.c:4908 msgid "Sets the action to perform upon reaching the recovery target." msgstr "" "Задаёт действие, которое будет выполняться по достижении цели восстановления." -#: utils/misc/guc.c:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "" "Включает протоколирование отладочной информации, связанной с репликацией." -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Включает сбор статистики активности в БД на уровне функций." -#: utils/misc/guc.c:4834 +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Задаёт режим согласования доступа к данным статистики." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Сжимать данные записываемых в WAL полных страниц заданным методом." + +#: utils/misc/guc.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Задаёт уровень информации, записываемой в WAL." -#: utils/misc/guc.c:4844 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Выбирает используемую реализацию динамической разделяемой памяти." -#: utils/misc/guc.c:4854 +#: utils/misc/guc.c:4986 msgid "" "Selects the shared memory implementation used for the main shared memory " "region." @@ -30796,15 +31824,15 @@ msgstr "" "Выбирает реализацию разделяемой памяти для управления основным блоком " "разделяемой памяти." -#: utils/misc/guc.c:4864 +#: utils/misc/guc.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Выбирает метод принудительной записи изменений в WAL на диск." -#: utils/misc/guc.c:4874 +#: utils/misc/guc.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "Определяет, как должны кодироваться двоичные значения в XML." -#: utils/misc/guc.c:4884 +#: utils/misc/guc.c:5016 msgid "" "Sets whether XML data in implicit parsing and serialization operations is to " "be considered as documents or content fragments." @@ -30812,15 +31840,23 @@ msgstr "" "Определяет, следует ли рассматривать XML-данные в неявных операциях разбора " "и сериализации как документы или как фрагменты содержания." -#: utils/misc/guc.c:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Включает использование огромных страниц в Linux и в Windows." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "Осуществлять предвыборку изменяемых блоков в процессе восстановления." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Прочитывать WAL наперёд для вычисления ещё не кешированных блоков." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Принудительно включает режим параллельного выполнения запросов." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 msgid "" "If possible, run query using a parallel worker and with parallel " "restrictions." @@ -30828,15 +31864,15 @@ msgstr "" "Если возможно, запрос выполняется параллельными исполнителями и с " "ограничениями параллельности." -#: utils/misc/guc.c:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Выбирает алгоритм шифрования паролей." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 msgid "Controls the planner's selection of custom or generic plan." msgstr "Управляет выбором специализированных или общих планов планировщиком." -#: utils/misc/guc.c:4927 +#: utils/misc/guc.c:5069 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 " @@ -30846,28 +31882,28 @@ msgstr "" "планы, и планировщик пытается выбрать лучший вариант. Этот параметр " "позволяет переопределить поведение по умолчанию." -#: utils/misc/guc.c:4939 +#: utils/misc/guc.c:5081 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "" "Задаёт минимальную версию протокола SSL/TLS, которая может использоваться." -#: utils/misc/guc.c:4951 +#: utils/misc/guc.c:5093 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "" "Задаёт максимальную версию протокола SSL/TLS, которая может использоваться." -#: utils/misc/guc.c:4963 +#: utils/misc/guc.c:5105 msgid "" "Sets the method for synchronizing the data directory before crash recovery." msgstr "" "Задаёт метод синхронизации каталога данных перед восстановления после сбоя." -#: utils/misc/guc.c:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "неверное имя параметра конфигурации: \"%s\"" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, c-format msgid "" "Custom parameter names must be two or more simple identifiers separated by " @@ -30876,17 +31912,22 @@ msgstr "" "Имена нестандартных параметров должны состоять из двух или более простых " "идентификаторов, разделённых точками." -#: utils/misc/guc.c:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" — зарезервированный префикс." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "нераспознанный параметр конфигурации: \"%s\"" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: ошибка доступа к каталогу \"%s\": %s\n" -#: utils/misc/guc.c:5841 +#: utils/misc/guc.c:6109 #, c-format msgid "" "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" @@ -30894,7 +31935,7 @@ msgstr "" "Запустите initdb или pg_basebackup для инициализации каталога данных " "PostgreSQL.\n" -#: utils/misc/guc.c:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -30905,12 +31946,12 @@ msgstr "" "Вы должны указать его расположение в параметре --config-file или -D, либо " "установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5880 +#: utils/misc/guc.c:6148 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s не может открыть файл конфигурации сервера \"%s\": %s\n" -#: utils/misc/guc.c:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -30921,7 +31962,7 @@ msgstr "" "Их расположение можно задать как значение \"data_directory\" в файле \"%s\", " "либо передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -30932,7 +31973,7 @@ msgstr "" "Его расположение можно задать как значение \"hba_file\" в файле \"%s\", либо " "передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -30943,127 +31984,135 @@ msgstr "" "Его расположение можно задать как значение \"ident_file\" в файле \"%s\", " "либо передать в параметре -D, либо установить переменную окружения PGDATA.\n" -#: utils/misc/guc.c:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "Значение выходит за рамки целых чисел." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7649 utils/misc/guc.c:9103 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "устанавливать параметры во время параллельных операций нельзя" -#: utils/misc/guc.c:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7668 utils/misc/guc.c:8927 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" нельзя изменить" -#: utils/misc/guc.c:7374 utils/misc/guc.c:7572 utils/misc/guc.c:7666 -#: utils/misc/guc.c:7760 utils/misc/guc.c:7880 utils/misc/guc.c:7979 +#: utils/misc/guc.c:7691 utils/misc/guc.c:7915 utils/misc/guc.c:8013 +#: utils/misc/guc.c:8111 utils/misc/guc.c:8235 utils/misc/guc.c:8338 #: guc-file.l:353 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "параметр \"%s\" изменяется только при перезапуске сервера" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7701 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" нельзя изменить сейчас" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11365 +#: utils/misc/guc.c:7728 utils/misc/guc.c:7790 utils/misc/guc.c:8903 +#: utils/misc/guc.c:11811 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "нет прав для изменения параметра \"%s\"" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7770 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "параметр \"%s\" нельзя задать после установления соединения" -#: utils/misc/guc.c:7487 +#: utils/misc/guc.c:7829 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "" "параметр \"%s\" нельзя задать в функции с контекстом безопасности " "определившего" -#: utils/misc/guc.c:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9581 +#: utils/misc/guc.c:8482 utils/misc/guc.c:8529 utils/misc/guc.c:10016 #, 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 "" -"прочитать \"%s\" может только суперпользователь или член роли " +"чтобы прочитать \"%s\", нужно быть суперпользователем или иметь права роли " "pg_read_all_settings" -#: utils/misc/guc.c:8251 +#: utils/misc/guc.c:8613 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s принимает только один аргумент" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8893 #, 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:8580 +#: utils/misc/guc.c:8960 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значение параметра для ALTER SYSTEM не должно быть многострочным" -#: utils/misc/guc.c:8625 +#: utils/misc/guc.c:9005 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не удалось разобрать содержимое файла \"%s\"" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9179 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT не реализовано" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9266 #, c-format msgid "SET requires parameter name" msgstr "SET требует имя параметра" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9399 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "попытка переопределить параметр \"%s\"" -#: utils/misc/guc.c:10812 +#: utils/misc/guc.c:9726 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "неверное имя параметра конфигурации: \"%s\", он удаляется" + +#: utils/misc/guc.c:9728 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "Теперь \"%s\" — зарезервированный префикс." + +#: utils/misc/guc.c:11251 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "при назначении параметру \"%s\" значения \"%s\"" -#: utils/misc/guc.c:10977 +#: utils/misc/guc.c:11420 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" нельзя установить" -#: utils/misc/guc.c:11069 +#: utils/misc/guc.c:11512 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не удалось разобрать значение параметра \"%s\"" -#: utils/misc/guc.c:11427 utils/misc/guc.c:11461 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "неверное значение параметра \"%s\": %d" - -#: utils/misc/guc.c:11495 +#: utils/misc/guc.c:11943 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неверное значение параметра \"%s\": %g" -#: utils/misc/guc.c:11782 +#: utils/misc/guc.c:12256 #, c-format msgid "" "\"temp_buffers\" cannot be changed after any temporary tables have been " @@ -31072,23 +32121,23 @@ msgstr "" "параметр \"temp_buffers\" нельзя изменить после обращения к временным " "таблицам в текущем сеансе." -#: utils/misc/guc.c:11794 +#: utils/misc/guc.c:12268 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не поддерживается в данной сборке" -#: utils/misc/guc.c:11807 +#: utils/misc/guc.c:12281 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не поддерживается в данной сборке" -#: utils/misc/guc.c:11819 +#: utils/misc/guc.c:12293 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "" "Этот параметр нельзя включить, когда \"log_statement_stats\" равен true." -#: utils/misc/guc.c:11831 +#: utils/misc/guc.c:12305 #, c-format msgid "" "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " @@ -31098,7 +32147,7 @@ msgstr "" "\"log_parser_stats\", \"log_planner_stats\" или \"log_executor_stats\" равны " "true." -#: utils/misc/guc.c:12061 +#: utils/misc/guc.c:12535 #, c-format msgid "" "effective_io_concurrency must be set to 0 on platforms that lack " @@ -31107,7 +32156,7 @@ msgstr "" "Значение effective_io_concurrency должно равняться 0 на платформах, где " "отсутствует lack posix_fadvise()." -#: utils/misc/guc.c:12074 +#: utils/misc/guc.c:12548 #, c-format msgid "" "maintenance_io_concurrency must be set to 0 on platforms that lack " @@ -31116,36 +32165,34 @@ msgstr "" "Значение maintenance_io_concurrency должно равняться 0 на платформах, где " "отсутствует lack posix_fadvise()." -#: utils/misc/guc.c:12088 +#: utils/misc/guc.c:12562 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "Значение huge_page_size должно равняться 0 на этой платформе." -#: utils/misc/guc.c:12102 +#: utils/misc/guc.c:12574 #, 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 должно равняться 0 на платформах, " -"где отсутствует POLLRDHUP." +"Значение client_connection_check_interval должно равняться 0 на этой " +"платформе." -#: utils/misc/guc.c:12230 +#: utils/misc/guc.c:12686 #, c-format msgid "invalid character" msgstr "неверный символ" -#: utils/misc/guc.c:12290 +#: utils/misc/guc.c:12746 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline не является допустимым числом." -#: utils/misc/guc.c:12330 +#: utils/misc/guc.c:12786 #, c-format msgid "multiple recovery targets specified" msgstr "указано несколько целей восстановления" -#: utils/misc/guc.c:12331 +#: utils/misc/guc.c:12787 #, c-format msgid "" "At most one of recovery_target, recovery_target_lsn, recovery_target_name, " @@ -31155,7 +32202,7 @@ msgstr "" "recovery_target_lsn, recovery_target_name, recovery_target_time, " "recovery_target_xid." -#: utils/misc/guc.c:12339 +#: utils/misc/guc.c:12795 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Единственное допустимое значение: \"immediate\"." @@ -31165,15 +32212,8 @@ msgstr "Единственное допустимое значение: \"immedi 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:63 utils/misc/pg_controldata.c:143 -#: utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 +#: utils/misc/pg_controldata.c:63 utils/misc/pg_controldata.c:143 +#: utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "" @@ -31202,7 +32242,7 @@ msgstr "" "Чтобы отключить политику для владельца таблицы, воспользуйтесь командой " "ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "добавить другие причины тайм-аута нельзя" @@ -31288,7 +32328,7 @@ msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "" "в @INCLUDE не указано имя файла (файл часовых поясов \"%s\", строка %d)" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Ошибка при создании контекста памяти \"%s\"." @@ -31311,37 +32351,37 @@ msgstr "Ошибка при запросе блока размером %zu в к msgid "logging memory contexts of PID %d" msgstr "вывод информации о памяти процесса с PID %d" -#: utils/mmgr/portalmem.c:187 +#: 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:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "портал \"%s\" не может быть запущен" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "удалить закреплённый портал \"%s\" нельзя" -#: utils/mmgr/portalmem.c:487 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "удалить активный портал \"%s\" нельзя" -#: utils/mmgr/portalmem.c:738 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "нельзя выполнить PREPARE для транзакции, создавшей курсор WITH HOLD" -#: utils/mmgr/portalmem.c:1279 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "" "cannot perform transaction commands inside a cursor loop that is not read-" @@ -31350,37 +32390,37 @@ 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 "" "не удалось прочитать блок %ld временного файла (прочитано байт: %zu из %zu)" -#: 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 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "не удалось прочитать файл общего временного хранилища кортежей" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "неожиданный фрагмент в файле общего временного хранилища кортежей" -#: utils/sort/sharedtuplestore.c:570 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "" "не удалось переместиться к блоку %u в файле общего временного хранилища " "кортежей" -#: utils/sort/sharedtuplestore.c:577 +#: utils/sort/sharedtuplestore.c:579 #, c-format msgid "" "could not read from shared tuplestore temporary file: read only %zu of %zu " @@ -31389,22 +32429,22 @@ msgstr "" "не удалось прочитать файл общего временного хранилища кортежей (прочитано " "байт: %zu из %zu)" -#: utils/sort/tuplesort.c:3218 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "число потоков данных для внешней сортировки не может превышать %d" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "создать уникальный индекс \"%s\" не удалось" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "Ключ %s дублируется." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Данные содержат дублирующиеся ключи." @@ -31488,601 +32528,1244 @@ msgstr "" msgid "cannot import a snapshot from a different database" msgstr "нельзя импортировать снимок из другой базы данных" -#: gram.y:1108 +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "вариант UNENCRYPTED PASSWORD более не поддерживается" -#: gram.y:1109 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "" "Удалите слово UNENCRYPTED, чтобы сохранить пароль в зашифрованном виде." -#: gram.y:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "нераспознанный параметр роли \"%s\"" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не может включать элементы схемы" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "сменить текущую базу данных нельзя" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "" "интервал, задающий часовой пояс, должен иметь точность HOUR или HOUR TO " "MINUTE" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер столбца должен быть в диапазоне от 1 до %d" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр последовательности \"%s\" здесь не поддерживается" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль для хеш-секции указан неоднократно" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "остаток для хеш-секции указан неоднократно" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нераспознанное указание ограничения хеш-секции \"%s\"" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "необходимо указать модуль для хеш-секции" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "необходимо указать остаток для хеш-секции" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "указания STDIN/STDOUT несовместимы с PROGRAM" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "предложение WHERE не допускается с COPY TO" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "указание GLOBAL при создании временных таблиц устарело" -#: gram.y:3666 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "для генерируемого столбца должно указываться GENERATED ALWAYS" -#: gram.y:4635 +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "список столбцов с %s поддерживается только для действий ON DELETE" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM более не поддерживается" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нераспознанный вариант политики безопасности строк \"%s\"" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "" "В настоящее время поддерживаются только политики PERMISSIVE и RESTRICTIVE." -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не поддерживается" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "события триггера повторяются" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "противоречащие характеристики ограничения" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "оператор CREATE ASSERTION ещё не реализован" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK более не требуется" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "Обновите тип данных." -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "у агрегатных функций не может быть выходных аргументов" -#: gram.y:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "" "предложение WITH CHECK OPTION не поддерживается для рекурсивных представлений" -#: gram.y:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "синтаксис LIMIT #,# не поддерживается" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Используйте отдельные предложения LIMIT и OFFSET." -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "список VALUES во FROM должен иметь псевдоним" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Например, FROM (VALUES ...) [AS] foo." -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "подзапрос во FROM должен иметь псевдоним" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Например, FROM (SELECT ...) [AS] foo." -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допускается только одно значение DEFAULT" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "для столбца допускается только одно значение PATH" -#: gram.y:12687 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "" "конфликтующие или избыточные объявления NULL/NOT NULL для столбца \"%s\"" -#: gram.y:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нераспознанный параметр столбца \"%s\"" -#: gram.y:12950 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "тип float должен иметь точность минимум 1 бит" -#: gram.y:12959 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "тип float должен иметь точность меньше 54 бит" -#: gram.y:13457 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неверное число параметров в левой части выражения OVERLAPS" -#: gram.y:13462 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неверное число параметров в правой части выражения OVERLAPS" -#: gram.y:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "предикат UNIQUE ещё не реализован" -#: gram.y:13989 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ORDER BY с WITHIN GROUP можно указать только один раз" -#: gram.y:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT нельзя использовать с WITHIN GROUP" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC нельзя использовать с WITHIN GROUP" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "началом рамки не может быть UNBOUNDED FOLLOWING" -#: gram.y:14528 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "" "рамка, начинающаяся со следующей строки, не может заканчиваться текущей" -#: gram.y:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "концом рамки не может быть UNBOUNDED PRECEDING" -#: gram.y:14557 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "" "рамка, начинающаяся с текущей строки, не может иметь предшествующих строк" -#: gram.y:14564 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "" "рамка, начинающаяся со следующей строки, не может иметь предшествующих строк" -#: gram.y:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "параметр функции-модификатора типа должен быть безымянным" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "модификатор типа не может включать ORDER BY" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s нельзя использовать здесь как имя роли" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES нельзя задать без предложения ORDER BY" -#: gram.y:16478 gram.y:16667 -msgid "improper use of \"*\"" -msgstr "недопустимое использование \"*\"" +#: gram.y:17662 gram.y:17849 +msgid "improper use of \"*\"" +msgstr "недопустимое использование \"*\"" + +#: gram.y:17913 +#, 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:17950 +#, c-format +msgid "multiple ORDER BY clauses not allowed" +msgstr "ORDER BY можно указать только один раз" + +#: gram.y:17961 +#, c-format +msgid "multiple OFFSET clauses not allowed" +msgstr "OFFSET можно указать только один раз" + +#: gram.y:17970 +#, c-format +msgid "multiple LIMIT clauses not allowed" +msgstr "LIMIT можно указать только один раз" + +#: gram.y:17979 +#, c-format +msgid "multiple limit options not allowed" +msgstr "параметры LIMIT можно указать только один раз" + +#: gram.y:18006 +#, c-format +msgid "multiple WITH clauses not allowed" +msgstr "WITH можно указать только один раз" + +#: gram.y:18199 +#, c-format +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "в табличных функциях не может быть аргументов OUT и INOUT" + +#: gram.y:18332 +#, c-format +msgid "multiple COLLATE clauses not allowed" +msgstr "COLLATE можно указать только один раз" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18370 gram.y:18383 +#, c-format +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "ограничения %s не могут иметь характеристики DEFERRABLE" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18396 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "ограничения %s не могут иметь характеристики NOT VALID" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18409 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "ограничения %s не могут иметь характеристики NO INHERIT" + +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "неверный список объектов публикации" + +#: gram.y:18434 +#, c-format +msgid "" +"One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " +"or schema name." +msgstr "" +"Перед именем отдельной таблицы или схемы нужно указать TABLE либо TABLES IN " +"SCHEMA." + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "неверное имя таблицы" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "предложение WHERE не допускается для схемы" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "указание столбца не допускается для схемы" + +#: gram.y:18492 +#, c-format +msgid "invalid schema name" +msgstr "неверное имя схемы" + +#: guc-file.l:314 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "нераспознанный параметр конфигурации \"%s\" в файле \"%s\", строке %d" + +#: guc-file.l:389 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "" +"параметр \"%s\" удалён из файла конфигурации, он принимает значение по " +"умолчанию" + +#: guc-file.l:454 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "параметр \"%s\" принял значение \"%s\"" + +#: guc-file.l:496 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "файл конфигурации \"%s\" содержит ошибки" + +#: guc-file.l:501 +#, c-format +msgid "" +"configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "" +"файл конфигурации \"%s\" содержит ошибки; были применены не зависимые " +"изменения" + +#: guc-file.l:506 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "файл конфигурации \"%s\" содержит ошибки; изменения не были применены" + +#: guc-file.l:578 +#, c-format +msgid "empty configuration file name: \"%s\"" +msgstr "пустое имя файла конфигурации: \"%s\"" + +#: guc-file.l:595 +#, c-format +msgid "" +"could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "" +"открыть файл конфигурации \"%s\" не удалось: превышен предел вложенности" + +#: guc-file.l:615 +#, c-format +msgid "configuration file recursion in \"%s\"" +msgstr "рекурсивная вложенность файла конфигурации в \"%s\"" + +#: guc-file.l:642 +#, c-format +msgid "skipping missing configuration file \"%s\"" +msgstr "отсутствующий файл конфигурации \"%s\" пропускается" + +#: guc-file.l:896 +#, c-format +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "ошибка синтаксиса в файле \"%s\", в конце строки %u" + +#: guc-file.l:906 +#, c-format +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "ошибка синтаксиса в файле \"%s\", в строке %u, рядом с \"%s\"" + +#: guc-file.l:926 +#, c-format +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "" +"обнаружено слишком много синтаксических ошибок, обработка файла \"%s\" " +"прекращается" + +#: guc-file.l:981 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "пустое имя каталога конфигурации: \"%s\"" + +#: guc-file.l:1000 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "открыть каталог конфигурации \"%s\" не удалось: %m" + +#: jsonpath_gram.y:530 +#, c-format +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "Нераспознанный символ флага \"%.*s\" в предикате LIKE_REGEX." + +#: jsonpath_gram.y:584 +#, c-format +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "" +"флаг \"x\" языка XQuery (расширенные регулярные выражения) не реализован" + +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:282 +#, c-format +msgid "%s at end of jsonpath input" +msgstr "%s в конце аргумента jsonpath" + +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:289 +#, c-format +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "%s в строке jsonpath (примерное положение: \"%s\")" + +#: repl_gram.y:303 repl_gram.y:335 +#, c-format +msgid "invalid timeline %u" +msgstr "неверная линия времени %u" + +#: repl_scanner.l:142 +msgid "invalid streaming start location" +msgstr "неверная позиция начала потока" + +#: repl_scanner.l:199 scan.l:724 +msgid "unterminated quoted string" +msgstr "незавершённая строка в кавычках" + +#: scan.l:465 +msgid "unterminated /* comment" +msgstr "незавершённый комментарий /*" + +#: scan.l:485 +msgid "unterminated bit string literal" +msgstr "оборванная битовая строка" + +#: scan.l:499 +msgid "unterminated hexadecimal string literal" +msgstr "оборванная шестнадцатеричная строка" + +#: scan.l:549 +#, c-format +msgid "unsafe use of string constant with Unicode escapes" +msgstr "небезопасное использование строковой константы со спецкодами Unicode" + +#: 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:611 +msgid "unhandled previous state in xqs" +msgstr "" +"необрабатываемое предыдущее состояние при обнаружении закрывающего апострофа" + +#: scan.l:685 +#, c-format +msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +msgstr "Спецкоды Unicode должны иметь вид \\uXXXX или \\UXXXXXXXX." + +#: scan.l:696 +#, c-format +msgid "unsafe use of \\' in a string literal" +msgstr "небезопасное использование символа \\' в строке" + +#: scan.l:697 +#, c-format +msgid "" +"Use '' to write quotes in strings. \\' is insecure in client-only encodings." +msgstr "" +"Записывайте апостроф в строке в виде ''. Запись \\' небезопасна для " +"исключительно клиентских кодировок." + +#: scan.l:769 +msgid "unterminated dollar-quoted string" +msgstr "незавершённая строка с $" + +#: scan.l:786 scan.l:796 +msgid "zero-length delimited identifier" +msgstr "пустой идентификатор в кавычках" + +#: scan.l:807 syncrep_scanner.l:91 +msgid "unterminated quoted identifier" +msgstr "незавершённый идентификатор в кавычках" + +#: 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:1183 +#, c-format +msgid "%s at end of input" +msgstr "%s в конце" + +#. translator: first %s is typically the translation of "syntax error" +#: scan.l:1191 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s (примерное положение: \"%s\")" + +#: scan.l:1382 +#, c-format +msgid "nonstandard use of \\' in a string literal" +msgstr "нестандартное применение \\' в строке" + +#: scan.l:1383 +#, c-format +msgid "" +"Use '' to write quotes in strings, or use the escape string syntax (E'...')." +msgstr "" +"Записывайте апостроф в строках в виде '' или используйте синтаксис спецстрок " +"(E'...')." + +#: scan.l:1392 +#, c-format +msgid "nonstandard use of \\\\ in a string literal" +msgstr "нестандартное применение \\\\ в строке" + +#: scan.l:1393 +#, c-format +msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." +msgstr "" +"Используйте для записи обратных слэшей синтаксис спецстрок, например E'\\\\'." + +#: scan.l:1407 +#, c-format +msgid "nonstandard use of escape in a string literal" +msgstr "нестандартное использование спецсимвола в строке" + +#: scan.l:1408 +#, c-format +msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." +msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "не удалось выделить память для декодирования записи длины %u" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "длина записи %u в позиции %X/%X слишком велика" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "нет записи contrecord в %X/%X" + +#, c-format +#~ msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +#~ msgstr "" +#~ "неожиданный конец файла для ленты %p: запрашивалось байт: %zu, прочитано: " +#~ "%zu" + +#, c-format +#~ msgid "could not read from temporary file: %m" +#~ msgstr "не удалось прочитать из временного файла: %m" + +#, c-format +#~ msgid "Triggers on partitioned tables cannot have transition tables." +#~ msgstr "" +#~ "Триггеры секционированных таблиц не могут использовать переходные таблицы." + +#, c-format +#~ msgid "int2vector has too many elements" +#~ msgstr "int2vector содержит слишком много элементов" + +#, c-format +#~ msgid "oidvector has too many elements" +#~ msgstr "oidvector содержит слишком много элементов" + +#~ msgid "Enables reordering of GROUP BY keys." +#~ msgstr "Включает переупорядочивание ключей GROUP BY." + +#~ msgid "unknown compression option \"%s\"" +#~ msgstr "неизвестный параметр сжатия \"%s\"" + +#~ msgid "invalid list syntax for \"publish\" option" +#~ msgstr "неверный синтаксис параметра \"publish\"" + +#~ msgid "unrecognized \"publish\" value: \"%s\"" +#~ msgstr "нераспознанное значение \"publish\": \"%s\"" + +#~ msgid "" +#~ "Table \"%s\" in schema \"%s\" is already part of the publication, adding " +#~ "the same schema is not supported." +#~ msgstr "" +#~ "Таблица \"%s\" в схеме \"%s\" уже является частью публикации, добавление " +#~ "той же схемы не поддерживается." + +#~ msgid "cannot add relation \"%s.%s\" to publication" +#~ msgstr "добавить отношение \"%s.%s\" в публикацию нельзя" + +#~ msgid "" +#~ "Table's schema \"%s\" is already part of the publication or part of the " +#~ "specified schema list." +#~ msgstr "" +#~ "Схема \"%s\", содержащая таблицу, уже является частью публикации или " +#~ "присутствует в заданном списке схем." + +#~ msgid "cannot use publication column list for relation \"%s\"" +#~ msgstr "" +#~ "использовать в публикации список столбцов для отношения \"%s\" нельзя" + +#~ msgid "" +#~ "Tables from schema cannot be added to, dropped from, or set on FOR ALL " +#~ "TABLES publications." +#~ msgstr "" +#~ "В публикациях вида FOR ALL TABLES нельзя добавлять, удалять или заменять " +#~ "таблицы из схемы." + +#~ msgid "cannot move table \"%s\" to schema \"%s\"" +#~ msgstr "переместить таблицу \"%s\" в схему \"%s\" нельзя" + +#~ msgid "" +#~ "The schema \"%s\" and same schema's table \"%s\" cannot be part of the " +#~ "same publication \"%s\"." +#~ msgstr "" +#~ "Схема \"%s\" и таблица \"%s\" этой же схемы не могут входить в одну " +#~ "публикацию \"%s\"." + +#~ msgid "" +#~ "logical replication apply worker for subscription \"%s\" two_phase is %s" +#~ msgstr "" +#~ "в применяющем процессе логической репликации для подписки \"%s\" " +#~ "состояние two_phase: %s" + +#~ msgid "start skipping logical replication transaction finished at %X/%X" +#~ msgstr "" +#~ "в ходе логической репликации начинается пропуск транзакции, завершённой в " +#~ "%X/%X" + +#~ msgid "unlinked permanent statistics file \"%s\"" +#~ msgstr "постоянный файл статистики \"%s\" удалён" + +#~ msgid "" +#~ "database \"%s\" has no actual collation version, but a version was " +#~ "recorded" +#~ msgstr "" +#~ "для правила сортировки в базе данных \"%s\" версия фактически не " +#~ "определена, но при этом она записана" + +#, fuzzy +#~ msgid "unrecognized JSON encoding: %s" +#~ msgstr "нераспознанная кодировка: \"%s\"" + +#, fuzzy +#~ msgid "cannot use JSON format with non-string output types" +#~ msgstr "привести строку jsonb к типу %s нельзя" + +#, fuzzy +#~ msgid "unsupported JSON encoding" +#~ msgstr "неподдерживаемый код формата: %d" + +#, fuzzy +#~ msgid "returning SETOF types is not supported in SQL/JSON functions" +#~ msgstr "для SQL-функций тип возврата %s не поддерживается" + +#, fuzzy +#~ msgid "cannot use type %s in IS JSON predicate" +#~ msgstr "в предикате индекса нельзя использовать агрегатные функции" + +#, fuzzy +#~ msgid "JSON_TABLE path name is not allowed here" +#~ msgstr "SELECT ... INTO здесь не допускается" + +#, fuzzy +#~ msgid "JSON path expression must be type %s, not type %s" +#~ msgstr "аргумент конструкции %s должен иметь тип %s, а не %s" + +#, fuzzy +#~ msgid "cannot cast DEFAULT expression type %s to %s" +#~ msgstr "привести тип %s к %s нельзя" + +#, fuzzy +#~ msgid "JSON_TABLE() is not yet implemented for the json type" +#~ msgstr "REINDEX для секционированных индексов ещё не реализован" + +#, fuzzy +#~ msgid "%s() is not yet implemented for the json type" +#~ msgstr "политики для этой команды ещё не реализованы" + +#, fuzzy +#~ msgid "cannot use RETURNING type %s in %s" +#~ msgstr "привести тип %s к %s нельзя" + +#, fuzzy +#~ msgid "invalid JSON_TABLE plan" +#~ msgstr "неверное указание OWNED BY" + +#, fuzzy +#~ msgid "invalid JSON_TABLE expression" +#~ msgstr "неверное регулярное выражение: %s" + +#, fuzzy +#~ msgid "duplicate JSON key %s" +#~ msgstr "Данные содержат дублирующиеся ключи." + +#~ msgid "fatal: " +#~ msgstr "важно: " + +#~ msgid "You need to rebuild PostgreSQL using %s." +#~ msgstr "Необходимо перекомпилировать PostgreSQL с ключом %s." + +#~ msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" +#~ msgstr "" +#~ "в данный момент нельзя удалить \"мёртвых\" строк: %lld, старейший xmin: " +#~ "%u\n" + +#~ msgid "Skipped %u page due to buffer pins, " +#~ msgid_plural "Skipped %u pages due to buffer pins, " +#~ msgstr[0] "Пропущено страниц, закреплённых в буфере: %u," +#~ msgstr[1] "Пропущено страниц, закреплённых в буфере: %u," +#~ msgstr[2] "Пропущено страниц, закреплённых в буфере: %u," + +#~ msgid "%u frozen page.\n" +#~ msgid_plural "%u frozen pages.\n" +#~ msgstr[0] "замороженных страниц: %u.\n" +#~ msgstr[1] "замороженных страниц: %u.\n" +#~ msgstr[2] "замороженных страниц: %u.\n" + +#~ msgid "" +#~ "table \"%s\": found %lld removable, %lld nonremovable row versions in %u " +#~ "out of %u pages" +#~ msgstr "" +#~ "таблица \"%s\": найдено удаляемых версий строк: %lld, неудаляемых: %lld, " +#~ "обработано страниц: %u, всего страниц: %u" + +#~ msgid "" +#~ "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) " +#~ "have %lld dead item identifiers" +#~ msgstr "" +#~ "таблица \"%s\": сканирование индекса пропущено: на страницах таблицы (%u, " +#~ "%.2f%% от общего числа) находится мёртвых идентификаторов элементов: %lld" + +#~ 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 "a backup is already in progress" +#~ msgstr "резервное копирование уже выполняется" + +#~ msgid "Run pg_stop_backup() and try again." +#~ msgstr "Выполните pg_stop_backup() и повторите операцию." + +#~ msgid "" +#~ "If you're sure there is no backup in progress, remove file \"%s\" and try " +#~ "again." +#~ msgstr "" +#~ "Если вы считаете, что информация о резервном копировании неверна, удалите " +#~ "файл \"%s\" и попробуйте снова." + +#~ msgid "exclusive backup not in progress" +#~ msgstr "монопольное резервное копирование не выполняется" + +#~ msgid "online backup mode was not canceled" +#~ msgstr "режим копирования \"на ходу\" не был отменён" + +#~ msgid "File \"%s\" could not be renamed to \"%s\": %m." +#~ msgstr "Не удалось переименовать файл \"%s\" в \"%s\": %m." + +#~ msgid "online backup mode canceled" +#~ msgstr "режим копирования \"на ходу\" отменён" + +#~ msgid "" +#~ "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." +#~ msgstr "" +#~ "Файлы \"%s\" и \"%s\" были переименованы в \"%s\" и \"%s\", " +#~ "соответственно." + +#~ msgid "" +#~ "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed " +#~ "to \"%s\": %m." +#~ msgstr "" +#~ "Файл \"%s\" был переименован в \"%s\", но переименовать \"%s\" в \"%s\" " +#~ "не удалось: %m." + +#~ msgid "non-exclusive backup in progress" +#~ msgstr "выполняется не монопольное резервное копирование" + +#~ msgid "non-exclusive backup is not in progress" +#~ msgstr "немонопольное резервное копирование не выполняется" + +#~ msgid "Did you mean to use pg_stop_backup('t')?" +#~ msgstr "Вероятно, подразумевалось pg_stop_backup('t')?" + +#~ msgid "must be superuser to call pg_nextoid()" +#~ msgstr "выполнять pg_nextoid() может только суперпользователь" + +#~ msgid "Only tables can be added to publications." +#~ msgstr "В публикации можно добавлять только таблицы." + +#~ msgid "\"%s\" is a system table" +#~ msgstr "\"%s\" - это системная таблица" + +#~ msgid "System tables cannot be added to publications." +#~ msgstr "Системные таблицы нельзя добавлять в публикации." + +#~ msgid "table \"%s\" cannot be replicated" +#~ msgstr "реплицировать таблицу \"%s\" нельзя" + +#~ msgid "" +#~ "\"%s\" is not a table, view, materialized view, composite type, or " +#~ "foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, представление, мат. представление, составной тип " +#~ "или сторонняя таблица" + +#~ msgid "COPY HEADER available only in CSV mode" +#~ msgstr "COPY HEADER можно использовать только в режиме CSV" + +#~ msgid "\"%s\" is not a table or view" +#~ msgstr "\"%s\" - это не таблица и не представление" + +#~ msgid "utility statements cannot be prepared" +#~ msgstr "служебные SQL-операторы нельзя подготовить" + +#~ msgid "unlogged sequences are not supported" +#~ msgstr "нежурналируемые последовательности не поддерживаются" + +#~ msgid "referenced relation \"%s\" is not a table or foreign table" +#~ msgstr "указанный объект \"%s\" не является таблицей или сторонней таблицей" + +#~ msgid "relation \"%s\" is not a table, foreign table, or materialized view" +#~ msgstr "" +#~ "отношение \"%s\" - это не таблица, не сторонняя таблица и не " +#~ "материализованное представление" + +#~ msgid "" +#~ "\"%s\" is not a table, view, materialized view, composite type, index, or " +#~ "foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, представление, материализованное представление, " +#~ "составной тип, индекс или сторонняя таблица" + +#~ msgid "\"%s\" is not a table, view, or foreign table" +#~ msgstr "\"%s\" - это не таблица, представление и не сторонняя таблица" + +#~ msgid "\"%s\" is not a table, view, materialized view, or index" +#~ msgstr "" +#~ "\"%s\" - это не таблица, представление, материализованное представление " +#~ "или индекс" + +#~ msgid "\"%s\" is not a table, materialized view, or index" +#~ msgstr "\"%s\" - это не таблица, материализованное представление или индекс" + +#~ msgid "" +#~ "\"%s\" is not a table, materialized view, index, or partitioned index" +#~ msgstr "" +#~ "\"%s\" - это не таблица, материализованное представление, индекс или " +#~ "секционированный индекс" + +#~ msgid "" +#~ "\"%s\" is not a table, materialized view, index, partitioned index, or " +#~ "foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, материализованное представление, индекс, " +#~ "секционированный индекс или сторонняя таблица" + +#~ msgid "\"%s\" is not a table, materialized view, or foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, материализованное представление или сторонняя " +#~ "таблица" + +#~ msgid "\"%s\" is not a table or foreign table" +#~ msgstr "\"%s\" - это не таблица и не сторонняя таблица" + +#~ msgid "\"%s\" is not a table, composite type, or foreign table" +#~ msgstr "\"%s\" - это не таблица, составной тип или сторонняя таблица" + +#~ msgid "\"%s\" is not a table, materialized view, index, or foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, материализованное представление, индекс или " +#~ "сторонняя таблица" + +#~ msgid "\"%s\" is not a table or partitioned index" +#~ msgstr "\"%s\" - это не таблица и не секционированный индекс" + +#~ msgid "\"%s\" is of the wrong type" +#~ msgstr "неправильный тип \"%s\"" + +#~ msgid "\"%s\" is not a table, view, sequence, or foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, TOAST-таблица, индекс, представление или " +#~ "последовательность" + +#~ msgid "" +#~ "\"%s\" is not a table, view, materialized view, index, or TOAST table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, представление, материализованное представление, " +#~ "индекс или TOAST-таблица" + +#~ msgid "" +#~ "\"%s\" is not a table, view, materialized view, sequence, or foreign table" +#~ msgstr "" +#~ "\"%s\" - это не таблица, представление, мат. представление, " +#~ "последовательность или сторонняя таблица" + +#~ msgid "\"%s.%s\" is a foreign table." +#~ msgstr "\"%s.%s\" — сторонняя таблица." + +#~ msgid "\"%s.%s\" is not a table." +#~ msgstr "\"%s.%s\" — не таблица." + +#~ msgid "Compile with --with-ssl to use SSL connections." +#~ msgstr "Для работы с SSL скомпилируйте postgresql с ключом --with-ssl." + +#~ msgid "Compile with --with-gssapi to use GSSAPI connections." +#~ msgstr "" +#~ "Для работы с GSSAPI скомпилируйте postgresql с ключом --with-gssapi." + +#~ msgid "could not poll socket: %m" +#~ msgstr "не удалось опросить сокет: %m" + +#~ msgid " -x NUM internal use\n" +#~ msgstr " -x ЧИСЛО параметр для внутреннего использования\n" + +#~ msgid "too many range table entries" +#~ msgstr "слишком много элементов RTE" -#: gram.y:16731 -#, 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 того же типа данных" +#~ msgid "column alias list for \"%s\" has too many entries" +#~ msgstr "слишком много записей в списке псевдонимов столбца \"%s\"" -#: gram.y:16768 -#, c-format -msgid "multiple ORDER BY clauses not allowed" -msgstr "ORDER BY можно указать только один раз" +#~ msgid "" +#~ "background worker \"%s\": must attach to shared memory in order to " +#~ "request a database connection" +#~ msgstr "" +#~ "фоновый процесс \"%s\" должен иметь доступ к общей памяти, чтобы " +#~ "запросить подключение к БД" -#: gram.y:16779 -#, c-format -msgid "multiple OFFSET clauses not allowed" -msgstr "OFFSET можно указать только один раз" +#~ msgid "could not resolve \"localhost\": %s" +#~ msgstr "не удалось разрешить \"localhost\": %s" -#: gram.y:16788 -#, c-format -msgid "multiple LIMIT clauses not allowed" -msgstr "LIMIT можно указать только один раз" +#~ msgid "trying another address for the statistics collector" +#~ msgstr "проба другого адреса для сборщика статистики" -#: gram.y:16797 -#, c-format -msgid "multiple limit options not allowed" -msgstr "параметры LIMIT можно указать только один раз" +#~ msgid "could not create socket for statistics collector: %m" +#~ msgstr "не удалось создать сокет для сборщика статистики: %m" -#: gram.y:16824 -#, c-format -msgid "multiple WITH clauses not allowed" -msgstr "WITH можно указать только один раз" +#~ msgid "could not bind socket for statistics collector: %m" +#~ msgstr "не удалось привязаться к сокету для сборщика статистики: %m" -#: gram.y:17018 -#, c-format -msgid "OUT and INOUT arguments aren't allowed in TABLE functions" -msgstr "в табличных функциях не может быть аргументов OUT и INOUT" +#~ msgid "could not get address of socket for statistics collector: %m" +#~ msgstr "не удалось получить адрес сокета для сборщика статистики: %m" -#: gram.y:17114 -#, c-format -msgid "multiple COLLATE clauses not allowed" -msgstr "COLLATE можно указать только один раз" +#~ msgid "could not connect socket for statistics collector: %m" +#~ msgstr "не удалось подключить сокет для сборщика статистики: %m" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17152 gram.y:17165 -#, c-format -msgid "%s constraints cannot be marked DEFERRABLE" -msgstr "ограничения %s не могут иметь характеристики DEFERRABLE" +#~ msgid "could not send test message on socket for statistics collector: %m" +#~ msgstr "" +#~ "не удалось послать тестовое сообщение в сокет для сборщика статистики: %m" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17178 -#, c-format -msgid "%s constraints cannot be marked NOT VALID" -msgstr "ограничения %s не могут иметь характеристики NOT VALID" +#~ msgid "select() failed in statistics collector: %m" +#~ msgstr "сбой select() в сборщике статистики: %m" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17191 -#, c-format -msgid "%s constraints cannot be marked NO INHERIT" -msgstr "ограничения %s не могут иметь характеристики NO INHERIT" +#~ msgid "test message did not get through on socket for statistics collector" +#~ msgstr "тестовое сообщение не прошло через сокет для сборщика статистики" -#: guc-file.l:314 -#, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "нераспознанный параметр конфигурации \"%s\" в файле \"%s\", строке %d" +#~ msgid "" +#~ "could not receive test message on socket for statistics collector: %m" +#~ msgstr "" +#~ "тестовое сообщение через сокет для сборщика статистики получить не " +#~ "удалось: %m" -#: guc-file.l:389 -#, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "" -"параметр \"%s\" удалён из файла конфигурации, он принимает значение по " -"умолчанию" +#~ msgid "" +#~ "incorrect test message transmission on socket for statistics collector" +#~ msgstr "" +#~ "тестовое сообщение через сокет для сборщика статистики прошло неверно" -#: guc-file.l:455 -#, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "параметр \"%s\" принял значение \"%s\"" +#~ msgid "could not set statistics collector socket to nonblocking mode: %m" +#~ msgstr "" +#~ "не удалось переключить сокет сборщика статистики в неблокирующий режим: %m" -#: guc-file.l:497 -#, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "файл конфигурации \"%s\" содержит ошибки" +#~ msgid "disabling statistics collector for lack of working socket" +#~ msgstr "сборщик статистики отключается из-за нехватки рабочего сокета" -#: guc-file.l:502 -#, c-format -msgid "" -"configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "" -"файл конфигурации \"%s\" содержит ошибки; были применены не зависимые " -"изменения" +#~ msgid "could not fork statistics collector: %m" +#~ msgstr "не удалось породить процесс сборщика статистики: %m" -#: guc-file.l:507 -#, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "файл конфигурации \"%s\" содержит ошибки; изменения не были применены" +#~ msgid "could not read statistics message: %m" +#~ msgstr "не удалось прочитать сообщение статистики: %m" -#: guc-file.l:579 -#, c-format -msgid "empty configuration file name: \"%s\"" -msgstr "пустое имя файла конфигурации: \"%s\"" +#~ msgid "statistics collector's time %s is later than backend local time %s" +#~ msgstr "" +#~ "время сборщика статистики %s опережает локальное время обслуживающего " +#~ "процесса %s" -#: guc-file.l:596 -#, c-format -msgid "" -"could not open configuration file \"%s\": maximum nesting depth exceeded" -msgstr "" -"открыть файл конфигурации \"%s\" не удалось: превышен предел вложенности" +#~ msgid "" +#~ "using stale statistics instead of current ones because stats collector is " +#~ "not responding" +#~ msgstr "" +#~ "используется просроченная статистика вместо текущей, так как сборщик " +#~ "статистики не отвечает" -#: guc-file.l:616 -#, c-format -msgid "configuration file recursion in \"%s\"" -msgstr "рекурсивная вложенность файла конфигурации в \"%s\"" +#~ msgid "stats_timestamp %s is later than collector's time %s for database %u" +#~ msgstr "" +#~ "stats_timestamp %s опережает время сборщика статистики %s для базы данных " +#~ "%u" -#: guc-file.l:643 -#, c-format -msgid "skipping missing configuration file \"%s\"" -msgstr "отсутствующий файл конфигурации \"%s\" пропускается" +#~ msgid "database hash table corrupted during cleanup --- abort" +#~ msgstr "таблица хеша базы данных испорчена при очистке --- прерывание" -#: guc-file.l:897 -#, c-format -msgid "syntax error in file \"%s\" line %u, near end of line" -msgstr "ошибка синтаксиса в файле \"%s\", в конце строки %u" +#~ msgid "statistics collector process" +#~ msgstr "процесс сбора статистики" -#: guc-file.l:907 -#, c-format -msgid "syntax error in file \"%s\" line %u, near token \"%s\"" -msgstr "ошибка синтаксиса в файле \"%s\", в строке %u, рядом с \"%s\"" +#~ msgid "base backup could not send data, aborting backup" +#~ msgstr "" +#~ "в процессе базового резервного копирования не удалось передать данные, " +#~ "копирование прерывается" -#: guc-file.l:927 -#, c-format -msgid "too many syntax errors found, abandoning file \"%s\"" -msgstr "" -"обнаружено слишком много синтаксических ошибок, обработка файла \"%s\" " -"прекращается" +#~ msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" +#~ msgstr "Команда IDENTIFY_SYSTEM не выполнялась до START_REPLICATION" -#: guc-file.l:982 -#, c-format -msgid "empty configuration directory name: \"%s\"" -msgstr "пустое имя каталога конфигурации: \"%s\"" +#~ msgid "could not delete shared fileset \"%s\": %m" +#~ msgstr "ошибка удаления разделяемого набора файлов \"%s\": %m" -#: guc-file.l:1001 -#, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "открыть каталог конфигурации \"%s\" не удалось: %m" +#~ msgid "\"time\" units \"%s\" not recognized" +#~ msgstr "\"время\" содержит нераспознанные единицы \"%s\"" -#: jsonpath_gram.y:529 -#, c-format -msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" -msgstr "нераспознанный символ флага \"%.*s\" в предикате LIKE_REGEX" +#~ msgid "\"time with time zone\" units \"%s\" not recognized" +#~ msgstr "\"время с часовым поясом\" содержит нераспознанные единицы \"%s\"" -#: jsonpath_gram.y:583 -#, c-format -msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" -msgstr "" -"флаг \"x\" языка XQuery (расширенные регулярные выражения) не реализован" +#~ msgid "reference to parent directory (\"..\") not allowed" +#~ msgstr "ссылка на родительский каталог (\"..\") недопустима" -#. translator: %s is typically "syntax error" -#: jsonpath_scan.l:286 -#, c-format -msgid "%s at end of jsonpath input" -msgstr "%s в конце аргумента jsonpath" +#~ msgid "function \"dist_lb\" not implemented" +#~ msgstr "функция \"dist_lb\" не реализована" -#. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:293 -#, c-format -msgid "%s at or near \"%s\" of jsonpath input" -msgstr "%s в строке jsonpath (примерное положение: \"%s\")" +#~ msgid "function \"dist_bl\" not implemented" +#~ msgstr "функция \"dist_bl\" не реализована" -#: repl_gram.y:345 repl_gram.y:377 -#, c-format -msgid "invalid timeline %u" -msgstr "неверная линия времени %u" +#~ msgid "function \"close_sl\" not implemented" +#~ msgstr "функция \"close_sl\" не реализована" -#: repl_scanner.l:150 -msgid "invalid streaming start location" -msgstr "неверная позиция начала потока" +#~ msgid "function \"close_lb\" not implemented" +#~ msgstr "функция \"close_lb\" не реализована" -#: repl_scanner.l:206 scan.l:717 -msgid "unterminated quoted string" -msgstr "незавершённая строка в кавычках" +#~ msgid "function \"poly_distance\" not implemented" +#~ msgstr "функция \"poly_distance\" не реализована" -#: scan.l:458 -msgid "unterminated /* comment" -msgstr "незавершённый комментарий /*" +#~ msgid "function \"path_center\" not implemented" +#~ msgstr "функция \"path_center\" не реализована" -#: scan.l:478 -msgid "unterminated bit string literal" -msgstr "оборванная битовая строка" +#~ msgid "must be a superuser to log memory contexts" +#~ msgstr "" +#~ "получать информацию о содержимом памяти может только суперпользователь" -#: scan.l:492 -msgid "unterminated hexadecimal string literal" -msgstr "оборванная шестнадцатеричная строка" +#~ msgid "range_agg must be called with a range" +#~ msgstr "функция range_agg должна вызываться с диапазоном" -#: scan.l:542 -#, c-format -msgid "unsafe use of string constant with Unicode escapes" -msgstr "небезопасное использование строковой константы со спецкодами Unicode" +#~ msgid "range_intersect_agg must be called with a multirange" +#~ msgstr "функция range_intersect_agg должна вызываться с мультидиапазоном" -#: scan.l:543 -#, c-format -msgid "" -"String constants with Unicode escapes cannot be used when " -"standard_conforming_strings is off." -msgstr "" -"Строки со спецкодами Unicode нельзя использовать, когда параметр " -"standard_conforming_strings выключен." +#~ msgid "value \"%s\" is out of range for 8-bit integer" +#~ msgstr "значение \"%s\" вне диапазона для 8-битового integer" -#: scan.l:604 -msgid "unhandled previous state in xqs" -msgstr "" -"необрабатываемое предыдущее состояние при обнаружении закрывающего апострофа" +#~ msgid "" +#~ "collations with different collate and ctype values are not supported by " +#~ "ICU" +#~ msgstr "" +#~ "ICU не поддерживает правила сортировки с разными значениями collate и " +#~ "ctype" -#: scan.l:678 -#, c-format -msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." -msgstr "Спецкоды Unicode должны иметь вид \\uXXXX или \\UXXXXXXXX." +#~ msgid "range_intersect_agg must be called with a range" +#~ msgstr "функция range_intersect_agg должна вызываться с диапазоном" -#: scan.l:689 -#, c-format -msgid "unsafe use of \\' in a string literal" -msgstr "небезопасное использование символа \\' в строке" +#~ msgid "timestamp units \"%s\" not supported" +#~ msgstr "единицы timestamp \"%s\" не поддерживаются" -#: scan.l:690 -#, c-format -msgid "" -"Use '' to write quotes in strings. \\' is insecure in client-only encodings." -msgstr "" -"Записывайте апостроф в строке в виде ''. Запись \\' небезопасна для " -"исключительно клиентских кодировок." +#~ msgid "timestamp units \"%s\" not recognized" +#~ msgstr "единицы timestamp \"%s\" не распознаны" -#: scan.l:762 -msgid "unterminated dollar-quoted string" -msgstr "незавершённая строка с $" +#~ msgid "timestamp with time zone units \"%s\" not supported" +#~ msgstr "единицы timestamp с часовым поясом \"%s\" не поддерживаются" -#: scan.l:779 scan.l:789 -msgid "zero-length delimited identifier" -msgstr "пустой идентификатор в кавычках" +#~ msgid "timestamp with time zone units \"%s\" not recognized" +#~ msgstr "единицы timestamp с часовым поясом \"%s\" не распознаны" -#: scan.l:800 syncrep_scanner.l:91 -msgid "unterminated quoted identifier" -msgstr "незавершённый идентификатор в кавычках" +#~ msgid "interval units \"%s\" not supported" +#~ msgstr "единицы interval \"%s\" не поддерживаются" -#: scan.l:963 -msgid "operator too long" -msgstr "слишком длинный оператор" +#~ msgid "interval units \"%s\" not recognized" +#~ msgstr "единицы interval \"%s\" не распознаны" -#. translator: %s is typically the translation of "syntax error" -#: scan.l:1171 -#, c-format -msgid "%s at end of input" -msgstr "%s в конце" +#~ msgid "new replication connections are not allowed during database shutdown" +#~ msgstr "" +#~ "новые подключения для репликации не допускаются в процессе остановки БД" -#. translator: first %s is typically the translation of "syntax error" -#: scan.l:1179 -#, c-format -msgid "%s at or near \"%s\"" -msgstr "%s (примерное положение: \"%s\")" +#~ msgid "must be superuser to connect during database shutdown" +#~ msgstr "" +#~ "нужно быть суперпользователем, чтобы подключиться в процессе остановки БД" -#: scan.l:1373 -#, c-format -msgid "nonstandard use of \\' in a string literal" -msgstr "нестандартное применение \\' в строке" +#~ msgid "" +#~ "Forces a switch to the next WAL file if a new file has not been started " +#~ "within N seconds." +#~ msgstr "" +#~ "Принудительно переключаться на следующий файл WAL, если начать новый файл " +#~ "за N секунд не удалось." -#: scan.l:1374 -#, c-format -msgid "" -"Use '' to write quotes in strings, or use the escape string syntax (E'...')." -msgstr "" -"Записывайте апостроф в строках в виде '' или используйте синтаксис спецстрок " -"(E'...')." +#~ msgid "Waits N seconds on connection startup after authentication." +#~ msgstr "Ждать N секунд при подключении после проверки подлинности." -#: scan.l:1383 -#, c-format -msgid "nonstandard use of \\\\ in a string literal" -msgstr "нестандартное применение \\\\ в строке" +#~ msgid "Waits N seconds on connection startup before authentication." +#~ msgstr "Ждать N секунд при подключении до проверки подлинности." -#: scan.l:1384 -#, c-format -msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." -msgstr "" -"Используйте для записи обратных слэшей синтаксис спецстрок, например E'\\\\'." +#~ msgid "" +#~ "Enables warnings if checkpoint segments are filled more frequently than " +#~ "this." +#~ msgstr "" +#~ "Выдаёт предупреждения, когда сегменты контрольных точек заполняются за " +#~ "это время." -#: scan.l:1398 -#, c-format -msgid "nonstandard use of escape in a string literal" -msgstr "нестандартное использование спецсимвола в строке" +#~ msgid "" +#~ "When logging statements, limit logged parameter values to first N bytes." +#~ msgstr "" +#~ "Обрезать длинные значения параметров выводимых в журнал операторов до " +#~ "первых N байт." -#: scan.l:1399 -#, c-format -msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." -msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#~ msgid "" +#~ "When reporting an error, limit logged parameter values to first N bytes." +#~ msgstr "" +#~ "Обрезать значения параметров, выводимые в сообщениях об ошибках, до " +#~ "первых N байт." -#, c-format -#~ msgid "record length %u at %X/%X too long" -#~ msgstr "длина записи %u в позиции %X/%X слишком велика" +#~ msgid "Automatic log file rotation will occur after N minutes." +#~ msgstr "Автоматическая прокрутка файла протокола через каждые N минут." -#, c-format -#~ msgid "Triggers on partitioned tables cannot have transition tables." +#~ msgid "Automatic log file rotation will occur after N kilobytes." #~ msgstr "" -#~ "Триггеры секционированных таблиц не могут использовать переходные таблицы." +#~ "Автоматическая прокрутка файла протокола при выходе за предел N килобайт." -#, c-format -#~ msgid "could not read from temporary file: %m" -#~ msgstr "не удалось прочитать из временного файла: %m" +#~ msgid "Writes temporary statistics files to the specified directory." +#~ msgstr "Каталог, в который будут записываться временные файлы статистики." -#~ msgid "column alias list for \"%s\" has too many entries" -#~ msgstr "слишком много записей в списке псевдонимов столбца \"%s\"" +#~ msgid "must be superuser to execute ALTER SYSTEM command" +#~ msgstr "выполнить команду ALTER SYSTEM может только суперпользователь" + +#~ msgid "" +#~ "query-specified return tuple and function return type are not compatible" +#~ msgstr "" +#~ "заданный в запросе кортеж результата несовместим с типом результата " +#~ "функции" #~ msgid "connection was re-authenticated" #~ msgstr "аутентификация соединения была изменена" @@ -32149,10 +33832,6 @@ 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\" используется повторно" @@ -32240,9 +33919,6 @@ msgstr "Используйте для записи спецсимволов си #~ 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 "необходимо указать левый и/или правый аргумент" @@ -32271,9 +33947,6 @@ msgstr "Используйте для записи спецсимволов си #~ "существующие ограничения для столбца \"%s.%s\" гарантируют, что он не " #~ "содержит NULL" -#~ msgid "validating foreign key constraint \"%s\"" -#~ msgstr "проверка ограничения внешнего ключа \"%s\"" - #~ msgid "" #~ "partition constraint for table \"%s\" is implied by existing constraints" #~ msgstr "" @@ -32411,10 +34084,6 @@ msgstr "Используйте для записи спецсимволов си #~ 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 "процесс запуска логической репликации запущен" @@ -32429,9 +34098,6 @@ msgstr "Используйте для записи спецсимволов си #~ 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" @@ -33162,13 +34828,6 @@ msgstr "Используйте для записи спецсимволов си #~ "в отношении \"%s\" не инициализирована страница %u --- ситуация " #~ "исправляется" -#~ msgid "" -#~ "tuple to be deleted was already moved to another partition due to " -#~ "concurrent update" -#~ msgstr "" -#~ "кортеж, подлежащий удалению, был перемещён в другую секцию в результате " -#~ "параллельного изменения" - #~ msgid "" #~ "tuple to be updated was already moved to another partition due to " #~ "concurrent update" @@ -33455,9 +35114,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "function \"%s\" is not an aggregate function" #~ msgstr "\"%s\" - это не агрегатная функция" -#~ msgid "function \"%s\" is not a window function" -#~ msgstr "\"%s\" - это не оконная функция" - #~ msgid "must be superuser to COPY to or from a file" #~ msgstr "для использования COPY с файлами нужно быть суперпользователем" @@ -33482,9 +35138,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "procedure number %d for (%s,%s) appears more than once" #~ msgstr "номер процедуры %d для (%s,%s) дублируется" -#~ msgid "operator procedure must be specified" -#~ msgstr "должна быть указана процедура оператора" - #~ msgid "column \"%s\" appears more than once in partition key" #~ msgstr "столбец \"%s\" фигурирует в ключе разбиения неоднократно" @@ -33599,9 +35252,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "invalid publish list" #~ msgstr "неверный список публикации" -#~ msgid "column \"%s\" referenced in statistics does not exist" -#~ msgstr "столбец \"%s\", указанный в статистике, не существует" - #~ msgid "invalid input syntax for %s: \"%s\"" #~ msgstr "неверный синтаксис для %s: \"%s\"" @@ -34043,9 +35693,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "hostssl requires SSL to be turned on" #~ msgstr "для использования hostssl необходимо включить SSL" -#~ msgid "could not create %s socket: %m" -#~ msgstr "не удалось создать сокет %s: %m" - #~ msgid "" #~ "WHERE CURRENT OF is not supported on a view with no underlying relation" #~ msgstr "" @@ -34330,10 +35977,6 @@ msgstr "Используйте для записи спецсимволов си #~ "запускать резервное копирование может только суперпользователь или роль " #~ "репликации" -#~ msgid "must be superuser to switch transaction log files" -#~ msgstr "" -#~ "для переключения файлов журнала транзакций нужно быть суперпользователем" - #~ msgid "must be superuser to create a restore point" #~ msgstr "для создания точки восстановления нужно быть суперпользователем" @@ -34548,13 +36191,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "SSL failed to renegotiate connection before limit expired" #~ msgstr "ошибка при согласовании SSL-соединения (превышен лимит)" -#~ msgid "" -#~ "Set the amount of traffic to send and receive before renegotiating the " -#~ "encryption keys." -#~ msgstr "" -#~ "Ограничивает объём трафика, передаваемого и принимаемого до повторного " -#~ "согласования ключей шифрования." - #~ msgid "invalid sample size" #~ msgstr "неверный размер выборки" @@ -34709,9 +36345,6 @@ msgstr "Используйте для записи спецсимволов си #~ "Задаёт максимальное расстояние в сегментах журнала между автоматическими " #~ "контрольными точками WAL." -#~ msgid "assertion checking is not supported by this build" -#~ msgstr "в данной сборке не поддерживаются проверки истинности" - #~ msgid "interval precision specified twice" #~ msgstr "точность интервала указана дважды" @@ -34839,9 +36472,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "Kerberos unparse_name returned error %d" #~ msgstr "ошибка в функции Kerberos unparse_name: %d" -#~ msgid "local user with ID %d does not exist" -#~ msgstr "локальный пользователь с ID %d не существует" - #~ msgid "SSL renegotiation failure" #~ msgstr "ошибка повторного согласования SSL" @@ -35054,9 +36684,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "function \"%s\" already exists in schema \"%s\"" #~ msgstr "функция %s уже существует в схеме \"%s\"" -#~ msgid "cannot use aggregate in index predicate" -#~ msgstr "в предикате индекса нельзя использовать агрегатные функции" - #~ msgid "cannot use window function in EXECUTE parameter" #~ msgstr "в качестве параметра EXECUTE нельзя использовать оконную функцию" diff --git a/third_party/spanner_pg/src/backend/po/sv.po b/third_party/spanner_pg/src/backend/po/sv.po index 12d44ccb..920bf18b 100644 --- a/third_party/spanner_pg/src/backend/po/sv.po +++ b/third_party/spanner_pg/src/backend/po/sv.po @@ -21,9 +21,9 @@ # hänvisas till och inte någon annan städning. 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: 2023-09-23 03:15+0000\n" +"POT-Creation-Date: 2023-09-23 03:01+0000\n" "PO-Revision-Date: 2023-09-23 15:32+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" @@ -33,6 +33,46 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "detta bygge stöder inte komprimering med %s" + +#: ../common/compression.c:203 +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:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "okänd komprimeringsflagga: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "komprimeringsmetoden \"%s\" kräver ett värde" + +#: ../common/compression.c:285 +#, 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:335 +#, 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:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d (standard är %d)" + +#: ../common/compression.c:353 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "komprimeringsalgoritm \"%s\" stöder inte ett arbetarantal" + #: ../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 @@ -40,68 +80,66 @@ msgstr "" msgid "not recorded" msgstr "ej sparad" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1516 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 +#: commands/copyfrom.c:1515 commands/extension.c:3401 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:1329 access/transam/xlog.c:3573 -#: access/transam/xlog.c:4817 access/transam/xlog.c:11629 -#: access/transam/xlog.c:11642 access/transam/xlog.c:12097 -#: access/transam/xlog.c:12177 access/transam/xlog.c:12214 -#: access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3492 libpq/hba.c:534 -#: replication/basebackup.c:2026 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 -#: replication/logical/snapbuild.c:1863 replication/logical/snapbuild.c:1905 -#: replication/logical/snapbuild.c:1932 replication/slot.c:1727 -#: replication/slot.c:1768 replication/walsender.c:545 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: access/transam/twophase.c:1349 access/transam/xlog.c:3207 +#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1197 +#: access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 +#: access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 +#: commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1939 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: 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/xlog.c:3578 access/transam/xlog.c:4822 -#: replication/basebackup.c:2030 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1868 -#: replication/logical/snapbuild.c:1910 replication/logical/snapbuild.c:1937 -#: replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 -#: utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 +#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 +#: replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: 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 +#: ../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:1341 -#: access/transam/twophase.c:1746 access/transam/xlog.c:3442 -#: access/transam/xlog.c:3613 access/transam/xlog.c:3618 -#: access/transam/xlog.c:3946 access/transam/xlog.c:4787 -#: access/transam/xlog.c:5712 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:5009 -#: replication/logical/snapbuild.c:1772 replication/logical/snapbuild.c:1945 -#: replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 -#: utils/cache/relmapper.c:898 +#: access/transam/timeline.c:516 access/transam/twophase.c:1361 +#: access/transam/twophase.c:1773 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:4738 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:5016 +#: replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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" @@ -114,82 +152,85 @@ 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/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:1285 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3484 -#: access/transam/xlog.c:3528 access/transam/xlog.c:3726 -#: access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1616 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 -#: replication/logical/reorderbuffer.c:4931 -#: replication/logical/snapbuild.c:1727 replication/logical/snapbuild.c:1834 -#: replication/slot.c:1699 replication/walsender.c:518 -#: replication/walsender.c:2563 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 -#: storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 -#: utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: access/transam/timeline.c:348 access/transam/twophase.c:1305 +#: 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:4209 +#: access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 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:8991 utils/misc/guc.c:9040 #, 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:1719 access/transam/twophase.c:1728 -#: access/transam/xlog.c:11386 access/transam/xlog.c:11424 -#: access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5684 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 +#: access/transam/twophase.c:1746 access/transam/twophase.c:1755 +#: access/transam/xlog.c:8674 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: 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/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:1740 -#: access/transam/xlog.c:3435 access/transam/xlog.c:3607 -#: access/transam/xlog.c:4780 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10910 replication/logical/snapbuild.c:1765 -#: replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 -#: storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 -#: storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: access/transam/timeline.c:510 access/transam/twophase.c:1767 +#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 +#: access/transam/xlog.c:3985 access/transam/xlog.c:7977 +#: access/transam/xlog.c:8020 backup/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1772 replication/slot.c:1684 +#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:992 storage/smgr/md.c:1033 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 -#: lib/dshash.c:245 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:2550 -#: postmaster/postmaster.c:4208 postmaster/postmaster.c:5609 -#: postmaster/postmaster.c:5973 -#: replication/libpqwalreceiver/libpqwalreceiver.c:287 -#: replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 -#: storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 -#: storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 -#: storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 -#: 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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 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:2594 postmaster/postmaster.c:4180 +#: postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2281 storage/ipc/procarray.c:2288 +#: storage/ipc/procarray.c:2793 storage/ipc/procarray.c:3424 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5049 -#: utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 #: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 -#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 utils/mmgr/generation.c:234 +#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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 @@ -198,6 +239,22 @@ msgstr "kunde inte fsync:a fil \"%s\": %m" 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" @@ -218,28 +275,28 @@ msgstr "kunde inte läsa binär \"%s\"" msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../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:299 access/transam/xlog.c:11260 -#: replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8323 backup/basebackup.c:1340 +#: 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:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 -#: storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 -#: storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, c-format 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" @@ -251,141 +308,148 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" #: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1297 -#: access/transam/xlog.c:11362 access/transam/xlog.c:11400 -#: access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 -#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 -#: commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 -#: commands/tablespace.c:897 guc-file.l:1062 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1644 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 -#: storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 +#: ../common/file_utils.c:455 access/transam/twophase.c:1317 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3390 +#: commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 +#: postmaster/pgarch.c:597 replication/logical/snapbuild.c:1651 +#: 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:166 ../common/pgfnames.c:48 commands/tablespace.c:729 -#: commands/tablespace.c:739 postmaster/postmaster.c:1518 -#: storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 postmaster/postmaster.c:1579 +#: 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:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../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:383 access/transam/xlogarchive.c:412 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1784 -#: replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 -#: storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "internt fel" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Escape-sekvens \"\\%s\" är ogiltig." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, 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:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Förväntade slut på indata, men hittade \"%s\"." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Förväntade sig \":\" men hittade \"%s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Förväntade JSON-värde, men hittade \"%s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Förväntade sträng, men hittade \"%s\"." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "Token \"%s\" är ogiltig." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" måste följas av fyra hexdecimala siffror." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 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:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 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:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 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:259 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "tips: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -401,7 +465,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:2553 +#: ../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" @@ -436,13 +500,12 @@ 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:1187 -#: replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "kunde inte ta status på fil eller katalog \"%s\": %m" @@ -452,6 +515,18 @@ 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/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 msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -473,7 +548,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:2053 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "användaren finns inte" @@ -512,12 +587,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\"" @@ -542,30 +617,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" @@ -575,6 +650,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" @@ -595,65 +680,65 @@ msgstr "kunde inte kontrollera access-token-medlemskap: felkod %lu\n" 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:1036 access/brin/brin.c:1140 access/gin/ginfast.c:1043 -#: access/transam/xlog.c:11031 access/transam/xlog.c:11568 -#: 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:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1043 +#: 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:1037 access/brin/brin.c:1141 +#: access/brin/brin.c:1037 access/brin/brin.c:1138 #, 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:1045 access/brin/brin.c:1149 +#: access/brin/brin.c:1042 access/brin/brin.c:1143 #, 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:1089 access/brin/brin.c:1175 +#: access/brin/brin.c:1086 access/brin/brin.c:1169 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" är inte ett BRIN-index" -#: access/brin/brin.c:1105 access/brin/brin.c:1191 +#: access/brin/brin.c:1102 access/brin/brin.c:1185 #, c-format 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:751 access/brin/brin_bloom.c:793 +#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 #: access/brin/brin_minmax_multi.c:3012 access/brin/brin_minmax_multi.c:3155 -#: 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 +#: 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:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 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 +#: access/brin/brin_minmax_multi.c:2185 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:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1442 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\"" @@ -756,91 +841,91 @@ msgstr "Attribut \"%s\" i typ %s finns inte i typ %s." msgid "number of columns (%d) exceeds limit (%d)" msgstr "antalet kolumner (%d) överskrider gränsen (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "antalet indexerade kolumner (%d) överskrider gränsen (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 #, 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:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1906 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "ej stödd formatkod: %d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: 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:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Giltiga värden är \"local\" och \"cascaded\"." -#: access/common/reloptions.c:682 +#: 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:1225 +#: 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:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "okänd parameternamnrymd \"%s\"" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12538 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12987 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "tabeller deklarerade med WITH OIDS stöds inte" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "okänd parameter \"%s\"" -#: access/common/reloptions.c:1576 +#: 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:1592 +#: 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:1604 +#: 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:1610 access/common/reloptions.c:1630 +#: 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:1612 +#: 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:1624 +#: 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:1632 +#: 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:1654 +#: 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" @@ -855,14 +940,8 @@ msgstr "komprimeringsmetod lz4 stöds ej" 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/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 "Du behöver bygga om PostgreSQL med %s." - -#: access/common/tupdesc.c:825 parser/parse_clause.c:771 -#: parser/parse_relation.c:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "kolumn \"%s\" kan inte deklareras som SETOF" @@ -892,7 +971,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:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "misslyckades att återfinna tuple i index \"%s\"" @@ -907,8 +986,8 @@ 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:145 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6486 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -931,18 +1010,18 @@ msgstr "operatorklass \"%s\" för accessmetod \"%s\" saknar supportfunktion %d e msgid "support function number %d is invalid for access method %s" msgstr "supportfunktionsnummer %d är ogiltig för accessmetod %s" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:759 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:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 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:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 -#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 +#: access/gist/gist.c:762 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 @@ -950,7 +1029,7 @@ msgstr "Detta orsakas av en inkomplett siduppdelning under krashåterställning msgid "Please REINDEX it." msgstr "Var vänlig och kör REINDEX på det." -#: access/gist/gist.c:1175 +#: access/gist/gist.c:1176 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "lagar ofärdig split i index \"%s\", block %u" @@ -965,13 +1044,13 @@ 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:797 access/hash/hashutil.c:224 +#: 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:808 access/hash/hashutil.c:235 +#: 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" @@ -988,39 +1067,39 @@ msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY op msgstr "operatorfamiljen \"%s\" för accessmetod %s innehåller en inkorrekt ORDER BY \"opfamiily\"-specifikation för operator %s" #: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, 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:279 access/hash/hashfunc.c:336 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1988 commands/tablecmds.c:16949 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:1004 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1979 commands/tablecmds.c:17495 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 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:2004 -#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, 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\"" @@ -1050,33 +1129,33 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion för op 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:2288 +#: 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:2759 +#: 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:2805 +#: 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:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "kan inte uppdatera tupler under en parallell operation" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3307 #, c-format msgid "attempted to update invisible tuple" msgstr "försökte uppdatera en osynlig tuple" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 +#: access/heap/heapam.c:4972 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\"" @@ -1098,13 +1177,13 @@ msgstr "kunde inte skriva till fil \"%s\", skrev %d av %d: %m." #: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3351 access/transam/xlog.c:3542 -#: access/transam/xlog.c:4759 access/transam/xlog.c:11377 -#: access/transam/xlog.c:11415 access/transam/xlog.c:11820 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4633 -#: postmaster/postmaster.c:5671 replication/logical/origin.c:587 -#: replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1261 +#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 +#: access/transam/xlog.c:3964 access/transam/xlog.c:8657 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:517 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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 "kunde inte skapa fil \"%s\": %m" @@ -1116,180 +1195,170 @@ msgstr "kunde inte trunkera fil \"%s\" till %u: %m" #: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3423 access/transam/xlog.c:3598 -#: access/transam/xlog.c:4771 postmaster/postmaster.c:4643 -#: postmaster/postmaster.c:4653 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1741 replication/slot.c:1586 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 -#: utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 -#: utils/misc/guc.c:10316 utils/misc/guc.c:10330 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 +#: access/transam/xlog.c:3976 commands/dbcommands.c:529 +#: postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 +#: replication/slot.c:1666 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:8721 +#: utils/misc/guc.c:8752 utils/misc/guc.c:10742 utils/misc/guc.c:10756 +#: 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:1249 access/transam/twophase.c:1679 -#: 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:4424 -#: replication/logical/snapbuild.c:1686 replication/logical/snapbuild.c:2102 -#: replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 -#: storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 +#: 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:4431 +#: replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 +#: replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:773 +#: 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:775 +#: 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:780 +#: 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:782 +#: 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:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +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:697 +#, c-format +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:703 #, 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" +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 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" -msgstr "tupler: %lld borttagna, %lld kvar, %lld är döda men ännu inte möjliga att ta bort, äldsta xmin: %u\n" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "gräns för borttagning: %u, som var %d XID:er gammal när operationen avslutades\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:714 +#, c-format +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:721 +#, c-format +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:727 msgid "index scan not needed: " msgstr "index-scan behövdes inte: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "index-scan behövdes: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, c-format 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:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "index-scan överhoppad: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "index-scan överhoppad av felsäkerhetsfunktion: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, c-format 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:834 +#: access/heap/vacuumlazy.c:755 #, c-format 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:846 commands/analyze.c:814 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format 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:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, 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" -#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, 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:857 +#: access/heap/vacuumlazy.c:785 #, c-format 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:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "systemanvändning: %s" -#: access/heap/vacuumlazy.c:933 -#, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "aggressiv vaccum av \"%s.%s\"" - -#: access/heap/vacuumlazy.c:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "kör vaccum på \"%s.%s\"" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format 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:1656 -#, c-format -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%lld döda radversioner kan inte tas bort än, äldsta xmin: %u\n" - -#: 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] "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:1662 -#, 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:1666 commands/indexcmds.c:4152 -#: commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s." - -#: access/heap/vacuumlazy.c:1669 -#, c-format -msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -msgstr "tabell \"%s\": hittade %lld borttagbara, %lld ej borttagbara radversioner i %u av %u sidor" - -#: 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 "tabell \"%s\": index-scan skippad: %u sidor från tabellen (%.2f%% totalt) har %lld död postidentifierare" - -#: access/heap/vacuumlazy.c:2617 +#: access/heap/vacuumlazy.c:2629 #, c-format 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:2622 +#: access/heap/vacuumlazy.c:2634 #, c-format 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:2623 +#: access/heap/vacuumlazy.c:2635 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1298,104 +1367,67 @@ msgstr "" "Ö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: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] "startade %d parallell städarbetare för indexupprensning (planerat: %d)" -msgstr[1] "startade %d parallella städarbetare för indexupprensning (planerat: %d)" - -#: 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] "startade %d parallell städarbetare för index-vacuum (planerat: %d)" -msgstr[1] "startade %d parallella städarbetare för index-vacuum (planerat: %d)" - -#: access/heap/vacuumlazy.c:3063 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "genomsökte index \"%s\" och tog bort %d radversioner" - -#: access/heap/vacuumlazy.c:3120 -#, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "index \"%s\" innehåller nu %.0f radversioner i %u sidor" - -#: access/heap/vacuumlazy.c:3124 -#, 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.\n" -"%s." -msgstr "" -"%.0f indexradversioner togs bort.\n" -"%u indexsidor har tidigare raderats.\n" -"%u är nuvarande borttagna där %u just nu är återanvändningsbara.\n" -"%s." - -#: access/heap/vacuumlazy.c:3233 +#: 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:3299 +#: 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:3363 +#: 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:3508 +#: access/heap/vacuumlazy.c:3170 #, 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:4274 +#: access/heap/vacuumlazy.c:3383 #, c-format 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:4277 +#: 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:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "vid skanning av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:4289 +#: 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:4292 +#: 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:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "vid vacuum av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, 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:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, 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:4312 +#: 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" @@ -1410,14 +1442,14 @@ 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/genam.c:486 +#: 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:1355 -#: commands/indexcmds.c:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16647 commands/tablecmds.c:18398 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2807 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17183 commands/tablecmds.c:18966 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" är inte ett index" @@ -1427,23 +1459,23 @@ msgstr "\"%s\" är inte ett index" msgid "operator class %s has no options" msgstr "operatorklass %s har inga flaggor" -#: access/nbtree/nbtinsert.c:665 +#: 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:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Nyckeln %s existerar redan." -#: access/nbtree/nbtinsert.c:761 +#: 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:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2330 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "index \"%s\" är inte ett btree" @@ -1453,27 +1485,27 @@ msgstr "index \"%s\" är inte ett btree" 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:1875 +#: 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: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 "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:2665 +#: 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:2671 +#: 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:2675 +#: access/nbtree/nbtutils.c:2679 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1493,7 +1525,7 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktioner för 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:1017 +#: access/spgist/spgutils.c:1016 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST inre tuplestorlek %zu överstiger maximala %zu" @@ -1509,14 +1541,14 @@ msgid "operator family \"%s\" of access method %s is missing support function %d msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion %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\" är ett 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:13367 -#: commands/tablecmds.c:16656 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13880 +#: commands/tablecmds.c:17192 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" är en composite-typ" @@ -1531,7 +1563,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:12462 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12911 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s är för lång (maximalt %d tecken)." @@ -1551,22 +1583,22 @@ 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:280 +#: 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:378 +#: 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:380 +#: access/transam/commit_ts.c:382 #, c-format 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:382 +#: 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." @@ -1714,60 +1746,116 @@ msgstr "kunde inte skapa dynamiskt delat minnessegment: %m" msgid "invalid magic number in dynamic shared memory segment" msgstr "ogiltigt magiskt nummer i dynamiskt delat minnessegment" -#: access/transam/slru.c:713 +#: 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 +#, 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 +#, 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:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "filen \"%s\" existerar inte, läses som nollor" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "kunde inte läsa status på transaktion %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Kunde inte öppna fil \"%s\": %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, 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:960 +#: access/transam/slru.c:961 #, 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:965 +#: access/transam/slru.c:966 #, 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:972 +#: access/transam/slru.c:973 #, 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:977 +#: access/transam/slru.c:978 #, 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:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Kunde inte fsync:a fil \"%s\": %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Kunde inte stänga fil \"%s\": %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "Kunde inte trunkera katalog \"%s\": trolig wraparound" @@ -1812,182 +1900,183 @@ 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:386 #, 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:393 #, c-format msgid "prepared transactions are disabled" msgstr "förberedda transaktioner är avslagna" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, 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:413 #, 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:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, 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:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Öka max_prepared_transactions (nu %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "förberedd transaktion med identifierare \"%s\" är upptagen" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:605 #, 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:602 +#: access/transam/twophase.c:606 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Måste vara superuser eller den användare som förberedde transaktionen" -#: access/transam/twophase.c:613 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "förberedda transaktionen tillhör en annan databas" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:618 #, 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:629 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "förberedd transaktion med identifierare \"%s\" finns inte" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1170 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "tvåfas-statusfilens maximala längd överskriden" -#: access/transam/twophase.c:1305 +#: access/transam/twophase.c:1325 #, c-format 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:1314 +#: access/transam/twophase.c:1334 #, 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:1332 +#: access/transam/twophase.c:1352 #, 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:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "felaktigt magiskt nummer lagrat i fil \"%s\"" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "felaktig storlek lagrad i fil \"%s\"" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, 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:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Misslyckades vid allokering av en WAL-läs-processor." -#: access/transam/twophase.c:1417 +#: access/transam/twophase.c:1425 #, 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:1422 +#: access/transam/twophase.c:1430 #, 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:1430 +#: access/transam/twophase.c:1438 #, 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:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "kan inte återskapa fil \"%s\": %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, 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:2068 +#: access/transam/twophase.c:2095 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "återskapar förberedd transaktion %u från delat minne" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2188 #, 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:2166 +#: access/transam/twophase.c:2195 #, 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:2179 +#: access/transam/twophase.c:2208 #, 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:2186 +#: access/transam/twophase.c:2215 #, 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:2211 +#: access/transam/twophase.c:2240 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "korrupt tvåfas-statusfil för transaktion %u" -#: access/transam/twophase.c:2216 +#: access/transam/twophase.c:2245 #, 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/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "kunde inte återställa tvåfas-statusfil för transaktion %u" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." msgstr "Statefil för tvåfas har hittats i WAL-post %X/%X men denna transaktion har redan återställts från disk." -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 -#: utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "kunde inte komma åt filen \"%s\": %m" @@ -2021,568 +2110,886 @@ msgstr "databas \"%s\" måste städas (vacuum) inom %u transaktioner" 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/xact.c:1046 +#: 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:1584 +#: 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:2435 +#: 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:2445 +#: 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" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3416 +#: access/transam/xact.c:3479 #, 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:3426 +#: access/transam/xact.c:3489 #, 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:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s kan inte köras inuti en pipeline" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, 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:3517 access/transam/xact.c:3832 -#: access/transam/xact.c:3911 access/transam/xact.c:4034 -#: access/transam/xact.c:4185 access/transam/xact.c:4254 -#: access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 +#: access/transam/xact.c:3974 access/transam/xact.c:4097 +#: access/transam/xact.c:4248 access/transam/xact.c:4317 +#: access/transam/xact.c:4428 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kan bara användas i transaktionsblock" -#: access/transam/xact.c:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "det är redan en transaktion igång" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 -#: access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 +#: access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "ingen transaktion pågår" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "kan inte commit:a under en parallell operation" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, c-format msgid "cannot abort during a parallel operation" msgstr "can inte avbryta under en parallell operation" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4212 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "kan inte definiera sparpunkter under en parallell operation" -#: access/transam/xact.c:4236 +#: access/transam/xact.c:4299 #, 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:4246 access/transam/xact.c:4297 -#: access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 +#: access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "sparpunkt \"%s\" existerar inte" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "sparpunkt \"%s\" finns inte inom aktuell sparpunktsnivå" -#: access/transam/xact.c:4345 +#: access/transam/xact.c:4408 #, 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:4473 +#: access/transam/xact.c:4536 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "kan inte starta subtransaktioner under en parallell operation" -#: access/transam/xact.c:4541 +#: access/transam/xact.c:4604 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "kan inte commit:a subtransaktioner undert en parallell operation" -#: access/transam/xact.c:5188 +#: access/transam/xact.c:5251 #, 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:1836 +#: access/transam/xlog.c:1463 #, c-format 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:2609 +#: access/transam/xlog.c:2224 #, 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" -#: access/transam/xlog.c:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "Detta kan misslyckas ibland vid arkivåterställning men det är ofarligt i detta fall." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 -#: replication/walsender.c:2557 +#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, 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:4289 +#: 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:4331 access/transam/xlog.c:4341 +#: 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:4347 +#: access/transam/xlog.c:3814 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "skapar saknad WAL-katalog \"%s\"" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3817 commands/dbcommands.c:3115 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "kunde inte skapa saknad katalog \"%s\": %m" -#: access/transam/xlog.c:4472 -#, 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:4610 -#, 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:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "ny måltidslinje är %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3884 #, c-format msgid "could not generate secret authorization token" msgstr "kunde inte generera hemligt auktorisationstoken" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 -#: access/transam/xlog.c:4871 access/transam/xlog.c:4878 -#: access/transam/xlog.c:4885 access/transam/xlog.c:4890 -#: access/transam/xlog.c:4897 access/transam/xlog.c:4904 -#: access/transam/xlog.c:4911 access/transam/xlog.c:4918 -#: access/transam/xlog.c:4925 access/transam/xlog.c:4932 -#: access/transam/xlog.c:4941 access/transam/xlog.c:4948 -#: utils/init/miscinit.c:1583 +#: 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:4839 +#: 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:4843 +#: 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:4848 +#: 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:4851 access/transam/xlog.c:4875 -#: access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: 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:4862 +#: access/transam/xlog.c:4067 #, c-format msgid "incorrect checksum in control file" msgstr "ogiltig kontrollsumma kontrollfil" -#: access/transam/xlog.c:4872 +#: 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:4879 +#: 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:4886 +#: 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:4891 +#: 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: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:4929 -#: access/transam/xlog.c:4936 access/transam/xlog.c:4944 -#: access/transam/xlog.c:4951 +#: 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:4898 +#: 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:4905 +#: 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:4912 +#: 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:4919 +#: 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:4926 +#: 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:4933 +#: 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:4942 +#: 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:4949 +#: 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:4958 +#: 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:4970 +#: 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:4974 +#: 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:5408 +#: access/transam/xlog.c:4620 #, 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:5416 +#: access/transam/xlog.c:4628 #, 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:5422 +#: access/transam/xlog.c:4634 #, 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:5483 +#: access/transam/xlog.c:4852 #, 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:5548 +#: access/transam/xlog.c:4853 #, 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:5565 +#: access/transam/xlog.c:4854 #, 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:5566 +#: access/transam/xlog.c:4918 #, 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:5574 +#: access/transam/xlog.c:4929 #, 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:5612 +#: access/transam/xlog.c:4935 #, 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:5734 +#: access/transam/xlog.c:4941 #, 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:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4947 #, 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:5821 +#: access/transam/xlog.c:4949 #, 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:5911 +#: access/transam/xlog.c:4955 #, 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:5918 +#: access/transam/xlog.c:4957 #, 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:5971 +#: access/transam/xlog.c:4963 #, 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:5989 +#: access/transam/xlog.c:4969 #, 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:6056 +#: access/transam/xlog.c:5353 #, 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:6064 +#: access/transam/xlog.c:5354 #, 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:6109 +#: access/transam/xlog.c:5357 #, 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:6110 +#: access/transam/xlog.c:5405 #, 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:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5438 #, c-format -msgid "recovery has paused" -msgstr "återställning har pausats" +msgid "archive recovery complete" +msgstr "arkivåterställning klar" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6044 #, 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:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6083 #, c-format -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" +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:6387 access/transam/xlog.c:6414 -#: access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6095 #, c-format -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." +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:6396 +#: access/transam/xlog.c:6155 #, c-format -msgid "If recovery is unpaused, the server will shut down." -msgstr "Om återställning avpausas så kommer servern stänga ner." +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:6397 +#: access/transam/xlog.c:6175 #, c-format -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." +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:6408 +#: access/transam/xlog.c:6610 #, c-format -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/xlog.c:6418 +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:7167 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "Starta om servern efter att ha gjort de nödvändiga konfigurationsändringarna." +msgid "recovery restart point at %X/%X" +msgstr "återställningens omstartspunkt vid %X/%X" -#: access/transam/xlog.c:6442 +#: access/transam/xlog.c:7169 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "återställning avbruten på grund av otillräckliga parametervärden" +msgid "Last completed transaction was at log time %s." +msgstr "Senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:6448 +#: access/transam/xlog.c:7416 #, c-format -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." +msgid "restore point \"%s\" created at %X/%X" +msgstr "återställningspunkt \"%s\" skapad vid %X/%X" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7623 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL genererades med wal_level=minimal, kan inte fortsätta återställande" +msgid "online backup was canceled, recovery cannot continue" +msgstr "online-backup avbröts, återställning kan inte fortsätta" -#: access/transam/xlog.c:6471 +#: access/transam/xlog.c:7680 #, c-format -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." +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:6472 +#: access/transam/xlog.c:7738 #, c-format -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." +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:6541 +#: access/transam/xlog.c:7767 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "kontrollfil innehåller ogiltig checkpoint-position" +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:6552 +#: access/transam/xlog.c:8025 #, c-format -msgid "database system was shut down at %s" -msgstr "databassystemet stängdes ner vid %s" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" -#: access/transam/xlog.c:6558 +#: access/transam/xlog.c:8031 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "databassystemet stängdes ner under återställning vid %s" +msgid "could not fdatasync file \"%s\": %m" +msgstr "kunde inte fdatasync:a fil \"%s\": %m" -#: access/transam/xlog.c:6564 +#: access/transam/xlog.c:8126 access/transam/xlog.c:8493 #, 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 "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:6570 +#: access/transam/xlog.c:8127 access/transam/xlog.c:8494 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "databassystemet avbröts under återställning vid %s" +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:6572 +#: access/transam/xlog.c:8132 #, 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 "backup label too long (max %d bytes)" +msgstr "backup-etikett för lång (max %d byte)" -#: access/transam/xlog.c:6578 +#: access/transam/xlog.c:8248 #, 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 "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:8250 access/transam/xlog.c:8606 +#, 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 "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:8330 backup/basebackup.c:1345 utils/adt/misc.c:347 +#, c-format +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:8380 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#, c-format +msgid "tablespaces are not supported on this platform" +msgstr "tabellutrymmen stöds inte på denna plattform" + +#: access/transam/xlog.c:8539 access/transam/xlog.c:8552 +#: access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 +#: access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 +#: access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "felaktig data i fil \"%s\"" + +#: access/transam/xlog.c:8556 backup/basebackup.c:1200 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "standby:en befordrades under online-backup" + +#: access/transam/xlog.c:8557 backup/basebackup.c:1201 +#, 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." + +#: access/transam/xlog.c:8604 +#, 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" + +#: access/transam/xlog.c:8729 +#, 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" + +#: access/transam/xlog.c:8743 +#, 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)" + +#: access/transam/xlog.c:8745 +#, 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." + +#: access/transam/xlog.c:8752 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "alla krävda WAL-segments har arkiverats" + +#: access/transam/xlog.c:8756 +#, 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" + +#: access/transam/xlog.c:8805 +#, c-format +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/xlogarchive.c:208 +#, c-format +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/xlogarchive.c:217 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "återställd logfil \"%s\" från arkiv" + +#: access/transam/xlogarchive.c:231 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command returnerade exit-kod noll men stat() misslyckades." + +#: access/transam/xlogarchive.c:263 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "kunde inte återställa fil \"%s\" från arkiv: %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:376 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %m" + +#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "kunde inte skriva arkiveringsstatusfil \"%s\": %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "en backup är redan på gång i denna session" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "ingen backup är på gång" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "Anropade du pg_backup_start()?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "WAL-kontrollfunktioner kan inte köras under återställning." + +#: access/transam/xlogfuncs.c:198 +#, 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" + +#: access/transam/xlogfuncs.c:206 +#, 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)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s kan inte köras under återställning" + +#: 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 "recovery is not in progress" +msgstr "återställning är inte i gång" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "Återställningskontrollfunktioner kan bara köras under återställning." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "standby-befordring pågår" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s kan inte köras efter att befordran startats." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" får inte vara negativ eller noll" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "misslyckades med att sända en signal till postmaster: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +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:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch stöds inte på plattformar som saknar posix_fadvise()." + +#: access/transam/xlogreader.c:609 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "ogiltig postoffset vid %X/%X" + +#: access/transam/xlogreader.c:617 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "contrecord är begärd vid %X/%X" + +#: access/transam/xlogreader.c:738 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "det finns ingen contrecord-flagga vid %X/%X" + +#: access/transam/xlogreader.c:751 +#, c-format +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/xlogreader.c:810 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "postlängd %u vid %X/%X är för lång" + +#: access/transam/xlogreader.c:876 +#, 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" + +#: access/transam/xlogreader.c:1128 +#, 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" + +#: access/transam/xlogreader.c:1136 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" + +#: access/transam/xlogreader.c:1149 access/transam/xlogreader.c:1165 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" + +#: access/transam/xlogreader.c:1201 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" + +#: access/transam/xlogreader.c:1238 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" + +#: access/transam/xlogreader.c:1252 access/transam/xlogreader.c:1293 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" + +#: access/transam/xlogreader.c:1267 +#, 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" + +#: access/transam/xlogreader.c:1275 +#, 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" + +#: access/transam/xlogreader.c:1281 +#, 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" + +#: access/transam/xlogreader.c:1312 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" + +# FIXME +#: access/transam/xlogreader.c:1337 +#, 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" + +#: access/transam/xlogreader.c:1742 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" + +#: access/transam/xlogreader.c:1766 +#, c-format +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/xlogreader.c:1773 +#, c-format +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/xlogreader.c:1809 +#, c-format +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 blockavbildlängd %u vid %X/%X" + +#: access/transam/xlogreader.c:1825 +#, c-format +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/xlogreader.c:1839 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" + +#: access/transam/xlogreader.c:1854 +#, c-format +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 blockavbildlängd är %u vid %X/%X" + +#: access/transam/xlogreader.c:1870 +#, c-format +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/xlogreader.c:1882 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "ogiltig block_id %u vid %X/%X" + +#: access/transam/xlogreader.c:1949 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "post med ogiltig längd vid %X/%X" + +#: access/transam/xlogreader.c:1974 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "kunde inte hitta backup-block med ID %d i WAL-post" + +#: access/transam/xlogreader.c:2058 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet" + +#: access/transam/xlogreader.c:2065 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d" -#: access/transam/xlog.c:6580 +#: access/transam/xlogreader.c:2092 access/transam/xlogreader.c:2109 #, 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 restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: access/transam/xlog.c:6586 +#: access/transam/xlogreader.c:2118 #, 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 restore image at %X/%X compressed with unknown method, block %d" +msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: access/transam/xlog.c:6592 +#: access/transam/xlogreader.c:2126 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "kontrollfil innehåller ogiltigt databasklustertillstånd" +msgid "could not decompress image at %X/%X, block %d" +msgstr "kunde inte packa upp avbild vid %X/%X, block %d" -#: access/transam/xlog.c:6649 +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "går in i standby-läge" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "startar point-in-time-återställning till XID %u" -#: access/transam/xlog.c:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "startar point-in-time-återställning till %s" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "startar point-in-time-återställning till \"%s\"" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, 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\"" -#: access/transam/xlog.c:6668 +#: access/transam/xlogrecovery.c:564 #, c-format 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:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "Startar arkivåterställning" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:651 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "kunde inte hitta redo-position refererad av checkpoint-post" -#: access/transam/xlog.c:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -2594,1587 +3001,1422 @@ msgstr "" "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:6755 +#: access/transam/xlogrecovery.c:661 #, c-format msgid "could not locate required checkpoint record" msgstr "kunde inte hitta den checkpoint-post som krävs" -#: access/transam/xlog.c:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: access/transam/xlog.c:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "hoppar över fil \"%s\" då ingen fil \"%s\" finns" -#: access/transam/xlog.c:6818 access/transam/xlog.c:12353 +#: access/transam/xlogrecovery.c:724 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Filen \"%s\" döptes om till \"%s\"." -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:730 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: access/transam/xlog.c:6875 +#: access/transam/xlogrecovery.c:784 #, c-format msgid "could not locate a valid checkpoint record" msgstr "kunde inte hitta en giltig checkpoint-post" -#: access/transam/xlog.c:6913 +#: access/transam/xlogrecovery.c:808 #, 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" -#: access/transam/xlog.c:6915 +#: access/transam/xlogrecovery.c:810 #, 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." -#: access/transam/xlog.c:6929 +#: access/transam/xlogrecovery.c:824 #, 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" -#: access/transam/xlog.c:6959 +#: access/transam/xlogrecovery.c:852 #, c-format msgid "invalid next transaction ID" msgstr "nästa transaktions-ID ogiltig" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:857 #, c-format msgid "invalid redo in checkpoint record" msgstr "ogiltig redo i checkpoint-post" -#: access/transam/xlog.c:7070 +#: access/transam/xlogrecovery.c:868 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ogiltig redo-post i nedstängnings-checkpoint" -#: access/transam/xlog.c:7110 +#: access/transam/xlogrecovery.c:897 #, 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" -#: access/transam/xlog.c:7114 +#: access/transam/xlogrecovery.c:901 #, 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" -#: access/transam/xlog.c:7161 +#: access/transam/xlogrecovery.c:944 #, c-format 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:7162 +#: access/transam/xlogrecovery.c:945 #, 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." -#: access/transam/xlog.c:7388 +#: access/transam/xlogrecovery.c:999 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "använda återställningskommandofil \"%s\" stöds inte" + +#: access/transam/xlogrecovery.c:1064 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "standby-läge stöd inte av enanvändarservrar" + +#: access/transam/xlogrecovery.c:1081 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "angav varken primary_conninfo eller restore_command" + +#: access/transam/xlogrecovery.c:1082 +#, 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." + +#: access/transam/xlogrecovery.c:1090 +#, 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" + +#: access/transam/xlogrecovery.c:1128 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "återställningsmåltidslinje %u finns inte" + +#: access/transam/xlogrecovery.c:1278 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Parsad tidslinje-ID är %u men förväntade sig %u." + +#: access/transam/xlogrecovery.c:1660 #, c-format msgid "redo starts at %X/%X" msgstr "redo startar vid %X/%X" -#: access/transam/xlog.c:7613 +#: access/transam/xlogrecovery.c:1673 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo pågår, förbrukad tid: %ld.%02d s, nuvarande LSN: %X/%X" + +#: access/transam/xlogrecovery.c:1765 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "efterfrågad återställningsstoppunkt är före en konsistent återställningspunkt" -#: access/transam/xlog.c:7651 +#: access/transam/xlogrecovery.c:1797 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "redo gjord vid %X/%X systemanvändning: %s" -#: access/transam/xlog.c:7657 +#: access/transam/xlogrecovery.c:1803 #, c-format msgid "last completed transaction was at log time %s" msgstr "senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:7666 +#: access/transam/xlogrecovery.c:1812 #, c-format msgid "redo is not required" msgstr "redo behövs inte" -#: access/transam/xlog.c:7678 +#: access/transam/xlogrecovery.c:1823 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "återställning avslutades innan det konfigurerade återställningsmålet nåddes" -#: access/transam/xlog.c:7762 access/transam/xlog.c:7766 -#, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL slutar före sluttiden av online-backup:en" - -#: access/transam/xlog.c:7763 -#, 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." - -#: access/transam/xlog.c:7767 -#, 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." - -#: access/transam/xlog.c:7770 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL avslutas innan konstistent återställningspunkt" - -#: access/transam/xlog.c:7805 +#: access/transam/xlogrecovery.c:1998 #, c-format -msgid "selected new timeline ID: %u" -msgstr "valt nytt tidslinje-ID: %u" +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/xlog.c:8249 +#: access/transam/xlogrecovery.c:2065 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "Oväntat katalogpost \"%s\" hittades i %s" -#: access/transam/xlog.c:8251 +#: access/transam/xlogrecovery.c:2067 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Alla katalogposter i pg_tblspc/ skall vara symboliska länkar" -#: access/transam/xlog.c:8252 +#: access/transam/xlogrecovery.c:2068 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." msgstr "Ta bort dessa kataloger eller sätt allow_in_place_tablespaces temporärt till ON och låt återställningen gå klart." -#: access/transam/xlog.c:8336 +#: access/transam/xlogrecovery.c:2142 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "konsistent återställningstillstånd uppnått vid %X/%X" -#: access/transam/xlog.c:8545 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "ogiltig primär checkpoint-länk i kontrollfil" - -#: access/transam/xlog.c:8549 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "ogiltig checkpoint-länk i \"backup_label\"-fil" - -#: access/transam/xlog.c:8567 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "ogiltig primär checkpoint-post" - -#: access/transam/xlog.c:8571 -#, c-format -msgid "invalid checkpoint record" -msgstr "ogiltig checkpoint-post" - -#: access/transam/xlog.c:8582 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ogiltig resurshanterar-ID i primär checkpoint-post" - -#: access/transam/xlog.c:8586 -#, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "ogiltig resurshanterar-ID i checkpoint-post" - -#: access/transam/xlog.c:8599 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "ogiltig xl_info i primär checkpoint-post" - -#: access/transam/xlog.c:8603 -#, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "ogiltig xl_info i checkpoint-post" - -#: access/transam/xlog.c:8614 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "ogiltig längd i primär checkpoint-post" - -#: access/transam/xlog.c:8618 -#, c-format -msgid "invalid length of checkpoint record" -msgstr "ogiltig längd på checkpoint-post" - -#: access/transam/xlog.c:8799 -#, c-format -msgid "shutting down" -msgstr "stänger ner" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 -#, c-format -msgid "restartpoint starting:%s%s%s%s%s%s%s%s" -msgstr "restartpoint startar:%s%s%s%s%s%s%s%s" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8850 -#, c-format -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:8910 -#, 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 "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:8930 -#, 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 "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:9374 -#, 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" - -#: access/transam/xlog.c:9907 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "återställningens omstartspunkt vid %X/%X" - -#: access/transam/xlog.c:9909 -#, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Senaste kompletta transaktionen var vid loggtid %s" - -#: access/transam/xlog.c:10155 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "återställningspunkt \"%s\" skapad vid %X/%X" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL-redo vid %X/%X för %s" -#: access/transam/xlog.c:10300 +#: access/transam/xlogrecovery.c:2276 #, 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" -#: access/transam/xlog.c:10309 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "oväntad tidslinje-ID %u (efter %u) i checkpoint-post" -#: access/transam/xlog.c:10325 +#: access/transam/xlogrecovery.c:2301 #, 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" -#: access/transam/xlog.c:10400 -#, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "online-backup avbröts, återställning kan inte fortsätta" - -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 -#: access/transam/xlog.c:10542 -#, 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" - -#: access/transam/xlog.c:10700 -#, c-format -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/xlog.c:10915 -#, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" - -#: access/transam/xlog.c:10921 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "kunde inte fdatasync:a fil \"%s\": %m" - -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 -#: 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 "WAL-kontrollfunktioner kan inte köras under återställning." - -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 -#, 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" - -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 -#: access/transam/xlogfuncs.c:308 +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 #, 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." - -#: access/transam/xlog.c:11047 -#, c-format -msgid "backup label too long (max %d bytes)" -msgstr "backup-etikett för lång (max %d byte)" - -#: access/transam/xlog.c:11084 access/transam/xlog.c:11368 -#: access/transam/xlog.c:11406 -#, c-format -msgid "a backup is already in progress" -msgstr "en backup är redan på gång" +msgid "recovery stopping after reaching consistency" +msgstr "återställning stoppad efter att ha uppnått konsistens" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:2506 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Kör pg_stop_backup() och försök igen." +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "återställning stoppad före WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:2596 #, 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 "recovery stopping before commit of transaction %u, time %s" +msgstr "återställning stoppad före commit av transaktion %u, tid %s" -#: access/transam/xlog.c:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:2603 #, 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 "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." +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "återställning stoppad före abort av transaktion %u, tid %s" -#: access/transam/xlog.c:11267 replication/basebackup.c:1439 -#: utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2656 #, 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 "recovery stopping at restore point \"%s\", time %s" +msgstr "återställning stoppad vid återställningspunkt \"%s\", tid %s" -#: access/transam/xlog.c:11317 commands/tablespace.c:385 -#: commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "tabellutrymmen stöds inte på denna plattform" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "återställning stoppad efter WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlog.c:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:2741 #, 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 "recovery stopping after commit of transaction %u, time %s" +msgstr "återställning stoppad efter commit av transaktion %u, tid %s" -#: access/transam/xlog.c:11594 +#: access/transam/xlogrecovery.c:2749 #, c-format -msgid "exclusive backup not in progress" -msgstr "exklusiv backup är inte på gång" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "återställning stoppad efter abort av transaktion %u, tid %s" -#: access/transam/xlog.c:11621 +#: access/transam/xlogrecovery.c:2830 #, c-format -msgid "a backup is not in progress" -msgstr "ingen backup är på gång" +msgid "pausing at the end of recovery" +msgstr "pausar vid slutet av återställning" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 -#: access/transam/xlog.c:12111 access/transam/xlog.c:12117 -#: access/transam/xlog.c:12165 access/transam/xlog.c:12245 -#: access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2831 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "felaktig data i fil \"%s\"" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Kör pg_wal_replay_resume() för att befordra." -#: access/transam/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 #, c-format -msgid "the standby was promoted during online backup" -msgstr "standby:en befordrades under online-backup" +msgid "recovery has paused" +msgstr "återställning har pausats" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2835 #, 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 "Execute pg_wal_replay_resume() to continue." +msgstr "Kör pg_wal_replay_resume() för att fortsätta." -#: access/transam/xlog.c:11772 +#: access/transam/xlogrecovery.c:3101 #, 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 "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:11892 +#: access/transam/xlogrecovery.c:3306 #, 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 read from log segment %s, offset %u: %m" +msgstr "kunde inte läsa från loggsegment %s, offset %u: %m" -#: access/transam/xlog.c:11904 +#: access/transam/xlogrecovery.c:3312 #, 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 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/xlog.c:11906 +#: access/transam/xlogrecovery.c:3961 #, 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 "invalid primary checkpoint link in control file" +msgstr "ogiltig primär checkpoint-länk i kontrollfil" -#: access/transam/xlog.c:11913 +#: access/transam/xlogrecovery.c:3965 #, c-format -msgid "all required WAL segments have been archived" -msgstr "alla krävda WAL-segments har arkiverats" +msgid "invalid checkpoint link in backup_label file" +msgstr "ogiltig checkpoint-länk i \"backup_label\"-fil" -#: access/transam/xlog.c:11917 +#: access/transam/xlogrecovery.c:3983 #, 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 "invalid primary checkpoint record" +msgstr "ogiltig primär checkpoint-post" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:3987 #, 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 checkpoint record" +msgstr "ogiltig checkpoint-post" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:3998 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Parsad tidslinje-ID är %u men förväntade sig %u." +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "ogiltig resurshanterar-ID i primär checkpoint-post" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:4002 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL-redo vid %X/%X för %s" +msgid "invalid resource manager ID in checkpoint record" +msgstr "ogiltig resurshanterar-ID i checkpoint-post" -#: access/transam/xlog.c:12342 +#: access/transam/xlogrecovery.c:4015 #, c-format -msgid "online backup mode was not canceled" -msgstr "online backupläge har ej avbrutits" +msgid "invalid xl_info in primary checkpoint record" +msgstr "ogiltig xl_info i primär checkpoint-post" -#: access/transam/xlog.c:12343 +#: access/transam/xlogrecovery.c:4019 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Filen \"%s\" kunde inte döpas om till \"%s\": %m." +msgid "invalid xl_info in checkpoint record" +msgstr "ogiltig xl_info i checkpoint-post" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 -#: access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:4030 #, c-format -msgid "online backup mode canceled" -msgstr "online backupläge avbrutet" +msgid "invalid length of primary checkpoint record" +msgstr "ogiltig längd i primär checkpoint-post" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:4034 #, 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 "invalid length of checkpoint record" +msgstr "ogiltig längd på checkpoint-post" -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:4090 #, 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 "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:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4104 #, 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 "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:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4123 #, 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 "new target timeline is %u" +msgstr "ny måltidslinje är %u" -#: access/transam/xlog.c:13079 +#: access/transam/xlogrecovery.c:4326 #, c-format msgid "WAL receiver process shutdown requested" msgstr "nedstängning av WAL-mottagarprocess efterfrågad" -#: access/transam/xlog.c:13174 +#: access/transam/xlogrecovery.c:4389 #, c-format msgid "received promote request" msgstr "tog emot förfrågan om befordring" -#: access/transam/xlog.c:13187 +#: access/transam/xlogrecovery.c:4402 #, c-format msgid "promote trigger file found: %s" msgstr "triggerfil för befordring hittad: %s" -#: access/transam/xlog.c:13195 +#: access/transam/xlogrecovery.c:4410 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "kunde inte göra stat() på triggerfil för befordring \"%s\": %m" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4635 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "arkivfil \"%s\" har fel storlek: %lld istället för %lld" +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/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 +#: access/transam/xlogrecovery.c:4693 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "återställd logfil \"%s\" från arkiv" +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/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4645 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command returnerade exit-kod noll men stat() misslyckades." +msgid "If recovery is unpaused, the server will shut down." +msgstr "Om återställning avpausas så kommer servern stänga ner." -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4646 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "kunde inte återställa fil \"%s\" från arkiv: %s" +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." -#. 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:4657 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +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/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %m" +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/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "kunde inte skriva arkiveringsstatusfil \"%s\": %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "återställning avbruten på grund av otillräckliga parametervärden" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4697 #, c-format -msgid "a backup is already in progress in this session" -msgstr "en backup är redan på gång i denna session" +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/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "non-exclusive backup in progress" -msgstr "icke-exklusiv backup är på gång" +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/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Menade du att använda pg_stop_backup('f')?" +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" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1966 -#: commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 -#: executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 -#: 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:3328 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 -#: utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 -#: utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10017 -#: utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:253 #, 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 "expected end timeline %u but found timeline %u" +msgstr "förväntade sluttidslinje %u men hittade tidslinje %u" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1970 -#: commands/extension.c:2078 commands/extension.c:2363 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:3332 -#: 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:223 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10021 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:277 #, 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 "expected start timeline %u but found timeline %u" +msgstr "förväntade starttidslinje %u men hittade tidslinje %u" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:304 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "icke-exklusiv backup är inte på gång" +msgid "start timeline %u not found in history of timeline %u" +msgstr "starttidslinje %u hittades inte i historiken för tidslinje %u" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:355 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Menade du att använda pg_stop_backup('t')?" +msgid "could not rewind temporary file" +msgstr "kunde inte spola tillbaka temporär fil" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:374 #, 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 "could not read from temporary file: read only %zu of %zu bytes" +msgstr "kunde inte läsa från temporärfil: läste bara %zu av %zu byte" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:454 #, 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 "could not find any WAL files" +msgstr "kunde inte hitta några WAL-filer" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s kan inte köras under återställning" +msgid "could not find WAL file \"%s\"" +msgstr "kunde inte hitta WAL-fil \"%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 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "recovery is not in progress" -msgstr "återställning är inte i gång" +msgid "unexpected WAL file size \"%s\"" +msgstr "oväntad WAL-filstorlek \"%s\"" -#: 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 +#: backup/basebackup.c:630 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Återställningskontrollfunktioner kan bara köras under återställning." +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" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:637 #, c-format -msgid "standby promotion is ongoing" -msgstr "standby-befordring pågår" +msgid "checksum verification failure during base backup" +msgstr "misslyckad verifiering av checksumma under basbackup" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s kan inte köras efter att befordran startats." +msgid "duplicate option \"%s\"" +msgstr "duplicerad flagga \"%s\"" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:734 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\" får inte vara negativ eller noll" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "okänd checkpoint-typ: \"%s\"" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:769 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "misslyckades med att sända en signal till postmaster: %m" +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)" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:814 #, c-format -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" +msgid "unrecognized manifest option: \"%s\"" +msgstr "okänd manifestflagga: \"%s\"" -#: access/transam/xlogreader.c:338 +#: backup/basebackup.c:830 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ogiltig postoffset vid %X/%X" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "okänd algoritm för kontrollsumma: \"%s\"" -#: access/transam/xlogreader.c:346 +#: backup/basebackup.c:865 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "contrecord är begärd vid %X/%X" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "okänd komprimeringsalgoritm: \"%s\"" -#: access/transam/xlogreader.c:448 +#: backup/basebackup.c:881 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "det finns ingen contrecord-flagga vid %X/%X" +msgid "unrecognized base backup option: \"%s\"" +msgstr "okänd basbackupflagga: \"%s\"" -#: access/transam/xlogreader.c:461 +#: backup/basebackup.c:892 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" +msgid "manifest checksums require a backup manifest" +msgstr "manifestchecksummor kräver ett backup-manifest" -#: access/transam/xlogreader.c:521 +#: backup/basebackup.c:901 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "postlängd %u vid %X/%X är för lång" +msgid "target detail cannot be used without target" +msgstr "målinställningar kan inte användas utan ett mål" -#: access/transam/xlogreader.c:732 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, 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 "target \"%s\" does not accept a target detail" +msgstr "målet \"%s\" stöder inte målinställningar" -#: access/transam/xlogreader.c:740 +#: backup/basebackup.c:921 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "komprimeringsinställning kan inte anges om komprimering inte är påslagen" -#: access/transam/xlogreader.c:753 access/transam/xlogreader.c:769 +#: backup/basebackup.c:934 #, 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 compression specification: %s" +msgstr "ogiltig inställning för komprimering: %s" -#: access/transam/xlogreader.c:805 +#: backup/basebackup.c:1431 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" +msgid "skipping special file \"%s\"" +msgstr "hoppar över specialfil \"%s\"" -#: access/transam/xlogreader.c:842 +#: backup/basebackup.c:1550 #, 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 segment number %d in file \"%s\"" +msgstr "ogiltigt segmentnummer %d i fil \"%s\"" -#: access/transam/xlogreader.c:856 access/transam/xlogreader.c:897 +#: backup/basebackup.c:1582 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" +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" -#: access/transam/xlogreader.c:871 +#: backup/basebackup.c:1656 #, 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 "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" -#: access/transam/xlogreader.c:879 +#: backup/basebackup.c:1663 #, 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" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "ytterligare kontroller av checksummor i fil \"%s\" kommer inte rapporteras" -#: access/transam/xlogreader.c:885 +#: backup/basebackup.c:1719 #, 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" +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" -#: access/transam/xlogreader.c:916 +#: backup/basebackup.c:1765 #, 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 "file name too long for tar format: \"%s\"" +msgstr "filnamnet är för långt för tar-format: \"%s\"" -# FIXME -#: access/transam/xlogreader.c:941 +#: backup/basebackup.c:1770 #, 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 "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\"" -#: access/transam/xlogreader.c:1286 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" +msgid "gzip compression is not supported by this build" +msgstr "gzip-komprimering stöds inte av detta bygge" -#: access/transam/xlogreader.c:1308 +#: backup/basebackup_gzip.c:143 #, c-format -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" +msgid "could not initialize compression library" +msgstr "kunde inte initierar komprimeringsbibliotek" -#: access/transam/xlogreader.c:1315 +#: backup/basebackup_lz4.c:67 #, c-format -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" +msgid "lz4 compression is not supported by this build" +msgstr "lz4-komprimering stöds inte av detta bygge" -#: access/transam/xlogreader.c:1351 +#: backup/basebackup_server.c:75 #, c-format -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 blockavbildlängd %u vid %X/%X" +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "måste vara superuser eller en roll med rättigheter från rollen pg_write_server_files för att skapa backup som sparas på servern" -#: access/transam/xlogreader.c:1367 +#: backup/basebackup_server.c:89 #, c-format -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" +msgid "relative path not allowed for backup stored on server" +msgstr "relativ sökväg tillåts inte för backup som sparas på servern" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "kunde inte skapa katalog \"%s\": %m" -#: access/transam/xlogreader.c:1382 +#: backup/basebackup_server.c:115 #, 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 "directory \"%s\" exists but is not empty" +msgstr "katalogen \"%s\" existerar men är inte tom" -#: access/transam/xlogreader.c:1397 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 #, 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 "could not access directory \"%s\": %m" +msgstr "kunde inte komma åt katalog \"%s\": %m" -#: access/transam/xlogreader.c:1413 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 #, c-format -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" +msgid "Check free disk space." +msgstr "Kontrollera ledigt diskutrymme." -#: access/transam/xlogreader.c:1425 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "ogiltig block_id %u vid %X/%X" +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" -#: access/transam/xlogreader.c:1512 +#: backup/basebackup_target.c:146 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "post med ogiltig längd vid %X/%X" +msgid "unrecognized target: \"%s\"" +msgstr "okänt mål \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "målet \"%s\" kräver en målinställning" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "zstd-komprimering stöds inte av detta bygge" -#: access/transam/xlogreader.c:1601 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ogiltig komprimerad image vid %X/%X, block %d" +msgid "could not set compression worker count to %d: %s" +msgstr "kunde inte sätta komprimeringens arbetarantal till %d: %s" -#: 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 kräver ett tvåpotensvärde mellan 1 MB och 1 GB" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%s kräver ett värde" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" msgstr "-c %s kräver ett värde" -#: 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 "Försök med \"%s --help\" för mer information.\n" -#: bootstrap/bootstrap.c:312 +#: 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:379 +#: 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:446 catalog/aclchk.c:989 +#: 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:450 catalog/aclchk.c:993 +#: 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:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "ogiltig privilegietyp %s för databas" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "ogiltig privilegietyp %s för domän" -#: 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 "ogiltig privilegietyp %s för funktion" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "ogiltig privilegietyp %s för språk" -#: catalog/aclchk.c:470 +#: 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:474 catalog/aclchk.c:1013 +#: 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:478 catalog/aclchk.c:1001 +#: 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:482 catalog/aclchk.c:1005 +#: 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:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "ogiltig privilegietyp %s för tabellutrymme" -#: 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 "ogiltig privilegietyp %s för typ" -#: catalog/aclchk.c:494 +#: 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:498 +#: 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:537 +#: catalog/aclchk.c:510 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "ogiltig privilegietyp %s för parameter" + +#: 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:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 -#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 +#: 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:926 catalog/aclchk.c:935 commands/collationcmds.c:119 -#: commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 -#: commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 -#: commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 -#: commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 -#: commands/dbcommands.c:158 commands/dbcommands.c:167 -#: commands/dbcommands.c:176 commands/dbcommands.c:185 -#: commands/dbcommands.c:194 commands/dbcommands.c:203 -#: commands/dbcommands.c:212 commands/dbcommands.c:221 -#: commands/dbcommands.c:230 commands/dbcommands.c:239 -#: commands/dbcommands.c:261 commands/dbcommands.c:1529 -#: commands/dbcommands.c:1538 commands/dbcommands.c:1547 -#: commands/dbcommands.c:1556 commands/extension.c:1757 -#: commands/extension.c:1767 commands/extension.c:1777 -#: commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 -#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 -#: commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 -#: commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 -#: commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 -#: 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:408 -#: replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 -#: replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 -#: replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 -#: replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "motstridiga eller redundanta inställningar" - -#: catalog/aclchk.c:1046 +#: 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:1206 +#: 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:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 -#: commands/tablecmds.c:7092 commands/tablecmds.c:7248 -#: commands/tablecmds.c:7298 commands/tablecmds.c:7372 -#: commands/tablecmds.c:7442 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7648 commands/tablecmds.c:7707 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7825 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 -#: commands/tablecmds.c:11726 commands/tablecmds.c:11907 -#: commands/tablecmds.c:12067 commands/tablecmds.c:13210 -#: commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2460 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3432 -#: parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 +#: commands/tablecmds.c:7477 commands/tablecmds.c:7551 +#: commands/tablecmds.c:7621 commands/tablecmds.c:7733 +#: commands/tablecmds.c:7827 commands/tablecmds.c:7886 +#: commands/tablecmds.c:7975 commands/tablecmds.c:8005 +#: commands/tablecmds.c:8133 commands/tablecmds.c:8215 +#: commands/tablecmds.c:8371 commands/tablecmds.c:8489 +#: commands/tablecmds.c:12218 commands/tablecmds.c:12399 +#: commands/tablecmds.c:12559 commands/tablecmds.c:13723 +#: commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2506 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1147 -#: commands/tablecmds.c:249 commands/tablecmds.c:16620 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17156 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:1845 +#: 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:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "ogiltig rättighetstyp %s för tabell" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "ogitligt rättighetstyp %s för kolumn" -#: catalog/aclchk.c:2041 +#: 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:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "språket \"%s\" är inte betrott" -#: 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 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:3139 +#: 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:3140 +#: 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:3147 catalog/objectaddress.c:1656 +#: 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:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "okänd privilegietyp \"%s\"" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "rättighet saknas för aggregat %s" -#: catalog/aclchk.c:3331 +#: 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:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "rättighet saknas för kolumn %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "rättighet saknas för konvertering %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "rättighet saknas för databas %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "rättighet saknas för domän %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "rättighet saknas för händelsetrigger %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "rättighet saknas för utökning %s" -#: catalog/aclchk.c:3352 +#: 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:3355 +#: 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:3358 +#: 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:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "rättighet saknas för funktion %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "rättighet saknas för index %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "rättighet saknas för språk %s" -#: catalog/aclchk.c:3370 +#: 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:3373 +#: 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:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "rättighet saknas för operatorklasss %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "rättighet saknas för operator %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "rättighet saknas för operatorfamilj %s" -#: catalog/aclchk.c:3385 +#: catalog/aclchk.c:3584 +#, c-format +msgid "permission denied for parameter %s" +msgstr "rättighet saknas för parametern %s" + +#: catalog/aclchk.c:3587 #, c-format msgid "permission denied for policy %s" msgstr "rättighet saknas för policy %s" -#: catalog/aclchk.c:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "rättighet saknas för procedur %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "rättighet saknas för publicering %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "rättighet saknas för rutin %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "rättighet saknas för schema %s" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 -#: commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 -#: commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "rättighet saknas för sekvens %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "rättighet saknas för statistikobjekt %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "rättighet saknas för prenumeration %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "rättighet saknas för tabell %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "rättighet saknas för tabellutrymme %s" -#: catalog/aclchk.c:3415 +#: 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:3418 +#: 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:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "rättighet saknas för typ %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "rättighet saknas för vy %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "måste vara ägaren till aggregatet %s" -#: catalog/aclchk.c:3462 +#: 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:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "måste vara ägaren till konverteringen %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "måste vara ägaren till databasen %s" -#: catalog/aclchk.c:3471 +#: 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:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "måste vara ägaren till händelsetrigger %s" -#: catalog/aclchk.c:3477 +#: 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:3480 +#: 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:3483 +#: 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:3486 +#: 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:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "måste vara ägaren till funktionen %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "måste vara ägaren till indexet %s" -#: catalog/aclchk.c:3495 +#: 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:3498 +#: 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:3501 +#: 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:3504 +#: 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:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "måste vara ägaren till operatorn %s" -#: catalog/aclchk.c:3510 +#: 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:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "måste vara ägaren till proceduren %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "måste vara ägaren till publiceringen %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "måste vara ägaren till rutinen %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "måste vara ägaren till sekvensen %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "måste vara ägaren till prenumerationen %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "måste vara ägaren till tabellen %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "måste vara ägaren till typen %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "måste vara ägaren till vyn %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "måste vara ägaren till schemat %s" -#: catalog/aclchk.c:3540 +#: 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:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "måste vara ägaren till tabellutrymmet %s" -#: catalog/aclchk.c:3546 +#: 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:3549 +#: 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:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "måste vara ägaren till relationen %s" -#: catalog/aclchk.c:3607 +#: 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: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 i relation med OID %u existerar inte" -#: 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 med OID %u existerar inte" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 #, c-format msgid "database with OID %u does not exist" msgstr "databas med OID %u finns inte" -#: 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 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:4085 catalog/aclchk.c:4940 +#: 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:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: 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 "tabellutrymme med OID %u finns inte" -#: 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 "främmande data-omvandlare med OID %u finns inte" -#: 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 "främmande server med OID %u finns inte" -#: catalog/aclchk.c:4494 catalog/aclchk.c:4862 utils/cache/typcache.c:389 -#: utils/cache/typcache.c:444 +#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "typ med OID %u existerar inte" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "operator med OID %u existerar inte" -#: catalog/aclchk.c:5065 +#: 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:5092 +#: 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:5119 +#: 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:5146 +#: 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: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 "händelsetrigger med OID %u existerar inte" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: 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:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "konvertering med OID %u existerar inte" -#: catalog/aclchk.c:5347 +#: 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:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "publicering med OID %u existerar inte" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "prenumeration med OID %u existerar inte" -#: catalog/aclchk.c:5426 +#: 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:378 +#: 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:380 +#: 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:405 +#: 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] "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:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "måste vara superuser för att anropa pg_nextoid()" +msgid "must be superuser to call %s()" +msgstr "måste vara en superuser för att anropa %s()" -#: catalog/catalog.c:544 +#: 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:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "index \"%s\" tillhör inte tabell \"%s\"" -#: catalog/catalog.c:566 +#: 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:573 +#: 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:821 catalog/dependency.c:1060 +#: catalog/dependency.c:538 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:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "kan inte ta bort %s eftersom %s behöver den" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Du kan ta bort %s i stället." -#: catalog/dependency.c:931 catalog/pg_shdepend.c:697 -#, 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s beror på %s" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "drop svämmar över (cascades) till %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "" "\n" @@ -4189,310 +4431,330 @@ msgstr[1] "" "\n" "och %d andra objekt (se serverloggen för en lista)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, 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:1197 catalog/dependency.c:1204 -#: catalog/dependency.c:1216 commands/tablecmds.c:1304 -#: commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 -#: commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1439 utils/misc/guc.c:7128 -#: utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11424 -#: utils/misc/guc.c:11458 utils/misc/guc.c:11492 utils/misc/guc.c:11535 -#: utils/misc/guc.c:11577 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11865 +#: utils/misc/guc.c:11899 utils/misc/guc.c:11933 utils/misc/guc.c:11976 +#: utils/misc/guc.c:12018 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, 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:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, 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:1882 +#: catalog/dependency.c:1889 #, 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:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "kolumn %d i relation \"%s\" finns inte" + +#: 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:334 +#: 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:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 -#: commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6861 #, c-format msgid "tables can have at most %d columns" msgstr "tabeller kan ha som mest %d kolumner" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7161 #, 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:543 +#: catalog/heap.c:500 #, 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:618 +#: catalog/heap.c:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "partitionsnyckelkolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "kolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, 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:709 +#: catalog/heap.c:666 #, 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:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, 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:1200 catalog/index.c:872 commands/createas.c:408 -#: commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "relationen \"%s\" finns redan" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 #: catalog/pg_type.c:931 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 +#: 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:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "relfilenode-värde för toast är inte satt i binärt uppgraderingsläge" + +#: catalog/heap.c:1216 #, 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:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "relfilenode-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:2731 +#: catalog/heap.c:2401 #, c-format msgid "check constraint \"%s\" already exists" msgstr "check-villkor \"%s\" finns redan" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8710 +#: catalog/heap.c:2571 catalog/index.c:889 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8863 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "integritetsvillkor \"%s\" för relation \"%s\" finns redan" -#: catalog/heap.c:2908 +#: 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:2919 +#: 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:2929 +#: 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:2934 +#: 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:3039 +#: 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:3041 +#: 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:3047 +#: 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:3048 +#: 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:3101 +#: catalog/heap.c:2771 #, c-format msgid "generation expression is not immutable" msgstr "genereringsuttryck är inte immutable" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1290 #, 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:3134 commands/prepare.c:368 parser/analyze.c:2684 +#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2730 #: parser/parse_target.c:594 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Du måste skriva om eller typomvandla uttrycket." -#: catalog/heap.c:3181 +#: 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:3479 +#: 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:3480 +#: 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:3485 +#: 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:3486 +#: catalog/heap.c:3156 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabell \"%s\" refererar till \"%s\"." -#: catalog/heap.c:3488 +#: 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:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, 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:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "primärnycklar kan inte vara uttryck" -#: catalog/index.c:258 +#: catalog/index.c:259 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "primärnyckelkolumn \"%s\" är inte markerad NOT NULL" -#: catalog/index.c:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, 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:811 +#: catalog/index.c:814 #, 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:826 +#: catalog/index.c:829 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "samtida indexskapande på systemkatalogtabeller stöds inte" -#: catalog/index.c:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "samtida indexskapande för uteslutningsvillkor stöds inte" -#: catalog/index.c:844 +#: catalog/index.c:847 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "delade index kan inte skapas efter initdb" -#: catalog/index.c:864 commands/createas.c:423 commands/sequence.c:162 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "relationen \"%s\" finns redan, hoppar över" -#: catalog/index.c:914 +#: catalog/index.c:917 #, 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:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "relfilenode-värde för index är inte satt i binärt uppgraderingsläge" + +#: catalog/index.c:2232 #, 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:3628 +#: catalog/index.c:3637 #, 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:3639 commands/indexcmds.c:3572 +#: catalog/index.c:3648 commands/indexcmds.c:3560 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "kan inte omindexera angivet index i TOAST-tabell" -#: catalog/index.c:3655 commands/indexcmds.c:3452 commands/indexcmds.c:3596 -#: commands/tablecmds.c:3273 +#: catalog/index.c:3664 commands/indexcmds.c:3440 commands/indexcmds.c:3584 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "kan inte flytta systemrelation \"%s\"" -#: catalog/index.c:3799 +#: catalog/index.c:3808 #, c-format msgid "index \"%s\" was reindexed" msgstr "index \"%s\" omindexerades" -#: catalog/index.c:3936 +#: catalog/index.c:3945 #, 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:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5233 +#: commands/trigger.c:5812 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "referenser till andra databaser är inte implementerat: \"%s.%s.%s\"" @@ -4507,24 +4769,24 @@ msgstr "temporära tabeller kan inte anges med ett schemanamn" msgid "could not obtain lock on relation \"%s.%s\"" msgstr "kunde inte ta lås på relationen \"%s.%s\"" -#: catalog/namespace.c:402 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 "kunde inte ta lås på relationen \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: 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:435 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 "relationen \"%s\" existerar inte" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1541 -#: commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 +#: commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "inget schema har valts för att skapa i" @@ -4570,12 +4832,12 @@ msgstr "textsökmall \"%s\" finns inte" msgid "text search configuration \"%s\" does not exist" msgstr "textsökkonfiguration \"%s\" finns inte" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 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:2889 gram.y:15103 gram.y:17077 parser/parse_expr.c:817 +#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 #: parser/parse_target.c:1262 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -4592,7 +4854,7 @@ 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:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 -#: commands/tablecmds.c:1249 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "schema \"%s\" existerar inte" @@ -4627,234 +4889,238 @@ msgstr "kan inte skapa temptabeller under återställning" msgid "cannot create temporary tables during a parallel operation" msgstr "kan inte skapa temporära tabeller under en parallell operation" -#: catalog/namespace.c:4338 commands/tablespace.c:1216 commands/variable.c:64 -#: utils/misc/guc.c:11609 utils/misc/guc.c:11687 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12050 utils/misc/guc.c:12152 #, c-format msgid "List syntax is invalid." msgstr "List-syntaxen är ogiltig." -#: 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:2160 commands/tablecmds.c:6082 -#: commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12335 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" är inte en tabell" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6121 commands/tablecmds.c:16625 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17161 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" är inte en vy" -#: catalog/objectaddress.c:1384 commands/matview.c:186 commands/tablecmds.c:261 -#: commands/tablecmds.c:16630 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17166 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" är inte en materialiserad vy" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 -#: commands/tablecmds.c:6124 commands/tablecmds.c:16635 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17171 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" är inte en främmande tabell" -#: catalog/objectaddress.c:1432 +#: catalog/objectaddress.c:1453 #, c-format msgid "must specify relation and object name" msgstr "måste ange relation och objektnamn" -#: 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 "kolumnnamn måste vara kvalificerat" -#: catalog/objectaddress.c:1608 +#: 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: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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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:1764 +#: 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:1795 +#: 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: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 "användarmappning för användare \"%s\" på server \"%s\" finns inte" -#: catalog/objectaddress.c:1861 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 #, c-format msgid "server \"%s\" does not exist" msgstr "server \"%s\" finns inte" -#: catalog/objectaddress.c:1928 +#: 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:1990 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "publiceringsschema \"%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:1991 +#: 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: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 användare \"%s\" i schema \"%s\" på %s finns inte" -#: 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 användare \"%s\" på %s finns inte" -#: 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 "namn eller argumentlistor får inte innehålla null" -#: catalog/objectaddress.c:2108 +#: catalog/objectaddress.c:2144 #, c-format msgid "unsupported object type \"%s\"" msgstr "ej stöd för 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:2247 catalog/objectaddress.c:2331 #, c-format msgid "name list length must be exactly %d" msgstr "namnlistlängen måste vara exakt %d" -#: catalog/objectaddress.c:2150 +#: 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:2159 catalog/objectaddress.c:2222 -#: catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "namnlistlängden måste vara minst %d" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "argumentlistans längd måste vara exakt %d" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2533 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:2503 commands/functioncmds.c:1583 +#: catalog/objectaddress.c:2548 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:2553 catalog/objectaddress.c:2570 +#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "måste vara en superuser" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "måste ha rättigheten CREATEROLE" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "okänd objekttyp \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "kolumn %s av %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "funktion %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "typ %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "typomvandling från %s till %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "jämförelse %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "villkor %s på %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "villkor %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "konvertering %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "default-värde för %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "språk %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "stort objekt %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "operator %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "operatorklass %s för accessmetod %s" -#: catalog/objectaddress.c:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "accessmetod %s" @@ -4863,7 +5129,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operator %d (%s, %s) för %s: %s" @@ -4872,221 +5138,231 @@ 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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "regel %s på %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "trigger %s på %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "schema %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "statistikobjekt %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "textsökparser %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "textsökordlista %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "textsökmall %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "textsökkonfiguration %s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "roll %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "databas %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "tabellutrymme %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "främmande data-omvandlare %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "server %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "användarmappning för %s på server %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, 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:3727 +#: catalog/objectaddress.c:3795 #, 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:3733 +#: catalog/objectaddress.c:3801 #, 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:3737 +#: catalog/objectaddress.c:3805 #, 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:3743 +#: catalog/objectaddress.c:3811 #, 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:3747 +#: catalog/objectaddress.c:3815 #, 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:3753 +#: catalog/objectaddress.c:3821 #, 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:3757 +#: catalog/objectaddress.c:3825 #, 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:3763 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr ".\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15173,12 +16003,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:389 +#: 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:396 +#: main/main.c:437 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15203,15 +16033,15 @@ msgstr "utökningsbar nodtyp \"%s\" finns redan" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" har inte registerats" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "relationen \"%s\" har ingen composite-typ" #: 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:592 +#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, c-format msgid "could not find array type for data type %s" msgstr "kunde inte hitta array-typ för datatyp %s" @@ -15231,6 +16061,12 @@ msgstr "ej namngiven portal med parametrar: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN stöds bara med villkor som är merge-joinbara eller hash-joinbara" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "kan inte utföra MERGE på relation \"%s\"" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -15238,53 +16074,48 @@ 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:1316 parser/analyze.c:1709 parser/analyze.c:1965 -#: parser/analyze.c:3144 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 +#: parser/analyze.c:3190 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s tillåts inte med UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 +#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 #, c-format msgid "could not implement GROUP BY" msgstr "kunde inte implementera GROUP BY" -#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 -#: optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2052 optimizer/plan/planner.c:3708 +#: optimizer/plan/planner.c:4351 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:4392 +#: optimizer/plan/planner.c:4350 #, c-format msgid "could not implement DISTINCT" msgstr "kunde inte implementera DISTINCT" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window PARTITION BY" msgstr "kunde inte implementera fönster-PARTITION BY" -#: optimizer/plan/planner.c:5241 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fönsterpartitioneringskolumner måsta ha en sorterbar datatyp." -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5476 #, c-format msgid "could not implement window ORDER BY" msgstr "kunde inte implementera fönster-ORDER BY" -#: optimizer/plan/planner.c:5246 +#: optimizer/plan/planner.c:5477 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fönsterordningskolumner måste ha en sorterbar datatyp." -#: optimizer/plan/setrefs.c:516 -#, c-format -msgid "too many range table entries" -msgstr "för många element i \"range table\"" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -15301,252 +16132,252 @@ msgstr "Alla kolumndatatyper måsta vara hash-bara." msgid "could not implement %s" msgstr "kunde inte implementera %s" -#: optimizer/util/clauses.c:4729 +#: optimizer/util/clauses.c:4777 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-funktion \"%s\" vid inline:ing" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format msgid "cannot open relation \"%s\"" msgstr "kan inte öppna relationen \"%s\"" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, 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:688 +#: optimizer/util/plancat.c:691 #, 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:705 +#: optimizer/util/plancat.c:708 #, 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:755 +#: optimizer/util/plancat.c:758 #, 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:860 +#: optimizer/util/plancat.c:863 #, 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:775 parser/analyze.c:1489 +#: parser/analyze.c:818 parser/analyze.c:1532 #, 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:976 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT har fler uttryck än målkolumner" -#: parser/analyze.c:994 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT har fler målkolumner än uttryck" -#: parser/analyze.c:998 +#: parser/analyze.c:1041 #, 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:1297 parser/analyze.c:1682 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, 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:1612 parser/analyze.c:3355 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kan inte appliceras på VÄRDEN" -#: parser/analyze.c:1848 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ogiltig UNION/INTERSECT/EXCEPT ORDER BY-klausul" -#: parser/analyze.c:1849 +#: parser/analyze.c:1892 #, 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:1850 +#: parser/analyze.c:1893 #, 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:1955 +#: parser/analyze.c:1998 #, 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:2027 +#: parser/analyze.c:2070 #, 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:2114 +#: parser/analyze.c:2157 #, 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:2515 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING måste ha minst en kolumn" -#: parser/analyze.c:2618 +#: parser/analyze.c:2664 #, 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:2679 +#: parser/analyze.c:2725 #, 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:2803 parser/analyze.c:2811 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "kan inte ange både %s och %s" -#: parser/analyze.c:2831 +#: parser/analyze.c:2877 #, 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:2839 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s stöds inte" -#: parser/analyze.c:2842 +#: parser/analyze.c:2888 #, 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:2850 +#: parser/analyze.c:2896 #, 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:2861 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s är inte giltig" -#: parser/analyze.c:2864 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Okänsliga markörer måste vara READ ONLY." -#: parser/analyze.c:2930 +#: parser/analyze.c:2976 #, 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:2940 +#: parser/analyze.c:2986 #, 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:2950 +#: parser/analyze.c:2996 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "materialiserade vyer kan inte defineras med bundna parametrar" -#: parser/analyze.c:2962 +#: parser/analyze.c:3008 #, 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:3151 +#: parser/analyze.c:3197 #, 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:3158 +#: parser/analyze.c:3204 #, 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:3165 +#: parser/analyze.c:3211 #, 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:3172 +#: parser/analyze.c:3218 #, 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:3179 +#: parser/analyze.c:3225 #, 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:3186 +#: parser/analyze.c:3232 #, 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:3278 +#: parser/analyze.c:3324 #, 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:3328 +#: parser/analyze.c:3374 #, 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:3337 +#: parser/analyze.c:3383 #, 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:3346 +#: parser/analyze.c:3392 #, 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:3364 +#: parser/analyze.c:3410 #, 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:3373 +#: parser/analyze.c:3419 #, 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:3393 +#: parser/analyze.c:3439 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "relationen \"%s\" i %s-klausul hittades inte i FROM-klausul" @@ -15622,526 +16453,538 @@ 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 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "aggregatfunktioner tillåts inte i MERGE WHEN-villkor" + +#: parser/parse_agg.c:441 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "gruppoperationer tillåts inte i MERGE WHEN-villkor" + +#: 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:492 +#: 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:497 +#: 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:499 +#: 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:504 +#: 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:506 +#: 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:511 +#: parser/parse_agg.c:518 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "aggregatfunktioner tillåts inte i WHEN-villkor" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:520 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "gruppoperationer tillåts inte i WHEN-villkor" -#: parser/parse_agg.c:518 +#: 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:520 +#: 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:525 +#: 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:527 +#: 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:533 +#: 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:535 +#: 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:541 +#: 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:543 +#: 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:549 +#: 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:551 +#: 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:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:585 parser/parse_clause.c:1836 #, 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:581 +#: 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:682 +#: 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:760 +#: parser/parse_agg.c:767 #, 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:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 +#: parser/parse_agg.c:768 parser/parse_expr.c:1674 parser/parse_expr.c:2156 #: 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:766 +#: parser/parse_agg.c:773 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "aggregatfunktionsanrop kan inte innehålla fönsterfunktionanrop" -#: parser/parse_agg.c:845 +#: parser/parse_agg.c:852 msgid "window functions are not allowed in JOIN conditions" msgstr "fönsterfunktioner tillåts inte i JOIN-villkor" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:859 msgid "window functions are not allowed in functions in FROM" msgstr "fönsterfunktioner tillåts inte i funktioner i FROM" -#: parser/parse_agg.c:858 +#: parser/parse_agg.c:865 msgid "window functions are not allowed in policy expressions" msgstr "fönsterfunktioner tillåts inte i policy-uttryck" -#: parser/parse_agg.c:871 +#: parser/parse_agg.c:878 msgid "window functions are not allowed in window definitions" msgstr "fönsterfunktioner tillåts inte i fönsterdefinitioner" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:889 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "fönsterfunktioner tillåts inte i MERGE WHEN-villkor" + +#: parser/parse_agg.c:913 msgid "window functions are not allowed in check constraints" msgstr "fönsterfunktioner tillåts inte i check-villkor" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:917 msgid "window functions are not allowed in DEFAULT expressions" msgstr "fönsterfunktioner tillåts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:920 msgid "window functions are not allowed in index expressions" msgstr "fönsterfunktioner tillåts inte i indexuttryck" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:923 msgid "window functions are not allowed in statistics expressions" msgstr "fönsterfunktioner tillåts inte i statistikuttryck" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in index predicates" msgstr "fönsterfunktioner tillåts inte i indexpredikat" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:929 msgid "window functions are not allowed in transform expressions" msgstr "fönsterfunktioner tillåts inte i transform-uttrycket" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:932 msgid "window functions are not allowed in EXECUTE parameters" msgstr "fönsterfunktioner tillåts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:935 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "fönsterfunktioner tillåts inte i WHEN-villkor" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:938 msgid "window functions are not allowed in partition bound" msgstr "fönsterfunktioner tillåts inte i partitiongräns" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:941 msgid "window functions are not allowed in partition key expressions" msgstr "fönsterfunktioner tillåts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:944 msgid "window functions are not allowed in CALL arguments" msgstr "fönsterfunktioner tillåts inte i CALL-argument" -#: parser/parse_agg.c:937 +#: parser/parse_agg.c:947 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:940 +#: parser/parse_agg.c:950 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:973 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" msgstr "fönsterfunktioner tillåts inte i %s" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1007 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "fönster \"%s\" finns inte" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1091 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "för många grupperingsmängder (maximalt 4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1231 #, 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:1414 +#: parser/parse_agg.c:1424 #, 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:1417 +#: parser/parse_agg.c:1427 #, 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:1422 +#: parser/parse_agg.c:1432 #, 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:1586 +#: parser/parse_agg.c:1596 #, 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:190 +#: parser/parse_clause.c:192 #, 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:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 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:610 +#: parser/parse_clause.c:612 #, 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:643 +#: parser/parse_clause.c:645 #, 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:644 +#: parser/parse_clause.c:646 #, 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:650 +#: parser/parse_clause.c:652 #, 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:651 +#: parser/parse_clause.c:653 #, 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:658 +#: parser/parse_clause.c:660 #, 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:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Placera kolumndefinitionslistan inne i ROWS FROM()." -#: parser/parse_clause.c:759 +#: 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:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "kolumnnamn \"%s\" är inte unikt" -#: parser/parse_clause.c:862 +#: 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:872 +#: 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:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "tabellsamplingsmetod \"%s\" existerar inte" -#: parser/parse_clause.c:954 +#: 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:988 +#: 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:1137 +#: parser/parse_clause.c:1139 #, 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:1327 +#: parser/parse_clause.c:1329 #, 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:1342 +#: parser/parse_clause.c:1344 #, 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:1351 +#: parser/parse_clause.c:1353 #, 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:1366 +#: parser/parse_clause.c:1368 #, 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:1375 +#: parser/parse_clause.c:1377 #, 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:1779 +#: parser/parse_clause.c:1781 #, 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:1804 +#: parser/parse_clause.c:1806 #, 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:1969 +#: parser/parse_clause.c:1971 #, 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:1998 +#: parser/parse_clause.c:1999 #, 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:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "%s-position %d finns inte i select-listan" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE är begränsad till 12 element" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "fönster \"%s\" är redan definierad" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, 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:2738 +#: parser/parse_clause.c:2739 #, 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:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, 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:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Ta bort parenteserna i denna OVER-klausul." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, 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:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-läge kräver en ORDER BY-klausul" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, 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:2890 +#: parser/parse_clause.c:2892 #, 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:2922 +#: parser/parse_clause.c:2924 #, 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:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT måste ha minst en kolumn" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, 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:3099 +#: parser/parse_clause.c:3101 #, 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:3105 +#: parser/parse_clause.c:3107 #, 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:3184 +#: parser/parse_clause.c:3186 #, 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:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Till exempel, ON CONFLICT (kolumnnamn)." -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, 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:3204 +#: parser/parse_clause.c:3206 #, 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:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "operator %s är inte en giltig sorteringsoperator" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, 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:3647 +#: parser/parse_clause.c:3649 #, 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:3653 +#: parser/parse_clause.c:3655 #, 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:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Typomvandla offset-värdet till lämplig typ." -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, 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:3664 +#: parser/parse_clause.c:3666 #, 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: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:2662 parser/parse_target.c:994 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "kan inte omvandla typ %s till %s" @@ -16200,19 +17043,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "argument deklarerade \"%s\" är inte alla likadana" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:523 +#: utils/fmgr/funcapi.c:601 #, 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:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:537 +#: utils/fmgr/funcapi.c:615 #, 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:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, 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" @@ -16295,18 +17138,18 @@ 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:1004 +#: parser/parse_collate.c:1005 #, 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:1007 +#: parser/parse_collate.c:1008 #, 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:854 +#: parser/parse_collate.c:855 #, 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\"" @@ -16336,372 +17179,377 @@ msgstr "rekursiv referens till fråga \"%s\" får inte finnas i en INTERSECT" 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:136 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE stöds inte i WITH-fråga" + +#: parser/parse_cte.c:143 #, 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:307 +#: parser/parse_cte.c:314 #, 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:334 +#: parser/parse_cte.c:341 #, 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:383 +#: parser/parse_cte.c:390 #, 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:389 +#: parser/parse_cte.c:396 #, 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:394 +#: parser/parse_cte.c:401 #, 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:398 +#: parser/parse_cte.c:405 #, 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:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "WITH-fråga är inte rekursiv" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, 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:455 +#: parser/parse_cte.c:462 #, 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:470 +#: parser/parse_cte.c:477 #, 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:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "sökkolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, 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:503 +#: parser/parse_cte.c:510 #, 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:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "cycle-kolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, 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:526 +#: parser/parse_cte.c:533 #, 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:534 +#: parser/parse_cte.c:541 #, 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:544 +#: parser/parse_cte.c:551 #, 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:551 +#: parser/parse_cte.c:558 #, 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:635 +#: parser/parse_cte.c:642 #, 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:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "ömsesidig rekursion mellan WITH-poster är inte implementerat" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, 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:875 +#: parser/parse_cte.c:882 #, 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:919 +#: parser/parse_cte.c:926 #, 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:925 +#: parser/parse_cte.c:932 #, 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:931 +#: parser/parse_cte.c:938 #, 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:937 +#: parser/parse_cte.c:944 #, 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:994 +#: parser/parse_cte.c:1001 #, 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:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT tillåts inte i detta kontext" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 -#: parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "kolumnen %s.%s finns inte" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "kolumn \"%s\" fanns inte i datatypen %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, 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:364 +#: parser/parse_expr.c:359 #, 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:395 parser/parse_target.c:739 +#: parser/parse_expr.c:390 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:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "kan inte använda kolumnreferenser i DEFAULT-uttryck" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 msgid "cannot use column reference in partition bound expression" msgstr "kan inte använda kolumnreferenser i partitionsgränsuttryck" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 -#: parser/parse_relation.c:889 parser/parse_target.c:1234 +#: parser/parse_expr.c:784 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:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:840 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:1044 +#: parser/parse_expr.c:1040 #, 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:1050 parser/parse_expr.c:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s får inte returnera en mängd" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "antalet kolumner matchar inte antalet värden" -#: parser/parse_expr.c:1481 +#: parser/parse_expr.c:1477 #, 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:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 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:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "kan inte använda subfråga i check-villkor" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "kan inte använda underfråga i DEFAULT-uttryck" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "kan inte använda subfråga i indexuttryck" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "kan inte använda subfråga i indexpredikat" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" msgstr "kan inte använda underfråga i statistikuttryck" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "kan inte använda underfråga i transformeringsuttrycket" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "kan inte använda subfråga i EXECUTE-parameter" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "kan inte använda subfråga i triggerns WHEN-villkor" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "kan inte använda underfråga i partitionsgräns" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "kan inte använda underfråga i partitionsnyckeluttryck" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "kan inte använda subfråga i CALL-argument" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 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:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "kan inte använda subfråga i kolumngenereringsuttryck" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "underfråga kan bara returnera en kolumn" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "underfråga har för många kolumner" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "underfråga har för få kolumner" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "kan inte bestämma typen av en tom array" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, 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:2015 +#: parser/parse_expr.c:2012 #, 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:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-uttryck kan ha som mest %d poster" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, 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:2304 +#: parser/parse_expr.c:2301 #, 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:2319 +#: parser/parse_expr.c:2316 #, 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:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kan inte typomvandla XMLSERIALIZE-resultat till %s" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "olika antal element i raduttryck" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "kan inte jämföra rader med längden noll" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, 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:2777 +#: parser/parse_expr.c:2774 #, 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:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, 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:2838 +#: parser/parse_expr.c:2835 #, 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:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Det finns flera lika sannolika kandidater." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM kräver att operatorn = ger tillbaka en boolean" @@ -16989,59 +17837,88 @@ msgstr "mängdreturnerande funktioner tillåts inte i policy-uttryck" msgid "set-returning functions are not allowed in window definitions" msgstr "mängdreturnerande funktioner tillåts inte i fönsterdefinitioner" -#: parser/parse_func.c:2616 +#: 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:2620 +#: 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:2623 +#: 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:2626 +#: 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:2629 +#: 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:2632 +#: 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:2635 +#: 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:2638 +#: 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-villkor" -#: parser/parse_func.c:2641 +#: 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:2644 +#: 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:2647 +#: 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:2650 +#: 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:2653 +#: 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_node.c:87 +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WHERE RECURSIVE stöds inte i MERGE-satser" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "onåbar WHEN-klausul har angivits efter en ej villkorlig WHEN-klausul" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE stöds inte för relationer med regler." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "namnet \"%s\" angivet mer än en gång" + +#: parser/parse_merge.c:210 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "Namnet används både som MERGE-måltabell och som datakälla." + +#: 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" @@ -17112,6 +17989,11 @@ msgstr "op ANY/ALL (array) kräver att operatorn inte returnerar en mängd" 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" @@ -17127,12 +18009,12 @@ msgstr "tabellreferens %u är tvetydig" msgid "table name \"%s\" specified more than once" msgstr "tabellnamn \"%s\" angivet mer än en gång" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, 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:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, 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." @@ -17152,108 +18034,108 @@ msgstr "systemkolumn \"%s\" som refereras till i check-villkor är ogiltigt" msgid "cannot use system column \"%s\" in column generation expression" msgstr "kan inte använda systemkolumn \"%s\" i kolumngenereringsuttryck" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 -#: parser/parse_relation.c:2343 +#: 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:2357 #, 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: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 "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:1379 +#: 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:1767 +#: 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:1773 +#: 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:1780 +#: 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:1791 +#: 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:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "kolumndefinitionslistor kan ha som mest %d poster" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, 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:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "funktioner i FROM kan returnera som mest %d kolumner" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "funktionen %s har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, 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:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "joins kan ha som mest %d kolumner" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "join-uttryck \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, 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:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "kolumn %d i relation \"%s\" finns inte" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, 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:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "saknar FROM-klausulpost för tabell \"%s\"" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, 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:3646 +#: parser/parse_relation.c:3664 #, 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:3663 +#: parser/parse_relation.c:3681 #, 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\"." @@ -17298,7 +18180,7 @@ msgstr "tilldelning med array-index till \"%s\" kräver typ %s men uttrycket har 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:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * utan tabeller angivna är inte giltigt" @@ -17318,8 +18200,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:803 utils/cache/typcache.c:394 -#: utils/cache/typcache.c:449 +#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" @@ -17329,12 +18211,12 @@ 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:766 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "ogiltigt typnamn \"%s\"" @@ -17344,325 +18226,330 @@ msgstr "ogiltigt typnamn \"%s\"" msgid "cannot create partitioned table as inheritance child" msgstr "kan inte skapa partitionerad tabell som barnarv" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "array med serial är inte implementerat" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, 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:684 +#: parser/parse_utilcmd.c:683 #, 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:701 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "identitetskolumner stöds inte på typade tabeller" -#: parser/parse_utilcmd.c:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "identitetskolumner stöds inte för partitioner" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, 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:744 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "genererade kolumner stöds inte på typade tabeller" -#: parser/parse_utilcmd.c:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "genererade kolumner stöds inte för partitioner" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, 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:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, 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:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, 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:825 +#: parser/parse_utilcmd.c:824 #, 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:833 +#: parser/parse_utilcmd.c:832 #, 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:841 +#: parser/parse_utilcmd.c:840 #, 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:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "uteslutningsvillkor stöds inte på främmande tabeller" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "uteslutningsvillkor stöds inte för partitionerade tabeller" -#: parser/parse_utilcmd.c:977 +#: parser/parse_utilcmd.c:976 #, 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:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "relationen \"%s\" är ogiltig i LIKE-klausul" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Index \"%s\" innehåller en hela-raden-referens." -#: parser/parse_utilcmd.c:2249 +#: parser/parse_utilcmd.c:2252 #, 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:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "index \"%s\" är redan associerad med ett villkor" -#: parser/parse_utilcmd.c:2284 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "index \"%s\" is not valid" msgstr "index \"%s\" är inte giltigt" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" är inte ett unikt index" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 -#: parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, 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:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "index \"%s\" innehåller uttryck" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" är ett partiellt index" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" är ett \"deferrable\" index" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, 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:2381 +#: parser/parse_utilcmd.c:2384 #, 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:2538 +#: parser/parse_utilcmd.c:2541 #, 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:2544 +#: parser/parse_utilcmd.c:2547 #, 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:2891 +#: parser/parse_utilcmd.c:2894 #, 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:2963 +#: parser/parse_utilcmd.c:2966 #, 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:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "regler på materialiserade vyer stöds inte" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, 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:3142 +#: parser/parse_utilcmd.c:3145 #, 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:3160 parser/parse_utilcmd.c:3261 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 #: rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, 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:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECT-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETE-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "kan inte referera till OLD i WITH-fråga" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "kan inte referera till NEW i WITH-fråga" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "felplacerad DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "multipla DEFERRABLE/NOT DEFERRABLE-klausuler tillåts inte" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "felplacerad NOT DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "felplacerad INITIALLY DEFERRED-klausul" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "multipla INITIALLY IMMEDIATE/DEFERRED-klausuler tillåts inte" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "felplacerad klausul INITIALLY IMMEDIATE" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, 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:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" är inte en partitionerad tabell" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "tabell \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "index \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, 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:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ogiltig gränsangivelse för hash-partition" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format 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:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, 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:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "ogiltig gränsangivelse för listpartition" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "ogiltig gränsangivelse för range-partition" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, 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:4136 +#: parser/parse_utilcmd.c:4139 #, 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:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "kan inte ange NULL i range-gräns" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, 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:4306 +#: parser/parse_utilcmd.c:4309 #, 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:4349 +#: parser/parse_utilcmd.c:4352 #, 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\"" @@ -17675,12 +18562,12 @@ msgstr "UESCAPE måste följas av en enkel stränglitteral" msgid "invalid Unicode escape character" msgstr "ogiltigt Unicode-escapetecken" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "ogiltigt Unicode-escapevärde" -#: parser/parser.c:468 scan.l:677 utils/adt/varlena.c:6555 +#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 #, c-format msgid "invalid Unicode escape" msgstr "ogiltig Unicode-escapesekvens" @@ -17690,8 +18577,8 @@ msgstr "ogiltig Unicode-escapesekvens" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicode-escapesekvenser måste vara \\XXXX eller \\+XXXXXX." -#: parser/parser.c:497 scan.l:638 scan.l:654 scan.l:670 -#: utils/adt/varlena.c:6580 +#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 +#: utils/adt/varlena.c:6554 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ogiltigt Unicode-surrogatpar" @@ -17701,74 +18588,74 @@ msgstr "ogiltigt Unicode-surrogatpar" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "identifierare \"%s\" kommer trunkeras till \"%.*s\"" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, 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:2873 partitioning/partbounds.c:2892 -#: partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, 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:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, 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:2893 +#: partitioning/partbounds.c:3005 #, 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:3028 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "tom intervallsgräns angiven för partition \"%s\"" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, 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:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "partition \"%s\" skulle överlappa partition \"%s\"" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, 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:4715 +#: partitioning/partbounds.c:4828 #, c-format 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:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" är inte en hash-partitionerad tabell" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, 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:4772 +#: partitioning/partbounds.c:4885 #, 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:4804 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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" @@ -17810,32 +18697,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:616 port/sysv_shmem.c:616 +#: 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:618 port/sysv_shmem.c:618 +#: 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:686 port/sysv_shmem.c:686 +#: 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:693 port/sysv_shmem.c:693 +#: 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:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: 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:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: 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\"." @@ -17862,37 +18749,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" @@ -17982,42 +18869,47 @@ msgstr "Misslyckat systemanrop var DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Misslyckat systemanrop var MapViewOfFileEx." -#: postmaster/autovacuum.c:410 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "kunde inte starta autovacuum-process: %m" -#: postmaster/autovacuum.c:1492 +#: postmaster/autovacuum.c:752 +#, c-format +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:1482 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "kunde inte starta autovacuum-arbetsprocess: %m" -#: postmaster/autovacuum.c:2298 +#: postmaster/autovacuum.c:2277 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: slänger övergiven temptabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisk vacuum av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisk analys av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processar arbetspost för relation \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum har inte startats på grund av en felkonfigurering" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Slå på flaggan \"track_counts\"." @@ -18027,405 +18919,241 @@ msgstr "Slå på flaggan \"track_counts\"." 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:661 +#: 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 workers without shared memory access are not supported" +msgstr "bakgrundsarbetare \"%s\": bakgrundsarbetare utan access till delat minne stöds inte" -#: postmaster/bgworker.c:670 +#: 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:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "bakgrundsarbetare \"%s\": ogiltigt omstartsintervall" -#: postmaster/bgworker.c:699 +#: 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:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "terminerar bakgrundsarbetare \"%s\" pga administratörskommando" -#: postmaster/bgworker.c:904 +#: 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:916 +#: 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:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "för många bakgrundsarbetare" -#: 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] "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:936 +#: 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: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] "checkpoint:s sker för ofta (%d sekund emellan)" msgstr[1] "checkpoint:s sker för ofta (%d sekunder emellan)" -#: postmaster/checkpointer.c:432 +#: 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:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "checkpoint-behgäran misslyckades" -#: postmaster/checkpointer.c:1063 +#: 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/pgarch.c:365 +#: postmaster/pgarch.c:423 #, 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:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "tog bort övergiven arkivstatusfil \"%s\": %m" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, 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:433 +#: postmaster/pgarch.c:491 #, 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:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "arkiveringskommando misslyckades med felkod %d" - -#: 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 "Det misslyckade arkiveringskommandot var: %s" - -#: postmaster/pgarch.c:543 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "arkiveringskommandot terminerades med avbrott 0x%X" - -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3758 -#, 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:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "arkiveringskommandot terminerades av signal %d: %s" - -#: postmaster/pgarch.c:559 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "arkiveringskommandot avslutade med okänd statuskod %d" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "kunde inte slå upp \"localhost\": %s" - -#: postmaster/pgstat.c:441 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "försöker med en annan adress till statistikinsamlare" - -#: postmaster/pgstat.c:450 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "kunde inte skapa uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:462 -#, 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:473 -#, 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:489 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "kunde inte ansluta uttag (socket) för statistikinsamlare: %m" - -#: postmaster/pgstat.c:510 -#, 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:536 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() misslyckades i statistikinsamlaren: %m" - -#: postmaster/pgstat.c:551 -#, 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:566 -#, 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:576 -#, 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:599 -#, 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:643 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "stänger av statistikinsamlare då arbetsuttag (socket) saknas" - -#: postmaster/pgstat.c:790 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "kunde inte fork():a statistikinsamlaren: %m" - -#: postmaster/pgstat.c:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "okänt återställningsmål \"%s\"" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "Målet måste vara \"archiver\", \"bgwriter\" eller \"wal\"." - -#: postmaster/pgstat.c:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "kunde inte läsa statistikmeddelande: %m" - -#: postmaster/pgstat.c:3634 postmaster/pgstat.c:3819 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:3729 postmaster/pgstat.c:3864 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:3738 postmaster/pgstat.c:3873 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "kunde inte stänga temporär statistikfil \"%s\": %m" - -#: postmaster/pgstat.c:3746 postmaster/pgstat.c:3881 -#, 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:3979 postmaster/pgstat.c:4245 postmaster/pgstat.c:4402 -#, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "kunde inte öppna statistikfil \"%s\": %m" - -#: 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 "korrupt statistikfil \"%s\"" - -#: postmaster/pgstat.c:4634 -#, c-format -msgid "statistics collector's time %s is later than backend local time %s" -msgstr "statistiksinsamlarens tid %s är senare än backend:ens lokala tid %s" - -#: postmaster/pgstat.c:4657 +#: postmaster/pgarch.c:798 #, 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 "restarting archiver process because value of \"archive_library\" was changed" +msgstr "startar om arkiveringsprocess då värdet på \"archive_library\" har ändrats" -#: postmaster/pgstat.c:4784 +#: postmaster/pgarch.c:831 #, c-format -msgid "stats_timestamp %s is later than collector's time %s for database %u" -msgstr "stats_timestamp %s är senare än insamlarens tid %s för databas %u" +msgid "archive modules have to define the symbol %s" +msgstr "arkiveringsmoduler måste definiera symbolen %s" -#: postmaster/pgstat.c:4997 +#: postmaster/pgarch.c:837 #, 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 "arkiveringsmoduler måste registrera en arkiverings-callback" -#: postmaster/postmaster.c:745 +#: 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:824 +#: 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:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ogiltigt 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) måste vara mindre än max_connections (%d)\n" -#: postmaster/postmaster.c:924 +#: 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:927 +#: 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:935 +#: 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:1052 +#: postmaster/postmaster.c:1113 #, 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:1128 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "avslutar loggutmatning till stderr" -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Framtida loggutmatning kommer gå till logg-destination \"%s\"." -#: postmaster/postmaster.c:1140 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "startar %s" -#: postmaster/postmaster.c:1161 postmaster/postmaster.c:1260 -#: utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "ogiltigt listsyntax för parameter \"%s\"" - -#: postmaster/postmaster.c:1192 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "kunde inte skapa lyssnande uttag (socket) för \"%s\"" -#: postmaster/postmaster.c:1198 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "kunde inte skapa TCP/IP-uttag (socket)" -#: postmaster/postmaster.c:1230 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() misslyckades: felkod %ld" -#: postmaster/postmaster.c:1282 +#: postmaster/postmaster.c:1343 #, 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:1288 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "kunde inte skapa något Unix-domän-uttag (socket)" -#: postmaster/postmaster.c:1300 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "inget uttag (socket) skapat för lyssnande" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1392 #, 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:1335 +#: postmaster/postmaster.c:1396 #, 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:1368 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "kunde inte ladda pg_hba.conf" -#: postmaster/postmaster.c:1394 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmaster blev flertrådad under uppstart" -#: postmaster/postmaster.c:1395 +#: postmaster/postmaster.c:1450 #, 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:1490 +#: postmaster/postmaster.c:1551 #, 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:1497 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: kunde inte hitta matchande postgres-binär" -#: postmaster/postmaster.c:1520 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 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:1547 +#: postmaster/postmaster.c:1608 #, c-format msgid "" "%s: could not find the database system\n" @@ -18436,232 +19164,228 @@ msgstr "" "Förväntade mig att hitta det i katalogen \"%s\",\n" "men kunde inte öppna filen \"%s\": %s\n" -#: postmaster/postmaster.c:1724 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "select() misslyckades i postmaster: %m" -#: postmaster/postmaster.c:1860 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "skickar SIGKILL till motsträviga barn" -#: postmaster/postmaster.c:1881 +#: postmaster/postmaster.c:1937 #, 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:1984 postmaster/postmaster.c:2012 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "ofullständigt startuppaket" -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "ogiltig längd på startuppaket" -#: postmaster/postmaster.c:2058 +#: postmaster/postmaster.c:2114 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "misslyckades att skicka SSL-förhandlingssvar: %m" -#: postmaster/postmaster.c:2076 +#: postmaster/postmaster.c:2132 #, c-format msgid "received unencrypted data after SSL request" msgstr "tog emot okrypterad data efter SSL-förfrågan" -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, 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:2102 +#: postmaster/postmaster.c:2158 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "misslyckades att skicka GSSAPI-förhandlingssvar: %m" -#: postmaster/postmaster.c:2120 +#: postmaster/postmaster.c:2176 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "tog emot okrypterad data efter GSSAPI-krypteringsförfrågan" -#: postmaster/postmaster.c:2144 +#: postmaster/postmaster.c:2200 #, 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:2208 utils/misc/guc.c:7126 utils/misc/guc.c:7162 -#: utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11530 -#: utils/misc/guc.c:11571 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11971 +#: utils/misc/guc.c:12012 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" -#: postmaster/postmaster.c:2211 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Giltiga värden är: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2256 +#: postmaster/postmaster.c:2312 #, 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:2273 +#: postmaster/postmaster.c:2329 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "inget PostgreSQL-användarnamn angivet i startuppaketet" -#: postmaster/postmaster.c:2337 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "databassystemet startar upp" -#: postmaster/postmaster.c:2343 +#: postmaster/postmaster.c:2399 #, c-format msgid "the database system is not yet accepting connections" msgstr "databassystemet tar ännu inte emot anslutningar" -#: postmaster/postmaster.c:2344 +#: postmaster/postmaster.c:2400 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Konsistent återställningstillstånd har ännu inte uppnåtts." -#: postmaster/postmaster.c:2348 +#: postmaster/postmaster.c:2404 #, c-format msgid "the database system is not accepting connections" msgstr "databassystemet tar inte emot anslutningar" -#: postmaster/postmaster.c:2349 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "Hot standby-läge är avstängt." -#: postmaster/postmaster.c:2354 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "databassystemet stänger ner" -#: postmaster/postmaster.c:2359 +#: postmaster/postmaster.c:2415 #, c-format msgid "the database system is in recovery mode" msgstr "databassystemet är återställningsläge" -#: postmaster/postmaster.c:2364 storage/ipc/procarray.c:499 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 +#: 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:2454 +#: postmaster/postmaster.c:2507 #, c-format msgid "wrong key in cancel request for process %d" msgstr "fel nyckel i avbrytbegäran för process %d" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2519 #, 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:2720 +#: postmaster/postmaster.c:2773 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "mottog SIGHUP, läser om konfigurationsfiler" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2746 postmaster/postmaster.c:2750 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s laddades inte om" -#: postmaster/postmaster.c:2760 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-konfiguration laddades inte om" -#: postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "tog emot förfrågan om att stänga ner smart" -#: postmaster/postmaster.c:2862 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "tog emot förfrågan om att stänga ner snabbt" -#: postmaster/postmaster.c:2880 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "avbryter aktiva transaktioner" -#: postmaster/postmaster.c:2904 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "mottog begäran för omedelbar nedstängning" -#: postmaster/postmaster.c:2981 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "nedstängs vid återställningsmål" -#: postmaster/postmaster.c:2999 postmaster/postmaster.c:3035 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "uppstartprocess" -#: postmaster/postmaster.c:3002 +#: postmaster/postmaster.c:3048 #, c-format msgid "aborting startup due to startup process failure" msgstr "avbryter uppstart på grund av fel i startprocessen" -#: postmaster/postmaster.c:3077 +#: postmaster/postmaster.c:3121 #, c-format msgid "database system is ready to accept connections" msgstr "databassystemet är redo att ta emot anslutningar" -#: postmaster/postmaster.c:3098 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "bakgrundsskrivarprocess" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "checkpoint-process" -#: postmaster/postmaster.c:3168 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "WAL-skrivarprocess" -#: postmaster/postmaster.c:3183 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "WAL-mottagarprocess" -#: postmaster/postmaster.c:3198 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "autovacuum-startprocess" -#: postmaster/postmaster.c:3216 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "arkiveringsprocess" -#: postmaster/postmaster.c:3231 -msgid "statistics collector process" -msgstr "statistikinsamlingsprocess" - -#: postmaster/postmaster.c:3245 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "system-logg-process" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "bakgrundsarbetare \"%s\"" -#: postmaster/postmaster.c:3393 postmaster/postmaster.c:3413 -#: postmaster/postmaster.c:3420 postmaster/postmaster.c:3438 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 +#: postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "serverprocess" -#: postmaster/postmaster.c:3492 +#: postmaster/postmaster.c:3508 #, c-format msgid "terminating any other active server processes" msgstr "avslutar andra aktiva serverprocesser" @@ -18686,6 +19410,11 @@ msgstr "Misslyckad process körde: %s" msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) terminerades av avbrott 0x%X" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, 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:3766 @@ -18700,543 +19429,440 @@ msgstr "%s (PID %d) terminerades av signal %d: %s" msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) avslutade med okänd status %d" -#: postmaster/postmaster.c:3992 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "ej normal databasnedstängning" -#: postmaster/postmaster.c:4030 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" msgstr "stänger ner på grund av fel i startprocessen" -#: postmaster/postmaster.c:4036 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "stänger ner då restart_after_crash är av" -#: postmaster/postmaster.c:4048 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alla serverprocesser är avslutade; initierar på nytt" -#: postmaster/postmaster.c:4222 postmaster/postmaster.c:5573 -#: postmaster/postmaster.c:5964 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 +#: postmaster/postmaster.c:5920 #, c-format msgid "could not generate random cancel key" msgstr "kunde inte skapa slumpad avbrytningsnyckel" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:4256 #, c-format msgid "could not fork new process for connection: %m" msgstr "kunde inte fork():a ny process for uppkoppling: %m" -#: postmaster/postmaster.c:4318 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "kunde inte fork():a ny process for uppkoppling: " -#: postmaster/postmaster.c:4424 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "ansluting mottagen: värd=%s port=%s" -#: postmaster/postmaster.c:4429 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "ansluting mottagen: värd=%s" -#: postmaster/postmaster.c:4672 +#: postmaster/postmaster.c:4646 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "kunde inte köra serverprocess \"%s\": %m" -#: postmaster/postmaster.c:4730 +#: postmaster/postmaster.c:4704 #, 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:4739 +#: postmaster/postmaster.c:4713 #, 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:4766 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "subprocessens kommando är för långt" -#: postmaster/postmaster.c:4784 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "Anrop till CreateProcess() misslyckades: %m (felkod %lu)" -#: postmaster/postmaster.c:4811 +#: postmaster/postmaster.c:4785 #, 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:4815 +#: postmaster/postmaster.c:4789 #, 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:4837 +#: postmaster/postmaster.c:4811 #, 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:4838 +#: postmaster/postmaster.c:4812 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Detta kan orsakas av ASLR eller antivirusprogram." -#: postmaster/postmaster.c:5020 +#: postmaster/postmaster.c:4985 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL-konfigurering kunde inte laddas i barnprocess" -#: postmaster/postmaster.c:5146 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "Rapportera gärna detta till <%s>." -#: postmaster/postmaster.c:5233 +#: postmaster/postmaster.c:5182 #, c-format msgid "database system is ready to accept read-only connections" msgstr "databassystemet är redo att ta emot read-only-anslutningar" -#: postmaster/postmaster.c:5497 +#: postmaster/postmaster.c:5446 #, c-format msgid "could not fork startup process: %m" msgstr "kunde inte starta startup-processen: %m" -#: postmaster/postmaster.c:5501 +#: postmaster/postmaster.c:5450 #, c-format msgid "could not fork archiver process: %m" msgstr "kunde inte fork:a arkivprocess: %m" -#: postmaster/postmaster.c:5505 +#: postmaster/postmaster.c:5454 #, c-format msgid "could not fork background writer process: %m" msgstr "kunde inte starta process för bakgrundsskrivare: %m" -#: postmaster/postmaster.c:5509 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "kunde inte fork:a bakgrundsprocess: %m" -#: postmaster/postmaster.c:5513 +#: postmaster/postmaster.c:5462 #, c-format msgid "could not fork WAL writer process: %m" msgstr "kunde inte fork:a WAL-skrivprocess: %m" -#: postmaster/postmaster.c:5517 +#: postmaster/postmaster.c:5466 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "kunde inte fork:a WAL-mottagarprocess: %m" -#: postmaster/postmaster.c:5521 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "kunde inte fork:a process: %m" -#: postmaster/postmaster.c:5722 postmaster/postmaster.c:5745 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, c-format msgid "database connection requirement not indicated during registration" msgstr "krav på databasanslutning fanns inte med vid registering" -#: postmaster/postmaster.c:5729 postmaster/postmaster.c:5752 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, c-format msgid "invalid processing mode in background worker" msgstr "ogiltigt processläge i bakgrundsarbetare" -#: postmaster/postmaster.c:5837 +#: postmaster/postmaster.c:5794 #, c-format msgid "could not fork worker process: %m" msgstr "kunde inte starta (fork) arbetarprocess: %m" -#: postmaster/postmaster.c:5950 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "ingen slot tillgänglig för ny arbetsprocess" -#: postmaster/postmaster.c:6284 +#: postmaster/postmaster.c:6237 #, 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:6316 +#: postmaster/postmaster.c:6269 #, 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:6345 +#: postmaster/postmaster.c:6298 #, 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:6352 +#: postmaster/postmaster.c:6305 #, 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:6361 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "kunde inte ta bort fil \"%s\": %s\n" -#: postmaster/postmaster.c:6378 +#: postmaster/postmaster.c:6331 #, 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:6387 +#: postmaster/postmaster.c:6340 #, 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:6394 +#: postmaster/postmaster.c:6347 #, 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:6556 +#: 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:6598 +#: postmaster/postmaster.c:6548 #, 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 -#, c-format -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 -#, 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 -#, c-format -msgid "could not fork system logger: %m" -msgstr "kunde inte fork:a systemloggaren: %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "omdirigerar loggutmatning till logginsamlingsprocess" - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "Framtida loggutmatning kommer dyka upp i katalog \"%s\"." - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "kunde inte omdirigera stdout: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "kunde inte omdirigera stderr: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "kunde inte skriva till loggfil: %s\n" - -#: postmaster/syslogger.c:1225 -#, 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 -#, 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 -#, 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 -#, 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:345 repl_gram.y:377 -#, c-format -msgid "invalid timeline %u" -msgstr "ogiltig tidslinje %u" - -#: repl_scanner.l:150 -msgid "invalid streaming start location" -msgstr "ogiltig startposition för strömning" - -#: repl_scanner.l:206 scan.l:717 -msgid "unterminated quoted string" -msgstr "icketerminerad citerad sträng" - -#: replication/backup_manifest.c:251 -#, 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:275 -#, 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:302 -#, 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:353 -#, c-format -msgid "could not rewind temporary file" -msgstr "kunde inte spola tillbaka temporär fil" - -#: replication/backup_manifest.c:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "kunde inte läsa från temporärfil: läste bara %zu av %zu byte" - -#: replication/basebackup.c:546 +#: postmaster/shell_archive.c:123 #, c-format -msgid "could not find any WAL files" -msgstr "kunde inte hitta några WAL-filer" +msgid "archive command failed with exit code %d" +msgstr "arkiveringskommando misslyckades med felkod %d" -#: replication/basebackup.c:561 replication/basebackup.c:577 -#: replication/basebackup.c:586 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "could not find WAL file \"%s\"" -msgstr "kunde inte hitta WAL-fil \"%s\"" +msgid "The failed archive command was: %s" +msgstr "Det misslyckade arkiveringskommandot var: %s" -#: replication/basebackup.c:629 replication/basebackup.c:659 +#: postmaster/shell_archive.c:132 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "oväntad WAL-filstorlek \"%s\"" +msgid "archive command was terminated by exception 0x%X" +msgstr "arkiveringskommandot terminerades med avbrott 0x%X" -#: replication/basebackup.c:644 replication/basebackup.c:1777 +#: postmaster/shell_archive.c:139 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "basbackup kunde inte skicka data, avbryter backup" +msgid "archive command was terminated by signal %d: %s" +msgstr "arkiveringskommandot terminerades av signal %d: %s" -#: replication/basebackup.c:722 +#: postmaster/shell_archive.c:148 #, 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" +msgid "archive command exited with unrecognized status %d" +msgstr "arkiveringskommandot avslutade med okänd statuskod %d" -#: replication/basebackup.c:729 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "checksum verification failure during base backup" -msgstr "misslyckad verifiering av checksumma under basbackup" +msgid "could not read from logger pipe: %m" +msgstr "kunde inte läsa från loggrör (pipe): %m" -#: 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 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "duplicate option \"%s\"" -msgstr "duplicerad flagga \"%s\"" +msgid "could not create pipe for syslog: %m" +msgstr "kunde inte skapa rör (pipe) för syslog: %m" -#: replication/basebackup.c:842 +#: postmaster/syslogger.c:677 #, 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)" +msgid "could not fork system logger: %m" +msgstr "kunde inte fork:a systemloggaren: %m" -#: replication/basebackup.c:887 +#: postmaster/syslogger.c:713 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "okänd manifestflagga: \"%s\"" +msgid "redirecting log output to logging collector process" +msgstr "omdirigerar loggutmatning till logginsamlingsprocess" -#: replication/basebackup.c:903 +#: postmaster/syslogger.c:714 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "okänd algoritm för kontrollsumma: \"%s\"" +msgid "Future log output will appear in directory \"%s\"." +msgstr "Framtida loggutmatning kommer dyka upp i katalog \"%s\"." -#: replication/basebackup.c:918 +#: postmaster/syslogger.c:722 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "manifestchecksummor kräver ett backup-manifest" +msgid "could not redirect stdout: %m" +msgstr "kunde inte omdirigera stdout: %m" -#: replication/basebackup.c:1525 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "skipping special file \"%s\"" -msgstr "hoppar över specialfil \"%s\"" +msgid "could not redirect stderr: %m" +msgstr "kunde inte omdirigera stderr: %m" -#: replication/basebackup.c:1646 +#: postmaster/syslogger.c:1177 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ogiltigt segmentnummer %d i fil \"%s\"" +msgid "could not write to log file: %s\n" +msgstr "kunde inte skriva till loggfil: %s\n" -#: replication/basebackup.c:1684 +#: postmaster/syslogger.c:1295 #, c-format -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" +msgid "could not open log file \"%s\": %m" +msgstr "kunde inte öppna loggfil \"%s\": %m" -#: replication/basebackup.c:1757 +#: postmaster/syslogger.c:1385 #, c-format -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" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "stänger av automatisk rotation (använd SIGHUP för att slå på igen)" -#: replication/basebackup.c:1764 +#: regex/regc_pg_locale.c:242 #, 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" +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" -#: replication/basebackup.c:1822 +#: regex/regc_pg_locale.c:265 #, 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" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "ickedeterministiska jämförelser (collation) stöds inte för reguljära uttryck" -#: replication/basebackup.c:1858 +#: repl_gram.y:303 repl_gram.y:335 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "filnamnet är för långt för tar-format: \"%s\"" +msgid "invalid timeline %u" +msgstr "ogiltig tidslinje %u" -#: replication/basebackup.c:1863 -#, 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\"" +#: repl_scanner.l:142 +msgid "invalid streaming start location" +msgstr "ogiltig startposition för strömning" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: repl_scanner.l:199 scan.l:724 +msgid "unterminated quoted string" +msgstr "icketerminerad citerad sträng" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "kunde inte nollställa sökväg: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "ogiltig anslutningssträngsyntax %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "kunde inte parsa anslutningssträng: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, 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:371 -#: replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:384 +#: replication/libpqwalreceiver/libpqwalreceiver.c:622 #, c-format msgid "invalid response from primary server" msgstr "ogiltigt svar från primär server" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:385 #, 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:448 -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:465 +#: replication/libpqwalreceiver/libpqwalreceiver.c:472 +#: replication/libpqwalreceiver/libpqwalreceiver.c:502 #, c-format msgid "could not start WAL streaming: %s" msgstr "kunde inte starta WAL-strömning: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:526 #, 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:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:549 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "oväntad resultatmängd efter end-of-streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:564 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "fel vid nestängning av strömmande COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:574 #, c-format msgid "error reading result of streaming command: %s" msgstr "fel vid läsning av resultat från strömningskommando: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 -#: replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:583 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "oväntat resultat efter CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:610 #, 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:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:623 #, 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:767 -#: replication/libpqwalreceiver/libpqwalreceiver.c:820 -#: replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:784 +#: replication/libpqwalreceiver/libpqwalreceiver.c:837 +#: replication/libpqwalreceiver/libpqwalreceiver.c:844 #, 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:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:864 #, 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:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:956 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "kunde inte skapa replikeringsslot \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 #, c-format msgid "invalid query response" msgstr "ogiltigt frågerespons" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Förväntade %d fält, fick %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 #, c-format msgid "the query interface requires a database connection" msgstr "frågeinterface:et kräver en databasanslutning" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 msgid "empty query" msgstr "tom fråga" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 msgid "unexpected pipeline mode" msgstr "oväntat pipeline-läge" -#: replication/logical/launcher.c:286 +#: 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:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "slut på logiska replikeringsarbetarslots" -#: replication/logical/launcher.c:367 +#: 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." @@ -19276,111 +19902,106 @@ msgstr "logisk avkodning kräver en databasanslutning" msgid "logical decoding cannot be used while in recovery" msgstr "logisk avkodning kan inte användas under återställning" -#: 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 "kan inte använda fysisk replikeringsslot för logisk avkodning" -#: 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 "replikeringsslot \"%s\" har inte skapats i denna databasen" -#: 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 "kan inte skapa logisk replikeringsslot i transaktion som redan har utfört skrivningar" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "startar logisk avkodning för slot \"%s\"" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, 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:696 +#: replication/logical/logical.c:720 #, 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:702 +#: replication/logical/logical.c:726 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot \"%s\", utdata-plugin \"%s\", i callback:en %s" -#: replication/logical/logical.c:873 replication/logical/logical.c:918 -#: replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format 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:1241 replication/logical/logical.c:1290 -#: replication/logical/logical.c:1331 replication/logical/logical.c:1417 -#: replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisk strömning kräven en %s-callback" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, 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:104 replication/slotfuncs.c:34 -#, 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/logical/logicalfuncs.c:134 +#: 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:1128 +#: utils/adt/jsonb.c:1302 #, 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:650 +#: 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 "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 +#: 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:193 +#: 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" @@ -19392,18 +20013,18 @@ msgstr "replikeringskälla \"%s\" finns inte" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "kunde inte hitta ledig replikering-origin-OID" +msgid "could not find free replication origin ID" +msgstr "kunde inte hitta ledig replikering-origin-ID" #: 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" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "kunde inte slänga replikeringskälla med ID %d som används av PID %d" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "replikeringskälla med OID %u finns inte" +msgid "replication origin with ID %d does not exist" +msgstr "replikeringskälla med ID %d finns inte" #: replication/logical/origin.c:741 #, c-format @@ -19417,47 +20038,47 @@ msgstr "kunde inte hitta ledig replikeringsplats, öka max_replication_slots" #: 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" +msgid "recovered replication state of node %d to %X/%X" +msgstr "återställde replikeringstillstånd för nod %d 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: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 "replikeringskälla med OID %d är redan aktiv för PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "replikeringskälla med ID %d är redan 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 "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Öka max_replication_slots och försök igen." -#: replication/logical/origin.c:1085 +#: 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: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 "ingen replikeringskälla är konfigurerad" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "replikeringskällnamn \"%s\" är reserverat" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Källnamn som startar med \"pg_\" är reserverade." @@ -19489,418 +20110,503 @@ msgstr "destinationsrelation \"%s.%s\" för logisk replikering använder systemk msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "destinationsrelation \"%s.%s\" för logisk replikering finns inte" -#: replication/logical/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, 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:4180 -#: replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, 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:4184 -#: replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, 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:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, 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:637 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "initialt slot-snapshot är för stort" -#: replication/logical/snapbuild.c:691 +#: replication/logical/snapbuild.c:700 #, 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:1370 replication/logical/snapbuild.c:1477 -#: replication/logical/snapbuild.c:2008 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 +#: replication/logical/snapbuild.c:2015 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisk avkodning hittade konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1372 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "Det finns inga körande transaktioner." -#: replication/logical/snapbuild.c:1428 +#: replication/logical/snapbuild.c:1437 #, 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:1430 replication/logical/snapbuild.c:1454 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, 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:1452 +#: replication/logical/snapbuild.c:1461 #, 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:1479 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "Det finns inte längre några gamla transaktioner." -#: replication/logical/snapbuild.c:1876 +#: replication/logical/snapbuild.c:1883 #, 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:1882 +#: replication/logical/snapbuild.c:1889 #, 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:1953 +#: replication/logical/snapbuild.c:1960 #, 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:2010 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logisk avkodning kommer starta med sparat snapshot." -#: replication/logical/snapbuild.c:2082 +#: replication/logical/snapbuild.c:2089 #, c-format msgid "could not parse file name \"%s\"" msgstr "kunde inte parsa filnamn \"%s\"" -#: 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 "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" är klar" -#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 +#: 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 "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om så att two_phase kan slås på" + +#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 #, 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:734 +#: replication/logical/tablesync.c:738 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabell \"%s.%s\" hittades inte hos publicerare" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:795 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "kunde inte hämta kolumlista för tabell \"%s.%s\" från publicerare: %s" + +#: replication/logical/tablesync.c:974 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "kunde inte hämta tabells WHERE-klausul för tabell \"%s.%s\" från publicerare: %s" + +#: replication/logical/tablesync.c:1111 #, 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:1059 +#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "användaren \"%s\" kan inte replikera in i en relation med radsäkerhet påslagen: \"%s\"" + +#: replication/logical/tablesync.c:1338 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "tabellkopiering kunde inte starta transaktion på publiceraren: %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1380 #, c-format msgid "replication origin \"%s\" already exists" msgstr "replikeringsurspring \"%s\" finns redan" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1393 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "tabellkopiering kunde inte slutföra transaktion på publiceraren: %s" -#: replication/logical/worker.c:518 -#, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" -msgstr "processar fjärrdata för replikeringsmålrelation \"%s.%s\" kolumn \"%s\"" - -#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#: replication/logical/worker.c:671 replication/logical/worker.c:786 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" -#: replication/logical/worker.c:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" msgstr "kunde inte läsa från strömmande transaktionens ändringsfil \"%s\": läste bara %zu av %zu byte" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2251 +#: replication/logical/worker.c:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "ogiltig logisk replikeringsmeddelandetyp \"??? (%d)\"" + +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "dataströmmen från publiceraren har avslutats" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "avslutar logisk replikeringsarbetare på grund av timeout" -#: replication/logical/worker.c:2550 +#: replication/logical/worker.c:3059 #, 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:2564 +#: replication/logical/worker.c:3070 #, 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:2586 +#: replication/logical/worker.c:3096 #, c-format 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:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" msgstr "kunde inte läsa från strömmande transaktions subxact-fil \"%s\": läste bara %zu av %zu byte" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, 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:3170 +#: replication/logical/worker.c:3679 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" har startat" -#: replication/logical/worker.c:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "prenumeration har ingen replikeringsslot angiven" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "prenumeration \"%s\" har avaktiverats på grund av ett fel" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "logisk replikering börjar hoppa över transaktion vid LSN %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "logisk replikering har slutfört överhoppande av transaktionen vid LSN %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "överhoppnings-LSN för logiska prenumerationen \"%s\" har nollställts" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "Fjärrtransaktionens slut-WAL-position (LSN) %X/%X matchade inte överhoppnings-LSN %X/%X." + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\"" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u blev klar vid %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" i transaktion %u blev klart vid %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmålrelation \"%s.%s\" kolumn \"%s\" i transaktion %u blev klart vid %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "ogiltig proto_version" -#: replication/pgoutput/pgoutput.c:201 +#: 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:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "ogiltig publication_names-syntax" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, 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:295 +#: replication/pgoutput/pgoutput.c:432 #, 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:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "saknar parameter publication_names" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, 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:319 +#: replication/pgoutput/pgoutput.c:456 #, 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/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "efterfrågade proto_version=%d stöder inte tvåfas-commit, kräver %d eller högre" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "tvåfas-commit begärdes men det stöds inte av utdata-plugin:en" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "replikeringsslotnamn \"%s\" är för kort" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "replikeringsslotnamn \"%s\" är för långt" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "replikeringsslotnamn \"%s\" innehåller ogiltiga tecken" -#: replication/slot.c:204 +#: replication/slot.c:229 #, 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:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "replikeringsslot \"%s\" finns redan" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "alla replikeringsslots används" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Frigör en eller öka max_replication_slots." -#: replication/slot.c:402 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "replikeringsslot \"%s\" är aktiv för PID %d" -#: replication/slot.c:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, 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:1065 +#: replication/slot.c:1133 #, 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:1250 +#: replication/slot.c:1145 +#, 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:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "avslutar process %d för att frigöra replikeringsslot \"%s\"" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, 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:1747 +#: replication/slot.c:1827 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "replikeringsslotfil \"%s\" har en icke stödd version %u" -#: replication/slot.c:1754 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "replikeringsslotfil \"%s\" har felaktig längd %u" -#: replication/slot.c:1790 +#: replication/slot.c:1870 #, 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:1824 +#: replication/slot.c:1904 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "logisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Ändra wal_level till logical eller högre." -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "fysisk replikeringsslot \"%s\" finns men wal_level < replica" -#: replication/slot.c:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Ändra wal_level till replica eller högre." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" msgstr "för många aktiva replikeringsslottar innan nerstängning" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "ogiltig mål-LSN för WAL" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "replikeringsslot \"%s\" kan inte avanceras" -#: replication/slotfuncs.c:666 +#: 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:773 +#: 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:775 +#: 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:782 +#: 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:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "kunde inte kopiera replikeringsslot \"%s\"" -#: replication/slotfuncs.c:861 +#: 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:867 +#: 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:869 +#: 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." @@ -19940,415 +20646,425 @@ msgstr "synchronous_standby_names-parser misslyckades" 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:161 +#: 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:289 +#: 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:336 +#: 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:337 +#: 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:348 +#: 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:402 +#: 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:406 +#: 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:435 +#: 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:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "replikering avslutad av primär server" -#: replication/walreceiver.c:473 +#: 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:562 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "avslutar wal-mottagare på grund av timeout" -#: replication/walreceiver.c:600 +#: 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:616 replication/walreceiver.c:1036 +#: 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:735 +#: 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:927 +#: 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "kan inte använda %s med logisk replikeringsslot" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, 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:529 +#: replication/walsender.c:642 #, 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:580 -#, 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:609 +#: replication/walsender.c:719 #, 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:678 +#: replication/walsender.c:785 #, 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:681 +#: replication/walsender.c:788 #, 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:832 #, 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:1015 +#, 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:975 +#: replication/walsender.c:1100 #, 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:985 +#: replication/walsender.c:1110 #, 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:991 +#: replication/walsender.c:1116 #, 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:997 +#: replication/walsender.c:1122 #, 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:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s får inte anropas i en undertransaktion" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "kan inte läsa från logisk replikeringsslot \"%s\"" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, 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:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "stänger ner walsender-process efter befordring" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, 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:1587 +#: replication/walsender.c:1739 #, 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:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "tog emot replikeringskommando: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 -#: tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 -#: tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, 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:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "oväntat EOF från standby-anslutning" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ogiltigt standby-meddelandetyp \"%c\"" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "oväntad meddelandetyp \"%c\"" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "avslutar walsender-process på grund av replikerings-timeout" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, 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:951 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "relationen \"%s\" kan inte ha regler" + +#: 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 triggrar 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 triggrar 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:435 +#: 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:444 +#: 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:453 +#: 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:462 +#: 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 triggrar" -#: rewrite/rewriteDefine.c:464 +#: 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:469 +#: 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:475 +#: 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:481 +#: 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:487 +#: 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:493 +#: 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:520 +#: 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:525 +#: 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:529 +#: 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:543 +#: rewrite/rewriteDefine.c:544 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "regel (rule) för icke-vy \"%s\" får inte ha namnet \"%s\"" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, 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:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-lista har för många element" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, 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:734 +#: rewrite/rewriteDefine.c:735 #, 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:740 +#: rewrite/rewriteDefine.c:741 #, 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:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-målpost har namn \"%s\"." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, 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:753 +#: rewrite/rewriteDefine.c:754 #, 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:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, 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:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, 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:775 +#: rewrite/rewriteDefine.c:776 #, 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:777 +#: rewrite/rewriteDefine.c:778 #, 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:794 +#: rewrite/rewriteDefine.c:795 #, 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:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-lista har för få element" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: 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:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "byta namn på en ON SELECT-regel tillåts inte" @@ -20393,158 +21109,158 @@ msgstr "kolumn \"%s\" kan bara uppdateras till DEFAULT" msgid "multiple assignments to same column \"%s\"" msgstr "flera tilldelningar till samma kolumn \"%s\"" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, 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:2224 +#: rewrite/rewriteHandler.c:2228 #, 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:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "Skräpkolumner i vy är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 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:2552 +#: rewrite/rewriteHandler.c:2556 msgid "View columns that refer to system columns are not updatable." msgstr "Vykolumner som refererar till systemkolumner är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2555 +#: rewrite/rewriteHandler.c:2559 msgid "View columns that return whole-row references are not updatable." msgstr "Vykolumner som returnerar hel-rad-referenser är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Vyer som innehåller DISTINCT är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Vyer som innehåller GROUP BY är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "Vyer som innehåller HAVING är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 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:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "Vyer som innehåller WITH är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 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:2643 +#: rewrite/rewriteHandler.c:2647 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Vyer som returnerar aggregatfunktioner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2646 +#: rewrite/rewriteHandler.c:2650 msgid "Views that return window functions are not automatically updatable." msgstr "Vyer som returnerar fönsterfunktioner uppdateras inte automatiskt." -#: rewrite/rewriteHandler.c:2649 +#: rewrite/rewriteHandler.c:2653 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:2656 rewrite/rewriteHandler.c:2660 -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2672 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:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Vyer som innehåller TABLESAMPLE är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 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:3172 +#: rewrite/rewriteHandler.c:3176 #, 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:3180 +#: rewrite/rewriteHandler.c:3184 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kan inte uppdatera kolumn \"%s\" i view \"%s\"" -#: rewrite/rewriteHandler.c:3665 +#: rewrite/rewriteHandler.c:3675 #, 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:3676 +#: rewrite/rewriteHandler.c:3686 #, 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:3690 +#: rewrite/rewriteHandler.c:3700 #, 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:3694 +#: rewrite/rewriteHandler.c:3704 #, 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:3699 +#: rewrite/rewriteHandler.c:3709 #, 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:3929 rewrite/rewriteHandler.c:3937 -#: rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 +#: rewrite/rewriteHandler.c:3992 #, 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:4050 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "kan inte utföra INSERT RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "kan inte utföra UPDATE RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "kan inte utföra DELETE RETURNING på relation \"%s\"" -#: rewrite/rewriteHandler.c:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, 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:4141 +#: rewrite/rewriteHandler.c:4188 #, 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" @@ -20569,101 +21285,109 @@ msgstr "NEW-variabler i ON UPDATE-regler kan inte referera till kolumner som är 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 rekursiva referensen till WITH-fråga \"%s\" vara på toppnivå eller i dess högra SELECT" -#: scan.l:458 +#: 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 +msgid "trailing junk after parameter" +msgstr "skräptecken kommer efter parameter" + +#: 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'." @@ -20694,57 +21418,57 @@ msgstr "okänd Snowball-parameter: \"%s\"" msgid "missing Language parameter" msgstr "saknar parameter \"Language\"" -#: statistics/extended_stats.c:178 +#: 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:1371 utils/adt/jsonfuncs.c:1952 +#: 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:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, 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:843 +#: storage/buffer/bufmgr.c:851 #, 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:930 +#: storage/buffer/bufmgr.c:938 #, 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:932 +#: storage/buffer/bufmgr.c:940 #, 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:1031 +#: storage/buffer/bufmgr.c:1039 #, 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:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "kunde inte skriva block %u av %s" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Multipla fel --- skrivfelet kan vara permanent." -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "skriver block %u i relation %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "snapshot för gammal" @@ -20759,149 +21483,174 @@ 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:323 +#: 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: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 "kunde inte bestämma storlek på temporär fil \"%s\" från BufFile \"%s\": %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "kunde inte radera delad filmängd \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "kunde inte radera filmängd \"%s\": %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "kunde inte trunkera fil \"%s\": %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 "kunde inte flush:a smutsig data: %m" -#: storage/file/fd.c:545 +#: 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:597 +#: 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:836 +#: 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:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit misslyckades: %m" -#: storage/file/fd.c:1027 +#: 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:1028 +#: 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:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 -#: storage/file/fd.c:2677 +#: 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:1453 +#: 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:1584 +#: 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:1591 +#: 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:1784 +#: 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:1818 +#: 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:1859 +#: 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:1947 +#: 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:2127 +#: 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:2392 storage/file/fd.c:2451 +#: 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:2496 +#: 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:2653 +#: 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:3183 +#: 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/fd.c:3312 +#: storage/file/fd.c:3387 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "synkroniserar datakatalog (syncfs), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" + +#: 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/sharedfileset.c:144 +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "synkroniserar datakatalog (pre-fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" + +#: storage/file/fd.c:3651 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "synkroniserar datakatalog (fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "nollställer ologgade relationer (init), förbrukad tid %ld.%02d s, aktuell sökväg: %s" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "nollställer ologgade relationer (cleanup), förbrukad tid %ld.%02d s, aktuell sökväg: %s" + +#: 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:351 +#: 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:415 +#: 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:592 +#: storage/ipc/dsm.c:600 #, c-format msgid "too many dynamic shared memory segments" msgstr "för många dynamiska delade minnessegment" @@ -20956,41 +21705,46 @@ msgstr "kunde inte skapa delat minnessegment \"%s\": %m" msgid "could not close shared memory segment \"%s\": %m" msgstr "kunde inte stänga delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "kunde inte duplicera handle för \"%s\": %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3846 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "databasen \"%s\" används av förberedda transationer" -#: storage/ipc/procarray.c:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3878 storage/ipc/signalfuncs.c:226 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "måste vara superuser för stoppa en superusers process" -#: storage/ipc/procarray.c:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3885 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 "väntare fortfarande på att backend:en med PID %lu skall acceptera ProcSignalBarrier" + +#: 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:719 #, 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:962 -#: storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 -#: storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 -#: storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 -#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 +#: storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -21021,76 +21775,76 @@ msgstr "otillräckligt delat minne för datastruktur \"%s\" (efterfrågade %zu b msgid "requested shared memory size overflows size_t" msgstr "efterfrågad delat minnesstorlek överskrider size_t" -#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 +#: storage/ipc/signalfuncs.c:72 #, c-format -msgid "PID %d is not a PostgreSQL server process" -msgstr "PID %d är inte en PostgreSQL serverprocess" +msgid "PID %d is not a PostgreSQL backend process" +msgstr "PID %d är inte en PostgreSQL backend-process" -#: storage/ipc/signalfuncs.c:99 storage/lmgr/proc.c:1460 -#: utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 +#: 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:119 +#: storage/ipc/signalfuncs.c:124 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "måste vara superuser för att avbryta en superusers fråga" -#: 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 "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:165 +#: 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:183 +#: 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:214 +#: storage/ipc/signalfuncs.c:219 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" kan inte vara negativ" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:271 #, c-format msgid "must be superuser to rotate log files with 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:268 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 "Du kanske kan använda %s istället som är en del av core." -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: 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:306 +#: 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:315 +#: 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:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "avbryter sats på grund av konflikt med återställning" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Användartransaktion orsakade deadlock för buffer vid återställning." @@ -21163,123 +21917,123 @@ msgstr "deadlock upptäckt" msgid "See server log for query details." msgstr "Se server-logg för frågedetaljer." -#: storage/lmgr/lmgr.c:831 +#: 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:834 +#: 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:837 +#: 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:840 +#: 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:843 +#: 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:846 +#: 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:849 +#: 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:852 +#: 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:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "relation %u i databasen %u" -#: storage/lmgr/lmgr.c:1113 +#: 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:1119 +#: 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:1124 +#: 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:1131 +#: 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:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "transaktion %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "vituell transaktion %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: 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:1156 +#: 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:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "användarlås [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: 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:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "okänd låsetikettyp %d" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "kan inte ta låsläge %s på databasobjekt när återställning pågår" -#: storage/lmgr/lock.c:792 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Bara RowExclusiveLock eller lägre kan tas på databasobjekt under återställning." -#: storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 -#: storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, 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:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, 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" @@ -21299,82 +22053,82 @@ 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:1694 +#: 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:1695 +#: 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:1746 +#: 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:1825 utils/time/snapmgr.c:569 +#: 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:1826 utils/time/snapmgr.c:576 +#: 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:2484 storage/lmgr/predicate.c:2499 -#: storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, 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:4120 storage/lmgr/predicate.c:4156 -#: storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 -#: storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 -#: storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 -#: storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 -#, 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:4122 storage/lmgr/predicate.c:4158 #: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 #: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 #: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 #: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, 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:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 +#, c-format msgid "The transaction might succeed if retried." msgstr "Transaktionen kan lyckas om den körs igen." -#: 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 "antalet efterfrågade standby-anslutningar överskrider max_wal_senders (nu %d)" -#: storage/lmgr/proc.c:1557 +#: storage/lmgr/proc.c:1531 #, 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:1572 +#: storage/lmgr/proc.c:1546 #, 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:1581 +#: storage/lmgr/proc.c:1555 #, 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:1588 +#: storage/lmgr/proc.c:1562 #, 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:1605 +#: storage/lmgr/proc.c:1579 #, 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" @@ -21384,85 +22138,80 @@ msgstr "process %d misslyckades att ta %s på %s efter %ld.%03d ms" 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: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 "korrupta sidpekare: lägre = %u, övre = %u, special = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "korrupt radpekare: %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 "trasiga postlängder: totalt %u, tillgänglig plats %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 "korrupt radpekare: offset = %u, storlek = %u" -#: storage/smgr/md.c:438 +#: storage/smgr/md.c:473 #, 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:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "kunde inte utöka fil \"%s\": %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "Kontrollera ledigt diskutrymme." - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, 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:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, 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:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, 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:1289 +#: storage/smgr/md.c:1332 #, 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:1303 +#: storage/smgr/md.c:1346 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "kunde inte öppna fil \"%s\" (målblock %u): %m" @@ -21477,8 +22226,8 @@ msgstr "kan inte anropa funktionen \"%s\" via fastpath-interface" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "fastpath funktionsanrop: \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 -#: tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "varaktighet %s ms" @@ -21508,348 +22257,348 @@ msgstr "ogiltig argumentstorlek %d i funktionsaropsmeddelande" msgid "incorrect binary data format in function argument %d" msgstr "inkorrekt binärt dataformat i funktionsargument %d" -#: tcop/postgres.c:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "ogiltig frontend-meddelandetyp %d" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "sats: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "varaktighet: %s ms sats: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, 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:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "varaktighet: %s ms parse %s: %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "förberedd sats utan namn existerar inte" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "bind-meddelande har %d parameterformat men %d parametrar" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, 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:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "inkorrekt binärdataformat i bind-parameter %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "varaktighet: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "portal \"%s\" existerar inte" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "kör hämtning från" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "kör" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "varaktighet: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "parametrar: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "abortskäl: återställningskonflikt" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, 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:2475 +#: tcop/postgres.c:2490 #, 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:2478 +#: tcop/postgres.c:2493 #, 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:2481 +#: tcop/postgres.c:2496 #, 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:2487 +#: tcop/postgres.c:2502 #, 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:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portal \"%s\" parameter $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portal \"%s\" parameter $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "ej namngiven portalparameter $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "ej namngiven portalparameter $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, 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 +#: tcop/postgres.c:2904 #, 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:2891 +#: tcop/postgres.c:2905 #, 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:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, 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:2902 +#: tcop/postgres.c:2916 #, 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 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "flyttalsavbrott" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "avbryter autentisering på grund av timeout" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "avslutar autovacuum-process på grund av ett administratörskommando" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "avslutar logisk replikeringsarbetare på grund av ett administratörskommando" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "avslutar anslutning på grund av konflikt med återställning" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "avslutar anslutning på grund av ett administratörskommando" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "anslutning till klient har brutits" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "avbryter sats på grund av lås-timeout" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "avbryter sats på grund av sats-timeout" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "avbryter autovacuum-uppgift" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "avbryter sats på användares begäran" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "terminerar anslutning på grund av idle-in-transaction-timeout" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "stänger anslutning på grund av idle-session-timeout" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "maximalt stackdjup överskridet" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, 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:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" får ej överskrida %ldkB." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, 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:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ogiltigt kommandoradsargument för serverprocess: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ogiltigt kommandoradsargument: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ingen databas eller användarnamn angivet" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ogiltig subtyp %d för CLOSE-meddelande" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ogiltig subtyp %d för DESCRIBE-meddelande" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "fastpath-funktionsanrop stöds inte i en replikeringsanslutning" -#: tcop/postgres.c:4768 +#: tcop/postgres.c:4853 #, 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:4945 +#: tcop/postgres.c:5030 #, 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:638 +#: 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:941 tcop/pquery.c:1703 +#: 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:942 tcop/pquery.c:1704 +#: 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:414 +#: 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:432 +#: 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:451 +#: 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:469 +#: 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" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, c-format msgid "cannot execute %s within a background process" msgstr "kan inte köra %s i en bakgrundsprocess" -#: tcop/utility.c:945 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "måste vara superuser för att göra CHECKPOINT" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "måste vara superuser eller ha rättigheter från pg_checkpoint att göra CHECKPOINT" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -21997,13 +22746,13 @@ 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:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "ogiltigt reguljärt uttryck: %s" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ogiltigt affix-alias \"%s\"" @@ -22033,17 +22782,17 @@ msgstr "antalet alias överskriver angivet antal %d" 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: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 "strängen är för lång för tsvector (%d byte, max %d byte)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "rad %d i konfigureringsfil \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "konvertering från wchar_t till serverkodning misslyckades: %m" @@ -22075,145 +22824,195 @@ 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:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "okänd rubrikparameter: \"%s\"" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords skall vara mindre än MaxWords" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "MinWords skall vara positiv" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord skall vara >= 0" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments skall vara >= 0" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "kunde inte radera permanent statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1226 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "ogiltig statistiktyp \"%s\"" + +#: utils/activity/pgstat.c:1306 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1421 +#, 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:1429 +#, 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:1478 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "kunde inte öppna statistikfil \"%s\": %m" + +#: utils/activity/pgstat.c:1634 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "korrupt statistikfil \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "funktionsanrop till borttagen funktion" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "återställer existerande statistik för typ %s, db=%u, oid=%u" + +#: 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: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 "Identifierare måste vara mindre än %d tecken." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "okänt nyckelord: \"%s\"" -#: utils/adt/acl.c:250 +#: 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:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "namn saknas" -#: utils/adt/acl.c:256 +#: 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:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "saknar \"=\"-tecken" -#: utils/adt/acl.c:315 +#: 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:337 +#: 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:345 +#: 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:531 +#: 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:535 +#: 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:539 +#: 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:563 +#: 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:1198 +#: 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:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "det finns beroende privilegier" -#: utils/adt/acl.c:1260 +#: 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:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert stöds inte länge" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove stöds inte längre" -#: 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 "okänd privilegietyp: \"%s\"" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: 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:4898 +#: 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_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/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "kan inte bestämma indatatyp" @@ -22224,16 +23023,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/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:4231 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 -#: utils/adt/varlena.c:3422 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "heltal utanför giltigt intervall" @@ -22333,7 +23132,7 @@ msgid "Specified array dimensions do not match array contents." msgstr "Angivna array-dimensioner matchar inte array-innehållet." #: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: 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 @@ -22356,18 +23155,18 @@ msgstr "Oväntat array-element." msgid "Unmatched \"%c\" character." msgstr "Icke matchat tecken \"%c\"." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2490 #, 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:679 utils/adt/multirangetypes.c:286 +#: 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:1301 utils/adt/arrayfuncs.c:3369 -#: utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:5883 #, c-format msgid "invalid number of dimensions: %d" msgstr "felaktigt antal dimensioner: %d" @@ -22382,7 +23181,7 @@ msgstr "ogiltiga array-flaggor" 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:1378 utils/adt/multirangetypes.c:444 +#: 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" @@ -22393,7 +23192,7 @@ msgstr "ingen binär indatafunktion finns för typen %s" msgid "improper binary format in array element %d" msgstr "felaktigt binärt format i array-element %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 +#: 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" @@ -22406,11 +23205,11 @@ msgstr "slice av fixlängd-array är inte implementerat" #: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 #: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 -#: utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 -#: utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5869 +#: utils/adt/arrayfuncs.c:5895 utils/adt/arrayfuncs.c:5906 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "fel antal array-indexeringar" @@ -22452,79 +23251,79 @@ msgid "null array element not allowed in this context" msgstr "null-element i arrayer stöds inte i detta kontext" #: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 -#: utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:4191 #, c-format msgid "cannot compare arrays of different element types" msgstr "kan inte jämföra arrayer med olika elementtyper" -#: utils/adt/arrayfuncs.c:3978 utils/adt/multirangetypes.c:2742 -#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:3978 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:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4106 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:5282 +#: utils/adt/arrayfuncs.c:5283 #, c-format msgid "data type %s is not an array type" msgstr "datatypen %s är inte en arraytyp" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5338 #, c-format msgid "cannot accumulate null arrays" msgstr "kan inte ackumulera null-array:er" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5366 #, c-format msgid "cannot accumulate empty arrays" msgstr "kan inte ackumulera tomma array:er" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5393 utils/adt/arrayfuncs.c:5399 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "kan inte ackumulera arrayer med olika dimensioner" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5767 utils/adt/arrayfuncs.c:5807 #, 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:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5870 utils/adt/arrayfuncs.c:5896 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensionsarray måste vara endimensionell." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5875 utils/adt/arrayfuncs.c:5901 #, c-format msgid "dimension values cannot be null" msgstr "dimensionsvärden kan inte vara null" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5907 #, 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:6184 +#: utils/adt/arrayfuncs.c:6185 #, 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:6461 +#: utils/adt/arrayfuncs.c:6462 #, c-format msgid "thresholds must be one-dimensional array" msgstr "gränsvärden måste vara en endimensionell array" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6467 #, c-format msgid "thresholds array must not contain NULLs" msgstr "gränsvärdesarray får inte innehålla NULLL-värden" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6700 #, 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" @@ -22565,211 +23364,215 @@ 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: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:4050 +#: 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:4660 -#: utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 -#: utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 -#: utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, 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:179 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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 -#: 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 #, c-format msgid "division by zero" msgstr "division med noll" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "\"char\" utanför sitt intervall" -#: 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 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "kunde inte beräkna %s-hash: %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:74 +#: 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:80 +#: 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: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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "datum utanför giltigt intervall \"%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 "datum utanför giltigt intervall" -#: 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 "datumfältvärde utanför giltigt område: %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 "datum utanför giltigt område: %d-%02d-%02d" -#: 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: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 utanför filtigt område för timestamp" -#: utils/adt/date.c:1127 utils/adt/date.c:1210 utils/adt/date.c:1226 -#, c-format -msgid "date units \"%s\" not supported" -msgstr "datumenhet \"%s\" stöds inte" - -#: utils/adt/date.c:1235 -#, c-format -msgid "date units \"%s\" not recognized" -msgstr "datumenheten \"%s\" är okänd" - -#: 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:5417 utils/adt/timestamp.c:5431 -#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 -#: utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 -#: utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 -#: utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 -#: utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: 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 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "enheten \"%s\" stöds inte för typen %s" + +#: 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 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "enheten \"%s\" känns inte igen för typen %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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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: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:4476 #, c-format msgid "time out of range" msgstr "time utanför giltigt intervall" -#: 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 "time-värde utanför giltigt område: %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:2435 -#: 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 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:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "känner inte igen \"time\"-enhet \"%s\"" - -#: utils/adt/date.c:2347 +#: 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:2986 utils/adt/date.c:3006 -#, 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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 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:3129 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: 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:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, 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:3784 +#: utils/adt/datetime.c:4032 #, 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:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervall-värde utanför giltigt område: \"%s\"" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "tidszonförskjutning itanför sitt intervall: \"%s\"" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, 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\"." @@ -22779,20 +23582,20 @@ msgstr "Detta tidszonsnamn finns i konfigurationsfilen för tidszonsförkortning msgid "invalid Datum pointer" msgstr "ogiltigt Datum-pekare" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "ogiltig storlek: \"%s\"" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ogiltig storleksenhet: \"%s\"." -#: utils/adt/dbsize.c:824 +#: utils/adt/dbsize.c:815 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Giltiga enheter är \"bytes\", \"kB\", \"MB\", \"GB\" och \"TB\"." +msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "Giltiga enheter är \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\" och \"PB\"." #: utils/adt/domains.c:92 #, c-format @@ -22876,390 +23679,385 @@ msgstr "kunde inte bestämma den verkliga enum-typen" msgid "enum %s contains no values" msgstr "enum %s innehåller inga värden" -#: 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:477 +#: 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: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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "smallint utanför sitt intervall" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, c-format msgid "cannot take square root of a negative number" msgstr "kan inte ta kvadratroten av ett negativt tal" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 +#: 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:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3736 -#: utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, c-format msgid "cannot take logarithm of zero" msgstr "kan inte ta logartimen av noll" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 -#: utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, c-format msgid "cannot take logarithm of a negative number" msgstr "kan inte ta logaritmen av ett negativt tal" -#: 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 "indata är utanför giltigt intervall" -#: 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 är utanför giltigt intervall [-1,1]" -#: utils/adt/float.c:4030 utils/adt/numeric.c:1708 +#: 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:4035 utils/adt/numeric.c:1719 +#: 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:4041 utils/adt/numeric.c:1724 +#: 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:4075 utils/adt/numeric.c:1738 +#: 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:1192 #, 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:1200 #, 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:1216 #, 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:1243 #, c-format msgid "multiple decimal points" msgstr "multipla decimalpunkter" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, 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:1259 #, 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:1263 #, 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:1283 #, 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:1293 #, 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:1303 #, 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:1312 #, 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:1338 #, 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:1344 #, 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:1345 #, 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:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ogiltigt formatseparator för datetime: \"%s\"" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" är inte ett nummer" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "case-konvertering misslyckades: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 -#: utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, 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:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "ogiltig kombination av datumkonventioner" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, 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:2309 +#: utils/adt/formatting.c:2338 #, 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:2312 +#: utils/adt/formatting.c:2341 #, 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:2383 +#: utils/adt/formatting.c:2412 #, 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:2386 +#: utils/adt/formatting.c:2415 #, 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:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, 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:2399 utils/adt/formatting.c:2413 -#: utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ogiltigt värde \"%s\" för \"%s\"" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, 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:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "Värdet måste vara ett heltal." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, 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:2422 +#: utils/adt/formatting.c:2451 #, 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:2638 +#: utils/adt/formatting.c:2667 #, 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: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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "lokaliserat strängformatvärde är för långt" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "ej matchande formatteringsseparator \"%c\"" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "ej matchande formatteringstecken \"%s\"" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, 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:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ogiltig indatasträng för \"Y,YYY\"" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, 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:3778 +#: utils/adt/formatting.c:3809 #, 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:4323 +#: utils/adt/formatting.c:4370 #, 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:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptz utanför giltigt intervall" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetime-format har zon men inte tid" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, 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:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetz utanför giltigt intervall" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetime-format har inte datum och inte tid" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, 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:4576 +#: utils/adt/formatting.c:4623 #, 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:4687 +#: utils/adt/formatting.c:4734 #, 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:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" stöds inte för indata" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" stöds inte för indata" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "referens till föräldrakatalog (\"..\") tillåts inte" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "absolut sökväg tillåts inte" -#: utils/adt/genfile.c:94 +#: 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:119 utils/adt/oracle_compat.c:187 -#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 -#: utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "efterfrågad längd är för lång" -#: utils/adt/genfile.c:136 +#: 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:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "fillängd är för stor" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "måste vara superuser för att läsa filer med adminpack 1.0" @@ -23274,8 +24072,8 @@ msgstr "ogiltig radangivelse: A och B kan inte båda vara noll" msgid "invalid line specification: must be two distinct points" msgstr "ogiltig linjeangivelse: måste vara två enskilda punkter" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 -#: utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "för många punkter efterfrågade" @@ -23285,98 +24083,58 @@ msgstr "för många punkter efterfrågade" msgid "invalid number of points in external \"path\" value" msgstr "ogiltigt antal punkter i externt \"path\"-värde" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "funktionen \"dist_lb\" är inte implementerad" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "funktionen \"dist_bl\" är inte implementerad" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "funktionen \"close_sl\" är inte implementerad" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "funktionen \"close_lb\" är inte implementerad" - -#: utils/adt/geo_ops.c:3545 +#: 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:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "funktionen \"poly_distance\" är inte implementerad" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "funktionen \"path_center\" är inte implementerad" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, 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:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ogiltig radie i ett externt cirkelvärde" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, 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:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "måste efterfråga minst 2 punkter" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector har för många element" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "ogiltig int2vector-data" -#: 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 har för många element" - -#: utils/adt/int.c:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 -#: utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 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: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:4302 +#: 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:4364 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint utanför sitt intervall" -#: utils/adt/int8.c:1403 +#: utils/adt/int8.c:1361 #, c-format msgid "OID out of range" msgstr "OID utanför sitt intervall" @@ -23386,23 +24144,23 @@ msgstr "OID utanför sitt intervall" 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:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, 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." @@ -23417,18 +24175,18 @@ msgstr "argument %d kan inte vara null" 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:1135 utils/adt/jsonb.c:1309 #, 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:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "array-dimensionerna stämmer inte" @@ -23443,68 +24201,68 @@ msgstr "strängen är för lång för att representeras som en jsonb-sträng" 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:1192 #, 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:1780 #, c-format msgid "object keys must be strings" msgstr "objektnycklar måste vara strängar" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, 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:1944 #, 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:1945 #, 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:1946 #, 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:1947 #, 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:1948 #, 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:1949 #, 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:751 +#: utils/adt/jsonb_util.c:752 #, 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:792 +#: utils/adt/jsonb_util.c:793 #, 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:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, 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:1747 utils/adt/jsonb_util.c:1782 -#: utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, 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" @@ -23540,14 +24298,14 @@ 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:561 utils/adt/jsonfuncs.c:798 -#: utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 -#: utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "kan inte anropa %s på en skalär" #: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 -#: utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "kan inte anropa %s på en array" @@ -23567,177 +24325,182 @@ msgstr "kan inte hämta array-längd på skalär" msgid "cannot get array length of a non-array" msgstr "kan inte hämta array-längd på icke-array" -#: utils/adt/jsonfuncs.c:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "kan inte anropa %s på ett icke-objekt" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kan inte dekonstruera en array som ett objekt" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "kan inte dekonstruera en skalär" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "kan inte extrahera element från en skalär" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "kan inte extrahera element från ett objekt" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, c-format msgid "cannot call %s on a non-array" msgstr "kan inte anropa %s på icke-array" -#: utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2544 -#: utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "förväntade JSON-array" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Se värdetypen för nyckel \"%s\"" -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Se array-element %s för nyckel \"%s\"." -#: utils/adt/jsonfuncs.c:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Se array-element %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "malformed JSON array" msgstr "felaktig JSON-array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, 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:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, 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:3832 utils/adt/jsonfuncs.c:3912 #, 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:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "kan inte anropa %s på ett objekt" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "kan inte radera från en skalär" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, 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:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "kan inte sätta sökväg i skalär" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "JSON-värde får inte vara null" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, 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:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "kan inte radera sökväg i skalär" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "sökvägselement vid position %d är null" -#: utils/adt/jsonfuncs.c:4944 utils/adt/jsonfuncs.c:4975 -#: utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "kan inte ersätta befintlig nyckel" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, 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:5049 +#: utils/adt/jsonfuncs.c:4937 #, 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:5153 +#: utils/adt/jsonfuncs.c:5041 #, 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:5170 +#: utils/adt/jsonfuncs.c:5058 #, 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:5322 +#: utils/adt/jsonfuncs.c:5210 #, 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:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "flaggelement i arrayen är inte en sträng" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, 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:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "fel flagga i flagg-array: \"%s\"" @@ -23892,7 +24655,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:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, 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" @@ -23907,27 +24670,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:988 +#: utils/adt/like_support.c:1014 #, 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:1090 +#: utils/adt/like_support.c:1115 #, 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\"" @@ -23942,430 +24705,415 @@ 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/mcxtfuncs.c:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "måste vara superuser för att logga minneskontext" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d är inte en PostgreSQL serverprocess" -#: utils/adt/misc.c:244 +#: 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:266 +#: 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:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "oreserverad" -#: utils/adt/misc.c:488 +#: 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:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "reserverad (kan vara funktion eller typnamn)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "reserverad" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "kan vara en enkelt namn" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "kräver AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 -#: utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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:761 +#: 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:775 +#: 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:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Ingen giltig indentifierare innan \".\"." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Ingen giltig identifierare efter \".\"." -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "loggformat \"%s\" stöds inte" -#: utils/adt/misc.c:879 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "Loggformat som stöds är \"stderr\" och \"csvlog\"." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Loggformat som stöds är \"stderr\", \"csvlog\" och \"jsonlog\"." -#: 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 +#: 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:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Saknar vänster krullparentes" -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Förväntade range-start" -#: utils/adt/multirangetypes.c:262 +#: 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:975 +#: 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:1001 +#: 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/multirangetypes.c:1349 -#, c-format -msgid "range_agg must be called with a range" -msgstr "range_agg måste anropas med en range" - -#: utils/adt/multirangetypes.c:1420 -#, c-format -msgid "range_intersect_agg must be called with a multirange" -msgstr "range_intersect_agg måste anropas med en multirange" - -#: utils/adt/network.c:111 +#: 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:967 +#: 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:973 +#: 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:982 +#: 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:1195 utils/adt/numeric.c:1209 +#: 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:1200 +#: utils/adt/numeric.c:1262 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "Skalan %d för NUMERIC måste vara mellan 0 och precisionen %d" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "Skalan %d för NUMERIC måste vara mellan %d och %d" -#: utils/adt/numeric.c:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ogiltig typmodifierare för NUMERIC" -#: utils/adt/numeric.c:1576 +#: 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:1580 +#: 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:1587 +#: 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:1591 +#: 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:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "stegstorlek får inte vara NaN" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "stegstorlek får inte vara oändligt" -#: utils/adt/numeric.c:3489 +#: 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:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 -#: utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 -#: utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "overflow på värde i formatet numeric" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 -#: utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "kan inte konvertera NaN till %s" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 -#: utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "kan inte konvertera oändlighet till %s" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn är utanför giltigt intervall" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "overflow i numeric-fält" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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/numeric.c:7554 +#: utils/adt/numeric.c:7594 #, c-format 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/numutils.c:154 -#, 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" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "ogiltig oidvector-data" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "efterfrågat tecken är för stort" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 -#, 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:1063 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "efterfrågat tecken är inte giltigt för kodning: %d" +msgid "character number must be positive" +msgstr "teckennummmer måste vara positivt" -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, 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:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "efterfrågat tecken är för stort för kodning: %u" + +#: utils/adt/oracle_compat.c:1082 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "efterfrågat tecken är inte giltigt för kodning: %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 "percentil-värde %g är inte mellan 0 och 1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:1231 #, c-format msgid "Apply system library package updates." msgstr "Applicera paketuppdateringar för systembibliotek." -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, 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:1468 utils/adt/pg_locale.c:2013 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU stöds inte av detta bygge" + +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "kunde inte skapa locale \"%s\": %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, 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:1547 +#: utils/adt/pg_locale.c:1608 #, 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:1556 +#: utils/adt/pg_locale.c:1617 #, 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:1568 +#: utils/adt/pg_locale.c:1652 #, 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" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "jämförelse (collation) \"%s\" har ingen version men en version har lagrats" -#: 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 "kunde inte öppna jämförelse för lokal \"%s\": %s" - -#: utils/adt/pg_locale.c:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU stöds inte av detta bygge" - -#: utils/adt/pg_locale.c:1609 -#, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "jämförelse (collation) \"%s\" har ingen version men en version angavs" - -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1658 #, 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:1618 +#: utils/adt/pg_locale.c:1660 #, 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:1621 +#: utils/adt/pg_locale.c:1663 #, 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:1692 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "kunde inte skapa locale \"%s\"" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, 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:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "kodning \"%s\" stöds inte av ICU" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, 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:1793 utils/adt/pg_locale.c:1802 -#: utils/adt/pg_locale.c:1831 utils/adt/pg_locale.c:1841 +#: utils/adt/pg_locale.c:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s misslyckades: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "ogiltigt multibyte-tecken för lokalen" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, 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." @@ -24385,11 +25133,26 @@ msgstr "kan inte subtrahera Nan från pg_lsn" 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:503 +#: utils/adt/pgstatfuncs.c:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "ogiltigt kommandonamn: \"%s\"" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "okänt återställningsmål \"%s\"" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "Målet måste vara \"archiver\", \"bgwriter\", \"recovery_prefetch\" eller \"wal\"." + +#: utils/adt/pgstatfuncs.c:2198 +#, c-format +msgid "invalid subscription OID %u" +msgstr "ogiltigt prenumerations-OID: %u" + #: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 #, c-format msgid "cannot display a value of type %s" @@ -24420,11 +25183,6 @@ msgstr "resultatet av range-skillnad skulle inte vara angränsande" msgid "result of range union would not be contiguous" msgstr "resultatet av range-union skulle inte vara angränsande" -#: utils/adt/rangetypes.c:1214 -#, c-format -msgid "range_intersect_agg must be called with a range" -msgstr "range_intersect_agg måste anropas med en range" - #: utils/adt/rangetypes.c:1689 #, c-format msgid "range lower bound must be less than or equal to range upper bound" @@ -24475,33 +25233,48 @@ msgstr "För många komman." 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:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, 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: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 "Om du menade att använda regexp_replace() med en startstartparameter så cast:a fjärde argumentet uttryckligen till integer." + +#: 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:11860 utils/misc/guc.c:11894 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "ogiltigt värde för parameter \"%s\": %d" + +#: 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" @@ -24517,7 +25290,7 @@ msgid "more than one operator named %s" msgstr "mer än en operator med namn %s" #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9800 utils/adt/ruleutils.c:9969 +#: utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "för många argument" @@ -24529,7 +25302,7 @@ msgstr "Ange två argumenttyper för operatorn." #: 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:3698 utils/adt/varlena.c:3703 +#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "ogiltig namnsyntax" @@ -24554,78 +25327,78 @@ msgstr "förväntade ett typnamn" msgid "improper type name" msgstr "olämpligt typnamn" -#: 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 "insert eller update på tabell \"%s\" bryter mot främmande nyckel-villkoret \"%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 tillåter inte att man blandar null och icke-null-värden." -#: utils/adt/ri_triggers.c:1965 +#: 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:1971 +#: 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:1977 +#: 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:2000 +#: 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 trigger \"%s\" på tabell \"%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 "Ta bort denna trigger för referensiell integritet och dess kollegor, gör sen ALTER TABLE ADD CONSTRAINT." -#: 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 "referentiell integritetsfråga på \"%s\" från villkor \"%s\" på \"%s\" gav oväntat resultat" -#: 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 "Detta beror troligen på att en regel har skrivit om frågan." -#: utils/adt/ri_triggers.c:2520 +#: 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: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 "Nyckeln (%s)=(%s) refereras fortfarande till från tabell \"%s\"." -#: 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 "Nyckel (%s)=(%s) finns inte i tabellen \"%s\"." -#: utils/adt/ri_triggers.c:2537 +#: 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: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 "update eller delete på tabell \"%s\" bryter mot främmande nyckel-villkoret \"%s\" för tabell \"%s\"" -#: utils/adt/ri_triggers.c:2551 +#: 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\"." @@ -24688,135 +25461,116 @@ msgstr "kan inte jämföra olika kolumntyper %s och %s vid postkolumn %d" 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:5164 +#: utils/adt/ruleutils.c:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "indata är en fråga, inte ett uttryck" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "uttryck innehåller variabler till mer än en relation" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "uttryck innehåller variabler" + +#: utils/adt/ruleutils.c:5267 #, 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:109 +#: 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:115 +#: 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:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12435 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12884 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp utanför giltigt intervall: \"%s\"" -#: utils/adt/timestamp.c:374 +#: 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:498 +#: 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:511 +#: 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: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 utanför giltigt intervall: %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 kan inte vara NaN" -#: 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 utanför giltigt intervall: \"%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 "ogitligt modifierare för typen INTERVAL" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)-precision kan inte vara negativ" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)-precision reducerad till maximalt tillåtna, %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format 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:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "kan inte subtrahera oändliga tider (timestamp)" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 #, c-format msgid "origin out of range" msgstr "origin utanför giltigt intervall" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 #, c-format 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:3849 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 #, c-format msgid "stride must be greater than zero" msgstr "\"stride\" måste vara större än noll" -#: 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-enhet \"%s\" stöds inte" - -#: 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-enhet \"%s\" känns inte igen" - -#: 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 with time zone, enhet \"%s\" stöds inte" - -#: utils/adt/timestamp.c:4188 utils/adt/timestamp.c:4569 -#: utils/adt/timestamp.c:5148 +#: utils/adt/timestamp.c:4399 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "timestamp with time zone, enhet \"%s\" känns inte igen" - -#: utils/adt/timestamp.c:4346 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "intervallenhet \"%s\" stöds inte då månader typiskt har veckor på bråkform" - -#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "intervallenhet \"%s\" stöds inte" - -#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5338 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "intervallenhet \"%s\" känns inte igen" +msgid "Months usually have fractional weeks." +msgstr "Månader har vanligtvis veckor som decimaltal." #: utils/adt/trigfuncs.c:42 #, c-format @@ -24924,58 +25678,62 @@ 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 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "lexem-array:en får inte innehålla tomma strängar" + +#: 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:2429 +#: utils/adt/tsvector_op.c:2434 #, 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:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-kolumnen \"%s\" existerar inte" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "kolumnen \"%s\" är inte av typen tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "konfigurationskolumnen \"%s\" existerar inte" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "kolumn \"%s\" har inte regconfig-typ" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "konfigurationskolumn \"%s\" får inte vara null" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, 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:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "kolumnen \"%s\" är inte av typen character" @@ -24995,7 +25753,7 @@ 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" @@ -25040,9 +25798,9 @@ msgstr "ogiltig längd på extern bitsträng" 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: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:3340 -#: utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "negativ substräng-läng tillåts inte" @@ -25067,7 +25825,7 @@ msgstr "kan inte XOR:a bitsträngar av olika storlek" msgid "bit index %d out of valid range (0..%d)" msgstr "bitindex %d utanför giltigt intervall (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "nya biten måste vara 0 eller 1" @@ -25082,127 +25840,127 @@ 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:1516 +#: 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:1209 utils/adt/varlena.c:1956 +#: 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:1615 utils/adt/varlena.c:1628 +#: 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:1643 +#: 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:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "jämförelse misslyckades: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "generering av sorteringsnyckel misslyckades: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "index %d utanför giltigt intervall, 0..%d" -#: utils/adt/varlena.c:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "index %lld utanför giltigt intervall, 0..%lld" -#: utils/adt/varlena.c:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "fältpositionen får inte vara noll" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "icketerminerad typangivelse för format()" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "För ett ensamt \"%%\" använd \"%%%%\"." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "okänd typspecifierare \"%.*s\" för format()" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "för få argument till format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "numret är utanför giltigt intervall" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, 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:6069 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "argumentposition för bredd måste avslutas med \"$\"" -#: utils/adt/varlena.c:6114 +#: utils/adt/varlena.c:6088 #, 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:6240 +#: utils/adt/varlena.c:6214 #, 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:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "ogiltigt normaliseringsform: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "ogiltig Unicode-kodpunkt: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format 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:117 #, c-format -msgid "transaction ID %s is in the future" -msgstr "transaktions-ID %s är från framtiden" +msgid "transaction ID %llu is in the future" +msgstr "transaktions-ID %llu är från framtiden" -#: utils/adt/xid8funcs.c:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "ogiltig extern pg_snapshot-data" @@ -25217,151 +25975,151 @@ 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:243 utils/mb/mbutils.c:627 +#: 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 +#: utils/adt/xml.c:961 #, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "libxml2 har inkompatibel char-typ: 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)=%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 "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:2768 +#: utils/adt/xml.c:2767 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "portalen \"%s\" returnerar inga tupler" -#: utils/adt/xml.c:4020 +#: utils/adt/xml.c:4019 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ogiltig array till XML-namnrymdmappning" -#: utils/adt/xml.c:4021 +#: utils/adt/xml.c:4020 #, 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:4045 +#: utils/adt/xml.c:4044 #, c-format msgid "empty XPath expression" msgstr "tomt XPath-uttryck" -#: utils/adt/xml.c:4097 +#: utils/adt/xml.c:4096 #, c-format msgid "neither namespace name nor URI may be null" msgstr "varken namnrymdnamn eller URI får vara null" -#: utils/adt/xml.c:4104 +#: utils/adt/xml.c:4103 #, 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:4455 +#: utils/adt/xml.c:4454 #, c-format msgid "DEFAULT namespace is not supported" msgstr "namnrymden DEFAULT stöds inte" -#: utils/adt/xml.c:4484 +#: utils/adt/xml.c:4483 #, 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:4515 +#: utils/adt/xml.c:4514 #, 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:4659 +#: utils/adt/xml.c:4658 #, c-format msgid "more than one value returned by column XPath expression" msgstr "mer än ett värde returnerades från kolumns XPath-uttryck" @@ -25397,37 +26155,47 @@ msgstr "operatorklass \"%s\" för accessmetod %s saknar supportfunktion %d för msgid "cached plan must not change result type" msgstr "cache:ad plan får inte ändra resultattyp" -#: utils/cache/relcache.c:6325 +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "relfilenode-värde för heap är inte satt i binärt uppgraderingsläge" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "oväntad begäran av ny relfilenode i binärt uppgraderingsläge" + +#: utils/cache/relcache.c:6473 #, 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:6327 +#: utils/cache/relcache.c:6475 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Fortsätter ändå, trots att något är fel." -#: utils/cache/relcache.c:6649 +#: utils/cache/relcache.c:6797 #, 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:767 +#: 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:777 +#: 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:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "posttypen har inte registrerats" @@ -25442,101 +26210,101 @@ msgstr "TRAP: ExceptionalCondition: fel argument i PID %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:409 +#: 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:1948 +#: 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:1961 +#: 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: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 "[okänd]" -#: 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 "saknar feltext" -#: 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 " vid tecken %d" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "DETALJ: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "TIPS: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "FRÅGA: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "KONTEXT: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "PLATS: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "PLATS: %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 "SATS: " -#: 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 "LOGG" -#: 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 "NOTIS" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "VARNING" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "FEL" -#: utils/error/elog.c:3516 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "FATALT" -#: 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 "kunde inte hitta funktionen \"%s\" i filen \"%s\"" @@ -25566,51 +26334,61 @@ 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 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "inkompatibelt bibliotek \"%s\": ABI matchar inte" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "Servern har ABI \"%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\"" @@ -25635,377 +26413,377 @@ msgstr "SQL-anropbara funktioner kräver en medföljande PG_FUNCTION_INFO_V1(fun msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "okänd API-version %d rapporterad av infofunktion \"%s\"" -#: utils/fmgr/fmgr.c:1999 +#: 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:2066 +#: 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:420 +#: utils/fmgr/funcapi.c:498 #, 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:565 +#: utils/fmgr/funcapi.c:643 #, 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:648 +#: utils/fmgr/funcapi.c:726 #, 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:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "antalet alias matchar inte antalet kolumner" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "inget kolumnalias angivet" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, 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:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "databaskatalogen \"%s\" existerar inte" -#: utils/init/miscinit.c:319 +#: 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:327 +#: 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:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "datakatalogen \"%s\" har fel ägare" -#: utils/init/miscinit.c:345 +#: 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:363 +#: 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:365 +#: 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 #, 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:718 +#: 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:748 +#: 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:766 +#: 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:826 +#: 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:909 +#: utils/init/miscinit.c:924 #, c-format msgid "invalid role OID: %u" msgstr "ogiltigt roll-OID: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:978 #, c-format msgid "database system is shut down" msgstr "databassystemet är nedstängt" -#: utils/init/miscinit.c:1050 +#: 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:1064 +#: 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:1071 +#: 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:1080 +#: utils/init/miscinit.c:1095 #, c-format msgid "lock file \"%s\" is empty" msgstr "låsfilen \"%s\" är tom" -#: utils/init/miscinit.c:1081 +#: 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:1125 +#: 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:1129 +#: 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:1131 +#: 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:1134 +#: 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:1136 +#: 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:1187 +#: 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:1189 +#: 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:1226 utils/init/miscinit.c:1240 -#: utils/init/miscinit.c:1251 +#: 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:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10401 +#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10828 #, c-format msgid "could not read from file \"%s\": %m" msgstr "kunde inte läsa från fil \"%s\": %m" -#: utils/init/miscinit.c:1492 +#: 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:1517 +#: 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:1556 utils/init/miscinit.c:1572 +#: 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:1558 +#: utils/init/miscinit.c:1573 #, c-format msgid "File \"%s\" is missing." msgstr "Filen \"%s\" saknas." -#: utils/init/miscinit.c:1574 +#: 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:1576 +#: 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:1584 +#: 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/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "replikeringsanslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "anslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr "databas=%s" -#: utils/init/postinit.c:263 +#: utils/init/postinit.c:267 #, c-format msgid " application_name=%s" msgstr " applikationsnamn=%s" -#: utils/init/postinit.c:268 +#: utils/init/postinit.c:272 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr "SSL påslagen (protokoll=%s, krypto=%s, bitar=%d)" -#: utils/init/postinit.c:280 +#: utils/init/postinit.c:284 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" msgstr " GSS (autentiserad=%s, krypterad=%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 "nej" -#: 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 (autentiserad=%s, krypterad=%s)" -#: utils/init/postinit.c:323 +#: 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:325 +#: 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:345 +#: 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:358 +#: 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:359 +#: 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:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "för många uppkopplingar till databasen \"%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 "databaslokalen är inkompatibel med operativsystemet" -#: 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 "Databasen initierades med LC_COLLATE \"%s\" vilket inte känns igen av setlocale()." -#: 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 "Återskapa databasen med en annan lokal eller installera den saknade lokalen." -#: 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 "Databasen initierades med LC_CTYPE \"%s\", vilket inte känns igen av setlocale()." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "inga roller är definierade i detta databassystem" +msgid "database \"%s\" has a collation version mismatch" +msgstr "databasen \"%s\" har en jämförelse (collation) vars version som inte matchar" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Du borde direkt köra CREATE USER \"%s\" SUPERUSER;." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Databasen skapades med jämförelseversion %s men operativsystemet tillhandahåller version %s." + +#: utils/init/postinit.c:471 +#, c-format +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 i denna databas som använder standardjämförelse (collation) och kör ALTER DATABASE %s REFRESH COLLATION VERSION eller bygg PostgreSQL med rätt bibliotekversion." -#: utils/init/postinit.c:798 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "nya replikeringsanslutningar tillåts inte under databasnedstängning" +msgid "no roles are defined in this database system" +msgstr "inga roller är definierade i detta databassystem" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "måste vara superuser för att ansluta när databasen håller på att stängas ner" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Du borde direkt köra CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "måste vara superuser för att ansluta i binärt uppgraderingsläger" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "resterande anslutningsslottar är reserverade för superuser-anslutningar utan replikering" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "måste vara superuser eller replikeringsroll för att starta \"walsender\"" -#: utils/init/postinit.c:904 -#, c-format -msgid "database %u does not exist" -msgstr "databasen %u existerar inte" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, 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:1001 +#: utils/init/postinit.c:1016 +#, c-format +msgid "database %u does not exist" +msgstr "databasen %u existerar inte" + +#: utils/init/postinit.c:1025 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "kan inte ansluta till ogiltig databas \"%s\"" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Databasens underbibliotek \"%s\" saknas." -#: utils/init/postinit.c:1026 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "kunde inte komma åt katalog \"%s\": %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -26074,1906 +26852,1967 @@ msgstr "ogiltigt byte-sekvens för kodning \"%s\": %s" 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:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Ej grupperad" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Filplatser" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Uppkopplingar och Autentisering / Uppkopplingsinställningar" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Uppkopplingar och Autentisering / Autentisering" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Uppkopplingar och Autentisering / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Resursanvändning / Minne" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Resursanvändning / Disk" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Resursanvändning / Kärnresurser" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resursanvändning / Kostnadsbaserad Vacuum-fördröjning" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Resursanvändning / Bakgrundskrivare" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resursanvändning / Asynkront beteende" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Inställningar" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Checkpoint:er" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Arkivering" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead Log / Återställning" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Återställning från arkiv" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Återställningsmål" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Replilering / Skickande servrar" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Replikering / Primärserver" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Replikering / Standby-servrar" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Replikering / Prenumeranter" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Frågeoptimering / Planeringsmetodinställningar" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Frågeoptimering / Plannerarens kostnadskonstanter" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Frågeoptimering / Genetisk frågeoptimerare" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Frågeoptimering / Andra planeringsinställningar" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Rapportering och loggning / Logga var?" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Rapportering och loggning / Logga när?" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Rapportering och loggning / Logga vad?" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Rapportering och loggning / Processtitel" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Statistik / Övervakning" -#: utils/misc/guc.c:778 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "Statistik / Insamlare av fråge- och index-statistik" +#: utils/misc/guc.c:836 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "Statistik / Ihopsamlad fråge- och index-statistik" -#: utils/misc/guc.c:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standard för klientanslutning / Satsbeteende" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standard för klientanslutning / Lokal och formattering" -#: utils/misc/guc.c:786 +#: 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:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Standard för klientanslutning / Övriga standardvärden" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Låshantering" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Version och plattformskompabilitet / Tidigare PostrgreSQL-versioner" -#: utils/misc/guc.c:794 +#: 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:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Felhantering" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Förinställningsflaggor" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Ändrade flaggor" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Utvecklarflaggor" -#: utils/misc/guc.c:860 +#: 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:897 +#: 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:959 +#: 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:969 +#: 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:979 +#: 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:989 +#: 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:999 +#: 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:1009 +#: 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:1019 +#: 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:1028 +#: 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:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Aktiverar planerarens användning av materialisering." -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Aktiverar planerarens användning av memoization." -#: utils/misc/guc.c:1058 +#: 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:1068 +#: 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:1078 +#: 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:1088 +#: 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:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Aktiverar join per partition." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Aktiverar aggregering och gruppering per partition." -#: utils/misc/guc.c:1118 +#: 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:1128 +#: 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:1138 +#: 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:1139 +#: 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:1150 +#: 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:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Aktiverar genetisk frågeoptimering." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 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:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Visar om den aktuella användaren är en superuser." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Aktiverar annonsering av servern via Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Samlar in tid för transaktions-commit." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Tillåter SSL-anslutningar." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "Använd ssl_passphrase_command även vid server-reload." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "Styr hurvida ssl_passphrase_command anropas vid omladdning av server." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Ge prioritet till serverns ordning av kryptometoder." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Tvingar synkronisering av uppdateringar till disk." -#: utils/misc/guc.c:1228 -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." +#: utils/misc/guc.c:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures 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:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Fortsätter processande efter checksummefel." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Fortsätter processande efter trasiga sidhuvuden." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "Fortsätter återställande efter fel på grund av ogiltiga sidor." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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:1287 +#: utils/misc/guc.c:1346 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:1288 +#: utils/misc/guc.c:1347 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:1301 +#: utils/misc/guc.c:1360 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:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Komprimerar skrivning av hela sidor som skrivs i WAL-fil." - -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 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:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "Återanvänder WAL-filer genom att byta namn på dem." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Logga varje checkpoint." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Logga varje lyckad anslutning." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Loggar slut på session, inklusive längden." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Loggar alla replikeringskommanon." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 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:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Avbryt sessionen vid fel." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Återinitiera servern efter en backend-krash." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." msgstr "Ta bort temporära filer efter en backend-krash." -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Loggar tiden för varje avslutad SQL-sats." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "Loggar alla frågors parse-träd." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Logga alla frågors omskrivet parse-träd." -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Logga alla frågors körningsplan." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Indentera parse och planeringsträdutskrifter" -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "Skriver parserns prestandastatistik till serverloggen." -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "Skriver planerarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "Skrivere exekverarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "Skriver ackumulerad prestandastatistik till serverloggen." -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 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:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Samla information om körda kommanon." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "Samla in statistik om databasaktivitet." -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." msgstr "Samla in timingstatistik om databasens I/O-aktivitet." -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." msgstr "Samla in timingstatistik om I/O-aktivitet för WAL." -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 msgid "Updates the process title to show the active SQL command." msgstr "Uppdaterar processtitel till att visa aktivt SQL-kommando." -#: utils/misc/guc.c:1555 +#: utils/misc/guc.c:1604 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:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Starta autovacuum-barnprocess." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Skapar debug-output för LISTEN och NOTIFY." -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Visar information om låsanvändning." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Visar information om användares låsanvändning." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Visar information om lättviktig låsanvändning." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 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:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Loggar långa väntetider på lås." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "Loggar väntande på återställningskonflikter i standby" -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "Loggar hostnamnet i anslutningsloggen." -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tolkar \"uttryck=NULL\" som \"uttryck IS NULL\"." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Aktiverar användarnamn per databas." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 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:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "Ställer in nuvarande transaktions read-only-status." -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "Ställer in standard deferrable-status för nya transaktioner." -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1762 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:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Aktiverar radsäkerhet." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 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:1732 +#: utils/misc/guc.c:1781 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Kontrollera funktionskroppen vid CREATE FUNCTION och CREATE PROCEDURE." -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Aktiverar inmatning av NULL-element i arrayer." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 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:1768 +#: utils/misc/guc.c:1817 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:1777 +#: utils/misc/guc.c:1826 msgid "Truncate existing log files of same name during log rotation." msgstr "Trunkera existerande loggfiler med samma namn under loggrotering." -#: utils/misc/guc.c:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "Skicka ut information om resursanvändning vid sortering." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "Generera debug-output för synkroniserad skanning." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "Slår på begränsad sortering med heap-sort." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Skicka ut WAL-relaterad debug-data." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Visa hurvida datetime är heltalsbaserad" -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 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:1863 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Varna om backåtstreck-escape i vanliga stränglitteraler." -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Gör att '...'-stängar tolkar bakåtstreck bokstavligt." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Slå på synkroniserad sekvensiell skanning." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 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:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "Tillåt anslutningar och frågor under återställning." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 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:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Visar hurvida hot standby är aktiv för närvarande." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Tillåter strukturförändringar av systemtabeller." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Stänger av läsning från systemindex." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 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:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "Tillåter tabellutrymmen direkt inuti pg_tblspc, för testning" -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 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:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "När SQL-fragment genereras så citera alla identifierare." -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 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:2001 +#: utils/misc/guc.c:2050 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:2011 +#: utils/misc/guc.c:2060 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:2021 +#: utils/misc/guc.c:2070 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:2022 +#: utils/misc/guc.c:2071 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:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Tillåt JIT-kompilering." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "Registrera JIT-kompilerade funktioner hos debuggern." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 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:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Tillåt JIT-kompilering av uttryck." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "Registrera JIT-kompilerade funktioner med perf-profilerare." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Tillåt JIT-kompilering av tupeluppdelning." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 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:2119 +#: utils/misc/guc.c:2168 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:2137 -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:2186 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "Sätter tiden vi väntar innan vi tvingar ett byte till nästa WAL-fil." -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Väntar N sekunder vid anslutningsstart efter authentisering." +#: utils/misc/guc.c:2197 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Sätter tiden att vänta efter authentiserng vid uppstart av anslutningen." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "Detta tillåter att man ansluter en debugger till processen." -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Sätter standardstatistikmålet." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 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:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 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:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 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:2204 +#: utils/misc/guc.c:2254 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:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: antal individer i populationen." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "Noll väljer ett lämpligt standardvärde." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: antal iterationer för algoritmen." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 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:2247 +#: utils/misc/guc.c:2297 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:2258 +#: utils/misc/guc.c:2308 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:2269 +#: utils/misc/guc.c:2319 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:2280 +#: utils/misc/guc.c:2330 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:2291 +#: utils/misc/guc.c:2341 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:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Sätter maximalt antal samtidiga anslutningar." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "Sätter antalet anslutningsslottar som reserverats för superusers." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Mängd dynamiskt delat minne som reserveras vid uppstart" -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 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:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "Visa storlek på serverns huvudsakliga delade minnesarea (avrundat upp till närmaste MB)." + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Visa antal stora sidor som krävs för den huvudsakliga delade minnesarean." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 betyder att värdet inte kunde bestämmas." + +#: utils/misc/guc.c:2421 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:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "Sätter TCP-porten som servern lyssnar på." -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Sätter accessrättigheter för Unix-domainuttag (socket)." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Sätter filrättigheter för loggfiler." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Visar rättigheter för datakatalog" -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 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:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 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:2428 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Detta inkluderar operationer som VACUUM och CREATE INDEX." -#: utils/misc/guc.c:2438 +#: utils/misc/guc.c:2510 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:2439 +#: utils/misc/guc.c:2511 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:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Sätter det maximala stackdjupet, i kilobyte." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 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:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 betyder ingen gräns." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 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:2487 +#: utils/misc/guc.c:2559 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:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-kostnad för sidor som smutsats ner vid vacuum." -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Vacuum-kostnad kvar innan pausande." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Vacuum-kostnad kvar innan pausande, för autovacuum." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 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:2540 +#: utils/misc/guc.c:2612 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:2551 +#: utils/misc/guc.c:2623 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:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "Används för att undvika utdata för systemtabeller." -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 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:2573 +#: utils/misc/guc.c:2645 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:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Värdet 0 stänger av timeout:en." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 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:2595 +#: utils/misc/guc.c:2667 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:2606 +#: utils/misc/guc.c:2678 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:2617 +#: utils/misc/guc.c:2689 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:2627 +#: utils/misc/guc.c:2699 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:2637 +#: utils/misc/guc.c:2709 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:2647 +#: utils/misc/guc.c:2719 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:2657 +#: utils/misc/guc.c:2729 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:2666 +#: utils/misc/guc.c:2738 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:2675 +#: utils/misc/guc.c:2747 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:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Sätter det maximala antalet lås per transaktion." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Sätter det maximala antalet predikatlås per transaktion." -#: utils/misc/guc.c:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 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:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 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:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 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:2746 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Väntar N sekunder efter anslutning innan autentisering." +#: utils/misc/guc.c:2818 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Sätter tiden att vänta före authentiserng vid uppstart av anslutningen.." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Bufferstorlek för read-ahead av WAL vid återställning." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Maximal längd att läsa i förväg av WAL för att prefetch:a refererade datablock." + +#: utils/misc/guc.c:2841 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:2768 +#: utils/misc/guc.c:2852 msgid "Sets the minimum size to shrink the WAL to." msgstr "Sätter maximal storlek som WAL kan krympas till." -#: utils/misc/guc.c:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Sätter WAL-storlek som triggar en checkpoint." -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Sätter maximal tid mellan två automatiska WAL-checkpoint:er." -#: utils/misc/guc.c:2803 -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:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "Sätter maximal tid innan en varning ges för att stor WAL-volymn gör att checkpoint triggas för ofta." -#: utils/misc/guc.c:2805 -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 "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:2889 +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 WAL-segmentfiler händer oftare än denna tid. Noll stänger av varningen." -#: utils/misc/guc.c:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 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:2828 +#: utils/misc/guc.c:2913 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:2839 +#: utils/misc/guc.c:2924 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:2850 +#: utils/misc/guc.c:2935 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Mängden WAL utskrivna av WAL-skrivaren som triggar en flush." -#: utils/misc/guc.c:2861 +#: utils/misc/guc.c:2946 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:2872 +#: utils/misc/guc.c:2957 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:2883 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Sätter maximalt antal samtidigt definierade replikeringsslottar." -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2978 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:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 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:2917 +#: utils/misc/guc.c:3002 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:2929 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "Sätter minsta antal samtida öppna transaktioner innan vi utför en commit_delay." +#: utils/misc/guc.c:3014 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "Sätter minsta antal samtida öppna transaktioner som krävs innan vi utför en commit_delay." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 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:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 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:2956 +#: utils/misc/guc.c:3041 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:2966 +#: utils/misc/guc.c:3051 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:2968 +#: utils/misc/guc.c:3053 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:2978 +#: utils/misc/guc.c:3063 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:2980 +#: utils/misc/guc.c:3065 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:2990 -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:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "Sätter maximal längd i byte på data som loggas för bind-parametrar vid loggning av satser." -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 för att skriva ut hela värden." -#: utils/misc/guc.c:3001 -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:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "Sätter maximal längs i byte på data som loggas för bind-parametrar vid loggning av satser i samband med fel." -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "Bakgrundsskrivarens sleep-tid mellan körningar." -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 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:3046 +#: utils/misc/guc.c:3133 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:3064 +#: utils/misc/guc.c:3151 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:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Maximalt antal samtidiga arbetsprocesser." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "Maximalt antal arbetsprocesser för logisk replikering." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "Maximalt antal arbetare som synkroniserar tabeller per prenumeration." -#: utils/misc/guc.c:3127 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Automatisk loggfilsrotering kommer ske efter N minuter." +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Sätter tiden vi väntar innan vi tvingar rotering av loggfil." -#: utils/misc/guc.c:3138 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Automatisk loggfilsrotering kommer ske efter N kilobyte." +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Sätter maximalt storlek en loggfil kan bli innan vi tvingar rotering." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Visar maximalt antal funktionsargument." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Visar maximalt antal indexnycklar." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Visar den maximala identifierarlängden." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Visar storleken på ett diskblock." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "Visar antal sidor per diskfil." -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "Visar blockstorleken i the write-ahead-loggen." -#: utils/misc/guc.c:3215 +#: utils/misc/guc.c:3305 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:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Visar storleken på write-ahead-log-segment." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Tid att sova mellan körningar av autovacuum." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Minst antal tupel-uppdateringar eller raderingar innan vacuum." -#: utils/misc/guc.c:3259 +#: utils/misc/guc.c:3349 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:3268 +#: utils/misc/guc.c:3358 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:3278 +#: utils/misc/guc.c:3368 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:3293 +#: utils/misc/guc.c:3380 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:3303 +#: utils/misc/guc.c:3390 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:3313 +#: utils/misc/guc.c:3400 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:3323 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Sätter maximalt antal parallella processer per exekveringsnod." -#: utils/misc/guc.c:3334 +#: utils/misc/guc.c:3421 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:3345 +#: utils/misc/guc.c:3432 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:3356 +#: utils/misc/guc.c:3443 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:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "Värdet -1 stänger av denna funktion." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Tid mellan skickande av TCP-keepalive." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "Värdet 0 anger systemets standardvärde." -#: utils/misc/guc.c:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Tid mellan omsändning av TCP-keepalive." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 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:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximalt antal omsändningar av TCP-keepalive." -#: utils/misc/guc.c:3401 -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:3488 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "Atalet 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:3412 +#: utils/misc/guc.c:3499 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:3423 +#: utils/misc/guc.c:3510 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:3424 +#: utils/misc/guc.c:3511 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:3435 +#: utils/misc/guc.c:3522 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:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 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:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Visar serverns version som ett heltal." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 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:3470 +#: utils/misc/guc.c:3557 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:3480 +#: utils/misc/guc.c:3567 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:3491 +#: utils/misc/guc.c:3578 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:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "Användartimeout för TCP." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "Storleken på stora sidor skall hämtas." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." msgstr "Flush:a systemcache aggressivt för att förenkla debugging." -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 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:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "Tid mellan uppdatering av progress för startupoperationer som kör länge." + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "0 stänger av denna finess." + +#: utils/misc/guc.c:3666 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:3578 +#: utils/misc/guc.c:3677 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:3589 +#: utils/misc/guc.c:3688 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:3600 +#: utils/misc/guc.c:3699 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:3611 +#: utils/misc/guc.c:3710 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:3622 +#: utils/misc/guc.c:3721 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:3633 +#: utils/misc/guc.c:3732 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:3645 +#: utils/misc/guc.c:3744 msgid "Perform JIT compilation if query is more expensive." msgstr "Utför JIT-kompilering om frågan är dyrare." -#: utils/misc/guc.c:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 stänger av JIT-kompilering." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimera JIT-kompilerade funktioner om frågan är dyrare." -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 stänger av optimering." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "Utför JIT-\"inlining\" om frågan är dyrare." -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 stänger av \"inlining\"" -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 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:3690 +#: utils/misc/guc.c:3789 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Sätter planerarens uppskattning av genomsnittliga storleken på en rekursiv frågas arbetstabell." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektionstryck inom populationen." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: slumptalsfrö för val av slumpad sökväg." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 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:3723 +#: utils/misc/guc.c:3834 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:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "Sätter fröet för slumptalsgeneratorn." -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Städkostfördröjning i millisekunder." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Städkostfördröjning i millisekunder, för autovacuum." -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 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:3776 +#: utils/misc/guc.c:3887 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:3786 +#: utils/misc/guc.c:3897 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:3796 +#: utils/misc/guc.c:3907 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:3806 +#: utils/misc/guc.c:3917 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:3807 +#: utils/misc/guc.c:3918 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:3816 +#: utils/misc/guc.c:3927 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:3817 +#: utils/misc/guc.c:3928 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:3836 +#: utils/misc/guc.c:3947 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:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Detta används enbart om \"archive_library\" inte är satt." + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Sätter biblioteket som kommer anropas för att arkivera en WAL-fil." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "En tom sträng betyder att \"archive_command\" skall användas." + +#: utils/misc/guc.c:3967 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:3856 +#: utils/misc/guc.c:3977 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:3866 +#: utils/misc/guc.c:3987 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:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Anger tidslinjen att återställa till." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 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:3895 +#: utils/misc/guc.c:4016 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:3904 +#: utils/misc/guc.c:4025 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:3913 +#: utils/misc/guc.c:4034 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:3922 +#: utils/misc/guc.c:4043 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:3932 +#: utils/misc/guc.c:4053 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:3942 +#: utils/misc/guc.c:4063 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:3953 +#: utils/misc/guc.c:4074 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:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Ställer in klientens teckenkodning." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "Styr information prefixat till varje loggrad." -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "Om tom så används inget prefix." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Sätter tidszonen som används i loggmeddelanden." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "Sätter displayformat för datum och tidvärden." -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Styr också tolkning av tvetydig datumindata." -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "Ställer in standard tabellaccessmetod för nya tabeller." -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4138 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:4018 +#: utils/misc/guc.c:4139 msgid "An empty string selects the database's default tablespace." msgstr "En tom sträng väljer databasens standardtabellutrymme." -#: utils/misc/guc.c:4028 +#: utils/misc/guc.c:4149 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:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Sätter sökvägen till dynamiskt laddade moduler." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Ställer in platsen för Kerberos servernyckelfil." -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Sätter Bonjour-tjänstens namn." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Visar lokal för jämförelseordning." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "Visar lokal för teckenklassificering samt skiftlägeskonvertering." -#: utils/misc/guc.c:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Sätter språket som meddelanden visas i." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Sätter lokalen för att formattera monetära belopp." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Ställer in lokalen för att formattera nummer." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 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:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "Listar delade bibliotek som skall förladdas i varje backend." -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Listar delade bibliotek som skall förladdas i servern." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 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:4171 +#: utils/misc/guc.c:4292 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:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." msgstr "Visar serverns (databasens) teckenkodning." -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Visar serverversionen" -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Ställer in den aktiva rollen." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Sätter sessionens användarnamn." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Sätter serverloggens destination." -#: utils/misc/guc.c:4231 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", 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:4352 +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\", \"jsonlog\" och \"eventlog\", beroende på plattform." -#: utils/misc/guc.c:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "Sätter destinationskatalogen för loggfiler." -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 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:4253 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "Sätter filnamnsmallen för loggfiler." -#: utils/misc/guc.c:4264 +#: utils/misc/guc.c:4385 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:4275 +#: utils/misc/guc.c:4396 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:4286 +#: utils/misc/guc.c:4407 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:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Väljer en fil för tidszonsförkortningar." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Sätter ägande grupp för Unix-domainuttaget (socket)." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 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:4317 +#: utils/misc/guc.c:4438 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:4332 +#: utils/misc/guc.c:4453 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:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Ställer in serverns datakatalog." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "Sätter serverns huvudkonfigurationsfil." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "Sätter serverns \"hba\"-konfigurationsfil." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "Sätter serverns \"ident\"-konfigurationsfil." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "Skriver postmaster-PID till angiven fil." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Visar namnet på SSL-biblioteket." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Plats för serverns SSL-certifikatfil." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server private key file." msgstr "Plats för serverns privata SSL-nyckelfil." -#: utils/misc/guc.c:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Plats för SSL-certifikats auktoritetsfil." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." msgstr "Plats för SSL-certifikats återkallningsfil." -#: utils/misc/guc.c:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." msgstr "Plats av katalog för SSL-certifikats återkallningslistor." -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Skriver temporära statistikfiler till angiven katalog." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 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:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Ställer in standard textsökkonfiguration." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Ställer in listan med tillåtna SSL-krypton." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Ställer in kurvan att använda för ECDH." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Plats för SSL DH-parameterfil." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Kommando för att hämta lösenfraser för SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 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:4562 +#: utils/misc/guc.c:4672 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:4573 +#: utils/misc/guc.c:4683 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:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "JIT-leverantör som används." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Loggar backtrace vid fel i dessa funktioner." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Anger hurvida \"\\'\" tillåts i sträng-literaler." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Ställer in output-format för bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 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:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 -#: utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 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:4646 -msgid "Compute query identifiers." -msgstr "Beräkna identifierare för frågor." +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "Slår på intern uträkning av identifierare för frågor." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 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:4657 +#: utils/misc/guc.c:4767 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:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." msgstr "Ställer in standard komprimeringsmetod för komprimeringsbara värden." -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "Ställer in isolationsnivån för nya transaktioner." -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "Sätter den aktuella transaktionsisolationsnivån." -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Ställer in visningsformat för intervallvärden." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Ställer in pratighet för loggade meddelanden." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Ställer in meddelandenivåer som loggas." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 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:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Ställer in vilken sorts satser som loggas." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 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:4768 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Sätter sessionens beteende för triggrar och omskrivningsregler." -#: utils/misc/guc.c:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "Ställer in den nuvarande transaktionens synkroniseringsnivå." -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 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:4798 +#: utils/misc/guc.c:4908 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:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "Slår på loggning av återställningsrelaterad debug-information." -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Samlar in statistik på funktionsnivå över databasaktivitet." -#: utils/misc/guc.c:4834 +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Sätter konsistensinställning för accesser av statistikdata." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Komprimerar skrivning av hela sidor i WAL-filen med angiven metod." + +#: utils/misc/guc.c:4966 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:4844 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Väljer implementation som används för dynamiskt delat minne." -#: utils/misc/guc.c:4854 +#: utils/misc/guc.c:4986 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:4864 +#: utils/misc/guc.c:4996 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:4874 +#: utils/misc/guc.c:5006 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:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Använd stora sidor på Linux resp. Windows." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "Prefetch:a refererade block vid återställning." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Sök framåt i WAL för att hitta referenser till icke cache:ad data." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Tvingar användning av parallella frågefinesser." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 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:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Väljer algoritm för att kryptera lösenord." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 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:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 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:4951 +#: utils/misc/guc.c:5093 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:4963 +#: utils/misc/guc.c:5105 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:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "ogiltig konfigurationsparameter \"%s\"" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, 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:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" är ett reserverat prefix." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "okänd konfigurationsparameter \"%s\"" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, 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:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27982,12 +28821,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:5880 +#: utils/misc/guc.c:6148 #, 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:5906 +#: utils/misc/guc.c:6174 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27996,7 +28835,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:5954 +#: utils/misc/guc.c:6222 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -28005,7 +28844,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:5977 +#: utils/misc/guc.c:6245 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28014,181 +28853,187 @@ 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:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "Värde överskriver heltalsintervall." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "kan inte sätta parametrar under en parallell operation" -#: utils/misc/guc.c:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "parameter \"%s\" kan inte ändras" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7698 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "parameter \"%s\" kan inte ändras nu" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11357 +#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 +#: utils/misc/guc.c:11796 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "rättighet saknas för att sätta parameter \"%s\"" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7763 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "parameter \"%s\" kan inte ändras efter uppkopplingen startats" -#: utils/misc/guc.c:7487 +#: utils/misc/guc.c:7822 #, 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:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9574 +#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10002 #, c-format -msgid "must be superuser or a member 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\"" +msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" +msgstr "måste vara superuser eller ha rättigheter från pg_read_all_settings för att undersöka \"%s\"" -#: utils/misc/guc.c:8251 +#: utils/misc/guc.c:8606 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s tar bara ett argument" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8886 #, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "måste vara superuser för att köra kommandot ALTER SYSTEM" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "rättighet saknas för att utföra ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:8580 +#: utils/misc/guc.c:8953 #, 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:8625 +#: utils/misc/guc.c:8998 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "kunde inte parsa innehållet i fil \"%s\"" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9172 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT är inte implementerat ännu" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9259 #, c-format msgid "SET requires parameter name" msgstr "SET kräver ett parameternamn" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9392 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "försök att omdefiniera parameter \"%s\"" -#: utils/misc/guc.c:10804 +#: utils/misc/guc.c:9719 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "ogiltigt konfigurationsparameternamn \"%s\", tas bort" + +#: utils/misc/guc.c:9721 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" är nu ett reserverat prefix." + +#: utils/misc/guc.c:11236 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "vid sättande av parameter \"%s\" till \"%s\"" -#: utils/misc/guc.c:10969 +#: utils/misc/guc.c:11405 #, c-format msgid "parameter \"%s\" could not be set" msgstr "parameter \"%s\" kunde inte sättas" -#: utils/misc/guc.c:11061 +#: utils/misc/guc.c:11497 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "kunde inte tolka inställningen för parameter \"%s\"" -#: utils/misc/guc.c:11419 utils/misc/guc.c:11453 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "ogiltigt värde för parameter \"%s\": %d" - -#: utils/misc/guc.c:11487 +#: utils/misc/guc.c:11928 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ogiltigt värde för parameter \"%s\": %g" -#: utils/misc/guc.c:11774 +#: utils/misc/guc.c:12241 #, 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:11786 +#: utils/misc/guc.c:12253 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour stöds inte av detta bygge" -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12266 #, c-format msgid "SSL is not supported by this build" msgstr "SSL stöds inte av detta bygge" -#: utils/misc/guc.c:11811 +#: utils/misc/guc.c:12278 #, 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:11823 +#: utils/misc/guc.c:12290 #, 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:12053 +#: utils/misc/guc.c:12520 #, 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:12066 +#: utils/misc/guc.c:12533 #, 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:12080 +#: utils/misc/guc.c:12547 #, 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:12094 +#: utils/misc/guc.c:12559 #, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "client_connection_check_interval måste sättas till 0 på plattformar som saknar PULLRDHUP." +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å denna plattform." -#: utils/misc/guc.c:12222 +#: utils/misc/guc.c:12671 #, c-format msgid "invalid character" msgstr "ogiltigt tecken" -#: utils/misc/guc.c:12282 +#: utils/misc/guc.c:12731 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline är inte ett giltigt nummer." -#: utils/misc/guc.c:12322 +#: utils/misc/guc.c:12771 #, c-format msgid "multiple recovery targets specified" msgstr "multipla återställningsmål angivna" -#: utils/misc/guc.c:12323 +#: utils/misc/guc.c:12772 #, 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:12331 +#: utils/misc/guc.c:12780 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Det enda tillåtna värdet är \"immediate\"." @@ -28198,11 +29043,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 @@ -28224,7 +29064,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:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "kan inte lägga till fler timeoutskäl" @@ -28294,7 +29134,7 @@ 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:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Misslyckades vid skapande av minneskontext \"%s\"." @@ -28317,89 +29157,89 @@ msgstr "Misslyckades med förfrågan av storlek %zu i minneskontext \"%s\"." msgid "logging memory contexts of PID %d" msgstr "loggar minneskontext för PID %d" -#: utils/mmgr/portalmem.c:187 +#: 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:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "portal \"%s\" kan inte köras" -#: utils/mmgr/portalmem.c:479 +#: 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:487 +#: 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:738 +#: 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:1279 +#: 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" -#: 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 "kunde inte söka (seek) till block %ld i temporärfil" -#: 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 "kunde inte läsa block %ld i temporärfil: läste bara %zu av %zu byte" -#: 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 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, 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:486 +#: utils/sort/sharedtuplestore.c:487 #, 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:570 +#: utils/sort/sharedtuplestore.c:572 #, 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:577 +#: utils/sort/sharedtuplestore.c:579 #, 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:3218 +#: utils/sort/tuplesort.c:3322 #, 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:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "kunde inte skapa unikt index \"%s\"" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "Nyckeln %s är duplicerad." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Duplicerade nycklar existerar." diff --git a/third_party/spanner_pg/src/backend/po/uk.po b/third_party/spanner_pg/src/backend/po/uk.po index 7f889a88..f810e47a 100644 --- a/third_party/spanner_pg/src/backend/po/uk.po +++ b/third_party/spanner_pg/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: 2023-08-16 15:11+0000\n" -"PO-Revision-Date: 2023-08-17 15:51\n" +"POT-Creation-Date: 2023-12-17 22:26+0000\n" +"PO-Revision-Date: 2023-12-18 17:41\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,48 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/postgres.pot\n" -"X-Crowdin-File-ID: 754\n" +"X-Crowdin-File: /REL_15_STABLE/postgres.pot\n" +"X-Crowdin-File-ID: 896\n" + +#: ../common/compression.c:130 ../common/compression.c:139 +#: ../common/compression.c:148 +#, c-format +msgid "this build does not support compression with %s" +msgstr "ця збірка не підтримує стиснення з %s" + +#: ../common/compression.c:203 +msgid "found empty string where a compression option was expected" +msgstr "знайдено порожній рядок, де очікувався параметр стискання" + +#: ../common/compression.c:237 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "нерозпізнаний алгоритм стискання: \"%s\"" + +#: ../common/compression.c:276 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "параметр стискання \"%s\" потребує значення" + +#: ../common/compression.c:285 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "значення параметру стискання \"%s\" має бути цілим числом" + +#: ../common/compression.c:335 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "алгоритм стискання \"%s\" не приймає рівень стискання" + +#: ../common/compression.c:342 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "алгоритм стискання \"%s\" очікує рівень стискання між %d і %d (за замовчуванням %d)" + +#: ../common/compression.c:353 +#, 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 @@ -24,68 +64,66 @@ msgstr "" msgid "not recorded" msgstr "не записано" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1516 commands/extension.c:3482 utils/adt/genfile.c:128 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1525 commands/extension.c:3401 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 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1329 access/transam/xlog.c:3573 -#: access/transam/xlog.c:4817 access/transam/xlog.c:11629 -#: access/transam/xlog.c:11642 access/transam/xlog.c:12097 -#: access/transam/xlog.c:12177 access/transam/xlog.c:12214 -#: access/transam/xlog.c:12274 access/transam/xlogfuncs.c:703 -#: access/transam/xlogfuncs.c:722 commands/extension.c:3492 libpq/hba.c:534 -#: replication/basebackup.c:2026 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4951 -#: replication/logical/snapbuild.c:1851 replication/logical/snapbuild.c:1893 -#: replication/logical/snapbuild.c:1920 replication/slot.c:1727 -#: replication/slot.c:1768 replication/walsender.c:545 -#: storage/file/buffile.c:445 storage/file/copydir.c:195 -#: utils/adt/genfile.c:202 utils/adt/misc.c:888 utils/cache/relmapper.c:744 +#: access/transam/twophase.c:1349 access/transam/xlog.c:3209 +#: access/transam/xlog.c:4024 access/transam/xlogrecovery.c:1197 +#: access/transam/xlogrecovery.c:1289 access/transam/xlogrecovery.c:1326 +#: access/transam/xlogrecovery.c:1386 backup/basebackup.c:1844 +#: commands/extension.c:3411 libpq/hba.c:505 replication/logical/origin.c:729 +#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4958 +#: replication/logical/snapbuild.c:1870 replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1939 replication/slot.c:1807 +#: replication/slot.c:1848 replication/walsender.c:658 +#: 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/xlog.c:3578 access/transam/xlog.c:4822 -#: replication/basebackup.c:2030 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1856 -#: replication/logical/snapbuild.c:1898 replication/logical/snapbuild.c:1925 -#: replication/slot.c:1731 replication/slot.c:1772 replication/walsender.c:550 -#: utils/cache/relmapper.c:748 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3214 access/transam/xlog.c:4029 +#: backup/basebackup.c:1848 replication/logical/origin.c:734 +#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1875 +#: replication/logical/snapbuild.c:1917 replication/logical/snapbuild.c:1944 +#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 +#: utils/cache/relmapper.c:817 #, 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 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:271 ../common/controldata_utils.c:274 #: 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:1341 -#: access/transam/twophase.c:1746 access/transam/xlog.c:3442 -#: access/transam/xlog.c:3613 access/transam/xlog.c:3618 -#: access/transam/xlog.c:3946 access/transam/xlog.c:4787 -#: access/transam/xlog.c:5712 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:5009 -#: replication/logical/snapbuild.c:1760 replication/logical/snapbuild.c:1933 -#: replication/slot.c:1618 replication/slot.c:1779 replication/walsender.c:560 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:738 -#: storage/file/fd.c:3542 storage/file/fd.c:3645 utils/cache/relmapper.c:759 -#: utils/cache/relmapper.c:898 +#: access/transam/timeline.c:516 access/transam/twophase.c:1361 +#: access/transam/twophase.c:1773 access/transam/xlog.c:3056 +#: access/transam/xlog.c:3249 access/transam/xlog.c:3254 +#: access/transam/xlog.c:3392 access/transam/xlog.c:3994 +#: access/transam/xlog.c:4740 commands/copyfrom.c:1585 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:5016 +#: replication/logical/snapbuild.c:1779 replication/logical/snapbuild.c:1952 +#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 +#: 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:154 msgid "byte ordering mismatch" msgstr "неправильний порядок байтів" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:156 #, c-format msgid "possible byte ordering mismatch\n" "The byte ordering used to store the pg_control file might not match the one\n" @@ -94,82 +132,85 @@ msgid "possible byte ordering mismatch\n" msgstr "можлива помилка у послідовності байтів.\n" "Порядок байтів, що використовують для зберігання файлу pg_control, може не відповідати тому, який використовується цією програмою. У такому випадку результати нижче будуть неправильним, і інсталяція PostgreSQL буде несумісною з цим каталогом даних." -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 +#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 #: ../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:1285 -#: access/transam/xlog.c:3328 access/transam/xlog.c:3484 -#: access/transam/xlog.c:3528 access/transam/xlog.c:3726 -#: access/transam/xlog.c:3811 access/transam/xlog.c:3914 -#: access/transam/xlog.c:4807 access/transam/xlogutils.c:803 -#: postmaster/syslogger.c:1488 replication/basebackup.c:616 -#: replication/basebackup.c:1616 replication/logical/origin.c:719 -#: replication/logical/reorderbuffer.c:3604 -#: replication/logical/reorderbuffer.c:4155 -#: replication/logical/reorderbuffer.c:4931 -#: replication/logical/snapbuild.c:1715 replication/logical/snapbuild.c:1822 -#: replication/slot.c:1699 replication/walsender.c:518 -#: replication/walsender.c:2563 storage/file/copydir.c:161 -#: storage/file/fd.c:713 storage/file/fd.c:3306 storage/file/fd.c:3529 -#: storage/file/fd.c:3616 storage/smgr/md.c:506 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:842 utils/error/elog.c:1938 -#: utils/init/miscinit.c:1351 utils/init/miscinit.c:1485 -#: utils/init/miscinit.c:1562 utils/misc/guc.c:8618 utils/misc/guc.c:8650 +#: access/transam/timeline.c:348 access/transam/twophase.c:1305 +#: access/transam/xlog.c:2943 access/transam/xlog.c:3125 +#: access/transam/xlog.c:3164 access/transam/xlog.c:3359 +#: access/transam/xlog.c:4014 access/transam/xlogrecovery.c:4209 +#: access/transam/xlogrecovery.c:4312 access/transam/xlogutils.c:852 +#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 +#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3611 +#: replication/logical/reorderbuffer.c:4162 +#: replication/logical/reorderbuffer.c:4938 +#: replication/logical/snapbuild.c:1734 replication/logical/snapbuild.c:1841 +#: replication/slot.c:1779 replication/walsender.c:631 +#: replication/walsender.c:2722 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:541 utils/cache/relmapper.c:792 +#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 +#: utils/init/miscinit.c:1374 utils/init/miscinit.c:1508 +#: utils/init/miscinit.c:1585 utils/misc/guc.c:8991 utils/misc/guc.c:9040 #, 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:1719 access/transam/twophase.c:1728 -#: access/transam/xlog.c:11386 access/transam/xlog.c:11424 -#: access/transam/xlog.c:11837 access/transam/xlogfuncs.c:782 -#: postmaster/postmaster.c:5681 postmaster/syslogger.c:1499 -#: postmaster/syslogger.c:1512 utils/cache/relmapper.c:876 +#: ../common/controldata_utils.c:240 ../common/controldata_utils.c:243 +#: access/transam/twophase.c:1746 access/transam/twophase.c:1755 +#: access/transam/xlog.c:8676 access/transam/xlogfuncs.c:600 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: postmaster/postmaster.c:5633 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: 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/controldata_utils.c:257 ../common/controldata_utils.c:262 #: ../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:1740 -#: access/transam/xlog.c:3435 access/transam/xlog.c:3607 -#: access/transam/xlog.c:4780 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10910 replication/logical/snapbuild.c:1753 -#: replication/slot.c:1604 replication/slot.c:1709 storage/file/fd.c:730 -#: storage/file/fd.c:3637 storage/smgr/md.c:954 storage/smgr/md.c:995 -#: storage/sync/sync.c:454 utils/cache/relmapper.c:891 utils/misc/guc.c:8405 +#: access/transam/timeline.c:510 access/transam/twophase.c:1767 +#: access/transam/xlog.c:3049 access/transam/xlog.c:3243 +#: access/transam/xlog.c:3987 access/transam/xlog.c:7979 +#: access/transam/xlog.c:8022 backup/basebackup_server.c:207 +#: replication/logical/snapbuild.c:1772 replication/slot.c:1684 +#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 +#: storage/smgr/md.c:992 storage/smgr/md.c:1033 storage/sync/sync.c:453 +#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалося fsync файл \"%s\": %m" -#: ../common/cryptohash_openssl.c:104 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../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:1399 access/transam/xlog.c:6692 -#: lib/dshash.c:245 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:2547 -#: postmaster/postmaster.c:4205 postmaster/postmaster.c:5606 -#: postmaster/postmaster.c:5970 -#: replication/libpqwalreceiver/libpqwalreceiver.c:287 -#: replication/logical/logical.c:205 replication/walsender.c:592 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:888 storage/file/fd.c:1360 -#: storage/file/fd.c:1521 storage/file/fd.c:2329 storage/ipc/procarray.c:1460 -#: storage/ipc/procarray.c:2282 storage/ipc/procarray.c:2289 -#: storage/ipc/procarray.c:2794 storage/ipc/procarray.c:3471 -#: 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:1414 +#: access/transam/xlogrecovery.c:587 lib/dshash.c:253 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:2594 postmaster/postmaster.c:4180 +#: postmaster/postmaster.c:5558 postmaster/postmaster.c:5929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:300 +#: replication/logical/logical.c:205 replication/walsender.c:701 +#: 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:1451 +#: storage/ipc/procarray.c:2280 storage/ipc/procarray.c:2287 +#: storage/ipc/procarray.c:2792 storage/ipc/procarray.c:3423 +#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 +#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:453 +#: utils/adt/pg_locale.c:617 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:5049 -#: utils/misc/guc.c:5065 utils/misc/guc.c:5078 utils/misc/guc.c:8383 +#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 +#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 #: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:702 -#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 utils/mmgr/generation.c:234 +#: utils/mmgr/dsa.c:724 utils/mmgr/dsa.c:805 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 @@ -178,6 +219,22 @@ msgstr "не вдалося fsync файл \"%s\": %m" msgid "out of memory" msgstr "недостатньо пам'яті" +#: ../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 +msgid "destination buffer too small" +msgstr "буфер призначення занадто малий" + +#: ../common/cryptohash_openssl.c:348 ../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" @@ -198,28 +255,28 @@ msgstr "неможливо прочитати бінарний файл \"%s\"" msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" для виконання" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:424 +#: ../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:299 access/transam/xlog.c:11260 -#: replication/basebackup.c:1434 utils/adt/misc.c:369 +#: ../common/exec.c:299 access/transam/xlog.c:8325 backup/basebackup.c:1340 +#: utils/adt/misc.c:342 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати символічне послання \"%s\": %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1085 -#: storage/ipc/latch.c:1254 storage/ipc/latch.c:1483 storage/ipc/latch.c:1636 -#: storage/ipc/latch.c:1752 +#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 +#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 +#: storage/ipc/latch.c:1789 #, c-format 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 +#: ../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" @@ -231,141 +288,148 @@ msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n" #: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1297 -#: access/transam/xlog.c:11362 access/transam/xlog.c:11400 -#: access/transam/xlog.c:11617 access/transam/xlogarchive.c:110 -#: access/transam/xlogarchive.c:227 commands/copyfrom.c:1526 -#: commands/copyto.c:726 commands/extension.c:3471 commands/tablespace.c:806 -#: commands/tablespace.c:897 replication/basebackup.c:439 -#: replication/basebackup.c:622 replication/basebackup.c:698 -#: replication/logical/snapbuild.c:1632 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1871 storage/file/fd.c:1957 -#: storage/file/fd.c:3157 storage/file/fd.c:3361 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 utils/adt/misc.c:354 guc-file.l:1062 +#: ../common/file_utils.c:455 access/transam/twophase.c:1317 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:237 +#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 +#: commands/copyfrom.c:1535 commands/copyto.c:725 commands/extension.c:3390 +#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:597 +#: replication/logical/snapbuild.c:1651 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 guc-file.l:1061 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалося отримати інформацію від файлу \"%s\": %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:729 -#: commands/tablespace.c:739 postmaster/postmaster.c:1515 -#: storage/file/fd.c:2732 storage/file/reinit.c:122 utils/adt/misc.c:263 +#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 +#: commands/tablespace.c:759 postmaster/postmaster.c:1579 +#: 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:200 ../common/pgfnames.c:69 storage/file/fd.c:2744 +#: ../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:383 access/transam/xlogarchive.c:412 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1772 -#: replication/slot.c:643 replication/slot.c:1490 replication/slot.c:1632 -#: storage/file/fd.c:748 storage/file/fd.c:849 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:383 access/transam/xlogarchive.c:426 +#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1791 +#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 +#: 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:1083 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "внутрішня помилка" + +#: ../common/jsonapi.c:1092 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Неприпустима спеціальна послідовність \"\\%s\"." -#: ../common/jsonapi.c:1086 +#: ../common/jsonapi.c:1095 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ зі значенням 0x%02x повинен бути пропущений." -#: ../common/jsonapi.c:1089 +#: ../common/jsonapi.c:1098 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Очікувався кінець введення, але знайдено \"%s\"." -#: ../common/jsonapi.c:1092 +#: ../common/jsonapi.c:1101 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Очікувався елемент масиву або \"]\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1095 +#: ../common/jsonapi.c:1104 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Очікувалось \",\" або \"]\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1107 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Очікувалось \":\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1110 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Очікувалось значення JSON, але знайдено \"%s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1113 msgid "The input string ended unexpectedly." msgstr "Несподіваний кінець вхідного рядка." -#: ../common/jsonapi.c:1106 +#: ../common/jsonapi.c:1115 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Очікувався рядок або \"}\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1109 +#: ../common/jsonapi.c:1118 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Очікувалось \",\" або \"}\", але знайдено \"%s\"." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1121 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Очікувався рядок, але знайдено \"%s\"." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1124 #, c-format msgid "Token \"%s\" is invalid." msgstr "Неприпустимий маркер \"%s\"." -#: ../common/jsonapi.c:1118 jsonpath_scan.l:499 +#: ../common/jsonapi.c:1127 jsonpath_scan.l:495 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 не можна перетворити в текст." -#: ../common/jsonapi.c:1120 +#: ../common/jsonapi.c:1129 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" повинні прямувати чотири шістнадцяткових числа." -#: ../common/jsonapi.c:1123 +#: ../common/jsonapi.c:1132 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:1125 jsonpath_scan.l:520 +#: ../common/jsonapi.c:1134 jsonpath_scan.l:516 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Старший сурогат Unicode не повинен прямувати за іншим старшим сурогатом." -#: ../common/jsonapi.c:1127 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:1136 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 не повинен прямувати за іншим молодшим сурогатом." -#: ../common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "збій: " - -#: ../common/logging.c:266 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "помилка: " -#: ../common/logging.c:273 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "попередження: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "підказка: " + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -381,7 +445,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:2553 +#: ../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" @@ -416,13 +480,12 @@ msgstr "не вдалося запустити процес для команд 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:1187 -#: replication/basebackup.c:1363 +#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не вдалося отримати інформацію про файл або каталог \"%s\": %m" @@ -432,6 +495,18 @@ msgstr "не вдалося отримати інформацію про фай msgid "could not remove file or directory \"%s\": %m" msgstr "не вдалося видалити файл або каталог \"%s\": %m" +#: ../common/scram-common.c:260 +msgid "could not encode salt" +msgstr "не вдалося закодувати сіль" + +#: ../common/scram-common.c:276 +msgid "could not encode stored key" +msgstr "на вдалося закодувати збережений ключ" + +#: ../common/scram-common.c:293 +msgid "could not encode server key" +msgstr "не вдалося закодувати серверний ключ" + #: ../common/stringinfo.c:306 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." @@ -449,7 +524,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:2053 +#: ../common/username.c:45 libpq/auth.c:1900 msgid "user does not exist" msgstr "користувача не існує" @@ -488,12 +563,12 @@ msgstr "дочірній процес перервано через сигнал 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\"" @@ -518,30 +593,30 @@ msgstr "не вдалося встановити сполучення для \"% 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" @@ -551,6 +626,16 @@ msgstr "не вдалося отримати поточний робочий к 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 "не вдалося знайти локального користувача з ідентифікатором %d: %s" + +#: ../port/thread.c:105 ../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "локального користувача з ідентифікатором %d не існує" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -571,65 +656,55 @@ msgstr "не вдається перевірити членство токену msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "запит на підсумок діапазону BRIN для індексу «%s» сторінки %u не вдалося записати" -#: access/brin/brin.c:1036 access/brin/brin.c:1140 access/gin/ginfast.c:1043 -#: access/transam/xlog.c:11031 access/transam/xlog.c:11568 -#: 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:1036 access/brin/brin.c:1143 access/gin/ginfast.c:1042 +#: 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:1037 access/brin/brin.c:1141 +#: access/brin/brin.c:1037 access/brin/brin.c:1144 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Контрольна функція BRIN не може бути виконана під час відновлення." -#: access/brin/brin.c:1045 access/brin/brin.c:1149 +#: access/brin/brin.c:1042 access/brin/brin.c:1149 #, c-format -msgid "block number out of range: %s" -msgstr "заблоковане число за межами діапазону: %s" +msgid "block number out of range: %lld" +msgstr "номер блоку поза діапазоном: %lld" -#: access/brin/brin.c:1089 access/brin/brin.c:1175 +#: access/brin/brin.c:1086 access/brin/brin.c:1175 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" не є індексом BRIN" -#: access/brin/brin.c:1105 access/brin/brin.c:1191 +#: access/brin/brin.c:1102 access/brin/brin.c:1191 #, 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:3012 access/brin/brin_minmax_multi.c:3155 -#: 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 +#: access/brin/brin.c:1111 access/brin/brin.c:1207 access/gin/ginfast.c:1087 +#: parser/parse_utilcmd.c:2287 +#, c-format +msgid "index \"%s\" is not valid" +msgstr "індекс \"%s\" не є припустимим" + +#: access/brin/brin_bloom.c:749 access/brin/brin_bloom.c:791 +#: access/brin/brin_minmax_multi.c:2986 access/brin/brin_minmax_multi.c:3129 +#: 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:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 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:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1441 access/spgist/spgdoinsert.c:2000 -#: access/spgist/spgdoinsert.c:2275 +#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "розмір рядка індексу %zu перевищує максимальний %zu для індексу \"%s\"" @@ -727,96 +802,96 @@ msgstr "Атрибут \"%s\" типу %s не збігається з відп msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "Атрибут \"%s\" типу %s не існує в типі %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1133 access/common/heaptuple.c:1468 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "кількість стовпців (%d) перевищує обмеження (%d)" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "кількість індексних стовпців (%d) перевищує обмеження (%d)" -#: access/common/indextuple.c:190 access/spgist/spgutils.c:959 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "індексний рядок вимагає %zu байтів, максимальний розмір %zu" #: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1906 +#: tcop/postgres.c:1921 #, c-format msgid "unsupported format code: %d" msgstr "цей формат коду не підтримується:%d" -#: access/common/reloptions.c:512 access/common/reloptions.c:523 +#: access/common/reloptions.c:521 access/common/reloptions.c:532 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Дійсні значення \"увімкнено\", \"вимкнено\" та \"автоматично\"." -#: access/common/reloptions.c:534 +#: access/common/reloptions.c:543 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Припустимі значення лише \"local\" і \"cascaded\"." -#: access/common/reloptions.c:682 +#: access/common/reloptions.c:691 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "перевищено встановлене користувачем обмеження типу параметрів відношення" -#: access/common/reloptions.c:1225 +#: access/common/reloptions.c:1234 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET не має містити значення для параметрів" -#: access/common/reloptions.c:1257 +#: access/common/reloptions.c:1266 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нерозпізнаний параметр простору імен \"%s\"" -#: access/common/reloptions.c:1294 utils/misc/guc.c:12538 +#: access/common/reloptions.c:1303 utils/misc/guc.c:12995 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблиці, позначені WITH OIDS, не підтримуються" -#: access/common/reloptions.c:1464 +#: access/common/reloptions.c:1473 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нерозпізнаний параметр \"%s\"" -#: access/common/reloptions.c:1576 +#: access/common/reloptions.c:1585 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр «%s» вказано кілька разів" -#: access/common/reloptions.c:1592 +#: access/common/reloptions.c:1601 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неприпустиме значення для булевого параметра \"%s\": %s" -#: access/common/reloptions.c:1604 +#: access/common/reloptions.c:1613 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неприпустиме значення для цілого параметра \"%s\": %s" -#: access/common/reloptions.c:1610 access/common/reloptions.c:1630 +#: 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:1612 +#: access/common/reloptions.c:1621 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Припустимі значення знаходяться між \"%d\" і \"%d\"." -#: access/common/reloptions.c:1624 +#: access/common/reloptions.c:1633 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неприпустиме значення для числа з плавучою точкою параметра \"%s\": %s" -#: access/common/reloptions.c:1632 +#: access/common/reloptions.c:1641 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Припустимі значення знаходяться між \"%f\" і \"%f\"." -#: access/common/reloptions.c:1654 +#: access/common/reloptions.c:1663 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "недійсне значення для параметра перерахування \"%s\": %s" @@ -831,14 +906,8 @@ msgstr "метод стискання lz4 не підтримується" 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:1846 +#: access/common/tupdesc.c:825 parser/parse_clause.c:773 +#: parser/parse_relation.c:1857 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "стовпець\"%s\" не може бути оголошений SETOF" @@ -853,22 +922,22 @@ msgstr "список вказівників задовгий" msgid "Reduce maintenance_work_mem." msgstr "Зменшіть maintenance_work_mem." -#: access/gin/ginfast.c:1044 +#: access/gin/ginfast.c:1043 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "Черга записів GIN не може бути очищена під час відновлення." -#: access/gin/ginfast.c:1051 +#: access/gin/ginfast.c:1050 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" не є індексом GIN" -#: access/gin/ginfast.c:1062 +#: access/gin/ginfast.c:1061 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "доступ до тимчасових індексів з інших сесій заблокований" -#: access/gin/ginget.c:272 access/nbtree/nbtinsert.c:759 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:760 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не вдалося повторно знайти кортеж в межах індексу \"%s\"" @@ -883,8 +952,8 @@ msgstr "старі індекси GIN не підтримують сканува msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Щоб виправити це, зробіть REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3817 utils/adt/arrayfuncs.c:6485 +#: access/gin/ginutil.c:145 executor/execExpr.c:2168 +#: utils/adt/arrayfuncs.c:3866 utils/adt/arrayfuncs.c:6535 #: utils/adt/rowtypes.c:957 #, c-format msgid "could not identify a comparison function for type %s" @@ -907,18 +976,18 @@ msgstr "клас операторів \"%s\" з методом доступу %s msgid "support function number %d is invalid for access method %s" msgstr "номер функції підтримки %d неприпустимий для методу доступу %s" -#: access/gist/gist.c:758 access/gist/gistvacuum.c:420 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "індекс \"%s\" містить внутрішній кортеж, позначений як неправильний" -#: access/gist/gist.c:760 access/gist/gistvacuum.c:422 +#: access/gist/gist.c:761 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:761 access/gist/gistutil.c:800 access/gist/gistutil.c:811 -#: access/gist/gistvacuum.c:423 access/hash/hashutil.c:227 +#: access/gist/gist.c:762 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 @@ -926,7 +995,7 @@ msgstr "Це викликано неповним поділом сторінки msgid "Please REINDEX it." msgstr "Будь ласка, виконайте REINDEX." -#: access/gist/gist.c:1175 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "виправлення неповного розділу в індексі \"%s\", блок %u" @@ -941,13 +1010,13 @@ 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:797 access/hash/hashutil.c:224 +#: 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:808 access/hash/hashutil.c:235 +#: 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" @@ -964,39 +1033,39 @@ msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY op msgstr "сімейство операторів \"%s\" з методом доступу %s містить некоректну для оператора специфікацію ORDER BY opfamily %s" #: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1054 +#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "не вдалося визначити, який параметр сортування використати для обчислення хешу рядків" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:711 -#: catalog/heap.c:717 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1988 commands/tablecmds.c:16949 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:1004 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1055 utils/adt/varlena.c:1517 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:1955 commands/tablecmds.c:17505 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 +#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 +#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 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:2004 -#: access/spgist/spgdoinsert.c:2279 access/spgist/spgutils.c:1020 +#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 #, 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\"" @@ -1026,33 +1095,33 @@ msgstr "сімейство операторів \"%s\" з методом дос msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "сімейство операторів \"%s\" з методом доступу %s не містить міжтипового оператора (ів)" -#: access/heap/heapam.c:2288 +#: access/heap/heapam.c:2226 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "не вдалося вставити кортежі в паралельного працівника" -#: access/heap/heapam.c:2759 +#: access/heap/heapam.c:2697 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "не вдалося видалити кортежі під час паралельної операції" -#: access/heap/heapam.c:2805 +#: access/heap/heapam.c:2743 #, c-format msgid "attempted to delete invisible tuple" msgstr "спроба видалити невидимий кортеж" -#: access/heap/heapam.c:3246 access/heap/heapam.c:6106 +#: access/heap/heapam.c:3188 access/heap/heapam.c:6032 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "неможливо оновити кортежі під час паралельної операції" -#: access/heap/heapam.c:3387 +#: access/heap/heapam.c:3312 #, c-format msgid "attempted to update invisible tuple" msgstr "спроба оновити невидимий кортеж" -#: access/heap/heapam.c:4750 access/heap/heapam.c:4788 -#: access/heap/heapam.c:5053 access/heap/heapam_handler.c:457 +#: access/heap/heapam.c:4676 access/heap/heapam.c:4714 +#: access/heap/heapam.c:4979 access/heap/heapam_handler.c:456 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не вдалося отримати блокування у рядку стосовно \"%s\"" @@ -1074,13 +1143,13 @@ msgstr "не вдалося записати до файлу \"%s\", запис #: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 #: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3351 access/transam/xlog.c:3542 -#: access/transam/xlog.c:4759 access/transam/xlog.c:11377 -#: access/transam/xlog.c:11415 access/transam/xlog.c:11820 -#: access/transam/xlogfuncs.c:776 postmaster/postmaster.c:4630 -#: postmaster/postmaster.c:5668 replication/logical/origin.c:587 -#: replication/slot.c:1551 storage/file/copydir.c:167 storage/smgr/md.c:218 -#: utils/time/snapmgr.c:1261 +#: access/transam/xlog.c:2965 access/transam/xlog.c:3178 +#: access/transam/xlog.c:3966 access/transam/xlog.c:8659 +#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:517 +#: postmaster/postmaster.c:4607 postmaster/postmaster.c:5620 +#: replication/logical/origin.c:587 replication/slot.c:1631 +#: 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" @@ -1092,290 +1161,237 @@ msgstr "не вдалося скоротити файл \"%s\" до потріб #: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3423 access/transam/xlog.c:3598 -#: access/transam/xlog.c:4771 postmaster/postmaster.c:4640 -#: postmaster/postmaster.c:4650 replication/logical/origin.c:599 -#: replication/logical/origin.c:641 replication/logical/origin.c:660 -#: replication/logical/snapbuild.c:1729 replication/slot.c:1586 -#: storage/file/buffile.c:506 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1426 utils/init/miscinit.c:1437 -#: utils/init/miscinit.c:1445 utils/misc/guc.c:8366 utils/misc/guc.c:8397 -#: utils/misc/guc.c:10316 utils/misc/guc.c:10330 utils/time/snapmgr.c:1266 -#: utils/time/snapmgr.c:1273 +#: access/transam/xlog.c:3037 access/transam/xlog.c:3234 +#: access/transam/xlog.c:3978 commands/dbcommands.c:529 +#: postmaster/postmaster.c:4617 postmaster/postmaster.c:4627 +#: replication/logical/origin.c:599 replication/logical/origin.c:641 +#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1748 +#: replication/slot.c:1666 storage/file/buffile.c:537 +#: storage/file/copydir.c:207 utils/init/miscinit.c:1449 +#: utils/init/miscinit.c:1460 utils/init/miscinit.c:1468 utils/misc/guc.c:8721 +#: utils/misc/guc.c:8752 utils/misc/guc.c:10750 utils/misc/guc.c:10764 +#: 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:1249 access/transam/twophase.c:1679 -#: 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:4424 -#: replication/logical/snapbuild.c:1674 replication/logical/snapbuild.c:2090 -#: replication/slot.c:1683 storage/file/fd.c:788 storage/file/fd.c:3177 -#: storage/file/fd.c:3239 storage/file/reinit.c:250 storage/ipc/dsm.c:315 -#: storage/smgr/md.c:347 storage/smgr/md.c:397 storage/sync/sync.c:250 +#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1706 +#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:436 +#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 +#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4431 +#: replication/logical/snapbuild.c:1693 replication/logical/snapbuild.c:2109 +#: replication/slot.c:1763 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:373 storage/smgr/md.c:432 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:773 +#: access/heap/vacuumlazy.c:407 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "агресивне очищення \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:412 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "очищення \"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:663 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "очищення закінчено \"%s.%s.%s\": сканувань індексу: %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\": сканування індексу: %d\n" -#: access/heap/vacuumlazy.c:775 +#: 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\": сканування індексу: %d\n" -#: access/heap/vacuumlazy.c:780 +#: access/heap/vacuumlazy.c:681 #, 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:782 +#: access/heap/vacuumlazy.c:683 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичне очищення таблиці \"%s.%s.%s\": сканувань індексу: %d\n" -#: access/heap/vacuumlazy.c:789 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "сторінок: %u видалено, %u залишилось, %u відскановано (%.2f%% від загальної кількості)\n" + +#: access/heap/vacuumlazy.c:697 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "кортежів: %lld видалено, %lld залишилось, %lld мертвих, але все ще не можуть бути видаленні\n" + +#: access/heap/vacuumlazy.c:703 #, c-format -msgid "pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "сторінок: %u видалено, %u залишилось, %u пропущено закріплених, %u пропущено заморожених\n" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "пропущено кортежів: %lld померлих з %u сторінок не видалено через очищення блокування\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:708 #, c-format -msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable, oldest xmin: %u\n" -msgstr "кортежів: %lld видалено, %lld залишилось, %lld \"мертвих\", але все ще не підлягають видаленню, найстарший xmin: %u\n" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "видалення вирізу : %u, це було %d XIDs старий при завершенні операції\n" -#: access/heap/vacuumlazy.c:806 +#: access/heap/vacuumlazy.c:714 +#, c-format +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "новий relfrozenxid: %u, що є %d XIDs попереду попереднього значення\n" + +#: access/heap/vacuumlazy.c:721 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "новий relminmxid: %u, що становить %d MXIDs попереду попереднього значення\n" + +#: access/heap/vacuumlazy.c:727 msgid "index scan not needed: " msgstr "сканування індексу не потрібне: " -#: access/heap/vacuumlazy.c:808 +#: access/heap/vacuumlazy.c:729 msgid "index scan needed: " msgstr "сканування індексу потрібне: " -#: access/heap/vacuumlazy.c:810 +#: access/heap/vacuumlazy.c:731 #, 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:815 +#: access/heap/vacuumlazy.c:736 msgid "index scan bypassed: " msgstr "сканування індексу пропущено: " -#: access/heap/vacuumlazy.c:817 +#: access/heap/vacuumlazy.c:738 msgid "index scan bypassed by failsafe: " msgstr "сканування індексу безпечно пропущено: " -#: access/heap/vacuumlazy.c:819 +#: access/heap/vacuumlazy.c:740 #, 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:834 +#: access/heap/vacuumlazy.c:755 #, 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 +#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "час вводу-виведення: читання %.3f мс, запис: %.3f мс\n" -#: access/heap/vacuumlazy.c:849 commands/analyze.c:817 +#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "середня швидкість читання: %.3f МБ/с, середня швидкість запису: %.3f МБ/с\n" -#: access/heap/vacuumlazy.c:852 commands/analyze.c:819 +#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "використання буфера: %lld звернень, %lld промахів, %lld, брудних записів\n" -#: access/heap/vacuumlazy.c:857 +#: access/heap/vacuumlazy.c:785 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "Використання WAL: %lld записів, %lld зображень на повну сторінку, %llu байтів\n" -#: access/heap/vacuumlazy.c:861 commands/analyze.c:823 +#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 #, 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:938 commands/cluster.c:913 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "очищення \"%s.%s\"" - -#: access/heap/vacuumlazy.c:1640 access/heap/vacuumlazy.c:2385 +#: access/heap/vacuumlazy.c:2463 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "таблиця \"%s\": видалено %lld мертвих ідентифікаторів елементів в %u сторінках" -#: access/heap/vacuumlazy.c:1656 -#, c-format -msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%lld версій мертвих рядків поки не можна видалити, найстарший xmin: %u\n" - -#: 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] "Пропущено %u сторінку, закріплену в буфері " -msgstr[1] "Пропущено %u сторінки, закріплені в буфері " -msgstr[2] "Пропущено %u сторінок, закріплених в буфері " -msgstr[3] "Пропущено %u сторінок, закріплених в буфері " - -#: access/heap/vacuumlazy.c:1662 -#, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "%u заморожена сторінка.\n" -msgstr[1] "%u заморожені сторінки.\n" -msgstr[2] "%u заморожених сторінок.\n" -msgstr[3] "%u заморожених сторінок.\n" - -#: access/heap/vacuumlazy.c:1666 commands/indexcmds.c:4152 -#: commands/indexcmds.c:4171 -#, c-format -msgid "%s." -msgstr "%s." - -#: 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 +#: access/heap/vacuumlazy.c:2629 #, 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:2622 +#: access/heap/vacuumlazy.c:2634 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "relfrozenxid або relminmxid таблиці занадто далеко в минулому." -#: access/heap/vacuumlazy.c:2623 +#: 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 "Можливо, слід збільшити параметр конфігурації \"maintenance_work_mem\" або \"autovacuum_work_mem\".\n" "Можливо, вам також доведеться розглянути інші способи, щоб VACUUM не відставав від розподілу ідентифікаторів транзакцій." -#: 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] "запущено %d паралельний виконавець очистки для очищення індексу (заплановано: %d)" -msgstr[1] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" - -#: 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] "запущений %d паралельний виконавець очистки для очищення індексу (заплановано: %d)" -msgstr[1] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" - -#: access/heap/vacuumlazy.c:3063 -#, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "просканований індекс \"%s\", видалено версій рядків %d" - -#: 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:3124 -#, 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.\n" -"%s." -msgstr "%.0f версій індексних рядків було видалено.\n" -"%u індексних сторінок було нещодавно видалено.\n" -"%u індексних сторінок наразі видалено, з яких %u зараз можна повторно використати.\n" -"%s." - -#: access/heap/vacuumlazy.c:3233 +#: access/heap/vacuumlazy.c:2878 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": зупинка скорочення через конфліктний запит блокування" -#: access/heap/vacuumlazy.c:3299 +#: access/heap/vacuumlazy.c:2948 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблиця \"%s: скорочена від %u до %u сторінок" -#: access/heap/vacuumlazy.c:3363 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "таблиця \"%s: припинення скорочення через конфліктуючий запит блокування" -#: access/heap/vacuumlazy.c:3508 +#: access/heap/vacuumlazy.c:3170 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "вимкнення паралельної опції очищення на \"%s\" --- неможливо паралельно очистити тимчасові таблиці" -#: access/heap/vacuumlazy.c:4274 +#: access/heap/vacuumlazy.c:3383 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "під час сканування блоку %u зсувом %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4277 +#: access/heap/vacuumlazy.c:3386 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "у процесі сканування блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4281 +#: access/heap/vacuumlazy.c:3390 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "у процесі сканування відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4289 +#: access/heap/vacuumlazy.c:3398 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "під час очищення блоку %u зсувом %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4292 +#: access/heap/vacuumlazy.c:3401 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "у процесі очищення блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4296 +#: access/heap/vacuumlazy.c:3405 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "у процесі очищення відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4301 +#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "у процесі очищення індексу \"%s\" відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4306 +#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "у процесі очищення індексу \"%s\" відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:4312 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "у процесі скорочення відношення \"%s.%s\" до %u блоків" @@ -1390,14 +1406,14 @@ msgstr "метод доступу \"%s\" не є типу %s" msgid "index access method \"%s\" does not have a handler" msgstr "для методу доступу індекса \"%s\" не заданий обробник" -#: access/index/genam.c:486 +#: 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:2816 commands/tablecmds.c:267 commands/tablecmds.c:291 -#: commands/tablecmds.c:16647 commands/tablecmds.c:18398 +#: access/index/indexam.c:142 catalog/objectaddress.c:1376 +#: commands/indexcmds.c:2783 commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:17191 commands/tablecmds.c:18976 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" не є індексом" @@ -1407,23 +1423,23 @@ msgstr "\"%s\" не є індексом" msgid "operator class %s has no options" msgstr "клас операторів %s без параметрів" -#: access/nbtree/nbtinsert.c:665 +#: access/nbtree/nbtinsert.c:666 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторювані значення ключа порушують обмеження унікальності \"%s\"" -#: access/nbtree/nbtinsert.c:667 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "Key %s already exists." msgstr "Ключ %s вже існує." -#: access/nbtree/nbtinsert.c:761 +#: access/nbtree/nbtinsert.c:762 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Можливо, це викликано змінною природою індексного вираження." #: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2330 +#: parser/parse_utilcmd.c:2333 #, c-format msgid "index \"%s\" is not a btree" msgstr "індекс \"%s\" не є b-деревом" @@ -1433,27 +1449,27 @@ msgstr "індекс \"%s\" не є b-деревом" 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:1875 +#: access/nbtree/nbtpage.c:1874 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "індекс \"%s\" містить наполовину мертву внутрішню сторінку" -#: 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 "Це могло статися через переривання VACUUM у версії 9.3 або старше перед оновленням. Будь ласка, виконайте REINDEX." -#: access/nbtree/nbtutils.c:2665 +#: access/nbtree/nbtutils.c:2684 #, 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:2671 +#: access/nbtree/nbtutils.c:2690 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Рядок індексу посилається на кортеж (%u,,%u) у відношенні \"%s\"." -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:2694 #, 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." @@ -1470,7 +1486,7 @@ msgstr "сімейство операторів \"%s\" методу доступ msgid "compress method must be defined when leaf type is different from input type" msgstr "метод стиснення повинен бути визначений, коли тип листів відрізняється від вхідного типу" -#: access/spgist/spgutils.c:1017 +#: access/spgist/spgutils.c:1016 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "Внутрішній розмір кортежу SP-GiST %zu перевищує максимальний %zu" @@ -1486,14 +1502,14 @@ msgid "operator family \"%s\" of access method %s is missing support function %d msgstr "сімейство операторів \"%s\" методу доступу %s не має опорної функції для типів %d для типу %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\" є індексом" #: 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:13367 -#: commands/tablecmds.c:16656 +#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13880 +#: commands/tablecmds.c:17200 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" це складений тип" @@ -1508,7 +1524,7 @@ msgstr "невірний tid (%u, %u) для відношення \"%s\"" msgid "%s cannot be empty." msgstr "%s не може бути пустим." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12462 +#: access/table/tableamapi.c:122 utils/misc/guc.c:12919 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s занадто довгий (максимум %d символів)." @@ -1528,22 +1544,22 @@ msgstr "Табличного методу доступу \"%s\" не існує. msgid "sample percentage must be between 0 and 100" msgstr "відсоток вибірки повинен задаватися числом від 0 до 100" -#: access/transam/commit_ts.c:280 +#: access/transam/commit_ts.c:282 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не вдалося отримати мітку позначки часу транзакції %u" -#: access/transam/commit_ts.c:378 +#: access/transam/commit_ts.c:380 #, c-format msgid "could not get commit timestamp data" msgstr "не вдалося отримати позначку часу фіксації" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:382 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Переконайтесь, що в конфігурації основного серверу встановлений параметр \"%s\"." -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:384 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Переконайтесь, що в конфігурації встановлений параметр \"%s\"." @@ -1695,60 +1711,116 @@ msgstr "не вдалося відобразити динамічний сегм msgid "invalid magic number in dynamic shared memory segment" msgstr "неприпустиме магічне число в динамічному сегменті спільної пам'яті" -#: access/transam/slru.c:713 +#: 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:714 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не існує, вважається нульовим" -#: 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 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format msgid "could not access status of transaction %u" msgstr "не можливо отримати статус транзакції %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:947 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Не можливо відкрити файл \"%s\": %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:953 #, 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:960 +#: access/transam/slru.c:961 #, 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:965 +#: access/transam/slru.c:966 #, 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:972 +#: access/transam/slru.c:973 #, 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:977 +#: access/transam/slru.c:978 #, 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:984 +#: access/transam/slru.c:985 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Не вдалося синхронізувати файл \"%s\": %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:992 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Не можливо закрити файл \"%s\": %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1253 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не вдалося спустошити каталог \"%s\": очевидно сталося зациклення" @@ -1793,72 +1865,72 @@ msgstr "Ідентифікатори ліній часу повинні бути msgid "requested timeline %u is not in this server's history" msgstr "в історії даного серверу немає запитаної лінії часу %u" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "ідентифікатор транзакції \"%s\" задовгий" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "підготовлені транзакції вимкнено" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:394 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Встановіть ненульове значення параметра max_prepared_transactions." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:413 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "ідентифікатор транзакції \"%s\" вже використовується" -#: access/transam/twophase.c:417 access/transam/twophase.c:2484 +#: access/transam/twophase.c:422 access/transam/twophase.c:2519 #, c-format msgid "maximum number of prepared transactions reached" msgstr "досягнуто максимального числа підготованих транзакцій" -#: access/transam/twophase.c:418 access/transam/twophase.c:2485 +#: access/transam/twophase.c:423 access/transam/twophase.c:2520 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Збільшіть max_prepared_transactions (наразі %d)." -#: access/transam/twophase.c:595 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "підготовлена транзакція з ідентифікатором \"%s\" зайнята" -#: access/transam/twophase.c:601 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "немає дозволу для завершення підготовлених транзакцій" -#: access/transam/twophase.c:602 +#: access/transam/twophase.c:606 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Треба пути суперкористувачем або користувачем, який підготував транзакцію." -#: access/transam/twophase.c:613 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "підготовлена транзакція належить до іншої бази даних" -#: access/transam/twophase.c:614 +#: access/transam/twophase.c:618 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "З'єднайтесь з базою даних, де була підготовлена транзакція, щоб завершити її." -#: access/transam/twophase.c:629 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "підготовленої транзакції з ідентифікатором \"%s\" не існує" -#: access/transam/twophase.c:1150 +#: access/transam/twophase.c:1170 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "перевищено граничний розмір файла у 2-фазовому стані" -#: access/transam/twophase.c:1305 +#: access/transam/twophase.c:1325 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -1867,57 +1939,58 @@ msgstr[1] "неправильний розмір файлу \"%s\": %lld бай msgstr[2] "неправильний розмір файлу \"%s\": %lld байтів" msgstr[3] "неправильний розмір файлу \"%s\": %lld байтів" -#: access/transam/twophase.c:1314 +#: access/transam/twophase.c:1334 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "неправильне вирівнювання зсуву CRC для файлу \"%s\"" -#: access/transam/twophase.c:1332 +#: access/transam/twophase.c:1352 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %lld" -#: access/transam/twophase.c:1347 +#: access/transam/twophase.c:1367 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "неприпустиме магічне число, збережене у файлі\"%s\"" -#: access/transam/twophase.c:1353 +#: access/transam/twophase.c:1373 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "неприпустимий розмір, збережений у файлі \"%s\"" -#: access/transam/twophase.c:1365 +#: access/transam/twophase.c:1385 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "обчислена контрольна сума CRC не відповідає значенню, збереженому у файлі \"%s\"" -#: access/transam/twophase.c:1400 access/transam/xlog.c:6693 +#: access/transam/twophase.c:1415 access/transam/xlogrecovery.c:588 +#: replication/logical/logical.c:206 replication/walsender.c:702 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не вдалося розмістити обробник журналу транзакцій." -#: access/transam/twophase.c:1417 +#: access/transam/twophase.c:1425 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "не вдалося прочитати 2-фазовий стан з WAL при %X/%X: %s" -#: access/transam/twophase.c:1422 +#: access/transam/twophase.c:1430 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не вдалося прочитати 2-фазовий стан з WAL при %X/%X" -#: access/transam/twophase.c:1430 +#: access/transam/twophase.c:1438 #, 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:1707 +#: access/transam/twophase.c:1734 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "не вдалося відтворити файл \"%s\": %m" -#: access/transam/twophase.c:1834 +#: access/transam/twophase.c:1861 #, 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" @@ -1926,53 +1999,53 @@ msgstr[1] "%u 2-фазовий стан файлів був записаний msgstr[2] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" msgstr[3] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" -#: access/transam/twophase.c:2068 +#: access/transam/twophase.c:2095 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "відновлення підготовленої транзакції %u із спільної пам'яті" -#: access/transam/twophase.c:2159 +#: access/transam/twophase.c:2188 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "видалення застарілого файла 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2166 +#: access/transam/twophase.c:2195 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "видалення з пам'яті застарілого 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2179 +#: access/transam/twophase.c:2208 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "видалення файлу майбутнього 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2186 +#: access/transam/twophase.c:2215 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "видалення з пам'яті майбутнього 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2211 +#: access/transam/twophase.c:2240 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "пошкоджений файл двофазного стану для транзакції %u" -#: access/transam/twophase.c:2216 +#: access/transam/twophase.c:2245 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "пошкоджена пам'ять двофазного стану для транзакції %u" -#: access/transam/twophase.c:2467 +#: access/transam/twophase.c:2502 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "не вдалося відновити файл 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2469 +#: access/transam/twophase.c:2504 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." msgstr "Файл 2-фазового стану був знайдений в запису WAL %X/%X, але ця транзакція вже відновлена з диску." -#: access/transam/twophase.c:2477 jit/jit.c:205 utils/fmgr/dfmgr.c:209 -#: utils/fmgr/dfmgr.c:417 utils/fmgr/dfmgr.c:465 +#: access/transam/twophase.c:2512 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 #, c-format msgid "could not access file \"%s\": %m" msgstr "немає доступу до файлу \"%s\": %m" @@ -2004,295 +2077,270 @@ msgstr "база даних \"%s\" повинна бути очищена (гр msgid "database with OID %u must be vacuumed within %u transactions" msgstr "база даних з OID %u повинна бути очищена (граничне число транзакцій: %u)" -#: access/transam/xact.c:1046 +#: access/transam/xact.c:1098 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одній транзакції не може бути більше 2^32-2 команд" -#: access/transam/xact.c:1584 +#: access/transam/xact.c:1644 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "перевищено межу числа зафіксованих підтранзакцій (%d)" -#: access/transam/xact.c:2435 +#: access/transam/xact.c:2501 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "неможливо виконати PREPARE для транзакції, що здійснювалася на тимчасових об'єктах" -#: access/transam/xact.c:2445 +#: access/transam/xact.c:2511 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "не можна виконати PREPARE для транзакції, яка має експортовані знімки" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3416 +#: access/transam/xact.c:3479 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s неможливо запустити всередині блоку транзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3426 +#: access/transam/xact.c:3489 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s неможливо запустити всередині підтранзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3436 +#: access/transam/xact.c:3499 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s не можна використовувати в межах конвеєра" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3446 +#: access/transam/xact.c:3509 #, c-format msgid "%s cannot be executed from a function" msgstr "%s неможливо виконати з функції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3517 access/transam/xact.c:3832 -#: access/transam/xact.c:3911 access/transam/xact.c:4034 -#: access/transam/xact.c:4185 access/transam/xact.c:4254 -#: access/transam/xact.c:4365 +#: access/transam/xact.c:3580 access/transam/xact.c:3895 +#: access/transam/xact.c:3974 access/transam/xact.c:4097 +#: access/transam/xact.c:4248 access/transam/xact.c:4317 +#: access/transam/xact.c:4428 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s може використовуватися тільки в блоках транзакції" -#: access/transam/xact.c:3718 +#: access/transam/xact.c:3781 #, c-format msgid "there is already a transaction in progress" msgstr "транзакція вже виконується" -#: access/transam/xact.c:3837 access/transam/xact.c:3916 -#: access/transam/xact.c:4039 +#: access/transam/xact.c:3900 access/transam/xact.c:3979 +#: access/transam/xact.c:4102 #, c-format msgid "there is no transaction in progress" msgstr "немає незавершеної транзакції" -#: access/transam/xact.c:3927 +#: access/transam/xact.c:3990 #, c-format msgid "cannot commit during a parallel operation" msgstr "не можна фіксувати транзакції під час паралельних операцій" -#: access/transam/xact.c:4050 +#: access/transam/xact.c:4113 #, c-format msgid "cannot abort during a parallel operation" msgstr "не можна перервати під час паралельних операцій" -#: access/transam/xact.c:4149 +#: access/transam/xact.c:4212 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "не можна визначати точки збереження під час паралельних операцій" -#: access/transam/xact.c:4236 +#: access/transam/xact.c:4299 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "не можна вивільняти точки збереження під час паралельних транзакцій" -#: access/transam/xact.c:4246 access/transam/xact.c:4297 -#: access/transam/xact.c:4357 access/transam/xact.c:4406 +#: access/transam/xact.c:4309 access/transam/xact.c:4360 +#: access/transam/xact.c:4420 access/transam/xact.c:4469 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка збереження \"%s\" не існує" -#: access/transam/xact.c:4303 access/transam/xact.c:4412 +#: access/transam/xact.c:4366 access/transam/xact.c:4475 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "точка збереження \"%s\" не існує на поточному рівні збереження точок" -#: access/transam/xact.c:4345 +#: access/transam/xact.c:4408 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "не можна відкотити назад до точки збереження під час паралельних операцій" -#: access/transam/xact.c:4473 +#: access/transam/xact.c:4536 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "не можна запустити підтранзакцію під час паралельних операцій" -#: access/transam/xact.c:4541 +#: access/transam/xact.c:4604 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "не можна визначити підтранзакцію під час паралельних операцій" -#: access/transam/xact.c:5188 +#: access/transam/xact.c:5251 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одній транзакції не може бути більше 2^32-1 підтранзакцій" -#: access/transam/xlog.c:1836 +#: access/transam/xlog.c:1465 #, c-format 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:2609 +#: access/transam/xlog.c:2226 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "не вдалося записати у файл журналу %s (зсув: %u, довжина: %zu): %m" -#: access/transam/xlog.c:3486 storage/file/fd.c:839 storage/file/fd.c:852 -#, c-format -msgid "This is known to fail occasionally during archive recovery, where it is harmless." -msgstr "Відомо, що можливі помилки під час відновлення архіву, коли це не шкодить." - -#: access/transam/xlog.c:4014 access/transam/xlogutils.c:798 -#: replication/walsender.c:2557 +#: access/transam/xlog.c:3473 access/transam/xlogutils.c:847 +#: replication/walsender.c:2716 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запитуваний сегмент WAL %s вже видалений" -#: access/transam/xlog.c:4289 +#: access/transam/xlog.c:3758 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не вдалося перейменувати файл \"%s\": %m" -#: access/transam/xlog.c:4331 access/transam/xlog.c:4341 +#: access/transam/xlog.c:3800 access/transam/xlog.c:3810 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "необхідний каталог WAL \"%s\" не існує" -#: access/transam/xlog.c:4347 +#: access/transam/xlog.c:3816 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "створюється відсутній каталог WAL \"%s\"" -#: access/transam/xlog.c:4350 commands/dbcommands.c:2278 +#: access/transam/xlog.c:3819 commands/dbcommands.c:3115 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не вдалося створити відстуній каталог \"%s\": %m" -#: access/transam/xlog.c:4472 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "неочіукваний ID лінії часу %u в сегменті журналу %s, зсув %u" - -#: access/transam/xlog.c:4610 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "нова лінія часу %u не є дочірньою для лінії часу системи бази даних %u" - -#: access/transam/xlog.c:4624 -#, 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:4643 -#, c-format -msgid "new target timeline is %u" -msgstr "нова цільова лінія часу %u" - -#: access/transam/xlog.c:4679 +#: access/transam/xlog.c:3886 #, c-format msgid "could not generate secret authorization token" msgstr "не вдалося згенерувати секретний токен для авторизації" -#: access/transam/xlog.c:4838 access/transam/xlog.c:4847 -#: access/transam/xlog.c:4871 access/transam/xlog.c:4878 -#: access/transam/xlog.c:4885 access/transam/xlog.c:4890 -#: access/transam/xlog.c:4897 access/transam/xlog.c:4904 -#: access/transam/xlog.c:4911 access/transam/xlog.c:4918 -#: access/transam/xlog.c:4925 access/transam/xlog.c:4932 -#: access/transam/xlog.c:4941 access/transam/xlog.c:4948 -#: utils/init/miscinit.c:1583 +#: access/transam/xlog.c:4045 access/transam/xlog.c:4054 +#: access/transam/xlog.c:4078 access/transam/xlog.c:4085 +#: access/transam/xlog.c:4092 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 +#: access/transam/xlog.c:4118 access/transam/xlog.c:4125 +#: access/transam/xlog.c:4132 access/transam/xlog.c:4139 +#: access/transam/xlog.c:4148 access/transam/xlog.c:4155 +#: utils/init/miscinit.c:1606 #, c-format msgid "database files are incompatible with server" msgstr "файли бази даних є несумісними з даним сервером" -#: access/transam/xlog.c:4839 +#: access/transam/xlog.c:4046 #, 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:4843 +#: access/transam/xlog.c:4050 #, 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:4848 +#: access/transam/xlog.c:4055 #, 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:4851 access/transam/xlog.c:4875 -#: access/transam/xlog.c:4882 access/transam/xlog.c:4887 +#: access/transam/xlog.c:4058 access/transam/xlog.c:4082 +#: access/transam/xlog.c:4089 access/transam/xlog.c:4094 #, c-format msgid "It looks like you need to initdb." msgstr "Здається, Вам треба виконати initdb." -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4069 #, c-format msgid "incorrect checksum in control file" msgstr "помилка контрольної суми у файлі pg_control" -#: access/transam/xlog.c:4872 +#: access/transam/xlog.c:4079 #, 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:4879 +#: access/transam/xlog.c:4086 #, 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:4886 +#: access/transam/xlog.c:4093 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Здається, в кластері баз даних і в програмі сервера використовуються різні формати чисел з плаваючою точкою." -#: access/transam/xlog.c:4891 +#: access/transam/xlog.c:4098 #, 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: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:4929 -#: access/transam/xlog.c:4936 access/transam/xlog.c:4944 -#: access/transam/xlog.c:4951 +#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 +#: access/transam/xlog.c:4115 access/transam/xlog.c:4122 +#: access/transam/xlog.c:4129 access/transam/xlog.c:4136 +#: access/transam/xlog.c:4143 access/transam/xlog.c:4151 +#: access/transam/xlog.c:4158 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Здається, вам потрібно перекомпілювати сервер або виконати initdb." -#: access/transam/xlog.c:4898 +#: access/transam/xlog.c:4105 #, 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:4905 +#: access/transam/xlog.c:4112 #, 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:4912 +#: access/transam/xlog.c:4119 #, 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:4919 +#: access/transam/xlog.c:4126 #, 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:4926 +#: access/transam/xlog.c:4133 #, 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:4933 +#: access/transam/xlog.c:4140 #, 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:4942 +#: access/transam/xlog.c:4149 #, 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:4949 +#: access/transam/xlog.c:4156 #, 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:4958 +#: access/transam/xlog.c:4165 #, 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" @@ -2301,273 +2349,607 @@ msgstr[1] "Розмір сегменту WAL повинен задаватись msgstr[2] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" msgstr[3] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d" -#: access/transam/xlog.c:4970 +#: access/transam/xlog.c:4177 #, 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:4974 +#: access/transam/xlog.c:4181 #, 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:5408 +#: access/transam/xlog.c:4622 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не вдалося записати початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5416 +#: access/transam/xlog.c:4630 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не вдалося скинути на диск початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5422 +#: access/transam/xlog.c:4636 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не вдалося закрити початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5483 +#: access/transam/xlog.c:4854 #, 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 був створений з параметром wal_level=minimal, неможливо продовжити відновлення" -#: access/transam/xlog.c:5548 +#: access/transam/xlog.c:4855 #, 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:5565 +#: access/transam/xlog.c:4856 #, 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, що перевищує максимальне." -#: access/transam/xlog.c:5566 +#: access/transam/xlog.c:4920 #, 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:5574 +#: access/transam/xlog.c:4931 #, 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:5612 +#: access/transam/xlog.c:4937 #, 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:5734 +#: access/transam/xlog.c:4943 #, c-format -msgid "archive recovery complete" -msgstr "відновлення архіву завершено" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "завершення роботи бази даних було перервано; останній момент роботи %s" -#: access/transam/xlog.c:5800 access/transam/xlog.c:6076 +#: access/transam/xlog.c:4949 #, 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:5821 +#: access/transam/xlog.c:4951 #, 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:5911 +#: access/transam/xlog.c:4957 #, 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:5918 +#: access/transam/xlog.c:4959 #, 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 "Якщо це відбувається більше, ніж один раз, можливо, якісь дані були зіпсовані, і для відновлення треба вибрати більш ранню точку." -#: access/transam/xlog.c:5971 +#: access/transam/xlog.c:4965 #, 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:5989 +#: access/transam/xlog.c:4971 #, 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:6056 +#: access/transam/xlog.c:5355 #, 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:6064 +#: access/transam/xlog.c:5356 #, 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:6109 +#: access/transam/xlog.c:5359 #, c-format -msgid "pausing at the end of recovery" -msgstr "пауза в кінці відновлення" +msgid "WAL ends before consistent recovery point" +msgstr "WAL завершився до узгодженої точки відновлення" -#: access/transam/xlog.c:6110 +#: access/transam/xlog.c:5407 #, 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:6113 access/transam/xlog.c:6395 +#: access/transam/xlog.c:5440 #, c-format -msgid "recovery has paused" -msgstr "відновлення зупинено" +msgid "archive recovery complete" +msgstr "відновлення архіву завершено" -#: access/transam/xlog.c:6114 +#: access/transam/xlog.c:6046 #, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "Виконайте pg_wal_replay_resume(), щоб продовжити." +msgid "shutting down" +msgstr "завершення роботи" -#: access/transam/xlog.c:6386 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6085 #, c-format -msgid "hot standby is not possible because of insufficient parameter settings" -msgstr "hot standby неможливий через недостатнє налаштування параметрів" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "початок точки перезапуску: %s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6387 access/transam/xlog.c:6414 -#: access/transam/xlog.c:6444 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6097 #, c-format -msgid "%s = %d is a lower setting than on the primary server, where its value was %d." -msgstr "%s = %d є нижчим параметром, ніж на основному сервері, де його значення було %d." +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "початок контрольної точки: %s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6396 +#: access/transam/xlog.c:6157 #, c-format -msgid "If recovery is unpaused, the server will shut down." -msgstr "Якщо відновлення не буде зупинено, сервер завершить роботу." +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:6397 +#: access/transam/xlog.c:6177 #, c-format -msgid "You can then restart the server after making the necessary configuration changes." -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:6408 +#: access/transam/xlog.c:6612 #, c-format -msgid "promotion is not possible because of insufficient parameter settings" -msgstr "підвищення неможливе через недостатнє налаштування параметрів" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "під час того вимкнення БД помічено конкурентну активність у випереджувальному журналюванні" -#: access/transam/xlog.c:6418 +#: access/transam/xlog.c:7169 #, c-format -msgid "Restart the server after making the necessary configuration changes." -msgstr "Перезапустити сервер після здійснення необхідних змін у конфігурації." +msgid "recovery restart point at %X/%X" +msgstr "відновлення збереженої точки %X/%X" -#: access/transam/xlog.c:6442 +#: access/transam/xlog.c:7171 #, c-format -msgid "recovery aborted because of insufficient parameter settings" -msgstr "відновлення перервано через недостатнє налаштування параметрів" +msgid "Last completed transaction was at log time %s." +msgstr "Остання завершена транзакція була в %s." -#: access/transam/xlog.c:6448 +#: access/transam/xlog.c:7418 #, c-format -msgid "You can restart the server after making the necessary configuration changes." -msgstr "Ви можете перезапустити сервер, після здійснення необхідних змін у конфігурації." +msgid "restore point \"%s\" created at %X/%X" +msgstr "точка відновлення \"%s\" створена в %X/%X" -#: access/transam/xlog.c:6470 +#: access/transam/xlog.c:7625 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL був створений з параметром wal_level=minimal, неможливо продовжити відновлення" +msgid "online backup was canceled, recovery cannot continue" +msgstr "онлайн резервне копіювання скасовано, неможливо продовжити відновлення" -#: access/transam/xlog.c:6471 +#: access/transam/xlog.c:7682 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Це трапляється, якщо ви тимчасово встановили параметр wal_level=minimal на сервері." +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "неочікуваний ID лінії часу %u (повинен бути %u) у записі контрольної точки вимкнення" -#: access/transam/xlog.c:6472 +#: access/transam/xlog.c:7740 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Використовуйте резервну копію, зроблену після встановлення значення wal_level, що перевищує максимальне." +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "неочікуваний ID лінії часу %u (повинен бути %u) у записі контрольної точки онлайн" -#: access/transam/xlog.c:6541 +#: access/transam/xlog.c:7769 #, c-format -msgid "control file contains invalid checkpoint location" -msgstr "контрольний файл містить недійсне розташування контрольної точки" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "неочікуваний ID лінії часу %u (повинен бути %u) у записі кінця відновлення" -#: access/transam/xlog.c:6552 +#: access/transam/xlog.c:8027 #, c-format -msgid "database system was shut down at %s" -msgstr "система бази даних була вимкнена %s" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "не вдалосьясинхронізувати файл наскрізного запису %s: %m" -#: access/transam/xlog.c:6558 +#: access/transam/xlog.c:8033 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "система бази даних завершила роботу у процесі відновлення %s" +msgid "could not fdatasync file \"%s\": %m" +msgstr "не вдалося fdatasync файл \"%s\": %m" -#: access/transam/xlog.c:6564 +#: access/transam/xlog.c:8128 access/transam/xlog.c:8495 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "завершення роботи бази даних було перервано; останній момент роботи %s" +msgid "WAL level not sufficient for making an online backup" +msgstr "Обраний рівень WAL недостатній для резервного копіювання \"на ходу\"" -#: access/transam/xlog.c:6570 +#: access/transam/xlog.c:8129 access/transam/xlog.c:8496 +#: access/transam/xlogfuncs.c:199 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "система бази даних була перервана в процесі відновлення %s" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "встановіть wal_level \"replica\" або \"logical\" при запуску серверу." -#: access/transam/xlog.c:6572 +#: access/transam/xlog.c:8134 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "Це, ймовірно, означає, що деякі дані були пошкоджені, і вам доведеться відновити базу даних з останнього збереження." +msgid "backup label too long (max %d bytes)" +msgstr "мітка резервного копіювання задовга (максимум %d байт)" -#: access/transam/xlog.c:6578 +#: access/transam/xlog.c:8250 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "робота системи бази даних була перервана в процесі відновлення, час в журналі %s" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "Після останньої точки відновлення був відтворений WAL, створений в режимі full_page_writes=off" -#: access/transam/xlog.c:6580 +#: access/transam/xlog.c:8252 access/transam/xlog.c:8608 #, 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 "Якщо це відбувається більше, ніж один раз, можливо, якісь дані були зіпсовані, і для відновлення треба вибрати більш ранню точку." +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:8332 backup/basebackup.c:1345 utils/adt/misc.c:347 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "таргет символічного посилання \"%s\" задовгий" + +#: access/transam/xlog.c:8382 backup/basebackup.c:1360 +#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#, c-format +msgid "tablespaces are not supported on this platform" +msgstr "табличний простір не підтримується на цій платформі" + +#: access/transam/xlog.c:8541 access/transam/xlog.c:8554 +#: access/transam/xlogrecovery.c:1211 access/transam/xlogrecovery.c:1218 +#: access/transam/xlogrecovery.c:1277 access/transam/xlogrecovery.c:1357 +#: access/transam/xlogrecovery.c:1381 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "невірні дані у файлі \"%s\"" + +#: access/transam/xlog.c:8558 backup/basebackup.c:1200 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "режим очікування було підвищено у процесі резервного копіювання \"на ходу\"" + +#: access/transam/xlog.c:8559 backup/basebackup.c:1201 +#, 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:8606 +#, 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:8731 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "резервне копіювання виконане, очікуються необхідні сегменти WAL для архівації" + +#: access/transam/xlog.c:8745 +#, c-format +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "все ще чекає на необхідні сегменти WAL для архівації (%d секунд пройшло)" + +#: access/transam/xlog.c:8747 +#, 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:8754 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "усі необхідні сегменти WAL архівовані" + +#: access/transam/xlog.c:8758 +#, 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:8807 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "припинення резервного копіювання через завершення обслуговуючого процесу до виклику pg_backup_stop" + +#: access/transam/xlogarchive.c:215 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "файл архіву \"%s\" має неправильний розмір: %lld замість %lld" + +#: access/transam/xlogarchive.c:224 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "відновлений файл журналу \"%s\" з архіву" + +#: access/transam/xlogarchive.c:238 +#, c-format +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command повернула нульовий статус виходу, але stat() не вдався." + +#: access/transam/xlogarchive.c:270 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "неможливо відновити файл \"%s\" з архіву: %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:383 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:493 access/transam/xlogarchive.c:573 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "неможливо створити файл статусу архіву \"%s\": %m" + +#: access/transam/xlogarchive.c:501 access/transam/xlogarchive.c:581 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "неможливо записати файл архівного статусу \"%s\": %m" + +#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "резервне копіювання наразі триває в цьому сеансі" + +#: access/transam/xlogfuncs.c:126 +#, c-format +msgid "backup is not in progress" +msgstr "резервне копіювання не виконується" + +#: access/transam/xlogfuncs.c:127 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "Ви викликали pg_backup_start()?" + +#: 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 "WAL control functions cannot be executed during recovery." +msgstr "Функції управління WAL не можна використовувати під час відновлення." + +#: access/transam/xlogfuncs.c:198 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "Обраний рівень WAL не достатній для створення точки відновлення" + +#: access/transam/xlogfuncs.c:206 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "значення для точки відновлення перевищує межу (%d симв.)" + +#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s не можна використовувати під час відновлення." + +#: 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 "recovery is not in progress" +msgstr "відновлення не виконується" + +#: 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 "Recovery control functions can only be executed during recovery." +msgstr "Функції управління відновленням можна використовувати тільки під час відновлення." + +#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#, c-format +msgid "standby promotion is ongoing" +msgstr "просування в режимі очікування триває" + +#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s не може бути виконаний після того як підвищення запущено." + +#: access/transam/xlogfuncs.c:587 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" не має бути від'ємним чи нулем" + +#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:257 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "надіслати сигнал процесу postmaster не вдалося: %m" + +#: access/transam/xlogfuncs.c:643 +#, c-format +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/xlogprefetcher.c:1090 +#, c-format +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetch не підтримується на платформах, у яких відсутня posix_fadvise()." + +#: access/transam/xlogreader.c:620 +#, c-format +msgid "invalid record offset at %X/%X" +msgstr "невірний зсув запису: %X/%X" + +#: access/transam/xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "по зсуву %X/%X запитано продовження запису" + +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: wanted %u, got %u" +msgstr "невірна довжина запису по зсуву %X/%X: очікувалось %u, отримано %u" + +#: access/transam/xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "немає прапорця contrecord в позиції %X/%X" + +#: access/transam/xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X" + +#: access/transam/xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "невірний ID менеджера ресурсів %u в %X/%X" + +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X" + +#: access/transam/xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X" + +#: access/transam/xlogreader.c:1246 +#, c-format +msgid "invalid magic number %04X in log segment %s, offset %u" +msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u" + +#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1301 +#, c-format +msgid "invalid info bits %04X in log segment %s, offset %u" +msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u" + +#: access/transam/xlogreader.c:1275 +#, 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:1283 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки" + +#: access/transam/xlogreader.c:1289 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки" + +#: access/transam/xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u" + +#: access/transam/xlogreader.c:1345 +#, 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:1750 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" + +#: access/transam/xlogreader.c:1774 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X" + +#: access/transam/xlogreader.c:1781 +#, 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:1817 +#, 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:1833 +#, 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:1847 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X" + +#: access/transam/xlogreader.c:1862 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не встановлені, але довжина образу блока дорівнює %u в позиції %X/%X" + +#: access/transam/xlogreader.c:1878 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X" + +#: access/transam/xlogreader.c:1890 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" + +#: access/transam/xlogreader.c:1957 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "запис з невірною довжиною на %X/%X" + +#: access/transam/xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "не вдалося знайти блок резервної копії з ID %d у записі WAL" + +#: access/transam/xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "не вдалося відновити зображення %X/%X з недійсним вказаним блоком %d" + +#: access/transam/xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "не вдалося відновити зображення %X/%X з недійсним станом, блок %d" + +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "не вдалося відновити зображення в %X/%X, стиснуте %s, не підтримується збіркою, блок %d" -#: access/transam/xlog.c:6586 +#: access/transam/xlogreader.c:2126 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "робота системи бази даних була перервана; останній момент роботи %s" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "не вдалося відновити зображення %X/%X стиснуте з невідомим методом, блок %d" -#: access/transam/xlog.c:6592 +#: access/transam/xlogreader.c:2134 #, c-format -msgid "control file contains invalid database cluster state" -msgstr "контрольний файл містить недійсний стан кластеру бази даних" +msgid "could not decompress image at %X/%X, block %d" +msgstr "не вдалося розпакувати зображення на %X/%X, блок %d" -#: access/transam/xlog.c:6649 +#: access/transam/xlogrecovery.c:545 #, c-format msgid "entering standby mode" msgstr "перехід у режим очікування" -#: access/transam/xlog.c:6652 +#: access/transam/xlogrecovery.c:548 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "починається відновлення точки в часі до XID %u" -#: access/transam/xlog.c:6656 +#: access/transam/xlogrecovery.c:552 #, c-format msgid "starting point-in-time recovery to %s" msgstr "починається відновлення точки в часі до %s" -#: access/transam/xlog.c:6660 +#: access/transam/xlogrecovery.c:556 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "починається відновлення точки в часі до \"%s\"" -#: access/transam/xlog.c:6664 +#: access/transam/xlogrecovery.c:560 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "починається відновлення точки в часі до локації WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:6668 +#: access/transam/xlogrecovery.c:564 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "починається відновлення даних до першої точки домовленості" -#: access/transam/xlog.c:6671 +#: access/transam/xlogrecovery.c:567 #, c-format msgid "starting archive recovery" msgstr "початок відновлення архіву" -#: access/transam/xlog.c:6745 +#: access/transam/xlogrecovery.c:651 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "не вдалося знайти положення REDO, вказане записом контрольної точки" -#: access/transam/xlog.c:6746 access/transam/xlog.c:6756 +#: access/transam/xlogrecovery.c:652 access/transam/xlogrecovery.c:662 #, 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" @@ -2576,1524 +2958,1362 @@ msgstr "Якщо ви відновлюєте з резервної копії, "Якщо ви не відновлюєте з резервної копії, спробуйте видалити файл \"%s/backup_label\".\n" "Будьте обережні: видалення \"%s/backup_label\" призведе до пошкодження кластеру при відновленні з резервної копії." -#: access/transam/xlog.c:6755 +#: access/transam/xlogrecovery.c:661 #, c-format msgid "could not locate required checkpoint record" msgstr "не вдалося знайти запис потрібної контрольної точки" -#: access/transam/xlog.c:6784 commands/tablespace.c:665 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:685 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалося створити символічне послання \"%s\": %m" -#: access/transam/xlog.c:6816 access/transam/xlog.c:6822 +#: access/transam/xlogrecovery.c:722 access/transam/xlogrecovery.c:728 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" ігнорується, тому що файлу \"%s\" не існує" -#: access/transam/xlog.c:6818 access/transam/xlog.c:12353 +#: access/transam/xlogrecovery.c:724 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" був перейменований на \"%s\"." -#: access/transam/xlog.c:6824 +#: access/transam/xlogrecovery.c:730 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Неможливо перейменувати файл \"%s\" на \"%s\": %m." -#: access/transam/xlog.c:6875 +#: access/transam/xlogrecovery.c:784 #, c-format msgid "could not locate a valid checkpoint record" msgstr "не вдалося знайти запис допустимої контрольної точки" -#: access/transam/xlog.c:6913 +#: access/transam/xlogrecovery.c:808 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "запитувана лінія часу %u не є відгалуженням історії цього серверу" -#: access/transam/xlog.c:6915 +#: access/transam/xlogrecovery.c:810 #, 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:6929 +#: access/transam/xlogrecovery.c:824 #, 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:6959 +#: access/transam/xlogrecovery.c:852 #, c-format msgid "invalid next transaction ID" msgstr "невірний ID наступної транзакції" -#: access/transam/xlog.c:7059 +#: access/transam/xlogrecovery.c:857 #, c-format msgid "invalid redo in checkpoint record" msgstr "невірний запис REDO в контрольній точці" -#: access/transam/xlog.c:7070 +#: access/transam/xlogrecovery.c:868 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "невірний запис REDO в контрольній точці вимкнення" -#: access/transam/xlog.c:7110 +#: access/transam/xlogrecovery.c:897 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "робота системи бази даних не була завершена належним чином; відбувається автоматичне відновлення" -#: access/transam/xlog.c:7114 +#: access/transam/xlogrecovery.c:901 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "відновлення після збою починається на лінії часу %u і має цільову лінію часу: %u" -#: access/transam/xlog.c:7161 +#: access/transam/xlogrecovery.c:944 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label містить дані, які не узгоджені з файлом pg_control" -#: access/transam/xlog.c:7162 +#: access/transam/xlogrecovery.c:945 #, 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:7388 +#: access/transam/xlogrecovery.c:999 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "використання файлу команд відновлення \"%s\" не підтримується" + +#: access/transam/xlogrecovery.c:1064 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "режим очікування не підтримується однокористувацьким сервером" + +#: access/transam/xlogrecovery.c:1081 +#, c-format +msgid "specified neither primary_conninfo nor restore_command" +msgstr "не заззначено ані параметр primary_conninfo, ані параметр restore_command" + +#: access/transam/xlogrecovery.c:1082 +#, c-format +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "Сервер бази даних буде регулярно опитувати підкатолог pg_wal і перевіряти файли, що містяться у ньому." + +#: access/transam/xlogrecovery.c:1090 +#, c-format +msgid "must specify restore_command when standby mode is not enabled" +msgstr "необхідно вказати restore_command, якщо не ввімкнено режиму очікування" + +#: access/transam/xlogrecovery.c:1128 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "цільова лінія часу відновлення %u не існує" + +#: access/transam/xlogrecovery.c:1278 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "Проаналізовано ID часової лінії %u, очіувалося %u." + +#: access/transam/xlogrecovery.c:1660 #, c-format msgid "redo starts at %X/%X" msgstr "запис REDO починається з %X/%X" -#: access/transam/xlog.c:7613 +#: access/transam/xlogrecovery.c:1673 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "запис REDO триває, минуло часу: %ld.%02d s, поточний LSN: %X/%X" + +#: access/transam/xlogrecovery.c:1765 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "запитувана точка відновлення передує узгодженій точці відновлення" -#: access/transam/xlog.c:7651 +#: access/transam/xlogrecovery.c:1797 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "повторно виконано через %X/%X системне використання: %s" -#: access/transam/xlog.c:7657 +#: access/transam/xlogrecovery.c:1803 #, c-format msgid "last completed transaction was at log time %s" msgstr "остання завершена транзакція була в %s" -#: access/transam/xlog.c:7666 +#: access/transam/xlogrecovery.c:1812 #, c-format msgid "redo is not required" msgstr "дані REDO не потрібні" -#: access/transam/xlog.c:7678 +#: access/transam/xlogrecovery.c:1823 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "відновлення завершилось до досягення налаштованої цілі відновлення" -#: access/transam/xlog.c:7762 access/transam/xlog.c:7766 -#, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL завершився до завершення онлайн резервного копіювання" - -#: access/transam/xlog.c:7763 -#, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "Всі журнали WAL, створені під час резервного копіювання \"на ходу\", повинні бути в наявності для відновлення." - -#: access/transam/xlog.c:7767 -#, 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:7770 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WAL завершився до узгодженої точки відновлення" - -#: access/transam/xlog.c:7805 +#: access/transam/xlogrecovery.c:1998 #, c-format -msgid "selected new timeline ID: %u" -msgstr "вибрано новий ID часової лінії: %u" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "успішно пропущений відсутній contrecord при %X/%X, перезаписано на %s" -#: access/transam/xlog.c:8249 +#: access/transam/xlogrecovery.c:2065 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "знайдено неочікуваний запис каталогу \"%s\" в %s" -#: access/transam/xlog.c:8251 +#: access/transam/xlogrecovery.c:2067 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Всі записи каталогу в pg_tblspc/ повинні бути символічними посиланнями." -#: access/transam/xlog.c:8252 +#: access/transam/xlogrecovery.c:2068 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." msgstr "Видаліть ті каталоги, або тимчасово встановіть для параметра allow_in_place_tablespaces значення ON, щоб завершити відновлення." -#: access/transam/xlog.c:8336 +#: access/transam/xlogrecovery.c:2142 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "узгоджений стан відновлення досягнутий %X/%X" -#: access/transam/xlog.c:8545 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "невірне посилання на первинну контрольну точку в контрольному файлі" - -#: access/transam/xlog.c:8549 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "невірне посилання на контрольну точку в файлі backup_label" - -#: access/transam/xlog.c:8567 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "невірний запис первинної контрольної точки" - -#: access/transam/xlog.c:8571 -#, c-format -msgid "invalid checkpoint record" -msgstr "невірний запис контрольної точки" - -#: access/transam/xlog.c:8582 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "невірний ID менеджера ресурсів в записі первинної контрольної точки" - -#: access/transam/xlog.c:8586 -#, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "невірний ID менеджера ресурсів в записі контрольної точки" - -#: access/transam/xlog.c:8599 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "невірний xl_info у записі первинної контрольної точки" - -#: access/transam/xlog.c:8603 -#, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "невірний xl_info у записі контрольної точки" - -#: access/transam/xlog.c:8614 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "невірна довжина запису первинної контрольної очки" - -#: access/transam/xlog.c:8618 -#, c-format -msgid "invalid length of checkpoint record" -msgstr "невірна довжина запису контрольної точки" - -#: access/transam/xlog.c:8799 -#, c-format -msgid "shutting down" -msgstr "завершення роботи" - -#. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:8838 -#, 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:8850 -#, c-format -msgid "checkpoint starting:%s%s%s%s%s%s%s%s" -msgstr "початок контрольної точки: %s%s%s%s%s%s%s%s" - -#: access/transam/xlog.c:8910 -#, 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:8930 -#, 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 "контрольна точка завершена: записано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запис=%ld.%03d сек, синхронізація=%ld.%03d сек, усього=%ld.%03d сек; файли синхронізації=%d, найдовший=%ld.%03d сек, середній=%ld.%03d сек; дистанція=%d кб, приблизно=%d кб" - -#: access/transam/xlog.c:9374 -#, c-format -msgid "concurrent write-ahead log activity while database system is shutting down" -msgstr "під час того вимкнення БД помічено конкурентну активність у випереджувальному журналюванні" - -#: access/transam/xlog.c:9907 -#, c-format -msgid "recovery restart point at %X/%X" -msgstr "відновлення збереженої точки %X/%X" - -#: access/transam/xlog.c:9909 -#, c-format -msgid "Last completed transaction was at log time %s." -msgstr "Остання завершена транзакція була в %s." - -#: access/transam/xlog.c:10155 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2180 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "точка відновлення \"%s\" створена в %X/%X" +msgid "WAL redo at %X/%X for %s" +msgstr "запис REDO в WAL в позиції %X/%X для %s" -#: access/transam/xlog.c:10300 +#: access/transam/xlogrecovery.c:2276 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "несподіваний ID попередньої лінії часу %u (ID теперішньої лінії часу %u) в записі контрольної точки" -#: access/transam/xlog.c:10309 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неочікуваний ID лінії часу %u (після %u) в записі контрольної точки" -#: access/transam/xlog.c:10325 +#: access/transam/xlogrecovery.c:2301 #, 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:10400 -#, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "онлайн резервне копіювання скасовано, неможливо продовжити відновлення" - -#: access/transam/xlog.c:10456 access/transam/xlog.c:10512 -#: access/transam/xlog.c:10542 -#, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "несподіваний ID лінії часу %u (повинен бути %u) в записі контрольної точки" - -#: access/transam/xlog.c:10700 -#, c-format -msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" -msgstr "успішно пропущений відсутній contrecord при %X/%X, перезаписано на %s" - -#: access/transam/xlog.c:10915 -#, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "не вдалосьясинхронізувати файл наскрізного запису %s: %m" - -#: access/transam/xlog.c:10921 -#, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "не вдалося fdatasync файл \"%s\": %m" - -#: access/transam/xlog.c:11032 access/transam/xlog.c:11569 -#: 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 "Функції управління WAL не можна використовувати під час відновлення." - -#: access/transam/xlog.c:11041 access/transam/xlog.c:11578 -#, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "Обраний рівень WAL недостатній для резервного копіювання \"на ходу\"" - -#: access/transam/xlog.c:11042 access/transam/xlog.c:11579 -#: 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:11047 -#, c-format -msgid "backup label too long (max %d bytes)" -msgstr "мітка резервного копіювання задовга (максимум %d байт)" - -#: access/transam/xlog.c:11084 access/transam/xlog.c:11368 -#: access/transam/xlog.c:11406 +#: access/transam/xlogrecovery.c:2485 access/transam/xlogrecovery.c:2761 #, c-format -msgid "a backup is already in progress" -msgstr "резервне копіювання вже триває" +msgid "recovery stopping after reaching consistency" +msgstr "відновлення зупиняється після досягнення узгодженості" -#: access/transam/xlog.c:11085 +#: access/transam/xlogrecovery.c:2506 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Запустіть pg_stop_backup() і спробуйте знову." +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "відновлення зупиняється перед позицією WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:11181 +#: access/transam/xlogrecovery.c:2596 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "Після останньої точки відновлення був відтворений WAL, створений в режимі full_page_writes=off" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "відновлення припиняється до підтвердження транзакції %u, час %s" -#: access/transam/xlog.c:11183 access/transam/xlog.c:11774 +#: access/transam/xlogrecovery.c:2603 #, 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 "recovery stopping before abort of transaction %u, time %s" +msgstr "відновлення припиняється до скасування транзакції %u, час %s" -#: access/transam/xlog.c:11267 replication/basebackup.c:1439 -#: utils/adt/misc.c:374 +#: access/transam/xlogrecovery.c:2656 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "таргет символічного посилання \"%s\" задовгий" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "відновлення припиняється в точці відновлення\"%s\", час %s" -#: access/transam/xlog.c:11317 commands/tablespace.c:385 -#: commands/tablespace.c:561 replication/basebackup.c:1454 utils/adt/misc.c:382 +#: access/transam/xlogrecovery.c:2674 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "табличний простір не підтримується на цій платформі" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "відновлення припиняється пісня локації WAL (LSN) \"%X/%X\"" -#: access/transam/xlog.c:11369 access/transam/xlog.c:11407 +#: access/transam/xlogrecovery.c:2741 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "Якщо ви вважаєте, що жодне резервне копіювання не триває, видаліть файл \"%s\" і спробуйте знову." +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "відновлення припиняється після підтвердження транзакції %u, час %s" -#: access/transam/xlog.c:11594 +#: access/transam/xlogrecovery.c:2749 #, c-format -msgid "exclusive backup not in progress" -msgstr "ексклюзивне резервне копіювання не виконується" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "відновлення припиняється після скасування транзакції %u, час %s" -#: access/transam/xlog.c:11621 +#: access/transam/xlogrecovery.c:2830 #, c-format -msgid "a backup is not in progress" -msgstr "резервне копіювання не виконується" +msgid "pausing at the end of recovery" +msgstr "пауза в кінці відновлення" -#: access/transam/xlog.c:11707 access/transam/xlog.c:11720 -#: access/transam/xlog.c:12111 access/transam/xlog.c:12117 -#: access/transam/xlog.c:12165 access/transam/xlog.c:12245 -#: access/transam/xlog.c:12269 access/transam/xlogfuncs.c:733 +#: access/transam/xlogrecovery.c:2831 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "невірні дані у файлі \"%s\"" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Виконайте pg_wal_replay_resume() для підвищення рівня." -#: access/transam/xlog.c:11724 replication/basebackup.c:1287 +#: access/transam/xlogrecovery.c:2834 access/transam/xlogrecovery.c:4644 #, c-format -msgid "the standby was promoted during online backup" -msgstr "режим очікування було підвищено у процесі резервного копіювання \"на ходу\"" +msgid "recovery has paused" +msgstr "відновлення зупинено" -#: access/transam/xlog.c:11725 replication/basebackup.c:1288 +#: access/transam/xlogrecovery.c:2835 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "Це означає, що вибрана резервна копія є пошкодженою і її не слід використовувати. Спробуйте використати іншу онлайн резервну копію." +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Виконайте pg_wal_replay_resume(), щоб продовжити." -#: access/transam/xlog.c:11772 +#: access/transam/xlogrecovery.c:3101 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "У процесі резервного копіювання \"на ходу\" був відтворений WAL, створений в режимі full_page_writes=off" +msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgstr "неочіукваний ID лінії часу %u в сегменті журналу %s, зсув %u" -#: access/transam/xlog.c:11892 +#: access/transam/xlogrecovery.c:3306 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "резервне копіювання виконане, очікуються необхідні сегменти WAL для архівації" +msgid "could not read from log segment %s, offset %u: %m" +msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: %m" -#: access/transam/xlog.c:11904 +#: access/transam/xlogrecovery.c:3312 #, c-format -msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "все ще чекає на необхідні сегменти WAL для архівації (%d секунд пройшло)" +msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: прочитано %d з %zu" -#: access/transam/xlog.c:11906 +#: access/transam/xlogrecovery.c:3961 #, 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 "invalid primary checkpoint link in control file" +msgstr "невірне посилання на первинну контрольну точку в контрольному файлі" -#: access/transam/xlog.c:11913 +#: access/transam/xlogrecovery.c:3965 #, c-format -msgid "all required WAL segments have been archived" -msgstr "усі необхідні сегменти WAL архівовані" +msgid "invalid checkpoint link in backup_label file" +msgstr "невірне посилання на контрольну точку в файлі backup_label" -#: access/transam/xlog.c:11917 +#: access/transam/xlogrecovery.c:3983 #, 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 "invalid primary checkpoint record" +msgstr "невірний запис первинної контрольної точки" -#: access/transam/xlog.c:11972 +#: access/transam/xlogrecovery.c:3987 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" -msgstr "припинення резервного копіювання через завершення обслуговуючого процесу до виклику pg_stop_backup" +msgid "invalid checkpoint record" +msgstr "невірний запис контрольної точки" -#: access/transam/xlog.c:12166 +#: access/transam/xlogrecovery.c:3998 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "Проаналізовано ID часової лінії %u, очіувалося %u." +msgid "invalid resource manager ID in primary checkpoint record" +msgstr "невірний ID менеджера ресурсів в записі первинної контрольної точки" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:12294 +#: access/transam/xlogrecovery.c:4002 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "запис REDO в WAL в позиції %X/%X для %s" +msgid "invalid resource manager ID in checkpoint record" +msgstr "невірний ID менеджера ресурсів в записі контрольної точки" -#: access/transam/xlog.c:12342 +#: access/transam/xlogrecovery.c:4015 #, c-format -msgid "online backup mode was not canceled" -msgstr "режим копіювання онлайн не був відмінений" +msgid "invalid xl_info in primary checkpoint record" +msgstr "невірний xl_info у записі первинної контрольної точки" -#: access/transam/xlog.c:12343 +#: access/transam/xlogrecovery.c:4019 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "Файл \"%s\" не може бути перейменований на \"%s\": %m." +msgid "invalid xl_info in checkpoint record" +msgstr "невірний xl_info у записі контрольної точки" -#: access/transam/xlog.c:12352 access/transam/xlog.c:12364 -#: access/transam/xlog.c:12374 +#: access/transam/xlogrecovery.c:4030 #, c-format -msgid "online backup mode canceled" -msgstr "режим копіювання онлайн був відмінений" +msgid "invalid length of primary checkpoint record" +msgstr "невірна довжина запису первинної контрольної очки" -#: access/transam/xlog.c:12365 +#: access/transam/xlogrecovery.c:4034 #, c-format -msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "Файли \"%s\" і \"%s\" було перейменовано на \"%s\" і \"%s\" відповідно." +msgid "invalid length of checkpoint record" +msgstr "невірна довжина запису контрольної точки" -#: access/transam/xlog.c:12375 +#: access/transam/xlogrecovery.c:4090 #, 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 "new timeline %u is not a child of database system timeline %u" +msgstr "нова лінія часу %u не є дочірньою для лінії часу системи бази даних %u" -#: access/transam/xlog.c:12508 access/transam/xlogutils.c:967 +#: access/transam/xlogrecovery.c:4104 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: %m" +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:12514 access/transam/xlogutils.c:974 +#: access/transam/xlogrecovery.c:4123 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "не вдалося прочитати сегмент журналу %s, зсув %u: прочитано %d з %zu" +msgid "new target timeline is %u" +msgstr "нова цільова лінія часу %u" -#: access/transam/xlog.c:13065 +#: access/transam/xlogrecovery.c:4326 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Запит на вимкнення процесу приймача WAL" -#: access/transam/xlog.c:13160 +#: access/transam/xlogrecovery.c:4389 #, c-format msgid "received promote request" msgstr "отримано запит підвищення статусу" -#: access/transam/xlog.c:13173 +#: access/transam/xlogrecovery.c:4402 #, c-format msgid "promote trigger file found: %s" msgstr "знайдено файл тригера підвищення: %s" -#: access/transam/xlog.c:13181 +#: access/transam/xlogrecovery.c:4410 #, c-format msgid "could not stat promote trigger file \"%s\": %m" msgstr "не вдалося отримати інформацію про файл тригера підвищення \"%s\": %m" -#: access/transam/xlogarchive.c:205 +#: access/transam/xlogrecovery.c:4635 #, c-format -msgid "archive file \"%s\" has wrong size: %lld instead of %lld" -msgstr "файл архіву \"%s\" має неправильний розмір: %lld замість %lld" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "hot standby неможливий через недостатнє налаштування параметрів" -#: access/transam/xlogarchive.c:214 +#: access/transam/xlogrecovery.c:4636 access/transam/xlogrecovery.c:4663 +#: access/transam/xlogrecovery.c:4693 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "відновлений файл журналу \"%s\" з архіву" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d є нижчим параметром, ніж на основному сервері, де його значення було %d." -#: access/transam/xlogarchive.c:228 +#: access/transam/xlogrecovery.c:4645 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command повернула нульовий статус виходу, але stat() не вдався." +msgid "If recovery is unpaused, the server will shut down." +msgstr "Якщо відновлення не буде зупинено, сервер завершить роботу." -#: access/transam/xlogarchive.c:260 +#: access/transam/xlogrecovery.c:4646 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "неможливо відновити файл \"%s\" з архіву: %s" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "Після здійснення необхідних змін у конфігурації, ви можете перезапустити сервер." -#. 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:4657 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "підвищення неможливе через недостатнє налаштування параметрів" -#: access/transam/xlogarchive.c:479 access/transam/xlogarchive.c:543 +#: access/transam/xlogrecovery.c:4667 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "неможливо створити файл статусу архіву \"%s\": %m" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Перезапустити сервер після здійснення необхідних змін у конфігурації." -#: access/transam/xlogarchive.c:487 access/transam/xlogarchive.c:551 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "неможливо записати файл архівного статусу \"%s\": %m" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "відновлення перервано через недостатнє налаштування параметрів" -#: access/transam/xlogfuncs.c:74 replication/basebackup.c:940 +#: access/transam/xlogrecovery.c:4697 #, c-format -msgid "a backup is already in progress in this session" -msgstr "резервне копіювання наразі триває в цьому сеансі" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "Ви можете перезапустити сервер, після здійснення необхідних змін у конфігурації." -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: access/transam/xlogutils.c:1053 #, c-format -msgid "non-exclusive backup in progress" -msgstr "виконується не ексклюзивне резервне копіювання" +msgid "could not read from log segment %s, offset %d: %m" +msgstr "не вдалося прочитати сегмент журналу %s, зсув %d: %m" -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: access/transam/xlogutils.c:1060 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "Ви мали на увазі використаня pg_stop_backup('f')?" +msgid "could not read from log segment %s, offset %d: read %d of %d" +msgstr "не вдалося прочитати сегмент журналу %s, зсув %d: прочитано %d з %d" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1311 -#: commands/event_trigger.c:1869 commands/extension.c:1966 -#: commands/extension.c:2074 commands/extension.c:2359 commands/prepare.c:713 -#: executor/execExpr.c:2510 executor/execSRF.c:738 executor/functions.c:1073 -#: 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:3328 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4812 utils/adt/genfile.c:507 -#: utils/adt/genfile.c:590 utils/adt/jsonfuncs.c:1944 -#: utils/adt/jsonfuncs.c:2056 utils/adt/jsonfuncs.c:2244 -#: utils/adt/jsonfuncs.c:2353 utils/adt/jsonfuncs.c:3814 -#: utils/adt/mcxtfuncs.c:132 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:477 -#: utils/adt/pgstatfuncs.c:587 utils/adt/pgstatfuncs.c:1887 -#: utils/adt/varlena.c:4821 utils/fmgr/funcapi.c:74 utils/misc/guc.c:10017 -#: utils/mmgr/portalmem.c:1145 +#: backup/backup_manifest.c:253 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" +msgid "expected end timeline %u but found timeline %u" +msgstr "очікувався кінець часової шкали %u але знайдено часову шкалу %u" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1315 -#: commands/event_trigger.c:1873 commands/extension.c:1970 -#: commands/extension.c:2078 commands/extension.c:2363 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:3332 -#: 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:223 -#: utils/adt/pgstatfuncs.c:481 utils/adt/pgstatfuncs.c:591 -#: utils/adt/pgstatfuncs.c:1891 utils/adt/varlena.c:4825 utils/misc/guc.c:10021 -#: utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1149 +#: backup/backup_manifest.c:277 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" +msgid "expected start timeline %u but found timeline %u" +msgstr "очікувався початок часової шкали %u але знайдено часову шкалу %u" -#: access/transam/xlogfuncs.c:230 +#: backup/backup_manifest.c:304 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "не ексклюзивне резервне копіювання не виконується" +msgid "start timeline %u not found in history of timeline %u" +msgstr "початок часової шкали %u не знайдено в історії часової шкали %u" -#: access/transam/xlogfuncs.c:231 +#: backup/backup_manifest.c:355 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "Ви мали на увазі використаня pg_stop_backup('t')?" +msgid "could not rewind temporary file" +msgstr "не вдалося перемотати назад тимчасовий файл" -#: access/transam/xlogfuncs.c:307 +#: backup/backup_manifest.c:374 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "Обраний рівень WAL не достатній для створення точки відновлення" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "не вдалося прочитати тимчасовий файл: прочитано лише %zu з %zu байт" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:454 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "значення для точки відновлення перевищує межу (%d симв.)" +msgid "could not find any WAL files" +msgstr "не вдалося знайти ні одного файла WAL" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s не можна використовувати під час відновлення." +msgid "could not find WAL file \"%s\"" +msgstr "не вдалося знайти файл WAL \"%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 +#: backup/basebackup.c:535 backup/basebackup.c:560 #, c-format -msgid "recovery is not in progress" -msgstr "відновлення не виконується" +msgid "unexpected WAL file size \"%s\"" +msgstr "неочікуаний розмір файлу WAL \"%s\"" -#: 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 +#: backup/basebackup.c:630 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Функції управління відновленням можна використовувати тільки під час відновлення." +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "всього помилок перевірки контрольних сум: %lld" +msgstr[1] "всього помилок перевірки контрольних сум: %lld" +msgstr[2] "всього помилок перевірки контрольних сум: %lld" +msgstr[3] "всього помилок перевірки контрольних сум: %lld" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: backup/basebackup.c:637 #, c-format -msgid "standby promotion is ongoing" -msgstr "просування в режимі очікування триває" +msgid "checksum verification failure during base backup" +msgstr "під час базового резервного копіювання виявлено неполадки контрольних сум" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 +#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 +#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 +#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 +#: backup/basebackup.c:861 backup/basebackup.c:874 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s не може бути виконаний після того як підвищення запущено." +msgid "duplicate option \"%s\"" +msgstr "повторюваний параметр \"%s\"" -#: access/transam/xlogfuncs.c:769 +#: backup/basebackup.c:734 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\" не має бути від'ємним чи нулем" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "нерозпізнаний тип контрольної точки: \"%s\"" -#: access/transam/xlogfuncs.c:789 storage/ipc/signalfuncs.c:247 +#: backup/basebackup.c:769 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "надіслати сигнал процесу postmaster не вдалося: %m" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d за припустимим діапазномо для параметру \"%s\" (%d .. %d)" -#: access/transam/xlogfuncs.c:825 +#: backup/basebackup.c:814 #, c-format -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 секунд" +msgid "unrecognized manifest option: \"%s\"" +msgstr "нерозпізнаний параметр маніфесту: \"%s\"" -#: access/transam/xlogreader.c:354 +#: backup/basebackup.c:830 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "невірний зсув запису: %X/%X" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\"" -#: access/transam/xlogreader.c:362 +#: backup/basebackup.c:865 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "по зсуву %X/%X запитано продовження запису" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм стискання: \"%s\"" -#: access/transam/xlogreader.c:403 access/transam/xlogreader.c:733 +#: backup/basebackup.c:881 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "невірна довжина запису по зсуву %X/%X: очікувалось %u, отримано %u" +msgid "unrecognized base backup option: \"%s\"" +msgstr "нерозпізнаний параметр базової резервної копії: \"%s\"" -#: access/transam/xlogreader.c:429 +#: backup/basebackup.c:892 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "довжина запису %u на %X/%X є задовгою" +msgid "manifest checksums require a backup manifest" +msgstr "контрольні суми маніфесту потребують резервного копіювання маніфесту" -#: access/transam/xlogreader.c:477 +#: backup/basebackup.c:901 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "немає позначки contrecord в позиції %X/%X" +msgid "target detail cannot be used without target" +msgstr "елемент цілі не можна використовувати без цілі" -#: access/transam/xlogreader.c:490 +#: backup/basebackup.c:910 backup/basebackup_target.c:218 #, c-format -msgid "invalid contrecord length %u (expected %lld) at %X/%X" -msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X" +msgid "target \"%s\" does not accept a target detail" +msgstr "ціль \"%s\" не приймає елемент цілі" -#: access/transam/xlogreader.c:741 +#: backup/basebackup.c:921 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "невірний ID менеджера ресурсів %u в %X/%X" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "деталі стиснення не можуть бути вказані, якщо не увімкнено стиснення" -#: access/transam/xlogreader.c:754 access/transam/xlogreader.c:770 +#: backup/basebackup.c:934 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X" +msgid "invalid compression specification: %s" +msgstr "неприпустима специфікація стискання: %s" -#: access/transam/xlogreader.c:806 +#: backup/basebackup.c:1431 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X" +msgid "skipping special file \"%s\"" +msgstr "спеціальний файл \"%s\" пропускається" -#: access/transam/xlogreader.c:843 +#: backup/basebackup.c:1550 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u" +msgid "invalid segment number %d in file \"%s\"" +msgstr "неприпустимий номер сегменту %d в файлі \"%s\"" -#: access/transam/xlogreader.c:857 access/transam/xlogreader.c:898 +#: backup/basebackup.c:1582 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "не вдалося перевірити контрольну суму у файлі \"%s\", блок %u: розмір прочитаного буфера %d і розмір прочитаної сторінки %d відрізняються" -#: access/transam/xlogreader.c:872 +#: backup/basebackup.c:1656 #, 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 "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "помилка перевірки контрольної суми у файлі \"%s\", блок %u: обчислено %X, але очікувалось %X" -#: access/transam/xlogreader.c:880 +#: backup/basebackup.c:1663 #, c-format -msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "про подальші помилки під час перевірки контрольної суми в файлі \"%s\" повідомлятись не буде" -#: access/transam/xlogreader.c:886 +#: backup/basebackup.c:1719 #, c-format -msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки" +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" +msgstr[2] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" +msgstr[3] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" -#: access/transam/xlogreader.c:917 +#: backup/basebackup.c:1765 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u" +msgid "file name too long for tar format: \"%s\"" +msgstr "ім'я файлу занадто довге для tar формату: \"%s\"" -#: access/transam/xlogreader.c:942 +#: backup/basebackup.c:1770 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "порушення послідовності ID лінії часу %u (після %u) в сегменті журналу %s, зсув %u" +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "мета символьного посилання занадто довга для формату tar: ім'я файлу \"%s\", мета \"%s\"" -#: access/transam/xlogreader.c:1287 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" +msgid "gzip compression is not supported by this build" +msgstr "стискання gzip не підтримується цією збіркою" -#: access/transam/xlogreader.c:1309 +#: backup/basebackup_gzip.c:143 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X" +msgid "could not initialize compression library" +msgstr "не вдалося ініціалізувати бібліотеку стискання" -#: access/transam/xlogreader.c:1316 +#: backup/basebackup_lz4.c:67 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA встановлений, але довжина даних дорівнює %u в позиції %X/%X" +msgid "lz4 compression is not supported by this build" +msgstr "стискання lz4 не підтримується цією збіркою" -#: access/transam/xlogreader.c:1352 +#: backup/basebackup_server.c:75 #, 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" +msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgstr "потрібно бути суперкористувачем або роллю з правами ролі pg_write_server_files для створення резервної копії сервера" -#: access/transam/xlogreader.c:1368 +#: backup/basebackup_server.c:89 #, 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" +msgid "relative path not allowed for backup stored on server" +msgstr "відносний шлях не дозволений для резервного копіювання збереженого на сервері" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не вдалося створити каталог \"%s\": %m" -#: access/transam/xlogreader.c:1383 +#: backup/basebackup_server.c:115 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_IS_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X" +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" існує, але він не порожній" -#: access/transam/xlogreader.c:1398 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1090 #, 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" +msgid "could not access directory \"%s\": %m" +msgstr "немає доступу до каталогу \"%s\": %m" -#: access/transam/xlogreader.c:1414 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: storage/smgr/md.c:490 storage/smgr/md.c:497 storage/smgr/md.c:788 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X" +msgid "Check free disk space." +msgstr "Перевірьте вільний дисковий простір." -#: access/transam/xlogreader.c:1426 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "не вдалося записати файл \"%s\": записано лише %d з %d байтів зі зсувом %u" -#: access/transam/xlogreader.c:1513 +#: backup/basebackup_target.c:146 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "запис з невірною довжиною на %X/%X" +msgid "unrecognized target: \"%s\"" +msgstr "нерозпізнана ціль: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "ціль \"%s\" потребує елемент цілі" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "стискання zstd не підтримується цією збіркою" -#: access/transam/xlogreader.c:1602 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "невірно стиснутий образ в позиції %X/%X, блок %d" +msgid "could not set compression worker count to %d: %s" +msgstr "не вдалося встановити кількість процесів стискання на %d: %s" -#: 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 необхідне число, яке дорівнює ступеню 2 в інтервалі від 1 МБ до 1 ГБ" -#: bootstrap/bootstrap.c:287 postmaster/postmaster.c:847 tcop/postgres.c:3881 +#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 #, c-format msgid "--%s requires a value" msgstr "--%s необхідне значення" -#: bootstrap/bootstrap.c:292 postmaster/postmaster.c:852 tcop/postgres.c:3886 +#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 #, c-format msgid "-c %s requires a value" msgstr "-c %s необхідне значення" -#: 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 "Спробуйте \"%s --help\" для додаткової інформації.\n" -#: bootstrap/bootstrap.c:312 +#: 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 "для стовпця \"%s\" відношення \"%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 "для стовпця \"%s\" відношення \"%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 "для стовпця \"%s\" відношення \"%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 "для стовпця \"%s\" відношення \"%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:379 +#: catalog/aclchk.c:386 #, c-format msgid "grantor must be current user" msgstr "грантодавець повинен бути поточним користувачем" -#: 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 "недійсний тип права %s для відношення" -#: 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 "невірний тип права %s для послідовності" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:462 #, c-format msgid "invalid privilege type %s for database" msgstr "недійсний тип права %s для бази даних" -#: catalog/aclchk.c:458 +#: catalog/aclchk.c:466 #, c-format msgid "invalid privilege type %s for domain" msgstr "недійсний тип права %s для домену" -#: 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 "недійсний тип права %s для функції" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:474 #, c-format msgid "invalid privilege type %s for language" msgstr "недійсний тип права %s для мови" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for large object" msgstr "недійсний тип права %s для великого об'єкту" -#: 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 "недійсний тип привілеїв %s для схеми" -#: 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 "недійсний тип привілеїв %s для процедури" -#: 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 "недійсний тип привілею %s для підпрограми" -#: catalog/aclchk.c:486 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "недійсний тип привілеїв %s для табличного простору" -#: 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 "недійсний тип привілею %s для типу" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:502 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "недійсний тип привілею %s для джерела сторонніх даних" -#: catalog/aclchk.c:498 +#: catalog/aclchk.c:506 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "недійсний тип привілею%s для стороннього серверу" -#: catalog/aclchk.c:537 +#: 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:697 catalog/aclchk.c:4164 catalog/aclchk.c:4985 -#: catalog/objectaddress.c:1060 catalog/pg_largeobject.c:116 +#: 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:926 catalog/aclchk.c:935 commands/collationcmds.c:119 -#: commands/copy.c:365 commands/copy.c:385 commands/copy.c:395 -#: commands/copy.c:404 commands/copy.c:413 commands/copy.c:423 -#: commands/copy.c:432 commands/copy.c:441 commands/copy.c:459 -#: commands/copy.c:475 commands/copy.c:495 commands/copy.c:512 -#: commands/dbcommands.c:158 commands/dbcommands.c:167 -#: commands/dbcommands.c:176 commands/dbcommands.c:185 -#: commands/dbcommands.c:194 commands/dbcommands.c:203 -#: commands/dbcommands.c:212 commands/dbcommands.c:221 -#: commands/dbcommands.c:230 commands/dbcommands.c:239 -#: commands/dbcommands.c:261 commands/dbcommands.c:1529 -#: commands/dbcommands.c:1538 commands/dbcommands.c:1547 -#: commands/dbcommands.c:1556 commands/extension.c:1757 -#: commands/extension.c:1767 commands/extension.c:1777 -#: commands/extension.c:3074 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:2096 commands/functioncmds.c:2104 -#: commands/publicationcmds.c:87 commands/publicationcmds.c:130 -#: commands/sequence.c:1274 commands/sequence.c:1284 commands/sequence.c:1294 -#: commands/sequence.c:1304 commands/sequence.c:1314 commands/sequence.c:1324 -#: commands/sequence.c:1334 commands/sequence.c:1344 commands/sequence.c:1354 -#: 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:7629 -#: 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:408 -#: replication/pgoutput/pgoutput.c:190 replication/pgoutput/pgoutput.c:211 -#: replication/pgoutput/pgoutput.c:225 replication/pgoutput/pgoutput.c:235 -#: replication/pgoutput/pgoutput.c:245 replication/walsender.c:883 -#: replication/walsender.c:894 replication/walsender.c:904 -#, c-format -msgid "conflicting or redundant options" -msgstr "конфліктуючі або надлишкові параметри" - -#: catalog/aclchk.c:1046 +#: catalog/aclchk.c:1086 #, c-format msgid "default privileges cannot be set for columns" msgstr "права за замовчуванням не можна встановити для стовпців" -#: catalog/aclchk.c:1206 +#: catalog/aclchk.c:1246 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "речення IN SCHEMA не можна використати в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1544 catalog/catalog.c:557 catalog/objectaddress.c:1522 -#: commands/analyze.c:390 commands/copy.c:744 commands/sequence.c:1709 -#: commands/tablecmds.c:7092 commands/tablecmds.c:7248 -#: commands/tablecmds.c:7298 commands/tablecmds.c:7372 -#: commands/tablecmds.c:7442 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7648 commands/tablecmds.c:7707 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7825 -#: commands/tablecmds.c:7980 commands/tablecmds.c:8062 -#: commands/tablecmds.c:8218 commands/tablecmds.c:8336 -#: commands/tablecmds.c:11726 commands/tablecmds.c:11907 -#: commands/tablecmds.c:12067 commands/tablecmds.c:13210 -#: commands/tablecmds.c:15756 commands/trigger.c:942 parser/analyze.c:2422 -#: parser/parse_relation.c:714 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3432 -#: parser/parse_utilcmd.c:3468 parser/parse_utilcmd.c:3510 utils/adt/acl.c:2845 -#: utils/adt/ruleutils.c:2734 +#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 +#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:779 +#: commands/sequence.c:1663 commands/tablecmds.c:7271 commands/tablecmds.c:7427 +#: commands/tablecmds.c:7477 commands/tablecmds.c:7551 +#: commands/tablecmds.c:7621 commands/tablecmds.c:7733 +#: commands/tablecmds.c:7827 commands/tablecmds.c:7886 +#: commands/tablecmds.c:7975 commands/tablecmds.c:8005 +#: commands/tablecmds.c:8133 commands/tablecmds.c:8215 +#: commands/tablecmds.c:8371 commands/tablecmds.c:8489 +#: commands/tablecmds.c:12218 commands/tablecmds.c:12399 +#: commands/tablecmds.c:12559 commands/tablecmds.c:13723 +#: commands/tablecmds.c:16292 commands/trigger.c:954 parser/analyze.c:2506 +#: parser/parse_relation.c:725 parser/parse_target.c:1063 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3435 +#: parser/parse_utilcmd.c:3471 parser/parse_utilcmd.c:3513 utils/adt/acl.c:2869 +#: utils/adt/ruleutils.c:2830 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "стовпець \"%s\" зв'язку \"%s\" не існує" -#: catalog/aclchk.c:1807 catalog/objectaddress.c:1362 commands/sequence.c:1147 -#: commands/tablecmds.c:249 commands/tablecmds.c:16620 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:1172 +#: commands/tablecmds.c:253 commands/tablecmds.c:17164 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:1845 +#: catalog/aclchk.c:1888 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "послідовність \"%s\" підтримує лише привілеї USAGE, SELECT та UPDATE" -#: catalog/aclchk.c:1862 +#: catalog/aclchk.c:1905 #, c-format msgid "invalid privilege type %s for table" msgstr "недійсний тип привілею %s для таблиці" -#: catalog/aclchk.c:2028 +#: catalog/aclchk.c:2071 #, c-format msgid "invalid privilege type %s for column" msgstr "недійсний тип права %s для стовпця" -#: catalog/aclchk.c:2041 +#: catalog/aclchk.c:2084 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "послідовність \"%s\" підтримує тільки право стовпця SELECT" -#: catalog/aclchk.c:2623 +#: catalog/aclchk.c:2666 #, c-format msgid "language \"%s\" is not trusted" msgstr "мова \"%s\" не є довіреною" -#: 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 і REVOKE не допустимі для недовірених мов, тому що тільки суперкористувачі можуть використовувати недовірені мови." -#: catalog/aclchk.c:3139 +#: catalog/aclchk.c:3182 #, c-format msgid "cannot set privileges of array types" msgstr "не можна встановити права для типів масивів" -#: catalog/aclchk.c:3140 +#: catalog/aclchk.c:3183 #, c-format msgid "Set the privileges of the element type instead." msgstr "Замість цього встановіть права для типу елементу." -#: 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\" не є доменом" -#: catalog/aclchk.c:3267 +#: catalog/aclchk.c:3462 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нерозпізнане право \"%s\"" -#: catalog/aclchk.c:3328 +#: catalog/aclchk.c:3527 #, c-format msgid "permission denied for aggregate %s" msgstr "немає дозволу для агрегату %s" -#: catalog/aclchk.c:3331 +#: catalog/aclchk.c:3530 #, c-format msgid "permission denied for collation %s" msgstr "немає дозволу для сортування %s" -#: catalog/aclchk.c:3334 +#: catalog/aclchk.c:3533 #, c-format msgid "permission denied for column %s" msgstr "немає дозволу для стовпця %s" -#: catalog/aclchk.c:3337 +#: catalog/aclchk.c:3536 #, c-format msgid "permission denied for conversion %s" msgstr "немає дозволу для перетворення %s" -#: catalog/aclchk.c:3340 +#: catalog/aclchk.c:3539 #, c-format msgid "permission denied for database %s" msgstr "немає доступу для бази даних %s" -#: catalog/aclchk.c:3343 +#: catalog/aclchk.c:3542 #, c-format msgid "permission denied for domain %s" msgstr "немає дозволу для домену %s" -#: catalog/aclchk.c:3346 +#: catalog/aclchk.c:3545 #, c-format msgid "permission denied for event trigger %s" msgstr "немає дозволу для тригера подій %s" -#: catalog/aclchk.c:3349 +#: catalog/aclchk.c:3548 #, c-format msgid "permission denied for extension %s" msgstr "немає дозволу для розширення %s" -#: catalog/aclchk.c:3352 +#: catalog/aclchk.c:3551 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "немає дозволу для джерела сторонніх даних %s" -#: catalog/aclchk.c:3355 +#: catalog/aclchk.c:3554 #, c-format msgid "permission denied for foreign server %s" msgstr "немає дозволу для стороннього серверу %s" -#: catalog/aclchk.c:3358 +#: catalog/aclchk.c:3557 #, c-format msgid "permission denied for foreign table %s" msgstr "немає дозволу для сторонньої таблиці %s" -#: catalog/aclchk.c:3361 +#: catalog/aclchk.c:3560 #, c-format msgid "permission denied for function %s" msgstr "немає дозволу для функції %s" -#: catalog/aclchk.c:3364 +#: catalog/aclchk.c:3563 #, c-format msgid "permission denied for index %s" msgstr "немає дозволу для індексу %s" -#: catalog/aclchk.c:3367 +#: catalog/aclchk.c:3566 #, c-format msgid "permission denied for language %s" msgstr "немає дозволу для мови %s" -#: catalog/aclchk.c:3370 +#: catalog/aclchk.c:3569 #, c-format msgid "permission denied for large object %s" msgstr "немає дозволу для великого об'єкту %s" -#: catalog/aclchk.c:3373 +#: catalog/aclchk.c:3572 #, c-format msgid "permission denied for materialized view %s" msgstr "немає дозволу для матеріалізованого подання %s" -#: catalog/aclchk.c:3376 +#: catalog/aclchk.c:3575 #, c-format msgid "permission denied for operator class %s" msgstr "немає дозволу для класу операторів %s" -#: catalog/aclchk.c:3379 +#: catalog/aclchk.c:3578 #, c-format msgid "permission denied for operator %s" msgstr "немає дозволу для оператора %s" -#: catalog/aclchk.c:3382 +#: catalog/aclchk.c:3581 #, c-format msgid "permission denied for operator family %s" msgstr "немає дозволу для сімейства операторів %s" -#: catalog/aclchk.c:3385 +#: 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:3388 +#: catalog/aclchk.c:3590 #, c-format msgid "permission denied for procedure %s" msgstr "немає дозволу для процедури %s" -#: catalog/aclchk.c:3391 +#: catalog/aclchk.c:3593 #, c-format msgid "permission denied for publication %s" msgstr "немає дозволу для публікації %s" -#: catalog/aclchk.c:3394 +#: catalog/aclchk.c:3596 #, c-format msgid "permission denied for routine %s" msgstr "немає дозволу для підпрограми %s" -#: catalog/aclchk.c:3397 +#: catalog/aclchk.c:3599 #, c-format msgid "permission denied for schema %s" msgstr "немає дозволу для схеми %s" -#: catalog/aclchk.c:3400 commands/sequence.c:618 commands/sequence.c:852 -#: commands/sequence.c:894 commands/sequence.c:935 commands/sequence.c:1807 -#: commands/sequence.c:1871 +#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 +#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 +#: commands/sequence.c:1825 #, c-format msgid "permission denied for sequence %s" msgstr "немає дозволу для послідовності %s" -#: catalog/aclchk.c:3403 +#: catalog/aclchk.c:3605 #, c-format msgid "permission denied for statistics object %s" msgstr "немає дозволу для об'єкту статистики %s" -#: catalog/aclchk.c:3406 +#: catalog/aclchk.c:3608 #, c-format msgid "permission denied for subscription %s" msgstr "немає дозволу для підписки %s" -#: catalog/aclchk.c:3409 +#: catalog/aclchk.c:3611 #, c-format msgid "permission denied for table %s" msgstr "немає дозволу для таблиці %s" -#: catalog/aclchk.c:3412 +#: catalog/aclchk.c:3614 #, c-format msgid "permission denied for tablespace %s" msgstr "немає дозволу для табличного простору %s" -#: catalog/aclchk.c:3415 +#: catalog/aclchk.c:3617 #, c-format msgid "permission denied for text search configuration %s" msgstr "немає дозволу для конфігурації текстового пошуку %s" -#: catalog/aclchk.c:3418 +#: catalog/aclchk.c:3620 #, c-format msgid "permission denied for text search dictionary %s" msgstr "немає дозволу для словника текстового пошуку %s" -#: catalog/aclchk.c:3421 +#: catalog/aclchk.c:3623 #, c-format msgid "permission denied for type %s" msgstr "немає дозволу для типу %s" -#: catalog/aclchk.c:3424 +#: catalog/aclchk.c:3626 #, c-format msgid "permission denied for view %s" msgstr "немає дозволу для подання %s" -#: catalog/aclchk.c:3459 +#: catalog/aclchk.c:3662 #, c-format msgid "must be owner of aggregate %s" msgstr "треба бути власником агрегату %s" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:3665 #, c-format msgid "must be owner of collation %s" msgstr "треба бути власником правил сортування %s" -#: catalog/aclchk.c:3465 +#: catalog/aclchk.c:3668 #, c-format msgid "must be owner of conversion %s" msgstr "треба бути власником перетворення %s" -#: catalog/aclchk.c:3468 +#: catalog/aclchk.c:3671 #, c-format msgid "must be owner of database %s" msgstr "треба бути власником бази даних %s" -#: catalog/aclchk.c:3471 +#: catalog/aclchk.c:3674 #, c-format msgid "must be owner of domain %s" msgstr "треба бути власником домену %s" -#: catalog/aclchk.c:3474 +#: catalog/aclchk.c:3677 #, c-format msgid "must be owner of event trigger %s" msgstr "треба бути власником тригеру подій %s" -#: catalog/aclchk.c:3477 +#: catalog/aclchk.c:3680 #, c-format msgid "must be owner of extension %s" msgstr "треба бути власником розширення %s" -#: catalog/aclchk.c:3480 +#: catalog/aclchk.c:3683 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "треба бути власником джерела сторонніх даних %s" -#: catalog/aclchk.c:3483 +#: catalog/aclchk.c:3686 #, c-format msgid "must be owner of foreign server %s" msgstr "треба бути власником стороннього серверу %s" -#: catalog/aclchk.c:3486 +#: catalog/aclchk.c:3689 #, c-format msgid "must be owner of foreign table %s" msgstr "треба бути власником сторонньої таблиці %s" -#: catalog/aclchk.c:3489 +#: catalog/aclchk.c:3692 #, c-format msgid "must be owner of function %s" msgstr "треба бути власником функції %s" -#: catalog/aclchk.c:3492 +#: catalog/aclchk.c:3695 #, c-format msgid "must be owner of index %s" msgstr "треба бути власником індексу %s" -#: catalog/aclchk.c:3495 +#: catalog/aclchk.c:3698 #, c-format msgid "must be owner of language %s" msgstr "треба бути власником мови %s" -#: catalog/aclchk.c:3498 +#: catalog/aclchk.c:3701 #, c-format msgid "must be owner of large object %s" msgstr "треба бути власником великого об'єкту %s" -#: catalog/aclchk.c:3501 +#: catalog/aclchk.c:3704 #, c-format msgid "must be owner of materialized view %s" msgstr "треба бути власником матеріалізованого подання %s" -#: catalog/aclchk.c:3504 +#: catalog/aclchk.c:3707 #, c-format msgid "must be owner of operator class %s" msgstr "треба бути власником класу операторів %s" -#: catalog/aclchk.c:3507 +#: catalog/aclchk.c:3710 #, c-format msgid "must be owner of operator %s" msgstr "треба бути власником оператора %s" -#: catalog/aclchk.c:3510 +#: catalog/aclchk.c:3713 #, c-format msgid "must be owner of operator family %s" msgstr "треба бути власником сімейства операторів %s" -#: catalog/aclchk.c:3513 +#: catalog/aclchk.c:3716 #, c-format msgid "must be owner of procedure %s" msgstr "треба бути власником процедури %s" -#: catalog/aclchk.c:3516 +#: catalog/aclchk.c:3719 #, c-format msgid "must be owner of publication %s" msgstr "треба бути власником публікації %s" -#: catalog/aclchk.c:3519 +#: catalog/aclchk.c:3722 #, c-format msgid "must be owner of routine %s" msgstr "треба бути власником підпрограми %s" -#: catalog/aclchk.c:3522 +#: catalog/aclchk.c:3725 #, c-format msgid "must be owner of sequence %s" msgstr "треба бути власником послідовності %s" -#: catalog/aclchk.c:3525 +#: catalog/aclchk.c:3728 #, c-format msgid "must be owner of subscription %s" msgstr "треба бути власником підписки %s" -#: catalog/aclchk.c:3528 +#: catalog/aclchk.c:3731 #, c-format msgid "must be owner of table %s" msgstr "треба бути власником таблиці %s" -#: catalog/aclchk.c:3531 +#: catalog/aclchk.c:3734 #, c-format msgid "must be owner of type %s" msgstr "треба бути власником типу %s" -#: catalog/aclchk.c:3534 +#: catalog/aclchk.c:3737 #, c-format msgid "must be owner of view %s" msgstr "треба бути власником подання %s" -#: catalog/aclchk.c:3537 +#: catalog/aclchk.c:3740 #, c-format msgid "must be owner of schema %s" msgstr "треба бути власником схеми %s" -#: catalog/aclchk.c:3540 +#: catalog/aclchk.c:3743 #, c-format msgid "must be owner of statistics object %s" msgstr "треба бути власником об'єкту статистики %s" -#: catalog/aclchk.c:3543 +#: catalog/aclchk.c:3746 #, c-format msgid "must be owner of tablespace %s" msgstr "треба бути власником табличного простору %s" -#: catalog/aclchk.c:3546 +#: catalog/aclchk.c:3749 #, c-format msgid "must be owner of text search configuration %s" msgstr "треба бути власником конфігурації текстового пошуку %s" -#: catalog/aclchk.c:3549 +#: catalog/aclchk.c:3752 #, c-format msgid "must be owner of text search dictionary %s" msgstr "треба бути власником словника текстового пошуку %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:3766 #, c-format msgid "must be owner of relation %s" msgstr "треба бути власником відношення %s" -#: catalog/aclchk.c:3607 +#: catalog/aclchk.c:3812 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "немає дозволу для стовпця \"%s\" відношення \"%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 "атрибут %d відношення з OID %u не існує" -#: 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 "відношення з OID %u не існує" -#: catalog/aclchk.c:3977 catalog/aclchk.c:5254 +#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2615 #, c-format msgid "database with OID %u does not exist" msgstr "база даних з OID %u не існує" -#: 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 "параметр ACL з OID %u не існує" + +#: 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 "функція з OID %u не існує" -#: 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 "мова з OID %u не існує" -#: catalog/aclchk.c:4249 catalog/aclchk.c:5012 commands/collationcmds.c:536 +#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 +#: commands/publicationcmds.c:1745 #, c-format msgid "schema with OID %u does not exist" msgstr "схема з OID %u не існує" -#: 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 "табличний простір з OID %u не існує" -#: 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 "джерело сторонніх даних з OID %u не існує" -#: 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 "стороннього серверу з OID %u не усніє" -#: 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:390 +#: utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "тип з OID %u не існує" -#: catalog/aclchk.c:4888 +#: catalog/aclchk.c:5236 #, c-format msgid "operator with OID %u does not exist" msgstr "оператора з OID %u не існує" -#: catalog/aclchk.c:5065 +#: catalog/aclchk.c:5413 #, c-format msgid "operator class with OID %u does not exist" msgstr "класу операторів з OID %u не існує" -#: catalog/aclchk.c:5092 +#: catalog/aclchk.c:5440 #, c-format msgid "operator family with OID %u does not exist" msgstr "сімейства операторів з OID %u не існує" -#: catalog/aclchk.c:5119 +#: catalog/aclchk.c:5467 #, c-format msgid "text search dictionary with OID %u does not exist" msgstr "словник текстового пошуку з OID %u не існує" -#: catalog/aclchk.c:5146 +#: catalog/aclchk.c:5494 #, c-format msgid "text search configuration with OID %u does not exist" msgstr "конфігурація текстового пошуку %u з OID не існує" -#: 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 "тригер подій %u з OID не існує" -#: catalog/aclchk.c:5280 commands/collationcmds.c:387 +#: catalog/aclchk.c:5628 commands/collationcmds.c:439 #, c-format msgid "collation with OID %u does not exist" msgstr "порядку сортування %u з OID не існує" -#: catalog/aclchk.c:5306 +#: catalog/aclchk.c:5654 #, c-format msgid "conversion with OID %u does not exist" msgstr "перетворення %u з OID не існує" -#: catalog/aclchk.c:5347 +#: catalog/aclchk.c:5695 #, c-format msgid "extension with OID %u does not exist" msgstr "розширення %u з OID не існує" -#: catalog/aclchk.c:5374 commands/publicationcmds.c:818 +#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 #, c-format msgid "publication with OID %u does not exist" msgstr "публікації %u з OID не існує" -#: catalog/aclchk.c:5400 commands/subscriptioncmds.c:1463 +#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 #, c-format msgid "subscription with OID %u does not exist" msgstr "підписки %u з OID не існує" -#: catalog/aclchk.c:5426 +#: catalog/aclchk.c:5774 #, c-format msgid "statistics object with OID %u does not exist" msgstr "об'єкту статистики %u з OID не існує" -#: catalog/catalog.c:378 +#: catalog/catalog.c:447 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "все ще шукаю невикористаний OID у відношенні \"%s\"" -#: catalog/catalog.c:380 +#: 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." @@ -4102,7 +4322,7 @@ msgstr[1] "OID кандидати буле перевірені %llu рази, msgstr[2] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." msgstr[3] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." -#: catalog/catalog.c:405 +#: 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" @@ -4111,57 +4331,57 @@ msgstr[1] "новий OID було призначено у відношенні msgstr[2] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" msgstr[3] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" -#: catalog/catalog.c:536 +#: catalog/catalog.c:605 catalog/catalog.c:672 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "для виклику pg_nextoid() потрібно бути суперкористувачем" +msgid "must be superuser to call %s()" +msgstr "для виклику %s() потрібно бути суперкористувачем" -#: catalog/catalog.c:544 +#: catalog/catalog.c:614 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можна використовувати лише для системних каталогів" -#: catalog/catalog.c:549 parser/parse_utilcmd.c:2277 +#: catalog/catalog.c:619 parser/parse_utilcmd.c:2280 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "індекс \"%s\" не належить таблиці \"%s\"" -#: catalog/catalog.c:566 +#: catalog/catalog.c:636 #, c-format msgid "column \"%s\" is not of type oid" msgstr "стовпець \"%s\" повинен мати тип oid" -#: catalog/catalog.c:573 +#: 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:538 catalog/pg_shdepend.c:657 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "не вдалося видалити %s, оскільки він потрібний системі бази даних" + +#: catalog/dependency.c:830 catalog/dependency.c:1057 #, c-format msgid "cannot drop %s because %s requires it" msgstr "не вдалося видалити %s, оскільки %s потребує його" -#: catalog/dependency.c:823 catalog/dependency.c:1062 +#: catalog/dependency.c:832 catalog/dependency.c:1059 #, c-format msgid "You can drop %s instead." msgstr "Ви можете видалити %s замість цього." -#: 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:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1138 catalog/dependency.c:1147 #, c-format msgid "%s depends on %s" msgstr "%s залежить від %s" -#: catalog/dependency.c:1165 catalog/dependency.c:1174 +#: catalog/dependency.c:1162 catalog/dependency.c:1171 #, c-format msgid "drop cascades to %s" msgstr "видалення поширюється (cascades) на об'єкт %s" -#: catalog/dependency.c:1182 catalog/pg_shdepend.c:826 +#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 #, c-format msgid "\n" "and %d other object (see server log for list)" @@ -4176,35 +4396,34 @@ msgstr[2] "\n" msgstr[3] "\n" "і ще %d інші об'єкти (див. список у протоколі сервера)" -#: catalog/dependency.c:1194 +#: catalog/dependency.c:1191 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "неможливо видалити %s, тому що від нього залежать інші об'єкти" -#: catalog/dependency.c:1197 catalog/dependency.c:1204 -#: catalog/dependency.c:1216 commands/tablecmds.c:1304 -#: commands/tablecmds.c:13828 commands/tablespace.c:464 commands/user.c:1095 -#: commands/view.c:506 libpq/auth.c:338 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1439 utils/misc/guc.c:7128 -#: utils/misc/guc.c:7164 utils/misc/guc.c:7234 utils/misc/guc.c:11424 -#: utils/misc/guc.c:11458 utils/misc/guc.c:11492 utils/misc/guc.c:11535 -#: utils/misc/guc.c:11577 +#: catalog/dependency.c:1194 catalog/dependency.c:1201 +#: catalog/dependency.c:1212 commands/tablecmds.c:1328 +#: commands/tablecmds.c:14365 commands/tablespace.c:476 commands/user.c:1008 +#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 +#: storage/lmgr/deadlock.c:1151 storage/lmgr/proc.c:1421 utils/misc/guc.c:7402 +#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11873 +#: utils/misc/guc.c:11907 utils/misc/guc.c:11941 utils/misc/guc.c:11984 +#: utils/misc/guc.c:12026 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1198 catalog/dependency.c:1205 +#: catalog/dependency.c:1195 catalog/dependency.c:1202 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Використайте DROP ... CASCADE для видалення залежних об'єктів також." -#: catalog/dependency.c:1202 +#: catalog/dependency.c:1199 #, 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:1211 +#: catalog/dependency.c:1207 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -4213,275 +4432,296 @@ msgstr[1] "видалення поширюється (cascades) на ще %d і msgstr[2] "видалення поширюється (cascades) на ще %d інших об'єктів" msgstr[3] "видалення поширюється (cascades) на ще %d інших об'єктів" -#: catalog/dependency.c:1882 +#: catalog/dependency.c:1889 #, c-format msgid "constant of the type %s cannot be used here" msgstr "константа типу %s не може бути використана тут" -#: catalog/heap.c:332 +#: catalog/dependency.c:2410 parser/parse_relation.c:3374 +#: parser/parse_relation.c:3384 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "стовпець %d відношення \"%s\" не існує" + +#: catalog/heap.c:324 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "немає дозволу для створення \"%s.%s\"" -#: catalog/heap.c:334 +#: catalog/heap.c:326 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Змінення системного каталогу наразі заборонено." -#: catalog/heap.c:509 commands/tablecmds.c:2316 commands/tablecmds.c:2953 -#: commands/tablecmds.c:6683 +#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 +#: commands/tablecmds.c:6861 #, c-format msgid "tables can have at most %d columns" msgstr "таблиці можуть містити максимум %d стовпців" -#: catalog/heap.c:527 commands/tablecmds.c:6982 +#: catalog/heap.c:484 commands/tablecmds.c:7161 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "ім'я стовпця \"%s\" конфліктує з системним іменем стовпця" -#: catalog/heap.c:543 +#: catalog/heap.c:500 #, 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:575 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "стовпець ключа секціонування %s має псевдотип %s" -#: catalog/heap.c:623 +#: catalog/heap.c:580 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "стовпець \"%s\" має псевдо-тип %s" -#: catalog/heap.c:654 +#: catalog/heap.c:611 #, 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:666 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "для стовпця ключа секціонування \"%s\" з сортируючим типом %s не вдалося отримати параметри сортування" -#: catalog/heap.c:715 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "для стовпця \"%s\" із сортувальним типом %s не вдалося отримати параметри сортування" -#: catalog/heap.c:1200 catalog/index.c:872 commands/createas.c:408 -#: commands/tablecmds.c:3858 +#: catalog/heap.c:1148 catalog/index.c:875 commands/createas.c:408 +#: commands/tablecmds.c:3890 #, c-format msgid "relation \"%s\" already exists" msgstr "відношення \"%s\" вже існує" -#: catalog/heap.c:1216 catalog/pg_type.c:436 catalog/pg_type.c:784 +#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 #: catalog/pg_type.c:931 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 +#: 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:1217 +#: catalog/heap.c:1165 #, 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:1246 +#: catalog/heap.c:1205 +#, c-format +msgid "toast relfilenode value not set when in binary upgrade mode" +msgstr "значення toast relfilenode не встановлено в режимі двійкового оновлення" + +#: catalog/heap.c:1216 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значення OID в pg_class не задано в режимі двійкового оновлення" -#: catalog/heap.c:2459 +#: catalog/heap.c:1226 +#, c-format +msgid "relfilenode value not set when in binary upgrade mode" +msgstr "значення relfilenode не встановлено в режимі двійкового оновлення" + +#: catalog/heap.c:2127 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "не можна додати обмеження NO INHERIT до секціонованої таблиці \"%s\"" -#: catalog/heap.c:2731 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "обмеження перевірки \"%s\" вже інсує" -#: catalog/heap.c:2901 catalog/index.c:886 catalog/pg_constraint.c:670 -#: commands/tablecmds.c:8710 +#: catalog/heap.c:2572 catalog/index.c:889 catalog/pg_constraint.c:689 +#: commands/tablecmds.c:8863 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "обмеження \"%s\" відношення \"%s\" вже існує" -#: catalog/heap.c:2908 +#: catalog/heap.c:2579 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2919 +#: catalog/heap.c:2590 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з успадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2929 +#: catalog/heap.c:2600 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з обмеженням NOT VALID в відношенні \"%s\"" -#: catalog/heap.c:2934 +#: catalog/heap.c:2605 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "злиття обмеження \"%s\" з успадкованим визначенням" -#: catalog/heap.c:3039 +#: catalog/heap.c:2710 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "в виразі створення стовпця не можна використовувати згенерований стовпець \"%s\" " -#: catalog/heap.c:3041 +#: catalog/heap.c:2712 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Згенерований стовпець не може посилатися на інший згенерований стовпець." -#: catalog/heap.c:3047 +#: catalog/heap.c:2718 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "у виразі створення стовпців не можна використовувати змінну усього рядка" -#: catalog/heap.c:3048 +#: catalog/heap.c:2719 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Це призведе до того, що згенерований стовпець буде залежати від власного значення." -#: catalog/heap.c:3101 +#: catalog/heap.c:2774 #, c-format msgid "generation expression is not immutable" msgstr "вираз генерації не є незмінним" -#: catalog/heap.c:3129 rewrite/rewriteHandler.c:1290 +#: catalog/heap.c:2802 rewrite/rewriteHandler.c:1290 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "стовпець \"%s\" має тип %s, але тип виразу за замовчуванням %s" -#: catalog/heap.c:3134 commands/prepare.c:368 parser/analyze.c:2646 +#: catalog/heap.c:2807 commands/prepare.c:334 parser/analyze.c:2730 #: parser/parse_target.c:594 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1295 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Потрібно буде переписати або привести вираз." -#: catalog/heap.c:3181 +#: catalog/heap.c:2854 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в обмеженні-перевірці можна посилатися лише на таблицю \"%s\"" -#: catalog/heap.c:3479 +#: catalog/heap.c:3152 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "непідтримуване поєднання зовнішнього ключа з ON COMMIT" -#: catalog/heap.c:3480 +#: catalog/heap.c:3153 #, 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:3485 +#: catalog/heap.c:3158 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "скоротити таблицю, на яку посилається зовнішній ключ, не можливо" -#: catalog/heap.c:3486 +#: catalog/heap.c:3159 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблиця \"%s\" посилається на \"%s\"." -#: catalog/heap.c:3488 +#: catalog/heap.c:3161 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Скоротіть таблицю \"%s\" паралельно або використайте TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2183 +#: catalog/index.c:224 parser/parse_utilcmd.c:2185 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблиця \"%s\" не може містити кілька первинних ключів" -#: catalog/index.c:241 +#: catalog/index.c:242 #, c-format msgid "primary keys cannot be expressions" msgstr "первинні ключі не можуть бути виразами" -#: catalog/index.c:258 +#: catalog/index.c:259 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "стовпець первинного ключа \"%s\" не позначений як NOT NULL" -#: catalog/index.c:771 catalog/index.c:1934 +#: catalog/index.c:774 catalog/index.c:1933 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "користувацькі індекси в таблицях системного каталогу не підтримуються" -#: catalog/index.c:811 +#: catalog/index.c:814 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "недетерміновані правила сортування не підтримуються для класу операторів \"%s\"" -#: catalog/index.c:826 +#: catalog/index.c:829 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "паралельне створення індексу в таблицях системного каталогу не підтримується" -#: catalog/index.c:835 catalog/index.c:1286 +#: catalog/index.c:838 catalog/index.c:1306 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "парарельне створення індексу для обмежень-виключень не підтримується" -#: catalog/index.c:844 +#: catalog/index.c:847 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "не можливо створити спільні індекси після initdb" -#: catalog/index.c:864 commands/createas.c:423 commands/sequence.c:162 +#: catalog/index.c:867 commands/createas.c:423 commands/sequence.c:158 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "ввідношення \"%s\" вже існує, пропускаємо" -#: catalog/index.c:914 +#: catalog/index.c:917 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "значення OID індекса в pg_class не встановлено в режимі двійкового оновлення" -#: catalog/index.c:2231 +#: catalog/index.c:927 utils/cache/relcache.c:3744 +#, c-format +msgid "index relfilenode value not set when in binary upgrade mode" +msgstr "значення індексу relfilenode не встановлено в режимі двійкового оновлення" + +#: catalog/index.c:2232 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY повинен бути першою дією в транзакції" -#: catalog/index.c:3628 +#: catalog/index.c:3646 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "повторно індексувати тимчасові таблиці інших сеансів не можна" -#: catalog/index.c:3639 commands/indexcmds.c:3572 +#: catalog/index.c:3657 commands/indexcmds.c:3536 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "переіндексувати неприпустимий індекс в таблиці TOAST не можна" -#: catalog/index.c:3655 commands/indexcmds.c:3452 commands/indexcmds.c:3596 -#: commands/tablecmds.c:3273 +#: catalog/index.c:3673 commands/indexcmds.c:3416 commands/indexcmds.c:3560 +#: commands/tablecmds.c:3305 #, c-format msgid "cannot move system relation \"%s\"" msgstr "перемістити системне відношення \"%s\" не можна" -#: catalog/index.c:3799 +#: catalog/index.c:3817 #, c-format msgid "index \"%s\" was reindexed" msgstr "індекс \"%s\" був перебудований" -#: catalog/index.c:3936 +#: catalog/index.c:3954 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "переіндексувати неприпустимий індекс \"%s.%s\" в таблиці TOAST не можна, пропускається" #: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5233 +#: commands/trigger.c:5812 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "cross-database посилання не реалізовані: \"%s.%s.%s\"" @@ -4496,24 +4736,24 @@ msgstr "для тимчасових таблиць ім'я схеми не вк msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не вдалося отримати блокування зв'язку \"%s.%s\"" -#: catalog/namespace.c:402 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 "не вдалося отримати блокування зв'язку \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1362 +#: catalog/namespace.c:430 parser/parse_relation.c:1373 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "відношення \"%s.%s\" не існує" -#: catalog/namespace.c:435 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 "відношення \"%s\" не існує" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1541 -#: commands/extension.c:1547 +#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1556 +#: commands/extension.c:1562 #, c-format msgid "no schema has been selected to create in" msgstr "не вибрано схему для створення об'єктів" @@ -4559,13 +4799,13 @@ msgstr "шаблон текстового пошуку \"%s\" не існує" msgid "text search configuration \"%s\" does not exist" msgstr "конфігурація текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2883 parser/parse_expr.c:810 parser/parse_target.c:1255 +#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові посилання не реалізовані: %s" -#: catalog/namespace.c:2889 parser/parse_expr.c:817 parser/parse_target.c:1262 -#: gram.y:15103 gram.y:17077 +#: catalog/namespace.c:2889 parser/parse_expr.c:813 parser/parse_target.c:1262 +#: gram.y:18258 gram.y:18298 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'я (забагато компонентів): %s" @@ -4581,7 +4821,7 @@ msgid "cannot move objects into or out of TOAST schema" msgstr "не можна переміщати об'єкти в або з схем TOAST" #: catalog/namespace.c:3098 commands/schemacmds.c:263 commands/schemacmds.c:343 -#: commands/tablecmds.c:1249 +#: commands/tablecmds.c:1273 #, c-format msgid "schema \"%s\" does not exist" msgstr "схема \"%s\" не існує" @@ -4616,234 +4856,238 @@ msgstr "не можна створити тимчасові таблиці пі msgid "cannot create temporary tables during a parallel operation" msgstr "не можна створити тимчасові таблиці під час паралельної операції" -#: catalog/namespace.c:4338 commands/tablespace.c:1216 commands/variable.c:64 -#: utils/misc/guc.c:11609 utils/misc/guc.c:11687 +#: catalog/namespace.c:4338 commands/tablespace.c:1236 commands/variable.c:64 +#: utils/misc/guc.c:12058 utils/misc/guc.c:12160 #, c-format msgid "List syntax is invalid." msgstr "Помилка синтаксису у списку." -#: 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:2160 commands/tablecmds.c:6082 -#: commands/tablecmds.c:11843 +#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 +#: commands/tablecmds.c:12335 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" не є таблицею" -#: catalog/objectaddress.c:1377 commands/tablecmds.c:255 -#: commands/tablecmds.c:6121 commands/tablecmds.c:16625 commands/view.c:119 +#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 +#: commands/tablecmds.c:17169 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" не є поданням" -#: catalog/objectaddress.c:1384 commands/matview.c:186 commands/tablecmds.c:261 -#: commands/tablecmds.c:16630 +#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 +#: commands/tablecmds.c:17174 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" не є матеріалізованим поданням" -#: catalog/objectaddress.c:1391 commands/tablecmds.c:279 -#: commands/tablecmds.c:6124 commands/tablecmds.c:16635 +#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 +#: commands/tablecmds.c:17179 #, 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 "значення за замовчуванням для стовпця \"%s\" відношення \"%s\" не існує" -#: 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 +#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 +#: commands/tablecmds.c:275 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 "оператор %d (%s, %s) з %s не існує" -#: catalog/objectaddress.c:1795 +#: catalog/objectaddress.c:1788 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "функція %d (%s, %s) з %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:997 commands/foreigncmds.c:1360 foreign/foreign.c:723 +#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 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 "відношення публікації \"%s\" в публікації \"%s\" не існує" -#: catalog/objectaddress.c:1990 +#: catalog/objectaddress.c:1968 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "схема публікації \"%s\" в публікації \"%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 "ACL за замовчуванням для користувача \"%s\" в схемі \"%s\" для об'єкту %s не існує" -#: catalog/objectaddress.c:2047 +#: catalog/objectaddress.c:2083 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ACL за замовчуванням для користувача \"%s\" і для об'єкту %s не існує" -#: 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:2247 catalog/objectaddress.c:2331 #, 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 великого об'єкта не повинно бути нулем" -#: catalog/objectaddress.c:2159 catalog/objectaddress.c:2222 -#: catalog/objectaddress.c:2229 +#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 +#: catalog/objectaddress.c:2272 #, c-format msgid "name list length must be at least %d" msgstr "довжина списку імен повинна бути щонайменше %d" -#: catalog/objectaddress.c:2215 catalog/objectaddress.c:2236 +#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 #, c-format msgid "argument list length must be exactly %d" msgstr "довжина списку аргументів повинна бути точно %d" -#: catalog/objectaddress.c:2488 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 #, c-format msgid "must be owner of large object %u" msgstr "треба бути власником великого об'єкта %u" -#: catalog/objectaddress.c:2503 commands/functioncmds.c:1583 +#: catalog/objectaddress.c:2548 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:2598 catalog/objectaddress.c:2616 #, c-format msgid "must be superuser" msgstr "треба бути суперкористувачем" -#: catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2605 #, c-format msgid "must have CREATEROLE privilege" msgstr "треба мати право CREATEROLE" -#: catalog/objectaddress.c:2640 +#: catalog/objectaddress.c:2686 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нерозпізнаний тип об'єкту \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2883 +#: catalog/objectaddress.c:2978 #, c-format msgid "column %s of %s" msgstr "стовпець %s з %s" -#: catalog/objectaddress.c:2898 +#: catalog/objectaddress.c:2993 #, c-format msgid "function %s" msgstr "функція %s" -#: catalog/objectaddress.c:2911 +#: catalog/objectaddress.c:3006 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:3043 #, c-format msgid "cast from %s to %s" msgstr "приведення від %s до %s" -#: catalog/objectaddress.c:2981 +#: catalog/objectaddress.c:3076 #, c-format msgid "collation %s" msgstr "сортування %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3012 +#: catalog/objectaddress.c:3107 #, c-format msgid "constraint %s on %s" msgstr "обмеження %s на %s" -#: catalog/objectaddress.c:3018 +#: catalog/objectaddress.c:3113 #, c-format msgid "constraint %s" msgstr "обмеження %s" -#: catalog/objectaddress.c:3050 +#: catalog/objectaddress.c:3145 #, c-format msgid "conversion %s" msgstr "перетворення %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3096 +#: catalog/objectaddress.c:3167 #, c-format msgid "default value for %s" msgstr "значення за замовчуванням для %s" -#: catalog/objectaddress.c:3110 +#: catalog/objectaddress.c:3178 #, c-format msgid "language %s" msgstr "мова %s" -#: catalog/objectaddress.c:3118 +#: catalog/objectaddress.c:3186 #, c-format msgid "large object %u" msgstr "великий об'єкт %u" -#: catalog/objectaddress.c:3131 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3168 +#: catalog/objectaddress.c:3236 #, c-format msgid "operator class %s for access method %s" msgstr "клас операторів %s для методу доступу %s" -#: catalog/objectaddress.c:3196 +#: catalog/objectaddress.c:3264 #, c-format msgid "access method %s" msgstr "метод доступу %s" @@ -4852,7 +5096,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:3245 +#: catalog/objectaddress.c:3313 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) з %s: %s" @@ -4861,221 +5105,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:3302 +#: catalog/objectaddress.c:3370 #, 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:3354 +#: catalog/objectaddress.c:3422 #, c-format msgid "rule %s on %s" msgstr "правило %s на %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3400 +#: catalog/objectaddress.c:3468 #, c-format msgid "trigger %s on %s" msgstr "тригер %s на %s" -#: catalog/objectaddress.c:3420 +#: catalog/objectaddress.c:3488 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3448 +#: catalog/objectaddress.c:3516 #, c-format msgid "statistics object %s" msgstr "об'єкт статистики %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3547 #, c-format msgid "text search parser %s" msgstr "парсер текстового пошуку %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3578 #, c-format msgid "text search dictionary %s" msgstr "словник текстового пошуку %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3609 #, c-format msgid "text search template %s" msgstr "шаблон текстового пошуку %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3640 #, c-format msgid "text search configuration %s" msgstr "конфігурація текстового пошуку %s" -#: catalog/objectaddress.c:3585 +#: catalog/objectaddress.c:3653 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3601 +#: catalog/objectaddress.c:3669 #, c-format msgid "database %s" msgstr "база даних %s" -#: catalog/objectaddress.c:3617 +#: catalog/objectaddress.c:3685 #, c-format msgid "tablespace %s" msgstr "табличний простір %s" -#: catalog/objectaddress.c:3628 +#: catalog/objectaddress.c:3696 #, c-format msgid "foreign-data wrapper %s" msgstr "джерело сторонніх даних %s" -#: catalog/objectaddress.c:3638 +#: catalog/objectaddress.c:3706 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3671 +#: catalog/objectaddress.c:3739 #, c-format msgid "user mapping for %s on server %s" msgstr "зіставлення користувача для %s на сервері %s" -#: catalog/objectaddress.c:3723 +#: catalog/objectaddress.c:3791 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "права за замовчуванням для нових відношень, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3727 +#: catalog/objectaddress.c:3795 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права за замовчуванням для нових відношень, що належать ролі %s" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3801 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "права за замовчуванням для нових послідовностей, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3737 +#: catalog/objectaddress.c:3805 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "права за замовчуванням для нових послідовностей, що належать ролі %s" -#: catalog/objectaddress.c:3743 +#: catalog/objectaddress.c:3811 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права за замовчуванням для нових функцій, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3747 +#: catalog/objectaddress.c:3815 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права за замовчуванням для нових функцій, що належать ролі %s" -#: catalog/objectaddress.c:3753 +#: catalog/objectaddress.c:3821 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права за замовчуванням для нових типів, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3757 +#: catalog/objectaddress.c:3825 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права за замовчуванням для нових типів, що належать ролі %s" -#: catalog/objectaddress.c:3763 +#: catalog/objectaddress.c:3831 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права за замовчуванням для нових схем, що належать ролі %s" -#: catalog/objectaddress.c:3770 +#: catalog/objectaddress.c:3838 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "права за замовчуванням, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3774 +#: catalog/objectaddress.c:3842 #, c-format msgid "default privileges belonging to role %s" msgstr "права за замовчуванням належать ролі %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3864 #, c-format msgid "extension %s" msgstr "розширення %s" -#: catalog/objectaddress.c:3813 +#: catalog/objectaddress.c:3881 #, c-format msgid "event trigger %s" msgstr "тригер подій %s" +#: catalog/objectaddress.c:3908 +#, c-format +msgid "parameter %s" +msgstr "параметр %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3857 +#: catalog/objectaddress.c:3951 #, c-format msgid "policy %s on %s" msgstr "політика %s на %s" -#: catalog/objectaddress.c:3871 +#: catalog/objectaddress.c:3965 #, c-format msgid "publication %s" msgstr "публікація %s" +#: catalog/objectaddress.c:3978 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "публікація схеми %s в публікації %s" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3899 +#: catalog/objectaddress.c:4009 #, c-format msgid "publication of %s in publication %s" msgstr "відношення публікації %s в публікації %s" -#: catalog/objectaddress.c:3912 +#: catalog/objectaddress.c:4022 #, c-format msgid "subscription %s" msgstr "підписка %s" -#: catalog/objectaddress.c:3933 +#: catalog/objectaddress.c:4043 #, c-format msgid "transform for %s language %s" msgstr "трансформація для %s мови %s" -#: catalog/objectaddress.c:4004 +#: catalog/objectaddress.c:4114 #, c-format msgid "table %s" msgstr "таблиця %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4119 #, c-format msgid "index %s" msgstr "індекс %s" -#: catalog/objectaddress.c:4013 +#: catalog/objectaddress.c:4123 #, c-format msgid "sequence %s" msgstr "послідовність %s" -#: catalog/objectaddress.c:4017 +#: catalog/objectaddress.c:4127 #, c-format msgid "toast table %s" msgstr "таблиця toast %s" -#: catalog/objectaddress.c:4021 +#: catalog/objectaddress.c:4131 #, c-format msgid "view %s" msgstr "подання %s" -#: catalog/objectaddress.c:4025 +#: catalog/objectaddress.c:4135 #, c-format msgid "materialized view %s" msgstr "матеріалізоване подання %s" -#: catalog/objectaddress.c:4029 +#: catalog/objectaddress.c:4139 #, c-format msgid "composite type %s" msgstr "складений тип %s" -#: catalog/objectaddress.c:4033 +#: catalog/objectaddress.c:4143 #, c-format msgid "foreign table %s" msgstr "зовнішня таблиця %s" -#: catalog/objectaddress.c:4038 +#: catalog/objectaddress.c:4148 #, c-format msgid "relation %s" msgstr "відношення %s" -#: catalog/objectaddress.c:4079 +#: catalog/objectaddress.c:4189 #, c-format msgid "operator family %s for access method %s" msgstr "сімейство операторів %s для методу доступу %s" @@ -5119,7 +5373,7 @@ msgstr "не можна пропустити початкове значення msgid "return type of inverse transition function %s is not %s" msgstr "інвертована функція переходу %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2861 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3007 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "пряма й інвертована функції переходу агрегату повинні мати однакову суворість" @@ -5134,7 +5388,7 @@ msgstr "фінальна функція з додатковими аргумен msgid "return type of combine function %s is not %s" msgstr "комбінуюча функція %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:4130 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "комбінуюча функція з перехідним типом %s не повинна оголошуватись як сувора (STRICT)" @@ -5149,12 +5403,12 @@ msgstr "функція серіалізації %s повинна поверта msgid "return type of deserialization function %s is not %s" msgstr "функція десеріалізації %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:190 catalog/pg_proc.c:224 +#: 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:513 catalog/pg_proc.c:203 catalog/pg_proc.c:232 +#: 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 "небезпечне використання псевдотипу (pseudo-type) \"internal\"" @@ -5169,7 +5423,7 @@ msgstr "реалізація рухомого агрегату повертає msgid "sort operator can only be specified for single-argument aggregates" msgstr "оператора сортування можна вказати лише для агрегатних функцій з одним аргументом" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:385 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format msgid "cannot change routine kind" msgstr "неможливо змінити тип підпрограми" @@ -5194,11 +5448,11 @@ msgstr "\"%s\" є агрегатом для гіпотетичних набор msgid "cannot change number of direct arguments of an aggregate function" msgstr "змінити кількість прямих аргументів агрегатної функції не можна" -#: 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 +#: 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 @@ -5225,37 +5479,87 @@ msgstr "функція %s потребує приведення типів пі msgid "cast from type %s to type %s already exists" msgstr "приведення від типу %s до типу %s вже існує" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:161 +#: 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:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "сортування \"%s\" вже існує, пропускаємо" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "правило сортування \"%s \" для кодування \"%s\" вже існує, пропускаємо" -#: catalog/pg_collation.c:113 catalog/pg_collation.c:168 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "правило сортування \"%s\" вже існує" -#: catalog/pg_collation.c:115 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортування \"%s \" для кодування \"%s\" вже існує" -#: catalog/pg_constraint.c:678 +#: catalog/pg_constraint.c:697 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "обмеження \"%s\" для домену %s вже існує" -#: 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 "індексу \"%s\" для таблиці \"%s\" не існує" -#: catalog/pg_constraint.c:1067 +#: catalog/pg_constraint.c:1086 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "обмеження \"%s\" для домену \"%s\" не існує" @@ -5270,27 +5574,27 @@ msgstr "перетворення \"%s\" вже існує" msgid "default conversion for %s to %s already exists" msgstr "перетворення за замовчуванням від %s до %s вже існує" -#: catalog/pg_depend.c:218 commands/extension.c:3370 +#: catalog/pg_depend.c:222 commands/extension.c:3289 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s вже є членом розширення \"%s\"" -#: catalog/pg_depend.c:225 catalog/pg_depend.c:276 commands/extension.c:3410 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3329 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не є членом розширення \"%s\"" -#: catalog/pg_depend.c:228 +#: catalog/pg_depend.c:232 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "Розширенню не дозволяється замінювати об'єкт, який йому не належить." -#: catalog/pg_depend.c:279 +#: catalog/pg_depend.c:283 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Розширення може використовувати лише CREATE ... IF NOT EXISTS, щоб пропустити створення об'єкту, якщо конфліктуючий об'єкт уже належить йому." -#: catalog/pg_depend.c:644 +#: catalog/pg_depend.c:646 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "неможливо видалити залежність від об'єкта %s, тому що це системний об'єкт" @@ -5340,8 +5644,8 @@ msgstr "не можна відключити розділ \"%s\"" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "Розділ відключається одночасно або має незакінчене відключення." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4455 -#: commands/tablecmds.c:14945 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 +#: commands/tablecmds.c:15481 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Використайте ALTER TABLE ... DETACH PARTITION ... FINALIZE щоб завершити очікувану операцію відключення." @@ -5421,7 +5725,17 @@ msgstr "оператор %s вже існує" msgid "operator cannot be its own negator or sort operator" msgstr "оператор не може бути зворотнім до себе або власним оператором сортування" -#: catalog/pg_proc.c:131 parser/parse_func.c:2235 +#: 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" @@ -5430,37 +5744,37 @@ msgstr[1] "функції не можуть мати більше %d аргум msgstr[2] "функції не можуть мати більше %d аргументів" msgstr[3] "функції не можуть мати більше %d аргументів" -#: catalog/pg_proc.c:375 +#: catalog/pg_proc.c:376 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "функція \"%s\" з аргументами таких типів вже існує" -#: catalog/pg_proc.c:387 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" є функцією агрегату." -#: catalog/pg_proc.c:389 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" є функцією." -#: catalog/pg_proc.c:391 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" є процедурою." -#: catalog/pg_proc.c:393 +#: catalog/pg_proc.c:394 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" є функцією вікна." -#: catalog/pg_proc.c:413 +#: catalog/pg_proc.c:414 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "неможливо визначити вихідні параметри для процедури" -#: catalog/pg_proc.c:414 catalog/pg_proc.c:444 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format msgid "cannot change return type of existing function" msgstr "неможливо змінити тип повернення існуючої функції" @@ -5469,89 +5783,120 @@ msgstr "неможливо змінити тип повернення існую #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: 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 +#: 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:445 +#: catalog/pg_proc.c:446 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметри OUT визначають другий тип рядку." -#: catalog/pg_proc.c:489 +#: catalog/pg_proc.c:490 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "неможливо змінити ім'я вхідного параметру \"%s\"" -#: catalog/pg_proc.c:516 +#: catalog/pg_proc.c:517 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "неможливо прибрати параметр за замовчуванням з існуючої функції" -#: catalog/pg_proc.c:542 +#: catalog/pg_proc.c:543 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "неможливо змінити тип даних для існуючого значення параметру за замовчуванням" -#: catalog/pg_proc.c:752 +#: catalog/pg_proc.c:757 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "немає вбудованої функції \"%s\"" -#: catalog/pg_proc.c:850 +#: catalog/pg_proc.c:855 #, c-format msgid "SQL functions cannot return type %s" msgstr "Функції SQL не можуть повернути тип %s" -#: catalog/pg_proc.c:865 +#: catalog/pg_proc.c:870 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "функції SQL не можуть мати аргументи типу %s" -#: catalog/pg_proc.c:995 executor/functions.c:1473 +#: catalog/pg_proc.c:1000 executor/functions.c:1473 #, c-format msgid "SQL function \"%s\"" msgstr "Функція SQL \"%s\"" -#: catalog/pg_publication.c:60 +#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 +#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "не можна додати відношення \"%s\" до публікації" + +#: catalog/pg_publication.c:73 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "Ця операція не підтримується для системних таблиць." + +#: catalog/pg_publication.c:81 #, c-format -msgid "Only tables can be added to publications." -msgstr "Тільки системні таблиці можуть бути додані до публікацій." +msgid "This operation is not supported for temporary tables." +msgstr "Ця операція не підтримується для тимчасових таблиць." -#: catalog/pg_publication.c:66 +#: catalog/pg_publication.c:87 #, c-format -msgid "\"%s\" is a system table" -msgstr "\"%s\" є системною таблицею" +msgid "This operation is not supported for unlogged tables." +msgstr "Ця операція не підтримується для таблиць без журналювання." -#: catalog/pg_publication.c:68 +#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 #, c-format -msgid "System tables cannot be added to publications." -msgstr "Системні таблиці не можуть бути додані до публікацій." +msgid "cannot add schema \"%s\" to publication" +msgstr "не можна додати схему \"%s\" до публікації" -#: catalog/pg_publication.c:74 +#: catalog/pg_publication.c:103 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "таблиця \"%s\" не може бути реплікованою" +msgid "This operation is not supported for system schemas." +msgstr "Ця операція не підтримується для системних схем." -#: catalog/pg_publication.c:76 +#: catalog/pg_publication.c:111 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "Тимчасові і нежурнальованні відношення не можуть бути реплікованими." +msgid "Temporary schemas cannot be replicated." +msgstr "Тимчасові схеми не можуть бути репліковані." -#: catalog/pg_publication.c:251 +#: catalog/pg_publication.c:374 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "відношення \"%s\" вже є членом публікації \"%s\"" -#: catalog/pg_publication.c:533 commands/publicationcmds.c:458 -#: commands/publicationcmds.c:786 +#: catalog/pg_publication.c:516 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "не можна використати системний стовпець \"%s\" у списку стовпців публікації" + +#: catalog/pg_publication.c:522 +#, c-format +msgid "cannot use 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:1391 +#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 #, c-format msgid "publication \"%s\" does not exist" msgstr "публікація \"%s\" вже існує" -#: catalog/pg_shdepend.c:833 +#: catalog/pg_shdepend.c:829 #, c-format msgid "\n" "and objects in %d other database (see server log for list)" @@ -5566,43 +5911,43 @@ msgstr[2] "\n" msgstr[3] "\n" "і об'єкти в %d інших базах даних (див. список в протоколі сервера)" -#: catalog/pg_shdepend.c:1180 +#: catalog/pg_shdepend.c:1176 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1192 +#: catalog/pg_shdepend.c:1188 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличний простір %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1206 +#: catalog/pg_shdepend.c:1202 #, c-format msgid "database %u was concurrently dropped" msgstr "базу даних %u було видалено паралельним способом" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1253 #, c-format msgid "owner of %s" msgstr "власник об'єкту %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1255 #, c-format msgid "privileges for %s" msgstr "права для %s" -#: catalog/pg_shdepend.c:1261 +#: catalog/pg_shdepend.c:1257 #, c-format msgid "target of %s" msgstr "ціль %s" -#: catalog/pg_shdepend.c:1263 +#: catalog/pg_shdepend.c:1259 #, c-format msgid "tablespace for %s" msgstr "табличний простір для %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1271 +#: catalog/pg_shdepend.c:1267 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -5611,28 +5956,28 @@ msgstr[1] "%d об'єкти в %s" msgstr[2] "%d об'єктів у %s" msgstr[3] "%d об'єктів у %s" -#: catalog/pg_shdepend.c:1382 +#: 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:1529 +#: 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:174 commands/subscriptioncmds.c:779 -#: commands/subscriptioncmds.c:1088 commands/subscriptioncmds.c:1431 +#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 #, c-format msgid "subscription \"%s\" does not exist" msgstr "підписка \"%s\" не існує" -#: catalog/pg_subscription.c:432 +#: catalog/pg_subscription.c:474 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "не вдалося видалити зіставлення відношень для підписки \"%s\"" -#: 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 "Синхронізація таблиць для відношення \"%s\" у процесі та знаходиться у стані \"%c\"." @@ -5640,7 +5985,7 @@ msgstr "Синхронізація таблиць для відношення \" #. 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 "Використайте %s, щоб активувати підписку, якщо вона ще не активована, або використайте %s, щоб видалити підписку." @@ -5671,7 +6016,7 @@ msgstr "внутрішній розмір %d недійсний для типу, msgid "alignment \"%c\" is invalid for variable-length type" msgstr "вирівнювання \"%c\" недійсне для типу змінної довжини" -#: catalog/pg_type.c:328 commands/typecmds.c:4164 +#: catalog/pg_type.c:328 commands/typecmds.c:4151 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типів фіксованого розміру застосовується лише режим зберігання PLAIN" @@ -5691,17 +6036,11 @@ msgstr "Помилка під час створення багатодіапаз msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Ви можете вручну вказати назву багатодіапазонного типу за допомогою атрибуту \"multirange_type_name\"." -#: catalog/storage.c:495 storage/buffer/bufmgr.c:1039 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неприпустима сторінка в блоці %u відношення %s" -#: catalog/toasting.c:110 commands/indexcmds.c:692 commands/tablecmds.c:6094 -#: commands/tablecmds.c:16490 -#, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\" не є таблицею або матеріалізованим поданням" - #: commands/aggregatecmds.c:170 #, c-format msgid "only ordered-set aggregates can be hypothetical" @@ -5782,7 +6121,7 @@ msgstr "функції серіалізації можуть визначати msgid "must specify both or neither of serialization and deserialization functions" msgstr "повинні визначатись обидві або жодна з серіалізуючих та десеріалізуючих функцій" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:650 +#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "параметр \"parallel\" має мати значення SAFE, RESTRICTED, або UNSAFE" @@ -5797,12 +6136,12 @@ msgstr "параметр \"%s\" має мати значення READ_ONLY, SHAR 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:888 +#: commands/alter.c:90 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" вже існує" @@ -5812,12 +6151,12 @@ msgstr "сервер \"%s\" вже існує" msgid "language \"%s\" already exists" msgstr "мова \"%s\" вже існує" -#: commands/alter.c:96 commands/publicationcmds.c:180 +#: commands/alter.c:96 commands/publicationcmds.c:770 #, c-format msgid "publication \"%s\" already exists" msgstr "публікація \"%s\" вже існує" -#: commands/alter.c:99 commands/subscriptioncmds.c:400 +#: commands/alter.c:99 commands/subscriptioncmds.c:567 #, c-format msgid "subscription \"%s\" already exists" msgstr "підписка \"%s\" вже існує" @@ -5857,7 +6196,7 @@ msgstr "конфігурація текстового пошуку \"%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 може тільки суперкористувач" @@ -5877,7 +6216,7 @@ msgstr "Тільки суперкористувач може створити м msgid "access method \"%s\" already exists" msgstr "метод доступу \"%s\" вже існує" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:843 +#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -5889,53 +6228,53 @@ msgid "handler function is not specified" msgstr "функція-обробник не вказана" #: 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 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:714 +#: parser/parse_clause.c:942 #, c-format msgid "function %s must return type %s" msgstr "функція %s повинна повертати тип %s" -#: commands/analyze.c:227 +#: commands/analyze.c:228 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "пропуск об'єкту \"%s\" --- неможливо аналізувати цю сторонню таблицю" -#: commands/analyze.c:244 +#: commands/analyze.c:245 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "пропуск об'єкту \"%s\" --- неможливо аналізувати не-таблиці або спеціальні системні таблиці" -#: commands/analyze.c:324 +#: commands/analyze.c:325 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "аналізується дерево наслідування \"%s.%s\"" -#: commands/analyze.c:329 +#: commands/analyze.c:330 #, c-format msgid "analyzing \"%s.%s\"" msgstr "аналіз \"%s.%s\"" -#: commands/analyze.c:395 +#: commands/analyze.c:396 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "стовпець \"%s\" відносно \"%s\" з'являється більше одного разу" -#: commands/analyze.c:805 +#: commands/analyze.c:787 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"\n" -#: commands/analyze.c:1352 +#: commands/analyze.c:1334 #, 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:1436 +#: 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:1534 +#: 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\" --- це дерево наслідування не містить аналізуючих дочірніх таблиць" @@ -5965,97 +6304,97 @@ msgstr "виконати PREPARE для транзакції, яка викон msgid "too many notifications in the NOTIFY queue" msgstr "занадто багато сповіщень у черзі NOTIFY" -#: commands/async.c:1616 +#: commands/async.c:1602 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "Черга NOTIFY заповнена на %.0f%%" -#: commands/async.c:1618 +#: 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:1621 +#: commands/async.c:1607 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "Черга NOTIFY не може бути спорожненою, поки цей процес не завершить поточну транзакцію." -#: commands/cluster.c:119 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "нерозпізнаний параметр CLUSTER \"%s\"" -#: commands/cluster.c:147 commands/cluster.c:395 +#: commands/cluster.c:158 commands/cluster.c:431 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "не можна кластеризувати тимчасові таблиці з інших сеансів" -#: commands/cluster.c:155 -#, c-format -msgid "cannot cluster a partitioned table" -msgstr "не можна кластеризувати секційну таблицю" - -#: commands/cluster.c:173 +#: commands/cluster.c:176 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "немає попереднього кластеризованого індексу для таблиці \"%s\"" -#: commands/cluster.c:187 commands/tablecmds.c:13665 commands/tablecmds.c:15524 +#: commands/cluster.c:190 commands/tablecmds.c:14179 commands/tablecmds.c:16060 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "індекс \"%s\" для таблці \"%s\" не існує" -#: commands/cluster.c:384 +#: commands/cluster.c:420 #, c-format msgid "cannot cluster a shared catalog" msgstr "не можна кластеризувати спільний каталог" -#: commands/cluster.c:399 +#: commands/cluster.c:435 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "не можна очищати тимчасові таблиці з інших сеансів" -#: commands/cluster.c:471 commands/tablecmds.c:15534 +#: commands/cluster.c:511 commands/tablecmds.c:16070 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не є індексом для таблиці \"%s\"" -#: commands/cluster.c:479 +#: commands/cluster.c:519 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "кластеризація за індексом \"%s\" неможлива, тому що метод доступу не підтримує кластеризацію" -#: commands/cluster.c:491 +#: commands/cluster.c:531 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "неможливо кластеризувати за секційним індексом \"%s\"" -#: commands/cluster.c:505 +#: commands/cluster.c:545 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "неможливо кластеризувати за невірним індексом \"%s\"" -#: commands/cluster.c:529 +#: commands/cluster.c:569 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "неможливо помітити індекс кластеризованим в секційній таблиці" -#: commands/cluster.c:902 +#: commands/cluster.c:948 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "кластеризація \"%s.%s\" з використанням сканування індексу \"%s\"" -#: commands/cluster.c:908 +#: commands/cluster.c:954 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "кластеризація \"%s.%s\"з використанням послідовного сканування та сортування" -#: commands/cluster.c:939 +#: commands/cluster.c:959 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "очищення \"%s.%s\"" + +#: commands/cluster.c:985 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "\"%s\": знайдено версій рядків, що можуть бути видалені: %.0f, що не можуть бути видалені - %.0f, переглянуто сторінок: %u" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%s.%s\": знайдено версій рядків, що можуть бути видалені %.0f, що не можуть бути видалені %.0f, переглянуто сторінок %u" -#: commands/cluster.c:943 +#: commands/cluster.c:990 #, c-format msgid "%.0f dead row versions cannot be removed yet.\n" "%s." @@ -6067,97 +6406,124 @@ msgstr "%.0f \"мертві\" версії рядків досі не можут msgid "collation attribute \"%s\" not recognized" msgstr "атрибут collation \"%s\" не розпізнаний" -#: commands/collationcmds.c:149 +#: commands/collationcmds.c:119 commands/collationcmds.c:125 +#: commands/define.c:389 commands/tablecmds.c:7808 +#: 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:1001 replication/walsender.c:1023 +#: replication/walsender.c:1033 +#, 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." + +#: 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 "сортування \"за замовчуванням\" не може бути скопійовано" -#: commands/collationcmds.c:182 +#: commands/collationcmds.c:204 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний постачальник правил сортування: %s" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:232 #, c-format msgid "parameter \"lc_collate\" must be specified" msgstr "необхідно вказати параметр \"lc_collate\"" -#: commands/collationcmds.c:196 +#: commands/collationcmds.c:237 #, c-format msgid "parameter \"lc_ctype\" must be specified" msgstr "необхідно вказати параметр \"lc_ctype\"" -#: commands/collationcmds.c:206 +#: commands/collationcmds.c:244 +#, c-format +msgid "parameter \"locale\" must be specified" +msgstr "необхідно вказати параметр \"locale\"" + +#: commands/collationcmds.c:256 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "недетерміновані правила сортування не підтримуються цим провайдером" -#: commands/collationcmds.c:227 +#: commands/collationcmds.c:275 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "кодування поточної бази даних не підтримується цим провайдером" -#: commands/collationcmds.c:285 +#: commands/collationcmds.c:334 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "правило сортування \"%s\" для кодування \"%s\" вже існує в схемі \"%s\"" -#: commands/collationcmds.c:296 +#: commands/collationcmds.c:345 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило сортування \"%s\" вже існує в схемі \"%s\"" -#: commands/collationcmds.c:344 +#: commands/collationcmds.c:395 commands/dbcommands.c:2432 #, c-format msgid "changing version from %s to %s" msgstr "зміна версії з %s на %s" -#: commands/collationcmds.c:359 +#: commands/collationcmds.c:410 commands/dbcommands.c:2445 #, c-format msgid "version has not changed" msgstr "версію не змінено" -#: commands/collationcmds.c:473 +#: commands/collationcmds.c:532 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не вдалося перетворити локальну назву \"%s\" на мітку мови: %s" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:590 #, c-format msgid "must be superuser to import system collations" msgstr "імпортувати систмені правила сортування може тільки суперкористувач" -#: commands/collationcmds.c:559 commands/copyfrom.c:1500 commands/copyto.c:680 +#: commands/collationcmds.c:618 commands/copyfrom.c:1509 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:690 +#: commands/collationcmds.c:753 #, c-format msgid "no usable system locales were found" msgstr "придатні системні локалі не знайдені" -#: commands/comment.c:61 commands/dbcommands.c:853 commands/dbcommands.c:1064 -#: commands/dbcommands.c:1177 commands/dbcommands.c:1367 -#: commands/dbcommands.c:1615 commands/dbcommands.c:1737 -#: commands/dbcommands.c:2177 utils/init/postinit.c:887 -#: utils/init/postinit.c:993 utils/init/postinit.c:1019 +#: commands/comment.c:61 commands/dbcommands.c:1549 commands/dbcommands.c:1761 +#: commands/dbcommands.c:1874 commands/dbcommands.c:2068 +#: commands/dbcommands.c:2310 commands/dbcommands.c:2405 +#: commands/dbcommands.c:2515 commands/dbcommands.c:3014 +#: utils/init/postinit.c:947 utils/init/postinit.c:1011 +#: utils/init/postinit.c:1083 #, c-format msgid "database \"%s\" does not exist" msgstr "бази даних \"%s\" не існує" -#: commands/comment.c:101 commands/seclabel.c:191 parser/parse_utilcmd.c:990 +#: 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:1948 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "функція \"%s\" не була викликана менеджером тригерів" -#: 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 "функція \"%s\" повинна запускатися в AFTER ROW" @@ -6194,8 +6560,8 @@ msgstr "функція перетворення кодування %s повер #: 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:87 commands/copy.c:96 commands/copy.c:103 #, c-format @@ -6204,13 +6570,13 @@ msgstr "Будь-хто може використати COPY to stdout або fr #: 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 "потрібно бути суперкористувачем або членом ролі pg_read_server_files, щоб виконати COPY з читанням файлу" +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:102 #, 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 з записом у файл" +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:188 #, c-format @@ -6222,485 +6588,520 @@ msgstr "COPY FROM не підтримується із захистом на р msgid "Use INSERT statements instead." msgstr "Використайте оператори INSERT замість цього." -#: commands/copy.c:377 +#: commands/copy.c:283 +#, c-format +msgid "MERGE not supported in COPY" +msgstr "COPY не підтримує MERGE" + +#: commands/copy.c:376 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "використовувати \"%s\" з HEADER в COPY TO не можна" + +#: commands/copy.c:385 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s потребує Boolean або \"відповідність\"" + +#: commands/copy.c:444 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "Формат \"%s\" для COPY не розпізнано" -#: commands/copy.c:450 commands/copy.c:466 commands/copy.c:481 -#: commands/copy.c:503 +#: commands/copy.c:496 commands/copy.c:509 commands/copy.c:522 +#: commands/copy.c:541 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом функції \"%s\" повинен бути список імен стовпців" -#: commands/copy.c:518 +#: commands/copy.c:553 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом функції \"%s\" повинне бути припустиме ім'я коду" -#: commands/copy.c:525 commands/dbcommands.c:254 commands/dbcommands.c:1563 +#: commands/copy.c:560 commands/dbcommands.c:849 commands/dbcommands.c:2258 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не розпізнано" -#: commands/copy.c:537 +#: commands/copy.c:572 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "неможливо визначити DELIMITER в режимі BINARY" -#: commands/copy.c:542 +#: commands/copy.c:577 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "неможливо визначити NULL в режимі BINARY" -#: commands/copy.c:564 +#: commands/copy.c:599 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "роздільник для COPY повинен бути однобайтовим символом" -#: commands/copy.c:571 +#: commands/copy.c:606 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "Роздільник для COPY не може бути символом нового рядка або повернення каретки" -#: commands/copy.c:577 +#: commands/copy.c:612 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "Подання NULL для COPY не може включати символ нового рядка або повернення каретки" -#: commands/copy.c:594 +#: commands/copy.c:629 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "роздільник COPY не може бути \"%s\"" -#: commands/copy.c:600 +#: commands/copy.c:635 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADER доступний тільки в режимі CSV" +msgid "cannot specify HEADER in BINARY mode" +msgstr "не можна вказати HEADER у режимі BINARY" -#: commands/copy.c:606 +#: commands/copy.c:641 #, c-format msgid "COPY quote available only in CSV mode" msgstr "лапки для COPY доустпні тільки в режимі CSV" -#: commands/copy.c:611 +#: commands/copy.c:646 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "лапки для COPY повинні бути однобайтовим символом" -#: commands/copy.c:616 +#: commands/copy.c:651 #, c-format msgid "COPY delimiter and quote must be different" msgstr "роздільник і лапки для COPY повинні бути різними" -#: commands/copy.c:622 +#: commands/copy.c:657 #, c-format msgid "COPY escape available only in CSV mode" msgstr "вихід для COPY доступний тільки в режимі CSV" -#: commands/copy.c:627 +#: commands/copy.c:662 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "вихід для COPY повинен бути однобайтовим символом" -#: commands/copy.c:633 +#: commands/copy.c:668 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "Параметр force quote для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:637 +#: commands/copy.c:672 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "Параметр force quote для COPY можна використати тільки з COPY TO" -#: commands/copy.c:643 +#: commands/copy.c:678 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "Параметр force not null для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:647 +#: commands/copy.c:682 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "Параметр force not null для COPY можна використати тільки з COPY FROM" -#: commands/copy.c:653 +#: commands/copy.c:688 #, c-format msgid "COPY force null available only in CSV mode" msgstr "Параметр force null для COPY можна використати тільки в режимі CSV" -#: commands/copy.c:658 +#: commands/copy.c:693 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "Параметр force null only для COPY можна використати тільки з COPY FROM" -#: commands/copy.c:664 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "роздільник COPY не повинен з'являтися у специфікації NULL" -#: commands/copy.c:671 +#: commands/copy.c:706 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "лапки CSV не повинні з'являтися у специфікації NULL" -#: commands/copy.c:732 +#: commands/copy.c:767 #, c-format msgid "column \"%s\" is a generated column" msgstr "стовпець \"%s\" є згенерованим стовпцем" -#: commands/copy.c:734 +#: commands/copy.c:769 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Згенеровані стовпці не можна використовувати в COPY." -#: commands/copy.c:749 commands/indexcmds.c:1859 commands/statscmds.c:245 -#: commands/tablecmds.c:2347 commands/tablecmds.c:3003 -#: commands/tablecmds.c:3496 parser/parse_relation.c:3642 -#: parser/parse_relation.c:3662 utils/adt/tsvector_op.c:2683 +#: commands/copy.c:784 commands/indexcmds.c:1826 commands/statscmds.c:243 +#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 +#: commands/tablecmds.c:3529 parser/parse_relation.c:3660 +#: parser/parse_relation.c:3680 utils/adt/tsvector_op.c:2688 #, c-format msgid "column \"%s\" does not exist" msgstr "стовпця \"%s\" не існує" -#: commands/copy.c:756 commands/tablecmds.c:2373 commands/trigger.c:951 +#: commands/copy.c:791 commands/tablecmds.c:2405 commands/trigger.c:963 #: parser/parse_target.c:1079 parser/parse_target.c:1090 #, c-format msgid "column \"%s\" specified more than once" msgstr "стовпець \"%s\" вказано більше чим один раз" -#: commands/copyfrom.c:127 +#: commands/copyfrom.c:123 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "COPY %s, рядок%s, стовпець %s" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, рядок %llu, стовпець %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, рядок %s" +msgid "COPY %s, line %llu" +msgstr "COPY %s, рядок %llu" -#: commands/copyfrom.c:142 +#: commands/copyfrom.c:140 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "COPY %s, рядок %s, стовпець %s: \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, рядок %llu, стовпець %s: \"%s\"" #: commands/copyfrom.c:150 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, рядок %s, стовпець %s: значення нуль" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, рядок %llu, стовпець %s: null введення" -#: commands/copyfrom.c:166 +#: commands/copyfrom.c:167 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "COPY %s, рядок %s: \"%s\"" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, рядок %llu: \"%s\"" -#: commands/copyfrom.c:566 +#: commands/copyfrom.c:569 #, c-format msgid "cannot copy to view \"%s\"" msgstr "неможливо скопіювати до подання \"%s\"" -#: commands/copyfrom.c:568 +#: commands/copyfrom.c:571 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Щоб подання допускало копіювання даних у нього, встановіть тригер INSTEAD OF INSERT." -#: commands/copyfrom.c:572 +#: commands/copyfrom.c:575 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "не можна копіювати матеріалізоване подання \"%s\"" -#: commands/copyfrom.c:577 +#: commands/copyfrom.c:580 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "неможливо скопіювати послідовність \"%s\"" -#: commands/copyfrom.c:582 +#: commands/copyfrom.c:585 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "неможливо копіювати у відношення \"%s\", яке не є таблицею" -#: commands/copyfrom.c:622 +#: commands/copyfrom.c:625 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "виконати COPY FREEZE в секціонованій таблиці не можна" -#: commands/copyfrom.c:637 +#: commands/copyfrom.c:640 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "виконати COPY FREEZE через попередню активність в транзакції не можна" -#: 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, тому, що таблиця не була створена або скорочена в поточній підтранзакції" -#: commands/copyfrom.c:1264 commands/copyto.c:612 +#: commands/copyfrom.c:1270 commands/copyto.c:611 #, 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 +#: commands/copyfrom.c:1293 commands/copyto.c:634 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "Стовпець FORCE_NULL \"%s\" не фігурує в COPY" -#: commands/copyfrom.c:1519 +#: commands/copyfrom.c:1346 utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "функції за замовчуванням перетворення з кодування \"%s\" в \"%s\" не існує" + +#: commands/copyfrom.c:1528 #, 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/copyfrom.c:1532 commands/copyto.c:732 +#: commands/copyfrom.c:1541 commands/copyto.c:731 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\" - каталог" -#: commands/copyfrom.c:1600 commands/copyto.c:302 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1609 commands/copyto.c:301 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 +#: commands/copyfrom.c:1624 commands/copyto.c:306 #, c-format msgid "program \"%s\" failed" msgstr "збій програми \"%s\"" -#: commands/copyfromparse.c:199 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "Підпис COPY-файлу не розпізнано" -#: commands/copyfromparse.c:204 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "невірний заголовок файлу COPY (відсутні прапори)" -#: commands/copyfromparse.c:208 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "невірний заголовок файла COPY (WITH OIDS)" -#: commands/copyfromparse.c:213 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "не розпізнано важливі прапори в заголовку файлу COPY" -#: commands/copyfromparse.c:219 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "невірний заголовок файлу COPY (відсутня довжина)" -#: commands/copyfromparse.c:226 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "невірний заголовок файлу COPY (невірна довжина)" -#: commands/copyfromparse.c:255 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "не вдалося прочитати файл COPY: %m" -#: commands/copyfromparse.c:277 commands/copyfromparse.c:302 -#: tcop/postgres.c:359 +#: 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 "неочікуваний обрив з'єднання з клієнтом при відкритій транзакції" -#: commands/copyfromparse.c:293 +#: commands/copyfromparse.c:294 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "неочікуваний тип повідомлення 0x%02X під час COPY з stdin" -#: commands/copyfromparse.c:316 +#: commands/copyfromparse.c:317 #, c-format msgid "COPY from stdin failed: %s" msgstr "помилка при stdin COPY: %s" -#: commands/copyfromparse.c:841 commands/copyfromparse.c:1446 -#: commands/copyfromparse.c:1676 +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "неправильна кількість полів у рядку заголовку: отримано %d, очікувалось %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "невідповідність назви стовпця в полі заголовку %d: отримано null (\"%s\"), очікувалось \"%s\"" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "невідповідність назви стовпця в полі заголовку %d: отримано \"%s\", очікувалось \"%s\"" + +#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 +#: commands/copyfromparse.c:1725 #, c-format msgid "extra data after last expected column" msgstr "зайві дані після вмісту останнього стовпця" -#: commands/copyfromparse.c:855 +#: commands/copyfromparse.c:904 #, c-format msgid "missing data for column \"%s\"" msgstr "відсутні дані для стовпця \"%s\"" -#: commands/copyfromparse.c:933 +#: commands/copyfromparse.c:982 #, c-format msgid "received copy data after EOF marker" msgstr "після маркера кінця файлу продовжуються дані COPY" -#: commands/copyfromparse.c:940 +#: commands/copyfromparse.c:989 #, c-format msgid "row field count is %d, expected %d" msgstr "кількість полів у рядку: %d, очікувалось: %d" -#: commands/copyfromparse.c:1228 commands/copyfromparse.c:1245 +#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 #, c-format msgid "literal carriage return found in data" msgstr "в даних виявлено явне повернення каретки" -#: commands/copyfromparse.c:1229 commands/copyfromparse.c:1246 +#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 #, c-format msgid "unquoted carriage return found in data" msgstr "в даних виявлено повернення каретки без лапок" -#: commands/copyfromparse.c:1231 commands/copyfromparse.c:1248 +#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Використайте \"\\r\", щоб позначити повернення каретки." -#: commands/copyfromparse.c:1232 commands/copyfromparse.c:1249 +#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Використайте CSV в лапках, щоб позначити повернення каретки." -#: commands/copyfromparse.c:1261 +#: commands/copyfromparse.c:1310 #, c-format msgid "literal newline found in data" msgstr "в даних знайдено явний новий рядок" -#: commands/copyfromparse.c:1262 +#: commands/copyfromparse.c:1311 #, c-format msgid "unquoted newline found in data" msgstr "в даних знайдено новий рядок без лапок" -#: commands/copyfromparse.c:1264 +#: commands/copyfromparse.c:1313 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Використайте \"\\n\", щоб представити новий рядок." -#: commands/copyfromparse.c:1265 +#: commands/copyfromparse.c:1314 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Використайте CSV в лапках, щоб позначити новий рядок." -#: commands/copyfromparse.c:1311 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"кінець копії\" не відповідає попередньому стилю нового рядка" -#: commands/copyfromparse.c:1320 commands/copyfromparse.c:1336 +#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"кінець копії\" зіпсований" -#: commands/copyfromparse.c:1760 +#: commands/copyfromparse.c:1809 #, c-format msgid "unterminated CSV quoted field" msgstr "незакінчене поле в лапках CSV" -#: commands/copyfromparse.c:1836 commands/copyfromparse.c:1855 +#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 #, c-format msgid "unexpected EOF in COPY data" msgstr "неочікуваний кінец файлу в даних COPY" -#: commands/copyfromparse.c:1845 +#: commands/copyfromparse.c:1894 #, c-format msgid "invalid field size" msgstr "невірний розмір поля" -#: commands/copyfromparse.c:1868 +#: commands/copyfromparse.c:1917 #, c-format msgid "incorrect binary data format" msgstr "невірний двійковий формат даних" -#: commands/copyto.c:235 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY program: %m" msgstr "не вдалося записати в канал програми COPY: %m" -#: commands/copyto.c:240 +#: commands/copyto.c:239 #, c-format msgid "could not write to COPY file: %m" msgstr "не можливо записати в файл COPY: %m" -#: commands/copyto.c:370 +#: commands/copyto.c:369 #, c-format msgid "cannot copy from view \"%s\"" msgstr "неможливо скопіювати з подання \"%s\"" -#: 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 "Спробуйте варіацію COPY (SELECT ...) TO." -#: commands/copyto.c:376 +#: commands/copyto.c:375 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "неможливо скопіювати з матеріалізованого подання \"%s\"" -#: commands/copyto.c:382 +#: commands/copyto.c:381 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "неможливо скопіювати зі сторонньої таблиці \"%s\"" -#: commands/copyto.c:388 +#: commands/copyto.c:387 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "не вдалося скопіювати з послідовності \"%s\"" -#: commands/copyto.c:393 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "неможливо скопіювати з секційної таблиці \"%s\"" -#: commands/copyto.c:399 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "не можна копіювати з відношення \"%s\", котре не є таблицею" -#: commands/copyto.c:451 +#: commands/copyto.c:450 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "правила DO INSTEAD NOTHING не підтримуються для COPY" -#: commands/copyto.c:465 +#: commands/copyto.c:464 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "умовні правила DO INSTEAD не підтримуються для COPY" -#: commands/copyto.c:469 +#: commands/copyto.c:468 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "правила DO ALSO не підтримуються для COPY" -#: commands/copyto.c:474 +#: commands/copyto.c:473 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "складові правила DO INSTEAD не підтримуються з COPY" -#: commands/copyto.c:484 +#: commands/copyto.c:483 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) не підтримується" -#: commands/copyto.c:501 +#: commands/copyto.c:500 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "В запиті COPY повинно бути речення RETURNING" -#: commands/copyto.c:530 +#: commands/copyto.c:529 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "відношення, згадане в операторі COPY, змінилось" -#: commands/copyto.c:589 +#: commands/copyto.c:588 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "Стовпець FORCE_QUOTE \"%s\" не фігурує в COPY" -#: commands/copyto.c:697 +#: commands/copyto.c:696 #, c-format msgid "relative path not allowed for COPY to file" msgstr "при виконанні COPY в файл не можна вказувати відносний шлях" -#: commands/copyto.c:716 +#: commands/copyto.c:715 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не вдалося відкрити файл \"%s\" для запису: %m" -#: commands/copyto.c:719 +#: 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 записати дані до файлу. Можливо, вам потрібна клієнтська команда, наприклад \\copy в psql." @@ -6715,164 +7116,244 @@ msgstr "вказано забагато імен стовпців" msgid "policies not yet implemented for this command" msgstr "політики для цієї команди все ще не реалізовані" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:812 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION більше не підтримується" -#: commands/dbcommands.c:248 +#: commands/dbcommands.c:813 #, c-format msgid "Consider using tablespaces instead." msgstr "Розгляньте можливість використання табличних просторів." -#: commands/dbcommands.c:262 +#: commands/dbcommands.c:838 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE не може вказуватись разом з LC_COLLATE або LC_CTYPE." +msgid "OIDs less than %u are reserved for system objects" +msgstr "OID котрі менше ніж %u, зарезервовані для системних об'єктів" -#: commands/dbcommands.c:280 utils/adt/ascii.c:145 +#: commands/dbcommands.c:869 utils/adt/ascii.c:145 #, c-format msgid "%d is not a valid encoding code" msgstr "%d не є вірним кодом кодування" -#: commands/dbcommands.c:291 utils/adt/ascii.c:127 +#: commands/dbcommands.c:880 utils/adt/ascii.c:127 #, c-format msgid "%s is not a valid encoding name" msgstr "%s не є вірним ім'ям кодування" -#: commands/dbcommands.c:315 commands/dbcommands.c:1596 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:907 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "нерозпізнаний постачальник локалів: %s" + +#: commands/dbcommands.c:920 commands/dbcommands.c:2291 commands/user.c:237 +#: commands/user.c:611 #, c-format msgid "invalid connection limit: %d" msgstr "недійсний ліміт з'єднання: %d" -#: commands/dbcommands.c:334 +#: commands/dbcommands.c:941 #, c-format msgid "permission denied to create database" msgstr "немає дозволу для створення бази даних" -#: commands/dbcommands.c:357 +#: commands/dbcommands.c:965 #, c-format msgid "template database \"%s\" does not exist" msgstr "шаблону бази даних \"%s\" не існує" -#: commands/dbcommands.c:367 +#: commands/dbcommands.c:975 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "не можна використовувати невірну базу даних \"%s\" в якості шаблону" -#: commands/dbcommands.c:368 commands/dbcommands.c:1625 -#: utils/init/postinit.c:1002 +#: commands/dbcommands.c:976 commands/dbcommands.c:2320 +#: utils/init/postinit.c:1026 #, c-format msgid "Use DROP DATABASE to drop invalid databases." msgstr "Використайте DROP DATABASE для видалення невірних баз даних." -#: commands/dbcommands.c:379 +#: commands/dbcommands.c:987 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "немає дозволу для копіювання бази даних \"%s\"" -#: commands/dbcommands.c:395 +#: commands/dbcommands.c:1004 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "неприпустима стратегія створення бази даних \"%s\"" + +#: commands/dbcommands.c:1005 +#, c-format +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "Припустимі стратегії: \"wal_log\" і \"file_copy\"." + +#: commands/dbcommands.c:1024 #, c-format msgid "invalid server encoding %d" msgstr "недійсний сервер кодування %d" -#: commands/dbcommands.c:401 commands/dbcommands.c:406 +#: commands/dbcommands.c:1030 commands/dbcommands.c:1035 #, c-format msgid "invalid locale name: \"%s\"" msgstr "неприпустиме ім'я локалі: \"%s\"" -#: commands/dbcommands.c:426 +#: commands/dbcommands.c:1045 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "кодування \"%s\" не підтримується провайдером ICU" + +#: commands/dbcommands.c:1055 +#, c-format +msgid "ICU locale must be specified" +msgstr "Необхідно вказати локаль ICU" + +#: commands/dbcommands.c:1064 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU локаль не може бути визначена, якщо постачальник локалі не ICU" + +#: commands/dbcommands.c:1082 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "нове кодування (%s) несумісне з кодуванням шаблона бази даних (%s)" -#: commands/dbcommands.c:429 +#: commands/dbcommands.c:1085 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Використайте кодування шаблона бази даних або виберіть template0 в якості шаблона." -#: commands/dbcommands.c:434 +#: commands/dbcommands.c:1090 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "нове правило сортування (%s) несумісне з правилом в шаблоні бази даних (%s)" -#: commands/dbcommands.c:436 +#: commands/dbcommands.c:1092 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Використайте те ж саме правило сортування, що і в шаблоні бази даних, або виберіть template0 в якості шаблона." -#: commands/dbcommands.c:441 +#: commands/dbcommands.c:1097 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "новий параметр LC_CTYPE (%s) несумісний з LC_CTYPE в шаблоні бази даних (%s)" -#: commands/dbcommands.c:443 +#: commands/dbcommands.c:1099 #, 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:465 commands/dbcommands.c:1223 +#: commands/dbcommands.c:1104 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "новий постачальник локалі (%s) не відповідає постачальнику локалі шаблону бази даних (%s)" + +#: commands/dbcommands.c:1106 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "Використайте такого ж постачальника локалі, що й у шаблоні бази даних, або використайте template0 в якості шаблону." + +#: commands/dbcommands.c:1115 +#, 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:1117 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "Використайте таку ж ICU локаль, що й у шаблоні бази даних, або використайте template0 в якості шаблону." + +#: commands/dbcommands.c:1140 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "шаблон бази даних \"%s\" має версію правил сортування, але фактичну версію визначити не вдалося" + +#: commands/dbcommands.c:1145 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "шаблон бази даних \"%s\" має невідповідність версії параметрів сортування" + +#: commands/dbcommands.c:1147 +#, 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:1150 +#, 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:1186 commands/dbcommands.c:1920 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global не можна використати в якості табличного простору за замовчуванням" -#: commands/dbcommands.c:491 +#: commands/dbcommands.c:1212 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "не вдалося призначити новий табличний простір за замовчуванням \"%s\"" -#: commands/dbcommands.c:493 +#: commands/dbcommands.c:1214 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "БД \"%s\" вже містить таблиці, що знаходяться в цьому табличному просторі." -#: commands/dbcommands.c:523 commands/dbcommands.c:1093 +#: commands/dbcommands.c:1244 commands/dbcommands.c:1790 #, c-format msgid "database \"%s\" already exists" msgstr "база даних \"%s\" вже існує" -#: commands/dbcommands.c:537 +#: commands/dbcommands.c:1258 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "вихідна база даних \"%s\" зайнята іншими користувачами" -#: commands/dbcommands.c:780 commands/dbcommands.c:795 +#: commands/dbcommands.c:1280 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "OID %u вже використовується базою даних \"%s\" вже використовує" + +#: commands/dbcommands.c:1286 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "каталог даних з вказаним OID %u вже існує" + +#: commands/dbcommands.c:1457 commands/dbcommands.c:1472 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодування \"%s\" не відповідає локалі \"%s\"" -#: commands/dbcommands.c:783 +#: commands/dbcommands.c:1460 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Обраний параметр LC_CTYPE потребує кодування \"%s\"." -#: commands/dbcommands.c:798 +#: commands/dbcommands.c:1475 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Обраний параметр LC_COLLATE потребує кодування \"%s\"." -#: commands/dbcommands.c:860 +#: commands/dbcommands.c:1556 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "бази даних \"%s\" не існує, пропускаємо" -#: commands/dbcommands.c:884 +#: commands/dbcommands.c:1580 #, c-format msgid "cannot drop a template database" msgstr "неможливо видалити шаблон бази даних" -#: commands/dbcommands.c:890 +#: commands/dbcommands.c:1586 #, c-format msgid "cannot drop the currently open database" msgstr "неможливо видалити наразі відкриту базу даних" -#: commands/dbcommands.c:903 +#: commands/dbcommands.c:1599 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "база даних \"%s\" використовується активним слотом логічної реплікації" -#: commands/dbcommands.c:905 +#: commands/dbcommands.c:1601 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." @@ -6881,12 +7362,12 @@ msgstr[1] "Активні слоти %d." msgstr[2] "Активних слотів %d." msgstr[3] "Активних слотів %d." -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:1615 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "база даних \"%s\" використовується в підписці логічної реплікації" -#: commands/dbcommands.c:921 +#: commands/dbcommands.c:1617 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." @@ -6895,74 +7376,74 @@ msgstr[1] "Знайдено підписки %d." msgstr[2] "Знайдено підписок %d." msgstr[3] "Знайдено підписок %d." -#: commands/dbcommands.c:942 commands/dbcommands.c:1115 -#: commands/dbcommands.c:1245 +#: commands/dbcommands.c:1638 commands/dbcommands.c:1812 +#: commands/dbcommands.c:1942 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "база даних \"%s\" зайнята іншими користувачами" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1772 #, c-format msgid "permission denied to rename database" msgstr "немає дозволу для перейменування бази даних" -#: commands/dbcommands.c:1104 +#: commands/dbcommands.c:1801 #, c-format msgid "current database cannot be renamed" msgstr "поточна база даних не може бути перейменована" -#: commands/dbcommands.c:1201 +#: commands/dbcommands.c:1898 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "неможливо змінити табличний простір наразі відкритої бази даних" -#: commands/dbcommands.c:1304 +#: commands/dbcommands.c:2004 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "деякі відношення бази даних \"%s\" вже є в табличному просторі \"%s\"" -#: commands/dbcommands.c:1306 +#: commands/dbcommands.c:2006 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Перед тим, як виконувати цю команду, вам треба повернути їх в табличний простір за замовчуванням для цієї бази даних." -#: commands/dbcommands.c:1431 commands/dbcommands.c:2015 -#: commands/dbcommands.c:2314 commands/dbcommands.c:2400 +#: commands/dbcommands.c:2133 commands/dbcommands.c:2852 +#: commands/dbcommands.c:3152 commands/dbcommands.c:3266 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "у старому каталозі бази даних \"%s\" могли залишитися непотрібні файли" -#: commands/dbcommands.c:1487 +#: commands/dbcommands.c:2194 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "нерозпізнаний параметр DROP DATABASE \"%s\"" -#: commands/dbcommands.c:1577 +#: commands/dbcommands.c:2272 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "параметр \"%s\" не може бути вказаним з іншими параметрами" -#: commands/dbcommands.c:1624 +#: commands/dbcommands.c:2319 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "неможливо змінити невірну базу даних \"%s\"" -#: commands/dbcommands.c:1641 +#: commands/dbcommands.c:2336 #, c-format msgid "cannot disallow connections for current database" msgstr "не можна заборонити з'єднання для поточної бази даних" -#: commands/dbcommands.c:1777 +#: commands/dbcommands.c:2555 #, c-format msgid "permission denied to change owner of database" msgstr "немає дозволу для зміни власника бази даних" -#: commands/dbcommands.c:2121 +#: commands/dbcommands.c:2958 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "Знайдено %d інших сеансів і %d підготованих транзакцій з використанням цієї бази даних." -#: commands/dbcommands.c:2124 +#: commands/dbcommands.c:2961 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." @@ -6971,7 +7452,7 @@ msgstr[1] "Є %d інші сеанси з використанням цієї б msgstr[2] "Є %d інших сеансів з використанням цієї бази даних." msgstr[3] "Є %d інших сеансів з використанням цієї бази даних." -#: commands/dbcommands.c:2129 storage/ipc/procarray.c:3895 +#: commands/dbcommands.c:2966 storage/ipc/procarray.c:3847 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -6980,56 +7461,56 @@ msgstr[1] "З цією базою даних пов'язані %d підгото msgstr[2] "З цією базою даних пов'язані %d підготовлених транзакцій." msgstr[3] "З цією базою даних пов'язані %d підготовлених транзакцій." -#: commands/dbcommands.c:2271 +#: commands/dbcommands.c:3108 #, c-format msgid "missing directory \"%s\"" msgstr "відсутній каталог \"%s\"" -#: commands/dbcommands.c:2330 commands/tablespace.c:188 -#: commands/tablespace.c:634 +#: commands/dbcommands.c:3168 commands/tablespace.c:190 +#: commands/tablespace.c:654 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "не вдалося отримати інформацію про каталог \"%s\": %m" -#: 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:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, 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 commands/define.c:225 commands/define.c:243 #, 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 потребує логічного значення" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 #, c-format msgid "%s requires an integer value" msgstr "%s потребує ціле значення" -#: commands/define.c:242 +#: commands/define.c:272 #, c-format msgid "argument of %s must be a name" msgstr "аргументом %s повинно бути ім'я" -#: commands/define.c:272 +#: commands/define.c:302 #, c-format msgid "argument of %s must be a type name" msgstr "аргументом %s повинно бути ім'я типу" -#: commands/define.c:318 +#: commands/define.c:348 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "невірний аргумент для %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1411 -#: utils/adt/ruleutils.c:2832 +#: commands/dropcmds.c:100 commands/functioncmds.c:1394 +#: utils/adt/ruleutils.c:2928 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" є функцією агрегату" @@ -7039,19 +7520,19 @@ msgstr "\"%s\" є функцією агрегату" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Використайте DROP AGGREGATE, щоб видалити агрегатні функції." -#: commands/dropcmds.c:158 commands/sequence.c:455 commands/tablecmds.c:3580 -#: commands/tablecmds.c:3738 commands/tablecmds.c:3791 -#: commands/tablecmds.c:15951 tcop/utility.c:1324 +#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 +#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 +#: commands/tablecmds.c:16487 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:1254 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схеми \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:272 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "типу \"%s\" не існує, пропускаємо" @@ -7071,7 +7552,7 @@ msgstr "правила сортування \"%s\" не існує, пропус msgid "conversion \"%s\" does not exist, skipping" msgstr "перетворення \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:293 commands/statscmds.c:674 +#: commands/dropcmds.c:293 commands/statscmds.c:655 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "об'єкту статистики \"%s\" не існує, пропускаємо" @@ -7166,7 +7647,7 @@ msgstr "правила \"%s\" для відношення \"%s\" не існує msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "джерела сторонніх даних \"%s\" не існує, пропускаємо" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1364 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "серверу \"%s\" не існує, пропускаємо" @@ -7243,12 +7724,12 @@ 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:1862 +#: commands/event_trigger.c:1834 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можливо викликати тільки в подієвій тригерній функції" @@ -7273,7 +7754,7 @@ msgstr "Параметр WAL оператора EXPLAIN потребує вка msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "Параметр TIMING оператора EXPLAIN потребує вказівки ANALYZE" -#: commands/extension.c:173 commands/extension.c:3032 +#: commands/extension.c:173 commands/extension.c:2954 #, c-format msgid "extension \"%s\" does not exist" msgstr "розширення \"%s\" не існує" @@ -7330,198 +7811,213 @@ 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:7106 +#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 +#: utils/misc/guc.c:7380 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" потребує логічного значення" -#: 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 "нерозпізнаний параметр \"%s\" в файлі \"%s\"" -#: commands/extension.c:607 +#: commands/extension.c:618 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "параметр \"schema\" не може бути вказаним, коли \"relocatable\" є дійсним" -#: 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:862 +#: commands/extension.c:873 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "немає дозволу для створення розширення %s\"" -#: commands/extension.c:865 +#: commands/extension.c:876 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Необхідно мати право CREATE для поточної бази даних щоб створити це розширення." -#: commands/extension.c:866 +#: commands/extension.c:877 #, c-format msgid "Must be superuser to create this extension." msgstr "Тільки суперкористувач може створити це розширення." -#: commands/extension.c:870 +#: commands/extension.c:881 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "немає дозволу для оновлення розширення %s\"" -#: commands/extension.c:873 +#: commands/extension.c:884 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Необхідно мати право CREATE для поточної бази даних щоб оновити це розширення." -#: commands/extension.c:874 +#: commands/extension.c:885 #, c-format msgid "Must be superuser to update this extension." msgstr "Тільки суперкористувач може оновити це розширення." -#: commands/extension.c:1003 +#: commands/extension.c:1018 #, c-format msgid "invalid character in extension owner: must not contain any of \"%s\"" msgstr "неприпустимий символ у власника розширення: не може містити жодного з \"%s\"" -#: commands/extension.c:1027 +#: commands/extension.c:1042 #, c-format msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" msgstr "неприпустимий символ у розширенні \"%s\" схеми: не повинно містити жодної з \"%s\"" -#: commands/extension.c:1222 +#: commands/extension.c:1237 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "розширення \"%s\" не має жодного шляху оновлення від версії \"%s\" до версії \"%s\"" -#: commands/extension.c:1430 commands/extension.c:3093 +#: commands/extension.c:1445 commands/extension.c:3012 #, c-format msgid "version to install must be specified" msgstr "для інсталяції слід указати версію" -#: commands/extension.c:1467 +#: commands/extension.c:1482 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "розширення \"%s\" не має ні скрипту для встановлення, ні шляху оновлення для версії \"%s\"" -#: commands/extension.c:1501 +#: commands/extension.c:1516 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "розширення \"%s\" треба встановлювати в схемі \"%s\"" -#: commands/extension.c:1661 +#: commands/extension.c:1676 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "виявлено циклічну залежність між розширеннями \"%s\" і \"%s\"" -#: commands/extension.c:1666 +#: commands/extension.c:1681 #, c-format msgid "installing required extension \"%s\"" msgstr "встановлення необхідних розширень \"%s\"" -#: commands/extension.c:1689 +#: commands/extension.c:1704 #, c-format msgid "required extension \"%s\" is not installed" msgstr "необхідні розширення \"%s\" не встановлено" -#: commands/extension.c:1692 +#: commands/extension.c:1707 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Використайте CREATE EXTENSION ... CASCADE також для встановлення необхідних розширень." -#: commands/extension.c:1727 +#: commands/extension.c:1742 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "розширення \"%s\" вже існує, пропускаємо" -#: commands/extension.c:1734 +#: commands/extension.c:1749 #, c-format msgid "extension \"%s\" already exists" msgstr "розширення \"%s\" вже існує" -#: commands/extension.c:1745 +#: commands/extension.c:1760 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вкладенні оператори CREATE EXTENSION не підтримуються" -#: commands/extension.c:1918 +#: commands/extension.c:1924 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "неможливо видалити розширення \"%s\", оскільки воно змінюється" -#: commands/extension.c:2479 +#: commands/extension.c:2401 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s можна викликати лише з SQL-скрипта, виконаного CREATE EXTENSION" -#: commands/extension.c:2491 +#: commands/extension.c:2413 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не посилається на таблицю" -#: commands/extension.c:2496 +#: commands/extension.c:2418 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "таблиця \"%s\" не є членом створеного розширення" -#: commands/extension.c:2850 +#: commands/extension.c:2772 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "неможливо перемістити розширення \"%s\" в схему \"%s\", оскільки розширення містить схему" -#: commands/extension.c:2891 commands/extension.c:2951 +#: commands/extension.c:2813 commands/extension.c:2873 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "розширення \"%s\" не підтримує SET SCHEMA" -#: commands/extension.c:2953 +#: commands/extension.c:2875 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s не є схемою розширення \"%s\"" -#: commands/extension.c:3012 +#: commands/extension.c:2934 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вкладенні оператори ALTER EXTENSION не підтримуються" -#: commands/extension.c:3104 +#: commands/extension.c:3023 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "версія \"%s\" розширення \"%s\" вже встановлена" -#: commands/extension.c:3316 +#: commands/extension.c:3235 #, c-format msgid "cannot add an object of this type to an extension" msgstr "додати об'єкт цього типу до розширення не можна" -#: commands/extension.c:3382 +#: commands/extension.c:3301 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "неможливо додати схему \"%s\" до розширення \"%s\", оскільки схема містить розширення" -#: commands/extension.c:3476 +#: commands/extension.c:3395 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" занадто великий" @@ -7551,77 +8047,77 @@ 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:880 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" вже існує, пропускаємо" -#: commands/foreigncmds.c:1148 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "зіставлення користувача \"%s\" для сервера \"%s\" вже існує, пропускаємо" -#: commands/foreigncmds.c:1158 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "зіставлення користувача \"%s\" для сервера \"%s\" вже існує\"" -#: commands/foreigncmds.c:1258 commands/foreigncmds.c:1378 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "зіставлення користувача \"%s\" не існує для сервера \"%s\"" -#: commands/foreigncmds.c:1383 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "зіставлення користувача \"%s\" не існує для сервера \"%s\", пропускаємо" -#: commands/foreigncmds.c:1511 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:390 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "джерело сторонніх даних \"%s\" не має обробника" -#: commands/foreigncmds.c:1517 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "джерело сторонніх даних \"%s\" не підтримує IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1619 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "імпорт сторонньої таблиці \"%s\"" @@ -7726,263 +8222,263 @@ msgstr "вхідні параметри, наступні за параметр msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "параметри процедури OUT не можуть з'являтись після параметра зі значенням за замовчуванням" -#: commands/functioncmds.c:612 commands/functioncmds.c:803 +#: commands/functioncmds.c:605 commands/functioncmds.c:784 #, c-format msgid "invalid attribute in procedure definition" msgstr "некоректний атрибут у визначенні процедури" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:701 #, c-format msgid "support function %s must return type %s" msgstr "функція підтримки %s повинна повертати тип %s" -#: commands/functioncmds.c:719 +#: commands/functioncmds.c:712 #, c-format msgid "must be superuser to specify a support function" msgstr "для уточнення функції підтримки потрібно бути суперкористувачем" -#: commands/functioncmds.c:852 commands/functioncmds.c:1456 +#: commands/functioncmds.c:833 commands/functioncmds.c:1439 #, c-format msgid "COST must be positive" msgstr "COST має бути додатнім" -#: commands/functioncmds.c:860 commands/functioncmds.c:1464 +#: commands/functioncmds.c:841 commands/functioncmds.c:1447 #, c-format msgid "ROWS must be positive" msgstr "Значення ROWS повинно бути позитивним" -#: commands/functioncmds.c:889 +#: commands/functioncmds.c:870 #, c-format msgid "no function body specified" msgstr "не вказано тіло функції" -#: commands/functioncmds.c:894 +#: commands/functioncmds.c:875 #, c-format msgid "duplicate function body specified" msgstr "вказано тіло дубліката функції" -#: commands/functioncmds.c:899 +#: commands/functioncmds.c:880 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "вбудоване тіло функції SQL допустиме лише для мови SQL" -#: commands/functioncmds.c:941 +#: commands/functioncmds.c:922 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "SQL функція з тілом без лапок не може мати поліморфні аргументи" -#: commands/functioncmds.c:967 commands/functioncmds.c:986 +#: commands/functioncmds.c:948 commands/functioncmds.c:967 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s ще не підтримується у тілі SQL функції без лапок" -#: commands/functioncmds.c:1014 +#: commands/functioncmds.c:995 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "для мови \"%s\" потрібен лише один вираз AS" -#: commands/functioncmds.c:1119 +#: commands/functioncmds.c:1100 #, c-format msgid "no language specified" msgstr "не вказано жодної мови" -#: commands/functioncmds.c:1127 commands/functioncmds.c:2130 +#: 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:1129 commands/functioncmds.c:2132 +#: 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:1164 commands/functioncmds.c:1448 +#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 #, c-format msgid "only superuser can define a leakproof function" msgstr "лише суперкористувачі можуть визначити функцію з атрибутом leakproof" -#: commands/functioncmds.c:1215 +#: commands/functioncmds.c:1196 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "результат функції повинен мати тип %s відповідно з параметрами OUT" -#: commands/functioncmds.c:1228 +#: commands/functioncmds.c:1209 #, c-format msgid "function result type must be specified" msgstr "необхідно вказати тип результату функції" -#: commands/functioncmds.c:1282 commands/functioncmds.c:1468 +#: 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:1569 +#: commands/functioncmds.c:1552 #, c-format msgid "source data type %s is a pseudo-type" msgstr "вихідний тип даних %s є псевдотипом" -#: commands/functioncmds.c:1575 +#: commands/functioncmds.c:1558 #, c-format msgid "target data type %s is a pseudo-type" msgstr "цільовий тип даних %s є псевдотипом" -#: commands/functioncmds.c:1599 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "приведення буде ігноруватися, оскільки вихідні дані мають тип домену" -#: commands/functioncmds.c:1604 +#: commands/functioncmds.c:1587 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "приведення буде ігноруватися, оскільки цільові дані мають тип домену" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1612 #, c-format msgid "cast function must take one to three arguments" msgstr "функція приведення повинна приймати від одного до трьох аргументів" -#: commands/functioncmds.c:1633 +#: 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:1637 +#: commands/functioncmds.c:1620 #, c-format msgid "second argument of cast function must be type %s" msgstr "другий аргумент функції приведення повинен мати тип %s" -#: commands/functioncmds.c:1642 +#: commands/functioncmds.c:1625 #, c-format msgid "third argument of cast function must be type %s" msgstr "третій аргумент функції приведення повинен мати тип %s" -#: commands/functioncmds.c:1647 +#: 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:1658 +#: commands/functioncmds.c:1641 #, c-format msgid "cast function must not be volatile" msgstr "функція приведення не може бути змінною (volatile)" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1646 #, c-format msgid "cast function must be a normal function" msgstr "функція приведення повинна бути звичайною функцією" -#: commands/functioncmds.c:1667 +#: commands/functioncmds.c:1650 #, c-format msgid "cast function must not return a set" msgstr "функція приведення не може вертати набір" -#: commands/functioncmds.c:1693 +#: commands/functioncmds.c:1676 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "тільки суперкористувач може створити приведення WITHOUT FUNCTION" -#: commands/functioncmds.c:1708 +#: commands/functioncmds.c:1691 #, c-format msgid "source and target data types are not physically compatible" msgstr "вихідний та цільовий типи даних не сумісні фізично" -#: commands/functioncmds.c:1723 +#: commands/functioncmds.c:1706 #, c-format msgid "composite data types are not binary-compatible" msgstr "складені типи даних не сумісні на двійковому рівні" -#: commands/functioncmds.c:1729 +#: commands/functioncmds.c:1712 #, c-format msgid "enum data types are not binary-compatible" msgstr "типи переліку не сумісні на двійковому рівні" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1718 #, c-format msgid "array data types are not binary-compatible" msgstr "типи масивів не сумісні на двійковому рівні" -#: commands/functioncmds.c:1752 +#: commands/functioncmds.c:1735 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типи доменів не можуть вважатись сумісними на двійковому рівні" -#: commands/functioncmds.c:1762 +#: commands/functioncmds.c:1745 #, c-format msgid "source data type and target data type are the same" msgstr "вихідний тип даних співпадає з цільовим типом" -#: commands/functioncmds.c:1795 +#: commands/functioncmds.c:1778 #, c-format msgid "transform function must not be volatile" msgstr "функція перетворення не може бути мінливою" -#: commands/functioncmds.c:1799 +#: commands/functioncmds.c:1782 #, c-format msgid "transform function must be a normal function" msgstr "функція перетворення повинна бути нормальною функцією" -#: commands/functioncmds.c:1803 +#: commands/functioncmds.c:1786 #, c-format msgid "transform function must not return a set" msgstr "функція перетворення не повинна повертати набір" -#: commands/functioncmds.c:1807 +#: commands/functioncmds.c:1790 #, c-format msgid "transform function must take one argument" msgstr "функція перетворення повинна приймати один аргумент" -#: commands/functioncmds.c:1811 +#: commands/functioncmds.c:1794 #, c-format msgid "first argument of transform function must be type %s" msgstr "перший аргумент функції перетворення повинен бути типу %s" -#: commands/functioncmds.c:1850 +#: commands/functioncmds.c:1833 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип даних %s є псевдотипом" -#: commands/functioncmds.c:1856 +#: commands/functioncmds.c:1839 #, c-format msgid "data type %s is a domain" msgstr "тип даних %s є доменом" -#: commands/functioncmds.c:1896 +#: commands/functioncmds.c:1879 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функції FROM SQL має бути типу %s" -#: commands/functioncmds.c:1922 +#: 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:1951 +#: commands/functioncmds.c:1934 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "перетворення для типу %s мови \"%s\" вже існує" -#: commands/functioncmds.c:2038 +#: commands/functioncmds.c:2021 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "перетворення для типу %s мови \"%s\" не існує" -#: commands/functioncmds.c:2062 +#: commands/functioncmds.c:2045 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "функція %s вже існує в схемі \"%s\"" -#: commands/functioncmds.c:2117 +#: commands/functioncmds.c:2096 #, c-format msgid "no inline code specified" msgstr "не вказано жодного впровадженого коду" -#: commands/functioncmds.c:2163 +#: commands/functioncmds.c:2142 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "мова \"%s\" не підтримує виконання впровадженого коду" -#: commands/functioncmds.c:2258 +#: 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" @@ -8001,299 +8497,303 @@ msgstr "треба вказати хоча б один стовпець" msgid "cannot use more than %d columns in an index" msgstr "не можна використовувати більше ніж %d стовпців в індексі" -#: commands/indexcmds.c:686 +#: commands/indexcmds.c:681 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "неможливо створити індекс в сторонній таблиці \"%s\"" +msgid "cannot create index on relation \"%s\"" +msgstr "створити індекс для відношення \"%s\" не можна" -#: commands/indexcmds.c:717 +#: commands/indexcmds.c:707 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "неможливо створити індекс в секційній таблиці \"%s\" паралельним способом" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:712 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "створити обмеження-виняток в секціонованій таблиці \"%s\" не можна" -#: commands/indexcmds.c:732 +#: commands/indexcmds.c:722 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "неможливо створити індекси в тимчасових таблицях в інших сеансах" -#: commands/indexcmds.c:770 commands/tablecmds.c:754 commands/tablespace.c:1184 +#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "для секціонованих відношень не можна вказати табличний простір за замовчуванням" -#: commands/indexcmds.c:802 commands/tablecmds.c:789 commands/tablecmds.c:3280 +#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "тільки спільні відношення можуть бути поміщені в табличний pg_global" -#: commands/indexcmds.c:835 +#: commands/indexcmds.c:825 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "застарілий метод доступу \"rtree\" підміняється методом \"gist\"" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:846 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "методу доступу \"%s\" не підтримує унікальні індекси" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:851 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "методу доступу \"%s\" не підтримує включені стовпці" -#: commands/indexcmds.c:866 +#: commands/indexcmds.c:856 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступу \"%s\" не підтримує багатостовпцеві індекси" -#: commands/indexcmds.c:871 +#: commands/indexcmds.c:861 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступу \"%s\" не підтримує обмеження-винятки" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:986 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "не можна зіставити ключ розділу з індексом використовуючи метод доступу \"%s\"" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:996 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "непідтримуване обмеження \"%s\" з визначенням ключа секціонування" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:998 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "обмеження %s не можуть використовуватись, якщо ключі секціонування включають вирази." -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1040 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "обмеження унікальності в секціонованій таблиці повинно включати всі стовпці секціонування" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1041 #, 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:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1060 commands/indexcmds.c:1079 #, c-format msgid "index creation on system columns is not supported" msgstr "створення індексу для системних стовпців не підтримується" -#: commands/indexcmds.c:1285 tcop/utility.c:1510 +#: commands/indexcmds.c:1279 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "не можна створити унікальний індекс в секціонованій таблиці \"%s\"" -#: commands/indexcmds.c:1287 tcop/utility.c:1512 +#: commands/indexcmds.c:1281 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблиця \"%s\" містить секції, які є зовнішніми таблицями." -#: commands/indexcmds.c:1776 +#: commands/indexcmds.c:1743 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функції в предикаті індексу повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1854 parser/parse_utilcmd.c:2526 -#: parser/parse_utilcmd.c:2661 +#: commands/indexcmds.c:1821 parser/parse_utilcmd.c:2529 +#: parser/parse_utilcmd.c:2664 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "вказаний у ключі стовпець \"%s\" не існує" -#: commands/indexcmds.c:1878 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1845 parser/parse_utilcmd.c:1826 #, c-format msgid "expressions are not supported in included columns" msgstr "вирази не підтримуються у включених стовпцях " -#: commands/indexcmds.c:1919 +#: commands/indexcmds.c:1886 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функції в індексному виразі повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1934 +#: commands/indexcmds.c:1901 #, c-format msgid "including column does not support a collation" msgstr "включені стовпці не підтримують правила сортування" -#: commands/indexcmds.c:1938 +#: commands/indexcmds.c:1905 #, c-format msgid "including column does not support an operator class" msgstr "включені стовпці не підтримують класи операторів" -#: commands/indexcmds.c:1942 +#: commands/indexcmds.c:1909 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включені стовпці не підтримують параметри ASC/DESC" -#: commands/indexcmds.c:1946 +#: commands/indexcmds.c:1913 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включені стовпці не підтримують параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:1987 +#: commands/indexcmds.c:1954 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не вдалося визначити, яке правило сортування використати для індексного виразу" -#: commands/indexcmds.c:1995 commands/tablecmds.c:16956 commands/typecmds.c:810 -#: parser/parse_expr.c:2693 parser/parse_type.c:566 parser/parse_utilcmd.c:3793 -#: utils/adt/misc.c:628 +#: commands/indexcmds.c:1962 commands/tablecmds.c:17512 commands/typecmds.c:807 +#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3796 +#: utils/adt/misc.c:601 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила сортування" -#: commands/indexcmds.c:2060 +#: commands/indexcmds.c:2027 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не комутативний" -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2029 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "В обмеженнях-виключеннях можуть використовуватись лише комутативні оператори." -#: commands/indexcmds.c:2088 +#: commands/indexcmds.c:2055 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор %s не є членом сімейства операторів \"%s\"" -#: commands/indexcmds.c:2091 +#: commands/indexcmds.c:2058 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "Оператор винятку для обмеження повинен відноситись до класу операторів індексу." -#: commands/indexcmds.c:2126 +#: commands/indexcmds.c:2093 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступу \"%s\" не підтримує параметри ASC/DESC" -#: commands/indexcmds.c:2131 +#: commands/indexcmds.c:2098 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступу \"%s\" не підтримує параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:2177 commands/tablecmds.c:16981 -#: commands/tablecmds.c:16987 commands/typecmds.c:2317 +#: commands/indexcmds.c:2144 commands/tablecmds.c:17537 +#: commands/tablecmds.c:17543 commands/typecmds.c:2302 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "тип даних %s не має класу операторів за замовчуванням для методу доступу \"%s\"" -#: commands/indexcmds.c:2179 +#: commands/indexcmds.c:2146 #, 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:2208 commands/indexcmds.c:2216 +#: commands/indexcmds.c:2175 commands/indexcmds.c:2183 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "клас операторів \"%s\" не існує для методу доступу \"%s\"" -#: commands/indexcmds.c:2230 commands/typecmds.c:2305 +#: commands/indexcmds.c:2197 commands/typecmds.c:2290 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "клас операторів \"%s\" не приймає тип даних %s" -#: commands/indexcmds.c:2320 +#: commands/indexcmds.c:2287 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "для типу даних %s є кілька класів операторів за замовчуванням" -#: commands/indexcmds.c:2648 +#: commands/indexcmds.c:2615 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нерозпізнаний параметр REINDEX \"%s\"" -#: commands/indexcmds.c:2872 +#: commands/indexcmds.c:2839 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "таблиця \"%s\" не має індексів, які можна переіндексувати паралельно" -#: commands/indexcmds.c:2886 +#: commands/indexcmds.c:2853 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "таблиця \"%s\" не має індексів для переіндексування" -#: commands/indexcmds.c:2926 commands/indexcmds.c:3433 -#: commands/indexcmds.c:3561 +#: commands/indexcmds.c:2893 commands/indexcmds.c:3397 +#: commands/indexcmds.c:3525 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "не можна конкурентно переіндексувати системні каталоги" -#: commands/indexcmds.c:2949 +#: commands/indexcmds.c:2916 #, c-format msgid "can only reindex the currently open database" msgstr "переіндексувати можна тільки наразі відкриту базу даних" -#: commands/indexcmds.c:3037 +#: commands/indexcmds.c:3004 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо" -#: commands/indexcmds.c:3070 +#: commands/indexcmds.c:3037 #, c-format msgid "cannot move system relations, skipping all" msgstr "не можна перемістити системні відношення, пропускаються усі" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3083 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "під час переіндексування секціонованої таблиці \"%s.%s\"" -#: commands/indexcmds.c:3120 +#: commands/indexcmds.c:3086 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "під час переіндексування секціонованого індексу \"%s.%s\"" -#: commands/indexcmds.c:3313 commands/indexcmds.c:4169 +#: commands/indexcmds.c:3277 commands/indexcmds.c:4133 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблиця \"%s.%s\" була переіндексована" -#: commands/indexcmds.c:3465 commands/indexcmds.c:3517 +#: commands/indexcmds.c:3429 commands/indexcmds.c:3481 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндексувати пошкоджений індекс \"%s.%s\" паралельно, пропускається" -#: commands/indexcmds.c:3471 +#: commands/indexcmds.c:3435 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндексувати індекс обмеження-виключення \"%s.%s\" паралельно, пропускається" -#: commands/indexcmds.c:3626 +#: commands/indexcmds.c:3590 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "неможливо переіндексувати цей тип відношень паралельон" -#: commands/indexcmds.c:3647 +#: commands/indexcmds.c:3611 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "не можна перемістити не спільне відношення до табличного простору \"%s\"" -#: commands/indexcmds.c:4150 commands/indexcmds.c:4162 +#: commands/indexcmds.c:4114 commands/indexcmds.c:4126 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "індекс \"%s.%s\" був перебудований" -#: commands/lockcmds.c:92 commands/tablecmds.c:6085 commands/trigger.c:307 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:950 +#: commands/indexcmds.c:4116 commands/indexcmds.c:4135 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:92 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\" - не таблиця або подання" +msgid "cannot lock relation \"%s\"" +msgstr "блокувати відношення \"%s\" не можна" #: commands/matview.c:193 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY не може використовуватись, коли матеріалізоване подання не наповнено" -#: commands/matview.c:199 gram.y:16813 +#: commands/matview.c:199 gram.y:17995 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметри %s та %s не можуть бути використані разом" @@ -8308,12 +8808,12 @@ 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:652 +#: 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:654 +#: commands/matview.c:655 #, c-format msgid "Row: %s" msgstr "Рядок: %s" @@ -8590,13 +9090,13 @@ msgstr "функція оцінювання з'єднання %s повинна msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" неможливо змінити" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:151 -#: commands/tablecmds.c:1585 commands/tablecmds.c:2165 -#: commands/tablecmds.c:3390 commands/tablecmds.c:6064 -#: commands/tablecmds.c:8989 commands/tablecmds.c:16546 -#: commands/tablecmds.c:16581 commands/trigger.c:313 commands/trigger.c:1289 -#: commands/trigger.c:1398 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:955 rewrite/rewriteRemove.c:80 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 +#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 +#: commands/tablecmds.c:9144 commands/tablecmds.c:17090 +#: commands/tablecmds.c:17125 commands/trigger.c:328 commands/trigger.c:1378 +#: commands/trigger.c:1488 rewrite/rewriteDefine.c:278 +#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доступ заборонений: \"%s\" - системний каталог" @@ -8647,52 +9147,42 @@ 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 +#: 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:131 parser/parse_param.c:313 tcop/postgres.c:1479 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "не вдалося визначити тип даних параметра $%d" - -#: commands/prepare.c:149 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "службових операторів не можна підготувати" - -#: commands/prepare.c:264 commands/prepare.c:269 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format msgid "prepared statement is not a SELECT" msgstr "підготовлений оператор не SELECT" -#: commands/prepare.c:329 +#: commands/prepare.c:295 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "невірне число параметрів для підготовленого оператора \"%s\"" -#: commands/prepare.c:331 +#: commands/prepare.c:297 #, c-format msgid "Expected %d parameters but got %d." msgstr "Очікувалось %d параметрів, але отримано %d." -#: commands/prepare.c:364 +#: 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:448 +#: commands/prepare.c:414 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "підготовлений оператор \"%s\" вже існує" -#: commands/prepare.c:487 +#: commands/prepare.c:453 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "підготовлений оператор \"%s\" не існує" @@ -8702,61 +9192,192 @@ msgstr "підготовлений оператор \"%s\" не існує" msgid "must be superuser to create custom procedural language" msgstr "для створення користувацької мови потрібно бути суперкористувачем" -#: commands/publicationcmds.c:104 +#: commands/publicationcmds.c:130 postmaster/postmaster.c:1222 +#: postmaster/postmaster.c:1321 utils/init/miscinit.c:1659 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "неприпустимий список синтаксису параметру \"publish\"" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "неприпустимий синтаксис списку в параметрі \"%s\"" -#: commands/publicationcmds.c:122 +#: commands/publicationcmds.c:149 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "нерозпізнане значення \"publish\": \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "нерозпізнане значення параметра публікації \"%s\": \"%s\"" -#: commands/publicationcmds.c:137 +#: commands/publicationcmds.c:163 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "нерозпізнаний параметр публікації: \"%s\"" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:204 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "жодної схеми не вибрано для CURRENT_SCHEMA" + +#: commands/publicationcmds.c:501 +msgid "System columns are not allowed." +msgstr "Системні стовпці не допускаються." + +#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 +#: commands/publicationcmds.c:530 +msgid "User-defined operators are not allowed." +msgstr "Користувацькі оператори не допускаються." + +#: commands/publicationcmds.c:554 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "Дозволяються тільки стовпці, константи, вбудовані оператори, вбудовані типи даних, вбудовані параметри сортування та незмінні вбудовані функції." + +#: commands/publicationcmds.c:566 +msgid "User-defined types are not allowed." +msgstr "Користувацькі типи не допускаються." + +#: commands/publicationcmds.c:569 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Користувацькі або вбудовані змінні функції не допускаються." + +#: commands/publicationcmds.c:572 +msgid "User-defined collations are not allowed." +msgstr "Користувацькі параметри сортування не допускаються." + +#: commands/publicationcmds.c:582 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "неприпустимий вираз публікації WHERE" + +#: commands/publicationcmds.c:635 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "використовувати вираз публікації WHERE для відношення \"%s\" не можна" + +#: commands/publicationcmds.c:637 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "вираз WHERE для секціонованих таблиць не можна використовувати, коли %s є false." + +#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "не можна використовувати список стовпців для відношення \"%s.%s\" в публікації \"%s\"" + +#: commands/publicationcmds.c:711 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "Списки стовпців не можна вказувати в публікаціях, що містять елементи FOR TABLES IN SCHEMA." + +#: commands/publicationcmds.c:725 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "Списки стовпців для секціонованих таблиць не можна використовувати, коли %s є false." + +#: commands/publicationcmds.c:760 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "для створення публікації УСІХ ТАБЛИЦЬ потрібно бути суперкористувачем" -#: commands/publicationcmds.c:250 +#: commands/publicationcmds.c:831 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "щоб створити публікацію FOR TABLES IN SCHEMA потрібно бути суперкористувачем" + +#: commands/publicationcmds.c:867 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "недостатній wal_level для публікації логічних змін" -#: commands/publicationcmds.c:251 +#: commands/publicationcmds.c:868 #, c-format -msgid "Set wal_level to logical before creating subscriptions." +msgid "Set wal_level to \"logical\" before creating subscriptions." msgstr "Встановіть wal_level на \"logical\" перед створенням підписок." -#: commands/publicationcmds.c:376 +#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "встановити параметр \"%s\" на false для публікації \"%s\" не можна" + +#: commands/publicationcmds.c:967 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "Публікація містить вираз WHERE для секціонованої таблиці \"%s\", який не допускається коли \"%s\" є false." + +#: commands/publicationcmds.c:975 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "Публікація містить список стовпців для секціонованої таблиці \"%s\", який не допускається коли \"%s\" є false." + +#: commands/publicationcmds.c:1298 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "не можна додати схему до публікації \"%s\"" + +#: commands/publicationcmds.c:1300 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "Схеми не можна додавати, якщо будь-яка таблиця, що вказуює на список стовпців, вже є частиною публікації." + +#: commands/publicationcmds.c:1348 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "для додавання або встановлення схем потрібно бути суперкористувачем" + +#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "публікація \"%s\" визначена ДЛЯ ВСІХ ТАБЛИЦЬ" -#: commands/publicationcmds.c:378 +#: commands/publicationcmds.c:1359 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "До публікації FOR ALL TABLES не можна додати або видалити схеми." + +#: commands/publicationcmds.c:1367 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "У публікації ВСІХ ТАБЛИЦЬ не можна додати або видалити таблиці." -#: commands/publicationcmds.c:707 +#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "конфліктуючі або надлишкові вирази WHERE для таблиці \"%s\"" + +#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "конфліктуючі або надлишкові списки стовпців для таблиці \"%s\"" + +#: commands/publicationcmds.c:1802 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "список стовпців не можна вказувати в ALTER PUBLICATION ... DROP" + +#: commands/publicationcmds.c:1814 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "відносини \"%s\" не є частиною публікації" -#: commands/publicationcmds.c:750 +#: commands/publicationcmds.c:1821 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "під час видалення таблиці з публікації використовувати вираз WHERE не можна" + +#: commands/publicationcmds.c:1881 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "таблиці зі схеми \"%s\" не є частиною публікації" + +#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "немає прав на зміну власника публікації \"%s\"" -#: commands/publicationcmds.c:752 +#: commands/publicationcmds.c:1926 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Власником публікації УСІХ ТАБЛИЦЬ повинен бути суперкористувач." +#: commands/publicationcmds.c:1933 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "Власник публікації публікації FOR TABLES IN SCHEMA повинен бути суперкористувачем." + #: commands/schemacmds.c:108 commands/schemacmds.c:288 #, c-format msgid "unacceptable schema name \"%s\"" @@ -8772,578 +9393,645 @@ 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\"" -#: commands/sequence.c:717 +#: commands/sequence.c:755 #, 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:740 +#: commands/sequence.c:774 #, 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:858 +#: commands/sequence.c:892 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "поточне значення (currval) для послідовності \"%s\" ще не визначено у цьому сеансі" -#: commands/sequence.c:877 commands/sequence.c:883 +#: commands/sequence.c:911 commands/sequence.c:917 #, c-format msgid "lastval is not yet defined in this session" msgstr "останнє значення ще не визначено в цьому сеансі" -#: commands/sequence.c:971 +#: commands/sequence.c:997 #, 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:1367 +#: commands/sequence.c:1365 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неприпустимий параметр послідовності SEQUENCE NAME" -#: commands/sequence.c:1393 +#: commands/sequence.c:1391 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "типом стовпця ідентифікації може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1394 +#: commands/sequence.c:1392 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "типом послідовності може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1428 +#: commands/sequence.c:1426 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не повинен бути нулем" -#: commands/sequence.c:1481 +#: commands/sequence.c:1474 #, 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:1518 +#: commands/sequence.c:1506 #, 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:1532 +#: commands/sequence.c:1514 #, 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:1559 +#: commands/sequence.c:1535 #, 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:1571 +#: commands/sequence.c:1541 #, 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:1601 +#: commands/sequence.c:1565 #, 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:1613 +#: commands/sequence.c:1571 #, 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:1628 +#: commands/sequence.c:1582 #, 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:1665 +#: commands/sequence.c:1618 #, c-format msgid "invalid OWNED BY option" msgstr "неприпустимий параметр OWNED BY" -#: commands/sequence.c:1666 +#: commands/sequence.c:1619 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Вкажіть OWNED BY таблиця.стовпець або OWNED BY NONE." -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, 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:1698 +#: commands/sequence.c:1652 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "послідовність повинна мати того ж власника, що і таблиця, з якою вона зв'язана" -#: commands/sequence.c:1702 +#: commands/sequence.c:1656 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "послідовність повинна бути в тій самій схемі, що і таблиця, з якою вона зв'язана" -#: commands/sequence.c:1724 +#: commands/sequence.c:1678 #, c-format msgid "cannot change ownership of identity sequence" msgstr "змінити власника послідовності ідентифікації не можна" -#: commands/sequence.c:1725 commands/tablecmds.c:13357 -#: commands/tablecmds.c:15971 +#: commands/sequence.c:1679 commands/tablecmds.c:13870 +#: commands/tablecmds.c:16507 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Послідовність \"%s\" зв'язана з таблицею \"%s\"." -#: commands/statscmds.c:112 commands/statscmds.c:121 tcop/utility.c:1866 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можна вказати лише одне відношення" -#: commands/statscmds.c:139 +#: 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:193 +#: commands/statscmds.c:191 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "об'єкт статистики \"%s\" вже існує, пропускається" -#: commands/statscmds.c:201 +#: commands/statscmds.c:199 #, c-format msgid "statistics object \"%s\" already exists" msgstr "об'єкт статистики \"%s\" вже існує" -#: commands/statscmds.c:212 +#: commands/statscmds.c:210 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "в статистиці не може бути більше ніж %d стовпців" -#: commands/statscmds.c:253 commands/statscmds.c:276 commands/statscmds.c:309 +#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 #, c-format msgid "statistics creation on system columns is not supported" msgstr "створення статистики для системних стовпців не підтримується" -#: commands/statscmds.c:260 commands/statscmds.c:283 +#: commands/statscmds.c:258 commands/statscmds.c:281 #, 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:326 +#: commands/statscmds.c:325 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "вираз не може використовуватись у багатоваріативній статистиці, тому що його тип %s немає визначеного класу оператора btree за замовчуванням" -#: commands/statscmds.c:347 +#: commands/statscmds.c:346 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "при побудові статистики для одного виразу види статистики можуть не вказуватись" -#: commands/statscmds.c:376 +#: commands/statscmds.c:375 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "нерозпізнаний вид статистики \"%s\"" -#: commands/statscmds.c:405 +#: commands/statscmds.c:404 #, c-format msgid "extended statistics require at least 2 columns" msgstr "для розширеної статистики потрібно мінімум 2 стовпці" -#: commands/statscmds.c:423 +#: commands/statscmds.c:422 #, c-format msgid "duplicate column name in statistics definition" msgstr "дублювання імені стовпця у визначенні статистики" -#: commands/statscmds.c:458 +#: commands/statscmds.c:457 #, c-format msgid "duplicate expression in statistics definition" msgstr "дублікат виразу у визначенні статистики" -#: commands/statscmds.c:639 commands/tablecmds.c:7959 +#: commands/statscmds.c:620 commands/tablecmds.c:8112 #, c-format msgid "statistics target %d is too low" msgstr "мета статистики занадто мала %d" -#: commands/statscmds.c:647 commands/tablecmds.c:7967 +#: commands/statscmds.c:628 commands/tablecmds.c:8120 #, c-format msgid "lowering statistics target to %d" msgstr "мета статистики знижується до %d" -#: commands/statscmds.c:670 +#: commands/statscmds.c:651 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "об'єкт статистики \"%s.%s\" не існує, пропускається" -#: commands/subscriptioncmds.c:223 +#: 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:237 commands/subscriptioncmds.c:243 -#: commands/subscriptioncmds.c:249 commands/subscriptioncmds.c:268 -#: commands/subscriptioncmds.c:274 +#: 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:281 commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 #, c-format msgid "subscription with %s must also set %s" msgstr "підписка з %s повинна також встановити %s" -#: commands/subscriptioncmds.c:380 +#: commands/subscriptioncmds.c:433 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "не вдалося отримати список публікацій з сервера публікації: %s" + +#: commands/subscriptioncmds.c:465 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "публікації %s не існує на сервері публікації" +msgstr[1] "публікацій %s не існує на сервері публікації" +msgstr[2] "публікацій %s не існує на сервері публікації" +msgstr[3] "публікацій %s не існує на сервері публікації" + +#: commands/subscriptioncmds.c:547 #, c-format msgid "must be superuser to create subscriptions" msgstr "для створення підписок потрібно бути суперкористувачем" -#: commands/subscriptioncmds.c:474 commands/subscriptioncmds.c:572 -#: replication/logical/tablesync.c:975 replication/logical/worker.c:3226 +#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 +#: replication/logical/tablesync.c:1247 replication/logical/worker.c:3738 #, c-format msgid "could not connect to the publisher: %s" msgstr "не вдалося підключитись до сервера публікації: %s" -#: commands/subscriptioncmds.c:516 +#: commands/subscriptioncmds.c:717 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервері публікації створений слот реплікації \"%s\"" #. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:529 +#: commands/subscriptioncmds.c:730 #, c-format msgid "tables were not subscribed, you will have to run %s to subscribe the tables" msgstr "таблиці не були підписані, вам необхідно виконати %s, щоб підписати таблиці" -#: commands/subscriptioncmds.c:828 +#: commands/subscriptioncmds.c:1033 #, c-format msgid "cannot set %s for enabled subscription" msgstr "неможливо встановити %s для увімкненої підписки" -#: commands/subscriptioncmds.c:884 +#: commands/subscriptioncmds.c:1086 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "увімкнути підписку, для якої не задано ім'я слота, не можна" -#: commands/subscriptioncmds.c:936 commands/subscriptioncmds.c:983 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION з оновленням для відключених підписок не допускається" -#: commands/subscriptioncmds.c:937 commands/subscriptioncmds.c:984 +#: commands/subscriptioncmds.c:1130 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Використайте ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1004 +#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION з параметрами refresh і copy_data не допускається, коли two_phase ввімкнено" + +#: commands/subscriptioncmds.c:1140 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Використайте ALTER SUBSCRIPTION ... SET PUBLICATION з параметрами refresh або copy_data, які дорівнюють false, або використайте DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1182 +#, c-format +msgid "Use %s instead." +msgstr "Використайте %s замість цього." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1196 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "Використовуйте %s з refresh = false, або з copy_data = false, або використовуйте DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1218 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH для відключених підписок не допускається" -#: commands/subscriptioncmds.c:1092 +#: commands/subscriptioncmds.c:1243 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH з параметром copy_data не допускається, коли two_phase ввімкнено" + +#: commands/subscriptioncmds.c:1244 +#, c-format +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:1263 +#, c-format +msgid "must be superuser to skip transaction" +msgstr "щоб пропустити транзакцію потрібно бути суперкористувачем" + +#: commands/subscriptioncmds.c:1283 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "пропустити розташування WAL (LSN %X/%X) повинно бути більше, ніж origin LSN %X/%X" + +#: commands/subscriptioncmds.c:1363 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "підписка \"%s\" не існує, пропускається" -#: commands/subscriptioncmds.c:1344 +#: commands/subscriptioncmds.c:1621 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "видалено слот реплікації \"%s\" на сервері публікації" -#: commands/subscriptioncmds.c:1353 commands/subscriptioncmds.c:1361 +#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "не вдалося видалити слот реплікації \"%s\" на сервері публікації: %s" -#: commands/subscriptioncmds.c:1395 +#: commands/subscriptioncmds.c:1672 #, c-format msgid "permission denied to change owner of subscription \"%s\"" msgstr "немає прав на зміну власника підписки \"%s\"" -#: commands/subscriptioncmds.c:1397 +#: commands/subscriptioncmds.c:1674 #, c-format msgid "The owner of a subscription must be a superuser." msgstr "Власником підписки повинен бути суперкористувач." -#: commands/subscriptioncmds.c:1513 +#: commands/subscriptioncmds.c:1788 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "не вдалося отримати список реплікованих таблиць із сервера публікації: %s" -#: commands/subscriptioncmds.c:1578 +#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:819 +#: replication/pgoutput/pgoutput.c:1072 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "використовувати різні списки стовпців для таблиці \"%s.%s\" в різних публікаціях не можна" + +#: commands/subscriptioncmds.c:1860 #, 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:1581 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Використовуйте %s, щоб вимкнути підписку, а потім використайте %s, щоб від'єднати її від слоту." -#: commands/subscriptioncmds.c:1612 +#: commands/subscriptioncmds.c:1894 #, c-format msgid "publication name \"%s\" used more than once" msgstr "ім'я публікації \"%s\" використовується більше ніж один раз" -#: commands/subscriptioncmds.c:1656 +#: commands/subscriptioncmds.c:1938 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публікація \"%s\" вже в підписці \"%s\"" -#: commands/subscriptioncmds.c:1670 +#: commands/subscriptioncmds.c:1952 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публікація \"%s\" не знаходиться в підписці \"%s\"" -#: commands/subscriptioncmds.c:1681 +#: commands/subscriptioncmds.c:1963 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "не можна видалити всі публікації з підписки" -#: commands/tablecmds.c:241 commands/tablecmds.c:283 +#: commands/tablecmds.c:245 commands/tablecmds.c:287 #, c-format msgid "table \"%s\" does not exist" msgstr "таблиця \"%s\" не існує" -#: commands/tablecmds.c:242 commands/tablecmds.c:284 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "таблиця \"%s\" не існує, пропускається" -#: commands/tablecmds.c:244 commands/tablecmds.c:286 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 msgid "Use DROP TABLE to remove a table." msgstr "Використайте DROP TABLE для видалення таблиці." -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:251 #, c-format msgid "sequence \"%s\" does not exist" msgstr "послідовність \"%s\" не існує" -#: commands/tablecmds.c:248 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "послідовність \"%s\" не існує, пропускається" -#: commands/tablecmds.c:250 +#: commands/tablecmds.c:254 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Використайте DROP SEQUENCE, щоб видалити послідовність." -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:257 #, c-format msgid "view \"%s\" does not exist" msgstr "подання \"%s\" не існує" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "подання \"%s\" не існує, пропускається" -#: commands/tablecmds.c:256 +#: commands/tablecmds.c:260 msgid "Use DROP VIEW to remove a view." msgstr "Використайте DROP VIEW для видалення подання." -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:263 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "матеріалізоване подання \"%s\" не існує" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "матеріалізоване подання \"%s\" не існує, пропускається" -#: commands/tablecmds.c:262 +#: commands/tablecmds.c:266 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Використайте DROP MATERIALIZED VIEW, щоб видалити матеріалізоване подання." -#: commands/tablecmds.c:265 commands/tablecmds.c:289 commands/tablecmds.c:18441 -#: parser/parse_utilcmd.c:2258 +#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:19019 +#: parser/parse_utilcmd.c:2261 #, c-format msgid "index \"%s\" does not exist" msgstr "індекс \"%s\" не існує" -#: commands/tablecmds.c:266 commands/tablecmds.c:290 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "індекс \"%s\" не існує, пропускається" -#: commands/tablecmds.c:268 commands/tablecmds.c:292 +#: commands/tablecmds.c:272 commands/tablecmds.c:296 msgid "Use DROP INDEX to remove an index." msgstr "Використайте DROP INDEX, щоб видалити індекс." -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:277 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" не є типом" -#: commands/tablecmds.c:274 +#: commands/tablecmds.c:278 msgid "Use DROP TYPE to remove a type." msgstr "Використайте DROP TYPE, щоб видалити тип." -#: commands/tablecmds.c:277 commands/tablecmds.c:13196 -#: commands/tablecmds.c:15674 +#: commands/tablecmds.c:281 commands/tablecmds.c:13709 +#: commands/tablecmds.c:16210 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "зовнішня таблиця \"%s\" не існує" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:282 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "зовнішня таблиця \"%s\" не існує, пропускається" -#: commands/tablecmds.c:280 +#: commands/tablecmds.c:284 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Використайте DROP FOREIGN TABLE щоб видалити сторонню таблицю." -#: commands/tablecmds.c:670 +#: commands/tablecmds.c:697 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можна використовувати лише для тимчасових таблиць" -#: commands/tablecmds.c:701 +#: commands/tablecmds.c:728 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "неможливо створити тимчасову таблицю в межах операції з обмеженням безпеки" -#: commands/tablecmds.c:737 commands/tablecmds.c:14481 +#: commands/tablecmds.c:764 commands/tablecmds.c:15017 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "відношення \"%s\" буде успадковуватись більш ніж один раз" -#: commands/tablecmds.c:922 +#: commands/tablecmds.c:949 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "вказання методу доступу до таблиці не підтримується з секційною таблицею" -#: commands/tablecmds.c:1018 +#: commands/tablecmds.c:1042 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" не секціоновано" -#: commands/tablecmds.c:1113 +#: commands/tablecmds.c:1137 #, c-format msgid "cannot partition using more than %d columns" msgstr "число стовпців в ключі секціонування не може перевищувати %d" -#: commands/tablecmds.c:1169 +#: commands/tablecmds.c:1193 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "не можна створити зовнішню секцію в секціонованій таблиці \"%s\"" -#: commands/tablecmds.c:1171 +#: commands/tablecmds.c:1195 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблиця \"%s\" містить індекси, які унікальні." -#: commands/tablecmds.c:1334 +#: commands/tablecmds.c:1358 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не підтримує видалення кількох об'єктів" -#: commands/tablecmds.c:1338 +#: commands/tablecmds.c:1362 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не підтримує режим CASCADE" -#: commands/tablecmds.c:1442 +#: commands/tablecmds.c:1466 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "неможливо видалити секціонований індекс \"%s\" паралельно" -#: commands/tablecmds.c:1730 +#: commands/tablecmds.c:1754 #, c-format msgid "cannot truncate only a partitioned table" msgstr "скоротити тільки секціоновану таблицю не можна" -#: commands/tablecmds.c:1731 +#: commands/tablecmds.c:1755 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Не вказуйте ключове слово ONLY або використайте TRUNCATE ONLY безпосередньо для секцій." -#: commands/tablecmds.c:1803 +#: commands/tablecmds.c:1827 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "скорочення поширюється на таблицю \"%s\"" -#: commands/tablecmds.c:2153 +#: commands/tablecmds.c:2177 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "скоротити зовнішню таблицю \"%s\" не можна" -#: commands/tablecmds.c:2202 +#: commands/tablecmds.c:2234 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "тимчасові таблиці інших сеансів не можна скоротити" -#: commands/tablecmds.c:2430 commands/tablecmds.c:14378 +#: commands/tablecmds.c:2462 commands/tablecmds.c:14914 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "успадкування від секціонованої таблиці \"%s\" не допускається" -#: commands/tablecmds.c:2435 +#: commands/tablecmds.c:2467 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "успадкування від розділу \"%s\" не допускається" -#: commands/tablecmds.c:2443 parser/parse_utilcmd.c:2488 -#: parser/parse_utilcmd.c:2630 +#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2633 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "успадковане відношення \"%s\" не є таблицею або сторонньою таблицею" -#: commands/tablecmds.c:2455 +#: commands/tablecmds.c:2487 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "створити тимчасове відношення як секцію постійного відношення\"%s\" не можна" -#: commands/tablecmds.c:2464 commands/tablecmds.c:14357 +#: commands/tablecmds.c:2496 commands/tablecmds.c:14893 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "тимчасове відношення \"%s\" не може успадковуватись" -#: commands/tablecmds.c:2474 commands/tablecmds.c:14365 +#: commands/tablecmds.c:2506 commands/tablecmds.c:14901 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "успадкування від тимчасового відношення іншого сеансу неможливе" -#: commands/tablecmds.c:2528 +#: commands/tablecmds.c:2560 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "злиття декількох успадкованих визначень стовпця \"%s\"" -#: commands/tablecmds.c:2536 +#: commands/tablecmds.c:2568 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфлікт типів в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2538 commands/tablecmds.c:2561 -#: commands/tablecmds.c:2578 commands/tablecmds.c:2834 -#: commands/tablecmds.c:2864 commands/tablecmds.c:2878 +#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 +#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 +#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 #: 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 @@ -9354,1627 +10042,1638 @@ msgstr "конфлікт типів в успадкованому стовпці msgid "%s versus %s" msgstr "%s проти %s" -#: commands/tablecmds.c:2547 +#: commands/tablecmds.c:2579 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2549 commands/tablecmds.c:2846 -#: commands/tablecmds.c:6614 +#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 +#: commands/tablecmds.c:6792 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" проти \"%s\"" -#: commands/tablecmds.c:2559 +#: commands/tablecmds.c:2591 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2576 commands/tablecmds.c:2876 +#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "конфлікт методів стиснення в стовпці \"%s\"" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2623 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфлікт генерування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:2685 commands/tablecmds.c:2740 -#: commands/tablecmds.c:11941 parser/parse_utilcmd.c:1302 -#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 +#: commands/tablecmds.c:12433 parser/parse_utilcmd.c:1302 +#: parser/parse_utilcmd.c:1345 parser/parse_utilcmd.c:1754 +#: parser/parse_utilcmd.c:1862 #, c-format msgid "cannot convert whole-row table reference" msgstr "перетворити посилання на тип усього рядка таблиці не можна" -#: commands/tablecmds.c:2686 parser/parse_utilcmd.c:1303 +#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1303 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Вираз генерації для стовпця \"%s\" містить посилання на весь рядок на таблицю \"%s\"." -#: commands/tablecmds.c:2741 parser/parse_utilcmd.c:1346 +#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1346 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Обмеження \"%s\" посилається на тип усього рядка в таблиці \"%s\"." -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:2852 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:2824 +#: commands/tablecmds.c:2856 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "переміщення і злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:2825 +#: commands/tablecmds.c:2857 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Визначений користувачем стовпець переміщений в позицію успадкованого стовпця." -#: commands/tablecmds.c:2832 +#: commands/tablecmds.c:2864 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфлікт типів в стовпці \"%s\"" -#: commands/tablecmds.c:2844 +#: commands/tablecmds.c:2876 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в стовпці \"%s\"" -#: commands/tablecmds.c:2862 +#: commands/tablecmds.c:2894 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в стовпці \"%s\"" -#: commands/tablecmds.c:2903 +#: commands/tablecmds.c:2935 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "дочірній стовпець \"%s\" визначає вираз генерації" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:2937 #, 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:2909 +#: commands/tablecmds.c:2941 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує за замовчуванням" -#: commands/tablecmds.c:2914 +#: commands/tablecmds.c:2946 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує ідентичність" -#: commands/tablecmds.c:3023 +#: commands/tablecmds.c:3055 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "стовпець \"%s\" успадковує конфліктуючи вирази генерації" -#: commands/tablecmds.c:3028 +#: commands/tablecmds.c:3060 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "стовпець \"%s\" успадковує конфліктні значення за замовчуванням" -#: commands/tablecmds.c:3030 +#: commands/tablecmds.c:3062 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для усунення конфлікту вкажіть бажане значення за замовчуванням." -#: commands/tablecmds.c:3076 +#: commands/tablecmds.c:3108 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "ім'я перевірочного обмеження \"%s\" з'являється декілька разів, але з різними виразами" -#: commands/tablecmds.c:3289 +#: commands/tablecmds.c:3321 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "переміщувати тимчасові таблиці інших сеансів не можна" -#: commands/tablecmds.c:3359 +#: commands/tablecmds.c:3391 #, c-format msgid "cannot rename column of typed table" msgstr "перейменувати стовпець типізованої таблиці не можна" -#: commands/tablecmds.c:3378 +#: commands/tablecmds.c:3410 #, 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:3472 +#: commands/tablecmds.c:3505 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "успадкований стовпець \"%s\" повинен бути перейменований в дочірніх таблицях також" -#: commands/tablecmds.c:3504 +#: commands/tablecmds.c:3537 #, c-format msgid "cannot rename system column \"%s\"" msgstr "не можна перейменувати системний стовпець \"%s\"" -#: commands/tablecmds.c:3519 +#: commands/tablecmds.c:3552 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "не можна перейменувати успадкований стовпець \"%s\"" -#: commands/tablecmds.c:3671 +#: commands/tablecmds.c:3704 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "успадковане обмеження \"%s\" повинно бути перейменовано в дочірніх таблицях також" -#: commands/tablecmds.c:3678 +#: commands/tablecmds.c:3711 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "не можна перейменувати успадковане обмеження \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3976 +#: commands/tablecmds.c:4008 #, 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:3985 +#: commands/tablecmds.c:4017 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "не можна виконати %s \"%s\", тому що з цим об'єктом зв'язані очікуванні події тригерів" -#: commands/tablecmds.c:4453 +#: commands/tablecmds.c:4486 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "не можна змінити розділ \"%s\" з неповним відключенням" -#: commands/tablecmds.c:4646 commands/tablecmds.c:4661 +#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 #, c-format msgid "cannot change persistence setting twice" msgstr "неможливо двічі змінити параметр стійкості" -#: commands/tablecmds.c:5421 +#: commands/tablecmds.c:4715 +#, c-format +msgid "cannot change access method of a partitioned table" +msgstr "неможливо змінити метод доступу секціонованої таблиці" + +#: commands/tablecmds.c:4721 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "неможливо мати декілька підкоманд SET ACCESS METHOD" + +#: commands/tablecmds.c:5476 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписати системне відношення \"%s\" не можна" -#: commands/tablecmds.c:5427 +#: commands/tablecmds.c:5482 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписати таблицю \"%s\", що використовується як таблиця каталогу, не можна" -#: commands/tablecmds.c:5437 +#: commands/tablecmds.c:5492 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "неможливо перезаписати тимчасові таблиці інших сеансів" -#: commands/tablecmds.c:5898 +#: commands/tablecmds.c:5986 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "стовпець \"%s\" відношення \"%s\" містить null значення" -#: commands/tablecmds.c:5915 +#: commands/tablecmds.c:6003 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "перевірка обмеження \"%s\" відношення \"%s\" порушується деяким рядком" -#: commands/tablecmds.c:5934 partitioning/partbounds.c:3292 +#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "оновлене обмеження секції для секції за замовчуванням \"%s\" буде порушено деякими рядками" -#: commands/tablecmds.c:5940 +#: commands/tablecmds.c:6028 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "обмеження секції відношення \"%s\" порушується деяким рядком" -#: commands/tablecmds.c:6088 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:6091 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання або індекс" - -#: commands/tablecmds.c:6097 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" - не таблиця, матеріалізоване подання або індекс" - -#: commands/tablecmds.c:6100 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or partitioned index" -msgstr "\"%s\" - не таблиця, матеріалізоване подання, індекс або секціонований індекс" - -#: commands/tablecmds.c:6103 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" -msgstr "\"%s\" - не таблиця, матеріалізоване подання, секціонований індекс або зовнішня таблиця" - -#: commands/tablecmds.c:6106 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\" - не таблиця, матеріалізоване подання або зовнішня таблиця" - -#: commands/tablecmds.c:6109 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" - не таблиця або зовнішня таблиця" - -#: commands/tablecmds.c:6112 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" - не таблиця, складений тип або зовнішня таблиця" - -#: commands/tablecmds.c:6115 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "\"%s\" - не таблиця, матеріалізоване подання, індекс або зовнішня таблиця" - -#: commands/tablecmds.c:6118 -#, c-format -msgid "\"%s\" is not a table or partitioned index" -msgstr "\"%s\" не є таблицею або секціонованим індексом" - -#: commands/tablecmds.c:6128 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6295 #, 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:6372 commands/tablecmds.c:6379 +#: commands/tablecmds.c:6550 commands/tablecmds.c:6557 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "неможливо змінити тип \"%s\", тому що стовпець \"%s.%s\" використовує його" -#: commands/tablecmds.c:6386 +#: commands/tablecmds.c:6564 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити сторонню таблицю \"%s\", тому що стовпець \"%s.%s\" використовує тип її рядка" -#: commands/tablecmds.c:6393 +#: commands/tablecmds.c:6571 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити таблицю \"%s\", тому що стовпець \"%s.%s\" використовує тип її рядка" -#: commands/tablecmds.c:6449 +#: commands/tablecmds.c:6627 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "неможливо змінити тип \"%s\", тому що це тип типізованої таблиці" -#: commands/tablecmds.c:6451 +#: commands/tablecmds.c:6629 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Щоб змінити типізовані таблиці, використайте також ALTER ... CASCADE." -#: commands/tablecmds.c:6497 +#: commands/tablecmds.c:6675 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не є складеним" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6702 #, c-format msgid "cannot add column to typed table" msgstr "неможливо додати стовпець до типізованої таблиці" -#: commands/tablecmds.c:6577 +#: commands/tablecmds.c:6755 #, c-format msgid "cannot add column to a partition" msgstr "неможливо додати стовпець до розділу" -#: commands/tablecmds.c:6606 commands/tablecmds.c:14608 +#: commands/tablecmds.c:6784 commands/tablecmds.c:15144 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочірня таблиця \"%s\" має інший тип для стовпця \"%s\"" -#: commands/tablecmds.c:6612 commands/tablecmds.c:14615 +#: commands/tablecmds.c:6790 commands/tablecmds.c:15151 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "дочірня таблиця \"%s\" має інше правило сортування для стовпця \"%s\"" -#: commands/tablecmds.c:6626 +#: commands/tablecmds.c:6804 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "об'єднання визначення стовпця \"%s\" для нащадка \"%s\"" -#: commands/tablecmds.c:6669 +#: commands/tablecmds.c:6847 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "неможливо додати стовпець ідентифікації в таблицю, яка має дочірні таблиці" -#: commands/tablecmds.c:6912 +#: commands/tablecmds.c:7091 #, c-format msgid "column must be added to child tables too" msgstr "стовпець також повинен бути доданий до дочірніх таблиць" -#: commands/tablecmds.c:6990 +#: commands/tablecmds.c:7169 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "стовпець \"%s\" відношення \"%s\" вже існує, пропускається" -#: commands/tablecmds.c:6997 +#: commands/tablecmds.c:7176 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "стовпець \"%s\" відношення \"%s\" вже існує" -#: commands/tablecmds.c:7063 commands/tablecmds.c:11580 +#: commands/tablecmds.c:7242 commands/tablecmds.c:12072 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "неможливо видалити обмеження тільки з секціонованої таблиці, коли існують секції" -#: commands/tablecmds.c:7064 commands/tablecmds.c:7381 -#: commands/tablecmds.c:8404 commands/tablecmds.c:11581 +#: commands/tablecmds.c:7243 commands/tablecmds.c:7560 +#: commands/tablecmds.c:8557 commands/tablecmds.c:12073 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не вказуйте ключове слово ONLY." -#: commands/tablecmds.c:7101 commands/tablecmds.c:7307 -#: commands/tablecmds.c:7449 commands/tablecmds.c:7563 -#: commands/tablecmds.c:7657 commands/tablecmds.c:7716 -#: commands/tablecmds.c:7834 commands/tablecmds.c:8000 -#: commands/tablecmds.c:8070 commands/tablecmds.c:8226 -#: commands/tablecmds.c:11735 commands/tablecmds.c:13219 -#: commands/tablecmds.c:15765 +#: commands/tablecmds.c:7280 commands/tablecmds.c:7486 +#: commands/tablecmds.c:7628 commands/tablecmds.c:7742 +#: commands/tablecmds.c:7836 commands/tablecmds.c:7895 +#: commands/tablecmds.c:8014 commands/tablecmds.c:8153 +#: commands/tablecmds.c:8223 commands/tablecmds.c:8379 +#: commands/tablecmds.c:12227 commands/tablecmds.c:13732 +#: commands/tablecmds.c:16301 #, c-format msgid "cannot alter system column \"%s\"" msgstr "не можна змінити системний стовпець \"%s\"" -#: commands/tablecmds.c:7107 commands/tablecmds.c:7455 +#: commands/tablecmds.c:7286 commands/tablecmds.c:7634 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "стовпець \"%s\" відношення \"%s\" є стовпцем ідентифікації" -#: commands/tablecmds.c:7150 +#: commands/tablecmds.c:7329 #, c-format msgid "column \"%s\" is in a primary key" msgstr "стовпець \"%s\" входить до первинного ключа" -#: commands/tablecmds.c:7155 +#: commands/tablecmds.c:7334 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "стовпець \"%s\" в індексі, що використовується як ідентифікація репліки" -#: commands/tablecmds.c:7178 +#: commands/tablecmds.c:7357 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "стовпець \"%s\" в батьківській таблиці позначений як NOT NULL" -#: commands/tablecmds.c:7378 commands/tablecmds.c:8887 +#: commands/tablecmds.c:7557 commands/tablecmds.c:9040 #, c-format msgid "constraint must be added to child tables too" msgstr "обмеження повинно бути додано у дочірні таблиці також" -#: commands/tablecmds.c:7379 +#: commands/tablecmds.c:7558 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Стовпець \"%s\" відношення \"%s\" вже не NOT NULL." -#: commands/tablecmds.c:7457 +#: commands/tablecmds.c:7636 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." msgstr "Замість цього використайте ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." -#: commands/tablecmds.c:7462 +#: commands/tablecmds.c:7641 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "стовпець \"%s\" відношення \"%s\" є згенерованим стовпцем" -#: commands/tablecmds.c:7465 +#: commands/tablecmds.c:7644 #, c-format msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." msgstr "Замість цього використайте ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION" -#: commands/tablecmds.c:7574 +#: commands/tablecmds.c:7753 #, 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:7580 +#: commands/tablecmds.c:7759 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "стовпець \"%s\" відношення \"%s\" вже є стовпцем ідентифікації" -#: commands/tablecmds.c:7586 +#: commands/tablecmds.c:7765 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "стовпець \"%s\" відношення \"%s\" вже має значення за замовчуванням" -#: commands/tablecmds.c:7663 commands/tablecmds.c:7724 +#: commands/tablecmds.c:7842 commands/tablecmds.c:7903 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "стовпець \"%s\" відношення \"%s\" не є стовпцем ідентифікації" -#: commands/tablecmds.c:7729 +#: commands/tablecmds.c:7908 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не є стовпцем ідентифікації, пропускається" -#: commands/tablecmds.c:7782 +#: commands/tablecmds.c:7961 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION повинен бути застосований і до дочірніх таблиць" -#: commands/tablecmds.c:7804 +#: commands/tablecmds.c:7983 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "не можна видалити вираз генерації з успадкованого стовпця" -#: commands/tablecmds.c:7842 +#: commands/tablecmds.c:8022 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "стовпець \"%s\" відношення \"%s\" не є збереженим згенерованим стовпцем" -#: commands/tablecmds.c:7847 +#: commands/tablecmds.c:8027 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не є збереженим згенерованим стовпцем, пропускається" -#: commands/tablecmds.c:7947 +#: commands/tablecmds.c:8100 #, c-format msgid "cannot refer to non-index column by number" msgstr "не можна посилатись на неіндексований стовпець за номером" -#: commands/tablecmds.c:7990 +#: commands/tablecmds.c:8143 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "стовпець з номером %d відношення %s не існує" -#: commands/tablecmds.c:8009 +#: commands/tablecmds.c:8162 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "змінити статистику включеного стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:8167 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "змінити статистику невираженого стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:8016 +#: commands/tablecmds.c:8169 #, c-format msgid "Alter statistics on table column instead." msgstr "Замість цього змініть статистику стовпця в таблиці." -#: commands/tablecmds.c:8206 +#: commands/tablecmds.c:8359 #, c-format msgid "invalid storage type \"%s\"" msgstr "неприпустимий тип сховища \"%s\"" -#: commands/tablecmds.c:8238 +#: commands/tablecmds.c:8391 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип даних стовпця %s може мати тільки сховище PLAIN" -#: commands/tablecmds.c:8283 +#: commands/tablecmds.c:8436 #, c-format msgid "cannot drop column from typed table" msgstr "не можна видалити стовпець з типізованої таблиці" -#: commands/tablecmds.c:8342 +#: commands/tablecmds.c:8495 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:8355 +#: commands/tablecmds.c:8508 #, c-format msgid "cannot drop system column \"%s\"" msgstr "не можна видалити системний стовпець \"%s\"" -#: commands/tablecmds.c:8365 +#: commands/tablecmds.c:8518 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "не можна видалити успадкований стовпець \"%s\"" -#: commands/tablecmds.c:8378 +#: commands/tablecmds.c:8531 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна видалити стовпець \"%s\", тому що він є частиною ключа секції відношення \"%s\"" -#: commands/tablecmds.c:8403 +#: commands/tablecmds.c:8556 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "видалити стовпець тільки з секціонованої таблиці, коли існують секції, не можна" -#: commands/tablecmds.c:8607 +#: commands/tablecmds.c:8760 #, 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:8632 +#: commands/tablecmds.c:8785 #, 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:8967 +#: commands/tablecmds.c:9122 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна використати ONLY для стороннього ключа в секціонованій таблиці \"%s\", який посилається на відношення \"%s\"" -#: commands/tablecmds.c:8973 +#: commands/tablecmds.c:9128 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна додати сторонній ключ з характеристикою NOT VALID в секціоновану таблицю \"%s\", який посилається на відношення \"%s\"" -#: commands/tablecmds.c:8976 +#: commands/tablecmds.c:9131 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Ця функція ще не підтримується з секціонованими таблицями." -#: commands/tablecmds.c:8983 commands/tablecmds.c:9388 +#: commands/tablecmds.c:9138 commands/tablecmds.c:9604 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "вказане відношення \"%s\" не є таблицею" -#: commands/tablecmds.c:9006 +#: commands/tablecmds.c:9161 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "обмеження в постійних таблицях можуть посилатись лише на постійні таблиці" -#: commands/tablecmds.c:9013 +#: commands/tablecmds.c:9168 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "обмеження в нежурнальованих таблицях можуть посилатись тільки на постійні або нежурналюємі таблиці" -#: commands/tablecmds.c:9019 +#: commands/tablecmds.c:9174 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "обмеження в тимчасових таблицях можуть посилатись лише на тимчасові таблиці" -#: commands/tablecmds.c:9023 +#: commands/tablecmds.c:9178 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "обмеження в тимчасових таблицях повинні посилатись лише на тичасові таблиці поточного сеансу" -#: commands/tablecmds.c:9089 commands/tablecmds.c:9095 +#: commands/tablecmds.c:9252 commands/tablecmds.c:9258 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "неприпустима дія %s для обмеження зовнішнього ключа, який містить згеренований стовпець" -#: commands/tablecmds.c:9111 +#: commands/tablecmds.c:9274 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число стовпців в джерелі і призначенні зовнішнього ключа не збігається" -#: commands/tablecmds.c:9218 +#: commands/tablecmds.c:9381 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "обмеження зовнішнього ключа \"%s\" не можна реалізувати" -#: commands/tablecmds.c:9220 +#: commands/tablecmds.c:9383 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Стовпці ключа \"%s\" і \"%s\" містять несумісні типи: %s і %s." -#: commands/tablecmds.c:9583 commands/tablecmds.c:9996 -#: parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:926 +#: commands/tablecmds.c:9540 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "стовпець \"%s\" вказаний у дії ON DELETE SET повинен бути частиною зовнішнього ключа" + +#: commands/tablecmds.c:9813 commands/tablecmds.c:10281 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:925 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "обмеження зовнішнього ключа для сторонніх таблиць не підтримуються" -#: commands/tablecmds.c:10373 commands/tablecmds.c:10651 -#: commands/tablecmds.c:11537 commands/tablecmds.c:11612 +#: commands/tablecmds.c:10833 commands/tablecmds.c:11111 +#: commands/tablecmds.c:12029 commands/tablecmds.c:12104 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "обмеження \"%s\" відношення \"%s\" не існує" -#: commands/tablecmds.c:10380 +#: commands/tablecmds.c:10840 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "обмеження \"%s\" відношення \"%s\" не є обмеженням зовнішнього ключа" -#: commands/tablecmds.c:10418 +#: commands/tablecmds.c:10878 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" -msgstr "неможливо змінити обмеження \"%s\" відношення \"%s\"" +msgstr "не можна змінити обмеження \"%s\" відношення \"%s\"" -#: commands/tablecmds.c:10421 +#: commands/tablecmds.c:10881 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Обмеження \"%s\" походить з обмеження \"%s\" відношення \"%s\"." -#: commands/tablecmds.c:10423 +#: commands/tablecmds.c:10883 #, c-format msgid "You may alter the constraint it derives from, instead." msgstr "Натомість ви можете змінити початкове обмеження." -#: commands/tablecmds.c:10659 +#: commands/tablecmds.c:11119 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "обмеження \"%s\" відношення \"%s\" не є зовнішнім ключем або перевіркою обмеженням " -#: commands/tablecmds.c:10737 +#: commands/tablecmds.c:11197 #, c-format msgid "constraint must be validated on child tables too" msgstr "обмеження повинно дотримуватися в дочірніх таблицях також" -#: commands/tablecmds.c:10827 +#: commands/tablecmds.c:11287 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "стовпець \"%s\", вказаний в обмеженні зовнішнього ключа, не існує" -#: commands/tablecmds.c:10833 +#: commands/tablecmds.c:11293 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "в зовнішніх ключах не можна використовувати системні стовпці" -#: commands/tablecmds.c:10837 +#: commands/tablecmds.c:11297 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "у зовнішньому ключі не може бути більш ніж %d ключів" -#: commands/tablecmds.c:10902 +#: commands/tablecmds.c:11363 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "використовувати затримуваний первинний ключ в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:10919 +#: commands/tablecmds.c:11380 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає первинного ключа" -#: commands/tablecmds.c:10984 +#: commands/tablecmds.c:11445 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "у списку стовпців зовнішнього ключа не повинно бути повторень" -#: commands/tablecmds.c:11078 +#: commands/tablecmds.c:11539 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "використовувати затримане обмеження унікальності в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:11083 +#: commands/tablecmds.c:11544 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає обмеження унікальності, відповідного даним ключам" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:11985 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "видалити успадковане обмеження \"%s\" відношення \"%s\" не можна" -#: commands/tablecmds.c:11543 +#: commands/tablecmds.c:12035 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "обмеження \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:11719 +#: commands/tablecmds.c:12211 #, c-format msgid "cannot alter column type of typed table" msgstr "змінити тип стовпця в типізованій таблиці не можна" -#: commands/tablecmds.c:11746 +#: commands/tablecmds.c:12238 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "змінити успадкований стовпець \"%s\" не можна" -#: commands/tablecmds.c:11755 +#: commands/tablecmds.c:12247 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна змінити стовпець \"%s\", тому що він є частиною ключа секції відношення \"%s\"" -#: commands/tablecmds.c:11805 +#: commands/tablecmds.c:12297 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "результати речення USING для стовпця \"%s\" не можна автоматично наведено для типу %s" -#: commands/tablecmds.c:11808 +#: commands/tablecmds.c:12300 #, c-format msgid "You might need to add an explicit cast." msgstr "Можливо, необхідно додати явне приведення типу." -#: commands/tablecmds.c:11812 +#: commands/tablecmds.c:12304 #, 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:11815 +#: commands/tablecmds.c:12307 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Можливо, необхідно вказати \"USING %s::%s\"." -#: commands/tablecmds.c:11914 +#: commands/tablecmds.c:12406 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "не можна змінити успадкований стовпець \"%s\" відношення \"%s\"" -#: commands/tablecmds.c:11942 +#: commands/tablecmds.c:12434 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Вираз USING містить посилання на тип усього рядка таблиці." -#: commands/tablecmds.c:11953 +#: commands/tablecmds.c:12445 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "тип успадкованого стовпця \"%s\" повинен бути змінений і в дочірніх таблицях" -#: commands/tablecmds.c:12078 +#: commands/tablecmds.c:12570 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "не можна змінити тип стовпця \"%s\" двічі" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12608 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "вираз генерації для стовпця \"%s\" не можна автоматично привести до типу %s" -#: commands/tablecmds.c:12121 +#: commands/tablecmds.c:12613 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "значення за замовчуванням для стовпця \"%s\" не можна автоматично привести до типу %s" -#: commands/tablecmds.c:12199 -#, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "змінити тип стовпця, який використовується згенерованим стовпцем, не можна" - -#: commands/tablecmds.c:12200 -#, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "Стовпець \"%s\" використовується згенерованим стовпцем \"%s\"." - -#: commands/tablecmds.c:12221 +#: commands/tablecmds.c:12694 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "змінити тип стовпця, залученого в поданні або правилі, не можна" -#: commands/tablecmds.c:12222 commands/tablecmds.c:12241 -#: commands/tablecmds.c:12259 +#: commands/tablecmds.c:12695 commands/tablecmds.c:12714 +#: commands/tablecmds.c:12732 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s залежить від стовпця \"%s\"" -#: commands/tablecmds.c:12240 +#: commands/tablecmds.c:12713 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні тригеру" -#: commands/tablecmds.c:12258 +#: commands/tablecmds.c:12731 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні політики" -#: commands/tablecmds.c:13327 commands/tablecmds.c:13339 +#: commands/tablecmds.c:12762 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "змінити тип стовпця, який використовується згенерованим стовпцем, не можна" + +#: commands/tablecmds.c:12763 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "Стовпець \"%s\" використовується згенерованим стовпцем \"%s\"." + +#: commands/tablecmds.c:13840 commands/tablecmds.c:13852 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "неможливо змінити власника індексу \"%s\"" -#: commands/tablecmds.c:13329 commands/tablecmds.c:13341 +#: commands/tablecmds.c:13842 commands/tablecmds.c:13854 #, c-format msgid "Change the ownership of the index's table, instead." msgstr "Замість цього змініть власника таблиці, що містить цей індекс." -#: commands/tablecmds.c:13355 +#: commands/tablecmds.c:13868 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "неможливо змінити власника послідовності \"%s\"" -#: commands/tablecmds.c:13369 commands/tablecmds.c:16657 +#: commands/tablecmds.c:13882 commands/tablecmds.c:17201 +#: commands/tablecmds.c:17220 #, c-format msgid "Use ALTER TYPE instead." msgstr "Замість цього використайте ALTER TYPE." -#: commands/tablecmds.c:13378 +#: commands/tablecmds.c:13891 #, 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:13717 +#: commands/tablecmds.c:14253 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одній інструкції не може бути декілька підкоманд SET TABLESPACE" -#: commands/tablecmds.c:13794 +#: commands/tablecmds.c:14330 #, 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:13827 commands/view.c:505 +#: commands/tablecmds.c:14364 commands/view.c:521 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION підтримується лише з автооновлюваними поданнями" -#: commands/tablecmds.c:14079 +#: commands/tablecmds.c:14614 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "у табличних просторах існують лише таблиці, індекси та матеріалізовані подання" -#: commands/tablecmds.c:14091 +#: commands/tablecmds.c:14626 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "переміщувати відношення у або з табличного простору pg_global не можна" -#: commands/tablecmds.c:14183 +#: commands/tablecmds.c:14718 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "переривання через блокування відношення \"%s.%s\" неможливе" -#: commands/tablecmds.c:14199 +#: commands/tablecmds.c:14734 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr " табличному просторі \"%s\" не знайдені відповідні відносини" -#: commands/tablecmds.c:14316 +#: commands/tablecmds.c:14852 #, c-format msgid "cannot change inheritance of typed table" msgstr "змінити успадкування типізованої таблиці не можна" -#: commands/tablecmds.c:14321 commands/tablecmds.c:14877 +#: commands/tablecmds.c:14857 commands/tablecmds.c:15413 #, c-format msgid "cannot change inheritance of a partition" msgstr "змінити успадкування секції не можна" -#: commands/tablecmds.c:14326 +#: commands/tablecmds.c:14862 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "змінити успадкування секціонованої таблиці не можна" -#: commands/tablecmds.c:14372 +#: commands/tablecmds.c:14908 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "успадкування для тимчасового відношення іншого сеансу не можливе" -#: commands/tablecmds.c:14385 +#: commands/tablecmds.c:14921 #, c-format msgid "cannot inherit from a partition" msgstr "успадкування від секції неможливе" -#: commands/tablecmds.c:14407 commands/tablecmds.c:17301 +#: commands/tablecmds.c:14943 commands/tablecmds.c:17856 #, c-format msgid "circular inheritance not allowed" msgstr "циклічне успадкування неприпустиме" -#: commands/tablecmds.c:14408 commands/tablecmds.c:17302 +#: commands/tablecmds.c:14944 commands/tablecmds.c:17857 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" вже є нащадком \"%s\"." -#: commands/tablecmds.c:14421 +#: commands/tablecmds.c:14957 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "тригер \"%s\" не дозволяє таблиці \"%s\" стати нащадком успадкування" -#: commands/tablecmds.c:14423 +#: commands/tablecmds.c:14959 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Тригери ROW з перехідними таблицями не підтримуються в ієрархіях успадкування." -#: commands/tablecmds.c:14626 +#: commands/tablecmds.c:15162 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "стовпець \"%s\" в дочірній таблиці має бути позначений як NOT NULL" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15171 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "стовпець \"%s\" у дочірній таблиці повинен бути згенерованим стовпцем" -#: commands/tablecmds.c:14685 +#: commands/tablecmds.c:15221 #, c-format msgid "column \"%s\" in child table has a conflicting generation expression" msgstr "стовпець \"%s\" в дочірній таблиці містить конфліктний вираз генерування" -#: commands/tablecmds.c:14713 +#: commands/tablecmds.c:15249 #, c-format msgid "child table is missing column \"%s\"" msgstr "у дочірній таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:14801 +#: commands/tablecmds.c:15337 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "дочірня таблиця \"%s\" має інше визначення перевірочного обмеження \"%s\"" -#: commands/tablecmds.c:14809 +#: commands/tablecmds.c:15345 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:14820 +#: commands/tablecmds.c:15356 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "обмеження \"%s\" конфліктує з NOT VALID обмеженням дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:14855 +#: commands/tablecmds.c:15391 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "у дочірній таблиці не вистачає обмеження \"%s\"" -#: commands/tablecmds.c:14941 +#: commands/tablecmds.c:15477 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "розділ \"%s\" вже очікує відключення в секціонованій таблиці \"%s.%s\"" -#: commands/tablecmds.c:14970 commands/tablecmds.c:15018 +#: commands/tablecmds.c:15506 commands/tablecmds.c:15554 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "відношення \"%s\" не є секцією відношення \"%s\"" -#: commands/tablecmds.c:15024 +#: commands/tablecmds.c:15560 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "відношення \"%s\" не є предком відношення \"%s\"" -#: commands/tablecmds.c:15252 +#: commands/tablecmds.c:15788 #, c-format msgid "typed tables cannot inherit" msgstr "типізовані таблиці не можуть успадковуватись" -#: commands/tablecmds.c:15282 +#: commands/tablecmds.c:15818 #, c-format msgid "table is missing column \"%s\"" msgstr "у таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15829 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблиця містить стовпець \"%s\", а тип потребує \"%s\"" -#: commands/tablecmds.c:15302 +#: commands/tablecmds.c:15838 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\" іншого типу" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:15852 #, c-format msgid "table has extra column \"%s\"" msgstr "таблиця містить зайвий стовпець \"%s\"" -#: commands/tablecmds.c:15368 +#: commands/tablecmds.c:15904 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - не типізована таблиця" -#: commands/tablecmds.c:15542 +#: commands/tablecmds.c:16078 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати неунікальний індекс \"%s\"" -#: commands/tablecmds.c:15548 +#: commands/tablecmds.c:16084 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати небезпосередній індекс \"%s\"" -#: commands/tablecmds.c:15554 +#: commands/tablecmds.c:16090 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати індекс з виразом \"%s\"" -#: commands/tablecmds.c:15560 +#: commands/tablecmds.c:16096 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати частковий індекс \"%s\"" -#: commands/tablecmds.c:15577 +#: commands/tablecmds.c:16113 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "індекс \"%s\" не можна використати як ідентифікацію репліки, тому що стовпець %d - системний стовпець" -#: commands/tablecmds.c:15584 +#: commands/tablecmds.c:16120 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "індекс \"%s\" не можна використати як ідентифікацію репліки, тому що стовпець \"%s\" допускає Null" -#: commands/tablecmds.c:15831 +#: commands/tablecmds.c:16367 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "змінити стан журналювання таблиці \"%s\" не можна, тому що вона тимчасова" -#: commands/tablecmds.c:15855 +#: commands/tablecmds.c:16391 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "таблицю \"%s\" не можна змінити на нежурнальовану, тому що вона є частиною публікації" -#: commands/tablecmds.c:15857 +#: commands/tablecmds.c:16393 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурнальовані відношення не підтримують реплікацію." -#: commands/tablecmds.c:15902 +#: commands/tablecmds.c:16438 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "не вдалося змінити таблицю \"%s\" на журнальовану, тому що вона посилається на нежурнальовану таблицю \"%s\"" -#: commands/tablecmds.c:15912 +#: commands/tablecmds.c:16448 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "не вдалося змінити таблицю \"%s\" на нежурнальовану, тому що вона посилається на журнальовану таблицю \"%s\"" -#: commands/tablecmds.c:15970 +#: commands/tablecmds.c:16506 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "перемістити послідовність з власником в іншу схему не можна" -#: commands/tablecmds.c:16077 +#: commands/tablecmds.c:16613 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "відношення \"%s\" вже існує в схемі \"%s\"" -#: commands/tablecmds.c:16640 +#: commands/tablecmds.c:17034 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" не є таблицею або матеріалізованим поданням" + +#: commands/tablecmds.c:17184 +#, c-format +msgid "\"%s\" is not a composite type" +msgstr "\"%s\" - не складений тип" + +#: commands/tablecmds.c:17212 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "змінити схему індексу \"%s\" не можна" + +#: commands/tablecmds.c:17214 commands/tablecmds.c:17226 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Замість цього змініть схему таблиці." + +#: commands/tablecmds.c:17218 #, c-format -msgid "\"%s\" is not a composite type" -msgstr "\"%s\" - не складений тип" +msgid "cannot change schema of composite type \"%s\"" +msgstr "змінити схему складеного типу \"%s\" не можна" -#: commands/tablecmds.c:16672 +#: commands/tablecmds.c:17224 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "\"%s\" - не таблиця, подання, матеріалізоване подання, послідовність або зовнішня таблиця" +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "змінити схему таблиці TOAST \"%s\" не можна" -#: commands/tablecmds.c:16707 +#: commands/tablecmds.c:17261 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нерозпізнана стратегія секціонування \"%s\"" -#: commands/tablecmds.c:16715 +#: commands/tablecmds.c:17269 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегія секціонування \"по списку\" не може використовувати декілька стовпців" -#: commands/tablecmds.c:16781 +#: commands/tablecmds.c:17335 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "стовпець \"%s\", згаданий в ключі секціонування, не існує" -#: commands/tablecmds.c:16789 +#: commands/tablecmds.c:17343 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системний стовпець \"%s\" не можна використати в ключі секціонування" -#: commands/tablecmds.c:16800 commands/tablecmds.c:16914 +#: commands/tablecmds.c:17354 commands/tablecmds.c:17444 #, c-format msgid "cannot use generated column in partition key" msgstr "використати згенерований стовпець в ключі секції, не можна" -#: commands/tablecmds.c:16801 commands/tablecmds.c:16915 commands/trigger.c:653 +#: commands/tablecmds.c:17355 commands/tablecmds.c:17445 commands/trigger.c:668 #: rewrite/rewriteHandler.c:929 rewrite/rewriteHandler.c:964 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Стовпець \"%s\" є згенерованим стовпцем." -#: commands/tablecmds.c:16877 -#, c-format -msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "функції у виразі ключа секціонування повинні бути позначені як IMMUTABLE" - -#: commands/tablecmds.c:16897 +#: commands/tablecmds.c:17427 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "вирази ключа секціонування не можуть містити посилання на системний стовпець" -#: commands/tablecmds.c:16927 +#: commands/tablecmds.c:17474 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "функції у виразі ключа секціонування повинні бути позначені як IMMUTABLE" + +#: commands/tablecmds.c:17483 #, c-format msgid "cannot use constant expression as partition key" msgstr "не можна використати константий вираз як ключ секціонування" -#: commands/tablecmds.c:16948 +#: commands/tablecmds.c:17504 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не вдалося визначити, яке правило сортування використати для виразу секціонування" -#: commands/tablecmds.c:16983 +#: commands/tablecmds.c:17539 #, 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:16989 +#: commands/tablecmds.c:17545 #, 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:17241 +#: commands/tablecmds.c:17796 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" вже є секцією" -#: commands/tablecmds.c:17247 +#: commands/tablecmds.c:17802 #, c-format msgid "cannot attach a typed table as partition" msgstr "неможливо підключити типізовану таблицю в якості секції" -#: commands/tablecmds.c:17263 +#: commands/tablecmds.c:17818 #, c-format msgid "cannot attach inheritance child as partition" msgstr "неможливо підключити нащадка успадкування в якості секції" -#: commands/tablecmds.c:17277 +#: commands/tablecmds.c:17832 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "неможливо підключити предка успадкування в якості секції" -#: commands/tablecmds.c:17311 +#: commands/tablecmds.c:17866 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "неможливо підкючити тимчасове відношення в якості секції постійного відношення \"%s\"" -#: commands/tablecmds.c:17319 +#: commands/tablecmds.c:17874 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "неможливо підключити постійне відношення в якості секції тимчасового відношення \"%s\"" -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:17882 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "неможливо підключити секцію до тимчасового відношення в іншому сеансі" -#: commands/tablecmds.c:17334 +#: commands/tablecmds.c:17889 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "неможливо підключити тимчасове відношення з іншого сеансу в якості секції" -#: commands/tablecmds.c:17354 +#: commands/tablecmds.c:17909 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\", відсутній в батьківській \"%s\"" -#: commands/tablecmds.c:17357 +#: commands/tablecmds.c:17912 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Нова секція може містити лише стовпці, що є у батьківській таблиці." -#: commands/tablecmds.c:17369 +#: commands/tablecmds.c:17924 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "тригер \"%s\" не дозволяє зробити таблицю \"%s\" секцією" -#: commands/tablecmds.c:17371 commands/trigger.c:459 +#: commands/tablecmds.c:17926 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" -msgstr "Тригери ROW з перехідними таблицями для секцій не підтримуються" +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "Тригери ROW з перехідними таблицями не підтримуються для секцій." -#: commands/tablecmds.c:17550 +#: commands/tablecmds.c:18105 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "не можна підключити зовнішню таблицю \"%s\" в якості секції секціонованої таблиці \"%s\"" -#: commands/tablecmds.c:17553 +#: commands/tablecmds.c:18108 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секціонована таблиця \"%s\" містить унікальні індекси." -#: commands/tablecmds.c:17877 +#: commands/tablecmds.c:18423 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "не можна одночасно відключити розділи, коли існує розділ за замовчуванням" -#: commands/tablecmds.c:17986 +#: commands/tablecmds.c:18532 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секціоновану таблицю \"%s\" було видалено одночасно" -#: commands/tablecmds.c:17992 +#: commands/tablecmds.c:18538 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "розділ \"%s\" було видалено паралельно" -#: commands/tablecmds.c:18475 commands/tablecmds.c:18495 -#: commands/tablecmds.c:18515 commands/tablecmds.c:18534 -#: commands/tablecmds.c:18576 +#: commands/tablecmds.c:19053 commands/tablecmds.c:19073 +#: commands/tablecmds.c:19093 commands/tablecmds.c:19112 +#: commands/tablecmds.c:19154 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "неможливо підключити індекс \"%s\" в якості секції індексу \"%s\"" -#: commands/tablecmds.c:18478 +#: commands/tablecmds.c:19056 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Індекс \"%s\" вже підключений до іншого індексу." -#: commands/tablecmds.c:18498 +#: commands/tablecmds.c:19076 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Індекс \"%s\" не є індексом жодної секції таблиці \"%s\"." -#: commands/tablecmds.c:18518 +#: commands/tablecmds.c:19096 #, c-format msgid "The index definitions do not match." msgstr "Визначення індексів не співпадають." -#: commands/tablecmds.c:18537 +#: commands/tablecmds.c:19115 #, 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:18579 +#: commands/tablecmds.c:19157 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "До секції \"%s\" вже підключений інший індекс." -#: commands/tablecmds.c:18816 +#: commands/tablecmds.c:19394 #, c-format msgid "column data type %s does not support compression" msgstr "тип даних стовпця %s не підтримує стискання" -#: commands/tablecmds.c:18823 +#: commands/tablecmds.c:19401 #, c-format msgid "invalid compression method \"%s\"" msgstr "неприпустимий метод стискання \"%s\"" -#: commands/tablespace.c:161 commands/tablespace.c:177 -#: commands/tablespace.c:594 commands/tablespace.c:639 replication/slot.c:1478 -#: storage/file/copydir.c:47 -#, c-format -msgid "could not create directory \"%s\": %m" -msgstr "не вдалося створити каталог \"%s\": %m" - -#: commands/tablespace.c:197 commands/tablespace.c:645 +#: commands/tablespace.c:199 commands/tablespace.c:665 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" існує, але це не каталог" -#: commands/tablespace.c:229 +#: commands/tablespace.c:231 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "немає прав на створення табличного простору \"%s\"" -#: commands/tablespace.c:231 +#: commands/tablespace.c:233 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Щоб створити табличний простір, потрібно бути суперкористувачем." -#: commands/tablespace.c:247 +#: commands/tablespace.c:249 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "у шляху до розташування табличного простіру не повинно бути одинарних лапок" -#: commands/tablespace.c:260 +#: commands/tablespace.c:262 #, c-format msgid "tablespace location must be an absolute path" msgstr "шлях до розташування табличного простору повинен бути абсолютним" -#: commands/tablespace.c:272 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "шлях до розташування табличного простору \"%s\" занадто довгий" -#: commands/tablespace.c:279 +#: commands/tablespace.c:281 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "табличний простір не повинен розташовуватись всередині каталогу даних" -#: commands/tablespace.c:288 commands/tablespace.c:976 +#: commands/tablespace.c:290 commands/tablespace.c:996 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприпустиме ім'я табличного простору \"%s\"" -#: commands/tablespace.c:290 commands/tablespace.c:977 +#: commands/tablespace.c:292 commands/tablespace.c:997 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Префікс \"\"pg_\" зарезервований для системних табличних просторів." -#: commands/tablespace.c:309 commands/tablespace.c:998 +#: commands/tablespace.c:311 commands/tablespace.c:1018 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличний простір \"%s\" вже існує" -#: commands/tablespace.c:427 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:329 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "значення OID pg_tablespace не встановлено в режимі двійкового оновлення" + +#: commands/tablespace.c:441 commands/tablespace.c:979 +#: commands/tablespace.c:1068 commands/tablespace.c:1137 +#: commands/tablespace.c:1283 commands/tablespace.c:1486 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличний простір \"%s\" не існує" -#: commands/tablespace.c:433 +#: commands/tablespace.c:447 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "табличний простір \"%s\" вже існує, пропускається" -#: commands/tablespace.c:461 +#: commands/tablespace.c:473 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "табличний простір \"%s\" не можна видалити, тому що деякі об'єкти залежать від нього" -#: commands/tablespace.c:520 +#: commands/tablespace.c:540 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "табличний простір \"%s\" не пустий" -#: commands/tablespace.c:612 +#: commands/tablespace.c:632 #, c-format msgid "directory \"%s\" does not exist" msgstr "каталог \"%s\" не існує" -#: commands/tablespace.c:613 +#: commands/tablespace.c:633 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Створіть цей каталог для табличного простору до перезапуску сервера." -#: commands/tablespace.c:618 +#: commands/tablespace.c:638 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не вдалося встановити права для каталогу \"%s\": %m" -#: commands/tablespace.c:650 +#: commands/tablespace.c:670 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" вже використовується в якості табличного простору" -#: commands/tablespace.c:768 commands/tablespace.c:781 -#: commands/tablespace.c:817 commands/tablespace.c:909 storage/file/fd.c:3169 -#: storage/file/fd.c:3565 +#: commands/tablespace.c:788 commands/tablespace.c:801 +#: commands/tablespace.c:837 commands/tablespace.c:929 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:830 commands/tablespace.c:918 +#: commands/tablespace.c:850 commands/tablespace.c:938 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "не вдалося видалити символьне посилання \"%s\": %m" -#: commands/tablespace.c:840 commands/tablespace.c:927 +#: commands/tablespace.c:860 commands/tablespace.c:947 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - не каталог або символьне посилання" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1142 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличний простір \"%s\" не існує." -#: commands/tablespace.c:1565 +#: commands/tablespace.c:1588 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "не вдалося видалити каталоги табличного простору %u" -#: commands/tablespace.c:1567 +#: commands/tablespace.c:1590 #, c-format msgid "You can remove the directories manually if necessary." msgstr "За потреби ви можете видалити каталоги вручну." -#: commands/trigger.c:216 commands/trigger.c:227 +#: commands/trigger.c:230 commands/trigger.c:241 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - таблиця" -#: commands/trigger.c:218 commands/trigger.c:229 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:250 +#: commands/trigger.c:264 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" є секційною таблицею" -#: commands/trigger.c:252 +#: commands/trigger.c:266 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "Тригери ROW з перехідними таблицями не підтримуються для секційованих таблиць." -#: commands/trigger.c:264 commands/trigger.c:271 commands/trigger.c:441 +#: commands/trigger.c:278 commands/trigger.c:285 commands/trigger.c:456 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - подання" -#: commands/trigger.c:266 +#: commands/trigger.c:280 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Подання не можуть мати рядкові тригери BEFORE або AFTER." -#: commands/trigger.c:273 +#: commands/trigger.c:287 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Подання не можуть мати тригери TRUNCATE." -#: commands/trigger.c:281 commands/trigger.c:288 commands/trigger.c:300 -#: commands/trigger.c:434 +#: commands/trigger.c:295 commands/trigger.c:302 commands/trigger.c:314 +#: commands/trigger.c:449 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - зовнішня таблиця" -#: commands/trigger.c:283 +#: commands/trigger.c:297 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Зовнішні таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have TRUNCATE triggers." msgstr "Зовнішні таблиці не можуть мати тригери TRUNCATE." -#: commands/trigger.c:302 +#: commands/trigger.c:316 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Зовнішні таблиці не можуть мати обмежувальні тригери." -#: commands/trigger.c:377 +#: commands/trigger.c:321 commands/trigger.c:1371 commands/trigger.c:1478 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "відношення \"%s\" не може мати тригери" + +#: commands/trigger.c:392 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "Тригери TRUNCATE FOR EACH ROW не підтримуються" -#: commands/trigger.c:385 +#: commands/trigger.c:400 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "Тригери INSTEAD OF повинні мати тип FOR EACH ROW" -#: commands/trigger.c:389 +#: commands/trigger.c:404 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "Тригери INSTEAD OF не можуть мати умови WHEN" -#: commands/trigger.c:393 +#: commands/trigger.c:408 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "Тригери INSTEAD OF не можуть мати список стовпців" -#: commands/trigger.c:422 +#: commands/trigger.c:437 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "Змінна іменування ROW в реченні REFERENCING не підтримується" -#: commands/trigger.c:423 +#: commands/trigger.c:438 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Використайте OLD TABLE або NEW TABLE для іменування перехідних таблиць." -#: commands/trigger.c:436 +#: commands/trigger.c:451 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Тригери зовнішніх таблиць не можуть використовувати перехідні таблиці." -#: commands/trigger.c:443 +#: commands/trigger.c:458 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Тригери подань не можуть використовувати перехідні таблиці." -#: commands/trigger.c:463 +#: commands/trigger.c:474 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "Тригери ROW з перехідними таблицями для секцій не підтримуються" + +#: commands/trigger.c:478 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "Тригери ROW з перехідними таблицями для нащадків успадкування не підтримуються" -#: commands/trigger.c:469 +#: commands/trigger.c:484 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "ім'я перехідної таблиці можна задати лише для тригеру AFTER" -#: commands/trigger.c:474 +#: commands/trigger.c:489 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "Тригери TRUNCATE з перехідними таблицями не підтримуються" -#: commands/trigger.c:491 +#: commands/trigger.c:506 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "перехідні таблиці не можна задати для тригерів, призначених для кількох подій" -#: commands/trigger.c:502 +#: commands/trigger.c:517 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "перехідні таблиці не можна задати для тригерів зі списками стовпців" -#: commands/trigger.c:519 +#: commands/trigger.c:534 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можна задати лише для тригерів INSERT або UPDATE" -#: commands/trigger.c:524 +#: commands/trigger.c:539 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE не можна задавати декілька разів" -#: commands/trigger.c:534 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можна задати лише для тригерів DELETE або UPDATE" -#: commands/trigger.c:539 +#: commands/trigger.c:554 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE не можна задавати декілька разів" -#: commands/trigger.c:549 +#: commands/trigger.c:564 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Ім'я OLD TABLE та ім'я NEW TABLE не можуть бути однаковими" -#: commands/trigger.c:613 commands/trigger.c:626 +#: commands/trigger.c:628 commands/trigger.c:641 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "в умові WHEN операторного тригера не можна посилатись на значення стовпця" -#: commands/trigger.c:618 +#: commands/trigger.c:633 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "В умові WHEN тригеру INSERT не можна посилатись на значення OLD" -#: commands/trigger.c:631 +#: commands/trigger.c:646 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "В умові WHEN тригера DELETE не можна посилатись на значення NEW" -#: commands/trigger.c:636 +#: commands/trigger.c:651 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "В умові WHEN тригера BEFORE не можна посилатись на системні стовпці NEW" -#: commands/trigger.c:644 commands/trigger.c:652 +#: commands/trigger.c:659 commands/trigger.c:667 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "В умові WHEN тригера BEFORE не можна посилатись на згенеровані стовпці NEW" -#: commands/trigger.c:645 +#: commands/trigger.c:660 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Використовується посилання на весь рядок і таблиця містить згенеровані стовпці." -#: commands/trigger.c:759 commands/trigger.c:1468 +#: commands/trigger.c:775 commands/trigger.c:1653 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "тригер \"%s\" для відношення \"%s\" вже існує" -#: commands/trigger.c:773 +#: commands/trigger.c:788 #, c-format -msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" -msgstr "тригер \"%s\" для відношення \"%s\" є внутрішнім тригером" +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "тригер \"%s\" для відношення \"%s\" є зовнішнім або дочірнім тригером" -#: commands/trigger.c:792 +#: commands/trigger.c:807 #, 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:1660 +#: commands/trigger.c:1443 commands/trigger.c:1596 commands/trigger.c:1877 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "тригер \"%s\" для таблиці \"%s\" не існує" -#: commands/trigger.c:1600 +#: commands/trigger.c:1568 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "перейменувати тригер \"%s\" для таблиці \"%s\" не можна" + +#: commands/trigger.c:1570 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Замість цього перейменуйте тригер для секціонованої таблиці \"%s\"." + +#: commands/trigger.c:1670 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "перейменовано тригер \"%s\" для відношення \"%s\"" + +#: commands/trigger.c:1816 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "немає доступу: \"%s\" - системний тригер" -#: commands/trigger.c:2221 +#: commands/trigger.c:2449 #, c-format msgid "trigger function %u returned null value" msgstr "тригерна функція %u повернула значення null" -#: commands/trigger.c:2281 commands/trigger.c:2495 commands/trigger.c:2734 -#: commands/trigger.c:3038 +#: commands/trigger.c:2509 commands/trigger.c:2727 commands/trigger.c:2995 +#: commands/trigger.c:3346 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Тригер BEFORE STATEMENT не може повертати значення" -#: commands/trigger.c:2355 +#: commands/trigger.c:2585 #, 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:2356 +#: commands/trigger.c:2586 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Перед виконанням тригера \"%s\", рядок повинен був бути в секції \"%s.%s\"." -#: commands/trigger.c:3104 executor/nodeModifyTable.c:1956 -#: executor/nodeModifyTable.c:2038 +#: commands/trigger.c:3423 executor/nodeModifyTable.c:2344 +#: executor/nodeModifyTable.c:2427 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "кортеж, який повинен бути оновленим, вже змінений в операції, яка викликана поточною командою" -#: commands/trigger.c:3105 executor/nodeModifyTable.c:1306 -#: executor/nodeModifyTable.c:1380 executor/nodeModifyTable.c:1957 -#: executor/nodeModifyTable.c:2039 +#: commands/trigger.c:3424 executor/nodeModifyTable.c:1510 +#: executor/nodeModifyTable.c:1584 executor/nodeModifyTable.c:2345 +#: executor/nodeModifyTable.c:2428 executor/nodeModifyTable.c:3075 #, 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:3134 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:230 -#: executor/nodeModifyTable.c:1322 executor/nodeModifyTable.c:1974 -#: executor/nodeModifyTable.c:2204 +#: commands/trigger.c:3465 executor/nodeLockRows.c:229 +#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1526 executor/nodeModifyTable.c:2362 +#: executor/nodeModifyTable.c:2570 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не вдалося серіалізувати доступ через паралельне оновлення" -#: commands/trigger.c:3142 executor/nodeModifyTable.c:1412 -#: executor/nodeModifyTable.c:2056 executor/nodeModifyTable.c:2228 +#: commands/trigger.c:3473 executor/nodeModifyTable.c:1616 +#: executor/nodeModifyTable.c:2445 executor/nodeModifyTable.c:2594 +#: executor/nodeModifyTable.c:2963 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не вдалося серіалізувати доступ через паралельне видалення" -#: commands/trigger.c:4234 +#: commands/trigger.c:4680 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "не можна виконати відкладений тригер в межах операції з обмеженням по безпеці" -#: commands/trigger.c:5284 +#: commands/trigger.c:5863 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "обмеження \"%s\" не є відкладеним" -#: commands/trigger.c:5307 +#: commands/trigger.c:5886 #, c-format msgid "constraint \"%s\" does not exist" msgstr "обмеження \"%s\" не існує" @@ -11084,581 +11783,581 @@ msgstr "для створення базового типу потрібно б 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: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 "атрибут типу \"%s\" не розпізнаний" -#: commands/typecmds.c:385 +#: commands/typecmds.c:382 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "неприпустима категорія типу \"%s\": повинен бути простий ASCII" -#: commands/typecmds.c:404 +#: commands/typecmds.c:401 #, c-format msgid "array element type cannot be %s" msgstr "типом елементу масиву не може бути %s" -#: commands/typecmds.c:436 +#: commands/typecmds.c:433 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип вирівнювання \"%s\" не розпізнаний" -#: commands/typecmds.c:453 commands/typecmds.c:4155 +#: commands/typecmds.c:450 commands/typecmds.c:4142 #, c-format msgid "storage \"%s\" not recognized" msgstr "сховище \"%s\" не розпізнане" -#: commands/typecmds.c:464 +#: commands/typecmds.c:461 #, c-format msgid "type input function must be specified" msgstr "необхідно вказати функцію вводу типу" -#: commands/typecmds.c:468 +#: commands/typecmds.c:465 #, c-format msgid "type output function must be specified" msgstr "необхідно вказати функцію виводу типу" -#: commands/typecmds.c:473 +#: commands/typecmds.c:470 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "функція виводу модифікатора типу недоцільна без функції вводу модифікатора типу" -#: commands/typecmds.c:515 +#: commands/typecmds.c:512 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "тип елементу не можна вказати без припустимої функції підписки" -#: commands/typecmds.c:784 +#: commands/typecmds.c:781 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - невідповідний базовий тип для домену" -#: commands/typecmds.c:882 +#: commands/typecmds.c:879 #, c-format msgid "multiple default expressions" msgstr "неодноразове визначення значення типу за замовчуванням" -#: 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 "конфліктуючі обмеження NULL/NOT NULL" -#: commands/typecmds.c:970 +#: commands/typecmds.c:967 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "перевірки обмеження для доменів не можуть позначатись як NO INHERIT" -#: 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 "обмеження унікальності неможливе для доменів" -#: 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 "обмеження первинного ключа неможливі для доменів" -#: 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 "обмеження винятків неможливі для доменів" -#: 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 "обмеження зовнішніх ключів неможливі для доменів" -#: 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 "зазначення відкладення обмежень для доменів не підтримується" -#: commands/typecmds.c:1320 utils/cache/typcache.c:2566 +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 #, c-format msgid "%s is not an enum" msgstr "%s не є переліком" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1458 #, c-format msgid "type attribute \"subtype\" is required" msgstr "вимагається атрибут типу \"subtype\"" -#: commands/typecmds.c:1478 +#: commands/typecmds.c:1463 #, c-format msgid "range subtype cannot be %s" msgstr "%s не може бути підтипом діапазону" -#: commands/typecmds.c:1497 +#: commands/typecmds.c:1482 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "вказано правило сортування для діапазону, але підтип не підтримує сортування" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1492 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "неможливо вказати канонічну функцію без попередньо створеного типу оболонки" -#: 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 "Створіть тип в якості оболонки, потім створіть його функцію канонізації, а потім виконайте повну CREATE TYPE." -#: commands/typecmds.c:1981 +#: commands/typecmds.c:1966 #, c-format msgid "type input function %s has multiple matches" msgstr "функція введення типу %s має декілька збігів" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:1984 #, c-format msgid "type input function %s must return type %s" msgstr "функція вводу типу %s повинна повертати тип %s" -#: commands/typecmds.c:2015 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s should not be volatile" msgstr "функція введення типу %s не повинна бути змінною" -#: commands/typecmds.c:2043 +#: commands/typecmds.c:2028 #, c-format msgid "type output function %s must return type %s" msgstr "функція виводу типу %s повинна повертати тип %s" -#: commands/typecmds.c:2050 +#: commands/typecmds.c:2035 #, c-format msgid "type output function %s should not be volatile" msgstr "функція виводу типу %s не повинна бути змінною" -#: commands/typecmds.c:2079 +#: commands/typecmds.c:2064 #, c-format msgid "type receive function %s has multiple matches" msgstr "функція отримання типу %s має декілька збігів" -#: commands/typecmds.c:2097 +#: commands/typecmds.c:2082 #, c-format msgid "type receive function %s must return type %s" msgstr "функція отримання типу %s повинна повертати тип %s" -#: commands/typecmds.c:2104 +#: commands/typecmds.c:2089 #, c-format msgid "type receive function %s should not be volatile" msgstr "функція отримання типу %s не повинна бути змінною" -#: commands/typecmds.c:2132 +#: commands/typecmds.c:2117 #, c-format msgid "type send function %s must return type %s" msgstr "функція відправлення типу %s повинна повертати тип %s" -#: commands/typecmds.c:2139 +#: commands/typecmds.c:2124 #, c-format msgid "type send function %s should not be volatile" msgstr "функція відправлення типу %s не повинна бути змінною" -#: commands/typecmds.c:2166 +#: commands/typecmds.c:2151 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функція typmod_in %s повинна повертати тип %s" -#: commands/typecmds.c:2173 +#: commands/typecmds.c:2158 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функція вводу модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:2200 +#: commands/typecmds.c:2185 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функція typmod_out %s повинна повертати тип %s" -#: commands/typecmds.c:2207 +#: commands/typecmds.c:2192 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функція виводу модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:2234 +#: commands/typecmds.c:2219 #, c-format msgid "type analyze function %s must return type %s" msgstr "функція аналізу типу %s повинна повертати тип %s" -#: commands/typecmds.c:2263 +#: commands/typecmds.c:2248 #, c-format msgid "type subscripting function %s must return type %s" msgstr "функція підписки типу %s повинна повертати тип %s" -#: commands/typecmds.c:2273 +#: commands/typecmds.c:2258 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "типи визначені користувачем не можуть використовувати функцію підписки %s" -#: commands/typecmds.c:2319 +#: 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:2350 +#: commands/typecmds.c:2335 #, c-format msgid "range canonical function %s must return range type" msgstr "функція канонічного діапазону %s повинна вертати тип діапазону" -#: commands/typecmds.c:2356 +#: commands/typecmds.c:2341 #, c-format msgid "range canonical function %s must be immutable" msgstr "функція канонічного діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2392 +#: commands/typecmds.c:2377 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функція розбіжностей для підтипу діапазону %s повинна повертати тип %s" -#: commands/typecmds.c:2399 +#: commands/typecmds.c:2384 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "функція розбіжностей для підтипу діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2426 +#: commands/typecmds.c:2411 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значення OID масиву pg_type не встановлено в режимі двійкового оновлення" -#: commands/typecmds.c:2459 +#: commands/typecmds.c:2444 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "значення OID в pg_type не задано під час режиму двійкового оновлення" -#: commands/typecmds.c:2492 +#: commands/typecmds.c:2477 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "значення OID масиву в pg_type не задано під час режиму двійкового оновлення" -#: commands/typecmds.c:2791 +#: commands/typecmds.c:2776 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "стовпець \"%s\" таблиці \"%s\" містить значення NULL" -#: 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 "обмеження \"%s\" для домену \"%s\" не існує" -#: commands/typecmds.c:2908 +#: commands/typecmds.c:2893 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "обмеження \"%s\" для домену \"%s\" не існує, пропускається" -#: commands/typecmds.c:3113 +#: commands/typecmds.c:3098 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "обмеження \"%s\" для домену \"%s\" не є перевірочним обмеженням" -#: commands/typecmds.c:3219 +#: commands/typecmds.c:3204 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "стовпець \"%s\" таблиці \"%s\" містить значення, які порушують нове обмеження" -#: 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 - не домен" -#: commands/typecmds.c:3480 +#: commands/typecmds.c:3465 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "обмеження \"%s\" для домену \"%s\" вже існує" -#: commands/typecmds.c:3531 +#: commands/typecmds.c:3516 #, c-format msgid "cannot use table references in domain check constraint" msgstr "у перевірочному обмеженні для домену не можна посилатись на таблиці" -#: 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 - тип рядків таблиці" -#: 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 "Замість цього використайте 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 "змінити тип масиву \"%s\" не можна" -#: 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 "Ви можете змінити тип %s, який спричинить зміну типу масиву." -#: commands/typecmds.c:4015 +#: commands/typecmds.c:4002 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" вже існує в схемі \"%s\"" -#: commands/typecmds.c:4183 +#: commands/typecmds.c:4170 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "неможливо змінити сховище типу на PLAIN" -#: commands/typecmds.c:4276 +#: commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "атрибут типу \"%s\" неможливо змінити" -#: commands/typecmds.c:4294 +#: commands/typecmds.c:4281 #, c-format msgid "must be superuser to alter a type" msgstr "для зміни типу потрібно бути суперкористувачем" -#: 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 - не є базовим типом" -#: 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:270 #, c-format 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:1226 commands/user.c:1233 -#: utils/adt/acl.c:5248 utils/adt/acl.c:5254 gram.y:15260 gram.y:15305 +#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 +#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:16437 gram.y:16483 #, c-format msgid "role name \"%s\" is reserved" msgstr "ім'я ролі \"%s\" зарезервовано" -#: 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 "Імена ролей, які починаються на \"pg_\", зарезервовані." -#: commands/user.c:348 commands/user.c:1250 +#: commands/user.c:310 commands/user.c:1163 #, c-format msgid "role \"%s\" already exists" msgstr "роль \"%s\" вже існує" -#: 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 "пустий рядок є неприпустимим паролем, пароль скидається" -#: commands/user.c:443 +#: commands/user.c:405 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "значення OID в pg_authid не встановлено в режимі двійкового оновлення" -#: commands/user.c:570 commands/user.c:925 +#: commands/user.c:524 commands/user.c:838 msgid "Cannot alter reserved roles." msgstr "Не можна змінити зарезервовані ролі." -#: commands/user.c:722 +#: commands/user.c:638 #, c-format msgid "must be superuser to alter superuser roles or change superuser attribute" msgstr "для зміни ролей суперкористувача або зміни атрибуту суперкористувача потрібно бути суперкористувачем" -#: commands/user.c:729 +#: commands/user.c:645 #, c-format msgid "must be superuser to alter replication roles or change replication attribute" msgstr "для зміни ролей реплікації або зміни атрибуту реплікації потрібно бути суперкористувачем" -#: commands/user.c:736 +#: commands/user.c:652 #, c-format msgid "must be superuser to change bypassrls attribute" msgstr "для зміни атрибута bypassrls потрібно бути суперкористувачем" -#: commands/user.c:752 commands/user.c:953 +#: commands/user.c:661 commands/user.c:866 #, c-format msgid "permission denied" msgstr "немає доступу" -#: 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 "для зміни суперкористувачів потрібно бути суперкористувачем" -#: commands/user.c:983 +#: commands/user.c:896 #, c-format msgid "must be superuser to alter settings globally" msgstr "для глобальної зміни параметрів потрібно бути суперкористувачем" -#: commands/user.c:1005 +#: commands/user.c:918 #, c-format msgid "permission denied to drop role" msgstr "немає прав для видалення ролі" -#: commands/user.c:1030 +#: commands/user.c:943 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "використати спеціальну роль у DROP ROLE не можна" -#: 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:710 +#: 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:1045 +#: commands/user.c:958 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "роль \"%s\" не існує, пропускається" -#: 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 "користувач не можна видалити сам себе" -#: commands/user.c:1066 +#: commands/user.c:979 #, c-format msgid "session user cannot be dropped" msgstr "користувача поточного сеансу не можна видалити" -#: commands/user.c:1076 +#: commands/user.c:989 #, c-format msgid "must be superuser to drop superusers" msgstr "для видалення суперкористувачів потрібно бути суперкористувачем" -#: commands/user.c:1092 +#: commands/user.c:1005 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "роль \"%s\" не можна видалити, тому що деякі об'єкти залежать від неї" -#: commands/user.c:1213 +#: commands/user.c:1126 #, c-format msgid "session user cannot be renamed" msgstr "користувача поточного сеансу не можна перейменувати" -#: commands/user.c:1217 +#: commands/user.c:1130 #, c-format msgid "current user cannot be renamed" msgstr "користувач не може перейменувати сам себе" -#: commands/user.c:1260 +#: commands/user.c:1173 #, c-format msgid "must be superuser to rename superusers" msgstr "для перейменування суперкористувачів потрібно бути суперкористувачем" -#: commands/user.c:1267 +#: commands/user.c:1180 #, c-format msgid "permission denied to rename role" msgstr "немає прав на перейменування ролі" -#: commands/user.c:1288 +#: commands/user.c:1201 #, c-format msgid "MD5 password cleared because of role rename" msgstr "У результаті перейменування ролі сума MD5 паролю очищена" -#: commands/user.c:1348 +#: commands/user.c:1261 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "в GRANT/REVOKE ROLE не можна включати назви стовпців" -#: commands/user.c:1386 +#: commands/user.c:1299 #, c-format msgid "permission denied to drop objects" msgstr "немає прав на видалення об'єктів" -#: 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 "немає прав на повторне призначення об'єктів" -#: 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 для ролі \"%s\"" -#: commands/user.c:1509 +#: commands/user.c:1422 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "роль \"%s\" не може мати явних членів" -#: commands/user.c:1524 +#: commands/user.c:1432 #, c-format msgid "must be superuser to set grantor" msgstr "для встановлення права управління правами необхідно бути суперкористувачем" -#: commands/user.c:1560 +#: commands/user.c:1468 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "роль \"%s\" не може бути членом якої-небудь ролі" -#: commands/user.c:1573 +#: commands/user.c:1481 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" - учасник ролі \"%s\"" -#: commands/user.c:1588 +#: commands/user.c:1496 #, c-format msgid "role \"%s\" is already a member of role \"%s\"" msgstr "роль \"%s\" вже є учасником ролі \"%s\"" -#: commands/user.c:1695 +#: commands/user.c:1603 #, c-format msgid "role \"%s\" is not a member of role \"%s\"" msgstr "роль \"%s\" не є учасником ролі \"%s\"" -#: commands/vacuum.c:133 +#: commands/vacuum.c:140 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нерозпізнаний параметр ANALYZE \"%s\"" -#: commands/vacuum.c:171 +#: commands/vacuum.c:178 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "паралельний параметр потребує значення між 0 і %d" -#: commands/vacuum.c:183 +#: commands/vacuum.c:190 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "одночасні процеси для очищення повинні бути між 0 і %d" -#: commands/vacuum.c:200 +#: commands/vacuum.c:207 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нерозпізнаний параметр VACUUM \"%s\"" -#: commands/vacuum.c:223 +#: commands/vacuum.c:230 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL не можна виконати паралельно" -#: commands/vacuum.c:239 +#: commands/vacuum.c:246 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "Якщо задається список стовпців, необхідно вказати параметр ANALYZE" -#: commands/vacuum.c:329 +#: commands/vacuum.c:336 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s не можна виконати під час VACUUM або ANALYZE" -#: commands/vacuum.c:339 +#: commands/vacuum.c:346 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING не можна використовувати з FULL" -#: commands/vacuum.c:346 +#: commands/vacuum.c:353 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST потребується з VACUUM FULL" @@ -11713,44 +12412,81 @@ msgstr "пропуск аналізу об'єкта \"%s\" --- блокуван msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "пропуск аналізу об'єкта\"%s\" --- відношення більше не існує" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1042 #, c-format msgid "oldest xmin is far in the past" msgstr "найстарший xmin далеко в минулому" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1043 #, 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:1083 +#: commands/vacuum.c:1086 #, c-format msgid "oldest multixact is far in the past" msgstr "найстарший multixact далеко в минулому" -#: commands/vacuum.c:1084 +#: commands/vacuum.c:1087 #, c-format msgid "Close open transactions with multixacts soon to avoid wraparound problems." msgstr "Завершіть відкриті транзакції з multixacts якнайшвидше, щоб уникнути проблеми зациклення." -#: commands/vacuum.c:1755 +#: commands/vacuum.c:1807 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "деякі бази даних не очищалися протягом більш ніж 2 мільярдів транзакцій" -#: commands/vacuum.c:1756 +#: commands/vacuum.c:1808 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Можливо, ви вже втратили дані в результаті зациклення транзакцій." -#: commands/vacuum.c:1924 +#: commands/vacuum.c:1976 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "пропускається \"%s\" --- очищати не таблиці або спеціальні системні таблиці не можна" -#: commands/variable.c:165 utils/misc/guc.c:11649 utils/misc/guc.c:11711 +#: commands/vacuum.c:2354 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "просканований індекс \"%s\", видалено версій рядків %d" + +#: commands/vacuum.c:2373 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "індекс \"%s\" наразі містить %.0f версій рядків у %u сторінках" + +#: commands/vacuum.c:2377 +#, 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:664 +#, 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 паралельний виконавець очистки для очищення індексу (заплановано: %d)" +msgstr[1] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" +msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" +msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" + +#: commands/vacuumparallel.c:670 +#, 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 паралельний виконавець очистки для очищення індексу (заплановано: %d)" +msgstr[1] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" +msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" +msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" + +#: commands/variable.c:165 utils/misc/guc.c:12108 utils/misc/guc.c:12186 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Нерозпізнане ключове слово: \"%s\"." @@ -11810,7 +12546,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:1693 +#: commands/variable.c:548 storage/lmgr/predicate.c:1694 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "використовувати серіалізований режим в hot standby не можна" @@ -11848,7 +12584,7 @@ msgstr "змінити клієнтське кодування під час п #: commands/variable.c:890 #, c-format msgid "permission will be denied to set role \"%s\"" -msgstr "немає дозволу для встановлення ролі \"%s\"" +msgstr "немає прав для встановлення ролі \"%s\"" #: commands/variable.c:895 #, c-format @@ -11875,32 +12611,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:304 +#: commands/view.c:309 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "змінити тип стовпця подання \"%s\" з %s на %s неможливо" -#: commands/view.c:452 +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "змінити параметри сортування стовпця подання \"%s\" з \"%s\" на \"%s\" не можна" + +#: commands/view.c:468 #, c-format msgid "views must not contain SELECT INTO" msgstr "подання не повинні містити SELECT INTO" -#: commands/view.c:464 +#: commands/view.c:480 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "подання не повинні містити інструкції, які змінюють дані в WITH" -#: commands/view.c:534 +#: commands/view.c:550 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "У CREATE VIEW вказано більше імен стовпців, ніж самих стовпців" -#: commands/view.c:542 +#: commands/view.c:558 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "подання не можуть бути нежурнальованими, так як вони не мають сховища" -#: commands/view.c:556 +#: commands/view.c:572 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "подання \"%s\" буде тичасовим поданням" @@ -11936,57 +12677,57 @@ msgstr "курсор \"%s\" не розташовується у рядку" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "курсор \"%s\" - не просте оновлюване сканування таблиці \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2452 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2454 #, 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:2464 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2466 #, c-format msgid "no value found for parameter %d" msgstr "не знайдено значення для параметру %d" #: executor/execExpr.c:636 executor/execExpr.c:643 executor/execExpr.c:649 -#: executor/execExprInterp.c:4033 executor/execExprInterp.c:4050 -#: executor/execExprInterp.c:4149 executor/nodeModifyTable.c:119 -#: executor/nodeModifyTable.c:130 executor/nodeModifyTable.c:147 -#: executor/nodeModifyTable.c:155 +#: executor/execExprInterp.c:4062 executor/execExprInterp.c:4079 +#: executor/execExprInterp.c:4178 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип рядка таблиці відрізняється від типу рядка-результату запиту" -#: executor/execExpr.c:637 executor/nodeModifyTable.c:120 +#: executor/execExpr.c:637 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "Запит повертає дуже багато стовпців." -#: executor/execExpr.c:644 executor/nodeModifyTable.c:148 +#: executor/execExpr.c:644 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Запит надає значення для видаленого стовпця з порядковим номером %d." -#: executor/execExpr.c:650 executor/execExprInterp.c:4051 -#: executor/nodeModifyTable.c:131 +#: executor/execExpr.c:650 executor/execExprInterp.c:4080 +#: executor/nodeModifyTable.c:209 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Таблиця має тип %s у порядковому розташуванні %d, але запит очікує %s." -#: executor/execExpr.c:1098 parser/parse_agg.c:819 +#: executor/execExpr.c:1098 parser/parse_agg.c:837 #, c-format msgid "window function calls cannot be nested" msgstr "виклики віконних функцій не можуть бути вкладеними" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1617 #, c-format msgid "target type is not an array" msgstr "цільовий тип не є масивом" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1957 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "Стовпець ROW() має тип %s замість %s" -#: executor/execExpr.c:2483 executor/execSRF.c:718 parser/parse_func.c:138 +#: executor/execExpr.c:2482 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" @@ -11996,95 +12737,104 @@ msgstr[1] "функції не можна передати більше ніж % msgstr[2] "функції не можна передати більше ніж %d аргументів" msgstr[3] "функції не можна передати більше ніж %d аргументів" -#: executor/execExpr.c:2916 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:2509 executor/execSRF.c:738 executor/functions.c:1073 +#: utils/adt/jsonfuncs.c:3699 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" + +#: executor/execExpr.c:2915 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:3044 executor/execExpr.c:3066 +#: executor/execExpr.c:3043 executor/execExpr.c:3065 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не підтримує вказані присвоєння за підпискою" -#: executor/execExprInterp.c:1916 +#: executor/execExprInterp.c:1918 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типу %s був видалений" -#: executor/execExprInterp.c:1922 +#: executor/execExprInterp.c:1924 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типу %s має неправильний тип" -#: executor/execExprInterp.c:1924 executor/execExprInterp.c:3058 -#: executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3060 +#: executor/execExprInterp.c:3106 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Таблиця має тип %s, але запит очікував %s." -#: executor/execExprInterp.c:2004 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:492 +#: executor/execExprInterp.c:2006 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:570 #, c-format msgid "type %s is not composite" msgstr "тип %s не є складеним" -#: executor/execExprInterp.c:2542 +#: executor/execExprInterp.c:2544 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиць такого типу не підтримується" -#: executor/execExprInterp.c:2755 +#: executor/execExprInterp.c:2757 #, c-format msgid "cannot merge incompatible arrays" msgstr "не можна об'єднати несумісні масиви" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2758 #, 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:2777 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3373 utils/adt/arrayfuncs.c:5369 -#: utils/adt/arrayfuncs.c:5886 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2779 utils/adt/arrayfuncs.c:264 +#: utils/adt/arrayfuncs.c:564 utils/adt/arrayfuncs.c:1306 +#: utils/adt/arrayfuncs.c:3422 utils/adt/arrayfuncs.c:5419 +#: utils/adt/arrayfuncs.c:5936 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:2797 executor/execExprInterp.c:2832 +#: executor/execExprInterp.c:2799 executor/execExprInterp.c:2834 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "для багатовимірних масивів повинні задаватись вирази з відповідними вимірами" -#: executor/execExprInterp.c:2809 utils/adt/array_expanded.c:274 -#: utils/adt/arrayfuncs.c:936 utils/adt/arrayfuncs.c:1544 -#: utils/adt/arrayfuncs.c:3261 utils/adt/arrayfuncs.c:3403 -#: utils/adt/arrayfuncs.c:5978 utils/adt/arrayfuncs.c:6319 -#: utils/adt/arrayutils.c:94 utils/adt/arrayutils.c:103 -#: utils/adt/arrayutils.c:110 +#: executor/execExprInterp.c:2811 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:937 utils/adt/arrayfuncs.c:1545 +#: utils/adt/arrayfuncs.c:2353 utils/adt/arrayfuncs.c:2368 +#: utils/adt/arrayfuncs.c:2630 utils/adt/arrayfuncs.c:2646 +#: utils/adt/arrayfuncs.c:2954 utils/adt/arrayfuncs.c:2969 +#: utils/adt/arrayfuncs.c:3310 utils/adt/arrayfuncs.c:3452 +#: utils/adt/arrayfuncs.c:6028 utils/adt/arrayfuncs.c:6369 +#: utils/adt/arrayutils.c:88 utils/adt/arrayutils.c:97 +#: utils/adt/arrayutils.c:104 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "розмір масиву перевищує максимальний допустимий розмір (%d)" -#: executor/execExprInterp.c:3057 executor/execExprInterp.c:3103 +#: executor/execExprInterp.c:3059 executor/execExprInterp.c:3105 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d має неправильний тип" -#: executor/execExprInterp.c:3662 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3691 utils/adt/domains.c:149 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускає значення null" -#: executor/execExprInterp.c:3677 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3706 utils/adt/domains.c:184 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значення домену %s порушує перевірочнео бмеження \"%s\"" -#: executor/execExprInterp.c:4034 +#: executor/execExprInterp.c:4063 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -12093,215 +12843,225 @@ msgstr[1] "Рядок таблиці містить %d атрибути, але msgstr[2] "Рядок таблиці містить %d атрибутів, але запит очікував %d." msgstr[3] "Рядок таблиці містить %d атрибутів, але запит очікував %d." -#: executor/execExprInterp.c:4150 executor/execSRF.c:977 +#: executor/execExprInterp.c:4179 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Невідповідність параметрів фізичного зберігання видаленого атрибуту %d." -#: executor/execIndexing.c:567 +#: 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:838 +#: executor/execIndexing.c:848 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не вдалося створити обмеження-виключення \"%s\"" -#: executor/execIndexing.c:841 +#: executor/execIndexing.c:851 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфліктує з ключем %s." -#: executor/execIndexing.c:843 +#: executor/execIndexing.c:853 #, c-format msgid "Key conflicts exist." msgstr "Існують конфлікти ключей." -#: executor/execIndexing.c:849 +#: executor/execIndexing.c:859 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфліктуюче значення ключа порушує обмеження-виключення \"%s\"" -#: executor/execIndexing.c:852 +#: executor/execIndexing.c:862 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфліктує з існуючим ключем %s." -#: executor/execIndexing.c:854 +#: executor/execIndexing.c:864 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфліктує з існуючим ключем." -#: executor/execMain.c:1007 +#: executor/execMain.c:1009 #, c-format msgid "cannot change sequence \"%s\"" msgstr "послідовність \"%s\" не можна змінити" -#: executor/execMain.c:1013 +#: executor/execMain.c:1015 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-відношення \"%s\" не можна змінити" -#: executor/execMain.c:1031 rewrite/rewriteHandler.c:3096 -#: rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3100 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставити дані в подання \"%s\" не можна" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3099 -#: rewrite/rewriteHandler.c:3930 +#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3103 +#: rewrite/rewriteHandler.c:3977 #, 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:1039 rewrite/rewriteHandler.c:3104 -#: rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3108 +#: rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot update view \"%s\"" msgstr "оновити подання \"%s\" не можна" -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3107 -#: rewrite/rewriteHandler.c:3938 +#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3111 +#: rewrite/rewriteHandler.c:3985 #, 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:1047 rewrite/rewriteHandler.c:3112 -#: rewrite/rewriteHandler.c:3943 +#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3116 +#: rewrite/rewriteHandler.c:3990 #, c-format msgid "cannot delete from view \"%s\"" msgstr "видалити дані з подання \"%s\" не можна" -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3115 -#: rewrite/rewriteHandler.c:3946 +#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3119 +#: rewrite/rewriteHandler.c:3993 #, 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:1060 +#: executor/execMain.c:1062 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "змінити матеріалізоване подання \"%s\" не можна" -#: executor/execMain.c:1072 +#: executor/execMain.c:1074 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставляти дані в зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1078 +#: executor/execMain.c:1080 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "зовнішня таблиця \"%s\" не допускає додавання даних" -#: executor/execMain.c:1085 +#: executor/execMain.c:1087 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "оновити зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1091 +#: executor/execMain.c:1093 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "зовнішня таблиця \"%s\" не дозволяє оновлення" -#: executor/execMain.c:1098 +#: executor/execMain.c:1100 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "видаляти дані з зовнішньої таблиці \"%s\" не можна" -#: executor/execMain.c:1104 +#: executor/execMain.c:1106 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "зовнішня таблиця \"%s\" не дозволяє видалення даних" -#: executor/execMain.c:1115 +#: executor/execMain.c:1117 #, c-format msgid "cannot change relation \"%s\"" msgstr "відношення \"%s\" не можна змінити" -#: executor/execMain.c:1142 +#: executor/execMain.c:1144 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокувати рядки в послідовності \"%s\" не можна" -#: executor/execMain.c:1149 +#: executor/execMain.c:1151 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокувати рядки в TOAST-відношенні \"%s\" не можна" -#: executor/execMain.c:1156 +#: executor/execMain.c:1158 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокувати рядки в поданні \"%s\" не можна" -#: executor/execMain.c:1164 +#: executor/execMain.c:1166 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокувати рядки в матеріалізованому поданні \"%s\" не можна" -#: executor/execMain.c:1173 executor/execMain.c:2587 +#: executor/execMain.c:1175 executor/execMain.c:2685 #: executor/nodeLockRows.c:136 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокувати рядки в зовнішній таблиці \"%s\" не можна" -#: executor/execMain.c:1179 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокувати рядки у відношенні \"%s\" не можна" -#: executor/execMain.c:1803 +#: executor/execMain.c:1888 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новий рядок для відношення \"%s\" порушує обмеження секції" -#: 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 "Помилковий рядок містить %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 значення в стовпці \"%s\" відношення \"%s\" порушує not-null обмеження" -#: executor/execMain.c:1936 +#: executor/execMain.c:2021 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новий рядок для відношення \"%s\" порушує перевірне обмеження перевірку \"%s\"" -#: executor/execMain.c:2045 +#: executor/execMain.c:2130 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новий рядок порушує параметр перевірки для подання \"%s\"" -#: executor/execMain.c:2055 +#: executor/execMain.c:2140 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків \"%s\" для таблиці \"%s\"" -#: executor/execMain.c:2060 +#: executor/execMain.c:2145 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків для таблиці \"%s\"" -#: executor/execMain.c:2067 +#: executor/execMain.c:2153 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "цільовий рядок порушує політику захисту на рівні рядків \"%s\" (вираз USING) для таблиці \"%s\"" + +#: executor/execMain.c:2158 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "цільовий рядок порушує політику захисту на рівні рядків (вираз USING) для таблиці \"%s\"" + +#: executor/execMain.c:2165 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків \"%s\" (вираз USING) для таблиці \"%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 "новий рядок порушує політику захисту на рівні рядків (вираз USING) для таблиці \"%s\"" -#: executor/execPartition.c:322 +#: executor/execPartition.c:330 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "для рядка не знайдено секції у відношенні \"%s\"" -#: executor/execPartition.c:325 +#: executor/execPartition.c:333 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ секціонування для невідповідного рядка містить %s." @@ -12321,50 +13081,60 @@ msgstr "паралельне оновлення, триває повторна msgid "concurrent delete, retrying" msgstr "паралельне видалення, триває повторна спроба" -#: executor/execReplication.c:276 parser/parse_cte.c:301 +#: executor/execReplication.c:276 parser/parse_cte.c:308 #: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:724 -#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3653 -#: utils/adt/arrayfuncs.c:4207 utils/adt/arrayfuncs.c:6199 +#: utils/adt/array_userfuncs.c:867 utils/adt/arrayfuncs.c:3702 +#: utils/adt/arrayfuncs.c:4257 utils/adt/arrayfuncs.c:6249 #: utils/adt/rowtypes.c:1203 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не вдалося визначити оператора рівності для типу %s" -#: executor/execReplication.c:604 +#: executor/execReplication.c:606 executor/execReplication.c:612 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "оновити таблицю \"%s\" не можна" + +#: executor/execReplication.c:608 executor/execReplication.c:620 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "Стовпець, що використовується в виразі WHERE публікації не є частиною ідентифікації репліки." + +#: executor/execReplication.c:614 executor/execReplication.c:626 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "Список стовпців, який використовується публікацією, не охоплює ідентифікацію репліки." + +#: executor/execReplication.c:618 executor/execReplication.c:624 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "видалити дані з таблиці \"%s\" не можна" + +#: executor/execReplication.c:644 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "оновлення в таблиці \"%s\" неможливе, тому що в ній відсутній ідентифікатор репліки, і вона публікує оновлення" -#: executor/execReplication.c:606 +#: executor/execReplication.c:646 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб ця таблиця підтримувала оновлення, встановіть REPLICA IDENTITY, використавши ALTER TABLE." -#: executor/execReplication.c:610 +#: executor/execReplication.c:650 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "видалення з таблиці \"%s\" неможливе, тому що в ній відсутній ідентифікатор репліки, і вона публікує видалення" -#: executor/execReplication.c:612 +#: executor/execReplication.c:652 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб ця таблиця підтримувала видалення, встановіть REPLICA IDENTITY, використавши ALTER TABLE." -#: executor/execReplication.c:631 executor/execReplication.c:639 +#: executor/execReplication.c:668 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "використовувати відношення \"%s.%s\" як ціль логічної реплікації, не можна" -#: executor/execReplication.c:633 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "\"%s.%s\" є зовнішньою таблицею." - -#: executor/execReplication.c:641 -#, 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" @@ -12442,7 +13212,7 @@ msgid "%s is not allowed in an SQL function" msgstr "функція SQL не дозволяє використання %s" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1752 executor/spi.c:2643 +#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "незмінна функція не дозволяє використання %s" @@ -12504,21 +13274,16 @@ msgstr "Останній оператор вертає дуже мало сто msgid "return type %s is not supported for SQL functions" msgstr "для SQL функцій тип повернення %s не підтримується" -#: executor/nodeAgg.c:3088 executor/nodeAgg.c:3097 executor/nodeAgg.c:3109 +#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2991 #, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "неочікуваний обрив для стрічки %d: запитано %zu байт, прочитано %zu байт" +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "агрегатна функція %u повинна мати сумісні тип введення і тип переходу" -#: executor/nodeAgg.c:3979 parser/parse_agg.c:661 parser/parse_agg.c:689 +#: executor/nodeAgg.c:3952 parser/parse_agg.c:679 parser/parse_agg.c:707 #, c-format msgid "aggregate function calls cannot be nested" msgstr "виклики агрегатних функцій не можуть бути вкладеними" -#: executor/nodeAgg.c:4187 executor/nodeWindowAgg.c:2845 -#, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "агрегатна функція %u повинна мати сумісні тип введення і тип переходу" - #: executor/nodeCustom.c:145 executor/nodeCustom.c:156 #, c-format msgid "custom scan \"%s\" does not support MarkPos" @@ -12559,42 +13324,73 @@ msgstr "RIGHT JOIN підтримується лише з умовами, які msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN підтримується лише з умовами, які допускають з'єднання злиттям" -#: executor/nodeModifyTable.c:156 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "Запит повертає дуже мало стовпців." -#: executor/nodeModifyTable.c:1305 executor/nodeModifyTable.c:1379 +#: executor/nodeModifyTable.c:1509 executor/nodeModifyTable.c:1583 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "кортеж, який підлягає видаленню, вже змінений в операції, яка викликана поточною командою." -#: executor/nodeModifyTable.c:1583 +#: executor/nodeModifyTable.c:1737 #, c-format msgid "invalid ON UPDATE specification" msgstr "неприпустима специфікація ON UPDATE" -#: executor/nodeModifyTable.c:1584 +#: executor/nodeModifyTable.c:1738 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Результуючий кортеж з'явиться в іншій секції в порівнянні з оригінальним кортежем." -#: executor/nodeModifyTable.c:2183 +#: executor/nodeModifyTable.c:2198 +#, 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:2199 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "Зовнішній ключ вказує на предка \"%s\", але не на кореневого предка \"%s\"." + +#: executor/nodeModifyTable.c:2202 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" -msgstr "Команда ON CONFLICT DO UPDATE не може змінювати рядок вдруге" +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Розгляньте визначення зовнішнього ключа для таблиці \"%s\"." -#: executor/nodeModifyTable.c:2184 +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2548 executor/nodeModifyTable.c:2952 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "команда %s не може вплинути на рядок вдруге" + +#: executor/nodeModifyTable.c:2550 #, 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:2954 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Переконайтесь, що не більше ніж один вихідний рядок відповідає будь-якому одному цільовому рядку." + +#: executor/nodeModifyTable.c:3035 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "кортеж, який підлягає видаленню, вже переміщено в іншу секцію в результаті паралельного оновлення" + +#: executor/nodeModifyTable.c:3074 +#, 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" @@ -12635,104 +13431,104 @@ msgstr "у стовпці \"%s\" не допускається null" msgid "moving-aggregate transition function must not return null" msgstr "функція переходу рухомого агрегату не повинна вертати Null-значення" -#: executor/nodeWindowAgg.c:2059 +#: executor/nodeWindowAgg.c:2081 #, c-format msgid "frame starting offset must not be null" msgstr "зсув початку рамки не повинен бути null" -#: executor/nodeWindowAgg.c:2072 +#: executor/nodeWindowAgg.c:2094 #, c-format msgid "frame starting offset must not be negative" msgstr "зсув початку рамки не повинен бути негативним" -#: executor/nodeWindowAgg.c:2084 +#: executor/nodeWindowAgg.c:2106 #, c-format msgid "frame ending offset must not be null" msgstr "зсув кінця рамки не повинен бути null" -#: executor/nodeWindowAgg.c:2097 +#: executor/nodeWindowAgg.c:2119 #, c-format msgid "frame ending offset must not be negative" msgstr "зсув кінця рамки не повинен бути негативним" -#: executor/nodeWindowAgg.c:2761 +#: executor/nodeWindowAgg.c:2907 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "агрегатна функція %s не підтримує використання в якості віконної функції" -#: executor/spi.c:241 executor/spi.c:341 +#: executor/spi.c:242 executor/spi.c:342 #, c-format msgid "invalid transaction termination" msgstr "неприпустиме завершення транзакції" -#: executor/spi.c:256 +#: executor/spi.c:257 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "неможливо затвердити, коли підтранзакції активні" -#: executor/spi.c:347 +#: executor/spi.c:348 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "неможливо відкотити, коли підтранзакції активні" -#: executor/spi.c:482 +#: executor/spi.c:472 #, c-format msgid "transaction left non-empty SPI stack" msgstr "транзакція залишила непорожню групу SPI" -#: executor/spi.c:483 executor/spi.c:543 +#: executor/spi.c:473 executor/spi.c:533 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Перевірте наявність виклику \"SPI_finish\"." -#: executor/spi.c:542 +#: executor/spi.c:532 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "підтранзакція залишила непорожню групу SPI" -#: executor/spi.c:1610 +#: 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:1620 +#: executor/spi.c:1610 #, c-format msgid "cannot open %s query as cursor" msgstr "неможливо відкрити запит %s як курсор" -#: executor/spi.c:1726 +#: 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:1727 parser/analyze.c:2815 +#: executor/spi.c:1717 parser/analyze.c:2899 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Курсори з прокручуванням повинні бути READ ONLY." -#: executor/spi.c:2482 +#: executor/spi.c:2474 #, c-format msgid "empty query does not return tuples" msgstr "пустий запит не повертає кортежі" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2556 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "%s запит не повертає кортежі" -#: executor/spi.c:2968 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL вираз \"%s\"" -#: executor/spi.c:2973 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL присвоєння \"%s\"" -#: executor/spi.c:2976 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор \"%s\"" @@ -12742,604 +13538,609 @@ 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" -#: lib/dshash.c:246 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 +#: foreign/foreign.c:642 +#, c-format +msgid "There are no valid options in this context." +msgstr "У цьому контексті немає припустимих варіантів." + +#: lib/dshash.c:254 utils/mmgr/dsa.c:703 utils/mmgr/dsa.c:725 #: utils/mmgr/dsa.c:806 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Не вдалося виконати запит DSA розміру %zu." -#: libpq/auth-scram.c:249 +#: 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: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 "неприпустимий секрет SCRAM для користувача \"%s\"" -#: libpq/auth-scram.c:281 +#: libpq/auth-scram.c:290 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Користувач \"%s\" не має припустимого секрету SCRAM." -#: 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 "неправильне повідомлення SCRAM" -#: libpq/auth-scram.c:360 +#: libpq/auth-scram.c:369 #, c-format msgid "The message is empty." msgstr "Повідомлення порожнє." -#: libpq/auth-scram.c:365 +#: libpq/auth-scram.c:374 #, c-format msgid "Message length does not match input length." msgstr "Довжина повідомлення не відповідає довжині вводу." -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:406 #, c-format msgid "invalid SCRAM response" msgstr "неприпустима відповідь SCRAM" -#: libpq/auth-scram.c:398 +#: libpq/auth-scram.c:407 #, c-format msgid "Nonce does not match." msgstr "Одноразовий ідентифікатор не збігається." -#: libpq/auth-scram.c:472 +#: libpq/auth-scram.c:483 #, c-format msgid "could not generate random salt" msgstr "не вдалося згенерувати випадкову сіль" -#: libpq/auth-scram.c:702 +#: libpq/auth-scram.c:715 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Очікувався атрибут \"%c\", але знайдено \"%s\"." -#: 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 "Очікувався символ \"=\" для атрибуту \"%c\"." -#: libpq/auth-scram.c:815 +#: libpq/auth-scram.c:828 #, c-format msgid "Attribute expected, but found end of string." msgstr "Очікувався атрибут, але знайдено кінець рядка." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:841 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Очікувався атрибут, але знайдено неприпустимий символ \"%s\"." -#: 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 "Клієнт обрав алгоритм SCRAM-SHA-256-PLUS, але повідомлення SCRAM не містить даних зв’язування каналів." -#: 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 "Очікувалась кома, але знайдено символ \"%s\"." -#: libpq/auth-scram.c:974 +#: libpq/auth-scram.c:987 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Помилка узгодження зв’язування каналів SCRAM" -#: 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 "Клієнт підтримує зв’язування каналів SCRAM, але думає, що сервер не підтримує. Однак, сервер теж підтримує зв’язування каналів." -#: 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 "Клієнт обрав алгоритм SCRAM-SHA-256 без зв’язування каналів, але повідомлення SCRAM містить дані зв’язування каналів." -#: libpq/auth-scram.c:1008 +#: libpq/auth-scram.c:1021 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "непідтримуваний тип зв'язування каналів SCRAM \"%s\"" -#: libpq/auth-scram.c:1015 +#: libpq/auth-scram.c:1028 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Неочікувана позначка зв'язування каналів \"%s\"." -#: libpq/auth-scram.c:1025 +#: libpq/auth-scram.c:1038 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клієнт використовує ідентифікатор для авторизації, але це не підтримується" -#: libpq/auth-scram.c:1030 +#: libpq/auth-scram.c:1043 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Неочікуваний атрибут \"%s\" у першому повідомленні клієнта." -#: libpq/auth-scram.c:1046 +#: libpq/auth-scram.c:1059 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клієнт потребує непідтримуване розширення SCRAM" -#: libpq/auth-scram.c:1060 +#: libpq/auth-scram.c:1073 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "недруковані символи в одноразовому ідентифікаторі SCRAM" -#: libpq/auth-scram.c:1188 +#: libpq/auth-scram.c:1203 #, c-format msgid "could not generate random nonce" msgstr "не вдалося згенерувати випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1198 +#: libpq/auth-scram.c:1213 #, c-format msgid "could not encode random nonce" msgstr "не вдалося кодувати випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1304 +#: libpq/auth-scram.c:1319 #, c-format msgid "SCRAM channel binding check failed" msgstr "Помилка перевірки зв'язування каналів SCRAM" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1337 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "неочікуваний атрибут зв'язування каналів SCRAM в останньому повідомленні клієнта" -#: libpq/auth-scram.c:1341 +#: libpq/auth-scram.c:1356 #, c-format msgid "Malformed proof in client-final-message." msgstr "Неправильне підтвердження в останньому повідомленні клієнта." -#: libpq/auth-scram.c:1349 +#: libpq/auth-scram.c:1364 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Сміття знайдено в кінці останнього повідомлення клієнта." -#: libpq/auth.c:284 +#: libpq/auth.c:275 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "користувач \"%s\" не пройшов автентифікацію: відхилений хост" -#: libpq/auth.c:287 +#: libpq/auth.c:278 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію \"trust\"" -#: libpq/auth.c:290 +#: libpq/auth.c:281 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію Ident" -#: libpq/auth.c:293 +#: libpq/auth.c:284 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію Peer" -#: libpq/auth.c:298 +#: libpq/auth.c:289 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію за допомогою пароля" -#: libpq/auth.c:303 +#: libpq/auth.c:294 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію GSSAPI" -#: libpq/auth.c:306 +#: libpq/auth.c:297 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію SSPI" -#: libpq/auth.c:309 +#: libpq/auth.c:300 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію PAM" -#: libpq/auth.c:312 +#: libpq/auth.c:303 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію BSD" -#: libpq/auth.c:315 +#: libpq/auth.c:306 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію LDAP" -#: libpq/auth.c:318 +#: libpq/auth.c:309 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "користувач \"%s\" не пройшов автентифікацію за сертифікатом" -#: libpq/auth.c:321 +#: libpq/auth.c:312 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "Користувач \"%s\" не пройшов автентифікацію RADIUS" -#: libpq/auth.c:324 +#: libpq/auth.c:315 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "користувач \"%s\" не пройшов автентифікацію: неприпустимий метод автентифікації" -#: libpq/auth.c:328 +#: libpq/auth.c:319 #, c-format msgid "Connection matched pg_hba.conf line %d: \"%s\"" msgstr "З'єднання відповідає рядку %d в pg_hba.conf: \"%s\"" -#: libpq/auth.c:371 +#: libpq/auth.c:362 #, c-format msgid "authentication identifier set more than once" msgstr "ідентифікатор автентифікації встановлено більш ніж один раз" -#: libpq/auth.c:372 +#: libpq/auth.c:363 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "попередній ідентифікатор: \"%s\"; новий ідентифікатор: \"%s\"" -#: libpq/auth.c:381 +#: libpq/auth.c:372 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "підключення автентифіковано: ідентифікатор=\"%s\" метод=%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 "сертифікати клієнтів можуть перевірятися, лише якщо доступне сховище кореневих сертифікатів" -#: libpq/auth.c:431 +#: libpq/auth.c:422 #, c-format msgid "connection requires a valid client certificate" msgstr "підключення потребує припустимий сертифікат клієнта" -#: libpq/auth.c:462 libpq/auth.c:508 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "GSS encryption" msgstr "Шифрування GSS" -#: libpq/auth.c:465 libpq/auth.c:511 +#: libpq/auth.c:456 libpq/auth.c:502 msgid "SSL encryption" msgstr "Шифрування SSL" -#: libpq/auth.c:467 libpq/auth.c:513 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "no encryption" msgstr "без шифрування" #. 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 відхиляє підключення реплікації для хосту \"%s\", користувача \"%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 відхиляє підключення для хосту \"%s\", користувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:518 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "IP-адреса клієнта дозволяється в \"%s\", відповідає прямому перетворенню." -#: libpq/auth.c:521 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "IP-адреса клієнта дозволяється в \"%s\", пряме перетворення не перевірялося." -#: libpq/auth.c:524 +#: libpq/auth.c:515 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "IP-адреса клієнта дозволяється в \"%s\", не відповідає прямому перетворенню." -#: libpq/auth.c:527 +#: 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:532 +#: libpq/auth.c:523 #, 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:540 +#: 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" #. 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 "в pg_hba.conf немає запису для хосту \"%s\", користувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:721 +#: libpq/auth.c:712 #, c-format msgid "expected password response, got message type %d" msgstr "очікувалася відповід з паролем, але отримано тип повідомлення %d" -#: libpq/auth.c:742 +#: libpq/auth.c:733 #, c-format msgid "invalid password packet size" msgstr "неприпустимий розмір пакету з паролем" -#: libpq/auth.c:760 +#: libpq/auth.c:751 #, c-format msgid "empty password returned by client" msgstr "клієнт повернув пустий пароль" -#: 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 не підтримується, коли увімкнуто режим \"db_user_namespace\"" -#: libpq/auth.c:893 +#: libpq/auth.c:886 #, c-format msgid "could not generate random MD5 salt" msgstr "не вдалося створити випадкову сіль для MD5" -#: libpq/auth.c:959 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "очікувалася відповідь SASL, але отримано тип повідомлення %d" - -#: 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 "не вдалося встановити середовище: %m" -#: libpq/auth.c:1124 +#: libpq/auth.c:971 #, c-format msgid "expected GSS response, got message type %d" msgstr "очікувалася відповідь GSS, але отримано тип повідомлення %d" -#: libpq/auth.c:1184 +#: libpq/auth.c:1031 msgid "accepting GSS security context failed" msgstr "прийняти контекст безпеки GSS не вдалось" -#: libpq/auth.c:1225 +#: libpq/auth.c:1072 msgid "retrieving GSS user name failed" msgstr "отримання ім'я користувача GSS не виконано" -#: 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:1678 libpq/auth.c:1697 +#: libpq/auth.c:1525 libpq/auth.c:1544 #, c-format msgid "could not translate name" msgstr "не вдалося перекласти ім'я" -#: libpq/auth.c:1710 +#: libpq/auth.c:1557 #, c-format msgid "realm name too long" msgstr "ім'я області дуже довге" -#: libpq/auth.c:1725 +#: libpq/auth.c:1572 #, c-format msgid "translated account name too long" msgstr "ім'я перекладеного облікового запису дуже довге" -#: libpq/auth.c:1906 +#: libpq/auth.c:1753 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не вдалося створити сокет для підключення до серверу Ident: %m" -#: libpq/auth.c:1921 +#: libpq/auth.c:1768 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не вдалося прив'язатися до локальної адреси \"%s\": %m" -#: libpq/auth.c:1933 +#: libpq/auth.c:1780 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не вдалося підключитися до Ident-серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1955 +#: libpq/auth.c:1802 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "не вдалося надіслати запит до Ident -серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1972 +#: libpq/auth.c:1819 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "не вдалося отримати відповідь від Ident-серверу за адресою \"%s\", порт %s: %m" -#: libpq/auth.c:1982 +#: libpq/auth.c:1829 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неприпустимо форматована відповідь від Ident-серверу: \"%s\"" -#: libpq/auth.c:2035 +#: libpq/auth.c:1882 #, c-format msgid "peer authentication is not supported on this platform" msgstr "автентифікація peer не підтримується на цій платформі" -#: libpq/auth.c:2039 +#: libpq/auth.c:1886 #, c-format msgid "could not get peer credentials: %m" msgstr "не вдалося отримати облікові дані користувача через peer: %m" -#: libpq/auth.c:2051 +#: libpq/auth.c:1898 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "не вдалося знайти локального користувача за ідентифікатором (%ld): %s" -#: libpq/auth.c:2152 +#: libpq/auth.c:1999 #, c-format msgid "error from underlying PAM layer: %s" msgstr "помилка у нижчому шарі PAM: %s" -#: libpq/auth.c:2163 +#: libpq/auth.c:2010 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "непідтримувана розмова PAM %d/\"%s\"" -#: libpq/auth.c:2223 +#: libpq/auth.c:2070 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не вдалося створити автентифікатор PAM: %s" -#: libpq/auth.c:2234 +#: libpq/auth.c:2081 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "помилка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2266 +#: libpq/auth.c:2113 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "помилка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2278 +#: libpq/auth.c:2125 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "помилка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2291 +#: libpq/auth.c:2138 #, c-format msgid "pam_authenticate failed: %s" msgstr "помилка в pam_authenticate: %sв" -#: libpq/auth.c:2304 +#: libpq/auth.c:2151 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "помилка в pam_acct_mgmt: %s" -#: libpq/auth.c:2315 +#: libpq/auth.c:2162 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не вдалося вивільнити автентифікатор PAM: %s" -#: libpq/auth.c:2395 +#: libpq/auth.c:2242 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не вдалося ініціалізувати протокол LDAP: код помилки %d" -#: libpq/auth.c:2432 +#: libpq/auth.c:2279 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не вдалося отримати назву домена з ldapbasedn" -#: libpq/auth.c:2440 +#: libpq/auth.c:2287 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "Автентифікація LDAP не змогла знайти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2442 +#: libpq/auth.c:2289 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Встановіть назву сервера LDAP, явно." -#: libpq/auth.c:2494 +#: libpq/auth.c:2341 #, c-format msgid "could not initialize LDAP: %s" msgstr "не вдалося ініціалізувати протокол LDAP: %s" -#: libpq/auth.c:2504 +#: libpq/auth.c:2351 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps з поточною бібліотекою LDAP не підтримується" -#: libpq/auth.c:2512 +#: libpq/auth.c:2359 #, c-format msgid "could not initialize LDAP: %m" msgstr "не вдалося ініціалізувати протокол LDAP: %m" -#: libpq/auth.c:2522 +#: libpq/auth.c:2369 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не вдалося встановити версію протоколу LDAP: %s" -#: libpq/auth.c:2562 +#: libpq/auth.c:2409 #, 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:2563 +#: libpq/auth.c:2410 #, c-format msgid "LDAP over SSL is not supported on this platform." msgstr "Протокол LDAP через протокол SSL не підтримується на цій платформі." -#: libpq/auth.c:2579 +#: libpq/auth.c:2426 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не вдалося почати сеанс протоколу LDAP TLS: %s" -#: libpq/auth.c:2650 +#: libpq/auth.c:2497 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "Сервер LDAP не вказаний, і не ldapbasedn" -#: libpq/auth.c:2657 +#: libpq/auth.c:2504 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не вказаний" -#: libpq/auth.c:2719 +#: libpq/auth.c:2566 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "неприпустимий символ в імені користувача для автентифікації LDAP" -#: libpq/auth.c:2736 +#: libpq/auth.c:2583 #, 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:2765 +#: libpq/auth.c:2612 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "не вдалося виконати LDAP-пошук за фільтром \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2779 +#: libpq/auth.c:2626 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-користувач \"%s\" не існує" -#: libpq/auth.c:2780 +#: libpq/auth.c:2627 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" не повернув записів." -#: libpq/auth.c:2784 +#: libpq/auth.c:2631 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-користувач \"%s\" не унікальний" -#: libpq/auth.c:2785 +#: 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." @@ -13348,137 +14149,137 @@ msgstr[1] "LDAP-пошук за фільтром \"%s\" на сервері \"%s msgstr[2] "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" повернув %d записів." msgstr[3] "LDAP-пошук за фільтром \"%s\" на сервері \"%s\" повернув %d записів." -#: libpq/auth.c:2805 +#: libpq/auth.c:2652 #, 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:2826 +#: libpq/auth.c:2673 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "не вдалося відв'язатись після пошуку користувача \"%s\" на сервері \"%s\"" -#: libpq/auth.c:2857 +#: libpq/auth.c:2704 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "Помилка під час реєстрації в протоколі LDAP користувача \"%s\" на сервері \"%s\": %s" -#: libpq/auth.c:2889 +#: libpq/auth.c:2736 #, c-format msgid "LDAP diagnostics: %s" msgstr "Діагностика LDAP: %s" -#: libpq/auth.c:2927 +#: libpq/auth.c:2774 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "помилка автентифікації сертифіката для користувача \"%s\": сертифікат клієнта не містить імені користувача" -#: libpq/auth.c:2948 +#: libpq/auth.c:2795 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "помилка автентифікації сертифікату для користувача \"%s\": не вдалося отримати DN суб'єкта" -#: libpq/auth.c:2971 +#: libpq/auth.c:2818 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "помилка перевірки сертифікату (clientcert=verify-full) для користувача \"%s\": DN невідповідність" -#: libpq/auth.c:2976 +#: libpq/auth.c:2823 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "помилка перевірки сертифікату (clientcert=verify-full) для користувача \"%s\": CN невідповідність" -#: libpq/auth.c:3078 +#: libpq/auth.c:2925 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не вказаний" -#: libpq/auth.c:3085 +#: libpq/auth.c:2932 #, c-format msgid "RADIUS secret not specified" msgstr "Секрет RADIUS не вказаний" -#: libpq/auth.c:3099 +#: libpq/auth.c:2946 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "Автентифікація RADIUS не підтримує паролі довші ніж %d символів" -#: libpq/auth.c:3206 libpq/hba.c:2008 +#: 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:3220 +#: libpq/auth.c:3067 #, c-format msgid "could not generate random encryption vector" msgstr "не вдалося створити випадковий вектор шифрування" -#: libpq/auth.c:3254 +#: 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:3280 +#: libpq/auth.c:3131 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не вдалося створити сокет RADIUS: %m" -#: libpq/auth.c:3302 +#: libpq/auth.c:3153 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не вдалося прив'язатися до локального сокету RADIUS: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3163 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не вдалося відправити пакет RADIUS: %m" -#: libpq/auth.c:3345 libpq/auth.c:3371 +#: libpq/auth.c:3197 libpq/auth.c:3223 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "перевищено час очікування відповіді RADIUS від %s" -#: libpq/auth.c:3364 +#: libpq/auth.c:3216 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не вдалося перевірити статус сокету RADIUS: %m" -#: libpq/auth.c:3394 +#: libpq/auth.c:3246 #, c-format msgid "could not read RADIUS response: %m" msgstr "не вдалося прочитати відповідь RADIUS: %m" -#: libpq/auth.c:3407 libpq/auth.c:3411 +#: libpq/auth.c:3259 libpq/auth.c:3263 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "Відповідь RADIUS від %s була відправлена з неправильного порту: %d" -#: libpq/auth.c:3420 +#: libpq/auth.c:3272 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "Занадто коротка відповідь RADIUS від %s: %d" -#: libpq/auth.c:3427 +#: libpq/auth.c:3279 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "У відповіді RADIUS від %s покшоджена довжина: %d (фактична довжина %d)" -#: libpq/auth.c:3435 +#: libpq/auth.c:3287 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "Прийшла відповідь RADIUS від %s на інший запит: %d (очікувалася %d)" -#: libpq/auth.c:3460 +#: 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:3469 +#: libpq/auth.c:3322 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "Відповідь RADIUS від %s має неправильний підпис MD5" -#: libpq/auth.c:3487 +#: libpq/auth.c:3340 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "Відповідь RADIUS від %s має неприпустимий код (%d) для користувача \"%s\"" @@ -13535,8 +14336,8 @@ msgstr "не вдалося написати файл сервера \"%s\": %m" msgid "large object read request is too large" msgstr "запит на читання великого об'єкту має завеликий розмір" -#: libpq/be-fsstubs.c:800 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 "запитувана довжина не може бути негативною" @@ -13583,16 +14384,16 @@ msgstr "до файлу закритого ключа \"%s\" мають дост 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:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "помилка при згортанні GSSAPI" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "вихідне повідомлення GSSAPI не буде використовувати конфіденційність" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:622 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "сервер намагався надіслати переповнений пакет GSSAPI (%zu > %zu)" @@ -13624,203 +14425,203 @@ msgstr "не вдалося прийняти контекст безпеки GSS msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: libpq/be-secure-openssl.c:115 +#: libpq/be-secure-openssl.c:122 #, c-format msgid "could not create SSL context: %s" msgstr "не вдалося створити контекст SSL: %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 "не вдалося завантажити сертифікат серверу \"%s\": %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 "файл закритого ключа \"%s\" не можна перезавантажити, тому що це потребує парольну фразу" -#: libpq/be-secure-openssl.c:166 +#: libpq/be-secure-openssl.c:173 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не вдалось завантажити файл закритого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:175 +#: libpq/be-secure-openssl.c:182 #, 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: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\" налаштування \"%s\" не підтримується цією збіркою" -#: libpq/be-secure-openssl.c:198 +#: libpq/be-secure-openssl.c:205 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не вдалося встановити мінімальну версію протоколу SSL" -#: libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:228 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не вдалося встановити максимальну версію протоколу SSL" -#: libpq/be-secure-openssl.c:237 +#: libpq/be-secure-openssl.c:244 #, c-format msgid "could not set SSL protocol version range" msgstr "не вдалося встановити діапазон версій протоколу SSL" -#: libpq/be-secure-openssl.c:238 +#: libpq/be-secure-openssl.c:245 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" не може бути більше, ніж \"%s\"" -#: 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 "не вдалося встановити список шифрів (немає дійсних шифрів)" -#: libpq/be-secure-openssl.c:295 +#: 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:344 +#: 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:352 +#: 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:360 +#: libpq/be-secure-openssl.c:367 #, 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 +#: 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:429 +#: libpq/be-secure-openssl.c:436 #, c-format msgid "could not initialize SSL connection: %s" msgstr "не вдалося ініціалізувати SSL-підключення: %s" -#: libpq/be-secure-openssl.c:437 +#: libpq/be-secure-openssl.c:444 #, c-format msgid "could not set SSL socket: %s" msgstr "не вдалося встановити SSL-сокет: %s" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:500 #, c-format msgid "could not accept SSL connection: %m" msgstr "не вдалося прийняти SSL-підключення: %m" -#: libpq/be-secure-openssl.c:496 libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:504 libpq/be-secure-openssl.c:557 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не вдалося прийняти SSL-підключення: виявлений EOF" -#: libpq/be-secure-openssl.c:535 +#: libpq/be-secure-openssl.c:543 #, c-format msgid "could not accept SSL connection: %s" msgstr "не вдалося отримати підключення SSL: %s" -#: libpq/be-secure-openssl.c:538 +#: libpq/be-secure-openssl.c:546 #, 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:554 libpq/be-secure-openssl.c:734 -#: libpq/be-secure-openssl.c:798 +#: libpq/be-secure-openssl.c:562 libpq/be-secure-openssl.c:751 +#: libpq/be-secure-openssl.c:821 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нерозпізнаний код помилки SSL: %d" -#: libpq/be-secure-openssl.c:600 +#: libpq/be-secure-openssl.c:608 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Спільне ім'я SSL-сертифікату містить нульовий байт" -#: libpq/be-secure-openssl.c:640 +#: libpq/be-secure-openssl.c:654 #, 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 +#: libpq/be-secure-openssl.c:740 libpq/be-secure-openssl.c:805 #, c-format msgid "SSL error: %s" msgstr "Помилка SSL: %s" -#: libpq/be-secure-openssl.c:964 +#: libpq/be-secure-openssl.c:982 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не вдалося відкрити файл параметрів DH \"%s\": %m" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:994 #, c-format msgid "could not load DH parameters file: %s" msgstr "не вдалося завантажити файл параметрів DH: %s" -#: libpq/be-secure-openssl.c:986 +#: libpq/be-secure-openssl.c:1004 #, c-format msgid "invalid DH parameters: %s" msgstr "неприпустимі параметри DH: %s" -#: libpq/be-secure-openssl.c:995 +#: libpq/be-secure-openssl.c:1013 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неприпустимі параметри DH: р - не штрих" -#: libpq/be-secure-openssl.c:1004 +#: libpq/be-secure-openssl.c:1022 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "неприпустимі параметри DH: немає придатного генератора або безпечного штриха" -#: libpq/be-secure-openssl.c:1165 +#: libpq/be-secure-openssl.c:1183 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: не вдалося завантажити параметри DH" -#: libpq/be-secure-openssl.c:1173 +#: libpq/be-secure-openssl.c:1191 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не вдалося встановити параметри DH: %s" -#: libpq/be-secure-openssl.c:1200 +#: libpq/be-secure-openssl.c:1218 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нерозпізнане ім'я кривої: %s" -#: libpq/be-secure-openssl.c:1209 +#: libpq/be-secure-openssl.c:1227 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не вдалося створити ключ" -#: libpq/be-secure-openssl.c:1237 +#: libpq/be-secure-openssl.c:1255 msgid "no SSL error reported" msgstr "немає повідомлення про помилку SSL" -#: libpq/be-secure-openssl.c:1241 +#: libpq/be-secure-openssl.c:1259 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: libpq/be-secure-openssl.c:1400 +#: libpq/be-secure-openssl.c:1418 #, c-format msgid "could not create BIO" msgstr "неможливо створити BIO" -#: libpq/be-secure-openssl.c:1410 +#: libpq/be-secure-openssl.c:1428 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "не вдалося отримати NID для об'єкту ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1418 +#: libpq/be-secure-openssl.c:1436 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "не вдалося перетворити NID %d в структуру ASN1_OBJECT" @@ -13845,402 +14646,392 @@ 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:241 +#: libpq/hba.c:209 #, c-format msgid "authentication file token too long, skipping: \"%s\"" msgstr "занадто довгий маркер у файлі автентифікації, пропускається: \"%s\"" -#: libpq/hba.c:413 +#: libpq/hba.c:381 #, c-format msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" msgstr "не вдалося відкрити додатковий файл автентифікації \"@%s\" as \"%s\": %m" -#: libpq/hba.c:859 +#: libpq/hba.c:832 #, c-format msgid "error enumerating network interfaces: %m" msgstr "помилка перерахування мережевих інтерфейсів: %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 "параметр автентифікації \"%s\" припустимий лише для способів автентифікації %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: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 +#: 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:228 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "рядок %d файла конфігурації \"%s\"" -#: libpq/hba.c:906 +#: libpq/hba.c:879 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "спосіб автентифікації \"%s\" потребує аргумент \"%s\" для встановлення" -#: libpq/hba.c:934 +#: libpq/hba.c:903 #, c-format msgid "missing entry in file \"%s\" at end of line %d" msgstr "відсутнє введення в файлі \"%s\" в кінці рядка %d" -#: libpq/hba.c:945 +#: libpq/hba.c:915 #, c-format msgid "multiple values in ident field" msgstr "кілька значень в полі ident" -#: libpq/hba.c:994 +#: libpq/hba.c:965 #, c-format msgid "multiple values specified for connection type" msgstr "кілька значень вказано для типу підключення" -#: libpq/hba.c:995 +#: libpq/hba.c:966 #, c-format msgid "Specify exactly one connection type per line." msgstr "Вкажіть в рядку єдиний тип підключення." -#: libpq/hba.c:1009 +#: libpq/hba.c:980 #, c-format msgid "local connections are not supported by this build" msgstr "локальні підключення не підтримуються цією збіркою" -#: libpq/hba.c:1032 +#: libpq/hba.c:1003 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "запис hostssl не збігається, тому що протокол SSL вимкнутий" -#: libpq/hba.c:1033 +#: libpq/hba.c:1004 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Встановіть ssl = on в 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 не збігається, тому що SSL не підтримується цією збіркою" -#: libpq/hba.c:1042 -#, c-format -msgid "Compile with --with-ssl to use SSL connections." -msgstr "Щоб використати SSL-підключення, скомпілюйте з --with-ssl." - -#: 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 не може збігатись, оскільки GSSAPI не підтримується цією збіркою" -#: libpq/hba.c:1055 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "Скомпілюйте з --with-gssapi, щоб використовувати GSSAPI з'єднання." - -#: libpq/hba.c:1075 +#: libpq/hba.c:1044 #, c-format msgid "invalid connection type \"%s\"" msgstr "неприпустимий тип підключення \"%s\"" -#: libpq/hba.c:1089 +#: libpq/hba.c:1058 #, c-format msgid "end-of-line before database specification" msgstr "кінець рядка перед визначенням бази даних" -#: libpq/hba.c:1109 +#: libpq/hba.c:1078 #, c-format msgid "end-of-line before role specification" msgstr "кінець рядка перед визначенням ролі" -#: libpq/hba.c:1131 +#: libpq/hba.c:1100 #, c-format msgid "end-of-line before IP address specification" msgstr "кінець рядка перед визначенням IP-адрес" -#: libpq/hba.c:1142 +#: libpq/hba.c:1111 #, c-format msgid "multiple values specified for host address" msgstr "для адреси хоста вказано кілька значень" -#: libpq/hba.c:1143 +#: libpq/hba.c:1112 #, c-format msgid "Specify one address range per line." msgstr "Вкажіть один діапазон адреси в рядку." -#: libpq/hba.c:1201 +#: libpq/hba.c:1170 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неприпустима IP адреса \"%s\": %s" -#: libpq/hba.c:1221 +#: libpq/hba.c:1190 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "визначити одночасно ім’я хоста і маску CIDR не можна: \"%s\"" -#: libpq/hba.c:1235 +#: libpq/hba.c:1204 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "неприпустима маска CIDR в адресі \"%s\"" -#: libpq/hba.c:1255 +#: libpq/hba.c:1224 #, c-format msgid "end-of-line before netmask specification" msgstr "кінець рядка перед визначенням маски мережі" -#: libpq/hba.c:1256 +#: libpq/hba.c:1225 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Вкажіть діапазон адрес в нотації CIDR або надайте окрему маску мережі." -#: libpq/hba.c:1267 +#: libpq/hba.c:1236 #, c-format msgid "multiple values specified for netmask" msgstr "для маски мережі вказано декілька значень" -#: libpq/hba.c:1281 +#: libpq/hba.c:1250 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "неприпустима маска IP \"%s\": %s" -#: libpq/hba.c:1301 +#: libpq/hba.c:1270 #, c-format msgid "IP address and mask do not match" msgstr "IP-адреса і маска не збігаються" -#: libpq/hba.c:1317 +#: libpq/hba.c:1286 #, c-format msgid "end-of-line before authentication method" msgstr "кінець рядка перед способом автентифікації" -#: libpq/hba.c:1328 +#: libpq/hba.c:1297 #, c-format msgid "multiple values specified for authentication type" msgstr "для типу автентифікації вказано декілька значень" -#: libpq/hba.c:1329 +#: libpq/hba.c:1298 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Вкажіть у рядку єдиний тип автентифікації." -#: libpq/hba.c:1406 +#: libpq/hba.c:1375 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неприпустимий спосіб автентифікації \"%s\"" -#: libpq/hba.c:1419 +#: libpq/hba.c:1388 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "неприпустимий спосіб автентифікації \"%s\": не підтримується цією збіркою" -#: libpq/hba.c:1442 +#: libpq/hba.c:1411 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "автентифікація gssapi для локальних сокетів не підтримується" -#: libpq/hba.c:1454 +#: libpq/hba.c:1423 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "автентифікація peer підтримується лише для локальних сокетів" -#: libpq/hba.c:1472 +#: libpq/hba.c:1441 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "автентифікація cert підтримується лише для підключень hostssl" -#: libpq/hba.c:1522 +#: libpq/hba.c:1491 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр автентифікації вказаний не в форматі ім’я=значення: %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 або ldapurl разом з ldapprefix" -#: libpq/hba.c:1577 +#: 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:1593 +#: libpq/hba.c:1562 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "не можна використовувати ldapsearchattribute разом з ldapsearchfilter" -#: libpq/hba.c:1610 +#: libpq/hba.c:1579 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "список серверів RADIUS не може бути порожнім" -#: libpq/hba.c:1621 +#: libpq/hba.c:1590 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "список секретів RADIUS не може бути порожнім" -#: 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 "кількість секретів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" -#: 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 "кількість портів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" -#: 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 "кількість ідентифікаторів RADIUS (%d) повинна бути 1 або дорівнювати кількості серверів RADIUS (%d)" -#: libpq/hba.c:1721 +#: libpq/hba.c:1690 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi і cert" -#: libpq/hba.c:1730 +#: libpq/hba.c:1699 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert може бути налаштовано лише для рядків \"hostssl\"" -#: libpq/hba.c:1747 +#: libpq/hba.c:1716 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert приймає лише \"verify-full\" під час використання автентифікації \"cert\"" -#: libpq/hba.c:1760 +#: libpq/hba.c:1729 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неприпустиме значення для clientcert: \"%s\"" -#: libpq/hba.c:1772 +#: libpq/hba.c:1741 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname можна налаштувати лише для рядків \"hostssl\"" -#: libpq/hba.c:1791 +#: libpq/hba.c:1760 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "неприпустиме значення для clientname: \"%s\"" -#: libpq/hba.c:1825 +#: libpq/hba.c:1793 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не вдалося аналізувати URL-адресу LDAP \"%s\": %s" -#: libpq/hba.c:1836 +#: libpq/hba.c:1804 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "непідтримувана схема в URL-адресі LDAP: %s" -#: libpq/hba.c:1860 +#: libpq/hba.c:1828 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреса LDAP не підтримується на цій платформі" -#: libpq/hba.c:1878 +#: libpq/hba.c:1846 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "недійсне значення ldapscheme: \"%s\"" -#: libpq/hba.c:1896 +#: libpq/hba.c:1864 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "недійсний номер порту LDAP: \"%s\"" -#: libpq/hba.c:1942 libpq/hba.c:1949 +#: libpq/hba.c:1910 libpq/hba.c:1917 msgid "gssapi and sspi" msgstr "gssapi і sspi" -#: libpq/hba.c:1958 libpq/hba.c:1967 +#: libpq/hba.c:1926 libpq/hba.c:1935 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1989 +#: libpq/hba.c:1957 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не вдалося проаналізувати список серверів RADIUS \"%s\"" -#: libpq/hba.c:2037 +#: libpq/hba.c:2005 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не вдалося проаналізувати список портів RADIUS \"%s\"" -#: libpq/hba.c:2051 +#: libpq/hba.c:2019 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "недійсний номер порту RADIUS: \"%s\"" -#: libpq/hba.c:2073 +#: libpq/hba.c:2041 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не вдалося проаналізувати список секретів RADIUS \"%s\"" -#: libpq/hba.c:2095 +#: libpq/hba.c:2063 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не вдалося проаналізувати список ідентифікаторів RADIUS \"%s\"" -#: libpq/hba.c:2109 +#: libpq/hba.c:2077 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нерозпізнане ім’я параметра автентифікації: \"%s\"" -#: libpq/hba.c:2255 libpq/hba.c:2669 guc-file.l:632 +#: libpq/hba.c:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "не вдалося відкрити файл конфігурації \"%s\": %m" -#: libpq/hba.c:2306 +#: libpq/hba.c:2274 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфігурації \"%s\" не містить елементів" -#: libpq/hba.c:2824 +#: libpq/hba.c:2374 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "недійсний регулярний вираз \"%s\": %s" -#: libpq/hba.c:2884 +#: libpq/hba.c:2437 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "помилка при пошуку за регулярним виразом для \"%s\": %s" -#: libpq/hba.c:2903 +#: 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:2999 +#: 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:3019 +#: libpq/hba.c:2572 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "немає відповідності у файлі зіставлень \"%s\" для користувача \"%s\" автентифікованого як \"%s\"" -#: libpq/hba.c:3052 +#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 #, c-format msgid "could not open usermap file \"%s\": %m" msgstr "не вдалося відкрити файл usermap: \"%s\": %m" @@ -14353,10 +15144,9 @@ msgid "could not accept new connection: %m" msgstr "не вдалось прийняти нове підключення: %m" #: 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 +#: libpq/pqcomm.c:1652 libpq/pqcomm.c:1697 libpq/pqcomm.c:1737 +#: libpq/pqcomm.c:1781 libpq/pqcomm.c:1820 libpq/pqcomm.c:1859 +#: libpq/pqcomm.c:1895 libpq/pqcomm.c:1934 #, c-format msgid "%s(%s) failed: %m" msgstr "%s(%s) помилка: %m" @@ -14366,63 +15156,58 @@ msgstr "%s(%s) помилка: %m" msgid "there is no client connection" msgstr "немає клієнтського підключення" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:977 libpq/pqcomm.c:1078 #, c-format msgid "could not receive data from client: %m" msgstr "не вдалось отримати дані від клієнта: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4316 +#: libpq/pqcomm.c:1183 tcop/postgres.c:4373 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "завершення підключення через втрату синхронізації протоколу" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1249 #, c-format msgid "unexpected EOF within message length word" msgstr "неочікуваний EOF в слові довжини повідомлення" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1259 #, c-format msgid "invalid message length" msgstr "неприпустима довжина повідомлення" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1281 libpq/pqcomm.c:1294 #, c-format msgid "incomplete message from client" msgstr "неповне повідомлення від клієнта" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1405 #, c-format msgid "could not send data to client: %m" msgstr "не вдалось надіслати дані клієнту: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1620 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) помилка: код помилки %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1709 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "встановлення часу простою keepalive не підтримується" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1793 libpq/pqcomm.c:1868 libpq/pqcomm.c:1943 #, 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:1482 utils/adt/rowtypes.c:588 +#: utils/adt/arrayfuncs.c:1483 utils/adt/rowtypes.c:588 #, c-format msgid "insufficient data left in message" msgstr "недостатьно даних залишилось в повідомленні" @@ -14437,225 +15222,225 @@ 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\n" msgstr "%s - сервер PostgreSQL.\n\n" -#: main/main.c:310 +#: main/main.c:351 #, c-format msgid "Usage:\n" " %s [OPTION]...\n\n" msgstr "Використання:\n" " %s [OPTION]...\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" -#: main/main.c:313 +#: main/main.c:354 #, c-format msgid " -c NAME=VALUE set run-time parameter\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" -#: main/main.c:315 +#: main/main.c:356 #, c-format msgid " -d 1-5 debugging level\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" -#: main/main.c:317 +#: main/main.c:358 #, c-format msgid " -e use European date input format (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" -#: 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" -#: main/main.c:320 +#: main/main.c:361 #, c-format msgid " -i enable TCP/IP connections\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" -#: main/main.c:323 +#: main/main.c:364 #, c-format msgid " -l enable SSL connections\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" -#: main/main.c:326 +#: main/main.c:367 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT номер порту для прослуховування\n" -#: main/main.c:327 +#: main/main.c:368 #, c-format msgid " -s show statistics after each query\n" msgstr " -s відображувати статистику після кожного запиту\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 WORK-MEM вказати обсяг пам'яті для сортування (в КБ)\n" -#: main/main.c:329 +#: main/main.c:370 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: main/main.c:330 +#: main/main.c:371 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE встановити параметр під час виконання\n" -#: main/main.c:331 +#: main/main.c:372 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config описати параметри конфігурації і вийти\n" -#: main/main.c:332 +#: main/main.c:373 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку і вийти\n" -#: main/main.c:334 +#: main/main.c:375 #, c-format msgid "\n" "Developer options:\n" msgstr "\n" "Параметри для розробників:\n" -#: main/main.c:335 +#: main/main.c:376 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h заборонити використовувати деякі типи плану\n" -#: main/main.c:336 +#: main/main.c:377 #, c-format msgid " -n do not reinitialize shared memory after abnormal exit\n" msgstr " -n не повторювати ініціалізацію спільної пам'яті після ненормального виходу\n" -#: main/main.c:337 +#: main/main.c:378 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O дозволити змінювати структуру системних таблиць\n" -#: main/main.c:338 +#: main/main.c:379 #, c-format msgid " -P disable system indexes\n" msgstr " -P вимкнути системні індекси\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 показувати час після кожного запиту\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 усім внутрішнім процесам, якщо один вимкнеться\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 NUM очікувати NUM секунд, щоб дозволити підключення від налагоджувача\n" -#: main/main.c:343 +#: main/main.c:384 #, c-format msgid "\n" "Options for single-user mode:\n" msgstr "\n" "Параметри для однокористувацького режиму:\n" -#: main/main.c:344 +#: main/main.c:385 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single установка однокористувацького режиму (цей аргумент повинен бути першим)\n" -#: main/main.c:345 +#: main/main.c:386 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME ім’я бази даних (за замовчуванням - ім'я користувача)\n" -#: main/main.c:346 +#: main/main.c:387 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 змінити рівень налагодження\n" -#: main/main.c:347 +#: main/main.c:388 #, c-format msgid " -E echo statement before execution\n" msgstr " -E інструкція відлуння перед виконанням\n" -#: main/main.c:348 +#: main/main.c:389 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j не використовувати новий рядок як роздільник інтерактивних запитів\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 FILENAME надіслати stdout і stderr до вказаного файлу\n" -#: main/main.c:351 +#: main/main.c:392 #, c-format msgid "\n" "Options for bootstrapping mode:\n" msgstr "\n" "Параметри для режиму початкового завантаження:\n" -#: main/main.c:352 +#: main/main.c:393 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot установка режиму початкового завантаження (цей аргумент повинен бути першим)\n" -#: main/main.c:353 +#: 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:355 +#: 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:357 +#: main/main.c:398 #, c-format msgid "\n" "Please read the documentation for the complete list of run-time\n" @@ -14666,12 +15451,12 @@ msgstr "\n" "Будь-ласка прочитайте інструкцію для повного списку параметрів конфігурації виконання і їх встановлення у командний рядок або в файл конфігурації.\n\n" "Про помилки повідомляйте <%s>.\n" -#: main/main.c:361 +#: main/main.c:402 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: main/main.c:372 +#: main/main.c:413 #, 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" @@ -14680,12 +15465,12 @@ msgid "\"root\" execution of the PostgreSQL server is not permitted.\n" msgstr "Запускати сервер PostgreSQL під іменем \"root\" не дозволено.\n" "Для запобігання компрометації системи безпеки сервер повинен запускати непривілейований користувач. Дивіться документацію, щоб дізнатися більше про те, як правильно запустити сервер.\n" -#: main/main.c:389 +#: main/main.c:430 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: дійсний і ефективний ID користувача повинні збігатися\n" -#: main/main.c:396 +#: main/main.c:437 #, c-format msgid "Execution of PostgreSQL by a user with administrative permissions is not\n" "permitted.\n" @@ -14705,15 +15490,15 @@ msgstr "розширений тип вузла \"%s\" вже існує" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "Методи розширеного вузла \"%s\" не зареєстровані" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2346 +#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 #, 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:592 +#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:670 #, c-format msgid "could not find array type for data type %s" msgstr "не вдалося знайти тип масиву для типу даних %s" @@ -14733,6 +15518,12 @@ msgstr "портал без імені з параметрами: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN підтримується лише з умовами, які допускають з'єднання злиттям або хеш-з'єднанням" +#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "не можна виконати MERGE для відношення \"%s\"" + #. translator: %s is a SQL row locking clause such as FOR UPDATE #: optimizer/plan/initsplan.c:1192 #, c-format @@ -14740,53 +15531,48 @@ 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:1316 parser/analyze.c:1671 parser/analyze.c:1927 -#: parser/analyze.c:3106 +#: optimizer/plan/planner.c:1344 parser/analyze.c:1752 parser/analyze.c:2008 +#: parser/analyze.c:3190 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несумісно з UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:1979 optimizer/plan/planner.c:3635 +#: optimizer/plan/planner.c:2045 optimizer/plan/planner.c:3702 #, c-format msgid "could not implement GROUP BY" msgstr "не вдалося реалізувати GROUP BY" -#: optimizer/plan/planner.c:1980 optimizer/plan/planner.c:3636 -#: optimizer/plan/planner.c:4393 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2046 optimizer/plan/planner.c:3703 +#: optimizer/plan/planner.c:4346 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:4392 +#: optimizer/plan/planner.c:4345 #, c-format msgid "could not implement DISTINCT" msgstr "не вдалося реалізувати DISTINCT" -#: optimizer/plan/planner.c:5240 +#: optimizer/plan/planner.c:5466 #, c-format msgid "could not implement window PARTITION BY" msgstr "не вдалося реалізувати PARTITION BY для вікна" -#: optimizer/plan/planner.c:5241 +#: optimizer/plan/planner.c:5467 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Стовпці, що розділяють вікна, повинні мати типи даних з можливістю сортування." -#: optimizer/plan/planner.c:5245 +#: optimizer/plan/planner.c:5471 #, c-format msgid "could not implement window ORDER BY" msgstr "не вдалося реалізувати ORDER BY для вікна" -#: optimizer/plan/planner.c:5246 +#: optimizer/plan/planner.c:5472 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Стовпці, що впорядковують вікна, повинні мати типи даних з можливістю сортування." -#: optimizer/plan/setrefs.c:516 -#, c-format -msgid "too many range table entries" -msgstr "дуже багато елементів RTE" - #: optimizer/prep/prepunion.c:509 #, c-format msgid "could not implement recursive UNION" @@ -14803,108 +15589,108 @@ msgstr "Усі стовпці повинні мати типи даних з м msgid "could not implement %s" msgstr "не вдалося реалізувати %s" -#: optimizer/util/clauses.c:4729 +#: optimizer/util/clauses.c:4843 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "Впроваджена в код SQL-функція \"%s\"" -#: optimizer/util/plancat.c:140 +#: optimizer/util/plancat.c:142 #, c-format msgid "cannot open relation \"%s\"" msgstr "неможливо відкрити відношення \"%s\"" -#: optimizer/util/plancat.c:148 +#: optimizer/util/plancat.c:151 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "отримати доступ до тимчасових або нежурнальованих відношень під час відновлення не можна" -#: optimizer/util/plancat.c:688 +#: optimizer/util/plancat.c:691 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "вказівки з посиланням на весь рядок для вибору унікального індексу не підтримуються" -#: optimizer/util/plancat.c:705 +#: optimizer/util/plancat.c:708 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "з обмеженням в реченні ON CONFLICT не пов'язаний індекс" -#: optimizer/util/plancat.c:755 +#: optimizer/util/plancat.c:758 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не підтримується з обмеженнями-винятками" -#: optimizer/util/plancat.c:860 +#: optimizer/util/plancat.c:863 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "немає унікального обмеження або обмеження-виключення відповідного специфікації ON CONFLICT" -#: parser/analyze.c:737 parser/analyze.c:1451 +#: parser/analyze.c:818 parser/analyze.c:1532 #, c-format msgid "VALUES lists must all be the same length" msgstr "Списки VALUES повинні мати однакову довжину" -#: parser/analyze.c:938 +#: parser/analyze.c:1019 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT містить більше виразів, ніж цільових стовпців" -#: parser/analyze.c:956 +#: parser/analyze.c:1037 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT містить більше цільових стовпців, ніж виразів" -#: parser/analyze.c:960 +#: parser/analyze.c:1041 #, 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:1259 parser/analyze.c:1644 +#: parser/analyze.c:1340 parser/analyze.c:1725 #, 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:1574 parser/analyze.c:3317 +#: parser/analyze.c:1655 parser/analyze.c:3401 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s не можна застосовувати до VALUES" -#: parser/analyze.c:1810 +#: parser/analyze.c:1891 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неприпустиме речення UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1811 +#: parser/analyze.c:1892 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Дозволено використання тільки імен стовпців, але не виразів або функцій." -#: parser/analyze.c:1812 +#: parser/analyze.c:1893 #, 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:1917 +#: parser/analyze.c:1998 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO дозволяється додати лише до першого SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1989 +#: parser/analyze.c:2070 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "Учасник інструкції UNION/INTERSECT/EXCEPT не може посилатись на інші відносини на тому ж рівні" -#: parser/analyze.c:2076 +#: parser/analyze.c:2157 #, c-format msgid "each %s query must have the same number of columns" msgstr "кожен %s запит повинен мати однакову кількість стовпців" -#: parser/analyze.c:2477 +#: parser/analyze.c:2561 #, c-format msgid "RETURNING must have at least one column" msgstr "В RETURNING повинен бути мінімум один стовпець" -#: parser/analyze.c:2580 +#: parser/analyze.c:2664 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" @@ -14913,536 +15699,548 @@ msgstr[1] "джерело призначення повернуло %d стов msgstr[2] "джерело призначення повернуло %d стовпців" msgstr[3] "джерело призначення повернуло %d стовпців" -#: parser/analyze.c:2641 +#: parser/analyze.c:2725 #, 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:2765 parser/analyze.c:2773 +#: parser/analyze.c:2849 parser/analyze.c:2857 #, c-format msgid "cannot specify both %s and %s" msgstr "не можна вказати як %s, так і %s" -#: parser/analyze.c:2793 +#: parser/analyze.c:2877 #, 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:2801 +#: parser/analyze.c:2885 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не підтримується" -#: parser/analyze.c:2804 +#: parser/analyze.c:2888 #, 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:2812 +#: parser/analyze.c:2896 #, 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:2823 +#: parser/analyze.c:2907 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s не є припустимим" -#: parser/analyze.c:2826 +#: parser/analyze.c:2910 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Нечутливі курсори повинні бути READ ONLY." -#: parser/analyze.c:2892 +#: parser/analyze.c:2976 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "в матеріалізованих поданнях не повинні використовуватись оператори, які змінюють дані в WITH" -#: parser/analyze.c:2902 +#: parser/analyze.c:2986 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "в матеріалізованих поданнях не повинні використовуватись тимчасові таблиці або подання" -#: parser/analyze.c:2912 +#: parser/analyze.c:2996 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "визначати матеріалізовані подання з зв'язаними параметрами не можна" -#: parser/analyze.c:2924 +#: parser/analyze.c:3008 #, c-format msgid "materialized views cannot be unlogged" msgstr "матеріалізовані подання не можуть бути нежурнальованими" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3113 +#: parser/analyze.c:3197 #, 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:3120 +#: parser/analyze.c:3204 #, 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:3127 +#: parser/analyze.c:3211 #, 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:3134 +#: parser/analyze.c:3218 #, 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:3141 +#: parser/analyze.c:3225 #, 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:3148 +#: parser/analyze.c:3232 #, 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:3240 +#: parser/analyze.c:3324 #, 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:3290 +#: parser/analyze.c:3374 #, 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:3299 +#: parser/analyze.c:3383 #, 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:3308 +#: parser/analyze.c:3392 #, 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:3326 +#: parser/analyze.c:3410 #, 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:3335 +#: parser/analyze.c:3419 #, 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:3355 +#: parser/analyze.c:3439 #, 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:227 +#: parser/parse_agg.c:208 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "для типу %s не вдалося визначити оператора сортування" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:210 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Агрегатним функціям з DISTINCT необхідно сортувати їх вхідні дані." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:268 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING повинно містити меньше, ніж 32 аргумента" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:371 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "агрегатні функції не дозволяються в умовах JOIN" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:373 msgid "grouping operations are not allowed in JOIN conditions" msgstr "операції групування не дозволяються в умовах JOIN" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "агрегатні функції не можна застосовувати в реченні FROM їх рівня запиту" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "операції групування не можна застосовувати в реченні FROM їх рівня запиту" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "агрегатні функції не можна застосовувати у функціях у FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "операції групування не можна застосовувати у функціях у FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "агрегатні функції не можна застосовувати у виразах політики" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "операції групування не можна застосовувати у виразах політики" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "агрегатні функції не можна застосовувати у вікні RANGE " -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "операції групування не можна застосовувати у вікні RANGE" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "агрегатні функції не можна застосовувати у вікні ROWS" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "операції групування не можна застосовувати у вікні ROWS" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "агрегатні функції не можна застосовувати у вікні GROUPS" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "операції групування не можна застосовувати у вікні GROUPS" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:450 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "агрегатні функції не можна застосовувати в умовах MERGE WHEN" + +#: parser/parse_agg.c:452 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "операції групування не можна застосовувати в умовах MERGE WHEN" + +#: parser/parse_agg.c:478 msgid "aggregate functions are not allowed in check constraints" msgstr "агрегатні функції не можна застосовувати в перевірці обмежень" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:480 msgid "grouping operations are not allowed in check constraints" msgstr "операції групування не можна застосовувати в перевірці обмежень" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:487 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "агрегатні функції не можна застосовувати у виразах DEFAULT" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:489 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "операції групування не можна застосовувати у виразах DEFAULT" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:494 msgid "aggregate functions are not allowed in index expressions" msgstr "агрегатні функції не можна застосовувати у виразах індексів" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:496 msgid "grouping operations are not allowed in index expressions" msgstr "операції групування не можна застосовувати у виразах індексів" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:501 msgid "aggregate functions are not allowed in index predicates" msgstr "агрегатні функції не можна застосовувати в предикатах індексів" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:503 msgid "grouping operations are not allowed in index predicates" msgstr "операції групування не можна застосовувати в предикатах індексів" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:508 msgid "aggregate functions are not allowed in statistics expressions" msgstr "агрегатні функції не можна застосовувати у виразах статистики" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:510 msgid "grouping operations are not allowed in statistics expressions" msgstr "операції групування не можна застосовувати у виразах статистики" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:515 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатні функції не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:517 msgid "grouping operations are not allowed in transform expressions" msgstr "операції групування не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:522 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатні функції не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:524 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операції групування не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:529 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатні функції не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:531 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операції групування не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:536 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатні функції не можна застосовувати в границі секції" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:538 msgid "grouping operations are not allowed in partition bound" msgstr "операції групування не можна застосовувати в границі секції" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:543 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатні функції не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:545 msgid "grouping operations are not allowed in partition key expressions" msgstr "операції групування не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:551 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатні функції не можна застосовувати у виразах генерації стовпців" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:553 msgid "grouping operations are not allowed in column generation expressions" msgstr "операції групування не можна застосовувати у виразах генерації стовпців" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:559 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатні функції не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:561 msgid "grouping operations are not allowed in CALL arguments" msgstr "операції групування не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:567 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатні функції не можна застосовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:569 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:578 parser/parse_clause.c:1834 +#: parser/parse_agg.c:596 parser/parse_clause.c:1836 #, 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:581 +#: parser/parse_agg.c:599 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операції групування не можна застосовувати в %s" -#: parser/parse_agg.c:682 +#: parser/parse_agg.c:700 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "агрегат зовнішнього рівня не може містити змінну нижчого рівня у своїх аргументах" -#: parser/parse_agg.c:760 +#: parser/parse_agg.c:778 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "виклики агрегатної функції не можуть містити викликів функції, що повертають множину" -#: parser/parse_agg.c:761 parser/parse_expr.c:1678 parser/parse_expr.c:2159 +#: parser/parse_agg.c:779 parser/parse_expr.c:1674 parser/parse_expr.c:2156 #: 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:766 +#: parser/parse_agg.c:784 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "виклики агрегатних функцій не можуть містити виклики віконних функцій" -#: parser/parse_agg.c:845 +#: parser/parse_agg.c:863 msgid "window functions are not allowed in JOIN conditions" msgstr "віконні функції не можна застосовувати в умовах JOIN" -#: parser/parse_agg.c:852 +#: parser/parse_agg.c:870 msgid "window functions are not allowed in functions in FROM" msgstr "віконні функції не можна застосовувати у функціях в FROM" -#: parser/parse_agg.c:858 +#: parser/parse_agg.c:876 msgid "window functions are not allowed in policy expressions" msgstr "віконні функції не можна застосовувати у виразах політики" -#: parser/parse_agg.c:871 +#: parser/parse_agg.c:889 msgid "window functions are not allowed in window definitions" msgstr "віконні функції не можна застосовувати у визначенні вікна" -#: parser/parse_agg.c:903 +#: parser/parse_agg.c:900 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "віконні функції не можна застосовувати в умовах MERGE WHEN" + +#: parser/parse_agg.c:924 msgid "window functions are not allowed in check constraints" msgstr "віконні функції не можна застосовувати в перевірках обмежень" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:928 msgid "window functions are not allowed in DEFAULT expressions" msgstr "віконні функції не можна застосовувати у виразах DEFAULT" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:931 msgid "window functions are not allowed in index expressions" msgstr "віконні функції не можна застосовувати у виразах індексів" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:934 msgid "window functions are not allowed in statistics expressions" msgstr "віконні функції не можна застосовувати у виразах статистики" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:937 msgid "window functions are not allowed in index predicates" msgstr "віконні функції не можна застосовувати в предикатах індексів" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:940 msgid "window functions are not allowed in transform expressions" msgstr "віконні функції не можна застосовувати у виразах перетворювання" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:943 msgid "window functions are not allowed in EXECUTE parameters" msgstr "віконні функції не можна застосовувати в параметрах EXECUTE" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:946 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "віконні функції не можна застосовувати в умовах WHEN для тригерів" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:949 msgid "window functions are not allowed in partition bound" msgstr "віконні функції не можна застосовувати в границі секції" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:952 msgid "window functions are not allowed in partition key expressions" msgstr "віконні функції не можна застосовувати у виразах ключа секціонування" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:955 msgid "window functions are not allowed in CALL arguments" msgstr "віконні функції не можна застосовувати в аргументах CALL" -#: parser/parse_agg.c:937 +#: parser/parse_agg.c:958 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "віконні функції не можна застосовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:940 +#: parser/parse_agg.c:961 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:963 parser/parse_clause.c:1843 +#: parser/parse_agg.c:984 parser/parse_clause.c:1845 #, c-format msgid "window functions are not allowed in %s" msgstr "віконні функції не можна застосовувати в %s" -#: parser/parse_agg.c:997 parser/parse_clause.c:2677 +#: parser/parse_agg.c:1018 parser/parse_clause.c:2678 #, c-format msgid "window \"%s\" does not exist" msgstr "вікно \"%s\" не існує" -#: parser/parse_agg.c:1081 +#: parser/parse_agg.c:1102 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "забагато наборів групування (максимум 4096)" -#: parser/parse_agg.c:1221 +#: parser/parse_agg.c:1242 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "агрегатні функції не дозволені у рекурсивному терміні рекурсивного запиту" -#: parser/parse_agg.c:1414 +#: parser/parse_agg.c:1435 #, 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:1417 +#: parser/parse_agg.c:1438 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Прямі аргументи сортувального агрегату можуть використовувати лише згруповані стовпці." -#: parser/parse_agg.c:1422 +#: parser/parse_agg.c:1443 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "вкладений запит використовує не згруповані стовпці \"%s.%s\" з зовнішнього запиту" -#: parser/parse_agg.c:1586 +#: parser/parse_agg.c:1607 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "аргументами групування мають бути вирази групування пов'язаного рівня запиту" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:192 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "відношення \"%s\" не може бути метою модифікованої інструкції" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "функції, що повертають множину, мають з'являтися на вищому рівні FROM" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:612 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "кілька списків з визначенням стовпців не дозволені для тої самої функції" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:645 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() з декількома функціями не можуть мати список з визначенням стовпців" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:646 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Укладіть окремі списки з визначенням стовпців для кожної з функцій всередині ROWS FROM()." -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:652 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() з кількома аргументами не можуть мати список з визначенням стовпців" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:653 #, 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:658 +#: parser/parse_clause.c:660 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY не можна використовувати з списком з визначенням стовпців" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:661 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Помістіть список з визначенням стовпців всередину ROWS FROM()." -#: parser/parse_clause.c:759 +#: parser/parse_clause.c:761 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY дозволяється лише для одного стовпця" -#: parser/parse_clause.c:820 +#: parser/parse_clause.c:822 #, c-format msgid "column name \"%s\" is not unique" msgstr "ім'я стовпця \"%s\" не є унікальним" -#: parser/parse_clause.c:862 +#: parser/parse_clause.c:864 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "ім'я простору імен \"%s\" не є унікальним" -#: parser/parse_clause.c:872 +#: parser/parse_clause.c:874 #, c-format msgid "only one default namespace is allowed" msgstr "дозволено тільки один простір імен за замовчуванням" -#: parser/parse_clause.c:932 +#: parser/parse_clause.c:934 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s для отримання вибірки не існує" -#: parser/parse_clause.c:954 +#: 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" @@ -15451,203 +16249,203 @@ msgstr[1] "метод %s для отримання вибірки потребу msgstr[2] "метод %s для отримання вибірки потребує аргументів: %d, отримано: %d" msgstr[3] "метод %s для отримання вибірки потребує аргументів: %d, отримано: %d" -#: parser/parse_clause.c:988 +#: parser/parse_clause.c:990 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s для отримання вибірки не підтримує REPEATABLE" -#: parser/parse_clause.c:1137 +#: parser/parse_clause.c:1139 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "Речення TABLESAMPLE можна застосовувати лише до таблиць або матеріалізованих подань" -#: parser/parse_clause.c:1327 +#: parser/parse_clause.c:1329 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "ім’я стовпця \"%s\" з'являється у реченні USING неодноразово" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1344 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "ім’я спільного стовпця \"%s\" з'являється у таблиці зліва неодноразово" -#: parser/parse_clause.c:1351 +#: parser/parse_clause.c:1353 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблиці зліва не існує стовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1368 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "ім’я спільного стовпця \"%s\" з'являється в таблиці справа неодноразово" -#: parser/parse_clause.c:1375 +#: parser/parse_clause.c:1377 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблиці справа не існує стовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1779 +#: parser/parse_clause.c:1781 #, 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:1804 +#: parser/parse_clause.c:1806 #, 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:1969 +#: parser/parse_clause.c:1971 #, 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:1998 +#: parser/parse_clause.c:1999 #, 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:2020 +#: parser/parse_clause.c:2021 #, c-format msgid "%s position %d is not in select list" msgstr "в списку вибірки %s немає позиції %d" -#: parser/parse_clause.c:2459 +#: parser/parse_clause.c:2460 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE має обмеження в 12 елементів" -#: parser/parse_clause.c:2665 +#: parser/parse_clause.c:2666 #, c-format msgid "window \"%s\" is already defined" msgstr "вікно \"%s\" вже визначено" -#: parser/parse_clause.c:2726 +#: parser/parse_clause.c:2727 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "змінити речення PARTITION BY для вікна \"%s\" не можна" -#: parser/parse_clause.c:2738 +#: parser/parse_clause.c:2739 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "змінити речення ORDER BY для вікна \"%s\" не можна" -#: parser/parse_clause.c:2768 parser/parse_clause.c:2774 +#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "скопіювати вікно \"%s\", яке має речення рамки, не можна" -#: parser/parse_clause.c:2776 +#: parser/parse_clause.c:2777 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Пропустіть дужки в реченні OVER." -#: parser/parse_clause.c:2796 +#: parser/parse_clause.c:2797 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "Для RANGE з зсувом PRECEDING/FOLLOWING потребується лише один стовпець в ORDER BY" -#: parser/parse_clause.c:2819 +#: parser/parse_clause.c:2820 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "Для режиму GROUPS потребується речення ORDER BY" -#: parser/parse_clause.c:2889 +#: parser/parse_clause.c:2891 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "для агрегатної функції з DISTINCT, вирази ORDER BY повинні з'являтись у списку аргументів" -#: parser/parse_clause.c:2890 +#: parser/parse_clause.c:2892 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "для SELECT DISTINCT вирази ORDER BY повинні бути в списку вибірки" -#: parser/parse_clause.c:2922 +#: parser/parse_clause.c:2924 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатна функція з DISTINCT повинна мати мінімум один аргумент" -#: parser/parse_clause.c:2923 +#: parser/parse_clause.c:2925 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT повинен мати мінімум один стовпець" -#: parser/parse_clause.c:2989 parser/parse_clause.c:3021 +#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "Вирази SELECT DISTINCT ON повинні відповідати початковим виразам ORDER BY" -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3101 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC не дозволяється в реченні ON CONFLICT" -#: parser/parse_clause.c:3105 +#: parser/parse_clause.c:3107 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST не довзоляється в реченні ON CONFLICT" -#: parser/parse_clause.c:3184 +#: parser/parse_clause.c:3186 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE вимагає специфікації висновку або імені обмеження" -#: parser/parse_clause.c:3185 +#: parser/parse_clause.c:3187 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Наприклад, ON CONFLICT (ім'я_стовпця)." -#: parser/parse_clause.c:3196 +#: parser/parse_clause.c:3198 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT не підтримується таблицями системного каталогу" -#: parser/parse_clause.c:3204 +#: parser/parse_clause.c:3206 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT не підтримується в таблиці \"%s\", що використовується як таблиця каталогу" -#: parser/parse_clause.c:3334 +#: parser/parse_clause.c:3336 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не є дійсним оператором сортування" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3338 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Оператори сортування повинні бути учасниками \"<\" або \">\" сімейств операторів btree." -#: parser/parse_clause.c:3647 +#: parser/parse_clause.c:3649 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE зі зсувом PRECEDING/FOLLOWING не підтримується для типу стовпця %s" -#: parser/parse_clause.c:3653 +#: parser/parse_clause.c:3655 #, 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:3656 +#: parser/parse_clause.c:3658 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведіть значення зсуву до потрібного типу." -#: parser/parse_clause.c:3661 +#: parser/parse_clause.c:3663 #, 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:3664 +#: parser/parse_clause.c:3666 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведіть значення зсуву в точності до призначеного типу." #: 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:2662 parser/parse_target.c:994 +#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 #, c-format msgid "cannot cast type %s to %s" msgstr "неможливо транслювати тип %s в %s" @@ -15706,19 +16504,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "оголошенні аргументи \"%s\", повинні бути схожими" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:523 +#: utils/fmgr/funcapi.c:601 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, оголошений як %s , є не масивом, а типом %s" #: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:537 +#: utils/fmgr/funcapi.c:615 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, оголошений як %s, є не діапазонним типом, а типом %s" #: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:555 utils/fmgr/funcapi.c:620 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "оголошений аргумент %s не є багатодіапазонним типом, а типом %s" @@ -15801,18 +16599,18 @@ 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:1004 +#: parser/parse_collate.c:1005 #, 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:1007 +#: parser/parse_collate.c:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Ви можете обрати параметри сортування, застосувавши речення COLLATE до одного або обох виразів." -#: parser/parse_collate.c:854 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "невідповідність параметрів сортування між явними параметрами сортування \"%s\" і \"%s\"" @@ -15842,372 +16640,377 @@ msgstr "рекурсивне посилання на запит \"%s\" не по msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись в EXCEPT" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE не підтримується в запиті WITH" + +#: parser/parse_cte.c:143 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "Ім’я запиту WITH \"%s\" вказано неодноразово" -#: parser/parse_cte.c:307 +#: parser/parse_cte.c:314 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "не вдалося визначити оператора нерівності для типу %s" -#: parser/parse_cte.c:334 +#: parser/parse_cte.c:341 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "Речення WITH, яке містить оператор, що змінює дані, повинне бути на верхньому рівні" -#: parser/parse_cte.c:383 +#: parser/parse_cte.c:390 #, 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:389 +#: parser/parse_cte.c:396 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведіть результат нерекурсивної частини до правильного типу." -#: parser/parse_cte.c:394 +#: parser/parse_cte.c:401 #, 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:398 +#: parser/parse_cte.c:405 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Використайте речення COLLATE, щоб встановити параметри сортування в нерекурсивній частині." -#: parser/parse_cte.c:419 +#: parser/parse_cte.c:426 #, c-format msgid "WITH query is not recursive" msgstr "Запит WITH не є рекурсивним" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:457 #, 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:455 +#: parser/parse_cte.c:462 #, 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:470 +#: parser/parse_cte.c:477 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "пошуковий стовпець \"%s\" відсутній в списку стовпців запиту WITH" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:484 #, c-format msgid "search column \"%s\" specified more than once" msgstr "пошуковий стовпець \"%s\" вказано більше одного разу" -#: parser/parse_cte.c:486 +#: parser/parse_cte.c:493 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "назва послідовності пошуку \"%s\" вже використовується у списку стовпців запиту WITH" -#: parser/parse_cte.c:503 +#: parser/parse_cte.c:510 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "стовпець циклу \"%s\" відсутній в списку стовпців запиту WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:517 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "стовпець циклу \"%s\" вказано більше одного разу" -#: parser/parse_cte.c:519 +#: parser/parse_cte.c:526 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "назва стовпця позначки циклу \"%s\" вже використовується у списку стовпців запиту WITH" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:533 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "назва стовпця циклу шляху \"%s\" вже використовується у списку стовпців запиту WITH" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:541 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "назва стовпця позначки циклу і назва стовпця циклу шляху однакові" -#: parser/parse_cte.c:544 +#: parser/parse_cte.c:551 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "назва стовпця послідовності пошуку і назва стовпця позначки циклу однакові" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:558 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "назва стовпця послідовності пошуку і назва стовпця циклу шляху однакові" -#: parser/parse_cte.c:635 +#: parser/parse_cte.c:642 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "Запит WITH \"%s\" має %d доступних стовпців, але %d стовпців вказано" -#: parser/parse_cte.c:815 +#: parser/parse_cte.c:822 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаємна рекурсія між елементами WITH не реалізована" -#: parser/parse_cte.c:867 +#: parser/parse_cte.c:874 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "рекурсивний запит \"%s\" не повинен містити оператори, які змінюють дані" -#: parser/parse_cte.c:875 +#: parser/parse_cte.c:882 #, 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:919 +#: parser/parse_cte.c:926 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:925 +#: parser/parse_cte.c:932 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET у рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:931 +#: parser/parse_cte.c:938 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT у рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:937 +#: parser/parse_cte.c:944 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурсивному запиті не реалізовано" -#: parser/parse_cte.c:994 +#: parser/parse_cte.c:1001 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурсивне посилання на запит \"%s\" не повинне з'являтись неодноразово" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:282 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допускається в цьому контексті" -#: parser/parse_expr.c:340 parser/parse_relation.c:3641 -#: parser/parse_relation.c:3661 +#: parser/parse_expr.c:335 parser/parse_relation.c:3659 +#: parser/parse_relation.c:3679 #, c-format msgid "column %s.%s does not exist" msgstr "стовпець %s.%s не існує" -#: parser/parse_expr.c:352 +#: parser/parse_expr.c:347 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "стовпець \"%s\" не знайдено в типі даних %s" -#: parser/parse_expr.c:358 +#: parser/parse_expr.c:353 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не вдалося ідентифікувати стовпець \"%s\" в типі запису" -#: parser/parse_expr.c:364 +#: parser/parse_expr.c:359 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "запис імені стовпця .%s застосований до типу %s, котрий не є складеним типом" -#: parser/parse_expr.c:395 parser/parse_target.c:739 +#: parser/parse_expr.c:390 parser/parse_target.c:739 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "розширення рядка через \"*\" тут не підтримується" -#: parser/parse_expr.c:516 +#: parser/parse_expr.c:512 msgid "cannot use column reference in DEFAULT expression" msgstr "у виразі DEFAULT не можна використовувати посилання на стовпець" -#: parser/parse_expr.c:519 +#: parser/parse_expr.c:515 msgid "cannot use column reference in partition bound expression" msgstr "у виразі границі секції не можна використовувати посилання на стовпці" -#: parser/parse_expr.c:788 parser/parse_relation.c:807 -#: parser/parse_relation.c:889 parser/parse_target.c:1234 +#: parser/parse_expr.c:784 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:844 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:840 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:1044 +#: parser/parse_expr.c:1040 #, 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:1050 parser/parse_expr.c:2978 +#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 #, c-format msgid "%s must not return a set" msgstr "%s не повинна повертати набір" -#: parser/parse_expr.c:1435 parser/parse_expr.c:1467 +#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 #, c-format msgid "number of columns does not match number of values" msgstr "кількість стовпців не відповідає кількості значень" -#: parser/parse_expr.c:1481 +#: parser/parse_expr.c:1477 #, 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:1676 parser/parse_expr.c:2157 parser/parse_func.c:2676 +#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функції, повертаючі набори, не дозволяються в %s" -#: parser/parse_expr.c:1738 +#: parser/parse_expr.c:1735 msgid "cannot use subquery in check constraint" msgstr "в обмеженні-перевірці не можна використовувати підзапити" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1739 msgid "cannot use subquery in DEFAULT expression" msgstr "у виразі DEFAULT не можна використовувати підзапити" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1742 msgid "cannot use subquery in index expression" msgstr "в індексному виразі не можна використовувати підзапити" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1745 msgid "cannot use subquery in index predicate" msgstr "в предикаті індексу не можна використовувати підзапити" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1748 msgid "cannot use subquery in statistics expression" msgstr "у виразі статистики не можна використовувати підзапит" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1751 msgid "cannot use subquery in transform expression" msgstr "у виразі перетворення не можна використовувати підзапити" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1754 msgid "cannot use subquery in EXECUTE parameter" msgstr "в параметрі EXECUTE не можна використовувати підзапити" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1757 msgid "cannot use subquery in trigger WHEN condition" msgstr "в умові WHEN для тригеру не можна використовувати підзапити" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1760 msgid "cannot use subquery in partition bound" msgstr "в границі секції не можна використовувати підзапити" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1763 msgid "cannot use subquery in partition key expression" msgstr "у виразі ключа секціонування не можна використовувати підзапити" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1766 msgid "cannot use subquery in CALL argument" msgstr "в аргументі CALL не можна використовувати підзапити" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1769 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "не можна використовувати підзапити в умові COPY FROM WHERE" -#: parser/parse_expr.c:1775 +#: parser/parse_expr.c:1772 msgid "cannot use subquery in column generation expression" msgstr "у виразі генерації стовпців не можна використовувати підзапити" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1825 #, c-format msgid "subquery must return only one column" msgstr "підзапит повинен повертати лише один стовпець" -#: parser/parse_expr.c:1899 +#: parser/parse_expr.c:1896 #, c-format msgid "subquery has too many columns" msgstr "підзапит має занадто багато стовпців" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1901 #, c-format msgid "subquery has too few columns" msgstr "підзапит має занадто мало стовпців" -#: parser/parse_expr.c:2000 +#: parser/parse_expr.c:1997 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого масиву визначити не можна" -#: parser/parse_expr.c:2001 +#: parser/parse_expr.c:1998 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Приведіть його до бажаного типу явним чином, наприклад ARRAY[]::integer[]." -#: parser/parse_expr.c:2015 +#: parser/parse_expr.c:2012 #, c-format msgid "could not find element type for data type %s" msgstr "не вдалося знайти тип елементу для типу даних %s" -#: parser/parse_expr.c:2098 +#: parser/parse_expr.c:2095 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW вирази можуть мати максимум %d елементів" -#: parser/parse_expr.c:2303 +#: parser/parse_expr.c:2300 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "замість значення XML-атрибуту без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2304 +#: parser/parse_expr.c:2301 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "замість значення XML-елементу без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2319 +#: parser/parse_expr.c:2316 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "Ім'я XML-атрибуту \"%s\" з'являється неодноразово" -#: parser/parse_expr.c:2426 +#: parser/parse_expr.c:2423 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE до %s не можна" -#: parser/parse_expr.c:2735 parser/parse_expr.c:2931 +#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 #, c-format msgid "unequal number of entries in row expressions" msgstr "неоднакова кількість елементів у виразах рядка" -#: parser/parse_expr.c:2745 +#: parser/parse_expr.c:2742 #, c-format msgid "cannot compare rows of zero length" msgstr "рядки нульової довжини порівнювати не можна" -#: parser/parse_expr.c:2770 +#: parser/parse_expr.c:2767 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "оператор порівняння рядків повинен видавати логічний тип, а не %s" -#: parser/parse_expr.c:2777 +#: parser/parse_expr.c:2774 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор порівняння рядків повинен вертати набір" -#: parser/parse_expr.c:2836 parser/parse_expr.c:2877 +#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не вдалося визначити інтерпретацію оператора порівняння рядків %s" -#: parser/parse_expr.c:2838 +#: parser/parse_expr.c:2835 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Оператори порівняння рядків повинні бути пов'язанні з сімейством операторів btree." -#: parser/parse_expr.c:2879 +#: parser/parse_expr.c:2876 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Існує декілька рівноцінних кандидатів." -#: parser/parse_expr.c:2972 +#: parser/parse_expr.c:2969 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM, потребує = щоб оператор повертав логічне значення" @@ -16501,59 +17304,88 @@ msgstr "функції, що повертають множину, не можн msgid "set-returning functions are not allowed in window definitions" msgstr "функції, що повертають множину, не можна застосовувати у віконних визначеннях" -#: parser/parse_func.c:2616 +#: 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 "функції, що повертають множину, не можна застосовувати в обмеженнях Check" -#: parser/parse_func.c:2620 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "функції, що повертають множину, не можна застосовувати у стандартних виразах" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "функції, що повертають множину, не можна застосовувати в індексних виразах" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "функції, що повертають множину, не можна застосовувати в індексних предикатах" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "функції, що повертають набори, не можна застосовувати у виразах статистики" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "функції, що повертають множину, не можна застосовувати у виразах перетворення" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "функції, що повертають множину, не можна застосовуватив параметрах виконання" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "функції, що повертають множину, не можна застосовувати в умовах для тригерів WHEN" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "функції, що повертають множину не можна застосовувати в границі секції" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "функції, що повертають множину, не можна застосовувати у виразах ключа розділення" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "функції, що повертають множину, не можна застосовувати в аргументах Відеовикликів" -#: parser/parse_func.c:2650 +#: 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:2653 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "функції, що повертають множину не можна застосовувати у виразах генерації стовпців" -#: parser/parse_node.c:87 +#: parser/parse_merge.c:119 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WITH RECURSIVE не підтримується для інструкції MERGE" + +#: parser/parse_merge.c:161 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "недосяжна речення WHEN зазначено після безумовного речення WHEN" + +#: parser/parse_merge.c:191 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE не підтримує відношення з правилами." + +#: parser/parse_merge.c:208 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "ім'я \"%s\" вказано кілька разів" + +#: parser/parse_merge.c:210 +#, 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 елементів" @@ -16624,6 +17456,11 @@ msgstr "op ANY/ALL (масив) вимагає оператора не для п 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" @@ -16639,12 +17476,12 @@ msgstr "посилання на таблицю %u неоднозначне" msgid "table name \"%s\" specified more than once" msgstr "ім'я таблиці \"%s\" вказано більше одного разу" -#: parser/parse_relation.c:474 parser/parse_relation.c:3581 +#: parser/parse_relation.c:474 parser/parse_relation.c:3599 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в елементі речення FROM неприпустиме посилання на таблицю \"%s\"" -#: parser/parse_relation.c:478 parser/parse_relation.c:3586 +#: parser/parse_relation.c:478 parser/parse_relation.c:3604 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Таблиця \"%s\" присутня в запиті, але посилатися на неї з цієї частини запиту не можна." @@ -16664,108 +17501,108 @@ msgstr "недопустиме посилання системи стовпці msgid "cannot use system column \"%s\" in column generation expression" msgstr "використовувати системний стовпець \"%s\" у виразах генерації стовпців, не можна" -#: parser/parse_relation.c:1173 parser/parse_relation.c:1625 -#: parser/parse_relation.c:2343 +#: parser/parse_relation.c:711 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "неможливо використати симтемний стовпець \"%s\" в умові MERGE WHEN" + +#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 +#: parser/parse_relation.c:2357 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "таблиця \"%s\" має %d доступних стовпців, але вказано %d стовпців" -#: 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 "Існує WITH елемент \"%s\" але на нього не можна посилатися з цієї частини запиту." -#: 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 "Використовувати WITH RECURSIVE, або перевпорядкувати елементи WITH, щоб видалити попередні посилання." -#: parser/parse_relation.c:1767 +#: 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:1773 +#: parser/parse_relation.c:1784 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "список з визначенням стовпців не потрібен для функції, яка повертає іменований складений тип" -#: 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 "список з визначенням стовпців дозволений лише для функцій, що повертають \"запис\"" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1802 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "список з визначенням стовпців вимагається для функцій, що повертають \"запис\"" -#: parser/parse_relation.c:1828 +#: parser/parse_relation.c:1839 #, c-format msgid "column definition lists can have at most %d entries" msgstr "списки визначень стовпців можуть мати максимум %d елементів" -#: parser/parse_relation.c:1888 +#: parser/parse_relation.c:1899 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "функція \"%s\" у FROM повертає тип, що не підтримується %s" -#: parser/parse_relation.c:1915 parser/parse_relation.c:2008 +#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "функції з FROM можуть повертати не більше %d стовпців" -#: parser/parse_relation.c:2036 +#: parser/parse_relation.c:2049 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "функція \"%s\" має %d доступних стовпців, але вказано %d стовпців" -#: parser/parse_relation.c:2124 +#: parser/parse_relation.c:2138 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES списки \"%s\" мають %d доступних стовпців, але %d стовпців вказано" -#: parser/parse_relation.c:2196 +#: parser/parse_relation.c:2210 #, c-format msgid "joins can have at most %d columns" msgstr "з'єднання можуть мати максимум %d стовпців" -#: parser/parse_relation.c:2221 +#: parser/parse_relation.c:2235 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "вираз з'єднання \"%s\" має %d доступних стовпців, але %d стовпців вказано" -#: parser/parse_relation.c:2316 +#: parser/parse_relation.c:2330 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH запит \"%s\" не має речення RETURNING" -#: parser/parse_relation.c:3356 parser/parse_relation.c:3366 -#, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "стовпець %d відношення \"%s\" не існує" - -#: parser/parse_relation.c:3584 +#: parser/parse_relation.c:3602 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Можливо, малося на увазі посилання на псевдонім таблиці \"%s\"." -#: parser/parse_relation.c:3592 +#: parser/parse_relation.c:3610 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблиця \"%s\" відсутня в реченні FROM" -#: parser/parse_relation.c:3644 +#: parser/parse_relation.c:3662 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Можливо, передбачалось посилання на стовпець \"%s.%s\"." -#: parser/parse_relation.c:3646 +#: parser/parse_relation.c:3664 #, 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:3663 +#: parser/parse_relation.c:3681 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Можливо, передбачалось посилання на стовпець \"%s.%s\" або стовпець \"%s.%s\"." @@ -16810,7 +17647,7 @@ msgstr "індексоване присвоєння \"%s\" вимагає тип msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "підполе \"%s\" має тип %s, але вираз має тип %s" -#: parser/parse_target.c:1322 +#: parser/parse_target.c:1323 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * повинен посилатись на таблиці" @@ -16830,8 +17667,8 @@ msgstr "неправильне посилання %%TYPE (занадто баг msgid "type reference %s converted to %s" msgstr "посилання на тип %s перетворене на тип %s" -#: 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:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" є лише оболонкою" @@ -16841,12 +17678,12 @@ 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:766 +#: parser/parse_type.c:725 parser/parse_type.c:770 #, c-format msgid "invalid type name \"%s\"" msgstr "невірне ім'я типу \"%s\"" @@ -16856,330 +17693,330 @@ msgstr "невірне ім'я типу \"%s\"" msgid "cannot create partitioned table as inheritance child" msgstr "створити секціоновану таблицю в якості нащадка не можна" -#: parser/parse_utilcmd.c:581 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "масиви послідовності не реалізовані" -#: parser/parse_utilcmd.c:660 parser/parse_utilcmd.c:672 -#: parser/parse_utilcmd.c:731 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "несумісні оголошення NULL/NOT NULL для стовпця \"%s\" таблиці \"%s\"" -#: parser/parse_utilcmd.c:684 +#: parser/parse_utilcmd.c:683 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано декілька значень за замовчуванням" -#: parser/parse_utilcmd.c:701 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "ідентифікаційні стовпці не підтримуються в типізованих таблицях" -#: parser/parse_utilcmd.c:705 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "ідентифікаційні стовпці не підтримуються з секціями" -#: parser/parse_utilcmd.c:714 +#: parser/parse_utilcmd.c:713 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" властивість identity вказана неодноразово" -#: parser/parse_utilcmd.c:744 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "згенеровані стовпці не підтримуються в типізованих таблицях" -#: parser/parse_utilcmd.c:748 +#: parser/parse_utilcmd.c:747 #, c-format msgid "generated columns are not supported on partitions" msgstr "згенеровані стовпці не підтримуються в секціях" -#: parser/parse_utilcmd.c:753 +#: parser/parse_utilcmd.c:752 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано декілька речень генерації" -#: parser/parse_utilcmd.c:771 parser/parse_utilcmd.c:886 +#: parser/parse_utilcmd.c:770 parser/parse_utilcmd.c:885 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "обмеження первинного ключа для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:896 +#: parser/parse_utilcmd.c:779 parser/parse_utilcmd.c:895 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "обмеження унікальності для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:825 +#: parser/parse_utilcmd.c:824 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано значення за замовчуванням і властивість identity" -#: parser/parse_utilcmd.c:833 +#: parser/parse_utilcmd.c:832 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано вираз за замовчуванням і вираз генерації" -#: parser/parse_utilcmd.c:841 +#: parser/parse_utilcmd.c:840 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "для стовпця \"%s\" таблиці \"%s\" вказано вираз ідентичності і вираз генерації" -#: parser/parse_utilcmd.c:906 +#: parser/parse_utilcmd.c:905 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "обмеження-виключення для сторонніх таблиць не підтримуються" -#: parser/parse_utilcmd.c:912 +#: parser/parse_utilcmd.c:911 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "обмеження-виключення для секціонованих таблиць не підтримуються" -#: parser/parse_utilcmd.c:977 +#: parser/parse_utilcmd.c:976 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE не підтримується при створенні сторонніх таблиць" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:989 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "невірше відношення \"%s\" в реченні LIKE" + +#: parser/parse_utilcmd.c:1755 parser/parse_utilcmd.c:1863 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Індекс \"%s\" містить посилання на таблицю на весь рядок." -#: parser/parse_utilcmd.c:2249 +#: parser/parse_utilcmd.c:2252 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "у CREATE TABLE не можна використовувати існуючий індекс" -#: parser/parse_utilcmd.c:2269 +#: parser/parse_utilcmd.c:2272 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "індекс \"%s\" вже пов'язаний з обмеженням" -#: parser/parse_utilcmd.c:2284 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "індекс \"%s\" не є припустимим" - -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2293 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не є унікальним індексом" -#: parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 -#: parser/parse_utilcmd.c:2305 parser/parse_utilcmd.c:2382 +#: parser/parse_utilcmd.c:2294 parser/parse_utilcmd.c:2301 +#: parser/parse_utilcmd.c:2308 parser/parse_utilcmd.c:2385 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Створити первинний ключ або обмеження унікальності, використовуючи такий індекс, не можна." -#: parser/parse_utilcmd.c:2297 +#: parser/parse_utilcmd.c:2300 #, c-format msgid "index \"%s\" contains expressions" msgstr "індекс \"%s\" містить вирази" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2307 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" є частковим індексом" -#: parser/parse_utilcmd.c:2316 +#: parser/parse_utilcmd.c:2319 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" є індексом, що відкладається" -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2320 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Створити обмеження, що не відкладається, використовуючи індекс, що відкладається, не можна." -#: parser/parse_utilcmd.c:2381 +#: parser/parse_utilcmd.c:2384 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "індекс \"%s\" номер стовпця %d не має поведінки сортування за замовчуванням" -#: parser/parse_utilcmd.c:2538 +#: parser/parse_utilcmd.c:2541 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "стовпець \"%s\" з'являється двічі в обмеженні первинного ключа" -#: parser/parse_utilcmd.c:2544 +#: parser/parse_utilcmd.c:2547 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "стовпець \"%s\" з'являється двічі в обмеженні унікальності" -#: parser/parse_utilcmd.c:2891 +#: parser/parse_utilcmd.c:2894 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "індекс-вирази й предикати можуть посилатись лише на індексовану таблицю" -#: parser/parse_utilcmd.c:2963 +#: parser/parse_utilcmd.c:2966 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "вирази статистики можуть посилатися лише на таблицю, для якої збирається статистика" -#: parser/parse_utilcmd.c:3006 +#: parser/parse_utilcmd.c:3009 #, c-format msgid "rules on materialized views are not supported" msgstr "правила для матеріалізованих подань не підтримуються" -#: parser/parse_utilcmd.c:3069 +#: parser/parse_utilcmd.c:3072 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в умовах WHERE правила не можуть містити посилання на інші зв'язки" -#: parser/parse_utilcmd.c:3142 +#: parser/parse_utilcmd.c:3145 #, 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:3160 parser/parse_utilcmd.c:3261 +#: parser/parse_utilcmd.c:3163 parser/parse_utilcmd.c:3264 #: rewrite/rewriteHandler.c:532 rewrite/rewriteManip.c:1021 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "умовні оператори UNION/INTERSECT/EXCEPT не реалізовані" -#: parser/parse_utilcmd.c:3178 +#: parser/parse_utilcmd.c:3181 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "у правилі ON SELECT не можна використовувати OLD" -#: parser/parse_utilcmd.c:3182 +#: parser/parse_utilcmd.c:3185 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "у правилі ON SELECT не можна використовувати NEW" -#: parser/parse_utilcmd.c:3191 +#: parser/parse_utilcmd.c:3194 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "у правилі ON INSERT не можна використовувати OLD" -#: parser/parse_utilcmd.c:3197 +#: parser/parse_utilcmd.c:3200 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "у правилі ON DELETE не можна використовувати NEW" -#: parser/parse_utilcmd.c:3225 +#: parser/parse_utilcmd.c:3228 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "у запиті WITH не можна посилатися на OLD" -#: parser/parse_utilcmd.c:3232 +#: parser/parse_utilcmd.c:3235 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "у запиті WITH не можна посилатися на NEW" -#: parser/parse_utilcmd.c:3686 +#: parser/parse_utilcmd.c:3689 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "речення DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3691 parser/parse_utilcmd.c:3706 +#: parser/parse_utilcmd.c:3694 parser/parse_utilcmd.c:3709 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "декілька речень DEFERRABLE/NOT DEFERRABLE не допускаються" -#: parser/parse_utilcmd.c:3701 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "речення NOT DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3714 parser/parse_utilcmd.c:3740 gram.y:5559 +#: parser/parse_utilcmd.c:3717 parser/parse_utilcmd.c:3743 gram.y:5937 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "обмеження, оголошене як INITIALLY DEFERRED, повинно бути оголошене як DEFERRABLE" -#: parser/parse_utilcmd.c:3722 +#: parser/parse_utilcmd.c:3725 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "речення INITIALLY DEFERRED розташовано неправильно" -#: parser/parse_utilcmd.c:3727 parser/parse_utilcmd.c:3753 +#: parser/parse_utilcmd.c:3730 parser/parse_utilcmd.c:3756 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "декілька речень INITIALLY IMMEDIATE/DEFERRED не допускаються" -#: parser/parse_utilcmd.c:3748 +#: parser/parse_utilcmd.c:3751 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "речення INITIALLY IMMEDIATE розташовано неправильно" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3944 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "В CREATE вказана схема (%s), яка відрізняється від створюваної (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3979 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" не є секціонованою таблицею" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3986 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблиця \"%s\" не є секційною" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3993 #, c-format msgid "index \"%s\" is not partitioned" msgstr "індекс \"%s\" не є секціонованим" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4033 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у геш-секціонованій таблиці не може бути розділу за замовчуванням" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4050 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неприпустима вказівка границі для геш-секції" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4711 +#: parser/parse_utilcmd.c:4056 partitioning/partbounds.c:4824 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" -msgstr "модуль для хеш-секції повинен бути цілим числом більше за нуль" +msgstr "модуль для хеш-секції повинен бути цілим числом більшим за нуль" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4719 +#: parser/parse_utilcmd.c:4063 partitioning/partbounds.c:4832 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "залишок для геш-секції повинен бути меньшим, ніж модуль" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4076 #, c-format msgid "invalid bound specification for a list partition" msgstr "нерипустима вказівка границі для секції по списку" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4129 #, c-format msgid "invalid bound specification for a range partition" msgstr "неприпустима вказівка границі для секції діапазону" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4135 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "В FROM повинно вказуватися лише одне значення для стовпця секціонування" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4139 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "В TO повинно вказуватися лише одне значення для стовпця секціонування" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4253 #, c-format msgid "cannot specify NULL in range bound" msgstr "вказати NULL в діапазоні границі не можна" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4302 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за кожною границею MAXVALUE повинні бути лише границі MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4309 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за кожною границею MINVALUE повинні бути лише границі MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4352 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "вказане значення не можна привести до типу %s для стовпця \"%s\"" @@ -17192,12 +18029,12 @@ msgstr "UESCAPE повинен відстежуватись простим лі msgid "invalid Unicode escape character" msgstr "неприпустимий символ спеціального коду Unicode" -#: parser/parser.c:321 scan.l:1329 +#: parser/parser.c:321 scan.l:1338 #, c-format msgid "invalid Unicode escape value" msgstr "неприпустиме значення спеціального коду Unicode" -#: parser/parser.c:468 utils/adt/varlena.c:6555 scan.l:677 +#: parser/parser.c:468 utils/adt/varlena.c:6529 scan.l:684 #, c-format msgid "invalid Unicode escape" msgstr "неприпустимий спеціальний код Unicode" @@ -17207,8 +18044,8 @@ msgstr "неприпустимий спеціальний код Unicode" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спеціальні символи Unicode повинні бути \\XXXX або \\+XXXXXX." -#: parser/parser.c:497 utils/adt/varlena.c:6580 scan.l:638 scan.l:654 -#: scan.l:670 +#: parser/parser.c:497 utils/adt/varlena.c:6554 scan.l:645 scan.l:661 +#: scan.l:677 #, c-format msgid "invalid Unicode surrogate pair" msgstr "неприпустима сурогатна пара Unicode" @@ -17218,74 +18055,74 @@ msgstr "неприпустима сурогатна пара Unicode" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "ідентифікатор \"%s\" буде скорочено до \"%.*s\"" -#: partitioning/partbounds.c:2821 +#: partitioning/partbounds.c:2933 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "існують конфлікти між розділом \"%s\" та існуючим розділом за замовчуванням \"%s\"" -#: partitioning/partbounds.c:2873 partitioning/partbounds.c:2892 -#: partitioning/partbounds.c:2914 +#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 +#: partitioning/partbounds.c:3026 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "модуль кожної геш-секції повинен бути дільником наступних більших модулів" -#: partitioning/partbounds.c:2874 partitioning/partbounds.c:2915 +#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 #, 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 +#: partitioning/partbounds.c:3005 #, 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 +#: partitioning/partbounds.c:3140 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "для секції \"%s\" вказані границі, які утворюють пустий діапазон" -#: partitioning/partbounds.c:3030 +#: partitioning/partbounds.c:3142 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Вказана нижня границя %s більша або дорівнює верхній границі %s." -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3254 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "секція \"%s\" буде перекривати секцію \"%s\"" -#: partitioning/partbounds.c:3259 +#: partitioning/partbounds.c:3371 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "пропущено сканування зовнішньої таблиці \"%s\" яка є секцією секції за замовчуванням \"%s\"" -#: partitioning/partbounds.c:4715 +#: partitioning/partbounds.c:4828 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" -msgstr "залишок для хеш-секції повинен бути цілим числом більше або дорівнювати нулю" +msgstr "залишок для хеш-секції повинен бути цілим числом більшим або рівним нулю" -#: partitioning/partbounds.c:4739 +#: partitioning/partbounds.c:4852 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не є геш-секціонованою таблицею" -#: partitioning/partbounds.c:4750 partitioning/partbounds.c:4867 +#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "кількість секціонованих стовпців (%d) не дорівнює кількості наданих ключів секціонування (%d)" -#: partitioning/partbounds.c:4772 +#: partitioning/partbounds.c:4885 #, 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 +#: partitioning/partbounds.c:4917 #, 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:678 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:678 +#: 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\": %m" @@ -17321,32 +18158,32 @@ msgid "This error does *not* mean that you have run out of disk space. It occur msgstr "Ця помилка НЕ означає, що на диску немає місця. Ймовірніше за все, були зайняті всі доступні ID спільної пам'яті, в такому випадку вам потрібно підвищити параметр SHMMNI у вашому ядрі, або перевищено граничний розмір спільної пам'яті.\n" "Детальна інформація про налаштування спільної пам'яті міститься в інструкції PostgreSQL." -#: port/pg_shmem.c:616 port/sysv_shmem.c:616 +#: 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:618 port/sysv_shmem.c:618 +#: 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 байтів), зменшіть використання спільної пам'яті PostgreSQL, можливо зменшив shared_buffers або max_connections." -#: port/pg_shmem.c:686 port/sysv_shmem.c:686 +#: 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:693 port/sysv_shmem.c:693 +#: 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:753 port/sysv_shmem.c:753 utils/init/miscinit.c:1172 +#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1195 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "раніше виділений блок спільної пам'яті (ключ %lu, ідентифікатор %lu) все ще використовується" -#: port/pg_shmem.c:756 port/sysv_shmem.c:756 utils/init/miscinit.c:1174 +#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1197 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Припинити будь-які старі серверні процеси, пов'язані з каталогом даних \"%s\"." @@ -17373,37 +18210,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 "Можливо, вам потрібно збілшити значення SEMVMX вашого ядра, мінімум до %d. Детальніше про це написано в інструкції 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" @@ -17493,42 +18330,47 @@ msgstr "Помилка в системному виклику DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Помилка в системному виклику MapViewOfFileEx." -#: postmaster/autovacuum.c:410 +#: postmaster/autovacuum.c:404 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "не вдалося породити процес запуску автоочистки: %m" -#: postmaster/autovacuum.c:1492 +#: 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 "не вдалося породити робочий процес автоочитски: %m" -#: postmaster/autovacuum.c:2298 +#: postmaster/autovacuum.c:2277 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: видалення застарілої тимчасової таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2527 +#: postmaster/autovacuum.c:2502 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматична очистка таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2530 +#: postmaster/autovacuum.c:2505 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2723 +#: postmaster/autovacuum.c:2698 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обробка робочого введення для відношення \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3409 +#: postmaster/autovacuum.c:3309 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистку не запущено через неправильну конфігурацію" -#: postmaster/autovacuum.c:3410 +#: postmaster/autovacuum.c:3310 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Активувати параметр \"track_counts\"." @@ -17538,47 +18380,47 @@ msgstr "Активувати параметр \"track_counts\"." msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "несумісний стан фонового процесу (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:661 +#: 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 workers without shared memory access are not supported" +msgstr "фоновий виконавець \"%s\": фонові виконавці без доступу до спільної пам'яті не підтримуються" -#: postmaster/bgworker.c:670 +#: postmaster/bgworker.c:677 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "фоновий виконавець \"%s\": не може запитувати доступ до бази даних, якщо його запущено при старті адміністратора поштового сервісу" -#: postmaster/bgworker.c:684 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновий виконавець \"%s\": неприпустимий інтервал перезавантаження" -#: postmaster/bgworker.c:699 +#: postmaster/bgworker.c:706 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "фоновий виконавець\"%s\": паралельні виконавці не можуть бути налаштовані для перезавантаження" -#: postmaster/bgworker.c:723 tcop/postgres.c:3201 +#: postmaster/bgworker.c:730 tcop/postgres.c:3215 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершення фонового процесу \"%s\" по команді адміністратора" -#: postmaster/bgworker.c:904 +#: 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:916 +#: postmaster/bgworker.c:899 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "фоновий процес \"%s\": лише динамічні фонові процеси можуть запитувати сповіщення" -#: postmaster/bgworker.c:931 +#: postmaster/bgworker.c:914 #, c-format msgid "too many background workers" msgstr "занадто багато фонових процесів" -#: 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." @@ -17587,12 +18429,12 @@ msgstr[1] "Максимальне можливе число фонових пр msgstr[2] "Максимальне можливе число фонових процесів при поточних параметрах: %d." msgstr[3] "Максимальне можливе число фонових процесів при поточних параметрах: %d." -#: postmaster/bgworker.c:936 +#: postmaster/bgworker.c:919 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Можливо, слід збільшити параметр конфігурації \"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)" @@ -17601,346 +18443,182 @@ msgstr[1] "контрольні точки відбуваються занадт msgstr[2] "контрольні точки відбуваються занадто часто (через %d сек.)" msgstr[3] "контрольні точки відбуваються занадто часто (через %d сек.)" -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:436 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Можливо, слід збільшити параметр конфігурації \"max_wal_size\"." -#: postmaster/checkpointer.c:1062 +#: postmaster/checkpointer.c:1060 #, c-format msgid "checkpoint request failed" msgstr "збій при запиті контрольної точки" -#: postmaster/checkpointer.c:1063 +#: postmaster/checkpointer.c:1061 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Для деталей, зверніться до останніх повідомлень в протоколі серверу." -#: postmaster/pgarch.c:365 +#: postmaster/pgarch.c:423 #, 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 активовано, але архівування не налаштовано" -#: postmaster/pgarch.c:387 +#: postmaster/pgarch.c:445 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "видалено залишковий файл статусу архіву \"%s\"" -#: postmaster/pgarch.c:397 +#: postmaster/pgarch.c:455 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "видалення залишкового файлу статусу архіву \"%s\" не вдалося занадто багато разів, пізніже спробуємо знову" -#: postmaster/pgarch.c:433 +#: postmaster/pgarch.c:491 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "архівація файлу випереджувальног журналювання \"%s\" не виконана багато разів, наступна спроба буде пізніже" -#: postmaster/pgarch.c:534 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "команда архівації завершилась помилкой з кодом %d" - -#: 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:543 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "команда архівації була перервана винятком 0x%X" - -#: postmaster/pgarch.c:545 postmaster/postmaster.c:3755 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Опис цього Шістнадцяткового значення дивіться у включаємому C-файлі \"ntstatus.h\"." - -#: postmaster/pgarch.c:550 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "команда архівації була перервана сигналом %d: %s" - -#: postmaster/pgarch.c:559 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "команда архівації завершена з нерозпізнаним статусом %d" - -#: postmaster/pgstat.c:418 -#, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "не вдалося закрити \"localhost\": %s" - -#: postmaster/pgstat.c:441 -#, c-format -msgid "trying another address for the statistics collector" -msgstr "спроба іншої адреси для збирача статистики" - -#: postmaster/pgstat.c:450 -#, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "не вдалося створити сокет для збирача статистики: %m" - -#: postmaster/pgstat.c:462 -#, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "не вдалося прив'язати сокет для збирача статистики: %m" - -#: postmaster/pgstat.c:473 -#, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "не вдалося отримати адресу сокета для збирача статистики: %m" - -#: postmaster/pgstat.c:489 -#, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "не вдалося підключити сокет для збирача статистики: %m" - -#: postmaster/pgstat.c:510 -#, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "не вдалося надіслати тестове повідомлення в сокет для збирача статистики: %m" - -#: postmaster/pgstat.c:536 -#, c-format -msgid "select() failed in statistics collector: %m" -msgstr "помилка select() в збирачі статистики: %m" - -#: postmaster/pgstat.c:551 -#, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "тестове повідомлення не пройшло крізь сокет для збирача статистики" - -#: postmaster/pgstat.c:566 -#, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "не вдалося отримати тестове повідомлення крізь сокет для збирача статистики: %m" - -#: postmaster/pgstat.c:576 -#, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "неправильне передавання тестового повідомлення крізь сокет для збирача статистики" - -#: postmaster/pgstat.c:599 -#, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "не вдалося встановити сокет збирача статистики в неблокуючий режим: %m" - -#: postmaster/pgstat.c:643 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "вимкнення збирача статистики відбувається через нестачі робочого сокету" - -#: postmaster/pgstat.c:790 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "не вдалося породити процес збирача статистики: %m" - -#: postmaster/pgstat.c:1444 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "нерозпізнане відновлення мети: \"%s\"" - -#: postmaster/pgstat.c:1445 -#, c-format -msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgstr "Ціль повинна бути \"archiver\", \"bgwriter\" або \"wal\"." - -#: postmaster/pgstat.c:3289 -#, c-format -msgid "could not read statistics message: %m" -msgstr "не вдалося прочитати повідомлення статистики: %m" - -#: 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:3729 postmaster/pgstat.c:3864 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "не вдалося записати в тимчасовий файл статистики \"%s\": %m" - -#: 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: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: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: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:4634 -#, c-format -msgid "statistics collector's time %s is later than backend local time %s" -msgstr "час збирача статистики %s пізніший, ніж місцевий час внутрішнього сервера %s" - -#: postmaster/pgstat.c:4657 +#: postmaster/pgarch.c:798 #, c-format -msgid "using stale statistics instead of current ones because stats collector is not responding" -msgstr "використовується застаріла статистика замість поточної, тому, що збирач статистики не відповідає" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "перезапуск процесу архіватора, оскільки значення \"archive_library\" було змінено" -#: postmaster/pgstat.c:4784 +#: postmaster/pgarch.c:831 #, c-format -msgid "stats_timestamp %s is later than collector's time %s for database %u" -msgstr "stats_timestamp %s пізніший, ніж час збирача %s для бази даних %u" +msgid "archive modules have to define the symbol %s" +msgstr "архівні модулі повинні визначити символ %s" -#: postmaster/pgstat.c:4997 +#: postmaster/pgarch.c:837 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "таблиця гешування бази даних пошкоджена під час очищення --- переривання" +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: неприпустимий аргумент для параметру -f: \"%s\"\n" -#: postmaster/postmaster.c:824 +#: postmaster/postmaster.c:823 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неприпустимий аргумент для параметру -t: \"%s\"\n" -#: postmaster/postmaster.c:875 +#: postmaster/postmaster.c:874 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неприпустимий аргумент: \"%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) має бути меншим ніж max_connections (%d)\n" -#: postmaster/postmaster.c:924 +#: postmaster/postmaster.c:949 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "WAL архіватор не може бути активованим, коли wal_level \"мінімальний\"" -#: 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 (max_wal_senders > 0) вимагає wal_level \"replica\" або \"logical\"" -#: postmaster/postmaster.c:935 +#: postmaster/postmaster.c:960 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: неприпустимі таблиці маркерів часу, будь-ласка виправіть\n" -#: postmaster/postmaster.c:1052 +#: postmaster/postmaster.c:1113 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не вдалося створити завершений порт вводу-виводу для черги дітей" -#: postmaster/postmaster.c:1117 +#: postmaster/postmaster.c:1189 #, c-format msgid "ending log output to stderr" msgstr "завершення запису виводу Stderr" -#: postmaster/postmaster.c:1118 +#: postmaster/postmaster.c:1190 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "В майбутньому запис виведення буде записуватися в призначення \"%s\"." -#: postmaster/postmaster.c:1129 +#: postmaster/postmaster.c:1201 #, c-format msgid "starting %s" msgstr "початок %s" -#: postmaster/postmaster.c:1158 postmaster/postmaster.c:1257 -#: utils/init/miscinit.c:1632 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "неприпустимий синтаксис списку в параметрі \"%s\"" - -#: postmaster/postmaster.c:1189 +#: postmaster/postmaster.c:1253 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не вдалося створити сокет прослуховування для \"%s\"" -#: postmaster/postmaster.c:1195 +#: postmaster/postmaster.c:1259 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не вдалося створити TCP/IP сокети" -#: postmaster/postmaster.c:1227 +#: postmaster/postmaster.c:1291 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "Помилка DNSServiceRegister(): код помилки %ld" -#: postmaster/postmaster.c:1279 +#: postmaster/postmaster.c:1343 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не вдалося створити Unix-domain сокет в каталозі \"%s\"" -#: postmaster/postmaster.c:1285 +#: postmaster/postmaster.c:1349 #, c-format msgid "could not create any Unix-domain sockets" msgstr "не вдалося створити Unix-domain сокети" -#: postmaster/postmaster.c:1297 +#: postmaster/postmaster.c:1361 #, c-format msgid "no socket created for listening" msgstr "не створено жодного сокету для прослуховування" -#: postmaster/postmaster.c:1328 +#: postmaster/postmaster.c:1392 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s: не вдалося змінити дозволи зовнішнього PID файлу \"%s\": %s\n" -#: postmaster/postmaster.c:1332 +#: postmaster/postmaster.c:1396 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s: не вдалося записати зовнішній PID файл \"%s\": %s\n" -#: postmaster/postmaster.c:1365 utils/init/postinit.c:216 +#: postmaster/postmaster.c:1423 utils/init/postinit.c:220 #, c-format msgid "could not load pg_hba.conf" msgstr "не вдалося завантажити pg_hba.conf" -#: postmaster/postmaster.c:1391 +#: postmaster/postmaster.c:1449 #, c-format msgid "postmaster became multithreaded during startup" msgstr "адміністратор поштового сервера став багатопотоковим під час запуску" -#: postmaster/postmaster.c:1392 +#: postmaster/postmaster.c:1450 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Встановити в змінній середовища LC_ALL дійісну локаль." -#: postmaster/postmaster.c:1487 +#: postmaster/postmaster.c:1551 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не вдалося знайти свій власний шлях для виконання" -#: postmaster/postmaster.c:1494 +#: postmaster/postmaster.c:1558 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: не вдалося знайти відповідний postgres файл, що виконується" -#: postmaster/postmaster.c:1517 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1581 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:1544 +#: postmaster/postmaster.c:1608 #, c-format msgid "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" @@ -17949,798 +18627,692 @@ msgstr "%s: не вдалося знайти систему бази даних\ "Очікувалося знайти її у каталозі \"%s\",\n" "але не вдалося відкрити файл \"%s\": %s\n" -#: postmaster/postmaster.c:1721 +#: postmaster/postmaster.c:1785 #, c-format msgid "select() failed in postmaster: %m" msgstr "помилка вибирати() в адміністраторі поштового сервера: %m" -#: postmaster/postmaster.c:1857 +#: postmaster/postmaster.c:1916 #, c-format msgid "issuing SIGKILL to recalcitrant children" msgstr "надсилання SIGKILL непокірливим дітям" -#: postmaster/postmaster.c:1878 +#: postmaster/postmaster.c:1937 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "виконується негайне припинення роботи через неприпустимий файл блокування каталогу даних" -#: postmaster/postmaster.c:1981 postmaster/postmaster.c:2009 +#: postmaster/postmaster.c:2040 postmaster/postmaster.c:2068 #, c-format msgid "incomplete startup packet" msgstr "неповний стартовий пакет" -#: postmaster/postmaster.c:1993 postmaster/postmaster.c:2026 +#: postmaster/postmaster.c:2052 postmaster/postmaster.c:2085 #, c-format msgid "invalid length of startup packet" msgstr "неприпустима довжина стартового пакету" -#: postmaster/postmaster.c:2055 +#: postmaster/postmaster.c:2114 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "помилка надсилання протоколу SSL в процесі відповіді зв'язування: %m" -#: postmaster/postmaster.c:2073 +#: postmaster/postmaster.c:2132 #, c-format msgid "received unencrypted data after SSL request" msgstr "отримані незашифровані дані після запиту SSL" -#: postmaster/postmaster.c:2074 postmaster/postmaster.c:2118 +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2177 #, c-format msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." msgstr "Це може бути або помилкою клієнтського програмного забезпечення, або доказом спроби техносферної атаки." -#: postmaster/postmaster.c:2099 +#: postmaster/postmaster.c:2158 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "помилка надсилання GSSAPI в процесі відповіді зв'язування: %m" -#: postmaster/postmaster.c:2117 +#: postmaster/postmaster.c:2176 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "отримані незашифровані дані після запиту шифрування GSSAPI" -#: postmaster/postmaster.c:2141 +#: postmaster/postmaster.c:2200 #, 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:2205 utils/misc/guc.c:7126 utils/misc/guc.c:7162 -#: utils/misc/guc.c:7232 utils/misc/guc.c:8564 utils/misc/guc.c:11530 -#: utils/misc/guc.c:11571 +#: postmaster/postmaster.c:2264 utils/misc/guc.c:7400 utils/misc/guc.c:7436 +#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11979 +#: utils/misc/guc.c:12020 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неприпустиме значення параметру \"%s\": \"%s\"" -#: postmaster/postmaster.c:2208 +#: postmaster/postmaster.c:2267 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Дійсні значення: \"false\", 0, \"true\", 1, \"database\"." -#: postmaster/postmaster.c:2253 +#: postmaster/postmaster.c:2312 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "неприпустима структура стартового пакету: останнім байтом очікувався термінатор" -#: postmaster/postmaster.c:2270 +#: postmaster/postmaster.c:2329 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "не вказано жодного ім'я користувача PostgreSQL у стартовому пакеті" -#: postmaster/postmaster.c:2334 +#: postmaster/postmaster.c:2393 #, c-format msgid "the database system is starting up" msgstr "система бази даних запускається" -#: postmaster/postmaster.c:2340 +#: postmaster/postmaster.c:2399 #, c-format msgid "the database system is not yet accepting connections" msgstr "система бази даних ще не приймає підключення" -#: postmaster/postmaster.c:2341 +#: postmaster/postmaster.c:2400 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "Узгодженого стану відновлення ще не досягнуто." -#: postmaster/postmaster.c:2345 +#: postmaster/postmaster.c:2404 #, c-format msgid "the database system is not accepting connections" msgstr "система бази даних не приймає підключення" -#: postmaster/postmaster.c:2346 +#: postmaster/postmaster.c:2405 #, c-format msgid "Hot standby mode is disabled." msgstr "Режим Hot standby вимкнений." -#: postmaster/postmaster.c:2351 +#: postmaster/postmaster.c:2410 #, c-format msgid "the database system is shutting down" msgstr "система бази даних завершує роботу" -#: postmaster/postmaster.c:2356 +#: postmaster/postmaster.c:2415 #, c-format msgid "the database system is in recovery mode" msgstr "система бази даних у режимі відновлення" -#: postmaster/postmaster.c:2361 storage/ipc/procarray.c:499 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:361 +#: postmaster/postmaster.c:2420 storage/ipc/procarray.c:493 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 #, c-format msgid "sorry, too many clients already" msgstr "вибачте, вже забагато клієнтів" -#: postmaster/postmaster.c:2451 +#: postmaster/postmaster.c:2507 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильний ключ в запиті скасування процесу %d" -#: postmaster/postmaster.c:2463 +#: postmaster/postmaster.c:2519 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d в запиті на скасування не відповідає жодному процесу" -#: postmaster/postmaster.c:2717 +#: postmaster/postmaster.c:2773 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "отримано SIGHUP, поновлення файлів конфігурацій" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2743 postmaster/postmaster.c:2747 +#: postmaster/postmaster.c:2797 postmaster/postmaster.c:2801 #, c-format msgid "%s was not reloaded" msgstr "%s не було перезавантажено" -#: postmaster/postmaster.c:2757 +#: postmaster/postmaster.c:2811 #, c-format msgid "SSL configuration was not reloaded" msgstr "Конфігурація протоколу SSL не була перезавантажена" -#: postmaster/postmaster.c:2813 +#: postmaster/postmaster.c:2867 #, c-format msgid "received smart shutdown request" msgstr "отримано smart запит на завершення роботи" -#: postmaster/postmaster.c:2859 +#: postmaster/postmaster.c:2908 #, c-format msgid "received fast shutdown request" msgstr "отримано швидкий запит на завершення роботи" -#: postmaster/postmaster.c:2877 +#: postmaster/postmaster.c:2926 #, c-format msgid "aborting any active transactions" msgstr "переривання будь-яких активних транзакцій" -#: postmaster/postmaster.c:2901 +#: postmaster/postmaster.c:2950 #, c-format msgid "received immediate shutdown request" msgstr "отримано запит на негайне завершення роботи" -#: postmaster/postmaster.c:2978 +#: postmaster/postmaster.c:3027 #, c-format msgid "shutdown at recovery target" msgstr "завершення роботи при відновленні мети" -#: postmaster/postmaster.c:2996 postmaster/postmaster.c:3032 +#: postmaster/postmaster.c:3045 postmaster/postmaster.c:3081 msgid "startup process" msgstr "стартовий процес" -#: postmaster/postmaster.c:2999 +#: postmaster/postmaster.c:3048 #, c-format msgid "aborting startup due to startup process failure" msgstr "переривання запуску через помилку в стартовому процесі" -#: postmaster/postmaster.c:3074 +#: postmaster/postmaster.c:3121 #, c-format msgid "database system is ready to accept connections" msgstr "система бази даних готова до отримання підключення" -#: postmaster/postmaster.c:3095 +#: postmaster/postmaster.c:3142 msgid "background writer process" msgstr "процес фонового запису" -#: postmaster/postmaster.c:3149 +#: postmaster/postmaster.c:3189 msgid "checkpointer process" msgstr "процес контрольних точок" -#: postmaster/postmaster.c:3165 +#: postmaster/postmaster.c:3205 msgid "WAL writer process" msgstr "Процес запису WAL" -#: postmaster/postmaster.c:3180 +#: postmaster/postmaster.c:3220 msgid "WAL receiver process" msgstr "Процес отримання WAL" -#: postmaster/postmaster.c:3195 +#: postmaster/postmaster.c:3235 msgid "autovacuum launcher process" msgstr "процес запуску автоочистки" -#: postmaster/postmaster.c:3213 +#: postmaster/postmaster.c:3253 msgid "archiver process" msgstr "процес архівації" -#: postmaster/postmaster.c:3228 -msgid "statistics collector process" -msgstr "процес збору статистики" - -#: postmaster/postmaster.c:3242 +#: postmaster/postmaster.c:3266 msgid "system logger process" msgstr "процес системного журналювання" -#: postmaster/postmaster.c:3306 +#: postmaster/postmaster.c:3330 #, c-format msgid "background worker \"%s\"" msgstr "фоновий виконавець \"%s\"" -#: postmaster/postmaster.c:3390 postmaster/postmaster.c:3410 -#: postmaster/postmaster.c:3417 postmaster/postmaster.c:3435 +#: postmaster/postmaster.c:3409 postmaster/postmaster.c:3429 +#: postmaster/postmaster.c:3436 postmaster/postmaster.c:3454 msgid "server process" msgstr "процес сервера" -#: postmaster/postmaster.c:3489 +#: postmaster/postmaster.c:3508 #, 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:3742 +#: postmaster/postmaster.c:3745 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершився з кодом виходу %d" -#: postmaster/postmaster.c:3744 postmaster/postmaster.c:3756 -#: postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 +#: postmaster/postmaster.c:3747 postmaster/postmaster.c:3759 +#: postmaster/postmaster.c:3769 postmaster/postmaster.c:3780 #, 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:3753 +#: postmaster/postmaster.c:3756 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) був перерваний винятком 0x%X" +#: postmaster/postmaster.c:3758 postmaster/shell_archive.c:134 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Опис цього Шістнадцяткового значення дивіться у включаємому C-файлі \"ntstatus.h\"." + #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3763 +#: postmaster/postmaster.c:3766 #, 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:3775 +#: postmaster/postmaster.c:3778 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершився з нерозпізнаним статусом %d" -#: postmaster/postmaster.c:3989 +#: postmaster/postmaster.c:3978 #, c-format msgid "abnormal database system shutdown" msgstr "ненормальне завершення роботи системи бази даних" -#: postmaster/postmaster.c:4027 +#: postmaster/postmaster.c:4004 #, c-format msgid "shutting down due to startup process failure" msgstr "завершення роботи через помилку в стартовому процесі" -#: postmaster/postmaster.c:4033 +#: postmaster/postmaster.c:4010 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "завершення роботи, тому що restart_after_crash вимкнено" -#: postmaster/postmaster.c:4045 +#: postmaster/postmaster.c:4022 #, c-format msgid "all server processes terminated; reinitializing" msgstr "усі серверні процеси перервано; повторна ініціалізація" -#: postmaster/postmaster.c:4219 postmaster/postmaster.c:5570 -#: postmaster/postmaster.c:5961 +#: postmaster/postmaster.c:4194 postmaster/postmaster.c:5522 +#: postmaster/postmaster.c:5920 #, c-format msgid "could not generate random cancel key" msgstr "не вдалося згенерувати випадковий ключ скасування" -#: postmaster/postmaster.c:4273 +#: postmaster/postmaster.c:4256 #, c-format msgid "could not fork new process for connection: %m" msgstr "не вдалося породити нові процеси для з'єднання: %m" -#: postmaster/postmaster.c:4315 +#: postmaster/postmaster.c:4298 msgid "could not fork new process for connection: " msgstr "не вдалося породити нові процеси для з'єднання: " -#: postmaster/postmaster.c:4421 +#: postmaster/postmaster.c:4404 #, c-format msgid "connection received: host=%s port=%s" msgstr "з'єднання отримано: хост=%s порт=%s" -#: postmaster/postmaster.c:4426 +#: postmaster/postmaster.c:4409 #, c-format msgid "connection received: host=%s" msgstr "з'єднання отримано: хост=%s" -#: postmaster/postmaster.c:4669 +#: postmaster/postmaster.c:4646 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "не вдалося виконати серверні процеси \"%s\":%m" -#: postmaster/postmaster.c:4727 +#: postmaster/postmaster.c:4704 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "не вдалося створити відображення файлу параметру внутрішнього сервера: код помилки %lu" -#: postmaster/postmaster.c:4736 +#: postmaster/postmaster.c:4713 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "не вдалося відобразити пам'ять параметру внутрішнього сервера: код помилки %lu" -#: postmaster/postmaster.c:4763 +#: postmaster/postmaster.c:4740 #, c-format msgid "subprocess command line too long" msgstr "командний рядок підпроцесу занадто довгий" -#: postmaster/postmaster.c:4781 +#: postmaster/postmaster.c:4758 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "помилка виклику CreateProcess(): %m (код помилки %lu)" -#: postmaster/postmaster.c:4808 +#: postmaster/postmaster.c:4785 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "не вдалося вимкнути відображення файлу параметру внутрішнього сервера: код помилки %lu" -#: postmaster/postmaster.c:4812 +#: postmaster/postmaster.c:4789 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "не вдалося закрити покажчик файлу параметру внутрішнього сервера: код помилки %lu" -#: postmaster/postmaster.c:4834 +#: postmaster/postmaster.c:4811 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "кількість повторних спроб резервування спільної пам'яті досягло межі" -#: postmaster/postmaster.c:4835 +#: postmaster/postmaster.c:4812 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Це може бути викликано антивірусним програмним забезпеченням або ASLR." -#: postmaster/postmaster.c:5017 +#: postmaster/postmaster.c:4985 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "Не вдалося завантажити конфігурацію SSL в дочірній процес" -#: postmaster/postmaster.c:5143 +#: postmaster/postmaster.c:5110 #, c-format msgid "Please report this to <%s>." msgstr "Будь-ласка повідомте про це <%s>." -#: postmaster/postmaster.c:5230 +#: postmaster/postmaster.c:5182 #, c-format msgid "database system is ready to accept read-only connections" msgstr "система бази даних готова до отримання підключення лише для читання" -#: postmaster/postmaster.c:5494 +#: postmaster/postmaster.c:5446 #, c-format msgid "could not fork startup process: %m" msgstr "не вдалося породити стартовий процес: %m" -#: postmaster/postmaster.c:5498 +#: postmaster/postmaster.c:5450 #, c-format msgid "could not fork archiver process: %m" msgstr "не вдалося породити процес архіватора: %m" -#: postmaster/postmaster.c:5502 +#: postmaster/postmaster.c:5454 #, c-format msgid "could not fork background writer process: %m" msgstr "не вдалося породити фоновий процес запису: %m" -#: postmaster/postmaster.c:5506 +#: postmaster/postmaster.c:5458 #, c-format msgid "could not fork checkpointer process: %m" msgstr "не вдалося породити процес контрольних точок: %m" -#: postmaster/postmaster.c:5510 +#: postmaster/postmaster.c:5462 #, c-format msgid "could not fork WAL writer process: %m" msgstr "не вдалося породити процес запису WAL: %m" -#: postmaster/postmaster.c:5514 +#: postmaster/postmaster.c:5466 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "не вдалося породити процес отримання WAL: %m" -#: postmaster/postmaster.c:5518 +#: postmaster/postmaster.c:5470 #, c-format msgid "could not fork process: %m" msgstr "не вдалося породити процес: %m" -#: postmaster/postmaster.c:5719 postmaster/postmaster.c:5742 +#: postmaster/postmaster.c:5671 postmaster/postmaster.c:5698 #, c-format msgid "database connection requirement not indicated during registration" msgstr "під час реєстрації не вказувалося, що вимагається підключення до бази даних" -#: postmaster/postmaster.c:5726 postmaster/postmaster.c:5749 +#: postmaster/postmaster.c:5682 postmaster/postmaster.c:5709 #, c-format msgid "invalid processing mode in background worker" msgstr "неприпустимий режим обробки у фоновому записі" -#: postmaster/postmaster.c:5834 +#: postmaster/postmaster.c:5794 #, c-format msgid "could not fork worker process: %m" msgstr "не вдалося породити процес запису: %m" -#: postmaster/postmaster.c:5947 +#: postmaster/postmaster.c:5906 #, c-format msgid "no slot available for new worker process" msgstr "немає доступного слоту для нового робочого процесу" -#: postmaster/postmaster.c:6281 +#: postmaster/postmaster.c:6237 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "не вдалося продублювати сокет %d для використання: код помилки %d" -#: postmaster/postmaster.c:6313 +#: postmaster/postmaster.c:6269 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "не вдалося створити успадкований сокет: код помилки %d\n" -#: postmaster/postmaster.c:6342 +#: postmaster/postmaster.c:6298 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "не вдалося відкрити внутрішні змінні файли \"%s\": %s\n" -#: postmaster/postmaster.c:6349 +#: postmaster/postmaster.c:6305 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "не вдалося прочитати внутрішні змінні файли \"%s\": %s\n" -#: postmaster/postmaster.c:6358 +#: postmaster/postmaster.c:6314 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "не вдалося видалити файл \"%s\": %s\n" -#: postmaster/postmaster.c:6375 +#: postmaster/postmaster.c:6331 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "не вдалося відобразити файл серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6384 +#: postmaster/postmaster.c:6340 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "не вдалося вимкнути відображення файлу серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6391 +#: postmaster/postmaster.c:6347 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "не вдалося закрити покажчик файлу серверних змінних: код помилки %lu\n" -#: postmaster/postmaster.c:6553 +#: postmaster/postmaster.c:6506 #, c-format msgid "could not read exit code for process\n" msgstr "не вдалося прочитати код завершення процесу\n" -#: postmaster/postmaster.c:6595 +#: postmaster/postmaster.c:6548 #, c-format msgid "could not post child completion status\n" msgstr "не вдалося надіслати статус завершення нащадка\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 -#, c-format -msgid "could not read from logger pipe: %m" -msgstr "не вдалося прочитати з каналу журналювання: %m" - -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 -#, c-format -msgid "could not create pipe for syslog: %m" -msgstr "не вдалося створити канал для syslog: %m" - -#: postmaster/syslogger.c:636 -#, c-format -msgid "could not fork system logger: %m" -msgstr "не вдалося породити процес системного журналювання: %m" - -#: postmaster/syslogger.c:672 -#, c-format -msgid "redirecting log output to logging collector process" -msgstr "переспрямовування виводу в протокол прочесу збирача протоколів" - -#: postmaster/syslogger.c:673 -#, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "Наступні протоколи будуть виводитись в каталог \"%s\"." - -#: postmaster/syslogger.c:681 -#, c-format -msgid "could not redirect stdout: %m" -msgstr "не вдалося переспрямувати stdout: %m" - -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 -#, c-format -msgid "could not redirect stderr: %m" -msgstr "не вдалося переспрямувати stderr: %m" - -#: postmaster/syslogger.c:1108 -#, c-format -msgid "could not write to log file: %s\n" -msgstr "не вдалося записати до файлу протокола: %s\n" - -#: postmaster/syslogger.c:1225 -#, c-format -msgid "could not open log file \"%s\": %m" -msgstr "не вдалося відкрити файл журналу \"%s\": %m" - -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 -#, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "вимкнення автоматичного обертання (щоб повторно ввімкнути, використайте SIGHUP)" - -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "не вдалося визначити які параметри сортування використати для регулярного виразу" - -#: regex/regc_pg_locale.c:269 -#, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "недетерміновані правила сортування не підтримуються для регулярних виразів" - -#: replication/backup_manifest.c:251 -#, c-format -msgid "expected end timeline %u but found timeline %u" -msgstr "очікувався кінець часової шкали %u але знайдено часову шкалу %u" - -#: replication/backup_manifest.c:275 -#, c-format -msgid "expected start timeline %u but found timeline %u" -msgstr "очікувався початок часової шкали %u але знайдено часову шкалу %u" - -#: 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:353 -#, c-format -msgid "could not rewind temporary file" -msgstr "не вдалося перемотати назад тимчасовий файл" - -#: replication/backup_manifest.c:380 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "не вдалося прочитати тимчасовий файл: прочитано лише %zu з %zu байт" - -#: replication/basebackup.c:546 -#, c-format -msgid "could not find any WAL files" -msgstr "не вдалося знайти ні одного файла WAL" - -#: 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:629 replication/basebackup.c:659 +#: postmaster/shell_archive.c:123 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "неочікуаний розмір файлу WAL \"%s\"" +msgid "archive command failed with exit code %d" +msgstr "команда архівації завершилась помилкой з кодом %d" -#: replication/basebackup.c:644 replication/basebackup.c:1777 +#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 +#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "в процесі базового резервного копіювання не вдалося передати дані, копіювання переривається" +msgid "The failed archive command was: %s" +msgstr "Команда архівації з помилкою: %s" -#: replication/basebackup.c:722 +#: postmaster/shell_archive.c:132 #, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] "всього помилок перевірки контрольних сум: %lld" -msgstr[1] "всього помилок перевірки контрольних сум: %lld" -msgstr[2] "всього помилок перевірки контрольних сум: %lld" -msgstr[3] "всього помилок перевірки контрольних сум: %lld" +msgid "archive command was terminated by exception 0x%X" +msgstr "команда архівації була перервана винятком 0x%X" -#: replication/basebackup.c:729 +#: postmaster/shell_archive.c:139 #, c-format -msgid "checksum verification failure during base backup" -msgstr "під час базового резервного копіювання виявлено неполадки контрольних сум" +msgid "archive command was terminated by signal %d: %s" +msgstr "команда архівації була перервана сигналом %d: %s" -#: 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 +#: postmaster/shell_archive.c:148 #, c-format -msgid "duplicate option \"%s\"" -msgstr "повторюваний параметр \"%s\"" +msgid "archive command exited with unrecognized status %d" +msgstr "команда архівації завершена з нерозпізнаним статусом %d" -#: replication/basebackup.c:842 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d за припустимим діапазномо для параметру \"%s\" (%d .. %d)" +msgid "could not read from logger pipe: %m" +msgstr "не вдалося прочитати з каналу журналювання: %m" -#: replication/basebackup.c:887 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "нерозпізнаний параметр маніфесту: \"%s\"" +msgid "could not create pipe for syslog: %m" +msgstr "не вдалося створити канал для syslog: %m" -#: replication/basebackup.c:903 +#: postmaster/syslogger.c:677 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\"" +msgid "could not fork system logger: %m" +msgstr "не вдалося породити процес системного журналювання: %m" -#: replication/basebackup.c:918 +#: postmaster/syslogger.c:713 #, c-format -msgid "manifest checksums require a backup manifest" -msgstr "контрольні суми маніфесту потребують резервного копіювання маніфесту" +msgid "redirecting log output to logging collector process" +msgstr "переспрямовування виводу в протокол прочесу збирача протоколів" -#: replication/basebackup.c:1525 +#: postmaster/syslogger.c:714 #, c-format -msgid "skipping special file \"%s\"" -msgstr "спеціальний файл \"%s\" пропускається" +msgid "Future log output will appear in directory \"%s\"." +msgstr "Наступні протоколи будуть виводитись в каталог \"%s\"." -#: replication/basebackup.c:1646 +#: postmaster/syslogger.c:722 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "неприпустимий номер сегменту %d в файлі \"%s\"" +msgid "could not redirect stdout: %m" +msgstr "не вдалося переспрямувати stdout: %m" -#: replication/basebackup.c:1684 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" -msgstr "не вдалося перевірити контрольну суму у файлі \"%s\", блок %u: розмір прочитаного буфера %d і розмір прочитаної сторінки %d відрізняються" +msgid "could not redirect stderr: %m" +msgstr "не вдалося переспрямувати stderr: %m" -#: replication/basebackup.c:1757 +#: postmaster/syslogger.c:1177 #, c-format -msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" -msgstr "помилка перевірки контрольної суми у файлі \"%s\", блок %u: обчислено %X, але очікувалось %X" +msgid "could not write to log file: %s\n" +msgstr "не вдалося записати до файлу протокола: %s\n" -#: replication/basebackup.c:1764 +#: postmaster/syslogger.c:1295 #, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "про подальші помилки під час перевірки контрольної суми в файлі \"%s\" повідомлятись не буде" +msgid "could not open log file \"%s\": %m" +msgstr "не вдалося відкрити файл журналу \"%s\": %m" -#: replication/basebackup.c:1822 +#: postmaster/syslogger.c:1385 #, 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" -msgstr[2] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" -msgstr[3] "файл \"%s\" має загальну кількість помилок перевірки контрольної суми: %d" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "вимкнення автоматичного обертання (щоб повторно ввімкнути, використайте SIGHUP)" -#: replication/basebackup.c:1858 +#: regex/regc_pg_locale.c:242 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "ім'я файлу занадто довге для tar формату: \"%s\"" +msgid "could not determine which collation to use for regular expression" +msgstr "не вдалося визначити які параметри сортування використати для регулярного виразу" -#: replication/basebackup.c:1863 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" -msgstr "мета символьного посилання занадто довга для формату tar: ім'я файлу \"%s\", мета \"%s\"" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "недетерміновані правила сортування не підтримуються для регулярних виразів" -#: replication/libpqwalreceiver/libpqwalreceiver.c:220 +#: replication/libpqwalreceiver/libpqwalreceiver.c:233 #, c-format msgid "could not clear search path: %s" msgstr "не вдалося очистити шлях пошуку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/libpqwalreceiver/libpqwalreceiver.c:273 #, c-format msgid "invalid connection string syntax: %s" msgstr "неприпустимий синтаксис рядка підключення: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:299 #, c-format msgid "could not parse connection string: %s" msgstr "не вдалося аналізувати рядок підключення: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:372 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "не вдалося отримати ідентифікатор системи бази даних та ідентифікатор часової шкали з основного серверу: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:371 -#: replication/libpqwalreceiver/libpqwalreceiver.c:605 +#: replication/libpqwalreceiver/libpqwalreceiver.c:388 +#: replication/libpqwalreceiver/libpqwalreceiver.c:626 #, c-format msgid "invalid response from primary server" msgstr "неприпустима відповідь з основного серверу" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:389 #, 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:448 -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:469 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:506 #, c-format msgid "could not start WAL streaming: %s" msgstr "не вдалося почати потокове передавання WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:509 +#: replication/libpqwalreceiver/libpqwalreceiver.c:530 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не вдалося передати основному серверу повідомлення про кінець передвання: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:532 +#: replication/libpqwalreceiver/libpqwalreceiver.c:553 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неочікуваний набір результатів після кінця передачі" -#: replication/libpqwalreceiver/libpqwalreceiver.c:547 +#: replication/libpqwalreceiver/libpqwalreceiver.c:568 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "помилка при завершенні потокового передавання \"копіювати\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:557 +#: replication/libpqwalreceiver/libpqwalreceiver.c:578 #, c-format msgid "error reading result of streaming command: %s" msgstr "помилка при читанні результату команди потокового передавання: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:566 -#: replication/libpqwalreceiver/libpqwalreceiver.c:804 +#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:825 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неочікуваний результат CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:593 +#: replication/libpqwalreceiver/libpqwalreceiver.c:614 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не вдалося отримати файл історії часової шкали з основного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:627 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Очікувалося 1 кортеж з 2 поле, отримано %d кортежів з %d полями." -#: replication/libpqwalreceiver/libpqwalreceiver.c:767 -#: replication/libpqwalreceiver/libpqwalreceiver.c:820 -#: replication/libpqwalreceiver/libpqwalreceiver.c:827 +#: replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:841 +#: replication/libpqwalreceiver/libpqwalreceiver.c:848 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не вдалося отримати дані з WAL потоку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:847 +#: replication/libpqwalreceiver/libpqwalreceiver.c:868 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не вдалося передати дані потоку WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:901 +#: replication/libpqwalreceiver/libpqwalreceiver.c:960 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не вдалося створити слот реплікації \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:947 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1006 #, c-format msgid "invalid query response" msgstr "неприпустима відповідь на запит" -#: replication/libpqwalreceiver/libpqwalreceiver.c:948 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1007 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Очікувалося %d полів, отримано %d полі." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1018 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1077 #, c-format msgid "the query interface requires a database connection" msgstr "інтерфейс запитів вимагає підключення до бази даних" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1049 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1108 msgid "empty query" msgstr "пустий запит" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1114 msgid "unexpected pipeline mode" msgstr "неочікуваний режим конвеєра" -#: replication/logical/launcher.c:286 +#: replication/logical/launcher.c:285 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "неможливо почати логічні записи реплікацій, коли max_replication_slots = 0" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:365 #, c-format msgid "out of logical replication worker slots" msgstr "недостатньо слотів для процесів логічної реплікації" -#: replication/logical/launcher.c:367 +#: replication/logical/launcher.c:366 #, c-format msgid "You might need to increase max_logical_replication_workers." msgstr "Можливо, вам слід збільшити max_logical_replication_workers." @@ -18780,111 +19352,106 @@ msgstr "логічне декодування вимагає підключен msgid "logical decoding cannot be used while in recovery" msgstr "логічне декодування неможливо використовувати під час відновлення" -#: 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 "неможливо використовувати слот невідповідної реплікації для логічного кодування" -#: 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 "слот реплікації \"%s\" був створений не в цій базі даних" -#: 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 "неможливо створити слот логічної реплікації у транзакції, що виконує записування" -#: replication/logical/logical.c:549 +#: replication/logical/logical.c:570 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "початок логічного декодування для слоту \"%s\"" -#: replication/logical/logical.c:551 +#: replication/logical/logical.c:572 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Потокове передавання транзакцій, що затверджені, після %X/%X, читання WAL з %X/%X." -#: replication/logical/logical.c:696 +#: replication/logical/logical.c:720 #, 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:702 +#: replication/logical/logical.c:726 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "слот \"%s\", плагін виходу \"%s\", у зворотньому виклику %s" -#: replication/logical/logical.c:873 replication/logical/logical.c:918 -#: replication/logical/logical.c:963 replication/logical/logical.c:1009 +#: replication/logical/logical.c:897 replication/logical/logical.c:942 +#: replication/logical/logical.c:987 replication/logical/logical.c:1033 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "логічна реплікація під час підготовки потребує %s зворотнього виклику" -#: replication/logical/logical.c:1241 replication/logical/logical.c:1290 -#: replication/logical/logical.c:1331 replication/logical/logical.c:1417 -#: replication/logical/logical.c:1466 +#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 +#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 +#: replication/logical/logical.c:1490 #, c-format msgid "logical streaming requires a %s callback" msgstr "логічне потокове передавання потребує %s зворотнього виклику" -#: replication/logical/logical.c:1376 +#: replication/logical/logical.c:1400 #, 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" -msgstr "має бути право суперкористувача або реплікації для використання реплікаційних слотів" - -#: 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 "масив має бути одновимірним" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:165 #, c-format msgid "array must not contain nulls" msgstr "масив не має включати nulls" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 +#: utils/adt/jsonb.c:1302 #, 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:650 +#: 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 "Цей слот ніколи раніше не резервував 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 "неможливо маніпулювати джерелами реплікації під час відновлення" @@ -18896,18 +19463,18 @@ msgstr "джерело реплікації \"%s\" не існує" #: replication/logical/origin.c:319 #, c-format -msgid "could not find free replication origin OID" -msgstr "не вдалося знайти вільний ідентифікатор OID джерела реплікації" +msgid "could not find free replication origin ID" +msgstr "не вдалося знайти вільний ідентифікатор ID джерела реплікації" #: 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" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "не вдалося розірвати джерело реплікації з ідентифікатором ID %d, використовується PID %d" #: replication/logical/origin.c:476 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "джерело реплікації з ідентифікатором OID %u не існує" +msgid "replication origin with ID %d does not exist" +msgstr "джерело реплікації з ідентифікатором ID %d не існує" #: replication/logical/origin.c:741 #, c-format @@ -18921,47 +19488,47 @@ msgstr "не вдалося знайти вільний слот для стан #: replication/logical/origin.c:790 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "відновлений стан реплікації вузла %u в %X/%X" +msgid "recovered replication state of node %d to %X/%X" +msgstr "відновлений стан реплікації вузла %d в %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: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 "джерело реплікації з OID %d вже активний для PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "джерело реплікації з ID %d вже активний для 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 "не вдалося знайти вільний слот стану реплікації для джерела реплікації з OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "не вдалося знайти вільний слот стану реплікації для джерела реплікації з ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1128 -#: replication/slot.c:1867 +#: replication/logical/origin.c:941 replication/logical/origin.c:1131 +#: replication/slot.c:1947 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Збільшіть max_replication_slots і спробуйте знову." -#: replication/logical/origin.c:1085 +#: replication/logical/origin.c:1088 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "не можна налаштувати джерело реплікації, коли один вже налаштований" -#: 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 "жодне джерело реплікації не налаштоване" -#: replication/logical/origin.c:1248 +#: replication/logical/origin.c:1251 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "назва джерела реплікації \"%s\" зарезервована" -#: replication/logical/origin.c:1250 +#: replication/logical/origin.c:1253 #, c-format msgid "Origin names starting with \"pg_\" are reserved." msgstr "Назви джерел, які починаються на \"pg_\" зарезервовані." @@ -18995,39 +19562,39 @@ msgstr "в цільовому відношенні логічної реплік msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "цільове відношення логічної реплікації \"%s.%s\" не існує" -#: replication/logical/reorderbuffer.c:3834 +#: replication/logical/reorderbuffer.c:3841 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не вдалося записати у файл даних для XID %u: %m" -#: replication/logical/reorderbuffer.c:4180 -#: replication/logical/reorderbuffer.c:4205 +#: replication/logical/reorderbuffer.c:4187 +#: replication/logical/reorderbuffer.c:4212 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не вдалося прочитати з файлу розгортання буферу пересортування: %m" -#: replication/logical/reorderbuffer.c:4184 -#: replication/logical/reorderbuffer.c:4209 +#: replication/logical/reorderbuffer.c:4191 +#: replication/logical/reorderbuffer.c:4216 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "не вдалося прочитати з файлу розгортання буферу пересортування: прочитано %d замість %u байт" -#: replication/logical/reorderbuffer.c:4459 +#: replication/logical/reorderbuffer.c:4466 #, 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:4958 +#: replication/logical/reorderbuffer.c:4965 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не вдалося прочитати з файлу \"%s\": прочитано %d замість %d байт" -#: replication/logical/snapbuild.c:625 +#: replication/logical/snapbuild.c:646 #, c-format msgid "initial slot snapshot too large" msgstr "початковий знімок слота занадто великий" -#: replication/logical/snapbuild.c:679 +#: replication/logical/snapbuild.c:700 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" @@ -19036,379 +19603,464 @@ msgstr[1] "експортовано знімок логічного декоду msgstr[2] "експортовано знімок логічного декодування \"%s\" з %u ID транзакціями" msgstr[3] "експортовано знімок логічного декодування \"%s\" з %u ID транзакціями" -#: replication/logical/snapbuild.c:1358 replication/logical/snapbuild.c:1465 -#: replication/logical/snapbuild.c:1996 +#: replication/logical/snapbuild.c:1379 replication/logical/snapbuild.c:1486 +#: replication/logical/snapbuild.c:2015 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "узгодження процесу логічного кодування знайдено в точці %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1381 #, c-format msgid "There are no running transactions." msgstr "Більше активних транзакцій немає." -#: replication/logical/snapbuild.c:1416 +#: replication/logical/snapbuild.c:1437 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "початкова стартова точка процесу логічного декодування знайдена в точці %X/%X" -#: replication/logical/snapbuild.c:1418 replication/logical/snapbuild.c:1442 +#: replication/logical/snapbuild.c:1439 replication/logical/snapbuild.c:1463 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Очікування транзакцій (приблизно %d) старіше, ніж %u до кінця." -#: replication/logical/snapbuild.c:1440 +#: replication/logical/snapbuild.c:1461 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "початкова точка узгодження процесу логічного кодування знайдена в точці %X/%X" -#: replication/logical/snapbuild.c:1467 +#: replication/logical/snapbuild.c:1488 #, c-format msgid "There are no old transactions anymore." msgstr "Більше старих транзакцій немає." -#: replication/logical/snapbuild.c:1864 +#: replication/logical/snapbuild.c:1883 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл стану snapbuild \"%s\" має неправильне магічне число: %u замість %u" -#: replication/logical/snapbuild.c:1870 +#: replication/logical/snapbuild.c:1889 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "файл стану snapbuild \"%s\" має непідтримуючу версію: %u замість %u" -#: replication/logical/snapbuild.c:1941 +#: replication/logical/snapbuild.c:1960 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "у файлі стану snapbuild \"%s\" невідповідність контрольної суми: %u, повинно бути %u" -#: replication/logical/snapbuild.c:1998 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логічне декодування почнеться зі збереженого знімку." -#: replication/logical/snapbuild.c:2070 +#: replication/logical/snapbuild.c:2089 #, c-format msgid "could not parse file name \"%s\"" msgstr "не вдалося аналізувати ім'я файлу \"%s\"" -#: 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 "процес синхронізації таблиці при логічній реплікації для підписки \"%s\", таблиці \"%s\" закінчив обробку" -#: replication/logical/tablesync.c:727 replication/logical/tablesync.c:770 +#: 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 "застосовуючий процес логічної реплікації для підписки \"%s\" буде перезавантажено, щоб можна було активувати two_phase" + +#: replication/logical/tablesync.c:741 replication/logical/tablesync.c:882 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "не вдалося отримати інформацію про таблицю \"%s.%s\" з серверу публікації: %s" -#: replication/logical/tablesync.c:734 +#: replication/logical/tablesync.c:748 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблиця \"%s.%s\" не знайдена на сервері публікації" -#: replication/logical/tablesync.c:858 +#: replication/logical/tablesync.c:805 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "не вдалося отримати інформацію про список стовпців для таблиці \"%s.%s\" з серверу публікації: %s" + +#: replication/logical/tablesync.c:984 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "не вдалося отримати інформацію про вираз WHERE для таблиці \"%s.%s\" з серверу публікації: %s" + +#: replication/logical/tablesync.c:1129 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "не вдалося почати копіювання початкового змісту таблиці \"%s.%s\": %s" -#: replication/logical/tablesync.c:1059 +#: replication/logical/tablesync.c:1341 replication/logical/worker.c:1635 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "користувач \"%s\" не може реплікувати у відношення з увімкненим захистом на рівні рядків: \"%s\"" + +#: replication/logical/tablesync.c:1356 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "копії таблиці не вдалося запустити транзакцію на сервері публікації: %s" -#: replication/logical/tablesync.c:1100 +#: replication/logical/tablesync.c:1398 #, c-format msgid "replication origin \"%s\" already exists" msgstr "джерело реплікації \"%s\" вже існує" -#: replication/logical/tablesync.c:1113 +#: replication/logical/tablesync.c:1411 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "копії таблиці не вдалося завершити транзакцію на сервері публікації: %s" -#: replication/logical/worker.c:518 -#, c-format -msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" -msgstr "обробка віддалених даних для цільового зв'язку реплікації \"%s.%s\" стовпця \"%s\"" - -#: replication/logical/worker.c:593 replication/logical/worker.c:719 +#: 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:1090 replication/logical/worker.c:1105 +#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 #, c-format msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" msgstr "не вдалося прочитати з файлу змін потокової транзакції \"%s\": прочитано лише %zu з %zu байтів" -#: replication/logical/worker.c:1346 +#: replication/logical/worker.c:1761 #, 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:1353 +#: replication/logical/worker.c:1768 #, 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:2251 +#: replication/logical/worker.c:2582 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "неприпустимий тип повідомлення логічної реплікації \"??? (%d)\"" + +#: replication/logical/worker.c:2746 #, c-format msgid "data stream from publisher has ended" msgstr "потік даних з серверу публікації завершився" -#: replication/logical/worker.c:2402 +#: replication/logical/worker.c:2897 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершення процесу логічної реплікації через тайм-аут" -#: replication/logical/worker.c:2550 +#: replication/logical/worker.c:3059 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде зупинено, тому, що підписка була видалена" -#: replication/logical/worker.c:2564 +#: replication/logical/worker.c:3070 #, c-format msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" буде зупинено, тому, що підписка була вимкнута" -#: replication/logical/worker.c:2586 +#: replication/logical/worker.c:3096 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" msgstr "процес, що застосовує логічну реплікацію для підписки \"%s\", буде перезавантажено через зміну параметру" -#: replication/logical/worker.c:2751 replication/logical/worker.c:2776 +#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 #, c-format msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" msgstr "не вдалося прочитати з файлу subxact потокової транзакції \"%s\": прочитано лише %zu з %zu байтів" -#: replication/logical/worker.c:3136 +#: replication/logical/worker.c:3645 #, 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:3148 +#: replication/logical/worker.c:3657 #, 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:3166 +#: replication/logical/worker.c:3675 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "просец синхронізації таблиці під час логічної реплікації для підписки \"%s\", таблиці \"%s\" запущений" -#: replication/logical/worker.c:3170 +#: replication/logical/worker.c:3679 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" запущений" -#: replication/logical/worker.c:3208 +#: replication/logical/worker.c:3720 #, c-format msgid "subscription has no replication slot set" msgstr "для підписки не встановлений слот реплікації" -#: replication/pgoutput/pgoutput.c:196 +#: replication/logical/worker.c:3856 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "підписка \"%s\" була відключена через помилку" + +#: replication/logical/worker.c:3895 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "логічна реплікація починає пропускати транзакцію в LSN %X/%X" + +#: replication/logical/worker.c:3909 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "логічна реплікація завершила пропускати транзакцію в LSN %X/%X" + +#: replication/logical/worker.c:3991 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "очищено LSN пропуску підписки \"%s\"" + +#: replication/logical/worker.c:3992 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "Кінцеве розташування WAL віддаленої транзакції (LSN) %X/%X не відповідає skip-LSN %X/%X." + +#: replication/logical/worker.c:4018 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\"" + +#: replication/logical/worker.c:4022 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" у транзакції %u" + +#: replication/logical/worker.c:4027 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" у транзакції %u завершено о %X/%X" + +#: replication/logical/worker.c:4034 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" в транзакції %u завершено о %X/%X" + +#: replication/logical/worker.c:4042 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" стовпчик \"%s\" у транзакції %u завершено о %X/%X" + +#: replication/pgoutput/pgoutput.c:319 #, c-format msgid "invalid proto_version" msgstr "неприпустиме значення proto_version" -#: replication/pgoutput/pgoutput.c:201 +#: replication/pgoutput/pgoutput.c:324 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значення proto_version \"%s\" за межами діапазону" -#: replication/pgoutput/pgoutput.c:218 +#: replication/pgoutput/pgoutput.c:341 #, c-format msgid "invalid publication_names syntax" msgstr "неприпустимий синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:289 +#: replication/pgoutput/pgoutput.c:426 #, 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:295 +#: replication/pgoutput/pgoutput.c:432 #, 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:301 +#: replication/pgoutput/pgoutput.c:438 #, c-format msgid "publication_names parameter missing" msgstr "пропущено параметр publication_names" -#: replication/pgoutput/pgoutput.c:314 +#: replication/pgoutput/pgoutput.c:451 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "запитувана proto_version=%d не підтримує потокову передачу, потребується %d або вища" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:456 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запитане потокова передавача, але не підтримується плагіном виводу" -#: replication/slot.c:180 +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "запитувана proto_version=%d не підтримує двоетапне затвердження, потрібна %d або вища" + +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "запитано двоетапне затвердження, але не підтримується плагіном виводу" + +#: replication/slot.c:205 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "ім'я слоту реплікації \"%s\" занадто коротке" -#: replication/slot.c:189 +#: replication/slot.c:214 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "ім'я слоту реплікації \"%s\" занадто довге" -#: replication/slot.c:202 +#: replication/slot.c:227 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "ім'я слоту реплікації \"%s\" містить неприпустимий символ" -#: replication/slot.c:204 +#: replication/slot.c:229 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Імена слота реплікації можуть містити лише букви в нижньому кейсі, числа, і символ підкреслення." -#: replication/slot.c:258 +#: replication/slot.c:283 #, c-format msgid "replication slot \"%s\" already exists" msgstr "слот реплікації \"%s\" вже існує" -#: replication/slot.c:268 +#: replication/slot.c:293 #, c-format msgid "all replication slots are in use" msgstr "використовуються всі слоти реплікації" -#: replication/slot.c:269 +#: replication/slot.c:294 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Звільніть непотрібні або збільшіть max_replication_slots." -#: replication/slot.c:402 replication/slotfuncs.c:761 -#: utils/adt/pgstatfuncs.c:2228 +#: replication/slot.c:472 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:448 replication/slot.c:1025 +#: replication/slot.c:518 replication/slot.c:1093 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот реплікації \"%s\" активний для PID %d" -#: replication/slot.c:676 replication/slot.c:1419 replication/slot.c:1802 +#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 #, c-format msgid "could not remove directory \"%s\"" msgstr "не вдалося видалити каталог \"%s\"" -#: replication/slot.c:1060 +#: replication/slot.c:1128 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "слоти реплікації можна використовувати лише якщо max_replication_slots > 0" -#: replication/slot.c:1065 +#: replication/slot.c:1133 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "слоти реплікації можна використовувати лише якщо wal_level >= replica" -#: replication/slot.c:1250 +#: replication/slot.c:1145 +#, c-format +msgid "must be superuser or replication role to use replication slots" +msgstr "має бути право суперкористувача або реплікації для використання реплікаційних слотів" + +#: replication/slot.c:1330 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "завершення процесу %d для звільнення слоту реплікації \"%s\"" -#: replication/slot.c:1288 +#: replication/slot.c:1368 #, 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:1740 +#: replication/slot.c:1820 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл слоту реплікації \"%s\" має неправильне магічне число: %u замість %u" -#: replication/slot.c:1747 +#: replication/slot.c:1827 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл слоту реплікації \"%s\" має непідтримуючу версію %u" -#: replication/slot.c:1754 +#: replication/slot.c:1834 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "файл слоту реплікації \"%s\" має пошкоджену довжину %u" -#: replication/slot.c:1790 +#: replication/slot.c:1870 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "у файлі слоту реплікації \"%s\" невідповідність контрольної суми: %u, повинно бути %u" -#: replication/slot.c:1824 +#: replication/slot.c:1904 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "слот логічної реплікації \"%s\" існує, але wal_level < logical" -#: replication/slot.c:1826 +#: replication/slot.c:1906 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Змініть wal_level на logical або вище." -#: replication/slot.c:1830 +#: replication/slot.c:1910 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "слот фізичної реплікації \"%s\" існує, але wal_level < replica" -#: replication/slot.c:1832 +#: replication/slot.c:1912 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Змініть wal_level на replica або вище." -#: replication/slot.c:1866 +#: replication/slot.c:1946 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершенням роботи активно занадто багато слотів реплікації" -#: replication/slotfuncs.c:626 +#: replication/slotfuncs.c:592 #, c-format msgid "invalid target WAL LSN" msgstr "неприпустима ціль WAL LSN" -#: replication/slotfuncs.c:648 +#: replication/slotfuncs.c:614 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "слот реплікації \"%s\" не може бути розширеним" -#: replication/slotfuncs.c:666 +#: 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:773 +#: replication/slotfuncs.c:739 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "не можна скопіювати слот фізичної реплікації \"%s\" як слот логічної реплікації" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:741 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "не можна скопіювати слот логічної реплікації \"%s\" як слот фізичної реплікації" -#: replication/slotfuncs.c:782 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "не можна скопіювати слот реплікації, який не резервує WAL" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:825 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не вдалося скопіювати слот реплікації \"%s\"" -#: replication/slotfuncs.c:861 +#: replication/slotfuncs.c:827 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Слот реплікації джерела був змінений несумісно під час операції копіювання." -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:833 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "не можна скопіювати незавершений слот логічної реплікації \"%s\"" -#: replication/slotfuncs.c:869 +#: replication/slotfuncs.c:835 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Повторіть, коли confirmed_flush_lsn слоту джерела реплікації є дійсним." @@ -19448,415 +20100,425 @@ msgstr "помилка при аналізуванні synchronous_standby_names msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "кількість синхронних режимів очікування (%d) повинно бути більше нуля" -#: replication/walreceiver.c:161 +#: replication/walreceiver.c:164 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершення процесу walreceiver по команді адміністратора" -#: replication/walreceiver.c:289 +#: replication/walreceiver.c:292 #, c-format msgid "could not connect to the primary server: %s" msgstr "не вдалося підключитися до основного серверу: %s" -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:339 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "ідентифікатор системи бази даних на основному і резервному серверах відрізняються" -#: replication/walreceiver.c:337 +#: 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:348 +#: replication/walreceiver.c:351 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "остання часова шкала %u на основному сервері відстає від відновлюючої часової шкали %u" -#: replication/walreceiver.c:402 +#: replication/walreceiver.c:404 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "запущено потокове передавання WAL з основного серверу з позиції %X/%X на часовій шкалі %u" -#: replication/walreceiver.c:406 +#: replication/walreceiver.c:408 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуска потокового передавання WAL з позиції %X/%X на часовій шкалі %u" -#: replication/walreceiver.c:435 +#: replication/walreceiver.c:437 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продовжити потокове передавання WAL не можна, відновлення вже завершено" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:475 #, c-format msgid "replication terminated by primary server" msgstr "реплікація завершена основним сервером" -#: replication/walreceiver.c:473 +#: 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:562 +#: replication/walreceiver.c:565 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершення процесу walreceiver через тайм-аут" -#: replication/walreceiver.c:600 +#: replication/walreceiver.c:603 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "основний сервер більше не містить WAL для запитаної часової шкали %u" -#: replication/walreceiver.c:616 replication/walreceiver.c:1036 +#: replication/walreceiver.c:619 replication/walreceiver.c:1045 #, c-format msgid "could not close log segment %s: %m" msgstr "не вдалося закрити сегмент журналу %s: %m" -#: replication/walreceiver.c:735 +#: replication/walreceiver.c:738 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "отримання файлу історії часової шкали для часової шкали %u з основного серверу" -#: replication/walreceiver.c:927 +#: 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:525 storage/smgr/md.c:1324 +#: replication/walsender.c:521 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "використовувати %s зі слотом логічної реплікації не можна" + +#: replication/walsender.c:638 storage/smgr/md.c:1367 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не вдалося досягти кінця файлу \"%s\": %m" -#: replication/walsender.c:529 +#: replication/walsender.c:642 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не вдалося знайти початок файлу \"%s\": %m" -#: replication/walsender.c:580 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "Команда IDENTIFY_SYSTEM не виконувалась до START_REPLICATION" - -#: replication/walsender.c:609 +#: replication/walsender.c:719 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "використовувати логічний слот реплікації для фізичної реплікації, не можна" -#: replication/walsender.c:678 +#: replication/walsender.c:785 #, 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:681 +#: replication/walsender.c:788 #, 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:832 #, 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:1015 +#, 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:975 +#: replication/walsender.c:1100 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s не має викликатися всередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:985 +#: replication/walsender.c:1110 #, c-format msgid "%s must be called inside a transaction" msgstr "%s має викликатися всередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:991 +#: replication/walsender.c:1116 #, 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:997 +#: replication/walsender.c:1122 #, c-format msgid "%s must be called before any query" msgstr "%s має викликатися до будь-якого запиту" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1003 +#: replication/walsender.c:1128 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s не має викликатися всередині підтранзакції" -#: replication/walsender.c:1146 +#: replication/walsender.c:1271 #, c-format msgid "cannot read from logical replication slot \"%s\"" msgstr "не можна прочитати із слоту логічної реплікації \"%s\"" -#: replication/walsender.c:1148 +#: replication/walsender.c:1273 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Цей слот визнано недійсним, тому що він перевищив максимально зарезервований розмір." -#: replication/walsender.c:1158 +#: replication/walsender.c:1283 #, c-format msgid "terminating walsender process after promotion" msgstr "завершення процесу walsender після підвищення" -#: replication/walsender.c:1552 +#: replication/walsender.c:1704 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "не можна виконувати нові команди, поки процес відправки WAL знаходиться в режимі зупинки" -#: replication/walsender.c:1587 +#: replication/walsender.c:1739 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "не можна виконувати команди SQL в процесі відправки WAL для фізичної реплікації" -#: replication/walsender.c:1620 +#: replication/walsender.c:1772 #, c-format msgid "received replication command: %s" msgstr "отримано команду реплікації: %s" -#: replication/walsender.c:1628 tcop/fastpath.c:208 tcop/postgres.c:1077 -#: tcop/postgres.c:1436 tcop/postgres.c:1697 tcop/postgres.c:2166 -#: tcop/postgres.c:2599 tcop/postgres.c:2678 +#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 +#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 +#: tcop/postgres.c:2614 tcop/postgres.c:2692 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "поточна транзакція перервана, команди до кінця блока транзакції пропускаються" -#: replication/walsender.c:1763 replication/walsender.c:1798 +#: replication/walsender.c:1922 replication/walsender.c:1957 #, c-format msgid "unexpected EOF on standby connection" msgstr "неочікуваний обрив з'єднання з резервним сервером" -#: replication/walsender.c:1786 +#: replication/walsender.c:1945 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неприпустимий тип повідомлення резервного серверу \"%c\"" -#: replication/walsender.c:1875 +#: replication/walsender.c:2034 #, c-format msgid "unexpected message type \"%c\"" msgstr "неочікуваний тип повідомлення \"%c\"" -#: replication/walsender.c:2288 +#: replication/walsender.c:2447 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершення процесу walsender через тайм-аут реплікації" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" для зв'язка \"%s\" вже існує" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#, 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 "Правила INSTEAD NOTHING для SELECT не реалізовані" -#: 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:435 +#: rewrite/rewriteDefine.c:436 #, c-format msgid "cannot convert partitioned table \"%s\" to a view" msgstr "перетворити секціоновану таблицю \"%s\" на подання, не можна" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:445 #, c-format msgid "cannot convert partition \"%s\" to a view" msgstr "перетворити секцію \"%s\" на подання, не можна" -#: 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 "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона не пуста" -#: rewrite/rewriteDefine.c:462 +#: rewrite/rewriteDefine.c:463 #, c-format msgid "could not convert table \"%s\" to a view because it has triggers" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має тригери" -#: rewrite/rewriteDefine.c:464 +#: rewrite/rewriteDefine.c:465 #, c-format msgid "In particular, the table cannot be involved in any foreign key relationships." msgstr "Крім того, таблиця не може бути включена в зв'язок зовнішніх ключів." -#: rewrite/rewriteDefine.c:469 +#: rewrite/rewriteDefine.c:470 #, c-format msgid "could not convert table \"%s\" to a view because it has indexes" msgstr "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має індекси" -#: 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 "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має дочірні таблиці" -#: 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 "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має батьківські таблиці" -#: 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 "не вдалося перетворити таблицю \"%s\" на подання, тому, що для неї активований захист на рівні рядків" -#: 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 "не вдалося перетворити таблицю \"%s\" на подання, тому, що вона має політику захисту рядків" -#: rewrite/rewriteDefine.c:520 +#: rewrite/rewriteDefine.c:521 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "правило не може мати декілька списків RETURNING" -#: rewrite/rewriteDefine.c:525 +#: rewrite/rewriteDefine.c:526 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "Умовні правила не підтримують списки RETURNING" -#: rewrite/rewriteDefine.c:529 +#: rewrite/rewriteDefine.c:530 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "Правила non-INSTEAD не підтримують списки RETURNING" -#: rewrite/rewriteDefine.c:543 +#: rewrite/rewriteDefine.c:544 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "правило не-подання для \"%s\" не повинно мати назву \"%s\"" -#: rewrite/rewriteDefine.c:705 +#: rewrite/rewriteDefine.c:706 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "Список цілей правила для SELECT має занадто багато елементів" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:707 #, c-format msgid "RETURNING list has too many entries" msgstr "Список RETURNING має занадто багато елементів" -#: rewrite/rewriteDefine.c:733 +#: rewrite/rewriteDefine.c:734 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "перетворити зв'язок, який містить видаленні стовпці, на подання не можна" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:735 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "створити список RETURNING для зв'язка, який містить видаленні стовпці, не можна" -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:741 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Елемент результата правила для SELECT %d відрізняється іменем стовпця від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:743 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Ім'я елемента результату SELECT \"%s\"." -#: rewrite/rewriteDefine.c:751 +#: rewrite/rewriteDefine.c:752 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Елемент результата правила для SELECT %d відрізняється типом від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:754 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Елемент списку RETURNING %d відрізняється типом від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:756 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Елемент результату SELECT має тип %s, але стовпець має тип %s." -#: rewrite/rewriteDefine.c:759 rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Елемент списку RETURNING має тип %s, але стовпець має тип %s." -#: rewrite/rewriteDefine.c:775 +#: rewrite/rewriteDefine.c:776 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Елемент результата правил для SELECT %d відрізняється розміром від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:777 +#: rewrite/rewriteDefine.c:778 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Елемент списку RETURNING %d відрізняється розміром від стовпця \"%s\"" -#: rewrite/rewriteDefine.c:794 +#: rewrite/rewriteDefine.c:795 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "Список результату правила для SELECT має занадто мало елементів" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:796 #, c-format msgid "RETURNING list has too few entries" msgstr "Список RETURNING має занадто мало елементів" -#: rewrite/rewriteDefine.c:888 rewrite/rewriteDefine.c:1002 +#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" для відношення \"%s\" не існує" -#: rewrite/rewriteDefine.c:1021 +#: rewrite/rewriteDefine.c:1023 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "не допускається перейменування правила ON SELECT" @@ -19901,158 +20563,158 @@ msgstr "стовпець \"%s\" може бути оновлено тільки msgid "multiple assignments to same column \"%s\"" msgstr "кілька завдань для одного стовпця \"%s\"" -#: rewrite/rewriteHandler.c:2139 rewrite/rewriteHandler.c:4001 +#: rewrite/rewriteHandler.c:2143 rewrite/rewriteHandler.c:4048 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "виявлена безкінечна рекурсія у правилах для відносин \"%s\"" -#: rewrite/rewriteHandler.c:2224 +#: rewrite/rewriteHandler.c:2228 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "виявлена безкінечна рекурсія в політиці для зв'язка \"%s\"" -#: rewrite/rewriteHandler.c:2544 +#: rewrite/rewriteHandler.c:2548 msgid "Junk view columns are not updatable." msgstr "Утилізовані стовпці подань не оновлюються." -#: rewrite/rewriteHandler.c:2549 +#: rewrite/rewriteHandler.c:2553 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Стовпці подання, які не є стовпцями базового зв'язку, не оновлюються." -#: rewrite/rewriteHandler.c:2552 +#: rewrite/rewriteHandler.c:2556 msgid "View columns that refer to system columns are not updatable." msgstr "Стовпці подання, які посилаються на системні стовпці, не оновлюються." -#: rewrite/rewriteHandler.c:2555 +#: rewrite/rewriteHandler.c:2559 msgid "View columns that return whole-row references are not updatable." msgstr "Стовпці подання, що повертають посилання на весь рядок, не оновлюються." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2620 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Подання які містять DISTINCT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2623 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Подання які містять GROUP BY не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2626 msgid "Views containing HAVING are not automatically updatable." msgstr "Подання які містять HAVING не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2629 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Подання які містять UNION, INTERSECT, або EXCEPT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2632 msgid "Views containing WITH are not automatically updatable." msgstr "Подання які містять WITH не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2635 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Подання які містять LIMIT або OFFSET не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2647 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Подання які повертають агрегатні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2646 +#: rewrite/rewriteHandler.c:2650 msgid "Views that return window functions are not automatically updatable." msgstr "Подання які повертають віконні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2649 +#: rewrite/rewriteHandler.c:2653 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Подання які повертають set-returning функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2656 rewrite/rewriteHandler.c:2660 -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2660 rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2672 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Подання які обирають дані не з одної таблиці або подання не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2671 +#: rewrite/rewriteHandler.c:2675 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Подання які містять TABLESAMPLE не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2695 +#: rewrite/rewriteHandler.c:2699 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Подання які не мають оновлюваних стовпців не оновлюються автоматично." -#: rewrite/rewriteHandler.c:3172 +#: rewrite/rewriteHandler.c:3176 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставити дані в стовпець \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3184 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "оновити дані в стовпці \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3665 +#: rewrite/rewriteHandler.c:3675 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "Правила DO INSTEAD NOTIFY не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3676 +#: rewrite/rewriteHandler.c:3686 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "Правила DO INSTEAD NOTHING не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3690 +#: rewrite/rewriteHandler.c:3700 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "умовні правила DO INSTEAD не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3694 +#: rewrite/rewriteHandler.c:3704 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "Правила DO ALSO не підтримуються для операторів, які змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3699 +#: rewrite/rewriteHandler.c:3709 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "складові правила DO INSTEAD не підтримуються операторами, які змінюють дані у WITH" -#: rewrite/rewriteHandler.c:3929 rewrite/rewriteHandler.c:3937 -#: rewrite/rewriteHandler.c:3945 +#: rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 +#: rewrite/rewriteHandler.c:3992 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Подання з умовними правилами DO INSTEAD не оновлюються автоматично." -#: rewrite/rewriteHandler.c:4050 +#: rewrite/rewriteHandler.c:4097 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "виконати INSERT RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4052 +#: rewrite/rewriteHandler.c:4099 #, 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:4057 +#: rewrite/rewriteHandler.c:4104 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "виконати UPDATE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4059 +#: rewrite/rewriteHandler.c:4106 #, 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:4064 +#: rewrite/rewriteHandler.c:4111 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "виконати DELETE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4066 +#: rewrite/rewriteHandler.c:4113 #, 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:4084 +#: rewrite/rewriteHandler.c:4131 #, 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:4141 +#: rewrite/rewriteHandler.c:4188 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH не можна використовувати в запиті, який переписаний правилами в декілька запитів" @@ -20103,57 +20765,57 @@ msgstr "нерозпізнаний параметр Snowball: \"%s\"" msgid "missing Language parameter" msgstr "пропущений параметр Language" -#: statistics/extended_stats.c:178 +#: 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:1371 utils/adt/jsonfuncs.c:1952 +#: statistics/mcv.c:1372 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: storage/buffer/bufmgr.c:598 storage/buffer/bufmgr.c:765 +#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "доступ до тимчасових таблиць з інших сесій заблоковано" -#: storage/buffer/bufmgr.c:843 +#: storage/buffer/bufmgr.c:851 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не можна розширити відношення %s понад %u блоків" -#: storage/buffer/bufmgr.c:930 +#: storage/buffer/bufmgr.c:938 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неочікуванні дані після EOF в блоці %u відношення %s" -#: storage/buffer/bufmgr.c:932 +#: storage/buffer/bufmgr.c:940 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Ця ситуація може виникати через помилки в ядрі; можливо, вам слід оновити вашу систему." -#: storage/buffer/bufmgr.c:1031 +#: storage/buffer/bufmgr.c:1039 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "неприпустима сторінка в блоці %u відношення %s; сторінка обнуляється" -#: storage/buffer/bufmgr.c:4533 +#: storage/buffer/bufmgr.c:4670 #, c-format msgid "could not write block %u of %s" msgstr "неможливо записати блок %u файлу %s" -#: storage/buffer/bufmgr.c:4535 +#: storage/buffer/bufmgr.c:4672 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Кілька неполадок --- можливо, постійна помилка запису." -#: storage/buffer/bufmgr.c:4556 storage/buffer/bufmgr.c:4575 +#: storage/buffer/bufmgr.c:4693 storage/buffer/bufmgr.c:4712 #, c-format msgid "writing block %u of relation %s" msgstr "записування блоку %u зв'язку %s" -#: storage/buffer/bufmgr.c:4879 +#: storage/buffer/bufmgr.c:5016 #, c-format msgid "snapshot too old" msgstr "знімок є застарим" @@ -20168,148 +20830,173 @@ msgstr "немає жодного пустого локального буфер msgid "cannot access temporary tables during a parallel operation" msgstr "немає доступу до тимчасових таблиць під час паралельної операції" -#: storage/file/buffile.c:323 +#: storage/file/buffile.c:333 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "не вдалося відкрити тимчасовий файл \"%s\" з BufFile \"%s\": %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 "не вдалося визначити розмір тимчасового файлу \"%s\" з BufFile \"%s\": %m" -#: storage/file/buffile.c:884 +#: storage/file/buffile.c:923 #, c-format -msgid "could not delete shared fileset \"%s\": %m" -msgstr "не вдалося видалити спільний набір файлів \"%s\": %m" +msgid "could not delete fileset \"%s\": %m" +msgstr "не вдалося видалити набір файлів \"%s\": %m" -#: storage/file/buffile.c:902 storage/smgr/md.c:309 storage/smgr/md.c:869 +#: storage/file/buffile.c:941 storage/smgr/md.c:328 storage/smgr/md.c:907 #, 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 +#: 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:545 +#: storage/file/fd.c:552 #, c-format msgid "could not determine dirty data size: %m" msgstr "не вдалося визначити розмір \"брудних\" даних: %m" -#: storage/file/fd.c:597 +#: storage/file/fd.c:604 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "не вдалося munmap() під час очищення даних: %m" -#: storage/file/fd.c:836 +#: storage/file/fd.c:843 #, c-format msgid "could not link file \"%s\" to \"%s\": %m" msgstr "для файлу \"%s\" не вдалося створити посилання \"%s\": %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:967 #, c-format msgid "getrlimit failed: %m" msgstr "помилка getrlimit: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1057 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостатньо доступних дескрипторів файлу для запуску серверного процесу" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1058 #, c-format msgid "System allows %d, we need at least %d." msgstr "Система дозволяє %d, потрібно щонайменше %d." -#: storage/file/fd.c:1079 storage/file/fd.c:2416 storage/file/fd.c:2526 -#: storage/file/fd.c:2677 +#: 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:1453 +#: storage/file/fd.c:1527 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "тимчасовий файл: шлях \"%s\", розмір %lu" -#: storage/file/fd.c:1584 +#: storage/file/fd.c:1658 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "неможливо створити тимчасовий каталог \"%s\": %m" -#: storage/file/fd.c:1591 +#: storage/file/fd.c:1665 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "неможливо створити тимчасовий підкаталог \"%s\": %m" -#: storage/file/fd.c:1784 +#: storage/file/fd.c:1862 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "неможливо створити тимчасовий файл \"%s\": %m" -#: storage/file/fd.c:1818 +#: storage/file/fd.c:1898 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчасовий файл \"%s\": %m" -#: storage/file/fd.c:1859 +#: storage/file/fd.c:1939 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "помилка видалення тимчасового файлу \"%s\": %m" -#: storage/file/fd.c:1947 +#: storage/file/fd.c:2027 #, c-format msgid "could not delete file \"%s\": %m" msgstr "не вдалося видалити файл \"%s\": %m" -#: storage/file/fd.c:2127 +#: storage/file/fd.c:2207 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "розмір тимчасового файлу перевищує temp_file_limit (%d Кб)" -#: storage/file/fd.c:2392 storage/file/fd.c:2451 +#: 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) при спробі відкрити файл \"%s\"" -#: storage/file/fd.c:2496 +#: storage/file/fd.c:2576 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при спробі виконати команду \"%s\"" -#: storage/file/fd.c:2653 +#: storage/file/fd.c:2733 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при спробі відкрити каталог \"%s\"" -#: storage/file/fd.c:3183 +#: storage/file/fd.c:3269 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "знайдено неочікуваний файл в каталозі тимчасових файлів: \"%s\"" -#: storage/file/fd.c:3312 +#: 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/sharedfileset.c:144 +#: storage/file/fd.c:3619 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "Синхронізація каталогу даних (pre-fsync), витрачено часу: %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 "скидання нежурнальованих відношень (очищення), витрачено часу: %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 "занадто багато сегментів динамічної спільної пам'яті" @@ -20364,41 +21051,46 @@ msgstr "не вдалося створити сегмент спільної п msgid "could not close shared memory segment \"%s\": %m" msgstr "не вдалося закрити сегмент спільної пам'яті \"%s\": %m" -#: storage/ipc/dsm_impl.c:990 storage/ipc/dsm_impl.c:1038 +#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не вдалося продублювати маркер для \"%s\": %m" -#: storage/ipc/procarray.c:3893 +#: storage/ipc/procarray.c:3845 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база даних \"%s\" використовується підготовленими транзакціями" -#: storage/ipc/procarray.c:3925 storage/ipc/signalfuncs.c:221 +#: storage/ipc/procarray.c:3877 storage/ipc/signalfuncs.c:231 #, c-format msgid "must be a superuser to terminate superuser process" msgstr "щоб припинити процес суперкористувача потрібно бути суперкористувачем" -#: storage/ipc/procarray.c:3932 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3884 storage/ipc/signalfuncs.c:236 #, 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_mq.c:368 +#: storage/ipc/procsignal.c:419 +#, c-format +msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgstr "все ще чекаємо на прийняття ProcSignalBarrier від бекенд з PID %lu" + +#: 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:694 +#: storage/ipc/shm_mq.c:719 #, 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:962 -#: storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2820 storage/lmgr/lock.c:4234 -#: storage/lmgr/lock.c:4299 storage/lmgr/lock.c:4649 -#: storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:2498 -#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:5103 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 storage/lmgr/lock.c:4235 +#: storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/predicate.c:2485 storage/lmgr/predicate.c:2500 +#: storage/lmgr/predicate.c:3990 storage/lmgr/predicate.c:5106 #: utils/hash/dynahash.c:1112 #, c-format msgid "out of shared memory" @@ -20429,33 +21121,33 @@ msgstr "недостатньо спільної пам'яті для струк msgid "requested shared memory size overflows size_t" msgstr "запитаний сегмент спільної пам'яті не вміщається в size_t" -#: storage/ipc/signalfuncs.c:68 utils/adt/mcxtfuncs.c:204 +#: 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:99 storage/lmgr/proc.c:1460 -#: utils/adt/mcxtfuncs.c:212 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1442 +#: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "не вдалося надіслати сигнал процесу %d: %m" -#: storage/ipc/signalfuncs.c:119 +#: storage/ipc/signalfuncs.c:129 #, c-format msgid "must be a superuser to cancel superuser query" msgstr "щоб скасувати запит суперкористувача потрібно бути суперкористувачем" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:134 #, 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 +#: storage/ipc/signalfuncs.c:175 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "не вдалося перевірити наявність процесу з PID %d: %m" -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:193 #, 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" @@ -20464,43 +21156,43 @@ msgstr[1] "процес з PID %d не завершився протягом %ll msgstr[2] "процес з PID %d не завершився протягом %lld мілісекунд" msgstr[3] "процес з PID %d не завершився протягом %lld мілісекунд" -#: storage/ipc/signalfuncs.c:214 +#: storage/ipc/signalfuncs.c:224 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" повинен не може бути негативним" -#: storage/ipc/signalfuncs.c:266 +#: storage/ipc/signalfuncs.c:276 #, 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:268 utils/adt/genfile.c:255 +#: storage/ipc/signalfuncs.c:278 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Розгляньте використання %s, що є частиною ядра." -#: storage/ipc/signalfuncs.c:274 storage/ipc/signalfuncs.c:294 +#: storage/ipc/signalfuncs.c:284 storage/ipc/signalfuncs.c:304 #, c-format msgid "rotation not possible because log collection not active" msgstr "обертання неможливе тому, що записування колекції не активоване" -#: storage/ipc/standby.c:306 +#: storage/ipc/standby.c:307 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "відновлення все ще чекає, після %ld.%03d мс: %s" -#: storage/ipc/standby.c:315 +#: storage/ipc/standby.c:316 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "відновлення закінчило очікування після %ld.%03d мс: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3330 +#: storage/ipc/standby.c:883 tcop/postgres.c:3344 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "виконання оператора скасовано через конфлікт з процесом відновлення" -#: storage/ipc/standby.c:884 tcop/postgres.c:2484 +#: storage/ipc/standby.c:884 tcop/postgres.c:2499 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Транзакція користувача призвела до взаємного блокування з процесом відновлення." @@ -20573,123 +21265,123 @@ msgstr "виявлено взаємне блокування" msgid "See server log for query details." msgstr "Подробиці запиту перегляньте в записі серверу." -#: storage/lmgr/lmgr.c:831 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при оновленні кортежу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:834 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при видаленні кортежу (%u,%u) в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:837 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокуванні кортежу (%u,%u) в зв'язку \"%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 "при блокуванні оновленої версії (%u,%u) кортежу в зв'язку \"%s\"" -#: storage/lmgr/lmgr.c:843 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при вставці кортежу індексу (%u,%u) в зв'язку \"%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 "під час перевірки унікальності кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:849 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "під час повторної перевірки оновленого кортежа (%u,%u) у відношенні \"%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 "під час перевірки обмеження-виключення для кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:1107 +#: storage/lmgr/lmgr.c:1135 #, c-format msgid "relation %u of database %u" msgstr "відношення %u бази даних %u" -#: storage/lmgr/lmgr.c:1113 +#: storage/lmgr/lmgr.c:1141 #, c-format msgid "extension of relation %u of database %u" msgstr "розширення відношення %u бази даних %u" -#: storage/lmgr/lmgr.c:1119 +#: storage/lmgr/lmgr.c:1147 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid бази даних %u" -#: storage/lmgr/lmgr.c:1124 +#: storage/lmgr/lmgr.c:1152 #, c-format msgid "page %u of relation %u of database %u" msgstr "сторінка %u відношення %u бази даних %u" -#: storage/lmgr/lmgr.c:1131 +#: storage/lmgr/lmgr.c:1159 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) відношення %u бази даних %u" -#: storage/lmgr/lmgr.c:1139 +#: storage/lmgr/lmgr.c:1167 #, c-format msgid "transaction %u" msgstr "транзакція %u" -#: storage/lmgr/lmgr.c:1144 +#: storage/lmgr/lmgr.c:1172 #, c-format msgid "virtual transaction %d/%u" msgstr "віртуальна транзакція %d/%u" -#: storage/lmgr/lmgr.c:1150 +#: storage/lmgr/lmgr.c:1178 #, c-format msgid "speculative token %u of transaction %u" msgstr "орієнтовний маркер %u транзакції %u" -#: storage/lmgr/lmgr.c:1156 +#: storage/lmgr/lmgr.c:1184 #, c-format msgid "object %u of class %u of database %u" msgstr "об’єкт %u класу %u бази даних %u" -#: storage/lmgr/lmgr.c:1164 +#: storage/lmgr/lmgr.c:1192 #, c-format msgid "user lock [%u,%u,%u]" msgstr "користувацьке блокування [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1171 +#: storage/lmgr/lmgr.c:1199 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендаційне блокування [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1179 +#: storage/lmgr/lmgr.c:1207 #, c-format msgid "unrecognized locktag type %d" msgstr "нерозпізнаний тип блокування %d" -#: storage/lmgr/lock.c:790 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "поки виконується відновлення, не можна отримати блокування об'єктів бази даних в режимі %s" -#: storage/lmgr/lock.c:792 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Під час процесу відновлення для об'єктів бази даних може бути отримане лише блокування RowExclusiveLock або менш сильна." -#: storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2821 -#: storage/lmgr/lock.c:4235 storage/lmgr/lock.c:4300 storage/lmgr/lock.c:4650 +#: storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 storage/lmgr/lock.c:2822 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4301 storage/lmgr/lock.c:4651 #, c-format msgid "You might need to increase max_locks_per_transaction." msgstr "Можливо, слід збільшити параметр max_locks_per_transaction." -#: storage/lmgr/lock.c:3276 storage/lmgr/lock.c:3344 storage/lmgr/lock.c:3460 +#: storage/lmgr/lock.c:3277 storage/lmgr/lock.c:3345 storage/lmgr/lock.c:3461 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "не можна виконати PREPARE, під час утримання блокування на рівні сеансу і на рівні транзакції для одного об'єкта" @@ -20709,82 +21401,82 @@ msgstr "Можливо, вам слід виконувати менше тран msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "в RWConflictPool недостатньо елементів для запису про потенціальний конфлікт читання/запису" -#: storage/lmgr/predicate.c:1694 +#: storage/lmgr/predicate.c:1695 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "параметр \"default_transaction_isolation\" має значення \"serializable\"." -#: 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 "Ви можете використати \"SET default_transaction_isolation = 'repeatable read'\" щоб змінити режим за замовчуванням." -#: storage/lmgr/predicate.c:1746 +#: 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:1825 utils/time/snapmgr.c:569 +#: 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:1826 utils/time/snapmgr.c:576 +#: 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:2484 storage/lmgr/predicate.c:2499 -#: storage/lmgr/predicate.c:3989 +#: storage/lmgr/predicate.c:2486 storage/lmgr/predicate.c:2501 +#: storage/lmgr/predicate.c:3991 #, c-format msgid "You might need to increase max_pred_locks_per_transaction." msgstr "Можливо, вам слід збільшити параметр max_pred_locks_per_transaction." -#: storage/lmgr/predicate.c:4120 storage/lmgr/predicate.c:4156 -#: storage/lmgr/predicate.c:4189 storage/lmgr/predicate.c:4197 -#: storage/lmgr/predicate.c:4236 storage/lmgr/predicate.c:4478 -#: storage/lmgr/predicate.c:4815 storage/lmgr/predicate.c:4827 -#: storage/lmgr/predicate.c:4874 storage/lmgr/predicate.c:4912 -#, c-format -msgid "could not serialize access due to read/write dependencies among transactions" -msgstr "не вдалося серіалізувати доступ через залежність читання/запису серед транзакцій" - #: storage/lmgr/predicate.c:4122 storage/lmgr/predicate.c:4158 #: storage/lmgr/predicate.c:4191 storage/lmgr/predicate.c:4199 #: storage/lmgr/predicate.c:4238 storage/lmgr/predicate.c:4480 #: storage/lmgr/predicate.c:4817 storage/lmgr/predicate.c:4829 #: storage/lmgr/predicate.c:4876 storage/lmgr/predicate.c:4914 #, c-format +msgid "could not serialize access due to read/write dependencies among transactions" +msgstr "не вдалося серіалізувати доступ через залежність читання/запису серед транзакцій" + +#: storage/lmgr/predicate.c:4124 storage/lmgr/predicate.c:4160 +#: storage/lmgr/predicate.c:4193 storage/lmgr/predicate.c:4201 +#: storage/lmgr/predicate.c:4240 storage/lmgr/predicate.c:4482 +#: storage/lmgr/predicate.c:4819 storage/lmgr/predicate.c:4831 +#: storage/lmgr/predicate.c:4878 storage/lmgr/predicate.c:4916 +#, c-format msgid "The transaction might succeed if retried." msgstr "Транзакція може завершитися успішно, якщо повторити спробу." -#: 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 "кількість запитаних підключень резервного серверу перевищує max_wal_senders (поточна %d)" -#: storage/lmgr/proc.c:1557 +#: storage/lmgr/proc.c:1539 #, 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:1572 +#: storage/lmgr/proc.c:1554 #, 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:1581 +#: storage/lmgr/proc.c:1563 #, 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:1588 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процес %d отримав в режимі %s блокування %s після %ld.%03d мс" -#: storage/lmgr/proc.c:1605 +#: storage/lmgr/proc.c:1587 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "процес %d не зміг отримати в режимі %s блокування %s після %ld.%03d мс" @@ -20794,85 +21486,80 @@ msgstr "процес %d не зміг отримати в режимі %s бло msgid "page verification failed, calculated checksum %u but expected %u" msgstr "помилка перевірки сторінки, обчислена контрольна сума %u але очікувалось %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 "пошкоджені вказівники сторінки: нижній = %u, верхній = %u, спеціальний = %u" -#: storage/page/bufpage.c:768 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "пошкоджений вказівник рядка: %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 "пошкоджена довжина елементу: загальний розмір %u, доступний розмір %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 "пошкоджений вказівник рядка: зсув = %u, розмір = %u" -#: storage/smgr/md.c:438 +#: storage/smgr/md.c:473 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не можна розширити файл \"%s\" до блоку %u" -#: storage/smgr/md.c:453 +#: storage/smgr/md.c:488 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не вдалося розширити файл \"%s\": %m" -#: storage/smgr/md.c:455 storage/smgr/md.c:462 storage/smgr/md.c:750 -#, c-format -msgid "Check free disk space." -msgstr "Перевірьте вільний дисковий простір." - -#: storage/smgr/md.c:459 +#: storage/smgr/md.c:494 #, 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:671 +#: storage/smgr/md.c:709 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не вдалося прочитати блок %u в файлі \"%s\": %m" -#: storage/smgr/md.c:687 +#: storage/smgr/md.c:725 #, 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:741 +#: storage/smgr/md.c:779 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не вдалося записати блок %u у файл \"%s\": %m" -#: storage/smgr/md.c:746 +#: storage/smgr/md.c:784 #, 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:840 +#: storage/smgr/md.c:878 #, 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:895 +#: storage/smgr/md.c:933 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не вдалося скоротити файл \"%s\" до %u блоків: %m" -#: storage/smgr/md.c:1289 +#: storage/smgr/md.c:1332 #, 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:1303 +#: storage/smgr/md.c:1346 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не вдалося відкрити файл \"%s\" (цільовий блок %u): %m" @@ -20887,8 +21574,8 @@ msgstr "неможливо викликати функцію \"%s\" через msgid "fastpath function call: \"%s\" (OID %u)" msgstr "виклик функції fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1304 tcop/postgres.c:1562 -#: tcop/postgres.c:2021 tcop/postgres.c:2265 +#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 +#: tcop/postgres.c:2036 tcop/postgres.c:2280 #, c-format msgid "duration: %s ms" msgstr "тривалість: %s мс" @@ -20918,348 +21605,348 @@ msgstr "неприпустимий розмір аргументу %d в пов msgid "incorrect binary data format in function argument %d" msgstr "неправильний формат двійкових даних в аргументі функції %d" -#: tcop/postgres.c:445 tcop/postgres.c:4743 +#: tcop/postgres.c:444 tcop/postgres.c:4828 #, c-format msgid "invalid frontend message type %d" msgstr "неприпустимий тип клієнтського повідомлення %d" -#: tcop/postgres.c:1014 +#: tcop/postgres.c:1051 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1309 +#: tcop/postgres.c:1346 #, c-format msgid "duration: %s ms statement: %s" msgstr "тривалість: %s мс, оператор: %s" -#: tcop/postgres.c:1415 +#: tcop/postgres.c:1452 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "до підтготовленого оператору не можна вставити декілька команд" -#: tcop/postgres.c:1567 +#: tcop/postgres.c:1582 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "тривалість: %s мс, аналізування %s: %s" -#: tcop/postgres.c:1633 tcop/postgres.c:2580 +#: tcop/postgres.c:1648 tcop/postgres.c:2595 #, c-format msgid "unnamed prepared statement does not exist" msgstr "підготовлений оператор без імені не існує" -#: tcop/postgres.c:1674 +#: tcop/postgres.c:1689 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "повідомлення bind має %d форматів, але %d параметрів" -#: tcop/postgres.c:1680 +#: tcop/postgres.c:1695 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "в повідомленні bind передано %d параметрів, але підготовлений оператор \"%s\" потребує %d" -#: tcop/postgres.c:1899 +#: tcop/postgres.c:1914 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "невірний формат двійкових даних в параметрі bind %d" -#: tcop/postgres.c:2026 +#: tcop/postgres.c:2041 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "тривалість: %s мс, повідомлення bind %s%s%s: %s" -#: tcop/postgres.c:2076 tcop/postgres.c:2664 +#: tcop/postgres.c:2091 tcop/postgres.c:2678 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не існує" -#: tcop/postgres.c:2145 +#: tcop/postgres.c:2160 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2147 tcop/postgres.c:2273 +#: tcop/postgres.c:2162 tcop/postgres.c:2288 msgid "execute fetch from" msgstr "виконати витягнення з" -#: tcop/postgres.c:2148 tcop/postgres.c:2274 +#: tcop/postgres.c:2163 tcop/postgres.c:2289 msgid "execute" msgstr "виконувати" -#: tcop/postgres.c:2270 +#: tcop/postgres.c:2285 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "тривалість: %s мс %s %s%s%s: %s" -#: tcop/postgres.c:2416 +#: tcop/postgres.c:2431 #, c-format msgid "prepare: %s" msgstr "підготовка: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2456 #, c-format msgid "parameters: %s" msgstr "параметри: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2471 #, c-format msgid "abort reason: recovery conflict" msgstr "причина переривання: конфлікт під час відновлення" -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2487 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Користувач утримував позначку спільного буферу занадто довго." -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2490 #, c-format msgid "User was holding a relation lock for too long." msgstr "Користувач утримував блокування відношення занадто довго." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2493 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Користувач використовував табличний простір який повинен бути видаленим." -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2496 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Запиту користувача потрібно було бачити версії рядків, які повинні бути видалені." -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2502 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Користувач був підключен до бази даних, яка повинна бути видалена." -#: tcop/postgres.c:2526 +#: tcop/postgres.c:2541 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "параметр порталу \"%s\": $%d = %s" -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2544 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "параметр порталу \"%s\": $%d" -#: tcop/postgres.c:2535 +#: tcop/postgres.c:2550 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "параметр порталу без назви $%d = %s" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2553 #, c-format msgid "unnamed portal parameter $%d" msgstr "параметр порталу без назви $%d" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:2898 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "завершення підключення через неочікуваний сигнал SIGQUIT" -#: tcop/postgres.c:2890 +#: tcop/postgres.c:2904 #, c-format msgid "terminating connection because of crash of another server process" msgstr "завершення підключення через аварійне завершення роботи іншого серверного процесу" -#: tcop/postgres.c:2891 +#: tcop/postgres.c:2905 #, 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:2895 tcop/postgres.c:3256 +#: tcop/postgres.c:2909 tcop/postgres.c:3270 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "В цей момент ви можете повторно підключитися до бази даних і повторити вашу команду." -#: tcop/postgres.c:2902 +#: tcop/postgres.c:2916 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "завершення підключення через команду негайного завершення роботи" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:3002 #, c-format msgid "floating-point exception" msgstr "виняток в операції з рухомою комою" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:3003 #, 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:3160 +#: tcop/postgres.c:3174 #, c-format msgid "canceling authentication due to timeout" msgstr "скасування автентифікації через тайм-аут" -#: tcop/postgres.c:3164 +#: tcop/postgres.c:3178 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "завершення процесу автоочистки по команді адміністратора" -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3182 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершення обробника логічної реплікації по команді адміністратора" -#: tcop/postgres.c:3185 tcop/postgres.c:3195 tcop/postgres.c:3254 +#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "завершення підключення через конфлікт з процесом відновлення" -#: tcop/postgres.c:3206 +#: tcop/postgres.c:3220 #, c-format msgid "terminating connection due to administrator command" msgstr "завершення підключення по команді адміністратора" -#: tcop/postgres.c:3237 +#: tcop/postgres.c:3251 #, c-format msgid "connection to client lost" msgstr "підключення до клієнта втрачено" -#: tcop/postgres.c:3307 +#: tcop/postgres.c:3321 #, c-format msgid "canceling statement due to lock timeout" msgstr "виконання оператора скасовано через тайм-аут блокування" -#: tcop/postgres.c:3314 +#: tcop/postgres.c:3328 #, c-format msgid "canceling statement due to statement timeout" msgstr "виконання оператора скасовано через тайм-аут" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3335 #, c-format msgid "canceling autovacuum task" msgstr "скасування завдання автоочистки" -#: tcop/postgres.c:3344 +#: tcop/postgres.c:3358 #, c-format msgid "canceling statement due to user request" msgstr "виконання оператора скасовано по запиту користувача" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3372 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "завершення підключення через тайм-аут бездіяльності в транзакції" -#: tcop/postgres.c:3369 +#: tcop/postgres.c:3383 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "завершення підключення через тайм-аут неактивного сеансу" -#: tcop/postgres.c:3498 +#: tcop/postgres.c:3523 #, c-format msgid "stack depth limit exceeded" msgstr "перевищено ліміт глибини стека" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3524 #, 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:3562 +#: tcop/postgres.c:3587 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значення \"max_stack_depth\" не повинно перевищувати %ld КБ." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3589 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Збільшіть ліміт глибини стека в системі через команду \"ulimit -s\" або через локальний еквівалент." -#: tcop/postgres.c:3920 +#: tcop/postgres.c:3945 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неприпустимий аргумент командного рядка для серверного процесу: %s" -#: tcop/postgres.c:3921 tcop/postgres.c:3927 +#: tcop/postgres.c:3946 tcop/postgres.c:3952 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" для додаткової інформації." -#: tcop/postgres.c:3925 +#: tcop/postgres.c:3950 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неприпустимий аргумент командного рядка: %s" -#: tcop/postgres.c:3988 +#: tcop/postgres.c:4003 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ні база даних, ні ім'я користувача не вказані" -#: tcop/postgres.c:4645 +#: tcop/postgres.c:4730 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неприпустимий підтип повідомлення CLOSE %d" -#: tcop/postgres.c:4680 +#: tcop/postgres.c:4765 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неприпустимий підтип повідомлення DESCRIBE %d" -#: tcop/postgres.c:4764 +#: tcop/postgres.c:4849 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "виклики функції fastpath не підтримуються в підключенні реплікації" -#: tcop/postgres.c:4768 +#: tcop/postgres.c:4853 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "протокол розширених запитів не підтримується в підключенні реплікації" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:5030 #, 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:638 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "повідомлення bind має %d форматів, але запит має %d стовпців" -#: tcop/pquery.c:941 tcop/pquery.c:1703 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" msgstr "курсор може сканувати лише вперед" -#: tcop/pquery.c:942 tcop/pquery.c:1704 +#: 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:414 +#: 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:432 +#: 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:451 +#: 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:469 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "не можна виконати %s в межах операції з обмеженнями безпеки" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:820 +#: tcop/utility.c:828 #, c-format msgid "cannot execute %s within a background process" msgstr "не можна виконати %s у фоновому процесі" -#: tcop/utility.c:945 +#: tcop/utility.c:953 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "для виконання CHECKPOINT потрібно бути суперкористувачем" +msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +msgstr "щоб виконати CHECKPOINT, потрібно бути суперкористувачем або мати права pg_checkpoint" #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 #, c-format @@ -21407,19 +22094,19 @@ msgstr "неприпустима позначка affix \"%s\" зі значен msgid "could not open dictionary file \"%s\": %m" msgstr "не вдалося відкрити файл словника \"%s\": %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:208 +#: tsearch/spell.c:764 utils/adt/regexp.c:209 #, c-format msgid "invalid regular expression: %s" msgstr "неприпустимий регулярний вираз: %s" #: tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 -#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:16630 gram.y:16647 +#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:17812 gram.y:17829 #, c-format msgid "syntax error" msgstr "синтаксична помилка" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 +#: tsearch/spell.c:1767 tsearch/spell.c:1772 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неприпустимий псевдонім affix \"%s\"" @@ -21449,17 +22136,17 @@ msgstr "кількість псевдонімів перевищує вказа msgid "affix file contains both old-style and new-style commands" msgstr "файл affix містить команди і в старому, і в новому стилі" -#: 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 "рядок занадто довгий для tsvector (%d байт, максимум %d байт)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:223 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "рядок %d файлу конфігурації \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:302 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "перетворити wchar_t в кодування серверу не вдалося: %mв" @@ -21491,145 +22178,195 @@ msgstr "не вдалося відкрити файл стоп-слова \"%s\" msgid "text search parser does not support headline creation" msgstr "аналізатор текстового пошуку не підтримує створення заголовку" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2592 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нерозпізнаний параметр заголовку: \"%s\"" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2611 #, c-format msgid "MinWords should be less than MaxWords" msgstr "Значення MinWords повинно бути меньшим за MaxWords" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2615 #, c-format msgid "MinWords should be positive" msgstr "Значення MinWords повинно бути позитивним" -#: tsearch/wparser_def.c:2620 +#: tsearch/wparser_def.c:2619 #, c-format msgid "ShortWord should be >= 0" msgstr "Значення ShortWord повинно бути >= 0" -#: tsearch/wparser_def.c:2624 +#: tsearch/wparser_def.c:2623 #, c-format msgid "MaxFragments should be >= 0" msgstr "Значення MaxFragments повинно бути >= 0" -#: utils/adt/acl.c:165 utils/adt/name.c:93 +#: utils/activity/pgstat.c:428 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "не вдалося від'єднати файл постійної статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1226 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "неприпустимий тип статистики: \"%s\"" + +#: utils/activity/pgstat.c:1306 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "не вдалося відкрити тимчасовий файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1412 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "не вдалося записати в тимчасовий файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1421 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "не вдалося закрити тимчасовий файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1429 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "не вдалося перейменувати тимчасовий файл статистики з \"%s\" в \"%s\": %m" + +#: utils/activity/pgstat.c:1478 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "не вдалося відкрити файл статистики \"%s\": %m" + +#: utils/activity/pgstat.c:1634 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "пошкоджений файл статистики \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "виклик видаленої функції" + +#: utils/activity/pgstat_xact.c:371 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "скидання існуючої статистики для типу %s, db=%u, oid=%u" + +#: utils/adt/acl.c:168 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "занадто довгий ідентифікатор" -#: 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 "Ідентифікатор повинен бути короче ніж %d символів." -#: utils/adt/acl.c:249 +#: utils/adt/acl.c:252 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нерозпізнане ключове слово: \"%s\"" -#: utils/adt/acl.c:250 +#: utils/adt/acl.c:253 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключовим словом ACL повинно бути \"group\" або \"user\"." -#: utils/adt/acl.c:255 +#: utils/adt/acl.c:258 #, c-format msgid "missing name" msgstr "пропущено ім'я" -#: utils/adt/acl.c:256 +#: 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:262 +#: utils/adt/acl.c:265 #, c-format msgid "missing \"=\" sign" msgstr "пропущено знак \"=\"" -#: utils/adt/acl.c:315 +#: utils/adt/acl.c:324 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неприпустимий символ режиму: повинен бути один з \"%s\"" -#: utils/adt/acl.c:337 +#: utils/adt/acl.c:346 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" повинно прямувати ім'я" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:354 #, c-format msgid "defaulting grantor to user ID %u" msgstr "призначив права користувач з ідентифікатором %u" -#: utils/adt/acl.c:531 +#: utils/adt/acl.c:540 #, c-format msgid "ACL array contains wrong data type" msgstr "Масив ACL містить неправильний тип даних" -#: utils/adt/acl.c:535 +#: utils/adt/acl.c:544 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Масиви ACL повинні бути одновимірними" -#: utils/adt/acl.c:539 +#: utils/adt/acl.c:548 #, c-format msgid "ACL arrays must not contain null values" msgstr "Масиви ACL не повинні містити значення null" -#: utils/adt/acl.c:563 +#: utils/adt/acl.c:572 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "зайве сміття в кінці специфікації ACL" -#: utils/adt/acl.c:1198 +#: utils/adt/acl.c:1214 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "параметри призначення прав не можна повернути тому, хто призначив їх вам" -#: utils/adt/acl.c:1259 +#: utils/adt/acl.c:1275 #, c-format msgid "dependent privileges exist" msgstr "залежні права існують" -#: utils/adt/acl.c:1260 +#: utils/adt/acl.c:1276 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Використайте CASCADE, щоб відкликати їх." -#: utils/adt/acl.c:1514 +#: utils/adt/acl.c:1530 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert більше не підтримується" -#: utils/adt/acl.c:1524 +#: utils/adt/acl.c:1540 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove більше не підтримується" -#: 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 "нерозпізнаний тип прав: \"%s\"" -#: utils/adt/acl.c:3446 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: 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:4898 +#: utils/adt/acl.c:5008 #, c-format msgid "must be member of role \"%s\"" msgstr "потрібно бути учасником ролі \"%s\"" #: 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/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 +#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 #, c-format msgid "could not determine input data type" msgstr "не вдалося визначити тип вхідних даних" @@ -21640,16 +22377,16 @@ msgid "input data type is not an array" msgstr "тип вхідних даних не є масивом" #: 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:4231 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1114 -#: utils/adt/varlena.c:3422 +#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 +#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 +#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 +#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 +#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 +#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 +#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 +#: utils/adt/varlena.c:3391 #, c-format msgid "integer out of range" msgstr "ціле число поза діапазоном" @@ -21696,251 +22433,251 @@ msgstr "пошук елементів у багатовимірних масив msgid "initial position must not be null" msgstr "початкова позиція не повинна бути null" -#: 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 +#: utils/adt/arrayfuncs.c:272 utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:334 utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:510 +#: utils/adt/arrayfuncs.c:521 utils/adt/arrayfuncs.c:536 +#: utils/adt/arrayfuncs.c:557 utils/adt/arrayfuncs.c:587 +#: utils/adt/arrayfuncs.c:594 utils/adt/arrayfuncs.c:602 +#: utils/adt/arrayfuncs.c:636 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:679 utils/adt/arrayfuncs.c:791 +#: utils/adt/arrayfuncs.c:800 utils/adt/arrayfuncs.c:830 +#: utils/adt/arrayfuncs.c:845 utils/adt/arrayfuncs.c:898 #, c-format msgid "malformed array literal: \"%s\"" msgstr "неправильний літерал масиву: \"%s\"" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:273 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\" повинно представляти явно вказані виміри масиву." -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:287 #, c-format msgid "Missing array dimension value." msgstr "Пропущено значення виміру масиву." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:335 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Пропущено \"%s\" після вимірів масиву." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2909 -#: utils/adt/arrayfuncs.c:2941 utils/adt/arrayfuncs.c:2956 +#: utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:2945 +#: utils/adt/arrayfuncs.c:2990 utils/adt/arrayfuncs.c:3005 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "верхня границя не може бути меньше нижньої границі" -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:320 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Значення масиву повинно починатись з \"{\" або з інформації про вимір." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:349 #, c-format msgid "Array contents must start with \"{\"." msgstr "Вміст масиву повинен починатись з \"{\"." -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:355 utils/adt/arrayfuncs.c:362 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Вказані виміри масиву не відповідають його вмісту." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:163 utils/adt/rangetypes.c:2310 +#: utils/adt/arrayfuncs.c:495 utils/adt/arrayfuncs.c:522 +#: 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:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:511 utils/adt/arrayfuncs.c:558 +#: utils/adt/arrayfuncs.c:588 utils/adt/arrayfuncs.c:637 #, c-format msgid "Unexpected \"%c\" character." msgstr "Неочікуваний символ \"%c\"." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:537 utils/adt/arrayfuncs.c:660 #, c-format msgid "Unexpected array element." msgstr "Неочікуваний елемент масиву." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:595 #, c-format msgid "Unmatched \"%c\" character." msgstr "Невідповідний символ \"%c\"." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2604 +#: utils/adt/arrayfuncs.c:603 utils/adt/jsonfuncs.c:2490 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Багатовимірні масиви повинні мати вкладені масиви з відповідними вимірами." -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:286 +#: utils/adt/arrayfuncs.c:680 utils/adt/multirangetypes.c:287 #, c-format msgid "Junk after closing right brace." msgstr "Сміття після закриття правої дужки." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3369 -#: utils/adt/arrayfuncs.c:5882 +#: utils/adt/arrayfuncs.c:1302 utils/adt/arrayfuncs.c:3418 +#: utils/adt/arrayfuncs.c:5932 #, c-format msgid "invalid number of dimensions: %d" msgstr "неприпустима кількість вимірів: %d" -#: utils/adt/arrayfuncs.c:1312 +#: utils/adt/arrayfuncs.c:1313 #, c-format msgid "invalid array flags" msgstr "неприпустимі позначки масиву" -#: utils/adt/arrayfuncs.c:1334 +#: utils/adt/arrayfuncs.c:1335 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "двійкові дані мають тип елементу масиву %u (%s) замість очікуваного %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:444 +#: utils/adt/arrayfuncs.c:1379 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:1518 +#: utils/adt/arrayfuncs.c:1519 #, c-format msgid "improper binary format in array element %d" msgstr "неправильний двійковий формат в елементі масиву %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:449 +#: utils/adt/arrayfuncs.c:1600 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:2078 +#: utils/adt/arrayfuncs.c:2079 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "розрізання масивів постійної довжини не реалізовано" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2565 -#: utils/adt/arrayfuncs.c:2887 utils/adt/arrayfuncs.c:5868 -#: utils/adt/arrayfuncs.c:5894 utils/adt/arrayfuncs.c:5905 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4438 utils/adt/jsonfuncs.c:4592 -#: utils/adt/jsonfuncs.c:4704 utils/adt/jsonfuncs.c:4753 +#: utils/adt/arrayfuncs.c:2257 utils/adt/arrayfuncs.c:2279 +#: utils/adt/arrayfuncs.c:2328 utils/adt/arrayfuncs.c:2582 +#: utils/adt/arrayfuncs.c:2920 utils/adt/arrayfuncs.c:5918 +#: utils/adt/arrayfuncs.c:5944 utils/adt/arrayfuncs.c:5955 +#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4326 utils/adt/jsonfuncs.c:4480 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4641 #, c-format msgid "wrong number of array subscripts" msgstr "невірне число верхніх індексів масива" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2632 utils/adt/arrayfuncs.c:2946 +#: utils/adt/arrayfuncs.c:2262 utils/adt/arrayfuncs.c:2386 +#: utils/adt/arrayfuncs.c:2665 utils/adt/arrayfuncs.c:2995 #, c-format msgid "array subscript out of range" msgstr "верхній індекс масиву поза діапазоном" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2267 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "не можна призначати значення null значення елементу масива постійної довжини" -#: utils/adt/arrayfuncs.c:2834 +#: utils/adt/arrayfuncs.c:2867 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "оновлення в зрізах масивів постійної довжини не реалізовані" -#: utils/adt/arrayfuncs.c:2865 +#: utils/adt/arrayfuncs.c:2898 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "у вказівці зрізу масива повинні бути задані обидві межі" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2899 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Під час присвоєння значень зрізу в пустому масиві, межі зрізу повинні вказуватися повністю." -#: utils/adt/arrayfuncs.c:2877 utils/adt/arrayfuncs.c:2973 +#: utils/adt/arrayfuncs.c:2910 utils/adt/arrayfuncs.c:3022 #, c-format msgid "source array too small" msgstr "вихідний масив занадто малий" -#: utils/adt/arrayfuncs.c:3527 +#: utils/adt/arrayfuncs.c:3576 #, c-format msgid "null array element not allowed in this context" msgstr "елемент масиву null не дозволений в цьому контексті" -#: utils/adt/arrayfuncs.c:3629 utils/adt/arrayfuncs.c:3800 -#: utils/adt/arrayfuncs.c:4190 +#: utils/adt/arrayfuncs.c:3678 utils/adt/arrayfuncs.c:3849 +#: utils/adt/arrayfuncs.c:4240 #, c-format msgid "cannot compare arrays of different element types" msgstr "не можна порівнювати масиви з елементами різних типів" -#: utils/adt/arrayfuncs.c:3978 utils/adt/multirangetypes.c:2742 -#: utils/adt/multirangetypes.c:2814 utils/adt/rangetypes.c:1343 +#: utils/adt/arrayfuncs.c:4027 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 "не вдалося визначити геш-функцію для типу %s" -#: utils/adt/arrayfuncs.c:4105 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4155 utils/adt/rowtypes.c:1979 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не вдалося визначити розширену геш-функцію для типу %s" -#: utils/adt/arrayfuncs.c:5282 +#: utils/adt/arrayfuncs.c:5332 #, c-format msgid "data type %s is not an array type" msgstr "тип даних %s не є типом масиву" -#: utils/adt/arrayfuncs.c:5337 +#: utils/adt/arrayfuncs.c:5387 #, c-format msgid "cannot accumulate null arrays" msgstr "накопичувати null-масиви не можна" -#: utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:5415 #, c-format msgid "cannot accumulate empty arrays" msgstr "накопичувати пусті масиви не можна" -#: utils/adt/arrayfuncs.c:5392 utils/adt/arrayfuncs.c:5398 +#: utils/adt/arrayfuncs.c:5442 utils/adt/arrayfuncs.c:5448 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "накопичувати масиви різної розмірності не можна" -#: utils/adt/arrayfuncs.c:5766 utils/adt/arrayfuncs.c:5806 +#: utils/adt/arrayfuncs.c:5816 utils/adt/arrayfuncs.c:5856 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "масив розмірності або масив нижніх границь не може бути null" -#: utils/adt/arrayfuncs.c:5869 utils/adt/arrayfuncs.c:5895 +#: utils/adt/arrayfuncs.c:5919 utils/adt/arrayfuncs.c:5945 #, c-format msgid "Dimension array must be one dimensional." msgstr "Масив розмірності повинен бути одновимірним." -#: utils/adt/arrayfuncs.c:5874 utils/adt/arrayfuncs.c:5900 +#: utils/adt/arrayfuncs.c:5924 utils/adt/arrayfuncs.c:5950 #, c-format msgid "dimension values cannot be null" msgstr "значення розмірностей не можуть бути null" -#: utils/adt/arrayfuncs.c:5906 +#: utils/adt/arrayfuncs.c:5956 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Масив нижніх границь відрізняється за розміром від масиву розмірностей." -#: utils/adt/arrayfuncs.c:6184 +#: utils/adt/arrayfuncs.c:6234 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "видалення елементів з багатовимірних масивів не підтримується" -#: utils/adt/arrayfuncs.c:6461 +#: utils/adt/arrayfuncs.c:6511 #, c-format msgid "thresholds must be one-dimensional array" msgstr "граничне значення повинно вказуватись одновимірним масивом" -#: utils/adt/arrayfuncs.c:6466 +#: utils/adt/arrayfuncs.c:6516 #, c-format msgid "thresholds array must not contain NULLs" msgstr "масив границь не повинен містити NULL" -#: utils/adt/arrayfuncs.c:6699 +#: utils/adt/arrayfuncs.c:6749 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "кількість елементів для обрізки має бути між 0 і %d" @@ -21955,22 +22692,22 @@ msgstr "індекс елементу масиву має бути цілим ч msgid "array subscript in assignment must not be null" msgstr "підрядковий символ масиву у призначенні не може бути NULL" -#: utils/adt/arrayutils.c:140 +#: utils/adt/arrayutils.c:134 #, c-format msgid "array lower bound is too large: %d" msgstr "нижня границя масиву занадто велика: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:234 #, c-format msgid "typmod array must be type cstring[]" msgstr "масив typmod повинен мати тип cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:239 #, c-format msgid "typmod array must be one-dimensional" msgstr "масив typmod повинен бути одновимірним" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:244 #, c-format msgid "typmod array must not contain nulls" msgstr "масив typmod не повинен містити елементи nulls" @@ -21981,234 +22718,238 @@ 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: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:4050 +#: 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:4660 -#: utils/adt/geo_ops.c:4675 utils/adt/geo_ops.c:4682 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:694 -#: utils/adt/numeric.c:713 utils/adt/numeric.c:6886 utils/adt/numeric.c:6910 -#: utils/adt/numeric.c:6934 utils/adt/numeric.c:7892 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:347 +#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 +#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 +#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 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:6882 +#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 +#: 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:346 #, 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:179 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: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:8441 utils/adt/numeric.c:8731 utils/adt/numeric.c:10376 -#: 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:842 utils/adt/int.c:958 +#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 +#: utils/adt/int.c:1166 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:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 +#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3342 #, c-format msgid "division by zero" msgstr "ділення на нуль" -#: utils/adt/char.c:169 +#: utils/adt/char.c:196 #, c-format msgid "\"char\" out of range" msgstr "значення \"char\" поза діапазоном" -#: 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 +#, 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:74 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s точність не повинна бути від'ємною" -#: utils/adt/date.c:80 +#: 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: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:4299 +#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 +#: utils/adt/formatting.c:4424 #, c-format msgid "date out of range: \"%s\"" msgstr "дата поза діапазоном: \"%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 "дата поза діапазоном" -#: 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 "значення поля типу date поза діапазоном: %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 "дата поза діапазоном: %d-%02d-%02d" -#: utils/adt/date.c:500 +#: utils/adt/date.c:488 #, 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: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 "для позначки часу дата поза діапазоном" -#: 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:5417 utils/adt/timestamp.c:5431 -#: utils/adt/timestamp.c:5436 utils/adt/timestamp.c:5450 -#: utils/adt/timestamp.c:5483 utils/adt/timestamp.c:5570 -#: utils/adt/timestamp.c:5611 utils/adt/timestamp.c:5615 -#: utils/adt/timestamp.c:5684 utils/adt/timestamp.c:5688 -#: utils/adt/timestamp.c:5702 utils/adt/timestamp.c:5736 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 +#: 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:4059 +#: utils/adt/timestamp.c:4252 utils/adt/timestamp.c:4424 +#: utils/adt/timestamp.c:4677 utils/adt/timestamp.c:4878 +#: utils/adt/timestamp.c:4925 utils/adt/timestamp.c:5149 +#: utils/adt/timestamp.c:5196 utils/adt/timestamp.c:5326 +#, 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:4073 utils/adt/timestamp.c:4269 +#: utils/adt/timestamp.c:4438 utils/adt/timestamp.c:4637 +#: utils/adt/timestamp.c:4934 utils/adt/timestamp.c:5205 +#: utils/adt/timestamp.c:5387 +#, 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:4141 utils/adt/formatting.c:4177 +#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 +#: utils/adt/json.c:457 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:3763 utils/adt/timestamp.c:3887 +#: utils/adt/timestamp.c:3977 utils/adt/timestamp.c:4067 +#: utils/adt/timestamp.c:4160 utils/adt/timestamp.c:4263 +#: utils/adt/timestamp.c:4742 utils/adt/timestamp.c:5016 +#: utils/adt/timestamp.c:5466 utils/adt/timestamp.c:5480 +#: utils/adt/timestamp.c:5485 utils/adt/timestamp.c:5499 +#: utils/adt/timestamp.c:5532 utils/adt/timestamp.c:5619 +#: utils/adt/timestamp.c:5660 utils/adt/timestamp.c:5664 +#: utils/adt/timestamp.c:5733 utils/adt/timestamp.c:5737 +#: utils/adt/timestamp.c:5751 utils/adt/timestamp.c:5785 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 "позначка часу поза діапазоном" -#: 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:4476 #, c-format msgid "time out of range" msgstr "час поза діапазоном" -#: 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 "значення поля типу time поза діапазоном: %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:2435 -#: 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:634 utils/adt/int.c:681 +#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 +#: utils/adt/timestamp.c:3413 utils/adt/timestamp.c:3444 +#: utils/adt/timestamp.c:3475 #, c-format msgid "invalid preceding or following size in window function" msgstr "неприпустимий розмір preceding або following у віконній функції" -#: utils/adt/date.c:2208 utils/adt/date.c:2224 -#, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"час\" містить нерозпізанін одиниці \"%s\"" - -#: utils/adt/date.c:2347 +#: utils/adt/date.c:2334 #, c-format msgid "time zone displacement out of range" msgstr "зсув часового поясу поза діапазоном" -#: 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: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:5442 utils/adt/timestamp.c:5694 +#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 +#: utils/adt/datetime.c:4898 utils/adt/timestamp.c:516 +#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4346 +#: utils/adt/timestamp.c:5491 utils/adt/timestamp.c:5743 #, c-format msgid "time zone \"%s\" not recognized" msgstr "часовий пояс \"%s\" не розпізнаний" -#: utils/adt/date.c:3129 utils/adt/timestamp.c:5472 utils/adt/timestamp.c:5725 +#: utils/adt/date.c:3117 utils/adt/timestamp.c:5521 utils/adt/timestamp.c:5774 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "інтервал \"%s\", який задає часовий пояс, не повинен включати місяці або дні" -#: utils/adt/datetime.c:3775 utils/adt/datetime.c:3782 +#: utils/adt/datetime.c:4023 utils/adt/datetime.c:4030 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "значення поля типу дата/час поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:3784 +#: utils/adt/datetime.c:4032 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Можливо, вам потрібні інші налаштування \"datestyle\"." -#: utils/adt/datetime.c:3789 +#: utils/adt/datetime.c:4037 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "значення поля типу інтервал, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:3795 +#: utils/adt/datetime.c:4043 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "зміщення часового поясу, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:4650 +#: utils/adt/datetime.c:4900 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Це ім'я часового поясу з'являється у файлі конфігурації часового поясу з кодом \"%s\"." -#: utils/adt/datum.c:90 utils/adt/datum.c:102 +#: utils/adt/datum.c:91 utils/adt/datum.c:103 #, c-format msgid "invalid Datum pointer" msgstr "неприпустимий вказівник Datum" -#: utils/adt/dbsize.c:754 utils/adt/dbsize.c:822 +#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 #, c-format msgid "invalid size: \"%s\"" msgstr "неприпустимий розмір: \"%s\"" -#: utils/adt/dbsize.c:823 +#: utils/adt/dbsize.c:814 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Неприпустима одиниця вимірювання розміру: \"%s\"." -#: utils/adt/dbsize.c:824 +#: 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 @@ -22261,9 +23002,9 @@ msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Вхідні дані позбавлені можливості заповнення, скорочені, або пошкоджені іншим чином." #: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 -#: 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 +#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:529 +#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 +#: jsonpath_scan.l:578 #, c-format msgid "invalid input syntax for type %s" msgstr "неприпустимий вхідний синтаксис для типу %s" @@ -22300,390 +23041,385 @@ msgstr "не вдалося визначити фактичний тип пер msgid "enum %s contains no values" 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 "\"%s\" поза діапазоном для дійсного типу" -#: utils/adt/float.c:477 +#: utils/adt/float.c:478 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" поза діапазоном для типу 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:4343 utils/adt/numeric.c:4348 +#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 +#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 +#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 #, c-format msgid "smallint out of range" msgstr "двобайтове ціле поза діапазоном" -#: utils/adt/float.c:1458 utils/adt/numeric.c:3549 utils/adt/numeric.c:9324 +#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 #, c-format msgid "cannot take square root of a negative number" msgstr "вилучити квадратний корінь від'ємного числа не можна" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3824 utils/adt/numeric.c:3936 +#: 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 "нуль у від'ємному ступені дає невизначеність" -#: utils/adt/float.c:1530 utils/adt/numeric.c:3828 utils/adt/numeric.c:10229 +#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 #, 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:3736 -#: utils/adt/numeric.c:10002 +#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 +#: utils/adt/numeric.c:10181 #, c-format msgid "cannot take logarithm of zero" msgstr "обчислити логарифм нуля не можна" -#: utils/adt/float.c:1710 utils/adt/float.c:1743 utils/adt/numeric.c:3674 -#: utils/adt/numeric.c:3731 utils/adt/numeric.c:10006 +#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 +#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 #, 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:1708 +#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 #, c-format msgid "count must be greater than zero" msgstr "лічильник повинен бути більше нуля" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1719 +#: 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/numeric.c:1724 +#: 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:1738 +#: 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 "неприпустима специфікація формату для цілого значення" -#: 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:1192 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" повинно бути останнім використаним шаблоном" -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" повинна бути до \"PR\"" -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1216 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" повинен бути до \"PR\"" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1243 #, c-format msgid "multiple decimal points" msgstr "численні десяткові точки" -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "використовувати \"V\" і десяткову точку разом, не можна" -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1259 #, c-format msgid "cannot use \"S\" twice" msgstr "використовувати \"S\" двічі, не можна" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1263 #, 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:1283 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "використовувати \"S\" і \"MI\" разом, не можна" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1293 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "не можна використовувати \"S\" і \"PL\" разом" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1303 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "не можна використовувати \"S\" і \"SG\" разом" -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1312 #, 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:1338 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "не можна використовувати \"EEEE\" двічі" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1344 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" є несумісним з іншими форматами" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1345 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" може використовуватись лише разом з шаблонами цифр і десяткової точки." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1429 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неприпустимий роздільник формату дати й часу: \"%s\"" -#: utils/adt/formatting.c:1521 +#: utils/adt/formatting.c:1556 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не є числом" -#: utils/adt/formatting.c:1599 +#: utils/adt/formatting.c:1634 #, c-format msgid "case conversion failed: %s" msgstr "помилка при перетворенні регістру: %s" -#: utils/adt/formatting.c:1664 utils/adt/formatting.c:1788 -#: utils/adt/formatting.c:1913 +#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 +#: utils/adt/formatting.c:1933 #, c-format msgid "could not determine which collation to use for %s function" msgstr "не вдалося визначити який параметр сортування використати для функції %s" -#: utils/adt/formatting.c:2285 +#: utils/adt/formatting.c:2314 #, c-format msgid "invalid combination of date conventions" msgstr "неприпустиме поєднання стилів дат" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2315 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Не змішуйте Gregorian і ISO стилі дат (тижнів) в одному шаблоні форматування." -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2338 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфліктуючі значення для \"%s\" поля в рядку форматування" -#: utils/adt/formatting.c:2312 +#: utils/adt/formatting.c:2341 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Це значення суперечить попередньому параметри для поля того ж типу." -#: utils/adt/formatting.c:2383 +#: utils/adt/formatting.c:2412 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "вихідний рядок занадто короткий для \"%s\" поля форматування" -#: utils/adt/formatting.c:2386 +#: utils/adt/formatting.c:2415 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Поле потребує %d символів, але залишилось лише %d." -#: utils/adt/formatting.c:2389 utils/adt/formatting.c:2404 +#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Якщо ваш вихідний рядок не має постійної ширини, спробуйте використати \"FM\" модифікатор." -#: utils/adt/formatting.c:2399 utils/adt/formatting.c:2413 -#: utils/adt/formatting.c:2636 +#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 +#: utils/adt/formatting.c:2665 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неприпустиме значення \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2401 +#: utils/adt/formatting.c:2430 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле потребує %d символів, але вдалося аналізувати лише %d." -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2444 #, c-format msgid "Value must be an integer." msgstr "Значення повинне бути цілим числом." -#: utils/adt/formatting.c:2420 +#: utils/adt/formatting.c:2449 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значення для \"%s\" у вихідному рядку поза діапазоном" -#: utils/adt/formatting.c:2422 +#: utils/adt/formatting.c:2451 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значення повинне бути в діапазоні %d до %d." -#: utils/adt/formatting.c:2638 +#: utils/adt/formatting.c:2667 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Дане значення не відповідає жодному з доступних значень для цього поля." -#: 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:2886 utils/adt/formatting.c:2906 +#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 +#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 +#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 #, c-format msgid "localized string format value too long" msgstr "занадто довге значення формату локалізованого рядка" -#: utils/adt/formatting.c:3342 +#: utils/adt/formatting.c:3373 #, c-format msgid "unmatched format separator \"%c\"" msgstr "невідповідний роздільник формату \"%c\"" -#: utils/adt/formatting.c:3403 +#: utils/adt/formatting.c:3434 #, c-format msgid "unmatched format character \"%s\"" msgstr "невідповідний формат символу \"%s\"" -#: utils/adt/formatting.c:3509 utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "поле форматування \"%s\" підтримується лише в функції to_char" -#: utils/adt/formatting.c:3684 +#: utils/adt/formatting.c:3715 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "неприпустимий вхідний рядок для \"Y,YYY\"" -#: utils/adt/formatting.c:3770 +#: utils/adt/formatting.c:3801 #, c-format msgid "input string is too short for datetime format" msgstr "вхідний рядок занадто короткий для формату дати й часу" -#: utils/adt/formatting.c:3778 +#: utils/adt/formatting.c:3809 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "символи наприкінці залишаються у вхідному рядку після формату дати й часу" -#: utils/adt/formatting.c:4323 +#: utils/adt/formatting.c:4370 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "пропущено часовий пояс у вхідному рядку для типу timestamptz" -#: utils/adt/formatting.c:4329 +#: utils/adt/formatting.c:4376 #, c-format msgid "timestamptz out of range" msgstr "timestamptz поза діапазоном" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4404 #, c-format msgid "datetime format is zoned but not timed" msgstr "формат дати й часу зоновано, але не приурочено" -#: utils/adt/formatting.c:4409 +#: utils/adt/formatting.c:4456 #, c-format msgid "missing time zone in input string for type timetz" msgstr "пропущено часовий пояс у вхідному рядку для типу timetz" -#: utils/adt/formatting.c:4415 +#: utils/adt/formatting.c:4462 #, c-format msgid "timetz out of range" msgstr "timetz поза діапазоном" -#: utils/adt/formatting.c:4441 +#: utils/adt/formatting.c:4488 #, c-format msgid "datetime format is not dated and not timed" msgstr "формат дати й часу не датований і не приурочений" -#: utils/adt/formatting.c:4574 +#: utils/adt/formatting.c:4621 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "година \"%d\" неприпустима для 12-часового годинника" -#: utils/adt/formatting.c:4576 +#: utils/adt/formatting.c:4623 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Використайте 24-часовий годинник, або передавайте години від 1 до 12." -#: utils/adt/formatting.c:4687 +#: utils/adt/formatting.c:4734 #, c-format msgid "cannot calculate day of year without year information" msgstr "не можна обчислити день року без інформації про рік" -#: utils/adt/formatting.c:5606 +#: utils/adt/formatting.c:5653 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не підтримується при введенні" -#: utils/adt/formatting.c:5618 +#: utils/adt/formatting.c:5665 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не підтримується при введенні" -#: utils/adt/genfile.c:78 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "посилання на батьківський каталог (\"..\") не дозволене" - -#: utils/adt/genfile.c:89 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "абсолютний шлях не дозволений" -#: utils/adt/genfile.c:94 +#: utils/adt/genfile.c:89 #, c-format msgid "path must be in or below the current directory" msgstr "шлях повинен вказувати поточний або вкладений каталог" -#: utils/adt/genfile.c:119 utils/adt/oracle_compat.c:187 -#: utils/adt/oracle_compat.c:285 utils/adt/oracle_compat.c:835 -#: utils/adt/oracle_compat.c:1130 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 +#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:838 +#: utils/adt/oracle_compat.c:1141 #, c-format msgid "requested length too large" msgstr "запитана довжина занадто велика" -#: utils/adt/genfile.c:136 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не вдалося знайти в файлі \"%s\": %m" -#: utils/adt/genfile.c:176 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "довжина файлу завелика" -#: utils/adt/genfile.c:253 +#: utils/adt/genfile.c:248 #, c-format msgid "must be superuser to read files with adminpack 1.0" msgstr "щоб читати файли, використовуючи adminpack 1.0 потрібно бути суперкористувачем" @@ -22698,8 +23434,8 @@ msgstr "неприпустима специфікація рядка: A і B н msgid "invalid line specification: must be two distinct points" msgstr "неприпустима специфікація рядка: повинно бути дві різних точки" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3498 utils/adt/geo_ops.c:4369 -#: utils/adt/geo_ops.c:5263 +#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 +#: utils/adt/geo_ops.c:5210 #, c-format msgid "too many points requested" msgstr "запитано занадто багато точок" @@ -22709,98 +23445,58 @@ msgstr "запитано занадто багато точок" msgid "invalid number of points in external \"path\" value" msgstr "неприпустима кількість точок у зовнішньому значенні \"path\"" -#: utils/adt/geo_ops.c:2549 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "функція \"dist_lb\" не реалізована" - -#: utils/adt/geo_ops.c:2568 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "функція \"dist_bl\" не реалізована" - -#: utils/adt/geo_ops.c:2987 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "функція \"close_sl\" не реалізована" - -#: utils/adt/geo_ops.c:3134 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "функція \"close_lb\" не реалізована" - -#: utils/adt/geo_ops.c:3545 +#: utils/adt/geo_ops.c:3449 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "неприпустима кількість точок в зовнішньому значенні \"polygon\"" -#: utils/adt/geo_ops.c:4084 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "функція \"poly_distance\" не реалізована" - -#: utils/adt/geo_ops.c:4461 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "функція \"path_center\" не реалізована" - -#: utils/adt/geo_ops.c:4478 +#: utils/adt/geo_ops.c:4425 #, c-format msgid "open path cannot be converted to polygon" msgstr "відкритий шлях не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:4728 +#: utils/adt/geo_ops.c:4675 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "неприпустимий радіус у зовнішньому значенні \"circle\"" -#: utils/adt/geo_ops.c:5249 +#: utils/adt/geo_ops.c:5196 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг з нульовим радіусом не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:5254 +#: utils/adt/geo_ops.c:5201 #, c-format msgid "must request at least 2 points" msgstr "повинно бути запитано мінімум 2 точки" -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector має занадто багато елементів" - -#: utils/adt/int.c:237 +#: utils/adt/int.c:263 #, c-format msgid "invalid int2vector data" msgstr "неприпустимі дані int2vector" -#: 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:1508 utils/adt/int8.c:1446 utils/adt/numeric.c:1616 -#: utils/adt/timestamp.c:5787 utils/adt/timestamp.c:5867 +#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 +#: utils/adt/timestamp.c:5836 utils/adt/timestamp.c:5916 #, 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:4302 +#: 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:4364 #: 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 поза діапазоном" @@ -22810,23 +23506,23 @@ 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:2026 +#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 #, 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:926 utils/adt/jsonb.c:1727 #, 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:1010 utils/adt/jsonb.c:1177 #, 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:1012 utils/adt/jsonb.c:1179 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Аргументи %s повинні складатись з альтернативних ключей і значень." @@ -22841,18 +23537,18 @@ msgstr "аргумент %d не може бути null" msgid "Object keys should be text." msgstr "Ключі об'єктів повинні бути текстовими." -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 #, c-format msgid "array must have two columns" msgstr "масив повинен мати два стовпця" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 +#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 +#: utils/adt/jsonb.c:1428 #, 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:1231 utils/adt/jsonb.c:1417 #, c-format msgid "mismatched array dimensions" msgstr "невідповідні виміри масиву" @@ -22867,68 +23563,68 @@ msgstr "рядок занадто довгий для представлення msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Через обмеження упровадження, рядки jsonb не можуть перевищувати %d байт." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1192 #, c-format msgid "argument %d: key must not be null" msgstr "аргумент %d: ключ не повинен бути null" -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1780 #, c-format msgid "object keys must be strings" msgstr "ключі об'єктів повинні бути рядками" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:1943 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "привести значення jsonb null до типу %s не можна" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:1944 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "привести рядок jsonb до типу %s не можна" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:1945 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "привести число jsonb до типу %s не можна" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:1946 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "привести логічне значення jsonb до типу %s не можна" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:1947 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "привести масив jsonb до типу %s не можна" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:1948 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "привести об'єкт jsonb до типу %s не можна" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:1949 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "привести масив або об'єкт jsonb до типу %s не можна" -#: utils/adt/jsonb_util.c:751 +#: utils/adt/jsonb_util.c:752 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "кількість пар об'єкта jsonb перевищує максимально дозволену (%zu)" -#: utils/adt/jsonb_util.c:792 +#: utils/adt/jsonb_util.c:793 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "кількість елементів масиву jsonb перевищує максимально дозволену(%zu)" -#: utils/adt/jsonb_util.c:1666 utils/adt/jsonb_util.c:1686 +#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %u bytes" msgstr "загальний розмір елементів масиву jsonb перевищує максимум (%u байт)" -#: utils/adt/jsonb_util.c:1747 utils/adt/jsonb_util.c:1782 -#: utils/adt/jsonb_util.c:1802 +#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 +#: utils/adt/jsonb_util.c:1803 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %u bytes" msgstr "загальний розмір елементів об'єкту jsonb перевищує максимум (%u байт)" @@ -22964,19 +23660,19 @@ msgid "jsonb subscript in assignment must not be null" msgstr "підрядковий символ jsonb у присвоєнні не повинен бути null" #: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:798 -#: utils/adt/jsonfuncs.c:2482 utils/adt/jsonfuncs.c:2922 -#: utils/adt/jsonfuncs.c:3711 utils/adt/jsonfuncs.c:4041 +#: utils/adt/jsonfuncs.c:2368 utils/adt/jsonfuncs.c:2808 +#: utils/adt/jsonfuncs.c:3597 utils/adt/jsonfuncs.c:3930 #, c-format msgid "cannot call %s on a scalar" msgstr "викликати %s зі скаляром, не можна" #: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:785 -#: utils/adt/jsonfuncs.c:2924 utils/adt/jsonfuncs.c:3700 +#: utils/adt/jsonfuncs.c:2810 utils/adt/jsonfuncs.c:3586 #, c-format msgid "cannot call %s on an array" msgstr "викликати %s з масивом, не можна" -#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:494 #, c-format msgid "unsupported Unicode escape sequence" msgstr "непідтримувана спеціальна послідовність Unicode" @@ -22996,177 +23692,182 @@ msgstr "отримати довжину скаляра масиву не мож msgid "cannot get array length of a non-array" msgstr "отримати довжину масива для не масиву не можна" -#: utils/adt/jsonfuncs.c:1934 +#: utils/adt/jsonfuncs.c:1931 #, c-format msgid "cannot call %s on a non-object" msgstr "викликати %s з не об'єктом, не можна" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2115 #, c-format msgid "cannot deconstruct an array as an object" msgstr "вилучити масив у вигляді об'єкту не можна" -#: utils/adt/jsonfuncs.c:2185 +#: utils/adt/jsonfuncs.c:2127 #, c-format msgid "cannot deconstruct a scalar" msgstr "вилучити скаляр не можна" -#: utils/adt/jsonfuncs.c:2231 +#: utils/adt/jsonfuncs.c:2170 #, c-format msgid "cannot extract elements from a scalar" msgstr "вилучити елементи зі скаляру не можна" -#: utils/adt/jsonfuncs.c:2235 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot extract elements from an object" msgstr "вилучити елементи з об'єкту не можна" -#: utils/adt/jsonfuncs.c:2469 utils/adt/jsonfuncs.c:3926 +#: utils/adt/jsonfuncs.c:2355 utils/adt/jsonfuncs.c:3815 #, c-format msgid "cannot call %s on a non-array" msgstr "викликати %s з не масивом не можна" -#: utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2544 -#: utils/adt/jsonfuncs.c:2561 utils/adt/jsonfuncs.c:2567 +#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:2430 +#: utils/adt/jsonfuncs.c:2447 utils/adt/jsonfuncs.c:2453 #, c-format msgid "expected JSON array" msgstr "очікувався масив JSON" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2426 #, c-format msgid "See the value of key \"%s\"." msgstr "Перевірте значення ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2562 +#: utils/adt/jsonfuncs.c:2448 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Перевірте елемент масиву %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2568 +#: utils/adt/jsonfuncs.c:2454 #, c-format msgid "See the array element %s." msgstr "Перевірте елемент масиву %s." -#: utils/adt/jsonfuncs.c:2603 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "malformed JSON array" msgstr "неправильний масив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3430 +#: utils/adt/jsonfuncs.c:3316 #, 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:3454 +#: utils/adt/jsonfuncs.c:3340 #, c-format msgid "could not determine row type for result of %s" msgstr "не вдалося визначити тип рядка для результату %s" -#: utils/adt/jsonfuncs.c:3456 +#: utils/adt/jsonfuncs.c:3342 #, 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:3943 utils/adt/jsonfuncs.c:4023 +#: utils/adt/jsonfuncs.c:3704 utils/fmgr/funcapi.c:103 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" + +#: utils/adt/jsonfuncs.c:3832 utils/adt/jsonfuncs.c:3912 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s повинен бути масив об'єктів" -#: utils/adt/jsonfuncs.c:3976 +#: utils/adt/jsonfuncs.c:3865 #, c-format msgid "cannot call %s on an object" msgstr "викликати %s з об'єктом не можна" -#: utils/adt/jsonfuncs.c:4384 utils/adt/jsonfuncs.c:4443 -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4272 utils/adt/jsonfuncs.c:4331 +#: utils/adt/jsonfuncs.c:4412 #, c-format msgid "cannot delete from scalar" msgstr "видалити зі скаляру не можна" -#: utils/adt/jsonfuncs.c:4529 +#: utils/adt/jsonfuncs.c:4417 #, c-format msgid "cannot delete from object using integer index" msgstr "видалити з об'єкту по числовому індексу не можна" -#: utils/adt/jsonfuncs.c:4597 utils/adt/jsonfuncs.c:4758 +#: utils/adt/jsonfuncs.c:4485 utils/adt/jsonfuncs.c:4646 #, c-format msgid "cannot set path in scalar" msgstr "встановити шлях в скалярі не можна" -#: utils/adt/jsonfuncs.c:4639 utils/adt/jsonfuncs.c:4681 +#: utils/adt/jsonfuncs.c:4527 utils/adt/jsonfuncs.c:4569 #, 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:4652 +#: utils/adt/jsonfuncs.c:4540 #, c-format msgid "JSON value must not be null" msgstr "Значення JSON не повинне бути null" -#: utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4541 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Виняток було запущено через те, що null_value_treatment дорівнює \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4654 +#: utils/adt/jsonfuncs.c:4542 #, 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:4709 +#: utils/adt/jsonfuncs.c:4597 #, c-format msgid "cannot delete path in scalar" msgstr "видалити шлях в скалярі не можна" -#: utils/adt/jsonfuncs.c:4925 +#: utils/adt/jsonfuncs.c:4813 #, c-format msgid "path element at position %d is null" msgstr "елемент шляху в позиції %d є null" -#: utils/adt/jsonfuncs.c:4944 utils/adt/jsonfuncs.c:4975 -#: utils/adt/jsonfuncs.c:5048 +#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4936 #, c-format msgid "cannot replace existing key" msgstr "замініти існуючий ключ не можна" -#: utils/adt/jsonfuncs.c:4945 utils/adt/jsonfuncs.c:4976 +#: utils/adt/jsonfuncs.c:4833 utils/adt/jsonfuncs.c:4864 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Шлях припускає, що ключ є складеним об'єктом, але це скалярне значення." -#: utils/adt/jsonfuncs.c:5049 +#: utils/adt/jsonfuncs.c:4937 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Спробуйте, використати функцію jsonb_set, щоб замінити значення ключа." -#: utils/adt/jsonfuncs.c:5153 +#: utils/adt/jsonfuncs.c:5041 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "елмент шляху в позиції %d не є цілим числом: \"%s\"" -#: utils/adt/jsonfuncs.c:5170 +#: utils/adt/jsonfuncs.c:5058 #, c-format msgid "path element at position %d is out of range: %d" msgstr "елемент шляху в позиції %d поза діапазоном: %d" -#: utils/adt/jsonfuncs.c:5322 +#: utils/adt/jsonfuncs.c:5210 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неправильний тип позначки, дозволені лише масиви і скаляри" -#: utils/adt/jsonfuncs.c:5329 +#: utils/adt/jsonfuncs.c:5217 #, c-format msgid "flag array element is not a string" msgstr "елемент масиву позначок не є рядком" -#: utils/adt/jsonfuncs.c:5330 utils/adt/jsonfuncs.c:5352 +#: utils/adt/jsonfuncs.c:5218 utils/adt/jsonfuncs.c:5240 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Можливі значення: \"string\", \"numeric\", \"boolean\", \"key\", і \"all\"." -#: utils/adt/jsonfuncs.c:5350 +#: utils/adt/jsonfuncs.c:5238 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неправильна позначка в масиві позначок: \"%s\"" @@ -23321,7 +24022,7 @@ msgstr "довжина аргументу levenshtein перевищує мак msgid "nondeterministic collations are not supported for LIKE" msgstr "недетерміновані параметри сортування не підтримуються для LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1003 +#: utils/adt/like.c:189 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "не вдалося визначити який параметр сортування використати для ILIKE" @@ -23336,27 +24037,27 @@ msgstr "недетерміновані параметри сортування 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 "Рядок виходу повинен бути пустим або складатися з одного символу." -#: utils/adt/like_support.c:988 +#: utils/adt/like_support.c:1014 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "порівняння без урахування регістру не підтримується для типу bytea" -#: utils/adt/like_support.c:1090 +#: utils/adt/like_support.c:1115 #, 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\"" @@ -23371,430 +24072,415 @@ 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/mcxtfuncs.c:184 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "must be a superuser to log memory contexts" -msgstr "щоб записувати контексти пам'яті, потрібно бути суперкористувачем" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d не є серверним процесом PostgreSQL" -#: utils/adt/misc.c:244 +#: utils/adt/misc.c:216 #, c-format msgid "global tablespace never has databases" msgstr "в табличному просторі global николи не було баз даних" -#: utils/adt/misc.c:266 +#: utils/adt/misc.c:238 #, c-format msgid "%u is not a tablespace OID" msgstr "%u не є OID табличного простору" -#: utils/adt/misc.c:484 +#: utils/adt/misc.c:457 msgid "unreserved" msgstr "не зарезервовано" -#: utils/adt/misc.c:488 +#: utils/adt/misc.c:461 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервовано (не може бути іменем типу або функції)" -#: utils/adt/misc.c:492 +#: utils/adt/misc.c:465 msgid "reserved (can be function or type name)" msgstr "зарезервовано (може бути іменем типу або функції)" -#: utils/adt/misc.c:496 +#: utils/adt/misc.c:469 msgid "reserved" msgstr "зарезервовано" -#: utils/adt/misc.c:507 +#: utils/adt/misc.c:480 msgid "can be bare label" msgstr "може бути пустою міткою" -#: utils/adt/misc.c:512 +#: utils/adt/misc.c:485 msgid "requires AS" msgstr "потребує AS" -#: utils/adt/misc.c:759 utils/adt/misc.c:773 utils/adt/misc.c:812 -#: utils/adt/misc.c:818 utils/adt/misc.c:824 utils/adt/misc.c:847 +#: 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:761 +#: utils/adt/misc.c:734 #, c-format msgid "String has unclosed double quotes." msgstr "Рядок має не закриті лапки." -#: utils/adt/misc.c:775 +#: utils/adt/misc.c:748 #, c-format msgid "Quoted identifier must not be empty." msgstr "Ідентифікатор в лапках не повинен бути пустим." -#: utils/adt/misc.c:814 +#: utils/adt/misc.c:787 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" немає припустимого ідентифікатору." -#: utils/adt/misc.c:820 +#: utils/adt/misc.c:793 #, c-format msgid "No valid identifier after \".\"." msgstr "Після \".\" немає припустимого ідентифікатора." -#: utils/adt/misc.c:878 +#: utils/adt/misc.c:853 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журналу \"%s\" не підтримується" -#: utils/adt/misc.c:879 +#: utils/adt/misc.c:854 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "Підтримуються формати журналів \"stderr\" і \"csvlog\"." +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Підтримуванні формати журналів: \"stderr\", \"csvlog\", і \"jsonlog\"." -#: 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 +#: 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:150 +#: utils/adt/multirangetypes.c:151 #, c-format msgid "Missing left brace." msgstr "Пропущено ліву дужку." -#: utils/adt/multirangetypes.c:192 +#: utils/adt/multirangetypes.c:193 #, c-format msgid "Expected range start." msgstr "Очікуваний початок діапазону." -#: utils/adt/multirangetypes.c:262 +#: utils/adt/multirangetypes.c:263 #, c-format msgid "Expected comma or end of multirange." msgstr "Очікувалась кома або закінчення мультидіапазону." -#: utils/adt/multirangetypes.c:975 +#: utils/adt/multirangetypes.c:976 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "мультидіапазони не можуть бути побудовані з багатовимірних масивів" -#: utils/adt/multirangetypes.c:1001 +#: utils/adt/multirangetypes.c:1002 #, 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 +#: 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 "не можна використовувати \"І\" (AND) для значень inet різного розміру" -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1933 #, c-format msgid "cannot OR inet values of different sizes" msgstr "не можна використовувати \"АБО\" (OR) для значень inet різного розміру" -#: 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:967 +#: utils/adt/numeric.c:1027 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неприпустимий знак у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:973 +#: utils/adt/numeric.c:1033 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неприпустимий масштаб у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:982 +#: utils/adt/numeric.c:1042 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "неприпустиме число у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:1195 utils/adt/numeric.c:1209 +#: 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:1200 +#: 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:1218 +#: utils/adt/numeric.c:1280 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неприпустимий модифікатор типу NUMERIC" -#: utils/adt/numeric.c:1576 +#: utils/adt/numeric.c:1638 #, c-format msgid "start value cannot be NaN" msgstr "початкове значення не може бути NaN" -#: utils/adt/numeric.c:1580 +#: utils/adt/numeric.c:1642 #, c-format msgid "start value cannot be infinity" msgstr "початкове значення не може бути нескінченністю" -#: utils/adt/numeric.c:1587 +#: utils/adt/numeric.c:1649 #, c-format msgid "stop value cannot be NaN" msgstr "кінцеве значення не може бути NaN" -#: utils/adt/numeric.c:1591 +#: utils/adt/numeric.c:1653 #, c-format msgid "stop value cannot be infinity" msgstr "кінцеве значення не може бути нескінченністю" -#: utils/adt/numeric.c:1604 +#: utils/adt/numeric.c:1666 #, c-format msgid "step size cannot be NaN" msgstr "розмір кроку не може бути NaN" -#: utils/adt/numeric.c:1608 +#: utils/adt/numeric.c:1670 #, c-format msgid "step size cannot be infinity" msgstr "розмір кроку не може бути нескінченністю" -#: utils/adt/numeric.c:3489 +#: utils/adt/numeric.c:3551 #, c-format msgid "factorial of a negative number is undefined" msgstr "факторіал від'ємного числа не визначено" -#: utils/adt/numeric.c:3499 utils/adt/numeric.c:6949 utils/adt/numeric.c:7422 -#: utils/adt/numeric.c:9799 utils/adt/numeric.c:10286 utils/adt/numeric.c:10412 -#: utils/adt/numeric.c:10485 +#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 +#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 +#: utils/adt/numeric.c:10662 #, c-format msgid "value overflows numeric format" msgstr "значення переповнюють формат numeric" -#: utils/adt/numeric.c:4209 utils/adt/numeric.c:4289 utils/adt/numeric.c:4330 -#: utils/adt/numeric.c:4524 +#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 +#: utils/adt/numeric.c:4586 #, c-format msgid "cannot convert NaN to %s" msgstr "неможливо перетворити NaN на %s" -#: utils/adt/numeric.c:4213 utils/adt/numeric.c:4293 utils/adt/numeric.c:4334 -#: utils/adt/numeric.c:4528 +#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 +#: utils/adt/numeric.c:4590 #, c-format msgid "cannot convert infinity to %s" msgstr "неможливо перетворити нескінченність на %s" -#: utils/adt/numeric.c:4537 +#: utils/adt/numeric.c:4599 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn поза діапазоном" -#: utils/adt/numeric.c:7506 utils/adt/numeric.c:7553 +#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 #, c-format msgid "numeric field overflow" msgstr "надлишок поля numeric" -#: utils/adt/numeric.c:7507 +#: utils/adt/numeric.c:7548 #, 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:7554 +#: utils/adt/numeric.c:7594 #, 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-бітного integer" - -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:293 #, c-format msgid "invalid oidvector data" msgstr "неприпустимі дані oidvector" -#: utils/adt/oracle_compat.c:972 +#: utils/adt/oracle_compat.c:975 #, c-format msgid "requested character too large" msgstr "запитаний символ занадто великий" -#: utils/adt/oracle_compat.c:1022 utils/adt/oracle_compat.c:1084 +#: utils/adt/oracle_compat.c:1019 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "запитаний символ занадто великий для кодування: %d" +msgid "character number must be positive" +msgstr "номер символу має бути додатнім" -#: utils/adt/oracle_compat.c:1063 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "запитаний символ не припустимий для кодування: %d" - -#: utils/adt/oracle_compat.c:1077 +#: utils/adt/oracle_compat.c:1023 #, 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:1041 utils/adt/oracle_compat.c:1094 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "запитаний символ занадто великий для кодування: %u" + +#: utils/adt/oracle_compat.c:1082 +#, 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:1228 +#: utils/adt/pg_locale.c:1231 +#, c-format +msgid "Apply system library package updates." +msgstr "Застосуйте оновлення для пакету з системною бібліотекою." + +#: utils/adt/pg_locale.c:1455 utils/adt/pg_locale.c:1703 +#: utils/adt/pg_locale.c:1982 utils/adt/pg_locale.c:2004 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "не вдалося відкрити сортувальник для локалізації \"%s\": %s" + +#: utils/adt/pg_locale.c:1468 utils/adt/pg_locale.c:2013 #, c-format -msgid "Apply system library package updates." -msgstr "Застосуйте оновлення для пакету з системною бібліотекою." +msgid "ICU is not supported in this build" +msgstr "ICU не підтримується в цій збірці" -#: utils/adt/pg_locale.c:1442 +#: utils/adt/pg_locale.c:1497 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не вдалося створити локалізацію \"%s\": %m" -#: utils/adt/pg_locale.c:1445 +#: utils/adt/pg_locale.c:1500 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Операційній системі не вдалося знайти дані локалізації з іменем \"%s\"." -#: utils/adt/pg_locale.c:1547 +#: utils/adt/pg_locale.c:1608 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "параметри сортування з різними значеннями collate і ctype не підтримуються на цій платформі" -#: utils/adt/pg_locale.c:1556 +#: utils/adt/pg_locale.c:1617 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "провайдер параметрів сортування LIBC не підтримується на цій платформі" -#: 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: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:1588 -#, c-format -msgid "ICU is not supported in this build" -msgstr "ICU не підтримується в цій збірці" - -#: utils/adt/pg_locale.c:1609 +#: utils/adt/pg_locale.c:1652 #, 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 "для параметру сортування \"%s\" який не має фактичної версії, була вказана версія" -#: utils/adt/pg_locale.c:1616 +#: utils/adt/pg_locale.c:1658 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "невідповідність версій для параметру сортування \"%s\"" -#: utils/adt/pg_locale.c:1618 +#: utils/adt/pg_locale.c:1660 #, 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:1621 +#: utils/adt/pg_locale.c:1663 #, 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:1692 +#: utils/adt/pg_locale.c:1734 #, c-format msgid "could not load locale \"%s\"" msgstr "не вдалося завантажити локаль \"%s\"" -#: utils/adt/pg_locale.c:1717 +#: utils/adt/pg_locale.c:1759 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "не вдалося отримати версію параметрів сортування для локалізації \"%s\": код помилки %lu" -#: utils/adt/pg_locale.c:1755 +#: utils/adt/pg_locale.c:1797 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не підтримує кодування \"%s\"" -#: utils/adt/pg_locale.c:1762 +#: utils/adt/pg_locale.c:1804 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не вдалося відкрити перетворювач ICU для кодування \"%s\": %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:1835 utils/adt/pg_locale.c:1844 +#: utils/adt/pg_locale.c:1873 utils/adt/pg_locale.c:1883 #, c-format msgid "%s failed: %s" msgstr "%s помилка: %s" -#: utils/adt/pg_locale.c:2113 +#: utils/adt/pg_locale.c:2182 #, c-format msgid "invalid multibyte character for locale" msgstr "неприпустимий мультибайтний символ для локалізації" -#: utils/adt/pg_locale.c:2114 +#: utils/adt/pg_locale.c:2183 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Параметр локалізації серверу LC_CTYPE, можливо, несумісний з кодуванням бази даних." @@ -23814,11 +24500,26 @@ msgstr "віднімати NaN з pg_lsn не можна" msgid "function can only be called when server is in binary upgrade mode" msgstr "функцію можна викликати тільки коли сервер знаходиться в режимі двійкового оновлення" -#: utils/adt/pgstatfuncs.c:503 +#: utils/adt/pgstatfuncs.c:483 #, c-format msgid "invalid command name: \"%s\"" msgstr "неприпустиме ім’я команди: \"%s\"" +#: utils/adt/pgstatfuncs.c:2115 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "нерозпізнане відновлення мети: \"%s\"" + +#: utils/adt/pgstatfuncs.c:2116 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgstr "Ціль має бути \"archiver\", \"bgwriter\", \"recovery_prefetch\", або \"wal\"." + +#: utils/adt/pgstatfuncs.c:2198 +#, 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" @@ -23849,11 +24550,6 @@ msgstr "результат різниці діапазонів не буде б msgid "result of range union would not be contiguous" msgstr "результат об'єднання діапазонів не буде безперервним" -#: 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" @@ -23904,33 +24600,48 @@ msgstr "Занадто багато ком." msgid "Junk after right parenthesis or bracket." msgstr "Сміття після правої дужки." -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4549 +#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 #, 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() з початковим параметром, приведіть тип четвертого аргумента до цілого числа." + +#: 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:11868 utils/misc/guc.c:11902 +#, 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 не може містити більше двох роздільників escape-double-quote" #. 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 "занадто багато відповідностей для регулярного виразу" @@ -23945,18 +24656,18 @@ msgstr "ім'я \"%s\" мають декілька функцій" msgid "more than one operator named %s" msgstr "ім'я %s мають декілька операторів" -#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8189 +#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8771 #, c-format msgid "missing argument" msgstr "пропущено аргумент" -#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8190 +#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8772 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Щоб позначити пропущений аргумент унарного оператору, використайте NONE." #: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9793 utils/adt/ruleutils.c:9962 +#: utils/adt/ruleutils.c:10028 utils/adt/ruleutils.c:10197 #, c-format msgid "too many arguments" msgstr "занадто багато аргументів" @@ -23968,7 +24679,7 @@ msgstr "Надайте для оператора два типи аргумен #: 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:3698 utils/adt/varlena.c:3703 +#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 #, c-format msgid "invalid name syntax" msgstr "неприпустимий синтаксис в імені" @@ -23993,83 +24704,83 @@ msgstr "очікувалось ім'я типу" msgid "improper type name" msgstr "неправильне ім'я типу" -#: 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 "insert або update в таблиці \"%s\" порушує обмеження зовнішнього ключа \"%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 не дозволяє змішувати в значенні ключа null і nonnull." -#: utils/adt/ri_triggers.c:1965 +#: utils/adt/ri_triggers.c:2031 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "функція \"%s\" повинна запускатись для INSERT" -#: utils/adt/ri_triggers.c:1971 +#: utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "функція \"%s\" повинна запускатись для UPDATE" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2043 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "функція \"%s\" повинна запускатись для DELETE" -#: 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 "для тригеру \"%s\" таблиці \"%s\" немає введення pg_constraint" -#: 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 "Видаліть цей тригер цілісності зв’язків і пов'язані об'єкти, а потім виконайте ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2032 gram.y:3934 +#: utils/adt/ri_triggers.c:2098 gram.y:4172 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "Вираз MATCH PARTIAL все ще не реалізований" -#: 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 "неочікуваний результат запиту цілісності зв’язків до \"%s\" з обмеження \"%s\" таблиці \"%s\"" -#: 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 "Скоріше за все, це викликано правилом, яке переписало запит." -#: utils/adt/ri_triggers.c:2520 +#: utils/adt/ri_triggers.c:2588 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "видалення секції \"%s\" порушує обмеження зовнішнього ключа \"%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 "На ключ (%s)=(%s) все ще є посилання в таблиці \"%s\"." -#: 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 "Ключ (%s)=(%s) не присутній в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2537 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ не присутній в таблиці \"%s\"." -#: 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 "update або delete в таблиці \"%s\" порушує обмеження зовнішнього ключа \"%s\" таблиці \"%s\"" -#: utils/adt/ri_triggers.c:2551 +#: utils/adt/ri_triggers.c:2619 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "На ключ все ще є посилання в таблиці \"%s\"." @@ -24132,135 +24843,130 @@ msgstr "не можна порівнювати неподібні типи ст msgid "cannot compare record types with different numbers of columns" msgstr "не можна порівнювати типи записів з різної кількістю стовпців" -#: utils/adt/ruleutils.c:5164 +#: utils/adt/ruleutils.c:2725 +#, c-format +msgid "input is a query, not an expression" +msgstr "вхідне значення є запитом, а не виразом" + +#: utils/adt/ruleutils.c:2737 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "вираз містить змінні більше одного відношення" + +#: utils/adt/ruleutils.c:2744 +#, c-format +msgid "expression contains variables" +msgstr "вираз містить змінні" + +#: utils/adt/ruleutils.c:5267 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" має непідтримуваний тип подій %d" -#: utils/adt/timestamp.c:109 +#: utils/adt/timestamp.c:110 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s точність не повинна бути від'ємною" -#: utils/adt/timestamp.c:115 +#: 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:178 utils/adt/timestamp.c:436 utils/misc/guc.c:12435 +#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12892 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "позначка часу поза діапазоном: \"%s\"" -#: utils/adt/timestamp.c:374 +#: utils/adt/timestamp.c:375 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "точність позначки часу (%d) повинна бути між %d і %d" -#: utils/adt/timestamp.c:498 +#: utils/adt/timestamp.c:499 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Числові часові пояси повинні мати \"-\" або \"+\" в якості першого символу." -#: utils/adt/timestamp.c:511 +#: utils/adt/timestamp.c:512 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "числовий часовий пояс \"%s\" поза діапазоном" -#: 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 "позначка часу поза діапазоном: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:726 +#: utils/adt/timestamp.c:727 #, c-format msgid "timestamp cannot be NaN" msgstr "позначка часу не може бути NaN" -#: 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 "позначка часу поза діапазоном: \"%g\"" -#: utils/adt/timestamp.c:1068 utils/adt/timestamp.c:1101 +#: 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:3310 +#: utils/adt/timestamp.c:3385 utils/adt/timestamp.c:3758 +#: utils/adt/timestamp.c:3882 utils/adt/timestamp.c:4432 +#, c-format +msgid "interval out of range" +msgstr "інтервал поза діапазоном" + +#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 #, c-format msgid "invalid INTERVAL type modifier" msgstr "неприпустимий модифікатор типу INTERVAL" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1078 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d) точність не повинна бути від'ємною" -#: utils/adt/timestamp.c:1090 +#: utils/adt/timestamp.c:1084 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d) точність зменшена до максимально можливої, %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1466 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d) точність повинна бути між %d і %d" -#: utils/adt/timestamp.c:2660 +#: utils/adt/timestamp.c:2689 #, c-format msgid "cannot subtract infinite timestamps" msgstr "віднімати безкінечні позначки часу не можна" -#: utils/adt/timestamp.c:3837 utils/adt/timestamp.c:4020 +#: utils/adt/timestamp.c:3918 utils/adt/timestamp.c:4101 #, c-format msgid "origin out of range" msgstr "джерело поза діапазоном" -#: utils/adt/timestamp.c:3842 utils/adt/timestamp.c:4025 +#: utils/adt/timestamp.c:3923 utils/adt/timestamp.c:4106 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "позначки часу не можна розділяти на інтервали, що містять місяці або роки" -#: utils/adt/timestamp.c:3849 utils/adt/timestamp.c:4032 +#: utils/adt/timestamp.c:3930 utils/adt/timestamp.c:4113 #, 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: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:4171 utils/adt/timestamp.c:4615 -#: utils/adt/timestamp.c:5091 utils/adt/timestamp.c:5139 +#: utils/adt/timestamp.c:4426 #, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "одиниці позначки часу з часовим поясом \"%s\" не підтримуються" - -#: 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:4346 -#, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "одиниці інтервалу \"%s\" не підтримуються, тому, що місяці зазвичай мають дробове число тижнів" - -#: utils/adt/timestamp.c:4352 utils/adt/timestamp.c:5271 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "одиниці інтервалу \"%s\" не підтримуються" - -#: utils/adt/timestamp.c:4368 utils/adt/timestamp.c:5338 -#, c-format -msgid "interval units \"%s\" not recognized" -msgstr "одиниці інтервалу \"%s\" не розпізнані" +msgid "Months usually have fractional weeks." +msgstr "У місяців зазвичай є дробові тижні." #: utils/adt/trigfuncs.c:42 #, c-format @@ -24368,58 +25074,62 @@ msgstr "слово занадто довге (%ld байт, при максим msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "рядок занадто довгий для tsvector (%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:2429 +#: utils/adt/tsvector_op.c:2434 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запит ts_stat повинен повернути один стовпець tsvector" -#: utils/adt/tsvector_op.c:2618 +#: utils/adt/tsvector_op.c:2623 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "стовпець типу tsvector \"%s\" не існує" -#: utils/adt/tsvector_op.c:2625 +#: utils/adt/tsvector_op.c:2630 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "стовпець \"%s\" повинен мати тип tsvector" -#: utils/adt/tsvector_op.c:2637 +#: utils/adt/tsvector_op.c:2642 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "стовпець конфігурації \"%s\" не існує" -#: utils/adt/tsvector_op.c:2643 +#: utils/adt/tsvector_op.c:2648 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "стовпець \"%s\" повинен мати тип regconfig" -#: utils/adt/tsvector_op.c:2650 +#: utils/adt/tsvector_op.c:2655 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значення стовпця конфігурації \"%s\" не повинне бути null" -#: utils/adt/tsvector_op.c:2663 +#: utils/adt/tsvector_op.c:2668 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "ім'я конфігурації текстового пошуку \"%s\" повинно вказуватися зі схемою" -#: utils/adt/tsvector_op.c:2688 +#: utils/adt/tsvector_op.c:2693 #, c-format msgid "column \"%s\" is not of a character type" msgstr "стовпець \"%s\" має не символьний тип" @@ -24439,7 +25149,7 @@ 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 "не вдалося згенерувати випадкові значення" @@ -24484,9 +25194,9 @@ msgstr "неприпустима довжина у зовнішньому ряд msgid "bit string too long for type bit varying(%d)" msgstr "рядок бітів занадто довгий для типу bit varying(%d)" -#: 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:3340 -#: utils/adt/varlena.c:3418 +#: 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:3309 +#: utils/adt/varlena.c:3387 #, c-format msgid "negative substring length not allowed" msgstr "від'ємна довжина підрядка не дозволена" @@ -24511,7 +25221,7 @@ msgstr "не можна використовувати (XOR) для бітови msgid "bit index %d out of valid range (0..%d)" msgstr "індекс біту %d поза припустимим діапазоном (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3622 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 #, c-format msgid "new bit must be 0 or 1" msgstr "новий біт повинен бути 0 або 1" @@ -24526,127 +25236,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:1516 +#: 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:1209 utils/adt/varlena.c:1956 +#: 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:1615 utils/adt/varlena.c:1628 +#: 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:1643 +#: utils/adt/varlena.c:1624 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не вдалося порівняти рядки в Unicode: %m" -#: utils/adt/varlena.c:1694 utils/adt/varlena.c:2406 +#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 #, c-format msgid "collation failed: %s" msgstr "помилка в бібліотеці сортування: %s" -#: utils/adt/varlena.c:2613 +#: utils/adt/varlena.c:2582 #, c-format msgid "sort key generation failed: %s" msgstr "не вдалося згенерувати ключ сортування: %s" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3573 +#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "індекс %d поза припустимим діапазоном, 0..%d" -#: utils/adt/varlena.c:3537 utils/adt/varlena.c:3609 +#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "індекс %lld поза допустимим діапазоном, 0..%lld" -#: utils/adt/varlena.c:4645 +#: utils/adt/varlena.c:4640 #, c-format msgid "field position must not be zero" msgstr "позиція поля не повинна бути нульовою" -#: utils/adt/varlena.c:5686 +#: utils/adt/varlena.c:5660 #, c-format msgid "unterminated format() type specifier" msgstr "незавершений специфікатор типу format()" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5821 utils/adt/varlena.c:5942 +#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Для представлення одного знаку \"%%\", використайте \"%%%%\"." -#: utils/adt/varlena.c:5819 utils/adt/varlena.c:5940 +#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "нерозпізнаний специфікатор типу format() \"%.*s\"" -#: utils/adt/varlena.c:5832 utils/adt/varlena.c:5889 +#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 #, c-format msgid "too few arguments for format()" msgstr "занадто мало аргументів для format()" -#: utils/adt/varlena.c:5985 utils/adt/varlena.c:6167 +#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 #, c-format msgid "number is out of range" msgstr "число поза діапазоном" -#: utils/adt/varlena.c:6048 utils/adt/varlena.c:6076 +#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат посилається на аргумент 0, але аргументи нумеруются з 1" -#: utils/adt/varlena.c:6069 +#: utils/adt/varlena.c:6043 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "вказівка аргументу ширини повинно закінчуватися \"$\"" -#: utils/adt/varlena.c:6114 +#: utils/adt/varlena.c:6088 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "значення null не можна форматувати у вигляді SQL-ідентифікатору" -#: utils/adt/varlena.c:6240 +#: utils/adt/varlena.c:6214 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Нормалізація Unicode може виконуватись лише тоді, коли кодування серверу - UTF8" -#: utils/adt/varlena.c:6253 +#: utils/adt/varlena.c:6227 #, c-format msgid "invalid normalization form: %s" msgstr "неприпустима форма нормалізації: %s" -#: utils/adt/varlena.c:6456 utils/adt/varlena.c:6491 utils/adt/varlena.c:6526 +#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 #, c-format msgid "invalid Unicode code point: %04X" msgstr "неприпустима точка коду Unicode: %04X" -#: utils/adt/varlena.c:6556 +#: utils/adt/varlena.c:6530 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Спеціальні коди Unicode повинні бути \\XXXX, \\+XXXXXX, \\uXXXXXX, або \\UXXXXXX." -#: utils/adt/windowfuncs.c:243 +#: utils/adt/windowfuncs.c:306 #, c-format msgid "argument of ntile must be greater than zero" msgstr "аргумент ntile повинен бути більше нуля" -#: 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 повинен бути більше нуля" #: utils/adt/xid8funcs.c:117 #, c-format -msgid "transaction ID %s is in the future" -msgstr "ідентифікатор транзакції %s відноситься до майбутнього" +msgid "transaction ID %llu is in the future" +msgstr "ідентифікатор транзакції %llu знаходиться в майбутньому" -#: utils/adt/xid8funcs.c:548 +#: utils/adt/xid8funcs.c:547 #, c-format msgid "invalid external pg_snapshot data" msgstr "неприпустимі зовнішні дані pg_snapshot" @@ -24661,146 +25371,151 @@ msgstr "XML-функції не підтримуються" msgid "This functionality requires the server to be built with libxml support." msgstr "Ця функціональність потребує, щоб сервер був побудований з підтримкою libxml." -#: 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 "неприпустиме ім’я кодування \"%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 "функція xmlvalidate не реалізована" -#: 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 має несумісний тип char: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 має несумісний тип char: 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 несумісна з файлами-заголовками libxml2, з котрими був зібраний PostgreSQL." -#: 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:2767 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "portal \"%s\" не повертає кортежі" + +#: utils/adt/xml.c:4019 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неприпустимий масив з зіставленням простіру імен XML" -#: utils/adt/xml.c:4017 +#: utils/adt/xml.c:4020 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Масив повинен бути двовимірним і містити 2 елемента по другій вісі." -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4044 #, c-format msgid "empty XPath expression" msgstr "пустий вираз XPath" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4096 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ні ім'я простіру імен ні URI не можуть бути null" -#: utils/adt/xml.c:4100 +#: utils/adt/xml.c:4103 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "не вдалося зареєструвати простір імен XML з ім'ям \"%s\" і URI \"%s\"" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4454 #, c-format msgid "DEFAULT namespace is not supported" msgstr "Простір імен DEFAULT не підтримується" -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4483 #, c-format msgid "row path filter must not be empty string" msgstr "шлях фільтруючих рядків не повинен бути пустим" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4514 #, c-format msgid "column path filter must not be empty string" msgstr "шлях фільтруючого стовпця не повинен бути пустим" -#: utils/adt/xml.c:4655 +#: utils/adt/xml.c:4658 #, c-format msgid "more than one value returned by column XPath expression" msgstr "вираз XPath, який відбирає стовпець, повернув більше одного значення" @@ -24831,42 +25546,52 @@ 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:722 +#: utils/cache/plancache.c:724 #, c-format msgid "cached plan must not change result type" msgstr "в кешованому плані не повинен змінюватись тип результату" -#: utils/cache/relcache.c:6325 +#: utils/cache/relcache.c:3754 +#, c-format +msgid "heap relfilenode value not set when in binary upgrade mode" +msgstr "значення relfilenode динамічної пам'яті не встановлено в режимі двійкового оновлення" + +#: utils/cache/relcache.c:3762 +#, c-format +msgid "unexpected request for new relfilenode in binary upgrade mode" +msgstr "неочікуваний запит на новий relfilenode в режимі двійкового оновлення" + +#: utils/cache/relcache.c:6473 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "не вдалося створити файл ініціалізації для кешу відношень \"%s\": %m" -#: utils/cache/relcache.c:6327 +#: utils/cache/relcache.c:6475 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продовжуємо усе одно, але щось не так." -#: utils/cache/relcache.c:6649 +#: utils/cache/relcache.c:6797 #, 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:767 +#: utils/cache/relmapper.c:836 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл зіставлень відношень \"%s\" містить неприпустимі дані" -#: utils/cache/relmapper.c:777 +#: utils/cache/relmapper.c:846 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "файл зіставлень відношень \"%s\" містить неправильну контрольну суму" -#: utils/cache/typcache.c:1811 utils/fmgr/funcapi.c:497 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 #, c-format msgid "record type has not been registered" msgstr "тип запису не зареєстрований" @@ -24881,101 +25606,101 @@ msgstr "TRAP: ExceptionalCondition: невірні аргументи в PID %d\ msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" msgstr "TRAP: %s(\"%s\", Файл: \"%s\", Рядок: %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 "сталася помилка перед тим, як обробка повідомлення про помилку була доступна\n" -#: utils/error/elog.c:1948 +#: utils/error/elog.c:1943 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "не вдалося повторно відкрити файл \"%s\" як stderr: %m" -#: utils/error/elog.c:1961 +#: utils/error/elog.c:1956 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "не вдалося повторно відкрити файл \"%s\" як stdout: %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 "[unknown]" -#: 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 "пропущено текст помилки" -#: 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 " символ %d" -#: utils/error/elog.c:3042 utils/error/elog.c:3049 +#: utils/error/elog.c:2853 utils/error/elog.c:2860 msgid "DETAIL: " msgstr "ВІДОМОСТІ: " -#: utils/error/elog.c:3056 +#: utils/error/elog.c:2867 msgid "HINT: " msgstr "УКАЗІВКА: " -#: utils/error/elog.c:3063 +#: utils/error/elog.c:2874 msgid "QUERY: " msgstr "ЗАПИТ: " -#: utils/error/elog.c:3070 +#: utils/error/elog.c:2881 msgid "CONTEXT: " msgstr "КОНТЕКСТ: " -#: utils/error/elog.c:3080 +#: utils/error/elog.c:2891 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "РОЗТАШУВАННЯ: %s, %s:%d\n" -#: utils/error/elog.c:3087 +#: utils/error/elog.c:2898 #, c-format msgid "LOCATION: %s:%d\n" msgstr "РОЗТАШУВАННЯ: %s:%d\n" -#: utils/error/elog.c:3094 +#: utils/error/elog.c:2905 msgid "BACKTRACE: " msgstr "ВІДСТЕЖУВАТИ: " -#: utils/error/elog.c:3108 +#: utils/error/elog.c:2917 msgid "STATEMENT: " msgstr "ІНСТРУКЦІЯ: " -#: utils/error/elog.c:3496 +#: utils/error/elog.c:3310 msgid "DEBUG" msgstr "НАЛАГОДЖЕННЯ" -#: utils/error/elog.c:3500 +#: utils/error/elog.c:3314 msgid "LOG" msgstr "ЗАПИСУВАННЯ" -#: utils/error/elog.c:3503 +#: utils/error/elog.c:3317 msgid "INFO" msgstr "ІНФОРМАЦІЯ" -#: utils/error/elog.c:3506 +#: utils/error/elog.c:3320 msgid "NOTICE" msgstr "ПОВІДОМЛЕННЯ" -#: utils/error/elog.c:3510 +#: utils/error/elog.c:3324 msgid "WARNING" msgstr "ПОПЕРЕДЖЕННЯ" -#: utils/error/elog.c:3513 +#: utils/error/elog.c:3327 msgid "ERROR" msgstr "ПОМИЛКА" -#: utils/error/elog.c:3516 +#: utils/error/elog.c:3330 msgid "FATAL" msgstr "ФАТАЛЬНО" -#: utils/error/elog.c:3519 +#: utils/error/elog.c:3333 msgid "PANIC" msgstr "ПАНІКА" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "не вдалося знайти функцію \"%s\" у файлі \"%s\"" @@ -25005,51 +25730,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:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "доступ до бібліотеки \"%s\" не дозволений" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "неприпустиме ім'я макросу в шляху динамічної бібліотеки: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "параметр \"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 "параметр \"dynamic_library_path\" містить компонент, який не є абсолютним шляхом" @@ -25074,377 +25809,377 @@ msgstr "Функції, які викликаються з SQL, потребую msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "нерозпізнана версія API %d, повідомлена інформаційною функцією \"%s\"" -#: utils/fmgr/fmgr.c:1999 +#: utils/fmgr/fmgr.c:1985 #, c-format msgid "operator class options info is absent in function call context" msgstr "в контексті виклику функції відсутня інформація стосовно параметрів класів операторів" -#: 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 "функція мовної перевірки %u викликана для мови %u замість %u" -#: utils/fmgr/funcapi.c:420 +#: utils/fmgr/funcapi.c:498 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "не вдалося визначити фактичний тип результату для функції \"%s\" оголошеної як, та, котра повертає тип %s" -#: utils/fmgr/funcapi.c:565 +#: utils/fmgr/funcapi.c:643 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "оголошений аргумент %s не містить тип діапазону, а тип %s" -#: utils/fmgr/funcapi.c:648 +#: utils/fmgr/funcapi.c:726 #, c-format msgid "could not find multirange type for data type %s" msgstr "не вдалося знайти багатодіапазонний тип для типу даних %s" -#: utils/fmgr/funcapi.c:1865 utils/fmgr/funcapi.c:1897 +#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 #, c-format msgid "number of aliases does not match number of columns" msgstr "кількість псевдонімів не відповідає кількості стовпців" -#: utils/fmgr/funcapi.c:1891 +#: utils/fmgr/funcapi.c:1969 #, c-format msgid "no column alias was provided" msgstr "жодного псевдоніму для стовпця не було надано" -#: utils/fmgr/funcapi.c:1915 +#: utils/fmgr/funcapi.c:1993 #, c-format msgid "could not determine row description for function returning record" msgstr "не вдалося визначити опис рядка для функції, що повертає запис" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:329 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог даних \"%s\" не існує" -#: utils/init/miscinit.c:319 +#: utils/init/miscinit.c:334 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m" -#: utils/init/miscinit.c:327 +#: utils/init/miscinit.c:342 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "вказаний каталог даних \"%s\" не є каталогом" -#: utils/init/miscinit.c:343 +#: utils/init/miscinit.c:358 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "власник каталогу даних \"%s\" визначений неправильно" -#: utils/init/miscinit.c:345 +#: 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:363 +#: utils/init/miscinit.c:378 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "каталог даних \"%s\" має неприпустимі дозволи" -#: utils/init/miscinit.c:365 +#: 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:650 utils/misc/guc.c:7495 +#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "встановити параметр \"%s\" в межах операції з обмеженнями по безпеці, не можна" -#: utils/init/miscinit.c:718 +#: utils/init/miscinit.c:733 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не існує" -#: utils/init/miscinit.c:748 +#: utils/init/miscinit.c:763 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для ролі \"%s\" вхід не дозволений" -#: utils/init/miscinit.c:766 +#: utils/init/miscinit.c:781 #, c-format msgid "too many connections for role \"%s\"" msgstr "занадто багато підключень для ролі \"%s\"" -#: utils/init/miscinit.c:826 +#: utils/init/miscinit.c:849 #, c-format msgid "permission denied to set session authorization" msgstr "немає прав для встановлення авторизації в сеансі" -#: utils/init/miscinit.c:909 +#: utils/init/miscinit.c:932 #, c-format msgid "invalid role OID: %u" msgstr "неприпустимий OID ролі: %u" -#: utils/init/miscinit.c:963 +#: utils/init/miscinit.c:986 #, c-format msgid "database system is shut down" msgstr "система бази даних вимкнена" -#: utils/init/miscinit.c:1050 +#: utils/init/miscinit.c:1073 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не вдалося створити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1064 +#: utils/init/miscinit.c:1087 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не вдалося відкрити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1071 +#: utils/init/miscinit.c:1094 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не вдалося прочитати файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1080 +#: utils/init/miscinit.c:1103 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокування \"%s\" пустий" -#: utils/init/miscinit.c:1081 +#: utils/init/miscinit.c:1104 #, 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:1125 +#: utils/init/miscinit.c:1148 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокування \"%s\" вже існує" -#: utils/init/miscinit.c:1129 +#: utils/init/miscinit.c:1152 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Інший postgres (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1131 +#: utils/init/miscinit.c:1154 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Інший postmaster (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1134 +#: utils/init/miscinit.c:1157 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Інший postgres (PID %d) використовує файл сокету \"%s\"?" -#: utils/init/miscinit.c:1136 +#: utils/init/miscinit.c:1159 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Інший postmaster (PID %d) використовує файл сокету \"%s\"?" -#: utils/init/miscinit.c:1187 +#: utils/init/miscinit.c:1210 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не вдалося видалити старий файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1189 +#: utils/init/miscinit.c:1212 #, 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:1226 utils/init/miscinit.c:1240 -#: utils/init/miscinit.c:1251 +#: utils/init/miscinit.c:1249 utils/init/miscinit.c:1263 +#: utils/init/miscinit.c:1274 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не вдалося записати файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1362 utils/init/miscinit.c:1504 utils/misc/guc.c:10401 +#: utils/init/miscinit.c:1385 utils/init/miscinit.c:1527 utils/misc/guc.c:10836 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не вдалося прочитати з файлу \"%s\": %m" -#: utils/init/miscinit.c:1492 +#: utils/init/miscinit.c:1515 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не вдалося відкрити файл \"%s\": %m; все одно продовжується" -#: utils/init/miscinit.c:1517 +#: utils/init/miscinit.c:1540 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокування \"%s\" містить неправильний PID: %ld замість %ld" -#: utils/init/miscinit.c:1556 utils/init/miscinit.c:1572 +#: utils/init/miscinit.c:1579 utils/init/miscinit.c:1595 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не є припустимим каталогом даних" -#: utils/init/miscinit.c:1558 +#: utils/init/miscinit.c:1581 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" пропущено." -#: utils/init/miscinit.c:1574 +#: utils/init/miscinit.c:1597 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" не містить припустимих даних." -#: utils/init/miscinit.c:1576 +#: utils/init/miscinit.c:1599 #, c-format msgid "You might need to initdb." msgstr "Можливо, вам слід виконати initdb." -#: utils/init/miscinit.c:1584 +#: utils/init/miscinit.c:1607 #, 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/postinit.c:254 +#: utils/init/postinit.c:258 #, c-format msgid "replication connection authorized: user=%s" msgstr "підключення для реплікації авторизовано: користувач=%s" -#: utils/init/postinit.c:257 +#: utils/init/postinit.c:261 #, c-format msgid "connection authorized: user=%s" msgstr "підключення авторизовано: користувач=%s" -#: utils/init/postinit.c:260 +#: utils/init/postinit.c:264 #, c-format msgid " database=%s" msgstr " database=%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 активовано (протокол=%s, шифр=%s, біти=%d)" -#: utils/init/postinit.c:280 +#: utils/init/postinit.c:284 #, c-format msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" msgstr " GSS (автентифіковано=%s, закодовано=%s, ведучій=%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 "ні" -#: 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 "так" -#: utils/init/postinit.c:286 +#: utils/init/postinit.c:290 #, c-format msgid " GSS (authenticated=%s, encrypted=%s)" msgstr " GSS (автентифіковано=%s, закодовано=%s)" -#: utils/init/postinit.c:323 +#: utils/init/postinit.c:330 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "база даних \"%s\" зникла з pg_database" -#: utils/init/postinit.c:325 +#: 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:345 +#: utils/init/postinit.c:352 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "база даних \"%s\" не приймає підключення в даний момент" -#: utils/init/postinit.c:358 +#: utils/init/postinit.c:365 #, c-format msgid "permission denied for database \"%s\"" msgstr "доступ до бази даних \"%s\" відхилений" -#: utils/init/postinit.c:359 +#: utils/init/postinit.c:366 #, c-format msgid "User does not have CONNECT privilege." msgstr "Користувач не має права CONNECT." -#: utils/init/postinit.c:376 +#: utils/init/postinit.c:383 #, c-format msgid "too many connections for database \"%s\"" msgstr "занадто багато підключень до бази даних \"%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 "локалізація бази даних несумісна з операційною системою" -#: 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 "База даних була ініціалізована з параметром LC_COLLATE \"%s\", але зараз setlocale() не розпізнає його." -#: 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 "Повторно створіть базу даних з іншою локалізацією або встановіть пропущену локалізацію." -#: 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 "База даних була ініціалізована з параметром LC_CTYPE \"%s\", але зараз setlocale() не розпізнає його." -#: utils/init/postinit.c:761 +#: utils/init/postinit.c:466 #, c-format -msgid "no roles are defined in this database system" -msgstr "в цій системі баз даних не визначено жодної ролі" +msgid "database \"%s\" has a collation version mismatch" +msgstr "база даних \"%s\" має невідповідність версії параметрів сортування" -#: utils/init/postinit.c:762 +#: utils/init/postinit.c:468 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Ви повинні негайно виконати CREATE USER \"%s\" SUPERUSER;." +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "Базу даних було створено за допомогою параметрів сортування версії %s, але операційна система надає версію %s." + +#: utils/init/postinit.c:471 +#, c-format +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:798 +#: utils/init/postinit.c:839 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "нові підключення для реплікації не дозволені під час завершення роботи бази даних" +msgid "no roles are defined in this database system" +msgstr "в цій системі баз даних не визначено жодної ролі" -#: utils/init/postinit.c:802 +#: utils/init/postinit.c:840 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "потрібно бути суперкористувачем, щоб підключитись під час завершення роботи бази даних" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Ви повинні негайно виконати CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:812 +#: utils/init/postinit.c:872 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "потрібно бути суперкористувачем, щоб підключитись в режимі двійкового оновлення" -#: utils/init/postinit.c:825 +#: utils/init/postinit.c:885 #, c-format msgid "remaining connection slots are reserved for non-replication superuser connections" msgstr "слоти підключень, які залишились, зарезервовані для підключень суперкористувача (не для реплікації)" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:895 #, c-format msgid "must be superuser or replication role to start walsender" msgstr "для запуску процесу walsender потребується роль реплікації або бути суперкористувачем" -#: utils/init/postinit.c:904 -#, c-format -msgid "database %u does not exist" -msgstr "база даних %u не існує" - -#: utils/init/postinit.c:994 +#: utils/init/postinit.c:1012 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Схоже, вона щойно була видалена або перейменована." -#: utils/init/postinit.c:1001 +#: utils/init/postinit.c:1016 +#, c-format +msgid "database %u does not exist" +msgstr "база даних %u не існує" + +#: utils/init/postinit.c:1025 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "неможливо під'єднатися до невірної бази даних \"%s\"" -#: utils/init/postinit.c:1021 +#: utils/init/postinit.c:1085 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Підкаталог бази даних \"%s\" пропущений." -#: utils/init/postinit.c:1026 -#, c-format -msgid "could not access directory \"%s\": %m" -msgstr "немає доступу до каталогу \"%s\": %m" - #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -25467,11 +26202,6 @@ msgstr "неочікуваний ідентифікатор кодування % msgid "conversion between %s and %s is not supported" msgstr "перетворення між %s і %s не підтримується" -#: utils/mb/mbutils.c:385 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "функції за замовчуванням перетворення з кодування \"%s\" в \"%s\" не існує" - #: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 #: utils/mb/mbutils.c:842 #, c-format @@ -25513,2120 +26243,2187 @@ msgstr "неприпустима послідовність байтів для msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "символ з послідовністю байтів %s в кодуванні \"%s\" не має еквіваленту в кодуванні \"%s\"" -#: utils/misc/guc.c:720 +#: utils/misc/guc.c:776 msgid "Ungrouped" msgstr "Розгруповано" -#: utils/misc/guc.c:722 +#: utils/misc/guc.c:778 msgid "File Locations" msgstr "Розташування файлів" -#: utils/misc/guc.c:724 +#: utils/misc/guc.c:780 msgid "Connections and Authentication / Connection Settings" msgstr "Підключення і автентифікація / Параметри підключень" -#: utils/misc/guc.c:726 +#: utils/misc/guc.c:782 msgid "Connections and Authentication / Authentication" msgstr "Підключення і автентифікація / Автентифікація" -#: utils/misc/guc.c:728 +#: utils/misc/guc.c:784 msgid "Connections and Authentication / SSL" msgstr "Підключення і автентифікація / SSL" -#: utils/misc/guc.c:730 +#: utils/misc/guc.c:786 msgid "Resource Usage / Memory" msgstr "Використання ресурсу / Пам'ять" -#: utils/misc/guc.c:732 +#: utils/misc/guc.c:788 msgid "Resource Usage / Disk" msgstr "Використання ресурсу / Диск" -#: utils/misc/guc.c:734 +#: utils/misc/guc.c:790 msgid "Resource Usage / Kernel Resources" msgstr "Використання ресурсу / Ресурси ядра" -#: utils/misc/guc.c:736 +#: utils/misc/guc.c:792 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Використання ресурсу / Затримка очистки по вартості" -#: utils/misc/guc.c:738 +#: utils/misc/guc.c:794 msgid "Resource Usage / Background Writer" msgstr "Використання ресурсу / Фоновий запис" -#: utils/misc/guc.c:740 +#: utils/misc/guc.c:796 msgid "Resource Usage / Asynchronous Behavior" msgstr "Використання ресурсу / Асинхронна поведінка" -#: utils/misc/guc.c:742 +#: utils/misc/guc.c:798 msgid "Write-Ahead Log / Settings" msgstr "Журнал WAL / Параметри" -#: utils/misc/guc.c:744 +#: utils/misc/guc.c:800 msgid "Write-Ahead Log / Checkpoints" msgstr "Журнал WAL / Контрольні точки" -#: utils/misc/guc.c:746 +#: utils/misc/guc.c:802 msgid "Write-Ahead Log / Archiving" msgstr "Журнал WAL / Архівація" -#: utils/misc/guc.c:748 +#: utils/misc/guc.c:804 +msgid "Write-Ahead Log / Recovery" +msgstr "Журнал WAL / Відновлення" + +#: utils/misc/guc.c:806 msgid "Write-Ahead Log / Archive Recovery" msgstr "Журнал WAL / Відновлення архіву" -#: utils/misc/guc.c:750 +#: utils/misc/guc.c:808 msgid "Write-Ahead Log / Recovery Target" msgstr "Журнал WAL / Мета відновлення" -#: utils/misc/guc.c:752 +#: utils/misc/guc.c:810 msgid "Replication / Sending Servers" msgstr "Реплікація / Надсилання серверів" -#: utils/misc/guc.c:754 +#: utils/misc/guc.c:812 msgid "Replication / Primary Server" msgstr "Реплікація / Основний сервер" -#: utils/misc/guc.c:756 +#: utils/misc/guc.c:814 msgid "Replication / Standby Servers" msgstr "Реплікація / Резервні сервера" -#: utils/misc/guc.c:758 +#: utils/misc/guc.c:816 msgid "Replication / Subscribers" msgstr "Реплікація / Підписники" -#: utils/misc/guc.c:760 +#: utils/misc/guc.c:818 msgid "Query Tuning / Planner Method Configuration" msgstr "Налаштування запитів / Конфігурація методів планувальника" -#: utils/misc/guc.c:762 +#: utils/misc/guc.c:820 msgid "Query Tuning / Planner Cost Constants" msgstr "Налаштування запитів / Константи вартості для планувальника" -#: utils/misc/guc.c:764 +#: utils/misc/guc.c:822 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Налаштування запитів / Генетичний оптимізатор запитів" -#: utils/misc/guc.c:766 +#: utils/misc/guc.c:824 msgid "Query Tuning / Other Planner Options" msgstr "Налаштування запитів / Інші параметри планувальника" -#: utils/misc/guc.c:768 +#: utils/misc/guc.c:826 msgid "Reporting and Logging / Where to Log" msgstr "Звіти і журналювання / Куди записувати" -#: utils/misc/guc.c:770 +#: utils/misc/guc.c:828 msgid "Reporting and Logging / When to Log" msgstr "Звіти і журналювання / Коли записувати" -#: utils/misc/guc.c:772 +#: utils/misc/guc.c:830 msgid "Reporting and Logging / What to Log" msgstr "Звіти і журналювання / Що записувати" -#: utils/misc/guc.c:774 +#: utils/misc/guc.c:832 msgid "Reporting and Logging / Process Title" msgstr "Звітування і журналювання / Назва процесу" -#: utils/misc/guc.c:776 +#: utils/misc/guc.c:834 msgid "Statistics / Monitoring" msgstr "Статистика / Моніторинг" -#: utils/misc/guc.c:778 -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:780 +#: utils/misc/guc.c:838 msgid "Autovacuum" msgstr "Автоочистка" -#: utils/misc/guc.c:782 +#: utils/misc/guc.c:840 msgid "Client Connection Defaults / Statement Behavior" msgstr "Параметри клієнтських сеансів за замовчуванням / Поведінка декларацій" -#: utils/misc/guc.c:784 +#: utils/misc/guc.c:842 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Параметри клієнтських сеансів за замовчуванням / Локалізація і форматування" -#: utils/misc/guc.c:786 +#: utils/misc/guc.c:844 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Параметри клієнтських сеансів за замовчуванням / Попереднє завантаження спільних бібліотек" -#: utils/misc/guc.c:788 +#: utils/misc/guc.c:846 msgid "Client Connection Defaults / Other Defaults" msgstr "Параметри клієнтських сеансів за замовчуванням / Інші параметри за замовчуванням" -#: utils/misc/guc.c:790 +#: utils/misc/guc.c:848 msgid "Lock Management" msgstr "Керування блокуванням" -#: utils/misc/guc.c:792 +#: utils/misc/guc.c:850 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Сумісність версій і платформ / Попередні версії PostgreSQL" -#: utils/misc/guc.c:794 +#: utils/misc/guc.c:852 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Сумісність версій і платформ / Інші платформи і клієнти" -#: utils/misc/guc.c:796 +#: utils/misc/guc.c:854 msgid "Error Handling" msgstr "Обробка помилок" -#: utils/misc/guc.c:798 +#: utils/misc/guc.c:856 msgid "Preset Options" msgstr "Визначені параметри" -#: utils/misc/guc.c:800 +#: utils/misc/guc.c:858 msgid "Customized Options" msgstr "Настроєні параметри" -#: utils/misc/guc.c:802 +#: utils/misc/guc.c:860 msgid "Developer Options" msgstr "Параметри для розробників" -#: utils/misc/guc.c:860 +#: 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:897 +#: 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:959 +#: utils/misc/guc.c:1017 msgid "Enables the planner's use of sequential-scan plans." msgstr "Дає змогу планувальнику використати плани послідовного сканування." -#: utils/misc/guc.c:969 +#: utils/misc/guc.c:1027 msgid "Enables the planner's use of index-scan plans." msgstr "Дає змогу планувальнику використати плани сканування по індексу." -#: utils/misc/guc.c:979 +#: utils/misc/guc.c:1037 msgid "Enables the planner's use of index-only-scan plans." msgstr "Дає змогу планувальнику використати плани сканування лише індекса." -#: utils/misc/guc.c:989 +#: utils/misc/guc.c:1047 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Дає змогу планувальнику використати плани сканування по точковому рисунку." -#: utils/misc/guc.c:999 +#: utils/misc/guc.c:1057 msgid "Enables the planner's use of TID scan plans." msgstr "Дає змогу планувальнику використати плани сканування TID." -#: utils/misc/guc.c:1009 +#: utils/misc/guc.c:1067 msgid "Enables the planner's use of explicit sort steps." msgstr "Дає змогу планувальнику використати кроки з явним сортуванням." -#: utils/misc/guc.c:1019 +#: utils/misc/guc.c:1077 msgid "Enables the planner's use of incremental sort steps." msgstr "Дає змогу планувальнику використати кроки інкрементного сортування." -#: utils/misc/guc.c:1028 +#: utils/misc/guc.c:1087 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Дає змогу планувальнику використовувати плани агрегації по гешу." -#: utils/misc/guc.c:1038 +#: utils/misc/guc.c:1097 msgid "Enables the planner's use of materialization." msgstr "Дає змогу планувальнику використовувати матеріалізацію." -#: utils/misc/guc.c:1048 +#: utils/misc/guc.c:1107 msgid "Enables the planner's use of memoization." msgstr "Дає змогу планувальнику використовувати мемоїзацію." -#: utils/misc/guc.c:1058 +#: utils/misc/guc.c:1117 msgid "Enables the planner's use of nested-loop join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання з вкладеними циклами." -#: utils/misc/guc.c:1068 +#: utils/misc/guc.c:1127 msgid "Enables the planner's use of merge join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання об'єднанням." -#: utils/misc/guc.c:1078 +#: utils/misc/guc.c:1137 msgid "Enables the planner's use of hash join plans." msgstr "Дає змогу планувальнику використовувати плани з'єднання по гешу." -#: utils/misc/guc.c:1088 +#: utils/misc/guc.c:1147 msgid "Enables the planner's use of gather merge plans." msgstr "Дає змогу планувальнику використовувати плани збору об'єднанням." -#: utils/misc/guc.c:1098 +#: utils/misc/guc.c:1157 msgid "Enables partitionwise join." msgstr "Вмикає з'єднання з урахуванням секціонування." -#: utils/misc/guc.c:1108 +#: utils/misc/guc.c:1167 msgid "Enables partitionwise aggregation and grouping." msgstr "Вмикає агрегацію і групування з урахуванням секціонування." -#: utils/misc/guc.c:1118 +#: utils/misc/guc.c:1177 msgid "Enables the planner's use of parallel append plans." msgstr "Дає змогу планувальнику використовувати плани паралельного додавання." -#: utils/misc/guc.c:1128 +#: utils/misc/guc.c:1187 msgid "Enables the planner's use of parallel hash plans." msgstr "Дає змогу планувальнику використовувати плани паралельного з'єднання по гешу." -#: utils/misc/guc.c:1138 +#: utils/misc/guc.c:1197 msgid "Enables plan-time and execution-time partition pruning." msgstr "Активує видалення розділу під час планування і виконання." -#: utils/misc/guc.c:1139 +#: 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:1150 +#: utils/misc/guc.c:1209 msgid "Enables the planner's use of async append plans." msgstr "Дає змогу планувальнику використовувати асинхронні плани додавання." -#: utils/misc/guc.c:1160 +#: utils/misc/guc.c:1219 msgid "Enables genetic query optimization." msgstr "Вмикає генетичну оптимізацію запитів." -#: utils/misc/guc.c:1161 +#: utils/misc/guc.c:1220 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Цей алгоритм намагається побудувати план без повного перебору." -#: utils/misc/guc.c:1172 +#: utils/misc/guc.c:1231 msgid "Shows whether the current user is a superuser." msgstr "Показує, чи є поточний користувач суперкористувачем." -#: utils/misc/guc.c:1182 +#: utils/misc/guc.c:1241 msgid "Enables advertising the server via Bonjour." msgstr "Вмикає оголошення серверу через Bonjour." -#: utils/misc/guc.c:1191 +#: utils/misc/guc.c:1250 msgid "Collects transaction commit time." msgstr "Збирає час затвердження транзакцій." -#: utils/misc/guc.c:1200 +#: utils/misc/guc.c:1259 msgid "Enables SSL connections." msgstr "Вмикає SSL-підключення." -#: utils/misc/guc.c:1209 -msgid "Also use ssl_passphrase_command during server reload." -msgstr "Також використовувати ssl_passphrase_command під час перезавантаження серверу." +#: utils/misc/guc.c:1268 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "Визначає, чи викликається ssl_passphrase_command під час перезавантаження сервера." -#: utils/misc/guc.c:1218 +#: utils/misc/guc.c:1277 msgid "Give priority to server ciphersuite order." msgstr "Віддавати перевагу замовленню набору шрифтів сервера." -#: utils/misc/guc.c:1227 +#: utils/misc/guc.c:1286 msgid "Forces synchronization of updates to disk." msgstr "Примусова синхронізація оновлень на диск." -#: utils/misc/guc.c:1228 -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:1287 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." +msgstr "Сервер буде використовувати системний виклик fsync() в декількох місцях, щоб переконатися, що оновлення фізично записані на диск. Це гарантує, що кластер баз даних відновиться до узгодженого стану після аварійного завершення роботи операційної системи чи апаратного збою." -#: utils/misc/guc.c:1239 +#: utils/misc/guc.c:1298 msgid "Continues processing after a checksum failure." msgstr "Продовжує обробку після помилки контрольної суми." -#: utils/misc/guc.c:1240 +#: utils/misc/guc.c:1299 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:1254 +#: utils/misc/guc.c:1313 msgid "Continues processing past damaged page headers." msgstr "Продовжує обробку при пошкоджені заголовків сторінок." -#: utils/misc/guc.c:1255 +#: utils/misc/guc.c:1314 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:1268 +#: utils/misc/guc.c:1327 msgid "Continues recovery after an invalid pages failure." msgstr "Продовжує відновлення після помилки неприпустимих сторінок." -#: utils/misc/guc.c:1269 +#: utils/misc/guc.c:1328 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:1287 +#: utils/misc/guc.c:1346 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Запис повних сторінок до WAL при першій зміні після контрольної точки." -#: utils/misc/guc.c:1288 +#: utils/misc/guc.c:1347 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:1301 +#: utils/misc/guc.c:1360 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." -msgstr "Запис повних сторінок до WAL при першій зміні після контрольної точки, навіть при некритичних змінах." - -#: utils/misc/guc.c:1311 -msgid "Compresses full-page writes written in WAL file." -msgstr "Стискати дані під час запису повних сторінок до файлу WAL." +msgstr "Записує повні сторінки до WAL при першій зміні після контрольної точки, навіть при некритичних змінах." -#: utils/misc/guc.c:1321 +#: utils/misc/guc.c:1370 msgid "Writes zeroes to new WAL files before first use." msgstr "Перед першим використанням записує нулі до нових файлів WAL." -#: utils/misc/guc.c:1331 +#: utils/misc/guc.c:1380 msgid "Recycles WAL files by renaming them." msgstr "Перезаписує файли WAL, перейменувавши їх." -#: utils/misc/guc.c:1341 +#: utils/misc/guc.c:1390 msgid "Logs each checkpoint." msgstr "Журналювати кожну контрольну точку." -#: utils/misc/guc.c:1350 +#: utils/misc/guc.c:1399 msgid "Logs each successful connection." msgstr "Журналювати кожне успішне підключення." -#: utils/misc/guc.c:1359 +#: utils/misc/guc.c:1408 msgid "Logs end of a session, including duration." msgstr "Журналювати кінець сеансу, зокрема тривалість." -#: utils/misc/guc.c:1368 +#: utils/misc/guc.c:1417 msgid "Logs each replication command." msgstr "Журналювати кожну команду реплікації." -#: utils/misc/guc.c:1377 +#: utils/misc/guc.c:1426 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показує, чи активовані перевірки твердження на працюючому сервері." -#: utils/misc/guc.c:1392 +#: utils/misc/guc.c:1441 msgid "Terminate session on any error." msgstr "Припиняти сеанси при будь-якій помилці." -#: utils/misc/guc.c:1401 +#: utils/misc/guc.c:1450 msgid "Reinitialize server after backend crash." msgstr "Повторити ініціалізацію сервера, після внутрішнього аварійного завершення роботи." -#: utils/misc/guc.c:1410 +#: utils/misc/guc.c:1459 msgid "Remove temporary files after backend crash." msgstr "Видалити тимчасові файли після аварійного завершення роботи внутрішнього сервера." -#: utils/misc/guc.c:1421 +#: utils/misc/guc.c:1470 msgid "Logs the duration of each completed SQL statement." msgstr "Журналювати тривалість кожного виконаного SQL-оператора." -#: utils/misc/guc.c:1430 +#: utils/misc/guc.c:1479 msgid "Logs each query's parse tree." msgstr "Журналювати дерево аналізу для кожного запиту." -#: utils/misc/guc.c:1439 +#: utils/misc/guc.c:1488 msgid "Logs each query's rewritten parse tree." msgstr "Журналювати переписане дерево аналізу для кожного запиту." -#: utils/misc/guc.c:1448 +#: utils/misc/guc.c:1497 msgid "Logs each query's execution plan." msgstr "Журналювати план виконання кожного запиту." -#: utils/misc/guc.c:1457 +#: utils/misc/guc.c:1506 msgid "Indents parse and plan tree displays." msgstr "Відступи при відображенні дерев аналізу і плану запитів." -#: utils/misc/guc.c:1466 +#: utils/misc/guc.c:1515 msgid "Writes parser performance statistics to the server log." msgstr "Запис статистики продуктивності аналізу до запису сервера." -#: utils/misc/guc.c:1475 +#: utils/misc/guc.c:1524 msgid "Writes planner performance statistics to the server log." msgstr "Запис статистики продуктивності планувальника до запису сервера." -#: utils/misc/guc.c:1484 +#: utils/misc/guc.c:1533 msgid "Writes executor performance statistics to the server log." msgstr "Запис статистики продуктивності виконувача до запису сервера." -#: utils/misc/guc.c:1493 +#: utils/misc/guc.c:1542 msgid "Writes cumulative performance statistics to the server log." msgstr "Запис сукупної статистики продуктивності до запису сервера." -#: utils/misc/guc.c:1503 +#: utils/misc/guc.c:1552 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Журналювати статистику використання системних ресурсів (пам'яті і ЦП) при різноманітних операціях з B-tree." -#: utils/misc/guc.c:1515 +#: utils/misc/guc.c:1564 msgid "Collects information about executing commands." msgstr "Збирати інформацію про команди які виконуються." -#: utils/misc/guc.c:1516 +#: utils/misc/guc.c:1565 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:1526 +#: utils/misc/guc.c:1575 msgid "Collects statistics on database activity." msgstr "Збирати статистику про активність бази даних." -#: utils/misc/guc.c:1535 +#: utils/misc/guc.c:1584 msgid "Collects timing statistics for database I/O activity." msgstr "Збирати статистику за часом активності введення/виведення для бази даних." -#: utils/misc/guc.c:1544 +#: utils/misc/guc.c:1593 msgid "Collects timing statistics for WAL I/O activity." msgstr "Збирає статистику часу для активності вводу/виводу WAL." -#: utils/misc/guc.c:1554 +#: utils/misc/guc.c:1603 msgid "Updates the process title to show the active SQL command." msgstr "Оновлення виводить в заголовок процесу активну SQL-команду." -#: utils/misc/guc.c:1555 +#: utils/misc/guc.c:1604 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Відображає в заголовку процеса кожну SQL-команду, отриману сервером." -#: utils/misc/guc.c:1568 +#: utils/misc/guc.c:1617 msgid "Starts the autovacuum subprocess." msgstr "Запускає підпроцес автоочистки." -#: utils/misc/guc.c:1578 +#: utils/misc/guc.c:1627 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерує налагодженні повідомлення для LISTEN і NOTIFY." -#: utils/misc/guc.c:1590 +#: utils/misc/guc.c:1639 msgid "Emits information about lock usage." msgstr "Видає інформацію про блокування, які використовуються." -#: utils/misc/guc.c:1600 +#: utils/misc/guc.c:1649 msgid "Emits information about user lock usage." msgstr "Видає інформацію про користувацькі блокування, які використовуються." -#: utils/misc/guc.c:1610 +#: utils/misc/guc.c:1659 msgid "Emits information about lightweight lock usage." msgstr "Видає інформацію про спрощені блокування, які використовуються." -#: utils/misc/guc.c:1620 +#: utils/misc/guc.c:1669 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Виводить інформацію про всі поточні блокування, при тайм-ауті взаємного блокування." -#: utils/misc/guc.c:1632 +#: utils/misc/guc.c:1681 msgid "Logs long lock waits." msgstr "Журналювати тривалі очікування в блокуваннях." -#: utils/misc/guc.c:1641 +#: utils/misc/guc.c:1690 msgid "Logs standby recovery conflict waits." msgstr "Журналює очікування конфлікту відновлення." -#: utils/misc/guc.c:1650 +#: utils/misc/guc.c:1699 msgid "Logs the host name in the connection logs." msgstr "Журналювати ім’я хоста до записів підключення." -#: utils/misc/guc.c:1651 +#: utils/misc/guc.c:1700 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:1662 +#: utils/misc/guc.c:1711 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Вважати \"expr=NULL\" як \"expr IS NULL\"." -#: utils/misc/guc.c:1663 +#: utils/misc/guc.c:1712 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:1675 +#: utils/misc/guc.c:1724 msgid "Enables per-database user names." msgstr "Вмикає зв'язування імен користувачів з базами даних." -#: utils/misc/guc.c:1684 +#: utils/misc/guc.c:1733 msgid "Sets the default read-only status of new transactions." msgstr "Встановлює статус \"лише читання\" за замовчуванням для нових транзакцій." -#: utils/misc/guc.c:1694 +#: utils/misc/guc.c:1743 msgid "Sets the current transaction's read-only status." msgstr "Встановлює статус \"лише читання\" для поточної транзакції." -#: utils/misc/guc.c:1704 +#: utils/misc/guc.c:1753 msgid "Sets the default deferrable status of new transactions." msgstr "Встановлює статус відкладеного виконання за замовчуванням для нових транзакцій." -#: utils/misc/guc.c:1713 +#: utils/misc/guc.c:1762 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Визначає, чи відкладати серіалізовану транзакцію \"лише читання\" до моменту, коли збій серіалізації буде виключений." -#: utils/misc/guc.c:1723 +#: utils/misc/guc.c:1772 msgid "Enable row security." msgstr "Вмикає захист на рівні рядків." -#: utils/misc/guc.c:1724 +#: utils/misc/guc.c:1773 msgid "When enabled, row security will be applied to all users." msgstr "Коли ввімкнено, захист на рівні рядків буде застосовано до всіх користувачів." -#: utils/misc/guc.c:1732 +#: utils/misc/guc.c:1781 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Перевірте тіла підпрограм під час CREATE FUNCTION і CREATE PROCEDURE." -#: utils/misc/guc.c:1741 +#: utils/misc/guc.c:1790 msgid "Enable input of NULL elements in arrays." msgstr "Дозволяє введення NULL елементів у масивах." -#: utils/misc/guc.c:1742 +#: utils/misc/guc.c:1791 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:1758 +#: utils/misc/guc.c:1807 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS більше не підтримується; це може бути помилковим." -#: utils/misc/guc.c:1768 +#: utils/misc/guc.c:1817 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Запускає підпроцес записування виводу stderr і/або csvlogs до файлів журналу." -#: utils/misc/guc.c:1777 +#: utils/misc/guc.c:1826 msgid "Truncate existing log files of same name during log rotation." msgstr "Скорочувати існуючі файли журналу з тим самим іменем під час обертання журналу." -#: utils/misc/guc.c:1788 +#: utils/misc/guc.c:1837 msgid "Emit information about resource usage in sorting." msgstr "Виводити інформацію про використання ресурсу при сортуванні." -#: utils/misc/guc.c:1802 +#: utils/misc/guc.c:1851 msgid "Generate debugging output for synchronized scanning." msgstr "Створює налагодженні повідомлення для синхронного сканування." -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1866 msgid "Enable bounded sorting using heap sort." msgstr "Вмикає обмежене сортування використовуючи динамічне сортування." -#: utils/misc/guc.c:1830 +#: utils/misc/guc.c:1879 msgid "Emit WAL-related debugging output." msgstr "Виводити налагодженні повідомлення пов'язані з WAL." -#: utils/misc/guc.c:1842 +#: utils/misc/guc.c:1891 msgid "Shows whether datetimes are integer based." msgstr "Показує, чи базуються дати на цілих числах." -#: utils/misc/guc.c:1853 +#: utils/misc/guc.c:1902 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Встановлює обробку без урахування регістру імен користувачів Kerberos і GSSAPI." -#: utils/misc/guc.c:1863 +#: utils/misc/guc.c:1912 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Попередження про спецсимволи \"\\\" в звичайних рядках." -#: utils/misc/guc.c:1873 +#: utils/misc/guc.c:1922 msgid "Causes '...' strings to treat backslashes literally." msgstr "Вмикає буквальну обробку символів \"\\\" в рядках '...'." -#: utils/misc/guc.c:1884 +#: utils/misc/guc.c:1933 msgid "Enable synchronized sequential scans." msgstr "Вмикає синхронізацію послідовного сканування." -#: utils/misc/guc.c:1894 +#: utils/misc/guc.c:1943 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Встановлює, включати чи виключати транзакції з метою відновлення." -#: utils/misc/guc.c:1904 +#: utils/misc/guc.c:1953 msgid "Allows connections and queries during recovery." msgstr "Дозволяє підключення і запити під час відновлення." -#: utils/misc/guc.c:1914 +#: utils/misc/guc.c:1963 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Дозволяє зворотній зв'язок серверу hot standby з основним для уникнення конфліктів запитів." -#: utils/misc/guc.c:1924 +#: utils/misc/guc.c:1973 msgid "Shows whether hot standby is currently active." msgstr "Показує, чи hot standby наразі активний." -#: utils/misc/guc.c:1935 +#: utils/misc/guc.c:1984 msgid "Allows modifications of the structure of system tables." msgstr "Дозволяє модифікації структури системних таблиць." -#: utils/misc/guc.c:1946 +#: utils/misc/guc.c:1995 msgid "Disables reading from system indexes." msgstr "Вимикає читання з системних індексів." -#: utils/misc/guc.c:1947 +#: utils/misc/guc.c:1996 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Це не забороняє оновлення індексів, тож дана поведінка безпечна. Найгірший наслідок це сповільнення." -#: utils/misc/guc.c:1958 +#: utils/misc/guc.c:2007 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "Дозволяє табличні простори безпосередньо всередині pg_tblspc, для тестування." -#: utils/misc/guc.c:1969 +#: utils/misc/guc.c:2018 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Вмикає режим зворотньої сумісності при перевірці прав для великих об'єктів." -#: utils/misc/guc.c:1970 +#: utils/misc/guc.c:2019 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:1980 +#: utils/misc/guc.c:2029 msgid "When generating SQL fragments, quote all identifiers." msgstr "Генеруючи SQL-фрагменти, включати всі ідентифікатори в лапки." -#: utils/misc/guc.c:1990 +#: utils/misc/guc.c:2039 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показує, чи ввімкнена контрольна сума даних для цього кластеру." -#: utils/misc/guc.c:2001 +#: utils/misc/guc.c:2050 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Додає послідовне число до повідомлень syslog, щоб уникнути ігнорування дублікатів." -#: utils/misc/guc.c:2011 +#: utils/misc/guc.c:2060 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Розділяє повідомлення, які передаються в syslog, рядками розміром не більше 1024 байт." -#: utils/misc/guc.c:2021 +#: utils/misc/guc.c:2070 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Визначає, чи вузли зібрання і зібрання об'єднанням також виконають підплани." -#: utils/misc/guc.c:2022 +#: utils/misc/guc.c:2071 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Чи повинні вузли збірки також виконувати підплани або тільки збирати кортежі?" -#: utils/misc/guc.c:2032 +#: utils/misc/guc.c:2081 msgid "Allow JIT compilation." msgstr "Дозволити JIT-компіляцію." -#: utils/misc/guc.c:2043 +#: utils/misc/guc.c:2092 msgid "Register JIT-compiled functions with debugger." msgstr "Зареєструйте функції JIT-compiled за допомогою налагоджувача." -#: utils/misc/guc.c:2060 +#: utils/misc/guc.c:2109 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Виводити бітовий код LLVM для полегшення налагодження JIT." -#: utils/misc/guc.c:2071 +#: utils/misc/guc.c:2120 msgid "Allow JIT compilation of expressions." msgstr "Дозволити JIT-компіляцію виразів." -#: utils/misc/guc.c:2082 +#: utils/misc/guc.c:2131 msgid "Register JIT-compiled functions with perf profiler." msgstr "Зареєструйте функції JIT-compiled за допомогою профілювальника perf." -#: utils/misc/guc.c:2099 +#: utils/misc/guc.c:2148 msgid "Allow JIT compilation of tuple deforming." msgstr "Дозволити JIT-компіляцію перетворення кортежів." -#: utils/misc/guc.c:2110 +#: utils/misc/guc.c:2159 msgid "Whether to continue running after a failure to sync data files." msgstr "Чи продовжувати виконання після помилки синхронізації файлів даних на диску." -#: utils/misc/guc.c:2119 +#: utils/misc/guc.c:2168 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Встановлює чи повинен одержувач WAL створити тимчасовий слот реплікації, якщо постійний слот не налаштований." -#: utils/misc/guc.c:2137 -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:2186 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "Встановлює кількість часу очікування перед примусовим переходом на наступний файл WAL." -#: utils/misc/guc.c:2148 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Чекати N секунд при підключенні після автентифікації." +#: utils/misc/guc.c:2197 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Встановлює кількість часу для очікування після автенифікації під час запуску з'єднання." -#: utils/misc/guc.c:2149 utils/misc/guc.c:2747 +#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 msgid "This allows attaching a debugger to the process." msgstr "Це дозволяє підключити налагоджувач до процесу." -#: utils/misc/guc.c:2158 +#: utils/misc/guc.c:2208 msgid "Sets the default statistics target." msgstr "Встановлює мету статистики за замовчуванням." -#: utils/misc/guc.c:2159 +#: utils/misc/guc.c:2209 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:2168 +#: utils/misc/guc.c:2218 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Встановлює розмір для списку FROM, при перевищені котрого вкладені запити не згортаються." -#: utils/misc/guc.c:2170 +#: utils/misc/guc.c:2220 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:2181 +#: utils/misc/guc.c:2231 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Встановлює розмір для списку FROM, при перевищенні котрого конструкції JOIN не подаються у вигляді рядка." -#: utils/misc/guc.c:2183 +#: utils/misc/guc.c:2233 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:2194 +#: utils/misc/guc.c:2244 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Встановлює граничне значення для елементів FROM, при перевищенні котрого використовується GEQO." -#: utils/misc/guc.c:2204 +#: utils/misc/guc.c:2254 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: зусилля використовувались щоб встановити значення за замовчуванням для інших параметрів GEQO." -#: utils/misc/guc.c:2214 +#: utils/misc/guc.c:2264 msgid "GEQO: number of individuals in the population." msgstr "GEQO: кількість користувачів у популяції." -#: utils/misc/guc.c:2215 utils/misc/guc.c:2225 +#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 msgid "Zero selects a suitable default value." msgstr "Нуль вибирає придатне значення за замовчуванням." -#: utils/misc/guc.c:2224 +#: utils/misc/guc.c:2274 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: кількість ітерацій в алгоритмі." -#: utils/misc/guc.c:2236 +#: utils/misc/guc.c:2286 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Встановлює час очікування в блокуванні до перевірки на взаємне блокування." -#: utils/misc/guc.c:2247 +#: utils/misc/guc.c:2297 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:2258 +#: utils/misc/guc.c:2308 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:2269 +#: utils/misc/guc.c:2319 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Встановлює мінімальну затримку для застосування змін під час відновлення." -#: utils/misc/guc.c:2280 +#: utils/misc/guc.c:2330 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Встановлює максимальний інтервал між звітами про стан одержувачів WAL для серверу надсилання." -#: utils/misc/guc.c:2291 +#: utils/misc/guc.c:2341 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Встановлює максимальний час очікування для отримання даних з серверу надсилання." -#: utils/misc/guc.c:2302 +#: utils/misc/guc.c:2352 msgid "Sets the maximum number of concurrent connections." msgstr "Встановлює максимальну кілкість паралельних підключень." -#: utils/misc/guc.c:2313 +#: utils/misc/guc.c:2363 msgid "Sets the number of connection slots reserved for superusers." msgstr "Встановлює кількість зарезервованих слотів підключень для суперкористувачів." -#: utils/misc/guc.c:2323 +#: utils/misc/guc.c:2373 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Кількість динамічної спільної пам'яті, зарезервованої під час запуску." -#: utils/misc/guc.c:2338 +#: utils/misc/guc.c:2388 msgid "Sets the number of shared memory buffers used by the server." msgstr "Встановлює кількість буферів спільної пам'яті, використовуваних сервером." -#: utils/misc/guc.c:2349 +#: utils/misc/guc.c:2399 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "Показує розмір основної спільної пам'яті сервера (округлення до найближчого МБ)." + +#: utils/misc/guc.c:2410 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Показує кількість величезних сторінок, потрібних для основної області спільної пам'яті." + +#: utils/misc/guc.c:2411 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 вказує на те, що значення не може бути визначене." + +#: utils/misc/guc.c:2421 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Встановлює максимальну кількість використовуваних тимчасових буферів, для кожного сеансу." -#: utils/misc/guc.c:2360 +#: utils/misc/guc.c:2432 msgid "Sets the TCP port the server listens on." msgstr "Встановлює TCP-порт для роботи серверу." -#: utils/misc/guc.c:2370 +#: utils/misc/guc.c:2442 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Встановлює дозволи на доступ для Unix-сокету." -#: utils/misc/guc.c:2371 +#: utils/misc/guc.c:2443 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:2385 +#: utils/misc/guc.c:2457 msgid "Sets the file permissions for log files." msgstr "Встановлює права дозволу для файлів журналу." -#: utils/misc/guc.c:2386 +#: utils/misc/guc.c:2458 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:2400 +#: utils/misc/guc.c:2472 msgid "Shows the mode of the data directory." msgstr "Показує режим каталогу даних." -#: utils/misc/guc.c:2401 +#: utils/misc/guc.c:2473 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:2414 +#: utils/misc/guc.c:2486 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Встановлює максимальний об'єм пам'яті для робочих просторів запитів." -#: utils/misc/guc.c:2415 +#: utils/misc/guc.c:2487 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:2427 +#: utils/misc/guc.c:2499 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Встановлює максимальний об'єм пам'яті для операцій по обслуговуванню." -#: utils/misc/guc.c:2428 +#: utils/misc/guc.c:2500 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Це включає такі операції як VACUUM і CREATE INDEX." -#: utils/misc/guc.c:2438 +#: utils/misc/guc.c:2510 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Встановлює максимальний об'єм пам'яті для логічного декодування." -#: utils/misc/guc.c:2439 +#: utils/misc/guc.c:2511 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Ця велика кількість пам'яті може бути використана кожним внутрішнім перевпорядковуючим буфером перед записом на диск." -#: utils/misc/guc.c:2455 +#: utils/misc/guc.c:2527 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Встановлює максимальну глибину стека, в КБ." -#: utils/misc/guc.c:2466 +#: utils/misc/guc.c:2538 msgid "Limits the total size of all temporary files used by each process." msgstr "Обмежує загальний розмір всіх тимчасових файлів, які використовуються кожним процесом." -#: utils/misc/guc.c:2467 +#: utils/misc/guc.c:2539 msgid "-1 means no limit." msgstr "-1 вимикає обмеження." -#: utils/misc/guc.c:2477 +#: utils/misc/guc.c:2549 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Вартість очистки для сторінки, яка була знайдена в буферному кеші." -#: utils/misc/guc.c:2487 +#: utils/misc/guc.c:2559 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Вартість очистки для сторінки, яка не була знайдена в буферному кеші." -#: utils/misc/guc.c:2497 +#: utils/misc/guc.c:2569 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Вартість очистки для сторінки, яка не була \"брудною\"." -#: utils/misc/guc.c:2507 +#: utils/misc/guc.c:2579 msgid "Vacuum cost amount available before napping." msgstr "Кількість доступних витрат вакууму перед від'єднанням." -#: utils/misc/guc.c:2517 +#: utils/misc/guc.c:2589 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Кількість доступних витрат вакууму перед від'єднанням, для автовакууму." -#: utils/misc/guc.c:2527 +#: utils/misc/guc.c:2599 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Встановлює максимальну кількість одночасно відкритих файлів для кожного процесу." -#: utils/misc/guc.c:2540 +#: utils/misc/guc.c:2612 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Встановлює максимальну кількість одночасно підготовлених транзакцій." -#: utils/misc/guc.c:2551 +#: utils/misc/guc.c:2623 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Встановлює мінімальний OID таблиць, для яких відстежуються блокування." -#: utils/misc/guc.c:2552 +#: utils/misc/guc.c:2624 msgid "Is used to avoid output on system tables." msgstr "Використовується для уникнення системних таблиць." -#: utils/misc/guc.c:2561 +#: utils/misc/guc.c:2633 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Встановлює OID таблиці для безумовного трасування блокувань." -#: utils/misc/guc.c:2573 +#: utils/misc/guc.c:2645 msgid "Sets the maximum allowed duration of any statement." msgstr "Встановлює максимальну тривалість для будь-якого оператору." -#: utils/misc/guc.c:2574 utils/misc/guc.c:2585 utils/misc/guc.c:2596 -#: utils/misc/guc.c:2607 +#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 +#: utils/misc/guc.c:2679 msgid "A value of 0 turns off the timeout." msgstr "Значення 0 (нуль) вимикає тайм-аут." -#: utils/misc/guc.c:2584 +#: utils/misc/guc.c:2656 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Встановлює максимально дозволену тривалість очікування блокувань." -#: utils/misc/guc.c:2595 +#: utils/misc/guc.c:2667 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Встановлює максимально дозволений час очікування між запитами під час транзакції." -#: utils/misc/guc.c:2606 +#: utils/misc/guc.c:2678 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Встановлює максимально дозволений час очікування між запитами поза транзакцією." -#: utils/misc/guc.c:2617 +#: utils/misc/guc.c:2689 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Мінімальний вік рядків таблиці, при котрому VACUUM зможе їх закріпити." -#: utils/misc/guc.c:2627 +#: utils/misc/guc.c:2699 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік, при котрому VACUUM повинен сканувати всю таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2637 +#: utils/misc/guc.c:2709 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Мінімальний вік, при котрому VACUUM повинен закріпити MultiXactId в рядку таблиці." -#: utils/misc/guc.c:2647 +#: utils/misc/guc.c:2719 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік Multixact, при котрому VACUUM повинен сканувати всю таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2657 +#: utils/misc/guc.c:2729 msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." msgstr "Визначає, кількість транзакцій які потрібно буде відкласти, виконуючи VACUUM і HOT очищення." -#: utils/misc/guc.c:2666 +#: utils/misc/guc.c:2738 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Вік, у якому VACUUM повинен спрацювати безпечно, щоб уникнути зациклення." -#: utils/misc/guc.c:2675 +#: utils/misc/guc.c:2747 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Вік Multixact, у якому VACUUM повинен спрацювати безпечно, щоб уникнути зациклення." -#: utils/misc/guc.c:2688 +#: utils/misc/guc.c:2760 msgid "Sets the maximum number of locks per transaction." msgstr "Встановлює максимальну кілкість блокувань на транзакцію." -#: utils/misc/guc.c:2689 +#: utils/misc/guc.c:2761 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:2700 +#: utils/misc/guc.c:2772 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Встановлює максимальну кількість предикатних блокувань на транзакцію." -#: utils/misc/guc.c:2701 +#: utils/misc/guc.c:2773 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:2712 +#: utils/misc/guc.c:2784 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Встановлює максимальну кількість сторінок і кортежів, блокованих предикатними блокуваннями в одному відношенні." -#: utils/misc/guc.c:2713 +#: utils/misc/guc.c:2785 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:2723 +#: utils/misc/guc.c:2795 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Встановлює максимальну кількість кортежів, блокованих предикатними блокуваннями в одній сторінці." -#: utils/misc/guc.c:2724 +#: utils/misc/guc.c:2796 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:2734 +#: utils/misc/guc.c:2806 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Встановлює максимально допустимий час, за котрий клієнт повинен завершити автентифікацію." -#: utils/misc/guc.c:2746 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Чекати N секунд при підключенні до автентифікації." +#: utils/misc/guc.c:2818 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Встановлює кількість часу для очікування перед автенифікацією під час запуску з'єднання." + +#: utils/misc/guc.c:2830 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Розмір буфера для читання в WAL під час відновлення." -#: utils/misc/guc.c:2757 +#: utils/misc/guc.c:2831 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "Максимальна відстань до читання WAL, для попереднього отримання блоків, на які посилаються." + +#: utils/misc/guc.c:2841 msgid "Sets the size of WAL files held for standby servers." msgstr "Встановлює розмір WAL файлів, які потрібно зберігати для резервних серверів." -#: utils/misc/guc.c:2768 +#: utils/misc/guc.c:2852 msgid "Sets the minimum size to shrink the WAL to." msgstr "Встановлює мінімальний розмір WAL при стисканні." -#: utils/misc/guc.c:2780 +#: utils/misc/guc.c:2864 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Встановлює розмір WAL, при котрому ініціюється контрольна точка." -#: utils/misc/guc.c:2792 +#: utils/misc/guc.c:2876 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Встановлює максимальний час між автоматичними контрольними точками WAL." -#: utils/misc/guc.c:2803 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "Видає попередження, якщо сегменти контрольних точок заповнуються частіше." +#: utils/misc/guc.c:2887 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "Встановлює максимальний час перед попередженням, якщо контрольні точки WAL відбуваються занадто часто." -#: utils/misc/guc.c:2805 -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:2889 +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:2817 utils/misc/guc.c:3033 utils/misc/guc.c:3080 +#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Число сторінок, після досягнення якого раніше виконані операції запису скидаються на диск." -#: utils/misc/guc.c:2828 +#: utils/misc/guc.c:2913 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Встановлює кількість буферів дискових сторінок в спільній пам'яті для WAL." -#: utils/misc/guc.c:2839 +#: utils/misc/guc.c:2924 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Час між скиданням WAL в процесі, записуючого WAL." -#: utils/misc/guc.c:2850 +#: utils/misc/guc.c:2935 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Обсяг WAL, оброблений пишучим WAL процесом, при котрому ініціюється скидання журналу на диск." -#: utils/misc/guc.c:2861 +#: utils/misc/guc.c:2946 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Мінімальний розмір нового файлу для fsync замість записування WAL." -#: utils/misc/guc.c:2872 +#: utils/misc/guc.c:2957 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Встановлює максимальну кількість одночасно працюючих процесів передачі WAL." -#: utils/misc/guc.c:2883 +#: utils/misc/guc.c:2968 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Встановлює максимальну кількість одночасно визначених слотів реплікації." -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2978 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Встановлює максимальний розмір WAL, який може бути зарезервований слотами реплікації." -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2979 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:2906 +#: utils/misc/guc.c:2991 msgid "Sets the maximum time to wait for WAL replication." msgstr "Встановлює максимальний час очікування реплікації WAL." -#: utils/misc/guc.c:2917 +#: utils/misc/guc.c:3002 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Встановлює затримку в мілісекундах між затвердженням транзакцій і скиданням WAL на диск." -#: utils/misc/guc.c:2929 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "Встановлює мінімальну кількість одночасно відкритих транзакцій до виконання commit_delay." +#: utils/misc/guc.c:3014 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "Встановлює мінімальну кількість одночасно відкритих транзакцій, необхідних до виконання commit_delay." -#: utils/misc/guc.c:2940 +#: utils/misc/guc.c:3025 msgid "Sets the number of digits displayed for floating-point values." msgstr "Встановлює кількість виведених чисел для значень з плаваючою точкою." -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:3026 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:2953 +#: utils/misc/guc.c:3038 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:2956 +#: utils/misc/guc.c:3041 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 (нуль) фіксує зразок всіх запитів. -1 вимикає цю функцію." -#: utils/misc/guc.c:2966 +#: utils/misc/guc.c:3051 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Встановлює мінімальний час виконання, понад якого всі твердження будуть записуватись." -#: utils/misc/guc.c:2968 +#: utils/misc/guc.c:3053 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 (нуль) протоколюються всі запити. -1 вимикає цю функцію." -#: utils/misc/guc.c:2978 +#: utils/misc/guc.c:3063 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Встановлює мінімальний час виконання автоочистки, при перевищенні котрого ця дія фіксується в протоколі." -#: utils/misc/guc.c:2980 +#: utils/misc/guc.c:3065 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "При 0 (нуль) протоколюються всі дії автоочистки. -1 вимикає журналювання автоочистки." -#: utils/misc/guc.c:2990 -msgid "When logging statements, limit logged parameter values to first N bytes." -msgstr "Під час журналювання тверджень, обмежте записуваних параметрів до перших N байт." +#: utils/misc/guc.c:3075 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "Встановлює максимальну довжину в байтах даних, що реєструються для значень параметрів під час журналювання операторів." -#: utils/misc/guc.c:2991 utils/misc/guc.c:3002 +#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 msgid "-1 to print values in full." msgstr "-1 для друку значень в повному вигляді." -#: utils/misc/guc.c:3001 -msgid "When reporting an error, limit logged parameter values to first N bytes." -msgstr "Під час звітування про помилку, обмежте значення записуваних параметрів до перших N байт." +#: utils/misc/guc.c:3087 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "Встановлює максимальну довжину в байтах, даних, що реєструються для значень параметрів під час журналювання операторів, у разі помилки." -#: utils/misc/guc.c:3012 +#: utils/misc/guc.c:3099 msgid "Background writer sleep time between rounds." msgstr "Час призупинення в процесі фонового запису між підходами." -#: utils/misc/guc.c:3023 +#: utils/misc/guc.c:3110 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Максимальна кількість LRU-сторінок, які скидаються за один підхід, в процесі фонового запису." -#: utils/misc/guc.c:3046 +#: utils/misc/guc.c:3133 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Кількість одночасних запитів, які можуть бути ефективно оброблені дисковою підсистемою." -#: utils/misc/guc.c:3064 +#: utils/misc/guc.c:3151 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Варіант effective_io_concurrency, що використовується для роботи з обслуговування." -#: utils/misc/guc.c:3093 +#: utils/misc/guc.c:3181 msgid "Maximum number of concurrent worker processes." msgstr "Максимальна кількість одночасно працюючих процесів." -#: utils/misc/guc.c:3105 +#: utils/misc/guc.c:3193 msgid "Maximum number of logical replication worker processes." msgstr "Максимальна кількість працюючих процесів логічної реплікації." -#: utils/misc/guc.c:3117 +#: utils/misc/guc.c:3205 msgid "Maximum number of table synchronization workers per subscription." msgstr "Максимальна кількість процесів синхронізації таблиць для однієї підписки." -#: utils/misc/guc.c:3127 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Автоматичне обертання файлу журналу буде здійснюватись через кожні N хвилин." +#: utils/misc/guc.c:3215 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Встановлює кількість часу для оновлення файлу журналу." -#: utils/misc/guc.c:3138 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Автоматичне обертання файлу журналу буде здійснюватись після кожних N кілобайт." +#: utils/misc/guc.c:3227 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Встановлює максимальний розмір файлу журналу, якого він може досягнути, до ротації." -#: utils/misc/guc.c:3149 +#: utils/misc/guc.c:3239 msgid "Shows the maximum number of function arguments." msgstr "Показує максимальну кількість аргументів функції." -#: utils/misc/guc.c:3160 +#: utils/misc/guc.c:3250 msgid "Shows the maximum number of index keys." msgstr "Показує максимальну кількість ключів в індексі." -#: utils/misc/guc.c:3171 +#: utils/misc/guc.c:3261 msgid "Shows the maximum identifier length." msgstr "Показує максимальну довжину ідентифікатора." -#: utils/misc/guc.c:3182 +#: utils/misc/guc.c:3272 msgid "Shows the size of a disk block." msgstr "Показує розмір дискового блоку." -#: utils/misc/guc.c:3193 +#: utils/misc/guc.c:3283 msgid "Shows the number of pages per disk file." msgstr "Показує кількість сторінок в одному дисковому файлі." -#: utils/misc/guc.c:3204 +#: utils/misc/guc.c:3294 msgid "Shows the block size in the write ahead log." msgstr "Показує розмір блоку в журналі WAL." -#: utils/misc/guc.c:3215 +#: utils/misc/guc.c:3305 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Встановлює час очікування перед повторною спробою звертання до WAL після невдачі." -#: utils/misc/guc.c:3227 +#: utils/misc/guc.c:3317 msgid "Shows the size of write ahead log segments." msgstr "Показує розмір сегментів WAL." -#: utils/misc/guc.c:3240 +#: utils/misc/guc.c:3330 msgid "Time to sleep between autovacuum runs." msgstr "Час призупинення між запусками автоочистки." -#: utils/misc/guc.c:3250 +#: utils/misc/guc.c:3340 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Мінімальна кількість оновлень або видалень кортежів перед очисткою." -#: utils/misc/guc.c:3259 +#: utils/misc/guc.c:3349 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Мінімальна кількість вставлених кортежів перед очищенням, або -1 щоб вимкнути очищення після вставки." -#: utils/misc/guc.c:3268 +#: utils/misc/guc.c:3358 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Мінімальна кількість вставлень, оновлень або видалень кортежів перед аналізом." -#: utils/misc/guc.c:3278 +#: utils/misc/guc.c:3368 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Вік, при котрому необхідна автоочистка таблиці для запобігання зациклення ID транзакцій." -#: utils/misc/guc.c:3293 +#: utils/misc/guc.c:3380 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Вік Multixact, при котрому необхідна автоочистка таблиці для запобігання зациклення multixact." -#: utils/misc/guc.c:3303 +#: utils/misc/guc.c:3390 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Встановлює максимальну кількість одночасно працюючих робочих процесів автоочистки." -#: utils/misc/guc.c:3313 +#: utils/misc/guc.c:3400 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Встановлює максимальну кількість паралельних процесів на одну операцію обслуговування." -#: utils/misc/guc.c:3323 +#: utils/misc/guc.c:3410 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Встановлює максимальну кількість паралельних процесів на вузол виконавця." -#: utils/misc/guc.c:3334 +#: utils/misc/guc.c:3421 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Встановлює максимальну кількість паралельних процесів, які можуть бути активні в один момент." -#: utils/misc/guc.c:3345 +#: utils/misc/guc.c:3432 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Встановлює максимальний об'єм пам'яті для кожного робочого процесу автоочистки." -#: utils/misc/guc.c:3356 +#: utils/misc/guc.c:3443 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Термін, після закінчення котрого знімок вважається занадто старим для отримання сторінок, змінених після створення знімку." -#: utils/misc/guc.c:3357 +#: utils/misc/guc.c:3444 msgid "A value of -1 disables this feature." msgstr "Значення -1 вимикає цю функцію." -#: utils/misc/guc.c:3367 +#: utils/misc/guc.c:3454 msgid "Time between issuing TCP keepalives." msgstr "Час між видачею TCP keepalives." -#: utils/misc/guc.c:3368 utils/misc/guc.c:3379 utils/misc/guc.c:3503 +#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 msgid "A value of 0 uses the system default." msgstr "Значення 0 (нуль) використовує систему за замовчуванням." -#: utils/misc/guc.c:3378 +#: utils/misc/guc.c:3465 msgid "Time between TCP keepalive retransmits." msgstr "Час між повтореннями TCP keepalive." -#: utils/misc/guc.c:3389 +#: utils/misc/guc.c:3476 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "Повторне узгодження SSL більше не підтримується; єдине допустиме значення - 0 (нуль)." -#: utils/misc/guc.c:3400 +#: utils/misc/guc.c:3487 msgid "Maximum number of TCP keepalive retransmits." msgstr "Максимальна кількість повторень TCP keepalive." -#: utils/misc/guc.c:3401 -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:3488 +msgid "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:3412 +#: utils/misc/guc.c:3499 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Встановлює максимально допустимий результат для точного пошуку з використанням GIN." -#: utils/misc/guc.c:3423 +#: utils/misc/guc.c:3510 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Встановлює планувальнику припустимий загальний розмір кешей даних." -#: utils/misc/guc.c:3424 +#: utils/misc/guc.c:3511 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:3435 +#: utils/misc/guc.c:3522 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Встановлює мінімальний обсяг даних в таблиці для паралельного сканування." -#: utils/misc/guc.c:3436 +#: utils/misc/guc.c:3523 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:3446 +#: utils/misc/guc.c:3533 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Встановлює мінімальний обсяг даних в індексі для паралельного сканування." -#: utils/misc/guc.c:3447 +#: utils/misc/guc.c:3534 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:3458 +#: utils/misc/guc.c:3545 msgid "Shows the server version as an integer." msgstr "Показує версію сервера у вигляді цілого числа." -#: utils/misc/guc.c:3469 +#: utils/misc/guc.c:3556 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Записує до журналу перевищення тимчасовими файлами заданого розміру в КБ." -#: utils/misc/guc.c:3470 +#: utils/misc/guc.c:3557 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "0 (нуль) фіксує всі файли. -1 вимикає цю функцію (за замовчуванням)." -#: utils/misc/guc.c:3480 +#: utils/misc/guc.c:3567 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Встановлює розмір, зарезервований для pg_stat_activity.query, в байтах." -#: utils/misc/guc.c:3491 +#: utils/misc/guc.c:3578 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Встановлює максимальний розмір списку-очікування для GIN-індексу." -#: utils/misc/guc.c:3502 +#: utils/misc/guc.c:3589 msgid "TCP user timeout." msgstr "Таймаут користувача TCP." -#: utils/misc/guc.c:3513 +#: utils/misc/guc.c:3600 msgid "The size of huge page that should be requested." msgstr "Розмір величезної сторінки, яку необхідно затребувати." -#: utils/misc/guc.c:3524 +#: utils/misc/guc.c:3611 msgid "Aggressively flush system caches for debugging purposes." msgstr "Агресивно скидати системні кеші для цілей налагодження." -#: utils/misc/guc.c:3547 +#: utils/misc/guc.c:3634 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Встановлює інтервал часу між перевірками відключення під час виконання запитів." -#: utils/misc/guc.c:3567 +#: utils/misc/guc.c:3645 +msgid "Time between progress updates for long-running startup operations." +msgstr "Час між оновленнями прогресу для довготриваючих операцій запуску." + +#: utils/misc/guc.c:3647 +msgid "0 turns this feature off." +msgstr "0 вимикає цю функцію." + +#: utils/misc/guc.c:3666 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Встановлює для планувальника орієнтир вартості послідовного читання дискових сторінок." -#: utils/misc/guc.c:3578 +#: utils/misc/guc.c:3677 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Встановлює для планувальника орієнтир вартості непослідовного читання дискових сторінок." -#: utils/misc/guc.c:3589 +#: utils/misc/guc.c:3688 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного кортежу (рядка)." -#: utils/misc/guc.c:3600 +#: utils/misc/guc.c:3699 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного елементу індекса під час сканування індексу." -#: utils/misc/guc.c:3611 +#: utils/misc/guc.c:3710 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Встановлює для планувальника орієнтир вартості обробки кожного оператора або виклику функції." -#: utils/misc/guc.c:3622 +#: utils/misc/guc.c:3721 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Встановлює для планувальника приблизну вартість передавання кожного кортежу (рядка) від робочого процесу вихідному процесу." -#: utils/misc/guc.c:3633 +#: utils/misc/guc.c:3732 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Встановлює для планувальника орієнтир вартості запуску робочих процесів для паралельного запиту." -#: utils/misc/guc.c:3645 +#: utils/misc/guc.c:3744 msgid "Perform JIT compilation if query is more expensive." msgstr "Якщо запит дорожчий, виконується JIT-компіляція." -#: utils/misc/guc.c:3646 +#: utils/misc/guc.c:3745 msgid "-1 disables JIT compilation." msgstr "-1 вимикає JIT-компіляцію." -#: utils/misc/guc.c:3656 +#: utils/misc/guc.c:3755 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Оптимізувати функції JIT-compiled, якщо запит дорожчий." -#: utils/misc/guc.c:3657 +#: utils/misc/guc.c:3756 msgid "-1 disables optimization." msgstr "-1 вимикає оптимізацію." -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3766 msgid "Perform JIT inlining if query is more expensive." msgstr "Якщо запит дорожчий, виконується вбудовування JIT." -#: utils/misc/guc.c:3668 +#: utils/misc/guc.c:3767 msgid "-1 disables inlining." msgstr "-1 вимикає вбудовування." -#: utils/misc/guc.c:3678 +#: utils/misc/guc.c:3777 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Встановлює для планувальника орієнтир частки необхідних рядків курсора в загальній кількості." -#: utils/misc/guc.c:3690 +#: utils/misc/guc.c:3789 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Встановлює для планувальника орієнтир середнього розміру робочої таблиці рекурсивного запиту." + +#: utils/misc/guc.c:3801 msgid "GEQO: selective pressure within the population." msgstr "GEQO: вибірковий тиск в популяції." -#: utils/misc/guc.c:3701 +#: utils/misc/guc.c:3812 msgid "GEQO: seed for random path selection." msgstr "GEQO: відправна значення для випадкового вибору шляху." -#: utils/misc/guc.c:3712 +#: utils/misc/guc.c:3823 msgid "Multiple of work_mem to use for hash tables." msgstr "Декілька work_mem для використання геш-таблиць." -#: utils/misc/guc.c:3723 +#: utils/misc/guc.c:3834 msgid "Multiple of the average buffer usage to free per round." msgstr "Множник для середньої кількості використаних буферів, який визначає кількість буферів, які звільняються за один підхід." -#: utils/misc/guc.c:3733 +#: utils/misc/guc.c:3844 msgid "Sets the seed for random-number generation." msgstr "Встановлює відправне значення для генератора випадкових чисел." -#: utils/misc/guc.c:3744 +#: utils/misc/guc.c:3855 msgid "Vacuum cost delay in milliseconds." msgstr "Затримка вартості очистки в мілісекундах." -#: utils/misc/guc.c:3755 +#: utils/misc/guc.c:3866 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Затримка вартості очистки в мілісекундах, для автоочистки." -#: utils/misc/guc.c:3766 +#: utils/misc/guc.c:3877 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Кількість оновлень або видалень кортежів до reltuples, яка визначає потребу в очистці." -#: utils/misc/guc.c:3776 +#: utils/misc/guc.c:3887 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Кількість вставлень кортежів до reltuples, яка визначає потребу в очистці." -#: utils/misc/guc.c:3786 +#: utils/misc/guc.c:3897 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Кількість вставлень, оновлень або видалень кортежів до reltuples, яка визначає потребу в аналізі." -#: utils/misc/guc.c:3796 +#: utils/misc/guc.c:3907 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Час тривалості очищення \"брудних\" буферів під час контрольної точки до інтервалу контрольних точок." -#: utils/misc/guc.c:3806 +#: utils/misc/guc.c:3917 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Частка тверджень, перевищує log_min_duration_sample, що підлягає запису." -#: utils/misc/guc.c:3807 +#: utils/misc/guc.c:3918 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Використайте значення між 0.0 (ніколи не записувати) і 1.0 (завжди записувати)." -#: utils/misc/guc.c:3816 +#: utils/misc/guc.c:3927 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Встановлює частину транзакцій, від яких необхідно журналювати всі команди." -#: utils/misc/guc.c:3817 +#: utils/misc/guc.c:3928 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:3836 +#: utils/misc/guc.c:3947 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Встановлює команду оболонки, яка буде викликатись для архівації файлу WAL." -#: utils/misc/guc.c:3846 +#: utils/misc/guc.c:3948 +msgid "This is used only if \"archive_library\" is not set." +msgstr "Це використовується лише, якщо \"archive_library\" не встановлено." + +#: utils/misc/guc.c:3957 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Встановлює бібліотеку, яка буде викликана для архівування файлу WAL." + +#: utils/misc/guc.c:3958 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "Порожній рядок вказує на те, що слід використовувати \"archive_command\"." + +#: utils/misc/guc.c:3967 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Встановлює команду оболонки, яка буде викликана для отримання архівованого файлу WAL." -#: utils/misc/guc.c:3856 +#: utils/misc/guc.c:3977 msgid "Sets the shell command that will be executed at every restart point." msgstr "Встановлює команду оболонки, яка буде виконуватися в кожній точці перезапуску." -#: utils/misc/guc.c:3866 +#: utils/misc/guc.c:3987 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Встановлює команду оболонки, яка буде виконуватися один раз в кінці відновлення." -#: utils/misc/guc.c:3876 +#: utils/misc/guc.c:3997 msgid "Specifies the timeline to recover into." msgstr "Вказує лінію часу для відновлення." -#: utils/misc/guc.c:3886 +#: utils/misc/guc.c:4007 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Встановіть на \"негайно\" щоб закінчити відновлення як тільки буде досягнуто узгодженого стану." -#: utils/misc/guc.c:3895 +#: utils/misc/guc.c:4016 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Встановлює ідентифікатор транзакції, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3904 +#: utils/misc/guc.c:4025 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Встановлює позначку часу, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3913 +#: utils/misc/guc.c:4034 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Встановлює назву точки відновлення, до якої буде продовжуватися відновлення." -#: utils/misc/guc.c:3922 +#: utils/misc/guc.c:4043 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Встановлює номер LSN розташування випереджувального журналювання, до якого буде продовжуватися відновлення." -#: utils/misc/guc.c:3932 +#: utils/misc/guc.c:4053 msgid "Specifies a file name whose presence ends recovery in the standby." msgstr "Вказує назву файлу, наявність якого закінчує відновлення в режимі очікування." -#: utils/misc/guc.c:3942 +#: utils/misc/guc.c:4063 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Встановлює рядок підключення який буде використовуватися для підключення до серверу надсилання." -#: utils/misc/guc.c:3953 +#: utils/misc/guc.c:4074 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Встановлює назву слота реплікації, для використання на сервері надсилання." -#: utils/misc/guc.c:3963 +#: utils/misc/guc.c:4084 msgid "Sets the client's character set encoding." msgstr "Встановлює кодування символів, використовуване клієнтом." -#: utils/misc/guc.c:3974 +#: utils/misc/guc.c:4095 msgid "Controls information prefixed to each log line." msgstr "Визначає інформацію префікса кожного рядка протокола." -#: utils/misc/guc.c:3975 +#: utils/misc/guc.c:4096 msgid "If blank, no prefix is used." msgstr "При пустому значенні, префікс також відсутній." -#: utils/misc/guc.c:3984 +#: utils/misc/guc.c:4105 msgid "Sets the time zone to use in log messages." msgstr "Встановлює часовий пояс для виведення часу в повідомленях протокола." -#: utils/misc/guc.c:3994 +#: utils/misc/guc.c:4115 msgid "Sets the display format for date and time values." msgstr "Встановлює формат виведення значень часу і дат." -#: utils/misc/guc.c:3995 +#: utils/misc/guc.c:4116 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Також визначає багатозначні задані дати, які вводяться." -#: utils/misc/guc.c:4006 +#: utils/misc/guc.c:4127 msgid "Sets the default table access method for new tables." msgstr "Встановлює метод доступу до таблиці за замовчуванням для нових таблиць." -#: utils/misc/guc.c:4017 +#: utils/misc/guc.c:4138 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Встановлює табличний простір за замовчуванням, для створення таблиць і індексів." -#: utils/misc/guc.c:4018 +#: utils/misc/guc.c:4139 msgid "An empty string selects the database's default tablespace." msgstr "Пустий рядок вибирає табличний простір за замовчуванням бази даних." -#: utils/misc/guc.c:4028 +#: utils/misc/guc.c:4149 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Встановлює табличний простір(простори) для використання в тимчасових таблицях і файлах сортування." -#: utils/misc/guc.c:4039 +#: utils/misc/guc.c:4160 msgid "Sets the path for dynamically loadable modules." msgstr "Встановлює шлях для динамічно завантажуваних модулів." -#: utils/misc/guc.c:4040 +#: utils/misc/guc.c:4161 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:4053 +#: utils/misc/guc.c:4174 msgid "Sets the location of the Kerberos server key file." msgstr "Встановлює розташування файлу з ключем Kerberos для даного сервера." -#: utils/misc/guc.c:4064 +#: utils/misc/guc.c:4185 msgid "Sets the Bonjour service name." msgstr "Встановлює ім'я служби Bonjour." -#: utils/misc/guc.c:4076 +#: utils/misc/guc.c:4197 msgid "Shows the collation order locale." msgstr "Показує порядок локалізації параметра сортування." -#: utils/misc/guc.c:4087 +#: utils/misc/guc.c:4208 msgid "Shows the character classification and case conversion locale." msgstr "Показує класифікацію символу і перетворення локалізації." -#: utils/misc/guc.c:4098 +#: utils/misc/guc.c:4219 msgid "Sets the language in which messages are displayed." msgstr "Встановлює мову виведених повідомлень." -#: utils/misc/guc.c:4108 +#: utils/misc/guc.c:4229 msgid "Sets the locale for formatting monetary amounts." msgstr "Встановлює локалізацію для форматування грошових сум." -#: utils/misc/guc.c:4118 +#: utils/misc/guc.c:4239 msgid "Sets the locale for formatting numbers." msgstr "Встановлює локалізацію для форматування чисел." -#: utils/misc/guc.c:4128 +#: utils/misc/guc.c:4249 msgid "Sets the locale for formatting date and time values." msgstr "Встановлює локалізацію для форматування значень дати і часу." -#: utils/misc/guc.c:4138 +#: utils/misc/guc.c:4259 msgid "Lists shared libraries to preload into each backend." msgstr "Список спільних бібліотек, попередньо завантажених до кожного внутрішнього серверу." -#: utils/misc/guc.c:4149 +#: utils/misc/guc.c:4270 msgid "Lists shared libraries to preload into server." msgstr "Список спільних бібліотек, попередньо завантажених до серверу." -#: utils/misc/guc.c:4160 +#: utils/misc/guc.c:4281 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Список непривілейованих спільних бібліотек, попередньо завантажених до кожного внутрішнього серверу." -#: utils/misc/guc.c:4171 +#: utils/misc/guc.c:4292 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Встановлює порядок пошуку схеми для імен, які не є схемо-кваліфікованими." -#: utils/misc/guc.c:4183 +#: utils/misc/guc.c:4304 msgid "Shows the server (database) character set encoding." msgstr "Показує набір символів кодування сервера (бази даних)." -#: utils/misc/guc.c:4195 +#: utils/misc/guc.c:4316 msgid "Shows the server version." msgstr "Показує версію сервера." -#: utils/misc/guc.c:4207 +#: utils/misc/guc.c:4328 msgid "Sets the current role." msgstr "Встановлює чинну роль." -#: utils/misc/guc.c:4219 +#: utils/misc/guc.c:4340 msgid "Sets the session user name." msgstr "Встановлює ім'я користувача в сеансі." -#: utils/misc/guc.c:4230 +#: utils/misc/guc.c:4351 msgid "Sets the destination for server log output." msgstr "Встановлює, куди буде виводитися протокол серверу." -#: utils/misc/guc.c:4231 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." -msgstr "Дійсними значеннями є комбінації \"stderr\", \"syslog\", \"csvlog\", і \"eventlog\" в залежності від платформи." +#: utils/misc/guc.c:4352 +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:4242 +#: utils/misc/guc.c:4363 msgid "Sets the destination directory for log files." msgstr "Встановлює каталог призначення для файлів журналу." -#: utils/misc/guc.c:4243 +#: utils/misc/guc.c:4364 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Шлях може бути абсолютним або вказуватися відносно каталогу даних." -#: utils/misc/guc.c:4253 +#: utils/misc/guc.c:4374 msgid "Sets the file name pattern for log files." msgstr "Встановлює шаблон імені для файлів журналу." -#: utils/misc/guc.c:4264 +#: utils/misc/guc.c:4385 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Встановлює ім'я програми для ідентифікації повідомлень PostgreSQL в syslog." -#: utils/misc/guc.c:4275 +#: utils/misc/guc.c:4396 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Встановлює ім'я програми для ідентифікації повідомлень PostgreSQL в журналі подій." -#: utils/misc/guc.c:4286 +#: utils/misc/guc.c:4407 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Встановлює часовий пояс для відображення та інтерпретації позначок часу." -#: utils/misc/guc.c:4296 +#: utils/misc/guc.c:4417 msgid "Selects a file of time zone abbreviations." msgstr "Вибирає файл з скороченими іменами часових поясів." -#: utils/misc/guc.c:4306 +#: utils/misc/guc.c:4427 msgid "Sets the owning group of the Unix-domain socket." msgstr "Встановлює відповідальну групу Unix-сокету." -#: utils/misc/guc.c:4307 +#: utils/misc/guc.c:4428 msgid "The owning user of the socket is always the user that starts the server." msgstr "Відповідальний користувач сокету це завжди той користувач який запустив сервер." -#: utils/misc/guc.c:4317 +#: utils/misc/guc.c:4438 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Встановлює каталоги, де будуть створюватись Unix-сокети." -#: utils/misc/guc.c:4332 +#: utils/misc/guc.c:4453 msgid "Sets the host name or IP address(es) to listen to." msgstr "Встановлює ім'я хосту або IP-адресу для прив'язки." -#: utils/misc/guc.c:4347 +#: utils/misc/guc.c:4468 msgid "Sets the server's data directory." msgstr "Встановлює каталог даних серверу." -#: utils/misc/guc.c:4358 +#: utils/misc/guc.c:4479 msgid "Sets the server's main configuration file." msgstr "Встановлює основний файл конфігурації серверу." -#: utils/misc/guc.c:4369 +#: utils/misc/guc.c:4490 msgid "Sets the server's \"hba\" configuration file." msgstr "Встановлює \"hba\" файл конфігурації серверу." -#: utils/misc/guc.c:4380 +#: utils/misc/guc.c:4501 msgid "Sets the server's \"ident\" configuration file." msgstr "Встановлює \"ident\" файл конфігурації серверу." -#: utils/misc/guc.c:4391 +#: utils/misc/guc.c:4512 msgid "Writes the postmaster PID to the specified file." msgstr "Записує ідентифікатор процесу (PID) postmaster у вказаний файл." -#: utils/misc/guc.c:4402 +#: utils/misc/guc.c:4523 msgid "Shows the name of the SSL library." msgstr "Показує назву бібліотеки SSL." -#: utils/misc/guc.c:4417 +#: utils/misc/guc.c:4538 msgid "Location of the SSL server certificate file." msgstr "Розташування файла сертифікату сервера для SSL." -#: utils/misc/guc.c:4427 +#: utils/misc/guc.c:4548 msgid "Location of the SSL server private key file." msgstr "Розташування файла з закритим ключем сервера для SSL." -#: utils/misc/guc.c:4437 +#: utils/misc/guc.c:4558 msgid "Location of the SSL certificate authority file." msgstr "Розташування файла центру сертифікації для SSL." -#: utils/misc/guc.c:4447 +#: utils/misc/guc.c:4568 msgid "Location of the SSL certificate revocation list file." msgstr "Розташування файла зі списком відкликаних сертфікатів для SSL." -#: utils/misc/guc.c:4457 +#: utils/misc/guc.c:4578 msgid "Location of the SSL certificate revocation list directory." msgstr "Розташування каталогу списку відкликаних сертифікатів SSL." -#: utils/misc/guc.c:4467 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Записує тимчасові файли статистики у вказаний каталог." - -#: utils/misc/guc.c:4478 +#: utils/misc/guc.c:4588 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Кількість потенційно синхронних режимів очікування і список їх імен." -#: utils/misc/guc.c:4489 +#: utils/misc/guc.c:4599 msgid "Sets default text search configuration." msgstr "Встановлює конфігурацію текстового пошуку за замовчуванням." -#: utils/misc/guc.c:4499 +#: utils/misc/guc.c:4609 msgid "Sets the list of allowed SSL ciphers." msgstr "Встановлює список дозволених шифрів для SSL." -#: utils/misc/guc.c:4514 +#: utils/misc/guc.c:4624 msgid "Sets the curve to use for ECDH." msgstr "Встановлює криву для ECDH." -#: utils/misc/guc.c:4529 +#: utils/misc/guc.c:4639 msgid "Location of the SSL DH parameters file." msgstr "Розташування файла з параметрами SSL DH." -#: utils/misc/guc.c:4540 +#: utils/misc/guc.c:4650 msgid "Command to obtain passphrases for SSL." msgstr "Команда, що дозволяє отримати парольну фразу для SSL." -#: utils/misc/guc.c:4551 +#: utils/misc/guc.c:4661 msgid "Sets the application name to be reported in statistics and logs." msgstr "Встановлює ім'я програми, яке буде повідомлятись у статистиці і протоколах." -#: utils/misc/guc.c:4562 +#: utils/misc/guc.c:4672 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Встановлює ім'я кластеру, яке буде включене до заголовка процесу." -#: utils/misc/guc.c:4573 +#: utils/misc/guc.c:4683 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Встановлює менеджерів ресурсу WAL, для яких виконано перевірки узгодженості WAL." -#: utils/misc/guc.c:4574 +#: utils/misc/guc.c:4684 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:4584 +#: utils/misc/guc.c:4694 msgid "JIT provider to use." msgstr "Використовувати провайдер JIT." -#: utils/misc/guc.c:4595 +#: utils/misc/guc.c:4705 msgid "Log backtrace for errors in these functions." msgstr "Відстежувати записи помилок у ціх функціях." -#: utils/misc/guc.c:4615 +#: utils/misc/guc.c:4725 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Встановлює, чи дозволене використання \"\\\" в текстових рядках." -#: utils/misc/guc.c:4625 +#: utils/misc/guc.c:4735 msgid "Sets the output format for bytea." msgstr "Встановлює формат виводу для типу bytea." -#: utils/misc/guc.c:4635 +#: utils/misc/guc.c:4745 msgid "Sets the message levels that are sent to the client." msgstr "Встановлює рівень повідомлень, переданих клієнту." -#: utils/misc/guc.c:4636 utils/misc/guc.c:4722 utils/misc/guc.c:4733 -#: utils/misc/guc.c:4809 +#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 +#: utils/misc/guc.c:4919 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Кожен рівень включає всі наступні рівні. Чим вище рівень, тим менше повідомлень надіслано." -#: utils/misc/guc.c:4646 -msgid "Compute query identifiers." -msgstr "Обчислення ідентифікаторів запитів." +#: utils/misc/guc.c:4756 +msgid "Enables in-core computation of query identifiers." +msgstr "Вмикає внутрішнє обчислення ідентифікаторів запиту." -#: utils/misc/guc.c:4656 +#: utils/misc/guc.c:4766 msgid "Enables the planner to use constraints to optimize queries." msgstr "Дає змогу планувальнику оптимізувати запити, використовуючи обмеження." -#: utils/misc/guc.c:4657 +#: utils/misc/guc.c:4767 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Сканування таблиці буде пропущено, якщо її обмеження гарантують, що запиту не відповідають ніякі рядки." -#: utils/misc/guc.c:4668 +#: utils/misc/guc.c:4778 msgid "Sets the default compression method for compressible values." msgstr "Встановлює метод стискання за замовчуванням для стисливих значень." -#: utils/misc/guc.c:4679 +#: utils/misc/guc.c:4789 msgid "Sets the transaction isolation level of each new transaction." msgstr "Встановлює рівень ізоляції транзакції для кожної нової транзакції." -#: utils/misc/guc.c:4689 +#: utils/misc/guc.c:4799 msgid "Sets the current transaction's isolation level." msgstr "Встановлює чинний рівень ізоляції транзакцій." -#: utils/misc/guc.c:4700 +#: utils/misc/guc.c:4810 msgid "Sets the display format for interval values." msgstr "Встановлює формат відображення внутрішніх значень." -#: utils/misc/guc.c:4711 +#: utils/misc/guc.c:4821 msgid "Sets the verbosity of logged messages." msgstr "Встановлює детальність повідомлень, які протоколюються." -#: utils/misc/guc.c:4721 +#: utils/misc/guc.c:4831 msgid "Sets the message levels that are logged." msgstr "Встанолвює рівні повідомлень, які протоколюються." -#: utils/misc/guc.c:4732 +#: utils/misc/guc.c:4842 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Вмикає протоколювання для всіх операторів, виконаних з помилкою цього або вище рівня." -#: utils/misc/guc.c:4743 +#: utils/misc/guc.c:4853 msgid "Sets the type of statements logged." msgstr "Встановлює тип операторів, які протоколюються." -#: utils/misc/guc.c:4753 +#: utils/misc/guc.c:4863 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Встановлює отримувача повідомлень, які відправляються до syslog." -#: utils/misc/guc.c:4768 +#: utils/misc/guc.c:4878 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Встановлює поведінку для тригерів і правил перезапису для сеансу." -#: utils/misc/guc.c:4778 +#: utils/misc/guc.c:4888 msgid "Sets the current transaction's synchronization level." msgstr "Встановлює рівень синхронізації поточної транзакції." -#: utils/misc/guc.c:4788 +#: utils/misc/guc.c:4898 msgid "Allows archiving of WAL files using archive_command." msgstr "Дозволяє архівацію файлів WAL, використовуючи archive_command." -#: utils/misc/guc.c:4798 +#: utils/misc/guc.c:4908 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Встновлює дію яку потрібно виконати в разі досягнення мети відновлення." -#: utils/misc/guc.c:4808 +#: utils/misc/guc.c:4918 msgid "Enables logging of recovery-related debugging information." msgstr "Вмикає протоколювання налагодженної інформації, пов'язаної з відновленням." -#: utils/misc/guc.c:4824 +#: utils/misc/guc.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Збирає статистику активності в базі даних на рівні функцій." -#: utils/misc/guc.c:4834 +#: utils/misc/guc.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Встановлює послідовність доступу до даних статистики." + +#: utils/misc/guc.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "Стискає повносторінкові записи, записані у файлі WAL за допомогою вказаного методу." + +#: utils/misc/guc.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Встановлює рівень інформації, яка записується до WAL." -#: utils/misc/guc.c:4844 +#: utils/misc/guc.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Вибирає використовуване впровадження динамічної спільної пам'яті." -#: utils/misc/guc.c:4854 +#: utils/misc/guc.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Вибирає впровадження спільної пам'яті, що використовується для основної області спільної пам'яті." -#: utils/misc/guc.c:4864 +#: utils/misc/guc.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Вибирає метод примусового запису оновлень в WAL на диск." -#: utils/misc/guc.c:4874 +#: utils/misc/guc.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "Встановлює, як повинні кодуватись двійкові значення в XML." -#: utils/misc/guc.c:4884 +#: utils/misc/guc.c:5016 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:4895 +#: utils/misc/guc.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Використовувати величезні сторінки в Linux або Windows." -#: utils/misc/guc.c:4905 +#: utils/misc/guc.c:5037 +msgid "Prefetch referenced blocks during recovery." +msgstr "Попередньо вибирати пов'язані блоки під час відновлення." + +#: utils/misc/guc.c:5038 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Шукати в WAL посилання на незакешовані дані." + +#: utils/misc/guc.c:5047 msgid "Forces use of parallel query facilities." msgstr "Примусово використовувати паралельне виконання запитів." -#: utils/misc/guc.c:4906 +#: utils/misc/guc.c:5048 msgid "If possible, run query using a parallel worker and with parallel restrictions." msgstr "Якщо можливо, виконувати запит використовуючи паралельного працівника і з обмеженнями паралельності." -#: utils/misc/guc.c:4916 +#: utils/misc/guc.c:5058 msgid "Chooses the algorithm for encrypting passwords." msgstr "Виберіть алгоритм для шифрування паролів." -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:5068 msgid "Controls the planner's selection of custom or generic plan." msgstr "Контролює вибір планувальником спеціального або загального плану." -#: utils/misc/guc.c:4927 +#: utils/misc/guc.c:5069 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:4939 +#: utils/misc/guc.c:5081 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Встановлює мінімальну версію протоколу SSL/TLS для використання." -#: utils/misc/guc.c:4951 +#: utils/misc/guc.c:5093 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Встановлює максимальну версію протоколу SSL/TLS для використання." -#: utils/misc/guc.c:4963 +#: utils/misc/guc.c:5105 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Встановлює метод для синхронізації каталогу даних перед аварійним відновленням." -#: utils/misc/guc.c:5532 +#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "неприпустима назва параметра конфігурації \"%s\"" -#: utils/misc/guc.c:5534 +#: utils/misc/guc.c:5682 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Власні назви параметрів повинні містити два або більше простих ідентифікаторів, розділених крапками." -#: utils/misc/guc.c:5543 utils/misc/guc.c:9302 +#: utils/misc/guc.c:5698 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" є зарезервованим префіксом." + +#: utils/misc/guc.c:5712 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "нерозпізнаний параметр конфігурації \"%s\"" -#: utils/misc/guc.c:5836 +#: utils/misc/guc.c:6104 #, c-format msgid "%s: could not access directory \"%s\": %s\n" msgstr "%s: немає доступу до каталогу \"%s\": %s\n" -#: utils/misc/guc.c:5841 +#: utils/misc/guc.c:6109 #, 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:5861 +#: utils/misc/guc.c:6129 #, 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:5880 +#: utils/misc/guc.c:6148 #, c-format msgid "%s: could not access the server configuration file \"%s\": %s\n" msgstr "%s: не вдалося отримати доступ до файлу конфігурації сервера \"%s\": %s\n" -#: utils/misc/guc.c:5906 +#: utils/misc/guc.c:6174 #, 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:5954 +#: utils/misc/guc.c:6222 #, 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:5977 +#: utils/misc/guc.c:6245 #, 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:6902 +#: utils/misc/guc.c:7176 msgid "Value exceeds integer range." msgstr "Значення перевищує діапазон цілих чисел." -#: utils/misc/guc.c:7138 +#: utils/misc/guc.c:7412 #, 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:7174 +#: utils/misc/guc.c:7448 #, 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:7334 utils/misc/guc.c:8706 +#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 #, c-format msgid "cannot set parameters during a parallel operation" msgstr "встановити параметри під час паралельної операції не можна" -#: utils/misc/guc.c:7351 utils/misc/guc.c:8547 +#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" не може бути змінений" -#: utils/misc/guc.c:7374 utils/misc/guc.c:7572 utils/misc/guc.c:7666 -#: utils/misc/guc.c:7760 utils/misc/guc.c:7880 utils/misc/guc.c:7979 +#: utils/misc/guc.c:7688 utils/misc/guc.c:7908 utils/misc/guc.c:8006 +#: utils/misc/guc.c:8104 utils/misc/guc.c:8228 utils/misc/guc.c:8331 #: guc-file.l:353 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "параметр \"%s\" не може бути змінений, без перезавантаження сервера" -#: utils/misc/guc.c:7384 +#: utils/misc/guc.c:7698 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" не може бути змінений зараз" -#: utils/misc/guc.c:7402 utils/misc/guc.c:7449 utils/misc/guc.c:11357 +#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 +#: utils/misc/guc.c:11804 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "немає прав для встановлення параметру \"%s\"" -#: utils/misc/guc.c:7439 +#: utils/misc/guc.c:7763 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "параметр \"%s\" не можна встановити після встановлення підключення" -#: utils/misc/guc.c:7487 +#: utils/misc/guc.c:7822 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "параметр \"%s\" не можна встановити в межах функції безпеки" -#: utils/misc/guc.c:8120 utils/misc/guc.c:8167 utils/misc/guc.c:9574 +#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10009 #, 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:8251 +#: utils/misc/guc.c:8606 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s приймає лише один аргумент" -#: utils/misc/guc.c:8499 +#: utils/misc/guc.c:8886 #, 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:8580 +#: utils/misc/guc.c:8953 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значення параметру для ALTER SYSTEM не повинне містити нового рядка" -#: utils/misc/guc.c:8625 +#: utils/misc/guc.c:8998 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не вдалося аналізувати зміст файла \"%s\"" -#: utils/misc/guc.c:8782 +#: utils/misc/guc.c:9172 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT не реалізовано" -#: utils/misc/guc.c:8866 +#: utils/misc/guc.c:9259 #, c-format msgid "SET requires parameter name" msgstr "SET потребує ім'я параметра" -#: utils/misc/guc.c:8999 +#: utils/misc/guc.c:9392 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "спроба перевизначити параметр \"%s\"" -#: utils/misc/guc.c:10804 +#: utils/misc/guc.c:9719 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "неприпустима назва параметра конфігурації \"%s\", видаляємо" + +#: utils/misc/guc.c:9721 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" тепер є зарезервованим префіксом." + +#: utils/misc/guc.c:11244 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "під час налаштування параметру \"%s\" на \"%s\"" -#: utils/misc/guc.c:10969 +#: utils/misc/guc.c:11413 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" не вдалося встановити" -#: utils/misc/guc.c:11061 +#: utils/misc/guc.c:11505 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не вдалося аналізувати налаштування параметру \"%s\"" -#: utils/misc/guc.c:11419 utils/misc/guc.c:11453 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "неприпустиме значення для параметра \"%s\": %d" - -#: utils/misc/guc.c:11487 +#: utils/misc/guc.c:11936 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неприпустиме значення для параметра \"%s\": %g" -#: utils/misc/guc.c:11774 +#: utils/misc/guc.c:12249 #, 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:11786 +#: utils/misc/guc.c:12261 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не підтримується даною збіркою" -#: utils/misc/guc.c:11799 +#: utils/misc/guc.c:12274 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не підтримується даною збіркою" -#: utils/misc/guc.c:11811 +#: utils/misc/guc.c:12286 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Не можна ввімкнути параметр, коли \"log_statement_stats\" дорівнює true." -#: utils/misc/guc.c:11823 +#: utils/misc/guc.c:12298 #, 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:12053 +#: utils/misc/guc.c:12528 #, 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:12066 +#: utils/misc/guc.c:12541 #, 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:12080 +#: utils/misc/guc.c:12555 #, c-format msgid "huge_page_size must be 0 on this platform." msgstr "huge_page_size повинен бути 0 на цій платформі." -#: utils/misc/guc.c:12094 +#: utils/misc/guc.c:12567 #, c-format -msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgstr "client_connection_check_interval повинен бути встановлений в 0, на платформах де відсутній POLLRDHUP." +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "client_connection_check_interval має бути встановлений в 0 на цій платформі." -#: utils/misc/guc.c:12222 +#: utils/misc/guc.c:12679 #, c-format msgid "invalid character" msgstr "неприпустимий символ" -#: utils/misc/guc.c:12282 +#: utils/misc/guc.c:12739 #, c-format msgid "recovery_target_timeline is not a valid number." msgstr "recovery_target_timeline не є допустимим числом." -#: utils/misc/guc.c:12322 +#: utils/misc/guc.c:12779 #, c-format msgid "multiple recovery targets specified" msgstr "вказано декілька цілей відновлення" -#: utils/misc/guc.c:12323 +#: utils/misc/guc.c:12780 #, 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:12331 +#: utils/misc/guc.c:12788 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Єдиним дозволеним значенням є \"immediate\"." @@ -27636,13 +28433,8 @@ 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 +#: utils/misc/pg_controldata.c:63 utils/misc/pg_controldata.c:143 +#: utils/misc/pg_controldata.c:248 utils/misc/pg_controldata.c:315 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "обчислена контрольна сума CRC не відповідає значенню, збереженому у файлі" @@ -27662,7 +28454,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:497 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" msgstr "додати більше причин тайм-ауту не можна" @@ -27732,7 +28524,7 @@ msgstr "занадто довгий рядок у файлі часового п msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "в @INCLUDE не вказано ім'я файла у файлі часового поясу \"%s\", рядок %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:235 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Помилка під час створення контексту пам'яті \"%s\"." @@ -27755,89 +28547,89 @@ msgstr "Помилка в запиті розміру %zu в контексті msgid "logging memory contexts of PID %d" msgstr "журналювання контекстів пам'яті PID %d" -#: utils/mmgr/portalmem.c:187 +#: 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:401 +#: utils/mmgr/portalmem.c:402 #, c-format msgid "portal \"%s\" cannot be run" msgstr "портал \"%s\" не можна запустити" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:480 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "видалити закріплений портал \"%s\" не можна" -#: utils/mmgr/portalmem.c:487 +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "видалити активний портал \"%s\" не можна" -#: utils/mmgr/portalmem.c:738 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "не можна виконати PREPARE для транзакції, яка створила курсор WITH HOLD" -#: utils/mmgr/portalmem.c:1279 +#: 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 "не вдалося прочитати блок %ld тимчасового файлу: прочитано лише %zu з %zu байт." -#: 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 +#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 +#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 +#: utils/sort/sharedtuplestore.c:498 #, c-format msgid "could not read from shared tuplestore temporary file" msgstr "не вдалося прочитати тимчасовий файл зі зпільного сховища кортежів" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:487 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "неочікуваний блок у тимчасовому файлі спільного сховища кортежів" -#: utils/sort/sharedtuplestore.c:570 +#: utils/sort/sharedtuplestore.c:572 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "не вдалося знайти для блокування %u у тимчасовому файлі зі спільного сховища кортежів" -#: utils/sort/sharedtuplestore.c:577 +#: utils/sort/sharedtuplestore.c:579 #, c-format msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" msgstr "не вдалося прочитати з тимчасового файлу зі спільного сховища кортежів: прочитано лише %zu з %zu байт" -#: utils/sort/tuplesort.c:3218 +#: utils/sort/tuplesort.c:3322 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "кількість виконуючих процесів для зовнішнього сортування не може перевищувати %d" -#: utils/sort/tuplesort.c:4299 +#: utils/sort/tuplesort.c:4425 #, c-format msgid "could not create unique index \"%s\"" msgstr "не вдалося створити унікальний індекс \"%s\"" -#: utils/sort/tuplesort.c:4301 +#: utils/sort/tuplesort.c:4427 #, c-format msgid "Key %s is duplicated." msgstr "Ключ %s дублюється." -#: utils/sort/tuplesort.c:4302 +#: utils/sort/tuplesort.c:4428 #, c-format msgid "Duplicate keys exist." msgstr "Дублікати ключів існують." @@ -27907,342 +28699,377 @@ msgstr "серіалізована транзакція в режимі \"чит msgid "cannot import a snapshot from a different database" msgstr "імпортувати знімок з іншої бази даних не можна" -#: gram.y:1108 +#: gram.y:1146 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD більше не підтримується" -#: gram.y:1109 +#: gram.y:1147 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Видаліть UNENCRYPTED, щоб зберегти пароль у зашифрованій формі." -#: gram.y:1171 +#: gram.y:1209 #, c-format msgid "unrecognized role option \"%s\"" msgstr "нерозпізнаний параметр ролі \"%s\"" -#: gram.y:1418 gram.y:1433 +#: gram.y:1474 gram.y:1490 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не може включати елементи схеми" -#: gram.y:1579 +#: gram.y:1647 #, c-format msgid "current database cannot be changed" msgstr "поточна база даних не може бути змінена" -#: gram.y:1703 +#: gram.y:1780 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "інтервал, який задає часовий пояс, повинен бути HOUR або HOUR TO MINUTE" -#: gram.y:2271 +#: gram.y:2397 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер стовпця повинен бути в діапазоні від 1 до %d" -#: gram.y:2812 +#: gram.y:2999 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр послідовності \"%s\" тут не підтримується" -#: gram.y:2841 +#: gram.y:3028 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль для геш-секції вказано неодноразово" -#: gram.y:2850 +#: gram.y:3037 #, c-format msgid "remainder for hash partition provided more than once" msgstr "решта для геш-секції вказана неодноразово" -#: gram.y:2857 +#: gram.y:3044 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нерозпізнана специфікація границі геш-секції \"%s\"" -#: gram.y:2865 +#: gram.y:3052 #, c-format msgid "modulus for hash partition must be specified" msgstr "потрібно вказати модуль для геш-секції" -#: gram.y:2869 +#: gram.y:3056 #, c-format msgid "remainder for hash partition must be specified" msgstr "потрібно вказати решту для геш-секції" -#: gram.y:3070 gram.y:3103 +#: gram.y:3264 gram.y:3298 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT не допускається з PROGRAM" -#: gram.y:3076 +#: gram.y:3270 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "Речення WHERE не дозволяється використовувати з COPY TO" -#: gram.y:3408 gram.y:3415 gram.y:11666 gram.y:11674 +#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL при створенні тимчасових таблиць застаріло" -#: gram.y:3666 +#: gram.y:3881 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "для згенерованого стовпця, потрібно вказати GENERATED ALWAYS" -#: gram.y:4635 +#: gram.y:4264 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "список стовпців з %s підтримується лише для дій ON DELETE" + +#: gram.y:4974 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM більше не підтримується" -#: gram.y:5298 +#: gram.y:5672 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нерозпізнаний параметр безпеки рядка \"%s\"" -#: gram.y:5299 +#: gram.y:5673 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Наразі підтримуються лише політики PERMISSIVE або RESTRICTIVE." -#: gram.y:5381 +#: gram.y:5758 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не підтримується" -#: gram.y:5418 +#: gram.y:5795 msgid "duplicate trigger events specified" msgstr "вказані події тригера повторюються" -#: gram.y:5566 +#: gram.y:5944 #, c-format msgid "conflicting constraint properties" msgstr "конфліктуючі властивості обмеження" -#: gram.y:5662 +#: gram.y:6043 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ще не реалізований" -#: gram.y:6045 +#: gram.y:6451 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK більше не потребується" -#: gram.y:6046 +#: gram.y:6452 #, c-format msgid "Update your data type." msgstr "Поновіть ваш тип даних." -#: gram.y:7742 +#: gram.y:8308 #, c-format msgid "aggregates cannot have output arguments" msgstr "агрегатні функції не можуть мати вихідних аргументів" -#: gram.y:10129 gram.y:10147 +#: gram.y:10993 gram.y:11012 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION не підтримується для рекурсивних подань" -#: gram.y:11803 +#: gram.y:12898 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "Синтаксис LIMIT #,# не підтримується" -#: gram.y:11804 +#: gram.y:12899 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Використайте окремі речення LIMIT і OFFSET." -#: gram.y:12142 gram.y:12167 +#: gram.y:13252 gram.y:13278 #, c-format msgid "VALUES in FROM must have an alias" msgstr "VALUES в FROM повинен мати псевдонім" -#: gram.y:12143 gram.y:12168 +#: gram.y:13253 gram.y:13279 #, c-format msgid "For example, FROM (VALUES ...) [AS] foo." msgstr "Наприклад, FROM (VALUES ...) [AS] foo." -#: gram.y:12148 gram.y:12173 +#: gram.y:13258 gram.y:13284 #, c-format msgid "subquery in FROM must have an alias" msgstr "підзапит в FROM повинен мати псевдонім" -#: gram.y:12149 gram.y:12174 +#: gram.y:13259 gram.y:13285 #, c-format msgid "For example, FROM (SELECT ...) [AS] foo." msgstr "Наприклад, FROM (SELECT ...) [AS] foo." -#: gram.y:12669 +#: gram.y:13803 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допускається лише одне значення DEFAULT" -#: gram.y:12678 +#: gram.y:13812 #, c-format msgid "only one PATH value per column is allowed" msgstr "для стовпця допускається лише одне значення PATH" -#: gram.y:12687 +#: gram.y:13821 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "конфліктуючі або надлишкові оголошення NULL / NOT NULL для стовпця \"%s\"" -#: gram.y:12696 +#: gram.y:13830 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нерозпізнаний параметр стовпця \"%s\"" -#: gram.y:12950 +#: gram.y:14084 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "точність для типу float повинна бути мінімум 1 біт" -#: gram.y:12959 +#: gram.y:14093 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "точність для типу float повинна бути меньше 54 біт" -#: gram.y:13457 +#: gram.y:14596 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неправильна кількість параметрів у лівій частині виразу OVERLAPS" -#: gram.y:13462 +#: gram.y:14601 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неправильна кількість параметрів у правій частині виразу OVERLAPS" -#: gram.y:13630 +#: gram.y:14778 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "Предикат UNIQUE ще не реалізований" -#: gram.y:13989 +#: gram.y:15156 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "використовувати речення ORDER BY з WITHIN GROUP неодноразово, не можна" -#: gram.y:13994 +#: gram.y:15161 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "використовувати DISTINCT з WITHIN GROUP не можна" -#: gram.y:13999 +#: gram.y:15166 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "використовувати VARIADIC з WITHIN GROUP не можна" -#: gram.y:14523 gram.y:14546 +#: gram.y:15703 gram.y:15727 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "початком рамки не може бути UNBOUNDED FOLLOWING" -#: gram.y:14528 +#: gram.y:15708 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "рамка, яка починається з наступного рядка не можна закінчуватись поточним рядком" -#: gram.y:14551 +#: gram.y:15732 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "кінцем рамки не може бути UNBOUNDED PRECEDING" -#: gram.y:14557 +#: gram.y:15738 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "рамка, яка починається з поточного рядка не може мати попередніх рядків" -#: gram.y:14564 +#: gram.y:15745 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "рамка, яка починається з наступного рядка не може мати попередніх рядків" -#: gram.y:15196 +#: gram.y:16370 #, c-format msgid "type modifier cannot have parameter name" msgstr "тип modifier не може мати ім'я параметра" -#: gram.y:15202 +#: gram.y:16376 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "тип modifier не може мати ORDER BY" -#: gram.y:15267 gram.y:15274 gram.y:15281 +#: gram.y:16444 gram.y:16451 gram.y:16458 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s не можна використовувати тут як ім'я ролі" -#: gram.y:15370 gram.y:16801 +#: gram.y:16548 gram.y:17983 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES не можна задати без оператора ORDER BY" -#: gram.y:16478 gram.y:16667 +#: gram.y:17662 gram.y:17849 msgid "improper use of \"*\"" msgstr "неправильне використання \"*\"" -#: gram.y:16731 +#: gram.y:17913 #, 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:16768 +#: gram.y:17950 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "кілька речень ORDER BY не допускається" -#: gram.y:16779 +#: gram.y:17961 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "кілька речень OFFSET не допускається" -#: gram.y:16788 +#: gram.y:17970 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "кілька речень LIMIT не допускається" -#: gram.y:16797 +#: gram.y:17979 #, c-format msgid "multiple limit options not allowed" msgstr "використання декількох параметрів обмеження не дозволяється" -#: gram.y:16824 +#: gram.y:18006 #, c-format msgid "multiple WITH clauses not allowed" msgstr "кілька речень WITH не допускається" -#: gram.y:17018 +#: gram.y:18199 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "В табличних функціях аргументи OUT і INOUT не дозволяються" -#: gram.y:17114 +#: gram.y:18332 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "кілька речень COLLATE не допускається" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17152 gram.y:17165 +#: gram.y:18370 gram.y:18383 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "обмеження %s не можуть бути позначені DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17178 +#: gram.y:18396 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "обмеження %s не можуть бути позначені NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:17191 +#: gram.y:18409 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "обмеження %s не можуть бути позначені NO INHERIT" +#: gram.y:18433 +#, c-format +msgid "invalid publication object list" +msgstr "неприпустимий список об'єктів публікації" + +#: gram.y:18434 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "Одну з TABLE або TABLES IN SCHEMA необхідно вказати перед назвою автономної таблиці або схеми." + +#: gram.y:18450 +#, c-format +msgid "invalid table name" +msgstr "неприпустиме ім'я таблиці" + +#: gram.y:18471 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "Речення WHERE не допускається для схеми" + +#: gram.y:18478 +#, c-format +msgid "column specification not allowed for schema" +msgstr "специфікація стовпця не дозволена для схеми" + +#: gram.y:18492 +#, c-format +msgid "invalid schema name" +msgstr "неприпустиме ім'я схеми" + #: guc-file.l:314 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" @@ -28253,201 +29080,209 @@ msgstr "нерозпізнаний параметр конфігурації \"% msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "параметр \"%s\" видалений з файла конфігурації, значення скинуто до \"за замовчуванням\"" -#: guc-file.l:455 +#: guc-file.l:454 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "параметр \"%s\" змінено на \"%s\"" -#: guc-file.l:497 +#: guc-file.l:496 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "файл конфігурації \"%s\" містить помилки" -#: guc-file.l:502 +#: guc-file.l:501 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "файл конфігурації \"%s\" містить помилки; були застосовані не залежні зміни" -#: guc-file.l:507 +#: guc-file.l:506 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "файл конфігурації \"%s\" містить помилки; зміни не були застосовані" -#: guc-file.l:579 +#: guc-file.l:578 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "пуста назва файлу конфігурації: \"%s\"" -#: guc-file.l:596 +#: guc-file.l:595 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "не вдалося відкрити файл конфігурації \"%s\": максимальну глибину вкладення перевищено" -#: guc-file.l:616 +#: guc-file.l:615 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "рекурсія файлу конфігурації в \"%s\"" -#: guc-file.l:643 +#: guc-file.l:642 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "відсутній файл конфігурації \"%s\" пропускається" -#: guc-file.l:897 +#: guc-file.l:896 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "синтаксична помилка у файлі \"%s\" поблизу кінця рядка %u" -#: guc-file.l:907 +#: guc-file.l:906 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "синтаксична помилка у файлі \"%s\" рядок %u, поблизу маркера \"%s\"" -#: guc-file.l:927 +#: guc-file.l:926 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "знайдено занадто багато синтаксичних помилок, переривання файла \"%s\"" -#: guc-file.l:982 +#: guc-file.l:981 #, c-format msgid "empty configuration directory name: \"%s\"" msgstr "пуста назва каталогу конфігурації: \"%s\"" -#: guc-file.l:1001 +#: guc-file.l:1000 #, c-format msgid "could not open configuration directory \"%s\": %m" msgstr "не вдалося відкрити каталог конфігурації \"%s\": %m" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:530 #, c-format -msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" -msgstr "нерозпізнаний символ позначки \"%.*s\" в предикаті LIKE_REGEX" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "Нерозпізнаний символ позначки \"%.*s\" в предикаті LIKE_REGEX." -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:584 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQuery \"x\" позначка (розширені регулярні вирази) не реалізовано" #. 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 в кінці введення jsonpath" #. 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 в або біля \"%s\" введення jsonpath" -#: repl_gram.y:345 repl_gram.y:377 +#: repl_gram.y:303 repl_gram.y:335 #, c-format msgid "invalid timeline %u" msgstr "неприпустима часова шкала %u" -#: repl_scanner.l:150 +#: repl_scanner.l:142 msgid "invalid streaming start location" msgstr "неприпустиме розташування початку потокового передавання" -#: repl_scanner.l:206 scan.l:717 +#: repl_scanner.l:199 scan.l:724 msgid "unterminated quoted string" msgstr "незавершений рядок в лапках" -#: scan.l:458 +#: 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 "незавершений шістнадцятковий рядок" -#: 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:1171 +#: scan.l:1183 #, c-format msgid "%s at end of input" msgstr "%s в кінці введення" #. 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 в або поблизу \"%s\"" -#: scan.l:1373 +#: scan.l:1382 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "нестандартне використання \\' в рядку" -#: scan.l:1374 +#: scan.l:1383 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Щоб записати лапки у рядку використовуйте \" або синтаксис спеціальних рядків (E'...')." -#: scan.l:1383 +#: scan.l:1392 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "нестандартне використання \\\\ в рядку" -#: scan.l:1384 +#: scan.l:1393 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Для запису зворотніх скісних рисок \"\\\" використовуйте синтаксис спеціальних рядків, наприклад E'\\\\'." -#: scan.l:1398 +#: scan.l:1407 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "нестандартне використання спеціального символу в рядку" -#: scan.l:1399 +#: scan.l:1408 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Для запису спеціальних символів використовуйте синтаксис спеціальних рядків E'\\r\\n'." diff --git a/third_party/spanner_pg/src/backend/po/zh_CN.po b/third_party/spanner_pg/src/backend/po/zh_CN.po index ea09bf23..5ff434a8 100644 --- a/third_party/spanner_pg/src/backend/po/zh_CN.po +++ b/third_party/spanner_pg/src/backend/po/zh_CN.po @@ -24615,7 +24615,7 @@ msgid "Forces synchronization of updates to disk." msgstr "强制和磁盘同步更新" #: utils/misc/guc.c:1127 -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." +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "服务器将在多个位置使用系统调用fsync()来确定更新操作已经将数据写入磁盘.这将确保在操作系统或硬件崩溃后数据库集群将恢复到一个一致性状态. " #: utils/misc/guc.c:1138 diff --git a/third_party/spanner_pg/src/backend/port/atomics.c b/third_party/spanner_pg/src/backend/port/atomics.c index f9f8b098..ba274bed 100644 --- a/third_party/spanner_pg/src/backend/port/atomics.c +++ b/third_party/spanner_pg/src/backend/port/atomics.c @@ -3,7 +3,7 @@ * atomics.c * Non-Inline parts of the atomics implementation * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/port/posix_sema.c b/third_party/spanner_pg/src/backend/port/posix_sema.c index 114da3b3..a97a3ed9 100644 --- a/third_party/spanner_pg/src/backend/port/posix_sema.c +++ b/third_party/spanner_pg/src/backend/port/posix_sema.c @@ -15,7 +15,7 @@ * forked backends, but they could not be accessed by exec'd backends. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/port/sysv_sema.c b/third_party/spanner_pg/src/backend/port/sysv_sema.c index 21c883ba..ea3ad6da 100644 --- a/third_party/spanner_pg/src/backend/port/sysv_sema.c +++ b/third_party/spanner_pg/src/backend/port/sysv_sema.c @@ -4,7 +4,7 @@ * Implement PGSemaphores using SysV semaphore facilities * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/port/sysv_shmem.c b/third_party/spanner_pg/src/backend/port/sysv_shmem.c index 35cce89e..ea287c73 100644 --- a/third_party/spanner_pg/src/backend/port/sysv_shmem.c +++ b/third_party/spanner_pg/src/backend/port/sysv_shmem.c @@ -9,7 +9,7 @@ * exist, though, because mmap'd shmem provides no way to find out how * many processes are attached, which we need for interlocking purposes. * - * 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 * * IDENTIFICATION @@ -289,7 +289,7 @@ static void IpcMemoryDetach(int status, Datum shmaddr) { /* Detach System V shared memory block. */ - if (shmdt(DatumGetPointer(shmaddr)) < 0) + if (shmdt((void *) DatumGetPointer(shmaddr)) < 0) elog(LOG, "shmdt(%p) failed: %m", DatumGetPointer(shmaddr)); } @@ -323,7 +323,7 @@ PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2) IpcMemoryState state; state = PGSharedMemoryAttach((IpcMemoryId) id2, NULL, &memAddress); - if (memAddress && shmdt(memAddress) < 0) + if (memAddress && shmdt((void *) memAddress) < 0) elog(LOG, "shmdt(%p) failed: %m", memAddress); switch (state) { @@ -456,8 +456,6 @@ PGSharedMemoryAttach(IpcMemoryId shmId, return shmStat.shm_nattch == 0 ? SHMSTATE_UNATTACHED : SHMSTATE_ATTACHED; } -#ifdef MAP_HUGETLB - /* * Identify the huge page size to use, and compute the related mmap flags. * @@ -475,13 +473,19 @@ PGSharedMemoryAttach(IpcMemoryId shmId, * hugepage sizes, we might want to think about more invasive strategies, * such as increasing shared_buffers to absorb the extra space. * - * Returns the (real, assumed or config provided) page size into *hugepagesize, - * and the hugepage-related mmap flags to use into *mmap_flags. + * Returns the (real, assumed or config provided) page size into + * *hugepagesize, and the hugepage-related mmap flags to use into + * *mmap_flags if requested by the caller. If huge pages are not supported, + * *hugepagesize and *mmap_flags are set to 0. */ -static void +void GetHugePageSize(Size *hugepagesize, int *mmap_flags) { +#ifdef MAP_HUGETLB + Size default_hugepagesize = 0; + Size hugepagesize_local = 0; + int mmap_flags_local = 0; /* * System-dependent code to find out the default huge page size. @@ -519,12 +523,12 @@ GetHugePageSize(Size *hugepagesize, int *mmap_flags) if (huge_page_size != 0) { /* If huge page size is requested explicitly, use that. */ - *hugepagesize = (Size) huge_page_size * 1024; + hugepagesize_local = (Size) huge_page_size * 1024; } else if (default_hugepagesize != 0) { /* Otherwise use the system default, if we have it. */ - *hugepagesize = default_hugepagesize; + hugepagesize_local = default_hugepagesize; } else { @@ -536,26 +540,39 @@ GetHugePageSize(Size *hugepagesize, int *mmap_flags) * writing, there are no reports of any non-Linux systems being picky * about that. */ - *hugepagesize = 2 * 1024 * 1024; + hugepagesize_local = 2 * 1024 * 1024; } - *mmap_flags = MAP_HUGETLB; + mmap_flags_local = MAP_HUGETLB; /* * On recent enough Linux, also include the explicit page size, if * necessary. */ #if defined(MAP_HUGE_MASK) && defined(MAP_HUGE_SHIFT) - if (*hugepagesize != default_hugepagesize) + if (hugepagesize_local != default_hugepagesize) { - int shift = pg_ceil_log2_64(*hugepagesize); + int shift = pg_ceil_log2_64(hugepagesize_local); - *mmap_flags |= (shift & MAP_HUGE_MASK) << MAP_HUGE_SHIFT; + mmap_flags_local |= (shift & MAP_HUGE_MASK) << MAP_HUGE_SHIFT; } #endif -} + + /* assign the results found */ + if (mmap_flags) + *mmap_flags = mmap_flags_local; + if (hugepagesize) + *hugepagesize = hugepagesize_local; + +#else + + if (hugepagesize) + *hugepagesize = 0; + if (mmap_flags) + *mmap_flags = 0; #endif /* MAP_HUGETLB */ +} /* * Creates an anonymous mmap()ed shared memory segment. @@ -790,7 +807,7 @@ PGSharedMemoryCreate(Size size, break; } - if (oldhdr && shmdt(oldhdr) < 0) + if (oldhdr && shmdt((void *) oldhdr) < 0) elog(LOG, "shmdt(%p) failed: %m", oldhdr); } diff --git a/third_party/spanner_pg/src/backend/port/tas/sunstudio_sparc.s b/third_party/spanner_pg/src/backend/port/tas/sunstudio_sparc.s index b13ca793..da9ed35a 100644 --- a/third_party/spanner_pg/src/backend/port/tas/sunstudio_sparc.s +++ b/third_party/spanner_pg/src/backend/port/tas/sunstudio_sparc.s @@ -3,7 +3,7 @@ ! sunstudio_sparc.s ! compare and swap for Sun Studio on Sparc ! -! 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 ! ! IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/port/tas/sunstudio_x86.s b/third_party/spanner_pg/src/backend/port/tas/sunstudio_x86.s index 21d6c636..808b2071 100644 --- a/third_party/spanner_pg/src/backend/port/tas/sunstudio_x86.s +++ b/third_party/spanner_pg/src/backend/port/tas/sunstudio_x86.s @@ -3,7 +3,7 @@ / sunstudio_x86.s / compare and swap for Sun Studio on x86 / -/ 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 / / IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/port/win32/crashdump.c b/third_party/spanner_pg/src/backend/port/win32/crashdump.c index 45b6696b..cea7be28 100644 --- a/third_party/spanner_pg/src/backend/port/win32/crashdump.c +++ b/third_party/spanner_pg/src/backend/port/win32/crashdump.c @@ -28,7 +28,7 @@ * be added, though at the cost of a greater chance of the crash dump failing. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/crashdump.c @@ -38,8 +38,6 @@ #include "postgres.h" -#define WIN32_LEAN_AND_MEAN - /* * Some versions of the MS SDK contain "typedef enum { ... } ;" which the MS * compiler quite sanely complains about. Well done, Microsoft. diff --git a/third_party/spanner_pg/src/backend/port/win32/signal.c b/third_party/spanner_pg/src/backend/port/win32/signal.c index 580a517f..b71164d8 100644 --- a/third_party/spanner_pg/src/backend/port/win32/signal.c +++ b/third_party/spanner_pg/src/backend/port/win32/signal.c @@ -3,7 +3,7 @@ * signal.c * Microsoft Windows Win32 Signal Emulation Functions * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/signal.c @@ -52,7 +52,17 @@ static BOOL WINAPI pg_console_handler(DWORD dwCtrlType); void pg_usleep(long microsec) { - Assert(pgwin32_signal_event != NULL); + if (unlikely(pgwin32_signal_event == NULL)) + { + /* + * If we're reached by pgwin32_open_handle() early in startup before + * the signal event is set up, just fall back to a regular + * non-interruptible sleep. + */ + SleepEx((microsec < 500 ? 1 : (microsec + 500) / 1000), FALSE); + return; + } + if (WaitForSingleObject(pgwin32_signal_event, (microsec < 500 ? 1 : (microsec + 500) / 1000)) == WAIT_OBJECT_0) diff --git a/third_party/spanner_pg/src/backend/port/win32/socket.c b/third_party/spanner_pg/src/backend/port/win32/socket.c index af151e84..33580011 100644 --- a/third_party/spanner_pg/src/backend/port/win32/socket.c +++ b/third_party/spanner_pg/src/backend/port/win32/socket.c @@ -3,7 +3,7 @@ * socket.c * Microsoft Windows Win32 Socket Functions * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/socket.c @@ -47,8 +47,8 @@ int pgwin32_noblock = 0; * * Note: where there is a direct correspondence between a WSAxxx error code * and a Berkeley error symbol, this mapping is actually a no-op, because - * in win32.h we redefine the network-related Berkeley error symbols to have - * the values of their WSAxxx counterparts. The point of the switch is + * in win32_port.h we redefine the network-related Berkeley error symbols to + * have the values of their WSAxxx counterparts. The point of the switch is * mostly to translate near-miss error codes into something that's sensible * in the Berkeley universe. */ @@ -141,10 +141,15 @@ TranslateSocketError(void) case WSAEDISCON: errno = ENOTCONN; break; + case WSAETIMEDOUT: + errno = ETIMEDOUT; + break; default: ereport(NOTICE, - (errmsg_internal("unrecognized win32 socket error code: %d", WSAGetLastError()))); + (errmsg_internal("unrecognized win32 socket error code: %d", + WSAGetLastError()))); errno = EINVAL; + break; } } @@ -298,6 +303,7 @@ pgwin32_socket(int af, int type, int protocol) if (ioctlsocket(s, FIONBIO, &on)) { TranslateSocketError(); + closesocket(s); return INVALID_SOCKET; } errno = 0; diff --git a/third_party/spanner_pg/src/backend/port/win32/timer.c b/third_party/spanner_pg/src/backend/port/win32/timer.c index 53fdae94..3405253a 100644 --- a/third_party/spanner_pg/src/backend/port/win32/timer.c +++ b/third_party/spanner_pg/src/backend/port/win32/timer.c @@ -8,7 +8,7 @@ * - Does not support interval timer (value->it_interval) * - Only supports ITIMER_REAL * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/timer.c diff --git a/third_party/spanner_pg/src/backend/port/win32_sema.c b/third_party/spanner_pg/src/backend/port/win32_sema.c index 858b88ad..8e9c0f93 100644 --- a/third_party/spanner_pg/src/backend/port/win32_sema.c +++ b/third_party/spanner_pg/src/backend/port/win32_sema.c @@ -3,7 +3,7 @@ * win32_sema.c * Microsoft Windows Win32 Semaphores Emulation * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32_sema.c diff --git a/third_party/spanner_pg/src/backend/port/win32_shmem.c b/third_party/spanner_pg/src/backend/port/win32_shmem.c index d7a71992..6cf69411 100644 --- a/third_party/spanner_pg/src/backend/port/win32_shmem.c +++ b/third_party/spanner_pg/src/backend/port/win32_shmem.c @@ -3,7 +3,7 @@ * win32_shmem.c * Implement shared memory using win32 facilities * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32_shmem.c @@ -605,3 +605,17 @@ pgwin32_ReserveSharedMemoryRegion(HANDLE hChild) return true; } + +/* + * This function is provided for consistency with sysv_shmem.c and does not + * provide any useful information for Windows. To obtain the large page size, + * use GetLargePageMinimum() instead. + */ +void +GetHugePageSize(Size *hugepagesize, int *mmap_flags) +{ + if (hugepagesize) + *hugepagesize = 0; + if (mmap_flags) + *mmap_flags = 0; +} diff --git a/third_party/spanner_pg/src/backend/postmaster/BUILD b/third_party/spanner_pg/src/backend/postmaster/BUILD index 72f29914..b568a9cd 100644 --- a/third_party/spanner_pg/src/backend/postmaster/BUILD +++ b/third_party/spanner_pg/src/backend/postmaster/BUILD @@ -50,14 +50,15 @@ cc_library( name = "postmaster", srcs = [ "autovacuum.c", + "auxprocess.c", "bgworker.c", "bgwriter.c", "checkpointer.c", "fork_process.c", "interrupt.c", "pgarch.c", - "pgstat.c", "postmaster.c", + "shell_archive.c", "startup.c", "syslogger.c", "walwriter.c", diff --git a/third_party/spanner_pg/src/backend/postmaster/Makefile b/third_party/spanner_pg/src/backend/postmaster/Makefile index bfdf6a83..3a794e54 100644 --- a/third_party/spanner_pg/src/backend/postmaster/Makefile +++ b/third_party/spanner_pg/src/backend/postmaster/Makefile @@ -14,14 +14,15 @@ include $(top_builddir)/src/Makefile.global OBJS = \ autovacuum.o \ + auxprocess.o \ bgworker.o \ bgwriter.o \ checkpointer.o \ fork_process.o \ interrupt.o \ pgarch.o \ - pgstat.o \ postmaster.o \ + shell_archive.o \ startup.o \ syslogger.o \ walwriter.o diff --git a/third_party/spanner_pg/src/backend/postmaster/autovacuum.c b/third_party/spanner_pg/src/backend/postmaster/autovacuum.c index 08158f73..0c532f7e 100644 --- a/third_party/spanner_pg/src/backend/postmaster/autovacuum.c +++ b/third_party/spanner_pg/src/backend/postmaster/autovacuum.c @@ -44,13 +44,14 @@ * 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-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -129,10 +130,7 @@ int autovacuum_multixact_freeze_max_age; double autovacuum_vac_cost_delay; int autovacuum_vac_cost_limit; -int Log_autovacuum_min_duration = -1; - -/* how long to keep pgstat data in the launcher, in milliseconds */ -#define STATS_READ_DELAY 1000 +int Log_autovacuum_min_duration = 600000; /* the minimum allowed time between two awakenings of the launcher */ #define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */ @@ -344,15 +342,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); @@ -470,9 +464,6 @@ AutoVacLauncherMain(int argc, char *argv[]) pqsignal(SIGFPE, FloatExceptionHandler); pqsignal(SIGCHLD, SIG_DFL); - /* Early initialization */ - BaseInit(); - /* * Create a per-backend PGPROC struct in shared memory, except in the * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do @@ -483,7 +474,10 @@ AutoVacLauncherMain(int argc, char *argv[]) InitProcess(); #endif - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, NULL, false); + /* Early initialization */ + BaseInit(); + + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); SetProcessingMode(NormalProcessing); @@ -557,12 +551,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(); @@ -613,6 +601,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. @@ -756,7 +750,8 @@ AutoVacLauncherMain(int argc, char *argv[]) dlist_push_head(&AutoVacuumShmem->av_freeWorkers, &worker->wi_links); AutoVacuumShmem->av_startingWorker = NULL; - elog(WARNING, "worker took too long to start; canceled"); + ereport(WARNING, + errmsg("autovacuum worker took too long to start; canceled")); } } else @@ -964,14 +959,11 @@ rebuild_database_list(Oid newdb) HTAB *dbhash; dlist_iter iter; - /* use fresh stats */ - autovac_refresh_stats(); - newcxt = AllocSetContextCreate(AutovacMemCxt, - "AV dblist", + "Autovacuum database list", ALLOCSET_DEFAULT_SIZES); tmpcxt = AllocSetContextCreate(newcxt, - "tmp AV dblist", + "Autovacuum database list (tmp)", ALLOCSET_DEFAULT_SIZES); oldcxt = MemoryContextSwitchTo(tmpcxt); @@ -994,7 +986,8 @@ rebuild_database_list(Oid newdb) hctl.keysize = sizeof(Oid); hctl.entrysize = sizeof(avl_dbase); hctl.hcxt = tmpcxt; - dbhash = hash_create("db hash", 20, &hctl, /* magic number here FIXME */ + dbhash = hash_create("autovacuum db hash", 20, &hctl, /* magic number here + * FIXME */ HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); /* start by inserting the new database */ @@ -1181,13 +1174,10 @@ do_start_worker(void) * allocated for the database list. */ tmpcxt = AllocSetContextCreate(CurrentMemoryContext, - "Start worker tmp cxt", + "Autovacuum start worker (tmp)", ALLOCSET_DEFAULT_SIZES); oldcxt = MemoryContextSwitchTo(tmpcxt); - /* use fresh stats */ - autovac_refresh_stats(); - /* Get a list of databases */ dblist = get_database_list(); @@ -1552,9 +1542,6 @@ AutoVacWorkerMain(int argc, char *argv[]) pqsignal(SIGFPE, FloatExceptionHandler); pqsignal(SIGCHLD, SIG_DFL); - /* Early initialization */ - BaseInit(); - /* * Create a per-backend PGPROC struct in shared memory, except in the * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do @@ -1565,6 +1552,9 @@ AutoVacWorkerMain(int argc, char *argv[]) InitProcess(); #endif + /* Early initialization */ + BaseInit(); + /* * If an exception is encountered, processing resumes here. * @@ -1643,6 +1633,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. */ @@ -1690,22 +1686,23 @@ AutoVacWorkerMain(int argc, char *argv[]) char dbname[NAMEDATALEN]; /* - * Report autovac startup to the stats collector. 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 - * database, rather than making any progress on stuff it can connect - * to. + * 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 database, rather than making any progress + * on stuff it can connect to. */ pgstat_report_autovac(dbid); /* - * Connect to the selected database + * Connect to the selected database, specifying no particular user * * Note: if we have selected a just-deleted database (due to using * stale stats info), we'll fail and exit here. */ - InitPostgres(NULL, dbid, NULL, InvalidOid, dbname, false); + InitPostgres(NULL, dbid, NULL, InvalidOid, false, false, + dbname); SetProcessingMode(NormalProcessing); set_ps_display(dbname); ereport(DEBUG1, @@ -1982,8 +1979,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; @@ -1998,26 +1993,13 @@ do_autovacuum(void) * relations to vacuum/analyze across transactions. */ AutovacMemCxt = AllocSetContextCreate(TopMemoryContext, - "AV worker", + "Autovacuum worker", 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 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. - */ - 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 @@ -2055,9 +2037,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 */ @@ -2135,8 +2114,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, @@ -2219,8 +2198,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, @@ -2434,12 +2413,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, @@ -2784,29 +2759,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 @@ -2828,7 +2780,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)); @@ -2852,35 +2803,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); @@ -2978,21 +2900,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); @@ -3017,17 +2924,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, @@ -3057,7 +2957,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. * @@ -3067,8 +2967,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 @@ -3185,11 +3085,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()) { @@ -3488,35 +3388,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/third_party/spanner_pg/src/backend/postmaster/auxprocess.c b/third_party/spanner_pg/src/backend/postmaster/auxprocess.c new file mode 100644 index 00000000..39ac4490 --- /dev/null +++ b/third_party/spanner_pg/src/backend/postmaster/auxprocess.c @@ -0,0 +1,183 @@ +/*------------------------------------------------------------------------- + * auxprocess.c + * functions related to auxiliary processes. + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/postmaster/auxprocess.c + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include +#include + +#include "libpq/pqsignal.h" +#include "miscadmin.h" +#include "pgstat.h" +#include "postmaster/auxprocess.h" +#include "postmaster/bgwriter.h" +#include "postmaster/startup.h" +#include "postmaster/walwriter.h" +#include "replication/walreceiver.h" +#include "storage/bufmgr.h" +#include "storage/bufpage.h" +#include "storage/condition_variable.h" +#include "storage/ipc.h" +#include "storage/proc.h" +#include "tcop/tcopprot.h" +#include "utils/memutils.h" +#include "utils/ps_status.h" +#include "utils/rel.h" + + +static void ShutdownAuxiliaryProcess(int code, Datum arg); + + +/* ---------------- + * global variables + * ---------------- + */ + +AuxProcType MyAuxProcType = NotAnAuxProcess; /* declared in miscadmin.h */ + + +/* + * AuxiliaryProcessMain + * + * The main entry point for auxiliary processes, such as the bgwriter, + * walwriter, walreceiver, bootstrapper and the shared memory checker code. + * + * This code is here just because of historical reasons. + */ +void +AuxiliaryProcessMain(AuxProcType auxtype) +{ + Assert(IsUnderPostmaster); + + MyAuxProcType = auxtype; + + switch (MyAuxProcType) + { + case StartupProcess: + MyBackendType = B_STARTUP; + break; + case ArchiverProcess: + MyBackendType = B_ARCHIVER; + break; + case BgWriterProcess: + MyBackendType = B_BG_WRITER; + break; + case CheckpointerProcess: + MyBackendType = B_CHECKPOINTER; + break; + case WalWriterProcess: + MyBackendType = B_WAL_WRITER; + break; + case WalReceiverProcess: + MyBackendType = B_WAL_RECEIVER; + break; + default: + elog(ERROR, "something has gone wrong"); + MyBackendType = B_INVALID; + } + + init_ps_display(NULL); + + SetProcessingMode(BootstrapProcessing); + IgnoreSystemIndexes = true; + + /* + * As an auxiliary process, we aren't going to do the full InitPostgres + * pushups, but there are a couple of things that need to get lit up even + * in an auxiliary process. + */ + + /* + * Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case, this + * was already done by SubPostmasterMain(). + */ +#ifndef EXEC_BACKEND + InitAuxiliaryProcess(); +#endif + + BaseInit(); + + /* + * Assign the ProcSignalSlot for an auxiliary process. Since it doesn't + * have a BackendId, the slot is statically allocated based on the + * auxiliary process type (MyAuxProcType). Backends use slots indexed in + * the range from 1 to MaxBackends (inclusive), so we use MaxBackends + + * AuxProcType + 1 as the index of the slot for an auxiliary process. + * + * This will need rethinking if we ever want more than one of a particular + * auxiliary process type. + */ + ProcSignalInit(MaxBackends + MyAuxProcType + 1); + + /* + * Auxiliary processes don't run transactions, but they may need a + * resource owner anyway to manage buffer pins acquired outside + * transactions (and, perhaps, other things in future). + */ + CreateAuxProcessResourceOwner(); + + + /* Initialize backend status information */ + pgstat_beinit(); + pgstat_bestart(); + + /* register a before-shutdown callback for LWLock cleanup */ + before_shmem_exit(ShutdownAuxiliaryProcess, 0); + + SetProcessingMode(NormalProcessing); + + switch (MyAuxProcType) + { + case StartupProcess: + StartupProcessMain(); + proc_exit(1); + + case ArchiverProcess: + PgArchiverMain(); + proc_exit(1); + + case BgWriterProcess: + BackgroundWriterMain(); + proc_exit(1); + + case CheckpointerProcess: + CheckpointerMain(); + proc_exit(1); + + case WalWriterProcess: + WalWriterMain(); + proc_exit(1); + + case WalReceiverProcess: + WalReceiverMain(); + proc_exit(1); + + default: + elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType); + proc_exit(1); + } +} + +/* + * Begin shutdown of an auxiliary process. This is approximately the equivalent + * of ShutdownPostgres() in postinit.c. We can't run transactions in an + * auxiliary process, so most of the work of AbortTransaction() is not needed, + * but we do need to make sure we've released any LWLocks we are holding. + * (This is only critical during an error exit.) + */ +static void +ShutdownAuxiliaryProcess(int code, Datum arg) +{ + LWLockReleaseAll(); + ConditionVariableCancelSleep(); + pgstat_report_wait_end(); +} diff --git a/third_party/spanner_pg/src/backend/postmaster/bgworker.c b/third_party/spanner_pg/src/backend/postmaster/bgworker.c index c40410d7..8dd7d646 100644 --- a/third_party/spanner_pg/src/backend/postmaster/bgworker.c +++ b/third_party/spanner_pg/src/backend/postmaster/bgworker.c @@ -2,7 +2,7 @@ * bgworker.c * POSTGRES pluggable background workers implementation * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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. * @@ -652,17 +652,24 @@ static bool SanityCheckBackgroundWorker(BackgroundWorker *worker, int elevel) { /* sanity check for flags */ - if (worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION) + + /* + * We used to support workers not connected to shared memory, but don't + * anymore. Thus this is a required flag now. We're not removing the flag + * for compatibility reasons and because the flag still provides some + * signal when reading code. + */ + if (!(worker->bgw_flags & BGWORKER_SHMEM_ACCESS)) { - if (!(worker->bgw_flags & BGWORKER_SHMEM_ACCESS)) - { - ereport(elevel, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("background worker \"%s\": must attach to shared memory in order to request a database connection", - worker->bgw_name))); - return false; - } + ereport(elevel, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("background worker \"%s\": background workers without shared memory access are not supported", + worker->bgw_name))); + return false; + } + if (worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION) + { if (worker->bgw_start_time == BgWorkerStart_PostmasterStart) { ereport(elevel, @@ -745,20 +752,6 @@ StartBackgroundWorker(void) MyBackendType = B_BG_WORKER; init_ps_display(worker->bgw_name); - /* - * If we're not supposed to have shared memory access, then detach from - * shared memory. If we didn't request shared memory access, the - * postmaster won't force a cluster-wide restart if we exit unexpectedly, - * so we'd better make sure that we don't mess anything up that would - * require that sort of cleanup. - */ - if ((worker->bgw_flags & BGWORKER_SHMEM_ACCESS) == 0) - { - ShutdownLatchSupport(); - dsm_detach_all(); - PGSharedMemoryDetach(); - } - SetProcessingMode(InitProcessing); /* Apply PostAuthDelay */ @@ -832,29 +825,19 @@ StartBackgroundWorker(void) PG_exception_stack = &local_sigjmp_buf; /* - * If the background worker request shared memory access, set that up now; - * else, detach all shared memory segments. + * Create a per-backend PGPROC struct in shared memory, except in the + * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do + * this before we can use LWLocks (and in the EXEC_BACKEND case we already + * had to do some stuff with LWLocks). */ - if (worker->bgw_flags & BGWORKER_SHMEM_ACCESS) - { - /* - * Early initialization. Some of this could be useful even for - * background workers that aren't using shared memory, but they can - * call the individual startup routines for those subsystems if - * needed. - */ - BaseInit(); - - /* - * Create a per-backend PGPROC struct in shared memory, except in the - * EXEC_BACKEND case where this was done in SubPostmasterMain. We must - * do this before we can use LWLocks (and in the EXEC_BACKEND case we - * already had to do some stuff with LWLocks). - */ #ifndef EXEC_BACKEND - InitProcess(); + InitProcess(); #endif - } + + /* + * Early initialization. + */ + BaseInit(); /* * Look up the entry point function, loading its library if necessary. diff --git a/third_party/spanner_pg/src/backend/postmaster/bgwriter.c b/third_party/spanner_pg/src/backend/postmaster/bgwriter.c index bba79e0b..470dd267 100644 --- a/third_party/spanner_pg/src/backend/postmaster/bgwriter.c +++ b/third_party/spanner_pg/src/backend/postmaster/bgwriter.c @@ -12,9 +12,6 @@ * * As of Postgres 9.2 the bgwriter no longer handles checkpoints. * - * The bgwriter is started by the postmaster as soon as the startup subprocess - * finishes, or as soon as recovery begins if we are doing archive recovery. - * It remains alive until the postmaster commands it to terminate. * Normal termination is by SIGTERM, which instructs the bgwriter to exit(0). * Emergency termination is by SIGQUIT; like any backend, the bgwriter will * simply abort and exit on SIGQUIT. @@ -24,7 +21,7 @@ * should be killed by SIGQUIT and then a recovery cycle started. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -243,11 +240,9 @@ BackgroundWriterMain(void) */ can_hibernate = BgBufferSync(&wb_context); - /* - * Send off activity statistics to the stats collector - */ - pgstat_send_bgwriter(); - pgstat_send_wal(true); + /* Report pending statistics to the cumulative stats system */ + pgstat_report_bgwriter(); + pgstat_report_wal(true); if (FirstCallSinceLastCheckpoint()) { diff --git a/third_party/spanner_pg/src/backend/postmaster/checkpointer.c b/third_party/spanner_pg/src/backend/postmaster/checkpointer.c index 86996750..c937c39f 100644 --- a/third_party/spanner_pg/src/backend/postmaster/checkpointer.c +++ b/third_party/spanner_pg/src/backend/postmaster/checkpointer.c @@ -10,9 +10,6 @@ * fill WAL segments; the checkpointer itself doesn't watch for the * condition.) * - * The checkpointer is started by the postmaster as soon as the startup - * subprocess finishes, or as soon as recovery begins if we are doing archive - * recovery. It remains alive until the postmaster commands it to terminate. * Normal termination is by SIGUSR2, which instructs the checkpointer to * execute a shutdown checkpoint and then exit(0). (All backends must be * stopped before SIGUSR2 is issued!) Emergency termination is by SIGQUIT; @@ -26,7 +23,7 @@ * restart needs to be forced.) * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -41,6 +38,7 @@ #include "access/xlog.h" #include "access/xlog_internal.h" +#include "access/xlogrecovery.h" #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" @@ -214,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 @@ -360,7 +368,7 @@ CheckpointerMain(void) if (((volatile CheckpointerShmemStruct *) CheckpointerShmem)->ckpt_flags) { do_checkpoint = true; - BgWriterStats.m_requested_checkpoints++; + PendingCheckpointerStats.requested_checkpoints++; } /* @@ -374,7 +382,7 @@ CheckpointerMain(void) if (elapsed_secs >= CheckPointTimeout) { if (!do_checkpoint) - BgWriterStats.m_timed_checkpoints++; + PendingCheckpointerStats.timed_checkpoints++; do_checkpoint = true; flags |= CHECKPOINT_CAUSE_TIME; } @@ -387,11 +395,7 @@ CheckpointerMain(void) bool ckpt_performed = false; bool do_restartpoint; - /* - * Check if we should perform a checkpoint or a restartpoint. As a - * side-effect, RecoveryInProgress() initializes TimeLineID if - * it's not set yet. - */ + /* Check if we should perform a checkpoint or a restartpoint. */ do_restartpoint = RecoveryInProgress(); /* @@ -498,17 +502,9 @@ CheckpointerMain(void) /* Check for archive_timeout and switch xlog files if necessary. */ CheckArchiveTimeout(); - /* - * Send off activity statistics to the stats collector. (The reason - * why we re-use bgwriter-related code for this is that the bgwriter - * and checkpointer used to be just one process. It's probably not - * worth the trouble to split the stats support into two independent - * stats message types.) - */ - pgstat_send_bgwriter(); - - /* Send WAL statistics to the stats collector. */ - pgstat_send_wal(true); + /* Report pending statistics to the cumulative stats system */ + pgstat_report_checkpointer(); + pgstat_report_wal(true); /* * If any checkpoint flags have been set, redo the loop to handle the @@ -580,17 +576,21 @@ 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. */ - BgWriterStats.m_requested_checkpoints++; + PendingCheckpointerStats.requested_checkpoints++; ShutdownXLOG(0, 0); - pgstat_send_bgwriter(); - pgstat_send_wal(true); + pgstat_report_checkpointer(); + pgstat_report_wal(true); /* Normal exit from the checkpointer is here */ proc_exit(0); /* done */ } + + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); } /* @@ -724,10 +724,8 @@ CheckpointWriteDelay(int flags, double progress) CheckArchiveTimeout(); - /* - * Report interim activity statistics to the stats collector. - */ - pgstat_send_bgwriter(); + /* Report interim statistics to the cumulative stats system */ + pgstat_report_checkpointer(); /* * This sleep used to be connected to bgwriter_delay, typically 200ms. @@ -1274,8 +1272,10 @@ AbsorbSyncRequests(void) LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE); /* Transfer stats counts into pending pgstats message */ - BgWriterStats.m_buf_written_backend += CheckpointerShmem->num_backend_writes; - BgWriterStats.m_buf_fsync_backend += CheckpointerShmem->num_backend_fsync; + PendingCheckpointerStats.buf_written_backend + += CheckpointerShmem->num_backend_writes; + PendingCheckpointerStats.buf_fsync_backend + += CheckpointerShmem->num_backend_fsync; CheckpointerShmem->num_backend_writes = 0; CheckpointerShmem->num_backend_fsync = 0; diff --git a/third_party/spanner_pg/src/backend/postmaster/fork_process.c b/third_party/spanner_pg/src/backend/postmaster/fork_process.c index 62d068bc..c75be03d 100644 --- a/third_party/spanner_pg/src/backend/postmaster/fork_process.c +++ b/third_party/spanner_pg/src/backend/postmaster/fork_process.c @@ -4,7 +4,7 @@ * EXEC_BACKEND case; it might be extended to do so, but it would be * considerably more complex. * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/postmaster/fork_process.c diff --git a/third_party/spanner_pg/src/backend/postmaster/interrupt.c b/third_party/spanner_pg/src/backend/postmaster/interrupt.c index dd9136a9..1aed2e2e 100644 --- a/third_party/spanner_pg/src/backend/postmaster/interrupt.c +++ b/third_party/spanner_pg/src/backend/postmaster/interrupt.c @@ -3,7 +3,7 @@ * interrupt.c * Interrupt handling routines. * - * 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 * * IDENTIFICATION @@ -22,6 +22,7 @@ #include "storage/latch.h" #include "storage/procsignal.h" #include "utils/guc.h" +#include "utils/memutils.h" volatile sig_atomic_t ConfigReloadPending = false; volatile sig_atomic_t ShutdownRequestPending = false; @@ -43,6 +44,10 @@ HandleMainLoopInterrupts(void) if (ShutdownRequestPending) proc_exit(0); + + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); } /* @@ -93,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/third_party/spanner_pg/src/backend/postmaster/pgarch.c b/third_party/spanner_pg/src/backend/postmaster/pgarch.c index 74a7d7c4..327df4e9 100644 --- a/third_party/spanner_pg/src/backend/postmaster/pgarch.c +++ b/third_party/spanner_pg/src/backend/postmaster/pgarch.c @@ -14,7 +14,7 @@ * * Initial author: Simon Riggs simon@2ndquadrant.com * - * 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 * * @@ -25,18 +25,14 @@ */ #include "postgres.h" -#include -#include #include #include -#include -#include #include #include "access/xlog.h" #include "access/xlog_internal.h" +#include "lib/binaryheap.h" #include "libpq/pqsignal.h" -#include "miscadmin.h" #include "pgstat.h" #include "postmaster/interrupt.h" #include "postmaster/pgarch.h" @@ -47,7 +43,9 @@ #include "storage/proc.h" #include "storage/procsignal.h" #include "storage/shmem.h" +#include "storage/spin.h" #include "utils/guc.h" +#include "utils/memutils.h" #include "utils/ps_status.h" @@ -72,12 +70,26 @@ */ #define NUM_ORPHAN_CLEANUP_RETRIES 3 +/* + * Maximum number of .ready files to gather per directory scan. + */ +#define NUM_FILES_PER_DIRECTORY_SCAN 64 + /* Shared memory area for archiver process */ typedef struct PgArchData { int pgprocno; /* pgprocno of archiver process */ + + /* + * Forces a directory scan in pgarch_readyXlog(). Protected by arch_lck. + */ + bool force_dir_scan; + + slock_t arch_lck; } PgArchData; +char *XLogArchiveLibrary = ""; + /* ---------- * Local data @@ -85,6 +97,33 @@ typedef struct PgArchData */ static time_t last_sigterm_time = 0; static PgArchData *PgArch = NULL; +static ArchiveModuleCallbacks ArchiveContext; + + +/* + * Stuff for tracking multiple files to archive from each scan of + * archive_status. Minimizing the number of directory scans when there are + * many files to archive can significantly improve archival rate. + * + * arch_heap is a max-heap that is used during the directory scan to track + * the highest-priority files to archive. After the directory scan + * completes, the file names are stored in ascending order of priority in + * arch_files. pgarch_readyXlog() returns files from arch_files until it + * is empty, at which point another directory scan must be performed. + * + * We only need this data in the archiver process, so make it a palloc'd + * struct rather than a bunch of static arrays. + */ +struct arch_files_state +{ + binaryheap *arch_heap; + int arch_files_size; /* number of live entries in arch_files[] */ + char *arch_files[NUM_FILES_PER_DIRECTORY_SCAN]; + /* buffers underlying heap, and later arch_files[], entries: */ + char arch_filenames[NUM_FILES_PER_DIRECTORY_SCAN][MAX_XFN_CHARS + 1]; +}; + +static struct arch_files_state *arch_files = NULL; /* * Flags set by interrupt handlers for later service in the main loop. @@ -103,6 +142,9 @@ static bool pgarch_readyXlog(char *xlog); static void pgarch_archiveDone(char *xlog); static void pgarch_die(int code, Datum arg); static void HandlePgArchInterrupts(void); +static int ready_file_comparator(Datum a, Datum b, void *arg); +static void LoadArchiveLibrary(void); +static void pgarch_call_module_shutdown_cb(int code, Datum arg); /* Report shared memory space needed by PgArchShmemInit */ Size @@ -129,6 +171,7 @@ PgArchShmemInit(void) /* First time through, so initialize */ MemSet(PgArch, 0, PgArchShmemSize()); PgArch->pgprocno = INVALID_PGPROCNO; + SpinLockInit(&PgArch->arch_lck); } } @@ -198,6 +241,17 @@ PgArchiverMain(void) */ PgArch->pgprocno = MyProc->pgprocno; + /* Create workspace for pgarch_readyXlog() */ + arch_files = palloc(sizeof(struct arch_files_state)); + arch_files->arch_files_size = 0; + + /* Initialize our max-heap for prioritizing files to archive. */ + arch_files->arch_heap = binaryheap_allocate(NUM_FILES_PER_DIRECTORY_SCAN, + ready_file_comparator, NULL); + + /* Load the archive_library. */ + LoadArchiveLibrary(); + pgarch_MainLoop(); proc_exit(0); @@ -325,6 +379,9 @@ pgarch_ArchiverCopyLoop(void) { char xlog[MAX_XFN_CHARS + 1]; + /* force directory scan in the first call to pgarch_readyXlog() */ + arch_files->arch_files_size = 0; + /* * loop through all xlogs with archive_status of .ready and archive * them...mostly we expect this to be a single file, though it is possible @@ -358,11 +415,12 @@ pgarch_ArchiverCopyLoop(void) */ HandlePgArchInterrupts(); - /* can't do anything if no command ... */ - if (!XLogArchiveCommandSet()) + /* can't do anything if not configured ... */ + if (ArchiveContext.check_configured_cb != NULL && + !ArchiveContext.check_configured_cb()) { ereport(WARNING, - (errmsg("archive_mode enabled, yet archive_command is not set"))); + (errmsg("archive_mode enabled, yet archiving is not configured"))); return; } @@ -412,20 +470,20 @@ 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); + pgstat_report_archiver(xlog, false); break; /* out of inner retry loop */ } 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); + pgstat_report_archiver(xlog, true); if (++failures >= NUM_ARCHIVE_RETRIES) { @@ -443,136 +501,31 @@ pgarch_ArchiverCopyLoop(void) /* * pgarch_archiveXlog * - * Invokes system(3) to copy one archive file to wherever it should go + * Invokes archive_file_cb to copy one archive file to wherever it should go * * Returns true if successful */ static bool pgarch_archiveXlog(char *xlog) { - char xlogarchcmd[MAXPGPATH]; char pathname[MAXPGPATH]; char activitymsg[MAXFNAMELEN + 16]; - char *dp; - char *endp; - const char *sp; - int rc; + bool ret; snprintf(pathname, MAXPGPATH, XLOGDIR "/%s", xlog); - /* - * construct the command to be executed - */ - dp = xlogarchcmd; - endp = xlogarchcmd + MAXPGPATH - 1; - *endp = '\0'; - - for (sp = XLogArchiveCommand; *sp; sp++) - { - if (*sp == '%') - { - switch (sp[1]) - { - case 'p': - /* %p: relative path of source file */ - sp++; - strlcpy(dp, pathname, endp - dp); - make_native_path(dp); - dp += strlen(dp); - break; - case 'f': - /* %f: filename of source file */ - sp++; - strlcpy(dp, xlog, endp - dp); - dp += strlen(dp); - break; - case '%': - /* convert %% to a single % */ - sp++; - if (dp < endp) - *dp++ = *sp; - break; - default: - /* otherwise treat the % as not special */ - if (dp < endp) - *dp++ = *sp; - break; - } - } - else - { - if (dp < endp) - *dp++ = *sp; - } - } - *dp = '\0'; - - ereport(DEBUG3, - (errmsg_internal("executing archive command \"%s\"", - xlogarchcmd))); - /* Report archive activity in PS display */ snprintf(activitymsg, sizeof(activitymsg), "archiving %s", xlog); set_ps_display(activitymsg); - rc = system(xlogarchcmd); - if (rc != 0) - { - /* - * If either the shell itself, or a called command, died on a signal, - * abort the archiver. We do this because system() ignores SIGINT and - * SIGQUIT while waiting; so a signal is very likely something that - * should have interrupted us too. Also die if the shell got a hard - * "command not found" type of error. If we overreact it's no big - * deal, the postmaster will just start the archiver again. - */ - int lev = wait_result_is_any_signal(rc, true) ? FATAL : LOG; - - if (WIFEXITED(rc)) - { - ereport(lev, - (errmsg("archive command failed with exit code %d", - WEXITSTATUS(rc)), - errdetail("The failed archive command was: %s", - xlogarchcmd))); - } - else if (WIFSIGNALED(rc)) - { -#if defined(WIN32) - ereport(lev, - (errmsg("archive command was terminated by exception 0x%X", - WTERMSIG(rc)), - errhint("See C include file \"ntstatus.h\" for a description of the hexadecimal value."), - errdetail("The failed archive command was: %s", - xlogarchcmd))); -#else - ereport(lev, - (errmsg("archive command was terminated by signal %d: %s", - WTERMSIG(rc), pg_strsignal(WTERMSIG(rc))), - errdetail("The failed archive command was: %s", - xlogarchcmd))); -#endif - } - else - { - ereport(lev, - (errmsg("archive command exited with unrecognized status %d", - rc), - errdetail("The failed archive command was: %s", - xlogarchcmd))); - } - + ret = ArchiveContext.archive_file_cb(xlog, pathname); + if (ret) + snprintf(activitymsg, sizeof(activitymsg), "last was %s", xlog); + else snprintf(activitymsg, sizeof(activitymsg), "failed on %s", xlog); - set_ps_display(activitymsg); - - return false; - } - elog(DEBUG1, "archived write-ahead log file \"%s\"", xlog); - - snprintf(activitymsg, sizeof(activitymsg), "last was %s", xlog); set_ps_display(activitymsg); - return true; + return ret; } /* @@ -600,18 +553,57 @@ pgarch_archiveXlog(char *xlog) static bool pgarch_readyXlog(char *xlog) { - /* - * open xlog status directory and read through list of xlogs that have the - * .ready suffix, looking for earliest file. It is possible to optimise - * this code, though only a single file is expected on the vast majority - * of calls, so.... - */ char XLogArchiveStatusDir[MAXPGPATH]; DIR *rldir; struct dirent *rlde; - bool found = false; - bool historyFound = false; + bool force_dir_scan; + + /* + * If a directory scan was requested, clear the stored file names and + * proceed. + */ + SpinLockAcquire(&PgArch->arch_lck); + force_dir_scan = PgArch->force_dir_scan; + PgArch->force_dir_scan = false; + SpinLockRelease(&PgArch->arch_lck); + + if (force_dir_scan) + arch_files->arch_files_size = 0; + + /* + * If we still have stored file names from the previous directory scan, + * try to return one of those. We check to make sure the status file is + * still present, as the archive_command for a previous file may have + * already marked it done. + */ + while (arch_files->arch_files_size > 0) + { + struct stat st; + char status_file[MAXPGPATH]; + char *arch_file; + arch_files->arch_files_size--; + arch_file = arch_files->arch_files[arch_files->arch_files_size]; + StatusFilePath(status_file, arch_file, ".ready"); + + if (stat(status_file, &st) == 0) + { + strcpy(xlog, arch_file); + return true; + } + else if (errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", status_file))); + } + + /* arch_heap is probably empty, but let's make sure */ + binaryheap_reset(arch_files->arch_heap); + + /* + * Open the archive status directory and read through the list of files + * with the .ready suffix, looking for the earliest files. + */ snprintf(XLogArchiveStatusDir, MAXPGPATH, XLOGDIR "/archive_status"); rldir = AllocateDir(XLogArchiveStatusDir); @@ -619,7 +611,7 @@ pgarch_readyXlog(char *xlog) { int basenamelen = (int) strlen(rlde->d_name) - 6; char basename[MAX_XFN_CHARS + 1]; - bool ishistory; + char *arch_file; /* Ignore entries with unexpected number of characters */ if (basenamelen < MIN_XFN_CHARS || @@ -638,32 +630,97 @@ pgarch_readyXlog(char *xlog) memcpy(basename, rlde->d_name, basenamelen); basename[basenamelen] = '\0'; - /* Is this a history file? */ - ishistory = IsTLHistoryFileName(basename); - /* - * Consume the file to archive. History files have the highest - * priority. If this is the first file or the first history file - * ever, copy it. In the presence of a history file already chosen as - * target, ignore all other files except history files which have been - * generated for an older timeline than what is already chosen as - * target to archive. + * Store the file in our max-heap if it has a high enough priority. */ - if (!found || (ishistory && !historyFound)) + if (arch_files->arch_heap->bh_size < NUM_FILES_PER_DIRECTORY_SCAN) { - strcpy(xlog, basename); - found = true; - historyFound = ishistory; + /* If the heap isn't full yet, quickly add it. */ + arch_file = arch_files->arch_filenames[arch_files->arch_heap->bh_size]; + strcpy(arch_file, basename); + binaryheap_add_unordered(arch_files->arch_heap, CStringGetDatum(arch_file)); + + /* If we just filled the heap, make it a valid one. */ + if (arch_files->arch_heap->bh_size == NUM_FILES_PER_DIRECTORY_SCAN) + binaryheap_build(arch_files->arch_heap); } - else if (ishistory || !historyFound) + else if (ready_file_comparator(binaryheap_first(arch_files->arch_heap), + CStringGetDatum(basename), NULL) > 0) { - if (strcmp(basename, xlog) < 0) - strcpy(xlog, basename); + /* + * Remove the lowest priority file and add the current one to the + * heap. + */ + arch_file = DatumGetCString(binaryheap_remove_first(arch_files->arch_heap)); + strcpy(arch_file, basename); + binaryheap_add(arch_files->arch_heap, CStringGetDatum(arch_file)); } } FreeDir(rldir); - return found; + /* If no files were found, simply return. */ + if (arch_files->arch_heap->bh_size == 0) + return false; + + /* + * If we didn't fill the heap, we didn't make it a valid one. Do that + * now. + */ + if (arch_files->arch_heap->bh_size < NUM_FILES_PER_DIRECTORY_SCAN) + binaryheap_build(arch_files->arch_heap); + + /* + * Fill arch_files array with the files to archive in ascending order of + * priority. + */ + arch_files->arch_files_size = arch_files->arch_heap->bh_size; + for (int i = 0; i < arch_files->arch_files_size; i++) + arch_files->arch_files[i] = DatumGetCString(binaryheap_remove_first(arch_files->arch_heap)); + + /* Return the highest priority file. */ + arch_files->arch_files_size--; + strcpy(xlog, arch_files->arch_files[arch_files->arch_files_size]); + + return true; +} + +/* + * ready_file_comparator + * + * Compares the archival priority of the given files to archive. If "a" + * has a higher priority than "b", a negative value will be returned. If + * "b" has a higher priority than "a", a positive value will be returned. + * If "a" and "b" have equivalent values, 0 will be returned. + */ +static int +ready_file_comparator(Datum a, Datum b, void *arg) +{ + char *a_str = DatumGetCString(a); + char *b_str = DatumGetCString(b); + bool a_history = IsTLHistoryFileName(a_str); + bool b_history = IsTLHistoryFileName(b_str); + + /* Timeline history files always have the highest priority. */ + if (a_history != b_history) + return a_history ? -1 : 1; + + /* Priority is given to older files. */ + return strcmp(a_str, b_str); +} + +/* + * PgArchForceDirScan + * + * When called, the next call to pgarch_readyXlog() will perform a + * directory scan. This is useful for ensuring that important files such + * as timeline history files are archived as quickly as possible. + */ +void +PgArchForceDirScan(void) +{ + SpinLockAcquire(&PgArch->arch_lck); + PgArch->force_dir_scan = true; + SpinLockRelease(&PgArch->arch_lck); } /* @@ -701,8 +758,9 @@ pgarch_die(int code, Datum arg) * Interrupt handler for WAL archiver process. * * This is called in the loops pgarch_MainLoop and pgarch_ArchiverCopyLoop. - * It checks for barrier events and config update, but not shutdown request - * because how to handle shutdown request is different between those loops. + * It checks for barrier events, config update and request for logging of + * memory contexts, but not shutdown request because how to handle + * shutdown request is different between those loops. */ static void HandlePgArchInterrupts(void) @@ -710,9 +768,83 @@ HandlePgArchInterrupts(void) if (ProcSignalBarrierPending) ProcessProcSignalBarrier(); + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); + if (ConfigReloadPending) { + char *archiveLib = pstrdup(XLogArchiveLibrary); + bool archiveLibChanged; + ConfigReloadPending = false; ProcessConfigFile(PGC_SIGHUP); + + archiveLibChanged = strcmp(XLogArchiveLibrary, archiveLib) != 0; + pfree(archiveLib); + + if (archiveLibChanged) + { + /* + * Ideally, we would simply unload the previous archive module and + * load the new one, but there is presently no mechanism for + * unloading a library (see the comment above + * internal_load_library()). To deal with this, we simply restart + * the archiver. The new archive module will be loaded when the + * new archiver process starts up. Note that this triggers the + * module's shutdown callback, if defined. + */ + ereport(LOG, + (errmsg("restarting archiver process because value of " + "\"archive_library\" was changed"))); + + proc_exit(0); + } } } + +/* + * LoadArchiveLibrary + * + * Loads the archiving callbacks into our local ArchiveContext. + */ +static void +LoadArchiveLibrary(void) +{ + ArchiveModuleInit archive_init; + + memset(&ArchiveContext, 0, sizeof(ArchiveModuleCallbacks)); + + /* + * If shell archiving is enabled, use our special initialization function. + * Otherwise, load the library and call its _PG_archive_module_init(). + */ + if (XLogArchiveLibrary[0] == '\0') + archive_init = shell_archive_init; + else + archive_init = (ArchiveModuleInit) + load_external_function(XLogArchiveLibrary, + "_PG_archive_module_init", false, NULL); + + if (archive_init == NULL) + ereport(ERROR, + (errmsg("archive modules have to define the symbol %s", "_PG_archive_module_init"))); + + (*archive_init) (&ArchiveContext); + + if (ArchiveContext.archive_file_cb == NULL) + ereport(ERROR, + (errmsg("archive modules must register an archive callback"))); + + before_shmem_exit(pgarch_call_module_shutdown_cb, 0); +} + +/* + * Call the shutdown callback of the loaded archive module, if defined. + */ +static void +pgarch_call_module_shutdown_cb(int code, Datum arg) +{ + if (ArchiveContext.shutdown_cb != NULL) + ArchiveContext.shutdown_cb(); +} diff --git a/third_party/spanner_pg/src/backend/postmaster/pgstat.c b/third_party/spanner_pg/src/backend/postmaster/pgstat.c deleted file mode 100644 index a2f75b23..00000000 --- a/third_party/spanner_pg/src/backend/postmaster/pgstat.c +++ /dev/null @@ -1,5851 +0,0 @@ -/* ---------- - * pgstat.c - * - * All the statistics collector stuff hacked up in one big, ugly file. - * - * TODO: - Separate collector, postmaster and backend stuff - * into different files. - * - * - Add some automatic call for pgstat vacuuming. - * - * - Add a pgstat config column to pg_database, so this - * entire thing can be enabled/disabled on a per db basis. - * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group - * - * 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/twophase_rmgr.h" -#include "access/xact.h" -#include "catalog/pg_database.h" -#include "catalog/pg_proc.h" -#include "common/ip.h" -#include "executor/instrument.h" -#include "libpq/libpq.h" -#include "libpq/pqsignal.h" -#include "mb/pg_wchar.h" -#include "miscadmin.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 "storage/fd.h" -#include "storage/ipc.h" -#include "storage/latch.h" -#include "storage/lmgr.h" -#include "storage/pg_shmem.h" -#include "storage/proc.h" -#include "storage/procsignal.h" -#include "utils/builtins.h" -#include "utils/guc.h" -#include "utils/memutils.h" -#include "utils/ps_status.h" -#include "utils/rel.h" -#include "utils/snapmgr.h" -#include "utils/timestamp.h" - -/* ---------- - * 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. */ - -#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. */ - -#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) - -/* Minimum receive buffer size for the collector's socket. */ -#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_REPLSLOT_HASH_SIZE 32 - - -/* ---------- - * GUC parameters - * ---------- - */ -bool pgstat_track_counts = false; -int pgstat_track_functions = TRACK_FUNC_OFF; - -/* ---------- - * Built from GUC parameter - * ---------- - */ -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 BgWriterStats; -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 substracting - * 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). - */ -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]; - -/* ---------- - * Local data - * ---------- - */ -NON_EXEC_STATIC pgsocket pgStatSock = PGINVALID_SOCKET; - -static struct sockaddr_storage pgStatAddr; - -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_initstats() 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 function stats that it hasn't yet - * sent to the collector. - */ -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. - */ -typedef struct PgStat_SubXactStatus -{ - int nest_level; /* subtransaction nest level */ - struct PgStat_SubXactStatus *prev; /* higher-level subxact if any */ - 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 */ - PgStat_Counter inserted_pre_trunc; /* tuples inserted prior to truncate */ - PgStat_Counter updated_pre_trunc; /* tuples updated prior to truncate */ - PgStat_Counter deleted_pre_trunc; /* tuples deleted prior to truncate */ - Oid t_id; /* table's OID */ - bool t_shared; /* is it a shared catalog? */ - bool t_truncated; /* was the relation truncated? */ -} TwoPhasePgStatRecord; - -/* - * Info about current "snapshot" of stats file - */ -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; - -/* - * 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. - */ -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; - - -/* ---------- - * 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 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 void pgstat_send_tabstat(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); -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_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); -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_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_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); - -/* ------------------------------------------------------------ - * Public functions called from postmaster follow - * ------------------------------------------------------------ - */ - -/* ---------- - * 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. - * ---------- - */ -void -pgstat_init(void) -{ - ACCEPT_TYPE_ARG3 alen; - struct addrinfo *addrs = NULL, - *addr, - hints; - int ret; - fd_set rset; - struct timeval tv; - char test_byte; - int sel_res; - int tries = 0; - -#define TESTBYTEVAL ((char) 199) - - /* - * 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"); - - /* - * 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; - } - - /* - * 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 - - if (++tries > 1) - ereport(LOG, - (errmsg("trying another address for the statistics collector"))); - - /* - * 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; - } - - /* - * 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; - } - - 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; - } - - /* - * 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; - } - - /* - * 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; - -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; - } - - /* - * 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; - } - - test_byte++; /* just make sure variable is changed */ - -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; - } - - 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; - } - - /* If we get here, we have a working socket */ - break; - } - - /* Did we find a working address? */ - if (!addr || pgStatSock == PGINVALID_SOCKET) - goto startup_failed; - - /* - * 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; - } - - /* - * 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; - ACCEPT_TYPE_ARG3 rcvbufsize = sizeof(old_rcvbuf); - - 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; - } - - 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"))); - } - } - - pg_freeaddrinfo_all(hints.ai_family, addrs); - - /* Now that we have a long-lived socket, tell fd.c about it. */ - ReserveExternalFD(); - - return; - -startup_failed: - ereport(LOG, - (errmsg("disabling statistics collector for lack of working socket"))); - - if (addrs) - pg_freeaddrinfo_all(hints.ai_family, addrs); - - if (pgStatSock != PGINVALID_SOCKET) - closesocket(pgStatSock); - pgStatSock = PGINVALID_SOCKET; - - /* - * 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); -} - -/* - * subroutine for pgstat_reset_all - */ -static void -pgstat_reset_remove_files(const char *directory) -{ - DIR *dir; - struct dirent *entry; - char fname[MAXPGPATH * 2]; - - dir = AllocateDir(directory); - while ((entry = ReadDir(dir, directory)) != NULL) - { - int nchars; - Oid tmp_oid; - - /* - * 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; - } - - if (strcmp(entry->d_name + nchars, "tmp") != 0 && - strcmp(entry->d_name + nchars, "stat") != 0) - continue; - - snprintf(fname, sizeof(fname), "%s/%s", directory, - entry->d_name); - unlink(fname); - } - FreeDir(dir); -} - -/* - * pgstat_reset_all() - - * - * Remove the stats files. This is currently used only if WAL - * recovery is needed after a crash. - */ -void -pgstat_reset_all(void) -{ - pgstat_reset_remove_files(pgstat_stat_directory); - pgstat_reset_remove_files(PGSTAT_STAT_PERMANENT_DIRECTORY); -} - -#ifdef EXEC_BACKEND - -/* - * pgstat_forkexec() - - * - * Format up the arglist for, then fork and exec, statistics collector process - */ -static pid_t -pgstat_forkexec(void) -{ - char *av[10]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkcol"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - - av[ac] = NULL; - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} -#endif /* EXEC_BACKEND */ - - -/* - * pgstat_start() - - * - * 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. - * - * Note: if fail, we will be called again from the postmaster main loop. - */ -int -pgstat_start(void) -{ - time_t curtime; - pid_t pgStatPid; - - /* - * Check that the socket is there, else pgstat_init failed and we can do - * nothing useful. - */ - if (pgStatSock == PGINVALID_SOCKET) - return 0; - - /* - * 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; - - /* - * Okay, fork off the collector. - */ -#ifdef EXEC_BACKEND - switch ((pgStatPid = pgstat_forkexec())) -#else - switch ((pgStatPid = fork_process())) -#endif - { - 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; - } - - /* shouldn't get here */ - return 0; -} - -void -allow_immediate_pgstat_restart(void) -{ - last_pgstat_start_time = 0; -} - -/* ------------------------------------------------------------ - * Public functions used by backends follow - *------------------------------------------------------------ - */ - - -/* ---------- - * 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. - * - * "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) -{ - /* 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; - - /* - * 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 ((pgStatTabList == NULL || pgStatTabList->tsa_used == 0) && - pgStatXactCommit == 0 && pgStatXactRollback == 0 && - pgWalUsage.wal_records == prevWalUsage.wal_records && - WalStats.m_wal_write == 0 && WalStats.m_wal_sync == 0 && - !have_function_stats && !disconnect) - return; - - /* - * 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. - */ - now = GetCurrentTransactionStopTimestamp(); - if (!disconnect && - !TimestampDifferenceExceeds(last_report, now, PGSTAT_STAT_INTERVAL)) - return; - - last_report = now; - - if (disconnect) - pgstat_report_disconnect(MyDatabaseId); - - /* - * 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); - - /* 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: finish and send a 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 - */ - 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; - } - - 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_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() - - * - * 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; - - /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. - */ - backend_read_statsfile(); - - /* - * Read pg_database and make a list of OIDs of all existing databases - */ - htab = pgstat_collect_oids(DatabaseRelationId, Anum_pg_database_oid); - - /* - * Search the database hash table for dead databases and tell the - * collector to drop them. - */ - hash_seq_init(&hstat, pgStatDBHash); - while ((dbentry = (PgStat_StatDBEntry *) hash_seq_search(&hstat)) != NULL) - { - 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); - - /* - * Search for all the dead replication slots in stats hashtable and tell - * the stats collector to drop them. - */ - if (replSlotStatHash) - { - PgStat_StatReplSlotEntry *slotentry; - - 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_report_replslot_drop(NameStr(slotentry->slotname)); - } - } - - /* - * 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; - - /* - * Similarly to above, make a list of all known relations in this DB. - */ - htab = pgstat_collect_oids(RelationRelationId, Anum_pg_class_oid); - - /* - * Initialize our messages table counter to zero - */ - msg.m_nentries = 0; - - /* - * 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; - - CHECK_FOR_INTERRUPTS(); - - if (hash_search(htab, (void *) &tabid, HASH_FIND, NULL) != NULL) - continue; - - /* - * 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); - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); - - msg.m_nentries = 0; - } - } - - /* - * Send the rest - */ - if (msg.m_nentries > 0) - { - len = offsetof(PgStat_MsgTabpurge, m_tableid[0]) - + msg.m_nentries * sizeof(Oid); - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_TABPURGE); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, len); - } - - /* 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. - */ - if (dbentry->functions != NULL && - hash_get_num_entries(dbentry->functions) > 0) - { - htab = pgstat_collect_oids(ProcedureRelationId, Anum_pg_proc_oid); - - pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE); - f_msg.m_databaseid = MyDatabaseId; - f_msg.m_nentries = 0; - - hash_seq_init(&hstat, dbentry->functions); - while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL) - { - Oid funcid = funcentry->functionid; - - CHECK_FOR_INTERRUPTS(); - - if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL) - continue; - - /* - * Not there, so add this function's Oid to the message - */ - f_msg.m_functionid[f_msg.m_nentries++] = funcid; - - /* - * 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); - - pgstat_send(&f_msg, len); - - f_msg.m_nentries = 0; - } - } - - /* - * Send the rest - */ - if (f_msg.m_nentries > 0) - { - len = offsetof(PgStat_MsgFuncpurge, m_functionid[0]) - + f_msg.m_nentries * sizeof(Oid); - - pgstat_send(&f_msg, len); - } - - hash_destroy(htab); - } -} - - -/* ---------- - * 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.) - * ---------- - */ -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) - { - Oid thisoid; - bool isnull; - - thisoid = heap_getattr(tup, anum_oid, RelationGetDescr(rel), &isnull); - Assert(!isnull); - - CHECK_FOR_INTERRUPTS(); - - (void) hash_search(htab, (void *) &thisoid, HASH_ENTER, NULL); - } - table_endscan(scan); - UnregisterSnapshot(snapshot); - table_close(rel, AccessShareLock); - - 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() - - * - * 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_reset_counters() - - * - * Tell the statistics collector to reset counters for our database. - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- - */ -void -pgstat_reset_counters(void) -{ - PgStat_MsgResetcounter msg; - - if (pgStatSock == PGINVALID_SOCKET) - return; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETCOUNTER); - msg.m_databaseid = MyDatabaseId; - pgstat_send(&msg, sizeof(msg)); -} - -/* ---------- - * pgstat_reset_shared_counters() - - * - * Tell the statistics collector to reset cluster-wide shared counters. - * - * Permission checking for this function is managed through the normal - * GRANT system. - * ---------- - */ -void -pgstat_reset_shared_counters(const char *target) -{ - 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\"."))); - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_RESETSHAREDCOUNTER); - pgstat_send(&msg, sizeof(msg)); -} - -/* ---------- - * pgstat_reset_single_counter() - - * - * Tell the statistics collector to reset a single counter. - * - * 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_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; - - 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). - * - * 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)); -} - -/* ---------- - * 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_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 (rel->pgstat_info != NULL && - 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_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) -{ - 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_initstats() - - * - * 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_initstats(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; - - /* - * 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; -} - -/* - * get_tabstat_stack_level - add a new (sub)transaction stack entry if needed - */ -static PgStat_SubXactStatus * -get_tabstat_stack_level(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 = get_tabstat_stack_level(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; -} - -/* - * pgstat_count_heap_insert - count a tuple insertion of n tuples - */ -void -pgstat_count_heap_insert(Relation rel, PgStat_Counter n) -{ - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) - { - /* We have to log the effect at the proper transactional level */ - 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_info->trans->tuples_inserted += n; - } -} - -/* - * pgstat_count_heap_update - count a tuple update - */ -void -pgstat_count_heap_update(Relation rel, bool hot) -{ - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) - { - /* We have to log the effect at the proper transactional level */ - 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_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) -{ - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) - { - /* We have to log the effect at the proper transactional level */ - 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_info->trans->tuples_deleted++; - } -} - -/* - * pgstat_truncate_save_counters - * - * Whenever a table is truncated, we save its i/u/d counters so that they can - * be cleared, and if the (sub)xact that executed the truncate later aborts, - * the counters can be restored to the saved (pre-truncate) values. Note we do - * this on the first truncate in any particular subxact level only. - */ -static void -pgstat_truncate_save_counters(PgStat_TableXactStatus *trans) -{ - if (!trans->truncated) - { - trans->inserted_pre_trunc = trans->tuples_inserted; - trans->updated_pre_trunc = trans->tuples_updated; - trans->deleted_pre_trunc = trans->tuples_deleted; - trans->truncated = true; - } -} - -/* - * pgstat_truncate_restore_counters - restore counters when a truncate aborts - */ -static void -pgstat_truncate_restore_counters(PgStat_TableXactStatus *trans) -{ - if (trans->truncated) - { - trans->tuples_inserted = trans->inserted_pre_trunc; - trans->tuples_updated = trans->updated_pre_trunc; - trans->tuples_deleted = trans->deleted_pre_trunc; - } -} - -/* - * pgstat_count_truncate - update tuple counters due to truncate - */ -void -pgstat_count_truncate(Relation rel) -{ - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) - { - /* We have to log the effect at the proper transactional level */ - 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_truncate_save_counters(pgstat_info->trans); - 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) -{ - PgStat_TableStatus *pgstat_info = rel->pgstat_info; - - if (pgstat_info != NULL) - pgstat_info->t_counts.t_delta_dead_tuples -= delta; -} - - -/* ---------- - * 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; - - /* 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++; - } - - /* - * 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. - */ - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - PgStat_TableXactStatus *trans; - - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - 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 stats (if any) in case of aborted xact */ - if (!isCommit) - pgstat_truncate_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_truncated = trans->truncated; - if (trans->truncated) - { - /* 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; - } - } - 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; - - /* - * Transfer transactional insert/update counts into the next higher - * subtransaction state. - */ - xact_state = pgStatXactStack; - if (xact_state != NULL && - xact_state->nest_level >= nestDepth) - { - PgStat_TableXactStatus *trans; - PgStat_TableXactStatus *next_trans; - - /* delink xact_state from stack immediately to simplify reuse case */ - pgStatXactStack = xact_state->prev; - - 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->truncated) - { - /* propagate the truncate status one level up */ - pgstat_truncate_save_counters(trans->upper); - /* 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 = get_tabstat_stack_level(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 */ - pgstat_truncate_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); - } - } - pfree(xact_state); - } -} - - -/* - * AtPrepare_PgStat - * Save the transactional stats state at 2PC transaction prepare. - * - * In this phase we just generate 2PC records for all the pending - * transaction-dependent stats work. - */ -void -AtPrepare_PgStat(void) -{ - PgStat_SubXactStatus *xact_state; - - xact_state = pgStatXactStack; - if (xact_state != NULL) - { - PgStat_TableXactStatus *trans; - - Assert(xact_state->nest_level == 1); - Assert(xact_state->prev == NULL); - 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_trunc = trans->inserted_pre_trunc; - record.updated_pre_trunc = trans->updated_pre_trunc; - record.deleted_pre_trunc = trans->deleted_pre_trunc; - record.t_id = tabstat->t_id; - record.t_shared = tabstat->t_shared; - record.t_truncated = trans->truncated; - - RegisterTwoPhaseRecord(TWOPHASE_RM_PGSTAT_ID, 0, - &record, sizeof(TwoPhasePgStatRecord)); - } - } -} - -/* - * PostPrepare_PgStat - * Clean up after successful PREPARE. - * - * 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 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) - { - PgStat_TableXactStatus *trans; - - for (trans = xact_state->first; trans != NULL; trans = trans->next) - { - PgStat_TableStatus *tabstat; - - tabstat = trans->parent; - tabstat->trans = NULL; - } - } - pgStatXactStack = NULL; - - /* Make sure any stats snapshot is thrown away */ - 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_truncated = rec->t_truncated; - if (rec->t_truncated) - { - /* 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_truncated) - { - rec->tuples_inserted = rec->inserted_pre_trunc; - rec->tuples_updated = rec->updated_pre_trunc; - rec->tuples_deleted = rec->deleted_pre_trunc; - } - 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() - - * - * 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) -{ - /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. - */ - backend_read_statsfile(); - - /* - * Lookup the requested database; return NULL if not found - */ - return (PgStat_StatDBEntry *) hash_search(pgStatDBHash, - (void *) &dbid, - HASH_FIND, NULL); -} - - -/* ---------- - * 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. - * ---------- - */ -PgStat_StatTabEntry * -pgstat_fetch_stat_tabentry(Oid relid) -{ - Oid dbid; - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - - /* - * If not done for this transaction, read the statistics collector stats - * file into some hash tables. - */ - backend_read_statsfile(); - - /* - * 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) - { - tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - (void *) &relid, - HASH_FIND, NULL); - if (tabentry) - return tabentry; - } - - /* - * 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) - { - tabentry = (PgStat_StatTabEntry *) hash_search(dbentry->tables, - (void *) &relid, - HASH_FIND, NULL); - if (tabentry) - return tabentry; - } - - return NULL; -} - - -/* ---------- - * pgstat_fetch_stat_funcentry() - - * - * 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) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatFuncEntry *funcentry = NULL; - - /* load the stats file if needed */ - backend_read_statsfile(); - - /* Lookup our database, then find the requested function. */ - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); - if (dbentry != NULL && dbentry->functions != NULL) - { - funcentry = (PgStat_StatFuncEntry *) hash_search(dbentry->functions, - (void *) &func_id, - HASH_FIND, NULL); - } - - return funcentry; -} - - -/* - * --------- - * pgstat_fetch_stat_archiver() - - * - * 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(); - - return &archiverStats; -} - - -/* - * --------- - * 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() - - * - * 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(); - - return &walStats; -} - -/* - * --------- - * pgstat_fetch_slru() - - * - * Support function for the SQL-callable pgstat* functions. Returns - * a pointer to the slru statistics struct. - * --------- - */ -PgStat_SLRUStats * -pgstat_fetch_slru(void) -{ - backend_read_statsfile(); - - return slruStats; -} - -/* - * --------- - * pgstat_fetch_replslot() - - * - * 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(); - - return pgstat_get_replslot_entry(slotname, 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) -{ - /* - * 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); -} - -/* ---------- - * pgstat_initialize() - - * - * Initialize pgstats state, and set up our on-proc-exit hook. - * Called from InitPostgres and AuxiliaryProcessMain. - * - * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. - * ---------- - */ -void -pgstat_initialize(void) -{ - /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_send_wal() can - * calculate how much pgWalUsage counters are increased by substracting - * prevWalUsage from pgWalUsage. - */ - prevWalUsage = pgWalUsage; - - /* Set up a process-exit hook to clean up */ - on_shmem_exit(pgstat_shutdown_hook, 0); -} - -/* ------------------------------------------------------------ - * Local support functions follow - * ------------------------------------------------------------ - */ - - -/* ---------- - * pgstat_setheader() - - * - * Set common header fields in a statistics message - * ---------- - */ -static void -pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype) -{ - hdr->m_type = mtype; -} - - -/* ---------- - * pgstat_send() - - * - * Send out one statistics message to the collector - * ---------- - */ -static void -pgstat_send(void *msg, int len) -{ - int rc; - - 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 -} - -/* ---------- - * 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; - - /* - * 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(&BgWriterStats, &all_zeroes, sizeof(PgStat_MsgBgWriter)) == 0) - return; - - /* - * Prepare and send the message - */ - pgstat_setheader(&BgWriterStats.m_hdr, PGSTAT_MTYPE_BGWRITER); - pgstat_send(&BgWriterStats, sizeof(BgWriterStats)); - - /* - * Clear out the statistics buffer, so it can be re-used. - */ - MemSet(&BgWriterStats, 0, sizeof(BgWriterStats)); -} - -/* ---------- - * 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 - * substracting 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)); -} - -/* ---------- - * 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() - - * - * 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_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_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; - - 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; -} - - -/* ---------- - * pgstat_write_statsfiles() - - * 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. - * ---------- - */ -static void -pgstat_write_statsfiles(bool permanent, bool allDbs) -{ - 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; - - 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; - } - - /* - * 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 global stats struct - */ - 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 */ - - /* - * Write WAL stats struct - */ - rc = fwrite(&walStats, sizeof(walStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - - /* - * Write SLRU stats struct - */ - rc = fwrite(slruStats, sizeof(slruStats), 1, fpout); - (void) rc; /* we'll check for error with ferror */ - - /* - * Walk through the database table. - */ - 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 */ - } - - /* - * Write replication slot 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 */ - } - } - - /* - * 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) - 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) -{ - 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"); -} - -/* ---------- - * pgstat_write_db_statsfile() - - * 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); - } -} - -/* ---------- - * pgstat_read_statsfiles() - - * - * 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. - * - * '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. - * ---------- - */ -static HTAB * -pgstat_read_statsfiles(Oid onlydb, bool permanent, bool deep) -{ - 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; - - /* - * 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)); - - /* - * Set the current timestamp (will be kept only in case we can't load an - * existing statsfile). - */ - globalStats.stat_reset_timestamp = GetCurrentTimestamp(); - archiverStats.stat_reset_timestamp = globalStats.stat_reset_timestamp; - walStats.stat_reset_timestamp = globalStats.stat_reset_timestamp; - - /* - * Set the same reset timestamp for all SLRU items too. - */ - for (i = 0; i < SLRU_NUM_ELEMENTS; i++) - slruStats[i].stat_reset_timestamp = globalStats.stat_reset_timestamp; - - /* - * 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 dbhash; - } - - /* - * 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; - } - - /* - * Read global stats struct - */ - 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. - */ - if (pgStatRunningInCollector) - globalStats.stats_timestamp = 0; - - /* - * Read archiver 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; - } - - /* - * Read WAL 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; - } - - /* - * 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; - } - - /* - * We found an existing collector stats file. Read it and put all the - * hashtable 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; - } - - 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) - { - if (dbbuf.databaseid != onlydb && - dbbuf.databaseid != InvalidOid) - break; - } - - 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; - - if (fread(&slotbuf, 1, sizeof(PgStat_StatReplSlotEntry), fpin) - != sizeof(PgStat_StatReplSlotEntry)) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - - /* 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); - } - - slotent = (PgStat_StatReplSlotEntry *) hash_search(replSlotStatHash, - (void *) &slotbuf.slotname, - HASH_ENTER, NULL); - memcpy(slotent, &slotbuf, sizeof(PgStat_StatReplSlotEntry)); - break; - } - - case 'E': - goto done; - - default: - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - } - -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; -} - - -/* ---------- - * pgstat_read_db_statsfile() - - * - * 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; - } - - memcpy(funcentry, &funcbuf, sizeof(funcbuf)); - break; - - /* - * 'E' The EOF marker of a complete stats file. - */ - case 'E': - goto done; - - default: - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", - statfile))); - goto done; - } - } - -done: - FreeFile(fpin); - - if (permanent) - { - elog(DEBUG2, "removing permanent stats file \"%s\"", statfile); - unlink(statfile); - } -} - -/* ---------- - * 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. - * - * 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. - * ---------- - */ -static bool -pgstat_read_db_statsfile_timestamp(Oid databaseid, bool permanent, - TimestampTz *ts) -{ - PgStat_StatDBEntry dbentry; - PgStat_GlobalStats myGlobalStats; - PgStat_ArchiverStats myArchiverStats; - PgStat_WalStats myWalStats; - PgStat_SLRUStats mySLRUStats[SLRU_NUM_ELEMENTS]; - PgStat_StatReplSlotEntry myReplSlotStats; - 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) - { - ereport(pgStatRunningInCollector ? LOG : WARNING, - (errmsg("corrupted statistics file \"%s\"", statfile))); - FreeFile(fpin); - return false; - } - - /* - * 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; - } - - /* - * 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; - } - - /* - * 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; - - 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; - - /* 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); -} - - -/* ---------- - * 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); -} - - -/* ---------- - * 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) -{ - /* Release memory, if any was allocated */ - if (pgStatLocalContext) - MemoryContextDelete(pgStatLocalContext); - - /* Reset variables */ - pgStatLocalContext = NULL; - pgStatDBHash = NULL; - replSlotStatHash = 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(); -} - - -/* ---------- - * pgstat_recv_inquiry() - - * - * 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); -} - - -/* ---------- - * pgstat_recv_tabstat() - - * - * 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, first reset the live/dead counters */ - if (tabmsg->t_counts.t_truncated) - { - 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; - } -} - - -/* ---------- - * pgstat_recv_tabpurge() - - * - * 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); - } -} - - -/* ---------- - * pgstat_recv_dropdb() - - * - * 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"))); - } -} - - -/* ---------- - * pgstat_recv_resetcounter() - - * - * 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); -} - -/* ---------- - * pgstat_recv_resetsharedcounter() - - * - * Reset some shared statistics of the cluster. - * ---------- - */ -static void -pgstat_recv_resetsharedcounter(PgStat_MsgResetsharedcounter *msg, int len) -{ - if (msg->m_resettarget == RESET_BGWRITER) - { - /* Reset the global background writer statistics for the cluster. */ - memset(&globalStats, 0, sizeof(globalStats)); - globalStats.stat_reset_timestamp = GetCurrentTimestamp(); - } - else if (msg->m_resettarget == RESET_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) - { - /* 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 - */ -} - -/* ---------- - * pgstat_recv_resetsinglecounter() - - * - * Reset a statistics for a single object - * ---------- - */ -static void -pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - - 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 == RESET_TABLE) - (void) hash_search(dbentry->tables, (void *) &(msg->m_objectid), - HASH_REMOVE, NULL); - else if (msg->m_resettype == RESET_FUNCTION) - (void) hash_search(dbentry->functions, (void *) &(msg->m_objectid), - HASH_REMOVE, NULL); -} - -/* ---------- - * pgstat_recv_resetslrucounter() - - * - * 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; - } - } -} - -/* ---------- - * pgstat_recv_resetreplslotcounter() - - * - * 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(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(slotent, ts); - } -} - - -/* ---------- - * pgstat_recv_autovac() - - * - * 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; -} - -/* ---------- - * pgstat_recv_vacuum() - - * - * 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++; - } -} - -/* ---------- - * pgstat_recv_analyze() - - * - * 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++; - } -} - - -/* ---------- - * pgstat_recv_archiver() - - * - * 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; - } -} - -/* ---------- - * pgstat_recv_bgwriter() - - * - * Process a BGWRITER message. - * ---------- - */ -static void -pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) -{ - globalStats.timed_checkpoints += msg->m_timed_checkpoints; - globalStats.requested_checkpoints += msg->m_requested_checkpoints; - globalStats.checkpoint_write_time += msg->m_checkpoint_write_time; - globalStats.checkpoint_sync_time += msg->m_checkpoint_sync_time; - globalStats.buf_written_checkpoints += msg->m_buf_written_checkpoints; - globalStats.buf_written_clean += msg->m_buf_written_clean; - globalStats.maxwritten_clean += msg->m_maxwritten_clean; - globalStats.buf_written_backend += msg->m_buf_written_backend; - globalStats.buf_fsync_backend += msg->m_buf_fsync_backend; - globalStats.buf_alloc += msg->m_buf_alloc; -} - -/* ---------- - * pgstat_recv_wal() - - * - * 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; -} - -/* ---------- - * pgstat_recv_slru() - - * - * 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; -} - -/* ---------- - * pgstat_recv_recoveryconflict() - - * - * 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; - } -} - -/* ---------- - * pgstat_recv_deadlock() - - * - * 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++; -} - -/* ---------- - * pgstat_recv_checksum_failure() - - * - * 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; -} - -/* ---------- - * pgstat_recv_replslot() - - * - * 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(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; - } - } -} - -/* ---------- - * pgstat_recv_connect() - - * - * 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++; -} - -/* ---------- - * pgstat_recv_disconnect() - - * - * 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; - } -} - -/* ---------- - * pgstat_recv_tempfile() - - * - * 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; -} - -/* ---------- - * pgstat_recv_funcstat() - - * - * 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; - } - } -} - -/* ---------- - * pgstat_recv_funcpurge() - - * - * 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); - } -} - -/* ---------- - * 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_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) -{ - /* - * 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/third_party/spanner_pg/src/backend/postmaster/postmaster.c b/third_party/spanner_pg/src/backend/postmaster/postmaster.c index f87b5d93..c39a87f0 100644 --- a/third_party/spanner_pg/src/backend/postmaster/postmaster.c +++ b/third_party/spanner_pg/src/backend/postmaster/postmaster.c @@ -32,7 +32,7 @@ * clients. * * - * 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 * * @@ -95,10 +95,11 @@ #include "access/transam.h" #include "access/xlog.h" -#include "bootstrap/bootstrap.h" +#include "access/xlogrecovery.h" #include "catalog/pg_control.h" #include "common/file_perm.h" #include "common/ip.h" +#include "common/pg_prng.h" #include "common/string.h" #include "lib/ilist.h" #include "libpq/auth.h" @@ -109,6 +110,7 @@ #include "pgstat.h" #include "port/pg_bswap.h" #include "postmaster/autovacuum.h" +#include "postmaster/auxprocess.h" #include "postmaster/bgworker_internals.h" #include "postmaster/fork_process.h" #include "postmaster/interrupt.h" @@ -255,7 +257,6 @@ static pid_t StartupPID = 0, WalReceiverPID = 0, AutoVacPID = 0, PgArchPID = 0, - PgStatPID = 0, SysLoggerPID = 0; /* Startup process's status */ @@ -345,14 +346,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 */ @@ -517,7 +511,6 @@ typedef struct PGPROC *AuxiliaryProcs; PGPROC *PreparedXactProcs; PMSignalData *PMSignalState; - InheritableSocket pgStatSock; pid_t PostmasterPid; TimestampTz PgStartTime; TimestampTz PgReloadTime; @@ -595,6 +588,13 @@ PostmasterMain(int argc, char *argv[]) IsPostmasterEnvironment = true; + /* + * Start our win32 signal implementation + */ +#ifdef WIN32 + pgwin32_signal_initialize(); +#endif + /* * We should not be creating any files or directories before we check the * data directory (see checkDataDir()), but just in case set the umask to @@ -645,9 +645,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); @@ -891,15 +890,41 @@ PostmasterMain(int argc, char *argv[]) if (output_config_variable != NULL) { /* - * "-C guc" was specified, so print GUC's value and exit. No extra - * permission check is needed because the user is reading inside the - * data dir. + * If this is a runtime-computed GUC, it hasn't yet been initialized, + * and the present value is not useful. However, this is a convenient + * place to print the value for most GUCs because it is safe to run + * postmaster startup to this point even if the server is already + * running. For the handful of runtime-computed GUCs that we cannot + * provide meaningful values for yet, we wait until later in + * postmaster startup to print the value. We won't be able to use -C + * on running servers for those GUCs, but using this option now would + * lead to incorrect results for them. */ - const char *config_val = GetConfigOption(output_config_variable, - false, false); + int flags = GetConfigOptionFlags(output_config_variable, true); - puts(config_val ? config_val : ""); - ExitPostmaster(0); + if ((flags & GUC_RUNTIME_COMPUTED) == 0) + { + /* + * "-C guc" was specified, so print GUC's value and exit. No + * extra permission check is needed because the user is reading + * inside the data dir. + */ + const char *config_val = GetConfigOption(output_config_variable, + false, false); + + puts(config_val ? config_val : ""); + ExitPostmaster(0); + } + + /* + * A runtime-computed GUC will be printed later on. As we initialize + * a server startup sequence, silence any log messages that may show + * up in the output generated. FATAL and more severe messages are + * useful to show, even if one would only expect at least PANIC. LOG + * entries are hidden. + */ + SetConfigOption("log_min_messages", "FATAL", PGC_SUSET, + PGC_S_OVERRIDE); } /* Verify that DataDir looks reasonable */ @@ -992,10 +1017,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(); @@ -1016,11 +1039,49 @@ 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(); + /* + * Give preloaded libraries a chance to request additional shared memory. + */ + process_shmem_requests(); + + /* + * Now that loadable modules have had their chance to request additional + * shared memory, determine the value of any runtime-computed GUCs that + * depend on the amount of shared memory required. + */ + 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 + * for most GUCs before we lock the data directory so that the option may + * be used on a running server. However, a handful of GUCs are runtime- + * computed and do not have meaningful values until after locking the data + * directory, and we cannot safely calculate their values earlier on a + * running server. At this point, such GUCs should be properly + * initialized, and we haven't yet set up shared memory, so this is a good + * time to handle the -C option for these special GUCs. + */ + if (output_config_variable != NULL) + { + const char *config_val = GetConfigOption(output_config_variable, + false, false); + + puts(config_val ? config_val : ""); + ExitPostmaster(0); + } + /* * Set up shared memory and semaphores. */ @@ -1346,12 +1407,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) */ @@ -1408,6 +1463,12 @@ PostmasterMain(int argc, char *argv[]) */ AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_STARTING); + /* Start bgwriter and checkpointer so they can help with recovery */ + if (CheckpointerPID == 0) + CheckpointerPID = StartCheckpointer(); + if (BgWriterPID == 0) + BgWriterPID = StartBackgroundWriter(); + /* * We're ready to rock and roll... */ @@ -1770,7 +1831,7 @@ ServerLoop(void) * fails, we'll just try again later. Likewise for the checkpointer. */ if (pmState == PM_RUN || pmState == PM_RECOVERY || - pmState == PM_HOT_STANDBY) + pmState == PM_HOT_STANDBY || pmState == PM_STARTUP) { if (CheckpointerPID == 0) CheckpointerPID = StartCheckpointer(); @@ -1801,11 +1862,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(); @@ -2042,7 +2098,7 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) #ifdef USE_SSL /* No SSL when disabled or on Unix sockets */ - if (!LoadedSSL || IS_AF_UNIX(port->laddr.addr.ss_family)) + if (!LoadedSSL || port->laddr.addr.ss_family == AF_UNIX) SSLok = 'N'; else SSLok = 'S'; /* Support for SSL */ @@ -2091,7 +2147,7 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) #ifdef ENABLE_GSS /* No GSSAPI encryption when on Unix socket */ - if (!IS_AF_UNIX(port->laddr.addr.ss_family)) + if (port->laddr.addr.ss_family != AF_UNIX) GSSok = 'G'; #endif @@ -2365,9 +2421,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; } @@ -2502,19 +2555,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. @@ -2655,19 +2699,19 @@ ClosePostmasterPorts(bool am_syslogger) void InitProcessGlobals(void) { - unsigned int rseed; - MyProcPid = getpid(); MyStartTimestamp = GetCurrentTimestamp(); MyStartTime = timestamptz_to_time_t(MyStartTimestamp); /* - * Set a different seed for random() in every process. We want something + * Set a different global seed in every process. We want something * unpredictable, so if possible, use high-quality random bits for the * seed. Otherwise, fall back to a seed based on timestamp and PID. */ - if (!pg_strong_random(&rseed, sizeof(rseed))) + if (unlikely(!pg_prng_strong_seed(&pg_global_prng_state))) { + uint64 rseed; + /* * Since PIDs and timestamps tend to change more frequently in their * least significant bits, shift the timestamp left to allow a larger @@ -2678,8 +2722,17 @@ InitProcessGlobals(void) rseed = ((uint64) MyProcPid) ^ ((uint64) MyStartTimestamp << 12) ^ ((uint64) MyStartTimestamp >> 20); + + pg_prng_seed(&pg_global_prng_state, rseed); } - srandom(rseed); + + /* + * Also make sure that we've set a good seed for random(3). Use of that + * is deprecated in core Postgres, but extensions might use it. + */ +#ifndef WIN32 + srandom(pg_prng_uint32(&pg_global_prng_state)); +#endif } @@ -2738,8 +2791,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()) @@ -2824,17 +2875,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 - * a later state, do not change it. + * 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 */ @@ -3046,7 +3092,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 @@ -3068,8 +3114,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(); @@ -3136,13 +3180,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 { @@ -3221,22 +3258,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) { @@ -3325,26 +3346,21 @@ CleanupBackgroundWorker(int pid, } /* - * Additionally, for shared-memory-connected workers, just like a - * backend, any exit status other than 0 or 1 is considered a crash - * and causes a system-wide restart. + * Additionally, just like a backend, any exit status other than 0 or + * 1 is considered a crash and causes a system-wide restart. */ - if ((rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0) + if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) { - if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) - { - HandleChildCrash(pid, exitstatus, namebuf); - return true; - } + HandleChildCrash(pid, exitstatus, namebuf); + return true; } /* - * We must release the postmaster child slot whether this worker is - * connected to shared memory or not, but we only treat it as a crash - * if it is in fact connected. + * We must release the postmaster child slot. If the worker failed to + * do so, it did not clean up after itself, requiring a crash-restart + * cycle. */ - if (!ReleasePostmasterChildSlot(rw->rw_child_slot) && - (rw->rw_worker.bgw_flags & BGWORKER_SHMEM_ACCESS) != 0) + if (!ReleasePostmasterChildSlot(rw->rw_child_slot)) { HandleChildCrash(pid, exitstatus, namebuf); return true; @@ -3683,22 +3699,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) @@ -3794,21 +3794,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; @@ -3920,12 +3910,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); } } } @@ -3949,8 +3937,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 @@ -3960,8 +3947,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); @@ -3996,18 +3982,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 @@ -4181,8 +4155,6 @@ TerminateChildren(int signal) signal_child(AutoVacPID, signal); if (PgArchPID != 0) signal_child(PgArchPID, signal); - if (PgStatPID != 0) - signal_child(PgStatPID, signal); } /* @@ -4229,8 +4201,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 @@ -4260,6 +4231,15 @@ BackendStartup(Port *port) /* Perform additional initialization and collect startup packet */ BackendInitialize(port); + /* + * Create a per-backend PGPROC struct in shared memory. We must do + * this before we can use LWLocks. In the !EXEC_BACKEND case (here) + * this could be delayed a bit further, but EXEC_BACKEND needs to do + * stuff with LWLocks before PostgresMain(), so we do it here as well + * for symmetry. + */ + InitProcess(); + /* And run the backend */ BackendRun(port); } @@ -4527,19 +4507,13 @@ BackendInitialize(Port *port) static void BackendRun(Port *port) { - char *av[2]; - const int ac = 1; - - av[0] = "postgres"; - av[1] = NULL; - /* * Make sure we aren't in PostmasterContext anymore. (We can't delete it * just yet, though, because InitPostgres will need the HBA data.) */ MemoryContextSwitchTo(TopMemoryContext); - PostgresMain(ac, av, port->database_name, port->user_name); + PostgresMain(port->database_name, port->user_name); } @@ -4927,15 +4901,6 @@ SubPostmasterMain(int argc, char *argv[]) /* Close the postmaster's sockets (as soon as we know them) */ ClosePostmasterPorts(strcmp(argv[1], "--forklog") == 0); - /* - * Start our win32 signal implementation. This has to be done after we - * read the backend variables, because we need to pick up the signal pipe - * from the parent process. - */ -#ifdef WIN32 - pgwin32_signal_initialize(); -#endif - /* Setup as postmaster child */ InitPostmasterChild(); @@ -4958,7 +4923,7 @@ SubPostmasterMain(int argc, char *argv[]) if (strcmp(argv[1], "--forkbackend") == 0 || strcmp(argv[1], "--forkavlauncher") == 0 || strcmp(argv[1], "--forkavworker") == 0 || - strcmp(argv[1], "--forkboot") == 0 || + strcmp(argv[1], "--forkaux") == 0 || strncmp(argv[1], "--forkbgworker=", 15) == 0) PGSharedMemoryReAttach(); else @@ -5046,8 +5011,12 @@ SubPostmasterMain(int argc, char *argv[]) /* And run the backend */ BackendRun(&port); /* does not return */ } - if (strcmp(argv[1], "--forkboot") == 0) + if (strcmp(argv[1], "--forkaux") == 0) { + AuxProcType auxtype; + + Assert(argc == 4); + /* Restore basic shared memory pointers */ InitShmemAccess(UsedShmemSegAddr); @@ -5057,7 +5026,8 @@ SubPostmasterMain(int argc, char *argv[]) /* Attach process to shared data structures */ CreateSharedMemoryAndSemaphores(); - AuxiliaryProcessMain(argc - 2, argv + 2); /* does not return */ + auxtype = atoi(argv[3]); + AuxiliaryProcessMain(auxtype); /* does not return */ } if (strcmp(argv[1], "--forkavlauncher") == 0) { @@ -5107,12 +5077,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 */ @@ -5189,15 +5153,6 @@ sigusr1_handler(SIGNAL_ARGS) FatalError = false; AbortStartTime = 0; - /* - * Crank up the background tasks. It doesn't matter if this fails, - * we'll just try again later. - */ - Assert(CheckpointerPID == 0); - CheckpointerPID = StartCheckpointer(); - Assert(BgWriterPID == 0); - BgWriterPID = StartBackgroundWriter(); - /* * Start the archiver if we're responsible for (re-)archiving received * files. @@ -5225,12 +5180,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"))); @@ -5241,7 +5190,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; @@ -5445,28 +5394,28 @@ static pid_t StartChildProcess(AuxProcType type) { pid_t pid; - char *av[10]; - int ac = 0; - char typebuf[32]; - - /* - * Set up command-line arguments for subprocess - */ - av[ac++] = "postgres"; #ifdef EXEC_BACKEND - av[ac++] = "--forkboot"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ -#endif + { + char *av[10]; + int ac = 0; + char typebuf[32]; - snprintf(typebuf, sizeof(typebuf), "-x%d", type); - av[ac++] = typebuf; + /* + * Set up command-line arguments for subprocess + */ + av[ac++] = "postgres"; + av[ac++] = "--forkaux"; + av[ac++] = NULL; /* filled in by postmaster_forkexec */ - av[ac] = NULL; - Assert(ac < lengthof(av)); + snprintf(typebuf, sizeof(typebuf), "%d", type); + av[ac++] = typebuf; -#ifdef EXEC_BACKEND - pid = postmaster_forkexec(ac, av); + av[ac] = NULL; + Assert(ac < lengthof(av)); + + pid = postmaster_forkexec(ac, av); + } #else /* !EXEC_BACKEND */ pid = fork_process(); @@ -5482,7 +5431,7 @@ StartChildProcess(AuxProcType type) MemoryContextDelete(PostmasterContext); PostmasterContext = NULL; - AuxiliaryProcessMain(ac, av); /* does not return */ + AuxiliaryProcessMain(type); /* does not return */ } #endif /* EXEC_BACKEND */ @@ -5723,7 +5672,11 @@ BackgroundWorkerInitializeConnection(const char *dbname, const char *username, u (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("database connection requirement not indicated during registration"))); - InitPostgres(dbname, InvalidOid, username, InvalidOid, NULL, (flags & BGWORKER_BYPASS_ALLOWCONN) != 0); + InitPostgres(dbname, InvalidOid, /* database to connect to */ + username, InvalidOid, /* role to connect as */ + false, /* never honor session_preload_libraries */ + (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ if (!IsInitProcessingMode()) @@ -5746,7 +5699,11 @@ BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("database connection requirement not indicated during registration"))); - InitPostgres(NULL, dboid, NULL, useroid, NULL, (flags & BGWORKER_BYPASS_ALLOWCONN) != 0); + InitPostgres(NULL, dboid, /* database to connect to */ + NULL, useroid, /* role to connect as */ + false, /* never honor session_preload_libraries */ + (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ if (!IsInitProcessingMode()) @@ -5921,7 +5878,6 @@ bgworker_should_start_now(BgWorkerStartTime start_time) if (start_time == BgWorkerStart_PostmasterStart) return true; /* fall through */ - } return false; @@ -6146,7 +6102,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 @@ -6202,8 +6157,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; @@ -6437,7 +6390,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; @@ -6476,8 +6428,6 @@ restore_backend_variables(BackendParameters *param, Port *port) if (postmaster_alive_fds[1] >= 0) ReserveExternalFD(); #endif - if (pgStatSock != PGINVALID_SOCKET) - ReserveExternalFD(); } diff --git a/third_party/spanner_pg/src/backend/postmaster/shell_archive.c b/third_party/spanner_pg/src/backend/postmaster/shell_archive.c new file mode 100644 index 00000000..6306f5bd --- /dev/null +++ b/third_party/spanner_pg/src/backend/postmaster/shell_archive.c @@ -0,0 +1,165 @@ +/*------------------------------------------------------------------------- + * + * shell_archive.c + * + * This archiving function uses a user-specified shell command (the + * archive_command GUC) to copy write-ahead log files. It is used as the + * default, but other modules may define their own custom archiving logic. + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/postmaster/shell_archive.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include + +#include "access/xlog.h" +#include "pgstat.h" +#include "postmaster/pgarch.h" + +static bool shell_archive_configured(void); +static bool shell_archive_file(const char *file, const char *path); +static void shell_archive_shutdown(void); + +void +shell_archive_init(ArchiveModuleCallbacks *cb) +{ + AssertVariableIsOfType(&shell_archive_init, ArchiveModuleInit); + + cb->check_configured_cb = shell_archive_configured; + cb->archive_file_cb = shell_archive_file; + cb->shutdown_cb = shell_archive_shutdown; +} + +static bool +shell_archive_configured(void) +{ + return XLogArchiveCommand[0] != '\0'; +} + +static bool +shell_archive_file(const char *file, const char *path) +{ + char xlogarchcmd[MAXPGPATH]; + char *dp; + char *endp; + const char *sp; + int rc; + + /* + * construct the command to be executed + */ + dp = xlogarchcmd; + endp = xlogarchcmd + MAXPGPATH - 1; + *endp = '\0'; + + for (sp = XLogArchiveCommand; *sp; sp++) + { + if (*sp == '%') + { + switch (sp[1]) + { + case 'p': + /* %p: relative path of source file */ + sp++; + strlcpy(dp, path, endp - dp); + make_native_path(dp); + dp += strlen(dp); + break; + case 'f': + /* %f: filename of source file */ + sp++; + strlcpy(dp, file, endp - dp); + dp += strlen(dp); + break; + case '%': + /* convert %% to a single % */ + sp++; + if (dp < endp) + *dp++ = *sp; + break; + default: + /* otherwise treat the % as not special */ + if (dp < endp) + *dp++ = *sp; + break; + } + } + else + { + if (dp < endp) + *dp++ = *sp; + } + } + *dp = '\0'; + + ereport(DEBUG3, + (errmsg_internal("executing archive command \"%s\"", + xlogarchcmd))); + + pgstat_report_wait_start(WAIT_EVENT_ARCHIVE_COMMAND); + rc = system(xlogarchcmd); + pgstat_report_wait_end(); + + if (rc != 0) + { + /* + * If either the shell itself, or a called command, died on a signal, + * abort the archiver. We do this because system() ignores SIGINT and + * SIGQUIT while waiting; so a signal is very likely something that + * should have interrupted us too. Also die if the shell got a hard + * "command not found" type of error. If we overreact it's no big + * deal, the postmaster will just start the archiver again. + */ + int lev = wait_result_is_any_signal(rc, true) ? FATAL : LOG; + + if (WIFEXITED(rc)) + { + ereport(lev, + (errmsg("archive command failed with exit code %d", + WEXITSTATUS(rc)), + errdetail("The failed archive command was: %s", + xlogarchcmd))); + } + else if (WIFSIGNALED(rc)) + { +#if defined(WIN32) + ereport(lev, + (errmsg("archive command was terminated by exception 0x%X", + WTERMSIG(rc)), + errhint("See C include file \"ntstatus.h\" for a description of the hexadecimal value."), + errdetail("The failed archive command was: %s", + xlogarchcmd))); +#else + ereport(lev, + (errmsg("archive command was terminated by signal %d: %s", + WTERMSIG(rc), pg_strsignal(WTERMSIG(rc))), + errdetail("The failed archive command was: %s", + xlogarchcmd))); +#endif + } + else + { + ereport(lev, + (errmsg("archive command exited with unrecognized status %d", + rc), + errdetail("The failed archive command was: %s", + xlogarchcmd))); + } + + return false; + } + + elog(DEBUG1, "archived write-ahead log file \"%s\"", file); + return true; +} + +static void +shell_archive_shutdown(void) +{ + elog(DEBUG1, "archiver process shutting down"); +} diff --git a/third_party/spanner_pg/src/backend/postmaster/startup.c b/third_party/spanner_pg/src/backend/postmaster/startup.c index c3f5e18b..4f8f3975 100644 --- a/third_party/spanner_pg/src/backend/postmaster/startup.c +++ b/third_party/spanner_pg/src/backend/postmaster/startup.c @@ -9,7 +9,7 @@ * though.) * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -22,6 +22,8 @@ #include #include "access/xlog.h" +#include "access/xlogrecovery.h" +#include "access/xlogutils.h" #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" @@ -33,6 +35,7 @@ #include "storage/procsignal.h" #include "storage/standby.h" #include "utils/guc.h" +#include "utils/memutils.h" #include "utils/timeout.h" @@ -60,6 +63,22 @@ static volatile sig_atomic_t promote_signaled = false; */ static volatile sig_atomic_t in_restore_command = false; +/* + * Time at which the most recent startup operation started. + */ +static TimestampTz startup_progress_phase_start_time; + +/* + * Indicates whether the startup progress interval mentioned by the user is + * elapsed or not. TRUE if timeout occurred, FALSE otherwise. + */ +static volatile sig_atomic_t startup_progress_timer_expired = false; + +/* + * Time between progress updates for long-running startup operations. + */ +int log_startup_progress_interval = 10000; /* 10 sec */ + /* Signal handlers */ static void StartupProcTriggerHandler(SIGNAL_ARGS); static void StartupProcSigHupHandler(SIGNAL_ARGS); @@ -198,6 +217,10 @@ HandleStartupProcInterrupts(void) /* Process barrier events */ if (ProcSignalBarrierPending) ProcessProcSignalBarrier(); + + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); } @@ -296,3 +319,84 @@ ResetPromoteSignaled(void) { promote_signaled = false; } + +/* + * Set a flag indicating that it's time to log a progress report. + */ +void +startup_progress_timeout_handler(void) +{ + startup_progress_timer_expired = true; +} + +void +disable_startup_progress_timeout(void) +{ + /* Feature is disabled. */ + if (log_startup_progress_interval == 0) + return; + + disable_timeout(STARTUP_PROGRESS_TIMEOUT, false); + startup_progress_timer_expired = false; +} + +/* + * Set the start timestamp of the current operation and enable the timeout. + */ +void +enable_startup_progress_timeout(void) +{ + TimestampTz fin_time; + + /* Feature is disabled. */ + if (log_startup_progress_interval == 0) + return; + + startup_progress_phase_start_time = GetCurrentTimestamp(); + fin_time = TimestampTzPlusMilliseconds(startup_progress_phase_start_time, + log_startup_progress_interval); + enable_timeout_every(STARTUP_PROGRESS_TIMEOUT, fin_time, + log_startup_progress_interval); +} + +/* + * A thin wrapper to first disable and then enable the startup progress + * timeout. + */ +void +begin_startup_progress_phase(void) +{ + /* Feature is disabled. */ + if (log_startup_progress_interval == 0) + return; + + disable_startup_progress_timeout(); + enable_startup_progress_timeout(); +} + +/* + * Report whether startup progress timeout has occurred. Reset the timer flag + * if it did, set the elapsed time to the out parameters and return true, + * otherwise return false. + */ +bool +has_startup_progress_timeout_expired(long *secs, int *usecs) +{ + long seconds; + int useconds; + TimestampTz now; + + /* No timeout has occurred. */ + if (!startup_progress_timer_expired) + return false; + + /* Calculate the elapsed time. */ + now = GetCurrentTimestamp(); + TimestampDifference(startup_progress_phase_start_time, now, &seconds, &useconds); + + *secs = seconds; + *usecs = useconds; + startup_progress_timer_expired = false; + + return true; +} diff --git a/third_party/spanner_pg/src/backend/postmaster/syslogger.c b/third_party/spanner_pg/src/backend/postmaster/syslogger.c index cad43bde..d6d02e3c 100644 --- a/third_party/spanner_pg/src/backend/postmaster/syslogger.c +++ b/third_party/spanner_pg/src/backend/postmaster/syslogger.c @@ -13,7 +13,7 @@ * * Author: Andreas Pflug * - * Copyright (c) 2004-2021, PostgreSQL Global Development Group + * Copyright (c) 2004-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -38,6 +38,7 @@ #include "nodes/pg_list.h" #include "pgstat.h" #include "pgtime.h" +#include "port/pg_bitutils.h" #include "postmaster/fork_process.h" #include "postmaster/interrupt.h" #include "postmaster/postmaster.h" @@ -85,9 +86,11 @@ static bool pipe_eof_seen = false; static bool rotation_disabled = false; static FILE *syslogFile = NULL; static FILE *csvlogFile = NULL; +static FILE *jsonlogFile = NULL; NON_EXEC_STATIC pg_time_t first_syslogger_file_time = 0; -static char *last_file_name = NULL; +static char *last_sys_file_name = NULL; static char *last_csv_file_name = NULL; +static char *last_json_file_name = NULL; /* * Buffers for saving partial messages from different backends. @@ -129,6 +132,8 @@ static volatile sig_atomic_t rotation_requested = false; /* Local subroutines */ #ifdef EXEC_BACKEND +static int syslogger_fdget(FILE *file); +static FILE *syslogger_fdopen(int fd); static pid_t syslogger_forkexec(void); static void syslogger_parseArgs(int argc, char *argv[]); #endif @@ -142,6 +147,10 @@ static FILE *logfile_open(const char *filename, const char *mode, static unsigned int __stdcall pipeThread(void *arg); #endif static void logfile_rotate(bool time_based_rotation, int size_rotation_for); +static bool logfile_rotate_dest(bool time_based_rotation, + int size_rotation_for, pg_time_t fntime, + int target_dest, char **last_file_name, + FILE **logFile); static char *logfile_getname(pg_time_t timestamp, const char *suffix); static void set_next_rotation_time(void); static void sigUsr1Handler(SIGNAL_ARGS); @@ -196,12 +205,12 @@ SysLoggerMain(int argc, char *argv[]) * if they fail then presumably the file descriptors are closed and * any writes will go into the bitbucket anyway. */ - close(fileno(stdout)); - close(fileno(stderr)); + close(STDOUT_FILENO); + close(STDERR_FILENO); if (fd != -1) { - (void) dup2(fd, fileno(stdout)); - (void) dup2(fd, fileno(stderr)); + (void) dup2(fd, STDOUT_FILENO); + (void) dup2(fd, STDERR_FILENO); close(fd); } } @@ -213,7 +222,7 @@ SysLoggerMain(int argc, char *argv[]) */ #ifdef WIN32 else - _setmode(_fileno(stderr), _O_TEXT); + _setmode(STDERR_FILENO, _O_TEXT); #endif /* @@ -271,9 +280,11 @@ SysLoggerMain(int argc, char *argv[]) * time because passing down just the pg_time_t is a lot cheaper than * passing a whole file path in the EXEC_BACKEND case. */ - last_file_name = logfile_getname(first_syslogger_file_time, NULL); + last_sys_file_name = logfile_getname(first_syslogger_file_time, NULL); if (csvlogFile != NULL) last_csv_file_name = logfile_getname(first_syslogger_file_time, ".csv"); + if (jsonlogFile != NULL) + last_json_file_name = logfile_getname(first_syslogger_file_time, ".json"); /* remember active logfile parameters */ currentLogDir = pstrdup(Log_directory); @@ -360,6 +371,14 @@ SysLoggerMain(int argc, char *argv[]) (csvlogFile != NULL)) rotation_requested = true; + /* + * Force a rotation if JSONLOG output was just turned on or off + * and we need to open or close jsonlogFile accordingly. + */ + if (((Log_destination & LOG_DESTINATION_JSONLOG) != 0) != + (jsonlogFile != NULL)) + rotation_requested = true; + /* * If rotation time parameter changed, reset next rotation time, * but don't immediately force a rotation. @@ -410,6 +429,12 @@ SysLoggerMain(int argc, char *argv[]) rotation_requested = true; size_rotation_for |= LOG_DESTINATION_CSVLOG; } + if (jsonlogFile != NULL && + ftell(jsonlogFile) >= Log_RotationSize * 1024L) + { + rotation_requested = true; + size_rotation_for |= LOG_DESTINATION_JSONLOG; + } } if (rotation_requested) @@ -419,7 +444,9 @@ SysLoggerMain(int argc, char *argv[]) * was sent by pg_rotate_logfile() or "pg_ctl logrotate". */ if (!time_based_rotation && size_rotation_for == 0) - size_rotation_for = LOG_DESTINATION_STDERR | LOG_DESTINATION_CSVLOG; + size_rotation_for = LOG_DESTINATION_STDERR | + LOG_DESTINATION_CSVLOG | + LOG_DESTINATION_JSONLOG; logfile_rotate(time_based_rotation, size_rotation_for); } @@ -625,6 +652,20 @@ SysLogger_Start(void) pfree(filename); } + /* + * Likewise for the initial JSON log file, if that's enabled. (Note that + * we open syslogFile even when only JSON output is nominally enabled, + * since some code paths will write to syslogFile anyway.) + */ + if (Log_destination & LOG_DESTINATION_JSONLOG) + { + filename = logfile_getname(first_syslogger_file_time, ".json"); + + jsonlogFile = logfile_open(filename, "a", false); + + pfree(filename); + } + #ifdef EXEC_BACKEND switch ((sysloggerPid = syslogger_forkexec())) #else @@ -675,12 +716,12 @@ SysLogger_Start(void) #ifndef WIN32 fflush(stdout); - if (dup2(syslogPipe[1], fileno(stdout)) < 0) + if (dup2(syslogPipe[1], STDOUT_FILENO) < 0) ereport(FATAL, (errcode_for_file_access(), errmsg("could not redirect stdout: %m"))); fflush(stderr); - if (dup2(syslogPipe[1], fileno(stderr)) < 0) + if (dup2(syslogPipe[1], STDERR_FILENO) < 0) ereport(FATAL, (errcode_for_file_access(), errmsg("could not redirect stderr: %m"))); @@ -697,12 +738,12 @@ SysLogger_Start(void) fflush(stderr); fd = _open_osfhandle((intptr_t) syslogPipe[1], _O_APPEND | _O_BINARY); - if (dup2(fd, _fileno(stderr)) < 0) + if (dup2(fd, STDERR_FILENO) < 0) ereport(FATAL, (errcode_for_file_access(), errmsg("could not redirect stderr: %m"))); close(fd); - _setmode(_fileno(stderr), _O_BINARY); + _setmode(STDERR_FILENO, _O_BINARY); /* * Now we are done with the write end of the pipe. @@ -722,6 +763,11 @@ SysLogger_Start(void) fclose(csvlogFile); csvlogFile = NULL; } + if (jsonlogFile != NULL) + { + fclose(jsonlogFile); + jsonlogFile = NULL; + } return (int) sysloggerPid; } @@ -732,6 +778,60 @@ SysLogger_Start(void) #ifdef EXEC_BACKEND +/* + * syslogger_fdget() - + * + * Utility wrapper to grab the file descriptor of an opened error output + * file. Used when building the command to fork the logging collector. + */ +static int +syslogger_fdget(FILE *file) +{ +#ifndef WIN32 + if (file != NULL) + return fileno(file); + else + return -1; +#else + if (file != NULL) + return (int) _get_osfhandle(_fileno(file)); + else + return 0; +#endif /* WIN32 */ +} + +/* + * syslogger_fdopen() - + * + * Utility wrapper to re-open an error output file, using the given file + * descriptor. Used when parsing arguments in a forked logging collector. + */ +static FILE * +syslogger_fdopen(int fd) +{ + FILE *file = NULL; + +#ifndef WIN32 + if (fd != -1) + { + file = fdopen(fd, "a"); + setvbuf(file, NULL, PG_IOLBF, 0); + } +#else /* WIN32 */ + if (fd != 0) + { + fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); + if (fd > 0) + { + file = fdopen(fd, "a"); + setvbuf(file, NULL, PG_IOLBF, 0); + } + } +#endif /* WIN32 */ + + return file; +} + /* * syslogger_forkexec() - * @@ -744,41 +844,22 @@ syslogger_forkexec(void) int ac = 0; char filenobuf[32]; char csvfilenobuf[32]; + char jsonfilenobuf[32]; av[ac++] = "postgres"; av[ac++] = "--forklog"; av[ac++] = NULL; /* filled in by postmaster_forkexec */ /* static variables (those not passed by write_backend_variables) */ -#ifndef WIN32 - if (syslogFile != NULL) - snprintf(filenobuf, sizeof(filenobuf), "%d", - fileno(syslogFile)); - else - strcpy(filenobuf, "-1"); -#else /* WIN32 */ - if (syslogFile != NULL) - snprintf(filenobuf, sizeof(filenobuf), "%ld", - (long) _get_osfhandle(_fileno(syslogFile))); - else - strcpy(filenobuf, "0"); -#endif /* WIN32 */ + snprintf(filenobuf, sizeof(filenobuf), "%d", + syslogger_fdget(syslogFile)); av[ac++] = filenobuf; - -#ifndef WIN32 - if (csvlogFile != NULL) - snprintf(csvfilenobuf, sizeof(csvfilenobuf), "%d", - fileno(csvlogFile)); - else - strcpy(csvfilenobuf, "-1"); -#else /* WIN32 */ - if (csvlogFile != NULL) - snprintf(csvfilenobuf, sizeof(csvfilenobuf), "%ld", - (long) _get_osfhandle(_fileno(csvlogFile))); - else - strcpy(csvfilenobuf, "0"); -#endif /* WIN32 */ + snprintf(csvfilenobuf, sizeof(csvfilenobuf), "%d", + syslogger_fdget(csvlogFile)); av[ac++] = csvfilenobuf; + snprintf(jsonfilenobuf, sizeof(jsonfilenobuf), "%d", + syslogger_fdget(jsonlogFile)); + av[ac++] = jsonfilenobuf; av[ac] = NULL; Assert(ac < lengthof(av)); @@ -796,7 +877,7 @@ syslogger_parseArgs(int argc, char *argv[]) { int fd; - Assert(argc == 5); + Assert(argc == 6); argv += 3; /* @@ -806,41 +887,12 @@ syslogger_parseArgs(int argc, char *argv[]) * fails there's not a lot we can do to report the problem anyway. As * coded, we'll just crash on a null pointer dereference after failure... */ -#ifndef WIN32 - fd = atoi(*argv++); - if (fd != -1) - { - syslogFile = fdopen(fd, "a"); - setvbuf(syslogFile, NULL, PG_IOLBF, 0); - } fd = atoi(*argv++); - if (fd != -1) - { - csvlogFile = fdopen(fd, "a"); - setvbuf(csvlogFile, NULL, PG_IOLBF, 0); - } -#else /* WIN32 */ + syslogFile = syslogger_fdopen(fd); fd = atoi(*argv++); - if (fd != 0) - { - fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); - if (fd > 0) - { - syslogFile = fdopen(fd, "a"); - setvbuf(syslogFile, NULL, PG_IOLBF, 0); - } - } + csvlogFile = syslogger_fdopen(fd); fd = atoi(*argv++); - if (fd != 0) - { - fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); - if (fd > 0) - { - csvlogFile = fdopen(fd, "a"); - setvbuf(csvlogFile, NULL, PG_IOLBF, 0); - } - } -#endif /* WIN32 */ + jsonlogFile = syslogger_fdopen(fd); } #endif /* EXEC_BACKEND */ @@ -885,14 +937,17 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) { PipeProtoHeader p; int chunklen; + bits8 dest_flags; /* Do we have a valid header? */ memcpy(&p, cursor, offsetof(PipeProtoHeader, data)); + dest_flags = p.flags & (PIPE_PROTO_DEST_STDERR | + PIPE_PROTO_DEST_CSVLOG | + PIPE_PROTO_DEST_JSONLOG); if (p.nuls[0] == '\0' && p.nuls[1] == '\0' && p.len > 0 && p.len <= PIPE_MAX_PAYLOAD && p.pid != 0 && - (p.is_last == 't' || p.is_last == 'f' || - p.is_last == 'T' || p.is_last == 'F')) + pg_popcount((char *) &dest_flags, 1) == 1) { List *buffer_list; ListCell *cell; @@ -906,8 +961,17 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) if (count < chunklen) break; - dest = (p.is_last == 'T' || p.is_last == 'F') ? - LOG_DESTINATION_CSVLOG : LOG_DESTINATION_STDERR; + if ((p.flags & PIPE_PROTO_DEST_STDERR) != 0) + dest = LOG_DESTINATION_STDERR; + else if ((p.flags & PIPE_PROTO_DEST_CSVLOG) != 0) + dest = LOG_DESTINATION_CSVLOG; + else if ((p.flags & PIPE_PROTO_DEST_JSONLOG) != 0) + dest = LOG_DESTINATION_JSONLOG; + else + { + /* this should never happen as of the header validation */ + Assert(false); + } /* Locate any existing buffer for this source pid */ buffer_list = buffer_lists[p.pid % NBUFFER_LISTS]; @@ -924,7 +988,7 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) free_slot = buf; } - if (p.is_last == 'f' || p.is_last == 'F') + if ((p.flags & PIPE_PROTO_IS_LAST) == 0) { /* * Save a complete non-final chunk in a per-pid buffer @@ -1082,19 +1146,24 @@ write_syslogger_file(const char *buffer, int count, int destination) FILE *logfile; /* - * If we're told to write to csvlogFile, but it's not open, dump the data - * to syslogFile (which is always open) instead. This can happen if CSV - * output is enabled after postmaster start and we've been unable to open - * csvlogFile. There are also race conditions during a parameter change - * whereby backends might send us CSV output before we open csvlogFile or - * after we close it. Writing CSV-formatted output to the regular log - * file isn't great, but it beats dropping log output on the floor. + * If we're told to write to a structured log file, but it's not open, + * dump the data to syslogFile (which is always open) instead. This can + * happen if structured output is enabled after postmaster start and we've + * been unable to open logFile. There are also race conditions during a + * parameter change whereby backends might send us structured output + * before we open the logFile or after we close it. Writing formatted + * output to the regular log file isn't great, but it beats dropping log + * output on the floor. * - * Think not to improve this by trying to open csvlogFile on-the-fly. Any + * Think not to improve this by trying to open logFile on-the-fly. Any * failure in that would lead to recursion. */ - logfile = (destination == LOG_DESTINATION_CSVLOG && - csvlogFile != NULL) ? csvlogFile : syslogFile; + if ((destination & LOG_DESTINATION_CSVLOG) && csvlogFile != NULL) + logfile = csvlogFile; + else if ((destination & LOG_DESTINATION_JSONLOG) && jsonlogFile != NULL) + logfile = jsonlogFile; + else + logfile = syslogFile; rc = fwrite(buffer, 1, count, logfile); @@ -1165,7 +1234,8 @@ pipeThread(void *arg) if (Log_RotationSize > 0) { if (ftell(syslogFile) >= Log_RotationSize * 1024L || - (csvlogFile != NULL && ftell(csvlogFile) >= Log_RotationSize * 1024L)) + (csvlogFile != NULL && ftell(csvlogFile) >= Log_RotationSize * 1024L) || + (jsonlogFile != NULL && ftell(jsonlogFile) >= Log_RotationSize * 1024L)) SetLatch(MyLatch); } LeaveCriticalSection(&sysloggerSection); @@ -1231,145 +1301,146 @@ logfile_open(const char *filename, const char *mode, bool allow_errors) } /* - * perform logfile rotation + * Do logfile rotation for a single destination, as specified by target_dest. + * The information stored in *last_file_name and *logFile is updated on a + * successful file rotation. + * + * Returns false if the rotation has been stopped, or true to move on to + * the processing of other formats. */ -static void -logfile_rotate(bool time_based_rotation, int size_rotation_for) +static bool +logfile_rotate_dest(bool time_based_rotation, int size_rotation_for, + pg_time_t fntime, int target_dest, + char **last_file_name, FILE **logFile) { + char *logFileExt = NULL; char *filename; - char *csvfilename = NULL; - pg_time_t fntime; FILE *fh; - rotation_requested = false; + /* + * If the target destination was just turned off, close the previous file + * and unregister its data. This cannot happen for stderr as syslogFile + * is assumed to be always opened even if stderr is disabled in + * log_destination. + */ + if ((Log_destination & target_dest) == 0 && + target_dest != LOG_DESTINATION_STDERR) + { + if (*logFile != NULL) + fclose(*logFile); + *logFile = NULL; + if (*last_file_name != NULL) + pfree(*last_file_name); + *last_file_name = NULL; + return true; + } /* - * When doing a time-based rotation, invent the new logfile name based on - * the planned rotation time, not current time, to avoid "slippage" in the - * file name when we don't do the rotation immediately. + * Leave if it is not time for a rotation or if the target destination has + * no need to do a rotation based on the size of its file. */ - if (time_based_rotation) - fntime = next_rotation_time; + if (!time_based_rotation && (size_rotation_for & target_dest) == 0) + return true; + + /* file extension depends on the destination type */ + if (target_dest == LOG_DESTINATION_STDERR) + logFileExt = NULL; + else if (target_dest == LOG_DESTINATION_CSVLOG) + logFileExt = ".csv"; + else if (target_dest == LOG_DESTINATION_JSONLOG) + logFileExt = ".json"; else - fntime = time(NULL); - filename = logfile_getname(fntime, NULL); - if (Log_destination & LOG_DESTINATION_CSVLOG) - csvfilename = logfile_getname(fntime, ".csv"); + { + /* cannot happen */ + Assert(false); + } + + /* build the new file name */ + filename = logfile_getname(fntime, logFileExt); /* * Decide whether to overwrite or append. We can overwrite if (a) * Log_truncate_on_rotation is set, (b) the rotation was triggered by * elapsed time and not something else, and (c) the computed file name is * different from what we were previously logging into. - * - * Note: last_file_name should never be NULL here, but if it is, append. */ - if (time_based_rotation || (size_rotation_for & LOG_DESTINATION_STDERR)) - { - if (Log_truncate_on_rotation && time_based_rotation && - last_file_name != NULL && - strcmp(filename, last_file_name) != 0) - fh = logfile_open(filename, "w", true); - else - fh = logfile_open(filename, "a", true); + if (Log_truncate_on_rotation && time_based_rotation && + *last_file_name != NULL && + strcmp(filename, *last_file_name) != 0) + fh = logfile_open(filename, "w", true); + else + fh = logfile_open(filename, "a", true); - if (!fh) + if (!fh) + { + /* + * ENFILE/EMFILE are not too surprising on a busy system; just keep + * using the old file till we manage to get a new one. Otherwise, + * assume something's wrong with Log_directory and stop trying to + * create files. + */ + if (errno != ENFILE && errno != EMFILE) { - /* - * ENFILE/EMFILE are not too surprising on a busy system; just - * keep using the old file till we manage to get a new one. - * Otherwise, assume something's wrong with Log_directory and stop - * trying to create files. - */ - if (errno != ENFILE && errno != EMFILE) - { - ereport(LOG, - (errmsg("disabling automatic rotation (use SIGHUP to re-enable)"))); - rotation_disabled = true; - } - - if (filename) - pfree(filename); - if (csvfilename) - pfree(csvfilename); - return; + ereport(LOG, + (errmsg("disabling automatic rotation (use SIGHUP to re-enable)"))); + rotation_disabled = true; } - fclose(syslogFile); - syslogFile = fh; - - /* instead of pfree'ing filename, remember it for next time */ - if (last_file_name != NULL) - pfree(last_file_name); - last_file_name = filename; - filename = NULL; + if (filename) + pfree(filename); + return false; } - /* - * Same as above, but for csv file. Note that if LOG_DESTINATION_CSVLOG - * was just turned on, we might have to open csvlogFile here though it was - * not open before. In such a case we'll append not overwrite (since - * last_csv_file_name will be NULL); that is consistent with the normal - * rules since it's not a time-based rotation. - */ - if ((Log_destination & LOG_DESTINATION_CSVLOG) && - (csvlogFile == NULL || - time_based_rotation || (size_rotation_for & LOG_DESTINATION_CSVLOG))) - { - if (Log_truncate_on_rotation && time_based_rotation && - last_csv_file_name != NULL && - strcmp(csvfilename, last_csv_file_name) != 0) - fh = logfile_open(csvfilename, "w", true); - else - fh = logfile_open(csvfilename, "a", true); + /* fill in the new information */ + if (*logFile != NULL) + fclose(*logFile); + *logFile = fh; - if (!fh) - { - /* - * ENFILE/EMFILE are not too surprising on a busy system; just - * keep using the old file till we manage to get a new one. - * Otherwise, assume something's wrong with Log_directory and stop - * trying to create files. - */ - if (errno != ENFILE && errno != EMFILE) - { - ereport(LOG, - (errmsg("disabling automatic rotation (use SIGHUP to re-enable)"))); - rotation_disabled = true; - } + /* instead of pfree'ing filename, remember it for next time */ + if (*last_file_name != NULL) + pfree(*last_file_name); + *last_file_name = filename; - if (filename) - pfree(filename); - if (csvfilename) - pfree(csvfilename); - return; - } + return true; +} - if (csvlogFile != NULL) - fclose(csvlogFile); - csvlogFile = fh; +/* + * perform logfile rotation + */ +static void +logfile_rotate(bool time_based_rotation, int size_rotation_for) +{ + pg_time_t fntime; - /* instead of pfree'ing filename, remember it for next time */ - if (last_csv_file_name != NULL) - pfree(last_csv_file_name); - last_csv_file_name = csvfilename; - csvfilename = NULL; - } - else if (!(Log_destination & LOG_DESTINATION_CSVLOG) && - csvlogFile != NULL) - { - /* CSVLOG was just turned off, so close the old file */ - fclose(csvlogFile); - csvlogFile = NULL; - if (last_csv_file_name != NULL) - pfree(last_csv_file_name); - last_csv_file_name = NULL; - } + rotation_requested = false; - if (filename) - pfree(filename); - if (csvfilename) - pfree(csvfilename); + /* + * When doing a time-based rotation, invent the new logfile name based on + * the planned rotation time, not current time, to avoid "slippage" in the + * file name when we don't do the rotation immediately. + */ + if (time_based_rotation) + fntime = next_rotation_time; + else + fntime = time(NULL); + + /* file rotation for stderr */ + if (!logfile_rotate_dest(time_based_rotation, size_rotation_for, fntime, + LOG_DESTINATION_STDERR, &last_sys_file_name, + &syslogFile)) + return; + + /* file rotation for csvlog */ + if (!logfile_rotate_dest(time_based_rotation, size_rotation_for, fntime, + LOG_DESTINATION_CSVLOG, &last_csv_file_name, + &csvlogFile)) + return; + + /* file rotation for jsonlog */ + if (!logfile_rotate_dest(time_based_rotation, size_rotation_for, fntime, + LOG_DESTINATION_JSONLOG, &last_json_file_name, + &jsonlogFile)) + return; update_metainfo_datafile(); @@ -1457,7 +1528,8 @@ update_metainfo_datafile(void) mode_t oumask; if (!(Log_destination & LOG_DESTINATION_STDERR) && - !(Log_destination & LOG_DESTINATION_CSVLOG)) + !(Log_destination & LOG_DESTINATION_CSVLOG) && + !(Log_destination & LOG_DESTINATION_JSONLOG)) { if (unlink(LOG_METAINFO_DATAFILE) < 0 && errno != ENOENT) ereport(LOG, @@ -1490,9 +1562,9 @@ update_metainfo_datafile(void) return; } - if (last_file_name && (Log_destination & LOG_DESTINATION_STDERR)) + if (last_sys_file_name && (Log_destination & LOG_DESTINATION_STDERR)) { - if (fprintf(fh, "stderr %s\n", last_file_name) < 0) + if (fprintf(fh, "stderr %s\n", last_sys_file_name) < 0) { ereport(LOG, (errcode_for_file_access(), @@ -1515,6 +1587,19 @@ update_metainfo_datafile(void) return; } } + + if (last_json_file_name && (Log_destination & LOG_DESTINATION_JSONLOG)) + { + if (fprintf(fh, "jsonlog %s\n", last_json_file_name) < 0) + { + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", + LOG_METAINFO_DATAFILE_TMP))); + fclose(fh); + return; + } + } fclose(fh); if (rename(LOG_METAINFO_DATAFILE_TMP, LOG_METAINFO_DATAFILE) != 0) diff --git a/third_party/spanner_pg/src/backend/postmaster/walwriter.c b/third_party/spanner_pg/src/backend/postmaster/walwriter.c index 626fae84..e926f8c2 100644 --- a/third_party/spanner_pg/src/backend/postmaster/walwriter.c +++ b/third_party/spanner_pg/src/backend/postmaster/walwriter.c @@ -31,7 +31,7 @@ * should be killed by SIGQUIT and then a recovery cycle started. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -257,8 +257,8 @@ WalWriterMain(void) else if (left_till_hibernate > 0) left_till_hibernate--; - /* Send WAL statistics to the stats collector */ - pgstat_send_wal(false); + /* report pending statistics to the cumulative stats system */ + pgstat_report_wal(false); /* * Sleep until we are signaled or WalWriterDelay has elapsed. If we @@ -295,15 +295,18 @@ 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. + * 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); } + + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); } diff --git a/third_party/spanner_pg/src/backend/regex/README b/third_party/spanner_pg/src/backend/regex/README index e4b08366..930d8ced 100644 --- a/third_party/spanner_pg/src/backend/regex/README +++ b/third_party/spanner_pg/src/backend/regex/README @@ -438,3 +438,36 @@ BOS/BOL/EOS/EOL adjacent to the pre-state and post-state. So a finished NFA for a pattern without anchors or adjacent-character constraints will have pre-state outarcs for RAINBOW (all possible character colors) as well as BOS and BOL, and likewise post-state inarcs for RAINBOW, EOS, and EOL. +Also note that LACON arcs will never connect to the pre-state +or post-state. + + +Look-around constraints (LACONs) +-------------------------------- + +The regex compiler doesn't have much intelligence about LACONs; it just +constructs a sub-NFA representing the pattern that the constraint says to +match or not match, and puts a LACON arc referencing that sub-NFA into the +main NFA. At runtime, the executor applies the sub-NFA at each point in +the string where the constraint is relevant, and then traverses or doesn't +traverse the arc. ("Traversal" means including the arc's to-state in the +set of NFA states that are considered active at the next character.) + +The actual basic matching cycle of the executor is +1. Identify the color of the next input character, then advance over it. +2. Apply the DFA to follow all the matching "plain" arcs of the NFA. + (Notionally, the previous DFA state represents the set of states the + NFA could have been in before the character, and the new DFA state + represents the set of states the NFA could be in after the character.) +3. If there are any LACON arcs leading out of any of the new NFA states, + apply each LACON constraint starting from the new next input character + (while not actually consuming any input). For each successful LACON, + add its to-state to the current set of NFA states. If any such + to-state has outgoing LACON arcs, process those in the same way. + (Mathematically speaking, we compute the transitive closure of the + set of states reachable by successful LACONs.) + +Thus, LACONs are always checked immediately after consuming a character +via a plain arc. This is okay because the NFA's "pre" state only has +plain out-arcs, so we can always consume a character (possibly a BOS +pseudo-character as described above) before we need to worry about LACONs. diff --git a/third_party/spanner_pg/src/backend/regex/regc_lex.c b/third_party/spanner_pg/src/backend/regex/regc_lex.c index b3d3ff66..38c09b11 100644 --- a/third_party/spanner_pg/src/backend/regex/regc_lex.c +++ b/third_party/spanner_pg/src/backend/regex/regc_lex.c @@ -529,10 +529,7 @@ next(struct vars *v) } assert(NOTREACHED); } - if (v->cflags & REG_NOSUB) - RETV('(', 0); /* all parens non-capturing */ - else - RETV('(', 1); + RETV('(', 1); break; case CHR(')'): if (LASTTYPE('(')) diff --git a/third_party/spanner_pg/src/backend/regex/regc_nfa.c b/third_party/spanner_pg/src/backend/regex/regc_nfa.c index 62dab9a5..035302e7 100644 --- a/third_party/spanner_pg/src/backend/regex/regc_nfa.c +++ b/third_party/spanner_pg/src/backend/regex/regc_nfa.c @@ -777,6 +777,10 @@ sortouts_cmp(const void *a, const void *b) * However, if we have a whole lot of arcs to deal with, retail duplicate * checks become too slow. In that case we proceed by sorting and merging * the arc lists, and then we can indeed just update the arcs in-place. + * + * On the other hand, it's also true that this is frequently called with + * a brand-new newState that has no existing in-arcs. In that case, + * de-duplication is unnecessary, so we can just blindly move all the arcs. */ static void moveins(struct nfa *nfa, @@ -785,7 +789,18 @@ moveins(struct nfa *nfa, { assert(oldState != newState); - if (!BULK_ARC_OP_USE_SORT(oldState->nins, newState->nins)) + if (newState->nins == 0) + { + /* No need for de-duplication */ + struct arc *a; + + while ((a = oldState->ins) != NULL) + { + createarc(nfa, a->type, a->co, a->from, newState); + freearc(nfa, a); + } + } + else if (!BULK_ARC_OP_USE_SORT(oldState->nins, newState->nins)) { /* With not too many arcs, just do them one at a time */ struct arc *a; @@ -869,6 +884,11 @@ moveins(struct nfa *nfa, /* * copyins - copy in arcs of a state to another state + * + * The comments for moveins() apply here as well. However, in current + * usage, this is *only* called with brand-new target states, so that + * only the "no need for de-duplication" code path is ever reached. + * We keep the rest #ifdef'd out in case it's needed in the future. */ static void copyins(struct nfa *nfa, @@ -876,8 +896,18 @@ copyins(struct nfa *nfa, struct state *newState) { assert(oldState != newState); + assert(newState->nins == 0); /* see comment above */ + + if (newState->nins == 0) + { + /* No need for de-duplication */ + struct arc *a; - if (!BULK_ARC_OP_USE_SORT(oldState->nins, newState->nins)) + for (a = oldState->ins; a != NULL; a = a->inchain) + createarc(nfa, a->type, a->co, a->from, newState); + } +#ifdef NOT_USED /* see comment above */ + else if (!BULK_ARC_OP_USE_SORT(oldState->nins, newState->nins)) { /* With not too many arcs, just do them one at a time */ struct arc *a; @@ -944,6 +974,7 @@ copyins(struct nfa *nfa, createarc(nfa, a->type, a->co, a->from, newState); } } +#endif /* NOT_USED */ } /* @@ -1058,7 +1089,18 @@ moveouts(struct nfa *nfa, { assert(oldState != newState); - if (!BULK_ARC_OP_USE_SORT(oldState->nouts, newState->nouts)) + if (newState->nouts == 0) + { + /* No need for de-duplication */ + struct arc *a; + + while ((a = oldState->outs) != NULL) + { + createarc(nfa, a->type, a->co, newState, a->to); + freearc(nfa, a); + } + } + else if (!BULK_ARC_OP_USE_SORT(oldState->nouts, newState->nouts)) { /* With not too many arcs, just do them one at a time */ struct arc *a; @@ -1142,6 +1184,8 @@ moveouts(struct nfa *nfa, /* * copyouts - copy out arcs of a state to another state + * + * See comments for copyins() */ static void copyouts(struct nfa *nfa, @@ -1149,8 +1193,18 @@ copyouts(struct nfa *nfa, struct state *newState) { assert(oldState != newState); + assert(newState->nouts == 0); /* see comment above */ + + if (newState->nouts == 0) + { + /* No need for de-duplication */ + struct arc *a; - if (!BULK_ARC_OP_USE_SORT(oldState->nouts, newState->nouts)) + for (a = oldState->outs; a != NULL; a = a->outchain) + createarc(nfa, a->type, a->co, newState, a->to); + } +#ifdef NOT_USED /* see comment above */ + else if (!BULK_ARC_OP_USE_SORT(oldState->nouts, newState->nouts)) { /* With not too many arcs, just do them one at a time */ struct arc *a; @@ -1217,6 +1271,7 @@ copyouts(struct nfa *nfa, createarc(nfa, a->type, a->co, newState, a->to); } } +#endif /* NOT_USED */ } /* @@ -1991,6 +2046,7 @@ combine(struct nfa *nfa, else if (a->co == RAINBOW) { /* con is incompatible if it's for a pseudocolor */ + /* (this is hypothetical; we make no such constraints today) */ if (nfa->cm->cd[con->co].flags & PSEUDO) return INCOMPATIBLE; /* otherwise, constraint constrains arc to be only its color */ @@ -2017,6 +2073,7 @@ combine(struct nfa *nfa, else if (a->co == RAINBOW) { /* con is incompatible if it's for a pseudocolor */ + /* (this is hypothetical; we make no such constraints today) */ if (nfa->cm->cd[con->co].flags & PSEUDO) return INCOMPATIBLE; /* otherwise, constraint constrains arc to be only its color */ @@ -3590,6 +3647,7 @@ carc_cmp(const void *a, const void *b) return -1; if (aa->to > bb->to) return +1; + /* This is unreached, since there should be no duplicate arcs now: */ return 0; } diff --git a/third_party/spanner_pg/src/backend/regex/regc_pg_locale.c b/third_party/spanner_pg/src/backend/regex/regc_pg_locale.c index 17f8a081..7890f8fc 100644 --- a/third_party/spanner_pg/src/backend/regex/regc_pg_locale.c +++ b/third_party/spanner_pg/src/backend/regex/regc_pg_locale.c @@ -6,7 +6,7 @@ * * This file is #included by regcomp.c; it's not meant to compile standalone. * - * 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 * * IDENTIFICATION @@ -231,6 +231,18 @@ static const unsigned char pg_char_properties[128] = { void pg_set_regex_collation(Oid collation) { + if (!OidIsValid(collation)) + { + /* + * This typically means that the parser could not resolve a conflict + * of implicit collations, so report it that way. + */ + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_COLLATION), + errmsg("could not determine which collation to use for regular expression"), + errhint("Use the COLLATE clause to set the collation explicitly."))); + } + if (lc_ctype_is_c(collation)) { /* C/POSIX collations use this path regardless of database encoding */ @@ -240,28 +252,12 @@ pg_set_regex_collation(Oid collation) } else { - if (collation == DEFAULT_COLLATION_OID) - pg_regex_locale = 0; - else if (OidIsValid(collation)) - { - /* - * NB: pg_newlocale_from_collation will fail if not HAVE_LOCALE_T; - * the case of pg_regex_locale != 0 but not HAVE_LOCALE_T does not - * have to be considered below. - */ - pg_regex_locale = pg_newlocale_from_collation(collation); - } - else - { - /* - * This typically means that the parser could not resolve a - * conflict of implicit collations, so report it that way. - */ - ereport(ERROR, - (errcode(ERRCODE_INDETERMINATE_COLLATION), - errmsg("could not determine which collation to use for regular expression"), - errhint("Use the COLLATE clause to set the collation explicitly."))); - } + /* + * NB: pg_newlocale_from_collation will fail if not HAVE_LOCALE_T; the + * case of pg_regex_locale != 0 but not HAVE_LOCALE_T does not have to + * be considered below. + */ + pg_regex_locale = pg_newlocale_from_collation(collation); if (pg_regex_locale && !pg_regex_locale->deterministic) ereport(ERROR, diff --git a/third_party/spanner_pg/src/backend/regex/regcomp.c b/third_party/spanner_pg/src/backend/regex/regcomp.c index 7a8cf891..bdcf6447 100644 --- a/third_party/spanner_pg/src/backend/regex/regcomp.c +++ b/third_party/spanner_pg/src/backend/regex/regcomp.c @@ -65,7 +65,7 @@ static struct subre *subre(struct vars *, int, int, struct state *, struct state static void freesubre(struct vars *, struct subre *); static void freesubreandsiblings(struct vars *, struct subre *); static void freesrnode(struct vars *, struct subre *); -static void optst(struct vars *, struct subre *); +static void removecaptures(struct vars *, struct subre *); static int numst(struct subre *, int); static void markst(struct subre *); static void cleanst(struct vars *); @@ -473,7 +473,8 @@ pg_regcomp(regex_t *re, dumpst(v->tree, debug, 1); } #endif - optst(v, v->tree); + if (v->cflags & REG_NOSUB) + removecaptures(v, v->tree); v->ntree = numst(v->tree, 1); markst(v->tree); cleanst(v); @@ -1069,14 +1070,16 @@ parseqatom_SPANGRES_WRAPPED(struct vars *v, break; case BACKREF: /* the Feature From The Black Lagoon */ INSIST(type != LACON, REG_ESUBREG); - INSIST(v->nextvalue < v->nsubs, REG_ESUBREG); - INSIST(v->subs[v->nextvalue] != NULL, REG_ESUBREG); + subno = v->nextvalue; + assert(subno > 0); + INSIST(subno < v->nsubs, REG_ESUBREG); + NOERRN(); + INSIST(v->subs[subno] != NULL, REG_ESUBREG); NOERRN(); - assert(v->nextvalue > 0); atom = subre(v, 'b', BACKR, lp, rp); NOERRN(); - subno = v->nextvalue; atom->backno = subno; + v->subs[subno]->flags |= BRUSE; EMPTYARC(lp, rp); /* temporarily, so there's something */ NEXT(); break; @@ -2211,19 +2214,54 @@ freesrnode(struct vars *v, /* might be NULL */ } /* - * optst - optimize a subRE subtree + * removecaptures - remove unnecessary capture subREs + * + * If the caller said that it doesn't care about subexpression match data, + * we may delete the "capture" markers on subREs that are not referenced + * by any backrefs, and then simplify anything that's become non-messy. + * Call this only if REG_NOSUB flag is set. */ static void -optst(struct vars *v, - struct subre *t) +removecaptures(struct vars *v, + struct subre *t) { + struct subre *t2; + + assert(t != NULL); + + /* + * If this isn't itself a backref target, clear capno and tentatively + * clear CAP flag. + */ + if (!(t->flags & BRUSE)) + { + t->capno = 0; + t->flags &= ~CAP; + } + + /* Now recurse to children */ + for (t2 = t->child; t2 != NULL; t2 = t2->sibling) + { + removecaptures(v, t2); + /* Propagate child CAP flag back up, if it's still set */ + if (t2->flags & CAP) + t->flags |= CAP; + } + /* - * DGP (2007-11-13): I assume it was the programmer's intent to eventually - * come back and add code to optimize subRE trees, but the routine coded - * just spends effort traversing the tree and doing nothing. We can do - * nothing with less effort. + * If t now contains neither captures nor backrefs, there's no longer any + * need to care where its sub-match boundaries are, so we can reduce it to + * a simple DFA node. (Note in particular that MIXED child greediness is + * not a hindrance here, so we don't use the MESSY() macro.) */ - return; + if ((t->flags & (CAP | BACKR)) == 0) + { + if (t->child) + freesubreandsiblings(v, t->child); + t->child = NULL; + t->op = '='; + t->flags &= ~MIXED; + } } /* @@ -2571,6 +2609,8 @@ stdump(struct subre *t, fprintf(f, " hascapture"); if (t->flags & BACKR) fprintf(f, " hasbackref"); + if (t->flags & BRUSE) + fprintf(f, " isreferenced"); if (!(t->flags & INUSE)) fprintf(f, " UNUSED"); if (t->latype != (char) -1) diff --git a/third_party/spanner_pg/src/backend/regex/regexec.c b/third_party/spanner_pg/src/backend/regex/regexec.c index 1178c5f5..57a92d3b 100644 --- a/third_party/spanner_pg/src/backend/regex/regexec.c +++ b/third_party/spanner_pg/src/backend/regex/regexec.c @@ -223,25 +223,30 @@ pg_regexec(regex_t *re, return REG_NOMATCH; backref = (v->g->info & REG_UBACKREF) ? 1 : 0; v->eflags = flags; - if (v->g->cflags & REG_NOSUB) - nmatch = 0; /* override client */ - v->nmatch = nmatch; - if (backref) + if (backref && nmatch <= v->g->nsub) { - /* need work area */ - if (v->g->nsub + 1 <= LOCALMAT) + /* need larger work area */ + v->nmatch = v->g->nsub + 1; + if (v->nmatch <= LOCALMAT) v->pmatch = mat; else - v->pmatch = (regmatch_t *) MALLOC((v->g->nsub + 1) * - sizeof(regmatch_t)); + v->pmatch = (regmatch_t *) MALLOC(v->nmatch * sizeof(regmatch_t)); if (v->pmatch == NULL) return REG_ESPACE; - v->nmatch = v->g->nsub + 1; + zapallsubs(v->pmatch, v->nmatch); } else + { + /* we can store results directly in caller's array */ v->pmatch = pmatch; - if (v->nmatch > 0) - zapallsubs(v->pmatch, v->nmatch); + /* ensure any extra entries in caller's array are filled with -1 */ + if (nmatch > 0) + zapallsubs(pmatch, nmatch); + /* then forget about extra entries, to avoid useless work in find() */ + if (nmatch > v->g->nsub + 1) + nmatch = v->g->nsub + 1; + v->nmatch = nmatch; + } v->details = details; v->start = (chr *) string; v->search_start = (chr *) string + search_start; @@ -302,12 +307,20 @@ pg_regexec(regex_t *re, else st = find(v, &v->g->tree->cnfa, &v->g->cmap); - /* copy (portion of) match vector over if necessary */ - if (st == REG_OKAY && v->pmatch != pmatch && nmatch > 0) + /* on success, ensure caller's match vector is filled correctly */ + if (st == REG_OKAY && nmatch > 0) { - zapallsubs(pmatch, nmatch); - n = (nmatch < v->nmatch) ? nmatch : v->nmatch; - memcpy(VS(pmatch), VS(v->pmatch), n * sizeof(regmatch_t)); + if (v->pmatch != pmatch) + { + /* copy portion of match vector over from (larger) work area */ + assert(nmatch <= v->nmatch); + memcpy(VS(pmatch), VS(v->pmatch), nmatch * sizeof(regmatch_t)); + } + if (v->g->cflags & REG_NOSUB) + { + /* don't expose possibly-partial sub-match results to caller */ + zapallsubs(pmatch, nmatch); + } } /* clean up */ @@ -788,7 +801,6 @@ cdissect_SPANGRES_WRAPPED(struct vars *v, break; case '(': /* no-op capture node */ assert(t->child != NULL); - assert(t->capno > 0); er = cdissect(v, t->child, begin, end); break; default: diff --git a/third_party/spanner_pg/src/backend/regex/regexport.c b/third_party/spanner_pg/src/backend/regex/regexport.c index a493dbe8..04bbe0ee 100644 --- a/third_party/spanner_pg/src/backend/regex/regexport.c +++ b/third_party/spanner_pg/src/backend/regex/regexport.c @@ -15,7 +15,7 @@ * allows the caller to decide how big is too big to bother with. * * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/regex/regprefix.c b/third_party/spanner_pg/src/backend/regex/regprefix.c index ec435b6f..4a7794c3 100644 --- a/third_party/spanner_pg/src/backend/regex/regprefix.c +++ b/third_party/spanner_pg/src/backend/regex/regprefix.c @@ -4,7 +4,7 @@ * Extract a common prefix, if any, from a compiled regex. * * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/backend/replication/BUILD b/third_party/spanner_pg/src/backend/replication/BUILD index ea91037e..c63a9282 100644 --- a/third_party/spanner_pg/src/backend/replication/BUILD +++ b/third_party/spanner_pg/src/backend/replication/BUILD @@ -52,8 +52,6 @@ licenses(["notice"]) cc_library( name = "replication", srcs = [ - "backup_manifest.c", - "basebackup.c", "repl_gram.c", "slot.c", "slotfuncs.c", @@ -77,6 +75,7 @@ cc_library( "syncrep_gram.h", ], deps = [ + "//third_party/spanner_pg/src/backend/backup", "//third_party/spanner_pg/src/include", ], alwayslink = 1, diff --git a/third_party/spanner_pg/src/backend/replication/Makefile b/third_party/spanner_pg/src/backend/replication/Makefile index a0381e52..2bffac58 100644 --- a/third_party/spanner_pg/src/backend/replication/Makefile +++ b/third_party/spanner_pg/src/backend/replication/Makefile @@ -15,8 +15,6 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) OBJS = \ - backup_manifest.o \ - basebackup.o \ repl_gram.o \ slot.o \ slotfuncs.o \ diff --git a/third_party/spanner_pg/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/third_party/spanner_pg/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 4c37d449..ed31dbd3 100644 --- a/third_party/spanner_pg/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/third_party/spanner_pg/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -6,7 +6,7 @@ * loaded as a dynamic module to avoid linking the main server binary with * libpq. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -75,6 +75,7 @@ static void libpqrcv_send(WalReceiverConn *conn, const char *buffer, static char *libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, bool temporary, + bool two_phase, CRSSnapshotAction snapshot_action, XLogRecPtr *lsn); static pid_t libpqrcv_get_backend_pid(WalReceiverConn *conn); @@ -129,8 +130,8 @@ libpqrcv_connect(const char *conninfo, bool logical, const char *appname, { WalReceiverConn *conn; PostgresPollingStatusType status; - const char *keys[5]; - const char *vals[5]; + const char *keys[6]; + const char *vals[6]; int i = 0; /* @@ -154,8 +155,20 @@ libpqrcv_connect(const char *conninfo, bool logical, const char *appname, vals[i] = appname; if (logical) { + /* Tell the publisher to translate to our encoding */ keys[++i] = "client_encoding"; vals[i] = GetDatabaseEncodingName(); + + /* + * Force assorted GUC parameters to settings that ensure that the + * publisher will output data values in a form that is unambiguous to + * the subscriber. (We don't want to modify the subscriber's GUC + * settings, since that might surprise user-defined code running in + * the subscriber, such as triggers.) This should match what pg_dump + * does. + */ + keys[++i] = "options"; + vals[i] = "-c datestyle=ISO -c intervalstyle=postgres -c extra_float_digits=3"; } keys[++i] = NULL; vals[i] = NULL; @@ -362,6 +375,10 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli) "the primary server: %s", pchomp(PQerrorMessage(conn->streamConn))))); } + /* + * IDENTIFY_SYSTEM returns 3 columns in 9.3 and earlier, and 4 columns in + * 9.4 and onwards. + */ if (PQnfields(res) < 3 || PQntuples(res) != 1) { int ntuples = PQntuples(res); @@ -372,7 +389,7 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("invalid response from primary server"), errdetail("Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields.", - ntuples, nfields, 3, 1))); + ntuples, nfields, 1, 3))); } primary_sysid = pstrdup(PQgetvalue(res, 0, 0)); *primary_tli = pg_strtoint32(PQgetvalue(res, 0, 1)); @@ -442,6 +459,10 @@ libpqrcv_startstreaming(WalReceiverConn *conn, PQserverVersion(conn->streamConn) >= 140000) appendStringInfoString(&cmd, ", streaming 'on'"); + if (options->proto.logical.twophase && + PQserverVersion(conn->streamConn) >= 150000) + appendStringInfoString(&cmd, ", two_phase 'on'"); + pubnames = options->proto.logical.publication_names; pubnames_str = stringlist_to_identifierstr(conn->streamConn, pubnames); if (!pubnames_str) @@ -857,12 +878,15 @@ libpqrcv_send(WalReceiverConn *conn, const char *buffer, int nbytes) */ static char * libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, - bool temporary, CRSSnapshotAction snapshot_action, + bool temporary, bool two_phase, CRSSnapshotAction snapshot_action, XLogRecPtr *lsn) { PGresult *res; StringInfoData cmd; char *snapshot; + int use_new_options_syntax; + + use_new_options_syntax = (PQserverVersion(conn->streamConn) >= 150000); initStringInfo(&cmd); @@ -873,23 +897,58 @@ libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, if (conn->logical) { - appendStringInfoString(&cmd, " LOGICAL pgoutput"); - switch (snapshot_action) + appendStringInfoString(&cmd, " LOGICAL pgoutput "); + if (use_new_options_syntax) + appendStringInfoChar(&cmd, '('); + if (two_phase) + { + appendStringInfoString(&cmd, "TWO_PHASE"); + if (use_new_options_syntax) + appendStringInfoString(&cmd, ", "); + else + appendStringInfoChar(&cmd, ' '); + } + + if (use_new_options_syntax) + { + switch (snapshot_action) + { + case CRS_EXPORT_SNAPSHOT: + appendStringInfoString(&cmd, "SNAPSHOT 'export'"); + break; + case CRS_NOEXPORT_SNAPSHOT: + appendStringInfoString(&cmd, "SNAPSHOT 'nothing'"); + break; + case CRS_USE_SNAPSHOT: + appendStringInfoString(&cmd, "SNAPSHOT 'use'"); + break; + } + } + else { - case CRS_EXPORT_SNAPSHOT: - appendStringInfoString(&cmd, " EXPORT_SNAPSHOT"); - break; - case CRS_NOEXPORT_SNAPSHOT: - appendStringInfoString(&cmd, " NOEXPORT_SNAPSHOT"); - break; - case CRS_USE_SNAPSHOT: - appendStringInfoString(&cmd, " USE_SNAPSHOT"); - break; + switch (snapshot_action) + { + case CRS_EXPORT_SNAPSHOT: + appendStringInfoString(&cmd, "EXPORT_SNAPSHOT"); + break; + case CRS_NOEXPORT_SNAPSHOT: + appendStringInfoString(&cmd, "NOEXPORT_SNAPSHOT"); + break; + case CRS_USE_SNAPSHOT: + appendStringInfoString(&cmd, "USE_SNAPSHOT"); + break; + } } + + if (use_new_options_syntax) + appendStringInfoChar(&cmd, ')'); } else { - appendStringInfoString(&cmd, " PHYSICAL RESERVE_WAL"); + if (use_new_options_syntax) + appendStringInfoString(&cmd, " PHYSICAL (RESERVE_WAL)"); + else + appendStringInfoString(&cmd, " PHYSICAL RESERVE_WAL"); } res = libpqrcv_PQexec(conn->streamConn, cmd.data); diff --git a/third_party/spanner_pg/src/backend/replication/logical/decode.c b/third_party/spanner_pg/src/backend/replication/logical/decode.c index 1c0058fc..bc7cbb25 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/decode.c +++ b/third_party/spanner_pg/src/backend/replication/logical/decode.c @@ -16,7 +16,7 @@ * contents of records in here except turning them into a more usable * format. * - * 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 * * IDENTIFICATION @@ -43,21 +43,6 @@ #include "replication/snapbuild.h" #include "storage/standby.h" -typedef struct XLogRecordBuffer -{ - XLogRecPtr origptr; - XLogRecPtr endptr; - XLogReaderState *record; -} XLogRecordBuffer; - -/* RMGR Handlers */ -static void DecodeXLogOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -static void DecodeHeapOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -static void DecodeHeap2Op(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -static void DecodeXactOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -static void DecodeStandbyOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); -static void DecodeLogicalMsgOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); - /* individual record(group)'s handlers */ static void DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); static void DecodeUpdate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); @@ -107,6 +92,7 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor { XLogRecordBuffer buf; TransactionId txid; + RmgrData rmgr; buf.origptr = ctx->reader->ReadRecPtr; buf.endptr = ctx->reader->EndRecPtr; @@ -123,76 +109,27 @@ LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *recor { ReorderBufferAssignChild(ctx->reorder, txid, - record->decoded_record->xl_xid, + XLogRecGetXid(record), buf.origptr); } - /* cast so we get a warning when new rmgrs are added */ - switch ((RmgrId) XLogRecGetRmid(record)) - { - /* - * Rmgrs we care about for logical decoding. Add new rmgrs in - * rmgrlist.h's order. - */ - case RM_XLOG_ID: - DecodeXLogOp(ctx, &buf); - break; - - case RM_XACT_ID: - DecodeXactOp(ctx, &buf); - break; + rmgr = GetRmgr(XLogRecGetRmid(record)); - case RM_STANDBY_ID: - DecodeStandbyOp(ctx, &buf); - break; - - case RM_HEAP2_ID: - DecodeHeap2Op(ctx, &buf); - break; - - case RM_HEAP_ID: - DecodeHeapOp(ctx, &buf); - break; - - case RM_LOGICALMSG_ID: - DecodeLogicalMsgOp(ctx, &buf); - break; - - /* - * Rmgrs irrelevant for logical decoding; they describe stuff not - * represented in logical decoding. Add new rmgrs in rmgrlist.h's - * order. - */ - case RM_SMGR_ID: - case RM_CLOG_ID: - case RM_DBASE_ID: - case RM_TBLSPC_ID: - case RM_MULTIXACT_ID: - case RM_RELMAP_ID: - case RM_BTREE_ID: - case RM_HASH_ID: - case RM_GIN_ID: - case RM_GIST_ID: - case RM_SEQ_ID: - case RM_SPGIST_ID: - case RM_BRIN_ID: - case RM_COMMIT_TS_ID: - case RM_REPLORIGIN_ID: - case RM_GENERIC_ID: - /* just deal with xid, and done */ - ReorderBufferProcessXid(ctx->reorder, XLogRecGetXid(record), - buf.origptr); - break; - case RM_NEXT_ID: - elog(ERROR, "unexpected RM_NEXT_ID rmgr_id: %u", (RmgrIds) XLogRecGetRmid(buf.record)); + if (rmgr.rm_decode != NULL) + rmgr.rm_decode(ctx, &buf); + else + { + /* just deal with xid, and done */ + ReorderBufferProcessXid(ctx->reorder, XLogRecGetXid(record), + buf.origptr); } } /* * Handle rmgr XLOG_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeXLogOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +xlog_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { SnapBuild *builder = ctx->snapshot_builder; uint8 info = XLogRecGetInfo(buf->record) & ~XLR_INFO_MASK; @@ -234,8 +171,8 @@ DecodeXLogOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * Handle rmgr XACT_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeXactOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +xact_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { SnapBuild *builder = ctx->snapshot_builder; ReorderBuffer *reorder = ctx->reorder; @@ -375,11 +312,10 @@ DecodeXactOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) * * XXX Now, this can even lead to a deadlock if the prepare * transaction is waiting to get it logically replicated for - * distributed 2PC. Currently, we don't have an in-core - * implementation of prepares for distributed 2PC but some - * out-of-core logical replication solution can have such an - * implementation. They need to inform users to not have locks - * on catalog tables in such transactions. + * distributed 2PC. This can be avoided by disallowing + * preparing transactions that have locked [user] catalog + * tables exclusively but as of now, we ask users not to do + * such an operation. */ DecodePrepare(ctx, buf, &parsed); break; @@ -392,8 +328,8 @@ DecodeXactOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * Handle rmgr STANDBY_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeStandbyOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +standby_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { SnapBuild *builder = ctx->snapshot_builder; XLogReaderState *r = buf->record; @@ -438,8 +374,8 @@ DecodeStandbyOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * Handle rmgr HEAP2_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeHeap2Op(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +heap2_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { uint8 info = XLogRecGetInfo(buf->record) & XLOG_HEAP_OPMASK; TransactionId xid = XLogRecGetXid(buf->record); @@ -498,8 +434,8 @@ DecodeHeap2Op(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * Handle rmgr HEAP_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeHeapOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +heap_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { uint8 info = XLogRecGetInfo(buf->record) & XLOG_HEAP_OPMASK; TransactionId xid = XLogRecGetXid(buf->record); @@ -562,7 +498,7 @@ DecodeHeapOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) if (!TransactionIdIsValid(xid)) break; - SnapBuildProcessChange(builder, xid, buf->origptr); + (void) SnapBuildProcessChange(builder, xid, buf->origptr); ReorderBufferXidSetCatalogChanges(ctx->reorder, xid, buf->origptr); break; @@ -620,8 +556,8 @@ FilterByOrigin(LogicalDecodingContext *ctx, RepOriginId origin_id) /* * Handle rmgr LOGICALMSG_ID records for DecodeRecordIntoReorderBuffer(). */ -static void -DecodeLogicalMsgOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) +void +logicalmsg_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) { SnapBuild *builder = ctx->snapshot_builder; XLogReaderState *r = buf->record; @@ -761,7 +697,7 @@ DecodeCommit(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, if (two_phase) { ReorderBufferFinishPrepared(ctx->reorder, xid, buf->origptr, buf->endptr, - SnapBuildInitialConsistentPoint(ctx->snapshot_builder), + SnapBuildGetTwoPhaseAt(ctx->snapshot_builder), commit_time, origin_id, origin_lsn, parsed->twophase_gid, true); } diff --git a/third_party/spanner_pg/src/backend/replication/logical/launcher.c b/third_party/spanner_pg/src/backend/replication/logical/launcher.c index 3c69817c..e88e30d4 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/launcher.c +++ b/third_party/spanner_pg/src/backend/replication/logical/launcher.c @@ -2,7 +2,7 @@ * launcher.c * PostgreSQL logical replication worker launcher process * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/launcher.c @@ -42,6 +42,7 @@ #include "storage/procarray.h" #include "storage/procsignal.h" #include "tcop/tcopprot.h" +#include "utils/builtins.h" #include "utils/memutils.h" #include "utils/pg_lsn.h" #include "utils/ps_status.h" @@ -65,7 +66,7 @@ typedef struct LogicalRepCtxStruct LogicalRepWorker workers[FLEXIBLE_ARRAY_MEMBER]; } LogicalRepCtxStruct; -LogicalRepCtxStruct *LogicalRepCtx; +static LogicalRepCtxStruct *LogicalRepCtx; static void ApplyLauncherWakeup(void); static void logicalrep_launcher_onexit(int code, Datum arg); @@ -75,8 +76,6 @@ static void logicalrep_worker_cleanup(LogicalRepWorker *worker); static bool on_commit_launcher_wakeup = false; -Datum pg_stat_get_subscription(PG_FUNCTION_ARGS); - /* * Load the list of subscriptions. @@ -344,9 +343,9 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, } /* - * 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. + * 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 (OidIsValid(relid) && nsyncworkers >= max_sync_workers_per_subscription) { @@ -379,6 +378,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, worker->relid = relid; worker->relstate = SUBREL_STATE_UNKNOWN; worker->relstate_lsn = InvalidXLogRecPtr; + worker->stream_fileset = NULL; worker->last_lsn = InvalidXLogRecPtr; TIMESTAMP_NOBEGIN(worker->last_send_time); TIMESTAMP_NOBEGIN(worker->last_recv_time); @@ -648,6 +648,10 @@ logicalrep_worker_onexit(int code, Datum arg) logicalrep_worker_detach(); + /* Cleanup fileset used for streaming transactions. */ + if (MyLogicalRepWorker->stream_fileset != NULL) + FileSetDeleteAll(MyLogicalRepWorker->stream_fileset); + ApplyLauncherWakeup(); } @@ -925,34 +929,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); + InitMaterializedSRF(fcinfo, 0); /* Make sure we get consistent view of the workers. */ LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); @@ -1005,7 +983,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, @@ -1017,8 +996,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/third_party/spanner_pg/src/backend/replication/logical/logical.c b/third_party/spanner_pg/src/backend/replication/logical/logical.c index f7d14919..466f30c2 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/logical.c +++ b/third_party/spanner_pg/src/backend/replication/logical/logical.c @@ -2,7 +2,7 @@ * logical.c * PostgreSQL logical decoding coordination * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/logical.c @@ -202,12 +202,13 @@ StartupDecodingContext(List *output_plugin_options, if (!ctx->reader) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"))); + errmsg("out of memory"), + errdetail("Failed while allocating a WAL reading processor."))); ctx->reorder = ReorderBufferAllocate(); ctx->snapshot_builder = AllocateSnapshotBuilder(ctx->reorder, xmin_horizon, start_lsn, - need_full_snapshot, slot->data.initial_consistent_point); + need_full_snapshot, slot->data.two_phase_at); ctx->reorder->private_data = ctx; @@ -432,10 +433,12 @@ CreateInitDecodingContext(const char *plugin, MemoryContextSwitchTo(old_context); /* - * We allow decoding of prepared transactions iff the two_phase option is - * enabled at the time of slot creation. + * We allow decoding of prepared transactions when the two_phase is + * enabled at the time of slot creation, or when the two_phase option is + * given at the streaming start, provided the plugin supports all the + * callbacks for two-phase. */ - ctx->twophase &= MyReplicationSlot->data.two_phase; + ctx->twophase &= slot->data.two_phase; ctx->reorder->output_rewrites = ctx->options.receive_rewrites; @@ -518,8 +521,12 @@ CreateDecodingContext(XLogRecPtr start_lsn, * xlog records didn't result in anything relevant for logical * decoding. Clients have to be able to do that to support synchronous * replication. + * + * 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. */ - elog(DEBUG1, "cannot stream from %X/%X, minimum is %X/%X, forwarding", + elog(LOG, "%X/%X has been already streamed, forwarding to %X/%X", LSN_FORMAT_ARGS(start_lsn), LSN_FORMAT_ARGS(slot->data.confirmed_flush)); @@ -538,10 +545,24 @@ CreateDecodingContext(XLogRecPtr start_lsn, MemoryContextSwitchTo(old_context); /* - * We allow decoding of prepared transactions iff the two_phase option is - * enabled at the time of slot creation. + * We allow decoding of prepared transactions when the two_phase is + * enabled at the time of slot creation, or when the two_phase option is + * given at the streaming start, provided the plugin supports all the + * callbacks for two-phase. */ - ctx->twophase &= MyReplicationSlot->data.two_phase; + ctx->twophase &= (slot->data.two_phase || ctx->twophase_opt_given); + + /* Mark slot to allow two_phase decoding if not already marked */ + if (ctx->twophase && !slot->data.two_phase) + { + SpinLockAcquire(&slot->mutex); + slot->data.two_phase = true; + slot->data.two_phase_at = start_lsn; + SpinLockRelease(&slot->mutex); + ReplicationSlotMarkDirty(); + ReplicationSlotSave(); + SnapBuildSetTwoPhaseAt(ctx->snapshot_builder, start_lsn); + } ctx->reorder->output_rewrites = ctx->options.receive_rewrites; @@ -587,9 +608,9 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx) /* the read_page callback waits for new WAL */ record = XLogReadRecord(ctx->reader, &err); if (err) - elog(ERROR, "%s", err); + elog(ERROR, "could not find logical decoding starting point: %s", err); if (!record) - elog(ERROR, "no record found"); /* shouldn't happen */ + elog(ERROR, "could not find logical decoding starting point"); LogicalDecodingProcessRecord(ctx, ctx->reader); @@ -602,7 +623,8 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx) SpinLockAcquire(&slot->mutex); slot->data.confirmed_flush = ctx->reader->EndRecPtr; - slot->data.initial_consistent_point = ctx->reader->EndRecPtr; + if (slot->data.two_phase) + slot->data.two_phase_at = ctx->reader->EndRecPtr; SpinLockRelease(&slot->mutex); } @@ -652,12 +674,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); } /* @@ -1041,7 +1065,7 @@ change_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this change's lsn so replies from clients can give an up2date + * Report this change's lsn so replies from clients can give an up-to-date * answer. This won't ever be enough (and shouldn't be!) to confirm * receipt of this transaction, but it might allow another transaction's * commit to be confirmed with one message. @@ -1083,7 +1107,7 @@ truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this change's lsn so replies from clients can give an up2date + * Report this change's lsn so replies from clients can give an up-to-date * answer. This won't ever be enough (and shouldn't be!) to confirm * receipt of this transaction, but it might allow another transaction's * commit to be confirmed with one message. @@ -1225,10 +1249,10 @@ stream_start_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this message's lsn so replies from clients can give an up2date - * answer. This won't ever be enough (and shouldn't be!) to confirm - * receipt of this transaction, but it might allow another transaction's - * commit to be confirmed with one message. + * Report this message's lsn so replies from clients can give an + * up-to-date answer. This won't ever be enough (and shouldn't be!) to + * confirm receipt of this transaction, but it might allow another + * transaction's commit to be confirmed with one message. */ ctx->write_location = first_lsn; @@ -1274,10 +1298,10 @@ stream_stop_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this message's lsn so replies from clients can give an up2date - * answer. This won't ever be enough (and shouldn't be!) to confirm - * receipt of this transaction, but it might allow another transaction's - * commit to be confirmed with one message. + * Report this message's lsn so replies from clients can give an + * up-to-date answer. This won't ever be enough (and shouldn't be!) to + * confirm receipt of this transaction, but it might allow another + * transaction's commit to be confirmed with one message. */ ctx->write_location = last_lsn; @@ -1450,7 +1474,7 @@ stream_change_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this change's lsn so replies from clients can give an up2date + * Report this change's lsn so replies from clients can give an up-to-date * answer. This won't ever be enough (and shouldn't be!) to confirm * receipt of this transaction, but it might allow another transaction's * commit to be confirmed with one message. @@ -1545,7 +1569,7 @@ stream_truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, ctx->write_xid = txn->xid; /* - * report this change's lsn so replies from clients can give an up2date + * Report this change's lsn so replies from clients can give an up-to-date * answer. This won't ever be enough (and shouldn't be!) to confirm * receipt of this transaction, but it might allow another transaction's * commit to be confirmed with one message. @@ -1573,6 +1597,7 @@ LogicalIncreaseXminForSlot(XLogRecPtr current_lsn, TransactionId xmin) { bool updated_xmin = false; ReplicationSlot *slot; + bool got_new_xmin = false; slot = MyReplicationSlot; @@ -1610,9 +1635,19 @@ LogicalIncreaseXminForSlot(XLogRecPtr current_lsn, TransactionId xmin) { slot->candidate_catalog_xmin = xmin; slot->candidate_xmin_lsn = current_lsn; + + /* + * Log new xmin at an appropriate log level after releasing the + * spinlock. + */ + got_new_xmin = true; } SpinLockRelease(&slot->mutex); + if (got_new_xmin) + elog(DEBUG1, "got new catalog xmin %u at %X/%X", xmin, + LSN_FORMAT_ARGS(current_lsn)); + /* candidate already valid with the current flush position, apply */ if (updated_xmin) LogicalConfirmReceivedLocation(slot->data.confirmed_flush); @@ -1817,7 +1852,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; @@ -1827,7 +1861,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/third_party/spanner_pg/src/backend/replication/logical/logicalfuncs.c b/third_party/spanner_pg/src/backend/replication/logical/logicalfuncs.c index 1f38c5b3..dc29b6c6 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/logicalfuncs.c +++ b/third_party/spanner_pg/src/backend/replication/logical/logicalfuncs.c @@ -6,10 +6,10 @@ * logical replication slots via SQL. * * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/replication/logicalfuncs.c + * src/backend/replication/logical/logicalfuncs.c *------------------------------------------------------------------------- */ @@ -19,6 +19,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/pg_type.h" #include "fmgr.h" @@ -39,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; @@ -95,15 +96,6 @@ LogicalOutputWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xi p->returned_rows++; } -static void -check_permissions(void) -{ - if (!superuser() && !has_rolreplication(GetUserId())) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser or replication role to use replication slots"))); -} - /* * Helper function for the various SQL callable logical decoding functions. */ @@ -124,7 +116,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin List *options = NIL; DecodingOutputState *p; - check_permissions(); + CheckSlotPermissions(); CheckLogicalDecodingRequirements(); @@ -150,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); @@ -211,19 +189,17 @@ 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; + InitMaterializedSRF(fcinfo, 0); + p->tupstore = rsinfo->setResult; + p->tupdesc = rsinfo->setDesc; /* - * Compute the current end-of-wal and maintain ThisTimeLineID. - * RecoveryInProgress() will update ThisTimeLineID on promotion. + * Compute the current end-of-wal. */ if (!RecoveryInProgress()) - end_of_wal = GetFlushRecPtr(); + end_of_wal = GetFlushRecPtr(NULL); else - end_of_wal = GetXLogReplayRecPtr(&ThisTimeLineID); + end_of_wal = GetXLogReplayRecPtr(NULL); ReplicationSlotAcquire(NameStr(*name), true); @@ -286,7 +262,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin record = XLogReadRecord(ctx->reader, &errm); if (errm) - elog(ERROR, "%s", errm); + elog(ERROR, "could not find record for logical decoding: %s", errm); /* * The {begin_txn,change,commit_txn}_wrapper callbacks above will @@ -305,8 +281,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/third_party/spanner_pg/src/backend/replication/logical/message.c b/third_party/spanner_pg/src/backend/replication/logical/message.c index 93bd3724..1c349126 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/message.c +++ b/third_party/spanner_pg/src/backend/replication/logical/message.c @@ -3,7 +3,7 @@ * message.c * Generic logical messages. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/message.c @@ -32,6 +32,7 @@ #include "postgres.h" #include "access/xact.h" +#include "access/xloginsert.h" #include "miscadmin.h" #include "nodes/execnodes.h" #include "replication/logical.h" diff --git a/third_party/spanner_pg/src/backend/replication/logical/origin.c b/third_party/spanner_pg/src/backend/replication/logical/origin.c index 6988840f..cd860076 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/origin.c +++ b/third_party/spanner_pg/src/backend/replication/logical/origin.c @@ -3,7 +3,7 @@ * origin.c * Logical replication progress tracking support. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/origin.c @@ -74,6 +74,7 @@ #include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" +#include "access/xloginsert.h" #include "catalog/catalog.h" #include "catalog/indexing.h" #include "funcapi.h" @@ -191,7 +192,6 @@ replorigin_check_prerequisites(bool check_slots, bool recoveryOK) ereport(ERROR, (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION), errmsg("cannot manipulate replication origins during recovery"))); - } @@ -316,7 +316,7 @@ replorigin_create(const char *roname) if (tuple == NULL) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("could not find free replication origin OID"))); + errmsg("could not find free replication origin ID"))); heap_freetuple(tuple); return roident; @@ -352,7 +352,7 @@ replorigin_drop_guts(Relation rel, RepOriginId roident, bool nowait) if (nowait) ereport(ERROR, (errcode(ERRCODE_OBJECT_IN_USE), - errmsg("could not drop replication origin with OID %d, in use by PID %d", + errmsg("could not drop replication origin with ID %d, in use by PID %d", state->roident, state->acquired_by))); @@ -396,7 +396,7 @@ replorigin_drop_guts(Relation rel, RepOriginId roident, bool nowait) */ tuple = SearchSysCache1(REPLORIGIDENT, ObjectIdGetDatum(roident)); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "cache lookup failed for replication origin with oid %u", + elog(ERROR, "cache lookup failed for replication origin with ID %d", roident); CatalogTupleDelete(rel, &tuple->t_self); @@ -473,7 +473,7 @@ replorigin_by_oid(RepOriginId roident, bool missing_ok, char **roname) if (!missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("replication origin with OID %u does not exist", + errmsg("replication origin with ID %d does not exist", roident))); return false; @@ -787,7 +787,7 @@ StartupReplicationOrigin(void) last_state++; ereport(LOG, - (errmsg("recovered replication state of node %u to %X/%X", + (errmsg("recovered replication state of node %d to %X/%X", disk_state.roident, LSN_FORMAT_ARGS(disk_state.remote_lsn)))); } @@ -925,7 +925,7 @@ replorigin_advance(RepOriginId node, { ereport(ERROR, (errcode(ERRCODE_OBJECT_IN_USE), - errmsg("replication origin with OID %d is already active for PID %d", + errmsg("replication origin with ID %d is already active for PID %d", replication_state->roident, replication_state->acquired_by))); } @@ -936,7 +936,7 @@ replorigin_advance(RepOriginId node, if (replication_state == NULL && free_state == NULL) ereport(ERROR, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), - errmsg("could not find free replication state slot for replication origin with OID %u", + errmsg("could not find free replication state slot for replication origin with ID %d", node), errhint("Increase max_replication_slots and try again."))); @@ -973,8 +973,11 @@ replorigin_advance(RepOriginId node, /* * Due to - harmless - race conditions during a checkpoint we could see - * values here that are older than the ones we already have in memory. - * Don't overwrite those. + * values here that are older than the ones we already have in memory. We + * could also see older values for prepared transactions when the prepare + * is sent at a later point of time along with commit prepared and there + * are other transactions commits between prepare and commit prepared. See + * ReorderBufferFinishPrepared. Don't overwrite those. */ if (go_backward || replication_state->remote_lsn < remote_commit) replication_state->remote_lsn = remote_commit; @@ -1056,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(). * @@ -1111,7 +1114,7 @@ replorigin_session_setup(RepOriginId node) { ereport(ERROR, (errcode(ERRCODE_OBJECT_IN_USE), - errmsg("replication origin with OID %d is already active for PID %d", + errmsg("replication origin with ID %d is already active for PID %d", curstate->roident, curstate->acquired_by))); } @@ -1123,7 +1126,7 @@ replorigin_session_setup(RepOriginId node) if (session_replication_state == NULL && free_slot == -1) ereport(ERROR, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), - errmsg("could not find free replication state slot for replication origin with OID %u", + errmsg("could not find free replication state slot for replication origin with ID %d", node), errhint("Increase max_replication_slots and try again."))); else if (session_replication_state == NULL) @@ -1478,40 +1481,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); - + InitMaterializedSRF(fcinfo, 0); /* prevent slots from being concurrently dropped */ LWLockAcquire(ReplicationOriginLock, LW_SHARED); @@ -1561,11 +1537,10 @@ 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); } - tuplestore_donestoring(tupstore); - LWLockRelease(ReplicationOriginLock); #undef REPLICATION_ORIGIN_PROGRESS_COLS diff --git a/third_party/spanner_pg/src/backend/replication/logical/proto.c b/third_party/spanner_pg/src/backend/replication/logical/proto.c index 1cf59e0f..a041937c 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/proto.c +++ b/third_party/spanner_pg/src/backend/replication/logical/proto.c @@ -3,7 +3,7 @@ * proto.c * logical replication protocol functions * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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, - HeapTuple tuple, bool binary); - + TupleTableSlot *slot, + 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. */ @@ -49,7 +63,7 @@ logicalrep_write_begin(StringInfo out, ReorderBufferTXN *txn) /* fixed fields */ pq_sendint64(out, txn->final_lsn); - pq_sendint64(out, txn->commit_time); + pq_sendint64(out, txn->xact_time.commit_time); pq_sendint32(out, txn->xid); } @@ -85,7 +99,7 @@ logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn, /* send fields */ pq_sendint64(out, commit_lsn); pq_sendint64(out, txn->end_lsn); - pq_sendint64(out, txn->commit_time); + pq_sendint64(out, txn->xact_time.commit_time); } /* @@ -106,6 +120,264 @@ logicalrep_read_commit(StringInfo in, LogicalRepCommitData *commit_data) commit_data->committime = pq_getmsgint64(in); } +/* + * Write BEGIN PREPARE to the output stream. + */ +void +logicalrep_write_begin_prepare(StringInfo out, ReorderBufferTXN *txn) +{ + pq_sendbyte(out, LOGICAL_REP_MSG_BEGIN_PREPARE); + + /* fixed fields */ + pq_sendint64(out, txn->final_lsn); + pq_sendint64(out, txn->end_lsn); + pq_sendint64(out, txn->xact_time.prepare_time); + pq_sendint32(out, txn->xid); + + /* send gid */ + pq_sendstring(out, txn->gid); +} + +/* + * Read transaction BEGIN PREPARE from the stream. + */ +void +logicalrep_read_begin_prepare(StringInfo in, LogicalRepPreparedTxnData *begin_data) +{ + /* read fields */ + begin_data->prepare_lsn = pq_getmsgint64(in); + if (begin_data->prepare_lsn == InvalidXLogRecPtr) + elog(ERROR, "prepare_lsn not set in begin prepare message"); + begin_data->end_lsn = pq_getmsgint64(in); + if (begin_data->end_lsn == InvalidXLogRecPtr) + elog(ERROR, "end_lsn not set in begin prepare message"); + begin_data->prepare_time = pq_getmsgint64(in); + begin_data->xid = pq_getmsgint(in, 4); + + /* read gid (copy it into a pre-allocated buffer) */ + strlcpy(begin_data->gid, pq_getmsgstring(in), sizeof(begin_data->gid)); +} + +/* + * The core functionality for logicalrep_write_prepare and + * logicalrep_write_stream_prepare. + */ +static void +logicalrep_write_prepare_common(StringInfo out, LogicalRepMsgType type, + ReorderBufferTXN *txn, XLogRecPtr prepare_lsn) +{ + uint8 flags = 0; + + pq_sendbyte(out, type); + + /* + * This should only ever happen for two-phase commit transactions, in + * which case we expect to have a valid GID. + */ + Assert(txn->gid != NULL); + Assert(rbtxn_prepared(txn)); + Assert(TransactionIdIsValid(txn->xid)); + + /* send the flags field */ + pq_sendbyte(out, flags); + + /* send fields */ + pq_sendint64(out, prepare_lsn); + pq_sendint64(out, txn->end_lsn); + pq_sendint64(out, txn->xact_time.prepare_time); + pq_sendint32(out, txn->xid); + + /* send gid */ + pq_sendstring(out, txn->gid); +} + +/* + * Write PREPARE to the output stream. + */ +void +logicalrep_write_prepare(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn) +{ + logicalrep_write_prepare_common(out, LOGICAL_REP_MSG_PREPARE, + txn, prepare_lsn); +} + +/* + * The core functionality for logicalrep_read_prepare and + * logicalrep_read_stream_prepare. + */ +static void +logicalrep_read_prepare_common(StringInfo in, char *msgtype, + LogicalRepPreparedTxnData *prepare_data) +{ + /* read flags */ + uint8 flags = pq_getmsgbyte(in); + + if (flags != 0) + elog(ERROR, "unrecognized flags %u in %s message", flags, msgtype); + + /* read fields */ + prepare_data->prepare_lsn = pq_getmsgint64(in); + if (prepare_data->prepare_lsn == InvalidXLogRecPtr) + elog(ERROR, "prepare_lsn is not set in %s message", msgtype); + prepare_data->end_lsn = pq_getmsgint64(in); + if (prepare_data->end_lsn == InvalidXLogRecPtr) + elog(ERROR, "end_lsn is not set in %s message", msgtype); + prepare_data->prepare_time = pq_getmsgint64(in); + prepare_data->xid = pq_getmsgint(in, 4); + if (prepare_data->xid == InvalidTransactionId) + elog(ERROR, "invalid two-phase transaction ID in %s message", msgtype); + + /* read gid (copy it into a pre-allocated buffer) */ + strlcpy(prepare_data->gid, pq_getmsgstring(in), sizeof(prepare_data->gid)); +} + +/* + * Read transaction PREPARE from the stream. + */ +void +logicalrep_read_prepare(StringInfo in, LogicalRepPreparedTxnData *prepare_data) +{ + logicalrep_read_prepare_common(in, "prepare", prepare_data); +} + +/* + * Write COMMIT PREPARED to the output stream. + */ +void +logicalrep_write_commit_prepared(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr commit_lsn) +{ + uint8 flags = 0; + + pq_sendbyte(out, LOGICAL_REP_MSG_COMMIT_PREPARED); + + /* + * This should only ever happen for two-phase commit transactions, in + * which case we expect to have a valid GID. + */ + Assert(txn->gid != NULL); + + /* send the flags field */ + pq_sendbyte(out, flags); + + /* send fields */ + pq_sendint64(out, commit_lsn); + pq_sendint64(out, txn->end_lsn); + pq_sendint64(out, txn->xact_time.commit_time); + pq_sendint32(out, txn->xid); + + /* send gid */ + pq_sendstring(out, txn->gid); +} + +/* + * Read transaction COMMIT PREPARED from the stream. + */ +void +logicalrep_read_commit_prepared(StringInfo in, LogicalRepCommitPreparedTxnData *prepare_data) +{ + /* read flags */ + uint8 flags = pq_getmsgbyte(in); + + if (flags != 0) + elog(ERROR, "unrecognized flags %u in commit prepared message", flags); + + /* read fields */ + prepare_data->commit_lsn = pq_getmsgint64(in); + if (prepare_data->commit_lsn == InvalidXLogRecPtr) + elog(ERROR, "commit_lsn is not set in commit prepared message"); + prepare_data->end_lsn = pq_getmsgint64(in); + if (prepare_data->end_lsn == InvalidXLogRecPtr) + elog(ERROR, "end_lsn is not set in commit prepared message"); + prepare_data->commit_time = pq_getmsgint64(in); + prepare_data->xid = pq_getmsgint(in, 4); + + /* read gid (copy it into a pre-allocated buffer) */ + strlcpy(prepare_data->gid, pq_getmsgstring(in), sizeof(prepare_data->gid)); +} + +/* + * Write ROLLBACK PREPARED to the output stream. + */ +void +logicalrep_write_rollback_prepared(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr prepare_end_lsn, + TimestampTz prepare_time) +{ + uint8 flags = 0; + + pq_sendbyte(out, LOGICAL_REP_MSG_ROLLBACK_PREPARED); + + /* + * This should only ever happen for two-phase commit transactions, in + * which case we expect to have a valid GID. + */ + Assert(txn->gid != NULL); + + /* send the flags field */ + pq_sendbyte(out, flags); + + /* send fields */ + pq_sendint64(out, prepare_end_lsn); + pq_sendint64(out, txn->end_lsn); + pq_sendint64(out, prepare_time); + pq_sendint64(out, txn->xact_time.commit_time); + pq_sendint32(out, txn->xid); + + /* send gid */ + pq_sendstring(out, txn->gid); +} + +/* + * Read transaction ROLLBACK PREPARED from the stream. + */ +void +logicalrep_read_rollback_prepared(StringInfo in, + LogicalRepRollbackPreparedTxnData *rollback_data) +{ + /* read flags */ + uint8 flags = pq_getmsgbyte(in); + + if (flags != 0) + elog(ERROR, "unrecognized flags %u in rollback prepared message", flags); + + /* read fields */ + rollback_data->prepare_end_lsn = pq_getmsgint64(in); + if (rollback_data->prepare_end_lsn == InvalidXLogRecPtr) + elog(ERROR, "prepare_end_lsn is not set in rollback prepared message"); + rollback_data->rollback_end_lsn = pq_getmsgint64(in); + if (rollback_data->rollback_end_lsn == InvalidXLogRecPtr) + elog(ERROR, "rollback_end_lsn is not set in rollback prepared message"); + rollback_data->prepare_time = pq_getmsgint64(in); + rollback_data->rollback_time = pq_getmsgint64(in); + rollback_data->xid = pq_getmsgint(in, 4); + + /* read gid (copy it into a pre-allocated buffer) */ + strlcpy(rollback_data->gid, pq_getmsgstring(in), sizeof(rollback_data->gid)); +} + +/* + * Write STREAM PREPARE to the output stream. + */ +void +logicalrep_write_stream_prepare(StringInfo out, + ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn) +{ + logicalrep_write_prepare_common(out, LOGICAL_REP_MSG_STREAM_PREPARE, + txn, prepare_lsn); +} + +/* + * Read STREAM PREPARE from the stream. + */ +void +logicalrep_read_stream_prepare(StringInfo in, LogicalRepPreparedTxnData *prepare_data) +{ + logicalrep_read_prepare_common(in, "stream prepare", prepare_data); +} + /* * Write ORIGIN to the output stream. */ @@ -140,7 +412,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, Bitmapset *columns) { pq_sendbyte(out, LOGICAL_REP_MSG_INSERT); @@ -152,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, newtuple, binary); + logicalrep_write_tuple(out, rel, newslot, binary, columns); } /* @@ -184,7 +456,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, Bitmapset *columns) { pq_sendbyte(out, LOGICAL_REP_MSG_UPDATE); @@ -199,17 +472,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, columns); } pq_sendbyte(out, 'N'); /* new tuple follows */ - logicalrep_write_tuple(out, rel, newtuple, binary); + logicalrep_write_tuple(out, rel, newslot, binary, columns); } /* @@ -258,7 +531,8 @@ 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, + Bitmapset *columns) { Assert(rel->rd_rel->relreplident == REPLICA_IDENTITY_DEFAULT || rel->rd_rel->relreplident == REPLICA_IDENTITY_FULL || @@ -278,7 +552,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, columns); } /* @@ -393,7 +667,8 @@ logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn, * 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; @@ -415,7 +690,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); } /* @@ -491,11 +766,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, Bitmapset *columns) { TupleDesc desc; - Datum values[MaxTupleAttributeNumber]; - bool isnull[MaxTupleAttributeNumber]; + Datum *values; + bool *isnull; int i; uint16 nliveatts = 0; @@ -503,17 +779,21 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple, bool binar 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); - /* 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++) @@ -525,6 +805,9 @@ logicalrep_write_tuple(StringInfo out, Relation rel, HeapTuple tuple, bool binar if (att->attisdropped || att->attgenerated) continue; + if (!column_in_column_list(att->attnum, columns)) + continue; + if (isnull[i]) { pq_sendbyte(out, LOGICALREP_COLUMN_NULL); @@ -646,7 +929,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; @@ -659,8 +942,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); @@ -679,6 +968,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, @@ -816,7 +1108,7 @@ logicalrep_read_stream_start(StringInfo in, bool *first_segment) void logicalrep_write_stream_stop(StringInfo out) { - pq_sendbyte(out, LOGICAL_REP_MSG_STREAM_END); + pq_sendbyte(out, LOGICAL_REP_MSG_STREAM_STOP); } /* @@ -841,7 +1133,7 @@ logicalrep_write_stream_commit(StringInfo out, ReorderBufferTXN *txn, /* send fields */ pq_sendint64(out, commit_lsn); pq_sendint64(out, txn->end_lsn); - pq_sendint64(out, txn->commit_time); + pq_sendint64(out, txn->xact_time.commit_time); } /* @@ -898,3 +1190,63 @@ logicalrep_read_stream_abort(StringInfo in, TransactionId *xid, *xid = pq_getmsgint(in, 4); *subxid = pq_getmsgint(in, 4); } + +/* + * Get string representing LogicalRepMsgType. + */ +const char * +logicalrep_message_type(LogicalRepMsgType action) +{ + static char err_unknown[20]; + + switch (action) + { + case LOGICAL_REP_MSG_BEGIN: + return "BEGIN"; + case LOGICAL_REP_MSG_COMMIT: + return "COMMIT"; + case LOGICAL_REP_MSG_ORIGIN: + return "ORIGIN"; + case LOGICAL_REP_MSG_INSERT: + return "INSERT"; + case LOGICAL_REP_MSG_UPDATE: + return "UPDATE"; + case LOGICAL_REP_MSG_DELETE: + return "DELETE"; + case LOGICAL_REP_MSG_TRUNCATE: + return "TRUNCATE"; + case LOGICAL_REP_MSG_RELATION: + return "RELATION"; + case LOGICAL_REP_MSG_TYPE: + return "TYPE"; + case LOGICAL_REP_MSG_MESSAGE: + return "MESSAGE"; + case LOGICAL_REP_MSG_BEGIN_PREPARE: + return "BEGIN PREPARE"; + case LOGICAL_REP_MSG_PREPARE: + return "PREPARE"; + case LOGICAL_REP_MSG_COMMIT_PREPARED: + return "COMMIT PREPARED"; + case LOGICAL_REP_MSG_ROLLBACK_PREPARED: + return "ROLLBACK PREPARED"; + case LOGICAL_REP_MSG_STREAM_START: + return "STREAM START"; + case LOGICAL_REP_MSG_STREAM_STOP: + return "STREAM STOP"; + case LOGICAL_REP_MSG_STREAM_COMMIT: + return "STREAM COMMIT"; + case LOGICAL_REP_MSG_STREAM_ABORT: + return "STREAM ABORT"; + case LOGICAL_REP_MSG_STREAM_PREPARE: + return "STREAM PREPARE"; + } + + /* + * This message provides context in the error raised when applying a + * logical message. So we can't throw an error here. Return an unknown + * indicator value so that the original error is still reported. + */ + snprintf(err_unknown, sizeof(err_unknown), "??? (%d)", action); + + return err_unknown; +} diff --git a/third_party/spanner_pg/src/backend/replication/logical/relation.c b/third_party/spanner_pg/src/backend/replication/logical/relation.c index a5e5bf9f..e9890476 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/relation.c +++ b/third_party/spanner_pg/src/backend/replication/logical/relation.c @@ -2,7 +2,7 @@ * relation.c * PostgreSQL logical replication relation mapping cache * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/relation.c diff --git a/third_party/spanner_pg/src/backend/replication/logical/reorderbuffer.c b/third_party/spanner_pg/src/backend/replication/logical/reorderbuffer.c index 264c253a..3a68a393 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/reorderbuffer.c +++ b/third_party/spanner_pg/src/backend/replication/logical/reorderbuffer.c @@ -4,11 +4,11 @@ * PostgreSQL logical replay/reorder buffer management * * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * * IDENTIFICATION - * src/backend/replication/reorderbuffer.c + * src/backend/replication/logical/reorderbuffer.c * * NOTES * This module gets handed individual pieces of transactions in the order @@ -328,8 +328,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); @@ -639,8 +646,8 @@ ReorderBufferTXNByXid(ReorderBuffer *rb, TransactionId xid, bool create, } /* - * If the cache wasn't hit or it yielded a "does-not-exist" and we want - * to create an entry. + * If the cache wasn't hit or it yielded a "does-not-exist" and we want to + * create an entry. */ /* search the lookup table */ @@ -1572,7 +1579,7 @@ ReorderBufferCleanupTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) * streaming or decoding them at PREPARE. Keep the remaining info - * transactions, tuplecids, invalidations and snapshots. * - * We additionaly remove tuplecids after decoding the transaction at prepare + * We additionally remove tuplecids after decoding the transaction at prepare * time as we only need to perform invalidation at rollback or commit prepared. * * 'txn_prepared' indicates that we have decoded the transaction at prepare @@ -1893,7 +1900,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 @@ -2356,8 +2363,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; @@ -2605,7 +2611,7 @@ ReorderBufferReplay(ReorderBufferTXN *txn, txn->final_lsn = commit_lsn; txn->end_lsn = end_lsn; - txn->commit_time = commit_time; + txn->xact_time.commit_time = commit_time; txn->origin_id = origin_id; txn->origin_lsn = origin_lsn; @@ -2696,7 +2702,7 @@ ReorderBufferRememberPrepareInfo(ReorderBuffer *rb, TransactionId xid, */ txn->final_lsn = prepare_lsn; txn->end_lsn = end_lsn; - txn->commit_time = prepare_time; + txn->xact_time.prepare_time = prepare_time; txn->origin_id = origin_id; txn->origin_lsn = origin_lsn; @@ -2743,7 +2749,7 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, Assert(txn->final_lsn != InvalidXLogRecPtr); ReorderBufferReplay(txn, rb, xid, txn->final_lsn, txn->end_lsn, - txn->commit_time, txn->origin_id, txn->origin_lsn); + txn->xact_time.prepare_time, txn->origin_id, txn->origin_lsn); /* * We send the prepare for the concurrently aborted xacts so that later @@ -2763,7 +2769,7 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, void ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, - XLogRecPtr initial_consistent_point, + XLogRecPtr two_phase_at, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn, char *gid, bool is_commit) { @@ -2782,19 +2788,20 @@ ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, * be later used for rollback. */ prepare_end_lsn = txn->end_lsn; - prepare_time = txn->commit_time; + prepare_time = txn->xact_time.prepare_time; /* add the gid in the txn */ txn->gid = pstrdup(gid); /* * It is possible that this transaction is not decoded at prepare time - * either because by that time we didn't have a consistent snapshot or it - * was decoded earlier but we have restarted. We only need to send the - * prepare if it was not decoded earlier. We don't need to decode the xact - * for aborts if it is not done already. + * either because by that time we didn't have a consistent snapshot, or + * two_phase was not enabled, or it was decoded earlier but we have + * restarted. We only need to send the prepare if it was not decoded + * earlier. We don't need to decode the xact for aborts if it is not done + * already. */ - if ((txn->final_lsn < initial_consistent_point) && is_commit) + if ((txn->final_lsn < two_phase_at) && is_commit) { txn->txn_flags |= RBTXN_PREPARE; @@ -2812,12 +2819,12 @@ ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, * prepared after the restart. */ ReorderBufferReplay(txn, rb, xid, txn->final_lsn, txn->end_lsn, - txn->commit_time, txn->origin_id, txn->origin_lsn); + txn->xact_time.prepare_time, txn->origin_id, txn->origin_lsn); } txn->final_lsn = commit_lsn; txn->end_lsn = end_lsn; - txn->commit_time = commit_time; + txn->xact_time.commit_time = commit_time; txn->origin_id = origin_id; txn->origin_lsn = origin_lsn; diff --git a/third_party/spanner_pg/src/backend/replication/logical/snapbuild.c b/third_party/spanner_pg/src/backend/replication/logical/snapbuild.c index 0425c9fa..39819947 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/snapbuild.c +++ b/third_party/spanner_pg/src/backend/replication/logical/snapbuild.c @@ -107,10 +107,10 @@ * is a convenient point to initialize replication from, which is why we * export a snapshot at that point, which *can* be used to read normal data. * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/replication/snapbuild.c + * src/backend/replication/logical/snapbuild.c * *------------------------------------------------------------------------- */ @@ -165,15 +165,15 @@ struct SnapBuild XLogRecPtr start_decoding_at; /* - * LSN at which we found a consistent point at the time of slot creation. - * This is also the point where we have exported a snapshot for the - * initial copy. + * LSN at which two-phase decoding was enabled or LSN at which we found a + * consistent point at the time of slot creation. * - * The prepared transactions that are not covered by initial snapshot - * needs to be sent later along with commit prepared and they must be - * before this point. + * The prepared transactions, that were skipped because previously + * two-phase was not enabled or are not covered by initial snapshot, need + * to be sent later along with commit prepared and they must be before + * this point. */ - XLogRecPtr initial_consistent_point; + XLogRecPtr two_phase_at; /* * Don't start decoding WAL until the "xl_running_xacts" information @@ -322,7 +322,7 @@ AllocateSnapshotBuilder(ReorderBuffer *reorder, TransactionId xmin_horizon, XLogRecPtr start_lsn, bool need_full_snapshot, - XLogRecPtr initial_consistent_point) + XLogRecPtr two_phase_at) { MemoryContext context; MemoryContext oldcontext; @@ -351,7 +351,7 @@ AllocateSnapshotBuilder(ReorderBuffer *reorder, builder->initial_xmin_horizon = xmin_horizon; builder->start_decoding_at = start_lsn; builder->building_full_snapshot = need_full_snapshot; - builder->initial_consistent_point = initial_consistent_point; + builder->two_phase_at = two_phase_at; mcallback = palloc0(sizeof(MemoryContextCallback)); mcallback->func = SnapBuildResetRunningXactsCallback; @@ -419,12 +419,21 @@ SnapBuildCurrentState(SnapBuild *builder) } /* - * Return the LSN at which the snapshot was exported + * Return the LSN at which the two-phase decoding was first enabled. */ XLogRecPtr -SnapBuildInitialConsistentPoint(SnapBuild *builder) +SnapBuildGetTwoPhaseAt(SnapBuild *builder) { - return builder->initial_consistent_point; + return builder->two_phase_at; +} + +/* + * Set the LSN at which two-phase decoding is enabled. + */ +void +SnapBuildSetTwoPhaseAt(SnapBuild *builder, XLogRecPtr ptr) +{ + builder->two_phase_at = ptr; } /* @@ -1485,7 +1494,6 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn * records so incremental cleanup can be performed. */ return true; - } /* --- @@ -1543,7 +1551,6 @@ SnapBuildWaitSnapshot(xl_running_xacts *running, TransactionId cutoff) * We store current state of struct SnapBuild on disk in the following manner: * * struct SnapBuildOnDisk; - * TransactionId * running.xcnt_space; * TransactionId * committed.xcnt; (*not xcnt_space*) * */ @@ -2119,11 +2126,13 @@ SnapBuildXidSetCatalogChanges(SnapBuild *builder, TransactionId xid, int subxcnt TransactionId *subxacts, XLogRecPtr lsn) { /* - * Skip if there is no initial running xacts information or the - * transaction is already marked as containing catalog changes. + * Skip if there is no initial running xacts information. + * + * Even if the transaction has been marked as containing catalog + * changes, it cannot be skipped because its subtransactions that + * modified the catalog may not be marked. */ - if (NInitialRunningXacts == 0 || - ReorderBufferXidHasCatalogChanges(builder->reorder, xid)) + if (NInitialRunningXacts == 0) return; if (bsearch(&xid, InitialRunningXacts, NInitialRunningXacts, diff --git a/third_party/spanner_pg/src/backend/replication/logical/tablesync.c b/third_party/spanner_pg/src/backend/replication/logical/tablesync.c index b86d23d6..f5e27fcd 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/tablesync.c +++ b/third_party/spanner_pg/src/backend/replication/logical/tablesync.c @@ -2,7 +2,7 @@ * tablesync.c * PostgreSQL logical replication: initial table data synchronization * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/tablesync.c @@ -96,6 +96,7 @@ #include "access/table.h" #include "access/xact.h" +#include "catalog/indexing.h" #include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "commands/copy.h" @@ -110,16 +111,22 @@ #include "replication/origin.h" #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" +#include "utils/rls.h" #include "utils/snapmgr.h" +#include "utils/syscache.h" #include "third_party/spanner_pg/shims/catalog_shim.h" static bool table_states_valid = false; +static List *table_states_not_ready = NIL; +static bool FetchTableStates(bool *started_tx); -StringInfo copybuf = NULL; +static StringInfo copybuf = NULL; /* * Exit routine for synchronization worker. @@ -135,7 +142,7 @@ finish_sync_worker(void) if (IsTransactionState()) { CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); } /* And flush all writes. */ @@ -364,7 +371,6 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) Oid relid; TimestampTz last_start_time; }; - static List *table_states = NIL; static HTAB *last_start_times = NULL; ListCell *lc; bool started_tx = false; @@ -372,42 +378,14 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) Assert(!IsTransactionState()); /* We need up-to-date sync state info for subscription tables here. */ - if (!table_states_valid) - { - MemoryContext oldctx; - List *rstates; - ListCell *lc; - SubscriptionRelState *rstate; - - /* Clean the old list. */ - list_free_deep(table_states); - table_states = NIL; - - StartTransactionCommand(); - started_tx = true; - - /* Fetch all non-ready tables. */ - rstates = GetSubscriptionNotReadyRelations(MySubscription->oid); - - /* Allocate the tracking info in a permanent memory context. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); - foreach(lc, rstates) - { - rstate = palloc(sizeof(SubscriptionRelState)); - memcpy(rstate, lfirst(lc), sizeof(SubscriptionRelState)); - table_states = lappend(table_states, rstate); - } - MemoryContextSwitchTo(oldctx); - - table_states_valid = true; - } + FetchTableStates(&started_tx); /* * Prepare a hash table for tracking last start times of workers, to avoid * immediate restarts. We don't need it if there are no tables that need * syncing. */ - if (table_states && !last_start_times) + if (table_states_not_ready && !last_start_times) { HASHCTL ctl; @@ -421,16 +399,38 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) * Clean up the hash table when we're done with all tables (just to * release the bit of memory). */ - else if (!table_states && last_start_times) + else if (!table_states_not_ready && last_start_times) { hash_destroy(last_start_times); last_start_times = NULL; } + /* + * Even when the two_phase mode is requested by the user, it remains as + * 'pending' until all tablesyncs have reached READY state. + * + * When this happens, we restart the apply worker and (if the conditions + * are still ok) then the two_phase tri-state will become 'enabled' at + * that time. + * + * Note: If the subscription has no tables then leave the state as + * PENDING, which allows ALTER SUBSCRIPTION ... REFRESH PUBLICATION to + * work. + */ + if (MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING && + AllTablesyncsReady()) + { + ereport(LOG, + (errmsg("logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled", + MySubscription->name))); + + proc_exit(0); + } + /* * Process all tables that are being synchronized. */ - foreach(lc, table_states) + foreach(lc, table_states_not_ready) { SubscriptionRelState *rstate = (SubscriptionRelState *) lfirst(lc); @@ -520,15 +520,25 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) /* Now safe to release the LWLock */ LWLockRelease(LogicalRepWorkerLock); + if (started_tx) + { + /* + * We must commit the existing transaction to release + * the existing locks before entering a busy loop. + * This is required to avoid any undetected deadlocks + * due to any existing lock as deadlock detector won't + * be able to detect the waits on the latch. + */ + CommitTransactionCommand(); + pgstat_report_stat(false); + } + /* * Enter busy loop and wait for synchronization worker to * reach expected state (or die trying). */ - if (!started_tx) - { - StartTransactionCommand(); - started_tx = true; - } + StartTransactionCommand(); + started_tx = true; wait_for_relation_state_change(rstate->relid, SUBREL_STATE_SYNCDONE); @@ -581,7 +591,7 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) if (started_tx) { CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); } } @@ -693,19 +703,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 attrRow[] = {INT2OID, TEXTOID, OIDOID, BOOLOID}; + Oid qualRow[] = {TEXTOID}; bool isnull; int natt; + ListCell *lc; + Bitmapset *included_cols = NULL; lrel->nspname = nspname; lrel->relname = relname; @@ -746,10 +760,108 @@ fetch_remote_table_info(char *nspname, char *relname, ExecDropSingleTupleTableSlot(slot); walrcv_clear_result(res); - /* Now fetch columns. */ + + /* + * Get column lists for each 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 *tslot; + Oid attrsRow[] = {INT2VECTOROID}; + StringInfoData pub_names; + initStringInfo(&pub_names); + foreach(lc, MySubscription->publications) + { + if (foreach_current_index(lc) > 0) + appendStringInfo(&pub_names, ", "); + appendStringInfoString(&pub_names, quote_literal_cstr(strVal(lfirst(lc)))); + } + + /* + * Fetch info about column lists for the relation (from all the + * publications). + */ + resetStringInfo(&cmd); + appendStringInfo(&cmd, + "SELECT DISTINCT" + " (CASE WHEN (array_length(gpt.attrs, 1) = c.relnatts)" + " THEN NULL ELSE gpt.attrs END)" + " FROM pg_publication p," + " LATERAL pg_get_publication_tables(p.pubname) gpt," + " pg_class c" + " WHERE gpt.relid = %u AND c.oid = gpt.relid" + " AND p.pubname IN ( %s )", + 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))); + + /* + * We don't support the case where the column list is different for + * the same table when combining publications. See comments atop + * fetch_table_list. So there should be only one row returned. + * Although we already checked this when creating the subscription, we + * still need to check here in case the column list was changed after + * creating the subscription and before the sync worker is started. + */ + if (tuplestore_tuple_count(pubres->tuplestore) > 1) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use different column lists for table \"%s.%s\" in different publications", + nspname, relname)); + + /* + * Get the column list and build a single bitmap with the attnums. + * + * If we find a NULL value, it means all the columns should be + * replicated. + */ + tslot = MakeSingleTupleTableSlot(pubres->tupledesc, &TTSOpsMinimalTuple); + if (tuplestore_gettupleslot(pubres->tuplestore, true, false, tslot)) + { + Datum cfval = slot_getattr(tslot, 1, &isnull); + + if (!isnull) + { + ArrayType *arr; + int nelems; + int16 *elems; + + arr = DatumGetArrayTypeP(cfval); + nelems = ARR_DIMS(arr)[0]; + elems = (int16 *) ARR_DATA_PTR(arr); + + for (natt = 0; natt < nelems; natt++) + included_cols = bms_add_member(included_cols, elems[natt]); + } + + ExecClearTuple(tslot); + } + ExecDropSingleTupleTableSlot(tslot); + + 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" @@ -777,16 +889,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); - if (DatumGetBool(slot_getattr(slot, 3, &isnull))) + + lrel->attnames[natt] = rel_colname; + lrel->atttyps[natt] = DatumGetObjectId(slot_getattr(slot, 3, &isnull)); + Assert(!isnull); + + if (DatumGetBool(slot_getattr(slot, 4, &isnull))) lrel->attkeys = bms_add_member(lrel->attkeys, natt); /* Should never happen. */ @@ -801,6 +932,92 @@ 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 TABLES IN SCHEMA + * that includes this relation + */ + if (walrcv_server_version(LogRepWorkerWalRcvConn) >= 150000) + { + StringInfoData pub_names; + + /* Build the pubname list. */ + initStringInfo(&pub_names); + foreach(lc, MySubscription->publications) + { + char *pubname = strVal(lfirst(lc)); + + if (foreach_current_index(lc) > 0) + appendStringInfoString(&pub_names, ", "); + + appendStringInfoString(&pub_names, quote_literal_cstr(pubname)); + } + + /* Check for row filters. */ + resetStringInfo(&cmd); + appendStringInfo(&cmd, + "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, + 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); } @@ -814,6 +1031,7 @@ copy_table(Relation rel) { LogicalRepRelMapEntry *relmapentry; LogicalRepRelation lrel; + List *qual = NIL; WalRcvExecResult *res; StringInfoData cmd; CopyFromState cstate; @@ -822,7 +1040,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); @@ -833,14 +1051,42 @@ copy_table(Relation rel) /* Start copy on the publisher. */ initStringInfo(&cmd); - if (lrel.relkind == RELKIND_RELATION) - appendStringInfo(&cmd, "COPY %s TO STDOUT", + + /* Regular table with no row filter */ + if (lrel.relkind == RELKIND_RELATION && qual == NIL) + { + appendStringInfo(&cmd, "COPY %s", quote_qualified_identifier(lrel.nspname, lrel.relname)); + + /* If the table has columns, then specify the columns */ + if (lrel.natts) + { + appendStringInfoString(&cmd, " ("); + + /* + * 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])); + } + + appendStringInfoString(&cmd, ")"); + } + + appendStringInfo(&cmd, " TO STDOUT"); + } 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++) @@ -849,8 +1095,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); @@ -929,6 +1200,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) char relstate; XLogRecPtr relstate_lsn; Relation rel; + AclResult aclresult; WalRcvExecResult *res; char originname[NAMEDATALEN]; RepOriginId originid; @@ -1035,7 +1307,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) MyLogicalRepWorker->relstate, MyLogicalRepWorker->relstate_lsn); CommitTransactionCommand(); - pgstat_report_stat(false); + pgstat_report_stat(true); StartTransactionCommand(); @@ -1047,6 +1319,31 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) */ rel = table_open(MyLogicalRepWorker->relid, RowExclusiveLock); + /* + * Check that our table sync worker has permission to insert into the + * target table. + */ + aclresult = pg_class_aclcheck(RelationGetRelid(rel), GetUserId(), + ACL_INSERT); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, + get_relkind_objtype(rel->rd_rel->relkind), + RelationGetRelationName(rel)); + + /* + * COPY FROM does not honor RLS policies. That is not a problem for + * subscriptions owned by roles with BYPASSRLS privilege (or superuser, + * who has it implicitly), but other roles should not be able to + * circumvent RLS. Disallow logical replication into RLS enabled + * relations for such roles. + */ + if (check_enable_rls(RelationGetRelid(rel), InvalidOid, false) == RLS_ENABLED) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"", + GetUserNameFromId(GetUserId(), true), + RelationGetRelationName(rel)))); + /* * Start a transaction in the remote node in REPEATABLE READ mode. This * ensures that both the replication slot we create (see below) and the @@ -1067,7 +1364,8 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) * for the catchup phase after COPY is done, so tell it to use the * snapshot to make the final data consistent. */ - walrcv_create_slot(LogRepWorkerWalRcvConn, slotname, false /* permanent */ , + walrcv_create_slot(LogRepWorkerWalRcvConn, + slotname, false /* permanent */ , false /* two_phase */ , CRS_USE_SNAPSHOT, origin_startpos); /* @@ -1153,3 +1451,134 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) wait_for_worker_state_change(SUBREL_STATE_CATCHUP); return slotname; } + +/* + * Common code to fetch the up-to-date sync state info into the static lists. + * + * Returns true if subscription has 1 or more tables, else false. + * + * Note: If this function started the transaction (indicated by the parameter) + * then it is the caller's responsibility to commit it. + */ +static bool +FetchTableStates(bool *started_tx) +{ + static bool has_subrels = false; + + *started_tx = false; + + if (!table_states_valid) + { + MemoryContext oldctx; + List *rstates; + ListCell *lc; + SubscriptionRelState *rstate; + + /* Clean the old lists. */ + list_free_deep(table_states_not_ready); + table_states_not_ready = NIL; + + if (!IsTransactionState()) + { + StartTransactionCommand(); + *started_tx = true; + } + + /* Fetch all non-ready tables. */ + rstates = GetSubscriptionNotReadyRelations(MySubscription->oid); + + /* Allocate the tracking info in a permanent memory context. */ + oldctx = MemoryContextSwitchTo(CacheMemoryContext); + foreach(lc, rstates) + { + rstate = palloc(sizeof(SubscriptionRelState)); + memcpy(rstate, lfirst(lc), sizeof(SubscriptionRelState)); + table_states_not_ready = lappend(table_states_not_ready, rstate); + } + MemoryContextSwitchTo(oldctx); + + /* + * Does the subscription have tables? + * + * If there were not-READY relations found then we know it does. But + * if table_state_not_ready was empty we still need to check again to + * see if there are 0 tables. + */ + has_subrels = (list_length(table_states_not_ready) > 0) || + HasSubscriptionRelations(MySubscription->oid); + + table_states_valid = true; + } + + return has_subrels; +} + +/* + * If the subscription has no tables then return false. + * + * Otherwise, are all tablesyncs READY? + * + * Note: This function is not suitable to be called from outside of apply or + * tablesync workers because MySubscription needs to be already initialized. + */ +bool +AllTablesyncsReady(void) +{ + bool started_tx = false; + bool has_subrels = false; + + /* We need up-to-date sync state info for subscription tables here. */ + has_subrels = FetchTableStates(&started_tx); + + if (started_tx) + { + CommitTransactionCommand(); + pgstat_report_stat(true); + } + + /* + * Return false when there are no tables in subscription or not all tables + * are in ready state; true otherwise. + */ + return has_subrels && list_length(table_states_not_ready) == 0; +} + +/* + * Update the two_phase state of the specified subscription in pg_subscription. + */ +void +UpdateTwoPhaseState(Oid suboid, char new_state) +{ + Relation rel; + HeapTuple tup; + bool nulls[Natts_pg_subscription]; + bool replaces[Natts_pg_subscription]; + Datum values[Natts_pg_subscription]; + + Assert(new_state == LOGICALREP_TWOPHASE_STATE_DISABLED || + new_state == LOGICALREP_TWOPHASE_STATE_PENDING || + new_state == LOGICALREP_TWOPHASE_STATE_ENABLED); + + rel = table_open(SubscriptionRelationId, RowExclusiveLock); + tup = SearchSysCacheCopy1(SUBSCRIPTIONOID, ObjectIdGetDatum(suboid)); + if (!HeapTupleIsValid(tup)) + elog(ERROR, + "cache lookup failed for subscription oid %u", + suboid); + + /* Form a new tuple. */ + memset(values, 0, sizeof(values)); + memset(nulls, false, sizeof(nulls)); + memset(replaces, false, sizeof(replaces)); + + /* And update/set two_phase state */ + values[Anum_pg_subscription_subtwophasestate - 1] = CharGetDatum(new_state); + replaces[Anum_pg_subscription_subtwophasestate - 1] = true; + + tup = heap_modify_tuple(tup, RelationGetDescr(rel), + values, nulls, replaces); + CatalogTupleUpdate(rel, &tup->t_self, tup); + + heap_freetuple(tup); + table_close(rel, RowExclusiveLock); +} diff --git a/third_party/spanner_pg/src/backend/replication/logical/worker.c b/third_party/spanner_pg/src/backend/replication/logical/worker.c index 8d9cf6ab..19a08988 100644 --- a/third_party/spanner_pg/src/backend/replication/logical/worker.c +++ b/third_party/spanner_pg/src/backend/replication/logical/worker.c @@ -2,7 +2,7 @@ * worker.c * PostgreSQL logical replication worker (apply) * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/worker.c @@ -39,16 +39,89 @@ * BufFile infrastructure supports temporary files that exceed the OS file size * limit, (b) provides a way for automatic clean up on the error and (c) provides * a way to survive these files across local transactions and allow to open and - * close at stream start and close. We decided to use SharedFileSet + * close at stream start and close. We decided to use FileSet * infrastructure as without that it deletes the files on the closure of the * file and if we decide to keep stream files open across the start/stop stream * then it will consume a lot of memory (more than 8K for each BufFile and * there could be multiple such BufFiles as the subscriber could receive * multiple start/stop streams for different transactions before getting the - * commit). Moreover, if we don't use SharedFileSet then we also need to invent + * commit). Moreover, if we don't use FileSet then we also need to invent * a new way to pass filenames to BufFile APIs so that we are allowed to open * the file we desired across multiple stream-open calls for the same * transaction. + * + * TWO_PHASE TRANSACTIONS + * ---------------------- + * Two phase transactions are replayed at prepare and then committed or + * rolled back at commit prepared and rollback prepared respectively. It is + * possible to have a prepared transaction that arrives at the apply worker + * when the tablesync is busy doing the initial copy. In this case, the apply + * worker skips all the prepared operations [e.g. inserts] while the tablesync + * is still busy (see the condition of should_apply_changes_for_rel). The + * tablesync worker might not get such a prepared transaction because say it + * was prior to the initial consistent point but might have got some later + * commits. Now, the tablesync worker will exit without doing anything for the + * prepared transaction skipped by the apply worker as the sync location for it + * will be already ahead of the apply worker's current location. This would lead + * to an "empty prepare", because later when the apply worker does the commit + * prepare, there is nothing in it (the inserts were skipped earlier). + * + * To avoid this, and similar prepare confusions the subscription's two_phase + * commit is enabled only after the initial sync is over. The two_phase option + * has been implemented as a tri-state with values DISABLED, PENDING, and + * ENABLED. + * + * Even if the user specifies they want a subscription with two_phase = on, + * internally it will start with a tri-state of PENDING which only becomes + * ENABLED after all tablesync initializations are completed - i.e. when all + * tablesync workers have reached their READY state. In other words, the value + * PENDING is only a temporary state for subscription start-up. + * + * Until the two_phase is properly available (ENABLED) the subscription will + * behave as if two_phase = off. When the apply worker detects that all + * tablesyncs have become READY (while the tri-state was PENDING) it will + * restart the apply worker process. This happens in + * process_syncing_tables_for_apply. + * + * When the (re-started) apply worker finds that all tablesyncs are READY for a + * two_phase tri-state of PENDING it start streaming messages with the + * two_phase option which in turn enables the decoding of two-phase commits at + * the publisher. Then, it updates the tri-state value from PENDING to ENABLED. + * Now, it is possible that during the time we have not enabled two_phase, the + * publisher (replication server) would have skipped some prepares but we + * ensure that such prepares are sent along with commit prepare, see + * 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 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 the pg_subscription catalog (see column subtwophasestate). + * + * We don't allow to toggle two_phase option of a subscription because it can + * lead to an inconsistent replica. Consider, initially, it was on and we have + * received some prepare then we turn it off, now at commit time the server + * will send the entire transaction data along with the commit. With some more + * analysis, we can allow changing this option from off to on but not sure if + * that alone would be useful. + * + * Finally, to avoid problems mentioned in previous paragraphs from any + * subsequent (not READY) tablesyncs (need to toggle two_phase option from 'on' + * to 'off' and then again back to 'on') there is a restriction for + * ALTER SUBSCRIPTION REFRESH PUBLICATION. This command is not permitted when + * the two_phase tri-state is ENABLED, except when copy_data = false. + * + * We can get prepare of the same GID more than once for the genuine cases + * where we have defined multiple subscriptions for publications on the same + * server and prepared transaction has operations on tables subscribed to those + * subscriptions. For such cases, if we use the GID sent by publisher one of + * the prepares will be successful and others will fail, in which case the + * server will send them again. Now, this can lead to a deadlock if user has + * set synchronous_standby_names for all the subscriptions on subscriber. To + * avoid such deadlocks, we generate a unique GID (consisting of the + * subscription oid and the xid of the prepared transaction) for each prepare + * transaction on the subscriber. *------------------------------------------------------------------------- */ @@ -59,9 +132,11 @@ #include "access/table.h" #include "access/tableam.h" +#include "access/twophase.h" #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" @@ -105,6 +180,7 @@ #include "storage/proc.h" #include "storage/procarray.h" #include "tcop/tcopprot.h" +#include "utils/acl.h" #include "utils/builtins.h" #include "utils/catcache.h" #include "utils/dynahash.h" @@ -114,7 +190,9 @@ #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" #include "utils/timeout.h" @@ -131,12 +209,6 @@ typedef struct FlushPosition static dlist_head lsn_mapping = DLIST_STATIC_INIT(lsn_mapping); -typedef struct SlotErrCallbackArg -{ - LogicalRepRelMapEntry *rel; - int remote_attnum; -} SlotErrCallbackArg; - typedef struct ApplyExecutionData { EState *estate; /* executor state, used to track resources */ @@ -149,19 +221,28 @@ typedef struct ApplyExecutionData PartitionTupleRouting *proute; /* partition routing info */ } ApplyExecutionData; -/* - * Stream xid hash entry. Whenever we see a new xid we create this entry in the - * xidhash and along with it create the streaming file and store the fileset handle. - * The subxact file is created iff there is any subxact info under this xid. This - * entry is used on the subsequent streams for the xid to get the corresponding - * fileset handles, so storing them in hash makes the search faster. - */ -typedef struct StreamXidHash +/* Struct for saving and restoring apply errcontext information */ +typedef struct ApplyErrorCallbackArg +{ + LogicalRepMsgType command; /* 0 if invalid */ + LogicalRepRelMapEntry *rel; + + /* 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 = { - TransactionId xid; /* xid is the hash key and must be first */ - SharedFileSet *stream_fileset; /* shared file set for stream data */ - SharedFileSet *subxact_fileset; /* shared file set for subxact info */ -} StreamXidHash; + .command = 0, + .rel = NULL, + .remote_attnum = -1, + .remote_xid = InvalidTransactionId, + .finish_lsn = InvalidXLogRecPtr, + .origin_name = NULL, +}; static MemoryContext ApplyMessageContext = NULL; MemoryContext ApplyContext = NULL; @@ -172,7 +253,7 @@ static MemoryContext LogicalStreamingContext = NULL; WalReceiverConn *LogRepWorkerWalRcvConn = NULL; Subscription *MySubscription = NULL; -bool MySubscriptionValid = false; +static bool MySubscriptionValid = false; bool in_remote_transaction = false; static XLogRecPtr remote_final_lsn = InvalidXLogRecPtr; @@ -183,10 +264,19 @@ static bool in_streamed_transaction = false; static TransactionId stream_xid = InvalidTransactionId; /* - * Hash table for storing the streaming xid information along with shared file - * set for streaming and subxact files. + * 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 HTAB *xidhash = NULL; +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; @@ -234,6 +324,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); @@ -257,6 +349,22 @@ static void apply_handle_tuple_routing(ApplyExecutionData *edata, LogicalRepTupleData *newtup, CmdType operation); +/* Compute GID for two_phase transactions */ +static void TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid); + +/* 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); +static inline void reset_apply_error_context_info(void); + /* * Should this worker apply changes for given relation. * @@ -494,7 +602,6 @@ slot_fill_defaults(LogicalRepRelMapEntry *rel, EState *estate, defmap[num_defaults] = attnum; num_defaults++; } - } for (i = 0; i < num_defaults; i++) @@ -502,26 +609,6 @@ slot_fill_defaults(LogicalRepRelMapEntry *rel, EState *estate, ExecEvalExpr(defexprs[i], econtext, &slot->tts_isnull[defmap[i]]); } -/* - * Error callback to give more context info about data conversion failures - * while reading data from the remote server. - */ -static void -slot_store_error_callback(void *arg) -{ - SlotErrCallbackArg *errarg = (SlotErrCallbackArg *) arg; - LogicalRepRelMapEntry *rel; - - /* Nothing to do if remote attribute number is not set */ - if (errarg->remote_attnum < 0) - return; - - rel = errarg->rel; - errcontext("processing remote data for replication target relation \"%s.%s\" column \"%s\"", - rel->remoterel.nspname, rel->remoterel.relname, - rel->remoterel.attnames[errarg->remote_attnum]); -} - /* * Store tuple data into slot. * @@ -533,19 +620,9 @@ slot_store_data(TupleTableSlot *slot, LogicalRepRelMapEntry *rel, { int natts = slot->tts_tupleDescriptor->natts; int i; - SlotErrCallbackArg errarg; - ErrorContextCallback errcallback; ExecClearTuple(slot); - /* Push callback + info on the error context stack */ - errarg.rel = rel; - errarg.remote_attnum = -1; - errcallback.callback = slot_store_error_callback; - errcallback.arg = (void *) &errarg; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - /* Call the "in" function for each non-dropped, non-null attribute */ Assert(natts == rel->attrmap->maplen); for (i = 0; i < natts; i++) @@ -559,7 +636,8 @@ slot_store_data(TupleTableSlot *slot, LogicalRepRelMapEntry *rel, Assert(remoteattnum < tupleData->ncols); - errarg.remote_attnum = remoteattnum; + /* Set attnum for error callback */ + apply_error_callback_arg.remote_attnum = remoteattnum; if (tupleData->colstatus[remoteattnum] == LOGICALREP_COLUMN_TEXT) { @@ -607,7 +685,8 @@ slot_store_data(TupleTableSlot *slot, LogicalRepRelMapEntry *rel, slot->tts_isnull[i] = true; } - errarg.remote_attnum = -1; + /* Reset attnum for error callback */ + apply_error_callback_arg.remote_attnum = -1; } else { @@ -621,9 +700,6 @@ slot_store_data(TupleTableSlot *slot, LogicalRepRelMapEntry *rel, } } - /* Pop the error context stack */ - error_context_stack = errcallback.previous; - ExecStoreVirtualTuple(slot); } @@ -646,8 +722,6 @@ slot_modify_data(TupleTableSlot *slot, TupleTableSlot *srcslot, { int natts = slot->tts_tupleDescriptor->natts; int i; - SlotErrCallbackArg errarg; - ErrorContextCallback errcallback; /* We'll fill "slot" with a virtual tuple, so we must start with ... */ ExecClearTuple(slot); @@ -661,14 +735,6 @@ slot_modify_data(TupleTableSlot *slot, TupleTableSlot *srcslot, memcpy(slot->tts_values, srcslot->tts_values, natts * sizeof(Datum)); memcpy(slot->tts_isnull, srcslot->tts_isnull, natts * sizeof(bool)); - /* For error reporting, push callback + info on the error context stack */ - errarg.rel = rel; - errarg.remote_attnum = -1; - errcallback.callback = slot_store_error_callback; - errcallback.arg = (void *) &errarg; - errcallback.previous = error_context_stack; - error_context_stack = &errcallback; - /* Call the "in" function for each replaced attribute */ Assert(natts == rel->attrmap->maplen); for (i = 0; i < natts; i++) @@ -685,7 +751,8 @@ slot_modify_data(TupleTableSlot *slot, TupleTableSlot *srcslot, { StringInfo colvalue = &tupleData->colvalues[remoteattnum]; - errarg.remote_attnum = remoteattnum; + /* Set attnum for error callback */ + apply_error_callback_arg.remote_attnum = remoteattnum; if (tupleData->colstatus[remoteattnum] == LOGICALREP_COLUMN_TEXT) { @@ -729,13 +796,11 @@ slot_modify_data(TupleTableSlot *slot, TupleTableSlot *srcslot, slot->tts_isnull[i] = true; } - errarg.remote_attnum = -1; + /* Reset attnum for error callback */ + apply_error_callback_arg.remote_attnum = -1; } } - /* Pop the error context stack */ - error_context_stack = errcallback.previous; - /* And finally, declare that "slot" contains a valid virtual tuple */ ExecStoreVirtualTuple(slot); } @@ -749,9 +814,12 @@ apply_handle_begin(StringInfo s) LogicalRepBeginData begin_data; logicalrep_read_begin(s, &begin_data); + set_apply_error_context_xact(begin_data.xid, begin_data.final_lsn); 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); @@ -782,6 +850,278 @@ apply_handle_commit(StringInfo s) process_syncing_tables(commit_data.end_lsn); pgstat_report_activity(STATE_IDLE, NULL); + reset_apply_error_context_info(); +} + +/* + * Handle BEGIN PREPARE message. + */ +static void +apply_handle_begin_prepare(StringInfo s) +{ + LogicalRepPreparedTxnData begin_data; + + /* Tablesync should never receive prepare. */ + if (am_tablesync_worker()) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + 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_lsn); + + 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); +} + +/* + * Common function to prepare the GID. + */ +static void +apply_handle_prepare_internal(LogicalRepPreparedTxnData *prepare_data) +{ + char gid[GIDSIZE]; + + /* + * Compute unique GID for two_phase transactions. We don't use GID of + * prepared transaction sent by server as that can lead to deadlock when + * we have multiple subscriptions from same node point to publications on + * the same node. See comments atop worker.c + */ + TwoPhaseTransactionGid(MySubscription->oid, prepare_data->xid, + gid, sizeof(gid)); + + /* + * BeginTransactionBlock is necessary to balance the EndTransactionBlock + * called within the PrepareTransactionBlock below. + */ + BeginTransactionBlock(); + CommitTransactionCommand(); /* Completes the preceding Begin command. */ + + /* + * Update origin state so we can restart streaming from correct position + * in case of crash. + */ + replorigin_session_origin_lsn = prepare_data->end_lsn; + replorigin_session_origin_timestamp = prepare_data->prepare_time; + + PrepareTransactionBlock(gid); +} + +/* + * Handle PREPARE message. + */ +static void +apply_handle_prepare(StringInfo s) +{ + LogicalRepPreparedTxnData prepare_data; + + logicalrep_read_prepare(s, &prepare_data); + + if (prepare_data.prepare_lsn != remote_final_lsn) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg_internal("incorrect prepare LSN %X/%X in prepare message (expected %X/%X)", + LSN_FORMAT_ARGS(prepare_data.prepare_lsn), + LSN_FORMAT_ARGS(remote_final_lsn)))); + + /* + * Unlike commit, here, we always prepare the transaction even though no + * 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 + * worthwhile because such cases shouldn't be common. + */ + begin_replication_step(); + + apply_handle_prepare_internal(&prepare_data); + + end_replication_step(); + CommitTransactionCommand(); + pgstat_report_stat(false); + + store_flush_position(prepare_data.end_lsn); + + in_remote_transaction = false; + + /* 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(); +} + +/* + * Handle a COMMIT PREPARED of a previously PREPARED transaction. + */ +static void +apply_handle_commit_prepared(StringInfo s) +{ + LogicalRepCommitPreparedTxnData prepare_data; + char gid[GIDSIZE]; + + logicalrep_read_commit_prepared(s, &prepare_data); + set_apply_error_context_xact(prepare_data.xid, prepare_data.commit_lsn); + + /* Compute GID for two_phase transactions. */ + TwoPhaseTransactionGid(MySubscription->oid, prepare_data.xid, + gid, sizeof(gid)); + + /* There is no transaction when COMMIT PREPARED is called */ + begin_replication_step(); + + /* + * Update origin state so we can restart streaming from correct position + * in case of crash. + */ + replorigin_session_origin_lsn = prepare_data.end_lsn; + replorigin_session_origin_timestamp = prepare_data.commit_time; + + FinishPreparedTransaction(gid, true); + end_replication_step(); + CommitTransactionCommand(); + pgstat_report_stat(false); + + store_flush_position(prepare_data.end_lsn); + in_remote_transaction = false; + + /* 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(); +} + +/* + * Handle a ROLLBACK PREPARED of a previously PREPARED TRANSACTION. + */ +static void +apply_handle_rollback_prepared(StringInfo s) +{ + LogicalRepRollbackPreparedTxnData rollback_data; + char gid[GIDSIZE]; + + logicalrep_read_rollback_prepared(s, &rollback_data); + 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, + gid, sizeof(gid)); + + /* + * It is possible that we haven't received prepare because it occurred + * before walsender reached a consistent point or the two_phase was still + * not enabled by that time, so in such cases, we need to skip rollback + * prepared. + */ + if (LookupGXact(gid, rollback_data.prepare_end_lsn, + rollback_data.prepare_time)) + { + /* + * Update origin state so we can restart streaming from correct + * position in case of crash. + */ + replorigin_session_origin_lsn = rollback_data.rollback_end_lsn; + replorigin_session_origin_timestamp = rollback_data.rollback_time; + + /* There is no transaction when ABORT/ROLLBACK PREPARED is called */ + begin_replication_step(); + FinishPreparedTransaction(gid, false); + end_replication_step(); + CommitTransactionCommand(); + + clear_subscription_skip_lsn(rollback_data.rollback_end_lsn); + } + + pgstat_report_stat(false); + + store_flush_position(rollback_data.rollback_end_lsn); + in_remote_transaction = false; + + /* Process any tables that are being synchronized in parallel. */ + process_syncing_tables(rollback_data.rollback_end_lsn); + + pgstat_report_activity(STATE_IDLE, NULL); + reset_apply_error_context_info(); +} + +/* + * Handle STREAM PREPARE. + * + * Logic is in two parts: + * 1. Replay all the spooled operations + * 2. Mark the transaction as prepared + */ +static void +apply_handle_stream_prepare(StringInfo s) +{ + LogicalRepPreparedTxnData prepare_data; + + if (in_streamed_transaction) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg_internal("STREAM PREPARE message without STREAM STOP"))); + + /* Tablesync should never receive prepare. */ + if (am_tablesync_worker()) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + 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_lsn); + + elog(DEBUG1, "received prepare for streamed transaction %u", prepare_data.xid); + + /* Replay all the spooled operations. */ + apply_spooled_messages(prepare_data.xid, prepare_data.prepare_lsn); + + /* Mark the transaction as prepared. */ + apply_handle_prepare_internal(&prepare_data); + + CommitTransactionCommand(); + + pgstat_report_stat(false); + + store_flush_position(prepare_data.end_lsn); + + in_remote_transaction = false; + + /* unlink the files with serialized changes and subxact info. */ + stream_cleanup_files(MyLogicalRepWorker->subid, prepare_data.xid); + + /* 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(); } /* @@ -811,7 +1151,6 @@ static void apply_handle_stream_start(StringInfo s) { bool first_segment; - HASHCTL hash_ctl; if (in_streamed_transaction) ereport(ERROR, @@ -838,18 +1177,26 @@ 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, InvalidXLogRecPtr); + /* - * Initialize the xidhash table if we haven't yet. This will be used for - * the entire duration of the apply worker so create it in permanent - * context. + * Initialize the worker's stream_fileset if we haven't yet. This will be + * used for the entire duration of the worker so create it in a permanent + * context. We create this on the very first streaming message from any + * transaction and then use it for this and other streaming transactions. + * Now, we could create a fileset at the start of the worker as well but + * then we won't be sure that it will ever be used. */ - if (xidhash == NULL) + if (MyLogicalRepWorker->stream_fileset == NULL) { - hash_ctl.keysize = sizeof(TransactionId); - hash_ctl.entrysize = sizeof(StreamXidHash); - hash_ctl.hcxt = ApplyContext; - xidhash = hash_create("StreamXidHash", 1024, &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + MemoryContext oldctx; + + oldctx = MemoryContextSwitchTo(ApplyContext); + + MyLogicalRepWorker->stream_fileset = palloc(sizeof(FileSet)); + FileSetInit(MyLogicalRepWorker->stream_fileset); + + MemoryContextSwitchTo(oldctx); } /* open the spool file for this transaction */ @@ -894,6 +1241,7 @@ apply_handle_stream_stop(StringInfo s) MemoryContextReset(LogicalStreamingContext); pgstat_report_activity(STATE_IDLE, NULL); + reset_apply_error_context_info(); } /* @@ -917,7 +1265,10 @@ apply_handle_stream_abort(StringInfo s) * just delete the files with serialized info. */ if (xid == subxid) + { + set_apply_error_context_xact(xid, InvalidXLogRecPtr); stream_cleanup_files(MyLogicalRepWorker->subid, xid); + } else { /* @@ -940,7 +1291,8 @@ apply_handle_stream_abort(StringInfo s) BufFile *fd; bool found = false; char path[MAXPGPATH]; - StreamXidHash *ent; + + set_apply_error_context_xact(subxid, InvalidXLogRecPtr); subidx = -1; begin_replication_step(); @@ -966,26 +1318,18 @@ apply_handle_stream_abort(StringInfo s) cleanup_subxact_info(); end_replication_step(); CommitTransactionCommand(); + reset_apply_error_context_info(); return; } - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_FIND, - NULL); - if (!ent) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("transaction %u not found in stream XID hash table", - xid))); - /* open the changes file */ changes_filename(path, MyLogicalRepWorker->subid, xid); - fd = BufFileOpenShared(ent->stream_fileset, path, O_RDWR); + fd = BufFileOpenFileSet(MyLogicalRepWorker->stream_fileset, path, + O_RDWR, false); /* OK, truncate the file at the right offset */ - BufFileTruncateShared(fd, subxact_data.subxacts[subidx].fileno, - subxact_data.subxacts[subidx].offset); + BufFileTruncateFileSet(fd, subxact_data.subxacts[subidx].fileno, + subxact_data.subxacts[subidx].offset); BufFileClose(fd); /* discard the subxacts added later */ @@ -997,32 +1341,24 @@ apply_handle_stream_abort(StringInfo s) end_replication_step(); CommitTransactionCommand(); } + + reset_apply_error_context_info(); } /* - * Handle STREAM COMMIT message. + * Common spoolfile processing. */ static void -apply_handle_stream_commit(StringInfo s) +apply_spooled_messages(TransactionId xid, XLogRecPtr lsn) { - TransactionId xid; StringInfoData s2; int nchanges; char path[MAXPGPATH]; char *buffer = NULL; - LogicalRepCommitData commit_data; - StreamXidHash *ent; MemoryContext oldcxt; BufFile *fd; - if (in_streamed_transaction) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("STREAM COMMIT message without STREAM STOP"))); - - xid = logicalrep_read_stream_commit(s, &commit_data); - - elog(DEBUG1, "received commit for streamed transaction %u", xid); + maybe_start_skipping_changes(lsn); /* Make sure we have an open transaction */ begin_replication_step(); @@ -1034,28 +1370,19 @@ apply_handle_stream_commit(StringInfo s) */ oldcxt = MemoryContextSwitchTo(TopTransactionContext); - /* open the spool file for the committed transaction */ + /* Open the spool file for the committed/prepared transaction */ changes_filename(path, MyLogicalRepWorker->subid, xid); elog(DEBUG1, "replaying changes from file \"%s\"", path); - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_FIND, - NULL); - if (!ent) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("transaction %u not found in stream XID hash table", - xid))); - - fd = BufFileOpenShared(ent->stream_fileset, path, O_RDONLY); + fd = BufFileOpenFileSet(MyLogicalRepWorker->stream_fileset, path, O_RDONLY, + false); buffer = palloc(BLCKSZ); initStringInfo(&s2); MemoryContextSwitchTo(oldcxt); - remote_final_lsn = commit_data.commit_lsn; + remote_final_lsn = lsn; /* * Make sure the handle apply_dispatch methods are aware we're in a remote @@ -1135,6 +1462,30 @@ apply_handle_stream_commit(StringInfo s) elog(DEBUG1, "replayed %d (all) changes from file \"%s\"", nchanges, path); + return; +} + +/* + * Handle STREAM COMMIT message. + */ +static void +apply_handle_stream_commit(StringInfo s) +{ + TransactionId xid; + LogicalRepCommitData commit_data; + + if (in_streamed_transaction) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg_internal("STREAM COMMIT message without STREAM STOP"))); + + xid = logicalrep_read_stream_commit(s, &commit_data); + set_apply_error_context_xact(xid, commit_data.commit_lsn); + + elog(DEBUG1, "received commit for streamed transaction %u", xid); + + apply_spooled_messages(xid, commit_data.commit_lsn); + apply_handle_commit_internal(&commit_data); /* unlink the files with serialized changes and subxact info */ @@ -1144,6 +1495,8 @@ apply_handle_stream_commit(StringInfo s) process_syncing_tables(commit_data.end_lsn); pgstat_report_activity(STATE_IDLE, NULL); + + reset_apply_error_context_info(); } /* @@ -1152,8 +1505,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. @@ -1236,6 +1607,38 @@ GetRelationIdentityOrPK(Relation rel) return idxoid; } +/* + * Check that we (the subscription owner) have sufficient privileges on the + * target relation to perform the given operation. + */ +static void +TargetPrivilegesCheck(Relation rel, AclMode mode) +{ + Oid relid; + AclResult aclresult; + + relid = RelationGetRelid(rel); + aclresult = pg_class_aclcheck(relid, GetUserId(), mode); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, + get_relkind_objtype(rel->rd_rel->relkind), + get_rel_name(relid)); + + /* + * We lack the infrastructure to honor RLS policies. It might be possible + * to add such infrastructure here, but tablesync workers lack it, too, so + * we don't bother. RLS does not ordinarily apply to TRUNCATE commands, + * but it seems dangerous to replicate a TRUNCATE and then refuse to + * replicate subsequent INSERTs, so we forbid all commands the same. + */ + if (check_enable_rls(relid, InvalidOid, false) == RLS_ENABLED) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"", + GetUserNameFromId(GetUserId(), true), + RelationGetRelationName(rel)))); +} + /* * Handle INSERT message. */ @@ -1251,7 +1654,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(); @@ -1269,6 +1677,9 @@ apply_handle_insert(StringInfo s) return; } + /* Set relation for error callback */ + apply_error_callback_arg.rel = rel; + /* Initialize the executor state. */ edata = create_edata_for_relation(rel); estate = edata->estate; @@ -1292,6 +1703,9 @@ apply_handle_insert(StringInfo s) finish_edata(edata); + /* Reset relation for error callback */ + apply_error_callback_arg.rel = NULL; + logicalrep_rel_close(rel, NoLock); end_replication_step(); @@ -1313,6 +1727,7 @@ apply_handle_insert_internal(ApplyExecutionData *edata, ExecOpenIndices(relinfo, false); /* Do the insert. */ + TargetPrivilegesCheck(relinfo->ri_RelationDesc, ACL_INSERT); ExecSimpleRelationInsert(relinfo, estate, remoteslot); /* Cleanup. */ @@ -1378,7 +1793,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(); @@ -1397,6 +1817,9 @@ apply_handle_update(StringInfo s) return; } + /* Set relation for error callback */ + apply_error_callback_arg.rel = rel; + /* Check if we can do the update. */ check_relation_updatable(rel); @@ -1447,6 +1870,9 @@ apply_handle_update(StringInfo s) finish_edata(edata); + /* Reset relation for error callback */ + apply_error_callback_arg.rel = NULL; + logicalrep_rel_close(rel, NoLock); end_replication_step(); @@ -1494,6 +1920,7 @@ apply_handle_update_internal(ApplyExecutionData *edata, EvalPlanQualSetSlot(&epqstate, remoteslot); /* Do the actual update. */ + TargetPrivilegesCheck(relinfo->ri_RelationDesc, ACL_UPDATE); ExecSimpleRelationUpdate(relinfo, estate, &epqstate, localslot, remoteslot); } @@ -1532,7 +1959,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(); @@ -1550,6 +1982,9 @@ apply_handle_delete(StringInfo s) return; } + /* Set relation for error callback */ + apply_error_callback_arg.rel = rel; + /* Check if we can do the delete. */ check_relation_updatable(rel); @@ -1575,6 +2010,9 @@ apply_handle_delete(StringInfo s) finish_edata(edata); + /* Reset relation for error callback */ + apply_error_callback_arg.rel = NULL; + logicalrep_rel_close(rel, NoLock); end_replication_step(); @@ -1609,6 +2047,7 @@ apply_handle_delete_internal(ApplyExecutionData *edata, EvalPlanQualSetSlot(&epqstate, localslot); /* Do the actual delete. */ + TargetPrivilegesCheck(relinfo->ri_RelationDesc, ACL_DELETE); ExecSimpleRelationDelete(relinfo, estate, &epqstate, localslot); } else @@ -1646,6 +2085,12 @@ FindReplTupleInLocalRel(EState *estate, Relation localrel, Oid idxoid; bool found; + /* + * Regardless of the top-level operation, we're performing a read here, so + * check for SELECT privileges. + */ + TargetPrivilegesCheck(localrel, ACL_SELECT); + *localslot = table_slot_create(localrel, &estate->es_tupleTable); idxoid = GetRelationIdentityOrPK(localrel); @@ -1820,6 +2265,8 @@ apply_handle_tuple_routing(ApplyExecutionData *edata, ExecOpenIndices(partrelinfo, false); EvalPlanQualSetSlot(&epqstate, remoteslot_part); + TargetPrivilegesCheck(partrelinfo->ri_RelationDesc, + ACL_UPDATE); ExecSimpleRelationUpdate(partrelinfo, estate, &epqstate, localslot, remoteslot_part); ExecCloseIndices(partrelinfo); @@ -1926,7 +2373,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(); @@ -1950,6 +2402,7 @@ apply_handle_truncate(StringInfo s) } remote_rels = lappend(remote_rels, rel); + TargetPrivilegesCheck(rel->localrel, ACL_TRUNCATE); rels = lappend(rels, rel->localrel); relids = lappend_oid(relids, rel->localreloid); if (RelationIsLogicallyLogged(rel->localrel)) @@ -1987,6 +2440,7 @@ apply_handle_truncate(StringInfo s) continue; } + TargetPrivilegesCheck(childrel, ACL_TRUNCATE); rels = lappend(rels, childrel); part_rels = lappend(part_rels, childrel); relids = lappend_oid(relids, childrelid); @@ -2031,44 +2485,53 @@ static void apply_dispatch(StringInfo s) { LogicalRepMsgType action = pq_getmsgbyte(s); + LogicalRepMsgType saved_command; + + /* + * Set the current command being applied. Since this function can be + * called recursively when applying spooled changes, save the current + * command. + */ + saved_command = apply_error_callback_arg.command; + apply_error_callback_arg.command = action; switch (action) { case LOGICAL_REP_MSG_BEGIN: apply_handle_begin(s); - return; + break; case LOGICAL_REP_MSG_COMMIT: apply_handle_commit(s); - return; + break; case LOGICAL_REP_MSG_INSERT: apply_handle_insert(s); - return; + break; case LOGICAL_REP_MSG_UPDATE: apply_handle_update(s); - return; + break; case LOGICAL_REP_MSG_DELETE: apply_handle_delete(s); - return; + break; case LOGICAL_REP_MSG_TRUNCATE: apply_handle_truncate(s); - return; + break; case LOGICAL_REP_MSG_RELATION: apply_handle_relation(s); - return; + break; case LOGICAL_REP_MSG_TYPE: apply_handle_type(s); - return; + break; case LOGICAL_REP_MSG_ORIGIN: apply_handle_origin(s); - return; + break; case LOGICAL_REP_MSG_MESSAGE: @@ -2077,29 +2540,52 @@ apply_dispatch(StringInfo s) * Although, it could be used by other applications that use this * output plugin. */ - return; + break; case LOGICAL_REP_MSG_STREAM_START: apply_handle_stream_start(s); - return; + break; - case LOGICAL_REP_MSG_STREAM_END: + case LOGICAL_REP_MSG_STREAM_STOP: apply_handle_stream_stop(s); - return; + break; case LOGICAL_REP_MSG_STREAM_ABORT: apply_handle_stream_abort(s); - return; + break; case LOGICAL_REP_MSG_STREAM_COMMIT: apply_handle_stream_commit(s); - return; + break; + + case LOGICAL_REP_MSG_BEGIN_PREPARE: + apply_handle_begin_prepare(s); + break; + + case LOGICAL_REP_MSG_PREPARE: + apply_handle_prepare(s); + break; + + case LOGICAL_REP_MSG_COMMIT_PREPARED: + apply_handle_commit_prepared(s); + break; + + case LOGICAL_REP_MSG_ROLLBACK_PREPARED: + apply_handle_rollback_prepared(s); + break; + + case LOGICAL_REP_MSG_STREAM_PREPARE: + apply_handle_stream_prepare(s); + break; + + default: + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid logical replication message type \"??? (%d)\"", action))); } - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("invalid logical replication message type \"%c\"", - action))); + /* Reset the current command */ + apply_error_callback_arg.command = saved_command; } /* @@ -2120,7 +2606,7 @@ get_flush_position(XLogRecPtr *write, XLogRecPtr *flush, bool *have_pending_txes) { dlist_mutable_iter iter; - XLogRecPtr local_flush = GetFlushRecPtr(); + XLogRecPtr local_flush = GetFlushRecPtr(NULL); *write = InvalidXLogRecPtr; *flush = InvalidXLogRecPtr; @@ -2200,6 +2686,7 @@ LogicalRepApplyLoop(XLogRecPtr last_received) TimestampTz last_recv_timestamp = GetCurrentTimestamp(); bool ping_sent = false; TimeLineID tli; + ErrorContextCallback errcallback; /* * Init the ApplyMessageContext which we clean up after each replication @@ -2220,6 +2707,14 @@ LogicalRepApplyLoop(XLogRecPtr last_received) /* mark as idle, before starting to loop */ pgstat_report_activity(STATE_IDLE, NULL); + /* + * Push apply error context callback. Fields will be filled while applying + * a change. + */ + errcallback.callback = apply_error_callback; + errcallback.previous = error_context_stack; + error_context_stack = &errcallback; + /* This outer loop iterates once per wait. */ for (;;) { @@ -2417,9 +2912,23 @@ LogicalRepApplyLoop(XLogRecPtr last_received) } send_feedback(last_received, requestReply, requestReply); + + /* + * Force reporting to ensure long idle periods don't lead to + * arbitrarily delayed stats. Stats can only be reported outside + * of (implicit or explicit) transactions. That shouldn't lead to + * stats being delayed for long, because transactions are either + * sent as a whole on commit or streamed. Streamed transactions + * are spilled to disk and applied on commit. + */ + if (!IsTransactionState()) + pgstat_report_stat(true); } } + /* Pop the error context stack */ + error_context_stack = errcallback.previous; + /* All done */ walrcv_endstreaming(LogRepWorkerWalRcvConn, &tli); } @@ -2556,10 +3065,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, @@ -2573,6 +3079,9 @@ maybe_reread_subscription(void) /* !slotname should never happen when enabled is true. */ Assert(newsub->slotname); + /* two-phase should not be altered */ + Assert(newsub->twophasestate == MySubscription->twophasestate); + /* * Exit if any parameter that affects the remote connection was changed. * The launcher will start a new worker. @@ -2582,6 +3091,7 @@ maybe_reread_subscription(void) strcmp(newsub->slotname, MySubscription->slotname) != 0 || newsub->binary != MySubscription->binary || newsub->stream != MySubscription->stream || + newsub->owner != MySubscription->owner || !equal(newsub->publications, MySubscription->publications)) { ereport(LOG, @@ -2637,58 +3147,30 @@ subxact_info_write(Oid subid, TransactionId xid) { char path[MAXPGPATH]; Size len; - StreamXidHash *ent; BufFile *fd; Assert(TransactionIdIsValid(xid)); - /* Find the xid entry in the xidhash */ - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_FIND, - NULL); - /* By this time we must have created the transaction entry */ - Assert(ent); + /* construct the subxact filename */ + subxact_filename(path, subid, xid); - /* - * If there is no subtransaction then nothing to do, but if already have - * subxact file then delete that. - */ + /* Delete the subxacts file, if exists. */ if (subxact_data.nsubxacts == 0) { - if (ent->subxact_fileset) - { - cleanup_subxact_info(); - SharedFileSetDeleteAll(ent->subxact_fileset); - pfree(ent->subxact_fileset); - ent->subxact_fileset = NULL; - } + cleanup_subxact_info(); + BufFileDeleteFileSet(MyLogicalRepWorker->stream_fileset, path, true); + return; } - subxact_filename(path, subid, xid); - /* * Create the subxact file if it not already created, otherwise open the * existing file. */ - if (ent->subxact_fileset == NULL) - { - MemoryContext oldctx; - - /* - * We need to maintain shared fileset across multiple stream - * start/stop calls. So, need to allocate it in a persistent context. - */ - oldctx = MemoryContextSwitchTo(ApplyContext); - ent->subxact_fileset = palloc(sizeof(SharedFileSet)); - SharedFileSetInit(ent->subxact_fileset, NULL); - MemoryContextSwitchTo(oldctx); - - fd = BufFileCreateShared(ent->subxact_fileset, path); - } - else - fd = BufFileOpenShared(ent->subxact_fileset, path, O_RDWR); + fd = BufFileOpenFileSet(MyLogicalRepWorker->stream_fileset, path, O_RDWR, + true); + if (fd == NULL) + fd = BufFileCreateFileSet(MyLogicalRepWorker->stream_fileset, path); len = sizeof(SubXactInfo) * subxact_data.nsubxacts; @@ -2716,34 +3198,21 @@ subxact_info_read(Oid subid, TransactionId xid) size_t nread; Size len; BufFile *fd; - StreamXidHash *ent; MemoryContext oldctx; Assert(!subxact_data.subxacts); Assert(subxact_data.nsubxacts == 0); Assert(subxact_data.nsubxacts_max == 0); - /* Find the stream xid entry in the xidhash */ - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_FIND, - NULL); - if (!ent) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("transaction %u not found in stream XID hash table", - xid))); - /* - * If subxact_fileset is not valid that mean we don't have any subxact - * info + * If the subxact file doesn't exist that means we don't have any subxact + * info. */ - if (ent->subxact_fileset == NULL) - return; - subxact_filename(path, subid, xid); - - fd = BufFileOpenShared(ent->subxact_fileset, path, O_RDONLY); + fd = BufFileOpenFileSet(MyLogicalRepWorker->stream_fileset, path, O_RDONLY, + true); + if (fd == NULL) + return; /* read number of subxact items */ nread = BufFileRead(fd, &subxact_data.nsubxacts, sizeof(subxact_data.nsubxacts)); @@ -2882,42 +3351,21 @@ changes_filename(char *path, Oid subid, TransactionId xid) * Cleanup files for a subscription / toplevel transaction. * * Remove files with serialized changes and subxact info for a particular - * toplevel transaction. Each subscription has a separate set of files. + * toplevel transaction. Each subscription has a separate set of files + * for any toplevel transaction. */ static void stream_cleanup_files(Oid subid, TransactionId xid) { char path[MAXPGPATH]; - StreamXidHash *ent; - - /* Find the xid entry in the xidhash */ - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_FIND, - NULL); - if (!ent) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("transaction %u not found in stream XID hash table", - xid))); - /* Delete the change file and release the stream fileset memory */ + /* Delete the changes file. */ changes_filename(path, subid, xid); - SharedFileSetDeleteAll(ent->stream_fileset); - pfree(ent->stream_fileset); - ent->stream_fileset = NULL; + BufFileDeleteFileSet(MyLogicalRepWorker->stream_fileset, path, false); - /* Delete the subxact file and release the memory, if it exist */ - if (ent->subxact_fileset) - { - subxact_filename(path, subid, xid); - SharedFileSetDeleteAll(ent->subxact_fileset); - pfree(ent->subxact_fileset); - ent->subxact_fileset = NULL; - } - - /* Remove the xid entry from the stream xid hash */ - hash_search(xidhash, (void *) &xid, HASH_REMOVE, NULL); + /* Delete the subxact file, if it exists. */ + subxact_filename(path, subid, xid); + BufFileDeleteFileSet(MyLogicalRepWorker->stream_fileset, path, true); } /* @@ -2927,8 +3375,8 @@ stream_cleanup_files(Oid subid, TransactionId xid) * * Open a file for streamed changes from a toplevel transaction identified * by stream_xid (global variable). If it's the first chunk of streamed - * changes for this transaction, initialize the shared fileset and create the - * buffile, otherwise open the previously created file. + * changes for this transaction, create the buffile, otherwise open the + * previously created file. * * This can only be called at the beginning of a "streaming" block, i.e. * between stream_start/stream_stop messages from the upstream. @@ -2937,20 +3385,13 @@ static void stream_open_file(Oid subid, TransactionId xid, bool first_segment) { char path[MAXPGPATH]; - bool found; MemoryContext oldcxt; - StreamXidHash *ent; Assert(in_streamed_transaction); Assert(OidIsValid(subid)); Assert(TransactionIdIsValid(xid)); Assert(stream_fd == NULL); - /* create or find the xid entry in the xidhash */ - ent = (StreamXidHash *) hash_search(xidhash, - (void *) &xid, - HASH_ENTER, - &found); changes_filename(path, subid, xid); elog(DEBUG1, "opening file \"%s\" for streamed changes", path); @@ -2962,49 +3403,20 @@ stream_open_file(Oid subid, TransactionId xid, bool first_segment) oldcxt = MemoryContextSwitchTo(LogicalStreamingContext); /* - * If this is the first streamed segment, the file must not exist, so make - * sure we're the ones creating it. Otherwise just open the file for - * writing, in append mode. + * If this is the first streamed segment, create the changes file. + * Otherwise, just open the file for writing, in append mode. */ if (first_segment) - { - MemoryContext savectx; - SharedFileSet *fileset; - - if (found) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("incorrect first-segment flag for streamed replication transaction"))); - - /* - * We need to maintain shared fileset across multiple stream - * start/stop calls. So, need to allocate it in a persistent context. - */ - savectx = MemoryContextSwitchTo(ApplyContext); - fileset = palloc(sizeof(SharedFileSet)); - - SharedFileSetInit(fileset, NULL); - MemoryContextSwitchTo(savectx); - - stream_fd = BufFileCreateShared(fileset, path); - - /* Remember the fileset for the next stream of the same transaction */ - ent->xid = xid; - ent->stream_fileset = fileset; - ent->subxact_fileset = NULL; - } + stream_fd = BufFileCreateFileSet(MyLogicalRepWorker->stream_fileset, + path); else { - if (!found) - ereport(ERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg_internal("incorrect first-segment flag for streamed replication transaction"))); - /* * Open the file and seek to the end of the file because we always * append the changes file. */ - stream_fd = BufFileOpenShared(ent->stream_fileset, path, O_RDWR); + stream_fd = BufFileOpenFileSet(MyLogicalRepWorker->stream_fileset, + path, O_RDWR, false); BufFileSeek(stream_fd, 0, 0, SEEK_END); } @@ -3078,6 +3490,102 @@ cleanup_subxact_info() subxact_data.nsubxacts_max = 0; } +/* + * Form the prepared transaction GID for two_phase transactions. + * + * Return the GID in the supplied buffer. + */ +static void +TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid) +{ + Assert(subid != InvalidRepOriginId); + + if (!TransactionIdIsValid(xid)) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg_internal("invalid two-phase transaction ID"))); + + 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 = NULL; + + 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) @@ -3085,9 +3593,10 @@ 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; /* Attach to slot */ logicalrep_worker_attach(worker_slot); @@ -3180,15 +3689,18 @@ ApplyWorkerMain(Datum main_arg) if (am_tablesync_worker()) { - char *syncslotname; - - /* This is table synchronization worker, call initial sync. */ - syncslotname = LogicalRepSyncTableStart(&origin_startpos); + start_table_sync(&origin_startpos, &myslotname); - /* allocate slot name in long-lived context */ - 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 { @@ -3232,6 +3744,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); } /* @@ -3246,18 +3765,98 @@ ApplyWorkerMain(Datum main_arg) options.logical = true; options.startpoint = origin_startpos; options.slotname = myslotname; + + server_version = walrcv_server_version(LogRepWorkerWalRcvConn); options.proto.logical.proto_version = - walrcv_server_version(LogRepWorkerWalRcvConn) >= 140000 ? - LOGICALREP_PROTO_STREAM_VERSION_NUM : LOGICALREP_PROTO_VERSION_NUM; + server_version >= 150000 ? LOGICALREP_PROTO_TWOPHASE_VERSION_NUM : + server_version >= 140000 ? LOGICALREP_PROTO_STREAM_VERSION_NUM : + LOGICALREP_PROTO_VERSION_NUM; + options.proto.logical.publication_names = MySubscription->publications; options.proto.logical.binary = MySubscription->binary; options.proto.logical.streaming = MySubscription->stream; + options.proto.logical.twophase = false; + + if (!am_tablesync_worker()) + { + /* + * Even when the two_phase mode is requested by the user, it remains + * as the tri-state PENDING until all tablesyncs have reached READY + * state. Only then, can it become ENABLED. + * + * Note: If the subscription has no tables then leave the state as + * PENDING, which allows ALTER SUBSCRIPTION ... REFRESH PUBLICATION to + * work. + */ + if (MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING && + AllTablesyncsReady()) + { + /* Start streaming with two_phase enabled */ + options.proto.logical.twophase = true; + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + + StartTransactionCommand(); + UpdateTwoPhaseState(MySubscription->oid, LOGICALREP_TWOPHASE_STATE_ENABLED); + MySubscription->twophasestate = LOGICALREP_TWOPHASE_STATE_ENABLED; + CommitTransactionCommand(); + } + else + { + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + } - /* Start normal logical streaming replication. */ - walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + ereport(DEBUG1, + (errmsg_internal("logical replication apply worker for subscription \"%s\" two_phase is %s", + MySubscription->name, + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_DISABLED ? "DISABLED" : + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING ? "PENDING" : + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED ? "ENABLED" : + "?"))); + } + else + { + /* Start normal logical streaming replication. */ + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + } /* Run the main loop. */ - LogicalRepApplyLoop(origin_startpos); + start_apply(origin_startpos); + + proc_exit(0); +} + +/* + * 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("subscription \"%s\" has been disabled because of an error", + MySubscription->name)); proc_exit(0); } @@ -3270,3 +3869,202 @@ 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("logical replication starts skipping transaction at LSN %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("logical replication completed skipping transaction at LSN %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 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) +{ + ApplyErrorCallbackArg *errarg = &apply_error_callback_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 for replication origin \"%s\" during message type \"%s\"", + errarg->origin_name, + logicalrep_message_type(errarg->command)); + else if (XLogRecPtrIsInvalid(errarg->finish_lsn)) + errcontext("processing remote data for replication origin \"%s\" during message type \"%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 message type \"%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 for replication origin \"%s\" during message type \"%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, + LSN_FORMAT_ARGS(errarg->finish_lsn)); + else + errcontext("processing remote data for replication origin \"%s\" during message type \"%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, + LSN_FORMAT_ARGS(errarg->finish_lsn)); +} + +/* Set transaction information of apply error callback */ +static inline void +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 */ +static inline void +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, InvalidXLogRecPtr); +} diff --git a/third_party/spanner_pg/src/backend/replication/pgoutput/pgoutput.c b/third_party/spanner_pg/src/backend/replication/pgoutput/pgoutput.c index 00078505..63dbeb14 100644 --- a/third_party/spanner_pg/src/backend/replication/pgoutput/pgoutput.c +++ b/third_party/spanner_pg/src/backend/replication/pgoutput/pgoutput.c @@ -3,7 +3,7 @@ * pgoutput.c * Logical Replication output plugin * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/pgoutput/pgoutput.c @@ -15,16 +15,21 @@ #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/int8.h" +#include "utils/builtins.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" +#include "utils/rel.h" #include "utils/syscache.h" #include "utils/varlena.h" @@ -53,6 +58,16 @@ static void pgoutput_message(LogicalDecodingContext *ctx, Size sz, const char *message); static bool pgoutput_origin_filter(LogicalDecodingContext *ctx, RepOriginId origin_id); +static void pgoutput_begin_prepare_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn); +static void pgoutput_prepare_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, XLogRecPtr prepare_lsn); +static void pgoutput_commit_prepared_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, XLogRecPtr commit_lsn); +static void pgoutput_rollback_prepared_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, + XLogRecPtr prepare_end_lsn, + TimestampTz prepare_time); static void pgoutput_stream_start(struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn); static void pgoutput_stream_stop(struct LogicalDecodingContext *ctx, @@ -63,6 +78,8 @@ static void pgoutput_stream_abort(struct LogicalDecodingContext *ctx, static void pgoutput_stream_commit(struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn); +static void pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, XLogRecPtr prepare_lsn); static bool publications_valid; static bool in_streaming; @@ -71,8 +88,26 @@ 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); -static void update_replication_progress(LogicalDecodingContext *ctx); + LogicalDecodingContext *ctx, + Bitmapset *columns); +static void send_repl_origin(LogicalDecodingContext *ctx, + RepOriginId origin_id, XLogRecPtr origin_lsn, + bool send_origin); +static void update_replication_progress(LogicalDecodingContext *ctx, + bool skipped_xact); + +/* + * 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. @@ -96,13 +131,27 @@ typedef struct RelationSyncEntry { Oid relid; /* relation oid */ + bool replicate_valid; /* overall validity flag for entry */ + bool schema_sent; List *streamed_txns; /* streamed toplevel transactions with this * schema */ - bool replicate_valid; + /* 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 */ + 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 @@ -117,15 +166,58 @@ typedef struct RelationSyncEntry * same as 'relid' or if unnecessary due to partition and the ancestor * having identical TupleDesc. */ - TupleConversionMap *map; + 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; +/* + * 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; 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); @@ -133,6 +225,25 @@ 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); + +/* column list routines */ +static void pgoutput_column_list_init(PGOutputData *data, + List *publications, + RelationSyncEntry *entry); /* * Specify output plugin callbacks @@ -148,6 +259,11 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->truncate_cb = pgoutput_truncate; cb->message_cb = pgoutput_message; cb->commit_cb = pgoutput_commit_txn; + + cb->begin_prepare_cb = pgoutput_begin_prepare_txn; + cb->prepare_cb = pgoutput_prepare_txn; + cb->commit_prepared_cb = pgoutput_commit_prepared_txn; + cb->rollback_prepared_cb = pgoutput_rollback_prepared_txn; cb->filter_by_origin_cb = pgoutput_origin_filter; cb->shutdown_cb = pgoutput_shutdown; @@ -159,6 +275,8 @@ _PG_output_plugin_init(OutputPluginCallbacks *cb) cb->stream_change_cb = pgoutput_change; cb->stream_message_cb = pgoutput_message; cb->stream_truncate_cb = pgoutput_truncate; + /* transaction streaming - two-phase commit */ + cb->stream_prepare_cb = pgoutput_stream_prepare_txn; } static void @@ -170,10 +288,12 @@ parse_output_parameters(List *options, PGOutputData *data) bool binary_option_given = false; bool messages_option_given = false; bool streaming_given = false; + bool two_phase_option_given = false; data->binary = false; data->streaming = false; data->messages = false; + data->two_phase = false; foreach(lc, options) { @@ -184,7 +304,8 @@ parse_output_parameters(List *options, PGOutputData *data) /* Check each param, whether or not we recognize it */ if (strcmp(defel->defname, "proto_version") == 0) { - int64 parsed; + unsigned long parsed; + char *endptr; if (protocol_version_given) ereport(ERROR, @@ -192,12 +313,14 @@ parse_output_parameters(List *options, PGOutputData *data) errmsg("conflicting or redundant options"))); protocol_version_given = true; - if (!scanint8(strVal(defel->arg), true, &parsed)) + errno = 0; + parsed = strtoul(strVal(defel->arg), &endptr, 10); + if (errno != 0 || *endptr != '\0') ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid proto_version"))); - if (parsed > PG_UINT32_MAX || parsed < 0) + if (parsed > PG_UINT32_MAX) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("proto_version \"%s\" out of range", @@ -249,6 +372,16 @@ parse_output_parameters(List *options, PGOutputData *data) data->streaming = defGetBoolean(defel); } + else if (strcmp(defel->defname, "two_phase") == 0) + { + if (two_phase_option_given) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"))); + two_phase_option_given = true; + + data->two_phase = defGetBoolean(defel); + } else elog(ERROR, "unrecognized pgoutput option: %s", defel->defname); } @@ -269,6 +402,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. */ @@ -323,6 +460,27 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, /* Also remember we're currently not streaming any transaction. */ in_streaming = false; + /* + * Here, we just check whether the two-phase option is passed by + * plugin and decide whether to enable it at later point of time. It + * remains enabled if the previous start-up has done so. But we only + * allow the option to be passed in with sufficient version of the + * protocol, and when the output plugin supports it. + */ + if (!data->two_phase) + ctx->twophase_opt_given = false; + else if (data->protocol_version < LOGICALREP_PROTO_TWOPHASE_VERSION_NUM) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("requested proto_version=%d does not support two-phase commit, need %d or higher", + data->protocol_version, LOGICALREP_PROTO_TWOPHASE_VERSION_NUM))); + else if (!ctx->twophase) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("two-phase commit requested, but not supported by output plugin"))); + else + ctx->twophase_opt_given = true; + /* Init publication state. */ data->publications = NIL; publications_valid = false; @@ -344,45 +502,54 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, } else { - /* Disable the streaming during the slot initialization mode. */ + /* + * Disable the streaming and prepared transactions during the slot + * initialization mode. + */ ctx->streaming = false; + ctx->twophase = false; } } /* - * 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) +{ + 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; - if (send_replication_origin) - { - char *origin; - - /*---------- - * XXX: which behaviour do we want here? - * - * Alternatives: - * - don't send origin message if origin name not found - * (that's what we do now) - * - throw error - that will break replication, not good - * - send some special "unknown" origin - *---------- - */ - if (replorigin_by_oid(txn->origin_id, true, &origin)) - { - /* Message boundary */ - OutputPluginWrite(ctx, false); - OutputPluginPrepareWrite(ctx, true); - logicalrep_write_origin(ctx->out, origin, txn->origin_lsn); - } - - } + send_repl_origin(ctx, txn->origin_id, txn->origin_lsn, + send_replication_origin); OutputPluginWrite(ctx, true); } @@ -394,20 +561,100 @@ static void pgoutput_commit_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn) { - update_replication_progress(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; + update_replication_progress(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); OutputPluginWrite(ctx, true); } +/* + * BEGIN PREPARE callback + */ +static void +pgoutput_begin_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn) +{ + bool send_replication_origin = txn->origin_id != InvalidRepOriginId; + + OutputPluginPrepareWrite(ctx, !send_replication_origin); + logicalrep_write_begin_prepare(ctx->out, txn); + + send_repl_origin(ctx, txn->origin_id, txn->origin_lsn, + send_replication_origin); + + OutputPluginWrite(ctx, true); +} + +/* + * PREPARE callback + */ +static void +pgoutput_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn) +{ + update_replication_progress(ctx, false); + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_prepare(ctx->out, txn, prepare_lsn); + OutputPluginWrite(ctx, true); +} + +/* + * COMMIT PREPARED callback + */ +static void +pgoutput_commit_prepared_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, + XLogRecPtr commit_lsn) +{ + update_replication_progress(ctx, false); + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_commit_prepared(ctx->out, txn, commit_lsn); + OutputPluginWrite(ctx, true); +} + +/* + * ROLLBACK PREPARED callback + */ +static void +pgoutput_rollback_prepared_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, + XLogRecPtr prepare_end_lsn, + TimestampTz prepare_time) +{ + update_replication_progress(ctx, false); + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_rollback_prepared(ctx->out, txn, prepare_end_lsn, + prepare_time); + OutputPluginWrite(ctx, true); +} + /* * Write the current schema of the relation and its ancestor (if any) if not * done yet. */ static void maybe_send_schema(LogicalDecodingContext *ctx, - ReorderBufferTXN *txn, ReorderBufferChange *change, + ReorderBufferChange *change, Relation relation, RelationSyncEntry *relentry) { bool schema_sent; @@ -431,106 +678,677 @@ maybe_send_schema(LogicalDecodingContext *ctx, topxid = xid; /* - * Do we need to send the schema? We do track streamed transactions - * separately, because those may be applied later (and the regular - * transactions won't see their effects until then) and in an order that - * we don't know at this point. - * - * XXX There is a scope of optimization here. Currently, we always send - * the schema first time in a streaming transaction but we can probably - * avoid that by checking 'relentry->schema_sent' flag. However, before - * doing that we need to study its impact on the case where we have a mix - * of streaming and non-streaming transactions. + * Do we need to send the schema? We do track streamed transactions + * separately, because those may be applied later (and the regular + * transactions won't see their effects until then) and in an order that + * we don't know at this point. + * + * XXX There is a scope of optimization here. Currently, we always send + * the schema first time in a streaming transaction but we can probably + * avoid that by checking 'relentry->schema_sent' flag. However, before + * doing that we need to study its impact on the case where we have a mix + * of streaming and non-streaming transactions. + */ + if (in_streaming) + schema_sent = get_schema_sent_in_streamed_txn(relentry, topxid); + else + schema_sent = relentry->schema_sent; + + /* Nothing to do if we already sent the schema. */ + if (schema_sent) + return; + + /* + * 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); + + send_relation_and_attrs(ancestor, xid, ctx, relentry->columns); + RelationClose(ancestor); + } + + send_relation_and_attrs(relation, xid, ctx, relentry->columns); + + if (in_streaming) + set_schema_sent_in_streamed_txn(relentry, topxid); + else + relentry->schema_sent = true; +} + +/* + * Sends a relation + */ +static void +send_relation_and_attrs(Relation relation, TransactionId xid, + LogicalDecodingContext *ctx, + Bitmapset *columns) +{ + TupleDesc desc = RelationGetDescr(relation); + int i; + + /* + * Write out type info if needed. We do that only for user-created types. + * We use FirstGenbkiObjectId as the cutoff, so that we only consider + * objects with hand-assigned OIDs to be "built in", not for instance any + * function or type defined in the information_schema. This is important + * because only hand-assigned OIDs can be expected to remain stable across + * major versions. + */ + for (i = 0; i < desc->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(desc, i); + + if (att->attisdropped || att->attgenerated) + continue; + + 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, columns); + 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); +} + +/* + * 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. + */ +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; + Oid schemaid = get_rel_namespace(entry->publish_as_relid); + + /* + * 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 and FOR TABLES IN SCHEMA 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 = true; + + /* + * If the publication is FOR ALL TABLES, or the publication includes a + * FOR TABLES IN SCHEMA where the table belongs to the referred + * schema, then it is treated the same as if there are no row filters + * (even if other publications have a row filter). + */ + if (!pub->alltables && + !SearchSysCacheExists2(PUBLICATIONNAMESPACEMAP, + ObjectIdGetDatum(schemaid), + ObjectIdGetDatum(pub->oid))) + { + /* + * 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); + } + } + + 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); + + 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->entry_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 column list. + */ +static void +pgoutput_column_list_init(PGOutputData *data, List *publications, + RelationSyncEntry *entry) +{ + ListCell *lc; + bool first = true; + Relation relation = RelationIdGetRelation(entry->publish_as_relid); + + /* + * Find if there are any column lists for this relation. If there are, + * build a bitmap using the column lists. + * + * Multiple publications might have multiple column lists for this + * relation. + * + * Note that we don't support the case where the column list is different + * for the same table when combining publications. See comments atop + * fetch_table_list. But one can later change the publication so we still + * need to check all the given publication-table mappings and report an + * error if any publications have a different column list. + * + * FOR ALL TABLES and FOR TABLES IN SCHEMA imply "don't use column list". + */ + foreach(lc, publications) + { + Publication *pub = lfirst(lc); + HeapTuple cftuple = NULL; + Datum cfdatum = 0; + Bitmapset *cols = NULL; + + /* + * 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) + { + bool pub_no_list = true; + + /* + * 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. */ + cfdatum = SysCacheGetAttr(PUBLICATIONRELMAP, cftuple, + Anum_pg_publication_rel_prattrs, + &pub_no_list); + + /* Build the column list bitmap in the per-entry context. */ + if (!pub_no_list) /* when not null */ + { + pgoutput_ensure_entry_cxt(data, entry); + + cols = pub_collist_to_bitmapset(cols, cfdatum, + entry->entry_cxt); + + /* + * If column list includes all the columns of the table, + * set it to NULL. + */ + if (bms_num_members(cols) == RelationGetNumberOfAttributes(relation)) + { + bms_free(cols); + cols = NULL; + } + } + + ReleaseSysCache(cftuple); + } + } + + if (first) + { + entry->columns = cols; + first = false; + } + else if (!bms_equal(entry->columns, cols)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use different column lists for table \"%s.%s\" in different publications", + get_namespace_name(RelationGetNamespace(relation)), + RelationGetRelationName(relation))); + } /* loop all subscribed publications */ + + 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 = CreateTupleDescCopyConstr(RelationGetDescr(relation)); + newtupdesc = CreateTupleDescCopyConstr(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 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. + */ + 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. */ - if (in_streaming) - schema_sent = get_schema_sent_in_streamed_txn(relentry, topxid); - else - schema_sent = relentry->schema_sent; + Assert(map_changetype_pubaction[*action] == PUBACTION_UPDATE); - /* Nothing to do if we already sent the schema. */ - if (schema_sent) - return; + slot_getallattrs(new_slot); + slot_getallattrs(old_slot); + + tmp_new_slot = NULL; + desc = RelationGetDescr(relation); /* - * 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. + * The new tuple might not have all the replica identity columns, in which + * case it needs to be copied over from the old tuple. */ - if (relentry->publish_as_relid != RelationGetRelid(relation)) + for (i = 0; i < desc->natts; i++) { - Relation ancestor = RelationIdGetRelation(relentry->publish_as_relid); - TupleDesc indesc = RelationGetDescr(relation); - TupleDesc outdesc = RelationGetDescr(ancestor); - MemoryContext oldctx; + Form_pg_attribute att = TupleDescAttr(desc, i); - /* Map must live as long as the session does. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); + /* + * 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; /* - * Make copies of the TupleDescs that will live as long as the map - * does before putting into the map. + * 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. */ - indesc = CreateTupleDescCopy(indesc); - outdesc = CreateTupleDescCopy(outdesc); - relentry->map = convert_tuples_by_name(indesc, outdesc); - if (relentry->map == NULL) + if (att->attlen == -1 && + VARATT_IS_EXTERNAL_ONDISK(new_slot->tts_values[i]) && + !VARATT_IS_EXTERNAL_ONDISK(old_slot->tts_values[i])) { - /* Map not necessary, so free the TupleDescs too. */ - FreeTupleDesc(indesc); - FreeTupleDesc(outdesc); - } + if (!tmp_new_slot) + { + tmp_new_slot = MakeSingleTupleTableSlot(desc, &TTSOpsVirtual); + ExecClearTuple(tmp_new_slot); - MemoryContextSwitchTo(oldctx); - send_relation_and_attrs(ancestor, xid, ctx); - RelationClose(ancestor); + 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]; + } } - send_relation_and_attrs(relation, xid, ctx); + ecxt->ecxt_scantuple = old_slot; + old_matched = pgoutput_row_filter_exec_expr(filter_exprstate, ecxt); - if (in_streaming) - set_schema_sent_in_streamed_txn(relentry, topxid); + if (tmp_new_slot) + { + ExecStoreVirtualTuple(tmp_new_slot); + ecxt->ecxt_scantuple = tmp_new_slot; + } else - relentry->schema_sent = true; -} + ecxt->ecxt_scantuple = new_slot; -/* - * Sends a relation - */ -static void -send_relation_and_attrs(Relation relation, TransactionId xid, - LogicalDecodingContext *ctx) -{ - TupleDesc desc = RelationGetDescr(relation); - int i; + new_matched = pgoutput_row_filter_exec_expr(filter_exprstate, ecxt); /* - * Write out type info if needed. We do that only for user-created types. - * We use FirstGenbkiObjectId as the cutoff, so that we only consider - * objects with hand-assigned OIDs to be "built in", not for instance any - * function or type defined in the information_schema. This is important - * because only hand-assigned OIDs can be expected to remain stable across - * major versions. + * Case 1: if both tuples don't match the row filter, bailout. Send + * nothing. */ - for (i = 0; i < desc->natts; i++) + 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) { - Form_pg_attribute att = TupleDescAttr(desc, i); + *action = REORDER_BUFFER_CHANGE_INSERT; - if (att->attisdropped || att->attgenerated) - continue; + if (tmp_new_slot) + *new_slot_ptr = tmp_new_slot; + } - if (att->atttypid < FirstGenbkiObjectId) - continue; + /* + * 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; - OutputPluginPrepareWrite(ctx, false); - logicalrep_write_typ(ctx->out, xid, att->atttypid); - OutputPluginWrite(ctx, false); - } + /* + * Case 4: if both tuples match the row filter, transformation isn't + * required. (*action is default UPDATE). + */ - OutputPluginPrepareWrite(ctx, false); - logicalrep_write_rel(ctx->out, xid, relation); - OutputPluginWrite(ctx, false); + return true; } /* @@ -543,12 +1361,17 @@ 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; Relation ancestor = NULL; + Relation targetrel = relation; + ReorderBufferChangeType action = change->action; + TupleTableSlot *old_slot = NULL; + TupleTableSlot *new_slot = NULL; - update_replication_progress(ctx); + update_replication_progress(ctx, false); if (!is_publishable_relation(relation)) return; @@ -562,10 +1385,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) @@ -586,80 +1409,171 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, /* Avoid leaking memory by using and resetting our own context */ old = MemoryContextSwitchTo(data->context); - maybe_send_schema(ctx, txn, 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; - } + + /* + * 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. + */ + maybe_send_schema(ctx, change, relation, relentry); + + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_insert(ctx->out, xid, targetrel, new_slot, + data->binary, relentry->columns); + 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; + + /* 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); + + /* + * 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, + relentry->columns); + break; + case REORDER_BUFFER_CHANGE_UPDATE: + logicalrep_write_update(ctx->out, xid, targetrel, + old_slot, new_slot, data->binary, + relentry->columns); + break; + case REORDER_BUFFER_CHANGE_DELETE: + logicalrep_write_delete(ctx->out, xid, targetrel, + old_slot, data->binary, + relentry->columns); + 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; + + /* 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); - logicalrep_write_delete(ctx->out, xid, relation, oldtuple, - data->binary); + logicalrep_write_delete(ctx->out, xid, targetrel, + old_slot, data->binary, + relentry->columns); OutputPluginWrite(ctx, true); } else @@ -685,6 +1599,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; @@ -692,7 +1607,7 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, Oid *relids; TransactionId xid = InvalidTransactionId; - update_replication_progress(ctx); + update_replication_progress(ctx, false); /* Remember the xid for the change in streaming mode. See pgoutput_change. */ if (in_streaming) @@ -711,7 +1626,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; @@ -725,7 +1640,12 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, continue; relids[nrelids++] = relid; - maybe_send_schema(ctx, txn, change, relation, relentry); + + /* 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); } if (nrelids > 0) @@ -752,7 +1672,7 @@ pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; TransactionId xid = InvalidTransactionId; - update_replication_progress(ctx); + update_replication_progress(ctx, false); if (!data->messages) return; @@ -764,6 +1684,18 @@ 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, @@ -788,8 +1720,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 contexts of the ctx->context so they will be cleaned up by + * logical decoding machinery. */ static void pgoutput_shutdown(LogicalDecodingContext *ctx) @@ -822,7 +1755,9 @@ LoadPublications(List *pubnames) } /* - * Publication cache invalidation callback. + * Publication syscache invalidation callback. + * + * Called for invalidations on pg_publication. */ static void publication_invalidation_cb(Datum arg, int cacheid, uint32 hashvalue) @@ -858,18 +1793,8 @@ pgoutput_stream_start(struct LogicalDecodingContext *ctx, OutputPluginPrepareWrite(ctx, !send_replication_origin); logicalrep_write_stream_start(ctx->out, txn->xid, !rbtxn_is_streamed(txn)); - if (send_replication_origin) - { - char *origin; - - if (replorigin_by_oid(txn->origin_id, true, &origin)) - { - /* Message boundary */ - OutputPluginWrite(ctx, false); - OutputPluginPrepareWrite(ctx, true); - logicalrep_write_origin(ctx->out, origin, InvalidXLogRecPtr); - } - } + send_repl_origin(ctx, txn->origin_id, InvalidXLogRecPtr, + send_replication_origin); OutputPluginWrite(ctx, true); @@ -940,7 +1865,7 @@ pgoutput_stream_commit(struct LogicalDecodingContext *ctx, Assert(!in_streaming); Assert(rbtxn_is_streamed(txn)); - update_replication_progress(ctx); + update_replication_progress(ctx, false); OutputPluginPrepareWrite(ctx, true); logicalrep_write_stream_commit(ctx->out, txn, commit_lsn); @@ -949,6 +1874,24 @@ pgoutput_stream_commit(struct LogicalDecodingContext *ctx, cleanup_rel_sync_cache(txn->xid, true); } +/* + * PREPARE callback (for streaming two-phase commit). + * + * Notify the downstream to prepare the transaction. + */ +static void +pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx, + ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn) +{ + Assert(rbtxn_is_streamed(txn)); + + update_replication_progress(ctx, false); + OutputPluginPrepareWrite(ctx, true); + logicalrep_write_stream_prepare(ctx->out, txn, prepare_lsn); + OutputPluginWrite(ctx, true); +} + /* * Initialize the relation schema sync cache for a decoding session. * @@ -985,6 +1928,9 @@ init_rel_sync_cache(MemoryContext cachectx) CacheRegisterSyscacheCallback(PUBLICATIONRELMAP, rel_sync_cache_publication_cb, (Datum) 0); + CacheRegisterSyscacheCallback(PUBLICATIONNAMESPACEMAP, + rel_sync_cache_publication_cb, + (Datum) 0); relation_callbacks_registered = true; } @@ -1032,11 +1978,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); @@ -1046,46 +1993,102 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) HASH_ENTER, &found); Assert(entry != NULL); - /* Not found means schema wasn't sent */ + /* initialize entry, if it's new */ if (!found) { - /* immediately make a new entry valid enough to satisfy callbacks */ + entry->replicate_valid = false; entry->schema_sent = false; entry->streamed_txns = NIL; - entry->replicate_valid = false; 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->entry_cxt = NULL; entry->publish_as_relid = InvalidOid; - entry->map = NULL; /* will be set by maybe_send_schema() if - * needed */ + entry->columns = NULL; + entry->attrmap = NULL; } /* Validate the entry */ if (!entry->replicate_valid) { + Oid schemaId = get_rel_namespace(relid); List *pubids = GetRelationPublications(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); 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. */ if (!publications_valid) { oldctx = MemoryContextSwitchTo(CacheMemoryContext); if (data->publications) + { list_free_deep(data->publications); - + data->publications = NIL; + } data->publications = LoadPublications(data->publication_names); MemoryContextSwitchTo(oldctx); publications_valid = true; } + /* + * Reset schema_sent status as the relation definition may have + * changed. Also reset pubactions to empty in case rel was dropped + * from a publication. Also free any objects that depended on the + * earlier definition. + */ + 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; + entry->pubactions.pubtruncate = false; + + /* + * 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->entry_cxt) + MemoryContextDelete(entry->entry_cxt); + + 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) { @@ -1094,15 +2097,15 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) /* * 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. + * 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 this is a FOR ALL TABLES publication, pick the partition + * root and set the ancestor level accordingly. */ if (pub->alltables) { @@ -1128,38 +2131,35 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) */ if (am_partition) { + Oid ancestor; + int level; List *ancestors = get_partition_ancestors(relid); - ListCell *lc2; - int level = 0; - - /* - * Find the "topmost" ancestor that is in this - * publication. - */ - foreach(lc2, ancestors) - { - Oid ancestor = lfirst_oid(lc2); - level++; + ancestor = GetTopMostAncestorInPublication(pub->oid, + ancestors, + &level); - if (list_member_oid(GetRelationPublications(ancestor), - pub->oid)) + if (ancestor != InvalidOid) + { + ancestor_published = true; + if (pub->pubviaroot) { - ancestor_published = true; - if (pub->pubviaroot) - { - pub_relid = ancestor; - ancestor_level = level; - } + pub_relid = ancestor; + ancestor_level = level; } } } - if (list_member_oid(pubids, pub->oid) || ancestor_published) + if (list_member_oid(pubids, pub->oid) || + list_member_oid(schemaPubids, pub->oid) || + ancestor_published) publish = true; } /* + * 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. @@ -1174,23 +2174,61 @@ get_rel_sync_entry(PGOutputData *data, Oid relid) /* * 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. + * 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; + /* + * 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); } } + 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); + + /* Initialize the column list */ + pgoutput_column_list_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; } @@ -1260,43 +2298,40 @@ rel_sync_cache_relation_cb(Datum arg, Oid relid) /* * Nobody keeps pointers to entries in this hash table around outside * logical decoding callback calls - but invalidation events can come in - * *during* a callback if we access the relcache in the callback. Because - * of that we must mark the cache entry as invalid but not remove it from - * the hash while it could still be referenced, then prune it at a later - * safe point. - * - * Getting invalidations for relations that aren't in the table is - * entirely normal, since there's no way to unregister for an invalidation - * event. So we don't care if it's found or not. - */ - entry = (RelationSyncEntry *) hash_search(RelationSyncCache, &relid, - HASH_FIND, NULL); - - /* - * Reset schema sent status as the relation definition may have changed. - * Also free any objects that depended on the earlier definition. + * *during* a callback if we do any syscache access in the callback. + * Because of that we must mark the cache entry as invalid but not damage + * any of its substructure here. The next get_rel_sync_entry() call will + * rebuild it all. */ - if (entry != NULL) + if (OidIsValid(relid)) { - entry->schema_sent = false; - list_free(entry->streamed_txns); - entry->streamed_txns = NIL; - if (entry->map) + /* + * Getting invalidations for relations that aren't in the table is + * entirely normal. So we don't care if it's found or not. + */ + entry = (RelationSyncEntry *) hash_search(RelationSyncCache, &relid, + HASH_FIND, NULL); + if (entry != NULL) + entry->replicate_valid = false; + } + else + { + /* Whole cache must be flushed. */ + HASH_SEQ_STATUS status; + + hash_seq_init(&status, RelationSyncCache); + while ((entry = (RelationSyncEntry *) hash_seq_search(&status)) != NULL) { - /* - * 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->replicate_valid = false; } - entry->map = NULL; } } /* - * Publication relation map syscache invalidation callback + * Publication relation/schema map syscache invalidation callback + * + * Called for invalidations on pg_publication, pg_publication_rel, and + * pg_publication_namespace. */ static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) @@ -1320,15 +2355,36 @@ rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) while ((entry = (RelationSyncEntry *) hash_seq_search(&status)) != NULL) { entry->replicate_valid = false; + } +} - /* - * There might be some relations dropped from the publication so we - * don't need to publish the changes for them. +/* Send Replication origin */ +static void +send_repl_origin(LogicalDecodingContext *ctx, RepOriginId origin_id, + XLogRecPtr origin_lsn, bool send_origin) +{ + if (send_origin) + { + char *origin; + + /*---------- + * XXX: which behaviour do we want here? + * + * Alternatives: + * - don't send origin message if origin name not found + * (that's what we do now) + * - throw error - that will break replication, not good + * - send some special "unknown" origin + *---------- */ - entry->pubactions.pubinsert = false; - entry->pubactions.pubupdate = false; - entry->pubactions.pubdelete = false; - entry->pubactions.pubtruncate = false; + if (replorigin_by_oid(origin_id, true, &origin)) + { + /* Message boundary */ + OutputPluginWrite(ctx, false); + OutputPluginPrepareWrite(ctx, true); + + logicalrep_write_origin(ctx->out, origin, origin_lsn); + } } } @@ -1338,10 +2394,11 @@ rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) * * For a large transaction, if we don't send any change to the downstream for a * long time (exceeds the wal_receiver_timeout of standby) then it can timeout. - * This can happen when all or most of the changes are not published. + * This can happen when all or most of the changes are either not published or + * got filtered out. */ static void -update_replication_progress(LogicalDecodingContext *ctx) +update_replication_progress(LogicalDecodingContext *ctx, bool skipped_xact) { static int changes_count = 0; @@ -1360,7 +2417,7 @@ update_replication_progress(LogicalDecodingContext *ctx) */ if (ctx->end_xact || ++changes_count >= CHANGES_THRESHOLD) { - OutputPluginUpdateProgress(ctx); + OutputPluginUpdateProgress(ctx, skipped_xact); changes_count = 0; } } diff --git a/third_party/spanner_pg/src/backend/replication/repl_gram.y b/third_party/spanner_pg/src/backend/replication/repl_gram.y index 802c0ad0..ea6b8c0a 100644 --- a/third_party/spanner_pg/src/backend/replication/repl_gram.y +++ b/third_party/spanner_pg/src/backend/replication/repl_gram.y @@ -3,7 +3,7 @@ * * repl_gram.y - Parser for the replication commands * - * 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 * * @@ -42,15 +42,15 @@ Node *replication_parse_result; %expect 0 %name-prefix="replication_yy" -%union { - char *str; - bool boolval; - uint32 uintval; - - XLogRecPtr recptr; - Node *node; - List *list; - DefElem *defelt; +%union +{ + char *str; + bool boolval; + uint32 uintval; + XLogRecPtr recptr; + Node *node; + List *list; + DefElem *defelt; } /* Non-keyword tokens */ @@ -61,46 +61,38 @@ Node *replication_parse_result; /* Keyword tokens. */ %token K_BASE_BACKUP %token K_IDENTIFY_SYSTEM +%token K_READ_REPLICATION_SLOT %token K_SHOW %token K_START_REPLICATION %token K_CREATE_REPLICATION_SLOT %token K_DROP_REPLICATION_SLOT %token K_TIMELINE_HISTORY -%token K_LABEL -%token K_PROGRESS -%token K_FAST %token K_WAIT -%token K_NOWAIT -%token K_MAX_RATE -%token K_WAL -%token K_TABLESPACE_MAP -%token K_NOVERIFY_CHECKSUMS %token K_TIMELINE %token K_PHYSICAL %token K_LOGICAL %token K_SLOT %token K_RESERVE_WAL %token K_TEMPORARY +%token K_TWO_PHASE %token K_EXPORT_SNAPSHOT %token K_NOEXPORT_SNAPSHOT %token K_USE_SNAPSHOT -%token K_MANIFEST -%token K_MANIFEST_CHECKSUMS %type command %type base_backup start_replication start_logical_replication create_replication_slot drop_replication_slot identify_system - timeline_history show -%type base_backup_opt_list -%type base_backup_opt + read_replication_slot timeline_history show +%type generic_option_list +%type generic_option %type opt_timeline %type plugin_options plugin_opt_list %type plugin_opt_elem %type plugin_opt_arg -%type opt_slot var_name +%type opt_slot var_name ident_or_keyword %type opt_temporary -%type create_slot_opt_list -%type create_slot_opt +%type create_slot_options create_slot_legacy_opt_list +%type create_slot_legacy_opt %% @@ -121,6 +113,7 @@ command: | start_logical_replication | create_replication_slot | drop_replication_slot + | read_replication_slot | timeline_history | show ; @@ -135,6 +128,18 @@ identify_system: } ; +/* + * READ_REPLICATION_SLOT %s + */ +read_replication_slot: + K_READ_REPLICATION_SLOT var_name + { + ReadReplicationSlotCmd *n = makeNode(ReadReplicationSlotCmd); + n->slotname = $2; + $$ = (Node *) n; + } + ; + /* * SHOW setting */ @@ -152,82 +157,25 @@ var_name: IDENT { $$ = $1; } ; /* - * BASE_BACKUP [LABEL '
tag attributes, or unset if none\n")); - fprintf(output, _(" \\x [on|off|auto] toggle expanded output (currently %s)\n"), - pset.popt.topt.expanded == 2 ? "auto" : ON(pset.popt.topt.expanded)); - fprintf(output, "\n"); - - fprintf(output, _("Connection\n")); + HELP0(" \\w FILE write query buffer to file\n"); + HELP0("\n"); + + HELP0("Input/Output\n"); + HELP0(" \\copy ... perform SQL COPY with data stream to the client host\n"); + HELP0(" \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"); + HELP0(" \\i FILE execute commands from file\n"); + HELP0(" \\ir FILE as \\i, but relative to location of current script\n"); + HELP0(" \\o [FILE] send all query results to file or |pipe\n"); + HELP0(" \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"); + HELP0(" \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"); + HELP0("\n"); + + HELP0("Conditional\n"); + HELP0(" \\if EXPR begin conditional block\n"); + HELP0(" \\elif EXPR alternative within current conditional block\n"); + HELP0(" \\else final alternative within current conditional block\n"); + HELP0(" \\endif end conditional block\n"); + HELP0("\n"); + + HELP0("Informational\n"); + HELP0(" (options: S = show system objects, + = additional detail)\n"); + HELP0(" \\d[S+] list tables, views, and sequences\n"); + HELP0(" \\d[S+] NAME describe table, view, sequence, or index\n"); + HELP0(" \\da[S] [PATTERN] list aggregates\n"); + HELP0(" \\dA[+] [PATTERN] list access methods\n"); + HELP0(" \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"); + HELP0(" \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"); + HELP0(" \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"); + HELP0(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"); + HELP0(" \\db[+] [PATTERN] list tablespaces\n"); + HELP0(" \\dc[S+] [PATTERN] list conversions\n"); + HELP0(" \\dconfig[+] [PATTERN] list configuration parameters\n"); + HELP0(" \\dC[+] [PATTERN] list casts\n"); + HELP0(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"); + HELP0(" \\dD[S+] [PATTERN] list domains\n"); + HELP0(" \\ddp [PATTERN] list default privileges\n"); + HELP0(" \\dE[S+] [PATTERN] list foreign tables\n"); + HELP0(" \\des[+] [PATTERN] list foreign servers\n"); + HELP0(" \\det[+] [PATTERN] list foreign tables\n"); + HELP0(" \\deu[+] [PATTERN] list user mappings\n"); + HELP0(" \\dew[+] [PATTERN] list foreign-data wrappers\n"); + HELP0(" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" + " list [only agg/normal/procedure/trigger/window] functions\n"); + HELP0(" \\dF[+] [PATTERN] list text search configurations\n"); + HELP0(" \\dFd[+] [PATTERN] list text search dictionaries\n"); + HELP0(" \\dFp[+] [PATTERN] list text search parsers\n"); + HELP0(" \\dFt[+] [PATTERN] list text search templates\n"); + HELP0(" \\dg[S+] [PATTERN] list roles\n"); + HELP0(" \\di[S+] [PATTERN] list indexes\n"); + HELP0(" \\dl[+] list large objects, same as \\lo_list\n"); + HELP0(" \\dL[S+] [PATTERN] list procedural languages\n"); + HELP0(" \\dm[S+] [PATTERN] list materialized views\n"); + HELP0(" \\dn[S+] [PATTERN] list schemas\n"); + HELP0(" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" + " list operators\n"); + HELP0(" \\dO[S+] [PATTERN] list collations\n"); + HELP0(" \\dp [PATTERN] list table, view, and sequence access privileges\n"); + HELP0(" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"); + HELP0(" \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"); + HELP0(" \\dRp[+] [PATTERN] list replication publications\n"); + HELP0(" \\dRs[+] [PATTERN] list replication subscriptions\n"); + HELP0(" \\ds[S+] [PATTERN] list sequences\n"); + HELP0(" \\dt[S+] [PATTERN] list tables\n"); + HELP0(" \\dT[S+] [PATTERN] list data types\n"); + HELP0(" \\du[S+] [PATTERN] list roles\n"); + HELP0(" \\dv[S+] [PATTERN] list views\n"); + HELP0(" \\dx[+] [PATTERN] list extensions\n"); + HELP0(" \\dX [PATTERN] list extended statistics\n"); + HELP0(" \\dy[+] [PATTERN] list event triggers\n"); + HELP0(" \\l[+] [PATTERN] list databases\n"); + HELP0(" \\sf[+] FUNCNAME show a function's definition\n"); + HELP0(" \\sv[+] VIEWNAME show a view's definition\n"); + HELP0(" \\z [PATTERN] same as \\dp\n"); + HELP0("\n"); + + HELP0("Large Objects\n"); + HELP0(" \\lo_export LOBOID FILE write large object to file\n"); + HELP0(" \\lo_import FILE [COMMENT]\n" + " read large object from file\n"); + HELP0(" \\lo_list[+] list large objects\n"); + HELP0(" \\lo_unlink LOBOID delete a large object\n"); + HELP0("\n"); + + HELP0("Formatting\n"); + HELP0(" \\a toggle between unaligned and aligned output mode\n"); + HELP0(" \\C [STRING] set table title, or unset if none\n"); + HELP0(" \\f [STRING] show or set field separator for unaligned query output\n"); + HELPN(" \\H toggle HTML output mode (currently %s)\n", + ON(pset.popt.topt.format == PRINT_HTML)); + HELP0(" \\pset [NAME [VALUE]] set table output option\n" + " (border|columns|csv_fieldsep|expanded|fieldsep|\n" + " fieldsep_zero|footer|format|linestyle|null|\n" + " numericlocale|pager|pager_min_lines|recordsep|\n" + " recordsep_zero|tableattr|title|tuples_only|\n" + " unicode_border_linestyle|unicode_column_linestyle|\n" + " unicode_header_linestyle)\n"); + HELPN(" \\t [on|off] show only rows (currently %s)\n", + ON(pset.popt.topt.tuples_only)); + HELP0(" \\T [STRING] set HTML
tag attributes, or unset if none\n"); + HELPN(" \\x [on|off|auto] toggle expanded output (currently %s)\n", + pset.popt.topt.expanded == 2 ? _("auto") : ON(pset.popt.topt.expanded)); + HELP0("\n"); + + HELP0("Connection\n"); if (currdb) - fprintf(output, _(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" - " connect to new database (currently \"%s\")\n"), - currdb); + HELPN(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" + " connect to new database (currently \"%s\")\n", + currdb); else - fprintf(output, _(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" - " connect to new database (currently no connection)\n")); - fprintf(output, _(" \\conninfo display information about current connection\n")); - fprintf(output, _(" \\encoding [ENCODING] show or set client encoding\n")); - fprintf(output, _(" \\password [USERNAME] securely change the password for a user\n")); - fprintf(output, "\n"); - - fprintf(output, _("Operating System\n")); - fprintf(output, _(" \\cd [DIR] change the current working directory\n")); - fprintf(output, _(" \\setenv NAME [VALUE] set or unset environment variable\n")); - fprintf(output, _(" \\timing [on|off] toggle timing of commands (currently %s)\n"), - ON(pset.timing)); - fprintf(output, _(" \\! [COMMAND] execute command in shell or start interactive shell\n")); - fprintf(output, "\n"); - - fprintf(output, _("Variables\n")); - fprintf(output, _(" \\prompt [TEXT] NAME prompt user to set internal variable\n")); - fprintf(output, _(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n")); - fprintf(output, _(" \\unset NAME unset (delete) internal variable\n")); - fprintf(output, "\n"); - - fprintf(output, _("Large Objects\n")); - fprintf(output, _(" \\lo_export LOBOID FILE\n" - " \\lo_import FILE [COMMENT]\n" - " \\lo_list\n" - " \\lo_unlink LOBOID large object operations\n")); + HELP0(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" + " connect to new database (currently no connection)\n"); + HELP0(" \\conninfo display information about current connection\n"); + HELP0(" \\encoding [ENCODING] show or set client encoding\n"); + HELP0(" \\password [USERNAME] securely change the password for a user\n"); + HELP0("\n"); + + HELP0("Operating System\n"); + HELP0(" \\cd [DIR] change the current working directory\n"); + HELP0(" \\getenv PSQLVAR ENVVAR fetch environment variable\n"); + HELP0(" \\setenv NAME [VALUE] set or unset environment variable\n"); + HELPN(" \\timing [on|off] toggle timing of commands (currently %s)\n", + ON(pset.timing)); + HELP0(" \\! [COMMAND] execute command in shell or start interactive shell\n"); + HELP0("\n"); + + HELP0("Variables\n"); + HELP0(" \\prompt [TEXT] NAME prompt user to set internal variable\n"); + HELP0(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"); + HELP0(" \\unset NAME unset (delete) internal variable\n"); + + /* Now we can count the lines. */ + nlcount = 0; + for (const char *ptr = buf.data; *ptr; ptr++) + { + if (*ptr == '\n') + nlcount++; + } + + /* And dump the output, with appropriate pagination. */ + output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL); + + fputs(buf.data, output); ClosePager(output); + + termPQExpBuffer(&buf); } @@ -339,180 +377,201 @@ slashUsage(unsigned short int pager) void helpVariables(unsigned short int pager) { + PQExpBufferData buf; + int nlcount; FILE *output; /* - * Keep this line count in sync with the number of lines printed below! - * Use "psql --help=variables | wc" to count correctly; but notice that - * Windows builds currently print one more line than non-Windows builds. - * Using the larger number is fine. + * To avoid counting the output lines manually, build the output in "buf" + * and then count them. */ - output = PageOutput(160, pager ? &(pset.popt.topt) : NULL); - - fprintf(output, _("List of specially treated variables\n\n")); - - fprintf(output, _("psql variables:\n")); - fprintf(output, _("Usage:\n")); - fprintf(output, _(" psql --set=NAME=VALUE\n or \\set NAME VALUE inside psql\n\n")); - - fprintf(output, _(" AUTOCOMMIT\n" - " if set, successful SQL commands are automatically committed\n")); - fprintf(output, _(" COMP_KEYWORD_CASE\n" - " determines the case used to complete SQL key words\n" - " [lower, upper, preserve-lower, preserve-upper]\n")); - fprintf(output, _(" DBNAME\n" - " the currently connected database name\n")); - fprintf(output, _(" ECHO\n" - " controls what input is written to standard output\n" - " [all, errors, none, queries]\n")); - fprintf(output, _(" ECHO_HIDDEN\n" - " if set, display internal queries executed by backslash commands;\n" - " if set to \"noexec\", just show them without execution\n")); - fprintf(output, _(" ENCODING\n" - " current client character set encoding\n")); - fprintf(output, _(" ERROR\n" - " true if last query failed, else false\n")); - fprintf(output, _(" FETCH_COUNT\n" - " the number of result rows to fetch and display at a time (0 = unlimited)\n")); - fprintf(output, _(" HIDE_TABLEAM\n" - " if set, table access methods are not displayed\n")); - fprintf(output, _(" HIDE_TOAST_COMPRESSION\n" - " if set, compression methods are not displayed\n")); - fprintf(output, _(" HISTCONTROL\n" - " controls command history [ignorespace, ignoredups, ignoreboth]\n")); - fprintf(output, _(" HISTFILE\n" - " file name used to store the command history\n")); - fprintf(output, _(" HISTSIZE\n" - " maximum number of commands to store in the command history\n")); - fprintf(output, _(" HOST\n" - " the currently connected database server host\n")); - fprintf(output, _(" IGNOREEOF\n" - " number of EOFs needed to terminate an interactive session\n")); - fprintf(output, _(" LASTOID\n" - " value of the last affected OID\n")); - fprintf(output, _(" LAST_ERROR_MESSAGE\n" - " LAST_ERROR_SQLSTATE\n" - " message and SQLSTATE of last error, or empty string and \"00000\" if none\n")); - fprintf(output, _(" ON_ERROR_ROLLBACK\n" - " if set, an error doesn't stop a transaction (uses implicit savepoints)\n")); - fprintf(output, _(" ON_ERROR_STOP\n" - " stop batch execution after error\n")); - fprintf(output, _(" PORT\n" - " server port of the current connection\n")); - fprintf(output, _(" PROMPT1\n" - " specifies the standard psql prompt\n")); - fprintf(output, _(" PROMPT2\n" - " specifies the prompt used when a statement continues from a previous line\n")); - fprintf(output, _(" PROMPT3\n" - " specifies the prompt used during COPY ... FROM STDIN\n")); - fprintf(output, _(" QUIET\n" - " run quietly (same as -q option)\n")); - fprintf(output, _(" ROW_COUNT\n" - " number of rows returned or affected by last query, or 0\n")); - fprintf(output, _(" SERVER_VERSION_NAME\n" - " SERVER_VERSION_NUM\n" - " server's version (in short string or numeric format)\n")); - fprintf(output, _(" SHOW_CONTEXT\n" - " controls display of message context fields [never, errors, always]\n")); - fprintf(output, _(" SINGLELINE\n" - " if set, end of line terminates SQL commands (same as -S option)\n")); - fprintf(output, _(" SINGLESTEP\n" - " single-step mode (same as -s option)\n")); - fprintf(output, _(" SQLSTATE\n" - " SQLSTATE of last query, or \"00000\" if no error\n")); - fprintf(output, _(" USER\n" - " the currently connected database user\n")); - fprintf(output, _(" VERBOSITY\n" - " controls verbosity of error reports [default, verbose, terse, sqlstate]\n")); - fprintf(output, _(" VERSION\n" - " VERSION_NAME\n" - " VERSION_NUM\n" - " psql's version (in verbose string, short string, or numeric format)\n")); - - fprintf(output, _("\nDisplay settings:\n")); - fprintf(output, _("Usage:\n")); - fprintf(output, _(" psql --pset=NAME[=VALUE]\n or \\pset NAME [VALUE] inside psql\n\n")); - - fprintf(output, _(" border\n" - " border style (number)\n")); - fprintf(output, _(" columns\n" - " target width for the wrapped format\n")); - fprintf(output, _(" expanded (or x)\n" - " expanded output [on, off, auto]\n")); - fprintf(output, _(" fieldsep\n" - " field separator for unaligned output (default \"%s\")\n"), - DEFAULT_FIELD_SEP); - fprintf(output, _(" fieldsep_zero\n" - " set field separator for unaligned output to a zero byte\n")); - fprintf(output, _(" footer\n" - " enable or disable display of the table footer [on, off]\n")); - fprintf(output, _(" format\n" - " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n")); - fprintf(output, _(" linestyle\n" - " set the border line drawing style [ascii, old-ascii, unicode]\n")); - fprintf(output, _(" null\n" - " set the string to be printed in place of a null value\n")); - fprintf(output, _(" numericlocale\n" - " enable display of a locale-specific character to separate groups of digits\n")); - fprintf(output, _(" pager\n" - " control when an external pager is used [yes, no, always]\n")); - fprintf(output, _(" recordsep\n" - " record (line) separator for unaligned output\n")); - fprintf(output, _(" recordsep_zero\n" - " set record separator for unaligned output to a zero byte\n")); - fprintf(output, _(" tableattr (or T)\n" - " specify attributes for table tag in html format, or proportional\n" - " column widths for left-aligned data types in latex-longtable format\n")); - fprintf(output, _(" title\n" - " set the table title for subsequently printed tables\n")); - fprintf(output, _(" tuples_only\n" - " if set, only actual table data is shown\n")); - fprintf(output, _(" unicode_border_linestyle\n" - " unicode_column_linestyle\n" - " unicode_header_linestyle\n" - " set the style of Unicode line drawing [single, double]\n")); - - fprintf(output, _("\nEnvironment variables:\n")); - fprintf(output, _("Usage:\n")); + initPQExpBuffer(&buf); + + HELP0("List of specially treated variables\n\n"); + + HELP0("psql variables:\n"); + HELP0("Usage:\n"); + HELP0(" psql --set=NAME=VALUE\n or \\set NAME VALUE inside psql\n\n"); + + HELP0(" AUTOCOMMIT\n" + " if set, successful SQL commands are automatically committed\n"); + HELP0(" COMP_KEYWORD_CASE\n" + " determines the case used to complete SQL key words\n" + " [lower, upper, preserve-lower, preserve-upper]\n"); + HELP0(" DBNAME\n" + " the currently connected database name\n"); + HELP0(" ECHO\n" + " controls what input is written to standard output\n" + " [all, errors, none, queries]\n"); + HELP0(" ECHO_HIDDEN\n" + " if set, display internal queries executed by backslash commands;\n" + " if set to \"noexec\", just show them without execution\n"); + HELP0(" ENCODING\n" + " current client character set encoding\n"); + HELP0(" ERROR\n" + " true if last query failed, else false\n"); + HELP0(" FETCH_COUNT\n" + " the number of result rows to fetch and display at a time (0 = unlimited)\n"); + HELP0(" HIDE_TABLEAM\n" + " if set, table access methods are not displayed\n"); + HELP0(" HIDE_TOAST_COMPRESSION\n" + " if set, compression methods are not displayed\n"); + HELP0(" HISTCONTROL\n" + " controls command history [ignorespace, ignoredups, ignoreboth]\n"); + HELP0(" HISTFILE\n" + " file name used to store the command history\n"); + HELP0(" HISTSIZE\n" + " maximum number of commands to store in the command history\n"); + HELP0(" HOST\n" + " the currently connected database server host\n"); + HELP0(" IGNOREEOF\n" + " number of EOFs needed to terminate an interactive session\n"); + HELP0(" LASTOID\n" + " value of the last affected OID\n"); + HELP0(" LAST_ERROR_MESSAGE\n" + " LAST_ERROR_SQLSTATE\n" + " message and SQLSTATE of last error, or empty string and \"00000\" if none\n"); + HELP0(" ON_ERROR_ROLLBACK\n" + " if set, an error doesn't stop a transaction (uses implicit savepoints)\n"); + HELP0(" ON_ERROR_STOP\n" + " stop batch execution after error\n"); + HELP0(" PORT\n" + " server port of the current connection\n"); + HELP0(" PROMPT1\n" + " specifies the standard psql prompt\n"); + HELP0(" PROMPT2\n" + " specifies the prompt used when a statement continues from a previous line\n"); + HELP0(" PROMPT3\n" + " specifies the prompt used during COPY ... FROM STDIN\n"); + HELP0(" QUIET\n" + " run quietly (same as -q option)\n"); + HELP0(" ROW_COUNT\n" + " number of rows returned or affected by last query, or 0\n"); + HELP0(" SERVER_VERSION_NAME\n" + " SERVER_VERSION_NUM\n" + " server's version (in short string or numeric format)\n"); + HELP0(" SHOW_ALL_RESULTS\n" + " show all results of a combined query (\\;) instead of only the last\n"); + HELP0(" SHOW_CONTEXT\n" + " controls display of message context fields [never, errors, always]\n"); + HELP0(" SINGLELINE\n" + " if set, end of line terminates SQL commands (same as -S option)\n"); + HELP0(" SINGLESTEP\n" + " single-step mode (same as -s option)\n"); + HELP0(" SQLSTATE\n" + " SQLSTATE of last query, or \"00000\" if no error\n"); + HELP0(" USER\n" + " the currently connected database user\n"); + HELP0(" VERBOSITY\n" + " controls verbosity of error reports [default, verbose, terse, sqlstate]\n"); + HELP0(" VERSION\n" + " VERSION_NAME\n" + " VERSION_NUM\n" + " psql's version (in verbose string, short string, or numeric format)\n"); + + HELP0("\nDisplay settings:\n"); + HELP0("Usage:\n"); + HELP0(" psql --pset=NAME[=VALUE]\n or \\pset NAME [VALUE] inside psql\n\n"); + + HELP0(" border\n" + " border style (number)\n"); + HELP0(" columns\n" + " target width for the wrapped format\n"); + HELP0(" expanded (or x)\n" + " expanded output [on, off, auto]\n"); + HELPN(" fieldsep\n" + " field separator for unaligned output (default \"%s\")\n", + DEFAULT_FIELD_SEP); + HELP0(" fieldsep_zero\n" + " set field separator for unaligned output to a zero byte\n"); + HELP0(" footer\n" + " enable or disable display of the table footer [on, off]\n"); + HELP0(" format\n" + " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"); + HELP0(" linestyle\n" + " set the border line drawing style [ascii, old-ascii, unicode]\n"); + HELP0(" null\n" + " set the string to be printed in place of a null value\n"); + HELP0(" numericlocale\n" + " enable display of a locale-specific character to separate groups of digits\n"); + HELP0(" pager\n" + " control when an external pager is used [yes, no, always]\n"); + HELP0(" recordsep\n" + " record (line) separator for unaligned output\n"); + HELP0(" recordsep_zero\n" + " set record separator for unaligned output to a zero byte\n"); + HELP0(" tableattr (or T)\n" + " specify attributes for table tag in html format, or proportional\n" + " column widths for left-aligned data types in latex-longtable format\n"); + HELP0(" title\n" + " set the table title for subsequently printed tables\n"); + HELP0(" tuples_only\n" + " if set, only actual table data is shown\n"); + HELP0(" unicode_border_linestyle\n" + " unicode_column_linestyle\n" + " unicode_header_linestyle\n" + " set the style of Unicode line drawing [single, double]\n"); + + HELP0("\nEnvironment variables:\n"); + HELP0("Usage:\n"); #ifndef WIN32 - fprintf(output, _(" NAME=VALUE [NAME=VALUE] psql ...\n or \\setenv NAME [VALUE] inside psql\n\n")); + HELP0(" NAME=VALUE [NAME=VALUE] psql ...\n or \\setenv NAME [VALUE] inside psql\n\n"); #else - fprintf(output, _(" set NAME=VALUE\n psql ...\n or \\setenv NAME [VALUE] inside psql\n\n")); + HELP0(" set NAME=VALUE\n psql ...\n or \\setenv NAME [VALUE] inside psql\n\n"); +#endif + + HELP0(" COLUMNS\n" + " number of columns for wrapped format\n"); + HELP0(" PGAPPNAME\n" + " same as the application_name connection parameter\n"); + HELP0(" PGDATABASE\n" + " same as the dbname connection parameter\n"); + HELP0(" PGHOST\n" + " same as the host connection parameter\n"); + HELP0(" PGPASSFILE\n" + " password file name\n"); + HELP0(" PGPASSWORD\n" + " connection password (not recommended)\n"); + HELP0(" PGPORT\n" + " same as the port connection parameter\n"); + HELP0(" PGUSER\n" + " same as the user connection parameter\n"); + HELP0(" PSQL_EDITOR, EDITOR, VISUAL\n" + " editor used by the \\e, \\ef, and \\ev commands\n"); + HELP0(" PSQL_EDITOR_LINENUMBER_ARG\n" + " how to specify a line number when invoking the editor\n"); + HELP0(" PSQL_HISTORY\n" + " alternative location for the command history file\n"); + HELP0(" PSQL_PAGER, PAGER\n" + " name of external pager program\n"); +#ifndef WIN32 + HELP0(" PSQL_WATCH_PAGER\n" + " name of external pager program used for \\watch\n"); #endif + HELP0(" PSQLRC\n" + " alternative location for the user's .psqlrc file\n"); + HELP0(" SHELL\n" + " shell used by the \\! command\n"); + HELP0(" TMPDIR\n" + " directory for temporary files\n"); + + /* Now we can count the lines. */ + nlcount = 0; + for (const char *ptr = buf.data; *ptr; ptr++) + { + if (*ptr == '\n') + nlcount++; + } - fprintf(output, _(" COLUMNS\n" - " number of columns for wrapped format\n")); - fprintf(output, _(" PGAPPNAME\n" - " same as the application_name connection parameter\n")); - fprintf(output, _(" PGDATABASE\n" - " same as the dbname connection parameter\n")); - fprintf(output, _(" PGHOST\n" - " same as the host connection parameter\n")); - fprintf(output, _(" PGPASSFILE\n" - " password file name\n")); - fprintf(output, _(" PGPASSWORD\n" - " connection password (not recommended)\n")); - fprintf(output, _(" PGPORT\n" - " same as the port connection parameter\n")); - fprintf(output, _(" PGUSER\n" - " same as the user connection parameter\n")); - fprintf(output, _(" PSQL_EDITOR, EDITOR, VISUAL\n" - " editor used by the \\e, \\ef, and \\ev commands\n")); - fprintf(output, _(" PSQL_EDITOR_LINENUMBER_ARG\n" - " how to specify a line number when invoking the editor\n")); - fprintf(output, _(" PSQL_HISTORY\n" - " alternative location for the command history file\n")); - fprintf(output, _(" PSQL_PAGER, PAGER\n" - " name of external pager program\n")); - fprintf(output, _(" PSQLRC\n" - " alternative location for the user's .psqlrc file\n")); - fprintf(output, _(" SHELL\n" - " shell used by the \\! command\n")); - fprintf(output, _(" TMPDIR\n" - " directory for temporary files\n")); + /* And dump the output, with appropriate pagination. */ + output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL); + + fputs(buf.data, output); ClosePager(output); + + termPQExpBuffer(&buf); } @@ -688,7 +747,7 @@ print_copyright(void) { puts("PostgreSQL Database Management System\n" "(formerly known as Postgres, then as Postgres95)\n\n" - "Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group\n\n" + "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group\n\n" "Portions Copyright (c) 1994, The Regents of the University of California\n\n" "Permission to use, copy, modify, and distribute this software and its\n" "documentation for any purpose, without fee, and without a written agreement\n" diff --git a/third_party/spanner_pg/src/bin/psql/help.h b/third_party/spanner_pg/src/bin/psql/help.h index d4f91e0b..798807b3 100644 --- a/third_party/spanner_pg/src/bin/psql/help.h +++ b/third_party/spanner_pg/src/bin/psql/help.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/help.h */ diff --git a/third_party/spanner_pg/src/bin/psql/input.c b/third_party/spanner_pg/src/bin/psql/input.c index f926bc98..416185d6 100644 --- a/third_party/spanner_pg/src/bin/psql/input.c +++ b/third_party/spanner_pg/src/bin/psql/input.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/input.c */ @@ -353,8 +353,15 @@ initializeInput(int flags) useReadline = true; - /* these two things must be done in this order: */ + /* set appropriate values for Readline's global variables */ initialize_readline(); + +#ifdef HAVE_RL_VARIABLE_BIND + /* set comment-begin to a useful value for SQL */ + (void) rl_variable_bind("comment-begin", "-- "); +#endif + + /* this reads ~/.inputrc, so do it after rl_variable_bind */ rl_initialize(); useHistory = true; diff --git a/third_party/spanner_pg/src/bin/psql/input.h b/third_party/spanner_pg/src/bin/psql/input.h index 1a5a1be9..41766dba 100644 --- a/third_party/spanner_pg/src/bin/psql/input.h +++ b/third_party/spanner_pg/src/bin/psql/input.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/input.h */ diff --git a/third_party/spanner_pg/src/bin/psql/large_obj.c b/third_party/spanner_pg/src/bin/psql/large_obj.c index c15fcc08..64338d53 100644 --- a/third_party/spanner_pg/src/bin/psql/large_obj.c +++ b/third_party/spanner_pg/src/bin/psql/large_obj.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/large_obj.c */ @@ -262,55 +262,3 @@ do_lo_unlink(const char *loid_arg) return true; } - - - -/* - * do_lo_list() - * - * Show all large objects in database with comments - */ -bool -do_lo_list(void) -{ - PGresult *res; - char buf[1024]; - printQueryOpt myopt = pset.popt; - - if (pset.sversion >= 90000) - { - snprintf(buf, sizeof(buf), - "SELECT oid as \"%s\",\n" - " pg_catalog.pg_get_userbyid(lomowner) as \"%s\",\n" - " pg_catalog.obj_description(oid, 'pg_largeobject') as \"%s\"\n" - " FROM pg_catalog.pg_largeobject_metadata " - " ORDER BY oid", - gettext_noop("ID"), - gettext_noop("Owner"), - gettext_noop("Description")); - } - else - { - snprintf(buf, sizeof(buf), - "SELECT loid as \"%s\",\n" - " pg_catalog.obj_description(loid, 'pg_largeobject') as \"%s\"\n" - "FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) x\n" - "ORDER BY 1", - gettext_noop("ID"), - gettext_noop("Description")); - } - - res = PSQLexec(buf); - if (!res) - return false; - - myopt.topt.tuples_only = false; - myopt.nullPrint = NULL; - myopt.title = _("Large objects"); - myopt.translate_header = true; - - printQuery(res, &myopt, pset.queryFout, false, pset.logfile); - - PQclear(res); - return true; -} diff --git a/third_party/spanner_pg/src/bin/psql/large_obj.h b/third_party/spanner_pg/src/bin/psql/large_obj.h index 003acbf5..1242ea5a 100644 --- a/third_party/spanner_pg/src/bin/psql/large_obj.h +++ b/third_party/spanner_pg/src/bin/psql/large_obj.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/large_obj.h */ @@ -11,6 +11,5 @@ bool do_lo_export(const char *loid_arg, const char *filename_arg); bool do_lo_import(const char *filename_arg, const char *comment_arg); bool do_lo_unlink(const char *loid_arg); -bool do_lo_list(void); #endif /* LARGE_OBJ_H */ diff --git a/third_party/spanner_pg/src/bin/psql/mainloop.c b/third_party/spanner_pg/src/bin/psql/mainloop.c index e49ed022..b0c4177a 100644 --- a/third_party/spanner_pg/src/bin/psql/mainloop.c +++ b/third_party/spanner_pg/src/bin/psql/mainloop.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * 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 @@ -564,9 +558,20 @@ MainLoop(FILE *source) break; } - /* Add line to pending history if we didn't execute anything yet */ - if (pset.cur_cmd_interactive && !line_saved_in_history) - pg_append_history(line, history_buf); + /* + * Add line to pending history if we didn't do so already. Then, if + * the query buffer is still empty, flush out any unsent history + * entry. This means that empty lines (containing only whitespace and + * perhaps a dash-dash comment) that precede a query will be recorded + * as separate history entries, not as part of that query. + */ + if (pset.cur_cmd_interactive) + { + if (!line_saved_in_history) + pg_append_history(line, history_buf); + if (query_buf->len == 0) + pg_send_history(history_buf); + } psql_scan_finish(scan_state); free(line); diff --git a/third_party/spanner_pg/src/bin/psql/mainloop.h b/third_party/spanner_pg/src/bin/psql/mainloop.h index dd7a1889..80e0c99d 100644 --- a/third_party/spanner_pg/src/bin/psql/mainloop.h +++ b/third_party/spanner_pg/src/bin/psql/mainloop.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/mainloop.h */ diff --git a/third_party/spanner_pg/src/bin/psql/nls.mk b/third_party/spanner_pg/src/bin/psql/nls.mk index 4b8a2d1f..6e294b1a 100644 --- a/third_party/spanner_pg/src/bin/psql/nls.mk +++ b/third_party/spanner_pg/src/bin/psql/nls.mk @@ -1,6 +1,6 @@ # src/bin/psql/nls.mk CATALOG_NAME = psql -AVAIL_LANGUAGES = cs de el es fr it ja ko ru sv tr uk zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka ko ru sv uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ command.c common.c copy.c crosstabview.c help.c input.c large_obj.c \ mainloop.c psqlscanslash.c startup.c \ @@ -8,7 +8,8 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ tab-complete.c variables.c \ ../../fe_utils/cancel.c ../../fe_utils/print.c ../../fe_utils/psqlscan.c \ ../../common/exec.c ../../common/fe_memutils.c ../../common/username.c \ - ../../common/wait_error.c + ../../common/wait_error.c ../../port/thread.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ - N_ simple_prompt -GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) + HELP0 HELPN N_ simple_prompt simple_prompt_extended +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ + HELPN:1:c-format diff --git a/third_party/spanner_pg/src/bin/psql/po/de.po b/third_party/spanner_pg/src/bin/psql/po/de.po index 6c0bc746..912297db 100644 --- a/third_party/spanner_pg/src/bin/psql/po/de.po +++ b/third_party/spanner_pg/src/bin/psql/po/de.po @@ -1,14 +1,14 @@ # German message translation file for psql -# Peter Eisentraut , 2001 - 2022. +# Peter Eisentraut , 2001 - 2023. # # 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: 2023-02-03 23:01+0000\n" -"PO-Revision-Date: 2022-02-01 13:33+0100\n" +"POT-Creation-Date: 2023-02-03 13:16+0000\n" +"PO-Revision-Date: 2023-02-03 16:09+0100\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:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../common/exec.c:141 ../../common/exec.c:258 ../../common/exec.c:304 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:301 +#, 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:160 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ungültige Programmdatei »%s«" -#: ../../common/exec.c:210 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "konnte Programmdatei »%s« nicht lesen" -#: ../../common/exec.c:218 +#: ../../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:274 ../../common/exec.c:313 +#: ../../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:291 +#: ../../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:414 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:527 ../../common/exec.c:572 ../../common/exec.c:664 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 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:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -137,303 +142,294 @@ msgstr "Abbruchsanforderung gesendet\n" 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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../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:229 +#: ../../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:232 #, c-format msgid "invalid command \\%s" msgstr "ungültige Anweisung \\%s" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Versuchen Sie \\? für Hilfe." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: überflüssiges Argument »%s« ignoriert" -#: command.c:301 +#: command.c:304 #, 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:562 +#: command.c:573 #, 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:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: konnte nicht in das Verzeichnis »%s« wechseln: %m" -#: command.c:605 +#: command.c:617 #, 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:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "kein Anfragepuffer" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "ungültige Zeilennummer: %s" -#: command.c:1111 -#, 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:1114 -#, 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:1198 +#: command.c:1203 msgid "No changes" msgstr "keine Änderungen" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Es gibt keinen vorangegangenen Fehler." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: rechte Klammer fehlt" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: notwendiges Argument fehlt" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kann nicht nach \\else kommen" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: kein passendes \\if" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kann nicht nach \\else kommen" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: kein passendes \\if" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: kein passendes \\if" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Anfragepuffer ist leer." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Neues Passwort für Benutzer »%s« eingeben: " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Passwörter stimmten nicht überein." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: konnte Wert für Variable nicht lesen" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Anfragepuffer wurde gelöscht." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Befehlsgeschichte in Datei »%s« geschrieben.\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: Name der Umgebungsvariable darf kein »=« enthalten" -#: command.c:2408 -#, 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:2411 -#, 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:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "Funktionsname wird benötigt" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "Sichtname wird benötigt" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Zeitmessung ist an." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Zeitmessung ist aus." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Passwort: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Passwort für Benutzer %s: " -#: command.c:3106 +#: command.c:3168 #, 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:3141 +#: command.c:3203 #, 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:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Vorherige Verbindung wurde behalten" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, 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:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, Server %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -442,29 +438,29 @@ msgstr "" "WARNUNG: %s-Hauptversion %s, Server-Hauptversion %s.\n" " Einige Features von psql werden eventuell nicht funktionieren.\n" -#: command.c:3608 +#: command.c:3680 #, 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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "unbekannt" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "aus" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "an" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-verschlüsselte Verbindung\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -476,259 +472,269 @@ msgstr "" " richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter\n" " »Notes for Windows users«.\n" -#: command.c:3751 +#: command.c:3822 #, 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:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "konnte Editor »%s« nicht starten" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "konnte /bin/sh nicht starten" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "konnte temporäres Verzeichnis nicht finden: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: command.c:4195 +#: command.c:4266 #, 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:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: zulässige Linienstile sind ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: zulässige Unicode-Rahmnenlinienstile sind single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: zulässige Unicode-Spaltenlinienstile sind single, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: zulässige Unicode-Kopflinienstile sind single, double" -#: command.c:4322 +#: command.c:4393 #, 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:4327 +#: command.c:4398 #, 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:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: unbekannte Option: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Rahmenstil ist %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "Zielbreite ist nicht gesetzt.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "Zielbreite ist %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Erweiterte Anzeige ist an.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Erweiterte Anzeige wird automatisch verwendet.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Erweiterte Anzeige ist aus.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Feldtrennzeichen für CSV ist »%s«.\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Feldtrennzeichen ist ein Null-Byte.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Feldtrennzeichen ist »%s«.\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Standardfußzeile ist an.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Standardfußzeile ist aus.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Ausgabeformat ist »%s«.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Linienstil ist %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-Anzeige ist »%s«.\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokalisiertes Format für numerische Daten ist an.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokalisiertes Format für numerische Daten ist aus.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Pager wird für lange Ausgaben verwendet.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Pager wird immer verwendet.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "Pager-Verwendung ist aus.\n" -#: command.c:4580 +#: command.c:4651 #, 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:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Satztrennzeichen ist ein Null-Byte.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Satztrennzeichen ist .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Satztrennzeichen ist »%s«.\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellenattribute sind »%s«.\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellenattribute sind nicht gesetzt.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Titel ist »%s«.\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Titel ist nicht gesetzt.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Nur Datenzeilen ist an.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Nur Datenzeilen ist aus.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-Rahmenlinienstil ist »%s«.\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-Spaltenlinienstil ist »%s«.\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-Kopflinienstil ist »%s«.\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: fehlgeschlagen" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kann nicht mit einer leeren Anfrage verwendet werden" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "konnte Timer nicht setzen: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (alle %gs)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (alle %gs)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "konnte nicht auf Signale warten: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -741,117 +747,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "»%s.%s« ist keine Sicht" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "konnte reloptions-Array nicht interpretieren" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "Escape kann nicht ohne aktive Verbindung ausgeführt werden" -#: common.c:200 +#: common.c:207 #, 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:311 #, c-format msgid "connection to server was lost" msgstr "Verbindung zum Server wurde verloren" -#: common.c:308 +#: common.c:315 #, 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:320 #, c-format msgid "Failed.\n" msgstr "Fehlgeschlagen.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Erfolgreich.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "unerwarteter PQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Zeit: %.3f ms\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, 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:542 #, 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 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, 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:654 #, 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:657 #, 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:688 #, c-format msgid "could not print result table: %m" msgstr "konnte Ergebnistabelle nicht ausgeben: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "keine Zeilen für \\gset zurückgegeben" -#: common.c:773 +#: common.c:713 #, 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:731 #, 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:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -862,33 +858,28 @@ 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:1126 #, c-format msgid "STATEMENT: %s" msgstr "ANWEISUNG: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "unerwarteter Transaktionsstatus (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Spalte" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Typ" -#: common.c:1564 +#: common.c:1353 #, 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" @@ -955,11 +946,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" @@ -1008,1147 +999,1153 @@ msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Schema" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Name" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Ergebnisdatentyp" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Argumentdatentypen" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Beschreibung" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Liste der Aggregatfunktionen" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Index" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Tabelle" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Handler" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Liste der Zugriffsmethoden" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Der Server (Version %s) unterstützt keine Tablespaces." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Eigentümer" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Pfad" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Optionen" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Größe" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Liste der Tablespaces" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df akzeptiert nur [anptwS+] als Optionen" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "Agg" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "Fenster" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "Proz" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "Funk" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "Trigger" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "unveränderlich" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "stabil" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "volatil" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Volatilität" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "beschränkt" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "sicher" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "unsicher" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Parallel" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "definer" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "invoker" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Sicherheit" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Sprache" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Quelltext" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Liste der Funktionen" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Interner Name" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Elemente" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Liste der Datentypen" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Linker Typ" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Rechter Typ" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Ergebnistyp" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Funktion" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Liste der Operatoren" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Kodierung" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Sortierfolge" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Zeichentyp" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU-Locale" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Locale-Provider" + +#: describe.c:964 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Liste der Datenbanken" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "Tabelle" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "Sicht" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "materialisierte Sicht" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "Sequenz" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "Fremdtabelle" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "partitionierte Tabelle" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Spaltenprivilegien" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Policys" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Zugriffsprivilegien" -#: describe.c:1293 -#, 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:1313 +#: describe.c:1188 msgid "function" msgstr "Funktion" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "Typ" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "Schema" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Vorgegebene Zugriffsprivilegien" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Objekt" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "Tabellen-Constraint" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "Domänen-Constraint" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "Operatorklasse" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "Operatorfamilie" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "Rule" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Objektbeschreibungen" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Keine Relation namens »%s« gefunden" -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Keine Relationen gefunden" -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "Keine Relation mit OID %s gefunden" -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Start" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Minimum" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Maximum" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Inkrement" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "ja" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "nein" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Zyklisch?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Cache" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Eigentümer: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenz für Identitätsspalte: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Ungeloggte Sequenz »%s.%s«" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenz »%s.%s«" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ungeloggte Tabelle »%s.%s«" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabelle »%s.%s«" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Sicht »%s.%s«" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ungeloggte materialisierte Sicht »%s.%s«" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialisierte Sicht »%s.%s«" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ungeloggter Index »%s.%s«" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Index »%s.%s«" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ungeloggter partitionierter Index »%s.%s«" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionierter Index »%s.%s«" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Spezielle Relation »%s.%s«" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-Tabelle »%s.%s«" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Zusammengesetzter Typ »%s.%s«" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Fremdtabelle »%s.%s«" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionierte Tabelle »%s.%s«" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Sortierfolge" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "NULL erlaubt?" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Vorgabewert" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Schlüssel?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Definition" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "FDW-Optionen" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Speicherung" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Kompression" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Statistikziel" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition von: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Kein Partitions-Constraint" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Partitions-Constraint: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Partitionsschlüssel: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Gehört zu Tabelle: »%s.%s«" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "Primärschlüssel, " -#: describe.c:2514 -msgid "unique, " -msgstr "eindeutig, " +#: describe.c:2312 +msgid "unique" +msgstr "unique" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls not distinct" -#: describe.c:2520 +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "für Tabelle »%s.%s«" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", Prädikat (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", geclustert" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", ungültig" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", DEFERRABLE" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", INITIALLY DEFERRED" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", Replika-Identität" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Indexe:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Check-Constraints:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Fremdschlüssel-Constraints:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Fremdschlüsselverweise von:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Policys:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Statistikobjekte:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Regeln:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Abgeschaltete Regeln:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Regeln, die immer aktiv werden:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Regeln, die nur im Replikat aktiv werden:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Publikationen:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Sichtdefinition:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Trigger:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Abgeschaltete Benutzer-Trigger:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Abgeschaltete Trigger:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Abgeschaltete interne Trigger:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Trigger, die immer aktiv werden:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Trigger, die nur im Replikat aktiv werden:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "FDW-Optionen: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Erbt von" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Anzahl Partitionen: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Kindtabellen" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Partitionen" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Getypte Tabelle vom Typ: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Replika-Identität" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Hat OIDs: ja" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Zugriffsmethode: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", Tablespace »%s«" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Liste der Rollen" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Rollenname" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Attribute" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Mitglied von" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Superuser" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "keine Vererbung" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Rolle erzeugen" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "DB erzeugen" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "kann nicht einloggen" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Replikation" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Bypass RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "keine Verbindungen" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d Verbindung" msgstr[1] "%d Verbindungen" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Passwort gültig bis " -#: describe.c:3991 -#, 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:4004 +#: describe.c:3777 msgid "Role" msgstr "Rolle" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "Datenbank" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Einstellung" -#: describe.c:4030 +#: describe.c:3803 #, 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:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« gefunden" -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Keine Einstellungen gefunden" -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Liste der Einstellungen" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "Index" -#: describe.c:4115 -msgid "special" -msgstr "speziell" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "TOAST-Tabelle" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "partitionierter Index" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "permanent" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "temporär" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "ungeloggt" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Persistenz" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Zugriffsmethode" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Liste der Relationen" -#: describe.c:4305 +#: describe.c:4063 #, 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:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Liste partitionierter Indexe" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Liste partitionierte Tabellen" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Liste partitionierter Relationen" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Elternname" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Größe Leaf-Partition" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Gesamtgröße" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Vertraut" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Interne Sprache" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Call-Handler" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Validator" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Inline-Handler" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Liste der Sprachen" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Check" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Liste der Domänen" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Quelle" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Ziel" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Standard?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Liste der Konversionen" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Parameter" + +#: describe.c:4498 +msgid "Value" +msgstr "Wert" + +#: describe.c:4505 +msgid "Context" +msgstr "Kontext" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Liste der Konfigurationsparameter" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Liste der veränderten Konfigurationsparameter" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger." + +#: describe.c:4587 msgid "Event" msgstr "Ereignis" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "eingeschaltet" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "Replika" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "immer" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "ausgeschaltet" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Eingeschaltet" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Tags" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Liste der Ereignistrigger" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Abhängigkeiten" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Liste der erweiterten Statistiken" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Quelltyp" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Zieltyp" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "in Zuweisung" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Implizit?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Liste der Typumwandlungen" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Der Server (Version %s) unterstützt keine Sortierfolgen." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Provider" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Deterministisch?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Liste der Sortierfolgen" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Liste der Schemas" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Der Server (Version %s) unterstützt keine Volltextsuche." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Liste der Textsucheparser" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kein Textsucheparser namens »%s« gefunden" -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Keine Textsucheparser gefunden" -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Parsen starten" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Methode" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Nächstes Token lesen" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Parsen beenden" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Überschrift ermitteln" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Tokentypen ermitteln" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsucheparser »%s.%s«" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsucheparser »%s«" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Tokenname" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tokentypen für Parser »%s.%s«" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tokentypen für Parser »%s«" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Vorlage" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Initialisierungsoptionen" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Liste der Textsuchewörterbücher" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Init" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Lexize" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Liste der Textsuchevorlagen" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Liste der Textsuchekonfigurationen" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Keine Textsuchekonfiguration namens »%s« gefunden" -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Keine Textsuchekonfigurationen gefunden" -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Token" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Wörterbücher" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsuchekonfiguration »%s.%s«" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsuchekonfiguration »%s«" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2157,7 +2154,7 @@ msgstr "" "\n" "Parser: »%s.%s«" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2166,255 +2163,253 @@ msgstr "" "\n" "Parser: »%s«" -#: describe.c:5787 -#, 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:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Liste der Fremddaten-Wrapper" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Der Server (Version %s) unterstützt keine Fremdserver." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Fremddaten-Wrapper" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Version" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Liste der Fremdserver" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Der Server (Version %s) unterstützt keine Benutzerabbildungen." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Server" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Benutzername" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Liste der Benutzerabbildungen" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Der Server (Version %s) unterstützt keine Fremdtabellen." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Liste der Fremdtabellen" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Der Server (Version %s) unterstützt keine Erweiterungen." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Liste der installierten Erweiterungen" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Keine Erweiterung namens »%s« gefunden" -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Keine Erweiterungen gefunden" -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Objektbeschreibung" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekte in Erweiterung »%s«" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Der Server (Version %s) unterstützt keine Publikationen." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Alle Tabellen" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Inserts" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Updates" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Deletes" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Truncates" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Über Wurzel" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Liste der Publikationen" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Keine Publikation namens »%s« gefunden" -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Keine Publikationen gefunden" -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Publikation %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Tabellen:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Tabellen aus Schemas:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Publikation" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Binär" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Streaming" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Two-Phase-Commit" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Bei Fehler abschalten" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Synchroner Commit" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Verbindungsinfo" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Skip-LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Liste der Subskriptionen" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "AM" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Eingabetyp" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Storage-Typ" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Operatorklasse" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Operatorfamilie" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Liste der Operatorklassen" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Passende Typen" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Liste der Operatorfamilien" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Operator" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Strategie" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "Sortieren" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "Suchen" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Zweck" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Sortier-Opfamilie" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Liste der Operatoren in Operatorfamilien" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Registrierter linker Typ" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Registrierter rechter Typ" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Nummer" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Large Objects" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2422,13 +2417,11 @@ msgstr "" "psql ist das interaktive PostgreSQL-Terminal.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Aufruf:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2436,35 +2429,30 @@ msgstr "" " psql [OPTION]... [DBNAME [BENUTZERNAME]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Allgemeine Optionen:\n" -#: help.c:82 -#, c-format +#: help.c:84 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:85 #, 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 -#, c-format +#: help.c:87 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 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list verfügbare Datenbanken auflisten und beenden\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2474,18 +2462,15 @@ msgstr "" " psql-Variable NAME auf WERT setzen\n" " (z.B. -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc Startdatei (~/.psqlrc) nicht lesen\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2494,23 +2479,19 @@ msgstr "" " als eine einzige Transaktion ausführen (wenn nicht\n" " interaktiv)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] diese Hilfe anzeigen, dann beenden\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands Backslash-Befehle auflisten, dann beenden\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables besondere Variablen auflisten, dann beenden\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2518,62 +2499,51 @@ msgstr "" "\n" "Eingabe- und Ausgabeoptionen:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all Skript-Inhalt wiedergeben\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors fehlgeschlagene Anweisungen wiedergeben\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries an den Server geschickte Anweisungen zeigen\n" -#: help.c:101 -#, c-format +#: help.c:104 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 -#, c-format +#: help.c:105 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 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline erweiterte Zeilenbearbeitung (Readline) ausschalten\n" -#: help.c:104 -#, c-format +#: help.c:107 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 -#, c-format +#: help.c:108 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 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step Einzelschrittmodus (jede Anfrage bestätigen)\n" -#: help.c:107 -#, c-format +#: help.c:110 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 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2581,17 +2551,15 @@ msgstr "" "\n" "Ausgabeformatoptionen:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align unausgerichteter Tabellenausgabemodus\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv Tabellenausgabemodus CSV (Comma-Separated Values)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2601,20 +2569,17 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: »%s«)\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-Tabellenausgabemodus\n" -#: help.c:116 -#, c-format +#: help.c:119 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 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2623,23 +2588,19 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: Newline)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only nur Datenzeilen ausgeben\n" -#: help.c:120 -#, c-format +#: help.c:123 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 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded erweiterte Tabellenausgabe einschalten\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2648,8 +2609,7 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2658,8 +2618,7 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2667,39 +2626,36 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: help.c:130 +#: help.c:133 #, 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:134 msgid "local socket" msgstr "lokales Socket" -#: help.c:134 +#: help.c:137 #, 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:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=NAME Datenbank-Benutzername (Standard: »%s«)\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2713,324 +2669,274 @@ msgstr "" "Abschnitt der PostgreSQL-Dokumentation.\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Allgemein\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL-Urheberrechtsinformationen zeigen\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +#: help.c:193 +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 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose letzte Fehlermeldung mit vollen Details anzeigen\n" -#: help.c:175 -#, c-format +#: help.c:195 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 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc Ergebnis der Anfrage beschreiben ohne sie auszuführen\n" -#: help.c:178 -#, c-format +#: help.c:198 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 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +#: help.c:199 +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 -#, c-format +#: help.c:200 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 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q psql beenden\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEK] Anfrage alle SEK Sekunden ausführen\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Hilfe\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] Hilfe über Backslash-Befehle anzeigen\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options Hilfe über psql-Kommandozeilenoptionen anzeigen\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables Hilfe über besondere Variablen anzeigen\n" -#: help.c:190 -#, c-format +#: help.c:210 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 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Anfragepuffer\n" -#: help.c:194 -#, c-format +#: help.c:214 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 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAME [ZEILE]] Funktionsdefinition mit externem Editor bearbeiten\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [SICHTNAME [ZEILE]] Sichtdefinition mit externem Editor bearbeiten\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p aktuellen Inhalt der Anfragepuffers zeigen\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r Anfragepuffer löschen\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [DATEI] Befehlsgeschichte ausgeben oder in Datei schreiben\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w DATEI Anfragepuffer in Datei schreiben\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Eingabe/Ausgabe\n" -#: help.c:206 -#, c-format +#: help.c:226 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 -#, c-format +#: help.c:227 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 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i DATEI Befehle aus Datei ausführen\n" -#: help.c:209 -#, c-format +#: help.c:229 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 -#, c-format +#: help.c:230 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 -#, c-format +#: help.c:231 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 -#, c-format +#: help.c:232 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 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "Bedingte Anweisungen\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if AUSDRUCK Beginn einer bedingten Anweisung\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif AUSDRUCK Alternative in aktueller bedingter Anweisung\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else letzte Alternative in aktueller bedingter Anweisung\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif Ende einer bedingten Anweisung\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Informationen\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (Optionen: S = Systemobjekte zeigen, + = zusätzliche Details zeigen)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] Tabellen, Sichten und Sequenzen auflisten\n" -#: help.c:225 -#, c-format +#: help.c:245 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 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MUSTER] Aggregatfunktionen auflisten\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MUSTER] Zugriffsmethoden auflisten\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMMUST [TYPMUST]] Operatorklassen auflisten\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMMUST [TYPMUST]] Operatorfamilien auflisten\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMMUST [OPFMUST]] Operatoren in Operatorfamilien auflisten\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MUSTER] Tablespaces auflisten\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [MUSTER] Konfigurationsparameter auflisten\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MUSTER] Typumwandlungen (Casts) auflisten\n" -#: help.c:235 -#, c-format +#: help.c:256 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 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MUSTER] Domänen auflisten\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MUSTER] Vorgabeprivilegien auflisten\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MUSTER] Fremdtabellen auflisten\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MUSTER] Fremdserver auflisten\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MUSTER] Benutzerabbildungen auflisten\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MUSTER] Fremddaten-Wrapper auflisten\n" -#: help.c:243 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -3038,58 +2944,47 @@ msgstr "" " \\df[anptw][S+] [FUNKMUSTR [TYPMUSTR ...]]\n" " Funktionen [nur Agg/normale/Proz/Trigger/Fenster] auflisten\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MUSTER] Textsuchekonfigurationen auflisten\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MUSTER] Textsuchewörterbücher auflisten\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MUSTER] Textsucheparser auflisten\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MUSTER] Textsuchevorlagen auflisten\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MUSTER] Rollen auflisten\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MUSTER] Indexe auflisten\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl Large Objects auflisten, wie \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] Large Objects auflisten, wie \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MUSTER] prozedurale Sprachen auflisten\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MUSTER] materialisierte Sichten auflisten\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MUSTER] Schemas auflisten\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3097,129 +2992,132 @@ msgstr "" " \\do[S+] [OPMUST [TYPMUST [TYPMUST]]]\n" " Operatoren auflisten\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MUSTER] Sortierfolgen auflisten\n" -#: help.c:258 -#, c-format +#: help.c:279 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 -#, c-format +#: help.c:280 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 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLLMUST [DBMUST]] datenbankspezifische Rolleneinstellungen auflisten\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MUSTER] Replikationspublikationen auflisten\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MUSTER] Replikationssubskriptionen auflisten\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MUSTER] Sequenzen auflisten\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MUSTER] Tabellen auflisten\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MUSTER] Datentypen auflisten\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MUSTER] Rollen auflisten\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MUSTER] Sichten auflisten\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MUSTER] Erweiterungen auflisten\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MUSTER] erweiterte Statistiken auflisten\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MUSTER] Ereignistrigger auflisten\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MUSTER] Datenbanken auflisten\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAME Funktionsdefinition zeigen\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] SICHTNAME Sichtdefinition zeigen\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MUSTER] äquivalent zu \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Large Objects\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr "" +" \\lo_export LOBOID DATEI\n" +" Large Object in Datei schreiben\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import DATEI [KOMMENTAR]\n" +" Large Object aus Datei lesen\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] Large Objects auflisten\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID Large Object löschen\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Formatierung\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a zwischen unausgerichtetem und ausgerichtetem Ausgabemodus\n" " umschalten\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] Tabellentitel setzen oder löschen\n" -#: help.c:280 -#, c-format +#: help.c:309 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:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML-Ausgabemodus umschalten (gegenwärtig %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3237,27 +3135,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, 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 -#, c-format +#: help.c:321 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:322 #, 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 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Verbindung\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3266,8 +3166,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell »%s«)\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3275,88 +3174,62 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell keine Verbindung)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo Informationen über aktuelle Verbindung anzeigen\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODIERUNG] Client-Kodierung zeigen oder setzen\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [BENUTZERNAME]\n" " sicheres Ändern eines Benutzerpasswortes\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Betriebssystem\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [VERZ] Arbeitsverzeichnis wechseln\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR Umgebungsvariable auslesen\n" + +#: help.c:342 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:343 #, 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 -#, c-format +#: help.c:345 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 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Variablen\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME interne Variable vom Benutzer abfragen\n" -#: help.c:320 -#, c-format +#: help.c:350 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 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME interne Variable löschen\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Large Objects\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\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_unlink LOBOID Large-Object-Operationen\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3364,13 +3237,11 @@ msgstr "" "Liste besonderer Variablen\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "psql-Variablen:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3380,8 +3251,7 @@ msgstr "" " oder \\set NAME WERT innerhalb von psql\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3389,8 +3259,7 @@ msgstr "" " AUTOCOMMIT\n" " wenn gesetzt werden alle erfolgreichen SQL-Befehle automatisch committet\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3400,8 +3269,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 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3409,8 +3277,7 @@ msgstr "" " DBNAME\n" " Name der aktuellen Datenbank\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3420,8 +3287,7 @@ msgstr "" " kontrolliert, welche Eingaben auf die Standardausgabe geschrieben werden\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3431,8 +3297,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 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3440,8 +3305,7 @@ msgstr "" " ENCODING\n" " aktuelle Zeichensatzkodierung des Clients\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3449,8 +3313,7 @@ msgstr "" " ERROR\n" " »true« wenn die letzte Anfrage fehlgeschlagen ist, sonst »false«\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3458,8 +3321,7 @@ msgstr "" " FETCH_COUNT\n" " Anzahl auf einmal zu holender und anzuzeigender Zeilen (0 = unbegrenzt)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3467,8 +3329,7 @@ msgstr "" " HIDE_TABLEAM\n" " wenn gesetzt werden Tabellenzugriffsmethoden nicht angezeigt\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3476,8 +3337,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3485,8 +3345,7 @@ msgstr "" " HISTCONTROL\n" " kontrolliert Befehlsgeschichte [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3494,8 +3353,7 @@ msgstr "" " HISTFILE\n" " Dateiname für die Befehlsgeschichte\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3503,8 +3361,7 @@ msgstr "" " HISTSIZE\n" " maximale Anzahl der in der Befehlsgeschichte zu speichernden Befehle\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3512,8 +3369,7 @@ msgstr "" " HOST\n" " der aktuell verbundene Datenbankserverhost\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3521,8 +3377,7 @@ msgstr "" " IGNOREEOF\n" " Anzahl benötigter EOFs um eine interaktive Sitzung zu beenden\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3530,8 +3385,7 @@ msgstr "" " LASTOID\n" " Wert der zuletzt beinträchtigten OID\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3542,8 +3396,7 @@ msgstr "" " Fehlermeldung und SQLSTATE des letzten Fehlers, oder leer und »000000« wenn\n" " kein Fehler\n" -#: help.c:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3552,8 +3405,7 @@ msgstr "" " wenn gesetzt beendet ein Fehler die Transaktion nicht (verwendet implizite\n" " Sicherungspunkte)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3561,8 +3413,7 @@ msgstr "" " ON_ERROR_STOP\n" " Skriptausführung bei Fehler beenden\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3570,8 +3421,7 @@ msgstr "" " PORT\n" " Serverport der aktuellen Verbindung\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3579,8 +3429,7 @@ msgstr "" " PROMPT1\n" " der normale psql-Prompt\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3588,8 +3437,7 @@ msgstr "" " PROMPT2\n" " der Prompt, wenn eine Anweisung von der vorherigen Zeile fortgesetzt wird\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3597,8 +3445,7 @@ msgstr "" " PROMPT3\n" " der Prompt während COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3606,8 +3453,7 @@ msgstr "" " QUIET\n" " stille Ausführung (wie Option -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3615,8 +3461,7 @@ msgstr "" " ROW_COUNT\n" " Anzahl der von der letzten Anfrage beeinträchtigten Zeilen, oder 0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3626,8 +3471,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " Serverversion (kurze Zeichenkette oder numerisches Format)\n" -#: help.c:415 -#, c-format +#: help.c:453 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" alle Ergebnisse einer kombinierten Anfrage (\\;) anzeigen statt nur das letzte\n" + +#: help.c:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3636,8 +3488,7 @@ msgstr "" " kontrolliert die Anzeige von Kontextinformationen in Meldungen\n" " [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3645,8 +3496,7 @@ msgstr "" " SINGLELINE\n" " wenn gesetzt beendet Zeilenende die SQL-Anweisung (wie Option -S)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3654,8 +3504,7 @@ msgstr "" " SINGLESTEP\n" " Einzelschrittmodus (wie Option -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3663,8 +3512,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE der letzten Anfrage, oder »00000« wenn kein Fehler\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3672,8 +3520,7 @@ msgstr "" " USER\n" " der aktuell verbundene Datenbankbenutzer\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3682,8 +3529,7 @@ msgstr "" " kontrolliert wieviele Details in Fehlermeldungen enthalten sind\n" " [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3695,8 +3541,7 @@ msgstr "" " VERSION_NUM\n" " Version von psql (lange Zeichenkette, kurze Zeichenkette oder numerisch)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3704,8 +3549,7 @@ msgstr "" "\n" "Anzeigeeinstellungen:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3715,8 +3559,7 @@ msgstr "" " oder \\pset NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3724,8 +3567,7 @@ msgstr "" " border\n" " Rahmenstil (Zahl)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3733,8 +3575,7 @@ msgstr "" " columns\n" " Zielbreite für das Format »wrapped«\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3742,7 +3583,7 @@ msgstr "" " expanded (oder x)\n" " erweiterte Ausgabe [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3751,8 +3592,7 @@ msgstr "" " fieldsep\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus (Standard »%s«)\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3760,8 +3600,7 @@ msgstr "" " fieldsep_zero\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3769,8 +3608,7 @@ msgstr "" " footer\n" " Tabellenfußzeile ein- oder auschalten [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3778,8 +3616,7 @@ msgstr "" " format\n" " Ausgabeformat setzen [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3787,8 +3624,7 @@ msgstr "" " linestyle\n" " Rahmenlinienstil setzen [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3796,8 +3632,7 @@ msgstr "" " null\n" " setzt die Zeichenkette, die anstelle eines NULL-Wertes ausgegeben wird\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3806,8 +3641,7 @@ msgstr "" " Verwendung eines Locale-spezifischen Zeichens zur Trennung von Zifferngruppen\n" " einschalten [on, off]\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3815,8 +3649,7 @@ msgstr "" " pager\n" " kontrolliert Verwendung eines externen Pager-Programms [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3824,8 +3657,7 @@ msgstr "" " recordsep\n" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3833,8 +3665,7 @@ msgstr "" " recordsep_zero\n" " Satztrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3844,8 +3675,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 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3853,8 +3683,7 @@ msgstr "" " title\n" " setzt den Titel darauffolgend ausgegebener Tabellen\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3862,8 +3691,7 @@ msgstr "" " tuples_only\n" " wenn gesetzt werden nur die eigentlichen Tabellendaten gezeigt\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3875,8 +3703,7 @@ msgstr "" " unicode_header_linestyle\n" " setzt den Stil für Unicode-Linien [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3884,8 +3711,7 @@ msgstr "" "\n" "Umgebungsvariablen:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3895,8 +3721,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3908,8 +3733,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3917,8 +3741,7 @@ msgstr "" " COLUMNS\n" " Anzahl Spalten im Format »wrapped«\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3926,8 +3749,7 @@ msgstr "" " PGAPPNAME\n" " wie Verbindungsparameter »application_name«\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3935,8 +3757,7 @@ msgstr "" " PGDATABASE\n" " wie Verbindungsparameter »dbname«\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3944,8 +3765,7 @@ msgstr "" " PGHOST\n" " wie Verbindungsparameter »host«\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3953,8 +3773,7 @@ msgstr "" " PGPASSFILE\n" " Name der Passwortdatei\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3962,8 +3781,7 @@ msgstr "" " PGPASSWORD\n" " Verbindungspasswort (nicht empfohlen)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3971,8 +3789,7 @@ msgstr "" " PGPORT\n" " wie Verbindungsparameter »port«\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3980,8 +3797,7 @@ msgstr "" " PGUSER\n" " wie Verbindungsparameter »user«\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3989,8 +3805,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " Editor für Befehle \\e, \\ef und \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3998,8 +3813,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " wie die Zeilennummer beim Aufruf des Editors angegeben wird\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4007,8 +3821,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativer Pfad für History-Datei\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4016,8 +3829,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " Name des externen Pager-Programms\n" -#: help.c:508 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" Name des externen Pager-Programms für \\watch\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4025,8 +3845,7 @@ msgstr "" " PSQLRC\n" " alternativer Pfad für .psqlrc-Datei des Benutzers\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4034,8 +3853,7 @@ msgstr "" " SHELL\n" " Shell für den Befehl \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4043,11 +3861,11 @@ msgstr "" " TMPDIR\n" " Verzeichnis für temporäre Dateien\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Verfügbare Hilfe:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4066,7 +3884,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4080,12 +3898,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" @@ -4105,25 +3923,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" @@ -4132,19 +3942,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" @@ -4159,24 +3969,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" @@ -4193,2315 +4003,2425 @@ msgstr "%s: Speicher aufgebraucht" #: 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "Name" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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: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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 msgid "new_owner" msgstr "neuer_Eigentümer" -#: 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:337 sql_help.c:350 -#: 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: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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 msgid "argmode" msgstr "Argmodus" -#: 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "Argtyp" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "Option" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "wobei Option Folgendes sein kann:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "Verbindungslimit" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "neuer_Tablespace" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 msgid "value" msgstr "Wert" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "Zielrolle" -#: sql_help.c:198 sql_help.c:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 msgid "schema_name" msgstr "Schemaname" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "abgekürztes_Grant_oder_Revoke" -#: sql_help.c:200 +#: 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: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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "Rollenname" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 msgid "expression" msgstr "Ausdruck" -#: sql_help.c:239 +#: sql_help.c:242 msgid "domain_constraint" msgstr "Domänen-Constraint" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "Constraint-Name" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "neuer_Constraint-Name" -#: sql_help.c:317 sql_help.c:1082 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "neue_Version" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "Elementobjekt" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "wobei Elementobjekt Folgendes ist:" -#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "Objektname" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "Aggregatname" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "Quelltyp" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "Zieltyp" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "Funktionsname" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "Operatorname" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "linker_Typ" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "rechter_Typ" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "Indexmethode" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "Prozedurname" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "Routinenname" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "Typname" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 msgid "lang_name" msgstr "Sprachname" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "und Aggregatsignatur Folgendes ist:" -#: sql_help.c:392 sql_help.c:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "Handler-Funktion" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "Validator-Funktion" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "Spaltenname" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: 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:449 sql_help.c:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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:451 sql_help.c:456 sql_help.c:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "Datentyp" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "Sortierfolge" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "Spalten-Constraint" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "ganze_Zahl" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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:473 sql_help.c:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 msgid "table_constraint" msgstr "Tabellen-Constraint" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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:480 sql_help.c:481 sql_help.c:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "Elterntabelle" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "Erweiterungsname" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "Ausführungskosten" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "Ergebniszeilen" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "Support-Funktion" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "Rollenangabe" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "Benutzername" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "wobei Rollenangabe Folgendes sein kann:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "Gruppenname" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "Tablespace-Name" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "Storage-Parameter" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "Spaltennummer" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "Large-Object-OID" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "Kompressionsmethode" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "neue_Zugriffsmethode" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "Res-Funktion" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "Join-Funktion" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "Strategienummer" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "Optyp" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "Sortierfamilienname" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "Unterst-Nummer" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "Argumenttyp" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "Tabellenname" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "Using-Ausdruck" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "Check-Ausdruck" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "Publikationsobjekt" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "Publikationsparameter" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "wobei Publikationsobjekt Folgendes sein kann:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "Passwort" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "Zeit" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "Datenbankname" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "Inkrement" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "Minwert" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "Maxwert" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "Start" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "Restart" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "Cache" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "neues_Ziel" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "Verbindungsinfo" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "Publikationsname" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "Publikationsoption" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "Refresh-Option" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "Subskriptionsparameter" -#: sql_help.c:1298 sql_help.c:1301 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "Skip-Option" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "Partitionsname" -#: sql_help.c:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "Partitionsbegrenzungsangabe" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "Sequenzoptionen" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "Sequenzoption" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "Tabellen-Constraint-für-Index" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: 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:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "und Partitionsbegrenzungsangabe Folgendes ist:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "Partitionsbegrenzungsausdruck" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "numerische_Konstante" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "und Spalten-Constraint Folgendes ist:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "Vorgabeausdruck" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "Generierungsausdruck" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "Indexparameter" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "Reftabelle" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "Refspalte" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "Fremdschlüsselaktion" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "und Tabellen-Constraint Folgendes ist:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "Exclude-Element" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "Operator" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "Prädikat" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "und Tabellen-Constraint-für-Index Folgendes ist:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "Indexparameter bei UNIQUE-, PRIMARY KEY- und EXCLUDE-Constraints sind:" -#: sql_help.c:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "Exclude-Element in einem EXCLUDE-Constraint ist:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "Opklasse" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "Fremdschlüsselaktion in FOREIGN KEY/REFERENCES ist:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 msgid "tablespace_option" msgstr "Tablespace-Option" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "Tokentyp" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "Wörterbuchname" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "altes_Wörterbuch" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "neues_Wörterbuch" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "Attributname" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "neuer_Attributname" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "neuer_Enum-Wert" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "Nachbar-Enum-Wert" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "existierender_Enum-Wert" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "Eigenschaft" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "Servername" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "Sichtoptionsname" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "Sichtoptionswert" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "Tabelle-und-Spalten" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "wobei Option eine der folgenden sein kann:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "boolean" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "und Tabelle-und-Spalten Folgendes ist:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "Transaktionsmodus" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "wobei Transaktionsmodus Folgendes sein kann:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "Argument" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "Relationsname" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "Domänenname" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "Policy-Name" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "Regelname" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "Zeichenkettenkonstante" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "Transaktions-ID" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "Dateiname" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "Befehl" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "Bedingung" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "Anfrage" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "Formatname" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "Trennzeichen" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "Null-Zeichenkette" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "Quote-Zeichen" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "Escape-Zeichen" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "Kodierungsname" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "Zugriffsmethodentyp" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "Arg-Datentyp" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "Übergangsfunktion" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "Zustandsdatentyp" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "Zustandsdatengröße" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "Abschlussfunktion" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "Combine-Funktion" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "Serialisierungsfunktion" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "Deserialisierungsfunktion" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "Anfangswert" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "Moving-Übergangsfunktion" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "Moving-Inversfunktion" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "Moving-Zustandsdatentyp" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "Moving-Zustandsdatengröße" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "Moving-Abschlussfunktion" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "Moving-Anfangswert" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "Sortieroperator" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "oder die alte Syntax" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "Basistyp" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "Locale" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "Provider" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "Version" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "existierende_Sortierfolge" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "Quellkodierung" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "Zielkodierung" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "Vorlage" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "Kodierung" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "Strategie" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "ICU-Locale" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "Locale-Provider" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "Sortierfolgenversion" + +#: sql_help.c:2212 +msgid "oid" +msgstr "OID" + +#: sql_help.c:2232 msgid "constraint" msgstr "Constraint" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "wobei Constraint Folgendes ist:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "Ereignis" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "Filtervariable" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "Filterwert" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "wobei Spalten-Constraint Folgendes ist:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "Rückgabetyp" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "Spaltentyp" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "Definition" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "Objektdatei" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "Linksymbol" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "SQL-Rumpf" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "Uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "Methode" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "Opklassen-Parameter" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "Handler" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "Inline-Handler" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "Valfunktion" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "Kommutator-Op" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "Umkehrungs-Op" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "Familienname" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "Storage-Typ" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "wobei Ereignis eins der folgenden sein kann:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "Schemaelement" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "Servertyp" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "Serverversion" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "FDW-Name" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "Statistikname" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "Statistikart" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "Subskriptionsname" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "Quelltabelle" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "Like-Option" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "und Like-Option Folgendes ist:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "Verzeichnis" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "Parser-Name" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "Quellkonfig" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "Startfunktion" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "Gettext-Funktion" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "Endfunktion" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "Lextypenfunktion" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "Headline-Funktion" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "Init-Funktion" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "Lexize-Funktion" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "From-SQL-Funktionsname" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "To-SQL-Funktionsname" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "verwiesener_Tabellenname" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "Übergangsrelationsname" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "Argumente" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "Label" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "Untertyp" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "Untertyp-Operatorklasse" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "Canonical-Funktion" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "Untertyp-Diff-Funktion" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "Multirange-Typname" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "Eingabefunktion" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "Ausgabefunktion" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "Empfangsfunktion" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "Sendefunktion" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "Typmod-Eingabefunktion" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "Typmod-Ausgabefunktion" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "Analyze-Funktion" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "Subscript-Funktion" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "interne_Länge" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "Ausrichtung" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "Speicherung" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "wie_Typ" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "Kategorie" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "bevorzugt" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "Vorgabewert" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "Element" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "Trennzeichen" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "sortierbar" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "With-Anfrage" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "Alias" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "From-Element" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "Cursor-Name" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "Ausgabeausdruck" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "Ausgabename" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "Code" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "Parameter" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "Anweisung" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "Richtung" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "wobei Richtung eine der folgenden sein kann:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "Anzahl" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "Sequenzname" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "Argname" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "Argtyp" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "Large-Object-OID" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "fernes_Schema" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "lokales_Schema" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "Konfliktziel" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "Konfliktaktion" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "wobei Konfliktziel Folgendes sein kann:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "Indexspaltenname" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "Indexausdruck" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "Indexprädikat" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "und Konfliktaktion Folgendes sein kann:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "Sub-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "Kanal" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "Sperrmodus" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "wobei Sperrmodus Folgendes sein kann:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "Zieltabellenname" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "Zielalias" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "Datenquelle" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "Verbundbedingung" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "When-Klausel" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "wobei Datenquelle Folgendes ist:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "Quelltabellenname" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "Quellanfrage" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "Quellalias" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "und When-Klausel Folgendes ist:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "Merge-Update" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "Merge-Delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "Merge-Insert" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "und Merge-Insert Folgendes ist:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "und Merge-Update Folgendes ist:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "und Merge-Delete Folgendes ist:" + +#: sql_help.c:4132 msgid "payload" msgstr "Payload" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "alte_Rolle" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "neue_Rolle" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "Sicherungspunktsname" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "Gruppierelement" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "Fenstername" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "Fensterdefinition" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "Select" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "wobei From-Element Folgendes sein kann:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "Spaltenalias" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "Stichprobenmethode" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "Startwert" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "With-Anfragename" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "Spaltendefinition" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "Verbundtyp" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "Verbundbedingung" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "Verbundspalte" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "Join-Using-Alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "und Gruppierelement eins der folgenden sein kann:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "und With-Anfrage ist:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "values" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "insert" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "update" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "delete" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "Search-Seq-Spaltenname" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "Cycle-Mark-Spaltenname" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "Cycle-Mark-Wert" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "Cycle-Mark-Standard" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "Cycle-Pfad-Spaltenname" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "neue_Tabelle" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "Snapshot-ID" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "Sortierausdruck" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "bricht die aktuelle Transaktion ab" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "ändert die Definition einer Aggregatfunktion" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "ändert die Definition einer Sortierfolge" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "ändert die Definition einer Zeichensatzkonversion" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "ändert eine Datenbank" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "definiert vorgegebene Zugriffsprivilegien" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "ändert die Definition einer Domäne" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "ändert die Definition eines Ereignistriggers" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "ändert die Definition einer Erweiterung" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "ändert die Definition eines Fremddaten-Wrappers" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "ändert die Definition einer Fremdtabelle" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "ändert die Definition einer Funktion" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "ändert Rollenname oder -mitglieder" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "ändert die Definition eines Index" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "ändert die Definition einer prozeduralen Sprache" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "ändert die Definition eines Large Object" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "ändert die Definition einer materialisierten Sicht" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "ändert die Definition eines Operators" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "ändert die Definition einer Operatorklasse" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "ändert die Definition einer Operatorfamilie" -#: sql_help.c:5113 +#: sql_help.c:5248 msgid "change the definition of a row-level security policy" msgstr "ändert die Definition einer Policy für Sicherheit auf Zeilenebene" -#: sql_help.c:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "ändert die Definition einer Prozedur" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "ändert die Definition einer Publikation" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "ändert eine Datenbankrolle" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "ändert die Definition einer Routine" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "ändert die Definition einer Regel" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "ändert die Definition eines Schemas" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "ändert die Definition eines Sequenzgenerators" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "ändert die Definition eines Fremdservers" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "ändert die Definition eines erweiterten Statistikobjekts" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "ändert die Definition einer Subskription" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "ändert einen Server-Konfigurationsparameter" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "ändert die Definition einer Tabelle" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "ändert die Definition eines Tablespace" -#: sql_help.c:5197 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" msgstr "ändert die Definition einer Textsuchekonfiguration" -#: sql_help.c:5203 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" msgstr "ändert die Definition eines Textsuchewörterbuchs" -#: sql_help.c:5209 +#: sql_help.c:5344 msgid "change the definition of a text search parser" msgstr "ändert die Definition eines Textsucheparsers" -#: sql_help.c:5215 +#: sql_help.c:5350 msgid "change the definition of a text search template" msgstr "ändert die Definition einer Textsuchevorlage" -#: sql_help.c:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "ändert die Definition eines Triggers" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "ändert die Definition eines Typs" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "ändert die Definition einer Benutzerabbildung" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "ändert die Definition einer Sicht" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "sammelt Statistiken über eine Datenbank" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "startet einen Transaktionsblock" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "ruft eine Prozedur auf" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "erzwingt einen Checkpoint im Write-Ahead-Log" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "schließt einen Cursor" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "clustert eine Tabelle nach einem Index" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "definiert oder ändert den Kommentar eines Objektes" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "schließt die aktuelle Transaktion ab" -#: sql_help.c:5299 +#: sql_help.c:5434 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:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "kopiert Daten zwischen einer Datei und einer Tabelle" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "definiert eine neue Zugriffsmethode" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "definiert eine neue Aggregatfunktion" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "definiert eine neue Typumwandlung" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "definiert eine neue Sortierfolge" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "definiert eine neue Kodierungskonversion" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "erzeugt eine neue Datenbank" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "definiert eine neue Domäne" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "definiert einen neuen Ereignistrigger" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "installiert eine Erweiterung" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "definiert einen neuen Fremddaten-Wrapper" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "definiert eine neue Fremdtabelle" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "definiert eine neue Funktion" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "definiert eine neue Datenbankrolle" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "definiert einen neuen Index" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "definiert eine neue prozedurale Sprache" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "definiert eine neue materialisierte Sicht" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "definiert einen neuen Operator" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "definiert eine neue Operatorklasse" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "definiert eine neue Operatorfamilie" -#: sql_help.c:5425 +#: sql_help.c:5560 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:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "definiert eine neue Prozedur" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "definiert eine neue Publikation" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "definiert eine neue Umschreiberegel" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" msgstr "definiert ein neues Schema" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "definiert einen neuen Sequenzgenerator" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "definiert einen neuen Fremdserver" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "definiert erweiterte Statistiken" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "definiert eine neue Subskription" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "definiert eine neue Tabelle" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 msgid "define a new table from the results of a query" msgstr "definiert eine neue Tabelle aus den Ergebnissen einer Anfrage" -#: sql_help.c:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "definiert einen neuen Tablespace" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "definiert eine neue Textsuchekonfiguration" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "definiert ein neues Textsuchewörterbuch" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "definiert einen neuen Textsucheparser" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "definiert eine neue Textsuchevorlage" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "definiert eine neue Transformation" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "definiert einen neuen Trigger" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "definiert einen neuen Datentyp" -#: sql_help.c:5551 +#: sql_help.c:5686 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:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "definiert eine neue Sicht" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "gibt einen vorbereiteten Befehl frei" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "definiert einen Cursor" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "löscht Zeilen einer Tabelle" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "verwirft den Sitzungszustand" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "führt einen anonymen Codeblock aus" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "entfernt eine Zugriffsmethode" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "entfernt eine Aggregatfunktion" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "entfernt eine Typumwandlung" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "entfernt eine Sortierfolge" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "entfernt eine Zeichensatzkonversion" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "entfernt eine Datenbank" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "entfernt eine Domäne" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "entfernt einen Ereignistrigger" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "entfernt eine Erweiterung" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "entfernt einen Fremddaten-Wrapper" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "entfernt eine Fremdtabelle" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "entfernt eine Funktion" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "entfernt eine Datenbankrolle" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "entfernt einen Index" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "entfernt eine prozedurale Sprache" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "entfernt eine materialisierte Sicht" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "entfernt einen Operator" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "entfernt eine Operatorklasse" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "entfernt eine Operatorfamilie" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" msgstr "entfernt die einer Datenbankrolle gehörenden Datenbankobjekte" -#: sql_help.c:5713 +#: sql_help.c:5848 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:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "entfernt eine Prozedur" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "entfernt eine Publikation" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "entfernt eine Routine" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "entfernt eine Umschreiberegel" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" msgstr "entfernt ein Schema" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "entfernt eine Sequenz" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "entfernt einen Fremdserverdeskriptor" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "entfernt erweiterte Statistiken" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "entfernt eine Subskription" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "entfernt eine Tabelle" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "entfernt einen Tablespace" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "entfernt eine Textsuchekonfiguration" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "entfernt ein Textsuchewörterbuch" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "entfernt einen Textsucheparser" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "entfernt eine Textsuchevorlage" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "entfernt eine Transformation" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "entfernt einen Trigger" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "entfernt einen Datentyp" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "entfernt eine Benutzerabbildung für einen Fremdserver" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "entfernt eine Sicht" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "führt einen vorbereiteten Befehl aus" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "zeigt den Ausführungsplan eines Befehls" -#: sql_help.c:5869 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" msgstr "liest Zeilen aus einer Anfrage mit einem Cursor" -#: sql_help.c:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "definiert Zugriffsprivilegien" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "importiert Tabellendefinitionen von einem Fremdserver" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "erzeugt neue Zeilen in einer Tabelle" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "hört auf eine Benachrichtigung" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "lädt eine dynamische Bibliotheksdatei" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "sperrt eine Tabelle" -#: sql_help.c:5911 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "fügt Zeilen in eine Tabelle ein oder ändert oder löscht Zeilen einer Tabelle, abhängig von Bedingungen" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "positioniert einen Cursor" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "erzeugt eine Benachrichtigung" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "bereitet einen Befehl zur Ausführung vor" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "bereitet die aktuelle Transaktion für Two-Phase-Commit vor" -#: sql_help.c:5935 +#: sql_help.c:6076 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:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "ersetzt den Inhalt einer materialisierten Sicht" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "baut Indexe neu" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "gibt einen zuvor definierten Sicherungspunkt frei" -#: sql_help.c:5959 +#: sql_help.c:6100 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:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "entfernt Zugriffsprivilegien" -#: sql_help.c:5977 +#: sql_help.c:6118 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:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "rollt eine Transaktion bis zu einem Sicherungspunkt zurück" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "definiert einen neuen Sicherungspunkt in der aktuellen Transaktion" -#: sql_help.c:5995 +#: sql_help.c:6136 msgid "define or change a security label applied to an object" msgstr "definiert oder ändert ein Security-Label eines Objektes" -#: sql_help.c:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "liest Zeilen aus einer Tabelle oder Sicht" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "ändert einen Konfigurationsparameter" -#: sql_help.c:6019 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" msgstr "setzt die Zeitsteuerung für Check-Constraints in der aktuellen Transaktion" -#: sql_help.c:6025 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" msgstr "setzt den aktuellen Benutzernamen der aktuellen Sitzung" -#: sql_help.c:6031 +#: sql_help.c:6172 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:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "setzt die Charakteristika der aktuellen Transaktion" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "zeigt den Wert eines Konfigurationsparameters" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "leert eine oder mehrere Tabellen" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "beendet das Hören auf eine Benachrichtigung" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "aktualisiert Zeilen einer Tabelle" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "säubert und analysiert eine Datenbank" -#: sql_help.c:6085 +#: sql_help.c:6226 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:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6510,27 +6430,27 @@ msgstr "" "Geben Sie »help« für Hilfe ein.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "konnte Ausgabeparameter »%s« nicht setzen" -#: startup.c:699 +#: startup.c:719 #, 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:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "überflüssiges Kommandozeilenargument »%s« ignoriert" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "konnte eigene Programmdatei nicht finden" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/third_party/spanner_pg/src/bin/psql/po/el.po b/third_party/spanner_pg/src/bin/psql/po/el.po index c35b49f5..a40390de 100644 --- a/third_party/spanner_pg/src/bin/psql/po/el.po +++ b/third_party/spanner_pg/src/bin/psql/po/el.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 14\n" +"Project-Id-Version: psql (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-10 20:30+0000\n" -"PO-Revision-Date: 2023-04-11 11:20+0200\n" +"POT-Creation-Date: 2023-04-14 09:16+0000\n" +"PO-Revision-Date: 2023-04-14 15:45+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -20,21 +20,26 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.2.2\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "κρίσιμο: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "σφάλμα: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "προειδοποίηση: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "λεπτομέρεια: " + +#: ../../../src/common/logging.c:301 +#, 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" @@ -71,8 +76,8 @@ msgid "%s() failed: %m" msgstr "%s() απέτυχε: %m" #: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "έλλειψη μνήμης" @@ -93,7 +98,7 @@ msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (ε msgid "could not look up effective user ID %ld: %s" msgstr "δεν ήταν δυνατή η αναζήτηση ενεργής ταυτότητας χρήστη %ld: %s" -#: ../../common/username.c:45 command.c:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "ο χρήστης δεν υπάρχει" @@ -140,305 +145,296 @@ msgstr "Αίτηση ακύρωσης εστάλη\n" msgid "Could not send cancel request: " msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: " -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu σειρά)" msgstr[1] "(%lu σειρές)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Διακόπηκε\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμα): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "παραλείπεται η αναδρομική επέκταση της μεταβλητής «%s»" -#: command.c:229 +#: ../../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:232 #, c-format msgid "invalid command \\%s" msgstr "μη έγκυρη εντολή «%s»" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Δοκιμάστε \\? για βοήθεια." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: επιπλέον παράμετρος «%s» αγνοείται" -#: command.c:301 +#: command.c:304 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s εντολή αγνοείται, χρησιμοποιείστε \\endif ή Ctrl-C για να εξέλθετε από το παρόν μπλοκ \\if" -#: command.c:562 +#: command.c:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "δεν ήταν δυνατή η ανάλληψη προσωπικού καταλόγου για τον χρήστη με ID %ld: %s" -#: command.c:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" -#: command.c:605 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων.\n" -#: command.c:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "μη ενδιάμεση μνήμη ερώτησης" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "μη έγκυρος αριθμός γραμμής «%s»" -#: command.c:1111 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία πηγών συναρτήσεων." - -#: command.c:1114 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία ορισμών προβολής." - -#: command.c:1198 +#: command.c:1203 msgid "No changes" msgstr "Καθόλου αλλάγες" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: μη έγκυρη ονομασία κωδικοποίησης ή δεν βρέθηκε η διεργασία μετατροπής" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Δεν υπάρχει προηγούμενο σφάλμα." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: λείπει δεξιά παρένθεση" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: λείπει αναγκαία παράμετρος" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: δεν δύναται να προκύψει μετά \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: δεν υπάρχει αντίστοιχο \\if" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: δεν δύναται να προκύψει μετά \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: δεν υπάρχει αντίστοιχο \\if" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: δεν υπάρχει αντίστοιχο \\if" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Άδεια ενδιάμεση μνήμη ερώτησης." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Εισάγετε νέο κωδικό πρόσβασης για το χρήστη «%s»: " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: δεν ήταν δυνατή η ανάγνωση τιμής για την μεταβλητή" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Μηδενισμός ενδιάμεσης μνήμη ερώτησης (καθάρισμα)." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "‘Εγραψε την ιστορία στο αρχείο «%s».\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: η ονομασία μεταβλητή περιβάλλοντος environment δεν δύναται να εμπεριέχει «=«" -#: command.c:2408 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την εμφάνιση του κώδικα της συνάρτησης." - -#: command.c:2411 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία ορισμών προβολής." - -#: command.c:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "η ονομασία συνάρτησης είναι αναγκαία" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "η ονομασία ορισμού είναι αναγκαία" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Η χρονομέτρηση είναι ενεργή." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Η χρονομέτρηση είναι ανενεργή." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Κωδικός πρόσβασης: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Κωδικός πρόσβασης για τον χρήστη %s: " -#: command.c:3106 +#: command.c:3168 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Να μην οριστεί ξεχωριστά ο χρήστης, ο κεντρικός υπολογιστής, ή η θύρα όταν χρησιμοποιείται μια συμβολοσειρά σύνδεσης" -#: command.c:3141 +#: command.c:3203 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Δεν υπάρχει σύνδεση βάσης δεδομένων για την επαναχρησιμοποίηση παραμέτρων" -#: command.c:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Κρατήθηκε η προηγούμενη σύνδεση" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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" "=\n" -#: command.c:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s».\n" -#: command.c:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, διακομιστής %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -447,29 +443,29 @@ msgstr "" "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: %s κύρια έκδοση %s, %s κύρια έκδοση διακομιστή.\n" " Ορισμένες δυνατότητες psql ενδέχεται να μην λειτουργούν.\n" -#: command.c:3608 +#: command.c:3680 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL σύνδεση (πρωτόκολλο: %s, cipher: %s, bits: %s, συμπίεση: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL σύνδεση (πρωτόκολλο: %s, cipher: %s, συμπίεση: %s)\n" -#: command.c:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "άγνωστο" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "κλειστό" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "ανοικτό" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-κρυπτογραφημένη σύνδεση\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -480,261 +476,271 @@ msgstr "" " Χαρακτήρες 8-bit δύναται να μην λειτουργούν ορθά. Δείτε την αναφορά στη σελίδα\n" " psql με τίτλο «Σημειώσεις για χρήστες Windows» για πληροφορίες.\n" -#: command.c:3751 +#: command.c:3822 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "η μεταβλητή περιβάλλοντος PSQL_EDITOR_LINENUMBER_ARG πρέπει να έχει οριστεί για να ορίσετε αριθμό σειράς" -#: command.c:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "δεν μπόρεσε να εκκινήσει τον editor «%s»" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "δεν μπόρεσε να εκκινήσει το /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "δεν ήταν δυνατός ο εντοπισμός του προσωρινού καταλόγου %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του προσωρινού αρχείου «%s»: %m" -#: command.c:4195 +#: command.c:4266 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: διφορούμενης συντόμευση «%s» ταιριάζει τόσο «%s» όσο «%s»" -#: command.c:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: επιτρεπόμενες μορφές γραμμών είναι ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: επιτρεπόμενες μορφές Unicode border line είναι single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: επιτρεπόμενες μορφές Unicode column line είναι single, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: επιτρεπόμενες μορφές Unicode header line είναι single, double" -#: command.c:4322 +#: command.c:4393 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep πρέπει να είναι ένας χαρακτήρας ενός-byte" -#: command.c:4327 +#: command.c:4398 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep δεν μπορεί να είναι διπλά εισαγωγικά, νέα γραμμή, ή carriage return" -#: command.c:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: άγνωστη επιλογή: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Border style είναι %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "Target width δεν είναι ορισμένο.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "Target width είναι %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Εκτεταμένη οθόνη είναι ενεργή.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Εκτεταμένη οθόνη χρησιμοποιείται αυτόματα.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Εκτεταμένη οθόνη είναι ανενεργή.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Διαχωριστής πεδίων CSV είναι ο «%s».\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Διαχωριστής πεδίων είναι το μηδενικό byte\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Διαχωριστής πεδίων είναι ο «%s».\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Προκαθορισμένο υποσέλιδο είναι ενεργό.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Προκαθορισμένο υποσέλιδο είναι ανενεργό.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Η μορφή εξόδου είναι %s.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Η μορφή γραμμής είναι %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Εμφάνιση Null είναι «%s».\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Η κατά εντοπιότητα διορθωμένη μορφή αριθμητικής εξόδου είναι ενεργή.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Η κατά εντοπιότητα διορθωμένη μορφή αριθμητικής εξόδου είναι ανενεργή.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Χρησιμοποιείται Pager για μεγάλη έξοδο.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Χρησιμοποιείται Pager συνέχεια.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "Η χρήση Pager είναι ανενεργή.\n" -#: command.c:4580 +#: command.c:4651 #, 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 δεν θα χρησιμοποιηθεί για λιγότερο από %d γραμμή.\n" msgstr[1] "Ο Pager δεν θα χρησιμοποιηθεί για λιγότερες από %d γραμμές.\n" -#: command.c:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Διαχωριστής εγγραφών είναι το μηδενικό byte\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Διαχωριστής εγγραφών είναι ο .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Διαχωριστής εγγραφών είναι ο/η «%s».\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Τα χαρακτηριστικά του πίνακα είναι «%s».\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Χαρακτηριστικά πίνακα μη ορισμένα.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Ο τίτλος είναι «%s».\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Ο τίτλος δεν είναι ορισμένος.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Ενεργή όψη μόνο πλειάδων.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Ανενεργή όψη μόνο πλειάδων.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Το στυλ περιγράμματος γραμμής Unicode είναι «%s».\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Το στυλ περιγράμματος στήλης Unicode είναι «%s».\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Το στυλ περιγράμματος γραμμής κεφαλίδας Unicode είναι «%s».\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: απέτυχε" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch δεν μπορεί να χρησιμοποιηθεί με κενή ερώτηση" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "δεν ήταν δυνατή η ρύθμιση του χρονομετρητή: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (κάθε %gs)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "" "%s (κάθε %gs)\n" "\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "δεν ήταν δυνατή η αναμονή για σήματα: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -747,117 +753,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "«%s.%s» δεν είναι μία όψη" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "δεν είναι δυνατή η διαφυγή χωρίς ενεργή σύνδεση" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "παράμετρος της εντολής κελύφους περιέχει μια νέα γραμμή ή μια επιστροφή μεταφοράς: «%s»" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "χάθηκε η σύνδεση στον διακομιστή" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Χάθηκε η σύνδεση στον διακομιστή. Προσπάθεια επαναφοράς: " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "Απέτυχε.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Πέτυχε.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "μη αναμενόμενο PQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Χρόνος: %.3f ms\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Χρόνος: %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Χρόνος: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, 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:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, c-format msgid "You are currently not connected to a database." msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch δεν μπορεί να χρησιμοποιηθεί μαζί με COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "μη αναμενόμενη κατάσταση αποτελέσματος για \\watch" - -#: common.c:694 +#: common.c:654 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» με ωφέλιμο φορτίο «%s» από τη διαδικασία διακομιστή με %d PID.\n" -#: common.c:697 +#: common.c:657 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» από τη διαδικασία διακομιστή με %d PID.\n" -#: common.c:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "δεν μπόρεσε να εκτυπώσει τον πίνακα αποτελέσματος: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "δεν επιστράφηκαν σειρές για \\gset" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "περισσότερες από μία γραμμές επιστράφηκαν για \\gset" -#: common.c:791 +#: common.c:731 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "αγνοείται η προσπάθεια να τεθεί \\gset στην ειδικά διαμορφωμένη μεταβλητή «%s»" -#: common.c:1211 +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -868,33 +864,28 @@ msgstr "" "%s\n" "***(πατήστε return για να συνεχίσετε ή εισάγετε x και return για να ακυρώσετε)********************\n" -#: common.c:1266 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει savepoints για ON_ERROR_ROLLBACK." - -#: common.c:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "ΔΗΛΩΣΗ: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "μη αναμενόμενη κατάσταση συναλλαγής: %d" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Στήλη" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Τύπος" -#: common.c:1564 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Η εντολή δεν έχει αποτέλεσμα, η το αποτέλεσμα δεν έχει στήλες.\n" @@ -961,11 +952,11 @@ msgstr "" "Εισαγάγετε τα δεδομένα που θα αντιγραφούν ακολουθούμενα από νέα γραμμή.\n" "Τερματίστε με μια ανάστροφη κάθετο και μια τελεία σε μια ξεχωριστή γραμμή, ή ένα σήμα EOF." -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "ματαιώθηκε λόγω σφάλματος κατά την ανάγνωση" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "προσπαθεί να τερματίσει τη λειτουργία αντιγραφής" @@ -1014,1147 +1005,1153 @@ msgstr "\\crosstabview: αμφίσημο όνομα στήλης: «%s»" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: όνομα στήλης δεν βρέθηκε: «%s»" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Σχήμα" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Όνομα" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Τύπος δεδομένων αποτελεσμάτων" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Τύπος δεδομένων παραμέτρων" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Περιγραφή" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Λίστα των συγκεντρωτικών συναρτήσεων" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει μεθόδους πρόσβασης." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Ευρετήριο" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Πίνακας" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Διαχειριστής" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Λίστα μεθόδων πρόσβασης" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει tablespaces." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Ιδιοκτήτης" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Τοποθεσία" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Επιλογές" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Μέγεθος" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Λίστα tablespaces" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df λαμβάνει μόνο [anptwS+] ως επιλογές" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "agg" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "window" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "proc" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "func" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "trigger" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "immutable" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "stable" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "volatile" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Προσωρινή" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "περιορισμένη" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "ασφαλής" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "ανασφαλής" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Παράλληλη" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "definer" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "invoker" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Ασφάλεια" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Γλώσσα" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Πηγαίος κώδικας" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Λίστα συναρτήσεων" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Εσωτερική ονομασία" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Στοιχεία" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Λίστα τύπων δεδομένων" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Τύπος αριστερής παραμέτρου" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Τύπος δεξιάς παραμέτρου" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Τύπος αποτελέσματος" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Συνάρτηση" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Λίστα operators" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Κωδικοποίηση" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Σύνθεση" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU εντοπιότητα" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Πάροχος εντοπιότητας" + +#: describe.c:964 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Λίστα βάσεων δεδομένων" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "πίνακας" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "όψη" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "υλοποιημένη όψη" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "ακολουθία" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "ξένος πίνακας" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "κατατμημένος πίνακας" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Προνόμια στήλης" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Πολιτικές" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Προνόμια πρόσβασης" -#: describe.c:1293 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την τροποποίηση προεπιλεγμένων δικαιωμάτων." - -#: describe.c:1313 +#: describe.c:1188 msgid "function" msgstr "συνάρτηση" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "τύπος" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "σχήμα" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Προεπιλεγμένες επιλογές δικαιωμάτων" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Ατνικείμενο" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "περιορισμός πίνακα" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "περιορισμός πεδίου" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "κλάση χειριστή" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "οικογένεια χειριστή" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "περιγραφή" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Περιγραφές αντικειμένου" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Δεν βρέθηκε καμία σχέση με όνομα «%s»." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Δεν βρέθηκαν καθόλου σχέσεις." -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "Δεν βρέθηκαν καθόλου σχέσεις με OID %s." -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Εκκίνηση" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Ελάχιστο" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Μέγιστο" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Επαύξηση" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "ναι" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "όχι" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Κύκλοι;" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Προσωρινή μνήμη" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Ανήκει σε: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Ακολουθία για τη στήλη ταυτότητας: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Ακαταχώρητη ακολουθία «%s.%s»" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Ακολουθία «%s.%s»" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ακαταχώρητος πίνακας «%s.%s»" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Πίνακας «%s.%s»" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Όψη «%s.%s»" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ακαταχώρητη υλοποιημένη όψη «%s.%s»" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Υλοποιημένη όψη «%s.%s»" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ακαταχώρητο ευρετήριο «%s.%s»" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Ευρετήριο «%s.%s»" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ακαταχώρητο κατατετμημένο ευρετήριο «%s.%s»" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Κατατετμημένο ευρετήριο «%s.%s»" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Ειδική σχέση «%s.%s»" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST πίνακας «%s.%s»" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Συνθετικός τύπος «%s.%s»" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Ξενικός πίνακας «%s.%s»" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ακαταχώρητος κατατετμημένος πίνακας «%s.%s»" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Κατατετμημένος πίνακας «%s.%s»" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Σύνθεση" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Nullable" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Προκαθορισμένο" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Κλειδί;" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Ορισμός" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Επιλογές FDW" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Αποθήκευση" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Συμπίεση" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Στόχος στατιστικών" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Κατάτμηση του: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Κανένας περιορισμός κατάτμησης" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Περιορισμός κατάτμησης: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Κλειδί κατάτμησης: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Ιδιοκτήτης πίνακα «%s.%s»" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "κύριο κλειδί, " -#: describe.c:2514 -msgid "unique, " -msgstr "μοναδικό, " +#: describe.c:2312 +msgid "unique" +msgstr "μοναδικό" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls μη διακριτά" -#: describe.c:2520 +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "για πίνακα «%s.%s»" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", πρόβλεψη (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", συσταδοποιημένο" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", άκυρο" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", αναβαλλόμενο" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", αρχικά αναβαλλόμενο" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", ταυτότητα πανομοιόματος" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Ευρετήρια:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Περιορισμοί ελέγχου:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Περιορισμοί ξενικών κλειδιών:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Αναφέρεται από:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Πολιτικές:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Πολιτικές (ενεργοποιημένη επιβολή ασφάλειας γραμμών):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Πολιτικές (ενεργοποιημένη ασφάλεια γραμμών): (καμία)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Πολιτικές (ενεργοποιημένη επιβολή ασφάλειας γραμμών): (καμία)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Πολιτικές (απενεργοποιημένη ασφάλεια γραμμών):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Αντικείμενα στατιστικών:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Κανόνες:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Απενεργοποιημένοι κανόνες:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Κανόνες πάντα σε χρήση:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Κανόνες σε χρήση μόνο στο ομοίωμα:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Δημοσιεύσεις:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Ορισμός όψης:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Triggers:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Απενεργοποιημένες triggers χρήστη:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Απενεργοποιημένες triggers:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Απενεργοποιημένες εσωτερικές triggers:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Triggers πάντα σε χρήση:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Triggers σε χρήση μόνο στο ομοίωμα:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Διακομιστής: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "FDW επιλογές: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Κληρονομεί" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Αριθμός κατατμήσεων: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Αριθμός κατατμήσεων: %d (Χρησιμοποιείστε \\d+ για να τους απαριθμήσετε.)" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Αριθμός απογονικών πινάκων: %d (Χρησιμοποιείστε \\d+ για να τους απαριθμήσετε.)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Απογονικοί πίνακες" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Κατατμήσεις" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Τυποποιημένος πίνακας τύπου: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Ταυτότητα Ομοιόματος" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Έχει OIDs: ναι" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Μέθοδος πρόσβασης: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", χώρος πίνακα «%s»" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Λίστα ρόλων" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Όνομα ρόλου" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Χαρακτηριστικά" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Μέλος του" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Υπερχρήστης" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Καμία κληρονιμιά" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Δημιουργήστε ρόλο" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Δημιουργήστε βάση δεδομένων" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "Δεν δύναται σύνδεση" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Αντιγραφή" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Παράκαμψη RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Καθόλου συνδέσεις" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d σύνδεση" msgstr[1] "%d συνδέσεις" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Κωδικός πρόσβασης ενεργός μέχρι " -#: describe.c:3991 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει ρυθμίσεις ρόλων ανά βάση δεδομένων." - -#: describe.c:4004 +#: describe.c:3777 msgid "Role" msgstr "Ρόλος" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "Βάση δεδομένων" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Ρυθμίσεις" -#: describe.c:4030 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s» και τη βάση δεδομένων «%s»." -#: describe.c:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s»." -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Δεν βρέθηκαν ρυθμίσεις." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Λίστα ρυθμίσεων" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "ευρετήριο" -#: describe.c:4115 -msgid "special" -msgstr "ειδικό" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "TOAST πίνακας" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "κατατετμημένο ευρετήριο" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "μόνιμο" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "προσωρινό" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "ακαταχώρητο" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Διάρκεια" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Μέθοδος πρόσβασης" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Λίστα σχέσεων" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την δηλωτική δημιουργία κατατμήσεων πίνακα." -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Λίστα κατατμημένων ευρετηρίων" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Λίστα κατατμημένων πινάκων" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Λίστα κατατμημένων σχέσεων" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Γονικό όνομα" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Μέγεθος φύλλου κατάτμησης" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Συνολικό μέγεθος" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Εμπιστευόμενο" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Εσωτερική γλώσσα" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Πρόγραμμα χειρισμού κλήσεων" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Ελεκτής" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Ενσωματωμένος χειριστής" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Λίστα γλωσσών" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Έλεγχος" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Λίστα πεδίων" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Πηγή" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Προορισμός" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Προεπιλογή;" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Λίστα μετατροπών" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Παράμετρος" + +#: describe.c:4498 +msgid "Value" +msgstr "Τιμή" + +#: describe.c:4505 +msgid "Context" +msgstr "Περιεχόμενο" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Λίστα ρυθμίσεων παραμέτρων" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Λίστα μη προεπιλεγμένων ρυθμίσεων παραμέτρων" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει εναύσματα συμβάντων." + +#: describe.c:4587 msgid "Event" msgstr "Συμβάν" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "ενεγροποιημένο" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "ομοίωμα" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "πάντα" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "απενεργοποιημένο" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Ενεργοποιημένο" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Ετικέτες" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Λίστα ενεργοποιήσεων συμβάντων" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει εκτεταμένες στατιστικές." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Dependencies" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Λίστα εκτεταμένων στατιστικών" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Τύπος πηγής" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Τύπος προοριστμού" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "σε ανάθεση" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Έμμεσα;" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Λίστα casts" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει συρραφές." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Πάροχος" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Ντετερμινιστικό;" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Λίστα συρραφών" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Λίστα σχημάτων" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αναζήτηση πλήρους κειμένου." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Λίστα αναλυτών αναζήτησης κειμένου" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου με το όνομα «%s»." -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Εκκίνηση ανάλυσης" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Μέθοδος" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Λήψη επόμενου ενδεικτικού" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Τέλος ανάλυσης" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Λήψη επικεφαλίδας" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Λήψη τύπων ενδεικτικών" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Αναλυτής αναζήτης κειμένου «%s.%s»" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Αναλυτής αναζήτης κειμένου «%s»" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Ονομασία ενδεικτικού" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Τύποι ενδεικτικών αναλυτή «%s.%s»" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Τύποι ενδεικτικών αναλυτή «%s»" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Πρότυπο" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Επιλογές εκκίνησης" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Λίστα λεξικών αναζήτησης κειμένου" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Εκκίνηση" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Lexize" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Λίστα προτύπων αναζήτησης κειμένου" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Λίστα ρυθμίσεων αναζήτησης κειμένου" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου με όνομα «%s»." -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Ενδεικτικό" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Λεξικά" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Ρύθμιση αναζήτησης κειμένου «%s.%s»" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Ρύθμιση αναζήτησης κειμένου «%s»" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2163,7 +2160,7 @@ msgstr "" "\n" "Αναλυτής: «%s.%s»" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2172,255 +2169,253 @@ msgstr "" "\n" "Αναλυτής: «%s»" -#: describe.c:5787 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει περιτύλιξη ξένων δεδομένων." - -#: describe.c:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Λίστα περιτύλιξης ξένων δεδομένων" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς διακομιστές." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Περιτύλιξη ξένων δεδομένων" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Έκδοση" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Λίστα ξενικών διακομιστών" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αντιστοιχίσεις χρηστών." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Διακομιστής" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Όνομα χρήστη" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Λίστα αντιστοιχιών χρηστών" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς πίνακες." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Λίστα ξενικών πινάκων" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει επεκτάσεις." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Λίστα εγκατεστημένων επεκτάσεων" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Δεν βρέθηκε καμία επέκταση με το όνομα «%s»." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Δεν βρέθηκαν επεκτάσεις." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Περιγραφή αντικειμένου" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Αντικείμενα στην επέκταση «%s»" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ακατάλληλο αναγνωρισμένο όνομα (πάρα πολλά διάστικτα ονόματα): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "οι παραπομπές μεταξύ βάσεων δεδομένων δεν είναι υλοποιημένες: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει δημοσιεύσεις." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Όλοι οι πίνακες" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Εισαγωγές" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Ενημερώσεις" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Διαγραφές" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Περικοπές" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Διαμέσου υπερχρήστη" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Λίστα δημοσιεύσεων" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Δεν βρέθηκε καμία δημοσίευση με όνομα «%s»." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Δεν βρέθηκε καμία δημοσίευση." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Δημοσίευση %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Πίνακες:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Πίνακες από σχήματα:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει συνδρομές." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Δημοσίευση" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Δυαδικό" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Ροής" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Συναλλαγή δύο φάσεων" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Απενεργοποίηση μετά από σφάλμα" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Σύγχρονη δέσμευση" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Παράλειψη LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Λίστα συνδρομών" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "ΑΜ" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Τύπος εισόδου" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Τύπος αποθήκευσης" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Κλάση χειριστή" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Οικογένεια χειριστή" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Λίστα οικογένειας κλάσεων" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Εφαρμόσιμοι τύποι" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Λίστα οικογενειών χειριστών" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Χειριστής" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Στρατηγική" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "διάταξη" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "αναζήτηση" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Στόχος" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Διάταξη opfamily" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Λίστα χειριστών των οικογενειών χειριστών" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Καταχωρημένος αριστερός τύπος" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Καταχωρημένος δεξιός τύπος" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Αριθμός" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Λίστα συναρτήσεων υποστήριξης των οικογενειών χειριστών" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Μεγάλα αντικείμενα" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2428,13 +2423,11 @@ msgstr "" "psql είναι το διαδραστικό τερματικό της PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Χρήση:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2442,33 +2435,28 @@ msgstr "" " psql [ΕΠΙΛΟΓΗ]... [DBNAME [USERNAME]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Γενικές επιλογές:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=COMMAND εκτέλεσε μόνο μία μονή εντολή (SQL ή εσωτερική) και έξελθε\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων στην οποία θα συνδεθείτε (προεπιλογή: «%s»)\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME εκτέλεσε εντολές από αρχείο, στη συνέχεια έξοδος\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list απαρίθμησε τις διαθέσιμες βάσεις δεδομένων, στη συνέχεια έξοδος\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2478,18 +2466,15 @@ msgstr "" " όρισε την μεταβλητή της psql NAME στην τιμή VALUE\n" " (π.χ., -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc να μην διαβαστεί το αρχείο εκκίνησης (~/.psqlrc)\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2497,23 +2482,19 @@ msgstr "" " -1 («one»), --single-transaction\n" " εκτέλεσε ως μεμονωμένη συναλλαγή (εάν δεν είναι διαδραστική)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] εμφάνισε αυτής της βοήθειας και, στη συνέχεια, έξοδος\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands απαρίθμησε τις εντολές ανάποδης καθέτου και, στη συνέχεια, έξοδος\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables απαρίθμησε τις ειδικές μεταβλητές και, στη συνέχεια, έξοδος\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2521,58 +2502,47 @@ msgstr "" "\n" "Επιλογές εισόδου και εξόδου:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all echo όλη την είσοδο από σενάριο\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors echo όλες τις αποτυχημένες εντολές\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries echo τις εντολές που αποστέλλονται στο διακομιστή\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden εμφάνισε ερωτήματα που δημιουργούνται από εσωτερικές εντολές\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME στείλε την καταγραφή της συνεδρίας στο αρχείο\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline απενεργοποιήσε την βελτιωμένη επεξεργασία γραμμής εντολών (readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME στείλε τα αποτελέσματα ερωτημάτων σε αρχείο (ή |pipe)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet εκτέλεσε σιωπηλά (καθόλου μηνύματα, μόνο έξοδος ερωτημάτων)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step λειτουργία μονού βήματος (επιβεβαίωσε κάθε ερώτημα)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line λειτουργία μονής γραμμής (το τέλος της γραμμής τερματίζει την εντολή SQL)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2580,17 +2550,15 @@ msgstr "" "\n" "Επιλογές μορφής εξόδου:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align λειτουργία εξόδου πίνακα μη ευθυγραμμισμένη λειτουργία εξόδου πίνακα\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv λειτουργία εξόδου πίνακα CSV (τιμές διαχωρισμένες με κόμματα)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2599,18 +2567,15 @@ msgstr "" " -F, --field-separator=STRING\n" " διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο (προεπιλογή: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html λειτουργία εξόδου πίνακα HTML\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] όρισε την επιλογή εκτύπωσης VAR σε ARG (δείτε την εντολή \\pset)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2618,23 +2583,19 @@ msgstr "" " -R, --record-separator=STRING\n" " διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο (προεπιλογή: νέα γραμμή)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only εκτύπωσε μόνο γραμμές\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT όρισε τα χαρακτηριστικά ετικετών πίνακα HTML (π.χ. πλάτος, περίγραμμα)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded ενεργοποίησε λειτουργία εκτεταμένης εξόδου πίνακα\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2642,8 +2603,7 @@ msgstr "" " -z, --field-separator-zero\n" " όρισε το διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2651,8 +2611,7 @@ msgstr "" " -0, --record-separator-zero\n" " όρισε το διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2660,37 +2619,34 @@ msgstr "" "\n" "Επιλογές σύνδεσης:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr " -h, --host=HOSTNAME κεντρικός υπολογιστής διακομιστή βάσης δεδομένων ή κατάλογος υποδοχών (προεπιλογή: «%s»)\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "τοπική υποδοχή" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων (προεπιλογή: «%s»)\n" -#: help.c:137 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME όνομα χρήστη βάσης δεδομένων (προεπιλογή: «%s»)\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2703,312 +2659,262 @@ msgstr "" "εντολές) μέσα από το psql, ή συμβουλευτείτε την ενότητα psql στην τεκμηρίωση της PostgreSQL\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αρχική σελίδα: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Γενικά\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright εμφάνισε τους όρους χρήσης και διανομής της PostgreSQL\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUMNS] εκτέλεσε την ερώτηση και execute query and εμφάνισε τα αποτελέσματα σε μορφή crosstab\n" +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [COLUMNS] εκτέλεσε το ερώτημα και εμφάνισε τo αποτελέσμα σε όψη crosstab\n" -#: help.c:174 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose εμφάνισε το πιο πρόσφατο μήνυμα σφάλματος στη μέγιστη λεπτομέρεια\n" -#: help.c:175 -#, c-format +#: help.c:195 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] εκτέλεσε το ερώτημα (και στείλτε αποτελέσματα σε αρχείο ή |pipe).\n" -" \\g χωρίς επιλογές ισοδυναμεί με το ερωματικό\n" +" \\g [(OPTIONS)] [FILE] εκτέλεσε το ερώτημα (και στείλε το αποτελέσματα σε αρχείο ή |pipe).\n" +" \\g χωρίς ορίσματα ισοδυναμεί με το ερωματικό\n" -#: help.c:177 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc περίγραψε το αποτέλεσμα του ερωτήματος, χωρίς να εκτελεστεί\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec εκτέλεσε το ερώτημα και, στη συνέχεια, εκτέλεσε κάθε τιμή του αποτελέσματός της\n" -#: help.c:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" -msgstr " \\gset [PREFIX] εκτέλεσε το ερώτημα και αποθήκευσε τα αποτελέσματα σε μεταβλητές της psql\n" +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [PREFIX] εκτέλεσε το ερώτημα και αποθήκευσε το αποτελέσμα σε psql μεταβλητές\n" -#: help.c:180 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FILE] όμοια με \\g, αλλά επιβάλλει λειτουργία εκτεταμένης εξόδου\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q τερμάτισε psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] εκτέλεση του ερωτήματος κάθε SEC δευτερόλεπτα\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Βοήθεια\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] εμφάνισε την βοήθεια για τις εντολές ανάποδης καθέτου\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options εμφάνισε την βοήθεια για τις επιλογές εντολών γραμμής της psql\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables εμφάνισε την βοήθεια για τις ειδικές μεταβλητές\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] βοήθεια για την σύνταξη των εντολών SQL, * για όλες τις εντολών\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Ενδιάμεση μνήμη Ερωτήματος\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] επεξεργάσου την ενδιάμεση μνήμη (ή αρχείο) ερωτήματος με εξωτερικό επεξεργαστή κειμένου\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] επεξεργάσου τον ορισμό της συνάρτησης με εξωτερικό επεξεργαστή κειμένου\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] επεξεργάσου τον ορισμό της όψης με εξωτερικό επεξεργαστή κειμένου\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p εμφάνισε τα περιοχόμενα της ενδιάμεσης μνήμης ερωτήματος\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r επαναφορά (αρχικοποίηση) της ενδιάμεσης μνήμης ερωτήματος\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] εμφάνισε το ιστορικό η αποθήκευσε το σε αρχείο\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE γράψε την ενδιάμεση μνήμη ερωτήματος σε αρχείο\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Είσοδος/Έξοδος\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... εκτέλεσε SQL COPY με ροή δεδομένων σε διακομιστή πελάτη\n" -#: help.c:207 -#, c-format +#: help.c:227 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] γράψε την στοιχειοσειρά στην τυπική έξοδο (-n για παράληψη νέας γραμμής)\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE εκτέλεσε εντολές από αρχείο\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir FILE όπως \\i, αλλά σε σχέση με την τοποθεσία του τρέχοντος σεναρίου\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] στείλε όλα τα αποτελέσματα ερωτημάτων σε αρχείο ή |pipe\n" -#: help.c:211 -#, c-format +#: help.c:231 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] γράψε την στοιχειοσειρά στην ροή εξόδου \\o (-n για παράληψη νέας γραμμής)\n" -#: help.c:212 -#, c-format +#: help.c:232 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 +#: help.c:235 msgid "Conditional\n" msgstr "Υπό συνθήκη\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR έναρξη υπό συνθήκης μπλοκ\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR εναλλακτική λύση εντός του τρέχοντος μπλοκ υπό όρους\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else τελική εναλλακτική λύση εντός του τρέχοντος μπλοκ υπό όρους\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif τερματισμός μπλοκ υπό όρους\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Πληροφοριακά\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (επιλογές: S = εμφάνισε αντικείμενα συστήματος, + = επιπλέον λεπτομέριες)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] εμφάνισε πίνακες, όψεις και σειρές\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME περιέγραψε πίνακα, όψη, σειρά, ή ευρετήριο\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] απαρίθμησε συγκεντρωτικά\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] απαρίθμησε μεθόδους πρόσβασης\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] απαρίθμησε κλάσεις χειριστή\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] απαρίθμησε οικογένειες χειριστών\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] απαρίθμησε χειριστές των οικογενειών χειριστών\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] απαρίθμησε συναρτήσεις των οικογενειών χειριστών\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] απαρίθμησε πινακοχώρους\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] απαρίθμησε μετατροπές\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] απαρίθμησε παραμέτρους ρύθμισης\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] απαρίθμησε casts\n" -#: help.c:235 -#, c-format +#: help.c:256 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATTERN] εμφάνισε περιγραφές αντικειμένων που δεν φαίνονται πουθενά αλλού\n" -#: help.c:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] απαρίθμησε πεδία\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] απαρίθμησε προεπιλεγμένα προνόμια\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] απαρίθμησε ξενικούς διακομιστές\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] απαρίθμησε αντιστοιχίες χρηστών\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] απαρίθμησε περιτυλίξεις ξένων δεδομένων\n" -#: help.c:243 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -3016,58 +2922,47 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN …]]\n" " απαρίθμησε συναρτήσεις [μόνο agg/normal/procedures/trigger/window]\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] απαρίθμησε ρυθμίσεις αναζήτησης κειμένου\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] απαρίθμησε λεξικά αναζήτησης κειμένου\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] απαρίθμησε αναλυτές αναζήτησης κειμένου\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] απαρίθμησε πρότυπα αναζήτησης κειμένου\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] απαρίθμησε ρόλους\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] απαρίθμησε ευρετήρια\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl απαρίθμησε μεγάλα αντικείμενα, όπως \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] απαρίθμησε μεγάλα αντικείμενα, όπως \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] απαρίθμησε διαδικαστικές γλώσσες\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] απαρίθμησε υλοποιημένες όψεις\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] απαρίθμησε σχήματα\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3075,123 +2970,124 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " απαρίθμησε χειριστές\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] απαρίθμησε συρραφές\n" -#: help.c:258 -#, c-format +#: help.c:279 msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [PATTERN] απαρίθμησε προνόμια πρόσβασης πίνακα, όψης και σειράς\n" -#: help.c:259 -#, c-format +#: help.c:280 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] απαρίθμησε διαχωρισμένες σχέσεις [μόνο ευρετήριο/πίνακα] [n=nested]\n" -#: help.c:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLEPTRN [DBPTRN]] απαρίθμησε ρυθμίσεις ρόλου ανά βάση δεδομένων\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] απαρίθμησε δημοσιεύσεις αναπαραγωγής\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] απαρίθμησε συνδρομές αναπαραγωγής\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] απαρίθμησε ακολουθίες\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] απαρίθμησε πίνακες\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] απαρίθμησε τύπους δεδομένων\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] απαρίθμησε ρόλους\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] απαρίθμησε όψεις\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] απαρίθμησε προεκτάσεις\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATTERN] απαρίθμησε εναύσματα συμβάντων\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] απαρίθμησε βάσεις δεδομένων\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME εμφάνισε τον ορισμό μίας συνάρτησης\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VIEWNAME εμφάνισε τον ορισμό μίας όψης\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [PATTERN] όπως \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Μεγάλα αντικείμενα\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE εγγραφή μεγάλου αντικειμένου σε αρχείο\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENT]\n" +" ανάγνωση μεγάλων αντικειμένων από αρχείο\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] απαρίθμησε μεγάλα αντικείμενα\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID διαγραφή μεγάλου αντικειμένου\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Μορφοποίηση\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a εναλλαγή μεταξύ μη ευθυγραμμισμένης και ευθυγραμμισμένης μορφής εξόδου\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [STRING] όρισε τίτλο πίνακα, ή αναίρεσε εάν κενό\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [STRING] εμφάνισε ή όρισε τον διαχωριστή πεδίου για μη ευθυγραμμισμένη έξοδο ερωτήματος\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H εναλλαγή λειτουργίας εξόδου HTML (επί του παρόντος %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3209,27 +3105,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] εμφάνισε μόνο γραμμές (επί του παρόντος %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [STRING] ορίστε χαρακτηριστικά ετικέτας
HTML, ή αναιρέστε εάν δεν υπάρχουν\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] εναλλαγή τιμής διευρυμένης εξόδου (επί του παρόντος %s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "αυτόματο" + +#: help.c:326 msgid "Connection\n" msgstr "Σύνδεση\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3238,8 +3136,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " σύνδεση σε νέα βάση δεδομένων (επί του παρόντος «%s»)\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3247,86 +3144,60 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " σύνδεση σε νέα βάση δεδομένων (επί του παρόντος καμία σύνδεση)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo εμφάνιση πληροφοριών σχετικά με την παρούσα σύνδεση\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] εμφάνισε ή όρισε την κωδικοποίηση του πελάτη\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] άλλαξε με ασφάλεια τον κωδικό πρόσβασης ενός χρήστη\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Λειτουργικό σύστημα\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] άλλαξε τον παρόν κατάλογο εργασίας\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\setenv NAME [VALUE] λήψη μεταβλητής περιβάλλοντος\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] όρισε ή αναίρεσε μεταβλητή περιβάλλοντος\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] εναλλαγή χρονισμού των εντολών (επί του παρόντος %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [COMMAND] εκτέλεσε εντολή σε κέλυφος ή ξεκίνησε διαδραστικό κέλυφος\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Μεταβλητές\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME προέτρεψε τον χρήστη να ορίσει εσωτερική μεταβλητή\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [VALUE]] όρισε εσωτερική μεταβλητή, ή απαρίθμησέ τες όλες εάν δεν υπάρχουν παράμετροι\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME αναίρεσε (διέγραψε) εσωτερική μεταβλητή\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Μεγάλα αντικείμενα\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID λειτουργίες μεγάλου αντικειμένου\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3334,13 +3205,11 @@ msgstr "" "Απαρίθμηση των ειδικά επεξεργασμένων μεταβλητών\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "psql μεταβλητές:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3350,8 +3219,7 @@ msgstr "" " ή \\set NAME VALUE μέσα σε psql\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3359,8 +3227,7 @@ msgstr "" " AUTOCOMMIT\n" " εφόσον ορισμένο, επιτυχημένες εντολές SQL ολοκληρώνονται αυτόματα\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3370,8 +3237,7 @@ msgstr "" " καθορίζει τον τύπο (πεζά, κεφαλαία) για την ολοκλήρωση όρων SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3379,8 +3245,7 @@ msgstr "" " DBNAME\n" " ονομασία της συνδεδεμένης βάσης δεδομένων\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3391,8 +3256,7 @@ msgstr "" " [all, errors, none, queries]\n" "\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3402,8 +3266,7 @@ msgstr "" " εάν έχει οριστεί, εμφανίστε εσωτερικά ερωτήματα που εκτελούνται από εντολές ανάστρωσής τους.\n" " εάν οριστεί σε \"noexec\", απλά δείξτε τους χωρίς εκτέλεση\n" -#: help.c:371 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3411,8 +3274,7 @@ msgstr "" " ENCODING\n" " τρέχουσα κωδικοποίηση χαρακτήρων του προγράμματος-πελάτη\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3420,8 +3282,7 @@ msgstr "" " ERROR\n" " αληθές εάν το τελευταίο ερώτημα απέτυχε, διαφορετικά ψευδές\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3429,8 +3290,7 @@ msgstr "" " FETCH_COUNT\n" " αριθμός των σειρών αποτελεσμάτων για λήψη και εμφάνιση ανά επανάλληψη (0 = απεριόριστος)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3438,8 +3298,7 @@ msgstr "" " HIDE_TABLEAM\n" " εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι πρόσβασης πίνακα\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3447,8 +3306,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι συμπίεσης\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3456,8 +3314,7 @@ msgstr "" " HISTCONTROL\n" " ελέγχει το ιστορικό εντολών [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3465,8 +3322,7 @@ msgstr "" " HISTFILE\n" " όνομα αρχείου που χρησιμοποιείται για την αποθήκευση του ιστορικού εντολών\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3474,8 +3330,7 @@ msgstr "" " HISTSIZE\n" " μέγιστος αριθμός εντολών που θα αποθηκευτούν στο ιστορικό εντολών\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3483,8 +3338,7 @@ msgstr "" " HOST\n" " ο συνδεδεμένος κεντρικός υπολογιστής διακομιστή βάσης δεδομένων\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3492,8 +3346,7 @@ msgstr "" " IGNOREEOF\n" " αριθμός των EOF που απαιτούνται για τον τερματισμό μιας διαδραστικής συνεδρίας\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3501,8 +3354,7 @@ msgstr "" " LASTOID\n" " τιμή του τελευταίου επηρεασμένου OID\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3512,8 +3364,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " μήνυμα και SQLSTATE του τελευταίου σφάλματος, ή κενή συμβολοσειρά και \"00000\" εάν δεν\n" -#: help.c:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3521,8 +3372,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " εάν έχει οριστεί, ένα σφάλμα δεν διακόπτει μια συναλλαγή (χρησιμοποιεί έμμεσα σημεία αποθήκευσης)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3530,8 +3380,7 @@ msgstr "" " ON_ERROR_STOP\n" " σταμάτησε την ομαδική εκτέλεση μετά από σφάλμα\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3539,8 +3388,7 @@ msgstr "" " PORT\n" " θύρα διακομιστή της τρέχουσας σύνδεσης\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3548,8 +3396,7 @@ msgstr "" " PROMPT1\n" " ορίζει την τυπική προτροπή psql\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3557,8 +3404,7 @@ msgstr "" " PROMPT2\n" " καθορίζει την προτροπή που χρησιμοποιείται όταν μια πρόταση συνεχίζεται από προηγούμενη γραμμή\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3566,8 +3412,7 @@ msgstr "" " PROMPT3\n" " καθορίζει την προτροπή που χρησιμοποιείται κατά την διάρκεια COPY … FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3575,8 +3420,7 @@ msgstr "" " QUIET\n" " σιωπηλή εκτέλεση(όμοια με την επιλογή -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3584,8 +3428,7 @@ msgstr "" " ROW_COUNT\n" " αριθμός των επηρεασμένων ή επιστρεφομένων σειρών του τελευταίου ερωτήματος, ή 0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3595,8 +3438,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " έκδοση διακομιστή (σε σύντομη συμβολοσειρά ή αριθμητική μορφή)\n" -#: help.c:415 -#, c-format +#: help.c:453 +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:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3604,8 +3454,7 @@ msgstr "" " SHOW_CONTEXT\n" " ελέγχει την εμφάνιση των πεδίων του περιεχομένου μηνύματος [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3613,8 +3462,7 @@ msgstr "" " SINGLELINE\n" " εάν έχει οριστεί, το τέλος γραμμής ολοκληρώνει τα ερωτήματα SQL (όμοια με την επιλογή -S)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3622,8 +3470,7 @@ msgstr "" " SINGLESTEP\n" " λειτουργία μονού-βήματος(όμοια με την επιλογή -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3631,8 +3478,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE του τελευταίου ερωτήματος, ή «00000» εάν δεν υπήρξαν σφάλματα\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3640,8 +3486,7 @@ msgstr "" " USER\n" " ο τρέχων συνδεδεμένος χρήστης βάσης δεδομένων\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3649,8 +3494,7 @@ msgstr "" " VERBOSITY\n" " ελέγχει την περιφραστικότητα των αναφορών σφαλμάτων [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3662,8 +3506,7 @@ msgstr "" " VERSION_NUM\n" " η έκδοση της psql (σε περιγραφική συμβολοσειρά, σύντομη συμβολοσειρά, ή αριθμητική μορφή)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3671,8 +3514,7 @@ msgstr "" "\n" "Ρυθμίσεις εμφάνισης:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3682,8 +3524,7 @@ msgstr "" " ή \\set NAME VALUE μέσα σε συνεδρία psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3691,8 +3532,7 @@ msgstr "" " border\n" " στυλ περιγράμματος (αριθμός)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3700,8 +3540,7 @@ msgstr "" " columns\n" " πλάτος προορισμού κατά την εμφάνιση αναδιπλωμένης μορφής\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3709,7 +3548,7 @@ msgstr "" " expanded (ή x)\n" " διευρυμένη έξοδος [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3718,8 +3557,7 @@ msgstr "" " fieldsep\n" " διαχωριστικό πεδίου σε μορφή μή ευθυγραμισμένης εξόδου (προκαθοριμένο «%s»)\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3727,8 +3565,7 @@ msgstr "" " fieldsep_zero\n" " ορίζει το διαχωριστικό πεδίου για τη μορφή μη ευθυγραμμισμένης εξόδου στο μηδενικό byte\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3736,8 +3573,7 @@ msgstr "" " footer\n" " ενεργοποιεί ή απενεργοποιεί την εμφάνιση του υποσέλιδου σε πίνακα [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3745,8 +3581,7 @@ msgstr "" " format\n" " ορίζει τη μορφή εξόδου [unaligned, aligned, wrapped, html, asciidoc, …]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3754,8 +3589,7 @@ msgstr "" " linestyle\n" " ορίζει τη μορφή περιγράμματος [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3763,8 +3597,7 @@ msgstr "" " null\n" " ορίζει τη συμβολοσειρά που θα εκτυπωθεί στη θέση κενής τιμής\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3772,8 +3605,7 @@ msgstr "" " numericlocale\n" " ενεργοποίηση εμφάνισης ενός χαρακτήρα εντοπιότητας για το διαχωρισμό ομάδων ψηφίων\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3781,8 +3613,7 @@ msgstr "" " Pager\n" " ελέγχει πότε χρησιμοποιείται εξωτερικός σελιδοποιητής [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3790,8 +3621,7 @@ msgstr "" " recordsep\n" " διαχωριστικό εγγραφών (σειράς) κατά την έξοδο μη ευθυγραμμισμένης μορφής\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3799,8 +3629,7 @@ msgstr "" " recordsep_zero\n" " ορίζει το διαχωριστικό εγγραφών στο μηδενικό byte κατά την έξοδο μη ευθυγραμμισμένης μορφής\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3810,8 +3639,7 @@ msgstr "" " καθορίζει τα χαρακτηριστικά ενός πίνακα tag σε μορφή HTML, ή καθορίζει\n" " αναλογικό πλάτος στηλών για τύπους δεδομένων με αριστερή στοίχιση σε μορφή latex-longtable\n" -#: help.c:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3819,8 +3647,7 @@ msgstr "" " title\n" " ορίζει τον τίτλο πίνακα για χρήση στους επόμενα εκτυπωμένους πίνακες\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3828,8 +3655,7 @@ msgstr "" " tuples_only\n" " εάν έχει ορισθεί, τότε εμφανίζονται μόνο τα δεδομένα πίνακα\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3841,8 +3667,7 @@ msgstr "" " unicode_header_linestyle\n" " ορισμός του στυλ γραμμής Unicode [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3850,8 +3675,7 @@ msgstr "" "\n" "Μεταβλητές περιβάλλοντος:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3861,8 +3685,7 @@ msgstr "" " ή \\setenv ΟΝΟΜΑ [ΤΙΜΗ] μέσα σε συνεδρία psql\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3874,8 +3697,7 @@ msgstr "" " ή \\setenv NAME [VALUE] μέσα σε συνεδρία psql\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3883,8 +3705,7 @@ msgstr "" " COLUMNS\n" " αριθμός στηλών για αναδιπλωμένη μορφή\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3892,8 +3713,7 @@ msgstr "" " PGAPPNAME\n" " όμοια με την παράμετρο σύνδεσης application_name\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3901,8 +3721,7 @@ msgstr "" " PGDATABASE\n" " όμοια με την παράμετρο σύνδεσης dbname\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3910,8 +3729,7 @@ msgstr "" " PGHOST\n" " όμοια με την παράμετρο της σύνδεσης κεντρικού υπολογιστή\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3919,8 +3737,7 @@ msgstr "" " PGPASSFILE\n" " αρχείο κωδικών πρόσβασης\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3928,8 +3745,7 @@ msgstr "" " PGPASSWORD\n" " κωδικός πρόσβασης σύνδεσης (δεν συνιστάται)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3937,8 +3753,7 @@ msgstr "" " PGPORT\n" " όμοια με την παράμετρο σύνδεσης θύρας\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3946,8 +3761,7 @@ msgstr "" " PGUSER\n" " όμοια με την παράμετρο σύνδεσης χρήστη\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3955,8 +3769,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " πρόγραμμα επεξεργασίας κειμένου που χρησιμοποιείται από τις εντολές \\e, \\ef και \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3964,8 +3777,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " τρόπος καθορισμού αριθμού γραμμής κατά την κλήση του προγράμματος επεξεργασίας κειμένου\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3973,8 +3785,7 @@ msgstr "" " PSQL_HISTORY\n" " εναλλακτική τοποθεσία για το αρχείο ιστορικού εντολών\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3982,8 +3793,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " όνομα του εξωτερικού προγράμματος σελιδοποίησης\n" -#: help.c:508 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" όνομα του εξωτερικού προγράμματος σελιδοποίησης για \\watch\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3991,8 +3809,7 @@ msgstr "" " PSQLRC\n" " εναλλακτική τοποθεσία για το αρχείο .psqlrc του χρήστη\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4000,8 +3817,7 @@ msgstr "" " SHELL\n" " shell που χρησιμοποιείται κατά την εντολή \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4009,11 +3825,11 @@ msgstr "" " TMPDIR\n" " κατάλογος για προσωρινά αρχεία\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Διαθέσιμη βοήθεια:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4032,7 +3848,7 @@ msgstr "" "Διεύθυνση URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4046,12 +3862,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 "το ιστορικό δεν υποστηρίζεται από την παρούσα εγκατάσταση" @@ -4071,25 +3887,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" @@ -4097,19 +3905,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 "Χρησιμοποιείτε psql, τη διασύνδεση γραμμής εντολών της PostgreSQL." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4124,24 +3932,24 @@ 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-D για να εξέλθετε." -#: 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 "έφτασε στο EOF χωρίς να βρεθούν τελικά \\endif(s)" @@ -4158,2315 +3966,2425 @@ 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "ονομασία" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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 "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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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 "new_schema" -#: sql_help.c:44 sql_help.c:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "argtype" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "επιλογή" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "όπου option μπορεί να είναι:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "connlimit" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "new_tablespace" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 msgid "value" msgstr "value" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "target_role" -#: sql_help.c:198 sql_help.c:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 msgid "schema_name" msgstr "schema_name" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "abbreviated_grant_or_revoke" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "role_name" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 msgid "expression" msgstr "expression" -#: sql_help.c:239 +#: sql_help.c:242 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "constraint_name" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "new_constraint_name" -#: sql_help.c:317 sql_help.c:1082 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "new_version" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "member_object" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "όπου member_object είναι:" -#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "object_name" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "aggregate_name" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "source_type" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "source_type" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "function_name" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "operator_name" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "source_type" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "source_type" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "source_type" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "procedure_name" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "routine_name" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "type_name" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 msgid "lang_name" msgstr "lang_name" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "και aggregate_signature είναι:" -#: sql_help.c:392 sql_help.c:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "handler_function" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "validator_function" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "column_name" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "new_column_name" -#: sql_help.c:449 sql_help.c:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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 "όπου action είναι ένα από:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "data_type" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "collation" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "column_constraint" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "integer" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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 "attribute_option" -#: sql_help.c:473 sql_help.c:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 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:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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 "trigger_name" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "parent_table" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "extension_name" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "execution_cost" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "result_rows" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "support_function" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "role_specification" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "user_name" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "όπου role_specification μπορεί να είναι:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "group_name" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "group_name" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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 "index_name" -#: sql_help.c:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "storage_parameter" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "column_number" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "large_object_oid" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "compression_method" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "new_access_method" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "strategy_number" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "op_type" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "index_name" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "support_number" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "argument_type" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "table_name" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "using_expression" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "check_expression" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "publication_object" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "publication_parameter" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "όπου publication_object είναι ένα από:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "password" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "database_name" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "increment" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "minvalue" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "maxvalue" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "start" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "restart" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "cache" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "new_target" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "publication_name" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "publication_option" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "refresh_option" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "subscription_parameter" -#: sql_help.c:1298 sql_help.c:1301 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "skip_option" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "partition_name" -#: sql_help.c:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "partition_bound_spec" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "sequence_options" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "sequence_option" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "table_constraint_using_index" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "rewrite_rule_name" -#: sql_help.c:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "και partition_bound_spec είναι:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "partition_bound_expr" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "numeric_literal" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "και column_constraint είναι:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "default_expr" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "generation_expr" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "index_parameters" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "reftable" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "refcolumn" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "referential_action" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "και table_constraint είναι:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "exclude_element" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "operator" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "predicate" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "και table_constraint_using_index είναι:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "index_parameters για περιορισμούς UNIQUE, PRIMARY KEY και EXCLUDE είναι:" -#: sql_help.c:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "exclude_element σε έναν περιορισμό τύπου EXCLUDE είναι:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "opclass" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "referential_action σε ένα περιορισμό FOREIGN KEY/REFERENCES είναι:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 msgid "tablespace_option" msgstr "tablespace_option" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "token_type" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "dictionary_name" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "old_dictionary" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "new_dictionary" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "attribute_name" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "new_attribute_name" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "new_enum_value" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "neighbor_enum_value" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "existing_enum_value" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "property" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "server_name" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "view_option_name" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "view_option_value" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "table_and_columns" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "όπου option μπορεί να είναι ένα από:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "boolean" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "και table_and_columns είναι:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "transaction_mode" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "όπου transaction_mode είναι ένα από:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "argument" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "relation_name" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "domain_name" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "policy_name" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "rule_name" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "string_literal" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "transaction_id" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "filename" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "command" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "condition" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "query" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "format_name" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "delimiter_character" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "null_string" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "quote_character" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "escape_character" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "encoding_name" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "arg_data_type" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "state_data_type" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "state_data_size" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "initial_condition" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "mstate_data_type" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "mstate_data_size" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "minitial_condition" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "sort_operator" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "ή την παλαιά σύνταξη" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "base_type" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "locale" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "provider" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "version" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "existing_collation" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "source_encoding" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "dest_encoding" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "template" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "dest_encoding" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "strategy" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_locale" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "locale_provider" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "collation_version" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "constraint" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "όπου constraint είναι:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "event" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "filter_value" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "όπου column_constraint είναι:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "rettype" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "column_type" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "definition" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "obj_file" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "link_symbol" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "sql_body" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "method" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "call_handler" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "inline_handler" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "valfunction" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "com_op" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "family_name" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "storage_type" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "όπου event μπορεί να είναι ένα από:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "schema_element" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "server_type" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "server_version" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "fdw_name" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "statistics_name" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "subscription_name" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "source_table" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "like_option" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "και like_option είναι:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "directory" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "parser_name" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "source_config" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "start_function" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "gettoken_function" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "end_function" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "lextypes_function" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "headline_function" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "init_function" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "lexize_function" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "from_sql_function_name" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "to_sql_function_name" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "referenced_table_name" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "transition_relation_name" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "arguments" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "label" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "subtype" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "subtype_operator_class" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "canonical_function" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "subtype_diff_function" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "multirange_type_name" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "input_function" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "output_function" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "receive_function" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "send_function" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "type_modifier_input_function" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "type_modifier_output_function" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "analyze_function" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "subscript_function" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "internallength" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "alignment" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "storage" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "like_type" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "category" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "preferred" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "default" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "element" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "delimiter" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "collatable" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "with_query" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "alias" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "from_item" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "cursor_name" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "output_expression" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "output_name" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "code" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "parameter" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "statement" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "direction" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "όπου κατεύθυνση μπορεί να είναι μία από:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "count" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "sequence_name" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "arg_name" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "arg_type" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "loid" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "remote_schema" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "local_schema" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "conflict_target" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "conflict_action" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "όπου conflict_target μπορεί να είναι ένα από:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "index_column_name" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "index_predicate" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "και conflict_action είναι ένα από:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "channel" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "lockmode" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "όπου lockmode είναι ένα από:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "table_table_name" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "target_alias" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "data_source" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "join_condition" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "when_clause" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "όπου data_source είναι:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "source_table_name" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "source_query" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "source_alias" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "και when_clause είναι:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "και merge_insert είναι:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "και merge_update είναι:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "και merge_delete είναι:" + +#: sql_help.c:4132 msgid "payload" msgstr "payload" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "old_role" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "new_role" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "savepoint_name" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "grouping_element" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "window_name" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "window_definition" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "select" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "όπου from_item μπορεί να είναι ένα από:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "column_alias" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "sampling_method" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "seed" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "with_query_name" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "column_definition" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "join_type" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "join_condition" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "join_column" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "και grouping_element μπορεί να είναι ένα από:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "και with_query είναι:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "values" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "insert" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "update" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "delete" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "search_seq_col_name" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "cycle_mark_col_name" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "cycle_mark_value" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "cycle_mark_default" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "cycle_path_col_name" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "new_table" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "sort_expression" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "ματαιώστε την τρέχουσα συναλλαγή" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "αλλάξτε τον ορισμό μιας συνάρτησης συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "αλλάξτε τον ορισμό συρραφής" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "αλλάξτε τον ορισμό μίας μετατροπής" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "αλλάξτε μία βάση δεδομένων" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "ορίσθε τα προεπιλεγμένα δικαιώματα πρόσβασης" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "αλλάξτε τον ορισμό ενός τομέα" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης συμβάντος" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "αλλάξτε τον ορισμό μίας προέκτασης" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "αλλάξτε τον ορισιμό μιας περιτύλιξης ξένων δεδομένων" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "αλλάξτε τον ορισιμό ενός ξενικού πίνακα" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "αλλάξτε τον ορισμό μιας συνάρτησης" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "αλλάξτε το όνομα ρόλου ή ιδιότητας μέλους" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "αλλάξτε τον ορισμό ενός ευρετηρίου" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "αλλάξτε τον ορισμό μιας διαδικαστικής γλώσσας" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "αλλάξτε τον ορισιμό ενός μεγάλου αντικειμένου" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "αλλάξτε τον ορισμό μίας υλοποιημένης όψης" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "αλλάξτε τον ορισμό ενός χειριστή" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "αλλάξτε τον ορισμό μίας κλάσης χειριστή" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "αλλάξτε τον ορισμό μίας οικογένειας χειριστή" -#: sql_help.c:5113 +#: sql_help.c:5248 msgid "change the definition of a row-level security policy" msgstr "αλλάξτε τον ορισμό μιας πολιτικής ασφάλειας επιπέδου σειράς" -#: sql_help.c:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "αλλάξτε τον ορισμό μίας διαδικασίας" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "αλλάξτε τον ορισμό μίας δημοσίευσης" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "αλλάξτε τον ρόλο μίας βάσης δεδομένων" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "αλλάξτε τον ορισμό μιας ρουτίνας" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "αλλάξτε τον ορισμό ενός κανόνα" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "αλλάξτε τον ορισμό ενός σχήματος" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "αλλάξτε τον ορισμό μίας γεννήτριας ακολουθίας" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "αλλάξτε τον ορισμό ενός ξενικού διακομιστή" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "αλλάξτε τον ορισμό ενός εκτεταμένου αντικειμένου στατιστικών" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "αλλάξτε τον ορισμό μιας συνδρομής" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "αλλάξτε μία παράμετρο διαμόρφωσης διακομιστή" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "αλλάξτε τον ορισμό ενός πίνακα" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "αλλάξτε τον ορισμό ενός πινακοχώρου" -#: sql_help.c:5197 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" msgstr "αλλάξτε τον ορισμό μίας διαμόρφωσης αναζήτησης κειμένου" -#: sql_help.c:5203 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" msgstr "αλλάξτε τον ορισμό ενός λεξικού αναζήτησης κειμένου" -#: sql_help.c:5209 +#: sql_help.c:5344 msgid "change the definition of a text search parser" msgstr "αλλάξτε τον ορισμό ενός αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5215 +#: sql_help.c:5350 msgid "change the definition of a text search template" msgstr "αλλάξτε τον ορισμό ενός προτύπου αναζήτησης κειμένου" -#: sql_help.c:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "αλλάξτε τον ορισμό ενός τύπου" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "αλλάξτε τον ορισμό μίας αντιστοίχισης χρήστη" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "αλλάξτε τον ορισμό μίας όψης" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "συλλέξτε στατιστικά σχετικά με μία βάση δεδομένων" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "εκκινήστε ένα μπλοκ συναλλαγής" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "κλήση διαδικασίας" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "επιβάλλετε εισαγωγή ενός σημείου ελέγχου (checkpoint) του write-ahead log" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "κλείστε έναν δρομέα" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "δημιουργείστε συστάδα ενός πίνακα σύμφωνα με ένα ευρετήριο" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "ορίσετε ή αλλάξτε το σχόλιο ενός αντικειμένου" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "ολοκληρώστε την τρέχουσας συναλλαγής" -#: sql_help.c:5299 +#: sql_help.c:5434 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "ολοκληρώστε μία συναλλαγή που είχε προετοιμαστεί νωρίτερα για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "αντιγράψτε δεδομένα μεταξύ ενός αρχείου και ενός πίνακα" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "ορίσετε μία νέα μέθοδο πρόσβασης" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "ορίσετε μία νέα συνάρτηση συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "ορίσετε ένα νέο καστ" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "ορίσετε μία νέα συρραφή" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "ορίσετε μία νέα μετατροπή κωδικοποίησης" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "δημιουργήστε μία νέα βάση δεδομένων" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "ορίσετε ένα νέο πεδίο" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "ορίσετε μία νέα ενεργοποίησης συμβάντος" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "εγκαταστήστε μία νέα προέκταση" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "ορίσετε μία νέα περιτύλιξη ξένων δεδομένων" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "ορίσετε ένα νέο ξενικό πίνακα" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "ορίσετε μία νέα συνάρτηση" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "ορίστε έναν νέο ρόλο βάσης δεδομένων" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "ορίστε ένα νέο ευρετήριο" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "ορίστε μία νέα διαδικαστική γλώσσα" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "ορίστε μία νέα υλοποιημένη όψη" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "ορίστε έναν νέο χειριστή" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "ορίστε μία νέα κλάση χειριστή" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "ορίστε μία νέα οικογένεια χειριστή" -#: sql_help.c:5425 +#: sql_help.c:5560 msgid "define a new row-level security policy for a table" msgstr "ορίστε μία νέα πολιτική προστασίας σειράς για έναν πίνακα" -#: sql_help.c:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "ορίστε μία νέα διαδικασία" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "ορίστε μία νέα κοινοποιήση" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "ορίστε ένα νέο κανόνα επανεγγραφής" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" msgstr "ορίστε ένα νέο σχήμα" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "ορίστε ένα νέο παραγωγό ακολουθίων" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "ορίστε ένα νέο ξενικό διακομιστή" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "ορίστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "ορίστε μία νέα συνδρομή" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "ορίσετε ένα νέο πίνακα" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 msgid "define a new table from the results of a query" msgstr "ορίστε ένα νέο πίνακα από τα αποτελέσματα ενός ερωτήματος" -#: sql_help.c:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "ορίστε ένα νέο πινακοχώρο" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "ορίστε μία νέα διαμόρφωση αναζήτησης κειμένου" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "ορίστε ένα νέο λεξικό αναζήτησης κειμένου" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "ορίστε ένα νέο αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "ορίστε ένα νέο πρότυπο αναζήτησης κειμένου" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "ορίστε μία νέα μετατροπή" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "ορίσετε μία νέα ενεργοποίηση" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "ορίσετε ένα νέο τύπο δεδομένων" -#: sql_help.c:5551 +#: sql_help.c:5686 msgid "define a new mapping of a user to a foreign server" msgstr "ορίστε μία νέα αντιστοίχιση ενός χρήστη σε έναν ξένο διακομιστή" -#: sql_help.c:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "ορίστε μία νέα όψη" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "καταργήστε μία προετοιμασμένη δήλωση" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "ορίστε έναν δρομέα" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "διαγράψτε σειρές ενός πίνακα" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "καταργήστε την κατάσταση συνεδρίας" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "εκτελέστε ανώνυμο μπλοκ κώδικα" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "αφαιρέστε μία μέθοδο πρόσβασης" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "αφαιρέστε μία συνάρτηση συγκεντρωτικών αποτελεσμάτων" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "αφαιρέστε ένα καστ" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "αφαιρέστε μία συρραφή" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "αφαιρέστε μία μετατροπή" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "αφαιρέστε μία βάση δεδομένων" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "αφαιρέστε ένα πεδίο" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "αφαιρέστε μία ενεργοποίηση συμβάντος" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "αφαιρέστε μία προέκταση" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "αφαιρέστε μία περιτύλιξη ξένων δεδομένων" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "αφαιρέστε έναν ξενικό πίνακα" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "αφαιρέστε μία συνάρτηση" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "αφαιρέστε έναν ρόλο μίας βάσης δεδομένων" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "αφαιρέστε ένα ευρετήριο" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "αφαιρέστε μία διαδικαστική γλώσσα" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "αφαιρέστε μία υλοποιημένη όψη" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "αφαιρέστε έναν χειριστή" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "αφαιρέστε μία κλάση χειριστή" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "αφαιρέστε μία οικογένεια χειριστή" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" msgstr "αφαιρέστε αντικειμένα βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων" -#: sql_help.c:5713 +#: sql_help.c:5848 msgid "remove a row-level security policy from a table" msgstr "αφαιρέστε μία πολιτική ασφαλείας επιπέδου σειράς από έναν πίνακα" -#: sql_help.c:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "αφαιρέστε μία διαδικασία" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "αφαιρέστε μία δημοσίευση" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "αφαιρέστε μία ρουτίνα" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "αφαιρέστε έναν κανόνα επανεγγραφής" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" msgstr "αφαιρέστε ένα σχήμα" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "αφαιρέστε μία ακολουθία" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "αφαιρέστε έναν περιγραφέα ξενικού διακομιστή" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "αφαιρέστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "αφαιρέστε μία συνδρομή" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "αφαιρέστε έναν πίνακα" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "αφαιρέστε έναν πινακοχώρο" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "αφαιρέστε μία διαμόρφωση αναζήτησης κειμένου" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "αφαιρέστε ένα λεξικό αναζήτησης κειμένου" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "αφαιρέστε έναν αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "αφαιρέστε ένα πρότυπο αναζήτησης κειμένου" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "αφαιρέστε μία μετατροπή" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "αφαιρέστε μία ενεργοποίηση" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "αφαιρέστε έναν τύπο δεδομένων" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "αφαιρέστε μία αντιστοίχιση χρήστη για ξένο διακομιστή" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "αφαιρέστε μία όψη" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "εκτελέστε μία προεπιλεγμένη δήλωση" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "εμφανίστε το πλάνο εκτέλεσης μίας δήλωσης" -#: sql_help.c:5869 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" msgstr "ανακτήστε σειρές από ερώτημα μέσω δρομέα" -#: sql_help.c:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "ορίσθε δικαιώματα πρόσβασης" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "εισαγωγή ορισμών πίνακα από ξένο διακομιστή" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "δημιουργήστε καινούργιες σειρές σε έναν πίνακα" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "ακούστε για μία κοινοποίηση" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "φορτώστε ένα αρχείο κοινόχρηστης βιβλιοθήκης" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "κλειδώστε έναν πίνακα" -#: sql_help.c:5911 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "υπό όρους εισαγωγή, ενημέρωση, ή διαγραφή σειρών ενός πίνακα" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "τοποθετήστε έναν δρομέα" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "δημιουργήστε μία κοινοποίηση" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "προετοιμάστε μία δήλωση για εκτέλεση" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "προετοιμάστε την τρέχουσας συναλλαγής για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5935 +#: sql_help.c:6076 msgid "change the ownership of database objects owned by a database role" msgstr "αλλάξτε την κυριότητα αντικειμένων βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων" -#: sql_help.c:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "αντικαθαστήστε τα περιεχόμενα μίας υλοποιημένης όψης" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "επανακατασκευάστε ευρετήρια" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "καταστρέψτε ένα προηγούμενα ορισμένο σημείο αποθήκευσης" -#: sql_help.c:5959 +#: sql_help.c:6100 msgid "restore the value of a run-time parameter to the default value" msgstr "επαναφορά της τιμής μιας παραμέτρου χρόνου εκτέλεσης στην προεπιλεγμένη τιμή" -#: sql_help.c:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "αφαιρέστε δικαιώματα πρόσβασης" -#: sql_help.c:5977 +#: sql_help.c:6118 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "ακύρωση συναλλαγής που είχε προετοιμαστεί προηγουμένως για ολοκλήρωση σε δύο φάσεις" -#: sql_help.c:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "επαναφορά σε σημείο αποθήκευσης" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "ορίστε ένα νέο σημείο αποθήκευσης (savepoint) μέσα στην τρέχουσα συναλλαγή" -#: sql_help.c:5995 +#: sql_help.c:6136 msgid "define or change a security label applied to an object" msgstr "ορίστε ή αλλάξτε μία ετικέτα ασφαλείας που εφαρμόζεται σε ένα αντικείμενο" -#: sql_help.c:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "ανακτήστε σειρές από πίνακα ή όψη" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "αλλάξτε μία παράμετρο χρόνου εκτέλεσης" -#: sql_help.c:6019 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" msgstr "ορίστε τον χρονισμό ελέγχου περιορισμού για την τρέχουσα συναλλαγή" -#: sql_help.c:6025 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" msgstr "ορίστε το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας" -#: sql_help.c:6031 +#: sql_help.c:6172 msgid "set the session user identifier and the current user identifier of the current session" msgstr "ορίστε το αναγνωριστικό χρήστη συνεδρίας και το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας" -#: sql_help.c:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "ορίστε τα χαρακτηριστικά της τρέχουσας συναλλαγής" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "εμφάνιση της τιμής μιας παραμέτρου χρόνου εκτέλεσης" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "αδειάστε έναν πίνακα ή ένα σύνολο πινάκων" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "σταματήστε να ακούτε μια κοινοποίηση" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "ενημέρωση σειρών πίνακα" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "συλλογή απορριμμάτων και προαιρετική ανάλυση βάσης δεδομένων" -#: sql_help.c:6085 +#: sql_help.c:6226 msgid "compute a set of rows" msgstr "υπολογίστε ένα σύνολο σειρών" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 μπορεί να χρησιμοποιηθεί μόνο σε μη διαδραστική λειτουργία" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6475,27 +6393,27 @@ msgstr "" "Γράψτε «help» για βοήθεια.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "δεν ήταν δυνατός ο ορισμός παραμέτρου εκτύπωσης «%s»" -#: startup.c:699 +#: startup.c:719 #, 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:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "παραβλέπεται η πρόσθετη παράμετρος γραμμής εντολών «%s»" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "δεν ήταν δυνατή η εύρεση του ιδίου εκτελέσιμου προγράμματος" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6530,20 +6448,88 @@ msgstr "" "μη αναγνωρίσιμη τιμή \"%s\" για \"%s\"\n" "Οι διαθέσιμες τιμές είναι: %s." +#~ msgid "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID large object operations\n" +#~ msgstr "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID λειτουργίες μεγάλου αντικειμένου\n" + #~ msgid "All connection parameters must be supplied because no database connection exists" #~ msgstr "Πρέπει να δωθούν όλες οι παρέμετροι γιατί δεν υπάρχει σύνδεση με τη βάση δεδομένων" +#~ msgid "Disabled triggers:" +#~ msgstr "Απενεργοποιημένες triggers:" + #~ msgid "Enter new password: " #~ msgstr "Εισάγετε νέο κωδικό πρόσβασης: " +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "Ειδική σχέση «%s.%s»" + +#~ msgid "The server (version %s) does not support altering default privileges." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την τροποποίηση προεπιλεγμένων δικαιωμάτων." + +#~ msgid "The server (version %s) does not support collations." +#~ 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 "The server (version %s) does not support foreign servers." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς διακομιστές." + +#~ msgid "The server (version %s) does not support foreign tables." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς πίνακες." + +#~ msgid "The server (version %s) does not support foreign-data wrappers." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει περιτύλιξη ξένων δεδομένων." + +#~ msgid "The server (version %s) does not support full text search." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αναζήτηση πλήρους κειμένου." + +#~ msgid "The server (version %s) does not support per-database role settings." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει ρυθμίσεις ρόλων ανά βάση δεδομένων." + +#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει savepoints για ON_ERROR_ROLLBACK." + +#~ 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 "The server (version %s) does not support tablespaces." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει tablespaces." + +#~ msgid "The server (version %s) does not support user mappings." +#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αντιστοιχίσεις χρηστών." + +#~ msgid "\\watch cannot be used with COPY" +#~ msgstr "\\watch δεν μπορεί να χρησιμοποιηθεί μαζί με COPY" + +#~ msgid "fatal: " +#~ msgstr "κρίσιμο: " + #~ msgid "pclose failed: %m" #~ msgstr "απέτυχε η εντολή pclose: %m" -#~ msgid "text" -#~ msgstr "text" +#~ msgid "special" +#~ msgstr "ειδικό" #~ msgid "timezone" #~ msgstr "timezone" +#~ msgid "unexpected result status for \\watch" +#~ msgstr "μη αναμενόμενη κατάσταση αποτελέσματος για \\watch" + #~ msgid "where direction can be empty or one of:" #~ msgstr "όπου direction μπορεί να είναι άδειο ή ένα από:" diff --git a/third_party/spanner_pg/src/bin/psql/po/es.po b/third_party/spanner_pg/src/bin/psql/po/es.po index f36b2aa2..e3b001ec 100644 --- a/third_party/spanner_pg/src/bin/psql/po/es.po +++ b/third_party/spanner_pg/src/bin/psql/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 14\n" +"Project-Id-Version: psql (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 17:01+0000\n" -"PO-Revision-Date: 2022-01-12 17:40-0500\n" +"POT-Creation-Date: 2023-05-07 16:46+0000\n" +"PO-Revision-Date: 2023-05-08 11:17+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -23,21 +23,26 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: BlackCAT 1.1\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "error: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "precaución: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalle: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "consejo: " + #: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 #, c-format msgid "could not identify current directory: %m" @@ -74,8 +79,8 @@ msgid "%s() failed: %m" msgstr "%s() falló: %m" #: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "memoria agotada" @@ -96,7 +101,7 @@ msgstr "no se puede duplicar un puntero nulo (error interno)\n" msgid "could not look up effective user ID %ld: %s" msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s" -#: ../../common/username.c:45 command.c:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "el usuario no existe" @@ -143,303 +148,294 @@ msgstr "Petición de cancelación enviada\n" msgid "Could not send cancel request: " msgstr "No se pudo enviar la petición de cancelación: %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu fila)" msgstr[1] "(%lu filas)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrumpido\n" -#: ../../fe_utils/print.c:3104 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3144 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "formato de salida no válido (error interno): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "saltando expansión recursiva de la variable «%s»" -#: command.c:229 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "no se pudo buscar el usuario local de ID %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "no existe un usuario local con ID %d" + +#: command.c:232 #, c-format msgid "invalid command \\%s" msgstr "orden \\%s no válida" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Digite \\? para obtener ayuda." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: argumento extra «%s» ignorado" -#: command.c:301 +#: command.c:304 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "orden \\%s ignorada: use \\endif o Ctrl-C para salir del bloque \\if actual" -#: command.c:562 +#: command.c:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "no se pudo obtener directorio home para el usuario de ID %ld: %s" -#: command.c:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: no se pudo cambiar directorio a «%s»: %m" -#: command.c:605 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "No está conectado a una base de datos.\n" -#: command.c:615 +#: command.c:627 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n" -#: command.c:618 +#: command.c:630 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n" -#: command.c:624 +#: command.c:636 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n" -#: command.c:627 +#: command.c:639 #, c-format 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "no hay búfer de consulta" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "número de línea no válido: %s" -#: command.c:1111 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "El servidor (versión %s) no soporta la edición del código fuente de funciones." - -#: command.c:1114 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "El servidor (versión %s) no soporta la edición de vistas." - -#: command.c:1198 +#: command.c:1203 msgid "No changes" msgstr "Sin cambios" -#: command.c:1277 +#: command.c:1282 #, c-format 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:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "No hay error anterior." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: falta el paréntesis derecho" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: falta argumento requerido" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: no puede ocurrir después de \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: no hay un \\if coincidente" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: no puede ocurrir después de \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: no hay un \\if coincidente" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: no hay un \\if coincidente" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "El búfer de consulta está vacío." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Ingrese nueva contraseña para usuario «%s»: " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Las contraseñas no coinciden." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "%s: no se pudo leer el valor para la variable" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "El búfer de consulta ha sido reiniciado (limpiado)." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Se escribió la historia en el archivo «%s».\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: el nombre de variable de ambiente no debe contener «=»" -#: command.c:2408 -#, 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:2411 -#, 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:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "el nombre de la función es requerido" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "el nombre de la vista es requerido" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "El despliegue de duración está activado." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "El despliegue de duración está desactivado." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Contraseña: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Contraseña para usuario %s: " -#: command.c:3106 +#: command.c:3168 #, 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:3141 +#: command.c:3203 #, 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:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Se ha mantenido la conexión anterior" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, 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:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, servidor %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -448,29 +444,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:3608 +#: command.c:3680 #, 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" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "Conexión SSL (protocolo: %s, cifrado: %s, compresión: %s)\n" -#: command.c:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "desconocido" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "desactivado" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "activado" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Conexión Cifrada GSSAPI\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -483,259 +479,269 @@ msgstr "" " Vea la página de referencia de psql «Notes for Windows users»\n" " para obtener más detalles.\n" -#: command.c:3751 +#: command.c:3822 #, 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:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "no se pudo iniciar el editor «%s»" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "no se pudo iniciar /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "no se pudo ubicar el directorio temporal: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir archivo temporal «%s»: %m" -#: command.c:4195 +#: command.c:4266 #, 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:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, 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:4249 +#: command.c:4320 #, 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:4264 +#: command.c:4335 #, 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:4279 +#: command.c:4350 #, 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:4322 +#: command.c:4393 #, 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:4327 +#: command.c:4398 #, 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:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: opción desconocida: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "El estilo de borde es %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "El ancho no está definido.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "El ancho es %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Se ha activado el despliegue expandido.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "El despliegue expandido se usa automáticamente.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Se ha desactivado el despliegue expandido.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "El separador de campos para CSV es «%s».\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "El separador de campos es el byte cero.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "El separador de campos es «%s».\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "El pie por omisión está activo.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "El pie de página por omisión está desactivado.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "El formato de salida es %s.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "El estilo de línea es %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Despliegue de nulos es «%s».\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "La salida numérica ajustada localmente está habilitada.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "La salida numérica ajustada localmente está deshabilitada.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "El paginador se usará para salida larga.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "El paginador se usará siempre.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "El paginador no se usará.\n" -#: command.c:4580 +#: command.c:4651 #, 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:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "El separador de filas es el byte cero.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "El separador de filas es .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "El separador de filas es «%s».\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Los atributos de tabla son «%s».\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Los atributos de tabla han sido indefinidos.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "El título es «%s».\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "El título ha sido indefinido.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Mostrar sólo filas está activado.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Mostrar sólo filas está desactivado.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "El estilo Unicode de borde es «%s».\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "El estilo de línea Unicode de columna es «%s».\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "El estilo de línea Unicode de encabezado es «%s».\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: falló" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch no puede ser usado con una consulta vacía" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "no se pudo establecer un temporizador: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (cada %gs)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (cada %gs)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "no se pudo esperar señales: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -748,117 +754,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "«%s.%s» no es una vista" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "no se pudo interpretar el array reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "no se puede escapar sin una conexión activa" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "se ha perdido la conexión al servidor" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "La conexión al servidor se ha perdido. Intentando reiniciar: " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "Falló.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Con éxito.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus no esperado: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Duración: %.3f ms\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, c-format msgid "You are currently not connected to a database." msgstr "No está conectado a una base de datos." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "no se puede usar \\watch con COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "estado de resultado inesperado de \\watch" - -#: common.c:694 +#: common.c:654 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Notificación asíncrona «%s» con carga «%s» recibida del proceso de servidor con PID %d.\n" -#: common.c:697 +#: common.c:657 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Notificación asíncrona «%s» recibida del proceso de servidor con PID %d.\n" -#: common.c:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "no se pudo mostrar la tabla de resultados: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset no retornó renglón alguno" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset retornó más de un renglón" -#: common.c:791 +#: common.c:731 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "se ignoró intentó de hacer \\gset a variable con tratamiento especial «%s»" -#: common.c:1211 +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -869,33 +865,28 @@ msgstr "" "%s\n" "***(presione enter para continuar, o x y enter para cancelar)*******************\n" -#: common.c:1266 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "El servidor (versión %s) no soporta savepoints para ON_ERROR_ROLLBACK." - -#: common.c:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "SENTENCIA: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "estado de transacción inesperado (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Columna" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Tipo" -#: common.c:1564 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "La orden no tiene resultado, o el resultado no tiene columnas.\n" @@ -962,11 +953,11 @@ msgstr "" "Ingrese los datos a ser copiados seguidos de un fin de línea.\n" "Termine con un backslash y un punto, o una señal EOF." -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "se abortó por un error de lectura" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "tratando de salir del modo copy" @@ -1015,1147 +1006,1153 @@ msgstr "\\crosstabview: nombre de columna «%s» ambiguo" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: nombre de columna «%s» no encontrado" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Esquema" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Nombre" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Tipo de dato de salida" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Tipos de datos de argumentos" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Descripción" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Listado de funciones de agregación" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "El servidor (versión %s) no soporta métodos de acceso." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Indice" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Tabla" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Manejador" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Lista de métodos de acceso" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "El servidor (versión %s) no soporta tablespaces." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Dueño" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Ubicación" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Opciones" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Tamaño" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Listado de tablespaces" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df sólo acepta las opciones [antpwS+]" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df no acepta la opción «%c» en un servidor versión %s" #. translator: "agg" is short for "aggregate" -#: describe.c:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "agg" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "ventana" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "proc" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "func" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "disparador" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "inmutable" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "estable" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "volátil" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Volatilidad" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "restringida" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "segura" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "insegura" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Paralelismo" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "definidor" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "invocador" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Seguridad" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Lenguaje" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Código fuente" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Listado de funciones" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Nombre interno" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Elementos" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Listado de tipos de dato" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Tipo arg izq" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Tipo arg der" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Tipo resultado" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Función" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Listado de operadores" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Codificación" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Collate" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "configuración ICU" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Proveedor de locale" + +#: describe.c:964 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Listado de base de datos" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "tabla" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "vista" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "vistas materializadas" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "secuencia" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "tabla foránea" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "tabla particionada" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Privilegios de acceso a columnas" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Políticas" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Privilegios" -#: describe.c:1293 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "El servidor (versión %s) no soporta la alteración de privilegios por omisión." - -#: describe.c:1313 +#: describe.c:1188 msgid "function" msgstr "función" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "tipo" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "esquema" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Privilegios de acceso por omisión" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Objeto" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "restricción de tabla" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "restricción de dominio" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "clase de operadores" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "familia de operadores" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "regla" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Descripciones de objetos" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "No se encontró relación llamada «%s»." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "No se encontró ninguna relación." -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "No se encontró relación con OID %s." -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Inicio" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Mínimo" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Máximo" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Incremento" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "sí" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "no" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "¿Cicla?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Cache" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Asociada a: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Secuencia para columna identidad: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Secuencia unlogged «%s.%s»" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Secuencia «%s.%s»" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Tabla unlogged «%s.%s»" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabla «%s.%s»" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Vista «%s.%s»" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vista materializada unlogged «%s.%s»" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vista materializada \"%s.%s\"" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Índice unlogged «%s.%s»" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Índice «%s.%s»" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Índice particionado unlogged «%s.%s»" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Índice particionado «%s.%s»" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Relación especial «%s.%s»" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Tabla TOAST «%s.%s»" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Tipo compuesto «%s.%s»" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Tabla foránea «%s.%s»" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Tabla unlogged particionada «%s.%s»" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Tabla particionada «%s.%s»" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Ordenamiento" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Nulable" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Por omisión" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "¿Llave?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Definición" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Opciones de FDW" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Almacenamiento" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Compresión" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Estadísticas" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Partición de: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Sin restricción de partición" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Restricción de partición: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Llave de partición: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Tabla dueña: «%s.%s»" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "llave primaria, " -#: describe.c:2514 -msgid "unique, " -msgstr "único, " +#: describe.c:2312 +msgid "unique" +msgstr "único" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls no distintos" + +#: describe.c:2315 +msgid ", " +msgstr ", " -#: describe.c:2520 +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "de tabla «%s.%s»" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", predicado (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", clustered" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", no válido" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", postergable" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", inicialmente postergada" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", identidad de replicación" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Índices:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Restricciones CHECK:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Restricciones de llave foránea:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Referenciada por:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Políticas:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Políticas (seguridad de registros forzada):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Políticas (seguridad de filas activa): (ninguna)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Políticas (seguridad de filas forzada): (ninguna)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Políticas (seguridad de filas inactiva):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Objetos de estadísticas:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Reglas:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Reglas deshabilitadas:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Reglas que se activan siempre:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Reglas que se activan sólo en las réplicas:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Publicaciones:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Definición de vista:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Triggers:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Disparadores de usuario deshabilitados:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Disparadores deshabilitados:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Disparadores internos deshabilitados:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Disparadores que siempre se ejecutan:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Disparadores que se ejecutan sólo en las réplicas:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Servidor: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "Opciones de FDW: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Hereda" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Número de particiones: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Número de particiones: %d (Use \\d+ para listarlas.)" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Número de tablas hijas: %d (Use \\d+ para listarlas.)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Tablas hijas" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Particiones" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Tabla tipada de tipo: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Identidad de replicación" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Tiene OIDs: sí" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Método de acceso: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", tablespace «%s»" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Lista de roles" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Nombre de rol" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Atributos" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Miembro de" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Superusuario" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Sin herencia" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Crear rol" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Crear BD" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "No puede conectarse" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Replicación" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Ignora RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Ninguna conexión" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d conexión" msgstr[1] "%d conexiones" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Constraseña válida hasta " -#: describe.c:3991 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "El servidor (versión %s) no soporta parámetros por base de datos y rol." - -#: describe.c:4004 +#: describe.c:3777 msgid "Role" msgstr "Nombre de rol" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "Base de Datos" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Parámetros" -#: describe.c:4030 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "No se encontró ningún parámetro para el rol «%s» y la base de datos «%s»." -#: describe.c:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "No se encontró ningún parámetro para el rol «%s»." -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "No se encontró ningún parámetro." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Listado de parámetros" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "índice" -#: describe.c:4115 -msgid "special" -msgstr "especial" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "Tabla TOAST" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "índice particionado" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "permanente" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "temporal" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "unlogged" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Persistencia" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Método de acceso" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Listado de relaciones" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "El servidor (versión %s) no soporta particionamiento declarativo de tablas." -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Listado de índices particionados" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Listado de tablas particionadas" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Listado de relaciones particionadas" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Nombre del padre" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Tamaño de particiones hoja" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Tamaño total" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Confiable" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Lenguaje interno" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Manejador de llamada" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Validador" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Manejador en línea" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Lista de lenguajes" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Check" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Listado de dominios" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Fuente" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Destino" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Por omisión?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Listado de conversiones" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Parámetro" + +#: describe.c:4498 +msgid "Value" +msgstr "Valor" + +#: describe.c:4505 +msgid "Context" +msgstr "Contexto" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Listado de parámetro de configuración" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Listado de parámetros de configuración no-default" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "El servidor (versión %s) no soporta triggers por eventos." + +#: describe.c:4587 msgid "Event" msgstr "Evento" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "activo" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "réplica" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "siempre" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "inactivo" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Activo" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Etiquetas" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Listado de disparadores por eventos" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "El servidor (versión %s) no soporta estadísticas extendidas." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Dependencias" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Lista de estadísticas extendidas" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Tipo fuente" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Tipo destino" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "en asignación" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Implícito?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Listado de conversiones de tipo (casts)" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "El servidor (versión %s) no soporta «collations»." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Proveedor" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "¿Determinístico?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Listado de ordenamientos" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Listado de esquemas" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "El servidor (versión %s) no soporta búsqueda en texto." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Listado de analizadores de búsqueda en texto" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "No se encontró ningún analizador de búsqueda en texto llamado «%s»." -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "No se encontró ningún analizador de búsqueda en texto." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Inicio de parse" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Método" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Obtener siguiente elemento" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Fin de parse" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Obtener encabezado" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Obtener tipos de elemento" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analizador de búsqueda en texto «%s.%s»" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Analizador de búsqueda en texto «%s»" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Nombre de elemento" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tipos de elemento para el analizador «%s.%s»" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tipos de elemento para el analizador «%s»" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Plantilla" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Opciones de inicialización" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Listado de diccionarios de búsqueda en texto" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Inicializador" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Fn. análisis léx." -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Listado de plantillas de búsqueda en texto" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Listado de configuraciones de búsqueda en texto" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "No se encontró una configuración de búsqueda en texto llamada «%s»." -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "No se encontró una configuración de búsqueda en texto." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Elemento" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Diccionarios" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configuración de búsqueda en texto «%s.%s»" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configuración de búsqueda en texto «%s»" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2164,7 +2161,7 @@ msgstr "" "\n" "Analizador: «%s.%s»" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2173,255 +2170,253 @@ msgstr "" "\n" "Analizador: «%s»" -#: describe.c:5787 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "El servidor (versión %s) no soporta conectores de datos externos." - -#: describe.c:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Listado de conectores de datos externos" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "El servidor (versión %s) no soporta servidores foráneos." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Conectores de datos externos" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Versión" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Listado de servidores foráneos" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "El servidor (versión %s) no soporta mapeos de usuario." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Servidor" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Nombre de usuario" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Listado de mapeos de usuario" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "El servidor (versión %s) no soporta tablas foráneas." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Listado de tablas foráneas" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "El servidor (versión %s) no soporta extensiones." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Listado de extensiones instaladas" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "No se encontró extensión llamada «%s»." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "No se encontró ninguna extensión." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Descripción de objeto" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objetos en extensión «%s»" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "no están implementadas las referencias entre bases de datos: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "El servidor (versión %s) no soporta publicaciones." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Todas las tablas" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Inserts" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Updates" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Deletes" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Truncates" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Via root" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Listado de publicaciones" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "No se encontró publicación llamada «%s»." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "No se encontró ninguna publicación." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Publicación %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Tablas:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Tablas de esquemas:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "El servidor (versión %s) no soporta suscripciones." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Publicación" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Binario" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "De flujo" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Commit 2-fases" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Desactivar en error" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Commit síncrono" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Saltar LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Listado de suscripciones" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "AM" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Tipo de entrada" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Tipo de almacenamiento" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Clase de operador" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Familia de operadores" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Listado de clases de operador" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Tipos aplicables" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Listado de familias de operadores" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Operador" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Estrategia" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "ordenamiento" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "búsqueda" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Propósito" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "familia de ops de ordenamiento" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Lista de operadores de familias de operadores" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Tipo de dato izquierdo registrado" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Tipo de dato derecho registrado" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Número" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Listado de funciones de la familia de operadores %s" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Objetos grandes" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2429,13 +2424,11 @@ msgstr "" "psql es el terminal interactivo de PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Empleo:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2443,35 +2436,30 @@ msgstr "" " psql [OPCIONES]... [BASE-DE-DATOS [USUARIO]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Opciones generales:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=ORDEN ejecutar sólo una orden (SQL o interna) y salir\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr "" " -d, --dbname=NOMBRE nombre de base de datos a conectarse\n" " (por omisión: «%s»)\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ARCHIVO ejecutar órdenes desde archivo, luego salir\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list listar bases de datos, luego salir\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2481,18 +2469,15 @@ msgstr "" " definir variable de psql NOMBRE a VALOR\n" " (p.ej. -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión, luego salir\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc no leer archivo de configuración (~/.psqlrc)\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2500,23 +2485,19 @@ msgstr "" " -1 («uno»), --single-transaction\n" " ejecuta órdenes en una única transacción\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=opcs] mostrar esta ayuda, luego salir\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands listar órdenes backslash, luego salir\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables listar variables especiales, luego salir\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2524,58 +2505,47 @@ msgstr "" "\n" "Opciones de entrada y salida:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all mostrar las órdenes del script\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors mostrar órdenes fallidas\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries mostrar órdenes enviadas al servidor\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden mostrar consultas generadas por órdenes internas\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=ARCH envía el registro de la sesión a un archivo\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline deshabilitar edición de línea de órdenes (readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=ARCHIVO enviar resultados de consultas a archivo (u |orden)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet modo silencioso (sin mensajes, sólo resultados)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step modo paso a paso (confirmar cada consulta)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line modo de líneas (fin de línea termina la orden SQL)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2583,17 +2553,15 @@ msgstr "" "\n" "Opciones de formato de salida:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align modo de salida desalineado\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv modo de salida de tabla CSV (valores separados por comas)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2602,18 +2570,15 @@ msgstr "" " -F, --field-separator=CADENA separador de campos para salida desalineada\n" " (por omisión: «%s»)\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html modo de salida en tablas HTML\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] definir opción de impresión VAR en ARG (ver orden \\pset)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2621,25 +2586,21 @@ msgstr "" " -R, --record-separator=CADENA separador de registros para salida desalineada\n" " (por omisión: salto de línea)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only sólo muestra registros\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" " -T, --table-attr=TEXTO\n" " definir atributos de marcas de tabla HTML (ancho, borde)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded activar modo expandido de salida de tablas\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2647,8 +2608,7 @@ msgstr "" " -z, --field-separator-zero\n" " definir separador de campos para salida desalineada al byte cero\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2656,8 +2616,7 @@ msgstr "" " -0, --record-separator-zero\n" " definir separador de filas para salida desalineada al byte cero\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2665,43 +2624,40 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -h, --host=NOMBRE nombre del anfitrión o directorio de socket\n" " (por omisión: «%s»)\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "socket local" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PUERTO puerto del servidor (por omisión: «%s»)\n" -#: help.c:137 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr "" " -U, --username=NOMBRE\n" " nombre de usuario (por omisión: «%s»)\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password forzar petición de contraseña\n" " (debería ser automático)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2715,507 +2671,456 @@ msgstr "" "en la documentación de PostgreSQL.\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Reporte de errores a <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "General\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright mostrar términos de uso y distribución de PostgreSQL\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUMNAS] ejecutar la consulta y desplegar en «crosstab»\n" +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr "" +" \\crosstabview [COLUMNAS]\n" +" ejecutar la consulta y desplegar en «crosstab»\n" -#: help.c:174 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose mostrar error más reciente en máxima verbosidad\n" -#: help.c:175 -#, c-format +#: help.c:195 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] ejecuta la consulta (y envía el resultado a un fichero o |pipe);\n" -" \\g sin argumentos es equivalente a un punto y coma\n" +" \\g [(OPTIONS)] [FILE]\n" +" ejecuta la consulta (y envía el resultado a un fichero o |pipe);\n" +" \\g sin argumentos es equivalente a un punto y coma\n" -#: help.c:177 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" -msgstr " \\gdesc describir resultado de la consulta, sin ejecutarla\n" +msgstr " \\gdesc describir resultado de la consulta, sin ejecutarla\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec ejecutar la consulta, luego ejecuta cada valor del resultado\n" -#: help.c:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" -" \\gset [PREFIJO] ejecutar la consulta y almacenar los resultados en variables\n" +" \\gset [PREFIJO] ejecutar la consulta y almacenar el resultado en variables\n" " de psql\n" -#: help.c:180 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\ gx [(OPTIONS)] [FILE] como \\g, pero fuerza el modo de salida expandido\n" +msgstr "" +" \\gx [(OPTIONS)] [FILE]\n" +" como \\g, pero fuerza el modo de salida expandido\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q salir de psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEGS] ejecutar consulta cada SEGS segundos\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Ayuda\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] desplegar ayuda sobre las órdenes backslash\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options desplegar ayuda sobre opciones de línea de órdenes\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables desplegar ayuda sobre variables especiales\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr "" " \\h [NOMBRE] mostrar ayuda de sintaxis de órdenes SQL;\n" " use «*» para todas las órdenes\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Búfer de consulta\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ARCHIVO] [LÍNEA]\n" " editar el búfer de consulta (o archivo) con editor externo\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [NOMBRE-FUNCIÓN [LÍNEA]]\n" " editar una función con editor externo\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [NOMBRE-VISTA [LÍNEA]]\n" " editar definición de una vista con editor externo\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p mostrar el contenido del búfer de consulta\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r reiniciar (limpiar) el búfer de consulta\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ARCHIVO] mostrar historial de órdenes o guardarlo en archivo\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ARCHIVO escribir búfer de consulta a archivo\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" -msgstr "Entrada/Salida\n" +msgstr "" +"Entrada/Salida\n" +" (con -n, donde existe, se omite el salto de línea final)\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" -msgstr " \\copy ... ejecutar orden SQL COPY con flujo de datos al cliente\n" +msgstr " \\copy ... ejecutar orden SQL COPY con flujo de datos al cliente\n" -#: help.c:207 -#, c-format +#: help.c:227 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" -msgstr " \\echo [-n] [STRING] escribe la cadena en la salida estándar (-n no genera el salto de línea final)\n" +msgstr " \\echo [-n] [STRING] escribe la cadena en la salida estándar\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" -msgstr " \\i ARCHIVO ejecutar órdenes desde archivo\n" +msgstr " \\i ARCHIVO ejecutar órdenes desde archivo\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid " \\ir FILE as \\i, but relative to location of current script\n" -msgstr " \\ir ARCHIVO como \\i, pero relativo a la ubicación del script actual\n" +msgstr " \\ir ARCHIVO como \\i, pero relativo a la ubicación del script actual\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" -msgstr " \\o [ARCHIVO] enviar resultados de consultas a archivo u |orden\n" +msgstr " \\o [ARCHIVO] enviar resultados de consultas a archivo u |orden\n" -#: help.c:211 -#, c-format +#: help.c:231 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" -msgstr " \\qecho [-n] [STRING] escribe la cadena hacia flujo de salida \\o (-n no genera el salto de línea final)\n" +msgstr " \\qecho [-n] [STRING] escribe la cadena hacia flujo de salida \\o\n" -#: help.c:212 -#, c-format +#: help.c:232 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" -msgstr " \\warn [-n] [STRING] escribe la cadena a la salida de error estándar (-n no genera el salto de línea final)\n" +msgstr " \\warn [-n] [STRING] escribe la cadena a la salida de error estándar\n" -#: help.c:215 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "Condicional\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPRESIÓN inicia bloque condicional\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR alternativa dentro del bloque condicional actual\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternativa final dentro del bloque condicional actual\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif termina el bloque condicional\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Informativo\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" -msgstr " (opciones: S = desplegar objectos de sistema, + = agregar más detalle)\n" +msgstr " (opciones: S = desplegar objetos de sistema, + = agregar más detalle)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] listar tablas, vistas y secuencias\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NOMBRE describir tabla, índice, secuencia o vista\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATRÓN] listar funciones de agregación\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATRÓN] listar métodos de acceso\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] listar las clases de operadores\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] listar las familias de operadores\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] listar los operadores de la familia de operadores\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] enumera las funciones de la familia de operadores\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATRÓN] listar tablespaces\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATRÓN] listar conversiones\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATRÓN] listar parámetros de configuración\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATRÓN] listar conversiones de tipo (casts)\n" -#: help.c:235 -#, c-format +#: help.c:256 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATRÓN] listar comentarios de objetos que no aparecen en otra parte\n" -#: help.c:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATRÓN] listar dominios\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATRÓN] listar privilegios por omisión\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATRÓN] listar tablas foráneas\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATRÓN] listar mapeos de usuario\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATRÓN] listar conectores de datos externos\n" -#: help.c:243 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" -" listar funciones [sólo ag./normal/proc./trigger/ventana]\n" +" listar funciones [sólo ag./normal/proc./trigger/ventana]\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATRÓN] listar configuraciones de búsqueda en texto\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATRÓN] listar diccionarios de búsqueda en texto\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATRÓN] listar analizadores (parsers) de búsq. en texto\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATRÓN] listar plantillas de búsqueda en texto\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATRÓN] listar roles\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATRÓN] listar índices\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl listar objetos grandes, lo mismo que \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] listar objetos grandes, lo mismo que \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATRÓN] listar lenguajes procedurales\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATRÓN] listar vistas materializadas\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATRÓN] listar esquemas\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" -" listar operadores\n" +" listar operadores\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S] [PATRÓN] listar ordenamientos (collations)\n" -#: help.c:258 -#, c-format +#: help.c:279 msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [PATRÓN] listar privilegios de acceso a tablas, vistas y secuencias\n" -#: help.c:259 -#, c-format +#: help.c:280 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[tin+] [PATRÓN] listar relaciones particionadas (sólo tablas/índices) [n=anidadas]\n" -#: help.c:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" -msgstr " \\drds [PATROL [PATBASE]] listar parámetros de rol por base de datos\n" +msgstr "" +" \\drds [PATRÓN_ROL [PATRÓN_BASE]]\n" +" listar parámetros de rol por base de datos\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATRÓN] listar publicaciones de replicación\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATRÓN] listar suscripciones de replicación\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATRÓN] listar secuencias\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATRÓN] listar tablas\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATRÓN] listar tipos de dato\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATRÓN] listar roles\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATRÓN] listar vistas\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATRÓN] listar extensiones\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATRÓN] listar estadísticas extendidas\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATRÓN] listar disparadores por eventos\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" -msgstr " \\l[+] [PATRÓN] listar bases de datos\n" +msgstr " \\l[+] [PATRÓN] listar bases de datos\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCIÓN mostrar la definición de una función\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VISTA mostrar la definición de una vista\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [PATRÓN] lo mismo que \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Objetos Grandes\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID ARCHIVO escribir objeto grande a archivo\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import ARCHIVO [COMENTARIO]\n" +" leer objeto grande desde archivo\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] listar objetos grandes\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID borrar un objeto grande\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Formato\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a cambiar entre modo de salida alineado y sin alinear\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [CADENA] definir título de tabla, o indefinir si es vacío\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [CADENA] mostrar o definir separador de campos para\n" " modo de salida sin alinear\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H cambiar modo de salida HTML (actualmente %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3227,32 +3132,34 @@ msgid "" msgstr "" " \\pset [NOMBRE [VALOR]] define opción de tabla de salida\n" " (border|columns|csv_fieldsep|expanded|fieldsep|fieldsep_zero|\n" -" footer|format|linestyle|null|numericlocale|pager|\n" -" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" -" tuples_only|unicode_border_linestyle|unicode_column_linestyle\n" -" |unicode_header_linestyle)\n" +" footer|format|linestyle|null|numericlocale|pager|\n" +" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" +" tuples_only|unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" -msgstr " \\t [on|off] mostrar sólo filas (actualmente %s)\n" +msgstr " \\t [on|off] mostrar sólo filas (actualmente %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" -msgstr " \\T [CADENA] definir atributos HTML de
, o indefinir si es vacío\n" +msgstr " \\T [CADENA] definir atributos HTML de
, o indefinir si es vacío\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] cambiar modo expandido (actualmente %s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Conexiones\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3261,8 +3168,7 @@ msgstr "" " \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n" " conectar a una nueva base de datos (actual: «%s»)\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3270,98 +3176,72 @@ msgstr "" " \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n" " conectar a una nueva base de datos (no hay conexión actual)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo despliega la información sobre la conexión actual\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr "" " \\encoding [CODIFICACIÓN]\n" " mostrar o definir codificación del cliente\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [USUARIO]\n" " cambiar la contraseña para un usuario en forma segura\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Sistema Operativo\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] cambiar el directorio de trabajo actual\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR obtener variable de ambiente\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr "" " \\setenv NOMBRE [VALOR]\n" " definir o indefinir variable de ambiente\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr "" " \\timing [on|off] mostrar tiempo de ejecución de órdenes\n" " (actualmente %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [ORDEN] ejecutar orden en intérprete de órdenes (shell),\n" " o iniciar intérprete interactivo\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Variables\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXTO] NOMBRE preguntar al usuario el valor de la variable\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr "" " \\set [NOMBRE [VALOR]] definir variables internas,\n" " listar todas si no se dan parámetros\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOMBRE indefinir (eliminar) variable interna\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Objetos Grandes\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID ARCHIVO\n" -" \\lo_import ARCHIVO [COMENTARIO]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID operaciones con objetos grandes\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3369,13 +3249,11 @@ msgstr "" "Lista de variables con tratamiento especial\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "variables psql:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3384,8 +3262,7 @@ msgstr "" " psql --set=NOMBRE=VALOR\n" " o \\set NOMBRE VALOR dentro de psql\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3393,8 +3270,7 @@ msgstr "" " AUTOCOMMIT si está definida, órdenes SQL exitosas se comprometen\n" " automáticamente\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3403,15 +3279,13 @@ msgstr "" " COMP_KEYWORD_CASE determina si usar mayúsculas al completar palabras SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" msgstr " DBNAME la base de datos actualmente conectada\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3420,8 +3294,7 @@ msgstr "" " ECHO controla qué entrada se escribe a la salida estándar\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3430,22 +3303,19 @@ msgstr "" " ECHO_HIDDEN muestra consultas internas usadas por órdenes backslash\n" " con «noexec» sólo las muestra sin ejecutarlas\n" -#: help.c:371 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" msgstr " ENCODING codificación actual del cliente\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" msgstr " ERROR verdadero si la última consulta falló; si no, falso\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3453,8 +3323,7 @@ msgstr "" " FETCH_COUNT número de filas del resultado que extraer y mostrar cada vez\n" " (por omisión: 0=sin límite)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3462,8 +3331,7 @@ msgstr "" " HIDE_TABLEAM\n" " ocultar métodos de acceso de tabla\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3471,8 +3339,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " ocultar métodos de compresión\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3480,29 +3347,25 @@ msgstr "" " HISTCONTROL controla la lista de historia de órdenes\n" " [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" msgstr " HISTFILE nombre de archivo para almacenar historia de órdenes\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" msgstr " HISTSIZE número de órdenes a guardar en la historia de órdenes\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" msgstr " HOST el servidor actualmente conectado\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3510,15 +3373,13 @@ msgstr "" " IGNOREEOF si no está definida, enviar un EOF a sesión interactiva\n" " termina la aplicación\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" msgstr " LASTOID el valor del último OID afectado\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3529,8 +3390,7 @@ msgstr "" " mensaje y SQLSTATE del último error, o cadena vacía y\n" " «00000» si no hubo\n" -#: help.c:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3538,29 +3398,25 @@ msgstr "" " ON_ERROR_ROLLBACK si está definido, un error no aborta la transacción\n" " (usa «savepoints» implícitos)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" msgstr " ON_ERROR_STOP detiene ejecución por lotes al ocurrir un error\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" msgstr " PORT puerto del servidor de la conexión actual\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" msgstr " PROMPT1 especifica el prompt estándar de psql\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3568,22 +3424,19 @@ msgstr "" " PROMPT2 especifica el prompt usado cuando una sentencia continúa\n" " de una línea anterior\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" msgstr " PROMPT3 especifica el prompt usado durante COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" msgstr " QUIET ejecuta silenciosamente (igual que -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3591,8 +3444,7 @@ msgstr "" " ROW_COUNT número de tuplas retornadas o afectadas por última\n" " consulta, o 0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3602,8 +3454,16 @@ msgstr "" " SERVER_VERSION_NUM\n" " versión del servidor (cadena corta o numérica)\n" -#: help.c:415 -#, c-format +#: help.c:453 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" mostrar todos los resultados de una consulta combinada (\\;) en lugar\n" +" de sólo mostrar el último\n" + +#: help.c:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3611,36 +3471,31 @@ msgstr "" " SHOW_CONTEXT controla el despliegue de campos de contexto de mensaje\n" " [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" msgstr " SINGLELINE fin de línea termina modo de órdenes SQL (igual que -S)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" msgstr " SINGLESTEP modo paso a paso (igual que -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" msgstr " SQLSTATE SQLSTATE de la última consulta, o «00000» si no hubo error\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" msgstr " USER el usuario actualmente conectado\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3648,8 +3503,7 @@ msgstr "" " VERBOSITY controla la verbosidad de errores [default, verbose,\n" " terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3661,8 +3515,7 @@ msgstr "" " VERSION_NUM\n" " versión de psql (cadena verbosa, corta o numérica)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3670,8 +3523,7 @@ msgstr "" "\n" "Parámetros de despliegue:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3681,28 +3533,25 @@ msgstr "" " o \\pset NOMBRE [VALOR] dentro de psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" msgstr " border estilo de borde (número)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" msgstr " columns define el ancho para formato «wrapped»\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" msgstr " expanded (o x) salida expandida [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3711,43 +3560,37 @@ msgstr "" " fieldsep separador de campos para formato «unaligned»\n" " (por omisión: «%s»)\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" msgstr " fieldsep_zero separador de campos en «unaligned» es byte cero\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" msgstr " footer activa o desactiva el pie de tabla [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" msgstr " format define el formato de salida [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" msgstr " linestyle define el estilo de dibujo de líneas [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" msgstr " null define la cadena a imprimirse para valores null\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3755,30 +3598,26 @@ msgstr "" " numericlocale activa despliegue de carácter específico del lenguaje para\n" " separar grupos de dígitos\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" msgstr " pager controla cuándo se usará un paginador externo [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" msgstr " recordsep separador de registros (líneas) para formato «unaligned»\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" msgstr " recordsep_zero separador de registros en «unaligned» es byte cero\n" # XXX WTF does this mean? -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3788,22 +3627,19 @@ msgstr "" " o ancho proporcional de columnas alineadas a la izquierda\n" " en formato «latex-longtable»\n" -#: help.c:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" msgstr " title define el título de tablas\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" msgstr " tuples_only si está definido, sólo los datos de la tabla se muestran\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3815,8 +3651,7 @@ msgstr "" " unicode_header_linestyle\n" " define el estilo de líneas Unicode [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3824,8 +3659,7 @@ msgstr "" "\n" "Variables de ambiente:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3834,8 +3668,7 @@ msgstr "" " NOMBRE=VALOR [NOMBRE=VALOR] psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3846,64 +3679,55 @@ msgstr "" " psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" msgstr " COLUMNS número de columnas para formato «wrapped»\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" msgstr " PGAPPNAME igual que el parámetro de conexión application_name\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" -msgstr " PGDATABASE igual que el parámetro de conexión dbname\n" +msgstr " PGDATABASE igual que el parámetro de conexión dbname\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" msgstr " PGHOST igual que el parámetro de conexión host\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" msgstr " PGPASSFILE nombre de archivo de contraseñas\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" msgstr " PGPASSWORD contraseña de la conexión (no recomendado)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" msgstr " PGPORT igual que el parámetro de conexión port\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" msgstr " PGUSER igual que el parámetro de conexión user\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3911,8 +3735,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor usado por órdenes \\e, \\ef, y \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3920,46 +3743,47 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARGS\n" " cómo especificar número de línea al invocar al editor\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" msgstr " PSQL_HISTORY ubicación alternativa del archivo de historia de órdenes\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" msgstr " PSQL_PAGER, PAGER nombre de programa paginador externo\n" -#: help.c:508 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr " PSQL_WATCH_PAGER paginador externo para usar con \\watch\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" msgstr " PSQLRC ubicación alternativa para el archivo .psqlrc del usuario\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" msgstr " SHELL intérprete usado por la orden \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" msgstr " TMPDIR directorio para archivos temporales\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Ayuda disponible:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -3978,7 +3802,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3992,12 +3816,12 @@ msgstr "" msgid "could not read from input file: %m" msgstr "no se pudo leer el archivo de entrada: %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 "no se pudo guardar historial a archivo «%s»: %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "el historial de órdenes no está soportado en esta instalación" @@ -4017,25 +3841,17 @@ msgstr "%s: transacción en curso está abortada" msgid "%s: unknown transaction status" msgstr "%s: estado de transacción desconocido" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "Objetos grandes" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if: escapado" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Use «\\q» para salir de %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" @@ -4043,19 +3859,19 @@ msgstr "" "La entrada es un dump de PostgreSQL en formato custom.\n" "Use el programa pg_restore para restaurar este dump a una base de datos.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "Use \\? para ayuda o presione control-C para limpiar el búfer de entrada." -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "Digite \\? para obtener ayuda." -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "Está usando psql, la interfaz de línea de órdenes de PostgreSQL." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4070,24 +3886,24 @@ msgstr "" " \\g o punto y coma («;») para ejecutar la consulta\n" " \\q para salir\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "Use \\q para salir." -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "Use control-D para salir." -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "Use control-C para salir." -#: 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 "consulta ignorada; use \\endif o Ctrl-C para salir del bloque \\if actual" -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "se alcanzó EOF sin encontrar el/los \\endif de cierre" @@ -4104,2317 +3920,2427 @@ msgstr "%s: memoria agotada" #: 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "nombre" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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 "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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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 "nuevo_esquema" -#: sql_help.c:44 sql_help.c:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "tipo_arg" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "opción" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "donde opción puede ser:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "límite_conexiones" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "esplantilla" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "nuevo_tablespace" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 msgid "value" msgstr "valor" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "rol_destino" -#: sql_help.c:198 sql_help.c:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 msgid "schema_name" msgstr "nombre_de_esquema" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "grant_o_revoke_abreviado" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "nombre_de_rol" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 msgid "expression" msgstr "expresión" -#: sql_help.c:239 +#: sql_help.c:242 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "nombre_restricción" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nuevo_nombre_restricción" -#: sql_help.c:317 sql_help.c:1082 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "nueva_versión" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "objeto_miembro" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "dondo objeto_miembro es:" -#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "nombre_de_objeto" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "nombre_función_agregación" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "tipo_fuente" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "tipo_destino" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "nombre_de_función" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "nombre_operador" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "tipo_izq" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "tipo_der" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "método_de_índice" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "nombre_de_procedimiento" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "nombre_de_rutina" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "nombre_de_tipo" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 msgid "lang_name" msgstr "nombre_lenguaje" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "y signatura_func_agregación es:" -#: sql_help.c:392 sql_help.c:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "función_manejadora" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "función_validadora" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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 "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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "nombre_de_columna" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "nuevo_nombre_de_columna" -#: sql_help.c:449 sql_help.c:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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 "donde acción es una de:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "tipo_de_dato" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "ordenamiento" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "restricción_de_columna" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "entero" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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 "opción_de_atributo" -#: sql_help.c:473 sql_help.c:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 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:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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 "nombre_disparador" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "tabla_padre" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "nombre_de_extensión" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "costo_de_ejecución" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "núm_de_filas" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "función_de_soporte" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "especificación_de_rol" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "nombre_de_usuario" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "donde especificación_de_rol puede ser:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "nombre_de_grupo" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "nombre_de_tablespace" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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 "nombre_índice" -#: sql_help.c:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "parámetro_de_almacenamiento" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "número_de_columna" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "oid_de_objeto_grande" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "método_de_compresión" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "nuevo_método_de_acceso" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "proc_res" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "proc_join" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "número_de_estrategia" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "tipo_op" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "nombre_familia_ordenamiento" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "número_de_soporte" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "tipo_argumento" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "nombre_de_tabla" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "expresión_using" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "expresión_check" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "objeto_de_publicación" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "parámetro_de_publicación" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "donde objeto_de_publicación es uno de:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "contraseña" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "fecha_hora" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "nombre_de_base_de_datos" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "incremento" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "valormin" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "valormax" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "inicio" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "reinicio" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "cache" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "nuevo_valor" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "nombre_de_publicación" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "opción_de_publicación" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "opción_refresh" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "parámetro_de_suscripción" -#: sql_help.c:1298 sql_help.c:1301 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "opción_skip" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "nombre_de_partición" -#: sql_help.c:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "borde_de_partición" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "opciones_de_secuencia" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "opción_de_secuencia" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "restricción_de_tabla_con_índice" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "nombre_regla_de_reescritura" -#: sql_help.c:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "y borde_de_partición es:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "expresión_de_borde_de_partición" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "literal_numérico" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "expr_por_omisión" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "expr_de_generación" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "parámetros_de_índice" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "tabla_ref" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "columna_ref" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "acción_referencial" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "y restricción_de_tabla es:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "elemento_de_exclusión" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "operador" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "predicado" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "y restricción_de_tabla_con_índice es:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 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:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "elemento_de_exclusión en una restricción EXCLUDE es:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "clase_de_ops" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "acción_referencial en una restricción FOREIGN KEY/REFERENCES es:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 msgid "tablespace_option" msgstr "opción_de_tablespace" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "tipo_de_token" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "nombre_diccionario" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "diccionario_antiguo" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "diccionario_nuevo" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "nombre_atributo" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nuevo_nombre_atributo" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nuevo_valor_enum" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "valor_enum_vecino" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "valor_enum_existente" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "propiedad" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "nombre_de_servidor" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "nombre_opción_de_vista" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "valor_opción_de_vista" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "tabla_y_columnas" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "donde opción puede ser una de:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "booleano" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "y tabla_y_columnas es:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "modo_de_transacción" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "donde modo_de_transacción es uno de:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "argumento" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "nombre_relación" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "nombre_de_dominio" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "nombre_de_política" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "nombre_regla" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "literal_de_cadena" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "id_de_transacción" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "nombre_de_archivo" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "orden" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "condición" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "consulta" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "nombre_de_formato" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "carácter_delimitador" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "cadena_null" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "carácter_de_comilla" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "carácter_de_escape" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "nombre_codificación" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "tipo_de_método_de_acceso" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "tipo_de_dato_arg" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "func_transición" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "tipo_de_dato_de_estado" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "tamaño_de_dato_de_estado" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "func_final" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "func_combinación" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "func_serial" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "func_deserial" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "condición_inicial" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "func_transición_m" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "func_inv_m" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "tipo_de_dato_de_estado_m" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "tamaño_de_dato_de_estado_m" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "func_final_m" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "condición_inicial_m" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "operador_de_ordenamiento" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "o la sintaxis antigua" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "tipo_base" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "configuración regional" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "proveedor" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "versión" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "ordenamiento_existente" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "codificación_origen" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "codificación_destino" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "plantilla" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "codificación" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "estrategia" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "locale_icu" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "proveedor_locale" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "versión_ordenamiento" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "restricción" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "donde restricción es:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "evento" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "variable_de_filtrado" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "valor_de_filtrado" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "tipo_ret" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "tipo_columna" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "definición" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "archivo_obj" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "símbolo_enlace" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "contenido_sql" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "método" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "parámetro_opclass" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "manejador_de_llamada" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "manejador_en_línea" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "función_val" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "op_conm" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "op_neg" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "nombre_familia" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "tipo_almacenamiento" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "donde evento puede ser una de:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "elemento_de_esquema" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "tipo_de_servidor" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "versión_de_servidor" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "nombre_fdw" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "nombre_de_estadística" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "tipo_de_estadística" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "nombre_de_suscripción" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "tabla_origen" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "opción_de_like" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "y opción_de_like es:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "directorio" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "nombre_de_parser" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "config_origen" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "función_inicio" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "función_gettoken" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "función_fin" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "función_lextypes" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "función_headline" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "función_init" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "función_lexize" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "nombre_de_función_from" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "nombre_de_función_to" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "nombre_tabla_referenciada" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "nombre_de_relación_de_transición" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "argumentos" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "etiqueta" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "subtipo" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "clase_de_operador_del_subtipo" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "función_canónica" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "función_diff_del_subtipo" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "nombre_de_tipo_de_multirango" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "función_entrada" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "función_salida" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "función_receive" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "función_send" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "función_entrada_del_modificador_de_tipo" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "función_salida_del_modificador_de_tipo" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "función_analyze" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "función_de_subíndice" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "largo_interno" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "alineamiento" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "almacenamiento" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "como_tipo" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "categoría" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "preferido" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "valor_por_omisión" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "elemento" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "delimitador" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "ordenable" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "consulta_with" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "alias" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "item_de_from" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "nombre_de_cursor" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "expresión_de_salida" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "nombre_de_salida" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "código" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "parámetro" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "sentencia" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "dirección" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "donde dirección puede ser una de:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "cantidad" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "nombre_secuencia" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "nombre_arg" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "tipo_arg" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "loid" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" -msgstr "schema_remoto" +msgstr "esquema_remoto" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" -msgstr "schema_local" +msgstr "esquema_local" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "destino_de_conflict" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "acción_de_conflict" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "donde destino_de_conflict puede ser uno de:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "nombre_de_columna_de_índice" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "expresión_de_índice" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "predicado_de_índice" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "donde acción_de_conflict es una de:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "canal" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "modo_bloqueo" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "donde modo_bloqueo es uno de:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "nombre_de_tabla_destino" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "alias_de_destino" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "origin_de_datos" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "condición_de_join" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "cláusula_when" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "donde origen_de_datos es:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "nombre_tabla_origen" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "consulta_origen" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "alias_origen" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "y cláusula_when es:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "update_de_merge" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "delete_de_merge" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "insert_de_merge" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "y insert_de_merge es:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "y update_de_merge es:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "y delete_de_merge es:" + +#: sql_help.c:4132 msgid "payload" msgstr "carga" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "rol_antiguo" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "rol_nuevo" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "nombre_de_savepoint" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "elemento_agrupante" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "nombre_de_ventana" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "definición_de_ventana" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "select" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "donde item_de_from puede ser uno de:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "alias_de_columna" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "método_de_sampleo" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "semilla" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "nombre_consulta_with" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "definición_de_columna" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "tipo_de_join" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "condición_de_join" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "columna_de_join" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "join_con_alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "donde elemento_agrupante puede ser una de:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "y consulta_with es:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "valores" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "insert" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "update" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "delete" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "nombre_col_para_sec_de_búsqueda" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "nombre_col_para_marca_de_ciclo" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "valor_marca_de_ciclo" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "valor_predet_marca_de_ciclo" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "nombre_col_para_ruta_de_ciclo" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "nueva_tabla" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "id_de_snapshot" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "expresión_orden" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "aborta la transacción en curso" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "cambia la definición de una función de agregación" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "cambia la definición de un ordenamiento" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "cambia la definición de una conversión" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "cambia una base de datos" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "define privilegios de acceso por omisión" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "cambia la definición de un dominio" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "cambia la definición de un disparador por evento" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "cambia la definición de una extensión" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "cambia la definición de un conector de datos externos" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "cambia la definición de una tabla foránea" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "cambia la definición de una función" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "cambiar nombre del rol o membresía" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "cambia la definición de un índice" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "cambia la definición de un lenguaje procedural" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "cambia la definición de un objeto grande" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "cambia la definición de una vista materializada" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "cambia la definición de un operador" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "cambia la definición de una clase de operadores" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "cambia la definición de una familia de operadores" -#: sql_help.c:5113 +#: sql_help.c:5248 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:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "cambia la definición de un procedimiento" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "cambia la definición de una publicación" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "cambia un rol de la base de datos" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "cambia la definición de una rutina" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "cambia la definición de una regla" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "cambia la definición de un esquema" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "cambia la definición de un generador secuencial" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "cambia la definición de un servidor foráneo" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "cambia la definición de un objeto de estadísticas extendidas" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "cambia la definición de una suscripción" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "cambia un parámetro de configuración del servidor" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "cambia la definición de una tabla" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "cambia la definición de un tablespace" -#: sql_help.c:5197 +#: sql_help.c:5332 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:5203 +#: sql_help.c:5338 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:5209 +#: sql_help.c:5344 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:5215 +#: sql_help.c:5350 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:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "cambia la definición de un disparador" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "cambia la definición de un tipo" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "cambia la definición de un mapeo de usuario" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "cambia la definición de una vista" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "recolecta estadísticas sobre una base de datos" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "inicia un bloque de transacción" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "invocar un procedimiento" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "fuerza un checkpoint de wal" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "cierra un cursor" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "reordena una tabla siguiendo un índice" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "define o cambia un comentario sobre un objeto" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "compromete la transacción en curso" -#: sql_help.c:5299 +#: sql_help.c:5434 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:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "copia datos entre un archivo y una tabla" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "define un nuevo método de acceso" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "define una nueva función de agregación" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "define una nueva conversión de tipo" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "define un nuevo ordenamiento" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "define una nueva conversión de codificación" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "crea una nueva base de datos" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "define un nuevo dominio" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "define un nuevo disparador por evento" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "instala una extensión" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "define un nuevo conector de datos externos" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "define una nueva tabla foránea" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "define una nueva función" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "define un nuevo rol de la base de datos" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "define un nuevo índice" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "define un nuevo lenguaje procedural" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "define una nueva vista materializada" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "define un nuevo operador" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "define una nueva clase de operadores" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "define una nueva familia de operadores" -#: sql_help.c:5425 +#: sql_help.c:5560 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:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "define un nuevo procedimiento" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "define una nueva publicación" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "define una nueva regla de reescritura" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" -msgstr "define un nuevo schema" +msgstr "define un nuevo esquema" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "define un nuevo generador secuencial" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "define un nuevo servidor foráneo" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "define estadísticas extendidas" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "define una nueva suscripción" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "define una nueva tabla" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 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:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "define un nuevo tablespace" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "define una nueva configuración de búsqueda en texto" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "define un nuevo diccionario de búsqueda en texto" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "define un nuevo analizador de búsqueda en texto" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "define una nueva plantilla de búsqueda en texto" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "define una nueva transformación" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "define un nuevo disparador" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "define un nuevo tipo de datos" -#: sql_help.c:5551 +#: sql_help.c:5686 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:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "define una nueva vista" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "elimina una sentencia preparada" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "define un nuevo cursor" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "elimina filas de una tabla" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "descartar datos de la sesión" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "ejecutar un bloque anónimo de código" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "elimina un método de acceso" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "elimina una función de agregación" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "elimina una conversión de tipo" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "elimina un ordenamiento" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "elimina una conversión de codificación" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "elimina una base de datos" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "elimina un dominio" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "elimina un disparador por evento" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "elimina una extensión" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "elimina un conector de datos externos" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "elimina una tabla foránea" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "elimina una función" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "elimina un rol de base de datos" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "elimina un índice" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "elimina un lenguaje procedural" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "elimina una vista materializada" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "elimina un operador" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "elimina una clase de operadores" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "elimina una familia de operadores" -#: sql_help.c:5707 +#: sql_help.c:5842 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:5713 +#: sql_help.c:5848 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:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "elimina un procedimiento" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "elimina una publicación" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "elimina una rutina" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "elimina una regla de reescritura" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" -msgstr "elimina un schema" +msgstr "elimina un esquema" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "elimina un generador secuencial" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "elimina un descriptor de servidor foráneo" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "elimina estadísticas extendidas" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "elimina una suscripción" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "elimina una tabla" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "elimina un tablespace" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "elimina una configuración de búsqueda en texto" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "elimina un diccionario de búsqueda en texto" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "elimina un analizador de búsqueda en texto" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "elimina una plantilla de búsqueda en texto" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "elimina una transformación" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "elimina un disparador" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "elimina un tipo de datos" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "elimina un mapeo de usuario para un servidor remoto" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "elimina una vista" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "ejecuta una sentencia preparada" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "muestra el plan de ejecución de una sentencia" -#: sql_help.c:5869 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" msgstr "recupera filas de una consulta usando un cursor" -#: sql_help.c:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "define privilegios de acceso" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "importa definiciones de tablas desde un servidor foráneo" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "crea nuevas filas en una tabla" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "escucha notificaciones" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "carga un archivo de biblioteca compartida" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "bloquea una tabla" -#: sql_help.c:5911 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "condicionalmente inserta, actualiza o elimina filas de una tabla" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "reposiciona un cursor" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "genera una notificación" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "prepara una sentencia para ejecución" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "prepara la transacción actual para two-phase commit" -#: sql_help.c:5935 +#: sql_help.c:6076 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:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "reemplaza los contenidos de una vista materializada" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "reconstruye índices" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "destruye un savepoint previamente definido" -#: sql_help.c:5959 +#: sql_help.c:6100 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:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "revoca privilegios de acceso" -#: sql_help.c:5977 +#: sql_help.c:6118 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:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "descartar hacia un savepoint" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "define un nuevo savepoint en la transacción en curso" -#: sql_help.c:5995 +#: sql_help.c:6136 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:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "recupera filas desde una tabla o vista" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "cambia un parámetro de configuración" -#: sql_help.c:6019 +#: sql_help.c:6160 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:6025 +#: sql_help.c:6166 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:6031 +#: sql_help.c:6172 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:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "define las características de la transacción en curso" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "muestra el valor de un parámetro de configuración" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "vacía una tabla o conjunto de tablas" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "deja de escuchar una notificación" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "actualiza filas de una tabla" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "recolecta basura y opcionalmente estadísticas sobre una base de datos" -#: sql_help.c:6085 +#: sql_help.c:6226 msgid "compute a set of rows" msgstr "calcula un conjunto de registros" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 sólo puede ser usado en modo no interactivo" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "no se pudo abrir el archivo de registro «%s»: %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6423,27 +6349,27 @@ msgstr "" "Digite «help» para obtener ayuda.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "no se pudo definir parámetro de impresión «%s»" -#: startup.c:699 +#: startup.c:719 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Use «%s --help» para obtener más información.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Pruebe «%s --help» para mayor información." -#: startup.c:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "se ignoró argumento extra «%s» en línea de órdenes" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "no se pudo encontrar el ejecutable propio" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/third_party/spanner_pg/src/bin/psql/po/fr.po b/third_party/spanner_pg/src/bin/psql/po/fr.po index 296ac32c..27003b22 100644 --- a/third_party/spanner_pg/src/bin/psql/po/fr.po +++ b/third_party/spanner_pg/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: 2023-02-04 07:46+0000\n" -"PO-Revision-Date: 2023-02-05 17:28+0100\n" +"POT-Creation-Date: 2023-02-03 22:46+0000\n" +"PO-Revision-Date: 2023-02-05 17:29+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -20,59 +22,64 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.2.2\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../common/exec.c:141 ../../common/exec.c:258 ../../common/exec.c:304 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:301 +#, 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:160 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "binaire « %s » invalide" -#: ../../common/exec.c:210 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "n'a pas pu lire le binaire « %s »" -#: ../../common/exec.c:218 +#: ../../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:274 ../../common/exec.c:313 +#: ../../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:291 +#: ../../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:414 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:527 ../../common/exec.c:572 ../../common/exec.c:664 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "mémoire épuisée" @@ -93,7 +100,7 @@ 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:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" @@ -140,307 +147,298 @@ msgstr "Requête d'annulation envoyée\n" 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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../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:229 +#: ../../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:232 #, c-format msgid "invalid command \\%s" msgstr "commande \\%s invalide" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Essayez \\? pour l'aide." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s : argument « %s » supplémentaire ignoré" -#: command.c:301 +#: command.c:304 #, 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:562 +#: command.c:573 #, 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:580 +#: command.c:592 #, 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:605 +#: command.c:617 #, 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:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "aucun tampon de requête" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "numéro de ligne invalide : %s" -#: command.c:1111 -#, 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:1114 -#, 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:1198 +#: command.c:1203 msgid "No changes" msgstr "Aucun changement" -#: command.c:1277 +#: command.c:1282 #, 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:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Il n'y a pas d'erreur précédente." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: parenthèse droite manquante" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s : argument requis manquant" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif : ne peut pas survenir après \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif : pas de \\if correspondant" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else : ne peut pas survenir après \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else : pas de \\if correspondant" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif : pas de \\if correspondant" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Le tampon de requête est vide." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Saisir le nouveau mot de passe de l'utilisateur « %s » : " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Saisir le mot de passe à nouveau : " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Les mots de passe ne sont pas identiques." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s : n'a pas pu lire la valeur pour la variable" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Le tampon de requête a été effacé." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Historique sauvegardé dans le fichier « %s ».\n" -#: command.c:2356 +#: command.c:2420 #, 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:2408 -#, 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:2411 -#, 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:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "le nom de la fonction est requis" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "le nom de la vue est requis" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Chronométrage activé." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Chronométrage désactivé." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Mot de passe : " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Mot de passe pour l'utilisateur %s : " -#: command.c:3106 +#: command.c:3168 #, 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:3141 +#: command.c:3203 #, 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:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Connexion précédente conservée" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect : %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, 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:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, serveur %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -449,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:3608 +#: command.c:3680 #, 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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "inconnu" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "désactivé" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "activé" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "connexion chiffrée avec GSSAPI\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -483,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:3751 +#: command.c:3822 #, 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:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "n'a pas pu exécuter l'éditeur « %s »" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "n'a pas pu exécuter /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "n'a pas pu localiser le répertoire temporaire : %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m" -#: command.c:4195 +#: command.c:4266 #, 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:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, 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:4249 +#: command.c:4320 #, 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:4264 +#: command.c:4335 #, 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:4279 +#: command.c:4350 #, 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:4322 +#: command.c:4393 #, 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:4327 +#: command.c:4398 #, 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:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset : option inconnue : %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Le style de bordure est %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "La largeur cible n'est pas configuré.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "La largeur cible est %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Affichage étendu activé.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "L'affichage étendu est utilisé automatiquement.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Affichage étendu désactivé.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Le séparateur de champs pour un CSV est « %s ».\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Le séparateur de champs est l'octet zéro.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Le séparateur de champs est « %s ».\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Le bas de page pas défaut est activé.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Le bas de page par défaut est désactivé.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Le format de sortie est %s.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Le style de ligne est %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "L'affichage de null est « %s ».\n" -#: command.c:4561 +#: command.c:4632 #, 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:4563 +#: command.c:4634 #, 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:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Le paginateur est utilisé pour les affichages longs.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Le paginateur est toujours utilisé.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "L'utilisation du paginateur est désactivé.\n" -#: command.c:4580 +#: command.c:4651 #, 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:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Le séparateur d'enregistrements est l'octet zéro.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Le séparateur d'enregistrement est .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Le séparateur d'enregistrements est « %s ».\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Les attributs de la table sont « %s ».\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Les attributs de la table ne sont pas définis.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Le titre est « %s ».\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Le titre n'est pas défini.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "L'affichage des tuples seuls est activé.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "L'affichage des tuples seuls est désactivé.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Le style de bordure Unicode est « %s ».\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Le style de ligne Unicode est « %s ».\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Le style d'en-tête Unicode est « %s ».\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\! : échec" -#: command.c:4904 common.c:652 +#: command.c:4984 #, 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:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "n'a pas pu configurer le chronomètre : %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (chaque %gs)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (chaque %gs)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "n'a pas pu attendre le signal : %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -748,121 +756,111 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "« %s.%s » n'est pas une vue" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "n'a pas pu analyser le tableau reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "ne peut mettre entre guillemets sans connexion active" -#: common.c:200 +#: common.c:207 #, 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:311 #, c-format msgid "connection to server was lost" msgstr "la connexion au serveur a été perdue" -#: common.c:308 +#: common.c:315 #, 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:320 #, c-format msgid "Failed.\n" msgstr "Échec.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Succès.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus inattendu : %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Temps : %.3f ms\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, 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:542 #, 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 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, 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:654 #, 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:657 #, 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:688 #, 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:708 #, c-format msgid "no rows returned for \\gset" msgstr "aucune ligne retournée pour \\gset" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "plus d'une ligne retournée pour \\gset" -#: common.c:791 +#: common.c:731 #, 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:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -873,33 +871,28 @@ 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:1126 #, c-format msgid "STATEMENT: %s" msgstr "INSTRUCTION : %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "état de la transaction inattendu (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Colonne" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Type" -#: common.c:1564 +#: common.c:1353 #, 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" @@ -966,11 +959,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" @@ -1019,1147 +1012,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:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Schéma" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Nom" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Type de données du résultat" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Type de données des paramètres" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Description" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Liste des fonctions d'agrégation" -#: describe.c:169 +#: describe.c:153 #, 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:184 +#: describe.c:168 msgid "Index" msgstr "Index" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Table" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Gestionnaire" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Liste des méthodes d'accès" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Le serveur (version %s) ne supporte pas les tablespaces." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Propriétaire" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Emplacement" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Options" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Taille" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Liste des tablespaces" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df ne prend que [anptwS+] comme options" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "agg" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "window" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "proc" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "func" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "trigger" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "immutable" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "stable" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "volatile" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Volatibilité" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "restricted" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "safe" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "unsafe" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Parallèle" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "definer" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "invoker" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Sécurité" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Langage" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Code source" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Liste des fonctions" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Nom interne" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Éléments" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Liste des types de données" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Type de l'arg. gauche" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Type de l'arg. droit" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Type du résultat" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Fonction" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Liste des opérateurs" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Encodage" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Collationnement" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Type caract." -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "Locale ICU" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Fournisseur de locale" + +#: describe.c:964 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Liste des bases de données" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "table" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "vue" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "vue matérialisée" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "séquence" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "table distante" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "table partitionnée" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Droits d'accès à la colonne" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Politiques" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Droits d'accès" -#: describe.c:1293 -#, 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:1313 +#: describe.c:1188 msgid "function" msgstr "fonction" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "type" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "schéma" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Droits d'accès par défaut" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Objet" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "contrainte de table" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "contrainte de domaine" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "classe d'opérateur" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "famille d'opérateur" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "règle" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Descriptions des objets" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Aucune relation nommée « %s » n'a été trouvée." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Aucune relation n'a été trouvée." -#: describe.c:1869 +#: describe.c:1678 #, 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:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Début" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Minimum" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Maximum" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Incrément" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "oui" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "non" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Cycles ?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Cache" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Propriétaire : %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Séquence pour la colonne d'identité : %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Séquence non journalisée « %s.%s »" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Séquence « %s.%s »" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Table non tracée « %s.%s »" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Table « %s.%s »" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Vue « %s.%s »" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vue matérialisée non journalisée « %s.%s »" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vue matérialisée « %s.%s »" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Index non tracé « %s.%s »" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Index « %s.%s »" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Index partitionné non journalisé « %s.%s »" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Index partitionné « %s.%s »" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Relation spéciale « %s.%s »" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Table TOAST « %s.%s »" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Type composé « %s.%s »" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Table distante « %s.%s »" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Table non journalisée « %s.%s »" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Table partitionnée « %s.%s »" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Collationnement" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "NULL-able" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Par défaut" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Clé ?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Définition" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Options FDW" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Stockage" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Compression" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Cible de statistiques" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition de : %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Aucune contrainte de partition" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Contrainte de partition : %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Clé de partition : %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Table propriétaire : « %s.%s »" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "clé primaire, " -#: describe.c:2514 -msgid "unique, " -msgstr "unique, " +#: describe.c:2312 +msgid "unique" +msgstr "unique" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls non distincts" + +#: describe.c:2315 +msgid ", " +msgstr " , " -#: describe.c:2520 +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "pour la table « %s.%s »" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", prédicat (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", en cluster" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", invalide" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", déferrable" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", initialement déferré" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", identité réplica" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Index :" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Contraintes de vérification :" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Contraintes de clés étrangères :" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Référencé par :" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Politiques :" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Politiques (mode sécurité de ligne activé en forcé) :" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé) : (aucune)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé en forcé) : (aucune)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Politiques (mode sécurité de ligne désactivé) :" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Objets statistiques :" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Règles :" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Règles désactivées :" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Règles toujous activées :" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Règles activées uniquement sur le réplica :" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Publications :" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Définition de la vue :" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Triggers :" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Triggers utilisateurs désactivés :" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Triggers désactivés :" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Triggers internes désactivés :" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Triggers toujours activés :" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Triggers activés uniquement sur le réplica :" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Serveur : %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "Options FDW : (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Hérite de" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Nombre de partitions : %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Nombre de partitions : %d (utilisez \\d+ pour les lister)" -#: describe.c:3619 +#: describe.c:3424 #, 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:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Tables enfant" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Partitions" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Table de type : %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Identité de réplicat" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Contient des OID : oui" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Méthode d'accès : %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", tablespace « %s »" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Liste des rôles" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Nom du rôle" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Attributs" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Membre de" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Superutilisateur" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Pas d'héritage" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Créer un rôle" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Créer une base" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "Ne peut pas se connecter" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Réplication" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Contournement RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Sans connexions" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d connexion" msgstr[1] "%d connexions" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Mot de passe valide jusqu'à " -#: describe.c:3991 -#, 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:4004 +#: describe.c:3777 msgid "Role" msgstr "Rôle" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "Base de données" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Réglages" -#: describe.c:4030 +#: describe.c:3803 #, 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:4033 +#: describe.c:3806 #, 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:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Aucune configuration n'a été trouvée." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Liste des paramètres" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "index" -#: describe.c:4115 -msgid "special" -msgstr "spécial" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "Table TOAST" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "index partitionné" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "permanent" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "temporaire" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "non journalisé" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Persistence" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Méthode d'accès" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Liste des relations" -#: describe.c:4305 +#: describe.c:4063 #, 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:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Liste des index partitionnés" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Liste des tables partitionnées" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Liste des relations partitionnées" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Nom du parent" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Taille de la partition de dernier niveau" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Taille totale" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "De confiance" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Langage interne" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Gestionnaire d'appel" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Validateur" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Gestionnaire en ligne" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Liste des langages" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Vérification" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Liste des domaines" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Source" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Destination" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Par défaut ?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Liste des conversions" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Paramètre" + +#: describe.c:4498 +msgid "Value" +msgstr "Valeur" + +#: describe.c:4505 +msgid "Context" +msgstr "Contexte" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Liste des paramètres de configuration" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Liste des paramètres de configuration à valeur personnalisée" + +#: describe.c:4567 +#, 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:4587 msgid "Event" msgstr "Événement" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "activé" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "réplicat" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "toujours" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "désactivé" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Activé" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Tags" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Liste des triggers sur évènement" -#: describe.c:4804 +#: describe.c:4646 #, 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:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Dépendances" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Liste des statistiques étendues" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Type source" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Type cible" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "assigné" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Implicite ?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Liste des conversions explicites" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Le serveur (version %s) ne supporte pas les collationnements." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Fournisseur" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Déterministe ?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Liste des collationnements" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Liste des schémas" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, 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:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Liste des analyseurs de la recherche de texte" -#: describe.c:5264 +#: describe.c:5167 #, 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:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Aucun analyseur de recherche de texte n'a été trouvé." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Début de l'analyse" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Méthode" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Obtenir le prochain jeton" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Fin de l'analyse" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Obtenir l'en-tête" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Obtenir les types de jeton" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analyseur « %s.%s » de la recherche de texte" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Analyseur « %s » de la recherche de texte" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Nom du jeton" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Types de jeton pour l'analyseur « %s.%s »" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Types de jeton pour l'analyseur « %s »" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Modèle" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Options d'initialisation" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Liste des dictionnaires de la recherche de texte" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Initialisation" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Lexize" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Liste des modèles de la recherche de texte" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Liste des configurations de la recherche de texte" -#: describe.c:5662 +#: describe.c:5550 #, 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:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Aucune configuration de recherche de texte n'a été trouvée." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Jeton" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Dictionnaires" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configuration « %s.%s » de la recherche de texte" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configuration « %s » de la recherche de texte" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2168,7 +2167,7 @@ msgstr "" "\n" "Analyseur : « %s.%s »" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2177,255 +2176,253 @@ msgstr "" "\n" "Analyseur : « %s »" -#: describe.c:5787 -#, 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:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Liste des wrappers de données distantes" -#: describe.c:5872 -#, 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:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Wrapper des données distantes" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Version" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Liste des serveurs distants" -#: describe.c:5956 -#, 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:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Serveur" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Nom de l'utilisateur" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Liste des correspondances utilisateurs" -#: describe.c:6019 -#, 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:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Liste des tables distantes" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Le serveur (version %s) ne supporte pas les extensions." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Liste des extensions installées" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Aucune extension nommée « %s » n'a été trouvée." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Aucune extension n'a été trouvée." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Description d'objet" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objets dans l'extension « %s »" -#: describe.c:6286 +#: describe.c:6126 #, 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:6301 +#: describe.c:6140 #, 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:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Le serveur (version %s) ne supporte pas les publications." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Toutes les tables" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Insertions" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Mises à jour" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Suppressions" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Tronque" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Via la racine" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Liste des publications" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Aucune publication nommée « %s » n'a été trouvée." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Aucune publication n'a été trouvée." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Publication %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Tables :" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Tables des schémas :" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Le serveur (version %s) ne supporte pas les souscriptions." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Publication" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Binaire" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Flux" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Commit en deux phases" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Désactiver en cas d'erreur" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Validation synchrone" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Informations de connexion" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Ignore LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Liste des souscriptions" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "AM" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Type en entrée" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Type de stockage" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Classe d'opérateur" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Famille d'opérateur" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Liste des classes d'opérateurs" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Types applicables" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Liste des familles d'opérateurs" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Opérateur" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Stratégie" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "ordre" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "recherche" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "But" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Tri famille d'opérateur" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Liste d'opérateurs des familles d'opérateurs" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Type de l'arg. gauche enregistré" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Type de l'arg. droit enregistré" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Numéro" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Liste des fonctions de support des familles d'opérateurs" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "« Large objects »" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2433,13 +2430,11 @@ msgstr "" "psql est l'interface interactive de PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Usage :\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2447,37 +2442,32 @@ msgstr "" " psql [OPTIONS]... [BASE [UTILISATEUR]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Options générales :\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr "" " -c, --command=COMMANDE exécute une commande unique (SQL ou interne), puis\n" " quitte\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr "" " -d, --dbname=BASE indique le nom de la base de données à laquelle se\n" " connecter (par défaut : « %s »)\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FICHIER exécute les commandes du fichier, puis quitte\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2487,18 +2477,15 @@ msgstr "" " configure la variable psql NOM en VALEUR\n" " (par exemple : -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: help.c:90 -#, c-format +#: help.c:93 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" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2507,23 +2494,19 @@ msgstr "" " exécute dans une transaction unique (si non\n" " interactif)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] affiche cette aide et quitte\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commandes liste les méta-commandes, puis quitte\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables liste les variables spéciales, puis quitte\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2531,70 +2514,59 @@ msgstr "" "\n" "Options d'entrée/sortie :\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all affiche les lignes du script\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors affiche les commandes échouées\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries affiche les commandes envoyées au serveur\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr "" " -E, --echo-hidden affiche les requêtes engendrées par les commandes\n" " internes\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FICHIER envoie les traces dans le fichier\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline désactive l'édition avancée de la ligne de commande\n" " (readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" " -o, --output=FICHIER écrit les résultats des requêtes dans un fichier (ou\n" " |tube)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet s'exécute silencieusement (pas de messages, uniquement\n" " le résultat des requêtes)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr "" " -s, --single-step active le mode étape par étape (confirmation pour\n" " chaque requête)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr "" " -S, --single-line active le mode ligne par ligne (EOL termine la\n" " commande SQL)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2602,21 +2574,19 @@ msgstr "" "\n" "Options de formattage de la sortie :\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr "" " -A, --no-align active le mode d'affichage non aligné des tables\n" " (-P format=unaligned)\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr "" " --csv mode d'affichage CSV (valeurs séparées par des\n" " virgules)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2626,22 +2596,19 @@ msgstr "" " séparateur de champs pour un affichage non aligné\n" " (par défaut : « %s »)\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr "" " -H, --html active le mode d'affichage HTML des tables\n" " (-P format=html)\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=VAR[=ARG] initialise l'option d'impression VAR à ARG (voir la\n" " commande \\pset)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2650,25 +2617,21 @@ msgstr "" " séparateur d'enregistrements pour un affichage non\n" " aligné (par défaut : saut de ligne)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only affiche seulement les lignes (-P tuples_only)\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" " -T, --table-attr=TEXTE initialise les attributs des balises HTML de tableau\n" " (largeur, bordure)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2677,8 +2640,7 @@ msgstr "" " initialise le séparateur de champs pour un affichage\n" " non aligné à l'octet zéro\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2687,8 +2649,7 @@ msgstr "" " initialise le séparateur d'enregistrements pour un\n" " affichage non aligné à l'octet zéro\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2696,25 +2657,25 @@ msgstr "" "\n" "Options de connexion :\n" -#: help.c:130 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -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:134 msgid "local socket" msgstr "socket locale" -#: help.c:134 +#: help.c:137 #, 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" -#: help.c:137 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr "" @@ -2722,20 +2683,17 @@ msgstr "" " nom d'utilisateur de la base de données (par\n" " défaut : « %s »)\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: help.c:139 -#, c-format +#: help.c:143 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" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2749,338 +2707,288 @@ msgstr "" "la documentation de PostgreSQL.\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Général\n" -#: help.c:172 -#, c-format +#: help.c:192 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 -#, 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" +#: help.c:193 +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 -#, c-format +#: help.c:194 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 -#, c-format +#: help.c:195 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 -#, c-format +#: help.c:197 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 -#, c-format +#: help.c:198 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 -#, 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" +#: help.c:199 +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 -#, c-format +#: help.c:200 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 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q quitte psql\n" -#: help.c:182 -#, c-format +#: help.c:202 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 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Aide\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commandes] affiche l'aide sur les métacommandes\n" -#: help.c:188 -#, c-format +#: help.c:208 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 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables affiche l'aide sur les variables spéciales\n" -#: help.c:190 -#, c-format +#: help.c:210 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 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Tampon de requête\n" -#: help.c:194 -#, c-format +#: help.c:214 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 -#, c-format +#: help.c:215 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 -#, c-format +#: help.c:216 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 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p affiche le contenu du tampon de requête\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r efface le tampon de requêtes\n" -#: help.c:200 -#, c-format +#: help.c:220 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 -#, c-format +#: help.c:222 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 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Entrée/Sortie\n" -#: help.c:206 -#, c-format +#: help.c:226 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 -#, c-format +#: help.c:227 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 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FICHIER exécute les commandes du fichier\n" -#: help.c:209 -#, c-format +#: help.c:229 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 -#, c-format +#: help.c:230 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 -#, c-format +#: help.c:231 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 -#, c-format +#: help.c:232 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 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "Conditionnel\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR début du bloc conditionnel\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif alternative à l'intérieur du bloc conditionnel courant\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternative finale à l'intérieur du bloc conditionnel courant\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif bloc conditionnel de fin\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Informations\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (options : S = affiche les objets systèmes, + = informations supplémentaires)\n" -#: help.c:224 -#, c-format +#: help.c:244 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 -#, c-format +#: help.c:245 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 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MODÈLE] affiche les aggrégats\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MODÈLE] affiche la liste des méthodes d'accès\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] affiche les classes d'opérateurs\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] affiche les familles d'opérateur\n" -#: help.c:230 -#, c-format +#: help.c:250 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 -#, c-format +#: help.c:251 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 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MODÈLE] affiche la liste des tablespaces\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MODÈLE] affiche la liste des conversions\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [MODÈLE] affiche les paramètres de configuration\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MODÈLE] affiche la liste des transtypages\n" -#: help.c:235 -#, c-format +#: help.c:256 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 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MODÈLE] affiche la liste des domaines\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MODÈLE] affiche les droits par défaut\n" -#: help.c:238 -#, c-format +#: help.c:259 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 +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MODÈLE] affiche la liste des serveurs distants\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MODÈLE] affiche la liste des correspondances utilisateurs\n" -#: help.c:242 -#, c-format +#: help.c:263 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 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -3088,68 +2996,55 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " affiche la liste des fonctions [seulement agrégat/normal/procédure/trigger/window]\n" -#: help.c:245 -#, c-format +#: help.c:266 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 -#, c-format +#: help.c:267 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 -#, c-format +#: help.c:268 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 -#, c-format +#: help.c:269 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 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MODÈLE] affiche la liste des index\n" -#: help.c:251 -#, 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" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] liste des « Large Objects », identique à \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MODÈLE] affiche la liste des langages procéduraux\n" -#: help.c:253 -#, c-format +#: help.c:274 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 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MODÈLE] affiche la liste des schémas\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3157,133 +3052,136 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " affiche la liste des opérateurs\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MODÈLE] affiche la liste des collationnements\n" -#: help.c:258 -#, c-format +#: help.c:279 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 -#, c-format +#: help.c:280 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 -#, c-format +#: help.c:281 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 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[S+] [MODÈLE] affiche la liste des publications de réplication\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MODÈLE] affiche la liste des souscriptions de réplication\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MODÈLE] affiche la liste des séquences\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MODÈLE] affiche la liste des tables\n" -#: help.c:265 -#, c-format +#: help.c:286 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 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MODÈLE] affiche la liste des vues\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MODÈLE] affiche la liste des extensions\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MODÈLE] affiche les statistiques étendues\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MODÈLE] affiche les triggers sur évènement\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MODÈLE] affiche la liste des bases de données\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] [FONCTION] édite la définition d'une fonction\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv [FONCTION] édite la définition d'une vue\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MODÈLE] identique à \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "« Large objects »\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr "" +" \\lo_export LOBOID FICHIER\n" +" écrit un « Large Object » dans le fichier\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FICHIER [COMMENTAIRE]\n" +" lit un « Large Object » à partir du fichier\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\dl[+] liste des « Large Objects »\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID supprime un « Large Object »\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Formatage\n" -#: help.c:278 -#, c-format +#: help.c:307 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 -#, c-format +#: help.c:308 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 -#, c-format +#: help.c:309 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:310 #, 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 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3301,29 +3199,31 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t affiche uniquement les lignes (actuellement %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 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:322 #, 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 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Connexions\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3333,8 +3233,7 @@ msgstr "" " se connecte à une autre base de données\n" " (actuellement « %s »)\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3343,98 +3242,71 @@ msgstr "" " se connecte à une nouvelle base de données\n" " (aucune connexion actuellement)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo affiche des informations sur la connexion en cours\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODAGE] affiche ou initialise l'encodage du client\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [UTILISATEUR]\n" " modifie de façon sécurisé le mot de passe d'un\n" " utilisateur\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Système d'exploitation\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [RÉPERTOIRE] change de répertoire de travail\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR récupère une variable d'environnement\n" + +#: help.c:342 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:343 #, 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 -#, c-format +#: help.c:345 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 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Variables\n" -#: help.c:319 -#, c-format +#: help.c:349 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 -#, c-format +#: help.c:350 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 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOM désactive (supprime) la variable interne\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "« Large objects »\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\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" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3442,13 +3314,11 @@ msgstr "" "Liste des variables traitées spécialement\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "variables psql :\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3458,8 +3328,7 @@ msgstr "" " ou \\set NOM VALEUR dans psql\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3467,8 +3336,7 @@ msgstr "" " AUTOCOMMIT\n" " si activé, les commandes SQL réussies sont automatiquement validées\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3478,8 +3346,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 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3487,8 +3354,7 @@ msgstr "" " DBNAME\n" " le nom de base de données actuel\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3498,8 +3364,7 @@ msgstr "" " contrôle ce qui est envoyé sur la sortie standard\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3509,8 +3374,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 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3518,8 +3382,7 @@ msgstr "" " ENCODING\n" " encodage du jeu de caractères client\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3527,8 +3390,7 @@ msgstr "" " ERROR\n" " true si la dernière requête a échoué, sinon false\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3537,8 +3399,7 @@ msgstr "" " le nombre de lignes résultats à récupérer et à afficher à la fois\n" " (0 pour illimité)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3546,8 +3407,7 @@ msgstr "" " HIDE_TABLEAM\n" " si activé, les méthodes d'accès ne sont pas affichées\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3556,8 +3416,7 @@ msgstr "" " si activé, les méthodes de compression methods ne sont pas affichées\n" "\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3565,8 +3424,7 @@ msgstr "" " HISTCONTROL\n" " contrôle l'historique des commandes [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3574,8 +3432,7 @@ msgstr "" " HISTFILE\n" " nom du fichier utilisé pour stocker l'historique des commandes\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3583,8 +3440,7 @@ msgstr "" " HISTSIZE\n" " nombre maximum de commandes à stocker dans l'historique de commandes\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3592,8 +3448,7 @@ msgstr "" " HOST\n" " l'hôte de la base de données\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3601,8 +3456,7 @@ msgstr "" " IGNOREEOF\n" " nombre d'EOF nécessaire pour terminer une session interactive\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3610,8 +3464,7 @@ msgstr "" " LASTOID\n" " valeur du dernier OID affecté\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3621,8 +3474,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 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3630,8 +3482,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " si activé, une erreur n'arrête pas une transaction (utilise des savepoints implicites)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3639,8 +3490,7 @@ msgstr "" " ON_ERROR_STOP\n" " arrête l'exécution d'un batch après une erreur\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3648,8 +3498,7 @@ msgstr "" " PORT\n" " port du serveur pour la connexion actuelle\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3657,8 +3506,7 @@ msgstr "" " PROMPT1\n" " spécifie l'invite standard de psql\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3666,8 +3514,7 @@ msgstr "" " PROMPT2\n" " spécifie l'invite utilisé quand une requête continue après la ligne courante\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3675,8 +3522,7 @@ msgstr "" " PROMPT3\n" " spécifie l'invite utilisée lors d'un COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3684,8 +3530,7 @@ msgstr "" " QUIET\n" " s'exécute en silence (identique à l'option -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3693,8 +3538,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 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3704,8 +3548,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " version du serveur (chaîne courte ou format numérique)\n" -#: help.c:415 -#, c-format +#: help.c:453 +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:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3713,8 +3564,7 @@ msgstr "" " SHOW_CONTEXT\n" " contrôle l'affichage des champs de contexte du message [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3722,8 +3572,7 @@ msgstr "" " SINGLELINE\n" " une fin de ligne termine le mode de commande SQL (identique à l'option -S)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3731,8 +3580,7 @@ msgstr "" " SINGLESTEP\n" " mode pas à pas (identique à l'option -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3740,8 +3588,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE de la dernière requête, ou \"00000\" si aucune erreur\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3749,8 +3596,7 @@ msgstr "" " USER\n" " l'utilisateur actuellement connecté\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3758,8 +3604,7 @@ msgstr "" " VERBOSITY\n" " contrôle la verbosité des rapports d'erreurs [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3771,8 +3616,7 @@ msgstr "" " VERSION_NUM\n" " version de psql (chaîne longue, chaîne courte, ou format numérique)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3780,8 +3624,7 @@ msgstr "" "\n" "Paramètres d'affichage :\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3791,8 +3634,7 @@ msgstr "" " ou \\pset NOM [VALEUR] dans psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3800,8 +3642,7 @@ msgstr "" " border\n" " style de bordure (nombre)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3809,8 +3650,7 @@ msgstr "" " columns\n" " largeur cible pour le format encadré\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3818,7 +3658,7 @@ msgstr "" " expanded (ou x)\n" " sortie étendue [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3827,8 +3667,7 @@ msgstr "" " fieldsep\n" " champ séparateur pour l'affichage non aligné (par défaut « %s »)\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3836,8 +3675,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 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3845,8 +3683,7 @@ msgstr "" " footer\n" " active ou désactive l'affiche du bas de tableau [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3854,8 +3691,7 @@ msgstr "" " format\n" " active le format de sortie [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3863,8 +3699,7 @@ msgstr "" " linestyle\n" " configure l'affichage des lignes de bordure [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3872,8 +3707,7 @@ msgstr "" " null\n" " configure la chaîne à afficher à la place d'une valeur NULL\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3882,8 +3716,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 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3891,8 +3724,7 @@ msgstr "" " pager\n" " contrôle quand un paginateur externe est utilisé [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3900,8 +3732,7 @@ msgstr "" " recordsep\n" " enregistre le séparateur de ligne pour les affichages non alignés\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3910,8 +3741,7 @@ msgstr "" " initialise le séparateur d'enregistrements pour un affichage\n" " non aligné à l'octet zéro\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3922,8 +3752,7 @@ msgstr "" " proportionnelles de colonnes pour les types de données alignés à gauche dans le\n" " format latex-longtable\n" -#: help.c:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3931,8 +3760,7 @@ msgstr "" " title\n" " configure le titre de la table pour toute table affichée\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3940,8 +3768,7 @@ msgstr "" " tuples_only\n" " si activé, seules les données de la table sont affichées\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3953,8 +3780,7 @@ msgstr "" " unicode_header_linestyle\n" " configure le style d'affichage de ligne Unicode [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3962,8 +3788,7 @@ msgstr "" "\n" "Variables d'environnement :\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3973,8 +3798,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3986,8 +3810,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3995,8 +3818,7 @@ msgstr "" " COLUMNS\n" " nombre de colonnes pour le format encadré\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -4004,8 +3826,7 @@ msgstr "" " PGAPPNAME\n" " identique au paramètre de connexion application_name\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -4013,8 +3834,7 @@ msgstr "" " PGDATABASE\n" " identique au paramètre de connexion dbname\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -4022,8 +3842,7 @@ msgstr "" " PGHOST\n" " identique au paramètre de connexion host\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -4031,8 +3850,7 @@ msgstr "" " PGPASSFILE\n" " nom du fichier de mot de passe\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -4040,8 +3858,7 @@ msgstr "" " PGPASSWORD\n" " mot de passe de connexion (non recommendé)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4049,8 +3866,7 @@ msgstr "" " PGPORT\n" " identique au paramètre de connexion port\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4058,8 +3874,7 @@ msgstr "" " PGUSER\n" " identique au paramètre de connexion user\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4067,8 +3882,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " éditeur utilisé par les commandes \\e, \\ef et \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4076,8 +3890,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 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4085,8 +3898,7 @@ msgstr "" " PSQL_HISTORY\n" " autre emplacement pour le fichier d'historique des commandes\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4094,8 +3906,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " nom du paginateur externe\n" -#: help.c:508 -#, c-format +#: help.c:549 +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:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4103,8 +3922,7 @@ msgstr "" " PSQLRC\n" " autre emplacement pour le fichier .psqlrc de l'utilisateur\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4112,8 +3930,7 @@ msgstr "" " SHELL\n" " shell utilisé par la commande \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4121,11 +3938,11 @@ msgstr "" " TMPDIR\n" " répertoire pour les fichiers temporaires\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Aide-mémoire disponible :\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4144,7 +3961,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4158,12 +3975,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" @@ -4183,25 +4000,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" @@ -4209,19 +4018,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" @@ -4237,24 +4046,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" @@ -4271,2321 +4080,2431 @@ 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "nom" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "type_argument" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "option" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "où option peut être :" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "limite_de_connexion" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "nouveau_tablespace" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 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:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "nom_rôle" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "nom_contrainte" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nouvelle_nom_contrainte" -#: sql_help.c:317 sql_help.c:1082 +#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "nom_objet" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "nom_agrégat" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "type_source" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "type_cible" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "nom_fonction" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "nom_opérateur" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "type_argument_gauche" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "type_argument_droit" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "méthode_indexage" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "nom_procédure" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "nom_routine" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "nom_type" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 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:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "fonction_gestionnaire" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "fonction_validateur" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "nom_colonne" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: 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:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "type_données" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "collationnement" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "contrainte_colonne" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "entier" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 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:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "table_parent" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "nom_extension" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "coût_exécution" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "lignes_de_résultat" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "fonction_support" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "specification_role" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "nom_utilisateur" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "où specification_role peut être :" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "nom_groupe" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "nom_tablespace" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "paramètre_stockage" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "numéro_colonne" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "oid_large_object" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "méthode_compression" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "new_access_method" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "numéro_de_stratégie" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "type_op" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "nom_famille_tri" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "numéro_de_support" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "type_argument" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "nom_table" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "expression_using" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "expression_check" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "objet_publication" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "paramètre_publication" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +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:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "mot_de_passe" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "horodatage" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "nom_base_de_donnée" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "incrément" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "valeur_min" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "valeur_max" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "début" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "nouveau_début" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "cache" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "nouvelle_cible" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "nom_publication" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "option_publication" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "option_rafraichissement" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "paramètre_souscription" -#: sql_help.c:1298 sql_help.c:1301 +#: 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:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "spec_limite_partition" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "options_séquence" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "option_séquence" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "contrainte_table_utilisant_index" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: 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:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "et partition_bound_spec est :" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "expr_limite_partition" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "numeric_literal" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "et contrainte_colonne est :" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "expression_par_défaut" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "expression_génération" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "paramètres_index" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "table_référence" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "colonne_référence" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "action" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "et contrainte_table est :" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "élément_exclusion" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "opérateur" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "prédicat" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "et contrainte_table_utilisant_index est :" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 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:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "élément_exclusion dans une contrainte EXCLUDE est :" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "classe_d_opérateur" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +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:3013 msgid "tablespace_option" msgstr "option_tablespace" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: 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:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "nom_dictionnaire" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "ancien_dictionnaire" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "nouveau_dictionnaire" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "nom_attribut" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nouveau_nom_attribut" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nouvelle_valeur_enum" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "valeur_enum_voisine" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "valeur_enum_existante" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "propriété" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "nom_serveur" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "nom_option_vue" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "valeur_option_vue" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "table_et_colonnes" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "où option fait partie de :" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "boolean" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "et table_et_colonnes est :" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "mode_transaction" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "où mode_transaction fait partie de :" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "argument" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "nom_relation" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "nom_domaine" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "nom_politique" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "nom_règle" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "littéral_chaîne" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "id_transaction" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "nom_fichier" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "commande" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "condition" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "requête" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "nom_format" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "caractère_délimiteur" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "chaîne_null" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "caractère_guillemet" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "chaîne_d_échappement" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "nom_encodage" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "type_données_arg" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "type_de_données_statut" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "taille_de_données_statut" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "condition_initiale" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "m_type_de_données_statut" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "m_taille_de_données_statut" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "m_condition_initiale" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "opérateur_de_tri" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "ou l'ancienne syntaxe" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "type_base" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "locale" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "fournisseur" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "version" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "collationnement_existant" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "encodage_source" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "encodage_destination" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "modèle" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "encodage" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "stratégie" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_locale" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "locale_provider" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "collation_version" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "contrainte" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "où la contrainte est :" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "événement" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "filtre_valeur" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "où contrainte_colonne est :" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "type_en_retour" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "type_colonne" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "définition" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "fichier_objet" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "symbole_link" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "corps_sql" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "méthode" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "paramètre_opclass" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "gestionnaire_d_appel" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "gestionnaire_en_ligne" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "fonction_val" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "com_op" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "nom_famille" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "type_stockage" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "où événement fait partie de :" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "élément_schéma" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "type_serveur" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "version_serveur" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "nom_fdw" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "nom_statistique" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "nom_souscription" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "table_source" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "option_like" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "et option_like est :" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "répertoire" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "nom_analyseur" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "configuration_source" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "fonction_start" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "fonction_gettoken" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "fonction_end" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "fonction_lextypes" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "fonction_headline" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "fonction_init" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "fonction_lexize" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "nom_fonction_from_sql" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "nom_fonction_to_sql" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "nom_table_référencée" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "nom_relation_transition" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "arguments" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "label" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "sous_type" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "classe_opérateur_sous_type" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "fonction_canonique" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "fonction_diff_sous_type" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "nom_type_multirange" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "fonction_en_sortie" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "fonction_en_sortie" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "fonction_receive" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "fonction_send" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "fonction_en_entrée_modificateur_type" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "fonction_en_sortie_modificateur_type" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "fonction_analyze" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "fonction_indice" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "longueur_interne" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "alignement" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "stockage" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "type_like" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "catégorie" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "préféré" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "par défaut" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "élément" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "délimiteur" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "collationnable" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "requête_with" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "alias" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "élément_from" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "nom_curseur" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "expression_en_sortie" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "nom_en_sortie" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "code" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "paramètre" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "instruction" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "direction" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "où direction fait partie de :" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "nombre" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "nom_séquence" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "nom_argument" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "type_arg" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "loid" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "schema_distant" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "schéma_local" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "cible_conflit" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "action_conflit" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "où cible_conflit fait partie de :" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "index_nom_colonne" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "index_prédicat" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "où action_conflit fait partie de :" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "sous-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "canal" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "mode_de_verrou" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "où mode_de_verrou fait partie de :" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "target_table_name" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "target_alias" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "data_source" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "condition_de_jointure" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "when_clause" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "où data_source est :" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "source_table_name" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "source_query" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "source_alias" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "et when_clause est :" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "merge_delete" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "et merge_insert est :" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "et merge_update est :" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "et merge_delete est :" + +#: sql_help.c:4132 msgid "payload" msgstr "contenu" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "ancien_rôle" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "nouveau_rôle" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "nom_savepoint" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "element_regroupement" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "nom_window" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "définition_window" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "sélection" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "où élément_from fait partie de :" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "alias_colonne" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "méthode_echantillonnage" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "graine" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "nom_requête_with" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "définition_colonne" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "type_de_jointure" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "condition_de_jointure" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "colonne_de_jointure" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "join_utilisant_alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "où element_regroupement fait partie de :" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "et requête_with est :" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "valeurs" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "insert" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "update" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "delete" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "nom_colonne_seq_recherche" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "nom_colonne_marque_cycle" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "valeur_marque_cycle" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "défaut_marque_cyle" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "nom_colonne_chemin_cycle" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "nouvelle_table" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "id_snapshot" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "expression_de_tri" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "abandonner la transaction en cours" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "modifier la définition d'une fonction d'agrégation" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "modifier la définition d'un collationnement" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "modifier la définition d'une conversion" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "modifier une base de données" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "définir les droits d'accès par défaut" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "modifier la définition d'un domaine" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "modifier la définition d'un trigger sur évènement" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "modifier la définition d'une extension" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "modifier la définition d'un wrapper de données distantes" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "modifier la définition d'une table distante" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "modifier la définition d'une fonction" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "modifier le nom d'un groupe ou la liste des ses membres" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "modifier la définition d'un index" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "modifier la définition d'un langage procédural" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "modifier la définition d'un « Large Object »" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "modifier la définition d'une vue matérialisée" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "modifier la définition d'un opérateur" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "modifier la définition d'une classe d'opérateurs" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "modifier la définition d'une famille d'opérateur" -#: sql_help.c:5113 +#: sql_help.c:5248 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:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "modifier la définition d'une procédure" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "modifier la définition d'une publication" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "modifier un rôle" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "modifier la définition d'une routine" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "modifier la définition d'une règle" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "modifier la définition d'un schéma" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "modifier la définition d'un générateur de séquence" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "modifier la définition d'un serveur distant" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "modifier la définition d'un objet de statistiques étendues" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "modifier la définition d'une souscription" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "modifie un paramètre de configuration du serveur" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "modifier la définition d'une table" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "modifier la définition d'un tablespace" -#: sql_help.c:5197 +#: sql_help.c:5332 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:5203 +#: sql_help.c:5338 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:5209 +#: sql_help.c:5344 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:5215 +#: sql_help.c:5350 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:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "modifier la définition d'un trigger" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "modifier la définition d'un type" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "modifier la définition d'une correspondance d'utilisateur" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "modifier la définition d'une vue" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "acquérir des statistiques concernant la base de données" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "débuter un bloc de transaction" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "appeler une procédure" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "forcer un point de vérification des journaux de transactions" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "fermer un curseur" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "réorganiser (cluster) une table en fonction d'un index" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "définir ou modifier les commentaires d'un objet" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "valider la transaction en cours" -#: sql_help.c:5299 +#: sql_help.c:5434 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:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "copier des données entre un fichier et une table" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "définir une nouvelle méthode d'accès" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "définir une nouvelle fonction d'agrégation" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "définir un nouveau transtypage" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "définir un nouveau collationnement" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "définir une nouvelle conversion d'encodage" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "créer une nouvelle base de données" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "définir un nouveau domaine" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "définir un nouveau trigger sur évènement" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "installer une extension" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "définir un nouveau wrapper de données distantes" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "définir une nouvelle table distante" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "définir une nouvelle fonction" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "définir un nouveau rôle" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "définir un nouvel index" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "définir un nouveau langage de procédures" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "définir une nouvelle vue matérialisée" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "définir un nouvel opérateur" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "définir une nouvelle classe d'opérateur" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "définir une nouvelle famille d'opérateur" -#: sql_help.c:5425 +#: sql_help.c:5560 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:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "définir une nouvelle procédure" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "définir une nouvelle publication" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "définir une nouvelle règle de réécriture" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" msgstr "définir un nouveau schéma" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "définir un nouveau générateur de séquence" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "définir un nouveau serveur distant" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "définir des statistiques étendues" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "définir une nouvelle souscription" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "définir une nouvelle table" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 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:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "définir un nouveau tablespace" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "définir une nouvelle configuration de la recherche de texte" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "définir un nouveau dictionnaire de la recherche de texte" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "définir un nouvel analyseur de la recherche de texte" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "définir un nouveau modèle de la recherche de texte" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "définir une nouvelle transformation" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "définir un nouveau trigger" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "définir un nouveau type de données" -#: sql_help.c:5551 +#: sql_help.c:5686 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:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "définir une nouvelle vue" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "désallouer une instruction préparée" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "définir un curseur" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "supprimer des lignes d'une table" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "annuler l'état de la session" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "exécute un bloc de code anonyme" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "supprimer une méthode d'accès" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "supprimer une fonction d'agrégation" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "supprimer un transtypage" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "supprimer un collationnement" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "supprimer une conversion" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "supprimer une base de données" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "supprimer un domaine" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "supprimer un trigger sur évènement" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "supprimer une extension" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "supprimer un wrapper de données distantes" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "supprimer une table distante" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "supprimer une fonction" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "supprimer un rôle de la base de données" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "supprimer un index" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "supprimer un langage procédural" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "supprimer une vue matérialisée" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "supprimer un opérateur" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "supprimer une classe d'opérateur" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "supprimer une famille d'opérateur" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" msgstr "supprimer les objets appartenant à un rôle" -#: sql_help.c:5713 +#: sql_help.c:5848 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:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "supprimer une procédure" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "supprimer une publication" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "supprimer une routine" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "supprimer une règle de réécriture" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" msgstr "supprimer un schéma" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "supprimer une séquence" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "supprimer un descripteur de serveur distant" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "supprimer des statistiques étendues" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "supprimer une souscription" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "supprimer une table" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "supprimer un tablespace" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "supprimer une configuration de la recherche de texte" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "supprimer un dictionnaire de la recherche de texte" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "supprimer un analyseur de la recherche de texte" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "supprimer un modèle de la recherche de texte" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "supprimer une transformation" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "supprimer un trigger" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "supprimer un type de données" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "supprime une correspondance utilisateur pour un serveur distant" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "supprimer une vue" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "exécuter une instruction préparée" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "afficher le plan d'exécution d'une instruction" -#: sql_help.c:5869 +#: sql_help.c:6004 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:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "définir des privilèges d'accès" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "importer la définition d'une table à partir d'un serveur distant" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "créer de nouvelles lignes dans une table" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "se mettre à l'écoute d'une notification" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "charger un fichier de bibliothèque partagée" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "verrouiller une table" -#: sql_help.c:5911 +#: sql_help.c:6046 +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:6052 msgid "position a cursor" msgstr "positionner un curseur" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "engendrer une notification" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "préparer une instruction pour exécution" -#: sql_help.c:5929 +#: sql_help.c:6070 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:5935 +#: sql_help.c:6076 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:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "remplacer le contenu d'une vue matérialisée" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "reconstruire des index" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "détruire un point de retournement précédemment défini" -#: sql_help.c:5959 +#: sql_help.c:6100 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:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "supprimer des privilèges d'accès" -#: sql_help.c:5977 +#: sql_help.c:6118 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:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "annuler jusqu'au point de retournement" -#: sql_help.c:5989 +#: sql_help.c:6130 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:5995 +#: sql_help.c:6136 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:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "extraire des lignes d'une table ou d'une vue" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "modifier un paramètre d'exécution" -#: sql_help.c:6019 +#: sql_help.c:6160 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:6025 +#: sql_help.c:6166 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:6031 +#: sql_help.c:6172 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:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "définir les caractéristiques de la transaction en cours" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "afficher la valeur d'un paramètre d'exécution" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "vider une table ou un ensemble de tables" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "arrêter l'écoute d'une notification" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "actualiser les lignes d'une table" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "compacter et optionnellement analyser une base de données" -#: sql_help.c:6085 +#: sql_help.c:6226 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 journal applicatif « %s » : %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6594,27 +6513,27 @@ msgstr "" "Saisissez « help » pour l'aide.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, 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:719 #, 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:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "option supplémentaire « %s » ignorée" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "n'a pas pu trouver son propre exécutable" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6727,6 +6646,18 @@ msgstr "" #~ msgid " \\l[+] list all databases\n" #~ msgstr " \\l[+] affiche la liste des bases de données\n" +#, c-format +#~ msgid "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\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 opérations sur les « Large Objects »\n" + #~ 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" @@ -6782,6 +6713,9 @@ msgstr "" #~ msgid "Could not send cancel request: %s" #~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" +#~ msgid "Disabled triggers:" +#~ msgstr "Triggers désactivés :" + #~ msgid "Enter new password: " #~ msgstr "Saisir le nouveau mot de passe : " @@ -6836,8 +6770,69 @@ msgstr "" #~ msgid "Showing only tuples." #~ msgstr "Affichage des tuples seuls." -#~ msgid "Value" -#~ msgstr "Valeur" +#, c-format +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "Relation spéciale « %s.%s »" + +#, 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." + +#, c-format +#~ msgid "The server (version %s) does not support collations." +#~ msgstr "Le serveur (version %s) ne supporte pas les collationnements." + +#, 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." + +#, 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." + +#, c-format +#~ msgid "The server (version %s) does not support foreign servers." +#~ msgstr "Le serveur (version %s) ne supporte pas les serveurs distants." + +#, c-format +#~ msgid "The server (version %s) does not support foreign tables." +#~ msgstr "Le serveur (version %s) ne supporte pas les tables distantes." + +#, 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." + +#, 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" @@ -6880,6 +6875,10 @@ msgstr "" #~ msgid "\\copy: unexpected response (%d)\n" #~ msgstr "\\copy : réponse inattendue (%d)\n" +#, c-format +#~ msgid "\\watch cannot be used with COPY" +#~ msgstr "\\watch ne peut pas être utilisé avec COPY" + #~ msgid "agg_name" #~ msgstr "nom_d_agrégat" @@ -6949,6 +6948,10 @@ msgstr "" #~ 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" @@ -6958,6 +6961,9 @@ msgstr "" #~ msgid "lock a named relation (table, etc)" #~ msgstr "verrouille une relation nommée (table, etc)" +#~ msgid "match" +#~ msgstr "match" + #~ msgid "new_column" #~ msgstr "nouvelle_colonne" @@ -6967,9 +6973,6 @@ msgstr "" #~ msgid "not null" #~ msgstr "non NULL" -#~ msgid "old_version" -#~ msgstr "ancienne_version" - #~ msgid "pclose failed: %m" #~ msgstr "échec de pclose : %m" @@ -6982,6 +6985,9 @@ msgstr "" #~ msgid "serialtype" #~ msgstr "serialtype" +#~ msgid "special" +#~ msgstr "spécial" + #~ msgid "statistic_type" #~ msgstr "type_statistique" @@ -6994,6 +7000,10 @@ msgstr "" #~ msgid "timezone" #~ msgstr "fuseau_horaire" +#, 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/third_party/spanner_pg/src/bin/psql/po/it.po b/third_party/spanner_pg/src/bin/psql/po/it.po index 29149573..f458cc87 100644 --- a/third_party/spanner_pg/src/bin/psql/po/it.po +++ b/third_party/spanner_pg/src/bin/psql/po/it.po @@ -19,61 +19,88 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:14+0000\n" -"PO-Revision-Date: 2018-10-16 02:28+0100\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:16+0000\n" +"PO-Revision-Date: 2022-09-26 15:03+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-SourceCharset: utf-8\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.0.6\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 3.1.1\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "errore: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "avviso: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "dettaglio: " -#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284 +#: ../../../src/common/logging.c:301 #, c-format -msgid "could not identify current directory: %s" -msgstr "identificazione della directory corrente fallita: %s" +msgid "hint: " +msgstr "suggerimento: " -#: ../../common/exec.c:146 +#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#, c-format +msgid "could not identify current directory: %m" +msgstr "identificazione della directory corrente fallita: %m" + +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "binario non valido \"%s\"" -#: ../../common/exec.c:195 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "lettura del binario \"%s\" fallita" -#: ../../common/exec.c:202 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "programma \"%s\" da eseguire non trovato" -#: ../../common/exec.c:257 ../../common/exec.c:293 +#: ../../common/exec.c:282 ../../common/exec.c:321 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "spostamento nella directory \"%s\" fallito: %m" + +#: ../../common/exec.c:299 #, c-format -msgid "could not change directory to \"%s\": %s" -msgstr "spostamento nella directory \"%s\" fallito: %s" +msgid "could not read symbolic link \"%s\": %m" +msgstr "lettura del link simbolico \"%s\" fallita: %m" -#: ../../common/exec.c:272 +#: ../../common/exec.c:422 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "lettura del link simbolico \"%s\" fallita" +msgid "%s() failed: %m" +msgstr "%s() non riuscito: %m" -#: ../../common/exec.c:523 +#: ../../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 "pclose failed: %s" -msgstr "pclose fallita: %s" +msgid "out of memory" +msgstr "memoria esaurita" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 input.c:227 mainloop.c:82 mainloop.c:386 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format msgid "out of memory\n" msgstr "memoria esaurita\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 "impossibile duplicare il puntatore nullo (errore interno)\n" @@ -81,9 +108,9 @@ msgstr "impossibile duplicare il puntatore nullo (errore interno)\n" #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "ID utente effettivo %ld non trovato: %s" +msgstr "impossibile cercare l'ID utente effettivo %ld: %s" -#: ../../common/username.c:45 command.c:554 +#: ../../common/username.c:45 command.c:576 msgid "user does not exist" msgstr "l'utente non esiste" @@ -107,297 +134,317 @@ msgstr "comando non trovato" msgid "child process exited with exit code %d" msgstr "processo figlio uscito con codice di uscita %d" -#: ../../common/wait_error.c:61 +#: ../../common/wait_error.c:62 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "processo figlio terminato da eccezione 0x%X" -#: ../../common/wait_error.c:71 -#, c-format -msgid "child process was terminated by signal %s" -msgstr "processo figlio terminato da segnale %s" - -#: ../../common/wait_error.c:75 +#: ../../common/wait_error.c:66 #, c-format -msgid "child process was terminated by signal %d" -msgstr "processo figlio terminato da segnale %d" +msgid "child process was terminated by signal %d: %s" +msgstr "processo figlio terminato da segnale %d: %s" -#: ../../common/wait_error.c:80 +#: ../../common/wait_error.c:72 #, c-format msgid "child process exited with unrecognized status %d" msgstr "processo figlio uscito con stato non riconosciuto %d" -#: ../../fe_utils/print.c:353 +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Richiesta di annullamento inviata\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Impossibile inviare la richiesta di annullamento: " + +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu riga)" msgstr[1] "(%lu righe)" -#: ../../fe_utils/print.c:2915 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrotto\n" -#: ../../fe_utils/print.c:2979 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Non è possibile aggiungere l'intestazione al contenuto della tabella: il numero di colonne %d è stato superato.\n" -#: ../../fe_utils/print.c:3019 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Non è possibile aggiungere celle al contenuto della tabella: il numero totale di celle %d è stato superato.\n" -#: ../../fe_utils/print.c:3268 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "il formato di output non è valido (errore interno): %d" -#: ../../fe_utils/psqlscan.l:724 +#: ../../fe_utils/psqlscan.l:702 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "saltare l'espansione ricorsiva della variabile \"%s\"" + +#: ../../port/thread.c:100 ../../port/thread.c:136 #, c-format -msgid "skipping recursive expansion of variable \"%s\"\n" -msgstr "espansione ricorsiva della variabile \"%s\" evitata\n" +msgid "could not look up local user ID %d: %s" +msgstr "impossibile cercare l'ID utente locale %d: %s" -#: command.c:220 +#: ../../port/thread.c:105 ../../port/thread.c:141 #, c-format -msgid "Invalid command \\%s. Try \\? for help.\n" -msgstr "Comando errato \\%s. Prova \\? per la guida.\n" +msgid "local user with ID %d does not exist" +msgstr "l'utente locale con ID %d non esiste" -#: command.c:222 +#: command.c:233 #, c-format -msgid "invalid command \\%s\n" -msgstr "comando errato \\%s\n" +msgid "invalid command \\%s" +msgstr "comando errato \\%s" -#: command.c:240 +#: command.c:235 #, c-format -msgid "\\%s: extra argument \"%s\" ignored\n" -msgstr "\\%s: parametro in eccesso \"%s\" ignorato\n" +msgid "Try \\? for help." +msgstr "Usa \\? per avere un aiuto." + +#: command.c:253 +#, c-format +msgid "\\%s: extra argument \"%s\" ignored" +msgstr "\\%s: parametro in eccesso \"%s\" ignorato" -#: command.c:292 +#: command.c:305 #, c-format -msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block\n" -msgstr "comando \\%s ignorato; usa \\endif o Ctrl-C per uscire dal blocco \\if corrente\n" +msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "comando \\%s ignorato; usa \\endif o Ctrl-C per uscire dal blocco \\if corrente" -#: command.c:552 +#: command.c:574 #, c-format -msgid "could not get home directory for user ID %ld: %s\n" -msgstr "directory home non trovata per l'ID utente %ld: %s\n" +msgid "could not get home directory for user ID %ld: %s" +msgstr "directory home non trovata per l'ID utente %ld: %s" -#: command.c:570 +#: command.c:593 #, c-format -msgid "\\%s: could not change directory to \"%s\": %s\n" -msgstr "\\%s: spostamento della directory a \"%s\" fallito: %s\n" +msgid "\\%s: could not change directory to \"%s\": %m" +msgstr "\\%s: spostamento della directory a \"%s\" fallito: %m" -#: command.c:595 common.c:696 common.c:754 common.c:1292 +#: command.c:618 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Al momento non sei connesso ad un database.\n" -#: command.c:602 +#: command.c:628 #, c-format -msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" tramite il socket in \"%s\" porta \"%s\".\n" +msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n" -#: command.c:605 +#: command.c:631 #, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n" +msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" +msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" tramite il socket in \"%s\" porta \"%s\".\n" -#: command.c:895 command.c:991 command.c:2376 +#: command.c:637 #, c-format -msgid "no query buffer\n" -msgstr "Nessun buffer query\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" +msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indirizzo \"%s\") sulla porta \"%s\".\n" -#: command.c:928 command.c:4648 +#: command.c:640 #, c-format -msgid "invalid line number: %s\n" -msgstr "numero di riga non valido: \"%s\"\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" +msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n" -#: command.c:982 +#: command.c:1031 command.c:1126 command.c:2660 #, c-format -msgid "The server (version %s) does not support editing function source.\n" -msgstr "Il server (versione %s) non supporta la modifica dei sorgenti delle funzioni.\n" +msgid "no query buffer" +msgstr "nessun buffer query" -#: command.c:985 +#: command.c:1064 command.c:5497 #, c-format -msgid "The server (version %s) does not support editing view definitions.\n" -msgstr "Il server (versione %s) non supporta la modifica della definizione delle viste.\n" +msgid "invalid line number: %s" +msgstr "numero di riga non valido: \"%s\"" -#: command.c:1067 +#: command.c:1202 msgid "No changes" msgstr "Nessuna modifica" -#: command.c:1144 +#: command.c:1281 #, c-format -msgid "%s: invalid encoding name or conversion procedure not found\n" -msgstr "%s: nome codifica errato oppure non esiste una procedura di conversione\n" +msgid "%s: invalid encoding name or conversion procedure not found" +msgstr "%s: nome codifica errato oppure non esiste una procedura di conversione" -#: command.c:1179 command.c:1818 command.c:3033 command.c:4750 common.c:174 -#: common.c:245 common.c:542 common.c:1338 common.c:1366 common.c:1474 -#: common.c:1577 common.c:1615 copy.c:489 copy.c:708 large_obj.c:156 -#: large_obj.c:191 large_obj.c:253 +#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5599 +#: common.c:177 common.c:226 common.c:395 common.c:1137 common.c:1155 +#: common.c:1229 common.c:1336 common.c:1374 common.c:1459 common.c:1495 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1183 -msgid "out of memory" -msgstr "memoria esaurita" - -#: command.c:1186 +#: command.c:1323 msgid "There is no previous error." msgstr "Non c'è un errore precedente." -#: command.c:1374 command.c:1679 command.c:1693 command.c:1710 command.c:1870 -#: command.c:2107 command.c:2343 command.c:2383 +#: command.c:1436 +#, c-format +msgid "\\%s: missing right parenthesis" +msgstr "\\%s: parentesi a destra mancanti" + +#: 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\n" -msgstr "\\%s: parametro richiesto mancante\n" +msgid "\\%s: missing required argument" +msgstr "\\%s: parametro richiesto mancante" -#: command.c:1505 +#: command.c:1781 #, c-format -msgid "\\elif: cannot occur after \\else\n" -msgstr "\\elif: non può apparire dopo \\else\n" +msgid "\\elif: cannot occur after \\else" +msgstr "\\elif: non può apparire dopo \\else" -#: command.c:1510 +#: command.c:1786 #, c-format -msgid "\\elif: no matching \\if\n" -msgstr "\\elif: \\if corrispondente non trovato\n" +msgid "\\elif: no matching \\if" +msgstr "\\elif: \\if corrispondente non trovato" -#: command.c:1574 +#: command.c:1850 #, c-format -msgid "\\else: cannot occur after \\else\n" -msgstr "\\else: non può apparire dopo \\else\n" +msgid "\\else: cannot occur after \\else" +msgstr "\\else: non può apparire dopo \\else" -#: command.c:1579 +#: command.c:1855 #, c-format -msgid "\\else: no matching \\if\n" -msgstr "\\else: \\if corrispondente non trovato\n" +msgid "\\else: no matching \\if" +msgstr "\\else: \\if corrispondente non trovato" -#: command.c:1619 +#: command.c:1895 #, c-format -msgid "\\endif: no matching \\if\n" -msgstr "\\endif: \\if corrispondente non trovato\n" +msgid "\\endif: no matching \\if" +msgstr "\\endif: \\if corrispondente non trovato" -#: command.c:1774 +#: command.c:2052 msgid "Query buffer is empty." msgstr "Il buffer query è vuoto." -#: command.c:1796 -msgid "Enter new password: " -msgstr "Inserire la nuova password: " +#: command.c:2095 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "Inserisci la password per l'utente \"%s\": " -#: command.c:1797 +#: command.c:2099 msgid "Enter it again: " msgstr "Conferma password: " -#: command.c:1801 +#: command.c:2108 #, c-format -msgid "Passwords didn't match.\n" -msgstr "Le password non corrispondono.\n" +msgid "Passwords didn't match." +msgstr "Le password non corrispondono." -#: command.c:1900 +#: command.c:2207 #, c-format -msgid "\\%s: could not read value for variable\n" -msgstr "\\%s: errore nella lettura del valore della variabile\n" +msgid "\\%s: could not read value for variable" +msgstr "\\%s: errore nella lettura del valore della variabile" -#: command.c:2003 +#: command.c:2310 msgid "Query buffer reset (cleared)." msgstr "Buffer query resettato (svuotato)." -#: command.c:2025 +#: command.c:2332 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Storia scritta nel file \"%s\".\n" -#: command.c:2112 -#, c-format -msgid "\\%s: environment variable name must not contain \"=\"\n" -msgstr "\\%s: il nome della variabile d'ambiente non deve contenere \"=\"\n" - -#: command.c:2173 +#: command.c:2419 #, c-format -msgid "The server (version %s) does not support showing function source.\n" -msgstr "Il server (versione %s) non supporta la visualizzazione dei sorgenti delle funzioni.\n" +msgid "\\%s: environment variable name must not contain \"=\"" +msgstr "\\%s: il nome della variabile d'ambiente non deve contenere \"=\"" -#: command.c:2176 +#: command.c:2467 #, c-format -msgid "The server (version %s) does not support showing view definitions.\n" -msgstr "-\"Il server (versione %s) non supporta la visualizzazione della definizione delle viste.\n" +msgid "function name is required" +msgstr "il nome della funzione è richiesto" -#: command.c:2183 +#: command.c:2469 #, c-format -msgid "function name is required\n" -msgstr "il nome della funzione è richiesto\n" +msgid "view name is required" +msgstr "il nome della vista è richiesto" -#: command.c:2185 -#, c-format -msgid "view name is required\n" -msgstr "il nome della vista è richiesto\n" - -#: command.c:2315 +#: command.c:2599 msgid "Timing is on." -msgstr "Controllo tempo attivato" +msgstr "Controllo tempo attivato." -#: command.c:2317 +#: command.c:2601 msgid "Timing is off." msgstr "Controllo tempo disattivato." -#: command.c:2402 command.c:2430 command.c:3401 command.c:3404 command.c:3407 -#: command.c:3413 command.c:3415 command.c:3423 command.c:3433 command.c:3442 -#: command.c:3456 command.c:3473 command.c:3531 common.c:70 copy.c:332 -#: copy.c:392 copy.c:405 psqlscanslash.l:783 psqlscanslash.l:794 -#: psqlscanslash.l:804 +#: 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: %s\n" -msgstr "%s: %s\n" +msgid "%s: %m" +msgstr "%s: %m" -#: command.c:2814 startup.c:214 startup.c:265 +#: command.c:3113 startup.c:243 startup.c:293 msgid "Password: " msgstr "Password: " -#: command.c:2819 startup.c:262 +#: command.c:3118 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Inserisci la password per l'utente %s: " -#: command.c:2869 +#: command.c:3174 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "Non fornire utente, host o porta separatamente quando si utilizza una stringa di connessione" + +#: command.c:3209 #, c-format -msgid "All connection parameters must be supplied because no database connection exists\n" -msgstr "Tutti i parametri di connessione devono essere forniti perché non esiste alcuna connessione di database\n" +msgid "No database connection exists to re-use parameters from" +msgstr "Non esiste alcuna connessione al database da cui riutilizzare i parametri" -#: command.c:3037 +#: command.c:3517 #, c-format -msgid "Previous connection kept\n" -msgstr "Connessione precedente mantenuta\n" +msgid "Previous connection kept" +msgstr "Connessione precedente mantenuta" -#: command.c:3041 +#: command.c:3523 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3077 +#: command.c:3579 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'indirizzo \"%s\" porta \"%s\".\n" + +#: 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 "Adesso sei collegato al database \"%s\" con nome utente \"%s\" tramite socket \"%s\" porta \"%s\".\n" -#: command.c:3080 +#: 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 "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indiirizzo \"%s\") sulla porta \"%s\".\n" + +#: command.c:3591 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n" -#: command.c:3084 +#: command.c:3596 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Sei collegato al database \"%s\" con nome utente \"%s\".\n" -#: command.c:3117 +#: command.c:3636 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, server %s)\n" -#: command.c:3125 +#: command.c:3649 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -406,24 +453,29 @@ msgstr "" "ATTENZIONE: versione maggiore %s %s, versione maggiore server %s.\n" " Alcune caratteristiche di psql potrebbero non funzionare.\n" -#: command.c:3162 +#: command.c:3686 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "connessione SSL (protocollo: %s, cifrario: %s, bit: %s, compressione: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "connessione SSL (protocollo: %s, cifrario: %s, compressione: %s)\n" -#: command.c:3163 command.c:3164 command.c:3165 +#: command.c:3687 command.c:3688 msgid "unknown" msgstr "sconosciuto" -#: command.c:3166 help.c:45 +#: command.c:3689 help.c:42 msgid "off" msgstr "disattivato" -#: command.c:3166 help.c:45 +#: command.c:3689 help.c:42 msgid "on" msgstr "attivato" -#: command.c:3186 +#: command.c:3703 +#, c-format +msgid "GSSAPI-encrypted connection\n" +msgstr "Connessione crittografata GSSAPI\n" + +#: command.c:3723 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -435,239 +487,269 @@ msgstr "" " funzionare correttamente. Vedi le pagine di riferimento\n" " psql \"Note per utenti Windows\" per i dettagli.\n" -#: command.c:3290 +#: command.c:3828 #, c-format -msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n" -msgstr "la variabile di ambiente PSQL_EDITOR_LINENUMBER_ARG deve specificare un numero di riga\n" +msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" +msgstr "la variabile di ambiente PSQL_EDITOR_LINENUMBER_ARG deve specificare un numero di riga" -#: command.c:3319 +#: command.c:3857 #, c-format -msgid "could not start editor \"%s\"\n" -msgstr "avvio dell'editor \"%s\" fallito\n" +msgid "could not start editor \"%s\"" +msgstr "avvio dell'editor \"%s\" fallito" -#: command.c:3321 +#: command.c:3859 #, c-format -msgid "could not start /bin/sh\n" -msgstr "avvio di /bin/sh fallito\n" +msgid "could not start /bin/sh" +msgstr "avvio di /bin/sh fallito" -#: command.c:3359 +#: command.c:3909 #, c-format -msgid "could not locate temporary directory: %s\n" -msgstr "directory temporanea non trovata: %s\n" +msgid "could not locate temporary directory: %s" +msgstr "directory temporanea non trovata: %s" -#: command.c:3386 +#: command.c:3936 #, c-format -msgid "could not open temporary file \"%s\": %s\n" -msgstr "apertura del file temporaneo \"%s\" fallita: %s\n" +msgid "could not open temporary file \"%s\": %m" +msgstr "errore nell'apertura del file temporaneo \"%s\": %m" -#: command.c:3660 +#: command.c:4272 #, c-format -msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" -msgstr "\\pset: i formati consentiti sono unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" +msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" +msgstr "\\pset: l'abbreviazione ambigua \"%s\" corrisponde sia a \"%s\" che a \"%s\"" -#: command.c:3678 +#: command.c:4292 #, c-format -msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n" -msgstr "\\pset: gli stili di linea permessi sono ascii, old-ascii, unicode\n" +msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" +msgstr "\\pset: i formati consentiti sono unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms" -#: command.c:3693 +#: command.c:4311 #, c-format -msgid "\\pset: allowed Unicode border line styles are single, double\n" -msgstr "\\pset: gli stili riga Unicode dei bordi consentiti sono single, double\n" +msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" +msgstr "\\pset: gli stili di linea permessi sono ascii, old-ascii, unicode" -#: command.c:3708 +#: command.c:4326 #, c-format -msgid "\\pset: allowed Unicode column line styles are single, double\n" -msgstr "\\pset: gli stili riga Unicode delle colonne consentiti sono single, double\n" +msgid "\\pset: allowed Unicode border line styles are single, double" +msgstr "\\pset: gli stili riga Unicode dei bordi consentiti sono single, double" -#: command.c:3723 +#: command.c:4341 +#, c-format +msgid "\\pset: allowed Unicode column line styles are single, double" +msgstr "\\pset: gli stili riga Unicode delle colonne consentiti sono single, double" + +#: command.c:4356 +#, c-format +msgid "\\pset: allowed Unicode header line styles are single, double" +msgstr "\\pset: gli stili riga Unicode delle intestazioni consentiti sono single, double" + +#: command.c:4399 #, c-format -msgid "\\pset: allowed Unicode header line styles are single, double\n" -msgstr "\\pset: gli stili riga Unicode delle intestazioni consentiti sono single, double\n" +msgid "\\pset: csv_fieldsep must be a single one-byte character" +msgstr "\\pset: csv_fieldsep deve essere un singolo carattere di un byte" -#: command.c:3888 command.c:4067 +#: command.c:4404 #, c-format -msgid "\\pset: unknown option: %s\n" -msgstr "\\pset: opzione sconosciuta: %s\n" +msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" +msgstr "\\pset: csv_fieldsep non può essere un apice, una nuova riga o un ritorno a capo" -#: command.c:3906 +#: command.c:4541 command.c:4729 +#, c-format +msgid "\\pset: unknown option: %s" +msgstr "\\pset: opzione sconosciuta: %s" + +#: command.c:4561 #, c-format msgid "Border style is %d.\n" msgstr "Lo stile del bordo è %d.\n" -#: command.c:3912 +#: command.c:4567 #, c-format msgid "Target width is unset.\n" msgstr "La lunghezza di destinazione non è impostata.\n" -#: command.c:3914 +#: command.c:4569 #, c-format msgid "Target width is %d.\n" msgstr "La larghezza di destinazione è %d.\n" -#: command.c:3921 +#: command.c:4576 #, c-format msgid "Expanded display is on.\n" msgstr "La visualizzazione espansa è attiva.\n" -#: command.c:3923 +#: command.c:4578 #, c-format msgid "Expanded display is used automatically.\n" msgstr "La visualizzazione espansa è usata automaticamente.\n" -#: command.c:3925 +#: command.c:4580 #, c-format msgid "Expanded display is off.\n" msgstr "La visualizzazione espansa è disattivata.\n" -#: command.c:3932 command.c:3940 +#: command.c:4586 +#, c-format +msgid "Field separator for CSV is \"%s\".\n" +msgstr "Il separatore di campo per i CSV è \"%s\".\n" + +#: command.c:4594 command.c:4602 #, c-format msgid "Field separator is zero byte.\n" msgstr "Il separatore di campo è il byte zero.\n" -#: command.c:3934 +#: command.c:4596 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Il separatore di campo è \"%s\".\n" -#: command.c:3947 +#: command.c:4609 #, c-format msgid "Default footer is on.\n" msgstr "Il piè di pagina di default è attivo.\n" -#: command.c:3949 +#: command.c:4611 #, c-format msgid "Default footer is off.\n" msgstr "Il piè di pagina di default è disattivato.\n" -#: command.c:3955 +#: command.c:4617 #, c-format msgid "Output format is %s.\n" msgstr "Il formato di output è %s.\n" -#: command.c:3961 +#: command.c:4623 #, c-format msgid "Line style is %s.\n" msgstr "Lo stile della linea è %s.\n" -#: command.c:3968 +#: command.c:4630 #, c-format msgid "Null display is \"%s\".\n" msgstr "La visualizzazione dei null è \"%s\".\n" -#: command.c:3976 +#: command.c:4638 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "La correzione dell'output numerico secondo il locale è attiva.\n" -#: command.c:3978 +#: command.c:4640 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "La correzione dell'output numerico secondo il locale è disattivata.\n" -#: command.c:3985 +#: command.c:4647 #, c-format msgid "Pager is used for long output.\n" msgstr "Usa la paginazione per risultati estesi.\n" -#: command.c:3987 +#: command.c:4649 #, c-format msgid "Pager is always used.\n" msgstr "Paginazione sempre attiva.\n" -#: command.c:3989 +#: command.c:4651 #, c-format msgid "Pager usage is off.\n" msgstr "Paginazione disattivata.\n" -#: command.c:3995 +#: 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] "La paginazione non verrà usata per meno di %d riga.\n" msgstr[1] "La paginazione non verrà usata per meno di %d righe.\n" -#: command.c:4005 command.c:4015 +#: command.c:4667 command.c:4677 #, c-format msgid "Record separator is zero byte.\n" msgstr "Il separatore di record è il byte zero.\n" -#: command.c:4007 +#: command.c:4669 #, c-format msgid "Record separator is .\n" msgstr "Il separatore di record è .\n" -#: command.c:4009 +#: command.c:4671 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Il separatore di record è \"%s\".\n" -#: command.c:4022 +#: command.c:4684 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Gli attributi di tabella sono \"%s\".\n" -#: command.c:4025 +#: command.c:4687 #, c-format msgid "Table attributes unset.\n" msgstr "Gli attributi di tabella non sono specificati.\n" -#: command.c:4032 +#: command.c:4694 #, c-format msgid "Title is \"%s\".\n" msgstr "Il titolo è \"%s\".\n" -#: command.c:4034 +#: command.c:4696 #, c-format msgid "Title is unset.\n" msgstr "Il titolo non è assegnato.\n" -#: command.c:4041 +#: command.c:4703 #, c-format msgid "Tuples only is on.\n" msgstr "La visualizzazione dei soli dati è attiva.\n" -#: command.c:4043 +#: command.c:4705 #, c-format msgid "Tuples only is off.\n" msgstr "La visualizzazione dei soli dati è disattivata.\n" -#: command.c:4049 +#: command.c:4711 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Lo stile riga Unicode dei bordi è \"%s\".\n" -#: command.c:4055 +#: command.c:4717 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Lo stile riga Unicode delle colonne è \"%s\".\n" -#: command.c:4061 +#: command.c:4723 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Lo stile riga Unicode delle intestazioni è \"%s\".\n" -#: command.c:4221 +#: command.c:4956 #, c-format -msgid "\\!: failed\n" -msgstr "\\!: fallita\n" +msgid "\\!: failed" +msgstr "\\!: fallita" -#: command.c:4246 common.c:802 +#: command.c:4990 #, c-format -msgid "\\watch cannot be used with an empty query\n" -msgstr "\\watch non può essere usato con una query vuota\n" +msgid "\\watch cannot be used with an empty query" +msgstr "\\watch non può essere usato con una query vuota" -#: command.c:4287 +#: command.c:5022 +#, c-format +msgid "could not set timer: %m" +msgstr "redirezione di stderr fallita: %m" + +#: command.c:5084 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (ogni %gs)\n" -#: command.c:4290 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (ogni %gs)\n" -#: command.c:4344 command.c:4351 common.c:702 common.c:709 common.c:1321 +#: command.c:5148 +#, c-format +msgid "could not wait for signals: %m" +msgstr "impossibile attendere i segnali: %m" + +#: command.c:5206 command.c:5213 common.c:568 common.c:575 common.c:1118 #, c-format msgid "" "********* QUERY **********\n" @@ -680,102 +762,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:4543 +#: command.c:5392 #, c-format -msgid "\"%s.%s\" is not a view\n" -msgstr "\"%s.%s\" non è una vista\n" +msgid "\"%s.%s\" is not a view" +msgstr "\"%s.%s\" non è una vista" -#: command.c:4559 +#: command.c:5408 #, c-format -msgid "could not parse reloptions array\n" -msgstr "interpretazione dell'array reloptions fallita\n" +msgid "could not parse reloptions array" +msgstr "interpretazione dell'array reloptions fallita" -#: common.c:159 +#: common.c:162 #, c-format -msgid "cannot escape without active connection\n" -msgstr "non è possibile effettuare l'escape senza una connessione attiva\n" +msgid "cannot escape without active connection" +msgstr "non è possibile effettuare l'escape senza una connessione attiva" -#: common.c:200 +#: common.c:203 #, c-format -msgid "shell command argument contains a newline or carriage return: \"%s\"\n" -msgstr "l'argomento del comando shell contiene un \"a capo\" o un ritorno carrello: \"%s\"\n" +msgid "shell command argument contains a newline or carriage return: \"%s\"" +msgstr "l'argomento del comando da shell contiene un caratteri newline o un ritorno a capo: \"%s\"" -#: common.c:416 +#: common.c:307 #, c-format -msgid "connection to server was lost\n" -msgstr "connessione al server persa\n" +msgid "connection to server was lost" +msgstr "connessione al server persa" -#: common.c:420 +#: common.c:311 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Connessione al server persa. Tentativo di reset: " -#: common.c:425 +#: common.c:316 #, c-format msgid "Failed.\n" msgstr "Fallito.\n" -#: common.c:432 +#: common.c:333 #, c-format msgid "Succeeded.\n" msgstr "Riuscito.\n" -#: common.c:532 common.c:1082 common.c:1256 +#: common.c:385 common.c:1054 #, c-format -msgid "unexpected PQresultStatus: %d\n" -msgstr "PQresultStatus imprevisto: %d\n" +msgid "unexpected PQresultStatus: %d" +msgstr "rilevato PQresultStatus imprevisto: %d" -#: common.c:641 +#: common.c:507 #, c-format msgid "Time: %.3f ms\n" msgstr "Tempo: %.3f ms\n" -#: common.c:656 +#: common.c:522 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Tempo: %.3f ms (%02d:%06.3f)\n" -#: common.c:665 +#: common.c:531 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Tempo: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:672 +#: common.c:538 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Tempo: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:809 +#: common.c:562 common.c:619 common.c:1089 describe.c:6135 #, c-format -msgid "\\watch cannot be used with COPY\n" -msgstr "\\watch non può essere usato con COPY\n" +msgid "You are currently not connected to a database." +msgstr "Al momento non sei connesso ad un database." -#: common.c:814 -#, c-format -msgid "unexpected result status for \\watch\n" -msgstr "risultato imprevisto per \\watch\n" - -#: common.c:843 +#: common.c:650 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Notifica asincrona \"%s\" con payload \"%s\" ricevuta dal processo server con PID %d.\n" -#: common.c:846 +#: common.c:653 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Notifica asincrona \"%s\" ricevuta dal processo server con PID %d.\n" -#: common.c:908 +#: common.c:686 common.c:705 +#, c-format +msgid "could not print result table: %m" +msgstr "impossibile stampare la tabella dei risultati: %m" + +#: common.c:726 #, c-format -msgid "no rows returned for \\gset\n" -msgstr "nessuna riga restituita per \\gset\n" +msgid "no rows returned for \\gset" +msgstr "nessuna riga restituita per \\gset" -#: common.c:913 +#: common.c:731 #, c-format -msgid "more than one row returned for \\gset\n" -msgstr "più di una riga restituita per \\gset\n" +msgid "more than one row returned for \\gset" +msgstr "più di una riga restituita per \\gset" -#: common.c:1301 +#: common.c:749 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "tentativo di \\gset nella variabile \"%s\" trattata in modo speciale ignorato" + +#: common.c:1098 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -786,87 +873,92 @@ msgstr "" "%s\n" "***(premi invio per procedere oppure digita x ed invio per annullare)***********\n" -#: common.c:1356 -#, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n" -msgstr "Il server (versione %s) non supporta savepoint per ON_ERROR_ROLLBACK.\n" - -#: common.c:1419 +#: common.c:1181 #, c-format -msgid "STATEMENT: %s\n" -msgstr "COMANDO: %s\n" +msgid "STATEMENT: %s" +msgstr "COMANDO: %s" -#: common.c:1462 +#: common.c:1217 #, c-format -msgid "unexpected transaction status (%d)\n" -msgstr "stato della transazione imprevisto (%d)\n" +msgid "unexpected transaction status (%d)" +msgstr "stato della transazione imprevisto (%d)" -#: common.c:1599 describe.c:1941 +#: common.c:1358 describe.c:2020 msgid "Column" msgstr "Colonna" -#: common.c:1600 describe.c:175 describe.c:390 describe.c:408 describe.c:453 -#: describe.c:470 describe.c:959 describe.c:1123 describe.c:1664 -#: describe.c:1688 describe.c:1942 describe.c:3529 describe.c:3734 -#: describe.c:4925 +#: common.c:1359 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Tipo" -#: common.c:1649 +#: common.c:1408 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Il comando non ha prodotto risultati, o il risultato non ha colonne.\n" -#: copy.c:99 +#: common.c:1561 #, c-format -msgid "\\copy: arguments required\n" -msgstr "\\copy: parametri richiesti\n" +msgid "\\watch cannot be used with COPY" +msgstr "\\watch non può essere usato con COPY" -#: copy.c:254 +#: copy.c:98 #, c-format -msgid "\\copy: parse error at \"%s\"\n" -msgstr "\\copy: errore di sintassi a \"%s\"\n" +msgid "\\copy: arguments required" +msgstr "\\copy: parametri richiesti" -#: copy.c:256 +#: copy.c:253 #, c-format -msgid "\\copy: parse error at end of line\n" -msgstr "\\copy: errore di sintassi a fine riga\n" +msgid "\\copy: parse error at \"%s\"" +msgstr "\\copy: errore di sintassi a \"%s\"" -#: copy.c:329 +#: copy.c:255 #, c-format -msgid "could not execute command \"%s\": %s\n" -msgstr "esecuzione del comando \"%s\" fallito: %s\n" +msgid "\\copy: parse error at end of line" +msgstr "\\copy: errore di sintassi a fine riga" -#: copy.c:345 +#: copy.c:328 #, c-format -msgid "could not stat file \"%s\": %s\n" -msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n" +msgid "could not execute command \"%s\": %m" +msgstr "esecuzione del comando \"%s\" fallita: %m" -#: copy.c:349 +#: copy.c:344 #, c-format -msgid "%s: cannot copy from/to a directory\n" -msgstr "%s: non è possibile copiare da/a una directory\n" +msgid "could not stat file \"%s\": %m" +msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m" -#: copy.c:386 +#: copy.c:348 #, c-format -msgid "could not close pipe to external command: %s\n" -msgstr "chiusura della pipe verso il comando esterno fallita: %s\n" +msgid "%s: cannot copy from/to a directory" +msgstr "%s: non è possibile copiare da/a una directory" -#: copy.c:452 copy.c:463 +#: copy.c:385 #, c-format -msgid "could not write COPY data: %s\n" -msgstr "scrittura dei dati COPY fallita: %s\n" +msgid "could not close pipe to external command: %m" +msgstr "chiusura della pipe per verso il comando esterno fallita: %m" -#: copy.c:470 +#: copy.c:390 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: copy.c:453 copy.c:463 +#, c-format +msgid "could not write COPY data: %m" +msgstr "scrittura dei dati COPY fallita: %m" + +#: copy.c:469 #, c-format msgid "COPY data transfer failed: %s" msgstr "trasferimento dei dati COPY fallito: %s" -#: copy.c:531 +#: copy.c:530 msgid "canceled by user" msgstr "annullata dall'utente" -#: copy.c:542 +#: 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." @@ -874,111 +966,114 @@ msgstr "" "Inserire i dati da copiare seguiti da un \"a capo\".\n" "Terminare con un backslash ed un punto su una singola riga, o un segnale EOF." -#: copy.c:670 +#: copy.c:684 msgid "aborted because of read failure" msgstr "interrotto a causa di lettura non riuscita" -#: copy.c:704 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "tentativo di uscita dalla modalità copy" #: crosstabview.c:123 #, c-format -msgid "\\crosstabview: statement did not return a result set\n" -msgstr "\\crosstabview: l'istruzione non ha restituito dati\n" +msgid "\\crosstabview: statement did not return a result set" +msgstr "\\crosstabview: l'istruzione non ha restituito dati" #: crosstabview.c:129 #, c-format -msgid "\\crosstabview: query must return at least three columns\n" -msgstr "\\crosstabview: la query deve restituire almeno tre colonne\n" +msgid "\\crosstabview: query must return at least three columns" +msgstr "\\crosstabview: la query deve restituire almeno tre colonne" #: crosstabview.c:156 #, c-format -msgid "\\crosstabview: vertical and horizontal headers must be different columns\n" -msgstr "\\crosstabview: le intestazioni verticali ed orizzontali devono essere in colonne diverse\n" +msgid "\\crosstabview: vertical and horizontal headers must be different columns" +msgstr "\\crosstabview: le intestazioni verticali ed orizzontali devono essere in colonne diverse" #: crosstabview.c:172 #, c-format -msgid "\\crosstabview: data column must be specified when query returns more than three columns\n" -msgstr "\\crosstabview: la colonna dei dati deve essere specificata quando la query restituisce più di tre colonne\n" +msgid "\\crosstabview: data column must be specified when query returns more than three columns" +msgstr "\\crosstabview: la colonna dei dati deve essere specificata quando la query restituisce più di tre colonne" #: crosstabview.c:228 #, c-format -msgid "\\crosstabview: maximum number of columns (%d) exceeded\n" -msgstr "\\crosstabview: numero massimo di colonne (%d) superato\n" +msgid "\\crosstabview: maximum number of columns (%d) exceeded" +msgstr "\\crosstabview: numero massimo di colonne (%d) superato" #: crosstabview.c:397 #, c-format -msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n" -msgstr "\\crosstabview: i risultati della query contengono più di un valore per la riga \"%s\", colonna \"%s\"\n" +msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" +msgstr "\\crosstabview: i risultati della query contengono più di un valore per la riga \"%s\", colonna \"%s\"" #: crosstabview.c:645 #, c-format -msgid "\\crosstabview: column number %d is out of range 1..%d\n" -msgstr "\\crosstabview: il numero di colonna %d è al di fuori dell'intervallo 1..%d\n" +msgid "\\crosstabview: column number %d is out of range 1..%d" +msgstr "\\crosstabview: il numero di colonna %d è al di fuori dell'intervallo 1..%d" #: crosstabview.c:670 #, c-format -msgid "\\crosstabview: ambiguous column name: \"%s\"\n" -msgstr "\\crosstabview: nome di colonna ambiguo: \"%s\"\n" +msgid "\\crosstabview: ambiguous column name: \"%s\"" +msgstr "\\crosstabview: nome di colonna ambiguo: \"%s\"" #: crosstabview.c:678 #, c-format -msgid "\\crosstabview: column name not found: \"%s\"\n" -msgstr "\\crosstabview: colonna non trovata: \"%s\"\n" +msgid "\\crosstabview: column name not found: \"%s\"" +msgstr "\\crosstabview: colonna non trovata: \"%s\"" -#: describe.c:75 describe.c:370 describe.c:675 describe.c:807 describe.c:951 -#: describe.c:1112 describe.c:1184 describe.c:3518 describe.c:3732 -#: describe.c:3823 describe.c:4090 describe.c:4235 describe.c:4476 -#: describe.c:4551 describe.c:4562 describe.c:4624 describe.c:5049 -#: describe.c:5132 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Schema" -#: describe.c:76 describe.c:173 describe.c:240 describe.c:248 describe.c:371 -#: describe.c:676 describe.c:808 describe.c:869 describe.c:952 describe.c:1185 -#: describe.c:3519 describe.c:3655 describe.c:3733 describe.c:3824 -#: describe.c:3903 describe.c:4091 describe.c:4160 describe.c:4236 -#: describe.c:4477 describe.c:4552 describe.c:4563 describe.c:4625 -#: describe.c:4822 describe.c:4906 describe.c:5130 describe.c:5302 -#: describe.c:5527 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Nome" -#: describe.c:77 describe.c:383 describe.c:401 describe.c:447 describe.c:464 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Tipo dato del risultato" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:384 describe.c:402 -#: describe.c:448 describe.c:465 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Tipo dato dei parametri" -#: describe.c:110 describe.c:117 describe.c:183 describe.c:271 describe.c:510 -#: describe.c:724 describe.c:823 describe.c:894 describe.c:1187 describe.c:1960 -#: describe.c:3307 describe.c:3554 describe.c:3686 describe.c:3760 -#: describe.c:3833 describe.c:3916 describe.c:3999 describe.c:4103 -#: describe.c:4169 describe.c:4237 describe.c:4378 describe.c:4420 -#: describe.c:4493 describe.c:4555 describe.c:4564 describe.c:4626 -#: describe.c:4848 describe.c:4928 describe.c:5063 describe.c:5133 -#: large_obj.c:289 large_obj.c:299 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Descrizione" -#: describe.c:135 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Lista delle funzione aggregate" -#: describe.c:160 +#: describe.c:153 #, c-format -msgid "The server (version %s) does not support access methods.\n" -msgstr "Il server (versione %s) non supporta metodi di accesso.\n" +msgid "The server (version %s) does not support access methods." +msgstr "Il server (versione %s) non supporta metodi di accesso." -#: describe.c:174 +#: describe.c:168 msgid "Index" msgstr "Indice" -#: describe.c:182 describe.c:4827 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +msgid "Table" +msgstr "Tabella" + +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Handler" @@ -986,967 +1081,1091 @@ msgstr "Handler" msgid "List of access methods" msgstr "Lista dei metodi di accesso" -#: describe.c:227 -#, c-format -msgid "The server (version %s) does not support tablespaces.\n" -msgstr "Il server (versione %s) non supporta i tablespace.\n" - -#: describe.c:241 describe.c:249 describe.c:498 describe.c:714 describe.c:870 -#: describe.c:1111 describe.c:3530 describe.c:3659 describe.c:3905 -#: describe.c:4161 describe.c:4823 describe.c:4907 describe.c:5303 -#: describe.c:5429 describe.c:5528 large_obj.c:288 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Proprietario" -#: describe.c:242 describe.c:250 +#: describe.c:231 msgid "Location" msgstr "Posizione" -#: describe.c:261 describe.c:3126 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Opzioni" -#: describe.c:266 describe.c:687 describe.c:886 describe.c:3546 describe.c:3550 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Dimensione" -#: describe.c:288 +#: describe.c:266 msgid "List of tablespaces" msgstr "Lista dei tablespace" -#: describe.c:330 +#: describe.c:311 #, c-format -msgid "\\df only takes [anptwS+] as options\n" -msgstr "\\df accetta come opzioni solo [anptwS+]\n" +msgid "\\df only takes [anptwS+] as options" +msgstr "\\df accetta come opzioni solo [anptwS+]" -#: describe.c:338 describe.c:349 +#: describe.c:319 #, c-format -msgid "\\df does not take a \"%c\" option with server version %s\n" -msgstr "\\df non accetta un'opzione \"%c\" con il server in versione %s\n" +msgid "\\df does not take a \"%c\" option with server version %s" +msgstr "\\df non accetta un'opzione \"%c\" con il server in versione %s" #. translator: "agg" is short for "aggregate" -#: describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "aggr" -#: describe.c:387 describe.c:405 +#: describe.c:355 describe.c:373 msgid "window" msgstr "finestra" -#: describe.c:388 +#: describe.c:356 msgid "proc" msgstr "procedura" -#: describe.c:389 describe.c:407 describe.c:452 describe.c:469 +#: describe.c:357 describe.c:375 msgid "func" msgstr "funzione" -#: describe.c:406 describe.c:451 describe.c:468 describe.c:1321 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "trigger" -#: describe.c:480 +#: describe.c:386 msgid "immutable" msgstr "immutabile" -#: describe.c:481 +#: describe.c:387 msgid "stable" msgstr "stabile" -#: describe.c:482 +#: describe.c:388 msgid "volatile" msgstr "volatile" -#: describe.c:483 +#: describe.c:389 msgid "Volatility" msgstr "Volatilità" -#: describe.c:491 +#: describe.c:397 msgid "restricted" msgstr "ristretta" -#: describe.c:492 +#: describe.c:398 msgid "safe" msgstr "sicura" -#: describe.c:493 +#: describe.c:399 msgid "unsafe" msgstr "non sicura" -#: describe.c:494 +#: describe.c:400 msgid "Parallel" msgstr "Parallela" -#: describe.c:499 +#: describe.c:405 msgid "definer" msgstr "definitore" -#: describe.c:500 +#: describe.c:406 msgid "invoker" msgstr "invocatore" -#: describe.c:501 +#: describe.c:407 msgid "Security" msgstr "Sicurezza" -#: describe.c:508 +#: describe.c:412 msgid "Language" msgstr "Linguaggio" -#: describe.c:509 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Codice sorgente" -#: describe.c:638 +#: describe.c:594 msgid "List of functions" msgstr "Lista delle funzioni" -#: describe.c:686 +#: describe.c:657 msgid "Internal name" msgstr "Nome interno" -#: describe.c:708 +#: describe.c:659 msgid "Elements" msgstr "Elementi" -#: describe.c:765 +#: describe.c:711 msgid "List of data types" msgstr "Lista dei tipi di dati" -#: describe.c:809 +#: describe.c:814 msgid "Left arg type" msgstr "Argomento sinistro" -#: describe.c:810 +#: describe.c:815 msgid "Right arg type" msgstr "Argomento destro" -#: describe.c:811 +#: describe.c:816 msgid "Result type" msgstr "Tipo di risultato" -#: describe.c:816 describe.c:3911 describe.c:3976 describe.c:3982 -#: describe.c:4377 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Funzione" -#: describe.c:841 +#: describe.c:902 msgid "List of operators" msgstr "Lista degli operatori" -#: describe.c:871 +#: describe.c:938 msgid "Encoding" msgstr "Codifica" -#: describe.c:876 describe.c:4092 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Ordinamento" -#: describe.c:877 describe.c:4093 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:890 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU Locale" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Provider di localizzazione" + +#: describe.c:964 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:912 +#: describe.c:990 msgid "List of databases" msgstr "Lista dei database" -#: describe.c:953 describe.c:958 describe.c:1114 describe.c:3520 -#: describe.c:3527 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "tabella" -#: describe.c:954 describe.c:3521 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "vista" -#: describe.c:955 describe.c:3522 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "vista materializzata" -#: describe.c:956 describe.c:1116 describe.c:3524 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "sequenza" -#: describe.c:957 describe.c:3526 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "tabella esterna" -#: describe.c:970 +#: describe.c:1036 describe.c:3889 describe.c:4101 +msgid "partitioned table" +msgstr "tabella partizionata" + +#: describe.c:1047 msgid "Column privileges" msgstr "Privilegi di colonna" -#: describe.c:1001 describe.c:1035 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Regole di sicurezza" -#: describe.c:1067 describe.c:5584 describe.c:5588 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Privilegi di accesso" -#: describe.c:1098 -#, c-format -msgid "The server (version %s) does not support altering default privileges.\n" -msgstr "Il server (versione %s) non supporta la modifica dei privilegi di default.\n" - -#: describe.c:1118 +#: describe.c:1188 msgid "function" msgstr "funzione" -#: describe.c:1120 +#: describe.c:1190 msgid "type" msgstr "tipo" -#: describe.c:1122 +#: describe.c:1192 msgid "schema" msgstr "schema" -#: describe.c:1146 +#: describe.c:1215 msgid "Default access privileges" msgstr "Privilegi di accesso di default" -#: describe.c:1186 +#: describe.c:1259 msgid "Object" msgstr "Oggetto" -#: describe.c:1200 +#: describe.c:1273 msgid "table constraint" msgstr "vincolo di tabella" -#: describe.c:1222 +#: describe.c:1297 msgid "domain constraint" msgstr "vincolo di dominio" -#: describe.c:1250 +#: describe.c:1321 msgid "operator class" msgstr "classe operatori" -#: describe.c:1279 +#: describe.c:1345 msgid "operator family" msgstr "famiglia operatori" -#: describe.c:1301 +#: describe.c:1368 msgid "rule" msgstr "regola" -#: describe.c:1343 +#: describe.c:1414 msgid "Object descriptions" msgstr "Descrizioni oggetti" -#: describe.c:1399 describe.c:3618 +#: describe.c:1479 describe.c:4007 #, c-format -msgid "Did not find any relation named \"%s\".\n" -msgstr "Non è stata trovata nessuna relazione chiamata \"%s\".\n" +msgid "Did not find any relation named \"%s\"." +msgstr "Non è stata trovata nessuna relazione chiamata \"%s\"." -#: describe.c:1402 describe.c:3621 +#: describe.c:1482 describe.c:4010 #, c-format -msgid "Did not find any relations.\n" -msgstr "Non è stata trovata nessuna relazione.\n" +msgid "Did not find any relations." +msgstr "Non è stata trovata nessuna relazione." -#: describe.c:1619 +#: describe.c:1678 #, c-format -msgid "Did not find any relation with OID %s.\n" -msgstr "Non è stata trovata nessuna relazione con OID %s.\n" +msgid "Did not find any relation with OID %s." +msgstr "Non è stata trovata nessuna relazione con OID %s." -#: describe.c:1665 describe.c:1689 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Inizio" -#: describe.c:1666 describe.c:1690 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Minimo" -#: describe.c:1667 describe.c:1691 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Massimo" -#: describe.c:1668 describe.c:1692 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Incremento" -#: describe.c:1669 describe.c:1693 describe.c:1818 describe.c:3827 -#: describe.c:3993 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "sì" -#: describe.c:1670 describe.c:1694 describe.c:1819 describe.c:3827 -#: describe.c:3990 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "no" -#: describe.c:1671 describe.c:1695 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Riparte?" -#: describe.c:1672 describe.c:1696 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Cache" -#: describe.c:1739 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Proprietario: %s" -#: describe.c:1743 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenza per la colonna identità: %s" -#: describe.c:1750 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Sequenza non registrata \"%s.%s\"" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenza \"%s.%s\"" -#: describe.c:1880 describe.c:1926 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Tabella non loggata \"%s.%s\"" -#: describe.c:1883 describe.c:1929 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabella \"%s.%s\"" -#: describe.c:1887 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Vista \"%s.%s\"" -#: describe.c:1892 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vista materializzata non loggata \"%s.%s\"" -#: describe.c:1895 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vista materializzata \"%s.%s\"" -#: describe.c:1901 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Indice non loggato \"%s.%s\"" -#: describe.c:1904 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Indice \"%s.%s\"" -#: describe.c:1909 +#: describe.c:1985 +#, c-format +msgid "Unlogged partitioned index \"%s.%s\"" +msgstr "Indice partizionato non registrato \"%s.%s\"" + +#: describe.c:1988 #, c-format -msgid "Special relation \"%s.%s\"" -msgstr "relazione speciale \"%s.%s\"" +msgid "Partitioned index \"%s.%s\"" +msgstr "Indice partizionato \"%s.%s\"" -#: describe.c:1913 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Tabella TOAST \"%s.%s\"" -#: describe.c:1917 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Tipo composito \"%s.%s\"" -#: describe.c:1921 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Tabella esterna \"%s.%s\"" -#: describe.c:1945 describe.c:3740 +#: describe.c:2005 +#, c-format +msgid "Unlogged partitioned table \"%s.%s\"" +msgstr "Tabella partizionata non registrata \"%s.%s\"" + +#: describe.c:2008 +#, c-format +msgid "Partitioned table \"%s.%s\"" +msgstr "Tabella partizionata \"%s.%s\"" + +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Ordinamento" -#: describe.c:1946 describe.c:3747 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Può essere null" -#: describe.c:1947 describe.c:3748 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Default" -#: describe.c:1950 +#: describe.c:2029 msgid "Key?" msgstr "Chiave?" -#: describe.c:1952 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Definizione" -#: describe.c:1954 describe.c:4843 describe.c:4927 describe.c:4998 -#: describe.c:5062 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Opzioni FDW" -#: describe.c:1956 +#: describe.c:2035 msgid "Storage" msgstr "Memorizzazione" -#: describe.c:1958 +#: describe.c:2037 +msgid "Compression" +msgstr "Compression" + +#: describe.c:2039 msgid "Stats target" -msgstr "Dest. stat." +msgstr "Destinazione statistiche" -#: describe.c:2072 +#: describe.c:2175 #, c-format -msgid "Partition of: %s %s" -msgstr "Partizione di: %s %s" +msgid "Partition of: %s %s%s" +msgstr "Partizione di: %s %s%s" -#: describe.c:2080 +#: describe.c:2188 msgid "No partition constraint" msgstr "Nessun vincolo di partizione" -#: describe.c:2082 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Vincolo di partizione: %s" -#: describe.c:2105 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Chiave di partizione: %s" -#: describe.c:2174 +#: describe.c:2240 +#, c-format +msgid "Owning table: \"%s.%s\"" +msgstr "Tabella proprietaria: \"%s.%s\"" + +#: describe.c:2309 msgid "primary key, " msgstr "chiave primaria, " -#: describe.c:2176 -msgid "unique, " -msgstr "univoco, " +#: describe.c:2312 +msgid "unique" +msgstr "univoco" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls non distinti" -#: describe.c:2182 +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "per la tabella \"%s.%s\"" -#: describe.c:2186 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", predicato (%s)" -#: describe.c:2189 +#: describe.c:2329 msgid ", clustered" msgstr ", raggruppato" -#: describe.c:2192 +#: describe.c:2332 msgid ", invalid" msgstr ", non valido" -#: describe.c:2195 +#: describe.c:2335 msgid ", deferrable" msgstr ", deferibile" -#: describe.c:2198 +#: describe.c:2338 msgid ", initially deferred" msgstr ", inizialmente deferito" -#: describe.c:2201 +#: describe.c:2341 msgid ", replica identity" msgstr ", identità di replica" -#: describe.c:2260 +#: describe.c:2395 msgid "Indexes:" msgstr "Indici:" -#: describe.c:2344 +#: describe.c:2478 msgid "Check constraints:" msgstr "Vincoli di controllo:" -#: describe.c:2380 +#: describe.c:2546 msgid "Foreign-key constraints:" -msgstr "Vincoli di integrità referenziale" +msgstr "Vincoli di integrità referenziale:" -#: describe.c:2411 +#: describe.c:2609 msgid "Referenced by:" msgstr "Referenziato da:" -#: describe.c:2461 +#: describe.c:2659 msgid "Policies:" msgstr "Regole di sicurezza:" -#: describe.c:2464 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Regole (sicurezza per riga forzata abilitata):" -#: describe.c:2467 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Regole (sicurezza per riga abilitata): (nessuna)" -#: describe.c:2470 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Regole (sicurezza per riga forzata abilitata): (nessuna)" -#: describe.c:2473 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Regole (sicurezza per riga disabilitata):" -#: describe.c:2535 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Oggetti statistiche:" -#: describe.c:2638 describe.c:2742 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Regole:" -#: describe.c:2641 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Regole disabilitate:" -#: describe.c:2644 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Regole sempre abilitate:" -#: describe.c:2647 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Regole abilitate solo su replica:" -#: describe.c:2687 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Pubblicazioni:" -#: describe.c:2725 +#: describe.c:3073 msgid "View definition:" msgstr "Definizione vista:" -#: describe.c:2864 +#: describe.c:3236 msgid "Triggers:" msgstr "Trigger:" -#: describe.c:2868 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Trigger utente disabilitati:" -#: describe.c:2870 -msgid "Disabled triggers:" -msgstr "Trigger disabilitati:" - -#: describe.c:2873 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Trigger interni disabilitati:" -#: describe.c:2876 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Trigger sempre abilitati:" -#: describe.c:2879 +#: describe.c:3248 msgid "Triggers firing on replica only:" -msgstr "Trigger abilitati solo su replica." +msgstr "Trigger abilitati solo su replica:" -#: describe.c:2938 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:2946 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "Opzioni FDW (%s)" -#: describe.c:2965 +#: describe.c:3348 msgid "Inherits" msgstr "Eredita" -#: describe.c:3024 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Numero di partizioni: %d" -#: describe.c:3033 -#, c-format -msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "Numero di tabelle figlio: %d (Usa \\d+ per elencarle.)" - -#: describe.c:3035 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Numero di partizioni: %d (Usa \\d+ per elencarle.)" -#: describe.c:3043 +#: describe.c:3424 +#, c-format +msgid "Number of child tables: %d (Use \\d+ to list them.)" +msgstr "Numero di tabelle figlio: %d (Usa \\d+ per elencarle.)" + +#: describe.c:3431 msgid "Child tables" msgstr "Tabelle figlio" -#: describe.c:3043 +#: describe.c:3431 msgid "Partitions" msgstr "Partizioni" -#: describe.c:3086 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Tabella di tipo: %s" -#: describe.c:3102 +#: describe.c:3478 msgid "Replica Identity" msgstr "Identità di replica" -#: describe.c:3115 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Ha OID: sì" -#: describe.c:3195 +#: describe.c:3500 +#, c-format +msgid "Access method: %s" +msgstr "Metodo di accesso %s" + +#: describe.c:3579 #, 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:3207 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", tablespace \"%s\"" -#: describe.c:3300 +#: describe.c:3668 msgid "List of roles" msgstr "Lista dei ruoli" -#: describe.c:3302 +#: describe.c:3670 msgid "Role name" msgstr "Nome ruolo" -#: describe.c:3303 +#: describe.c:3671 msgid "Attributes" msgstr "Attributi" -#: describe.c:3304 +#: describe.c:3673 msgid "Member of" msgstr "Membro di" -#: describe.c:3315 +#: describe.c:3684 msgid "Superuser" msgstr "Superutente" -#: describe.c:3318 +#: describe.c:3687 msgid "No inheritance" msgstr "Nessuna ereditarietà" -#: describe.c:3321 +#: describe.c:3690 msgid "Create role" msgstr "Crea ruoli" -#: describe.c:3324 +#: describe.c:3693 msgid "Create DB" msgstr "Crea DB" -#: describe.c:3327 +#: describe.c:3696 msgid "Cannot login" msgstr "Login non possibile" -#: describe.c:3331 +#: describe.c:3699 msgid "Replication" msgstr "Replica" -#: describe.c:3335 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Scavalca RLS" -#: describe.c:3344 +#: describe.c:3712 msgid "No connections" msgstr "Niente connessioni" -#: describe.c:3346 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d connessione" msgstr[1] "%d connessioni" -#: describe.c:3356 +#: describe.c:3724 msgid "Password valid until " msgstr "Password valida fino a " -#: describe.c:3406 -#, c-format -msgid "The server (version %s) does not support per-database role settings.\n" -msgstr "Il server (versione %s) non supporta l'impostazione dei ruoli per database.\n" - -#: describe.c:3419 +#: describe.c:3777 msgid "Role" msgstr "Ruolo" -#: describe.c:3420 +#: describe.c:3778 msgid "Database" msgstr "Database" -#: describe.c:3421 +#: describe.c:3779 msgid "Settings" msgstr "Impostazioni" -#: describe.c:3442 +#: describe.c:3803 #, c-format -msgid "Did not find any settings for role \"%s\" and database \"%s\".\n" -msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\" e il database \"%s\".\n" +msgid "Did not find any settings for role \"%s\" and database \"%s\"." +msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\" e il database \"%s\"." -#: describe.c:3445 +#: describe.c:3806 #, c-format -msgid "Did not find any settings for role \"%s\".\n" -msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\".\n" +msgid "Did not find any settings for role \"%s\"." +msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\"." -#: describe.c:3448 +#: describe.c:3809 #, c-format -msgid "Did not find any settings.\n" -msgstr "Non è stata trovata nessuna impostazione.\n" +msgid "Did not find any settings." +msgstr "Non è stata trovata nessuna impostazione." -#: describe.c:3453 +#: describe.c:3814 msgid "List of settings" msgstr "Lista delle impostazioni" -#: describe.c:3523 describe.c:3528 +#: describe.c:3885 msgid "index" msgstr "indice" -#: describe.c:3525 -msgid "special" -msgstr "speciale" +#: describe.c:3887 +msgid "TOAST table" +msgstr "Tabella TOAST" -#: describe.c:3535 describe.c:5050 -msgid "Table" -msgstr "Tabella" +#: describe.c:3890 describe.c:4102 +msgid "partitioned index" +msgstr "indice partizionato" + +#: describe.c:3910 +msgid "permanent" +msgstr "permanente" + +#: describe.c:3911 +msgid "temporary" +msgstr "temporaneo" + +#: describe.c:3912 +msgid "unlogged" +msgstr "non registrato" + +#: describe.c:3913 +msgid "Persistence" +msgstr "Persistenza" -#: describe.c:3626 +#: describe.c:3929 +msgid "Access method" +msgstr "Metodo di accesso" + +#: describe.c:4015 msgid "List of relations" msgstr "Lista delle relazioni" -#: describe.c:3663 +#: describe.c:4063 +#, c-format +msgid "The server (version %s) does not support declarative table partitioning." +msgstr "Il server (versione %s) non supporta il partizionamento dichiarativo delle tabelle." + +#: describe.c:4074 +msgid "List of partitioned indexes" +msgstr "Elenco di indici partizionati" + +#: describe.c:4076 +msgid "List of partitioned tables" +msgstr "Elenco delle tabelle partizionate" + +#: describe.c:4080 +msgid "List of partitioned relations" +msgstr "Lista delle relazioni" + +#: describe.c:4111 +msgid "Parent name" +msgstr "Nome del genitore" + +#: describe.c:4124 +msgid "Leaf partition size" +msgstr "Dimensione partizione foglia" + +#: describe.c:4127 describe.c:4133 +msgid "Total size" +msgstr "Dimensione totale" + +#: describe.c:4258 msgid "Trusted" msgstr "Fidato" -#: describe.c:3671 +#: describe.c:4267 msgid "Internal language" msgstr "Linguaggio interno" -#: describe.c:3672 +#: describe.c:4268 msgid "Call handler" msgstr "Handler di chiamata" -#: describe.c:3673 describe.c:4830 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Validatore" -#: describe.c:3676 +#: describe.c:4270 msgid "Inline handler" msgstr "Handler inline" -#: describe.c:3704 +#: describe.c:4305 msgid "List of languages" msgstr "Lista dei linguaggi" -#: describe.c:3749 +#: describe.c:4346 msgid "Check" msgstr "Controllo" -#: describe.c:3791 +#: describe.c:4390 msgid "List of domains" msgstr "Lista dei domini" -#: describe.c:3825 +#: describe.c:4424 msgid "Source" msgstr "Sorgente" -#: describe.c:3826 +#: describe.c:4425 msgid "Destination" msgstr "Destinazione" -#: describe.c:3828 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Predefinito?" -#: describe.c:3865 +#: describe.c:4469 msgid "List of conversions" msgstr "Lista delle conversioni" -#: describe.c:3904 +#: describe.c:4497 +msgid "Parameter" +msgstr "Parametro" + +#: describe.c:4498 +msgid "Value" +msgstr "Valore" + +#: describe.c:4505 +msgid "Context" +msgstr "Contesto" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Elenco dei parametri di configurazione" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Elenco dei parametri di configurazione non predefiniti" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Il server (versione %s) non supporta i trigger di eventi." + +#: describe.c:4587 msgid "Event" msgstr "Evento" -#: describe.c:3906 +#: describe.c:4589 msgid "enabled" msgstr "abilitato" -#: describe.c:3907 +#: describe.c:4590 msgid "replica" msgstr "replica" -#: describe.c:3908 +#: describe.c:4591 msgid "always" msgstr "sempre" -#: describe.c:3909 +#: describe.c:4592 msgid "disabled" msgstr "disabilitato" -#: describe.c:3910 describe.c:5529 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Abilitato" -#: describe.c:3912 +#: describe.c:4595 msgid "Tags" msgstr "Tag" -#: describe.c:3931 +#: describe.c:4619 msgid "List of event triggers" msgstr "Lista di trigger di evento" -#: describe.c:3960 +#: describe.c:4646 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "Il server (versione %s) non supporta le statistiche estese." + +#: describe.c:4683 +msgid "Ndistinct" +msgstr "Ndistinto" + +#: describe.c:4684 +msgid "Dependencies" +msgstr "Dipendenze" + +#: describe.c:4694 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4718 +msgid "List of extended statistics" +msgstr "Definisci una statistica estesa" + +#: describe.c:4745 msgid "Source type" msgstr "Tipo di partenza" -#: describe.c:3961 +#: describe.c:4746 msgid "Target type" msgstr "Tipo di arrivo" -#: describe.c:3992 +#: describe.c:4770 msgid "in assignment" msgstr "in assegnazione" -#: describe.c:3994 +#: describe.c:4772 msgid "Implicit?" msgstr "Implicito?" -#: describe.c:4049 +#: describe.c:4831 msgid "List of casts" msgstr "Lista delle conversioni di tipo" -#: describe.c:4077 -#, c-format -msgid "The server (version %s) does not support collations.\n" -msgstr "Il server (versione %s) non supporta gli ordinamenti.\n" - -#: describe.c:4098 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Provider" -#: describe.c:4133 +#: describe.c:4893 describe.c:4898 +msgid "Deterministic?" +msgstr "Deterministico?" + +#: describe.c:4938 msgid "List of collations" msgstr "Lista degli ordinamenti" -#: describe.c:4192 +#: describe.c:5000 msgid "List of schemas" msgstr "Lista degli schemi" -#: describe.c:4217 describe.c:4464 describe.c:4535 describe.c:4606 -#, c-format -msgid "The server (version %s) does not support full text search.\n" -msgstr "Il server (versione %s) non supporta la ricerca full text.\n" - -#: describe.c:4252 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Lista degli analizzatori di ricerca resto" -#: describe.c:4297 +#: describe.c:5167 #, c-format -msgid "Did not find any text search parser named \"%s\".\n" -msgstr "Non è stato trovato nessun analizzatore di ricerca testo chiamato \"%s\".\n" +msgid "Did not find any text search parser named \"%s\"." +msgstr "Non è stato trovato nessun analizzatore di ricerca testo chiamato \"%s\"." -#: describe.c:4300 +#: describe.c:5170 #, c-format -msgid "Did not find any text search parsers.\n" -msgstr "Non è stato trovato nessun analizzatore di ricerca testo.\n" +msgid "Did not find any text search parsers." +msgstr "Non è stato trovato nessun analizzatore di ricerca testo." -#: describe.c:4375 +#: describe.c:5245 msgid "Start parse" msgstr "Inizio analisi" -#: describe.c:4376 +#: describe.c:5246 msgid "Method" msgstr "Metodo" -#: describe.c:4380 +#: describe.c:5250 msgid "Get next token" msgstr "Ottiene il token successivo" -#: describe.c:4382 +#: describe.c:5252 msgid "End parse" msgstr "Fine analisi" -#: describe.c:4384 +#: describe.c:5254 msgid "Get headline" msgstr "Ottiene intestazione" -#: describe.c:4386 +#: describe.c:5256 msgid "Get token types" msgstr "Ottieni i tipi token" -#: describe.c:4397 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analizzatore di ricerca teso \"%s.%s\"" -#: describe.c:4400 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Analizzatore di ricerca testo \"%s\"" -#: describe.c:4419 +#: describe.c:5289 msgid "Token name" msgstr "Nome token" -#: describe.c:4430 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tipi token per l'analizzatore \"%s.%s\"" -#: describe.c:4433 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tipi token per l'analizzatore \"%s\"" -#: describe.c:4487 +#: describe.c:5350 msgid "Template" msgstr "Modello" -#: describe.c:4488 +#: describe.c:5351 msgid "Init options" -msgstr "Opzioni iniziali:" +msgstr "Opzioni iniziali" -#: describe.c:4510 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Lista dei dizionari di ricerca testo" -#: describe.c:4553 +#: describe.c:5411 msgid "Init" msgstr "Init" -#: describe.c:4554 +#: describe.c:5412 msgid "Lexize" msgstr "Lexize" -#: describe.c:4581 +#: describe.c:5444 msgid "List of text search templates" msgstr "Lista dei modelli di ricerca testo" -#: describe.c:4641 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Lista delle configurazioni di ricerca testo" -#: describe.c:4687 +#: describe.c:5550 #, c-format -msgid "Did not find any text search configuration named \"%s\".\n" -msgstr "Non è stata trovata nessuna configurazione di ricerca testo chiamata \"%s\".\n" +msgid "Did not find any text search configuration named \"%s\"." +msgstr "Non è stata trovata nessuna configurazione di ricerca testo chiamata \"%s\"." -#: describe.c:4690 +#: describe.c:5553 #, c-format -msgid "Did not find any text search configurations.\n" -msgstr "Non è stata trovata nessuna configurazione di ricerca testo.\n" +msgid "Did not find any text search configurations." +msgstr "Non è stata trovata nessuna configurazione di ricerca testo." -#: describe.c:4756 +#: describe.c:5619 msgid "Token" msgstr "Token" -#: describe.c:4757 +#: describe.c:5620 msgid "Dictionaries" msgstr "Dizionari" -#: describe.c:4768 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configurazione di ricerca testo \"%s.%s\"" -#: describe.c:4771 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configurazione di ricerca testo \"%s\"" -#: describe.c:4775 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -1955,7 +2174,7 @@ msgstr "" "\n" "Analizzatore \"%s.%s\"" -#: describe.c:4778 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -1964,162 +2183,253 @@ msgstr "" "\n" "Analizzatore: \"%s\"" -#: describe.c:4812 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers.\n" -msgstr "Il server (versione %s) non supporta i wrapper di dati esterni.\n" - -#: describe.c:4870 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Lista dei wrapper di dati esterni" -#: describe.c:4895 -#, c-format -msgid "The server (version %s) does not support foreign servers.\n" -msgstr "Il server (versione %s) non supporta server esterni.\n" - -#: describe.c:4908 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Wrapper per dati esterni" -#: describe.c:4926 describe.c:5131 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Versione" -#: describe.c:4952 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Lista dei server esterni" -#: describe.c:4977 -#, c-format -msgid "The server (version %s) does not support user mappings.\n" -msgstr "Il server (versione %s) non supporta la mappatura di utenti.\n" - -#: describe.c:4987 describe.c:5051 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Server" -#: describe.c:4988 +#: describe.c:5825 msgid "User name" msgstr "Nome utente" -#: describe.c:5013 +#: describe.c:5855 msgid "List of user mappings" msgstr "Lista delle mappature degli utenti" -#: describe.c:5038 -#, c-format -msgid "The server (version %s) does not support foreign tables.\n" -msgstr "Il server (versione %s) non supporta tabelle esterne.\n" - -#: describe.c:5091 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Lista delle tabelle esterne" -#: describe.c:5116 describe.c:5173 -#, c-format -msgid "The server (version %s) does not support extensions.\n" -msgstr "Il server (versione %s) non supporta le estensioni.\n" - -#: describe.c:5148 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Lista delle estensioni installate" -#: describe.c:5201 +#: describe.c:6028 #, c-format -msgid "Did not find any extension named \"%s\".\n" -msgstr "Non è stata trovata nessuna estensione chiamata \"%s\".\n" +msgid "Did not find any extension named \"%s\"." +msgstr "Non è stata trovata nessuna estensione chiamata \"%s\"." -#: describe.c:5204 +#: describe.c:6031 #, c-format -msgid "Did not find any extensions.\n" -msgstr "Non è stata trovata nessuna estensione.\n" +msgid "Did not find any extensions." +msgstr "Non è stata trovata nessuna estensione." -#: describe.c:5248 +#: describe.c:6075 msgid "Object description" msgstr "Descrizione dell'oggetto" -#: describe.c:5258 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Oggetti nell'estensione \"%s\"" -#: describe.c:5287 describe.c:5358 +#: describe.c:6126 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "nome qualificato improprio (troppi nomi puntati): %s" + +#: describe.c:6140 #, c-format -msgid "The server (version %s) does not support publications.\n" -msgstr "Il server (versione %s) non supporta pubblicazioni.\n" +msgid "cross-database references are not implemented: %s" +msgstr "i riferimenti tra database diversi non sono implementati: %s" -#: describe.c:5304 describe.c:5430 +#: describe.c:6171 describe.c:6298 +#, c-format +msgid "The server (version %s) does not support publications." +msgstr "Il server (versione %s) non supporta pubblicazioni." + +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Tutte le tabelle" -#: describe.c:5305 describe.c:5431 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Inserimenti" -#: describe.c:5306 describe.c:5432 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Modifiche" -#: describe.c:5307 describe.c:5433 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Cancellazioni" -#: describe.c:5311 describe.c:5435 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Troncamenti" -#: describe.c:5328 +#: describe.c:6199 describe.c:6383 +msgid "Via root" +msgstr "Via root" + +#: describe.c:6221 msgid "List of publications" msgstr "Lista delle pubblicazioni" -#: describe.c:5396 +#: describe.c:6345 #, c-format -msgid "Did not find any publication named \"%s\".\n" -msgstr "Non è stata trovata nessuna pubblicazione chiamata \"%s\".\n" +msgid "Did not find any publication named \"%s\"." +msgstr "Non è stata trovata nessuna pubblicazione chiamata \"%s\"." -#: describe.c:5399 +#: describe.c:6348 #, c-format -msgid "Did not find any publications.\n" -msgstr "Non è stata trovata nessuna pubblicazione.\n" +msgid "Did not find any publications." +msgstr "Non è stata trovata nessuna pubblicazione." -#: describe.c:5426 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Pubblicazione %s" -#: describe.c:5470 +#: describe.c:6425 msgid "Tables:" msgstr "Tabelle:" -#: describe.c:5514 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Tabelle da schemi:" + +#: describe.c:6481 #, c-format -msgid "The server (version %s) does not support subscriptions.\n" -msgstr "Il server (versione %s) non supporta sottoscrizioni.\n" +msgid "The server (version %s) does not support subscriptions." +msgstr "Il server (versione %s) non supporta sottoscrizioni." -#: describe.c:5530 +#: describe.c:6497 msgid "Publication" msgstr "Pubblicazione" -#: describe.c:5537 +#: describe.c:6506 +msgid "Binary" +msgstr "Binario" + +#: describe.c:6507 +msgid "Streaming" +msgstr "Streaming" + +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Commit in due fasi" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Disattiva in caso di errore" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Commit sincrono" -#: describe.c:5538 +#: describe.c:6521 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:5560 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Salta LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Lista di sottoscrizioni" -#: help.c:62 -#, c-format -msgid "%s\n" -msgstr "%s\n" +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +msgid "AM" +msgstr "AM" -#: help.c:73 -#, c-format +#: describe.c:6617 +msgid "Input type" +msgstr "Tipo di input" + +#: describe.c:6618 +msgid "Storage type" +msgstr "Tipo di archiviazione" + +#: describe.c:6619 +msgid "Operator class" +msgstr "Classe operatori" + +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +msgid "Operator family" +msgstr "Famiglia operatori" + +#: describe.c:6667 +msgid "List of operator classes" +msgstr "Elenco delle classi di operatori" + +#: describe.c:6714 +msgid "Applicable types" +msgstr "Tipi applicabili" + +#: describe.c:6756 +msgid "List of operator families" +msgstr "Elenco delle famiglie di operatori" + +#: describe.c:6807 +msgid "Operator" +msgstr "Operatore" + +#: describe.c:6808 +msgid "Strategy" +msgstr "Strategia" + +#: describe.c:6809 +msgid "ordering" +msgstr "ordinare" + +#: describe.c:6810 +msgid "search" +msgstr "ricerca" + +#: describe.c:6811 +msgid "Purpose" +msgstr "Scopo" + +#: describe.c:6816 +msgid "Sort opfamily" +msgstr "Ordina la famiglia" + +#: describe.c:6855 +msgid "List of operators of operator families" +msgstr "Elenco degli operatori delle famiglie di operatori" + +#: describe.c:6902 +msgid "Registered left type" +msgstr "Tipo sinistro registrato" + +#: describe.c:6903 +msgid "Registered right type" +msgstr "Tipo destro registrato" + +#: describe.c:6904 +msgid "Number" +msgstr "Numero" + +#: describe.c:6948 +msgid "List of support functions of operator families" +msgstr "Elenco delle funzioni di supporto delle famiglie di operatori" + +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Large object" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2127,13 +2437,11 @@ msgstr "" "psql è il terminale interattivo per PostgreSQL.\n" "\n" -#: help.c:74 help.c:345 help.c:419 help.c:462 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Utilizzo:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2141,37 +2449,32 @@ msgstr "" " psql [OPZIONI]... [NOME DB [NOME UTENTE]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Opzioni generali:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr "" " -c, --command=COMANDO esegue solamente un comando singolo (SQL o interno)\n" " e termina\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr "" " -d, --dbname=NOMEDB specifica il nome del database a cui connettersi\n" " (default: \"%s\")\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=NOME FILE esegui i comandi da un file ed esci\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l --list elenca i database disponibili ed esci\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2181,18 +2484,15 @@ msgstr "" " imposta la variabile psql NOME a VALORE\n" " (es.: -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostra informazioni sulla versione ed esci\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc non leggere il file di avvio (~/.psqlrc)\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2200,23 +2500,19 @@ msgstr "" " -1 (\"uno\"), --single-transaction\n" " esegui in un'unica transazione (se non interattivo)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=opzioni] mostra quest'aiuto ed esci\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands mostra la lista dei comandi backslash ed esci\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables mostra la lista delle variabili speciali ed esci\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2224,66 +2520,55 @@ msgstr "" "\n" "Opzioni di input e output:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all mostra tutti gli input dallo script\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors mostra i comandi falliti\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries mostra i comandi inviati al server\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden mostra le query generate dai comandi interni\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=NOME_FILE invia log di sessione al file\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline disabilita la modifica avanzata della riga\n" " di comando (readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" " -o, --output=NOME_FILE reindirizza i risultati al file specificato\n" " (oppure |pipe)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet esegui in modo silenzioso (nessun messaggio, solo\n" " risultati query)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step modalità passo singolo (conferma ogni query)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr "" " -S, --single-line modalità riga singola (la fine riga termina\n" " il comando SQL)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2291,12 +2576,15 @@ msgstr "" "\n" "Opzioni formato output:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align modo output tabelle disallineato\n" -#: help.c:111 +#: help.c:114 +msgid " --csv CSV (Comma-Separated Values) table output mode\n" +msgstr " --csv Modalità di output della tabella CSV (valori separati da virgola).\n" + +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2306,20 +2594,17 @@ msgstr "" " separatore di campo per output non allineato\n" " (default: \"%s\")\n" -#: help.c:114 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html modo output tabelle in HTML\n" -#: help.c:115 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=VAR[=ARG] imposta l'opzione di stampa VAR ad ARG (vedi anche\n" " il comando \\pset)\n" -#: help.c:116 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2328,25 +2613,21 @@ msgstr "" " separatore di record per output non allineato\n" " (default: \"a capo\")\n" -#: help.c:118 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only mostra solo le righe\n" -#: help.c:119 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" " -T, --table-attr=TESTO imposta gli attributi delle tabelle HTML\n" " (es: larghezza, bordo)\n" -#: help.c:120 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded attiva output tabelle espanso\n" -#: help.c:121 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2355,8 +2636,7 @@ msgstr "" " usa il byte zero come separatore di campo per l'output\n" " non allineato\n" -#: help.c:123 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2365,8 +2645,7 @@ msgstr "" " usa il byte zero come separatore di record per l'output\n" " non allineato\n" -#: help.c:126 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2374,41 +2653,38 @@ msgstr "" "\n" "Opzioni di connessione:\n" -#: help.c:129 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr "" " -h, --host=HOSTNAME host server del database o directory socket\n" " (default: \"%s\")\n" -#: help.c:130 +#: help.c:134 msgid "local socket" msgstr "sockect locale" -#: help.c:133 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORTA porta di ascolto del database (default: \"%s\")\n" -#: help.c:139 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=UTENTE nome utente del database (default: \"%s\")\n" -#: help.c:140 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password non chiedere mai le password\n" -#: help.c:141 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password forza la richiesta di una password (dovrebbe essere\n" " automatico)\n" -#: help.c:143 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2422,470 +2698,463 @@ msgstr "" "documentazione PostgreSQL.\n" "\n" -#: help.c:146 +#: help.c:148 #, c-format -msgid "Report bugs to .\n" -msgstr "Puoi segnalare eventuali bug a .\n" +msgid "Report bugs to <%s>.\n" +msgstr "Segnala i bug a <%s>.\n" -#: help.c:172 +#: help.c:149 #, c-format +msgid "%s home page: <%s>\n" +msgstr "%s pagina iniziale: <%s>\n" + +#: help.c:191 msgid "General\n" msgstr "Generali\n" -#: help.c:173 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright mostra i termini di uso e distribuzione di PostgreSQL\n" -#: help.c:174 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [COLONNE] esegui la query e mostra il risultato in crosstab\n" -#: help.c:175 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose mostra il messaggio di errore più recente alla massima loquacità\n" -#: help.c:176 -#, c-format -msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" +#: help.c:195 +msgid "" +" \\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 [FILE] o ; esegui la query (ed invia i risultati ad un file o\n" -" ad una |pipe)\n" +" \\g [(OPZIONI)] [FILE] esegue la query (e invia il risultato a file o |pipe);\n" +" \\g senza argomenti equivale a un punto e virgola\n" -#: help.c:177 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc descrivi il risultato della query, senza eseguirla\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec esegui la query, poi esegui ogni valore nel suo risultato\n" -#: help.c:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] esegui la query e salva il risultato in una variabile psql\n" -#: help.c:180 -#, c-format -msgid " \\gx [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\gx [FILE] come \\g, ma forza un modo di output espanso\n" +#: help.c:200 +msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" +msgstr "" +" \\gx [(OPZIONI)] [FILE] come \\g, ma forza la modalità di output espansa\n" +"\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q esci da psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] esegui una query ogni SEC secondi\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Aiuto\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] mostra aiuto sui comandi backslash\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options mostra aiuto sulle opzioni di riga di comando psql\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables mostra aiusto sulle variabili speciali\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr "" " \\h [NOME] mostra aiuto sulla sintassi dei comandi SQL, * mostra\n" " tutti i comandi\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Buffer Query\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [FILE] [RIGA] modifica il buffer della query (o il file) con\n" " l'editor esterno\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [FUNZIONE [RIGA]] modifica la definizione della funzione con l'editor\n" " esterno\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VISTA [LINE]] modifica la definizione della vista con un editor esterno\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p mostra i contenuti del buffer query\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r reimposta (cancella) il buffer query\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] mostra la cronologia salvala in un file\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE scrivi il buffer query su file\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Input/Output\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... esegui una SQL COPY con flusso di dati dal client\n" -#: help.c:207 -#, c-format -msgid " \\echo [STRING] write string to standard output\n" -msgstr " \\echo [STRINGA] stampa la stringa su standard output\n" +#: help.c:227 +msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" +msgstr " \\echo [-n] [STRING] scrive la stringa nello standard output (-n per nessuna nuova riga)\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE esegui i comandi dal file\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir FILE come \\i, ma relativo alla posizione nello script\n" " corrente\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [FILE] invia i risultati della query ad un file oppure\n" " una |pipe\n" -#: help.c:211 -#, c-format -msgid " \\qecho [STRING] write string to query output stream (see \\o)\n" +#: help.c:231 +msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" -" \\qecho [STRINGA] scrivi la stringa nello stream di output della query\n" -" (vedi \\o)\n" +" \\qecho [-n] [STRING] scrive la stringa in \\o flusso di output (-n per nessuna nuova riga)\n" +"\n" -#: help.c:214 -#, c-format +#: help.c:232 +msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" +msgstr " \\warn [-n] [STRING] scrive la stringa nell'errore standard (-n per nessuna nuova riga)\n" + +#: help.c:235 msgid "Conditional\n" msgstr "Condizionale\n" -#: help.c:215 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if ESPR inizia un blocco condizionale\n" -#: help.c:216 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif ESPR alternativa all'interno di un blocco condizionale\n" -#: help.c:217 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternativa finale in un blocco condizionale\n" -#: help.c:218 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif fine del blocco condizionale\n" -#: help.c:221 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Informativi\n" -#: help.c:222 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (opzioni: S = mostra gli oggetti di sistema, + = dettagli addizionali)\n" -#: help.c:223 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] elenca le tabelle, le viste e le sequenze\n" -#: help.c:224 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NOME descrive la tabella, vista, sequenza o indice\n" -#: help.c:225 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MODELLO] elenca le funzioni di aggregazione\n" -#: help.c:226 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MODELLO] elenca i metodi di accesso\n" -#: help.c:227 -#, c-format +#: help.c:248 +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] elenca le classi di operatori\n" + +#: help.c:249 +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] elenca le famiglie di operatori\n" + +#: help.c:250 +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] elenca gli operatori delle famiglie di operatori\n" + +#: help.c:251 +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] elenca le funzioni di supporto delle famiglie di operatori\n" + +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MODELLO] elenca i tablespace\n" -#: help.c:228 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MODELLO] elenca le conversioni di codifica\n" -#: help.c:229 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] elenca i parametri di configurazione\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MODELLO] elenca le conversioni di tipo\n" -#: help.c:230 -#, c-format +#: help.c:256 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [MODELLO] mostra la descrizione di oggetti non elencati altrove\n" -#: help.c:231 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MODELLO] elenca i domini\n" -#: help.c:232 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MODELLO] elenca i privilegi predefiniti\n" -#: help.c:233 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MODELLO] elenca le tabelle esterne\n" -#: help.c:234 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [MODELLO] elenca le tabelle esterne\n" - -#: help.c:235 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MODELLO] elenca i server esterni\n" -#: help.c:236 -#, c-format +#: help.c:261 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [MODELLO] elenca le tabelle esterne\n" + +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MODELLO] elenca le mappature degli utenti\n" -#: help.c:237 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MODELLO] elenca i wrapper di dati esterni\n" -#: help.c:238 -#, c-format -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [PATRN] elenca le funzioni [solo aggr/normali/procedure/trigger/finestra]\n" +#: help.c:264 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" elenco funzioni di [solo agg/normal/procedura/trigger/finestra]\n" -#: help.c:239 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MODELLO] elenca le configurazioni di ricerca testo\n" -#: help.c:240 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MODELLO] elenca i dizionari di ricerca testo\n" -#: help.c:241 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MODELLO] elenca gli analizzatori di ricerca testo\n" -#: help.c:242 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MODELLO] elenca i modelli di ricerca di testo\n" -#: help.c:243 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MODELLO] elenca i ruoli\n" -#: help.c:244 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MODELLO] elenca gli indici\n" -#: help.c:245 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl elenca i large object, stesso risultato di \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] elenca i large object, stesso risultato di \\lo_list\n" -#: help.c:246 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MODELLO] elenca i linguaggi procedurali\n" -#: help.c:247 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] elenca le viste materializzate\n" -#: help.c:248 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MODELLO] elenca gli schemi\n" -#: help.c:249 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [MODELLO] elenca gli operatori\n" +#: help.c:276 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" operatori di liste\n" -#: help.c:250 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MODELLO] elenca gli ordinamenti\n" -#: help.c:251 -#, c-format +#: help.c:279 msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr "" " \\dp [MODELLO] elenca i permessi di accesso alla tabella, vista\n" " o sequenza\n" -#: help.c:252 -#, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [MOD1 [MOD2]] elenca le impostazioni dei ruoli per database\n" +#: help.c:280 +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr " \\dP[itn+] [PATTERN] list [solo indice/tabella] relazioni partizionate [n=nidificato]\n" -#: help.c:253 -#, c-format +#: help.c:281 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] elenca le impostazioni del ruolo per database\n" + +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MODELLO] elenca le pubblicazioni di replica\n" -#: help.c:254 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MODELLO] elenca le sottoscrizioni di replica\n" -#: help.c:255 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MODELLO] elenca le sequenze\n" -#: help.c:256 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MODELLO] elenca le tabelle\n" -#: help.c:257 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MODELLO] elenca i tipi di dato\n" -#: help.c:258 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MODELLO] elenca i ruoli\n" -#: help.c:259 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MODELLO] elenca le viste\n" -#: help.c:260 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MODELLO] elenca le estensioni\n" -#: help.c:261 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] elenca i trigger di evento\n" +#: help.c:290 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] elenca le statistiche estese\n" -#: help.c:262 -#, c-format +#: help.c:291 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] elenca i trigger di evento\n" + +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] elenca i database\n" -#: help.c:263 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNZIONE mostra la definizione di una funzione\n" -#: help.c:264 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VISTA mostra la definizione di una vista\n" -#: help.c:265 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [MODELLO] uguale a \\dp\n" -#: help.c:268 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Large Object\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export FILE LOBOID scrive un oggetto di grandi dimensioni su un file\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENTO]\n" +" leggi oggetti di grandi dimensioni da file\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] elenca gli oggetti di grandi dimensioni\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID elimina un oggetto di grandi dimensioni\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Formattazione\n" -#: help.c:269 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a alterna tra modalità di output allineata e disallineata\n" -#: help.c:270 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [STRINGA] imposta nome tabella oppure elimina se la stringa\n" " non è specificata\n" -#: help.c:271 -#, c-format +#: help.c:309 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [STRINGA] mostra o imposta il separatore di campo per l'output\n" " query disallineato\n" -#: help.c:272 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H cambia modalità HTML (attualmente %s)\n" -#: help.c:274 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" -" (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n" -" footer|format|linestyle|null|numericlocale|pager|\n" -" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" -" tuples_only|unicode_border_linestyle|\n" -" unicode_column_linestyle|unicode_header_linestyle})\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" msgstr "" " \\pset [NOME [VALORE]] imposta opzioni di output tabella\n" " (NOME := {border|columns|expanded|fieldsep|fieldsep_zero|\n" @@ -2894,31 +3163,33 @@ msgstr "" " tuples_only|unicode_border_linestyle|\n" " unicode_column_linestyle|unicode_header_linestyle})\n" -#: help.c:280 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] mostra solo le righe (attualmente %s)\n" -#: help.c:282 -#, c-format +#: help.c:321 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [STRINGA] imposta gli attributi HTML di
, se non\n" " specificato allora annullali\n" -#: help.c:283 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr "" " \\x [on|off|auto] cambia modalità output espansa\n" " (attualmente %s)\n" -#: help.c:287 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Connessione\n" -#: help.c:289 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -2927,8 +3198,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connetti ad un nuovo database (attualmente \"%s\")\n" -#: help.c:293 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -2936,92 +3206,66 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connetti ad un nuovo database (nessuna connessione attiva)\n" -#: help.c:295 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo mostra le informazioni su la connessione corrente\n" -#: help.c:296 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [CODIFICA] mostra o imposta la codifica del client\n" -#: help.c:297 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [UTENTE] cambia la password per un utente in sicurezza\n" -#: help.c:300 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Sistema operativo\n" -#: help.c:301 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIRECTORY] cambia la directory di lavoro\n" -#: help.c:302 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR recupera la variabile di ambiente\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NOME [VALORE] imposta o elimina una variabile d'ambiente\n" -#: help.c:303 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr "" " \\timing [on|off] imposta cronometro dei comandi\n" " (attualmente %s)\n" -#: help.c:305 -#, c-format +#: help.c:345 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [COMANDO] esegui un comando in una shell oppure avvia una shell\n" " interattiva\n" -#: help.c:308 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Variabili\n" -#: help.c:309 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TESTO] NOME richiedi all'utente di impostare una variabile interna\n" -#: help.c:310 -#, c-format +#: help.c:350 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr "" " \\set [NOME [VALORE]] imposta una variabile interna, oppure mostrale tutte\n" " se non sono specificati parametri\n" -#: help.c:311 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOME cancella una variabile interna\n" -#: help.c:314 -#, c-format -msgid "Large Objects\n" -msgstr "Large Object\n" - -#: help.c:315 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENTO] \n" -" \\lo_list\n" -" \\lo_unlink LOBOID operazioni sui large object\n" - -#: help.c:342 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3029,13 +3273,11 @@ msgstr "" "Lista delle variabili speciali\n" "\n" -#: help.c:344 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "variabili psql:\n" -#: help.c:346 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3045,8 +3287,7 @@ msgstr "" " oppure \\set NOME VALORE dentro psql\n" "\n" -#: help.c:348 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3054,8 +3295,7 @@ msgstr "" " AUTOCOMMIT\n" " se impostato, i comandi SQL riusciti sono salvati automaticamente\n" -#: help.c:350 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3065,8 +3305,7 @@ msgstr "" " determina il caso usato per completare le parole chiave SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:353 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3074,8 +3313,7 @@ msgstr "" " DBNAME\n" " il nome del database attualmente connesso\n" -#: help.c:355 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3085,8 +3323,7 @@ msgstr "" " controlla quale input è scritto su standard output\n" " [all, errors, none, queries]\n" -#: help.c:358 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3096,8 +3333,7 @@ msgstr "" " se impostato, mostra le query interne dei comandi backslash;\n" " se impostato a \"noexec\", mostrale solo senza eseguirle\n" -#: help.c:361 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3105,8 +3341,7 @@ msgstr "" " ENCODING\n" " codifica del set di caratteri del client corrente\n" -#: help.c:363 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3114,8 +3349,7 @@ msgstr "" " ERROR\n" " true se l'ultima query è fallita, altrimenti false\n" -#: help.c:365 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3123,8 +3357,23 @@ msgstr "" " FETCH_COUNT\n" " il numero di righe del risultato da leggere e mostrare per volta (0 = tutte)\n" -#: help.c:367 -#, c-format +#: help.c:415 +msgid "" +" HIDE_TABLEAM\n" +" if set, table access methods are not displayed\n" +msgstr "" +" NASCONDI_TABELLA\n" +" se impostato, i metodi di accesso alla tabella non vengono visualizzati\n" + +#: help.c:417 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" se impostato, i metodi di compressione non vengono visualizzati\n" + +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3132,8 +3381,7 @@ msgstr "" " HISTCONTROL\n" " controlla la storia dei comandi [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:369 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3141,8 +3389,7 @@ msgstr "" " HISTFILE\n" " nome del file usato per memorizzare la storia dei comandi\n" -#: help.c:371 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3150,8 +3397,7 @@ msgstr "" " HISTSIZE\n" " numero massimo di comandi da salvare nella storia dei comandi\n" -#: help.c:373 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3159,8 +3405,7 @@ msgstr "" " HOST\n" " l'host del server del database attualmente connesso\n" -#: help.c:375 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3168,8 +3413,7 @@ msgstr "" " IGNOREEOF\n" " numero di EOF richiesti per terminare una sessione interattiva\n" -#: help.c:377 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3177,8 +3421,7 @@ msgstr "" " LASTOID\n" " valore dell'ultimo OID interessato\n" -#: help.c:379 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3188,8 +3431,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " messaggio e SQLSTATE dell'ultimo errore, o stringa vuota e \"00000\" se non c'è\n" -#: help.c:382 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3198,8 +3440,7 @@ msgstr "" " se impostato, un errore non termina una transazione (usa punti di\n" " salvataggio impliciti)\n" -#: help.c:384 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3207,8 +3448,7 @@ msgstr "" " ON_ERROR_STOP\n" " termina l'esecuzione batch dopo un errore\n" -#: help.c:386 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3216,8 +3456,7 @@ msgstr "" " PORT\n" " porta del server attualmente connesso\n" -#: help.c:388 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3225,8 +3464,7 @@ msgstr "" " PROMPT1\n" " specifica il prompt psql standard\n" -#: help.c:390 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3235,8 +3473,7 @@ msgstr "" " specifica il prompt usato quando un'istruzione continua da una riga\n" " precedente\n" -#: help.c:392 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3244,8 +3481,7 @@ msgstr "" " PROMPT3\n" " specifica il prompt usato in COPY ... FROM STDIN\n" -#: help.c:394 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3253,17 +3489,15 @@ msgstr "" " QUIET\n" " esegui silenziosamente (come con l'opzione -q)\n" -#: help.c:396 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" msgstr "" " ROW_COUNT\n" " numero di righe restituite o toccate dall'ultima query, o 0\n" - -#: help.c:398 -#, c-format + +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3273,8 +3507,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " versione del server (come stringa breve o formato numerico)\n" -#: help.c:401 -#, c-format +#: help.c:453 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" mostra tutti i risultati di una query combinata (\\;) anziché solo l'ultima\n" + +#: help.c:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3283,8 +3524,7 @@ msgstr "" " controlla la visualizzazione dei campi di contesto dei messaggi [never,\n" " errors, always]\n" -#: help.c:403 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3292,8 +3532,7 @@ msgstr "" " SINGLELINE\n" " se impostato, la fine riga termina i comandi SQL (come con l'opzione -S)\n" -#: help.c:405 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3301,8 +3540,7 @@ msgstr "" " SINGLESTEP\n" " modalità passo singolo (come con l'opzione -s)\n" -#: help.c:407 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3310,8 +3548,7 @@ msgstr "" " SQLSTATE\n" " il codice SQLSTATE dell'ultima query, o \"00000\" se non c'è stato errore\n" -#: help.c:409 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3319,18 +3556,15 @@ msgstr "" " USER\n" " l'utente database attualmente connesso\n" -#: help.c:411 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" -" controls verbosity of error reports [default, verbose, terse]\n" +" controls verbosity of error reports [default, verbose, terse, sqlstate]\n" msgstr "" -" VERBOSITY\n" -" controlla la loquacità della visualizzazione degli errori [default, verbose,\n" -" terse]\n" +" VERBOSITÀ\n" +" controlla la verbosità dei rapporti di errore [predefinito, dettagliato, conciso, sqlstate]\n" -#: help.c:413 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3342,8 +3576,7 @@ msgstr "" " VERSION_NUM\n" " la versione di psql (come stringa estesa, stringa breve, formato numerico)\n" -#: help.c:418 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3351,8 +3584,7 @@ msgstr "" "\n" "Impostazioni di visualizzazione:\n" -#: help.c:420 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3362,8 +3594,7 @@ msgstr "" " oppure \\pset NOME [VALORE] dentro psql\n" "\n" -#: help.c:422 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3371,8 +3602,7 @@ msgstr "" " border\n" " stile bordo (numero)\n" -#: help.c:424 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3380,8 +3610,7 @@ msgstr "" " columns\n" " larghezza destinazione per il formato wrapped\n" -#: help.c:426 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3389,7 +3618,7 @@ msgstr "" " expanded (o x)\n" " output espanso [on, off, auto]\n" -#: help.c:428 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3398,8 +3627,7 @@ msgstr "" " fieldsep\n" " separatore di campo per l'output non allineato (default \"%s\")\n" -#: help.c:431 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3407,8 +3635,7 @@ msgstr "" " fieldsep_zero\n" " imposta il separatore di campo per l'output non allineato al byte zero\n" -#: help.c:433 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3416,8 +3643,7 @@ msgstr "" " footer\n" " abilita o disabilita la visualizzazione del piè di pagina [on, off]\n" -#: help.c:435 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3426,8 +3652,7 @@ msgstr "" " imposta il formato di output [unaligned, aligned, wrapped, html, asciidoc,\n" " ...]\n" -#: help.c:437 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3436,8 +3661,7 @@ msgstr "" " imposta lo stile di disegno delle righe dei bordi [ascii, old-ascii,\n" " unicode]\n" -#: help.c:439 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3445,8 +3669,7 @@ msgstr "" " null\n" " imposta la stringa da visualizzare al posto dei valori null\n" -#: help.c:441 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3455,8 +3678,7 @@ msgstr "" " abilita i caratteri specifici per il locale per separare i gruppi di cifre\n" " [on, off]\n" -#: help.c:443 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3464,8 +3686,7 @@ msgstr "" " pager\n" " controlla quando usare la paginazione esterna [yes, no, always]\n" -#: help.c:445 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3473,8 +3694,7 @@ msgstr "" " recordsep\n" " separatore di record (riga) per l'output non allineato\n" -#: help.c:447 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3482,8 +3702,7 @@ msgstr "" " recordsep_zero\n" " imposta il separatore di campo per l'output non allineato al byte zero\n" -#: help.c:449 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3494,8 +3713,7 @@ msgstr "" " colonna proporzionale dei dati allineati a sinistra in formato\n" " latex-longtable\n" -#: help.c:452 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3503,8 +3721,7 @@ msgstr "" " title\n" " imposta il titolo della tabella per le tabelle stampate in seguito\n" -#: help.c:454 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3512,8 +3729,7 @@ msgstr "" " tuples_only\n" " se impostato, mostra solo i dati della tabella\n" -#: help.c:456 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3525,8 +3741,7 @@ msgstr "" " unicode_header_linestyle\n" " imposta lo stile di disegno delle righe Unicode [single, double]\n" -#: help.c:461 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3534,8 +3749,7 @@ msgstr "" "\n" "Variabili d'ambiente:\n" -#: help.c:465 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3545,8 +3759,7 @@ msgstr "" " oppure \\setenv NOME [VALORE] dentro psql\n" "\n" -#: help.c:467 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3558,8 +3771,7 @@ msgstr "" " oppure \\setenv NOME [VALORE] dentro psql\n" "\n" -#: help.c:470 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3567,8 +3779,7 @@ msgstr "" " COLUMNS\n" " numero di colonne per il formato wrapped\n" -#: help.c:472 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3576,8 +3787,7 @@ msgstr "" " PGAPPNAME\n" " come il parametro di connessione application_name\n" -#: help.c:474 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3585,8 +3795,7 @@ msgstr "" " PGDATABASE\n" " come il parametro di connessione dbname\n" -#: help.c:476 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3594,17 +3803,7 @@ msgstr "" " PGHOST\n" " come il parametro di connessione host\n" -#: help.c:478 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" password di connessione (uso non raccomandato)\n" - -#: help.c:480 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3612,8 +3811,15 @@ msgstr "" " PGPASSFILE\n" " nome del file delle password\n" -#: help.c:482 -#, c-format +#: help.c:534 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" password di connessione (uso non raccomandato)\n" + +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3621,8 +3827,7 @@ msgstr "" " PGPORT\n" " come il parametro di connessione port\n" -#: help.c:484 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3630,8 +3835,7 @@ msgstr "" " PGUSER\n" " come il parametro di connessione user\n" -#: help.c:486 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3639,8 +3843,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor usato dai comandi \\e, \\ef, \\ev\n" -#: help.c:488 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3648,8 +3851,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " come specificare un numero di riga quando si invoca l'editor\n" -#: help.c:490 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3657,8 +3859,7 @@ msgstr "" " PSQL_HISTORY\n" " posizione alternativa del file della storia dei comandi\n" -#: help.c:492 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3666,8 +3867,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " nome del programma di paginazione esterno\n" -#: help.c:494 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" nome del programma di paginazione esterno\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3675,8 +3883,7 @@ msgstr "" " PSQLRC\n" " posizione alternativa del file .psqlrc dell'utente\n" -#: help.c:496 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3684,8 +3891,7 @@ msgstr "" " SHELL\n" " shell usata dal comando \\!\n" -#: help.c:498 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3693,11 +3899,11 @@ msgstr "" " TMPDIR\n" " directory per i file temporanei\n" -#: help.c:542 +#: help.c:616 msgid "Available help:\n" msgstr "Aiuti disponibili:\n" -#: help.c:626 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -3705,14 +3911,19 @@ msgid "" "Syntax:\n" "%s\n" "\n" +"URL: %s\n" +"\n" msgstr "" "Comando: %s\n" "Descrizione: %s\n" "Sintassi:\n" "%s\n" "\n" +"URL: %s\n" +"\n" +"\n" -#: help.c:642 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3721,55 +3932,47 @@ msgstr "" "Nessun aiuto disponibile per \"%s\".\n" "Prova a digitare \\h senza parametri per vedere gli aiuti disponibili.\n" -#: input.c:216 +#: input.c:217 #, c-format -msgid "could not read from input file: %s\n" -msgstr "lettura dal file di input fallita: %s\n" +msgid "could not read from input file: %m" +msgstr "impossibile leggere dal file di input: %m" -#: input.c:471 input.c:510 +#: input.c:478 input.c:516 #, c-format -msgid "could not save history to file \"%s\": %s\n" -msgstr "salvataggio della cronologia nel file \"%s\" fallita: %s\n" +msgid "could not save history to file \"%s\": %m" +msgstr "impossibile salvare la cronologia nel file \"%s\": %m" -#: input.c:530 +#: input.c:535 #, c-format -msgid "history is not supported by this installation\n" -msgstr "history non è supportata da questa installazione\n" +msgid "history is not supported by this installation" +msgstr "la cronologia non è supportata da questa installazione" -#: large_obj.c:64 +#: large_obj.c:65 #, c-format -msgid "%s: not connected to a database\n" -msgstr "%s: non connesso ad un database\n" +msgid "%s: not connected to a database" +msgstr "%s: non connesso ad un database" -#: large_obj.c:83 +#: large_obj.c:84 #, c-format -msgid "%s: current transaction is aborted\n" -msgstr "%s: questa transazione è stata interrotta\n" +msgid "%s: current transaction is aborted" +msgstr "%s: questa transazione è stata interrotta" -#: large_obj.c:86 +#: large_obj.c:87 #, c-format -msgid "%s: unknown transaction status\n" -msgstr "%s: stato della transazione sconosciuto\n" +msgid "%s: unknown transaction status" +msgstr "%s: stato della transazione sconosciuto" -#: large_obj.c:287 large_obj.c:298 -msgid "ID" -msgstr "ID" - -#: large_obj.c:308 -msgid "Large objects" -msgstr "Large object" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format -msgid "\\if: escaped\n" -msgstr "\\if: uscita\n" +msgid "\\if: escaped" +msgstr "\\if: escapato" -#: mainloop.c:183 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Utilizza \"\\q\" per uscire %s.\n" -#: mainloop.c:205 +#: 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" @@ -3777,19 +3980,19 @@ msgstr "" "L'input è un file di dump in formato PostgreSQL.\n" "Usa il tool di riga di comando pg_restore per ripristinare questo dump in un database.\n" -#: mainloop.c:282 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "Usa \\? per avere un aiuto o premi control-C per svuotare il buffer di input." -#: mainloop.c:284 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "Usa \\? per avere un aiuto." -#: mainloop.c:288 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "Stai utilizzando psql, l'interfaccia a riga di comando di PostgreSQL." -#: mainloop.c:289 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -3804,2273 +4007,2455 @@ msgstr "" " \\g o termina con punto e virgola per eseguire la query\n" " \\q per uscire\n" -#: mainloop.c:313 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "Usa \\q per uscire." -#: mainloop.c:316 mainloop.c:340 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "Usa control-D per uscire." -#: mainloop.c:318 mainloop.c:342 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "Usa control-C per uscire." -#: mainloop.c:449 mainloop.c:591 +#: mainloop.c:459 mainloop.c:618 #, c-format -msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block\n" -msgstr "query ignorata: usa \\endif o Ctrl-C per uscire dal blocco \\if corrente\n" +msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "query ignorata: usa \\endif o Ctrl-C per uscire dal blocco \\if corrente" -#: mainloop.c:609 +#: mainloop.c:636 #, c-format -msgid "reached EOF without finding closing \\endif(s)\n" -msgstr "raggiunta fine file senza aver trovato \\endif finali\n" +msgid "reached EOF without finding closing \\endif(s)" +msgstr "raggiunta fine file senza aver trovato \\endif finali" -#: psqlscanslash.l:637 +#: psqlscanslash.l:638 #, c-format -msgid "unterminated quoted string\n" -msgstr "stringa tra virgolette non terminata\n" +msgid "unterminated quoted string" +msgstr "stringa tra virgolette non terminata" -#: psqlscanslash.l:810 +#: psqlscanslash.l:811 #, c-format -msgid "%s: out of memory\n" -msgstr "%s: memoria esaurita\n" +msgid "%s: out of memory" +msgstr "%s: memoria esaurita" #: 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:441 sql_help.c:443 -#: sql_help.c:446 sql_help.c:448 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:587 sql_help.c:589 sql_help.c:591 -#: sql_help.c:593 sql_help.c:595 sql_help.c:598 sql_help.c:600 sql_help.c:603 -#: sql_help.c:614 sql_help.c:616 sql_help.c:657 sql_help.c:659 sql_help.c:661 -#: sql_help.c:664 sql_help.c:666 sql_help.c:668 sql_help.c:701 sql_help.c:705 -#: sql_help.c:709 sql_help.c:728 sql_help.c:731 sql_help.c:734 sql_help.c:763 -#: sql_help.c:775 sql_help.c:783 sql_help.c:786 sql_help.c:789 sql_help.c:804 -#: sql_help.c:807 sql_help.c:836 sql_help.c:841 sql_help.c:846 sql_help.c:851 -#: sql_help.c:856 sql_help.c:878 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:887 sql_help.c:889 sql_help.c:930 sql_help.c:974 sql_help.c:979 -#: sql_help.c:984 sql_help.c:989 sql_help.c:994 sql_help.c:1013 sql_help.c:1024 -#: sql_help.c:1026 sql_help.c:1045 sql_help.c:1055 sql_help.c:1057 -#: sql_help.c:1059 sql_help.c:1071 sql_help.c:1075 sql_help.c:1077 -#: sql_help.c:1088 sql_help.c:1090 sql_help.c:1092 sql_help.c:1108 -#: sql_help.c:1110 sql_help.c:1114 sql_help.c:1117 sql_help.c:1118 -#: sql_help.c:1119 sql_help.c:1122 sql_help.c:1124 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:1387 -#: sql_help.c:1389 sql_help.c:1391 sql_help.c:1394 sql_help.c:1415 -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:1424 sql_help.c:1428 -#: sql_help.c:1430 sql_help.c:1432 sql_help.c:1434 sql_help.c:1448 -#: sql_help.c:1451 sql_help.c:1453 sql_help.c:1455 sql_help.c:1465 -#: sql_help.c:1467 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489 -#: sql_help.c:1492 sql_help.c:1514 sql_help.c:1516 sql_help.c:1518 -#: sql_help.c:1521 sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 -#: sql_help.c:1578 sql_help.c:1620 sql_help.c:1623 sql_help.c:1625 -#: sql_help.c:1627 sql_help.c:1629 sql_help.c:1631 sql_help.c:1634 -#: sql_help.c:1681 sql_help.c:1697 sql_help.c:1918 sql_help.c:1987 -#: sql_help.c:2006 sql_help.c:2019 sql_help.c:2075 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:2275 sql_help.c:2316 sql_help.c:2339 -#: sql_help.c:2360 sql_help.c:2361 sql_help.c:2396 sql_help.c:2416 -#: sql_help.c:2438 sql_help.c:2452 sql_help.c:2472 sql_help.c:2495 -#: sql_help.c:2525 sql_help.c:2550 sql_help.c:2596 sql_help.c:2867 -#: sql_help.c:2880 sql_help.c:2897 sql_help.c:2913 sql_help.c:2953 -#: sql_help.c:3005 sql_help.c:3009 sql_help.c:3011 sql_help.c:3017 -#: sql_help.c:3035 sql_help.c:3062 sql_help.c:3097 sql_help.c:3109 -#: sql_help.c:3118 sql_help.c:3162 sql_help.c:3176 sql_help.c:3204 -#: sql_help.c:3212 sql_help.c:3220 sql_help.c:3228 sql_help.c:3236 -#: sql_help.c:3244 sql_help.c:3252 sql_help.c:3260 sql_help.c:3269 -#: sql_help.c:3280 sql_help.c:3288 sql_help.c:3296 sql_help.c:3304 -#: sql_help.c:3312 sql_help.c:3322 sql_help.c:3331 sql_help.c:3340 -#: sql_help.c:3348 sql_help.c:3358 sql_help.c:3369 sql_help.c:3377 -#: sql_help.c:3386 sql_help.c:3397 sql_help.c:3406 sql_help.c:3414 -#: sql_help.c:3422 sql_help.c:3430 sql_help.c:3438 sql_help.c:3446 -#: sql_help.c:3454 sql_help.c:3462 sql_help.c:3470 sql_help.c:3478 -#: sql_help.c:3486 sql_help.c:3503 sql_help.c:3512 sql_help.c:3520 -#: sql_help.c:3537 sql_help.c:3552 sql_help.c:3820 sql_help.c:3871 -#: sql_help.c:3900 sql_help.c:3908 sql_help.c:4341 sql_help.c:4389 -#: sql_help.c:4530 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4031 +#: sql_help.c:4142 sql_help.c:4171 sql_help.c:4186 sql_help.c:4689 +#: sql_help.c:4737 sql_help.c:4895 msgid "name" msgstr "nome" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1768 -#: sql_help.c:3177 sql_help.c:4127 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4457 msgid "aggregate_signature" msgstr "signature_aggregato" -#: 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:447 sql_help.c:524 sql_help.c:570 -#: sql_help.c:588 sql_help.c:615 sql_help.c:665 sql_help.c:730 sql_help.c:785 -#: sql_help.c:806 sql_help.c:845 sql_help.c:890 sql_help.c:931 sql_help.c:983 -#: sql_help.c:1015 sql_help.c:1025 sql_help.c:1058 sql_help.c:1078 -#: sql_help.c:1091 sql_help.c:1125 sql_help.c:1266 sql_help.c:1388 -#: sql_help.c:1431 sql_help.c:1452 sql_help.c:1466 sql_help.c:1478 -#: sql_help.c:1491 sql_help.c:1522 sql_help.c:1579 sql_help.c:1628 +#: 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 "nuovo_nome" -#: 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:483 sql_help.c:529 sql_help.c:617 -#: sql_help.c:626 sql_help.c:684 sql_help.c:704 sql_help.c:733 sql_help.c:788 -#: sql_help.c:850 sql_help.c:888 sql_help.c:988 sql_help.c:1027 sql_help.c:1056 -#: sql_help.c:1076 sql_help.c:1089 sql_help.c:1123 sql_help.c:1326 -#: sql_help.c:1390 sql_help.c:1433 sql_help.c:1454 sql_help.c:1517 -#: sql_help.c:1626 sql_help.c:2853 +#: 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:3011 msgid "new_owner" msgstr "nuovo_proprietario" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:449 sql_help.c:534 sql_help.c:667 sql_help.c:708 sql_help.c:736 -#: sql_help.c:791 sql_help.c:855 sql_help.c:993 sql_help.c:1060 sql_help.c:1093 -#: sql_help.c:1268 sql_help.c:1435 sql_help.c:1456 sql_help.c:1468 -#: sql_help.c:1480 sql_help.c:1524 sql_help.c:1630 +#: 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 "nuovo_schema" -#: sql_help.c:44 sql_help.c:1832 sql_help.c:3178 sql_help.c:4156 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4486 msgid "where aggregate_signature is:" msgstr "dove signature_aggregato è:" -#: 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:837 -#: sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857 sql_help.c:975 -#: sql_help.c:980 sql_help.c:985 sql_help.c:990 sql_help.c:995 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:1988 sql_help.c:2007 sql_help.c:2010 -#: sql_help.c:2276 sql_help.c:2473 sql_help.c:3179 sql_help.c:3182 -#: sql_help.c:3185 sql_help.c:3270 sql_help.c:3359 sql_help.c:3387 -#: sql_help.c:3705 sql_help.c:4038 sql_help.c:4133 sql_help.c:4140 -#: sql_help.c:4146 sql_help.c:4157 sql_help.c:4160 sql_help.c:4163 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3906 sql_help.c:4356 sql_help.c:4463 +#: sql_help.c:4470 sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 +#: sql_help.c:4493 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: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:1787 -#: sql_help.c:1804 sql_help.c:1810 sql_help.c:1834 sql_help.c:1837 -#: sql_help.c:1840 sql_help.c:1989 sql_help.c:2008 sql_help.c:2011 -#: sql_help.c:2277 sql_help.c:2474 sql_help.c:3180 sql_help.c:3183 -#: sql_help.c:3186 sql_help.c:3271 sql_help.c:3360 sql_help.c:3388 -#: sql_help.c:4134 sql_help.c:4141 sql_help.c:4147 sql_help.c:4158 -#: sql_help.c:4161 sql_help.c:4164 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4464 sql_help.c:4471 sql_help.c:4477 +#: sql_help.c:4488 sql_help.c:4491 sql_help.c:4494 msgid "argname" msgstr "nome_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: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:1788 -#: sql_help.c:1805 sql_help.c:1811 sql_help.c:1835 sql_help.c:1838 -#: sql_help.c:1841 sql_help.c:2278 sql_help.c:2475 sql_help.c:3181 -#: sql_help.c:3184 sql_help.c:3187 sql_help.c:3272 sql_help.c:3361 -#: sql_help.c:3389 sql_help.c:4135 sql_help.c:4142 sql_help.c:4148 -#: sql_help.c:4159 sql_help.c:4162 sql_help.c:4165 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4465 sql_help.c:4472 +#: sql_help.c:4478 sql_help.c:4489 sql_help.c:4492 sql_help.c:4495 msgid "argtype" msgstr "tipo_arg" -#: sql_help.c:112 sql_help.c:394 sql_help.c:472 sql_help.c:484 sql_help.c:925 -#: sql_help.c:1073 sql_help.c:1449 sql_help.c:1573 sql_help.c:1605 -#: sql_help.c:1652 sql_help.c:1889 sql_help.c:1895 sql_help.c:2186 -#: sql_help.c:2227 sql_help.c:2234 sql_help.c:2243 sql_help.c:2317 -#: sql_help.c:2526 sql_help.c:2618 sql_help.c:2882 sql_help.c:3063 -#: sql_help.c:3085 sql_help.c:3572 sql_help.c:3739 sql_help.c:4588 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3950 sql_help.c:4185 sql_help.c:4958 msgid "option" msgstr "opzione" -#: sql_help.c:113 sql_help.c:926 sql_help.c:1574 sql_help.c:2318 -#: sql_help.c:2527 sql_help.c:3064 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "dove opzione può essere:" -#: sql_help.c:114 sql_help.c:2118 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "permetti_conn" -#: sql_help.c:115 sql_help.c:927 sql_help.c:1575 sql_help.c:2119 -#: sql_help.c:2528 sql_help.c:3065 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "limite_conn" -#: sql_help.c:116 sql_help.c:2120 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "è_template" -#: sql_help.c:122 sql_help.c:605 sql_help.c:670 sql_help.c:1271 sql_help.c:1319 +#: 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:4189 msgid "new_tablespace" msgstr "nuovo_tablespace" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:543 sql_help.c:545 -#: sql_help.c:546 sql_help.c:862 sql_help.c:864 sql_help.c:865 sql_help.c:934 -#: sql_help.c:938 sql_help.c:941 sql_help.c:1002 sql_help.c:1004 -#: sql_help.c:1005 sql_help.c:1136 sql_help.c:1139 sql_help.c:1582 -#: sql_help.c:1586 sql_help.c:1589 sql_help.c:2287 sql_help.c:2479 -#: sql_help.c:3925 sql_help.c:4330 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3918 sql_help.c:4207 sql_help.c:4368 sql_help.c:4677 msgid "configuration_parameter" msgstr "parametro_config" -#: sql_help.c:125 sql_help.c:395 sql_help.c:467 sql_help.c:473 sql_help.c:485 -#: sql_help.c:544 sql_help.c:597 sql_help.c:676 sql_help.c:682 sql_help.c:863 -#: sql_help.c:886 sql_help.c:935 sql_help.c:1003 sql_help.c:1074 -#: sql_help.c:1113 sql_help.c:1116 sql_help.c:1121 sql_help.c:1137 -#: sql_help.c:1138 sql_help.c:1301 sql_help.c:1321 sql_help.c:1371 -#: sql_help.c:1393 sql_help.c:1450 sql_help.c:1583 sql_help.c:1606 -#: sql_help.c:2187 sql_help.c:2228 sql_help.c:2235 sql_help.c:2244 -#: sql_help.c:2288 sql_help.c:2289 sql_help.c:2348 sql_help.c:2380 -#: sql_help.c:2480 sql_help.c:2481 sql_help.c:2498 sql_help.c:2619 -#: sql_help.c:2649 sql_help.c:2749 sql_help.c:2761 sql_help.c:2774 -#: sql_help.c:2817 sql_help.c:2839 sql_help.c:2856 sql_help.c:2883 -#: sql_help.c:3086 sql_help.c:3740 sql_help.c:4331 sql_help.c:4332 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3951 sql_help.c:4678 +#: sql_help.c:4679 sql_help.c:4680 sql_help.c:4681 msgid "value" msgstr "valore" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "ruolo_destinazione" -#: sql_help.c:198 sql_help.c:2170 sql_help.c:2574 sql_help.c:2579 -#: sql_help.c:3687 sql_help.c:3694 sql_help.c:3708 sql_help.c:3714 -#: sql_help.c:4020 sql_help.c:4027 sql_help.c:4041 sql_help.c:4047 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3881 sql_help.c:3890 +#: sql_help.c:3909 sql_help.c:3921 sql_help.c:4331 sql_help.c:4340 +#: sql_help.c:4359 sql_help.c:4371 msgid "schema_name" msgstr "nome_schema" -#: sql_help.c:199 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" msgstr "grant_o_revoke_abbreviato" -#: sql_help.c:200 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "dove grant_o_revoke_abbreviato è uno di:" -#: 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:568 sql_help.c:604 sql_help.c:669 sql_help.c:809 sql_help.c:945 -#: sql_help.c:1270 sql_help.c:1593 sql_help.c:2321 sql_help.c:2322 -#: sql_help.c:2323 sql_help.c:2324 sql_help.c:2325 sql_help.c:2454 -#: sql_help.c:2531 sql_help.c:2532 sql_help.c:2533 sql_help.c:2534 -#: sql_help.c:2535 sql_help.c:3068 sql_help.c:3069 sql_help.c:3070 -#: sql_help.c:3071 sql_help.c:3072 sql_help.c:3721 sql_help.c:3722 -#: sql_help.c:3723 sql_help.c:4021 sql_help.c:4025 sql_help.c:4028 -#: sql_help.c:4030 sql_help.c:4032 sql_help.c:4034 sql_help.c:4036 -#: sql_help.c:4042 sql_help.c:4044 sql_help.c:4046 sql_help.c:4048 -#: sql_help.c:4050 sql_help.c:4052 sql_help.c:4053 sql_help.c:4054 -#: sql_help.c:4351 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3930 sql_help.c:3934 +#: sql_help.c:4380 sql_help.c:4384 sql_help.c:4699 msgid "role_name" msgstr "nome_ruolo" -#: sql_help.c:236 sql_help.c:460 sql_help.c:1286 sql_help.c:1288 -#: sql_help.c:1339 sql_help.c:1350 sql_help.c:1375 sql_help.c:1622 -#: sql_help.c:2139 sql_help.c:2143 sql_help.c:2247 sql_help.c:2251 -#: sql_help.c:2343 sql_help.c:2745 sql_help.c:2757 sql_help.c:2770 -#: sql_help.c:2778 sql_help.c:2789 sql_help.c:2821 sql_help.c:3771 -#: sql_help.c:3786 sql_help.c:3788 sql_help.c:4216 sql_help.c:4217 -#: sql_help.c:4226 sql_help.c:4267 sql_help.c:4268 sql_help.c:4269 -#: sql_help.c:4270 sql_help.c:4271 sql_help.c:4272 sql_help.c:4305 -#: sql_help.c:4306 sql_help.c:4311 sql_help.c:4316 sql_help.c:4455 -#: sql_help.c:4456 sql_help.c:4465 sql_help.c:4506 sql_help.c:4507 -#: sql_help.c:4508 sql_help.c:4509 sql_help.c:4510 sql_help.c:4511 -#: sql_help.c:4558 sql_help.c:4560 sql_help.c:4606 sql_help.c:4662 -#: sql_help.c:4663 sql_help.c:4672 sql_help.c:4713 sql_help.c:4714 -#: sql_help.c:4715 sql_help.c:4716 sql_help.c:4717 sql_help.c:4718 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3982 +#: sql_help.c:3997 sql_help.c:3999 sql_help.c:4086 sql_help.c:4089 +#: sql_help.c:4091 sql_help.c:4550 sql_help.c:4551 sql_help.c:4560 +#: sql_help.c:4607 sql_help.c:4608 sql_help.c:4609 sql_help.c:4610 +#: sql_help.c:4611 sql_help.c:4612 sql_help.c:4652 sql_help.c:4653 +#: sql_help.c:4658 sql_help.c:4663 sql_help.c:4807 sql_help.c:4808 +#: sql_help.c:4817 sql_help.c:4864 sql_help.c:4865 sql_help.c:4866 +#: sql_help.c:4867 sql_help.c:4868 sql_help.c:4869 sql_help.c:4923 +#: sql_help.c:4925 sql_help.c:4985 sql_help.c:5045 sql_help.c:5046 +#: sql_help.c:5055 sql_help.c:5102 sql_help.c:5103 sql_help.c:5104 +#: sql_help.c:5105 sql_help.c:5106 sql_help.c:5107 msgid "expression" msgstr "espressione" -#: sql_help.c:239 +#: sql_help.c:242 msgid "domain_constraint" msgstr "vincolo_di_dominio" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:475 sql_help.c:476 -#: sql_help.c:1263 sql_help.c:1307 sql_help.c:1308 sql_help.c:1309 -#: sql_help.c:1338 sql_help.c:1349 sql_help.c:1366 sql_help.c:1774 -#: sql_help.c:1776 sql_help.c:2142 sql_help.c:2246 sql_help.c:2250 -#: sql_help.c:2777 sql_help.c:2788 sql_help.c:3783 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3994 msgid "constraint_name" msgstr "nome_vincolo" -#: sql_help.c:244 sql_help.c:1264 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nuovo_nome_vincolo" -#: sql_help.c:317 sql_help.c:1072 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "nuova_versione" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "oggetto_membro" -#: sql_help.c:324 +#: sql_help.c:327 msgid "where member_object is:" msgstr "dove oggetto_membro è:" -#: 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:1766 sql_help.c:1771 sql_help.c:1778 -#: sql_help.c:1779 sql_help.c:1780 sql_help.c:1781 sql_help.c:1782 -#: sql_help.c:1783 sql_help.c:1784 sql_help.c:1789 sql_help.c:1791 -#: sql_help.c:1795 sql_help.c:1797 sql_help.c:1801 sql_help.c:1806 -#: sql_help.c:1807 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:1823 sql_help.c:1824 -#: sql_help.c:1829 sql_help.c:1830 sql_help.c:4123 sql_help.c:4128 -#: sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 sql_help.c:4137 -#: sql_help.c:4138 sql_help.c:4143 sql_help.c:4144 sql_help.c:4149 -#: sql_help.c:4150 sql_help.c:4151 sql_help.c:4152 sql_help.c:4153 -#: sql_help.c:4154 +#: 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:4453 sql_help.c:4458 +#: sql_help.c:4459 sql_help.c:4460 sql_help.c:4461 sql_help.c:4467 +#: sql_help.c:4468 sql_help.c:4473 sql_help.c:4474 sql_help.c:4479 +#: sql_help.c:4480 sql_help.c:4481 sql_help.c:4482 sql_help.c:4483 +#: sql_help.c:4484 msgid "object_name" msgstr "nome_oggetto" -#: sql_help.c:326 sql_help.c:1767 sql_help.c:4126 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4456 msgid "aggregate_name" msgstr "nome_aggregato" -#: sql_help.c:328 sql_help.c:1769 sql_help.c:2053 sql_help.c:2057 -#: sql_help.c:2059 sql_help.c:3195 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "tipo_sorgente" -#: sql_help.c:329 sql_help.c:1770 sql_help.c:2054 sql_help.c:2058 -#: sql_help.c:2060 sql_help.c:3196 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "tipo_destinazione" -#: sql_help.c:336 sql_help.c:773 sql_help.c:1785 sql_help.c:2055 -#: sql_help.c:2094 sql_help.c:2157 sql_help.c:2397 sql_help.c:2428 -#: sql_help.c:2959 sql_help.c:4037 sql_help.c:4132 sql_help.c:4245 -#: sql_help.c:4249 sql_help.c:4253 sql_help.c:4256 sql_help.c:4484 -#: sql_help.c:4488 sql_help.c:4492 sql_help.c:4495 sql_help.c:4691 -#: sql_help.c:4695 sql_help.c:4699 sql_help.c:4702 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4355 sql_help.c:4462 sql_help.c:4579 +#: sql_help.c:4583 sql_help.c:4587 sql_help.c:4590 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4844 sql_help.c:4847 sql_help.c:5074 +#: sql_help.c:5078 sql_help.c:5082 sql_help.c:5085 msgid "function_name" msgstr "nome_funzione" -#: sql_help.c:341 sql_help.c:766 sql_help.c:1792 sql_help.c:2421 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "nome_operatore" -#: sql_help.c:342 sql_help.c:702 sql_help.c:706 sql_help.c:710 sql_help.c:1793 -#: sql_help.c:2398 sql_help.c:3313 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "tipo_sx" -#: sql_help.c:343 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1794 -#: sql_help.c:2399 sql_help.c:3314 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "tipo_dx" -#: sql_help.c:345 sql_help.c:347 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:1355 sql_help.c:1796 sql_help.c:1798 sql_help.c:2418 -#: sql_help.c:2439 sql_help.c:2794 sql_help.c:3323 sql_help.c:3332 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "metodo_indice" -#: sql_help.c:349 sql_help.c:1802 sql_help.c:4139 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4469 msgid "procedure_name" msgstr "nome_procedura" -#: sql_help.c:353 sql_help.c:1808 sql_help.c:3704 sql_help.c:4145 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3905 sql_help.c:4475 msgid "routine_name" msgstr "nome_routine" -#: sql_help.c:365 sql_help.c:1325 sql_help.c:1825 sql_help.c:2284 -#: sql_help.c:2478 sql_help.c:2752 sql_help.c:2926 sql_help.c:3494 -#: sql_help.c:3718 sql_help.c:4051 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3927 sql_help.c:4377 msgid "type_name" msgstr "nome_di_tipo" -#: sql_help.c:366 sql_help.c:1826 sql_help.c:2283 sql_help.c:2477 -#: sql_help.c:2927 sql_help.c:3153 sql_help.c:3495 sql_help.c:3710 -#: sql_help.c:4043 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3912 +#: sql_help.c:4362 msgid "lang_name" msgstr "nome_linguaggio" -#: sql_help.c:369 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "e signature_aggregato è:" -#: sql_help.c:392 sql_help.c:1920 sql_help.c:2184 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "funzione_handler" -#: sql_help.c:393 sql_help.c:2185 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "funzione_validazione" -#: sql_help.c:442 sql_help.c:519 sql_help.c:658 sql_help.c:840 sql_help.c:978 -#: sql_help.c:1258 sql_help.c:1346 sql_help.c:1347 sql_help.c:1363 -#: sql_help.c:1364 sql_help.c:1515 sql_help.c:2785 sql_help.c:2786 -#: sql_help.c:2802 sql_help.c:2803 +#: 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 "azione" -#: sql_help.c:444 sql_help.c:451 sql_help.c:455 sql_help.c:456 sql_help.c:459 -#: sql_help.c:461 sql_help.c:462 sql_help.c:463 sql_help.c:465 sql_help.c:468 -#: sql_help.c:470 sql_help.c:471 sql_help.c:662 sql_help.c:672 sql_help.c:674 -#: sql_help.c:677 sql_help.c:679 sql_help.c:1054 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:1351 sql_help.c:1353 sql_help.c:1360 -#: sql_help.c:1369 sql_help.c:1374 sql_help.c:1621 sql_help.c:1624 -#: sql_help.c:1658 sql_help.c:1773 sql_help.c:1886 sql_help.c:1891 -#: sql_help.c:1905 sql_help.c:1906 sql_help.c:1907 sql_help.c:2225 -#: sql_help.c:2238 sql_help.c:2281 sql_help.c:2342 sql_help.c:2346 -#: sql_help.c:2378 sql_help.c:2604 sql_help.c:2632 sql_help.c:2633 -#: sql_help.c:2736 sql_help.c:2744 sql_help.c:2753 sql_help.c:2756 -#: sql_help.c:2765 sql_help.c:2769 sql_help.c:2790 sql_help.c:2792 -#: sql_help.c:2799 sql_help.c:2815 sql_help.c:2820 sql_help.c:2837 -#: sql_help.c:2962 sql_help.c:3098 sql_help.c:3689 sql_help.c:3690 -#: sql_help.c:3770 sql_help.c:3785 sql_help.c:3787 sql_help.c:3789 -#: sql_help.c:4022 sql_help.c:4023 sql_help.c:4125 sql_help.c:4276 -#: sql_help.c:4515 sql_help.c:4557 sql_help.c:4559 sql_help.c:4561 -#: sql_help.c:4594 sql_help.c:4722 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3884 +#: sql_help.c:3885 sql_help.c:3981 sql_help.c:3996 sql_help.c:3998 +#: sql_help.c:4000 sql_help.c:4085 sql_help.c:4088 sql_help.c:4090 +#: sql_help.c:4334 sql_help.c:4335 sql_help.c:4455 sql_help.c:4616 +#: sql_help.c:4622 sql_help.c:4624 sql_help.c:4873 sql_help.c:4879 +#: sql_help.c:4881 sql_help.c:4922 sql_help.c:4924 sql_help.c:4926 +#: sql_help.c:4973 sql_help.c:5111 sql_help.c:5117 sql_help.c:5119 msgid "column_name" msgstr "nome_colonna" -#: sql_help.c:445 sql_help.c:663 sql_help.c:1261 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 msgid "new_column_name" msgstr "nuovo_nome_colonna" -#: sql_help.c:450 sql_help.c:540 sql_help.c:671 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1277 sql_help.c:1531 +#: 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 "dove azione è una di:" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1046 sql_help.c:1279 -#: sql_help.c:1284 sql_help.c:1533 sql_help.c:1537 sql_help.c:2137 -#: sql_help.c:2226 sql_help.c:2417 sql_help.c:2597 sql_help.c:2737 -#: sql_help.c:3007 sql_help.c:3872 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4143 msgid "data_type" msgstr "tipo_di_dato" -#: sql_help.c:453 sql_help.c:458 sql_help.c:1280 sql_help.c:1285 -#: sql_help.c:1534 sql_help.c:1538 sql_help.c:2138 sql_help.c:2229 -#: sql_help.c:2344 sql_help.c:2738 sql_help.c:2746 sql_help.c:2758 -#: sql_help.c:2771 sql_help.c:3008 sql_help.c:3014 sql_help.c:3780 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3991 msgid "collation" msgstr "ordinamento" -#: sql_help.c:454 sql_help.c:1281 sql_help.c:2230 sql_help.c:2239 -#: sql_help.c:2739 sql_help.c:2754 sql_help.c:2766 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "vincolo_di_colonna" -#: sql_help.c:464 sql_help.c:602 sql_help.c:673 sql_help.c:1298 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4970 msgid "integer" msgstr "intero" -#: sql_help.c:466 sql_help.c:469 sql_help.c:675 sql_help.c:678 sql_help.c:1300 -#: sql_help.c:1303 +#: 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 "opzione_attributo" -#: sql_help.c:474 sql_help.c:1305 sql_help.c:2231 sql_help.c:2240 -#: sql_help.c:2740 sql_help.c:2755 sql_help.c:2767 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 msgid "table_constraint" msgstr "vincoli_di_tabella" -#: sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:480 sql_help.c:1310 -#: sql_help.c:1311 sql_help.c:1312 sql_help.c:1313 sql_help.c:1827 +#: 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 "nome_trigger" -#: sql_help.c:481 sql_help.c:482 sql_help.c:1323 sql_help.c:1324 -#: sql_help.c:2232 sql_help.c:2237 sql_help.c:2743 sql_help.c:2764 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "tabella_padre" -#: sql_help.c:539 sql_help.c:594 sql_help.c:660 sql_help.c:860 sql_help.c:998 -#: sql_help.c:1494 sql_help.c:2169 +#: 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:2261 msgid "extension_name" msgstr "nome_estensione" -#: sql_help.c:541 sql_help.c:1000 sql_help.c:2285 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "costo_di_esecuzione" -#: sql_help.c:542 sql_help.c:1001 sql_help.c:2286 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "righe_risultato" -#: sql_help.c:563 sql_help.c:565 sql_help.c:924 sql_help.c:932 sql_help.c:936 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1572 sql_help.c:1580 -#: sql_help.c:1584 sql_help.c:1587 sql_help.c:1590 sql_help.c:2575 -#: sql_help.c:2577 sql_help.c:2580 sql_help.c:2581 sql_help.c:3688 -#: sql_help.c:3692 sql_help.c:3695 sql_help.c:3697 sql_help.c:3699 -#: sql_help.c:3701 sql_help.c:3703 sql_help.c:3709 sql_help.c:3711 -#: sql_help.c:3713 sql_help.c:3715 sql_help.c:3717 sql_help.c:3719 +#: sql_help.c:547 sql_help.c:2397 +msgid "support_function" +msgstr "support_function" + +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3882 +#: sql_help.c:3883 sql_help.c:3887 sql_help.c:3888 sql_help.c:3891 +#: sql_help.c:3892 sql_help.c:3894 sql_help.c:3895 sql_help.c:3897 +#: sql_help.c:3898 sql_help.c:3900 sql_help.c:3901 sql_help.c:3903 +#: sql_help.c:3904 sql_help.c:3910 sql_help.c:3911 sql_help.c:3913 +#: sql_help.c:3914 sql_help.c:3916 sql_help.c:3917 sql_help.c:3919 +#: sql_help.c:3920 sql_help.c:3922 sql_help.c:3923 sql_help.c:3925 +#: sql_help.c:3926 sql_help.c:3928 sql_help.c:3929 sql_help.c:3931 +#: sql_help.c:3932 sql_help.c:4332 sql_help.c:4333 sql_help.c:4337 +#: sql_help.c:4338 sql_help.c:4341 sql_help.c:4342 sql_help.c:4344 +#: sql_help.c:4345 sql_help.c:4347 sql_help.c:4348 sql_help.c:4350 +#: sql_help.c:4351 sql_help.c:4353 sql_help.c:4354 sql_help.c:4360 +#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4366 +#: sql_help.c:4367 sql_help.c:4369 sql_help.c:4370 sql_help.c:4372 +#: sql_help.c:4373 sql_help.c:4375 sql_help.c:4376 sql_help.c:4378 +#: sql_help.c:4379 sql_help.c:4381 sql_help.c:4382 msgid "role_specification" msgstr "specifica_ruolo" -#: sql_help.c:564 sql_help.c:566 sql_help.c:1603 sql_help.c:2112 -#: sql_help.c:2583 sql_help.c:3083 sql_help.c:3528 sql_help.c:4361 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4709 msgid "user_name" msgstr "nome_utente" -#: sql_help.c:567 sql_help.c:944 sql_help.c:1592 sql_help.c:2582 -#: sql_help.c:3720 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3933 sql_help.c:4383 msgid "where role_specification can be:" msgstr "dove specifica_ruolo può essere:" -#: sql_help.c:569 +#: sql_help.c:575 msgid "group_name" msgstr "nome_gruppo" -#: sql_help.c:590 sql_help.c:1372 sql_help.c:2117 sql_help.c:2349 -#: sql_help.c:2381 sql_help.c:2750 sql_help.c:2762 sql_help.c:2775 -#: sql_help.c:2818 sql_help.c:2840 sql_help.c:2852 sql_help.c:3716 -#: sql_help.c:4049 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3924 +#: sql_help.c:4374 msgid "tablespace_name" msgstr "nome_tablespace" -#: sql_help.c:592 sql_help.c:680 sql_help.c:1318 sql_help.c:1327 -#: sql_help.c:1367 sql_help.c:1707 +#: 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 "nome_indice" -#: sql_help.c:596 sql_help.c:599 sql_help.c:681 sql_help.c:683 sql_help.c:1320 -#: sql_help.c:1322 sql_help.c:1370 sql_help.c:2347 sql_help.c:2379 -#: sql_help.c:2748 sql_help.c:2760 sql_help.c:2773 sql_help.c:2816 -#: sql_help.c:2838 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "parametro_di_memorizzazione" -#: sql_help.c:601 +#: sql_help.c:607 msgid "column_number" msgstr "numero_colonna" -#: sql_help.c:625 sql_help.c:1790 sql_help.c:4136 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4466 msgid "large_object_oid" msgstr "oid_large_object" -#: sql_help.c:712 sql_help.c:2402 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +msgid "compression_method" +msgstr "compression_method" + +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "new_access_method" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:713 sql_help.c:2403 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "proc_join" -#: sql_help.c:765 sql_help.c:777 sql_help.c:2420 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "strategia_num" -#: sql_help.c:767 sql_help.c:768 sql_help.c:771 sql_help.c:772 sql_help.c:778 -#: sql_help.c:779 sql_help.c:781 sql_help.c:782 sql_help.c:2422 sql_help.c:2423 -#: sql_help.c:2426 sql_help.c:2427 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "tipo_op" -#: sql_help.c:769 sql_help.c:2424 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "nome_famiglia_sort" -#: sql_help.c:770 sql_help.c:780 sql_help.c:2425 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "num_supporto" -#: sql_help.c:774 sql_help.c:2056 sql_help.c:2429 sql_help.c:2929 -#: sql_help.c:2931 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "tipo_argomento" -#: sql_help.c:805 sql_help.c:808 sql_help.c:879 sql_help.c:881 sql_help.c:883 -#: sql_help.c:1014 sql_help.c:1053 sql_help.c:1490 sql_help.c:1493 -#: sql_help.c:1657 sql_help.c:1706 sql_help.c:1775 sql_help.c:1800 -#: sql_help.c:1813 sql_help.c:1828 sql_help.c:1885 sql_help.c:1890 -#: sql_help.c:2224 sql_help.c:2236 sql_help.c:2340 sql_help.c:2377 -#: sql_help.c:2453 sql_help.c:2496 sql_help.c:2552 sql_help.c:2603 -#: sql_help.c:2634 sql_help.c:2735 sql_help.c:2751 sql_help.c:2763 -#: sql_help.c:2836 sql_help.c:2955 sql_help.c:3132 sql_help.c:3349 -#: sql_help.c:3398 sql_help.c:3504 sql_help.c:3686 sql_help.c:3691 -#: sql_help.c:3736 sql_help.c:3768 sql_help.c:4019 sql_help.c:4024 -#: sql_help.c:4124 sql_help.c:4231 sql_help.c:4233 sql_help.c:4282 -#: sql_help.c:4321 sql_help.c:4470 sql_help.c:4472 sql_help.c:4521 -#: sql_help.c:4555 sql_help.c:4593 sql_help.c:4677 sql_help.c:4679 -#: sql_help.c:4728 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3880 sql_help.c:3886 +#: sql_help.c:3947 sql_help.c:3979 sql_help.c:4330 sql_help.c:4336 +#: sql_help.c:4454 sql_help.c:4565 sql_help.c:4567 sql_help.c:4629 +#: sql_help.c:4668 sql_help.c:4822 sql_help.c:4824 sql_help.c:4886 +#: sql_help.c:4920 sql_help.c:4972 sql_help.c:5060 sql_help.c:5062 +#: sql_help.c:5124 msgid "table_name" msgstr "nome_tabella" -#: sql_help.c:810 sql_help.c:2455 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "espressione_using" -#: sql_help.c:811 sql_help.c:2456 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "espressione_check" -#: sql_help.c:885 sql_help.c:2497 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "publication_object" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "parametro_pubblicazione" -#: sql_help.c:928 sql_help.c:1576 sql_help.c:2319 sql_help.c:2529 -#: sql_help.c:3066 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "dove publication_object è uno di:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "password" -#: sql_help.c:929 sql_help.c:1577 sql_help.c:2320 sql_help.c:2530 -#: sql_help.c:3067 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:933 sql_help.c:937 sql_help.c:940 sql_help.c:943 sql_help.c:1581 -#: sql_help.c:1585 sql_help.c:1588 sql_help.c:1591 sql_help.c:3696 -#: sql_help.c:4029 +#: 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:3893 +#: sql_help.c:4343 msgid "database_name" msgstr "nome_database" -#: sql_help.c:1047 sql_help.c:2598 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "incremento" -#: sql_help.c:1048 sql_help.c:2599 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "valoremin" -#: sql_help.c:1049 sql_help.c:2600 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "valoremax" -#: sql_help.c:1050 sql_help.c:2601 sql_help.c:4229 sql_help.c:4319 -#: sql_help.c:4468 sql_help.c:4610 sql_help.c:4675 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4563 sql_help.c:4666 +#: sql_help.c:4820 sql_help.c:4989 sql_help.c:5058 msgid "start" msgstr "inizio" -#: sql_help.c:1051 sql_help.c:1295 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "riavvio" -#: sql_help.c:1052 sql_help.c:2602 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "cache" -#: sql_help.c:1109 sql_help.c:2646 +#: sql_help.c:1123 +msgid "new_target" +msgstr "new_target" + +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1111 sql_help.c:2647 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "nome_pubblicazione" -#: sql_help.c:1112 -msgid "set_publication_option" -msgstr "opzione_set_publication" +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "publication_option" -#: sql_help.c:1115 +#: sql_help.c:1156 msgid "refresh_option" msgstr "opzione_refresh" -#: sql_help.c:1120 sql_help.c:2648 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "parametro_sottoscrizione" -#: sql_help.c:1273 sql_help.c:1276 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "skip_option" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "nome_partizione" -#: sql_help.c:1274 sql_help.c:2241 sql_help.c:2768 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "specifica_margine_partizione" -#: sql_help.c:1292 sql_help.c:1341 sql_help.c:2780 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "opzioni_sequenza" -#: sql_help.c:1294 +#: sql_help.c:1346 msgid "sequence_option" msgstr "opzione_sequenza" -#: sql_help.c:1306 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "vincoli_di_tabella_con_indice" -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "nome_regola_di_riscrittura" -#: sql_help.c:1328 sql_help.c:2805 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "e specifica_margine_partizione è:" -#: sql_help.c:1329 sql_help.c:1331 sql_help.c:1333 sql_help.c:1335 -#: sql_help.c:1336 sql_help.c:2806 sql_help.c:2808 sql_help.c:2810 -#: sql_help.c:2812 sql_help.c:2813 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 +msgid "partition_bound_expr" +msgstr "partition_bound_expr" + +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "letterale_numerico" -#: sql_help.c:1330 sql_help.c:1332 sql_help.c:1334 sql_help.c:2807 -#: sql_help.c:2809 sql_help.c:2811 -msgid "string_literal" -msgstr "letterale_stringa" - -#: sql_help.c:1337 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "e vincolo_di_colonna è:" -#: sql_help.c:1340 sql_help.c:2248 sql_help.c:2279 sql_help.c:2476 -#: sql_help.c:2779 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "expr_default" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1352 sql_help.c:1354 -#: sql_help.c:1358 sql_help.c:2781 sql_help.c:2782 sql_help.c:2791 -#: sql_help.c:2793 sql_help.c:2797 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +msgid "generation_expr" +msgstr "generation_expr" + +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "parametri_di_indice" -#: sql_help.c:1344 sql_help.c:1361 sql_help.c:2783 sql_help.c:2800 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "tabella_ref" -#: sql_help.c:1345 sql_help.c:1362 sql_help.c:2784 sql_help.c:2801 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "colonna_ref" -#: sql_help.c:1348 sql_help.c:2249 sql_help.c:2787 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +msgid "referential_action" +msgstr "referential_action" + +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "e vincolo_di_tabella è:" -#: sql_help.c:1356 sql_help.c:2795 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "elemento_di_esclusione" -#: sql_help.c:1357 sql_help.c:2796 sql_help.c:4227 sql_help.c:4317 -#: sql_help.c:4466 sql_help.c:4608 sql_help.c:4673 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "operator" msgstr "operatore" -#: sql_help.c:1359 sql_help.c:2350 sql_help.c:2798 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "predicato" -#: sql_help.c:1365 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "e vincolo_di_tabella_con_indice è:" -#: sql_help.c:1368 sql_help.c:2814 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "parametri_di_indice nei vincoli UNIQUE, PRIMARY KEY e EXCLUDE sono:" -#: sql_help.c:1373 sql_help.c:2819 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "elemento_di_esclusione in un vincolo EXCLUDE è:" -#: sql_help.c:1376 sql_help.c:2345 sql_help.c:2747 sql_help.c:2759 -#: sql_help.c:2772 sql_help.c:2822 sql_help.c:3781 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3992 msgid "opclass" msgstr "classe_op" -#: sql_help.c:1392 sql_help.c:1395 sql_help.c:2855 +#: sql_help.c:1430 sql_help.c:2976 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "referential_action in un vincolo FOREIGN KEY/REFERENCES è:" + +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 msgid "tablespace_option" msgstr "opzione_tablespace" -#: sql_help.c:1416 sql_help.c:1419 sql_help.c:1425 sql_help.c:1429 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "tipo_di_token" -#: sql_help.c:1417 sql_help.c:1420 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "nome_dizionario" -#: sql_help.c:1422 sql_help.c:1426 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "vecchio_dizionario" -#: sql_help.c:1423 sql_help.c:1427 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "nuovo_dizionario" -#: sql_help.c:1519 sql_help.c:1532 sql_help.c:1535 sql_help.c:1536 -#: sql_help.c:3006 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "nome_attributo" -#: sql_help.c:1520 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nuovo_nome_attributo" -#: sql_help.c:1526 sql_help.c:1530 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nuovo_valore_enum" -#: sql_help.c:1527 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "valore_enum_vicino" -#: sql_help.c:1529 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "valore_enum_esistente" -#: sql_help.c:1604 sql_help.c:2233 sql_help.c:2242 sql_help.c:2614 -#: sql_help.c:3084 sql_help.c:3529 sql_help.c:3702 sql_help.c:3737 -#: sql_help.c:4035 +#: sql_help.c:1589 +msgid "property" +msgstr "proprietà" + +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3902 sql_help.c:3948 +#: sql_help.c:4352 msgid "server_name" msgstr "nome_server" -#: sql_help.c:1632 sql_help.c:1635 sql_help.c:3099 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "nome_opzione_vista" -#: sql_help.c:1633 sql_help.c:3100 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "valore_opzione_vista" -#: sql_help.c:1653 sql_help.c:1654 sql_help.c:4589 sql_help.c:4590 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4959 sql_help.c:4960 msgid "table_and_columns" msgstr "tabelle_e_colonne" -#: sql_help.c:1655 sql_help.c:1896 sql_help.c:3575 sql_help.c:4591 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4187 sql_help.c:4961 msgid "where option can be one of:" msgstr "dove opzione può essere una di:" -#: sql_help.c:1656 sql_help.c:4592 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4188 sql_help.c:4190 +#: sql_help.c:4962 sql_help.c:4963 sql_help.c:4964 sql_help.c:4965 +#: sql_help.c:4966 sql_help.c:4967 sql_help.c:4968 sql_help.c:4969 +msgid "boolean" +msgstr "booleano" + +#: sql_help.c:1724 sql_help.c:4971 msgid "and table_and_columns is:" msgstr "e tabelle_e_colonne è:" -#: sql_help.c:1672 sql_help.c:4377 sql_help.c:4379 sql_help.c:4403 +#: sql_help.c:1740 sql_help.c:4725 sql_help.c:4727 sql_help.c:4751 msgid "transaction_mode" msgstr "modalità_transazione" -#: sql_help.c:1673 sql_help.c:4380 sql_help.c:4404 +#: sql_help.c:1741 sql_help.c:4728 sql_help.c:4752 msgid "where transaction_mode is one of:" msgstr "dove modalità_transazione è una di:" -#: sql_help.c:1682 sql_help.c:4237 sql_help.c:4246 sql_help.c:4250 -#: sql_help.c:4254 sql_help.c:4257 sql_help.c:4476 sql_help.c:4485 -#: sql_help.c:4489 sql_help.c:4493 sql_help.c:4496 sql_help.c:4683 -#: sql_help.c:4692 sql_help.c:4696 sql_help.c:4700 sql_help.c:4703 +#: sql_help.c:1750 sql_help.c:4571 sql_help.c:4580 sql_help.c:4584 +#: sql_help.c:4588 sql_help.c:4591 sql_help.c:4828 sql_help.c:4837 +#: sql_help.c:4841 sql_help.c:4845 sql_help.c:4848 sql_help.c:5066 +#: sql_help.c:5075 sql_help.c:5079 sql_help.c:5083 sql_help.c:5086 msgid "argument" msgstr "argomento" -#: sql_help.c:1772 +#: sql_help.c:1850 msgid "relation_name" msgstr "nome_relazione" -#: sql_help.c:1777 sql_help.c:3698 sql_help.c:4031 +#: sql_help.c:1855 sql_help.c:3896 sql_help.c:4346 msgid "domain_name" msgstr "nome_dominio" -#: sql_help.c:1799 +#: sql_help.c:1877 msgid "policy_name" msgstr "nome_regola" -#: sql_help.c:1812 +#: sql_help.c:1890 msgid "rule_name" msgstr "nome_ruolo" -#: sql_help.c:1831 +#: sql_help.c:1909 msgid "text" msgstr "testo" -#: sql_help.c:1856 sql_help.c:3881 sql_help.c:4069 +#: sql_help.c:1934 sql_help.c:4152 sql_help.c:4399 msgid "transaction_id" msgstr "id_transazione" -#: sql_help.c:1887 sql_help.c:1893 sql_help.c:3807 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4018 msgid "filename" msgstr "nome_file" -#: sql_help.c:1888 sql_help.c:1894 sql_help.c:2554 sql_help.c:2555 -#: sql_help.c:2556 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "comando" -#: sql_help.c:1892 sql_help.c:2382 sql_help.c:2841 sql_help.c:3101 -#: sql_help.c:3119 sql_help.c:3772 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4002 sql_help.c:4079 sql_help.c:4082 sql_help.c:4554 +#: sql_help.c:4556 sql_help.c:4657 sql_help.c:4659 sql_help.c:4811 +#: sql_help.c:4813 sql_help.c:4929 sql_help.c:5049 sql_help.c:5051 +msgid "condition" +msgstr "condizione" + +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3983 msgid "query" msgstr "query" -#: sql_help.c:1897 +#: sql_help.c:1976 msgid "format_name" msgstr "nome_formato" -#: sql_help.c:1898 sql_help.c:1899 sql_help.c:1902 sql_help.c:3576 -#: sql_help.c:3577 sql_help.c:3578 sql_help.c:3579 sql_help.c:3580 -#: sql_help.c:3581 -msgid "boolean" -msgstr "booleano" - -#: sql_help.c:1900 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "carattere_delimitatore" -#: sql_help.c:1901 +#: sql_help.c:1979 msgid "null_string" msgstr "stringa_nulla" -#: sql_help.c:1903 +#: sql_help.c:1981 msgid "quote_character" msgstr "carattere_virgolette" -#: sql_help.c:1904 +#: sql_help.c:1982 msgid "escape_character" msgstr "carattere_di_escape" -#: sql_help.c:1908 +#: sql_help.c:1986 msgid "encoding_name" msgstr "nome_codifica" -#: sql_help.c:1919 +#: sql_help.c:1997 msgid "access_method_type" msgstr "tipo_metodo_accesso" -#: sql_help.c:1990 sql_help.c:2009 sql_help.c:2012 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "topo_dato_argomento" -#: sql_help.c:1991 sql_help.c:2013 sql_help.c:2021 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "sfunz" -#: sql_help.c:1992 sql_help.c:2014 sql_help.c:2022 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "tipo_dato_stato" -#: sql_help.c:1993 sql_help.c:2015 sql_help.c:2023 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "dimensione_dato_stato" -#: sql_help.c:1994 sql_help.c:2016 sql_help.c:2024 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "ffunz" -#: sql_help.c:1995 sql_help.c:2025 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "funz_combine" -#: sql_help.c:1996 sql_help.c:2026 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "funz_serial" -#: sql_help.c:1997 sql_help.c:2027 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "funz_deserial" -#: sql_help.c:1998 sql_help.c:2017 sql_help.c:2028 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "condizione_iniziale" -#: sql_help.c:1999 sql_help.c:2029 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "msfunz" -#: sql_help.c:2000 sql_help.c:2030 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "minvfunz" -#: sql_help.c:2001 sql_help.c:2031 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "tipo_dato_mstato" -#: sql_help.c:2002 sql_help.c:2032 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "tipo_dato_mstato" -#: sql_help.c:2003 sql_help.c:2033 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "mffunz" -#: sql_help.c:2004 sql_help.c:2034 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "condizione_minima" -#: sql_help.c:2005 sql_help.c:2035 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "operatore_di_ordinamento" -#: sql_help.c:2018 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "o la vecchia sintassi" -#: sql_help.c:2020 +#: sql_help.c:2098 msgid "base_type" msgstr "tipo_base" -#: sql_help.c:2076 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "locale" -#: sql_help.c:2077 sql_help.c:2115 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2078 sql_help.c:2116 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2079 sql_help.c:4122 +#: sql_help.c:2158 sql_help.c:4452 msgid "provider" msgstr "provider" -#: sql_help.c:2080 sql_help.c:2171 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "versione" -#: sql_help.c:2082 +#: sql_help.c:2162 msgid "existing_collation" msgstr "ordinamento_esistente" -#: sql_help.c:2092 +#: sql_help.c:2172 msgid "source_encoding" msgstr "codifica_origine" -#: sql_help.c:2093 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "codifica_destinazione" -#: sql_help.c:2113 sql_help.c:2881 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "template" -#: sql_help.c:2114 +#: sql_help.c:2200 msgid "encoding" msgstr "codifica" -#: sql_help.c:2140 +#: sql_help.c:2201 +msgid "strategy" +msgstr "strategia" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_locale" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "locale_provider" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "collation_version" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "vincolo" -#: sql_help.c:2141 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "dove vincolo di è:" -#: sql_help.c:2155 sql_help.c:2551 sql_help.c:2954 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "evento" -#: sql_help.c:2156 +#: sql_help.c:2248 msgid "filter_variable" msgstr "valiabile_filtro" -#: sql_help.c:2172 -msgid "old_version" -msgstr "vecchia_versione" +#: sql_help.c:2249 +msgid "filter_value" +msgstr "filter_value" -#: sql_help.c:2245 sql_help.c:2776 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "dove vincolo_di_colonna è:" -#: sql_help.c:2280 +#: sql_help.c:2390 msgid "rettype" msgstr "tipo_ritorno" -#: sql_help.c:2282 +#: sql_help.c:2392 msgid "column_type" msgstr "tipo_colonna" -#: sql_help.c:2290 sql_help.c:2482 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "definizione" -#: sql_help.c:2291 sql_help.c:2483 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "file_obj" -#: sql_help.c:2292 sql_help.c:2484 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "simbolo_link" -#: sql_help.c:2326 sql_help.c:2536 sql_help.c:3073 +#: sql_help.c:2404 sql_help.c:2607 +msgid "sql_body" +msgstr "sql_body" + +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2341 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "metodo" -#: sql_help.c:2362 +#: sql_help.c:2463 +msgid "opclass_parameter" +msgstr "opclass_parameter" + +#: sql_help.c:2480 msgid "call_handler" msgstr "handler_chiamata" -#: sql_help.c:2363 +#: sql_help.c:2481 msgid "inline_handler" msgstr "handler_inline" -#: sql_help.c:2364 +#: sql_help.c:2482 msgid "valfunction" msgstr "funzione_valid" -#: sql_help.c:2400 +#: sql_help.c:2521 msgid "com_op" msgstr "com_op" -#: sql_help.c:2401 +#: sql_help.c:2522 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2419 +#: sql_help.c:2540 msgid "family_name" msgstr "nome_famiglia" -#: sql_help.c:2430 +#: sql_help.c:2551 msgid "storage_type" msgstr "tipo_memorizzazione" -#: sql_help.c:2553 sql_help.c:2958 sql_help.c:3135 sql_help.c:3791 -#: sql_help.c:4220 sql_help.c:4222 sql_help.c:4310 sql_help.c:4312 -#: sql_help.c:4459 sql_help.c:4461 sql_help.c:4564 sql_help.c:4666 -#: sql_help.c:4668 -msgid "condition" -msgstr "condizione" - -#: sql_help.c:2557 sql_help.c:2961 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "dove evento può essere uno di:" -#: sql_help.c:2576 sql_help.c:2578 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "elemento_di_schema" -#: sql_help.c:2615 +#: sql_help.c:2749 msgid "server_type" msgstr "tipo_di_server" -#: sql_help.c:2616 +#: sql_help.c:2750 msgid "server_version" msgstr "versione_server" -#: sql_help.c:2617 sql_help.c:3700 sql_help.c:4033 +#: sql_help.c:2751 sql_help.c:3899 sql_help.c:4349 msgid "fdw_name" msgstr "nome_fdw" -#: sql_help.c:2630 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "nome_statistica" -#: sql_help.c:2631 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "tipo_statistica" -#: sql_help.c:2645 +#: sql_help.c:2788 msgid "subscription_name" msgstr "nome_sottoscrizione" -#: sql_help.c:2741 +#: sql_help.c:2893 msgid "source_table" msgstr "tabella_origine" -#: sql_help.c:2742 +#: sql_help.c:2894 msgid "like_option" msgstr "opzioni_di_like" -#: sql_help.c:2804 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "e opzione_like è:" -#: sql_help.c:2854 +#: sql_help.c:3012 msgid "directory" msgstr "directory" -#: sql_help.c:2868 +#: sql_help.c:3026 msgid "parser_name" msgstr "nome_parser" -#: sql_help.c:2869 +#: sql_help.c:3027 msgid "source_config" msgstr "config_origine" -#: sql_help.c:2898 +#: sql_help.c:3056 msgid "start_function" msgstr "funzione_inizio" -#: sql_help.c:2899 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "funzione_gettoken" -#: sql_help.c:2900 +#: sql_help.c:3058 msgid "end_function" msgstr "funzione_fine" -#: sql_help.c:2901 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "funzione_lextypes" -#: sql_help.c:2902 +#: sql_help.c:3060 msgid "headline_function" msgstr "funzione_headline" -#: sql_help.c:2914 +#: sql_help.c:3072 msgid "init_function" msgstr "funzione_init" -#: sql_help.c:2915 +#: sql_help.c:3073 msgid "lexize_function" msgstr "funzione_lexize" -#: sql_help.c:2928 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "nome_funzione_from_sql" -#: sql_help.c:2930 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "nome_funzione_to_sql" -#: sql_help.c:2956 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "nome_tabella_referenziata" -#: sql_help.c:2957 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "nome_tabella_transizione" -#: sql_help.c:2960 +#: sql_help.c:3118 msgid "arguments" msgstr "argomenti" -#: sql_help.c:3010 sql_help.c:4155 +#: sql_help.c:3170 sql_help.c:4485 msgid "label" msgstr "etichetta" -#: sql_help.c:3012 +#: sql_help.c:3172 msgid "subtype" msgstr "sottotipo" -#: sql_help.c:3013 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "classe_operatore_sottotipo" -#: sql_help.c:3015 +#: sql_help.c:3175 msgid "canonical_function" msgstr "funzione_canonica" -#: sql_help.c:3016 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "funzione_diff_sottotipo" -#: sql_help.c:3018 +#: sql_help.c:3177 +msgid "multirange_type_name" +msgstr "multirange_type_name" + +#: sql_help.c:3179 msgid "input_function" msgstr "funzione_input" -#: sql_help.c:3019 +#: sql_help.c:3180 msgid "output_function" msgstr "funzione_output" -#: sql_help.c:3020 +#: sql_help.c:3181 msgid "receive_function" msgstr "funzione_receive" -#: sql_help.c:3021 +#: sql_help.c:3182 msgid "send_function" msgstr "funzione_send" -#: sql_help.c:3022 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "funzione_input_modificatore_tipo" -#: sql_help.c:3023 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "funzione_output_modificatore_tipo" -#: sql_help.c:3024 +#: sql_help.c:3185 msgid "analyze_function" msgstr "funzione_analyze" -#: sql_help.c:3025 +#: sql_help.c:3186 +msgid "subscript_function" +msgstr "subscript_function" + +#: sql_help.c:3187 msgid "internallength" msgstr "lunghezza_interna" -#: sql_help.c:3026 +#: sql_help.c:3188 msgid "alignment" msgstr "allineamento" -#: sql_help.c:3027 +#: sql_help.c:3189 msgid "storage" msgstr "memorizzazione" -#: sql_help.c:3028 +#: sql_help.c:3190 msgid "like_type" msgstr "tipo_like" -#: sql_help.c:3029 +#: sql_help.c:3191 msgid "category" msgstr "categoria" -#: sql_help.c:3030 +#: sql_help.c:3192 msgid "preferred" msgstr "preferito" -#: sql_help.c:3031 +#: sql_help.c:3193 msgid "default" msgstr "predefinito" -#: sql_help.c:3032 +#: sql_help.c:3194 msgid "element" msgstr "elemento" -#: sql_help.c:3033 +#: sql_help.c:3195 msgid "delimiter" msgstr "delimitatore" -#: sql_help.c:3034 +#: sql_help.c:3196 msgid "collatable" msgstr "ordinabile" -#: sql_help.c:3131 sql_help.c:3767 sql_help.c:4215 sql_help.c:4304 -#: sql_help.c:4454 sql_help.c:4554 sql_help.c:4661 +#: sql_help.c:3293 sql_help.c:3978 sql_help.c:4068 sql_help.c:4549 +#: sql_help.c:4651 sql_help.c:4806 sql_help.c:4919 sql_help.c:5044 msgid "with_query" msgstr "query_with" -#: sql_help.c:3133 sql_help.c:3769 sql_help.c:4234 sql_help.c:4240 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4251 sql_help.c:4259 -#: sql_help.c:4473 sql_help.c:4479 sql_help.c:4482 sql_help.c:4486 -#: sql_help.c:4490 sql_help.c:4498 sql_help.c:4556 sql_help.c:4680 -#: sql_help.c:4686 sql_help.c:4689 sql_help.c:4693 sql_help.c:4697 -#: sql_help.c:4705 +#: sql_help.c:3295 sql_help.c:3980 sql_help.c:4568 sql_help.c:4574 +#: sql_help.c:4577 sql_help.c:4581 sql_help.c:4585 sql_help.c:4593 +#: sql_help.c:4825 sql_help.c:4831 sql_help.c:4834 sql_help.c:4838 +#: sql_help.c:4842 sql_help.c:4850 sql_help.c:4921 sql_help.c:5063 +#: sql_help.c:5069 sql_help.c:5072 sql_help.c:5076 sql_help.c:5080 +#: sql_help.c:5088 msgid "alias" msgstr "alias" -#: sql_help.c:3134 -msgid "using_list" -msgstr "lista_using" +#: sql_help.c:3296 sql_help.c:4553 sql_help.c:4595 sql_help.c:4597 +#: sql_help.c:4601 sql_help.c:4603 sql_help.c:4604 sql_help.c:4605 +#: sql_help.c:4656 sql_help.c:4810 sql_help.c:4852 sql_help.c:4854 +#: sql_help.c:4858 sql_help.c:4860 sql_help.c:4861 sql_help.c:4862 +#: sql_help.c:4928 sql_help.c:5048 sql_help.c:5090 sql_help.c:5092 +#: sql_help.c:5096 sql_help.c:5098 sql_help.c:5099 sql_help.c:5100 +msgid "from_item" +msgstr "elemento_from" -#: sql_help.c:3136 sql_help.c:3607 sql_help.c:3848 sql_help.c:4565 +#: sql_help.c:3298 sql_help.c:3780 sql_help.c:4119 sql_help.c:4930 msgid "cursor_name" msgstr "nome_cursore" -#: sql_help.c:3137 sql_help.c:3775 sql_help.c:4566 +#: sql_help.c:3299 sql_help.c:3986 sql_help.c:4931 msgid "output_expression" msgstr "espressione_output" -#: sql_help.c:3138 sql_help.c:3776 sql_help.c:4218 sql_help.c:4307 -#: sql_help.c:4457 sql_help.c:4567 sql_help.c:4664 +#: sql_help.c:3300 sql_help.c:3987 sql_help.c:4552 sql_help.c:4654 +#: sql_help.c:4809 sql_help.c:4932 sql_help.c:5047 msgid "output_name" msgstr "nome_output" -#: sql_help.c:3154 +#: sql_help.c:3316 msgid "code" msgstr "codice" -#: sql_help.c:3553 +#: sql_help.c:3721 msgid "parameter" msgstr "parametro" -#: sql_help.c:3573 sql_help.c:3574 sql_help.c:3873 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4144 msgid "statement" msgstr "istruzione" -#: sql_help.c:3606 sql_help.c:3847 +#: sql_help.c:3779 sql_help.c:3781 sql_help.c:4118 sql_help.c:4120 msgid "direction" msgstr "direzione" -#: sql_help.c:3608 sql_help.c:3849 -msgid "where direction can be empty or one of:" -msgstr "dove direzione può essere vuota o una di:" - -#: sql_help.c:3609 sql_help.c:3610 sql_help.c:3611 sql_help.c:3612 -#: sql_help.c:3613 sql_help.c:3850 sql_help.c:3851 sql_help.c:3852 -#: sql_help.c:3853 sql_help.c:3854 sql_help.c:4228 sql_help.c:4230 -#: sql_help.c:4318 sql_help.c:4320 sql_help.c:4467 sql_help.c:4469 -#: sql_help.c:4609 sql_help.c:4611 sql_help.c:4674 sql_help.c:4676 +#: sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 sql_help.c:3785 +#: sql_help.c:3786 sql_help.c:4121 sql_help.c:4122 sql_help.c:4123 +#: sql_help.c:4124 sql_help.c:4125 sql_help.c:4562 sql_help.c:4564 +#: sql_help.c:4665 sql_help.c:4667 sql_help.c:4819 sql_help.c:4821 +#: sql_help.c:4988 sql_help.c:4990 sql_help.c:5057 sql_help.c:5059 msgid "count" msgstr "conteggio" -#: sql_help.c:3693 sql_help.c:4026 +#: sql_help.c:3889 sql_help.c:4339 msgid "sequence_name" msgstr "nome_sequenza" -#: sql_help.c:3706 sql_help.c:4039 +#: sql_help.c:3907 sql_help.c:4357 msgid "arg_name" msgstr "nome_arg" -#: sql_help.c:3707 sql_help.c:4040 +#: sql_help.c:3908 sql_help.c:4358 msgid "arg_type" msgstr "tipo_arg" -#: sql_help.c:3712 sql_help.c:4045 +#: sql_help.c:3915 sql_help.c:4365 msgid "loid" msgstr "loid" -#: sql_help.c:3735 +#: sql_help.c:3946 msgid "remote_schema" msgstr "schema_remoto" -#: sql_help.c:3738 +#: sql_help.c:3949 msgid "local_schema" msgstr "schema_locale" -#: sql_help.c:3773 +#: sql_help.c:3984 msgid "conflict_target" msgstr "target_conflitto" -#: sql_help.c:3774 +#: sql_help.c:3985 msgid "conflict_action" msgstr "azione_conflitto" -#: sql_help.c:3777 +#: sql_help.c:3988 msgid "where conflict_target can be one of:" msgstr "dove target_conflitto può essere uno di:" -#: sql_help.c:3778 +#: sql_help.c:3989 msgid "index_column_name" msgstr "nome_colonna_indice" -#: sql_help.c:3779 +#: sql_help.c:3990 msgid "index_expression" msgstr "espressione_indice" -#: sql_help.c:3782 +#: sql_help.c:3993 msgid "index_predicate" msgstr "indice_predicato" -#: sql_help.c:3784 +#: sql_help.c:3995 msgid "and conflict_action is one of:" msgstr "e azione_conflitto è una di:" -#: sql_help.c:3790 sql_help.c:4562 +#: sql_help.c:4001 sql_help.c:4927 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3799 sql_help.c:3862 sql_help.c:4538 +#: sql_help.c:4010 sql_help.c:4133 sql_help.c:4903 msgid "channel" msgstr "canale" -#: sql_help.c:3821 +#: sql_help.c:4032 msgid "lockmode" msgstr "modalità_lock" -#: sql_help.c:3822 +#: sql_help.c:4033 msgid "where lockmode is one of:" msgstr "dove modalità_lock è una di:" -#: sql_help.c:3863 +#: sql_help.c:4069 +msgid "target_table_name" +msgstr "target_table_name" + +#: sql_help.c:4070 +msgid "target_alias" +msgstr "target_alias" + +#: sql_help.c:4071 +msgid "data_source" +msgstr "data_source" + +#: sql_help.c:4072 sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +msgid "join_condition" +msgstr "condizione_join" + +#: sql_help.c:4073 +msgid "when_clause" +msgstr "when_clause" + +#: sql_help.c:4074 +msgid "where data_source is:" +msgstr "dove data_source è:" + +#: sql_help.c:4075 +msgid "source_table_name" +msgstr "source_table_name" + +#: sql_help.c:4076 +msgid "source_query" +msgstr "source_query" + +#: sql_help.c:4077 +msgid "source_alias" +msgstr "source_alias" + +#: sql_help.c:4078 +msgid "and when_clause is:" +msgstr "e when_clause è:" + +#: sql_help.c:4080 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4081 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4083 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4084 +msgid "and merge_insert is:" +msgstr "e merge_insert è:" + +#: sql_help.c:4087 +msgid "and merge_update is:" +msgstr "e merge_update è:" + +#: sql_help.c:4092 +msgid "and merge_delete is:" +msgstr "and merge_delete is:" + +#: sql_help.c:4134 msgid "payload" msgstr "payload" -#: sql_help.c:3890 +#: sql_help.c:4161 msgid "old_role" msgstr "vecchio_ruolo" -#: sql_help.c:3891 +#: sql_help.c:4162 msgid "new_role" msgstr "nuovo_ruolo" -#: sql_help.c:3916 sql_help.c:4077 sql_help.c:4085 +#: sql_help.c:4198 sql_help.c:4407 sql_help.c:4415 msgid "savepoint_name" msgstr "nome_punto_salvataggio" -#: sql_help.c:4219 sql_help.c:4261 sql_help.c:4263 sql_help.c:4309 -#: sql_help.c:4458 sql_help.c:4500 sql_help.c:4502 sql_help.c:4665 -#: sql_help.c:4707 sql_help.c:4709 -msgid "from_item" -msgstr "elemento_from" - -#: sql_help.c:4221 sql_help.c:4273 sql_help.c:4460 sql_help.c:4512 -#: sql_help.c:4667 sql_help.c:4719 +#: sql_help.c:4555 sql_help.c:4613 sql_help.c:4812 sql_help.c:4870 +#: sql_help.c:5050 sql_help.c:5108 msgid "grouping_element" msgstr "elemento_raggruppante" -#: sql_help.c:4223 sql_help.c:4313 sql_help.c:4462 sql_help.c:4669 +#: sql_help.c:4557 sql_help.c:4660 sql_help.c:4814 sql_help.c:5052 msgid "window_name" msgstr "nome_finestra" -#: sql_help.c:4224 sql_help.c:4314 sql_help.c:4463 sql_help.c:4670 +#: sql_help.c:4558 sql_help.c:4661 sql_help.c:4815 sql_help.c:5053 msgid "window_definition" msgstr "definizione_finestra" -#: sql_help.c:4225 sql_help.c:4239 sql_help.c:4277 sql_help.c:4315 -#: sql_help.c:4464 sql_help.c:4478 sql_help.c:4516 sql_help.c:4671 -#: sql_help.c:4685 sql_help.c:4723 +#: sql_help.c:4559 sql_help.c:4573 sql_help.c:4617 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4830 sql_help.c:4874 sql_help.c:5054 +#: sql_help.c:5068 sql_help.c:5112 msgid "select" msgstr "select" -#: sql_help.c:4232 sql_help.c:4471 sql_help.c:4678 +#: sql_help.c:4566 sql_help.c:4823 sql_help.c:5061 msgid "where from_item can be one of:" msgstr "dove from_item può essere uno di:" -#: sql_help.c:4235 sql_help.c:4241 sql_help.c:4244 sql_help.c:4248 -#: sql_help.c:4260 sql_help.c:4474 sql_help.c:4480 sql_help.c:4483 -#: sql_help.c:4487 sql_help.c:4499 sql_help.c:4681 sql_help.c:4687 -#: sql_help.c:4690 sql_help.c:4694 sql_help.c:4706 +#: sql_help.c:4569 sql_help.c:4575 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4594 sql_help.c:4826 sql_help.c:4832 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4851 sql_help.c:5064 sql_help.c:5070 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5089 msgid "column_alias" msgstr "alias_colonna" -#: sql_help.c:4236 sql_help.c:4475 sql_help.c:4682 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "sampling_method" msgstr "metodo_di_campionamento" -#: sql_help.c:4238 sql_help.c:4477 sql_help.c:4684 +#: sql_help.c:4572 sql_help.c:4829 sql_help.c:5067 msgid "seed" msgstr "seme" -#: sql_help.c:4242 sql_help.c:4275 sql_help.c:4481 sql_help.c:4514 -#: sql_help.c:4688 sql_help.c:4721 +#: sql_help.c:4576 sql_help.c:4615 sql_help.c:4833 sql_help.c:4872 +#: sql_help.c:5071 sql_help.c:5110 msgid "with_query_name" msgstr "nome_query_with" -#: sql_help.c:4252 sql_help.c:4255 sql_help.c:4258 sql_help.c:4491 -#: sql_help.c:4494 sql_help.c:4497 sql_help.c:4698 sql_help.c:4701 -#: sql_help.c:4704 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4592 sql_help.c:4843 +#: sql_help.c:4846 sql_help.c:4849 sql_help.c:5081 sql_help.c:5084 +#: sql_help.c:5087 msgid "column_definition" msgstr "definizione_colonna" -#: sql_help.c:4262 sql_help.c:4501 sql_help.c:4708 +#: sql_help.c:4596 sql_help.c:4602 sql_help.c:4853 sql_help.c:4859 +#: sql_help.c:5091 sql_help.c:5097 msgid "join_type" msgstr "tipo_join" -#: sql_help.c:4264 sql_help.c:4503 sql_help.c:4710 -msgid "join_condition" -msgstr "condizione_join" - -#: sql_help.c:4265 sql_help.c:4504 sql_help.c:4711 +#: sql_help.c:4599 sql_help.c:4856 sql_help.c:5094 msgid "join_column" msgstr "colonna_join" -#: sql_help.c:4266 sql_help.c:4505 sql_help.c:4712 +#: sql_help.c:4600 sql_help.c:4857 sql_help.c:5095 +msgid "join_using_alias" +msgstr "join_using_alias" + +#: sql_help.c:4606 sql_help.c:4863 sql_help.c:5101 msgid "and grouping_element can be one of:" msgstr "e elemento_raggruppante può essere uno di:" -#: sql_help.c:4274 sql_help.c:4513 sql_help.c:4720 +#: sql_help.c:4614 sql_help.c:4871 sql_help.c:5109 msgid "and with_query is:" msgstr "e with_query è:" -#: sql_help.c:4278 sql_help.c:4517 sql_help.c:4724 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "values" msgstr "valori" -#: sql_help.c:4279 sql_help.c:4518 sql_help.c:4725 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "insert" msgstr "insert" -#: sql_help.c:4280 sql_help.c:4519 sql_help.c:4726 +#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5115 msgid "update" msgstr "update" -#: sql_help.c:4281 sql_help.c:4520 sql_help.c:4727 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "delete" msgstr "delete" -#: sql_help.c:4308 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" + +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" + +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4627 sql_help.c:4884 sql_help.c:5122 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" + +#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5123 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" + +#: sql_help.c:4655 msgid "new_table" msgstr "nuova_tabella" -#: sql_help.c:4333 -msgid "timezone" -msgstr "timezone" - -#: sql_help.c:4378 +#: sql_help.c:4726 msgid "snapshot_id" msgstr "id_snapshot" -#: sql_help.c:4563 -msgid "from_list" -msgstr "lista_from" - -#: sql_help.c:4607 +#: sql_help.c:4986 msgid "sort_expression" msgstr "espressione_ordinamento" -#: sql_help.c:4734 sql_help.c:5549 +#: sql_help.c:5130 sql_help.c:6114 msgid "abort the current transaction" msgstr "annulla la transazione corrente" -#: sql_help.c:4739 +#: sql_help.c:5136 msgid "change the definition of an aggregate function" msgstr "cambia la definizione di una funzione di aggregazione" -#: sql_help.c:4744 +#: sql_help.c:5142 msgid "change the definition of a collation" msgstr "cambia la definizione di un ordinamento" -#: sql_help.c:4749 +#: sql_help.c:5148 msgid "change the definition of a conversion" msgstr "cambia la definizione di una conversione" -#: sql_help.c:4754 +#: sql_help.c:5154 msgid "change a database" msgstr "cambia un database" -#: sql_help.c:4759 +#: sql_help.c:5160 msgid "define default access privileges" msgstr "definisci i privilegi di accesso di default" -#: sql_help.c:4764 +#: sql_help.c:5166 msgid "change the definition of a domain" msgstr "cambia la definizione di un dominio" -#: sql_help.c:4769 +#: sql_help.c:5172 msgid "change the definition of an event trigger" msgstr "cambia la definizione di un trigger di evento" -#: sql_help.c:4774 +#: sql_help.c:5178 msgid "change the definition of an extension" msgstr "cambia la definizione di una estensione" -#: sql_help.c:4779 +#: sql_help.c:5184 msgid "change the definition of a foreign-data wrapper" msgstr "cambia la definizione di un wrapper di dati esterni" -#: sql_help.c:4784 +#: sql_help.c:5190 msgid "change the definition of a foreign table" msgstr "cambia la definizione di una tabella esterna" -#: sql_help.c:4789 +#: sql_help.c:5196 msgid "change the definition of a function" msgstr "cambia la definizione di una funzione" -#: sql_help.c:4794 +#: sql_help.c:5202 msgid "change role name or membership" msgstr "cambia il nome del ruolo o l'appartenenza" -#: sql_help.c:4799 +#: sql_help.c:5208 msgid "change the definition of an index" msgstr "cambia la definizione di un indice" -#: sql_help.c:4804 +#: sql_help.c:5214 msgid "change the definition of a procedural language" msgstr "cambia la definizione di un linguaggio procedurale" -#: sql_help.c:4809 +#: sql_help.c:5220 msgid "change the definition of a large object" msgstr "cambia la definizione di un large object" -#: sql_help.c:4814 +#: sql_help.c:5226 msgid "change the definition of a materialized view" msgstr "cambia la definizione di una vista materializzata" -#: sql_help.c:4819 +#: sql_help.c:5232 msgid "change the definition of an operator" msgstr "cambia la definizione di un operatore" -#: sql_help.c:4824 +#: sql_help.c:5238 msgid "change the definition of an operator class" msgstr "cambia la definizione di una classe di operatori" -#: sql_help.c:4829 +#: sql_help.c:5244 msgid "change the definition of an operator family" msgstr "cambia la definizione di una famiglia di operatori" -#: sql_help.c:4834 -msgid "change the definition of a row level security policy" +#: sql_help.c:5250 +msgid "change the definition of a row-level security policy" msgstr "cambia la definizione di una regola di sicurezza per riga" -#: sql_help.c:4839 +#: sql_help.c:5256 msgid "change the definition of a procedure" msgstr "cambia la definizione di una procedura" -#: sql_help.c:4844 +#: sql_help.c:5262 msgid "change the definition of a publication" msgstr "cambia la definizione di una pubblicazione" -#: sql_help.c:4849 sql_help.c:4934 +#: sql_help.c:5268 sql_help.c:5370 msgid "change a database role" msgstr "cambia un ruolo di database" -#: sql_help.c:4854 +#: sql_help.c:5274 msgid "change the definition of a routine" msgstr "cambia la definizione di una routine" -#: sql_help.c:4859 +#: sql_help.c:5280 msgid "change the definition of a rule" msgstr "cambia la definizione di una regola" -#: sql_help.c:4864 +#: sql_help.c:5286 msgid "change the definition of a schema" msgstr "cambia la definizione di uno schema" -#: sql_help.c:4869 +#: sql_help.c:5292 msgid "change the definition of a sequence generator" msgstr "cambia la definizione di un generatore di sequenza" -#: sql_help.c:4874 +#: sql_help.c:5298 msgid "change the definition of a foreign server" msgstr "cambia la definizione di un server esterno" -#: sql_help.c:4879 +#: sql_help.c:5304 msgid "change the definition of an extended statistics object" msgstr "cambia la definizione di una statistica estesa" -#: sql_help.c:4884 +#: sql_help.c:5310 msgid "change the definition of a subscription" msgstr "cambia la definizione di una sottoscrizione" -#: sql_help.c:4889 +#: sql_help.c:5316 msgid "change a server configuration parameter" msgstr "cambia un parametro di configurazione del server" -#: sql_help.c:4894 +#: sql_help.c:5322 msgid "change the definition of a table" msgstr "cambia la definizione di una tabella" -#: sql_help.c:4899 +#: sql_help.c:5328 msgid "change the definition of a tablespace" msgstr "cambia la definizione di un tablespace" -#: sql_help.c:4904 +#: sql_help.c:5334 msgid "change the definition of a text search configuration" msgstr "cambia la definizione di una configurazione di ricerca testo" -#: sql_help.c:4909 +#: sql_help.c:5340 msgid "change the definition of a text search dictionary" msgstr "cambia la definizione di un dizionario di ricerca testo" -#: sql_help.c:4914 +#: sql_help.c:5346 msgid "change the definition of a text search parser" msgstr "cambia la definizione di un analizzatore di ricerca testo" -#: sql_help.c:4919 +#: sql_help.c:5352 msgid "change the definition of a text search template" msgstr "cambia la definizione di un modello di ricerca testo" -#: sql_help.c:4924 +#: sql_help.c:5358 msgid "change the definition of a trigger" msgstr "cambia la definizione di un trigger" -#: sql_help.c:4929 +#: sql_help.c:5364 msgid "change the definition of a type" msgstr "cambia la definizione di un tipo di dato" -#: sql_help.c:4939 +#: sql_help.c:5376 msgid "change the definition of a user mapping" msgstr "cambia la definizione di una mappatura degli" -#: sql_help.c:4944 +#: sql_help.c:5382 msgid "change the definition of a view" msgstr "cambia la definizione di una vista" -#: sql_help.c:4949 +#: sql_help.c:5388 msgid "collect statistics about a database" msgstr "raccogli statistiche sul database" -#: sql_help.c:4954 sql_help.c:5614 +#: sql_help.c:5394 sql_help.c:6192 msgid "start a transaction block" msgstr "avvia un blocco di transazione" -#: sql_help.c:4959 +#: sql_help.c:5400 msgid "invoke a procedure" msgstr "esegui una procedura" -#: sql_help.c:4964 +#: sql_help.c:5406 msgid "force a write-ahead log checkpoint" msgstr "forza un checkpoint del write-ahead log" -#: sql_help.c:4969 +#: sql_help.c:5412 msgid "close a cursor" msgstr "chiudi un cursore" -#: sql_help.c:4974 +#: sql_help.c:5418 msgid "cluster a table according to an index" msgstr "raggruppa una tabella in base ad un indice" -#: sql_help.c:4979 +#: sql_help.c:5424 msgid "define or change the comment of an object" msgstr "definisci o modifica il commento di un oggetto" -#: sql_help.c:4984 sql_help.c:5449 +#: sql_help.c:5430 sql_help.c:5988 msgid "commit the current transaction" msgstr "rendi persistente la transazione corrente" -#: sql_help.c:4989 +#: sql_help.c:5436 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "concludi transazione che è stata precedentemente preparata per un commit a due fasi" -#: sql_help.c:4994 +#: sql_help.c:5442 msgid "copy data between a file and a table" msgstr "copia i dati tra un file ed una tabella" -#: sql_help.c:4999 +#: sql_help.c:5448 msgid "define a new access method" msgstr "definisci un nuovo metodo di accesso" -#: sql_help.c:5004 +#: sql_help.c:5454 msgid "define a new aggregate function" msgstr "definisci una nuova funzione aggregata" -#: sql_help.c:5009 +#: sql_help.c:5460 msgid "define a new cast" msgstr "definisci una nuova conversione di tipi" -#: sql_help.c:5014 +#: sql_help.c:5466 msgid "define a new collation" msgstr "definisci un nuovo ordinamento" -#: sql_help.c:5019 +#: sql_help.c:5472 msgid "define a new encoding conversion" msgstr "definisci una nuova conversione di codifica" -#: sql_help.c:5024 +#: sql_help.c:5478 msgid "create a new database" msgstr "crea un nuovo database" -#: sql_help.c:5029 +#: sql_help.c:5484 msgid "define a new domain" msgstr "definisci un nuovo dominio" -#: sql_help.c:5034 +#: sql_help.c:5490 msgid "define a new event trigger" msgstr "definisci un nuovo trigger di evento" -#: sql_help.c:5039 +#: sql_help.c:5496 msgid "install an extension" msgstr "installa un'estensione" -#: sql_help.c:5044 +#: sql_help.c:5502 msgid "define a new foreign-data wrapper" msgstr "definisci un nuovo wrapper di dati esterni" -#: sql_help.c:5049 +#: sql_help.c:5508 msgid "define a new foreign table" msgstr "definisci una nuova tabella esterna" -#: sql_help.c:5054 +#: sql_help.c:5514 msgid "define a new function" msgstr "definisci una nuova funzione" -#: sql_help.c:5059 sql_help.c:5109 sql_help.c:5194 +#: sql_help.c:5520 sql_help.c:5580 sql_help.c:5682 msgid "define a new database role" msgstr "definisci un nuovo ruolo database" -#: sql_help.c:5064 +#: sql_help.c:5526 msgid "define a new index" msgstr "crea un nuovo indice" -#: sql_help.c:5069 +#: sql_help.c:5532 msgid "define a new procedural language" msgstr "definisci un nuovo linguaggio procedurale" -#: sql_help.c:5074 +#: sql_help.c:5538 msgid "define a new materialized view" msgstr "definisci una nuova vista materializzata" -#: sql_help.c:5079 +#: sql_help.c:5544 msgid "define a new operator" msgstr "definisci un nuovo operatore" -#: sql_help.c:5084 +#: sql_help.c:5550 msgid "define a new operator class" msgstr "definisci una nuova classe di operatori" -#: sql_help.c:5089 +#: sql_help.c:5556 msgid "define a new operator family" msgstr "definisci una nuova famiglia operatore" -#: sql_help.c:5094 -msgid "define a new row level security policy for a table" +#: sql_help.c:5562 +msgid "define a new row-level security policy for a table" msgstr "definisci una nuova regola di sicurezza per riga per una tabella" -#: sql_help.c:5099 +#: sql_help.c:5568 msgid "define a new procedure" msgstr "definisci una nuova procedura" -#: sql_help.c:5104 +#: sql_help.c:5574 msgid "define a new publication" msgstr "definisci una nuova pubblicazione" -#: sql_help.c:5114 +#: sql_help.c:5586 msgid "define a new rewrite rule" msgstr "definisci una nuova regola di riscrittura" -#: sql_help.c:5119 +#: sql_help.c:5592 msgid "define a new schema" msgstr "crea un nuovo schema" -#: sql_help.c:5124 +#: sql_help.c:5598 msgid "define a new sequence generator" msgstr "definisci un nuovo generatore di sequenze" -#: sql_help.c:5129 +#: sql_help.c:5604 msgid "define a new foreign server" msgstr "definisci un nuovo server esterno" -#: sql_help.c:5134 +#: sql_help.c:5610 msgid "define extended statistics" msgstr "definisci una statistica estesa" -#: sql_help.c:5139 +#: sql_help.c:5616 msgid "define a new subscription" msgstr "definisci una nuova sottoscrizione" -#: sql_help.c:5144 +#: sql_help.c:5622 msgid "define a new table" msgstr "crea una nuova tabella" -#: sql_help.c:5149 sql_help.c:5579 +#: sql_help.c:5628 sql_help.c:6150 msgid "define a new table from the results of a query" msgstr "crea una nuova tabella dai risultati di una query" -#: sql_help.c:5154 +#: sql_help.c:5634 msgid "define a new tablespace" msgstr "crea un nuovo tablespace" -#: sql_help.c:5159 +#: sql_help.c:5640 msgid "define a new text search configuration" msgstr "definisci una nuova configurazione di ricerca testo" -#: sql_help.c:5164 +#: sql_help.c:5646 msgid "define a new text search dictionary" msgstr "definisci un nuovo dizionario di ricerca testo" -#: sql_help.c:5169 +#: sql_help.c:5652 msgid "define a new text search parser" msgstr "definisci un nuovo analizzatore di ricerca testo" -#: sql_help.c:5174 +#: sql_help.c:5658 msgid "define a new text search template" msgstr "definisci un nuovo modello di ricerca testo" -#: sql_help.c:5179 +#: sql_help.c:5664 msgid "define a new transform" msgstr "definisci una nuova trasformazione" -#: sql_help.c:5184 +#: sql_help.c:5670 msgid "define a new trigger" msgstr "definisci un nuovo trigger" -#: sql_help.c:5189 +#: sql_help.c:5676 msgid "define a new data type" msgstr "definisci un nuovo tipo di dato" -#: sql_help.c:5199 +#: sql_help.c:5688 msgid "define a new mapping of a user to a foreign server" msgstr "definisci una nuova mappatura di un utente ad un server esterno" -#: sql_help.c:5204 +#: sql_help.c:5694 msgid "define a new view" msgstr "definisci una nuova vista" -#: sql_help.c:5209 +#: sql_help.c:5700 msgid "deallocate a prepared statement" msgstr "dealloca una istruzione preparata" -#: sql_help.c:5214 +#: sql_help.c:5706 msgid "define a cursor" msgstr "definisci un cursore" -#: sql_help.c:5219 +#: sql_help.c:5712 msgid "delete rows of a table" msgstr "elimina le righe di una tabella" -#: sql_help.c:5224 +#: sql_help.c:5718 msgid "discard session state" msgstr "cancella lo stato della sessione" -#: sql_help.c:5229 +#: sql_help.c:5724 msgid "execute an anonymous code block" msgstr "esegui un blocco di codice anonimo" -#: sql_help.c:5234 +#: sql_help.c:5730 msgid "remove an access method" msgstr "rimuovi un metodo di accesso" -#: sql_help.c:5239 +#: sql_help.c:5736 msgid "remove an aggregate function" msgstr "elimina una funzione aggregata" -#: sql_help.c:5244 +#: sql_help.c:5742 msgid "remove a cast" msgstr "elimina una conversione di tipi" -#: sql_help.c:5249 +#: sql_help.c:5748 msgid "remove a collation" msgstr "elimina un ordinamento" -#: sql_help.c:5254 +#: sql_help.c:5754 msgid "remove a conversion" msgstr "elimina una conversione" -#: sql_help.c:5259 +#: sql_help.c:5760 msgid "remove a database" msgstr "elimina un database" -#: sql_help.c:5264 +#: sql_help.c:5766 msgid "remove a domain" msgstr "elimina un dominio" -#: sql_help.c:5269 +#: sql_help.c:5772 msgid "remove an event trigger" msgstr "elimina un trigger di evento" -#: sql_help.c:5274 +#: sql_help.c:5778 msgid "remove an extension" msgstr "elimina una estensione" -#: sql_help.c:5279 +#: sql_help.c:5784 msgid "remove a foreign-data wrapper" msgstr "elimina un wrapper di dati esterni" -#: sql_help.c:5284 +#: sql_help.c:5790 msgid "remove a foreign table" msgstr "elimina una tabella esterna" -#: sql_help.c:5289 +#: sql_help.c:5796 msgid "remove a function" msgstr "elimina una funzione" -#: sql_help.c:5294 sql_help.c:5349 sql_help.c:5434 +#: sql_help.c:5802 sql_help.c:5868 sql_help.c:5970 msgid "remove a database role" msgstr "elimina un ruolo di database" -#: sql_help.c:5299 +#: sql_help.c:5808 msgid "remove an index" msgstr "elimina un indice" -#: sql_help.c:5304 +#: sql_help.c:5814 msgid "remove a procedural language" msgstr "elimina un linguaggio procedurale" -#: sql_help.c:5309 +#: sql_help.c:5820 msgid "remove a materialized view" msgstr "elimina una vista materializzata" -#: sql_help.c:5314 +#: sql_help.c:5826 msgid "remove an operator" msgstr "elimina un operatore" -#: sql_help.c:5319 +#: sql_help.c:5832 msgid "remove an operator class" msgstr "elimina una classe di operatori" -#: sql_help.c:5324 +#: sql_help.c:5838 msgid "remove an operator family" msgstr "elimina una famiglia operatore" -#: sql_help.c:5329 +#: sql_help.c:5844 msgid "remove database objects owned by a database role" msgstr "elimina gli oggetti database di proprietà di un ruolo di database" -#: sql_help.c:5334 -msgid "remove a row level security policy from a table" +#: sql_help.c:5850 +msgid "remove a row-level security policy from a table" msgstr "rimuovi una regola di sicurezza per riga da una tabella" -#: sql_help.c:5339 +#: sql_help.c:5856 msgid "remove a procedure" msgstr "rimuovi una procedura" -#: sql_help.c:5344 +#: sql_help.c:5862 msgid "remove a publication" msgstr "rimuovi una pubblicazione" -#: sql_help.c:5354 +#: sql_help.c:5874 msgid "remove a routine" msgstr "rimuovi una routine" -#: sql_help.c:5359 +#: sql_help.c:5880 msgid "remove a rewrite rule" msgstr "elimina una regola di riscrittura" -#: sql_help.c:5364 +#: sql_help.c:5886 msgid "remove a schema" msgstr "elimina uno schema" -#: sql_help.c:5369 +#: sql_help.c:5892 msgid "remove a sequence" msgstr "elimina una sequenza" -#: sql_help.c:5374 +#: sql_help.c:5898 msgid "remove a foreign server descriptor" msgstr "elimina una descrizione server esterno" -#: sql_help.c:5379 +#: sql_help.c:5904 msgid "remove extended statistics" msgstr "rimuovi una statistica estesa" -#: sql_help.c:5384 +#: sql_help.c:5910 msgid "remove a subscription" msgstr "rimuovi una sottoscrizione" -#: sql_help.c:5389 +#: sql_help.c:5916 msgid "remove a table" msgstr "elimina una tabella" -#: sql_help.c:5394 +#: sql_help.c:5922 msgid "remove a tablespace" msgstr "elimina un tablespace" -#: sql_help.c:5399 +#: sql_help.c:5928 msgid "remove a text search configuration" msgstr "elimina una configurazione di ricerca testo" -#: sql_help.c:5404 +#: sql_help.c:5934 msgid "remove a text search dictionary" msgstr "elimina un dizionario di ricerca testo" -#: sql_help.c:5409 +#: sql_help.c:5940 msgid "remove a text search parser" msgstr "elimina un analizzatore di ricerca testo" -#: sql_help.c:5414 +#: sql_help.c:5946 msgid "remove a text search template" msgstr "elimina un modello di ricerca testo" -#: sql_help.c:5419 +#: sql_help.c:5952 msgid "remove a transform" msgstr "elimina una trasformazione" -#: sql_help.c:5424 +#: sql_help.c:5958 msgid "remove a trigger" msgstr "elimina un trigger" -#: sql_help.c:5429 +#: sql_help.c:5964 msgid "remove a data type" msgstr "elimina un tipo di dato" -#: sql_help.c:5439 +#: sql_help.c:5976 msgid "remove a user mapping for a foreign server" msgstr "elimina la mappatura degli utenti per un server esterno" -#: sql_help.c:5444 +#: sql_help.c:5982 msgid "remove a view" msgstr "elimina una vista" -#: sql_help.c:5454 +#: sql_help.c:5994 msgid "execute a prepared statement" msgstr "esegui una istruzione preparata" -#: sql_help.c:5459 +#: sql_help.c:6000 msgid "show the execution plan of a statement" msgstr "mostra il piano di esecuzione di una istruzione" -#: sql_help.c:5464 +#: sql_help.c:6006 msgid "retrieve rows from a query using a cursor" msgstr "estrai delle righe da una query utilizzando un cursore" -#: sql_help.c:5469 +#: sql_help.c:6012 msgid "define access privileges" msgstr "definisci i privilegi di accesso" -#: sql_help.c:5474 +#: sql_help.c:6018 msgid "import table definitions from a foreign server" msgstr "importa le definizioni di tabella da un server remoto" -#: sql_help.c:5479 +#: sql_help.c:6024 msgid "create new rows in a table" msgstr "crea nuove righe in una tabella" -#: sql_help.c:5484 +#: sql_help.c:6030 msgid "listen for a notification" msgstr "attendi l'arrivo di notifiche" -#: sql_help.c:5489 +#: sql_help.c:6036 msgid "load a shared library file" msgstr "carica un file di libreria condivisa" -#: sql_help.c:5494 +#: sql_help.c:6042 msgid "lock a table" msgstr "blocca una tabella" -#: sql_help.c:5499 +#: sql_help.c:6048 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "inserire, aggiornare o eliminare condizionalmente le righe di una tabella" + +#: sql_help.c:6054 msgid "position a cursor" msgstr "posiziona un cursore" -#: sql_help.c:5504 +#: sql_help.c:6060 msgid "generate a notification" msgstr "genera una notifica" -#: sql_help.c:5509 +#: sql_help.c:6066 msgid "prepare a statement for execution" msgstr "prepara una istruzione per l'esecuzione" -#: sql_help.c:5514 +#: sql_help.c:6072 msgid "prepare the current transaction for two-phase commit" msgstr "prepara la transazione corrente per un commit a due fasi" -#: sql_help.c:5519 +#: sql_help.c:6078 msgid "change the ownership of database objects owned by a database role" msgstr "cambia il proprietario degli oggetti del database posseduti da un ruolo" -#: sql_help.c:5524 +#: sql_help.c:6084 msgid "replace the contents of a materialized view" msgstr "sostituisci il contenuto di una vista materializzata" -#: sql_help.c:5529 +#: sql_help.c:6090 msgid "rebuild indexes" msgstr "ricostruisci indici" -#: sql_help.c:5534 +#: sql_help.c:6096 msgid "destroy a previously defined savepoint" msgstr "distruggi un punto di salvataggio precedentemente definito" -#: sql_help.c:5539 +#: sql_help.c:6102 msgid "restore the value of a run-time parameter to the default value" msgstr "ripristina un parametro di esecuzione al suo valore di predefinito" -#: sql_help.c:5544 +#: sql_help.c:6108 msgid "remove access privileges" msgstr "elimina i privilegi di accesso" -#: sql_help.c:5554 +#: sql_help.c:6120 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "annulla una transazione che era stata preparata per un commit a due fasi" -#: sql_help.c:5559 +#: sql_help.c:6126 msgid "roll back to a savepoint" msgstr "annulla le modifiche fino a un punto di salvataggio" -#: sql_help.c:5564 +#: sql_help.c:6132 msgid "define a new savepoint within the current transaction" msgstr "definisci un nuovo punto di salvataggio per la transazione corrente" -#: sql_help.c:5569 +#: sql_help.c:6138 msgid "define or change a security label applied to an object" msgstr "definisci o modifica un'etichetta di sicurezza applicata a un oggetto" -#: sql_help.c:5574 sql_help.c:5619 sql_help.c:5649 +#: sql_help.c:6144 sql_help.c:6198 sql_help.c:6234 msgid "retrieve rows from a table or view" msgstr "estrai righe da una tabella o una vista" -#: sql_help.c:5584 +#: sql_help.c:6156 msgid "change a run-time parameter" msgstr "modifica un parametro di esecuzione" -#: sql_help.c:5589 +#: sql_help.c:6162 msgid "set constraint check timing for the current transaction" msgstr "imposta il momento del controllo dei vincoli per la transazione corrente" -#: sql_help.c:5594 +#: sql_help.c:6168 msgid "set the current user identifier of the current session" msgstr "imposta l'identificativo utente della sessione corrente" -#: sql_help.c:5599 +#: sql_help.c:6174 msgid "set the session user identifier and the current user identifier of the current session" msgstr "imposta l'identificazione utente della sessione e l'identificazione utente corrente della sessione corrente" -#: sql_help.c:5604 +#: sql_help.c:6180 msgid "set the characteristics of the current transaction" msgstr "imposta le caratteristiche della transazione corrente" -#: sql_help.c:5609 +#: sql_help.c:6186 msgid "show the value of a run-time parameter" msgstr "mostra il valore di un parametro di esecuzione" -#: sql_help.c:5624 +#: sql_help.c:6204 msgid "empty a table or set of tables" msgstr "svuota una tabella o una lista di tabelle" -#: sql_help.c:5629 +#: sql_help.c:6210 msgid "stop listening for a notification" msgstr "termina l'attesa di notifiche" -#: sql_help.c:5634 +#: sql_help.c:6216 msgid "update rows of a table" msgstr "modifica le righe di una tabella" -#: sql_help.c:5639 +#: sql_help.c:6222 msgid "garbage-collect and optionally analyze a database" msgstr "pulisci ed eventualmente analizza il database" -#: sql_help.c:5644 +#: sql_help.c:6228 msgid "compute a set of rows" msgstr "genera una sequenza di righe" -#: startup.c:190 +#: startup.c:220 #, c-format -msgid "%s: -1 can only be used in non-interactive mode\n" -msgstr "%s: -1 può essere usato solo in modalità non interattiva\n" +msgid "-1 can only be used in non-interactive mode" +msgstr "-1 può essere utilizzato solo in modalità non interattiva" -#: startup.c:305 +#: startup.c:343 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: apertura del file di log \"%s\" fallita: %s\n" +msgid "could not open log file \"%s\": %m" +msgstr "apertura del file di log \"%s\" fallita: %m" -#: startup.c:412 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6079,57 +6464,184 @@ msgstr "" "Digita \"help\" per avere un aiuto.\n" "\n" -#: startup.c:561 +#: startup.c:612 #, c-format -msgid "%s: could not set printing parameter \"%s\"\n" -msgstr "%s: impostazione del parametro di stampa \"%s\" fallito\n" +msgid "could not set printing parameter \"%s\"" +msgstr "impossibile impostare il parametro di stampa \"%s\"" -#: startup.c:663 +#: startup.c:719 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Prova \"%s --help\" per maggiori informazioni.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Prova \"%s --help\" per maggiori informazioni." -#: startup.c:680 +#: startup.c:735 #, c-format -msgid "%s: warning: extra command-line argument \"%s\" ignored\n" -msgstr "%s: attenzione: parametro in eccesso \"%s\" nella riga di comando ignorato\n" +msgid "extra command-line argument \"%s\" ignored" +msgstr "argomento aggiuntivo della riga di comando \"%s\" ignorato" -#: startup.c:729 +#: startup.c:783 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: il proprio programma eseguibile non è stato trovato\n" +msgid "could not find own program executable" +msgstr "non è stato possibile trovare il proprio programma eseguibile" -#: tab-complete.c:4497 +#: tab-complete.c:5952 #, c-format msgid "" "tab completion query failed: %s\n" "Query was:\n" -"%s\n" +"%s" msgstr "" "query per il completamento tab fallita: %s\n" "La query era:\n" -"%s\n" +"%s" #: variables.c:139 #, c-format -msgid "unrecognized value \"%s\" for \"%s\": Boolean expected\n" -msgstr "valore \"%s\" non valido per \"%s\": è necessario un booleano\n" +msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" +msgstr "valore \"%s\" non valido per \"%s\": è necessario un booleano" #: variables.c:176 #, c-format -msgid "invalid value \"%s\" for \"%s\": integer expected\n" -msgstr "valore \"%s\" non valido per \"%s\": è necessario un intero\n" +msgid "invalid value \"%s\" for \"%s\": integer expected" +msgstr "valore \"%s\" non valido per \"%s\": è necessario un intero" #: variables.c:224 #, c-format -msgid "invalid variable name: \"%s\"\n" -msgstr "nome di variabile non valido: \"%s\"\n" +msgid "invalid variable name: \"%s\"" +msgstr "nome di variabile non valido: \"%s\"" -#: variables.c:393 +#: variables.c:419 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" -"Available values are: %s.\n" +"Available values are: %s." msgstr "" "valore \"%s\" non riconosciuto per \"%s\"\n" -"I valori disponibili sono: %s.\n" +"I valori disponibili sono: %s." + +#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" +#~ msgstr "" +#~ " \\g [FILE] o ; esegui la query (ed invia i risultati ad un file o\n" +#~ " ad una |pipe)\n" + +#~ msgid "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID large object operations\n" +#~ msgstr "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENTO] \n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID operazioni sui large object\n" + +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" + +#~ msgid "%s: could not open log file \"%s\": %s\n" +#~ msgstr "%s: apertura del file di log \"%s\" fallita: %s\n" + +#~ msgid "All connection parameters must be supplied because no database connection exists\n" +#~ msgstr "Tutti i parametri di connessione devono essere forniti perché non esiste alcuna connessione di database\n" + +#~ msgid "Disabled triggers:" +#~ msgstr "Trigger disabilitati:" + +#~ msgid "Enter new password: " +#~ msgstr "Inserire la nuova password: " + +#~ msgid "Invalid command \\%s. Try \\? for help.\n" +#~ msgstr "Comando errato \\%s. Prova \\? per la guida.\n" + +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "relazione speciale \"%s.%s\"" + +#~ msgid "The server (version %s) does not support altering default privileges.\n" +#~ msgstr "Il server (versione %s) non supporta la modifica dei privilegi di default.\n" + +#~ msgid "The server (version %s) does not support editing function source.\n" +#~ msgstr "Il server (versione %s) non supporta la modifica dei sorgenti delle funzioni.\n" + +#~ msgid "The server (version %s) does not support editing view definitions.\n" +#~ msgstr "Il server (versione %s) non supporta la modifica della definizione delle viste.\n" + +#~ msgid "The server (version %s) does not support foreign servers.\n" +#~ msgstr "Il server (versione %s) non supporta server esterni.\n" + +#~ msgid "The server (version %s) does not support foreign tables.\n" +#~ msgstr "Il server (versione %s) non supporta tabelle esterne.\n" + +#~ msgid "The server (version %s) does not support foreign-data wrappers.\n" +#~ msgstr "Il server (versione %s) non supporta i wrapper di dati esterni.\n" + +#~ msgid "The server (version %s) does not support full text search.\n" +#~ msgstr "Il server (versione %s) non supporta la ricerca full text.\n" + +#~ msgid "The server (version %s) does not support per-database role settings.\n" +#~ msgstr "Il server (versione %s) non supporta l'impostazione dei ruoli per database.\n" + +#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n" +#~ msgstr "Il server (versione %s) non supporta savepoint per ON_ERROR_ROLLBACK.\n" + +#~ msgid "The server (version %s) does not support showing function source.\n" +#~ msgstr "Il server (versione %s) non supporta la visualizzazione dei sorgenti delle funzioni.\n" + +#~ msgid "The server (version %s) does not support showing view definitions.\n" +#~ msgstr "-\"Il server (versione %s) non supporta la visualizzazione della definizione delle viste.\n" + +#~ msgid "The server (version %s) does not support tablespaces.\n" +#~ msgstr "Il server (versione %s) non supporta i tablespace.\n" + +#~ msgid "The server (version %s) does not support user mappings.\n" +#~ msgstr "Il server (versione %s) non supporta la mappatura di utenti.\n" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n" + +#~ msgid "child process was terminated by signal %s" +#~ msgstr "processo figlio terminato da segnale %s" + +#~ msgid "could not change directory to \"%s\": %s" +#~ msgstr "spostamento nella directory \"%s\" fallito: %s" + +#~ msgid "could not close pipe to external command: %s\n" +#~ msgstr "chiusura della pipe verso il comando esterno fallita: %s\n" + +#~ msgid "could not execute command \"%s\": %s\n" +#~ msgstr "esecuzione del comando \"%s\" fallito: %s\n" + +#~ msgid "could not open temporary file \"%s\": %s\n" +#~ msgstr "apertura del file temporaneo \"%s\" fallita: %s\n" + +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "lettura del link simbolico \"%s\" fallita" + +#~ msgid "could not stat file \"%s\": %s\n" +#~ msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n" + +#~ msgid "from_list" +#~ msgstr "lista_from" + +#~ msgid "pclose failed: %s" +#~ msgstr "pclose fallita: %s" + +#~ msgid "special" +#~ msgstr "speciale" + +#~ msgid "string_literal" +#~ msgstr "letterale_stringa" + +#~ msgid "timezone" +#~ msgstr "timezone" + +#~ msgid "unexpected result status for \\watch\n" +#~ msgstr "risultato imprevisto per \\watch\n" + +#~ msgid "unterminated quoted string\n" +#~ msgstr "stringa tra virgolette non terminata\n" + +#~ msgid "where direction can be empty or one of:" +#~ msgstr "dove direzione può essere vuota o una di:" diff --git a/third_party/spanner_pg/src/bin/psql/po/ja.po b/third_party/spanner_pg/src/bin/psql/po/ja.po index 93c1bbd3..b07e77d6 100644 --- a/third_party/spanner_pg/src/bin/psql/po/ja.po +++ b/third_party/spanner_pg/src/bin/psql/po/ja.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL 14)\n" +"Project-Id-Version: psql (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-06 15:58+0900\n" -"PO-Revision-Date: 2023-02-06 17:39+0900\n" +"POT-Creation-Date: 2023-02-06 15:59+0900\n" +"PO-Revision-Date: 2023-11-22 10:50+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -22,108 +22,112 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:141 ../../common/exec.c:258 ../../common/exec.c:304 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:301 +#, 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" +msgstr "カレントディレクトリを識別できませんでした: %m" -#: ../../common/exec.c:160 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" -msgstr "不正なバイナリ\"%s\"" +msgstr "無効なバイナリ\"%s\"" -#: ../../common/exec.c:210 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" -msgstr "バイナリ\"%s\"を読み取れませんでした" +msgstr "バイナリ\"%s\"を読み取ることができませんでした" -#: ../../common/exec.c:218 +#: ../../common/exec.c:226 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行対象の\"%s\"が見つかりませんでした" -#: ../../common/exec.c:274 ../../common/exec.c:313 +#: ../../common/exec.c:282 ../../common/exec.c:321 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: ../../common/exec.c:291 +#: ../../common/exec.c:299 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: ../../common/exec.c:414 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:527 ../../common/exec.c:572 ../../common/exec.c:664 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, 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: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 "nullポインタは複製できません (内部エラー)\n" +msgstr "null ポインターを複製することはできません(内部エラー) \n" #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザーID %ld が見つかりませんでした: %s" -#: ../../common/username.c:45 command.c:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" 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 msgid "command not executable" -msgstr "コマンドは実行可能形式ではありません" +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 "子プロセスが例外0x%Xで終了しました" +msgstr "子プロセスが例外 0x%X で強制終了しました" #: ../../common/wait_error.c:66 #, c-format @@ -133,7 +137,7 @@ 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:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" @@ -143,590 +147,596 @@ msgstr "キャンセル要求を送信しました\n" msgid "Could not send cancel request: " msgstr "キャンセル要求を送信できませんでした: " -#: ../../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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" -msgstr "中断されました\n" +msgstr "割り込み\n" -#: ../../fe_utils/print.c:3104 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "テーブルの内容に見出しを追加できませんでした: 列数%dが制限を超えています。\n" +msgstr "テーブルの内容にヘッダーを追加できません: 列数の上限値%dを超えています。\n" -#: ../../fe_utils/print.c:3144 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "テーブルの内容にセルを追加できませんでした: 全セル数%dが制限を超えています。\n" +msgstr "テーブルの内容にセルを追加できません: セルの合計数 %d が制限値を超えています。\n" -#: ../../fe_utils/print.c:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" -msgstr "出力フォーマットが無効(内部エラー): %d" +msgstr "出力フォーマットが無効(内部エラー):%d" -#: command.c:229 +#: ../../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:232 #, c-format msgid "invalid command \\%s" msgstr "不正なコマンド \\%s " -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr " \\? でヘルプを表示します。" -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: 余分な引数\"%s\"は無視されました" -#: command.c:301 +#: command.c:304 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s コマンドは無視されます; 現在の\\ifブロックを抜けるには\\endifまたはCtrl-Cを使用します" -#: command.c:562 +#: command.c:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "ユーザーID %ldのホームディレクトリを取得できませんでした : %s" -#: command.c:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: ディレクトリを\"%s\"に変更できませんでした: %m" -#: command.c:605 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "現在データベースに接続していません。\n" -#: command.c:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "問い合わせバッファがありません" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "不正な行番号です: %s" -#: command.c:1111 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "このサーバー(バージョン%s)は関数ソースコードの編集をサポートしていません。" - -#: command.c:1114 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "このサーバー(バージョン%s)はビュー定義の編集をサポートしていません。" - -#: command.c:1198 +#: command.c:1203 msgid "No changes" msgstr "変更されていません" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: エンコーディング名が不正であるか、または変換プロシージャが見つかりません。" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "直前のエラーはありません。" -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: 右括弧がありません" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: 必要な引数がありません" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else の後には置けません" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: 対応する \\if がありません" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else の後には置けません" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: 対応する \\if がありません" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: 対応する \\if がありません" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "問い合わせバッファは空です。" -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "ユーザー\"%s\"の新しいパスワードを入力してください: " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "もう一度入力してください: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "パスワードが一致しませんでした。" -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 変数の値を読み取ることができませんでした" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "問い合わせバッファがリセット(クリア)されました。" -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ファイル\"%s\"にヒストリーを出力しました。\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: 環境変数名に\"=\"を含めることはできません" -#: command.c:2408 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "このサーバー(バージョン%s)は関数ソースの表示をサポートしていません。" - -#: command.c:2411 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "このサーバー(バージョン%s)はビュー定義の表示をサポートしていません。" - -#: command.c:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "関数名が必要です" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "ビュー名が必要です" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "タイミングは on です。" -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "タイミングは off です。" -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " -msgstr "パスワード: " +msgstr "パスワード: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "ユーザー %s のパスワード: " -#: command.c:3106 +#: command.c:3168 #, c-format msgid "Do not give user, host, or port separately when using a connection string" -msgstr "接続文字列の使用時ー、ホスト、あるいはポートを個別に指定しないでください" +msgstr "接続文字列使用時はユーザー、ホストおよびポートは個別に指定しないでください" -#: command.c:3141 +#: command.c:3203 #, c-format msgid "No database connection exists to re-use parameters from" -msgstr "パラメータの再利用のもととなる既存のデータベース接続がありません" +msgstr "パラメータ再利用に使用可能なデータベース接続がありません" -#: command.c:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "以前の接続は保持されています" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "データベース\"%s\"にユーザー\"%s\"として接続しました。\n" -#: command.c:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s、サーバー %s)\n" -#: command.c:3569 +#: command.c:3643 #, 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" +"警告: %s のメジャーバージョンは %s ですが、サーバーのメジャーバージョンは %s です。\n" " psql の機能の中で、動作しないものがあるかもしれません。\n" -#: command.c:3608 +#: command.c:3680 #, 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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "不明" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "オフ" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "オン" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI暗号化接続\n" -#: command.c:3646 +#: command.c:3717 #, 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" " page \"Notes for Windows users\" for details.\n" msgstr "" -"警告: コンソールのコードページ(%u)がWindowsのコードページ(%u)と異なるため、\n" +"警告:コンソールのコードページ(%u)がWindowsのコードページ(%u)と異なるため、\n" " 8ビット文字が正しく表示されない可能性があります。詳細はpsqlリファレンスマニュアルの\n" " \"Windowsユーザー向けの注意\" (Notes for Windows users)を参照してください。\n" -#: command.c:3751 +#: command.c:3822 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "環境変数PSQL_EDITOR_LINENUMBER_ARGで行番号を指定する必要があります" -#: command.c:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "エディタ\"%s\"を起動できませんでした" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "/bin/shを起動できませんでした" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "一時ディレクトリが見つかりませんでした: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: command.c:4195 +#: command.c:4266 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: 曖昧な短縮形\"%s\"が\"%s\"と\"%s\"のどちらにも合致します" -#: command.c:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 有効な線のスタイルは ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 有効な Unicode 罫線のスタイルは single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 有効な Unicode 列罫線のスタイルは single, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 有効な Unicode ヘッダー罫線のスタイルは single, double" -#: command.c:4322 +#: command.c:4393 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsepは単一の1バイト文字でなければなりません" -#: command.c:4327 +#: command.c:4398 #, 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:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" -msgstr "\\pset: 未定義のオプション: %s" +msgstr "\\pset: 未定義のオプション:%s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "罫線スタイルは %d です。\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "ターゲットの幅が設定されていません。\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "ターゲットの幅は %d です。\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "拡張表示は on です。\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "拡張表示が自動的に使われます。\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "拡張表示は off です。\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSVのフィールド区切り文字は\"%s\"です。\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "フィールド区切り文字はゼロバイトです。\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "フィールド区切り文字は\"%s\"です。\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "デフォルトフッター(行数の表示)は on です。\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "デフォルトフッター(行数の表示)は off です。\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "出力形式は %s です。\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "線のスタイルは %s です。\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null表示は\"%s\"です。\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "『数値出力時のロケール調整』は on です。\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "『数値出力時のロケール調整』は off です。\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "表示が縦に長くなる場合はページャーを使います。\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "常にページャーを使います。\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "「ページャーを使う」は off です。\n" -#: command.c:4580 +#: command.c:4651 #, 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:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "レコードの区切り文字はゼロバイトです\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "レコード区切り文字はです。\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "レコード区切り記号は\"%s\"です。\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "テーブル属性は\"%s\"です。\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "テーブル属性は設定されていません。\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "タイトルは\"%s\"です。\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "タイトルは設定されていません。\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "「タプルのみ表示」は on です。\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "「タプルのみ表示」は off です。\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode の罫線スタイルは\"%s\"です。\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode 行罫線のスタイルは\"%s\"です。\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicodeヘッダー行のスタイルは\"%s\"です。\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: 失敗" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watchは空の問い合わせでは使えません" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "タイマーを設定できません: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%g 秒毎)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (%g 秒毎)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "シグナルを待機できませんでした: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -739,117 +749,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\"はビューではありません" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "reloptions配列をパースできませんでした" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "有効な接続がないのでエスケープできません" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "シェルコマンドの引数に改行(LF)または復帰(CR)が含まれています: \"%s\"" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "サーバーへの接続が失われました" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "サーバーへの接続が失われました。リセットしています: " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "失敗。\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "成功。\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "想定外のPQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "時間: %.3f ミリ秒\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒(%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%.0f 日 %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, c-format msgid "You are currently not connected to a database." msgstr "現在データベースに接続していません。" -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watchはCOPYと一緒には使えません" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "\\watchで想定外の結果ステータス" - -#: common.c:694 +#: common.c:654 #, 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:697 +#: common.c:657 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "PID %2$dのサーバープロセスから非同期通知\"%1$s\"を受信しました。\n" -#: common.c:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "結果テーブルを表示できませんでした: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset に対して返すべき行がありません" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset に対して複数の行が返されました" -#: common.c:791 +#: common.c:731 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" -msgstr "特殊変数\"%s\"への \\gset は無視されます" +msgstr "特殊変数\"%s\"への\\gsetは無視されました" -#: common.c:1211 +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -860,36 +860,31 @@ msgstr "" "%s\n" "***([Enter] を押して進むか、x [Enter] でキャンセル)**************\n" -#: 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:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" -msgstr "ステートメント: %s" +msgstr "文: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "想定外のトランザクション状態(%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "列" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "タイプ" -#: common.c:1564 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" -msgstr "このコマンドは結果を返却しないか、結果に列がありません。\n" +msgstr "このコマンドは結果を返却しないか、結果にカラムが含まれません。\n" #: copy.c:98 #, c-format @@ -953,18 +948,18 @@ msgstr "" "コピーするデータに続いて改行を入力してください。\n" "バックスラッシュとピリオドだけの行、もしくは EOF シグナルで終了します。" -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "読み取りエラーのため中止" -#: copy.c:705 +#: 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 @@ -1006,1146 +1001,1152 @@ msgstr "\\crosstabview: 列名があいまいです: \"%s\"" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 列名が見つかりませんでした: \"%s\"" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "スキーマ" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "名前" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "結果のデータ型" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "引数のデータ型" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "説明" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "集約関数一覧" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "このサーバー(バージョン%s)はアクセスメソッドをサポートしていません。" -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "インデックス" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "テーブル" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "ハンドラ" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "アクセスメソッド一覧" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "このサーバー(バージョン%s) はテーブル空間をサポートしていません。" - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "所有者" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "場所" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "オプション" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "サイズ" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "テーブル空間一覧" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\dfで指定できるオプションは [anptwS+] のみです" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "集約" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "ウィンドウ" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "プロシージャ" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "関数" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "トリガー" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "IMMUTABLE" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "STABLE" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "VOLATILE" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "関数の変動性分類" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "制限付き" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "安全" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "危険" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "並列実行" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "定義ロール" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "起動ロール" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "セキュリティ" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "手続き言語" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "ソースコード" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "関数一覧" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "内部名" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "構成要素" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "データ型一覧" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "左辺の型" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "右辺の型" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "結果の型" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "関数" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "演算子一覧" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "エンコーディング" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "照合順序" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype(変換演算子)" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICUロケール" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "ロケールプロバイダー" + +#: describe.c:964 msgid "Tablespace" msgstr "テーブル空間" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "データベース一覧" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "テーブル" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "ビュー" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" -msgstr "マテリアライズドビュー" +msgstr "実体化ビュー" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "シーケンス" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "外部テーブル" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "パーティションテーブル" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "列の権限" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "ポリシー" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "アクセス権限" -#: describe.c:1293 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "このサーバー(バージョン%s)はデフォルト権限の変更をサポートしていません。" - -#: describe.c:1313 +#: describe.c:1188 msgid "function" msgstr "関数" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "型" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "スキーマ" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "デフォルトのアクセス権限" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "オブジェクト" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "テーブル制約" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "ドメイン制約" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "演算子クラス" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "演算子族" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "ルール" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "オブジェクトの説明" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\"という名前のリレーションは見つかりませんでした。" -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "リレーションが見つかりませんでした。" -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "OID %sを持つリレーションが見つかりませんでした。" -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "開始" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "最小" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "最大" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "増分" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "はい" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "いいえ" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "循環?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "キャッシュ" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "所有者: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "識別列のシーケンス: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "ログ出力なしのシーケンス\"%s.%s\"" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "シーケンス \"%s.%s\"" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" -msgstr "ログを取らないテーブル\"%s.%s\"" +msgstr "ログ出力なしのテーブル\"%s.%s\"" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "テーブル\"%s.%s\"" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "ビュー\"%s.%s\"" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" -msgstr "ログを取らないマテリアライズドビュー\"%s.%s\"" +msgstr "ログ出力なしの実体化ビュー\"%s.%s\"" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" -msgstr "マテリアライズドビュー\"%s.%s\"" +msgstr "実体化ビュー\"%s.%s\"" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" -msgstr "ログを取らないインデックス\"%s.%s\"" +msgstr "ログ出力なしのインデックス\"%s.%s\"" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "インデックス\"%s.%s\"" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" -msgstr "ログを取らないパーティションインデックス\"%s.%s\"" +msgstr "ログ出力なしのパーティション親インデックス\"%s.%s\"" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "特殊なリレーション\"%s.%s\"" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST テーブル\"%s.%s\"" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "複合型\"%s.%s\"" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "外部テーブル\"%s.%s\"" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" -msgstr "ログを取らないパーティションテーブル\"%s.%s\"" +msgstr "ログ出力なしのパーティション親テーブル\"%s.%s\"" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "照合順序" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Null 値を許容" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "デフォルト" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "キー?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "定義" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "FDW オプション" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "ストレージ" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" -msgstr "圧縮方式" +msgstr "圧縮" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "統計目標" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" -msgstr "親テーブル: %s %s%s" +msgstr "親パーティション: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "パーティション制約なし" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "パーティションの制約: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "パーティションキー: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "所属先テーブル\"%s.%s\"" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "プライマリキー, " -#: describe.c:2514 -msgid "unique, " -msgstr "ユニーク," +#: describe.c:2312 +msgid "unique" +msgstr "ユニーク" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls not distinct" + +#: describe.c:2315 +msgid ", " +msgstr ", " -#: describe.c:2520 +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"用" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr "、述語 (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr "、クラスター化" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr "無効" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr "、遅延可能" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr "、最初から遅延中" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr "、レプリカの id" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "インデックス:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Check 制約:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "外部キー制約:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "参照元:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "ポリシー:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "ポリシー(行セキュリティを強制的に有効化):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "ポリシー(行セキュリティ有効化): (なし)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "ポリシー(行セキュリティを強制的に有効化): (なし)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "ポリシー(行セキュリティを無効化):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "統計オブジェクト:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "ルール:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "無効化されたルール:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "常に適用するルール:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "レプリカ上でのみ適用するルール:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "パブリケーション:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "ビューの定義:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "トリガー:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "無効化されたユーザートリガ:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "無効化されたトリガー:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "無効化された内部トリガー:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "常に適用するするトリガー:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "レプリカ上でのみ適用するトリガー:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "サーバー: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "FDW オプション: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "継承元" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "パーティション数: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "パーティション数: %d (\\d+ で一覧を表示)。" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "子テーブル数: %d (\\d+ で一覧を表示)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "子テーブル" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "パーティション" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "%s 型の型付きテーブル" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "レプリカ識別" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "OID あり: はい" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "アクセスメソッド: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr "、テーブル空間\"%s\"" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "ロール一覧" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "ロール名" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "属性" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "所属グループ" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "スーパーユーザー" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "継承なし" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "ロール作成可" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "DB作成可" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "ログインできません" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "レプリケーション可" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS のバイパス" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "接続なし" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d 個の接続" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "パスワードの有効期限 " -#: describe.c:3991 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "このサーバー(バージョン%s)はデータベースごとのロール設定をサポートしていません。" - -#: describe.c:4004 +#: describe.c:3777 msgid "Role" msgstr "ロール" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "データベース" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "設定" -#: describe.c:4030 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "ロール\"%s\"とデータベース\"%s\"の設定が見つかりませんでした。" -#: describe.c:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "ロール\"%s\"の設定が見つかりませんでした。" -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "設定が見つかりませんでした。" -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "設定一覧" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "インデックス" -#: describe.c:4115 -msgid "special" -msgstr "特殊" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" -msgstr "TOASTテーブル" +msgstr "TOAST テーブル" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "パーティションインデックス" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "永続" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "一時" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "ログなし" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "永続性" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "アクセスメソッド" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "リレーション一覧" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "このサーバー(バージョン%s)は宣言的テーブルパーティショニングをサポートしていません。" -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "パーティションインデックスの一覧" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "パーティションテーブルの一覧" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "パーティションリレーションの一覧" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "親の名前" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "末端パーティションのサイズ" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "トータルサイズ" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "信頼済み" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "内部言語" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "呼び出しハンドラー" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "バリデーター" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "インラインハンドラー" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "手続き言語一覧" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "CHECK制約" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "ドメイン一覧" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "変換元" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "変換先" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "デフォルト?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "符号化方式一覧" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "パラメータ" + +#: describe.c:4498 +msgid "Value" +msgstr "値" + +#: describe.c:4505 +msgid "Context" +msgstr "コンテクスト" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "設定パラメータの一覧" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "非デフォルトの設定パラメータの一覧" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "このサーバー(バージョン%s)はイベントトリガーをサポートしていません。" + +#: describe.c:4587 msgid "Event" msgstr "イベント" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "有効" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "レプリカ" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "常時" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "無効" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "有効状態" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "タグ" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "イベントトリガー一覧" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "このサーバー(バージョン%s)は拡張統計情報をサポートしていません。" -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" -msgstr "個別値数" +msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" -msgstr "関数従属" +msgstr "Dependencies" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" -msgstr "最頻値" +msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" -msgstr "拡張統計情報一覧" +msgstr "拡張統計情報の一覧" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "変換元の型" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "変換先の型" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "代入時のみ" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "暗黙的に適用 ?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "キャスト一覧" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "このサーバー(バージョン%s)は照合順序をサポートしていません。" - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "プロバイダー" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "確定的?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "照合順序一覧" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "スキーマ一覧" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "このサーバー(バージョン%s)は全文検索をサポートしていません。" - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "テキスト検索用パーサ一覧" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "テキスト検索用パーサ\"%s\"が見つかりませんでした。" -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "テキスト検索パーサが見つかりませんでした。" -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "パース開始" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "メソッド" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "次のトークンを取得" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "パース終了" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "見出しを取得" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "トークンタイプを取得" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "テキスト検索パーサ\"%s.%s\"" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "テキスト検索パーサ\"%s\"" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "トークン名" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "パーサ\"%s.%s\"のトークンタイプ" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "パーサ\"%s\"のトークンタイプ" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "テンプレート" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "初期化オプション" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "テキスト検索用辞書一覧" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "初期化" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Lex 処理" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "テキスト検索テンプレート一覧" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "テキスト検索設定一覧" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "テキスト検索用設定\"%s\"が見つかりませんでした。" -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "テキスト検索設定が見つかりませんでした。" -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "トークン" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "辞書" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "テキスト検索設定\"%s.%s\"" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "テキスト検索設定\"%s\"" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2154,7 +2155,7 @@ msgstr "" "\n" "パーサ: \"%s.%s\"" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2163,255 +2164,253 @@ msgstr "" "\n" "パーサ: \"%s\"" -#: describe.c:5787 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "このサーバー(バージョン%s)は外部データラッパをサポートしていません。" - -#: describe.c:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "外部データラッパ一覧" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "このサーバー(バージョン%s)は外部サーバーをサポートしていません。" - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "外部データラッパ" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "バージョン" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "外部サーバー一覧" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "このサーバー(バージョン%s)はユーザーマッピングをサポートしていません。" - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "サーバー" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "ユーザー名" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "ユーザーマッピング一覧" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "このサーバー(バージョン%s)は外部テーブルをサポートしていません。" - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "外部テーブル一覧" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "このサーバー(バージョン%s)は機能拡張をサポートしていません。" - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "インストール済みの拡張一覧" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\"という名前の機能拡張が見つかりませんでした。" -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "機能拡張が見つかりませんでした。" -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "オブジェクトの説明" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "機能拡張\"%s\"内のオブジェクト" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "このサーバー(バージョン%s)はパブリケーションをサポートしていません。" -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "全テーブル" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Insert文" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Update文" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Delete文" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Truncate文" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "最上位パーティションテーブル経由" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "パブリケーション一覧" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\"という名前のパブリケーションが見つかりませんでした。" -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "パブリケーションが見つかりませんでした。" -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "パブリケーション %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "テーブル:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "以下のスキーマ内のテーブル:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "このサーバー(バージョン%s)はサブスクリプションをサポートしていません。" -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "パブリケーション" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "バイナリ" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" -msgstr "ストリーム" +msgstr "ストリーミング" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "2相コミット" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "エラー時無効化" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "同期コミット" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "接続情報" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "スキップLSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "サブスクリプション一覧" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "AM" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "入力の型" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "ストレージタイプ" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "演算子クラス" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "演算子族" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "演算子クラス一覧" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "適用可能型" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "演算子族一覧" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "演算子" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "ストラテジ" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "順序付け" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "検索" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "目的" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "ソート演算子族" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "演算子族の演算子一覧" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "登録左辺型" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "登録右辺型" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "番号" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "演算子族のサポート関数一覧" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "ラージ オブジェクト" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2419,13 +2418,11 @@ msgstr "" "psql は PostgreSQL の対話型ターミナルです。\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" -msgstr "使用方法:\n" +msgstr "使い方:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2433,33 +2430,28 @@ msgstr "" " psql [オプション]... [データベース名 [ユーザー名]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "一般的なオプション:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=コマンド 単一の(SQLまたは内部)コマンドを一つだけ実行して終了\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DB名 接続するデータベース名(デフォルト: \"%s\")\n" -#: help.c:84 -#, c-format +#: help.c:87 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 +#: help.c:88 msgid " -l, --list list available databases, then exit\n" -msgstr " -l, --list 使用可能なデータベース一覧を表示して終了\n" +msgstr " -l(エル), --list 使用可能なデータベース一覧を表示して終了\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2469,18 +2461,15 @@ msgstr "" " psql 変数 '名前' に '値' をセット\n" " (例: -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 初期化ファイル (~/.psqlrc) を読み込まない\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2488,23 +2477,19 @@ msgstr "" " -1 (数字の1), --single-transaction\n" " (対話形式でない場合)単一のトランザクションとして実行\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] このヘルプを表示して終了\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands バックスラッシュコマンドの一覧を表示して終了\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 特殊変数の一覧を表示して終了\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2512,76 +2497,63 @@ msgstr "" "\n" "入出力オプション:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all スクリプトから読み込んだ入力をすべて表示\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 失敗したコマンドを表示\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries サーバーへ送信したコマンドを表示\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 内部コマンドが生成した問い合わせを表示\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME セッションログをファイルに書き込む\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効にする\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 問い合わせの結果をファイル (または |パイプ)に送る\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet 静かに実行 (メッセージなしで、問い合わせの出力のみ)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step シングルステップモード (各問い合わせごとに確認)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line 単一行モード (行末でSQLコマンドを終端)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" msgstr "" "\n" -"出力フォーマットのオプション:\n" +"出力フォーマットのオプション\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align 桁揃えなしのテーブル出力モード\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2591,20 +2563,17 @@ msgstr "" " 桁揃えなし出力時のフィールド区切り文字\n" " (デフォルト: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML テーブル出力モード\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=変数[=値] 表示オプション '変数' を '値' にセット\n" " (\\pset コマンドを参照)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2613,23 +2582,19 @@ msgstr "" " 桁揃えなし出力におけるレコード区切り文字\n" " (デフォルト: 改行)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 行のみを表示\n" -#: help.c:120 -#, c-format +#: help.c:123 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 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 拡張テーブル出力に切り替える\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2637,8 +2602,7 @@ msgstr "" " -z, --field-separator-zero\n" " 桁揃えなし出力のフィールド区切りをバイト値の0に設定\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2646,8 +2610,7 @@ msgstr "" " -0, --record-separator-zero\n" " 桁揃えなし出力のレコード区切りをバイト値の0に設定\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2655,39 +2618,36 @@ msgstr "" "\n" "接続オプション:\n" -#: help.c:130 +#: help.c:133 #, 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:134 msgid "local socket" msgstr "ローカルソケット" -#: help.c:134 +#: help.c:137 #, 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 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME データベースのユーザー名 (デフォルト: \"%s\")\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" -msgstr " -W, --password パスワードプロンプトの強制表示 (本来は自動的に表示)\n" +msgstr " -W, --password パスワードプロンプトの強制表示(本来は自動的に表示)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2700,380 +2660,321 @@ msgstr "" "をタイプするか、またはPostgreSQLドキュメント中のpsqlのセクションを参照のこと。\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "バグは<%s>に報告してください。\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "一般\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL の使い方と配布条件を表示\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [列] 問い合わせを実行し、結果をクロス表形式で出力\n" +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [列リスト] 問い合わせを実行し、結果をクロス表形式で出力\n" -#: help.c:174 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose 最後のエラーメッセージを最大の冗長性で表示\n" -#: help.c:175 -#, c-format +#: help.c:195 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:177 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc 問い合わせを実行せずに結果の説明を行う\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec 問い合わせを実行し、結果の中の個々の値を実行\n" -#: help.c:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] 問い合わせを実行して結果を psql 変数に格納\n" -#: help.c:180 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [ファイル名] \\g と同じ、ただし拡張出力モードを強制\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q psql を終了する\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [秒数] 指定した秒数ごとに問い合わせを実行\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "ヘルプ\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [コマンド] バックスラッシュコマンドのヘルプを表示\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? オプション psql のコマンドライン・オプションのヘルプを表示\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? 変数名 特殊変数のヘルプを表示\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [名前] SQLコマンドの文法ヘルプの表示。* で全コマンドを表示\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "問い合わせバッファ\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ファイル] [行番号] 現在の問い合わせバッファ(やファイル)を外部エディタで\n" " 編集\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [関数名 [行番号]] 関数定義を外部エディタで編集\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [ビュー名 [行番号]] ビュー定義を外部エディタで編集\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p 問い合わせバッファの内容を表示\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 問い合わせバッファをリセット(クリア)\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ファイル] ヒストリを表示またはファイルに保存\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ファイル 問い合わせバッファの内容をファイルに保存\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "入出力\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... クライアントホストに対し、データストリームを使って\n" " SQL COPYを実行\n" -#: help.c:207 -#, c-format +#: help.c:227 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [文字列] 文字列を標準出力に書き込む (-n で改行しない)\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i ファイル ファイルからコマンドを読み込んで実行\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir ファイル \\i と同じ。ただし現在のスクリプトの場所からの相対パス\n" " で指定\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ファイル] 問い合わせ結果をすべてファイルまたは |パイプ へ送出\n" -#: help.c:211 -#, c-format +#: help.c:231 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [文字列] 文字列を\\oで指定した出力ストリームに書き込む(-n で改行\n" " しない)\n" -#: help.c:212 -#, c-format +#: help.c:232 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [文字列] 文字列を標準エラー出力に書き込む (-n で改行しない)\n" -#: help.c:215 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "条件分岐\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 条件分岐ブロックの開始\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR 現在の条件分岐ブロック内の選択肢\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else 現在の条件分岐ブロックにおける最後の選択肢\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif 条件分岐ブロックの終了\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "情報表示\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" -msgstr " (オプション: S = システムオブジェクトを表示, + = 詳細表示)\n" +msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] テーブル、ビュー、およびシーケンスの一覧を表示\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" -msgstr " \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの説明を表示\n" +msgstr "" +" \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの\n" +" 説明を表示\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [パターン] 集約関数の一覧を表示\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [パターン] アクセスメソッドの一覧を表示\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算子クラスの一覧を表示\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 演算子族の一覧を表示\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 演算子族の演算子の一覧を表示\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 演算子族のサポート関数の一覧を表示\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [パターン] テーブル空間の一覧を表示\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [パターン] 符号化方式間の変換の一覧を表示\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] 設定パラメータの一覧を表示\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [パターン] キャストの一覧を表示します。\n" -#: help.c:235 -#, c-format +#: help.c:256 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [パターン] 他では表示されないオブジェクトの説明を表示\n" -#: help.c:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [パターン] ドメインの一覧を表示\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [パターン] デフォルト権限の一覧を表示\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [パターン] 外部テーブルの一覧を表示\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [パターン] 外部サーバーの一覧を表示\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [パターン] 外部テーブルの一覧を表示\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [パターン] ユーザーマッピングの一覧を表示\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [パターン] 外部データラッパの一覧を表示\n" -#: help.c:243 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" " \\df[anptw][S+] [関数パターン [型パターン ...]]\n" -" [集約関数のみ/通常関数/プロシージャ/トリガ関数/ウィンドウ関数]の一覧を表示\n" +" [集約/通常/プロシージャ/トリガー/ウィンドウ]\n" +" 関数のみの一覧を表示\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [パターン] テキスト検索設定の一覧を表示\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [パターン] テキスト検索辞書の一覧を表示\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [パターン] テキスト検索パーサの一覧を表示\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [パターン] テキスト検索テンプレートの一覧を表示\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [パターン] ロールの一覧を表示\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [パターン] インデックスの一覧を表示\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [パターン] 手続き言語の一覧を表示\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [パターン] 実体化ビューの一覧を表示\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [パターン] スキーマの一覧を表示\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3081,129 +2982,132 @@ msgstr "" " \\do[S+] [演算子パターン [型パターン [型パターン]]]\n" " 演算子の一覧を表示\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [パターン] 照合順序の一覧を表示\n" -#: help.c:258 -#, c-format +#: help.c:279 msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [パターン] テーブル、ビュー、シーケンスのアクセス権の一覧を表示\n" -#: help.c:259 -#, c-format +#: help.c:280 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr "" " \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスのみ]\n" " の一覧を表示 [n=入れ子]\n" -#: help.c:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [ロールパターン [DBパターン]]\n" " データベース毎のロール設定の一覧を表示\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [パターン] レプリケーションのパブリケーションの一覧を表示\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [パターン] レプリケーションのサブスクリプションの一覧を表示\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [パターン] シーケンスの一覧を表示\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [パターン] テーブルの一覧を表示\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [パターン] データ型の一覧を表示\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [パターン] ロールの一覧を表示\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [パターン] ビューの一覧を表示\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [パターン] 機能拡張の一覧を表示\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [パターン] 拡張統計情報の一覧を表示\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [パターン] イベントトリガーの一覧を表示\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [パターン] データベースの一覧を表示\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] 関数名 関数の定義を表示\n" -#: help.c:273 -#, c-format -msgid " \\sv[+] VIEWNAME show a view's definition\n" -msgstr " \\sv[+] ビュー名 ビューの定義を表示\n" +#: help.c:294 +msgid " \\sv[+] VIEWNAME show a view's definition\n" +msgstr " \\sv[+] ビュー名 ビューの定義を表示\n" + +#: help.c:295 +msgid " \\z [PATTERN] same as \\dp\n" +msgstr " \\z [パターン] \\dp と同じ\n" + +#: help.c:298 +msgid "Large Objects\n" +msgstr "ラージ・オブジェクト\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr "" +" \\lo_export LOBOID ファイル名\n" +" ラージ・オブエジェクトをファイルに書き込む\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import ファイル名 [コメント]\n" +" ラージ・オブジェクトをファイルから読み込む\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] ラージ・オブジェクトの一覧を表示\n" -#: help.c:274 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [パターン] \\dp と同じ\n" +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID ラージ・オブジェクトを削除\n" -#: help.c:277 -#, c-format +#: help.c:306 msgid "Formatting\n" msgstr "書式設定\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a 非整列と整列間の出力モードの切り替え\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [文字列] テーブルのタイトルを設定、値がなければ削除\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [文字列] 問い合わせ結果の非整列出力時のフィールド区切り文字を\n" " 表示または設定\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML出力モードの切り替え (現在値: %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3221,27 +3125,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] 結果行のみ表示 (現在値: %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [文字列] HTMLの
タグ属性の設定、値がなければ解除\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] 拡張出力の切り替え (現在値: %s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "自動(auto)" + +#: help.c:326 msgid "Connection\n" msgstr "接続\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3250,8 +3156,7 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: \"%s\")\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3259,88 +3164,64 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: 未接続)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo 現在の接続に関する情報を表示\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [エンコーディング] クライアントのエンコーディングを表示または設定\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" -msgstr " \\password [ユーザー名] ユーザーのパスワードを安全に変更\n" +msgstr " \\password [ユーザー名] ユーザーのパスワードを安全に変更\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "オペレーティングシステム\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] カレントディレクトリを変更\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr "" +" \\getenv psql変数 環境変数\n" +" 環境変数を取得\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv 名前 [値] 環境変数を設定または解除\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] コマンドの実行時間表示の切り替え (現在値: %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [コマンド] シェルでコマンドを実行するか、もしくは対話型シェルを\n" " 起動します。\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "変数\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [テキスト] 変数名 ユーザーに対して内部変数の設定を要求します\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [変数名 [値]] 内部変数の値を設定、パラメータがなければ一覧を表示\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset 変数名 内部変数を削除\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "ラージ・オブジェクト\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID ファイル名\n" -" \\lo_import ファイル名 [コメント]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID ラージオブジェクトの操作\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3348,13 +3229,11 @@ msgstr "" "特別に扱われる変数の一覧\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "psql変数:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3364,8 +3243,7 @@ msgstr "" " またはpsql内で \\set 名前 値\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3373,8 +3251,7 @@ msgstr "" " AUTOCOMMIT\n" " セットされている場合、SQLコマンドが成功した際に自動的にコミット\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3384,8 +3261,7 @@ msgstr "" " SQLキーワードの補完に使う文字ケースを指定\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3393,8 +3269,7 @@ msgstr "" " DBNAME\n" " 現在接続中のデータベース名\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3404,8 +3279,7 @@ msgstr "" " どの入力を標準出力への出力対象とするかを設定\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3415,8 +3289,7 @@ msgstr "" " セットされていれば、バックスラッシュコマンドで実行される内部問い合わせを\n" " 表示; \"noexec\"を設定した場合は実行せずに表示のみ\n" -#: help.c:371 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3424,8 +3297,7 @@ msgstr "" " ENCODING\n" " 現在のクライアント側の文字セットのエンコーディング\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3433,8 +3305,7 @@ msgstr "" " ERROR\n" " 最後の問い合わせが失敗であれば真、そうでなければ偽\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3442,8 +3313,7 @@ msgstr "" " FETCH_COUNT\n" " 一度に取得および表示する結果の行数 (0 = 無制限)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3452,17 +3322,16 @@ msgstr "" " 設定すると、テーブルアクセスメソッドは表示されない\n" "\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" msgstr "" " HIDE_TOAST_COMPRESSION\n" -" 設定すると圧縮方式は表示されません\n" +" 設定すると、圧縮方式は表示されない\n" +"\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3470,8 +3339,7 @@ msgstr "" " HISTCONTROL\n" " コマンド履歴の制御 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3479,8 +3347,7 @@ msgstr "" " HISTFILE\n" " コマンド履歴を保存するファイルの名前\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3488,8 +3355,7 @@ msgstr "" " HISTSIZE\n" " コマンド履歴で保存するコマンド数の上限\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3497,8 +3363,7 @@ msgstr "" " HOST\n" " 現在接続中のデータベースサーバーホスト\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3506,8 +3371,7 @@ msgstr "" " IGNOREEOF\n" " 対話形セッションを終わらせるのに必要なEOFの数\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3515,8 +3379,7 @@ msgstr "" " LASTOID\n" " 最後の変更の影響を受けたOID\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3527,8 +3390,7 @@ msgstr "" " 最後のエラーのメッセージおよび SQLSTATE、\n" " なにもなければ空の文字列および\"00000\"\n" -#: help.c:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3537,8 +3399,7 @@ msgstr "" " セットされている場合、エラーでトランザクションを停止しない (暗黙のセーブ\n" " ポイントを使用)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3546,8 +3407,7 @@ msgstr "" " ON_ERROR_STOP\n" " エラー発生後にバッチ実行を停止\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3555,8 +3415,7 @@ msgstr "" " PORT\n" " 現在の接続のサーバーポート\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3564,17 +3423,15 @@ msgstr "" " PROMPT1\n" " psql の標準のプロンプトを指定\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" msgstr "" " PROMPT2\n" -" ステートメントが前行から継続する場合のプロンプトを指定\n" +" 文が前行から継続する場合のプロンプトを指定\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3582,8 +3439,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN の最中に使われるプロンプトを指定\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3591,8 +3447,7 @@ msgstr "" " QUIET\n" " メッセージを表示しない (-q オプションと同じ)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3600,8 +3455,7 @@ msgstr "" " ROW_COUNT\n" " 最後の問い合わせで返却した、または影響を与えた行の数、または0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3611,8 +3465,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " サーバーのバージョン(短い文字列または数値)\n" -#: help.c:415 -#, c-format +#: help.c:453 +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:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3620,8 +3481,7 @@ msgstr "" " SHOW_CONTEXT\n" " メッセージコンテキストフィールドの表示を制御 [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3629,8 +3489,7 @@ msgstr "" " SINGLELINE\n" " セットした場合、改行はSQLコマンドを終端する (-S オプションと同じ)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3638,8 +3497,7 @@ msgstr "" " SINGLESTEP\n" " シングルステップモード (-s オプションと同じ)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3647,8 +3505,7 @@ msgstr "" " SQLSTATE\n" " 最後の問い合わせの SQLSTATE、またはエラーでなければ\"00000\"\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3656,8 +3513,7 @@ msgstr "" " USER\n" " 現在接続中のデータベースユーザー\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3665,8 +3521,7 @@ msgstr "" " VERBOSITY\n" " エラー報告の詳細度を制御 [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3678,8 +3533,7 @@ msgstr "" " VERSION_NUM\n" " psql のバージョン(長い文字列、短い文字列または数値)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3687,8 +3541,7 @@ msgstr "" "\n" "表示設定:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3698,8 +3551,7 @@ msgstr "" " またはpsql内で \\pset 名前 [値]\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3707,8 +3559,7 @@ msgstr "" " border\n" " 境界線のスタイル (番号)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3716,8 +3567,7 @@ msgstr "" " columns\n" " 折り返し形式で目標とする横幅\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3725,7 +3575,7 @@ msgstr "" " expanded (or x)\n" " 拡張出力 [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3734,8 +3584,7 @@ msgstr "" " fieldsep\n" " 非整列出力でのフィールド区切り文字(デフォルトは \"%s\")\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3743,8 +3592,7 @@ msgstr "" " fieldsep_zero\n" " 非整列出力でのフィールド区切り文字をバイト値の0に設定\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3752,8 +3600,7 @@ msgstr "" " footer\n" " テーブルフッター出力の要否を設定 [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3761,8 +3608,7 @@ msgstr "" " format\n" " 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3770,8 +3616,7 @@ msgstr "" " linestyle\n" " 境界線の描画スタイルを設定 [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3779,8 +3624,7 @@ msgstr "" " null\n" " null 値の代わりに表示する文字列を設定\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3788,8 +3632,7 @@ msgstr "" " numericlocale\n" " ロケール固有文字での桁区切りを表示するかどうかを指定\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3797,8 +3640,7 @@ msgstr "" " pager\n" " いつ外部ページャーを使うかを制御 [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3806,8 +3648,7 @@ msgstr "" " recordsep\n" " 非整列出力でのレコード(行)区切り\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3815,8 +3656,7 @@ msgstr "" " recordsep_zero\n" " 非整列出力でレコード区切りにバイト値の0に設定\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3826,8 +3666,7 @@ msgstr "" " HTMLフォーマット時のtableタグの属性、もしくは latex-longtable\n" " フォーマット時に左寄せするデータ型の相対カラム幅を指定\n" -#: help.c:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3835,8 +3674,7 @@ msgstr "" " title\n" " 以降に表示される表のタイトルを設定\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3844,8 +3682,7 @@ msgstr "" " tuples_only\n" " セットされた場合、実際のテーブルデータのみを表示\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3857,8 +3694,7 @@ msgstr "" " unicode_header_linestyle\n" " Unicode による線描画時のスタイルを設定 [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3866,8 +3702,7 @@ msgstr "" "\n" "環境変数:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3877,8 +3712,7 @@ msgstr "" " またはpsql内で \\setenv 名前 [値]\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3890,8 +3724,7 @@ msgstr "" " またはpsq内で \\setenv 名前 [値]\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3899,8 +3732,7 @@ msgstr "" " COLUMNS\n" " 折り返し書式におけるカラム数\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3908,8 +3740,7 @@ msgstr "" " PGAPPNAME\n" " application_name 接続パラメータと同じ\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3917,8 +3748,7 @@ msgstr "" " PGDATABASE\n" " dbname 接続パラメータと同じ\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3926,8 +3756,7 @@ msgstr "" " PGHOST\n" " host 接続パラメータと同じ\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3935,8 +3764,7 @@ msgstr "" " PGPASSFILE\n" " パスワードファイル名\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3944,8 +3772,7 @@ msgstr "" " PGPASSWORD\n" " 接続用パスワード (推奨されません)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3953,8 +3780,7 @@ msgstr "" " PGPORT\n" " port 接続パラメータと同じ\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3962,8 +3788,7 @@ msgstr "" " PGUSER\n" " user 接続パラメータと同じ\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3971,8 +3796,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev コマンドで使われるエディタ\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3980,8 +3804,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " エディタの起動時に行番号を指定する方法\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3989,8 +3812,7 @@ msgstr "" " PSQL_HISTORY\n" " コマンドライン履歴ファイルの代替の場所\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3998,8 +3820,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部ページャープログラムの名前\n" -#: help.c:508 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" \\watchで使用する外部ページャープログラムの名前\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4007,8 +3836,7 @@ msgstr "" " PSQLRC\n" " ユーザーの .psqlrc ファイルの代替の場所\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4016,8 +3844,7 @@ msgstr "" " SHELL\n" " \\! コマンドで使われるシェル\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4025,11 +3852,11 @@ msgstr "" " TMPDIR\n" " テンポラリファイル用ディレクトリ\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "利用可能なヘルプ:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4048,7 +3875,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4062,12 +3889,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 "この環境ではヒストリー機能がサポートされていません" @@ -4087,25 +3914,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" @@ -4113,19 +3932,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" @@ -4140,33 +3959,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:696 -#, c-format -msgid "skipping recursive expansion of variable \"%s\"" -msgstr "変数\"%s\"の再帰展開をスキップしています" - #: psqlscanslash.l:638 #, c-format msgid "unterminated quoted string" @@ -4175,2319 +3989,2429 @@ 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 -#: 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "名前" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "引数の型" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "オプション" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "オプションには以下のものがあります:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "接続の可否(真偽値)" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "最大同時接続数" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "テンプレートかどうか(真偽値)" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "新しいテーブル空間名" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 msgid "value" msgstr "値" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "対象のロール" -#: sql_help.c:198 sql_help.c:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "ロール名" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "制約名" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "新しい制約名" -#: sql_help.c:317 sql_help.c:1082 +#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "オブジェクト名" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "集約関数名" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "変換前の型" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "変換後の型" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "関数名" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "演算子名" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "左辺の型" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "右辺の型" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "インデックスメソッド" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "プロシージャ名" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "ルーチン名" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "型名" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 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:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "ハンドラー関数" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "バリデーター関数" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "列名" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: 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:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "データ型" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "照合順序" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" -msgstr "列制約" +msgstr "カラム制約" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "整数" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 msgid "table_constraint" msgstr "テーブル制約" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "親テーブル" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "拡張名" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "実行コスト" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "結果の行数" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "サポート関数" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "ロールの指定" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "ユーザー名" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "ロール指定は以下の通りです:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "グループ名" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "テーブル空間名" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" -msgstr "ストレージ・パラメータ" +msgstr "ストレージパラメータ" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "列番号" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "ラージオブジェクトのOID" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "圧縮方式" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "新しいアクセスメソッド" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "制約選択評価関数" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "結合選択評価関数" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "戦略番号" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "演算子の型" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "ソートファミリー名" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "サポート番号" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "引数の型" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "テーブル名" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" -msgstr "USING表現" +msgstr "USING式" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" -msgstr "CHECK表現" +msgstr "CHECK式" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "発行オブジェクト" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" -msgstr "パブリケーション・パラメータ" +msgstr "パブリケーションパラメータ" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "発行オブジェクトは以下のいずれかです:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "パスワード" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "タイムスタンプ" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "データベース名" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "増分値" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "最小値" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "最大値" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "開始番号" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "再開始番号" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "キャッシュ割り当て数" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "新しいターゲット" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "接続文字列" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "パブリケーション名" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "パブリケーション・オプション" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "{REFRESH PUBLICATION の追加オプション}" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "{SUBSCRIPTION パラメータ名}" -#: sql_help.c:1298 sql_help.c:1301 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "スキップオプション" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "パーティション名" -#: sql_help.c:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" -msgstr "パーティション境界指定" +msgstr "パーティション境界の仕様" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" -msgstr "シーケンス・オプション" +msgstr "シーケンスオプション" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" -msgstr "シーケンス・オプション" +msgstr "シーケンスオプション" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" -msgstr "インデックスを使用するテーブル制約" +msgstr "インデックスを使うテーブルの制約" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "書き換えルール名" -#: sql_help.c:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" -msgstr "パーティション境界指定は以下の通り:" +msgstr "パーティション境界の仕様は以下の通りです:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "パーティション境界式" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "numericリテラル" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" -msgstr "そして列制約は以下の通り:" +msgstr "そしてカラム制約は以下の通りです:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "デフォルト表現" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "生成式" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" -msgstr "インデックス・パラメータ" +msgstr "インデックスパラメータ" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "参照テーブル" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "参照列" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "参照動作" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" -msgstr "テーブル制約は以下の通り:" +msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "除外対象要素" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "演算子" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "インデックスの述語" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" -msgstr "インデックスを使用するテーブル制約は以下の通り:" +msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "UNIQUE, PRIMARY KEY, EXCLUDE制約のインデックスパラメータは以下の通り:" +msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 制約のインデックスパラメータは以下の通りです:" -#: sql_help.c:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "EXCLUDE制約の除外対象要素は以下の通り:" +msgstr "EXCLUDE 制約の除外対象要素は以下の通りです:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "演算子クラス" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +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:3013 msgid "tablespace_option" msgstr "テーブル空間のオプション" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "トークンの型" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "辞書名" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "元の辞書" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "新しい辞書" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "属性名" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "新しい属性名" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "新しい列挙値" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "隣接した列挙値" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "既存の列挙値" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "プロパティ" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "サーバー名" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "ビューのオプション名" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "ビューオプションの値" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "テーブルおよび列" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "オプションには以下のうちのいずれかを指定します:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "真偽値" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "そしてテーブルと列の指定は以下の通りです:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "トランザクションのモード" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "トランザクションのモードは以下の通りです:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "引数" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "リレーション名" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "ドメイン名" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "ポリシー名" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "ルール名" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "文字列リテラル" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "トランザクションID" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "ファイル名" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "コマンド" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "条件" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "問い合わせ" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "フォーマット名" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "区切り文字" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "NULL文字列" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "引用符文字" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "エスケープ文字" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "エンコーディング名" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "アクセスメソッドの型" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "入力データ型" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "状態遷移関数" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "状態データの型" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "状態データのサイズ" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "終了関数" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "結合関数" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "シリアライズ関数" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "デシリアライズ関数" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "初期条件" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "前方状態遷移関数" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "逆状態遷移関数" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "移動集約モード時の状態値のデータ型" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "移動集約モード時の状態値のデータサイズ" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "移動集約モード時の終了関数" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "移動集約モード時の初期条件" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "ソート演算子" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "または古い構文" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "基本の型" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "ロケール" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "照合順序" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "Ctype(変換演算子)" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "プロバイダ" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "バージョン" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "既存の照合順序" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "変換元のエンコーディング" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "変換先のエンコーディング" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "テンプレート" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "エンコード" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "ストラテジ" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "ICUロケール" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "ロケールプロバイダ" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "照合順序バージョン" + +#: sql_help.c:2212 +msgid "oid" +msgstr "オブジェクトID" + +#: sql_help.c:2232 msgid "constraint" msgstr "制約条件" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "制約条件は以下の通りです:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "イベント" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "フィルター変数" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "フィルター値" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "カラム制約は以下の通りです:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "戻り値の型" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "列の型" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "定義" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "オブジェクトファイル名" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "リンクシンボル" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "SQL本体" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "UID" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "インデックスメソッド" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "演算子クラスパラメータ" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "呼び出しハンドラー" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "インラインハンドラー" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "バリデーション関数" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "交代演算子" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "否定演算子" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "演算子族の名前" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "ストレージタイプ" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "イベントは以下のいずれかです:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "スキーマ要素" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "サーバーのタイプ" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "サーバーのバージョン" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "外部データラッパ名" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "統計オブジェクト名" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "統計種別" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "サブスクリプション名" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "コピー元のテーブル" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "LIKEオプション" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "LIKE オプションは以下の通りです:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "ディレクトリ" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "パーサ名" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "複製元の設定" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "開始関数" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "トークン取得関数" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "終了関数" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "LEXTYPE関数" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "見出し関数" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "初期処理関数" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "LEXIZE関数" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "{FROM SQL 関数名}" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "{TO SQL 関数名}" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "被参照テーブル名" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "移行用リレーション名" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "引数" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "ラベル" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "当該範囲のデータ型" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "当該範囲のデータ型の演算子クラス" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "正規化関数" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "当該範囲のデータ型の差分抽出関数" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "複範囲型名" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "入力関数" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "出力関数" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "受信関数" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "送信関数" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "型修飾子の入力関数" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "型修飾子の出力関数" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "分析関数" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "添字関数" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "内部長" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "バイト境界" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "ストレージ" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "LIKEの型" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "カテゴリー" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "優先データ型かどうか(真偽値)" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "デフォルト" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "要素のデータ型" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "区切り記号" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "照合可能" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "WITH問い合わせ" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "別名" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "FROM項目" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "カーソル名" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "出力表現" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "出力名" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "コードブロック" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "パラメータ" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" -msgstr "ステートメント" +msgstr "文" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "方向" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "方向 は以下のうちのいずれか:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" -msgstr "行数" +msgstr "取り出す位置や行数" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "シーケンス名" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "引数名" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "引数の型" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "ラージオブジェクトid" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "リモートスキーマ" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "ローカルスキーマ" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "競合ターゲット" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "競合時アクション" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "競合ターゲットは以下のいずれかです:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "インデックスのカラム名" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "インデックス表現" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "インデックスの述語" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "競合時アクションは以下のいずれかです:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "副問い合わせ句" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "チャネル" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "ロックモード" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "ロックモードは以下のいずれかです:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "ターゲットテーブル名" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "ターゲット別名" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "データ源" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "JOIN条件" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "WHEN句" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "ここで\"データ源\"は以下の通り:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "データ源テーブル名" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "データ源問い合わせ" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "データ源別名" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "WHEN句は以下の通り:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "マージ更新" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "マージ削除" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "マージ挿入" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "そして\"マージ挿入\"は以下の通り:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "そして\"マージ更新\"は以下の通り:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "そして\"マージ削除\"は以下の通り:" + +#: sql_help.c:4132 msgid "payload" msgstr "ペイロード" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "元のロール" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "新しいロール" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "セーブポイント名" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "グルーピング要素" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "ウィンドウ名" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "ウィンドウ定義" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "SELECT句" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "FROM項目は以下のいずれかです:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" -msgstr "列の別名" +msgstr "列別名" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" -msgstr "サンプリング方式" +msgstr "サンプリングメソッド" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "乱数シード" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "WITH問い合わせ名" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" -msgstr "列定義" +msgstr "カラム定義" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" -msgstr "結合方式" - -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "結合条件" +msgstr "JOINタイプ" -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" -msgstr "結合列" +msgstr "JOINカラム" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" -msgstr "結合USING別名" +msgstr "JOIN用別名" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "グルーピング要素は以下のいずれかです:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "WITH問い合わせは以下のいずれかです:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "VALUES句" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "INSERT句" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "UPDATE句" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "DELETE句" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" -msgstr "探索順序列名" +msgstr "SEARCH順序列名" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" -msgstr "探索マーク列名" +msgstr "循環識別列名" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" -msgstr "探索マーク値" +msgstr "循環識別値" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" -msgstr "循環マークデフォルト値" +msgstr "循環識別デフォルト" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" -msgstr "循環経路列名" +msgstr "循環パス列名" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "新しいテーブル" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "スナップショットID" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "ソート表現" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "現在のトランザクションを中止します" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" -msgstr "集約関数の定義を変更します。" +msgstr "集約関数の定義を変更します" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" -msgstr "照合順序の定義を変更します。" +msgstr "照合順序の定義を変更します" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" -msgstr "エンコーディング変換ルールの定義を変更します。" +msgstr "エンコーディング変換ルールの定義を変更します" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" -msgstr "データベースを変更します。" +msgstr "データベースを変更します" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" -msgstr "デフォルトのアクセス権限を定義します。" +msgstr "デフォルトのアクセス権限を定義します" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" -msgstr "ドメインの定義を変更します。" +msgstr "ドメインの定義を変更します" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" -msgstr "イベントトリガーの定義を変更します。" +msgstr "イベントトリガーの定義を変更します" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" -msgstr "拡張の定義を変更します。" +msgstr "機能拡張の定義を変更します" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" -msgstr "外部データラッパの定義を変更します。" +msgstr "外部データラッパの定義を変更します" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" -msgstr "外部テーブルの定義を変更します。" +msgstr "外部テーブルの定義を変更します" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" -msgstr "関数の定義を変更します。" +msgstr "関数の定義を変更します" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" -msgstr "ロール名またはメンバーシップを変更します。" +msgstr "ロール名またはメンバーシップを変更します" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" -msgstr "インデックスの定義を変更します。" +msgstr "インデックスの定義を変更します" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" -msgstr "手続き言語の定義を変更します。" +msgstr "手続き言語の定義を変更します" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" -msgstr "ラージオブジェクトの定義を変更します。" +msgstr "ラージオブジェクトの定義を変更します" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" -msgstr "マテリアライズドビューの定義を変更します。" +msgstr "実体化ビューの定義を変更します" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" -msgstr "演算子の定義を変更します。" +msgstr "演算子の定義を変更します" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" -msgstr "演算子クラスの定義を変更します。" +msgstr "演算子クラスの定義を変更します" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" -msgstr "演算子族の定義を変更します。" +msgstr "演算子族の定義を変更します" -#: sql_help.c:5113 +#: sql_help.c:5248 msgid "change the definition of a row-level security policy" -msgstr "行レベルのセキュリティ ポリシーの定義を変更します。" +msgstr "行レベルのセキュリティ ポリシーの定義を変更します" -#: sql_help.c:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "プロシージャの定義を変更します" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" -msgstr "パブリケーションの定義を変更します。" +msgstr "パブリケーションの定義を変更します" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" -msgstr "データベースロールを変更します。" +msgstr "データベースロールを変更します" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" -msgstr "ルーチンの定義を変更します。" +msgstr "ルーチンの定義を変更します" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" -msgstr "ルールの定義を変更します。" +msgstr "ルールの定義を変更します" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" -msgstr "スキーマの定義を変更します。" +msgstr "スキーマの定義を変更します" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" -msgstr "シーケンスジェネレーターの定義を変更します。" +msgstr "シーケンス生成器の定義を変更します" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" -msgstr "外部サーバーの定義を変更します。" +msgstr "外部サーバーの定義を変更します" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" -msgstr "拡張統計情報オブジェクトの定義を変更します。" +msgstr "拡張統計情報オブジェクトの定義を変更します" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" -msgstr "サブスクリプションの定義を変更します。" +msgstr "サブスクリプションの定義を変更します" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" -msgstr "サーバーの構成パラメータを変更します。" +msgstr "サーバーの設定パラメータを変更します" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "テーブルの定義を変更します。" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" -msgstr "テーブル空間の定義を変更します。" +msgstr "テーブル空間の定義を変更します" -#: sql_help.c:5197 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" -msgstr "テキスト検索設定の定義を変更します。" +msgstr "テキスト検索設定の定義を変更します" -#: sql_help.c:5203 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" -msgstr "テキスト検索辞書の定義を変更します。" +msgstr "テキスト検索辞書の定義を変更します" -#: sql_help.c:5209 +#: sql_help.c:5344 msgid "change the definition of a text search parser" -msgstr "テキスト検索パーサの定義を変更します。" +msgstr "テキスト検索パーサーの定義を変更します" -#: sql_help.c:5215 +#: sql_help.c:5350 msgid "change the definition of a text search template" -msgstr "テキスト検索テンプレートの定義を変更します。" +msgstr "テキスト検索テンプレートの定義を変更します" -#: sql_help.c:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" -msgstr "トリガーの定義を変更します。" +msgstr "トリガーの定義を変更します" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" -msgstr "型の定義を変更します。" +msgstr "型の定義を変更します" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" -msgstr "ユーザーマッピングの定義を変更します。" +msgstr "ユーザーマッピングの定義を変更します" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" -msgstr "ビューの定義を変更します。" +msgstr "ビューの定義を変更します" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" -msgstr "データベースの統計情報を収集します。" +msgstr "データベースの統計情報を収集します" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" -msgstr "トランザクションブロックを開始します。" +msgstr "トランザクション区間を開始します" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "プロシージャを実行します" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" -msgstr "先行書き込みログのチェックポイントを強制的に実行します。" +msgstr "先行書き込みログのチェックポイントを強制的に実行します" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" -msgstr "カーソルを閉じます。" +msgstr "カーソルを閉じます" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" -msgstr "インデックスに従ってテーブルをクラスタ化します。" +msgstr "インデックスに従ってテーブルをクラスタ化します" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" -msgstr "オブジェクトのコメントを定義または変更します。" +msgstr "オブジェクトのコメントを定義または変更します" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" -msgstr "現在のトランザクションをコミットします。" +msgstr "現在のトランザクションをコミットします" -#: sql_help.c:5299 +#: sql_help.c:5434 msgid "commit a transaction that was earlier prepared for two-phase commit" -msgstr "二相コミットのために事前に準備されたトランザクションをコミットします。" +msgstr "二相コミットのために事前に準備されたトランザクションをコミットします" -#: sql_help.c:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" -msgstr "ファイルとテーブル間でデータをコピーします。" +msgstr "ファイルとテーブルとの間でデータをコピーします" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" -msgstr "新しいアクセスメソッドを定義します。" +msgstr "新しいアクセスメソッドを定義します" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" -msgstr "新しい集約関数を定義します。" +msgstr "新しい集約関数を定義します" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" -msgstr "新しいキャストを定義します。" +msgstr "新しい型変換を定義します" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" -msgstr "新しい照合順序を定義します。" +msgstr "新しい照合順序を定義します" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" -msgstr "新しいエンコーディングの変換ルールを定義します。" +msgstr "新しいエンコーディング変換を定義します" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" -msgstr "新しいデータベースを作成します。" +msgstr "新しいデータベースを作成します" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" -msgstr "新しいドメインを定義します。" +msgstr "新しいドメインを定義します" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" -msgstr "新しいイベントトリガーを定義します。" +msgstr "新しいイベントトリガーを定義します" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" -msgstr "拡張をインストールします。" +msgstr "機能拡張をインストールします" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" -msgstr "新しい外部データラッパを定義します。" +msgstr "新しい外部データラッパを定義します" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" -msgstr "新しい外部テーブルを定義します。" +msgstr "新しい外部テーブルを定義します" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" -msgstr "新しい関数を定義します。" +msgstr "新しい関数を定義します" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" -msgstr "新しいデータベースロールを定義します。" +msgstr "新しいデータベースロールを定義します" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" -msgstr "新しいインデックスを定義します。" +msgstr "新しいインデックスを定義します" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" -msgstr "新しい手続き言語を定義します。" +msgstr "新しい手続き言語を定義します" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" -msgstr "新しいマテリアライズドビューを定義します。" +msgstr "新しい実体化ビューを定義します" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" -msgstr "新しい演算子を定義します。" +msgstr "新しい演算子を定義します" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" -msgstr "新しい演算子クラスを定義します。" +msgstr "新しい演算子クラスを定義します" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" -msgstr "新しい演算子族を定義します。" +msgstr "新しい演算子族を定義します" -#: sql_help.c:5425 +#: sql_help.c:5560 msgid "define a new row-level security policy for a table" -msgstr "テーブルに対して新しい行レベルのセキュリティポリシーを定義します。" +msgstr "テーブルに対して新しい行レベルセキュリティポリシーを定義します" -#: sql_help.c:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "新しいプロシージャを定義します" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" -msgstr "新しいパブリケーションを定義します。" +msgstr "新しいパブリケーションを定義します" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" -msgstr "新しい書き換えルールを定義します。" +msgstr "新しい書き換えルールを定義します" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" -msgstr "新しいスキーマを定義します。" +msgstr "新しいスキーマを定義します" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" -msgstr "新しいシーケンスジェネレーターを定義します。" +msgstr "新しいシーケンス生成器を定義します。" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" -msgstr "新しい外部サーバーを定義します。" +msgstr "新しい外部サーバーを定義します" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" -msgstr "拡張統計情報を定義します。" +msgstr "拡張統計情報を定義します" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" -msgstr "新しいサブスクリプションを定義します。" +msgstr "新しいサブスクリプションを定義します" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" -msgstr "新しいテーブルを定義します。" +msgstr "新しいテーブルを定義します" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 msgid "define a new table from the results of a query" -msgstr "問い合わせの結果から新しいテーブルを定義します。" +msgstr "問い合わせの結果から新しいテーブルを定義します" -#: sql_help.c:5497 +#: sql_help.c:5632 msgid "define a new tablespace" -msgstr "新しいテーブル空間を定義します。" +msgstr "新しいテーブル空間を定義します" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" -msgstr "新しいテキスト検索設定を定義します。" +msgstr "新しいテキスト検索設定を定義します" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" -msgstr "新しいテキスト検索辞書を定義します。" +msgstr "新しいテキスト検索辞書を定義します" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" -msgstr "新しいテキスト検索パーサを定義します。" +msgstr "新しいテキスト検索パーサーを定義します" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" -msgstr "新しいテキスト検索テンプレートを定義します。" +msgstr "新しいテキスト検索テンプレートを定義します" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" -msgstr "新しい変換を定義します。" +msgstr "新しいデータ変換を定義します" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" -msgstr "新しいトリガーを定義します。" +msgstr "新しいトリガーを定義します" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" -msgstr "新しいデータ型を定義します。" +msgstr "新しいデータ型を定義します" -#: sql_help.c:5551 +#: sql_help.c:5686 msgid "define a new mapping of a user to a foreign server" msgstr "外部サーバーに対するユーザーの新しいマッピングを定義します。" -#: sql_help.c:5557 +#: sql_help.c:5692 msgid "define a new view" -msgstr "新しいビューを定義します。" +msgstr "新しいビューを定義します" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" -msgstr "プリペアドステートメントを開放します。" +msgstr "準備した文を解放します" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" -msgstr "カーソルを定義します。" +msgstr "カーソルを定義します" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" -msgstr "テーブルの行を削除します。" +msgstr "テーブルの行を削除します" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" -msgstr "セッション状態を破棄します。" +msgstr "セッション状態を破棄します" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" -msgstr "無名コードブロックを実行します。" +msgstr "無名コードブロックを実行します" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" -msgstr "アクセスメソッドを削除します。" +msgstr "アクセスメソッドを削除します" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" -msgstr "集約関数を削除します。" +msgstr "集約関数を削除します" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" -msgstr "キャストを削除します。" +msgstr "型変換を削除します" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" -msgstr "照合順序を削除します。" +msgstr "照合順序を削除します" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" -msgstr "符号化方式変換を削除します。" +msgstr "符号化方式変換を削除します" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" -msgstr "データベースを削除します。" +msgstr "データベースを削除します" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" -msgstr "ドメインを削除します。" +msgstr "ドメインを削除します" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" -msgstr "イベントトリガーを削除します。" +msgstr "イベントトリガーを削除します" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" -msgstr "拡張を削除します。" +msgstr "機能拡張を削除します" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" -msgstr "外部データラッパを削除します。" +msgstr "外部データラッパを削除します" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" -msgstr "外部テーブルを削除します。" +msgstr "外部テーブルを削除します" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" -msgstr "関数を削除します。" +msgstr "関数を削除します" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" -msgstr "データベースロールを削除します。" +msgstr "データベースロールを削除します" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" -msgstr "インデックスを削除します。" +msgstr "インデックスを削除します" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" -msgstr "手続き言語を削除します。" +msgstr "手続き言語を削除します" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" -msgstr "マテリアライズドビューを削除します。" +msgstr "実体化ビューを削除します" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" -msgstr "演算子を削除します。" +msgstr "演算子を削除します" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" -msgstr "演算子クラスを削除します。" +msgstr "演算子クラスを削除します" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" -msgstr "演算子族を削除します。" +msgstr "演算子族を削除します" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" -msgstr "データベースロールが所有するデータベースオブジェクトを削除します。" +msgstr "データベースロールが所有するデータベースオブジェクトを削除します" -#: sql_help.c:5713 +#: sql_help.c:5848 msgid "remove a row-level security policy from a table" -msgstr "テーブルから行レベルのセキュリティポリシーを削除します。" +msgstr "テーブルから行レベルのセキュリティポリシーを削除します" -#: sql_help.c:5719 +#: sql_help.c:5854 msgid "remove a procedure" -msgstr "プロシージャを削除します。" +msgstr "プロシージャを削除します" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" -msgstr "パブリケーションを削除します。" +msgstr "パブリケーションを削除します" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" -msgstr "ルーチンを削除します。" +msgstr "ルーチンを削除します" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" -msgstr "書き換えルールを削除します。" +msgstr "書き換えルールを削除します" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" -msgstr "スキーマを削除します。" +msgstr "スキーマを削除します" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" -msgstr "シーケンスを削除します。" +msgstr "シーケンスを削除します" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" -msgstr "外部サーバー記述子を削除します。" +msgstr "外部サーバー記述子を削除します" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" -msgstr "拡張統計情報を削除します。" +msgstr "拡張統計情報を削除します" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" -msgstr "サブスクリプションを削除します。" +msgstr "サブスクリプションを削除します" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" -msgstr "テーブルを削除します。" +msgstr "テーブルを削除します" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" -msgstr "テーブル空間を削除します。" +msgstr "テーブル空間を削除します" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" -msgstr "テキスト検索設定を削除します。" +msgstr "テキスト検索設定を削除します" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" -msgstr "テキスト検索辞書を削除します。" +msgstr "テキスト検索辞書を削除します" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" -msgstr "テキスト検索パーサを削除します。" +msgstr "テキスト検索パーサーを削除します" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" -msgstr "テキスト検索テンプレートを削除します。" +msgstr "テキスト検索テンプレートを削除します" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" -msgstr "自動変換ルールを削除します。" +msgstr "データ変換を削除します" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" -msgstr "トリガーを削除します。" +msgstr "トリガーを削除します" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" -msgstr "データ型を削除します。" +msgstr "データ型を削除します" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" -msgstr "外部サーバーのユーザーマッピングを削除します。" +msgstr "外部サーバーのユーザーマッピングを削除します" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" -msgstr "ビューを削除します。" +msgstr "ビューを削除します" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" -msgstr "プリペアドステートメントを実行します。" +msgstr "準備した文を実行します" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" -msgstr "ステートメントの実行計画を表示します。" +msgstr "文の実行計画を表示します" -#: sql_help.c:5869 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" -msgstr "カーソルを使って問い合わせから行を取り出します。" +msgstr "カーソルを使って問い合わせから行を取り出します" -#: sql_help.c:5875 +#: sql_help.c:6010 msgid "define access privileges" -msgstr "アクセス権限を定義します。" +msgstr "アクセス権限を定義します" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" -msgstr "外部サーバーからテーブル定義をインポートします。" +msgstr "外部サーバーからテーブル定義をインポートします" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" -msgstr "テーブルに新しい行を作成します。" +msgstr "テーブルに新しい行を作成します" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" -msgstr "通知メッセージを監視します。" +msgstr "通知メッセージを監視します" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" -msgstr "共有ライブラリファイルをロードします。" +msgstr "共有ライブラリファイルをロードします" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" -msgstr "テーブルをロックします。" +msgstr "テーブルをロックします" + +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "条件によってテーブルの行を挿入、更新または削除する" -#: sql_help.c:5911 +#: sql_help.c:6052 msgid "position a cursor" -msgstr "カーソルを位置づけます。" +msgstr "カーソルを位置づけます" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" -msgstr "通知を生成します。" +msgstr "通知を生成します" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" -msgstr "実行に備えてステートメントを準備します。" +msgstr "実行に備えて文を準備します" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" -msgstr "二相コミットに備えて現在のトランザクションを準備します。" +msgstr "二相コミットに備えて現在のトランザクションを準備します" -#: sql_help.c:5935 +#: sql_help.c:6076 msgid "change the ownership of database objects owned by a database role" -msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します。" +msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します" -#: sql_help.c:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" -msgstr "マテリアライズドビューの内容を置き換えます。" +msgstr "実体化ビューの内容を置き換えます" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" -msgstr "インデックスを再構築します。" +msgstr "インデックスを再構築します" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "以前に定義されたセーブポイントを破棄します" -#: sql_help.c:5959 +#: sql_help.c:6100 msgid "restore the value of a run-time parameter to the default value" -msgstr "実行時パラメータの値をデフォルト値に戻します。" +msgstr "実行時パラメータの値をデフォルト値に戻します" -#: sql_help.c:5965 +#: sql_help.c:6106 msgid "remove access privileges" -msgstr "アクセス特権を削除します。" +msgstr "アクセス権限を削除します" -#: sql_help.c:5977 +#: sql_help.c:6118 msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします。" +msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします" -#: sql_help.c:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" -msgstr "セーブポイントまでロールバックします。" +msgstr "セーブポイントまでロールバックします" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" -msgstr "現在のトランザクション内で新しいセーブポイントを定義します。" +msgstr "現在のトランザクション内で新しいセーブポイントを定義します" -#: sql_help.c:5995 +#: sql_help.c:6136 msgid "define or change a security label applied to an object" -msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します。" +msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します" -#: sql_help.c:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" -msgstr "テーブルまたはビューから行を取得します。" +msgstr "テーブルまたはビューから行を取得します" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" -msgstr "実行時のパラメータを変更します。" +msgstr "実行時パラメータを変更します" -#: sql_help.c:6019 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" -msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します。" +msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します" -#: sql_help.c:6025 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" -msgstr "現在のセッションの現在のユーザー識別子を設定します。" +msgstr "現在のセッションの現在のユーザー識別子を設定します" -#: sql_help.c:6031 +#: sql_help.c:6172 msgid "set the session user identifier and the current user identifier of the current session" -msgstr "セッションのユーザー識別子および現在のセッションの現在のユーザー識別子を設定します。" +msgstr "セッションのユーザー識別子および現在のセッションの現在のユーザー識別子を設定します" -#: sql_help.c:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" -msgstr "現在のトランザクションの特性を設定します。" +msgstr "現在のトランザクションの特性を設定します" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" -msgstr "実行時パラメータの値を表示します。" +msgstr "実行時パラメータの値を表示します" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" -msgstr "テーブルもしくはテーブルセットを0件に切り詰めます。" +msgstr "一つの、または複数のテーブルを空にします" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" -msgstr "通知メッセージの監視を中止します。" +msgstr "通知メッセージの監視を中止します" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" -msgstr "テーブルの行を更新します。" +msgstr "テーブルの行を更新します" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" -msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します。" +msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します" -#: sql_help.c:6085 +#: sql_help.c:6226 msgid "compute a set of rows" -msgstr "行セットを計算します。" +msgstr "行セットを計算します" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 は非対話モード時でのみ使用可能です" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" -msgstr "ログファイル\"%s\"をオープンできませんでした: %m" +msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6496,27 +6420,27 @@ msgstr "" "\"help\"でヘルプを表示します。\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "表示パラメータ\"%s\"を設定できませんでした" -#: startup.c:699 +#: startup.c:719 #, 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:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "余分なコマンドライン引数\"%s\"は無視されました" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "実行可能ファイルが見つかりませんでした" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/third_party/spanner_pg/src/bin/psql/po/ka.po b/third_party/spanner_pg/src/bin/psql/po/ka.po new file mode 100644 index 00000000..1e6cb841 --- /dev/null +++ b/third_party/spanner_pg/src/bin/psql/po/ka.po @@ -0,0 +1,6456 @@ +# Georgian message translation file for psql +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the psql (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: psql (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-03-26 18:16+0000\n" +"PO-Revision-Date: 2023-03-27 07:16+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.2.2\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდომა: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "გაფრთხილება: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტალები: " + +#: ../../../src/common/logging.c:301 +#, 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:168 +#, c-format +msgid "invalid binary \"%s\"" +msgstr "არასწორი ბინარული ფაილი \"%s\"" + +#: ../../common/exec.c:218 +#, c-format +msgid "could not read binary \"%s\"" +msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა" + +#: ../../common/exec.c:226 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია" + +#: ../../common/exec.c:282 ../../common/exec.c:321 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m" + +#: ../../common/exec.c:299 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m" + +#: ../../common/exec.c:422 +#, c-format +msgid "%s() failed: %m" +msgstr "%s()-ის შეცდომა: %m" + +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 +#, c-format +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 +#, 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 "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მომხმარებლის ეფექტური ID-ის (%ld) ამოხსნა შეუძლებელია: %s" + +#: ../../common/username.c:45 command.c:575 +msgid "user does not exist" +msgstr "მომხმარებელი არ არსებობს" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu" + +#: ../../common/wait_error.c:45 +#, c-format +msgid "command not executable" +msgstr "ბრძანება გაშვებადი არაა" + +#: ../../common/wait_error.c:49 +#, c-format +msgid "command not found" +msgstr "ბრძანება ვერ ვიპოვე" + +#: ../../common/wait_error.c:54 +#, c-format +msgid "child process exited with exit code %d" +msgstr "შვილეული პროცესი დასრულდა სტატუსით %d" + +#: ../../common/wait_error.c:62 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X" + +#: ../../common/wait_error.c:66 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "პროცესი გაჩერდა სიგნალით: %d: %s" + +#: ../../common/wait_error.c:72 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d" + +#: ../../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/print.c:406 +#, c-format +msgid "(%lu row)" +msgid_plural "(%lu rows)" +msgstr[0] "(%lu მწკრივი)" +msgstr[1] "(%lu მწკრივი)" + +#: ../../fe_utils/print.c:3109 +#, c-format +msgid "Interrupted\n" +msgstr "შეწყვეტილია\n" + +#: ../../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:3213 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "ცხრილის შემცველობაზე უჯრედის დამატება შეუძლებელია: უჯრედების რაოდენობა %d-ზე მეტია.\n" + +#: ../../fe_utils/print.c:3471 +#, c-format +msgid "invalid output format (internal error): %d" +msgstr "გამოტანის არასწორი ფორმატი (შიდა შეცდომა): %d" + +#: ../../fe_utils/psqlscan.l:702 +#, 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:232 +#, c-format +msgid "invalid command \\%s" +msgstr "არასწორი ბრძანება \\%s" + +#: command.c:234 +#, c-format +msgid "Try \\? for help." +msgstr "დახმარებისთვის სცადეთ \\? ." + +#: command.c:252 +#, c-format +msgid "\\%s: extra argument \"%s\" ignored" +msgstr "\\%s: დამატებითი არგუმენტი \"%s\" იგნორირებულია" + +#: command.c:304 +#, c-format +msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "\\%s ბრძანება გნორირებულია; მიმდინარე \\if ბლოკიდან გამოსასვლელად გამოიყენეთ \\endif ან Control-C" + +#: command.c:573 +#, c-format +msgid "could not get home directory for user ID %ld: %s" +msgstr "მომხმარებლის, ID-ით %ld, საწყის საქაღალდეზე გადასვლის შეცდომა: %s" + +#: command.c:592 +#, c-format +msgid "\\%s: could not change directory to \"%s\": %m" +msgstr "\\%s: საქაღალდის \"%s\"-ზე შეცვლის შეცდომა: %m" + +#: command.c:617 +#, c-format +msgid "You are currently not connected to a database.\n" +msgstr "ამჟამად მონაცემთა ბაზასთან მიერთებული არ ბრძანდებით.\n" + +#: command.c:627 +#, 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:630 +#, 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:636 +#, 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:639 +#, 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:1030 command.c:1125 command.c:2654 +#, c-format +msgid "no query buffer" +msgstr "მოთხოვნების ბაფერის გარეშე" + +#: command.c:1063 command.c:5491 +#, c-format +msgid "invalid line number: %s" +msgstr "ხაზის არასწორი ნომერი: %s" + +#: command.c:1203 +msgid "No changes" +msgstr "ცვლილებების გარეშე" + +#: command.c:1282 +#, c-format +msgid "%s: invalid encoding name or conversion procedure not found" +msgstr "%s: კოდირების არასწორი სახელი ან გადაყვანის პროცედურა არ არსებობს" + +#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 +#, c-format +msgid "%s" +msgstr "%s" + +#: command.c:1324 +msgid "There is no previous error." +msgstr "წინა შეცდომის გარეშე." + +#: command.c:1437 +#, c-format +msgid "\\%s: missing right parenthesis" +msgstr "\\%s: აკლია მარჯვენა მრგვალი ფრჩხილი" + +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 +#, c-format +msgid "\\%s: missing required argument" +msgstr "\\%s: აკლია საჭირო არგუმენტი" + +#: command.c:1782 +#, c-format +msgid "\\elif: cannot occur after \\else" +msgstr "\\elif: არ შეიძლება \\else -ის შემდეგ იყოს" + +#: command.c:1787 +#, c-format +msgid "\\elif: no matching \\if" +msgstr "\\elif: შესაბამისი \\if -ის გარეშე" + +#: command.c:1851 +#, c-format +msgid "\\else: cannot occur after \\else" +msgstr "\\else: ვერ გაჩნდება \\else -ის შემდეგ" + +#: command.c:1856 +#, c-format +msgid "\\else: no matching \\if" +msgstr "\\else: შესაბამისი \\if -ის გარეშე" + +#: command.c:1896 +#, c-format +msgid "\\endif: no matching \\if" +msgstr "\\endif: შესაბამისი \\if -ის გარეშე" + +#: command.c:2053 +msgid "Query buffer is empty." +msgstr "მოთხოვნის ბაფერი ცარიელია." + +#: command.c:2096 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "შეიყვანეთ მომხმარებლის (\"%s\") ახალი პაროლი: " + +#: command.c:2100 +msgid "Enter it again: " +msgstr "შეიყვანეთ კდევ ერთხელ: " + +#: command.c:2109 +#, c-format +msgid "Passwords didn't match." +msgstr "პაროლები არ ემთხვევა." + +#: command.c:2208 +#, c-format +msgid "\\%s: could not read value for variable" +msgstr "\\%s: ცვლადის მნიშვნელობის წაკითხვის შეცდომა" + +#: command.c:2311 +msgid "Query buffer reset (cleared)." +msgstr "მოთხოვნის ბაფერი ცარიელია(გასუფთავდა)." + +#: command.c:2333 +#, c-format +msgid "Wrote history to file \"%s\".\n" +msgstr "ისტორია ჩაწერილია ფაილში \"%s\".\n" + +#: command.c:2420 +#, c-format +msgid "\\%s: environment variable name must not contain \"=\"" +msgstr "\\%s: გარემოს ცვლადის სახელი \"=\" -ს არ შეიძლება შეიცავდეს" + +#: command.c:2468 +#, c-format +msgid "function name is required" +msgstr "ფუნქციის სახელი აუცილებელია" + +#: command.c:2470 +#, c-format +msgid "view name is required" +msgstr "საჭიროა ხედის სახელი" + +#: command.c:2593 +msgid "Timing is on." +msgstr "დროის დათვლა ჩართულია." + +#: command.c:2595 +msgid "Timing is off." +msgstr "დროის დათვლა გამორთულია." + +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3107 startup.c:243 startup.c:293 +msgid "Password: " +msgstr "პაროლი: " + +#: command.c:3112 startup.c:290 +#, c-format +msgid "Password for user %s: " +msgstr "პაროლი მომხმარებლისთვის %s: " + +#: command.c:3168 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "შეერთების სტრიქონის გამოყენებისას მომხმარებლის, ჰოსტისა და და პორტის არ მითითება" + +#: command.c:3203 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "მონაცემთა ბაზის კავშირი პარამეტრების ხელახლა გამოსაყენებლად არ არსებობს" + +#: command.c:3511 +#, c-format +msgid "Previous connection kept" +msgstr "წინა შეერთება ჯერ კიდევ არსებობს" + +#: command.c:3517 +#, c-format +msgid "\\connect: %s" +msgstr "\\connect: %s" + +#: command.c:3573 +#, 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:3576 +#, 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:3582 +#, 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:3585 +#, 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:3590 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\".\n" +msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\"\n" + +#: command.c:3630 +#, c-format +msgid "%s (%s, server %s)\n" +msgstr "%s (%s, სერვერი %s)\n" + +#: command.c:3643 +#, 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:3680 +#, c-format +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL შეერთება (პროდოკოლი: %s, შიფრაცა: %s, შეკუშმვა: %s)\n" + +#: command.c:3681 command.c:3682 +msgid "unknown" +msgstr "უცნობი" + +#: command.c:3683 help.c:42 +msgid "off" +msgstr "გამორთული" + +#: command.c:3683 help.c:42 +msgid "on" +msgstr "ჩართ" + +#: command.c:3697 +#, c-format +msgid "GSSAPI-encrypted connection\n" +msgstr "GSSAPI-ით დაშიფრული შეერთება\n" + +#: command.c:3717 +#, 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" +" page \"Notes for Windows users\" for details.\n" +msgstr "" +"გაფრთხილება: კონსოლის კოდირება (%u) განსხვავდება Windows კოდირებისგან(%u)\n" +" 8-ბიტიანი სიმბოლოებმა შეიძლება სწორად არ იმუშაოს. მეტი დეტალებისთვის\n" +" იხილეთ psql-ის დოკუმენტაციის გვერდი გვერდი \"შენიშვნები Windows-ის მომხმარებლებისთვის\".\n" + +#: command.c:3822 +#, c-format +msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" +msgstr "საჭიროა გარემოს ცვლადის PSQL_EDITOR_LINENUMBER_ARG დაყენება ხაზის ნომერზე" + +#: command.c:3851 +#, c-format +msgid "could not start editor \"%s\"" +msgstr "რედაქტორის გაშვების შეცდომა: \"%s\"" + +#: command.c:3853 +#, c-format +msgid "could not start /bin/sh" +msgstr "/bin/sh-ის გაშვების შეცდომა" + +#: command.c:3903 +#, c-format +msgid "could not locate temporary directory: %s" +msgstr "დროებითი საქაღალდის მოძებნის შეცდომა: %s" + +#: command.c:3930 +#, c-format +msgid "could not open temporary file \"%s\": %m" +msgstr "დროებითი ფაილის (\"%s\") გახსნის შეცდომა: %m" + +#: command.c:4266 +#, c-format +msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" +msgstr "\\pset: \"%s\"-ის არასწორი აბრევიატურა ორივეს, \"%s\"-ს და \"%s-ს ემთხვევა\"" + +#: command.c:4286 +#, 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:4305 +#, c-format +msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" +msgstr "\\pset: ხაზის ნებადართული სტილებია ascii, old-ascii და unicode" + +#: command.c:4320 +#, c-format +msgid "\\pset: allowed Unicode border line styles are single, double" +msgstr "\\pset: უნიკოდის საზღვრის ხაზის ნებადართული სტილებია single და double" + +#: command.c:4335 +#, c-format +msgid "\\pset: allowed Unicode column line styles are single, double" +msgstr "\\pset: უნიკოდის სვეტის ხაზის ნებადართული სტილებია single და double" + +#: command.c:4350 +#, c-format +msgid "\\pset: allowed Unicode header line styles are single, double" +msgstr "\\pset:უნიკოდის თავსართის ხაზების ნებადართულ სტილებია single და double" + +#: command.c:4393 +#, c-format +msgid "\\pset: csv_fieldsep must be a single one-byte character" +msgstr "\\pset: csv_fieldsep ერთი ერთბაიტიანი სიმბოლო უნდა იყოს" + +#: command.c:4398 +#, c-format +msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" +msgstr "\\pset: csv_fieldsep არ შეიძლება იყოს ორმაგი ბრჭყალი, ხაზის დასასრული და კარეტის გადატანა" + +#: command.c:4535 command.c:4723 +#, c-format +msgid "\\pset: unknown option: %s" +msgstr "\\pset: არასწორი პარამეტრი: %s" + +#: command.c:4555 +#, c-format +msgid "Border style is %d.\n" +msgstr "საზღვრის სტილი: %d\n" + +#: command.c:4561 +#, c-format +msgid "Target width is unset.\n" +msgstr "სამიზნის სიგანე დაყენებული არაა.\n" + +#: command.c:4563 +#, c-format +msgid "Target width is %d.\n" +msgstr "სამიზნის სიგანეა %d.\n" + +#: command.c:4570 +#, c-format +msgid "Expanded display is on.\n" +msgstr "გაფართოებული ეკრანი ჩართულია.\n" + +#: command.c:4572 +#, c-format +msgid "Expanded display is used automatically.\n" +msgstr "გაფართოებული ეკრანი ავტომატურად გამოიყენება.\n" + +#: command.c:4574 +#, c-format +msgid "Expanded display is off.\n" +msgstr "გაფართოებული ეკრანი გამორთულია.\n" + +#: command.c:4580 +#, c-format +msgid "Field separator for CSV is \"%s\".\n" +msgstr "CSV-ში ველების განმაცალკევებელია \"%s\".\n" + +#: command.c:4588 command.c:4596 +#, c-format +msgid "Field separator is zero byte.\n" +msgstr "ველების განმაცალკევებელი ნულოვანი ბაიტია.\n" + +#: command.c:4590 +#, c-format +msgid "Field separator is \"%s\".\n" +msgstr "ველების განმაცალკევებელია \"%s\".\n" + +#: command.c:4603 +#, c-format +msgid "Default footer is on.\n" +msgstr "მდგომარეობის ზოლი ჩართულია.\n" + +#: command.c:4605 +#, c-format +msgid "Default footer is off.\n" +msgstr "ნაგულისხმები ქვესართი გამორთულია\n" + +#: command.c:4611 +#, c-format +msgid "Output format is %s.\n" +msgstr "გამოტანის ფორმატია %s.\n" + +#: command.c:4617 +#, c-format +msgid "Line style is %s.\n" +msgstr "ხაზის სტილია %s.\n" + +#: command.c:4624 +#, c-format +msgid "Null display is \"%s\".\n" +msgstr "ნულოვანია ეკრანია \"%s\".\n" + +#: command.c:4632 +#, c-format +msgid "Locale-adjusted numeric output is on.\n" +msgstr "რიცხვების ენაზე მორგებული გამოტანა ჩართულია.\n" + +#: command.c:4634 +#, c-format +msgid "Locale-adjusted numeric output is off.\n" +msgstr "რიცხვების ენაზე მორგებული გამოტანა გამორთულა.\n" + +#: command.c:4641 +#, c-format +msgid "Pager is used for long output.\n" +msgstr "გრძელი გამოტანისას გამოიყენება გვერდების გადამრთველი.\n" + +#: command.c:4643 +#, c-format +msgid "Pager is always used.\n" +msgstr "გვერდების გადამრთველი ყოველთვის გამოიყენება.\n" + +#: command.c:4645 +#, c-format +msgid "Pager usage is off.\n" +msgstr "გვერდების გადამრთველი გამორთულია.\n" + +#: command.c:4651 +#, 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" +msgstr[1] "გვერდების გადამრთველი %d-ზე ნაკლებ ხაზზე არ მუშაობს.\n" + +#: command.c:4661 command.c:4671 +#, c-format +msgid "Record separator is zero byte.\n" +msgstr "ჩანაწერის გამყოფი ნული ბაიტია.\n" + +#: command.c:4663 +#, c-format +msgid "Record separator is .\n" +msgstr "ჩანაწერის გამყოფია .\n" + +#: command.c:4665 +#, c-format +msgid "Record separator is \"%s\".\n" +msgstr "ჩანაწერის გამყოფია \"%s\".\n" + +#: command.c:4678 +#, c-format +msgid "Table attributes are \"%s\".\n" +msgstr "ცხრილის ატრიბუტებია \"%s\".\n" + +#: command.c:4681 +#, c-format +msgid "Table attributes unset.\n" +msgstr "ცხრილის ატრიბუტები მოხსნილია.\n" + +#: command.c:4688 +#, c-format +msgid "Title is \"%s\".\n" +msgstr "სათაურია \"%s\".\n" + +#: command.c:4690 +#, c-format +msgid "Title is unset.\n" +msgstr "სათაურის დაყენება გაუქმდა.\n" + +#: command.c:4697 +#, c-format +msgid "Tuples only is on.\n" +msgstr "მხოლოდ სტრუქტურები ჩართულია.\n" + +#: command.c:4699 +#, c-format +msgid "Tuples only is off.\n" +msgstr "მხოლოდ სტრუქტურები გამორთულია.\n" + +#: command.c:4705 +#, c-format +msgid "Unicode border line style is \"%s\".\n" +msgstr "უნიკოდის საზღვრის ხაზის სტილია \"%s\".\n" + +#: command.c:4711 +#, c-format +msgid "Unicode column line style is \"%s\".\n" +msgstr "უნიკოდის სვეტის ხაზის სტილია \"%s\".\n" + +#: command.c:4717 +#, c-format +msgid "Unicode header line style is \"%s\".\n" +msgstr "უნიკოდის თავსართის ხაზის სტილია \"%s\".\n" + +#: command.c:4950 +#, c-format +msgid "\\!: failed" +msgstr "\\!: შეცდომა" + +#: command.c:4984 +#, c-format +msgid "\\watch cannot be used with an empty query" +msgstr "\\watch ცარიელი მოთხოვნით გამოყენებული ვერ იქნება" + +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "დროის აღმრიცხველის დაყენების შეცდომა: %m" + +#: command.c:5078 +#, c-format +msgid "%s\t%s (every %gs)\n" +msgstr "%s\t%s (ყოველ %g-ში)\n" + +#: command.c:5081 +#, c-format +msgid "%s (every %gs)\n" +msgstr "%s (ყოველ %g-ში)\n" + +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "სიგნალებისთვის დალოდება შეუძლებელია: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 +#, c-format +msgid "" +"********* QUERY **********\n" +"%s\n" +"**************************\n" +"\n" +msgstr "" +"********* მოთხოვნა **********\n" +"%s\n" +"**************************\n" +"\n" + +#: command.c:5386 +#, c-format +msgid "\"%s.%s\" is not a view" +msgstr "\"%s.%s\" ხედი არაა" + +#: command.c:5402 +#, c-format +msgid "could not parse reloptions array" +msgstr "reloptions მასივის დამუშავების შეცდომა" + +#: common.c:166 +#, c-format +msgid "cannot escape without active connection" +msgstr "გაქცევა აქტიური შეერთებს გარეშე შეუძლებელია" + +#: common.c:207 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"" +msgstr "გარსის ბრძანება ხაზის გადატანას ან კარეტის დაბრუნებას შეიცავს: \"%s\"" + +#: common.c:311 +#, c-format +msgid "connection to server was lost" +msgstr "სერვერთან კავშირი დაკარგულია" + +#: common.c:315 +#, c-format +msgid "The connection to the server was lost. Attempting reset: " +msgstr "სერვერთან კავშირი დაკარგულია. ვეცდები თავიდან დავიწყო: " + +#: common.c:320 +#, c-format +msgid "Failed.\n" +msgstr "წარუმატებელი.\n" + +#: common.c:337 +#, c-format +msgid "Succeeded.\n" +msgstr "წარმატებულია.\n" + +#: common.c:389 common.c:1001 +#, c-format +msgid "unexpected PQresultStatus: %d" +msgstr "მოულოდნელი PQresultStatus: %d" + +#: common.c:511 +#, c-format +msgid "Time: %.3f ms\n" +msgstr "დრო: %.3f მწმ\n" + +#: common.c:526 +#, c-format +msgid "Time: %.3f ms (%02d:%06.3f)\n" +msgstr "დრო: %.3f მწმ (%02d:%06.3f)\n" + +#: common.c:535 +#, c-format +msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" +msgstr "დრო: %.3f მწმ (%02d:%02d:%06.3f)\n" + +#: common.c:542 +#, c-format +msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" +msgstr "დრო: %.3f მწმ (%.0f დღე %02d:%02d:%06.3f)\n" + +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 +#, c-format +msgid "You are currently not connected to a database." +msgstr "ამჟამად მონაცემთა ბაზასთან მიერთებული არ ბრძანდებით." + +#: common.c:654 +#, 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:657 +#, c-format +msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" +msgstr "მიღებულია ასინქრონული გაფრთხილება \"%s\" სერვერის პროცესისგან PID-ით %d.\n" + +#: common.c:688 +#, c-format +msgid "could not print result table: %m" +msgstr "შედეგების ცხრილის გამოტანის შეცდომა: %m" + +#: common.c:708 +#, c-format +msgid "no rows returned for \\gset" +msgstr "\\gset -სთვის მწკრივები არ დაბრუნებულა" + +#: common.c:713 +#, c-format +msgid "more than one row returned for \\gset" +msgstr "\\gset -სთვის ერთზე მეტი მწკრივი დაბრუნდა" + +#: common.c:731 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "მცდელობა, \\gset-ი სპეციალურ ცვლადზე (\"%s\") ყოფილიყო გამოყენებული, იგნორირებულია" + +#: common.c:1043 +#, c-format +msgid "" +"***(Single step mode: verify command)*******************************************\n" +"%s\n" +"***(press return to proceed or enter x and return to cancel)********************\n" +msgstr "" +"***(ერთნაბიჯიანი რეჟიმი: გადაამოწმეთ ბრძანება)*******************************************\n" +"%s\n" +"***(დააწექით Enter-ს გასაგრძელებლად. გასაუქმებლად კი x-ს და შემდეგ Enter-ს )********************\n" + +#: common.c:1126 +#, c-format +msgid "STATEMENT: %s" +msgstr "ოპერატორი: %s" + +#: common.c:1162 +#, c-format +msgid "unexpected transaction status (%d)" +msgstr "ტრანზაქციის მოულოდნელი სტატუსი (%d)" + +#: common.c:1303 describe.c:2020 +msgid "Column" +msgstr "სვეტი" + +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 +msgid "Type" +msgstr "ტიპი" + +#: common.c:1353 +#, c-format +msgid "The command has no result, or the result has no columns.\n" +msgstr "ბრძანებას შედეგები არ აქვს, ან შედეგებში სვეტები არაა.\n" + +#: copy.c:98 +#, c-format +msgid "\\copy: arguments required" +msgstr "\\copy: საჭიროა არგუმენტები" + +#: copy.c:253 +#, c-format +msgid "\\copy: parse error at \"%s\"" +msgstr "\\copy: დამუშავების შეცდომა: \"%s\"" + +#: copy.c:255 +#, c-format +msgid "\\copy: parse error at end of line" +msgstr "\\copy: დამუშავების შეცდომა ხაზის ბოლოსთან" + +#: copy.c:328 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძანების (\"%s\") შესრულების შეცდომა: %m" + +#: copy.c:344 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფაილი \"%s\" არ არსებობს: %m" + +#: copy.c:348 +#, c-format +msgid "%s: cannot copy from/to a directory" +msgstr "%s: საქაღალდ(იდან/ში) კოპირება შეუძლებელია" + +#: copy.c:385 +#, c-format +msgid "could not close pipe to external command: %m" +msgstr "გარე ბრძანებამდე ფაიფის დახურვის შეცდომა: %m" + +#: copy.c:390 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: copy.c:453 copy.c:463 +#, c-format +msgid "could not write COPY data: %m" +msgstr "შეცდომა COPY-ის მონაცემების ჩაწერისას: %m" + +#: copy.c:469 +#, c-format +msgid "COPY data transfer failed: %s" +msgstr "COPY-ის მონაცემების გადატანის შეცდომა: %s" + +#: copy.c:530 +msgid "canceled by user" +msgstr "გაუქმებულია მომხმარებლის მიერ" + +#: 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." +msgstr "" +"შეიყვანეთ დასაკოპირებელიმ ხაზის გადატანით დასრულებული მონაცემები.\n" +"დაასრულეთ უკანა ხაზით და წერტილით იგივე ხაზში ხაზით, ან EOF სიგნალით." + +#: copy.c:684 +msgid "aborted because of read failure" +msgstr "დასრულდა კითხვის შეცდომის გამო" + +#: 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: ოპერატორმა შედეგების სეტი არ დააბრუნა" + +#: crosstabview.c:129 +#, c-format +msgid "\\crosstabview: query must return at least three columns" +msgstr "\\crosstabview: მოთხოვნამ სულ ცოტა, სამი სვეტი უნდა დააბრუნოს" + +#: crosstabview.c:156 +#, c-format +msgid "\\crosstabview: vertical and horizontal headers must be different columns" +msgstr "\\crosstabview: ვერტიკალური და ჰორიზონტალური თავსართები სხვადასხვა სვეტებში უნდა იყოს" + +#: crosstabview.c:172 +#, c-format +msgid "\\crosstabview: data column must be specified when query returns more than three columns" +msgstr "\\crosstabview: როცა მოთხოვნა სამზე მეტ სვეტს აბრუნებს, ასევე საჭიროა მონაცემების სვეტის მითითება" + +#: crosstabview.c:228 +#, c-format +msgid "\\crosstabview: maximum number of columns (%d) exceeded" +msgstr "\\crosstabview: გადაჭარბებულია სვეტების მაქსიმალური რაოდენობა (%d)" + +#: crosstabview.c:397 +#, c-format +msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" +msgstr "\\crosstabview: მოთხოვნის შედეგი მონაცემების მრავალ მნიშვნელობას შეიცავს მწკრივისთვის \"%s\", სვეტი \"%s\"" + +#: crosstabview.c:645 +#, c-format +msgid "\\crosstabview: column number %d is out of range 1..%d" +msgstr "\\crosstabview: სვეტის რიცხვი %d დიაპაზონს 1..%d გარეთაა" + +#: crosstabview.c:670 +#, c-format +msgid "\\crosstabview: ambiguous column name: \"%s\"" +msgstr "\\crosstabview: სვეტის არასწორი სახელი: \"%s\"" + +#: crosstabview.c:678 +#, c-format +msgid "\\crosstabview: column name not found: \"%s\"" +msgstr "\\crosstabview: სვეტის სახელი არ არსებობს: \"%s\"" + +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 +msgid "Schema" +msgstr "სქემა" + +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 +msgid "Name" +msgstr "სახელი" + +#: describe.c:89 describe.c:351 describe.c:369 +msgid "Result data type" +msgstr "შედეგის მონაცემების ტიპი" + +#: describe.c:90 describe.c:352 describe.c:370 +msgid "Argument data types" +msgstr "არგუმენტის მონაცემების ტიპი" + +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 +msgid "Description" +msgstr "აღწერა" + +#: describe.c:128 +msgid "List of aggregate functions" +msgstr "აგრეგატული ფუნქცების სია" + +#: describe.c:153 +#, c-format +msgid "The server (version %s) does not support access methods." +msgstr "სერვერს (ვერსია %s) წვდომის მეთოდების მხარდაჭერა არ გააჩნია." + +#: describe.c:168 +msgid "Index" +msgstr "ინდექსი" + +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +msgid "Table" +msgstr "ცხრილი" + +#: describe.c:177 describe.c:5679 +msgid "Handler" +msgstr "დამმუშავებელი" + +#: describe.c:201 +msgid "List of access methods" +msgstr "წვდომის მეთოდების სია" + +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 +msgid "Owner" +msgstr "მფლობელი" + +#: describe.c:231 +msgid "Location" +msgstr "მდებარეობა" + +#: describe.c:241 describe.c:3509 +msgid "Options" +msgstr "პარამეტრები" + +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +msgid "Size" +msgstr "ზომა" + +#: describe.c:266 +msgid "List of tablespaces" +msgstr "ცხრილის სივრცეების სია" + +#: describe.c:311 +#, c-format +msgid "\\df only takes [anptwS+] as options" +msgstr "\\df მხოლოდ [anptwS+] -ს იღებს პარამეტრად" + +#: describe.c:319 +#, 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:354 describe.c:372 +msgid "agg" +msgstr "აგ" + +#: describe.c:355 describe.c:373 +msgid "window" +msgstr "ფანჯარა" + +#: describe.c:356 +msgid "proc" +msgstr "პროც" + +#: describe.c:357 describe.c:375 +msgid "func" +msgstr "ფუნქც" + +#: describe.c:374 describe.c:1390 +msgid "trigger" +msgstr "ტრიგერი" + +#: describe.c:386 +msgid "immutable" +msgstr "დაურღვეველი" + +#: describe.c:387 +msgid "stable" +msgstr "სტაბილური" + +#: describe.c:388 +msgid "volatile" +msgstr "ცვალებადი" + +#: describe.c:389 +msgid "Volatility" +msgstr "ცვალებადობა" + +#: describe.c:397 +msgid "restricted" +msgstr "შეზღუდულია" + +#: describe.c:398 +msgid "safe" +msgstr "უსაფრთხო" + +#: describe.c:399 +msgid "unsafe" +msgstr "სახიფათო" + +#: describe.c:400 +msgid "Parallel" +msgstr "პარალელური" + +#: describe.c:405 +msgid "definer" +msgstr "აღმწერი" + +#: describe.c:406 +msgid "invoker" +msgstr "ჩამწოდებელი" + +#: describe.c:407 +msgid "Security" +msgstr "უსაფრთხოება" + +#: describe.c:412 +msgid "Language" +msgstr "ენა" + +#: describe.c:416 describe.c:420 +msgid "Source code" +msgstr "საწყისი კოდი" + +#: describe.c:594 +msgid "List of functions" +msgstr "ფუნქციების სია" + +#: describe.c:657 +msgid "Internal name" +msgstr "შიდა სახელი" + +#: describe.c:659 +msgid "Elements" +msgstr "ელემენტები" + +#: describe.c:711 +msgid "List of data types" +msgstr "მონაცემების ტიპების სია" + +#: describe.c:814 +msgid "Left arg type" +msgstr "მარცხენა არგუმენტის ტიპი" + +#: describe.c:815 +msgid "Right arg type" +msgstr "მარჯვენა არგუმენტის ტიპი" + +#: describe.c:816 +msgid "Result type" +msgstr "შედეგის ტიპი" + +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 +msgid "Function" +msgstr "ფუნქცია" + +#: describe.c:902 +msgid "List of operators" +msgstr "ოპერატორების სია" + +#: describe.c:938 +msgid "Encoding" +msgstr "კოდირება" + +#: describe.c:939 describe.c:4868 +msgid "Collate" +msgstr "დაშლა" + +#: describe.c:940 describe.c:4869 +msgid "Ctype" +msgstr "Ctype" + +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU ენა" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "ენის მომწოდებელი" + +#: describe.c:964 +msgid "Tablespace" +msgstr "ცხრილების სივრცე" + +#: describe.c:990 +msgid "List of databases" +msgstr "მონაცემთა ბაზების სია" + +#: describe.c:1031 describe.c:1184 describe.c:3882 +msgid "table" +msgstr "ცხრილი" + +#: describe.c:1032 describe.c:3883 +msgid "view" +msgstr "ხედი" + +#: describe.c:1033 describe.c:3884 +msgid "materialized view" +msgstr "მატერიალიზებული ხედი" + +#: describe.c:1034 describe.c:1186 describe.c:3886 +msgid "sequence" +msgstr "მიმდევრობა" + +#: describe.c:1035 describe.c:3888 +msgid "foreign table" +msgstr "გარე ცხრილი" + +#: describe.c:1036 describe.c:3889 describe.c:4101 +msgid "partitioned table" +msgstr "დაყოფილი ცხრილი" + +#: describe.c:1047 +msgid "Column privileges" +msgstr "სვეტის წვდომები" + +#: describe.c:1078 describe.c:1112 +msgid "Policies" +msgstr "წესები" + +#: describe.c:1143 describe.c:4510 describe.c:6577 +msgid "Access privileges" +msgstr "წვდომები" + +#: describe.c:1188 +msgid "function" +msgstr "ფუნქცია" + +#: describe.c:1190 +msgid "type" +msgstr "ტიპი" + +#: describe.c:1192 +msgid "schema" +msgstr "სქემა" + +#: describe.c:1215 +msgid "Default access privileges" +msgstr "ნაგულისხმები წვდომები" + +#: describe.c:1259 +msgid "Object" +msgstr "ობიექტი" + +#: describe.c:1273 +msgid "table constraint" +msgstr "ცხრილის შეზღუდვები" + +#: describe.c:1297 +msgid "domain constraint" +msgstr "დომენის შეზღუდვები" + +#: describe.c:1321 +msgid "operator class" +msgstr "ოპერატორის კლასი" + +#: describe.c:1345 +msgid "operator family" +msgstr "ოპერატორის ოჯახი" + +#: describe.c:1368 +msgid "rule" +msgstr "წესი" + +#: describe.c:1414 +msgid "Object descriptions" +msgstr "ობიექტების აღწერა" + +#: describe.c:1479 describe.c:4007 +#, c-format +msgid "Did not find any relation named \"%s\"." +msgstr "ურთიერთობა სახელით \"%s\" არ არსებობს." + +#: describe.c:1482 describe.c:4010 +#, c-format +msgid "Did not find any relations." +msgstr "ურთიერთობები ნაპოვნი არაა." + +#: describe.c:1678 +#, c-format +msgid "Did not find any relation with OID %s." +msgstr "ურთიერთობები, რომლის OID=%s, არ არსებობს." + +#: describe.c:1726 describe.c:1750 +msgid "Start" +msgstr "დაწყება" + +#: describe.c:1727 describe.c:1751 +msgid "Minimum" +msgstr "მინიმუმი" + +#: describe.c:1728 describe.c:1752 +msgid "Maximum" +msgstr "მაქსიმუმი" + +#: describe.c:1729 describe.c:1753 +msgid "Increment" +msgstr "გაზრდა" + +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +msgid "yes" +msgstr "დიახ" + +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 +msgid "no" +msgstr "არა" + +#: describe.c:1732 describe.c:1756 +msgid "Cycles?" +msgstr "ციკლები?" + +#: describe.c:1733 describe.c:1757 +msgid "Cache" +msgstr "კეში" + +#: describe.c:1798 +#, c-format +msgid "Owned by: %s" +msgstr "მფლობელი: %s" + +#: describe.c:1802 +#, c-format +msgid "Sequence for identity column: %s" +msgstr "იდენტიფიკაციის სვეტის მიმდევრობა: %s" + +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი მიმდევრომა \"%s.%s\"" + +#: describe.c:1813 +#, c-format +msgid "Sequence \"%s.%s\"" +msgstr "მიმდევრობა \"%s.%s\"" + +#: describe.c:1957 +#, c-format +msgid "Unlogged table \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი ცხრილი \"%s.%s\"" + +#: describe.c:1960 +#, c-format +msgid "Table \"%s.%s\"" +msgstr "ცხრილი \"%s.%s\"" + +#: describe.c:1964 +#, c-format +msgid "View \"%s.%s\"" +msgstr "ხედი \"%s.%s\"" + +#: describe.c:1969 +#, c-format +msgid "Unlogged materialized view \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი მატერიალიზებული ხედი \"%s.%s\"" + +#: describe.c:1972 +#, c-format +msgid "Materialized view \"%s.%s\"" +msgstr "მატერიალიზებული ხედი \"%s.%s\"" + +#: describe.c:1977 +#, c-format +msgid "Unlogged index \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი ინდექსი \"%s.%s\"" + +#: describe.c:1980 +#, c-format +msgid "Index \"%s.%s\"" +msgstr "ინდექსი \"%s.%s\"" + +#: describe.c:1985 +#, c-format +msgid "Unlogged partitioned index \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი დაყოფილი ინდექსი \"%s.%s\"" + +#: describe.c:1988 +#, c-format +msgid "Partitioned index \"%s.%s\"" +msgstr "დაყოფილი ინდექი \"%s.%s\"" + +#: describe.c:1992 +#, c-format +msgid "TOAST table \"%s.%s\"" +msgstr "TOAST ცხრილი \"%s.%s\"" + +#: describe.c:1996 +#, c-format +msgid "Composite type \"%s.%s\"" +msgstr "კომპოზიტის ტიპი \"%s.%s\"" + +#: describe.c:2000 +#, c-format +msgid "Foreign table \"%s.%s\"" +msgstr "გარე ცხრილი \"%s.%s\"" + +#: describe.c:2005 +#, c-format +msgid "Unlogged partitioned table \"%s.%s\"" +msgstr "ჟურნალში არ-ჩაწერილი დაყოფილი ცხრილი \"%s.%s\"" + +#: describe.c:2008 +#, c-format +msgid "Partitioned table \"%s.%s\"" +msgstr "დაყოფილი ცხრილი \"%s.%s\"" + +#: describe.c:2024 describe.c:4343 +msgid "Collation" +msgstr "კოლაცია" + +#: describe.c:2025 describe.c:4344 +msgid "Nullable" +msgstr "განულებადი" + +#: describe.c:2026 describe.c:4345 +msgid "Default" +msgstr "ნაგულისხმევი" + +#: describe.c:2029 +msgid "Key?" +msgstr "გასაღები?" + +#: describe.c:2031 describe.c:4665 describe.c:4676 +msgid "Definition" +msgstr "განმარტება" + +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 +msgid "FDW options" +msgstr "FDW -ის მორგება" + +#: describe.c:2035 +msgid "Storage" +msgstr "საცავი" + +#: describe.c:2037 +msgid "Compression" +msgstr "შეკუმშვა" + +#: describe.c:2039 +msgid "Stats target" +msgstr "სამიზნის სტატისტიკა" + +#: describe.c:2175 +#, c-format +msgid "Partition of: %s %s%s" +msgstr "დანაყოფი: %s %s%s" + +#: describe.c:2188 +msgid "No partition constraint" +msgstr "დანაყოფის შეზღუდვების გარეშე" + +#: describe.c:2190 +#, c-format +msgid "Partition constraint: %s" +msgstr "დანაყოფის შეზღუდვა: %s" + +#: describe.c:2214 +#, c-format +msgid "Partition key: %s" +msgstr "დანაყოფს გასაღები: %s" + +#: describe.c:2240 +#, c-format +msgid "Owning table: \"%s.%s\"" +msgstr "ცხრილის მფლობელი: \"%s.%s\"" + +#: describe.c:2309 +msgid "primary key, " +msgstr "ძირითადი გასაღები. " + +#: describe.c:2312 +msgid "unique" +msgstr "უნიკალური" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " ნულები განსხვავებული არაა" + +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 +#, c-format +msgid "for table \"%s.%s\"" +msgstr "ცხრილისთვის \"%s.%s\"" + +#: describe.c:2326 +#, c-format +msgid ", predicate (%s)" +msgstr ", პრედიკატი (%s)" + +#: describe.c:2329 +msgid ", clustered" +msgstr ", დაკლასტერებული" + +#: describe.c:2332 +msgid ", invalid" +msgstr ", არასწორი" + +#: describe.c:2335 +msgid ", deferrable" +msgstr ", deferrable" + +#: describe.c:2338 +msgid ", initially deferred" +msgstr ", თავიდან გადადებული" + +#: describe.c:2341 +msgid ", replica identity" +msgstr ", რეპლიკის იდენტიფიკატორი" + +#: describe.c:2395 +msgid "Indexes:" +msgstr "ინდექსები:" + +#: describe.c:2478 +msgid "Check constraints:" +msgstr "შეამოწმეთ შეზღუდვები:" + +#: describe.c:2546 +msgid "Foreign-key constraints:" +msgstr "გარე-გასაღების შეზღუდვები:" + +#: describe.c:2609 +msgid "Referenced by:" +msgstr "ბმული გარედან:" + +#: describe.c:2659 +msgid "Policies:" +msgstr "წესები:" + +#: describe.c:2662 +msgid "Policies (forced row security enabled):" +msgstr "წესები (მწკრივების გაძლიერებული დაცვა ჩართულია):" + +#: describe.c:2665 +msgid "Policies (row security enabled): (none)" +msgstr "წესები (მწკრივების დაცვა ჩართულია): (არცერთი)" + +#: describe.c:2668 +msgid "Policies (forced row security enabled): (none)" +msgstr "წესები (მწკრივების გაძლიერებული დაცვა ჩართულია: (არცერთი)" + +#: describe.c:2671 +msgid "Policies (row security disabled):" +msgstr "წესები (მწკრივების უსაფრთხოება გამორთულია)" + +#: describe.c:2731 describe.c:2835 +msgid "Statistics objects:" +msgstr "სტატისტიკის ობიექტები:" + +#: describe.c:2937 describe.c:3090 +msgid "Rules:" +msgstr "წესები:" + +#: describe.c:2940 +msgid "Disabled rules:" +msgstr "გამორთული წესები:" + +#: describe.c:2943 +msgid "Rules firing always:" +msgstr "ყოველთვის გაშვებადი წესები:" + +#: describe.c:2946 +msgid "Rules firing on replica only:" +msgstr "მხოლოდ რეპლიკაზე გაშვებადი წესები:" + +#: describe.c:3025 describe.c:5030 +msgid "Publications:" +msgstr "გამოცემები:" + +#: describe.c:3073 +msgid "View definition:" +msgstr "აღწერის ნახვა:" + +#: describe.c:3236 +msgid "Triggers:" +msgstr "ტრიგერები:" + +#: describe.c:3239 +msgid "Disabled user triggers:" +msgstr "მომხმარებლის გამორთული ტრიგერები:" + +#: describe.c:3242 +msgid "Disabled internal triggers:" +msgstr "გამორთული შიდა ტრიგერები:" + +#: describe.c:3245 +msgid "Triggers firing always:" +msgstr "ყოველთვის გაშვებადი ტრიგერები:" + +#: describe.c:3248 +msgid "Triggers firing on replica only:" +msgstr "მხოლოდ რეპლიკაზე გაშვებადი ტრიგერები:" + +#: describe.c:3319 +#, c-format +msgid "Server: %s" +msgstr "სერვერი: %s" + +#: describe.c:3327 +#, c-format +msgid "FDW options: (%s)" +msgstr "FDW პარამეტრები: (%s)" + +#: describe.c:3348 +msgid "Inherits" +msgstr "მემკვიდრეობით" + +#: describe.c:3413 +#, c-format +msgid "Number of partitions: %d" +msgstr "დანაყოფების რიცხვი: %d" + +#: describe.c:3422 +#, c-format +msgid "Number of partitions: %d (Use \\d+ to list them.)" +msgstr "დანაყოფების რიცხვი: %d (სიის მისაღებად გამოიყენეთ \\d+.)" + +#: describe.c:3424 +#, c-format +msgid "Number of child tables: %d (Use \\d+ to list them.)" +msgstr "შვილეული ცხრილების რიცხვი: %d (სიის გამოსატანად გამოიყენეთ \\d+ )" + +#: describe.c:3431 +msgid "Child tables" +msgstr "შვილეული ცხრილები" + +#: describe.c:3431 +msgid "Partitions" +msgstr "დანაყოფები" + +#: describe.c:3462 +#, c-format +msgid "Typed table of type: %s" +msgstr "ტიპიზირებული ცხრილის ტიპი: %s" + +#: describe.c:3478 +msgid "Replica Identity" +msgstr "რეპლიკის იდენტიფიკატორი" + +#: describe.c:3491 +msgid "Has OIDs: yes" +msgstr "აქვს OID-ები: დიახ" + +#: describe.c:3500 +#, c-format +msgid "Access method: %s" +msgstr "წვდომის მეთოდი: %s" + +#: describe.c:3579 +#, 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:3591 +#, c-format +msgid ", tablespace \"%s\"" +msgstr ", ცხრილების სივრცე: \"%s\"" + +#: describe.c:3668 +msgid "List of roles" +msgstr "როლების სია" + +#: describe.c:3670 +msgid "Role name" +msgstr "როლის სახელი" + +#: describe.c:3671 +msgid "Attributes" +msgstr "ატრიბუტები" + +#: describe.c:3673 +msgid "Member of" +msgstr "წარმოადგენს წევრს" + +#: describe.c:3684 +msgid "Superuser" +msgstr "ზემომხმარებელი" + +#: describe.c:3687 +msgid "No inheritance" +msgstr "მემკვიდრეობითობის გარეშე" + +#: describe.c:3690 +msgid "Create role" +msgstr "როლის შექმნა" + +#: describe.c:3693 +msgid "Create DB" +msgstr "ბაზის შექმნა" + +#: describe.c:3696 +msgid "Cannot login" +msgstr "შესვლა შეუძლებელია" + +#: describe.c:3699 +msgid "Replication" +msgstr "რეპლიკაცია" + +#: describe.c:3703 +msgid "Bypass RLS" +msgstr "RLS-ის გამოტოვება" + +#: describe.c:3712 +msgid "No connections" +msgstr "შეერთებების გარეშე" + +#: describe.c:3714 +#, c-format +msgid "%d connection" +msgid_plural "%d connections" +msgstr[0] "%d შეერთება" +msgstr[1] "%d შეერთება" + +#: describe.c:3724 +msgid "Password valid until " +msgstr "პაროლს ვადა " + +#: describe.c:3777 +msgid "Role" +msgstr "როლი" + +#: describe.c:3778 +msgid "Database" +msgstr "მონაცემთა ბაზა" + +#: describe.c:3779 +msgid "Settings" +msgstr "მორგება" + +#: describe.c:3803 +#, c-format +msgid "Did not find any settings for role \"%s\" and database \"%s\"." +msgstr "როლისთვის \"%s\" და ბაზისთვის \"%s\" პარამეტრები ნაპოვნი არაა." + +#: describe.c:3806 +#, c-format +msgid "Did not find any settings for role \"%s\"." +msgstr "როლისთვის (\"%s\") პარამეტრები ნაპოვნი არაა." + +#: describe.c:3809 +#, c-format +msgid "Did not find any settings." +msgstr "პარამეტრები ნაპოვნი არაა." + +#: describe.c:3814 +msgid "List of settings" +msgstr "პარამეტრების სია" + +#: describe.c:3885 +msgid "index" +msgstr "ინდექსი" + +#: describe.c:3887 +msgid "TOAST table" +msgstr "TOAST ცხრილი" + +#: describe.c:3890 describe.c:4102 +msgid "partitioned index" +msgstr "დაყოფილი ინდექსი" + +#: describe.c:3910 +msgid "permanent" +msgstr "მუდმივი" + +#: describe.c:3911 +msgid "temporary" +msgstr "დროებითი" + +#: describe.c:3912 +msgid "unlogged" +msgstr "ჟურნალში არ-ჩაწერილი" + +#: describe.c:3913 +msgid "Persistence" +msgstr "შენახვა" + +#: describe.c:3929 +msgid "Access method" +msgstr "წვდომის მეთოდი" + +#: describe.c:4015 +msgid "List of relations" +msgstr "ურთიერთობების სია" + +#: describe.c:4063 +#, c-format +msgid "The server (version %s) does not support declarative table partitioning." +msgstr "სერვერს (ვერსია %s) ცხრილების დეკლარატიულ დაყოფის მხარდაჭერა არ გააჩნია." + +#: describe.c:4074 +msgid "List of partitioned indexes" +msgstr "დაყოფილი ინდექსების სია" + +#: describe.c:4076 +msgid "List of partitioned tables" +msgstr "დაყოფილი ცხრილების სია" + +#: describe.c:4080 +msgid "List of partitioned relations" +msgstr "დაყოფილი ურთიერთობების სია" + +#: describe.c:4111 +msgid "Parent name" +msgstr "მშობლის სახელი" + +#: describe.c:4124 +msgid "Leaf partition size" +msgstr "ბოლო დანაყოფის ზომა" + +#: describe.c:4127 describe.c:4133 +msgid "Total size" +msgstr "ჯამური ზომა" + +#: describe.c:4258 +msgid "Trusted" +msgstr "სანდო" + +#: describe.c:4267 +msgid "Internal language" +msgstr "შიდა ენა" + +#: describe.c:4268 +msgid "Call handler" +msgstr "გამოძახების დამმუშავებელი" + +#: describe.c:4269 describe.c:5680 +msgid "Validator" +msgstr "შემმოწმებელი" + +#: describe.c:4270 +msgid "Inline handler" +msgstr "ჩადგმული კოდის დამმუშავებელი" + +#: describe.c:4305 +msgid "List of languages" +msgstr "ენების სია" + +#: describe.c:4346 +msgid "Check" +msgstr "შემოწმება" + +#: describe.c:4390 +msgid "List of domains" +msgstr "დომენების სია" + +#: describe.c:4424 +msgid "Source" +msgstr "წყარო" + +#: describe.c:4425 +msgid "Destination" +msgstr "დანიშნულება" + +#: describe.c:4427 describe.c:6622 +msgid "Default?" +msgstr "ნაგულისხმები?" + +#: describe.c:4469 +msgid "List of conversions" +msgstr "გადაყვანების სია" + +#: describe.c:4497 +msgid "Parameter" +msgstr "პარამეტრი" + +#: describe.c:4498 +msgid "Value" +msgstr "მნიშვნელობა" + +#: describe.c:4505 +msgid "Context" +msgstr "კონტექსტი" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "კონფიგურაციის პარამეტრების სია" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "კონფიგურაციის არანაგულისხმებადი პარამეტრების სია" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "სერვერს (ვერსია %s) მოვლენის ტრიგერების მხარდაჭერა არ გააჩნია." + +#: describe.c:4587 +msgid "Event" +msgstr "მოვლენა" + +#: describe.c:4589 +msgid "enabled" +msgstr "ჩართულია" + +#: describe.c:4590 +msgid "replica" +msgstr "რეპლიკა" + +#: describe.c:4591 +msgid "always" +msgstr "ყოველთვის" + +#: describe.c:4592 +msgid "disabled" +msgstr "გამორთულია" + +#: describe.c:4593 describe.c:6496 +msgid "Enabled" +msgstr "ჩართულია" + +#: describe.c:4595 +msgid "Tags" +msgstr "ჭდეები" + +#: describe.c:4619 +msgid "List of event triggers" +msgstr "მოვლენების ტრიგერების სია" + +#: describe.c:4646 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "სერვერს (ვერსია %s) გაფართოებული სტატისტიკის მხარდაჭერა არ გააჩნია." + +#: describe.c:4683 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4684 +msgid "Dependencies" +msgstr "დამოკიდებულებები" + +#: describe.c:4694 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4718 +msgid "List of extended statistics" +msgstr "გაფართოებული სტატისტიკის სია" + +#: describe.c:4745 +msgid "Source type" +msgstr "წყაროს ტიპი" + +#: describe.c:4746 +msgid "Target type" +msgstr "სამიზნის ტიპი" + +#: describe.c:4770 +msgid "in assignment" +msgstr "მინიჭებაში" + +#: describe.c:4772 +msgid "Implicit?" +msgstr "აშკარა?" + +#: describe.c:4831 +msgid "List of casts" +msgstr "კასტების სია" + +#: describe.c:4883 describe.c:4887 +msgid "Provider" +msgstr "სერვისის მომწოდებელი" + +#: describe.c:4893 describe.c:4898 +msgid "Deterministic?" +msgstr "დეტერმნისტული?" + +#: describe.c:4938 +msgid "List of collations" +msgstr "კოლაციების სია" + +#: describe.c:5000 +msgid "List of schemas" +msgstr "სქემების სია" + +#: describe.c:5117 +msgid "List of text search parsers" +msgstr "ტექსტური ძებნის დამმუშავებლების სია" + +#: describe.c:5167 +#, c-format +msgid "Did not find any text search parser named \"%s\"." +msgstr "ტექსტის ძებნის დამმუშავებელი სახელით \"%s\" არ არსებობს." + +#: describe.c:5170 +#, c-format +msgid "Did not find any text search parsers." +msgstr "ტექსტის ძებნის დამმუშავებლები ვერ ვიპოვე." + +#: describe.c:5245 +msgid "Start parse" +msgstr "დამუშავების დაწყება" + +#: describe.c:5246 +msgid "Method" +msgstr "მეთოდი" + +#: describe.c:5250 +msgid "Get next token" +msgstr "შემდეგი კოდის მიღება" + +#: describe.c:5252 +msgid "End parse" +msgstr "დამუშავების დასასრული" + +#: describe.c:5254 +msgid "Get headline" +msgstr "ამონაწერის მიღება" + +#: describe.c:5256 +msgid "Get token types" +msgstr "კოდის ტიპების მიღება" + +#: describe.c:5267 +#, c-format +msgid "Text search parser \"%s.%s\"" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s.%s\"" + +#: describe.c:5270 +#, c-format +msgid "Text search parser \"%s\"" +msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\"" + +#: describe.c:5289 +msgid "Token name" +msgstr "კოდის სახელი" + +#: describe.c:5303 +#, c-format +msgid "Token types for parser \"%s.%s\"" +msgstr "კოდის ტიპები დამმუშავებლისთვის \"%s.%s\"" + +#: describe.c:5306 +#, c-format +msgid "Token types for parser \"%s\"" +msgstr "კოდის ტიპები დამმუშავებლისთვის \"%s\"" + +#: describe.c:5350 +msgid "Template" +msgstr "ნიმუში" + +#: describe.c:5351 +msgid "Init options" +msgstr "ინიციალიზაციის პარამეტრები" + +#: describe.c:5378 +msgid "List of text search dictionaries" +msgstr "ტექსტის ძებნის ლექსიკონების სია" + +#: describe.c:5411 +msgid "Init" +msgstr "ერთეული" + +#: describe.c:5412 +msgid "Lexize" +msgstr "ლექსით გამოყოფა" + +#: describe.c:5444 +msgid "List of text search templates" +msgstr "ტექსტის ძებნის შაბლონების სია" + +#: describe.c:5499 +msgid "List of text search configurations" +msgstr "ტექსტის ძებნის კონფიგურაციების სია" + +#: describe.c:5550 +#, c-format +msgid "Did not find any text search configuration named \"%s\"." +msgstr "ტექსტის ძებნის კონფიგურაცია სახელით \"%s\" არ არსებობს." + +#: describe.c:5553 +#, c-format +msgid "Did not find any text search configurations." +msgstr "ტექსტის ძებნის არცერთი კონფიგურაცია ნაპოვნი არაა." + +#: describe.c:5619 +msgid "Token" +msgstr "ტოკენი" + +#: describe.c:5620 +msgid "Dictionaries" +msgstr "ლექსიკონები" + +#: describe.c:5631 +#, c-format +msgid "Text search configuration \"%s.%s\"" +msgstr "ტექსტის ძებნის კონფიგურაცია \"%s.%s\"" + +#: describe.c:5634 +#, c-format +msgid "Text search configuration \"%s\"" +msgstr "ტექსტის ძებნის კონფიგურაცია \"%s\"" + +#: describe.c:5638 +#, c-format +msgid "" +"\n" +"Parser: \"%s.%s\"" +msgstr "" +"\n" +"დამმუშავებელი: \"%s.%s\"" + +#: describe.c:5641 +#, c-format +msgid "" +"\n" +"Parser: \"%s\"" +msgstr "" +"\n" +"დამუშავებელი: \"%s\"" + +#: describe.c:5722 +msgid "List of foreign-data wrappers" +msgstr "გარე მონაცემების გადამტანების სია" + +#: describe.c:5750 +msgid "Foreign-data wrapper" +msgstr "გარე-მონაცემების გადამტანი" + +#: describe.c:5768 describe.c:5958 +msgid "Version" +msgstr "ვერსია" + +#: describe.c:5799 +msgid "List of foreign servers" +msgstr "გარე სერვერების სია" + +#: describe.c:5824 describe.c:5883 +msgid "Server" +msgstr "სერვერი" + +#: describe.c:5825 +msgid "User name" +msgstr "მომხმარებლის სახელი" + +#: describe.c:5855 +msgid "List of user mappings" +msgstr "მომხმარებლების მიმაგრებების სია" + +#: describe.c:5928 +msgid "List of foreign tables" +msgstr "გარე ცხრილების სია" + +#: describe.c:5980 +msgid "List of installed extensions" +msgstr "დაყენებული გაფართოებების სია" + +#: describe.c:6028 +#, c-format +msgid "Did not find any extension named \"%s\"." +msgstr "გაფართოება სახელით \"%s\" არ არსებობს." + +#: describe.c:6031 +#, c-format +msgid "Did not find any extensions." +msgstr "გაფართოებების პოვნა შეუძლებელია." + +#: describe.c:6075 +msgid "Object description" +msgstr "ობიექტის აღწერა" + +#: describe.c:6085 +#, c-format +msgid "Objects in extension \"%s\"" +msgstr "ობიექტები გაფართებაში \"%s\"" + +#: describe.c:6126 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "არასწორი სრული სახელი (ძალიან ბევრი წერტილიანი სახელი): %s" + +#: describe.c:6140 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "ბაზებს შორის ბმულები განხორციელებული არაა: %s" + +#: describe.c:6171 describe.c:6298 +#, c-format +msgid "The server (version %s) does not support publications." +msgstr "სერვერს (ვერსია %s) გამოცემების მხარდაჭერა არ გააჩნია." + +#: describe.c:6188 describe.c:6376 +msgid "All tables" +msgstr "ყველა ცხრილი" + +#: describe.c:6189 describe.c:6377 +msgid "Inserts" +msgstr "ჩასმები" + +#: describe.c:6190 describe.c:6378 +msgid "Updates" +msgstr "განახლებები" + +#: describe.c:6191 describe.c:6379 +msgid "Deletes" +msgstr "წაშლები" + +#: describe.c:6195 describe.c:6381 +msgid "Truncates" +msgstr "შეკვეცები" + +#: describe.c:6199 describe.c:6383 +msgid "Via root" +msgstr "Root-ის გავლით" + +#: describe.c:6221 +msgid "List of publications" +msgstr "გამოცემების სია" + +#: describe.c:6345 +#, c-format +msgid "Did not find any publication named \"%s\"." +msgstr "გამოცემა სახელით \"%s\" არ არსებობს." + +#: describe.c:6348 +#, c-format +msgid "Did not find any publications." +msgstr "გამოცემების გარეშე." + +#: describe.c:6372 +#, c-format +msgid "Publication %s" +msgstr "პუბლიკაცია %s" + +#: describe.c:6425 +msgid "Tables:" +msgstr "ცხრილები:" + +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "ცხრილები სქემებიდან:" + +#: describe.c:6481 +#, c-format +msgid "The server (version %s) does not support subscriptions." +msgstr "სერვერს (ვერსია %s) გამოწერების მხარდაჭერა არ გააჩნია." + +#: describe.c:6497 +msgid "Publication" +msgstr "გამოცება" + +#: describe.c:6506 +msgid "Binary" +msgstr "ბინარული" + +#: describe.c:6507 +msgid "Streaming" +msgstr "გაადაცემა" + +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "ორ-ფაზიანი გადაცემა" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "გამორთვა შეცდომის შემთხვევაში" + +#: describe.c:6520 +msgid "Synchronous commit" +msgstr "სინქრონული გადაგზავნა" + +#: describe.c:6521 +msgid "Conninfo" +msgstr "შეერთ. ინფო" + +#: describe.c:6527 +msgid "Skip LSN" +msgstr "LSN-ის გამოტოვება" + +#: describe.c:6554 +msgid "List of subscriptions" +msgstr "გამოწერების სია" + +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +msgid "AM" +msgstr "AM" + +#: describe.c:6617 +msgid "Input type" +msgstr "შეყვანის ტიპი" + +#: describe.c:6618 +msgid "Storage type" +msgstr "საცავის ტიპი" + +#: describe.c:6619 +msgid "Operator class" +msgstr "ოპერატორის კლასი" + +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +msgid "Operator family" +msgstr "ოპერატორის ოჯახი" + +#: describe.c:6667 +msgid "List of operator classes" +msgstr "ოპერატორის კლასების სია" + +#: describe.c:6714 +msgid "Applicable types" +msgstr "განკუთვნილი ტიპები" + +#: describe.c:6756 +msgid "List of operator families" +msgstr "ოპერატორის ოჯახების სია" + +#: describe.c:6807 +msgid "Operator" +msgstr "ოპერატორი" + +#: describe.c:6808 +msgid "Strategy" +msgstr "სტრატეგია" + +#: describe.c:6809 +msgid "ordering" +msgstr "დალაგება" + +#: describe.c:6810 +msgid "search" +msgstr "ძებნა" + +#: describe.c:6811 +msgid "Purpose" +msgstr "მიზანი" + +#: describe.c:6816 +msgid "Sort opfamily" +msgstr "ოპერატორის ოჯახის დალაგება" + +#: describe.c:6855 +msgid "List of operators of operator families" +msgstr "ოპერატორის ოჯახების ოპერატორების სია" + +#: describe.c:6902 +msgid "Registered left type" +msgstr "რეგისტრირებული მარცხენა ტიპი" + +#: describe.c:6903 +msgid "Registered right type" +msgstr "რეგისტრირებული მარჯვენა ტიპი" + +#: describe.c:6904 +msgid "Number" +msgstr "რიცხვი" + +#: describe.c:6948 +msgid "List of support functions of operator families" +msgstr "ოპერატორის ოჯახების ფუნქციების სია" + +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "დიდი ობიექტები" + +#: help.c:75 +msgid "" +"psql is the PostgreSQL interactive terminal.\n" +"\n" +msgstr "" +"psql PostgreSQL-ის ინტერაქტიური ტერმინალია.\n" +"\n" + +#: help.c:76 help.c:393 help.c:473 help.c:516 +msgid "Usage:\n" +msgstr "გამოყენება:\n" + +#: help.c:77 +msgid "" +" psql [OPTION]... [DBNAME [USERNAME]]\n" +"\n" +msgstr "" +" psql [პარამეტრი]... [ბაზისსახელი [მომხმსახელი]]\n" +"\n" + +#: help.c:79 +msgid "General options:\n" +msgstr "ზოგადი პარამეტრები:\n" + +#: help.c:84 +msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" +msgstr " -c, --command=ბრძანება მხოლოდ ერთი (SQL ან შიდა) ბრძანების გაშვება და გასვლა\n" + +#: help.c:85 +#, c-format +msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" +msgstr " -d, --dbname=ბაზისსახელი მისაერთებელი ბაზის სახელი (ნაგულისხმები: \"%s\")\n" + +#: help.c:87 +msgid " -f, --file=FILENAME execute commands from file, then exit\n" +msgstr " -f, --file=ფალისსახელი ბრძანებების ფაილიდან შესრულება და გასვლა\n" + +#: help.c:88 +msgid " -l, --list list available databases, then exit\n" +msgstr " -l, --list ხელმისაწვდომი ბაზების სიის გამოტანა და გასვლა\n" + +#: help.c:89 +msgid "" +" -v, --set=, --variable=NAME=VALUE\n" +" set psql variable NAME to VALUE\n" +" (e.g., -v ON_ERROR_STOP=1)\n" +msgstr "" +" -v, --set=, --variable=სახელი=მნიშვნელობა\n" +" psql -ის მითითებული სახელის მქონე ცვლადისთვის მითითებული მნიშვნელობის მინიჭება\n" +" (მაგ:, -v ON_ERROR_STOP=1)\n" + +#: help.c:92 +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n" + +#: help.c:93 +msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" +msgstr " -X, --no-psqlrc გაშვებისას წასაკითხი ფაილის (~/.psqlrc) წაკითხვის შეცდომა\n" + +#: help.c:94 +msgid "" +" -1 (\"one\"), --single-transaction\n" +" execute as a single transaction (if non-interactive)\n" +msgstr "" +" -1 (\"one\"), --single-transaction\n" +" როგორც ერთი ტრანზაქციის, ისე გაშვება (თუ არაინტერაქტიურია)\n" + +#: help.c:96 +msgid " -?, --help[=options] show this help, then exit\n" +msgstr " -?, --help[=პარამეტრები] ამ დახმარების ჩვენება და გასვლა\n" + +#: help.c:97 +msgid " --help=commands list backslash commands, then exit\n" +msgstr " --help=commands \"\\\"-ით დაწყებული ბრძანებების ჩვენება და გასვლა\n" + +#: help.c:98 +msgid " --help=variables list special variables, then exit\n" +msgstr " --help=variables განსაკუთრებული ცვლადების სიის გამოტანა და გასვლა\n" + +#: help.c:100 +msgid "" +"\n" +"Input and output options:\n" +msgstr "" +"\n" +"შეტანისა და გამოტანის პარამეტრები:\n" + +#: help.c:101 +msgid " -a, --echo-all echo all input from script\n" +msgstr " -a, --echo-all სკრიპტიდან წაკითხულის ეკრანზე ჩვენება\n" + +#: help.c:102 +msgid " -b, --echo-errors echo failed commands\n" +msgstr " -b, --echo-errors შეცდომის გამომტანი ბრძანებების ჩვენება\n" + +#: help.c:103 +msgid " -e, --echo-queries echo commands sent to server\n" +msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n" + +#: help.c:104 +msgid " -E, --echo-hidden display queries that internal commands generate\n" +msgstr " -E, --echo-hidden შიდა ბრძანებების მიერ გენერირებული მოთხოვნების გამოტანა\n" + +#: help.c:105 +msgid " -L, --log-file=FILENAME send session log to file\n" +msgstr " -L, --log-file=FILENAME სესიის ჟურნალის ფაილში ჩაწერა\n" + +#: help.c:106 +msgid " -n, --no-readline disable enhanced command line editing (readline)\n" +msgstr " -n, --no-readline ბრძანების სტრიქონის დამატებითი კონტროლის (readline) გამორთვა\n" + +#: help.c:107 +msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" +msgstr " -o, --output=FILENAME მოთხოვნის შედეგების ფაილში ჩაწერა (ან |ფაიფში)\n" + +#: help.c:108 +msgid " -q, --quiet run quietly (no messages, only query output)\n" +msgstr " -q, --quiet ჩუმად გაშვება (შეტყობინებების გარეშე, მხოლოდ მოთხოვნის შედეგები)\n" + +#: help.c:109 +msgid " -s, --single-step single-step mode (confirm each query)\n" +msgstr " -s, --single-step ერთნაბიჯიანი რეჟიმი (თითოეული მოთხოვნის დადასტურება)\n" + +#: help.c:110 +msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" +msgstr " -S, --single-line ერთხაზიანი რეჟიმი (ხაზის დასრულება SQL-ის ბრძანებასაც ასრულებს)\n" + +#: help.c:112 +msgid "" +"\n" +"Output format options:\n" +msgstr "" +"\n" +"გამოტანის ფორმატის მორგება:\n" + +#: help.c:113 +msgid " -A, --no-align unaligned table output mode\n" +msgstr " -A, --no-align ცხრილის დაულაგებლად გამოტანის რეჟიმი\n" + +#: help.c:114 +msgid " --csv CSV (Comma-Separated Values) table output mode\n" +msgstr " --csv CSV (მძიმით გამოყოფილი მნიშვნელობები) ცხრილის გამოტანის რეჟიმი\n" + +#: help.c:115 +#, c-format +msgid "" +" -F, --field-separator=STRING\n" +" field separator for unaligned output (default: \"%s\")\n" +msgstr "" +" -F, --field-separator=სტრიქონი\n" +" ველების გამყოფ სიმბოლო დაულაგებელი გამოტანისთვის (ნაგულისხმები: \"%s\")\n" + +#: help.c:118 +msgid " -H, --html HTML table output mode\n" +msgstr " -H, --html HTML ცხრილის გამოტანის რეჟიმი\n" + +#: help.c:119 +msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" +msgstr " -P, --pset=ცვლ[=არგ] ცვლ გამოტანის პარამეტრის არგ-ზე დაყენება (იხ, \\pset ბრძანება)\n" + +#: help.c:120 +msgid "" +" -R, --record-separator=STRING\n" +" record separator for unaligned output (default: newline)\n" +msgstr "" +" -R, --record-separator=სტრიქონი\n" +" ჩანაწერების გამყოფი დაულაგებელი გამოტანისთვის (ნაგულისხმები: ახალი ხაზი)\n" + +#: help.c:122 +msgid " -t, --tuples-only print rows only\n" +msgstr " -t, --tuples-only მხოლოდ მწკრივების გამოტანა\n" + +#: help.c:123 +msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" +msgstr " -T, --table-attr=ტექსტი HTML ცხრილის ჭდის ატრიბუტების დაყენება (მაგ: სიგრძე, საზღვარი)\n" + +#: help.c:124 +msgid " -x, --expanded turn on expanded table output\n" +msgstr " -x, --expanded ცხრილის გაფართოებული გამოტანის ჩართვა\n" + +#: help.c:125 +msgid "" +" -z, --field-separator-zero\n" +" set field separator for unaligned output to zero byte\n" +msgstr "" +" -z, --field-separator-zero\n" +" დაულაგებელი გამოტანის ველების გამყოფად ნულოვანი ბაიტის დაყენება\n" + +#: help.c:127 +msgid "" +" -0, --record-separator-zero\n" +" set record separator for unaligned output to zero byte\n" +msgstr "" +" -0, --record-separator-zero\n" +" დაულაგებელი გამოტანის ჩანაწერების გამყოფის ნულოვან ბაიტზე დაყენება\n" + +#: help.c:130 +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"შეერთების პარამეტრები:\n" + +#: help.c:133 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +msgstr " -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის საქაღალდე (ნაგულისხმები: \"%s\")\n" + +#: help.c:134 +msgid "local socket" +msgstr "ლოკალური სოკეტი" + +#: help.c:137 +#, c-format +msgid " -p, --port=PORT database server port (default: \"%s\")\n" +msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი (ნაგულისხმები: \"%s\")\n" + +#: help.c:140 +#, c-format +msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" +msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი (ნაგულისხმები: \"%s\")\n" + +#: help.c:142 +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n" + +#: help.c:143 +msgid " -W, --password force password prompt (should happen automatically)\n" +msgstr " -W, --password პაროლის ყოველთვის კითხვა (ავტომატურად უნდა ხდებოდეს)\n" + +#: help.c:145 +msgid "" +"\n" +"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" +"commands) from within psql, or consult the psql section in the PostgreSQL\n" +"documentation.\n" +"\n" +msgstr "" +"\n" +"psql-ის შესახებ დამატებითი ინფორმაციის მისაღებად \n" +"აკრიფეთ \"\\?\" (შიდა ბრძანებებისთვის) ან \"\\help\" (SQL ბრძანებებისთვის), \n" +"ან გაეცანით \"psql\" განყოფილებას PostgreSQL-ის დოკუმენტაციაში.\n" +"\n" + +#: help.c:148 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n" + +#: help.c:149 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s-ის საწყისი გვერდია: <%s>\n" + +#: help.c:191 +msgid "General\n" +msgstr "ზოგადი\n" + +#: help.c:192 +msgid " \\copyright show PostgreSQL usage and distribution terms\n" +msgstr " \\copyright აჩვენებს PostgreSQL-ის გამოყენებისა და დისტრიბუციის პირობებს\n" + +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [სვეტები] შეასრულებს მოთხოვნას და შედეგს crosstab-ში აჩვენებს\n" + +#: help.c:194 +msgid " \\errverbose show most recent error message at maximum verbosity\n" +msgstr " \\errverbose ბოლო შეცდომის დეტალების მაქსიმალურად ჩვენება\n" + +#: help.c:195 +msgid "" +" \\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 [(პარამეტრი)] [ფაილი] მოთხოვნის შესრულება (და შედეგის ფაილში ან |ფაიფში გაგზავნა;\n" +" \\g არგუმენტების გარეშე იგივეა, რაც წერტილმძიმე\n" + +#: help.c:197 +msgid " \\gdesc describe result of query, without executing it\n" +msgstr " \\gdesc მოთხოვნის შედეგის აღწერა მისი შესრულების გარეშე\n" + +#: help.c:198 +msgid " \\gexec execute query, then execute each value in its result\n" +msgstr " \\gexec ჯერ მოთხოვნის, მერე კი მისი თითოეული შედეგის შესრულება\n" + +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [პრეფიქსი] მოთხოვნის შესრულება და შედეგის psql-ის ცვლადებში შენახვა\n" + +#: help.c:200 +msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" +msgstr " \\gx [(პარამეტრები)] [ფაილი] როგორც \\g, მაგრამ გამოტანის რეჟიმი უფრო ფართო იქნება\n" + +#: help.c:201 +msgid " \\q quit psql\n" +msgstr " \\q psql-დან გასვლა\n" + +#: help.c:202 +msgid " \\watch [SEC] execute query every SEC seconds\n" +msgstr " \\watch [SEC] მოთხოვნის ყოველ SEC წამში ერთხელ გაშვება\n" + +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 +msgid "Help\n" +msgstr "დახმარება\n" + +#: help.c:207 +msgid " \\? [commands] show help on backslash commands\n" +msgstr " \\? [commands] დახმარება \"\\\"-ით დაწყებული ბრძანებების შესახებ\n" + +#: help.c:208 +msgid " \\? options show help on psql command-line options\n" +msgstr " \\? options დახმარება psql-ის ბრძანების სტრიქონის შესახებ\n" + +#: help.c:209 +msgid " \\? variables show help on special variables\n" +msgstr " \\? variables დახმარების ჩვენება განსაკუთრებული ცვლადების შესახებ\n" + +#: help.c:210 +msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" +msgstr " \\h [სახელი] SQL ბრძანებების დახმარება, * ყველა ბრძანებისთვის\n" + +#: help.c:213 +msgid "Query Buffer\n" +msgstr "მოთხოვნების ბაფერი\n" + +#: help.c:214 +msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" +msgstr " \\e [ფაილი] [ხაზი] მოთხოვნების ბაფერის (ან ფაილის) გარე რედაქტორში გახსნა\n" + +#: help.c:215 +msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" +msgstr " \\ef [ფუნქცსახელი [ხაზი]] ფუნქციის აღწერის გარე რედაქტორში ჩასწორება\n" + +#: help.c:216 +msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" +msgstr " \\ev [ხედისსახელი [ხაზი]] ხედის აღწერის გარე რედაქტორით ჩასწორება\n" + +#: help.c:217 +msgid " \\p show the contents of the query buffer\n" +msgstr " \\p მოთხოვნების ბაფერის შემცველობის ჩვენება\n" + +#: help.c:218 +msgid " \\r reset (clear) the query buffer\n" +msgstr " \\r მოთხოვნების ბაფერის გასუფთავება\n" + +#: help.c:220 +msgid " \\s [FILE] display history or save it to file\n" +msgstr " \\s [ფაილი] ისტორიის ჩვენება ან ფაილში შენახვა\n" + +#: help.c:222 +msgid " \\w FILE write query buffer to file\n" +msgstr " \\w FILE მოთხოვნების ბაფერის ფაილში ჩაწერა\n" + +#: help.c:225 +msgid "Input/Output\n" +msgstr "შეტანა/გამოტანა\n" + +#: help.c:226 +msgid " \\copy ... perform SQL COPY with data stream to the client host\n" +msgstr " \\copy ... SQL COPY -ის შესრულება მონაცემების ნაკადით კლიენტის ჰოსტამდე\n" + +#: help.c:227 +msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" +msgstr " \\echo [-n] [სტრიქონი] სტრიქონის სტანდარტულ გამოტანაზე გაშვება(ხაზის გადატანის გარეშე -n )\n" + +#: help.c:228 +msgid " \\i FILE execute commands from file\n" +msgstr " \\i ბრძანებების ფაილიდან შესრულება\n" + +#: help.c:229 +msgid " \\ir FILE as \\i, but relative to location of current script\n" +msgstr " \\ir ფაილი იგივე, რაც \\i, მაგრამ სკრიპტის მიმდინარე ადგილიდან დამოკიდებულებით\n" + +#: help.c:230 +msgid " \\o [FILE] send all query results to file or |pipe\n" +msgstr " \\o [ფაილი] მოთხოვნის ყველა შედეგის ფაილში ან |ფაიფში გაგზავნა\n" + +#: help.c:231 +msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" +msgstr " \\qecho [-n] [striqoni] სტრიქონის \\o გამოტანის ნაკადში ჩაწერა (-n ახალი ხაზების გარეშე)\n" + +#: help.c:232 +msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" +msgstr " \\warn [-n] [სტრიქონი] სტრიქონის სტანდარტულ შეცდომაზე გადამოტანა (-n გადატანის გარეშე)\n" + +#: help.c:235 +msgid "Conditional\n" +msgstr "პირობითი\n" + +#: help.c:236 +msgid " \\if EXPR begin conditional block\n" +msgstr " \\if EXPR პირობის შემცველი ბლოკის დასაწყისი\n" + +#: help.c:237 +msgid " \\elif EXPR alternative within current conditional block\n" +msgstr " \\elif EXPR ალტერნატიული პირობა მიმდინარე პირობით ბლოკში\n" + +#: help.c:238 +msgid " \\else final alternative within current conditional block\n" +msgstr " \\else პირობის მიმდინარე ბლოკის ალტერნატიული გზა\n" + +#: help.c:239 +msgid " \\endif end conditional block\n" +msgstr " \\endif პირობის შემცველი ბლოკის დასასრული\n" + +#: help.c:242 +msgid "Informational\n" +msgstr "საინფორმაციო\n" + +#: help.c:243 +msgid " (options: S = show system objects, + = additional detail)\n" +msgstr " (პარამეტრები: S = სისტემური ობიექტების ჩვენება, + = დამატებითი დეტალები)\n" + +#: help.c:244 +msgid " \\d[S+] list tables, views, and sequences\n" +msgstr " \\d[S+] ცხრილების, ხედებისა და მიმდევრობების სია\n" + +#: help.c:245 +msgid " \\d[S+] NAME describe table, view, sequence, or index\n" +msgstr " \\d[S+] NAME ცხრილის, ხედის, მიმდევრობის ან ინდექსის აღწერა\n" + +#: help.c:246 +msgid " \\da[S] [PATTERN] list aggregates\n" +msgstr " \\da[S] [PATTERN] აგრეგატების სია\n" + +#: help.c:247 +msgid " \\dA[+] [PATTERN] list access methods\n" +msgstr " \\dA[+] [PATTERN] წვდომის მეთოდების სია\n" + +#: help.c:248 +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ოპერატორის კლასების სია\n" + +#: help.c:249 +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ოპერატორების ოჯახების სია\n" + +#: help.c:250 +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ოპერატორების ოჯახების ოპერატორების სია\n" + +#: help.c:251 +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ოპერატორის ოჯახების მხარდაჭერის ფუნქციების სია\n" + +#: help.c:252 +msgid " \\db[+] [PATTERN] list tablespaces\n" +msgstr " \\db[+] [PATTERN] ცხრილის სივრცეების სია\n" + +#: help.c:253 +msgid " \\dc[S+] [PATTERN] list conversions\n" +msgstr " \\dc[S+] [PATTERN] გადაყვანების სია\n" + +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] კონფიგურაციის პარამეტრების სია\n" + +#: help.c:255 +msgid " \\dC[+] [PATTERN] list casts\n" +msgstr " \\dC[+] [PATTERN] კასტების სია\n" + +#: help.c:256 +msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" +msgstr " \\dd[S] [შაბლონი] ობიექტის აღწერის ჩვენება, რომელიც სხვაგან არსადაა ნაჩვენები\n" + +#: help.c:257 +msgid " \\dD[S+] [PATTERN] list domains\n" +msgstr " \\dD[S+] [PATTERN] დომენების სია\n" + +#: help.c:258 +msgid " \\ddp [PATTERN] list default privileges\n" +msgstr " \\ddp [შაბლონი] ნაგულისხმები პრივილეგიების სია\n" + +#: help.c:259 +msgid " \\dE[S+] [PATTERN] list foreign tables\n" +msgstr " \\dE[S+] [შაბლონი] გარე ცხრილების სია\n" + +#: help.c:260 +msgid " \\des[+] [PATTERN] list foreign servers\n" +msgstr " \\des[+] [შაბლონი] გარე სერვერების სია\n" + +#: help.c:261 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [შაბლონი] გარე ცხრილების სია\n" + +#: help.c:262 +msgid " \\deu[+] [PATTERN] list user mappings\n" +msgstr " \\deu[+] [PATTERN] მომხმარებლების მომხმარებლის სია\n" + +#: help.c:263 +msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" +msgstr " \\dew[+] [შაბლონი] გარე მონაცემების გადამტანების სია\n" + +#: help.c:264 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" ფუნქციების [მხოლოდ agg/normal/procedure/trigger/window] სია\n" + +#: help.c:266 +msgid " \\dF[+] [PATTERN] list text search configurations\n" +msgstr " \\dF[+] [შაბლონი] ტექსტის ძებნის კონფიგურაციების სია\n" + +#: help.c:267 +msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" +msgstr " \\dFd[+] [შაბლონი] ტექსტის ძებნის ლექსიკონების სია\n" + +#: help.c:268 +msgid " \\dFp[+] [PATTERN] list text search parsers\n" +msgstr " \\dFp[+] [PATTERN] ტექსტის ძებნის დამმუშავებლების სია\n" + +#: help.c:269 +msgid " \\dFt[+] [PATTERN] list text search templates\n" +msgstr " \\dFt[+] [შაბლონი] ტექსტის ძებნის შაბლონების სია\n" + +#: help.c:270 +msgid " \\dg[S+] [PATTERN] list roles\n" +msgstr " \\dg[S+] [შაბლონი] როლების სია\n" + +#: help.c:271 +msgid " \\di[S+] [PATTERN] list indexes\n" +msgstr " \\di[S+] [შაბლონი] ინდექსების სია\n" + +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] დიდი ობიექტების სია. იგივე, რაც \\lo_list\n" + +#: help.c:273 +msgid " \\dL[S+] [PATTERN] list procedural languages\n" +msgstr " \\dL[S+] [შაბლონი] პროცედურული ენების სია\n" + +#: help.c:274 +msgid " \\dm[S+] [PATTERN] list materialized views\n" +msgstr " \\dm[S+] [შაბლონი] მატერიალიზებული ხედების სია\n" + +#: help.c:275 +msgid " \\dn[S+] [PATTERN] list schemas\n" +msgstr " \\dn[S+] [შაბლონი] სქემების სია\n" + +#: help.c:276 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" ოპერატორების სია\n" + +#: help.c:278 +msgid " \\dO[S+] [PATTERN] list collations\n" +msgstr " \\dO[S+] [შაბლონი] კოლაციების სია\n" + +#: help.c:279 +msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp [შაბლონი] ცხრილის, ხედის და მიმდევრობის წვდომის უფლებების სია\n" + +#: help.c:280 +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr " \\dP[itn+] [შაბლონი] [მხოლოდ ინდექსი/ცხრილი] დაყოფილი ურთიერთობების სია [n=ჩადგმული]\n" + +#: help.c:281 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] თითოეული ბაზის როლის პარამეტრების სია\n" + +#: help.c:282 +msgid " \\dRp[+] [PATTERN] list replication publications\n" +msgstr " \\dRp[+] [შაბლონი] რეპლიკაციის გამოცემების სია\n" + +#: help.c:283 +msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" +msgstr " \\dRs[+] [შაბლონი] რეპლიკაციის გამოწერების სია\n" + +#: help.c:284 +msgid " \\ds[S+] [PATTERN] list sequences\n" +msgstr " \\ds[S+] [შაბლონი] მიმდევრობების სია\n" + +#: help.c:285 +msgid " \\dt[S+] [PATTERN] list tables\n" +msgstr " \\dt[S+] [შაბლონი] ცხრილების სია\n" + +#: help.c:286 +msgid " \\dT[S+] [PATTERN] list data types\n" +msgstr " \\dT[S+] [შაბლონი] მონაცემის ტიპების სია\n" + +#: help.c:287 +msgid " \\du[S+] [PATTERN] list roles\n" +msgstr " \\du[S+] [შაბლონი] როლების სია\n" + +#: help.c:288 +msgid " \\dv[S+] [PATTERN] list views\n" +msgstr " \\dv[S+] [შაბლონი] ხედების სია\n" + +#: help.c:289 +msgid " \\dx[+] [PATTERN] list extensions\n" +msgstr " \\dx[+] [შაბლონი] გაფართოებების სია\n" + +#: help.c:290 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [შაბლონი] გაფართოებული სტატისტიკის სია\n" + +#: help.c:291 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [შაბლონი] მოვლენის ტრიგერების სია\n" + +#: help.c:292 +msgid " \\l[+] [PATTERN] list databases\n" +msgstr " \\l[+] [შაბლონი] მონაცემთა ბაზების სია\n" + +#: help.c:293 +msgid " \\sf[+] FUNCNAME show a function's definition\n" +msgstr " \\sf[+] FUNCNAME ფუნქციის აღწერის ჩვენება\n" + +#: help.c:294 +msgid " \\sv[+] VIEWNAME show a view's definition\n" +msgstr " \\sv[+] ხედისსახელი ხედის აღწერის ჩვენება\n" + +#: help.c:295 +msgid " \\z [PATTERN] same as \\dp\n" +msgstr " \\z [შაბლონი] იგივე, რაც \\dp\n" + +#: help.c:298 +msgid "Large Objects\n" +msgstr "დიდი ობიექტები\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE დიდი ობიექტის ფაილში ჩაწერა\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import ფაილი [კომენტარი]\n" +" დიდი ობიექტის ფაილიდან წაკითხვა\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] დიდი ობიექტების სია\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID დიდი ობიექტის წაშლა\n" + +#: help.c:306 +msgid "Formatting\n" +msgstr "ფორმატირება\n" + +#: help.c:307 +msgid " \\a toggle between unaligned and aligned output mode\n" +msgstr " \\a სწორებულ და გაუსწორებელ რეჟიმებს შორის გადართვა\n" + +#: help.c:308 +msgid " \\C [STRING] set table title, or unset if none\n" +msgstr " \\C [სტრიქონი] ცხრილის სათაურის დაყენება. ან წაშლა, თუ მითითებული არაა\n" + +#: help.c:309 +msgid " \\f [STRING] show or set field separator for unaligned query output\n" +msgstr " \\f [სტრიქონი] მოთხოვნის შედეგის დაულაგებელი გამოტანის ველების გამყოფის დაყენება ან ჩვენება\n" + +#: help.c:310 +#, c-format +msgid " \\H toggle HTML output mode (currently %s)\n" +msgstr " \\H HTML გამოტანის რეჟიმის გადართვა (მიმდინარე %s)\n" + +#: help.c:312 +msgid "" +" \\pset [NAME [VALUE]] set table output option\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" +msgstr "" +" \\pset [სახელი [მნიშვნელობა]] ცხრილის გამოტანის პარამეტრის დაყენება\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" + +#: help.c:319 +#, c-format +msgid " \\t [on|off] show only rows (currently %s)\n" +msgstr " \\t [on|off] მხოლოდ მწკრივების ჩვენება(ამჟამად %s)\n" + +#: help.c:321 +msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" +msgstr " \\T [STRING] HTML-ის
ჭდის ატრიბუტების დაყენება. ან გასუფთავება, თუ მითითებული არაფერია\n" + +#: help.c:322 +#, c-format +msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" +msgstr " \\x [on|off|auto] გაფართოებული გამოტანის გადართვა (ამჟამად %s)\n" + +#: help.c:323 +msgid "auto" +msgstr "ავტომატური" + +#: help.c:326 +msgid "Connection\n" +msgstr "შეერთება\n" + +#: help.c:328 +#, c-format +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" connect to new database (currently \"%s\")\n" +msgstr "" +" \\c[onnect] {[ბაზისსახელი|- მომხმარებელი|- ჰოსტი|- პორტ|-] | conninfo}\n" +" ახალ ბაზასთან მიერთება (მიმდინარე \"%s\")\n" + +#: help.c:332 +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" connect to new database (currently no connection)\n" +msgstr "" +" \\c[onnect] {[ბაზისსახელი|- მომხმარებელი|- ჰოსტი|- პორტ|-] | conninfo}\n" +" ახალ ბაზასთან მიერთება (მიმდინარე შეერთება არ არსებობს)\n" + +#: help.c:334 +msgid " \\conninfo display information about current connection\n" +msgstr " \\conninfo მიმდინარე შეერთების შესახებ ინფორმაციის გამოტანა\n" + +#: help.c:335 +msgid " \\encoding [ENCODING] show or set client encoding\n" +msgstr " \\encoding [კოდირება] კლიენტის კოდირების ჩვენება ან დაყენება\n" + +#: help.c:336 +msgid " \\password [USERNAME] securely change the password for a user\n" +msgstr " \\password [მომხმარებელი] მომხმარებლის პაროლის უსაფრთხოდ შეცვლა\n" + +#: help.c:339 +msgid "Operating System\n" +msgstr "ოპერაციული სისტემა\n" + +#: help.c:340 +msgid " \\cd [DIR] change the current working directory\n" +msgstr " \\cd [საქ] მიმდინარე საქაღალდის შეცვლა\n" + +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR გარემოს ცვლადის გამოთხოვა\n" + +#: help.c:342 +msgid " \\setenv NAME [VALUE] set or unset environment variable\n" +msgstr " \\setenv სახელი [მნიშვნელობა] გარემოს ცვლადის დაყენება ან მოხსნა\n" + +#: help.c:343 +#, c-format +msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" +msgstr " \\timing [on|off] ბრძანებების ტაიმერის გადართვა (ამჟამად %s)\n" + +#: help.c:345 +msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" +msgstr " \\! [ბრძანება] გარსის ბრძანების შესრულება ან ინტერაქტიური გარსის გაშვება\n" + +#: help.c:348 +msgid "Variables\n" +msgstr "ცვლადები\n" + +#: help.c:349 +msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" +msgstr " \\prompt [ტექსტი] სახელი მომხმარებლისთვის შიდა ცვლადის დაყენების შეთავაზება\n" + +#: help.c:350 +msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" +msgstr " \\set [სახელი [მნიშვნელობა]] დააყენებს შიდა ცვლადს, ან, თუ პარამეტრები მითითებული არაა, მათ სიას გამოიტანს\n" + +#: help.c:351 +msgid " \\unset NAME unset (delete) internal variable\n" +msgstr " \\unset სახელი შიდა ცვლადის მოხსნა (წაშლა)\n" + +#: help.c:390 +msgid "" +"List of specially treated variables\n" +"\n" +msgstr "" +"განსაკუთრებულად მოსაპყრობი ცვლადების სია\n" +"\n" + +#: help.c:392 +msgid "psql variables:\n" +msgstr "psql-ის ცვლადები:\n" + +#: help.c:394 +msgid "" +" psql --set=NAME=VALUE\n" +" or \\set NAME VALUE inside psql\n" +"\n" +msgstr "" +" psql --set=სახელი=მნიშვნელობა\n" +" ან \\set სახელი მნიშვნელობა psql-ის შიგნით\n" +"\n" + +#: help.c:396 +msgid "" +" AUTOCOMMIT\n" +" if set, successful SQL commands are automatically committed\n" +msgstr "" +" AUTOCOMMIT\n" +" iთუ დაყენებულია, წარმატებული SQL ბრძანებები ავტომატურად იქნება გადაცემული\n" + +#: help.c:398 +msgid "" +" COMP_KEYWORD_CASE\n" +" determines the case used to complete SQL key words\n" +" [lower, upper, preserve-lower, preserve-upper]\n" +msgstr "" +" COMP_KEYWORD_CASE\n" +" განსაზღვრავს სიმბოლოების ზომას SQL-ის საკვანძო სიტყვების დასრულებისას\n" +" [პატარა (lower), upper (დიდი), პატარის_შენარჩუნება (preserve-lower), დიდის_შენარჩუნება (preserve-upper)]\n" + +#: help.c:401 +msgid "" +" DBNAME\n" +" the currently connected database name\n" +msgstr "" +" DBNAME\n" +" ბაზის სახელი, რომელთანაც ამჟამად მიერთებული ბრძანდებით\n" + +#: help.c:403 +msgid "" +" ECHO\n" +" controls what input is written to standard output\n" +" [all, errors, none, queries]\n" +msgstr "" +" ECHO\n" +" აკონტროლებს, შეყვანილიდან რა გამოჩნდება სტანდარტულ გამოტანაზე\n" +" [all(ყველაფერი), errors(შეცდომები), none(არაფერი), queries(მოთხოვნები)]\n" + +#: help.c:406 +msgid "" +" ECHO_HIDDEN\n" +" if set, display internal queries executed by backslash commands;\n" +" if set to \"noexec\", just show them without execution\n" +msgstr "" +" ECHO_HIDDEN\n" +" თუ დაყენებულია, \\-ით დაწყებული შიდა მოთხოვნები ნაჩვენები იქნება;\n" +" თუ მნიშვნელობაა 'noexe', შიდა ბრძანებები ნაჩვენები იქნება, მაგრამ შესრულებული არა\n" + +#: help.c:409 +msgid "" +" ENCODING\n" +" current client character set encoding\n" +msgstr "" +" ENCODING\n" +" მიმდინარე კლიენტის სიმბოლოების კოდირება\n" + +#: help.c:411 +msgid "" +" ERROR\n" +" true if last query failed, else false\n" +msgstr "" +" ERROR\n" +" 1, თუ ბოლო მოთხოვნა ავარიული იყო. არადა 0\n" + +#: help.c:413 +msgid "" +" FETCH_COUNT\n" +" the number of result rows to fetch and display at a time (0 = unlimited)\n" +msgstr "" +" FETCH_COUNT\n" +" შედეგის გამოსათხოვი მწკრივების რაოდენობა ერთი ჩვენებისთვის (0=უსასრულო)\n" + +#: help.c:415 +msgid "" +" HIDE_TABLEAM\n" +" if set, table access methods are not displayed\n" +msgstr "" +" HIDE_TABLEAM\n" +" თუ დაყენებულა, ცხრილის წვდომის მეთოდები ნაჩვენები არ იქნება\n" + +#: help.c:417 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" თუ ჩართულია, შეკუმშვის მეთოდები ნაჩვენები არ იქნება\n" + +#: help.c:419 +msgid "" +" HISTCONTROL\n" +" controls command history [ignorespace, ignoredups, ignoreboth]\n" +msgstr "" +" HISTCONTROL\n" +" ბრძანებების ისტორიის კონროლი[ignorespace, ignoredups, ignoreboth]\n" + +#: help.c:421 +msgid "" +" HISTFILE\n" +" file name used to store the command history\n" +msgstr "" +" HISTFILE\n" +" ბრძანებების ისტორიის შესანახი ფაილის სახელი\n" + +#: help.c:423 +msgid "" +" HISTSIZE\n" +" maximum number of commands to store in the command history\n" +msgstr "" +" HISTSIZE\n" +" ისტორიაში შენახული ბრძანებების მაქსიმალური რაოდენობა\n" + +#: help.c:425 +msgid "" +" HOST\n" +" the currently connected database server host\n" +msgstr "" +" HOST\n" +" ამჟამად მიერთებული მონაცემთა ბაზის სერვერის ჰოსტი\n" + +#: help.c:427 +msgid "" +" IGNOREEOF\n" +" number of EOFs needed to terminate an interactive session\n" +msgstr "" +" IGNOREEOF\n" +" ინტერაქტიური სესიის დასამთავრებლად საჭირო EOF-ების რაოდენობა\n" + +#: help.c:429 +msgid "" +" LASTOID\n" +" value of the last affected OID\n" +msgstr "" +" LASTOID\n" +" უკანასკნელად შეცვლილი OID-ის მნიშვნელობა\n" + +#: help.c:431 +msgid "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" message and SQLSTATE of last error, or empty string and \"00000\" if none\n" +msgstr "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" უკანასკნელი შეცდომის შეტყობინება და SQLSTATE. თუ შეცდომა არ არსებობს, დაბრუნდება ცარიელი სტრიქონი და \"00000\"\n" + +#: help.c:434 +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:436 +msgid "" +" ON_ERROR_STOP\n" +" stop batch execution after error\n" +msgstr "" +" ON_ERROR_STOP\n" +" ბრძანებების პაკეტის შესრულების შეწყვეტა პირველივე შეცდომის შემდეგ\n" + +#: help.c:438 +msgid "" +" PORT\n" +" server port of the current connection\n" +msgstr "" +" პორტი\n" +" სერვერის პორტი მიმდინარე შეერთებისთვის\n" + +#: help.c:440 +msgid "" +" PROMPT1\n" +" specifies the standard psql prompt\n" +msgstr "" +" PROMPT1\n" +" psql-ის ბრძანების სტრიქონის აღწერა\n" + +#: help.c:442 +msgid "" +" PROMPT2\n" +" specifies the prompt used when a statement continues from a previous line\n" +msgstr "" +" PROMPT2\n" +" ბრძანების სტრიქონის მითითება, როცა ბრძანება წინა ხაზიდან გრძელდება\n" + +#: help.c:444 +msgid "" +" PROMPT3\n" +" specifies the prompt used during COPY ... FROM STDIN\n" +msgstr "" +" PROMPT3\n" +" specifies the prompt used during COPY ... FROM STDIN\n" + +#: help.c:446 +msgid "" +" QUIET\n" +" run quietly (same as -q option)\n" +msgstr "" +" QUIET\n" +" ჩუმი ოპერაციები(იგივე, რაც პარამეტრი -q)\n" + +#: help.c:448 +msgid "" +" ROW_COUNT\n" +" number of rows returned or affected by last query, or 0\n" +msgstr "" +" ROW_COUNT\n" +" ბოლო მოთხოვნის მიერ დაბრუნებული ან შეცვლილი მწკრივები. ან 0\n" + +#: help.c:450 +msgid "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" server's version (in short string or numeric format)\n" +msgstr "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" სერვერის ვერსია(მოკლე სტრიქონის ან რიცხვით ფორმატში)\n" + +#: help.c:453 +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:455 +msgid "" +" SHOW_CONTEXT\n" +" controls display of message context fields [never, errors, always]\n" +msgstr "" +" SHOW_CONTEXT\n" +" შეტყობინების კონტექსტის ველების ჩვენების კონტროლი[never, errors, always]\n" + +#: help.c:457 +msgid "" +" SINGLELINE\n" +" if set, end of line terminates SQL commands (same as -S option)\n" +msgstr "" +" SINGLELINE\n" +" iთუ დაყენებულია, ხაზის დაბოლოება SQL-ის ბრძანებასაც დაასრულებს (იგივე, რაც -S პარამეტრი)\n" + +#: help.c:459 +msgid "" +" SINGLESTEP\n" +" single-step mode (same as -s option)\n" +msgstr "" +" SINGLESTEP\n" +" ერთნაბიჯიანი რეჟიმი. (იგივე, რაც -s პარამეტრი)\n" + +#: help.c:461 +msgid "" +" SQLSTATE\n" +" SQLSTATE of last query, or \"00000\" if no error\n" +msgstr "" +" SQLSTATE\n" +" უკანასკნელი მოთხოვნის SQLSTATE. \"00000\", თუ შეცდომა არ მომხდარა\n" + +#: help.c:463 +msgid "" +" USER\n" +" the currently connected database user\n" +msgstr "" +" USER\n" +" ბაზასთან მიერთებული მომხმარებლის სახელი\n" + +#: help.c:465 +msgid "" +" VERBOSITY\n" +" controls verbosity of error reports [default, verbose, terse, sqlstate]\n" +msgstr "" +" VERBOSITY\n" +" შეცდომის ანგარშების დეტალურობის კონტროლი [default, verbose, terse, sqlstate]\n" + +#: help.c:467 +msgid "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" psql's version (in verbose string, short string, or numeric format)\n" +msgstr "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" psql-ის ვერსია (სრული ვერსია, მოკლე ვერსია თუ რიცხვითი ფორმატი)\n" + +#: help.c:472 +msgid "" +"\n" +"Display settings:\n" +msgstr "" +"\n" +"ჩვენების პარამეტრები:\n" + +#: help.c:474 +msgid "" +" psql --pset=NAME[=VALUE]\n" +" or \\pset NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" psql --pset=სახ[=მნიშვნ]\n" +" ან \\pset სახ [მიშნვნ] psql-ში\n" +"\n" + +#: help.c:476 +msgid "" +" border\n" +" border style (number)\n" +msgstr "" +" border\n" +" საზღვრის სტილი (რიცხვი)\n" + +#: help.c:478 +msgid "" +" columns\n" +" target width for the wrapped format\n" +msgstr "" +" columns\n" +" სამიზნის სიგანე გადატანილი ფორმატისთვის\n" + +#: help.c:480 +msgid "" +" expanded (or x)\n" +" expanded output [on, off, auto]\n" +msgstr "" +" expanded (or x)\n" +" გაფართოებული გამოტანა [on, off, auto]\n" + +#: help.c:482 +#, c-format +msgid "" +" fieldsep\n" +" field separator for unaligned output (default \"%s\")\n" +msgstr "" +" fieldsep\n" +" ველების გამყოფი დაულაგების გამოტანისათვის (ნაგულისხმები \"%s\")\n" + +#: help.c:485 +msgid "" +" fieldsep_zero\n" +" set field separator for unaligned output to a zero byte\n" +msgstr "" +" fieldsep_zero\n" +" დაულაგებელი გამოტანის ველების გამყოფის ნულოვან ბაიტზე დაყენება\n" + +#: help.c:487 +msgid "" +" footer\n" +" enable or disable display of the table footer [on, off]\n" +msgstr "" +" footer\n" +" ცხრილის მინაწერების ჩვენების ჩაართ/გამორთ[on, off]\n" + +#: help.c:489 +msgid "" +" format\n" +" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" +msgstr "" +" format\n" +" გამოტანის ფორმატის დაყენება [unaligned, aligned, wrapped, html, asciidoc, ...]\n" + +#: help.c:491 +msgid "" +" linestyle\n" +" set the border line drawing style [ascii, old-ascii, unicode]\n" +msgstr "" +" linestyle\n" +" საზღვრის ხაზის ხატვის სტილი [ascii, old-ascii, unicode]\n" + +#: help.c:493 +msgid "" +" null\n" +" set the string to be printed in place of a null value\n" +msgstr "" +" null\n" +" ნულოვანი ბაიტის მიერ ნაჩვენები სიმბოლო\n" + +#: help.c:495 +msgid "" +" numericlocale\n" +" enable display of a locale-specific character to separate groups of digits\n" +msgstr "" +" numericlocale\n" +" ციფრის ჯგუფების გასაყოფად ენის სპეციფიკური სიმბოლოს გამოყენება\n" + +#: help.c:497 +msgid "" +" pager\n" +" control when an external pager is used [yes, no, always]\n" +msgstr "" +" pager\n" +" გვერდების გარე გადამრთველის გამოყენება[yes, no, always]\n" + +#: help.c:499 +msgid "" +" recordsep\n" +" record (line) separator for unaligned output\n" +msgstr "" +" recordsep\n" +" დაულაგებელი გამოტანის ჩანაწერების(ხაზების) გამყოფი\n" + +#: help.c:501 +msgid "" +" recordsep_zero\n" +" set record separator for unaligned output to a zero byte\n" +msgstr "" +" recordsep_zero\n" +" დაულაგებელი გამოტანის ველების გამყოფის ნულოვან ბაიტზე დაყენება\n" + +#: help.c:503 +msgid "" +" tableattr (or T)\n" +" specify attributes for table tag in html format, or proportional\n" +" column widths for left-aligned data types in latex-longtable format\n" +msgstr "" +" tableattr (or T)\n" +" მიუთითებს HTML ფორმატის table ჭდის ატრიბუტებს ან სვეტების პოპორციულ სიგანეს\n" +" მარცხნივ სწორებული მონაცემების ტიპებისთვის latex-longtable ფორმატში\n" + +#: help.c:506 +msgid "" +" title\n" +" set the table title for subsequently printed tables\n" +msgstr "" +" title\n" +" ცხრილის სათაურის დაყენება შემდგომ დაბეჭდილი ცხრილებისთვის\n" + +#: help.c:508 +msgid "" +" tuples_only\n" +" if set, only actual table data is shown\n" +msgstr "" +" tuples_only\n" +" თუ დაყენებულია, ნაჩვენები იქნება მხოლოდ მიმდინარე მონაცემები\n" + +#: help.c:510 +msgid "" +" unicode_border_linestyle\n" +" unicode_column_linestyle\n" +" unicode_header_linestyle\n" +" set the style of Unicode line drawing [single, double]\n" +msgstr "" +" unicode_border_linestyle\n" +" unicode_column_linestyle\n" +" unicode_header_linestyle\n" +" უნიკოდის ხაზის დახატვის სტილი [single, double]\n" + +#: help.c:515 +msgid "" +"\n" +"Environment variables:\n" +msgstr "" +"\n" +"გარემოს ცვლადები:\n" + +#: help.c:519 +msgid "" +" NAME=VALUE [NAME=VALUE] psql ...\n" +" or \\setenv NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" სახელი=მნიშვნელობა [სახელი=მნიშვნელობა ] psql ...\n" +" ან \\setenv სახელი[მნიშვნელობა ] psql-ის სიგნით\n" +"\n" + +#: help.c:521 +msgid "" +" set NAME=VALUE\n" +" psql ...\n" +" or \\setenv NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" set სახელი=მნიშვნელობა\n" +" psql ...\n" +" ან \\setenv სახელი [მნიშვნელობა] psql-ში\n" +"\n" + +#: help.c:524 +msgid "" +" COLUMNS\n" +" number of columns for wrapped format\n" +msgstr "" +" COLUMNS\n" +" გადასატანი ფორმატის სვეტების რაოდენობა\n" + +#: help.c:526 +msgid "" +" PGAPPNAME\n" +" same as the application_name connection parameter\n" +msgstr "" +" PGAPPNAME\n" +" იგივე, რაც შეერთების პარამეტრი აპლიკაციის_სახელი\n" + +#: help.c:528 +msgid "" +" PGDATABASE\n" +" same as the dbname connection parameter\n" +msgstr "" +" PGDATABASE\n" +" იგივე, რაც შეერთების dbname პარამეტრი\n" + +#: help.c:530 +msgid "" +" PGHOST\n" +" same as the host connection parameter\n" +msgstr "" +" PGHOST\n" +" იგივე, რაც ჰოსტი შეერთების პარამეტრებში\n" + +#: help.c:532 +msgid "" +" PGPASSFILE\n" +" password file name\n" +msgstr "" +" PGPASSFILE\n" +" პაროლების ფაილის სახელი\n" + +#: help.c:534 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" შეერთების პაროლი (რეკომენდებული არაა)\n" + +#: help.c:536 +msgid "" +" PGPORT\n" +" same as the port connection parameter\n" +msgstr "" +" PGPORT\n" +" იგივე, რაც პორტი შეერთების პარამეტრებში\n" + +#: help.c:538 +msgid "" +" PGUSER\n" +" same as the user connection parameter\n" +msgstr "" +" PGUSER\n" +" იგივე, რაც მომხმარებლის სახელი შეერთების პარამეტრებში\n" + +#: help.c:540 +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:542 +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:544 +msgid "" +" PSQL_HISTORY\n" +" alternative location for the command history file\n" +msgstr "" +" PSQL_HISTORY\n" +" ბრძანებების ისტორიის ფაილის ალტერნატიული მდებარეობა\n" + +#: help.c:546 +msgid "" +" PSQL_PAGER, PAGER\n" +" name of external pager program\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" გვერდების გადამრთველი გარე პროგრამის სახელი\n" + +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" \\watch-ისთვის გამოყენებული გვერდების გადამრთველი გარე პროგრამა\n" + +#: help.c:552 +msgid "" +" PSQLRC\n" +" alternative location for the user's .psqlrc file\n" +msgstr "" +" PSQLRC\n" +" მომხმარებლის .psqlrc ფაილის ალტერნატიული მდებარეობა\n" + +#: help.c:554 +msgid "" +" SHELL\n" +" shell used by the \\! command\n" +msgstr "" +" SHELL\n" +" \\! ბრძანების მიერ გამოყენებული გარსი\n" + +#: help.c:556 +msgid "" +" TMPDIR\n" +" directory for temporary files\n" +msgstr "" +" TMPDIR\n" +" დროებითი ფაილების საქაღალდე\n" + +#: help.c:616 +msgid "Available help:\n" +msgstr "ხელმისაწვდომი დახმარება:\n" + +#: help.c:711 +#, c-format +msgid "" +"Command: %s\n" +"Description: %s\n" +"Syntax:\n" +"%s\n" +"\n" +"URL: %s\n" +"\n" +msgstr "" +"ბრძანება: %s\n" +"აღწერა: %s\n" +"სინტაქსი:\n" +"%s\n" +"\n" +"URL: %s\n" +"\n" + +#: help.c:734 +#, c-format +msgid "" +"No help available for \"%s\".\n" +"Try \\h with no arguments to see available help.\n" +msgstr "" +"\"%s\"-ისთვის დახმარება მიუწვდომელია.\n" +"ხელმისაწვდომი დახმარების სანახავად სცადეთ \\h .\n" + +#: input.c:217 +#, c-format +msgid "could not read from input file: %m" +msgstr "შემოსატანი ფაილის წაკითხვის შეცდომა: %m" + +#: input.c:478 input.c:516 +#, c-format +msgid "could not save history to file \"%s\": %m" +msgstr "ისტორიის ფაილის (\"%s\") შენახვის შეცდომა: %m" + +#: input.c:535 +#, c-format +msgid "history is not supported by this installation" +msgstr "ამ აგებას ისტორიის მხარდაჭერა არ გააჩნია" + +#: large_obj.c:65 +#, c-format +msgid "%s: not connected to a database" +msgstr "%s: ბაზასთან მიერთებული არ ბრძანდებით" + +#: large_obj.c:84 +#, c-format +msgid "%s: current transaction is aborted" +msgstr "%s: მიმდინარე ტრანზაქცია ავარიულად დასრულდა" + +#: large_obj.c:87 +#, c-format +msgid "%s: unknown transaction status" +msgstr "%s: ტრანზაქციის უცნობი სტატუსი" + +#: mainloop.c:133 +#, c-format +msgid "\\if: escaped" +msgstr "\\if: -დან გამოსვლა" + +#: mainloop.c:192 +#, c-format +msgid "Use \"\\q\" to leave %s.\n" +msgstr "%s-დან გასასვლელად გამოიყენეთ \"\\q\".\n" + +#: 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" +msgstr "" +"შეყვანილია PostgreSQL-ის საკუთარი ფორმატის გამოტვირთვა\n" +"გამოტვირთული ბაზის აღსადგენად CLI-ის ბრძანება pg_restore გამოიყენეთ .\n" + +#: mainloop.c:295 +msgid "Use \\? for help or press control-C to clear the input buffer." +msgstr "დახმარებისთვის გამოიყენეთ \\? ან დააწექით Control-C-ს შეყვანის ბაფერის გასასუფთავებლად." + +#: mainloop.c:297 +msgid "Use \\? for help." +msgstr "დახმარებისთვის გამოიყენეთ \\?." + +#: mainloop.c:301 +msgid "You are using psql, the command-line interface to PostgreSQL." +msgstr "იყენებთ psql-ს, PostgreSQL-ის ბრძანების სტრიქონის ინტერფეისს." + +#: mainloop.c:302 +#, c-format +msgid "" +"Type: \\copyright for distribution terms\n" +" \\h for help with SQL commands\n" +" \\? for help with psql commands\n" +" \\g or terminate with semicolon to execute query\n" +" \\q to quit\n" +msgstr "" +"აკრიფეთ: \\copyright გავრცელების წესებისთვის\n" +" \\h SQL-ის ბრძანებების შესახებ დახმარებისთვის\n" +" \\? psql-ის ბრძანებების შესახებ დახმარებისთვის\n" +" \\g ან დაასრულეთ წერტილმძიმით, მოთხოვნის შესასრულებლად\n" +" \\q გასვლა\n" + +#: mainloop.c:326 +msgid "Use \\q to quit." +msgstr "გასასვლელად გამოიყენეთ \\q." + +#: mainloop.c:329 mainloop.c:353 +msgid "Use control-D to quit." +msgstr "გასასვლელა გამოიყენეთ Control-D." + +#: mainloop.c:331 mainloop.c:355 +msgid "Use control-C to quit." +msgstr "გასასვლელა გამოიყენეთ Control-C." + +#: mainloop.c:459 mainloop.c:618 +#, c-format +msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "მოთხოვნა იგნორირებულია; მიმდინარე \\if ბლოკიდან გამოსასვლელად გამოიყენეთ \\endif ან Ctrl-C" + +#: mainloop.c:636 +#, c-format +msgid "reached EOF without finding closing \\endif(s)" +msgstr "მიღწეულია EOF დამხურავი \\endif-ების პოვნის გარეშე" + +#: psqlscanslash.l:638 +#, c-format +msgid "unterminated quoted string" +msgstr "ბრჭყალებში ჩასმული ციტატის დაუსრულებელი სტრიქონი" + +#: psqlscanslash.l:811 +#, c-format +msgid "%s: out of memory" +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: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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 +msgid "name" +msgstr "სახელი" + +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 +msgid "aggregate_signature" +msgstr "აგრეგატის სახელმოწერა" + +#: 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: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:3011 +msgid "new_owner" +msgstr "ახალი_მფლობელი" + +#: 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:1910 sql_help.c:3340 sql_help.c:4484 +msgid "where aggregate_signature is:" +msgstr "სადაც aggregate_signature არის:" + +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 +msgid "argmode" +msgstr "არგრეჟიმი" + +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +msgid "argname" +msgstr "არგსახელი" + +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +msgid "argtype" +msgstr "არგტიპი" + +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 +msgid "option" +msgstr "მორგება" + +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +msgid "where option can be:" +msgstr "სადაც option შეიძლება იყოს:" + +#: sql_help.c:116 sql_help.c:2209 +msgid "allowconn" +msgstr "შეერთ_ნებართვ" + +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +msgid "connlimit" +msgstr "შეერთ_ლიმიტი" + +#: sql_help.c:118 sql_help.c:2211 +msgid "istemplate" +msgstr "შაბლონია" + +#: 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:4187 +msgid "new_tablespace" +msgstr "ცხრილების_ახალი_სივრცე" + +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 +msgid "configuration_parameter" +msgstr "კონფიგურაციის_პარამეტრი" + +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 +msgid "value" +msgstr "მნიშვნელობა" + +#: sql_help.c:200 +msgid "target_role" +msgstr "სამიზნე_როლი" + +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 +msgid "schema_name" +msgstr "სქემის_სახელი" + +#: sql_help.c:202 +msgid "abbreviated_grant_or_revoke" +msgstr "შეთავაზება_GRANT_ან_REVOKE" + +#: sql_help.c:203 +msgid "where abbreviated_grant_or_revoke is one of:" +msgstr "სადაც abbreviated_grant_or_revoke ერთ-ერთია სიიდან:" + +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 +msgid "role_name" +msgstr "როლის_სახელი" + +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 +msgid "expression" +msgstr "გამსახულება" + +#: sql_help.c:242 +msgid "domain_constraint" +msgstr "დომენის_შეზღუდვა" + +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +msgid "constraint_name" +msgstr "შეზღუდვის_სახელი" + +#: sql_help.c:247 sql_help.c:1315 +msgid "new_constraint_name" +msgstr "ახალი_შეზღუდვის_სახელი" + +#: sql_help.c:320 sql_help.c:1099 +msgid "new_version" +msgstr "ახალი_მნიშვნელობა" + +#: sql_help.c:324 sql_help.c:326 +msgid "member_object" +msgstr "წევრი_ობიექტი" + +#: sql_help.c:327 +msgid "where member_object is:" +msgstr "სადაც member_object არის:" + +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 +msgid "object_name" +msgstr "ობიექტის_სახელი" + +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +msgid "aggregate_name" +msgstr "აგრეგატის სახელი" + +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 +msgid "source_type" +msgstr "წყაროს_ტიპი" + +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 +msgid "target_type" +msgstr "სამიზნის_ტიპი" + +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 +msgid "function_name" +msgstr "ფუნქციის_სახელი" + +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +msgid "operator_name" +msgstr "ოპერატორის_სახელი" + +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 +msgid "left_type" +msgstr "მარჯვენა ტიპი" + +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 +msgid "right_type" +msgstr "სწორი_ტიპი" + +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +msgid "index_method" +msgstr "ინდექსის_მეთოდი" + +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +msgid "procedure_name" +msgstr "პროცედურის სახელი" + +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +msgid "routine_name" +msgstr "ქვეპროგრამის სახელი" + +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 +msgid "type_name" +msgstr "ტიპის სახელი" + +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 +msgid "lang_name" +msgstr "ენის_სახელი" + +#: sql_help.c:372 +msgid "and aggregate_signature is:" +msgstr "და აგრეგატული_ხელმოწერა არის:" + +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +msgid "handler_function" +msgstr "დამმუშავებელი_ფუნქცია" + +#: sql_help.c:396 sql_help.c:2276 +msgid "validator_function" +msgstr "შემმოწმებელი_ფუნქცია" + +#: 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: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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 +msgid "column_name" +msgstr "სვეტის_სახელი" + +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +msgid "new_column_name" +msgstr "ახალი_სვეტის_სახელი" + +#: 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: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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 +msgid "data_type" +msgstr "მონაცემების_ტიპი" + +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +msgid "collation" +msgstr "კოლაცია" + +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +msgid "column_constraint" +msgstr "სვეტის_შეზღუდვა" + +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 +msgid "integer" +msgstr "მთელი რიცხვი" + +#: 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:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +msgid "table_constraint" +msgstr "ცხრილის_შეზღუდვები" + +#: 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:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +msgid "parent_table" +msgstr "მშობელი_ცხრილი" + +#: 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:2261 +msgid "extension_name" +msgstr "გაფართოების სახელი" + +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +msgid "execution_cost" +msgstr "გაშვების_ფასი" + +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +msgid "result_rows" +msgstr "მწკრივები_შედეგში" + +#: sql_help.c:547 sql_help.c:2397 +msgid "support_function" +msgstr "დამხმარე_ფუნქცია" + +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +msgid "role_specification" +msgstr "როლის_შემოწმება" + +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 +msgid "user_name" +msgstr "მომხმარებლის_სახელი" + +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 +msgid "where role_specification can be:" +msgstr "სადაც როლის_სპეციფიკაცია შეიძლება იყოს ერთ-ერთი სიიდან:" + +#: sql_help.c:575 +msgid "group_name" +msgstr "ჯგუფის_სახელი" + +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 +msgid "tablespace_name" +msgstr "ცხრილების_სივრცის_სახელი" + +#: 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: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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 +msgid "storage_parameter" +msgstr "საცავის_პარამეტრი" + +#: sql_help.c:607 +msgid "column_number" +msgstr "სვეტის_ნომერი" + +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +msgid "large_object_oid" +msgstr "დიდი_ობიექტის_oid" + +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +msgid "compression_method" +msgstr "შეკუმშვის_მეთოდი" + +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "წვდომის_ახალი_მეთოდი" + +#: sql_help.c:725 sql_help.c:2523 +msgid "res_proc" +msgstr "შეზღუდვის_პროცედურა" + +#: sql_help.c:726 sql_help.c:2524 +msgid "join_proc" +msgstr "შეერთების_პროცედურა" + +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +msgid "strategy_number" +msgstr "სტრატეგიის_ნომერი" + +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 +msgid "op_type" +msgstr "ოპ_ტიპი" + +#: sql_help.c:782 sql_help.c:2545 +msgid "sort_family_name" +msgstr "დალაგების_ოჯახის_სახელი" + +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +msgid "support_number" +msgstr "დამხმარე_რიცხვი" + +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 +msgid "argument_type" +msgstr "არგუმენტის_ტიპი" + +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 +msgid "table_name" +msgstr "ცხრილის_სახელი" + +#: sql_help.c:823 sql_help.c:2576 +msgid "using_expression" +msgstr "გამოყენების_გამოხატულება" + +#: sql_help.c:824 sql_help.c:2577 +msgid "check_expression" +msgstr "გამოსახულების_შემოწმება" + +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "გამოცემის_ობიექტი" + +#: sql_help.c:903 sql_help.c:2625 +msgid "publication_parameter" +msgstr "გამოცემის_პარამეტრი" + +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "სადაც პუბლიკაციის_ობიექტი ერთერთია სიიდან:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 +msgid "password" +msgstr "პაროლი" + +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 +msgid "timestamp" +msgstr "დროის შტამპი" + +#: 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:3892 +#: sql_help.c:4341 +msgid "database_name" +msgstr "ბაზის_სახელი" + +#: sql_help.c:1073 sql_help.c:2732 +msgid "increment" +msgstr "გაზრდა" + +#: sql_help.c:1074 sql_help.c:2733 +msgid "minvalue" +msgstr "მინ_მნიშვნელობა" + +#: sql_help.c:1075 sql_help.c:2734 +msgid "maxvalue" +msgstr "მაქს_მნიშვნელობა" + +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 +msgid "start" +msgstr "დაწყება" + +#: sql_help.c:1077 sql_help.c:1347 +msgid "restart" +msgstr "გადატვრთვა" + +#: sql_help.c:1078 sql_help.c:2736 +msgid "cache" +msgstr "კეში" + +#: sql_help.c:1123 +msgid "new_target" +msgstr "ახალი_სამიზნე" + +#: sql_help.c:1142 sql_help.c:2789 +msgid "conninfo" +msgstr "შეერთ_ინფო" + +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +msgid "publication_name" +msgstr "გამოცემის_სახელი" + +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "გამოცემის_მორგება" + +#: sql_help.c:1156 +msgid "refresh_option" +msgstr "განახლების_პარამეტრები" + +#: sql_help.c:1161 sql_help.c:2791 +msgid "subscription_parameter" +msgstr "გამოწერის_პარამეტრი" + +#: sql_help.c:1164 +msgid "skip_option" +msgstr "პარამეტრის_გამოტოვება" + +#: sql_help.c:1324 sql_help.c:1327 +msgid "partition_name" +msgstr "დანაყოფის_სახელი" + +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +msgid "partition_bound_spec" +msgstr "დანაყოფის_საზღვრის_მითითება" + +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +msgid "sequence_options" +msgstr "მიმდევრობის_პარამეტრები" + +#: sql_help.c:1346 +msgid "sequence_option" +msgstr "მიმდევრობის_პარამეტრი" + +#: sql_help.c:1360 +msgid "table_constraint_using_index" +msgstr "ცხრილის_შეზღუდვა_ინდექსით" + +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +msgid "rewrite_rule_name" +msgstr "გადაწერის_წესის_სახელი" + +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +msgid "and partition_bound_spec is:" +msgstr "და დანაყოფის_საზღვარის_სპეციფიკაცია არის:" + +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 +msgid "partition_bound_expr" +msgstr "დანაყოფის_საზღვრის_გამოსახულება" + +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 +msgid "numeric_literal" +msgstr "რიცხვითი_მუდმივა" + +#: sql_help.c:1389 +msgid "and column_constraint is:" +msgstr "და სვეტის_შეზღუდვა არის:" + +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 +msgid "default_expr" +msgstr "ნაგულისხმები_გამოსახულება" + +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +msgid "generation_expr" +msgstr "გენერირებული_გამოსახულება" + +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 +msgid "index_parameters" +msgstr "ინდექსის_პარამეტრები" + +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +msgid "reftable" +msgstr "მიბმების_ცხრილი" + +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +msgid "refcolumn" +msgstr "მიბმული_სვეტი" + +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +msgid "referential_action" +msgstr "მიბმის_ქმედებები" + +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +msgid "and table_constraint is:" +msgstr "და table_constraint არის:" + +#: sql_help.c:1409 sql_help.c:2951 +msgid "exclude_element" +msgstr "ელემენტის_ამოღება" + +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 +msgid "operator" +msgstr "ოპერატორი" + +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +msgid "predicate" +msgstr "პრედიკატი" + +#: sql_help.c:1418 +msgid "and table_constraint_using_index is:" +msgstr "და table_constraint_using_index არის:" + +#: sql_help.c:1421 sql_help.c:2967 +msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" +msgstr "ინდექსის_პარამეტრები UNIQUE, PRIMARY KEY და EXCLUDE შეზღუდვებში:" + +#: sql_help.c:1426 sql_help.c:2972 +msgid "exclude_element in an EXCLUDE constraint is:" +msgstr "ელემენტის_ამოღება EXCLUDE შეზღუდვაში წარმოადგენს:" + +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +msgid "opclass" +msgstr "ოპერატ_კლასი" + +#: sql_help.c:1430 sql_help.c:2976 +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:3013 +msgid "tablespace_option" +msgstr "ცხრილების_სივრცის_პარამეტრი" + +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +msgid "token_type" +msgstr "კოდის_ტიპი" + +#: sql_help.c:1473 sql_help.c:1476 +msgid "dictionary_name" +msgstr "ლექსიკონის_სახელი" + +#: sql_help.c:1478 sql_help.c:1482 +msgid "old_dictionary" +msgstr "ძველი_ლექსიკონი" + +#: sql_help.c:1479 sql_help.c:1483 +msgid "new_dictionary" +msgstr "ახალი_ლექსიკონი" + +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 +msgid "attribute_name" +msgstr "ატრიბუტის_სახელი" + +#: sql_help.c:1579 +msgid "new_attribute_name" +msgstr "ახალი_ატრიბუტის_სახელი" + +#: sql_help.c:1583 sql_help.c:1587 +msgid "new_enum_value" +msgstr "ათვლის_ახალი_მნიშვნელობა" + +#: sql_help.c:1584 +msgid "neighbor_enum_value" +msgstr "მეზობლად_ათვლის_მნიშვნელობა" + +#: sql_help.c:1586 +msgid "existing_enum_value" +msgstr "აღრიცხვის_არსებული_მნიშვნელობა" + +#: sql_help.c:1589 +msgid "property" +msgstr "თვისება" + +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 +msgid "server_name" +msgstr "სერვერის_სახელი" + +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +msgid "view_option_name" +msgstr "ხედის_პარამეტრის_სახელი" + +#: sql_help.c:1698 sql_help.c:3262 +msgid "view_option_value" +msgstr "ხედის_პარამეტრის_მნიშვნელობა" + +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 +msgid "table_and_columns" +msgstr "ცხრილი_და სვეტები" + +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 +msgid "where option can be one of:" +msgstr "სადაც option შეიძლება იყოს ერთ-ერთი სიიდან:" + +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 +msgid "boolean" +msgstr "ლოგიკური" + +#: sql_help.c:1724 sql_help.c:4969 +msgid "and table_and_columns is:" +msgstr "და table_and_columns არის:" + +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 +msgid "transaction_mode" +msgstr "ტრანზაქციის_რეჟიმი" + +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 +msgid "where transaction_mode is one of:" +msgstr "სადაც transaction_mode შეიძლება იყოს ერთ-ერთი სიიდან:" + +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 +msgid "argument" +msgstr "არგიმენტი" + +#: sql_help.c:1850 +msgid "relation_name" +msgstr "ურთიერთობის_სახელი" + +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +msgid "domain_name" +msgstr "დომენის_სახელი" + +#: sql_help.c:1877 +msgid "policy_name" +msgstr "წესის_სახელი" + +#: sql_help.c:1890 +msgid "rule_name" +msgstr "წესის_სახელი" + +#: sql_help.c:1909 sql_help.c:4483 +msgid "string_literal" +msgstr "სტრიქონი_მუდმივა" + +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +msgid "transaction_id" +msgstr "ტრანზაქციის_id" + +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +msgid "filename" +msgstr "ფაილის სახელი" + +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 +msgid "command" +msgstr "ბრძანება" + +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 +msgid "condition" +msgstr "მდგომარეობა" + +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 +msgid "query" +msgstr "მოთხოვნა" + +#: sql_help.c:1976 +msgid "format_name" +msgstr "ფორმატის_სახელი" + +#: sql_help.c:1978 +msgid "delimiter_character" +msgstr "გამყოფი_სიმბოლო" + +#: sql_help.c:1979 +msgid "null_string" +msgstr "ნულოვანი_სტრიქონი" + +#: sql_help.c:1981 +msgid "quote_character" +msgstr "ციტატის_სიმბოლო" + +#: sql_help.c:1982 +msgid "escape_character" +msgstr "სპეციალური_სიმბოლო" + +#: sql_help.c:1986 +msgid "encoding_name" +msgstr "კოდირების-სახელი" + +#: sql_help.c:1997 +msgid "access_method_type" +msgstr "წვდომის_მეთოდის_ტიპი" + +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +msgid "arg_data_type" +msgstr "არგ_მონაც_ტიპი" + +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +msgid "sfunc" +msgstr "მდგომარეობის_ფუნქცია" + +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +msgid "state_data_type" +msgstr "მდგომარეობის_მონაცემების_ტიპი" + +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +msgid "state_data_size" +msgstr "მდგომარეობის_მონაცემების_ზომა" + +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +msgid "ffunc" +msgstr "დასრულების ფუნქცია" + +#: sql_help.c:2073 sql_help.c:2103 +msgid "combinefunc" +msgstr "კომბინ_ფუნქც" + +#: sql_help.c:2074 sql_help.c:2104 +msgid "serialfunc" +msgstr "დესერიალიზაციის_ფუნქცია" + +#: sql_help.c:2075 sql_help.c:2105 +msgid "deserialfunc" +msgstr "დესერიალიზაციის_ფუნქც" + +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +msgid "initial_condition" +msgstr "საწყისი_მდგომარეობა" + +#: sql_help.c:2077 sql_help.c:2107 +msgid "msfunc" +msgstr "გადაადგ_მდგომ_ფუნქცია" + +#: sql_help.c:2078 sql_help.c:2108 +msgid "minvfunc" +msgstr "გადაადგ_მინ_მნიშვნ_ფუნქცია" + +#: sql_help.c:2079 sql_help.c:2109 +msgid "mstate_data_type" +msgstr "გადაადგ_მონაც_ტიპი" + +#: sql_help.c:2080 sql_help.c:2110 +msgid "mstate_data_size" +msgstr "გადაადგ_მონაც_ზომ" + +#: sql_help.c:2081 sql_help.c:2111 +msgid "mffunc" +msgstr "გადადგ_დასრულ_ფუნქცია" + +#: sql_help.c:2082 sql_help.c:2112 +msgid "minitial_condition" +msgstr "გადაადგ­_დასაწყ_ფუნქცია" + +#: sql_help.c:2083 sql_help.c:2113 +msgid "sort_operator" +msgstr "დალაგების_ოპერატორი" + +#: sql_help.c:2096 +msgid "or the old syntax" +msgstr "ან ძველი სინტაქსი" + +#: sql_help.c:2098 +msgid "base_type" +msgstr "საბაზისო_ტიპი" + +#: sql_help.c:2155 sql_help.c:2202 +msgid "locale" +msgstr "ენა" + +#: sql_help.c:2156 sql_help.c:2203 +msgid "lc_collate" +msgstr "lc_collate" + +#: sql_help.c:2157 sql_help.c:2204 +msgid "lc_ctype" +msgstr "lc_ctype" + +#: sql_help.c:2158 sql_help.c:4450 +msgid "provider" +msgstr "მომწოდებელი" + +#: sql_help.c:2160 sql_help.c:2263 +msgid "version" +msgstr "ვერსია" + +#: sql_help.c:2162 +msgid "existing_collation" +msgstr "არსებული_კოლაცია" + +#: sql_help.c:2172 +msgid "source_encoding" +msgstr "წყაროს_კოდირება" + +#: sql_help.c:2173 +msgid "dest_encoding" +msgstr "სამიზნე_კოდირება" + +#: sql_help.c:2199 sql_help.c:3039 +msgid "template" +msgstr "შაბლონი" + +#: sql_help.c:2200 +msgid "encoding" +msgstr "კოდირება" + +#: sql_help.c:2201 +msgid "strategy" +msgstr "სტრატეგია" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_ენა" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "ენის_მომწოდებელი" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "კოლაციის ვერსია" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 +msgid "constraint" +msgstr "შეზღუდვა" + +#: sql_help.c:2233 +msgid "where constraint is:" +msgstr "სადაც constraint არის:" + +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +msgid "event" +msgstr "მოვლენა" + +#: sql_help.c:2248 +msgid "filter_variable" +msgstr "ფილტრის_ცვლადი" + +#: sql_help.c:2249 +msgid "filter_value" +msgstr "ფილტრის_მნიშვნელობა" + +#: sql_help.c:2345 sql_help.c:2931 +msgid "where column_constraint is:" +msgstr "სადაც column_constraint არის:" + +#: sql_help.c:2390 +msgid "rettype" +msgstr "დაბრუნების_ტიპი" + +#: sql_help.c:2392 +msgid "column_type" +msgstr "სვეტის_ტიპი" + +#: sql_help.c:2401 sql_help.c:2604 +msgid "definition" +msgstr "აღწერა" + +#: sql_help.c:2402 sql_help.c:2605 +msgid "obj_file" +msgstr "ობიექტის_ფაილი" + +#: sql_help.c:2403 sql_help.c:2606 +msgid "link_symbol" +msgstr "სიმბოლოს_მიბმა" + +#: sql_help.c:2404 sql_help.c:2607 +msgid "sql_body" +msgstr "sql_ის_სხეული" + +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +msgid "uid" +msgstr "uid" + +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 +msgid "method" +msgstr "მეთოდი" + +#: sql_help.c:2463 +msgid "opclass_parameter" +msgstr "ოპერატ_კლასის_პარამეტრი" + +#: sql_help.c:2480 +msgid "call_handler" +msgstr "გამოძახების_დამმუშავებელი" + +#: sql_help.c:2481 +msgid "inline_handler" +msgstr "ჩადგმული_კოდის_დამმუშავებელი" + +#: sql_help.c:2482 +msgid "valfunction" +msgstr "მნიშვნფუნქცია" + +#: sql_help.c:2521 +msgid "com_op" +msgstr "კომუტ_ოპერ" + +#: sql_help.c:2522 +msgid "neg_op" +msgstr "უარყ_ოპერატ" + +#: sql_help.c:2540 +msgid "family_name" +msgstr "ოჯახის_სახელი" + +#: sql_help.c:2551 +msgid "storage_type" +msgstr "საცავის_ტიპი" + +#: sql_help.c:2690 sql_help.c:3119 +msgid "where event can be one of:" +msgstr "სადაც event შეიძლება იყოს ერთ-ერთი:" + +#: sql_help.c:2710 sql_help.c:2712 +msgid "schema_element" +msgstr "სქემის_ელემენტი" + +#: sql_help.c:2749 +msgid "server_type" +msgstr "სერვერის_ტიპი" + +#: sql_help.c:2750 +msgid "server_version" +msgstr "სერვერის_ვერსია" + +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +msgid "fdw_name" +msgstr "fdw_name" + +#: sql_help.c:2768 sql_help.c:2771 +msgid "statistics_name" +msgstr "სტატისტიკის_სახელი" + +#: sql_help.c:2772 +msgid "statistics_kind" +msgstr "სტატისტიკის_ტიპი" + +#: sql_help.c:2788 +msgid "subscription_name" +msgstr "გამოწერის_სახელი" + +#: sql_help.c:2893 +msgid "source_table" +msgstr "წყაროს_ცხრილი" + +#: sql_help.c:2894 +msgid "like_option" +msgstr "მსგავსების_პარამეტრი" + +#: sql_help.c:2960 +msgid "and like_option is:" +msgstr "და like_option არის:" + +#: sql_help.c:3012 +msgid "directory" +msgstr "საქაღალდე" + +#: sql_help.c:3026 +msgid "parser_name" +msgstr "დამმუშავებლის_სახელი" + +#: sql_help.c:3027 +msgid "source_config" +msgstr "წყაროს_კონფიგურაცია" + +#: sql_help.c:3056 +msgid "start_function" +msgstr "გაშვების_ფუნქცია" + +#: sql_help.c:3057 +msgid "gettoken_function" +msgstr "კოდის_მიღების_ფუნქცია" + +#: sql_help.c:3058 +msgid "end_function" +msgstr "დასრულების ფუნქცია" + +#: sql_help.c:3059 +msgid "lextypes_function" +msgstr "ლექს_ტიპების_ფუნქცია" + +#: sql_help.c:3060 +msgid "headline_function" +msgstr "headline_function" + +#: sql_help.c:3072 +msgid "init_function" +msgstr "ინიციალიზაციის_ფუნქცია" + +#: sql_help.c:3073 +msgid "lexize_function" +msgstr "ლექსით_გამოყოფის_ფუნქცია" + +#: sql_help.c:3086 +msgid "from_sql_function_name" +msgstr "sql_ფუნქციის_სახელიდან" + +#: sql_help.c:3088 +msgid "to_sql_function_name" +msgstr "ფუნქციის_სახელი_sql_ში" + +#: sql_help.c:3114 +msgid "referenced_table_name" +msgstr "მიბმული_ცხრილის_სახელი" + +#: sql_help.c:3115 +msgid "transition_relation_name" +msgstr "გარდამავალი_ურთიერთობის_სახელი" + +#: sql_help.c:3118 +msgid "arguments" +msgstr "არგუმენტები" + +#: sql_help.c:3170 +msgid "label" +msgstr "ჭდე" + +#: sql_help.c:3172 +msgid "subtype" +msgstr "ქვეტიპი" + +#: sql_help.c:3173 +msgid "subtype_operator_class" +msgstr "ქვეტიპის_ოპერატორის_კლასი" + +#: sql_help.c:3175 +msgid "canonical_function" +msgstr "კანონიკური_ფუნქცია" + +#: sql_help.c:3176 +msgid "subtype_diff_function" +msgstr "ქვეტიპის_სხვაობის_ფუნქცია" + +#: sql_help.c:3177 +msgid "multirange_type_name" +msgstr "მრავალდიაპაზონიანი_ტიპის_სახელი" + +#: sql_help.c:3179 +msgid "input_function" +msgstr "შეყვანის_ფუნქცია" + +#: sql_help.c:3180 +msgid "output_function" +msgstr "გამოტანის_ფუნქცია" + +#: sql_help.c:3181 +msgid "receive_function" +msgstr "მიღების_ფუნქცია" + +#: sql_help.c:3182 +msgid "send_function" +msgstr "საწყისი_მნიშვნელობის_ფუნქცია" + +#: sql_help.c:3183 +msgid "type_modifier_input_function" +msgstr "ტიპის_მოდიფიკატორის_შემყვანის_ფუნქცია" + +#: sql_help.c:3184 +msgid "type_modifier_output_function" +msgstr "ტიპის_მოტიფიკატორის_გამოტანის_ფუნქცია" + +#: sql_help.c:3185 +msgid "analyze_function" +msgstr "ფუნქციის_ანალიზი" + +#: sql_help.c:3186 +msgid "subscript_function" +msgstr "ინდექსით_მიმართვის_ფუნქცია" + +#: sql_help.c:3187 +msgid "internallength" +msgstr "შიდასიგრძე" + +#: sql_help.c:3188 +msgid "alignment" +msgstr "სწორება" + +#: sql_help.c:3189 +msgid "storage" +msgstr "საცავი" + +#: sql_help.c:3190 +msgid "like_type" +msgstr "მსგავსების_ტიპი" + +#: sql_help.c:3191 +msgid "category" +msgstr "კატეგორია" + +#: sql_help.c:3192 +msgid "preferred" +msgstr "რჩეული" + +#: sql_help.c:3193 +msgid "default" +msgstr "ნაგულისხმები" + +#: sql_help.c:3194 +msgid "element" +msgstr "ელემენტი" + +#: sql_help.c:3195 +msgid "delimiter" +msgstr "გამყოფი" + +#: sql_help.c:3196 +msgid "collatable" +msgstr "დალაგებადი" + +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 +msgid "with_query" +msgstr "მოთხოვნით" + +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 +msgid "alias" +msgstr "მეტსახელი" + +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 +msgid "from_item" +msgstr "ჩანაწერიდან" + +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 +msgid "cursor_name" +msgstr "კურსორის_სახელი" + +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 +msgid "output_expression" +msgstr "გამოტანის_გამოსახულება" + +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 +msgid "output_name" +msgstr "გამოტანს_სახელი" + +#: sql_help.c:3316 +msgid "code" +msgstr "კოდი" + +#: sql_help.c:3721 +msgid "parameter" +msgstr "Პარამეტრი" + +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +msgid "statement" +msgstr "ოპერატორი" + +#: sql_help.c:3778 sql_help.c:4116 +msgid "direction" +msgstr "მიმართულება" + +#: sql_help.c:3780 sql_help.c:4118 +msgid "where direction can be one of:" +msgstr "სადაც მიმართულება შეიძლება იყოს ერთ-ერთი:" + +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 +msgid "count" +msgstr "რაოდენობა" + +#: sql_help.c:3888 sql_help.c:4337 +msgid "sequence_name" +msgstr "მიმდევრობის _სახელი" + +#: sql_help.c:3906 sql_help.c:4355 +msgid "arg_name" +msgstr "არგ_სახელი" + +#: sql_help.c:3907 sql_help.c:4356 +msgid "arg_type" +msgstr "არგ_ტიპი" + +#: sql_help.c:3914 sql_help.c:4363 +msgid "loid" +msgstr "loid" + +#: sql_help.c:3945 +msgid "remote_schema" +msgstr "დაშორებული_სქემა" + +#: sql_help.c:3948 +msgid "local_schema" +msgstr "ლოკალური_სქემა" + +#: sql_help.c:3983 +msgid "conflict_target" +msgstr "კონფლიქტის_ობიექტი" + +#: sql_help.c:3984 +msgid "conflict_action" +msgstr "ქმედება_კონფლიქტის_დროს" + +#: sql_help.c:3987 +msgid "where conflict_target can be one of:" +msgstr "სადაც conflict_target შეიძლება იყოს სიიდან:" + +#: sql_help.c:3988 +msgid "index_column_name" +msgstr "ინდექსის_სვეტის_სახელი" + +#: sql_help.c:3989 +msgid "index_expression" +msgstr "გამოსახულების_ინდექსი" + +#: sql_help.c:3992 +msgid "index_predicate" +msgstr "ინდექსის_პრედიკატი" + +#: sql_help.c:3994 +msgid "and conflict_action is one of:" +msgstr "და conflict_action შეიძლება იყოს სიიდან:" + +#: sql_help.c:4000 sql_help.c:4925 +msgid "sub-SELECT" +msgstr "ქვე-SELECT" + +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 +msgid "channel" +msgstr "არხი" + +#: sql_help.c:4031 +msgid "lockmode" +msgstr "ბლოკის_რეჟიმი" + +#: sql_help.c:4032 +msgid "where lockmode is one of:" +msgstr "სადაც lockmode ერთერთია სიიდან:" + +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "სამიზნე ცხრილის სახელი" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "სამიზნე_მეტსახელი" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "მონაცემების_წყარო" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "შეერთების პირობა" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "პირობა_როდის" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "სადაც data_source არის:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "წყაროს_ცხრილის_სახელი" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "წყაროს_მოთხოვნა" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "წყაროს_მეტსახელი" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "და when_clause არის:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "განახლების_შერწყმა" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "წაშლის_შერწყმა" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "ჩასმის_შერწყმა" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "და merge_insert არის:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "და merge_update არის:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "და merge_delete არის:" + +#: sql_help.c:4132 +msgid "payload" +msgstr "შემცველობა" + +#: sql_help.c:4159 +msgid "old_role" +msgstr "ძველი_როლი" + +#: sql_help.c:4160 +msgid "new_role" +msgstr "ახალი_როლი" + +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +msgid "savepoint_name" +msgstr "შენახვის_წერტილის_სახელი" + +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 +msgid "grouping_element" +msgstr "დაჯგუფების_ელემენტი" + +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 +msgid "window_name" +msgstr "ფანჯრის_სახელი" + +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 +msgid "window_definition" +msgstr "ფანჯრის_აღწერა" + +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 +msgid "select" +msgstr "არჩევა" + +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 +msgid "where from_item can be one of:" +msgstr "სადაც from_item შეიძლება იყოს სიიდან ერთი:" + +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 +msgid "column_alias" +msgstr "სვეტის_მეტსახელი" + +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 +msgid "sampling_method" +msgstr "სემპლინგის_მეთოდი" + +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 +msgid "seed" +msgstr "საწყისი მნიშვნელობა" + +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 +msgid "with_query_name" +msgstr "მოთხოვნის_სახელით" + +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 +msgid "column_definition" +msgstr "სვეტის_აღწერა" + +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 +msgid "join_type" +msgstr "შეერთების_ტიპი" + +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 +msgid "join_column" +msgstr "სვეტების შეერთება" + +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +msgid "join_using_alias" +msgstr "მეტსახელით_შეერთბა" + +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 +msgid "and grouping_element can be one of:" +msgstr "და grouping_element შეძლება იყოს სიიდან ერთი:" + +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 +msgid "and with_query is:" +msgstr "და with_query არის:" + +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 +msgid "values" +msgstr "მნიშვნელობები" + +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 +msgid "insert" +msgstr "ჩასმა" + +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 +msgid "update" +msgstr "განახლება" + +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 +msgid "delete" +msgstr "წაშლა" + +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +msgid "search_seq_col_name" +msgstr "ბოლო_ძებნის_სვეტის_სახელი" + +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +msgid "cycle_mark_col_name" +msgstr "ციკლის_ნიშნიანი_სვეტის_სახელი" + +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +msgid "cycle_mark_value" +msgstr "ციკლის ნიშნის მნიშვნელობა" + +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +msgid "cycle_mark_default" +msgstr "ციკლის_ნაგულისხმები_ნიშანი" + +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +msgid "cycle_path_col_name" +msgstr "ციკლის_ბილიკის_სვეტის_სახელი" + +#: sql_help.c:4653 +msgid "new_table" +msgstr "ახალი_ცხრილის" + +#: sql_help.c:4724 +msgid "snapshot_id" +msgstr "სწრაფი_ასლის_id" + +#: sql_help.c:4984 +msgid "sort_expression" +msgstr "დალაგების_გამოსახულება" + +#: sql_help.c:5128 sql_help.c:6112 +msgid "abort the current transaction" +msgstr "მიმდინარე ტრანზაქციის გაუქმება" + +#: sql_help.c:5134 +msgid "change the definition of an aggregate function" +msgstr "აგრეგატული ფუნქციის აღწერის შექმნა" + +#: sql_help.c:5140 +msgid "change the definition of a collation" +msgstr "კოლაციის აღწერის შეცვლა" + +#: sql_help.c:5146 +msgid "change the definition of a conversion" +msgstr "გადაყვანის აღწერის შეცვლა" + +#: sql_help.c:5152 +msgid "change a database" +msgstr "მონაცემთა ბაზის შეცვლა" + +#: sql_help.c:5158 +msgid "define default access privileges" +msgstr "წვდომის ნაგულისხმები უფლებების აღწერა" + +#: sql_help.c:5164 +msgid "change the definition of a domain" +msgstr "დომენის აღწერის შეცვლა" + +#: sql_help.c:5170 +msgid "change the definition of an event trigger" +msgstr "დომენის აღწერის შეცვლა" + +#: sql_help.c:5176 +msgid "change the definition of an extension" +msgstr "გაფართოების აღწერის შეცვლა" + +#: sql_help.c:5182 +msgid "change the definition of a foreign-data wrapper" +msgstr "გარე-მონაცემების გადამტანის აღწერის შეცვლა" + +#: sql_help.c:5188 +msgid "change the definition of a foreign table" +msgstr "გარე ცხრილის აღწერის შეცვლა" + +#: sql_help.c:5194 +msgid "change the definition of a function" +msgstr "ფუნქციის აღწერის შეცვლა" + +#: sql_help.c:5200 +msgid "change role name or membership" +msgstr "როლის სახელის ან წევრობის შეცვლა" + +#: sql_help.c:5206 +msgid "change the definition of an index" +msgstr "ინდექსის აღწერის შეცვლა" + +#: sql_help.c:5212 +msgid "change the definition of a procedural language" +msgstr "პროცედურული ენის აღწერის შეცვლა" + +#: sql_help.c:5218 +msgid "change the definition of a large object" +msgstr "დიდი ობიექტის აღწერის შეცვლა" + +#: sql_help.c:5224 +msgid "change the definition of a materialized view" +msgstr "მატერიალიზებული ხედის აღწერის შეცვლა" + +#: sql_help.c:5230 +msgid "change the definition of an operator" +msgstr "ოპერატორის აღწერის შეცვლა" + +#: sql_help.c:5236 +msgid "change the definition of an operator class" +msgstr "ოპერატორის კლასის აღწერის შეცვლა" + +#: sql_help.c:5242 +msgid "change the definition of an operator family" +msgstr "ოპერატორის ოჯახის აღწერის შეცვლა" + +#: sql_help.c:5248 +msgid "change the definition of a row-level security policy" +msgstr "მწკრივის-დონის-უსაფრთხოების წესების აღწერის შეცვლა" + +#: sql_help.c:5254 +msgid "change the definition of a procedure" +msgstr "პროცედურის აღწერის შეცვლა" + +#: sql_help.c:5260 +msgid "change the definition of a publication" +msgstr "გამოცემის აღწერის შეცვლა" + +#: sql_help.c:5266 sql_help.c:5368 +msgid "change a database role" +msgstr "მონაცემთა ბაზის როლის შეცვლა" + +#: sql_help.c:5272 +msgid "change the definition of a routine" +msgstr "ქვეპროგრამის აღწერის შეცვლა" + +#: sql_help.c:5278 +msgid "change the definition of a rule" +msgstr "წესის აღწერის შეცვლა" + +#: sql_help.c:5284 +msgid "change the definition of a schema" +msgstr "სქემის აღწერის შეცვლა" + +#: sql_help.c:5290 +msgid "change the definition of a sequence generator" +msgstr "მიმდევრობის გენერატორის აღწერის შეცვლა" + +#: sql_help.c:5296 +msgid "change the definition of a foreign server" +msgstr "გარე სერვერის აღწერის შეცვლა" + +#: sql_help.c:5302 +msgid "change the definition of an extended statistics object" +msgstr "სტატისტიკის გაფართოებული ობიექტის აღწერის შეცვლა" + +#: sql_help.c:5308 +msgid "change the definition of a subscription" +msgstr "გამოწერის აღწერის შეცვლა" + +#: sql_help.c:5314 +msgid "change a server configuration parameter" +msgstr "სერვერის კონფიგურაციის პარამეტრის შეცვლა" + +#: sql_help.c:5320 +msgid "change the definition of a table" +msgstr "ცხრილის აღწერის შეცვლა" + +#: sql_help.c:5326 +msgid "change the definition of a tablespace" +msgstr "ცხრილების სივრცის აღწერის შეცვლა" + +#: sql_help.c:5332 +msgid "change the definition of a text search configuration" +msgstr "ტექსტის ძებნის კონფიგურაციის აღწერის შეცვლა" + +#: sql_help.c:5338 +msgid "change the definition of a text search dictionary" +msgstr "ტექსტის ძებნის ლექსიკონის აღწერის შეცვლა" + +#: sql_help.c:5344 +msgid "change the definition of a text search parser" +msgstr "ტექსტის ძებნის დამმუშავებლის აღწერს შეცვლა" + +#: sql_help.c:5350 +msgid "change the definition of a text search template" +msgstr "ტექსტის ძებნის შაბლონის აღწერის შეცვლა" + +#: sql_help.c:5356 +msgid "change the definition of a trigger" +msgstr "ტრიგერის აღწერის შეცვლა" + +#: sql_help.c:5362 +msgid "change the definition of a type" +msgstr "ტიპის აღწერის შეცვლა" + +#: sql_help.c:5374 +msgid "change the definition of a user mapping" +msgstr "მომხარებლის მიბმის აღწერის შეცვლა" + +#: sql_help.c:5380 +msgid "change the definition of a view" +msgstr "ხედის აღწერის შეცვლა" + +#: sql_help.c:5386 +msgid "collect statistics about a database" +msgstr "მონაცემების სტატისტიკის მოგროვება" + +#: sql_help.c:5392 sql_help.c:6190 +msgid "start a transaction block" +msgstr "ტრანზაქციის ბლოკის დაწყება" + +#: sql_help.c:5398 +msgid "invoke a procedure" +msgstr "პროცედურის ჩაწოდება" + +#: sql_help.c:5404 +msgid "force a write-ahead log checkpoint" +msgstr "წინასწარ-ჩაწერად ჟურნალში საკონტროლო წერტილის დასმა" + +#: sql_help.c:5410 +msgid "close a cursor" +msgstr "კურსორის დახურვა" + +#: sql_help.c:5416 +msgid "cluster a table according to an index" +msgstr "ცხრილის გადაჯგუფება ინდექსის მიხედვით" + +#: sql_help.c:5422 +msgid "define or change the comment of an object" +msgstr "ობიექტის კომენტარის აღწერა ან შეცვლა" + +#: sql_help.c:5428 sql_help.c:5986 +msgid "commit the current transaction" +msgstr "მიმდინარე ტრანზაქციის გადაცემა" + +#: sql_help.c:5434 +msgid "commit a transaction that was earlier prepared for two-phase commit" +msgstr "წინასწარ ორ ფაზაში გადასაცემად მომზადებული ტრანზაქციის გადაცემა" + +#: sql_help.c:5440 +msgid "copy data between a file and a table" +msgstr "მონაცემების კოპირება ფაილსა და ცხრილს შორის" + +#: sql_help.c:5446 +msgid "define a new access method" +msgstr "წვდომის ახალი მეთოდის აღწერა" + +#: sql_help.c:5452 +msgid "define a new aggregate function" +msgstr "ახალი აგრეგატული ფუნქციის აღწერა" + +#: sql_help.c:5458 +msgid "define a new cast" +msgstr "ახალი კასტის აღწერა" + +#: sql_help.c:5464 +msgid "define a new collation" +msgstr "ახალი კოლაციის აღწერა" + +#: sql_help.c:5470 +msgid "define a new encoding conversion" +msgstr "კოდირების ახალი გადაყვანის აღწერა" + +#: sql_help.c:5476 +msgid "create a new database" +msgstr "ახალი მონაცემთა ბაზის შექმნა" + +#: sql_help.c:5482 +msgid "define a new domain" +msgstr "ახალი დომენის შექმნა" + +#: sql_help.c:5488 +msgid "define a new event trigger" +msgstr "მოვლენის ახალი ტრიგერის აღწერა" + +#: sql_help.c:5494 +msgid "install an extension" +msgstr "გაფართოების დაყენება" + +#: sql_help.c:5500 +msgid "define a new foreign-data wrapper" +msgstr "გარე მონაცემების ახალი გადამტანის აღწერა" + +#: sql_help.c:5506 +msgid "define a new foreign table" +msgstr "მონაცემების გარე ცხრილის აღწერა" + +#: sql_help.c:5512 +msgid "define a new function" +msgstr "ახალი ფუნქციის აღწერა" + +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 +msgid "define a new database role" +msgstr "მონაცემთა ბაზის ახალი როლის აღწერა" + +#: sql_help.c:5524 +msgid "define a new index" +msgstr "ახალი ინდექსის აღწერა" + +#: sql_help.c:5530 +msgid "define a new procedural language" +msgstr "ახალი პროცედურული ენის აღწერა" + +#: sql_help.c:5536 +msgid "define a new materialized view" +msgstr "ახალი მატერიალიზებული ხედის აღწერა" + +#: sql_help.c:5542 +msgid "define a new operator" +msgstr "ახალი ოპერატორის აღწერა" + +#: sql_help.c:5548 +msgid "define a new operator class" +msgstr "ოპერატორის ახალი კლასის აღწერა" + +#: sql_help.c:5554 +msgid "define a new operator family" +msgstr "ოპერატორის ახალი ოჯახის აღწერა" + +#: sql_help.c:5560 +msgid "define a new row-level security policy for a table" +msgstr "ცხრილისთვის ახალი მწკრივის-დონის-უსაფრთხოების წესის აღწერა" + +#: sql_help.c:5566 +msgid "define a new procedure" +msgstr "ახალი პროცედურის აღწერა" + +#: sql_help.c:5572 +msgid "define a new publication" +msgstr "ახალი გამოცემის აღწერა" + +#: sql_help.c:5584 +msgid "define a new rewrite rule" +msgstr "ახალი გადაწერის წესის აღწერა" + +#: sql_help.c:5590 +msgid "define a new schema" +msgstr "ახალი სქემის აღწერა" + +#: sql_help.c:5596 +msgid "define a new sequence generator" +msgstr "მიმდევრობის ახალი გენერატორის აღწერა" + +#: sql_help.c:5602 +msgid "define a new foreign server" +msgstr "ახალი გარე სერვერის აღწერა" + +#: sql_help.c:5608 +msgid "define extended statistics" +msgstr "გაფართოებული სტატისტიკის აღწერა" + +#: sql_help.c:5614 +msgid "define a new subscription" +msgstr "ახალი გამოწერის აღწერა" + +#: sql_help.c:5620 +msgid "define a new table" +msgstr "ახალი ცხრილის აღწერა" + +#: sql_help.c:5626 sql_help.c:6148 +msgid "define a new table from the results of a query" +msgstr "მოთხოვნის შედეგებიდან ახალი ცხრილის აღწერა" + +#: sql_help.c:5632 +msgid "define a new tablespace" +msgstr "ცხრილების ახალი სივრცის აღწერა" + +#: sql_help.c:5638 +msgid "define a new text search configuration" +msgstr "ტექსტის ძებნის ახალი კონფიგურაციის აღწერა" + +#: sql_help.c:5644 +msgid "define a new text search dictionary" +msgstr "ტექსტის ძებნის ახალ ლექსიკონის აღწერა" + +#: sql_help.c:5650 +msgid "define a new text search parser" +msgstr "ტექსტის ძებნის ახალი დამმუშავებლის აღწერა" + +#: sql_help.c:5656 +msgid "define a new text search template" +msgstr "ტექსტის ძებნის ახალი შაბლონის აღწერა" + +#: sql_help.c:5662 +msgid "define a new transform" +msgstr "ახალი გარდაქმნის აღწერა" + +#: sql_help.c:5668 +msgid "define a new trigger" +msgstr "ახალი ტრიგერის აღწერა" + +#: sql_help.c:5674 +msgid "define a new data type" +msgstr "მონაცემების ახალი ტიპის აღწერა" + +#: sql_help.c:5686 +msgid "define a new mapping of a user to a foreign server" +msgstr "მომხმარებლის გარე სერვერთან ახალი ბმის აღწერა" + +#: sql_help.c:5692 +msgid "define a new view" +msgstr "ახალი ხედის აღწერა" + +#: sql_help.c:5698 +msgid "deallocate a prepared statement" +msgstr "მომზადებული ოპერატორის გათავისუფლება" + +#: sql_help.c:5704 +msgid "define a cursor" +msgstr "კურსორის აღწერა" + +#: sql_help.c:5710 +msgid "delete rows of a table" +msgstr "ცხრილში მწკრივების წაშლა" + +#: sql_help.c:5716 +msgid "discard session state" +msgstr "სესიის მდგომარეობის მოშორება" + +#: sql_help.c:5722 +msgid "execute an anonymous code block" +msgstr "კოდის ანონიმური ბლოკის შესრულება" + +#: sql_help.c:5728 +msgid "remove an access method" +msgstr "წვდომის მეთოდის წაშლა" + +#: sql_help.c:5734 +msgid "remove an aggregate function" +msgstr "აგრეგატული ფუნქციის წაშლა" + +#: sql_help.c:5740 +msgid "remove a cast" +msgstr "კასტის წაშლა" + +#: sql_help.c:5746 +msgid "remove a collation" +msgstr "კოლაციის წაშლა" + +#: sql_help.c:5752 +msgid "remove a conversion" +msgstr "გადაყვანის წაშლა" + +#: sql_help.c:5758 +msgid "remove a database" +msgstr "მონაცემთა ბაზის წაშლა" + +#: sql_help.c:5764 +msgid "remove a domain" +msgstr "დომენის წაშლა" + +#: sql_help.c:5770 +msgid "remove an event trigger" +msgstr "მოვლენის ტრიგერის წაშლა" + +#: sql_help.c:5776 +msgid "remove an extension" +msgstr "გაფართოების წაშლა" + +#: sql_help.c:5782 +msgid "remove a foreign-data wrapper" +msgstr "გარე-მონაცემების გადამტანის წაშლა" + +#: sql_help.c:5788 +msgid "remove a foreign table" +msgstr "გარე ცხრილის წაშლა" + +#: sql_help.c:5794 +msgid "remove a function" +msgstr "ფუნქციის წაშლა" + +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 +msgid "remove a database role" +msgstr "მონაცემთა ბაზის როლის წაშლა" + +#: sql_help.c:5806 +msgid "remove an index" +msgstr "ინდექსის წაშლა" + +#: sql_help.c:5812 +msgid "remove a procedural language" +msgstr "პროცედურული ენის წაშლა" + +#: sql_help.c:5818 +msgid "remove a materialized view" +msgstr "მატერიალიზებული ხედის წაშლა" + +#: sql_help.c:5824 +msgid "remove an operator" +msgstr "ოპერატორის წაშლა" + +#: sql_help.c:5830 +msgid "remove an operator class" +msgstr "ოპერატორის კლასის წაშლა" + +#: sql_help.c:5836 +msgid "remove an operator family" +msgstr "ოპერატორის ოჯახის წაშლა" + +#: sql_help.c:5842 +msgid "remove database objects owned by a database role" +msgstr "მონაცემთა ბაზის როლის მფლობელობაში მყოფი ბაზის ობიექტების წაშლა" + +#: sql_help.c:5848 +msgid "remove a row-level security policy from a table" +msgstr "ცხრილიდან მწკრივის-დონის უსაფრთხოების წესის წაშლა" + +#: sql_help.c:5854 +msgid "remove a procedure" +msgstr "პროცედურის წაშლა" + +#: sql_help.c:5860 +msgid "remove a publication" +msgstr "გამოცემის წაშლა" + +#: sql_help.c:5872 +msgid "remove a routine" +msgstr "წესრიგის წაშლა" + +#: sql_help.c:5878 +msgid "remove a rewrite rule" +msgstr "გადაწერის წესის წაშლა" + +#: sql_help.c:5884 +msgid "remove a schema" +msgstr "სქემის წაშლა" + +#: sql_help.c:5890 +msgid "remove a sequence" +msgstr "მიმდევრობის წაშლა" + +#: sql_help.c:5896 +msgid "remove a foreign server descriptor" +msgstr "გარე სერვერის დესკრიპტორის წაშლა" + +#: sql_help.c:5902 +msgid "remove extended statistics" +msgstr "გაფართოებული სტატისტიკის წაშლა" + +#: sql_help.c:5908 +msgid "remove a subscription" +msgstr "გამოწერის წაშლა" + +#: sql_help.c:5914 +msgid "remove a table" +msgstr "ცხრილის წაშლა" + +#: sql_help.c:5920 +msgid "remove a tablespace" +msgstr "ცხრილების სივრცის წაშლა" + +#: sql_help.c:5926 +msgid "remove a text search configuration" +msgstr "ტექსტის ძებნის კონფიგურაციის წაშლა" + +#: sql_help.c:5932 +msgid "remove a text search dictionary" +msgstr "ტექსტის ძებნის ლექსიკონის წაშლა" + +#: sql_help.c:5938 +msgid "remove a text search parser" +msgstr "ტექსტის ძებნის დამმუშავებლის წაშლა" + +#: sql_help.c:5944 +msgid "remove a text search template" +msgstr "ტექსტის ძებნის შაბლონის წაშლა" + +#: sql_help.c:5950 +msgid "remove a transform" +msgstr "გარდაქმნის წაშლა" + +#: sql_help.c:5956 +msgid "remove a trigger" +msgstr "ტრიგერის წაშლა" + +#: sql_help.c:5962 +msgid "remove a data type" +msgstr "მონაცემების ტიპის წაშლა" + +#: sql_help.c:5974 +msgid "remove a user mapping for a foreign server" +msgstr "მომხმარებლის გარე სერვერისთვის მიბმის წაშლა" + +#: sql_help.c:5980 +msgid "remove a view" +msgstr "ხედის წაშლა" + +#: sql_help.c:5992 +msgid "execute a prepared statement" +msgstr "მზა ოპერატორის შესრულება" + +#: sql_help.c:5998 +msgid "show the execution plan of a statement" +msgstr "ოპერატორის შესრულების გეგმის ჩვენება" + +#: sql_help.c:6004 +msgid "retrieve rows from a query using a cursor" +msgstr "კურსორის გამოყენებით მოთხოვნიდან მწკრივების მიღება" + +#: sql_help.c:6010 +msgid "define access privileges" +msgstr "წვდომის უფლებების აღწერა" + +#: sql_help.c:6016 +msgid "import table definitions from a foreign server" +msgstr "ცხრილის აღწერების უცხო სერვერიდან შემოტანა" + +#: sql_help.c:6022 +msgid "create new rows in a table" +msgstr "ცხრილში ახალი მწკრივების შექმნა" + +#: sql_help.c:6028 +msgid "listen for a notification" +msgstr "შეტყობინების მოლოდინი" + +#: sql_help.c:6034 +msgid "load a shared library file" +msgstr "გაზიარებული ბიბლიოთეკის ფაილის ჩატვირთვა" + +#: sql_help.c:6040 +msgid "lock a table" +msgstr "ცხრილის დაბლოკვა" + +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "ცხრილის მწკრივების ჩასმა, განახლება ან წაშლა პირობის მიხედვით" + +#: sql_help.c:6052 +msgid "position a cursor" +msgstr "კურსორის მოთავსება" + +#: sql_help.c:6058 +msgid "generate a notification" +msgstr "შეტყობინების გენერაცია" + +#: sql_help.c:6064 +msgid "prepare a statement for execution" +msgstr "ოპერატორის გასაშვებად მომზადება" + +#: sql_help.c:6070 +msgid "prepare the current transaction for two-phase commit" +msgstr "ტრანზაქციის მომზადება ორ ფაზაში გადასაცემად" + +#: sql_help.c:6076 +msgid "change the ownership of database objects owned by a database role" +msgstr "ბაზის როლის მფლობელობაში მყოფი ბაზის ობიექტების მფლობელის შეცვლა" + +#: sql_help.c:6082 +msgid "replace the contents of a materialized view" +msgstr "მატერიალიზებული ხედის შემცველობის ჩანაცვლება" + +#: sql_help.c:6088 +msgid "rebuild indexes" +msgstr "ინდექსების თავიდან აგება" + +#: sql_help.c:6094 +msgid "destroy a previously defined savepoint" +msgstr "ადრე აღწერილი შენახვის წერტილის განადგურება" + +#: sql_help.c:6100 +msgid "restore the value of a run-time parameter to the default value" +msgstr "გაშვების პარამეტრის მნიშვნელობის საწყის მნიშვნელობაზე აღდგენა" + +#: sql_help.c:6106 +msgid "remove access privileges" +msgstr "წვდომის უფლებების წაშლა" + +#: sql_help.c:6118 +msgid "cancel a transaction that was earlier prepared for two-phase commit" +msgstr "წინასწარ ორ ფაზაში გადასაცემად მომზადებული ტრანზაქციის გაუქმება" + +#: sql_help.c:6124 +msgid "roll back to a savepoint" +msgstr "შენახვის წერტილზე დაბრუნება" + +#: sql_help.c:6130 +msgid "define a new savepoint within the current transaction" +msgstr "ახალი შესანახი წერტილის აღწერა მიმდინარე ტრანზაქციაში" + +#: sql_help.c:6136 +msgid "define or change a security label applied to an object" +msgstr "ობიექტზე გადატარებული უსაფრთხოების ჭდის აღწერა ან შეცვლა" + +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 +msgid "retrieve rows from a table or view" +msgstr "მწკრივის მიღება ცხრილიდან ან ხედიდან" + +#: sql_help.c:6154 +msgid "change a run-time parameter" +msgstr "გაშვების პარამეტრის შეცვლა" + +#: sql_help.c:6160 +msgid "set constraint check timing for the current transaction" +msgstr "მიმდინარე ტრანზაქციის შეზღუდვის შემოწმების დროის დაყენება" + +#: sql_help.c:6166 +msgid "set the current user identifier of the current session" +msgstr "მიმდინარე სესიის მიმდინარე მომხმარებლის იდენტიფიკატორის დაყენება" + +#: sql_help.c:6172 +msgid "set the session user identifier and the current user identifier of the current session" +msgstr "სესიის მომხმარებლის იდენტიფიკატორისა და მიმდინარე სესიის მიმდინარე მომხმარებლის იდენტიფიკატორის დაყენება" + +#: sql_help.c:6178 +msgid "set the characteristics of the current transaction" +msgstr "მიმდინარე ტრანზაქციის თვისებების დაყენება" + +#: sql_help.c:6184 +msgid "show the value of a run-time parameter" +msgstr "გაშვების პარამეტრის მნიშვნელობის ჩვენება" + +#: sql_help.c:6202 +msgid "empty a table or set of tables" +msgstr "ცხრილის ან ცხრილების სეტის დაცარიელება" + +#: sql_help.c:6208 +msgid "stop listening for a notification" +msgstr "გაფრთხილებების მოსმენის შეწყვეტა" + +#: sql_help.c:6214 +msgid "update rows of a table" +msgstr "ცხრილის მწკრივების განახლება" + +#: sql_help.c:6220 +msgid "garbage-collect and optionally analyze a database" +msgstr "ნაგვის-მოგროვება და ბაზის არასავალდებულო ანალიზი" + +#: sql_help.c:6226 +msgid "compute a set of rows" +msgstr "მწკრივების სეტის გამოთვლა" + +#: startup.c:220 +#, c-format +msgid "-1 can only be used in non-interactive mode" +msgstr "-1 მხოლოდ არაინტერაქტიურ რეჟიმში შეიძლება იყოს გამოყენებული" + +#: startup.c:343 +#, c-format +msgid "could not open log file \"%s\": %m" +msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m" + +#: startup.c:460 +#, c-format +msgid "" +"Type \"help\" for help.\n" +"\n" +msgstr "" +"დახმარებისთვის აკრიფეთ \"help\".\n" +"\n" + +#: startup.c:612 +#, c-format +msgid "could not set printing parameter \"%s\"" +msgstr "გამოტანის პარამეტრის დაყენების შეცდომა: \"%s\"" + +#: startup.c:719 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'." + +#: startup.c:735 +#, c-format +msgid "extra command-line argument \"%s\" ignored" +msgstr "ბრძანების სტრიქონის დამატებითი არგუმენტი \"%s\" იგნორირებულია" + +#: startup.c:783 +#, c-format +msgid "could not find own program executable" +msgstr "საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია" + +#: tab-complete.c:5955 +#, c-format +msgid "" +"tab completion query failed: %s\n" +"Query was:\n" +"%s" +msgstr "" +"ჩანართის დაბრუნების მოთხოვნის შეცდომა: %s\n" +"მოთხოვნის ტექსტი:\n" +"%s" + +#: variables.c:139 +#, c-format +msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" +msgstr "მნიშვნელობა \"%s\" \"%s\"-სთვის მიუღებელია: ველოდებოდი ლოგიკურ მნიშვნელობას" + +#: variables.c:176 +#, c-format +msgid "invalid value \"%s\" for \"%s\": integer expected" +msgstr "არასწორი მნიშვნელობა \"%s\" \"%s\"-სთვის (უნდა იყოს მთელი რიცხვი)" + +#: variables.c:224 +#, c-format +msgid "invalid variable name: \"%s\"" +msgstr "ცვლადის არასწორი სახელი: \"%s\"" + +#: variables.c:419 +#, c-format +msgid "" +"unrecognized value \"%s\" for \"%s\"\n" +"Available values are: %s." +msgstr "" +"\"%s\" არასწორი მნიშვნელობაა \"%s\"-სთვის\n" +"შესაძლო მნიშვნელობებია: %s." + +#, c-format +#~ msgid "\\watch cannot be used with COPY" +#~ msgstr "\\watch -ს COPY-სთან ერთად ვერ გამოყენებთ" + +#~ msgid "text" +#~ msgstr "ტექსტი" + +#~ msgid "timezone" +#~ msgstr "დროის_სარტყელი" + +#~ msgid "where direction can be empty or one of:" +#~ msgstr "სადაც direction შეიძლება იყოს ცარიელი, ან ერთ-ერთი სიიდან::" diff --git a/third_party/spanner_pg/src/bin/psql/po/ko.po b/third_party/spanner_pg/src/bin/psql/po/ko.po index 3d3da974..3521ba6f 100644 --- a/third_party/spanner_pg/src/bin/psql/po/ko.po +++ b/third_party/spanner_pg/src/bin/psql/po/ko.po @@ -3,10 +3,10 @@ # 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-10-12 22:13+0000\n" -"PO-Revision-Date: 2020-10-27 14:28+0900\n" +"POT-Creation-Date: 2023-04-12 00:46+0000\n" +"PO-Revision-Date: 2023-04-08 00:31+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,58 +15,64 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심각: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "상세정보: " + +#: ../../../src/common/logging.c:301 +#, 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:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "메모리 부족" @@ -87,7 +93,7 @@ msgstr "null 포인터를 복제할 수 없음(내부 오류)\n" msgid "could not look up effective user ID %ld: %s" msgstr "UID %ld 해당하는 사용자를 찾을 수 없음: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "사용자 없음" @@ -126,88 +132,93 @@ 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:350 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu개 행)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "인트럽트발생\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 "테이블 내용에 헤더를 추가할 수 없음: 열 수가 %d개를 초과했습니다.\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 "테이블 내용에 셀을 추가할 수 없음: 총 셀 수가 %d개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "잘못된 출력 형식 (내부 오류): %d" -#: ../../fe_utils/psqlscan.l:694 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "\"%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 "UID %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:232 #, c-format msgid "invalid command \\%s" msgstr "잘못된 명령: \\%s" -#: command.c:226 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "도움말을 보려면 \\?를 입력하십시오." -#: command.c:244 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: \"%s\" 추가 인자가 무시되었음" -#: command.c:296 +#: command.c:304 #, 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:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "UID %ld 사용자의 홈 디렉터리를 찾을 수 없음: %s" -#: command.c:575 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: \"%s\" 디렉터리로 이동할 수 없음: %m" -#: command.c:600 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "현재 데이터베이스에 연결되어있지 않습니다.\n" -#: command.c:613 +#: command.c:627 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -215,7 +226,7 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 주소=\"%s\", 포트=\"%s\".\n" -#: command.c:616 +#: command.c:630 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at " @@ -223,7 +234,7 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 소켓=\"%s\", 포트=\"%s\".\n" -#: command.c:622 +#: command.c:636 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address " @@ -232,7 +243,7 @@ msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\" (주소=\"%s\"), 포" "트=\"%s\".\n" -#: command.c:625 +#: command.c:639 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port " @@ -240,182 +251,169 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\", 포트=\"%s\".\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "쿼리 버퍼가 없음" -#: command.c:998 command.c:5061 +#: command.c:1063 command.c:5491 #, 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:1203 msgid "No changes" msgstr "변경 내용 없음" -#: command.c:1216 +#: command.c:1282 #, 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 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:1324 msgid "There is no previous error." msgstr "이전 오류가 없습니다." -#: command.c:1371 +#: command.c:1437 #, 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:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: 필요한 인자가 빠졌음" -#: command.c:1679 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else 구문 뒤에 올 수 없음" -#: command.c:1684 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: \\if 명령과 짝이 안맞음" -#: command.c:1748 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else 명령 뒤에 올 수 없음" -#: command.c:1753 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: \\if 명령과 짝이 안맞음" -#: command.c:1793 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: \\if 명령과 짝이 안맞음" -#: command.c:1948 +#: command.c:2053 msgid "Query buffer is empty." msgstr "쿼리 버퍼가 비었음." -#: command.c:1970 -msgid "Enter new password: " -msgstr "새 암호를 입력하세요:" +#: command.c:2096 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "\"%s\" 사용자의 새 암호: " -#: command.c:1971 +#: command.c:2100 msgid "Enter it again: " msgstr "다시 입력해 주세요:" -#: command.c:1975 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "암호가 서로 틀립니다." -#: command.c:2074 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 변수 값을 읽을 수 없음" -#: command.c:2177 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "쿼리 버퍼 초기화 (비웠음)." -#: command.c:2199 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "명령내역(history)을 \"%s\" 파일에 기록했습니다.\n" -#: command.c:2286 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: OS 환경 변수 이름에는 \"=\" 문자가 없어야 함" -#: 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:2468 #, c-format msgid "function name is required" msgstr "함수 이름이 필요함" -#: command.c:2359 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "뷰 이름이 필요함" -#: command.c:2489 +#: command.c:2593 msgid "Timing is on." msgstr "작업수행시간 보임" -#: command.c:2491 +#: command.c:2595 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:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "암호: " -#: command.c:2993 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "%s 사용자의 암호: " -#: command.c:3064 +#: command.c:3168 #, c-format msgid "" -"All connection parameters must be supplied because no database connection " -"exists" -msgstr "현재 접속 정보가 없습니다. 접속을 위한 연결 관련 매개변수를 지정하세요" +"Do not give user, host, or port separately when using a connection string" +msgstr "" +"연결 문자열을 사용할 때는 user, host, port 를 따로 따로 지정하지 마세요." + +#: command.c:3203 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "재접속할 데이터베이스 연결 정보가 없음" -#: command.c:3257 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "이전 연결이 유지되었음" -#: command.c:3261 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\연결: %s" -#: command.c:3310 +#: command.c:3573 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -423,7 +421,7 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 주소=\"%s\", 포트=\"%s\".\n" -#: command.c:3313 +#: command.c:3576 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " @@ -431,7 +429,7 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 소켓=\"%s\", 포트=\"%s\".\n" -#: command.c:3319 +#: command.c:3582 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s" @@ -440,7 +438,7 @@ msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\" (주소 \"%s\"), 포" "트=\"%s\".\n" -#: command.c:3322 +#: command.c:3585 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " @@ -448,17 +446,17 @@ msgid "" msgstr "" "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\", 포트=\"%s\".\n" -#: command.c:3327 +#: command.c:3590 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\".\n" -#: command.c:3360 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s(%s, %s 서버)\n" -#: command.c:3368 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -467,29 +465,29 @@ msgstr "" "경고: %s 메이저 버전 %s, 서버 메이저 버전 %s.\n" " 일부 psql 기능이 작동하지 않을 수도 있습니다.\n" -#: command.c:3407 +#: command.c:3680 #, 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:3681 command.c:3682 msgid "unknown" msgstr "알수없음" -#: command.c:3411 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "off" -#: command.c:3411 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "on" -#: command.c:3425 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "암호화된 GSSAPI 연결\n" -#: command.c:3445 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -501,7 +499,7 @@ msgstr "" "참조\n" " 페이지 \"Notes for Windows users\"를 참조하십시오.\n" -#: command.c:3549 +#: command.c:3822 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -510,32 +508,32 @@ msgstr "" "지정한 줄번호를 사용하기 위해서는 PSQL_EDITOR_LINENUMBER_ARG 이름의 OS 환경변" "수가 설정되어 있어야 합니다." -#: command.c:3578 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "\"%s\" 문서 편집기를 실행시킬 수 없음" -#: command.c:3580 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "/bin/sh 명령을 실행할 수 없음" -#: command.c:3618 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "임시 디렉터리 경로를 알 수 없음: %s" -#: command.c:3645 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "\"%s\" 임시 파일을 열 수 없음: %m" -#: command.c:3950 +#: command.c:4266 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: \"%s\" 생략형이 \"%s\" 또는 \"%s\" 값 모두 선택가능해서 모호함" -#: command.c:3970 +#: command.c:4286 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -544,32 +542,32 @@ msgstr "" "\\pset: 허용되는 출력 형식: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:3989 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 사용할 수 있는 선 모양은 ascii, old-ascii, unicode" -#: command.c:4004 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 테두리 모양은 single, double" -#: command.c:4019 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 칼럼 선 모양은 single, double" -#: command.c:4034 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 헤더 선 모양은 single, double" -#: command.c:4077 +#: command.c:4393 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep 문자는 1바이트의 단일 문자여야 함" -#: command.c:4082 +#: command.c:4398 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -577,193 +575,203 @@ msgid "" msgstr "" "\\pset: csv_fieldsep 문자로 따옴표, 줄바꿈(\\n, \\r) 문자는 사용할 수 없음" -#: command.c:4219 command.c:4407 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 알 수 없는 옵션: %s" -#: command.c:4239 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "html 테이블의 테두리를 %d로 지정했습니다.\n" -#: command.c:4245 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "대상 너비 미지정.\n" -#: command.c:4247 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "대상 너비는 %d입니다.\n" -#: command.c:4254 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "칼럼 단위 보기 기능 켬.\n" -#: command.c:4256 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "칼럼 단위 보기 기능을 자동으로 지정 함.\n" -#: command.c:4258 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "칼럼 단위 보기 기능 끔.\n" -#: command.c:4264 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSV용 필드 구분자: \"%s\".\n" -#: command.c:4272 command.c:4280 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "필드 구분자가 0 바이트입니다.\n" -#: command.c:4274 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "필드 구분자 \"%s\".\n" -#: command.c:4287 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "기본 꼬릿말 보기 기능 켬.\n" -#: command.c:4289 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "기본 꼬릿말 보기 기능 끔.\n" -#: command.c:4295 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "현재 출력 형식: %s.\n" -#: command.c:4301 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "선 모양: %s.\n" -#: command.c:4308 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null 값은 \"%s\" 문자로 보여짐.\n" -#: command.c:4316 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "로케일 맞춤 숫자 표기 기능 켬.\n" -#: command.c:4318 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "로케일 맞춤 숫자 표기 기능 끔.\n" -#: command.c:4325 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "긴 출력을 위해 페이저가 사용됨.\n" -#: command.c:4327 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "항상 페이저가 사용됨.\n" -#: command.c:4329 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "화면단위 보기 기능 끔(전체 자료 모두 보여줌).\n" -#: command.c:4335 +#: command.c:4651 #, 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:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "레코드 구분자가 0 바이트임.\n" -#: command.c:4347 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "레코드 구분자는 줄바꿈 문자입니다.\n" -#: command.c:4349 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "레코드 구분자 \"%s\".\n" -#: command.c:4362 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "테이블 속성: \"%s\".\n" -#: command.c:4365 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "테이블 속성 모두 지움.\n" -#: command.c:4372 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "출력 테이블의 제목: \"%s\"\n" -#: command.c:4374 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "출력 테이블의 제목을 지정하지 않았습니다.\n" -#: command.c:4381 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "자료만 보기 기능 켬.\n" -#: command.c:4383 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "자료만 보기 기능 끔.\n" -#: command.c:4389 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "유니코드 테두리 선문자: \"%s\".\n" -#: command.c:4395 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "유니코드 칼럼 선문자: \"%s\".\n" -#: command.c:4401 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "유니코드 헤더 선문자: \"%s\".\n" -#: command.c:4634 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: 실패" -#: command.c:4659 common.c:648 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch 명령으로 수행할 쿼리가 없습니다." -#: command.c:4700 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "타이머 설정 실패: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%g초 간격)\n" -#: command.c:4703 +#: command.c:5081 #, 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:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "신호를 기다릴 수 없었음: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -776,115 +784,111 @@ msgstr "" "**************************\n" "\n" -#: command.c:4956 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" 뷰(view)가 아님" -#: command.c:4972 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "reloptions 배열을 분석할 수 없음" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "현재 접속한 연결 없이는 특수문자처리를 할 수 없음" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "쉘 명령의 인자에 줄바꿈 문자가 있음: \"%s\"" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "서버 접속 끊김" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "서버로부터 연결이 끊어졌습니다. 다시 연결을 시도합니다: " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "실패.\n" -#: common.c:326 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "성공.\n" -#: common.c:378 common.c:938 common.c:1155 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus 반환값이 잘못됨: %d" -#: common.c:487 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "작업시간: %.3f ms\n" -#: common.c:502 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "작업시간: %.3f ms (%02d:%06.3f)\n" -#: common.c:511 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "작업시간: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:542 #, 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:542 common.c:600 common.c:1191 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, 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:654 #, c-format msgid "" "Asynchronous notification \"%s\" with payload \"%s\" received from server " "process with PID %d.\n" msgstr "\"%s\" 비동기 통지를 받음, 부가정보: \"%s\", 보낸 프로세스: %d.\n" -#: common.c:693 +#: common.c:657 #, 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:688 #, c-format msgid "could not print result table: %m" msgstr "결과 테이블을 출력할 수 없음: %m" -#: common.c:764 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset 해당 자료 없음" -#: common.c:769 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset 실행 결과가 단일 자료가 아님" -#: common.c:1200 +#: common.c:731 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "" +"\\gset 작업으로 특수하게 처리되는 변수인 \"%s\" 변수값을 바꿀 수 있어 무시함" + +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify " @@ -897,35 +901,28 @@ 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에 사용할 savepoint를 지원하지 않습니다." - -#: common.c:1318 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "명령구문: %s" -#: common.c:1361 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "알 수 없는 트랜잭션 상태 (%d)" -#: common.c:1502 describe.c:2001 +#: common.c:1303 describe.c:2020 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:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" -msgstr "종류" +msgstr "형태" -#: common.c:1552 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "해당 명령 결과가 없거나, 그 결과에는 칼럼이 없습니다.\n" @@ -993,11 +990,11 @@ msgstr "" "자료입력이 끝나면 backslash 점 (\\.) 마지막 줄 처음에 입력하는 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 "복사 모드를 종료하는 중" @@ -1054,1113 +1051,1153 @@ 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:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 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:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "이름" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:89 describe.c:351 describe.c:369 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:352 describe.c:370 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:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "설명" -#: describe.c:135 +#: describe.c:128 msgid "List of aggregate functions" msgstr "통계 함수 목록" -#: describe.c:160 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "서버(%s 버전)에서 접근 방법을 지원하지 않습니다." -#: describe.c:175 +#: describe.c:168 msgid "Index" msgstr "인덱스" -#: describe.c:176 describe.c:3737 describe.c:3952 describe.c:5503 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "테이블" -#: describe.c:184 describe.c:5280 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "핸들러" -#: describe.c:203 +#: describe.c:201 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: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:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "소유주" -#: describe.c:244 describe.c:252 +#: describe.c:231 msgid "Location" msgstr "위치" -#: describe.c:263 describe.c:3323 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "옵션" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3771 describe.c:3775 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "크기" -#: describe.c:290 +#: describe.c:266 msgid "List of tablespaces" msgstr "테이블스페이스 목록" -#: describe.c:333 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df 명령은 [anptwS+]만 추가로 사용함" -#: describe.c:341 describe.c:352 +#: describe.c:319 #, 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:354 describe.c:372 msgid "agg" msgstr "집계" -#: describe.c:390 describe.c:408 +#: describe.c:355 describe.c:373 msgid "window" msgstr "창" -#: describe.c:391 +#: describe.c:356 msgid "proc" -msgstr "" +msgstr "proc" -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:357 describe.c:375 msgid "func" msgstr "함수" -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "트리거" -#: describe.c:483 +#: describe.c:386 msgid "immutable" msgstr "immutable" -#: describe.c:484 +#: describe.c:387 msgid "stable" msgstr "stable" -#: describe.c:485 +#: describe.c:388 msgid "volatile" msgstr "volatile" -#: describe.c:486 +#: describe.c:389 msgid "Volatility" msgstr "휘발성" -#: describe.c:494 +#: describe.c:397 msgid "restricted" msgstr "엄격함" -#: describe.c:495 +#: describe.c:398 msgid "safe" msgstr "safe" -#: describe.c:496 +#: describe.c:399 msgid "unsafe" msgstr "unsafe" -#: describe.c:497 +#: describe.c:400 msgid "Parallel" msgstr "병렬처리" -#: describe.c:502 +#: describe.c:405 msgid "definer" msgstr "definer" -#: describe.c:503 +#: describe.c:406 msgid "invoker" msgstr "invoker" -#: describe.c:504 +#: describe.c:407 msgid "Security" msgstr "보안" -#: describe.c:511 +#: describe.c:412 msgid "Language" msgstr "언어" -#: describe.c:512 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "소스 코드" -#: describe.c:641 +#: describe.c:594 msgid "List of functions" msgstr "함수 목록" -#: describe.c:689 +#: describe.c:657 msgid "Internal name" msgstr "내부 이름" -#: describe.c:711 +#: describe.c:659 msgid "Elements" msgstr "요소" -#: describe.c:768 +#: describe.c:711 msgid "List of data types" msgstr "자료형 목록" -#: describe.c:812 +#: describe.c:814 msgid "Left arg type" msgstr "왼쪽 인수 자료형" -#: describe.c:813 +#: describe.c:815 msgid "Right arg type" msgstr "오른쪽 인수 자료형" -#: describe.c:814 +#: describe.c:816 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:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "함수" -#: describe.c:844 +#: describe.c:902 msgid "List of operators" msgstr "연산자 목록" -#: describe.c:874 +#: describe.c:938 msgid "Encoding" msgstr "인코딩" -#: describe.c:879 describe.c:4530 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Collate" -#: describe.c:880 describe.c:4531 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:893 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU 로케일" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "로케일 제공자" + +#: describe.c:964 msgid "Tablespace" msgstr "테이블스페이스" -#: describe.c:915 +#: describe.c:990 msgid "List of databases" msgstr "데이터베이스 목록" -#: describe.c:956 describe.c:1117 describe.c:3720 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "테이블" -#: describe.c:957 describe.c:3721 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "뷰(view)" -#: describe.c:958 describe.c:3722 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "구체화된 뷰" -#: describe.c:959 describe.c:1119 describe.c:3724 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "시퀀스" -#: describe.c:960 describe.c:3726 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "외부 테이블" -#: describe.c:961 describe.c:3727 describe.c:3937 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "파티션 테이블" -#: describe.c:973 +#: describe.c:1047 msgid "Column privileges" msgstr "칼럼 접근권한" -#: describe.c:1004 describe.c:1038 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "정책" -#: describe.c:1070 describe.c:6052 describe.c:6056 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "액세스 권한" -#: describe.c:1101 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "이 서버(%s 버전)는 ALTER DEFAULT PRIVILEGES 기능을 지원하지 않습니다." - -#: describe.c:1121 +#: describe.c:1188 msgid "function" msgstr "함수" -#: describe.c:1123 +#: describe.c:1190 msgid "type" msgstr "type" -#: describe.c:1125 +#: describe.c:1192 msgid "schema" msgstr "스키마" -#: describe.c:1149 +#: describe.c:1215 msgid "Default access privileges" msgstr "기본 접근권한" -#: describe.c:1189 +#: describe.c:1259 msgid "Object" msgstr "개체" -#: describe.c:1203 +#: describe.c:1273 msgid "table constraint" msgstr "테이블 제약 조건" -#: describe.c:1225 +#: describe.c:1297 msgid "domain constraint" msgstr "도메인 제약조건" -#: describe.c:1253 +#: describe.c:1321 msgid "operator class" msgstr "연산자 클래스" -#: describe.c:1282 +#: describe.c:1345 msgid "operator family" msgstr "연산자 부류" -#: describe.c:1304 +#: describe.c:1368 msgid "rule" msgstr "룰(rule)" -#: describe.c:1346 +#: describe.c:1414 msgid "Object descriptions" msgstr "개체 설명" -#: describe.c:1402 describe.c:3843 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\" 이름을 릴레이션(relation) 없음." -#: describe.c:1405 describe.c:3846 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "관련 릴레이션 찾을 수 없음." -#: describe.c:1660 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "%s oid의 어떤 릴레이션(relation)도 찾을 수 없음." -#: describe.c:1712 describe.c:1736 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "시작" -#: describe.c:1713 describe.c:1737 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "최소값" -#: describe.c:1714 describe.c:1738 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "최대값" -#: describe.c:1715 describe.c:1739 +#: describe.c:1729 describe.c:1753 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:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 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:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "아니오" -#: describe.c:1718 describe.c:1742 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "순환?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "캐쉬" -#: describe.c:1786 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "소유주: %s" -#: describe.c:1790 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "식별 칼럼용 시퀀스: %s" -#: describe.c:1797 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "\"%s.%s\" 로그 미사용 시퀀스" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "\"%s.%s\" 시퀀스" -#: describe.c:1933 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "로그 미사용 테이블 \"%s.%s\"" -#: describe.c:1936 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "\"%s.%s\" 테이블" -#: describe.c:1940 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "\"%s.%s\" 뷰(view)" -#: describe.c:1945 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "트랜잭션 로그를 남기지 않은 구체화된 뷰 \"%s.%s\"" -#: describe.c:1948 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialized 뷰 \"%s.%s\"" -#: describe.c:1953 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "\"%s.%s\" 로그 미사용 인덱스" -#: describe.c:1956 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "\"%s.%s\" 인덱스" -#: describe.c:1961 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "\"%s.%s\" 로그 미사용 파티션 인덱스" -#: describe.c:1964 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "\"%s.%s\" 파티션 인덱스" -#: describe.c:1969 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "\"%s.%s\" 특수 릴레이션(relation)" - -#: describe.c:1973 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "\"%s.%s\" TOAST 테이블" -#: describe.c:1977 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "\"%s.%s\" 복합자료형" -#: describe.c:1981 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "\"%s.%s\" 외부 테이블" -#: describe.c:1986 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "로그 미사용 파티션 테이블 \"%s.%s\"" -#: describe.c:1989 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "\"%s.%s\" 파티션 테이블" -#: describe.c:2005 describe.c:4178 +#: describe.c:2024 describe.c:4343 msgid "Collation" -msgstr "Collation" +msgstr "정렬규칙" -#: describe.c:2006 describe.c:4185 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "NULL허용" -#: describe.c:2007 describe.c:4186 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "초기값" -#: describe.c:2010 +#: describe.c:2029 msgid "Key?" -msgstr "" +msgstr "Key?" -#: describe.c:2012 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "정의" -#: describe.c:2014 describe.c:5296 describe.c:5380 describe.c:5451 -#: describe.c:5515 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "FDW 옵션" -#: describe.c:2016 +#: describe.c:2035 msgid "Storage" msgstr "스토리지" -#: describe.c:2018 +#: describe.c:2037 +msgid "Compression" +msgstr "압축" + +#: describe.c:2039 msgid "Stats target" msgstr "통계수집량" -#: describe.c:2131 +#: describe.c:2175 #, 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:2188 msgid "No partition constraint" msgstr "파티션 제약 조건 없음" -#: describe.c:2145 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "파티션 제약조건: %s" -#: describe.c:2169 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "파티션 키: %s" -#: describe.c:2195 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "소속 테이블: \"%s.%s\"" -#: describe.c:2266 +#: describe.c:2309 msgid "primary key, " msgstr "기본키, " -#: describe.c:2268 -msgid "unique, " -msgstr "고유, " +#: describe.c:2312 +msgid "unique" +msgstr "고유" -#: describe.c:2274 +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls not distinct" + +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "적용테이블: \"%s.%s\"" -#: describe.c:2278 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", predicate (%s)" -#: describe.c:2281 +#: describe.c:2329 msgid ", clustered" msgstr ", 클러스됨" -#: describe.c:2284 +#: describe.c:2332 msgid ", invalid" msgstr ", 잘못됨" -#: describe.c:2287 +#: describe.c:2335 msgid ", deferrable" msgstr ", 지연가능" -#: describe.c:2290 +#: describe.c:2338 msgid ", initially deferred" msgstr ", 트랜잭션단위지연" -#: describe.c:2293 +#: describe.c:2341 msgid ", replica identity" msgstr ", 복제 식별자" -#: describe.c:2360 +#: describe.c:2395 msgid "Indexes:" msgstr "인덱스들:" -#: describe.c:2444 +#: describe.c:2478 msgid "Check constraints:" msgstr "체크 제약 조건:" -#: describe.c:2512 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "참조키 제약 조건:" -#: describe.c:2575 +#: describe.c:2609 msgid "Referenced by:" msgstr "다음에서 참조됨:" -#: describe.c:2625 +#: describe.c:2659 msgid "Policies:" msgstr "정책:" -#: describe.c:2628 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "정책 (로우단위 보안정책 강제 활성화):" -#: describe.c:2631 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "정책 (로우단위 보안정책 활성화): (없음)" -#: describe.c:2634 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "정책 (로우단위 보안정책 강제 활성화): (없음)" -#: describe.c:2637 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "정책 (로우단위 보안정책 비활성화):" -#: describe.c:2705 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "통계정보 객체:" -#: describe.c:2819 describe.c:2923 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "룰(rule)들:" -#: describe.c:2822 +#: describe.c:2940 msgid "Disabled rules:" msgstr "사용중지된 규칙:" -#: describe.c:2825 +#: describe.c:2943 msgid "Rules firing always:" msgstr "항상 발생하는 규칙:" -#: describe.c:2828 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "복제본에서만 발생하는 규칙:" -#: describe.c:2868 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "발행자:" -#: describe.c:2906 +#: describe.c:3073 msgid "View definition:" msgstr "뷰 정의:" -#: describe.c:3053 +#: describe.c:3236 msgid "Triggers:" msgstr "트리거들:" -#: describe.c:3057 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "사용중지된 사용자 트리거:" -#: describe.c:3059 -msgid "Disabled triggers:" -msgstr "사용중지된 트리거:" - -#: describe.c:3062 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "사용중지된 내부 트리거:" -#: describe.c:3065 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "항상 발생하는 트리거:" -#: describe.c:3068 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "복제본에서만 발생하는 트리거:" -#: describe.c:3140 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "서버: %s" -#: describe.c:3148 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "FDW 옵션들: (%s)" -#: describe.c:3169 +#: describe.c:3348 msgid "Inherits" msgstr "상속" -#: describe.c:3229 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "파티션 테이블 수: %d" -#: describe.c:3238 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "파티션 테이블 수: %d (\\d+ 명령으로 볼 수 있음)" -#: describe.c:3240 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "하위 테이블 수: %d (\\d+ 명령으로 볼 수 있음)" -#: describe.c:3247 +#: describe.c:3431 msgid "Child tables" msgstr "하위 테이블" -#: describe.c:3247 +#: describe.c:3431 msgid "Partitions" msgstr "파티션들" -#: describe.c:3276 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "자료형의 typed 테이블: %s" -#: describe.c:3292 +#: describe.c:3478 msgid "Replica Identity" msgstr "복제 식별자" -#: describe.c:3305 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "OID 사용: yes" -#: describe.c:3314 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "접근 방법: %s" -#: describe.c:3394 +#: describe.c:3579 #, 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:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", \"%s\" 테이블스페이스" -#: describe.c:3499 +#: describe.c:3668 msgid "List of roles" msgstr "롤 목록" -#: describe.c:3501 +#: describe.c:3670 msgid "Role name" msgstr "롤 이름" -#: describe.c:3502 +#: describe.c:3671 msgid "Attributes" msgstr "속성" -#: describe.c:3503 +#: describe.c:3673 msgid "Member of" msgstr "소속 그룹:" -#: describe.c:3514 +#: describe.c:3684 msgid "Superuser" msgstr "슈퍼유저" -#: describe.c:3517 +#: describe.c:3687 msgid "No inheritance" msgstr "상속 없음" -#: describe.c:3520 +#: describe.c:3690 msgid "Create role" msgstr "롤 만들기" -#: describe.c:3523 +#: describe.c:3693 msgid "Create DB" msgstr "DB 만들기" -#: describe.c:3526 +#: describe.c:3696 msgid "Cannot login" msgstr "로그인할 수 없음" -#: describe.c:3530 +#: describe.c:3699 msgid "Replication" msgstr "복제" -#: describe.c:3534 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS 통과" -#: describe.c:3543 +#: describe.c:3712 msgid "No connections" msgstr "연결 없음" -#: describe.c:3545 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d개 연결" -#: describe.c:3555 +#: describe.c:3724 msgid "Password valid until " msgstr "비밀번호 만료기한: " -#: describe.c:3605 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "이 서버(%s 버전)는 데이터베이스 개별 롤 설정을 지원하지 않습니다." - -#: describe.c:3618 +#: describe.c:3777 msgid "Role" msgstr "롤" -#: describe.c:3619 +#: describe.c:3778 msgid "Database" msgstr "데이터베이스" -#: describe.c:3620 +#: describe.c:3779 msgid "Settings" msgstr "설정" -#: describe.c:3641 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "\"%s\" 롤과 \"%s\" 데이터베이스에 대한 특정 설정이 없습니다." -#: describe.c:3644 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "\"%s\" 롤용 특정 설정이 없음." -#: describe.c:3647 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "추가 설정 없음." -#: describe.c:3652 +#: describe.c:3814 msgid "List of settings" msgstr "설정 목록" -#: describe.c:3723 +#: describe.c:3885 msgid "index" msgstr "인덱스" -#: describe.c:3725 -msgid "special" -msgstr "특수" +#: describe.c:3887 +msgid "TOAST table" +msgstr "TOAST 테이블" -#: describe.c:3728 describe.c:3938 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "파티션_인덱스" -#: describe.c:3752 +#: describe.c:3910 msgid "permanent" -msgstr "" +msgstr "영구" -#: describe.c:3753 +#: describe.c:3911 msgid "temporary" -msgstr "" +msgstr "임시" -#: describe.c:3754 +#: describe.c:3912 msgid "unlogged" -msgstr "" +msgstr "로깅안함" -#: describe.c:3755 +#: describe.c:3913 msgid "Persistence" -msgstr "" +msgstr "지속성" + +#: describe.c:3929 +msgid "Access method" +msgstr "접근 방법" -#: describe.c:3851 +#: describe.c:4015 msgid "List of relations" -msgstr "릴레이션(relation) 목록" +msgstr "릴레이션 목록" -#: describe.c:3899 +#: describe.c:4063 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "이 서버(%s 버전)는 파티션 테이블 기능을 지원하지 않습니다." -#: describe.c:3910 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "파티션 인덱스 목록" -#: describe.c:3912 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "파티션 테이블 목록" -#: describe.c:3916 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "파티션 릴레이션(relation) 목록" -#: describe.c:3947 +#: describe.c:4111 msgid "Parent name" msgstr "상위 이름" -#: describe.c:3960 +#: describe.c:4124 msgid "Leaf partition size" msgstr "하위 파티션 크기" -#: describe.c:3963 describe.c:3969 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "전체 크기" -#: describe.c:4101 +#: describe.c:4258 msgid "Trusted" msgstr "신뢰됨" -#: describe.c:4109 +#: describe.c:4267 msgid "Internal language" msgstr "내부 언어" -#: describe.c:4110 +#: describe.c:4268 msgid "Call handler" msgstr "호출 핸들러" -#: describe.c:4111 describe.c:5283 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "유효성 검사기" -#: describe.c:4114 +#: describe.c:4270 msgid "Inline handler" msgstr "인라인 핸들러" -#: describe.c:4142 +#: describe.c:4305 msgid "List of languages" msgstr "언어 목록" -#: describe.c:4187 +#: describe.c:4346 msgid "Check" msgstr "체크" -#: describe.c:4229 +#: describe.c:4390 msgid "List of domains" msgstr "도메인(domain) 목록" -#: describe.c:4263 +#: describe.c:4424 msgid "Source" msgstr "소스" -#: describe.c:4264 +#: describe.c:4425 msgid "Destination" msgstr "설명" -#: describe.c:4266 describe.c:6101 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "초기값?" -#: describe.c:4303 +#: describe.c:4469 msgid "List of conversions" msgstr "문자코드변환규칙(conversion) 목록" -#: describe.c:4342 +#: describe.c:4497 +msgid "Parameter" +msgstr "매개변수" + +#: describe.c:4498 +msgid "Value" +msgstr "값" + +#: describe.c:4505 +msgid "Context" +msgstr "컨텍스트" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "환경설정 매개변수 목록" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "기본값이 아닌 값으로 지정된 환경설정 매개변수 목록" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "이 서버(%s 버전)는 이벤트 트리거를 지원하지 않습니다." + +#: describe.c:4587 msgid "Event" msgstr "이벤트" -#: describe.c:4344 +#: describe.c:4589 msgid "enabled" msgstr "활성화" -#: describe.c:4345 +#: describe.c:4590 msgid "replica" msgstr "replica" -#: describe.c:4346 +#: describe.c:4591 msgid "always" msgstr "항상" -#: describe.c:4347 +#: describe.c:4592 msgid "disabled" msgstr "비활성화" -#: describe.c:4348 describe.c:5997 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "활성화" -#: describe.c:4350 +#: describe.c:4595 msgid "Tags" msgstr "태그" -#: describe.c:4369 +#: describe.c:4619 msgid "List of event triggers" msgstr "이벤트 트리거 목록" -#: describe.c:4398 +#: describe.c:4646 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "이 서버(%s 버전)에서 확장 통계정보를 지원하지 않습니다." + +#: describe.c:4683 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4684 +msgid "Dependencies" +msgstr "Dependencies" + +#: describe.c:4694 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4718 +msgid "List of extended statistics" +msgstr "확장 통계정보 목록" + +#: describe.c:4745 msgid "Source type" msgstr "Source 자료형" -#: describe.c:4399 +#: describe.c:4746 msgid "Target type" msgstr "Target 자료형" -#: describe.c:4430 +#: describe.c:4770 msgid "in assignment" msgstr "in assignment" -#: describe.c:4432 +#: describe.c:4772 msgid "Implicit?" msgstr "Implicit?" -#: describe.c:4487 +#: describe.c:4831 msgid "List of casts" msgstr "형변환자 목록" -#: describe.c:4515 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "이 서버(%s 버전)는 문자 정렬(collation) 기능을 지원하지 않습니다." - -#: describe.c:4536 describe.c:4540 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "제공자" -#: describe.c:4546 describe.c:4551 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" -msgstr "" +msgstr "Deterministic?" -#: describe.c:4586 +#: describe.c:4938 msgid "List of collations" msgstr "문자 정렬 목록" -#: describe.c:4645 +#: describe.c:5000 msgid "List of schemas" -msgstr "스키마(schema) 목록" - -#: describe.c:4670 describe.c:4917 describe.c:4988 describe.c:5059 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "이 서버(%s 버전)에서 전문 검색을 지원하지 않습니다." +msgstr "스키마 목록" -#: describe.c:4705 +#: describe.c:5117 msgid "List of text search parsers" msgstr "텍스트 검색 파서 목록" -#: describe.c:4750 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "\"%s\"(이)라는 전문 검색 분석기를 찾지 못했습니다." -#: describe.c:4753 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "특정 전문 검색 분석기를 찾지 못했습니다." -#: describe.c:4828 +#: describe.c:5245 msgid "Start parse" msgstr "구문 분석 시작" -#: describe.c:4829 +#: describe.c:5246 msgid "Method" msgstr "방법" -#: describe.c:4833 +#: describe.c:5250 msgid "Get next token" msgstr "다음 토큰 가져오기" -#: describe.c:4835 +#: describe.c:5252 msgid "End parse" msgstr "구문 분석 종료" -#: describe.c:4837 +#: describe.c:5254 msgid "Get headline" msgstr "헤드라인 가져오기" -#: describe.c:4839 +#: describe.c:5256 msgid "Get token types" msgstr "토큰 형식 가져오기" -#: describe.c:4850 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "\"%s.%s\" 텍스트 검색 파서" -#: describe.c:4853 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "\"%s\" 텍스트 검색 파서" -#: describe.c:4872 +#: describe.c:5289 msgid "Token name" msgstr "토큰 이름" -#: describe.c:4883 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "\"%s.%s\" 파서의 토큰 형식" -#: describe.c:4886 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "\"%s\" 파서의 토큰 형식" -#: describe.c:4940 +#: describe.c:5350 msgid "Template" msgstr "템플릿" -#: describe.c:4941 +#: describe.c:5351 msgid "Init options" msgstr "초기화 옵션" -#: describe.c:4963 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "텍스트 검색 사전 목록" -#: describe.c:5006 +#: describe.c:5411 msgid "Init" msgstr "초기화" -#: describe.c:5007 +#: describe.c:5412 msgid "Lexize" msgstr "Lexize" -#: describe.c:5034 +#: describe.c:5444 msgid "List of text search templates" msgstr "텍스트 검색 템플릿 목록" -#: describe.c:5094 +#: describe.c:5499 msgid "List of text search configurations" msgstr "텍스트 검색 구성 목록" -#: describe.c:5140 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "\"%s\"(이)라는 텍스트 검색 구성을 찾지 못했습니다." -#: describe.c:5143 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "특정 텍스트 검색 구성을 찾지 못했습니다." -#: describe.c:5209 +#: describe.c:5619 msgid "Token" msgstr "토큰" -#: describe.c:5210 +#: describe.c:5620 msgid "Dictionaries" msgstr "사전" -#: describe.c:5221 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "텍스트 검색 구성 \"%s.%s\"" -#: describe.c:5224 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "텍스트 검색 구성 \"%s\"" -#: describe.c:5228 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2169,7 +2206,7 @@ msgstr "" "\n" "파서: \"%s.%s\"" -#: describe.c:5231 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2178,237 +2215,253 @@ msgstr "" "\n" "파서: \"%s\"" -#: describe.c:5265 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "이 서버(%s 버전)에서 외부 데이터 래퍼를 지원하지 않습니다." - -#: describe.c:5323 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "외부 데이터 래퍼 목록" -#: describe.c:5348 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "이 서버(%s 버전)에서 외부 서버를 지원하지 않습니다." - -#: describe.c:5361 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "외부 데이터 래퍼" -#: describe.c:5379 describe.c:5584 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "버전" -#: describe.c:5405 +#: describe.c:5799 msgid "List of foreign servers" msgstr "외부 서버 목록" -#: describe.c:5430 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "이 서버(%s 버전)에서 사용자 매핑을 지원하지 않습니다." - -#: describe.c:5440 describe.c:5504 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "서버" -#: describe.c:5441 +#: describe.c:5825 msgid "User name" msgstr "사용자 이름" -#: describe.c:5466 +#: describe.c:5855 msgid "List of user mappings" msgstr "사용자 매핑 목록" -#: describe.c:5491 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "이 서버(%s 버전)에서 외부 테이블을 지원하지 않습니다." - -#: describe.c:5544 +#: describe.c:5928 msgid "List of foreign tables" msgstr "외부 테이블 목록" -#: describe.c:5569 describe.c:5626 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "이 서버(%s 버전)에서 확장기능을 지원하지 않습니다." - -#: describe.c:5601 +#: describe.c:5980 msgid "List of installed extensions" msgstr "설치된 확장기능 목록" -#: describe.c:5654 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\" 이름의 확장 기능 모듈을 찾을 수 없습니다." -#: describe.c:5657 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "추가할 확장 기능 모듈이 없음." -#: describe.c:5701 +#: describe.c:6075 msgid "Object description" msgstr "개체 설명" -#: describe.c:5711 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "\"%s\" 확장 기능 안에 포함된 객체들" -#: describe.c:5740 describe.c:5816 +#: describe.c:6126 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "적당하지 않은 qualified 이름 입니다 (너무 많은 점이 있네요): %s" + +#: describe.c:6140 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "서로 다른 데이터베이스간의 참조는 구현되어있지 않습니다: %s" + +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "이 서버(%s 버전)는 논리 복제 발행 기능을 지원하지 않습니다." -#: describe.c:5757 describe.c:5894 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "모든 테이블" -#: describe.c:5758 describe.c:5895 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Inserts" -#: describe.c:5759 describe.c:5896 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Updates" -#: describe.c:5760 describe.c:5897 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Deletes" -#: describe.c:5764 describe.c:5899 +#: describe.c:6195 describe.c:6381 msgid "Truncates" -msgstr "" +msgstr "Truncates" -#: describe.c:5768 describe.c:5901 +#: describe.c:6199 describe.c:6383 msgid "Via root" -msgstr "" +msgstr "Via root" -#: describe.c:5785 +#: describe.c:6221 msgid "List of publications" msgstr "발행 목록" -#: describe.c:5858 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\" 이름의 발행 없음." -#: describe.c:5861 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "발행 없음." -#: describe.c:5890 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "%s 발행" -#: describe.c:5938 +#: describe.c:6425 msgid "Tables:" -msgstr "테이블" +msgstr "테이블들:" -#: describe.c:5982 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "다음 스키마의 모든 테이블:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "이 서버(%s 버전)는 구독 기능을 지원하지 않습니다." -#: describe.c:5998 +#: describe.c:6497 msgid "Publication" msgstr "발행" -#: describe.c:6005 +#: describe.c:6506 +msgid "Binary" +msgstr "바이너리" + +#: describe.c:6507 +msgid "Streaming" +msgstr "스트리밍" + +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "2단계 커밋" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "오류가 생기면 비활성" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "동기식 커밋" -#: describe.c:6006 +#: describe.c:6521 msgid "Conninfo" msgstr "연결정보" -#: describe.c:6028 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "LSN 건너뜀" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "구독 목록" -#: describe.c:6095 describe.c:6184 describe.c:6270 describe.c:6353 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" -msgstr "" +msgstr "AM" -#: describe.c:6096 +#: describe.c:6617 msgid "Input type" msgstr "입력 자료형" -#: describe.c:6097 +#: describe.c:6618 msgid "Storage type" msgstr "스토리지 유형" -#: describe.c:6098 +#: describe.c:6619 msgid "Operator class" msgstr "연산자 클래스" -#: describe.c:6110 describe.c:6185 describe.c:6271 describe.c:6354 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "연산자 부류" -#: describe.c:6143 +#: describe.c:6667 msgid "List of operator classes" msgstr "연산자 클래스 목록" -#: describe.c:6186 +#: describe.c:6714 msgid "Applicable types" -msgstr "" +msgstr "Applicable types" -#: describe.c:6225 +#: describe.c:6756 msgid "List of operator families" msgstr "연산자 부류 목록" -#: describe.c:6272 +#: describe.c:6807 msgid "Operator" msgstr "연산자" -#: describe.c:6273 +#: describe.c:6808 msgid "Strategy" msgstr "전략번호" -#: describe.c:6274 +#: describe.c:6809 msgid "ordering" -msgstr "" +msgstr "ordering" -#: describe.c:6275 +#: describe.c:6810 msgid "search" -msgstr "" +msgstr "search" -#: describe.c:6276 +#: describe.c:6811 msgid "Purpose" -msgstr "" +msgstr "Purpose" -#: describe.c:6281 +#: describe.c:6816 msgid "Sort opfamily" msgstr "정렬 연산자 부류" -#: describe.c:6312 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "연산자 부류 소속 연산자 목록" -#: describe.c:6355 +#: describe.c:6902 msgid "Registered left type" msgstr "등록된 왼쪽 자료형" -#: describe.c:6356 +#: describe.c:6903 msgid "Registered right type" msgstr "등록된 오른쪽 자료형" -#: describe.c:6357 +#: describe.c:6904 msgid "Number" -msgstr "" +msgstr "번호" -#: describe.c:6393 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "연산자 부류 소속 지원 함수 목록" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "대형 객체들" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2416,13 +2469,11 @@ msgstr "" "psql은 PostgreSQL 대화식 터미널입니다.\n" "\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "사용법:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2430,38 +2481,33 @@ msgstr "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "일반 옵션:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid "" " -c, --command=COMMAND run only single command (SQL or internal) and " "exit\n" msgstr "" " -c, --command=COMMAND 하나의 명령(SQL 또는 내부 명령)만 실행하고 끝냄\n" -#: help.c:83 +#: help.c:85 #, c-format msgid "" " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DBNAME 연결할 데이터베이스 이름(기본 값: \"%s\")\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME 파일 안에 지정한 명령을 실행하고 끝냄\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr "" " -l, --list 사용 가능한 데이터베이스 목록을 표시하고 끝냄\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2471,18 +2517,15 @@ msgstr "" " psql 변수 NAME을 VALUE로 설정\n" " (예, -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 시작 파일(~/.psqlrc)을 읽지 않음\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-" @@ -2491,25 +2534,21 @@ msgstr "" " -1 (\"one\"), --single-transaction\n" " 명령 파일을 하나의 트랜잭션으로 실행\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] 이 도움말을 표시하고 종료\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr "" " --help=commands psql 내장명령어(\\문자로 시작하는)를 표시하고 종" "료\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 특별 변수들 보여주고, 종료\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2517,64 +2556,53 @@ msgstr "" "\n" "입출력 옵션:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all 스크립트의 모든 입력 표시\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 실패한 명령들 출력\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries 서버로 보낸 명령 표시\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid "" " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 내부 명령이 생성하는 쿼리 표시\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME 세션 로그를 파일로 보냄\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid "" " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline 확장된 명령행 편집 기능을 사용중지함(readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 쿼리 결과를 파일(또는 |파이프)로 보냄\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid "" " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet 자동 실행(메시지 없이 쿼리 결과만 표시)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step 단독 순차 모드(각 쿼리 확인)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid "" " -S, --single-line single-line mode (end of line terminates SQL " "command)\n" msgstr " -S, --single-line 한 줄 모드(줄 끝에서 SQL 명령이 종료됨)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2582,18 +2610,16 @@ msgstr "" "\n" "출력 형식 옵션:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align 정렬되지 않은 표 형태의 출력 모드\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid "" " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV (쉼표-분리 자료) 테이블 출력 모드\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2604,21 +2630,18 @@ msgstr "" " unaligned 출력용 필드 구분자 설정(기본 값: \"%s" "\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML 표 형태 출력 모드\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid "" " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset " "command)\n" msgstr "" " -P, --pset=VAR[=ARG] 인쇄 옵션 VAR을 ARG로 설정(\\pset 명령 참조)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: " @@ -2628,26 +2651,22 @@ msgstr "" " unaligned 출력용 레코드 구분자 설정\n" " (기본 값: 줄바꿈 문자)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 행만 인쇄\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid "" " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, " "border)\n" msgstr "" " -T, --table-attr=TEXT HTML table 태그 속성 설정(예: width, border)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 확장된 표 형태로 출력\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero " @@ -2656,8 +2675,7 @@ msgstr "" " -z, --field-separator-zero\n" " unaligned 출력용 필드 구분자를 0 바이트로 지정\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero " @@ -2666,8 +2684,7 @@ msgstr "" " -0, --record-separator-zero\n" " unaligned 출력용 레코드 구분자를 0 바이트로 지정\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2675,7 +2692,7 @@ msgstr "" "\n" "연결 옵션들:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory " @@ -2684,11 +2701,11 @@ msgstr "" " -h, --host=HOSTNAME 데이터베이스 서버 호스트 또는 소켓 디렉터리\n" " (기본값: \"%s\")\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "로컬 소켓" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT 데이터베이스 서버 포트(기본 값: \"%s\")\n" @@ -2698,20 +2715,17 @@ msgstr " -p, --port=PORT 데이터베이스 서버 포트(기본 값: msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME 데이터베이스 사용자 이름(기본 값: \"%s\")\n" -#: help.c:141 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: help.c:142 -#, c-format +#: help.c:143 msgid "" " -W, --password force password prompt (should happen " "automatically)\n" msgstr " -W, --password 암호 입력 프롬프트 보임(자동으로 처리함)\n" -#: help.c:144 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help" @@ -2726,109 +2740,98 @@ msgstr "" "설명서에서 psql 섹션을 참조하십시오.\n" "\n" -#: help.c:147 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "문제점 보고 주소: <%s>\n" -#: help.c:148 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페이지: <%s>\n" -#: help.c:174 -#, c-format +#: help.c:191 msgid "General\n" msgstr "일반\n" -#: help.c:175 -#, c-format +#: help.c:192 msgid "" " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL 사용법 및 저작권 정보 표시\n" -#: help.c:176 -#, c-format +#: help.c:193 msgid "" -" \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +" \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [칼럼들] 쿼리를 실행하고, 피봇 테이블 형태로 자료를 보여줌\n" -#: help.c:177 -#, c-format +#: help.c:194 msgid "" " \\errverbose show most recent error message at maximum " "verbosity\n" msgstr "" " \\errverbose 최대 자세히 보기 상태에서 최근 오류를 다 보여줌\n" -#: help.c:178 -#, c-format +#: help.c:195 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" +" \\g [(OPTIONS)] [FILE] 쿼리 실행 (결과는 지정한 파일로, 또는 |파이프로);\n" " \\g 명령에서 인자가 없으면 세미콜론과 같음\n" -#: help.c:180 -#, c-format +#: help.c:197 msgid "" " \\gdesc describe result of query, without executing it\n" msgstr "" " \\gdesc 쿼리를 실행하지 않고 그 결과 칼럼과 자료형을 출력\n" -#: help.c:181 -#, c-format +#: help.c:198 msgid "" " \\gexec execute query, then execute each value in its " "result\n" msgstr " \\gexec 쿼리를 실행하고, 그 결과를 각각 실행 함\n" -#: help.c:182 -#, c-format +#: help.c:199 msgid "" -" \\gset [PREFIX] execute query and store results in psql variables\n" +" \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] 쿼리 실행 뒤 그 결과를 psql 변수로 저장\n" -#: help.c:183 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, 출력을 확장 모드로 강제함\n" +msgstr "" +" \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, 출력을 확장 모드로 강제함\n" -#: help.c:184 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q psql 종료\n" -#: help.c:185 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] 매 초마다 쿼리 실행\n" -#: help.c:188 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "도움말\n" -#: help.c:190 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] psql 역슬래시 명령어 설명\n" -#: help.c:191 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options psql 명령행 옵션 도움말 보기\n" -#: help.c:192 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables psql 환경 설정 변수들에 설명 보기\n" -#: help.c:193 -#, c-format +#: help.c:210 msgid "" " \\h [NAME] help on syntax of SQL commands, * for all " "commands\n" @@ -2836,56 +2839,46 @@ msgstr "" " \\h [NAME] SQL 명령 구문 도움말, 모든 명령을 표시하려면 * 입" "력\n" -#: help.c:196 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "쿼리 버퍼\n" -#: help.c:197 -#, c-format +#: help.c:214 msgid "" " \\e [FILE] [LINE] edit the query buffer (or file) with external " "editor\n" msgstr " \\e [FILE] [LINE] 외부 편집기로 쿼리 버퍼(또는 파일) 편집\n" -#: help.c:198 -#, c-format +#: help.c:215 msgid "" " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] 외부 편집기로 해당 함수 내용 편집\n" -#: help.c:199 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] 외부 편집기로 해당 뷰 정의 편집\n" -#: help.c:200 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p 쿼리 버퍼의 내용 표시\n" -#: help.c:201 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 쿼리 버퍼 초기화(모두 지움)\n" -#: help.c:203 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] 기록 표시 또는 파일에 저장\n" -#: help.c:205 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE 쿼리 버퍼를 파일에 기록\n" -#: help.c:208 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "입력/출력\n" -#: help.c:209 -#, c-format +#: help.c:226 msgid "" " \\copy ... perform SQL COPY with data stream to the client " "host\n" @@ -2893,367 +2886,340 @@ msgstr "" " \\copy ... 클라이언트 호스트에 있는 자료를 SQL COPY 명령 실" "행\n" -#: help.c:210 -#, c-format +#: help.c:227 msgid "" " \\echo [-n] [STRING] write string to standard output (-n for no " "newline)\n" msgstr " \\echo [-n] [STRING] 문자열을 표준 출력에 기록 (-n 줄바꿈 없음)\n" -#: help.c:211 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE 파일에서 명령 실행\n" -#: help.c:212 -#, c-format +#: help.c:229 msgid "" " \\ir FILE as \\i, but relative to location of current " "script\n" msgstr "" " \\ir FILE \\i 명령과 같으나, 경로가 현재 위치 기준 상대적\n" -#: help.c:213 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] 모든 쿼리 결과를 파일 또는 |파이프로 보냄\n" -#: help.c:214 -#, c-format +#: help.c:231 msgid "" " \\qecho [-n] [STRING] write string to \\o output stream (-n for no " "newline)\n" -msgstr " \\qecho [-n] [STRING] 문자열을 \\o 출력 스트림에 기록 (-n 줄바꿈 없음)\n" +msgstr "" +" \\qecho [-n] [STRING] 문자열을 \\o 출력 스트림에 기록 (-n 줄바꿈 없음)\n" -#: help.c:215 -#, c-format +#: help.c:232 msgid "" " \\warn [-n] [STRING] write string to standard error (-n for no " "newline)\n" msgstr " \\warn [-n] [STRING] 문자열을 stderr에 기록 (-n 줄바꿈 없음)\n" -#: help.c:218 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "조건문\n" -#: help.c:219 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 조건문 시작\n" -#: help.c:220 -#, c-format +#: help.c:237 msgid "" " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR else if 구문 시작\n" -#: help.c:221 -#, c-format +#: help.c:238 msgid "" " \\else final alternative within current conditional " "block\n" msgstr " \\else 조건문의 그 외 조건\n" -#: help.c:222 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif 조건문 끝\n" -#: help.c:225 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "정보보기\n" -#: help.c:226 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (옵션: S = 시스템 개체 표시, + = 추가 상세 정보)\n" -#: help.c:227 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] 테이블, 뷰 및 시퀀스 목록\n" -#: help.c:228 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME 테이블, 뷰, 시퀀스 또는 인덱스 설명\n" -#: help.c:229 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] 집계 함수 목록\n" -#: help.c:230 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] 접근 방법 목록\n" -#: help.c:231 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 연산자 클래스 목록\n" -#: help.c:232 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 연산자 부류 목록\n" -#: help.c:233 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 연산자 부류 소속 연산자 목록\n" -#: help.c:234 -#, c-format +#: help.c:251 msgid "" -" \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr "" -" \\dAp [AMPTRN [OPFPTRN]] 연산자 가족에 포함된 지원 함수 목록\n" +" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 연산자 가족에 포함된 지원 함수 목록\n" -#: help.c:235 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] 테이블스페이스 목록\n" -#: help.c:236 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] 문자셋 변환자 목록\n" -#: help.c:237 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] 환경설정 매개변수 목록\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] 자료형 변환자 목록\n" -#: help.c:238 -#, c-format +#: help.c:256 msgid "" " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [PATTERN] 다른 곳에서는 볼 수 없는 객체 설명을 보여줌\n" -#: help.c:239 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] 도메인 목록\n" -#: help.c:240 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] 기본 접근권한 목록\n" -#: help.c:241 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] 외부 테이블 목록\n" -#: help.c:242 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATTERN] 외부 테이블 목록\n" - -#: help.c:243 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] 외부 서버 목록\n" -#: help.c:244 -#, c-format +#: help.c:261 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PATTERN] 외부 테이블 목록\n" + +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] 사용자 매핑 목록\n" -#: help.c:245 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] 외부 데이터 래퍼 목록\n" -#: help.c:246 -#, c-format +#: help.c:264 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+] [PATRN] [agg/normal/procedures/trigger/window] 함수 목록\n" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" [agg/normal/procedure/trigger/window 단일] 함수 목" +"록\n" -#: help.c:247 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] 텍스트 검색 구성 목록\n" -#: help.c:248 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] 텍스트 검색 사전 목록\n" -#: help.c:249 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] 텍스트 검색 파서 목록\n" -#: help.c:250 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] 텍스트 검색 템플릿 목록\n" -#: help.c:251 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] 롤 목록\n" -#: help.c:252 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] 인덱스 목록\n" -#: help.c:253 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl 큰 개체 목록, \\lo_list 명령과 같음\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] 큰 개체 목록, \\lo_list 명령과 같음\n" -#: help.c:254 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] 프로시져 언어 목록\n" -#: help.c:255 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] materialized 뷰 목록\n" -#: help.c:256 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] 스키마 목록\n" -#: help.c:257 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [PATTERN] 연산자 목록\n" +#: help.c:276 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" 연산자 목록\n" -#: help.c:258 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] collation 목록\n" -#: help.c:259 -#, c-format +#: help.c:279 msgid "" " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [PATTERN] 테이블, 뷰 및 시퀀스 액세스 권한 목록\n" -#: help.c:260 -#, c-format +#: help.c:280 msgid "" " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations " "[n=nested]\n" msgstr "" " \\dP[itn+] [PATTERN] 파티션 릴레이션 목록 [인덱스/테이블만] [n=nested]\n" -#: help.c:261 -#, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PATRN1 [PATRN2]] 데이터베이스별 롤 설정 목록\n" +#: help.c:281 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] per-database 롤 설정 목록\n" -#: help.c:262 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] 복제 발행 목록\n" -#: help.c:263 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] 복제 구독 목록\n" -#: help.c:264 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] 시퀀스 목록\n" -#: help.c:265 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] 테이블 목록\n" -#: help.c:266 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] 데이터 형식 목록\n" -#: help.c:267 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] 롤 목록\n" -#: help.c:268 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] 뷰 목록\n" -#: help.c:269 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] 확장 모듈 목록\n" -#: help.c:270 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] 이벤트 트리거 목록\n" +#: help.c:290 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] 확장 통계 정보 목록\n" -#: help.c:271 -#, c-format +#: help.c:291 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] 이벤트 트리거 목록\n" + +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] 데이터베이스 목록\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] 함수이름 함수 정의 보기\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] 뷰이름 뷰 정의 보기\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [PATTERN] \\dp와 같음\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "큰 개체\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE 큰 개체를 파일로 저장\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENT]\n" +" 파일에서 큰 개체 가져오기\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] 큰 개체 목록\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID 큰 개체 삭제\n" + +#: help.c:306 msgid "Formatting\n" msgstr "출력 형식\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid "" " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a 정렬되지 않은 출력 모드와 정렬된 출력 모드 전환\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [STRING] 테이블 제목 설정 또는 값이 없는 경우 설정 안 함\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid "" " \\f [STRING] show or set field separator for unaligned query " "output\n" msgstr "" " \\f [STRING] unaligned 출력에 대해 필드 구분자 표시 또는 설정\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML 출력 모드 전환(현재 %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3271,30 +3237,32 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] 행만 표시(현재 %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid "" " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [STRING] HTML
태그 속성 설정 또는 비었는 경우 설정 " "안 함\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] 확장된 출력 전환 (현재 %s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "자동" + +#: help.c:326 msgid "Connection\n" msgstr "연결\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3303,8 +3271,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 새 데이터베이스에 접속 (현재 \"%s\")\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3312,62 +3279,56 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 새 데이터베이스에 접속 (현재 접속해 있지 않음)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid "" " \\conninfo display information about current connection\n" msgstr " \\conninfo 현재 데이터베이스 접속 정보 보기\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] 클라이언트 인코딩 표시 또는 설정\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] 사용자 암호를 안전하게 변경\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "운영 체제\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] 현재 작업 디렉터리 변경\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR 환경 변수값을 psql 변수값으로\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] 환경 변수 지정 및 해제\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] 명령 실행 시간 전환(현재 %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid "" " \\! [COMMAND] execute command in shell or start interactive " "shell\n" msgstr " \\! [COMMAND] 셸 명령 실행 또는 대화식 셸 시작\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "변수\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [TEXT] NAME 사용자에게 내부 변수를 설정하라는 메시지 표시\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid "" " \\set [NAME [VALUE]] set internal variable, or list all if no " "parameters\n" @@ -3375,43 +3336,21 @@ msgstr "" " \\set [NAME [VALUE]] 내부 변수 설정 또는 미지정 경우 모든 변수 목록 표" "시\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME 내부 변수 설정 해제(삭제)\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "큰 개체\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID 큰 개체 작업\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" msgstr "특별한 기능 설정 변수 목록\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "psql 변수들:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3421,8 +3360,7 @@ msgstr "" " 또는 psql 명령 모드에서는 \\set NAME VALUE\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3430,8 +3368,7 @@ msgstr "" " AUTOCOMMIT\n" " 설정 되면, SQL 명령이 정상 실행 되면 자동 커밋 함\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3441,8 +3378,7 @@ msgstr "" " SQL 키워드 자동완성에서 대소문자 처리\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3450,8 +3386,7 @@ msgstr "" " DBNAME\n" " 현재 접속한 데이터베이스 이름\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3461,8 +3396,7 @@ msgstr "" " 입력을 표준 출력으로 보낼 종류\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3472,8 +3406,7 @@ msgstr "" " 지정 되면 psql 내장 명령어의 내부 쿼리를 출력함;\n" " \"noexec\" 값으로 설정하면, 실행되지 않고 쿼리만 보여줌\n" -#: help.c:371 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3481,8 +3414,7 @@ msgstr "" " ENCODING\n" " 현재 클라이언트 인코딩 지정\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3490,8 +3422,7 @@ msgstr "" " ERROR\n" " 마지막 쿼리가 실패했으면 true, 아니면 false\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = " @@ -3500,8 +3431,7 @@ msgstr "" " FETCH_COUNT\n" " 쿼리 결과에 대해서 출력할 최대 로우 개수 (0=제한없음)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3509,8 +3439,15 @@ msgstr "" " HIDE_TABLEAM\n" " 지정하면 테이블 접근 방법을 보여주지 않음\n" -#: help.c:379 -#, c-format +#: help.c:417 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" 지정하면 TOAST 압축 종류 보여주지 않음\n" + +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3518,8 +3455,7 @@ msgstr "" " HISTCONTROL\n" " 명령 내역 처리 방법 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:381 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3527,8 +3463,7 @@ msgstr "" " HISTFILE\n" " 명령 내역을 저장할 파일 이름\n" -#: help.c:383 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3536,8 +3471,7 @@ msgstr "" " HISTSIZE\n" " 명령 내역 최대 보관 개수\n" -#: help.c:385 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3545,8 +3479,7 @@ msgstr "" " HOST\n" " 현재 접속한 데이터베이스 서버 호스트\n" -#: help.c:387 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3554,8 +3487,7 @@ msgstr "" " IGNOREEOF\n" " 대화형 세션 종료를 위한 EOF 개수\n" -#: help.c:389 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3563,8 +3495,7 @@ msgstr "" " LASTOID\n" " 마지막 영향 받은 OID 값\n" -#: help.c:391 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3575,8 +3506,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " 마지막 오류 메시지와 SQLSTATE, 정상이면, 빈 문자열과 \"00000\"\n" -#: help.c:394 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3584,8 +3514,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " 설정하면 오류 발생시에도 트랜잭션 중지 안함 (savepoint 암묵적 사용)\n" -#: help.c:396 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3593,8 +3522,7 @@ msgstr "" " ON_ERROR_STOP\n" " 배치 작업 시 오류가 발생하면 중지함\n" -#: help.c:398 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3602,8 +3530,7 @@ msgstr "" " PORT\n" " 현재 접속한 서버 포트\n" -#: help.c:400 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3611,8 +3538,7 @@ msgstr "" " PROMPT1\n" " 기본 psql 프롬프트 정의\n" -#: help.c:402 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous " @@ -3621,8 +3547,7 @@ msgstr "" " PROMPT2\n" " 아직 구문이 덜 끝난 명령행의 프롬프트\n" -#: help.c:404 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3630,8 +3555,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN 작업시 보일 프롬프트\n" -#: help.c:406 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3639,8 +3563,7 @@ msgstr "" " QUIET\n" " 조용히 실행 (-q 옵션과 같음)\n" -#: help.c:408 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3648,8 +3571,7 @@ msgstr "" " ROW_COUNT\n" " 마지막 쿼리 작업 대상 로우 수, 또는 0\n" -#: help.c:410 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3659,8 +3581,16 @@ msgstr "" " SERVER_VERSION_NUM\n" " 문자열 버전 정보나, 숫자 형식 버전 정보\n" -#: help.c:413 -#, c-format +#: help.c:453 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" 여러 쿼리가 연속하는 경우(\\;) 모든 쿼리 결과를 출력, off면 마지막 결과" +"만\n" + +#: help.c:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3668,8 +3598,7 @@ msgstr "" " SHOW_CONTEXT\n" " 상황별 자세한 메시지 내용 출력 제어 [never, errors, always]\n" -#: help.c:415 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3677,8 +3606,7 @@ msgstr "" " SINGLELINE\n" " 한 줄에 하나의 SQL 명령 실행 (-S 옵션과 같음)\n" -#: help.c:417 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3686,8 +3614,7 @@ msgstr "" " SINGLESTEP\n" " 각 명령을 확인하며 실행 (-s 옵션과 같음)\n" -#: help.c:419 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3695,8 +3622,7 @@ msgstr "" " SQLSTATE\n" " 마지막 쿼리의 SQLSTATE 값, 오류가 없으면 \"00000\"\n" -#: help.c:421 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3704,8 +3630,7 @@ msgstr "" " USER\n" " 현재 접속한 데이터베이스 사용자\n" -#: help.c:423 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3713,8 +3638,7 @@ msgstr "" " VERBOSITY\n" " 오류 출력시 자세히 볼 내용 범위 [default, verbose, terse, sqlstate]\n" -#: help.c:425 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3726,8 +3650,7 @@ msgstr "" " VERSION_NUM\n" " psql 버전 (자세한 버전, 단순한 버전, 숫자형 버전)\n" -#: help.c:430 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3735,8 +3658,7 @@ msgstr "" "\n" "출력 설정들:\n" -#: help.c:432 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3746,8 +3668,7 @@ msgstr "" " 또는 psql 명령 모드에서는 \\pset NAME [VALUE]\n" "\n" -#: help.c:434 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3755,8 +3676,7 @@ msgstr "" " border\n" " 테두리 모양 (숫자)\n" -#: help.c:436 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3764,8 +3684,7 @@ msgstr "" " columns\n" " 줄바꿈을 위한 너비 지정\n" -#: help.c:438 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3773,7 +3692,7 @@ msgstr "" " expanded (또는 x)\n" " 확장된 출력 전환 [on, off, auto]\n" -#: help.c:440 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3782,8 +3701,7 @@ msgstr "" " fieldsep\n" " unaligned 출력용 필드 구분자 (초기값 \"%s\"')\n" -#: help.c:443 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3791,8 +3709,7 @@ msgstr "" " fieldsep_zero\n" " unaligned 출력용 필드 구분자를 0 바이트로 지정\n" -#: help.c:445 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3800,8 +3717,7 @@ msgstr "" " footer\n" " 테이블 꼬리말 보이기 전환 [on, off]\n" -#: help.c:447 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3809,8 +3725,7 @@ msgstr "" " format\n" " 출력 양식 지정 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:449 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3818,8 +3733,7 @@ msgstr "" " linestyle\n" " 테두리 선 모양 지정 [ascii, old-ascii, unicode]\n" -#: help.c:451 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3827,8 +3741,7 @@ msgstr "" " null\n" " null 값 출력 방법\n" -#: help.c:453 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of " @@ -3837,8 +3750,7 @@ msgstr "" " numericlocale\n" " 숫자 출력에서 로케일 기반 천자리 분리 문자 활성화 [on, off]\n" -#: help.c:455 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3846,8 +3758,7 @@ msgstr "" " pager\n" " 외부 페이지 단위 보기 도구 사용 여부 [yes, no, always]\n" -#: help.c:457 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3855,8 +3766,7 @@ msgstr "" " recordsep\n" " unaligned 출력용 레코드(줄) 구분자\n" -#: help.c:459 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3864,8 +3774,7 @@ msgstr "" " recordsep_zero\n" " unaligned 출력용 레코드 구분자를 0 바이트로 지정\n" -#: help.c:461 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3875,8 +3784,7 @@ msgstr "" " html 테이블 태그에 대한 속성이나,\n" " latex-longtable 양식에서 왼쪽 정렬 자료용 칼럼 넓이 지정\n" -#: help.c:464 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3884,8 +3792,7 @@ msgstr "" " title\n" " 테이블 제목 지정\n" -#: help.c:466 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3893,8 +3800,7 @@ msgstr "" " tuples_only\n" " 지정되면, 자료만 보임\n" -#: help.c:468 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3906,8 +3812,7 @@ msgstr "" " unicode_header_linestyle\n" " 유니코드 선 종류 [single, double]\n" -#: help.c:473 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3915,8 +3820,7 @@ msgstr "" "\n" "OS 환경 변수들:\n" -#: help.c:477 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3926,8 +3830,7 @@ msgstr "" " 또는 psql 명령 모드에서는 \\setenv NAME [VALUE]\n" "\n" -#: help.c:479 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3939,8 +3842,7 @@ msgstr "" " 또는 psql 명령 모드에서는 \\setenv NAME [VALUE]\n" "\n" -#: help.c:482 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3948,8 +3850,7 @@ msgstr "" " COLUMNS\n" " 다음 줄로 넘어갈 칼럼 수\n" -#: help.c:484 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3957,8 +3858,7 @@ msgstr "" " PGAPPNAME\n" " application_name 변수값으로 사용됨\n" -#: help.c:486 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3966,8 +3866,7 @@ msgstr "" " PGDATABASE\n" " 접속할 데이터베이스 이름\n" -#: help.c:488 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3975,17 +3874,7 @@ msgstr "" " PGHOST\n" " 서버 접속용 호스트 이름\n" -#: help.c:490 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" 서버 접속 비밀번호 (보안에 취약함)\n" - -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3993,8 +3882,15 @@ msgstr "" " PGPASSFILE\n" " 서버 접속용 비밀번호가 저장된 파일 이름\n" -#: help.c:494 -#, c-format +#: help.c:534 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" 서버 접속 비밀번호 (보안에 취약함)\n" + +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4002,8 +3898,7 @@ msgstr "" " PGPORT\n" " 서버 접속용 포트\n" -#: help.c:496 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4011,8 +3906,7 @@ msgstr "" " PGUSER\n" " 서버 접속용 데이터베이스 사용자 이름\n" -#: help.c:498 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4020,8 +3914,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev 명령에서 사용할 외부 편집기 경로\n" -#: help.c:500 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4029,8 +3922,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " 외부 편집기 호출 시 사용할 줄번호 선택 옵션\n" -#: help.c:502 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4038,8 +3930,7 @@ msgstr "" " PSQL_HISTORY\n" " 사용자 .psql_history 파일 임의 지정\n" -#: help.c:504 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4047,8 +3938,15 @@ msgstr "" " PAGER\n" " 페이지 단위 보기에서 사용할 프로그램\n" -#: help.c:506 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" \\watch 명령에서 사용할 외장 페이저 프로그램 이름\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4056,8 +3954,7 @@ msgstr "" " PSQLRC\n" " 사용자 .psqlrc 파일의 임의 지정\n" -#: help.c:508 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4065,8 +3962,7 @@ msgstr "" " SHELL\n" " \\! 명령에서 사용할 쉘\n" -#: help.c:510 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4074,11 +3970,11 @@ msgstr "" " TMPDIR\n" " 임시 파일을 사용할 디렉터리\n" -#: help.c:554 +#: help.c:616 msgid "Available help:\n" msgstr "사용 가능한 도움말:\n" -#: help.c:642 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4096,7 +3992,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:661 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4110,12 +4006,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 "history를 \"%s\" 파일로 저장할 수 없음: %m" -#: input.c:528 +#: input.c:535 #, c-format msgid "history is not supported by this installation" msgstr "히스토리 기능은 이 설치본에서는 지원하지 않음" @@ -4135,25 +4031,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: escaped" -#: 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" @@ -4162,19 +4050,19 @@ msgstr "" "이 덤프 내용을 데이터베이스에 반영하려면,\n" "pg_restore 명령행 클라이언트를 사용하세요.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "\\? 도움말, Ctrl-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" @@ -4189,25 +4077,25 @@ 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 "마침은 Ctrl-D" -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "마침은 Ctrl-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 "" "쿼리 무시됨; 현재 \\if 블록을 끝내려면 \\endif 또는 Ctrl-C 키를 사용하세요." -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "\\endif 없이 EOF 도달" @@ -4224,2263 +4112,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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 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:3339 sql_help.c:4455 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:3011 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:3340 sql_help.c:4484 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 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:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "옵션 사용법:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:116 sql_help.c:2209 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:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "접속제한" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:118 sql_help.c:2211 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:4187 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 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:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 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:4454 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:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 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:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 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:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 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:2542 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:2519 sql_help.c:3481 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:2520 sql_help.c:3482 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 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:4467 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:3904 sql_help.c:4473 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:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 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:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 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:1998 sql_help.c:2275 msgid "handler_function" msgstr "핸들러_함수" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:396 sql_help.c:2276 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "collation" -#: 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:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 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:4968 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:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 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:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 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:2261 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:2395 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:2396 msgid "result_rows" msgstr "반환자료수" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:547 sql_help.c:2397 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 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:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 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:2716 +#: sql_help.c:3932 sql_help.c:4381 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:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 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:4464 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:2889 +msgid "compression_method" +msgstr "압축_방법" + +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "새_접근_방법" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" -msgstr "" +msgstr "res_proc" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" -msgstr "" +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:2541 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "연산자자료형" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" -msgstr "" +msgstr "정렬_가족_이름" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" -msgstr "" +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:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" -msgstr "테이블이름" +msgstr "테이블_이름" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" -msgstr "" +msgstr "using_expression" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "체크_표현식" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "발행_객체" + +#: sql_help.c:903 sql_help.c:2625 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:2627 +msgid "where publication_object is one of:" +msgstr "발행_객체 사용법:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 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:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" -msgstr "" +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:3892 +#: sql_help.c:4341 msgid "database_name" -msgstr "데이터베이스이름" +msgstr "데이터베이스_이름" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" -msgstr "" +msgstr "증가값" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "최소값" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1075 sql_help.c:2734 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:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 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:2736 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:2789 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:2790 msgid "publication_name" msgstr "발행_이름" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "발행_옵션_설정" +#: 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 "새로고침_옵션" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "구독_매개변수" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "skip_option" + +#: 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:2341 sql_help.c:2922 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:2936 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 "" +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 "" +msgstr "rewrite_룰_이름" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" -msgstr "" +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:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" -msgstr "파티션_범위_정의" +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:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" -msgstr "" +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:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "초기값_표현식" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" -msgstr "" +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:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" -msgstr "색인매개변수" +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:2939 sql_help.c:2956 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:2940 sql_help.c:2957 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:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "참조_방식" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "테이블_제약조건 사용법:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" -msgstr "" +msgstr "exclude_요소" -#: 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:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "연산자" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "범위한정구문" -#: sql_help.c:1369 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" -msgstr "" +msgstr "색인을_사용하는_테이블_제약조건 사용법:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "" +msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 제약조건에서 쓰는 색인_매개변수 사용법:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "" +msgstr "EXCLUDE 제약조건에서 쓰는 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:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "연산자클래스" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1430 sql_help.c:2976 +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:3013 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:3166 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 "" +msgstr "새_enum_값" -#: sql_help.c:1532 +#: sql_help.c:1584 msgid "neighbor_enum_value" -msgstr "" +msgstr "옆_enum_값" -#: sql_help.c:1534 +#: sql_help.c:1586 msgid "existing_enum_value" -msgstr "" +msgstr "기존_enum_값" -#: 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:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 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:3261 msgid "view_option_name" msgstr "뷰_옵션이름" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" -msgstr "" +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:4957 sql_help.c:4958 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:3745 +#: sql_help.c:4185 sql_help.c:4959 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:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" -msgstr "" +msgstr "불린" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1724 sql_help.c:4969 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:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "트랜잭션모드" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 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:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 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:3895 sql_help.c:4344 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 -msgid "text" -msgstr "" +#: sql_help.c:1909 sql_help.c:4483 +msgid "string_literal" +msgstr "문자열_리터럴" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 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:4017 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:2687 sql_help.c:2688 +#: sql_help.c:2689 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:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 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:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 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 "널문자열" -#: sql_help.c:1918 +#: sql_help.c:1981 msgid "quote_character" msgstr "인용부호" -#: sql_help.c:1919 +#: sql_help.c:1982 msgid "escape_character" msgstr "이스케이프 문자" -#: sql_help.c:1923 +#: sql_help.c:1986 msgid "encoding_name" msgstr "인코딩이름" -#: sql_help.c:1934 +#: sql_help.c:1997 msgid "access_method_type" -msgstr "" +msgstr "접근_방법_종류" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "인자자료형" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" -msgstr "" +msgstr "sfunc" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" -msgstr "" +msgstr "state_data_type" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" -msgstr "" +msgstr "state_data_size" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" -msgstr "" +msgstr "ffunc" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" -msgstr "" +msgstr "combinefunc" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" -msgstr "" +msgstr "serialfunc" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" -msgstr "" +msgstr "deserialfunc" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" -msgstr "" +msgstr "initial_condition" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" -msgstr "" +msgstr "msfunc" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" -msgstr "" +msgstr "minvfunc" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" -msgstr "" +msgstr "mstate_data_type" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" -msgstr "" +msgstr "mstate_data_size" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" -msgstr "" +msgstr "mffunc" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" -msgstr "" +msgstr "minitial_condition" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "정렬연산자" -#: sql_help.c:2033 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "또는 옛날 구문" -#: sql_help.c:2035 +#: sql_help.c:2098 msgid "base_type" msgstr "기본자료형" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "로케일" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "제공자" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "버전" -#: sql_help.c:2099 +#: sql_help.c:2162 msgid "existing_collation" -msgstr "" +msgstr "기존_collation" -#: sql_help.c:2109 +#: sql_help.c:2172 msgid "source_encoding" msgstr "원래인코딩" -#: sql_help.c:2110 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "대상인코딩" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "템플릿" -#: sql_help.c:2132 +#: sql_help.c:2200 msgid "encoding" msgstr "인코딩" -#: sql_help.c:2159 +#: sql_help.c:2201 +msgid "strategy" +msgstr "전략번호" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_로케일" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "로케일_제공자" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "collation_version" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "제약조건" -#: sql_help.c:2160 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "제약조건 사용법:" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "이벤트" -#: sql_help.c:2175 +#: sql_help.c:2248 msgid "filter_variable" -msgstr "" +msgstr "필터_변수" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2249 +msgid "filter_value" +msgstr "필터_값" + +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "칼럼_제약조건 사용법:" -#: sql_help.c:2300 +#: sql_help.c:2390 msgid "rettype" -msgstr "" +msgstr "rettype" -#: sql_help.c:2302 +#: sql_help.c:2392 msgid "column_type" -msgstr "" +msgstr "칼럼_자료형" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "함수정의" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "오브젝트파일" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "연결할_함수명" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2404 sql_help.c:2607 +msgid "sql_body" +msgstr "sql_본문" + +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" -msgstr "" +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:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "색인방법" -#: sql_help.c:2371 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "opclass_매개변수" -#: sql_help.c:2388 +#: sql_help.c:2480 msgid "call_handler" -msgstr "" +msgstr "호출_핸들러" -#: sql_help.c:2389 +#: sql_help.c:2481 msgid "inline_handler" -msgstr "" +msgstr "인라인_핸들러" -#: sql_help.c:2390 +#: sql_help.c:2482 msgid "valfunction" msgstr "구문검사함수" -#: sql_help.c:2429 +#: sql_help.c:2521 msgid "com_op" -msgstr "" +msgstr "com_op" -#: sql_help.c:2430 +#: sql_help.c:2522 msgid "neg_op" -msgstr "" +msgstr "neg_op" -#: sql_help.c:2448 +#: sql_help.c:2540 msgid "family_name" -msgstr "" +msgstr "family_name" -#: sql_help.c:2459 +#: sql_help.c:2551 msgid "storage_type" msgstr "스토리지_유형" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "이벤트 사용법:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" -msgstr "" +msgstr "스키마_요소" -#: sql_help.c:2644 +#: sql_help.c:2749 msgid "server_type" msgstr "서버_종류" -#: sql_help.c:2645 +#: sql_help.c:2750 msgid "server_version" msgstr "서버_버전" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "fdw_이름" -#: sql_help.c:2659 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "통계정보_이름" -#: sql_help.c:2660 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "통계정보_종류" -#: sql_help.c:2674 +#: sql_help.c:2788 msgid "subscription_name" msgstr "구독_이름" -#: sql_help.c:2774 +#: sql_help.c:2893 msgid "source_table" msgstr "원본테이블" -#: sql_help.c:2775 +#: sql_help.c:2894 msgid "like_option" msgstr "LIKE구문옵션" -#: sql_help.c:2841 +#: sql_help.c:2960 msgid "and like_option is:" -msgstr "" +msgstr "LIKE구문옵션 사용법:" -#: sql_help.c:2890 +#: sql_help.c:3012 msgid "directory" msgstr "디렉터리" -#: sql_help.c:2904 +#: sql_help.c:3026 msgid "parser_name" msgstr "구문분석기_이름" -#: sql_help.c:2905 +#: sql_help.c:3027 msgid "source_config" msgstr "원본_설정" -#: sql_help.c:2934 +#: sql_help.c:3056 msgid "start_function" msgstr "시작_함수" -#: sql_help.c:2935 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "gettoken함수" -#: sql_help.c:2936 +#: sql_help.c:3058 msgid "end_function" msgstr "종료_함수" -#: sql_help.c:2937 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "lextypes함수" -#: sql_help.c:2938 +#: sql_help.c:3060 msgid "headline_function" msgstr "headline함수" -#: sql_help.c:2950 +#: sql_help.c:3072 msgid "init_function" msgstr "init함수" -#: sql_help.c:2951 +#: sql_help.c:3073 msgid "lexize_function" msgstr "lexize함수" -#: sql_help.c:2964 +#: sql_help.c:3086 msgid "from_sql_function_name" -msgstr "" +msgstr "sql에서_언어로_바꿀때쓸_함수이름" -#: sql_help.c:2966 +#: sql_help.c:3088 msgid "to_sql_function_name" -msgstr "" +msgstr "언어에서_sql로_바꿀때쓸_함수이름" -#: sql_help.c:2992 +#: sql_help.c:3114 msgid "referenced_table_name" -msgstr "" +msgstr "참조된_테이블_이름" -#: sql_help.c:2993 +#: sql_help.c:3115 msgid "transition_relation_name" -msgstr "전달_릴레이션이름" +msgstr "전달_릴레이션_이름" -#: sql_help.c:2996 +#: sql_help.c:3118 msgid "arguments" msgstr "인자들" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3170 msgid "label" -msgstr "" +msgstr "enum요소" -#: sql_help.c:3048 +#: sql_help.c:3172 msgid "subtype" -msgstr "" +msgstr "subtype" -#: sql_help.c:3049 +#: sql_help.c:3173 msgid "subtype_operator_class" -msgstr "" +msgstr "subtype_operator_class" -#: sql_help.c:3051 +#: sql_help.c:3175 msgid "canonical_function" -msgstr "" +msgstr "canonical_function" -#: sql_help.c:3052 +#: sql_help.c:3176 msgid "subtype_diff_function" -msgstr "" +msgstr "subtype_diff_function" -#: sql_help.c:3054 +#: sql_help.c:3177 +msgid "multirange_type_name" +msgstr "다중범위_자료형_이름" + +#: sql_help.c:3179 msgid "input_function" msgstr "입력함수" -#: sql_help.c:3055 +#: sql_help.c:3180 msgid "output_function" msgstr "출력함수" -#: sql_help.c:3056 +#: sql_help.c:3181 msgid "receive_function" msgstr "받는함수" -#: sql_help.c:3057 +#: sql_help.c:3182 msgid "send_function" msgstr "주는함수" -#: sql_help.c:3058 +#: sql_help.c:3183 msgid "type_modifier_input_function" -msgstr "" +msgstr "type_modifier_input_function" -#: sql_help.c:3059 +#: sql_help.c:3184 msgid "type_modifier_output_function" -msgstr "" +msgstr "type_modifier_output_function" -#: sql_help.c:3060 +#: sql_help.c:3185 msgid "analyze_function" msgstr "분석함수" -#: sql_help.c:3061 +#: sql_help.c:3186 +msgid "subscript_function" +msgstr "구독_함수" + +#: sql_help.c:3187 msgid "internallength" -msgstr "" +msgstr "내부길이" -#: sql_help.c:3062 +#: sql_help.c:3188 msgid "alignment" msgstr "정렬" -#: sql_help.c:3063 +#: sql_help.c:3189 msgid "storage" msgstr "스토리지" -#: sql_help.c:3064 +#: sql_help.c:3190 msgid "like_type" -msgstr "" +msgstr "like_type" -#: sql_help.c:3065 +#: sql_help.c:3191 msgid "category" -msgstr "" +msgstr "category" -#: sql_help.c:3066 +#: sql_help.c:3192 msgid "preferred" -msgstr "" +msgstr "preferred" -#: sql_help.c:3067 +#: sql_help.c:3193 msgid "default" msgstr "기본값" -#: sql_help.c:3068 +#: sql_help.c:3194 msgid "element" msgstr "요소" -#: sql_help.c:3069 +#: sql_help.c:3195 msgid "delimiter" msgstr "구분자" -#: sql_help.c:3070 +#: sql_help.c:3196 msgid "collatable" -msgstr "" +msgstr "collatable" -#: 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:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" -msgstr "" - -#: 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 +msgstr "with절_쿼리" + +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 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:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" -msgstr "" +msgstr "from절_항목" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "커서이름" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 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:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" -msgstr "" +msgstr "출력_이름" -#: sql_help.c:3190 +#: sql_help.c:3316 msgid "code" -msgstr "" +msgstr "코드" -#: sql_help.c:3595 +#: sql_help.c:3721 msgid "parameter" msgstr "매개변수" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "명령구문" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "방향" -#: sql_help.c:3654 sql_help.c:3898 -msgid "where direction can be empty or one of:" -msgstr "방향 자리는 비워두거나 다음 중 하나:" +#: sql_help.c:3780 sql_help.c:4118 +msgid "where direction can be 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:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "출력개수" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "시퀀스이름" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "인자이름" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "인자자료형" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" -msgstr "" +msgstr "큰개체_oid" -#: sql_help.c:3784 +#: sql_help.c:3945 msgid "remote_schema" msgstr "원격_스키마" -#: sql_help.c:3787 +#: sql_help.c:3948 msgid "local_schema" msgstr "로컬_스키마" -#: sql_help.c:3822 +#: sql_help.c:3983 msgid "conflict_target" -msgstr "" +msgstr "충돌_대상" -#: sql_help.c:3823 +#: sql_help.c:3984 msgid "conflict_action" -msgstr "" +msgstr "충돌_작업" -#: sql_help.c:3826 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" -msgstr "conflict_target 사용법:" +msgstr "충돌_대상 사용법:" -#: sql_help.c:3827 +#: sql_help.c:3988 msgid "index_column_name" msgstr "인덱스칼럼이름" -#: sql_help.c:3828 +#: sql_help.c:3989 msgid "index_expression" msgstr "인덱스표현식" -#: sql_help.c:3831 +#: sql_help.c:3992 msgid "index_predicate" -msgstr "" +msgstr "부분인덱스식" -#: sql_help.c:3833 +#: sql_help.c:3994 msgid "and conflict_action is one of:" -msgstr "conflict_action 사용법:" +msgstr "충돌_작업 사용법:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" -msgstr "" +msgstr "서브셀렉트" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" -msgstr "" +msgstr "채널" -#: sql_help.c:3870 +#: sql_help.c:4031 msgid "lockmode" -msgstr "" +msgstr "잠금모드" -#: sql_help.c:3871 +#: sql_help.c:4032 msgid "where lockmode is one of:" -msgstr "lockmode 사용법:" +msgstr "잠금모드 사용법:" + +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "대상_테이블_이름" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "대상_별칭" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "데이터_소스" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "조인_조건" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "when절" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "데이터_소스 사용법:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "원본_테이블_이름" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "소스_쿼리" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "소스_별칭" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "when절 사용법:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "merge_insert" -#: sql_help.c:3912 +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "merge_insert 사용법:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "merge_update 사용법:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "merge_delete 사용법:" + +#: sql_help.c:4132 msgid "payload" -msgstr "" +msgstr "payload" -#: sql_help.c:3939 +#: sql_help.c:4159 msgid "old_role" msgstr "기존롤" -#: sql_help.c:3940 +#: sql_help.c:4160 msgid "new_role" msgstr "새롤" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "savepoint_name" -#: 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:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" -msgstr "" +msgstr "grouping_element" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "윈도우이름" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 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:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" -msgstr "" +msgstr "select" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" -msgstr "" +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:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "칼럼별칭" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "표본추출방법" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" -msgstr "" +msgstr "seed" -#: 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:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" -msgstr "" +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:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "칼럼정의" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" -msgstr "" - -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 -msgid "join_condition" -msgstr "" +msgstr "조인_종류" -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" -msgstr "" +msgstr "조인_칼럼" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +msgid "join_using_alias" +msgstr "조인_별칭" + +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" -msgstr "" +msgstr "grouping_element 사용법:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" -msgstr "" +msgstr "with절_쿼리 사용법:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "값" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" -msgstr "" +msgstr "insert" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" -msgstr "" +msgstr "update" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" -msgstr "" +msgstr "delete" + +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" + +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" + +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" -#: sql_help.c:4374 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" + +#: sql_help.c:4653 msgid "new_table" msgstr "새테이블" -#: sql_help.c:4399 -msgid "timezone" -msgstr "" - -#: sql_help.c:4444 +#: sql_help.c:4724 msgid "snapshot_id" -msgstr "" +msgstr "스냅샷_id" -#: sql_help.c:4686 +#: sql_help.c:4984 msgid "sort_expression" -msgstr "" +msgstr "정렬_표현식" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "현재 트랜잭션 중지함" -#: sql_help.c:4819 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "집계함수 정보 바꾸기" -#: sql_help.c:4825 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "collation 정의 바꾸기" -#: sql_help.c:4831 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "문자코드 변환규칙(conversion) 정보 바꾸기" -#: sql_help.c:4837 +#: sql_help.c:5152 msgid "change a database" msgstr "데이터베이스 변경" -#: sql_help.c:4843 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "기본 접근 권한 정의" -#: sql_help.c:4849 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "도메인 정보 바꾸기" -#: sql_help.c:4855 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "트리거 정보 바꾸기" -#: sql_help.c:4861 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "확장모듈 정의 바꾸기" -#: sql_help.c:4867 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "외부 데이터 래퍼 정의 바꾸기" -#: sql_help.c:4873 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "외부 테이블 정의 바꾸기" -#: sql_help.c:4879 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "함수 정보 바꾸기" -#: sql_help.c:4885 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "롤 이름이나 맴버쉽 바꾸기" -#: sql_help.c:4891 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "인덱스 정의 바꾸기" -#: sql_help.c:4897 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "procedural language 정보 바꾸기" -#: sql_help.c:4903 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "대형 객체 정의 바꾸기" -#: sql_help.c:4909 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "materialized 뷰 정의 바꾸기" -#: sql_help.c:4915 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "연산자 정의 바꾸기" -#: sql_help.c:4921 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "연산자 클래스 정보 바꾸기" -#: sql_help.c:4927 +#: sql_help.c:5242 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:5248 +msgid "change the definition of a row-level security policy" msgstr "로우 단위 보안 정책의 정의 바꾸기" -#: sql_help.c:4939 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "프로시져 정의 바꾸기" -#: sql_help.c:4945 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "발행 정보 바꾸기" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "데이터베이스 롤 변경" -#: sql_help.c:4957 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "루틴 정의 바꾸기" -#: sql_help.c:4963 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "룰 정의 바꾸기" -#: sql_help.c:4969 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "스키마 이름 바꾸기" -#: sql_help.c:4975 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "시퀀스 정보 바꾸기" -#: sql_help.c:4981 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "외부 서버 정의 바꾸기" -#: sql_help.c:4987 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "확장 통계정보 객체 정의 바꾸기" -#: sql_help.c:4993 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "구독 정보 바꾸기" -#: sql_help.c:4999 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "서버 환경 설정 매개 변수 바꾸기" -#: sql_help.c:5005 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "테이블 정보 바꾸기" -#: sql_help.c:5011 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "테이블스페이스 정의 바꾸기" -#: sql_help.c:5017 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" msgstr "텍스트 검색 구성 정의 바꾸기" -#: sql_help.c:5023 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" msgstr "텍스트 검색 사전 정의 바꾸기" -#: sql_help.c:5029 +#: sql_help.c:5344 msgid "change the definition of a text search parser" msgstr "텍스트 검색 파서 정의 바꾸기" -#: sql_help.c:5035 +#: sql_help.c:5350 msgid "change the definition of a text search template" msgstr "텍스트 검색 템플릿 정의 바꾸기" -#: sql_help.c:5041 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "트리거 정보 바꾸기" -#: sql_help.c:5047 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "자료형 정의 바꾸기" -#: sql_help.c:5059 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "사용자 매핑 정의 바꾸기" -#: sql_help.c:5065 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "뷰 정의 바꾸기" -#: sql_help.c:5071 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "데이터베이스 사용 통계 정보를 갱신함" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "트랜잭션 블럭을 시작함" -#: sql_help.c:5083 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "프로시져 호출" -#: sql_help.c:5089 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "트랜잭션 로그를 강제로 체크포인트 함" -#: sql_help.c:5095 +#: sql_help.c:5410 msgid "close a cursor" msgstr "커서 닫기" -#: sql_help.c:5101 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "지정한 인덱스 기준으로 테이블 자료를 다시 저장함" -#: sql_help.c:5107 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "해당 개체의 코멘트를 지정하거나 수정함" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "현재 트랜잭션 commit" -#: sql_help.c:5119 +#: sql_help.c:5434 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "two-phase 커밋을 위해 먼저 준비된 트랜잭션을 커밋하세요." -#: sql_help.c:5125 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "테이블과 파일 사이 자료를 복사함" -#: sql_help.c:5131 +#: sql_help.c:5446 msgid "define a new access method" msgstr "새 접속 방법 정의" -#: sql_help.c:5137 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "새 집계합수 만들기" -#: sql_help.c:5143 +#: sql_help.c:5458 msgid "define a new cast" msgstr "새 형변환자 만들기" -#: sql_help.c:5149 +#: sql_help.c:5464 msgid "define a new collation" msgstr "새 collation 만들기" -#: sql_help.c:5155 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "새 문자코드변환규칙(conversion) 만들기" -#: sql_help.c:5161 +#: sql_help.c:5476 msgid "create a new database" msgstr "데이터베이스 생성" -#: sql_help.c:5167 +#: sql_help.c:5482 msgid "define a new domain" msgstr "새 도메인 만들기" -#: sql_help.c:5173 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "새 이벤트 트리거 만들기" -#: sql_help.c:5179 +#: sql_help.c:5494 msgid "install an extension" msgstr "확장 모듈 설치" -#: sql_help.c:5185 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "새 외부 데이터 래퍼 정의" -#: sql_help.c:5191 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "새 외부 테이블 정의" -#: sql_help.c:5197 +#: sql_help.c:5512 msgid "define a new function" msgstr "새 함수 만들기" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "새 데이터베이스 롤 만들기" -#: sql_help.c:5209 +#: sql_help.c:5524 msgid "define a new index" msgstr "새 인덱스 만들기" -#: sql_help.c:5215 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "새 프로시주얼 언어 만들기" -#: sql_help.c:5221 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "새 materialized 뷰 만들기" -#: sql_help.c:5227 +#: sql_help.c:5542 msgid "define a new operator" msgstr "새 연산자 만들기" -#: sql_help.c:5233 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "새 연잔자 클래스 만들기" -#: sql_help.c:5239 +#: sql_help.c:5554 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:5560 +msgid "define a new row-level security policy for a table" msgstr "특정 테이블에 로우 단위 보안 정책 정의" -#: sql_help.c:5251 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "새 프로시져 만들기" -#: sql_help.c:5257 +#: sql_help.c:5572 msgid "define a new publication" msgstr "새 발행 만들기" -#: sql_help.c:5269 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "새 룰(rule) 만들기" -#: sql_help.c:5275 +#: sql_help.c:5590 msgid "define a new schema" msgstr "새 스키마(schema) 만들기" -#: sql_help.c:5281 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "새 시퀀스 만들기" -#: sql_help.c:5287 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "새 외부 서버 정의" -#: sql_help.c:5293 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "새 확장 통계정보 만들기" -#: sql_help.c:5299 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "새 구독 만들기" -#: sql_help.c:5305 +#: sql_help.c:5620 msgid "define a new table" msgstr "새 테이블 만들기" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5626 sql_help.c:6148 msgid "define a new table from the results of a query" msgstr "쿼리 결과를 새 테이블로 만들기" -#: sql_help.c:5317 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "새 테이블스페이스 만들기" -#: sql_help.c:5323 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "새 텍스트 검색 구성 정의" -#: sql_help.c:5329 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "새 텍스트 검색 사전 정의" -#: sql_help.c:5335 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "새 텍스트 검색 파서 정의" -#: sql_help.c:5341 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "새 텍스트 검색 템플릿 정의" -#: sql_help.c:5347 +#: sql_help.c:5662 msgid "define a new transform" msgstr "새 transform 만들기" -#: sql_help.c:5353 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "새 트리거 만들기" -#: sql_help.c:5359 +#: sql_help.c:5674 msgid "define a new data type" msgstr "새 자료형 만들기" -#: sql_help.c:5371 +#: sql_help.c:5686 msgid "define a new mapping of a user to a foreign server" msgstr "사용자와 외부 서버 간의 새 매핑 정의" -#: sql_help.c:5377 +#: sql_help.c:5692 msgid "define a new view" msgstr "새 view 만들기" -#: sql_help.c:5383 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "준비된 구문(prepared statement) 지우기" -#: sql_help.c:5389 +#: sql_help.c:5704 msgid "define a cursor" msgstr "커서 지정" -#: sql_help.c:5395 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "테이블의 자료 삭제" -#: sql_help.c:5401 +#: sql_help.c:5716 msgid "discard session state" msgstr "세션 상태 삭제" -#: sql_help.c:5407 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "임의 코드 블록 실행" -#: sql_help.c:5413 +#: sql_help.c:5728 msgid "remove an access method" msgstr "접근 방법 삭제" -#: sql_help.c:5419 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "집계 함수 삭제" -#: sql_help.c:5425 +#: sql_help.c:5740 msgid "remove a cast" msgstr "형변환자 삭제" -#: sql_help.c:5431 +#: sql_help.c:5746 msgid "remove a collation" msgstr "collation 삭제" -#: sql_help.c:5437 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "문자코드 변환규칙(conversion) 삭제" -#: sql_help.c:5443 +#: sql_help.c:5758 msgid "remove a database" msgstr "데이터베이스 삭제" -#: sql_help.c:5449 +#: sql_help.c:5764 msgid "remove a domain" msgstr "도메인 삭제" -#: sql_help.c:5455 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "이벤트 트리거 삭제" -#: sql_help.c:5461 +#: sql_help.c:5776 msgid "remove an extension" msgstr "확장 모듈 삭제" -#: sql_help.c:5467 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "외부 데이터 래퍼 제거" -#: sql_help.c:5473 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "외부 테이블 삭제" -#: sql_help.c:5479 +#: sql_help.c:5794 msgid "remove a function" msgstr "함수 삭제" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "데이터베이스 롤 삭제" -#: sql_help.c:5491 +#: sql_help.c:5806 msgid "remove an index" msgstr "인덱스 삭제" -#: sql_help.c:5497 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "프로시주얼 언어 삭제" -#: sql_help.c:5503 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "materialized 뷰 삭제" -#: sql_help.c:5509 +#: sql_help.c:5824 msgid "remove an operator" msgstr "연산자 삭제" -#: sql_help.c:5515 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "연산자 클래스 삭제" -#: sql_help.c:5521 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "연산자 부류 삭제" -#: sql_help.c:5527 +#: sql_help.c:5842 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:5848 +msgid "remove a row-level security policy from a table" +msgstr "해당 테이블에 정의된 로우 단위 보안 정책 삭제" -#: sql_help.c:5539 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "프로시져 삭제" -#: sql_help.c:5545 +#: sql_help.c:5860 msgid "remove a publication" msgstr "발행 삭제" -#: sql_help.c:5557 +#: sql_help.c:5872 msgid "remove a routine" msgstr "루틴 삭제" -#: sql_help.c:5563 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "룰(rule) 삭제" -#: sql_help.c:5569 +#: sql_help.c:5884 msgid "remove a schema" msgstr "스키마(schema) 삭제" -#: sql_help.c:5575 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "시퀀스 삭제" -#: sql_help.c:5581 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "외부 서버 설명자 제거" -#: sql_help.c:5587 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "확장 통계정보 삭제" -#: sql_help.c:5593 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "구독 삭제" -#: sql_help.c:5599 +#: sql_help.c:5914 msgid "remove a table" msgstr "테이블 삭제" -#: sql_help.c:5605 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "테이블스페이스 삭제" -#: sql_help.c:5611 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "텍스트 검색 구성 제거" -#: sql_help.c:5617 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "텍스트 검색 사전 제거" -#: sql_help.c:5623 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "텍스트 검색 파서 제거" -#: sql_help.c:5629 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "텍스트 검색 템플릿 제거" -#: sql_help.c:5635 +#: sql_help.c:5950 msgid "remove a transform" msgstr "transform 삭제" -#: sql_help.c:5641 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "트리거 삭제" -#: sql_help.c:5647 +#: sql_help.c:5962 msgid "remove a data type" msgstr "자료형 삭제" -#: sql_help.c:5659 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "외부 서버에 대한 사용자 매핑 제거" -#: sql_help.c:5665 +#: sql_help.c:5980 msgid "remove a view" msgstr "뷰(view) 삭제" -#: sql_help.c:5677 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "준비된 구문(prepared statement) 실행" -#: sql_help.c:5683 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "쿼리 실행계획 보기" -#: sql_help.c:5689 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" msgstr "해당 커서에서 자료 뽑기" -#: sql_help.c:5695 +#: sql_help.c:6010 msgid "define access privileges" msgstr "액세스 권한 지정하기" -#: sql_help.c:5701 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "외부 서버로부터 테이블 정의 가져오기" -#: sql_help.c:5707 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "테이블 자료 삽입" -#: sql_help.c:5713 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "특정 서버 메시지 수신함" -#: sql_help.c:5719 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "공유 라이브러리 파일 로드" -#: sql_help.c:5725 +#: sql_help.c:6040 msgid "lock a table" msgstr "테이블 잠금" -#: sql_help.c:5731 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "조건부 테이블 insert, update, delete" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "커서 위치 옮기기" -#: sql_help.c:5737 +#: sql_help.c:6058 msgid "generate a notification" msgstr "특정 서버 메시지 발생" -#: sql_help.c:5743 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "준비된 구문(prepared statement) 만들기" -#: sql_help.c:5749 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "two-phase 커밋을 위해 현재 트랜잭션을 준비함" -#: sql_help.c:5755 +#: sql_help.c:6076 msgid "change the ownership of database objects owned by a database role" msgstr "데이터베이스 롤로 권한이 부여된 데이터베이스 개체들의 소유주 바꾸기" -#: sql_help.c:5761 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "구체화된 뷰의 내용 수정" -#: sql_help.c:5767 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "인덱스 다시 만들기" -#: sql_help.c:5773 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "이전 정의된 savepoint를 파기함" -#: sql_help.c:5779 +#: sql_help.c:6100 msgid "restore the value of a run-time parameter to the default value" msgstr "실시간 환경 변수값을 초기값으로 다시 지정" -#: sql_help.c:5785 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "액세스 권한 해제하기" -#: sql_help.c:5797 +#: sql_help.c:6118 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "two-phase 커밋을 위해 먼저 준비되었던 트랜잭션 실행취소하기" -#: sql_help.c:5803 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "savepoint 파기하기" -#: sql_help.c:5809 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "현재 트랜잭션에서 새로운 savepoint 만들기" -#: sql_help.c:5815 +#: sql_help.c:6136 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:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "테이블이나 뷰의 자료를 출력" -#: sql_help.c:5833 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "실시간 환경 변수값 바꾸기" -#: sql_help.c:5839 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" msgstr "현재 트랜잭션에서 제약조건 설정" -#: sql_help.c:5845 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" msgstr "현재 세션의 현재 사용자 식별자를 지정" -#: sql_help.c:5851 +#: sql_help.c:6172 msgid "" "set the session user identifier and the current user identifier of the " "current session" msgstr "현재 세션의 사용자 인증을 지정함 - 사용자 지정" -#: sql_help.c:5857 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "현재 트랜잭션의 성질을 지정함" -#: sql_help.c:5863 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "실시간 환경 변수값들을 보여줌" -#: sql_help.c:5881 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "하나 또는 지정한 여러개의 테이블에서 모든 자료 지움" -#: sql_help.c:5887 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "특정 서버 메시지 수신 기능 끔" -#: sql_help.c:5893 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "테이블 자료 갱신" -#: sql_help.c:5899 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "물리적인 자료 정리 작업 - 쓰레기값 청소" -#: sql_help.c:5905 +#: sql_help.c:6226 msgid "compute a set of rows" msgstr "compute a set of rows" -#: 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:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6489,27 +6541,27 @@ msgstr "" "도움말을 보려면 \"help\"를 입력하십시오.\n" "\n" -#: startup.c:589 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "출력 매개 변수 \"%s\" 지정할 수 없음" -#: startup.c:697 +#: startup.c:719 #, 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:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "추가 명령행 인자 \"%s\" 무시됨" -#: startup.c:763 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "실행 가능한 프로그램을 찾을 수 없음" -#: tab-complete.c:4640 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6535,7 +6587,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" diff --git a/third_party/spanner_pg/src/bin/psql/po/ru.po b/third_party/spanner_pg/src/bin/psql/po/ru.po index 9ae0219e..b8153a8d 100644 --- a/third_party/spanner_pg/src/bin/psql/po/ru.po +++ b/third_party/spanner_pg/src/bin/psql/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-11-03 09:09+0300\n" +"POT-Creation-Date: 2024-02-02 18:11+0300\n" "PO-Revision-Date: 2023-02-03 15:12+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -21,21 +21,26 @@ 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:259 -#, c-format -msgid "fatal: " -msgstr "важно: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "предупреждение: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "подробности: " + +#: ../../../src/common/logging.c:301 +#, 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" @@ -72,8 +77,8 @@ msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" #: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -94,7 +99,7 @@ msgstr "попытка дублирования нулевого указате msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../../common/username.c:45 command.c:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "пользователь не существует" @@ -141,7 +146,7 @@ msgstr "Сигнал отмены отправлен\n" msgid "Could not send cancel request: " msgstr "Отправить сигнал отмены не удалось: " -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -149,71 +154,81 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "рекурсивное расширение переменной \"%s\" пропускается" -#: command.c:229 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "найти локального пользователя по идентификатору (%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:232 #, c-format msgid "invalid command \\%s" msgstr "неверная команда \\%s" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Введите \\? для получения справки." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: лишний аргумент \"%s\" пропущен" -#: command.c:301 +#: command.c:304 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "" "команда \\%s игнорируется; добавьте \\endif или нажмите Ctrl-C для " "завершения текущего блока \\if" -#: command.c:562 +#: command.c:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "не удалось получить домашний каталог пользователя c ид. %ld: %s" -#: command.c:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: не удалось перейти в каталог \"%s\": %m" -#: command.c:605 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "В данный момент вы не подключены к базе данных.\n" -#: command.c:615 +#: command.c:627 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -222,7 +237,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес сервера " "\"%s\", порт \"%s\").\n" -#: command.c:618 +#: command.c:630 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at " @@ -231,7 +246,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в " "\"%s\", порт \"%s\".\n" -#: command.c:624 +#: command.c:636 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address " @@ -240,7 +255,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\": " "адрес \"%s\", порт \"%s\").\n" -#: command.c:627 +#: command.c:639 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port " @@ -249,170 +264,149 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", " "порт \"%s\").\n" -#: command.c:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "нет буфера запросов" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5497 #, c-format msgid "invalid line number: %s" msgstr "неверный номер строки: %s" -#: command.c:1111 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "" -"Сервер (версия %s) не поддерживает редактирование исходного кода функции." - -#: command.c:1114 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "" -"Сервер (версия %s) не поддерживает редактирование определения представления." - -#: command.c:1198 +#: command.c:1203 msgid "No changes" msgstr "Изменений нет" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "" "%s: неверное название кодировки символов или не найдена процедура " "перекодировки" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5603 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:723 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Ошибки не было." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: отсутствует правая скобка" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "отсутствует необходимый аргумент \\%s" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif не может находиться после \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif без соответствующего \\if" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else не может находиться после \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else без соответствующего \\if" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif без соответствующего \\if" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Буфер запроса пуст." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введите новый пароль для пользователя \"%s\": " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Повторите его: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Пароли не совпадают." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не удалось прочитать значение переменной" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Буфер запроса сброшен (очищен)." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "История записана в файл \"%s\".\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: имя переменной окружения не может содержать знак \"=\"" -#: command.c:2408 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Сервер (версия %s) не поддерживает вывод исходного кода функции." - -#: command.c:2411 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Сервер (версия %s) не поддерживает вывод определения представлений." - -#: command.c:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "требуется имя функции" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "требуется имя представления" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Секундомер включён." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Секундомер выключен." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль пользователя %s: " -#: command.c:3106 +#: command.c:3168 #, c-format msgid "" "Do not give user, host, or port separately when using a connection string" @@ -420,23 +414,23 @@ msgstr "" "Не указывайте пользователя, сервер или порт отдельно, когда используете " "строку подключения" -#: command.c:3141 +#: command.c:3203 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "" "Нет подключения к базе, из которого можно было бы использовать параметры" -#: command.c:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Сохранено предыдущее подключение" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -445,7 +439,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес " "сервера \"%s\", порт \"%s\").\n" -#: command.c:3507 +#: command.c:3576 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " @@ -454,7 +448,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в " "\"%s\", порт \"%s\".\n" -#: command.c:3513 +#: command.c:3582 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host " @@ -463,7 +457,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер " "\"%s\": адрес \"%s\", порт \"%s\").\n" -#: command.c:3516 +#: command.c:3585 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " @@ -472,17 +466,17 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", " "порт \"%s\").\n" -#: command.c:3521 +#: command.c:3590 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Вы подключены к базе данных \"%s\" как пользователь \"%s\".\n" -#: command.c:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -491,29 +485,29 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: %s имеет базовую версию %s, а сервер - %s.\n" " Часть функций psql может не работать.\n" -#: command.c:3608 +#: command.c:3680 #, 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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "неизвестно" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "выкл." -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "вкл." -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Соединение зашифровано GSSAPI\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -526,7 +520,7 @@ msgstr "" " Подробнее об этом смотрите документацию psql, раздел\n" " \"Notes for Windows users\".\n" -#: command.c:3751 +#: command.c:3822 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -535,33 +529,33 @@ msgstr "" "в переменной окружения PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер " "строки" -#: command.c:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "не удалось запустить редактор \"%s\"" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "не удалось запустить /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "не удалось найти временный каталог: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: command.c:4195 +#: command.c:4266 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "" "\\pset: неоднозначному сокращению \"%s\" соответствует и \"%s\", и \"%s\"" -#: command.c:4215 +#: command.c:4286 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -570,32 +564,32 @@ msgstr "" "\\pset: допустимые форматы: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: допустимые стили линий: ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий границ: single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий столбцов: single, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий заголовков: single, double" -#: command.c:4322 +#: command.c:4393 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: символ csv_fieldsep должен быть однобайтовым" -#: command.c:4327 +#: command.c:4398 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -604,107 +598,107 @@ msgstr "" "\\pset: в качестве csv_fieldsep нельзя выбрать символ кавычек, новой строки " "или возврата каретки" -#: command.c:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "неизвестный параметр \\pset: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Стиль границ: %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "Ширина вывода сброшена.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "Ширина вывода: %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Расширенный вывод включён.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Расширенный вывод применяется автоматически.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Расширенный вывод выключен.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Разделитель полей для CSV: \"%s\".\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Разделитель полей - нулевой байт.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Разделитель полей: \"%s\".\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Строка итогов включена.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Строка итогов выключена.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Формат вывода: %s.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Установлен стиль линий: %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null выводится как: \"%s\".\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локализованный вывод чисел включён.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локализованный вывод чисел выключен.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Постраничник используется для вывода длинного текста.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Постраничник используется всегда.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "Постраничник выключен.\n" -#: command.c:4580 +#: command.c:4651 #, 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" @@ -712,87 +706,97 @@ msgstr[0] "Постраничник не будет использоваться msgstr[1] "Постраничник не будет использоваться, если строк меньше %d\n" msgstr[2] "Постраничник не будет использоваться, если строк меньше %d\n" -#: command.c:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Разделитель записей - нулевой байт.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Разделитель записей: <новая строка>.\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Разделитель записей: \"%s\".\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Атрибуты HTML-таблицы: \"%s\".\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибуты HTML-таблицы не заданы.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не задан.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Режим вывода только кортежей включён.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Режим вывода только кортежей выключен.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль Unicode-линий столбцов: \"%s\".\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: ошибка" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch нельзя использовать с пустым запросом" -#: command.c:4945 +#: command.c:5016 +#, 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:4948 +#: command.c:5087 #, c-format msgid "%s (every %gs)\n" msgstr "%s (обновление: %g с)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5148 +#, c-format +msgid "could not wait for signals: %m" +msgstr "сбой при ожидании сигналов: %m" + +#: command.c:5206 command.c:5213 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -805,89 +809,79 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5392 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" — не представление" -#: command.c:5225 +#: command.c:5408 #, c-format msgid "could not parse reloptions array" msgstr "не удалось разобрать массив reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "экранирование строк не работает без подключения к БД" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "" "аргумент команды оболочки содержит символ новой строки или перевода каретки: " "\"%s\"" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "подключение к серверу было потеряно" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Подключение к серверу потеряно. Попытка восстановления " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "неудачна.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "удачна.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неожиданное значение PQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Время: %.3f мс\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Время: %.3f мс (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%.0f д. %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, c-format msgid "You are currently not connected to a database." msgstr "В данный момент вы не подключены к базе данных." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch нельзя использовать с COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "неожиданное состояние результата для \\watch" - -#: common.c:694 +#: common.c:654 #, c-format msgid "" "Asynchronous notification \"%s\" with payload \"%s\" received from server " @@ -896,34 +890,34 @@ msgstr "" "Получено асинхронное уведомление \"%s\" с сообщением-нагрузкой \"%s\" от " "серверного процесса с PID %d.\n" -#: common.c:697 +#: common.c:657 #, c-format msgid "" "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "" "Получено асинхронное уведомление \"%s\" от серверного процесса с PID %d.\n" -#: common.c:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "не удалось вывести таблицу результатов: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "сервер не возвратил строк для \\gset" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "сервер возвратил больше одной строки для \\gset" -#: common.c:791 +#: common.c:731 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "попытка выполнить \\gset со специальной переменной \"%s\" игнорируется" -#: common.c:1211 +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify " @@ -937,35 +931,28 @@ msgstr "" "%s\n" "***(Enter - выполнение; x и Enter - отмена)**************\n" -#: 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:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "ОПЕРАТОР: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "неожиданное состояние транзакции (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Столбец" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Тип" -#: common.c:1564 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не выдала результат, либо в результате нет столбцов.\n" @@ -1032,11 +1019,11 @@ msgstr "" "Вводите данные для копирования, разделяя строки переводом строки.\n" "Закончите ввод строкой '\\.' или сигналом EOF." -#: copy.c:671 +#: copy.c:685 msgid "aborted because of read failure" msgstr "прерывание из-за ошибки чтения" -#: copy.c:705 +#: copy.c:719 msgid "trying to exit copy mode" msgstr "попытка выйти из режима копирования" @@ -1096,771 +1083,771 @@ msgstr "\\crosstabview: неоднозначное имя столбца: \"%s\" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: имя столбца не найдено: \"%s\"" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Схема" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Имя" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Тип данных результата" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Типы данных аргументов" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Описание" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Список агрегатных функций" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (версия %s) не поддерживает методы доступа." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Индекс" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Таблица" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Обработчик" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Список методов доступа" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Сервер (версия %s) не поддерживает табличные пространства." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Владелец" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Расположение" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Параметры" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Размер" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Список табличных пространств" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df принимает в качестве параметров только [anptwS+]" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "агр." -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "оконная" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "проц." # well-spelled: функ -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "функ." -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "триггерная" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "постоянная" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "стабильная" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "изменчивая" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Изменчивость" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "ограниченная" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "безопасная" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "небезопасная" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Параллельность" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "определившего" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "вызывающего" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Безопасность" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Язык" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Исходный код" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Список функций" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Внутреннее имя" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Элементы" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Список типов данных" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Тип левого аргумента" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Результирующий тип" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Функция" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Список операторов" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Кодировка" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "LC_COLLATE" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "LC_CTYPE" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "локаль ICU" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Провайдер локали" + +#: describe.c:964 msgid "Tablespace" msgstr "Табл. пространство" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Список баз данных" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "таблица" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "представление" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "материализованное представление" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "последовательность" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "сторонняя таблица" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "секционированная таблица" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Права для столбцов" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Политики" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Права доступа" -#: describe.c:1293 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Сервер (версия %s) не поддерживает изменение прав по умолчанию." - -#: describe.c:1313 +#: describe.c:1188 msgid "function" msgstr "функция" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "тип" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "схема" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Права доступа по умолчанию" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Объект" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "ограничение таблицы" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "ограничение домена" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "класс операторов" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "семейство операторов" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "правило" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Описание объекта" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Отношение \"%s\" не найдено." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Отношения не найдены." -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "Отношение с OID %s не найдено." -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Начальное_значение" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Минимум" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Максимум" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Шаг" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "да" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "нет" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Зацикливается?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Кешируется" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Владелец: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Последовательность для столбца идентификации: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Нежурналируемая последовательность \"%s.%s\"" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Последовательность \"%s.%s\"" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Нежурналируемая таблица \"%s.%s\"" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблица \"%s.%s\"" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Представление \"%s.%s\"" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Нежурналируемое материализованное представление \"%s.%s\"" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Материализованное представление \"%s.%s\"" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Нежурналируемый индекс \"%s.%s\"" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Индекс \"%s.%s\"" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Нежурналируемый секционированный индекс \"%s.%s\"" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секционированный индекс \"%s.%s\"" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Специальное отношение \"%s.%s\"" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-таблица \"%s.%s\"" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Составной тип \"%s.%s\"" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Сторонняя таблица \"%s.%s\"" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Нежурналируемая секционированная таблица \"%s.%s\"" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секционированная таблица \"%s.%s\"" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Правило сортировки" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Допустимость NULL" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "По умолчанию" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Ключевой?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Определение" # well-spelled: ОСД -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Параметры ОСД" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Хранилище" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Сжатие" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Цель для статистики" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Секция: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Нет ограничения секции" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Ограничение секции: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Ключ разбиения: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Принадлежит таблице: \"%s.%s\"" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "первичный ключ, " -#: describe.c:2514 -msgid "unique, " -msgstr "уникальный, " +#: describe.c:2312 +msgid "unique" +msgstr "уникальный" -#: describe.c:2520 +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " null не различаются" + +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблицы \"%s.%s\"" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", кластеризованный" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", нерабочий" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", откладываемый" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", изначально отложенный" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", репликационный" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Индексы:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Ограничения-проверки:" # TO REWVIEW -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Ограничения внешнего ключа:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Ссылки извне:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Политики:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Политики (усиленная защита строк включена):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Политики (защита строк включена): (Нет)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Политики (усиленная защита строк включена): (Нет)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Политики (защита строк выключена):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Объекты статистики:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Правила:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Отключённые правила:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Правила, срабатывающие всегда:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Правила, срабатывающие только в реплике:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Публикации:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Определение представления:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Триггеры:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Отключённые пользовательские триггеры:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Отключённые триггеры:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Отключённые внутренние триггеры:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Триггеры, срабатывающие всегда:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Триггеры, срабатывающие только в реплике:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Сервер: %s" # well-spelled: ОСД -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "Параметр ОСД: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Наследует" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Число секций: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Число секций: %d (чтобы просмотреть их, введите \\d+)" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Дочерних таблиц: %d (чтобы просмотреть и их, воспользуйтесь \\d+)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Дочерние таблицы" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Секции" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Типизированная таблица типа: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Идентификация реплики" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Содержит OID: да" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Метод доступа: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", табл. пространство \"%s\"" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Имя роли" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Атрибуты" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Член ролей" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Суперпользователь" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Не наследуется" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Создаёт роли" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Создаёт БД" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "Вход запрещён" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Репликация" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Пропускать RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Нет подключений" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -1868,386 +1855,389 @@ msgstr[0] "%d подключение" msgstr[1] "%d подключения" msgstr[2] "%d подключений" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Пароль действует до " -#: describe.c:3991 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "" -"Сервер (версия %s) не поддерживает назначение параметров ролей для баз " -"данных." - -#: describe.c:4004 +#: describe.c:3777 msgid "Role" msgstr "Роль" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "БД" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Параметры" -#: describe.c:4030 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Параметры для роли \"%s\" и базы данных \"%s\" не найдены." -#: describe.c:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Параметры для роли \"%s\" не найдены." -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Никакие параметры не найдены." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Список параметров" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "индекс" -# skip-rule: capital-letter-first -#: describe.c:4115 -msgid "special" -msgstr "спец. отношение" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "TOAST-таблица" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "секционированный индекс" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "постоянное" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "временное" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "нежурналируемое" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Хранение" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Метод доступа" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Список отношений" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "" "Сервер (версия %s) не поддерживает декларативное секционирование таблиц." -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Список секционированных индексов" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Список секционированных таблиц" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Список секционированных отношений" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Имя родителя" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Размер конечной секции" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Общий размер" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Доверенный" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Внутренний язык" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Обработчик вызова" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Функция проверки" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Обработчик внедрённого кода" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Список языков" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Проверка" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Список доменов" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Источник" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Назначение" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "По умолчанию?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Список преобразований" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Параметр" + +#: describe.c:4498 +msgid "Value" +msgstr "Значение" + +#: describe.c:4505 +msgid "Context" +msgstr "Контекст" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Список параметров конфигурации" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Список изменённых параметров конфигурации" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Сервер (версия %s) не поддерживает событийные триггеры." + +#: describe.c:4587 msgid "Event" msgstr "Событие" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "включён" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "реплика" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "всегда" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "отключён" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Включён" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Теги" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Список событийных триггеров" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (версия %s) не поддерживает расширенные статистики." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Зависимости" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Список расширенных статистик" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Исходный тип" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Целевой тип" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "в присваивании" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Неявное?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Список приведений типов" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Сервер (версия %s) не поддерживает правила сравнения." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Провайдер" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Детерминированное?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Список правил сортировки" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Список схем" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Сервер (версия %s) не поддерживает полнотекстовый поиск." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Список анализаторов текстового поиска" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Анализатор текстового поиска \"%s\" не найден." -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Никакие анализаторы текстового поиска не найдены." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Начало разбора" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Метод" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Получение следующего фрагмента" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Окончание разбора" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Получение выдержки" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Получение типов фрагментов" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Анализатор текстового поиска \"%s.%s\"" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Анализатор текстового поиска \"%s\"" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Имя фрагмента" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типы фрагментов для анализатора \"%s.%s\"" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типы фрагментов для анализатора \"%s\"" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Шаблон" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Параметры инициализации" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Список словарей текстового поиска" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Инициализация" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Выделение лексем" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Список шаблонов текстового поиска" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Список конфигураций текстового поиска" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Конфигурация текстового поиска \"%s\" не найдена." -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Никакие конфигурации текстового поиска не найдены." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Фрагмент" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Словари" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфигурация текстового поиска \"%s.%s\"" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфигурация текстового поиска \"%s\"" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2256,7 +2246,7 @@ msgstr "" "\n" "Анализатор: \"%s.%s\"" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2265,255 +2255,253 @@ msgstr "" "\n" "Анализатор: \"%s\"" -#: describe.c:5787 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Сервер (версия %s) не поддерживает обёртки сторонних данных." - -#: describe.c:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Список обёрток сторонних данных" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Сервер (версия %s) не поддерживает сторонние серверы." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Обёртка сторонних данных" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Версия" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Список сторонних серверов" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Сервер (версия %s) не поддерживает сопоставления пользователей." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Сервер" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Имя пользователя" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Список сопоставлений пользователей" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Сервер (версия %s) не поддерживает сторонние таблицы." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Список сторонних таблиц" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Сервер (версия %s) не поддерживает расширения." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Список установленных расширений" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Расширение \"%s\" не найдено." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Никакие расширения не найдены." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Описание объекта" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Объекты в расширении \"%s\"" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версия %s) не поддерживает публикации." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Все таблицы" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Добавления" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Изменения" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Удаления" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Опустошения" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Через корень" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Список публикаций" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Публикация \"%s\" не найдена." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Никакие публикации не найдены." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Публикация %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Таблицы:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Таблицы из схем:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версия %s) не поддерживает подписки." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Публикация" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Бинарная" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Потоковая" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Двухфазная фиксация" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Отключается при ошибке" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Синхронная фиксация" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Строка подключения" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Пропустить LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Список подписок" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "МД" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Входной тип" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Тип хранения" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Класс операторов" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Семейство операторов" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Список классов операторов" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Применимые типы" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Список семейств операторов" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Оператор" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Стратегия" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "сортировка" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "поиск" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Назначение" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Семейство для сортировки" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Список операторов из семейств операторов" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Зарегистрированный левый тип" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Зарегистрированный правый тип" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Номер" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Список опорных функций из семейств операторов" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Большие объекты" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2521,13 +2509,11 @@ msgstr "" "psql - это интерактивный терминал PostgreSQL.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Использование:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2535,13 +2521,11 @@ msgstr "" " psql [ПАРАМЕТР]... [БД [ПОЛЬЗОВАТЕЛЬ]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Общие параметры:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid "" " -c, --command=COMMAND run only single command (SQL or internal) and " "exit\n" @@ -2549,7 +2533,7 @@ msgstr "" " -c, --command=КОМАНДА выполнить одну команду (SQL или внутреннюю) и " "выйти\n" -#: help.c:83 +#: help.c:85 #, c-format msgid "" " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" @@ -2557,18 +2541,15 @@ msgstr "" " -d, --dbname=БД имя подключаемой базы данных (по умолчанию " "\"%s\")\n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ИМЯ_ФАЙЛА выполнить команды из файла и выйти\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list вывести список баз данных и выйти\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2578,19 +2559,16 @@ msgstr "" " присвоить переменной psql ИМЯ заданное ЗНАЧЕНИЕ\n" " (например: -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr "" " -X, --no-psqlrc игнорировать файл параметров запуска (~/.psqlrc)\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-" @@ -2600,24 +2578,20 @@ msgstr "" " выполнить как одну транзакцию\n" " (в неинтерактивном режиме)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] показать эту справку и выйти\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands перечислить команды с \\ и выйти\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr "" " --help=variables перечислить специальные переменные и выйти\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2625,64 +2599,54 @@ msgstr "" "\n" "Параметры ввода/вывода:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all отображать все команды из скрипта\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors отображать команды с ошибками\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries отображать команды, отправляемые серверу\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid "" " -E, --echo-hidden display queries that internal commands generate\n" msgstr "" " -E, --echo-hidden выводить запросы, порождённые внутренними " "командами\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=ИМЯ_ФАЙЛА сохранять протокол работы в файл\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid "" " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline отключить редактор командной строки readline\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" " -o, --output=ИМЯ_ФАЙЛА направить результаты запроса в файл (или канал " "|)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid "" " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet показывать только результаты запросов, без " "сообщений\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr "" " -s, --single-step пошаговый режим (подтверждение каждого запроса)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid "" " -S, --single-line single-line mode (end of line terminates SQL " "command)\n" @@ -2690,8 +2654,7 @@ msgstr "" " -S, --single-line однострочный режим (конец строки завершает " "команду)\n" -#: help.c:109 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2699,13 +2662,11 @@ msgstr "" "\n" "Параметры вывода:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align режим вывода невыровненной таблицы\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid "" " --csv CSV (Comma-Separated Values) table output mode\n" msgstr "" @@ -2713,7 +2674,7 @@ msgstr "" "разделённые\n" " запятыми)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2724,13 +2685,11 @@ msgstr "" " разделителей полей при невыровненном выводе\n" " (по умолчанию: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html вывод таблицы в формате HTML\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid "" " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset " "command)\n" @@ -2739,8 +2698,7 @@ msgstr "" "ЗНАЧЕНИЕМ)\n" " (см. описание \\pset)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: " @@ -2750,26 +2708,22 @@ msgstr "" " разделитель записей при невыровненном выводе\n" " (по умолчанию: новая строка)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only выводить только кортежи\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid "" " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, " "border)\n" msgstr "" " -T, --table-attr=ТЕКСТ установить атрибуты HTML-таблицы (width, border)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded включить развёрнутый вывод таблицы\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero " @@ -2779,8 +2733,7 @@ msgstr "" " сделать разделителем полей при невыровненном\n" " выводе нулевой байт\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero " @@ -2790,8 +2743,7 @@ msgstr "" " сделать разделителем записей при невыровненном\n" " нулевой байт\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2799,7 +2751,7 @@ msgstr "" "\n" "Параметры подключения:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory " @@ -2808,36 +2760,33 @@ msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" " (по умолчанию: \"%s\")\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "локальный сокет" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr "" " -p, --port=ПОРТ порт сервера баз данных (по умолчанию: \"%s\")\n" -#: help.c:137 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=ИМЯ имя пользователя (по умолчанию: \"%s\")\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid "" " -W, --password force password prompt (should happen " "automatically)\n" msgstr "" " -W, --password запрашивать пароль всегда (обычно не требуется)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or " @@ -2853,40 +2802,36 @@ msgstr "" "документации PostgreSQL.\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках сообщайте по адресу <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Общие\n" # skip-rule: copyright -#: help.c:172 -#, c-format +#: help.c:192 msgid "" " \\copyright show PostgreSQL usage and distribution terms\n" msgstr "" " \\copyright условия использования и распространения " "PostgreSQL\n" -#: help.c:173 -#, c-format +#: help.c:193 msgid "" -" \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +" \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [СТОЛБЦЫ] выполнить запрос и вывести результат в " "перекрёстном виде\n" -#: help.c:174 -#, c-format +#: help.c:194 msgid "" " \\errverbose show most recent error message at maximum " "verbosity\n" @@ -2894,27 +2839,22 @@ msgstr "" " \\errverbose вывести максимально подробное сообщение о " "последней ошибке\n" -#: help.c:175 -#, c-format +#: help.c:195 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 [(ПАРАМЕТРЫ)] [ФАЙЛ] выполнить запрос (и направить результаты в файл\n" -"\n" -" или канал |); \\g без аргументов равнозначно \";" +" \\g [(ПАРАМЕТРЫ)] [ФАЙЛ] выполнить запрос (и направить результат в файл\n" +" или канал |); \\g без аргументов равнозначно \";" "\"\n" -#: help.c:177 -#, c-format +#: help.c:197 msgid "" " \\gdesc describe result of query, without executing it\n" msgstr "" " \\gdesc описать результат запроса, но не выполнять его\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid "" " \\gexec execute query, then execute each value in its " "result\n" @@ -2922,69 +2862,63 @@ msgstr "" " \\gexec выполнить запрос, а затем выполнить каждую строку " "в результате\n" -#: help.c:179 -#, c-format +#: help.c:199 msgid "" -" \\gset [PREFIX] execute query and store results in psql variables\n" +" \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" -" \\gset [ПРЕФИКС] выполнить запрос и сохранить результаты в " +" \\gset [ПРЕФИКС] выполнить запрос и сохранить результат в " "переменных\n" " psql\n" -#: help.c:180 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr "" " \\gx [(ПАРАМЕТРЫ)] [ФАЙЛ] то же, что \\g, но в режиме развёрнутого вывода\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q выйти из psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr "" " \\watch [СЕК] повторять запрос в цикле через заданное число " "секунд\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Справка\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] справка по командам psql c \\\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr "" " \\? options справка по параметрам командной строки psql\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables справка по специальным переменным\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid "" " \\h [NAME] help on syntax of SQL commands, * for all " "commands\n" msgstr "" " \\h [ИМЯ] справка по заданному SQL-оператору; * - по всем\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Буфер запроса\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid "" " \\e [FILE] [LINE] edit the query buffer (or file) with external " "editor\n" @@ -2992,54 +2926,45 @@ msgstr "" " \\e [ФАЙЛ] [СТРОКА] править буфер запроса (или файл) во внешнем " "редакторе\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid "" " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [ФУНКЦИЯ [СТРОКА]] править определение функции во внешнем редакторе\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [VIEWNAME [LINE]] править определение представления во внешнем " "редакторе\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p вывести содержимое буфера запросов\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r очистить буфер запроса\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ФАЙЛ] вывести историю или сохранить её в файл\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ФАЙЛ записать буфер запроса в файл\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Ввод/Вывод\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid "" " \\copy ... perform SQL COPY with data stream to the client " "host\n" msgstr " \\copy ... выполнить SQL COPY на стороне клиента\n" -#: help.c:207 -#, c-format +#: help.c:227 msgid "" " \\echo [-n] [STRING] write string to standard output (-n for no " "newline)\n" @@ -3047,13 +2972,11 @@ msgstr "" " \\echo [-n] [СТРОКА] записать строку в поток стандартного вывода\n" " (-n отключает перевод строки)\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i ФАЙЛ выполнить команды из файла\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid "" " \\ir FILE as \\i, but relative to location of current " "script\n" @@ -3061,15 +2984,13 @@ msgstr "" " \\ir ФАЙЛ подобно \\i, но путь задаётся относительно\n" " текущего скрипта\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [ФАЙЛ] выводить все результаты запросов в файл или канал " "|\n" -#: help.c:211 -#, c-format +#: help.c:231 msgid "" " \\qecho [-n] [STRING] write string to \\o output stream (-n for no " "newline)\n" @@ -3077,8 +2998,7 @@ msgstr "" " \\qecho [-n] [СТРОКА] записать строку в выходной поток \\o\n" " (-n отключает перевод строки)\n" -#: help.c:212 -#, c-format +#: help.c:232 msgid "" " \\warn [-n] [STRING] write string to standard error (-n for no " "newline)\n" @@ -3086,159 +3006,136 @@ msgstr "" " \\warn [-n] [СТРОКА] записать строку в поток вывода ошибок\n" " (-n отключает перевод строки)\n" -#: help.c:215 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "Условия\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if ВЫРАЖЕНИЕ начало блока условия\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid "" " \\elif EXPR alternative within current conditional block\n" msgstr "" " \\elif ВЫРАЖЕНИЕ альтернативная ветвь в текущем блоке условия\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid "" " \\else final alternative within current conditional " "block\n" msgstr "" " \\else окончательная ветвь в текущем блоке условия\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif конец блока условия\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Информационные\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr "" " (дополнения: S = показывать системные объекты, + = дополнительные " "подробности)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr "" " \\d[S+] список таблиц, представлений и " "последовательностей\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" " \\d[S+] ИМЯ описание таблицы, представления, " "последовательности\n" " или индекса\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [МАСКА] список агрегатных функций\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [МАСКА] список методов доступа\n" # well-spelled: МСК -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [МСК_МД [МСК_ТИПА]] список классов операторов\n" # well-spelled: МСК -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [МСК_МД [МСК_ТИПА]] список семейств операторов\n" # well-spelled: МСК -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr "" " \\dAo[+] [МСК_МД [МСК_СОП]] список операторов из семейств операторов\n" # well-spelled: МСК -#: help.c:231 -#, c-format +#: help.c:251 msgid "" " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [МСК_МД [МСК_СОП]] список опорных функций из семейств\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [МАСКА] список табличных пространств\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [МАСКА] список преобразований\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [МАСКА] список параметров конфигурации\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [МАСКА] список приведений типов\n" -#: help.c:235 -#, c-format +#: help.c:256 msgid "" " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [МАСКА] описания объектов, не выводимые в других режимах\n" -#: help.c:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [МАСКА] список доменов\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [МАСКА] список прав по умолчанию\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [МАСКА] список сторонних таблиц\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [МАСКА] список сторонних серверов\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [МАСКА] список сторонних таблиц\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [МАСКА] список сопоставлений пользователей\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [МАСКА] список обёрток сторонних данных\n" # well-spelled: МСК, ФУНК -#: help.c:243 -#, c-format +#: help.c:264 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] " @@ -3248,60 +3145,49 @@ msgstr "" " список функций [только агрегатных/обычных/процедур/" "триггеров/оконных]\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [МАСКА] список конфигураций текстового поиска\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [МАСКА] список словарей текстового поиска\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [МАСКА] список анализаторов текстового поиска\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [МАСКА] список шаблонов текстового поиска\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [МАСКА] список ролей\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [МАСКА] список индексов\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr "" -" \\dl список больших объектов (то же, что и \\lo_list)\n" +" \\dl[+] список больших объектов (то же, что и \\lo_list)\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [МАСКА] список языков процедур\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [МАСКА] список материализованных представлений\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [МАСКА] список схем\n" # well-spelled: МСК -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3309,21 +3195,18 @@ msgstr "" " \\do[S+] [МСК_ОП [МСК_ТИПА [МСК_ТИПА]]]\n" " список операторов\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [МАСКА] список правил сортировки\n" -#: help.c:258 -#, c-format +#: help.c:279 msgid "" " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr "" " \\dp [МАСКА] список прав доступа к таблицам, представлениям и\n" " последовательностям\n" -#: help.c:259 -#, c-format +#: help.c:280 msgid "" " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations " "[n=nested]\n" @@ -3333,104 +3216,109 @@ msgstr "" "(n)\n" # well-spelled: МСК -#: help.c:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [МСК_РОЛИ [МСК_БД]] список параметров роли на уровне БД\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [МАСКА] список публикаций для репликации\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [МАСКА] список подписок на репликацию\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [МАСКА] список последовательностей\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [МАСКА] список таблиц\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [МАСКА] список типов данных\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [МАСКА] список ролей\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [МАСКА] список представлений\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [МАСКА] список расширений\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [МАСКА] список расширенных статистик\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [МАСКА] список событийных триггеров\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [МАСКА] список баз данных\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] ИМЯ_ФУНКЦИИ показать определение функции\n" # well-spelled: ПРЕДСТ -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ИМЯ_ПРЕДСТ показать определение представления\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [МАСКА] то же, что и \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Большие объекты\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export OID_БО ФАЙЛ записать большой объект в файл\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import ФАЙЛ [КОММЕНТАРИЙ]\n" +" прочитать большой объект из файла\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] список больших объектов\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink OID_БО удалить большой объект\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Форматирование\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid "" " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a переключение режимов вывода:\n" " неформатированный/выровненный\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [СТРОКА] задать заголовок таблицы или убрать, если не " "задан\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid "" " \\f [STRING] show or set field separator for unaligned query " "output\n" @@ -3438,14 +3326,13 @@ msgstr "" " \\f [СТРОКА] показать или установить разделитель полей для\n" " неформатированного вывода\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr "" " \\H переключить режим вывода в HTML (текущий: %s)\n" -#: help.c:283 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3463,32 +3350,34 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] режим вывода только строк (сейчас: %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid "" " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [СТРОКА] задать атрибуты для
или убрать, если не " "заданы\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr "" " \\x [on|off|auto] переключить режим расширенного вывода (сейчас: " "%s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Соединение\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3498,8 +3387,7 @@ msgstr "" " подключиться к другой базе данных\n" " (текущая: \"%s\")\n" -#: help.c:303 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3508,45 +3396,43 @@ msgstr "" " подключиться к другой базе данных\n" " (сейчас подключения нет)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid "" " \\conninfo display information about current connection\n" msgstr " \\conninfo информация о текущем соединении\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [КОДИРОВКА] показать/установить клиентскую кодировку\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ИМЯ] безопасно сменить пароль пользователя\n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Операционная система\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [ПУТЬ] сменить текущий каталог\n" -#: help.c:312 -#, c-format +# well-spelled: ОКР +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv ПЕР_PSQL ПЕР_ОКР прочитать переменную окружения\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr "" " \\setenv ИМЯ [ЗНАЧЕНИЕ] установить или сбросить переменную окружения\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] включить/выключить секундомер (сейчас: %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid "" " \\! [COMMAND] execute command in shell or start interactive " "shell\n" @@ -3554,20 +3440,17 @@ msgstr "" " \\! [КОМАНДА] выполнить команду в командной оболочке\n" " или запустить интерактивную оболочку\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Переменные\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [ТЕКСТ] ИМЯ предложить пользователю задать внутреннюю " "переменную\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid "" " \\set [NAME [VALUE]] set internal variable, or list all if no " "parameters\n" @@ -3575,31 +3458,11 @@ msgstr "" " \\set [ИМЯ [ЗНАЧЕНИЕ]] установить внутреннюю переменную или вывести все,\n" " если имя не задано\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset ИМЯ сбросить (удалить) внутреннюю переменную\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Большие объекты\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID ФАЙЛ\n" -" \\lo_import ФАЙЛ [КОММЕНТАРИЙ]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID операции с большими объектами\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" @@ -3607,13 +3470,11 @@ msgstr "" "Список специальных переменных\n" "\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "Переменные psql:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3623,8 +3484,7 @@ msgstr "" " или \\set ИМЯ ЗНАЧЕНИЕ в приглашении psql\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3632,8 +3492,7 @@ msgstr "" " AUTOCOMMIT\n" " если установлен, успешные SQL-команды фиксируются автоматически\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3645,8 +3504,7 @@ msgstr "" " preserve-lower (сохранять нижний),\n" " preserve-upper (сохранять верхний)]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3654,8 +3512,7 @@ msgstr "" " DBNAME\n" " имя текущей подключённой базы данных\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3666,8 +3523,7 @@ msgstr "" " [all (всё), errors (ошибки), none (ничего),\n" " queries (запросы)]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3677,8 +3533,7 @@ msgstr "" " если включено, выводит внутренние запросы, порождаемые командами с \\;\n" " если установлено значение \"noexec\", они выводятся, но не выполняются\n" -#: help.c:371 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3686,8 +3541,7 @@ msgstr "" " ENCODING\n" " текущая кодировка клиентского набора символов\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3695,8 +3549,7 @@ msgstr "" " ERROR\n" " true в случае ошибки в последнем запросе, иначе — false\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = " @@ -3706,8 +3559,7 @@ msgstr "" " число результирующих строк, извлекаемых и отображаемых за раз\n" " (0 = без ограничений)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3715,8 +3567,7 @@ msgstr "" " HIDE_TABLEAM\n" " если установлено, табличные методы доступа не выводятся\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3724,8 +3575,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " если установлено, методы сжатия не выводятся\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3734,8 +3584,7 @@ msgstr "" " управляет историей команд [ignorespace (игнорировать пробелы),\n" " ignoredups (игнорировать дубли), ignoreboth (и то, и другое)]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3743,8 +3592,7 @@ msgstr "" " HISTFILE\n" " имя файла, в котором будет сохраняться история команд\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3752,8 +3600,7 @@ msgstr "" " HISTSIZE\n" " максимальное число команд, сохраняемых в истории\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3761,8 +3608,7 @@ msgstr "" " HOST\n" " сервер баз данных, к которому установлено подключение\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3770,8 +3616,7 @@ msgstr "" " IGNOREEOF\n" " количество EOF для завершения интерактивного сеанса\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3779,8 +3624,7 @@ msgstr "" " LASTOID\n" " значение последнего задействованного OID\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3793,8 +3637,7 @@ msgstr "" "\"00000\",\n" " если ошибки не было\n" -#: help.c:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3803,8 +3646,7 @@ msgstr "" " если установлено, транзакция не прекращается при ошибке\n" " (используются неявные точки сохранения)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3812,8 +3654,7 @@ msgstr "" " ON_ERROR_STOP\n" " останавливать выполнение пакета команд после ошибки\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3821,8 +3662,7 @@ msgstr "" " PORT\n" " порт сервера для текущего соединения\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3830,8 +3670,7 @@ msgstr "" " PROMPT1\n" " устанавливает стандартное приглашение psql\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous " @@ -3841,8 +3680,7 @@ msgstr "" " устанавливает приглашение, которое выводится при переносе оператора\n" " на новую строку\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3850,8 +3688,7 @@ msgstr "" " PROMPT3\n" " устанавливает приглашение для выполнения COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3859,8 +3696,7 @@ msgstr "" " QUIET\n" " выводить минимум сообщений (как и с параметром -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3869,8 +3705,7 @@ msgstr "" " число строк, возвращённых или обработанных последним SQL-запросом, либо " "0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3880,8 +3715,16 @@ msgstr "" " SERVER_VERSION_NUM\n" " версия сервера (в коротком текстовом и числовом формате)\n" -#: help.c:415 -#, c-format +#: help.c:453 +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:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3890,8 +3733,7 @@ msgstr "" " управляет отображением полей контекста сообщений\n" " [never (не отображать никогда), errors (ошибки), always (всегда]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3900,8 +3742,7 @@ msgstr "" " если установлено, конец строки завершает режим ввода SQL-команды\n" " (как и с параметром -S)\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3909,8 +3750,7 @@ msgstr "" " SINGLESTEP\n" " пошаговый режим (как и с параметром -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3919,8 +3759,7 @@ msgstr "" " SQLSTATE последнего запроса или \"00000\", если он выполнился без " "ошибок\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3928,8 +3767,7 @@ msgstr "" " USER\n" " текущий пользователь, подключённый к БД\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3938,8 +3776,7 @@ msgstr "" " управляет детализацией отчётов об ошибках [default (по умолчанию),\n" " verbose (подробно), terse (кратко), sqlstate (код состояния)]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3951,8 +3788,7 @@ msgstr "" " VERSION_NUM\n" " версия psql (в развёрнутом, в коротком текстовом и в числовом формате)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3960,8 +3796,7 @@ msgstr "" "\n" "Параметры отображения:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3971,8 +3806,7 @@ msgstr "" " или \\pset ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3980,8 +3814,7 @@ msgstr "" " border\n" " стиль границы (число)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3989,8 +3822,7 @@ msgstr "" " columns\n" " целевая ширина для формата с переносом\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3998,7 +3830,7 @@ msgstr "" " expanded (или x)\n" " расширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -4007,8 +3839,7 @@ msgstr "" " fieldsep\n" " разделитель полей для неформатированного вывода (по умолчанию \"%s\")\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -4016,8 +3847,7 @@ msgstr "" " fieldsep_zero\n" " устанавливает ноль разделителем полей при неформатированном выводе\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -4025,8 +3855,7 @@ msgstr "" " footer\n" " включает или выключает вывод подписей таблицы [on (вкл.), off (выкл.)]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -4036,8 +3865,7 @@ msgstr "" "\n" " aligned (выровненный), wrapped (с переносом), html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -4045,8 +3873,7 @@ msgstr "" " linestyle\n" " задаёт стиль рисования линий границы [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -4054,8 +3881,7 @@ msgstr "" " null\n" " устанавливает строку, выводимую вместо значения NULL\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of " @@ -4064,8 +3890,7 @@ msgstr "" " numericlocale\n" " отключает вывод заданного локалью разделителя группы цифр\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -4074,8 +3899,7 @@ msgstr "" " определяет, используется ли внешний постраничник\n" " [yes (да), no (нет), always (всегда)]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -4083,8 +3907,7 @@ msgstr "" " recordsep\n" " разделитель записей (строк) при неформатированном выводе\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -4092,8 +3915,7 @@ msgstr "" " recordsep_zero\n" " устанавливает ноль разделителем записей при неформатированном выводе\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -4103,8 +3925,7 @@ msgstr "" " задаёт атрибуты для тега table в формате html или пропорциональные\n" " ширины столбцов для выровненных влево данных, в формате latex-longtable\n" -#: help.c:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -4112,8 +3933,7 @@ msgstr "" " title\n" " задаёт заголовок таблицы для последовательно печатаемых таблиц\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -4121,8 +3941,7 @@ msgstr "" " tuples_only\n" " если установлено, выводятся только непосредственно табличные данные\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -4135,8 +3954,7 @@ msgstr "" " задаёт стиль рисуемых линий Unicode [single (одинарные), double " "(двойные)]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -4144,8 +3962,7 @@ msgstr "" "\n" "Переменные окружения:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -4155,8 +3972,7 @@ msgstr "" " или \\setenv ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -4168,8 +3984,7 @@ msgstr "" " или \\setenv ИМЯ ЗНАЧЕНИЕ в приглашении psql\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -4177,8 +3992,7 @@ msgstr "" " COLUMNS\n" " число столбцов для форматирования с переносом\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -4186,8 +4000,7 @@ msgstr "" " PGAPPNAME\n" " синоним параметра подключения application_name\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -4195,8 +4008,7 @@ msgstr "" " PGDATABASE\n" " синоним параметра подключения dbname\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -4204,8 +4016,7 @@ msgstr "" " PGHOST\n" " синоним параметра подключения host\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -4213,8 +4024,7 @@ msgstr "" " PGPASSFILE\n" " имя файла с паролем\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -4222,8 +4032,7 @@ msgstr "" " PGPASSWORD\n" " пароль для подключения (использовать не рекомендуется)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4231,8 +4040,7 @@ msgstr "" " PGPORT\n" " синоним параметра подключения port\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4240,8 +4048,7 @@ msgstr "" " PGUSER\n" " синоним параметра подключения user\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4249,8 +4056,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор, вызываемый командами \\e, \\ef и \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4258,8 +4064,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " определяет способ передачи номера строки при вызове редактора\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4267,8 +4072,7 @@ msgstr "" " PSQL_HISTORY\n" " альтернативное размещение файла с историей команд\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4276,8 +4080,15 @@ msgstr "" " PSQL_PAGER, PAGER\n" " имя программы внешнего постраничника\n" -#: help.c:508 -#, c-format +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" имя программы внешнего постраничника для \\watch\n" + +#: help.c:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4285,8 +4096,7 @@ msgstr "" " PSQLRC\n" " альтернативное размещение пользовательского файла .psqlrc\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4294,8 +4104,7 @@ msgstr "" " SHELL\n" " оболочка, вызываемая командой \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4303,11 +4112,11 @@ msgstr "" " TMPDIR\n" " каталог для временных файлов\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Имеющаяся справка:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4326,7 +4135,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4340,12 +4149,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 "в данной среде история не поддерживается" @@ -4365,25 +4174,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 "Чтобы выйти из %s, введите \"\\q\".\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" @@ -4392,22 +4193,22 @@ msgstr "" "Чтобы восстановить базу данных из этого формата, воспользуйтесь программой " "командной строки 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 "Вы используете psql - интерфейс командной строки к PostgreSQL." # skip-rule: copyright -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4422,26 +4223,26 @@ 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" @@ -4458,2274 +4259,2384 @@ 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1281 -#: sql_help.c:1283 sql_help.c:1286 sql_help.c:1289 sql_help.c:1291 -#: sql_help.c:1293 sql_help.c:1296 sql_help.c:1299 sql_help.c:1412 -#: sql_help.c:1414 sql_help.c:1416 sql_help.c:1419 sql_help.c:1440 -#: sql_help.c:1443 sql_help.c:1446 sql_help.c:1449 sql_help.c:1453 -#: sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 sql_help.c:1473 -#: sql_help.c:1476 sql_help.c:1478 sql_help.c:1480 sql_help.c:1490 -#: sql_help.c:1492 sql_help.c:1502 sql_help.c:1504 sql_help.c:1514 -#: sql_help.c:1517 sql_help.c:1540 sql_help.c:1542 sql_help.c:1544 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1551 sql_help.c:1554 -#: sql_help.c:1557 sql_help.c:1608 sql_help.c:1651 sql_help.c:1654 -#: sql_help.c:1656 sql_help.c:1658 sql_help.c:1661 sql_help.c:1663 -#: sql_help.c:1665 sql_help.c:1668 sql_help.c:1718 sql_help.c:1734 -#: sql_help.c:1965 sql_help.c:2034 sql_help.c:2053 sql_help.c:2066 -#: sql_help.c:2123 sql_help.c:2130 sql_help.c:2140 sql_help.c:2161 -#: sql_help.c:2187 sql_help.c:2205 sql_help.c:2233 sql_help.c:2344 -#: sql_help.c:2390 sql_help.c:2414 sql_help.c:2437 sql_help.c:2441 -#: sql_help.c:2475 sql_help.c:2495 sql_help.c:2517 sql_help.c:2531 -#: sql_help.c:2552 sql_help.c:2576 sql_help.c:2606 sql_help.c:2631 -#: sql_help.c:2678 sql_help.c:2966 sql_help.c:2979 sql_help.c:2996 -#: sql_help.c:3012 sql_help.c:3052 sql_help.c:3106 sql_help.c:3110 -#: sql_help.c:3112 sql_help.c:3119 sql_help.c:3138 sql_help.c:3165 -#: sql_help.c:3200 sql_help.c:3212 sql_help.c:3221 sql_help.c:3265 -#: sql_help.c:3279 sql_help.c:3307 sql_help.c:3315 sql_help.c:3327 -#: sql_help.c:3337 sql_help.c:3345 sql_help.c:3353 sql_help.c:3361 -#: sql_help.c:3369 sql_help.c:3378 sql_help.c:3389 sql_help.c:3397 -#: sql_help.c:3405 sql_help.c:3413 sql_help.c:3421 sql_help.c:3431 -#: sql_help.c:3440 sql_help.c:3449 sql_help.c:3457 sql_help.c:3467 -#: sql_help.c:3478 sql_help.c:3486 sql_help.c:3495 sql_help.c:3506 -#: 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:3587 sql_help.c:3595 sql_help.c:3612 -#: sql_help.c:3621 sql_help.c:3629 sql_help.c:3646 sql_help.c:3661 -#: sql_help.c:3963 sql_help.c:4014 sql_help.c:4043 sql_help.c:4058 -#: sql_help.c:4551 sql_help.c:4599 sql_help.c:4757 +#: 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:1307 sql_help.c:1309 +#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319 +#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444 +#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473 +#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485 +#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506 +#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522 +#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547 +#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576 +#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587 +#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686 +#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695 +#: sql_help.c:1698 sql_help.c:1748 sql_help.c:1764 sql_help.c:1995 +#: sql_help.c:2064 sql_help.c:2083 sql_help.c:2096 sql_help.c:2153 +#: sql_help.c:2160 sql_help.c:2170 sql_help.c:2196 sql_help.c:2227 +#: sql_help.c:2245 sql_help.c:2273 sql_help.c:2384 sql_help.c:2430 +#: sql_help.c:2455 sql_help.c:2478 sql_help.c:2482 sql_help.c:2516 +#: sql_help.c:2536 sql_help.c:2558 sql_help.c:2572 sql_help.c:2593 +#: sql_help.c:2622 sql_help.c:2657 sql_help.c:2682 sql_help.c:2729 +#: sql_help.c:3024 sql_help.c:3037 sql_help.c:3054 sql_help.c:3070 +#: sql_help.c:3110 sql_help.c:3164 sql_help.c:3168 sql_help.c:3170 +#: sql_help.c:3177 sql_help.c:3196 sql_help.c:3223 sql_help.c:3258 +#: sql_help.c:3270 sql_help.c:3279 sql_help.c:3323 sql_help.c:3337 +#: sql_help.c:3365 sql_help.c:3373 sql_help.c:3385 sql_help.c:3395 +#: sql_help.c:3403 sql_help.c:3411 sql_help.c:3419 sql_help.c:3427 +#: sql_help.c:3436 sql_help.c:3447 sql_help.c:3455 sql_help.c:3463 +#: sql_help.c:3471 sql_help.c:3479 sql_help.c:3489 sql_help.c:3498 +#: sql_help.c:3507 sql_help.c:3515 sql_help.c:3525 sql_help.c:3536 +#: sql_help.c:3544 sql_help.c:3553 sql_help.c:3564 sql_help.c:3573 +#: sql_help.c:3581 sql_help.c:3589 sql_help.c:3597 sql_help.c:3605 +#: sql_help.c:3613 sql_help.c:3621 sql_help.c:3629 sql_help.c:3637 +#: sql_help.c:3645 sql_help.c:3653 sql_help.c:3670 sql_help.c:3679 +#: sql_help.c:3687 sql_help.c:3704 sql_help.c:3719 sql_help.c:4029 +#: sql_help.c:4139 sql_help.c:4168 sql_help.c:4183 sql_help.c:4686 +#: sql_help.c:4734 sql_help.c:4892 msgid "name" msgstr "имя" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1815 -#: sql_help.c:3280 sql_help.c:4319 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1845 +#: sql_help.c:3338 sql_help.c:4454 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1290 sql_help.c:1413 -#: sql_help.c:1456 sql_help.c:1477 sql_help.c:1491 sql_help.c:1503 -#: sql_help.c:1516 sql_help.c:1543 sql_help.c:1609 sql_help.c:1662 +#: 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:1316 sql_help.c:1443 +#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533 +#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692 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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1353 -#: sql_help.c:1415 sql_help.c:1458 sql_help.c:1479 sql_help.c:1541 -#: sql_help.c:1657 sql_help.c:2952 +#: 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:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509 +#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3010 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1292 sql_help.c:1460 sql_help.c:1481 -#: sql_help.c:1493 sql_help.c:1505 sql_help.c:1545 sql_help.c:1664 +#: 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:1318 sql_help.c:1490 sql_help.c:1511 +#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694 msgid "new_schema" msgstr "новая_схема" -#: sql_help.c:44 sql_help.c:1879 sql_help.c:3281 sql_help.c:4348 +#: sql_help.c:44 sql_help.c:1909 sql_help.c:3339 sql_help.c:4483 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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: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:2345 sql_help.c:2553 sql_help.c:3282 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3379 sql_help.c:3468 -#: sql_help.c:3496 sql_help.c:3841 sql_help.c:4221 sql_help.c:4325 -#: sql_help.c:4332 sql_help.c:4338 sql_help.c:4349 sql_help.c:4352 -#: sql_help.c:4355 +#: 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:1863 sql_help.c:1880 sql_help.c:1886 sql_help.c:1910 +#: sql_help.c:1913 sql_help.c:1916 sql_help.c:2065 sql_help.c:2084 +#: sql_help.c:2087 sql_help.c:2385 sql_help.c:2594 sql_help.c:3340 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3437 sql_help.c:3526 +#: sql_help.c:3554 sql_help.c:3904 sql_help.c:4353 sql_help.c:4460 +#: sql_help.c:4467 sql_help.c:4473 sql_help.c:4484 sql_help.c:4487 +#: sql_help.c:4490 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:4326 sql_help.c:4333 sql_help.c:4339 -#: sql_help.c:4350 sql_help.c:4353 sql_help.c:4356 +#: 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:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 +#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:4461 sql_help.c:4468 sql_help.c:4474 +#: sql_help.c:4485 sql_help.c:4488 sql_help.c:4491 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2347 sql_help.c:2555 -#: sql_help.c:3284 sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 -#: sql_help.c:3470 sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 -#: sql_help.c:4340 sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2387 sql_help.c:2596 +#: sql_help.c:3342 sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 +#: sql_help.c:3528 sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 +#: sql_help.c:4475 sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 msgid "argtype" msgstr "тип_аргумента" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1474 sql_help.c:1603 sql_help.c:1635 -#: sql_help.c:1687 sql_help.c:1750 sql_help.c:1936 sql_help.c:1943 -#: sql_help.c:2236 sql_help.c:2286 sql_help.c:2293 sql_help.c:2302 -#: sql_help.c:2391 sql_help.c:2607 sql_help.c:2700 sql_help.c:2981 -#: sql_help.c:3166 sql_help.c:3188 sql_help.c:3328 sql_help.c:3683 -#: sql_help.c:3882 sql_help.c:4057 sql_help.c:4820 +#: 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:1504 sql_help.c:1633 sql_help.c:1665 +#: sql_help.c:1717 sql_help.c:1780 sql_help.c:1966 sql_help.c:1973 +#: sql_help.c:2276 sql_help.c:2326 sql_help.c:2333 sql_help.c:2342 +#: sql_help.c:2431 sql_help.c:2658 sql_help.c:2751 sql_help.c:3039 +#: sql_help.c:3224 sql_help.c:3246 sql_help.c:3386 sql_help.c:3741 +#: sql_help.c:3948 sql_help.c:4182 sql_help.c:4955 msgid "option" msgstr "параметр" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1604 sql_help.c:2392 -#: sql_help.c:2608 sql_help.c:3167 sql_help.c:3329 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2432 +#: sql_help.c:2659 sql_help.c:3225 sql_help.c:3387 msgid "where option can be:" msgstr "где допустимые параметры:" -#: sql_help.c:114 sql_help.c:2169 +#: sql_help.c:116 sql_help.c:2208 msgid "allowconn" msgstr "разр_подключения" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1605 sql_help.c:2170 -#: sql_help.c:2393 sql_help.c:2609 sql_help.c:3168 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2209 +#: sql_help.c:2433 sql_help.c:2660 sql_help.c:3226 msgid "connlimit" msgstr "предел_подключений" -#: sql_help.c:116 sql_help.c:2171 +#: sql_help.c:118 sql_help.c:2210 msgid "istemplate" msgstr "это_шаблон" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1295 -#: sql_help.c:1346 sql_help.c:4061 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321 +#: sql_help.c:1373 sql_help.c:4186 msgid "new_tablespace" msgstr "новое_табл_пространство" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1161 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:2357 sql_help.c:2559 -#: sql_help.c:4079 sql_help.c:4539 +#: 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:1182 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2397 sql_help.c:2600 +#: sql_help.c:3916 sql_help.c:4204 sql_help.c:4365 sql_help.c:4674 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1326 sql_help.c:1348 -#: sql_help.c:1396 sql_help.c:1418 sql_help.c:1475 sql_help.c:1559 -#: sql_help.c:1613 sql_help.c:1636 sql_help.c:2237 sql_help.c:2287 -#: sql_help.c:2294 sql_help.c:2303 sql_help.c:2358 sql_help.c:2359 -#: sql_help.c:2422 sql_help.c:2425 sql_help.c:2459 sql_help.c:2560 -#: sql_help.c:2561 sql_help.c:2579 sql_help.c:2701 sql_help.c:2740 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 sql_help.c:2955 sql_help.c:2982 sql_help.c:3189 -#: sql_help.c:3883 sql_help.c:4540 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 +#: 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:1352 +#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505 +#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2277 +#: sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 sql_help.c:2398 +#: sql_help.c:2399 sql_help.c:2463 sql_help.c:2466 sql_help.c:2500 +#: sql_help.c:2601 sql_help.c:2602 sql_help.c:2625 sql_help.c:2752 +#: sql_help.c:2791 sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 +#: sql_help.c:2969 sql_help.c:2996 sql_help.c:3013 sql_help.c:3040 +#: sql_help.c:3247 sql_help.c:3949 sql_help.c:4675 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 msgid "value" msgstr "значение" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "целевая_роль" -#: sql_help.c:198 sql_help.c:2221 sql_help.c:2656 sql_help.c:2661 -#: sql_help.c:3816 sql_help.c:3825 sql_help.c:3844 sql_help.c:3853 -#: sql_help.c:4196 sql_help.c:4205 sql_help.c:4224 sql_help.c:4233 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2261 sql_help.c:2630 +#: sql_help.c:2707 sql_help.c:2712 sql_help.c:3879 sql_help.c:3888 +#: sql_help.c:3907 sql_help.c:3919 sql_help.c:4328 sql_help.c:4337 +#: sql_help.c:4356 sql_help.c:4368 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1294 sql_help.c:1623 sql_help.c:2396 sql_help.c:2397 -#: sql_help.c:2398 sql_help.c:2399 sql_help.c:2400 sql_help.c:2533 -#: sql_help.c:2612 sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 -#: sql_help.c:2616 sql_help.c:3171 sql_help.c:3172 sql_help.c:3173 -#: sql_help.c:3174 sql_help.c:3175 sql_help.c:3862 sql_help.c:3866 -#: sql_help.c:4242 sql_help.c:4246 sql_help.c:4561 +#: 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:1320 sql_help.c:1653 sql_help.c:2436 sql_help.c:2437 +#: sql_help.c:2438 sql_help.c:2439 sql_help.c:2440 sql_help.c:2574 +#: sql_help.c:2663 sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 +#: sql_help.c:2667 sql_help.c:3229 sql_help.c:3230 sql_help.c:3231 +#: sql_help.c:3232 sql_help.c:3233 sql_help.c:3928 sql_help.c:3932 +#: sql_help.c:4377 sql_help.c:4381 sql_help.c:4696 msgid "role_name" msgstr "имя_роли" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1310 sql_help.c:1312 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1400 sql_help.c:1653 -#: sql_help.c:2190 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2418 sql_help.c:2717 sql_help.c:2722 sql_help.c:2724 -#: sql_help.c:2841 sql_help.c:2854 sql_help.c:2868 sql_help.c:2877 -#: sql_help.c:2889 sql_help.c:2918 sql_help.c:3914 sql_help.c:3929 -#: sql_help.c:3931 sql_help.c:4412 sql_help.c:4413 sql_help.c:4422 -#: sql_help.c:4469 sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 -#: sql_help.c:4473 sql_help.c:4474 sql_help.c:4514 sql_help.c:4515 -#: sql_help.c:4520 sql_help.c:4525 sql_help.c:4669 sql_help.c:4670 -#: sql_help.c:4679 sql_help.c:4726 sql_help.c:4727 sql_help.c:4728 -#: sql_help.c:4729 sql_help.c:4730 sql_help.c:4731 sql_help.c:4785 -#: sql_help.c:4787 sql_help.c:4847 sql_help.c:4907 sql_help.c:4908 -#: sql_help.c:4917 sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 -#: sql_help.c:4967 sql_help.c:4968 sql_help.c:4969 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683 +#: sql_help.c:2230 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2459 sql_help.c:2629 sql_help.c:2768 sql_help.c:2773 +#: sql_help.c:2775 sql_help.c:2896 sql_help.c:2909 sql_help.c:2923 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:2973 sql_help.c:3980 +#: sql_help.c:3995 sql_help.c:3997 sql_help.c:4084 sql_help.c:4087 +#: sql_help.c:4089 sql_help.c:4547 sql_help.c:4548 sql_help.c:4557 +#: sql_help.c:4604 sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 +#: sql_help.c:4608 sql_help.c:4609 sql_help.c:4649 sql_help.c:4650 +#: sql_help.c:4655 sql_help.c:4660 sql_help.c:4804 sql_help.c:4805 +#: sql_help.c:4814 sql_help.c:4861 sql_help.c:4862 sql_help.c:4863 +#: sql_help.c:4864 sql_help.c:4865 sql_help.c:4866 sql_help.c:4920 +#: sql_help.c:4922 sql_help.c:4982 sql_help.c:5042 sql_help.c:5043 +#: sql_help.c:5052 sql_help.c:5099 sql_help.c:5100 sql_help.c:5101 +#: sql_help.c:5102 sql_help.c:5103 sql_help.c:5104 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:1287 sql_help.c:1334 sql_help.c:1335 sql_help.c:1336 -#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1391 sql_help.c:1821 -#: sql_help.c:1823 sql_help.c:2193 sql_help.c:2305 sql_help.c:2310 -#: sql_help.c:2876 sql_help.c:2888 sql_help.c:3926 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362 +#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1851 +#: sql_help.c:1853 sql_help.c:2233 sql_help.c:2345 sql_help.c:2350 +#: sql_help.c:2931 sql_help.c:2943 sql_help.c:3992 msgid "constraint_name" msgstr "имя_ограничения" -#: sql_help.c:244 sql_help.c:1288 +#: sql_help.c:247 sql_help.c:1314 msgid "new_constraint_name" msgstr "имя_нового_ограничения" -#: sql_help.c:317 sql_help.c:1082 +#: 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:1813 sql_help.c:1818 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:1831 sql_help.c:1836 sql_help.c:1838 -#: sql_help.c:1842 sql_help.c:1844 sql_help.c:1848 sql_help.c:1853 -#: sql_help.c:1854 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:1871 -#: sql_help.c:1876 sql_help.c:1877 sql_help.c:4315 sql_help.c:4320 -#: sql_help.c:4321 sql_help.c:4322 sql_help.c:4323 sql_help.c:4329 -#: sql_help.c:4330 sql_help.c:4335 sql_help.c:4336 sql_help.c:4341 -#: sql_help.c:4342 sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 -#: sql_help.c:4346 +#: 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:1843 sql_help.c:1848 sql_help.c:1855 +#: 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:1866 sql_help.c:1868 +#: sql_help.c:1872 sql_help.c:1874 sql_help.c:1878 sql_help.c:1883 +#: sql_help.c:1884 sql_help.c:1891 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:1906 sql_help.c:1907 sql_help.c:4450 sql_help.c:4455 +#: sql_help.c:4456 sql_help.c:4457 sql_help.c:4458 sql_help.c:4464 +#: sql_help.c:4465 sql_help.c:4470 sql_help.c:4471 sql_help.c:4476 +#: sql_help.c:4477 sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 +#: sql_help.c:4481 msgid "object_name" msgstr "имя_объекта" # well-spelled: агр -#: sql_help.c:326 sql_help.c:1814 sql_help.c:4318 +#: sql_help.c:329 sql_help.c:1844 sql_help.c:4453 msgid "aggregate_name" msgstr "имя_агр_функции" -#: sql_help.c:328 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104 -#: sql_help.c:2106 sql_help.c:3298 +#: sql_help.c:331 sql_help.c:1846 sql_help.c:2130 sql_help.c:2134 +#: sql_help.c:2136 sql_help.c:3356 msgid "source_type" msgstr "исходный_тип" -#: sql_help.c:329 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:332 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "target_type" msgstr "целевой_тип" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1832 sql_help.c:2102 -#: sql_help.c:2143 sql_help.c:2209 sql_help.c:2476 sql_help.c:2507 -#: sql_help.c:3058 sql_help.c:4220 sql_help.c:4324 sql_help.c:4441 -#: sql_help.c:4445 sql_help.c:4449 sql_help.c:4452 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4706 sql_help.c:4709 sql_help.c:4936 -#: sql_help.c:4940 sql_help.c:4944 sql_help.c:4947 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1862 sql_help.c:2132 +#: sql_help.c:2173 sql_help.c:2249 sql_help.c:2517 sql_help.c:2548 +#: sql_help.c:3116 sql_help.c:4352 sql_help.c:4459 sql_help.c:4576 +#: sql_help.c:4580 sql_help.c:4584 sql_help.c:4587 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4841 sql_help.c:4844 sql_help.c:5071 +#: sql_help.c:5075 sql_help.c:5079 sql_help.c:5082 msgid "function_name" msgstr "имя_функции" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1839 sql_help.c:2500 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1869 sql_help.c:2541 msgid "operator_name" msgstr "имя_оператора" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1840 -#: sql_help.c:2477 sql_help.c:3422 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1870 +#: sql_help.c:2518 sql_help.c:3480 msgid "left_type" msgstr "тип_слева" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "right_type" msgstr "тип_справа" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1380 sql_help.c:1843 sql_help.c:1845 sql_help.c:2497 -#: sql_help.c:2518 sql_help.c:2894 sql_help.c:3432 sql_help.c:3441 +#: 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:1407 sql_help.c:1873 sql_help.c:1875 sql_help.c:2538 +#: sql_help.c:2559 sql_help.c:2949 sql_help.c:3490 sql_help.c:3499 msgid "index_method" msgstr "метод_индекса" -#: sql_help.c:349 sql_help.c:1849 sql_help.c:4331 +#: sql_help.c:352 sql_help.c:1879 sql_help.c:4466 msgid "procedure_name" msgstr "имя_процедуры" -#: sql_help.c:353 sql_help.c:1855 sql_help.c:3840 sql_help.c:4337 +#: sql_help.c:356 sql_help.c:1885 sql_help.c:3903 sql_help.c:4472 msgid "routine_name" msgstr "имя_подпрограммы" -#: sql_help.c:365 sql_help.c:1352 sql_help.c:1872 sql_help.c:2353 -#: sql_help.c:2558 sql_help.c:2849 sql_help.c:3025 sql_help.c:3603 -#: sql_help.c:3859 sql_help.c:4239 +#: sql_help.c:368 sql_help.c:1379 sql_help.c:1902 sql_help.c:2393 +#: sql_help.c:2599 sql_help.c:2904 sql_help.c:3083 sql_help.c:3661 +#: sql_help.c:3925 sql_help.c:4374 msgid "type_name" msgstr "имя_типа" -#: sql_help.c:366 sql_help.c:1873 sql_help.c:2352 sql_help.c:2557 -#: sql_help.c:3026 sql_help.c:3256 sql_help.c:3604 sql_help.c:3847 -#: sql_help.c:4227 +#: sql_help.c:369 sql_help.c:1903 sql_help.c:2392 sql_help.c:2598 +#: sql_help.c:3084 sql_help.c:3314 sql_help.c:3662 sql_help.c:3910 +#: sql_help.c:4359 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:1967 sql_help.c:2234 +#: sql_help.c:395 sql_help.c:1997 sql_help.c:2274 msgid "handler_function" msgstr "функция_обработчик" -#: sql_help.c:393 sql_help.c:2235 +#: sql_help.c:396 sql_help.c:2275 msgid "validator_function" msgstr "функция_проверки" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1282 sql_help.c:1550 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1308 sql_help.c:1580 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1284 -#: sql_help.c:1302 sql_help.c:1306 sql_help.c:1307 sql_help.c:1311 -#: sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 -#: sql_help.c:1318 sql_help.c:1321 sql_help.c:1322 sql_help.c:1324 -#: sql_help.c:1327 sql_help.c:1329 sql_help.c:1330 sql_help.c:1376 -#: sql_help.c:1378 sql_help.c:1385 sql_help.c:1394 sql_help.c:1399 -#: sql_help.c:1652 sql_help.c:1655 sql_help.c:1659 sql_help.c:1695 -#: sql_help.c:1820 sql_help.c:1933 sql_help.c:1939 sql_help.c:1952 -#: sql_help.c:1953 sql_help.c:1954 sql_help.c:2284 sql_help.c:2297 -#: sql_help.c:2350 sql_help.c:2417 sql_help.c:2423 sql_help.c:2456 -#: sql_help.c:2686 sql_help.c:2721 sql_help.c:2723 sql_help.c:2831 -#: sql_help.c:2840 sql_help.c:2850 sql_help.c:2853 sql_help.c:2863 -#: sql_help.c:2867 sql_help.c:2890 sql_help.c:2892 sql_help.c:2899 -#: sql_help.c:2912 sql_help.c:2917 sql_help.c:2935 sql_help.c:3061 -#: sql_help.c:3201 sql_help.c:3819 sql_help.c:3820 sql_help.c:3913 -#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3932 sql_help.c:4199 -#: sql_help.c:4200 sql_help.c:4317 sql_help.c:4478 sql_help.c:4484 -#: sql_help.c:4486 sql_help.c:4735 sql_help.c:4741 sql_help.c:4743 -#: sql_help.c:4784 sql_help.c:4786 sql_help.c:4788 sql_help.c:4835 -#: sql_help.c:4973 sql_help.c:4979 sql_help.c:4981 +#: 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:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333 +#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 +#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348 +#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356 +#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421 +#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682 +#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1725 sql_help.c:1850 +#: sql_help.c:1963 sql_help.c:1969 sql_help.c:1982 sql_help.c:1983 +#: sql_help.c:1984 sql_help.c:2324 sql_help.c:2337 sql_help.c:2390 +#: sql_help.c:2458 sql_help.c:2464 sql_help.c:2497 sql_help.c:2628 +#: sql_help.c:2737 sql_help.c:2772 sql_help.c:2774 sql_help.c:2886 +#: sql_help.c:2895 sql_help.c:2905 sql_help.c:2908 sql_help.c:2918 +#: sql_help.c:2922 sql_help.c:2945 sql_help.c:2947 sql_help.c:2954 +#: sql_help.c:2967 sql_help.c:2972 sql_help.c:2976 sql_help.c:2977 +#: sql_help.c:2993 sql_help.c:3119 sql_help.c:3259 sql_help.c:3882 +#: sql_help.c:3883 sql_help.c:3979 sql_help.c:3994 sql_help.c:3996 +#: sql_help.c:3998 sql_help.c:4083 sql_help.c:4086 sql_help.c:4088 +#: sql_help.c:4331 sql_help.c:4332 sql_help.c:4452 sql_help.c:4613 +#: sql_help.c:4619 sql_help.c:4621 sql_help.c:4870 sql_help.c:4876 +#: sql_help.c:4878 sql_help.c:4919 sql_help.c:4921 sql_help.c:4923 +#: sql_help.c:4970 sql_help.c:5108 sql_help.c:5114 sql_help.c:5116 msgid "column_name" msgstr "имя_столбца" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1285 sql_help.c:1660 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690 msgid "new_column_name" msgstr "новое_имя_столбца" -#: sql_help.c:449 sql_help.c:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1301 sql_help.c:1560 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1327 sql_help.c:1590 msgid "where action is one of:" msgstr "где допустимое действие:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1056 sql_help.c:1303 -#: sql_help.c:1308 sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 -#: sql_help.c:2285 sql_help.c:2496 sql_help.c:2679 sql_help.c:2832 -#: sql_help.c:3108 sql_help.c:4015 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329 +#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2228 +#: sql_help.c:2325 sql_help.c:2537 sql_help.c:2730 sql_help.c:2887 +#: sql_help.c:3166 sql_help.c:4140 msgid "data_type" msgstr "тип_данных" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1304 sql_help.c:1309 -#: sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 sql_help.c:2288 -#: sql_help.c:2419 sql_help.c:2834 sql_help.c:2842 sql_help.c:2855 -#: sql_help.c:2869 sql_help.c:3109 sql_help.c:3115 sql_help.c:3923 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335 +#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 sql_help.c:2328 +#: sql_help.c:2460 sql_help.c:2889 sql_help.c:2897 sql_help.c:2910 +#: sql_help.c:2924 sql_help.c:3167 sql_help.c:3173 sql_help.c:3989 msgid "collation" msgstr "правило_сортировки" -#: sql_help.c:453 sql_help.c:1305 sql_help.c:2289 sql_help.c:2298 -#: sql_help.c:2835 sql_help.c:2851 sql_help.c:2864 +#: sql_help.c:456 sql_help.c:1331 sql_help.c:2329 sql_help.c:2338 +#: sql_help.c:2890 sql_help.c:2906 sql_help.c:2919 msgid "column_constraint" msgstr "ограничение_столбца" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1323 sql_help.c:4832 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4967 msgid "integer" msgstr "целое" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1325 -#: sql_help.c:1328 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351 +#: sql_help.c:1354 msgid "attribute_option" msgstr "атрибут" -#: sql_help.c:473 sql_help.c:1332 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:476 sql_help.c:1358 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "table_constraint" msgstr "ограничение_таблицы" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1337 -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:1340 sql_help.c:1874 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363 +#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1904 msgid "trigger_name" msgstr "имя_триггера" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1350 sql_help.c:1351 -#: sql_help.c:2291 sql_help.c:2296 sql_help.c:2839 sql_help.c:2862 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378 +#: sql_help.c:2331 sql_help.c:2336 sql_help.c:2894 sql_help.c:2917 msgid "parent_table" msgstr "таблица_родитель" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1519 sql_help.c:2220 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1549 sql_help.c:2260 msgid "extension_name" msgstr "имя_расширения" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2354 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2394 msgid "execution_cost" msgstr "стоимость_выполнения" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2355 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2395 msgid "result_rows" msgstr "строк_в_результате" -#: sql_help.c:544 sql_help.c:2356 +#: sql_help.c:547 sql_help.c:2396 msgid "support_function" msgstr "вспомогательная_функция" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1602 sql_help.c:1610 -#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:2657 -#: sql_help.c:2659 sql_help.c:2662 sql_help.c:2663 sql_help.c:3817 -#: sql_help.c:3818 sql_help.c:3822 sql_help.c:3823 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:3845 sql_help.c:3846 sql_help.c:3848 -#: sql_help.c:3849 sql_help.c:3851 sql_help.c:3852 sql_help.c:3854 -#: sql_help.c:3855 sql_help.c:3857 sql_help.c:3858 sql_help.c:3860 -#: sql_help.c:3861 sql_help.c:3863 sql_help.c:3864 sql_help.c:4197 -#: sql_help.c:4198 sql_help.c:4202 sql_help.c:4203 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:4225 sql_help.c:4226 sql_help.c:4228 -#: sql_help.c:4229 sql_help.c:4231 sql_help.c:4232 sql_help.c:4234 -#: sql_help.c:4235 sql_help.c:4237 sql_help.c:4238 sql_help.c:4240 -#: sql_help.c:4241 sql_help.c:4243 sql_help.c:4244 +#: 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:1632 sql_help.c:1640 +#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2708 +#: sql_help.c:2710 sql_help.c:2713 sql_help.c:2714 sql_help.c:3880 +#: sql_help.c:3881 sql_help.c:3885 sql_help.c:3886 sql_help.c:3889 +#: sql_help.c:3890 sql_help.c:3892 sql_help.c:3893 sql_help.c:3895 +#: sql_help.c:3896 sql_help.c:3898 sql_help.c:3899 sql_help.c:3901 +#: sql_help.c:3902 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:3920 sql_help.c:3921 sql_help.c:3923 +#: sql_help.c:3924 sql_help.c:3926 sql_help.c:3927 sql_help.c:3929 +#: sql_help.c:3930 sql_help.c:4329 sql_help.c:4330 sql_help.c:4334 +#: sql_help.c:4335 sql_help.c:4338 sql_help.c:4339 sql_help.c:4341 +#: sql_help.c:4342 sql_help.c:4344 sql_help.c:4345 sql_help.c:4347 +#: sql_help.c:4348 sql_help.c:4350 sql_help.c:4351 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 sql_help.c:4369 +#: sql_help.c:4370 sql_help.c:4372 sql_help.c:4373 sql_help.c:4375 +#: sql_help.c:4376 sql_help.c:4378 sql_help.c:4379 msgid "role_specification" msgstr "указание_роли" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1633 sql_help.c:2162 -#: sql_help.c:2665 sql_help.c:3186 sql_help.c:3637 sql_help.c:4571 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2197 +#: sql_help.c:2716 sql_help.c:3244 sql_help.c:3695 sql_help.c:4706 msgid "user_name" msgstr "имя_пользователя" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1622 sql_help.c:2664 -#: sql_help.c:3865 sql_help.c:4245 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2715 +#: sql_help.c:3931 sql_help.c:4380 msgid "where role_specification can be:" msgstr "где допустимое указание_роли:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "имя_группы" -#: sql_help.c:593 sql_help.c:1397 sql_help.c:2168 sql_help.c:2426 -#: sql_help.c:2460 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2951 sql_help.c:3856 -#: sql_help.c:4236 +#: sql_help.c:596 sql_help.c:1424 sql_help.c:2207 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2902 sql_help.c:2915 sql_help.c:2929 +#: sql_help.c:2970 sql_help.c:2997 sql_help.c:3009 sql_help.c:3922 +#: sql_help.c:4371 msgid "tablespace_name" msgstr "табл_пространство" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1345 sql_help.c:1354 -#: sql_help.c:1392 sql_help.c:1749 sql_help.c:1752 +#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381 +#: sql_help.c:1419 sql_help.c:1779 sql_help.c:1782 msgid "index_name" msgstr "имя_индекса" -#: sql_help.c:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1347 -#: sql_help.c:1349 sql_help.c:1395 sql_help.c:2424 sql_help.c:2458 -#: sql_help.c:2845 sql_help.c:2858 sql_help.c:2872 sql_help.c:2913 -#: sql_help.c:2937 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374 +#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2465 sql_help.c:2499 +#: sql_help.c:2900 sql_help.c:2913 sql_help.c:2927 sql_help.c:2968 +#: sql_help.c:2995 msgid "storage_parameter" msgstr "параметр_хранения" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "номер_столбца" -#: sql_help.c:628 sql_help.c:1837 sql_help.c:4328 +#: sql_help.c:631 sql_help.c:1867 sql_help.c:4463 msgid "large_object_oid" msgstr "oid_большого_объекта" -#: sql_help.c:686 sql_help.c:1331 sql_help.c:2833 +#: sql_help.c:690 sql_help.c:1357 sql_help.c:2888 msgid "compression_method" msgstr "метод_сжатия" -#: sql_help.c:720 sql_help.c:2481 +#: sql_help.c:692 sql_help.c:1372 +msgid "new_access_method" +msgstr "новый_метод_доступа" + +#: sql_help.c:725 sql_help.c:2522 msgid "res_proc" msgstr "процедура_ограничения" -#: sql_help.c:721 sql_help.c:2482 +#: sql_help.c:726 sql_help.c:2523 msgid "join_proc" msgstr "процедура_соединения" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2499 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2540 msgid "strategy_number" msgstr "номер_стратегии" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2501 sql_help.c:2502 -#: sql_help.c:2505 sql_help.c:2506 +#: 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:2542 sql_help.c:2543 +#: sql_help.c:2546 sql_help.c:2547 msgid "op_type" msgstr "тип_операции" -#: sql_help.c:777 sql_help.c:2503 +#: sql_help.c:782 sql_help.c:2544 msgid "sort_family_name" msgstr "семейство_сортировки" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2504 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2545 msgid "support_number" msgstr "номер_опорной_процедуры" -#: sql_help.c:782 sql_help.c:2103 sql_help.c:2508 sql_help.c:3028 -#: sql_help.c:3030 +#: sql_help.c:787 sql_help.c:2133 sql_help.c:2549 sql_help.c:3086 +#: sql_help.c:3088 msgid "argument_type" msgstr "тип_аргумента" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1515 sql_help.c:1518 -#: sql_help.c:1694 sql_help.c:1748 sql_help.c:1751 sql_help.c:1822 -#: sql_help.c:1847 sql_help.c:1860 sql_help.c:1875 sql_help.c:1932 -#: sql_help.c:1938 sql_help.c:2283 sql_help.c:2295 sql_help.c:2415 -#: sql_help.c:2455 sql_help.c:2532 sql_help.c:2577 sql_help.c:2633 -#: sql_help.c:2685 sql_help.c:2718 sql_help.c:2725 sql_help.c:2830 -#: sql_help.c:2848 sql_help.c:2861 sql_help.c:2934 sql_help.c:3054 -#: sql_help.c:3235 sql_help.c:3458 sql_help.c:3507 sql_help.c:3613 -#: sql_help.c:3815 sql_help.c:3821 sql_help.c:3879 sql_help.c:3911 -#: sql_help.c:4195 sql_help.c:4201 sql_help.c:4316 sql_help.c:4427 -#: sql_help.c:4429 sql_help.c:4491 sql_help.c:4530 sql_help.c:4684 -#: sql_help.c:4686 sql_help.c:4748 sql_help.c:4782 sql_help.c:4834 -#: sql_help.c:4922 sql_help.c:4924 sql_help.c:4986 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1724 sql_help.c:1778 +#: sql_help.c:1781 sql_help.c:1852 sql_help.c:1877 sql_help.c:1890 +#: sql_help.c:1905 sql_help.c:1962 sql_help.c:1968 sql_help.c:2323 +#: sql_help.c:2335 sql_help.c:2456 sql_help.c:2496 sql_help.c:2573 +#: sql_help.c:2627 sql_help.c:2684 sql_help.c:2736 sql_help.c:2769 +#: sql_help.c:2776 sql_help.c:2885 sql_help.c:2903 sql_help.c:2916 +#: sql_help.c:2992 sql_help.c:3112 sql_help.c:3293 sql_help.c:3516 +#: sql_help.c:3565 sql_help.c:3671 sql_help.c:3878 sql_help.c:3884 +#: sql_help.c:3945 sql_help.c:3977 sql_help.c:4327 sql_help.c:4333 +#: sql_help.c:4451 sql_help.c:4562 sql_help.c:4564 sql_help.c:4626 +#: sql_help.c:4665 sql_help.c:4819 sql_help.c:4821 sql_help.c:4883 +#: sql_help.c:4917 sql_help.c:4969 sql_help.c:5057 sql_help.c:5059 +#: sql_help.c:5121 msgid "table_name" msgstr "имя_таблицы" -#: sql_help.c:818 sql_help.c:2534 +#: sql_help.c:823 sql_help.c:2575 msgid "using_expression" msgstr "выражение_использования" -#: sql_help.c:819 sql_help.c:2535 +#: sql_help.c:824 sql_help.c:2576 msgid "check_expression" msgstr "выражение_проверки" -#: sql_help.c:893 sql_help.c:2578 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2623 +msgid "publication_object" +msgstr "объект_публикации" + +#: sql_help.c:903 sql_help.c:2624 msgid "publication_parameter" msgstr "параметр_публикации" -#: sql_help.c:937 sql_help.c:1606 sql_help.c:2394 sql_help.c:2610 -#: sql_help.c:3169 +#: sql_help.c:909 sql_help.c:2626 +msgid "where publication_object is one of:" +msgstr "где объект_публикации:" + +#: sql_help.c:952 sql_help.c:1636 sql_help.c:2434 sql_help.c:2661 +#: sql_help.c:3227 msgid "password" msgstr "пароль" -#: sql_help.c:938 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:953 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:3828 -#: sql_help.c:4208 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3891 +#: sql_help.c:4340 msgid "database_name" msgstr "имя_БД" -#: sql_help.c:1057 sql_help.c:2680 +#: sql_help.c:1073 sql_help.c:2731 msgid "increment" msgstr "шаг" -#: sql_help.c:1058 sql_help.c:2681 +#: sql_help.c:1074 sql_help.c:2732 msgid "minvalue" msgstr "мин_значение" -#: sql_help.c:1059 sql_help.c:2682 +#: sql_help.c:1075 sql_help.c:2733 msgid "maxvalue" msgstr "макс_значение" -#: sql_help.c:1060 sql_help.c:2683 sql_help.c:4425 sql_help.c:4528 -#: sql_help.c:4682 sql_help.c:4851 sql_help.c:4920 +#: sql_help.c:1076 sql_help.c:2734 sql_help.c:4560 sql_help.c:4663 +#: sql_help.c:4817 sql_help.c:4986 sql_help.c:5055 msgid "start" msgstr "начальное_значение" -#: sql_help.c:1061 sql_help.c:1320 +#: sql_help.c:1077 sql_help.c:1346 msgid "restart" msgstr "значение_перезапуска" -#: sql_help.c:1062 sql_help.c:2684 +#: sql_help.c:1078 sql_help.c:2735 msgid "cache" msgstr "кеш" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "новое_имя" -#: sql_help.c:1124 sql_help.c:2737 +#: sql_help.c:1142 sql_help.c:2788 msgid "conninfo" msgstr "строка_подключения" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2738 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2789 msgid "publication_name" msgstr "имя_публикации" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "параметр_публикации" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "параметр_обновления" -#: sql_help.c:1143 sql_help.c:2739 +#: sql_help.c:1161 sql_help.c:2790 msgid "subscription_parameter" msgstr "параметр_подписки" -#: sql_help.c:1297 sql_help.c:1300 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "параметр_пропуска" + +#: sql_help.c:1323 sql_help.c:1326 msgid "partition_name" msgstr "имя_секции" -#: sql_help.c:1298 sql_help.c:2300 sql_help.c:2866 +#: sql_help.c:1324 sql_help.c:2340 sql_help.c:2921 msgid "partition_bound_spec" msgstr "указание_границ_секции" -#: sql_help.c:1317 sql_help.c:1366 sql_help.c:2880 +#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2935 msgid "sequence_options" msgstr "параметры_последовательности" -#: sql_help.c:1319 +#: sql_help.c:1345 msgid "sequence_option" msgstr "параметр_последовательности" -#: sql_help.c:1333 +#: sql_help.c:1359 msgid "table_constraint_using_index" msgstr "ограничение_таблицы_с_индексом" -#: sql_help.c:1341 sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 +#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 msgid "rewrite_rule_name" msgstr "имя_правила_перезаписи" -#: sql_help.c:1355 sql_help.c:2312 sql_help.c:2905 +#: sql_help.c:1382 sql_help.c:2352 sql_help.c:2960 msgid "and partition_bound_spec is:" msgstr "и указание_границ_секции:" -#: sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 sql_help.c:2313 -#: sql_help.c:2314 sql_help.c:2315 sql_help.c:2906 sql_help.c:2907 -#: sql_help.c:2908 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2353 +#: sql_help.c:2354 sql_help.c:2355 sql_help.c:2961 sql_help.c:2962 +#: sql_help.c:2963 msgid "partition_bound_expr" msgstr "выражение_границ_секции" -#: sql_help.c:1359 sql_help.c:1360 sql_help.c:2316 sql_help.c:2317 -#: sql_help.c:2909 sql_help.c:2910 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2356 sql_help.c:2357 +#: sql_help.c:2964 sql_help.c:2965 msgid "numeric_literal" msgstr "числовая_константа" -#: sql_help.c:1361 +#: sql_help.c:1388 msgid "and column_constraint is:" msgstr "и ограничение_столбца:" -#: sql_help.c:1364 sql_help.c:2307 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:2878 +#: sql_help.c:1391 sql_help.c:2347 sql_help.c:2388 sql_help.c:2597 +#: sql_help.c:2933 msgid "default_expr" msgstr "выражение_по_умолчанию" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2934 msgid "generation_expr" msgstr "генерирующее_выражение" -#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1377 sql_help.c:1379 -#: sql_help.c:1383 sql_help.c:2881 sql_help.c:2882 sql_help.c:2891 -#: sql_help.c:2893 sql_help.c:2897 +#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406 +#: sql_help.c:1410 sql_help.c:2936 sql_help.c:2937 sql_help.c:2946 +#: sql_help.c:2948 sql_help.c:2952 msgid "index_parameters" msgstr "параметры_индекса" -#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2883 sql_help.c:2900 +#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2938 sql_help.c:2955 msgid "reftable" msgstr "целевая_таблица" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "refcolumn" msgstr "целевой_столбец" -#: sql_help.c:1371 sql_help.c:1372 sql_help.c:1388 sql_help.c:1389 -#: sql_help.c:2885 sql_help.c:2886 sql_help.c:2902 sql_help.c:2903 +#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416 +#: sql_help.c:2940 sql_help.c:2941 sql_help.c:2957 sql_help.c:2958 msgid "referential_action" msgstr "ссылочное_действие" -#: sql_help.c:1373 sql_help.c:2309 sql_help.c:2887 +#: sql_help.c:1400 sql_help.c:2349 sql_help.c:2942 msgid "and table_constraint is:" msgstr "и ограничение_таблицы:" -#: sql_help.c:1381 sql_help.c:2895 +#: sql_help.c:1408 sql_help.c:2950 msgid "exclude_element" msgstr "объект_исключения" -#: sql_help.c:1382 sql_help.c:2896 sql_help.c:4423 sql_help.c:4526 -#: sql_help.c:4680 sql_help.c:4849 sql_help.c:4918 +#: sql_help.c:1409 sql_help.c:2951 sql_help.c:4558 sql_help.c:4661 +#: sql_help.c:4815 sql_help.c:4984 sql_help.c:5053 msgid "operator" msgstr "оператор" -#: sql_help.c:1384 sql_help.c:2427 sql_help.c:2898 +#: sql_help.c:1411 sql_help.c:2468 sql_help.c:2953 msgid "predicate" msgstr "предикат" -#: sql_help.c:1390 +#: sql_help.c:1417 msgid "and table_constraint_using_index is:" msgstr "и ограничение_таблицы_с_индексом:" -#: sql_help.c:1393 sql_help.c:2911 +#: sql_help.c:1420 sql_help.c:2966 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметры_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE:" -#: sql_help.c:1398 sql_help.c:2916 +#: sql_help.c:1425 sql_help.c:2971 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "объект_исключения в ограничении EXCLUDE:" -#: sql_help.c:1401 sql_help.c:2420 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:2919 sql_help.c:3924 +#: sql_help.c:1428 sql_help.c:2461 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:2974 sql_help.c:3990 msgid "opclass" msgstr "класс_оператора" -#: sql_help.c:1417 sql_help.c:1420 sql_help.c:2954 +#: sql_help.c:1429 sql_help.c:2975 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "ссылочное действие в ограничении FOREIGN KEY/REFERENCES:" + +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3012 msgid "tablespace_option" msgstr "параметр_табл_пространства" -#: sql_help.c:1441 sql_help.c:1444 sql_help.c:1450 sql_help.c:1454 +#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484 msgid "token_type" msgstr "тип_фрагмента" -#: sql_help.c:1442 sql_help.c:1445 +#: sql_help.c:1472 sql_help.c:1475 msgid "dictionary_name" msgstr "имя_словаря" -#: sql_help.c:1447 sql_help.c:1451 +#: sql_help.c:1477 sql_help.c:1481 msgid "old_dictionary" msgstr "старый_словарь" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "new_dictionary" msgstr "новый_словарь" -#: sql_help.c:1547 sql_help.c:1561 sql_help.c:1564 sql_help.c:1565 -#: sql_help.c:3107 +#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595 +#: sql_help.c:3165 msgid "attribute_name" msgstr "имя_атрибута" -#: sql_help.c:1548 +#: sql_help.c:1578 msgid "new_attribute_name" msgstr "новое_имя_атрибута" -#: sql_help.c:1552 sql_help.c:1556 +#: sql_help.c:1582 sql_help.c:1586 msgid "new_enum_value" msgstr "новое_значение_перечисления" -#: sql_help.c:1553 +#: sql_help.c:1583 msgid "neighbor_enum_value" msgstr "соседнее_значение_перечисления" -#: sql_help.c:1555 +#: sql_help.c:1585 msgid "existing_enum_value" msgstr "существующее_значение_перечисления" -#: sql_help.c:1558 +#: sql_help.c:1588 msgid "property" msgstr "свойство" -#: sql_help.c:1634 sql_help.c:2292 sql_help.c:2301 sql_help.c:2696 -#: sql_help.c:3187 sql_help.c:3638 sql_help.c:3837 sql_help.c:3880 -#: sql_help.c:4217 +#: sql_help.c:1664 sql_help.c:2332 sql_help.c:2341 sql_help.c:2747 +#: sql_help.c:3245 sql_help.c:3696 sql_help.c:3900 sql_help.c:3946 +#: sql_help.c:4349 msgid "server_name" msgstr "имя_сервера" -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:3202 +#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3260 msgid "view_option_name" msgstr "имя_параметра_представления" -#: sql_help.c:1667 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:3261 msgid "view_option_value" msgstr "значение_параметра_представления" -#: sql_help.c:1688 sql_help.c:1689 sql_help.c:4821 sql_help.c:4822 +#: sql_help.c:1718 sql_help.c:1719 sql_help.c:4956 sql_help.c:4957 msgid "table_and_columns" msgstr "таблица_и_столбцы" -#: sql_help.c:1690 sql_help.c:1753 sql_help.c:1944 sql_help.c:3686 -#: sql_help.c:4059 sql_help.c:4823 +#: sql_help.c:1720 sql_help.c:1783 sql_help.c:1974 sql_help.c:3744 +#: sql_help.c:4184 sql_help.c:4958 msgid "where option can be one of:" msgstr "где допустимый параметр:" -#: sql_help.c:1691 sql_help.c:1692 sql_help.c:1754 sql_help.c:1946 -#: sql_help.c:1949 sql_help.c:2128 sql_help.c:3687 sql_help.c:3688 -#: sql_help.c:3689 sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 -#: sql_help.c:3693 sql_help.c:3694 sql_help.c:4060 sql_help.c:4062 -#: sql_help.c:4824 sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 -#: sql_help.c:4828 sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 +#: sql_help.c:1721 sql_help.c:1722 sql_help.c:1784 sql_help.c:1976 +#: sql_help.c:1979 sql_help.c:2158 sql_help.c:3745 sql_help.c:3746 +#: sql_help.c:3747 sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 +#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4185 sql_help.c:4187 +#: sql_help.c:4959 sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 +#: sql_help.c:4963 sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 msgid "boolean" msgstr "логическое_значение" -#: sql_help.c:1693 sql_help.c:4833 +#: sql_help.c:1723 sql_help.c:4968 msgid "and table_and_columns is:" msgstr "и таблица_и_столбцы:" -#: sql_help.c:1709 sql_help.c:4587 sql_help.c:4589 sql_help.c:4613 +#: sql_help.c:1739 sql_help.c:4722 sql_help.c:4724 sql_help.c:4748 msgid "transaction_mode" msgstr "режим_транзакции" -#: sql_help.c:1710 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4725 sql_help.c:4749 msgid "where transaction_mode is one of:" msgstr "где допустимый режим_транзакции:" -#: sql_help.c:1719 sql_help.c:4433 sql_help.c:4442 sql_help.c:4446 -#: sql_help.c:4450 sql_help.c:4453 sql_help.c:4690 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4928 -#: sql_help.c:4937 sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:1749 sql_help.c:4568 sql_help.c:4577 sql_help.c:4581 +#: sql_help.c:4585 sql_help.c:4588 sql_help.c:4825 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5063 +#: sql_help.c:5072 sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "argument" msgstr "аргумент" -#: sql_help.c:1819 +#: sql_help.c:1849 msgid "relation_name" msgstr "имя_отношения" -#: sql_help.c:1824 sql_help.c:3831 sql_help.c:4211 +#: sql_help.c:1854 sql_help.c:3894 sql_help.c:4343 msgid "domain_name" msgstr "имя_домена" -#: sql_help.c:1846 +#: sql_help.c:1876 msgid "policy_name" msgstr "имя_политики" -#: sql_help.c:1859 +#: sql_help.c:1889 msgid "rule_name" msgstr "имя_правила" -#: sql_help.c:1878 sql_help.c:4347 +#: sql_help.c:1908 sql_help.c:4482 msgid "string_literal" msgstr "строковая_константа" -#: sql_help.c:1903 sql_help.c:4024 sql_help.c:4261 +#: sql_help.c:1933 sql_help.c:4149 sql_help.c:4396 msgid "transaction_id" msgstr "код_транзакции" -#: sql_help.c:1934 sql_help.c:1941 sql_help.c:3950 +#: sql_help.c:1964 sql_help.c:1971 sql_help.c:4016 msgid "filename" msgstr "имя_файла" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:2635 sql_help.c:2636 -#: sql_help.c:2637 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:2686 sql_help.c:2687 +#: sql_help.c:2688 msgid "command" msgstr "команда" -#: sql_help.c:1937 sql_help.c:2634 sql_help.c:3057 sql_help.c:3238 -#: sql_help.c:3934 sql_help.c:4416 sql_help.c:4418 sql_help.c:4519 -#: sql_help.c:4521 sql_help.c:4673 sql_help.c:4675 sql_help.c:4791 -#: sql_help.c:4911 sql_help.c:4913 +#: sql_help.c:1967 sql_help.c:2685 sql_help.c:3115 sql_help.c:3296 +#: sql_help.c:4000 sql_help.c:4077 sql_help.c:4080 sql_help.c:4551 +#: sql_help.c:4553 sql_help.c:4654 sql_help.c:4656 sql_help.c:4808 +#: sql_help.c:4810 sql_help.c:4926 sql_help.c:5046 sql_help.c:5048 msgid "condition" msgstr "условие" -#: sql_help.c:1940 sql_help.c:2461 sql_help.c:2940 sql_help.c:3204 -#: sql_help.c:3222 sql_help.c:3915 +#: sql_help.c:1970 sql_help.c:2502 sql_help.c:2998 sql_help.c:3262 +#: sql_help.c:3280 sql_help.c:3981 msgid "query" msgstr "запрос" -#: sql_help.c:1945 +#: sql_help.c:1975 msgid "format_name" msgstr "имя_формата" -#: sql_help.c:1947 +#: sql_help.c:1977 msgid "delimiter_character" msgstr "символ_разделитель" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "null_string" msgstr "представление_NULL" -#: sql_help.c:1950 +#: sql_help.c:1980 msgid "quote_character" msgstr "символ_кавычек" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "escape_character" msgstr "спецсимвол" -#: sql_help.c:1955 +#: sql_help.c:1985 msgid "encoding_name" msgstr "имя_кодировки" -#: sql_help.c:1966 +#: sql_help.c:1996 msgid "access_method_type" msgstr "тип_метода_доступа" -#: sql_help.c:2037 sql_help.c:2056 sql_help.c:2059 +#: sql_help.c:2067 sql_help.c:2086 sql_help.c:2089 msgid "arg_data_type" msgstr "тип_данных_аргумента" -#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068 +#: sql_help.c:2068 sql_help.c:2090 sql_help.c:2098 msgid "sfunc" msgstr "функция_состояния" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "state_data_type" msgstr "тип_данных_состояния" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_size" msgstr "размер_данных_состояния" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "ffunc" msgstr "функция_завершения" -#: sql_help.c:2042 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2102 msgid "combinefunc" msgstr "комбинирующая_функция" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "serialfunc" msgstr "функция_сериализации" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "deserialfunc" msgstr "функция_десериализации" -#: sql_help.c:2045 sql_help.c:2064 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2094 sql_help.c:2105 msgid "initial_condition" msgstr "начальное_условие" -#: sql_help.c:2046 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2106 msgid "msfunc" msgstr "функция_состояния_движ" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "minvfunc" msgstr "обратная_функция_движ" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "mstate_data_type" msgstr "тип_данных_состояния_движ" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_size" msgstr "размер_данных_состояния_движ" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mffunc" msgstr "функция_завершения_движ" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "minitial_condition" msgstr "начальное_условие_движ" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "sort_operator" msgstr "оператор_сортировки" -#: sql_help.c:2065 +#: sql_help.c:2095 msgid "or the old syntax" msgstr "или старый синтаксис" -#: sql_help.c:2067 +#: sql_help.c:2097 msgid "base_type" msgstr "базовый_тип" -#: sql_help.c:2124 sql_help.c:2165 +#: sql_help.c:2154 sql_help.c:2201 msgid "locale" msgstr "код_локали" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "lc_collate" msgstr "код_правила_сортировки" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_ctype" msgstr "код_классификации_символов" -#: sql_help.c:2127 sql_help.c:4314 +#: sql_help.c:2157 sql_help.c:4449 msgid "provider" msgstr "провайдер" -#: sql_help.c:2129 sql_help.c:2222 +#: sql_help.c:2159 sql_help.c:2262 msgid "version" msgstr "версия" -#: sql_help.c:2131 +#: sql_help.c:2161 msgid "existing_collation" msgstr "существующее_правило_сортировки" -#: sql_help.c:2141 +#: sql_help.c:2171 msgid "source_encoding" msgstr "исходная_кодировка" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "dest_encoding" msgstr "целевая_кодировка" -#: sql_help.c:2163 sql_help.c:2980 +#: sql_help.c:2198 sql_help.c:3038 msgid "template" msgstr "шаблон" -#: sql_help.c:2164 +#: sql_help.c:2199 msgid "encoding" msgstr "кодировка" -#: sql_help.c:2191 +#: sql_help.c:2200 +msgid "strategy" +msgstr "стратегия" + +#: sql_help.c:2204 +msgid "icu_locale" +msgstr "локаль_icu" + +#: sql_help.c:2205 +msgid "locale_provider" +msgstr "провайдер_локали" + +#: sql_help.c:2206 +msgid "collation_version" +msgstr "версия_правила_сортировки" + +#: sql_help.c:2211 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2231 msgid "constraint" msgstr "ограничение" -#: sql_help.c:2192 +#: sql_help.c:2232 msgid "where constraint is:" msgstr "где ограничение:" -#: sql_help.c:2206 sql_help.c:2632 sql_help.c:3053 +#: sql_help.c:2246 sql_help.c:2683 sql_help.c:3111 msgid "event" msgstr "событие" -#: sql_help.c:2207 +#: sql_help.c:2247 msgid "filter_variable" msgstr "переменная_фильтра" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_value" msgstr "значение_фильтра" -#: sql_help.c:2304 sql_help.c:2875 +#: sql_help.c:2344 sql_help.c:2930 msgid "where column_constraint is:" msgstr "где ограничение_столбца:" -#: sql_help.c:2349 +#: sql_help.c:2389 msgid "rettype" msgstr "тип_возврата" -#: sql_help.c:2351 +#: sql_help.c:2391 msgid "column_type" msgstr "тип_столбца" -#: sql_help.c:2360 sql_help.c:2562 +#: sql_help.c:2400 sql_help.c:2603 msgid "definition" msgstr "определение" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "obj_file" msgstr "объектный_файл" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "link_symbol" msgstr "символ_в_экспорте" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "sql_body" msgstr "тело_sql" -#: sql_help.c:2401 sql_help.c:2617 sql_help.c:3176 +#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234 msgid "uid" msgstr "uid" -#: sql_help.c:2416 sql_help.c:2457 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2936 +#: sql_help.c:2457 sql_help.c:2498 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2994 msgid "method" msgstr "метод" -#: sql_help.c:2421 +#: sql_help.c:2462 msgid "opclass_parameter" msgstr "параметр_класса_оп" -#: sql_help.c:2438 +#: sql_help.c:2479 msgid "call_handler" msgstr "обработчик_вызова" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "inline_handler" msgstr "обработчик_внедрённого_кода" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "valfunction" msgstr "функция_проверки" -#: sql_help.c:2479 +#: sql_help.c:2520 msgid "com_op" msgstr "коммут_оператор" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "neg_op" msgstr "обратный_оператор" -#: sql_help.c:2498 +#: sql_help.c:2539 msgid "family_name" msgstr "имя_семейства" -#: sql_help.c:2509 +#: sql_help.c:2550 msgid "storage_type" msgstr "тип_хранения" -#: sql_help.c:2638 sql_help.c:3060 +#: sql_help.c:2689 sql_help.c:3118 msgid "where event can be one of:" msgstr "где допустимое событие:" -#: sql_help.c:2658 sql_help.c:2660 +#: sql_help.c:2709 sql_help.c:2711 msgid "schema_element" msgstr "элемент_схемы" -#: sql_help.c:2697 +#: sql_help.c:2748 msgid "server_type" msgstr "тип_сервера" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_version" msgstr "версия_сервера" -#: sql_help.c:2699 sql_help.c:3834 sql_help.c:4214 +#: sql_help.c:2750 sql_help.c:3897 sql_help.c:4346 msgid "fdw_name" msgstr "имя_обёртки_сторонних_данных" -#: sql_help.c:2716 sql_help.c:2719 +#: sql_help.c:2767 sql_help.c:2770 msgid "statistics_name" msgstr "имя_статистики" -#: sql_help.c:2720 +#: sql_help.c:2771 msgid "statistics_kind" msgstr "вид_статистики" -#: sql_help.c:2736 +#: sql_help.c:2787 msgid "subscription_name" msgstr "имя_подписки" -#: sql_help.c:2837 +#: sql_help.c:2892 msgid "source_table" msgstr "исходная_таблица" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "like_option" msgstr "параметр_порождения" -#: sql_help.c:2904 +#: sql_help.c:2959 msgid "and like_option is:" msgstr "и параметр_порождения:" -#: sql_help.c:2953 +#: sql_help.c:3011 msgid "directory" msgstr "каталог" -#: sql_help.c:2967 +#: sql_help.c:3025 msgid "parser_name" msgstr "имя_анализатора" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "source_config" msgstr "исходная_конфигурация" -#: sql_help.c:2997 +#: sql_help.c:3055 msgid "start_function" msgstr "функция_начала" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "gettoken_function" msgstr "функция_выдачи_фрагмента" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "end_function" msgstr "функция_окончания" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "lextypes_function" msgstr "функция_лекс_типов" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "headline_function" msgstr "функция_создания_выдержек" -#: sql_help.c:3013 +#: sql_help.c:3071 msgid "init_function" msgstr "функция_инициализации" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "lexize_function" msgstr "функция_выделения_лексем" -#: sql_help.c:3027 +#: sql_help.c:3085 msgid "from_sql_function_name" msgstr "имя_функции_из_sql" -#: sql_help.c:3029 +#: sql_help.c:3087 msgid "to_sql_function_name" msgstr "имя_функции_в_sql" -#: sql_help.c:3055 +#: sql_help.c:3113 msgid "referenced_table_name" msgstr "ссылающаяся_таблица" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "transition_relation_name" msgstr "имя_переходного_отношения" -#: sql_help.c:3059 +#: sql_help.c:3117 msgid "arguments" msgstr "аргументы" -#: sql_help.c:3111 +#: sql_help.c:3169 msgid "label" msgstr "метка" -#: sql_help.c:3113 +#: sql_help.c:3171 msgid "subtype" msgstr "подтип" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype_operator_class" msgstr "класс_оператора_подтипа" -#: sql_help.c:3116 +#: sql_help.c:3174 msgid "canonical_function" msgstr "каноническая_функция" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "subtype_diff_function" msgstr "функция_различий_подтипа" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "multirange_type_name" msgstr "имя_мультидиапазонного_типа" -#: sql_help.c:3120 +#: sql_help.c:3178 msgid "input_function" msgstr "функция_ввода" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "output_function" msgstr "функция_вывода" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "receive_function" msgstr "функция_получения" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "send_function" msgstr "функция_отправки" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "type_modifier_input_function" msgstr "функция_ввода_модификатора_типа" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_output_function" msgstr "функция_вывода_модификатора_типа" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "analyze_function" msgstr "функция_анализа" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "subscript_function" msgstr "функция_обращения_по_индексу" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "internallength" msgstr "внутр_длина" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "alignment" msgstr "выравнивание" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "storage" msgstr "хранение" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "like_type" msgstr "тип_образец" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "category" msgstr "категория" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "preferred" msgstr "предпочитаемый" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "default" msgstr "по_умолчанию" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "element" msgstr "элемент" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "delimiter" msgstr "разделитель" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "collatable" msgstr "сортируемый" -#: sql_help.c:3234 sql_help.c:3910 sql_help.c:4411 sql_help.c:4513 -#: sql_help.c:4668 sql_help.c:4781 sql_help.c:4906 +#: sql_help.c:3292 sql_help.c:3976 sql_help.c:4066 sql_help.c:4546 +#: sql_help.c:4648 sql_help.c:4803 sql_help.c:4916 sql_help.c:5041 msgid "with_query" msgstr "запрос_WITH" -#: sql_help.c:3236 sql_help.c:3912 sql_help.c:4430 sql_help.c:4436 -#: sql_help.c:4439 sql_help.c:4443 sql_help.c:4447 sql_help.c:4455 -#: sql_help.c:4687 sql_help.c:4693 sql_help.c:4696 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4712 sql_help.c:4783 sql_help.c:4925 -#: sql_help.c:4931 sql_help.c:4934 sql_help.c:4938 sql_help.c:4942 -#: sql_help.c:4950 +#: sql_help.c:3294 sql_help.c:3978 sql_help.c:4565 sql_help.c:4571 +#: sql_help.c:4574 sql_help.c:4578 sql_help.c:4582 sql_help.c:4590 +#: sql_help.c:4822 sql_help.c:4828 sql_help.c:4831 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4847 sql_help.c:4918 sql_help.c:5060 +#: sql_help.c:5066 sql_help.c:5069 sql_help.c:5073 sql_help.c:5077 +#: sql_help.c:5085 msgid "alias" msgstr "псевдоним" -#: sql_help.c:3237 sql_help.c:4415 sql_help.c:4457 sql_help.c:4459 -#: sql_help.c:4463 sql_help.c:4465 sql_help.c:4466 sql_help.c:4467 -#: sql_help.c:4518 sql_help.c:4672 sql_help.c:4714 sql_help.c:4716 -#: sql_help.c:4720 sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 -#: sql_help.c:4790 sql_help.c:4910 sql_help.c:4952 sql_help.c:4954 -#: sql_help.c:4958 sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 +#: sql_help.c:3295 sql_help.c:4550 sql_help.c:4592 sql_help.c:4594 +#: sql_help.c:4598 sql_help.c:4600 sql_help.c:4601 sql_help.c:4602 +#: sql_help.c:4653 sql_help.c:4807 sql_help.c:4849 sql_help.c:4851 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4858 sql_help.c:4859 +#: sql_help.c:4925 sql_help.c:5045 sql_help.c:5087 sql_help.c:5089 +#: sql_help.c:5093 sql_help.c:5095 sql_help.c:5096 sql_help.c:5097 msgid "from_item" msgstr "источник_данных" -#: sql_help.c:3239 sql_help.c:3720 sql_help.c:3991 sql_help.c:4792 +#: sql_help.c:3297 sql_help.c:3778 sql_help.c:4116 sql_help.c:4927 msgid "cursor_name" msgstr "имя_курсора" -#: sql_help.c:3240 sql_help.c:3918 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3984 sql_help.c:4928 msgid "output_expression" msgstr "выражение_результата" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4414 sql_help.c:4516 -#: sql_help.c:4671 sql_help.c:4794 sql_help.c:4909 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4549 sql_help.c:4651 +#: sql_help.c:4806 sql_help.c:4929 sql_help.c:5044 msgid "output_name" msgstr "имя_результата" -#: sql_help.c:3257 +#: sql_help.c:3315 msgid "code" msgstr "внедрённый_код" -#: sql_help.c:3662 +#: sql_help.c:3720 msgid "parameter" msgstr "параметр" -#: sql_help.c:3684 sql_help.c:3685 sql_help.c:4016 +#: sql_help.c:3742 sql_help.c:3743 sql_help.c:4141 msgid "statement" msgstr "оператор" -#: sql_help.c:3719 sql_help.c:3990 +#: sql_help.c:3777 sql_help.c:4115 msgid "direction" msgstr "направление" -#: sql_help.c:3721 sql_help.c:3992 +#: sql_help.c:3779 sql_help.c:4117 msgid "where direction can be one of:" msgstr "где допустимое направление:" -#: sql_help.c:3722 sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 -#: sql_help.c:3726 sql_help.c:3993 sql_help.c:3994 sql_help.c:3995 -#: sql_help.c:3996 sql_help.c:3997 sql_help.c:4424 sql_help.c:4426 -#: sql_help.c:4527 sql_help.c:4529 sql_help.c:4681 sql_help.c:4683 -#: sql_help.c:4850 sql_help.c:4852 sql_help.c:4919 sql_help.c:4921 +#: sql_help.c:3780 sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 +#: sql_help.c:3784 sql_help.c:4118 sql_help.c:4119 sql_help.c:4120 +#: sql_help.c:4121 sql_help.c:4122 sql_help.c:4559 sql_help.c:4561 +#: sql_help.c:4662 sql_help.c:4664 sql_help.c:4816 sql_help.c:4818 +#: sql_help.c:4985 sql_help.c:4987 sql_help.c:5054 sql_help.c:5056 msgid "count" msgstr "число" -#: sql_help.c:3824 sql_help.c:4204 +#: sql_help.c:3887 sql_help.c:4336 msgid "sequence_name" msgstr "имя_последовательности" -#: sql_help.c:3842 sql_help.c:4222 +#: sql_help.c:3905 sql_help.c:4354 msgid "arg_name" msgstr "имя_аргумента" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_type" msgstr "тип_аргумента" -#: sql_help.c:3850 sql_help.c:4230 +#: sql_help.c:3913 sql_help.c:4362 msgid "loid" msgstr "код_БО" -#: sql_help.c:3878 +#: sql_help.c:3944 msgid "remote_schema" msgstr "удалённая_схема" -#: sql_help.c:3881 +#: sql_help.c:3947 msgid "local_schema" msgstr "локальная_схема" -#: sql_help.c:3916 +#: sql_help.c:3982 msgid "conflict_target" msgstr "объект_конфликта" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_action" msgstr "действие_при_конфликте" -#: sql_help.c:3920 +#: sql_help.c:3986 msgid "where conflict_target can be one of:" msgstr "где допустимый объект_конфликта:" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "index_column_name" msgstr "имя_столбца_индекса" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_expression" msgstr "выражение_индекса" -#: sql_help.c:3925 +#: sql_help.c:3991 msgid "index_predicate" msgstr "предикат_индекса" -#: sql_help.c:3927 +#: sql_help.c:3993 msgid "and conflict_action is one of:" msgstr "а допустимое действие_при_конфликте:" -#: sql_help.c:3933 sql_help.c:4789 +#: sql_help.c:3999 sql_help.c:4924 msgid "sub-SELECT" msgstr "вложенный_SELECT" -#: sql_help.c:3942 sql_help.c:4005 sql_help.c:4765 +#: sql_help.c:4008 sql_help.c:4130 sql_help.c:4900 msgid "channel" msgstr "канал" -#: sql_help.c:3964 +#: sql_help.c:4030 msgid "lockmode" msgstr "режим_блокировки" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "where lockmode is one of:" msgstr "где допустимый режим_блокировки:" -#: sql_help.c:4006 +#: sql_help.c:4067 +msgid "target_table_name" +msgstr "имя_целевой_таблицы" + +#: sql_help.c:4068 +msgid "target_alias" +msgstr "псевдоним_назначения" + +#: sql_help.c:4069 +msgid "data_source" +msgstr "источник_данных" + +#: sql_help.c:4070 sql_help.c:4595 sql_help.c:4852 sql_help.c:5090 +msgid "join_condition" +msgstr "условие_соединения" + +#: sql_help.c:4071 +msgid "when_clause" +msgstr "предложение_when" + +#: sql_help.c:4072 +msgid "where data_source is:" +msgstr "где источник_данных:" + +#: sql_help.c:4073 +msgid "source_table_name" +msgstr "имя_исходной_таблицы" + +#: sql_help.c:4074 +msgid "source_query" +msgstr "исходный_запрос" + +#: sql_help.c:4075 +msgid "source_alias" +msgstr "псевдоним_источника" + +#: sql_help.c:4076 +msgid "and when_clause is:" +msgstr "и предложение_when:" + +#: sql_help.c:4078 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4079 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4081 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4082 +msgid "and merge_insert is:" +msgstr "и merge_insert:" + +#: sql_help.c:4085 +msgid "and merge_update is:" +msgstr "и merge_update:" + +#: sql_help.c:4090 +msgid "and merge_delete is:" +msgstr "и merge_delete:" + +#: sql_help.c:4131 msgid "payload" msgstr "сообщение_нагрузка" -#: sql_help.c:4033 +#: sql_help.c:4158 msgid "old_role" msgstr "старая_роль" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "new_role" msgstr "новая_роль" -#: sql_help.c:4070 sql_help.c:4269 sql_help.c:4277 +#: sql_help.c:4195 sql_help.c:4404 sql_help.c:4412 msgid "savepoint_name" msgstr "имя_точки_сохранения" -#: sql_help.c:4417 sql_help.c:4475 sql_help.c:4674 sql_help.c:4732 -#: sql_help.c:4912 sql_help.c:4970 +#: sql_help.c:4552 sql_help.c:4610 sql_help.c:4809 sql_help.c:4867 +#: sql_help.c:5047 sql_help.c:5105 msgid "grouping_element" msgstr "элемент_группирования" -#: sql_help.c:4419 sql_help.c:4522 sql_help.c:4676 sql_help.c:4914 +#: sql_help.c:4554 sql_help.c:4657 sql_help.c:4811 sql_help.c:5049 msgid "window_name" msgstr "имя_окна" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_definition" msgstr "определение_окна" -#: sql_help.c:4421 sql_help.c:4435 sql_help.c:4479 sql_help.c:4524 -#: sql_help.c:4678 sql_help.c:4692 sql_help.c:4736 sql_help.c:4916 -#: sql_help.c:4930 sql_help.c:4974 +#: sql_help.c:4556 sql_help.c:4570 sql_help.c:4614 sql_help.c:4659 +#: sql_help.c:4813 sql_help.c:4827 sql_help.c:4871 sql_help.c:5051 +#: sql_help.c:5065 sql_help.c:5109 msgid "select" msgstr "select" -#: sql_help.c:4428 sql_help.c:4685 sql_help.c:4923 +#: sql_help.c:4563 sql_help.c:4820 sql_help.c:5058 msgid "where from_item can be one of:" msgstr "где допустимый источник_данных:" -#: sql_help.c:4431 sql_help.c:4437 sql_help.c:4440 sql_help.c:4444 -#: sql_help.c:4456 sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 -#: sql_help.c:4701 sql_help.c:4713 sql_help.c:4926 sql_help.c:4932 -#: sql_help.c:4935 sql_help.c:4939 sql_help.c:4951 +#: sql_help.c:4566 sql_help.c:4572 sql_help.c:4575 sql_help.c:4579 +#: sql_help.c:4591 sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 +#: sql_help.c:4836 sql_help.c:4848 sql_help.c:5061 sql_help.c:5067 +#: sql_help.c:5070 sql_help.c:5074 sql_help.c:5086 msgid "column_alias" msgstr "псевдоним_столбца" -#: sql_help.c:4432 sql_help.c:4689 sql_help.c:4927 +#: sql_help.c:4567 sql_help.c:4824 sql_help.c:5062 msgid "sampling_method" msgstr "метод_выборки" -#: sql_help.c:4434 sql_help.c:4691 sql_help.c:4929 +#: sql_help.c:4569 sql_help.c:4826 sql_help.c:5064 msgid "seed" msgstr "начальное_число" -#: sql_help.c:4438 sql_help.c:4477 sql_help.c:4695 sql_help.c:4734 -#: sql_help.c:4933 sql_help.c:4972 +#: sql_help.c:4573 sql_help.c:4612 sql_help.c:4830 sql_help.c:4869 +#: sql_help.c:5068 sql_help.c:5107 msgid "with_query_name" msgstr "имя_запроса_WITH" -#: sql_help.c:4448 sql_help.c:4451 sql_help.c:4454 sql_help.c:4705 -#: sql_help.c:4708 sql_help.c:4711 sql_help.c:4943 sql_help.c:4946 -#: sql_help.c:4949 +#: sql_help.c:4583 sql_help.c:4586 sql_help.c:4589 sql_help.c:4840 +#: sql_help.c:4843 sql_help.c:4846 sql_help.c:5078 sql_help.c:5081 +#: sql_help.c:5084 msgid "column_definition" msgstr "определение_столбца" -#: sql_help.c:4458 sql_help.c:4464 sql_help.c:4715 sql_help.c:4721 -#: sql_help.c:4953 sql_help.c:4959 +#: sql_help.c:4593 sql_help.c:4599 sql_help.c:4850 sql_help.c:4856 +#: sql_help.c:5088 sql_help.c:5094 msgid "join_type" msgstr "тип_соединения" -#: sql_help.c:4460 sql_help.c:4717 sql_help.c:4955 -msgid "join_condition" -msgstr "условие_соединения" - -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 +#: sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 msgid "join_column" msgstr "столбец_соединения" -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_using_alias" msgstr "псевдоним_использования_соединения" -#: sql_help.c:4468 sql_help.c:4725 sql_help.c:4963 +#: sql_help.c:4603 sql_help.c:4860 sql_help.c:5098 msgid "and grouping_element can be one of:" msgstr "где допустимый элемент_группирования:" -#: sql_help.c:4476 sql_help.c:4733 sql_help.c:4971 +#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5106 msgid "and with_query is:" msgstr "и запрос_WITH:" -#: sql_help.c:4480 sql_help.c:4737 sql_help.c:4975 +#: sql_help.c:4615 sql_help.c:4872 sql_help.c:5110 msgid "values" msgstr "значения" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "insert" msgstr "insert" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "update" msgstr "update" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "delete" msgstr "delete" -#: sql_help.c:4485 sql_help.c:4742 sql_help.c:4980 +#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5115 msgid "search_seq_col_name" msgstr "имя_столбца_послед_поиска" -#: sql_help.c:4487 sql_help.c:4744 sql_help.c:4982 +#: sql_help.c:4622 sql_help.c:4879 sql_help.c:5117 msgid "cycle_mark_col_name" msgstr "имя_столбца_пометки_цикла" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_value" msgstr "значение_пометки_цикла" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_default" msgstr "пометка_цикла_по_умолчанию" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_path_col_name" msgstr "имя_столбца_пути_цикла" -#: sql_help.c:4517 +#: sql_help.c:4652 msgid "new_table" msgstr "новая_таблица" -#: sql_help.c:4588 +#: sql_help.c:4723 msgid "snapshot_id" msgstr "код_снимка" -#: sql_help.c:4848 +#: sql_help.c:4983 msgid "sort_expression" msgstr "выражение_сортировки" -#: sql_help.c:4992 sql_help.c:5970 +#: sql_help.c:5127 sql_help.c:6111 msgid "abort the current transaction" msgstr "прервать текущую транзакцию" -#: sql_help.c:4998 +#: sql_help.c:5133 msgid "change the definition of an aggregate function" msgstr "изменить определение агрегатной функции" -#: sql_help.c:5004 +#: sql_help.c:5139 msgid "change the definition of a collation" msgstr "изменить определение правила сортировки" -#: sql_help.c:5010 +#: sql_help.c:5145 msgid "change the definition of a conversion" msgstr "изменить определение преобразования" -#: sql_help.c:5016 +#: sql_help.c:5151 msgid "change a database" msgstr "изменить атрибуты базы данных" -#: sql_help.c:5022 +#: sql_help.c:5157 msgid "define default access privileges" msgstr "определить права доступа по умолчанию" -#: sql_help.c:5028 +#: sql_help.c:5163 msgid "change the definition of a domain" msgstr "изменить определение домена" -#: sql_help.c:5034 +#: sql_help.c:5169 msgid "change the definition of an event trigger" msgstr "изменить определение событийного триггера" -#: sql_help.c:5040 +#: sql_help.c:5175 msgid "change the definition of an extension" msgstr "изменить определение расширения" -#: sql_help.c:5046 +#: sql_help.c:5181 msgid "change the definition of a foreign-data wrapper" msgstr "изменить определение обёртки сторонних данных" -#: sql_help.c:5052 +#: sql_help.c:5187 msgid "change the definition of a foreign table" msgstr "изменить определение сторонней таблицы" -#: sql_help.c:5058 +#: sql_help.c:5193 msgid "change the definition of a function" msgstr "изменить определение функции" -#: sql_help.c:5064 +#: sql_help.c:5199 msgid "change role name or membership" msgstr "изменить имя роли или членство" -#: sql_help.c:5070 +#: sql_help.c:5205 msgid "change the definition of an index" msgstr "изменить определение индекса" -#: sql_help.c:5076 +#: sql_help.c:5211 msgid "change the definition of a procedural language" msgstr "изменить определение процедурного языка" -#: sql_help.c:5082 +#: sql_help.c:5217 msgid "change the definition of a large object" msgstr "изменить определение большого объекта" -#: sql_help.c:5088 +#: sql_help.c:5223 msgid "change the definition of a materialized view" msgstr "изменить определение материализованного представления" -#: sql_help.c:5094 +#: sql_help.c:5229 msgid "change the definition of an operator" msgstr "изменить определение оператора" -#: sql_help.c:5100 +#: sql_help.c:5235 msgid "change the definition of an operator class" msgstr "изменить определение класса операторов" -#: sql_help.c:5106 +#: sql_help.c:5241 msgid "change the definition of an operator family" msgstr "изменить определение семейства операторов" -#: sql_help.c:5112 +#: sql_help.c:5247 msgid "change the definition of a row-level security policy" msgstr "изменить определение политики защиты на уровне строк" -#: sql_help.c:5118 +#: sql_help.c:5253 msgid "change the definition of a procedure" msgstr "изменить определение процедуры" -#: sql_help.c:5124 +#: sql_help.c:5259 msgid "change the definition of a publication" msgstr "изменить определение публикации" -#: sql_help.c:5130 sql_help.c:5232 +#: sql_help.c:5265 sql_help.c:5367 msgid "change a database role" msgstr "изменить роль пользователя БД" -#: sql_help.c:5136 +#: sql_help.c:5271 msgid "change the definition of a routine" msgstr "изменить определение подпрограммы" -#: sql_help.c:5142 +#: sql_help.c:5277 msgid "change the definition of a rule" msgstr "изменить определение правила" -#: sql_help.c:5148 +#: sql_help.c:5283 msgid "change the definition of a schema" msgstr "изменить определение схемы" -#: sql_help.c:5154 +#: sql_help.c:5289 msgid "change the definition of a sequence generator" msgstr "изменить определение генератора последовательности" -#: sql_help.c:5160 +#: sql_help.c:5295 msgid "change the definition of a foreign server" msgstr "изменить определение стороннего сервера" -#: sql_help.c:5166 +#: sql_help.c:5301 msgid "change the definition of an extended statistics object" msgstr "изменить определение объекта расширенной статистики" -#: sql_help.c:5172 +#: sql_help.c:5307 msgid "change the definition of a subscription" msgstr "изменить определение подписки" -#: sql_help.c:5178 +#: sql_help.c:5313 msgid "change a server configuration parameter" msgstr "изменить параметр конфигурации сервера" -#: sql_help.c:5184 +#: sql_help.c:5319 msgid "change the definition of a table" msgstr "изменить определение таблицы" -#: sql_help.c:5190 +#: sql_help.c:5325 msgid "change the definition of a tablespace" msgstr "изменить определение табличного пространства" -#: sql_help.c:5196 +#: sql_help.c:5331 msgid "change the definition of a text search configuration" msgstr "изменить определение конфигурации текстового поиска" -#: sql_help.c:5202 +#: sql_help.c:5337 msgid "change the definition of a text search dictionary" msgstr "изменить определение словаря текстового поиска" -#: sql_help.c:5208 +#: sql_help.c:5343 msgid "change the definition of a text search parser" msgstr "изменить определение анализатора текстового поиска" -#: sql_help.c:5214 +#: sql_help.c:5349 msgid "change the definition of a text search template" msgstr "изменить определение шаблона текстового поиска" -#: sql_help.c:5220 +#: sql_help.c:5355 msgid "change the definition of a trigger" msgstr "изменить определение триггера" -#: sql_help.c:5226 +#: sql_help.c:5361 msgid "change the definition of a type" msgstr "изменить определение типа" -#: sql_help.c:5238 +#: sql_help.c:5373 msgid "change the definition of a user mapping" msgstr "изменить сопоставление пользователей" -#: sql_help.c:5244 +#: sql_help.c:5379 msgid "change the definition of a view" msgstr "изменить определение представления" -#: sql_help.c:5250 +#: sql_help.c:5385 msgid "collect statistics about a database" msgstr "собрать статистику о базе данных" -#: sql_help.c:5256 sql_help.c:6048 +#: sql_help.c:5391 sql_help.c:6189 msgid "start a transaction block" msgstr "начать транзакцию" -#: sql_help.c:5262 +#: sql_help.c:5397 msgid "invoke a procedure" msgstr "вызвать процедуру" -#: sql_help.c:5268 +#: sql_help.c:5403 msgid "force a write-ahead log checkpoint" msgstr "произвести контрольную точку в журнале предзаписи" -#: sql_help.c:5274 +#: sql_help.c:5409 msgid "close a cursor" msgstr "закрыть курсор" -#: sql_help.c:5280 +#: sql_help.c:5415 msgid "cluster a table according to an index" msgstr "перегруппировать таблицу по индексу" -#: sql_help.c:5286 +#: sql_help.c:5421 msgid "define or change the comment of an object" msgstr "задать или изменить комментарий объекта" -#: sql_help.c:5292 sql_help.c:5850 +#: sql_help.c:5427 sql_help.c:5985 msgid "commit the current transaction" msgstr "зафиксировать текущую транзакцию" -#: sql_help.c:5298 +#: sql_help.c:5433 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "зафиксировать транзакцию, ранее подготовленную для двухфазной фиксации" -#: sql_help.c:5304 +#: sql_help.c:5439 msgid "copy data between a file and a table" msgstr "импорт/экспорт данных в файл" -#: sql_help.c:5310 +#: sql_help.c:5445 msgid "define a new access method" msgstr "создать новый метод доступа" -#: sql_help.c:5316 +#: sql_help.c:5451 msgid "define a new aggregate function" msgstr "создать агрегатную функцию" -#: sql_help.c:5322 +#: sql_help.c:5457 msgid "define a new cast" msgstr "создать приведение типов" -#: sql_help.c:5328 +#: sql_help.c:5463 msgid "define a new collation" msgstr "создать правило сортировки" -#: sql_help.c:5334 +#: sql_help.c:5469 msgid "define a new encoding conversion" msgstr "создать преобразование кодировки" -#: sql_help.c:5340 +#: sql_help.c:5475 msgid "create a new database" msgstr "создать базу данных" -#: sql_help.c:5346 +#: sql_help.c:5481 msgid "define a new domain" msgstr "создать домен" -#: sql_help.c:5352 +#: sql_help.c:5487 msgid "define a new event trigger" msgstr "создать событийный триггер" -#: sql_help.c:5358 +#: sql_help.c:5493 msgid "install an extension" msgstr "установить расширение" -#: sql_help.c:5364 +#: sql_help.c:5499 msgid "define a new foreign-data wrapper" msgstr "создать обёртку сторонних данных" -#: sql_help.c:5370 +#: sql_help.c:5505 msgid "define a new foreign table" msgstr "создать стороннюю таблицу" -#: sql_help.c:5376 +#: sql_help.c:5511 msgid "define a new function" msgstr "создать функцию" -#: sql_help.c:5382 sql_help.c:5442 sql_help.c:5544 +#: sql_help.c:5517 sql_help.c:5577 sql_help.c:5679 msgid "define a new database role" msgstr "создать роль пользователя БД" -#: sql_help.c:5388 +#: sql_help.c:5523 msgid "define a new index" msgstr "создать индекс" -#: sql_help.c:5394 +#: sql_help.c:5529 msgid "define a new procedural language" msgstr "создать процедурный язык" -#: sql_help.c:5400 +#: sql_help.c:5535 msgid "define a new materialized view" msgstr "создать материализованное представление" -#: sql_help.c:5406 +#: sql_help.c:5541 msgid "define a new operator" msgstr "создать оператор" -#: sql_help.c:5412 +#: sql_help.c:5547 msgid "define a new operator class" msgstr "создать класс операторов" -#: sql_help.c:5418 +#: sql_help.c:5553 msgid "define a new operator family" msgstr "создать семейство операторов" -#: sql_help.c:5424 +#: sql_help.c:5559 msgid "define a new row-level security policy for a table" msgstr "создать новую политику защиты на уровне строк для таблицы" -#: sql_help.c:5430 +#: sql_help.c:5565 msgid "define a new procedure" msgstr "создать процедуру" -#: sql_help.c:5436 +#: sql_help.c:5571 msgid "define a new publication" msgstr "создать публикацию" -#: sql_help.c:5448 +#: sql_help.c:5583 msgid "define a new rewrite rule" msgstr "создать правило перезаписи" -#: sql_help.c:5454 +#: sql_help.c:5589 msgid "define a new schema" msgstr "создать схему" -#: sql_help.c:5460 +#: sql_help.c:5595 msgid "define a new sequence generator" msgstr "создать генератор последовательностей" -#: sql_help.c:5466 +#: sql_help.c:5601 msgid "define a new foreign server" msgstr "создать сторонний сервер" -#: sql_help.c:5472 +#: sql_help.c:5607 msgid "define extended statistics" msgstr "создать расширенную статистику" -#: sql_help.c:5478 +#: sql_help.c:5613 msgid "define a new subscription" msgstr "создать подписку" -#: sql_help.c:5484 +#: sql_help.c:5619 msgid "define a new table" msgstr "создать таблицу" -#: sql_help.c:5490 sql_help.c:6006 +#: sql_help.c:5625 sql_help.c:6147 msgid "define a new table from the results of a query" msgstr "создать таблицу из результатов запроса" -#: sql_help.c:5496 +#: sql_help.c:5631 msgid "define a new tablespace" msgstr "создать табличное пространство" -#: sql_help.c:5502 +#: sql_help.c:5637 msgid "define a new text search configuration" msgstr "создать конфигурацию текстового поиска" -#: sql_help.c:5508 +#: sql_help.c:5643 msgid "define a new text search dictionary" msgstr "создать словарь текстового поиска" -#: sql_help.c:5514 +#: sql_help.c:5649 msgid "define a new text search parser" msgstr "создать анализатор текстового поиска" -#: sql_help.c:5520 +#: sql_help.c:5655 msgid "define a new text search template" msgstr "создать шаблон текстового поиска" -#: sql_help.c:5526 +#: sql_help.c:5661 msgid "define a new transform" msgstr "создать преобразование" -#: sql_help.c:5532 +#: sql_help.c:5667 msgid "define a new trigger" msgstr "создать триггер" -#: sql_help.c:5538 +#: sql_help.c:5673 msgid "define a new data type" msgstr "создать тип данных" -#: sql_help.c:5550 +#: sql_help.c:5685 msgid "define a new mapping of a user to a foreign server" msgstr "создать сопоставление пользователя для стороннего сервера" -#: sql_help.c:5556 +#: sql_help.c:5691 msgid "define a new view" msgstr "создать представление" -#: sql_help.c:5562 +#: sql_help.c:5697 msgid "deallocate a prepared statement" msgstr "освободить подготовленный оператор" -#: sql_help.c:5568 +#: sql_help.c:5703 msgid "define a cursor" msgstr "создать курсор" -#: sql_help.c:5574 +#: sql_help.c:5709 msgid "delete rows of a table" msgstr "удалить записи таблицы" -#: sql_help.c:5580 +#: sql_help.c:5715 msgid "discard session state" msgstr "очистить состояние сеанса" -#: sql_help.c:5586 +#: sql_help.c:5721 msgid "execute an anonymous code block" msgstr "выполнить анонимный блок кода" -#: sql_help.c:5592 +#: sql_help.c:5727 msgid "remove an access method" msgstr "удалить метод доступа" -#: sql_help.c:5598 +#: sql_help.c:5733 msgid "remove an aggregate function" msgstr "удалить агрегатную функцию" -#: sql_help.c:5604 +#: sql_help.c:5739 msgid "remove a cast" msgstr "удалить приведение типа" -#: sql_help.c:5610 +#: sql_help.c:5745 msgid "remove a collation" msgstr "удалить правило сортировки" -#: sql_help.c:5616 +#: sql_help.c:5751 msgid "remove a conversion" msgstr "удалить преобразование" -#: sql_help.c:5622 +#: sql_help.c:5757 msgid "remove a database" msgstr "удалить базу данных" -#: sql_help.c:5628 +#: sql_help.c:5763 msgid "remove a domain" msgstr "удалить домен" -#: sql_help.c:5634 +#: sql_help.c:5769 msgid "remove an event trigger" msgstr "удалить событийный триггер" -#: sql_help.c:5640 +#: sql_help.c:5775 msgid "remove an extension" msgstr "удалить расширение" -#: sql_help.c:5646 +#: sql_help.c:5781 msgid "remove a foreign-data wrapper" msgstr "удалить обёртку сторонних данных" -#: sql_help.c:5652 +#: sql_help.c:5787 msgid "remove a foreign table" msgstr "удалить стороннюю таблицу" -#: sql_help.c:5658 +#: sql_help.c:5793 msgid "remove a function" msgstr "удалить функцию" -#: sql_help.c:5664 sql_help.c:5730 sql_help.c:5832 +#: sql_help.c:5799 sql_help.c:5865 sql_help.c:5967 msgid "remove a database role" msgstr "удалить роль пользователя БД" -#: sql_help.c:5670 +#: sql_help.c:5805 msgid "remove an index" msgstr "удалить индекс" -#: sql_help.c:5676 +#: sql_help.c:5811 msgid "remove a procedural language" msgstr "удалить процедурный язык" -#: sql_help.c:5682 +#: sql_help.c:5817 msgid "remove a materialized view" msgstr "удалить материализованное представление" -#: sql_help.c:5688 +#: sql_help.c:5823 msgid "remove an operator" msgstr "удалить оператор" -#: sql_help.c:5694 +#: sql_help.c:5829 msgid "remove an operator class" msgstr "удалить класс операторов" -#: sql_help.c:5700 +#: sql_help.c:5835 msgid "remove an operator family" msgstr "удалить семейство операторов" -#: sql_help.c:5706 +#: sql_help.c:5841 msgid "remove database objects owned by a database role" msgstr "удалить объекты базы данных, принадлежащие роли" -#: sql_help.c:5712 +#: sql_help.c:5847 msgid "remove a row-level security policy from a table" msgstr "удалить из таблицы политику защиты на уровне строк" -#: sql_help.c:5718 +#: sql_help.c:5853 msgid "remove a procedure" msgstr "удалить процедуру" -#: sql_help.c:5724 +#: sql_help.c:5859 msgid "remove a publication" msgstr "удалить публикацию" -#: sql_help.c:5736 +#: sql_help.c:5871 msgid "remove a routine" msgstr "удалить подпрограмму" -#: sql_help.c:5742 +#: sql_help.c:5877 msgid "remove a rewrite rule" msgstr "удалить правило перезаписи" -#: sql_help.c:5748 +#: sql_help.c:5883 msgid "remove a schema" msgstr "удалить схему" -#: sql_help.c:5754 +#: sql_help.c:5889 msgid "remove a sequence" msgstr "удалить последовательность" -#: sql_help.c:5760 +#: sql_help.c:5895 msgid "remove a foreign server descriptor" msgstr "удалить описание стороннего сервера" -#: sql_help.c:5766 +#: sql_help.c:5901 msgid "remove extended statistics" msgstr "удалить расширенную статистику" -#: sql_help.c:5772 +#: sql_help.c:5907 msgid "remove a subscription" msgstr "удалить подписку" -#: sql_help.c:5778 +#: sql_help.c:5913 msgid "remove a table" msgstr "удалить таблицу" -#: sql_help.c:5784 +#: sql_help.c:5919 msgid "remove a tablespace" msgstr "удалить табличное пространство" -#: sql_help.c:5790 +#: sql_help.c:5925 msgid "remove a text search configuration" msgstr "удалить конфигурацию текстового поиска" -#: sql_help.c:5796 +#: sql_help.c:5931 msgid "remove a text search dictionary" msgstr "удалить словарь текстового поиска" -#: sql_help.c:5802 +#: sql_help.c:5937 msgid "remove a text search parser" msgstr "удалить анализатор текстового поиска" -#: sql_help.c:5808 +#: sql_help.c:5943 msgid "remove a text search template" msgstr "удалить шаблон текстового поиска" -#: sql_help.c:5814 +#: sql_help.c:5949 msgid "remove a transform" msgstr "удалить преобразование" -#: sql_help.c:5820 +#: sql_help.c:5955 msgid "remove a trigger" msgstr "удалить триггер" -#: sql_help.c:5826 +#: sql_help.c:5961 msgid "remove a data type" msgstr "удалить тип данных" -#: sql_help.c:5838 +#: sql_help.c:5973 msgid "remove a user mapping for a foreign server" msgstr "удалить сопоставление пользователя для стороннего сервера" -#: sql_help.c:5844 +#: sql_help.c:5979 msgid "remove a view" msgstr "удалить представление" -#: sql_help.c:5856 +#: sql_help.c:5991 msgid "execute a prepared statement" msgstr "выполнить подготовленный оператор" -#: sql_help.c:5862 +#: sql_help.c:5997 msgid "show the execution plan of a statement" msgstr "показать план выполнения оператора" -#: sql_help.c:5868 +#: sql_help.c:6003 msgid "retrieve rows from a query using a cursor" msgstr "получить результат запроса через курсор" -#: sql_help.c:5874 +#: sql_help.c:6009 msgid "define access privileges" msgstr "определить права доступа" -#: sql_help.c:5880 +#: sql_help.c:6015 msgid "import table definitions from a foreign server" msgstr "импортировать определения таблиц со стороннего сервера" -#: sql_help.c:5886 +#: sql_help.c:6021 msgid "create new rows in a table" msgstr "добавить строки в таблицу" -#: sql_help.c:5892 +#: sql_help.c:6027 msgid "listen for a notification" msgstr "ожидать уведомления" -#: sql_help.c:5898 +#: sql_help.c:6033 msgid "load a shared library file" msgstr "загрузить файл разделяемой библиотеки" -#: sql_help.c:5904 +#: sql_help.c:6039 msgid "lock a table" msgstr "заблокировать таблицу" -#: sql_help.c:5910 +#: sql_help.c:6045 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "добавление, изменение или удаление строк таблицы по условию" + +#: sql_help.c:6051 msgid "position a cursor" msgstr "установить курсор" -#: sql_help.c:5916 +#: sql_help.c:6057 msgid "generate a notification" msgstr "сгенерировать уведомление" -#: sql_help.c:5922 +#: sql_help.c:6063 msgid "prepare a statement for execution" msgstr "подготовить оператор для выполнения" -#: sql_help.c:5928 +#: sql_help.c:6069 msgid "prepare the current transaction for two-phase commit" msgstr "подготовить текущую транзакцию для двухфазной фиксации" -#: sql_help.c:5934 +#: sql_help.c:6075 msgid "change the ownership of database objects owned by a database role" msgstr "изменить владельца объектов БД, принадлежащих заданной роли" -#: sql_help.c:5940 +#: sql_help.c:6081 msgid "replace the contents of a materialized view" msgstr "заменить содержимое материализованного представления" -#: sql_help.c:5946 +#: sql_help.c:6087 msgid "rebuild indexes" msgstr "перестроить индексы" -#: sql_help.c:5952 +#: sql_help.c:6093 msgid "destroy a previously defined savepoint" msgstr "удалить ранее определённую точку сохранения" -#: sql_help.c:5958 +#: sql_help.c:6099 msgid "restore the value of a run-time parameter to the default value" msgstr "восстановить исходное значение параметра выполнения" -#: sql_help.c:5964 +#: sql_help.c:6105 msgid "remove access privileges" msgstr "удалить права доступа" -#: sql_help.c:5976 +#: sql_help.c:6117 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "отменить транзакцию, подготовленную ранее для двухфазной фиксации" -#: sql_help.c:5982 +#: sql_help.c:6123 msgid "roll back to a savepoint" msgstr "откатиться к точке сохранения" -#: sql_help.c:5988 +#: sql_help.c:6129 msgid "define a new savepoint within the current transaction" msgstr "определить новую точку сохранения в текущей транзакции" -#: sql_help.c:5994 +#: sql_help.c:6135 msgid "define or change a security label applied to an object" msgstr "задать или изменить метку безопасности, применённую к объекту" -#: sql_help.c:6000 sql_help.c:6054 sql_help.c:6090 +#: sql_help.c:6141 sql_help.c:6195 sql_help.c:6231 msgid "retrieve rows from a table or view" msgstr "выбрать строки из таблицы или представления" -#: sql_help.c:6012 +#: sql_help.c:6153 msgid "change a run-time parameter" msgstr "изменить параметр выполнения" -#: sql_help.c:6018 +#: sql_help.c:6159 msgid "set constraint check timing for the current transaction" msgstr "установить время проверки ограничений для текущей транзакции" -#: sql_help.c:6024 +#: sql_help.c:6165 msgid "set the current user identifier of the current session" msgstr "задать идентификатор текущего пользователя в текущем сеансе" -#: sql_help.c:6030 +#: sql_help.c:6171 msgid "" "set the session user identifier and the current user identifier of the " "current session" @@ -6733,45 +6644,45 @@ msgstr "" "задать идентификатор пользователя сеанса и идентификатор текущего " "пользователя в текущем сеансе" -#: sql_help.c:6036 +#: sql_help.c:6177 msgid "set the characteristics of the current transaction" msgstr "задать свойства текущей транзакции" -#: sql_help.c:6042 +#: sql_help.c:6183 msgid "show the value of a run-time parameter" msgstr "показать значение параметра выполнения" -#: sql_help.c:6060 +#: sql_help.c:6201 msgid "empty a table or set of tables" msgstr "опустошить таблицу или набор таблиц" -#: sql_help.c:6066 +#: sql_help.c:6207 msgid "stop listening for a notification" msgstr "прекратить ожидание уведомлений" -#: sql_help.c:6072 +#: sql_help.c:6213 msgid "update rows of a table" msgstr "изменить строки таблицы" -#: sql_help.c:6078 +#: sql_help.c:6219 msgid "garbage-collect and optionally analyze a database" msgstr "произвести сборку мусора и проанализировать базу данных" -#: sql_help.c:6084 +#: sql_help.c:6225 msgid "compute a set of rows" msgstr "получить набор строк" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 можно использовать только в неинтерактивном режиме" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалось открыть файл протокола \"%s\": %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6780,27 +6691,27 @@ msgstr "" "Введите \"help\", чтобы получить справку.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "не удалось установить параметр печати \"%s\"" -#: startup.c:699 +#: startup.c:719 #, 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:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "лишний аргумент \"%s\" проигнорирован" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "не удалось найти свой исполняемый файл" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6839,12 +6750,92 @@ msgstr "" #~ msgid "text" #~ msgstr "текст" +#~ msgid "\\watch cannot be used with COPY" +#~ msgstr "\\watch нельзя использовать с COPY" + #~ msgid "where direction can be empty or one of:" #~ msgstr "где допустимое направление пустое или:" #~ msgid "timezone" #~ msgstr "часовой_пояс" +#~ msgid "fatal: " +#~ msgstr "важно: " + +#~ 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 "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 "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) не поддерживает назначение параметров ролей для баз " +#~ "данных." + +# skip-rule: capital-letter-first +#~ 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 "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID large object operations\n" +#~ msgstr "" +#~ " \\lo_export LOBOID ФАЙЛ\n" +#~ " \\lo_import ФАЙЛ [КОММЕНТАРИЙ]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID операции с большими объектами\n" + #~ msgid "Enter new password: " #~ msgstr "Введите новый пароль: " @@ -6871,9 +6862,6 @@ msgstr "" #~ " \\g [ФАЙЛ] или ; выполнить запрос\n" #~ " (и направить результаты в файл или канал |)\n" -#~ msgid "old_version" -#~ msgstr "старая_версия" - #~ msgid "from_list" #~ msgstr "список_FROM" @@ -6907,9 +6895,6 @@ msgstr "" #~ msgid "attribute" #~ msgstr "атрибут" -#~ msgid "Value" -#~ msgstr "Значение" - #~ msgid "statistic_type" #~ msgstr "тип_статистики" @@ -7060,9 +7045,6 @@ msgstr "" #~ msgid "%s: -1 is incompatible with -c and -l\n" #~ msgstr "%s: -1 несовместимо с -c и -l\n" -#~ msgid " \\l[+] list all databases\n" -#~ msgstr " \\l[+] список всех баз данных\n" - #~ msgid "column" #~ msgstr "столбец" diff --git a/third_party/spanner_pg/src/bin/psql/po/sv.po b/third_party/spanner_pg/src/bin/psql/po/sv.po index 6fe93472..c7e135e7 100644 --- a/third_party/spanner_pg/src/bin/psql/po/sv.po +++ b/third_party/spanner_pg/src/bin/psql/po/sv.po @@ -6,10 +6,10 @@ # 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: 2023-02-03 13:31+0000\n" -"PO-Revision-Date: 2023-02-03 23:10+0100\n" +"POT-Creation-Date: 2023-02-03 19:46+0000\n" +"PO-Revision-Date: 2023-03-09 22:34+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,59 +18,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 "fatalt: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../common/exec.c:141 ../../common/exec.c:258 ../../common/exec.c:304 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:301 +#, 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:160 +#: ../../common/exec.c:168 #, c-format msgid "invalid binary \"%s\"" msgstr "ogiltig binär \"%s\"" -#: ../../common/exec.c:210 +#: ../../common/exec.c:218 #, c-format msgid "could not read binary \"%s\"" msgstr "kunde inte läsa binär \"%s\"" -#: ../../common/exec.c:218 +#: ../../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:274 ../../common/exec.c:313 +#: ../../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:291 +#: ../../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:414 +#: ../../common/exec.c:422 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:527 ../../common/exec.c:572 ../../common/exec.c:664 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "slut på minne" @@ -91,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:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "användaren finns inte" @@ -138,303 +143,294 @@ msgstr "Förfrågan om avbrytning skickad\n" msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrågan om avbrytning: " -#: ../../fe_utils/print.c:336 +#: ../../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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Avbruten\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "hoppar över rekursiv expandering av variabeln \"%s\"" -#: command.c:229 +#: ../../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:232 #, c-format msgid "invalid command \\%s" msgstr "ogiltigt kommando \\%s" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Försök med \\? för hjälp." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: extra argument \"%s\" ignorerat" -#: command.c:301 +#: command.c:304 #, 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:562 +#: command.c:573 #, 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:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: kunde inte byta katalog till \"%s\": %m" -#: command.c:605 +#: command.c:617 #, 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:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "ingen frågebuffert" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "ogiltigt radnummer: %s" -#: command.c:1111 -#, 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:1114 -#, 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:1198 +#: command.c:1203 msgid "No changes" msgstr "Inga ändringar" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ogiltigt kodningsnamn eller konverteringsprocedur hittades inte" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Det finns inget tidigare fel." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: saknar höger parentes" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: obligatoriskt argument saknas" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kan inte komma efter \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: ingen matchande \\if" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kan inte komma efter \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: ingen matchande \\if" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: ingen matchande \\if" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Frågebufferten är tom." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Mata in nytt lösenord för användare \"%s\": " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Mata in det igen: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Lösenorden stämde inte överens." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: kunde inte läsa värde på varibeln" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Frågebufferten har blivit borttagen." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Skrev historiken till fil \"%s\".\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: omgivningsvariabelnamn får ej innehålla \"=\"" -#: command.c:2408 -#, 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:2411 -#, 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:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "funktionsnamn krävs" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "vynamn krävs" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Tidtagning är på." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Tidtagning är av." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Lösenord: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Lösenord för användare %s: " -#: command.c:3106 +#: command.c:3168 #, 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:3141 +#: command.c:3203 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Det finns ingen anslutning att återanvända parametrar från" -#: command.c:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Föregående anslutning bevarad" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, 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:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, server %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -443,29 +439,29 @@ msgstr "" "VARNING: %s huvudversion %s, server huvudversion %s.\n" " En del psql-finesser kommer kanske inte fungera.\n" -#: command.c:3608 +#: command.c:3680 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL-anslutning (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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "okänd" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "av" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "på" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-krypterad anslutning\n" -#: command.c:3646 +#: command.c:3717 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -476,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:3751 +#: command.c:3822 #, 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:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "kunde inte starta editorn \"%s\"" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "kunde inte starta /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "kunde inte hitta temp-katalog: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" -#: command.c:4195 +#: command.c:4266 #, 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:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: tillåtna linjestilar är ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: tillåtna Unicode-ramstilar är single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: tillåtna Unicode-kolumnlinjestilar ärsingle, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: tillåtna Unicode-rubriklinjestilar är single, double" -#: command.c:4322 +#: command.c:4393 #, 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:4327 +#: command.c:4398 #, 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:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: okänd parameter: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Ramstil är %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "Målvidd är inte satt.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "Målvidd är %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Utökad visning är på.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Utökad visning används automatiskt.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Utökad visning är av.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Fältseparatorn för CSV är \"%s\".\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Fältseparatorn är noll-byte.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Fältseparatorn är \"%s\".\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Standard sidfot är på.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Standard sidfot är av.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Utdataformatet är \"%s\".\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Linjestil är %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-visare är \"%s\".\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokal-anpassad numerisk utdata är på.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokal-anpassad numerisk utdata är av.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Siduppdelare är på för lång utdata.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Siduppdelare används alltid.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "Siduppdelare är av.\n" -#: command.c:4580 +#: command.c:4651 #, 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:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Postseparatorn är noll-byte.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Postseparatorn är .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Postseparatorn är \"%s\".\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellattributen är \"%s\".\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellattributen är ej satta.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Titeln är \"%s\".\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Titeln är inte satt.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Visa bara tupler är på.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Visa bara tupler är av.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-ramstil är \"%s\".\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-kolumnLinjestil är \"%s\".\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-rubriklinjestil är \"%s\".\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: misslyckades" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kan inte användas på en tom fråga" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "kunde inte sätta timer: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (varje %gs)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (varje %gs)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "kunde inte vänta på signaler: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format msgid "" "********* QUERY **********\n" @@ -741,117 +747,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" är inte en vy" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "kunde inte parsa arrayen reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "kan inte escape:a utan en aktiv uppkoppling" -#: common.c:200 +#: common.c:207 #, 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:311 #, c-format msgid "connection to server was lost" msgstr "uppkopplingen till servern har brutits" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Anslutningen till servern har brutits. Försöker starta om: " -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "Misslyckades.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Lyckades.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "oväntad PQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Tid: %.3f ms\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, 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:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, 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:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch kan inte användas med COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "oväntat resultatstatus för \\watch" - -#: common.c:694 +#: common.c:654 #, 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:697 +#: common.c:657 #, 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:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "kunde inte visa resultatabell: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "inga rader returnerades för \\gset" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "mer än en rad returnerades för \\gset" -#: common.c:791 +#: common.c:731 #, 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:1211 +#: common.c:1043 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -862,33 +858,28 @@ msgstr "" "%s\n" "***(tryck return för att fortsätta eller skriv x och return för att avbryta)*****\n" -#: common.c:1266 -#, 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:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "SATS: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "oväntad transaktionsstatus (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Kolumn" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Typ" -#: common.c:1564 +#: common.c:1353 #, 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" @@ -955,11 +946,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:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "avbruten på grund av läsfel" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "försöker avsluta kopieringsläge" @@ -1008,1147 +999,1158 @@ msgstr "\\crosstabview: tvetydigt kolumnnamn: \"%s\"" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: hittar ej kolumnnamn: \"%s\"" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Schema" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Namn" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Resultatdatatyp" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Argumentdatatyp" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Beskrivning" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Lista med aggregatfunktioner" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Servern (version %s) stöder inte accessmetoder." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Index" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Tabell" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Hanterare" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Lista med accessmetoder" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Servern (version %s) stöder inte tabellutrymmen." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Ägare" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Plats" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Alternativ" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Storlek" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Lista med tabellutrymmen" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df tar bara [anptwS+] som flaggor" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "agg" -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "fönster" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "proc" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "funk" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +# Vi väljer att bevara den engelska termen då det dels refererar till kommandot CREATE TRIGGER +# och dels för att detta begreppet normalt benäms som triggers i dagligt tal i Sverige. +#: describe.c:374 describe.c:1390 msgid "trigger" -msgstr "utlösare" +msgstr "trigger" -#: describe.c:498 +# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen +#: describe.c:386 msgid "immutable" -msgstr "oföränderlig" +msgstr "immutable" -#: describe.c:499 +# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen +#: describe.c:387 msgid "stable" -msgstr "stabil" +msgstr "stable" -#: describe.c:500 +# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen +#: describe.c:388 msgid "volatile" -msgstr "instabil" +msgstr "volatile" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" -msgstr "Instabilitet" +msgstr "Flyktighet" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "begränsad" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "säker" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "osäker" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Parallell" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "definierare" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "anropare" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Säkerhet" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Språk" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Källkod" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Lista med funktioner" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Internt namn" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Element" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Lista med datatyper" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Vänster argumenttyp" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Höger argumenttyp" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Resultattyp" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Funktion" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Lista med operatorer" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Kodning" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Jämförelse" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "ICU-lokal" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Lokalleverantör" + +#: describe.c:964 msgid "Tablespace" msgstr "Tabellutrymme" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Lista med databaser" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "tabell" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "vy" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "materialiserad vy" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "sekvens" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "främmande tabell" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "partitionerad tabell" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Kolumnrättigheter" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Policys" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Åtkomsträttigheter" -#: describe.c:1293 -#, 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:1313 +#: describe.c:1188 msgid "function" msgstr "funktion" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "typ" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "schema" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Standard accessrättigheter" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Objekt" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "tabellvillkor" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "domänvillkor" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "operatorklass" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "operatorfamilj" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "rule" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Objektbeskrivningar" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Kunde inte hitta en relation med namn \"%s\"." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Kunde inte hitta några relationer." -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "Kunde inte hitta en relation med OID %s." -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Start" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Minimum" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Maximum" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Ökning" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "ja" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "nej" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Cyklisk?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Cache" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Ägd av: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Sekvens för identitetskolumn: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Ologgat sekvens \"%s.%s\"" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sekvens \"%s.%s\"" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ologgad tabell \"%s.%s\"" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabell \"%s.%s\"" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Vy \"%s.%s\"" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ologgad materialiserad vy \"%s.%s\"" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialiserad vy \"%s.%s\"" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ologgat index \"%s.%s\"" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Index \"%s.%s\"" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ologgat partitionerat index \"%s.%s\"" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionerat index \"%s.%s\"" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Särskild relation \"%s.%s\"" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-tabell \"%s.%s\"" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Sammansatt typ \"%s.%s\"" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Främmande tabell \"%s.%s\"" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ologgad partitionerad tabell \"%s.%s\"" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionerad tabell \"%s.%s\"" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Jämförelse" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Nullbar" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "Standard" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Nyckel?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Definition" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "FDW-alternativ" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Lagring" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Komprimering" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Statistikmål" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition av: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Inget partitioneringsvillkor" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Partitioneringsvillkor: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Partitioneringsnyckel: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Ägande tabell \"%s.%s\"" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "primärnyckel, " -#: describe.c:2514 -msgid "unique, " -msgstr "unik, " +#: describe.c:2312 +msgid "unique" +msgstr "unik" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " null-värden ej distinkta" -#: describe.c:2520 +#: describe.c:2315 +msgid ", " +msgstr ", " + +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "för tabell \"%s.%s\"" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", predikat (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", klustrad" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", ogiltig" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", uppskjutbar" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", initialt uppskjuten" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", replikaidentitet" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Index:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Kontrollvillkor:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Främmande nyckel-villkor:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Refererad av:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Policys:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Policys (tvingad radsäkerhet påslagen):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Policys (radsäkerhet påslagna): (ingen)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (tvingad radsäkerhet påslagen): (ingen)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Policys (radsäkerhet avstängd):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Statistikobjekt:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Regler:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Avstängda regler:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Regler som alltid utförs:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Regler som utförs enbart på replika:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Publiceringar:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Vydefinition:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" -msgstr "Utlösare:" +msgstr "Triggrar:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" -msgstr "Avstängda användarutlösare:" - -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Avstängda utlösare:" +msgstr "Avstängda användartriggrar:" -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" -msgstr "Avstängda interna utlösare:" +msgstr "Avstängda interna triggrar:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" -msgstr "Utlösare som alltid aktiveras:" +msgstr "Triggrar som alltid körs:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" -msgstr "Utlösare som aktiveras enbart på replika:" +msgstr "Triggrar som enbart körs på replika:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "FDW-alternativ: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Ärver" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Antal partitioner: %d" -#: describe.c:3617 +#: describe.c:3422 #, 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:3619 +#: describe.c:3424 #, 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:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Barntabeller" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Partitioner" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Typad tabell av typ: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Replikaidentitet" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Har OID:er: ja" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Accessmetod: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", tabellutrymme: \"%s\"" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Lista med roller" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Rollnamn" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Attribut" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Medlem av" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Superanvändare" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Inget arv" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Skapa roll" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Skapa DB" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "Kan inte logga in" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Replikering" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Hopp över RLS" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Inga uppkopplingar" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d uppkoppling" msgstr[1] "%d uppkopplingar" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Lösenord giltigt till " -#: describe.c:3991 -#, 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:4004 +#: describe.c:3777 msgid "Role" msgstr "Roll" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "Databas" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Inställningar" -#: describe.c:4030 +#: describe.c:3803 #, 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:4033 +#: describe.c:3806 #, 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:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Kunde inte hitta några inställningar." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Lista med inställningar" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "index" -#: describe.c:4115 -msgid "special" -msgstr "särskild" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "TOAST-tabell" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "partitionerat index" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "permanent" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "temporär" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "ologgad" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Persistens" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Accessmetod" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Lista med relationer" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Servern (version %s) stöder inte deklarativ tabellpartitionering." -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Lista med partitionerade index" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Lista med partitionerade tabeller" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Lista med partitionerade relationer" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Föräldranamn" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Partitionsstorlek av löv" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Total storlek" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Tillförlitlig" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Internt språk" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Anropshanterare" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Validerare" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Inline-hanterare" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Lista med språk" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Check" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Lista med domäner" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Källa" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Mål" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "Standard?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Lista med konverteringar" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Parameter" + +#: describe.c:4498 +msgid "Value" +msgstr "Värde" + +#: describe.c:4505 +msgid "Context" +msgstr "Kontext" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Lista med konfigurationsparametrar" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Lista med icke-defaulta konfigurationsparametrar" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Servern (version %s) stöder inte händelsetriggrar." + +#: describe.c:4587 msgid "Event" msgstr "Händelse" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "påslagen" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "replika" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "alltid" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "avstängd" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Påslagen" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Etiketter" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" -msgstr "Lista med händelseutlösare" +msgstr "Lista med händelsetriggrar" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Servern (version %s) stöder inte utökad statistik." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Nunika" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Beroenden" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Lista med utökad statistik" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Källtyp" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Måltyp" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "i tilldelning" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Implicit?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Lista med typomvandlingar" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Servern (version %s) stöder inte jämförelser (collations)." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Leverantör" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Deterministisk?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Lista med jämförelser (collations)" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Lista med scheman" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Servern (version %s) stöder inte fulltextsökning." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Lista med textsökparsrar" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kunde inte hitta en textsökparser med namn \"%s\"." -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Kunde inte hitta några textsökparsrar." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Starta parsning" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Metod" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Hämta nästa symbol" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Avsluta parsning" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Hämta rubrik" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Hämta symboltyper" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsökparser \"%s.%s\"" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsökparser \"%s\"" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Symbolnamn" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Symboltyper för parser \"%s.%s\"" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Symboltyper för parser \"%s\"" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Mall" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Initieringsalternativ" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Lista med textsökordlistor" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Init" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Symboluppdelning" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Lista med textsökmallar" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Lista med textsökkonfigurationer" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Kunde inte hitta en textsökkonfiguration med namn \"%s\"." -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Kunde inte hitta några textsökkonfigurationer." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Symbol" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Ordlistor" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsökkonfiguration \"%s.%s\"" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsökkonfiguration \"%s\"" -#: describe.c:5750 +#: describe.c:5638 #, c-format msgid "" "\n" @@ -2157,7 +2159,7 @@ msgstr "" "\n" "Parser: \"%s.%s\"" -#: describe.c:5753 +#: describe.c:5641 #, c-format msgid "" "\n" @@ -2166,255 +2168,253 @@ msgstr "" "\n" "Parser: \"%s\"" -#: describe.c:5787 -#, 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:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Lista med främmande data-omvandlare" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Servern (version %s) stöder inte främmande servrar." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Främmande data-omvandlare" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Version" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Lista med främmande servrar" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Servern (version %s) stöder inte användarmappningar." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Server" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Användarnamn" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Lista av användarmappningar" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Servern (version %s) stöder inte främmande tabeller." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Lista med främmande tabeller" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Servern (version %s) stöder inte utökningar." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Lista med installerade utökningar" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Kunde inte hitta en utökning med namn \"%s\"." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Kunde inte hitta några utökningar." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Objektbeskrivning" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekt i utökning \"%s\"" -#: describe.c:6286 +#: describe.c:6126 #, 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:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Servern (version %s) stöder inte publiceringar." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Alla tabeller" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Insättningar" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Uppdateringar" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Borttagningar" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Trunkeringar" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Via root" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Lista med publiceringar" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Kunde inte hitta någon publicering med namn \"%s\"." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Kunde inte hitta några publiceringar." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Publicering %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Tabeller:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Tabeller från scheman:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Denna server (version %s) stöder inte prenumerationer." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Publicering" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Binär" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Strömmande" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Tvåfas-commit" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Stäng av vid fel" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Synkron commit" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Anslutningsinfo" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Skippa LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Lista med prenumerationer" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "AM" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Indatatyp" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Lagringstyp" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Operatorklass" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Operatorfamilj" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Lista med operatorklasser" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Applicerbara typer" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Lista med operatorfamiljer" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Operator" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Strategi" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "ordning" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "sök" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Ändamål" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Sortering-opfamilj" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Lista med operatorer i operatorfamiljer" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Registrerad vänstertyp" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Registrerad högertyp" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Nummer" -#: describe.c:7008 +#: describe.c:6948 msgid "List of support functions of operator families" msgstr "Lista med supportfunktioner i operatorfamiljer" -#: help.c:73 -#, c-format +#: describe.c:6979 +msgid "ID" +msgstr "ID" + +#: describe.c:7000 +msgid "Large objects" +msgstr "Stora objekt" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2422,13 +2422,11 @@ msgstr "" "psql är den interaktiva PostgreSQL-terminalen.\n" "\n" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format +#: help.c:76 help.c:393 help.c:473 help.c:516 msgid "Usage:\n" msgstr "Användning:\n" -#: help.c:75 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2436,33 +2434,28 @@ msgstr "" " psql [FLAGGA]... [DBNAMN [ANVÄNDARNAMN]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Allmänna flaggor:\n" -#: help.c:82 -#, c-format +#: help.c:84 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:85 #, 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 -#, c-format +#: help.c:87 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 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list lista befintliga databaser och avsluta sedan\n" -#: help.c:86 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2472,18 +2465,15 @@ msgstr "" " sätt psql-variabel NAMN till VÄRDE\n" " (t.ex. -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc läs inte startfilen (~/.psqlrc)\n" -#: help.c:91 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2491,23 +2481,19 @@ msgstr "" " -1 (\"ett\"), --single-transaction\n" " kör kommandofilen som en transaktion (om icke-interaktiv)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=alternativ] visa denna hjälp, avsluta sedan\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands lista bakstreck-kommandon, avsluta sedan\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variabler lista speciella variabler, avsluta sedan\n" -#: help.c:97 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2515,58 +2501,47 @@ msgstr "" "\n" "Flaggor för in-/utmatning:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all visa all indata från skript\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors visa misslyckade kommandon\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries visa kommandon som skickas till servern\n" -#: help.c:101 -#, c-format +#: help.c:104 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 -#, c-format +#: help.c:105 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 -#, c-format +#: help.c:106 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 -#, c-format +#: help.c:107 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 -#, c-format +#: help.c:108 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 -#, c-format +#: help.c:109 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 -#, c-format +#: help.c:110 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 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" @@ -2574,17 +2549,15 @@ msgstr "" "\n" "Flaggor för utdataformat:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align ojusterad utskrift av tabeller\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV-utmarningsläge (kommaseparerade värden)\n" -#: help.c:112 +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2593,18 +2566,15 @@ msgstr "" " -F, --field-separator=STRÄNG\n" " fältseparator för icke justerad utdata (standard: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-utskrift av tabeller\n" -#: help.c:116 -#, c-format +#: help.c:119 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 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2612,23 +2582,19 @@ msgstr "" " -R, --record-separator=STRÄNG\n" " sätt postseparator för icke justerad utdata (standard: newline)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only visa endast rader\n" -#: help.c:120 -#, c-format +#: help.c:123 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 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded slå på utökad utsrift av tabeller\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2636,8 +2602,7 @@ msgstr "" " -z, --field-separator-zero\n" " sätt fältseparator för icke justerad utdata till noll-byte\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2645,8 +2610,7 @@ msgstr "" " -0, --record-separator=zero\n" " sätt postseparator för icke justerad utdata till noll-byte\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2654,39 +2618,36 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: help.c:130 +#: help.c:133 #, 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:134 msgid "local socket" msgstr "lokalt uttag (socket)" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT databasens serverport (standard: \"%s\")\n" -#: help.c:137 +#: help.c:140 #, 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:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password fråga aldrig efter lösenord\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n" -#: help.c:141 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2700,371 +2661,310 @@ msgstr "" "i PostgreSQL-dokumentationen.\n" "\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Allmänna\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright visa PostgreSQL-upphovsrättsinformation\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +#: help.c:193 +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:174 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose visa senste felmeddelande vid maximal verbositet\n" -#: help.c:175 -#, c-format +#: help.c:195 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:177 -#, c-format +#: help.c:197 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:178 -#, c-format +#: help.c:198 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:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" +#: help.c:199 +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:180 -#, c-format +#: help.c:200 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:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q avsluta psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEK] kör fråga var SEK sekund\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Hjälp\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [kommandon] visa hjälp om backstreckkommandon\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options visa hjälp för psqls kommandoradflaggor\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables visa hjälp om speciella variabler\n" -#: help.c:190 -#, c-format +#: help.c:210 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:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Frågebuffert\n" -#: help.c:194 -#, c-format +#: help.c:214 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:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAMN [RAD]] redigera funktionsdefinition med extern redigerare\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [FUNKNAMN [RAD]] redigera vydefinition med extern redigerare\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p visa innehållet i frågebufferten\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r nollställ (radera) frågebufferten\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILNAMN] visa kommandohistorien eller spara den i fil\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILNAMN skriv frågebuffert till fil\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "In-/Utmatning\n" -#: help.c:206 -#, c-format +#: help.c:226 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:207 -#, c-format +#: help.c:227 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:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILNAMN kör kommandon från fil\n" -#: help.c:209 -#, c-format +#: help.c:229 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:210 -#, c-format +#: help.c:230 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:211 -#, c-format +#: help.c:231 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:212 -#, c-format +#: help.c:232 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:215 -#, c-format +#: help.c:235 msgid "Conditional\n" msgstr "Villkor\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR starta villkorsblock\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR alternativ inom aktuellt villkorsblock\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else avslutningsalternativ inom aktuellt villkorsblock\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif avsluta villkorsblock\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Information\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (flaggor: S = lista systemobjekt, + = mer detaljer)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] lista tabeller, vyer och sekvenser\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAMN beskriv tabell, vy, sekvens eller index\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MALL] lista aggregatfunktioner\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MALL] lista accessmetoder\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista operatorklasser\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista operatorfamiljer\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MALL] lista tabellutrymmen\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MALL] lista konverteringar\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [MALL] lista konfigurationsparametrar\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MALL] lista typomvandlingar\n" -#: help.c:235 -#, c-format +#: help.c:256 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:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MALL] lista domäner\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MALL] lista standardrättigheter\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MALL] lista främmande tabeller\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MALL] lista främmande servrar\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MALL] lista främmande tabeller\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MALL] lista användarmappning\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MALL] lista främmande data-omvandlare\n" -#: help.c:243 -#, c-format +#: help.c:264 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" +" lista [endast agg/normala/procedur/trigger/window] funktioner\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MALL] lista textsökkonfigurationer\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MALL] lista textsökordlistor\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MALL] lista textsökparsrar\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MALL] lista textsökmallar\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MALL] lista roller\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MALL] lista index\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl lista stora objekt, samma som \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] lista stora objekt, samma som \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MALL] lista procedurspråk\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MALL] lista materialiserade vyer\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MALL] lista scheman\n" -#: help.c:255 -#, c-format +#: help.c:276 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3072,125 +2972,126 @@ msgstr "" " \\do[S+] [OPMALL [TYPMALL [TYPMALL]]]\n" " lista operatorer\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MALL] lista jämförelser (collation)\n" -#: help.c:258 -#, c-format +#: help.c:279 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:259 -#, c-format +#: help.c:280 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:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [ROLLMALL1 [DBMALL2]]\n" " lista rollinställningar per databas\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MALL] lista replikeringspubliceringar\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MALL] lista replikeringsprenumerationer\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MALL] lista sekvenser\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MALL] lista tabeller\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MALL] lista datatyper\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MALL] lista roller\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MALL] lista vyer\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MALL] lista utökningar\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MALL] lista utökad statistik\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" -msgstr " \\dy[+] [MALL] lista händelseutlösare\n" +msgstr " \\dy[+] [MALL] lista händelsetriggrar\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MALL] lista databaser\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAMN visa en funktions definition\n" -#: help.c:273 -#, c-format -msgid " \\sv[+] VIEWNAME show a view's definition\n" -msgstr " \\sv[+] VYNAMN visa en vys definition\n" +#: help.c:294 +msgid " \\sv[+] VIEWNAME show a view's definition\n" +msgstr " \\sv[+] VYNAMN visa en vys definition\n" + +#: help.c:295 +msgid " \\z [PATTERN] same as \\dp\n" +msgstr " \\z [MALL] samma som \\dp\n" + +#: help.c:298 +msgid "Large Objects\n" +msgstr "Stora objekt\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FIL skriv stort objekt till fil\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FIL [KOMMENTAR]\n" +" läs stort objekt från fil\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] lista stora objekt\n" -#: help.c:274 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [MALL] samma som \\dp\n" +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID ta bort stort objekt\n" -#: help.c:277 -#, c-format +#: help.c:306 msgid "Formatting\n" msgstr "Formatering\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a byt mellan ojusterat och justerat utdataformat\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] sätt tabelltitel, eller nollställ\n" -#: help.c:280 -#, c-format +#: help.c:309 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:310 #, 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 -#, c-format +#: help.c:312 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3208,27 +3109,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, 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 -#, c-format +#: help.c:321 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:322 #, 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 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "auto" + +#: help.c:326 msgid "Connection\n" msgstr "Anslutning\n" -#: help.c:299 +#: help.c:328 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3237,8 +3140,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 -#, c-format +#: help.c:332 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3246,98 +3148,70 @@ 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 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo visa information om aktuell uppkoppling\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODNING] visa eller sätt klientens teckenkodning\n" -#: help.c:307 -#, c-format +#: help.c:336 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 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Operativsystem\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [KATALOG] byt den aktuella katalogen\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR hämta omgivningsvariabel\n" + +#: help.c:342 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:343 #, 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 -#, c-format +#: help.c:345 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 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Variabler\n" -#: help.c:319 -#, c-format +#: help.c:349 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 -#, c-format +#: help.c:350 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 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME ta bort intern variabel\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Stora objekt\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\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_unlink LOBOID operationer på stora objekt\n" - -#: help.c:352 -#, c-format +#: help.c:390 msgid "" "List of specially treated variables\n" "\n" msgstr "Lista av variabler som hanteras speciellt\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "psql-variabler:\n" -#: help.c:356 -#, c-format +#: help.c:394 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3347,8 +3221,7 @@ msgstr "" " eller \\set NAMN VÄRDE inne i psql\n" "\n" -#: help.c:358 -#, c-format +#: help.c:396 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3356,8 +3229,7 @@ msgstr "" " AUTOCOMMIT\n" " om satt så kommer efterföljande SQL-kommandon commit:as automatiskt\n" -#: help.c:360 -#, c-format +#: help.c:398 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3367,8 +3239,7 @@ msgstr "" " bestämmer skiftläge för att komplettera SQL-nyckelord\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:401 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3376,8 +3247,7 @@ msgstr "" " DBNAME\n" " den uppkopplade databasens namn\n" -#: help.c:365 -#, c-format +#: help.c:403 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3387,8 +3257,7 @@ msgstr "" " bestämmer vilken indata som skrivs till standard ut\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:406 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3398,8 +3267,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 -#, c-format +#: help.c:409 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3407,8 +3275,7 @@ msgstr "" " ENCODING\n" " aktuell teckenkodning för klient\n" -#: help.c:373 -#, c-format +#: help.c:411 msgid "" " ERROR\n" " true if last query failed, else false\n" @@ -3416,8 +3283,7 @@ msgstr "" " ERROR\n" " sant om sista frågan misslyckades, falskt annars\n" -#: help.c:375 -#, c-format +#: help.c:413 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3425,8 +3291,7 @@ msgstr "" " FETCH_COUNT\n" " antal resultatrader som hämtas och visas åt gången (0=obegränsat)\n" -#: help.c:377 -#, c-format +#: help.c:415 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3434,8 +3299,7 @@ msgstr "" " HIDE_TABLEAM\n" " om satt så visas inte accessmetoder\n" -#: help.c:379 -#, c-format +#: help.c:417 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3443,8 +3307,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " om satt så visas inte komprimeringsmetoder\n" -#: help.c:381 -#, c-format +#: help.c:419 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3452,8 +3315,7 @@ msgstr "" " HISTCONTROL\n" " styr kommandohistoriken [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format +#: help.c:421 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3461,8 +3323,7 @@ msgstr "" " HISTFILE\n" " filnamn för att spara kommandohistoriken i\n" -#: help.c:385 -#, c-format +#: help.c:423 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3470,8 +3331,7 @@ msgstr "" " HISTSIZE\n" " maximalt antal kommandon som sparas i kommandohistoriken\n" -#: help.c:387 -#, c-format +#: help.c:425 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3479,8 +3339,7 @@ msgstr "" " HOST\n" " den uppkopplade databasens värd\n" -#: help.c:389 -#, c-format +#: help.c:427 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3488,8 +3347,7 @@ msgstr "" " IGNOREEOF\n" " antal EOF som behövs för att avsluta en interaktiv session\n" -#: help.c:391 -#, c-format +#: help.c:429 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3497,8 +3355,7 @@ msgstr "" " LASTOID\n" " värdet av den senast påverkade OID:en\n" -#: help.c:393 -#, c-format +#: help.c:431 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3508,8 +3365,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:396 -#, c-format +#: help.c:434 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3517,8 +3373,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " om satt, ett fel stoppar inte en transaktion (använder implicita sparpunkter)\n" -#: help.c:398 -#, c-format +#: help.c:436 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3526,8 +3381,7 @@ msgstr "" " ON_ERROR_STOP\n" " avsluta batchkörning vid fel\n" -#: help.c:400 -#, c-format +#: help.c:438 msgid "" " PORT\n" " server port of the current connection\n" @@ -3535,8 +3389,7 @@ msgstr "" " PORT\n" " värdport för den aktuella uppkopplingen\n" -#: help.c:402 -#, c-format +#: help.c:440 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3544,8 +3397,7 @@ msgstr "" " PROMPT1\n" " anger standardprompten för psql\n" -#: help.c:404 -#, c-format +#: help.c:442 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3553,8 +3405,7 @@ msgstr "" " PROMPT2\n" " anger den prompt som används om en sats forsätter på efterföljande rad\n" -#: help.c:406 -#, c-format +#: help.c:444 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3562,8 +3413,7 @@ msgstr "" " PROMPT3\n" " anger den prompt som används för COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format +#: help.c:446 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3571,8 +3421,7 @@ msgstr "" " QUIET\n" " kör tyst (samma som flaggan -q)\n" -#: help.c:410 -#, c-format +#: help.c:448 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3580,8 +3429,7 @@ msgstr "" " ROW_COUNT\n" " antal rader som returnerades eller påverkades av senaste frågan alternativt 0\n" -#: help.c:412 -#, c-format +#: help.c:450 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3591,8 +3439,16 @@ msgstr "" " SERVER_VERSION_NAME\n" " serverns version (i kort sträng eller numeriskt format)\n" -#: help.c:415 -#, c-format +#: help.c:453 +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:455 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3600,8 +3456,7 @@ msgstr "" " SHOW_CONTEXT\n" " styr visning av meddelandekontextfält [never, errors, always]\n" -#: help.c:417 -#, c-format +#: help.c:457 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3609,8 +3464,7 @@ msgstr "" " SINGLELINE\n" " om satt, slut på raden avslutar SQL-kommandon (samma som flaggan -S )\n" -#: help.c:419 -#, c-format +#: help.c:459 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3618,8 +3472,7 @@ msgstr "" " SINGLESTEP\n" " stegningsläge (samma som flaggan -s)\n" -#: help.c:421 -#, c-format +#: help.c:461 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3627,8 +3480,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE för sista frågan eller \"00000\" om det inte varit fel\n" -#: help.c:423 -#, c-format +#: help.c:463 msgid "" " USER\n" " the currently connected database user\n" @@ -3636,8 +3488,7 @@ msgstr "" " USER\n" " den uppkopplade databasanvändaren\n" -#: help.c:425 -#, c-format +#: help.c:465 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3645,8 +3496,7 @@ msgstr "" " VERBOSITY\n" " styr verbositet för felrapporter [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format +#: help.c:467 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3658,8 +3508,7 @@ msgstr "" " VERSION_NUM\n" " psql:s version (i lång sträng, kort sträng eller numeriskt format)\n" -#: help.c:432 -#, c-format +#: help.c:472 msgid "" "\n" "Display settings:\n" @@ -3667,8 +3516,7 @@ msgstr "" "\n" "Visningsinställningar:\n" -#: help.c:434 -#, c-format +#: help.c:474 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3678,8 +3526,7 @@ msgstr "" " eller \\pset NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:436 -#, c-format +#: help.c:476 msgid "" " border\n" " border style (number)\n" @@ -3687,8 +3534,7 @@ msgstr "" " border\n" " ramstil (nummer)\n" -#: help.c:438 -#, c-format +#: help.c:478 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3696,8 +3542,7 @@ msgstr "" " columns\n" " målvidd för wrappade format\n" -#: help.c:440 -#, c-format +#: help.c:480 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3705,7 +3550,7 @@ msgstr "" " expanded (eller x)\n" " expanderad utdata [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format msgid "" " fieldsep\n" @@ -3714,8 +3559,7 @@ msgstr "" " fieldsep\n" " fältseparator för ej justerad utdata (standard \"%s\")\n" -#: help.c:445 -#, c-format +#: help.c:485 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3723,8 +3567,7 @@ msgstr "" " fieldsep_zero\n" " sätt fältseparator för ej justerad utdata till noll-byte\n" -#: help.c:447 -#, c-format +#: help.c:487 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3732,8 +3575,7 @@ msgstr "" " footer\n" " slå på/av visning av tabellfot [on, off]\n" -#: help.c:449 -#, c-format +#: help.c:489 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3741,8 +3583,7 @@ msgstr "" " format\n" " sätt utdataformat [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format +#: help.c:491 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3750,8 +3591,7 @@ msgstr "" " linestyle\n" " sätt ramlinjestil [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format +#: help.c:493 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3759,8 +3599,7 @@ msgstr "" " null\n" " sätt sträng som visas istället för null-värden\n" -#: help.c:455 -#, c-format +#: help.c:495 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3768,8 +3607,7 @@ msgstr "" " numericlocale\n" " slå på visning av lokalspecifika tecken för gruppering av siffror\n" -#: help.c:457 -#, c-format +#: help.c:497 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3777,8 +3615,7 @@ msgstr "" " pager\n" " styr när en extern pagenerare används [yes, no, always]\n" -#: help.c:459 -#, c-format +#: help.c:499 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3786,8 +3623,7 @@ msgstr "" " recordsep\n" " post (rad) separator för ej justerad utdata\n" -#: help.c:461 -#, c-format +#: help.c:501 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3795,8 +3631,7 @@ msgstr "" " recordsep_zero\n" " sätt postseparator för ej justerad utdata till noll-byte\n" -#: help.c:463 -#, c-format +#: help.c:503 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3806,8 +3641,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:466 -#, c-format +#: help.c:506 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3815,8 +3649,7 @@ msgstr "" " title\n" " sätt tabelltitel för efterkommande tabellutskrifter\n" -#: help.c:468 -#, c-format +#: help.c:508 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3824,8 +3657,7 @@ msgstr "" " tuples_only\n" " om satt, bara tabelldatan visas\n" -#: help.c:470 -#, c-format +#: help.c:510 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3837,8 +3669,7 @@ msgstr "" " unicode_header_linestyle\n" " sätter stilen på Unicode-linjer [single, double]\n" -#: help.c:475 -#, c-format +#: help.c:515 msgid "" "\n" "Environment variables:\n" @@ -3846,8 +3677,7 @@ msgstr "" "\n" "Omgivningsvariabler:\n" -#: help.c:479 -#, c-format +#: help.c:519 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3857,8 +3687,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne psql\n" "\n" -#: help.c:481 -#, c-format +#: help.c:521 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3870,8 +3699,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:484 -#, c-format +#: help.c:524 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3879,8 +3707,7 @@ msgstr "" " COLUMNS\n" " antal kolumner i wrappade format\n" -#: help.c:486 -#, c-format +#: help.c:526 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3888,8 +3715,7 @@ msgstr "" " PGAPPNAME\n" " samma som anslutningsparametern \"application_name\"\n" -#: help.c:488 -#, c-format +#: help.c:528 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3897,8 +3723,7 @@ msgstr "" " PGDATABASE\n" " samma som anslutningsparametern \"dbname\"\n" -#: help.c:490 -#, c-format +#: help.c:530 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3906,8 +3731,7 @@ msgstr "" " PGHOST\n" " samma som anslutningsparametern \"host\"\n" -#: help.c:492 -#, c-format +#: help.c:532 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3915,8 +3739,7 @@ msgstr "" " PGPASSFILE\n" " lösenordsfilnamn\n" -#: help.c:494 -#, c-format +#: help.c:534 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3924,8 +3747,7 @@ msgstr "" " PGPASSWORD\n" " uppkoppingens lösenord (rekommenderas inte)\n" -#: help.c:496 -#, c-format +#: help.c:536 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3933,8 +3755,7 @@ msgstr "" " PGPORT\n" " samma som anslutingsparametern \"port\"\n" -#: help.c:498 -#, c-format +#: help.c:538 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3942,8 +3763,7 @@ msgstr "" " PGUSER\n" " samma som anslutningsparametern \"user\"\n" -#: help.c:500 -#, c-format +#: help.c:540 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3951,8 +3771,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " redigerare som används av kommanona \\e, \\ef och \\ev\n" -#: help.c:502 -#, c-format +#: help.c:542 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3960,8 +3779,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " hur radnummer anges när redigerare startas\n" -#: help.c:504 -#, c-format +#: help.c:544 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3969,8 +3787,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativ plats för kommandohistorikfilen\n" -#: help.c:506 -#, c-format +#: help.c:546 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3978,8 +3795,15 @@ msgstr "" " PAGER\n" " namnet på den externa pageneraren\n" -#: help.c:508 -#, c-format +#: help.c:549 +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:552 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3987,8 +3811,7 @@ msgstr "" " PSQLRC\n" " alternativ plats för användarens \".psqlrc\"-fil\n" -#: help.c:510 -#, c-format +#: help.c:554 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3996,8 +3819,7 @@ msgstr "" " SHELL\n" " skalet som används av kommandot \\!\n" -#: help.c:512 -#, c-format +#: help.c:556 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4005,11 +3827,11 @@ msgstr "" " TMPDIR\n" " katalog för temporärfiler\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Tillgänglig hjälp:\n" -#: help.c:652 +#: help.c:711 #, c-format msgid "" "Command: %s\n" @@ -4028,7 +3850,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:675 +#: help.c:734 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4042,12 +3864,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" @@ -4067,25 +3889,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" @@ -4093,19 +3907,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" @@ -4120,24 +3934,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" @@ -4154,2315 +3968,2425 @@ 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "namn" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "arg_typ" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "flaggor" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "där flaggor kan vara:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "tillåtansl" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "anslutningstak" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "ärmall" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "nytt_tabellutrymme" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 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:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "rollnamn" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "villkorsnamn" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "nyy_villkorsnamn" -#: sql_help.c:317 sql_help.c:1082 +#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "objektnamn" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "aggregatnamn" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "källtyp" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "måltyp" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "funktionsnamn" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "operatornamn" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "vänster_typ" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "höger_typ" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "indexmetod" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "procedurnamn" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "rutinnamn" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "typnamn" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 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:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "hanterarfunktion" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "valideringsfunktion" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "kolumnnamn" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: 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:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "datatyp" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "jämförelse" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "kolumnvillkor" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "heltal" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 msgid "table_constraint" msgstr "tabellvillkor" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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" +msgstr "triggernamn" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "föräldertabell" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "utökningsnamn" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "körkostnad" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "resultatrader" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "supportfunktion" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "rollspecifikation" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "användarnamn" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "där rollspecifikation kan vara:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "gruppnamn" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "tabellutrymmesnamn" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "lagringsparameter" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "kolumnnummer" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "stort_objekt_oid" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "komprimeringsmetod" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "ny_accessmetod" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "strateginummer" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "op_typ" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "sorteringsfamiljnamn" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "supportnummer" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "argumenttyp" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "tabellnamn" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "using-uttryck" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "check-uttryck" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "publiceringsobject" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "publiceringsparameter" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +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:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "lösenord" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "tidsstämpel" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "databasnamn" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "ökningsvärde" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "minvärde" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "maxvärde" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "start" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "starta om" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "cache" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "nytt_mål" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "anslinfo" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "publiceringsnamn" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "publicerings_alternativ" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "refresh_alternativ" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "prenumerationsparameter" -#: sql_help.c:1298 sql_help.c:1301 +#: 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:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "partitionsgränsspec" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "sekvensalternativ" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "sekvensalternativ" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "tabellvillkor_för_index" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: 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:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "och partitionsgränsspec är:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "partitionsgränsuttryck" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "numerisk_literal" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "och kolumnvillkor är:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "default_uttryck" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "generatoruttryck" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "indexparametrar" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "reftabell" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "refkolumn" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "referentiell_aktion" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "och tabellvillkor är:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "uteslutelement" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "operator" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "predikat" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "och tabellvillkor_för_index är:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "indexparametrar i UNIQUE-, PRIMARY KEY- och EXCLUDE-villkor är:" -#: sql_help.c:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "uteslutelement i ett EXCLUDE-villkort är:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "op-klass" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +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:3013 msgid "tablespace_option" msgstr "tabellutrymmesalternativ" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "symboltyp" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "ordlistnamn" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "gammal_ordlista" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "ny_ordlista" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "attributnamn" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "nytt_attributnamn" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "nytt_enumvärde" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "närliggande_enumvärde" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "existerande_enumvärde" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "egenskap" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "servernamn" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "visningsalternativnamn" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "visningsalternativvärde" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "tabell_och_kolumner" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "där flaggor kan vara en av:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "boolean" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "och tabell_och_kolumner är:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "transaktionsläge" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "där transaktionsläge är en av:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "argument" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "relationsnamn" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "domännamn" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "policynamn" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "regelnamn" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "sträng_literal" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "transaktions-id" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "filnamn" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "kommando" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "villkor" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "fråga" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "formatnamn" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "avdelartecken" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "null-sträng" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "citattecken" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "escape-tecken" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "kodningsnamn" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "accessmetodtyp" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "arg_datatyp" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "tillståndsdatatyp" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "tillståndsdatastorlek" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "kombinerafunk" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "serialiseringsfunk" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "deserialiseringsfunk" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "startvärde" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "msfunk" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "minvfunk" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "mtillståndsdatatyp" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "ntillståndsstorlek" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "mffunk" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "mstartvärde" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "sorteringsoperator" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "eller gamla syntaxen" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "bastyp" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "lokal" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "leverantör" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "version" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "existerande_jämförelse" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "källkodning" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "målkodning" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "mall" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "kodning" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "strategi" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_lokal" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "lokal_leverantör" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "jämförelse_version" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "villkor" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "där villkor är:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "händelse" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "filtervariabel" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "filtervärde" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "där kolumnvillkor är:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "rettyp" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "kolumntyp" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "definition" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "obj-fil" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "linksymbol" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "sql-kropp" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "metod" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "anropshanterare" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "inline-hanterare" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "val-funktion" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "com_op" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "familjenamn" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "lagringstyp" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "där händelse kan vara en av:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "schema-element" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "servertyp" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "serverversion" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "fdw-namn" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "statistiknamn" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "statistiksort" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "prenumerationsnamn" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "källtabell" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "like_alternativ" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "och likealternativ är:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "katalog" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "parsernamn" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "källkonfig" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "startfunktion" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "gettoken_funktion" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "slutfunktion" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "symboltypfunktion" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "rubrikfunktion" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "init_funktion" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "symboluppdelningsfunktion" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "från_sql_funktionsnamn" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "till_sql_funktionsnamn" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "refererat_tabellnamn" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "övergångsrelationsnamn" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "argument" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "etikett" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "subtyp" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "subtypoperatorklass" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "kanonisk_funktion" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "subtyp_diff_funktion" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "multirange_typnamn" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "inmatningsfunktion" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "utmatningsfunktion" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "mottagarfunktion" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "sändfunktion" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "typmodifiering_indatafunktion" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "typmodifiering_utdatafunktion" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "analysfunktion" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "arrayindexfunktion" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "internlängd" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "justering" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "lagring" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "liketyp" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "kategori" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "föredragen" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "standard" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "element" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "avskiljare" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "sorterbar" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "with_fråga" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "alias" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "frånval" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "markörnamn" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "utdatauttryck" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "utdatanamn" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "kod" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "parameter" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "sats" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "riktning" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "där riktning kan vara en av:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "antal" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "sekvensnamn" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "arg_namn" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "arg_typ" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "loid" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "externt_schema" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "lokalt_schema" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "konfliktmål" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "konfliktaktion" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "där konfliktmål kan vara en av:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "indexkolumnnamn" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "indexuttryck" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "indexpredikat" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "och konfliktaktion är en av:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "kanal" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "låsläge" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "där låsläge är en av:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "måltabellnamn" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "målalias" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "datakälla" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "join-villkor" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "when_sats" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "där datakälla är:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "källtabellnamn" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "källfråga" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "källalias" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "och when_sats är:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "och merge_insert är:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "och merge_update är:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "och merge_delete är:" + +#: sql_help.c:4132 msgid "payload" msgstr "innehåll" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "gammal_roll" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "ny_roll" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "sparpunktnamn" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "gruperingselement" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "fönsternamn" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "fönsterdefinition" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "select" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "där frånval kan vara en av:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "kolumnalias" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "samplingsmetod" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "frö" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "with_frågenamn" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "kolumndefinition" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "join-typ" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "join-villkor" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "join-kolumn" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "och grupperingselement kan vara en av:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "och with_fråga är:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "värden" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "insert" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "update" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "delete" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "söksekvens_kolumnnamn" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "cykelmarkering_kolumnnamn" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "cykelmarkering_värde" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "cykelmarkering_standard" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "cykelväg_kolumnnamn" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "ny_tabell" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "sorteringsuttryck" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "avbryt aktuell transaktion" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "ändra definitionen av en aggregatfunktion" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "ändra definitionen av en jämförelse" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "ändra definitionen av en konvertering" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "ändra en databas" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "definiera standardaccessrättigheter" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "ändra definitionen av en domän" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" -msgstr "ändra definitionen av en händelseutlösare" +msgstr "ändra definitionen av en händelsetrigger" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "ändra definitionen av en utökning" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "ändra definitionen av en främmande data-omvandlare" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "ändra definitionen av en främmande tabell" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "ändra definitionen av en funktion" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "ändra rollnamn eller medlemskap" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "ändra definitionen av ett index" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "ändra definitionen av ett procedur-språk" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "ändra definitionen av ett stort objekt" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "ändra definitionen av en materialiserad vy" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "ändra definitionen av en operator" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "ändra definitionen av en operatorklass" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "ändra definitionen av en operatorfamilj" -#: sql_help.c:5113 +#: sql_help.c:5248 msgid "change the definition of a row-level security policy" msgstr "ändra definitionen av en säkerhetspolicy på radnivå" -#: sql_help.c:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "ändra definitionen av en procedur" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "ändra definitionen av en publicering" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "ändra databasroll" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "ändra definitionen av en rutin" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "ändra definitionen av en regel" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "ändra definitionen av ett schema" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "ändra definitionen av en sekvensgenerator" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "ändra definitionen av en främmande server" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "ändra definitionen av ett utökat statistikobjekt" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "ändra definitionen av en prenumerering" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "ändra en servers konfigurationsparameter" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "ändra definitionen av en tabell" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "ändra definitionen av ett tabellutrymme" -#: sql_help.c:5197 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" msgstr "ändra definitionen av en textsökkonfiguration" -#: sql_help.c:5203 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" msgstr "ändra definitionen av en textsökordlista" -#: sql_help.c:5209 +#: sql_help.c:5344 msgid "change the definition of a text search parser" msgstr "ändra definitionen av en textsökparser" -#: sql_help.c:5215 +#: sql_help.c:5350 msgid "change the definition of a text search template" msgstr "ändra definitionen av en textsökmall" -#: sql_help.c:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" -msgstr "ändra definitionen av en utlösare" +msgstr "ändra definitionen av en trigger" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "ändra definitionen av en typ" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "ändra definitionen av en användarmappning" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "ändra definitionen av en vy" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "samla in statistik om en databas" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "starta ett transaktionsblock" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "anropa en procedur" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "tvinga checkpoint i transaktionsloggen" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "stäng en markör" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "klustra en tabell efter ett index" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "definiera eller ändra en kommentar på ett objekt" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "utför den aktuella transaktionen" -#: sql_help.c:5299 +#: sql_help.c:5434 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:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "kopiera data mellan en fil och en tabell" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "definiera en ny accessmetod" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "definiera en ny aggregatfunktion" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "definiera en ny typomvandling" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "definiera en ny jämförelse" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "definiera en ny teckenkodningskonvertering" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "skapa en ny databas" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "definiera en ny domän" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" -msgstr "definiera en ny händelseutlösare" +msgstr "definiera en ny händelsetrigger" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "installera en utökning" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "definiera en ny främmande data-omvandlare" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "definiera en ny främmande tabell" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "definiera en ny funktion" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "definiera en ny databasroll" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "skapa ett nytt index" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "definiera ett nytt procedur-språk" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "definiera en ny materialiserad vy" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "definiera en ny operator" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "definiera en ny operatorklass" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "definiera en ny operatorfamilj" -#: sql_help.c:5425 +#: sql_help.c:5560 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:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "definiera ett ny procedur" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "definiera en ny publicering" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "definiera en ny omskrivningsregel" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" msgstr "definiera ett nytt schema" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "definiera en ny sekvensgenerator" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "definiera en ny främmande server" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "definiera utökad statistik" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "definiera en ny prenumeration" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "definiera en ny tabell" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 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:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "definiera ett nytt tabellutrymme" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "definiera en ny textsökkonfiguration" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "definiera en ny textsökordlista" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "definiera en ny textsökparser" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "definiera en ny textsökmall" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "definiera en ny transform" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" -msgstr "definiera en ny utlösare" +msgstr "definiera en ny trigger" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "definiera en ny datatyp" -#: sql_help.c:5551 +#: sql_help.c:5686 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:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "definiera en ny vy" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "deallokera en förberedd sats" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "definiera en markör" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "radera rader i en tabell" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "släng sessionstillstånd" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "kör ett annonymt kodblock" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "ta bort en accessmetod" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "ta bort en aggregatfunktioner" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "ta bort en typomvandling" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "ta bort en jämförelse" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "ta bort en konvertering" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "ta bort en databas" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "ta bort en domän" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" -msgstr "ta bort en händelseutlösare" +msgstr "ta bort en händelsetrigger" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "ta bort en utökning" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "ta bort en frammande data-omvandlare" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "ta bort en främmande tabell" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "ta bort en funktion" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "ta bort en databasroll" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "ta bort ett index" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "ta bort ett procedur-språk" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "ta bort en materialiserad vy" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "ta bort en operator" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "ta bort en operatorklass" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "ta bort en operatorfamilj" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" msgstr "ta bort databasobjekt som ägs av databasroll" -#: sql_help.c:5713 +#: sql_help.c:5848 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:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "ta bort en procedur" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "ta bort en publicering" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "ta bort en rutin" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "ta bort en omskrivningsregel" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" msgstr "ta bort ett schema" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "ta bort en sekvens" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "ta bort en främmande server-deskriptor" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "ta bort utökad statistik" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "ta bort en prenumeration" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "ta bort en tabell" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "ta bort ett tabellutrymme" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "ta bort en textsökkonfiguration" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "ta bort en textsökordlista" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "ta bort en textsökparser" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "ta bort en textsökmall" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "ta bort en transform" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" -msgstr "ta bort en utlösare" +msgstr "ta bort en trigger" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "ta bort en datatyp" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "ta bort en användarmappning för en främmande server" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "ta bort en vy" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "utför en förberedd sats" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "visa körningsplanen för en sats" -#: sql_help.c:5869 +#: sql_help.c:6004 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:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "definera åtkomsträttigheter" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "importera tabelldefinitioner från en främmande server" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "skapa nya rader i en tabell" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "lyssna efter notifiering" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "ladda en delad biblioteksfil (shared library)" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "lås en tabell" -#: sql_help.c:5911 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "villkorlig insert, updare eller delete av rader i en tabell" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "flytta en markör" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "generera en notifiering" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "förbered en sats för körning" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "avbryt aktuell transaktion för två-fas-commit" -#: sql_help.c:5935 +#: sql_help.c:6076 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:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "ersätt innehållet av en materialiserad vy" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "återskapa index" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "ta bort en tidigare definierad sparpunkt" -#: sql_help.c:5959 +#: sql_help.c:6100 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:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "ta bort åtkomsträttigheter" -#: sql_help.c:5977 +#: sql_help.c:6118 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:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "rulla tillbaka till sparpunkt" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "definera en ny sparpunkt i den aktuella transaktionen" -#: sql_help.c:5995 +#: sql_help.c:6136 msgid "define or change a security label applied to an object" msgstr "definiera eller ändra en säkerhetsetikett på ett objekt" -#: sql_help.c:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "hämta rader från en tabell eller vy" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "ändra en körningsparameter" -#: sql_help.c:6019 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" msgstr "sätt integritetsvillkorstiming för nuvarande transaktion" -#: sql_help.c:6025 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" msgstr "sätt användare för den aktiva sessionen" -#: sql_help.c:6031 +#: sql_help.c:6172 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:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "sätt inställningar för nuvarande transaktionen" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "visa värde på en körningsparameter" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "töm en eller flera tabeller" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "sluta att lyssna efter notifiering" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "uppdatera rader i en tabell" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "skräpsamla och eventuellt analysera en databas" -#: sql_help.c:6085 +#: sql_help.c:6226 msgid "compute a set of rows" msgstr "beräkna en mängd rader" -#: startup.c:213 +#: 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:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: startup.c:438 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6471,27 +6395,27 @@ msgstr "" "Skriv \"help\" för hjälp.\n" "\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "kunde inte sätta utskriftsparameter \"%s\"" -#: startup.c:699 +#: startup.c:719 #, 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:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "extra kommandoradsargument \"%s\" ignorerad" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "kunde inte hitta det egna programmets körbara fil" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6525,3 +6449,31 @@ msgid "" msgstr "" "okänt värde \"%s\" för \"%s\"\n" "Tillgängliga värden är: %s." + +#, c-format +#~ msgid "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\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_unlink LOBOID operationer på stora objekt\n" + +#, c-format +#~ msgid "\\watch cannot be used with COPY" +#~ msgstr "\\watch kan inte användas med COPY" + +#~ msgid "match" +#~ msgstr "match" + +#~ msgid "text" +#~ msgstr "text" + +#~ msgid "timezone" +#~ msgstr "tidszon" + +#~ msgid "where direction can be empty or one of:" +#~ msgstr "där riktning kan vara tom eller en av:" diff --git a/third_party/spanner_pg/src/bin/psql/po/tr.po b/third_party/spanner_pg/src/bin/psql/po/tr.po deleted file mode 100644 index 0096ffb0..00000000 --- a/third_party/spanner_pg/src/bin/psql/po/tr.po +++ /dev/null @@ -1,8604 +0,0 @@ -# translation of psql-tr.po to Turkish -# Devrim GUNDUZ , 2004, 2005, 2006, 2007. -# Nicolai Tufar , 2004, 2005, 2006, 2007. -# Abdullah GÜLNER , 2017, 2018. -# -msgid "" -msgstr "" -"Project-Id-Version: psql-tr\n" -"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-17 21:43+0000\n" -"PO-Revision-Date: 2019-06-19 12:48+0300\n" -"Last-Translator: Abdullah Gülner <>\n" -"Language-Team: Turkish \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=0;\n" -"X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 1.8.7.1\n" -"X-Poedit-Basepath: /home/devrim/PostgreSQL/pgsql-cvs/pgsql\n" -"X-Poedit-Bookmarks: -1,-1,333,-1,-1,-1,-1,-1,-1,-1\n" - -#: ../../../src/common/logging.c:188 -#, c-format -msgid "fatal: " -msgstr "ölümcül (fatal): " - -#: ../../../src/common/logging.c:195 -#, c-format -msgid "error: " -msgstr "hata (error): " - -#: ../../../src/common/logging.c:202 -#, c-format -msgid "warning: " -msgstr "uyarı: " - -#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301 -#, c-format -msgid "could not identify current directory: %m" -msgstr "geçerli dizin tespit edilemedi: %m" - -#: ../../common/exec.c:157 -#, c-format -msgid "invalid binary \"%s\"" -msgstr "geçersiz ikili (binary) \"%s\"" - -#: ../../common/exec.c:207 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ikili (binary) dosyası okunamadı" - -#: ../../common/exec.c:215 -#, c-format -msgid "could not find a \"%s\" to execute" -msgstr "çalıştırılacak \"%s\" bulunamadı" - -#: ../../common/exec.c:271 ../../common/exec.c:310 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m" - -#: ../../common/exec.c:288 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "symbolic link \"%s\" okuma hatası: %m" - -#: ../../common/exec.c:541 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose başarısız oldu: %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 -#, c-format -msgid "out of memory" -msgstr "yetersiz bellek" - -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 -#, c-format -msgid "out of memory\n" -msgstr "yetersiz bellek\n" - -#: ../../common/fe_memutils.c:92 -#, c-format -msgid "cannot duplicate null pointer (internal error)\n" -msgstr "null pointer duplicate edilemiyor (iç hata)\n" - -#: ../../common/username.c:43 -#, c-format -msgid "could not look up effective user ID %ld: %s" -msgstr "geçerli kullanıcı ID si bulunamadı %ld: %s" - -#: ../../common/username.c:45 command.c:555 -msgid "user does not exist" -msgstr "kullanıcı mevcut değil" - -#: ../../common/username.c:60 -#, c-format -msgid "user name lookup failure: error code %lu" -msgstr "kullanıcı adı arama başarısız: hata kodu %lu" - -#: ../../common/wait_error.c:45 -#, c-format -msgid "command not executable" -msgstr "komut çalıştırılabilir değil" - -#: ../../common/wait_error.c:49 -#, c-format -msgid "command not found" -msgstr "komut bulunamadı" - -#: ../../common/wait_error.c:54 -#, c-format -msgid "child process exited with exit code %d" -msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır" - -#: ../../common/wait_error.c:62 -#, c-format -msgid "child process was terminated by exception 0x%X" -msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır" - -#: ../../common/wait_error.c:66 -#, c-format -msgid "child process was terminated by signal %d: %s" -msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır: %s" - -#: ../../common/wait_error.c:72 -#, c-format -msgid "child process exited with unrecognized status %d" -msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır" - -#: ../../fe_utils/print.c:353 -#, c-format -msgid "(%lu row)" -msgid_plural "(%lu rows)" -msgstr[0] "(%lu satır)" -msgstr[1] "(%lu satır)" - -#: ../../fe_utils/print.c:3058 -#, c-format -msgid "Interrupted\n" -msgstr "kesildi\n" - -#: ../../fe_utils/print.c:3122 -#, c-format -msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "Başlık tablo içeriğine eklenemedi: %d kolon sayısı aşıldı.\n" - -#: ../../fe_utils/print.c:3162 -#, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Hücre tablo içeriğine eklenemedi: %d olan toplam hücre sayısı aşıldı.\n" - -#: ../../fe_utils/print.c:3417 -#, c-format -msgid "invalid output format (internal error): %d" -msgstr "geçersiz çıktı biçimi (iç hata): %d" - -#: ../../fe_utils/psqlscan.l:729 -#, c-format -msgid "skipping recursive expansion of variable \"%s\"" -msgstr "\"%s\" değişkeninin özyinelemeli genişlemesi (recursive expansion) atlanıyor" - -#: command.c:221 -#, c-format -msgid "invalid command \\%s" -msgstr "geçersiz komut \\%s" - -#: command.c:223 -#, c-format -msgid "Try \\? for help." -msgstr "Yardım için \\? yazınız." - -#: command.c:241 -#, c-format -msgid "\\%s: extra argument \"%s\" ignored" -msgstr "\\%s: \"%s\" parametresi fazla, yok sayıldı" - -#: command.c:293 -#, c-format -msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" -msgstr "\\%s komut yok sayıldı; güncel \\if blokundan çıkmak için \\endif veya Ctrl-C kullanınız" - -#: command.c:553 -#, c-format -msgid "could not get home directory for user ID %ld: %s" -msgstr "%ld kullanıcı ID'si için home dizinine ulaşılamadı: %s" - -#: command.c:571 -#, c-format -msgid "\\%s: could not change directory to \"%s\": %m" -msgstr "\\%s: \"%s\" dizinine geçiş yapılamadı: %m" - -#: command.c:596 -#, c-format -msgid "You are currently not connected to a database.\n" -msgstr "Şu anda bir veritabanına bağlı değilsiniz.\n" - -#: command.c:609 -#, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" -msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" adresi üzrerinden \"%s\" portundan bağlandınız.\n" - -#: command.c:612 -#, c-format -msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" içindeki soket ile \"%s\" portundan bağlandınız.\n" - -#: command.c:618 -#, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" -msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" sunucusu (\"%s\" adresi) üzerinden \"%s\" portundan bağlandınız.\n" - -#: command.c:621 -#, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" sunucusu üzerinden \"%s\" portundan bağlandınız.\n" - -#: command.c:930 command.c:1026 command.c:2411 -#, c-format -msgid "no query buffer" -msgstr "sorgu tamponu mevcut değil" - -#: command.c:963 command.c:4824 -#, c-format -msgid "invalid line number: %s" -msgstr "geçersiz satır numarası: %s" - -#: command.c:1017 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Sunucu (%s sürümü) fonksiyon kaynak kodunu düzenlemeyi (edit) desteklememektedir." - -#: command.c:1020 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Sunucu (%s sürümü) görünüm tanımlarını düzenlemeyi (edit) desteklememektedir." - -#: command.c:1102 -msgid "No changes" -msgstr "Değişiklik yok" - -#: command.c:1179 -#, c-format -msgid "%s: invalid encoding name or conversion procedure not found" -msgstr "%s: dil kodlama adı geçersiz ya da dönüştürme fonksiyonu bulunamadı" - -#: command.c:1214 command.c:1853 command.c:3109 command.c:4926 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 -#, c-format -msgid "%s" -msgstr "%s" - -#: command.c:1221 -msgid "There is no previous error." -msgstr "Önceden kalan hata bulunmuyor." - -#: command.c:1409 command.c:1714 command.c:1728 command.c:1745 command.c:1905 -#: command.c:2142 command.c:2378 command.c:2418 -#, c-format -msgid "\\%s: missing required argument" -msgstr "\\%s: zorunlu argüman eksik" - -#: command.c:1540 -#, c-format -msgid "\\elif: cannot occur after \\else" -msgstr "\\elif: \\else den sonra gelemez" - -#: command.c:1545 -#, c-format -msgid "\\elif: no matching \\if" -msgstr "\\elif: eşleşen \\if bulunmuyor" - -#: command.c:1609 -#, fuzzy, c-format -#| msgid "\\else: cannot occur after \\else\n" -msgid "\\else: cannot occur after \\else" -msgstr "\\else: \\else den sonra gelemez\n" - -#: command.c:1614 -#, fuzzy, c-format -#| msgid "\\else: no matching \\if\n" -msgid "\\else: no matching \\if" -msgstr "\\else: eşleşen \\if bulunmuyor\n" - -#: command.c:1654 -#, fuzzy, c-format -#| msgid "\\endif: no matching \\if\n" -msgid "\\endif: no matching \\if" -msgstr "\\endif: eşleşen \\if bulunmuyor\n" - -#: command.c:1809 -msgid "Query buffer is empty." -msgstr "Sorgu tamponu boş." - -#: command.c:1831 -msgid "Enter new password: " -msgstr "Yeni parola girin:" - -#: command.c:1832 -msgid "Enter it again: " -msgstr "Yeniden girin:" - -#: command.c:1836 -#, fuzzy, c-format -#| msgid "Passwords didn't match.\n" -msgid "Passwords didn't match." -msgstr "Parolalar uyuşmıyor.\n" - -#: command.c:1935 -#, fuzzy, c-format -#| msgid "\\%s: could not read value for variable\n" -msgid "\\%s: could not read value for variable" -msgstr "\\%s: değişken için değer okunamadı\n" - -#: command.c:2038 -msgid "Query buffer reset (cleared)." -msgstr "Sorgu tamponu sıfırlanmış." - -#: command.c:2060 -#, c-format -msgid "Wrote history to file \"%s\".\n" -msgstr "Geçmiş (history), \"%s\" dosyasına yazıldı.\n" - -#: command.c:2147 -#, fuzzy, c-format -#| msgid "\\%s: environment variable name must not contain \"=\"\n" -msgid "\\%s: environment variable name must not contain \"=\"" -msgstr "\\%s: ortam değişkeni \"=\" içermemelidir\n" - -#: command.c:2208 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support showing function source.\n" -msgid "The server (version %s) does not support showing function source." -msgstr "Sunucu (%s sürümü) fonksiyon kaynağını görüntülemeyi desteklemiyor.\n" - -#: command.c:2211 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support showing view definitions.\n" -msgid "The server (version %s) does not support showing view definitions." -msgstr "Sunucu (%s sürümü) görünüm (view) tanımlarını göstermeyi desteklememektedir.\n" - -#: command.c:2218 -#, fuzzy, c-format -#| msgid "function name is required\n" -msgid "function name is required" -msgstr "fonksiyon adı gerekli\n" - -#: command.c:2220 -#, fuzzy, c-format -#| msgid "view name is required\n" -msgid "view name is required" -msgstr "görünüm (view) adı gerekli\n" - -#: command.c:2350 -msgid "Timing is on." -msgstr "Zamanlama açık." - -#: command.c:2352 -msgid "Timing is off." -msgstr "Zamanlama kapalı." - -#: command.c:2437 command.c:2465 command.c:3508 command.c:3511 command.c:3514 -#: command.c:3520 command.c:3522 command.c:3530 command.c:3540 command.c:3549 -#: command.c:3563 command.c:3580 command.c:3638 common.c:71 copy.c:333 -#: copy.c:405 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 -#, fuzzy, c-format -#| msgid "%s: %s" -msgid "%s: %m" -msgstr "%s: %s" - -#: command.c:2849 startup.c:240 startup.c:291 -msgid "Password: " -msgstr "Parola: " - -#: command.c:2854 startup.c:288 -#, c-format -msgid "Password for user %s: " -msgstr "%s kullanıcısının parolası: " - -#: command.c:2925 -#, fuzzy, c-format -#| msgid "All connection parameters must be supplied because no database connection exists\n" -msgid "All connection parameters must be supplied because no database connection exists" -msgstr "Bütün bağlantı parametreleri sağlanmalı çünkü hiçbir veritabanı bağlantısı bulunmuyor\n" - -#: command.c:3113 -#, fuzzy, c-format -#| msgid "Previous connection kept\n" -msgid "Previous connection kept" -msgstr "Önceki bağlantı kullanılacaktır\n" - -#: command.c:3117 -#, c-format -msgid "\\connect: %s" -msgstr "\\connect: %s" - -#: command.c:3159 -#, fuzzy, c-format -#| msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" -msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n" - -#: command.c:3162 -#, c-format -msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" içindeki soket ile \"%s\" port'undan bağlısınız.\n" - -#: command.c:3168 -#, fuzzy, c-format -#| msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" -msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n" - -#: command.c:3171 -#, c-format -msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n" - -#: command.c:3176 -#, c-format -msgid "You are now connected to database \"%s\" as user \"%s\".\n" -msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile bağlısınız.\n" - -#: command.c:3209 -#, c-format -msgid "%s (%s, server %s)\n" -msgstr "%s (%s, sunucu %s)\n" - -#: command.c:3217 -#, c-format -msgid "" -"WARNING: %s major version %s, server major version %s.\n" -" Some psql features might not work.\n" -msgstr "" -"UYARI: %s ana sürümü %s, sunucu ana sürümü %s.\n" -" Bazı psql özellikleri çalışmayabilir.\n" - -#: command.c:3255 -#, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL bağlantısı (protokol:%s, cipher: %s, bit sayısı: %s, sıkıştırma: %s)\n" - -#: command.c:3256 command.c:3257 command.c:3258 -msgid "unknown" -msgstr "bilinmeyen" - -#: command.c:3259 help.c:46 -msgid "off" -msgstr "kapalı" - -#: command.c:3259 help.c:46 -msgid "on" -msgstr "açık" - -#: command.c:3273 -#, c-format -msgid "GSSAPI Encrypted connection\n" -msgstr "" - -#: command.c:3293 -#, 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" -" page \"Notes for Windows users\" for details.\n" -msgstr "" -"UYARI: Uçbirimin kod sayfası (%u), Windows kod sayfasından (%u) farklıdır\n" -" 8-bitlik karakterler doğru çalışmayabilir. Ayrıntılar için psql referans\n" -" belgelerinde \"Windows kullanıcılarına notlar\" bölümüne bakın.\n" - -#: command.c:3397 -#, fuzzy, c-format -#| msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n" -msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" -msgstr "bir satır numarası belirtmek için PSQL_EDITOR_LINENUMBER_ARG çevresel değişkenini ayarlamanız gereklidir\n" - -#: command.c:3426 -#, fuzzy, c-format -#| msgid "could not start editor \"%s\"\n" -msgid "could not start editor \"%s\"" -msgstr "\"%s\" metin düzenleyicisi çalıştırılamadı\n" - -#: command.c:3428 -#, fuzzy, c-format -#| msgid "could not start /bin/sh\n" -msgid "could not start /bin/sh" -msgstr "/bin/sh başlatılamıyor\n" - -#: command.c:3466 -#, fuzzy, c-format -#| msgid "could not locate temporary directory: %s\n" -msgid "could not locate temporary directory: %s" -msgstr "geçici dizin bulunamıyor: %s\n" - -#: command.c:3493 -#, c-format -msgid "could not open temporary file \"%s\": %m" -msgstr "\"%s\" geçici dosya açılamıyor: %m" - -#: command.c:3786 -#, c-format -msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" -msgstr "" - -#: command.c:3806 -#, fuzzy, c-format -#| msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" -msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -msgstr "\\pset: izin verilen biçimler: unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" - -#: command.c:3825 -#, fuzzy, c-format -#| msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n" -msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" -msgstr "\\pset: izin verilen çizgi biçimleri: ascii, old-ascii, unicode\n" - -#: command.c:3840 -#, fuzzy, c-format -#| msgid "\\pset: allowed Unicode border line styles are single, double\n" -msgid "\\pset: allowed Unicode border line styles are single, double" -msgstr "\\pset: izin verilen Unicode kenar çizgi biçimleri single, double\n" - -#: command.c:3855 -#, fuzzy, c-format -#| msgid "\\pset: allowed Unicode column line styles are single, double\n" -msgid "\\pset: allowed Unicode column line styles are single, double" -msgstr "\\pset: izin verilen Unicode sütun çizgi biçimleri: single, double\n" - -#: command.c:3870 -#, fuzzy, c-format -#| msgid "\\pset: allowed Unicode header line styles are single, double\n" -msgid "\\pset: allowed Unicode header line styles are single, double" -msgstr "\\pset: izin verilen Unicode üst bilgi çizgi biçimleri: single, double\n" - -#: command.c:3913 -#, fuzzy, c-format -#| msgid "COPY escape must be a single one-byte character" -msgid "\\pset: csv_fieldsep must be a single one-byte character" -msgstr "COPY escape bir baytlık tek bir karakter olmalıdır" - -#: command.c:3918 -#, fuzzy, c-format -#| msgid "COPY delimiter cannot be newline or carriage return" -msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" -msgstr "COPY ayıracı yeni satır ya da satırbaşı karakteri olamaz" - -#: command.c:4055 command.c:4241 -#, fuzzy, c-format -#| msgid "\\pset: unknown option: %s\n" -msgid "\\pset: unknown option: %s" -msgstr "\\pset: bilinmeyen seçenek: %s\n" - -#: command.c:4073 -#, c-format -msgid "Border style is %d.\n" -msgstr "Kenar stili: %d.\n" - -#: command.c:4079 -#, c-format -msgid "Target width is unset.\n" -msgstr "Hedef genişlik ayarı kaldırıldı.\n" - -#: command.c:4081 -#, c-format -msgid "Target width is %d.\n" -msgstr "Hedef genişlik %d.\n" - -#: command.c:4088 -#, c-format -msgid "Expanded display is on.\n" -msgstr "Geniş gösterme açık.\n" - -#: command.c:4090 -#, c-format -msgid "Expanded display is used automatically.\n" -msgstr "Geniş gösterme otomatik olarak kullanılıyor.\n" - -#: command.c:4092 -#, c-format -msgid "Expanded display is off.\n" -msgstr "Geniş gösterme kapalı.\n" - -#: command.c:4098 -#, fuzzy, c-format -#| msgid "Field separator is \"%s\".\n" -msgid "Field separator for CSV is \"%s\".\n" -msgstr "Alan ayıracı: \"%s\".\n" - -#: command.c:4106 command.c:4114 -#, c-format -msgid "Field separator is zero byte.\n" -msgstr "Alan ayıracı sıfır bayttır.\n" - -#: command.c:4108 -#, c-format -msgid "Field separator is \"%s\".\n" -msgstr "Alan ayıracı: \"%s\".\n" - -#: command.c:4121 -#, c-format -msgid "Default footer is on.\n" -msgstr "Varsayılan sayfa altbilgisi açık.\n" - -#: command.c:4123 -#, c-format -msgid "Default footer is off.\n" -msgstr "Varsayılan sayfa altbilgisi kapalı.\n" - -#: command.c:4129 -#, c-format -msgid "Output format is %s.\n" -msgstr "Çıktı formatı: %s.\n" - -#: command.c:4135 -#, c-format -msgid "Line style is %s.\n" -msgstr "Satır stili: %s.\n" - -#: command.c:4142 -#, c-format -msgid "Null display is \"%s\".\n" -msgstr "Null display is \"%s\".\n" - -#: command.c:4150 -#, c-format -msgid "Locale-adjusted numeric output is on.\n" -msgstr "Yerel duyarlı sayısal çıktı açık.\n" - -#: command.c:4152 -#, c-format -msgid "Locale-adjusted numeric output is off.\n" -msgstr "Yerel duyarlı sayısal çıktı kapalı.\n" - -#: command.c:4159 -#, c-format -msgid "Pager is used for long output.\n" -msgstr "Uzun çıktı için sayfalama kullanılacaktır.\n" - -#: command.c:4161 -#, c-format -msgid "Pager is always used.\n" -msgstr "Sayfalama her zaman kullanılacak.\n" - -#: command.c:4163 -#, c-format -msgid "Pager usage is off.\n" -msgstr "Sayfalama kullanımı kapalı.\n" - -#: command.c:4169 -#, 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 sayısından düşük satır için sayfalama kullanılmayacak.\n" -msgstr[1] "%d sayısından düşük satır için sayfalama kullanılmayacak.\n" - -#: command.c:4179 command.c:4189 -#, c-format -msgid "Record separator is zero byte.\n" -msgstr "Kayıt ayıracı sıfır bayt'tır.\n" - -#: command.c:4181 -#, c-format -msgid "Record separator is .\n" -msgstr "Kayıt ayıracı 'dır.\n" - -#: command.c:4183 -#, c-format -msgid "Record separator is \"%s\".\n" -msgstr "Kayıt ayıracı \"%s\".\n" - -#: command.c:4196 -#, c-format -msgid "Table attributes are \"%s\".\n" -msgstr "Tablo özellikleri: \"%s\".\n" - -#: command.c:4199 -#, c-format -msgid "Table attributes unset.\n" -msgstr "Tablo özellikleri kaldırıldı.\n" - -#: command.c:4206 -#, c-format -msgid "Title is \"%s\".\n" -msgstr "Başlık \"%s\".\n" - -#: command.c:4208 -#, c-format -msgid "Title is unset.\n" -msgstr "Başlık kaldırıldı\n" - -#: command.c:4215 -#, c-format -msgid "Tuples only is on.\n" -msgstr "Sadece kayıtları gösterme açık.\n" - -#: command.c:4217 -#, c-format -msgid "Tuples only is off.\n" -msgstr "Sadece kayıtları gösterme kapalı.\n" - -#: command.c:4223 -#, c-format -msgid "Unicode border line style is \"%s\".\n" -msgstr "Unicode kenar çizgi stili: \"%s\".\n" - -#: command.c:4229 -#, c-format -msgid "Unicode column line style is \"%s\".\n" -msgstr "Unicode sütun çizgi stili: \"%s\".\n" - -#: command.c:4235 -#, c-format -msgid "Unicode header line style is \"%s\".\n" -msgstr "Unicode sayfa üstbilgi çizgi stili: \"%s\".\n" - -#: command.c:4397 -#, fuzzy, c-format -#| msgid "\\!: failed\n" -msgid "\\!: failed" -msgstr "\\!: başarısız\n" - -#: command.c:4422 common.c:781 -#, fuzzy, c-format -#| msgid "\\watch cannot be used with an empty query\n" -msgid "\\watch cannot be used with an empty query" -msgstr "\\watch boş bir sorgu ile kullanılamaz\n" - -#: command.c:4463 -#, c-format -msgid "%s\t%s (every %gs)\n" -msgstr "%s\t%s (her %gs)\n" - -#: command.c:4466 -#, c-format -msgid "%s (every %gs)\n" -msgstr "%s (her %gs)\n" - -#: command.c:4520 command.c:4527 common.c:681 common.c:688 common.c:1345 -#, c-format -msgid "" -"********* QUERY **********\n" -"%s\n" -"**************************\n" -"\n" -msgstr "" -"********* SORGU **********\n" -"%s\n" -"**************************\n" -"\n" - -#: command.c:4719 -#, fuzzy, c-format -#| msgid "\"%s.%s\" is not a view\n" -msgid "\"%s.%s\" is not a view" -msgstr "\"%s.%s\" bir görünüm (view) değildir\n" - -#: command.c:4735 -#, c-format -msgid "could not parse reloptions array" -msgstr "reloptions dizisi (array) ayrıştırılamadı" - -#: common.c:160 -#, fuzzy, c-format -#| msgid "cannot escape without active connection\n" -msgid "cannot escape without active connection" -msgstr "aktif bağlantı olmadan vazgeçilemez (escape)\n" - -#: common.c:201 -#, fuzzy, c-format -#| msgid "shell command argument contains a newline or carriage return: \"%s\"\n" -msgid "shell command argument contains a newline or carriage return: \"%s\"" -msgstr "kabuk komut argümanı yeni satır ya da satırbaşı karakteri içeriyor: \"%s\"\n" - -#: common.c:395 -#, fuzzy, c-format -#| msgid "connection to server was lost\n" -msgid "connection to server was lost" -msgstr "sunucuya bağlantı kesildi\n" - -#: common.c:399 -#, c-format -msgid "The connection to the server was lost. Attempting reset: " -msgstr "Sunucuya bağlantı kesildi. Yeniden bağlantı deneniyor:" - -#: common.c:404 -#, c-format -msgid "Failed.\n" -msgstr "Başarısız.\n" - -#: common.c:411 -#, c-format -msgid "Succeeded.\n" -msgstr "Başarılı.\n" - -#: common.c:511 common.c:1063 common.c:1280 -#, fuzzy, c-format -#| msgid "unexpected PQresultStatus: %d\n" -msgid "unexpected PQresultStatus: %d" -msgstr "beklenmeyen PQresultStatus: %d\n" - -#: common.c:620 -#, c-format -msgid "Time: %.3f ms\n" -msgstr "Süre: %.3f milisaniye\n" - -#: common.c:635 -#, c-format -msgid "Time: %.3f ms (%02d:%06.3f)\n" -msgstr "Süre: %.3f ms (%02d:%06.3f)\n" - -#: common.c:644 -#, c-format -msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" -msgstr "Süre: %.3f ms (%02d:%02d:%06.3f)\n" - -#: common.c:651 -#, c-format -msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -msgstr "Süre: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" - -#: common.c:675 common.c:733 common.c:1316 -#, fuzzy, c-format -#| msgid "You are currently not connected to a database.\n" -msgid "You are currently not connected to a database." -msgstr "Şu anda bir veritabanına bağlı değilsiniz.\n" - -#: common.c:788 -#, fuzzy, c-format -#| msgid "\\watch cannot be used with COPY\n" -msgid "\\watch cannot be used with COPY" -msgstr "\\watch COPY ile birlikte kullanılamaz\n" - -#: common.c:793 -#, fuzzy, c-format -#| msgid "unexpected result status for \\watch\n" -msgid "unexpected result status for \\watch" -msgstr "\\watch için beklenmedik sonuç durumu\n" - -#: common.c:823 -#, c-format -msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" -msgstr "PID %3$d olan sunucu sürecinden \"%2$s\" payload'lı \"%1$s\" asenkon bildiri alınmış.\n" - -#: common.c:826 -#, c-format -msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" -msgstr "PID %2$d olan sunucu sürecinden \"%1$s\" asenkon bildiri alınmış.\n" - -#: common.c:889 -#, fuzzy, c-format -#| msgid "no rows returned for \\gset\n" -msgid "no rows returned for \\gset" -msgstr "\\gset için hiç bir satır dönmedi\n" - -#: common.c:894 -#, fuzzy, c-format -#| msgid "more than one row returned for \\gset\n" -msgid "more than one row returned for \\gset" -msgstr "\\gset için birden fazla satır döndü\n" - -#: common.c:1325 -#, c-format -msgid "" -"***(Single step mode: verify command)*******************************************\n" -"%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" -msgstr "" -"***(Tek adım modu: verify command)*******************************************\n" -"%s\n" -"***(devam etmek için return, durdurmak için x ve return'e basınız)********************\n" - -#: common.c:1380 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n" -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "Sunucu (%s sürümü) ON_ERROR_ROLLBACK için savepointleri desteklememektedir.\n" - -#: common.c:1443 -#, fuzzy, c-format -#| msgid "STATEMENT: %s\n" -msgid "STATEMENT: %s" -msgstr "KOMUT: %s\n" - -#: common.c:1486 -#, fuzzy, c-format -#| msgid "unexpected transaction status (%d)\n" -msgid "unexpected transaction status (%d)" -msgstr "beklenmeyen işlem (transaction) durumu (%d)\n" - -#: common.c:1623 describe.c:2002 -msgid "Column" -msgstr "Kolon" - -#: 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 -msgid "Type" -msgstr "Veri tipi" - -#: common.c:1673 -#, c-format -msgid "The command has no result, or the result has no columns.\n" -msgstr "Komut sonulç döndürmedi, veya sonuçta hiç sütun yok.\n" - -#: copy.c:100 -#, fuzzy, c-format -#| msgid "\\copy: arguments required\n" -msgid "\\copy: arguments required" -msgstr "\\copy: parametre eksik\n" - -#: copy.c:255 -#, fuzzy, c-format -#| msgid "\\copy: parse error at \"%s\"\n" -msgid "\\copy: parse error at \"%s\"" -msgstr "\\copy: \"%s\" ifadesinde ayrıştırma hatası\n" - -#: copy.c:257 -#, fuzzy, c-format -#| msgid "\\copy: parse error at end of line\n" -msgid "\\copy: parse error at end of line" -msgstr "\\copy: satır sonunda ayrıştırma hatası\n" - -#: copy.c:330 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "\"%s\" komutu yürütülemedi: %m" - -#: copy.c:346 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "\"%s\" dosyası durumlanamadı: %m" - -#: copy.c:350 -#, fuzzy, c-format -#| msgid "%s: cannot copy from/to a directory\n" -msgid "%s: cannot copy from/to a directory" -msgstr "%s: dizinden ya da dizine kopyalanamıyor\n" - -#: copy.c:387 -#, c-format -msgid "could not close pipe to external command: %m" -msgstr "dış komuta doğru olan pipe kapatılamadı: %m" - -#: copy.c:392 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:455 copy.c:465 -#, fuzzy, c-format -#| msgid "could not write COPY data: %s\n" -msgid "could not write COPY data: %m" -msgstr "COPY verisi yazılamadı: %s\n" - -#: copy.c:471 -#, c-format -msgid "COPY data transfer failed: %s" -msgstr "COPY veri aktarımı başarısız: %s" - -#: copy.c:532 -msgid "canceled by user" -msgstr "kullanıcı tarafından iptal edildi" - -#: copy.c:543 -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." -msgstr "" -"Kopyalanacak veriyi girin ve ardından enter'a basın.\n" -"Sonuçlandırmak için yeni satırda ters taksim işareti ve nokta veya bir EOF işareti girin." - -#: copy.c:671 -msgid "aborted because of read failure" -msgstr "okuma hatası nedeniyle kesildi" - -#: copy.c:705 -msgid "trying to exit copy mode" -msgstr "copy modundan çıkmaya çalışıyor" - -#: crosstabview.c:124 -#, fuzzy, c-format -#| msgid "\\crosstabview: statement did not return a result set\n" -msgid "\\crosstabview: statement did not return a result set" -msgstr "\\crosstabview: komut bir sonuç kümesi döndürmedi\n" - -#: crosstabview.c:130 -#, fuzzy, c-format -#| msgid "\\crosstabview: query must return at least three columns\n" -msgid "\\crosstabview: query must return at least three columns" -msgstr "\\crosstabview: sorgu en az üç sütun döndürmelidir\n" - -#: crosstabview.c:157 -#, fuzzy, c-format -#| msgid "\\crosstabview: vertical and horizontal headers must be different columns\n" -msgid "\\crosstabview: vertical and horizontal headers must be different columns" -msgstr "\\crostabview: dikey ve yatayda üstbilgiler farklı sütunlar olmalıdır\n" - -#: crosstabview.c:173 -#, fuzzy, c-format -#| msgid "\\crosstabview: data column must be specified when query returns more than three columns\n" -msgid "\\crosstabview: data column must be specified when query returns more than three columns" -msgstr "\\crosstabview: sorgu üçten fazla sütun döndürüyorsa veri sütunu belirtilmelidir\n" - -#: crosstabview.c:229 -#, fuzzy, c-format -#| msgid "\\crosstabview: maximum number of columns (%d) exceeded\n" -msgid "\\crosstabview: maximum number of columns (%d) exceeded" -msgstr "\\crosstabview: azami sütun sayısı (%d) aşılmıştır\n" - -#: crosstabview.c:398 -#, fuzzy, c-format -#| msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n" -msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" -msgstr "\\crosstabview: sorgu sonucu \"%s\" satırı, \"%s\" sütunu için çoklu veri değerleri içermektedir\n" - -#: crosstabview.c:646 -#, fuzzy, c-format -#| msgid "\\crosstabview: column number %d is out of range 1..%d\n" -msgid "\\crosstabview: column number %d is out of range 1..%d" -msgstr "\\crosstabview: %d sütun numarası, 1..%d aralığının dışında\n" - -#: crosstabview.c:671 -#, fuzzy, c-format -#| msgid "\\crosstabview: ambiguous column name: \"%s\"\n" -msgid "\\crosstabview: ambiguous column name: \"%s\"" -msgstr "\\crosstabview: belirsiz sütun adı: \"%s\"\n" - -#: crosstabview.c:679 -#, fuzzy, c-format -#| msgid "\\crosstabview: column name not found: \"%s\"\n" -msgid "\\crosstabview: column name not found: \"%s\"" -msgstr "\\crosstabview: sütun adı bulunamadı: \"%s\"\n" - -#: 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 -msgid "Schema" -msgstr "Şema" - -#: 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 -msgid "Name" -msgstr "Adı" - -#: describe.c:79 describe.c:387 describe.c:405 describe.c:451 describe.c:468 -msgid "Result data type" -msgstr "Sonuç veri tipi" - -#: describe.c:87 describe.c:100 describe.c:104 describe.c:388 describe.c:406 -#: describe.c:452 describe.c:469 -msgid "Argument data types" -msgstr "Argüman veri tipi" - -#: 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 -msgid "Description" -msgstr "Açıklama" - -#: describe.c:137 -msgid "List of aggregate functions" -msgstr "Aggregate fonksiyonların listesi" - -#: describe.c:162 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support access methods.\n" -msgid "The server (version %s) does not support access methods." -msgstr "Bu sunucu (%s sürümü) erişim yöntemlerini desteklememektedir.\n" - -#: describe.c:177 -msgid "Index" -msgstr "İndeks" - -#: describe.c:178 describe.c:3679 describe.c:3871 describe.c:5422 -msgid "Table" -msgstr "Tablo" - -#: describe.c:186 describe.c:5199 -msgid "Handler" -msgstr "İşleyici (handler)" - -#: describe.c:205 -msgid "List of access methods" -msgstr "Erişim yöntemlerinin listesi" - -#: describe.c:231 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support tablespaces.\n" -msgid "The server (version %s) does not support tablespaces." -msgstr "Sunucu (%s sürümü) tablespace'leri desteklememektedir.\n" - -#: 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 -msgid "Owner" -msgstr "Sahibi" - -#: describe.c:246 describe.c:254 -msgid "Location" -msgstr "Yer" - -#: describe.c:265 describe.c:3269 -msgid "Options" -msgstr "Seçenekler" - -#: describe.c:270 describe.c:691 describe.c:890 describe.c:3690 describe.c:3694 -msgid "Size" -msgstr "Boyut" - -#: describe.c:292 -msgid "List of tablespaces" -msgstr "Tablespace listesi" - -#: describe.c:334 -#, fuzzy, c-format -#| msgid "\\df only takes [anptwS+] as options\n" -msgid "\\df only takes [anptwS+] as options" -msgstr "\\df sadece [anptwS+] seçeneklerini alır\n" - -#: describe.c:342 describe.c:353 -#, fuzzy, c-format -#| msgid "\\df does not take a \"%c\" option with server version %s\n" -msgid "\\df does not take a \"%c\" option with server version %s" -msgstr "\\df \"%c\" seçeneğini %s sunucu sürümünde almaz\n" - -#. translator: "agg" is short for "aggregate" -#: describe.c:390 describe.c:408 describe.c:454 describe.c:471 -msgid "agg" -msgstr "agg" - -#: describe.c:391 describe.c:409 -msgid "window" -msgstr "pencere" - -#: describe.c:392 -msgid "proc" -msgstr "proc" - -#: describe.c:393 describe.c:411 describe.c:456 describe.c:473 -msgid "func" -msgstr "func" - -#: describe.c:410 describe.c:455 describe.c:472 describe.c:1325 -msgid "trigger" -msgstr "tetikleyici (trigger)" - -#: describe.c:484 -msgid "immutable" -msgstr "durağan" - -#: describe.c:485 -msgid "stable" -msgstr "kararlı" - -#: describe.c:486 -msgid "volatile" -msgstr "oynaklık" - -#: describe.c:487 -msgid "Volatility" -msgstr "Oynaklık" - -#: describe.c:495 -msgid "restricted" -msgstr "kısıtlı" - -#: describe.c:496 -msgid "safe" -msgstr "güvenli" - -#: describe.c:497 -msgid "unsafe" -msgstr "güvensiz" - -#: describe.c:498 -msgid "Parallel" -msgstr "Paralel" - -#: describe.c:503 -msgid "definer" -msgstr "tanımlayıcı" - -#: describe.c:504 -msgid "invoker" -msgstr "çağıran" - -#: describe.c:505 -msgid "Security" -msgstr "Güvenlik" - -#: describe.c:512 -msgid "Language" -msgstr "Dil" - -#: describe.c:513 -msgid "Source code" -msgstr "Kaynak kodu" - -#: describe.c:642 -msgid "List of functions" -msgstr "Fonksiyonların listesi" - -#: describe.c:690 -msgid "Internal name" -msgstr "Dahili adı" - -#: describe.c:712 -msgid "Elements" -msgstr "Elemanlar" - -#: describe.c:769 -msgid "List of data types" -msgstr "Veri tiplerinin listesi" - -#: describe.c:813 -msgid "Left arg type" -msgstr "Sol argüman veri tipi" - -#: describe.c:814 -msgid "Right arg type" -msgstr "Sağ argüman veri tipi" - -#: describe.c:815 -msgid "Result type" -msgstr "Sonuç veri tipi" - -#: describe.c:820 describe.c:4268 describe.c:4333 describe.c:4339 -#: describe.c:4749 -msgid "Function" -msgstr "Fonksiyon" - -#: describe.c:845 -msgid "List of operators" -msgstr "Operatörlerin listesi" - -#: describe.c:875 -msgid "Encoding" -msgstr "Dil Kodlaması" - -#: describe.c:880 describe.c:4449 -msgid "Collate" -msgstr "Sıralama(collate)" - -#: describe.c:881 describe.c:4450 -msgid "Ctype" -msgstr "Ctype" - -#: describe.c:894 -msgid "Tablespace" -msgstr "Tablespace" - -#: describe.c:916 -msgid "List of databases" -msgstr "Veritabanlarının listesi" - -#: describe.c:957 describe.c:1118 describe.c:3664 -msgid "table" -msgstr "tablo" - -#: describe.c:958 describe.c:3665 -msgid "view" -msgstr "view" - -#: describe.c:959 describe.c:3666 -msgid "materialized view" -msgstr "maddileştirilmiş görünüm(materialized view)" - -#: describe.c:960 describe.c:1120 describe.c:3668 -msgid "sequence" -msgstr "sequence" - -#: describe.c:961 describe.c:3670 -msgid "foreign table" -msgstr "uzak (foreign) tablosu" - -#: describe.c:962 describe.c:3671 describe.c:3856 -#, fuzzy -#| msgid "\"%s\" is a partitioned table" -msgid "partitioned table" -msgstr "\"%s\" bölümlenmiş bir tablodur" - -#: describe.c:974 -msgid "Column privileges" -msgstr "Sütun erişim hakları" - -#: describe.c:1005 describe.c:1039 -msgid "Policies" -msgstr "İlkeler" - -#: describe.c:1071 describe.c:5956 describe.c:5960 -msgid "Access privileges" -msgstr "Erişim hakları" - -#: describe.c:1102 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support altering default privileges.\n" -msgid "The server (version %s) does not support altering default privileges." -msgstr "Sunucu (%s sürümü) varsayılan (default) hakların değiştirilmesini desteklemiyor.\n" - -#: describe.c:1122 -msgid "function" -msgstr "fonksiyon" - -#: describe.c:1124 -msgid "type" -msgstr "tip" - -#: describe.c:1126 -msgid "schema" -msgstr "şema" - -#: describe.c:1150 -msgid "Default access privileges" -msgstr "Varsayılan erişim hakları" - -#: describe.c:1190 -msgid "Object" -msgstr "Nesne" - -#: describe.c:1204 -msgid "table constraint" -msgstr "tablo kısıtlaması (constraint)" - -#: describe.c:1226 -msgid "domain constraint" -msgstr "alan kısıtlaması (domain constraint)" - -#: describe.c:1254 -msgid "operator class" -msgstr "operatör sınıfı" - -#: describe.c:1283 -msgid "operator family" -msgstr "operatör ailesi" - -#: describe.c:1305 -msgid "rule" -msgstr "rule" - -#: describe.c:1347 -msgid "Object descriptions" -msgstr "Nesne açıklamaları" - -#: describe.c:1403 describe.c:3762 -#, fuzzy, c-format -#| msgid "Did not find any relation named \"%s\".\n" -msgid "Did not find any relation named \"%s\"." -msgstr "\"%s\" adında nesne bulunamadı.\n" - -#: describe.c:1406 describe.c:3765 -#, fuzzy, c-format -#| msgid "Did not find any relations.\n" -msgid "Did not find any relations." -msgstr "Hiç bir nesne bulunamadı.\n" - -#: describe.c:1661 -#, fuzzy, c-format -#| msgid "Did not find any relation with OID %s.\n" -msgid "Did not find any relation with OID %s." -msgstr "OID %s olan nesne bulunamadı.\n" - -#: describe.c:1713 describe.c:1737 -msgid "Start" -msgstr "Başlat" - -#: describe.c:1714 describe.c:1738 -msgid "Minimum" -msgstr "Asgari (min)" - -#: describe.c:1715 describe.c:1739 -msgid "Maximum" -msgstr "Azami (max)" - -#: describe.c:1716 describe.c:1740 -msgid "Increment" -msgstr "Artım" - -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4184 -#: describe.c:4350 describe.c:4464 describe.c:4469 -msgid "yes" -msgstr "evet" - -#: describe.c:1718 describe.c:1742 describe.c:1873 describe.c:4184 -#: describe.c:4347 describe.c:4464 -msgid "no" -msgstr "hayır" - -#: describe.c:1719 describe.c:1743 -msgid "Cycles?" -msgstr "Döngüler?" - -#: describe.c:1720 describe.c:1744 -msgid "Cache" -msgstr "Önbellek" - -#: describe.c:1787 -#, c-format -msgid "Owned by: %s" -msgstr "Sahibi: %s" - -#: describe.c:1791 -#, c-format -msgid "Sequence for identity column: %s" -msgstr "Kimlik (identity) sütunu için sıra (seq.) : %s" - -#: describe.c:1798 -#, c-format -msgid "Sequence \"%s.%s\"" -msgstr "Sequence \"%s.%s\"" - -#: describe.c:1934 -#, c-format -msgid "Unlogged table \"%s.%s\"" -msgstr "Loglanmayan tablo \"%s.%s\" " - -#: describe.c:1937 -#, c-format -msgid "Table \"%s.%s\"" -msgstr "Tablo \"%s.%s\"" - -#: describe.c:1941 -#, c-format -msgid "View \"%s.%s\"" -msgstr "View \"%s.%s\"" - -#: describe.c:1946 -#, c-format -msgid "Unlogged materialized view \"%s.%s\"" -msgstr "Loglanmayan maddileştirilmiş görünüm (materialized view) \"%s.%s\"" - -#: describe.c:1949 -#, c-format -msgid "Materialized view \"%s.%s\"" -msgstr "\"%s.%s\" maddileştirilmiş görünümü (materialized view)" - -#: describe.c:1954 -#, c-format -msgid "Unlogged index \"%s.%s\"" -msgstr "Loglanmayan index \"%s.%s\"" - -#: describe.c:1957 -#, c-format -msgid "Index \"%s.%s\"" -msgstr "İndex \"%s.%s\"" - -#: describe.c:1962 -#, fuzzy, c-format -#| msgid "Unlogged index \"%s.%s\"" -msgid "Unlogged partitioned index \"%s.%s\"" -msgstr "Loglanmayan index \"%s.%s\"" - -#: describe.c:1965 -#, fuzzy, c-format -#| msgid "Unlogged index \"%s.%s\"" -msgid "Partitioned index \"%s.%s\"" -msgstr "Loglanmayan index \"%s.%s\"" - -#: describe.c:1970 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Özel nesne \"%s.%s\"" - -#: describe.c:1974 -#, c-format -msgid "TOAST table \"%s.%s\"" -msgstr "TOAST tablosu \"%s.%s\"" - -#: describe.c:1978 -#, c-format -msgid "Composite type \"%s.%s\"" -msgstr "Birleşik veri tipi \"%s.%s\"" - -#: describe.c:1982 -#, c-format -msgid "Foreign table \"%s.%s\"" -msgstr "\"%s.%s\" uzak (foreign) tablosu " - -#: describe.c:1987 -#, fuzzy, c-format -#| msgid "Unlogged table \"%s.%s\"" -msgid "Unlogged partitioned table \"%s.%s\"" -msgstr "Loglanmayan tablo \"%s.%s\" " - -#: describe.c:1990 -#, fuzzy, c-format -#| msgid "Foreign table \"%s.%s\"" -msgid "Partitioned table \"%s.%s\"" -msgstr "\"%s.%s\" uzak (foreign) tablosu " - -#: describe.c:2006 describe.c:4097 -msgid "Collation" -msgstr "Sıralama (collation)" - -#: describe.c:2007 describe.c:4104 -msgid "Nullable" -msgstr "Boş (null) olabilir" - -#: describe.c:2008 describe.c:4105 -msgid "Default" -msgstr "Varsayılan" - -#: describe.c:2011 -msgid "Key?" -msgstr "Anahtar?" - -#: describe.c:2013 -msgid "Definition" -msgstr "Tanım" - -#: describe.c:2015 describe.c:5215 describe.c:5299 describe.c:5370 -#: describe.c:5434 -msgid "FDW options" -msgstr "FDW Seçenekleri" - -#: describe.c:2017 -msgid "Storage" -msgstr "Saklama" - -#: describe.c:2019 -msgid "Stats target" -msgstr "Stats hedefi" - -#: describe.c:2137 -#, c-format -msgid "Partition of: %s %s" -msgstr "" - -#: describe.c:2145 -msgid "No partition constraint" -msgstr "Bölümleme kısıtlaması yok" - -#: describe.c:2147 -#, c-format -msgid "Partition constraint: %s" -msgstr "Bölümleme kısıtlaması: %s" - -#: describe.c:2170 -#, c-format -msgid "Partition key: %s" -msgstr "Bölümleme anahtarı: %s" - -#: describe.c:2239 -msgid "primary key, " -msgstr "birincil anahtar, " - -#: describe.c:2241 -msgid "unique, " -msgstr "tekil, " - -#: describe.c:2247 -#, c-format -msgid "for table \"%s.%s\"" -msgstr "\"%s.%s\" tablosu için " - -#: describe.c:2251 -#, c-format -msgid ", predicate (%s)" -msgstr ", belirli (%s)" - -#: describe.c:2254 -msgid ", clustered" -msgstr ", clustered" - -#: describe.c:2257 -msgid ", invalid" -msgstr ", geçersiz" - -#: describe.c:2260 -msgid ", deferrable" -msgstr ", ertelenebilir" - -#: describe.c:2263 -msgid ", initially deferred" -msgstr ", başlangıçta ertelenmiş" - -#: describe.c:2266 -msgid ", replica identity" -msgstr ", replika kimliği " - -#: describe.c:2325 -msgid "Indexes:" -msgstr "İndeksler:" - -#: describe.c:2409 -msgid "Check constraints:" -msgstr "Check constraints:" - -#: describe.c:2477 -msgid "Foreign-key constraints:" -msgstr "İkincil anahtar sınırlamaları:" - -#: describe.c:2540 -msgid "Referenced by:" -msgstr "Referans veren:" - -#: describe.c:2590 -msgid "Policies:" -msgstr "İlkeler:" - -#: describe.c:2593 -msgid "Policies (forced row security enabled):" -msgstr "İlkeler (zorunlu satır güvenliği etkin):" - -#: describe.c:2596 -msgid "Policies (row security enabled): (none)" -msgstr "İlkeler (satır güvenliği etkin): (hiçbiri)" - -#: describe.c:2599 -msgid "Policies (forced row security enabled): (none)" -msgstr "İlkeler (zorunlu satır güvenliği etkin): (hiçbiri)" - -#: describe.c:2602 -msgid "Policies (row security disabled):" -msgstr "İlkeler (satır güvenliği devre dışı):" - -#: describe.c:2665 -msgid "Statistics objects:" -msgstr "İstatistik nesneleri:" - -#: describe.c:2774 describe.c:2878 -msgid "Rules:" -msgstr "Rulelar:" - -#: describe.c:2777 -msgid "Disabled rules:" -msgstr "Devre dışı bırakılmış rule'lar:" - -#: describe.c:2780 -msgid "Rules firing always:" -msgstr "Her zaman çalıştırılan rule'ler:" - -#: describe.c:2783 -msgid "Rules firing on replica only:" -msgstr "Sadece kopyada çalıştırılan rule'ler:" - -#: describe.c:2823 -msgid "Publications:" -msgstr "Yayınlar (publication):" - -#: describe.c:2861 -msgid "View definition:" -msgstr "View tanımı:" - -#: describe.c:3000 -msgid "Triggers:" -msgstr "Tetikleyiciler(Triggers):" - -#: describe.c:3004 -msgid "Disabled user triggers:" -msgstr "Devre dışı kullanıcı tetikleyicileri:" - -#: describe.c:3006 -msgid "Disabled triggers:" -msgstr "Devre dışı bırakılmış tetikleyiciler:" - -#: describe.c:3009 -msgid "Disabled internal triggers:" -msgstr "Devre dışı dahili tetikleyiciler:" - -#: describe.c:3012 -msgid "Triggers firing always:" -msgstr "Her zaman çalıştırılan tetikleyiciler:" - -#: describe.c:3015 -msgid "Triggers firing on replica only:" -msgstr "Sadece kopyada çalıştırılan tetikleyiciler:" - -#: describe.c:3074 -#, c-format -msgid "Server: %s" -msgstr "Sunucu: %s" - -#: describe.c:3082 -#, c-format -msgid "FDW options: (%s)" -msgstr "FDW Seçenekleri: (%s)" - -#: describe.c:3101 -msgid "Inherits" -msgstr "Inherits" - -#: describe.c:3160 -#, c-format -msgid "Number of partitions: %d" -msgstr "Bölümlemelerin (partition) sayısı: %d" - -#: describe.c:3169 -#, c-format -msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "alt tabloların sayısı: %d (Listelemek için \\d+ kullanabilirsiniz.)" - -#: describe.c:3171 -#, c-format -msgid "Number of partitions: %d (Use \\d+ to list them.)" -msgstr "Bölümlemelerin (partition) sayısı: %d (Listelemek için \\d+ kullanabilirsiniz.)" - -#: describe.c:3179 -msgid "Child tables" -msgstr "Alt tablolar" - -#: describe.c:3179 -msgid "Partitions" -msgstr "Bölümlemeler (partition)" - -#: describe.c:3222 -#, c-format -msgid "Typed table of type: %s" -msgstr "%s tipi için tipli tablo" - -#: describe.c:3238 -msgid "Replica Identity" -msgstr "Replika özdeşliği" - -#: describe.c:3251 -msgid "Has OIDs: yes" -msgstr "OID'ler mevcut: evet" - -#: describe.c:3260 -#, fuzzy, c-format -#| msgid "access method %s" -msgid "Access method: %s" -msgstr "%s erişim yöntemi" - -#: describe.c:3339 -#, 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:3351 -#, c-format -msgid ", tablespace \"%s\"" -msgstr ", tablespace \"%s\"" - -#: describe.c:3444 -msgid "List of roles" -msgstr "Veritabanı rolleri listesi" - -#: describe.c:3446 -msgid "Role name" -msgstr "Rol adı" - -#: describe.c:3447 -msgid "Attributes" -msgstr "Özellikler" - -#: describe.c:3448 -msgid "Member of" -msgstr "Üyesidir" - -#: describe.c:3459 -msgid "Superuser" -msgstr "Superuser" - -#: describe.c:3462 -msgid "No inheritance" -msgstr "Miras yok" - -#: describe.c:3465 -msgid "Create role" -msgstr "Rol oluştur" - -#: describe.c:3468 -msgid "Create DB" -msgstr "Veritabanı Oluştur" - -#: describe.c:3471 -msgid "Cannot login" -msgstr "Giriş yapılamıyor" - -#: describe.c:3475 -msgid "Replication" -msgstr "Replikasyon" - -#: describe.c:3479 -msgid "Bypass RLS" -msgstr "RLS'yi atlat" - -#: describe.c:3488 -msgid "No connections" -msgstr "Bağlantı yok" - -#: describe.c:3490 -#, c-format -msgid "%d connection" -msgid_plural "%d connections" -msgstr[0] "%d bağlantı" -msgstr[1] "1 bağlantı" - -#: describe.c:3500 -msgid "Password valid until " -msgstr "Parola geçerlilik tarihi" - -#: describe.c:3550 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support per-database role settings.\n" -msgid "The server (version %s) does not support per-database role settings." -msgstr "Bu sunucu (%s sürümü) veritabanlarına özgü rol ayarlarını desteklememektedir.\n" - -#: describe.c:3563 -msgid "Role" -msgstr "Rol" - -#: describe.c:3564 -msgid "Database" -msgstr "Veritabanı" - -#: describe.c:3565 -msgid "Settings" -msgstr "Ayarlar" - -#: describe.c:3586 -#, fuzzy, c-format -#| msgid "Did not find any settings for role \"%s\" and database \"%s\".\n" -msgid "Did not find any settings for role \"%s\" and database \"%s\"." -msgstr "\"%s\" rolü ve \"%s\" veritabanı için ayar bulunamadı.\n" - -#: describe.c:3589 -#, fuzzy, c-format -#| msgid "Did not find any settings for role \"%s\".\n" -msgid "Did not find any settings for role \"%s\"." -msgstr "\"%s\" rolü için ayar bulunamadı.\n" - -#: describe.c:3592 -#, fuzzy, c-format -#| msgid "Did not find any settings.\n" -msgid "Did not find any settings." -msgstr "Hiç bir ayar bulunamadı.\n" - -#: describe.c:3597 -msgid "List of settings" -msgstr "Seçeneklerin lsitesi" - -#: describe.c:3667 -msgid "index" -msgstr "indeks" - -#: describe.c:3669 -msgid "special" -msgstr "özel" - -#: describe.c:3672 describe.c:3857 -#, fuzzy -#| msgid "partition_name" -msgid "partitioned index" -msgstr "bölümleme(partition)_adı" - -#: describe.c:3770 -msgid "List of relations" -msgstr "Nesnelerin listesi" - -#: describe.c:3818 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support collations.\n" -msgid "The server (version %s) does not support declarative table partitioning." -msgstr "Bu sunucu (%s sürümü) karşılaştırmaları (collations) desteklememektedir.\n" - -#: describe.c:3829 -#, fuzzy -#| msgid "\"%s\" is not partitioned" -msgid "List of partitioned indexes" -msgstr "\"%s\" bölümlendirilmemiş" - -#: describe.c:3831 -#, fuzzy -#| msgid "\"%s\" is a partitioned table" -msgid "List of partitioned tables" -msgstr "\"%s\" bölümlenmiş bir tablodur" - -#: describe.c:3835 -#, fuzzy -#| msgid "List of relations" -msgid "List of partitioned relations" -msgstr "Nesnelerin listesi" - -#: describe.c:3866 -#, fuzzy -#| msgid "Token name" -msgid "Parent name" -msgstr "Token adı" - -#: describe.c:3879 -#, fuzzy -#| msgid "Partitions" -msgid "Leaf partition size" -msgstr "Bölümlemeler (partition)" - -#: describe.c:3882 describe.c:3888 -msgid "Total size" -msgstr "" - -#: describe.c:4020 -msgid "Trusted" -msgstr "Güvenilir" - -#: describe.c:4028 -msgid "Internal language" -msgstr "Dahili dil" - -#: describe.c:4029 -msgid "Call handler" -msgstr "Çağrı işleyici" - -#: describe.c:4030 describe.c:5202 -msgid "Validator" -msgstr "Onaylayan" - -#: describe.c:4033 -msgid "Inline handler" -msgstr "Satır içi işleyici" - -#: describe.c:4061 -msgid "List of languages" -msgstr "Dil listesi" - -#: describe.c:4106 -msgid "Check" -msgstr "Check" - -#: describe.c:4148 -msgid "List of domains" -msgstr "Domainlerin listesi" - -#: describe.c:4182 -msgid "Source" -msgstr "Kaynak" - -#: describe.c:4183 -msgid "Destination" -msgstr "Hedef" - -#: describe.c:4185 -msgid "Default?" -msgstr "Varsayılan?" - -#: describe.c:4222 -msgid "List of conversions" -msgstr "Dönüşümlerin listesi" - -#: describe.c:4261 -msgid "Event" -msgstr "Olay" - -#: describe.c:4263 -msgid "enabled" -msgstr "etkin" - -#: describe.c:4264 -msgid "replica" -msgstr "replika" - -#: describe.c:4265 -msgid "always" -msgstr "daima" - -#: describe.c:4266 -msgid "disabled" -msgstr "devre dışı bırakılmış" - -#: describe.c:4267 describe.c:5901 -msgid "Enabled" -msgstr "Etkin" - -#: describe.c:4269 -msgid "Tags" -msgstr "Etiketler (tag)" - -#: describe.c:4288 -msgid "List of event triggers" -msgstr "Olay tetikleyicilerin listesi" - -#: describe.c:4317 -msgid "Source type" -msgstr "Kaynak tipi" - -#: describe.c:4318 -msgid "Target type" -msgstr "Hedef tipi" - -#: describe.c:4349 -msgid "in assignment" -msgstr "in assignment" - -#: describe.c:4351 -msgid "Implicit?" -msgstr "Örtülü mü?" - -#: describe.c:4406 -msgid "List of casts" -msgstr "Castlerin listesi" - -#: describe.c:4434 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support collations.\n" -msgid "The server (version %s) does not support collations." -msgstr "Bu sunucu (%s sürümü) karşılaştırmaları (collations) desteklememektedir.\n" - -#: describe.c:4455 describe.c:4459 -msgid "Provider" -msgstr "Sağlayıcı" - -#: describe.c:4465 describe.c:4470 -msgid "Deterministic?" -msgstr "" - -#: describe.c:4505 -msgid "List of collations" -msgstr "Karşılaştırma (collations) listesi" - -#: describe.c:4564 -msgid "List of schemas" -msgstr "Şemaların listesi" - -#: describe.c:4589 describe.c:4836 describe.c:4907 describe.c:4978 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support full text search.\n" -msgid "The server (version %s) does not support full text search." -msgstr "Bu sunucu (%s sürümü) tam metin aramayı desteklememektedir.\n" - -#: describe.c:4624 -msgid "List of text search parsers" -msgstr "Metin arama ayrıştıcılarının listesi" - -#: describe.c:4669 -#, fuzzy, c-format -#| msgid "Did not find any text search parser named \"%s\".\n" -msgid "Did not find any text search parser named \"%s\"." -msgstr "\"%s\" adında metin arama ayrıştırıcısı bulunamadı.\n" - -#: describe.c:4672 -#, fuzzy, c-format -#| msgid "Did not find any text search parsers.\n" -msgid "Did not find any text search parsers." -msgstr "Metin arama ayrıştırıcısı bulunamadı.\n" - -#: describe.c:4747 -msgid "Start parse" -msgstr "Ayrıştırmayı başlat" - -#: describe.c:4748 -msgid "Method" -msgstr "Yöntem" - -#: describe.c:4752 -msgid "Get next token" -msgstr "Sıradaki tokeni al" - -#: describe.c:4754 -msgid "End parse" -msgstr "Ayrıştırmayı bitir" - -#: describe.c:4756 -msgid "Get headline" -msgstr "Başlığı al" - -#: describe.c:4758 -msgid "Get token types" -msgstr "Token tiplerini al" - -#: describe.c:4769 -#, c-format -msgid "Text search parser \"%s.%s\"" -msgstr "Metin arama ayrıştırıcısı \"%s.%s\"" - -#: describe.c:4772 -#, c-format -msgid "Text search parser \"%s\"" -msgstr "\"%s\" metin arama ayrıştırıcısı" - -#: describe.c:4791 -msgid "Token name" -msgstr "Token adı" - -#: describe.c:4802 -#, c-format -msgid "Token types for parser \"%s.%s\"" -msgstr "\"%s.%s\" ayrıştırıcısı için token tipleri" - -#: describe.c:4805 -#, c-format -msgid "Token types for parser \"%s\"" -msgstr "\"%s\" ayrıştırıcısı için token tipleri" - -#: describe.c:4859 -msgid "Template" -msgstr "Şablon" - -#: describe.c:4860 -msgid "Init options" -msgstr "İnit seçenekleri" - -#: describe.c:4882 -msgid "List of text search dictionaries" -msgstr "Metin arama sözlüklerinin listesi" - -#: describe.c:4925 -msgid "Init" -msgstr "Init" - -#: describe.c:4926 -msgid "Lexize" -msgstr "Lexize" - -#: describe.c:4953 -msgid "List of text search templates" -msgstr "Metin arama şablonlarının listesi" - -#: describe.c:5013 -msgid "List of text search configurations" -msgstr "Metin arama yapılandırmalarının listesi" - -#: describe.c:5059 -#, fuzzy, c-format -#| msgid "Did not find any text search configuration named \"%s\".\n" -msgid "Did not find any text search configuration named \"%s\"." -msgstr "\"%s\" adında metin arama yapılandırması bulunamadı.\n" - -#: describe.c:5062 -#, fuzzy, c-format -#| msgid "Did not find any text search configurations.\n" -msgid "Did not find any text search configurations." -msgstr "Metin arama yapılandırması bulunamadı.\n" - -#: describe.c:5128 -msgid "Token" -msgstr "Token" - -#: describe.c:5129 -msgid "Dictionaries" -msgstr "Sözlükler" - -#: describe.c:5140 -#, c-format -msgid "Text search configuration \"%s.%s\"" -msgstr "Metin arama yapılandırması \"%s.%s\"" - -#: describe.c:5143 -#, c-format -msgid "Text search configuration \"%s\"" -msgstr "Metin arama yapılandırması \"%s\"" - -#: describe.c:5147 -#, c-format -msgid "" -"\n" -"Parser: \"%s.%s\"" -msgstr "" -"\n" -"Ayrıştırıcı \"%s.%s\"" - -#: describe.c:5150 -#, c-format -msgid "" -"\n" -"Parser: \"%s\"" -msgstr "" -"\n" -"Ayrıştırıcı: \"%s\"" - -#: describe.c:5184 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support foreign-data wrappers.\n" -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Sunucu (%s sürümü) foreign-data wrapperlarını desteklememektedir.\n" - -#: describe.c:5242 -msgid "List of foreign-data wrappers" -msgstr "Foreign-data wrapperlarının listesi" - -#: describe.c:5267 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support foreign servers.\n" -msgid "The server (version %s) does not support foreign servers." -msgstr "Bu sunucu (%s sürümü) uzak (foreign) sunucuları desteklemiyor.\n" - -#: describe.c:5280 -msgid "Foreign-data wrapper" -msgstr "Foreign-data wrapper" - -#: describe.c:5298 describe.c:5503 -msgid "Version" -msgstr "Sürüm" - -#: describe.c:5324 -msgid "List of foreign servers" -msgstr "Foreign sunucuların listesi" - -#: describe.c:5349 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support user mappings.\n" -msgid "The server (version %s) does not support user mappings." -msgstr "Sunucu (%s sürümü) kullanıcı haritalamasını desteklememektedir.\n" - -#: describe.c:5359 describe.c:5423 -msgid "Server" -msgstr "Sunucu" - -#: describe.c:5360 -msgid "User name" -msgstr "Kullanıcı adı" - -#: describe.c:5385 -msgid "List of user mappings" -msgstr "Kullanıcı eşlemelerinin listesi" - -#: describe.c:5410 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support foreign tables.\n" -msgid "The server (version %s) does not support foreign tables." -msgstr "Bu sunucu (%s sürümü) uzak (foreign) tabloları desteklemiyor.\n" - -#: describe.c:5463 -msgid "List of foreign tables" -msgstr "Uzak (foreign) tabloların listesi" - -#: describe.c:5488 describe.c:5545 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support extensions.\n" -msgid "The server (version %s) does not support extensions." -msgstr "Bu sunucu (%s sürümü) uzantıları (extension) desteklememektedir.\n" - -#: describe.c:5520 -msgid "List of installed extensions" -msgstr "Kurulu uzantıların (extension) listesi" - -#: describe.c:5573 -#, fuzzy, c-format -#| msgid "Did not find any extension named \"%s\".\n" -msgid "Did not find any extension named \"%s\"." -msgstr "\"%s\" adında uzantı (extension) bulunamadı.\n" - -#: describe.c:5576 -#, fuzzy, c-format -#| msgid "Did not find any extensions.\n" -msgid "Did not find any extensions." -msgstr "Hiç bir uzantı bulunamadı.\n" - -#: describe.c:5620 -msgid "Object description" -msgstr "Nesne açıklaması" - -#: describe.c:5630 -#, c-format -msgid "Objects in extension \"%s\"" -msgstr "\"%s\" uzantısındaki nesneler" - -#: describe.c:5659 describe.c:5730 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support publications.\n" -msgid "The server (version %s) does not support publications." -msgstr "Bu sunucu (%s sürümü) yayınları (publication) desteklememektedir.\n" - -#: describe.c:5676 describe.c:5802 -msgid "All tables" -msgstr "Bütün tablolar" - -#: describe.c:5677 describe.c:5803 -msgid "Inserts" -msgstr "Eklemeler (insert)" - -#: describe.c:5678 describe.c:5804 -msgid "Updates" -msgstr "Güncelleştirmeler (update)" - -#: describe.c:5679 describe.c:5805 -msgid "Deletes" -msgstr "Silmeler (delete)" - -#: describe.c:5683 describe.c:5807 -msgid "Truncates" -msgstr "Budamalar (truncate)" - -#: describe.c:5700 -msgid "List of publications" -msgstr "Yayınların (publication) listesi" - -#: describe.c:5768 -#, fuzzy, c-format -#| msgid "Did not find any publication named \"%s\".\n" -msgid "Did not find any publication named \"%s\"." -msgstr "\"%s\" adında yayın bulunamadı.\n" - -#: describe.c:5771 -#, fuzzy, c-format -#| msgid "Did not find any publications.\n" -msgid "Did not find any publications." -msgstr "Hiç yayın bulunamadı.\n" - -#: describe.c:5798 -#, c-format -msgid "Publication %s" -msgstr "%s yayını (publication)" - -#: describe.c:5842 -msgid "Tables:" -msgstr "Tablolar:" - -#: describe.c:5886 -#, fuzzy, c-format -#| msgid "The server (version %s) does not support subscriptions.\n" -msgid "The server (version %s) does not support subscriptions." -msgstr "Sunucu (%s sürümü) abonelikleri (subscription) desteklememektedir.\n" - -#: describe.c:5902 -msgid "Publication" -msgstr "Yayın (publication)" - -#: describe.c:5909 -msgid "Synchronous commit" -msgstr "Eşzamanlı commit" - -#: describe.c:5910 -msgid "Conninfo" -msgstr "Conninfo" - -#: describe.c:5932 -msgid "List of subscriptions" -msgstr "Aboneliklerin listesi" - -#: help.c:74 -#, c-format -msgid "" -"psql is the PostgreSQL interactive terminal.\n" -"\n" -msgstr "" -"psql PostgreSQL'in etkilişimli arayüzüdür.\n" -"\n" - -#: help.c:75 help.c:349 help.c:425 help.c:468 -#, c-format -msgid "Usage:\n" -msgstr "Kullanımı:\n" - -#: help.c:76 -#, c-format -msgid "" -" psql [OPTION]... [DBNAME [USERNAME]]\n" -"\n" -msgstr "" -" psql [SEÇENEK]... [VERİTABANI ADI [KULLANICI ADI]]\n" -"\n" - -#: help.c:78 -#, c-format -msgid "General options:\n" -msgstr "Genel seçenekler:\n" - -#: help.c:83 -#, c-format -msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" -msgstr " -c, --command=KOMUT tek bir komut çalıştır (SQL ya da dahili) ve çık\n" - -#: help.c:84 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBNAME bağlanılacak veritabanının adı (öntanımlı: \"%s\")\n" - -#: help.c:85 -#, c-format -msgid " -f, --file=FILENAME execute commands from file, then exit\n" -msgstr " -f, --file=DOSYA ADI dosyadan komutları çalıştır ve çık\n" - -#: help.c:86 -#, c-format -msgid " -l, --list list available databases, then exit\n" -msgstr " -l, --list veritabanlarını listele ve çık\n" - -#: help.c:87 -#, c-format -msgid "" -" -v, --set=, --variable=NAME=VALUE\n" -" set psql variable NAME to VALUE\n" -" (e.g., -v ON_ERROR_STOP=1)\n" -msgstr "" -" -v, --set=, --variable=ADI=DEĞER\n" -" ADI kısmında belirtilen psql değişkeninin değerini DEĞER ile belirtilen değer olarak ata\n" -" (örnek, -v ON_ERROR_STOP=1)\n" -"\n" - -#: help.c:90 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version sürüm bilgisini göster, sonra çık\n" - -#: help.c:91 -#, c-format -msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" -msgstr " -X , --no-psqlrc başlangıç dosyasını (~/.psqlrc) okuma\n" - -#: help.c:92 -#, c-format -msgid "" -" -1 (\"one\"), --single-transaction\n" -" execute as a single transaction (if non-interactive)\n" -msgstr "" -" -1 (\"one\"), --single-transaction\n" -" komut dosyasını tek bir transaction olarak çalıştır (interaktif değilse)\n" - -#: help.c:94 -#, c-format -msgid " -?, --help[=options] show this help, then exit\n" -msgstr " -?, --help[=options] bu yardımı göster, sonra çık\n" - -#: help.c:95 -#, c-format -msgid " --help=commands list backslash commands, then exit\n" -msgstr " --help=commands \"\\\"komutlarını listele, sonra çık\n" - -#: help.c:96 -#, c-format -msgid " --help=variables list special variables, then exit\n" -msgstr " --help=variables özel değişkenleri listele, sonra çık\n" - -#: help.c:98 -#, c-format -msgid "" -"\n" -"Input and output options:\n" -msgstr "" -"\n" -"Giriş ve çıkış tercihleri:\n" - -#: help.c:99 -#, c-format -msgid " -a, --echo-all echo all input from script\n" -msgstr " -a, --echo-all betik dosyasının içeriğini yansıt\n" - -#: help.c:100 -#, c-format -msgid " -b, --echo-errors echo failed commands\n" -msgstr " -e, --echo-errors başarısız komutları yansıt\n" - -#: help.c:101 -#, c-format -msgid " -e, --echo-queries echo commands sent to server\n" -msgstr " -e, --echo-queries sunucuya gönderilen komutları yansıt\n" - -#: help.c:102 -#, c-format -msgid " -E, --echo-hidden display queries that internal commands generate\n" -msgstr " -E, --echo-hidden dahili komutların ürettiği sorguları göster\n" - -#: help.c:103 -#, c-format -msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr " -L, --log-file=DOSYA ADI oturum kaydını dosyaya kaydet\n" - -#: help.c:104 -#, c-format -msgid " -n, --no-readline disable enhanced command line editing (readline)\n" -msgstr " -n, --no-readline gelişmiş komut satırı düzenleyicisini devre dışı bırak (readline)\n" - -#: help.c:105 -#, c-format -msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" -msgstr " -o, --output=DOSYA ADI sorgu sonuçlarını dosyaya aktar (ya da |pipe)\n" - -#: help.c:106 -#, c-format -msgid " -q, --quiet run quietly (no messages, only query output)\n" -msgstr " -q, --quiet sessiz biçim (mesajlar kapalı, sadece sorgu sonuçları açık)\n" - -#: help.c:107 -#, c-format -msgid " -s, --single-step single-step mode (confirm each query)\n" -msgstr " -s, --single-step tek adım biçimi (her sorguyu onaylama)\n" - -#: help.c:108 -#, c-format -msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" -msgstr " -S, --single-line tek satır modu (satır sonu SQL komutunu sonlandırır)\n" - -#: help.c:110 -#, c-format -msgid "" -"\n" -"Output format options:\n" -msgstr "" -"\n" -"Çıktı biçimi seçenekleri:\n" - -#: help.c:111 -#, c-format -msgid " -A, --no-align unaligned table output mode\n" -msgstr " -A, --no-align dizilmemiş tablo çıktı modu\n" - -#: help.c:112 -#, fuzzy, c-format -#| msgid " \\a toggle between unaligned and aligned output mode\n" -msgid " --csv CSV (Comma-Separated Values) table output mode\n" -msgstr " \\a düzenli ve düzensiz çıktı modu arasında geçiş yap\n" - -#: help.c:113 -#, c-format -msgid "" -" -F, --field-separator=STRING\n" -" field separator for unaligned output (default: \"%s\")\n" -msgstr "" -" -F, --field-separator=DİZGİ\n" -" hizalanmamış çıktı için alan ayırıcısı (varsayılan: \"%s\")\n" - -#: help.c:116 -#, c-format -msgid " -H, --html HTML table output mode\n" -msgstr " -H, --html HTML tablosu çıktı modu\n" - -#: help.c:117 -#, c-format -msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" -msgstr " -P, --pset=VAR[=ARG] VAR yazma ayarınına ARG değerini ata (\\pset komutuna bak)\n" - -#: help.c:118 -#, c-format -msgid "" -" -R, --record-separator=STRING\n" -" record separator for unaligned output (default: newline)\n" -msgstr "" -" -R, --record-separator=DİZGİ\n" -" hizalanmamış çıktı için kayıt ayırıcısı (varsayılan: yeni satır)\n" - -#: help.c:120 -#, c-format -msgid " -t, --tuples-only print rows only\n" -msgstr " -t, --tuples-only sadece satırları yaz\n" - -#: help.c:121 -#, c-format -msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" -msgstr " -T, --table-attr=TEXT HTML tablo tag parametrelerini ayarla (genişlik, kenarlık)\n" - -#: help.c:122 -#, c-format -msgid " -x, --expanded turn on expanded table output\n" -msgstr " -x, --expanded gelişmiş tablo çıktısını atkinleştir\n" - -#: help.c:123 -#, c-format -msgid "" -" -z, --field-separator-zero\n" -" set field separator for unaligned output to zero byte\n" -msgstr "" -" -z, --field-separator-zero\n" -" hizalanmamış çıktı için alan ayırıcısını sıfır bayt'a ayarla\n" - -#: help.c:125 -#, c-format -msgid "" -" -0, --record-separator-zero\n" -" set record separator for unaligned output to zero byte\n" -msgstr "" -" -0, --record-separator-zero\n" -" hizalanmamış çıktı için kayıt ayırıcısını sıfır bayt'a ayarla\n" - -#: help.c:128 -#, c-format -msgid "" -"\n" -"Connection options:\n" -msgstr "" -"\n" -"Bağlantı seçenekleri:\n" - -#: help.c:131 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr " -h, --host= HOST ADI veritabanı sunucu adresi ya da soket dizini (varsayılan: \"%s\")\n" - -#: help.c:132 -msgid "local socket" -msgstr "yerel soket" - -#: help.c:135 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT veritabanı sunucusu port numarası (varsayılan: \"%s\")\n" - -#: help.c:141 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=KULLANICI ADI veritabanı kullanıcı adı (varsayılan: \"%s\")\n" - -#: help.c:142 -#, c-format -msgid " -w, --no-password never prompt for password\n" -msgstr " -W, --no-password bağlanmak için kesinlikle parola sorma\n" - -#: help.c:143 -#, c-format -msgid " -W, --password force password prompt (should happen automatically)\n" -msgstr " -W şifre sor (otomatik olarak her zaman açık)\n" - -#: help.c:145 -#, c-format -msgid "" -"\n" -"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" -"commands) from within psql, or consult the psql section in the PostgreSQL\n" -"documentation.\n" -"\n" -msgstr "" -"\n" -"Daha fazla bilgi için yapsql içinde: \"\\?\" (dahili komutlar için) ya \"\\help\"\n" -"(SQL komutlar için) yazın, ya da PostgreSQL belgelerinin psql bölümüne \n" -"bakın.\n" -"\n" - -#: help.c:148 -#, c-format -msgid "Report bugs to .\n" -msgstr "Hataları adresine bildirebilirsiniz.\n" - -#: help.c:174 -#, c-format -msgid "General\n" -msgstr "Genel\n" - -#: help.c:175 -#, c-format -msgid " \\copyright show PostgreSQL usage and distribution terms\n" -msgstr " \\copyright PostgreSQL kullanım ve dağıtım şartlarını göster\n" - -#: help.c:176 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUMNS] sorguyu çalıştır ve sonuçları çapraz tablo içinde göster\n" - -#: help.c:177 -#, c-format -msgid " \\errverbose show most recent error message at maximum verbosity\n" -msgstr " \\errverbose en son hata mesajını azami açıklamalı olarak göster\n" - -#: help.c:178 -#, c-format -msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -msgstr " \\g [DOSYA] or ; sorguyu çalıştır (ve sonucu dosyaya ya da |pipe'a gönder)\n" - -#: help.c:179 -#, c-format -msgid " \\gdesc describe result of query, without executing it\n" -msgstr " \\gdesc sorguyu çalıştırmadan sonuçlarını tarif et\n" - -#: help.c:180 -#, c-format -msgid " \\gexec execute query, then execute each value in its result\n" -msgstr "" - -#: help.c:181 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" -msgstr " \\gset [PREFIX] sorguyu çalıştır ve sonuçları psql değişkenlerinde sakla\n" - -#: help.c:182 -#, c-format -msgid " \\gx [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\gx [DOSYA] \\g gibi fakat genişletilmiş çıktı modu zorunlu\n" - -#: help.c:183 -#, c-format -msgid " \\q quit psql\n" -msgstr " \\q psql'den çık\n" - -#: help.c:184 -#, c-format -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SNY] sorguyu her SNY saniyede bir çalıştır\n" - -#: help.c:187 -#, c-format -msgid "Help\n" -msgstr "Yardım\n" - -#: help.c:189 -#, c-format -msgid " \\? [commands] show help on backslash commands\n" -msgstr " \\? [komutlar] \"\\\" komutları için yardım gösterir\n" - -#: help.c:190 -#, c-format -msgid " \\? options show help on psql command-line options\n" -msgstr "" -" \\? options psql komut satırı seçenekleri için yardım göster\n" -"\n" - -#: help.c:191 -#, c-format -msgid " \\? variables show help on special variables\n" -msgstr " \\? variables özel değişkenler hakkında yardım göster\n" - -#: help.c:192 -#, c-format -msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" -msgstr " \\h [NAME] SQL komutları için sözdizimi yardımı, tüm komutlar için * ekleyin\n" - -#: help.c:195 -#, c-format -msgid "Query Buffer\n" -msgstr "Sorgu Tamponu (buffer)\n" - -#: help.c:196 -#, c-format -msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" -msgstr " \\e [FILE] [LINE] sorgu tamponunu (ya da dosyasını) harici bir metin düzenleyici ile düzenle\n" - -#: help.c:197 -#, c-format -msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" -msgstr " \\ef [FUNCNAME [LINE]] fonksiyon tanımını harici bir metin düzenleyici ile düzenle\n" - -#: help.c:198 -#, c-format -msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" -msgstr " \\ev [VIEWNAME [LINE]] görünüm (view) tanımını harici bir metin düzenleyici ile düzenle\n" - -#: help.c:199 -#, c-format -msgid " \\p show the contents of the query buffer\n" -msgstr " \\p sorgu tamponunun içeriğini göster\n" - -#: help.c:200 -#, c-format -msgid " \\r reset (clear) the query buffer\n" -msgstr " \\r sorgu tamponunu sıfırla (temizle)\n" - -#: help.c:202 -#, c-format -msgid " \\s [FILE] display history or save it to file\n" -msgstr " \\s [DOSYA] geçmişi göster ya da dosyaya kaydet\n" - -#: help.c:204 -#, c-format -msgid " \\w FILE write query buffer to file\n" -msgstr " \\w DOSYA sorgu tamponunu dosyaya kaydet\n" - -#: help.c:207 -#, c-format -msgid "Input/Output\n" -msgstr "Giriş/Çıkış\n" - -#: help.c:208 -#, c-format -msgid " \\copy ... perform SQL COPY with data stream to the client host\n" -msgstr " \\copy ... istemci sisteminden veri akımı ile SQL COPY komutunu çalıştır\n" - -#: help.c:209 -#, c-format -msgid " \\echo [STRING] write string to standard output\n" -msgstr " \\echo [METIN] standart çıktıya bir satır gönder\n" - -#: help.c:210 -#, c-format -msgid " \\i FILE execute commands from file\n" -msgstr " \\i DOSYA dosyadaki komutları çalıştıre\n" - -#: help.c:211 -#, c-format -msgid " \\ir FILE as \\i, but relative to location of current script\n" -msgstr " \\ir DOSYA \\i gibi, fakat geçerli betiğin bulunduğu yere göre\n" - -#: help.c:212 -#, c-format -msgid " \\o [FILE] send all query results to file or |pipe\n" -msgstr " \\o [DOSYA] tüm sorgu sonuçlarını dosyaya ya da |pipe'e gönder\n" - -#: help.c:213 -#, c-format -msgid " \\qecho [STRING] write string to query output stream (see \\o)\n" -msgstr " \\qecho [STRING] sorgu çıktı akımına dizgi yaz (\\o seçeneğine bakınız)\n" - -#: help.c:216 -#, c-format -msgid "Conditional\n" -msgstr "Şartlı\n" - -#: help.c:217 -#, c-format -msgid " \\if EXPR begin conditional block\n" -msgstr " \\if EXPR şartlı bloğa başla\n" - -#: help.c:218 -#, c-format -msgid " \\elif EXPR alternative within current conditional block\n" -msgstr " \\elif EXPR geçerli şartlı blok içinde alternatif\n" - -#: help.c:219 -#, c-format -msgid " \\else final alternative within current conditional block\n" -msgstr " \\else geçerli şartlı blok içinde son alternatif\n" - -#: help.c:220 -#, c-format -msgid " \\endif end conditional block\n" -msgstr " \\endif şartlı bloğu sonlandır\n" - -#: help.c:223 -#, c-format -msgid "Informational\n" -msgstr "Bilgi edinme\n" - -#: help.c:224 -#, c-format -msgid " (options: S = show system objects, + = additional detail)\n" -msgstr " (seçenekler: S = sistem nesnelerini göster, + = ek ayrıntılar)\n" - -#: help.c:225 -#, c-format -msgid " \\d[S+] list tables, views, and sequences\n" -msgstr " \\d[S+] tablo, views, ve sequenceleri listele\n" - -#: help.c:226 -#, c-format -msgid " \\d[S+] NAME describe table, view, sequence, or index\n" -msgstr " \\d[S+} AD tablo, indeks, sequence, ya da view tanımlarını göster\n" - -#: help.c:227 -#, c-format -msgid " \\da[S] [PATTERN] list aggregates\n" -msgstr " \\da[S] [PATTERN] aggregateleri listele\n" - -#: help.c:228 -#, c-format -msgid " \\dA[+] [PATTERN] list access methods\n" -msgstr " \\dA[+] [PATTERN] erişim yöntemlerini listele\n" - -#: help.c:229 -#, c-format -msgid " \\db[+] [PATTERN] list tablespaces\n" -msgstr " \\db[+] [PATTERN] tablespaceleri listele\n" - -#: help.c:230 -#, c-format -msgid " \\dc[S+] [PATTERN] list conversions\n" -msgstr " \\dc[S+] [PATTERN] dönüşümleri listele\n" - -#: help.c:231 -#, c-format -msgid " \\dC[+] [PATTERN] list casts\n" -msgstr " \\dC[+] [PATTERN] castleri listele\n" - -#: help.c:232 -#, c-format -msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" -msgstr " \\dd[S] [PATTERN] başka yerde gösterilmeyen nesne açıklamalarını göster\n" - -#: help.c:233 -#, c-format -msgid " \\dD[S+] [PATTERN] list domains\n" -msgstr " \\dD[S+] [PATTERN] domainleri listele\n" - -#: help.c:234 -#, c-format -msgid " \\ddp [PATTERN] list default privileges\n" -msgstr " \\ddp [PATTERN] öntanımlı izinleri listele\n" - -#: help.c:235 -#, c-format -msgid " \\dE[S+] [PATTERN] list foreign tables\n" -msgstr " \\dE[S+] [PATTERN] uzak (foreign) tabloları listele\n" - -#: help.c:236 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATTERN] foreign tabloları listele\n" - -#: help.c:237 -#, c-format -msgid " \\des[+] [PATTERN] list foreign servers\n" -msgstr " \\des[+] [PATTERN] foreign sunucuları listele\n" - -#: help.c:238 -#, c-format -msgid " \\deu[+] [PATTERN] list user mappings\n" -msgstr " \\deu[+] [PATTERN] kullanıcı haritalamasını listele\n" - -#: help.c:239 -#, c-format -msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" -msgstr " \\dew[+] [PATTERN] foreign-data wrapperlarını listele\n" - -#: help.c:240 -#, fuzzy, c-format -#| msgid " \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n" -msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n" -msgstr " \\df[antw][S+] [PATRN] [sadece agg/normal/trigger/window] fonksiyonlarını listele\n" - -#: help.c:241 -#, c-format -msgid " \\dF[+] [PATTERN] list text search configurations\n" -msgstr " \\dF[+] [PATTERN] metin arama yapılandırmalarını listele\n" - -#: help.c:242 -#, c-format -msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" -msgstr " \\dFd[+] [PATTERN] metin arama sözlüklerini listele\n" - -#: help.c:243 -#, c-format -msgid " \\dFp[+] [PATTERN] list text search parsers\n" -msgstr " \\dFp[+] [PATTERN] metin arama ayrıştırıcılarını listele\n" - -#: help.c:244 -#, c-format -msgid " \\dFt[+] [PATTERN] list text search templates\n" -msgstr " \\dFt[+] [PATTERN] metin arama şablonlarını listele\n" - -#: help.c:245 -#, c-format -msgid " \\dg[S+] [PATTERN] list roles\n" -msgstr " \\dg[S+] [PATTERN] rolleri listele\n" - -#: help.c:246 -#, c-format -msgid " \\di[S+] [PATTERN] list indexes\n" -msgstr " \\di[S+] [PATTERN] indexleri göster\n" - -#: help.c:247 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl large objectleri göster; \\lo_list ile aynıdır\n" - -#: help.c:248 -#, c-format -msgid " \\dL[S+] [PATTERN] list procedural languages\n" -msgstr " \\dL[S+] [PATTERN] yordamsal dilleri listele\n" - -#: help.c:249 -#, c-format -msgid " \\dm[S+] [PATTERN] list materialized views\n" -msgstr " \\dm[S+] [PATTERN] maddileştirilmiş görünümleri (materialized view) listele\n" - -#: help.c:250 -#, c-format -msgid " \\dn[S+] [PATTERN] list schemas\n" -msgstr " \\dn[S+] [PATTERN] şemaları listele\n" - -#: help.c:251 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [PATTERN] operatörleri listele\n" - -#: help.c:252 -#, c-format -msgid " \\dO[S+] [PATTERN] list collations\n" -msgstr " \\dO[S+] [PATTERN] collationları listele\n" - -#: help.c:253 -#, c-format -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATTERN] tablo, view, ve sequence erişim izinlerini listele\n" - -#: help.c:254 -#, fuzzy, c-format -#| msgid " \\dRp[+] [PATTERN] list replication publications\n" -msgid " \\dP[tin+] [PATTERN] list [only table/index] partitioned relations\n" -msgstr " \\dRp[+] [PATTERN] replikasyon yayınlarını listele\n" - -#: help.c:255 -#, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PATRN1 [PATRN2]] veritabanı başına rol ayarlarını listele\n" - -#: help.c:256 -#, c-format -msgid " \\dRp[+] [PATTERN] list replication publications\n" -msgstr " \\dRp[+] [PATTERN] replikasyon yayınlarını listele\n" - -#: help.c:257 -#, c-format -msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" -msgstr " \\dRs[+] [PATTERN] replikasyon aboneliklerini listele\n" - -#: help.c:258 -#, c-format -msgid " \\ds[S+] [PATTERN] list sequences\n" -msgstr " \\ds[S+] [PATTERN] sequenceları listele\n" - -#: help.c:259 -#, c-format -msgid " \\dt[S+] [PATTERN] list tables\n" -msgstr " \\dt[S+] [PATTERN] tabloları listele\n" - -#: help.c:260 -#, c-format -msgid " \\dT[S+] [PATTERN] list data types\n" -msgstr " \\dT[S+] [PATTERN] veri tiplerini listele\n" - -#: help.c:261 -#, c-format -msgid " \\du[S+] [PATTERN] list roles\n" -msgstr " \\du[S+] [PATTERN] rolleri listele\n" - -#: help.c:262 -#, c-format -msgid " \\dv[S+] [PATTERN] list views\n" -msgstr " \\dv[S+] [PATTERN] viewları listele\n" - -#: help.c:263 -#, c-format -msgid " \\dx[+] [PATTERN] list extensions\n" -msgstr " \\dx[+] [PATTERN] uzantıları listele\n" - -#: help.c:264 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] olay tetikleyicilerini listele\n" - -#: help.c:265 -#, c-format -msgid " \\l[+] [PATTERN] list databases\n" -msgstr " \\l[+] [PATTERN] veritabanlarını listele\n" - -#: help.c:266 -#, c-format -msgid " \\sf[+] FUNCNAME show a function's definition\n" -msgstr " \\sf[+] FUNCNAME fonksiyonun tanımını göster\n" - -#: help.c:267 -#, c-format -msgid " \\sv[+] VIEWNAME show a view's definition\n" -msgstr " \\sv[+] VIEWNAME görünümün (view) tanımını göster\n" - -#: help.c:268 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATTERN] \\dp ile aynı\n" - -#: help.c:271 -#, c-format -msgid "Formatting\n" -msgstr "Biçimlendirme:\n" - -#: help.c:272 -#, c-format -msgid " \\a toggle between unaligned and aligned output mode\n" -msgstr " \\a düzenli ve düzensiz çıktı modu arasında geçiş yap\n" - -#: help.c:273 -#, c-format -msgid " \\C [STRING] set table title, or unset if none\n" -msgstr " \\C [DİZİ] tablo başlığını ayarla, ya da boş bırakılırsa kaldır\n" - -#: help.c:274 -#, c-format -msgid " \\f [STRING] show or set field separator for unaligned query output\n" -msgstr " \\f [DİZİ] düzensiz sorgu çıktısı için alan ayracını göster ya da tanımla\n" - -#: help.c:275 -#, c-format -msgid " \\H toggle HTML output mode (currently %s)\n" -msgstr " \\H HTML çıktı modunu değiştir (şu anda %s)\n" - -#: help.c:277 -#, fuzzy, c-format -#| msgid "" -#| " \\pset [NAME [VALUE]] set table output option\n" -#| " (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n" -#| " footer|format|linestyle|null|numericlocale|pager|\n" -#| " pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" -#| " tuples_only|unicode_border_linestyle|\n" -#| " unicode_column_linestyle|unicode_header_linestyle})\n" -msgid "" -" \\pset [NAME [VALUE]] set table output option\n" -" (border|columns|csv_fieldsep|expanded|fieldsep|\n" -" fieldsep_zero|footer|format|linestyle|null|\n" -" numericlocale|pager|pager_min_lines|recordsep|\n" -" recordsep_zero|tableattr|title|tuples_only|\n" -" unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" -msgstr "" -" \\pset [NAME [VALUE]] tablo çıktı seçeneğini ayarla\n" -" (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n" -" footer|format|linestyle|null|numericlocale|pager|\n" -" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" -" tuples_only|unicode_border_linestyle|\n" -" unicode_column_linestyle|unicode_header_linestyle})\n" - -#: help.c:284 -#, c-format -msgid " \\t [on|off] show only rows (currently %s)\n" -msgstr " \\t [on|off] sadece satırları göster (şu an %s)\n" - -#: help.c:286 -#, c-format -msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" -msgstr " \\T [DİZGİ] HTML
parametrelerini tanımla, boş ise tüm parametrelerini kaldır\n" - -#: help.c:287 -#, c-format -msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" -msgstr " \\x [on|off|auto] geniş çıktı ayarla (şu an %s)\n" - -#: help.c:291 -#, c-format -msgid "Connection\n" -msgstr "Bağlantı\n" - -#: help.c:293 -#, c-format -msgid "" -" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" -" connect to new database (currently \"%s\")\n" -msgstr "" -" \\c[onnect] {[VTADI|- KULLANICIADI|- KARŞISUNUCU|- PORT|-] | conninfo}\n" -" yeni veritabanına bağlan (geçerli veritabanı \"%s\")\n" - -#: help.c:297 -#, c-format -msgid "" -" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" -" connect to new database (currently no connection)\n" -msgstr "" -" \\c[onnect] {[VTADI|- KULLANICIADI|- KARŞISUNUCU|- PORT|-] | conninfo}\n" -" yeni veritabanına bağlan (geçerli bağlantı yok)\n" - -#: help.c:299 -#, c-format -msgid " \\conninfo display information about current connection\n" -msgstr " \\conninfo geçerli bağlantı ile ilgili bilgi göster\n" - -#: help.c:300 -#, c-format -msgid " \\encoding [ENCODING] show or set client encoding\n" -msgstr " \\encoding [KODLAMA] istemci dil kodlamasını göster\n" - -#: help.c:301 -#, c-format -msgid " \\password [USERNAME] securely change the password for a user\n" -msgstr " \\password [KULLANICI ADI] kullanıcının parolasını güvenli şekilde değiştir\n" - -#: help.c:304 -#, c-format -msgid "Operating System\n" -msgstr "işletim Sistemi\n" - -#: help.c:305 -#, c-format -msgid " \\cd [DIR] change the current working directory\n" -msgstr " \\cd [DIR] geçerli çalışma dizinini değiştir\n" - -#: help.c:306 -#, c-format -msgid " \\setenv NAME [VALUE] set or unset environment variable\n" -msgstr " \\setenv NAME [VALUE] ortam değişkenini ayarla ya da ayarları sıfırla\n" - -#: help.c:307 -#, c-format -msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" -msgstr " \\timing [on|off] komutların çalışma zamanlamasının gösterilmesini değiştir (şu anda %s)\n" - -#: help.c:309 -#, c-format -msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" -msgstr " \\! [KOMUT] komutu kabukta çalıştır ya da etkileşimli kabuğu başlat\n" - -#: help.c:312 -#, c-format -msgid "Variables\n" -msgstr "Değişkenler\n" - -#: help.c:313 -#, c-format -msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" -msgstr " \\prompt [METİN] AD kullanıcıdan dahili değişkeni değiştirmesini iste\n" - -#: help.c:314 -#, c-format -msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" -msgstr " \\set [AD [DEĞER]] dahili değişkene değer ata, DEĞER boş ise tüm değişkenlerin listesini göster\n" - -#: help.c:315 -#, c-format -msgid " \\unset NAME unset (delete) internal variable\n" -msgstr " \\unset AD dahili değişkenleri sıfırla(sil)\n" - -#: help.c:318 -#, c-format -msgid "Large Objects\n" -msgstr "Large Objectler\n" - -#: help.c:319 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID DOSYA\n" -" \\lo_import DOSYA [YORUM]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operasyonları\n" - -#: help.c:346 -#, c-format -msgid "" -"List of specially treated variables\n" -"\n" -msgstr "" -"Özel değişkenlerin listesi\n" -"\n" - -#: help.c:348 -#, c-format -msgid "psql variables:\n" -msgstr "psql değişkenleri:\n" - -#: help.c:350 -#, c-format -msgid "" -" psql --set=NAME=VALUE\n" -" or \\set NAME VALUE inside psql\n" -"\n" -msgstr "" -" psql --set=NAME=VALUE\n" -" veya psql içinde \\set NAME VALUE\n" -"\n" - -#: help.c:352 -#, c-format -msgid "" -" AUTOCOMMIT\n" -" if set, successful SQL commands are automatically committed\n" -msgstr "" -" AUTOCOMMIT\n" -" ayarlanırsa, başarılı SQL komutları otomatik olarak \"commit\" edilir\n" - -#: help.c:354 -#, c-format -msgid "" -" COMP_KEYWORD_CASE\n" -" determines the case used to complete SQL key words\n" -" [lower, upper, preserve-lower, preserve-upper]\n" -msgstr "" -" COMP_KEYWORD_CASE\n" -" SQL anahtar kelimeleri tamamlanırken kullanılacak büyük/küçük harf seçeneğini belirler\n" -" [lower, upper, preserve-lower, preserve-upper]\n" - -#: help.c:357 -#, c-format -msgid "" -" DBNAME\n" -" the currently connected database name\n" -msgstr "" -" DBNAME\n" -" geçerli durumda bağlanılan veritabanının adı\n" - -#: help.c:359 -#, c-format -msgid "" -" ECHO\n" -" controls what input is written to standard output\n" -" [all, errors, none, queries]\n" -msgstr "" -" ECHO\n" -" hangi girdinin standart çıktıya yazılacağını kontrol eder\n" -" [all, errors, none, queries]\n" - -#: help.c:362 -#, c-format -msgid "" -" ECHO_HIDDEN\n" -" if set, display internal queries executed by backslash commands;\n" -" if set to \"noexec\", just show them without execution\n" -msgstr "" -" ECHO_HIDDEN\n" -" ayarlanırsa ters-taksimli komutlar tarafından çalıştırılan dahili sorguları gösterir ;\n" -" \"noexec\" olarak ayarlanırsa, çalıştırmadan sadece gösterir \n" - -#: help.c:365 -#, c-format -msgid "" -" ENCODING\n" -" current client character set encoding\n" -msgstr "" -" ENCODING\n" -" geçerli istemci karakter kümesi kodlaması\n" - -#: help.c:367 -#, c-format -msgid "" -" ERROR\n" -" true if last query failed, else false\n" -msgstr "" -" ERROR\n" -" son sorgu hatalıysa true, değilse false\n" - -#: help.c:369 -#, c-format -msgid "" -" FETCH_COUNT\n" -" the number of result rows to fetch and display at a time (0 = unlimited)\n" -msgstr "" -" FETCH_COUNT\n" -" bir defada alınacak ve gösterilecek sonuç satırı sayısı ( 0=sınırsız)\n" - -#: help.c:371 -#, c-format -msgid "" -" HIDE_TABLEAM\n" -" if set, table access methods are not displayed\n" -msgstr "" - -#: help.c:373 -#, c-format -msgid "" -" HISTCONTROL\n" -" controls command history [ignorespace, ignoredups, ignoreboth]\n" -msgstr "" -" HISTCONTROL \n" -" komut geçmişini kontrol eder [ignorespace, ignoredups, ignoreboth]\n" - -#: help.c:375 -#, c-format -msgid "" -" HISTFILE\n" -" file name used to store the command history\n" -msgstr "" -" HISTFILE \n" -" komut geçmişini saklamak için kullanılacak dosya adı\n" - -#: help.c:377 -#, fuzzy, c-format -#| msgid "" -#| " HISTSIZE\n" -#| " max number of commands to store in the command history\n" -msgid "" -" HISTSIZE\n" -" maximum number of commands to store in the command history\n" -msgstr "" -" HISTSIZE\n" -" komut geçmişinde saklanacak komut sayısı üst sınırı\n" - -#: help.c:379 -#, c-format -msgid "" -" HOST\n" -" the currently connected database server host\n" -msgstr "" -" HOST\n" -" geçerli durumda bağlanılan veritabanı sunucu makinesi\n" - -#: help.c:381 -#, c-format -msgid "" -" IGNOREEOF\n" -" number of EOFs needed to terminate an interactive session\n" -msgstr "" -" IGNOREEOF\n" -" interaktif bir oturumu sonlandırmak için gereken EOF (dosya sonu) sayısı\n" - -#: help.c:383 -#, c-format -msgid "" -" LASTOID\n" -" value of the last affected OID\n" -msgstr "" -" LASTOID\n" -" etkilenen son OID'nin değeri\n" - -#: help.c:385 -#, c-format -msgid "" -" LAST_ERROR_MESSAGE\n" -" LAST_ERROR_SQLSTATE\n" -" message and SQLSTATE of last error, or empty string and \"00000\" if none\n" -msgstr "" -" LAST_ERROR_MESSAGE\n" -" LAST_ERROR_SQLSTATE\n" -" son hatanın mesajı ve SQLSTATE değeri, veya boş dizgi ve \"00000\" eğer hiçbiri yoksa\n" - -#: help.c:388 -#, 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" -" ayarlanırsa, bir hata bir işlemi (transaction) durdurmaz (örtük kayıt noktaları (savepoint) kullanır)\n" - -#: help.c:390 -#, c-format -msgid "" -" ON_ERROR_STOP\n" -" stop batch execution after error\n" -msgstr "" -" ON_ERROR_STOP\n" -" hata sonrası yığın çalıştırmayı durdurur\n" - -#: help.c:392 -#, c-format -msgid "" -" PORT\n" -" server port of the current connection\n" -msgstr "" -" PORT\n" -" geçerli bağlantının sunucu port'u\n" - -#: help.c:394 -#, c-format -msgid "" -" PROMPT1\n" -" specifies the standard psql prompt\n" -msgstr "" -" PROMPT1\n" -" standart psql komut istemi\n" - -#: help.c:396 -#, c-format -msgid "" -" PROMPT2\n" -" specifies the prompt used when a statement continues from a previous line\n" -msgstr "" -" PROMPT2\n" -" bir komut önceki satırdan beri devam ediyorsa kullanılan komut istemini belirtir\n" - -#: help.c:398 -#, c-format -msgid "" -" PROMPT3\n" -" specifies the prompt used during COPY ... FROM STDIN\n" -msgstr "" -" PROMPT3\n" -" COPY ... FROM STDIN sırasında kullanılan komut istemini belirtir\n" - -#: help.c:400 -#, c-format -msgid "" -" QUIET\n" -" run quietly (same as -q option)\n" -msgstr "" -" QUIET\n" -" sessizce çalış (-q seçeneğiyle aynı)\n" - -#: help.c:402 -#, c-format -msgid "" -" ROW_COUNT\n" -" number of rows returned or affected by last query, or 0\n" -msgstr "" -" ROW_COUNT\n" -" son sorgu tarafından döndürülen veya etkilenen satır sayısı, veya 0\n" - -#: help.c:404 -#, c-format -msgid "" -" SERVER_VERSION_NAME\n" -" SERVER_VERSION_NUM\n" -" server's version (in short string or numeric format)\n" -msgstr "" -" SERVER_VERSION_NAME\n" -" SERVER_VERSION_NUM\n" -" sunucunun sürümü (kısa metin veya sayısal formatta)\n" - -#: help.c:407 -#, c-format -msgid "" -" SHOW_CONTEXT\n" -" controls display of message context fields [never, errors, always]\n" -msgstr "" -" SHOW_CONTEXT\n" -" mesaj bağlam (context) alanlarının gösterimini kontrol eder [never, errors, always]\n" - -#: help.c:409 -#, c-format -msgid "" -" SINGLELINE\n" -" if set, end of line terminates SQL commands (same as -S option)\n" -msgstr "" -" SINGLELINE\n" -" satır sonu SQL komut modunu sonlandırır (-S seçeneğiyle aynı)\n" - -#: help.c:411 -#, c-format -msgid "" -" SINGLESTEP\n" -" single-step mode (same as -s option)\n" -msgstr "" -" SINGLESTEP\n" -" single-step modu (-s seçeneğiyle aynı)\n" - -#: help.c:413 -#, c-format -msgid "" -" SQLSTATE\n" -" SQLSTATE of last query, or \"00000\" if no error\n" -msgstr "" -" SQLSTATE\n" -" son sorgunun SQLSTATE değeri, veya eğer hata yoksa \"00000\"\n" - -#: help.c:415 -#, c-format -msgid "" -" USER\n" -" the currently connected database user\n" -msgstr "" -" USER\n" -" mevcut durumda bağlı veritabanı kullanıcısı\n" - -#: help.c:417 -#, fuzzy, c-format -#| msgid "" -#| " VERBOSITY\n" -#| " controls verbosity of error reports [default, verbose, terse]\n" -msgid "" -" VERBOSITY\n" -" controls verbosity of error reports [default, verbose, terse, sqlstate]\n" -msgstr "" -" VERBOSITY\n" -" hata raporlarının ayrıntı seviyesini kontrol eder [default, verbose, terse]\n" - -#: help.c:419 -#, c-format -msgid "" -" VERSION\n" -" VERSION_NAME\n" -" VERSION_NUM\n" -" psql's version (in verbose string, short string, or numeric format)\n" -msgstr "" -" VERSION\n" -" VERSION_NAME\n" -" VERSION_NUM\n" -" psql'in sürümü (detaylı metin, kısa metin veya sayısal formatta)\n" - -#: help.c:424 -#, c-format -msgid "" -"\n" -"Display settings:\n" -msgstr "" -"\n" -"Görüntüleme ayarları:\n" - -#: help.c:426 -#, c-format -msgid "" -" psql --pset=NAME[=VALUE]\n" -" or \\pset NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" psql --pset=NAME[=VALUE]\n" -" veya psql içinde \\pset NAME [VALUE]\n" -"\n" - -#: help.c:428 -#, c-format -msgid "" -" border\n" -" border style (number)\n" -msgstr "" -" border\n" -" kenar biçimi (number)\n" - -#: help.c:430 -#, c-format -msgid "" -" columns\n" -" target width for the wrapped format\n" -msgstr "" -" columns\n" -" \"wrapped\" biçimi için hedef genişlik\n" - -#: help.c:432 -#, c-format -msgid "" -" expanded (or x)\n" -" expanded output [on, off, auto]\n" -msgstr " expanded (veya x) genişletilmiş çıktı [on, off, auto]\n" - -#: help.c:434 -#, c-format -msgid "" -" fieldsep\n" -" field separator for unaligned output (default \"%s\")\n" -msgstr "" -" fieldsep\n" -" hizalanmamış çıktı için alan ayrıcısı (varsayılan \"%s\")\n" - -#: help.c:437 -#, c-format -msgid "" -" fieldsep_zero\n" -" set field separator for unaligned output to a zero byte\n" -msgstr "" -" fieldsep_zero\n" -" hizalanmamış çıktı için alan ayırıcısını sıfır bayt'a ayarla\n" - -#: help.c:439 -#, c-format -msgid "" -" footer\n" -" enable or disable display of the table footer [on, off]\n" -msgstr "" -" footer\n" -" tablo alt bilgi alanının etkinleştirilme veya devre dışı bırakılması [on, off]\n" - -#: help.c:441 -#, c-format -msgid "" -" format\n" -" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -msgstr "" -" format\n" -" çıktı biçimini ayarla [unaligned, aligned, wrapped, html, asciidoc, ...]\n" - -#: help.c:443 -#, c-format -msgid "" -" linestyle\n" -" set the border line drawing style [ascii, old-ascii, unicode]\n" -msgstr "" -" linestyle\n" -" kenar çizgisi biçimini ayarla [ascii, old-ascii, unicode]\n" - -#: help.c:445 -#, c-format -msgid "" -" null\n" -" set the string to be printed in place of a null value\n" -msgstr "" -" null\n" -" null değer yerine yazılacak dizgeyi ayarla\n" - -#: help.c:447 -#, c-format -msgid "" -" numericlocale\n" -" enable display of a locale-specific character to separate groups of digits\n" -msgstr "" -" numericlocale\n" -" basamak gruplarını ayırmak için yerel-özel bir karakterin gösterilmesini etkinleştir\n" - -#: help.c:449 -#, c-format -msgid "" -" pager\n" -" control when an external pager is used [yes, no, always]\n" -msgstr "" -" pager\n" -" harici sayfalamanın ne zaman kullanılacağını kontrol eder [yes, no, always]\n" - -#: help.c:451 -#, c-format -msgid "" -" recordsep\n" -" record (line) separator for unaligned output\n" -msgstr "" -" recordsep\n" -" hizalanmamış çıktı için kayıt (satır) ayırıcısı\n" - -#: help.c:453 -#, c-format -msgid "" -" recordsep_zero\n" -" set record separator for unaligned output to a zero byte\n" -msgstr "" -" recordsep_zero\n" -" hizalanmamış çıktı için kayıt ayırıcısını sıfır bayt'a ayarla\n" - -#: help.c:455 -#, c-format -msgid "" -" tableattr (or T)\n" -" specify attributes for table tag in html format, or proportional\n" -" column widths for left-aligned data types in latex-longtable format\n" -msgstr "" - -#: help.c:458 -#, c-format -msgid "" -" title\n" -" set the table title for subsequently printed tables\n" -msgstr "" -" title\n" -" sonradan basılan tablolar için tablo başlığını ayarla\n" - -#: help.c:460 -#, c-format -msgid "" -" tuples_only\n" -" if set, only actual table data is shown\n" -msgstr "" -" tuples_only\n" -" ayarlanırsa, sadece gerçek tablo verisi gösterilir\n" - -#: help.c:462 -#, c-format -msgid "" -" unicode_border_linestyle\n" -" unicode_column_linestyle\n" -" unicode_header_linestyle\n" -" set the style of Unicode line drawing [single, double]\n" -msgstr "" -" unicode_border_linestyle\n" -" unicode_column_linestyle\n" -" unicode_header_linestyle\n" -" Unicode çizgi çizme biçimini ayarlar [single, double]\n" - -#: help.c:467 -#, c-format -msgid "" -"\n" -"Environment variables:\n" -msgstr "" -"\n" -"Ortam değişkenleri:\n" - -#: help.c:471 -#, c-format -msgid "" -" NAME=VALUE [NAME=VALUE] psql ...\n" -" or \\setenv NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" NAME=VALUE [NAME=VALUE] psql ...\n" -" veya psql içinde \\setenv NAME [VALUE]\n" -"\n" - -#: help.c:473 -#, c-format -msgid "" -" set NAME=VALUE\n" -" psql ...\n" -" or \\setenv NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" set NAME=VALUE\n" -" psql ...\n" -" veya psql içinde \\setenv NAME [VALUE]\n" -"\n" - -#: help.c:476 -#, c-format -msgid "" -" COLUMNS\n" -" number of columns for wrapped format\n" -msgstr "" -" COLUMNS\n" -" wrapped biçim için sütun sayısı\n" - -#: help.c:478 -#, c-format -msgid "" -" PGAPPNAME\n" -" same as the application_name connection parameter\n" -msgstr "" -" PGAPPNAME\n" -" application_name bağlantı parametresinin aynısı\n" - -#: help.c:480 -#, c-format -msgid "" -" PGDATABASE\n" -" same as the dbname connection parameter\n" -msgstr "" -" PGDATABASE\n" -" dbname bağlantı parametresinin aynı\n" - -#: help.c:482 -#, c-format -msgid "" -" PGHOST\n" -" same as the host connection parameter\n" -msgstr "" -" PGHOST\n" -" host bağlantı parametresinin aynı\n" - -#: help.c:484 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" bağlantı parolası (tavsiye edilmez)\n" - -#: help.c:486 -#, c-format -msgid "" -" PGPASSFILE\n" -" password file name\n" -msgstr "" -" PGPASSFILE\n" -" parola dosya adı\n" - -#: help.c:488 -#, c-format -msgid "" -" PGPORT\n" -" same as the port connection parameter\n" -msgstr "" -" PGPORT\n" -" port bağlantı parametresiyle aynı\n" - -#: help.c:490 -#, c-format -msgid "" -" PGUSER\n" -" same as the user connection parameter\n" -msgstr "" -" PGUSER\n" -" kullanıcı bağlantı parametresiyle aynı\n" - -#: help.c:492 -#, 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, ve \\ev komutları tarafından kullanılan editör\n" - -#: help.c:494 -#, 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" -" editörü çağırırken bir satır numarasının nasıl belirtileceği\n" - -#: help.c:496 -#, c-format -msgid "" -" PSQL_HISTORY\n" -" alternative location for the command history file\n" -msgstr "" -" PSQL_HISTORY\n" -" komut geçmişi dosyası için alternatif konum\n" - -#: help.c:498 -#, c-format -msgid "" -" PSQL_PAGER, PAGER\n" -" name of external pager program\n" -msgstr "" -" PSQL_PAGER, PAGER\n" -" harici sayfalama programının ismi\n" - -#: help.c:500 -#, c-format -msgid "" -" PSQLRC\n" -" alternative location for the user's .psqlrc file\n" -msgstr "" -" PSQLRC\n" -" kulanıcının .psqlrc dosyası için alternatif konum\n" - -#: help.c:502 -#, c-format -msgid "" -" SHELL\n" -" shell used by the \\! command\n" -msgstr "" -" SHELL\n" -" \\! komutu tarafından kullanılan kabuk\n" - -#: help.c:504 -#, c-format -msgid "" -" TMPDIR\n" -" directory for temporary files\n" -msgstr "" -" TMPDIR\n" -" geçici dosyalar için dizin\n" - -#: help.c:548 -msgid "Available help:\n" -msgstr "Yardım:\n" - -#: help.c:636 -#, fuzzy, c-format -#| msgid "" -#| "Command: %s\n" -#| "Description: %s\n" -#| "Syntax:\n" -#| "%s\n" -#| "\n" -msgid "" -"Command: %s\n" -"Description: %s\n" -"Syntax:\n" -"%s\n" -"\n" -"URL: %s\n" -"\n" -msgstr "" -"Komut: %s\n" -"Açıklama: %s\n" -"Söz dizimi:\n" -"%s\n" -"\n" - -#: help.c:655 -#, c-format -msgid "" -"No help available for \"%s\".\n" -"Try \\h with no arguments to see available help.\n" -msgstr "" -"\"%s\" için yardım bulunmamaktadır.\n" -"\\h yazarak yardım konularının listesini görüntüleyin.\n" - -#: input.c:218 -#, c-format -msgid "could not read from input file: %m" -msgstr "girdi dosyası okuma hatası: %m" - -#: input.c:472 input.c:510 -#, fuzzy, c-format -#| msgid "could not save history to file \"%s\": %s\n" -msgid "could not save history to file \"%s\": %m" -msgstr "İşlem geçmişi \"%s\" dosyasına kaydedilemiyor: %s\n" - -#: input.c:529 -#, fuzzy, c-format -#| msgid "history is not supported by this installation\n" -msgid "history is not supported by this installation" -msgstr "bu kurulum işlem geçmişini desteklemiyor\n" - -#: large_obj.c:65 -#, fuzzy, c-format -#| msgid "%s: not connected to a database\n" -msgid "%s: not connected to a database" -msgstr "%s: veritabanına bağlı değil\n" - -#: large_obj.c:84 -#, fuzzy, c-format -#| msgid "%s: current transaction is aborted\n" -msgid "%s: current transaction is aborted" -msgstr "%s: geçerli transaction iptal edildi\n" - -#: large_obj.c:87 -#, fuzzy, c-format -#| msgid "%s: unknown transaction status\n" -msgid "%s: unknown transaction status" -msgstr "%s: bilinmeyen transaction durumu\n" - -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "Large objectler" - -#: mainloop.c:136 -#, fuzzy, c-format -#| msgid "\\if: escaped\n" -msgid "\\if: escaped" -msgstr "\\if: yarıda kesildi(escaped)\n" - -#: mainloop.c:183 -#, c-format -msgid "Use \"\\q\" to leave %s.\n" -msgstr "%s'den çıkmak için \"\\q\" kullanın.\n" - -#: mainloop.c:205 -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" -msgstr "" -"Girdi özel formatta bir PostgreSQL dökümüdür (dump).\n" -"Bu dökümü bir veritabanına geri yüklemek için pg_restore komut satırı istemcisini kullanın.\n" - -#: mainloop.c:282 -msgid "Use \\? for help or press control-C to clear the input buffer." -msgstr "Yardım için \\? yazınız veya input bufffer'ı temzilemek için kontrol-C'ye basınız." - -#: mainloop.c:284 -msgid "Use \\? for help." -msgstr "Yardım için \\? yazınız." - -#: mainloop.c:288 -msgid "You are using psql, the command-line interface to PostgreSQL." -msgstr "PostgreSQL'in komut satırı arabirimi olan psql'i kullanıyorsunuz." - -#: mainloop.c:289 -#, c-format -msgid "" -"Type: \\copyright for distribution terms\n" -" \\h for help with SQL commands\n" -" \\? for help with psql commands\n" -" \\g or terminate with semicolon to execute query\n" -" \\q to quit\n" -msgstr "" -"Komutlar: \\copyright dağıtım koşulları için\n" -" \\h SQL komutları hakkında yardım için\n" -" \\? psql dahili komutlarının yardımı için\n" -" \\g ya da noktalı virgül: sorguyu çalıştırmak için\n" -" \\q çıkmak için\n" - -#: mainloop.c:313 -msgid "Use \\q to quit." -msgstr "Çıkmak için \\q yazınız." - -#: mainloop.c:316 mainloop.c:340 -msgid "Use control-D to quit." -msgstr "Çıkmak için kontrol-D'ye basınız." - -#: mainloop.c:318 mainloop.c:342 -msgid "Use control-C to quit." -msgstr "Çıkmak için kontrol-C'ye basınız." - -#: mainloop.c:449 mainloop.c:591 -#, fuzzy, c-format -#| msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block\n" -msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" -msgstr "\\sorgu yoksayıldı; güncel \\if blokundan çıkmak için \\endif veya Ctrl-C kullanınız\n" - -#: mainloop.c:609 -#, c-format -msgid "reached EOF without finding closing \\endif(s)" -msgstr "" - -#: psqlscanslash.l:638 -#, c-format -msgid "unterminated quoted string" -msgstr "sonuçlandırılmamış tırnakla sınırlandırılmış satır" - -#: psqlscanslash.l:811 -#, fuzzy, c-format -#| msgid "%s: out of memory\n" -msgid "%s: out of memory" -msgstr "%s: yetersiz bellek\n" - -#: 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: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:1258 -#: sql_help.c:1260 sql_help.c:1263 sql_help.c:1266 sql_help.c:1268 -#: sql_help.c:1270 sql_help.c:1273 sql_help.c:1276 sql_help.c:1386 -#: sql_help.c:1388 sql_help.c:1390 sql_help.c:1393 sql_help.c:1414 -#: sql_help.c:1417 sql_help.c:1420 sql_help.c:1423 sql_help.c:1427 -#: sql_help.c:1429 sql_help.c:1431 sql_help.c:1433 sql_help.c:1447 -#: sql_help.c:1450 sql_help.c:1452 sql_help.c:1454 sql_help.c:1464 -#: sql_help.c:1466 sql_help.c:1476 sql_help.c:1478 sql_help.c:1488 -#: sql_help.c:1491 sql_help.c:1513 sql_help.c:1515 sql_help.c:1517 -#: sql_help.c:1520 sql_help.c:1522 sql_help.c:1524 sql_help.c:1527 -#: sql_help.c:1577 sql_help.c:1619 sql_help.c:1622 sql_help.c:1624 -#: sql_help.c:1626 sql_help.c:1628 sql_help.c:1630 sql_help.c:1633 -#: sql_help.c:1683 sql_help.c:1699 sql_help.c:1920 sql_help.c:1989 -#: sql_help.c:2008 sql_help.c:2021 sql_help.c:2078 sql_help.c:2085 -#: sql_help.c:2095 sql_help.c:2115 sql_help.c:2140 sql_help.c:2158 -#: sql_help.c:2187 sql_help.c:2282 sql_help.c:2324 sql_help.c:2347 -#: sql_help.c:2368 sql_help.c:2369 sql_help.c:2406 sql_help.c:2426 -#: sql_help.c:2448 sql_help.c:2462 sql_help.c:2482 sql_help.c:2505 -#: sql_help.c:2535 sql_help.c:2560 sql_help.c:2606 sql_help.c:2884 -#: sql_help.c:2897 sql_help.c:2914 sql_help.c:2930 sql_help.c:2970 -#: sql_help.c:3022 sql_help.c:3026 sql_help.c:3028 sql_help.c:3034 -#: sql_help.c:3052 sql_help.c:3079 sql_help.c:3114 sql_help.c:3126 -#: sql_help.c:3135 sql_help.c:3179 sql_help.c:3193 sql_help.c:3221 -#: sql_help.c:3229 sql_help.c:3237 sql_help.c:3245 sql_help.c:3253 -#: sql_help.c:3261 sql_help.c:3269 sql_help.c:3277 sql_help.c:3286 -#: sql_help.c:3297 sql_help.c:3305 sql_help.c:3313 sql_help.c:3321 -#: sql_help.c:3329 sql_help.c:3339 sql_help.c:3348 sql_help.c:3357 -#: sql_help.c:3365 sql_help.c:3375 sql_help.c:3386 sql_help.c:3394 -#: sql_help.c:3403 sql_help.c:3414 sql_help.c:3423 sql_help.c:3431 -#: sql_help.c:3439 sql_help.c:3447 sql_help.c:3455 sql_help.c:3463 -#: sql_help.c:3471 sql_help.c:3479 sql_help.c:3487 sql_help.c:3495 -#: sql_help.c:3503 sql_help.c:3520 sql_help.c:3529 sql_help.c:3537 -#: sql_help.c:3554 sql_help.c:3569 sql_help.c:3839 sql_help.c:3890 -#: sql_help.c:3919 sql_help.c:3927 sql_help.c:4360 sql_help.c:4408 -#: sql_help.c:4549 -msgid "name" -msgstr "ad" - -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1770 -#: sql_help.c:3194 sql_help.c:4146 -msgid "aggregate_signature" -msgstr "aggregate_imzası" - -#: 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:1267 sql_help.c:1387 -#: sql_help.c:1430 sql_help.c:1451 sql_help.c:1465 sql_help.c:1477 -#: sql_help.c:1490 sql_help.c:1521 sql_help.c:1578 sql_help.c:1627 -msgid "new_name" -msgstr "yeni_adı" - -#: 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:1327 -#: sql_help.c:1389 sql_help.c:1432 sql_help.c:1453 sql_help.c:1516 -#: sql_help.c:1625 sql_help.c:2870 -msgid "new_owner" -msgstr "yeni_sahibi" - -#: 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:1269 sql_help.c:1434 sql_help.c:1455 sql_help.c:1467 -#: sql_help.c:1479 sql_help.c:1523 sql_help.c:1629 -msgid "new_schema" -msgstr "yeni_şema" - -#: sql_help.c:44 sql_help.c:1834 sql_help.c:3195 sql_help.c:4175 -msgid "where aggregate_signature is:" -msgstr "aggregate_imzası şu şekilde olabilir:" - -#: 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:1788 -#: sql_help.c:1805 sql_help.c:1811 sql_help.c:1835 sql_help.c:1838 -#: sql_help.c:1841 sql_help.c:1990 sql_help.c:2009 sql_help.c:2012 -#: sql_help.c:2283 sql_help.c:2483 sql_help.c:3196 sql_help.c:3199 -#: sql_help.c:3202 sql_help.c:3287 sql_help.c:3376 sql_help.c:3404 -#: sql_help.c:3724 sql_help.c:4057 sql_help.c:4152 sql_help.c:4159 -#: sql_help.c:4165 sql_help.c:4176 sql_help.c:4179 sql_help.c:4182 -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:1789 -#: sql_help.c:1806 sql_help.c:1812 sql_help.c:1836 sql_help.c:1839 -#: sql_help.c:1842 sql_help.c:1991 sql_help.c:2010 sql_help.c:2013 -#: sql_help.c:2284 sql_help.c:2484 sql_help.c:3197 sql_help.c:3200 -#: sql_help.c:3203 sql_help.c:3288 sql_help.c:3377 sql_help.c:3405 -#: sql_help.c:4153 sql_help.c:4160 sql_help.c:4166 sql_help.c:4177 -#: sql_help.c:4180 sql_help.c:4183 -msgid "argname" -msgstr "bağımsız değişken adı" - -#: 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:1790 -#: sql_help.c:1807 sql_help.c:1813 sql_help.c:1837 sql_help.c:1840 -#: sql_help.c:1843 sql_help.c:2285 sql_help.c:2485 sql_help.c:3198 -#: sql_help.c:3201 sql_help.c:3204 sql_help.c:3289 sql_help.c:3378 -#: sql_help.c:3406 sql_help.c:4154 sql_help.c:4161 sql_help.c:4167 -#: sql_help.c:4178 sql_help.c:4181 sql_help.c:4184 -#, fuzzy -msgid "argtype" -msgstr "Hedef tipi" - -#: 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:1448 sql_help.c:1572 sql_help.c:1604 -#: sql_help.c:1652 sql_help.c:1891 sql_help.c:1898 sql_help.c:2190 -#: sql_help.c:2232 sql_help.c:2239 sql_help.c:2248 sql_help.c:2325 -#: sql_help.c:2536 sql_help.c:2628 sql_help.c:2899 sql_help.c:3080 -#: sql_help.c:3102 sql_help.c:3590 sql_help.c:3758 sql_help.c:4610 -msgid "option" -msgstr "seçenek" - -#: sql_help.c:113 sql_help.c:927 sql_help.c:1573 sql_help.c:2326 -#: sql_help.c:2537 sql_help.c:3081 -msgid "where option can be:" -msgstr "seçenek şunlar olabilir:" - -#: sql_help.c:114 sql_help.c:2122 -msgid "allowconn" -msgstr "" - -#: sql_help.c:115 sql_help.c:928 sql_help.c:1574 sql_help.c:2123 -#: sql_help.c:2538 sql_help.c:3082 -#, fuzzy -msgid "connlimit" -msgstr "sınırsız" - -#: sql_help.c:116 sql_help.c:2124 -#, fuzzy -msgid "istemplate" -msgstr "Şablon" - -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1272 sql_help.c:1320 -msgid "new_tablespace" -msgstr "yeni_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: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:1581 -#: sql_help.c:1585 sql_help.c:1588 sql_help.c:2295 sql_help.c:2489 -#: sql_help.c:3944 sql_help.c:4349 -msgid "configuration_parameter" -msgstr "yapılandırma_parametresi" - -#: 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:1302 sql_help.c:1322 sql_help.c:1370 -#: sql_help.c:1392 sql_help.c:1449 sql_help.c:1582 sql_help.c:1605 -#: sql_help.c:2191 sql_help.c:2233 sql_help.c:2240 sql_help.c:2249 -#: sql_help.c:2296 sql_help.c:2297 sql_help.c:2356 sql_help.c:2390 -#: sql_help.c:2490 sql_help.c:2491 sql_help.c:2508 sql_help.c:2629 -#: sql_help.c:2659 sql_help.c:2764 sql_help.c:2777 sql_help.c:2791 -#: sql_help.c:2832 sql_help.c:2856 sql_help.c:2873 sql_help.c:2900 -#: sql_help.c:3103 sql_help.c:3759 sql_help.c:4350 sql_help.c:4351 -msgid "value" -msgstr "değer" - -#: sql_help.c:197 -msgid "target_role" -msgstr "hedef_rol" - -#: sql_help.c:198 sql_help.c:2174 sql_help.c:2584 sql_help.c:2589 -#: sql_help.c:3706 sql_help.c:3713 sql_help.c:3727 sql_help.c:3733 -#: sql_help.c:4039 sql_help.c:4046 sql_help.c:4060 sql_help.c:4066 -msgid "schema_name" -msgstr "şema_adı" - -#: sql_help.c:199 -msgid "abbreviated_grant_or_revoke" -msgstr "" - -#: sql_help.c:200 -msgid "where abbreviated_grant_or_revoke is one of:" -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:1271 sql_help.c:1592 sql_help.c:2329 sql_help.c:2330 -#: sql_help.c:2331 sql_help.c:2332 sql_help.c:2333 sql_help.c:2464 -#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2543 sql_help.c:2544 -#: sql_help.c:2545 sql_help.c:3085 sql_help.c:3086 sql_help.c:3087 -#: sql_help.c:3088 sql_help.c:3089 sql_help.c:3740 sql_help.c:3741 -#: sql_help.c:3742 sql_help.c:4040 sql_help.c:4044 sql_help.c:4047 -#: sql_help.c:4049 sql_help.c:4051 sql_help.c:4053 sql_help.c:4055 -#: sql_help.c:4061 sql_help.c:4063 sql_help.c:4065 sql_help.c:4067 -#: sql_help.c:4069 sql_help.c:4071 sql_help.c:4072 sql_help.c:4073 -#: sql_help.c:4370 -msgid "role_name" -msgstr "rol_adı" - -#: sql_help.c:236 sql_help.c:459 sql_help.c:1287 sql_help.c:1289 -#: sql_help.c:1337 sql_help.c:1349 sql_help.c:1374 sql_help.c:1621 -#: sql_help.c:2143 sql_help.c:2147 sql_help.c:2252 sql_help.c:2257 -#: sql_help.c:2351 sql_help.c:2759 sql_help.c:2772 sql_help.c:2786 -#: sql_help.c:2795 sql_help.c:2807 sql_help.c:2836 sql_help.c:3790 -#: sql_help.c:3805 sql_help.c:3807 sql_help.c:4235 sql_help.c:4236 -#: sql_help.c:4245 sql_help.c:4286 sql_help.c:4287 sql_help.c:4288 -#: sql_help.c:4289 sql_help.c:4290 sql_help.c:4291 sql_help.c:4324 -#: sql_help.c:4325 sql_help.c:4330 sql_help.c:4335 sql_help.c:4474 -#: sql_help.c:4475 sql_help.c:4484 sql_help.c:4525 sql_help.c:4526 -#: sql_help.c:4527 sql_help.c:4528 sql_help.c:4529 sql_help.c:4530 -#: sql_help.c:4577 sql_help.c:4579 sql_help.c:4636 sql_help.c:4692 -#: sql_help.c:4693 sql_help.c:4702 sql_help.c:4743 sql_help.c:4744 -#: sql_help.c:4745 sql_help.c:4746 sql_help.c:4747 sql_help.c:4748 -msgid "expression" -msgstr "ifade" - -#: sql_help.c:239 -msgid "domain_constraint" -msgstr "alan(domain)_kısıtlaması" - -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1264 sql_help.c:1308 sql_help.c:1309 sql_help.c:1310 -#: sql_help.c:1336 sql_help.c:1348 sql_help.c:1365 sql_help.c:1776 -#: sql_help.c:1778 sql_help.c:2146 sql_help.c:2251 sql_help.c:2256 -#: sql_help.c:2794 sql_help.c:2806 sql_help.c:3802 -msgid "constraint_name" -msgstr "%kısıtlama_adı" - -#: sql_help.c:244 sql_help.c:1265 -msgid "new_constraint_name" -msgstr "yeni_kısıtlama_adı" - -#: sql_help.c:317 sql_help.c:1073 -msgid "new_version" -msgstr "yeni_sürüm" - -#: sql_help.c:321 sql_help.c:323 -msgid "member_object" -msgstr "üye_nesnesi" - -#: sql_help.c:324 -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:1768 sql_help.c:1773 sql_help.c:1780 -#: sql_help.c:1781 sql_help.c:1782 sql_help.c:1783 sql_help.c:1784 -#: sql_help.c:1785 sql_help.c:1786 sql_help.c:1791 sql_help.c:1793 -#: sql_help.c:1797 sql_help.c:1799 sql_help.c:1803 sql_help.c:1808 -#: sql_help.c:1809 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:1823 sql_help.c:1824 sql_help.c:1825 sql_help.c:1826 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:4142 sql_help.c:4147 -#: sql_help.c:4148 sql_help.c:4149 sql_help.c:4150 sql_help.c:4156 -#: sql_help.c:4157 sql_help.c:4162 sql_help.c:4163 sql_help.c:4168 -#: sql_help.c:4169 sql_help.c:4170 sql_help.c:4171 sql_help.c:4172 -#: sql_help.c:4173 -msgid "object_name" -msgstr "nesne_adı" - -#: sql_help.c:326 sql_help.c:1769 sql_help.c:4145 -msgid "aggregate_name" -msgstr "toplam(aggregate)_adı" - -#: sql_help.c:328 sql_help.c:1771 sql_help.c:2055 sql_help.c:2059 -#: sql_help.c:2061 sql_help.c:3212 -#, fuzzy -msgid "source_type" -msgstr "Kaynak tipi" - -#: sql_help.c:329 sql_help.c:1772 sql_help.c:2056 sql_help.c:2060 -#: sql_help.c:2062 sql_help.c:3213 -#, fuzzy -msgid "target_type" -msgstr "Hedef tipi" - -#: sql_help.c:336 sql_help.c:774 sql_help.c:1787 sql_help.c:2057 -#: sql_help.c:2098 sql_help.c:2161 sql_help.c:2407 sql_help.c:2438 -#: sql_help.c:2976 sql_help.c:4056 sql_help.c:4151 sql_help.c:4264 -#: sql_help.c:4268 sql_help.c:4272 sql_help.c:4275 sql_help.c:4503 -#: sql_help.c:4507 sql_help.c:4511 sql_help.c:4514 sql_help.c:4721 -#: sql_help.c:4725 sql_help.c:4729 sql_help.c:4732 -msgid "function_name" -msgstr "fonksiyon_adı" - -#: sql_help.c:341 sql_help.c:767 sql_help.c:1794 sql_help.c:2431 -msgid "operator_name" -msgstr "operatör_adı" - -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1795 -#: sql_help.c:2408 sql_help.c:3330 -msgid "left_type" -msgstr "sol_argüman_veri_tipi" - -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1796 -#: sql_help.c:2409 sql_help.c:3331 -#, fuzzy -msgid "right_type" -msgstr "Sağ argüman veri tipi" - -#: 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:1354 sql_help.c:1798 sql_help.c:1800 sql_help.c:2428 -#: sql_help.c:2449 sql_help.c:2812 sql_help.c:3340 sql_help.c:3349 -msgid "index_method" -msgstr "index_yöntemi" - -#: sql_help.c:349 sql_help.c:1804 sql_help.c:4158 -msgid "procedure_name" -msgstr "prosedür_adı" - -#: sql_help.c:353 sql_help.c:1810 sql_help.c:3723 sql_help.c:4164 -#, fuzzy -#| msgid "role_name" -msgid "routine_name" -msgstr "rol_adı" - -#: sql_help.c:365 sql_help.c:1326 sql_help.c:1827 sql_help.c:2291 -#: sql_help.c:2488 sql_help.c:2767 sql_help.c:2943 sql_help.c:3511 -#: sql_help.c:3737 sql_help.c:4070 -msgid "type_name" -msgstr "tip_adı" - -#: sql_help.c:366 sql_help.c:1828 sql_help.c:2290 sql_help.c:2487 -#: sql_help.c:2944 sql_help.c:3170 sql_help.c:3512 sql_help.c:3729 -#: sql_help.c:4062 -msgid "lang_name" -msgstr "dil_adı" - -#: sql_help.c:369 -msgid "and aggregate_signature is:" -msgstr "" - -#: sql_help.c:392 sql_help.c:1922 sql_help.c:2188 -msgid "handler_function" -msgstr "işleyici_fonksiyon" - -#: sql_help.c:393 sql_help.c:2189 -msgid "validator_function" -msgstr "doğrulayıcı_fonksiyon" - -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1259 sql_help.c:1514 -msgid "action" -msgstr "hareket" - -#: 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:1261 -#: sql_help.c:1279 sql_help.c:1283 sql_help.c:1284 sql_help.c:1288 -#: sql_help.c:1290 sql_help.c:1291 sql_help.c:1292 sql_help.c:1294 -#: sql_help.c:1297 sql_help.c:1298 sql_help.c:1300 sql_help.c:1303 -#: sql_help.c:1305 sql_help.c:1350 sql_help.c:1352 sql_help.c:1359 -#: sql_help.c:1368 sql_help.c:1373 sql_help.c:1620 sql_help.c:1623 -#: sql_help.c:1660 sql_help.c:1775 sql_help.c:1888 sql_help.c:1894 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:1909 sql_help.c:2230 -#: sql_help.c:2243 sql_help.c:2288 sql_help.c:2350 sql_help.c:2354 -#: sql_help.c:2387 sql_help.c:2614 sql_help.c:2642 sql_help.c:2643 -#: sql_help.c:2750 sql_help.c:2758 sql_help.c:2768 sql_help.c:2771 -#: sql_help.c:2781 sql_help.c:2785 sql_help.c:2808 sql_help.c:2810 -#: sql_help.c:2817 sql_help.c:2830 sql_help.c:2835 sql_help.c:2853 -#: sql_help.c:2979 sql_help.c:3115 sql_help.c:3708 sql_help.c:3709 -#: sql_help.c:3789 sql_help.c:3804 sql_help.c:3806 sql_help.c:3808 -#: sql_help.c:4041 sql_help.c:4042 sql_help.c:4144 sql_help.c:4295 -#: sql_help.c:4534 sql_help.c:4576 sql_help.c:4578 sql_help.c:4580 -#: sql_help.c:4624 sql_help.c:4752 -msgid "column_name" -msgstr "sütun_adı" - -#: sql_help.c:444 sql_help.c:664 sql_help.c:1262 -msgid "new_column_name" -msgstr "yeni_sütun_adı" - -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1278 sql_help.c:1530 -msgid "where action is one of:" -msgstr "hareket aşağıdakilerden birisi olabilir:" - -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1280 -#: sql_help.c:1285 sql_help.c:1532 sql_help.c:1536 sql_help.c:2141 -#: sql_help.c:2231 sql_help.c:2427 sql_help.c:2607 sql_help.c:2751 -#: sql_help.c:3024 sql_help.c:3891 -msgid "data_type" -msgstr "veri_tipi" - -#: sql_help.c:452 sql_help.c:457 sql_help.c:1281 sql_help.c:1286 -#: sql_help.c:1533 sql_help.c:1537 sql_help.c:2142 sql_help.c:2234 -#: sql_help.c:2352 sql_help.c:2752 sql_help.c:2760 sql_help.c:2773 -#: sql_help.c:2787 sql_help.c:3025 sql_help.c:3031 sql_help.c:3799 -msgid "collation" -msgstr "sıralama (collation)" - -#: sql_help.c:453 sql_help.c:1282 sql_help.c:2235 sql_help.c:2244 -#: sql_help.c:2753 sql_help.c:2769 sql_help.c:2782 -msgid "column_constraint" -msgstr "kolon_kısıtlaması" - -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1299 -msgid "integer" -msgstr "tamsayı" - -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1301 -#: sql_help.c:1304 -msgid "attribute_option" -msgstr "özellik_seçeneği" - -#: sql_help.c:473 sql_help.c:1306 sql_help.c:2236 sql_help.c:2245 -#: sql_help.c:2754 sql_help.c:2770 sql_help.c:2783 -msgid "table_constraint" -msgstr "tablo_kısıtlaması" - -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1311 -#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1829 -msgid "trigger_name" -msgstr "tetikleyici_adı" - -#: sql_help.c:480 sql_help.c:481 sql_help.c:1324 sql_help.c:1325 -#: sql_help.c:2237 sql_help.c:2242 sql_help.c:2757 sql_help.c:2780 -msgid "parent_table" -msgstr "üst_tablo" - -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1493 sql_help.c:2173 -msgid "extension_name" -msgstr "uzantı_adı" - -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2292 -msgid "execution_cost" -msgstr "execution_cost" - -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2293 -msgid "result_rows" -msgstr "sonuç_satırları" - -#: sql_help.c:543 sql_help.c:2294 -#, fuzzy -#| msgid "start_function" -msgid "support_function" -msgstr "başlangıç_fonksiyonu" - -#: 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:1571 sql_help.c:1579 -#: sql_help.c:1583 sql_help.c:1586 sql_help.c:1589 sql_help.c:2585 -#: sql_help.c:2587 sql_help.c:2590 sql_help.c:2591 sql_help.c:3707 -#: sql_help.c:3711 sql_help.c:3714 sql_help.c:3716 sql_help.c:3718 -#: sql_help.c:3720 sql_help.c:3722 sql_help.c:3728 sql_help.c:3730 -#: sql_help.c:3732 sql_help.c:3734 sql_help.c:3736 sql_help.c:3738 -msgid "role_specification" -msgstr "rol_tanımlaması" - -#: sql_help.c:565 sql_help.c:567 sql_help.c:1602 sql_help.c:2116 -#: sql_help.c:2593 sql_help.c:3100 sql_help.c:3545 sql_help.c:4380 -msgid "user_name" -msgstr "kullanıcı_adı" - -#: sql_help.c:568 sql_help.c:945 sql_help.c:1591 sql_help.c:2592 -#: sql_help.c:3739 -msgid "where role_specification can be:" -msgstr "rol tanımlaması şunlar olabilir:" - -#: sql_help.c:570 -msgid "group_name" -msgstr "grup_adı" - -#: sql_help.c:591 sql_help.c:1371 sql_help.c:2121 sql_help.c:2357 -#: sql_help.c:2391 sql_help.c:2765 sql_help.c:2778 sql_help.c:2792 -#: sql_help.c:2833 sql_help.c:2857 sql_help.c:2869 sql_help.c:3735 -#: sql_help.c:4068 -msgid "tablespace_name" -msgstr "tablespace_adı" - -#: sql_help.c:593 sql_help.c:681 sql_help.c:1319 sql_help.c:1328 -#: sql_help.c:1366 sql_help.c:1709 -msgid "index_name" -msgstr "index_adı" - -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1321 -#: sql_help.c:1323 sql_help.c:1369 sql_help.c:2355 sql_help.c:2389 -#: sql_help.c:2763 sql_help.c:2776 sql_help.c:2790 sql_help.c:2831 -#: sql_help.c:2855 -msgid "storage_parameter" -msgstr "saklama_parametresi" - -#: sql_help.c:602 -msgid "column_number" -msgstr "sütun_sayısı" - -#: sql_help.c:626 sql_help.c:1792 sql_help.c:4155 -msgid "large_object_oid" -msgstr "büyük_nesne_oid" - -#: sql_help.c:713 sql_help.c:2412 -msgid "res_proc" -msgstr "res_proc" - -#: sql_help.c:714 sql_help.c:2413 -msgid "join_proc" -msgstr "join_proc" - -#: sql_help.c:766 sql_help.c:778 sql_help.c:2430 -msgid "strategy_number" -msgstr "strateji_sayısı" - -#: 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:2432 sql_help.c:2433 -#: sql_help.c:2436 sql_help.c:2437 -msgid "op_type" -msgstr "operatör_tipi" - -#: sql_help.c:770 sql_help.c:2434 -msgid "sort_family_name" -msgstr "sıralama_family_adı" - -#: sql_help.c:771 sql_help.c:781 sql_help.c:2435 -msgid "support_number" -msgstr "destek_numarası" - -#: sql_help.c:775 sql_help.c:2058 sql_help.c:2439 sql_help.c:2946 -#: sql_help.c:2948 -msgid "argument_type" -msgstr "bağımsız_değişken_tipi" - -#: 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:1489 sql_help.c:1492 -#: sql_help.c:1659 sql_help.c:1708 sql_help.c:1777 sql_help.c:1802 -#: sql_help.c:1815 sql_help.c:1830 sql_help.c:1887 sql_help.c:1893 -#: sql_help.c:2229 sql_help.c:2241 sql_help.c:2348 sql_help.c:2386 -#: sql_help.c:2463 sql_help.c:2506 sql_help.c:2562 sql_help.c:2613 -#: sql_help.c:2644 sql_help.c:2749 sql_help.c:2766 sql_help.c:2779 -#: sql_help.c:2852 sql_help.c:2972 sql_help.c:3149 sql_help.c:3366 -#: sql_help.c:3415 sql_help.c:3521 sql_help.c:3705 sql_help.c:3710 -#: sql_help.c:3755 sql_help.c:3787 sql_help.c:4038 sql_help.c:4043 -#: sql_help.c:4143 sql_help.c:4250 sql_help.c:4252 sql_help.c:4301 -#: sql_help.c:4340 sql_help.c:4489 sql_help.c:4491 sql_help.c:4540 -#: sql_help.c:4574 sql_help.c:4623 sql_help.c:4707 sql_help.c:4709 -#: sql_help.c:4758 -msgid "table_name" -msgstr "tablo_adı" - -#: sql_help.c:811 sql_help.c:2465 -msgid "using_expression" -msgstr "using_ifadesi" - -#: sql_help.c:812 sql_help.c:2466 -msgid "check_expression" -msgstr "check_ifadesi" - -#: sql_help.c:886 sql_help.c:2507 -msgid "publication_parameter" -msgstr "yayın_parametresi" - -#: sql_help.c:929 sql_help.c:1575 sql_help.c:2327 sql_help.c:2539 -#: sql_help.c:3083 -msgid "password" -msgstr "parola" - -#: sql_help.c:930 sql_help.c:1576 sql_help.c:2328 sql_help.c:2540 -#: sql_help.c:3084 -msgid "timestamp" -msgstr "timestamp" - -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1580 -#: sql_help.c:1584 sql_help.c:1587 sql_help.c:1590 sql_help.c:3715 -#: sql_help.c:4048 -msgid "database_name" -msgstr "veritabanı_adı" - -#: sql_help.c:1048 sql_help.c:2608 -msgid "increment" -msgstr "artım" - -#: sql_help.c:1049 sql_help.c:2609 -msgid "minvalue" -msgstr "en düşük değer" - -#: sql_help.c:1050 sql_help.c:2610 -msgid "maxvalue" -msgstr "en yüksek değer" - -#: sql_help.c:1051 sql_help.c:2611 sql_help.c:4248 sql_help.c:4338 -#: sql_help.c:4487 sql_help.c:4640 sql_help.c:4705 -msgid "start" -msgstr "başlat" - -#: sql_help.c:1052 sql_help.c:1296 -msgid "restart" -msgstr "yeniden başlat" - -#: sql_help.c:1053 sql_help.c:2612 -msgid "cache" -msgstr "önbellek" - -#: sql_help.c:1110 sql_help.c:2656 -msgid "conninfo" -msgstr "conninfo" - -#: sql_help.c:1112 sql_help.c:2657 -msgid "publication_name" -msgstr "yayın_adı" - -#: sql_help.c:1113 -#, fuzzy -msgid "set_publication_option" -msgstr "set_publication_option" - -#: sql_help.c:1116 -msgid "refresh_option" -msgstr "tazeleme_seçeneği" - -#: sql_help.c:1121 sql_help.c:2658 -msgid "subscription_parameter" -msgstr "abonelik_parametresi" - -#: sql_help.c:1274 sql_help.c:1277 -msgid "partition_name" -msgstr "bölümleme(partition)_adı" - -#: sql_help.c:1275 sql_help.c:2246 sql_help.c:2784 -msgid "partition_bound_spec" -msgstr "" - -#: sql_help.c:1293 sql_help.c:1340 sql_help.c:2798 -msgid "sequence_options" -msgstr "sequence_seçenekleri" - -#: sql_help.c:1295 -msgid "sequence_option" -msgstr "sequence_seçeneği" - -#: sql_help.c:1307 -msgid "table_constraint_using_index" -msgstr "ve indeks_kullanan_tablo_kısıtlaması şöyledir:" - -#: sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 sql_help.c:1318 -msgid "rewrite_rule_name" -msgstr "rewrite_kural_adı" - -#: sql_help.c:1329 sql_help.c:2823 -msgid "and partition_bound_spec is:" -msgstr "ve partition_bound_spec şöyledir:" - -#: sql_help.c:1330 sql_help.c:1331 sql_help.c:1332 sql_help.c:2824 -#: sql_help.c:2825 sql_help.c:2826 -#, fuzzy -#| msgid "and partition_bound_spec is:" -msgid "partition_bound_expr" -msgstr "ve partition_bound_spec şöyledir:" - -#: sql_help.c:1333 sql_help.c:1334 sql_help.c:2827 sql_help.c:2828 -msgid "numeric_literal" -msgstr "sayısal_sabit" - -#: sql_help.c:1335 -msgid "and column_constraint is:" -msgstr "ve kolon_kısıtlaması şöyledir :" - -#: sql_help.c:1338 sql_help.c:2253 sql_help.c:2286 sql_help.c:2486 -#: sql_help.c:2796 -msgid "default_expr" -msgstr "öntanımlı_ifade" - -#: sql_help.c:1339 sql_help.c:2254 sql_help.c:2797 -msgid "generation_expr" -msgstr "" - -#: sql_help.c:1341 sql_help.c:1342 sql_help.c:1351 sql_help.c:1353 -#: sql_help.c:1357 sql_help.c:2799 sql_help.c:2800 sql_help.c:2809 -#: sql_help.c:2811 sql_help.c:2815 -msgid "index_parameters" -msgstr "indeks_parametreleri" - -#: sql_help.c:1343 sql_help.c:1360 sql_help.c:2801 sql_help.c:2818 -msgid "reftable" -msgstr "referans tablosu" - -#: sql_help.c:1344 sql_help.c:1361 sql_help.c:2802 sql_help.c:2819 -msgid "refcolumn" -msgstr "referans kolonu" - -#: sql_help.c:1345 sql_help.c:1346 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:2803 sql_help.c:2804 sql_help.c:2820 sql_help.c:2821 -#, fuzzy -#| msgid "initial_condition" -msgid "referential_action" -msgstr "ilk_durum" - -#: sql_help.c:1347 sql_help.c:2255 sql_help.c:2805 -msgid "and table_constraint is:" -msgstr "ve tablo_kısıtlaması şöyledir:" - -#: sql_help.c:1355 sql_help.c:2813 -msgid "exclude_element" -msgstr "hariçtutma(ecxlude)_öğesi" - -#: sql_help.c:1356 sql_help.c:2814 sql_help.c:4246 sql_help.c:4336 -#: sql_help.c:4485 sql_help.c:4638 sql_help.c:4703 -msgid "operator" -msgstr "operatör" - -#: sql_help.c:1358 sql_help.c:2358 sql_help.c:2816 -msgid "predicate" -msgstr "yüklem (predicate)" - -#: sql_help.c:1364 -msgid "and table_constraint_using_index is:" -msgstr "ve indeks_kullanan_tablo_kısıtlaması şöyledir:" - -#: sql_help.c:1367 sql_help.c:2829 -msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "UNIQUE, PRIMARY KEY ve EXCLUDE kısıtlamalarında index_parametreleri şunlar olabilir:" - -#: sql_help.c:1372 sql_help.c:2834 -msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "" - -#: sql_help.c:1375 sql_help.c:2353 sql_help.c:2761 sql_help.c:2774 -#: sql_help.c:2788 sql_help.c:2837 sql_help.c:3800 -msgid "opclass" -msgstr "opclass" - -#: sql_help.c:1391 sql_help.c:1394 sql_help.c:2872 -msgid "tablespace_option" -msgstr "tablespace_seçeneği" - -#: sql_help.c:1415 sql_help.c:1418 sql_help.c:1424 sql_help.c:1428 -msgid "token_type" -msgstr "token_tipi" - -#: sql_help.c:1416 sql_help.c:1419 -msgid "dictionary_name" -msgstr "sözlük_adı" - -#: sql_help.c:1421 sql_help.c:1425 -msgid "old_dictionary" -msgstr "eski_sözlük" - -#: sql_help.c:1422 sql_help.c:1426 -msgid "new_dictionary" -msgstr "yeni_sözlük" - -#: sql_help.c:1518 sql_help.c:1531 sql_help.c:1534 sql_help.c:1535 -#: sql_help.c:3023 -msgid "attribute_name" -msgstr "özellik_adı" - -#: sql_help.c:1519 -msgid "new_attribute_name" -msgstr "yeni_özellik_adı" - -#: sql_help.c:1525 sql_help.c:1529 -msgid "new_enum_value" -msgstr "yeni_enum_değeri" - -#: sql_help.c:1526 -msgid "neighbor_enum_value" -msgstr "komşu_enum_değeri" - -#: sql_help.c:1528 -msgid "existing_enum_value" -msgstr "mevcut_enum_değeri" - -#: sql_help.c:1603 sql_help.c:2238 sql_help.c:2247 sql_help.c:2624 -#: sql_help.c:3101 sql_help.c:3546 sql_help.c:3721 sql_help.c:3756 -#: sql_help.c:4054 -msgid "server_name" -msgstr "sunucu_adı" - -#: sql_help.c:1631 sql_help.c:1634 sql_help.c:3116 -msgid "view_option_name" -msgstr "seçenek_adı_görüntüle" - -#: sql_help.c:1632 sql_help.c:3117 -msgid "view_option_value" -msgstr "seçenek_değeri_görüntüle" - -#: sql_help.c:1653 sql_help.c:1654 sql_help.c:4611 sql_help.c:4612 -msgid "table_and_columns" -msgstr "tablolar_ve_sütunlar" - -#: sql_help.c:1655 sql_help.c:1899 sql_help.c:3593 sql_help.c:4613 -msgid "where option can be one of:" -msgstr "seçenek aşağıdakilerden birisi olabilir:" - -#: sql_help.c:1656 sql_help.c:1657 sql_help.c:1901 sql_help.c:1904 -#: sql_help.c:2083 sql_help.c:3594 sql_help.c:3595 sql_help.c:3596 -#: sql_help.c:3597 sql_help.c:3598 sql_help.c:3599 sql_help.c:3600 -#: sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 sql_help.c:4617 -#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 -msgid "boolean" -msgstr "boolean" - -#: sql_help.c:1658 sql_help.c:4622 -msgid "and table_and_columns is:" -msgstr "ve tablolar_ve_sütunlar şöyledir:" - -#: sql_help.c:1674 sql_help.c:4396 sql_help.c:4398 sql_help.c:4422 -msgid "transaction_mode" -msgstr "transaction_modu" - -#: sql_help.c:1675 sql_help.c:4399 sql_help.c:4423 -msgid "where transaction_mode is one of:" -msgstr "transaction_modu aşağıdakilerden birisi olabilir:" - -#: sql_help.c:1684 sql_help.c:4256 sql_help.c:4265 sql_help.c:4269 -#: sql_help.c:4273 sql_help.c:4276 sql_help.c:4495 sql_help.c:4504 -#: sql_help.c:4508 sql_help.c:4512 sql_help.c:4515 sql_help.c:4713 -#: sql_help.c:4722 sql_help.c:4726 sql_help.c:4730 sql_help.c:4733 -msgid "argument" -msgstr "bağımsız değişken" - -#: sql_help.c:1774 -msgid "relation_name" -msgstr "nesne_adı" - -#: sql_help.c:1779 sql_help.c:3717 sql_help.c:4050 -msgid "domain_name" -msgstr "domain_adı" - -#: sql_help.c:1801 -msgid "policy_name" -msgstr "ilke(policy)_adı" - -#: sql_help.c:1814 -msgid "rule_name" -msgstr "kural_adı" - -#: sql_help.c:1833 -msgid "text" -msgstr "metin" - -#: sql_help.c:1858 sql_help.c:3900 sql_help.c:4088 -msgid "transaction_id" -msgstr "işlem(transaction)_id" - -#: sql_help.c:1889 sql_help.c:1896 sql_help.c:3826 -msgid "filename" -msgstr "dosyaadı" - -#: sql_help.c:1890 sql_help.c:1897 sql_help.c:2564 sql_help.c:2565 -#: sql_help.c:2566 -msgid "command" -msgstr "komut" - -#: sql_help.c:1892 sql_help.c:2563 sql_help.c:2975 sql_help.c:3152 -#: sql_help.c:3810 sql_help.c:4239 sql_help.c:4241 sql_help.c:4329 -#: sql_help.c:4331 sql_help.c:4478 sql_help.c:4480 sql_help.c:4583 -#: sql_help.c:4696 sql_help.c:4698 -msgid "condition" -msgstr "şart" - -#: sql_help.c:1895 sql_help.c:2392 sql_help.c:2858 sql_help.c:3118 -#: sql_help.c:3136 sql_help.c:3791 -msgid "query" -msgstr "sorgu" - -#: sql_help.c:1900 -msgid "format_name" -msgstr "biçim(format)_adı" - -#: sql_help.c:1902 -msgid "delimiter_character" -msgstr "ayrıştırıcı_karakteri" - -#: sql_help.c:1903 -msgid "null_string" -msgstr "null_dizi" - -#: sql_help.c:1905 -msgid "quote_character" -msgstr " quote_karakteri" - -#: sql_help.c:1906 -msgid "escape_character" -msgstr "kaçış(escape)_karakteri" - -#: sql_help.c:1910 -msgid "encoding_name" -msgstr "dilkodlaması_adı" - -#: sql_help.c:1921 -msgid "access_method_type" -msgstr "erişim_yöntemi_tipi" - -#: sql_help.c:1992 sql_help.c:2011 sql_help.c:2014 -msgid "arg_data_type" -msgstr "arg_veri_tipi" - -#: sql_help.c:1993 sql_help.c:2015 sql_help.c:2023 -msgid "sfunc" -msgstr "sfunc" - -#: sql_help.c:1994 sql_help.c:2016 sql_help.c:2024 -msgid "state_data_type" -msgstr "durum(state)_veri_tipi" - -#: sql_help.c:1995 sql_help.c:2017 sql_help.c:2025 -msgid "state_data_size" -msgstr "durum(state)_veri_boyutu" - -#: sql_help.c:1996 sql_help.c:2018 sql_help.c:2026 -msgid "ffunc" -msgstr "ffunc" - -#: sql_help.c:1997 sql_help.c:2027 -msgid "combinefunc" -msgstr "" - -#: sql_help.c:1998 sql_help.c:2028 -msgid "serialfunc" -msgstr "serialfunc" - -#: sql_help.c:1999 sql_help.c:2029 -msgid "deserialfunc" -msgstr "deserialfunc" - -#: sql_help.c:2000 sql_help.c:2019 sql_help.c:2030 -msgid "initial_condition" -msgstr "ilk_durum" - -#: sql_help.c:2001 sql_help.c:2031 -msgid "msfunc" -msgstr "msfunc" - -#: sql_help.c:2002 sql_help.c:2032 -msgid "minvfunc" -msgstr "en düşük değer fonksiyonu (minvfunc)" - -#: sql_help.c:2003 sql_help.c:2033 -msgid "mstate_data_type" -msgstr "mstate_veri_tipi" - -#: sql_help.c:2004 sql_help.c:2034 -msgid "mstate_data_size" -msgstr "mstate_veri_boyutu" - -#: sql_help.c:2005 sql_help.c:2035 -msgid "mffunc" -msgstr "mffunc" - -#: sql_help.c:2006 sql_help.c:2036 -#, fuzzy -#| msgid "initial_condition" -msgid "minitial_condition" -msgstr "ilk_durum" - -#: sql_help.c:2007 sql_help.c:2037 -msgid "sort_operator" -msgstr "sıralama(sort)_operatörü" - -#: sql_help.c:2020 -msgid "or the old syntax" -msgstr "ya da eski sözdizimi" - -#: sql_help.c:2022 -#, fuzzy -msgid "base_type" -msgstr "Hedef tipi" - -#: sql_help.c:2079 -msgid "locale" -msgstr "yerel ayar" - -#: sql_help.c:2080 sql_help.c:2119 -msgid "lc_collate" -msgstr "lc_collate" - -#: sql_help.c:2081 sql_help.c:2120 -msgid "lc_ctype" -msgstr "lc_ctype" - -#: sql_help.c:2082 sql_help.c:4141 -msgid "provider" -msgstr "sağlayıcı" - -#: sql_help.c:2084 sql_help.c:2175 -msgid "version" -msgstr "sürüm" - -#: sql_help.c:2086 -msgid "existing_collation" -msgstr "mevcut_sıralama(collation)" - -#: sql_help.c:2096 -msgid "source_encoding" -msgstr "kaynak_dil kodlaması" - -#: sql_help.c:2097 -msgid "dest_encoding" -msgstr "hedef_dil kodlaması" - -#: sql_help.c:2117 sql_help.c:2898 -msgid "template" -msgstr "şablon" - -#: sql_help.c:2118 -msgid "encoding" -msgstr "dil kodlaması" - -#: sql_help.c:2144 -msgid "constraint" -msgstr "kısıtlama" - -#: sql_help.c:2145 -msgid "where constraint is:" -msgstr "kısıtlama şu şekilde olabilir:" - -#: sql_help.c:2159 sql_help.c:2561 sql_help.c:2971 -msgid "event" -msgstr "olay" - -#: sql_help.c:2160 -msgid "filter_variable" -msgstr "filtre_değişkeni" - -#: sql_help.c:2176 -msgid "old_version" -msgstr "eski_sürüm" - -#: sql_help.c:2250 sql_help.c:2793 -msgid "where column_constraint is:" -msgstr "kolon_kısıtlaması aşağıdakilerden birisi olabilir:" - -#: sql_help.c:2287 -msgid "rettype" -msgstr "dönüş tipi" - -#: sql_help.c:2289 -msgid "column_type" -msgstr "kolon_tipi" - -#: sql_help.c:2298 sql_help.c:2492 -msgid "definition" -msgstr "tanımı" - -#: sql_help.c:2299 sql_help.c:2493 -msgid "obj_file" -msgstr "obj_file" - -#: sql_help.c:2300 sql_help.c:2494 -msgid "link_symbol" -msgstr "link_sembolü" - -#: sql_help.c:2334 sql_help.c:2546 sql_help.c:3090 -msgid "uid" -msgstr "kullanıcı numarası" - -#: sql_help.c:2349 sql_help.c:2388 sql_help.c:2762 sql_help.c:2775 -#: sql_help.c:2789 sql_help.c:2854 -msgid "method" -msgstr "yöntem" - -#: sql_help.c:2370 -msgid "call_handler" -msgstr "call_handler" - -#: sql_help.c:2371 -msgid "inline_handler" -msgstr "inline_handler" - -#: sql_help.c:2372 -msgid "valfunction" -msgstr "valfunction" - -#: sql_help.c:2410 -msgid "com_op" -msgstr "com_op" - -#: sql_help.c:2411 -msgid "neg_op" -msgstr "neg_op" - -#: sql_help.c:2429 -msgid "family_name" -msgstr "family_name" - -#: sql_help.c:2440 -msgid "storage_type" -msgstr "saklama_tipi" - -#: sql_help.c:2567 sql_help.c:2978 -msgid "where event can be one of:" -msgstr "olay (event) aşağıdakilerden birisi olabilir:" - -#: sql_help.c:2586 sql_help.c:2588 -msgid "schema_element" -msgstr "şema_elemanı" - -#: sql_help.c:2625 -msgid "server_type" -msgstr "sunucu_tipi" - -#: sql_help.c:2626 -msgid "server_version" -msgstr "sunucu_sürümü" - -#: sql_help.c:2627 sql_help.c:3719 sql_help.c:4052 -msgid "fdw_name" -msgstr "fdw_adı" - -#: sql_help.c:2640 -msgid "statistics_name" -msgstr "istatistik_adı" - -#: sql_help.c:2641 -msgid "statistics_kind" -msgstr "istatistik_tipi" - -#: sql_help.c:2655 -msgid "subscription_name" -msgstr "abonelik_adı(subsciption)" - -#: sql_help.c:2755 -msgid "source_table" -msgstr "kaynak_tablo" - -#: sql_help.c:2756 -msgid "like_option" -msgstr "like_seçeneği" - -#: sql_help.c:2822 -msgid "and like_option is:" -msgstr "like_seçeneği şu olabilir:" - -#: sql_help.c:2871 -msgid "directory" -msgstr "dizin" - -#: sql_help.c:2885 -msgid "parser_name" -msgstr "ayrıştırıcı_adı" - -#: sql_help.c:2886 -msgid "source_config" -msgstr "source_config" - -#: sql_help.c:2915 -msgid "start_function" -msgstr "başlangıç_fonksiyonu" - -#: sql_help.c:2916 -msgid "gettoken_function" -msgstr "gettoken_fonksiyonu" - -#: sql_help.c:2917 -msgid "end_function" -msgstr "end_fonksiyonu" - -#: sql_help.c:2918 -msgid "lextypes_function" -msgstr "lextypes_fonksiyonu" - -#: sql_help.c:2919 -#, fuzzy -msgid "headline_function" -msgstr "fonksiyon" - -#: sql_help.c:2931 -msgid "init_function" -msgstr "ilkendirme_fonksiyonu" - -#: sql_help.c:2932 -msgid "lexize_function" -msgstr "lexize_fonksiyonu" - -#: sql_help.c:2945 -msgid "from_sql_function_name" -msgstr "from_sql_fonksiyon_adı" - -#: sql_help.c:2947 -msgid "to_sql_function_name" -msgstr "to_sql_fonksiyon_adı" - -#: sql_help.c:2973 -msgid "referenced_table_name" -msgstr "referans_edilen_tablo_adı" - -#: sql_help.c:2974 -#, fuzzy -msgid "transition_relation_name" -msgstr "dil_adı" - -#: sql_help.c:2977 -msgid "arguments" -msgstr "argümanlar" - -#: sql_help.c:3027 sql_help.c:4174 -msgid "label" -msgstr "etiket" - -#: sql_help.c:3029 -msgid "subtype" -msgstr "alttip" - -#: sql_help.c:3030 -msgid "subtype_operator_class" -msgstr "alttip_operatör_sınıfı" - -#: sql_help.c:3032 -msgid "canonical_function" -msgstr "canonical_fonksiyon" - -#: sql_help.c:3033 -msgid "subtype_diff_function" -msgstr "subtype-diff_fonksiyonu" - -#: sql_help.c:3035 -msgid "input_function" -msgstr "giriş_fonksiyonu" - -#: sql_help.c:3036 -msgid "output_function" -msgstr "çıktı_fonksiyonu" - -#: sql_help.c:3037 -msgid "receive_function" -msgstr "alma_fonksiyonu" - -#: sql_help.c:3038 -msgid "send_function" -msgstr "gönderme_fonksiyonu" - -#: sql_help.c:3039 -msgid "type_modifier_input_function" -msgstr "type_modifier_input_function" - -#: sql_help.c:3040 -msgid "type_modifier_output_function" -msgstr "type_modifier_output_function" - -#: sql_help.c:3041 -msgid "analyze_function" -msgstr "analiz_fonksiyonu" - -#: sql_help.c:3042 -msgid "internallength" -msgstr "internallength" - -#: sql_help.c:3043 -msgid "alignment" -msgstr "hizalama" - -#: sql_help.c:3044 -msgid "storage" -msgstr "saklama" - -#: sql_help.c:3045 -msgid "like_type" -msgstr "like_type" - -#: sql_help.c:3046 -msgid "category" -msgstr "category" - -#: sql_help.c:3047 -msgid "preferred" -msgstr "tercih edilen" - -#: sql_help.c:3048 -msgid "default" -msgstr "öntanımlı" - -#: sql_help.c:3049 -msgid "element" -msgstr "öğe" - -#: sql_help.c:3050 -msgid "delimiter" -msgstr "sınırlayıcı" - -#: sql_help.c:3051 -msgid "collatable" -msgstr "sıralanabilir" - -#: sql_help.c:3148 sql_help.c:3786 sql_help.c:4234 sql_help.c:4323 -#: sql_help.c:4473 sql_help.c:4573 sql_help.c:4691 -msgid "with_query" -msgstr "with_sorgusu" - -#: sql_help.c:3150 sql_help.c:3788 sql_help.c:4253 sql_help.c:4259 -#: sql_help.c:4262 sql_help.c:4266 sql_help.c:4270 sql_help.c:4278 -#: sql_help.c:4492 sql_help.c:4498 sql_help.c:4501 sql_help.c:4505 -#: sql_help.c:4509 sql_help.c:4517 sql_help.c:4575 sql_help.c:4710 -#: sql_help.c:4716 sql_help.c:4719 sql_help.c:4723 sql_help.c:4727 -#: sql_help.c:4735 -msgid "alias" -msgstr "takma ad" - -#: sql_help.c:3151 -msgid "using_list" -msgstr "using_list" - -#: sql_help.c:3153 sql_help.c:3626 sql_help.c:3867 sql_help.c:4584 -msgid "cursor_name" -msgstr "imleç_adı" - -#: sql_help.c:3154 sql_help.c:3794 sql_help.c:4585 -msgid "output_expression" -msgstr "çıktı_ifadesi" - -#: sql_help.c:3155 sql_help.c:3795 sql_help.c:4237 sql_help.c:4326 -#: sql_help.c:4476 sql_help.c:4586 sql_help.c:4694 -msgid "output_name" -msgstr "output_name" - -#: sql_help.c:3171 -msgid "code" -msgstr "kod" - -#: sql_help.c:3570 -msgid "parameter" -msgstr "değişken" - -#: sql_help.c:3591 sql_help.c:3592 sql_help.c:3892 -msgid "statement" -msgstr "ifade" - -#: sql_help.c:3625 sql_help.c:3866 -msgid "direction" -msgstr "yön" - -#: sql_help.c:3627 sql_help.c:3868 -msgid "where direction can be empty or one of:" -msgstr "yön boş ya da şunlardan biri olabilir:" - -#: sql_help.c:3628 sql_help.c:3629 sql_help.c:3630 sql_help.c:3631 -#: sql_help.c:3632 sql_help.c:3869 sql_help.c:3870 sql_help.c:3871 -#: sql_help.c:3872 sql_help.c:3873 sql_help.c:4247 sql_help.c:4249 -#: sql_help.c:4337 sql_help.c:4339 sql_help.c:4486 sql_help.c:4488 -#: sql_help.c:4639 sql_help.c:4641 sql_help.c:4704 sql_help.c:4706 -msgid "count" -msgstr "toplam sayı" - -#: sql_help.c:3712 sql_help.c:4045 -msgid "sequence_name" -msgstr "sequence_adı" - -#: sql_help.c:3725 sql_help.c:4058 -msgid "arg_name" -msgstr "arg_adı" - -#: sql_help.c:3726 sql_help.c:4059 -msgid "arg_type" -msgstr "bağımsız_değişken_tipi" - -#: sql_help.c:3731 sql_help.c:4064 -msgid "loid" -msgstr "" - -#: sql_help.c:3754 -msgid "remote_schema" -msgstr "uzak_şema" - -#: sql_help.c:3757 -msgid "local_schema" -msgstr "yerel_şema" - -#: sql_help.c:3792 -msgid "conflict_target" -msgstr "çakışma_hedefi" - -#: sql_help.c:3793 -msgid "conflict_action" -msgstr "çakışma_eylemi" - -#: sql_help.c:3796 -msgid "where conflict_target can be one of:" -msgstr "çakışma_hedefi aşağıdakilerden birisi olabilir:" - -#: sql_help.c:3797 -msgid "index_column_name" -msgstr "indeks_sütun_adı" - -#: sql_help.c:3798 -msgid "index_expression" -msgstr "indeks_ifadesi" - -#: sql_help.c:3801 -msgid "index_predicate" -msgstr "index_yüklemi" - -#: sql_help.c:3803 -msgid "and conflict_action is one of:" -msgstr "ve çakışma_eylemi aşağıdakilerden birisi olabilir:" - -#: sql_help.c:3809 sql_help.c:4581 -msgid "sub-SELECT" -msgstr "alt-SELECT" - -#: sql_help.c:3818 sql_help.c:3881 sql_help.c:4557 -msgid "channel" -msgstr "kanal" - -#: sql_help.c:3840 -msgid "lockmode" -msgstr "kilitleme modu" - -#: sql_help.c:3841 -msgid "where lockmode is one of:" -msgstr "kilitleme modu şunlardan biri olabilir:" - -#: sql_help.c:3882 -msgid "payload" -msgstr "yük (payload)" - -#: sql_help.c:3909 -msgid "old_role" -msgstr "eski_rol" - -#: sql_help.c:3910 -msgid "new_role" -msgstr "yeni_rol" - -#: sql_help.c:3935 sql_help.c:4096 sql_help.c:4104 -msgid "savepoint_name" -msgstr "savepoint_adı" - -#: sql_help.c:4238 sql_help.c:4280 sql_help.c:4282 sql_help.c:4328 -#: sql_help.c:4477 sql_help.c:4519 sql_help.c:4521 sql_help.c:4695 -#: sql_help.c:4737 sql_help.c:4739 -msgid "from_item" -msgstr "from_item" - -#: sql_help.c:4240 sql_help.c:4292 sql_help.c:4479 sql_help.c:4531 -#: sql_help.c:4697 sql_help.c:4749 -msgid "grouping_element" -msgstr "gruplama_öğesi" - -#: sql_help.c:4242 sql_help.c:4332 sql_help.c:4481 sql_help.c:4699 -msgid "window_name" -msgstr "pencere_adı" - -#: sql_help.c:4243 sql_help.c:4333 sql_help.c:4482 sql_help.c:4700 -msgid "window_definition" -msgstr "window_tanımı" - -#: sql_help.c:4244 sql_help.c:4258 sql_help.c:4296 sql_help.c:4334 -#: sql_help.c:4483 sql_help.c:4497 sql_help.c:4535 sql_help.c:4701 -#: sql_help.c:4715 sql_help.c:4753 -msgid "select" -msgstr "select" - -#: sql_help.c:4251 sql_help.c:4490 sql_help.c:4708 -msgid "where from_item can be one of:" -msgstr "from_öğesi şunlardan biri olabilir" - -#: sql_help.c:4254 sql_help.c:4260 sql_help.c:4263 sql_help.c:4267 -#: sql_help.c:4279 sql_help.c:4493 sql_help.c:4499 sql_help.c:4502 -#: sql_help.c:4506 sql_help.c:4518 sql_help.c:4711 sql_help.c:4717 -#: sql_help.c:4720 sql_help.c:4724 sql_help.c:4736 -msgid "column_alias" -msgstr "kolon_takma_adı" - -#: sql_help.c:4255 sql_help.c:4494 sql_help.c:4712 -msgid "sampling_method" -msgstr "örnekleme_yöntemi" - -#: sql_help.c:4257 sql_help.c:4496 sql_help.c:4714 -msgid "seed" -msgstr "başlangıç değeri" - -#: sql_help.c:4261 sql_help.c:4294 sql_help.c:4500 sql_help.c:4533 -#: sql_help.c:4718 sql_help.c:4751 -msgid "with_query_name" -msgstr "with_sorgu_adı" - -#: sql_help.c:4271 sql_help.c:4274 sql_help.c:4277 sql_help.c:4510 -#: sql_help.c:4513 sql_help.c:4516 sql_help.c:4728 sql_help.c:4731 -#: sql_help.c:4734 -msgid "column_definition" -msgstr "kolon_tanımı" - -#: sql_help.c:4281 sql_help.c:4520 sql_help.c:4738 -msgid "join_type" -msgstr "join_tipi" - -#: sql_help.c:4283 sql_help.c:4522 sql_help.c:4740 -msgid "join_condition" -msgstr "join_şartı" - -#: sql_help.c:4284 sql_help.c:4523 sql_help.c:4741 -msgid "join_column" -msgstr "join_sütunu" - -#: sql_help.c:4285 sql_help.c:4524 sql_help.c:4742 -msgid "and grouping_element can be one of:" -msgstr "ve grouplama-elemanı aşağıdakilerden birisi olabilir:" - -#: sql_help.c:4293 sql_help.c:4532 sql_help.c:4750 -msgid "and with_query is:" -msgstr "ve with_sorgusu :" - -#: sql_help.c:4297 sql_help.c:4536 sql_help.c:4754 -msgid "values" -msgstr "değerler" - -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4755 -msgid "insert" -msgstr "ekle (insert)" - -#: sql_help.c:4299 sql_help.c:4538 sql_help.c:4756 -msgid "update" -msgstr "güncelle (update)" - -#: sql_help.c:4300 sql_help.c:4539 sql_help.c:4757 -msgid "delete" -msgstr "sil (delete)" - -#: sql_help.c:4327 -msgid "new_table" -msgstr "yeni_tablo" - -#: sql_help.c:4352 -msgid "timezone" -msgstr "saat dilimi" - -#: sql_help.c:4397 -msgid "snapshot_id" -msgstr "snapshot_id" - -#: sql_help.c:4582 -msgid "from_list" -msgstr "from_listesi" - -#: sql_help.c:4637 -msgid "sort_expression" -msgstr "sort_ifadesi" - -#: sql_help.c:4764 sql_help.c:5742 -msgid "abort the current transaction" -msgstr "aktif transcation'ı iptal et" - -#: sql_help.c:4770 -msgid "change the definition of an aggregate function" -msgstr "aggregate fonksiyonunun tanımını değiştir" - -#: sql_help.c:4776 -msgid "change the definition of a collation" -msgstr "karşılaştırma (collation) tanımını değiştir" - -#: sql_help.c:4782 -msgid "change the definition of a conversion" -msgstr "bir dönüşümün tanımını değiştir" - -#: sql_help.c:4788 -msgid "change a database" -msgstr "veritabanını değiştir" - -#: sql_help.c:4794 -msgid "define default access privileges" -msgstr "varsayılan erişim haklarını tanımla" - -#: sql_help.c:4800 -msgid "change the definition of a domain" -msgstr "domain tanımını değiştir" - -#: sql_help.c:4806 -msgid "change the definition of an event trigger" -msgstr "olay tetikleyici tanımını değiştir" - -#: sql_help.c:4812 -msgid "change the definition of an extension" -msgstr "uzantı tanımını değiştir" - -#: sql_help.c:4818 -msgid "change the definition of a foreign-data wrapper" -msgstr "foreign-data wrapper tanımını değiştir" - -#: sql_help.c:4824 -msgid "change the definition of a foreign table" -msgstr "uzak (foreign) tablo tanımını değiştir" - -#: sql_help.c:4830 -msgid "change the definition of a function" -msgstr "fonksiyon tanımını değiştir" - -#: sql_help.c:4836 -msgid "change role name or membership" -msgstr "üyeliği veya rol adını değiştir" - -#: sql_help.c:4842 -msgid "change the definition of an index" -msgstr "index tanımını değiştir" - -#: sql_help.c:4848 -msgid "change the definition of a procedural language" -msgstr "yordamsal dilinin tanımını değiştir" - -#: sql_help.c:4854 -msgid "change the definition of a large object" -msgstr "büyük nesne tanımını değiştir" - -#: sql_help.c:4860 -msgid "change the definition of a materialized view" -msgstr "maddileştirilmiş görünüm (materialized view) tanımını değiştir" - -#: sql_help.c:4866 -msgid "change the definition of an operator" -msgstr "operatör tanımını değiştir" - -#: sql_help.c:4872 -msgid "change the definition of an operator class" -msgstr "operatör sınıfının tanımını değiştir" - -#: sql_help.c:4878 -msgid "change the definition of an operator family" -msgstr "operatör ailesinin tanımını değiştir" - -#: sql_help.c:4884 -msgid "change the definition of a row level security policy" -msgstr "satır seviyesi güvenlik ilkesi tanımını değiştir" - -#: sql_help.c:4890 -msgid "change the definition of a procedure" -msgstr "prosedür tanımını değiştir" - -#: sql_help.c:4896 -msgid "change the definition of a publication" -msgstr "yayın tanımını değiştir" - -#: sql_help.c:4902 sql_help.c:5004 -msgid "change a database role" -msgstr "veritabanı dolünü değiştir" - -#: sql_help.c:4908 -msgid "change the definition of a routine" -msgstr "yordam (routine) tanımını değiştir" - -#: sql_help.c:4914 -msgid "change the definition of a rule" -msgstr "kural tanımını değiştir" - -#: sql_help.c:4920 -msgid "change the definition of a schema" -msgstr "şema tanımını değiştir" - -#: sql_help.c:4926 -msgid "change the definition of a sequence generator" -msgstr "sequence üretecinin tanımını değiştir" - -#: sql_help.c:4932 -msgid "change the definition of a foreign server" -msgstr "foreign server tanımını değiştir" - -#: sql_help.c:4938 -msgid "change the definition of an extended statistics object" -msgstr "genişletilmiş istatistik nesnesinin tanımını değiştir" - -#: sql_help.c:4944 -msgid "change the definition of a subscription" -msgstr "abonelik tanımını değiştir" - -#: sql_help.c:4950 -msgid "change a server configuration parameter" -msgstr "bir sunucu yapılandırma parametresini değiştir" - -#: sql_help.c:4956 -msgid "change the definition of a table" -msgstr "tablonun tanımını değiştir" - -#: sql_help.c:4962 -msgid "change the definition of a tablespace" -msgstr "tablespace tanımını değiştir" - -#: sql_help.c:4968 -msgid "change the definition of a text search configuration" -msgstr "metin arama yapılandırmasının tanımını değiştir" - -#: sql_help.c:4974 -msgid "change the definition of a text search dictionary" -msgstr "metin arama sözlüğünün tanımını değiştir" - -#: sql_help.c:4980 -msgid "change the definition of a text search parser" -msgstr "metin arama ayrıştırıcısının tanımını değiştir" - -#: sql_help.c:4986 -msgid "change the definition of a text search template" -msgstr "metin arama şablonunun tanımını değiştir" - -#: sql_help.c:4992 -msgid "change the definition of a trigger" -msgstr "trigger tanımını değiştir" - -#: sql_help.c:4998 -msgid "change the definition of a type" -msgstr "type tanımını değiştir" - -#: sql_help.c:5010 -msgid "change the definition of a user mapping" -msgstr "kullanıcı haritalama tanımını değiştir" - -#: sql_help.c:5016 -msgid "change the definition of a view" -msgstr "view tanımını değiştir" - -#: sql_help.c:5022 -msgid "collect statistics about a database" -msgstr "database hakkında istatistikleri topla" - -#: sql_help.c:5028 sql_help.c:5820 -msgid "start a transaction block" -msgstr "transaction bloğunu başlat" - -#: sql_help.c:5034 -msgid "invoke a procedure" -msgstr "bir prosedürü çağır" - -#: sql_help.c:5040 -msgid "force a write-ahead log checkpoint" -msgstr "write-ahead log checkpoint'i gerçekleştir" - -#: sql_help.c:5046 -msgid "close a cursor" -msgstr "cursor'u kapat" - -#: sql_help.c:5052 -msgid "cluster a table according to an index" -msgstr "indexe dayanarak tabloyu cluster işlemine tabi tut" - -#: sql_help.c:5058 -msgid "define or change the comment of an object" -msgstr "Nesne yorumunu tanımla ya da değiştir" - -#: sql_help.c:5064 sql_help.c:5622 -msgid "commit the current transaction" -msgstr "geçerli transaction'u commit et" - -#: sql_help.c:5070 -msgid "commit a transaction that was earlier prepared for two-phase commit" -msgstr "daha önce two-phase commit için hazırlanmış transaction'u commit et" - -#: sql_help.c:5076 -msgid "copy data between a file and a table" -msgstr "dosya ile veritabanı tablosu arasında veriyi transfer et" - -#: sql_help.c:5082 -msgid "define a new access method" -msgstr "yeni erişim yöntemi tanımla" - -#: sql_help.c:5088 -msgid "define a new aggregate function" -msgstr "yeni aggregate fonksiyonunu tanımla" - -#: sql_help.c:5094 -msgid "define a new cast" -msgstr "yeni cast tanımla" - -#: sql_help.c:5100 -msgid "define a new collation" -msgstr "yeni karşılaştırma (collation) tanımla" - -#: sql_help.c:5106 -msgid "define a new encoding conversion" -msgstr "yeni kodlama dönüşümü tanımla" - -#: sql_help.c:5112 -msgid "create a new database" -msgstr "yeni veritabanı oluştur" - -#: sql_help.c:5118 -msgid "define a new domain" -msgstr "yeni domaın tanımla" - -#: sql_help.c:5124 -msgid "define a new event trigger" -msgstr "yeni olay tetikleyici tanımla" - -#: sql_help.c:5130 -msgid "install an extension" -msgstr "bir uzantı kur" - -#: sql_help.c:5136 -msgid "define a new foreign-data wrapper" -msgstr "yeni foreign-data wrapper tanımla" - -#: sql_help.c:5142 -msgid "define a new foreign table" -msgstr "yeni uzak (foreign) tablo tanımla" - -#: sql_help.c:5148 -msgid "define a new function" -msgstr "yeni fonksiyonu tanımla" - -#: sql_help.c:5154 sql_help.c:5214 sql_help.c:5316 -msgid "define a new database role" -msgstr "yeni veritabanı rolü tanımla" - -#: sql_help.c:5160 -msgid "define a new index" -msgstr "yeni indeks tanımla" - -#: sql_help.c:5166 -msgid "define a new procedural language" -msgstr "yeni yordamsal dil tanımla" - -#: sql_help.c:5172 -msgid "define a new materialized view" -msgstr "yeni maddileştirilmiş görünüm (materialized view) tanımla" - -#: sql_help.c:5178 -msgid "define a new operator" -msgstr "yeni operator tanımla" - -#: sql_help.c:5184 -msgid "define a new operator class" -msgstr "yeni operator class tanımla" - -#: sql_help.c:5190 -msgid "define a new operator family" -msgstr "yeni operatör ailesini tanımla" - -#: sql_help.c:5196 -msgid "define a new row level security policy for a table" -msgstr "bir tablo için yeni satır-seviyesi güvenlik ilkesi tanımla" - -#: sql_help.c:5202 -msgid "define a new procedure" -msgstr "yeni bir prosedür tanımla" - -#: sql_help.c:5208 -msgid "define a new publication" -msgstr "yeni bir yayın tanımla" - -#: sql_help.c:5220 -msgid "define a new rewrite rule" -msgstr "yeni rewriter rule tanımla" - -#: sql_help.c:5226 -msgid "define a new schema" -msgstr "yeni şema tanımla" - -#: sql_help.c:5232 -msgid "define a new sequence generator" -msgstr "yeni sequence generator tanımla" - -#: sql_help.c:5238 -msgid "define a new foreign server" -msgstr "yeni foreign sunucu tanımla" - -#: sql_help.c:5244 -msgid "define extended statistics" -msgstr "genişletilmiş istatistikleri tanımla" - -#: sql_help.c:5250 -msgid "define a new subscription" -msgstr "yeni abonelik tanımla" - -#: sql_help.c:5256 -msgid "define a new table" -msgstr "yeni tablo tanımla" - -#: sql_help.c:5262 sql_help.c:5778 -msgid "define a new table from the results of a query" -msgstr "sorgu sonuçlarından yeni tablo tanımla" - -#: sql_help.c:5268 -msgid "define a new tablespace" -msgstr "yeni tablespace tanımla" - -#: sql_help.c:5274 -msgid "define a new text search configuration" -msgstr "yeni metin arama yapılandırması tanımla" - -#: sql_help.c:5280 -msgid "define a new text search dictionary" -msgstr "yeni metin arama sözlüğü tanımla" - -#: sql_help.c:5286 -msgid "define a new text search parser" -msgstr "yeni metin arama ayrıştırıcısı tanımla" - -#: sql_help.c:5292 -msgid "define a new text search template" -msgstr "yeni metin arama şablonu tanımla" - -#: sql_help.c:5298 -msgid "define a new transform" -msgstr "yeni bir dönüşüm (transform) tanımla" - -#: sql_help.c:5304 -msgid "define a new trigger" -msgstr "yeni trigger tanımla" - -#: sql_help.c:5310 -msgid "define a new data type" -msgstr "yeni veri tipi tanımla" - -#: sql_help.c:5322 -msgid "define a new mapping of a user to a foreign server" -msgstr "bir foreign sunucuya yeni kullanıcı haritalamasını tanımla" - -#: sql_help.c:5328 -msgid "define a new view" -msgstr "yeni vew tanımla" - -#: sql_help.c:5334 -msgid "deallocate a prepared statement" -msgstr "deallocate a prepared statement" - -#: sql_help.c:5340 -msgid "define a cursor" -msgstr "cursor tanımla" - -#: sql_help.c:5346 -msgid "delete rows of a table" -msgstr "tablodan satırları sil" - -#: sql_help.c:5352 -msgid "discard session state" -msgstr "oturum bilgileri unut" - -#: sql_help.c:5358 -msgid "execute an anonymous code block" -msgstr "bir anonim kod bloğu çalıştır" - -#: sql_help.c:5364 -msgid "remove an access method" -msgstr "bir erişim yöntemini kaldır" - -#: sql_help.c:5370 -msgid "remove an aggregate function" -msgstr "aggregate function'u kaldır" - -#: sql_help.c:5376 -msgid "remove a cast" -msgstr "cast kaldır" - -#: sql_help.c:5382 -msgid "remove a collation" -msgstr "karşılaştırma (collation) kaldır" - -#: sql_help.c:5388 -msgid "remove a conversion" -msgstr "conversion kaldır" - -#: sql_help.c:5394 -msgid "remove a database" -msgstr "veritabanını kaldır" - -#: sql_help.c:5400 -msgid "remove a domain" -msgstr "domain kaldır" - -#: sql_help.c:5406 -msgid "remove an event trigger" -msgstr "olay tetikleyici kaldır" - -#: sql_help.c:5412 -msgid "remove an extension" -msgstr "uzantı kaldır" - -#: sql_help.c:5418 -msgid "remove a foreign-data wrapper" -msgstr "foreign-data wrapper'ını kaldır" - -#: sql_help.c:5424 -msgid "remove a foreign table" -msgstr "uzak (foreign) tablo kaldır" - -#: sql_help.c:5430 -msgid "remove a function" -msgstr "function kaldır" - -#: sql_help.c:5436 sql_help.c:5502 sql_help.c:5604 -msgid "remove a database role" -msgstr "veritabanı rolünü kaldır" - -#: sql_help.c:5442 -msgid "remove an index" -msgstr "indeks kaldır" - -#: sql_help.c:5448 -msgid "remove a procedural language" -msgstr "yordamsal dili kaldır" - -#: sql_help.c:5454 -msgid "remove a materialized view" -msgstr "maddileştirilmiş görünüm (materialized view) kaldır" - -#: sql_help.c:5460 -msgid "remove an operator" -msgstr "opeartor kaldır" - -#: sql_help.c:5466 -msgid "remove an operator class" -msgstr "operator class kaldır" - -#: sql_help.c:5472 -msgid "remove an operator family" -msgstr "opeartör ailesini kaldır" - -#: sql_help.c:5478 -msgid "remove database objects owned by a database role" -msgstr "veritabanı rolüne ait veritabanı nesneleri kaldır" - -#: sql_help.c:5484 -msgid "remove a row level security policy from a table" -msgstr "bir tablodan satır-seviyesi güvenlik politikası kaldır" - -#: sql_help.c:5490 -msgid "remove a procedure" -msgstr "bir prosedür kaldır" - -#: sql_help.c:5496 -msgid "remove a publication" -msgstr "yayın kaldır" - -#: sql_help.c:5508 -msgid "remove a routine" -msgstr "yordam (routine) kaldır" - -#: sql_help.c:5514 -msgid "remove a rewrite rule" -msgstr "rewrite rule kaldır" - -#: sql_help.c:5520 -msgid "remove a schema" -msgstr "şema kaldır" - -#: sql_help.c:5526 -msgid "remove a sequence" -msgstr "sequence kaldır" - -#: sql_help.c:5532 -msgid "remove a foreign server descriptor" -msgstr "foreign sunucu tanımını kaldır" - -#: sql_help.c:5538 -msgid "remove extended statistics" -msgstr "genişletilmiş istatistikleri kaldır" - -#: sql_help.c:5544 -msgid "remove a subscription" -msgstr "abonelik kaldır" - -#: sql_help.c:5550 -msgid "remove a table" -msgstr "tablo kaldır" - -#: sql_help.c:5556 -msgid "remove a tablespace" -msgstr "tablespace kaldır" - -#: sql_help.c:5562 -msgid "remove a text search configuration" -msgstr "metin arama yapılandırmasını kaldır" - -#: sql_help.c:5568 -msgid "remove a text search dictionary" -msgstr "biri metin arama sözlüğünü kaldır" - -#: sql_help.c:5574 -msgid "remove a text search parser" -msgstr "bir metin arama ayrıştırıcısını kaldır" - -#: sql_help.c:5580 -msgid "remove a text search template" -msgstr "bir metin arama şablonunu kaldır" - -#: sql_help.c:5586 -msgid "remove a transform" -msgstr "dönüşüm (transform) kaldır" - -#: sql_help.c:5592 -msgid "remove a trigger" -msgstr "trigger kaldır" - -#: sql_help.c:5598 -msgid "remove a data type" -msgstr "veri tipi kaldır" - -#: sql_help.c:5610 -msgid "remove a user mapping for a foreign server" -msgstr "bir foreign sunucu için kullanıcı haritalamasını kaldır" - -#: sql_help.c:5616 -msgid "remove a view" -msgstr "view kaldır" - -#: sql_help.c:5628 -msgid "execute a prepared statement" -msgstr "hazırlanmış komutu çalıştır" - -#: sql_help.c:5634 -msgid "show the execution plan of a statement" -msgstr "sorgunun execution planını göster" - -#: sql_help.c:5640 -msgid "retrieve rows from a query using a cursor" -msgstr "cursor kullanarak sorgunun sonucundan satırları getir" - -#: sql_help.c:5646 -msgid "define access privileges" -msgstr "erişim haklarını tanımla" - -#: sql_help.c:5652 -msgid "import table definitions from a foreign server" -msgstr "uzak sunucudan (foreign server) tablo tanımlarını al" - -#: sql_help.c:5658 -msgid "create new rows in a table" -msgstr "tabloda yeni satırları ekliyor" - -#: sql_help.c:5664 -msgid "listen for a notification" -msgstr "bildiri bekleme durumuna geç" - -#: sql_help.c:5670 -msgid "load a shared library file" -msgstr "shared library dosyası yükle" - -#: sql_help.c:5676 -msgid "lock a table" -msgstr "tabloyu kilitle" - -#: sql_help.c:5682 -msgid "position a cursor" -msgstr "cursor'u yereştir" - -#: sql_help.c:5688 -msgid "generate a notification" -msgstr "bildiri üret" - -#: sql_help.c:5694 -msgid "prepare a statement for execution" -msgstr "çalıştırmak için sorguyu hazırla" - -#: sql_help.c:5700 -msgid "prepare the current transaction for two-phase commit" -msgstr "geçerli transaction'u two-phase commit için hazırla" - -#: sql_help.c:5706 -msgid "change the ownership of database objects owned by a database role" -msgstr "veritabanı rolünün sahip olduğu nesnelerinin sahipliğini değiştir" - -#: sql_help.c:5712 -msgid "replace the contents of a materialized view" -msgstr "bir maddileştirilmiş görünümün (materialized view) içeriğini değiştir" - -#: sql_help.c:5718 -msgid "rebuild indexes" -msgstr "indeksleri yeniden oluştur" - -#: sql_help.c:5724 -msgid "destroy a previously defined savepoint" -msgstr "önceki tanımlanmış savepoint'i kaldır" - -#: sql_help.c:5730 -msgid "restore the value of a run-time parameter to the default value" -msgstr "çalıştırma zamanı parametresini öntanımlı değerine getir" - -#: sql_help.c:5736 -msgid "remove access privileges" -msgstr "erişim hakkını kaldır" - -#: sql_help.c:5748 -msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "daha önce two-phase commit için hazırlanmış transaction'u iptal et" - -#: sql_help.c:5754 -msgid "roll back to a savepoint" -msgstr "savepoint'a rollback" - -#: sql_help.c:5760 -msgid "define a new savepoint within the current transaction" -msgstr "geerli transaction içinde savepoint tanımla" - -#: sql_help.c:5766 -msgid "define or change a security label applied to an object" -msgstr "bir nesneye uygulanan güvenlik etiketini tanımla ya da değiştir" - -#: sql_help.c:5772 sql_help.c:5826 sql_help.c:5862 -msgid "retrieve rows from a table or view" -msgstr "tablo ya da view'dan satırları getir" - -#: sql_help.c:5784 -msgid "change a run-time parameter" -msgstr "çalışma zamanı parametresini değiştir" - -#: sql_help.c:5790 -msgid "set constraint check timing for the current transaction" -msgstr "geçerli işlem (transaction) için kısıtlama doğrulama zamanlamasını belirle" - -#: sql_help.c:5796 -msgid "set the current user identifier of the current session" -msgstr "geçerli oturumun geçerli kullanıcısını tanımla" - -#: sql_help.c:5802 -msgid "set the session user identifier and the current user identifier of the current session" -msgstr "ilk oturum ve geçerli oturum için kullanıcı tanımla" - -#: sql_help.c:5808 -msgid "set the characteristics of the current transaction" -msgstr "geçerli transcation'ın karakteristiklerini ayarla" - -#: sql_help.c:5814 -msgid "show the value of a run-time parameter" -msgstr "çalıştırma zaman parametresinın değerini göster" - -#: sql_help.c:5832 -msgid "empty a table or set of tables" -msgstr "bir veya birden fazla tabloyu kısalt" - -#: sql_help.c:5838 -msgid "stop listening for a notification" -msgstr "bildiriyi beklemeyi durdur" - -#: sql_help.c:5844 -msgid "update rows of a table" -msgstr "tablodaki satırları güncelle" - -#: sql_help.c:5850 -msgid "garbage-collect and optionally analyze a database" -msgstr "Veritabanındaki çöpleri-toparla ve veritabanını (tercihe başlı) analiz et" - -#: sql_help.c:5856 -msgid "compute a set of rows" -msgstr "compute a set of rows" - -#: startup.c:216 -#, fuzzy, c-format -#| msgid "%s: -1 can only be used in non-interactive mode\n" -msgid "-1 can only be used in non-interactive mode" -msgstr "%s: -1 sadece interaktif olmayan modda kullanılabilir\n" - -#: startup.c:303 -#, c-format -msgid "could not connect to server: %s" -msgstr "sunucuya bağlanamadı: %s" - -#: startup.c:331 -#, c-format -msgid "could not open log file \"%s\": %m" -msgstr "\"%s\" log dosyası açılamadı: %m" - -#: startup.c:442 -#, c-format -msgid "" -"Type \"help\" for help.\n" -"\n" -msgstr "" -"Yardım için \"help\" yazınız.\n" -"\n" - -#: startup.c:592 -#, fuzzy, c-format -#| msgid "%s: could not set printing parameter \"%s\"\n" -msgid "could not set printing parameter \"%s\"" -msgstr "%s: \"%s\" yazdırma parametrlesi ayarlanamıyor\n" - -#: startup.c:697 -#, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Daha fazla bilgi için \"%s --help\" yazın.\n" - -#: startup.c:714 -#, fuzzy, c-format -#| msgid "%s: warning: extra command-line argument \"%s\" ignored\n" -msgid "extra command-line argument \"%s\" ignored" -msgstr "%s: uyarı: \"%s\" fazla argümanı atlanmıştır\n" - -#: startup.c:763 -#, fuzzy, c-format -#| msgid "%s: could not find own program executable\n" -msgid "could not find own program executable" -msgstr "%s: çalıştırılabilir dosya bulunamadı\n" - -#: tab-complete.c:4380 -#, fuzzy, c-format -#| msgid "" -#| "tab completion query failed: %s\n" -#| "Query was:\n" -#| "%s\n" -msgid "" -"tab completion query failed: %s\n" -"Query was:\n" -"%s" -msgstr "" -"sekme tamamlama sorgusu başarısız oldu: %s\n" -"Sorgu şudur: \n" -"%s\n" - -#: variables.c:141 -#, fuzzy, c-format -#| msgid "unrecognized value \"%s\" for \"%s\": Boolean expected\n" -msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" -msgstr "\"%2$s\" için tanınmayan değer \"%1$s\": Boolean bekleniyor\n" - -#: variables.c:178 -#, fuzzy, c-format -#| msgid "invalid value \"%s\" for \"%s\": integer expected\n" -msgid "invalid value \"%s\" for \"%s\": integer expected" -msgstr "\"%2$s\" için geçersiz değer \"%1$s\": tamsayı bekleniyor\n" - -#: variables.c:226 -#, fuzzy, c-format -#| msgid "invalid variable name: \"%s\"\n" -msgid "invalid variable name: \"%s\"" -msgstr "geçersiz değişken adı: \"%s\"\n" - -#: variables.c:395 -#, fuzzy, c-format -#| msgid "" -#| "unrecognized value \"%s\" for \"%s\"\n" -#| "Available values are: %s.\n" -msgid "" -"unrecognized value \"%s\" for \"%s\"\n" -"Available values are: %s." -msgstr "" -"\"%2$s\" için tanınmayan değer \"%1$s\"\n" -"Mevcut değerler: %3$s.\n" - -#~ msgid "(binary compatible)" -#~ msgstr "(ikili (binary) uyumlu)" - -#~ msgid "%s: Warning: The -u option is deprecated. Use -U.\n" -#~ msgstr "%s: Uyarı: -u parametresi kullanımdan kalkmıştır. -U kullanın.\n" - -#~ msgid "ALTER VIEW name RENAME TO newname" -#~ msgstr "ALTER VIEW view_adı RENAME TO yeni_ad" - -#~ msgid " \"%s\"" -#~ msgstr " \"%s\"" - -#~ msgid "?%c? \"%s.%s\"" -#~ msgstr "?%c? \"%s.%s\"" - -#~ msgid "Access privileges for database \"%s\"" -#~ msgstr "\"%s\" veritabanının erişim hakları" - -#~ 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 "" -#~ "UYARI: Üst sürümü %d.%d olan sunucuya bağlısınız,\n" -#~ "ancak %s istemcinizin sürümü %d.%d. \\d gibi bazı backslash ile başlayan komutlar düzgün çalışmayabilir\n" -#~ "\n" - -#~ msgid "" -#~ "Welcome to %s %s, the PostgreSQL interactive terminal.\n" -#~ "\n" -#~ msgstr "" -#~ "PostgreSQL etkilişimli arayüzü %s %s.\n" -#~ "\n" - -#~ msgid "" -#~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n" -#~ "\n" -#~ msgstr "" -#~ "PostgreSQL etkilişimli arayüzü %s %s(server %s).\n" -#~ "\n" - -#~ msgid "Copy, Large Object\n" -#~ msgstr "Copy, Large Object\n" - -#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n" -#~ msgstr " \\z [PATTERN] tablo, view, ve sequence erişim haklarını listele (\\dp ile aynı)\n" - -#~ msgid " \\l list all databases (add \"+\" for more detail)\n" -#~ msgstr " \\l tüm veritabanlarını listele (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n" -#~ msgstr " \\dT [PATTERN] veri tipleri listele (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n" -#~ msgstr " \\dn [PATTERN] şemaları göster (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n" -#~ msgstr " \\dFp [PATTERN] metin arama ayrıştırıcılarını listele (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n" -#~ msgstr " \\dFd [PATTERN] metin arama sözlüklerini listele (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n" -#~ msgstr " \\df [PATTERN] fonksiyonları göster (daha fazla ayrıntı için \"+\" ekleyin)\n" - -#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n" -#~ msgstr " \\db [PATTERN] tablespaceleri listele (daha fazla ayrıntı için \"+\" ekleyin)\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} [PATTERN] (daha fazla ayrıntı için \"+\" ekleyin)\n" -#~ " tablolar/indeksler/sequenceler/viewlar/system tablolarını listele\n" - -#~ msgid " -W force password prompt (should happen automatically)" -#~ msgstr " -W şifre sorulmasını sağla (otomatik olarak olmalı)" - -#~ msgid "" -#~ "\n" -#~ "Connection options:" -#~ msgstr "" -#~ "\n" -#~ "Bağlantı tercihleri:" - -#~ msgid " -t print rows only (-P tuples_only)" -#~ msgstr " -t sadece satırları göster (-P tuples_only)" - -#~ msgid " --version output version information, then exit" -#~ msgstr " --version sürüm bilgisini göster ve çık" - -#~ msgid " --help show this help, then exit" -#~ msgstr " --help yardım metnini göster ve çık" - -#~ msgid " -1 (\"one\") execute command file as a single transaction" -#~ msgstr " -1 (rakamla bir) komutu tek bir transaction olarak işle" - -#~ msgid "General options:" -#~ msgstr "Genel tercihler:" - -#~ msgid "Usage:" -#~ msgstr "Kullanımı:" - -#~ msgid "(1 row)" -#~ msgid_plural "(%lu rows)" -#~ msgstr[0] "(%lu satır)" -#~ msgstr[1] "(1 satır)" - -#~ msgid " \"%s\" IN %s %s" -#~ msgstr " \"%s\", %s %s içinde" - -#~ msgid "" -#~ "VALUES ( expression [, ...] ) [, ...]\n" -#~ " [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]" -#~ msgstr "" -#~ "VALUES ( expression [, ...] ) [, ...]\n" -#~ " [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]" - -#~ msgid "" -#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]\n" -#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]" -#~ msgstr "" -#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]\n" -#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]" - -#~ msgid "" -#~ "UPDATE [ ONLY ] table [ [ AS ] alias ]\n" -#~ " SET { column = { expression | DEFAULT } |\n" -#~ " ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]\n" -#~ " [ FROM fromlist ]\n" -#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" -#~ msgstr "" -#~ "UPDATE [ ONLY ] table [ [ AS ] alias ]\n" -#~ " SET { column = { expression | DEFAULT } |\n" -#~ " ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]\n" -#~ " [ FROM fromlist ]\n" -#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" - -#~ msgid "UNLISTEN { name | * }" -#~ msgstr "UNLISTEN { name | * }" - -#~ msgid "" -#~ "TRUNCATE [ TABLE ] [ ONLY ] name [, ... ]\n" -#~ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]" -#~ msgstr "" -#~ "TRUNCATE [ TABLE ] [ ONLY ] ad [, ... ]\n" -#~ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]" - -#~ msgid "" -#~ "START TRANSACTION [ transaction_mode [, ...] ]\n" -#~ "\n" -#~ "where transaction_mode is one of:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" -#~ msgstr "" -#~ "START TRANSACTION [ transaction_mode [, ...] ]\n" -#~ "\n" -#~ "transaction_mode aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" - -#~ msgid "" -#~ "SHOW name\n" -#~ "SHOW ALL" -#~ msgstr "" -#~ "SHOW name\n" -#~ "SHOW ALL" - -#~ msgid "" -#~ "SET TRANSACTION transaction_mode [, ...]\n" -#~ "SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]\n" -#~ "\n" -#~ "where transaction_mode is one of:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" -#~ msgstr "" -#~ "SET TRANSACTION transaction_mode [, ...]\n" -#~ "SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]\n" -#~ "\n" -#~ "transaction_mode aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" - -#~ msgid "" -#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username\n" -#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n" -#~ "RESET SESSION AUTHORIZATION" -#~ msgstr "" -#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION kullanıcı_adı\n" -#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n" -#~ "RESET SESSION AUTHORIZATION" - -#~ msgid "" -#~ "SET [ SESSION | LOCAL ] ROLE rolename\n" -#~ "SET [ SESSION | LOCAL ] ROLE NONE\n" -#~ "RESET ROLE" -#~ msgstr "" -#~ "SET [ SESSION | LOCAL ] ROLE rol_adı\n" -#~ "SET [ SESSION | LOCAL ] ROLE NONE\n" -#~ "RESET ROLE" - -#~ msgid "SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }" -#~ msgstr "SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }" - -#~ msgid "" -#~ "SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }\n" -#~ "SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }" -#~ msgstr "" -#~ "SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }\n" -#~ "SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }" - -#~ msgid "" -#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n" -#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n" -#~ " * | expression [ [ AS ] output_name ] [, ...]\n" -#~ " INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table\n" -#~ " [ FROM from_item [, ...] ]\n" -#~ " [ WHERE condition ]\n" -#~ " [ GROUP BY expression [, ...] ]\n" -#~ " [ HAVING condition [, ...] ]\n" -#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n" -#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n" -#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n" -#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]" -#~ msgstr "" -#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n" -#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n" -#~ " * | expression [ [ AS ] output_name ] [, ...]\n" -#~ " INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table\n" -#~ " [ FROM from_item [, ...] ]\n" -#~ " [ WHERE condition ]\n" -#~ " [ GROUP BY expression [, ...] ]\n" -#~ " [ HAVING condition [, ...] ]\n" -#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n" -#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n" -#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n" -#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]" - -#~ msgid "" -#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n" -#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n" -#~ " * | expression [ [ AS ] output_name ] [, ...]\n" -#~ " [ FROM from_item [, ...] ]\n" -#~ " [ WHERE condition ]\n" -#~ " [ GROUP BY expression [, ...] ]\n" -#~ " [ HAVING condition [, ...] ]\n" -#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n" -#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n" -#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n" -#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]\n" -#~ "\n" -#~ "where from_item can be one of:\n" -#~ "\n" -#~ " [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n" -#~ " ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]\n" -#~ " with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n" -#~ " function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]\n" -#~ " function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n" -#~ " from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]\n" -#~ "\n" -#~ "and with_query is:\n" -#~ "\n" -#~ " with_query_name [ ( column_name [, ...] ) ] AS ( select )\n" -#~ "\n" -#~ "TABLE { [ ONLY ] table_name [ * ] | with_query_name }" -#~ msgstr "" -#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n" -#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n" -#~ " * | expression [ [ AS ] output_name ] [, ...]\n" -#~ " [ FROM from_item [, ...] ]\n" -#~ " [ WHERE condition ]\n" -#~ " [ GROUP BY expression [, ...] ]\n" -#~ " [ HAVING condition [, ...] ]\n" -#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n" -#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n" -#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n" -#~ " [ LIMIT { count | ALL } ]\n" -#~ " [ OFFSET start [ ROW | ROWS ] ]\n" -#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n" -#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]\n" -#~ "\n" -#~ "where from_item can be one of:\n" -#~ "\n" -#~ " [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n" -#~ " ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]\n" -#~ " with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n" -#~ " function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]\n" -#~ " function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n" -#~ " from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]\n" -#~ "\n" -#~ "and with_query is:\n" -#~ "\n" -#~ " with_query_name [ ( column_name [, ...] ) ] AS ( select )\n" -#~ "\n" -#~ "TABLE { [ ONLY ] table_name [ * ] | with_query_name }" - -#~ msgid "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name" -#~ msgstr "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_adı" - -#~ msgid "ROLLBACK PREPARED transaction_id" -#~ msgstr "ROLLBACK PREPARED transaction_id" - -#~ msgid "ROLLBACK [ WORK | TRANSACTION ]" -#~ msgstr "ROLLBACK [ WORK | TRANSACTION ]" - -#~ msgid "" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON [ TABLE ] tablename [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] )\n" -#~ " [,...] | ALL [ PRIVILEGES ] ( column [, ...] ) }\n" -#~ " ON [ TABLE ] tablename [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { USAGE | SELECT | UPDATE }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SEQUENCE sequencename [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON DATABASE dbname [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN DATA WRAPPER fdwname [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN SERVER servername [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { EXECUTE | ALL [ PRIVILEGES ] }\n" -#~ " ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON LANGUAGE langname [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SCHEMA schemaname [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { CREATE | ALL [ PRIVILEGES ] }\n" -#~ " ON TABLESPACE tablespacename [, ...]\n" -#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ ADMIN OPTION FOR ]\n" -#~ " role [, ...] FROM rolename [, ...]\n" -#~ " [ CASCADE | RESTRICT ]" -#~ msgstr "" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON [ TABLE ] tablo adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { SELECT | INSERT | UPDATE | REFERENCES } ( kolon [, ...] )\n" -#~ " [,...] | ALL [ PRIVILEGES ] ( kolon [, ...] ) }\n" -#~ " ON [ TABLE ] tablo adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { USAGE | SELECT | UPDATE }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SEQUENCE sequence adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON DATABASE veritabanı adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN DATA WRAPPER fdw adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN SERVER sunucu adu [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { EXECUTE | ALL [ PRIVILEGES ] }\n" -#~ " ON FUNCTION fonksiyon adı ( [ [ argüman modu ] [ argüman adı ] argüman tipi [, ...] ] ) [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON LANGUAGE dil adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SCHEMA şema adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ GRANT OPTION FOR ]\n" -#~ " { CREATE | ALL [ PRIVILEGES ] }\n" -#~ " ON TABLESPACE tablespace adı [, ...]\n" -#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n" -#~ " [ CASCADE | RESTRICT ]\n" -#~ "\n" -#~ "REVOKE [ ADMIN OPTION FOR ]\n" -#~ " role [, ...] FROM rol adı [, ...]\n" -#~ " [ CASCADE | RESTRICT ]" - -#~ msgid "RELEASE [ SAVEPOINT ] savepoint_name" -#~ msgstr "RELEASE [ SAVEPOINT ] savepoint_adı" - -#~ msgid "REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]" -#~ msgstr "REINDEX { INDEX | TABLE | DATABASE | SYSTEM } adı [ FORCE ]" - -#~ msgid "REASSIGN OWNED BY old_role [, ...] TO new_role" -#~ msgstr "REASSIGN OWNED BY eski_rol [, ...] TO yeni_rol" - -#~ msgid "PREPARE TRANSACTION transaction_id" -#~ msgstr "PREPARE TRANSACTION transaction_id" - -#~ msgid "PREPARE name [ ( datatype [, ...] ) ] AS statement" -#~ msgstr "PREPARE adı [ ( veri_tipi [, ...] ) ] AS ifade" - -#~ msgid "NOTIFY name" -#~ msgstr "NOTIFY ad" - -#~ msgid "MOVE [ direction { FROM | IN } ] cursorname" -#~ msgstr "MOVE [ direction { FROM | IN } ] cursor_adı" - -#~ msgid "" -#~ "LOCK [ TABLE ] [ ONLY ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]\n" -#~ "\n" -#~ "where lockmode is one of:\n" -#~ "\n" -#~ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n" -#~ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE" -#~ msgstr "" -#~ "LOCK [ TABLE ] [ ONLY ] ad [, ...] [ IN kilit modu MODE ] [ NOWAIT ]\n" -#~ "\n" -#~ "kilit modu aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n" -#~ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE" - -#~ msgid "LOAD 'filename'" -#~ msgstr "LOAD 'dosya adı'" - -#~ msgid "LISTEN name" -#~ msgstr "LISTEN ad" - -#~ msgid "" -#~ "INSERT INTO table [ ( column [, ...] ) ]\n" -#~ " { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" -#~ msgstr "" -#~ "IINSERT INTO table [ ( column [, ...] ) ]\n" -#~ " { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" - -#~ msgid "" -#~ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON [ TABLE ] tablename [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] )\n" -#~ " [,...] | ALL [ PRIVILEGES ] ( column [, ...] ) }\n" -#~ " ON [ TABLE ] tablename [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { USAGE | SELECT | UPDATE }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SEQUENCE sequencename [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON DATABASE dbname [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN DATA WRAPPER fdwname [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN SERVER servername [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n" -#~ " ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON LANGUAGE langname [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SCHEMA schemaname [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n" -#~ " ON TABLESPACE tablespacename [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT role [, ...] TO rolename [, ...] [ WITH ADMIN OPTION ]" -#~ msgstr "" -#~ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON [ TABLE ] tablo adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( kolon [, ...] )\n" -#~ " [,...] | ALL [ PRIVILEGES ] ( kolon [, ...] ) }\n" -#~ " ON [ TABLE ] tablo adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { USAGE | SELECT | UPDATE }\n" -#~ " [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SEQUENCE sequence adı [, ...]\n" -#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON DATABASE veritabanı adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN DATA WRAPPER fdw adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON FOREIGN SERVER sunucu adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n" -#~ " ON FUNCTION fonksiyon adı ( [ [ argüman modu ] [ argüman adı ] argüman tipi [, ...] ] ) [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n" -#~ " ON LANGUAGE dil adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n" -#~ " ON SCHEMA şema adı [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n" -#~ " ON TABLESPACE tablespacename [, ...]\n" -#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n" -#~ "\n" -#~ "GRANT role [, ...] TO rol adı [, ...] [ WITH ADMIN OPTION ]" - -#~ msgid "" -#~ "FETCH [ direction { FROM | IN } ] cursorname\n" -#~ "\n" -#~ "where direction can be empty or one of:\n" -#~ "\n" -#~ " NEXT\n" -#~ " PRIOR\n" -#~ " FIRST\n" -#~ " LAST\n" -#~ " ABSOLUTE count\n" -#~ " RELATIVE count\n" -#~ " count\n" -#~ " ALL\n" -#~ " FORWARD\n" -#~ " FORWARD count\n" -#~ " FORWARD ALL\n" -#~ " BACKWARD\n" -#~ " BACKWARD count\n" -#~ " BACKWARD ALL" -#~ msgstr "" -#~ "FETCH [ direction { FROM | IN } ] cursorname\n" -#~ "\n" -#~ "direction boş ya da aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " NEXT\n" -#~ " PRIOR\n" -#~ " FIRST\n" -#~ " LAST\n" -#~ " ABSOLUTE count\n" -#~ " RELATIVE count\n" -#~ " count\n" -#~ " ALL\n" -#~ " FORWARD\n" -#~ " FORWARD count\n" -#~ " FORWARD ALL\n" -#~ " BACKWARD\n" -#~ " BACKWARD count\n" -#~ " BACKWARD ALL" - -#~ msgid "EXPLAIN [ ANALYZE ] [ VERBOSE ] statement" -#~ msgstr "EXPLAIN [ ANALYZE ] [ VERBOSE ] ifade" - -#~ msgid "EXECUTE name [ ( parameter [, ...] ) ]" -#~ msgstr "EXECUTE adı [ ( parameter [, ...] ) ]" - -#~ msgid "END [ WORK | TRANSACTION ]" -#~ msgstr "END [ WORK | TRANSACTION ]" - -#~ msgid "DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP VIEW [ IF EXISTS ] view_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP USER MAPPING [ IF EXISTS ] FOR { username | USER | CURRENT_USER | PUBLIC } SERVER servername" -#~ msgstr "DROP USER MAPPING [ IF EXISTS ] FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC } SERVER sunucu adı" - -#~ msgid "DROP USER [ IF EXISTS ] name [, ...]" -#~ msgstr "DROP USER [ IF EXISTS ] name [, ...]" - -#~ msgid "DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TYPE [ IF EXISTS ] tip_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TRIGGER [ IF EXISTS ] name ON table [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TRIGGER [ IF EXISTS ] trigger_adı ON tablo_adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TEXT SEARCH PARSER [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TEXT SEARCH PARSER [ IF EXISTS ] adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP TABLESPACE [ IF EXISTS ] tablespacename" -#~ msgstr "DROP TABLESPACE [ IF EXISTS ] tablespace_adı" - -#~ msgid "DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP TABLE [ IF EXISTS ] tablo_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP SERVER [ IF EXISTS ] servername [ CASCADE | RESTRICT ]" -#~ msgstr "DROP SERVER [ IF EXISTS ] sunucu adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP SEQUENCE [ IF EXISTS ] sequence_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP SCHEMA [ IF EXISTS ] şema_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP RULE [ IF EXISTS ] name ON relation [ CASCADE | RESTRICT ]" -#~ msgstr "DROP RULE [ IF EXISTS ] rule_adı ON relation [ CASCADE | RESTRICT ]" - -#~ msgid "DROP ROLE [ IF EXISTS ] name [, ...]" -#~ msgstr "DROP ROLE [ IF EXISTS ] name [, ...]" - -#~ msgid "DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP OPERATOR FAMILY [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]" -#~ msgstr "DROP OPERATOR FAMILY [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]" - -#~ msgid "DROP OPERATOR CLASS [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]" -#~ msgstr "DROP OPERATOR CLASS [ IF EXISTS ] ad USING index_method [ CASCADE | RESTRICT ]" - -#~ msgid "DROP OPERATOR [ IF EXISTS ] name ( { lefttype | NONE } , { righttype | NONE } ) [ CASCADE | RESTRICT ]" -#~ msgstr "DROP OPERATOR [ IF EXISTS ] name ( { lefttype | NONE } , { righttype | NONE } ) [ CASCADE | RESTRICT ]" - -#~ msgid "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] dil_adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP INDEX [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP INDEX [ IF EXISTS ] index_adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP GROUP [ IF EXISTS ] name [, ...]" -#~ msgstr "DROP GROUP [ IF EXISTS ] name [, ...]" - -#~ msgid "" -#~ "DROP FUNCTION [ IF EXISTS ] name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " [ CASCADE | RESTRICT ]" -#~ msgstr "" -#~ "DROP FUNCTION [ IF EXISTS ] fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " [ CASCADE | RESTRICT ]" - -#~ msgid "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] ad [ CASCADE | RESTRICT ]" - -#~ msgid "DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]" -#~ msgstr "DROP DOMAIN [ IF EXISTS ] adı [, ...] [ CASCADE | RESTRICT ]" - -#~ msgid "DROP DATABASE [ IF EXISTS ] name" -#~ msgstr "DROP DATABASE [ IF EXISTS ] veritabanı_adı" - -#~ msgid "DROP CONVERSION [ IF EXISTS ] name [ CASCADE | RESTRICT ]" -#~ msgstr "DROP CONVERSION [ IF EXISTS ] conversion_adı [ CASCADE | RESTRICT ]" - -#~ msgid "DROP CAST [ IF EXISTS ] (sourcetype AS targettype) [ CASCADE | RESTRICT ]" -#~ msgstr "DROP CAST [ IF EXISTS ] (sourcetype AS targettype) [ CASCADE | RESTRICT ]" - -#~ msgid "DROP AGGREGATE [ IF EXISTS ] name ( type [ , ... ] ) [ CASCADE | RESTRICT ]" -#~ msgstr "DROP AGGREGATE [ IF EXISTS ] name ( type [ , ... ] ) [ CASCADE | RESTRICT ]" - -#~ msgid "DISCARD { ALL | PLANS | TEMPORARY | TEMP }" -#~ msgstr "DISCARD { ALL | PLANS | TEMPORARY | TEMP }" - -#~ msgid "" -#~ "DELETE FROM [ ONLY ] table [ [ AS ] alias ]\n" -#~ " [ USING usinglist ]\n" -#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" -#~ msgstr "" -#~ "DELETE FROM [ ONLY ] tablo [ [ AS ] takma_adı ]\n" -#~ " [ USING usinglist ]\n" -#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n" -#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]" - -#~ msgid "" -#~ "DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]\n" -#~ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR query" -#~ msgstr "" -#~ "DECLARE ad [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]\n" -#~ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR sorgu" - -#~ msgid "DEALLOCATE [ PREPARE ] { name | ALL }" -#~ msgstr "DEALLOCATE [ PREPARE ] { name | ALL }" - -#~ msgid "" -#~ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]\n" -#~ " AS query" -#~ msgstr "" -#~ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]\n" -#~ " AS query" - -#~ msgid "" -#~ "CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }\n" -#~ " SERVER servername\n" -#~ " [ OPTIONS ( option 'value' [ , ... ] ) ]" -#~ msgstr "" -#~ "CREATE USER MAPPING FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC }\n" -#~ " SERVER sunucu adı\n" -#~ " [ OPTIONS ( seçenek 'değer' [ , ... ] ) ]" - -#~ msgid "" -#~ "CREATE USER name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" -#~ msgstr "" -#~ "CREATE USER name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" - -#~ msgid "" -#~ "CREATE TYPE name AS\n" -#~ " ( attribute_name data_type [, ... ] )\n" -#~ "\n" -#~ "CREATE TYPE name AS ENUM\n" -#~ " ( 'label' [, ... ] )\n" -#~ "\n" -#~ "CREATE TYPE name (\n" -#~ " INPUT = input_function,\n" -#~ " OUTPUT = output_function\n" -#~ " [ , RECEIVE = receive_function ]\n" -#~ " [ , SEND = send_function ]\n" -#~ " [ , TYPMOD_IN = type_modifier_input_function ]\n" -#~ " [ , TYPMOD_OUT = type_modifier_output_function ]\n" -#~ " [ , ANALYZE = analyze_function ]\n" -#~ " [ , INTERNALLENGTH = { internallength | VARIABLE } ]\n" -#~ " [ , PASSEDBYVALUE ]\n" -#~ " [ , ALIGNMENT = alignment ]\n" -#~ " [ , STORAGE = storage ]\n" -#~ " [ , LIKE = like_type ]\n" -#~ " [ , CATEGORY = category ]\n" -#~ " [ , PREFERRED = preferred ]\n" -#~ " [ , DEFAULT = default ]\n" -#~ " [ , ELEMENT = element ]\n" -#~ " [ , DELIMITER = delimiter ]\n" -#~ ")\n" -#~ "\n" -#~ "CREATE TYPE name" -#~ msgstr "" -#~ "CREATE TYPE ad AS\n" -#~ " ( attribute_name veri tipi [, ... ] )\n" -#~ "\n" -#~ "CREATE TYPE ad AS ENUM\n" -#~ " ( 'label' [, ... ] )\n" -#~ "\n" -#~ "CREATE TYPE ad (\n" -#~ " INPUT = input_function,\n" -#~ " OUTPUT = output_function\n" -#~ " [ , RECEIVE = receive_function ]\n" -#~ " [ , SEND = send_function ]\n" -#~ " [ , TYPMOD_IN = type_modifier_input_function ]\n" -#~ " [ , TYPMOD_OUT = type_modifier_output_function ]\n" -#~ " [ , ANALYZE = analyze_function ]\n" -#~ " [ , INTERNALLENGTH = { internallength | VARIABLE } ]\n" -#~ " [ , PASSEDBYVALUE ]\n" -#~ " [ , ALIGNMENT = alignment ]\n" -#~ " [ , STORAGE = storage ]\n" -#~ " [ , LIKE = like_type ]\n" -#~ " [ , CATEGORY = category ]\n" -#~ " [ , PREFERRED = preferred ]\n" -#~ " [ , DEFAULT = default ]\n" -#~ " [ , ELEMENT = element ]\n" -#~ " [ , DELIMITER = delimiter ]\n" -#~ ")\n" -#~ "\n" -#~ "CREATE TYPE name" - -#~ msgid "" -#~ "CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }\n" -#~ " ON table [ FOR [ EACH ] { ROW | STATEMENT } ]\n" -#~ " EXECUTE PROCEDURE funcname ( arguments )" -#~ msgstr "" -#~ "CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }\n" -#~ " ON table [ FOR [ EACH ] { ROW | STATEMENT } ]\n" -#~ " EXECUTE PROCEDURE funcname ( arguments )" - -#~ msgid "" -#~ "CREATE TEXT SEARCH TEMPLATE name (\n" -#~ " [ INIT = init_function , ]\n" -#~ " LEXIZE = lexize_function\n" -#~ ")" -#~ msgstr "" -#~ "CREATE TEXT SEARCH TEMPLATE ad (\n" -#~ " [ INIT = init_function , ]\n" -#~ " LEXIZE = lexize_function\n" -#~ ")" - -#~ msgid "" -#~ "CREATE TEXT SEARCH PARSER name (\n" -#~ " START = start_function ,\n" -#~ " GETTOKEN = gettoken_function ,\n" -#~ " END = end_function ,\n" -#~ " LEXTYPES = lextypes_function\n" -#~ " [, HEADLINE = headline_function ]\n" -#~ ")" -#~ msgstr "" -#~ "CREATE TEXT SEARCH PARSER name (\n" -#~ " START = start_function ,\n" -#~ " GETTOKEN = gettoken_function ,\n" -#~ " END = end_function ,\n" -#~ " LEXTYPES = lextypes_function\n" -#~ " [, HEADLINE = headline_function ]\n" -#~ ")" - -#~ msgid "" -#~ "CREATE TEXT SEARCH DICTIONARY name (\n" -#~ " TEMPLATE = template\n" -#~ " [, option = value [, ... ]]\n" -#~ ")" -#~ msgstr "" -#~ "CREATE TEXT SEARCH DICTIONARY ad (\n" -#~ " TEMPLATE = şablon\n" -#~ " [, option = value [, ... ]]\n" -#~ ")" - -#~ msgid "" -#~ "CREATE TEXT SEARCH CONFIGURATION name (\n" -#~ " PARSER = parser_name |\n" -#~ " COPY = source_config\n" -#~ ")" -#~ msgstr "" -#~ "CREATE TEXT SEARCH CONFIGURATION name (\n" -#~ " PARSER = parser_name |\n" -#~ " COPY = source_config\n" -#~ ")" - -#~ msgid "CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'" -#~ msgstr "CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'" - -#~ msgid "" -#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name\n" -#~ " [ (column_name [, ...] ) ]\n" -#~ " [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n" -#~ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n" -#~ " [ TABLESPACE tablespace ]\n" -#~ " AS query\n" -#~ " [ WITH [ NO ] DATA ]" -#~ msgstr "" -#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE tablo adı\n" -#~ " [ (kolon adı [, ...] ) ]\n" -#~ " [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n" -#~ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n" -#~ " [ TABLESPACE tablespace ]\n" -#~ " AS sorgu\n" -#~ " [ WITH [ NO ] DATA ]" - -#~ msgid "" -#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [\n" -#~ " { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]\n" -#~ " | table_constraint\n" -#~ " | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... }\n" -#~ " [, ... ]\n" -#~ "] )\n" -#~ "[ INHERITS ( parent_table [, ... ] ) ]\n" -#~ "[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n" -#~ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n" -#~ "[ TABLESPACE tablespace ]\n" -#~ "\n" -#~ "where column_constraint is:\n" -#~ "\n" -#~ "[ CONSTRAINT constraint_name ]\n" -#~ "{ NOT NULL | \n" -#~ " NULL | \n" -#~ " UNIQUE index_parameters |\n" -#~ " PRIMARY KEY index_parameters |\n" -#~ " CHECK ( expression ) |\n" -#~ " REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n" -#~ " [ ON DELETE action ] [ ON UPDATE action ] }\n" -#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n" -#~ "\n" -#~ "and table_constraint is:\n" -#~ "\n" -#~ "[ CONSTRAINT constraint_name ]\n" -#~ "{ UNIQUE ( column_name [, ... ] ) index_parameters |\n" -#~ " PRIMARY KEY ( column_name [, ... ] ) index_parameters |\n" -#~ " CHECK ( expression ) |\n" -#~ " FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]\n" -#~ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }\n" -#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n" -#~ "\n" -#~ "index_parameters in UNIQUE and PRIMARY KEY constraints are:\n" -#~ "\n" -#~ "[ WITH ( storage_parameter [= value] [, ... ] ) ]\n" -#~ "[ USING INDEX TABLESPACE tablespace ]" -#~ msgstr "" -#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE tablo_adı ( [\n" -#~ " { kolon_adı veri_tipi [ DEFAULT default_expr ] [ kolon_kısıtlayıcısı [ ... ] ]\n" -#~ " | tablo_kısıtlayıcısı\n" -#~ " | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... }\n" -#~ " [, ... ]\n" -#~ "] )\n" -#~ "[ INHERITS ( parent_table [, ... ] ) ]\n" -#~ "[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n" -#~ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n" -#~ "[ TABLESPACE tablo_uzayı ]\n" -#~ "\n" -#~ "kolon_kısıtlayıcısı aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ "im[ CONSTRAINT constraint_name ]\n" -#~ "{ NOT NULL | \n" -#~ " NULL | \n" -#~ " UNIQUE index_parametreleri |\n" -#~ " PRIMARY KEY index_parametreleri |\n" -#~ " CHECK ( ifade ) |\n" -#~ " REFERENCES referans_tablosu [ ( referans_kolonu ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n" -#~ " [ ON DELETE işlem ] [ ON UPDATE işlem ] }\n" -#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n" -#~ "\n" -#~ "ve tablo_kısıtlayıcısı aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ "[ CONSTRAINT constraint_name ]\n" -#~ "{ UNIQUE ( column_name [, ... ] ) index_parameters |\n" -#~ " PRIMARY KEY ( column_name [, ... ] ) index_parameters |\n" -#~ " CHECK ( expression ) |\n" -#~ " FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]\n" -#~ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }\n" -#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n" -#~ "\n" -#~ "UNIQUE ve PRIMARY KEY kısıtlamalarındaki index parametreleri aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ "[ WITH ( storage_parameter [= value] [, ... ] ) ]\n" -#~ "[ USING INDEX TABLESPACE tablo_uzayı ]" - -#~ msgid "" -#~ "CREATE SERVER servername [ TYPE 'servertype' ] [ VERSION 'serverversion' ]\n" -#~ " FOREIGN DATA WRAPPER fdwname\n" -#~ " [ OPTIONS ( option 'value' [, ... ] ) ]" -#~ msgstr "" -#~ "CREATE SERVER sunucu adı [ TYPE 'sunucu tipi' ] [ VERSION 'sunucu sürümü' ]\n" -#~ " FOREIGN DATA WRAPPER fdw adı\n" -#~ " [ OPTIONS ( seçenek 'değer' [, ... ] ) ]" - -#~ msgid "" -#~ "CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]\n" -#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n" -#~ " [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]\n" -#~ " [ OWNED BY { table.column | NONE } ]" -#~ msgstr "" -#~ "CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]\n" -#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n" -#~ " [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]\n" -#~ " [ OWNED BY { table.column | NONE } ]" - -#~ msgid "" -#~ "CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]\n" -#~ "CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]" -#~ msgstr "" -#~ "CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ TABLESPACE tablespace ] [ schema_element [ ... ] ]\n" -#~ "CREATE SCHEMA AUTHORIZATION username [ TABLESPACE tablespace ] [ schema_element [ ... ] ]" - -#~ msgid "" -#~ "CREATE [ OR REPLACE ] RULE name AS ON event\n" -#~ " TO table [ WHERE condition ]\n" -#~ " DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }" -#~ msgstr "" -#~ "CREATE [ OR REPLACE ] RULE name AS ON event\n" -#~ " TO tablo_adı [ WHERE condition ]\n" -#~ " DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }" - -#~ msgid "" -#~ "CREATE ROLE name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" -#~ msgstr "" -#~ "CREATE ROLE name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" - -#~ msgid "CREATE OPERATOR FAMILY name USING index_method" -#~ msgstr "CREATE OPERATOR FAMILY name USING index_method" - -#~ msgid "" -#~ "CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type\n" -#~ " USING index_method [ FAMILY family_name ] AS\n" -#~ " { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ]\n" -#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n" -#~ " | STORAGE storage_type\n" -#~ " } [, ... ]" -#~ msgstr "" -#~ "CREATE OPERATOR CLASS ad [ DEFAULT ] FOR TYPE veri tipi\n" -#~ " USING index metodu [ FAMILY family_name ] AS\n" -#~ " { OPERATOR strategy_number operatör adı [ ( op_type, op_type ) ]\n" -#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] fonksiyon adı ( argument_type [, ...] )\n" -#~ " | STORAGE storage_type\n" -#~ " } [, ... ]" - -#~ msgid "" -#~ "CREATE OPERATOR name (\n" -#~ " PROCEDURE = funcname\n" -#~ " [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]\n" -#~ " [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]\n" -#~ " [, RESTRICT = res_proc ] [, JOIN = join_proc ]\n" -#~ " [, HASHES ] [, MERGES ]\n" -#~ ")" -#~ msgstr "" -#~ "CREATE OPERATOR name (\n" -#~ " PROCEDURE = funcname\n" -#~ " [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]\n" -#~ " [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]\n" -#~ " [, RESTRICT = res_proc ] [, JOIN = join_proc ]\n" -#~ " [, HASHES ] [, MERGES ]\n" -#~ ")" - -#~ msgid "" -#~ "CREATE [ PROCEDURAL ] LANGUAGE name\n" -#~ "CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name\n" -#~ " HANDLER call_handler [ VALIDATOR valfunction ]" -#~ msgstr "" -#~ "CREATE [ PROCEDURAL ] LANGUAGE name\n" -#~ "CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name\n" -#~ " HANDLER call_handler [ VALIDATOR valfunction ]" - -#~ msgid "" -#~ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]\n" -#~ " ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n" -#~ " [ WITH ( storage_parameter = value [, ... ] ) ]\n" -#~ " [ TABLESPACE tablespace ]\n" -#~ " [ WHERE predicate ]" -#~ msgstr "" -#~ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]\n" -#~ " ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n" -#~ " [ WITH ( storage_parameter = value [, ... ] ) ]\n" -#~ " [ TABLESPACE tablespace ]\n" -#~ " [ WHERE predicate ]" - -#~ msgid "" -#~ "CREATE GROUP name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" -#~ msgstr "" -#~ "CREATE GROUP name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'şifre'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ " | IN ROLE rolename [, ...]\n" -#~ " | IN GROUP rolename [, ...]\n" -#~ " | ROLE rolename [, ...]\n" -#~ " | ADMIN rolename [, ...]\n" -#~ " | USER rolename [, ...]\n" -#~ " | SYSID uid" - -#~ msgid "" -#~ "CREATE [ OR REPLACE ] FUNCTION\n" -#~ " name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } defexpr ] [, ...] ] )\n" -#~ " [ RETURNS rettype\n" -#~ " | RETURNS TABLE ( colname coltype [, ...] ) ]\n" -#~ " { LANGUAGE langname\n" -#~ " | WINDOW\n" -#~ " | IMMUTABLE | STABLE | VOLATILE\n" -#~ " | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n" -#~ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n" -#~ " | COST execution_cost\n" -#~ " | ROWS result_rows\n" -#~ " | SET configuration_parameter { TO value | = value | FROM CURRENT }\n" -#~ " | AS 'definition'\n" -#~ " | AS 'obj_file', 'link_symbol'\n" -#~ " } ...\n" -#~ " [ WITH ( attribute [, ...] ) ]" -#~ msgstr "" -#~ "CREATE [ OR REPLACE ] FUNCTION\n" -#~ " ad ( [ [ argüman modu ] [ argüman adı ] argüman tipi [ { DEFAULT | = } defexpr ] [, ...] ] )\n" -#~ " [ RETURNS rettype\n" -#~ " | RETURNS TABLE ( kolon_adı kolon_tipi [, ...] ) ]\n" -#~ " { LANGUAGE dil adı\n" -#~ " | WINDOW\n" -#~ " | IMMUTABLE | STABLE | VOLATILE\n" -#~ " | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n" -#~ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n" -#~ " | COST execution_cost\n" -#~ " | ROWS result_rows\n" -#~ " | SET yapılandırma parametresi { TO değer | = değer | FROM CURRENT }\n" -#~ " | AS 'tanım'\n" -#~ " | AS 'obj_file', 'link_symbol'\n" -#~ " } ...\n" -#~ " [ WITH ( attribute [, ...] ) ]" - -#~ msgid "" -#~ "CREATE FOREIGN DATA WRAPPER name\n" -#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n" -#~ " [ OPTIONS ( option 'value' [, ... ] ) ]" -#~ msgstr "" -#~ "CREATE FOREIGN DATA WRAPPER ad\n" -#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n" -#~ " [ OPTIONS ( option 'value' [, ... ] ) ]" - -#~ msgid "" -#~ "CREATE DOMAIN name [ AS ] data_type\n" -#~ " [ DEFAULT expression ]\n" -#~ " [ constraint [ ... ] ]\n" -#~ "\n" -#~ "where constraint is:\n" -#~ "\n" -#~ "[ CONSTRAINT constraint_name ]\n" -#~ "{ NOT NULL | NULL | CHECK (expression) }" -#~ msgstr "" -#~ "CREATE DOMAIN name [ AS ] data_type\n" -#~ " [ DEFAULT expression ]\n" -#~ " [ constraint [ ... ] ]\n" -#~ "\n" -#~ "constraint aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ "[ CONSTRAINT constraint_name ]\n" -#~ "{ NOT NULL | NULL | CHECK (expression) }" - -#~ msgid "" -#~ "CREATE DATABASE name\n" -#~ " [ [ WITH ] [ OWNER [=] dbowner ]\n" -#~ " [ TEMPLATE [=] template ]\n" -#~ " [ ENCODING [=] encoding ]\n" -#~ " [ LC_COLLATE [=] lc_collate ]\n" -#~ " [ LC_CTYPE [=] lc_ctype ]\n" -#~ " [ TABLESPACE [=] tablespace ]\n" -#~ " [ CONNECTION LIMIT [=] connlimit ] ]" -#~ msgstr "" -#~ "CREATE DATABASE ad\n" -#~ " [ [ WITH ] [ OWNER [=] veritabanı sahibi ]\n" -#~ " [ TEMPLATE [=] şablon ]\n" -#~ " [ ENCODING [=] dil kodlaması ]\n" -#~ " [ LC_COLLATE [=] lc_collate ]\n" -#~ " [ LC_CTYPE [=] lc_ctype ]\n" -#~ " [ TABLESPACE [=] tablespace ]\n" -#~ " [ CONNECTION LIMIT [=] bağlantı sınırı ] ]" - -#~ msgid "" -#~ "CREATE [ DEFAULT ] CONVERSION name\n" -#~ " FOR source_encoding TO dest_encoding FROM funcname" -#~ msgstr "" -#~ "CREATE [ DEFAULT ] CONVERSION name\n" -#~ " FOR source_encoding TO dest_encoding FROM funcname" - -#~ msgid "" -#~ "CREATE CONSTRAINT TRIGGER name\n" -#~ " AFTER event [ OR ... ]\n" -#~ " ON table_name\n" -#~ " [ FROM referenced_table_name ]\n" -#~ " { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }\n" -#~ " FOR EACH ROW\n" -#~ " EXECUTE PROCEDURE funcname ( arguments )" -#~ msgstr "" -#~ "CREATE CONSTRAINT TRIGGER name\n" -#~ " AFTER event [ OR ... ]\n" -#~ " ON table_name\n" -#~ " [ FROM referenced_table_name ]\n" -#~ " { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }\n" -#~ " FOR EACH ROW\n" -#~ " EXECUTE PROCEDURE funcname ( arguments )" - -#~ msgid "" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITH FUNCTION funcname (argtypes)\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n" -#~ "\n" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITHOUT FUNCTION\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n" -#~ "\n" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITH INOUT\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]" -#~ msgstr "" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITH FUNCTION funcname (argtypes)\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n" -#~ "\n" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITHOUT FUNCTION\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n" -#~ "\n" -#~ "CREATE CAST (sourcetype AS targettype)\n" -#~ " WITH INOUT\n" -#~ " [ AS ASSIGNMENT | AS IMPLICIT ]" - -#~ msgid "" -#~ "CREATE AGGREGATE name ( input_data_type [ , ... ] ) (\n" -#~ " SFUNC = sfunc,\n" -#~ " STYPE = state_data_type\n" -#~ " [ , FINALFUNC = ffunc ]\n" -#~ " [ , INITCOND = initial_condition ]\n" -#~ " [ , SORTOP = sort_operator ]\n" -#~ ")\n" -#~ "\n" -#~ "or the old syntax\n" -#~ "\n" -#~ "CREATE AGGREGATE name (\n" -#~ " BASETYPE = base_type,\n" -#~ " SFUNC = sfunc,\n" -#~ " STYPE = state_data_type\n" -#~ " [ , FINALFUNC = ffunc ]\n" -#~ " [ , INITCOND = initial_condition ]\n" -#~ " [ , SORTOP = sort_operator ]\n" -#~ ")" -#~ msgstr "" -#~ "CREATE AGGREGATE name ( input_data_type [ , ... ] ) (\n" -#~ " SFUNC = sfunc,\n" -#~ " STYPE = state_data_type\n" -#~ " [ , FINALFUNC = ffunc ]\n" -#~ " [ , INITCOND = initial_condition ]\n" -#~ " [ , SORTOP = sort_operator ]\n" -#~ ")\n" -#~ "\n" -#~ "or the old syntax\n" -#~ "\n" -#~ "CREATE AGGREGATE name (\n" -#~ " BASETYPE = base_type,\n" -#~ " SFUNC = sfunc,\n" -#~ " STYPE = state_data_type\n" -#~ " [ , FINALFUNC = ffunc ]\n" -#~ " [ , INITCOND = initial_condition ]\n" -#~ " [ , SORTOP = sort_operator ]\n" -#~ ")" - -#~ msgid "" -#~ "COPY tablename [ ( column [, ...] ) ]\n" -#~ " FROM { 'filename' | STDIN }\n" -#~ " [ [ WITH ] \n" -#~ " [ BINARY ]\n" -#~ " [ OIDS ]\n" -#~ " [ DELIMITER [ AS ] 'delimiter' ]\n" -#~ " [ NULL [ AS ] 'null string' ]\n" -#~ " [ CSV [ HEADER ]\n" -#~ " [ QUOTE [ AS ] 'quote' ] \n" -#~ " [ ESCAPE [ AS ] 'escape' ]\n" -#~ " [ FORCE NOT NULL column [, ...] ]\n" -#~ "\n" -#~ "COPY { tablename [ ( column [, ...] ) ] | ( query ) }\n" -#~ " TO { 'filename' | STDOUT }\n" -#~ " [ [ WITH ] \n" -#~ " [ BINARY ]\n" -#~ " [ OIDS ]\n" -#~ " [ DELIMITER [ AS ] 'delimiter' ]\n" -#~ " [ NULL [ AS ] 'null string' ]\n" -#~ " [ CSV [ HEADER ]\n" -#~ " [ QUOTE [ AS ] 'quote' ] \n" -#~ " [ ESCAPE [ AS ] 'escape' ]\n" -#~ " [ FORCE QUOTE column [, ...] ]" -#~ msgstr "" -#~ "COPY tablo adı [ ( kolon [, ...] ) ]\n" -#~ " FROM { 'dosya adı' | STDIN }\n" -#~ " [ [ WITH ] \n" -#~ " [ BINARY ]\n" -#~ " [ OIDS ]\n" -#~ " [ DELIMITER [ AS ] 'delimiter' ]\n" -#~ " [ NULL [ AS ] 'null string' ]\n" -#~ " [ CSV [ HEADER ]\n" -#~ " [ QUOTE [ AS ] 'quote' ] \n" -#~ " [ ESCAPE [ AS ] 'escape' ]\n" -#~ " [ FORCE NOT NULL column [, ...] ]\n" -#~ "\n" -#~ "COPY { tablo adı [ ( kolon [, ...] ) ] | ( sorgu ) }\n" -#~ " TO { 'dosya adı' | STDOUT }\n" -#~ " [ [ WITH ] \n" -#~ " [ BINARY ]\n" -#~ " [ OIDS ]\n" -#~ " [ DELIMITER [ AS ] 'delimiter' ]\n" -#~ " [ NULL [ AS ] 'null string' ]\n" -#~ " [ CSV [ HEADER ]\n" -#~ " [ QUOTE [ AS ] 'quote' ] \n" -#~ " [ ESCAPE [ AS ] 'escape' ]\n" -#~ " [ FORCE QUOTE column [, ...] ]" - -#~ msgid "COMMIT PREPARED transaction_id" -#~ msgstr "COMMIT PREPARED transaction_id" - -#~ msgid "COMMIT [ WORK | TRANSACTION ]" -#~ msgstr "COMMIT [ WORK | TRANSACTION ]" - -#~ msgid "" -#~ "COMMENT ON\n" -#~ "{\n" -#~ " TABLE object_name |\n" -#~ " COLUMN table_name.column_name |\n" -#~ " AGGREGATE agg_name (agg_type [, ...] ) |\n" -#~ " CAST (sourcetype AS targettype) |\n" -#~ " CONSTRAINT constraint_name ON table_name |\n" -#~ " CONVERSION object_name |\n" -#~ " DATABASE object_name |\n" -#~ " DOMAIN object_name |\n" -#~ " FUNCTION func_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |\n" -#~ " INDEX object_name |\n" -#~ " LARGE OBJECT large_object_oid |\n" -#~ " OPERATOR op (leftoperand_type, rightoperand_type) |\n" -#~ " OPERATOR CLASS object_name USING index_method |\n" -#~ " OPERATOR FAMILY object_name USING index_method |\n" -#~ " [ PROCEDURAL ] LANGUAGE object_name |\n" -#~ " ROLE object_name |\n" -#~ " RULE rule_name ON table_name |\n" -#~ " SCHEMA object_name |\n" -#~ " SEQUENCE object_name |\n" -#~ " TABLESPACE object_name |\n" -#~ " TEXT SEARCH CONFIGURATION object_name |\n" -#~ " TEXT SEARCH DICTIONARY object_name |\n" -#~ " TEXT SEARCH PARSER object_name |\n" -#~ " TEXT SEARCH TEMPLATE object_name |\n" -#~ " TRIGGER trigger_name ON table_name |\n" -#~ " TYPE object_name |\n" -#~ " VIEW object_name\n" -#~ "} IS 'text'" -#~ msgstr "" -#~ "COMMENT ON\n" -#~ "{\n" -#~ " TABLE nesne_ado |\n" -#~ " COLUMN tablo_adı.kolon_adı |\n" -#~ " AGGREGATE agg_name (agg_type [, ...] ) |\n" -#~ " CAST (sourcetype AS targettype) |\n" -#~ " CONSTRAINT constraint_name ON table_name |\n" -#~ " CONVERSION nesne_adı |\n" -#~ " DATABASE nesne_adı |\n" -#~ " DOMAIN nesne_adı |\n" -#~ " FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |\n" -#~ " INDEX nesne_adı |\n" -#~ " LARGE OBJECT large_object_oid |\n" -#~ " OPERATOR op (leftoperand_type, rightoperand_type) |\n" -#~ " OPERATOR CLASS nesne_adı USING index_yöntemi |\n" -#~ " OPERATOR FAMILY nesne_adı USING index_yöntemi |\n" -#~ " [ PROCEDURAL ] LANGUAGE nesne_adı |\n" -#~ " ROLE nesne_adı |\n" -#~ " RULE kural_adı ON tablo_adı |\n" -#~ " SCHEMA nesne_adı |\n" -#~ " SEQUENCE nesne_adı |\n" -#~ " TABLESPACE nesne_adı |\n" -#~ " TEXT SEARCH CONFIGURATION nesne_adı |\n" -#~ " TEXT SEARCH DICTIONARY nesne_adı |\n" -#~ " TEXT SEARCH PARSER nesne_adı |\n" -#~ " TEXT SEARCH TEMPLATE nesne_adı |\n" -#~ " TRIGGER tetikleyici_adı ON table_name |\n" -#~ " TYPE nesne_adı |\n" -#~ " VIEW nesne_adı\n" -#~ "} IS 'text'" - -#~ msgid "" -#~ "CLUSTER [VERBOSE] tablename [ USING indexname ]\n" -#~ "CLUSTER [VERBOSE]" -#~ msgstr "" -#~ "CLUSTER [VERBOSE] tablo adı [ USING index adı ]\n" -#~ "CLUSTER [VERBOSE]" - -#~ msgid "CLOSE { name | ALL }" -#~ msgstr "CLOSE { name | ALL }" - -#~ msgid "CHECKPOINT" -#~ msgstr "CHECKPOINT" - -#~ msgid "" -#~ "BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]\n" -#~ "\n" -#~ "where transaction_mode is one of:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" -#~ msgstr "" -#~ "BEGIN [ WORK | TRANSACTION ] [ transaction_modu [, ...] ]\n" -#~ "\n" -#~ "transaction_modu aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n" -#~ " READ WRITE | READ ONLY" - -#~ msgid "ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]" -#~ msgstr "ANALYZE [ VERBOSE ] [ tablo [ ( kolon [, ...] ) ] ]" - -#~ msgid "" -#~ "ALTER VIEW name ALTER [ COLUMN ] column SET DEFAULT expression\n" -#~ "ALTER VIEW name ALTER [ COLUMN ] column DROP DEFAULT\n" -#~ "ALTER VIEW name OWNER TO new_owner\n" -#~ "ALTER VIEW name RENAME TO new_name\n" -#~ "ALTER VIEW name SET SCHEMA new_schema" -#~ msgstr "" -#~ "ALTER VIEW ad ALTER [ COLUMN ] kolon SET DEFAULT ifade\n" -#~ "ALTER VIEW ad ALTER [ COLUMN ] kolon DROP DEFAULT\n" -#~ "ALTER VIEW ad OWNER TO yeni sahibi\n" -#~ "ALTER VIEW ad RENAME TO yeni adı\n" -#~ "ALTER VIEW ad SET SCHEMA yeni şema" - -#~ msgid "" -#~ "ALTER USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }\n" -#~ " SERVER servername\n" -#~ " OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )" -#~ msgstr "" -#~ "ALTER USER MAPPING FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC }\n" -#~ " SERVER sunucu adı\n" -#~ " OPTIONS ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ] )" - -#~ msgid "" -#~ "ALTER USER name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ "\n" -#~ "ALTER USER name RENAME TO newname\n" -#~ "\n" -#~ "ALTER USER name SET configuration_parameter { TO | = } { value | DEFAULT }\n" -#~ "ALTER USER name SET configuration_parameter FROM CURRENT\n" -#~ "ALTER USER name RESET configuration_parameter\n" -#~ "ALTER USER name RESET ALL" -#~ msgstr "" -#~ "ALTER USER kullanıcı_adı [ [ WITH ] seçenek [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT bağlantı_sayısı_sınırı\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ "\n" -#~ "ALTER USER kullanıcı_adı RENAME TO yeni_adı\n" -#~ "\n" -#~ "ALTER USER kullanıcı_adı SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n" -#~ "ALTER USER kullanıcı_adı SET yapılandırma_parametresi FROM CURRENT\n" -#~ "ALTER USER kullanıcı_adı RESET yapılandırma_parametresi\n" -#~ "ALTER USER kullanıcı_adı RESET ALL" - -#~ msgid "" -#~ "ALTER TYPE name RENAME TO new_name\n" -#~ "ALTER TYPE name OWNER TO new_owner \n" -#~ "ALTER TYPE name SET SCHEMA new_schema" -#~ msgstr "" -#~ "ALTER TYPE ad RENAME TO yeni adı\n" -#~ "ALTER TYPE ad OWNER TO yeni sahibi \n" -#~ "ALTER TYPE ad SET SCHEMA yeni şema" - -#~ msgid "ALTER TRIGGER name ON table RENAME TO newname" -#~ msgstr "ALTER TRIGGER trigger_adı ON tablo_adı RENAME TO yeni_ad" - -#~ msgid "ALTER TEXT SEARCH TEMPLATE name RENAME TO newname" -#~ msgstr "ALTER TEXT SEARCH TEMPLATE şablon_adı RENAME TO yeni_adı" - -#~ msgid "ALTER TEXT SEARCH PARSER name RENAME TO newname" -#~ msgstr "ALTER TEXT SEARCH PARSER ayrıştırıcı_adı RENAME TO yeni_adı" - -#~ msgid "" -#~ "ALTER TEXT SEARCH DICTIONARY name (\n" -#~ " option [ = value ] [, ... ]\n" -#~ ")\n" -#~ "ALTER TEXT SEARCH DICTIONARY name RENAME TO newname\n" -#~ "ALTER TEXT SEARCH DICTIONARY name OWNER TO newowner" -#~ msgstr "" -#~ "ALTER TEXT SEARCH DICTIONARY ad (\n" -#~ " option [ = value ] [, ... ]\n" -#~ ")\n" -#~ "ALTER TEXT SEARCH DICTIONARY ad RENAME TO yeni adı\n" -#~ "ALTER TEXT SEARCH DICTIONARY ad OWNER TO yeni sahibi" - -#~ msgid "" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING REPLACE old_dictionary WITH new_dictionary\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name RENAME TO newname\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name OWNER TO newowner" -#~ msgstr "" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING REPLACE old_dictionary WITH new_dictionary\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name\n" -#~ " DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name RENAME TO newname\n" -#~ "ALTER TEXT SEARCH CONFIGURATION name OWNER TO newowner" - -#~ msgid "" -#~ "ALTER TABLESPACE name RENAME TO newname\n" -#~ "ALTER TABLESPACE name OWNER TO newowner" -#~ msgstr "" -#~ "ALTER TABLESPACE tablespace_adı RENAME TO yeni_ad\n" -#~ "ALTER TABLESPACE tablespace_adı OWNER TO yeni_sahip" - -#~ msgid "" -#~ "ALTER TABLE [ ONLY ] name [ * ]\n" -#~ " action [, ... ]\n" -#~ "ALTER TABLE [ ONLY ] name [ * ]\n" -#~ " RENAME [ COLUMN ] column TO new_column\n" -#~ "ALTER TABLE name\n" -#~ " RENAME TO new_name\n" -#~ "ALTER TABLE name\n" -#~ " SET SCHEMA new_schema\n" -#~ "\n" -#~ "where action is one of:\n" -#~ "\n" -#~ " ADD [ COLUMN ] column type [ column_constraint [ ... ] ]\n" -#~ " DROP [ COLUMN ] column [ RESTRICT | CASCADE ]\n" -#~ " ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]\n" -#~ " ALTER [ COLUMN ] column SET DEFAULT expression\n" -#~ " ALTER [ COLUMN ] column DROP DEFAULT\n" -#~ " ALTER [ COLUMN ] column { SET | DROP } NOT NULL\n" -#~ " ALTER [ COLUMN ] column SET STATISTICS integer\n" -#~ " ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n" -#~ " ADD table_constraint\n" -#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n" -#~ " DISABLE TRIGGER [ trigger_name | ALL | USER ]\n" -#~ " ENABLE TRIGGER [ trigger_name | ALL | USER ]\n" -#~ " ENABLE REPLICA TRIGGER trigger_name\n" -#~ " ENABLE ALWAYS TRIGGER trigger_name\n" -#~ " DISABLE RULE rewrite_rule_name\n" -#~ " ENABLE RULE rewrite_rule_name\n" -#~ " ENABLE REPLICA RULE rewrite_rule_name\n" -#~ " ENABLE ALWAYS RULE rewrite_rule_name\n" -#~ " CLUSTER ON index_name\n" -#~ " SET WITHOUT CLUSTER\n" -#~ " SET WITH OIDS\n" -#~ " SET WITHOUT OIDS\n" -#~ " SET ( storage_parameter = value [, ... ] )\n" -#~ " RESET ( storage_parameter [, ... ] )\n" -#~ " INHERIT parent_table\n" -#~ " NO INHERIT parent_table\n" -#~ " OWNER TO new_owner\n" -#~ " SET TABLESPACE new_tablespace" -#~ msgstr "" -#~ "ALTER TABLE [ ONLY ] ad [ * ]\n" -#~ " action [, ... ]\n" -#~ "ALTER TABLE [ ONLY ] ad [ * ]\n" -#~ " RENAME [ COLUMN ] kolon TO yeni kolon\n" -#~ "ALTER TABLE ad\n" -#~ " RENAME TO yeni ad\n" -#~ "ALTER TABLE ad\n" -#~ " SET SCHEMA yeni şema\n" -#~ "\n" -#~ "action aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " ADD [ COLUMN ] kolon kolon_tipi [ kolon kısıtlaması [ ... ] ]\n" -#~ " DROP [ COLUMN ] kolon [ RESTRICT | CASCADE ]\n" -#~ " ALTER [ COLUMN ] kolon [ SET DATA ] TYPE type [ USING ifade ]\n" -#~ " ALTER [ COLUMN ] kolon SET DEFAULT ifade\n" -#~ " ALTER [ COLUMN ] kolon DROP DEFAULT\n" -#~ " ALTER [ COLUMN ] kolon { SET | DROP } NOT NULL\n" -#~ " ALTER [ COLUMN ] kolon SET STATISTICS tamsayı\n" -#~ " ALTER [ COLUMN ] kolon SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n" -#~ " ADD tablo kısıtlaması\n" -#~ " DROP CONSTRAINT kısıtlama adı [ RESTRICT | CASCADE ]\n" -#~ " DISABLE TRIGGER [ trigger adı | ALL | USER ]\n" -#~ " ENABLE TRIGGER[ trigger adı | ALL | USER ]\n" -#~ " ENABLE REPLICA TRIGGER trigger adı\n" -#~ " ENABLE ALWAYS TRIGGER trigger adı\n" -#~ " DISABLE RULE rewrite_rule_name\n" -#~ " ENABLE RULE rewrite_rule_name\n" -#~ " ENABLE REPLICA RULE rewrite_rule_name\n" -#~ " ENABLE ALWAYS RULE rewrite_rule_name\n" -#~ " CLUSTER ON index adı\n" -#~ " SET WITHOUT CLUSTER\n" -#~ " SET WITH OIDS\n" -#~ " SET WITHOUT OIDS\n" -#~ " SET ( storage_parameter = value [, ... ] )\n" -#~ " RESET ( storage_parameter [, ... ] )\n" -#~ " INHERIT üst tablo\n" -#~ " NO INHERIT üst tablo\n" -#~ " OWNER TO yeni sahibi\n" -#~ " SET TABLESPACE yeni tablespace" - -#~ msgid "" -#~ "ALTER SERVER servername [ VERSION 'newversion' ]\n" -#~ " [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) ]\n" -#~ "ALTER SERVER servername OWNER TO new_owner" -#~ msgstr "" -#~ "ALTER SERVER sunucu adı [ VERSION 'yeni sürüm' ]\n" -#~ " [ OPTIONS ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ] ) ]\n" -#~ "ALTER SERVER sunucu adı OWNER TO yeni sahibi" - -#~ msgid "" -#~ "ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]\n" -#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n" -#~ " [ START [ WITH ] start ]\n" -#~ " [ RESTART [ [ WITH ] restart ] ]\n" -#~ " [ CACHE cache ] [ [ NO ] CYCLE ]\n" -#~ " [ OWNED BY { table.column | NONE } ]\n" -#~ "ALTER SEQUENCE name OWNER TO new_owner\n" -#~ "ALTER SEQUENCE name RENAME TO new_name\n" -#~ "ALTER SEQUENCE name SET SCHEMA new_schema" -#~ msgstr "" -#~ "ALTER SEQUENCE ad [ INCREMENT [ BY ] arttırma miktarı ]\n" -#~ " [ MINVALUE en az değer | NO MINVALUE ] [ MAXVALUE üst değer | NO MAXVALUE ]\n" -#~ " [ START [ WITH ] başlama sayısı ]\n" -#~ " [ RESTART [ [ WITH ] yeniden başlama sayısı ] ]\n" -#~ " [ CACHE önbellek ] [ [ NO ] CYCLE ]\n" -#~ " [ OWNED BY { tablo.kolon | NONE } ]\n" -#~ "ALTER SEQUENCE ad OWNER TO yeni sahibir\n" -#~ "ALTER SEQUENCE ad RENAME TO yeni adı\n" -#~ "ALTER SEQUENCE namade SET SCHEMA yeni şeması" - -#~ msgid "" -#~ "ALTER SCHEMA name RENAME TO newname\n" -#~ "ALTER SCHEMA name OWNER TO newowner" -#~ msgstr "" -#~ "ALTER SCHEMA şema_adı RENAME TO yeni_ad\n" -#~ "ALTER SCHEMA şema_adı OWNER TO yeni_sahip" - -#~ msgid "" -#~ "ALTER ROLE name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT connlimit\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ "\n" -#~ "ALTER ROLE name RENAME TO newname\n" -#~ "\n" -#~ "ALTER ROLE name SET configuration_parameter { TO | = } { value | DEFAULT }\n" -#~ "ALTER ROLE name SET configuration_parameter FROM CURRENT\n" -#~ "ALTER ROLE name RESET configuration_parameter\n" -#~ "ALTER ROLE name RESET ALL" -#~ msgstr "" -#~ "ALTER ROLE rol_adı [ [ WITH ] seçenek [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ " \n" -#~ " SUPERUSER | NOSUPERUSER\n" -#~ " | CREATEDB | NOCREATEDB\n" -#~ " | CREATEROLE | NOCREATEROLE\n" -#~ " | CREATEUSER | NOCREATEUSER\n" -#~ " | INHERIT | NOINHERIT\n" -#~ " | LOGIN | NOLOGIN\n" -#~ " | CONNECTION LIMIT bağlantı_sayısı_sınırı\n" -#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n" -#~ " | VALID UNTIL 'timestamp' \n" -#~ "\n" -#~ "ALTER ROLE rol_adı RENAME TO yeni_adı\n" -#~ "\n" -#~ "ALTER ROLE rol_adı SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n" -#~ "ALTER ROLE rol_adı SET yapılandırma_parametresi FROM CURRENT\n" -#~ "ALTER ROLE rol_adı RESET yapılandırma_parametresi\n" -#~ "ALTER ROLE rol_adı RESET ALL" - -#~ msgid "" -#~ "ALTER OPERATOR FAMILY name USING index_method ADD\n" -#~ " { OPERATOR strategy_number operator_name ( op_type, op_type )\n" -#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n" -#~ " } [, ... ]\n" -#~ "ALTER OPERATOR FAMILY name USING index_method DROP\n" -#~ " { OPERATOR strategy_number ( op_type [ , op_type ] )\n" -#~ " | FUNCTION support_number ( op_type [ , op_type ] )\n" -#~ " } [, ... ]\n" -#~ "ALTER OPERATOR FAMILY name USING index_method RENAME TO newname\n" -#~ "ALTER OPERATOR FAMILY name USING index_method OWNER TO newowner" -#~ msgstr "" -#~ "ALTER OPERATOR FAMILY adı USING index_methodu ADD\n" -#~ " { OPERATOR strategy_number operator_name ( op_type, op_type )\n" -#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n" -#~ " } [, ... ]\n" -#~ "ALTER OPERATOR FAMILY ad USING index_methodu DROP\n" -#~ " { OPERATOR strategy_number ( op_type [ , op_type ] )\n" -#~ " | FUNCTION support_number ( op_type [ , op_type ] )\n" -#~ " } [, ... ]\n" -#~ "ALTER OPERATOR FAMILY ad USING index_methodu RENAME TO yeni ad\n" -#~ "ALTER OPERATOR FAMILY ad USING index_methodu OWNER TO yeni sahibi" - -#~ msgid "" -#~ "ALTER OPERATOR CLASS name USING index_method RENAME TO newname\n" -#~ "ALTER OPERATOR CLASS name USING index_method OWNER TO newowner" -#~ msgstr "" -#~ "ALTER OPERATOR CLASS ad USING index_method RENAME TO yeni_ad\n" -#~ "ALTER OPERATOR CLASS ad USING index_method OWNER TO yeni_sahip" - -#~ msgid "ALTER OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) OWNER TO newowner" -#~ msgstr "ALTER OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) OWNER TO yeni_sahip" - -#~ msgid "" -#~ "ALTER [ PROCEDURAL ] LANGUAGE name RENAME TO newname\n" -#~ "ALTER [ PROCEDURAL ] LANGUAGE name OWNER TO new_owner" -#~ msgstr "" -#~ "ALTER [ PROCEDURAL ] LANGUAGE name RENAME TO newname\n" -#~ "ALTER [ PROCEDURAL ] LANGUAGE name OWNER TO new_owner" - -#~ msgid "" -#~ "ALTER INDEX name RENAME TO new_name\n" -#~ "ALTER INDEX name SET TABLESPACE tablespace_name\n" -#~ "ALTER INDEX name SET ( storage_parameter = value [, ... ] )\n" -#~ "ALTER INDEX name RESET ( storage_parameter [, ... ] )" -#~ msgstr "" -#~ "ALTER INDEX name RENAME TO new_name\n" -#~ "ALTER INDEX name SET TABLESPACE tablespace_name\n" -#~ "ALTER INDEX name SET ( storage_parameter = value [, ... ] )\n" -#~ "ALTER INDEX name RESET ( storage_parameter [, ... ] )" - -#~ msgid "" -#~ "ALTER GROUP groupname ADD USER username [, ... ]\n" -#~ "ALTER GROUP groupname DROP USER username [, ... ]\n" -#~ "\n" -#~ "ALTER GROUP groupname RENAME TO newname" -#~ msgstr "" -#~ "ALTER GROUP grup_adı ADD USER kullanıcı_adı [, ... ]\n" -#~ "ALTER GROUP grup_adı DROP USER kullanıcı_adı [, ... ]\n" -#~ "\n" -#~ "ALTER GROUP grup_adı RENAME TO yeni_ad" - -#~ msgid "" -#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " action [ ... ] [ RESTRICT ]\n" -#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " RENAME TO new_name\n" -#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " OWNER TO new_owner\n" -#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " SET SCHEMA new_schema\n" -#~ "\n" -#~ "where action is one of:\n" -#~ "\n" -#~ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n" -#~ " IMMUTABLE | STABLE | VOLATILE\n" -#~ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n" -#~ " COST execution_cost\n" -#~ " ROWS result_rows\n" -#~ " SET configuration_parameter { TO | = } { value | DEFAULT }\n" -#~ " SET configuration_parameter FROM CURRENT\n" -#~ " RESET configuration_parameter\n" -#~ " RESET ALL" -#~ msgstr "" -#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " işlem [ ... ] [ RESTRICT ]\n" -#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " RENAME TO yeni_adı\n" -#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " OWNER TO yeni_sahibi\n" -#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n" -#~ " SET SCHEMA yeni_şema\n" -#~ "\n" -#~ "işlem aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n" -#~ " IMMUTABLE | STABLE | VOLATILE\n" -#~ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n" -#~ " COST çalıştırma_maliyeti(execution cost)\n" -#~ " ROWS result_rows\n" -#~ " SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n" -#~ " SET yapılandırma_parametresi FROM CURRENT\n" -#~ " RESET yapılandırma_parametresi\n" -#~ " RESET ALL" - -#~ msgid "" -#~ "ALTER FOREIGN DATA WRAPPER name\n" -#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n" -#~ " [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) ]\n" -#~ "ALTER FOREIGN DATA WRAPPER name OWNER TO new_owner" -#~ msgstr "" -#~ "ALTER FOREIGN DATA WRAPPER ad\n" -#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n" -#~ " [ SEÇENEKLER ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ]) ]\n" -#~ "ALTER FOREIGN DATA WRAPPER ad OWNER TO yeni sahibi" - -#~ msgid "" -#~ "ALTER DOMAIN name\n" -#~ " { SET DEFAULT expression | DROP DEFAULT }\n" -#~ "ALTER DOMAIN name\n" -#~ " { SET | DROP } NOT NULL\n" -#~ "ALTER DOMAIN name\n" -#~ " ADD domain_constraint\n" -#~ "ALTER DOMAIN name\n" -#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n" -#~ "ALTER DOMAIN name\n" -#~ " OWNER TO new_owner \n" -#~ "ALTER DOMAIN name\n" -#~ " SET SCHEMA new_schema" -#~ msgstr "" -#~ "ALTER DOMAIN name\n" -#~ " { SET DEFAULT expression | DROP DEFAULT }\n" -#~ "ALTER DOMAIN name\n" -#~ " { SET | DROP } NOT NULL\n" -#~ "ALTER DOMAIN name\n" -#~ " ADD domain_constraint\n" -#~ "ALTER DOMAIN name\n" -#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n" -#~ "ALTER DOMAIN name\n" -#~ " OWNER TO new_owner \n" -#~ "ALTER DOMAIN name\n" -#~ " SET SCHEMA new_schema" - -#~ msgid "" -#~ "ALTER DATABASE name [ [ WITH ] option [ ... ] ]\n" -#~ "\n" -#~ "where option can be:\n" -#~ "\n" -#~ " CONNECTION LIMIT connlimit\n" -#~ "\n" -#~ "ALTER DATABASE name RENAME TO newname\n" -#~ "\n" -#~ "ALTER DATABASE name OWNER TO new_owner\n" -#~ "\n" -#~ "ALTER DATABASE name SET TABLESPACE new_tablespace\n" -#~ "\n" -#~ "ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }\n" -#~ "ALTER DATABASE name SET configuration_parameter FROM CURRENT\n" -#~ "ALTER DATABASE name RESET configuration_parameter\n" -#~ "ALTER DATABASE name RESET ALL" -#~ msgstr "" -#~ "ALTER DATABASE veritabanı_adı [ [ WITH ] seçenek [ ... ] ]\n" -#~ "\n" -#~ "seçenek aşağıdakilerden birisi olabilir:\n" -#~ "\n" -#~ " CONNECTION LIMIT bağlantı limiti\n" -#~ "\n" -#~ "ALTER DATABASE veritabanı_adı RENAME TO yeni_adı\n" -#~ "\n" -#~ "ALTER DATABASE veritabanı_adı OWNER TO yeni_sahibi\n" -#~ "\n" -#~ "ALTER DATABASE veritabanı_adı SET yapılandırma_parametresi { TO | = } { değer | DEFAULT }\n" -#~ "ALTER DATABASE veritabanı_adı SET yapılandırma_parametresi FROM CURRENT\n" -#~ "ALTER DATABASE veritabanı_adı RESET yapılandırma_parametresi\n" -#~ "ALTER DATABASE veritabanı_adı RESET ALL" - -#~ msgid "" -#~ "ALTER CONVERSION name RENAME TO newname\n" -#~ "ALTER CONVERSION name OWNER TO newowner" -#~ msgstr "" -#~ "ALTER CONVERSION dönüşüm_adı RENAME TO yeni_ad\n" -#~ "ALTER CONVERSION dönüşüm_adı OWNER TO yeni_sahip" - -#~ msgid "" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) RENAME TO new_name\n" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) OWNER TO new_owner\n" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) SET SCHEMA new_schema" -#~ msgstr "" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) RENAME TO new_name\n" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) OWNER TO new_owner\n" -#~ "ALTER AGGREGATE name ( type [ , ... ] ) SET SCHEMA new_schema" - -#~ msgid "ABORT [ WORK | TRANSACTION ]" -#~ msgstr "ABORT [ WORK | TRANSACTION ]" - -#~ msgid "define a new constraint trigger" -#~ msgstr "yeni constraint trigger tanımla" - -#~ msgid "data type" -#~ msgstr "veri tipi" - -#~ msgid " as user \"%s\"" -#~ msgstr " \"%s\" kullanıcısı" - -#~ msgid " at port \"%s\"" -#~ msgstr " \"%s\" portunda" - -#~ msgid " on host \"%s\"" -#~ msgstr " \"%s\" sistemi" - -#~ msgid "\\%s: error\n" -#~ msgstr "\\%s: hata\n" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi" - -#, fuzzy -#~ msgid "attribute" -#~ msgstr "Özellikler" - -#, fuzzy -#~ msgid "tablespace" -#~ msgstr "Tablespace" - -#, fuzzy -#~ msgid "input_data_type" -#~ msgstr "veri tipi" - -#~ msgid "new_column" -#~ msgstr "yeni_kolon" - -#~ msgid "column" -#~ msgstr "kolon" - -#, fuzzy -#~ msgid "agg_type" -#~ msgstr "Hedef tipi" - -#, fuzzy -#~ msgid "Object Description" -#~ msgstr "Nesne açıklamaları" - -#~ msgid "Modifier" -#~ msgstr "Düzenleyici" - -#~ msgid "No relations found.\n" -#~ msgstr "Nesne bulunamadı.\n" - -#~ msgid "No matching relations found.\n" -#~ msgstr "Eşleşen nesne bulunamadı.\n" - -#, fuzzy -#~ msgid "No settings found.\n" -#~ msgstr "Nesne bulunamadı.\n" - -#, fuzzy -#~ msgid "No matching settings found.\n" -#~ msgstr "Eşleşen nesne bulunamadı.\n" - -#~ msgid "default %s" -#~ msgstr "öntanımlı %s" - -#~ msgid "not null" -#~ msgstr "Null değil" - -#~ msgid "Value" -#~ msgstr "Değer" - -#~ msgid "Modifiers" -#~ msgstr "Modifiers" - -#~ msgid "normal" -#~ msgstr "normal" - -#~ msgid "contains support for command-line editing" -#~ msgstr "komut satırı düzenleme desteği mevcuttur" - -#~ msgid "%s: could not set variable \"%s\"\n" -#~ msgstr "%s: \"%s\" değişkeni atanamıyor\n" - -#~ msgid "(No rows)\n" -#~ msgstr "(Satır yok)\n" - -#~ msgid "" -#~ " \\pset NAME [VALUE] set table output option\n" -#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n" -#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" -#~ msgstr "" -#~ " \\pset AD [VALUE] tablo çıktısı biçimini ayarla\n" -#~ " (AD := {format|border|expanded|fieldsep|footer|null|\n" -#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" - -#~ msgid " \\l[+] list all databases\n" -#~ msgstr " \\l[+] tüm tablespaceleri listele\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version sürüm bilgisini gösterir ve çıkar\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help bu yardımı gösterir ve çıkar\n" - -#~ msgid "could not get current user name: %s\n" -#~ msgstr "geçerli kullanıcı adı alınamadı: %s\n" - -#~ msgid "\\copy: unexpected response (%d)\n" -#~ msgstr "\\copy: beklenmeyen yanıt (%d)\n" - -#~ msgid "\\copy: %s" -#~ msgstr "\\copy: %s" - -#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" -#~ msgstr "%s: pg_strdup: null pointer duplicate edilemiyor (iç hata)\n" - -#~ msgid "Showing only tuples." -#~ msgstr "Sadece kayıtlar gösteriliyor." - -#~ msgid "Showing locale-adjusted numeric output." -#~ msgstr "Yerel duyarlı sayısal çıktı gösteriliyor." - -#~ msgid "SSL connection (unknown cipher)\n" -#~ msgstr "SSL bağlantısı (bilinmeyen cipher)\n" - -#, fuzzy -#~ msgid "\\%s: error while setting variable\n" -#~ msgstr "%s: \"%s\" değişkeni atanamıyor\n" - -#~ msgid "Password encryption failed.\n" -#~ msgstr "Parola şifrleme hatası.\n" - -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s: \"%s\" kayıti dosyası açılamıyor: %s\n" - -#~ msgid "string_literal" -#~ msgstr "dizgi_sabiti" - -#~ msgid "unterminated quoted string\n" -#~ msgstr "sonuçlandırılmamış tırnakla sınırlandırılmış dizgi\n" - -#~ msgid "could not read from input file: %s\n" -#~ msgstr "girdi dosyasından okunamadı: %s\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Hataları adresine bildirebilirsiniz.\n" - -#~ msgid "%s\n" -#~ msgstr "%s\n" - -#~ msgid "Procedure" -#~ msgstr "Prosedür" - -#~ msgid "could not close pipe to external command: %s\n" -#~ msgstr "dış komuta doğru olan pipe kapatılamadı: %s\n" - -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "\"%s\" dosyasının durumu görüntülenemedi (stat): %s\n" - -#~ msgid "could not execute command \"%s\": %s\n" -#~ msgstr "\"%s\" komutu yürütülemedi: %s\n" - -#~ msgid "could not parse reloptions array\n" -#~ msgstr "reloptions dizisi (array) ayrıştırılamadı\n" - -#~ msgid "could not open temporary file \"%s\": %s\n" -#~ msgstr "\"%s\" geçici dosya açılamıyor: %s\n" - -#~ msgid "%s: %s\n" -#~ msgstr "%s: %s\n" - -#~ msgid "Invalid command \\%s. Try \\? for help.\n" -#~ msgstr "Geçersiz komut \\%s. Yardım için \\? yazınız.\n" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır" - -#~ msgid "pclose failed: %s" -#~ msgstr "pclose başarısız oldu: %s" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "sembolik link \"%s\" okuma hatası" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s" - -#~ msgid "could not identify current directory: %s" -#~ msgstr "geçerli dizin tespit edilemedi: %s" diff --git a/third_party/spanner_pg/src/bin/psql/po/uk.po b/third_party/spanner_pg/src/bin/psql/po/uk.po index f85f3caf..93cc6e83 100644 --- a/third_party/spanner_pg/src/bin/psql/po/uk.po +++ b/third_party/spanner_pg/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: 2023-04-18 19:30+0000\n" -"PO-Revision-Date: 2023-04-19 15:37\n" +"POT-Creation-Date: 2023-04-18 19:16+0000\n" +"PO-Revision-Date: 2023-04-20 14:13+0200\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,24 +14,29 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/psql.pot\n" -"X-Crowdin-File-ID: 768\n" +"X-Crowdin-File: /REL_15_STABLE/psql.pot\n" +"X-Crowdin-File-ID: 900\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "збій: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "попередження: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../../../src/common/logging.c:301 +#, 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" @@ -68,8 +73,8 @@ msgid "%s() failed: %m" msgstr "%s() помилка: %m" #: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1316 command.c:3248 command.c:3297 command.c:3414 input.c:227 -#: mainloop.c:81 mainloop.c:402 +#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" @@ -90,7 +95,7 @@ msgstr "неможливо дублювати нульовий покажчик msgid "could not look up effective user ID %ld: %s" msgstr "не можу знайти користувача з ефективним ID %ld: %s" -#: ../../common/username.c:45 command.c:564 +#: ../../common/username.c:45 command.c:575 msgid "user does not exist" msgstr "користувача не існує" @@ -137,7 +142,7 @@ msgstr "Запит на скасування відправлений\n" msgid "Could not send cancel request: " msgstr "Не вдалося надіслати запит на скасування: " -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -146,499 +151,494 @@ msgstr[1] "(%lu рядки)" msgstr[2] "(%lu рядків)" msgstr[3] "(%lu рядка)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (внутрішня помилка): %d" -#: ../../fe_utils/psqlscan.l:697 +#: ../../fe_utils/psqlscan.l:702 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "пропуск рекурсивного розгортання змінної \"%s\"" -#: command.c:229 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "не вдалося знайти локального користувача з ідентифікатором %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "локального користувача з ідентифікатором %d не існує" + +#: command.c:232 #, c-format msgid "invalid command \\%s" msgstr "Невірна команда \\%s" -#: command.c:231 +#: command.c:234 #, c-format msgid "Try \\? for help." msgstr "Спробуйте \\? для отримання довідки." -#: command.c:249 +#: command.c:252 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: зайвий аргумент \"%s\" проігноровано" -#: command.c:301 +#: command.c:304 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s команду проігноровано; скористайтесь \\endif або Ctrl-C, щоб вийти з поточного блоку \\if" -#: command.c:562 +#: command.c:573 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "неможливо отримати домашню директорію для користувача ID %ld: %s" -#: command.c:580 +#: command.c:592 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: неможливо змінити директорію на \"%s\": %m" -#: command.c:605 +#: command.c:617 #, c-format msgid "You are currently not connected to a database.\n" msgstr "На даний момент ви від'єднанні від бази даних.\n" -#: command.c:615 +#: command.c:627 #, 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:618 +#: command.c:630 #, 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:624 +#: command.c:636 #, 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:627 +#: command.c:639 #, 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:1011 command.c:1120 command.c:2604 +#: command.c:1030 command.c:1125 command.c:2654 #, c-format msgid "no query buffer" msgstr "немає буферу запитів" -#: command.c:1044 command.c:5314 +#: command.c:1063 command.c:5491 #, c-format msgid "invalid line number: %s" msgstr "невірний номер рядка: %s" -#: command.c:1111 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "Сервер (версія %s) не пітдримує редагування вихідного коду функцій." - -#: command.c:1114 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "Сервер (версія %s) не підтримує редагування визначення подання." - -#: command.c:1198 +#: command.c:1203 msgid "No changes" msgstr "Без змін" -#: command.c:1277 +#: command.c:1282 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: невірне ім'я кодування або не знайдено процедуру конверсії" -#: command.c:1312 command.c:2064 command.c:3244 command.c:3436 command.c:5420 -#: 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:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 +#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 +#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 +#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1319 +#: command.c:1324 msgid "There is no previous error." msgstr "Попередня помилка відсутня." -#: command.c:1432 +#: command.c:1437 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: відсутня права дужка" -#: command.c:1609 command.c:1914 command.c:1928 command.c:1945 command.c:2115 -#: command.c:2351 command.c:2571 command.c:2611 +#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 +#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: не вистачає обов'язкового аргументу" -#: command.c:1740 +#: command.c:1782 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: не може йти після \\else" -#: command.c:1745 +#: command.c:1787 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: немає відповідного \\if" -#: command.c:1809 +#: command.c:1851 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: не може йти після \\else" -#: command.c:1814 +#: command.c:1856 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: немає відповідного \\if" -#: command.c:1854 +#: command.c:1896 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: немає відповідного \\if" -#: command.c:2009 +#: command.c:2053 msgid "Query buffer is empty." msgstr "Буфер запиту порожній." -#: command.c:2046 +#: command.c:2096 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введіть новий пароль користувача \"%s\": " -#: command.c:2049 +#: command.c:2100 msgid "Enter it again: " msgstr "Введіть знову: " -#: command.c:2053 +#: command.c:2109 #, c-format msgid "Passwords didn't match." msgstr "Паролі не співпадають." -#: command.c:2144 +#: command.c:2208 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не вдалося прочитати значення змінної" -#: command.c:2247 +#: command.c:2311 msgid "Query buffer reset (cleared)." msgstr "Буфер запитів скинуто (очищено)." -#: command.c:2269 +#: command.c:2333 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Історію записано до файлу \"%s\".\n" -#: command.c:2356 +#: command.c:2420 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: змінна середовища не повинна містити \"=\"" -#: command.c:2408 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "Сервер (версія %s) не пітдримує відображнення вихідного коду функцій." - -#: command.c:2411 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "Сервер (версія %s) не підтримує відображення визначення подання." - -#: command.c:2418 +#: command.c:2468 #, c-format msgid "function name is required" msgstr "необхідне ім'я функції" -#: command.c:2420 +#: command.c:2470 #, c-format msgid "view name is required" msgstr "необхідне ім'я подання" -#: command.c:2543 +#: command.c:2593 msgid "Timing is on." msgstr "Таймер увімкнено." -#: command.c:2545 +#: command.c:2595 msgid "Timing is off." msgstr "Таймер вимкнено." -#: command.c:2630 command.c:2658 command.c:3875 command.c:3878 command.c:3881 -#: command.c:3887 command.c:3889 command.c:3915 command.c:3925 command.c:3937 -#: command.c:3951 command.c:3978 command.c:4036 common.c:70 copy.c:331 +#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 +#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 +#: command.c:4022 command.c:4049 command.c:4107 common.c:77 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:3049 startup.c:237 startup.c:287 +#: command.c:3107 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3054 startup.c:284 +#: command.c:3112 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль користувача %s:" -#: command.c:3106 +#: command.c:3168 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Не надайте користувачеві, хосту або порту окремо під час використання рядка підключення" -#: command.c:3141 +#: command.c:3203 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Не існує підключення до бази даних для повторного використання параметрів" -#: command.c:3442 +#: command.c:3511 #, c-format msgid "Previous connection kept" msgstr "Попереднє підключення триває" -#: command.c:3448 +#: command.c:3517 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3504 +#: command.c:3573 #, 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:3507 +#: command.c:3576 #, 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:3513 +#: command.c:3582 #, 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:3516 +#: command.c:3585 #, 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:3521 +#: command.c:3590 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\".\n" -#: command.c:3561 +#: command.c:3630 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3569 +#: command.c:3643 #, c-format -msgid "WARNING: %s major version %s, server major version %s.\n" +msgid "" +"WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" -msgstr "УВАГА: мажорна версія %s %s, мажорна версія сервера %s.\n" +msgstr "" +"УВАГА: мажорна версія %s %s, мажорна версія сервера %s.\n" " Деякі функції psql можуть не працювати.\n" -#: command.c:3608 +#: command.c:3680 #, 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:3609 command.c:3610 command.c:3611 +#: command.c:3681 command.c:3682 msgid "unknown" msgstr "невідомо" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "off" msgstr "вимк" -#: command.c:3612 help.c:45 +#: command.c:3683 help.c:42 msgid "on" msgstr "увімк" -#: command.c:3626 +#: command.c:3697 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "З'єднання зашифровано GSSAPI\n" -#: command.c:3646 +#: command.c:3717 #, c-format -msgid "WARNING: Console code page (%u) differs from Windows code page (%u)\n" +msgid "" +"WARNING: Console code page (%u) differs from Windows code page (%u)\n" " 8-bit characters might not work correctly. See psql reference\n" " page \"Notes for Windows users\" for details.\n" -msgstr "УВАГА: Кодова сторінка консолі (%u) відрізняється від кодової сторінки Windows (%u)\n" +msgstr "" +"УВАГА: Кодова сторінка консолі (%u) відрізняється від кодової сторінки Windows (%u)\n" " 8-бітові символи можуть працювати неправильно. Детальніше у розділі \n" " \"Нотатки для користувачів Windows\" у документації psql.\n" -#: command.c:3751 +#: command.c:3822 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "змінна середовища PSQL_EDITOR_LINENUMBER_ARG має бути встановлена, щоб вказувати номер рядка" -#: command.c:3780 +#: command.c:3851 #, c-format msgid "could not start editor \"%s\"" msgstr "неможливо запустити редактор \"%s\"" -#: command.c:3782 +#: command.c:3853 #, c-format msgid "could not start /bin/sh" msgstr "неможливо запустити /bin/sh" -#: command.c:3832 +#: command.c:3903 #, c-format msgid "could not locate temporary directory: %s" msgstr "неможливо знайти тимчасову директорію: %s" -#: command.c:3859 +#: command.c:3930 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчасовий файл \"%s\": %m" -#: command.c:4195 +#: command.c:4266 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" і \"%s" -#: command.c:4215 +#: command.c:4286 #, 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:4234 +#: command.c:4305 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: дозволені стилі ліній: ascii, old-ascii, unicode" -#: command.c:4249 +#: command.c:4320 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: дозволені стилі ліній рамок Unicode: single, double" -#: command.c:4264 +#: command.c:4335 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: дозволені стилі ліній стовпців для Unicode: single, double" -#: command.c:4279 +#: command.c:4350 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: дозволені стилі ліній заголовків для Unicode: single, double" -#: command.c:4322 +#: command.c:4393 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep повинен бути однобайтовим символом" -#: command.c:4327 +#: command.c:4398 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep не може бути подвійною лапкою, новим рядком або поверненням каретки" -#: command.c:4464 command.c:4652 +#: command.c:4535 command.c:4723 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: невідомий параметр: %s" -#: command.c:4484 +#: command.c:4555 #, c-format msgid "Border style is %d.\n" msgstr "Стиль рамки %d.\n" -#: command.c:4490 +#: command.c:4561 #, c-format msgid "Target width is unset.\n" msgstr "Цільова ширина не встановлена.\n" -#: command.c:4492 +#: command.c:4563 #, c-format msgid "Target width is %d.\n" msgstr "Цільова ширина %d.\n" -#: command.c:4499 +#: command.c:4570 #, c-format msgid "Expanded display is on.\n" msgstr "Розширене відображення увімкнуто.\n" -#: command.c:4501 +#: command.c:4572 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Розширене відображення використовується автоматично.\n" -#: command.c:4503 +#: command.c:4574 #, c-format msgid "Expanded display is off.\n" msgstr "Розширене відображення вимкнуто.\n" -#: command.c:4509 +#: command.c:4580 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Розділювач полів CSV: \"%s\".\n" -#: command.c:4517 command.c:4525 +#: command.c:4588 command.c:4596 #, c-format msgid "Field separator is zero byte.\n" msgstr "Розділювач полів - нульовий байт.\n" -#: command.c:4519 +#: command.c:4590 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Розділювач полів \"%s\".\n" -#: command.c:4532 +#: command.c:4603 #, c-format msgid "Default footer is on.\n" msgstr "Нинжній колонтитул увімкнуто за замовчуванням.\n" -#: command.c:4534 +#: command.c:4605 #, c-format msgid "Default footer is off.\n" msgstr "Нинжній колонтитул вимкнуто за замовчуванням.\n" -#: command.c:4540 +#: command.c:4611 #, c-format msgid "Output format is %s.\n" msgstr "Формат виводу %s.\n" -#: command.c:4546 +#: command.c:4617 #, c-format msgid "Line style is %s.\n" msgstr "Стиль лінії %s.\n" -#: command.c:4553 +#: command.c:4624 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null відображається як \"%s\".\n" -#: command.c:4561 +#: command.c:4632 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локалізоване виведення чисел ввімкнено.\n" -#: command.c:4563 +#: command.c:4634 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локалізоване виведення чисел вимкнено.\n" -#: command.c:4570 +#: command.c:4641 #, c-format msgid "Pager is used for long output.\n" msgstr "Пейджер використовується для виведення довгого тексту.\n" -#: command.c:4572 +#: command.c:4643 #, c-format msgid "Pager is always used.\n" msgstr "Завжди використовується пейджер.\n" -#: command.c:4574 +#: command.c:4645 #, c-format msgid "Pager usage is off.\n" msgstr "Пейджер не використовується.\n" -#: command.c:4580 +#: command.c:4651 #, 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" @@ -647,241 +647,242 @@ msgstr[1] "Пейджер не буде використовуватися дл msgstr[2] "Пейджер не буде використовуватися для менш ніж %d рядків.\n" msgstr[3] "Пейджер не буде використовуватися для менш ніж %d рядка.\n" -#: command.c:4590 command.c:4600 +#: command.c:4661 command.c:4671 #, c-format msgid "Record separator is zero byte.\n" msgstr "Розділювач записів - нульовий байт.\n" -#: command.c:4592 +#: command.c:4663 #, c-format msgid "Record separator is .\n" msgstr "Розділювач записів: .\n" -#: command.c:4594 +#: command.c:4665 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Розділювач записів: \"%s\".\n" -#: command.c:4607 +#: command.c:4678 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Табличні атрибути \"%s\".\n" -#: command.c:4610 +#: command.c:4681 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибути таблиць не задані.\n" -#: command.c:4617 +#: command.c:4688 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4619 +#: command.c:4690 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не встановлено.\n" -#: command.c:4626 +#: command.c:4697 #, c-format msgid "Tuples only is on.\n" msgstr "Увімкнуто тільки кортежі.\n" -#: command.c:4628 +#: command.c:4699 #, c-format msgid "Tuples only is off.\n" msgstr "Вимкнуто тільки кортежі.\n" -#: command.c:4634 +#: command.c:4705 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль ліній рамки для Unicode: \"%s\".\n" -#: command.c:4640 +#: command.c:4711 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль ліній стовпців для Unicode: \"%s\".\n" -#: command.c:4646 +#: command.c:4717 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль ліній заголовків для Unicode: \"%s\".\n" -#: command.c:4879 +#: command.c:4950 #, c-format msgid "\\!: failed" msgstr "\\!: помилка" -#: command.c:4904 common.c:652 +#: command.c:4984 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch не може бути використано із пустим запитом" -#: command.c:4945 +#: command.c:5016 +#, c-format +msgid "could not set timer: %m" +msgstr "не вдалося встановити таймер: %m" + +#: command.c:5078 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (кожні %g сек)\n" -#: command.c:4948 +#: command.c:5081 #, c-format msgid "%s (every %gs)\n" msgstr "%s (кожні %g сек)\n" -#: command.c:5010 command.c:5017 common.c:552 common.c:559 common.c:1231 +#: command.c:5142 +#, c-format +msgid "could not wait for signals: %m" +msgstr "не вдалося дочекатися сигналів: %m" + +#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 #, c-format -msgid "********* QUERY **********\n" +msgid "" +"********* QUERY **********\n" "%s\n" -"**************************\n\n" -msgstr "********* ЗАПИТ **********\n" +"**************************\n" +"\n" +msgstr "" +"********* ЗАПИТ **********\n" "%s\n" -"**************************\n\n" +"**************************\n" +"\n" -#: command.c:5209 +#: command.c:5386 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" не є поданням" -#: command.c:5225 +#: command.c:5402 #, c-format msgid "could not parse reloptions array" msgstr "неможливо розібрати масив reloptions" -#: common.c:159 +#: common.c:166 #, c-format msgid "cannot escape without active connection" msgstr "не можна вийти без активного з'єднання" -#: common.c:200 +#: common.c:207 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "аргумент командної оболонки містить символ нового рядка або повернення каретки: \"%s\"" -#: common.c:304 +#: common.c:311 #, c-format msgid "connection to server was lost" msgstr "з'єднання із сервером втрачено" -#: common.c:308 +#: common.c:315 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "З'єднання із сервером втрачено. Спроба перевстановити:" -#: common.c:313 +#: common.c:320 #, c-format msgid "Failed.\n" msgstr "Помилка.\n" -#: common.c:330 +#: common.c:337 #, c-format msgid "Succeeded.\n" msgstr "Вдало.\n" -#: common.c:382 common.c:949 common.c:1166 +#: common.c:389 common.c:1001 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неочікуваний PQresultStatus: %d" -#: common.c:491 +#: common.c:511 #, c-format msgid "Time: %.3f ms\n" msgstr "Час: %.3f мс\n" -#: common.c:506 +#: common.c:526 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Час: %.3f мс (%02d:%06.3f)\n" -#: common.c:515 +#: common.c:535 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Час: %.3f мс (%02d:%02d:%06.3f)\n" -#: common.c:522 +#: common.c:542 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Час: %.3f мс (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:546 common.c:604 common.c:1202 describe.c:6296 +#: common.c:566 common.c:623 common.c:1034 describe.c:6135 #, c-format msgid "You are currently not connected to a database." msgstr "На даний момент ви від'єднанні від бази даних." -#: common.c:659 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch не може бути використано з COPY" - -#: common.c:664 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "неочікуваний результат статусу для \\watch" - -#: common.c:694 +#: common.c:654 #, 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:697 +#: common.c:657 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Асинхронне сповіщення \"%s\" отримане від серверного процесу з PID %d.\n" -#: common.c:730 common.c:747 +#: common.c:688 #, c-format msgid "could not print result table: %m" msgstr "не вдалося надрукувати таблицю результатів: %m" -#: common.c:768 +#: common.c:708 #, c-format msgid "no rows returned for \\gset" msgstr "немає рядків повернутих для \\gset" -#: common.c:773 +#: common.c:713 #, c-format msgid "more than one row returned for \\gset" msgstr "більш, ніж один рядок повернуто для \\gset" -#: common.c:791 +#: common.c:731 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "спробу виконати \\gset в спеціальну змінну \"%s\" проігноровано" -#: common.c:1211 +#: common.c:1043 #, c-format -msgid "***(Single step mode: verify command)*******************************************\n" +msgid "" +"***(Single step mode: verify command)*******************************************\n" "%s\n" "***(press return to proceed or enter x and return to cancel)********************\n" -msgstr "***(Покроковий режим: перевірка команди)*******************************************\n" +msgstr "" +"***(Покроковий режим: перевірка команди)*******************************************\n" "%s\n" "***(Enter - виповнити; х і Enter - відмінити)********************\n" -#: 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:1329 +#: common.c:1126 #, c-format msgid "STATEMENT: %s" msgstr "ІНСТРУКЦІЯ: %s" -#: common.c:1373 +#: common.c:1162 #, c-format msgid "unexpected transaction status (%d)" msgstr "неочікуваний стан транзакції (%d)" -#: common.c:1514 describe.c:2221 +#: common.c:1303 describe.c:2020 msgid "Column" msgstr "Стовпець" -#: common.c:1515 describe.c:186 describe.c:408 describe.c:426 describe.c:471 -#: describe.c:488 describe.c:1152 describe.c:1318 describe.c:1920 -#: describe.c:1944 describe.c:2222 describe.c:4120 describe.c:4345 -#: describe.c:4574 describe.c:5902 +#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 +#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 +#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 +#: describe.c:5767 msgid "Type" msgstr "Тип" -#: common.c:1564 +#: common.c:1353 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не має результату або результат не має стовпців.\n" @@ -941,16 +942,18 @@ msgid "canceled by user" msgstr "скасовано користувачем" #: copy.c:541 -msgid "Enter data to be copied followed by a newline.\n" +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." -msgstr "Введіть дані для копювання, розділяючи переносом рядка.\n" +msgstr "" +"Введіть дані для копювання, розділяючи переносом рядка.\n" "Завершіть введення за допомогою \"\\.\" або за допомогою сигналу EOF." -#: copy.c:671 +#: copy.c:684 msgid "aborted because of read failure" msgstr "перервано через помилку читання" -#: copy.c:705 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "спроба вийти з режиму копіювання" @@ -999,766 +1002,766 @@ msgstr "\\crosstabview: неоднозначна назва стовпця: \"%s msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: ім'я стовпця не знайдено: \"%s\"" -#: describe.c:82 describe.c:388 describe.c:744 describe.c:942 describe.c:1144 -#: describe.c:1307 describe.c:1381 describe.c:4108 describe.c:4332 -#: describe.c:4572 describe.c:4665 describe.c:4815 describe.c:5034 -#: describe.c:5198 describe.c:5443 describe.c:5520 describe.c:5531 -#: describe.c:5595 describe.c:6030 describe.c:6115 +#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 +#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 +#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 +#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 +#: describe.c:5477 describe.c:5881 describe.c:5959 msgid "Schema" msgstr "Схема" -#: describe.c:83 describe.c:183 describe.c:253 describe.c:261 describe.c:389 -#: describe.c:745 describe.c:943 describe.c:1060 describe.c:1145 -#: describe.c:1382 describe.c:4109 describe.c:4333 describe.c:4493 -#: describe.c:4573 describe.c:4666 describe.c:4747 describe.c:4816 -#: describe.c:5035 describe.c:5121 describe.c:5199 describe.c:5444 -#: describe.c:5521 describe.c:5532 describe.c:5596 describe.c:5797 -#: describe.c:5883 describe.c:6113 describe.c:6342 describe.c:6586 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 +#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 +#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 +#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 +#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 +#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 +#: describe.c:5957 describe.c:6186 describe.c:6494 msgid "Name" msgstr "Назва" -#: describe.c:84 describe.c:401 describe.c:419 describe.c:465 describe.c:482 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" msgstr "Тип даних результату" -#: describe.c:92 describe.c:105 describe.c:109 describe.c:402 describe.c:420 -#: describe.c:466 describe.c:483 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" msgstr "Типи даних аргументів" -#: describe.c:117 describe.c:124 describe.c:194 describe.c:284 describe.c:535 -#: describe.c:793 describe.c:958 describe.c:1085 describe.c:1384 -#: describe.c:2242 describe.c:3892 describe.c:4180 describe.c:4379 -#: describe.c:4524 describe.c:4600 describe.c:4675 describe.c:4760 -#: describe.c:4939 describe.c:5062 describe.c:5130 describe.c:5200 -#: describe.c:5345 describe.c:5387 describe.c:5460 describe.c:5524 -#: describe.c:5533 describe.c:5597 describe.c:5823 describe.c:5905 -#: describe.c:6044 describe.c:6116 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 +#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 +#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 +#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 +#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 +#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 +#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 +#: describe.c:5960 describe.c:6992 msgid "Description" msgstr "Опис" -#: describe.c:144 +#: describe.c:128 msgid "List of aggregate functions" msgstr "Перелік агрегатних функцій" -#: describe.c:169 +#: describe.c:153 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (версія %s) не підтримує методи доступу." -#: describe.c:184 +#: describe.c:168 msgid "Index" msgstr "Індекс" -#: describe.c:185 describe.c:4128 describe.c:4358 describe.c:6031 +#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 msgid "Table" msgstr "Таблиця" -#: describe.c:193 describe.c:5802 +#: describe.c:177 describe.c:5679 msgid "Handler" msgstr "Обробник" -#: describe.c:214 +#: describe.c:201 msgid "List of access methods" msgstr "Список методів доступу" -#: describe.c:240 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "Сервер (версія %s) не підтримує табличні простори." - -#: describe.c:254 describe.c:262 describe.c:516 describe.c:783 describe.c:1061 -#: describe.c:1306 describe.c:4121 describe.c:4334 describe.c:4497 -#: describe.c:4749 describe.c:5122 describe.c:5798 describe.c:5884 -#: describe.c:6343 describe.c:6484 describe.c:6587 describe.c:6712 -#: describe.c:6794 large_obj.c:289 +#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 +#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 +#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 +#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 +#: describe.c:6980 msgid "Owner" msgstr "Власник" -#: describe.c:255 describe.c:263 +#: describe.c:231 msgid "Location" msgstr "Розташування" -#: describe.c:274 describe.c:3704 +#: describe.c:241 describe.c:3509 msgid "Options" msgstr "Параметри" -#: describe.c:279 describe.c:756 describe.c:1077 describe.c:4172 -#: describe.c:4176 +#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 msgid "Size" msgstr "Розмір" -#: describe.c:303 +#: describe.c:266 msgid "List of tablespaces" msgstr "Список табличних просторів" -#: describe.c:348 +#: describe.c:311 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df приймає в якості параметрів тільки [anptwS+]" -#: describe.c:356 describe.c:367 +#: describe.c:319 #, 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:404 describe.c:422 describe.c:468 describe.c:485 +#: describe.c:354 describe.c:372 msgid "agg" msgstr "агр." -#: describe.c:405 describe.c:423 +#: describe.c:355 describe.c:373 msgid "window" msgstr "вікно" -#: describe.c:406 +#: describe.c:356 msgid "proc" msgstr "проц" -#: describe.c:407 describe.c:425 describe.c:470 describe.c:487 +#: describe.c:357 describe.c:375 msgid "func" msgstr "функ" -#: describe.c:424 describe.c:469 describe.c:486 describe.c:1528 +#: describe.c:374 describe.c:1390 msgid "trigger" msgstr "тригер" -#: describe.c:498 +#: describe.c:386 msgid "immutable" msgstr "постійна" -#: describe.c:499 +#: describe.c:387 msgid "stable" msgstr "стабільна" -#: describe.c:500 +#: describe.c:388 msgid "volatile" msgstr "мінлива" -#: describe.c:501 +#: describe.c:389 msgid "Volatility" msgstr "Мінливість" -#: describe.c:509 +#: describe.c:397 msgid "restricted" msgstr "обмежений" -#: describe.c:510 +#: describe.c:398 msgid "safe" msgstr "безпечний" -#: describe.c:511 +#: describe.c:399 msgid "unsafe" msgstr "небезпечний" -#: describe.c:512 +#: describe.c:400 msgid "Parallel" msgstr "Паралельність" -#: describe.c:517 +#: describe.c:405 msgid "definer" msgstr "визначник" -#: describe.c:518 +#: describe.c:406 msgid "invoker" msgstr "викликач" -#: describe.c:519 +#: describe.c:407 msgid "Security" msgstr "Безпека" -#: describe.c:524 +#: describe.c:412 msgid "Language" msgstr "Мова" -#: describe.c:528 describe.c:532 +#: describe.c:416 describe.c:420 msgid "Source code" msgstr "Вихідний код" -#: describe.c:707 +#: describe.c:594 msgid "List of functions" msgstr "Список функцій" -#: describe.c:755 +#: describe.c:657 msgid "Internal name" msgstr "Внутрішнє назва" -#: describe.c:777 +#: describe.c:659 msgid "Elements" msgstr "Елементи" -#: describe.c:840 +#: describe.c:711 msgid "List of data types" msgstr "Список типів даних" -#: describe.c:944 +#: describe.c:814 msgid "Left arg type" msgstr "Тип лівого аргумента" -#: describe.c:945 +#: describe.c:815 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:946 +#: describe.c:816 msgid "Result type" msgstr "Результуючий тип" -#: describe.c:951 describe.c:4755 describe.c:4916 describe.c:4922 -#: describe.c:5344 describe.c:6973 describe.c:6977 +#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 +#: describe.c:6909 describe.c:6913 msgid "Function" msgstr "Функція" -#: describe.c:1032 +#: describe.c:902 msgid "List of operators" msgstr "Список операторів" -#: describe.c:1062 +#: describe.c:938 msgid "Encoding" msgstr "Кодування" -#: describe.c:1067 describe.c:5036 +#: describe.c:939 describe.c:4868 msgid "Collate" msgstr "Порядок сортування" -#: describe.c:1068 describe.c:5037 +#: describe.c:940 describe.c:4869 msgid "Ctype" msgstr "Ctype" -#: describe.c:1081 +#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +msgid "ICU Locale" +msgstr "Локалізація ICU" + +#: describe.c:946 describe.c:952 +msgid "Locale Provider" +msgstr "Постачальник локалі" + +#: describe.c:964 msgid "Tablespace" msgstr "Табличний простір" -#: describe.c:1105 +#: describe.c:990 msgid "List of databases" msgstr "Список баз даних" -#: describe.c:1146 describe.c:1309 describe.c:4110 +#: describe.c:1031 describe.c:1184 describe.c:3882 msgid "table" msgstr "таблиця" -#: describe.c:1147 describe.c:4111 +#: describe.c:1032 describe.c:3883 msgid "view" msgstr "подання" -#: describe.c:1148 describe.c:4112 +#: describe.c:1033 describe.c:3884 msgid "materialized view" msgstr "матеріалізоване подання" -#: describe.c:1149 describe.c:1311 describe.c:4114 +#: describe.c:1034 describe.c:1186 describe.c:3886 msgid "sequence" msgstr "послідовність" -#: describe.c:1150 describe.c:4117 +#: describe.c:1035 describe.c:3888 msgid "foreign table" msgstr "зовнішня таблиця" -#: describe.c:1151 describe.c:4118 describe.c:4343 +#: describe.c:1036 describe.c:3889 describe.c:4101 msgid "partitioned table" msgstr "секційна таблиця" -#: describe.c:1163 +#: describe.c:1047 msgid "Column privileges" msgstr "Права для стовпців" -#: describe.c:1194 describe.c:1228 +#: describe.c:1078 describe.c:1112 msgid "Policies" msgstr "Політики" -#: describe.c:1262 describe.c:6653 describe.c:6657 +#: describe.c:1143 describe.c:4510 describe.c:6577 msgid "Access privileges" msgstr "Права доступу" -#: describe.c:1293 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "Сервер (версія %s) не підтримує зміну прав за замовчуванням." - -#: describe.c:1313 +#: describe.c:1188 msgid "function" msgstr "функція" -#: describe.c:1315 +#: describe.c:1190 msgid "type" msgstr "тип" -#: describe.c:1317 +#: describe.c:1192 msgid "schema" msgstr "схема" -#: describe.c:1343 +#: describe.c:1215 msgid "Default access privileges" msgstr "Права доступу за замовчуванням" -#: describe.c:1383 +#: describe.c:1259 msgid "Object" msgstr "Об'єкт" -#: describe.c:1397 +#: describe.c:1273 msgid "table constraint" msgstr "обмеження таблиці" -#: describe.c:1421 +#: describe.c:1297 msgid "domain constraint" msgstr "обмеження домену" -#: describe.c:1451 +#: describe.c:1321 msgid "operator class" msgstr "клас операторів" -#: describe.c:1482 +#: describe.c:1345 msgid "operator family" msgstr "сімейство операторів" -#: describe.c:1506 +#: describe.c:1368 msgid "rule" msgstr "правило" -#: describe.c:1552 +#: describe.c:1414 msgid "Object descriptions" msgstr "Опис об'єкту" -#: describe.c:1610 describe.c:4249 +#: describe.c:1479 describe.c:4007 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Не знайдено жодного відношення під назвою \"%s\"." -#: describe.c:1613 describe.c:4252 +#: describe.c:1482 describe.c:4010 #, c-format msgid "Did not find any relations." msgstr "Не знайдено жодного відношення." -#: describe.c:1869 +#: describe.c:1678 #, c-format msgid "Did not find any relation with OID %s." msgstr "Не знайдено жодного відношення з OID %s." -#: describe.c:1921 describe.c:1945 +#: describe.c:1726 describe.c:1750 msgid "Start" msgstr "Початок" -#: describe.c:1922 describe.c:1946 +#: describe.c:1727 describe.c:1751 msgid "Minimum" msgstr "Мінімум" -#: describe.c:1923 describe.c:1947 +#: describe.c:1728 describe.c:1752 msgid "Maximum" msgstr "Максимум" -#: describe.c:1924 describe.c:1948 +#: describe.c:1729 describe.c:1753 msgid "Increment" msgstr "Приріст" -#: describe.c:1925 describe.c:1949 describe.c:2080 describe.c:4669 -#: describe.c:4933 describe.c:5051 describe.c:5056 describe.c:6700 +#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 +#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 msgid "yes" msgstr "так" -#: describe.c:1926 describe.c:1950 describe.c:2081 describe.c:4669 -#: describe.c:4930 describe.c:5051 describe.c:6701 +#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 +#: describe.c:4768 describe.c:4892 describe.c:6621 msgid "no" msgstr "ні" -#: describe.c:1927 describe.c:1951 +#: describe.c:1732 describe.c:1756 msgid "Cycles?" msgstr "Цикли?" -#: describe.c:1928 describe.c:1952 +#: describe.c:1733 describe.c:1757 msgid "Cache" msgstr "Кеш" -#: describe.c:1995 +#: describe.c:1798 #, c-format msgid "Owned by: %s" msgstr "Власник: %s" -#: describe.c:1999 +#: describe.c:1802 #, c-format msgid "Sequence for identity column: %s" msgstr "Послідовність для стовпця identity: %s" -#: describe.c:2006 +#: describe.c:1810 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Послідовність без журналювання \"%s.%s\"" + +#: describe.c:1813 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Послідовність \"%s.%s\"" -#: describe.c:2153 +#: describe.c:1957 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Таблиця без журналювання \"%s.%s\"" -#: describe.c:2156 +#: describe.c:1960 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблиця \"%s.%s\"" -#: describe.c:2160 +#: describe.c:1964 #, c-format msgid "View \"%s.%s\"" msgstr "Подання \"%s.%s\"" -#: describe.c:2165 +#: describe.c:1969 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Матеріалізоване подання без журналювання \"%s.%s\"" -#: describe.c:2168 +#: describe.c:1972 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Матеріалізоване подання \"%s.%s\"" -#: describe.c:2173 +#: describe.c:1977 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Індекс без журналювання \"%s.%s\"" -#: describe.c:2176 +#: describe.c:1980 #, c-format msgid "Index \"%s.%s\"" msgstr "Індекс \"%s.%s\"" -#: describe.c:2181 +#: describe.c:1985 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Секційний індекс без журналювання \"%s.%s\"" -#: describe.c:2184 +#: describe.c:1988 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секційний індекс \"%s.%s\"" -#: describe.c:2189 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Спеціальне відношення \"%s.%s\"" - -#: describe.c:2193 +#: describe.c:1992 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Таблиця TOAST \"%s.%s\"" -#: describe.c:2197 +#: describe.c:1996 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Композитний тип \"%s.%s\"" -#: describe.c:2201 +#: describe.c:2000 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Зовнішня таблиця \"%s.%s\"" -#: describe.c:2206 +#: describe.c:2005 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Секційна таблиця без журналювання \"%s.%s\"" -#: describe.c:2209 +#: describe.c:2008 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секційна таблиця \"%s.%s\"" -#: describe.c:2225 describe.c:4580 +#: describe.c:2024 describe.c:4343 msgid "Collation" msgstr "Сортування" -#: describe.c:2226 describe.c:4587 +#: describe.c:2025 describe.c:4344 msgid "Nullable" msgstr "Обнуляється" -#: describe.c:2227 describe.c:4588 +#: describe.c:2026 describe.c:4345 msgid "Default" msgstr "За замовчуванням" -#: describe.c:2230 +#: describe.c:2029 msgid "Key?" msgstr "Ключ?" -#: describe.c:2232 describe.c:4823 describe.c:4834 +#: describe.c:2031 describe.c:4665 describe.c:4676 msgid "Definition" msgstr "Визначення" -#: describe.c:2234 describe.c:5818 describe.c:5904 describe.c:5977 -#: describe.c:6043 +#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 +#: describe.c:5894 msgid "FDW options" msgstr "Налаштування FDW" -#: describe.c:2236 +#: describe.c:2035 msgid "Storage" msgstr "Сховище" -#: describe.c:2238 +#: describe.c:2037 msgid "Compression" msgstr "Стискання" -#: describe.c:2240 +#: describe.c:2039 msgid "Stats target" msgstr "Статистична ціль" -#: describe.c:2376 +#: describe.c:2175 #, c-format msgid "Partition of: %s %s%s" msgstr "Розділ: %s %s%s" -#: describe.c:2389 +#: describe.c:2188 msgid "No partition constraint" msgstr "Відсутнє розділове обмеження" -#: describe.c:2391 +#: describe.c:2190 #, c-format msgid "Partition constraint: %s" msgstr "Обмеження секції: %s" -#: describe.c:2415 +#: describe.c:2214 #, c-format msgid "Partition key: %s" msgstr "Ключ розділу: %s" -#: describe.c:2441 +#: describe.c:2240 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Таблиця, що володіє: \"%s.%s\"" -#: describe.c:2512 +#: describe.c:2309 msgid "primary key, " msgstr "первинний ключ," -#: describe.c:2514 -msgid "unique, " -msgstr "унікальний," +#: describe.c:2312 +msgid "unique" +msgstr "унікальний" + +#: describe.c:2314 +msgid " nulls not distinct" +msgstr " nulls не відрізняються" + +#: describe.c:2315 +msgid ", " +msgstr ", " -#: describe.c:2520 +#: describe.c:2322 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблиці \"%s.%s\"" -#: describe.c:2524 +#: describe.c:2326 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2527 +#: describe.c:2329 msgid ", clustered" msgstr ", кластеризовано" -#: describe.c:2530 +#: describe.c:2332 msgid ", invalid" msgstr ", недійсний" -#: describe.c:2533 +#: describe.c:2335 msgid ", deferrable" msgstr ", відтермінований" -#: describe.c:2536 +#: describe.c:2338 msgid ", initially deferred" msgstr ", від початку відтермінований" -#: describe.c:2539 +#: describe.c:2341 msgid ", replica identity" msgstr ", ідентичність репліки" -#: describe.c:2606 +#: describe.c:2395 msgid "Indexes:" msgstr "Індекси:" -#: describe.c:2690 +#: describe.c:2478 msgid "Check constraints:" msgstr "Обмеження перевірки:" -#: describe.c:2758 +#: describe.c:2546 msgid "Foreign-key constraints:" msgstr "Обмеження зовнішнього ключа:" -#: describe.c:2821 +#: describe.c:2609 msgid "Referenced by:" msgstr "Посилання ззовні:" -#: describe.c:2871 +#: describe.c:2659 msgid "Policies:" msgstr "Політики:" -#: describe.c:2874 +#: describe.c:2662 msgid "Policies (forced row security enabled):" msgstr "Політики (посилений захист рядків активовано):" -#: describe.c:2877 +#: describe.c:2665 msgid "Policies (row security enabled): (none)" msgstr "Політики (захист рядків ввімкнуто): (ні)" -#: describe.c:2880 +#: describe.c:2668 msgid "Policies (forced row security enabled): (none)" msgstr "Політики (посилений захист рядків ввімкнуто): (ні)" -#: describe.c:2883 +#: describe.c:2671 msgid "Policies (row security disabled):" msgstr "Політики (захист рядків вимкнуто):" -#: describe.c:2944 describe.c:3048 +#: describe.c:2731 describe.c:2835 msgid "Statistics objects:" msgstr "Об'єкти статистики:" -#: describe.c:3162 describe.c:3266 +#: describe.c:2937 describe.c:3090 msgid "Rules:" msgstr "Правила:" -#: describe.c:3165 +#: describe.c:2940 msgid "Disabled rules:" msgstr "Вимкнені правила:" -#: describe.c:3168 +#: describe.c:2943 msgid "Rules firing always:" msgstr "Правила, що завжди працюють:" -#: describe.c:3171 +#: describe.c:2946 msgid "Rules firing on replica only:" msgstr "Правила, що працюють тільки на репліці:" -#: describe.c:3211 +#: describe.c:3025 describe.c:5030 msgid "Publications:" msgstr "Публікації:" -#: describe.c:3249 +#: describe.c:3073 msgid "View definition:" msgstr "Визначення подання:" -#: describe.c:3419 +#: describe.c:3236 msgid "Triggers:" msgstr "Тригери:" -#: describe.c:3423 +#: describe.c:3239 msgid "Disabled user triggers:" msgstr "Вимкнені користувацькі тригери:" -#: describe.c:3425 -msgid "Disabled triggers:" -msgstr "Вимкнені тригери:" - -#: describe.c:3428 +#: describe.c:3242 msgid "Disabled internal triggers:" msgstr "Вимкнені внутрішні тригери:" -#: describe.c:3431 +#: describe.c:3245 msgid "Triggers firing always:" msgstr "Тригери, що завжди працюють:" -#: describe.c:3434 +#: describe.c:3248 msgid "Triggers firing on replica only:" msgstr "Тригери, що працюють тільки на репліці:" -#: describe.c:3506 +#: describe.c:3319 #, c-format msgid "Server: %s" msgstr "Сервер: %s" -#: describe.c:3514 +#: describe.c:3327 #, c-format msgid "FDW options: (%s)" msgstr "Налаштування FDW: (%s)" -#: describe.c:3535 +#: describe.c:3348 msgid "Inherits" msgstr "Успадковує" -#: describe.c:3608 +#: describe.c:3413 #, c-format msgid "Number of partitions: %d" msgstr "Число секцій: %d" -#: describe.c:3617 +#: describe.c:3422 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Кількість розділів: %d (\\d+ для списку)" -#: describe.c:3619 +#: describe.c:3424 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Кількість дочірніх таблиць: %d (\\d+ для списку)" -#: describe.c:3626 +#: describe.c:3431 msgid "Child tables" msgstr "Дочірні таблиці" -#: describe.c:3626 +#: describe.c:3431 msgid "Partitions" msgstr "Розділи" -#: describe.c:3657 +#: describe.c:3462 #, c-format msgid "Typed table of type: %s" msgstr "Типізована таблиця типу: %s" -#: describe.c:3673 +#: describe.c:3478 msgid "Replica Identity" msgstr "Ідентичність репліки" -#: describe.c:3686 +#: describe.c:3491 msgid "Has OIDs: yes" msgstr "Має OIDs: так" -#: describe.c:3695 +#: describe.c:3500 #, c-format msgid "Access method: %s" msgstr "Метод доступу: %s" -#: describe.c:3775 +#: describe.c:3579 #, 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:3787 +#: describe.c:3591 #, c-format msgid ", tablespace \"%s\"" msgstr ", табличний простір \"%s\"" -#: describe.c:3884 +#: describe.c:3668 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3886 +#: describe.c:3670 msgid "Role name" msgstr "Ім'я ролі" -#: describe.c:3887 +#: describe.c:3671 msgid "Attributes" msgstr "Атрибути" -#: describe.c:3889 +#: describe.c:3673 msgid "Member of" msgstr "Член" -#: describe.c:3900 +#: describe.c:3684 msgid "Superuser" msgstr "Суперкористувач" -#: describe.c:3903 +#: describe.c:3687 msgid "No inheritance" msgstr "Без успадкування" -#: describe.c:3906 +#: describe.c:3690 msgid "Create role" msgstr "Створити роль" -#: describe.c:3909 +#: describe.c:3693 msgid "Create DB" msgstr "Створити базу даних" -#: describe.c:3912 +#: describe.c:3696 msgid "Cannot login" msgstr "Не може увійти" -#: describe.c:3916 +#: describe.c:3699 msgid "Replication" msgstr "Реплікація" -#: describe.c:3920 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Обхід RLC" -#: describe.c:3929 +#: describe.c:3712 msgid "No connections" msgstr "Без підключень" -#: describe.c:3931 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -1767,1387 +1770,1334 @@ msgstr[1] "%d підключення" msgstr[2] "%d підключень" msgstr[3] "%d підключення" -#: describe.c:3941 +#: describe.c:3724 msgid "Password valid until " msgstr "Пароль дійнсий до" -#: describe.c:3991 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "Сервер (версія %s) не підтримує рольові налаштування побазово." - -#: describe.c:4004 +#: describe.c:3777 msgid "Role" msgstr "Роль" -#: describe.c:4005 +#: describe.c:3778 msgid "Database" msgstr "База даних" -#: describe.c:4006 +#: describe.c:3779 msgid "Settings" msgstr "Параметри" -#: describe.c:4030 +#: describe.c:3803 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Не знайдено жодного параметра для ролі \"%s\" і бази даних \"%s\"." -#: describe.c:4033 +#: describe.c:3806 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Не знайдено жодного параметру для ролі \"%s\"." -#: describe.c:4036 +#: describe.c:3809 #, c-format msgid "Did not find any settings." msgstr "Не знайдено жодного параметру." -#: describe.c:4041 +#: describe.c:3814 msgid "List of settings" msgstr "Список параметрів" -#: describe.c:4113 +#: describe.c:3885 msgid "index" msgstr "індекс" -#: describe.c:4115 -msgid "special" -msgstr "спеціальний" - -#: describe.c:4116 +#: describe.c:3887 msgid "TOAST table" msgstr "Таблиця TOAST" -#: describe.c:4119 describe.c:4344 +#: describe.c:3890 describe.c:4102 msgid "partitioned index" msgstr "секційний індекс" -#: describe.c:4143 +#: describe.c:3910 msgid "permanent" msgstr "постійна" -#: describe.c:4144 +#: describe.c:3911 msgid "temporary" msgstr "тимчасова" -#: describe.c:4145 +#: describe.c:3912 msgid "unlogged" msgstr "нежурнальована" -#: describe.c:4146 +#: describe.c:3913 msgid "Persistence" msgstr "Стійкість" -#: describe.c:4163 +#: describe.c:3929 msgid "Access method" msgstr "Метод доступу" -#: describe.c:4257 +#: describe.c:4015 msgid "List of relations" msgstr "Список відношень" -#: describe.c:4305 +#: describe.c:4063 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Сервер (версія %s) не підтримує декларативне секціонування таблиць." -#: describe.c:4316 +#: describe.c:4074 msgid "List of partitioned indexes" msgstr "Список секційних індексів" -#: describe.c:4318 +#: describe.c:4076 msgid "List of partitioned tables" msgstr "Список секційних таблиць" -#: describe.c:4322 +#: describe.c:4080 msgid "List of partitioned relations" msgstr "Список секційних відношень" -#: describe.c:4353 +#: describe.c:4111 msgid "Parent name" msgstr "Батьківська назва" -#: describe.c:4366 +#: describe.c:4124 msgid "Leaf partition size" msgstr "Розмір дочірньої секції" -#: describe.c:4369 describe.c:4375 +#: describe.c:4127 describe.c:4133 msgid "Total size" msgstr "Загальний розмір" -#: describe.c:4501 +#: describe.c:4258 msgid "Trusted" msgstr "Надійний" -#: describe.c:4509 +#: describe.c:4267 msgid "Internal language" msgstr "Внутрішня мова" -#: describe.c:4510 +#: describe.c:4268 msgid "Call handler" msgstr "Обробник виклику" -#: describe.c:4511 describe.c:5805 +#: describe.c:4269 describe.c:5680 msgid "Validator" msgstr "Функція перевірки" -#: describe.c:4514 +#: describe.c:4270 msgid "Inline handler" msgstr "Оброблювач впровадженого коду" -#: describe.c:4544 +#: describe.c:4305 msgid "List of languages" msgstr "Список мов" -#: describe.c:4589 +#: describe.c:4346 msgid "Check" msgstr "Перевірка" -#: describe.c:4633 +#: describe.c:4390 msgid "List of domains" msgstr "Список доменів" -#: describe.c:4667 +#: describe.c:4424 msgid "Source" msgstr "Джерело" -#: describe.c:4668 +#: describe.c:4425 msgid "Destination" msgstr "Призначення" -#: describe.c:4670 describe.c:6702 +#: describe.c:4427 describe.c:6622 msgid "Default?" msgstr "За замовчуванням?" -#: describe.c:4709 +#: describe.c:4469 msgid "List of conversions" msgstr "Список перетворень" -#: describe.c:4748 +#: describe.c:4497 +msgid "Parameter" +msgstr "Параметр" + +#: describe.c:4498 +msgid "Value" +msgstr "Значення" + +#: describe.c:4505 +msgid "Context" +msgstr "Контекст" + +#: describe.c:4538 +msgid "List of configuration parameters" +msgstr "Список параметрів конфігурації" + +#: describe.c:4540 +msgid "List of non-default configuration parameters" +msgstr "Список параметрів конфігурації не за замовчуванням" + +#: describe.c:4567 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "Сервер (версія %s) не підтримує тригери подій." + +#: describe.c:4587 msgid "Event" msgstr "Подія" -#: describe.c:4750 +#: describe.c:4589 msgid "enabled" msgstr "увімкнено" -#: describe.c:4751 +#: describe.c:4590 msgid "replica" msgstr "репліка" -#: describe.c:4752 +#: describe.c:4591 msgid "always" msgstr "завжди" -#: describe.c:4753 +#: describe.c:4592 msgid "disabled" msgstr "вимкнено" -#: describe.c:4754 describe.c:6588 +#: describe.c:4593 describe.c:6496 msgid "Enabled" msgstr "Увімкнено" -#: describe.c:4756 +#: describe.c:4595 msgid "Tags" msgstr "Теги" -#: describe.c:4777 +#: describe.c:4619 msgid "List of event triggers" msgstr "Список тригерів подій" -#: describe.c:4804 +#: describe.c:4646 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (версія %s) не підтримує розширену статистику." -#: describe.c:4841 +#: describe.c:4683 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4842 +#: describe.c:4684 msgid "Dependencies" msgstr "Залежності" -#: describe.c:4852 +#: describe.c:4694 msgid "MCV" msgstr "MCV" -#: describe.c:4873 +#: describe.c:4718 msgid "List of extended statistics" msgstr "Список розширеної статистики" -#: describe.c:4900 +#: describe.c:4745 msgid "Source type" msgstr "Початковий тип" -#: describe.c:4901 +#: describe.c:4746 msgid "Target type" msgstr "Тип цілі" -#: describe.c:4932 +#: describe.c:4770 msgid "in assignment" msgstr "у призначенні" -#: describe.c:4934 +#: describe.c:4772 msgid "Implicit?" msgstr "Приховане?" -#: describe.c:4993 +#: describe.c:4831 msgid "List of casts" msgstr "Список приведення типів" -#: describe.c:5021 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "Сервер (версія %s) не підтримує співставлення." - -#: describe.c:5042 describe.c:5046 +#: describe.c:4883 describe.c:4887 msgid "Provider" msgstr "Постачальник" -#: describe.c:5052 describe.c:5057 +#: describe.c:4893 describe.c:4898 msgid "Deterministic?" msgstr "Детермінований?" -#: describe.c:5094 +#: describe.c:4938 msgid "List of collations" msgstr "Список правил сортування" -#: describe.c:5155 +#: describe.c:5000 msgid "List of schemas" msgstr "Список схем" -#: describe.c:5180 describe.c:5431 describe.c:5504 describe.c:5577 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "Сервер (версія %s) не підтримує повнотекстовий пошук." - -#: describe.c:5217 +#: describe.c:5117 msgid "List of text search parsers" msgstr "Список парсерів текстового пошуку" -#: describe.c:5264 +#: describe.c:5167 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Не знайдено жодного парсера текстового пошуку \"%s\"." -#: describe.c:5267 +#: describe.c:5170 #, c-format msgid "Did not find any text search parsers." msgstr "Не знайдено жодного парсера текстового пошуку." -#: describe.c:5342 +#: describe.c:5245 msgid "Start parse" msgstr "Почати розбір" -#: describe.c:5343 +#: describe.c:5246 msgid "Method" msgstr "Метод" -#: describe.c:5347 +#: describe.c:5250 msgid "Get next token" msgstr "Отримати наступний токен" -#: describe.c:5349 +#: describe.c:5252 msgid "End parse" msgstr "Закінчити розбір" -#: describe.c:5351 +#: describe.c:5254 msgid "Get headline" msgstr "Отримати заголовок" -#: describe.c:5353 +#: describe.c:5256 msgid "Get token types" msgstr "Отримати типи токенів" -#: describe.c:5364 +#: describe.c:5267 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Парсер текстового пошуку \"%s.%s\"" -#: describe.c:5367 +#: describe.c:5270 #, c-format msgid "Text search parser \"%s\"" msgstr "Парсер текстового пошуку \"%s\"" -#: describe.c:5386 +#: describe.c:5289 msgid "Token name" msgstr "Ім'я токену" -#: describe.c:5397 +#: describe.c:5303 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типи токенів для парсера \"%s.%s\"" -#: describe.c:5400 +#: describe.c:5306 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типи токенів для парсера \"%s\"" -#: describe.c:5454 +#: describe.c:5350 msgid "Template" msgstr "Шаблон" -#: describe.c:5455 +#: describe.c:5351 msgid "Init options" msgstr "Параметри ініціалізації" -#: describe.c:5479 +#: describe.c:5378 msgid "List of text search dictionaries" msgstr "Список словників текстового пошуку" -#: describe.c:5522 +#: describe.c:5411 msgid "Init" msgstr "Ініціалізація" -#: describe.c:5523 +#: describe.c:5412 msgid "Lexize" msgstr "Виділення лексем" -#: describe.c:5552 +#: describe.c:5444 msgid "List of text search templates" msgstr "Список шаблонів текстового пошуку" -#: describe.c:5614 +#: describe.c:5499 msgid "List of text search configurations" msgstr "Список конфігурацій текстового пошуку" -#: describe.c:5662 +#: describe.c:5550 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Не знайдено жодної конфігурації текстового пошуку під назвою \"%s\"." -#: describe.c:5665 +#: describe.c:5553 #, c-format msgid "Did not find any text search configurations." msgstr "Не знайдено жодної конфігурації текствого пошуку." -#: describe.c:5731 +#: describe.c:5619 msgid "Token" msgstr "Токен" -#: describe.c:5732 +#: describe.c:5620 msgid "Dictionaries" msgstr "Словники" -#: describe.c:5743 +#: describe.c:5631 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфігурація пошуку тексту \"%s.%s\"" -#: describe.c:5746 +#: describe.c:5634 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфігурація пошуку тексту \"%s\"" -#: describe.c:5750 +#: describe.c:5638 #, c-format -msgid "\n" +msgid "" +"\n" "Parser: \"%s.%s\"" -msgstr "\n" +msgstr "" +"\n" "Парсер: \"%s.%s\"" -#: describe.c:5753 +#: describe.c:5641 #, c-format -msgid "\n" +msgid "" +"\n" "Parser: \"%s\"" -msgstr "\n" +msgstr "" +"\n" "Парсер: \"%s\"" -#: describe.c:5787 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "Сервер (версія %s) не підтримує джерела сторонніх даних." - -#: describe.c:5847 +#: describe.c:5722 msgid "List of foreign-data wrappers" msgstr "Список джерел сторонніх даних" -#: describe.c:5872 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "Сервер (версія %s) не підтримує сторонні сервери." - -#: describe.c:5885 +#: describe.c:5750 msgid "Foreign-data wrapper" msgstr "Джерело сторонніх даних" -#: describe.c:5903 describe.c:6114 +#: describe.c:5768 describe.c:5958 msgid "Version" msgstr "Версія" -#: describe.c:5931 +#: describe.c:5799 msgid "List of foreign servers" msgstr "Список сторонніх серверів" -#: describe.c:5956 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "Сервер (версія %s) не підтримує зіставлення користувачів." - -#: describe.c:5966 describe.c:6032 +#: describe.c:5824 describe.c:5883 msgid "Server" msgstr "Сервер" -#: describe.c:5967 +#: describe.c:5825 msgid "User name" msgstr "Ім'я користувача" -#: describe.c:5994 +#: describe.c:5855 msgid "List of user mappings" msgstr "Список зіставлень користувачів" -#: describe.c:6019 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "Сервер (версія %s) не підтримує сторонні таблиці." - -#: describe.c:6074 +#: describe.c:5928 msgid "List of foreign tables" msgstr "Список сторонніх таблиць" -#: describe.c:6099 describe.c:6158 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "Сервер (версія %s) не підтримує розширення." - -#: describe.c:6133 +#: describe.c:5980 msgid "List of installed extensions" msgstr "Список встановлених розширень" -#: describe.c:6188 +#: describe.c:6028 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Не знайдено жодного розширення під назвою \"%s\"." -#: describe.c:6191 +#: describe.c:6031 #, c-format msgid "Did not find any extensions." msgstr "Не знайдено жодного розширення." -#: describe.c:6235 +#: describe.c:6075 msgid "Object description" msgstr "Опис об'єкту" -#: describe.c:6245 +#: describe.c:6085 #, c-format msgid "Objects in extension \"%s\"" msgstr "Об'єкти в розширенні \"%s\"" -#: describe.c:6286 +#: describe.c:6126 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'я (забагато компонентів): %s" -#: describe.c:6301 +#: describe.c:6140 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові посилання не реалізовані: %s" -#: describe.c:6327 describe.c:6405 +#: describe.c:6171 describe.c:6298 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версія %s) не підтримує публікації." -#: describe.c:6344 describe.c:6485 +#: describe.c:6188 describe.c:6376 msgid "All tables" msgstr "Усі таблиці" -#: describe.c:6345 describe.c:6486 +#: describe.c:6189 describe.c:6377 msgid "Inserts" msgstr "Вставки" -#: describe.c:6346 describe.c:6487 +#: describe.c:6190 describe.c:6378 msgid "Updates" msgstr "Оновлення" -#: describe.c:6347 describe.c:6488 +#: describe.c:6191 describe.c:6379 msgid "Deletes" msgstr "Видалення" -#: describe.c:6351 describe.c:6490 +#: describe.c:6195 describe.c:6381 msgid "Truncates" msgstr "Очищення" -#: describe.c:6355 describe.c:6492 +#: describe.c:6199 describe.c:6383 msgid "Via root" msgstr "Через root" -#: describe.c:6374 +#: describe.c:6221 msgid "List of publications" msgstr "Список публікацій" -#: describe.c:6449 +#: describe.c:6345 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Не знайдено жодної публікації під назвою \"%s\"." -#: describe.c:6452 +#: describe.c:6348 #, c-format msgid "Did not find any publications." msgstr "Не знайдено жодної публікації." -#: describe.c:6481 +#: describe.c:6372 #, c-format msgid "Publication %s" msgstr "Публікація %s" -#: describe.c:6529 +#: describe.c:6425 msgid "Tables:" msgstr "Таблиці:" -#: describe.c:6573 +#: describe.c:6437 +msgid "Tables from schemas:" +msgstr "Таблиці зі схеми:" + +#: describe.c:6481 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версія %s) не підтримує підписки." -#: describe.c:6589 +#: describe.c:6497 msgid "Publication" msgstr "Публікація" -#: describe.c:6598 +#: describe.c:6506 msgid "Binary" msgstr "Бінарний" -#: describe.c:6599 +#: describe.c:6507 msgid "Streaming" msgstr "Потокова передача" -#: describe.c:6604 +#: describe.c:6514 +msgid "Two-phase commit" +msgstr "Двофазовий коміт" + +#: describe.c:6515 +msgid "Disable on error" +msgstr "Вимкнути при помилці" + +#: describe.c:6520 msgid "Synchronous commit" msgstr "Синхронні затвердження" -#: describe.c:6605 +#: describe.c:6521 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6629 +#: describe.c:6527 +msgid "Skip LSN" +msgstr "Пропустити LSN" + +#: describe.c:6554 msgid "List of subscriptions" msgstr "Список підписок" -#: describe.c:6696 describe.c:6788 describe.c:6877 describe.c:6964 +#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 msgid "AM" msgstr "АМ" -#: describe.c:6697 +#: describe.c:6617 msgid "Input type" msgstr "Тип вводу" -#: describe.c:6698 +#: describe.c:6618 msgid "Storage type" msgstr "Тип сховища" -#: describe.c:6699 +#: describe.c:6619 msgid "Operator class" msgstr "Клас операторів" -#: describe.c:6711 describe.c:6789 describe.c:6878 describe.c:6965 +#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 msgid "Operator family" msgstr "Сімейство операторів" -#: describe.c:6747 +#: describe.c:6667 msgid "List of operator classes" msgstr "Список класів операторів" -#: describe.c:6790 +#: describe.c:6714 msgid "Applicable types" msgstr "Типи для застосування" -#: describe.c:6832 +#: describe.c:6756 msgid "List of operator families" msgstr "Список сімейств операторів" -#: describe.c:6879 +#: describe.c:6807 msgid "Operator" msgstr "Оператор" -#: describe.c:6880 +#: describe.c:6808 msgid "Strategy" msgstr "Стратегія" -#: describe.c:6881 +#: describe.c:6809 msgid "ordering" msgstr "упорядкування" -#: describe.c:6882 +#: describe.c:6810 msgid "search" msgstr "пошук" -#: describe.c:6883 +#: describe.c:6811 msgid "Purpose" msgstr "Ціль" -#: describe.c:6888 +#: describe.c:6816 msgid "Sort opfamily" msgstr "Сімейство операторів сортування" -#: describe.c:6923 +#: describe.c:6855 msgid "List of operators of operator families" msgstr "Список операторів сімейств операторів" -#: describe.c:6966 +#: describe.c:6902 msgid "Registered left type" msgstr "Зареєстрований лівий тип" -#: describe.c:6967 +#: describe.c:6903 msgid "Registered right type" msgstr "Зареєстрований правий тип" -#: describe.c:6968 +#: describe.c:6904 msgid "Number" msgstr "Число" -#: describe.c:7008 +#: describe.c:6948 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\n" +#: describe.c:6979 +msgid "ID" +msgstr "ID" -#: help.c:74 help.c:355 help.c:433 help.c:476 -#, c-format -msgid "Usage:\n" -msgstr "Використання:\n" +#: describe.c:7000 +msgid "Large objects" +msgstr "Великі об'єкти" #: help.c:75 -#, c-format -msgid " psql [OPTION]... [DBNAME [USERNAME]]\n\n" -msgstr " psql [ОПЦІЯ]... [БД [КОРИСТУВАЧ]]\n\n" +msgid "" +"psql is the PostgreSQL interactive terminal.\n" +"\n" +msgstr "" +"psql - це інтерактивний термінал PostgreSQL.\n" +"\n" + +#: help.c:76 help.c:393 help.c:473 help.c:516 +msgid "Usage:\n" +msgstr "Використання:\n" #: help.c:77 -#, c-format +msgid "" +" psql [OPTION]... [DBNAME [USERNAME]]\n" +"\n" +msgstr "" +" psql [ОПЦІЯ]... [БД [КОРИСТУВАЧ]]\n" +"\n" + +#: help.c:79 msgid "General options:\n" msgstr "Основні налаштування:\n" -#: help.c:82 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=КОМАНДА виконати лише одну команду (SQL або внутрішню) і вийти\n" -#: help.c:83 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" msgstr " -d, --dbname=DBNAME ім'я бази даних для підключення (за замовчання: \"%s\") \n" -#: help.c:84 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME виконує команди з файлу, потім виходить\n" -#: help.c:85 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list виводить список доступних баз даних, потім виходить\n" -#: help.c:86 -#, c-format -msgid " -v, --set=, --variable=NAME=VALUE\n" +#: help.c:89 +msgid "" +" -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" " (e.g., -v ON_ERROR_STOP=1)\n" -msgstr " -v, --set=, --variable=NAME=VALUE\n" +msgstr "" +" -v, --set=, --variable=NAME=VALUE\n" " присвоїти змінній psql NAME значення VALUE\n" " (наприклад, -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: help.c:90 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc ігнорувати файл параметрів запуска (~/.psqlrc)\n" -#: help.c:91 -#, c-format -msgid " -1 (\"one\"), --single-transaction\n" +#: help.c:94 +msgid "" +" -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" -msgstr " -1 (\"один\"), --single-transaction\n" +msgstr "" +" -1 (\"один\"), --single-transaction\n" " виконує як одну транзакцію (якщо не інтерактивна)\n" -#: help.c:93 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help [=options] показати цю довідку, потім вийти\n" -#: help.c:94 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands перерахувати команди, потім вийти\n" -#: help.c:95 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables перерахувати спеціальні змінні, потім вийти\n" -#: help.c:97 -#, c-format -msgid "\n" +#: help.c:100 +msgid "" +"\n" "Input and output options:\n" -msgstr "\n" +msgstr "" +"\n" "Параметри вводу і виводу:\n" -#: help.c:98 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all відобразити всі вхідні дані з скрипта\n" -#: help.c:99 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors відобразити команди з помилками\n" -#: help.c:100 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries відобразити команди, відправлені на сервер\n" -#: help.c:101 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden відобразити запити, згенеровані внутрішніми командами\n" -#: help.c:102 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME зберегти протокол роботи у файл\n" -#: help.c:103 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline вимкнути розширене редагування командного рядка (readline)\n" -#: help.c:104 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME надсилати результати запиту до файлу (або до каналу |)\n" -#: help.c:105 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet тихий запуск (ніяких повідомлень, лише результат запитів)\n" -#: help.c:106 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step покроковий режим (підтвердження кожного запиту)\n" -#: help.c:107 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line однорядковий режим (кінець рядка завершує команду)\n" -#: help.c:109 -#, c-format -msgid "\n" +#: help.c:112 +msgid "" +"\n" "Output format options:\n" -msgstr "\n" +msgstr "" +"\n" "Параметри формату виводу:\n" -#: help.c:110 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align режим виводу не вирівняної таблиці\n" -#: help.c:111 -#, c-format +#: help.c:114 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv режим виводу таблиць CSV (Comma-Separated Values)\n" -#: help.c:112 +#: help.c:115 #, c-format -msgid " -F, --field-separator=STRING\n" +msgid "" +" -F, --field-separator=STRING\n" " field separator for unaligned output (default: \"%s\")\n" -msgstr " -F, --field-separator=СТРОКА\n" +msgstr "" +" -F, --field-separator=СТРОКА\n" " розділювач полів при не вирівняному виводі\n" " (за замовчуванням: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html вивід таблиці у форматі HTML\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] встановити параметр виводу змінної VAR значенню ARG (див. команду \"\\pset\")\n" -#: help.c:117 -#, c-format -msgid " -R, --record-separator=STRING\n" +#: help.c:120 +msgid "" +" -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" -msgstr " -R, --record-separator=СТРОКА\n" +msgstr "" +" -R, --record-separator=СТРОКА\n" " розділювач записів при не вирівняному виводі\n" " (за замовчуванням: новий рядок)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only виводити лише рядки\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=ТЕКСТ встановити атрибути HTML-таблиці (width, border)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded ввімкнути розширене виведення таблиці\n" -#: help.c:122 -#, c-format -msgid " -z, --field-separator-zero\n" +#: help.c:125 +msgid "" +" -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" -msgstr " -z, --field-separator-zero\n" +msgstr "" +" -z, --field-separator-zero\n" " встановити розділювач полів для не вирівняного виводу в нульовий байт\n" -#: help.c:124 -#, c-format -msgid " -0, --record-separator-zero\n" +#: help.c:127 +msgid "" +" -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" -msgstr " -0, --record-separator-zero\n" +msgstr "" +" -0, --record-separator-zero\n" " встановити розділювач записів для не вирівняного виводу в нульовий байт\n" -#: help.c:127 -#, c-format -msgid "\n" +#: help.c:130 +msgid "" +"\n" "Connection options:\n" -msgstr "\n" +msgstr "" +"\n" "Налаштування з'єднання:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів (за замовчуванням: \"%s)\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "локальний сокет" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORT порт сервера бази даних (за замовчуванням: \"%s\")\n" -#: help.c:137 +#: help.c:140 #, c-format msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USERNAME ім'я користувача бази даних (за змовчуванням: \"%s\")\n" -#: help.c:138 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: help.c:139 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password запитувати пароль завжди (повинно траплятись автоматично)\n" -#: help.c:141 -#, c-format -msgid "\n" +#: help.c:145 +msgid "" +"\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" "commands) from within psql, or consult the psql section in the PostgreSQL\n" -"documentation.\n\n" -msgstr "\n" -"Щоб дізнатися більше, введіть \"\\?\" (для внутрішніх команд) або \"\\help\"(для команд SQL) в psql, або звіртеся з розділом psql документації PostgreSQL. \n\n" +"documentation.\n" +"\n" +msgstr "" +"\n" +"Щоб дізнатися більше, введіть \"\\?\" (для внутрішніх команд) або \"\\help\"(для команд SQL) в psql, або звіртеся з розділом psql документації PostgreSQL. \n" +"\n" -#: help.c:144 +#: help.c:148 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Повідомляти про помилки на <%s>.\n" -#: help.c:145 +#: help.c:149 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: help.c:171 -#, c-format +#: help.c:191 msgid "General\n" msgstr "Загальні\n" -#: help.c:172 -#, c-format +#: help.c:192 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright умови використання і розповсюдження PostgreSQL\n" -#: help.c:173 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUMNS] виконати запит і відобразити результати у перехресній таблиці\n" +#: help.c:193 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [COLUMNS] виконати запит і відобразити результат у перехресній таблиці\n" -#: help.c:174 -#, c-format +#: help.c:194 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose вивести максимально докладне повідомлення про останню помилку\n" -#: help.c:175 -#, c-format -msgid " \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n" +#: help.c:195 +msgid "" +" \\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" +msgstr "" +" \\g [(OPTIONS)] [FILE] виконати запит (і надіслати результат до файлу або |каналу);\n" " \\g без аргументів рівнозначно крапці з комою\n" -#: help.c:177 -#, c-format +#: help.c:197 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc описати результат запиту без виконання\n" -#: help.c:178 -#, c-format +#: help.c:198 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec виконати запит, потім виконати кожне значення в його результаті\n" -#: help.c:179 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" -msgstr " \\gset [PREFIX] виконати запит та зберегти результати в змінних psql \n" +#: help.c:199 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [PREFIX] виконати запит та зберегти результат в змінних psql \n" -#: help.c:180 -#, c-format +#: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FILE] як \\g, але вмикає розширений режим виводу\n" -#: help.c:181 -#, c-format +#: help.c:201 msgid " \\q quit psql\n" msgstr " \\q вийти з psql\n" -#: help.c:182 -#, c-format +#: help.c:202 msgid " \\watch [SEC] execute query every SEC seconds\n" msgstr " \\watch [SEC] виконувати запит кожні SEC секунд\n" -#: help.c:185 -#, c-format +#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 +#: help.c:324 help.c:337 help.c:346 +msgid "\n" +msgstr "\n" + +#: help.c:205 msgid "Help\n" msgstr "Довідка\n" -#: help.c:187 -#, c-format +#: help.c:207 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] показати довідку по командах з \\\n" -#: help.c:188 -#, c-format +#: help.c:208 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options показати довідку по параметрах командного рядку psql\n" -#: help.c:189 -#, c-format +#: help.c:209 msgid " \\? variables show help on special variables\n" msgstr " \\? variables показати довідку по спеціальних змінних\n" -#: help.c:190 -#, c-format +#: help.c:210 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] довідка з синтаксису команд SQL, * для всіх команд\n" -#: help.c:193 -#, c-format +#: help.c:213 msgid "Query Buffer\n" msgstr "Буфер запитів\n" -#: help.c:194 -#, c-format +#: help.c:214 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] редагувати буфер запитів (або файл) зовнішнім редактором\n" -#: help.c:195 -#, c-format +#: help.c:215 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] редагувати визначення функції зовнішнім редактором\n" -#: help.c:196 -#, c-format +#: help.c:216 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] редагувати визначення подання зовнішнім редактором\n" -#: help.c:197 -#, c-format +#: help.c:217 msgid " \\p show the contents of the query buffer\n" msgstr " \\p показати вміст буфера запитів\n" -#: help.c:198 -#, c-format +#: help.c:218 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r скинути (очистити) буфер запитів\n" -#: help.c:200 -#, c-format +#: help.c:220 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] відобразити історію або зберегти її до файлу\n" -#: help.c:202 -#, c-format +#: help.c:222 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE писати буфер запитів до файлу\n" -#: help.c:205 -#, c-format +#: help.c:225 msgid "Input/Output\n" msgstr "Ввід/Вивід\n" -#: help.c:206 -#, c-format +#: help.c:226 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... виконати команду SQL COPY з потоком даних на клієнтський хост\n" -#: help.c:207 -#, c-format +#: help.c:227 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] записати рядок до стандартного виводу (-n для пропуску нового рядка)\n" -#: help.c:208 -#, c-format +#: help.c:228 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE виконати команди з файлу\n" -#: help.c:209 -#, c-format +#: help.c:229 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir ФАЙЛ те саме, що \\i, але відносно розташування поточного сценарію\n" -#: help.c:210 -#, c-format +#: help.c:230 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] надсилати всі результати запитів до файлу або до каналу |\n" -#: help.c:211 -#, c-format +#: help.c:231 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] записати рядок до вихідного потоку \\o (-n для пропуску нового рядка)\n" -#: help.c:212 -#, c-format +#: help.c:232 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 +#: help.c:235 msgid "Conditional\n" msgstr "Умовний\n" -#: help.c:216 -#, c-format +#: help.c:236 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR початок умовного блоку\n" -#: help.c:217 -#, c-format +#: help.c:237 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR альтернатива в рамках поточного блоку\n" -#: help.c:218 -#, c-format +#: help.c:238 msgid " \\else final alternative within current conditional block\n" msgstr " \\else остаточна альтернатива в рамках поточного умовного блоку\n" -#: help.c:219 -#, c-format +#: help.c:239 msgid " \\endif end conditional block\n" msgstr " \\endif кінець умовного блоку\n" -#: help.c:222 -#, c-format +#: help.c:242 msgid "Informational\n" msgstr "Інформаційний\n" -#: help.c:223 -#, c-format +#: help.c:243 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (параметри: S = показати системні об'єкти, + = додаткові деталі)\n" -#: help.c:224 -#, c-format +#: help.c:244 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] вивести таблиці, подання і послідовності\n" -#: help.c:225 -#, c-format +#: help.c:245 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME описати таблицю, подання, послідовність або індекс\n" -#: help.c:226 -#, c-format +#: help.c:246 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] вивести агрегати\n" -#: help.c:227 -#, c-format +#: help.c:247 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] вивести методи доступу\n" -#: help.c:228 -#, c-format +#: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] список класів операторів\n" -#: help.c:229 -#, c-format +#: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] список сімейств операторів\n" -#: help.c:230 -#, c-format +#: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] список операторів сімейств операторів\n" -#: help.c:231 -#, c-format +#: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] список функцій підтримки сімейств операторів\n" -#: help.c:232 -#, c-format +#: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] вивести табличні простори\n" -#: help.c:233 -#, c-format +#: help.c:253 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] вивести перетворення\n" -#: help.c:234 -#, c-format +#: help.c:254 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] вивести параметри конфігурації\n" + +#: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] вивести приведення типів\n" -#: help.c:235 -#, c-format +#: help.c:256 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATTERN] показати опис об'єкта, що не відображається в іншому місці\n" -#: help.c:236 -#, c-format +#: help.c:257 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] вивести домени\n" -#: help.c:237 -#, c-format +#: help.c:258 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] вивести привілеї за замовчуванням\n" -#: help.c:238 -#, c-format +#: help.c:259 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n" -#: help.c:239 -#, c-format +#: help.c:260 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] вивести зовнішні сервери\n" -#: help.c:240 -#, c-format +#: help.c:261 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n" -#: help.c:241 -#, c-format +#: help.c:262 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] вивести користувацькі зіставлення\n" -#: help.c:242 -#, c-format +#: help.c:263 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] список джерел сторонніх даних\n" -#: help.c:243 -#, c-format -msgid " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +#: help.c:264 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" -msgstr " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " список [лише агрегатних/нормальних/процедурних/тригерних/віконних] функцій\n" -#: help.c:245 -#, c-format +#: help.c:266 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] вивести конфігурації текстового пошуку\n" -#: help.c:246 -#, c-format +#: help.c:267 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] вивести словники текстового пошуку\n" -#: help.c:247 -#, c-format +#: help.c:268 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] вивести парсери текстового пошуку\n" -#: help.c:248 -#, c-format +#: help.c:269 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] вивести шаблони текстового пошуку\n" -#: help.c:249 -#, c-format +#: help.c:270 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] вивести ролі\n" -#: help.c:250 -#, c-format +#: help.c:271 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] вивести індекси\n" -#: help.c:251 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl вивести великі об'єкти, те саме, що \\lo_list\n" +#: help.c:272 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] вивести великі об'єкти, те саме, що \\lo_list\n" -#: help.c:252 -#, c-format +#: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] вивести процедурні мови\n" -#: help.c:253 -#, c-format +#: help.c:274 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] вивести матеріалізовані подання\n" -#: help.c:254 -#, c-format +#: help.c:275 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] вивести схеми\n" -#: help.c:255 -#, c-format -msgid " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +#: help.c:276 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" -msgstr " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " список операторів\n" -#: help.c:257 -#, c-format +#: help.c:278 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] вивести правила сортування\n" -#: help.c:258 -#, c-format +#: help.c:279 msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" msgstr " \\dp [PATTERN] вивести привілеї доступу до таблиць, подань або послідновностей \n" -#: help.c:259 -#, c-format +#: help.c:280 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] вивести [тільки індекс/таблицю] секційні відношення [n=вкладені]\n" -#: help.c:260 -#, c-format +#: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLEPTRN [DBPTRN]] вивести налаштування ролей побазово\n" -#: help.c:261 -#, c-format +#: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] вивести реплікаційні публікації\n" -#: help.c:262 -#, c-format +#: help.c:283 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] вивести реплікаційні підписки\n" -#: help.c:263 -#, c-format +#: help.c:284 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] вивести послідовності\n" -#: help.c:264 -#, c-format +#: help.c:285 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] вивести таблиці\n" -#: help.c:265 -#, c-format +#: help.c:286 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] вивести типи даних\n" -#: help.c:266 -#, c-format +#: help.c:287 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] вивести ролі\n" -#: help.c:267 -#, c-format +#: help.c:288 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] вивести подання\n" -#: help.c:268 -#, c-format +#: help.c:289 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] вивести розширення\n" -#: help.c:269 -#, c-format +#: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATTERN] список розширеної статистики\n" -#: help.c:270 -#, c-format +#: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATTERN] вивести тригери подій\n" -#: help.c:271 -#, c-format +#: help.c:292 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] вивести бази даних\n" -#: help.c:272 -#, c-format +#: help.c:293 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME відобразити визначення функції\n" -#: help.c:273 -#, c-format +#: help.c:294 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VIEWNAME відобразити визначення подання\n" -#: help.c:274 -#, c-format +#: help.c:295 msgid " \\z [PATTERN] same as \\dp\n" msgstr " \\z [PATTERN] те саме, що \\dp\n" -#: help.c:277 -#, c-format +#: help.c:298 +msgid "Large Objects\n" +msgstr "Великі об'єкти\n" + +#: help.c:299 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE записати великий об'єкт в файл\n" + +#: help.c:300 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENT]\n" +" читати великий об'єкт з файлу\n" + +#: help.c:302 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] вивести великі об'єкти\n" + +#: help.c:303 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID видалити великий об’єкт\n" + +#: help.c:306 msgid "Formatting\n" msgstr "Форматування\n" -#: help.c:278 -#, c-format +#: help.c:307 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a перемикання між режимами виводу: unaligned, aligned\n" -#: help.c:279 -#, c-format +#: help.c:308 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [STRING] встановити заголовок таблиці або прибрати, якщо не задано\n" -#: help.c:280 -#, c-format +#: help.c:309 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [STRING] показати або встановити розділювач полів для не вирівняного виводу запиту\n" -#: help.c:281 +#: help.c:310 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H переключити режим виводу HTML (поточний: %s)\n" -#: help.c:283 -#, c-format -msgid " \\pset [NAME [VALUE]] set table output option\n" +#: help.c:312 +msgid "" +" \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -msgstr " \\pset [NAME [VALUE]] встановити параметр виводу таблиці\n" +msgstr "" +" \\pset [NAME [VALUE]] встановити параметр виводу таблиці\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" @@ -3155,656 +3105,734 @@ msgstr " \\pset [NAME [VALUE]] встановити параметр виво " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:290 +#: help.c:319 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] показувати лише рядки (поточно %s)\n" -#: help.c:292 -#, c-format +#: help.c:321 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [STRING] встановити атрибути для HTML
або прибрати, якщо не задані\n" -#: help.c:293 +#: help.c:322 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] переключити розширений вивід (поточний: %s)\n" -#: help.c:297 -#, c-format +#: help.c:323 +msgid "auto" +msgstr "авто" + +#: help.c:326 msgid "Connection\n" msgstr "Підключення\n" -#: help.c:299 +#: help.c:328 #, c-format -msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently \"%s\")\n" msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатися до нової бази даних (поточно \"%s\")\n" -#: help.c:303 -#, c-format -msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +#: help.c:332 +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатися до нової бази даних (зараз з'єднання відсутнє)\n" -#: help.c:305 -#, c-format +#: help.c:334 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo показати інформацію про поточне з'єднання\n" -#: help.c:306 -#, c-format +#: help.c:335 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] показати або встановити кодування клієнта\n" -#: help.c:307 -#, c-format +#: help.c:336 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] безпечно змінити пароль користувача \n" -#: help.c:310 -#, c-format +#: help.c:339 msgid "Operating System\n" msgstr "Операційна система\n" -#: help.c:311 -#, c-format +#: help.c:340 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] змінити поточний робочий каталог\n" -#: help.c:312 -#, c-format +#: help.c:341 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVAR отримати змінну середовища\n" + +#: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] встановити або скинути змінну середовища\n" -#: help.c:313 +#: help.c:343 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] переключити таймер команд (поточний: %s)\n" -#: help.c:315 -#, c-format +#: help.c:345 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [COMMAND] виконати команду в оболонці або запустити інтерактивну оболонку\n" -#: help.c:318 -#, c-format +#: help.c:348 msgid "Variables\n" msgstr "Змінні\n" -#: help.c:319 -#, c-format +#: help.c:349 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME запитати користувача значення внутрішньої змінної\n" -#: help.c:320 -#, c-format +#: help.c:350 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [VALUE]] встановити внутрішню змінну або вивести всі, якщо не задані параметри\n" -#: help.c:321 -#, c-format +#: help.c:351 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME скинути (видалити) значення внутрішньої змінної\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "Великі об'єкти\n" - -#: help.c:325 -#, c-format -msgid " \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr " \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID операції з великими об'єктами\n" - -#: help.c:352 -#, c-format -msgid "List of specially treated variables\n\n" -msgstr "Список спеціальних змінних\n\n" +#: help.c:390 +msgid "" +"List of specially treated variables\n" +"\n" +msgstr "" +"Список спеціальних змінних\n" +"\n" -#: help.c:354 -#, c-format +#: help.c:392 msgid "psql variables:\n" msgstr "змінні psql:\n" -#: help.c:356 -#, c-format -msgid " psql --set=NAME=VALUE\n" -" or \\set NAME VALUE inside psql\n\n" -msgstr " psql --set=ІМ'Я=ЗНАЧЕННЯ\n" -" або \\set ІМ'Я ЗНАЧЕННЯ усередині psql\n\n" +#: help.c:394 +msgid "" +" psql --set=NAME=VALUE\n" +" or \\set NAME VALUE inside psql\n" +"\n" +msgstr "" +" psql --set=ІМ'Я=ЗНАЧЕННЯ\n" +" або \\set ІМ'Я ЗНАЧЕННЯ усередині psql\n" +"\n" -#: help.c:358 -#, c-format -msgid " AUTOCOMMIT\n" +#: help.c:396 +msgid "" +" AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" -msgstr " AUTOCOMMIT\n" +msgstr "" +" AUTOCOMMIT\n" " якщо встановлений, успішні SQL-команди підтверджуються автоматично\n" -#: help.c:360 -#, c-format -msgid " COMP_KEYWORD_CASE\n" +#: help.c:398 +msgid "" +" COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" " [lower, upper, preserve-lower, preserve-upper]\n" -msgstr " COMP_KEYWORD_CASE\n" +msgstr "" +" COMP_KEYWORD_CASE\n" " визначає регістр для автодоповнення ключових слів SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format -msgid " DBNAME\n" +#: help.c:401 +msgid "" +" DBNAME\n" " the currently connected database name\n" msgstr " DBNAME назва під'єднаної бази даних\n" -#: help.c:365 -#, c-format -msgid " ECHO\n" +#: help.c:403 +msgid "" +" ECHO\n" " controls what input is written to standard output\n" " [all, errors, none, queries]\n" msgstr " ECHO контролює ввід, що виводиться на стандартний вивід [all, errors, none, queries]\n" -#: help.c:368 -#, c-format -msgid " ECHO_HIDDEN\n" +#: help.c:406 +msgid "" +" ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" " if set to \"noexec\", just show them without execution\n" -msgstr " ECHO_HIDDEN\n" +msgstr "" +" ECHO_HIDDEN\n" " якщо ввімкнено, виводить внутрішні запити, виконані за допомогою \"\\\";\n" " якщо встановлено значення \"noexec\", тільки виводяться, але не виконуються\n" -#: help.c:371 -#, c-format -msgid " ENCODING\n" +#: help.c:409 +msgid "" +" ENCODING\n" " current client character set encoding\n" -msgstr " ENCODING\n" +msgstr "" +" ENCODING\n" " поточне кодування набору символів клієнта\n" -#: help.c:373 -#, c-format -msgid " ERROR\n" +#: help.c:411 +msgid "" +" ERROR\n" " true if last query failed, else false\n" -msgstr " ERROR\n" +msgstr "" +" ERROR\n" " істина, якщо в останньому запиті є помилка, в іншому разі - хибність\n" -#: help.c:375 -#, c-format -msgid " FETCH_COUNT\n" +#: help.c:413 +msgid "" +" FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" -msgstr " FETCH_COUNT\n" +msgstr "" +" FETCH_COUNT\n" " число рядків з результатами для передачі та відображення за один раз (0 = необмежено)\n" -#: help.c:377 -#, c-format -msgid " HIDE_TABLEAM\n" +#: help.c:415 +msgid "" +" HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" -msgstr " HIDE_TABLEAM\n" +msgstr "" +" HIDE_TABLEAM\n" " якщо вказано, методи доступу до таблиць не відображаються\n" -#: help.c:379 -#, c-format -msgid " HIDE_TOAST_COMPRESSION\n" +#: help.c:417 +msgid "" +" HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" -msgstr " HIDE_TOAST_COMPRESSION\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" " якщо встановлено, методи стискання не відображаються\n" -#: help.c:381 -#, c-format -msgid " HISTCONTROL\n" +#: help.c:419 +msgid "" +" HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" msgstr " HISTCONTROL контролює історію команд [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:383 -#, c-format -msgid " HISTFILE\n" +#: help.c:421 +msgid "" +" HISTFILE\n" " file name used to store the command history\n" msgstr " HISTFILE ім'я файлу для зберігання історії команд\n" -#: help.c:385 -#, c-format -msgid " HISTSIZE\n" +#: help.c:423 +msgid "" +" HISTSIZE\n" " maximum number of commands to store in the command history\n" msgstr " HISTSIZE максимальна кількість команд для зберігання в історії команд\n" -#: help.c:387 -#, c-format -msgid " HOST\n" +#: help.c:425 +msgid "" +" HOST\n" " the currently connected database server host\n" msgstr " HOST поточний підключений хост сервера бази даних\n" -#: help.c:389 -#, c-format -msgid " IGNOREEOF\n" +#: help.c:427 +msgid "" +" IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" msgstr " IGNOREEOF кількість EOF для завершення інтерактивної сесії\n" -#: help.c:391 -#, c-format -msgid " LASTOID\n" +#: help.c:429 +msgid "" +" LASTOID\n" " value of the last affected OID\n" msgstr " LASTOID значення останнього залученого OID\n" -#: help.c:393 -#, c-format -msgid " LAST_ERROR_MESSAGE\n" +#: help.c:431 +msgid "" +" LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" " message and SQLSTATE of last error, or empty string and \"00000\" if none\n" -msgstr " LAST_ERROR_MESSAGE\n" +msgstr "" +" LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" " повідомлення та код SQLSTATE останньої помилки, або пустий рядок та \"00000\", якщо помилки не було\n" -#: help.c:396 -#, c-format -msgid " ON_ERROR_ROLLBACK\n" +#: help.c:434 +msgid "" +" ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" -msgstr " ON_ERROR_ROLLBACK\n" +msgstr "" +" ON_ERROR_ROLLBACK\n" " якщо встановлено, транзакція не припиняється у разі помилки (використовуються неявні точки збереження)\n" -#: help.c:398 -#, c-format -msgid " ON_ERROR_STOP\n" +#: help.c:436 +msgid "" +" ON_ERROR_STOP\n" " stop batch execution after error\n" -msgstr " ON_ERROR_STOP\n" +msgstr "" +" ON_ERROR_STOP\n" " зупиняти виконання пакету команд після помилки\n" -#: help.c:400 -#, c-format -msgid " PORT\n" +#: help.c:438 +msgid "" +" PORT\n" " server port of the current connection\n" -msgstr " PORT\n" +msgstr "" +" PORT\n" " порт сервера для поточного з'єднання\n" -#: help.c:402 -#, c-format -msgid " PROMPT1\n" +#: help.c:440 +msgid "" +" PROMPT1\n" " specifies the standard psql prompt\n" -msgstr " PROMPT1\n" +msgstr "" +" PROMPT1\n" " визначає стандратне запрошення psql \n" -#: help.c:404 -#, c-format -msgid " PROMPT2\n" +#: help.c:442 +msgid "" +" PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" -msgstr " PROMPT2\n" +msgstr "" +" PROMPT2\n" " визначає запрошення, яке використовується при продовженні команди з попереднього рядка\n" -#: help.c:406 -#, c-format -msgid " PROMPT3\n" +#: help.c:444 +msgid "" +" PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" -msgstr " PROMPT3\n" +msgstr "" +" PROMPT3\n" " визначає запрошення, яке виконується під час COPY ... FROM STDIN\n" -#: help.c:408 -#, c-format -msgid " QUIET\n" +#: help.c:446 +msgid "" +" QUIET\n" " run quietly (same as -q option)\n" -msgstr " QUIET\n" +msgstr "" +" QUIET\n" " тихий запуск ( як із параметром -q)\n" -#: help.c:410 -#, c-format -msgid " ROW_COUNT\n" +#: help.c:448 +msgid "" +" ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" -msgstr " ROW_COUNT\n" +msgstr "" +" ROW_COUNT\n" " число повернених або оброблених рядків останнім запитом, або 0\n" -#: help.c:412 -#, c-format -msgid " SERVER_VERSION_NAME\n" +#: help.c:450 +msgid "" +" SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " server's version (in short string or numeric format)\n" -msgstr " SERVER_VERSION_NAME\n" +msgstr "" +" SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " версія серевера (у короткому текстовому або числовому форматі)\n" -#: help.c:415 -#, c-format -msgid " SHOW_CONTEXT\n" +#: help.c:453 +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:455 +msgid "" +" SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" -msgstr " SHOW_CONTEXT\n" +msgstr "" +" SHOW_CONTEXT\n" " керує відображенням полів контексту повідомлень [never, errors, always]\n" -#: help.c:417 -#, c-format -msgid " SINGLELINE\n" +#: help.c:457 +msgid "" +" SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" -msgstr " SINGLELINE\n" +msgstr "" +" SINGLELINE\n" " якщо встановлено, кінець рядка завершує режим вводу SQL-команди (як з параметром -S)\n" -#: help.c:419 -#, c-format -msgid " SINGLESTEP\n" +#: help.c:459 +msgid "" +" SINGLESTEP\n" " single-step mode (same as -s option)\n" -msgstr " SINGLESTEP\n" +msgstr "" +" SINGLESTEP\n" " покроковий режим (як з параметром -s)\n" -#: help.c:421 -#, c-format -msgid " SQLSTATE\n" +#: help.c:461 +msgid "" +" SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" -msgstr " SQLSTATE\n" +msgstr "" +" SQLSTATE\n" " SQLSTATE останнього запиту, або \"00000\" якщо немає помилок\n" -#: help.c:423 -#, c-format -msgid " USER\n" +#: help.c:463 +msgid "" +" USER\n" " the currently connected database user\n" -msgstr " USER\n" +msgstr "" +" USER\n" " поточний користувач, підключений до бази даних\n" -#: help.c:425 -#, c-format -msgid " VERBOSITY\n" +#: help.c:465 +msgid "" +" VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" -msgstr " VERBOSITY\n" +msgstr "" +" VERBOSITY\n" " контролює докладність звітів про помилку [default, verbose, terse, sqlstate]\n" -#: help.c:427 -#, c-format -msgid " VERSION\n" +#: help.c:467 +msgid "" +" VERSION\n" " VERSION_NAME\n" " VERSION_NUM\n" " psql's version (in verbose string, short string, or numeric format)\n" -msgstr " VERSION\n" +msgstr "" +" VERSION\n" " VERSION_NAME\n" " VERSION_NUM\n" " psql версія (в розгорнутому, в короткому текстовому або числовому форматі)\n" -#: help.c:432 -#, c-format -msgid "\n" +#: help.c:472 +msgid "" +"\n" "Display settings:\n" -msgstr "\n" +msgstr "" +"\n" "Налаштування відобреження:\n" -#: 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:474 +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:436 -#, c-format -msgid " border\n" +#: help.c:476 +msgid "" +" border\n" " border style (number)\n" -msgstr " border\n" +msgstr "" +" border\n" " стиль рамки (число)\n" -#: help.c:438 -#, c-format -msgid " columns\n" +#: help.c:478 +msgid "" +" columns\n" " target width for the wrapped format\n" -msgstr " columns\n" +msgstr "" +" columns\n" " цільова ширина для формату з переносом\n" -#: help.c:440 -#, c-format -msgid " expanded (or x)\n" +#: help.c:480 +msgid "" +" expanded (or x)\n" " expanded output [on, off, auto]\n" -msgstr " expanded (or x)\n" +msgstr "" +" expanded (or x)\n" " розширений вивід [on, off, auto]\n" -#: help.c:442 +#: help.c:482 #, c-format -msgid " fieldsep\n" +msgid "" +" fieldsep\n" " field separator for unaligned output (default \"%s\")\n" -msgstr " fieldsep\n" +msgstr "" +" fieldsep\n" " розділювач полів для не вирівняного виводу (за замовчуванням \"%s\")\n" -#: help.c:445 -#, c-format -msgid " fieldsep_zero\n" +#: help.c:485 +msgid "" +" fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" -msgstr " fieldsep_zero\n" +msgstr "" +" fieldsep_zero\n" " встановити розділювач полів для невирівняного виводу на нульовий байт\n" -#: help.c:447 -#, c-format -msgid " footer\n" +#: help.c:487 +msgid "" +" footer\n" " enable or disable display of the table footer [on, off]\n" -msgstr " footer\n" +msgstr "" +" footer\n" " вмикає або вимикає вивід підписів таблиці [on, off]\n" -#: help.c:449 -#, c-format -msgid " format\n" +#: help.c:489 +msgid "" +" format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -msgstr " format\n" +msgstr "" +" format\n" " встановити формат виводу [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:451 -#, c-format -msgid " linestyle\n" +#: help.c:491 +msgid "" +" linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" -msgstr " linestyle\n" +msgstr "" +" linestyle\n" " встановлює стиль малювання ліній рамки [ascii, old-ascii, unicode]\n" -#: help.c:453 -#, c-format -msgid " null\n" +#: help.c:493 +msgid "" +" null\n" " set the string to be printed in place of a null value\n" -msgstr " null\n" +msgstr "" +" null\n" " встановлює рядок, який буде виведено замість значення (null)\n" -#: help.c:455 -#, c-format -msgid " numericlocale\n" +#: help.c:495 +msgid "" +" numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" -msgstr " numericlocale\n" +msgstr "" +" numericlocale\n" " вмикає виведення заданого локалью роздільника групи цифр\n" -#: help.c:457 -#, c-format -msgid " pager\n" +#: help.c:497 +msgid "" +" pager\n" " control when an external pager is used [yes, no, always]\n" -msgstr " pager\n" +msgstr "" +" pager\n" " контролює використання зовнішнього пейджера [yes, no, always]\n" -#: help.c:459 -#, c-format -msgid " recordsep\n" +#: help.c:499 +msgid "" +" recordsep\n" " record (line) separator for unaligned output\n" -msgstr " recordsep\n" +msgstr "" +" recordsep\n" " розділювач записів (рядків) для не вирівняного виводу\n" -#: help.c:461 -#, c-format -msgid " recordsep_zero\n" +#: help.c:501 +msgid "" +" recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" -msgstr " recordsep_zero\n" +msgstr "" +" recordsep_zero\n" " встановлює розділювач записів для невирівняного виводу на нульовий байт\n" -#: help.c:463 -#, c-format -msgid " tableattr (or T)\n" +#: help.c:503 +msgid "" +" tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" " column widths for left-aligned data types in latex-longtable format\n" -msgstr " tableattr (або T)\n" +msgstr "" +" tableattr (або T)\n" " вказує атрибути для тегу table у html форматі або пропорційні \n" " ширини стовпців для вирівняних вліво даних, у latex-longtable форматі\n" -#: help.c:466 -#, c-format -msgid " title\n" +#: help.c:506 +msgid "" +" title\n" " set the table title for subsequently printed tables\n" -msgstr " title\n" +msgstr "" +" title\n" " задає заголовок таблиці для послідовно друкованих таблиць\n" -#: help.c:468 -#, c-format -msgid " tuples_only\n" +#: help.c:508 +msgid "" +" tuples_only\n" " if set, only actual table data is shown\n" -msgstr " tuples_only\n" +msgstr "" +" tuples_only\n" " якщо встановлено, виводяться лише фактичні табличні дані\n" -#: help.c:470 -#, c-format -msgid " unicode_border_linestyle\n" +#: help.c:510 +msgid "" +" unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" " set the style of Unicode line drawing [single, double]\n" -msgstr " unicode_border_linestyle\n" +msgstr "" +" unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" " задає стиль мальювання ліній (Unicode) [single, double]\n" -#: help.c:475 -#, c-format -msgid "\n" +#: help.c:515 +msgid "" +"\n" "Environment variables:\n" -msgstr "\n" +msgstr "" +"\n" "Змінні оточення:\n" -#: 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:519 +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:481 -#, c-format -msgid " set NAME=VALUE\n" +#: help.c:521 +msgid "" +" set NAME=VALUE\n" " psql ...\n" -" or \\setenv NAME [VALUE] inside psql\n\n" -msgstr " встановлює ІМ'Я=ЗНАЧЕННЯ\n" +" or \\setenv NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" встановлює ІМ'Я=ЗНАЧЕННЯ\n" " psql ...\n" -" або \\setenv ІМ'Я [VALUE] всередині psql\n\n" +" або \\setenv ІМ'Я [VALUE] всередині psql\n" +"\n" -#: help.c:484 -#, c-format -msgid " COLUMNS\n" +#: help.c:524 +msgid "" +" COLUMNS\n" " number of columns for wrapped format\n" -msgstr " COLUMNS\n" +msgstr "" +" COLUMNS\n" " число стовпців для форматування з переносом\n" -#: help.c:486 -#, c-format -msgid " PGAPPNAME\n" +#: help.c:526 +msgid "" +" PGAPPNAME\n" " same as the application_name connection parameter\n" -msgstr " PGAPPNAME\n" +msgstr "" +" PGAPPNAME\n" " те саме, що параметр підключення application_name\n" -#: help.c:488 -#, c-format -msgid " PGDATABASE\n" +#: help.c:528 +msgid "" +" PGDATABASE\n" " same as the dbname connection parameter\n" -msgstr " PGDATABASE\n" +msgstr "" +" PGDATABASE\n" " те саме, що параметр підключення dbname\n" -#: help.c:490 -#, c-format -msgid " PGHOST\n" +#: help.c:530 +msgid "" +" PGHOST\n" " same as the host connection parameter\n" -msgstr " PGHOST\n" +msgstr "" +" PGHOST\n" " те саме, що параметр підключення host\n" -#: help.c:492 -#, c-format -msgid " PGPASSFILE\n" +#: help.c:532 +msgid "" +" PGPASSFILE\n" " password file name\n" -msgstr " PGPASSFILE\n" +msgstr "" +" PGPASSFILE\n" " назва файлу з паролем\n" -#: help.c:494 -#, c-format -msgid " PGPASSWORD\n" +#: help.c:534 +msgid "" +" PGPASSWORD\n" " connection password (not recommended)\n" -msgstr " PGPASSWORD\n" +msgstr "" +" PGPASSWORD\n" " пароль для підключення (не рекомендується)\n" -#: help.c:496 -#, c-format -msgid " PGPORT\n" +#: help.c:536 +msgid "" +" PGPORT\n" " same as the port connection parameter\n" -msgstr " PGPORT\n" +msgstr "" +" PGPORT\n" " те саме, що параметр підключення port\n" -#: help.c:498 -#, c-format -msgid " PGUSER\n" +#: help.c:538 +msgid "" +" PGUSER\n" " same as the user connection parameter\n" -msgstr " PGUSER\n" +msgstr "" +" PGUSER\n" " те саме, що параметр підключення user\n" -#: help.c:500 -#, c-format -msgid " PSQL_EDITOR, EDITOR, VISUAL\n" +#: help.c:540 +msgid "" +" PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" -msgstr " PSQL_EDITOR, EDITOR, VISUAL\n" +msgstr "" +" PSQL_EDITOR, EDITOR, VISUAL\n" " редактор для команд \\e, \\ef і \\ev\n" -#: help.c:502 -#, c-format -msgid " PSQL_EDITOR_LINENUMBER_ARG\n" +#: help.c:542 +msgid "" +" PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" -msgstr " PSQL_EDITOR_LINENUMBER_ARG\n" +msgstr "" +" PSQL_EDITOR_LINENUMBER_ARG\n" " як вказати номер рядка при виклику редактора\n" -#: help.c:504 -#, c-format -msgid " PSQL_HISTORY\n" +#: help.c:544 +msgid "" +" PSQL_HISTORY\n" " alternative location for the command history file\n" -msgstr " PSQL_HISTORY\n" +msgstr "" +" PSQL_HISTORY\n" " альтернативне розміщення файлу з історією команд\n" -#: help.c:506 -#, c-format -msgid " PSQL_PAGER, PAGER\n" +#: help.c:546 +msgid "" +" PSQL_PAGER, PAGER\n" " name of external pager program\n" -msgstr " PSQL_PAGER, PAGER\n" +msgstr "" +" PSQL_PAGER, PAGER\n" " ім'я програми зовнішнього пейджеру\n" -#: help.c:508 -#, c-format -msgid " PSQLRC\n" +#: help.c:549 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" назва зовнішньої програми-пейджера для використання з \\watch\n" + +#: help.c:552 +msgid "" +" PSQLRC\n" " alternative location for the user's .psqlrc file\n" -msgstr " PSQLRC\n" +msgstr "" +" PSQLRC\n" " альтернативне розміщення користувацького файла .psqlrc\n" -#: help.c:510 -#, c-format -msgid " SHELL\n" +#: help.c:554 +msgid "" +" SHELL\n" " shell used by the \\! command\n" -msgstr " SHELL\n" +msgstr "" +" SHELL\n" " оболонка, що використовується командою \\!\n" -#: help.c:512 -#, c-format -msgid " TMPDIR\n" +#: help.c:556 +msgid "" +" TMPDIR\n" " directory for temporary files\n" -msgstr " TMPDIR\n" +msgstr "" +" TMPDIR\n" " каталог для тимчасових файлів\n" -#: help.c:557 +#: help.c:616 msgid "Available help:\n" msgstr "Доступна довідка:\n" -#: help.c:652 +#: help.c:711 #, c-format -msgid "Command: %s\n" +msgid "" +"Command: %s\n" "Description: %s\n" "Syntax:\n" -"%s\n\n" -"URL: %s\n\n" -msgstr "Команда: %s\n" +"%s\n" +"\n" +"URL: %s\n" +"\n" +msgstr "" +"Команда: %s\n" "Опис: %s\n" "Синтаксис:\n" -"%s\n\n" -"URL: %s\n\n" +"%s\n" +"\n" +"URL: %s\n" +"\n" -#: help.c:675 +#: help.c:734 #, c-format -msgid "No help available for \"%s\".\n" +msgid "" +"No help available for \"%s\".\n" "Try \\h with no arguments to see available help.\n" -msgstr "Немає доступної довідки по команді \"%s\".\n" +msgstr "" +"Немає доступної довідки по команді \"%s\".\n" "Спробуйте \\h без аргументів, щоб подивитись доступну довідку.\n" #: input.c:217 @@ -3812,12 +3840,12 @@ msgstr "Немає доступної довідки по команді \"%s\". 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 "ця установка не підтримує історію" @@ -3837,73 +3865,69 @@ 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 -msgid "The input is a PostgreSQL custom-format dump.\n" +#: 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" -msgstr "Ввід являє собою спеціальний формат дампу PostgreSQL.\n" +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 "Для отримання довідки введіть \\? або натисніть сontrol-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 "Ви використовуєте psql — інтерфейс командного рядка до PostgreSQL." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format -msgid "Type: \\copyright for distribution terms\n" +msgid "" +"Type: \\copyright for distribution terms\n" " \\h for help with SQL commands\n" " \\? for help with psql commands\n" " \\g or terminate with semicolon to execute query\n" " \\q to quit\n" -msgstr "Введіть: \\copyright для умов розповсюдження\n" +msgstr "" +"Введіть: \\copyright для умов розповсюдження\n" " \\h для довідки по командах SQL\n" " \\? для довідки по командах psql\n" " \\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" @@ -3920,2345 +3944,2461 @@ 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: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:662 sql_help.c:664 sql_help.c:666 -#: sql_help.c:669 sql_help.c:671 sql_help.c:673 sql_help.c:709 sql_help.c:713 -#: sql_help.c:717 sql_help.c:736 sql_help.c:739 sql_help.c:742 sql_help.c:771 -#: sql_help.c:783 sql_help.c:791 sql_help.c:794 sql_help.c:797 sql_help.c:812 -#: sql_help.c:815 sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:886 sql_help.c:888 sql_help.c:890 sql_help.c:892 -#: sql_help.c:895 sql_help.c:897 sql_help.c:939 sql_help.c:984 sql_help.c:989 -#: sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1023 -#: sql_help.c:1034 sql_help.c:1036 sql_help.c:1055 sql_help.c:1065 -#: sql_help.c:1067 sql_help.c:1069 sql_help.c:1081 sql_help.c:1085 -#: sql_help.c:1087 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1105 sql_help.c:1123 sql_help.c:1125 sql_help.c:1129 -#: sql_help.c:1133 sql_help.c:1137 sql_help.c:1140 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1145 sql_help.c:1147 sql_help.c:1282 -#: sql_help.c:1284 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1297 sql_help.c:1300 sql_help.c:1413 -#: sql_help.c:1415 sql_help.c:1417 sql_help.c:1420 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1447 sql_help.c:1450 sql_help.c:1454 -#: sql_help.c:1456 sql_help.c:1458 sql_help.c:1460 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1479 sql_help.c:1481 sql_help.c:1491 -#: sql_help.c:1493 sql_help.c:1503 sql_help.c:1505 sql_help.c:1515 -#: sql_help.c:1518 sql_help.c:1541 sql_help.c:1543 sql_help.c:1545 -#: sql_help.c:1547 sql_help.c:1550 sql_help.c:1552 sql_help.c:1555 -#: sql_help.c:1558 sql_help.c:1609 sql_help.c:1652 sql_help.c:1655 -#: sql_help.c:1657 sql_help.c:1659 sql_help.c:1662 sql_help.c:1664 -#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1719 sql_help.c:1735 -#: sql_help.c:1966 sql_help.c:2035 sql_help.c:2054 sql_help.c:2067 -#: sql_help.c:2124 sql_help.c:2131 sql_help.c:2141 sql_help.c:2162 -#: sql_help.c:2188 sql_help.c:2206 sql_help.c:2234 sql_help.c:2345 -#: sql_help.c:2391 sql_help.c:2415 sql_help.c:2438 sql_help.c:2442 -#: sql_help.c:2476 sql_help.c:2496 sql_help.c:2518 sql_help.c:2532 -#: sql_help.c:2553 sql_help.c:2577 sql_help.c:2607 sql_help.c:2632 -#: sql_help.c:2679 sql_help.c:2967 sql_help.c:2980 sql_help.c:2997 -#: sql_help.c:3013 sql_help.c:3053 sql_help.c:3107 sql_help.c:3111 -#: sql_help.c:3113 sql_help.c:3120 sql_help.c:3139 sql_help.c:3166 -#: sql_help.c:3201 sql_help.c:3213 sql_help.c:3222 sql_help.c:3266 -#: sql_help.c:3280 sql_help.c:3308 sql_help.c:3316 sql_help.c:3328 -#: sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 sql_help.c:3362 -#: sql_help.c:3370 sql_help.c:3379 sql_help.c:3390 sql_help.c:3398 -#: sql_help.c:3406 sql_help.c:3414 sql_help.c:3422 sql_help.c:3432 -#: sql_help.c:3441 sql_help.c:3450 sql_help.c:3458 sql_help.c:3468 -#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3496 sql_help.c:3507 -#: 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:3588 sql_help.c:3596 sql_help.c:3613 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3647 sql_help.c:3662 -#: sql_help.c:3964 sql_help.c:4015 sql_help.c:4044 sql_help.c:4059 -#: sql_help.c:4552 sql_help.c:4600 sql_help.c:4758 +#: 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:1996 +#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 +#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 +#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 +#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 +#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 +#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 +#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 +#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 +#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 +#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 +#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 +#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 +#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 +#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 +#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 +#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 +#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 +#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 +#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 +#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 +#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 +#: sql_help.c:4735 sql_help.c:4893 msgid "name" msgstr "назва" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1816 -#: sql_help.c:3281 sql_help.c:4320 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 +#: sql_help.c:3339 sql_help.c:4455 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:525 sql_help.c:573 -#: sql_help.c:591 sql_help.c:618 sql_help.c:670 sql_help.c:738 sql_help.c:793 -#: sql_help.c:814 sql_help.c:853 sql_help.c:898 sql_help.c:940 sql_help.c:993 -#: sql_help.c:1025 sql_help.c:1035 sql_help.c:1068 sql_help.c:1088 -#: sql_help.c:1102 sql_help.c:1148 sql_help.c:1291 sql_help.c:1414 -#: sql_help.c:1457 sql_help.c:1478 sql_help.c:1492 sql_help.c:1504 -#: sql_help.c:1517 sql_help.c:1544 sql_help.c:1610 sql_help.c:1663 +#: 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:530 sql_help.c:620 -#: sql_help.c:629 sql_help.c:692 sql_help.c:712 sql_help.c:741 sql_help.c:796 -#: sql_help.c:858 sql_help.c:896 sql_help.c:998 sql_help.c:1037 sql_help.c:1066 -#: sql_help.c:1086 sql_help.c:1100 sql_help.c:1146 sql_help.c:1354 -#: sql_help.c:1416 sql_help.c:1459 sql_help.c:1480 sql_help.c:1542 -#: sql_help.c:1658 sql_help.c:2953 +#: 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:3011 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:535 sql_help.c:672 sql_help.c:716 sql_help.c:744 -#: sql_help.c:799 sql_help.c:863 sql_help.c:1003 sql_help.c:1070 -#: sql_help.c:1104 sql_help.c:1293 sql_help.c:1461 sql_help.c:1482 -#: sql_help.c:1494 sql_help.c:1506 sql_help.c:1546 sql_help.c:1665 +#: 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:1880 sql_help.c:3282 sql_help.c:4349 +#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 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:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 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:2036 sql_help.c:2055 -#: sql_help.c:2058 sql_help.c:2346 sql_help.c:2554 sql_help.c:3283 -#: sql_help.c:3286 sql_help.c:3289 sql_help.c:3380 sql_help.c:3469 -#: sql_help.c:3497 sql_help.c:3842 sql_help.c:4222 sql_help.c:4326 -#: sql_help.c:4333 sql_help.c:4339 sql_help.c:4350 sql_help.c:4353 -#: sql_help.c:4356 +#: 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:2066 sql_help.c:2085 +#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 +#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 +#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 +#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 +#: sql_help.c:4491 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:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:846 -#: sql_help.c:851 sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:986 -#: sql_help.c:991 sql_help.c:996 sql_help.c:1001 sql_help.c:1006 -#: sql_help.c:1835 sql_help.c:1852 sql_help.c:1858 sql_help.c:1882 -#: sql_help.c:1885 sql_help.c:1888 sql_help.c:2037 sql_help.c:2056 -#: sql_help.c:2059 sql_help.c:2347 sql_help.c:2555 sql_help.c:3284 -#: sql_help.c:3287 sql_help.c:3290 sql_help.c:3381 sql_help.c:3470 -#: sql_help.c:3498 sql_help.c:4327 sql_help.c:4334 sql_help.c:4340 -#: sql_help.c:4351 sql_help.c:4354 sql_help.c:4357 +#: 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:2067 sql_help.c:2086 +#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 +#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 +#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 +#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 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:519 -#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:847 -#: sql_help.c:852 sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:987 -#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1007 -#: sql_help.c:1836 sql_help.c:1853 sql_help.c:1859 sql_help.c:1883 -#: sql_help.c:1886 sql_help.c:1889 sql_help.c:2348 sql_help.c:2556 -#: sql_help.c:3285 sql_help.c:3288 sql_help.c:3291 sql_help.c:3382 -#: sql_help.c:3471 sql_help.c:3499 sql_help.c:4328 sql_help.c:4335 -#: sql_help.c:4341 sql_help.c:4352 sql_help.c:4355 sql_help.c:4358 +#: 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:2388 sql_help.c:2597 +#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 +#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 +#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 msgid "argtype" msgstr "тип_аргументу" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:934 -#: sql_help.c:1083 sql_help.c:1475 sql_help.c:1604 sql_help.c:1636 -#: sql_help.c:1688 sql_help.c:1751 sql_help.c:1937 sql_help.c:1944 -#: sql_help.c:2237 sql_help.c:2287 sql_help.c:2294 sql_help.c:2303 -#: sql_help.c:2392 sql_help.c:2608 sql_help.c:2701 sql_help.c:2982 -#: sql_help.c:3167 sql_help.c:3189 sql_help.c:3329 sql_help.c:3684 -#: sql_help.c:3883 sql_help.c:4058 sql_help.c:4821 +#: 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:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 +#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 +#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 +#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 msgid "option" msgstr "параметр" -#: sql_help.c:113 sql_help.c:935 sql_help.c:1605 sql_help.c:2393 -#: sql_help.c:2609 sql_help.c:3168 sql_help.c:3330 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 +#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 msgid "where option can be:" msgstr "де параметр може бути:" -#: sql_help.c:114 sql_help.c:2170 +#: sql_help.c:116 sql_help.c:2209 msgid "allowconn" msgstr "дозвол_підкл" -#: sql_help.c:115 sql_help.c:936 sql_help.c:1606 sql_help.c:2171 -#: sql_help.c:2394 sql_help.c:2610 sql_help.c:3169 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 +#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 msgid "connlimit" msgstr "ліміт_підключень" -#: sql_help.c:116 sql_help.c:2172 +#: sql_help.c:118 sql_help.c:2211 msgid "istemplate" msgstr "чи_шаблон" -#: sql_help.c:122 sql_help.c:608 sql_help.c:675 sql_help.c:688 sql_help.c:1296 -#: sql_help.c:1347 sql_help.c:4062 +#: 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:4187 msgid "new_tablespace" msgstr "новий_табл_простір" -#: 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:870 sql_help.c:872 sql_help.c:873 sql_help.c:943 -#: sql_help.c:947 sql_help.c:950 sql_help.c:1012 sql_help.c:1014 -#: sql_help.c:1015 sql_help.c:1159 sql_help.c:1162 sql_help.c:1613 -#: sql_help.c:1617 sql_help.c:1620 sql_help.c:2358 sql_help.c:2560 -#: sql_help.c:4080 sql_help.c:4540 +#: 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:2398 sql_help.c:2601 +#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 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:546 sql_help.c:600 sql_help.c:681 sql_help.c:690 sql_help.c:871 -#: sql_help.c:894 sql_help.c:944 sql_help.c:1013 sql_help.c:1084 -#: sql_help.c:1128 sql_help.c:1132 sql_help.c:1136 sql_help.c:1139 -#: sql_help.c:1144 sql_help.c:1160 sql_help.c:1161 sql_help.c:1327 -#: sql_help.c:1349 sql_help.c:1397 sql_help.c:1419 sql_help.c:1476 -#: sql_help.c:1560 sql_help.c:1614 sql_help.c:1637 sql_help.c:2238 -#: sql_help.c:2288 sql_help.c:2295 sql_help.c:2304 sql_help.c:2359 -#: sql_help.c:2360 sql_help.c:2423 sql_help.c:2426 sql_help.c:2460 -#: sql_help.c:2561 sql_help.c:2562 sql_help.c:2580 sql_help.c:2702 -#: sql_help.c:2741 sql_help.c:2847 sql_help.c:2860 sql_help.c:2874 -#: sql_help.c:2915 sql_help.c:2939 sql_help.c:2956 sql_help.c:2983 -#: sql_help.c:3190 sql_help.c:3884 sql_help.c:4541 sql_help.c:4542 -#: sql_help.c:4543 sql_help.c:4544 +#: 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:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 +#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 +#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 +#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 +#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 +#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 +#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 msgid "value" msgstr "значення" -#: sql_help.c:197 +#: sql_help.c:200 msgid "target_role" msgstr "цільова_роль" -#: sql_help.c:198 sql_help.c:2222 sql_help.c:2657 sql_help.c:2662 -#: sql_help.c:3817 sql_help.c:3826 sql_help.c:3845 sql_help.c:3854 -#: sql_help.c:4197 sql_help.c:4206 sql_help.c:4225 sql_help.c:4234 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 +#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 +#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 +#: sql_help.c:4357 sql_help.c:4369 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:571 sql_help.c:607 sql_help.c:674 sql_help.c:817 sql_help.c:954 -#: sql_help.c:1295 sql_help.c:1624 sql_help.c:2397 sql_help.c:2398 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2401 sql_help.c:2534 -#: sql_help.c:2613 sql_help.c:2614 sql_help.c:2615 sql_help.c:2616 -#: sql_help.c:2617 sql_help.c:3172 sql_help.c:3173 sql_help.c:3174 -#: sql_help.c:3175 sql_help.c:3176 sql_help.c:3863 sql_help.c:3867 -#: sql_help.c:4243 sql_help.c:4247 sql_help.c:4562 +#: 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:2437 sql_help.c:2438 +#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 +#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 +#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 +#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 +#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 msgid "role_name" msgstr "ім'я_ролі" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1311 sql_help.c:1313 -#: sql_help.c:1364 sql_help.c:1376 sql_help.c:1401 sql_help.c:1654 -#: sql_help.c:2191 sql_help.c:2195 sql_help.c:2307 sql_help.c:2312 -#: sql_help.c:2419 sql_help.c:2718 sql_help.c:2723 sql_help.c:2725 -#: sql_help.c:2842 sql_help.c:2855 sql_help.c:2869 sql_help.c:2878 -#: sql_help.c:2890 sql_help.c:2919 sql_help.c:3915 sql_help.c:3930 -#: sql_help.c:3932 sql_help.c:4413 sql_help.c:4414 sql_help.c:4423 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4473 -#: sql_help.c:4474 sql_help.c:4475 sql_help.c:4515 sql_help.c:4516 -#: sql_help.c:4521 sql_help.c:4526 sql_help.c:4670 sql_help.c:4671 -#: sql_help.c:4680 sql_help.c:4727 sql_help.c:4728 sql_help.c:4729 -#: sql_help.c:4730 sql_help.c:4731 sql_help.c:4732 sql_help.c:4786 -#: sql_help.c:4788 sql_help.c:4848 sql_help.c:4908 sql_help.c:4909 -#: sql_help.c:4918 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 -#: sql_help.c:4968 sql_help.c:4969 sql_help.c:4970 +#: 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:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 +#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 +#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 +#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 +#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 +#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 +#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 +#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 +#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 +#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 +#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 +#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 +#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 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:1288 sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 -#: sql_help.c:1363 sql_help.c:1375 sql_help.c:1392 sql_help.c:1822 -#: sql_help.c:1824 sql_help.c:2194 sql_help.c:2306 sql_help.c:2311 -#: sql_help.c:2877 sql_help.c:2889 sql_help.c:3927 +#: 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:2234 sql_help.c:2346 sql_help.c:2351 +#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 msgid "constraint_name" msgstr "ім'я_обмеження" -#: sql_help.c:244 sql_help.c:1289 +#: sql_help.c:247 sql_help.c:1315 msgid "new_constraint_name" msgstr "ім'я_нового_обмеження" -#: sql_help.c:317 sql_help.c:1082 +#: 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:1814 sql_help.c:1819 sql_help.c:1826 -#: sql_help.c:1827 sql_help.c:1828 sql_help.c:1829 sql_help.c:1830 -#: sql_help.c:1831 sql_help.c:1832 sql_help.c:1837 sql_help.c:1839 -#: sql_help.c:1843 sql_help.c:1845 sql_help.c:1849 sql_help.c:1854 -#: sql_help.c:1855 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:1871 sql_help.c:1872 -#: sql_help.c:1877 sql_help.c:1878 sql_help.c:4316 sql_help.c:4321 -#: sql_help.c:4322 sql_help.c:4323 sql_help.c:4324 sql_help.c:4330 -#: sql_help.c:4331 sql_help.c:4336 sql_help.c:4337 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4344 sql_help.c:4345 sql_help.c:4346 -#: sql_help.c:4347 +#: 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:4451 sql_help.c:4456 +#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 +#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 +#: sql_help.c:4482 msgid "object_name" msgstr "ім'я_об'єкту" -#: sql_help.c:326 sql_help.c:1815 sql_help.c:4319 +#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 msgid "aggregate_name" msgstr "ім'я_агр_функції" -#: sql_help.c:328 sql_help.c:1817 sql_help.c:2101 sql_help.c:2105 -#: sql_help.c:2107 sql_help.c:3299 +#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 +#: sql_help.c:2137 sql_help.c:3357 msgid "source_type" msgstr "початковий_тип" -#: sql_help.c:329 sql_help.c:1818 sql_help.c:2102 sql_help.c:2106 -#: sql_help.c:2108 sql_help.c:3300 +#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 +#: sql_help.c:2138 sql_help.c:3358 msgid "target_type" msgstr "тип_цілі" -#: sql_help.c:336 sql_help.c:781 sql_help.c:1833 sql_help.c:2103 -#: sql_help.c:2144 sql_help.c:2210 sql_help.c:2477 sql_help.c:2508 -#: sql_help.c:3059 sql_help.c:4221 sql_help.c:4325 sql_help.c:4442 -#: sql_help.c:4446 sql_help.c:4450 sql_help.c:4453 sql_help.c:4699 -#: sql_help.c:4703 sql_help.c:4707 sql_help.c:4710 sql_help.c:4937 -#: sql_help.c:4941 sql_help.c:4945 sql_help.c:4948 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 +#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 +#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 +#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 +#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 +#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 msgid "function_name" msgstr "ім'я_функції" -#: sql_help.c:341 sql_help.c:774 sql_help.c:1840 sql_help.c:2501 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 msgid "operator_name" msgstr "ім'я_оператора" -#: sql_help.c:342 sql_help.c:710 sql_help.c:714 sql_help.c:718 sql_help.c:1841 -#: sql_help.c:2478 sql_help.c:3423 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 +#: sql_help.c:2519 sql_help.c:3481 msgid "left_type" msgstr "тип_ліворуч" -#: sql_help.c:343 sql_help.c:711 sql_help.c:715 sql_help.c:719 sql_help.c:1842 -#: sql_help.c:2479 sql_help.c:3424 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 +#: sql_help.c:2520 sql_help.c:3482 msgid "right_type" msgstr "тип_праворуч" -#: sql_help.c:345 sql_help.c:347 sql_help.c:737 sql_help.c:740 sql_help.c:743 -#: sql_help.c:772 sql_help.c:784 sql_help.c:792 sql_help.c:795 sql_help.c:798 -#: sql_help.c:1381 sql_help.c:1844 sql_help.c:1846 sql_help.c:2498 -#: sql_help.c:2519 sql_help.c:2895 sql_help.c:3433 sql_help.c:3442 +#: 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:2539 +#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 msgid "index_method" msgstr "метод_індексу" -#: sql_help.c:349 sql_help.c:1850 sql_help.c:4332 +#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 msgid "procedure_name" msgstr "назва_процедури" -#: sql_help.c:353 sql_help.c:1856 sql_help.c:3841 sql_help.c:4338 +#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 msgid "routine_name" msgstr "ім'я_підпрограми" -#: sql_help.c:365 sql_help.c:1353 sql_help.c:1873 sql_help.c:2354 -#: sql_help.c:2559 sql_help.c:2850 sql_help.c:3026 sql_help.c:3604 -#: sql_help.c:3860 sql_help.c:4240 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 +#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 +#: sql_help.c:3926 sql_help.c:4375 msgid "type_name" msgstr "назва_типу" -#: sql_help.c:366 sql_help.c:1874 sql_help.c:2353 sql_help.c:2558 -#: sql_help.c:3027 sql_help.c:3257 sql_help.c:3605 sql_help.c:3848 -#: sql_help.c:4228 +#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 +#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 +#: sql_help.c:4360 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:1968 sql_help.c:2235 +#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 msgid "handler_function" msgstr "функція_обробник" -#: sql_help.c:393 sql_help.c:2236 +#: sql_help.c:396 sql_help.c:2276 msgid "validator_function" msgstr "функція_перевірки" -#: sql_help.c:441 sql_help.c:520 sql_help.c:663 sql_help.c:848 sql_help.c:988 -#: sql_help.c:1283 sql_help.c:1551 +#: 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:667 sql_help.c:677 sql_help.c:679 -#: sql_help.c:682 sql_help.c:684 sql_help.c:685 sql_help.c:1064 sql_help.c:1285 -#: sql_help.c:1303 sql_help.c:1307 sql_help.c:1308 sql_help.c:1312 -#: sql_help.c:1314 sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 -#: sql_help.c:1319 sql_help.c:1322 sql_help.c:1323 sql_help.c:1325 -#: sql_help.c:1328 sql_help.c:1330 sql_help.c:1331 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1386 sql_help.c:1395 sql_help.c:1400 -#: sql_help.c:1653 sql_help.c:1656 sql_help.c:1660 sql_help.c:1696 -#: sql_help.c:1821 sql_help.c:1934 sql_help.c:1940 sql_help.c:1953 -#: sql_help.c:1954 sql_help.c:1955 sql_help.c:2285 sql_help.c:2298 -#: sql_help.c:2351 sql_help.c:2418 sql_help.c:2424 sql_help.c:2457 -#: sql_help.c:2687 sql_help.c:2722 sql_help.c:2724 sql_help.c:2832 -#: sql_help.c:2841 sql_help.c:2851 sql_help.c:2854 sql_help.c:2864 -#: sql_help.c:2868 sql_help.c:2891 sql_help.c:2893 sql_help.c:2900 -#: sql_help.c:2913 sql_help.c:2918 sql_help.c:2936 sql_help.c:3062 -#: sql_help.c:3202 sql_help.c:3820 sql_help.c:3821 sql_help.c:3914 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3933 sql_help.c:4200 -#: sql_help.c:4201 sql_help.c:4318 sql_help.c:4479 sql_help.c:4485 -#: sql_help.c:4487 sql_help.c:4736 sql_help.c:4742 sql_help.c:4744 -#: sql_help.c:4785 sql_help.c:4787 sql_help.c:4789 sql_help.c:4836 -#: sql_help.c:4974 sql_help.c:4980 sql_help.c:4982 +#: 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:1983 sql_help.c:1984 +#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 +#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 +#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 +#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 +#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 +#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 +#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 +#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 +#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 +#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 +#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 +#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 +#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 msgid "column_name" msgstr "назва_стовпця" -#: sql_help.c:444 sql_help.c:668 sql_help.c:1286 sql_help.c:1661 +#: 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:541 sql_help.c:676 sql_help.c:869 sql_help.c:1009 -#: sql_help.c:1302 sql_help.c:1561 +#: 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:1056 sql_help.c:1304 -#: sql_help.c:1309 sql_help.c:1563 sql_help.c:1567 sql_help.c:2189 -#: sql_help.c:2286 sql_help.c:2497 sql_help.c:2680 sql_help.c:2833 -#: sql_help.c:3109 sql_help.c:4016 +#: 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:2229 +#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 +#: sql_help.c:3167 sql_help.c:4141 msgid "data_type" msgstr "тип_даних" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1305 sql_help.c:1310 -#: sql_help.c:1564 sql_help.c:1568 sql_help.c:2190 sql_help.c:2289 -#: sql_help.c:2420 sql_help.c:2835 sql_help.c:2843 sql_help.c:2856 -#: sql_help.c:2870 sql_help.c:3110 sql_help.c:3116 sql_help.c:3924 +#: 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:2230 sql_help.c:2329 +#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 +#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 msgid "collation" msgstr "правила_сортування" -#: sql_help.c:453 sql_help.c:1306 sql_help.c:2290 sql_help.c:2299 -#: sql_help.c:2836 sql_help.c:2852 sql_help.c:2865 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 +#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 msgid "column_constraint" msgstr "обмеження_стовпця" -#: sql_help.c:463 sql_help.c:605 sql_help.c:678 sql_help.c:1324 sql_help.c:4833 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 msgid "integer" msgstr "ціле" -#: sql_help.c:465 sql_help.c:468 sql_help.c:680 sql_help.c:683 sql_help.c:1326 -#: sql_help.c:1329 +#: 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:1333 sql_help.c:2291 sql_help.c:2300 -#: sql_help.c:2837 sql_help.c:2853 sql_help.c:2866 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 +#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 msgid "table_constraint" msgstr "обмеження_таблиці" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1338 -#: sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 sql_help.c:1875 +#: 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:1351 sql_help.c:1352 -#: sql_help.c:2292 sql_help.c:2297 sql_help.c:2840 sql_help.c:2863 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 msgid "parent_table" msgstr "батьківська_таблиця" -#: sql_help.c:540 sql_help.c:597 sql_help.c:665 sql_help.c:868 sql_help.c:1008 -#: sql_help.c:1520 sql_help.c:2221 +#: 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:2261 msgid "extension_name" msgstr "ім'я_розширення" -#: sql_help.c:542 sql_help.c:1010 sql_help.c:2355 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 msgid "execution_cost" msgstr "вартість_виконання" -#: sql_help.c:543 sql_help.c:1011 sql_help.c:2356 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 msgid "result_rows" msgstr "рядки_результату" -#: sql_help.c:544 sql_help.c:2357 +#: sql_help.c:547 sql_help.c:2397 msgid "support_function" msgstr "функція_підтримки" -#: sql_help.c:566 sql_help.c:568 sql_help.c:933 sql_help.c:941 sql_help.c:945 -#: sql_help.c:948 sql_help.c:951 sql_help.c:1603 sql_help.c:1611 -#: sql_help.c:1615 sql_help.c:1618 sql_help.c:1621 sql_help.c:2658 -#: sql_help.c:2660 sql_help.c:2663 sql_help.c:2664 sql_help.c:3818 -#: sql_help.c:3819 sql_help.c:3823 sql_help.c:3824 sql_help.c:3827 -#: sql_help.c:3828 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:3846 sql_help.c:3847 sql_help.c:3849 -#: sql_help.c:3850 sql_help.c:3852 sql_help.c:3853 sql_help.c:3855 -#: sql_help.c:3856 sql_help.c:3858 sql_help.c:3859 sql_help.c:3861 -#: sql_help.c:3862 sql_help.c:3864 sql_help.c:3865 sql_help.c:4198 -#: sql_help.c:4199 sql_help.c:4203 sql_help.c:4204 sql_help.c:4207 -#: sql_help.c:4208 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:4226 sql_help.c:4227 sql_help.c:4229 -#: sql_help.c:4230 sql_help.c:4232 sql_help.c:4233 sql_help.c:4235 -#: sql_help.c:4236 sql_help.c:4238 sql_help.c:4239 sql_help.c:4241 -#: sql_help.c:4242 sql_help.c:4244 sql_help.c:4245 +#: 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:2709 +#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 +#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 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:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 +#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 +#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 +#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 +#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 +#: sql_help.c:4343 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:4358 +#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 +#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 msgid "role_specification" msgstr "вказання_ролі" -#: sql_help.c:567 sql_help.c:569 sql_help.c:1634 sql_help.c:2163 -#: sql_help.c:2666 sql_help.c:3187 sql_help.c:3638 sql_help.c:4572 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 +#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 msgid "user_name" msgstr "ім'я_користувача" -#: sql_help.c:570 sql_help.c:953 sql_help.c:1623 sql_help.c:2665 -#: sql_help.c:3866 sql_help.c:4246 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 +#: sql_help.c:3932 sql_help.c:4381 msgid "where role_specification can be:" msgstr "де вказання_ролі може бути:" -#: sql_help.c:572 +#: sql_help.c:575 msgid "group_name" msgstr "ім'я_групи" -#: sql_help.c:593 sql_help.c:1398 sql_help.c:2169 sql_help.c:2427 -#: sql_help.c:2461 sql_help.c:2848 sql_help.c:2861 sql_help.c:2875 -#: sql_help.c:2916 sql_help.c:2940 sql_help.c:2952 sql_help.c:3857 -#: sql_help.c:4237 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 +#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 +#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 +#: sql_help.c:4372 msgid "tablespace_name" msgstr "ім'я_табличного_простору" -#: sql_help.c:595 sql_help.c:687 sql_help.c:1346 sql_help.c:1355 -#: sql_help.c:1393 sql_help.c:1750 sql_help.c:1753 +#: 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:599 sql_help.c:602 sql_help.c:689 sql_help.c:691 sql_help.c:1348 -#: sql_help.c:1350 sql_help.c:1396 sql_help.c:2425 sql_help.c:2459 -#: sql_help.c:2846 sql_help.c:2859 sql_help.c:2873 sql_help.c:2914 -#: sql_help.c:2938 +#: 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:2466 sql_help.c:2500 +#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 +#: sql_help.c:2996 msgid "storage_parameter" msgstr "параметр_зберігання" -#: sql_help.c:604 +#: sql_help.c:607 msgid "column_number" msgstr "номер_стовпця" -#: sql_help.c:628 sql_help.c:1838 sql_help.c:4329 +#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 msgid "large_object_oid" msgstr "oid_великого_об'єкта" -#: sql_help.c:686 sql_help.c:1332 sql_help.c:2834 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 msgid "compression_method" msgstr "compression_method" -#: sql_help.c:720 sql_help.c:2482 +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "новий_метод_доступа" + +#: sql_help.c:725 sql_help.c:2523 msgid "res_proc" msgstr "res_процедура" -#: sql_help.c:721 sql_help.c:2483 +#: sql_help.c:726 sql_help.c:2524 msgid "join_proc" msgstr "процедура_приєднання" -#: sql_help.c:773 sql_help.c:785 sql_help.c:2500 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 msgid "strategy_number" msgstr "номер_стратегії" -#: sql_help.c:775 sql_help.c:776 sql_help.c:779 sql_help.c:780 sql_help.c:786 -#: sql_help.c:787 sql_help.c:789 sql_help.c:790 sql_help.c:2502 sql_help.c:2503 -#: sql_help.c:2506 sql_help.c:2507 +#: 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:2543 sql_help.c:2544 +#: sql_help.c:2547 sql_help.c:2548 msgid "op_type" msgstr "тип_операції" -#: sql_help.c:777 sql_help.c:2504 +#: sql_help.c:782 sql_help.c:2545 msgid "sort_family_name" msgstr "ім'я_родини_сортування" -#: sql_help.c:778 sql_help.c:788 sql_help.c:2505 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 msgid "support_number" msgstr "номер_підтримки" -#: sql_help.c:782 sql_help.c:2104 sql_help.c:2509 sql_help.c:3029 -#: sql_help.c:3031 +#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 +#: sql_help.c:3089 msgid "argument_type" msgstr "тип_аргументу" -#: sql_help.c:813 sql_help.c:816 sql_help.c:887 sql_help.c:889 sql_help.c:891 -#: sql_help.c:1024 sql_help.c:1063 sql_help.c:1516 sql_help.c:1519 -#: sql_help.c:1695 sql_help.c:1749 sql_help.c:1752 sql_help.c:1823 -#: sql_help.c:1848 sql_help.c:1861 sql_help.c:1876 sql_help.c:1933 -#: sql_help.c:1939 sql_help.c:2284 sql_help.c:2296 sql_help.c:2416 -#: sql_help.c:2456 sql_help.c:2533 sql_help.c:2578 sql_help.c:2634 -#: sql_help.c:2686 sql_help.c:2719 sql_help.c:2726 sql_help.c:2831 -#: sql_help.c:2849 sql_help.c:2862 sql_help.c:2935 sql_help.c:3055 -#: sql_help.c:3236 sql_help.c:3459 sql_help.c:3508 sql_help.c:3614 -#: sql_help.c:3816 sql_help.c:3822 sql_help.c:3880 sql_help.c:3912 -#: sql_help.c:4196 sql_help.c:4202 sql_help.c:4317 sql_help.c:4428 -#: sql_help.c:4430 sql_help.c:4492 sql_help.c:4531 sql_help.c:4685 -#: sql_help.c:4687 sql_help.c:4749 sql_help.c:4783 sql_help.c:4835 -#: sql_help.c:4923 sql_help.c:4925 sql_help.c:4987 +#: 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:2324 +#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 +#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 +#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 +#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 +#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 +#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 +#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 +#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 +#: sql_help.c:5122 msgid "table_name" msgstr "ім'я_таблиці" -#: sql_help.c:818 sql_help.c:2535 +#: sql_help.c:823 sql_help.c:2576 msgid "using_expression" msgstr "вираз_використання" -#: sql_help.c:819 sql_help.c:2536 +#: sql_help.c:824 sql_help.c:2577 msgid "check_expression" msgstr "вираз_перевірки" -#: sql_help.c:893 sql_help.c:2579 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +msgid "publication_object" +msgstr "об'єкт_публікація" + +#: sql_help.c:903 sql_help.c:2625 msgid "publication_parameter" msgstr "параметр_публікації" -#: sql_help.c:937 sql_help.c:1607 sql_help.c:2395 sql_help.c:2611 -#: sql_help.c:3170 +#: sql_help.c:909 sql_help.c:2627 +msgid "where publication_object is one of:" +msgstr "де об'єкт_публікація є одним з:" + +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 +#: sql_help.c:3228 msgid "password" msgstr "пароль" -#: sql_help.c:938 sql_help.c:1608 sql_help.c:2396 sql_help.c:2612 -#: sql_help.c:3171 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 +#: sql_help.c:3229 msgid "timestamp" msgstr "мітка часу" -#: sql_help.c:942 sql_help.c:946 sql_help.c:949 sql_help.c:952 sql_help.c:1612 -#: sql_help.c:1616 sql_help.c:1619 sql_help.c:1622 sql_help.c:3829 -#: sql_help.c:4209 +#: 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:3892 +#: sql_help.c:4341 msgid "database_name" msgstr "назва_бази_даних" -#: sql_help.c:1057 sql_help.c:2681 +#: sql_help.c:1073 sql_help.c:2732 msgid "increment" msgstr "інкремент" -#: sql_help.c:1058 sql_help.c:2682 +#: sql_help.c:1074 sql_help.c:2733 msgid "minvalue" msgstr "мін_значення" -#: sql_help.c:1059 sql_help.c:2683 +#: sql_help.c:1075 sql_help.c:2734 msgid "maxvalue" msgstr "макс_значення" -#: sql_help.c:1060 sql_help.c:2684 sql_help.c:4426 sql_help.c:4529 -#: sql_help.c:4683 sql_help.c:4852 sql_help.c:4921 +#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 +#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 msgid "start" msgstr "початок" -#: sql_help.c:1061 sql_help.c:1321 +#: sql_help.c:1077 sql_help.c:1347 msgid "restart" msgstr "перезапуск" -#: sql_help.c:1062 sql_help.c:2685 +#: sql_help.c:1078 sql_help.c:2736 msgid "cache" msgstr "кеш" -#: sql_help.c:1106 +#: sql_help.c:1123 msgid "new_target" msgstr "нова_ціль" -#: sql_help.c:1124 sql_help.c:2738 +#: sql_help.c:1142 sql_help.c:2789 msgid "conninfo" msgstr "інформація_підключення" -#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:2739 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 msgid "publication_name" msgstr "назва_публікації" -#: sql_help.c:1127 sql_help.c:1131 sql_help.c:1135 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 msgid "publication_option" msgstr "publication_option" -#: sql_help.c:1138 +#: sql_help.c:1156 msgid "refresh_option" msgstr "опція_оновлення" -#: sql_help.c:1143 sql_help.c:2740 +#: sql_help.c:1161 sql_help.c:2791 msgid "subscription_parameter" msgstr "параметр_підписки" -#: sql_help.c:1298 sql_help.c:1301 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "опція_пропуска" + +#: sql_help.c:1324 sql_help.c:1327 msgid "partition_name" msgstr "ім'я_розділу" -#: sql_help.c:1299 sql_help.c:2301 sql_help.c:2867 +#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 msgid "partition_bound_spec" msgstr "специфікація_рамок_розділу" -#: sql_help.c:1318 sql_help.c:1367 sql_help.c:2881 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 msgid "sequence_options" msgstr "опції_послідовності" -#: sql_help.c:1320 +#: sql_help.c:1346 msgid "sequence_option" msgstr "опція_послідовності" -#: sql_help.c:1334 +#: sql_help.c:1360 msgid "table_constraint_using_index" msgstr "індекс_обмеження_таблиці" -#: sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 sql_help.c:1345 +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 msgid "rewrite_rule_name" msgstr "ім'я_правила_перезапису" -#: sql_help.c:1356 sql_help.c:2313 sql_help.c:2906 +#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 msgid "and partition_bound_spec is:" msgstr "і специфікація_рамок_розділу:" -#: sql_help.c:1357 sql_help.c:1358 sql_help.c:1359 sql_help.c:2314 -#: sql_help.c:2315 sql_help.c:2316 sql_help.c:2907 sql_help.c:2908 -#: sql_help.c:2909 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 +#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 +#: sql_help.c:2964 msgid "partition_bound_expr" msgstr "код_секції" -#: sql_help.c:1360 sql_help.c:1361 sql_help.c:2317 sql_help.c:2318 -#: sql_help.c:2910 sql_help.c:2911 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 +#: sql_help.c:2965 sql_help.c:2966 msgid "numeric_literal" msgstr "числовий_літерал" -#: sql_help.c:1362 +#: sql_help.c:1389 msgid "and column_constraint is:" msgstr "і обмеження_стовпця:" -#: sql_help.c:1365 sql_help.c:2308 sql_help.c:2349 sql_help.c:2557 -#: sql_help.c:2879 +#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 +#: sql_help.c:2934 msgid "default_expr" msgstr "вираз_за_замовчуванням" -#: sql_help.c:1366 sql_help.c:2309 sql_help.c:2880 +#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 msgid "generation_expr" msgstr "код_генерації" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1378 sql_help.c:1380 -#: sql_help.c:1384 sql_help.c:2882 sql_help.c:2883 sql_help.c:2892 -#: sql_help.c:2894 sql_help.c:2898 +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 +#: sql_help.c:2949 sql_help.c:2953 msgid "index_parameters" msgstr "параметри_індексу" -#: sql_help.c:1370 sql_help.c:1387 sql_help.c:2884 sql_help.c:2901 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 msgid "reftable" msgstr "залежна_таблиця" -#: sql_help.c:1371 sql_help.c:1388 sql_help.c:2885 sql_help.c:2902 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 msgid "refcolumn" msgstr "залежний_стовпець" -#: sql_help.c:1372 sql_help.c:1373 sql_help.c:1389 sql_help.c:1390 -#: sql_help.c:2886 sql_help.c:2887 sql_help.c:2903 sql_help.c:2904 +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 msgid "referential_action" msgstr "дія_посилання" -#: sql_help.c:1374 sql_help.c:2310 sql_help.c:2888 +#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 msgid "and table_constraint is:" msgstr "і обмеження_таблиці:" -#: sql_help.c:1382 sql_help.c:2896 +#: sql_help.c:1409 sql_help.c:2951 msgid "exclude_element" msgstr "об'єкт_виключення" -#: sql_help.c:1383 sql_help.c:2897 sql_help.c:4424 sql_help.c:4527 -#: sql_help.c:4681 sql_help.c:4850 sql_help.c:4919 +#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 +#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 msgid "operator" msgstr "оператор" -#: sql_help.c:1385 sql_help.c:2428 sql_help.c:2899 +#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 msgid "predicate" msgstr "предикат" -#: sql_help.c:1391 +#: sql_help.c:1418 msgid "and table_constraint_using_index is:" msgstr "і індекс_обмеження_таблиці:" -#: sql_help.c:1394 sql_help.c:2912 +#: sql_help.c:1421 sql_help.c:2967 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметри_індексу в обмеженнях UNIQUE, PRIMARY KEY, EXCLUDE:" -#: sql_help.c:1399 sql_help.c:2917 +#: sql_help.c:1426 sql_help.c:2972 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "елемент_виключення в обмеженні EXCLUDE:" -#: sql_help.c:1402 sql_help.c:2421 sql_help.c:2844 sql_help.c:2857 -#: sql_help.c:2871 sql_help.c:2920 sql_help.c:3925 +#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 +#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 msgid "opclass" msgstr "клас_оператора" -#: sql_help.c:1418 sql_help.c:1421 sql_help.c:2955 +#: sql_help.c:1430 sql_help.c:2976 +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:3013 msgid "tablespace_option" msgstr "опція_табличного_простору" -#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1451 sql_help.c:1455 +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 msgid "token_type" msgstr "тип_токену" -#: sql_help.c:1443 sql_help.c:1446 +#: sql_help.c:1473 sql_help.c:1476 msgid "dictionary_name" msgstr "ім'я_словника" -#: sql_help.c:1448 sql_help.c:1452 +#: sql_help.c:1478 sql_help.c:1482 msgid "old_dictionary" msgstr "старий_словник" -#: sql_help.c:1449 sql_help.c:1453 +#: sql_help.c:1479 sql_help.c:1483 msgid "new_dictionary" msgstr "новий_словник" -#: sql_help.c:1548 sql_help.c:1562 sql_help.c:1565 sql_help.c:1566 -#: sql_help.c:3108 +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3166 msgid "attribute_name" msgstr "ім'я_атрибута" -#: sql_help.c:1549 +#: sql_help.c:1579 msgid "new_attribute_name" msgstr "нове_ім'я_атрибута" -#: sql_help.c:1553 sql_help.c:1557 +#: sql_help.c:1583 sql_help.c:1587 msgid "new_enum_value" msgstr "нове_значення_перерахування" -#: sql_help.c:1554 +#: sql_help.c:1584 msgid "neighbor_enum_value" msgstr "сусіднє_значення_перерахування" -#: sql_help.c:1556 +#: sql_help.c:1586 msgid "existing_enum_value" msgstr "існуюче_значення_перерахування" -#: sql_help.c:1559 +#: sql_help.c:1589 msgid "property" msgstr "властивість" -#: sql_help.c:1635 sql_help.c:2293 sql_help.c:2302 sql_help.c:2697 -#: sql_help.c:3188 sql_help.c:3639 sql_help.c:3838 sql_help.c:3881 -#: sql_help.c:4218 +#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 +#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 +#: sql_help.c:4350 msgid "server_name" msgstr "назва_серверу" -#: sql_help.c:1667 sql_help.c:1670 sql_help.c:3203 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 msgid "view_option_name" msgstr "ім'я_параметра_представлення" -#: sql_help.c:1668 sql_help.c:3204 +#: sql_help.c:1698 sql_help.c:3262 msgid "view_option_value" msgstr "значення_параметра_представлення" -#: sql_help.c:1689 sql_help.c:1690 sql_help.c:4822 sql_help.c:4823 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 msgid "table_and_columns" msgstr "таблиця_і_стовпці" -#: sql_help.c:1691 sql_help.c:1754 sql_help.c:1945 sql_help.c:3687 -#: sql_help.c:4060 sql_help.c:4824 +#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 +#: sql_help.c:4185 sql_help.c:4959 msgid "where option can be one of:" msgstr "де параметр може бути одним із:" -#: sql_help.c:1692 sql_help.c:1693 sql_help.c:1755 sql_help.c:1947 -#: sql_help.c:1950 sql_help.c:2129 sql_help.c:3688 sql_help.c:3689 -#: sql_help.c:3690 sql_help.c:3691 sql_help.c:3692 sql_help.c:3693 -#: sql_help.c:3694 sql_help.c:3695 sql_help.c:4061 sql_help.c:4063 -#: sql_help.c:4825 sql_help.c:4826 sql_help.c:4827 sql_help.c:4828 -#: sql_help.c:4829 sql_help.c:4830 sql_help.c:4831 sql_help.c:4832 +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 +#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 +#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 +#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 msgid "boolean" msgstr "логічний" -#: sql_help.c:1694 sql_help.c:4834 +#: sql_help.c:1724 sql_help.c:4969 msgid "and table_and_columns is:" msgstr "і таблиця_і_стовпці:" -#: sql_help.c:1710 sql_help.c:4588 sql_help.c:4590 sql_help.c:4614 +#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 msgid "transaction_mode" msgstr "режим_транзакції" -#: sql_help.c:1711 sql_help.c:4591 sql_help.c:4615 +#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 msgid "where transaction_mode is one of:" msgstr "де режим_транзакції один з:" -#: sql_help.c:1720 sql_help.c:4434 sql_help.c:4443 sql_help.c:4447 -#: sql_help.c:4451 sql_help.c:4454 sql_help.c:4691 sql_help.c:4700 -#: sql_help.c:4704 sql_help.c:4708 sql_help.c:4711 sql_help.c:4929 -#: sql_help.c:4938 sql_help.c:4942 sql_help.c:4946 sql_help.c:4949 +#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 +#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 +#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 msgid "argument" msgstr "аргумент" -#: sql_help.c:1820 +#: sql_help.c:1850 msgid "relation_name" msgstr "назва_відношення" -#: sql_help.c:1825 sql_help.c:3832 sql_help.c:4212 +#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 msgid "domain_name" msgstr "назва_домену" -#: sql_help.c:1847 +#: sql_help.c:1877 msgid "policy_name" msgstr "назва_політики" -#: sql_help.c:1860 +#: sql_help.c:1890 msgid "rule_name" msgstr "назва_правила" -#: sql_help.c:1879 sql_help.c:4348 +#: sql_help.c:1909 sql_help.c:4483 msgid "string_literal" msgstr "рядковий_літерал" -#: sql_help.c:1904 sql_help.c:4025 sql_help.c:4262 +#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 msgid "transaction_id" msgstr "ідентифікатор_транзакції" -#: sql_help.c:1935 sql_help.c:1942 sql_help.c:3951 +#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 msgid "filename" msgstr "ім'я файлу" -#: sql_help.c:1936 sql_help.c:1943 sql_help.c:2636 sql_help.c:2637 -#: sql_help.c:2638 +#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 +#: sql_help.c:2689 msgid "command" msgstr "команда" -#: sql_help.c:1938 sql_help.c:2635 sql_help.c:3058 sql_help.c:3239 -#: sql_help.c:3935 sql_help.c:4417 sql_help.c:4419 sql_help.c:4520 -#: sql_help.c:4522 sql_help.c:4674 sql_help.c:4676 sql_help.c:4792 -#: sql_help.c:4912 sql_help.c:4914 +#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 +#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 +#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 +#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 msgid "condition" msgstr "умова" -#: sql_help.c:1941 sql_help.c:2462 sql_help.c:2941 sql_help.c:3205 -#: sql_help.c:3223 sql_help.c:3916 +#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 +#: sql_help.c:3281 sql_help.c:3982 msgid "query" msgstr "запит" -#: sql_help.c:1946 +#: sql_help.c:1976 msgid "format_name" msgstr "назва_формату" -#: sql_help.c:1948 +#: sql_help.c:1978 msgid "delimiter_character" msgstr "символ_роздільник" -#: sql_help.c:1949 +#: sql_help.c:1979 msgid "null_string" msgstr "представлення_NULL" -#: sql_help.c:1951 +#: sql_help.c:1981 msgid "quote_character" msgstr "символ_лапок" -#: sql_help.c:1952 +#: sql_help.c:1982 msgid "escape_character" msgstr "символ_екранування" -#: sql_help.c:1956 +#: sql_help.c:1986 msgid "encoding_name" msgstr "ім'я_кодування" -#: sql_help.c:1967 +#: sql_help.c:1997 msgid "access_method_type" msgstr "тип_метода_доступа" -#: sql_help.c:2038 sql_help.c:2057 sql_help.c:2060 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 msgid "arg_data_type" msgstr "тип_даних_аргумента" -#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069 +#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 msgid "sfunc" msgstr "функція_стану" -#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070 +#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 msgid "state_data_type" msgstr "тип_даних_стану" -#: sql_help.c:2041 sql_help.c:2063 sql_help.c:2071 +#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 msgid "state_data_size" msgstr "розмір_даних_стану" -#: sql_help.c:2042 sql_help.c:2064 sql_help.c:2072 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "ffunc" msgstr "функція_завершення" -#: sql_help.c:2043 sql_help.c:2073 +#: sql_help.c:2073 sql_help.c:2103 msgid "combinefunc" msgstr "комбінуюча_функція" -#: sql_help.c:2044 sql_help.c:2074 +#: sql_help.c:2074 sql_help.c:2104 msgid "serialfunc" msgstr "функція_серіалізації" -#: sql_help.c:2045 sql_help.c:2075 +#: sql_help.c:2075 sql_help.c:2105 msgid "deserialfunc" msgstr "функція_десеріалізації" -#: sql_help.c:2046 sql_help.c:2065 sql_help.c:2076 +#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 msgid "initial_condition" msgstr "початкова_умова" -#: sql_help.c:2047 sql_help.c:2077 +#: sql_help.c:2077 sql_help.c:2107 msgid "msfunc" msgstr "функція_стану_рух" -#: sql_help.c:2048 sql_help.c:2078 +#: sql_help.c:2078 sql_help.c:2108 msgid "minvfunc" msgstr "зворотна_функція_рух" -#: sql_help.c:2049 sql_help.c:2079 +#: sql_help.c:2079 sql_help.c:2109 msgid "mstate_data_type" msgstr "тип_даних_стану_рух" -#: sql_help.c:2050 sql_help.c:2080 +#: sql_help.c:2080 sql_help.c:2110 msgid "mstate_data_size" msgstr "розмір_даних_стану_рух" -#: sql_help.c:2051 sql_help.c:2081 +#: sql_help.c:2081 sql_help.c:2111 msgid "mffunc" msgstr "функція_завершення_рух" -#: sql_help.c:2052 sql_help.c:2082 +#: sql_help.c:2082 sql_help.c:2112 msgid "minitial_condition" msgstr "початкова_умова_рух" -#: sql_help.c:2053 sql_help.c:2083 +#: sql_help.c:2083 sql_help.c:2113 msgid "sort_operator" msgstr "оператор_сортування" -#: sql_help.c:2066 +#: sql_help.c:2096 msgid "or the old syntax" msgstr "або старий синтаксис" -#: sql_help.c:2068 +#: sql_help.c:2098 msgid "base_type" msgstr "базовий_тип" -#: sql_help.c:2125 sql_help.c:2166 +#: sql_help.c:2155 sql_help.c:2202 msgid "locale" msgstr "локаль" -#: sql_help.c:2126 sql_help.c:2167 +#: sql_help.c:2156 sql_help.c:2203 msgid "lc_collate" msgstr "код_правила_сортування" -#: sql_help.c:2127 sql_help.c:2168 +#: sql_help.c:2157 sql_help.c:2204 msgid "lc_ctype" msgstr "код_класифікації_символів" -#: sql_help.c:2128 sql_help.c:4315 +#: sql_help.c:2158 sql_help.c:4450 msgid "provider" msgstr "постачальник" -#: sql_help.c:2130 sql_help.c:2223 +#: sql_help.c:2160 sql_help.c:2263 msgid "version" msgstr "версія" -#: sql_help.c:2132 +#: sql_help.c:2162 msgid "existing_collation" msgstr "існуюче_правило_сортування" -#: sql_help.c:2142 +#: sql_help.c:2172 msgid "source_encoding" msgstr "початкове_кодування" -#: sql_help.c:2143 +#: sql_help.c:2173 msgid "dest_encoding" msgstr "цільве_кодування" -#: sql_help.c:2164 sql_help.c:2981 +#: sql_help.c:2199 sql_help.c:3039 msgid "template" msgstr "шаблон" -#: sql_help.c:2165 +#: sql_help.c:2200 msgid "encoding" msgstr "кодування" -#: sql_help.c:2192 +#: sql_help.c:2201 +msgid "strategy" +msgstr "стратегія" + +#: sql_help.c:2205 +msgid "icu_locale" +msgstr "icu_locale" + +#: sql_help.c:2206 +msgid "locale_provider" +msgstr "локаль_провайдер" + +#: sql_help.c:2207 +msgid "collation_version" +msgstr "версія_сортування" + +#: sql_help.c:2212 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2232 msgid "constraint" msgstr "обмеження" -#: sql_help.c:2193 +#: sql_help.c:2233 msgid "where constraint is:" msgstr "де обмеження:" -#: sql_help.c:2207 sql_help.c:2633 sql_help.c:3054 +#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 msgid "event" msgstr "подія" -#: sql_help.c:2208 +#: sql_help.c:2248 msgid "filter_variable" msgstr "змінна_фільтру" -#: sql_help.c:2209 +#: sql_help.c:2249 msgid "filter_value" msgstr "значення_фільтру" -#: sql_help.c:2305 sql_help.c:2876 +#: sql_help.c:2345 sql_help.c:2931 msgid "where column_constraint is:" msgstr "де обмеження_стовпців:" -#: sql_help.c:2350 +#: sql_help.c:2390 msgid "rettype" msgstr "тип_результату" -#: sql_help.c:2352 +#: sql_help.c:2392 msgid "column_type" msgstr "тип_стовпця" -#: sql_help.c:2361 sql_help.c:2563 +#: sql_help.c:2401 sql_help.c:2604 msgid "definition" msgstr "визначення" -#: sql_help.c:2362 sql_help.c:2564 +#: sql_help.c:2402 sql_help.c:2605 msgid "obj_file" msgstr "об'єктний_файл" -#: sql_help.c:2363 sql_help.c:2565 +#: sql_help.c:2403 sql_help.c:2606 msgid "link_symbol" msgstr "символ_експорту" -#: sql_help.c:2364 sql_help.c:2566 +#: sql_help.c:2404 sql_help.c:2607 msgid "sql_body" msgstr "sql_body" -#: sql_help.c:2402 sql_help.c:2618 sql_help.c:3177 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "uid" msgstr "uid" -#: sql_help.c:2417 sql_help.c:2458 sql_help.c:2845 sql_help.c:2858 -#: sql_help.c:2872 sql_help.c:2937 +#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 +#: sql_help.c:2927 sql_help.c:2995 msgid "method" msgstr "метод" -#: sql_help.c:2422 +#: sql_help.c:2463 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2439 +#: sql_help.c:2480 msgid "call_handler" msgstr "обробник_виклику" -#: sql_help.c:2440 +#: sql_help.c:2481 msgid "inline_handler" msgstr "обробник_впровадженого_коду" -#: sql_help.c:2441 +#: sql_help.c:2482 msgid "valfunction" msgstr "функція_перевірки" -#: sql_help.c:2480 +#: sql_help.c:2521 msgid "com_op" msgstr "комут_оператор" -#: sql_help.c:2481 +#: sql_help.c:2522 msgid "neg_op" msgstr "зворотній_оператор" -#: sql_help.c:2499 +#: sql_help.c:2540 msgid "family_name" msgstr "назва_сімейства" -#: sql_help.c:2510 +#: sql_help.c:2551 msgid "storage_type" msgstr "тип_зберігання" -#: sql_help.c:2639 sql_help.c:3061 +#: sql_help.c:2690 sql_help.c:3119 msgid "where event can be one of:" msgstr "де подія може бути однією з:" -#: sql_help.c:2659 sql_help.c:2661 +#: sql_help.c:2710 sql_help.c:2712 msgid "schema_element" msgstr "елемент_схеми" -#: sql_help.c:2698 +#: sql_help.c:2749 msgid "server_type" msgstr "тип_серверу" -#: sql_help.c:2699 +#: sql_help.c:2750 msgid "server_version" msgstr "версія_серверу" -#: sql_help.c:2700 sql_help.c:3835 sql_help.c:4215 +#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 msgid "fdw_name" msgstr "назва_fdw" -#: sql_help.c:2717 sql_help.c:2720 +#: sql_help.c:2768 sql_help.c:2771 msgid "statistics_name" msgstr "назва_статистики" -#: sql_help.c:2721 +#: sql_help.c:2772 msgid "statistics_kind" msgstr "вид_статистики" -#: sql_help.c:2737 +#: sql_help.c:2788 msgid "subscription_name" msgstr "назва_підписки" -#: sql_help.c:2838 +#: sql_help.c:2893 msgid "source_table" msgstr "вихідна_таблиця" -#: sql_help.c:2839 +#: sql_help.c:2894 msgid "like_option" msgstr "параметр_породження" -#: sql_help.c:2905 +#: sql_help.c:2960 msgid "and like_option is:" msgstr "і параметр_породження:" -#: sql_help.c:2954 +#: sql_help.c:3012 msgid "directory" msgstr "каталог" -#: sql_help.c:2968 +#: sql_help.c:3026 msgid "parser_name" msgstr "назва_парсера" -#: sql_help.c:2969 +#: sql_help.c:3027 msgid "source_config" msgstr "початкова_конфігурація" -#: sql_help.c:2998 +#: sql_help.c:3056 msgid "start_function" msgstr "функція_початку" -#: sql_help.c:2999 +#: sql_help.c:3057 msgid "gettoken_function" msgstr "функція_видачі_токену" -#: sql_help.c:3000 +#: sql_help.c:3058 msgid "end_function" msgstr "функція_завершення" -#: sql_help.c:3001 +#: sql_help.c:3059 msgid "lextypes_function" msgstr "функція_лекс_типів" -#: sql_help.c:3002 +#: sql_help.c:3060 msgid "headline_function" msgstr "функція_створення_заголовків" -#: sql_help.c:3014 +#: sql_help.c:3072 msgid "init_function" msgstr "функція_ініціалізації" -#: sql_help.c:3015 +#: sql_help.c:3073 msgid "lexize_function" msgstr "функція_виділення_лексем" -#: sql_help.c:3028 +#: sql_help.c:3086 msgid "from_sql_function_name" msgstr "ім'я_функції_з_sql" -#: sql_help.c:3030 +#: sql_help.c:3088 msgid "to_sql_function_name" msgstr "ім'я_функції_в_sql" -#: sql_help.c:3056 +#: sql_help.c:3114 msgid "referenced_table_name" msgstr "ім'я_залежної_таблиці" -#: sql_help.c:3057 +#: sql_help.c:3115 msgid "transition_relation_name" msgstr "ім'я_перехідного_відношення" -#: sql_help.c:3060 +#: sql_help.c:3118 msgid "arguments" msgstr "аргументи" -#: sql_help.c:3112 +#: sql_help.c:3170 msgid "label" msgstr "мітка" -#: sql_help.c:3114 +#: sql_help.c:3172 msgid "subtype" msgstr "підтип" -#: sql_help.c:3115 +#: sql_help.c:3173 msgid "subtype_operator_class" msgstr "клас_оператора_підтипу" -#: sql_help.c:3117 +#: sql_help.c:3175 msgid "canonical_function" msgstr "канонічна_функція" -#: sql_help.c:3118 +#: sql_help.c:3176 msgid "subtype_diff_function" msgstr "функція_розбіжностей_підтипу" -#: sql_help.c:3119 +#: sql_help.c:3177 msgid "multirange_type_name" msgstr "multirange_type_name" -#: sql_help.c:3121 +#: sql_help.c:3179 msgid "input_function" msgstr "функція_вводу" -#: sql_help.c:3122 +#: sql_help.c:3180 msgid "output_function" msgstr "функція_виводу" -#: sql_help.c:3123 +#: sql_help.c:3181 msgid "receive_function" msgstr "функція_отримання" -#: sql_help.c:3124 +#: sql_help.c:3182 msgid "send_function" msgstr "функція_відправки" -#: sql_help.c:3125 +#: sql_help.c:3183 msgid "type_modifier_input_function" msgstr "функція_введення_модифікатора_типу" -#: sql_help.c:3126 +#: sql_help.c:3184 msgid "type_modifier_output_function" msgstr "функція_виводу_модифікатора_типу" -#: sql_help.c:3127 +#: sql_help.c:3185 msgid "analyze_function" msgstr "функція_аналізу" -#: sql_help.c:3128 +#: sql_help.c:3186 msgid "subscript_function" msgstr "subscript_function" -#: sql_help.c:3129 +#: sql_help.c:3187 msgid "internallength" msgstr "внутр_довжина" -#: sql_help.c:3130 +#: sql_help.c:3188 msgid "alignment" msgstr "вирівнювання" -#: sql_help.c:3131 +#: sql_help.c:3189 msgid "storage" msgstr "зберігання" -#: sql_help.c:3132 +#: sql_help.c:3190 msgid "like_type" msgstr "тип_зразок" -#: sql_help.c:3133 +#: sql_help.c:3191 msgid "category" msgstr "категорія" -#: sql_help.c:3134 +#: sql_help.c:3192 msgid "preferred" msgstr "привілейований" -#: sql_help.c:3135 +#: sql_help.c:3193 msgid "default" msgstr "за_замовчуванням" -#: sql_help.c:3136 +#: sql_help.c:3194 msgid "element" msgstr "елемент" -#: sql_help.c:3137 +#: sql_help.c:3195 msgid "delimiter" msgstr "роздільник" -#: sql_help.c:3138 +#: sql_help.c:3196 msgid "collatable" msgstr "сортувальний" -#: sql_help.c:3235 sql_help.c:3911 sql_help.c:4412 sql_help.c:4514 -#: sql_help.c:4669 sql_help.c:4782 sql_help.c:4907 +#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 +#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 msgid "with_query" msgstr "with_запит" -#: sql_help.c:3237 sql_help.c:3913 sql_help.c:4431 sql_help.c:4437 -#: sql_help.c:4440 sql_help.c:4444 sql_help.c:4448 sql_help.c:4456 -#: sql_help.c:4688 sql_help.c:4694 sql_help.c:4697 sql_help.c:4701 -#: sql_help.c:4705 sql_help.c:4713 sql_help.c:4784 sql_help.c:4926 -#: sql_help.c:4932 sql_help.c:4935 sql_help.c:4939 sql_help.c:4943 -#: sql_help.c:4951 +#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 +#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 +#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 +#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 +#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 +#: sql_help.c:5086 msgid "alias" msgstr "псевдонім" -#: sql_help.c:3238 sql_help.c:4416 sql_help.c:4458 sql_help.c:4460 -#: sql_help.c:4464 sql_help.c:4466 sql_help.c:4467 sql_help.c:4468 -#: sql_help.c:4519 sql_help.c:4673 sql_help.c:4715 sql_help.c:4717 -#: sql_help.c:4721 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 -#: sql_help.c:4791 sql_help.c:4911 sql_help.c:4953 sql_help.c:4955 -#: sql_help.c:4959 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 +#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 +#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 +#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 +#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 +#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 msgid "from_item" msgstr "джерело_даних" -#: sql_help.c:3240 sql_help.c:3721 sql_help.c:3992 sql_help.c:4793 +#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 msgid "cursor_name" msgstr "ім'я_курсору" -#: sql_help.c:3241 sql_help.c:3919 sql_help.c:4794 +#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 msgid "output_expression" msgstr "вираз_результату" -#: sql_help.c:3242 sql_help.c:3920 sql_help.c:4415 sql_help.c:4517 -#: sql_help.c:4672 sql_help.c:4795 sql_help.c:4910 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 +#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 msgid "output_name" msgstr "ім'я_результату" -#: sql_help.c:3258 +#: sql_help.c:3316 msgid "code" msgstr "код" -#: sql_help.c:3663 +#: sql_help.c:3721 msgid "parameter" msgstr "параметр" -#: sql_help.c:3685 sql_help.c:3686 sql_help.c:4017 +#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 msgid "statement" msgstr "оператор" -#: sql_help.c:3720 sql_help.c:3991 +#: sql_help.c:3778 sql_help.c:4116 msgid "direction" msgstr "напрямок" -#: sql_help.c:3722 sql_help.c:3993 +#: sql_help.c:3780 sql_help.c:4118 msgid "where direction can be one of:" msgstr "де напрямок може бути одним із:" -#: sql_help.c:3723 sql_help.c:3724 sql_help.c:3725 sql_help.c:3726 -#: sql_help.c:3727 sql_help.c:3994 sql_help.c:3995 sql_help.c:3996 -#: sql_help.c:3997 sql_help.c:3998 sql_help.c:4425 sql_help.c:4427 -#: sql_help.c:4528 sql_help.c:4530 sql_help.c:4682 sql_help.c:4684 -#: sql_help.c:4851 sql_help.c:4853 sql_help.c:4920 sql_help.c:4922 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 +#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 +#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 +#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 msgid "count" msgstr "кількість" -#: sql_help.c:3825 sql_help.c:4205 +#: sql_help.c:3888 sql_help.c:4337 msgid "sequence_name" msgstr "ім'я_послідовності" -#: sql_help.c:3843 sql_help.c:4223 +#: sql_help.c:3906 sql_help.c:4355 msgid "arg_name" msgstr "ім'я_аргументу" -#: sql_help.c:3844 sql_help.c:4224 +#: sql_help.c:3907 sql_help.c:4356 msgid "arg_type" msgstr "тип_аргументу" -#: sql_help.c:3851 sql_help.c:4231 +#: sql_help.c:3914 sql_help.c:4363 msgid "loid" msgstr "код_вел_об'єкту" -#: sql_help.c:3879 +#: sql_help.c:3945 msgid "remote_schema" msgstr "віддалена_схема" -#: sql_help.c:3882 +#: sql_help.c:3948 msgid "local_schema" msgstr "локальна_схема" -#: sql_help.c:3917 +#: sql_help.c:3983 msgid "conflict_target" msgstr "ціль_конфлікту" -#: sql_help.c:3918 +#: sql_help.c:3984 msgid "conflict_action" msgstr "дія_при_конфлікті" -#: sql_help.c:3921 +#: sql_help.c:3987 msgid "where conflict_target can be one of:" msgstr "де ціль_конфлікту може бути одним з:" -#: sql_help.c:3922 +#: sql_help.c:3988 msgid "index_column_name" msgstr "ім'я_стовпця_індексу" -#: sql_help.c:3923 +#: sql_help.c:3989 msgid "index_expression" msgstr "вираз_індексу" -#: sql_help.c:3926 +#: sql_help.c:3992 msgid "index_predicate" msgstr "предикат_індексу" -#: sql_help.c:3928 +#: sql_help.c:3994 msgid "and conflict_action is one of:" msgstr "і дія_при_конфлікті одна з:" -#: sql_help.c:3934 sql_help.c:4790 +#: sql_help.c:4000 sql_help.c:4925 msgid "sub-SELECT" msgstr "вкладений-SELECT" -#: sql_help.c:3943 sql_help.c:4006 sql_help.c:4766 +#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 msgid "channel" msgstr "канал" -#: sql_help.c:3965 +#: sql_help.c:4031 msgid "lockmode" msgstr "режим_блокування" -#: sql_help.c:3966 +#: sql_help.c:4032 msgid "where lockmode is one of:" msgstr "де режим_блокування один з:" -#: sql_help.c:4007 +#: sql_help.c:4068 +msgid "target_table_name" +msgstr "ім'я_цілі_таблиці" + +#: sql_help.c:4069 +msgid "target_alias" +msgstr "псевдонім_цілі" + +#: sql_help.c:4070 +msgid "data_source" +msgstr "джерело_даних" + +#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +msgid "join_condition" +msgstr "умова_поєднання" + +#: sql_help.c:4072 +msgid "when_clause" +msgstr "when_твердження" + +#: sql_help.c:4073 +msgid "where data_source is:" +msgstr "де джерело_даних:" + +#: sql_help.c:4074 +msgid "source_table_name" +msgstr "ім'я_початкова_таблиці" + +#: sql_help.c:4075 +msgid "source_query" +msgstr "джерело_запит" + +#: sql_help.c:4076 +msgid "source_alias" +msgstr "джерело_псевдоніма" + +#: sql_help.c:4077 +msgid "and when_clause is:" +msgstr "і when_clause:" + +#: sql_help.c:4079 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4080 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4082 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4083 +msgid "and merge_insert is:" +msgstr "і merge_insert:" + +#: sql_help.c:4086 +msgid "and merge_update is:" +msgstr "і merge_update:" + +#: sql_help.c:4091 +msgid "and merge_delete is:" +msgstr "і merge_delete:" + +#: sql_help.c:4132 msgid "payload" msgstr "зміст" -#: sql_help.c:4034 +#: sql_help.c:4159 msgid "old_role" msgstr "стара_роль" -#: sql_help.c:4035 +#: sql_help.c:4160 msgid "new_role" msgstr "нова_роль" -#: sql_help.c:4071 sql_help.c:4270 sql_help.c:4278 +#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 msgid "savepoint_name" msgstr "ім'я_точки_збереження" -#: sql_help.c:4418 sql_help.c:4476 sql_help.c:4675 sql_help.c:4733 -#: sql_help.c:4913 sql_help.c:4971 +#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 +#: sql_help.c:5048 sql_help.c:5106 msgid "grouping_element" msgstr "елемент_групування" -#: sql_help.c:4420 sql_help.c:4523 sql_help.c:4677 sql_help.c:4915 +#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 msgid "window_name" msgstr "назва_вікна" -#: sql_help.c:4421 sql_help.c:4524 sql_help.c:4678 sql_help.c:4916 +#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 msgid "window_definition" msgstr "визначення_вікна" -#: sql_help.c:4422 sql_help.c:4436 sql_help.c:4480 sql_help.c:4525 -#: sql_help.c:4679 sql_help.c:4693 sql_help.c:4737 sql_help.c:4917 -#: sql_help.c:4931 sql_help.c:4975 +#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 +#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 +#: sql_help.c:5066 sql_help.c:5110 msgid "select" msgstr "виберіть" -#: sql_help.c:4429 sql_help.c:4686 sql_help.c:4924 +#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 msgid "where from_item can be one of:" msgstr "де джерело_даних може бути одним з:" -#: sql_help.c:4432 sql_help.c:4438 sql_help.c:4441 sql_help.c:4445 -#: sql_help.c:4457 sql_help.c:4689 sql_help.c:4695 sql_help.c:4698 -#: sql_help.c:4702 sql_help.c:4714 sql_help.c:4927 sql_help.c:4933 -#: sql_help.c:4936 sql_help.c:4940 sql_help.c:4952 +#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 +#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 +#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 +#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 msgid "column_alias" msgstr "псевдонім_стовпця" -#: sql_help.c:4433 sql_help.c:4690 sql_help.c:4928 +#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 msgid "sampling_method" msgstr "метод_вибірки" -#: sql_help.c:4435 sql_help.c:4692 sql_help.c:4930 +#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 msgid "seed" msgstr "початкове_число" -#: sql_help.c:4439 sql_help.c:4478 sql_help.c:4696 sql_help.c:4735 -#: sql_help.c:4934 sql_help.c:4973 +#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 +#: sql_help.c:5069 sql_help.c:5108 msgid "with_query_name" msgstr "ім'я_запиту_WITH" -#: sql_help.c:4449 sql_help.c:4452 sql_help.c:4455 sql_help.c:4706 -#: sql_help.c:4709 sql_help.c:4712 sql_help.c:4944 sql_help.c:4947 -#: sql_help.c:4950 +#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 +#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 +#: sql_help.c:5085 msgid "column_definition" msgstr "визначення_стовпця" -#: sql_help.c:4459 sql_help.c:4465 sql_help.c:4716 sql_help.c:4722 -#: sql_help.c:4954 sql_help.c:4960 +#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 +#: sql_help.c:5089 sql_help.c:5095 msgid "join_type" msgstr "тип_поєднання" -#: sql_help.c:4461 sql_help.c:4718 sql_help.c:4956 -msgid "join_condition" -msgstr "умова_поєднання" - -#: sql_help.c:4462 sql_help.c:4719 sql_help.c:4957 +#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 msgid "join_column" msgstr "стовпець_поєднання" -#: sql_help.c:4463 sql_help.c:4720 sql_help.c:4958 +#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4469 sql_help.c:4726 sql_help.c:4964 +#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 msgid "and grouping_element can be one of:" msgstr "і елемент_групування може бути одним з:" -#: sql_help.c:4477 sql_help.c:4734 sql_help.c:4972 +#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 msgid "and with_query is:" msgstr "і запит_WITH:" -#: sql_help.c:4481 sql_help.c:4738 sql_help.c:4976 +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 msgid "values" msgstr "значення" -#: sql_help.c:4482 sql_help.c:4739 sql_help.c:4977 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 msgid "insert" msgstr "вставка" -#: sql_help.c:4483 sql_help.c:4740 sql_help.c:4978 +#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 msgid "update" msgstr "оновлення" -#: sql_help.c:4484 sql_help.c:4741 sql_help.c:4979 +#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 msgid "delete" msgstr "видалення" -#: sql_help.c:4486 sql_help.c:4743 sql_help.c:4981 +#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 msgid "search_seq_col_name" msgstr "search_seq_col_name" -#: sql_help.c:4488 sql_help.c:4745 sql_help.c:4983 +#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 msgid "cycle_mark_col_name" msgstr "cycle_mark_col_name" -#: sql_help.c:4489 sql_help.c:4746 sql_help.c:4984 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 msgid "cycle_mark_value" msgstr "cycle_mark_value" -#: sql_help.c:4490 sql_help.c:4747 sql_help.c:4985 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 msgid "cycle_mark_default" msgstr "cycle_mark_default" -#: sql_help.c:4491 sql_help.c:4748 sql_help.c:4986 +#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 msgid "cycle_path_col_name" msgstr "cycle_path_col_name" -#: sql_help.c:4518 +#: sql_help.c:4653 msgid "new_table" msgstr "нова_таблиця" -#: sql_help.c:4589 +#: sql_help.c:4724 msgid "snapshot_id" msgstr "код_знімку" -#: sql_help.c:4849 +#: sql_help.c:4984 msgid "sort_expression" msgstr "вираз_сортування" -#: sql_help.c:4993 sql_help.c:5971 +#: sql_help.c:5128 sql_help.c:6112 msgid "abort the current transaction" msgstr "перервати поточну транзакцію" -#: sql_help.c:4999 +#: sql_help.c:5134 msgid "change the definition of an aggregate function" msgstr "змінити визначення агрегатної функції" -#: sql_help.c:5005 +#: sql_help.c:5140 msgid "change the definition of a collation" msgstr "змінити визначення правила сортування" -#: sql_help.c:5011 +#: sql_help.c:5146 msgid "change the definition of a conversion" msgstr "змінити визначення перетворення" -#: sql_help.c:5017 +#: sql_help.c:5152 msgid "change a database" msgstr "змінити базу даних" -#: sql_help.c:5023 +#: sql_help.c:5158 msgid "define default access privileges" msgstr "визначити права доступу за замовчуванням" -#: sql_help.c:5029 +#: sql_help.c:5164 msgid "change the definition of a domain" msgstr "змінити визначення домену" -#: sql_help.c:5035 +#: sql_help.c:5170 msgid "change the definition of an event trigger" msgstr "змінити визначення тригеру події" -#: sql_help.c:5041 +#: sql_help.c:5176 msgid "change the definition of an extension" msgstr "змінити визначення розширення" -#: sql_help.c:5047 +#: sql_help.c:5182 msgid "change the definition of a foreign-data wrapper" msgstr "змінити визначення джерела сторонніх даних" -#: sql_help.c:5053 +#: sql_help.c:5188 msgid "change the definition of a foreign table" msgstr "змінити визначення сторонньої таблиці" -#: sql_help.c:5059 +#: sql_help.c:5194 msgid "change the definition of a function" msgstr "змінити визначення функції" -#: sql_help.c:5065 +#: sql_help.c:5200 msgid "change role name or membership" msgstr "змінити назву ролі або членства" -#: sql_help.c:5071 +#: sql_help.c:5206 msgid "change the definition of an index" msgstr "змінити визначення індексу" -#: sql_help.c:5077 +#: sql_help.c:5212 msgid "change the definition of a procedural language" msgstr "змінити визначення процедурної мови" -#: sql_help.c:5083 +#: sql_help.c:5218 msgid "change the definition of a large object" msgstr "змінити визначення великого об'єкту" -#: sql_help.c:5089 +#: sql_help.c:5224 msgid "change the definition of a materialized view" msgstr "змінити визначення матеріалізованого подання" -#: sql_help.c:5095 +#: sql_help.c:5230 msgid "change the definition of an operator" msgstr "змінити визначення оператора" -#: sql_help.c:5101 +#: sql_help.c:5236 msgid "change the definition of an operator class" msgstr "змінити визначення класа операторів" -#: sql_help.c:5107 +#: sql_help.c:5242 msgid "change the definition of an operator family" msgstr "змінити визначення сімейства операторів" -#: sql_help.c:5113 +#: sql_help.c:5248 msgid "change the definition of a row-level security policy" msgstr "змінити визначення політики безпеки на рівні рядків" -#: sql_help.c:5119 +#: sql_help.c:5254 msgid "change the definition of a procedure" msgstr "змінити визначення процедури" -#: sql_help.c:5125 +#: sql_help.c:5260 msgid "change the definition of a publication" msgstr "змінити визначення публікації" -#: sql_help.c:5131 sql_help.c:5233 +#: sql_help.c:5266 sql_help.c:5368 msgid "change a database role" msgstr "змінити роль бази даних" -#: sql_help.c:5137 +#: sql_help.c:5272 msgid "change the definition of a routine" msgstr "змінити визначення підпрограми" -#: sql_help.c:5143 +#: sql_help.c:5278 msgid "change the definition of a rule" msgstr "змінити визначення правила" -#: sql_help.c:5149 +#: sql_help.c:5284 msgid "change the definition of a schema" msgstr "змінити визначення схеми" -#: sql_help.c:5155 +#: sql_help.c:5290 msgid "change the definition of a sequence generator" msgstr "змінити визначення генератору послідовності" -#: sql_help.c:5161 +#: sql_help.c:5296 msgid "change the definition of a foreign server" msgstr "змінити визначення стороннього серверу" -#: sql_help.c:5167 +#: sql_help.c:5302 msgid "change the definition of an extended statistics object" msgstr "змінити визначення об'єкту розширеної статистики" -#: sql_help.c:5173 +#: sql_help.c:5308 msgid "change the definition of a subscription" msgstr "змінити визначення підписки" -#: sql_help.c:5179 +#: sql_help.c:5314 msgid "change a server configuration parameter" msgstr "змінити параметр конфігурації сервера" -#: sql_help.c:5185 +#: sql_help.c:5320 msgid "change the definition of a table" msgstr "змінити визначення таблиці" -#: sql_help.c:5191 +#: sql_help.c:5326 msgid "change the definition of a tablespace" msgstr "змінити визначення табличного простору" -#: sql_help.c:5197 +#: sql_help.c:5332 msgid "change the definition of a text search configuration" msgstr "змінити визначення конфігурації текстового пошуку" -#: sql_help.c:5203 +#: sql_help.c:5338 msgid "change the definition of a text search dictionary" msgstr "змінити визначення словника текстового пошуку" -#: sql_help.c:5209 +#: sql_help.c:5344 msgid "change the definition of a text search parser" msgstr "змінити визначення парсера текстового пошуку" -#: sql_help.c:5215 +#: sql_help.c:5350 msgid "change the definition of a text search template" msgstr "змінити визначення шаблона текстового пошуку" -#: sql_help.c:5221 +#: sql_help.c:5356 msgid "change the definition of a trigger" msgstr "змінити визначення тригеру" -#: sql_help.c:5227 +#: sql_help.c:5362 msgid "change the definition of a type" msgstr "змінити визначення типу" -#: sql_help.c:5239 +#: sql_help.c:5374 msgid "change the definition of a user mapping" msgstr "змінити визначення зіставлень користувачів" -#: sql_help.c:5245 +#: sql_help.c:5380 msgid "change the definition of a view" msgstr "змінити визначення подання" -#: sql_help.c:5251 +#: sql_help.c:5386 msgid "collect statistics about a database" msgstr "зібрати статистику про базу даних" -#: sql_help.c:5257 sql_help.c:6049 +#: sql_help.c:5392 sql_help.c:6190 msgid "start a transaction block" msgstr "розпочати транзакцію" -#: sql_help.c:5263 +#: sql_help.c:5398 msgid "invoke a procedure" msgstr "викликати процедуру" -#: sql_help.c:5269 +#: sql_help.c:5404 msgid "force a write-ahead log checkpoint" msgstr "провести контрольну точку в журналі попереднього запису" -#: sql_help.c:5275 +#: sql_help.c:5410 msgid "close a cursor" msgstr "закрити курсор" -#: sql_help.c:5281 +#: sql_help.c:5416 msgid "cluster a table according to an index" msgstr "перегрупувати таблицю за індексом" -#: sql_help.c:5287 +#: sql_help.c:5422 msgid "define or change the comment of an object" msgstr "задати або змінити коментар об'єкта" -#: sql_help.c:5293 sql_help.c:5851 +#: sql_help.c:5428 sql_help.c:5986 msgid "commit the current transaction" msgstr "затвердити поточну транзакцію" -#: sql_help.c:5299 +#: sql_help.c:5434 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:5305 +#: sql_help.c:5440 msgid "copy data between a file and a table" msgstr "копіювати дані між файлом та таблицею" -#: sql_help.c:5311 +#: sql_help.c:5446 msgid "define a new access method" msgstr "визначити новий метод доступу" -#: sql_help.c:5317 +#: sql_help.c:5452 msgid "define a new aggregate function" msgstr "визначити нову агрегатну функцію" -#: sql_help.c:5323 +#: sql_help.c:5458 msgid "define a new cast" msgstr "визначити приведення типів" -#: sql_help.c:5329 +#: sql_help.c:5464 msgid "define a new collation" msgstr "визначити нове правило сортування" -#: sql_help.c:5335 +#: sql_help.c:5470 msgid "define a new encoding conversion" msgstr "визначити нове перетворення кодування" -#: sql_help.c:5341 +#: sql_help.c:5476 msgid "create a new database" msgstr "створити нову базу даних" -#: sql_help.c:5347 +#: sql_help.c:5482 msgid "define a new domain" msgstr "визначити новий домен" -#: sql_help.c:5353 +#: sql_help.c:5488 msgid "define a new event trigger" msgstr "визначити новий тригер події" -#: sql_help.c:5359 +#: sql_help.c:5494 msgid "install an extension" msgstr "встановити розширення" -#: sql_help.c:5365 +#: sql_help.c:5500 msgid "define a new foreign-data wrapper" msgstr "визначити нове джерело сторонніх даних" -#: sql_help.c:5371 +#: sql_help.c:5506 msgid "define a new foreign table" msgstr "визначити нову сторонню таблицю" -#: sql_help.c:5377 +#: sql_help.c:5512 msgid "define a new function" msgstr "визначити нову функцію" -#: sql_help.c:5383 sql_help.c:5443 sql_help.c:5545 +#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 msgid "define a new database role" msgstr "визначити нову роль бази даних" -#: sql_help.c:5389 +#: sql_help.c:5524 msgid "define a new index" msgstr "визначити новий індекс" -#: sql_help.c:5395 +#: sql_help.c:5530 msgid "define a new procedural language" msgstr "визначити нову процедурну мову" -#: sql_help.c:5401 +#: sql_help.c:5536 msgid "define a new materialized view" msgstr "визначити нове матеріалізоване подання" -#: sql_help.c:5407 +#: sql_help.c:5542 msgid "define a new operator" msgstr "визначити новий оператор" -#: sql_help.c:5413 +#: sql_help.c:5548 msgid "define a new operator class" msgstr "визначити новий клас оператора" -#: sql_help.c:5419 +#: sql_help.c:5554 msgid "define a new operator family" msgstr "визначити нове сімейство операторів" -#: sql_help.c:5425 +#: sql_help.c:5560 msgid "define a new row-level security policy for a table" msgstr "визначити нову політику безпеки на рівні рядків для таблиці" -#: sql_help.c:5431 +#: sql_help.c:5566 msgid "define a new procedure" msgstr "визначити нову процедуру" -#: sql_help.c:5437 +#: sql_help.c:5572 msgid "define a new publication" msgstr "визначити нову публікацію" -#: sql_help.c:5449 +#: sql_help.c:5584 msgid "define a new rewrite rule" msgstr "визначити нове правило перезапису" -#: sql_help.c:5455 +#: sql_help.c:5590 msgid "define a new schema" msgstr "визначити нову схему" -#: sql_help.c:5461 +#: sql_help.c:5596 msgid "define a new sequence generator" msgstr "визначити новий генератор послідовностей" -#: sql_help.c:5467 +#: sql_help.c:5602 msgid "define a new foreign server" msgstr "визначити новий сторонній сервер" -#: sql_help.c:5473 +#: sql_help.c:5608 msgid "define extended statistics" msgstr "визначити розширену статистику" -#: sql_help.c:5479 +#: sql_help.c:5614 msgid "define a new subscription" msgstr "визначити нову підписку" -#: sql_help.c:5485 +#: sql_help.c:5620 msgid "define a new table" msgstr "визначити нову таблицю" -#: sql_help.c:5491 sql_help.c:6007 +#: sql_help.c:5626 sql_help.c:6148 msgid "define a new table from the results of a query" msgstr "визначити нову таблицю з результатів запиту" -#: sql_help.c:5497 +#: sql_help.c:5632 msgid "define a new tablespace" msgstr "визначити новий табличний простір" -#: sql_help.c:5503 +#: sql_help.c:5638 msgid "define a new text search configuration" msgstr "визначити нову конфігурацію текстового пошуку" -#: sql_help.c:5509 +#: sql_help.c:5644 msgid "define a new text search dictionary" msgstr "визначити новий словник текстового пошуку" -#: sql_help.c:5515 +#: sql_help.c:5650 msgid "define a new text search parser" msgstr "визначити новий аналізатор текстового пошуку" -#: sql_help.c:5521 +#: sql_help.c:5656 msgid "define a new text search template" msgstr "визначити новий шаблон текстового пошуку" -#: sql_help.c:5527 +#: sql_help.c:5662 msgid "define a new transform" msgstr "визначити нове перетворення" -#: sql_help.c:5533 +#: sql_help.c:5668 msgid "define a new trigger" msgstr "визначити новий тригер" -#: sql_help.c:5539 +#: sql_help.c:5674 msgid "define a new data type" msgstr "визначити новий тип даних" -#: sql_help.c:5551 +#: sql_help.c:5686 msgid "define a new mapping of a user to a foreign server" msgstr "визначити нове зіставлення користувача для стороннього сервера" -#: sql_help.c:5557 +#: sql_help.c:5692 msgid "define a new view" msgstr "визначити нове подання" -#: sql_help.c:5563 +#: sql_help.c:5698 msgid "deallocate a prepared statement" msgstr "звільнити підготовлену команду" -#: sql_help.c:5569 +#: sql_help.c:5704 msgid "define a cursor" msgstr "визначити курсор" -#: sql_help.c:5575 +#: sql_help.c:5710 msgid "delete rows of a table" msgstr "видалити рядки таблиці" -#: sql_help.c:5581 +#: sql_help.c:5716 msgid "discard session state" msgstr "очистити стан сесії" -#: sql_help.c:5587 +#: sql_help.c:5722 msgid "execute an anonymous code block" msgstr "виконати анонімний блок коду" -#: sql_help.c:5593 +#: sql_help.c:5728 msgid "remove an access method" msgstr "видалити метод доступу" -#: sql_help.c:5599 +#: sql_help.c:5734 msgid "remove an aggregate function" msgstr "видалити агрегатну функцію" -#: sql_help.c:5605 +#: sql_help.c:5740 msgid "remove a cast" msgstr "видалити приведення типів" -#: sql_help.c:5611 +#: sql_help.c:5746 msgid "remove a collation" msgstr "видалити правило сортування" -#: sql_help.c:5617 +#: sql_help.c:5752 msgid "remove a conversion" msgstr "видалити перетворення" -#: sql_help.c:5623 +#: sql_help.c:5758 msgid "remove a database" msgstr "видалити базу даних" -#: sql_help.c:5629 +#: sql_help.c:5764 msgid "remove a domain" msgstr "видалити домен" -#: sql_help.c:5635 +#: sql_help.c:5770 msgid "remove an event trigger" msgstr "видалити тригер події" -#: sql_help.c:5641 +#: sql_help.c:5776 msgid "remove an extension" msgstr "видалити розширення" -#: sql_help.c:5647 +#: sql_help.c:5782 msgid "remove a foreign-data wrapper" msgstr "видалити джерело сторонніх даних" -#: sql_help.c:5653 +#: sql_help.c:5788 msgid "remove a foreign table" msgstr "видалити сторонню таблицю" -#: sql_help.c:5659 +#: sql_help.c:5794 msgid "remove a function" msgstr "видалити функцію" -#: sql_help.c:5665 sql_help.c:5731 sql_help.c:5833 +#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 msgid "remove a database role" msgstr "видалити роль бази даних" -#: sql_help.c:5671 +#: sql_help.c:5806 msgid "remove an index" msgstr "видалити індекс" -#: sql_help.c:5677 +#: sql_help.c:5812 msgid "remove a procedural language" msgstr "видалити процедурну мову" -#: sql_help.c:5683 +#: sql_help.c:5818 msgid "remove a materialized view" msgstr "видалити матеріалізоване подання" -#: sql_help.c:5689 +#: sql_help.c:5824 msgid "remove an operator" msgstr "видалити оператор" -#: sql_help.c:5695 +#: sql_help.c:5830 msgid "remove an operator class" msgstr "видалити клас операторів" -#: sql_help.c:5701 +#: sql_help.c:5836 msgid "remove an operator family" msgstr "видалити сімейство операторів" -#: sql_help.c:5707 +#: sql_help.c:5842 msgid "remove database objects owned by a database role" msgstr "видалити об'єкти бази даних, що належать ролі" -#: sql_help.c:5713 +#: sql_help.c:5848 msgid "remove a row-level security policy from a table" msgstr "видалити політику безпеки на рівні рядків з таблиці" -#: sql_help.c:5719 +#: sql_help.c:5854 msgid "remove a procedure" msgstr "видалити процедуру" -#: sql_help.c:5725 +#: sql_help.c:5860 msgid "remove a publication" msgstr "видалити публікацію" -#: sql_help.c:5737 +#: sql_help.c:5872 msgid "remove a routine" msgstr "видалити підпрограму" -#: sql_help.c:5743 +#: sql_help.c:5878 msgid "remove a rewrite rule" msgstr "видалити правило перезапису" -#: sql_help.c:5749 +#: sql_help.c:5884 msgid "remove a schema" msgstr "видалити схему" -#: sql_help.c:5755 +#: sql_help.c:5890 msgid "remove a sequence" msgstr "видалити послідовність" -#: sql_help.c:5761 +#: sql_help.c:5896 msgid "remove a foreign server descriptor" msgstr "видалити опис стороннього серверу" -#: sql_help.c:5767 +#: sql_help.c:5902 msgid "remove extended statistics" msgstr "видалити розширену статистику" -#: sql_help.c:5773 +#: sql_help.c:5908 msgid "remove a subscription" msgstr "видалити підписку" -#: sql_help.c:5779 +#: sql_help.c:5914 msgid "remove a table" msgstr "видалити таблицю" -#: sql_help.c:5785 +#: sql_help.c:5920 msgid "remove a tablespace" msgstr "видалити табличний простір" -#: sql_help.c:5791 +#: sql_help.c:5926 msgid "remove a text search configuration" msgstr "видалити конфігурацію тектового пошуку" -#: sql_help.c:5797 +#: sql_help.c:5932 msgid "remove a text search dictionary" msgstr "видалити словник тектового пошуку" -#: sql_help.c:5803 +#: sql_help.c:5938 msgid "remove a text search parser" msgstr "видалити парсер тектового пошуку" -#: sql_help.c:5809 +#: sql_help.c:5944 msgid "remove a text search template" msgstr "видалити шаблон тектового пошуку" -#: sql_help.c:5815 +#: sql_help.c:5950 msgid "remove a transform" msgstr "видалити перетворення" -#: sql_help.c:5821 +#: sql_help.c:5956 msgid "remove a trigger" msgstr "видалити тригер" -#: sql_help.c:5827 +#: sql_help.c:5962 msgid "remove a data type" msgstr "видалити тип даних" -#: sql_help.c:5839 +#: sql_help.c:5974 msgid "remove a user mapping for a foreign server" msgstr "видалити зіставлення користувача для стороннього серверу" -#: sql_help.c:5845 +#: sql_help.c:5980 msgid "remove a view" msgstr "видалити подання" -#: sql_help.c:5857 +#: sql_help.c:5992 msgid "execute a prepared statement" msgstr "виконати підготовлену команду" -#: sql_help.c:5863 +#: sql_help.c:5998 msgid "show the execution plan of a statement" msgstr "показати план виконання команди" -#: sql_help.c:5869 +#: sql_help.c:6004 msgid "retrieve rows from a query using a cursor" msgstr "отримати рядки запиту з курсору" -#: sql_help.c:5875 +#: sql_help.c:6010 msgid "define access privileges" msgstr "визначити права доступу" -#: sql_help.c:5881 +#: sql_help.c:6016 msgid "import table definitions from a foreign server" msgstr "імпортувати визначення таблиць зі стороннього серверу" -#: sql_help.c:5887 +#: sql_help.c:6022 msgid "create new rows in a table" msgstr "створити нові рядки в таблиці" -#: sql_help.c:5893 +#: sql_help.c:6028 msgid "listen for a notification" msgstr "очікувати на повідомлення" -#: sql_help.c:5899 +#: sql_help.c:6034 msgid "load a shared library file" msgstr "завантажити файл спільної бібліотеки" -#: sql_help.c:5905 +#: sql_help.c:6040 msgid "lock a table" msgstr "заблокувати таблицю" -#: sql_help.c:5911 +#: sql_help.c:6046 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "умовно вставити, оновити або видалити рядки таблиці" + +#: sql_help.c:6052 msgid "position a cursor" msgstr "розташувати курсор" -#: sql_help.c:5917 +#: sql_help.c:6058 msgid "generate a notification" msgstr "згенерувати повідомлення" -#: sql_help.c:5923 +#: sql_help.c:6064 msgid "prepare a statement for execution" msgstr "підготувати команду для виконання" -#: sql_help.c:5929 +#: sql_help.c:6070 msgid "prepare the current transaction for two-phase commit" msgstr "підготувати поточну транзакцію для двохфазного затвердження" -#: sql_help.c:5935 +#: sql_help.c:6076 msgid "change the ownership of database objects owned by a database role" msgstr "змінити власника об'єктів БД, що належать заданій ролі" -#: sql_help.c:5941 +#: sql_help.c:6082 msgid "replace the contents of a materialized view" msgstr "замінити вміст матеріалізованого подання" -#: sql_help.c:5947 +#: sql_help.c:6088 msgid "rebuild indexes" msgstr "перебудувати індекси" -#: sql_help.c:5953 +#: sql_help.c:6094 msgid "destroy a previously defined savepoint" msgstr "видалити раніше визначену точку збереження" -#: sql_help.c:5959 +#: sql_help.c:6100 msgid "restore the value of a run-time parameter to the default value" msgstr "відновити початкове значення параметру виконання" -#: sql_help.c:5965 +#: sql_help.c:6106 msgid "remove access privileges" msgstr "видалити права доступу" -#: sql_help.c:5977 +#: sql_help.c:6118 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "скасувати транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:5983 +#: sql_help.c:6124 msgid "roll back to a savepoint" msgstr "відкотитися до точки збереження" -#: sql_help.c:5989 +#: sql_help.c:6130 msgid "define a new savepoint within the current transaction" msgstr "визначити нову точку збереження в рамках поточної транзакції" -#: sql_help.c:5995 +#: sql_help.c:6136 msgid "define or change a security label applied to an object" msgstr "визначити або змінити мітку безпеки, застосовану до об'єкта" -#: sql_help.c:6001 sql_help.c:6055 sql_help.c:6091 +#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 msgid "retrieve rows from a table or view" msgstr "отримати рядки з таблиці або подання" -#: sql_help.c:6013 +#: sql_help.c:6154 msgid "change a run-time parameter" msgstr "змінити параметр виконання" -#: sql_help.c:6019 +#: sql_help.c:6160 msgid "set constraint check timing for the current transaction" msgstr "встановити час перевірки обмеження для поточної транзакції" -#: sql_help.c:6025 +#: sql_help.c:6166 msgid "set the current user identifier of the current session" msgstr "встановити ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:6031 +#: sql_help.c:6172 msgid "set the session user identifier and the current user identifier of the current session" msgstr "встановити ідентифікатор користувача сесії й ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:6037 +#: sql_help.c:6178 msgid "set the characteristics of the current transaction" msgstr "встановити характеристики поточної транзакції" -#: sql_help.c:6043 +#: sql_help.c:6184 msgid "show the value of a run-time parameter" msgstr "показати значення параметра виконання" -#: sql_help.c:6061 +#: sql_help.c:6202 msgid "empty a table or set of tables" msgstr "очистити таблицю або декілька таблиць" -#: sql_help.c:6067 +#: sql_help.c:6208 msgid "stop listening for a notification" msgstr "припинити очікування повідомлень" -#: sql_help.c:6073 +#: sql_help.c:6214 msgid "update rows of a table" msgstr "змінити рядки таблиці" -#: sql_help.c:6079 +#: sql_help.c:6220 msgid "garbage-collect and optionally analyze a database" msgstr "виконати збір сміття і проаналізувати базу даних" -#: sql_help.c:6085 +#: sql_help.c:6226 msgid "compute a set of rows" msgstr "отримати набір рядків" -#: startup.c:213 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 можна використовувати лише в неінтерактивному режимі" -#: startup.c:326 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не вдалося відкрити файл журналу \"%s\": %m" -#: startup.c:438 +#: startup.c:460 #, c-format -msgid "Type \"help\" for help.\n\n" -msgstr "Введіть \"help\", щоб отримати допомогу.\n\n" +msgid "" +"Type \"help\" for help.\n" +"\n" +msgstr "" +"Введіть \"help\", щоб отримати допомогу.\n" +"\n" -#: startup.c:591 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "не вдалося встановити параметр друку \"%s\"" -#: startup.c:699 +#: startup.c:719 #, 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:716 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "зайвий аргумент \"%s\" проігнорований" -#: startup.c:765 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "не вдалося знайти ехе файл власної програми" -#: tab-complete.c:4940 +#: tab-complete.c:5955 #, c-format -msgid "tab completion query failed: %s\n" +msgid "" +"tab completion query failed: %s\n" "Query was:\n" "%s" -msgstr "помилка запиту Tab-доповнення: %s\n" +msgstr "" +"помилка запиту Tab-доповнення: %s\n" "Запит:\n" "%s" @@ -6279,8 +6419,9 @@ msgstr "неправильне ім'я змінної: \"%s\"" #: variables.c:419 #, c-format -msgid "unrecognized value \"%s\" for \"%s\"\n" +msgid "" +"unrecognized value \"%s\" for \"%s\"\n" "Available values are: %s." -msgstr "нерозпізнане значення \"%s\" для \"%s\"\n" +msgstr "" +"нерозпізнане значення \"%s\" для \"%s\"\n" "Допустимі значення: %s." - diff --git a/third_party/spanner_pg/src/bin/psql/prompt.c b/third_party/spanner_pg/src/bin/psql/prompt.c index 9f236049..509e6422 100644 --- a/third_party/spanner_pg/src/bin/psql/prompt.c +++ b/third_party/spanner_pg/src/bin/psql/prompt.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/bin/psql/prompt.h b/third_party/spanner_pg/src/bin/psql/prompt.h index ad6646d9..eeb21408 100644 --- a/third_party/spanner_pg/src/bin/psql/prompt.h +++ b/third_party/spanner_pg/src/bin/psql/prompt.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/prompt.h */ diff --git a/third_party/spanner_pg/src/bin/psql/psqlscanslash.h b/third_party/spanner_pg/src/bin/psql/psqlscanslash.h index 074e961e..95b2c29e 100644 --- a/third_party/spanner_pg/src/bin/psql/psqlscanslash.h +++ b/third_party/spanner_pg/src/bin/psql/psqlscanslash.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/psqlscanslash.h */ diff --git a/third_party/spanner_pg/src/bin/psql/psqlscanslash.l b/third_party/spanner_pg/src/bin/psql/psqlscanslash.l index 51aa33e1..878da9f4 100644 --- a/third_party/spanner_pg/src/bin/psql/psqlscanslash.l +++ b/third_party/spanner_pg/src/bin/psql/psqlscanslash.l @@ -8,7 +8,7 @@ * * See fe_utils/psqlscan_int.h for additional commentary. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/bin/psql/settings.h b/third_party/spanner_pg/src/bin/psql/settings.h index 83f2e6f2..2399cffa 100644 --- a/third_party/spanner_pg/src/bin/psql/settings.h +++ b/third_party/spanner_pg/src/bin/psql/settings.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/settings.h */ @@ -94,9 +94,9 @@ typedef struct _psqlSettings printQueryOpt *gsavepopt; /* if not null, saved print format settings */ char *gset_prefix; /* one-shot prefix argument for \gset */ - bool gdesc_flag; /* one-shot request to describe query results */ - bool gexec_flag; /* one-shot request to execute query results */ - bool crosstab_flag; /* one-shot request to crosstab results */ + bool gdesc_flag; /* one-shot request to describe query result */ + bool gexec_flag; /* one-shot request to execute query result */ + bool crosstab_flag; /* one-shot request to crosstab result */ char *ctv_args[4]; /* \crosstabview arguments */ bool notty; /* stdin or stdout is not a tty (as determined @@ -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/third_party/spanner_pg/src/bin/psql/startup.c b/third_party/spanner_pg/src/bin/psql/startup.c index 110906a4..7c2f555f 100644 --- a/third_party/spanner_pg/src/bin/psql/startup.c +++ b/third_party/spanner_pg/src/bin/psql/startup.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/startup.c */ @@ -110,6 +110,13 @@ log_locus_callback(const char **filename, uint64 *lineno) } } +#ifdef HAVE_POSIX_DECL_SIGWAIT +static void +empty_signal_handler(SIGNAL_ARGS) +{ +} +#endif + /* * * main @@ -196,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); @@ -209,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) @@ -232,7 +237,8 @@ main(int argc, char *argv[]) /* * We can't be sure yet of the username that will be used, so don't * offer a potentially wrong one. Typical uses of this option are - * noninteractive anyway. + * noninteractive anyway. (Note: since we've not yet set up our + * cancel handler, there's no need to use simple_prompt_extended.) */ password = simple_prompt("Password: ", false); } @@ -302,6 +308,18 @@ main(int argc, char *argv[]) psql_setup_cancel_handler(); +#ifdef HAVE_POSIX_DECL_SIGWAIT + + /* + * do_watch() needs signal handlers installed (otherwise sigwait() will + * filter them out on some platforms), but doesn't need them to do + * anything, and they shouldn't ever run (unless perhaps a stray SIGALRM + * arrives due to a race when do_watch() cancels an itimer). + */ + pqsignal(SIGCHLD, empty_signal_handler); + pqsignal(SIGALRM, empty_signal_handler); +#endif + PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL); SyncVariables(); @@ -322,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) @@ -411,7 +426,14 @@ main(int argc, char *argv[]) if (options.single_txn) { - if ((res = PSQLexec("COMMIT")) == NULL) + /* + * Rollback the contents of the single transaction if the caller + * has set ON_ERROR_STOP and one of the steps has failed. This + * check needs to match the one done a couple of lines above. + */ + res = PSQLexec((successResult != EXIT_SUCCESS && pset.on_error_stop) ? + "ROLLBACK" : "COMMIT"); + if (res == NULL) { if (pset.on_error_stop) { @@ -587,10 +609,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; @@ -696,10 +715,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; } } @@ -761,10 +780,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); @@ -1130,6 +1146,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) { @@ -1231,6 +1253,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/third_party/spanner_pg/src/bin/psql/stringutils.c b/third_party/spanner_pg/src/bin/psql/stringutils.c index 3a141cdc..ba4c4e05 100644 --- a/third_party/spanner_pg/src/bin/psql/stringutils.c +++ b/third_party/spanner_pg/src/bin/psql/stringutils.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/stringutils.c */ diff --git a/third_party/spanner_pg/src/bin/psql/stringutils.h b/third_party/spanner_pg/src/bin/psql/stringutils.h index b47425e8..5d494227 100644 --- a/third_party/spanner_pg/src/bin/psql/stringutils.h +++ b/third_party/spanner_pg/src/bin/psql/stringutils.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/stringutils.h */ diff --git a/third_party/spanner_pg/src/bin/psql/t/001_basic.pl b/third_party/spanner_pg/src/bin/psql/t/001_basic.pl new file mode 100644 index 00000000..f4478457 --- /dev/null +++ b/third_party/spanner_pg/src/bin/psql/t/001_basic.pl @@ -0,0 +1,328 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('psql'); +program_version_ok('psql'); +program_options_handling_ok('psql'); + +# Execute a psql command and check its output. +sub psql_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + 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; + + 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', $sql, replication => 'database'); + + isnt($ret, 0, "$test_name: exit code not 0"); + like($stderr, $expected_stderr, "$test_name: matches"); + + return; +} + +# 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"); + isnt($stdout, '', "psql --help=$arg goes to stdout"); + is($stderr, '', "psql --help=$arg nothing to stderr"); +} + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init(extra => [ '--locale=C', '--encoding=UTF8' ]); +$node->append_conf( + 'postgresql.conf', q{ +wal_level = 'logical' +max_replication_slots = 4 +max_wal_senders = 4 +}); +$node->start; + +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_fails_like( + $node, + 'START_REPLICATION 0/0', + 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 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 +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'); + +# 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 +psql::2: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +psql::2: error: 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'); + +# Check behavior when using multiple -c and -f switches. +# Note that we cannot test backend-side errors as tests are unstable in this +# case: IPC::Run can complain about a SIGPIPE if psql quits before reading a +# query result. +my $tempdir = PostgreSQL::Test::Utils::tempdir; +$node->safe_psql('postgres', "CREATE TABLE tab_psql_single (a int);"); + +# Tests with ON_ERROR_STOP. +$node->command_ok( + [ + 'psql', '-X', + '--single-transaction', '-v', + 'ON_ERROR_STOP=1', '-c', + 'INSERT INTO tab_psql_single VALUES (1)', '-c', + 'INSERT INTO tab_psql_single VALUES (2)' + ], + 'ON_ERROR_STOP, --single-transaction and multiple -c switches'); +my $row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '2', + '--single-transaction commits transaction, ON_ERROR_STOP and multiple -c switches' +); + +$node->command_fails( + [ + 'psql', '-X', + '--single-transaction', '-v', + 'ON_ERROR_STOP=1', '-c', + 'INSERT INTO tab_psql_single VALUES (3)', '-c', + "\\copy tab_psql_single FROM '$tempdir/nonexistent'" + ], + 'ON_ERROR_STOP, --single-transaction and multiple -c switches, error'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '2', + 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -c switches' +); + +# Tests mixing files and commands. +my $copy_sql_file = "$tempdir/tab_copy.sql"; +my $insert_sql_file = "$tempdir/tab_insert.sql"; +append_to_file($copy_sql_file, + "\\copy tab_psql_single FROM '$tempdir/nonexistent';"); +append_to_file($insert_sql_file, 'INSERT INTO tab_psql_single VALUES (4);'); +$node->command_ok( + [ + 'psql', '-X', '--single-transaction', '-v', + 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f', + $insert_sql_file + ], + 'ON_ERROR_STOP, --single-transaction and multiple -f switches'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '4', + '--single-transaction commits transaction, ON_ERROR_STOP and multiple -f switches' +); + +$node->command_fails( + [ + 'psql', '-X', '--single-transaction', '-v', + 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f', + $copy_sql_file + ], + 'ON_ERROR_STOP, --single-transaction and multiple -f switches, error'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '4', + 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -f switches' +); + +# Tests without ON_ERROR_STOP. +# The last switch fails on \copy. The command returns a failure and the +# transaction commits. +$node->command_fails( + [ + 'psql', '-X', + '--single-transaction', '-f', + $insert_sql_file, '-f', + $insert_sql_file, '-c', + "\\copy tab_psql_single FROM '$tempdir/nonexistent'" + ], + 'no ON_ERROR_STOP, --single-transaction and multiple -f/-c switches'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '6', + 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f/-c switches' +); + +# The last switch fails on \copy coming from an input file. The command +# returns a success and the transaction commits. +$node->command_ok( + [ + 'psql', '-X', '--single-transaction', '-f', + $insert_sql_file, '-f', $insert_sql_file, '-f', + $copy_sql_file + ], + 'no ON_ERROR_STOP, --single-transaction and multiple -f switches'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '8', + 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f switches' +); + +# The last switch makes the command return a success, and the contents of +# the transaction commit even if there is a failure in-between. +$node->command_ok( + [ + 'psql', '-X', + '--single-transaction', '-c', + 'INSERT INTO tab_psql_single VALUES (5)', '-f', + $copy_sql_file, '-c', + 'INSERT INTO tab_psql_single VALUES (6)' + ], + 'no ON_ERROR_STOP, --single-transaction and multiple -c switches'); +$row_count = + $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single'); +is($row_count, '10', + 'client-side error commits transaction, no ON_ERROR_STOP and multiple -c switches' +); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/psql/t/010_tab_completion.pl b/third_party/spanner_pg/src/bin/psql/t/010_tab_completion.pl index a98fa26c..2eea515e 100644 --- a/third_party/spanner_pg/src/bin/psql/t/010_tab_completion.pl +++ b/third_party/spanner_pg/src/bin/psql/t/010_tab_completion.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; use IPC::Run qw(pump finish timer); use Data::Dumper; @@ -34,22 +34,24 @@ } # start a new server -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; # set up a few database objects $node->safe_psql('postgres', - "CREATE TABLE tab1 (f1 int, f2 text);\n" + "CREATE TABLE tab1 (c1 int primary key, c2 text);\n" . "CREATE TABLE mytab123 (f1 int, f2 text);\n" . "CREATE TABLE mytab246 (f1 int, f2 text);\n" - . "CREATE TYPE enum1 AS ENUM ('foo', 'bar', 'baz');\n"); + . "CREATE TABLE \"mixedName\" (f1 int, f2 text);\n" + . "CREATE TYPE enum1 AS ENUM ('foo', 'bar', 'baz', 'BLACK');\n" + . "CREATE PUBLICATION some_publication;\n"); # Developers would not appreciate this test adding a bunch of junk to # their ~/.psql_history, so be sure to redirect history into a temp file. # We might as well put it in the test log directory, so that buildfarm runs # capture the result for possible debugging purposes. -my $historyfile = "${TestLib::log_path}/010_psql_history.txt"; +my $historyfile = "${PostgreSQL::Test::Utils::log_path}/010_psql_history.txt"; $ENV{PSQL_HISTORY} = $historyfile; # Another pitfall for developers is that they might have a ~/.inputrc @@ -92,7 +94,7 @@ my $in = ''; my $out = ''; -my $timer = timer($TestLib::timeout_default); +my $timer = timer($PostgreSQL::Test::Utils::timeout_default); my $h = $node->interactive_psql('postgres', \$in, \$out, $timer); @@ -109,7 +111,7 @@ sub check_completion # reset output collector $out = ""; # restart per-command timer - $timer->start($TestLib::timeout_default); + $timer->start($PostgreSQL::Test::Utils::timeout_default); # send the data to be sent $in .= $send; # wait ... @@ -130,7 +132,8 @@ sub clear_query { local $Test::Builder::Level = $Test::Builder::Level + 1; - check_completion("\\r\n", qr/postgres=# /, "\\r works"); + check_completion("\\r\n", qr/Query buffer reset.*postgres=# /s, + "\\r works"); return; } @@ -176,11 +179,95 @@ sub clear_line clear_query(); +# check handling of quoted names +check_completion( + "select * from \"my\t", + qr/select \* from "my\a?tab/, + "complete \"my to \"mytab when there are multiple choices"); + +check_completion( + "\t\t", + qr/"mytab123" +"mytab246"/, + "offer multiple quoted table choices"); + +# note: broken versions of libedit want to backslash the closing quote; +# not much we can do about that +check_completion("2\t", qr/246\\?" /, + "finish completion of one of multiple quoted table choices"); + +# note: broken versions of libedit may leave us in a state where psql +# thinks there's an unclosed double quote, so that we have to use +# clear_line not clear_query here +clear_line(); + +# check handling of mixed-case names +# note: broken versions of libedit want to backslash the closing quote; +# not much we can do about that +check_completion( + "select * from \"mi\t", + qr/"mixedName\\?" /, + "complete a mixed-case name"); + +# as above, must use clear_line not clear_query here +clear_line(); + +# check case folding +check_completion("select * from TAB\t", qr/tab1 /, "automatically fold case"); + +clear_query(); + # check case-sensitive keyword replacement # note: various versions of readline/libedit handle backspacing # differently, so just check that the replacement comes out correctly check_completion("\\DRD\t", qr/drds /, "complete \\DRD to \\drds"); +# broken versions of libedit require clear_line not clear_query here +clear_line(); + +# check completion of a schema-qualified name +check_completion("select * from pub\t", + qr/public\./, "complete schema when relevant"); + +check_completion("tab\t", qr/tab1 /, "complete schema-qualified name"); + +clear_query(); + +check_completion( + "select * from PUBLIC.t\t", + qr/public\.tab1 /, + "automatically fold case in schema-qualified name"); + +clear_query(); + +# check interpretation of referenced names +check_completion( + "alter table tab1 drop constraint \t", + qr/tab1_pkey /, + "complete index name for referenced table"); + +clear_query(); + +check_completion( + "alter table TAB1 drop constraint \t", + qr/tab1_pkey /, + "complete index name for referenced table, with downcasing"); + +clear_query(); + +check_completion( + "alter table public.\"tab1\" drop constraint \t", + qr/tab1_pkey /, + "complete index name for referenced table, with schema and quoting"); + +clear_query(); + +# check variant where we're completing a qualified name from a refname +# (this one also checks successful completion in a multiline command) +check_completion( + "comment on constraint tab1_pkey \n on public.\t", + qr/public\.tab1/, + "complete qualified name from object reference"); + clear_query(); # check filename completion @@ -197,7 +284,8 @@ sub clear_line qr|tmp_check/af\a?ile|, "filename completion with multiple possibilities"); -clear_query(); +# broken versions of libedit require clear_line not clear_query here +clear_line(); # COPY requires quoting # note: broken versions of libedit want to backslash the closing quote; @@ -234,8 +322,127 @@ sub clear_line clear_line(); +# enum labels are case sensitive, so this should complete BLACK immediately +check_completion( + "ALTER TYPE enum1 RENAME VALUE 'B\t", + qr|BLACK|, + "enum labels are case sensitive"); + +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 ( + [ 'lower', 'CO', 'column' ], + [ 'upper', 'co', 'COLUMN' ], + [ 'preserve-lower', 'co', 'column' ], + [ 'preserve-upper', 'CO', 'COLUMN' ],) +{ + my ($case, $in, $out) = @$_; + + check_completion( + "\\set COMP_KEYWORD_CASE $case\n", + qr/postgres=#/, + "set completion case to '$case'"); + check_completion("alter table tab1 rename $in\t\t\t", + qr|$out|, + "offer keyword $out for input $in, COMP_KEYWORD_CASE = $case"); + clear_query(); +} + +# alternate path where keyword comes from SchemaQuery +check_completion( + "DROP TYPE big\t", + qr/DROP TYPE bigint /, + "offer keyword from SchemaQuery"); + +clear_query(); + +# check create_command_generator +check_completion( + "CREATE TY\t", + qr/CREATE TYPE /, + "check create_command_generator"); + +clear_query(); + +# check words_after_create infrastructure +check_completion( + "CREATE TABLE mytab\t\t", + qr/mytab123 +mytab246/, + "check words_after_create"); + +clear_query(); + +# check VersionedQuery infrastructure +check_completion( + "DROP PUBLIC\t \t\t", + qr/DROP PUBLICATION\s+some_publication /, + "check VersionedQuery"); + +clear_query(); + +# hits ends_with() and logic for completing in multi-line queries +check_completion("analyze (\n\t\t", qr/VERBOSE/, + "check ANALYZE (VERBOSE ..."); + +clear_query(); + +# check completions for GUCs +check_completion( + "set interval\t\t", + qr/intervalstyle TO/, + "complete a GUC name"); +check_completion(" iso\t", qr/iso_8601 /, "complete a GUC enum value"); + +clear_query(); + +# same, for qualified GUC names +check_completion( + "DO \$\$begin end\$\$ LANGUAGE plpgsql;\n", + qr/postgres=# /, + "load plpgsql extension"); + +check_completion("set plpg\t", qr/plpg\a?sql\./, + "complete prefix of a GUC name"); +check_completion( + "var\t\t", + qr/variable_conflict TO/, + "complete a qualified GUC name"); +check_completion(" USE_C\t", + qr/use_column/, "complete a qualified GUC enum value"); + +clear_query(); + +# check completions for psql variables +check_completion("\\set VERB\t", qr/VERBOSITY /, + "complete a psql variable name"); +check_completion("def\t", qr/default /, "complete a psql variable value"); + +clear_query(); + +check_completion( + "\\echo :VERB\t", + qr/:VERBOSITY /, + "complete an interpolated psql variable name"); + +clear_query(); + +# check no-completions code path +check_completion("blarg \t\t", qr//, "check completion failure path"); + +clear_query(); + # send psql an explicit \q to shut it down, else pty won't close properly -$timer->start($TestLib::timeout_default); +$timer->start($PostgreSQL::Test::Utils::timeout_default); $in .= "\\q\n"; finish $h or die "psql returned $?"; $timer->reset; diff --git a/third_party/spanner_pg/src/bin/psql/t/020_cancel.pl b/third_party/spanner_pg/src/bin/psql/t/020_cancel.pl new file mode 100644 index 00000000..0265b862 --- /dev/null +++ b/third_party/spanner_pg/src/bin/psql/t/020_cancel.pl @@ -0,0 +1,80 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use Time::HiRes qw(usleep); + +# Test query canceling by sending SIGINT to a running psql +# +# There is, as of this writing, no documented way to get the PID of +# the process from IPC::Run. As a workaround, we have psql print its +# own PID (which is the parent of the shell launched by psql) to a +# file. +if ($windows_os) +{ + plan skip_all => "cancel test requires a Unix shell"; +} + +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->start; + +local %ENV = $node->_get_env(); + +my ($stdin, $stdout, $stderr); + +# Test whether shell supports $PPID. It's part of POSIX, but some +# pre-/non-POSIX shells don't support it (e.g., NetBSD). +$stdin = "\\! echo \$PPID"; +IPC::Run::run([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ], + '<', \$stdin, '>', \$stdout, '2>', \$stderr); +$stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2; + +# Now start the real test +my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ], + \$stdin, \$stdout, \$stderr); + +# Get the PID +$stdout = ''; +$stderr = ''; +$stdin = "\\! echo \$PPID >$tempdir/psql.pid\n"; +pump $h while length $stdin; +my $count; +my $psql_pid; +until ( + -s "$tempdir/psql.pid" + and ($psql_pid = + PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid")) =~ + /^\d+\n/s) +{ + ($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($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"; + +# Send cancel request +kill 'INT', $psql_pid; + +my $result = finish $h; + +ok(!$result, 'query failed as expected'); +like( + $stderr, + qr/canceling statement due to user request/, + 'query was canceled'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/psql/tab-complete.c b/third_party/spanner_pg/src/bin/psql/tab-complete.c index 5b909d6f..f6e7011c 100644 --- a/third_party/spanner_pg/src/bin/psql/tab-complete.c +++ b/third_party/spanner_pg/src/bin/psql/tab-complete.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/tab-complete.c */ @@ -46,7 +46,9 @@ #include "catalog/pg_am_d.h" #include "catalog/pg_class_d.h" #include "common.h" +#include "common/keywords.h" #include "libpq-fe.h" +#include "mb/pg_wchar.h" #include "pqexpbuffer.h" #include "settings.h" #include "stringutils.h" @@ -108,6 +110,12 @@ typedef struct VersionedQuery * time. So we put the components of each query into this struct and * assemble them with the common boilerplate in _complete_from_query(). * + * We also use this struct to define queries that use completion_ref_object, + * which is some object related to the one(s) we want to get the names of + * (for example, the table we want the indexes of). In that usage the + * objects we're completing might not have a schema of their own, but the + * reference object almost always does (passed in completion_ref_schema). + * * As with VersionedQuery, we can use an array of these if the query details * must vary across versions. */ @@ -121,8 +129,9 @@ typedef struct SchemaQuery int min_server_version; /* - * Name of catalog or catalogs to be queried, with alias, eg. - * "pg_catalog.pg_class c". Note that "pg_namespace n" will be added. + * Name of catalog or catalogs to be queried, with alias(es), eg. + * "pg_catalog.pg_class c". Note that "pg_namespace n" and/or + * "pg_namespace nr" will be added automatically when needed. */ const char *catname; @@ -138,26 +147,60 @@ typedef struct SchemaQuery /* * Visibility condition --- which rows are visible without schema * qualification? For example, "pg_catalog.pg_table_is_visible(c.oid)". + * NULL if not needed. */ const char *viscondition; /* - * Namespace --- name of field to join to pg_namespace.oid. For example, - * "c.relnamespace". + * Namespace --- name of field to join to pg_namespace.oid when there is + * schema qualification. For example, "c.relnamespace". NULL if we don't + * want to join to pg_namespace (then any schema part in the input word + * will be ignored). */ const char *namespace; /* - * Result --- the appropriately-quoted name to return, in the case of an - * unqualified name. For example, "pg_catalog.quote_ident(c.relname)". + * Result --- the base object name to return. For example, "c.relname". */ const char *result; /* - * In some cases a different result must be used for qualified names. - * Enter that here, or write NULL if result can be used. + * In some cases, it's difficult to keep the query from returning the same + * object multiple times. Specify use_distinct to filter out duplicates. + */ + bool use_distinct; + + /* + * Additional literal strings (usually keywords) to be offered along with + * the query results. Provide a NULL-terminated array of constant + * strings, or NULL if none. + */ + const char *const *keywords; + + /* + * If this query uses completion_ref_object/completion_ref_schema, + * populate the remaining fields, else leave them NULL. When using this + * capability, catname must include the catalog that defines the + * completion_ref_object, and selcondition must include the join condition + * that connects it to the result's catalog. + * + * refname is the field that should be equated to completion_ref_object, + * for example "cr.relname". + */ + const char *refname; + + /* + * Visibility condition to use when completion_ref_schema is not set. For + * example, "pg_catalog.pg_table_is_visible(cr.oid)". NULL if not needed. + */ + const char *refviscondition; + + /* + * Name of field to join to pg_namespace.oid when completion_ref_schema is + * set. For example, "cr.relnamespace". NULL if we don't want to + * consider completion_ref_schema. */ - const char *qualresult; + const char *refnamespace; } SchemaQuery; @@ -174,52 +217,128 @@ static int completion_max_records; static char completion_last_char; /* last char of input word */ static const char *completion_charp; /* to pass a string */ static const char *const *completion_charpp; /* to pass a list of strings */ -static const char *completion_info_charp; /* to pass a second string */ -static const char *completion_info_charp2; /* to pass a third string */ static const VersionedQuery *completion_vquery; /* to pass a VersionedQuery */ static const SchemaQuery *completion_squery; /* to pass a SchemaQuery */ +static char *completion_ref_object; /* name of reference object */ +static char *completion_ref_schema; /* schema name of reference object */ static bool completion_case_sensitive; /* completion is case sensitive */ +static bool completion_verbatim; /* completion is verbatim */ static bool completion_force_quote; /* true to force-quote filenames */ /* * A few macros to ease typing. You can use these to complete the given * string with - * 1) The results from a query you pass it. (Perhaps one of those below?) + * 1) The result from a query you pass it. (Perhaps one of those below?) * We support both simple and versioned queries. - * 2) The results from a schema query you pass it. + * 2) The result from a schema query you pass it. * We support both simple and versioned schema queries. * 3) The items from a null-pointer-terminated list (with or without * case-sensitive comparison); if the list is constant you can build it - * with COMPLETE_WITH() or COMPLETE_WITH_CS(). + * with COMPLETE_WITH() or COMPLETE_WITH_CS(). The QUERY_LIST and + * QUERY_PLUS forms combine such literal lists with a query result. * 4) The list of attributes of the given table (possibly schema-qualified). * 5) The list of arguments to the given function (possibly schema-qualified). + * + * The query is generally expected to return raw SQL identifiers; matching + * to what the user typed is done in a quoting-aware fashion. If what is + * returned is not SQL identifiers, use one of the VERBATIM forms, in which + * case the query results are matched to the user's text without double-quote + * processing (so if quoting is needed, you must provide it in the query + * results). */ #define COMPLETE_WITH_QUERY(query) \ + COMPLETE_WITH_QUERY_LIST(query, NULL) + +#define COMPLETE_WITH_QUERY_LIST(query, list) \ do { \ completion_charp = query; \ + completion_charpp = list; \ + completion_verbatim = false; \ matches = rl_completion_matches(text, complete_from_query); \ } while (0) +#define COMPLETE_WITH_QUERY_PLUS(query, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_QUERY_LIST(query, list); \ +} while (0) + +#define COMPLETE_WITH_QUERY_VERBATIM(query) \ + COMPLETE_WITH_QUERY_VERBATIM_LIST(query, NULL) + +#define COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list) \ +do { \ + completion_charp = query; \ + completion_charpp = list; \ + completion_verbatim = true; \ + matches = rl_completion_matches(text, complete_from_query); \ +} while (0) + +#define COMPLETE_WITH_QUERY_VERBATIM_PLUS(query, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list); \ +} while (0) + #define COMPLETE_WITH_VERSIONED_QUERY(query) \ + COMPLETE_WITH_VERSIONED_QUERY_LIST(query, NULL) + +#define COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list) \ do { \ completion_vquery = query; \ + completion_charpp = list; \ + completion_verbatim = false; \ matches = rl_completion_matches(text, complete_from_versioned_query); \ } while (0) -#define COMPLETE_WITH_SCHEMA_QUERY(query, addon) \ +#define COMPLETE_WITH_VERSIONED_QUERY_PLUS(query, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list); \ +} while (0) + +#define COMPLETE_WITH_SCHEMA_QUERY(query) \ + COMPLETE_WITH_SCHEMA_QUERY_LIST(query, NULL) + +#define COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list) \ do { \ completion_squery = &(query); \ - completion_charp = addon; \ + completion_charpp = list; \ + completion_verbatim = false; \ matches = rl_completion_matches(text, complete_from_schema_query); \ } while (0) -#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query, addon) \ +#define COMPLETE_WITH_SCHEMA_QUERY_PLUS(query, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list); \ +} while (0) + +#define COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(query) \ +do { \ + completion_squery = &(query); \ + completion_charpp = NULL; \ + completion_verbatim = true; \ + matches = rl_completion_matches(text, complete_from_schema_query); \ +} while (0) + +#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query) \ + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, NULL) + +#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list) \ do { \ completion_squery = query; \ - completion_vquery = addon; \ + completion_charpp = list; \ + completion_verbatim = false; \ matches = rl_completion_matches(text, complete_from_versioned_schema_query); \ } while (0) +#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_PLUS(query, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list); \ +} while (0) + /* * Caution: COMPLETE_WITH_CONST is not for general-purpose use; you probably * want COMPLETE_WITH() with one element, instead. @@ -253,29 +372,22 @@ do { \ COMPLETE_WITH_LIST_CS(list); \ } while (0) -#define COMPLETE_WITH_ATTR(relation, addon) \ +#define COMPLETE_WITH_ATTR(relation) \ + COMPLETE_WITH_ATTR_LIST(relation, NULL) + +#define COMPLETE_WITH_ATTR_LIST(relation, list) \ do { \ - char *_completion_schema; \ - char *_completion_table; \ -\ - _completion_schema = strtokx(relation, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - (void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - _completion_table = strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - if (_completion_table == NULL) \ - { \ - completion_charp = Query_for_list_of_attributes addon; \ - completion_info_charp = relation; \ - } \ - else \ - { \ - completion_charp = Query_for_list_of_attributes_with_schema addon; \ - completion_info_charp = _completion_table; \ - completion_info_charp2 = _completion_schema; \ - } \ - matches = rl_completion_matches(text, complete_from_query); \ + set_completion_reference(relation); \ + completion_squery = &(Query_for_list_of_attributes); \ + completion_charpp = list; \ + completion_verbatim = false; \ + matches = rl_completion_matches(text, complete_from_schema_query); \ +} while (0) + +#define COMPLETE_WITH_ATTR_PLUS(relation, ...) \ +do { \ + static const char *const list[] = { __VA_ARGS__, NULL }; \ + COMPLETE_WITH_ATTR_LIST(relation, list); \ } while (0) /* @@ -286,63 +398,44 @@ do { \ */ #define COMPLETE_WITH_ENUM_VALUE(type) \ do { \ - char *_completion_schema; \ - char *_completion_type; \ - bool use_quotes; \ -\ - _completion_schema = strtokx(type, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - (void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - _completion_type = strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - use_quotes = (text[0] == '\'' || \ - start == 0 || rl_line_buffer[start - 1] != '\''); \ - if (_completion_type == NULL) \ - { \ - if (use_quotes) \ - completion_charp = Query_for_list_of_enum_values_quoted; \ - else \ - completion_charp = Query_for_list_of_enum_values_unquoted; \ - completion_info_charp = type; \ - } \ + set_completion_reference(type); \ + if (text[0] == '\'' || \ + start == 0 || rl_line_buffer[start - 1] != '\'') \ + completion_squery = &(Query_for_list_of_enum_values_quoted); \ else \ - { \ - if (use_quotes) \ - completion_charp = Query_for_list_of_enum_values_with_schema_quoted; \ - else \ - completion_charp = Query_for_list_of_enum_values_with_schema_unquoted; \ - completion_info_charp = _completion_type; \ - completion_info_charp2 = _completion_schema; \ - } \ - matches = rl_completion_matches(text, complete_from_query); \ + completion_squery = &(Query_for_list_of_enum_values_unquoted); \ + completion_charpp = NULL; \ + completion_verbatim = true; \ + matches = rl_completion_matches(text, complete_from_schema_query); \ } while (0) -#define COMPLETE_WITH_FUNCTION_ARG(function) \ +/* + * 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 { \ - char *_completion_schema; \ - char *_completion_function; \ -\ - _completion_schema = strtokx(function, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - (void) strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - _completion_function = strtokx(NULL, " \t\n\r", ".", "\"", 0, \ - false, false, pset.encoding); \ - if (_completion_function == NULL) \ - { \ - completion_charp = Query_for_list_of_arguments; \ - completion_info_charp = function; \ - } \ + 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_arguments_with_schema; \ - completion_info_charp = _completion_function; \ - completion_info_charp2 = _completion_schema; \ - } \ + 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); \ + completion_squery = &(Query_for_list_of_arguments); \ + completion_charpp = NULL; \ + completion_verbatim = true; \ + matches = rl_completion_matches(text, complete_from_schema_query); \ +} while (0) + /* * Assembly instructions for schema queries * @@ -350,6 +443,51 @@ do { \ * unnecessary bloat in the completions generated. */ +static const SchemaQuery Query_for_constraint_of_table = { + .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1", + .selcondition = "con.conrelid=c1.oid", + .result = "con.conname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + +static const SchemaQuery Query_for_constraint_of_table_not_validated = { + .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1", + .selcondition = "con.conrelid=c1.oid and not con.convalidated", + .result = "con.conname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + +static const SchemaQuery Query_for_constraint_of_type = { + .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_type t", + .selcondition = "con.contypid=t.oid", + .result = "con.conname", + .refname = "t.typname", + .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)", + .refnamespace = "t.typnamespace", +}; + +static const SchemaQuery Query_for_index_of_table = { + .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i", + .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid", + .result = "c2.relname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + +static const SchemaQuery Query_for_unique_index_of_table = { + .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i", + .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid and i.indisunique", + .result = "c2.relname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + static const SchemaQuery Query_for_list_of_aggregates[] = { { .min_server_version = 110000, @@ -357,17 +495,71 @@ static const SchemaQuery Query_for_list_of_aggregates[] = { .selcondition = "p.prokind = 'a'", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", }, { .catname = "pg_catalog.pg_proc p", .selcondition = "p.proisagg", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", } }; +static const SchemaQuery Query_for_list_of_arguments = { + .catname = "pg_catalog.pg_proc p", + .result = "pg_catalog.oidvectortypes(p.proargtypes)||')'", + .refname = "p.proname", + .refviscondition = "pg_catalog.pg_function_is_visible(p.oid)", + .refnamespace = "p.pronamespace", +}; + +static const SchemaQuery Query_for_list_of_attributes = { + .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c", + .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped", + .result = "a.attname", + .refname = "c.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .refnamespace = "c.relnamespace", +}; + +static const SchemaQuery Query_for_list_of_attribute_numbers = { + .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c", + .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped", + .result = "a.attnum::pg_catalog.text", + .refname = "c.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .refnamespace = "c.relnamespace", +}; + +static const char *const Keywords_for_list_of_datatypes[] = { + "bigint", + "boolean", + "character", + "double precision", + "integer", + "real", + "smallint", + + /* + * Note: currently there's no value in offering the following multiword + * type names, because tab completion cannot succeed for them: we can't + * disambiguate until somewhere in the second word, at which point we + * won't have the first word as context. ("double precision" does work, + * as long as no other type name begins with "double".) Leave them out to + * encourage users to use the PG-specific aliases, which we can complete. + */ +#ifdef NOT_USED + "bit varying", + "character varying", + "time with time zone", + "time without time zone", + "timestamp with time zone", + "timestamp without time zone", +#endif + NULL +}; + static const SchemaQuery Query_for_list_of_datatypes = { .catname = "pg_catalog.pg_type t", /* selcondition --- ignore table rowtypes and array types */ @@ -377,8 +569,8 @@ static const SchemaQuery Query_for_list_of_datatypes = { "AND t.typname !~ '^_'", .viscondition = "pg_catalog.pg_type_is_visible(t.oid)", .namespace = "t.typnamespace", - .result = "pg_catalog.format_type(t.oid, NULL)", - .qualresult = "pg_catalog.quote_ident(t.typname)", + .result = "t.typname", + .keywords = Keywords_for_list_of_datatypes, }; static const SchemaQuery Query_for_list_of_composite_datatypes = { @@ -389,8 +581,7 @@ static const SchemaQuery Query_for_list_of_composite_datatypes = { "AND t.typname !~ '^_'", .viscondition = "pg_catalog.pg_type_is_visible(t.oid)", .namespace = "t.typnamespace", - .result = "pg_catalog.format_type(t.oid, NULL)", - .qualresult = "pg_catalog.quote_ident(t.typname)", + .result = "t.typname", }; static const SchemaQuery Query_for_list_of_domains = { @@ -398,7 +589,25 @@ static const SchemaQuery Query_for_list_of_domains = { .selcondition = "t.typtype = 'd'", .viscondition = "pg_catalog.pg_type_is_visible(t.oid)", .namespace = "t.typnamespace", - .result = "pg_catalog.quote_ident(t.typname)", + .result = "t.typname", +}; + +static const SchemaQuery Query_for_list_of_enum_values_quoted = { + .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t", + .selcondition = "t.oid = e.enumtypid", + .result = "pg_catalog.quote_literal(enumlabel)", + .refname = "t.typname", + .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)", + .refnamespace = "t.typnamespace", +}; + +static const SchemaQuery Query_for_list_of_enum_values_unquoted = { + .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t", + .selcondition = "t.oid = e.enumtypid", + .result = "e.enumlabel", + .refname = "t.typname", + .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)", + .refnamespace = "t.typnamespace", }; /* Note: this intentionally accepts aggregates as well as plain functions */ @@ -409,13 +618,13 @@ static const SchemaQuery Query_for_list_of_functions[] = { .selcondition = "p.prokind != 'p'", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", }, { .catname = "pg_catalog.pg_proc p", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", } }; @@ -426,7 +635,7 @@ static const SchemaQuery Query_for_list_of_procedures[] = { .selcondition = "p.prokind = 'p'", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", }, { /* not supported in older versions */ @@ -438,7 +647,7 @@ static const SchemaQuery Query_for_list_of_routines = { .catname = "pg_catalog.pg_proc p", .viscondition = "pg_catalog.pg_function_is_visible(p.oid)", .namespace = "p.pronamespace", - .result = "pg_catalog.quote_ident(p.proname)", + .result = "p.proname", }; static const SchemaQuery Query_for_list_of_sequences = { @@ -446,7 +655,7 @@ static const SchemaQuery Query_for_list_of_sequences = { .selcondition = "c.relkind IN (" CppAsString2(RELKIND_SEQUENCE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_foreign_tables = { @@ -454,7 +663,7 @@ static const SchemaQuery Query_for_list_of_foreign_tables = { .selcondition = "c.relkind IN (" CppAsString2(RELKIND_FOREIGN_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_tables = { @@ -464,7 +673,7 @@ static const SchemaQuery Query_for_list_of_tables = { CppAsString2(RELKIND_PARTITIONED_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_partitioned_tables = { @@ -472,7 +681,77 @@ static const SchemaQuery Query_for_list_of_partitioned_tables = { .selcondition = "c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", +}; + +static const SchemaQuery Query_for_list_of_tables_for_constraint = { + .catname = "pg_catalog.pg_class c, pg_catalog.pg_constraint con", + .selcondition = "c.oid=con.conrelid and 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", + .use_distinct = true, + .refname = "con.conname", +}; + +static const SchemaQuery Query_for_list_of_tables_for_policy = { + .catname = "pg_catalog.pg_class c, pg_catalog.pg_policy p", + .selcondition = "c.oid=p.polrelid", + .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .namespace = "c.relnamespace", + .result = "c.relname", + .use_distinct = true, + .refname = "p.polname", +}; + +static const SchemaQuery Query_for_list_of_tables_for_rule = { + .catname = "pg_catalog.pg_class c, pg_catalog.pg_rewrite r", + .selcondition = "c.oid=r.ev_class", + .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .namespace = "c.relnamespace", + .result = "c.relname", + .use_distinct = true, + .refname = "r.rulename", +}; + +static const SchemaQuery Query_for_list_of_tables_for_trigger = { + .catname = "pg_catalog.pg_class c, pg_catalog.pg_trigger t", + .selcondition = "c.oid=t.tgrelid", + .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", + .namespace = "c.relnamespace", + .result = "c.relname", + .use_distinct = true, + .refname = "t.tgname", +}; + +static const SchemaQuery Query_for_list_of_ts_configurations = { + .catname = "pg_catalog.pg_ts_config c", + .viscondition = "pg_catalog.pg_ts_config_is_visible(c.oid)", + .namespace = "c.cfgnamespace", + .result = "c.cfgname", +}; + +static const SchemaQuery Query_for_list_of_ts_dictionaries = { + .catname = "pg_catalog.pg_ts_dict d", + .viscondition = "pg_catalog.pg_ts_dict_is_visible(d.oid)", + .namespace = "d.dictnamespace", + .result = "d.dictname", +}; + +static const SchemaQuery Query_for_list_of_ts_parsers = { + .catname = "pg_catalog.pg_ts_parser p", + .viscondition = "pg_catalog.pg_ts_parser_is_visible(p.oid)", + .namespace = "p.prsnamespace", + .result = "p.prsname", +}; + +static const SchemaQuery Query_for_list_of_ts_templates = { + .catname = "pg_catalog.pg_ts_template t", + .viscondition = "pg_catalog.pg_ts_template_is_visible(t.oid)", + .namespace = "t.tmplnamespace", + .result = "t.tmplname", }; static const SchemaQuery Query_for_list_of_views = { @@ -480,7 +759,7 @@ static const SchemaQuery Query_for_list_of_views = { .selcondition = "c.relkind IN (" CppAsString2(RELKIND_VIEW) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_matviews = { @@ -488,7 +767,7 @@ static const SchemaQuery Query_for_list_of_matviews = { .selcondition = "c.relkind IN (" CppAsString2(RELKIND_MATVIEW) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_indexes = { @@ -498,7 +777,7 @@ static const SchemaQuery Query_for_list_of_indexes = { CppAsString2(RELKIND_PARTITIONED_INDEX) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_partitioned_indexes = { @@ -506,7 +785,7 @@ static const SchemaQuery Query_for_list_of_partitioned_indexes = { .selcondition = "c.relkind = " CppAsString2(RELKIND_PARTITIONED_INDEX), .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; @@ -515,7 +794,7 @@ static const SchemaQuery Query_for_list_of_relations = { .catname = "pg_catalog.pg_class c", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; /* partitioned relations */ @@ -525,14 +804,14 @@ static const SchemaQuery Query_for_list_of_partitioned_relations = { ", " CppAsString2(RELKIND_PARTITIONED_INDEX) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_operator_families = { .catname = "pg_catalog.pg_opfamily c", .viscondition = "pg_catalog.pg_opfamily_is_visible(c.oid)", .namespace = "c.opfnamespace", - .result = "pg_catalog.quote_ident(c.opfname)", + .result = "c.opfname", }; /* Relations supporting INSERT, UPDATE or DELETE */ @@ -545,7 +824,18 @@ static const SchemaQuery Query_for_list_of_updatables = { CppAsString2(RELKIND_PARTITIONED_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .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 */ @@ -560,7 +850,7 @@ static const SchemaQuery Query_for_list_of_selectables = { CppAsString2(RELKIND_PARTITIONED_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; /* Relations supporting TRUNCATE */ @@ -572,7 +862,7 @@ static const SchemaQuery Query_for_list_of_truncatables = { CppAsString2(RELKIND_PARTITIONED_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; /* Relations supporting GRANT are currently same as those supporting SELECT */ @@ -588,7 +878,7 @@ static const SchemaQuery Query_for_list_of_analyzables = { CppAsString2(RELKIND_FOREIGN_TABLE) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; /* Relations supporting index creation */ @@ -600,7 +890,7 @@ static const SchemaQuery Query_for_list_of_indexables = { CppAsString2(RELKIND_MATVIEW) ")", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; /* @@ -614,25 +904,25 @@ 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", - .result = "pg_catalog.quote_ident(c.relname)", + .result = "c.relname", }; static const SchemaQuery Query_for_list_of_constraints_with_schema = { .catname = "pg_catalog.pg_constraint c", .selcondition = "c.conrelid <> 0", - .viscondition = "true", /* there is no pg_constraint_is_visible */ .namespace = "c.connamespace", - .result = "pg_catalog.quote_ident(c.conname)", + .result = "c.conname", }; static const SchemaQuery Query_for_list_of_statistics = { .catname = "pg_catalog.pg_statistic_ext s", .viscondition = "pg_catalog.pg_statistics_obj_is_visible(s.oid)", .namespace = "s.stxnamespace", - .result = "pg_catalog.quote_ident(s.stxname)", + .result = "s.stxname", }; static const SchemaQuery Query_for_list_of_collations = { @@ -640,408 +930,239 @@ static const SchemaQuery Query_for_list_of_collations = { .selcondition = "c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))", .viscondition = "pg_catalog.pg_collation_is_visible(c.oid)", .namespace = "c.collnamespace", - .result = "pg_catalog.quote_ident(c.collname)", + .result = "c.collname", +}; + +static const SchemaQuery Query_for_partition_of_table = { + .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i", + .selcondition = "c1.oid=i.inhparent and i.inhrelid=c2.oid and c2.relispartition", + .viscondition = "pg_catalog.pg_table_is_visible(c2.oid)", + .namespace = "c2.relnamespace", + .result = "c2.relname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + +static const SchemaQuery Query_for_rule_of_table = { + .catname = "pg_catalog.pg_rewrite r, pg_catalog.pg_class c1", + .selcondition = "r.ev_class=c1.oid", + .result = "r.rulename", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", +}; + +static const SchemaQuery Query_for_trigger_of_table = { + .catname = "pg_catalog.pg_trigger t, pg_catalog.pg_class c1", + .selcondition = "t.tgrelid=c1.oid and not t.tgisinternal", + .result = "t.tgname", + .refname = "c1.relname", + .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)", + .refnamespace = "c1.relnamespace", }; /* * Queries to get lists of names of various kinds of things, possibly - * restricted to names matching a partially entered name. In these queries, - * the first %s will be replaced by the text entered so far (suitably escaped - * to become a SQL literal string). %d will be replaced by the length of the - * string (in unescaped form). A second and third %s, if present, will be - * replaced by a suitably-escaped version of the string provided in - * completion_info_charp. A fourth and fifth %s are similarly replaced by - * completion_info_charp2. + * restricted to names matching a partially entered name. Don't use + * this method where the user might wish to enter a schema-qualified + * name; make a SchemaQuery instead. + * + * In these queries, there must be a restriction clause of the form + * output LIKE '%s' + * where "output" is the same string that the query returns. The %s + * will be replaced by a LIKE pattern to match the already-typed text. * - * Beware that the allowed sequences of %s and %d are determined by - * _complete_from_query(). + * There can be a second '%s', which will be replaced by a suitably-escaped + * version of the string provided in completion_ref_object. If there is a + * third '%s', it will be replaced by a suitably-escaped version of the string + * provided in completion_ref_schema. NOTE: using completion_ref_object + * that way is usually the wrong thing, and using completion_ref_schema + * that way is always the wrong thing. Make a SchemaQuery instead. */ -#define Query_for_list_of_attributes \ -"SELECT pg_catalog.quote_ident(attname) "\ -" FROM pg_catalog.pg_attribute a, pg_catalog.pg_class c "\ -" WHERE c.oid = a.attrelid "\ -" AND a.attnum > 0 "\ -" AND NOT a.attisdropped "\ -" AND substring(pg_catalog.quote_ident(attname),1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(relname)='%s' "\ -" OR '\"' || relname || '\"'='%s') "\ -" AND pg_catalog.pg_table_is_visible(c.oid)" - -#define Query_for_list_of_attribute_numbers \ -"SELECT attnum "\ -" FROM pg_catalog.pg_attribute a, pg_catalog.pg_class c "\ -" WHERE c.oid = a.attrelid "\ -" AND a.attnum > 0 "\ -" AND NOT a.attisdropped "\ -" AND substring(attnum::pg_catalog.text,1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(relname)='%s' "\ -" OR '\"' || relname || '\"'='%s') "\ -" AND pg_catalog.pg_table_is_visible(c.oid)" - -#define Query_for_list_of_attributes_with_schema \ -"SELECT pg_catalog.quote_ident(attname) "\ -" FROM pg_catalog.pg_attribute a, pg_catalog.pg_class c, pg_catalog.pg_namespace n "\ -" WHERE c.oid = a.attrelid "\ -" AND n.oid = c.relnamespace "\ -" AND a.attnum > 0 "\ -" AND NOT a.attisdropped "\ -" AND substring(pg_catalog.quote_ident(attname),1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(relname)='%s' "\ -" OR '\"' || relname || '\"' ='%s') "\ -" AND (pg_catalog.quote_ident(nspname)='%s' "\ -" OR '\"' || nspname || '\"' ='%s') " - -#define Query_for_list_of_enum_values_quoted \ -"SELECT pg_catalog.quote_literal(enumlabel) "\ -" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\ -" WHERE t.oid = e.enumtypid "\ -" AND substring(pg_catalog.quote_literal(enumlabel),1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(typname)='%s' "\ -" OR '\"' || typname || '\"'='%s') "\ -" AND pg_catalog.pg_type_is_visible(t.oid)" - -#define Query_for_list_of_enum_values_unquoted \ -"SELECT enumlabel "\ -" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t "\ -" WHERE t.oid = e.enumtypid "\ -" AND substring(enumlabel,1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(typname)='%s' "\ -" OR '\"' || typname || '\"'='%s') "\ -" AND pg_catalog.pg_type_is_visible(t.oid)" - -#define Query_for_list_of_enum_values_with_schema_quoted \ -"SELECT pg_catalog.quote_literal(enumlabel) "\ -" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\ -" WHERE t.oid = e.enumtypid "\ -" AND n.oid = t.typnamespace "\ -" AND substring(pg_catalog.quote_literal(enumlabel),1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(typname)='%s' "\ -" OR '\"' || typname || '\"'='%s') "\ -" AND (pg_catalog.quote_ident(nspname)='%s' "\ -" OR '\"' || nspname || '\"' ='%s') " - -#define Query_for_list_of_enum_values_with_schema_unquoted \ -"SELECT enumlabel "\ -" FROM pg_catalog.pg_enum e, pg_catalog.pg_type t, pg_catalog.pg_namespace n "\ -" WHERE t.oid = e.enumtypid "\ -" AND n.oid = t.typnamespace "\ -" AND substring(enumlabel,1,%d)='%s' "\ -" AND (pg_catalog.quote_ident(typname)='%s' "\ -" OR '\"' || typname || '\"'='%s') "\ -" AND (pg_catalog.quote_ident(nspname)='%s' "\ -" OR '\"' || nspname || '\"' ='%s') " - #define Query_for_list_of_template_databases \ -"SELECT pg_catalog.quote_ident(d.datname) "\ +"SELECT d.datname "\ " FROM pg_catalog.pg_database d "\ -" WHERE substring(pg_catalog.quote_ident(d.datname),1,%d)='%s' "\ +" WHERE d.datname LIKE '%s' "\ " AND (d.datistemplate OR pg_catalog.pg_has_role(d.datdba, 'USAGE'))" #define Query_for_list_of_databases \ -"SELECT pg_catalog.quote_ident(datname) FROM pg_catalog.pg_database "\ -" WHERE substring(pg_catalog.quote_ident(datname),1,%d)='%s'" +"SELECT datname FROM pg_catalog.pg_database "\ +" WHERE datname LIKE '%s'" #define Query_for_list_of_tablespaces \ -"SELECT pg_catalog.quote_ident(spcname) FROM pg_catalog.pg_tablespace "\ -" WHERE substring(pg_catalog.quote_ident(spcname),1,%d)='%s'" +"SELECT spcname FROM pg_catalog.pg_tablespace "\ +" WHERE spcname LIKE '%s'" #define Query_for_list_of_encodings \ " SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\ " FROM pg_catalog.pg_conversion "\ -" WHERE substring(pg_catalog.pg_encoding_to_char(conforencoding),1,%d)=UPPER('%s')" +" WHERE pg_catalog.pg_encoding_to_char(conforencoding) LIKE pg_catalog.upper('%s')" #define Query_for_list_of_languages \ -"SELECT pg_catalog.quote_ident(lanname) "\ +"SELECT lanname "\ " FROM pg_catalog.pg_language "\ " WHERE lanname != 'internal' "\ -" AND substring(pg_catalog.quote_ident(lanname),1,%d)='%s'" +" AND lanname LIKE '%s'" #define Query_for_list_of_schemas \ -"SELECT pg_catalog.quote_ident(nspname) FROM pg_catalog.pg_namespace "\ -" WHERE substring(pg_catalog.quote_ident(nspname),1,%d)='%s'" +"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 "\ -" WHERE context != 'internal' "\ -" UNION ALL SELECT 'all') ss "\ -" WHERE substring(name,1,%d)='%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') "\ -" UNION ALL SELECT 'constraints' "\ -" UNION ALL SELECT 'transaction' "\ -" UNION ALL SELECT 'session' "\ -" UNION ALL SELECT 'role' "\ -" UNION ALL SELECT 'tablespace' "\ -" UNION ALL SELECT 'all') ss "\ -" WHERE substring(name,1,%d)='%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 "\ -" UNION ALL SELECT 'session authorization' "\ -" UNION ALL SELECT 'all') ss "\ -" WHERE substring(name,1,%d)='%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 pg_catalog.quote_ident(rolname) "\ +" SELECT rolname "\ " FROM pg_catalog.pg_roles "\ -" WHERE substring(pg_catalog.quote_ident(rolname),1,%d)='%s'" +" WHERE rolname LIKE '%s'" -#define Query_for_list_of_grant_roles \ -" SELECT pg_catalog.quote_ident(rolname) "\ -" FROM pg_catalog.pg_roles "\ -" WHERE substring(pg_catalog.quote_ident(rolname),1,%d)='%s'"\ -" UNION ALL SELECT 'PUBLIC'"\ -" UNION ALL SELECT 'CURRENT_ROLE'"\ -" UNION ALL SELECT 'CURRENT_USER'"\ -" UNION ALL SELECT 'SESSION_USER'" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_index_of_table \ -"SELECT pg_catalog.quote_ident(c2.relname) "\ -" FROM pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i"\ -" WHERE c1.oid=i.indrelid and i.indexrelid=c2.oid"\ -" and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(c1.relname)='%s'"\ -" and pg_catalog.pg_table_is_visible(c2.oid)" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_constraint_of_table \ -"SELECT pg_catalog.quote_ident(conname) "\ -" FROM pg_catalog.pg_class c1, pg_catalog.pg_constraint con "\ -" WHERE c1.oid=conrelid and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(c1.relname)='%s'"\ -" and pg_catalog.pg_table_is_visible(c1.oid)" +/* add these to Query_for_list_of_roles in GRANT contexts */ +#define Keywords_for_list_of_grant_roles \ +"PUBLIC", "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER" #define Query_for_all_table_constraints \ -"SELECT pg_catalog.quote_ident(conname) "\ +"SELECT conname "\ " FROM pg_catalog.pg_constraint c "\ -" WHERE c.conrelid <> 0 " - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_constraint_of_type \ -"SELECT pg_catalog.quote_ident(conname) "\ -" FROM pg_catalog.pg_type t, pg_catalog.pg_constraint con "\ -" WHERE t.oid=contypid and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(t.typname)='%s'"\ -" and pg_catalog.pg_type_is_visible(t.oid)" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_tables_for_constraint \ -"SELECT pg_catalog.quote_ident(relname) "\ -" FROM pg_catalog.pg_class"\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND oid IN "\ -" (SELECT conrelid FROM pg_catalog.pg_constraint "\ -" WHERE pg_catalog.quote_ident(conname)='%s')" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_rule_of_table \ -"SELECT pg_catalog.quote_ident(rulename) "\ -" FROM pg_catalog.pg_class c1, pg_catalog.pg_rewrite "\ -" WHERE c1.oid=ev_class and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(c1.relname)='%s'"\ -" and pg_catalog.pg_table_is_visible(c1.oid)" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_tables_for_rule \ -"SELECT pg_catalog.quote_ident(relname) "\ -" FROM pg_catalog.pg_class"\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND oid IN "\ -" (SELECT ev_class FROM pg_catalog.pg_rewrite "\ -" WHERE pg_catalog.quote_ident(rulename)='%s')" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_trigger_of_table \ -"SELECT pg_catalog.quote_ident(tgname) "\ -" FROM pg_catalog.pg_class c1, pg_catalog.pg_trigger "\ -" WHERE c1.oid=tgrelid and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(c1.relname)='%s'"\ -" and pg_catalog.pg_table_is_visible(c1.oid)"\ -" and not tgisinternal" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_tables_for_trigger \ -"SELECT pg_catalog.quote_ident(relname) "\ -" FROM pg_catalog.pg_class"\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND oid IN "\ -" (SELECT tgrelid FROM pg_catalog.pg_trigger "\ -" WHERE pg_catalog.quote_ident(tgname)='%s')" - -#define Query_for_list_of_ts_configurations \ -"SELECT pg_catalog.quote_ident(cfgname) FROM pg_catalog.pg_ts_config "\ -" WHERE substring(pg_catalog.quote_ident(cfgname),1,%d)='%s'" - -#define Query_for_list_of_ts_dictionaries \ -"SELECT pg_catalog.quote_ident(dictname) FROM pg_catalog.pg_ts_dict "\ -" WHERE substring(pg_catalog.quote_ident(dictname),1,%d)='%s'" - -#define Query_for_list_of_ts_parsers \ -"SELECT pg_catalog.quote_ident(prsname) FROM pg_catalog.pg_ts_parser "\ -" WHERE substring(pg_catalog.quote_ident(prsname),1,%d)='%s'" - -#define Query_for_list_of_ts_templates \ -"SELECT pg_catalog.quote_ident(tmplname) FROM pg_catalog.pg_ts_template "\ -" WHERE substring(pg_catalog.quote_ident(tmplname),1,%d)='%s'" +" WHERE c.conrelid <> 0 "\ +" and conname LIKE '%s'" #define Query_for_list_of_fdws \ -" SELECT pg_catalog.quote_ident(fdwname) "\ +" SELECT fdwname "\ " FROM pg_catalog.pg_foreign_data_wrapper "\ -" WHERE substring(pg_catalog.quote_ident(fdwname),1,%d)='%s'" +" WHERE fdwname LIKE '%s'" #define Query_for_list_of_servers \ -" SELECT pg_catalog.quote_ident(srvname) "\ +" SELECT srvname "\ " FROM pg_catalog.pg_foreign_server "\ -" WHERE substring(pg_catalog.quote_ident(srvname),1,%d)='%s'" +" WHERE srvname LIKE '%s'" #define Query_for_list_of_user_mappings \ -" SELECT pg_catalog.quote_ident(usename) "\ +" SELECT usename "\ " FROM pg_catalog.pg_user_mappings "\ -" WHERE substring(pg_catalog.quote_ident(usename),1,%d)='%s'" +" WHERE usename LIKE '%s'" #define Query_for_list_of_access_methods \ -" SELECT pg_catalog.quote_ident(amname) "\ +" SELECT amname "\ " FROM pg_catalog.pg_am "\ -" WHERE substring(pg_catalog.quote_ident(amname),1,%d)='%s'" +" WHERE amname LIKE '%s'" #define Query_for_list_of_index_access_methods \ -" SELECT pg_catalog.quote_ident(amname) "\ +" SELECT amname "\ " FROM pg_catalog.pg_am "\ -" WHERE substring(pg_catalog.quote_ident(amname),1,%d)='%s' AND "\ +" WHERE amname LIKE '%s' AND "\ " amtype=" CppAsString2(AMTYPE_INDEX) #define Query_for_list_of_table_access_methods \ -" SELECT pg_catalog.quote_ident(amname) "\ +" SELECT amname "\ " FROM pg_catalog.pg_am "\ -" WHERE substring(pg_catalog.quote_ident(amname),1,%d)='%s' AND "\ +" WHERE amname LIKE '%s' AND "\ " amtype=" CppAsString2(AMTYPE_TABLE) -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_arguments \ -"SELECT pg_catalog.oidvectortypes(proargtypes)||')' "\ -" FROM pg_catalog.pg_proc "\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND (pg_catalog.quote_ident(proname)='%s'"\ -" OR '\"' || proname || '\"'='%s') "\ -" AND (pg_catalog.pg_function_is_visible(pg_proc.oid))" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_arguments_with_schema \ -"SELECT pg_catalog.oidvectortypes(proargtypes)||')' "\ -" FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n "\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND n.oid = p.pronamespace "\ -" AND (pg_catalog.quote_ident(proname)='%s' "\ -" OR '\"' || proname || '\"' ='%s') "\ -" AND (pg_catalog.quote_ident(nspname)='%s' "\ -" OR '\"' || nspname || '\"' ='%s') " - #define Query_for_list_of_extensions \ -" SELECT pg_catalog.quote_ident(extname) "\ +" SELECT extname "\ " FROM pg_catalog.pg_extension "\ -" WHERE substring(pg_catalog.quote_ident(extname),1,%d)='%s'" +" WHERE extname LIKE '%s'" #define Query_for_list_of_available_extensions \ -" SELECT pg_catalog.quote_ident(name) "\ +" SELECT name "\ " FROM pg_catalog.pg_available_extensions "\ -" WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s' AND installed_version IS NULL" +" WHERE name LIKE '%s' AND installed_version IS NULL" -/* the silly-looking length condition is just to eat up the current word */ #define Query_for_list_of_available_extension_versions \ -" SELECT pg_catalog.quote_ident(version) "\ -" FROM pg_catalog.pg_available_extension_versions "\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND pg_catalog.quote_ident(name)='%s'" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_list_of_available_extension_versions_with_TO \ -" SELECT 'TO ' || pg_catalog.quote_ident(version) "\ +" SELECT version "\ " FROM pg_catalog.pg_available_extension_versions "\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND pg_catalog.quote_ident(name)='%s'" +" WHERE version LIKE '%s' AND name='%s'" #define Query_for_list_of_prepared_statements \ -" SELECT pg_catalog.quote_ident(name) "\ +" SELECT name "\ " FROM pg_catalog.pg_prepared_statements "\ -" WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s'" +" WHERE name LIKE '%s'" #define Query_for_list_of_event_triggers \ -" SELECT pg_catalog.quote_ident(evtname) "\ +" SELECT evtname "\ " FROM pg_catalog.pg_event_trigger "\ -" WHERE substring(pg_catalog.quote_ident(evtname),1,%d)='%s'" +" WHERE evtname LIKE '%s'" #define Query_for_list_of_tablesample_methods \ -" SELECT pg_catalog.quote_ident(proname) "\ +" SELECT proname "\ " FROM pg_catalog.pg_proc "\ " WHERE prorettype = 'pg_catalog.tsm_handler'::pg_catalog.regtype AND "\ " proargtypes[0] = 'pg_catalog.internal'::pg_catalog.regtype AND "\ -" substring(pg_catalog.quote_ident(proname),1,%d)='%s'" +" proname LIKE '%s'" #define Query_for_list_of_policies \ -" SELECT pg_catalog.quote_ident(polname) "\ +" SELECT polname "\ " FROM pg_catalog.pg_policy "\ -" WHERE substring(pg_catalog.quote_ident(polname),1,%d)='%s'" - -#define Query_for_list_of_tables_for_policy \ -"SELECT pg_catalog.quote_ident(relname) "\ -" FROM pg_catalog.pg_class"\ -" WHERE (%d = pg_catalog.length('%s'))"\ -" AND oid IN "\ -" (SELECT polrelid FROM pg_catalog.pg_policy "\ -" WHERE pg_catalog.quote_ident(polname)='%s')" - -#define Query_for_enum \ -" SELECT name FROM ( "\ -" SELECT pg_catalog.quote_ident(pg_catalog.unnest(enumvals)) AS name "\ +" WHERE polname LIKE '%s'" + +#define Query_for_values_of_enum_GUC \ +" SELECT val FROM ( "\ +" SELECT name, pg_catalog.unnest(enumvals) AS val "\ " FROM pg_catalog.pg_settings "\ -" WHERE pg_catalog.lower(name)=pg_catalog.lower('%s') "\ -" UNION ALL " \ -" SELECT 'DEFAULT' ) ss "\ -" WHERE pg_catalog.substring(name,1,%%d)='%%s'" - -/* the silly-looking length condition is just to eat up the current word */ -#define Query_for_partition_of_table \ -"SELECT pg_catalog.quote_ident(c2.relname) "\ -" FROM pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i"\ -" WHERE c1.oid=i.inhparent and i.inhrelid=c2.oid"\ -" and (%d = pg_catalog.length('%s'))"\ -" and pg_catalog.quote_ident(c1.relname)='%s'"\ -" and pg_catalog.pg_table_is_visible(c2.oid)"\ -" and c2.relispartition = 'true'" +" ) ss "\ +" WHERE val LIKE '%s'"\ +" and pg_catalog.lower(name)=pg_catalog.lower('%s')" + +#define Query_for_list_of_channels \ +" SELECT channel "\ +" FROM pg_catalog.pg_listening_channels() AS channel "\ +" WHERE channel LIKE '%s'" #define Query_for_list_of_cursors \ -" SELECT pg_catalog.quote_ident(name) "\ +" SELECT name "\ " FROM pg_catalog.pg_cursors "\ -" WHERE substring(pg_catalog.quote_ident(name),1,%d)='%s'" +" 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 7.4. We use the VersionedQuery infrastructure so that + * server version 9.2. We use the VersionedQuery infrastructure so that * we don't send certain-to-fail queries to older servers. */ static const VersionedQuery Query_for_list_of_publications[] = { {100000, - " SELECT pg_catalog.quote_ident(pubname) " + " SELECT pubname " " FROM pg_catalog.pg_publication " - " WHERE substring(pg_catalog.quote_ident(pubname),1,%d)='%s'" + " WHERE pubname LIKE '%s'" }, {0, NULL} }; static const VersionedQuery Query_for_list_of_subscriptions[] = { {100000, - " SELECT pg_catalog.quote_ident(s.subname) " + " SELECT s.subname " " FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d " - " WHERE substring(pg_catalog.quote_ident(s.subname),1,%d)='%s' " + " WHERE s.subname LIKE '%s' " " AND d.datname = pg_catalog.current_database() " " AND s.subdbid = d.oid" }, @@ -1056,9 +1177,11 @@ static const VersionedQuery Query_for_list_of_subscriptions[] = { typedef struct { const char *name; + /* Provide at most one of these three types of query: */ const char *query; /* simple query, or NULL */ const VersionedQuery *vquery; /* versioned query, or NULL */ const SchemaQuery *squery; /* schema query, or NULL */ + const char *const *keywords; /* keywords to be offered as well */ const bits32 flags; /* visibility flags, see below */ } pgsql_thing_t; @@ -1067,8 +1190,14 @@ typedef struct #define THING_NO_ALTER (1 << 2) /* should not show up after ALTER */ #define THING_NO_SHOW (THING_NO_CREATE | THING_NO_DROP | THING_NO_ALTER) +/* When we have DROP USER etc, also offer MAPPING FOR */ +static const char *const Keywords_for_user_thing[] = { + "MAPPING FOR", + NULL +}; + static const pgsql_thing_t words_after_create[] = { - {"ACCESS METHOD", NULL, NULL, NULL, THING_NO_ALTER}, + {"ACCESS METHOD", NULL, NULL, NULL, NULL, THING_NO_ALTER}, {"AGGREGATE", NULL, NULL, Query_for_list_of_aggregates}, {"CAST", NULL, NULL, NULL}, /* Casts have complex structures for names, so * skip it */ @@ -1078,11 +1207,11 @@ static const pgsql_thing_t words_after_create[] = { * CREATE CONSTRAINT TRIGGER is not supported here because it is designed * to be used only by pg_dump. */ - {"CONFIGURATION", Query_for_list_of_ts_configurations, NULL, NULL, THING_NO_SHOW}, - {"CONVERSION", "SELECT pg_catalog.quote_ident(conname) FROM pg_catalog.pg_conversion WHERE substring(pg_catalog.quote_ident(conname),1,%d)='%s'"}, + {"CONFIGURATION", NULL, NULL, &Query_for_list_of_ts_configurations, NULL, THING_NO_SHOW}, + {"CONVERSION", "SELECT conname FROM pg_catalog.pg_conversion WHERE conname LIKE '%s'"}, {"DATABASE", Query_for_list_of_databases}, - {"DEFAULT PRIVILEGES", NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, - {"DICTIONARY", Query_for_list_of_ts_dictionaries, NULL, NULL, THING_NO_SHOW}, + {"DEFAULT PRIVILEGES", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, + {"DICTIONARY", NULL, NULL, &Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW}, {"DOMAIN", NULL, NULL, &Query_for_list_of_domains}, {"EVENT TRIGGER", NULL, NULL, NULL}, {"EXTENSION", Query_for_list_of_extensions}, @@ -1092,41 +1221,41 @@ static const pgsql_thing_t words_after_create[] = { {"GROUP", Query_for_list_of_roles}, {"INDEX", NULL, NULL, &Query_for_list_of_indexes}, {"LANGUAGE", Query_for_list_of_languages}, - {"LARGE OBJECT", NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, + {"LARGE OBJECT", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, {"MATERIALIZED VIEW", NULL, NULL, &Query_for_list_of_matviews}, {"OPERATOR", NULL, NULL, NULL}, /* Querying for this is probably not such * a good idea. */ - {"OR REPLACE", NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, - {"OWNED", NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER}, /* for DROP OWNED BY ... */ - {"PARSER", Query_for_list_of_ts_parsers, NULL, NULL, THING_NO_SHOW}, + {"OR REPLACE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, + {"OWNED", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER}, /* for DROP OWNED BY ... */ + {"PARSER", NULL, NULL, &Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW}, {"POLICY", NULL, NULL, NULL}, {"PROCEDURE", NULL, NULL, Query_for_list_of_procedures}, {"PUBLICATION", NULL, Query_for_list_of_publications}, {"ROLE", Query_for_list_of_roles}, - {"ROUTINE", NULL, NULL, &Query_for_list_of_routines, THING_NO_CREATE}, - {"RULE", "SELECT pg_catalog.quote_ident(rulename) FROM pg_catalog.pg_rules WHERE substring(pg_catalog.quote_ident(rulename),1,%d)='%s'"}, + {"ROUTINE", NULL, NULL, &Query_for_list_of_routines, NULL, THING_NO_CREATE}, + {"RULE", "SELECT rulename FROM pg_catalog.pg_rules WHERE rulename LIKE '%s'"}, {"SCHEMA", Query_for_list_of_schemas}, {"SEQUENCE", NULL, NULL, &Query_for_list_of_sequences}, {"SERVER", Query_for_list_of_servers}, {"STATISTICS", NULL, NULL, &Query_for_list_of_statistics}, {"SUBSCRIPTION", NULL, Query_for_list_of_subscriptions}, - {"SYSTEM", NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, + {"SYSTEM", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP}, {"TABLE", NULL, NULL, &Query_for_list_of_tables}, {"TABLESPACE", Query_for_list_of_tablespaces}, - {"TEMP", NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMP TABLE - * ... */ - {"TEMPLATE", Query_for_list_of_ts_templates, NULL, NULL, THING_NO_SHOW}, - {"TEMPORARY", NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMPORARY - * TABLE ... */ + {"TEMP", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMP TABLE + * ... */ + {"TEMPLATE", NULL, NULL, &Query_for_list_of_ts_templates, NULL, THING_NO_SHOW}, + {"TEMPORARY", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMPORARY + * TABLE ... */ {"TEXT SEARCH", NULL, NULL, NULL}, - {"TRANSFORM", NULL, NULL, NULL}, - {"TRIGGER", "SELECT pg_catalog.quote_ident(tgname) FROM pg_catalog.pg_trigger WHERE substring(pg_catalog.quote_ident(tgname),1,%d)='%s' AND NOT tgisinternal"}, + {"TRANSFORM", NULL, NULL, NULL, NULL, THING_NO_ALTER}, + {"TRIGGER", "SELECT tgname FROM pg_catalog.pg_trigger WHERE tgname LIKE '%s' AND NOT tgisinternal"}, {"TYPE", NULL, NULL, &Query_for_list_of_datatypes}, - {"UNIQUE", NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNIQUE - * INDEX ... */ - {"UNLOGGED", NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNLOGGED - * TABLE ... */ - {"USER", Query_for_list_of_roles " UNION SELECT 'MAPPING FOR'"}, + {"UNIQUE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNIQUE + * INDEX ... */ + {"UNLOGGED", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNLOGGED + * TABLE ... */ + {"USER", Query_for_list_of_roles, NULL, NULL, Keywords_for_user_thing}, {"USER MAPPING FOR", NULL, NULL, NULL}, {"VIEW", NULL, NULL, &Query_for_list_of_views}, {NULL} /* end of list */ @@ -1187,7 +1316,11 @@ static char *complete_from_schema_query(const char *text, int state); static char *complete_from_versioned_schema_query(const char *text, int state); static char *_complete_from_query(const char *simple_query, const SchemaQuery *schema_query, + const char *const *keywords, + bool verbatim, const char *text, int state); +static void set_completion_reference(const char *word); +static void set_completion_reference_verbatim(const char *word); static char *complete_from_list(const char *text, int state); static char *complete_from_const(const char *text, int state); static void append_variable_names(char ***varnames, int *nvars, @@ -1199,6 +1332,13 @@ static char *complete_from_files(const char *text, int state); static char *pg_strdup_keyword_case(const char *s, const char *ref); static char *escape_string(const char *text); +static char *make_like_pattern(const char *word); +static void parse_identifier(const char *ident, + char **schemaname, char **objectname, + bool *schemaquoted, bool *objectquoted); +static char *requote_identifier(const char *schemaname, const char *objectname, + bool quote_schema, bool quote_object); +static bool identifier_needs_quotes(const char *ident); static PGresult *exec_query(const char *query); static char **get_previous_words(int point, char **buffer, int *nwords); @@ -1228,9 +1368,11 @@ initialize_readline(void) rl_basic_word_break_characters = WORD_BREAKS; /* - * We should include '"' in rl_completer_quote_characters too, but that - * will require some upgrades to how we handle quoted identifiers, so - * that's for another day. + * Ideally we'd include '"' in rl_completer_quote_characters too, which + * should allow us to complete quoted identifiers that include spaces. + * However, the library support for rl_completer_quote_characters is + * presently too inconsistent to want to mess with that. (Note in + * particular that libedit has this variable but completely ignores it.) */ rl_completer_quote_characters = "'"; @@ -1527,7 +1669,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 INTO", "MOVE", "NOTIFY", "PREPARE", "REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK", "SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START", @@ -1541,28 +1683,28 @@ 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", - "\\drds", "\\dRs", "\\dRp", "\\ds", "\\dS", + "\\drds", "\\dRs", "\\dRp", "\\ds", "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dX", "\\dy", - "\\e", "\\echo", "\\ef", "\\elif", "\\else", "\\encoding", + "\\echo", "\\edit", "\\ef", "\\elif", "\\else", "\\encoding", "\\endif", "\\errverbose", "\\ev", "\\f", - "\\g", "\\gdesc", "\\gexec", "\\gset", "\\gx", - "\\h", "\\help", "\\H", - "\\i", "\\if", "\\ir", - "\\l", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink", - "\\o", - "\\p", "\\password", "\\prompt", "\\pset", - "\\q", "\\qecho", - "\\r", + "\\g", "\\gdesc", "\\getenv", "\\gexec", "\\gset", "\\gx", + "\\help", "\\html", + "\\if", "\\include", "\\include_relative", "\\ir", + "\\list", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink", + "\\out", + "\\password", "\\print", "\\prompt", "\\pset", + "\\qecho", "\\quit", + "\\reset", "\\s", "\\set", "\\setenv", "\\sf", "\\sv", "\\t", "\\T", "\\timing", "\\unset", "\\x", - "\\w", "\\warn", "\\watch", + "\\warn", "\\watch", "\\write", "\\z", "\\!", "\\?", NULL @@ -1580,15 +1722,15 @@ psql_completion(const char *text, int start, int end) completion_last_char = (end > start) ? text[end - start - 1] : '\0'; /* We usually want the append character to be a space. */ -#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character = ' '; -#endif /* Clear a few things. */ completion_charp = NULL; completion_charpp = NULL; - completion_info_charp = NULL; - completion_info_charp2 = NULL; + completion_vquery = NULL; + completion_squery = NULL; + completion_ref_object = NULL; + completion_ref_schema = NULL; /* * Scan the input line to extract the words before our current position. @@ -1637,8 +1779,8 @@ psql_completion(const char *text, int start, int end) /* ALTER TABLE */ else if (Matches("ALTER", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - "UNION SELECT 'ALL IN TABLESPACE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, + "ALL IN TABLESPACE"); /* ALTER something */ else if (Matches("ALTER")) @@ -1675,17 +1817,48 @@ psql_completion(const char *text, int start, int end) /* ALTER PUBLICATION */ else if (Matches("ALTER", "PUBLICATION", MatchAny)) - COMPLETE_WITH("ADD TABLE", "DROP TABLE", "OWNER TO", "RENAME TO", "SET"); + COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME TO", "SET"); + /* ALTER PUBLICATION ADD */ + else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD")) + COMPLETE_WITH("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); + + /* + * "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 */ + else if (Matches("ALTER", "PUBLICATION", MatchAny, "DROP")) + COMPLETE_WITH("TABLES IN SCHEMA", "TABLE"); /* ALTER PUBLICATION SET */ else if (Matches("ALTER", "PUBLICATION", MatchAny, "SET")) - COMPLETE_WITH("(", "TABLE"); + COMPLETE_WITH("(", "TABLES IN SCHEMA", "TABLE"); + else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "TABLES", "IN", "SCHEMA")) + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas + " AND nspname NOT LIKE E'pg\\\\_%%'", + "CURRENT_SCHEMA"); /* ALTER PUBLICATION SET ( */ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("SET", "(")) COMPLETE_WITH("publish", "publish_via_partition_root"); /* 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) && @@ -1700,7 +1873,10 @@ 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", "disable_on_error", "slot_name", "streaming", "synchronous_commit"); + /* 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")) { @@ -1721,7 +1897,7 @@ psql_completion(const char *text, int start, int end) /* ALTER COLLATION */ else if (Matches("ALTER", "COLLATION", MatchAny)) - COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA"); + COMPLETE_WITH("OWNER TO", "REFRESH VERSION", "RENAME TO", "SET SCHEMA"); /* ALTER CONVERSION */ else if (Matches("ALTER", "CONVERSION", MatchAny)) @@ -1729,7 +1905,7 @@ psql_completion(const char *text, int start, int end) /* ALTER DATABASE */ else if (Matches("ALTER", "DATABASE", MatchAny)) - COMPLETE_WITH("RESET", "SET", "OWNER TO", "RENAME TO", + COMPLETE_WITH("RESET", "SET", "OWNER TO", "REFRESH COLLATION VERSION", "RENAME TO", "IS_TEMPLATE", "ALLOW_CONNECTIONS", "CONNECTION LIMIT"); @@ -1755,15 +1931,12 @@ psql_completion(const char *text, int start, int end) /* ALTER EXTENSION UPDATE */ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE")) - { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions_with_TO); - } + COMPLETE_WITH("TO"); /* ALTER EXTENSION UPDATE TO */ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE", "TO")) { - completion_info_charp = prev3_wd; + set_completion_reference(prev3_wd); COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions); } @@ -1773,7 +1946,10 @@ psql_completion(const char *text, int start, int end) /* ALTER FOREIGN DATA WRAPPER */ else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny)) - COMPLETE_WITH("HANDLER", "VALIDATOR", "OPTIONS", "OWNER TO", "RENAME TO"); + COMPLETE_WITH("HANDLER", "VALIDATOR", "NO", + "OPTIONS", "OWNER TO", "RENAME TO"); + else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny, "NO")) + COMPLETE_WITH("HANDLER", "VALIDATOR"); /* ALTER FOREIGN TABLE */ else if (Matches("ALTER", "FOREIGN", "TABLE", MatchAny)) @@ -1783,8 +1959,8 @@ psql_completion(const char *text, int start, int end) /* ALTER INDEX */ else if (Matches("ALTER", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - "UNION SELECT 'ALL IN TABLESPACE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes, + "ALL IN TABLESPACE"); /* ALTER INDEX */ else if (Matches("ALTER", "INDEX", MatchAny)) COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME TO", "SET", @@ -1793,15 +1969,15 @@ psql_completion(const char *text, int start, int end) else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH")) COMPLETE_WITH("PARTITION"); else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH", "PARTITION")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes); /* ALTER INDEX ALTER */ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER")) COMPLETE_WITH("COLUMN"); /* ALTER INDEX ALTER COLUMN */ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_attribute_numbers); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(Query_for_list_of_attribute_numbers); } /* ALTER INDEX ALTER COLUMN */ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny)) @@ -1850,8 +2026,8 @@ psql_completion(const char *text, int start, int end) /* ALTER MATERIALIZED VIEW */ else if (Matches("ALTER", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - "UNION SELECT 'ALL IN TABLESPACE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews, + "ALL IN TABLESPACE"); /* ALTER USER,ROLE */ else if (Matches("ALTER", "USER|ROLE", MatchAny) && @@ -1911,8 +2087,8 @@ psql_completion(const char *text, int start, int end) /* ALTER DOMAIN DROP|RENAME|VALIDATE CONSTRAINT */ else if (Matches("ALTER", "DOMAIN", MatchAny, "DROP|RENAME|VALIDATE", "CONSTRAINT")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_type); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_type); } /* ALTER DOMAIN RENAME */ else if (Matches("ALTER", "DOMAIN", MatchAny, "RENAME")) @@ -1926,12 +2102,18 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("DEFAULT", "NOT NULL", "SCHEMA"); /* ALTER SEQUENCE */ else if (Matches("ALTER", "SEQUENCE", MatchAny)) - COMPLETE_WITH("INCREMENT", "MINVALUE", "MAXVALUE", "RESTART", "NO", - "CACHE", "CYCLE", "SET SCHEMA", "OWNED BY", "OWNER TO", - "RENAME TO"); + COMPLETE_WITH("AS", "INCREMENT", "MINVALUE", "MAXVALUE", "RESTART", + "NO", "CACHE", "CYCLE", "SET", "OWNED BY", + "OWNER TO", "RENAME TO"); + /* ALTER SEQUENCE AS */ + else if (TailMatches("ALTER", "SEQUENCE", MatchAny, "AS")) + COMPLETE_WITH_CS("smallint", "integer", "bigint"); /* 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"); @@ -1942,7 +2124,8 @@ psql_completion(const char *text, int start, int end) else if (Matches("ALTER", "SYSTEM")) COMPLETE_WITH("SET", "RESET"); else if (Matches("ALTER", "SYSTEM", "SET|RESET")) - COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars); + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_alter_system_set_vars, + "ALL"); else if (Matches("ALTER", "SYSTEM", "SET", MatchAny)) COMPLETE_WITH("TO"); /* ALTER VIEW */ @@ -1951,9 +2134,13 @@ psql_completion(const char *text, int start, int end) "SET SCHEMA"); /* ALTER VIEW xxx RENAME */ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'TO'"); + COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO"); else if (Matches("ALTER", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, ""); + COMPLETE_WITH_ATTR(prev3_wd); + /* ALTER VIEW xxx ALTER [ COLUMN ] yyy */ + else if (Matches("ALTER", "VIEW", MatchAny, "ALTER", MatchAny) || + Matches("ALTER", "VIEW", MatchAny, "ALTER", "COLUMN", MatchAny)) + COMPLETE_WITH("SET DEFAULT", "DROP DEFAULT"); /* ALTER VIEW xxx RENAME yyy */ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO"))) COMPLETE_WITH("TO"); @@ -1968,9 +2155,9 @@ psql_completion(const char *text, int start, int end) "RESET (", "SET"); /* ALTER MATERIALIZED VIEW xxx RENAME */ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'TO'"); + COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO"); else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, ""); + COMPLETE_WITH_ATTR(prev3_wd); /* ALTER MATERIALIZED VIEW xxx RENAME yyy */ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO"))) COMPLETE_WITH("TO"); @@ -1979,7 +2166,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); @@ -1989,15 +2180,16 @@ psql_completion(const char *text, int start, int end) /* ALTER POLICY ON
*/ else if (Matches("ALTER", "POLICY", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy); } /* ALTER POLICY ON
- show options */ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny)) COMPLETE_WITH("RENAME TO", "TO", "USING (", "WITH CHECK ("); /* ALTER POLICY ON
TO */ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_grant_roles); /* ALTER POLICY ON
USING ( */ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "USING")) COMPLETE_WITH("("); @@ -2012,8 +2204,8 @@ psql_completion(const char *text, int start, int end) /* If we have ALTER RULE ON, then add the correct tablename */ else if (Matches("ALTER", "RULE", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule); } /* ALTER RULE ON */ @@ -2028,18 +2220,12 @@ psql_completion(const char *text, int start, int end) else if (Matches("ALTER", "TRIGGER", MatchAny)) COMPLETE_WITH("ON"); - else if (Matches("ALTER", "TRIGGER", MatchAny, MatchAny)) + else if (Matches("ALTER", "TRIGGER", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger); } - /* - * If we have ALTER TRIGGER ON, then add the correct tablename - */ - else if (Matches("ALTER", "TRIGGER", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); - /* ALTER TRIGGER ON */ else if (Matches("ALTER", "TRIGGER", MatchAny, "ON", MatchAny)) COMPLETE_WITH("RENAME TO", "DEPENDS ON EXTENSION", @@ -2054,6 +2240,53 @@ psql_completion(const char *text, int start, int end) "OWNER TO", "SET", "VALIDATE CONSTRAINT", "REPLICA IDENTITY", "ATTACH PARTITION", "DETACH PARTITION", "FORCE ROW LEVEL SECURITY"); + /* ALTER TABLE xxx ADD */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD")) + { + /* make sure to keep this list and the !Matches() below in sync */ + COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY", + "EXCLUDE", "FOREIGN KEY"); + } + /* 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"))) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); + /* ALTER TABLE xxx ADD CONSTRAINT yyy */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny)) + COMPLETE_WITH("CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY"); + /* ALTER TABLE xxx ADD [CONSTRAINT yyy] (PRIMARY KEY|UNIQUE) */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY") || + Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE") || + Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "PRIMARY", "KEY") || + Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "UNIQUE")) + COMPLETE_WITH("(", "USING INDEX"); + /* ALTER TABLE xxx ADD PRIMARY KEY USING INDEX */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY", "USING", "INDEX")) + { + set_completion_reference(prev6_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table); + } + /* ALTER TABLE xxx ADD UNIQUE USING INDEX */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE", "USING", "INDEX")) + { + set_completion_reference(prev5_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table); + } + /* ALTER TABLE xxx ADD CONSTRAINT yyy PRIMARY KEY USING INDEX */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, + "PRIMARY", "KEY", "USING", "INDEX")) + { + set_completion_reference(prev8_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table); + } + /* ALTER TABLE xxx ADD CONSTRAINT yyy UNIQUE USING INDEX */ + else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, + "UNIQUE", "USING", "INDEX")) + { + set_completion_reference(prev7_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table); + } /* ALTER TABLE xxx ENABLE */ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE")) COMPLETE_WITH("ALWAYS", "REPLICA", "ROW LEVEL SECURITY", "RULE", @@ -2062,56 +2295,56 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("RULE", "TRIGGER"); else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "RULE")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "RULE")) { - completion_info_charp = prev4_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + set_completion_reference(prev4_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "TRIGGER")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "TRIGGER")) { - completion_info_charp = prev4_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + set_completion_reference(prev4_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table); } /* ALTER TABLE xxx INHERIT */ else if (Matches("ALTER", "TABLE", MatchAny, "INHERIT")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* ALTER TABLE xxx NO */ else if (Matches("ALTER", "TABLE", MatchAny, "NO")) COMPLETE_WITH("FORCE ROW LEVEL SECURITY", "INHERIT"); /* ALTER TABLE xxx NO INHERIT */ else if (Matches("ALTER", "TABLE", MatchAny, "NO", "INHERIT")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* ALTER TABLE xxx DISABLE */ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE")) COMPLETE_WITH("ROW LEVEL SECURITY", "RULE", "TRIGGER"); else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "RULE")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "TRIGGER")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table); } /* ALTER TABLE xxx ALTER */ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'CONSTRAINT'"); + COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT"); /* ALTER TABLE xxx RENAME */ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'CONSTRAINT' UNION SELECT 'TO'"); + COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT", "TO"); else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|RENAME", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, ""); + COMPLETE_WITH_ATTR(prev3_wd); /* ALTER TABLE xxx RENAME yyy */ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME", MatchAnyExcept("CONSTRAINT|TO"))) @@ -2126,16 +2359,18 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("COLUMN", "CONSTRAINT"); /* If we have ALTER TABLE DROP COLUMN, provide list of columns */ else if (Matches("ALTER", "TABLE", MatchAny, "DROP", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, ""); - - /* - * If we have ALTER TABLE ALTER|DROP|RENAME|VALIDATE CONSTRAINT, - * provide list of constraints - */ - else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME|VALIDATE", "CONSTRAINT")) + COMPLETE_WITH_ATTR(prev3_wd); + /* ALTER TABLE ALTER|DROP|RENAME CONSTRAINT */ + else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME", "CONSTRAINT")) + { + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table); + } + /* ALTER TABLE VALIDATE CONSTRAINT */ + else if (Matches("ALTER", "TABLE", MatchAny, "VALIDATE", "CONSTRAINT")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table_not_validated); } /* ALTER TABLE ALTER [COLUMN] */ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) || @@ -2167,13 +2402,20 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); else if (Matches("ALTER", "TABLE", MatchAny, "CLUSTER", "ON")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table); } /* If we have ALTER TABLE SET, provide list of attributes and '(' */ else if (Matches("ALTER", "TABLE", MatchAny, "SET")) - COMPLETE_WITH("(", "LOGGED", "SCHEMA", "TABLESPACE", "UNLOGGED", - "WITH", "WITHOUT"); + COMPLETE_WITH("(", "ACCESS METHOD", "LOGGED", "SCHEMA", + "TABLESPACE", "UNLOGGED", "WITH", "WITHOUT"); + + /* + * If we have ALTER TABLE SET ACCESS METHOD provide a list of table + * AMs. + */ + else if (Matches("ALTER", "TABLE", MatchAny, "SET", "ACCESS", "METHOD")) + COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods); /* * If we have ALTER TABLE SET TABLESPACE provide a list of @@ -2192,8 +2434,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST(table_storage_parameters); else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING", "INDEX")) { - completion_info_charp = prev5_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + set_completion_reference(prev5_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING")) COMPLETE_WITH("INDEX"); @@ -2207,7 +2449,7 @@ psql_completion(const char *text, int start, int end) * tables. */ else if (Matches("ALTER", "TABLE", MatchAny, "ATTACH", "PARTITION")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* Limited completion support for partition bound specification */ else if (TailMatches("ATTACH", "PARTITION", MatchAny)) COMPLETE_WITH("FOR VALUES", "DEFAULT"); @@ -2220,8 +2462,8 @@ psql_completion(const char *text, int start, int end) */ else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION")) { - completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_partition_of_table); + set_completion_reference(prev3_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_partition_of_table); } else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION", MatchAny)) COMPLETE_WITH("CONCURRENTLY", "FINALIZE"); @@ -2269,7 +2511,7 @@ psql_completion(const char *text, int start, int end) * of attributes */ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER|DROP|RENAME", "ATTRIBUTE")) - COMPLETE_WITH_ATTR(prev3_wd, ""); + COMPLETE_WITH_ATTR(prev3_wd); /* ALTER TYPE ALTER ATTRIBUTE */ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER", "ATTRIBUTE", MatchAny)) COMPLETE_WITH("TYPE"); @@ -2294,8 +2536,8 @@ psql_completion(const char *text, int start, int end) * ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ] */ else if (Matches("ANALYZE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables, - " UNION SELECT 'VERBOSE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables, + "VERBOSE"); else if (HeadMatches("ANALYZE", "(*") && !HeadMatches("ANALYZE", "(*)")) { @@ -2311,9 +2553,9 @@ psql_completion(const char *text, int start, int end) } else if (HeadMatches("ANALYZE") && TailMatches("(")) /* "ANALYZE (" should be caught above, so assume we want columns */ - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); else if (HeadMatches("ANALYZE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables); /* BEGIN */ else if (Matches("BEGIN")) @@ -2334,19 +2576,20 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("CHAIN"); /* CALL */ else if (Matches("CALL")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures); else if (Matches("CALL", MatchAny)) COMPLETE_WITH("("); /* CLOSE */ else if (Matches("CLOSE")) - COMPLETE_WITH_QUERY(Query_for_list_of_cursors - " UNION SELECT 'ALL'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors, + "ALL"); /* CLUSTER */ else if (Matches("CLUSTER")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables, "UNION SELECT 'VERBOSE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_clusterables, + "VERBOSE"); else if (Matches("CLUSTER", "VERBOSE") || Matches("CLUSTER", "(*)")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables); /* If we have CLUSTER , then add "USING" */ else if (Matches("CLUSTER", MatchAnyExcept("VERBOSE|ON|(|(*)"))) COMPLETE_WITH("USING"); @@ -2357,8 +2600,8 @@ psql_completion(const char *text, int start, int end) else if (Matches("CLUSTER", MatchAny, "USING") || Matches("CLUSTER", "VERBOSE|(*)", MatchAny, "USING")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table); } else if (HeadMatches("CLUSTER", "(*") && !HeadMatches("CLUSTER", "(*)")) @@ -2376,38 +2619,87 @@ psql_completion(const char *text, int start, int end) else if (Matches("COMMENT")) COMPLETE_WITH("ON"); else if (Matches("COMMENT", "ON")) - COMPLETE_WITH("ACCESS METHOD", "CAST", "COLLATION", "CONVERSION", - "DATABASE", "EVENT TRIGGER", "EXTENSION", - "FOREIGN DATA WRAPPER", "FOREIGN TABLE", "SERVER", - "INDEX", "LANGUAGE", "POLICY", "PUBLICATION", "RULE", - "SCHEMA", "SEQUENCE", "STATISTICS", "SUBSCRIPTION", - "TABLE", "TYPE", "VIEW", "MATERIALIZED VIEW", - "COLUMN", "AGGREGATE", "FUNCTION", - "PROCEDURE", "ROUTINE", - "OPERATOR", "TRIGGER", "CONSTRAINT", "DOMAIN", - "LARGE OBJECT", "TABLESPACE", "TEXT SEARCH", "ROLE"); + COMPLETE_WITH("ACCESS METHOD", "AGGREGATE", "CAST", "COLLATION", + "COLUMN", "CONSTRAINT", "CONVERSION", "DATABASE", + "DOMAIN", "EXTENSION", "EVENT TRIGGER", + "FOREIGN DATA WRAPPER", "FOREIGN TABLE", + "FUNCTION", "INDEX", "LANGUAGE", "LARGE OBJECT", + "MATERIALIZED VIEW", "OPERATOR", "POLICY", + "PROCEDURE", "PROCEDURAL LANGUAGE", "PUBLICATION", "ROLE", + "ROUTINE", "RULE", "SCHEMA", "SEQUENCE", "SERVER", + "STATISTICS", "SUBSCRIPTION", "TABLE", + "TABLESPACE", "TEXT SEARCH", "TRANSFORM FOR", + "TRIGGER", "TYPE", "VIEW"); else if (Matches("COMMENT", "ON", "ACCESS", "METHOD")) COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); - else if (Matches("COMMENT", "ON", "FOREIGN")) - COMPLETE_WITH("DATA WRAPPER", "TABLE"); - else if (Matches("COMMENT", "ON", "TEXT", "SEARCH")) - COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); else if (Matches("COMMENT", "ON", "CONSTRAINT")) COMPLETE_WITH_QUERY(Query_for_all_table_constraints); else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny)) COMPLETE_WITH("ON"); else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_constraint); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables_for_constraint, + "DOMAIN"); } - else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON", "DOMAIN")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains); else if (Matches("COMMENT", "ON", "EVENT", "TRIGGER")) COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + else if (Matches("COMMENT", "ON", "FOREIGN")) + COMPLETE_WITH("DATA WRAPPER", "TABLE"); + else if (Matches("COMMENT", "ON", "FOREIGN", "TABLE")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables); + else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews); + else if (Matches("COMMENT", "ON", "POLICY")) + COMPLETE_WITH_QUERY(Query_for_list_of_policies); + else if (Matches("COMMENT", "ON", "POLICY", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "POLICY", MatchAny, "ON")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy); + } + else if (Matches("COMMENT", "ON", "PROCEDURAL", "LANGUAGE")) + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + else if (Matches("COMMENT", "ON", "RULE", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "RULE", MatchAny, "ON")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule); + } + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH")) + COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "CONFIGURATION")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations); + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "DICTIONARY")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries); + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "PARSER")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers); + else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "TEMPLATE")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny)) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny, "LANGUAGE")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + } + else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny)) + COMPLETE_WITH("ON"); + else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny, "ON")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger); + } else if (Matches("COMMENT", "ON", MatchAny, MatchAnyExcept("IS")) || Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAnyExcept("IS")) || - Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS"))) + Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")) || + Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS"))) COMPLETE_WITH("IS"); /* COPY */ @@ -2417,8 +2709,7 @@ psql_completion(const char *text, int start, int end) * backslash command). */ else if (Matches("COPY|\\copy")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - " UNION ALL SELECT '('"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, "("); /* Complete COPY ( with legal query commands */ else if (Matches("COPY|\\copy", "(")) COMPLETE_WITH("SELECT", "TABLE", "VALUES", "INSERT INTO", "UPDATE", "DELETE FROM", "WITH"); @@ -2476,7 +2767,7 @@ psql_completion(const char *text, int start, int end) else if (Matches("CREATE", "COLLATION", MatchAny)) COMPLETE_WITH("(", "FROM"); else if (Matches("CREATE", "COLLATION", MatchAny, "FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations); else if (HeadMatches("CREATE", "COLLATION", MatchAny, "(*")) { if (TailMatches("(|*,")) @@ -2491,12 +2782,26 @@ 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"); + "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)) + COMPLETE_WITH("AS"); + else if (Matches("CREATE", "DOMAIN", MatchAny, "AS")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); + else if (Matches("CREATE", "DOMAIN", MatchAny, "AS", MatchAny)) + COMPLETE_WITH("COLLATE", "DEFAULT", "CONSTRAINT", + "NOT NULL", "NULL", "CHECK ("); + else if (Matches("CREATE", "DOMAIN", MatchAny, "COLLATE")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations); /* CREATE EXTENSION */ /* Complete with available extensions rather than installed ones. */ @@ -2508,7 +2813,7 @@ psql_completion(const char *text, int start, int end) /* CREATE EXTENSION VERSION */ else if (Matches("CREATE", "EXTENSION", MatchAny, "VERSION")) { - completion_info_charp = prev2_wd; + set_completion_reference(prev2_wd); COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions); } @@ -2520,6 +2825,10 @@ psql_completion(const char *text, int start, int end) else if (Matches("CREATE", "FOREIGN", "DATA", "WRAPPER", MatchAny)) COMPLETE_WITH("HANDLER", "VALIDATOR", "OPTIONS"); + /* CREATE FOREIGN TABLE */ + else if (Matches("CREATE", "FOREIGN", "TABLE", MatchAny)) + COMPLETE_WITH("(", "PARTITION OF"); + /* CREATE INDEX --- is allowed inside CREATE SCHEMA, so use TailMatches */ /* First off we complete CREATE UNIQUE with "INDEX" */ else if (TailMatches("CREATE", "UNIQUE")) @@ -2530,9 +2839,8 @@ psql_completion(const char *text, int start, int end) * existing indexes */ else if (TailMatches("CREATE|UNIQUE", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - " UNION SELECT 'ON'" - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes, + "ON", "CONCURRENTLY"); /* * Complete ... INDEX|CONCURRENTLY [] ON with a list of relations @@ -2540,15 +2848,15 @@ psql_completion(const char *text, int start, int end) */ else if (TailMatches("INDEX|CONCURRENTLY", MatchAny, "ON") || TailMatches("INDEX|CONCURRENTLY", "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables); /* * Complete CREATE|UNIQUE INDEX CONCURRENTLY with "ON" and existing * indexes */ else if (TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - " UNION SELECT 'ON'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes, + "ON"); /* Complete CREATE|UNIQUE INDEX [CONCURRENTLY] with "ON" */ else if (TailMatches("CREATE|UNIQUE", "INDEX", MatchAny) || TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY", MatchAny)) @@ -2563,10 +2871,10 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("(", "USING"); else if (TailMatches("INDEX", MatchAny, "ON", MatchAny, "(") || TailMatches("INDEX|CONCURRENTLY", "ON", MatchAny, "(")) - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); /* same if you put in USING */ else if (TailMatches("ON", MatchAny, "USING", MatchAny, "(")) - COMPLETE_WITH_ATTR(prev4_wd, ""); + COMPLETE_WITH_ATTR(prev4_wd); /* Complete USING with an index method */ else if (TailMatches("INDEX", MatchAny, MatchAny, "ON", MatchAny, "USING") || TailMatches("INDEX", MatchAny, "ON", MatchAny, "USING") || @@ -2587,7 +2895,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); /* Complete "CREATE POLICY ON
" */ else if (Matches("CREATE", "POLICY", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* Complete "CREATE POLICY ON
AS|FOR|TO|USING|WITH CHECK" */ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny)) COMPLETE_WITH("AS", "FOR", "TO", "USING (", "WITH CHECK ("); @@ -2615,7 +2923,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TO", "USING (", "WITH CHECK ("); /* Complete "CREATE POLICY ON
TO " */ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_grant_roles); /* Complete "CREATE POLICY ON
USING (" */ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "USING")) COMPLETE_WITH("("); @@ -2653,7 +2962,8 @@ psql_completion(const char *text, int start, int end) * " */ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_grant_roles); /* * Complete "CREATE POLICY ON
AS PERMISSIVE|RESTRICTIVE @@ -2665,12 +2975,41 @@ psql_completion(const char *text, int start, int end) /* CREATE PUBLICATION */ else if (Matches("CREATE", "PUBLICATION", MatchAny)) - COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "WITH ("); + COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR TABLES IN SCHEMA", "WITH ("); else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR")) - COMPLETE_WITH("TABLE", "ALL TABLES"); - /* Complete "CREATE PUBLICATION FOR TABLE
, ..." */ - else if (HeadMatches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH("TABLE", "ALL TABLES", "TABLES IN SCHEMA"); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL")) + COMPLETE_WITH("TABLES"); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES")) + COMPLETE_WITH("WITH ("); + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES")) + COMPLETE_WITH("IN SCHEMA"); + 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 TABLES IN SCHEMA , ..." + */ + else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "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", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ','))) + COMPLETE_WITH("WITH ("); /* Complete "CREATE PUBLICATION [...] WITH" */ else if (HeadMatches("CREATE", "PUBLICATION") && TailMatches("WITH", "(")) COMPLETE_WITH("publish", "publish_via_partition_root"); @@ -2697,13 +3036,16 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TO"); /* Complete "AS ON TO" with a table name */ else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */ else if (TailMatches("CREATE", "SEQUENCE", MatchAny) || TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny)) - COMPLETE_WITH("INCREMENT BY", "MINVALUE", "MAXVALUE", "NO", "CACHE", - "CYCLE", "OWNED BY", "START WITH"); + COMPLETE_WITH("AS", "INCREMENT BY", "MINVALUE", "MAXVALUE", "NO", + "CACHE", "CYCLE", "OWNED BY", "START WITH"); + else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") || + TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "AS")) + COMPLETE_WITH_CS("smallint", "integer", "bigint"); else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "NO") || TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "NO")) COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE"); @@ -2721,7 +3063,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); else if (HeadMatches("CREATE", "STATISTICS", MatchAny) && TailMatches("FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* CREATE TABLE --- is allowed inside CREATE SCHEMA, so use TailMatches */ /* Complete "CREATE TEMP/TEMPORARY" with the possible temp objects */ @@ -2735,7 +3077,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("RANGE (", "LIST (", "HASH ("); /* If we have xxx PARTITION OF, provide a list of partitioned tables */ else if (TailMatches("PARTITION", "OF")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables, ""); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables); /* Limited completion support for partition bound specification */ else if (TailMatches("PARTITION", "OF", MatchAny)) COMPLETE_WITH("FOR VALUES", "DEFAULT"); @@ -2746,7 +3088,7 @@ psql_completion(const char *text, int start, int end) /* Complete CREATE TABLE OF with list of composite types */ else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") || TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes); /* Complete CREATE TABLE name (...) with supported options */ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") || TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)")) @@ -2779,6 +3121,23 @@ psql_completion(const char *text, int start, int end) else if (Matches("CREATE", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny)) COMPLETE_WITH("("); +/* CREATE TRANSFORM */ + else if (Matches("CREATE", "TRANSFORM") || + Matches("CREATE", "OR", "REPLACE", "TRANSFORM")) + COMPLETE_WITH("FOR"); + else if (Matches("CREATE", "TRANSFORM", "FOR") || + Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); + else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny) || + Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny)) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE") || + Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + } + /* CREATE SUBSCRIPTION */ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny)) COMPLETE_WITH("CONNECTION"); @@ -2794,8 +3153,8 @@ psql_completion(const char *text, int start, int end) /* Complete "CREATE SUBSCRIPTION ... WITH ( " */ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("WITH", "(")) COMPLETE_WITH("binary", "connect", "copy_data", "create_slot", - "enabled", "slot_name", "streaming", - "synchronous_commit"); + "disable_on_error", "enabled", "slot_name", "streaming", + "synchronous_commit", "two_phase"); /* CREATE TRIGGER --- is allowed inside CREATE SCHEMA, so use TailMatches */ @@ -2836,7 +3195,7 @@ psql_completion(const char *text, int start, int end) */ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON") || TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* * Complete CREATE [ OR REPLACE ] TRIGGER ... INSTEAD OF event ON with a @@ -2844,7 +3203,7 @@ psql_completion(const char *text, int start, int end) */ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON") || TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views); else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("ON", MatchAny)) @@ -2949,7 +3308,7 @@ psql_completion(const char *text, int start, int end) else if ((HeadMatches("CREATE", "TRIGGER") || HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) && TailMatches("EXECUTE", "FUNCTION|PROCEDURE")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions); /* CREATE ROLE,USER,GROUP */ else if (Matches("CREATE", "ROLE|GROUP|USER", MatchAny) && @@ -2985,7 +3344,7 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("CREATE", "TYPE", MatchAny, "AS", "(")) { if (TailMatches("(|*,", MatchAny)) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatches("(|*,", MatchAny, MatchAnyExcept("*)"))) COMPLETE_WITH("COLLATE", ",", ")"); } @@ -3045,7 +3404,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 @@ -3069,18 +3429,18 @@ psql_completion(const char *text, int start, int end) } else if (HeadMatches("CREATE", "EVENT", "TRIGGER") && TailMatches("EXECUTE", "FUNCTION|PROCEDURE")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions); /* DEALLOCATE */ else if (Matches("DEALLOCATE")) - COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements - " UNION SELECT 'ALL'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_prepared_statements, + "ALL"); /* DECLARE */ /* - * Complete DECLARE with one of BINARY, INSENSITIVE, SCROLL, NO - * SCROLL, and CURSOR. + * Complete DECLARE with one of BINARY, ASENSITIVE, INSENSITIVE, + * SCROLL, NO SCROLL, and CURSOR. */ else if (Matches("DECLARE", MatchAny)) COMPLETE_WITH("BINARY", "ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL", @@ -3094,8 +3454,8 @@ psql_completion(const char *text, int start, int end) * indicates. */ else if (HeadMatches("DECLARE") && TailMatches("BINARY")) - COMPLETE_WITH("INSENSITIVE", "SCROLL", "NO SCROLL", "CURSOR"); - else if (HeadMatches("DECLARE") && TailMatches("INSENSITIVE")) + COMPLETE_WITH("ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL", "CURSOR"); + else if (HeadMatches("DECLARE") && TailMatches("ASENSITIVE|INSENSITIVE")) COMPLETE_WITH("SCROLL", "NO SCROLL", "CURSOR"); else if (HeadMatches("DECLARE") && TailMatches("SCROLL")) COMPLETE_WITH("CURSOR"); @@ -3122,7 +3482,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("FROM"); /* Complete DELETE FROM with a list of tables */ else if (TailMatches("DELETE", "FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables); /* Complete DELETE FROM
*/ else if (TailMatches("DELETE", "FROM", MatchAny)) COMPLETE_WITH("USING", "WHERE"); @@ -3164,10 +3524,10 @@ psql_completion(const char *text, int start, int end) /* DROP INDEX */ else if (Matches("DROP", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes, + "CONCURRENTLY"); else if (Matches("DROP", "INDEX", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes); else if (Matches("DROP", "INDEX", MatchAny)) COMPLETE_WITH("CASCADE", "RESTRICT"); else if (Matches("DROP", "INDEX", "CONCURRENTLY", MatchAny)) @@ -3177,13 +3537,17 @@ psql_completion(const char *text, int start, int end) else if (Matches("DROP", "MATERIALIZED")) COMPLETE_WITH("VIEW"); else if (Matches("DROP", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews); + else if (Matches("DROP", "MATERIALIZED", "VIEW", MatchAny)) + COMPLETE_WITH("CASCADE", "RESTRICT"); /* DROP OWNED BY */ else if (Matches("DROP", "OWNED")) COMPLETE_WITH("BY"); else if (Matches("DROP", "OWNED", "BY")) COMPLETE_WITH_QUERY(Query_for_list_of_roles); + else if (Matches("DROP", "OWNED", "BY", MatchAny)) + COMPLETE_WITH("CASCADE", "RESTRICT"); /* DROP TEXT SEARCH */ else if (Matches("DROP", "TEXT", "SEARCH")) @@ -3194,8 +3558,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); else if (Matches("DROP", "TRIGGER", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger); } else if (Matches("DROP", "TRIGGER", MatchAny, "ON", MatchAny)) COMPLETE_WITH("CASCADE", "RESTRICT"); @@ -3221,21 +3585,38 @@ psql_completion(const char *text, int start, int end) /* DROP POLICY ON
*/ else if (Matches("DROP", "POLICY", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy); } + else if (Matches("DROP", "POLICY", MatchAny, "ON", MatchAny)) + COMPLETE_WITH("CASCADE", "RESTRICT"); /* DROP RULE */ else if (Matches("DROP", "RULE", MatchAny)) COMPLETE_WITH("ON"); else if (Matches("DROP", "RULE", MatchAny, "ON")) { - completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule); + set_completion_reference(prev2_wd); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule); } else if (Matches("DROP", "RULE", MatchAny, "ON", MatchAny)) COMPLETE_WITH("CASCADE", "RESTRICT"); + /* DROP TRANSFORM */ + else if (Matches("DROP", "TRANSFORM")) + COMPLETE_WITH("FOR"); + else if (Matches("DROP", "TRANSFORM", "FOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); + else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny)) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + } + else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE", MatchAny)) + COMPLETE_WITH("CASCADE", "RESTRICT"); + /* EXECUTE */ else if (Matches("EXECUTE")) COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements); @@ -3246,7 +3627,7 @@ psql_completion(const char *text, int start, int end) */ else if (Matches("EXPLAIN")) COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", - "ANALYZE", "VERBOSE"); + "MERGE INTO", "EXECUTE", "ANALYZE", "VERBOSE"); else if (HeadMatches("EXPLAIN", "(*") && !HeadMatches("EXPLAIN", "(*)")) { @@ -3265,11 +3646,12 @@ psql_completion(const char *text, int start, int end) } else if (Matches("EXPLAIN", "ANALYZE")) COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", - "VERBOSE"); + "MERGE INTO", "EXECUTE", "VERBOSE"); else if (Matches("EXPLAIN", "(*)") || Matches("EXPLAIN", "VERBOSE") || Matches("EXPLAIN", "ANALYZE", "VERBOSE")) - COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE"); + COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE", + "MERGE INTO", "EXECUTE"); /* FETCH && MOVE */ @@ -3278,28 +3660,28 @@ psql_completion(const char *text, int start, int end) * NEXT, PRIOR, FIRST, LAST, FROM, IN, and a list of cursors */ else if (Matches("FETCH|MOVE")) - COMPLETE_WITH_QUERY(Query_for_list_of_cursors - " UNION SELECT 'ABSOLUTE'" - " UNION SELECT 'BACKWARD'" - " UNION SELECT 'FORWARD'" - " UNION SELECT 'RELATIVE'" - " UNION SELECT 'ALL'" - " UNION SELECT 'NEXT'" - " UNION SELECT 'PRIOR'" - " UNION SELECT 'FIRST'" - " UNION SELECT 'LAST'" - " UNION SELECT 'FROM'" - " UNION SELECT 'IN'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors, + "ABSOLUTE", + "BACKWARD", + "FORWARD", + "RELATIVE", + "ALL", + "NEXT", + "PRIOR", + "FIRST", + "LAST", + "FROM", + "IN"); /* * Complete FETCH BACKWARD or FORWARD with one of ALL, FROM, IN, and a * list of cursors */ else if (Matches("FETCH|MOVE", "BACKWARD|FORWARD")) - COMPLETE_WITH_QUERY(Query_for_list_of_cursors - " UNION SELECT 'ALL'" - " UNION SELECT 'FROM'" - " UNION SELECT 'IN'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors, + "ALL", + "FROM", + "IN"); /* * Complete FETCH with "FROM" or "IN". These are equivalent, @@ -3309,9 +3691,9 @@ psql_completion(const char *text, int start, int end) else if (Matches("FETCH|MOVE", "ABSOLUTE|BACKWARD|FORWARD|RELATIVE", MatchAnyExcept("FROM|IN")) || Matches("FETCH|MOVE", "ALL|NEXT|PRIOR|FIRST|LAST")) - COMPLETE_WITH_QUERY(Query_for_list_of_cursors - " UNION SELECT 'FROM'" - " UNION SELECT 'IN'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors, + "FROM", + "IN"); /* Complete FETCH "FROM" or "IN" with a list of cursors */ else if (HeadMatches("FETCH|MOVE") && TailMatches("FROM|IN")) @@ -3330,7 +3712,7 @@ psql_completion(const char *text, int start, int end) /* FOREIGN TABLE */ else if (TailMatches("FOREIGN", "TABLE") && !TailMatches("CREATE", MatchAny, MatchAny)) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables); /* FOREIGN SERVER */ else if (TailMatches("FOREIGN", "SERVER")) @@ -3341,7 +3723,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 @@ -3352,27 +3735,62 @@ psql_completion(const char *text, int start, int end) "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", "EXECUTE", "USAGE", "ALL"); else - COMPLETE_WITH_QUERY(Query_for_list_of_roles - " UNION SELECT 'SELECT'" - " UNION SELECT 'INSERT'" - " UNION SELECT 'UPDATE'" - " UNION SELECT 'DELETE'" - " UNION SELECT 'TRUNCATE'" - " UNION SELECT 'REFERENCES'" - " UNION SELECT 'TRIGGER'" - " UNION SELECT 'CREATE'" - " UNION SELECT 'CONNECT'" - " UNION SELECT 'TEMPORARY'" - " UNION SELECT 'EXECUTE'" - " UNION SELECT 'USAGE'" - " UNION SELECT 'ALL'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + "GRANT", + "SELECT", + "INSERT", + "UPDATE", + "DELETE", + "TRUNCATE", + "REFERENCES", + "TRIGGER", + "CREATE", + "CONNECT", + "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_VERBATIM(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"); @@ -3385,14 +3803,12 @@ psql_completion(const char *text, int start, int end) /* * Complete GRANT/REVOKE ON with a list of appropriate relations. * - * Keywords like DATABASE, FUNCTION, LANGUAGE and SCHEMA added to query - * result via UNION; seems to work intuitively. - * * Note: GRANT/REVOKE can get quite complex; tab-completion as implemented * 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 @@ -3401,34 +3817,37 @@ psql_completion(const char *text, int start, int end) if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) COMPLETE_WITH("TABLES", "SEQUENCES", "FUNCTIONS", "PROCEDURES", "ROUTINES", "TYPES", "SCHEMAS"); else - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables, - " UNION SELECT 'ALL FUNCTIONS IN SCHEMA'" - " UNION SELECT 'ALL PROCEDURES IN SCHEMA'" - " UNION SELECT 'ALL ROUTINES IN SCHEMA'" - " UNION SELECT 'ALL SEQUENCES IN SCHEMA'" - " UNION SELECT 'ALL TABLES IN SCHEMA'" - " UNION SELECT 'DATABASE'" - " UNION SELECT 'DOMAIN'" - " UNION SELECT 'FOREIGN DATA WRAPPER'" - " UNION SELECT 'FOREIGN SERVER'" - " UNION SELECT 'FUNCTION'" - " UNION SELECT 'LANGUAGE'" - " UNION SELECT 'LARGE OBJECT'" - " UNION SELECT 'PROCEDURE'" - " UNION SELECT 'ROUTINE'" - " UNION SELECT 'SCHEMA'" - " UNION SELECT 'SEQUENCE'" - " UNION SELECT 'TABLE'" - " UNION SELECT 'TABLESPACE'" - " UNION SELECT 'TYPE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_grantables, + "ALL FUNCTIONS IN SCHEMA", + "ALL PROCEDURES IN SCHEMA", + "ALL ROUTINES IN SCHEMA", + "ALL SEQUENCES IN SCHEMA", + "ALL TABLES IN SCHEMA", + "DATABASE", + "DOMAIN", + "FOREIGN DATA WRAPPER", + "FOREIGN SERVER", + "FUNCTION", + "LANGUAGE", + "LARGE OBJECT", + "PARAMETER", + "PROCEDURE", + "ROUTINE", + "SCHEMA", + "SEQUENCE", + "TABLE", + "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"); /* @@ -3437,30 +3856,31 @@ 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); else if (TailMatches("DOMAIN")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains); else if (TailMatches("FUNCTION")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions); else if (TailMatches("LANGUAGE")) COMPLETE_WITH_QUERY(Query_for_list_of_languages); else if (TailMatches("PROCEDURE")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures); else if (TailMatches("ROUTINE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines); else if (TailMatches("SCHEMA")) COMPLETE_WITH_QUERY(Query_for_list_of_schemas); else if (TailMatches("SEQUENCE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); else if (TailMatches("TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables); else if (TailMatches("TABLESPACE")) COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); else if (TailMatches("TYPE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny)) COMPLETE_WITH("TO"); else @@ -3473,10 +3893,28 @@ psql_completion(const char *text, int start, int end) */ else if ((HeadMatches("GRANT") && TailMatches("TO")) || (HeadMatches("REVOKE") && TailMatches("FROM"))) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + 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(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_grant_roles); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny)) COMPLETE_WITH("TO"); @@ -3484,7 +3922,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"); @@ -3493,7 +3932,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"); @@ -3502,7 +3942,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"); @@ -3532,15 +3973,18 @@ 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"); /* Complete INSERT INTO with table names */ else if (TailMatches("INSERT", "INTO")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables); /* Complete "INSERT INTO
(" with attribute names */ else if (TailMatches("INSERT", "INTO", MatchAny, "(")) - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); /* * Complete INSERT INTO
with "(" or "VALUES" or "SELECT" or @@ -3570,43 +4014,130 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("("); /* LOCK */ - /* Complete LOCK [TABLE] with a list of tables */ + /* Complete LOCK [TABLE] [ONLY] with a list of tables */ else if (Matches("LOCK")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - " UNION SELECT 'TABLE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, + "TABLE", "ONLY"); else if (Matches("LOCK", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); - + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, + "ONLY"); + else if (Matches("LOCK", "TABLE", "ONLY") || Matches("LOCK", "ONLY")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); /* For the following, handle the case of a single table only for now */ - /* Complete LOCK [TABLE]
with "IN" */ - else if (Matches("LOCK", MatchAnyExcept("TABLE")) || - Matches("LOCK", "TABLE", MatchAny)) - COMPLETE_WITH("IN"); + /* Complete LOCK [TABLE] [ONLY]
with IN or NOWAIT */ + else if (Matches("LOCK", MatchAnyExcept("TABLE|ONLY")) || + Matches("LOCK", "TABLE", MatchAnyExcept("ONLY")) || + Matches("LOCK", "ONLY", MatchAny) || + Matches("LOCK", "TABLE", "ONLY", MatchAny)) + COMPLETE_WITH("IN", "NOWAIT"); - /* Complete LOCK [TABLE]
IN with a lock mode */ - else if (Matches("LOCK", MatchAny, "IN") || - Matches("LOCK", "TABLE", MatchAny, "IN")) + /* Complete LOCK [TABLE] [ONLY]
IN with a lock mode */ + else if (HeadMatches("LOCK") && TailMatches("IN")) COMPLETE_WITH("ACCESS SHARE MODE", "ROW SHARE MODE", "ROW EXCLUSIVE MODE", "SHARE UPDATE EXCLUSIVE MODE", "SHARE MODE", "SHARE ROW EXCLUSIVE MODE", "EXCLUSIVE MODE", "ACCESS EXCLUSIVE MODE"); - /* Complete LOCK [TABLE]
IN ACCESS|ROW with rest of lock mode */ - else if (Matches("LOCK", MatchAny, "IN", "ACCESS|ROW") || - Matches("LOCK", "TABLE", MatchAny, "IN", "ACCESS|ROW")) + /* + * Complete LOCK [TABLE][ONLY]
IN ACCESS|ROW with rest of lock + * mode + */ + else if (HeadMatches("LOCK") && TailMatches("IN", "ACCESS|ROW")) COMPLETE_WITH("EXCLUSIVE MODE", "SHARE MODE"); - /* Complete LOCK [TABLE]
IN SHARE with rest of lock mode */ - else if (Matches("LOCK", MatchAny, "IN", "SHARE") || - Matches("LOCK", "TABLE", MatchAny, "IN", "SHARE")) + /* Complete LOCK [TABLE] [ONLY]
IN SHARE with rest of lock mode */ + else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE")) COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE", "UPDATE EXCLUSIVE MODE"); + /* Complete LOCK [TABLE] [ONLY]
[IN lockmode MODE] with "NOWAIT" */ + else if (HeadMatches("LOCK") && TailMatches("MODE")) + COMPLETE_WITH("NOWAIT"); + +/* 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); + + /* Complete MERGE INTO
[[AS] ] with USING */ + else if (TailMatches("MERGE", "INTO", MatchAny)) + COMPLETE_WITH("USING", "AS"); + else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, MatchAnyExcept("USING|AS"))) + COMPLETE_WITH("USING"); + + /* + * Complete MERGE INTO ... USING with a list of relations supporting + * SELECT + */ + else if (TailMatches("MERGE", "INTO", MatchAny, "USING") || + TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING") || + TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables); + + /* + * Complete MERGE INTO
[[AS] ] USING [[AS] + * alias] with ON + */ + else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny)) + COMPLETE_WITH("AS", "ON"); + else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, "AS", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, "AS", MatchAny) || + TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) || + TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) || + TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS"))) + COMPLETE_WITH("ON"); + + /* Complete MERGE INTO ... ON with target table attributes */ + 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); + + /* + * Complete ... USING [[AS] alias] ON join condition + * (consisting of one or three words typically used) with WHEN [NOT] + * MATCHED + */ + else if (TailMatches("USING", MatchAny, "ON", MatchAny) || + TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny) || + TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny) || + TailMatches("USING", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) || + TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) || + TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN"))) + COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED"); + else if (TailMatches("USING", MatchAny, "ON", MatchAny, "WHEN") || + TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, "WHEN") || + TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, "WHEN") || + TailMatches("USING", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") || + TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") || + TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN")) + COMPLETE_WITH("MATCHED", "NOT MATCHED"); + + /* Complete ... WHEN [NOT] MATCHED with THEN/AND */ + else if (TailMatches("WHEN", "MATCHED") || + TailMatches("WHEN", "NOT", "MATCHED")) + COMPLETE_WITH("THEN", "AND"); + + /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */ + else if (TailMatches("WHEN", "MATCHED", "THEN")) + COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING"); + + /* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */ + else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN")) + COMPLETE_WITH("INSERT", "DO NOTHING"); + /* NOTIFY --- can be inside EXPLAIN, RULE, etc */ else if (TailMatches("NOTIFY")) - COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s'"); + COMPLETE_WITH_QUERY(Query_for_list_of_channels); /* OPTIONS */ else if (TailMatches("OPTIONS")) @@ -3620,7 +4151,7 @@ psql_completion(const char *text, int start, int end) else if (TailMatches("FROM", MatchAny, "ORDER")) COMPLETE_WITH("BY"); else if (TailMatches("FROM", MatchAny, "ORDER", "BY")) - COMPLETE_WITH_ATTR(prev3_wd, ""); + COMPLETE_WITH_ATTR(prev3_wd); /* PREPARE xx AS */ else if (Matches("PREPARE", MatchAny, "AS")) @@ -3649,10 +4180,10 @@ psql_completion(const char *text, int start, int end) else if (Matches("REFRESH", "MATERIALIZED")) COMPLETE_WITH("VIEW"); else if (Matches("REFRESH", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews, + "CONCURRENTLY"); else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews); else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny)) COMPLETE_WITH("WITH"); else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny)) @@ -3672,26 +4203,26 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TABLE", "INDEX", "SYSTEM", "SCHEMA", "DATABASE"); else if (Matches("REINDEX", "TABLE") || Matches("REINDEX", "(*)", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables, - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexables, + "CONCURRENTLY"); else if (Matches("REINDEX", "INDEX") || Matches("REINDEX", "(*)", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes, + "CONCURRENTLY"); else if (Matches("REINDEX", "SCHEMA") || Matches("REINDEX", "(*)", "SCHEMA")) - COMPLETE_WITH_QUERY(Query_for_list_of_schemas - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas, + "CONCURRENTLY"); else if (Matches("REINDEX", "SYSTEM|DATABASE") || Matches("REINDEX", "(*)", "SYSTEM|DATABASE")) - COMPLETE_WITH_QUERY(Query_for_list_of_databases - " UNION SELECT 'CONCURRENTLY'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_databases, + "CONCURRENTLY"); else if (Matches("REINDEX", "TABLE", "CONCURRENTLY") || Matches("REINDEX", "(*)", "TABLE", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables); else if (Matches("REINDEX", "INDEX", "CONCURRENTLY") || Matches("REINDEX", "(*)", "INDEX", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes); else if (Matches("REINDEX", "SCHEMA", "CONCURRENTLY") || Matches("REINDEX", "(*)", "SCHEMA", "CONCURRENTLY")) COMPLETE_WITH_QUERY(Query_for_list_of_schemas); @@ -3735,9 +4266,19 @@ psql_completion(const char *text, int start, int end) /* SET, RESET, SHOW */ /* Complete with a variable name */ else if (TailMatches("SET|RESET") && !TailMatches("UPDATE", MatchAny, "SET")) - COMPLETE_WITH_QUERY(Query_for_list_of_set_vars); + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + "CONSTRAINTS", + "TRANSACTION", + "SESSION", + "ROLE", + "TABLESPACE", + "ALL"); else if (Matches("SHOW")) - COMPLETE_WITH_QUERY(Query_for_list_of_show_vars); + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars, + "SESSION AUTHORIZATION", + "ALL"); + else if (Matches("SHOW", "SESSION")) + COMPLETE_WITH("AUTHORIZATION"); /* Complete "SET TRANSACTION" */ else if (Matches("SET", "TRANSACTION")) COMPLETE_WITH("SNAPSHOT", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE"); @@ -3772,7 +4313,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ONLY", "WRITE"); /* SET CONSTRAINTS */ else if (Matches("SET", "CONSTRAINTS")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_constraints_with_schema, "UNION SELECT 'ALL'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_constraints_with_schema, + "ALL"); /* Complete SET CONSTRAINTS with DEFERRED|IMMEDIATE */ else if (Matches("SET", "CONSTRAINTS", MatchAny)) COMPLETE_WITH("DEFERRED", "IMMEDIATE"); @@ -3784,7 +4326,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION"); /* Complete SET SESSION AUTHORIZATION with username */ else if (Matches("SET", "SESSION", "AUTHORIZATION")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles " UNION SELECT 'DEFAULT'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + "DEFAULT"); /* Complete RESET SESSION with AUTHORIZATION */ else if (Matches("RESET", "SESSION")) COMPLETE_WITH("AUTHORIZATION"); @@ -3815,10 +4358,15 @@ psql_completion(const char *text, int start, int end) "US", "European", "NonEuropean", "DEFAULT"); else if (TailMatches("search_path", "TO|=")) - COMPLETE_WITH_QUERY(Query_for_list_of_schemas - " AND nspname not like 'pg\\_toast%%' " - " AND nspname not like 'pg\\_temp%%' " - " UNION SELECT 'DEFAULT' "); + { + /* Here, we want to allow pg_catalog, so use narrower exclusion */ + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas + " AND nspname NOT LIKE E'pg\\\\_toast%%'" + " AND nspname NOT LIKE E'pg\\\\_temp%%'", + "DEFAULT"); + } + else if (TailMatches("TimeZone", "TO|=")) + COMPLETE_WITH_TIMEZONE_NAME(); else { /* generic, type based, GUC support */ @@ -3833,11 +4381,9 @@ psql_completion(const char *text, int start, int end) { if (strcmp(guctype, "enum") == 0) { - char querybuf[1024]; - - snprintf(querybuf, sizeof(querybuf), - Query_for_enum, prev2_wd); - COMPLETE_WITH_QUERY(querybuf); + set_completion_reference_verbatim(prev2_wd); + COMPLETE_WITH_QUERY_PLUS(Query_for_values_of_enum_GUC, + "DEFAULT"); } else if (strcmp(guctype, "bool") == 0) COMPLETE_WITH("on", "off", "true", "false", "yes", "no", @@ -3856,7 +4402,7 @@ psql_completion(const char *text, int start, int end) /* TABLE, but not TABLE embedded in other commands */ else if (Matches("TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables); /* TABLESAMPLE */ else if (TailMatches("TABLESAMPLE")) @@ -3866,14 +4412,13 @@ psql_completion(const char *text, int start, int end) /* TRUNCATE */ else if (Matches("TRUNCATE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables, - " UNION SELECT 'TABLE'" - " UNION SELECT 'ONLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables, + "TABLE", "ONLY"); else if (Matches("TRUNCATE", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables, - " UNION SELECT 'ONLY'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables, + "ONLY"); else if (HeadMatches("TRUNCATE") && TailMatches("ONLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables); else if (Matches("TRUNCATE", MatchAny) || Matches("TRUNCATE", "TABLE|ONLY", MatchAny) || Matches("TRUNCATE", "TABLE", "ONLY", MatchAny)) @@ -3883,18 +4428,18 @@ psql_completion(const char *text, int start, int end) /* UNLISTEN */ else if (Matches("UNLISTEN")) - COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s' UNION SELECT '*'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_channels, "*"); /* UPDATE --- can be inside EXPLAIN, RULE, etc */ /* If prev. word is UPDATE suggest a list of tables */ else if (TailMatches("UPDATE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables); /* Complete UPDATE
with "SET" */ else if (TailMatches("UPDATE", MatchAny)) COMPLETE_WITH("SET"); /* Complete UPDATE
SET with list of attributes */ else if (TailMatches("UPDATE", MatchAny, "SET")) - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); /* UPDATE
SET = */ else if (TailMatches("UPDATE", MatchAny, "SET", MatchAnyExcept("*="))) COMPLETE_WITH("="); @@ -3903,11 +4448,11 @@ psql_completion(const char *text, int start, int end) else if (Matches("ALTER|CREATE|DROP", "USER", "MAPPING")) COMPLETE_WITH("FOR"); else if (Matches("CREATE", "USER", "MAPPING", "FOR")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles - " UNION SELECT 'CURRENT_ROLE'" - " UNION SELECT 'CURRENT_USER'" - " UNION SELECT 'PUBLIC'" - " UNION SELECT 'USER'"); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + "CURRENT_ROLE", + "CURRENT_USER", + "PUBLIC", + "USER"); else if (Matches("ALTER|DROP", "USER", "MAPPING", "FOR")) COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings); else if (Matches("CREATE|ALTER|DROP", "USER", "MAPPING", "FOR", MatchAny)) @@ -3920,26 +4465,26 @@ psql_completion(const char *text, int start, int end) * VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ] */ else if (Matches("VACUUM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables, - " UNION SELECT 'FULL'" - " UNION SELECT 'FREEZE'" - " UNION SELECT 'ANALYZE'" - " UNION SELECT 'VERBOSE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "FULL", + "FREEZE", + "ANALYZE", + "VERBOSE"); else if (Matches("VACUUM", "FULL")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables, - " UNION SELECT 'FREEZE'" - " UNION SELECT 'ANALYZE'" - " UNION SELECT 'VERBOSE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "FREEZE", + "ANALYZE", + "VERBOSE"); else if (Matches("VACUUM", "FREEZE") || Matches("VACUUM", "FULL", "FREEZE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables, - " UNION SELECT 'VERBOSE'" - " UNION SELECT 'ANALYZE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "VERBOSE", + "ANALYZE"); else if (Matches("VACUUM", "VERBOSE") || Matches("VACUUM", "FULL|FREEZE", "VERBOSE") || Matches("VACUUM", "FULL", "FREEZE", "VERBOSE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables, - " UNION SELECT 'ANALYZE'"); + COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables, + "ANALYZE"); else if (HeadMatches("VACUUM", "(*") && !HeadMatches("VACUUM", "(*)")) { @@ -3960,9 +4505,9 @@ psql_completion(const char *text, int start, int end) } else if (HeadMatches("VACUUM") && TailMatches("(")) /* "VACUUM (" should be caught above, so assume we want columns */ - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); else if (HeadMatches("VACUUM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables); /* WITH [RECURSIVE] */ @@ -3976,16 +4521,16 @@ psql_completion(const char *text, int start, int end) /* WHERE */ /* Simple case of the word before the where being the table name */ else if (TailMatches(MatchAny, "WHERE")) - COMPLETE_WITH_ATTR(prev2_wd, ""); + COMPLETE_WITH_ATTR(prev2_wd); /* ... FROM ... */ /* TODO: also include SRF ? */ else if (TailMatches("FROM") && !Matches("COPY|\\copy", MatchAny, "FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables); /* ... JOIN ... */ else if (TailMatches("JOIN")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables); /* Backslash commands */ /* TODO: \dc \dd \dl */ @@ -4002,19 +4547,21 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_QUERY(Query_for_list_of_roles); } else if (TailMatchesCS("\\da*")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates); else if (TailMatchesCS("\\dAc*", MatchAny) || TailMatchesCS("\\dAf*", MatchAny)) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatchesCS("\\dAo*", MatchAny) || TailMatchesCS("\\dAp*", MatchAny)) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families); else if (TailMatchesCS("\\dA*")) 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, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains); else if (TailMatchesCS("\\des*")) COMPLETE_WITH_QUERY(Query_for_list_of_servers); else if (TailMatchesCS("\\deu*")) @@ -4022,69 +4569,69 @@ psql_completion(const char *text, int start, int end) else if (TailMatchesCS("\\dew*")) COMPLETE_WITH_QUERY(Query_for_list_of_fdws); else if (TailMatchesCS("\\df*")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions); else if (HeadMatchesCS("\\df*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatchesCS("\\dFd*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_dictionaries); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries); else if (TailMatchesCS("\\dFp*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_parsers); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers); else if (TailMatchesCS("\\dFt*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_templates); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates); /* must be at end of \dF alternatives: */ else if (TailMatchesCS("\\dF*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_configurations); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations); else if (TailMatchesCS("\\di*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes); else if (TailMatchesCS("\\dL*")) COMPLETE_WITH_QUERY(Query_for_list_of_languages); else if (TailMatchesCS("\\dn*")) COMPLETE_WITH_QUERY(Query_for_list_of_schemas); /* no support for completing operators, but we can complete types: */ else if (HeadMatchesCS("\\do*", MatchAny)) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatchesCS("\\dp") || TailMatchesCS("\\z")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables); else if (TailMatchesCS("\\dPi*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes); else if (TailMatchesCS("\\dPt*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables); else if (TailMatchesCS("\\dP*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations); else if (TailMatchesCS("\\ds*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences); else if (TailMatchesCS("\\dt*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); else if (TailMatchesCS("\\dT*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); else if (TailMatchesCS("\\du*") || TailMatchesCS("\\dg*")) COMPLETE_WITH_QUERY(Query_for_list_of_roles); else if (TailMatchesCS("\\dv*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views); else if (TailMatchesCS("\\dx*")) COMPLETE_WITH_QUERY(Query_for_list_of_extensions); else if (TailMatchesCS("\\dX*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics); else if (TailMatchesCS("\\dm*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews); else if (TailMatchesCS("\\dE*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables); else if (TailMatchesCS("\\dy*")) COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); /* must be at end of \d alternatives: */ else if (TailMatchesCS("\\d*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations); else if (TailMatchesCS("\\ef")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines); else if (TailMatchesCS("\\ev")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views); else if (TailMatchesCS("\\encoding")) - COMPLETE_WITH_QUERY(Query_for_list_of_encodings); + COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_encodings); else if (TailMatchesCS("\\h|\\help")) COMPLETE_WITH_LIST(sql_commands); else if (TailMatchesCS("\\h|\\help", MatchAny)) @@ -4162,7 +4709,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")) @@ -4183,9 +4730,9 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CS("default", "verbose", "terse", "sqlstate"); } else if (TailMatchesCS("\\sf*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines); else if (TailMatchesCS("\\sv*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views); else if (TailMatchesCS("\\cd|\\e|\\edit|\\g|\\gx|\\i|\\include|" "\\ir|\\include_relative|\\o|\\out|" "\\s|\\w|\\write|\\lo_import")) @@ -4202,19 +4749,21 @@ psql_completion(const char *text, int start, int end) */ else { - int i; + const pgsql_thing_t *wac; - for (i = 0; words_after_create[i].name; i++) + for (wac = words_after_create; wac->name != NULL; wac++) { - if (pg_strcasecmp(prev_wd, words_after_create[i].name) == 0) + if (pg_strcasecmp(prev_wd, wac->name) == 0) { - if (words_after_create[i].query) - COMPLETE_WITH_QUERY(words_after_create[i].query); - else if (words_after_create[i].vquery) - COMPLETE_WITH_VERSIONED_QUERY(words_after_create[i].vquery); - else if (words_after_create[i].squery) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(words_after_create[i].squery, - NULL); + if (wac->query) + COMPLETE_WITH_QUERY_LIST(wac->query, + wac->keywords); + else if (wac->vquery) + COMPLETE_WITH_VERSIONED_QUERY_LIST(wac->vquery, + wac->keywords); + else if (wac->squery) + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(wac->squery, + wac->keywords); break; } } @@ -4229,9 +4778,7 @@ psql_completion(const char *text, int start, int end) { COMPLETE_WITH_CONST(true, ""); /* Also, prevent Readline from appending stuff to the non-match */ -#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER rl_completion_append_character = '\0'; -#endif #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE rl_completion_suppress_quote = 1; #endif @@ -4241,6 +4788,12 @@ psql_completion(const char *text, int start, int end) free(previous_words); free(words_buffer); free(text_copy); + if (completion_ref_object) + free(completion_ref_object); + completion_ref_object = NULL; + if (completion_ref_schema) + free(completion_ref_schema); + completion_ref_schema = NULL; /* Return our Grand List O' Matches */ return matches; @@ -4327,7 +4880,8 @@ static char * complete_from_query(const char *text, int state) { /* query is assumed to work for any server version */ - return _complete_from_query(completion_charp, NULL, text, state); + return _complete_from_query(completion_charp, NULL, completion_charpp, + completion_verbatim, text, state); } static char * @@ -4342,22 +4896,22 @@ complete_from_versioned_query(const char *text, int state) if (vquery->query == NULL) return NULL; - return _complete_from_query(vquery->query, NULL, text, state); + return _complete_from_query(vquery->query, NULL, completion_charpp, + completion_verbatim, text, state); } static char * complete_from_schema_query(const char *text, int state) { /* query is assumed to work for any server version */ - return _complete_from_query(completion_charp, completion_squery, - text, state); + return _complete_from_query(NULL, completion_squery, completion_charpp, + completion_verbatim, text, state); } static char * complete_from_versioned_schema_query(const char *text, int state) { const SchemaQuery *squery = completion_squery; - const VersionedQuery *vquery = completion_vquery; /* Find appropriate array element */ while (pset.sversion < squery->min_server_version) @@ -4366,17 +4920,8 @@ complete_from_versioned_schema_query(const char *text, int state) if (squery->catname == NULL) return NULL; - /* Likewise for the add-on text, if any */ - if (vquery) - { - while (pset.sversion < vquery->min_server_version) - vquery++; - if (vquery->query == NULL) - return NULL; - } - - return _complete_from_query(vquery ? vquery->query : NULL, - squery, text, state); + return _complete_from_query(NULL, squery, completion_charpp, + completion_verbatim, text, state); } @@ -4387,35 +4932,55 @@ complete_from_versioned_schema_query(const char *text, int state) * * The query can be one of two kinds: * - * 1. A simple query which must contain a %d and a %s, which will be replaced - * by the string length of the text and the text itself. The query may also - * have up to four more %s in it; the first two such will be replaced by the - * value of completion_info_charp, the next two by the value of - * completion_info_charp2. + * 1. A simple query, which must contain a restriction clause of the form + * output LIKE '%s' + * where "output" is the same string that the query returns. The %s + * will be replaced by a LIKE pattern to match the already-typed text. + * There can be a second '%s', which will be replaced by a suitably-escaped + * version of the string provided in completion_ref_object. If there is a + * third '%s', it will be replaced by a suitably-escaped version of the string + * provided in completion_ref_schema. Those strings should be set up + * by calling set_completion_reference or set_completion_reference_verbatim. + * Simple queries should return a single column of matches. If "verbatim" + * is true, the matches are returned as-is; otherwise, they are taken to + * be SQL identifiers and quoted if necessary. * * 2. A schema query used for completion of both schema and relation names. - * These are more complex and must contain in the following order: - * %d %s %d %s %d %s %s %d %s - * where %d is the string length of the text and %s the text itself. + * This is represented by a SchemaQuery object; see that typedef for details. * - * If both simple_query and schema_query are non-NULL, then we construct - * a schema query and append the (uninterpreted) string simple_query to it. + * See top of file for examples of both kinds of query. * - * It is assumed that strings should be escaped to become SQL literals - * (that is, what is in the query is actually ... '%s' ...) + * In addition to the query itself, we accept a null-terminated array of + * literal keywords, which will be returned if they match the input-so-far + * (case insensitively). (These are in addition to keywords specified + * within the schema_query, if any.) * - * See top of file for examples of both kinds of query. + * If "verbatim" is true, then we use the given text as-is to match the + * query results; otherwise we parse it as a possibly-qualified identifier, + * and reconstruct suitable quoting afterward. + * + * "text" and "state" are supplied by Readline. "text" is the word we are + * trying to complete. "state" is zero on first call, nonzero later. * - * "text" and "state" are supplied by readline. + * readline will call this repeatedly with the same text and varying + * state. On each call, we are supposed to return a malloc'd string + * that is a candidate completion. Return NULL when done. */ static char * _complete_from_query(const char *simple_query, const SchemaQuery *schema_query, + const char *const *keywords, + bool verbatim, const char *text, int state) { static int list_index, - byte_length; + num_schema_only, + num_query_other, + num_keywords; static PGresult *result = NULL; + static bool non_empty_object; + static bool schemaquoted; + static bool objectquoted; /* * If this is the first time for this completion, we fetch a list of our @@ -4424,175 +4989,358 @@ _complete_from_query(const char *simple_query, if (state == 0) { PQExpBufferData query_buffer; - char *e_text; - char *e_info_charp; - char *e_info_charp2; - const char *pstr = text; - int char_length = 0; - + char *schemaname; + char *objectname; + char *e_object_like; + char *e_schemaname; + char *e_ref_object; + char *e_ref_schema; + + /* Reset static state, ensuring no memory leaks */ list_index = 0; - byte_length = strlen(text); + num_schema_only = 0; + num_query_other = 0; + num_keywords = 0; + PQclear(result); + result = NULL; - /* - * Count length as number of characters (not bytes), for passing to - * substring - */ - while (*pstr) + /* Parse text, splitting into schema and object name if needed */ + if (verbatim) { - char_length++; - pstr += PQmblenBounded(pstr, pset.encoding); + objectname = pg_strdup(text); + schemaname = NULL; + } + else + { + parse_identifier(text, + &schemaname, &objectname, + &schemaquoted, &objectquoted); } - /* Free any prior result */ - PQclear(result); - result = NULL; + /* Remember whether the user has typed anything in the object part */ + non_empty_object = (*objectname != '\0'); - /* Set up suitably-escaped copies of textual inputs */ - e_text = escape_string(text); + /* + * Convert objectname to a LIKE prefix pattern (e.g. 'foo%'), and set + * up suitably-escaped copies of all the strings we need. + */ + e_object_like = make_like_pattern(objectname); - if (completion_info_charp) - e_info_charp = escape_string(completion_info_charp); + if (schemaname) + e_schemaname = escape_string(schemaname); else - e_info_charp = NULL; + e_schemaname = NULL; - if (completion_info_charp2) - e_info_charp2 = escape_string(completion_info_charp2); + if (completion_ref_object) + e_ref_object = escape_string(completion_ref_object); else - e_info_charp2 = NULL; + e_ref_object = NULL; + + if (completion_ref_schema) + e_ref_schema = escape_string(completion_ref_schema); + else + e_ref_schema = NULL; initPQExpBuffer(&query_buffer); if (schema_query) { - /* schema_query gives us the pieces to assemble */ - const char *qualresult = schema_query->qualresult; - - if (qualresult == NULL) - qualresult = schema_query->result; - - /* Get unqualified names matching the input-so-far */ - appendPQExpBuffer(&query_buffer, "SELECT %s FROM %s WHERE ", - schema_query->result, - schema_query->catname); - if (schema_query->selcondition) - appendPQExpBuffer(&query_buffer, "%s AND ", - schema_query->selcondition); - appendPQExpBuffer(&query_buffer, "substring(%s,1,%d)='%s'", - schema_query->result, - char_length, e_text); - appendPQExpBuffer(&query_buffer, " AND %s", - schema_query->viscondition); + Assert(simple_query == NULL); /* - * When fetching relation names, suppress system catalogs unless - * the input-so-far begins with "pg_". This is a compromise - * between not offering system catalogs for completion at all, and - * having them swamp the result when the input is just "p". + * We issue different queries depending on whether the input is + * already qualified or not. schema_query gives us the pieces to + * assemble. */ - if (strcmp(schema_query->catname, - "pg_catalog.pg_class c") == 0 && - strncmp(text, "pg_", 3) != 0) + if (schemaname == NULL || schema_query->namespace == NULL) { - appendPQExpBufferStr(&query_buffer, - " AND c.relnamespace <> (SELECT oid FROM" - " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"); - } - - /* - * Add in matching schema names, but only if there is more than - * one potential match among schema names. - */ - appendPQExpBuffer(&query_buffer, "\nUNION\n" - "SELECT pg_catalog.quote_ident(n.nspname) || '.' " - "FROM pg_catalog.pg_namespace n " - "WHERE substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d)='%s'", - char_length, e_text); - appendPQExpBuffer(&query_buffer, - " AND (SELECT pg_catalog.count(*)" - " FROM pg_catalog.pg_namespace" - " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) =" - " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) > 1", - char_length, e_text); + /* Get unqualified names matching the input-so-far */ + appendPQExpBufferStr(&query_buffer, "SELECT "); + if (schema_query->use_distinct) + appendPQExpBufferStr(&query_buffer, "DISTINCT "); + appendPQExpBuffer(&query_buffer, + "%s, NULL::pg_catalog.text FROM %s", + schema_query->result, + schema_query->catname); + if (schema_query->refnamespace && completion_ref_schema) + appendPQExpBufferStr(&query_buffer, + ", pg_catalog.pg_namespace nr"); + appendPQExpBufferStr(&query_buffer, " WHERE "); + if (schema_query->selcondition) + appendPQExpBuffer(&query_buffer, "%s AND ", + schema_query->selcondition); + appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s'", + schema_query->result, + e_object_like); + if (schema_query->viscondition) + appendPQExpBuffer(&query_buffer, " AND %s", + schema_query->viscondition); + if (schema_query->refname) + { + Assert(completion_ref_object); + appendPQExpBuffer(&query_buffer, " AND %s = '%s'", + schema_query->refname, e_ref_object); + if (schema_query->refnamespace && completion_ref_schema) + appendPQExpBuffer(&query_buffer, + " AND %s = nr.oid AND nr.nspname = '%s'", + schema_query->refnamespace, + e_ref_schema); + else if (schema_query->refviscondition) + appendPQExpBuffer(&query_buffer, + " AND %s", + schema_query->refviscondition); + } - /* - * Add in matching qualified names, but only if there is exactly - * one schema matching the input-so-far. - */ - appendPQExpBuffer(&query_buffer, "\nUNION\n" - "SELECT pg_catalog.quote_ident(n.nspname) || '.' || %s " - "FROM %s, pg_catalog.pg_namespace n " - "WHERE %s = n.oid AND ", - qualresult, - schema_query->catname, - schema_query->namespace); - if (schema_query->selcondition) - appendPQExpBuffer(&query_buffer, "%s AND ", - schema_query->selcondition); - appendPQExpBuffer(&query_buffer, "substring(pg_catalog.quote_ident(n.nspname) || '.' || %s,1,%d)='%s'", - qualresult, - char_length, e_text); + /* + * When fetching relation names, suppress system catalogs + * unless the input-so-far begins with "pg_". This is a + * compromise between not offering system catalogs for + * completion at all, and having them swamp the result when + * the input is just "p". + */ + if (strcmp(schema_query->catname, + "pg_catalog.pg_class c") == 0 && + strncmp(objectname, "pg_", 3) != 0) + { + appendPQExpBufferStr(&query_buffer, + " AND c.relnamespace <> (SELECT oid FROM" + " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')"); + } - /* - * This condition exploits the single-matching-schema rule to - * speed up the query - */ - appendPQExpBuffer(&query_buffer, - " AND substring(pg_catalog.quote_ident(n.nspname) || '.',1,%d) =" - " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(n.nspname))+1)", - char_length, e_text); - appendPQExpBuffer(&query_buffer, - " AND (SELECT pg_catalog.count(*)" - " FROM pg_catalog.pg_namespace" - " WHERE substring(pg_catalog.quote_ident(nspname) || '.',1,%d) =" - " substring('%s',1,pg_catalog.length(pg_catalog.quote_ident(nspname))+1)) = 1", - char_length, e_text); - - /* If an addon query was provided, use it */ - if (simple_query) - appendPQExpBuffer(&query_buffer, "\n%s", simple_query); + /* + * If the target object type can be schema-qualified, add in + * schema names matching the input-so-far. + */ + if (schema_query->namespace) + { + appendPQExpBuffer(&query_buffer, "\nUNION ALL\n" + "SELECT NULL::pg_catalog.text, n.nspname " + "FROM pg_catalog.pg_namespace n " + "WHERE n.nspname LIKE '%s'", + e_object_like); + + /* + * Likewise, suppress system schemas unless the + * input-so-far begins with "pg_". + */ + if (strncmp(objectname, "pg_", 3) != 0) + appendPQExpBufferStr(&query_buffer, + " AND n.nspname NOT LIKE E'pg\\\\_%'"); + + /* + * Since we're matching these schema names to the object + * name, handle their quoting using the object name's + * quoting state. + */ + schemaquoted = objectquoted; + } + } + else + { + /* Input is qualified, so produce only qualified names */ + appendPQExpBufferStr(&query_buffer, "SELECT "); + if (schema_query->use_distinct) + appendPQExpBufferStr(&query_buffer, "DISTINCT "); + appendPQExpBuffer(&query_buffer, "%s, n.nspname " + "FROM %s, pg_catalog.pg_namespace n", + schema_query->result, + schema_query->catname); + if (schema_query->refnamespace && completion_ref_schema) + appendPQExpBufferStr(&query_buffer, + ", pg_catalog.pg_namespace nr"); + appendPQExpBuffer(&query_buffer, " WHERE %s = n.oid AND ", + schema_query->namespace); + if (schema_query->selcondition) + appendPQExpBuffer(&query_buffer, "%s AND ", + schema_query->selcondition); + appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s' AND ", + schema_query->result, + e_object_like); + appendPQExpBuffer(&query_buffer, "n.nspname = '%s'", + e_schemaname); + if (schema_query->refname) + { + Assert(completion_ref_object); + appendPQExpBuffer(&query_buffer, " AND %s = '%s'", + schema_query->refname, e_ref_object); + if (schema_query->refnamespace && completion_ref_schema) + appendPQExpBuffer(&query_buffer, + " AND %s = nr.oid AND nr.nspname = '%s'", + schema_query->refnamespace, + e_ref_schema); + else if (schema_query->refviscondition) + appendPQExpBuffer(&query_buffer, + " AND %s", + schema_query->refviscondition); + } + } } else { Assert(simple_query); /* simple_query is an sprintf-style format string */ appendPQExpBuffer(&query_buffer, simple_query, - char_length, e_text, - e_info_charp, e_info_charp, - e_info_charp2, e_info_charp2); + e_object_like, + e_ref_object, e_ref_schema); } /* Limit the number of records in the result */ appendPQExpBuffer(&query_buffer, "\nLIMIT %d", completion_max_records); + /* Finally, we can issue the query */ result = exec_query(query_buffer.data); + /* Clean up */ termPQExpBuffer(&query_buffer); - free(e_text); - if (e_info_charp) - free(e_info_charp); - if (e_info_charp2) - free(e_info_charp2); + if (schemaname) + free(schemaname); + if (objectname) + free(objectname); + free(e_object_like); + if (e_schemaname) + free(e_schemaname); + if (e_ref_object) + free(e_ref_object); + if (e_ref_schema) + free(e_ref_schema); } - /* Find something that matches */ + /* Return the next result, if any, but not if the query failed */ if (result && PQresultStatus(result) == PGRES_TUPLES_OK) { - const char *item; + int nskip; - while (list_index < PQntuples(result) && - (item = PQgetvalue(result, list_index++, 0))) - if (pg_strncasecmp(text, item, byte_length) == 0) + while (list_index < PQntuples(result)) + { + const char *item = NULL; + const char *nsp = NULL; + + if (!PQgetisnull(result, list_index, 0)) + item = PQgetvalue(result, list_index, 0); + if (PQnfields(result) > 1 && + !PQgetisnull(result, list_index, 1)) + nsp = PQgetvalue(result, list_index, 1); + list_index++; + + /* In verbatim mode, we return all the items as-is */ + if (verbatim) + { + num_query_other++; return pg_strdup(item); + } + + /* + * In normal mode, a name requiring quoting will be returned only + * if the input was empty or quoted. Otherwise the user might see + * completion inserting a quote she didn't type, which is + * surprising. This restriction also dodges some odd behaviors of + * some versions of readline/libedit. + */ + if (non_empty_object) + { + if (item && !objectquoted && identifier_needs_quotes(item)) + continue; + if (nsp && !schemaquoted && identifier_needs_quotes(nsp)) + continue; + } + + /* Count schema-only results for hack below */ + if (item == NULL && nsp != NULL) + num_schema_only++; + else + num_query_other++; + + return requote_identifier(nsp, item, schemaquoted, objectquoted); + } + + /* + * When the query result is exhausted, check for hard-wired keywords. + * These will only be returned if they match the input-so-far, + * ignoring case. + */ + nskip = list_index - PQntuples(result); + if (schema_query && schema_query->keywords) + { + const char *const *itemp = schema_query->keywords; + + while (*itemp) + { + const char *item = *itemp++; + + if (nskip-- > 0) + continue; + list_index++; + if (pg_strncasecmp(text, item, strlen(text)) == 0) + { + num_keywords++; + return pg_strdup_keyword_case(item, text); + } + } + } + if (keywords) + { + const char *const *itemp = keywords; + + while (*itemp) + { + const char *item = *itemp++; + + if (nskip-- > 0) + continue; + list_index++; + if (pg_strncasecmp(text, item, strlen(text)) == 0) + { + num_keywords++; + return pg_strdup_keyword_case(item, text); + } + } + } } - /* If nothing matches, free the db structure and return null */ + /* + * Hack: if we returned only bare schema names, don't let Readline add a + * space afterwards. Otherwise the schema will stop being part of the + * completion subject text, which is not what we want. + */ + if (num_schema_only > 0 && num_query_other == 0 && num_keywords == 0) + rl_completion_append_character = '\0'; + + /* No more matches, so free the result structure and return null */ PQclear(result); result = NULL; return NULL; } +/* + * Set up completion_ref_object and completion_ref_schema + * by parsing the given word. These variables can then be + * used in a query passed to _complete_from_query. + */ +static void +set_completion_reference(const char *word) +{ + bool schemaquoted, + objectquoted; + + parse_identifier(word, + &completion_ref_schema, &completion_ref_object, + &schemaquoted, &objectquoted); +} + +/* + * Set up completion_ref_object when it should just be + * the given word verbatim. + */ +static void +set_completion_reference_verbatim(const char *word) +{ + completion_ref_schema = NULL; + completion_ref_object = pg_strdup(word); +} + + /* * This function returns in order one of a fixed, NULL pointer terminated list * of strings (if matching). This can be used if there are only a fixed number @@ -4854,10 +5602,8 @@ complete_from_files(const char *text, int state) Assert(*retend == '\''); *retend = '/'; - /* Try to prevent libedit from adding a space, too */ -#ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + /* Prevent libedit from adding a space, too */ rl_completion_append_character = '\0'; -#endif } } @@ -4921,8 +5667,272 @@ escape_string(const char *text) /* - * Execute a query and report any errors. This should be the preferred way of - * talking to the database in this file. + * make_like_pattern - Convert argument to a LIKE prefix pattern. + * + * We escape _ and % in the given text by backslashing, append a % to + * represent "any subsequent characters", and then pass the string through + * escape_string() so it's ready to insert in a query. The result needs + * to be freed. + */ +static char * +make_like_pattern(const char *word) +{ + char *result; + char *buffer = pg_malloc(strlen(word) * 2 + 2); + char *bptr = buffer; + + while (*word) + { + if (*word == '_' || *word == '%') + *bptr++ = '\\'; + if (IS_HIGHBIT_SET(*word)) + { + /* + * Transfer multibyte characters without further processing, to + * avoid getting confused in unsafe client encodings. + */ + int chlen = PQmblenBounded(word, pset.encoding); + + while (chlen-- > 0) + *bptr++ = *word++; + } + else + *bptr++ = *word++; + } + *bptr++ = '%'; + *bptr = '\0'; + + result = escape_string(buffer); + free(buffer); + return result; +} + + +/* + * parse_identifier - Parse a possibly-schema-qualified SQL identifier. + * + * This involves splitting off the schema name if present, de-quoting, + * and downcasing any unquoted text. We are a bit laxer than the backend + * in that we allow just portions of a name to be quoted --- that's because + * psql metacommands have traditionally behaved that way. + * + * Outputs are a malloc'd schema name (NULL if none), malloc'd object name, + * and booleans telling whether any part of the schema and object name was + * double-quoted. + */ +static void +parse_identifier(const char *ident, + char **schemaname, char **objectname, + bool *schemaquoted, bool *objectquoted) +{ + size_t buflen = strlen(ident) + 1; + bool enc_is_single_byte = (pg_encoding_max_length(pset.encoding) == 1); + char *sname; + char *oname; + char *optr; + bool inquotes; + + /* Initialize, making a certainly-large-enough output buffer */ + sname = NULL; + oname = pg_malloc(buflen); + *schemaquoted = *objectquoted = false; + /* Scan */ + optr = oname; + inquotes = false; + while (*ident) + { + unsigned char ch = (unsigned char) *ident++; + + if (ch == '"') + { + if (inquotes && *ident == '"') + { + /* two quote marks within a quoted identifier = emit quote */ + *optr++ = '"'; + ident++; + } + else + { + inquotes = !inquotes; + *objectquoted = true; + } + } + else if (ch == '.' && !inquotes) + { + /* Found a schema name, transfer it to sname / *schemaquoted */ + *optr = '\0'; + free(sname); /* drop any catalog name */ + sname = oname; + oname = pg_malloc(buflen); + optr = oname; + *schemaquoted = *objectquoted; + *objectquoted = false; + } + else if (!enc_is_single_byte && IS_HIGHBIT_SET(ch)) + { + /* + * Transfer multibyte characters without further processing. They + * wouldn't be affected by our downcasing rule anyway, and this + * avoids possibly doing the wrong thing in unsafe client + * encodings. + */ + int chlen = PQmblenBounded(ident - 1, pset.encoding); + + *optr++ = (char) ch; + while (--chlen > 0) + *optr++ = *ident++; + } + else + { + if (!inquotes) + { + /* + * This downcasing transformation should match the backend's + * downcase_identifier() as best we can. We do not know the + * backend's locale, though, so it's necessarily approximate. + * We assume that psql is operating in the same locale and + * encoding as the backend. + */ + if (ch >= 'A' && ch <= 'Z') + ch += 'a' - 'A'; + else if (enc_is_single_byte && IS_HIGHBIT_SET(ch) && isupper(ch)) + ch = tolower(ch); + } + *optr++ = (char) ch; + } + } + + *optr = '\0'; + *schemaname = sname; + *objectname = oname; +} + + +/* + * requote_identifier - Reconstruct a possibly-schema-qualified SQL identifier. + * + * Build a malloc'd string containing the identifier, with quoting applied + * as necessary. This is more or less the inverse of parse_identifier; + * in particular, if an input component was quoted, we'll quote the output + * even when that isn't strictly required. + * + * Unlike parse_identifier, we handle the case where a schema and no + * object name is provided, producing just "schema.". + */ +static char * +requote_identifier(const char *schemaname, const char *objectname, + bool quote_schema, bool quote_object) +{ + char *result; + size_t buflen = 1; /* count the trailing \0 */ + char *ptr; + + /* + * We could use PQescapeIdentifier for some of this, but not all, and it + * adds more notational cruft than it seems worth. + */ + if (schemaname) + { + buflen += strlen(schemaname) + 1; /* +1 for the dot */ + if (!quote_schema) + quote_schema = identifier_needs_quotes(schemaname); + if (quote_schema) + { + buflen += 2; /* account for quote marks */ + for (const char *p = schemaname; *p; p++) + { + if (*p == '"') + buflen++; + } + } + } + if (objectname) + { + buflen += strlen(objectname); + if (!quote_object) + quote_object = identifier_needs_quotes(objectname); + if (quote_object) + { + buflen += 2; /* account for quote marks */ + for (const char *p = objectname; *p; p++) + { + if (*p == '"') + buflen++; + } + } + } + result = pg_malloc(buflen); + ptr = result; + if (schemaname) + { + if (quote_schema) + *ptr++ = '"'; + for (const char *p = schemaname; *p; p++) + { + *ptr++ = *p; + if (*p == '"') + *ptr++ = '"'; + } + if (quote_schema) + *ptr++ = '"'; + *ptr++ = '.'; + } + if (objectname) + { + if (quote_object) + *ptr++ = '"'; + for (const char *p = objectname; *p; p++) + { + *ptr++ = *p; + if (*p == '"') + *ptr++ = '"'; + } + if (quote_object) + *ptr++ = '"'; + } + *ptr = '\0'; + return result; +} + + +/* + * Detect whether an identifier must be double-quoted. + * + * Note we'll quote anything that's not ASCII; the backend's quote_ident() + * does the same. Perhaps this could be relaxed in future. + */ +static bool +identifier_needs_quotes(const char *ident) +{ + int kwnum; + + /* Check syntax. */ + if (!((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_')) + return true; + if (strspn(ident, "abcdefghijklmnopqrstuvwxyz0123456789_") != strlen(ident)) + return true; + + /* + * Check for keyword. We quote keywords except for unreserved ones. + * + * It is possible that our keyword list doesn't quite agree with the + * server's, but this should be close enough for tab-completion purposes. + * + * Note: ScanKeywordLookup() does case-insensitive comparison, but that's + * fine, since we already know we have all-lower-case. + */ + kwnum = ScanKeywordLookup(ident, &ScanKeywords); + + if (kwnum >= 0 && ScanKeywordCategories[kwnum] != UNRESERVED_KEYWORD) + return true; + + return false; +} + + +/* + * Execute a query, returning NULL if there was any error. + * This should be the preferred way of talking to the database in this file. */ static PGresult * exec_query(const char *query) @@ -4936,6 +5946,11 @@ exec_query(const char *query) if (PQresultStatus(result) != PGRES_TUPLES_OK) { + /* + * Printing an error while the user is typing would be quite annoying, + * so we don't. This does complicate debugging of this code; but you + * can look in the server log instead. + */ #ifdef NOT_USED pg_log_error("tab completion query failed: %s\nQuery was:\n%s", PQerrorMessage(pset.db), query); diff --git a/third_party/spanner_pg/src/bin/psql/tab-complete.h b/third_party/spanner_pg/src/bin/psql/tab-complete.h index 4c308cfa..1c4190ed 100644 --- a/third_party/spanner_pg/src/bin/psql/tab-complete.h +++ b/third_party/spanner_pg/src/bin/psql/tab-complete.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/tab-complete.h */ diff --git a/third_party/spanner_pg/src/bin/psql/variables.c b/third_party/spanner_pg/src/bin/psql/variables.c index 92a34f87..47c58d2b 100644 --- a/third_party/spanner_pg/src/bin/psql/variables.c +++ b/third_party/spanner_pg/src/bin/psql/variables.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/bin/psql/variables.c */ @@ -45,7 +45,7 @@ valid_variable_name(const char *name) * that serves as list header. * * The list entries are kept in name order (according to strcmp). This - * is mainly to make the results of PrintVariables() more pleasing. + * is mainly to make the output of PrintVariables() more pleasing. */ VariableSpace CreateVariableSpace(void) diff --git a/third_party/spanner_pg/src/bin/psql/variables.h b/third_party/spanner_pg/src/bin/psql/variables.h index 12ae3c02..e57933f9 100644 --- a/third_party/spanner_pg/src/bin/psql/variables.h +++ b/third_party/spanner_pg/src/bin/psql/variables.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * This implements a sort of variable repository. One could also think of it * as a cheap version of an associative array. Each variable has a string diff --git a/third_party/spanner_pg/src/bin/scripts/Makefile b/third_party/spanner_pg/src/bin/scripts/Makefile index b8d7cf2f..25e7da3d 100644 --- a/third_party/spanner_pg/src/bin/scripts/Makefile +++ b/third_party/spanner_pg/src/bin/scripts/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/scripts # -# 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 # # 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/third_party/spanner_pg/src/bin/scripts/clusterdb.c b/third_party/spanner_pg/src/bin/scripts/clusterdb.c index af0a0a04..bc5a109a 100644 --- a/third_party/spanner_pg/src/bin/scripts/clusterdb.c +++ b/third_party/spanner_pg/src/bin/scripts/clusterdb.c @@ -2,7 +2,7 @@ * * clusterdb * - * Portions Copyright (c) 2002-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2002-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/bin/scripts/common.c b/third_party/spanner_pg/src/bin/scripts/common.c index 79cdc6cf..9e38b60a 100644 --- a/third_party/spanner_pg/src/bin/scripts/common.c +++ b/third_party/spanner_pg/src/bin/scripts/common.c @@ -4,7 +4,7 @@ * Common support routines for bin/scripts/ * * - * 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 * * src/bin/scripts/common.c diff --git a/third_party/spanner_pg/src/bin/scripts/common.h b/third_party/spanner_pg/src/bin/scripts/common.h index ddd8f352..84a1be72 100644 --- a/third_party/spanner_pg/src/bin/scripts/common.h +++ b/third_party/spanner_pg/src/bin/scripts/common.h @@ -2,7 +2,7 @@ * common.h * Common support routines for bin/scripts/ * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/bin/scripts/common.h */ diff --git a/third_party/spanner_pg/src/bin/scripts/createdb.c b/third_party/spanner_pg/src/bin/scripts/createdb.c index 041454f0..a1482df3 100644 --- a/third_party/spanner_pg/src/bin/scripts/createdb.c +++ b/third_party/spanner_pg/src/bin/scripts/createdb.c @@ -2,7 +2,7 @@ * * createdb * - * 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 * * src/bin/scripts/createdb.c @@ -34,10 +34,13 @@ 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'}, {"maintenance-db", required_argument, NULL, 3}, + {"locale-provider", required_argument, NULL, 4}, + {"icu-locale", required_argument, NULL, 5}, {NULL, 0, NULL, 0} }; @@ -58,9 +61,12 @@ 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; + char *locale_provider = NULL; + char *icu_locale = NULL; PQExpBufferData sql; @@ -73,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) { @@ -107,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; @@ -119,8 +128,15 @@ 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); + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit(1); } } @@ -139,33 +155,22 @@ 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); - } - if (lc_collate) - { - pg_log_error("only one of --locale and --lc-collate can be specified"); - exit(1); - } - lc_ctype = locale; - lc_collate = locale; + if (!lc_ctype) + lc_ctype = locale; + if (!lc_collate) + lc_collate = locale; } 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) @@ -205,6 +210,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) @@ -217,6 +224,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,7 +287,11 @@ 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(_(" -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/third_party/spanner_pg/src/bin/scripts/createuser.c b/third_party/spanner_pg/src/bin/scripts/createuser.c index ef7e0e54..bfba0d09 100644 --- a/third_party/spanner_pg/src/bin/scripts/createuser.c +++ b/third_party/spanner_pg/src/bin/scripts/createuser.c @@ -2,7 +2,7 @@ * * createuser * - * 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 * * src/bin/scripts/createuser.c @@ -11,6 +11,9 @@ */ #include "postgres_fe.h" + +#include + #include "common.h" #include "common/logging.h" #include "common/string.h" @@ -89,8 +92,6 @@ main(int argc, char *argv[]) while ((c = getopt_long(argc, argv, "h:p:U:g:wWedDsSrRiIlLc:PE", long_options, &optindex)) != -1) { - char *endptr; - switch (c) { case 'h': @@ -145,13 +146,9 @@ main(int argc, char *argv[]) login = TRI_NO; break; case 'c': - conn_limit = strtol(optarg, &endptr, 10); - if (*endptr != '\0' || conn_limit < -1) /* minimum valid value */ - { - pg_log_error("invalid value for --connection-limit: %s", - optarg); + if (!option_parse_int(optarg, "-c/--connection-limit", + -1, INT_MAX, &conn_limit)) exit(1); - } break; case 'P': pwprompt = true; @@ -169,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); } } @@ -184,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); } @@ -277,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/third_party/spanner_pg/src/bin/scripts/dropdb.c b/third_party/spanner_pg/src/bin/scripts/dropdb.c index b154ed1b..afc00dac 100644 --- a/third_party/spanner_pg/src/bin/scripts/dropdb.c +++ b/third_party/spanner_pg/src/bin/scripts/dropdb.c @@ -2,7 +2,7 @@ * * dropdb * - * 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 * * 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/third_party/spanner_pg/src/bin/scripts/dropuser.c b/third_party/spanner_pg/src/bin/scripts/dropuser.c index 61b8557b..82c1f35a 100644 --- a/third_party/spanner_pg/src/bin/scripts/dropuser.c +++ b/third_party/spanner_pg/src/bin/scripts/dropuser.c @@ -2,7 +2,7 @@ * * dropuser * - * 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 * * 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/third_party/spanner_pg/src/bin/scripts/nls.mk b/third_party/spanner_pg/src/bin/scripts/nls.mk index 46eb0316..9044fda6 100644 --- a/third_party/spanner_pg/src/bin/scripts/nls.mk +++ b/third_party/spanner_pg/src/bin/scripts/nls.mk @@ -1,6 +1,6 @@ # src/bin/scripts/nls.mk CATALOG_NAME = pgscripts -AVAIL_LANGUAGES = cs de el es fr ja ko ru sv tr uk zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ createdb.c createuser.c \ dropdb.c dropuser.c \ @@ -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) diff --git a/third_party/spanner_pg/src/bin/scripts/pg_isready.c b/third_party/spanner_pg/src/bin/scripts/pg_isready.c index fc6f7b0a..1aa83474 100644 --- a/third_party/spanner_pg/src/bin/scripts/pg_isready.c +++ b/third_party/spanner_pg/src/bin/scripts/pg_isready.c @@ -2,7 +2,7 @@ * * pg_isready --- checks the status of the PostgreSQL server * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/bin/scripts/po/de.po b/third_party/spanner_pg/src/bin/scripts/po/de.po index 4bf553e3..7093aec1 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/de.po +++ b/third_party/spanner_pg/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: 2023-11-03 19:18+0000\n" -"PO-Revision-Date: 2021-11-05 13:48+0100\n" +"POT-Creation-Date: 2023-11-03 15:05+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:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -65,20 +70,30 @@ msgstr "Abbruchsanforderung gesendet\n" 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/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:319 #, c-format msgid "too many jobs for this platform: %d" @@ -89,34 +104,39 @@ msgstr "zu viele Jobs für diese Plattform: %d" msgid "socket file descriptor out of range for select(): %d" msgstr "Socket-Dateideskriptor außerhalb des gültigen Bereichs für select(): %d" -#: ../../fe_utils/parallel_slot.c:551 +#: ../../fe_utils/parallel_slot.c:330 +#, c-format +msgid "Try fewer jobs." +msgstr "Versuchen Sie es mit weniger Jobs." + +#: ../../fe_utils/parallel_slot.c:552 #, 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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" @@ -128,19 +148,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: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 "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: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 "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -150,27 +170,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:253 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: clustere Datenbank »%s«\n" -#: clusterdb.c:269 +#: clusterdb.c:264 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -179,19 +199,19 @@ msgstr "" "%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n" "\n" -#: clusterdb.c:270 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:794 vacuumdb.c:1025 +#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: clusterdb.c:271 reindexdb.c:795 vacuumdb.c:1026 +#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:272 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:796 vacuumdb.c:1027 +#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -200,50 +220,50 @@ msgstr "" "\n" "Optionen:\n" -#: clusterdb.c:273 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all clustere alle Datenbanken\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n" -#: clusterdb.c:275 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:270 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:276 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: clusterdb.c:277 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABELLE clustere nur bestimmte Tabelle(n)\n" -#: clusterdb.c:278 +#: clusterdb.c:273 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: clusterdb.c:279 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:274 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:280 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:275 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:281 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:811 vacuumdb.c:1052 +#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -252,37 +272,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: clusterdb.c:282 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: clusterdb.c:277 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:283 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: clusterdb.c:278 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:284 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:279 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:285 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: clusterdb.c:280 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:286 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: clusterdb.c:281 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:287 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:282 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:288 +#: clusterdb.c:283 #, c-format msgid "" "\n" @@ -292,8 +312,8 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls CLUSTER.\n" -#: clusterdb.c:289 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:819 vacuumdb.c:1060 +#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -302,8 +322,8 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: clusterdb.c:290 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:820 vacuumdb.c:1061 +#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" @@ -337,32 +357,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Bitte antworten Sie »%s« oder »%s«.\n" -#: createdb.c:150 -#, 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 -#, 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:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s" -#: createdb.c:248 +#: createdb.c:262 #, 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:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -371,94 +381,113 @@ msgstr "" "%s erzeugt eine PostgreSQL-Datenbank.\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n" -#: createdb.c:270 +#: createdb.c:284 #, 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:800 +#: createdb.c:285 reindexdb.c:768 #, 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:286 #, 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:287 #, 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:288 #, 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:289 #, 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:290 +#, 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:291 +#, 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:293 #, 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:294 +#, 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:295 #, 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:809 +#: createdb.c:296 reindexdb.c:777 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: createdb.c:279 reindexdb.c:810 +#: createdb.c:297 reindexdb.c:778 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: createdb.c:281 reindexdb.c:812 +#: createdb.c:299 reindexdb.c:780 #, 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:813 +#: createdb.c:300 reindexdb.c:781 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: createdb.c:283 reindexdb.c:814 +#: createdb.c:301 reindexdb.c:782 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: createdb.c:284 reindexdb.c:815 +#: createdb.c:302 reindexdb.c:783 #, 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:816 +#: createdb.c:303 reindexdb.c:784 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: createdb.c:286 reindexdb.c:817 +#: createdb.c:304 reindexdb.c:785 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -468,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" @@ -521,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" @@ -557,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" @@ -606,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" @@ -651,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" -#: 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" @@ -699,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" @@ -708,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" -#: 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" @@ -759,149 +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:198 -#, 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: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 "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:776 +#: reindexdb.c:744 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindiziere Datenbank »%s«\n" -#: reindexdb.c:793 +#: reindexdb.c:761 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -910,64 +929,64 @@ msgstr "" "%s reindiziert eine PostgreSQL-Datenbank.\n" "\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all alle Datenbanken reindizieren\n" -#: reindexdb.c:798 +#: reindexdb.c:766 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently nebenläufig reindizieren\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, 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:802 +#: reindexdb.c:770 #, 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:803 +#: reindexdb.c:771 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system nur Systemkataloge reindizieren\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, 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:806 +#: reindexdb.c:774 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n" -#: reindexdb.c:807 +#: reindexdb.c:775 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n" -#: reindexdb.c:808 +#: reindexdb.c:776 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: reindexdb.c:818 +#: reindexdb.c:786 #, c-format msgid "" "\n" @@ -977,80 +996,65 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls REINDEX.\n" -#: vacuumdb.c:206 -#, c-format -msgid "parallel workers for vacuum must be greater than or equal to zero" -msgstr "parallele Arbeitsprozesse für Vacuum müssen größer oder gleich null sein" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "minimales Transaktions-ID-Alter muss mindestens 1 sein" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "minimales Multixact-ID-Alter muss mindestens 1 sein" - -#: 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 "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird" -#: vacuumdb.c:332 +#: 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:341 +#: 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:363 +#: 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:368 +#: 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:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Erzeuge volle Optimierer-Statistiken" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: bearbeite Datenbank »%s«: %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: führe Vacuum in Datenbank »%s« aus\n" -#: vacuumdb.c:1013 +#: 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:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1059,128 +1063,128 @@ msgstr "" "%s säubert und analysiert eine PostgreSQL-Datenbank.\n" "\n" -#: vacuumdb.c:1028 +#: 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:1029 +#: 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:1030 +#: 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:1031 +#: 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:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full führe volles Vacuum durch\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n" -#: vacuumdb.c:1034 +#: 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:1035 +#: 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:1036 +#: 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:1037 +#: 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:1038 +#: 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:1039 +#: 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:1040 +#: 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:1041 +#: vacuumdb.c:980 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLEL-PROZ so viele Background-Worker für Vacuum verwenden,\n" " wenn verfügbar\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: vacuumdb.c:1043 +#: 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:1044 +#: 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:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n" -#: vacuumdb.c:1048 +#: 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:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1190,12 +1194,12 @@ msgstr "" " in mehreren Phasen für schnellere Ergebnisse;\n" " kein Vacuum\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/el.po b/third_party/spanner_pg/src/bin/scripts/po/el.po index 7cf6af13..814e90a3 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/el.po +++ b/third_party/spanner_pg/src/bin/scripts/po/el.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 14\n" +"Project-Id-Version: pgscripts (PostgreSQL) 15\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" +"POT-Creation-Date: 2023-04-14 09:19+0000\n" +"PO-Revision-Date: 2023-04-14 14:51+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -16,23 +16,28 @@ 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 3.0\n" +"X-Generator: Poedit 3.2.2\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "κρίσιμο: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "σφάλμα: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "προειδοποίηση: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "λεπτομέρεια: " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -56,63 +61,73 @@ msgstr "ο χρήστης δεν υπάρχει" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος % 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/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 "Κωδικός πρόσβασης: " -#: ../../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 "δεν ήταν δυνατή η σύνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης" -#: ../../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 "μη έγκυρη τιμή «%s» για την επιλογή %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 "too many jobs for this platform" msgstr "πάρα πολλές εργασίες για την παρούσα πλατφόρμα" -#: ../../fe_utils/parallel_slot.c:522 +#: ../../fe_utils/parallel_slot.c:519 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "η επεξεργασία της βάσης δεδομένων «%s» απέτυχε: %s" -#: ../../fe_utils/print.c:336 +#: ../../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:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμα): %d" @@ -124,19 +139,19 @@ msgstr "το ερώτημα απέτυχε: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "το ερώτημα ήταν: %s" +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 +#: 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: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 "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η «%s»)" @@ -146,27 +161,27 @@ msgstr "πάρα πολλοί παραμέτροι εισόδου από την msgid "cannot cluster all databases and a specific one at the same time" msgstr "δεν είναι δυνατή η ομαδοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "δεν είναι δυνατή η ομαδοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "η ομαδοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "η ομαδοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" -#: clusterdb.c:251 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: ομαδοποιείται η βάση δεδομένων «%s»\n" -#: clusterdb.c:267 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -175,19 +190,19 @@ 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 +#: clusterdb.c:263 createdb.c:281 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:269 reindexdb.c:793 vacuumdb.c:1026 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, 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 +#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -196,48 +211,48 @@ msgstr "" "\n" "Επιλογές:\n" -#: clusterdb.c:271 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all ομαδοποίησε όλες τις βάσεις δεδομένων\n" -#: clusterdb.c:272 +#: clusterdb.c:267 #, 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 +#: 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" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" -#: clusterdb.c:275 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE να ομαδοποιήσεις μόνο συγκεκριμένους πίνακες\n" -#: clusterdb.c:276 +#: clusterdb.c:271 #, 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 +#: 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: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 εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\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 +#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -246,37 +261,37 @@ msgstr "" "\n" "Επιλογές σύνδεσης:\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: 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:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: 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:282 dropdb.c:183 vacuumdb.c:1055 +#: 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:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: 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:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: 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:285 dropdb.c:186 vacuumdb.c:1058 +#: 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:286 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -285,8 +300,8 @@ 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 +#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -295,8 +310,8 @@ 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 +#: clusterdb.c:283 createdb.c:307 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" @@ -330,32 +345,22 @@ msgstr "%s (%s/%s) " 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 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» δεν είναι έγκυρο όνομα κωδικοποίησης" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "η δημιουργία βάσης δεδομένων απέτυχε: %s" -#: createdb.c:248 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "η δημιουργία σχολίων απέτυχε (δημιουργήθηκε βάση δεδομένων): %s" -#: createdb.c:266 +#: createdb.c:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -364,92 +369,111 @@ msgstr "" "%s δημιουργεί μια βάση δεδομένων PostgreSQL.\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME] [ΠΕΡΙΓΡΑΦΗ]\n" -#: createdb.c:270 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE προεπιλεγμένος πινακοχώρος για τη βάση δεδομένων\n" -#: createdb.c:271 reindexdb.c:798 +#: createdb.c:285 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: createdb.c:272 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING κωδικοποίηση για την βάση δεδομένων\n" -#: createdb.c:273 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE ρυθμίσεις εντοπιότητας για τη βάση δεδομένων\n" -#: createdb.c:274 +#: createdb.c:288 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE ρύθμιση LC_COLLATE για την βάση δεδομένων\n" -#: createdb.c:275 +#: createdb.c:289 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-collate=LOCALE ρύθμιση LC_CTYPE για την βάση δεδομένων\n" -#: createdb.c:276 +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE ICU ρυθμίσεις εντοπιότητας για τη βάση δεδομένων\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" πάροχος εντοπιότητας για την προεπιλεγμένη συρραφή της βάσης\n" + +#: createdb.c:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER όνομα χρήστη που θα κατέχει την νέα βάση δεδομένων\n" -#: createdb.c:277 +#: createdb.c:294 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=STRATEGY δημιουργία στρατηγικής wal_log βάσης δεδομένων ή flle_copy\n" + +#: createdb.c:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE πρωτότυπη βάση δεδομένων για αντιγραφή\n" -#: createdb.c:278 reindexdb.c:807 +#: createdb.c:296 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n" -#: createdb.c:279 reindexdb.c:808 +#: createdb.c:297 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" -#: createdb.c:281 reindexdb.c:810 +#: createdb.c:299 reindexdb.c:778 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: createdb.c:282 reindexdb.c:811 +#: createdb.c:300 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n" -#: createdb.c:283 reindexdb.c:812 +#: createdb.c:301 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n" -#: createdb.c:284 reindexdb.c:813 +#: createdb.c:302 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n" -#: createdb.c:285 reindexdb.c:814 +#: createdb.c:303 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n" -#: createdb.c:286 reindexdb.c:815 +#: createdb.c:304 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" +msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -458,51 +482,46 @@ msgstr "" "\n" "Από προεπιλογή, δημιουργείται μια βάση δεδομένων με το ίδιο όνομα με τον τρέχοντα χρήστη.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "άκυρη τιμή για --connection-limit: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Εισαγάγετε το όνομα του ρόλου για να προσθέσετε: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Εισαγάγετε κωδικό πρόσβασης για νέο ρόλο: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Να είναι ο νέος ρόλος υπερχρήστης;" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Να επιτραπεί στον νέο ρόλο η δημιουργία βάσεων δεδομένων;" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Να επιτραπεί στον νέο ρόλο να δημιουργήσει περισσότερους νέους ρόλους;" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "η κρυπτογράφηση κωδικού πρόσβασης απέτυχε: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "η δημιουργία νέου ρόλου απέτυχε: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -511,32 +530,32 @@ msgstr "" "%s δημιουργεί ένα νέο ρόλο PostgreSQL.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [ROLENAME]\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 όριο σύνδεσης για το ρόλο (προεπιλογή: κανένα όριο)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb ο ρόλος μπορεί να δημιουργήσει νέες βάσεις δεδομένων\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb ο ρόλος δεν μπορεί να δημιουργήσει βάσεις δεδομένων (προεπιλογή)\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 ο καινούριος ρόλος να αποτελεί μέλος αυτού του ρόλου\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -545,47 +564,47 @@ msgstr "" " -i, --inherit ο ρόλος να κληρονομεί τα προνόμια των ρόλων των\n" " οποίων είναι μέλος τους (προεπιλογή)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit ο ρόλος δεν κληρονομεί προνόμια\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login ο ρόλος μπορεί να συνδεθεί (προεπιλογή)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login ο ρόλος δεν μπορεί να συνδεθεί\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt αντιστοιχίσε έναν κωδικό πρόσβασης στο νέο ρόλο\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole ο ρόλος μπορεί να δημιουργεί νέους ρόλους\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole ο ρόλος δεν μπορεί να δημιουργεί νέους ρόλους (προεπιλογή)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --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 ο ρόλος δεν θα είναι υπερχρήστης (προεπιλογή)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -594,41 +613,41 @@ msgstr "" " --interactive να προτρέψει για το όνομα ρόλου και τα χαρακτηριστικά αντί\n" " να χρησιμοποιήσει προεπιλογές\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication ο ρόλος μπορεί να εκκινήσει αναπαραγωγή\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication ο ρόλος να μην μπορεί να εκκινήσει αναπαραγωγή\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=USERNAME όνομα χρήστη για να συνδεθεί ως (όχι αυτό που θα δημιουργηθεί)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "λείπει αναγκαία παράμετρος ονόματος βάσης δεδομένων" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "Η βάση δεδομένων «%s» θα αφαιρεθεί οριστικά.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Είστε βέβαιος;" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "η αφαίρεση της βάσης δεδομένων απέτυχε: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -637,46 +656,46 @@ msgstr "" "%s αφαιρεί μία βάση δεδομένων PostgreSQL.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force να προσπαθήσει να τερματίσει άλλες συνδέσεις πριν την εγκατάληψη\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε\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 να μην αναφέρει σφάλμα εάν η βάση δεδομένων δεν υπάρχει\n" -#: dropuser.c:117 +#: 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:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "η αφαίρεση του ρόλου «%s» απέτυχε: %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -685,7 +704,7 @@ msgstr "" "%s αφαιρεί ένα ρόλο PostgreSQL.\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -694,47 +713,47 @@ msgstr "" " -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε, και να προτρέψει για\n" " το όνομα του ρόλου, εάν αυτό δεν έχει καθοριστεί\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 να μην αναφέρει σφάλμα εάν ο χρήστης δεν υπάρχει\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=USERNAME όνομα χρήστη με το οποίο να συνδεθεί (όχι αυτό που θα αφαιρέσει)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "δεν ήταν δυνατή η λήψη προεπιλεγμένων ρυθμίσεων" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "αποδέχεται συνδέσεις\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "απορρίπτει συνδέσεις\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "καμία απάντηση\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "καμία προσπάθεια\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "άγνωστο\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -743,151 +762,146 @@ msgstr "" "%s εκτελεί ένα έλεγχο σύνδεσης σε μια βάση δεδομένων PostgreSQL.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ΕΠΙΛΟΓΗ]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet εκτέλεσε σιωπηλά\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\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 διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\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 πόσα δευτερόλεπτα να περιμένει όταν προσπαθεί να συνδεθεί,\n" " 0 το απενεργοποιεί (προεπιλογή: %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=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 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και των καταλόγων συστήματος ταυτόχρονα" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων σε όλες τις βάσεις δεδομένων" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων σε όλες τις βάσεις δεδομένων" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων και καταλόγων συστήματος ταυτόχρονα" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων και καταλόγων συστήματος ταυτόχρονα" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων και καταλόγων συστήματος ταυτόχρονα" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "δεν είναι δυνατή η χρήση πολλαπλών εργασιών για την επαναευρετηριοποίηση καταλόγων συστήματος" -#: reindexdb.c:288 +#: reindexdb.c:260 #, 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 +#: 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 "δεν είναι δυνατή η χρήση της επιλογής «%s» σε εκδόσεις διακομιστών παλαιότερες από την PostgreSQL %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "δεν είναι δυνατή η ταυτόχρονη επαναευρετηριοποίηση καταλόγων συστήματος, παρακάμπτονται όλοι" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "επαναευρετηριοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "η επανενεξάγηση του ευρετηρίου «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "η επαναευρετηριοποίηση του σχήματος «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "η επαναευρετηριοποίηση καταλόγων συστήματος στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "η επαναευρετηριοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:774 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: επαναευρετηριοποίηση της βάσης δεδομένων «%s»\n" -#: reindexdb.c:791 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -896,62 +910,62 @@ msgstr "" "%s επαναευρετηριοποιεί μια βάση δεδομένων PostgreSQL.\n" "\n" -#: reindexdb.c:795 +#: reindexdb.c:763 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all επαναευρετηριοποίηση όλων των βάσεων δεδομένων\n" -#: reindexdb.c:796 +#: reindexdb.c:764 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " -a, --all ταυτόχρονη επαναευρετηριοποίηση\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για επαναευρετηριοποίηση\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX δημιούργησε συγκεκριμένο(ους) πίνακα(ες) μόνο\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 χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system επαναευρετηριοποίηση μόνο καταλόγων συστήματος\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA επαναευρετηριοποίησε συγκεκριμένο(-α) σχήμα(-τα) μόνο\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE επαναευρετηριοποίησε συγκεκριμένο(-ους) πίνακα(-ες) μόνο\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE πινακοχώρος όπου επαναδημιουργούνται τα ευρετήρια\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" -#: reindexdb.c:816 +#: reindexdb.c:784 #, c-format msgid "" "\n" @@ -960,80 +974,65 @@ 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 +#: 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 "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση μόνο της ανάλυσης" -#: vacuumdb.c:332 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση full vacuum" -#: vacuumdb.c:341 +#: vacuumdb.c:303 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» μαζί με την επιλογή«%s»" -#: vacuumdb.c:363 +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "δεν μπορεί να εκτελέσει vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκριμένη ταυτόχρονα" -#: vacuumdb.c:368 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "δεν μπορεί να εκτελέσει vacuum συγκεκριμένους πίνακες σε όλες τις βάσεις δεδομένων" -#: vacuumdb.c:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Δημιουργία ελάχιστων στατιστικών βελτιστοποιητή (1 στόχος)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Δημιουργία μεσαίων στατιστικών βελτιστοποιητή (10 στόχοι)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Δημιουργία προεπιλεγμένων (πλήρων) στατιστικών βελτιστοποιητή" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: επεξεργάζεται τη βάση δεδομένων «%s»: %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: εκτελεί vacuum στη βάση δεδομένων «%s»\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "η εκτέλεση vacuum στον πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: vacuumdb.c:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "η εκτέλεση vacuum στη βάση δεδομένων «%s» απέτυχε: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1042,114 +1041,114 @@ msgstr "" "%s καθαρίζει και αναλύει μια βάση δεδομένων PostgreSQL.\n" "\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all εκτέλεσε vacuum σε όλες τις βάσεις δεδομένων\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για vacuum\n" -#: vacuumdb.c:1030 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping απενεργοποιήστε κάθε συμπεριφορά παράλειψης σελίδας\n" -#: vacuumdb.c:1031 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: vacuumdb.c:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full να εκτελέσει πλήρες vacuum\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze πάγωσε τις πληροφορίες σειράς συναλλαγής\n" -#: vacuumdb.c:1034 +#: vacuumdb.c:973 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup αφαιρεί πάντα καταχωρήσεις ευρετηρίου που οδηγούν σε νεκρές πλειάδες\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n" -#: vacuumdb.c:1036 +#: 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 ελάχιστη ηλικία multixact ID πινάκων για vacuum\n" -#: vacuumdb.c:1037 +#: 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 ελάχιστη ηλικία transaction ID πινάκων για vacuum\n" -#: vacuumdb.c:1038 +#: 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" -#: vacuumdb.c:1039 +#: 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" -#: vacuumdb.c:1040 +#: 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:1041 +#: 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 χρησιμοποίησε τόσους πολλούς εργάτες παρασκηνίου\n" " για την εκτέλεση vacuum, εάν αυτοί είναι διαθέσιμοι\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked να παραλείψει σχέσεις που δεν μπορούν να κλειδωθούν άμεσα\n" -#: vacuumdb.c:1044 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table=‘TABLE[(COLUMNS)]’ να εκτελέσει vacuum μόνο σε συγκεκριμένους πίνακες\n" -#: vacuumdb.c:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze ενημέρωσε τα στατιστικά του βελτιστοποιητή\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -z, --analyze μόνο ενημέρωσε τα στατιστικά του βελτιστοποιητή· χωρίς vacuum\n" -#: vacuumdb.c:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1158,12 +1157,12 @@ msgstr "" " --analyze-in-stages ενημέρωσε μόνο τα στατιστικά στοιχεία βελτιστοποίησης, σε πολλαπλά\n" " στάδια για ταχύτερα αποτελέσματα· χωρίς vacuum\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" @@ -1171,3 +1170,27 @@ msgid "" msgstr "" "\n" "Διαβάστε την περιγραφή της SQL εντολής VACUUM για λεπτομέρειες.\n" + +#~ msgid "fatal: " +#~ msgstr "κρίσιμο: " + +#~ msgid "invalid value for --connection-limit: %s" +#~ msgstr "άκυρη τιμή για --connection-limit: %s" + +#~ msgid "minimum multixact ID age must be at least 1" +#~ msgstr "η ελάχιστη ηλικία multixact ID πρέπει να είναι τουλάχιστον 1" + +#~ msgid "minimum transaction ID age must be at least 1" +#~ msgstr "η ελάχιστη ηλικία transaction ID πρέπει να είναι τουλάχιστον 1" + +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "ο αριθμός παράλληλων εργασιών πρέπει να είναι τουλάχιστον 1" + +#~ msgid "only one of --locale and --lc-collate can be specified" +#~ msgstr "μόνο ένα από τα --locale και --lc-collate μπορεί να καθοριστεί" + +#~ msgid "only one of --locale and --lc-ctype can be specified" +#~ msgstr "μόνο ένα από τα --locale και --lc-ctype μπορεί να καθοριστεί" + +#~ msgid "parallel workers for vacuum must be greater than or equal to zero" +#~ msgstr "οι παράλληλοι εργάτες για vacuum πρέπει να είναι περισσότεροι ή ίσοι με μηδέν" diff --git a/third_party/spanner_pg/src/bin/scripts/po/es.po b/third_party/spanner_pg/src/bin/scripts/po/es.po index 24f7598f..bf653728 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/es.po +++ b/third_party/spanner_pg/src/bin/scripts/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 14\n" +"Project-Id-Version: pgscripts (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 17:03+0000\n" -"PO-Revision-Date: 2022-01-12 17:38-0500\n" +"POT-Creation-Date: 2023-05-07 16:49+0000\n" +"PO-Revision-Date: 2022-11-04 13:14+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -23,21 +23,26 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: BlackCAT 1.1\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "error: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "precaución: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalle: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "consejo: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 #, c-format @@ -71,53 +76,63 @@ msgstr "Petición de cancelación enviada\n" msgid "Could not send cancel request: " msgstr "No se pudo enviar el paquete de cancelación: " -#: ../../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 "Contraseña: " -#: ../../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 "no se pudo conectar a la base de datos %s: memoria agotada" -#: ../../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 "el valor «%s» no es válido para la opción %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/parallel_slot.c:301 #, c-format msgid "too many jobs for this platform" msgstr "demasiados procesos para esta plataforma" -#: ../../fe_utils/parallel_slot.c:522 +#: ../../fe_utils/parallel_slot.c:519 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "falló el procesamiento de la base de datos «%s»: %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu fila)" msgstr[1] "(%lu filas)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrumpido\n" -#: ../../fe_utils/print.c:3104 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3144 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "formato de salida no válido (error interno): %d" @@ -129,19 +144,19 @@ msgstr "la consulta falló: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "la consulta era: %s" +msgid "Query was: %s" +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: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 "Use «%s --help» para mayor información.\n" +msgid "Try \"%s --help\" for more information." +msgstr "Pruebe «%s --help» para mayor informació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 +#: 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 "demasiados argumentos en la línea de órdenes (el primero es «%s»)" @@ -151,27 +166,27 @@ msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" msgid "cannot cluster all databases and a specific one at the same time" msgstr "no se pueden reordenar todas las bases de datos y una de ellas en particular simultáneamente" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "no es posible reordenar tablas específicas en todas las bases de datos" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "falló el reordenamiento de la tabla «%s» en la base de datos «%s»: %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "falló el reordenamiento de la base de datos «%s»: %s" -#: clusterdb.c:251 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: reordenando la base de datos «%s»\n" -#: clusterdb.c:267 +#: clusterdb.c:262 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -181,19 +196,19 @@ msgstr "" "en una base de datos.\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 +#: clusterdb.c:263 createdb.c:281 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 "Empleo:\n" -#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, 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:1027 +#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -202,48 +217,48 @@ msgstr "" "\n" "Opciones:\n" -#: clusterdb.c:271 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all reordenar todas las bases de datos\n" -#: clusterdb.c:272 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=BASE base de datos a reordenar\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 mostrar las órdenes a medida que se ejecutan\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet no escribir ningún mensaje\n" -#: clusterdb.c:275 +#: clusterdb.c:270 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLA reordenar sólo esta(s) tabla(s)\n" -#: clusterdb.c:276 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\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 mostrar información de versión y salir\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 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:1052 +#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -252,37 +267,37 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: 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=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: 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=PUERTO puerto del servidor\n" -#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 #, 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:1056 +#: 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 nunca pedir contraseña\n" -#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: 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 forzar la petición de contraseña\n" -#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: clusterdb.c:286 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -291,8 +306,8 @@ msgstr "" "\n" "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:1060 +#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -301,8 +316,8 @@ msgstr "" "\n" "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:1061 +#: clusterdb.c:283 createdb.c:307 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 "Sitio web de %s: <%s>\n" @@ -336,32 +351,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Por favor conteste «%s» o «%s».\n" -#: createdb.c:150 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "sólo uno de --locale y --lc-ctype puede ser especificado" - -#: createdb.c:155 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "sólo uno de --locale y --lc-collate puede ser especificado" - -#: createdb.c:166 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "falló la creación de la base de datos: %s" -#: createdb.c:248 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "falló la creación del comentario (la base de datos fue creada): %s" -#: createdb.c:266 +#: createdb.c:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -370,92 +375,114 @@ msgstr "" "%s crea una base de datos PostgreSQL.\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPCIÓN]... [NOMBRE] [DESCRIPCIÓN]\n" -#: createdb.c:270 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TBLSPC tablespace por omisión de la base de datos\n" -#: createdb.c:271 reindexdb.c:798 +#: createdb.c:285 reindexdb.c:766 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: createdb.c:272 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=CODIF codificación para la base de datos\n" -#: createdb.c:273 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE configuración regional para la base de datos\n" -#: createdb.c:274 +#: createdb.c:288 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE configuración LC_COLLATE para la base de datos\n" -#: createdb.c:275 +#: createdb.c:289 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE configuración LC_CTYPE para la base de datos\n" -#: createdb.c:276 +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE configuración regional ICU para la base de datos\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" proveedor de configuración regional para el ordenamiento\n" +" por omisión de las bases de datos\n" + +#: createdb.c:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=DUEÑO usuario que será dueño de la base de datos\n" -#: createdb.c:277 +#: createdb.c:294 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr "" +" -S, --strategy=ESTRATEGIA estrategia de creación de bases de datos\n" +" wal_log o file_copy\n" + +#: createdb.c:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=PATRÓN base de datos patrón a copiar\n" -#: createdb.c:278 reindexdb.c:807 +#: createdb.c:296 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: createdb.c:279 reindexdb.c:808 +#: createdb.c:297 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: createdb.c:281 reindexdb.c:810 +#: createdb.c:299 reindexdb.c:778 #, 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" -#: createdb.c:282 reindexdb.c:811 +#: createdb.c:300 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor\n" -#: createdb.c:283 reindexdb.c:812 +#: createdb.c:301 reindexdb.c:780 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: createdb.c:284 reindexdb.c:813 +#: createdb.c:302 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: createdb.c:285 reindexdb.c:814 +#: createdb.c:303 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: createdb.c:286 reindexdb.c:815 +#: createdb.c:304 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -465,51 +492,46 @@ msgstr "" "Si no se especifica, se creará una base de datos con el mismo nombre que\n" "el usuario actual.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "valor para --connection-limit no válido: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Ingrese el nombre del rol a agregar: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Ingrese la contraseña para el nuevo rol: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Las contraseñas no coinciden.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "¿Será el nuevo rol un superusuario?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "¿Debe permitírsele al rol la creación de bases de datos?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "¿Debe permitírsele al rol la creación de otros roles?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "el cifrado de la contraseña falló: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "falló la creación del nuevo rol: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -518,34 +540,34 @@ msgstr "" "%s crea un nuevo rol de PostgreSQL.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPCIÓN]... [ROL]\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 límite de conexiones para el rol\n" " (predeterminado: sin límite)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb el rol podrá crear bases de datos\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb el rol no podrá crear bases de datos (predeterm.)\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=ROL el nuevo rol será un miembro de este rol\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -554,47 +576,47 @@ msgstr "" " -i, --inherit el rol heredará los privilegios de los roles de\n" " los cuales es miembro (predeterminado)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit rol no heredará privilegios\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login el rol podrá conectarse (predeterminado)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login el rol no podrá conectarse\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt asignar una contraseña al nuevo rol\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole el rol podrá crear otros roles\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole el rol no podrá crear otros roles (predeterminado)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser el rol será un superusuario\n" -#: createuser.c:368 +#: createuser.c:363 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser el rol no será un superusuario (predeterminado)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -603,43 +625,43 @@ msgstr "" " --interactive preguntar los nombres y atributos de rol faltantes\n" " en lugar de asumir los valores por omisión\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication el rol podrá iniciar replicación\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication el rol no podrá iniciar replicación\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=NOMBRE nombre de usuario con el cual conectarse\n" " (no el usuario a crear)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "falta el nombre de base de datos requerido" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "La base de datos «%s» será eliminada permanentemente.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "¿Está seguro?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "falló la eliminación de la base de datos: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -648,46 +670,46 @@ msgstr "" "%s elimina una base de datos de PostgreSQL.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPCIÓN]... BASE-DE-DATOS\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive preguntar antes de eliminar\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 no reportar error si la base de datos no existe\n" -#: dropuser.c:117 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "Ingrese el nombre del rol a eliminar: " -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "falta el nombre de rol requerido" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "El rol «%s» será eliminado permanentemente.\n" -#: dropuser.c:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "falló la eliminación del rol «%s»: %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -696,7 +718,7 @@ msgstr "" "%s elimina un rol de PostgreSQL.\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -705,49 +727,49 @@ msgstr "" " -i, --interactive preguntar antes de eliminar cualquier cosa, y\n" " preguntar el nombre de rol si no se especifica\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 no reportar error si el usuario no existe\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=USUARIO nombre del usuario con el cual conectarse\n" " (no el usuario a eliminar)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "no se pudo extraer las opciones por omisión" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "aceptando conexiones\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "rechazando conexiones\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "sin respuesta\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "sin intentos\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "desconocido\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -756,151 +778,146 @@ msgstr "" "%s emite una prueba de conexión a una base de datos PostgreSQL.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPCIÓN]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME nombre de la base de datos\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet ejecutar de forma silenciosa\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\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=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor\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=SEGUNDOS segundos a esperar al intentar conectarse\n" " 0 lo deshabilita (por omisión: %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=USUARIO nombre de usuario para la conexión\n" -#: 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" - -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "no se pueden reindexar todas las bases de datos y una de ellas en particular simultáneamente" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "no se pueden reindexar todas las bases de datos y los catálogos del sistema simultáneamente" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "no es posible reindexar esquemas específicos en todas las bases de datos" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "no es posible reindexar tablas específicas en todas las bases de datos" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "no es posible reindexar índices específicos en todas las bases de datos" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "no es posible reindexar esquemas específicos y los catálogos del sistema simultáneamente" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "no es posible reindexar tablas específicas y los catálogos del sistema simultáneamente" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "no es posible reindexar índices específicos y los catálogos del sistema simultáneamente" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "no se pueden usar múltiples procesos para reindexar índices de sistema" -#: reindexdb.c:288 +#: reindexdb.c:260 #, c-format 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: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 "no se puede usar la opción «%s» cuando con versiones más antiguas que PostgreSQL %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "no se puede reindexar un catálogo de sistema concurrentemente, omitiéndolos todos" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "falló la reindexación de la base de datos «%s»: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación del índice «%s» en la base de datos «%s»: %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación del esquema «%s» en la base de datos «%s»: %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "falló la reindexación de los catálogos de sistema en la base de datos «%s»: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación de la tabla «%s» en la base de datos «%s»: %s" -#: reindexdb.c:774 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindexando la base de datos «%s»\n" -#: reindexdb.c:791 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -909,62 +926,62 @@ msgstr "" "%s reindexa una base de datos PostgreSQL.\n" "\n" -#: reindexdb.c:795 +#: reindexdb.c:763 #, c-format msgid " -a, --all reindex all databases\n" -msgstr " -a, --all reindexar todas las bases de datos\n" +msgstr " -a, --all reindexar todas las bases de datos\n" -#: reindexdb.c:796 +#: reindexdb.c:764 #, c-format msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently reindexar en modo concurrente\n" +msgstr " --concurrently reindexar en modo concurrente\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=BASE-DE-DATOS base de datos a reindexar\n" +msgstr " -d, --dbname=BASE-DATOS base de datos a reindexar\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=ÍNDICE recrear sólo este o estos índice(s)\n" +msgstr " -i, --index=ÍNDICE recrear sólo este o estos índice(s)\n" -#: reindexdb.c:800 +#: reindexdb.c:768 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NÚM usar esta cantidad de conexiones concurrentes\n" +msgstr " -j, --jobs=NÚM usar esta cantidad de conexiones concurrentes\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet no desplegar mensajes\n" +msgstr " -q, --quiet no desplegar mensajes\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid " -s, --system reindex system catalogs only\n" -msgstr " -s, --system solo reindexar los catálogos del sistema\n" +msgstr " -s, --system sólo reindexar los catálogos del sistema\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=ESQUEMA reindexar sólo este o estos esquemas\n" +msgstr " -S, --schema=ESQUEMA reindexar sólo este o estos esquemas\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLA reindexar sólo esta(s) tabla(s)\n" +msgstr " -t, --table=TABLA reindexar sólo esta(s) tabla(s)\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE tablespace donde se reconstruirán los índices\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose desplegar varios mensajes informativos\n" +msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: reindexdb.c:816 +#: reindexdb.c:784 #, c-format msgid "" "\n" @@ -973,80 +990,65 @@ msgstr "" "\n" "Lea la descripción de la orden REINDEX de SQL para obtener mayores detalles.\n" -#: 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: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: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: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 "no se puede usar la opción «%s» cuando se está sólo actualizando estadísticas" -#: vacuumdb.c:332 +#: vacuumdb.c:297 #, 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:341 +#: vacuumdb.c:303 #, 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 +#: vacuumdb.c:322 #, 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:368 +#: vacuumdb.c:324 #, 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:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Generando estadísticas mínimas para el optimizador (tamaño = 1)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Generando estadísticas medias para el optimizador (tamaño = 10)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Generando estadísticas predeterminadas (completas) para el optimizador" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: procesando la base de datos «%s»: %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: limpiando la base de datos «%s»\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:952 #, 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:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "falló la limpieza de la base de datos «%s»: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1055,131 +1057,131 @@ msgstr "" "%s limpia (VACUUM) y analiza una base de datos PostgreSQL.\n" "\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" -msgstr " -a, --all limpia todas las bases de datos\n" +msgstr " -a, --all limpia todas las bases de datos\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" -msgstr " -d, --dbname=BASE base de datos a limpiar\n" +msgstr " -d, --dbname=BASE base de datos a limpiar\n" -#: vacuumdb.c:1030 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" -msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n" +msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n" -#: vacuumdb.c:1031 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" +msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: vacuumdb.c:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" -msgstr " -f, --full usar «vacuum full»\n" +msgstr " -f, --full usar «vacuum full»\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" -msgstr " -F, --freeze usar «vacuum freeze»\n" +msgstr " -F, --freeze usar «vacuum freeze»\n" -#: vacuumdb.c:1034 +#: vacuumdb.c:973 #, 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" +msgstr " --force-index-cleanup siempre eliminar entradas de índice que apunten a tuplas muertas\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:974 #, 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" +msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes\n" -#: vacuumdb.c:1036 +#: vacuumdb.c:975 #, 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" +msgstr " --min-mxid-age=EDAD_MXID edad de multixact ID mínima de tablas a limpiar\n" -#: vacuumdb.c:1037 +#: vacuumdb.c:976 #, 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" +msgstr " --min-xid-age=EDAD_XID edad de ID de transacción mínima de tablas a limpiar\n" -#: vacuumdb.c:1038 +#: vacuumdb.c:977 #, 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" +msgstr " --no-index-cleanup no eliminar entradas de índice que apunten a tuplas muertas\n" -#: vacuumdb.c:1039 +#: vacuumdb.c:978 #, 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" +msgstr " --no-process-toast omitir la tabla TOAST asociada con la tabla a la que se hará vacuum\n" -#: vacuumdb.c:1040 +#: vacuumdb.c:979 #, 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" +msgstr " --no-truncate no truncar las páginas vacías al final de la tabla\n" -#: vacuumdb.c:1041 +#: vacuumdb.c:980 #, 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" +msgstr " -P, --parallel=NPROCS usar esta cantidad de procesos para vacuum, si están disponibles\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet no desplegar mensajes\n" +msgstr " -q, --quiet no desplegar mensajes\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" -msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n" +msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n" -#: vacuumdb.c:1044 +#: vacuumdb.c:983 #, 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" +" limpiar sólo esta(s) tabla(s)\n" -#: vacuumdb.c:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose desplegar varios mensajes informativos\n" +msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version mostrar información de versión y salir\n" +msgstr " -V, --version mostrar información de versión y salir\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" -msgstr " -z, --analyze actualizar las estadísticas del optimizador\n" +msgstr " -z, --analyze actualizar las estadísticas del optimizador\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:987 #, 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" +" -Z, --analyze-only sólo actualizar las estadísticas del optimizador;\n" +" no hacer vacuum\n" -#: vacuumdb.c:1049 +#: 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 sólo actualizar las estadísticas del optimizador,\n" -" en múltiples etapas para resultados más rápidos;\n" -" no hacer vacuum\n" +" --analyze-in-stages sólo actualizar las estadísticas del optimizador,\n" +" en múltiples etapas para resultados más rápidos;\n" +" no hacer vacuum\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostrar esta ayuda y salir\n" +msgstr " -?, --help mostrar esta ayuda y salir\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/fr.po b/third_party/spanner_pg/src/bin/scripts/po/fr.po index 2f51ed5f..d024520d 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/fr.po +++ b/third_party/spanner_pg/src/bin/scripts/po/fr.po @@ -1,18 +1,21 @@ -# 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: 2023-10-29 12:18+0000\n" -"PO-Revision-Date: 2023-10-30 13:36+0100\n" +"POT-Creation-Date: 2023-10-29 12:05+0000\n" +"PO-Revision-Date: 2023-10-30 13:37+0100\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" @@ -20,21 +23,26 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.4\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "fatal : " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -68,20 +76,30 @@ msgstr "Requête d'annulation envoyée\n" 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/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:319 #, c-format msgid "too many jobs for this platform: %d" @@ -92,38 +110,43 @@ msgstr "trop de jobs pour cette plateforme : %d" msgid "socket file descriptor out of range for select(): %d" msgstr "descripteur de fichier socket hors d'échelle pour select() : %d" -#: ../../fe_utils/parallel_slot.c:551 +#: ../../fe_utils/parallel_slot.c:330 +#, c-format +msgid "Try fewer jobs." +msgstr "Essayez moins de jobs." + +#: ../../fe_utils/parallel_slot.c:552 #, 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:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "format de sortie invalide (erreur interne) : %d" @@ -135,19 +158,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 »)" @@ -157,27 +180,27 @@ 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:253 +#: clusterdb.c:248 #, 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:269 +#: clusterdb.c:264 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -187,19 +210,19 @@ msgstr "" "base de données via la commande CLUSTER.\n" "\n" -#: clusterdb.c:270 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:794 vacuumdb.c:1025 +#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: clusterdb.c:271 reindexdb.c:795 vacuumdb.c:1026 +#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [BASE]\n" -#: clusterdb.c:272 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:796 vacuumdb.c:1027 +#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -208,48 +231,48 @@ msgstr "" "\n" "Options :\n" -#: clusterdb.c:273 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all réorganise toutes les bases de données\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=BASE réorganise la base de données spécifiée\n" -#: clusterdb.c:275 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:270 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:276 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: clusterdb.c:277 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE réorganise uniquement la table spécifiée\n" -#: clusterdb.c:278 +#: clusterdb.c:273 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: clusterdb.c:279 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:274 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" -#: clusterdb.c:280 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:275 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" -#: clusterdb.c:281 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:811 vacuumdb.c:1052 +#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -258,39 +281,39 @@ msgstr "" "\n" "Options de connexion :\n" -#: clusterdb.c:282 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: clusterdb.c:277 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=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: clusterdb.c:283 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: clusterdb.c:278 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:284 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: clusterdb.c:285 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: clusterdb.c:280 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" -#: clusterdb.c:286 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: clusterdb.c:281 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" -#: clusterdb.c:287 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: clusterdb.c:288 +#: clusterdb.c:283 #, c-format msgid "" "\n" @@ -299,8 +322,8 @@ msgstr "" "\n" "Lire la description de la commande SQL CLUSTER pour de plus amples détails.\n" -#: clusterdb.c:289 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:819 vacuumdb.c:1060 +#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -309,8 +332,8 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: clusterdb.c:290 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:820 vacuumdb.c:1061 +#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" @@ -344,32 +367,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Merci de répondre « %s » ou « %s ».\n" -#: createdb.c:150 -#, 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 -#, 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:173 #, 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:243 #, 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:262 #, 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:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -378,96 +391,115 @@ msgstr "" "%s crée une base de données PostgreSQL.\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [BASE] [DESCRIPTION]\n" -#: createdb.c:270 +#: createdb.c:284 #, 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:800 +#: createdb.c:285 reindexdb.c:768 #, 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:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODAGE encodage de la base de données\n" -#: createdb.c:273 +#: createdb.c:287 #, 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 données\n" -#: createdb.c:274 +#: createdb.c:288 #, 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:289 #, 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:290 +#, 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:291 +#, 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:293 #, 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:294 +#, 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:295 #, 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:809 +#: createdb.c:296 reindexdb.c:777 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: createdb.c:279 reindexdb.c:810 +#: createdb.c:297 reindexdb.c:778 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: createdb.c:281 reindexdb.c:812 +#: createdb.c:299 reindexdb.c:780 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -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:813 +#: createdb.c:300 reindexdb.c:781 #, 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:814 +#: createdb.c:301 reindexdb.c:782 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: createdb.c:284 reindexdb.c:815 +#: createdb.c:302 reindexdb.c:783 #, 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:816 +#: createdb.c:303 reindexdb.c:784 #, 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:817 +#: createdb.c:304 reindexdb.c:785 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -476,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 "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 nouveau rôle a échoué : %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -529,36 +556,36 @@ 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]... [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 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 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 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" @@ -567,49 +594,49 @@ msgstr "" " -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 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" @@ -618,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" -#: 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" -#: 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=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" @@ -667,52 +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]... 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\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\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" -#: 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" @@ -721,7 +748,7 @@ 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" @@ -731,51 +758,51 @@ msgstr "" " 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" -#: 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=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" @@ -784,153 +811,148 @@ msgstr "" "%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=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" -#: 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" -#: 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" -#: pg_isready.c:235 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -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" -#: 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\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=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:776 +#: reindexdb.c:744 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s : réindexation de la base de données « %s »\n" -#: reindexdb.c:793 +#: reindexdb.c:761 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -939,66 +961,66 @@ msgstr "" "%s réindexe une base de données PostgreSQL.\n" "\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all réindexe toutes les bases de données\n" -#: reindexdb.c:798 +#: reindexdb.c:766 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently réindexation en concurrence\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=BASE réindexe la base de données spécifiée\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX réindexe uniquement l'index spécifié\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" " pour l'opération de réindexation\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system réindexe seulement les catalogues système\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHÉMA réindexe uniquement le schéma spécifié\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE réindexe uniquement la table spécifiée\n" -#: reindexdb.c:807 +#: reindexdb.c:775 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" " --tablespace=TABLESPACE précise le tablespace où les index seront\n" " reconstruits\n" -#: reindexdb.c:808 +#: reindexdb.c:776 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: reindexdb.c:818 +#: reindexdb.c:786 #, c-format msgid "" "\n" @@ -1007,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:1013 +#: 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:1016 +#: 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:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1089,134 +1096,134 @@ msgstr "" "%s nettoie et analyse une base de données PostgreSQL.\n" "\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all exécute VACUUM sur toutes les bases de données\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=BASE exécute VACUUM sur cette base de données\n" -#: vacuumdb.c:1030 +#: 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:1031 +#: 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:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full exécute VACUUM en mode FULL\n" -#: vacuumdb.c:1033 +#: 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" -#: vacuumdb.c:1034 +#: 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:1035 +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" " pour le VACUUM\n" -#: vacuumdb.c:1036 +#: 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\n" " multitransactions pour les tables à nettoyer\n" -#: vacuumdb.c:1037 +#: 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\n" " pour les tables à nettoyer\n" -#: vacuumdb.c:1038 +#: 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\n" " l'index pointant vers des lignes mortes\n" -#: vacuumdb.c:1039 +#: 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 à\n" " traiter\n" -#: vacuumdb.c:1040 +#: vacuumdb.c:979 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr "" " --no-truncate ne supprime pas les pages vides à la fin de\n" " la table\n" -#: vacuumdb.c:1041 +#: vacuumdb.c:980 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=NOMBRE utilise ce nombre de processus en tâche de\n" " fond pour le VACUUM, si possible\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: vacuumdb.c:1043 +#: 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\n" " verrouillées immédiatement\n" -#: vacuumdb.c:1044 +#: 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 table\n" -#: vacuumdb.c:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n" -#: vacuumdb.c:1048 +#: 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" -#: vacuumdb.c:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1226,12 +1233,12 @@ msgstr "" " l'optimiseur, en plusieurs étapes pour de\n" " meilleurs résultats ; pas de VACUUM\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" @@ -1382,15 +1389,51 @@ msgstr "" #~ 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" + +#, 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" + +#, 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" + #~ 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" diff --git a/third_party/spanner_pg/src/bin/scripts/po/it.po b/third_party/spanner_pg/src/bin/scripts/po/it.po new file mode 100644 index 00000000..50551cd3 --- /dev/null +++ b/third_party/spanner_pg/src/bin/scripts/po/it.po @@ -0,0 +1,1228 @@ +# +# pgscripts.po +# Italian message translation file for pgscripts +# +# For development and bug report please use: +# https://github.com/dvarrazzo/postgresql-it +# +# Copyright (C) 2012-2017 PostgreSQL Global Development Group +# Copyright (C) 2010, Associazione Culturale ITPUG +# +# Daniele Varrazzo , 2012-2017. +# Emanuele Zamprogno , 2009. +# Mirko Tebaldi , 2004. +# Fabrizio Mazzoni , 2003. +# +# This file is distributed under the same license as the PostgreSQL package. +# +msgid "" +msgstr "" +"Project-Id-Version: pgscripts (PostgreSQL) 11\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:19+0000\n" +"PO-Revision-Date: 2022-10-03 20:43+0200\n" +"Last-Translator: Daniele Varrazzo \n" +"Language-Team: https://github.com/dvarrazzo/postgresql-it\n" +"Language: it\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-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 3.1.1\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "errore: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "avviso: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "dettaglio: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "suggerimento: " + +#: ../../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 "memoria esaurita\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "impossibile duplicare il puntatore nullo (errore interno)\n" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "impossibile cercare l'ID utente effettivo %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "l'utente non esiste" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "ricerca del nome utente fallita: codice di errore %lu" + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Richiesta di annullamento inviata\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Impossibile inviare la richiesta di annullamento: " + +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +msgid "Password: " +msgstr "Password: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "impossibile connettersi al database %s: memoria insufficiente" + +#: ../../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 "valore \"%s\" non valido per l'opzione %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s deve essere compreso nell'intervallo %d..%d" + +#: ../../fe_utils/parallel_slot.c:301 +#, c-format +msgid "too many jobs for this platform" +msgstr "troppi lavori per questa piattaforma" + +#: ../../fe_utils/parallel_slot.c:519 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "elaborazione del database \"%s\" non riuscita: %s" + +#: ../../fe_utils/print.c:406 +#, c-format +msgid "(%lu row)" +msgid_plural "(%lu rows)" +msgstr[0] "(%lu riga)" +msgstr[1] "(%lu righe)" + +#: ../../fe_utils/print.c:3109 +#, c-format +msgid "Interrupted\n" +msgstr "Interrotto\n" + +#: ../../fe_utils/print.c:3173 +#, c-format +msgid "Cannot add header to table content: column count of %d exceeded.\n" +msgstr "Impossibile aggiungere l'intestazione al contenuto della tabella: numero di colonne è più di %d.\n" + +#: ../../fe_utils/print.c:3213 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "Impossibile aggiungere la cella al contenuto della tabella: il numero totale di celle è più di %d.\n" + +#: ../../fe_utils/print.c:3471 +#, c-format +msgid "invalid output format (internal error): %d" +msgstr "formato di output non valido (errore interno): %d" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "query fallita: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "Query was: %s" +msgstr "La richiesta era: %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 "Prova \"%s --help\" per maggiori informazioni." + +#: 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 "troppi argomenti della riga di comando (il primo è \"%s\")" + +#: clusterdb.c:148 +#, c-format +msgid "cannot cluster all databases and a specific one at the same time" +msgstr "non può raggruppare tutti i database e uno specifico contemporaneamente" + +#: clusterdb.c:151 +#, c-format +msgid "cannot cluster specific table(s) in all databases" +msgstr "impossibile raggruppare tabelle specifiche in tutti i database" + +#: clusterdb.c:215 +#, c-format +msgid "clustering of table \"%s\" in database \"%s\" failed: %s" +msgstr "raggruppamento della tabella \"%s\" nel database \"%s\" non riuscito: %s" + +#: clusterdb.c:218 +#, c-format +msgid "clustering of database \"%s\" failed: %s" +msgstr "raggruppamento del database \"%s\" non riuscito: %s" + +#: clusterdb.c:246 +#, c-format +msgid "%s: clustering database \"%s\"\n" +msgstr "%s: riordino del database \"%s\"\n" + +#: clusterdb.c:262 +#, c-format +msgid "" +"%s clusters all previously clustered tables in a database.\n" +"\n" +msgstr "" +"%s raggruppa tutte le tabelle precedentemente raggruppate in un database.\n" +"\n" + +#: clusterdb.c:263 createdb.c:281 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 "Utilizzo:\n" + +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [OPZIONE]... [NOMEDB]\n" + +#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opzioni:\n" + +#: clusterdb.c:266 +#, c-format +msgid " -a, --all cluster all databases\n" +msgstr " -a, --all raggruppa tutti i database\n" + +#: clusterdb.c:267 +#, c-format +msgid " -d, --dbname=DBNAME database to cluster\n" +msgstr " -d, --dbname=NOMEDB database da raggruppare\n" + +#: 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 mostra i comandi inviati al server\n" + +#: clusterdb.c:269 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet non stampare alcun messaggio\n" + +#: clusterdb.c:270 +#, c-format +msgid " -t, --table=TABLE cluster specific table(s) only\n" +msgstr " -t, --table=TABELLA raggruppa solo le tabelle specificate\n" + +#: clusterdb.c:271 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose mostra un output completo\n" + +#: 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 mostra informazioni sulla versione ed esci\n" + +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" + +#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"Opzioni di connessione:\n" + +#: 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 host del server database o directory socket\n" + +#: 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=PORTA porta del server database\n" + +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=UTENTE nome utente da utilizzare per la connessione\n" + +#: 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 non richiedere mai una password\n" + +#: 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 forza la richiesta di una password\n" + +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n" + +#: clusterdb.c:281 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command CLUSTER for details.\n" +msgstr "" +"\n" +"Consulta la descrizione del comando SQL CLUSTER per maggiori informazioni.\n" + +#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Segnala i bug a <%s>.\n" + +#: clusterdb.c:283 createdb.c:307 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 "Pagina iniziale di %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] "la query ha restituito %d riga anziché una: %s" +msgstr[1] "le query hanno restituito %d righe invece di una: %s" + +#. translator: abbreviation for "yes" +#: common.c:131 +msgid "y" +msgstr "s" + +#. 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 "Prego rispondere \"%s\" o \"%s\".\n" + +#: createdb.c:173 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" non è un nome di codifica valido" + +#: createdb.c:243 +#, c-format +msgid "database creation failed: %s" +msgstr "creazione del database non riuscita: %s" + +#: createdb.c:262 +#, c-format +msgid "comment creation failed (database was created): %s" +msgstr "creazione commento non riuscita (database creato): %s" + +#: createdb.c:280 +#, c-format +msgid "" +"%s creates a PostgreSQL database.\n" +"\n" +msgstr "" +"%s crea un database PostgreSQL.\n" +"\n" + +#: createdb.c:282 +#, c-format +msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" +msgstr " %s [OPZIONE]... [NOMEDB] [DESCRIZIONE]\n" + +#: createdb.c:284 +#, c-format +msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" +msgstr " -D, --tablespace=TABLESPACE tablespace predefinito per il database\n" + +#: createdb.c:285 reindexdb.c:766 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo mostra i comandi che vengono inviati al server\n" + +#: createdb.c:286 +#, c-format +msgid " -E, --encoding=ENCODING encoding for the database\n" +msgstr " -E, --encoding=ENCODING codifica del database\n" + +#: createdb.c:287 +#, c-format +msgid " -l, --locale=LOCALE locale settings for the database\n" +msgstr " -l, --locale=LOCALE impostazioni di localizzazione del database\n" + +#: createdb.c:288 +#, c-format +msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" +msgstr " --lc-collate=LOCALE impostazione LC_COLLATE per il database\n" + +#: createdb.c:289 +#, c-format +msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" +msgstr " --lc-ctype=LOCALE impostazione LC_CTYPE per il database\n" + +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE Impostazione locale ICU per il database\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" provider delle impostazioni locali per le regole di confronto predefinite del database\n" + +#: createdb.c:293 +#, c-format +msgid " -O, --owner=OWNER database user to own the new database\n" +msgstr " -O, --owner=OWNER utente database proprietario del nuovo database\n" + +#: createdb.c:294 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=strategia di creazione del database STRATEGIA wal_log o file_copy\n" + +#: createdb.c:295 +#, c-format +msgid " -T, --template=TEMPLATE template database to copy\n" +msgstr " -T, --template=TEMPLATE modello database da copiare\n" + +#: createdb.c:296 reindexdb.c:775 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informazioni sulla versione ed esci\n" + +#: createdb.c:297 reindexdb.c:776 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" + +#: createdb.c:299 reindexdb.c:778 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME host del server database o directory socket\n" + +#: createdb.c:300 reindexdb.c:779 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT porta del server database\n" + +#: createdb.c:301 reindexdb.c:780 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME nome utente da usare per connettersi\n" + +#: createdb.c:302 reindexdb.c:781 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password non richiedere mai una password\n" + +#: createdb.c:303 reindexdb.c:782 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password forza la richiesta di una password\n" + +#: createdb.c:304 reindexdb.c:783 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n" + +#: createdb.c:305 +#, c-format +msgid "" +"\n" +"By default, a database with the same name as the current user is created.\n" +msgstr "" +"\n" +"Se il nome non è specificato verrà creato un database con lo stesso nome\n" +"dell'utente corrente.\n" + +#: createuser.c:193 +msgid "Enter name of role to add: " +msgstr "Inserisci il nome del ruolo da aggiungere: " + +#: createuser.c:208 +msgid "Enter password for new role: " +msgstr "Inserisci la password per il nuovo ruolo: " + +#: createuser.c:209 +msgid "Enter it again: " +msgstr "Conferma password: " + +#: createuser.c:212 +#, c-format +msgid "Passwords didn't match.\n" +msgstr "Le password non corrispondono.\n" + +#: createuser.c:220 +msgid "Shall the new role be a superuser?" +msgstr "Il nuovo ruolo dev'essere un superutente?" + +#: createuser.c:235 +msgid "Shall the new role be allowed to create databases?" +msgstr "Il nuovo ruolo può creare database?" + +#: createuser.c:243 +msgid "Shall the new role be allowed to create more new roles?" +msgstr "Il nuovo ruolo può creare altri ruoli?" + +#: createuser.c:278 +#, c-format +msgid "password encryption failed: %s" +msgstr "crittografia della password non riuscita: %s" + +#: createuser.c:331 +#, c-format +msgid "creation of new role failed: %s" +msgstr "creazione di un nuovo ruolo non riuscita: %s" + +#: createuser.c:345 +#, c-format +msgid "" +"%s creates a new PostgreSQL role.\n" +"\n" +msgstr "" +"%s crea un nuovo ruolo PostgreSQL.\n" +"\n" + +#: createuser.c:347 dropuser.c:171 +#, c-format +msgid " %s [OPTION]... [ROLENAME]\n" +msgstr " %s [OPZIONI]... [NOME_RUOLO]\n" + +#: createuser.c:349 +#, c-format +msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" +msgstr " -c, --connection-limit=N limite di connessione per un ruolo (predefinito: nessun limite)\n" + +#: createuser.c:350 +#, c-format +msgid " -d, --createdb role can create new databases\n" +msgstr " -d, --createdb il ruolo può creare nuovi database\n" + +#: createuser.c:351 +#, c-format +msgid " -D, --no-createdb role cannot create databases (default)\n" +msgstr " -D, --no-createdb il ruolo non può creare database (predefinito)\n" + +#: createuser.c:353 +#, c-format +msgid " -g, --role=ROLE new role will be a member of this role\n" +msgstr " -g, --role=RUOLO il nuovo ruolo sarà membro di questo ruolo\n" + +#: createuser.c:354 +#, c-format +msgid "" +" -i, --inherit role inherits privileges of roles it is a\n" +" member of (default)\n" +msgstr "" +" -i, --inherit il ruolo eredita i privilegi dei ruoli di cui\n" +" è membro (predefinito)\n" + +#: createuser.c:356 +#, c-format +msgid " -I, --no-inherit role does not inherit privileges\n" +msgstr " -I, --no-inherit il ruolo non eredita privilegi\n" + +#: createuser.c:357 +#, c-format +msgid " -l, --login role can login (default)\n" +msgstr " -l, --login il ruolo può accedere al database (predefinito)\n" + +#: createuser.c:358 +#, c-format +msgid " -L, --no-login role cannot login\n" +msgstr " -L, --no-login il ruolo non può accedere al database\n" + +#: createuser.c:359 +#, c-format +msgid " -P, --pwprompt assign a password to new role\n" +msgstr " -P, --pwprompt assegna una password al nuovo ruolo\n" + +#: createuser.c:360 +#, c-format +msgid " -r, --createrole role can create new roles\n" +msgstr " -r, --createrole il ruolo può creare nuovi ruoli\n" + +#: createuser.c:361 +#, c-format +msgid " -R, --no-createrole role cannot create roles (default)\n" +msgstr " -R, --no-createrole il ruolo non può creare ruoli (predefinito)\n" + +#: createuser.c:362 +#, c-format +msgid " -s, --superuser role will be superuser\n" +msgstr " -s, --superuser il ruolo sarà un superutente\n" + +#: createuser.c:363 +#, c-format +msgid " -S, --no-superuser role will not be superuser (default)\n" +msgstr " -S, --no-superuser il ruolo non sarà un superutente (predefinito)\n" + +#: createuser.c:365 +#, c-format +msgid "" +" --interactive prompt for missing role name and attributes rather\n" +" than using defaults\n" +msgstr "" +" --interactive richiedi i nomi ed attributi dei ruoli mancanti\n" +" invece di usare i valori predefiniti\n" + +#: createuser.c:367 +#, c-format +msgid " --replication role can initiate replication\n" +msgstr " --replication il ruolo può avviare una replica\n" + +#: createuser.c:368 +#, c-format +msgid " --no-replication role cannot initiate replication\n" +msgstr " --no-replication il ruolo non può avviare una replica\n" + +#: createuser.c:373 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" +msgstr "" +" -U, --username=UTENTE nome utente con cui collegarsi\n" +" (non quello da creare)\n" + +#: dropdb.c:112 +#, c-format +msgid "missing required argument database name" +msgstr "nome del database dell'argomento richiesto mancante" + +#: dropdb.c:127 +#, c-format +msgid "Database \"%s\" will be permanently removed.\n" +msgstr "Il database \"%s\" sarà eliminato definitivamente.\n" + +#: dropdb.c:128 dropuser.c:131 +msgid "Are you sure?" +msgstr "Sei sicuro?" + +#: dropdb.c:157 +#, c-format +msgid "database removal failed: %s" +msgstr "rimozione del database non riuscita: %s" + +#: dropdb.c:171 +#, c-format +msgid "" +"%s removes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s elimina un database PostgreSQL.\n" +"\n" + +#: dropdb.c:173 +#, c-format +msgid " %s [OPTION]... DBNAME\n" +msgstr " %s [OPZIONE]... NOMEDB\n" + +#: dropdb.c:176 +#, c-format +msgid " -f, --force try to terminate other connections before dropping\n" +msgstr " -f, --force prova a terminare altre connessioni prima di cadere\n" + +#: dropdb.c:177 +#, c-format +msgid " -i, --interactive prompt before deleting anything\n" +msgstr " -i, --interactive chiedi conferma prima di cancellare qualunque cosa\n" + +#: dropdb.c:179 +#, c-format +msgid " --if-exists don't report error if database doesn't exist\n" +msgstr " --if-exists non riportare errori se il database non esiste\n" + +#: dropuser.c:118 +msgid "Enter name of role to drop: " +msgstr "Inserisci il nome del ruolo da eliminare: " + +#: dropuser.c:122 +#, c-format +msgid "missing required argument role name" +msgstr "nome del ruolo dell'argomento richiesto mancante" + +#: dropuser.c:130 +#, c-format +msgid "Role \"%s\" will be permanently removed.\n" +msgstr "Il ruolo \"%s\" sarà eliminato definitivamente.\n" + +#: dropuser.c:154 +#, c-format +msgid "removal of role \"%s\" failed: %s" +msgstr "rimozione del ruolo \"%s\" non riuscita: %s" + +#: dropuser.c:169 +#, c-format +msgid "" +"%s removes a PostgreSQL role.\n" +"\n" +msgstr "" +"%s elimina un ruolo PostgreSQL.\n" +"\n" + +#: 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 chiedi conferma prima cancellare qualunque cosa\n" +" e richiedi i nomi dei ruoli se non specificati\n" + +#: dropuser.c:177 +#, c-format +msgid " --if-exists don't report error if user doesn't exist\n" +msgstr " --if-exists non riportare errori se l'utente non esiste\n" + +#: dropuser.c:182 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" +msgstr "" +" -U, --username=UTENTE nome utente con cui collegarsi\n" +" (non quello da eliminare)\n" + +#: pg_isready.c:154 +#, c-format +msgid "could not fetch default options" +msgstr "impossibile recuperare le opzioni predefinite" + +#: pg_isready.c:203 +#, c-format +msgid "accepting connections\n" +msgstr "le connessioni sono accettate\n" + +#: pg_isready.c:206 +#, c-format +msgid "rejecting connections\n" +msgstr "le connessioni sono rifiutate\n" + +#: pg_isready.c:209 +#, c-format +msgid "no response\n" +msgstr "nessuna risposta\n" + +#: pg_isready.c:212 +#, c-format +msgid "no attempt\n" +msgstr "nessun tentativo\n" + +#: pg_isready.c:215 +#, c-format +msgid "unknown\n" +msgstr "sconosciuto\n" + +#: pg_isready.c:225 +#, c-format +msgid "" +"%s issues a connection check to a PostgreSQL database.\n" +"\n" +msgstr "" +"%s effettua una connessione di controllo ad un database PostgreSQL.\n" +"\n" + +#: pg_isready.c:227 +#, c-format +msgid " %s [OPTION]...\n" +msgstr " %s [OPZIONE]...\n" + +#: pg_isready.c:230 +#, c-format +msgid " -d, --dbname=DBNAME database name\n" +msgstr " -d, --dbname=NOMEDB nome database\n" + +#: pg_isready.c:231 +#, c-format +msgid " -q, --quiet run quietly\n" +msgstr " -q, --quiet esegui silenziosamente\n" + +#: pg_isready.c:232 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informazioni sulla versione ed esci\n" + +#: pg_isready.c:233 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" + +#: pg_isready.c:236 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=NOMEHOST host server del database o directory socket\n" + +#: pg_isready.c:237 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORTA porta del server database\n" + +#: pg_isready.c:238 +#, c-format +msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" +msgstr " -t, --timeout=SEC secondi di attesa tentando una connessione, 0 disabilita (predefinito: %s)\n" + +#: pg_isready.c:239 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=UTENTE nome utente con cui connettersi\n" + +#: reindexdb.c:209 +#, c-format +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "non può reindicizzare tutti i database e uno specifico contemporaneamente" + +#: reindexdb.c:211 +#, c-format +msgid "cannot reindex all databases and system catalogs at the same time" +msgstr "non può reindicizzare tutti i database e i cataloghi di sistema contemporaneamente" + +#: reindexdb.c:213 +#, c-format +msgid "cannot reindex specific schema(s) in all databases" +msgstr "non può reindicizzare schemi specifici in tutti i database" + +#: reindexdb.c:215 +#, c-format +msgid "cannot reindex specific table(s) in all databases" +msgstr "impossibile reindicizzare tabelle specifiche in tutti i database" + +#: reindexdb.c:217 +#, c-format +msgid "cannot reindex specific index(es) in all databases" +msgstr "non può reindicizzare indici specifici in tutti i database" + +#: reindexdb.c:227 +#, c-format +msgid "cannot reindex specific schema(s) and system catalogs at the same time" +msgstr "non può reindicizzare contemporaneamente schemi e cataloghi di sistema specifici" + +#: reindexdb.c:229 +#, c-format +msgid "cannot reindex specific table(s) and system catalogs at the same time" +msgstr "non può reindicizzare tabelle specifiche e cataloghi di sistema contemporaneamente" + +#: reindexdb.c:231 +#, c-format +msgid "cannot reindex specific index(es) and system catalogs at the same time" +msgstr "non può reindicizzare contemporaneamente indici specifici e cataloghi di sistema" + +#: reindexdb.c:234 +#, c-format +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "non è possibile utilizzare più lavori per reindicizzare i cataloghi di sistema" + +#: reindexdb.c:260 +#, c-format +msgid "cannot use multiple jobs to reindex indexes" +msgstr "non è possibile utilizzare più lavori per reindicizzare gli indici" + +#: 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 "non è possibile utilizzare l'opzione \"%s\" su versioni del server precedenti a PostgreSQL %s" + +#: reindexdb.c:369 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "impossibile reindicizzare i cataloghi di sistema contemporaneamente, saltando tutto" + +#: reindexdb.c:573 +#, c-format +msgid "reindexing of database \"%s\" failed: %s" +msgstr "reindicizzazione del database \"%s\" non riuscita: %s" + +#: reindexdb.c:577 +#, c-format +msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" +msgstr "reindicizzazione dell'indice \"%s\" nel database \"%s\" non riuscita: %s" + +#: reindexdb.c:581 +#, c-format +msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" +msgstr "reindicizzazione dello schema \"%s\" nel database \"%s\" non riuscita: %s" + +#: reindexdb.c:585 +#, c-format +msgid "reindexing of system catalogs in database \"%s\" failed: %s" +msgstr "reindicizzazione dei cataloghi di sistema nel database \"%s\" non riuscita: %s" + +#: reindexdb.c:589 +#, c-format +msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" +msgstr "reindicizzazione della tabella \"%s\" nel database \"%s\" non riuscita: %s" + +#: reindexdb.c:742 +#, c-format +msgid "%s: reindexing database \"%s\"\n" +msgstr "%s: re-indicizzazione del database \"%s\"\n" + +#: reindexdb.c:759 +#, c-format +msgid "" +"%s reindexes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s re-indicizza un database PostgreSQL.\n" +"\n" + +#: reindexdb.c:763 +#, c-format +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all reindicizza tutti i database\n" + +#: reindexdb.c:764 +#, c-format +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently reindecizza in contemporanea\n" + +#: reindexdb.c:765 +#, c-format +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=database DBNAME da reindicizzare\n" + +#: reindexdb.c:767 +#, c-format +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX ricrea solo indici specifici\n" + +#: reindexdb.c:768 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee per reindicizzare\n" + +#: reindexdb.c:769 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet non scrive alcun messaggio\n" + +#: reindexdb.c:770 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system reindex solo i cataloghi di sistema\n" + +#: reindexdb.c:771 +#, c-format +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA reindicizza solo gli schemi specifici\n" + +#: reindexdb.c:772 +#, c-format +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE solo per tabelle specifiche per reindicizzare\n" + +#: reindexdb.c:773 +#, c-format +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABLESPACE tablespace in cui vengono ricostruiti gli indici\n" + +#: reindexdb.c:774 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose scrive molto output\n" + +#: reindexdb.c:784 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"Consulta la descrizione del comando SQL REINDEX per maggiori informazioni.\n" + +#: 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 "non è possibile utilizzare l'opzione \"%s\" quando si esegue solo l'analisi" + +#: vacuumdb.c:297 +#, c-format +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "non è possibile utilizzare l'opzione \"%s\" quando si esegue il vuoto completo" + +#: vacuumdb.c:303 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "non è possibile utilizzare l'opzione \"%s\" con l'opzione \"%s\"." + +#: vacuumdb.c:322 +#, c-format +msgid "cannot vacuum all databases and a specific one at the same time" +msgstr "non è possibile fare il vacuum di tutti i database e uno specifico contemporaneamente" + +#: vacuumdb.c:324 +#, c-format +msgid "cannot vacuum specific table(s) in all databases" +msgstr "non può aspirare tabelle specifiche in tutti i database" + +#: vacuumdb.c:412 +msgid "Generating minimal optimizer statistics (1 target)" +msgstr "Generazione di statistiche ottimizzatore minime (1 obiettivo)" + +#: vacuumdb.c:413 +msgid "Generating medium optimizer statistics (10 targets)" +msgstr "Generazione di statistiche ottimizzatore medie (10 obiettivi)" + +#: vacuumdb.c:414 +msgid "Generating default (full) optimizer statistics" +msgstr "Generazione di statistiche ottimizzatore di default (completo)" + +#: vacuumdb.c:479 +#, c-format +msgid "%s: processing database \"%s\": %s\n" +msgstr "%s: elaborazione del database \"%s\": %s\n" + +#: vacuumdb.c:482 +#, c-format +msgid "%s: vacuuming database \"%s\"\n" +msgstr "%s: pulizia del database \"%s\"\n" + +#: vacuumdb.c:952 +#, c-format +msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" +msgstr "svuotamento della tabella \"%s\" nel database \"%s\" non riuscito: %s" + +#: vacuumdb.c:955 +#, c-format +msgid "vacuuming of database \"%s\" failed: %s" +msgstr "svuotamento del database \"%s\" non riuscito: %s" + +#: vacuumdb.c:963 +#, c-format +msgid "" +"%s cleans and analyzes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s pulisce ed analizza un database PostgreSQL.\n" +"\n" + +#: vacuumdb.c:967 +#, c-format +msgid " -a, --all vacuum all databases\n" +msgstr " -a, --all pulisci tutti i database\n" + +#: vacuumdb.c:968 +#, c-format +msgid " -d, --dbname=DBNAME database to vacuum\n" +msgstr " -d, --dbname=NOMEDB database da pulire\n" + +#: vacuumdb.c:969 +#, c-format +msgid " --disable-page-skipping disable all page-skipping behavior\n" +msgstr " --disable-page-skipping disabilita tutti i comportamenti di salto di pagina\n" + +#: vacuumdb.c:970 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo mostra i comandi inviati al server\n" + +#: vacuumdb.c:971 +#, c-format +msgid " -f, --full do full vacuuming\n" +msgstr " -f, --full esegui una pulizia completa\n" + +#: vacuumdb.c:972 +#, c-format +msgid " -F, --freeze freeze row transaction information\n" +msgstr "" +" -F, --freeze congela le informazioni per la transazione\n" +" sulla riga\n" + +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup rimuove sempre le voci di indice che puntano a tuple morte\n" + +#: vacuumdb.c:974 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" +msgstr "" +" -j, --jobs=NUM usa questo numero di connessioni concorrenti\n" +" per effetturare il vacuum\n" + +#: 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 età minima dell'ID multixact delle tabelle da aspirare\n" + +#: 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 minimo ID transazione età delle tabelle da aspirare\n" + +#: vacuumdb.c:977 +#, c-format +msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" +msgstr " --no-index-cleanup non rimuove le voci di indice che puntano a tuple morte\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 salta la tabella TOAST associata alla tabella da aspirare\n" + +#: vacuumdb.c:979 +#, c-format +msgid " --no-truncate don't truncate empty pages at the end of the table\n" +msgstr " --no-truncate non tronca le pagine vuote alla fine della tabella\n" + +#: 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 usa questo numero di lavoratori in background per il vuoto, se disponibile\n" + +#: vacuumdb.c:981 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet non stampare alcun messaggio\n" + +#: vacuumdb.c:982 +#, c-format +msgid " --skip-locked skip relations that cannot be immediately locked\n" +msgstr " --skip-locked salta le relazioni che non possono essere bloccate immediatamente\n" + +#: vacuumdb.c:983 +#, c-format +msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" +msgstr " -t, --table='TABELLA[(COLONNE)]' ripulisci solo le tabelle specificate\n" + +#: vacuumdb.c:984 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose mostra molti messaggi\n" + +#: vacuumdb.c:985 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informazioni sulla versione ed esci\n" + +#: vacuumdb.c:986 +#, c-format +msgid " -z, --analyze update optimizer statistics\n" +msgstr " -z, --analyze aggiorna le statistiche per l'ottimizzatore\n" + +#: vacuumdb.c:987 +#, c-format +msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" +msgstr " -Z, --analyze-only aggiorna solo le statistiche; niente vacuum\n" + +#: 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 aggiorna solo le statistiche, in fasi multiple\n" +" per maggiore velocità, niente vacuum\n" + +#: vacuumdb.c:990 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" + +#: vacuumdb.c:998 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command VACUUM for details.\n" +msgstr "" +"\n" +"Consulta la descrizione del comando SQL VACUUM per maggiori informazioni.\n" + +#~ msgid "%s: \"%s\" is not a valid encoding name\n" +#~ msgstr "%s: \"%s\" non è un nome di codifica valido\n" + +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +#~ msgid "%s: could not connect to database %s: %s" +#~ msgstr "%s: connessione al database %s fallita: %s" + +#~ msgid "%s: number of parallel jobs must be at least 1\n" +#~ msgstr "%s: il numero dei lavori paralleli dev'essere almeno 1\n" + +#~ msgid "%s: only one of --locale and --lc-collate can be specified\n" +#~ msgstr "%s: solo uno tra --locale e --lc-collate può essere specificato\n" + +#~ msgid "%s: only one of --locale and --lc-ctype can be specified\n" +#~ msgstr "%s: solo uno tra --locale e --lc-ctype può essere specificato\n" + +#~ msgid "%s: query failed: %s" +#~ msgstr "%s: query fallita: %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 query ha restituito %d righe invece di una: %s\n" +#~ msgstr[1] "%s: la query ha restituito %d righe invece di una: %s\n" + +#~ msgid "%s: query was: %s\n" +#~ msgstr "%s: la query era: %s\n" + +#~ msgid "%s: reindexing of system catalogs failed: %s" +#~ msgstr "%s: la re-indicizzazione dei cataloghi di sistema è fallita: %s" + +#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n" +#~ msgstr "%s: troppi lavori in parallelo richiesti (massimo: %d)\n" + +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/ja.po b/third_party/spanner_pg/src/bin/scripts/po/ja.po index c085e480..82862858 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/ja.po +++ b/third_party/spanner_pg/src/bin/scripts/po/ja.po @@ -7,9 +7,9 @@ # msgid "" msgstr "" -"Project-Id-Version: scripts (PostgreSQL 14)\n" +"Project-Id-Version: scripts (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-10-16 10:44+0900\n" +"POT-Creation-Date: 2023-10-16 10:45+0900\n" "PO-Revision-Date: 2023-10-16 11:01+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" @@ -17,39 +17,44 @@ msgstr "" "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:259 -#, c-format -msgid "fatal: " -msgstr "致命的エラー: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:301 +#, 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 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 "nullポインタは複製できません (内部エラー)\n" +msgstr "nullポインタを複製できません(内部エラー)。\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" @@ -58,7 +63,7 @@ msgstr "ユーザーが存在しません" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "ユーザー名の参照に失敗: エラーコード %lu" +msgstr "ユーザー名の検索に失敗: エラーコード%lu" #: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 msgid "Cancel request sent\n" @@ -68,20 +73,30 @@ msgstr "キャンセル要求を送信しました\n" msgid "Could not send cancel request: " msgstr "キャンセル要求を送信できませんでした: " -#: ../../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 "パスワード: " -#: ../../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 "データベース%sに接続できませんでした: メモリ不足" +msgstr "データベース%sに接続できませんでした: メモリ不足です" -#: ../../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/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:319 #, c-format msgid "too many jobs for this platform: %d" @@ -92,37 +107,41 @@ msgstr "このプラットフォームに対してジョブ数が多すぎます msgid "socket file descriptor out of range for select(): %d" msgstr "socket() のソケットファイル記述子が範囲外です: %d" -#: ../../fe_utils/parallel_slot.c:551 +#: ../../fe_utils/parallel_slot.c:330 +#, c-format +msgid "Try fewer jobs." +msgstr "ジョブ数を減らしてみてください。" + +#: ../../fe_utils/parallel_slot.c:552 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "データベース\"%s\"の処理に失敗しました: %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%lu 行)" -msgstr[1] "(%lu 行)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "中断されました\n" -#: ../../fe_utils/print.c:3104 +#: ../../fe_utils/print.c:3173 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "テーブルの内容に見出しを追加できませんでした: 列数%dが制限を超えています。\n" +msgstr "テーブルの内容に見出しを追加できませんでした:列数%dが制限を越えています。\n" -#: ../../fe_utils/print.c:3144 +#: ../../fe_utils/print.c:3213 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "テーブルの内容にセルを追加できませんでした: 全セル数%dが制限を超えています。\n" +msgstr "テーブルの内容にセルを追加できませんでした:全セル数%dが制限を越えています。\n" -#: ../../fe_utils/print.c:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" -msgstr "出力フォーマットが無効(内部エラー): %d" +msgstr "出力フォーマットが無効(内部エラー):%d" #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 #, c-format @@ -131,68 +150,68 @@ msgstr "問い合わせが失敗しました: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" +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 +#: 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: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 "コマンドライン引数が多すぎます (先頭は\"%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 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "すべてのデータベースの特定のテーブル(群)はクラスタ化できません" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"のテーブル\"%1$s\"のクラスタ化に失敗しました: %3$s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "データベース\"%s\"のクラスタ化に失敗しました: %s" -#: clusterdb.c:253 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: データベース\"%s\"をクラスタ化しています\n" -#: clusterdb.c:269 +#: clusterdb.c:264 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" "\n" -msgstr "%sはデータベース内で事前にクラスタ化されているすべてのテーブルをクラスタ化します\n" +msgstr "%sはデータベース内で事前にクラスタ化されているすべてのテーブルをクラスタ化します。\n" -#: clusterdb.c:270 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:794 vacuumdb.c:1025 +#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: clusterdb.c:271 reindexdb.c:795 vacuumdb.c:1026 +#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [オプション]... [データベース名]\n" -#: clusterdb.c:272 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:796 vacuumdb.c:1027 +#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -201,48 +220,48 @@ msgstr "" "\n" "オプション:\n" -#: clusterdb.c:273 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all すべてのデータベースをクラスタ化\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME クラスタ化するデータベース\n" -#: clusterdb.c:275 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:270 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" -#: clusterdb.c:276 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを何も出力しない\n" -#: clusterdb.c:277 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" -msgstr " -t, --table=テーブル名 指定したテーブル(群)のみをクラスタ化\n" +msgstr " -t, --table=テーブル名 指定したテーブル(群)のみをクラスタ化する\n" -#: clusterdb.c:278 +#: clusterdb.c:273 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose 多くのメッセージを出力\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: clusterdb.c:279 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:274 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:280 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: clusterdb.c:281 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:811 vacuumdb.c:1052 +#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -251,39 +270,39 @@ msgstr "" "\n" "接続オプション:\n" -#: clusterdb.c:282 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: clusterdb.c:277 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" " ディレクトリ\n" -#: clusterdb.c:283 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: clusterdb.c:278 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:284 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=USERNAME このユーザー名で接続\n" +msgstr " -U, --username=USERNAME このユーザー名で接続する\n" -#: clusterdb.c:285 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: clusterdb.c:280 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:286 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: clusterdb.c:281 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" +msgstr " -W, --password パスワードプロンプトを強制表示する\n" -#: clusterdb.c:287 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定\n" +msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n" -#: clusterdb.c:288 +#: clusterdb.c:283 #, c-format msgid "" "\n" @@ -292,8 +311,8 @@ msgstr "" "\n" "詳細は SQL コマンドの CLUSTER の説明を参照してください。\n" -#: clusterdb.c:289 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:819 vacuumdb.c:1060 +#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -302,8 +321,8 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: clusterdb.c:290 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:820 vacuumdb.c:1061 +#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" @@ -313,7 +332,6 @@ msgstr "%s ホームページ: <%s>\n" 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:131 @@ -335,34 +353,24 @@ msgstr "%s (%s/%s)" #: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" -msgstr "\"%s\"または\"%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 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" -msgstr "\"%s\"は有効な符号化方式名ではありません" +msgstr "\"%s\" は有効な符号化方式名ではありません" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" -msgstr "データベースの生成に失敗しました: %s" +msgstr "データベースの生成に失敗しました:%s" -#: createdb.c:248 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "コメントの生成に失敗(データベースは生成されました): %s" -#: createdb.c:266 +#: createdb.c:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -371,94 +379,114 @@ msgstr "" "%sはPostgreSQLデータベースを生成します。\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [オプション]... [データベース名] [説明]\n" -#: createdb.c:270 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE データベースのデフォルトテーブルスペース名\n" -#: createdb.c:271 reindexdb.c:800 +#: createdb.c:285 reindexdb.c:768 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーバーに送られるコマンドを表示\n" -#: createdb.c:272 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING データベースの符号化方式\n" -#: createdb.c:273 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE データベースのロケール設定\n" -#: createdb.c:274 +#: createdb.c:288 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE データベースのLC_COLLATE設定\n" -#: createdb.c:275 +#: createdb.c:289 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE データベースのLC_CTYPE設定\n" -#: createdb.c:276 +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE データベースのICUロケール設定\n" + +#: createdb.c:291 +#, 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:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER 新しいデータベースを所有するデータベースユーザー\n" -#: createdb.c:277 +#: createdb.c:294 +#, 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:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE コピーするテンプレートデータベース\n" -#: createdb.c:278 reindexdb.c:809 +#: createdb.c:296 reindexdb.c:777 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: createdb.c:279 reindexdb.c:810 +#: createdb.c:297 reindexdb.c:778 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: createdb.c:281 reindexdb.c:812 +#: createdb.c:299 reindexdb.c:780 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーバーホストまたはソケット\n" " ディレクトリ\n" -#: createdb.c:282 reindexdb.c:813 +#: createdb.c:300 reindexdb.c:781 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバーのポート番号\n" -#: createdb.c:283 reindexdb.c:814 +#: createdb.c:301 reindexdb.c:782 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 接続する際のユーザー名\n" -#: createdb.c:284 reindexdb.c:815 +#: createdb.c:302 reindexdb.c:783 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: createdb.c:285 reindexdb.c:816 +#: createdb.c:303 reindexdb.c:784 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password パスワードプロンプトを強制\n" -#: createdb.c:286 reindexdb.c:817 +#: createdb.c:304 reindexdb.c:785 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定\n" +msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -467,85 +495,80 @@ msgstr "" "\n" "デフォルトでは、現在のユーザー名と同名のデータベースが生成されます\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "--connection-limit に対する不正な値: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "追加したいロール名を入力:" -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "新しいロールのためのパスワード: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " -msgstr "もう一度入力してください: " +msgstr "もう一度入力してください:" -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" -msgstr "パスワードが一致しませんでした。\n" +msgstr "パスワードがマッチしません。\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "新しいロールをスーパーユーザーにしますか?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "新しいロールに対してデータベースを作成する権限を与えますか?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "新しいロールに対して別のロールを作成する権限を与えますか?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "パスワードの暗号化に失敗しました: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "新しいロールの作成に失敗しました: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" "\n" msgstr "" -"%sは新しいPostgreSQLロールを作成します\n" +"%sは新しいPostgreSQLロールを作成します。\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [オプション]... [ロール名]\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 ロールのコネクション数制限(デフォルト: 制限なし)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb ロールは新しいデータベースを作成可\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb ロールは新しいデータベースを作成不可(デフォルト)\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 新しいロールはこのロールのメンバーにする\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -554,90 +577,90 @@ msgstr "" " -i, --inherit ロールがメンバーとなるロール群から権限を継承\n" " (デフォルト)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit 権限を継承しない\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login ロールはログイン可能(デフォルト)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login ロールはログイン不可\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt 新しいロールにパスワードを割り当てる\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole ロールは別のロールを作成可\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole ロールは別のロールを作成不可(デフォルト)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --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 ロールをスーパーユーザーにしない(デフォルト)\n" -#: createuser.c:370 +#: 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:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication ロールはレプリケーションを初期化可\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication ロールはレプリケーションを初期化不可\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=ユーザー名 このユーザーとして接続(作成対象ユーザーでは\n" +" -U, --username=USERNAME このユーザーとして接続(作成対象ユーザーでは\n" " ありません)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "必須の引数であるデータベース名がありません" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "データベース\"%s\"は永久に削除されます。\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "実行しますか?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "データベースの削除に失敗しました: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -646,55 +669,55 @@ msgstr "" "%sはPostgreSQLデータベースを削除します。\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [オプション]... [データベース名]\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force 削除前に他の接続の終了を試行\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" -msgstr " -i, --interactive 何かを削除する前に警告\n" +msgstr " -i, --interactive 何かを削除する前に警告する\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 データベースが存在しない場合にエラーを報告しない\n" -#: dropuser.c:117 +#: 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:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "ロール\"%s\"の削除に失敗しました: %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" "\n" msgstr "" -"%sはPostgreSQLのロールを削除します\n" +"%sはPostgreSQLのロールを削除します。\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -703,264 +726,261 @@ msgstr "" " -i, --interactive 何かを削除する前に入力を促し、またロール名が指定\n" " されていない場合はその入力を促す\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 ユーザーが存在しない場合にエラーを報告しない\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=ユーザー名 このユーザーとして接続(削除対象ユーザーでは\n" +" -U, --username=USERNAME このユーザーとして接続(削除対象ユーザーでは\n" " ありません)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "デフォルトのオプションを取り出すことができませんでした" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "接続を受け付けています\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "接続を拒絶しています\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "レスポンスがありません\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "施行がありません\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" -msgstr "不明\n" +msgstr "unknown\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はPostgreSQLデータベースに対して接続検査を発行します\n" +"%sはPostgreSQLデータベースに対して接続検査を発行します。\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" -msgstr " %s [オプション]...\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 データベース名\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" -msgstr " -q, --quiet メッセージを出力せずに実行\n" +msgstr " -q, --quiet メッセージを出力せずに実行する\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\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 データベースサーバーのホストまたはソケットディレクトリ\n" +msgstr "" +" -h, --host=HOSTNAME データベースサーバーのホストまたはソケット\n" +" ディレクトリ\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバーのポート番号\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 接続試行時の待機秒数、ゼロで無効化(デフォルト: %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=USERNAME このユーザー名で接続\n" - -#: reindexdb.c:157 vacuumdb.c:198 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "並列ジョブの数は最低でも1以上でなければなりません" +msgstr " -U, --username=USERNAME このユーザー名で接続する\n" -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "全データベースと特定のデータベースは同時に再インデックス化はできません" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "全データベースとシステムカタログの両方は同時に再インデックス化はできません" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "全データベースにおける特定のスキーマ(群)の再インデックス化はできません" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "全データベースにおける特定のテーブル(群)の再インデックス化はできません" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "全データベースにおける特定のインデックス(群)の再作成はできません" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "特定のスキーマ(群)とシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "特定のテーブル(群)とシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "特定のインデックスとシステムカタログは同時に再インデックス化はできません" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "システムカタログのインデックス再構築では複数ジョブを使用できません" -#: reindexdb.c:288 +#: reindexdb.c:260 #, 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 +#: 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:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "データベース\"%s\"のインデックス再構築に失敗しました: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるインデックス\"%1$s\"の再作成に失敗しました: %3$s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるスキーマ\"%1$s\"のインデックス再構築に失敗しました: %3$s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "データベース\"%s\"中のシステムカタログのインデックス再構築に失敗しました: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中にあるテーブル\"%1$s\"のインでックス再構築に失敗しました: %3$s" -#: reindexdb.c:776 +#: reindexdb.c:744 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: データベース\"%s\"を再インデックス化しています\n" -#: reindexdb.c:793 +#: reindexdb.c:761 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" "\n" msgstr "" -"%sはPostgreSQLデータベースのインデックス再構築を行います。\n" +"%sはPostgreSQLデータベースを再インデックス化します。\n" "\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -a, --all reindex all databases\n" -msgstr " -a, --all 全データベースのインデックス再構築を行う\n" +msgstr " -a, --all 全データベースでインデックス再構築を行う\n" -#: reindexdb.c:798 +#: reindexdb.c:766 #, c-format msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently 再構築の並行実行\n" +msgstr " --concurrently 並行インデックス再構築\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=DBNAME インデックス再構築対象のデータベース名\n" +msgstr " -d, --dbname=DBNAME インデックス再構築対象のデータベース\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX 指定したインデックス(群)のみインデックス再構築\n" +msgstr " -i, --index=INDEX 指定したインデックス(群)のみを再構築\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM インデックス再構築の並列接続数を指定\n" +msgstr " -j, --jobs=NUM インデックス再構築にこの数の並列接続を使用\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet メッセージを出力しない\n" +msgstr " -q, --quiet メッセージを一切出力しない\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system システムカタログのインデックスのみを再構築\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA 指定したスキーマ(群)のみでインデックス再構築\n" +msgstr " -S, --schema=SCHEMA 指定したスキーマ(群)のインデックスのみを再構築\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE 指定したテーブル(群)のみでインデックス再構築\n" +msgstr " -t, --table=TABLE 指定したテーブル(群)のインデックスを再構築\n" -#: reindexdb.c:807 +#: reindexdb.c:775 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" -msgstr " -D, --tablespace=TABLESPACE インデックス再構築先のテーブルスペース\n" +msgstr " -D, --tablespace=TABLESPACE インデックス再構築先のテーブル空間\n" -#: reindexdb.c:808 +#: reindexdb.c:776 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose 多くのメッセージを出力\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: reindexdb.c:818 +#: reindexdb.c:786 #, c-format msgid "" "\n" @@ -969,204 +989,189 @@ 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の並列ワーカー数は0以上でなければなりません" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "最小トランザクションID差分は1以上でなければなりません" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "最小マルチトランザクション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 +#: 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:332 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" -msgstr "完全VACUUMを実行する場合\"%s\"オプションは使えません" +msgstr "完全(full)VACUUMを実行する場合は\"%s\"オプションは使えません" -#: vacuumdb.c:341 +#: vacuumdb.c:303 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" -msgstr "\"%s\"オプションは\"%s\"オプションと同時には使用できません" +msgstr "\"%s\"オプションは\"%s\"と同時には使えません" -#: vacuumdb.c:363 +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "全データベースと特定のデータベースを同時にVACUUMすることはできません" -#: vacuumdb.c:368 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "全データベースの特定のテーブル(群)をVACUUMすることはできません" -#: vacuumdb.c:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "最適化のための情報を最小限生成します(1対象)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "最適化のための情報を複数生成します(10対象)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "最適化のための情報をデフォルト数(全て)生成します" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: データベース\"%s\"の処理中です: %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: データベース\"%s\"をVACUUMしています\n" -#: vacuumdb.c:1013 +#: 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:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "データベース\"%s\"のVACUUMに失敗しました: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" "\n" msgstr "%sはPostgreSQLデータベースのゴミ回収および分析を行います。\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 全データベースをVACUUM\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME VACUUMするデータベース名\n" -#: vacuumdb.c:1030 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping すべてのページスキップ動作を禁止\n" -#: vacuumdb.c:1031 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーバーに送られるコマンドを表示\n" -#: vacuumdb.c:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full VACUUM FULLを実行\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze 行トランザクション情報を凍結\n" -#: vacuumdb.c:1034 +#: 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" +" --force-index-cleanup デッドタプルを指すインデックスエントリを常に\n" +" 除去する\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM バキューム時に指定した同時接続数を使用\n" -#: vacuumdb.c:1036 +#: 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:1037 +#: 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:1038 +#: 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" " 削除しない\n" -#: vacuumdb.c:1039 +#: vacuumdb.c:978 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr "" -" --no-process-toast VACUUM対象テーブルに対応するTOASTテーブルを\n" +" --no-process-toast テーブルに関連づくTOASTテーブルのVACUUMを\n" " スキップ\n" -#: vacuumdb.c:1040 +#: 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:1041 +#: 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 可能であればこの数のバックグラウンドワーカーを\n" -" VACUUMで使用\n" +" -P, --parallel=PARALLEL_WORKERS 可能であればVACUUMで指定の数のバックグラウンド\n" +" ワーカーを使用\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを出力しない\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked 直ちにロックできなかったリレーションをスキップ\n" -#: vacuumdb.c:1044 +#: 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:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose 多くのメッセージを出力\n" +msgstr " -v, --verbose 多量のメッセージを出力\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" -msgstr " -z, --analyze 最適化用統計情報を更新します\n" +msgstr " -z, --analyze 最適化用統計情報を更新\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only 最適化用統計情報のみ更新; バキュームは行わない\n" -#: vacuumdb.c:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1175,12 +1180,12 @@ msgstr "" " --analyze-in-stages 高速化のため最適化用統計情報のみを複数段階で\n" " 更新; VACUUMは行わない\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/ka.po b/third_party/spanner_pg/src/bin/scripts/po/ka.po new file mode 100644 index 00000000..d5c81a13 --- /dev/null +++ b/third_party/spanner_pg/src/bin/scripts/po/ka.po @@ -0,0 +1,1299 @@ +# Georgian message translation file for pgscripts +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pgscripts (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: pgscripts (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-02 04:49+0000\n" +"PO-Revision-Date: 2022-07-04 15:48+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდომა: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "warning: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტალები: " + +#: ../../../src/common/logging.c:301 +#, 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 +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 "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მომხმარებლის ეფექტური ID-ის (%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: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: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 "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %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 "too many jobs for this platform" +msgstr "მეტისმეტად ბევრი დავალება ამ პლატფორმისთვის" + +#: ../../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:3109 +#, c-format +msgid "Interrupted\n" +msgstr "შეწყვეტილია\n" + +#: ../../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:3213 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "" +"ცხრილის შემცველობაზე უჯრედის დამატება შეუძლებელია: უჯრედების რაოდენობა %d-ზე " +"მეტია.\n" + +#: ../../fe_utils/print.c:3471 +#, 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: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 "მეტი ინფორმაციისთვის სცადეთ '%s --help'." + +#: 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:148 +#, c-format +msgid "cannot cluster all databases and a specific one at the same time" +msgstr "ყველა და მითითებული ბაზების ერთდროული დაკლასტერება შეუძლებელია" + +#: clusterdb.c:151 +#, c-format +msgid "cannot cluster specific table(s) in all databases" +msgstr "მითითებული ცხრილების ყველა ბაზაში დაკლასტერება შეუძლებელია" + +#: clusterdb.c:215 +#, c-format +msgid "clustering of table \"%s\" in database \"%s\" failed: %s" +msgstr "ცხრილის (\"%s\"), ბაზაში \"%s\" დაკლასტერების პრობლემა: %s" + +#: clusterdb.c:218 +#, c-format +msgid "clustering of database \"%s\" failed: %s" +msgstr "ბაზის (\"%s\") დაკლასტერების შეცდომა: %s" + +#: clusterdb.c:246 +#, c-format +msgid "%s: clustering database \"%s\"\n" +msgstr "%s: ბაზის დაკლასტერება: \"%s\"\n" + +#: clusterdb.c:262 +#, c-format +msgid "" +"%s clusters all previously clustered tables in a database.\n" +"\n" +msgstr "" +"%s ალაგებს ბაზაში ადრე დალაგებული ცხრილებს.\n" +"\n" + +#: 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:264 reindexdb.c:761 vacuumdb.c:965 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n" + +#: 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" +"Options:\n" +msgstr "" +"\n" +"პარამეტრები:\n" + +#: clusterdb.c:266 +#, c-format +msgid " -a, --all cluster all databases\n" +msgstr " -a, --all ყველა ბაზის დაკლასტერება\n" + +#: clusterdb.c:267 +#, c-format +msgid " -d, --dbname=DBNAME database to cluster\n" +msgstr " -d, --dbname=ბაზისსახელი დასაკლასერებელი ბაზის სახელი\n" + +#: 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-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n" + +#: clusterdb.c:269 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n" + +#: clusterdb.c:270 +#, c-format +msgid " -t, --table=TABLE cluster specific table(s) only\n" +msgstr "" +" -t, --table=ცხრილი მხოლოდ მითითებული ცხრილების დაკლასტერება\n" + +#: clusterdb.c:271 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n" + +#: 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: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: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" +"Connection options:\n" +msgstr "" +"\n" +"შეერთების პარამეტრები:\n" + +#: 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: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:277 dropdb.c:184 vacuumdb.c:994 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n" + +#: 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: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:280 dropdb.c:187 vacuumdb.c:997 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=ბაზისსახელი ალტერნატიული საავარიო ბაზა\n" + +#: clusterdb.c:281 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command CLUSTER for details.\n" +msgstr "" +"\n" +"დაკლასტერების შესახებ მეტი ინფორმაციის მიღება SQL ბრძანების, CLUSTER, " +"დეტალებში შეგიძლიათ.\n" + +#: 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" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"შეცდომების შესახებ მიწერეთ: %s\n" + +#: 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: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 "ნანო" + +#. 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:165 +#, c-format +msgid "only one of --locale and --lc-ctype can be specified" +msgstr "--locale და --lc-ctype მხოლოდ ერთ ერთი შეიძლება იყოს მითითებული" + +#: createdb.c:167 +#, c-format +msgid "only one of --locale and --lc-collate can be specified" +msgstr "--locale და --lc-collate მხოლოდ ერთ ერთი შეიძლება იყოს მითითებული" + +#: createdb.c:175 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" კოდირების სწორ სახელს არ წარმოადგენს" + +#: createdb.c:245 +#, c-format +msgid "database creation failed: %s" +msgstr "ბაზის შექმნის შეცდომა:%s" + +#: createdb.c:264 +#, c-format +msgid "comment creation failed (database was created): %s" +msgstr "კომენტარის შექმნის შეცდომა (ბაზა შეიქმნა): %s" + +#: createdb.c:282 +#, c-format +msgid "" +"%s creates a PostgreSQL database.\n" +"\n" +msgstr "" +"%s PostgreSQL-ის ბაზას ქმნის.\n" +"\n" + +#: createdb.c:284 +#, c-format +msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" +msgstr " %s [პარამეტრი]... [ბაზისსახელი] [აღწერა]\n" + +#: createdb.c:286 +#, c-format +msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" +msgstr "" +" -D, --tablespace=ცხრილებისსივრცე მონაცემთა ბაზის ცხრილების ნაგულისხმები " +"სივრცე\n" + +#: createdb.c:287 reindexdb.c:766 +#, c-format +msgid "" +" -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n" + +#: createdb.c:288 +#, c-format +msgid " -E, --encoding=ENCODING encoding for the database\n" +msgstr " \\encoding [კოდირება] კლიენტის კოდირების ჩვენება ან დაყენება\n" + +#: createdb.c:289 +#, c-format +msgid " -l, --locale=LOCALE locale settings for the database\n" +msgstr " -l, --locale=ენა ბაზის ენის პარამეტრები\n" + +#: createdb.c:290 +#, c-format +msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" +msgstr " --lc-collate=ენა ბაზის LC_COLLATE პარამეტრი\n" + +#: createdb.c:291 +#, c-format +msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" +msgstr " --lc-ctype=ენა ბაზის LC_CTYPE პარამეტრი\n" + +#: createdb.c:292 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-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" + +#: createdb.c:295 +#, c-format +msgid " -O, --owner=OWNER database user to own the new database\n" +msgstr "" +" -O, --owner=მფლობელი ახალი ბაზის მფლობელი მომხმარებლის სახელი\n" + +#: createdb.c:296 +#, c-format +msgid "" +" -S, --strategy=STRATEGY database creation strategy wal_log or " +"file_copy\n" +msgstr "" +" -S, --strategy=სტრატეგია ბაზის შექმნის სტრატეგია: wal_log ან " +"file_copy\n" + +#: createdb.c:297 +#, c-format +msgid " -T, --template=TEMPLATE template database to copy\n" +msgstr " -T, --template=შაბლონი ბაზის დასაკოპირებელი შაბლონი\n" + +#: createdb.c:298 reindexdb.c:775 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n" + +#: createdb.c:299 reindexdb.c:776 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n" + +#: createdb.c:301 reindexdb.c:778 +#, c-format +msgid "" +" -h, --host=HOSTNAME database server host or socket directory\n" +msgstr "" +" -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის " +"საქაღალდე\n" + +#: createdb.c:302 reindexdb.c:779 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n" + +#: createdb.c:303 reindexdb.c:780 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n" + +#: createdb.c:304 reindexdb.c:781 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n" + +#: createdb.c:305 reindexdb.c:782 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password პაროლის ყოველთვის კითხვა\n" + +#: createdb.c:306 reindexdb.c:783 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=ბაზისსახელი ალტერნატიული საავარიო ბაზა\n" + +#: createdb.c:307 +#, c-format +msgid "" +"\n" +"By default, a database with the same name as the current user is created.\n" +msgstr "" +"\n" +"ნაგულისხმებად შექმნილი ბაზის სახელად მიმდინარე მომხმარებლის სახელი " +"გამოიყენება.\n" + +#: createuser.c:193 +msgid "Enter name of role to add: " +msgstr "შეიყვანეთ დასამატებელი როლის სახელი: " + +#: createuser.c:208 +msgid "Enter password for new role: " +msgstr "შეყვანეთ ახალი როლის პაროლი: " + +#: createuser.c:209 +msgid "Enter it again: " +msgstr "შეიყვანეთ კდევ ერთხელ: " + +#: createuser.c:212 +#, c-format +msgid "Passwords didn't match.\n" +msgstr "პაროლები არ ემთხვევა.\n" + +#: createuser.c:220 +msgid "Shall the new role be a superuser?" +msgstr "იქნება ახალი როლი ზემომხმარებელი?" + +#: createuser.c:235 +msgid "Shall the new role be allowed to create databases?" +msgstr "ექნება ახალ როლს ბაზების შექმნის უფლება?" + +#: createuser.c:243 +msgid "Shall the new role be allowed to create more new roles?" +msgstr "ექნება ახალ როლს სხვა როლების შექმნს უფლება?" + +#: createuser.c:278 +#, c-format +msgid "password encryption failed: %s" +msgstr "პაროლის დაშიფვრის შეცდომა: %s" + +#: createuser.c:331 +#, c-format +msgid "creation of new role failed: %s" +msgstr "ახალი როლის შექმნის შეცდომა: %s" + +#: createuser.c:345 +#, c-format +msgid "" +"%s creates a new PostgreSQL role.\n" +"\n" +msgstr "" +"%s PostgreSQL-ის როლს ქმნის.\n" +"\n" + +#: createuser.c:347 dropuser.c:171 +#, c-format +msgid " %s [OPTION]... [ROLENAME]\n" +msgstr " %s [პარამეტრი]... [როლისსახელი]\n" + +#: 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:350 +#, c-format +msgid " -d, --createdb role can create new databases\n" +msgstr " -d, --createdb როლს შეუძლია ახალი ბაზების შექმნა\n" + +#: createuser.c:351 +#, c-format +msgid " -D, --no-createdb role cannot create databases (default)\n" +msgstr "" +" -D, --no-createdb როლს ბაზების შექმნა არ შეუძლია (ნაგულისხმები)\n" + +#: createuser.c:353 +#, c-format +msgid " -g, --role=ROLE new role will be a member of this role\n" +msgstr " -g, --role=როლი ახალი როლი ამ როლის წევრი იქნება\n" + +#: createuser.c:354 +#, 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:356 +#, c-format +msgid " -I, --no-inherit role does not inherit privileges\n" +msgstr "" +" -I, --no-inherit როლი პრივილეგიებს მემკვიდრეობით არ მიიღებს\n" + +#: createuser.c:357 +#, c-format +msgid " -l, --login role can login (default)\n" +msgstr " -l, --login როლით შესვლა შეიძლება (ნაგულისხმები)\n" + +#: createuser.c:358 +#, c-format +msgid " -L, --no-login role cannot login\n" +msgstr " -L, --no-login როლს შესვლა არ შეუძლია\n" + +#: createuser.c:359 +#, c-format +msgid " -P, --pwprompt assign a password to new role\n" +msgstr " -P, --pwprompt როლისთვის პაროლის მინიჭება\n" + +#: createuser.c:360 +#, c-format +msgid " -r, --createrole role can create new roles\n" +msgstr " -r, --createrole როლს ახალი როლების შექმნა შეუძლია\n" + +#: createuser.c:361 +#, c-format +msgid " -R, --no-createrole role cannot create roles (default)\n" +msgstr "" +" -R, --no-createrole როლს ახალი როლების შექმნა არ შეუძლია " +"(ნაგულისხმები)\n" + +#: createuser.c:362 +#, c-format +msgid " -s, --superuser role will be superuser\n" +msgstr " -s, --superuser როლი ახალი ზემომხმარებელი იქნება\n" + +#: createuser.c:363 +#, c-format +msgid " -S, --no-superuser role will not be superuser (default)\n" +msgstr "" +" -S, --no-superuser როლი ზემომხმარებელი არ იქნება (ნაგულისხმები)\n" + +#: createuser.c:365 +#, c-format +msgid "" +" --interactive prompt for missing role name and attributes " +"rather\n" +" than using defaults\n" +msgstr "" +" --interactive ნაგულისხმები მნიშვნელობების გამოყენების მაგიერ " +"როლის \n" +" ნაკლული სახელისა და ატრიბუტების ინტერაქტიურად " +"კითხვაs\n" + +#: createuser.c:367 +#, c-format +msgid " --replication role can initiate replication\n" +msgstr " --replication როლს შეუძლია რეპლიკაციის ინიცირება\n" + +#: createuser.c:368 +#, c-format +msgid " --no-replication role cannot initiate replication\n" +msgstr " --no-replication როლს რეპლიკაციის ინიცირება არ შეუძლია\n" + +#: 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:112 +#, c-format +msgid "missing required argument database name" +msgstr "აკლია აუცილებელი არგუმენტი: ბაზის სახელი" + +#: dropdb.c:127 +#, c-format +msgid "Database \"%s\" will be permanently removed.\n" +msgstr "მონაცემთა ბაზა \"%s\" სამუდამოდ წაიშლება.\n" + +#: dropdb.c:128 dropuser.c:131 +msgid "Are you sure?" +msgstr "დარწმუნებული ბრძანდებით?" + +#: dropdb.c:157 +#, c-format +msgid "database removal failed: %s" +msgstr "ბაზის წაშლის შეცდომა:%s" + +#: dropdb.c:171 +#, c-format +msgid "" +"%s removes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s წაშლის PostgreSQL ბაზას.\n" +"\n" + +#: dropdb.c:173 +#, c-format +msgid " %s [OPTION]... DBNAME\n" +msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n" + +#: dropdb.c:176 +#, c-format +msgid "" +" -f, --force try to terminate other connections before " +"dropping\n" +msgstr " -f, --force შეერთებების დახურვა მათ გათიშვამდე\n" + +#: dropdb.c:177 +#, c-format +msgid " -i, --interactive prompt before deleting anything\n" +msgstr " -i, --interactive გკითხავ, სანამ რამეს წავშლი\n" + +#: dropdb.c:179 +#, c-format +msgid "" +" --if-exists don't report error if database doesn't exist\n" +msgstr " --if-exists თუ ბაზა არ არსებობს, შეცდომა არ ამოაგდო\n" + +#: dropuser.c:118 +msgid "Enter name of role to drop: " +msgstr "შეიყვანეთ წასაშლელი როლის სახელი: " + +#: dropuser.c:122 +#, c-format +msgid "missing required argument role name" +msgstr "აკლია აუცილებელი არგუმენტი: როლის სახელი" + +#: dropuser.c:130 +#, c-format +msgid "Role \"%s\" will be permanently removed.\n" +msgstr "როლი \"%s\" სამუდამოდ წაიშლება.\n" + +#: dropuser.c:154 +#, c-format +msgid "removal of role \"%s\" failed: %s" +msgstr "როლის (\"%s\") წაშლის შეცდომა: %s" + +#: dropuser.c:169 +#, c-format +msgid "" +"%s removes a PostgreSQL role.\n" +"\n" +msgstr "" +"%s წაშლის PostgreSQL-ის როლს.\n" +"\n" + +#: 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 გკითხავ, სანამ რამეს წავშლი\n" +" და გკითხავ როლის სახელსაც, თუ მითითბული არაა\n" + +#: dropuser.c:177 +#, c-format +msgid " --if-exists don't report error if user doesn't exist\n" +msgstr "" +" --if-exists თუ მომხმარებელი არ არსებობს, შეცდომა არ ამოაგდო\n" + +#: 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:154 +#, c-format +msgid "could not fetch default options" +msgstr "ნაგულისხმები პარამეტრების გამოთხოვის შეცდომა" + +#: pg_isready.c:203 +#, c-format +msgid "accepting connections\n" +msgstr "მზადაა შეერთებისთვის\n" + +#: pg_isready.c:206 +#, c-format +msgid "rejecting connections\n" +msgstr "უარყოფს შეერთებას\n" + +#: pg_isready.c:209 +#, c-format +msgid "no response\n" +msgstr "პასუხის გარეშე\n" + +#: pg_isready.c:212 +#, c-format +msgid "no attempt\n" +msgstr "მცდელობის გარეშე\n" + +#: pg_isready.c:215 +#, c-format +msgid "unknown\n" +msgstr "უცნობი\n" + +#: pg_isready.c:225 +#, c-format +msgid "" +"%s issues a connection check to a PostgreSQL database.\n" +"\n" +msgstr "" +"%s PostgreSQL მონაცემთა ბაზასთან კავშირს ამოწმებს.\n" +"\n" + +#: pg_isready.c:227 +#, c-format +msgid " %s [OPTION]...\n" +msgstr " %s [პარამეტრი]...\n" + +#: pg_isready.c:230 +#, c-format +msgid " -d, --dbname=DBNAME database name\n" +msgstr " -d, --dbname=ბაზისსახელი მონაცემთა ბაზის სახელი\n" + +#: pg_isready.c:231 +#, c-format +msgid " -q, --quiet run quietly\n" +msgstr " -q, --quiet ჩუმად გაშვება\n" + +#: pg_isready.c:232 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n" + +#: pg_isready.c:233 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n" + +#: 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:237 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n" + +#: pg_isready.c:238 +#, c-format +msgid "" +" -t, --timeout=SECS seconds to wait when attempting connection, 0 " +"disables (default: %s)\n" +msgstr "" +" -t, --timeout=წამი შეერთების ლოდინის ვადა, წამებში. 0 გათიშავს " +"(ნაგულისხმები: %s)\n" + +#: pg_isready.c:239 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n" + +#: reindexdb.c:209 +#, c-format +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "ყველა და მითითებული ბაზების ერთდროული რეინდექსი შეუძლებელია" + +#: reindexdb.c:211 +#, c-format +msgid "cannot reindex all databases and system catalogs at the same time" +msgstr "ყველა ბაზის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია" + +#: reindexdb.c:213 +#, c-format +msgid "cannot reindex specific schema(s) in all databases" +msgstr "მითითებული სქემის ყველა ბაზაში რეინდექსი შეუძლებელია" + +#: reindexdb.c:215 +#, c-format +msgid "cannot reindex specific table(s) in all databases" +msgstr "მითითებული ცხრილის ყველა ბაზაში რეინდექსი შეუძლებელია" + +#: reindexdb.c:217 +#, c-format +msgid "cannot reindex specific index(es) in all databases" +msgstr "მითითებული ინდექსის ყველა ბაზაში რეინდექსი შეუძლებელია" + +#: reindexdb.c:227 +#, c-format +msgid "cannot reindex specific schema(s) and system catalogs at the same time" +msgstr "" +"მითითებული სქემის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია" + +#: reindexdb.c:229 +#, c-format +msgid "cannot reindex specific table(s) and system catalogs at the same time" +msgstr "" +"მითითებული ცხრილის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია" + +#: reindexdb.c:231 +#, c-format +msgid "cannot reindex specific index(es) and system catalogs at the same time" +msgstr "" +"მითითებული ინდექსის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია" + +#: reindexdb.c:234 +#, c-format +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "" +"სისტემური კატალოგების რეინდექსისთვის ბევრი დავალების გამოყენება შეუძლებელია" + +#: reindexdb.c:260 +#, c-format +msgid "cannot use multiple jobs to reindex indexes" +msgstr "ინდექსების რეინდექსისთვის ბევრი დავალების გამოყენება შეუძლებელია" + +#: 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 "" +"პარამეტრი \"%s\" არ გამოიყენება PostgreSQL-ის ვერსიაში \"%s\" ან უფრო ძველში" + +#: reindexdb.c:369 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "" +"სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია. ყველას გამოტოვება" + +#: reindexdb.c:573 +#, c-format +msgid "reindexing of database \"%s\" failed: %s" +msgstr "ბაზის (\"%s\") რეინდექსის პრობლემა: %s" + +#: reindexdb.c:577 +#, c-format +msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" +msgstr "რეინდექსის შეცდომა ინდექსისთვის \"%s\" ბაზაში \"%s\": %s" + +#: reindexdb.c:581 +#, c-format +msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" +msgstr "რეინდექსის შეცდომა სქემისთვის \"%s\" ბაზაში \"%s\": %s" + +#: reindexdb.c:585 +#, c-format +msgid "reindexing of system catalogs in database \"%s\" failed: %s" +msgstr "სისტემური კატალოგების რეინდექსის შეცდომა ბაზაში \"%s\": %s" + +#: reindexdb.c:589 +#, c-format +msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" +msgstr "რეინდექსის შეცდომა ცხრილისთვის \"%s\" ბაზაში \"%s\": %s" + +#: reindexdb.c:742 +#, c-format +msgid "%s: reindexing database \"%s\"\n" +msgstr "%s: ბაზის თავიდან ინდექსირება \"%s\"\n" + +#: reindexdb.c:759 +#, c-format +msgid "" +"%s reindexes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s PostgreSQL ბაზის თავიდან ინდექსირება.\n" +"\n" + +#: reindexdb.c:763 +#, c-format +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all ყველა ბაზის თავიდან ინდექსირება\n" + +#: reindexdb.c:764 +#, c-format +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently ერთდროული ინდექსირება\n" + +#: reindexdb.c:765 +#, c-format +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=ბაზისსახელი დასაინდექსებელი ბაზის სახელი\n" + +#: reindexdb.c:767 +#, c-format +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr "" +" -i, --index=ინდექსი მითითებული ინდექს(ებ)-ი თავიდან შეიქმნება\n" + +#: reindexdb.c:768 +#, c-format +msgid "" +" -j, --jobs=NUM use this many concurrent connections to " +"reindex\n" +msgstr "" +" -j, --jobs=რიცხვი თავიდან ინდექსირებისთვის მითითებული " +"რაოდენობის შეერთებების გამოყენება\n" + +#: reindexdb.c:769 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n" + +#: reindexdb.c:770 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr "" +" -s, --system მოხდება მხოლოდ სისტემური კატალოგების თავიდან " +"ინდექსირება\n" + +#: reindexdb.c:771 +#, c-format +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr "" +" -S, --schema=სქემა მოხდება მხოლოდ მითითებული სქემების თავიდან " +"ინდექსირება\n" + +#: reindexdb.c:772 +#, c-format +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr "" +" -t, --table=ცხრილი მოხდება მხოლოდ მითითებული ცხრილების თავიდან " +"ინდექსირება\n" + +#: reindexdb.c:773 +#, c-format +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr "" +" --tablespace=ცხრილებისსივრცე ცხრილების სივრცე, სადაც რეინდექსი " +"მოხდება\n" + +#: reindexdb.c:774 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n" + +#: reindexdb.c:784 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"მეტი დეტალებისთვის იხილეთ SQL-ის ბრძანების, REINDEX-ის დეტალები.\n" + +#: 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 "მხოლოდ ანალიზის დროს პარამეტრის \"%s\" გამოყენება შეუძლებელია" + +#: vacuumdb.c:297 +#, c-format +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "სრული დამტვერსასრუტების დროს პარამეტრის \"%s\" გამოყენება შეუძლებელია" + +#: 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 "ყველა და მითითებული ბაზების ერთდროული დამტვერსასრუტება შეუძლებელია" + +#: vacuumdb.c:324 +#, c-format +msgid "cannot vacuum specific table(s) in all databases" +msgstr "მითითებული ცხრილების ყველა ბაზაში დამტვერსასრუტება შეუძლებელია" + +#: vacuumdb.c:412 +msgid "Generating minimal optimizer statistics (1 target)" +msgstr "ოპტიმიზატორის მინიმალური სტატისტიკის გენერაცია (1 სამიზნე)" + +#: vacuumdb.c:413 +msgid "Generating medium optimizer statistics (10 targets)" +msgstr "ოპტიმიზატორის საშუალო სტატისტიკის გენერაცია (10 სამიზნე)" + +#: vacuumdb.c:414 +msgid "Generating default (full) optimizer statistics" +msgstr "ოპტიმიზატორის ნაგულისხმები (სრული) სტატისტიკის გენერაცია" + +#: vacuumdb.c:479 +#, c-format +msgid "%s: processing database \"%s\": %s\n" +msgstr "%s: ბაზის დამუშავება \"%s\": %s\n" + +#: vacuumdb.c:482 +#, c-format +msgid "%s: vacuuming database \"%s\"\n" +msgstr "%s: ბაზის \"%s\" დამტვერასრუტება\n" + +#: vacuumdb.c:952 +#, c-format +msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" +msgstr "ცხრილის (\"%s\") (ბაზაში \"%s\") დამტვერსასრუტების პრობლემა: %s" + +#: vacuumdb.c:955 +#, c-format +msgid "vacuuming of database \"%s\" failed: %s" +msgstr "ბაზის (\"%s\") დამტვერსასრუტების პრობლემა: %s" + +#: vacuumdb.c:963 +#, c-format +msgid "" +"%s cleans and analyzes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s PostgreSQL ბაზის გასუფთავება და ოპტიმიზაცია.\n" +"\n" + +#: vacuumdb.c:967 +#, c-format +msgid " -a, --all vacuum all databases\n" +msgstr " -a, --all ყველა ბაზის დამტვერსასრუტება\n" + +#: vacuumdb.c:968 +#, c-format +msgid " -d, --dbname=DBNAME database to vacuum\n" +msgstr " -d, --dbname=ბაზისსახელი დასამტვერსასრუტებელი ბაზები\n" + +#: vacuumdb.c:969 +#, c-format +msgid " --disable-page-skipping disable all page-skipping behavior\n" +msgstr "" +" --disable-page-skipping გვერდის გამოტოვების ყველა ვარიანტის " +"გამორთვა\n" + +#: vacuumdb.c:970 +#, c-format +msgid "" +" -e, --echo show the commands being sent to the " +"server\n" +msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n" + +#: vacuumdb.c:971 +#, c-format +msgid " -f, --full do full vacuuming\n" +msgstr " -f, --full სრული დამტვერსასრუტება\n" + +#: vacuumdb.c:972 +#, c-format +msgid " -F, --freeze freeze row transaction information\n" +msgstr "" +" -F, --freeze მწკრივის ტრანზაქციის ინფორმაციის გაყინვა\n" + +#: vacuumdb.c:973 +#, c-format +msgid "" +" --force-index-cleanup always remove index entries that point to " +"dead tuples\n" +msgstr "" +" --force-index-cleanup ინდექსის ჩანაწერები, რომლებიც მკვდარ " +"მონაცემებზე მიუთითებენ, ყოველთვის წაიშლება\n" + +#: vacuumdb.c:974 +#, c-format +msgid "" +" -j, --jobs=NUM use this many concurrent connections to " +"vacuum\n" +msgstr "" +" -j, --jobs=რიცხვი დამტვერსასრუტებისას მითითებული რაოდენობის " +"შეერთებების გამოყენება\n" + +#: 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 დასამტვერსასრუტებელი ცხრილების " +"მულტიტრანზაქციის ID-ის მინიმალური ასაკი\n" + +#: 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 დასამტვერსასრუტებელი ცხრილების " +"ტრანზაქციების ID-ის მინიმალური ასაკი\n" + +#: 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" + +#: 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 cxrilis gamotoveba\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:980 +#, c-format +msgid "" +" -P, --parallel=PARALLEL_WORKERS use this many background workers for " +"vacuum, if available\n" +msgstr "" +" -P, --parallel=პარალელური_დამხმარე_პროცესი დასამტვერსასრუტებლად მითითებული " +"რაოდენობის დამხმარე პროცესის გამოყენება, თუ ეს შესაძლებელია\n" + +#: vacuumdb.c:981 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n" + +#: vacuumdb.c:982 +#, c-format +msgid "" +" --skip-locked skip relations that cannot be immediately " +"locked\n" +msgstr "" +" --skip-locked გამოტოვებული იქნება ურთიერთობები, რომლის " +"მაშინვე ჩაკეტვაც შეუძლებელია\n" + +#: vacuumdb.c:983 +#, c-format +msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" +msgstr "" +" -t, --table='ცხრილი[(სვეტები)]' მხოლოდ მითითებული ცხრილების " +"დამტვერსასრუტება\n" + +#: vacuumdb.c:984 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n" + +#: vacuumdb.c:985 +#, c-format +msgid "" +" -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n" + +#: vacuumdb.c:986 +#, c-format +msgid " -z, --analyze update optimizer statistics\n" +msgstr "" +" -z, --analyze ოპტიმიზატორის სტატისტიკის განახლება\n" + +#: vacuumdb.c:987 +#, c-format +msgid "" +" -Z, --analyze-only only update optimizer statistics; no " +"vacuum\n" +msgstr "" +" -Z, --analyze-only მხოლოდ ოპტიმიზატორის სტატისტიკის " +"განახლება; დამტვერსასრუტების გარეშე\n" + +#: 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 უკეთესი შედეგებისთვის ოპტიმიზატორის " +"სტატისტიკის\n" +" მრავალსაფეხურიანი რეჟიმი; " +"დამტვერსასრუტების გარეშე\n" + +#: vacuumdb.c:990 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n" + +#: vacuumdb.c:998 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command VACUUM for details.\n" +msgstr "" +"\n" +"მეტი ინფორმაციისთვის იხილეთ SQL ბრძანების, VACUUM -ის დეტალები.\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/ko.po b/third_party/spanner_pg/src/bin/scripts/po/ko.po index 7593dcfa..3a399a44 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/ko.po +++ b/third_party/spanner_pg/src/bin/scripts/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 13\n" +"Project-Id-Version: pgscripts (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:45+0000\n" -"PO-Revision-Date: 2020-10-13 15:50+0900\n" +"POT-Creation-Date: 2023-04-12 00:49+0000\n" +"PO-Revision-Date: 2023-04-05 13:02+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,21 +15,26 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심각: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "상세정보: " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -55,85 +60,124 @@ 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 "Could not send cancel request: %s" -msgstr "취소 요청을 전송할 수 없음: %s" +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" 값은 \"%s\" 옵션 값으로 유효하지 않음" -#: ../../fe_utils/print.c:350 +#: ../../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 "too many jobs for this platform" +msgstr "이 운영체제에서는 너무 많은 동시 작업임" + +#: ../../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개 행)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "인트럽트발생\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 "테이블 내용에 헤더를 추가할 수 없음: 열 수가 %d개를 초과했습니다.\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 "테이블 내용에 셀을 추가할 수 없음: 총 셀 수가 %d개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3414 +#: ../../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: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 "보다 자세한 사용법은 \"%s --help\"\n" +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: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: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 "자세한 사항은 \"%s --help\" 명령으로 살펴보세요." + +#: 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 "모든 DB 작업과 특정 DB 작업은 동시에 할 수 없습니다." -#: clusterdb.c:149 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "모든 DB를 대상으로 특정 테이블들을 클러스터할 수 없음" -#: clusterdb.c:217 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" 테이블(해당DB: \"%s\") 클러스터 작업 실패: %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" @@ -143,19 +187,19 @@ msgstr "" "다시 클러스터 작업을 합니다.\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:281 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:922 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [옵션]... [DB이름]\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:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -164,49 +208,49 @@ 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 클러스터 작업할 DB\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" -#: 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=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" -#: 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:944 +#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -215,42 +259,38 @@ msgstr "" "\n" "연결 옵션들:\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=HOSTNAME 데이터베이스 서버 호스트 또는 소켓 디렉터리\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 데이터베이스 서버 포트\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=USERNAME 접속할 사용자이름\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 암호 프롬프트 표시 안 함\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 암호 프롬프트 표시함\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=DBNAME 대체용 관리 대상 데이터베이스\n" -#: clusterdb.c:293 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -259,8 +299,8 @@ msgstr "" "\n" "보다 자세한 내용은 CLUSTER SQL 명령어 설명서를 참조하십시오.\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:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -269,95 +309,56 @@ 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:283 createdb.c:307 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] "쿼리에서 한 개가 아닌 %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 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "--locale 및 --lc-ctype 중 하나만 지정할 수 있음" - -#: createdb.c:153 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "--locale 및 --lc-collate 중 하나만 지정할 수 있음" - -#: createdb.c:164 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" 이름은 잘못된 인코딩 이름임" -#: createdb.c:221 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "데이터베이스 만들기 실패: %s" -#: createdb.c:240 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "코멘트 추가하기 실패 (데이터베이스는 만들어졌음): %s" -#: createdb.c:258 +#: createdb.c:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -366,96 +367,121 @@ msgstr "" "%s 프로그램은 PostgreSQL 데이터베이스를 만듭니다.\n" "\n" -#: createdb.c:260 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [옵션]... [DB이름] [설명]\n" -#: createdb.c:262 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=TABLESPACE 데이터베이스를 위한 기본 테이블스페이스\n" -#: createdb.c:263 +#: createdb.c:285 reindexdb.c:766 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 서버로 보내는 작업 명령들을 보여줌\n" -#: createdb.c:264 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING 데이터베이스 인코딩\n" -#: createdb.c:265 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE 데이터베이스의 로캘 설정\n" -#: createdb.c:266 +#: createdb.c:288 #, 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:289 #, 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:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE 데이터베이스 ICU 로캘 설정\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default " +"collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" 데이터베이스 기본 문자 정렬을 위한 로케일 제공" +"자\n" + +#: createdb.c:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER 데이터베이스 소유주\n" -#: createdb.c:269 +#: createdb.c:294 +#, 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:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE 복사할 템플릿 데이터베이스\n" -#: createdb.c:270 +#: createdb.c:296 reindexdb.c:775 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: createdb.c:271 +#: createdb.c:297 reindexdb.c:776 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 이 도움말을 보여주고 마침\n" -#: createdb.c:273 +#: createdb.c:299 reindexdb.c:778 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME 데이터베이스 서버 호스트나 소켓 디렉터리\n" -#: createdb.c:274 +#: createdb.c:300 reindexdb.c:779 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT 데이터베이스 서버 포트\n" -#: createdb.c:275 +#: createdb.c:301 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:302 reindexdb.c:781 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: createdb.c:277 +#: createdb.c:303 reindexdb.c:782 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 암호 프롬프트 표시함\n" -#: createdb.c:278 +#: createdb.c:304 reindexdb.c:783 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 대체용 관리 대상 데이터베이스\n" -#: createdb.c:279 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -465,51 +491,46 @@ msgstr "" "초기값으로, DB이름을 지정하지 않으면, 현재 사용자의 이름과 같은 데이터베이스" "가 만들어집니다.\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 "추가할 새 롤(role)이름: " -#: 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 "새 롤을 superuser 권한으로 지정할까요?" -#: 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" @@ -518,34 +539,34 @@ msgstr "" "%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" @@ -554,47 +575,47 @@ 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 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 " @@ -604,17 +625,17 @@ msgstr "" " --interactive 롤 이름과 속성을 초기값을 쓰지 않고\n" " 각각 직접 입력 선택 함\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" @@ -622,26 +643,26 @@ msgstr "" " -U, --username=USERNAME 서버에 접속할 사용자\n" " (사용자만들기 작업을 할 사용자)\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 "정말 계속 할까요? (y/n) " -#: 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" @@ -650,51 +671,50 @@ msgstr "" "%s 프로그램은 PostgreSQL 데이터베이스를 삭제합니다.\n" "\n" -#: dropdb.c:165 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [옵션]... DB이름\n" -#: dropdb.c:168 +#: dropdb.c:176 #, c-format msgid "" " -f, --force try to terminate other connections before " "dropping\n" -msgstr "" -" -f, --force 삭제 전에 접속한 다른 세션들 강제로 끊음\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" @@ -703,7 +723,7 @@ msgstr "" "%s 프로그램은 PostgreSQL 롤을 삭제합니다.\n" "\n" -#: dropuser.c:167 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -712,53 +732,48 @@ 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=USERNAME 이 작업을 진행할 DB에 접속할 사용자\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 "알수없음\n" -#: pg_isready.c:223 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -767,81 +782,76 @@ msgstr "" "%s 프로그램은 PostgreSQL 데이터베이스 접속을 검사합니다.\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [옵션]...\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=초 연결 제한 시간, 0 무제한 (초기값: %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:186 -#, 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 "" @@ -855,75 +865,75 @@ 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: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 "" -"\"%s\" 옵션은 PostgreSQL %s 버전보다 오래된 서버에서는 사용할 수 없음" +msgstr "\"%s\" 옵션은 PostgreSQL %s 버전보다 오래된 서버에서는 사용할 수 없음" -#: reindexdb.c:377 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "시스템 카탈로그 인덱스는 CONCURRENTLY 다시 만들기 못함, 모두 건너 뜀" -#: 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 "\"%s\" 인덱스(해당DB: \"%s\") 재색인 작업 실패: %s" -#: reindexdb.c:566 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" 스키마(해당DB: \"%s\") 재색인 작업 실패: %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 "\"%s\" 테이블(해당DB: \"%s\") 재색인 작업 실패: %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" @@ -932,131 +942,134 @@ msgstr "" "%s 프로그램은 PostgreSQL 데이터베이스 재색인 작업을 합니다.\n" "\n" -#: reindexdb.c:756 +#: reindexdb.c:763 #, 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:757 +#: reindexdb.c:764 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently 테이블 잠그지 않는 재색인\n" +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently 테이블 잠그지 않는 재색인\n" -#: reindexdb.c:758 +#: reindexdb.c:765 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=DBNAME 지정한 데이터베이스의 재색인 작업\n" +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME 지정한 데이터베이스의 재색인 작업\n" -#: reindexdb.c:760 +#: reindexdb.c:767 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX 지정한 인덱스들만 다시 만듬\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX 지정한 인덱스들만 다시 만듬\n" -#: reindexdb.c:761 +#: reindexdb.c:768 #, 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=NUM 재색인 작업을 여러개의 연결로 동시에 작업함\n" +" -j, --jobs=NUM 재색인 작업을 여러개의 연결로 동시에 작업함\n" -#: reindexdb.c:763 +#: reindexdb.c:769 #, 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:764 +#: reindexdb.c:770 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA 지정한 스키마들 자료만 덤프\n" +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system 시스템 카탈로그 재색인\n" -#: reindexdb.c:765 +#: reindexdb.c:771 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE 지정한 테이블들만 재색인 작업\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA 지정한 스키마들 자료만 덤프\n" -#: reindexdb.c:776 +#: reindexdb.c:772 #, c-format -msgid "" -"\n" -"Read the description of the SQL command REINDEX for details.\n" -msgstr "" -"\n" -"보다 자세한 내용은 REINDEX SQL 명령어 설명서를 참조하십시오.\n" - -#: scripts_parallel.c:234 -#, 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:194 +#: reindexdb.c:773 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "병렬 vacuum 값은 0 이상 정수형이어야 함" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr "" +" --tablespace=TABLESPACE 데이터베이스를 위한 기본 테이블스페이스\n" -#: vacuumdb.c:214 +#: 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:222 +#: reindexdb.c:784 #, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "multixact ID 나이는 최소 1이어야 함" +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"보다 자세한 내용은 REINDEX SQL 명령어 설명서를 참조하십시오.\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 "통계 수집 전용 작업에서는 \"%s\" 옵션을 사용할 수 없음" -#: vacuumdb.c:284 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "full vacuum 작업에서는 \"%s\" 옵션을 사용할 수 없음" -#: vacuumdb.c:300 +#: 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 "" "-a 옵션이 있을 경우는 한 데이터베이스를 대상으로 작업을 진행할 수 없습니다." -#: vacuumdb.c:305 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "모든 데이터베이스를 대상으로 특정 테이블들을 청소할 수는 없음" -#: vacuumdb.c:396 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "최소 최적화 통계 수집 수행 중 (1% 대상)" -#: vacuumdb.c:397 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "일반 최적화 통계 수집 수행 중 (10% 대상)" -#: vacuumdb.c:398 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "최대 최적화 통계 수집 수행중 (모든 자료 대상)" -#: vacuumdb.c:447 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: \"%s\" 데이터베이스 작업 중: %s\n" -#: vacuumdb.c:450 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: \"%s\" 데이터베이스를 청소 중\n" -#: vacuumdb.c:909 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" 테이블 (해당 DB: \"%s\") 청소하기 실패: %s" -#: vacuumdb.c:912 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "\"%s\" 데이터베이스 청소하기 실패: %s" -#: vacuumdb.c:920 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1066,39 +1079,47 @@ msgstr "" "퀴리 최적화기의 참고 자료를 갱신합니다.\n" "\n" -#: vacuumdb.c:924 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 모든 데이터베이스 청소\n" -#: vacuumdb.c:925 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME DBNAME 데이터베이스 청소\n" -#: vacuumdb.c:926 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping 모든 page-skipping 기능 비활성화\n" -#: vacuumdb.c:927 +#: vacuumdb.c:970 #, c-format msgid "" " -e, --echo show the commands being sent to the " "server\n" msgstr " -e, --echo 서버로 보내는 명령들을 보여줌\n" -#: vacuumdb.c:928 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full 대청소\n" -#: vacuumdb.c:929 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze 행 트랜잭션 정보 동결\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 삭제된 튜플 대상 인덱스 항목 항상 삭제\n" + +#: vacuumdb.c:974 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1106,7 +1127,7 @@ msgid "" msgstr "" " -j, --jobs=NUM 청소 작업을 여러개의 연결로 동시에 작업함\n" -#: vacuumdb.c:931 +#: vacuumdb.c:975 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1114,7 +1135,7 @@ msgid "" msgstr "" " --min-mxid-age=MXID_AGE 청소할 테이블의 최소 multixact ID 나이\n" -#: vacuumdb.c:932 +#: vacuumdb.c:976 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1122,21 +1143,46 @@ msgid "" msgstr "" " --min-xid-age=XID_AGE 청소할 테이블의 최소 트랜잭션 ID 나이\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 삭제된 튜플 대상 인덱스 항목 지우지 않음\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 vacuum 대상 테이블과 관련된 TOAST 테이블 건" +"너뜀\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:980 #, c-format msgid "" -" -P, --parallel=PARALLEL_DEGREE use this many background workers for " +" -P, --parallel=PARALLEL_WORKERS use this many background workers for " "vacuum, if available\n" msgstr "" " -P, --parallel=병렬작업수 vacuum 작업을 병렬로 처리 할 수 있는 경우\n" " 백그라운드 작업 프로세스 수\n" -#: vacuumdb.c:934 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 어떠한 메시지도 보여주지 않음\n" -#: vacuumdb.c:935 +#: vacuumdb.c:982 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1144,28 +1190,28 @@ msgid "" msgstr "" " --skip-locked 즉시 잠글 수 없는 릴레이션은 건너 뜀\n" -#: vacuumdb.c:936 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABLE[(COLUMNS)]' 지정한 특정 테이블들만 청소\n" -#: vacuumdb.c:937 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 작업내역의 자세한 출력\n" -#: vacuumdb.c:938 +#: vacuumdb.c:985 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: vacuumdb.c:939 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze 쿼리최적화 통계 정보를 갱신함\n" -#: vacuumdb.c:940 +#: vacuumdb.c:987 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1174,7 +1220,7 @@ msgstr "" " -Z, --analyze-only 청소 작업 없이 쿼리최적화 통계 정보만 갱신" "함\n" -#: vacuumdb.c:941 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1184,12 +1230,12 @@ msgstr "" " --analyze-in-stages 보다 빠른 결과를 위해 다중 스테이지에서\n" " 최적화 통계치만 갱신함;청소 안함\n" -#: vacuumdb.c:943 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 이 도움말을 표시하고 종료\n" -#: vacuumdb.c:951 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/pt_BR.po b/third_party/spanner_pg/src/bin/scripts/po/pt_BR.po new file mode 100644 index 00000000..e6abb54d --- /dev/null +++ b/third_party/spanner_pg/src/bin/scripts/po/pt_BR.po @@ -0,0 +1,1169 @@ +# Brazilian Portuguese message translation file for pgscripts +# +# Copyright (C) 2003-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the PostgreSQL package. +# +# Euler Taveira , 2003-2022. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-27 13:15-0300\n" +"PO-Revision-Date: 2016-06-07 06:54-0400\n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\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" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "erro: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "aviso: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalhe: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "dica: " + +#: ../../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 "sem memória\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "não pode duplicar ponteiro nulo (erro interno)\n" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "não pôde encontrar ID de usuário efetivo %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "usuário não existe" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "falhou ao pesquisar nome de usuário: código de erro %lu" + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Requisição de cancelamento enviada\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Não pôde enviar requisição de cancelamento: " + +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +msgid "Password: " +msgstr "Senha: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "não pôde conectar ao banco de dados %s: sem memória" + +#: ../../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 "valor \"%s\" é inválido para opção %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s deve estar no intervalo de %d..%d" + +#: ../../fe_utils/parallel_slot.c:301 +#, c-format +msgid "too many jobs for this platform" +msgstr "muitas tarefas para esta plataforma" + +#: ../../fe_utils/parallel_slot.c:519 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "processamento do banco de dados \"%s\" falhou: %s" + +#: ../../fe_utils/print.c:406 +#, c-format +msgid "(%lu row)" +msgid_plural "(%lu rows)" +msgstr[0] "(%lu registro)" +msgstr[1] "(%lu registros)" + +#: ../../fe_utils/print.c:3109 +#, c-format +msgid "Interrupted\n" +msgstr "Interrompido\n" + +#: ../../fe_utils/print.c:3173 +#, c-format +msgid "Cannot add header to table content: column count of %d exceeded.\n" +msgstr "Não pode adicionar cabeçalho a conteúdo de tabela: quantidade de colunas %d foi excedida.\n" + +#: ../../fe_utils/print.c:3213 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "Não pode adicionar célula a conteúdo de tabela: quantidade total de células %d foi excedida.\n" + +#: ../../fe_utils/print.c:3471 +#, c-format +msgid "invalid output format (internal error): %d" +msgstr "formato de saída inválido (erro interno): %d" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "consulta falhou: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "Query was: %s" +msgstr "Consulta foi: %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 "Tente \"%s --help\" para obter informações adicionais." + +#: 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 "muitos argumentos de linha de comando (primeiro é \"%s\")" + +#: clusterdb.c:148 +#, c-format +msgid "cannot cluster all databases and a specific one at the same time" +msgstr "não pode agrupar todos os bancos de dados e um específico ao mesmo tempo" + +#: clusterdb.c:151 +#, c-format +msgid "cannot cluster specific table(s) in all databases" +msgstr "não pode agrupar tabela(s) específica(s) em todos os bancos de dados" + +#: clusterdb.c:215 +#, c-format +msgid "clustering of table \"%s\" in database \"%s\" failed: %s" +msgstr "agrupamento da tabela \"%s\" no banco de dados \"%s\" falhou: %s" + +#: clusterdb.c:218 +#, c-format +msgid "clustering of database \"%s\" failed: %s" +msgstr "agrupamento do banco de dados \"%s\" falhou: %s" + +#: clusterdb.c:246 +#, c-format +msgid "%s: clustering database \"%s\"\n" +msgstr "%s: agrupando banco de dados \"%s\"\n" + +#: clusterdb.c:262 +#, c-format +msgid "" +"%s clusters all previously clustered tables in a database.\n" +"\n" +msgstr "" +"%s agrupa todas as tabelas agrupadas anteriormente no banco de dados.\n" +"\n" + +#: clusterdb.c:263 createdb.c:281 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 "Uso:\n" + +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [OPÇÃO]... [NOMEBD]\n" + +#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opções:\n" + +#: clusterdb.c:266 +#, c-format +msgid " -a, --all cluster all databases\n" +msgstr " -a, --all agrupa todos os bancos de dados\n" + +#: clusterdb.c:267 +#, c-format +msgid " -d, --dbname=DBNAME database to cluster\n" +msgstr " -d, --dbname=NOMEBD banco de dados a ser agrupado\n" + +#: 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 mostra os comandos enviados ao servidor\n" + +#: clusterdb.c:269 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet não exibe nenhuma mensagem\n" + +#: clusterdb.c:270 +#, c-format +msgid " -t, --table=TABLE cluster specific table(s) only\n" +msgstr " -t, --table=TABELA agrupa somente a(s) tabela(s) especificada(s)\n" + +#: clusterdb.c:271 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose mostra muitas mensagens\n" + +#: 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 mostra informação sobre a versão e termina\n" + +#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra essa ajuda e termina\n" + +#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"Opções de conexão:\n" + +#: 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=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n" + +#: 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=PORTA porta do servidor de banco de dados\n" + +#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n" + +#: 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 nunca pergunta senha\n" + +#: 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 pergunta senha\n" + +#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n" + +#: clusterdb.c:281 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command CLUSTER for details.\n" +msgstr "" +"\n" +"Leia a descrição do comando SQL CLUSTER para obter detalhes.\n" + +#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Relate erros a <%s>.\n" + +#: clusterdb.c:283 createdb.c:307 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 "página web do %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] "consulta retornou %d registro ao invés de um: %s" +msgstr[1] "consulta retornou %d registros ao invés de um: %s" + +#. translator: abbreviation for "yes" +#: common.c:131 +msgid "y" +msgstr "s" + +#. 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 "Por favor responda \"%s\" ou \"%s\".\n" + +#: createdb.c:173 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" não é um nome de codificação válido" + +#: createdb.c:243 +#, c-format +msgid "database creation failed: %s" +msgstr "criação do banco de dados falhou: %s" + +#: createdb.c:262 +#, c-format +msgid "comment creation failed (database was created): %s" +msgstr "criação de comentário falhou (banco de dados foi criado): %s" + +#: createdb.c:280 +#, c-format +msgid "" +"%s creates a PostgreSQL database.\n" +"\n" +msgstr "" +"%s cria um banco de dados PostgreSQL.\n" +"\n" + +#: createdb.c:282 +#, c-format +msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" +msgstr " %s [OPÇÃO]... [NOMEBD] [DESCRIÇÃO]\n" + +#: createdb.c:284 +#, c-format +msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" +msgstr " -D, --tablespace=TABLESPACE tablespace padrão para o banco de dados\n" + +#: createdb.c:285 reindexdb.c:766 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo mostra os comandos enviados ao servidor\n" + +#: createdb.c:286 +#, c-format +msgid " -E, --encoding=ENCODING encoding for the database\n" +msgstr " -E, --encoding=CODIFICAÇÃO codificação para o banco de dados\n" + +#: createdb.c:287 +#, c-format +msgid " -l, --locale=LOCALE locale settings for the database\n" +msgstr " -l, --locale=LOCALE configurações regionais para o banco de dados\n" + +#: createdb.c:288 +#, c-format +msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" +msgstr " --lc-collate=LOCALE configuração LC_COLLATE para o banco de dados\n" + +#: createdb.c:289 +#, c-format +msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" +msgstr " --lc-ctype=LOCALE configuração LC_CTYPE para o banco de dados\n" + +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE configuração regional ICU para o banco de dados\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" provedor de configuração regional para ordenação padrão de bancos de dados\n" + +#: createdb.c:293 +#, c-format +msgid " -O, --owner=OWNER database user to own the new database\n" +msgstr " -O, --owner=DONO usuário do banco que será dono do novo banco de dados\n" + +#: createdb.c:294 +#, c-format +msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" +msgstr " -S, --strategy=ESTRATÉGIA estratégia de criação do banco de dados wal_log ou file_copy\n" + +#: createdb.c:295 +#, c-format +msgid " -T, --template=TEMPLATE template database to copy\n" +msgstr " -T, --template=MODELO modelo de banco de dados para copiar\n" + +#: createdb.c:296 reindexdb.c:775 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informação sobre a versão e termina\n" + +#: createdb.c:297 reindexdb.c:776 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra essa ajuda e termina\n" + +#: createdb.c:299 reindexdb.c:778 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n" + +#: createdb.c:300 reindexdb.c:779 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORTA porta do servidor de banco de dados\n" + +#: createdb.c:301 reindexdb.c:780 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n" + +#: createdb.c:302 reindexdb.c:781 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password nunca pergunta senha\n" + +#: createdb.c:303 reindexdb.c:782 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password pergunta senha\n" + +#: createdb.c:304 reindexdb.c:783 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n" + +#: createdb.c:305 +#, c-format +msgid "" +"\n" +"By default, a database with the same name as the current user is created.\n" +msgstr "" +"\n" +"Por padrão, um banco de dados com o mesmo nome do usuário é criado.\n" + +#: createuser.c:193 +msgid "Enter name of role to add: " +msgstr "Digite o nome da role a ser adicionada: " + +#: createuser.c:208 +msgid "Enter password for new role: " +msgstr "Digite a senha para a nova role: " + +#: createuser.c:209 +msgid "Enter it again: " +msgstr "Digite-a novamente: " + +#: createuser.c:212 +#, c-format +msgid "Passwords didn't match.\n" +msgstr "Senhas não correspondem.\n" + +#: createuser.c:220 +msgid "Shall the new role be a superuser?" +msgstr "A nova role poderá criar um super-usuário?" + +#: createuser.c:235 +msgid "Shall the new role be allowed to create databases?" +msgstr "A nova role poderá criar bancos de dados?" + +#: createuser.c:243 +msgid "Shall the new role be allowed to create more new roles?" +msgstr "A nova role poderá criar novas roles?" + +#: createuser.c:278 +#, c-format +msgid "password encryption failed: %s" +msgstr "criptografia de senha falhou: %s" + +#: createuser.c:331 +#, c-format +msgid "creation of new role failed: %s" +msgstr "criação de nova role falhou: %s" + +#: createuser.c:345 +#, c-format +msgid "" +"%s creates a new PostgreSQL role.\n" +"\n" +msgstr "" +"%s cria uma nova role do PostgreSQL.\n" +"\n" + +#: createuser.c:347 dropuser.c:171 +#, c-format +msgid " %s [OPTION]... [ROLENAME]\n" +msgstr " %s [OPÇÃO]... [NOME_ROLE]\n" + +#: createuser.c:349 +#, c-format +msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" +msgstr " -c, --connection-limit=N limite de conexão por role (padrão: ilimitado)\n" + +#: createuser.c:350 +#, c-format +msgid " -d, --createdb role can create new databases\n" +msgstr " -d, --createdb role pode criar novos bancos de dados\n" + +#: createuser.c:351 +#, c-format +msgid " -D, --no-createdb role cannot create databases (default)\n" +msgstr " -D, --no-createdb role não pode criar novos bancos de dados (padrão)\n" + +#: createuser.c:353 +#, c-format +msgid " -g, --role=ROLE new role will be a member of this role\n" +msgstr " -g, --role=ROLE nova role será um membro desta role\n" + +#: createuser.c:354 +#, c-format +msgid "" +" -i, --inherit role inherits privileges of roles it is a\n" +" member of (default)\n" +msgstr "" +" -i, --inherit role herda privilégios de roles das quais ela\n" +" é um membro (padrão)\n" + +#: createuser.c:356 +#, c-format +msgid " -I, --no-inherit role does not inherit privileges\n" +msgstr " -I, --no-inherit role não herda privilégios\n" + +#: createuser.c:357 +#, c-format +msgid " -l, --login role can login (default)\n" +msgstr " -l, --login role pode efetuar login (padrão)\n" + +#: createuser.c:358 +#, c-format +msgid " -L, --no-login role cannot login\n" +msgstr " -L, --no-login role não pode efetuar login\n" + +#: createuser.c:359 +#, c-format +msgid " -P, --pwprompt assign a password to new role\n" +msgstr " -P, --pwprompt atribui uma senha a nova role\n" + +#: createuser.c:360 +#, c-format +msgid " -r, --createrole role can create new roles\n" +msgstr " -r, --createrole role pode criar novas roles\n" + +#: createuser.c:361 +#, c-format +msgid " -R, --no-createrole role cannot create roles (default)\n" +msgstr " -R, --no-createrole role não pode criar novas roles (padrão)\n" + +#: createuser.c:362 +#, c-format +msgid " -s, --superuser role will be superuser\n" +msgstr " -s, --superuser role será super-usuário\n" + +#: createuser.c:363 +#, c-format +msgid " -S, --no-superuser role will not be superuser (default)\n" +msgstr " -S, --no-superuser role não será super-usuário (padrão)\n" + +#: createuser.c:365 +#, c-format +msgid "" +" --interactive prompt for missing role name and attributes rather\n" +" than using defaults\n" +msgstr "" +" --interactive pergunta pelo nome e atributos não informados da role\n" +" ao invés de utilizar o padrão\n" + +#: createuser.c:367 +#, c-format +msgid " --replication role can initiate replication\n" +msgstr " --replication role pode iniciar replicação\n" + +#: createuser.c:368 +#, c-format +msgid " --no-replication role cannot initiate replication\n" +msgstr " --no-replication role não pode iniciar replicação\n" + +#: createuser.c:373 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" +msgstr " -U, --username=USUÁRIO nome do usuário para se conectar (não é o usuário a ser criado)\n" + +#: dropdb.c:112 +#, c-format +msgid "missing required argument database name" +msgstr "nome do banco de dados é um argumento requerido" + +#: dropdb.c:127 +#, c-format +msgid "Database \"%s\" will be permanently removed.\n" +msgstr "Banco de dados \"%s\" será permanentemente removido.\n" + +#: dropdb.c:128 dropuser.c:131 +msgid "Are you sure?" +msgstr "Você tem certeza?" + +#: dropdb.c:157 +#, c-format +msgid "database removal failed: %s" +msgstr "remoção do banco de dados falhou: %s" + +#: dropdb.c:171 +#, c-format +msgid "" +"%s removes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s remove um banco de dados PostgreSQL.\n" +"\n" + +#: dropdb.c:173 +#, c-format +msgid " %s [OPTION]... DBNAME\n" +msgstr " %s [OPÇÃO]... NOMEBD]\n" + +#: dropdb.c:176 +#, c-format +msgid " -f, --force try to terminate other connections before dropping\n" +msgstr " -f, --force tenta terminar outras conexões antes de remover\n" + +#: dropdb.c:177 +#, c-format +msgid " -i, --interactive prompt before deleting anything\n" +msgstr " -i, --interactive pergunta antes de apagar algo\n" + +#: dropdb.c:179 +#, c-format +msgid " --if-exists don't report error if database doesn't exist\n" +msgstr " --if-exists não relata erro se banco de dados não existir\n" + +#: dropuser.c:118 +msgid "Enter name of role to drop: " +msgstr "Digite o nome da role a ser removida: " + +#: dropuser.c:122 +#, c-format +msgid "missing required argument role name" +msgstr "nome da role é um argumento requerido" + +#: dropuser.c:130 +#, c-format +msgid "Role \"%s\" will be permanently removed.\n" +msgstr "Role \"%s\" será permanentemente removida.\n" + +#: dropuser.c:154 +#, c-format +msgid "removal of role \"%s\" failed: %s" +msgstr "remoção da role \"%s\" falhou: %s" + +#: dropuser.c:169 +#, c-format +msgid "" +"%s removes a PostgreSQL role.\n" +"\n" +msgstr "" +"%s remove uma role do PostgreSQL.\n" +"\n" + +#: 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 pergunta antes de apagar algo, e pergunta o nome\n" +" da role se não for especificado\n" + +#: dropuser.c:177 +#, c-format +msgid " --if-exists don't report error if user doesn't exist\n" +msgstr " --if-exists não relata erro se usuário não existir\n" + +#: dropuser.c:182 +#, c-format +msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" +msgstr " -U, --username=USUÁRIO nome do usuário para se conectar (não é o usuário a ser removido)\n" + +#: pg_isready.c:154 +#, c-format +msgid "could not fetch default options" +msgstr "não pôde obter opções padrão" + +#: pg_isready.c:203 +#, c-format +msgid "accepting connections\n" +msgstr "aceitando conexões\n" + +#: pg_isready.c:206 +#, c-format +msgid "rejecting connections\n" +msgstr "rejeitando conexões\n" + +#: pg_isready.c:209 +#, c-format +msgid "no response\n" +msgstr "nenhuma resposta\n" + +#: pg_isready.c:212 +#, c-format +msgid "no attempt\n" +msgstr "nenhuma tentativa\n" + +#: pg_isready.c:215 +#, c-format +msgid "unknown\n" +msgstr "desconhecido\n" + +#: pg_isready.c:225 +#, c-format +msgid "" +"%s issues a connection check to a PostgreSQL database.\n" +"\n" +msgstr "" +"%s envia uma verificação de conexão para um banco de dados PostgreSQL.\n" +"\n" + +#: pg_isready.c:227 +#, c-format +msgid " %s [OPTION]...\n" +msgstr " %s [OPÇÃO]...\n" + +#: pg_isready.c:230 +#, c-format +msgid " -d, --dbname=DBNAME database name\n" +msgstr " -d, --dbname=NOMEBD nome do banco de dados\n" + +#: pg_isready.c:231 +#, c-format +msgid " -q, --quiet run quietly\n" +msgstr " -q, --quiet executa silenciosamente\n" + +#: pg_isready.c:232 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informação sobre a versão e termina\n" + +#: pg_isready.c:233 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra essa ajuda e termina\n" + +#: pg_isready.c:236 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n" + +#: pg_isready.c:237 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORTA porta do servidor de banco de dados\n" + +#: pg_isready.c:238 +#, c-format +msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n" +msgstr " -t, --timeout=SEGS segundos a esperar ao tentar conexão, 0 desabilita (padrão: %s)\n" + +#: pg_isready.c:239 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n" + +#: reindexdb.c:209 +#, c-format +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "não pode reindexar todos os bancos de dados e um específico ao mesmo tempo" + +#: reindexdb.c:211 +#, c-format +msgid "cannot reindex all databases and system catalogs at the same time" +msgstr "não pode reindexar todos os bancos de dados e os catálogos do sistema ao mesmo tempo" + +#: reindexdb.c:213 +#, c-format +msgid "cannot reindex specific schema(s) in all databases" +msgstr "não pode reindexar esquema(s) específico(s) em todos os bancos de dados" + +#: reindexdb.c:215 +#, c-format +msgid "cannot reindex specific table(s) in all databases" +msgstr "não pode reindexar tabela(s) específica(s) em todos os bancos de dados" + +#: reindexdb.c:217 +#, c-format +msgid "cannot reindex specific index(es) in all databases" +msgstr "não pode reindexar índice(s) específico(s) em todos os bancos de dados" + +#: reindexdb.c:227 +#, c-format +msgid "cannot reindex specific schema(s) and system catalogs at the same time" +msgstr "não pode reindexar esquema(s) específico(s) e os catálogos do sistema ao mesmo tempo" + +#: reindexdb.c:229 +#, c-format +msgid "cannot reindex specific table(s) and system catalogs at the same time" +msgstr "não pode reindexar tabela(s) específica(s) e os catálogos do sistema ao mesmo tempo" + +#: reindexdb.c:231 +#, c-format +msgid "cannot reindex specific index(es) and system catalogs at the same time" +msgstr "não pode reindexar índice(s) específico(s) e os catálogos do sistema ao mesmo tempo" + +#: reindexdb.c:234 +#, c-format +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "não pode utilizar múltiplas tarefas ao reindexar os catálogos do sistema" + +#: reindexdb.c:260 +#, c-format +msgid "cannot use multiple jobs to reindex indexes" +msgstr "não pode utilizar múltiplas tarefas ao reindexar índices" + +#: 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 "não pode utilizar a opção \"%s\" em versões do servidor mais antigas do que PostgreSQL %s" + +#: reindexdb.c:369 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "não pode reindexar catálogos do sistemas concorrentemente, ignorando todos" + +#: reindexdb.c:573 +#, c-format +msgid "reindexing of database \"%s\" failed: %s" +msgstr "reindexação do banco de dados \"%s\" falhou: %s" + +#: reindexdb.c:577 +#, c-format +msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" +msgstr "reindexação do índice \"%s\" no banco de dados \"%s\" falhou: %s" + +#: reindexdb.c:581 +#, c-format +msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" +msgstr "reindexação do esquema \"%s\" no banco de dados \"%s\" falhou: %s" + +#: reindexdb.c:585 +#, c-format +msgid "reindexing of system catalogs in database \"%s\" failed: %s" +msgstr "reindexação de catálogos do sistema no banco de dados \"%s\" falhou: %s" + +#: reindexdb.c:589 +#, c-format +msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" +msgstr "reindexação da tabela \"%s\" no banco de dados \"%s\" falhou: %s" + +#: reindexdb.c:742 +#, c-format +msgid "%s: reindexing database \"%s\"\n" +msgstr "%s: reindexando banco de dados \"%s\"\n" + +#: reindexdb.c:759 +#, c-format +msgid "" +"%s reindexes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s reindexa um banco de dados PostgreSQL.\n" +"\n" + +#: reindexdb.c:763 +#, c-format +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all reindexa todos os bancos de dados\n" + +#: reindexdb.c:764 +#, c-format +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently reindexa concorrentemente\n" + +#: reindexdb.c:765 +#, c-format +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=NOMEBD banco de dados a ser reindexado\n" + +#: reindexdb.c:767 +#, c-format +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=ÍNDICE reindexa somente índice(s) especificado(s)\n" + +#: reindexdb.c:768 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" +msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para reindexar\n" + +#: reindexdb.c:769 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet não exibe nenhuma mensagem\n" + +#: reindexdb.c:770 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system reindexa os catálogos do sistema\n" + +#: reindexdb.c:771 +#, c-format +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=ESQUEMA reindexa somente esquema(s) especificado(s)\n" + +#: reindexdb.c:772 +#, c-format +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABELA reindexa somente tabela(s) especificada(s)\n" + +#: reindexdb.c:773 +#, c-format +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr " --tablespace=TABLESPACE tablespace onde índices serão reconstruídos\n" + +#: reindexdb.c:774 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose mostra muitas mensagens\n" + +#: reindexdb.c:784 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command REINDEX for details.\n" +msgstr "" +"\n" +"Leia a descrição do comando SQL REINDEX para obter detalhes.\n" + +#: 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 "não pode utilizar a opção \"%s\" ao executar somente analyze" + +#: vacuumdb.c:297 +#, c-format +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "não pode utilizar a opção \"%s\" ao executar vacuum full" + +#: vacuumdb.c:303 +#, c-format +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "não pode utilizar a opção \"%s\" com a opção \"%s\"" + +#: vacuumdb.c:322 +#, c-format +msgid "cannot vacuum all databases and a specific one at the same time" +msgstr "não pode limpar todos os bancos de dados e um específico ao mesmo tempo" + +#: vacuumdb.c:324 +#, c-format +msgid "cannot vacuum specific table(s) in all databases" +msgstr "não pode limpar tabela(s) específica(s) em todos os bancos de dados" + +#: vacuumdb.c:412 +msgid "Generating minimal optimizer statistics (1 target)" +msgstr "Gerando estatísticas mínimas para otimizador (1 alvo)" + +#: vacuumdb.c:413 +msgid "Generating medium optimizer statistics (10 targets)" +msgstr "Gerando estatísticas parciais para otimizador (10 alvos)" + +#: vacuumdb.c:414 +msgid "Generating default (full) optimizer statistics" +msgstr "Gerando estatísticas padrão (completa) para otimizador" + +#: vacuumdb.c:479 +#, c-format +msgid "%s: processing database \"%s\": %s\n" +msgstr "%s: processando banco de dados \"%s\": %s\n" + +#: vacuumdb.c:482 +#, c-format +msgid "%s: vacuuming database \"%s\"\n" +msgstr "%s: limpando banco de dados \"%s\"\n" + +#: vacuumdb.c:952 +#, c-format +msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" +msgstr "limpeza na tabela \"%s\" no banco de dados \"%s\" falhou: %s" + +#: vacuumdb.c:955 +#, c-format +msgid "vacuuming of database \"%s\" failed: %s" +msgstr "limpeza no banco de dados \"%s\" falhou: %s" + +#: vacuumdb.c:963 +#, c-format +msgid "" +"%s cleans and analyzes a PostgreSQL database.\n" +"\n" +msgstr "" +"%s limpa e analisa um banco de dados PostgreSQL.\n" +"\n" + +#: vacuumdb.c:967 +#, c-format +msgid " -a, --all vacuum all databases\n" +msgstr " -a, --all limpa todos bancos de dados\n" + +#: vacuumdb.c:968 +#, c-format +msgid " -d, --dbname=DBNAME database to vacuum\n" +msgstr " -d, --dbname=NOMEBD banco de dados a ser limpo\n" + +#: vacuumdb.c:969 +#, c-format +msgid " --disable-page-skipping disable all page-skipping behavior\n" +msgstr " --disable-page-skipping desabilita comportamento de ignorar páginas\n" + +#: vacuumdb.c:970 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo mostra os comandos enviados ao servidor\n" + +#: vacuumdb.c:971 +#, c-format +msgid " -f, --full do full vacuuming\n" +msgstr " -f, --full faz uma limpeza completa\n" + +#: vacuumdb.c:972 +#, c-format +msgid " -F, --freeze freeze row transaction information\n" +msgstr " -F, --freeze congela informação sobre transação de registros\n" + +#: vacuumdb.c:973 +#, c-format +msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" +msgstr " --force-index-cleanup sempre remove entradas de índice que apontam para tuplas mortas\n" + +#: vacuumdb.c:974 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" +msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para limpar\n" + +#: vacuumdb.c:975 +#, c-format +msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" +msgstr " --min-mxid-age=IDADE_MXID idade mínima do ID de multixact das tabelas para limpar\n" + +#: vacuumdb.c:976 +#, c-format +msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" +msgstr " --min-xid-age=IDADE_XID idade mínima do ID de transação das tabelas para limpar\n" + +#: 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ão remove entradas de índice que apontam para tuplas mortas\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 ignora a tabela TOAST associada a tabela para limpar\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ão truncar páginas vazias ao final da tabela\n" + +#: vacuumdb.c:980 +#, c-format +msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" +msgstr " -P, --parallel=QTDE_PROCESSOS use essa quantidade de processos filho em segundo plano para limpar, se disponível\n" + +#: vacuumdb.c:981 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet não exibe nenhuma mensagem\n" + +#: vacuumdb.c:982 +#, c-format +msgid " --skip-locked skip relations that cannot be immediately locked\n" +msgstr " --skip-locked ignora relações que não podem ser bloqueadas imediatamente\n" + +#: vacuumdb.c:983 +#, c-format +msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" +msgstr " -t, --table='TABELA[(COLUNAS)]' limpa somente tabela(s) específica(s)\n" + +#: vacuumdb.c:984 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose mostra muitas mensagens\n" + +#: vacuumdb.c:985 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informação sobre a versão e termina\n" + +#: vacuumdb.c:986 +#, c-format +msgid " -z, --analyze update optimizer statistics\n" +msgstr " -z, --analyze atualiza estatísticas do otimizador\n" + +#: vacuumdb.c:987 +#, c-format +msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" +msgstr " -Z, --analyze-only atualiza somente estatísticas do otimizador; sem limpeza\n" + +#: 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 atualiza somente estatísticas do otimizador, em\n" +" múltiplos estágios para resultados mais rápidos; sem limpeza\n" + +#: vacuumdb.c:990 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra essa ajuda e termina\n" + +#: vacuumdb.c:998 +#, c-format +msgid "" +"\n" +"Read the description of the SQL command VACUUM for details.\n" +msgstr "" +"\n" +"Leia a descrição do comando SQL VACUUM para obter detalhes.\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/ru.po b/third_party/spanner_pg/src/bin/scripts/po/ru.po index 61bba181..65a92198 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/ru.po +++ b/third_party/spanner_pg/src/bin/scripts/po/ru.po @@ -19,21 +19,26 @@ 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:259 -#, c-format -msgid "fatal: " -msgstr "важно: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "ошибка: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "предупреждение: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "подробности: " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -67,20 +72,30 @@ msgstr "Сигнал отмены отправлен\n" msgid "Could not send cancel request: " msgstr "Отправить сигнал отмены не удалось: " -#: ../../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 "Пароль: " -#: ../../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 "не удалось подключиться к базе %s (нехватка памяти)" -#: ../../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/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" + #: ../../fe_utils/parallel_slot.c:319 #, c-format msgid "too many jobs for this platform: %d" @@ -91,12 +106,17 @@ msgstr "слишком много заданий для этой платфор msgid "socket file descriptor out of range for select(): %d" msgstr "дескриптор файла сокета вне диапазона, допустимого для select(): %d" -#: ../../fe_utils/parallel_slot.c:551 +#: ../../fe_utils/parallel_slot.c:330 +#, c-format +msgid "Try fewer jobs." +msgstr "Попробуйте уменьшить количество заданий." + +#: ../../fe_utils/parallel_slot.c:552 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "ошибка при обработке базы \"%s\": %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -104,24 +124,24 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" @@ -133,19 +153,19 @@ msgstr "ошибка при выполнении запроса: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "запрос: %s" +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 +#: 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: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 "слишком много аргументов командной строки (первый: \"%s\")" @@ -155,27 +175,27 @@ msgstr "слишком много аргументов командной стр msgid "cannot cluster all databases and a specific one at the same time" msgstr "нельзя кластеризовать все базы и одну конкретную одновременно" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "нельзя кластеризовать указанную таблицу(ы) во всех базах" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "кластеризовать таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "кластеризовать базу \"%s\" не удалось: %s" -#: clusterdb.c:253 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: кластеризация базы \"%s\"\n" -#: clusterdb.c:269 +#: clusterdb.c:264 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -184,19 +204,19 @@ msgstr "" "%s упорядочивает данные всех кластеризованных таблиц в базе данных.\n" "\n" -#: clusterdb.c:270 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169 -#: pg_isready.c:225 reindexdb.c:794 vacuumdb.c:1025 +#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: clusterdb.c:271 reindexdb.c:795 vacuumdb.c:1026 +#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" -#: clusterdb.c:272 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171 -#: pg_isready.c:228 reindexdb.c:796 vacuumdb.c:1027 +#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966 #, c-format msgid "" "\n" @@ -205,50 +225,50 @@ msgstr "" "\n" "Параметры:\n" -#: clusterdb.c:273 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all кластеризовать все базы\n" -#: clusterdb.c:274 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ИМЯ_БД имя базы данных для кластеризации\n" -#: clusterdb.c:275 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:270 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" -#: clusterdb.c:276 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить никакие сообщения\n" -#: clusterdb.c:277 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr "" " -t, --table=ТАБЛИЦА кластеризовать только указанную таблицу(ы)\n" -#: clusterdb.c:278 +#: clusterdb.c:273 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: clusterdb.c:279 createuser.c:369 dropdb.c:177 dropuser.c:175 +#: clusterdb.c:274 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:280 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: clusterdb.c:281 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:234 reindexdb.c:811 vacuumdb.c:1052 +#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991 #, c-format msgid "" "\n" @@ -257,39 +277,39 @@ msgstr "" "\n" "Параметры подключения:\n" -#: clusterdb.c:282 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: clusterdb.c:277 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=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: clusterdb.c:283 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: clusterdb.c:278 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=ПОРТ порт сервера баз данных\n" -#: clusterdb.c:284 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: clusterdb.c:285 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: clusterdb.c:280 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:286 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: clusterdb.c:281 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:287 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" -#: clusterdb.c:288 +#: clusterdb.c:283 #, c-format msgid "" "\n" @@ -298,8 +318,8 @@ msgstr "" "\n" "Подробнее о кластеризации вы можете узнать в описании SQL-команды CLUSTER.\n" -#: clusterdb.c:289 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184 -#: pg_isready.c:239 reindexdb.c:819 vacuumdb.c:1060 +#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999 #, c-format msgid "" "\n" @@ -308,8 +328,8 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: clusterdb.c:290 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:820 vacuumdb.c:1061 +#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" @@ -344,32 +364,22 @@ msgstr "%s (%s - да/%s - нет) " 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 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не является верным названием кодировки" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "создать базу данных не удалось: %s" -#: createdb.c:248 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "создать комментарий не удалось (база данных была создана): %s" -#: createdb.c:266 +#: createdb.c:280 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -378,101 +388,126 @@ msgstr "" "%s создаёт базу данных PostgreSQL.\n" "\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД] [ОПИСАНИЕ]\n" # well-spelled: ПРОСТР -#: createdb.c:270 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=ТАБЛ_ПРОСТР табличное пространство по умолчанию для базы " "данных\n" -#: createdb.c:271 reindexdb.c:800 +#: createdb.c:285 reindexdb.c:768 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: createdb.c:272 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДИРОВКА кодировка базы данных\n" -#: createdb.c:273 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКАЛЬ локаль для базы данных\n" -#: createdb.c:274 +#: createdb.c:288 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для базы данных\n" -#: createdb.c:275 +#: createdb.c:289 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для базы данных\n" -#: createdb.c:276 +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=ЛОКАЛЬ локаль ICU для базы данных\n" + +#: createdb.c:291 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" locale provider for the database's default " +"collation\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" провайдер локали для основного правила " +"сортировки БД\n" + +#: createdb.c:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=ВЛАДЕЛЕЦ пользователь-владелец новой базы данных\n" -#: createdb.c:277 +#: createdb.c:294 +#, 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:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=ШАБЛОН исходная база данных для копирования\n" -#: createdb.c:278 reindexdb.c:809 +#: createdb.c:296 reindexdb.c:777 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: createdb.c:279 reindexdb.c:810 +#: createdb.c:297 reindexdb.c:778 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: createdb.c:281 reindexdb.c:812 +#: createdb.c:299 reindexdb.c:780 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: createdb.c:282 reindexdb.c:813 +#: createdb.c:300 reindexdb.c:781 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: createdb.c:283 reindexdb.c:814 +#: createdb.c:301 reindexdb.c:782 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: createdb.c:284 reindexdb.c:815 +#: createdb.c:302 reindexdb.c:783 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: createdb.c:285 reindexdb.c:816 +#: createdb.c:303 reindexdb.c:784 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросить пароль\n" -#: createdb.c:286 reindexdb.c:817 +#: createdb.c:304 reindexdb.c:785 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" -#: createdb.c:287 +#: createdb.c:305 #, c-format msgid "" "\n" @@ -481,51 +516,46 @@ msgstr "" "\n" "По умолчанию именем базы данных считается имя текущего пользователя.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "неверное значение параметра --connection-limit: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Введите имя новой роли: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Введите пароль для новой роли: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Повторите его: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Пароли не совпадают.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Должна ли новая роль иметь полномочия суперпользователя?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Новая роль должна иметь право создавать базы данных?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Новая роль должна иметь право создавать другие роли?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "ошибка при шифровании пароля: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "создать роль не удалось: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -534,12 +564,12 @@ msgstr "" "%s создаёт роль пользователя PostgreSQL.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_РОЛИ]\n" -#: createuser.c:354 +#: createuser.c:349 #, c-format msgid "" " -c, --connection-limit=N connection limit for role (default: no limit)\n" @@ -547,24 +577,24 @@ msgstr "" " -c, --connection-limit=N предел подключений для роли\n" " (по умолчанию предела нет)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль с правом создания баз данных\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb роль без права создания баз данных (по " "умолчанию)\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=РОЛЬ новая роль будет включена в эту роль\n" -#: createuser.c:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -574,52 +604,52 @@ msgstr "" "она\n" " включена (по умолчанию)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не наследует права\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr "" " -l, --login роль с правом подключения к серверу (по " "умолчанию)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль без права подключения\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt назначить пароль новой роли\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль с правом создания других ролей\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr "" " -R, --no-createrole роль без права создания ролей (по умолчанию)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --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 роль без полномочий суперпользователя (по " "умолчанию)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes " @@ -629,17 +659,17 @@ msgstr "" " --interactive запрашивать отсутствующие атрибуты и имя роли,\n" " а не использовать значения по умолчанию\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль может инициировать репликацию\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication роль не может инициировать репликацию\n" -#: createuser.c:378 +#: createuser.c:373 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to create)\n" @@ -647,26 +677,26 @@ msgstr "" " -U, --username=ИМЯ имя пользователя для выполнения операции\n" " (но не имя новой роли)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "отсутствует необходимый аргумент: имя базы данных" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "База данных \"%s\" будет удалена безвозвратно.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Вы уверены? (y/n)" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "ошибка при удалении базы данных: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -675,12 +705,12 @@ msgstr "" "%s удаляет базу данных PostgreSQL.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [ПАРАМЕТР]... БД\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid "" " -f, --force try to terminate other connections before " @@ -689,38 +719,38 @@ msgstr "" " -f, --force пытаться закрыть другие подключения перед " "удалением\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive подтвердить операцию удаления\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 не считать ошибкой отсутствие базы данных\n" -#: dropuser.c:117 +#: 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:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "ошибка при удалении роли \"%s\": %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -729,7 +759,7 @@ msgstr "" "%s удаляет роль PostgreSQL.\n" "\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -738,13 +768,13 @@ msgstr "" " -i, --interactive подтверждать операцию удаления и запрашивать\n" " имя роли, если оно не указано\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 не считать ошибкой отсутствие пользователя\n" -#: dropuser.c:181 +#: dropuser.c:182 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to drop)\n" @@ -752,37 +782,37 @@ msgstr "" " -U, --username=ИМЯ имя пользователя для выполнения операции\n" " (но не имя удаляемой роли)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "не удалось получить параметры по умолчанию" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "принимает подключения\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "отвергает подключения\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "нет ответа\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "проверка не выполнялась\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "неизвестно\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -791,43 +821,43 @@ msgstr "" "%s проверяет подключение к базе данных PostgreSQL.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПАРАМЕТР]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=БД имя базы\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet не выводить никакие сообщения\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\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=ИМЯ имя сервера баз данных или каталог сокетов\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: pg_isready.c:237 +#: pg_isready.c:238 #, c-format msgid "" " -t, --timeout=SECS seconds to wait when attempting connection, 0 " @@ -836,123 +866,118 @@ msgstr "" " -t, --timeout=СЕК время ожидания при попытке подключения;\n" " 0 - без ограничения (по умолчанию: %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=ИМЯ имя пользователя для подключения к серверу\n" -#: reindexdb.c:157 vacuumdb.c:198 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "число параллельных заданий должно быть не меньше 1" - -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "" "нельзя переиндексировать все базы данных и одну конкретную одновременно" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "" "нельзя переиндексировать все базы данных и системные каталоги одновременно" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "нельзя переиндексировать указанную схему(ы) во всех базах" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "нельзя переиндексировать указанную таблицу(ы) во всех базах" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "нельзя переиндексировать указанный индекс(ы) во всех базах" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанную схему(ы) и системные каталоги одновременно" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанную таблицу(ы) и системные каталоги " "одновременно" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "" "нельзя переиндексировать указанный индекс(ы) и системные каталоги " "одновременно" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "" "нельзя задействовать несколько заданий для переиндексирования системных " "каталогов" -#: reindexdb.c:288 +#: reindexdb.c:260 #, 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 +#: 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 "" "параметр \"%s\" нельзя использовать с серверами PostgreSQL версии старее %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переиндексировать базу данных \"%s\" не удалось: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "перестроить индекс \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать схему \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переиндексировать системные каталоги в базе \"%s\" не удалось: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:776 +#: reindexdb.c:744 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переиндексация базы данных \"%s\"\n" -#: reindexdb.c:793 +#: reindexdb.c:761 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -961,29 +986,29 @@ msgstr "" "%s переиндексирует базу данных PostgreSQL.\n" "\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all переиндексировать все базы данных\n" -#: reindexdb.c:798 +#: reindexdb.c:766 #, c-format msgid " --concurrently reindex concurrently\n" msgstr "" " --concurrently переиндексировать в неблокирующем режиме\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=БД имя базы для переиндексации\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr "" " -i, --index=ИНДЕКС пересоздать только указанный индекс(ы)\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -992,24 +1017,24 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для переиндексации заданное число\n" " заданий\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr "" " -s, --system переиндексировать только системные каталоги\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr "" " -S, --schema=СХЕМА переиндексировать только указанную схему(ы)\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr "" @@ -1017,19 +1042,19 @@ msgstr "" "таблицу(ы)\n" # well-spelled: ПРОСТР -#: reindexdb.c:807 +#: reindexdb.c:775 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" " --tablespace=ТАБЛ_ПРОСТР табличное пространство, в котором будут\n" " перестраиваться индексы\n" -#: reindexdb.c:808 +#: reindexdb.c:776 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: reindexdb.c:818 +#: reindexdb.c:786 #, c-format msgid "" "\n" @@ -1038,82 +1063,65 @@ msgstr "" "\n" "Подробнее о переиндексации вы можете узнать в описании SQL-команды REINDEX.\n" -#: vacuumdb.c:206 -#, c-format -msgid "parallel workers for vacuum must be greater than or equal to zero" -msgstr "" -"число параллельных исполнителей для выполнения очистки должно быть " -"неотрицательным" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "минимальный возраст транзакций должен быть не меньше 1" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "минимальный возраст мультитранзакций должен быть не меньше 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 "при выполнении только анализа нельзя использовать параметр \"%s\"" -#: vacuumdb.c:332 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "при выполнении полной очистки нельзя использовать параметр \"%s\"" -#: vacuumdb.c:341 +#: vacuumdb.c:303 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "параметр \"%s\" нельзя использовать совместно с \"%s\"" -#: vacuumdb.c:363 +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "нельзя очистить все базы данных и одну конкретную одновременно" -#: vacuumdb.c:368 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "нельзя очистить только указанную таблицу(ы) во всех базах" -#: vacuumdb.c:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Вычисление минимальной статистики для оптимизатора (1 запись)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Вычисление средней статистики для оптимизатора (10 записей)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Вычисление стандартной (полной) статистики для оптимизатора" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обработка базы данных \"%s\": %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очистка базы данных \"%s\"\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистить таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: vacuumdb.c:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистить базу данных \"%s\" не удалось: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1122,23 +1130,23 @@ msgstr "" "%s очищает и анализирует базу данных PostgreSQL.\n" "\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистить все базы данных\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ИМЯ_БД очистить указанную базу данных\n" -#: vacuumdb.c:1030 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr "" " --disable-page-skipping исключить все варианты пропуска страниц\n" -#: vacuumdb.c:1031 +#: vacuumdb.c:970 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -1146,19 +1154,19 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: vacuumdb.c:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full произвести полную очистку\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze заморозить информацию о транзакциях в " "строках\n" -#: vacuumdb.c:1034 +#: vacuumdb.c:973 #, c-format msgid "" " --force-index-cleanup always remove index entries that point to " @@ -1168,7 +1176,7 @@ msgstr "" "указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:974 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1177,7 +1185,7 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для очистки заданное число " "заданий\n" -#: vacuumdb.c:1036 +#: vacuumdb.c:975 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1186,7 +1194,7 @@ msgstr "" " --min-mxid-age=ВОЗРАСТ минимальный возраст мультитранзакций для\n" " таблиц, подлежащих очистке\n" -#: vacuumdb.c:1037 +#: vacuumdb.c:976 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1196,7 +1204,7 @@ msgstr "" "таблиц,\n" " подлежащих очистке\n" -#: vacuumdb.c:1038 +#: vacuumdb.c:977 #, c-format msgid "" " --no-index-cleanup don't remove index entries that point to " @@ -1205,7 +1213,7 @@ msgstr "" " --no-index-cleanup не удалять элементы индекса, указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1039 +#: vacuumdb.c:978 #, c-format msgid "" " --no-process-toast skip the TOAST table associated with the " @@ -1214,7 +1222,7 @@ msgstr "" " --no-process-toast пропускать TOAST-таблицу, связанную\n" " с очищаемой таблицей\n" -#: vacuumdb.c:1040 +#: vacuumdb.c:979 #, c-format msgid "" " --no-truncate don't truncate empty pages at the end of " @@ -1223,7 +1231,7 @@ msgstr "" " --no-truncate не отсекать пустые страницы в конце " "таблицы\n" -#: vacuumdb.c:1041 +#: vacuumdb.c:980 #, c-format msgid "" " -P, --parallel=PARALLEL_WORKERS use this many background workers for " @@ -1233,12 +1241,12 @@ msgstr "" " по возможности использовать для очистки\n" " заданное число фоновых процессов\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:982 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1247,29 +1255,29 @@ msgstr "" " --skip-locked пропускать отношения, которые не удаётся\n" " заблокировать немедленно\n" -#: vacuumdb.c:1044 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='ТАБЛ[(СТОЛБЦЫ)]' очистить только указанную таблицу(ы)\n" -#: vacuumdb.c:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze обновить статистику оптимизатора\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:987 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1278,7 +1286,7 @@ msgstr "" " -Z, --analyze-only только обновить статистику оптимизатора,\n" " не очищать БД\n" -#: vacuumdb.c:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1290,12 +1298,12 @@ msgstr "" " (в несколько проходов для большей " "скорости), без очистки\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" @@ -1304,6 +1312,29 @@ msgstr "" "\n" "Подробнее об очистке вы можете узнать в описании SQL-команды VACUUM.\n" +#~ msgid "only one of --locale and --lc-ctype can be specified" +#~ msgstr "можно указать только --locale или --lc-ctype" + +#~ msgid "only one of --locale and --lc-collate can be specified" +#~ msgstr "можно указать только --locale и --lc-collate" + +#~ msgid "fatal: " +#~ msgstr "важно: " + +#~ msgid "number of parallel jobs must be at least 1" +#~ msgstr "число параллельных заданий должно быть не меньше 1" + +#~ msgid "parallel workers for vacuum must be greater than or equal to zero" +#~ msgstr "" +#~ "число параллельных исполнителей для выполнения очистки должно быть " +#~ "неотрицательным" + +#~ msgid "minimum transaction ID age must be at least 1" +#~ msgstr "минимальный возраст транзакций должен быть не меньше 1" + +#~ msgid "minimum multixact ID age must be at least 1" +#~ msgstr "минимальный возраст мультитранзакций должен быть не меньше 1" + #~ msgid "could not connect to database %s: %s" #~ msgstr "не удалось подключиться к базе %s: %s" diff --git a/third_party/spanner_pg/src/bin/scripts/po/sv.po b/third_party/spanner_pg/src/bin/scripts/po/sv.po index aa7ba36b..c33a1394 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/sv.po +++ b/third_party/spanner_pg/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, 2021. +# 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 14\n" +"Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-11-07 06:47+0000\n" -"PO-Revision-Date: 2021-11-09 06:34+0100\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:259 -#, c-format -msgid "fatal: " -msgstr "fatalt: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:277 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:273 +#: ../../../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,61 +62,71 @@ 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:210 +#: ../../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:49 ../../fe_utils/connect_utils.c:107 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 msgid "Password: " msgstr "Lösenord: " -#: ../../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 "kunde inte ansluta till databas %s: slut på minne" -#: ../../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 "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:522 +#: ../../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:336 +#: ../../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:3039 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Avbruten\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 "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\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 "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n" -#: ../../fe_utils/print.c:3401 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" @@ -123,19 +138,19 @@ msgstr "fråga misslyckades: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "frågan var: %s" +msgid "Query was: %s" +msgstr "Frågan var: %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 "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." -#: 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 "för många kommandoradsargument (första är \"%s\")" @@ -145,27 +160,27 @@ msgstr "för många kommandoradsargument (första är \"%s\")" 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:154 +#: 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:220 +#: 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:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "klustring av databas \"%s\" misslyckades: %s" -#: clusterdb.c:251 +#: clusterdb.c:246 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: klustring av databas \"%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 klustrar alla tidigare klustrade tabeller i en databas.\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 +#: 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:269 reindexdb.c:793 vacuumdb.c:1026 +#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\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 +#: 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,48 +210,48 @@ msgstr "" "\n" "Flaggor:\n" -#: clusterdb.c:271 +#: clusterdb.c:266 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all klustra alla databaser\n" -#: clusterdb.c:272 +#: clusterdb.c:267 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME databas att klustra\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 visa kommandon som skickas till servern\n" -#: clusterdb.c:274 +#: 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:275 +#: 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:276 +#: clusterdb.c:271 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\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 visa versionsinformation, avsluta sedan\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 visa denna hjälp, avsluta sedan\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 +#: 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" @@ -245,37 +260,37 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053 +#: 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:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: 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:282 dropdb.c:183 vacuumdb.c:1055 +#: 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:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: 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:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: 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:285 dropdb.c:186 vacuumdb.c:1058 +#: 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:286 +#: clusterdb.c:281 #, c-format msgid "" "\n" @@ -284,8 +299,8 @@ msgstr "" "\n" "Läs beskrivningen av SQL-kommandot CLUSTER för detaljer.\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 +#: 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" @@ -294,8 +309,8 @@ msgstr "" "\n" "Rapportera fel till <%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 +#: 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" @@ -329,32 +344,32 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Var vänlig att svara \"%s\" eller \"%s\".\n" -#: createdb.c:150 +#: 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:155 +#: 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:166 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" är inte ett giltigt kodningsnamn" -#: createdb.c:229 +#: createdb.c:245 #, c-format msgid "database creation failed: %s" msgstr "misslyckades att skapa databas: %s" -#: createdb.c:248 +#: createdb.c:264 #, c-format msgid "comment creation failed (database was created): %s" msgstr "misslyckades att skapa kommentar (databasen skapades): %s" -#: createdb.c:266 +#: createdb.c:282 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -363,92 +378,113 @@ msgstr "" "%s skapar en PostgreSQL-databas.\n" "\n" -#: createdb.c:268 +#: createdb.c:284 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [FLAGGA]... [DBNAMN] [BESKRIVNING]\n" -#: createdb.c:270 +#: 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: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 visa kommandon som skickas till servern\n" -#: createdb.c:272 +#: 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:273 +#: 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:274 +#: 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:275 +#: 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:276 +#: 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:277 +#: 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:278 reindexdb.c:807 +#: 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:279 reindexdb.c:808 +#: 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: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=VÄRDNAMN databasens värdnamn eller socketkatalog\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 databasserverns port\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=ANVÄNDARE användarnamn att ansluta som\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 fråga ej efter lösenord\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 framtvinga fråga om lösenord\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=DBNAMN annat val av underhållsdatabas\n" -#: createdb.c:287 +#: createdb.c:307 #, c-format msgid "" "\n" @@ -457,51 +493,46 @@ msgstr "" "\n" "Som standard skapas en databas med samma namn som den nuvarande användares namn.\n" -#: createuser.c:151 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "ogiltigt värde till --connection-limit: %s" - -#: createuser.c:195 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Mata in namn på den roll som skall läggas till: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Mata in lösenord för den nya rollen: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Mata in det igen: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Lösenorden stämde inte överens.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Skall den nya rollen vara en superuser?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Skall den nya rollen tillåtas skapa databaser?" -#: createuser.c:245 +#: 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:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "misslyckades med lösenordskryptering: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "misslyckades med att skapa ny roll: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -510,32 +541,32 @@ msgstr "" "%s skapar en ny PostgreSQL-roll.\n" "\n" -#: createuser.c:352 dropuser.c:170 +#: createuser.c:347 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [FLAGGA]... [ROLLNAMN]\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 anslutningsgräns för roll (standard: ingen gräns)\n" -#: createuser.c:355 +#: 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:356 +#: 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:358 +#: 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:359 +#: createuser.c:354 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -544,47 +575,47 @@ msgstr "" " -i, --inherit rollen ärver rättigheter från roller den\n" " är medlem i (standard)\n" -#: createuser.c:361 +#: 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:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login rollen kan logga in (standard)\n" -#: createuser.c:363 +#: 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:364 +#: 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:365 +#: 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:366 +#: 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:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser rollen blir en 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 rollen blir inte superuser (standard)\n" -#: createuser.c:370 +#: createuser.c:365 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -593,41 +624,41 @@ msgstr "" " --interactive fråga efter rollnamn och egenskaper, snarare än\n" " att falla tillbaka på förval\n" -#: createuser.c:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication rollen kan starta replikering\n" -#: createuser.c:373 +#: 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:378 +#: 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:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "saknar nödvändigt databasnamn" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "Databasen \"%s\" kommer att tas bort permanent.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Är du säker?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "borttagning av databas misslyckades: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -636,53 +667,53 @@ msgstr "" "%s tar bort en PostgreSQL-databas.\n" "\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [FLAGGA]... DBNAMN\n" -#: dropdb.c:175 +#: 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:176 +#: 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:178 +#: 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:117 +#: 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:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "borttagning av rollen \"%s\" misslyckades: %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" "\n" msgstr "%s tar bort en PostgreSQL-roll.\n" -#: dropuser.c:173 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -691,47 +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:176 +#: 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:181 +#: 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:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "kunde inte hämta förvalda värde." -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "accepterar anslutningar\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "vägrar anslutningar\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "inget svar\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "inget försök\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "okänt\n" -#: pg_isready.c:224 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -740,149 +771,144 @@ msgstr "" "%s utför en anslutningskontroll mot en PostgreSQL-databas.\n" "\n" -#: pg_isready.c:226 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_isready.c:229 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAMN databasens namn\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet tyst körning\n" -#: pg_isready.c:231 +#: 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:232 +#: 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:235 +#: 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:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\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 sekunder att vänta på anslutning; 0 stänger av (förval: %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=ANVÄNDARE användarnamn att ansluta som\n" -#: reindexdb.c:157 vacuumdb.c:198 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "antalet parallella jobb måste vara minst 1" - -#: reindexdb.c:210 +#: 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:215 +#: 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:220 +#: 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:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "Kan inte indexera specifik tabell i alla databaser" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "Kan inte omindexera angivet index i alla databaser" -#: reindexdb.c:243 +#: 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:248 +#: 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:253 +#: 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:259 +#: 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:288 +#: 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: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 "flaggan \"%s\" kan inte användas på serverversioner äldre än PostgreSQL %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "omindexering av databasen \"%s\" misslyckades: %s" -#: reindexdb.c:609 +#: 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:613 +#: 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:617 +#: 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:621 +#: 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:774 +#: reindexdb.c:742 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: omindexering av databasen \"%s\"\n" -#: reindexdb.c:791 +#: reindexdb.c:759 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -891,64 +917,64 @@ msgstr "" "%s indexerar om en PostgreSQL-databas.\n" "\n" -#: reindexdb.c:795 +#: reindexdb.c:763 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all indexera om alla databaser\n" -#: reindexdb.c:796 +#: reindexdb.c:764 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently indexera om utan att låsa\n" -#: reindexdb.c:797 +#: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME databas att indexera om\n" -#: reindexdb.c:799 +#: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX återskapa enbart angivna index\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 använd så här många samtida anslutningar\n" " för omindexering\n" -#: reindexdb.c:801 +#: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut några meddelanden\n" -#: reindexdb.c:802 +#: reindexdb.c:770 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system indexera enbart om systemkataloger\n" -#: reindexdb.c:803 +#: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n" -#: reindexdb.c:804 +#: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELL indexera enbart om angivna tabeller\n" -#: reindexdb.c:805 +#: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABELLRYMD tabellutrymme där index byggs om\n" -#: reindexdb.c:806 +#: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: reindexdb.c:816 +#: reindexdb.c:784 #, c-format msgid "" "\n" @@ -957,80 +983,65 @@ msgstr "" "\n" "Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n" -#: vacuumdb.c:206 -#, c-format -msgid "parallel workers for vacuum must be greater than or equal to zero" -msgstr "parallella arbetare för städning måste vara större än eller lika med noll" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "minimal transaktions-ID-ålder måste vara minst 1" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "minimal multixact-ID-ålder måste vara minst 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 "flaggan \"%s\" kan inte användas vid enbart analys" -#: vacuumdb.c:332 +#: 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:341 +#: 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:363 +#: 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:368 +#: 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:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Skapar minimal optimeringsstatistik (1 mål)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Skapar medium optimeringsstatistik (10 mål)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Skapar förvald (full) optimeringsstatistik" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: processar databasen \"%s\": %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: städar databasen \"%s\".\n" -#: vacuumdb.c:1013 +#: 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:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "städning av databasen \"%s\" misslyckades: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1039,114 +1050,114 @@ msgstr "" "%s städar och analyserar en PostgreSQL-databas.\n" "\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all städa i alla databaser\n" -#: vacuumdb.c:1029 +#: 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:1030 +#: 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:1031 +#: 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:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full utför full städning\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze frys information om radtransaktioner\n" -#: vacuumdb.c:1034 +#: 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:1035 +#: 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:1036 +#: 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:1037 +#: 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:1038 +#: 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:1039 +#: 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:1040 +#: 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:1041 +#: vacuumdb.c:980 #, c-format 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:1042 +#: 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:1043 +#: 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:1044 +#: 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:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze uppdatera optimeringsstatistik\n" -#: vacuumdb.c:1048 +#: 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:1049 +#: vacuumdb.c:988 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1155,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:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "" "\n" diff --git a/third_party/spanner_pg/src/bin/scripts/po/uk.po b/third_party/spanner_pg/src/bin/scripts/po/uk.po index 42422e64..b8c10b95 100644 --- a/third_party/spanner_pg/src/bin/scripts/po/uk.po +++ b/third_party/spanner_pg/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: 2022-03-16 09:18+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2023-12-17 22:34+0000\n" +"PO-Revision-Date: 2023-12-18 17:41\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,24 +14,29 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/pgscripts.pot\n" -"X-Crowdin-File-ID: 784\n" +"X-Crowdin-File: /REL_15_STABLE/pgscripts.pot\n" +"X-Crowdin-File-ID: 922\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "збій: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "попередження: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../../../src/common/logging.c:301 +#, 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 @@ -65,31 +70,51 @@ msgstr "Запит на скасування відправлений\n" msgid "Could not send cancel request: " msgstr "Не вдалося надіслати запит на скасування: " -#: ../../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 "Пароль: " -#: ../../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 "не можливо під'єднатися до бази даних %s: не вистачає пам'яті" -#: ../../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 "too many jobs for this platform" -msgstr "занадто багато завдань для цієї платформи" +msgid "invalid value \"%s\" for option %s" +msgstr "неприпустиме значення \"%s\" для параметра %s" -#: ../../fe_utils/parallel_slot.c:522 +#: ../../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:319 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "занадто багато завдань для цієї платформи: %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "дескриптор файлу сокету поза діапазоном для select(): %d" + +#: ../../fe_utils/parallel_slot.c:330 +#, c-format +msgid "Try fewer jobs." +msgstr "Спробуйте менше робочих завдань." + +#: ../../fe_utils/parallel_slot.c:552 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "обробка бази даних \"%s\" не вдалась: %s" -#: ../../fe_utils/print.c:336 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" @@ -98,22 +123,22 @@ msgstr[1] "(%lu рядки)" msgstr[2] "(%lu рядків)" msgstr[3] "(%lu рядка)" -#: ../../fe_utils/print.c:3040 +#: ../../fe_utils/print.c:3109 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3104 +#: ../../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:3144 +#: ../../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:3402 +#: ../../fe_utils/print.c:3471 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (внутрішня помилка): %d" @@ -125,19 +150,19 @@ msgstr "запит не вдався: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 #, c-format -msgid "query was: %s" -msgstr "запит був: %s" +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 +#: 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: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 "забагато аргументів у командному рядку (перший \"%s\")" @@ -147,145 +172,145 @@ msgstr "забагато аргументів у командному рядку msgid "cannot cluster all databases and a specific one at the same time" msgstr "неможливо кластеризувати всі бази даних і одну вказану одночасно" -#: clusterdb.c:154 +#: clusterdb.c:151 #, c-format msgid "cannot cluster specific table(s) in all databases" msgstr "неможливо кластеризувати вказані таблиці у всіх базах даних" -#: clusterdb.c:220 +#: clusterdb.c:215 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "кластеризувати таблицю \"%s\" у базі даних \"%s\" не вдалося: %s" -#: clusterdb.c:223 +#: clusterdb.c:218 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "кластеризувати базу даних \"%s\" не вдалося: %s" -#: clusterdb.c:251 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: кластеризація бази даних \"%s\"\n" -#: clusterdb.c:267 +#: clusterdb.c:264 #, 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 +#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026 +#: clusterdb.c:266 reindexdb.c:763 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:1027 +#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: clusterdb.c:271 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all кластеризація усіх баз даних\n" -#: clusterdb.c:272 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ІМ'Я_БД база даних для кластеризації\n" -#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172 +#: clusterdb.c:270 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" -#: clusterdb.c:274 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не виводити жодних повідомлень\n" -#: clusterdb.c:275 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=ТАБЛИЦЯ кластеризувати тільки вказані таблиці\n" -#: clusterdb.c:276 +#: clusterdb.c:273 #, 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 +#: clusterdb.c:274 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:278 createuser.c:374 dropdb.c:179 dropuser.c:177 +#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178 #, 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 +#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991 #, 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 +#: clusterdb.c:277 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:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054 +#: clusterdb.c:278 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:282 dropdb.c:183 vacuumdb.c:1055 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056 +#: clusterdb.c:280 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:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057 +#: clusterdb.c:281 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:285 dropdb.c:186 vacuumdb.c:1058 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n" -#: clusterdb.c:286 +#: clusterdb.c:283 #, 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 +#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999 #, 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 +#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" @@ -321,794 +346,776 @@ msgstr "%s (%s/%s) " 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 +#: createdb.c:173 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не є невірним ім'ям кодування" -#: createdb.c:229 +#: createdb.c:243 #, c-format msgid "database creation failed: %s" msgstr "створити базу даних не вдалося: %s" -#: createdb.c:248 +#: createdb.c:262 #, c-format msgid "comment creation failed (database was created): %s" msgstr "не вдалося створити коментарі (база даних була створена): %s" -#: createdb.c:266 +#: createdb.c:280 #, c-format msgid "%s creates a PostgreSQL database.\n\n" msgstr "%s створює базу даних PostgreSQL.\n\n" -#: createdb.c:268 +#: createdb.c:282 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" -#: createdb.c:270 +#: createdb.c:284 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=ТАБЛИЧНИЙ_ПРОСТІР табличний простір для бази даних за замовчуванням\n" -#: createdb.c:271 reindexdb.c:798 +#: createdb.c:285 reindexdb.c:768 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіслані серверу\n" -#: createdb.c:272 +#: createdb.c:286 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДУВАННЯ кодування бази даних\n" -#: createdb.c:273 +#: createdb.c:287 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКАЛЬ параметри локалі бази даних\n" -#: createdb.c:274 +#: createdb.c:288 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для бази даних\n" -#: createdb.c:275 +#: createdb.c:289 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для бази даних\n" -#: createdb.c:276 +#: createdb.c:290 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE параметр локалі ICU бази даних\n" + +#: createdb.c:291 +#, c-format +msgid " --locale-provider={libc|icu}\n" +" locale provider for the database's default collation\n" +msgstr " --locale-provider={libc|icu}\n" +" провайдер локалі для сортування бази даних за замовчуванням\n" + +#: createdb.c:293 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --власник=ВЛАСНИК користувач-власник нової бази даних\n" -#: createdb.c:277 +#: createdb.c:294 +#, 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:295 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --шаблон=ШАБЛОН шаблонна база даних для копіювання\n" -#: createdb.c:278 reindexdb.c:807 +#: createdb.c:296 reindexdb.c:777 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: createdb.c:279 reindexdb.c:808 +#: createdb.c:297 reindexdb.c:778 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: createdb.c:281 reindexdb.c:810 +#: createdb.c:299 reindexdb.c:780 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ІМ'Я_ХОСТА хост сервера бази даних або каталог сокетів\n" -#: createdb.c:282 reindexdb.c:811 +#: createdb.c:300 reindexdb.c:781 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера бази даних\n" -#: createdb.c:283 reindexdb.c:812 +#: createdb.c:301 reindexdb.c:782 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: createdb.c:284 reindexdb.c:813 +#: createdb.c:302 reindexdb.c:783 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: createdb.c:285 reindexdb.c:814 +#: createdb.c:303 reindexdb.c:784 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросити пароль\n" -#: createdb.c:286 reindexdb.c:815 +#: createdb.c:304 reindexdb.c:785 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n" -#: createdb.c:287 +#: createdb.c:305 #, 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 +#: createuser.c:193 msgid "Enter name of role to add: " msgstr "Введіть ім'я нової ролі: " -#: createuser.c:210 +#: createuser.c:208 msgid "Enter password for new role: " msgstr "Введіть пароль для нової ролі: " -#: createuser.c:211 +#: createuser.c:209 msgid "Enter it again: " msgstr "Введіть знову: " -#: createuser.c:214 +#: createuser.c:212 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не співпадають.\n" -#: createuser.c:222 +#: createuser.c:220 msgid "Shall the new role be a superuser?" msgstr "Чи буде нова роль суперкористувачем?" -#: createuser.c:237 +#: createuser.c:235 msgid "Shall the new role be allowed to create databases?" msgstr "Чи дозволено новій ролі створювати бази даних?" -#: createuser.c:245 +#: createuser.c:243 msgid "Shall the new role be allowed to create more new roles?" msgstr "Чи дозволено новій ролі створювати інші нові ролі?" -#: createuser.c:281 +#: createuser.c:278 #, c-format msgid "password encryption failed: %s" msgstr "помилка шифрування пароля: %s" -#: createuser.c:336 +#: createuser.c:331 #, c-format msgid "creation of new role failed: %s" msgstr "не вдалося створити нову роль: %s" -#: createuser.c:350 +#: createuser.c:345 #, c-format msgid "%s creates a new PostgreSQL role.\n\n" msgstr "%s створює нову роль 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]... [ROLENAME]\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 ліміт під'єднань для ролі (за замовчуванням ліміту немає)\n" -#: createuser.c:355 +#: createuser.c:350 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль може створювати нові бази даних\n" -#: createuser.c:356 +#: createuser.c:351 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb роль не може створювати нові бази даних (за замовчуванням)\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=РОЛЬ нова роль буде включена в цю роль\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 роль переймає права від ролей до яких вона\n" " включена (за замовчуванням)\n" -#: createuser.c:361 +#: createuser.c:356 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не переймає права\n" -#: createuser.c:362 +#: createuser.c:357 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login роль може увійти (за замовчуванням)\n" -#: createuser.c:363 +#: createuser.c:358 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль не може увійти\n" -#: createuser.c:364 +#: createuser.c:359 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt призначення паролю для нової ролі\n" -#: createuser.c:365 +#: createuser.c:360 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль може створювати нові ролі\n" -#: createuser.c:366 +#: createuser.c:361 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole роль не може створювати нові бази даних (за замовчуванням)\n" -#: createuser.c:367 +#: createuser.c:362 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --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 роль не буде суперкористувачем (за замовчуванням)\n" -#: createuser.c:370 +#: 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:372 +#: createuser.c:367 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль може ініціювати реплікацію\n" -#: createuser.c:373 +#: createuser.c:368 #, c-format msgid " --no-replication role cannot initiate replication\n" msgstr " --no-replication роль не може ініціювати реплікацію\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=USERNAME ім'я користувача для підключення (не для створення)\n" -#: dropdb.c:111 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "немає запитаного аргументу: імені бази даних" -#: dropdb.c:126 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "База даних \"%s\" буде назавжди видалена.\n" -#: dropdb.c:127 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "Ви впевнені?" -#: dropdb.c:156 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "помилка при видаленні бази даних: %s" -#: dropdb.c:170 +#: dropdb.c:171 #, c-format msgid "%s removes a PostgreSQL database.\n\n" msgstr "%s видаляє базу даних PostgreSQL.\n\n" -#: dropdb.c:172 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPTION]... ІМ'Я_БД\n" -#: dropdb.c:175 +#: dropdb.c:176 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force спробувати завершити інші підключення перед видаленням\n" -#: dropdb.c:176 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive запитувати перед видаленням чого-небудь\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 не повідомляти про помилку, якщо бази даних не існує\n" -#: dropuser.c:117 +#: 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:153 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "помилка при видаленні ролі \"%s\": %s" -#: dropuser.c:168 +#: dropuser.c:169 #, c-format msgid "%s removes a PostgreSQL role.\n\n" msgstr "%s видаляє роль 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 запитувати перед видаленням чого-небудь і запитувати\n" " ім'я ролі, якщо не вказано\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 не повідомляти про помилку, якщо користувача не існує\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=USERNAME ім'я користувача для підключення (не для розривання)\n" -#: pg_isready.c:153 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "не вдалося отримати параметри за замовчуванням" -#: pg_isready.c:202 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "отримання підключень\n" -#: pg_isready.c:205 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "відторгнення підключень\n" -#: pg_isready.c:208 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "відповіді немає\n" -#: pg_isready.c:211 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "немає спроб\n" -#: pg_isready.c:214 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "невідомо\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: перевірка підключення до бази даних 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=ІМ'Я_БД ім'я бази даних\n" -#: pg_isready.c:230 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet тихий запуск\n" -#: pg_isready.c:231 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" -#: pg_isready.c:232 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\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 хост серверу баз даних або каталог сокетів\n" -#: pg_isready.c:236 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера бази даних\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 секунд для очікування при спробі підключення, 0 без обмежень (за замовчуванням: %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=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n" -#: reindexdb.c:157 vacuumdb.c:198 -#, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "число паралельних завдань повинно бути не менше 1" - -#: reindexdb.c:210 +#: reindexdb.c:209 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "неможливо переіндексувати всі бази даних і одну вказану одночасно" -#: reindexdb.c:215 +#: reindexdb.c:211 #, c-format msgid "cannot reindex all databases and system catalogs at the same time" msgstr "не можливо переіндексувати всі бази даних і системні каталоги одночасно" -#: reindexdb.c:220 +#: reindexdb.c:213 #, c-format msgid "cannot reindex specific schema(s) in all databases" msgstr "неможливо переіндексувати вказані схеми в усіх базах даних" -#: reindexdb.c:225 +#: reindexdb.c:215 #, c-format msgid "cannot reindex specific table(s) in all databases" msgstr "неможливо переіндексувати вказані таблиці в усіх базах даних" -#: reindexdb.c:230 +#: reindexdb.c:217 #, c-format msgid "cannot reindex specific index(es) in all databases" msgstr "неможливо переіндексувати вказані індекси в усіх базах даних" -#: reindexdb.c:243 +#: reindexdb.c:227 #, c-format msgid "cannot reindex specific schema(s) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані схеми і системні каталоги одночасно" -#: reindexdb.c:248 +#: reindexdb.c:229 #, c-format msgid "cannot reindex specific table(s) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані таблиці і системні каталоги одночасно" -#: reindexdb.c:253 +#: reindexdb.c:231 #, c-format msgid "cannot reindex specific index(es) and system catalogs at the same time" msgstr "не можливо переіндексувати вказані індекси і системні каталоги одночасно" -#: reindexdb.c:259 +#: reindexdb.c:234 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "не можна використовувати декілька завдань для переіндексування системних каталогів" -#: reindexdb.c:288 +#: reindexdb.c:260 #, 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 +#: 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 "не можна використовувати параметр \"%s\" на серверній версії старішій за PostgreSQL %s" -#: reindexdb.c:401 +#: reindexdb.c:369 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо" -#: reindexdb.c:605 +#: reindexdb.c:573 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переіндексувати базу даних \"%s\" не вдалося: %s" -#: reindexdb.c:609 +#: reindexdb.c:577 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати індекси \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:613 +#: reindexdb.c:581 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати схему \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:617 +#: reindexdb.c:585 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переіндексування системних каталогів в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:621 +#: reindexdb.c:589 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переіндексувати таблиці \"%s\" в базі даних \"%s\" не вдалося: %s" -#: reindexdb.c:774 +#: reindexdb.c:744 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переіндексування бази даних \"%s\"\n" -#: reindexdb.c:791 +#: reindexdb.c:761 #, c-format msgid "%s reindexes a PostgreSQL database.\n\n" msgstr "%s переіндексовує базу даних PostgreSQL.\n\n" -#: reindexdb.c:795 +#: reindexdb.c:765 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all переіндексувати всі бази даних\n" -#: reindexdb.c:796 +#: reindexdb.c:766 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently переіндексувати одночасно\n" -#: reindexdb.c:797 +#: reindexdb.c:767 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME база даних для переіндексування\n" -#: reindexdb.c:799 +#: reindexdb.c:769 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX повторно створити лише вказані індекси\n" -#: reindexdb.c:800 +#: reindexdb.c:770 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=NUM використати цю кількість паралельних підключень для переіндексування\n" -#: reindexdb.c:801 +#: reindexdb.c:771 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не писати жодних повідомлень\n" -#: reindexdb.c:802 +#: reindexdb.c:772 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system переіндексувати тільки системні каталоги\n" -#: reindexdb.c:803 +#: reindexdb.c:773 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA переіндексувати лише вказані схеми\n" -#: reindexdb.c:804 +#: reindexdb.c:774 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE переіндексувати лише вказані таблиці\n" -#: reindexdb.c:805 +#: reindexdb.c:775 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE табличний простір для перебудованих індексів\n" -#: reindexdb.c:806 +#: reindexdb.c:776 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато повідомлень\n" -#: reindexdb.c:816 +#: reindexdb.c:786 #, 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 "паралельні робітники для вакууму повинні бути більшими або дорівнювати нулю" - -#: vacuumdb.c:226 -#, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "мінімальний ID ери транзакції має бути хоча б 1" - -#: vacuumdb.c:234 -#, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "мінімальна ера 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 +#: 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 "не можна використовувати параметр \"%s\" під час виконання лише аналіза" -#: vacuumdb.c:332 +#: vacuumdb.c:297 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "не можна використовувати параметр \"%s\" під час виконання VACUUM FULL" -#: vacuumdb.c:341 +#: vacuumdb.c:303 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "використовувати параметр \"%s\" з параметром \"%s\" не можна" -#: vacuumdb.c:363 +#: vacuumdb.c:322 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "неможливо очистити всі бази даних і одну вказану одночасно" -#: vacuumdb.c:368 +#: vacuumdb.c:324 #, c-format msgid "cannot vacuum specific table(s) in all databases" msgstr "неможливо очистити вказані таблиці в усіх базах даних" -#: vacuumdb.c:458 +#: vacuumdb.c:412 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Генерування мінімальної статистики для оптімизатора (1 мета)" -#: vacuumdb.c:459 +#: vacuumdb.c:413 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Генерування середньої статистики для оптимізатора (10 цілей)" -#: vacuumdb.c:460 +#: vacuumdb.c:414 msgid "Generating default (full) optimizer statistics" msgstr "Генерування статистики для оптимізатора за замовчуванням (повністю)" -#: vacuumdb.c:540 +#: vacuumdb.c:479 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обробка бази даних \"%s\": %s\n" -#: vacuumdb.c:543 +#: vacuumdb.c:482 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очищення бази даних \"%s\"\n" -#: vacuumdb.c:1013 +#: vacuumdb.c:952 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистити таблиці \"%s\" в базі даних \"%s\" не вдалося: %s" -#: vacuumdb.c:1016 +#: vacuumdb.c:955 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистити базу даних \"%s\" не вдалося: %s" -#: vacuumdb.c:1024 +#: vacuumdb.c:963 #, c-format msgid "%s cleans and analyzes a PostgreSQL database.\n\n" msgstr "%s очищує й аналізує базу даних PostgreSQL.\n\n" -#: vacuumdb.c:1028 +#: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистити усі бази даних\n" -#: vacuumdb.c:1029 +#: vacuumdb.c:968 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ІМ'Я_БД база даних для очищення\n" -#: vacuumdb.c:1030 +#: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping відключити пропуск сторінок\n" -#: vacuumdb.c:1031 +#: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіслані серверу\n" -#: vacuumdb.c:1032 +#: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full зробити повне очищення\n" -#: vacuumdb.c:1033 +#: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze заморозити інформацію щодо транзакцій в рядках\n" -#: vacuumdb.c:1034 +#: vacuumdb.c:973 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup завжди видаляти записи індексів, які вказують на мертві кортежі\n" -#: vacuumdb.c:1035 +#: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=ЧИСЛО використати ці паралельні підключення для очищення\n" -#: vacuumdb.c:1036 +#: 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 мінімальний ID ери мультитранзакції таблиць для вакууму\n" -#: vacuumdb.c:1037 +#: vacuumdb.c:976 #, 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:1038 +#: 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" -#: vacuumdb.c:1039 +#: 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, пов'язану з таблицею для очищення\n" -#: vacuumdb.c:1040 +#: 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:1041 +#: 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 використати таку кількість фонових робітників для очищення, якщо вони доступні\n" -#: vacuumdb.c:1042 +#: vacuumdb.c:981 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не писати жодних повідомлень\n" -#: vacuumdb.c:1043 +#: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked пропустити відношення, що не можуть бути заблоковані негайно\n" -#: vacuumdb.c:1044 +#: vacuumdb.c:983 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='ТАБЛИЦЯ[(СТОВПЦІ)]' очистити тільки вказані таблиці\n" -#: vacuumdb.c:1045 +#: vacuumdb.c:984 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: vacuumdb.c:1046 +#: vacuumdb.c:985 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: vacuumdb.c:1047 +#: vacuumdb.c:986 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze оновити статистику для оптимізатора\n" -#: vacuumdb.c:1048 +#: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only оновити лише статистику для оптимізатора, не очищати\n" -#: vacuumdb.c:1049 +#: 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 оновити лише статистику для оптимізатора, у декілька стадій для швидших результатів, не очищати\n" -#: vacuumdb.c:1051 +#: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю справку, потім вийти\n" -#: vacuumdb.c:1059 +#: vacuumdb.c:998 #, c-format msgid "\n" "Read the description of the SQL command VACUUM for details.\n" diff --git a/third_party/spanner_pg/src/bin/scripts/reindexdb.c b/third_party/spanner_pg/src/bin/scripts/reindexdb.c index 947cfc40..fc2ad9d5 100644 --- a/third_party/spanner_pg/src/bin/scripts/reindexdb.c +++ b/third_party/spanner_pg/src/bin/scripts/reindexdb.c @@ -2,7 +2,7 @@ * * reindexdb * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/bin/scripts/reindexdb.c * @@ -11,6 +11,8 @@ #include "postgres_fe.h" +#include + #include "catalog/pg_class_d.h" #include "common.h" #include "common/connect.h" @@ -151,12 +153,9 @@ main(int argc, char *argv[]) simple_string_list_append(&indexes, optarg); break; case 'j': - concurrentCons = atoi(optarg); - if (concurrentCons <= 0) - { - pg_log_error("number of parallel jobs must be at least 1"); + if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX, + &concurrentCons)) exit(1); - } break; case 'v': verbose = true; @@ -171,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); } } @@ -190,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); } @@ -206,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; @@ -239,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) { @@ -284,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) { @@ -350,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/third_party/spanner_pg/src/bin/scripts/t/010_clusterdb.pl b/third_party/spanner_pg/src/bin/scripts/t/010_clusterdb.pl index 6d483be1..3d9abbbc 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/010_clusterdb.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/010_clusterdb.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 14; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('clusterdb'); program_version_ok('clusterdb'); program_options_handling_ok('clusterdb'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -34,3 +34,5 @@ $node->command_ok([qw(clusterdb --echo --verbose dbname=template1)], 'clusterdb with connection string'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/011_clusterdb_all.pl b/third_party/spanner_pg/src/bin/scripts/t/011_clusterdb_all.pl index da10ccf1..7a209cf6 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/011_clusterdb_all.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/011_clusterdb_all.pl @@ -1,14 +1,14 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -31,5 +31,8 @@ # Doesn't quite belong here, but don't want to waste time by creating an # invalid database in 010_clusterdb.pl as well. -$node->command_fails([ 'clusterdb', '-d', 'regression_invalid'], +$node->command_fails_like([ 'clusterdb', '-d', 'regression_invalid'], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, 'clusterdb cannot target invalid database'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/020_createdb.pl b/third_party/spanner_pg/src/bin/scripts/t/020_createdb.pl index 7261ebb2..2e712f4f 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/020_createdb.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/020_createdb.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 22; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('createdb'); program_version_ok('createdb'); program_options_handling_ok('createdb'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -25,9 +25,95 @@ 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', '-E', 'UTF8', + '--locale-provider=icu', 'foobar4' + ], + 'create database with ICU fails without ICU locale specified'); + + $node->issues_sql_like( + [ + 'createdb', '-T', + 'template0', '-E', 'UTF8', '--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', '-E', 'UTF8', + '--locale-provider=icu', + '--icu-locale=@colNumeric=lower', 'foobarX' + ], + 'fails for invalid ICU locale'); + + $node->command_fails_like( + [ + 'createdb', '-T', + 'template0', '--locale-provider=icu', + '--encoding=SQL_ASCII', 'foobarX' + ], + qr/ERROR: encoding "SQL_ASCII" is not supported with ICU provider/, + 'fails for encoding not supported by ICU'); + + # additional node, which uses the icu provider + my $node2 = PostgreSQL::Test::Cluster->new('icu'); + $node2->init(extra => ['--locale-provider=icu', '--icu-locale=en']); + $node2->start; + + $node2->command_ok( + [ 'createdb', '-T', 'template0', '--locale-provider=libc', 'foobar55' ], + 'create database with libc provider from template database with icu provider'); + + $node2->command_ok( + [ 'createdb', '-T', 'template0', '--icu-locale', 'en-US', 'foobar56' ], + 'create database with icu locale from template database with icu provider'); +} +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', + 'CREATE ROLE role_foobar; +CREATE TABLE tab_foobar (id int); +ALTER TABLE tab_foobar owner to role_foobar; +CREATE POLICY pol_foobar ON tab_foobar FOR ALL TO role_foobar;'); +$node->issues_sql_like( + [ 'createdb', '-l', 'C', '-T', 'foobar2', 'foobar3' ], + qr/statement: CREATE DATABASE foobar3 TEMPLATE foobar2/, + 'create database with template'); +($ret, $stdout, $stderr) = $node->psql( + 'foobar3', + "SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, 0) AS refobj + FROM pg_shdepend s JOIN pg_database d ON (d.oid = s.dbid) + WHERE d.datname = 'foobar3' ORDER BY obj;", on_error_die => 1); +chomp($stdout); +like( + $stdout, + qr/^policy pol_foobar on table tab_foobar\|role role_foobar +table tab_foobar\|role role_foobar$/, + 'shared dependencies copied over to target database'); + # Check quote handling with incorrect option values. $node->command_checks_all( [ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ], @@ -51,3 +137,25 @@ qr/^createdb: error: database creation failed: ERROR: invalid locale name|^createdb: error: database creation failed: ERROR: new LC_CTYPE \(foo'; SELECT '1\) is incompatible with the LC_CTYPE of the template database/s ], '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 "foo"/s + ], + 'createdb with incorrect --strategy'); + +# Check database creation strategy +$node->issues_sql_like( + [ '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', '-S', 'file_copy', 'foobar7' ], + qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/, + 'create database with FILE_COPY strategy'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/040_createuser.pl b/third_party/spanner_pg/src/bin/scripts/t/040_createuser.pl index 8fdd32d7..2a34be81 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/040_createuser.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/040_createuser.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 17; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('createuser'); program_version_ok('createuser'); program_options_handling_ok('createuser'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -35,3 +35,5 @@ $node->command_fails([ 'createuser', 'regress_user1' ], 'fails if role already exists'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/050_dropdb.pl b/third_party/spanner_pg/src/bin/scripts/t/050_dropdb.pl index 8b491082..1ca9ab84 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/050_dropdb.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/050_dropdb.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 14; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('dropdb'); program_version_ok('dropdb'); program_options_handling_ok('dropdb'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -39,3 +39,5 @@ )); $node->command_ok([ 'dropdb', 'regression_invalid' ], 'invalid database can be dropped'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/070_dropuser.pl b/third_party/spanner_pg/src/bin/scripts/t/070_dropuser.pl index cbcb09b0..e4eac218 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/070_dropuser.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/070_dropuser.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 11; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('dropuser'); program_version_ok('dropuser'); program_options_handling_ok('dropuser'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -24,3 +24,5 @@ $node->command_fails([ 'dropuser', 'regress_nonexistent' ], 'fails with nonexistent user'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/080_pg_isready.pl b/third_party/spanner_pg/src/bin/scripts/t/080_pg_isready.pl index 375f0feb..c45ca666 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/080_pg_isready.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/080_pg_isready.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 10; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('pg_isready'); program_version_ok('pg_isready'); @@ -14,10 +14,12 @@ command_fails(['pg_isready'], 'fails with no server running'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; $node->command_ok( - [ 'pg_isready', "--timeout=$TestLib::timeout_default" ], + [ 'pg_isready', "--timeout=$PostgreSQL::Test::Utils::timeout_default" ], 'succeeds with server running'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/090_reindexdb.pl b/third_party/spanner_pg/src/bin/scripts/t/090_reindexdb.pl index 8bdedcb3..398fc4e6 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/090_reindexdb.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/090_reindexdb.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 58; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('reindexdb'); program_version_ok('reindexdb'); program_options_handling_ok('reindexdb'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -198,3 +198,5 @@ qr/^reindexdb: warning: cannot reindex system catalogs concurrently, skipping all/s ], 'parallel reindexdb for system with --concurrently skips catalogs'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/091_reindexdb_all.pl b/third_party/spanner_pg/src/bin/scripts/t/091_reindexdb_all.pl index ff3dfb6b..b197ef90 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/091_reindexdb_all.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/091_reindexdb_all.pl @@ -1,13 +1,13 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -28,5 +28,8 @@ # Doesn't quite belong here, but don't want to waste time by creating an # invalid database in 090_reindexdb.pl as well. -$node->command_fails([ 'reindexdb', '-d', 'regression_invalid'], +$node->command_fails_like([ 'reindexdb', '-d', 'regression_invalid'], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, 'reindexdb cannot target invalid database'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/100_vacuumdb.pl b/third_party/spanner_pg/src/bin/scripts/t/100_vacuumdb.pl index 0addc97b..96a818a3 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/100_vacuumdb.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/100_vacuumdb.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 58; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; program_help_ok('vacuumdb'); program_version_ok('vacuumdb'); program_options_handling_ok('vacuumdb'); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -146,3 +146,5 @@ [ 'vacuumdb', '--min-xid-age', '2147483001', 'postgres' ], qr/GREATEST.*relfrozenxid.*2147483001/, 'vacuumdb --table --min-xid-age'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/101_vacuumdb_all.pl b/third_party/spanner_pg/src/bin/scripts/t/101_vacuumdb_all.pl index 4ebf665b..d3fe59ba 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/101_vacuumdb_all.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/101_vacuumdb_all.pl @@ -1,13 +1,13 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -26,5 +26,8 @@ # Doesn't quite belong here, but don't want to waste time by creating an # invalid database in 010_vacuumdb.pl as well. -$node->command_fails([ 'vacuumdb', '-d', 'regression_invalid'], +$node->command_fails_like([ 'vacuumdb', '-d', 'regression_invalid'], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, 'vacuumdb cannot target invalid database'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/102_vacuumdb_stages.pl b/third_party/spanner_pg/src/bin/scripts/t/102_vacuumdb_stages.pl index 155c77ed..caff3a3a 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/102_vacuumdb_stages.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/102_vacuumdb_stages.pl @@ -1,13 +1,13 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -36,3 +36,5 @@ .*statement:\ RESET\ default_statistics_target; .*statement:\ ANALYZE/sx, 'analyze more than one database in stages'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/t/200_connstr.pl b/third_party/spanner_pg/src/bin/scripts/t/200_connstr.pl index b1ceab73..c865146a 100644 --- a/third_party/spanner_pg/src/bin/scripts/t/200_connstr.pl +++ b/third_party/spanner_pg/src/bin/scripts/t/200_connstr.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Tests to check connection string handling in utilities @@ -23,7 +23,7 @@ my $dbname3 = generate_ascii_string(130, 192); my $dbname4 = generate_ascii_string(193, 255); -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init(extra => [ '--locale=C', '--encoding=LATIN1' ]); $node->start; @@ -40,3 +40,5 @@ $node->command_ok( [qw(clusterdb --all --echo --verbose)], 'clusterdb --all with unusual database names'); + +done_testing(); diff --git a/third_party/spanner_pg/src/bin/scripts/vacuumdb.c b/third_party/spanner_pg/src/bin/scripts/vacuumdb.c index c884ffc8..2c576345 100644 --- a/third_party/spanner_pg/src/bin/scripts/vacuumdb.c +++ b/third_party/spanner_pg/src/bin/scripts/vacuumdb.c @@ -2,7 +2,7 @@ * * vacuumdb * - * 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 * * src/bin/scripts/vacuumdb.c @@ -12,8 +12,9 @@ #include "postgres_fe.h" -#include "catalog/pg_class_d.h" +#include +#include "catalog/pg_class_d.h" #include "common.h" #include "common/connect.h" #include "common/logging.h" @@ -192,20 +193,14 @@ main(int argc, char *argv[]) vacopts.verbose = true; break; case 'j': - concurrentCons = atoi(optarg); - if (concurrentCons <= 0) - { - pg_log_error("number of parallel jobs must be at least 1"); + if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX, + &concurrentCons)) exit(1); - } break; case 'P': - vacopts.parallel_workers = atoi(optarg); - if (vacopts.parallel_workers < 0) - { - pg_log_error("parallel workers for vacuum must be greater than or equal to zero"); + if (!option_parse_int(optarg, "-P/--parallel", 0, INT_MAX, + &vacopts.parallel_workers)) exit(1); - } break; case 2: maintenance_db = pg_strdup(optarg); @@ -220,20 +215,14 @@ main(int argc, char *argv[]) vacopts.skip_locked = true; break; case 6: - vacopts.min_xid_age = atoi(optarg); - if (vacopts.min_xid_age <= 0) - { - pg_log_error("minimum transaction ID age must be at least 1"); + if (!option_parse_int(optarg, "--min-xid-age", 1, INT_MAX, + &vacopts.min_xid_age)) exit(1); - } break; case 7: - vacopts.min_mxid_age = atoi(optarg); - if (vacopts.min_mxid_age <= 0) - { - pg_log_error("minimum multixact ID age must be at least 1"); + if (!option_parse_int(optarg, "--min-mxid-age", 1, INT_MAX, + &vacopts.min_mxid_age)) exit(1); - } break; case 8: vacopts.no_index_cleanup = true; @@ -248,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); } } @@ -267,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' */ } @@ -322,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; @@ -359,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; @@ -468,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/third_party/spanner_pg/src/common/BUILD b/third_party/spanner_pg/src/common/BUILD index a47edc76..1b76aaa9 100644 --- a/third_party/spanner_pg/src/common/BUILD +++ b/third_party/spanner_pg/src/common/BUILD @@ -50,6 +50,7 @@ filegroup( "archive.c", "base64.c", "checksum_helper.c", + "compression.c", "config_info.c", "controldata_utils.c", "cryptohash.c", @@ -69,6 +70,7 @@ filegroup( "md5_common.c", "pg_get_line.c", "pg_lzcompress.c", + "pg_prng.c", "pgfnames.c", "psprintf.c", "relpath.c", @@ -130,6 +132,8 @@ cc_library( "//third_party/spanner_pg/src/include", "//third_party/spanner_pg/src/include:kwlist_d_header", "//third_party/spanner_pg/src/port:port_srv", + "@net_zstd//:zstdlib", + "@zlib", ], ) @@ -153,6 +157,8 @@ cc_library( "//third_party/spanner_pg/src/include", "//third_party/spanner_pg/src/include:kwlist_d_header", "//third_party/spanner_pg/src/port:port_frontend", + "@net_zstd//:zstdlib", + "@zlib", ], ) diff --git a/third_party/spanner_pg/src/common/Makefile b/third_party/spanner_pg/src/common/Makefile index 880722fc..e9af7346 100644 --- a/third_party/spanner_pg/src/common/Makefile +++ b/third_party/spanner_pg/src/common/Makefile @@ -49,6 +49,7 @@ OBJS_COMMON = \ archive.o \ base64.o \ checksum_helper.o \ + compression.o \ config_info.o \ controldata_utils.o \ d2s.o \ @@ -66,6 +67,7 @@ OBJS_COMMON = \ md5_common.o \ pg_get_line.o \ pg_lzcompress.o \ + pg_prng.o \ pgfnames.o \ psprintf.o \ relpath.o \ diff --git a/third_party/spanner_pg/src/common/archive.c b/third_party/spanner_pg/src/common/archive.c index d733212c..47fc877c 100644 --- a/third_party/spanner_pg/src/common/archive.c +++ b/third_party/spanner_pg/src/common/archive.c @@ -3,7 +3,7 @@ * archive.c * Common WAL archive routines * - * 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/third_party/spanner_pg/src/common/base64.c b/third_party/spanner_pg/src/common/base64.c index b3ade2a5..37b0070f 100644 --- a/third_party/spanner_pg/src/common/base64.c +++ b/third_party/spanner_pg/src/common/base64.c @@ -3,7 +3,7 @@ * base64.c * Encoding and decoding routines for base64 without whitespace. * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/checksum_helper.c b/third_party/spanner_pg/src/common/checksum_helper.c index 431e247d..74d0cf0a 100644 --- a/third_party/spanner_pg/src/common/checksum_helper.c +++ b/third_party/spanner_pg/src/common/checksum_helper.c @@ -3,7 +3,7 @@ * checksum_helper.c * Compute a checksum of any of various types using common routines * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/checksum_helper.c diff --git a/third_party/spanner_pg/src/common/compression.c b/third_party/spanner_pg/src/common/compression.c new file mode 100644 index 00000000..df5b6278 --- /dev/null +++ b/third_party/spanner_pg/src/common/compression.c @@ -0,0 +1,358 @@ +/*------------------------------------------------------------------------- + * + * compression.c + * + * Shared code for 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 keywords are "level" and "workers". + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/compression.c + *------------------------------------------------------------------------- + */ + +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif + +#ifdef USE_ZSTD +#include +#endif +#ifdef HAVE_LIBZ +#include +#endif + +#include "common/compression.h" + +static int expect_integer_value(char *keyword, char *value, + pg_compress_specification *result); + +/* + * Look up a compression algorithm by name. Returns true and sets *algorithm + * if the name is recognized. Otherwise returns false. + */ +bool +parse_compress_algorithm(char *name, pg_compress_algorithm *algorithm) +{ + if (strcmp(name, "none") == 0) + *algorithm = PG_COMPRESSION_NONE; + else if (strcmp(name, "gzip") == 0) + *algorithm = PG_COMPRESSION_GZIP; + else if (strcmp(name, "lz4") == 0) + *algorithm = PG_COMPRESSION_LZ4; + else if (strcmp(name, "zstd") == 0) + *algorithm = PG_COMPRESSION_ZSTD; + else + return false; + return true; +} + +/* + * Get the human-readable name corresponding to a particular compression + * algorithm. + */ +const char * +get_compress_algorithm_name(pg_compress_algorithm algorithm) +{ + switch (algorithm) + { + case PG_COMPRESSION_NONE: + return "none"; + case PG_COMPRESSION_GZIP: + return "gzip"; + case PG_COMPRESSION_LZ4: + return "lz4"; + case PG_COMPRESSION_ZSTD: + return "zstd"; + /* no default, to provoke compiler warnings if values are added */ + } + Assert(false); + return "???"; /* placate compiler */ +} + +/* + * 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. + * + * The compression level is assigned by default if not directly specified + * by the specification. + * + * Use validate_compress_specification() to find out whether a compression + * specification is semantically sensible. + */ +void +parse_compress_specification(pg_compress_algorithm algorithm, char *specification, + pg_compress_specification *result) +{ + int bare_level; + char *bare_level_endp; + + /* Initial setup of result object. */ + result->algorithm = algorithm; + result->options = 0; + result->parse_error = NULL; + + /* + * Assign a default level depending on the compression method. This may + * be enforced later. + */ + switch (result->algorithm) + { + case PG_COMPRESSION_NONE: + result->level = 0; + break; + case PG_COMPRESSION_LZ4: +#ifdef USE_LZ4 + result->level = 0; /* fast compression mode */ +#else + result->parse_error = + psprintf(_("this build does not support compression with %s"), + "LZ4"); +#endif + break; + case PG_COMPRESSION_ZSTD: +#ifdef USE_ZSTD + result->level = ZSTD_CLEVEL_DEFAULT; +#else + result->parse_error = + psprintf(_("this build does not support compression with %s"), + "ZSTD"); +#endif + break; + case PG_COMPRESSION_GZIP: +#ifdef HAVE_LIBZ + result->level = Z_DEFAULT_COMPRESSION; +#else + result->parse_error = + psprintf(_("this build does not support compression with %s"), + "gzip"); +#endif + break; + } + + /* 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; + 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); + + /* + * No need to set a flag in "options", there is a default level + * set at least thanks to the logic above. + */ + } + else if (strcmp(keyword, "workers") == 0) + { + result->workers = expect_integer_value(keyword, value, result); + result->options |= PG_COMPRESSION_OPTION_WORKERS; + } + else + result->parse_error = + psprintf(_("unrecognized 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 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. */ + 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, pg_compress_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_compress_specification(pg_compress_specification *spec) +{ + int min_level = 1; + int max_level = 1; + int default_level = 0; + + /* If it didn't even parse OK, it's definitely no good. */ + if (spec->parse_error != NULL) + return spec->parse_error; + + /* + * Check that the algorithm expects a compression level and it is within + * the legal range for the algorithm. + */ + switch (spec->algorithm) + { + case PG_COMPRESSION_GZIP: + max_level = 9; +#ifdef HAVE_LIBZ + default_level = Z_DEFAULT_COMPRESSION; +#endif + break; + case PG_COMPRESSION_LZ4: + max_level = 12; + default_level = 0; /* fast mode */ + break; + case PG_COMPRESSION_ZSTD: +#ifdef USE_ZSTD + max_level = ZSTD_maxCLevel(); + min_level = ZSTD_minCLevel(); + default_level = ZSTD_CLEVEL_DEFAULT; +#endif + break; + case PG_COMPRESSION_NONE: + if (spec->level != 0) + return psprintf(_("compression algorithm \"%s\" does not accept a compression level"), + get_compress_algorithm_name(spec->algorithm)); + break; + } + + if ((spec->level < min_level || spec->level > max_level) && + spec->level != default_level) + return psprintf(_("compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"), + get_compress_algorithm_name(spec->algorithm), + min_level, max_level, default_level); + + /* + * Of the compression algorithms that we currently support, only zstd + * allows parallel workers. + */ + if ((spec->options & PG_COMPRESSION_OPTION_WORKERS) != 0 && + (spec->algorithm != PG_COMPRESSION_ZSTD)) + { + return psprintf(_("compression algorithm \"%s\" does not accept a worker count"), + get_compress_algorithm_name(spec->algorithm)); + } + + return NULL; +} diff --git a/third_party/spanner_pg/src/common/config_info.c b/third_party/spanner_pg/src/common/config_info.c index e72e7292..aa643b63 100644 --- a/third_party/spanner_pg/src/common/config_info.c +++ b/third_party/spanner_pg/src/common/config_info.c @@ -4,7 +4,7 @@ * Common code for pg_config output * * - * 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/third_party/spanner_pg/src/common/controldata_utils.c b/third_party/spanner_pg/src/common/controldata_utils.c index c6f133fe..2331319d 100644 --- a/third_party/spanner_pg/src/common/controldata_utils.c +++ b/third_party/spanner_pg/src/common/controldata_utils.c @@ -4,7 +4,7 @@ * Common code for control data file output. * * - * 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 * * @@ -23,6 +23,7 @@ #include #include #include +#include #include "access/xlog_internal.h" #include "catalog/pg_control.h" @@ -79,11 +80,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)); @@ -95,10 +93,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 @@ -107,11 +102,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 } @@ -123,10 +115,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. */ @@ -198,6 +187,9 @@ update_controlfile(const char *DataDir, StaticAssertStmt(sizeof(ControlFileData) <= PG_CONTROL_FILE_SIZE, "sizeof(ControlFileData) exceeds PG_CONTROL_FILE_SIZE"); + /* Update timestamp */ + ControlFile->time = (pg_time_t) time(NULL); + /* Recalculate CRC of control file */ INIT_CRC32C(ControlFile->crc); COMP_CRC32C(ControlFile->crc, @@ -229,10 +221,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; @@ -251,8 +240,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 @@ -271,10 +259,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 } @@ -286,8 +271,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/third_party/spanner_pg/src/common/cryptohash.c b/third_party/spanner_pg/src/common/cryptohash.c index 0dab74a0..a295a5c6 100644 --- a/third_party/spanner_pg/src/common/cryptohash.c +++ b/third_party/spanner_pg/src/common/cryptohash.c @@ -6,7 +6,7 @@ * This is the set of in-core functions used when there are no other * alternative options like OpenSSL. * - * 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 * * IDENTIFICATION @@ -40,10 +40,18 @@ #define FREE(ptr) free(ptr) #endif +/* Set of error states */ +typedef enum pg_cryptohash_errno +{ + PG_CRYPTOHASH_ERROR_NONE = 0, + PG_CRYPTOHASH_ERROR_DEST_LEN +} pg_cryptohash_errno; + /* Internal pg_cryptohash_ctx structure */ struct pg_cryptohash_ctx { pg_cryptohash_type type; + pg_cryptohash_errno error; union { @@ -76,9 +84,10 @@ pg_cryptohash_create(pg_cryptohash_type type) ctx = ALLOC(sizeof(pg_cryptohash_ctx)); if (ctx == NULL) return NULL; + memset(ctx, 0, sizeof(pg_cryptohash_ctx)); ctx->type = type; - + ctx->error = PG_CRYPTOHASH_ERROR_NONE; return ctx; } @@ -174,32 +183,50 @@ pg_cryptohash_final(pg_cryptohash_ctx *ctx, uint8 *dest, size_t len) { case PG_MD5: if (len < MD5_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_md5_final(&ctx->data.md5, dest); break; case PG_SHA1: if (len < SHA1_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_sha1_final(&ctx->data.sha1, dest); break; case PG_SHA224: if (len < PG_SHA224_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_sha224_final(&ctx->data.sha224, dest); break; case PG_SHA256: if (len < PG_SHA256_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_sha256_final(&ctx->data.sha256, dest); break; case PG_SHA384: if (len < PG_SHA384_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_sha384_final(&ctx->data.sha384, dest); break; case PG_SHA512: if (len < PG_SHA512_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } pg_sha512_final(&ctx->data.sha512, dest); break; } @@ -221,3 +248,31 @@ pg_cryptohash_free(pg_cryptohash_ctx *ctx) explicit_bzero(ctx, sizeof(pg_cryptohash_ctx)); FREE(ctx); } + +/* + * pg_cryptohash_error + * + * Returns a static string providing details about an error that + * happened during a computation. + */ +const char * +pg_cryptohash_error(pg_cryptohash_ctx *ctx) +{ + /* + * This implementation would never fail because of an out-of-memory error, + * except when creating the context. + */ + if (ctx == NULL) + return _("out of memory"); + + switch (ctx->error) + { + case PG_CRYPTOHASH_ERROR_NONE: + return _("success"); + case PG_CRYPTOHASH_ERROR_DEST_LEN: + return _("destination buffer too small"); + } + + Assert(false); + return _("success"); +} diff --git a/third_party/spanner_pg/src/common/cryptohash_openssl.c b/third_party/spanner_pg/src/common/cryptohash_openssl.c index 643cc7ae..2fb29b1f 100644 --- a/third_party/spanner_pg/src/common/cryptohash_openssl.c +++ b/third_party/spanner_pg/src/common/cryptohash_openssl.c @@ -6,7 +6,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * 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 * * IDENTIFICATION @@ -21,6 +21,7 @@ #include "postgres_fe.h" #endif +#include #include #include "common/cryptohash.h" @@ -46,6 +47,14 @@ #define FREE(ptr) free(ptr) #endif +/* Set of error states */ +typedef enum pg_cryptohash_errno +{ + PG_CRYPTOHASH_ERROR_NONE = 0, + PG_CRYPTOHASH_ERROR_DEST_LEN, + PG_CRYPTOHASH_ERROR_OPENSSL +} pg_cryptohash_errno; + /* * Internal pg_cryptohash_ctx structure. * @@ -55,6 +64,8 @@ struct pg_cryptohash_ctx { pg_cryptohash_type type; + pg_cryptohash_errno error; + const char *errreason; EVP_MD_CTX *evpctx; @@ -63,6 +74,19 @@ struct pg_cryptohash_ctx #endif }; +static const char * +SSLerrmessage(unsigned long ecode) +{ + if (ecode == 0) + return NULL; + + /* + * This may return NULL, but we would fall back to a default error path if + * that were the case. + */ + return ERR_reason_error_string(ecode); +} + /* * pg_cryptohash_create * @@ -88,10 +112,15 @@ pg_cryptohash_create(pg_cryptohash_type type) return NULL; memset(ctx, 0, sizeof(pg_cryptohash_ctx)); ctx->type = type; + ctx->error = PG_CRYPTOHASH_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(); ctx->evpctx = EVP_MD_CTX_create(); if (ctx->evpctx == NULL) @@ -153,7 +182,18 @@ pg_cryptohash_init(pg_cryptohash_ctx *ctx) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + 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; } @@ -174,7 +214,11 @@ pg_cryptohash_update(pg_cryptohash_ctx *ctx, const uint8 *data, size_t len) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + ctx->errreason = SSLerrmessage(ERR_get_error()); + ctx->error = PG_CRYPTOHASH_ERROR_OPENSSL; return -1; + } return 0; } @@ -195,27 +239,45 @@ pg_cryptohash_final(pg_cryptohash_ctx *ctx, uint8 *dest, size_t len) { case PG_MD5: if (len < MD5_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; case PG_SHA1: if (len < SHA1_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; case PG_SHA224: if (len < PG_SHA224_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; case PG_SHA256: if (len < PG_SHA256_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; case PG_SHA384: if (len < PG_SHA384_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; case PG_SHA512: if (len < PG_SHA512_DIGEST_LENGTH) + { + ctx->error = PG_CRYPTOHASH_ERROR_DEST_LEN; return -1; + } break; } @@ -223,7 +285,11 @@ pg_cryptohash_final(pg_cryptohash_ctx *ctx, uint8 *dest, size_t len) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + ctx->errreason = SSLerrmessage(ERR_get_error()); + ctx->error = PG_CRYPTOHASH_ERROR_OPENSSL; return -1; + } return 0; } @@ -248,3 +314,40 @@ pg_cryptohash_free(pg_cryptohash_ctx *ctx) explicit_bzero(ctx, sizeof(pg_cryptohash_ctx)); FREE(ctx); } + +/* + * pg_cryptohash_error + * + * Returns a static string providing details about an error that + * happened during a computation. + */ +const char * +pg_cryptohash_error(pg_cryptohash_ctx *ctx) +{ + /* + * This implementation would never fail because of an out-of-memory error, + * except when creating the context. + */ + if (ctx == NULL) + return _("out of memory"); + + /* + * If a reason is provided, rely on it, else fallback to any error code + * set. + */ + if (ctx->errreason) + return ctx->errreason; + + switch (ctx->error) + { + case PG_CRYPTOHASH_ERROR_NONE: + return _("success"); + case PG_CRYPTOHASH_ERROR_DEST_LEN: + return _("destination buffer too small"); + case PG_CRYPTOHASH_ERROR_OPENSSL: + return _("OpenSSL failure"); + } + + Assert(false); /* cannot be reached */ + return _("success"); +} diff --git a/third_party/spanner_pg/src/common/d2s.c b/third_party/spanner_pg/src/common/d2s.c index 63f61cdd..abc3249b 100644 --- a/third_party/spanner_pg/src/common/d2s.c +++ b/third_party/spanner_pg/src/common/d2s.c @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s.c diff --git a/third_party/spanner_pg/src/common/d2s_full_table.h b/third_party/spanner_pg/src/common/d2s_full_table.h index 70b4419f..5be37790 100644 --- a/third_party/spanner_pg/src/common/d2s_full_table.h +++ b/third_party/spanner_pg/src/common/d2s_full_table.h @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s_full_table.h diff --git a/third_party/spanner_pg/src/common/d2s_intrinsics.h b/third_party/spanner_pg/src/common/d2s_intrinsics.h index 3be23271..a338d0e2 100644 --- a/third_party/spanner_pg/src/common/d2s_intrinsics.h +++ b/third_party/spanner_pg/src/common/d2s_intrinsics.h @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s_intrinsics.h diff --git a/third_party/spanner_pg/src/common/encnames.c b/third_party/spanner_pg/src/common/encnames.c index f2aaeb4a..596a23b6 100644 --- a/third_party/spanner_pg/src/common/encnames.c +++ b/third_party/spanner_pg/src/common/encnames.c @@ -3,7 +3,7 @@ * encnames.c * Encoding names and routines for working with them. * - * Portions Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2001-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/encnames.c diff --git a/third_party/spanner_pg/src/common/exec.c b/third_party/spanner_pg/src/common/exec.c index 95e1c30d..9da588da 100644 --- a/third_party/spanner_pg/src/common/exec.c +++ b/third_party/spanner_pg/src/common/exec.c @@ -4,7 +4,7 @@ * Functions for finding and validating executable files * * - * 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 * * @@ -35,7 +35,7 @@ /* 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 */ +extern int _CRT_glob = 0; /* 0 turns off globbing; 1 turns it on */ #endif /* diff --git a/third_party/spanner_pg/src/common/f2s.c b/third_party/spanner_pg/src/common/f2s.c index 35036091..93173480 100644 --- a/third_party/spanner_pg/src/common/f2s.c +++ b/third_party/spanner_pg/src/common/f2s.c @@ -2,7 +2,7 @@ * * Ryu floating-point output for single precision. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/f2s.c diff --git a/third_party/spanner_pg/src/common/fe_memutils.c b/third_party/spanner_pg/src/common/fe_memutils.c index ec64172a..21fcce54 100644 --- a/third_party/spanner_pg/src/common/fe_memutils.c +++ b/third_party/spanner_pg/src/common/fe_memutils.c @@ -3,7 +3,7 @@ * fe_memutils.c * memory management support for frontend code * - * 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/third_party/spanner_pg/src/common/file_perm.c b/third_party/spanner_pg/src/common/file_perm.c index ab85765a..9597f9d4 100644 --- a/third_party/spanner_pg/src/common/file_perm.c +++ b/third_party/spanner_pg/src/common/file_perm.c @@ -3,7 +3,7 @@ * File and directory permission routines * * - * 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 * * src/common/file_perm.c diff --git a/third_party/spanner_pg/src/common/file_utils.c b/third_party/spanner_pg/src/common/file_utils.c index fd2d1137..966b987d 100644 --- a/third_party/spanner_pg/src/common/file_utils.c +++ b/third_party/spanner_pg/src/common/file_utils.c @@ -5,7 +5,7 @@ * Assorted utility functions to work on files. * * - * 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 * * 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/third_party/spanner_pg/src/common/hashfn.c b/third_party/spanner_pg/src/common/hashfn.c index 902a6ad2..8779575b 100644 --- a/third_party/spanner_pg/src/common/hashfn.c +++ b/third_party/spanner_pg/src/common/hashfn.c @@ -5,7 +5,7 @@ * hashtables * * - * 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 * * @@ -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/third_party/spanner_pg/src/common/hmac.c b/third_party/spanner_pg/src/common/hmac.c index 1af7276d..a27778e8 100644 --- a/third_party/spanner_pg/src/common/hmac.c +++ b/third_party/spanner_pg/src/common/hmac.c @@ -5,7 +5,7 @@ * * Fallback implementation of HMAC, as specified in RFC 2104. * - * 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 * * IDENTIFICATION @@ -38,11 +38,21 @@ #define FREE(ptr) free(ptr) #endif +/* Set of error states */ +typedef enum pg_hmac_errno +{ + PG_HMAC_ERROR_NONE = 0, + PG_HMAC_ERROR_OOM, + PG_HMAC_ERROR_INTERNAL +} pg_hmac_errno; + /* Internal pg_hmac_ctx structure */ struct pg_hmac_ctx { pg_cryptohash_ctx *hash; pg_cryptohash_type type; + pg_hmac_errno error; + const char *errreason; int block_size; int digest_size; @@ -73,6 +83,8 @@ pg_hmac_create(pg_cryptohash_type type) return NULL; memset(ctx, 0, sizeof(pg_hmac_ctx)); ctx->type = type; + ctx->error = PG_HMAC_ERROR_NONE; + ctx->errreason = NULL; /* * Initialize the context data. This requires to know the digest and @@ -150,12 +162,16 @@ pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len) /* temporary buffer for one-time shrink */ shrinkbuf = ALLOC(digest_size); if (shrinkbuf == NULL) + { + ctx->error = PG_HMAC_ERROR_OOM; return -1; + } memset(shrinkbuf, 0, digest_size); hash_ctx = pg_cryptohash_create(ctx->type); if (hash_ctx == NULL) { + ctx->error = PG_HMAC_ERROR_OOM; FREE(shrinkbuf); return -1; } @@ -164,6 +180,8 @@ pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len) pg_cryptohash_update(hash_ctx, key, len) < 0 || pg_cryptohash_final(hash_ctx, shrinkbuf, digest_size) < 0) { + ctx->error = PG_HMAC_ERROR_INTERNAL; + ctx->errreason = pg_cryptohash_error(hash_ctx); pg_cryptohash_free(hash_ctx); FREE(shrinkbuf); return -1; @@ -184,6 +202,8 @@ pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len) if (pg_cryptohash_init(ctx->hash) < 0 || pg_cryptohash_update(ctx->hash, ctx->k_ipad, ctx->block_size) < 0) { + ctx->error = PG_HMAC_ERROR_INTERNAL; + ctx->errreason = pg_cryptohash_error(ctx->hash); if (shrinkbuf) FREE(shrinkbuf); return -1; @@ -206,7 +226,11 @@ pg_hmac_update(pg_hmac_ctx *ctx, const uint8 *data, size_t len) return -1; if (pg_cryptohash_update(ctx->hash, data, len) < 0) + { + ctx->error = PG_HMAC_ERROR_INTERNAL; + ctx->errreason = pg_cryptohash_error(ctx->hash); return -1; + } return 0; } @@ -226,11 +250,16 @@ pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len) h = ALLOC(ctx->digest_size); if (h == NULL) + { + ctx->error = PG_HMAC_ERROR_OOM; return -1; + } memset(h, 0, ctx->digest_size); if (pg_cryptohash_final(ctx->hash, h, ctx->digest_size) < 0) { + ctx->error = PG_HMAC_ERROR_INTERNAL; + ctx->errreason = pg_cryptohash_error(ctx->hash); FREE(h); return -1; } @@ -241,6 +270,8 @@ pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len) pg_cryptohash_update(ctx->hash, h, ctx->digest_size) < 0 || pg_cryptohash_final(ctx->hash, dest, len) < 0) { + ctx->error = PG_HMAC_ERROR_INTERNAL; + ctx->errreason = pg_cryptohash_error(ctx->hash); FREE(h); return -1; } @@ -264,3 +295,36 @@ pg_hmac_free(pg_hmac_ctx *ctx) explicit_bzero(ctx, sizeof(pg_hmac_ctx)); FREE(ctx); } + +/* + * pg_hmac_error + * + * Returns a static string providing details about an error that happened + * during a HMAC computation. + */ +const char * +pg_hmac_error(pg_hmac_ctx *ctx) +{ + if (ctx == NULL) + return _("out of memory"); + + /* + * If a reason is provided, rely on it, else fallback to any error code + * set. + */ + if (ctx->errreason) + return ctx->errreason; + + switch (ctx->error) + { + case PG_HMAC_ERROR_NONE: + return _("success"); + case PG_HMAC_ERROR_INTERNAL: + return _("internal error"); + case PG_HMAC_ERROR_OOM: + return _("out of memory"); + } + + Assert(false); /* cannot be reached */ + return _("success"); +} diff --git a/third_party/spanner_pg/src/common/hmac_openssl.c b/third_party/spanner_pg/src/common/hmac_openssl.c index 95b49440..8874d6a2 100644 --- a/third_party/spanner_pg/src/common/hmac_openssl.c +++ b/third_party/spanner_pg/src/common/hmac_openssl.c @@ -5,7 +5,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * 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 * * IDENTIFICATION @@ -20,6 +20,8 @@ #include "postgres_fe.h" #endif + +#include #include #include "common/hmac.h" @@ -50,17 +52,40 @@ #define FREE(ptr) free(ptr) #endif /* FRONTEND */ +/* Set of error states */ +typedef enum pg_hmac_errno +{ + PG_HMAC_ERROR_NONE = 0, + PG_HMAC_ERROR_DEST_LEN, + PG_HMAC_ERROR_OPENSSL +} pg_hmac_errno; + /* Internal pg_hmac_ctx structure */ struct pg_hmac_ctx { HMAC_CTX *hmacctx; pg_cryptohash_type type; + pg_hmac_errno error; + const char *errreason; #ifndef FRONTEND ResourceOwner resowner; #endif }; +static const char * +SSLerrmessage(unsigned long ecode) +{ + if (ecode == 0) + return NULL; + + /* + * This may return NULL, but we would fall back to a default error path if + * that were the case. + */ + return ERR_reason_error_string(ecode); +} + /* * pg_hmac_create * @@ -78,10 +103,16 @@ pg_hmac_create(pg_cryptohash_type type) memset(ctx, 0, sizeof(pg_hmac_ctx)); ctx->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); @@ -152,7 +183,11 @@ pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + ctx->errreason = SSLerrmessage(ERR_get_error()); + ctx->error = PG_HMAC_ERROR_OPENSSL; return -1; + } return 0; } @@ -174,7 +209,11 @@ pg_hmac_update(pg_hmac_ctx *ctx, const uint8 *data, size_t len) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + ctx->errreason = SSLerrmessage(ERR_get_error()); + ctx->error = PG_HMAC_ERROR_OPENSSL; return -1; + } return 0; } @@ -196,27 +235,45 @@ pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len) { case PG_MD5: if (len < MD5_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; case PG_SHA1: if (len < SHA1_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; case PG_SHA224: if (len < PG_SHA224_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; case PG_SHA256: if (len < PG_SHA256_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; case PG_SHA384: if (len < PG_SHA384_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; case PG_SHA512: if (len < PG_SHA512_DIGEST_LENGTH) + { + ctx->error = PG_HMAC_ERROR_DEST_LEN; return -1; + } break; } @@ -224,7 +281,11 @@ pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len) /* OpenSSL internals return 1 on success, 0 on failure */ if (status <= 0) + { + ctx->errreason = SSLerrmessage(ERR_get_error()); + ctx->error = PG_HMAC_ERROR_OPENSSL; return -1; + } return 0; } @@ -252,3 +313,36 @@ pg_hmac_free(pg_hmac_ctx *ctx) explicit_bzero(ctx, sizeof(pg_hmac_ctx)); FREE(ctx); } + +/* + * pg_hmac_error + * + * Returns a static string providing details about an error that happened + * during a HMAC computation. + */ +const char * +pg_hmac_error(pg_hmac_ctx *ctx) +{ + if (ctx == NULL) + return _("out of memory"); + + /* + * If a reason is provided, rely on it, else fallback to any error code + * set. + */ + if (ctx->errreason) + return ctx->errreason; + + switch (ctx->error) + { + case PG_HMAC_ERROR_NONE: + return _("success"); + case PG_HMAC_ERROR_DEST_LEN: + return _("destination buffer too small"); + case PG_HMAC_ERROR_OPENSSL: + return _("OpenSSL failure"); + } + + Assert(false); /* cannot be reached */ + return _("success"); +} diff --git a/third_party/spanner_pg/src/common/ip.c b/third_party/spanner_pg/src/common/ip.c index 9b611d86..cd73d496 100644 --- a/third_party/spanner_pg/src/common/ip.c +++ b/third_party/spanner_pg/src/common/ip.c @@ -3,7 +3,7 @@ * ip.c * IPv6-aware network access. * - * 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 * * @@ -232,8 +232,18 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp, aip->ai_addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(path); } + /* + * The standard recommendation for filling sun_len is to set it to the + * struct size (independently of the actual path length). However, that + * draws an integer-overflow warning on AIX 7.1, where sun_len is just + * uint8 yet the struct size exceeds 255 bytes. It's likely that nothing + * is paying attention to sun_len on that platform, but we have to do + * something with it. To suppress the warning, clamp the struct size to + * what will fit in sun_len. + */ #ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN - unp->sun_len = sizeof(struct sockaddr_un); + unp->sun_len = Min(sizeof(struct sockaddr_un), + ((size_t) 1 << (sizeof(unp->sun_len) * BITS_PER_BYTE)) - 1); #endif return 0; diff --git a/third_party/spanner_pg/src/common/jsonapi.c b/third_party/spanner_pg/src/common/jsonapi.c index 3d0fbfa7..ca4bb57b 100644 --- a/third_party/spanner_pg/src/common/jsonapi.c +++ b/third_party/spanner_pg/src/common/jsonapi.c @@ -3,7 +3,7 @@ * jsonapi.c * JSON parser and lexer interfaces * - * 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 * * IDENTIFICATION @@ -20,20 +20,10 @@ #include "common/jsonapi.h" #include "mb/pg_wchar.h" -#ifdef FRONTEND -#include "common/logging.h" -#else +#ifndef FRONTEND #include "miscadmin.h" #endif -#ifdef FRONTEND -#define check_stack_depth() -#define json_log_and_abort(...) \ - do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0) -#else -#define json_log_and_abort(...) elog(ERROR, __VA_ARGS__) -#endif - /* * The context of the parser is maintained by the recursive descent * mechanism, but is passed explicitly to the error reporting routine @@ -61,7 +51,6 @@ static JsonParseErrorType parse_object(JsonLexContext *lex, JsonSemAction *sem); static JsonParseErrorType parse_array_element(JsonLexContext *lex, JsonSemAction *sem); static JsonParseErrorType parse_array(JsonLexContext *lex, JsonSemAction *sem); static JsonParseErrorType report_parse_error(JsonParseContext ctx, JsonLexContext *lex); -static char *extract_token(JsonLexContext *lex); /* the null action object used for pure validation */ JsonSemAction nullSemAction = @@ -378,7 +367,9 @@ parse_object(JsonLexContext *lex, JsonSemAction *sem) JsonTokenType tok; JsonParseErrorType result; +#ifndef FRONTEND check_stack_depth(); +#endif if (ostart != NULL) (*ostart) (sem->semstate); @@ -478,7 +469,9 @@ parse_array(JsonLexContext *lex, JsonSemAction *sem) json_struct_action aend = sem->array_end; JsonParseErrorType result; +#ifndef FRONTEND check_stack_depth(); +#endif if (astart != NULL) (*astart) (sem->semstate); @@ -665,7 +658,6 @@ json_lex(JsonLexContext *lex) lex->token_type = JSON_TOKEN_FALSE; else return JSON_INVALID_TOKEN; - } } /* end of switch */ } @@ -874,7 +866,6 @@ json_lex_string(JsonLexContext *lex) lex->token_start = s; FAIL_AT_CHAR_END(JSON_ESCAPING_INVALID); } - } else if (lex->strval != NULL) { @@ -883,7 +874,6 @@ json_lex_string(JsonLexContext *lex) appendStringInfoChar(lex->strval, *s); } - } if (hi_surrogate != -1) @@ -1061,15 +1051,34 @@ report_parse_error(JsonParseContext ctx, JsonLexContext *lex) /* * We don't use a default: case, so that the compiler will warn about - * unhandled enum values. But this needs to be here anyway to cover the - * possibility of an incorrect input. + * unhandled enum values. */ - json_log_and_abort("unexpected json parse state: %d", (int) ctx); + Assert(false); return JSON_SUCCESS; /* silence stupider compilers */ } + +#ifndef FRONTEND +/* + * Extract the current token from a lexing context, for error reporting. + */ +static char * +extract_token(JsonLexContext *lex) +{ + int toklen = lex->token_terminator - lex->token_start; + char *token = palloc(toklen + 1); + + memcpy(token, lex->token_start, toklen); + token[toklen] = '\0'; + return token; +} + /* * Construct an (already translated) detail message for a JSON error. + * + * Note that the error message generated by this routine may not be + * palloc'd, making it unsafe for frontend code as there is no way to + * know if this can be safely pfree'd or not. */ char * json_errdetail(JsonParseErrorType error, JsonLexContext *lex) @@ -1132,20 +1141,7 @@ json_errdetail(JsonParseErrorType error, JsonLexContext *lex) * unhandled enum values. But this needs to be here anyway to cover the * possibility of an incorrect input. */ - json_log_and_abort("unexpected json parse error type: %d", (int) error); - return NULL; /* silence stupider compilers */ -} - -/* - * Extract the current token from a lexing context, for error reporting. - */ -static char * -extract_token(JsonLexContext *lex) -{ - int toklen = lex->token_terminator - lex->token_start; - char *token = palloc(toklen + 1); - - memcpy(token, lex->token_start, toklen); - token[toklen] = '\0'; - return token; + elog(ERROR, "unexpected json parse error type: %d", (int) error); + return NULL; } +#endif diff --git a/third_party/spanner_pg/src/common/keywords.c b/third_party/spanner_pg/src/common/keywords.c index d8497f7c..74c9c630 100644 --- a/third_party/spanner_pg/src/common/keywords.c +++ b/third_party/spanner_pg/src/common/keywords.c @@ -4,7 +4,7 @@ * PostgreSQL's list of SQL keywords * * - * 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/third_party/spanner_pg/src/common/kwlookup.c b/third_party/spanner_pg/src/common/kwlookup.c index 19a4f52c..f977cbeb 100644 --- a/third_party/spanner_pg/src/common/kwlookup.c +++ b/third_party/spanner_pg/src/common/kwlookup.c @@ -4,7 +4,7 @@ * Key word lookup for PostgreSQL * * - * 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/third_party/spanner_pg/src/common/link-canary.c b/third_party/spanner_pg/src/common/link-canary.c index 5933b8e5..97105efd 100644 --- a/third_party/spanner_pg/src/common/link-canary.c +++ b/third_party/spanner_pg/src/common/link-canary.c @@ -2,7 +2,7 @@ * link-canary.c * Detect whether src/common functions came from frontend or backend. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/link-canary.c diff --git a/third_party/spanner_pg/src/common/logging.c b/third_party/spanner_pg/src/common/logging.c index fb1a9b1f..64604c52 100644 --- a/third_party/spanner_pg/src/common/logging.c +++ b/third_party/spanner_pg/src/common/logging.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * Logging framework for frontend programs * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * src/common/logging.c * @@ -28,10 +28,12 @@ static void (*log_locus_callback) (const char **, uint64 *); static const char *sgr_error = NULL; static const char *sgr_warning = NULL; +static const char *sgr_note = NULL; static const char *sgr_locus = NULL; #define SGR_ERROR_DEFAULT "01;31" #define SGR_WARNING_DEFAULT "01;35" +#define SGR_NOTE_DEFAULT "01;36" #define SGR_LOCUS_DEFAULT "01" #define ANSI_ESCAPE_FMT "\x1b[%sm" @@ -134,6 +136,8 @@ pg_logging_init(const char *argv0) sgr_error = strdup(value); if (strcmp(name, "warning") == 0) sgr_warning = strdup(value); + if (strcmp(name, "note") == 0) + sgr_note = strdup(value); if (strcmp(name, "locus") == 0) sgr_locus = strdup(value); } @@ -146,11 +150,15 @@ pg_logging_init(const char *argv0) { sgr_error = SGR_ERROR_DEFAULT; sgr_warning = SGR_WARNING_DEFAULT; + sgr_note = SGR_NOTE_DEFAULT; sgr_locus = SGR_LOCUS_DEFAULT; } } } +/* + * Change the logging flags. + */ void pg_logging_config(int new_flags) { @@ -194,17 +202,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; @@ -218,6 +228,10 @@ pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list a 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. @@ -251,31 +265,43 @@ 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); + 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_ERROR: - if (sgr_error) - fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error); - fprintf(stderr, _("error: ")); - if (sgr_error) + case PG_LOG_DETAIL: + if (sgr_note) + fprintf(stderr, ANSI_ESCAPE_FMT, sgr_note); + fprintf(stderr, _("detail: ")); + if (sgr_note) 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) + case PG_LOG_HINT: + if (sgr_note) + fprintf(stderr, ANSI_ESCAPE_FMT, sgr_note); + fprintf(stderr, _("hint: ")); + if (sgr_note) fprintf(stderr, ANSI_ESCAPE_RESET); break; - default: - break; } } diff --git a/third_party/spanner_pg/src/common/md5.c b/third_party/spanner_pg/src/common/md5.c index 7d3b639f..4dec3770 100644 --- a/third_party/spanner_pg/src/common/md5.c +++ b/third_party/spanner_pg/src/common/md5.c @@ -7,7 +7,7 @@ * implementation is a simple one, in that it needs every input byte * to be buffered before doing any calculations. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/md5_common.c b/third_party/spanner_pg/src/common/md5_common.c index 2114890e..472a1032 100644 --- a/third_party/spanner_pg/src/common/md5_common.c +++ b/third_party/spanner_pg/src/common/md5_common.c @@ -6,7 +6,7 @@ * * Sverre H. Huseby * - * 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 * * IDENTIFICATION @@ -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. * @@ -67,19 +70,24 @@ bytesToHex(uint8 b[16], char *s) */ bool -pg_md5_hash(const void *buff, size_t len, char *hexsum) +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 || pg_cryptohash_final(ctx, sum, sizeof(sum)) < 0) { + *errstr = pg_cryptohash_error(ctx); pg_cryptohash_free(ctx); return false; } @@ -89,19 +97,30 @@ pg_md5_hash(const void *buff, size_t len, char *hexsum) 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) +pg_md5_binary(const void *buff, size_t len, void *outbuf, const char **errstr) { 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 || pg_cryptohash_final(ctx, outbuf, MD5_DIGEST_LENGTH) < 0) { + *errstr = pg_cryptohash_error(ctx); pg_cryptohash_free(ctx); return false; } @@ -118,11 +137,12 @@ pg_md5_binary(const void *buff, size_t len, void *outbuf) * Output format is "md5" followed by a 32-hex-digit MD5 checksum. * Hence, the output buffer "buf" must be at least 36 bytes long. * - * Returns true if okay, false on error (out of memory). + * Returns true if okay, false on error with *errstr providing some + * error context. */ bool pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len, - char *buf) + char *buf, const char **errstr) { size_t passwd_len = strlen(passwd); @@ -131,7 +151,10 @@ pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len, bool ret; if (!crypt_buf) + { + *errstr = _("out of memory"); return false; + } /* * Place salt at the end because it may be known by users trying to crack @@ -141,7 +164,7 @@ pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len, memcpy(crypt_buf + passwd_len, salt, salt_len); strcpy(buf, "md5"); - ret = pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3); + ret = pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3, errstr); free(crypt_buf); diff --git a/third_party/spanner_pg/src/common/md5_int.h b/third_party/spanner_pg/src/common/md5_int.h index 4ce7f7de..7c2dfcb2 100644 --- a/third_party/spanner_pg/src/common/md5_int.h +++ b/third_party/spanner_pg/src/common/md5_int.h @@ -3,7 +3,7 @@ * md5_int.h * Internal headers for fallback implementation of MD5 * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/pg_get_line.c b/third_party/spanner_pg/src/common/pg_get_line.c index a80d1961..55be333e 100644 --- a/third_party/spanner_pg/src/common/pg_get_line.c +++ b/third_party/spanner_pg/src/common/pg_get_line.c @@ -3,7 +3,7 @@ * pg_get_line.c * fgets() with an expansible result buffer * - * 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 * * @@ -18,6 +18,8 @@ #include "postgres_fe.h" #endif +#include + #include "common/string.h" #include "lib/stringinfo.h" @@ -47,15 +49,20 @@ * to collect lots of long-lived data. A less memory-hungry option * is to use pg_get_line_buf() or pg_get_line_append() in a loop, * then pstrdup() each line. + * + * prompt_ctx can optionally be provided to allow this function to be + * canceled via an existing SIGINT signal handler that will longjmp to the + * specified place only when *(prompt_ctx->enabled) is true. If canceled, + * this function returns NULL, and prompt_ctx->canceled is set to true. */ char * -pg_get_line(FILE *stream) +pg_get_line(FILE *stream, PromptInterruptContext *prompt_ctx) { StringInfoData buf; initStringInfo(&buf); - if (!pg_get_line_append(stream, &buf)) + if (!pg_get_line_append(stream, &buf, prompt_ctx)) { /* ensure that free() doesn't mess up errno */ int save_errno = errno; @@ -89,7 +96,7 @@ pg_get_line_buf(FILE *stream, StringInfo buf) { /* We just need to drop any data from the previous call */ resetStringInfo(buf); - return pg_get_line_append(stream, buf); + return pg_get_line_append(stream, buf, NULL); } /* @@ -107,15 +114,48 @@ pg_get_line_buf(FILE *stream, StringInfo buf) * * In the false-result case, the contents of *buf are logically unmodified, * though it's possible that the buffer has been resized. + * + * prompt_ctx can optionally be provided to allow this function to be + * canceled via an existing SIGINT signal handler that will longjmp to the + * specified place only when *(prompt_ctx->enabled) is true. If canceled, + * this function returns false, and prompt_ctx->canceled is set to true. */ bool -pg_get_line_append(FILE *stream, StringInfo buf) +pg_get_line_append(FILE *stream, StringInfo buf, + PromptInterruptContext *prompt_ctx) { int orig_len = buf->len; - /* Read some data, appending it to whatever we already have */ - while (fgets(buf->data + buf->len, buf->maxlen - buf->len, stream) != NULL) + if (prompt_ctx && sigsetjmp(*((sigjmp_buf *) prompt_ctx->jmpbuf), 1) != 0) { + /* Got here with longjmp */ + prompt_ctx->canceled = true; + /* Discard any data we collected before detecting error */ + buf->len = orig_len; + buf->data[orig_len] = '\0'; + return false; + } + + /* Loop until newline or EOF/error */ + for (;;) + { + char *res; + + /* Enable longjmp while waiting for input */ + if (prompt_ctx) + *(prompt_ctx->enabled) = true; + + /* Read some data, appending it to whatever we already have */ + res = fgets(buf->data + buf->len, buf->maxlen - buf->len, stream); + + /* Disable longjmp again, then break if fgets failed */ + if (prompt_ctx) + *(prompt_ctx->enabled) = false; + + if (res == NULL) + break; + + /* Got data, so update buf->len */ buf->len += strlen(buf->data + buf->len); /* Done if we have collected a newline */ diff --git a/third_party/spanner_pg/src/common/pg_lzcompress.c b/third_party/spanner_pg/src/common/pg_lzcompress.c index 02e3b2a0..ad3970c7 100644 --- a/third_party/spanner_pg/src/common/pg_lzcompress.c +++ b/third_party/spanner_pg/src/common/pg_lzcompress.c @@ -172,7 +172,7 @@ * * Jan Wieck * - * Copyright (c) 1999-2021, PostgreSQL Global Development Group + * Copyright (c) 1999-2022, PostgreSQL Global Development Group * * src/common/pg_lzcompress.c * ---------- @@ -829,7 +829,7 @@ pglz_decompress(const char *source, int32 slen, char *dest, /* ---------- - * pglz_max_compressed_size - + * pglz_maximum_compressed_size - * * Calculate the maximum compressed size for a given amount of raw data. * Return the maximum size, or total compressed size if maximum size is diff --git a/third_party/spanner_pg/src/common/pg_prng.c b/third_party/spanner_pg/src/common/pg_prng.c new file mode 100644 index 00000000..3d2f4272 --- /dev/null +++ b/third_party/spanner_pg/src/common/pg_prng.c @@ -0,0 +1,247 @@ +/*------------------------------------------------------------------------- + * + * Pseudo-Random Number Generator + * + * We use Blackman and Vigna's xoroshiro128** 1.0 algorithm + * to have a small, fast PRNG suitable for generating reasonably + * good-quality 64-bit data. This should not be considered + * cryptographically strong, however. + * + * About these generators: https://prng.di.unimi.it/ + * See also https://en.wikipedia.org/wiki/List_of_random_number_generators + * + * Copyright (c) 2021-2022, PostgreSQL Global Development Group + * + * src/common/pg_prng.c + * + *------------------------------------------------------------------------- + */ + +#include "c.h" + +#include /* for ldexp() */ + +#include "common/pg_prng.h" +#include "port/pg_bitutils.h" + +/* process-wide state vector */ +pg_prng_state pg_global_prng_state; + + +/* + * 64-bit rotate left + */ +static inline uint64 +rotl(uint64 x, int bits) +{ + return (x << bits) | (x >> (64 - bits)); +} + +/* + * The basic xoroshiro128** algorithm. + * Generates and returns a 64-bit uniformly distributed number, + * updating the state vector for next time. + * + * Note: the state vector must not be all-zeroes, as that is a fixed point. + */ +static uint64 +xoroshiro128ss(pg_prng_state *state) +{ + uint64 s0 = state->s0, + sx = state->s1 ^ s0, + val = rotl(s0 * 5, 7) * 9; + + /* update state */ + state->s0 = rotl(s0, 24) ^ sx ^ (sx << 16); + state->s1 = rotl(sx, 37); + + return val; +} + +/* + * We use this generator just to fill the xoroshiro128** state vector + * from a 64-bit seed. + */ +static uint64 +splitmix64(uint64 *state) +{ + /* state update */ + uint64 val = (*state += UINT64CONST(0x9E3779B97f4A7C15)); + + /* value extraction */ + val = (val ^ (val >> 30)) * UINT64CONST(0xBF58476D1CE4E5B9); + val = (val ^ (val >> 27)) * UINT64CONST(0x94D049BB133111EB); + + return val ^ (val >> 31); +} + +/* + * Initialize the PRNG state from a 64-bit integer, + * taking care that we don't produce all-zeroes. + */ +void +pg_prng_seed(pg_prng_state *state, uint64 seed) +{ + state->s0 = splitmix64(&seed); + state->s1 = splitmix64(&seed); + /* Let's just make sure we didn't get all-zeroes */ + (void) pg_prng_seed_check(state); +} + +/* + * Initialize the PRNG state from a double in the range [-1.0, 1.0], + * taking care that we don't produce all-zeroes. + */ +void +pg_prng_fseed(pg_prng_state *state, double fseed) +{ + /* Assume there's about 52 mantissa bits; the sign contributes too. */ + int64 seed = ((double) ((UINT64CONST(1) << 52) - 1)) * fseed; + + pg_prng_seed(state, (uint64) seed); +} + +/* + * Validate a PRNG seed value. + */ +bool +pg_prng_seed_check(pg_prng_state *state) +{ + /* + * If the seeding mechanism chanced to produce all-zeroes, insert + * something nonzero. Anything would do; use Knuth's LCG parameters. + */ + if (unlikely(state->s0 == 0 && state->s1 == 0)) + { + state->s0 = UINT64CONST(0x5851F42D4C957F2D); + state->s1 = UINT64CONST(0x14057B7EF767814F); + } + + /* As a convenience for the pg_prng_strong_seed macro, return true */ + return true; +} + +/* + * Select a random uint64 uniformly from the range [0, PG_UINT64_MAX]. + */ +uint64 +pg_prng_uint64(pg_prng_state *state) +{ + return xoroshiro128ss(state); +} + +/* + * Select a random uint64 uniformly from the range [rmin, rmax]. + * If the range is empty, rmin is always produced. + */ +uint64 +pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax) +{ + uint64 val; + + if (likely(rmax > rmin)) + { + /* + * Use bitmask rejection method to generate an offset in 0..range. + * Each generated val is less than twice "range", so on average we + * should not have to iterate more than twice. + */ + uint64 range = rmax - rmin; + uint32 rshift = 63 - pg_leftmost_one_pos64(range); + + do + { + val = xoroshiro128ss(state) >> rshift; + } while (val > range); + } + else + val = 0; + + return rmin + val; +} + +/* + * Select a random int64 uniformly from the range [PG_INT64_MIN, PG_INT64_MAX]. + */ +int64 +pg_prng_int64(pg_prng_state *state) +{ + return (int64) xoroshiro128ss(state); +} + +/* + * Select a random int64 uniformly from the range [0, PG_INT64_MAX]. + */ +int64 +pg_prng_int64p(pg_prng_state *state) +{ + return (int64) (xoroshiro128ss(state) & UINT64CONST(0x7FFFFFFFFFFFFFFF)); +} + +/* + * Select a random uint32 uniformly from the range [0, PG_UINT32_MAX]. + */ +uint32 +pg_prng_uint32(pg_prng_state *state) +{ + /* + * Although xoroshiro128** is not known to have any weaknesses in + * randomness of low-order bits, we prefer to use the upper bits of its + * result here and below. + */ + uint64 v = xoroshiro128ss(state); + + return (uint32) (v >> 32); +} + +/* + * Select a random int32 uniformly from the range [PG_INT32_MIN, PG_INT32_MAX]. + */ +int32 +pg_prng_int32(pg_prng_state *state) +{ + uint64 v = xoroshiro128ss(state); + + return (int32) (v >> 32); +} + +/* + * Select a random int32 uniformly from the range [0, PG_INT32_MAX]. + */ +int32 +pg_prng_int32p(pg_prng_state *state) +{ + uint64 v = xoroshiro128ss(state); + + return (int32) (v >> 33); +} + +/* + * Select a random double uniformly from the range [0.0, 1.0). + * + * Note: if you want a result in the range (0.0, 1.0], the standard way + * to get that is "1.0 - pg_prng_double(state)". + */ +double +pg_prng_double(pg_prng_state *state) +{ + uint64 v = xoroshiro128ss(state); + + /* + * As above, assume there's 52 mantissa bits in a double. This result + * could round to 1.0 if double's precision is less than that; but we + * assume IEEE float arithmetic elsewhere in Postgres, so this seems OK. + */ + return ldexp((double) (v >> (64 - 52)), -52); +} + +/* + * Select a random boolean value. + */ +bool +pg_prng_bool(pg_prng_state *state) +{ + uint64 v = xoroshiro128ss(state); + + return (bool) (v >> 63); +} diff --git a/third_party/spanner_pg/src/common/pgfnames.c b/third_party/spanner_pg/src/common/pgfnames.c index 395927c9..d4be4f18 100644 --- a/third_party/spanner_pg/src/common/pgfnames.c +++ b/third_party/spanner_pg/src/common/pgfnames.c @@ -3,7 +3,7 @@ * pgfnames.c * directory handling functions * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/protocol_openssl.c b/third_party/spanner_pg/src/common/protocol_openssl.c index 92a0a22e..8d1da8be 100644 --- a/third_party/spanner_pg/src/common/protocol_openssl.c +++ b/third_party/spanner_pg/src/common/protocol_openssl.c @@ -5,7 +5,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/psprintf.c b/third_party/spanner_pg/src/common/psprintf.c index eba935cc..9aabaeed 100644 --- a/third_party/spanner_pg/src/common/psprintf.c +++ b/third_party/spanner_pg/src/common/psprintf.c @@ -4,7 +4,7 @@ * sprintf into an allocated-on-demand buffer * * - * 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/third_party/spanner_pg/src/common/relpath.c b/third_party/spanner_pg/src/common/relpath.c index 1f5c426e..636c96ef 100644 --- a/third_party/spanner_pg/src/common/relpath.c +++ b/third_party/spanner_pg/src/common/relpath.c @@ -4,7 +4,7 @@ * * This module also contains some logic associated with fork names. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/restricted_token.c b/third_party/spanner_pg/src/common/restricted_token.c index 667040d7..82b74b56 100644 --- a/third_party/spanner_pg/src/common/restricted_token.c +++ b/third_party/spanner_pg/src/common/restricted_token.c @@ -4,7 +4,7 @@ * helper routine to ensure restricted token on Windows * * - * 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 * * @@ -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/third_party/spanner_pg/src/common/rmtree.c b/third_party/spanner_pg/src/common/rmtree.c index e090a85f..221d0e20 100644 --- a/third_party/spanner_pg/src/common/rmtree.c +++ b/third_party/spanner_pg/src/common/rmtree.c @@ -2,7 +2,7 @@ * * rmtree.c * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/ryu_common.h b/third_party/spanner_pg/src/common/ryu_common.h index 34b1e36e..404e6a66 100644 --- a/third_party/spanner_pg/src/common/ryu_common.h +++ b/third_party/spanner_pg/src/common/ryu_common.h @@ -2,7 +2,7 @@ * * Common routines for Ryu floating-point output. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/ryu_common.h diff --git a/third_party/spanner_pg/src/common/saslprep.c b/third_party/spanner_pg/src/common/saslprep.c index 8945050a..6aaba8e4 100644 --- a/third_party/spanner_pg/src/common/saslprep.c +++ b/third_party/spanner_pg/src/common/saslprep.c @@ -12,7 +12,7 @@ * http://www.ietf.org/rfc/rfc4013.txt * * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/saslprep.c diff --git a/third_party/spanner_pg/src/common/scram-common.c b/third_party/spanner_pg/src/common/scram-common.c index 69a96f65..12686259 100644 --- a/third_party/spanner_pg/src/common/scram-common.c +++ b/third_party/spanner_pg/src/common/scram-common.c @@ -6,7 +6,7 @@ * backend, for implement the Salted Challenge Response Authentication * Mechanism (SCRAM), per IETF's RFC 5802. * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/scram-common.c @@ -28,12 +28,13 @@ * Calculate SaltedPassword. * * The password should already be normalized by SASLprep. Returns 0 on - * success, -1 on failure. + * success, -1 on failure with *errstr pointing to a message about the + * error details. */ int scram_SaltedPassword(const char *password, const char *salt, int saltlen, int iterations, - uint8 *result) + uint8 *result, const char **errstr) { int password_len = strlen(password); uint32 one = pg_hton32(1); @@ -44,7 +45,10 @@ scram_SaltedPassword(const char *password, pg_hmac_ctx *hmac_ctx = pg_hmac_create(PG_SHA256); if (hmac_ctx == NULL) + { + *errstr = pg_hmac_error(NULL); /* returns OOM */ return -1; + } /* * Iterate hash calculation of HMAC entry using given salt. This is @@ -58,6 +62,7 @@ scram_SaltedPassword(const char *password, pg_hmac_update(hmac_ctx, (uint8 *) &one, sizeof(uint32)) < 0 || pg_hmac_final(hmac_ctx, Ui_prev, sizeof(Ui_prev)) < 0) { + *errstr = pg_hmac_error(hmac_ctx); pg_hmac_free(hmac_ctx); return -1; } @@ -71,6 +76,7 @@ scram_SaltedPassword(const char *password, pg_hmac_update(hmac_ctx, (uint8 *) Ui_prev, SCRAM_KEY_LEN) < 0 || pg_hmac_final(hmac_ctx, Ui, sizeof(Ui)) < 0) { + *errstr = pg_hmac_error(hmac_ctx); pg_hmac_free(hmac_ctx); return -1; } @@ -87,21 +93,26 @@ scram_SaltedPassword(const char *password, /* * Calculate SHA-256 hash for a NULL-terminated string. (The NULL terminator is - * not included in the hash). Returns 0 on success, -1 on failure. + * not included in the hash). Returns 0 on success, -1 on failure with *errstr + * pointing to a message about the error details. */ int -scram_H(const uint8 *input, int len, uint8 *result) +scram_H(const uint8 *input, int len, uint8 *result, const char **errstr) { pg_cryptohash_ctx *ctx; ctx = pg_cryptohash_create(PG_SHA256); if (ctx == NULL) + { + *errstr = pg_cryptohash_error(NULL); /* returns OOM */ return -1; + } if (pg_cryptohash_init(ctx) < 0 || pg_cryptohash_update(ctx, input, len) < 0 || pg_cryptohash_final(ctx, result, SCRAM_KEY_LEN) < 0) { + *errstr = pg_cryptohash_error(ctx); pg_cryptohash_free(ctx); return -1; } @@ -111,20 +122,26 @@ scram_H(const uint8 *input, int len, uint8 *result) } /* - * Calculate ClientKey. Returns 0 on success, -1 on failure. + * Calculate ClientKey. Returns 0 on success, -1 on failure with *errstr + * pointing to a message about the error details. */ int -scram_ClientKey(const uint8 *salted_password, uint8 *result) +scram_ClientKey(const uint8 *salted_password, uint8 *result, + const char **errstr) { pg_hmac_ctx *ctx = pg_hmac_create(PG_SHA256); if (ctx == NULL) + { + *errstr = pg_hmac_error(NULL); /* returns OOM */ return -1; + } if (pg_hmac_init(ctx, salted_password, SCRAM_KEY_LEN) < 0 || pg_hmac_update(ctx, (uint8 *) "Client Key", strlen("Client Key")) < 0 || pg_hmac_final(ctx, result, SCRAM_KEY_LEN) < 0) { + *errstr = pg_hmac_error(ctx); pg_hmac_free(ctx); return -1; } @@ -134,20 +151,26 @@ scram_ClientKey(const uint8 *salted_password, uint8 *result) } /* - * Calculate ServerKey. Returns 0 on success, -1 on failure. + * Calculate ServerKey. Returns 0 on success, -1 on failure with *errstr + * pointing to a message about the error details. */ int -scram_ServerKey(const uint8 *salted_password, uint8 *result) +scram_ServerKey(const uint8 *salted_password, uint8 *result, + const char **errstr) { pg_hmac_ctx *ctx = pg_hmac_create(PG_SHA256); if (ctx == NULL) + { + *errstr = pg_hmac_error(NULL); /* returns OOM */ return -1; + } if (pg_hmac_init(ctx, salted_password, SCRAM_KEY_LEN) < 0 || pg_hmac_update(ctx, (uint8 *) "Server Key", strlen("Server Key")) < 0 || pg_hmac_final(ctx, result, SCRAM_KEY_LEN) < 0) { + *errstr = pg_hmac_error(ctx); pg_hmac_free(ctx); return -1; } @@ -164,10 +187,13 @@ scram_ServerKey(const uint8 *salted_password, uint8 *result) * * If iterations is 0, default number of iterations is used. The result is * palloc'd or malloc'd, so caller is responsible for freeing it. + * + * On error, returns NULL and sets *errstr to point to a message about the + * error details. */ char * scram_build_secret(const char *salt, int saltlen, int iterations, - const char *password) + const char *password, const char **errstr) { uint8 salted_password[SCRAM_KEY_LEN]; uint8 stored_key[SCRAM_KEY_LEN]; @@ -185,15 +211,17 @@ scram_build_secret(const char *salt, int saltlen, int iterations, /* Calculate StoredKey and ServerKey */ if (scram_SaltedPassword(password, salt, saltlen, iterations, - salted_password) < 0 || - scram_ClientKey(salted_password, stored_key) < 0 || - scram_H(stored_key, SCRAM_KEY_LEN, stored_key) < 0 || - scram_ServerKey(salted_password, server_key) < 0) + salted_password, errstr) < 0 || + scram_ClientKey(salted_password, stored_key, errstr) < 0 || + scram_H(stored_key, SCRAM_KEY_LEN, stored_key, errstr) < 0 || + scram_ServerKey(salted_password, server_key, errstr) < 0) { + /* errstr is filled already here */ #ifdef FRONTEND return NULL; #else - elog(ERROR, "could not calculate stored key and server key"); + elog(ERROR, "could not calculate stored key and server key: %s", + *errstr); #endif } @@ -215,7 +243,10 @@ scram_build_secret(const char *salt, int saltlen, int iterations, #ifdef FRONTEND result = malloc(maxlen); if (!result) + { + *errstr = _("out of memory"); return NULL; + } #else result = palloc(maxlen); #endif @@ -226,11 +257,12 @@ scram_build_secret(const char *salt, int saltlen, int iterations, encoded_result = pg_b64_encode(salt, saltlen, p, encoded_salt_len); if (encoded_result < 0) { + *errstr = _("could not encode salt"); #ifdef FRONTEND free(result); return NULL; #else - elog(ERROR, "could not encode salt"); + elog(ERROR, "%s", *errstr); #endif } p += encoded_result; @@ -241,11 +273,12 @@ scram_build_secret(const char *salt, int saltlen, int iterations, encoded_stored_len); if (encoded_result < 0) { + *errstr = _("could not encode stored key"); #ifdef FRONTEND free(result); return NULL; #else - elog(ERROR, "could not encode stored key"); + elog(ERROR, "%s", *errstr); #endif } @@ -257,11 +290,12 @@ scram_build_secret(const char *salt, int saltlen, int iterations, encoded_server_len); if (encoded_result < 0) { + *errstr = _("could not encode server key"); #ifdef FRONTEND free(result); return NULL; #else - elog(ERROR, "could not encode server key"); + elog(ERROR, "%s", *errstr); #endif } diff --git a/third_party/spanner_pg/src/common/sha1.c b/third_party/spanner_pg/src/common/sha1.c index b39173b3..ee7ea812 100644 --- a/third_party/spanner_pg/src/common/sha1.c +++ b/third_party/spanner_pg/src/common/sha1.c @@ -5,7 +5,7 @@ * * Fallback implementation of SHA1, as specified in RFC 3174. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/sha1_int.h b/third_party/spanner_pg/src/common/sha1_int.h index 1929a2a6..10ecca65 100644 --- a/third_party/spanner_pg/src/common/sha1_int.h +++ b/third_party/spanner_pg/src/common/sha1_int.h @@ -3,7 +3,7 @@ * sha1_int.h * Internal headers for fallback implementation of SHA1 * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/sha2.c b/third_party/spanner_pg/src/common/sha2.c index ae4936b1..f1dcd330 100644 --- a/third_party/spanner_pg/src/common/sha2.c +++ b/third_party/spanner_pg/src/common/sha2.c @@ -6,7 +6,7 @@ * This includes the fallback implementation for SHA2 cryptographic * hashes. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/sha2_int.h b/third_party/spanner_pg/src/common/sha2_int.h index c6d56423..c29744b4 100644 --- a/third_party/spanner_pg/src/common/sha2_int.h +++ b/third_party/spanner_pg/src/common/sha2_int.h @@ -3,7 +3,7 @@ * sha2_int.h * Internal headers for fallback implementation of SHA{224,256,384,512} * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/sha2_int.h diff --git a/third_party/spanner_pg/src/common/sprompt.c b/third_party/spanner_pg/src/common/sprompt.c index f3a891a2..8b836846 100644 --- a/third_party/spanner_pg/src/common/sprompt.c +++ b/third_party/spanner_pg/src/common/sprompt.c @@ -3,7 +3,7 @@ * sprompt.c * simple_prompt() routine * - * 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 * * @@ -36,6 +36,22 @@ */ char * simple_prompt(const char *prompt, bool echo) +{ + return simple_prompt_extended(prompt, echo, NULL); +} + +/* + * simple_prompt_extended + * + * This is the same as simple_prompt(), except that prompt_ctx can + * optionally be provided to allow this function to be canceled via an + * existing SIGINT signal handler that will longjmp to the specified place + * only when *(prompt_ctx->enabled) is true. If canceled, this function + * returns an empty string, and prompt_ctx->canceled is set to true. + */ +char * +simple_prompt_extended(const char *prompt, bool echo, + PromptInterruptContext *prompt_ctx) { char *result; FILE *termin, @@ -126,7 +142,7 @@ simple_prompt(const char *prompt, bool echo) fflush(termout); } - result = pg_get_line(termin); + result = pg_get_line(termin, prompt_ctx); /* If we failed to read anything, just return an empty string */ if (result == NULL) @@ -148,6 +164,12 @@ simple_prompt(const char *prompt, bool echo) fflush(termout); #endif } + else if (prompt_ctx && prompt_ctx->canceled) + { + /* also echo \n if prompt was canceled */ + fputs("\n", termout); + fflush(termout); + } if (termin != stdin) { diff --git a/third_party/spanner_pg/src/common/string.c b/third_party/spanner_pg/src/common/string.c index 3aa378c0..16940d1f 100644 --- a/third_party/spanner_pg/src/common/string.c +++ b/third_party/spanner_pg/src/common/string.c @@ -4,7 +4,7 @@ * string handling helpers * * - * 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/third_party/spanner_pg/src/common/stringinfo.c b/third_party/spanner_pg/src/common/stringinfo.c index 445f7222..76ff4d3e 100644 --- a/third_party/spanner_pg/src/common/stringinfo.c +++ b/third_party/spanner_pg/src/common/stringinfo.c @@ -7,7 +7,7 @@ * (null-terminated text) or arbitrary binary data. All storage is allocated * with palloc() (falling back to malloc in frontend code). * - * 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 * * src/common/stringinfo.c diff --git a/third_party/spanner_pg/src/common/unicode/.gitignore b/third_party/spanner_pg/src/common/unicode/.gitignore index 5e583e2c..b309035a 100644 --- a/third_party/spanner_pg/src/common/unicode/.gitignore +++ b/third_party/spanner_pg/src/common/unicode/.gitignore @@ -3,5 +3,6 @@ # Files downloaded from the Unicode Character Database /CompositionExclusions.txt +/EastAsianWidth.txt /NormalizationTest.txt /UnicodeData.txt diff --git a/third_party/spanner_pg/src/common/unicode/Makefile b/third_party/spanner_pg/src/common/unicode/Makefile index eb14add2..60e01e74 100644 --- a/third_party/spanner_pg/src/common/unicode/Makefile +++ b/third_party/spanner_pg/src/common/unicode/Makefile @@ -12,20 +12,20 @@ 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_normprops_table.h unicode_norm_hashfunc.h - mv $^ ../../../src/include/common/ +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 $^ $(top_srcdir)/src/include/common/ $(MAKE) normalization-check # These files are part of the Unicode Character Database. Download # them on demand. The dependency on Makefile.global is for # UNICODE_VERSION. -UnicodeData.txt DerivedNormalizationProps.txt CompositionExclusions.txt NormalizationTest.txt: $(top_builddir)/src/Makefile.global +UnicodeData.txt EastAsianWidth.txt DerivedNormalizationProps.txt CompositionExclusions.txt NormalizationTest.txt: $(top_builddir)/src/Makefile.global $(DOWNLOAD) https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/$(@F) # Generation of conversion tables used for string normalization with @@ -33,11 +33,14 @@ UnicodeData.txt DerivedNormalizationProps.txt CompositionExclusions.txt Normaliz 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) $^ >$@ +unicode_east_asian_fw_table.h: generate-unicode_east_asian_fw_table.pl EastAsianWidth.txt + $(PERL) $^ >$@ + unicode_normprops_table.h: generate-unicode_normprops_table.pl DerivedNormalizationProps.txt $(PERL) $^ >$@ @@ -55,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 @@ -64,6 +67,6 @@ clean: rm -f $(OBJS) norm_test norm_test.o distclean: clean - rm -f UnicodeData.txt CompositionExclusions.txt NormalizationTest.txt norm_test_table.h unicode_norm_table.h + rm -f UnicodeData.txt EastAsianWidth.txt CompositionExclusions.txt NormalizationTest.txt norm_test_table.h unicode_norm_table.h maintainer-clean: distclean diff --git a/third_party/spanner_pg/src/common/unicode/generate-norm_test_table.pl b/third_party/spanner_pg/src/common/unicode/generate-norm_test_table.pl index 844ff084..838f5529 100644 --- a/third_party/spanner_pg/src/common/unicode/generate-norm_test_table.pl +++ b/third_party/spanner_pg/src/common/unicode/generate-norm_test_table.pl @@ -5,7 +5,7 @@ # # NormalizationTest.txt is part of the Unicode Character Database. # -# Copyright (c) 2000-2021, PostgreSQL Global Development Group +# Copyright (c) 2000-2022, PostgreSQL Global Development Group use strict; use warnings; @@ -30,7 +30,7 @@ * norm_test_table.h * Test strings for Unicode normalization. * - * 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 * * src/common/unicode/norm_test_table.h diff --git a/third_party/spanner_pg/src/common/unicode/generate-unicode_combining_table.pl b/third_party/spanner_pg/src/common/unicode/generate-unicode_combining_table.pl index 86aed789..8177c202 100644 --- a/third_party/spanner_pg/src/common/unicode/generate-unicode_combining_table.pl +++ b/third_party/spanner_pg/src/common/unicode/generate-unicode_combining_table.pl @@ -4,7 +4,7 @@ # characters, using Unicode data files as input. Pass UnicodeData.txt # as argument. The output is on stdout. # -# Copyright (c) 2019-2021, PostgreSQL Global Development Group +# Copyright (c) 2019-2022, PostgreSQL Global Development Group use strict; use warnings; @@ -25,8 +25,6 @@ my @fields = split ';', $line; $codepoint = hex $fields[0]; - next if $codepoint > 0xFFFF; - if ($fields[2] eq 'Me' || $fields[2] eq 'Mn') { # combining character, save for start of range diff --git a/third_party/spanner_pg/src/common/unicode/generate-unicode_east_asian_fw_table.pl b/third_party/spanner_pg/src/common/unicode/generate-unicode_east_asian_fw_table.pl new file mode 100644 index 00000000..9d03684c --- /dev/null +++ b/third_party/spanner_pg/src/common/unicode/generate-unicode_east_asian_fw_table.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl +# +# Generate a sorted list of non-overlapping intervals of East Asian Wide (W) +# and East Asian Fullwidth (F) characters, using Unicode data files as input. +# Pass EastAsianWidth.txt as argument. The output is on stdout. +# +# Copyright (c) 2019-2022, PostgreSQL Global Development Group + +use strict; +use warnings; + +my $range_start = undef; +my ($first, $last); +my $prev_last; + +print + "/* generated by src/common/unicode/generate-unicode_east_asian_fw_table.pl, do not edit */\n\n"; + +print "static const struct mbinterval east_asian_fw[] = {\n"; + +foreach my $line () +{ + chomp $line; + $line =~ s/\s*#.*$//; + next if $line eq ''; + my ($codepoint, $width) = split ';', $line; + + if ($codepoint =~ /\.\./) + { + ($first, $last) = split /\.\./, $codepoint; + } + else + { + $first = $last = $codepoint; + } + + ($first, $last) = map(hex, ($first, $last)); + + if ($width eq 'F' || $width eq 'W') + { + # fullwidth/wide characters + if (!defined($range_start)) + { + # save for start of range if one hasn't been started yet + $range_start = $first; + } + elsif ($first != $prev_last + 1) + { + # ranges aren't contiguous; emit the last and start a new one + printf "\t{0x%04X, 0x%04X},\n", $range_start, $prev_last; + $range_start = $first; + } + } + else + { + # not wide characters, print out previous range if any + if (defined($range_start)) + { + printf "\t{0x%04X, 0x%04X},\n", $range_start, $prev_last; + $range_start = undef; + } + } +} +continue +{ + $prev_last = $last; +} + +# don't forget any ranges at the very end of the database (though there are none +# as of Unicode 13.0) +if (defined($range_start)) +{ + printf "\t{0x%04X, 0x%04X},\n", $range_start, $prev_last; +} + +print "};\n"; diff --git a/third_party/spanner_pg/src/common/unicode/generate-unicode_norm_table.pl b/third_party/spanner_pg/src/common/unicode/generate-unicode_norm_table.pl index 114ab30d..e4423455 100644 --- a/third_party/spanner_pg/src/common/unicode/generate-unicode_norm_table.pl +++ b/third_party/spanner_pg/src/common/unicode/generate-unicode_norm_table.pl @@ -6,7 +6,7 @@ # Input: UnicodeData.txt and CompositionExclusions.txt # Output: unicode_norm_table.h and unicode_norm_hashfunc.h # -# Copyright (c) 2000-2021, PostgreSQL Global Development Group +# Copyright (c) 2000-2022, PostgreSQL Global Development Group use strict; use warnings; @@ -82,7 +82,7 @@ * unicode_norm_table.h * Composition table used for Unicode normalization * - * 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 * * src/include/common/unicode_norm_table.h @@ -125,7 +125,7 @@ * unicode_norm_hashfunc.h * Perfect hash functions used for Unicode normalization * - * 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 * * src/include/common/unicode_norm_hashfunc.h diff --git a/third_party/spanner_pg/src/common/unicode/generate-unicode_normprops_table.pl b/third_party/spanner_pg/src/common/unicode/generate-unicode_normprops_table.pl index c7795d17..08e41b35 100644 --- a/third_party/spanner_pg/src/common/unicode/generate-unicode_normprops_table.pl +++ b/third_party/spanner_pg/src/common/unicode/generate-unicode_normprops_table.pl @@ -4,7 +4,7 @@ # (see UAX #15). Pass DerivedNormalizationProps.txt as argument. The # output is on stdout. # -# Copyright (c) 2020-2021, PostgreSQL Global Development Group +# Copyright (c) 2020-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/common/unicode/norm_test.c b/third_party/spanner_pg/src/common/unicode/norm_test.c index cd2cb297..0e244ad6 100644 --- a/third_party/spanner_pg/src/common/unicode/norm_test.c +++ b/third_party/spanner_pg/src/common/unicode/norm_test.c @@ -2,7 +2,7 @@ * norm_test.c * Program to test Unicode normalization functions. * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/unicode/norm_test.c diff --git a/third_party/spanner_pg/src/common/unicode_norm.c b/third_party/spanner_pg/src/common/unicode_norm.c index 06bf921e..8f1402e4 100644 --- a/third_party/spanner_pg/src/common/unicode_norm.c +++ b/third_party/spanner_pg/src/common/unicode_norm.c @@ -5,7 +5,7 @@ * This implements Unicode normalization, per the documentation at * https://www.unicode.org/reports/tr15/. * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/unicode_norm.c diff --git a/third_party/spanner_pg/src/common/username.c b/third_party/spanner_pg/src/common/username.c index 669b8ab3..b226b550 100644 --- a/third_party/spanner_pg/src/common/username.c +++ b/third_party/spanner_pg/src/common/username.c @@ -3,7 +3,7 @@ * username.c * get user name * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/common/wait_error.c b/third_party/spanner_pg/src/common/wait_error.c index 9f860eef..a776f290 100644 --- a/third_party/spanner_pg/src/common/wait_error.c +++ b/third_party/spanner_pg/src/common/wait_error.c @@ -4,7 +4,7 @@ * Convert a wait/waitpid(2) result code to a human-readable string * * - * 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/third_party/spanner_pg/src/common/wchar.c b/third_party/spanner_pg/src/common/wchar.c index 0636b876..ea46192e 100644 --- a/third_party/spanner_pg/src/common/wchar.c +++ b/third_party/spanner_pg/src/common/wchar.c @@ -3,7 +3,7 @@ * wchar.c * Functions for working with multibyte characters in various encodings. * - * Portions Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1998-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/wchar.c @@ -13,6 +13,7 @@ #include "c.h" #include "mb/pg_wchar.h" +#include "utils/ascii.h" /* @@ -583,8 +584,8 @@ pg_utf_mblen(const unsigned char *s) struct mbinterval { - unsigned short first; - unsigned short last; + unsigned int first; + unsigned int last; }; /* auxiliary function for binary search in interval table */ @@ -623,12 +624,6 @@ mbbisearch(pg_wchar ucs, const struct mbinterval *table, int max) * category code Mn or Me in the Unicode database) have a * column width of 0. * - * - Other format characters (general category code Cf in the Unicode - * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. - * - * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) - * have a column width of 0. - * * - Spacing characters in the East Asian Wide (W) or East Asian * FullWidth (F) category as defined in Unicode Technical * Report #11 have a column width of 2. @@ -645,6 +640,7 @@ static int ucs_wcwidth(pg_wchar ucs) { #include "common/unicode_combining_table.h" +#include "common/unicode_east_asian_fw_table.h" /* test for 8-bit control characters */ if (ucs == 0) @@ -653,27 +649,25 @@ ucs_wcwidth(pg_wchar ucs) if (ucs < 0x20 || (ucs >= 0x7f && ucs < 0xa0) || ucs > 0x0010ffff) return -1; - /* binary search in table of non-spacing characters */ + /* + * binary search in table of non-spacing characters + * + * XXX: In the official Unicode sources, it is possible for a character to + * be described as both non-spacing and wide at the same time. As of + * Unicode 13.0, treating the non-spacing property as the determining + * factor for display width leads to the correct behavior, so do that + * search first. + */ if (mbbisearch(ucs, combining, sizeof(combining) / sizeof(struct mbinterval) - 1)) return 0; - /* - * if we arrive here, ucs is not a combining or C0/C1 control character - */ + /* binary search in table of wide characters */ + if (mbbisearch(ucs, east_asian_fw, + sizeof(east_asian_fw) / sizeof(struct mbinterval) - 1)) + return 2; - return 1 + - (ucs >= 0x1100 && - (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && - ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility - * Ideographs */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) || - (ucs >= 0x20000 && ucs <= 0x2ffff))); + return 1; } /* @@ -1757,11 +1751,226 @@ pg_utf8_verifychar(const unsigned char *s, int len) return l; } +/* + * The fast path of the UTF-8 verifier uses a deterministic finite automaton + * (DFA) for multibyte characters. In a traditional table-driven DFA, the + * input byte and current state are used to compute an index into an array of + * state transitions. Since the address of the next transition is dependent + * on this computation, there is latency in executing the load instruction, + * and the CPU is not kept busy. + * + * Instead, we use a "shift-based" DFA as described by Per Vognsen: + * + * https://gist.github.com/pervognsen/218ea17743e1442e59bb60d29b1aa725 + * + * In a shift-based DFA, the input byte is an index into array of integers + * whose bit pattern encodes the state transitions. To compute the next + * state, we simply right-shift the integer by the current state and apply a + * mask. In this scheme, the address of the transition only depends on the + * input byte, so there is better pipelining. + * + * The naming convention for states and transitions was adopted from a UTF-8 + * to UTF-16/32 transcoder, whose table is reproduced below: + * + * https://github.com/BobSteagall/utf_utils/blob/6b7a465265de2f5fa6133d653df0c9bdd73bbcf8/src/utf_utils.cpp + * + * ILL ASC CR1 CR2 CR3 L2A L3A L3B L3C L4A L4B L4C CLASS / STATE + * ========================================================================== + * err, END, err, err, err, CS1, P3A, CS2, P3B, P4A, CS3, P4B, | BGN/END + * err, err, err, err, err, err, err, err, err, err, err, err, | ERR + * | + * err, err, END, END, END, err, err, err, err, err, err, err, | CS1 + * err, err, CS1, CS1, CS1, err, err, err, err, err, err, err, | CS2 + * err, err, CS2, CS2, CS2, err, err, err, err, err, err, err, | CS3 + * | + * err, err, err, err, CS1, err, err, err, err, err, err, err, | P3A + * err, err, CS1, CS1, err, err, err, err, err, err, err, err, | P3B + * | + * err, err, err, CS2, CS2, err, err, err, err, err, err, err, | P4A + * err, err, CS2, err, err, err, err, err, err, err, err, err, | P4B + * + * In the most straightforward implementation, a shift-based DFA for UTF-8 + * requires 64-bit integers to encode the transitions, but with an SMT solver + * it's possible to find state numbers such that the transitions fit within + * 32-bit integers, as Dougall Johnson demonstrated: + * + * https://gist.github.com/dougallj/166e326de6ad4cf2c94be97a204c025f + * + * This packed representation is the reason for the seemingly odd choice of + * state values below. + */ + +/* Error */ +#define ERR 0 +/* Begin */ +#define BGN 11 +/* Continuation states, expect 1/2/3 continuation bytes */ +#define CS1 16 +#define CS2 1 +#define CS3 5 +/* Partial states, where the first continuation byte has a restricted range */ +#define P3A 6 /* Lead was E0, check for 3-byte overlong */ +#define P3B 20 /* Lead was ED, check for surrogate */ +#define P4A 25 /* Lead was F0, check for 4-byte overlong */ +#define P4B 30 /* Lead was F4, check for too-large */ +/* Begin and End are the same state */ +#define END BGN + +/* the encoded state transitions for the lookup table */ + +/* ASCII */ +#define ASC (END << BGN) +/* 2-byte lead */ +#define L2A (CS1 << BGN) +/* 3-byte lead */ +#define L3A (P3A << BGN) +#define L3B (CS2 << BGN) +#define L3C (P3B << BGN) +/* 4-byte lead */ +#define L4A (P4A << BGN) +#define L4B (CS3 << BGN) +#define L4C (P4B << BGN) +/* continuation byte */ +#define CR1 (END << CS1) | (CS1 << CS2) | (CS2 << CS3) | (CS1 << P3B) | (CS2 << P4B) +#define CR2 (END << CS1) | (CS1 << CS2) | (CS2 << CS3) | (CS1 << P3B) | (CS2 << P4A) +#define CR3 (END << CS1) | (CS1 << CS2) | (CS2 << CS3) | (CS1 << P3A) | (CS2 << P4A) +/* invalid byte */ +#define ILL ERR + +static const uint32 Utf8Transition[256] = +{ + /* ASCII */ + + ILL, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, + + /* continuation bytes */ + + /* 80..8F */ + CR1, CR1, CR1, CR1, CR1, CR1, CR1, CR1, + CR1, CR1, CR1, CR1, CR1, CR1, CR1, CR1, + + /* 90..9F */ + CR2, CR2, CR2, CR2, CR2, CR2, CR2, CR2, + CR2, CR2, CR2, CR2, CR2, CR2, CR2, CR2, + + /* A0..BF */ + CR3, CR3, CR3, CR3, CR3, CR3, CR3, CR3, + CR3, CR3, CR3, CR3, CR3, CR3, CR3, CR3, + CR3, CR3, CR3, CR3, CR3, CR3, CR3, CR3, + CR3, CR3, CR3, CR3, CR3, CR3, CR3, CR3, + + /* leading bytes */ + + /* C0..DF */ + ILL, ILL, L2A, L2A, L2A, L2A, L2A, L2A, + L2A, L2A, L2A, L2A, L2A, L2A, L2A, L2A, + L2A, L2A, L2A, L2A, L2A, L2A, L2A, L2A, + L2A, L2A, L2A, L2A, L2A, L2A, L2A, L2A, + + /* E0..EF */ + L3A, L3B, L3B, L3B, L3B, L3B, L3B, L3B, + L3B, L3B, L3B, L3B, L3B, L3C, L3B, L3B, + + /* F0..FF */ + L4A, L4B, L4B, L4B, L4C, ILL, ILL, ILL, + ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL +}; + +static void +utf8_advance(const unsigned char *s, uint32 *state, int len) +{ + /* Note: We deliberately don't check the state's value here. */ + while (len > 0) + { + /* + * It's important that the mask value is 31: In most instruction sets, + * a shift by a 32-bit operand is understood to be a shift by its mod + * 32, so the compiler should elide the mask operation. + */ + *state = Utf8Transition[*s++] >> (*state & 31); + len--; + } + + *state &= 31; +} + static int pg_utf8_verifystr(const unsigned char *s, int len) { const unsigned char *start = s; + const int orig_len = len; + uint32 state = BGN; + +/* + * Sixteen seems to give the best balance of performance across different + * byte distributions. + */ +#define STRIDE_LENGTH 16 + + if (len >= STRIDE_LENGTH) + { + while (len >= STRIDE_LENGTH) + { + /* + * If the chunk is all ASCII, we can skip the full UTF-8 check, + * but we must first check for a non-END state, which means the + * previous chunk ended in the middle of a multibyte sequence. + */ + if (state != END || !is_valid_ascii(s, STRIDE_LENGTH)) + utf8_advance(s, &state, STRIDE_LENGTH); + + s += STRIDE_LENGTH; + len -= STRIDE_LENGTH; + } + + /* The error state persists, so we only need to check for it here. */ + if (state == ERR) + { + /* + * Start over from the beginning with the slow path so we can + * count the valid bytes. + */ + len = orig_len; + s = start; + } + else if (state != END) + { + /* + * The fast path exited in the middle of a multibyte sequence. + * Walk backwards to find the leading byte so that the slow path + * can resume checking from there. We must always backtrack at + * least one byte, since the current byte could be e.g. an ASCII + * byte after a 2-byte lead, which is invalid. + */ + do + { + Assert(s > start); + s--; + len++; + Assert(IS_HIGHBIT_SET(*s)); + } while (pg_utf_mblen(s) <= 1); + } + } + /* check remaining bytes */ while (len > 0) { int l; diff --git a/third_party/spanner_pg/src/fe_utils/Makefile b/third_party/spanner_pg/src/fe_utils/Makefile index 456c441a..44bc7a12 100644 --- a/third_party/spanner_pg/src/fe_utils/Makefile +++ b/third_party/spanner_pg/src/fe_utils/Makefile @@ -5,7 +5,7 @@ # This makefile generates a static library, libpgfeutils.a, # for use by client applications # -# 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 # # IDENTIFICATION diff --git a/third_party/spanner_pg/src/fe_utils/archive.c b/third_party/spanner_pg/src/fe_utils/archive.c index 8baef5f0..53d42c2b 100644 --- a/third_party/spanner_pg/src/fe_utils/archive.c +++ b/third_party/spanner_pg/src/fe_utils/archive.c @@ -3,7 +3,7 @@ * archive.c * Routines to access WAL archives from frontend * - * 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 * * @@ -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/third_party/spanner_pg/src/fe_utils/cancel.c b/third_party/spanner_pg/src/fe_utils/cancel.c index 4986f3a2..d4308667 100644 --- a/third_party/spanner_pg/src/fe_utils/cancel.c +++ b/third_party/spanner_pg/src/fe_utils/cancel.c @@ -6,7 +6,7 @@ * handler for SIGINT. * * - * 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 * * src/fe-utils/cancel.c diff --git a/third_party/spanner_pg/src/fe_utils/conditional.c b/third_party/spanner_pg/src/fe_utils/conditional.c index a562e288..5a946649 100644 --- a/third_party/spanner_pg/src/fe_utils/conditional.c +++ b/third_party/spanner_pg/src/fe_utils/conditional.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * A stack of automaton states to handle nested conditionals. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/fe_utils/connect_utils.c b/third_party/spanner_pg/src/fe_utils/connect_utils.c index 96bb7983..f2e583f9 100644 --- a/third_party/spanner_pg/src/fe_utils/connect_utils.c +++ b/third_party/spanner_pg/src/fe_utils/connect_utils.c @@ -2,7 +2,7 @@ * * Facilities for frontend code to connect to and disconnect from databases. * - * 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 * * 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/third_party/spanner_pg/src/fe_utils/mbprint.c b/third_party/spanner_pg/src/fe_utils/mbprint.c index fe3faba4..067f2811 100644 --- a/third_party/spanner_pg/src/fe_utils/mbprint.c +++ b/third_party/spanner_pg/src/fe_utils/mbprint.c @@ -3,7 +3,7 @@ * Multibyte character printing support for frontend code * * - * 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 * * src/fe_utils/mbprint.c diff --git a/third_party/spanner_pg/src/fe_utils/option_utils.c b/third_party/spanner_pg/src/fe_utils/option_utils.c index e19a495d..abea8815 100644 --- a/third_party/spanner_pg/src/fe_utils/option_utils.c +++ b/third_party/spanner_pg/src/fe_utils/option_utils.c @@ -2,7 +2,7 @@ * * Command line option processing facilities for frontend code * - * 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 * * src/fe_utils/option_utils.c @@ -12,6 +12,8 @@ #include "postgres_fe.h" +#include "common/logging.h" +#include "common/string.h" #include "fe_utils/option_utils.h" /* @@ -36,3 +38,47 @@ handle_help_version_opts(int argc, char *argv[], } } } + +/* + * option_parse_int + * + * Parse integer value for an option. If the parsing is successful, returns + * true and stores the result in *result if that's given; if parsing fails, + * returns false. + */ +bool +option_parse_int(const char *optarg, const char *optname, + int min_range, int max_range, + int *result) +{ + char *endptr; + int val; + + errno = 0; + val = strtoint(optarg, &endptr, 10); + + /* + * Skip any trailing whitespace; if anything but whitespace remains before + * the terminating character, fail. + */ + while (*endptr != '\0' && isspace((unsigned char) *endptr)) + endptr++; + + if (*endptr != '\0') + { + pg_log_error("invalid value \"%s\" for option %s", + optarg, optname); + return false; + } + + if (errno == ERANGE || val < min_range || val > max_range) + { + pg_log_error("%s must be in range %d..%d", + optname, min_range, max_range); + return false; + } + + if (result) + *result = val; + return true; +} diff --git a/third_party/spanner_pg/src/fe_utils/parallel_slot.c b/third_party/spanner_pg/src/fe_utils/parallel_slot.c index 8d558064..c65de7ff 100644 --- a/third_party/spanner_pg/src/fe_utils/parallel_slot.c +++ b/third_party/spanner_pg/src/fe_utils/parallel_slot.c @@ -4,7 +4,7 @@ * Parallel support for front-end parallel database connections * * - * 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 * * src/fe_utils/parallel_slot.c @@ -316,7 +316,7 @@ connect_slot(ParallelSlotArray *sa, int slotno, const char *dbname) #ifdef WIN32 if (slotno >= FD_SETSIZE) { - pg_log_fatal("too many jobs for this platform: %d", slotno); + pg_log_error("too many jobs for this platform: %d", slotno); exit(1); } #else @@ -325,8 +325,9 @@ connect_slot(ParallelSlotArray *sa, int slotno, const char *dbname) if (fd >= FD_SETSIZE) { - pg_log_fatal("socket file descriptor out of range for select(): %d", + pg_log_error("socket file descriptor out of range for select(): %d", fd); + pg_log_error_hint("Try fewer jobs."); exit(1); } } diff --git a/third_party/spanner_pg/src/fe_utils/print.c b/third_party/spanner_pg/src/fe_utils/print.c index 2d0f78b8..fe676a97 100644 --- a/third_party/spanner_pg/src/fe_utils/print.c +++ b/third_party/spanner_pg/src/fe_utils/print.c @@ -8,7 +8,7 @@ * pager open/close functions, all that stuff came with it. * * - * 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 * * src/fe_utils/print.c @@ -140,56 +140,126 @@ typedef struct unicodeStyleFormat static const unicodeStyleFormat unicode_style = { { { - /* ─ */ + /* U+2500 Box Drawings Light Horizontal */ "\342\224\200", - /* ├╟ */ + + /*-- + * U+251C Box Drawings Light Vertical and Right, + * U+255F Box Drawings Vertical Double and Right Single + *-- + */ {"\342\224\234", "\342\225\237"}, - /* ┤╢ */ + + /*-- + * U+2524 Box Drawings Light Vertical and Left, + * U+2562 Box Drawings Vertical Double and Left Single + *-- + */ {"\342\224\244", "\342\225\242"}, }, { - /* ═ */ + /* U+2550 Box Drawings Double Horizontal */ "\342\225\220", - /* ╞╠ */ + + /*-- + * U+255E Box Drawings Vertical Single and Right Double, + * U+2560 Box Drawings Double Vertical and Right + *-- + */ {"\342\225\236", "\342\225\240"}, - /* ╡╣ */ + + /*-- + * U+2561 Box Drawings Vertical Single and Left Double, + * U+2563 Box Drawings Double Vertical and Left + *-- + */ {"\342\225\241", "\342\225\243"}, }, }, { { - /* │ */ + /* U+2502 Box Drawings Light Vertical */ "\342\224\202", - /* ┼╪ */ + + /*-- + * U+253C Box Drawings Light Vertical and Horizontal, + * U+256A Box Drawings Vertical Single and Horizontal Double + *-- + */ {"\342\224\274", "\342\225\252"}, - /* ┴╧ */ + + /*-- + * U+2534 Box Drawings Light Up and Horizontal, + * U+2567 Box Drawings Up Single and Horizontal Double + *-- + */ {"\342\224\264", "\342\225\247"}, - /* ┬╤ */ + + /*-- + * U+252C Box Drawings Light Down and Horizontal, + * U+2564 Box Drawings Down Single and Horizontal Double + *-- + */ {"\342\224\254", "\342\225\244"}, }, { - /* ║ */ + /* U+2551 Box Drawings Double Vertical */ "\342\225\221", - /* ╫╬ */ + + /*-- + * U+256B Box Drawings Vertical Double and Horizontal Single, + * U+256C Box Drawings Double Vertical and Horizontal + *-- + */ {"\342\225\253", "\342\225\254"}, - /* ╨╩ */ + + /*-- + * U+2568 Box Drawings Up Double and Horizontal Single, + * U+2569 Box Drawings Double Up and Horizontal + *-- + */ {"\342\225\250", "\342\225\251"}, - /* ╥╦ */ + + /*-- + * U+2565 Box Drawings Down Double and Horizontal Single, + * U+2566 Box Drawings Double Down and Horizontal + *-- + */ {"\342\225\245", "\342\225\246"}, }, }, { - /* └│┌─┐┘ */ + /*-- + * U+2514 Box Drawings Light Up and Right, + * U+2502 Box Drawings Light Vertical, + * U+250C Box Drawings Light Down and Right, + * U+2500 Box Drawings Light Horizontal, + * U+2510 Box Drawings Light Down and Left, + * U+2518 Box Drawings Light Up and Left + *-- + */ {"\342\224\224", "\342\224\202", "\342\224\214", "\342\224\200", "\342\224\220", "\342\224\230"}, - /* ╚║╔═╗╝ */ + + /*-- + * U+255A Box Drawings Double Up and Right, + * U+2551 Box Drawings Double Vertical, + * U+2554 Box Drawings Double Down and Right, + * U+2550 Box Drawings Double Horizontal, + * U+2557 Box Drawings Double Down and Left, + * U+255D Box Drawings Double Up and Left + *-- + */ {"\342\225\232", "\342\225\221", "\342\225\224", "\342\225\220", "\342\225\227", "\342\225\235"}, }, " ", - "\342\206\265", /* ↵ */ + /* U+21B5 Downwards Arrow with Corner Leftwards */ + "\342\206\265", " ", - "\342\206\265", /* ↵ */ - "\342\200\246", /* … */ - "\342\200\246", /* … */ + /* U+21B5 Downwards Arrow with Corner Leftwards */ + "\342\206\265", + /* U+2026 Horizontal Ellipsis */ + "\342\200\246", + "\342\200\246", true }; @@ -1103,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/third_party/spanner_pg/src/fe_utils/psqlscan.l b/third_party/spanner_pg/src/fe_utils/psqlscan.l index 0fab48a3..ae531ec2 100644 --- a/third_party/spanner_pg/src/fe_utils/psqlscan.l +++ b/third_party/spanner_pg/src/fe_utils/psqlscan.l @@ -24,7 +24,7 @@ * See psqlscan_int.h for additional commentary. * * - * 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 * * IDENTIFICATION @@ -112,7 +112,7 @@ extern void psql_yyset_column(int column_no, yyscan_t yyscanner); * bit string literal * extended C-style comments * delimited identifiers (double-quoted identifiers) - * hexadecimal numeric string + * hexadecimal byte string * standard quoted strings * quote stop (detect continued strings) * extended quoted strings (support backslash escape sequences) @@ -200,7 +200,7 @@ quotecontinuefail {whitespace}*"-"? xbstart [bB]{quote} xbinside [^']* -/* Hexadecimal number */ +/* Hexadecimal byte string */ xhstart [xX]{quote} xhinside [^']* @@ -279,7 +279,6 @@ xcstart \/\*{op_chars}* xcstop \*+\/ xcinside [^*/]+ -digit [0-9] ident_start [A-Za-z\200-\377_] ident_cont [A-Za-z\200-\377_0-9\$] @@ -318,24 +317,31 @@ self [,()\[\].;\:\+\-\*\/\%\^\<\>\=] op_chars [\~\!\@\#\^\&\|\`\?\+\-\*\/\%\<\>\=] operator {op_chars}+ -/* we no longer allow unary minus in numbers. - * instead we pass it separately to parser. there it gets - * coerced via doNegate() -- Leon aug 20 1999 +/* + * Numbers + * + * Unary minus is not part of a number here. Instead we pass it separately to + * the parser, and there it gets coerced via doNegate(). * * {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10. * - * {realfail1} and {realfail2} are added to prevent the need for scanner + * {realfail} is added to prevent the need for scanner * backup when the {real} rule fails to match completely. */ +digit [0-9] integer {digit}+ decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*)) decimalfail {digit}+\.\. real ({integer}|{decimal})[Ee][-+]?{digit}+ -realfail1 ({integer}|{decimal})[Ee] -realfail2 ({integer}|{decimal})[Ee][-+] +realfail ({integer}|{decimal})[Ee][-+] + +integer_junk {integer}{ident_start} +decimal_junk {decimal}{ident_start} +real_junk {real}{ident_start} param \${integer} +param_junk \${integer}{ident_start} /* psql-specific: characters allowed in variable names */ variable_char [A-Za-z\200-\377_0-9] @@ -376,12 +382,11 @@ other . /* * Note that the whitespace rule includes both true * whitespace and single-line ("--" style) comments. - * We suppress whitespace at the start of the query - * buffer. We also suppress all single-line comments, - * which is pretty dubious but is the historical - * behavior. + * We suppress whitespace until we have collected some + * non-whitespace data. (This interacts with some + * decisions in MainLoop(); see there for details.) */ - if (!(output_buf->len == 0 || yytext[0] == '-')) + if (output_buf->len > 0) ECHO; } @@ -838,6 +843,9 @@ other . {param} { ECHO; } +{param_junk} { + ECHO; + } {integer} { ECHO; @@ -853,18 +861,16 @@ other . {real} { ECHO; } -{realfail1} { - /* - * throw back the [Ee], and figure out whether what - * remains is an {integer} or {decimal}. - * (in psql, we don't actually care...) - */ - yyless(yyleng - 1); +{realfail} { ECHO; } -{realfail2} { - /* throw back the [Ee][+-], and proceed as above */ - yyless(yyleng - 2); +{integer_junk} { + ECHO; + } +{decimal_junk} { + ECHO; + } +{real_junk} { ECHO; } diff --git a/third_party/spanner_pg/src/fe_utils/query_utils.c b/third_party/spanner_pg/src/fe_utils/query_utils.c index d5ffe56f..2fc6e240 100644 --- a/third_party/spanner_pg/src/fe_utils/query_utils.c +++ b/third_party/spanner_pg/src/fe_utils/query_utils.c @@ -2,7 +2,7 @@ * * Facilities for frontend code to query a databases. * - * 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 * * 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/third_party/spanner_pg/src/fe_utils/recovery_gen.c b/third_party/spanner_pg/src/fe_utils/recovery_gen.c index 2643ecd6..c9a42303 100644 --- a/third_party/spanner_pg/src/fe_utils/recovery_gen.c +++ b/third_party/spanner_pg/src/fe_utils/recovery_gen.c @@ -3,7 +3,7 @@ * recovery_gen.c * Generator for recovery configuration * - * Portions Copyright (c) 2011-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2011-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -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/third_party/spanner_pg/src/fe_utils/simple_list.c b/third_party/spanner_pg/src/fe_utils/simple_list.c index 5c0ca004..ae6c6946 100644 --- a/third_party/spanner_pg/src/fe_utils/simple_list.c +++ b/third_party/spanner_pg/src/fe_utils/simple_list.c @@ -7,7 +7,7 @@ * it's all we need in, eg, pg_dump. * * - * 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 * * src/fe_utils/simple_list.c diff --git a/third_party/spanner_pg/src/fe_utils/string_utils.c b/third_party/spanner_pg/src/fe_utils/string_utils.c index 5f347414..f311bdd3 100644 --- a/third_party/spanner_pg/src/fe_utils/string_utils.c +++ b/third_party/spanner_pg/src/fe_utils/string_utils.c @@ -6,7 +6,7 @@ * and interpreting backend output. * * - * 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 * * src/fe_utils/string_utils.c @@ -726,6 +726,69 @@ parsePGArray(const char *atext, char ***itemarray, int *nitems) } +/* + * Append one element to the text representation of a 1-dimensional Postgres + * array. + * + * The caller must provide the initial '{' and closing '}' of the array. + * This function handles all else, including insertion of commas and + * quoting of values. + * + * We assume that typdelim is ','. + */ +void +appendPGArray(PQExpBuffer buffer, const char *value) +{ + bool needquote; + const char *tmp; + + if (buffer->data[buffer->len - 1] != '{') + appendPQExpBufferChar(buffer, ','); + + /* Decide if we need quotes; this should match array_out()'s choices. */ + if (value[0] == '\0') + needquote = true; /* force quotes for empty string */ + else if (pg_strcasecmp(value, "NULL") == 0) + needquote = true; /* force quotes for literal NULL */ + else + needquote = false; + + if (!needquote) + { + for (tmp = value; *tmp; tmp++) + { + char ch = *tmp; + + if (ch == '"' || ch == '\\' || + ch == '{' || ch == '}' || ch == ',' || + /* these match array_isspace(): */ + ch == ' ' || ch == '\t' || ch == '\n' || + ch == '\r' || ch == '\v' || ch == '\f') + { + needquote = true; + break; + } + } + } + + if (needquote) + { + appendPQExpBufferChar(buffer, '"'); + for (tmp = value; *tmp; tmp++) + { + char ch = *tmp; + + if (ch == '"' || ch == '\\') + appendPQExpBufferChar(buffer, '\\'); + appendPQExpBufferChar(buffer, ch); + } + appendPQExpBufferChar(buffer, '"'); + } + else + appendPQExpBufferStr(buffer, value); +} + + /* * Format a reloptions array and append it to the given buffer. * @@ -863,11 +926,15 @@ 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), (schemavar ? dbnamebuf : NULL), - (schemavar ? &schemabuf: NULL), - &namebuf, pattern, force_escape, true, dotcnt); + (schemavar ? &schemabuf : NULL), + &namebuf, + pattern, force_escape, true, dotcnt); /* * Now decide what we need to emit. We may run under a hostile @@ -1160,4 +1227,7 @@ patternToSQLRegex(int encoding, PQExpBuffer dbnamebuf, PQExpBuffer schemabuf, appendPQExpBufferStr(dbnamebuf, curbuf->data); termPQExpBuffer(curbuf); } + + if (want_literal_dbname) + termPQExpBuffer(&left_literal); } diff --git a/third_party/spanner_pg/src/include/access/amapi.h b/third_party/spanner_pg/src/include/access/amapi.h index d357ebb5..1dc674d2 100644 --- a/third_party/spanner_pg/src/include/access/amapi.h +++ b/third_party/spanner_pg/src/include/access/amapi.h @@ -3,7 +3,7 @@ * amapi.h * API for Postgres index access methods. * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * src/include/access/amapi.h * diff --git a/third_party/spanner_pg/src/include/access/amvalidate.h b/third_party/spanner_pg/src/include/access/amvalidate.h index df02fbac..6af5bfb4 100644 --- a/third_party/spanner_pg/src/include/access/amvalidate.h +++ b/third_party/spanner_pg/src/include/access/amvalidate.h @@ -4,7 +4,7 @@ * Support routines for index access methods' amvalidate and * amadjustmembers functions. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/access/amvalidate.h * diff --git a/third_party/spanner_pg/src/include/access/attmap.h b/third_party/spanner_pg/src/include/access/attmap.h index 778fa27f..3ae40cad 100644 --- a/third_party/spanner_pg/src/include/access/attmap.h +++ b/third_party/spanner_pg/src/include/access/attmap.h @@ -4,7 +4,7 @@ * Definitions for PostgreSQL attribute mappings * * - * 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 * * src/include/access/attmap.h diff --git a/third_party/spanner_pg/src/include/access/attnum.h b/third_party/spanner_pg/src/include/access/attnum.h index 0c43e26c..508c583e 100644 --- a/third_party/spanner_pg/src/include/access/attnum.h +++ b/third_party/spanner_pg/src/include/access/attnum.h @@ -4,7 +4,7 @@ * POSTGRES attribute number definitions. * * - * 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 * * src/include/access/attnum.h @@ -36,7 +36,7 @@ typedef int16 AttrNumber; /* * AttrNumberIsForUserDefinedAttr - * True iff the attribute number corresponds to an user defined attribute. + * True iff the attribute number corresponds to a user defined attribute. */ #define AttrNumberIsForUserDefinedAttr(attributeNumber) \ ((bool) ((attributeNumber) > 0)) diff --git a/third_party/spanner_pg/src/include/access/brin.h b/third_party/spanner_pg/src/include/access/brin.h index 4e2be13c..887fb0a5 100644 --- a/third_party/spanner_pg/src/include/access/brin.h +++ b/third_party/spanner_pg/src/include/access/brin.h @@ -1,7 +1,7 @@ /* * AM-callable functions for BRIN indexes * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_internal.h b/third_party/spanner_pg/src/include/access/brin_internal.h index 79440ebe..25186609 100644 --- a/third_party/spanner_pg/src/include/access/brin_internal.h +++ b/third_party/spanner_pg/src/include/access/brin_internal.h @@ -2,7 +2,7 @@ * brin_internal.h * internal declarations for BRIN indexes * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_page.h b/third_party/spanner_pg/src/include/access/brin_page.h index 75de538e..9b9a39d4 100644 --- a/third_party/spanner_pg/src/include/access/brin_page.h +++ b/third_party/spanner_pg/src/include/access/brin_page.h @@ -2,7 +2,7 @@ * brin_page.h * Prototypes and definitions for BRIN page layouts * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_pageops.h b/third_party/spanner_pg/src/include/access/brin_pageops.h index c2e8a2a6..704de0cb 100644 --- a/third_party/spanner_pg/src/include/access/brin_pageops.h +++ b/third_party/spanner_pg/src/include/access/brin_pageops.h @@ -2,7 +2,7 @@ * brin_pageops.h * Prototypes for operating on BRIN pages. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_revmap.h b/third_party/spanner_pg/src/include/access/brin_revmap.h index 4259fe81..c88a8976 100644 --- a/third_party/spanner_pg/src/include/access/brin_revmap.h +++ b/third_party/spanner_pg/src/include/access/brin_revmap.h @@ -2,7 +2,7 @@ * brin_revmap.h * Prototypes for BRIN reverse range maps * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_tuple.h b/third_party/spanner_pg/src/include/access/brin_tuple.h index 3d3a97aa..634aa4b2 100644 --- a/third_party/spanner_pg/src/include/access/brin_tuple.h +++ b/third_party/spanner_pg/src/include/access/brin_tuple.h @@ -2,7 +2,7 @@ * brin_tuple.h * Declarations for dealing with BRIN-specific tuples. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/access/brin_xlog.h b/third_party/spanner_pg/src/include/access/brin_xlog.h index ace8aa0d..95bfc7e8 100644 --- a/third_party/spanner_pg/src/include/access/brin_xlog.h +++ b/third_party/spanner_pg/src/include/access/brin_xlog.h @@ -4,7 +4,7 @@ * POSTGRES BRIN access XLOG definitions. * * - * 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 * * src/include/access/brin_xlog.h diff --git a/third_party/spanner_pg/src/include/access/bufmask.h b/third_party/spanner_pg/src/include/access/bufmask.h index add6c9a3..7ce9f67e 100644 --- a/third_party/spanner_pg/src/include/access/bufmask.h +++ b/third_party/spanner_pg/src/include/access/bufmask.h @@ -7,7 +7,7 @@ * individual rmgr, but we make things easier by providing some * common routines to handle cases which occur in multiple rmgrs. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/access/bufmask.h * diff --git a/third_party/spanner_pg/src/include/access/clog.h b/third_party/spanner_pg/src/include/access/clog.h index 39b8e4af..543f2e26 100644 --- a/third_party/spanner_pg/src/include/access/clog.h +++ b/third_party/spanner_pg/src/include/access/clog.h @@ -3,7 +3,7 @@ * * PostgreSQL transaction-commit-log manager * - * 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 * * src/include/access/clog.h diff --git a/third_party/spanner_pg/src/include/access/commit_ts.h b/third_party/spanner_pg/src/include/access/commit_ts.h index e045dd41..7662f8e1 100644 --- a/third_party/spanner_pg/src/include/access/commit_ts.h +++ b/third_party/spanner_pg/src/include/access/commit_ts.h @@ -3,7 +3,7 @@ * * PostgreSQL commit timestamp manager * - * 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 * * src/include/access/commit_ts.h @@ -15,14 +15,10 @@ #include "datatype/timestamp.h" #include "replication/origin.h" #include "storage/sync.h" -#include "utils/guc.h" extern PGDLLIMPORT bool track_commit_timestamp; -extern bool check_track_commit_timestamp(bool *newval, void **extra, - GucSource source); - extern void TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz timestamp, RepOriginId nodeid); diff --git a/third_party/spanner_pg/src/include/access/detoast.h b/third_party/spanner_pg/src/include/access/detoast.h index 773a02f8..b1d8ea09 100644 --- a/third_party/spanner_pg/src/include/access/detoast.h +++ b/third_party/spanner_pg/src/include/access/detoast.h @@ -3,7 +3,7 @@ * detoast.h * Access to compressed and external varlena values. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/include/access/detoast.h * diff --git a/third_party/spanner_pg/src/include/access/genam.h b/third_party/spanner_pg/src/include/access/genam.h index 480a4762..f6ad7c3b 100644 --- a/third_party/spanner_pg/src/include/access/genam.h +++ b/third_party/spanner_pg/src/include/access/genam.h @@ -4,7 +4,7 @@ * POSTGRES generalized index access method definitions. * * - * 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 * * src/include/access/genam.h @@ -138,6 +138,7 @@ typedef struct IndexOrderByDistance #define IndexScanIsValid(scan) PointerIsValid(scan) extern Relation index_open(Oid relationId, LOCKMODE lockmode); +extern Relation try_index_open(Oid relationId, LOCKMODE lockmode); extern void index_close(Relation relation, LOCKMODE lockmode); extern bool index_insert(Relation indexRelation, diff --git a/third_party/spanner_pg/src/include/access/generic_xlog.h b/third_party/spanner_pg/src/include/access/generic_xlog.h index 6e0a2757..c8363a47 100644 --- a/third_party/spanner_pg/src/include/access/generic_xlog.h +++ b/third_party/spanner_pg/src/include/access/generic_xlog.h @@ -4,7 +4,7 @@ * Generic xlog API definition. * * - * 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 * * src/include/access/generic_xlog.h diff --git a/third_party/spanner_pg/src/include/access/gin.h b/third_party/spanner_pg/src/include/access/gin.h index 266cb072..aacc665f 100644 --- a/third_party/spanner_pg/src/include/access/gin.h +++ b/third_party/spanner_pg/src/include/access/gin.h @@ -2,7 +2,7 @@ * gin.h * Public header file for Generalized Inverted Index access method. * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/access/gin_private.h b/third_party/spanner_pg/src/include/access/gin_private.h index 670a40b4..2935d2f3 100644 --- a/third_party/spanner_pg/src/include/access/gin_private.h +++ b/third_party/spanner_pg/src/include/access/gin_private.h @@ -2,7 +2,7 @@ * gin_private.h * header file for postgres inverted index access method implementation. * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * src/include/access/gin_private.h *-------------------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/include/access/ginblock.h b/third_party/spanner_pg/src/include/access/ginblock.h index 37d650ac..9347f464 100644 --- a/third_party/spanner_pg/src/include/access/ginblock.h +++ b/third_party/spanner_pg/src/include/access/ginblock.h @@ -2,7 +2,7 @@ * ginblock.h * details of structures stored in GIN index blocks * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * src/include/access/ginblock.h *-------------------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/include/access/ginxlog.h b/third_party/spanner_pg/src/include/access/ginxlog.h index 8a2507b7..21de389d 100644 --- a/third_party/spanner_pg/src/include/access/ginxlog.h +++ b/third_party/spanner_pg/src/include/access/ginxlog.h @@ -2,7 +2,7 @@ * ginxlog.h * header file for postgres inverted index xlog implementation. * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * src/include/access/ginxlog.h *-------------------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/include/access/gist.h b/third_party/spanner_pg/src/include/access/gist.h index 4b06575d..a3337627 100644 --- a/third_party/spanner_pg/src/include/access/gist.h +++ b/third_party/spanner_pg/src/include/access/gist.h @@ -6,7 +6,7 @@ * changes should be made with care. * * - * 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 * * src/include/access/gist.h diff --git a/third_party/spanner_pg/src/include/access/gist_private.h b/third_party/spanner_pg/src/include/access/gist_private.h index 553d364e..240131ef 100644 --- a/third_party/spanner_pg/src/include/access/gist_private.h +++ b/third_party/spanner_pg/src/include/access/gist_private.h @@ -4,7 +4,7 @@ * private declarations for GiST -- declarations related to the * internal implementation of GiST, not the public API * - * 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 * * src/include/access/gist_private.h diff --git a/third_party/spanner_pg/src/include/access/gistscan.h b/third_party/spanner_pg/src/include/access/gistscan.h index 54451b5f..bafed976 100644 --- a/third_party/spanner_pg/src/include/access/gistscan.h +++ b/third_party/spanner_pg/src/include/access/gistscan.h @@ -4,7 +4,7 @@ * routines defined in access/gist/gistscan.c * * - * 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 * * src/include/access/gistscan.h diff --git a/third_party/spanner_pg/src/include/access/gistxlog.h b/third_party/spanner_pg/src/include/access/gistxlog.h index fd5144f2..4537e67e 100644 --- a/third_party/spanner_pg/src/include/access/gistxlog.h +++ b/third_party/spanner_pg/src/include/access/gistxlog.h @@ -3,7 +3,7 @@ * gistxlog.h * gist xlog routines * - * 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 * * src/include/access/gistxlog.h diff --git a/third_party/spanner_pg/src/include/access/hash.h b/third_party/spanner_pg/src/include/access/hash.h index 1cce865b..da372841 100644 --- a/third_party/spanner_pg/src/include/access/hash.h +++ b/third_party/spanner_pg/src/include/access/hash.h @@ -4,7 +4,7 @@ * header file for postgres hash access method implementation * * - * 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 * * 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/third_party/spanner_pg/src/include/access/hash_xlog.h b/third_party/spanner_pg/src/include/access/hash_xlog.h index 4353a32d..59230706 100644 --- a/third_party/spanner_pg/src/include/access/hash_xlog.h +++ b/third_party/spanner_pg/src/include/access/hash_xlog.h @@ -4,7 +4,7 @@ * header file for Postgres hash AM implementation * * - * 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 * * src/include/access/hash_xlog.h diff --git a/third_party/spanner_pg/src/include/access/heapam.h b/third_party/spanner_pg/src/include/access/heapam.h index 4f1dff9c..abf62d9d 100644 --- a/third_party/spanner_pg/src/include/access/heapam.h +++ b/third_party/spanner_pg/src/include/access/heapam.h @@ -4,7 +4,7 @@ * POSTGRES heap access method definitions. * * - * 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 * * src/include/access/heapam.h @@ -133,10 +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); -extern bool heap_fetch_extended(Relation relation, Snapshot snapshot, - HeapTuple tuple, Buffer *userbuf, - bool keep_buf); + 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); @@ -170,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, Buffer buf); +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); @@ -189,7 +188,7 @@ extern int heap_page_prune(Relation relation, Buffer buffer, struct GlobalVisState *vistest, TransactionId old_snap_xmin, TimestampTz old_snap_ts_ts, - bool report_stats, + int *nnewlpdead, OffsetNumber *off_loc); extern void heap_page_prune_execute(Buffer buffer, OffsetNumber *redirected, int nredirected, @@ -201,7 +200,6 @@ extern void heap_get_root_tuples(Page page, OffsetNumber *root_offsets); struct VacuumParams; extern void heap_vacuum_rel(Relation rel, struct VacuumParams *params, BufferAccessStrategy bstrategy); -extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc); /* in heap/heapam_visibility.c */ extern bool HeapTupleSatisfiesVisibility(HeapTuple stup, Snapshot snapshot, diff --git a/third_party/spanner_pg/src/include/access/heapam_xlog.h b/third_party/spanner_pg/src/include/access/heapam_xlog.h index 27db4818..2d8a7f62 100644 --- a/third_party/spanner_pg/src/include/access/heapam_xlog.h +++ b/third_party/spanner_pg/src/include/access/heapam_xlog.h @@ -4,7 +4,7 @@ * POSTGRES heap access XLOG definitions. * * - * 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 * * src/include/access/heapam_xlog.h @@ -238,7 +238,7 @@ typedef struct xl_heap_update * Note that nunused is not explicitly stored, but may be found by reference * to the total record length. * - * Requires a super-exclusive lock. + * Acquires a full cleanup lock. */ typedef struct xl_heap_prune { @@ -252,9 +252,9 @@ typedef struct xl_heap_prune /* * The vacuum page record is similar to the prune record, but can only mark - * already dead items as unused + * already LP_DEAD items LP_UNUSED (during VACUUM's second heap pass) * - * Used by heap vacuuming only. Does not require a super-exclusive lock. + * Acquires an ordinary exclusive lock only. */ typedef struct xl_heap_vacuum { @@ -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/third_party/spanner_pg/src/include/access/heaptoast.h b/third_party/spanner_pg/src/include/access/heaptoast.h index 8b29f1a9..a7569905 100644 --- a/third_party/spanner_pg/src/include/access/heaptoast.h +++ b/third_party/spanner_pg/src/include/access/heaptoast.h @@ -4,7 +4,7 @@ * Heap-specific definitions for external and compressed storage * of variable size attributes. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/include/access/heaptoast.h * diff --git a/third_party/spanner_pg/src/include/access/hio.h b/third_party/spanner_pg/src/include/access/hio.h index 1d611287..bb90c6fa 100644 --- a/third_party/spanner_pg/src/include/access/hio.h +++ b/third_party/spanner_pg/src/include/access/hio.h @@ -4,7 +4,7 @@ * POSTGRES heap access method input/output definitions. * * - * 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 * * src/include/access/hio.h diff --git a/third_party/spanner_pg/src/include/access/htup.h b/third_party/spanner_pg/src/include/access/htup.h index cf0bbd70..a4bc7256 100644 --- a/third_party/spanner_pg/src/include/access/htup.h +++ b/third_party/spanner_pg/src/include/access/htup.h @@ -4,7 +4,7 @@ * POSTGRES heap tuple definitions. * * - * 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 * * src/include/access/htup.h diff --git a/third_party/spanner_pg/src/include/access/htup_details.h b/third_party/spanner_pg/src/include/access/htup_details.h index 960772f7..51a60eda 100644 --- a/third_party/spanner_pg/src/include/access/htup_details.h +++ b/third_party/spanner_pg/src/include/access/htup_details.h @@ -4,7 +4,7 @@ * POSTGRES heap tuple header definitions. * * - * 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 * * 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,75 @@ 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 + * 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) +{ + Assert(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 /* FRONTEND */ + #endif /* HTUP_DETAILS_H */ diff --git a/third_party/spanner_pg/src/include/access/itup.h b/third_party/spanner_pg/src/include/access/itup.h index 1917375c..7458bc2f 100644 --- a/third_party/spanner_pg/src/include/access/itup.h +++ b/third_party/spanner_pg/src/include/access/itup.h @@ -4,7 +4,7 @@ * POSTGRES index tuple definitions. * * - * 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 * * src/include/access/itup.h @@ -150,6 +150,9 @@ typedef IndexAttributeBitMapData * IndexAttributeBitMap; /* routines in indextuple.c */ extern IndexTuple index_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull); +extern IndexTuple index_form_tuple_context(TupleDesc tupleDescriptor, + Datum *values, bool *isnull, + MemoryContext context); extern Datum nocache_index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc); extern void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor, diff --git a/third_party/spanner_pg/src/include/access/multixact.h b/third_party/spanner_pg/src/include/access/multixact.h index 4bbb035e..a5600a32 100644 --- a/third_party/spanner_pg/src/include/access/multixact.h +++ b/third_party/spanner_pg/src/include/access/multixact.h @@ -3,7 +3,7 @@ * * PostgreSQL multi-transaction-log manager * - * 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 * * src/include/access/multixact.h diff --git a/third_party/spanner_pg/src/include/access/nbtree.h b/third_party/spanner_pg/src/include/access/nbtree.h index 3d9192fb..3055a5ca 100644 --- a/third_party/spanner_pg/src/include/access/nbtree.h +++ b/third_party/spanner_pg/src/include/access/nbtree.h @@ -4,7 +4,7 @@ * header file for postgres btree access method implementation. * * - * 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 * * 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)) { /* diff --git a/third_party/spanner_pg/src/include/access/nbtxlog.h b/third_party/spanner_pg/src/include/access/nbtxlog.h index 0f773185..de362d3c 100644 --- a/third_party/spanner_pg/src/include/access/nbtxlog.h +++ b/third_party/spanner_pg/src/include/access/nbtxlog.h @@ -3,7 +3,7 @@ * nbtxlog.h * header file for postgres btree xlog routines * - * 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 * * src/include/access/nbtxlog.h diff --git a/third_party/spanner_pg/src/include/access/parallel.h b/third_party/spanner_pg/src/include/access/parallel.h index 93d88ac6..983841d4 100644 --- a/third_party/spanner_pg/src/include/access/parallel.h +++ b/third_party/spanner_pg/src/include/access/parallel.h @@ -3,7 +3,7 @@ * parallel.h * Infrastructure for launching parallel workers * - * 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 * * 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/third_party/spanner_pg/src/include/access/printsimple.h b/third_party/spanner_pg/src/include/access/printsimple.h index 67a99501..010a7f24 100644 --- a/third_party/spanner_pg/src/include/access/printsimple.h +++ b/third_party/spanner_pg/src/include/access/printsimple.h @@ -3,7 +3,7 @@ * printsimple.h * print simple tuples without catalog access * - * 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 * * src/include/access/printsimple.h diff --git a/third_party/spanner_pg/src/include/access/printtup.h b/third_party/spanner_pg/src/include/access/printtup.h index c9b37538..971a74cf 100644 --- a/third_party/spanner_pg/src/include/access/printtup.h +++ b/third_party/spanner_pg/src/include/access/printtup.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/access/printtup.h diff --git a/third_party/spanner_pg/src/include/access/relation.h b/third_party/spanner_pg/src/include/access/relation.h index fd77a133..d3627931 100644 --- a/third_party/spanner_pg/src/include/access/relation.h +++ b/third_party/spanner_pg/src/include/access/relation.h @@ -4,7 +4,7 @@ * Generic relation related routines. * * - * 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 * * src/include/access/relation.h diff --git a/third_party/spanner_pg/src/include/access/reloptions.h b/third_party/spanner_pg/src/include/access/reloptions.h index 7c5fbeb5..f7405133 100644 --- a/third_party/spanner_pg/src/include/access/reloptions.h +++ b/third_party/spanner_pg/src/include/access/reloptions.h @@ -9,7 +9,7 @@ * into a lot of low-level code. * * - * 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 * * src/include/access/reloptions.h diff --git a/third_party/spanner_pg/src/include/access/relscan.h b/third_party/spanner_pg/src/include/access/relscan.h index 74a07ef1..53a93ccb 100644 --- a/third_party/spanner_pg/src/include/access/relscan.h +++ b/third_party/spanner_pg/src/include/access/relscan.h @@ -4,7 +4,7 @@ * POSTGRES relation scan descriptor definitions. * * - * 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 * * src/include/access/relscan.h diff --git a/third_party/spanner_pg/src/include/access/rewriteheap.h b/third_party/spanner_pg/src/include/access/rewriteheap.h index 121f5524..3e27790b 100644 --- a/third_party/spanner_pg/src/include/access/rewriteheap.h +++ b/third_party/spanner_pg/src/include/access/rewriteheap.h @@ -3,7 +3,7 @@ * rewriteheap.h * Declarations for heap rewrite support functions * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * src/include/access/rewriteheap.h @@ -52,6 +52,6 @@ typedef struct LogicalRewriteMappingData * --- */ #define LOGICAL_REWRITE_FORMAT "map-%x-%x-%X_%X-%x-%x" -void CheckPointLogicalRewriteHeap(void); +extern void CheckPointLogicalRewriteHeap(void); #endif /* REWRITE_HEAP_H */ diff --git a/third_party/spanner_pg/src/include/access/rmgr.h b/third_party/spanner_pg/src/include/access/rmgr.h index c9b5c56a..3b6a497e 100644 --- a/third_party/spanner_pg/src/include/access/rmgr.h +++ b/third_party/spanner_pg/src/include/access/rmgr.h @@ -19,17 +19,44 @@ typedef uint8 RmgrId; * Note: RM_MAX_ID must fit in RmgrId; widening that type will affect the XLOG * file format. */ -#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask) \ +#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ symname, typedef enum RmgrIds { #include "access/rmgrlist.h" RM_NEXT_ID -} RmgrIds; +} 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) + +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 + * 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/third_party/spanner_pg/src/include/access/rmgrlist.h b/third_party/spanner_pg/src/include/access/rmgrlist.h index f582cf53..9a74721c 100644 --- a/third_party/spanner_pg/src/include/access/rmgrlist.h +++ b/third_party/spanner_pg/src/include/access/rmgrlist.h @@ -6,7 +6,7 @@ * by the PG_RMGR macro, which is not defined in this file; it can be * defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/rmgrlist.h @@ -25,25 +25,25 @@ */ /* symbol name, textual name, redo, desc, identify, startup, cleanup */ -PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, xlog_identify, NULL, NULL, NULL) -PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, xact_identify, NULL, NULL, NULL) -PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, smgr_identify, NULL, NULL, NULL) -PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, clog_identify, NULL, NULL, NULL) -PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, dbase_identify, NULL, NULL, NULL) -PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, tblspc_identify, NULL, NULL, NULL) -PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, multixact_identify, NULL, NULL, NULL) -PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, relmap_identify, NULL, NULL, NULL) -PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, standby_identify, NULL, NULL, NULL) -PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, heap2_identify, NULL, NULL, heap_mask) -PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, heap_identify, NULL, NULL, heap_mask) -PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, btree_xlog_startup, btree_xlog_cleanup, btree_mask) -PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, hash_identify, NULL, NULL, hash_mask) -PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_identify, gin_xlog_startup, gin_xlog_cleanup, gin_mask) -PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_identify, gist_xlog_startup, gist_xlog_cleanup, gist_mask) -PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL, seq_mask) -PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_identify, spg_xlog_startup, spg_xlog_cleanup, spg_mask) -PG_RMGR(RM_BRIN_ID, "BRIN", brin_redo, brin_desc, brin_identify, NULL, NULL, brin_mask) -PG_RMGR(RM_COMMIT_TS_ID, "CommitTs", commit_ts_redo, commit_ts_desc, commit_ts_identify, NULL, NULL, NULL) -PG_RMGR(RM_REPLORIGIN_ID, "ReplicationOrigin", replorigin_redo, replorigin_desc, replorigin_identify, NULL, NULL, NULL) -PG_RMGR(RM_GENERIC_ID, "Generic", generic_redo, generic_desc, generic_identify, NULL, NULL, generic_mask) -PG_RMGR(RM_LOGICALMSG_ID, "LogicalMessage", logicalmsg_redo, logicalmsg_desc, logicalmsg_identify, NULL, NULL, NULL) +PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, xlog_identify, NULL, NULL, NULL, xlog_decode) +PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, xact_identify, NULL, NULL, NULL, xact_decode) +PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, smgr_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, clog_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, dbase_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, tblspc_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, multixact_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, relmap_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, standby_identify, NULL, NULL, NULL, standby_decode) +PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, heap2_identify, NULL, NULL, heap_mask, heap2_decode) +PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, heap_identify, NULL, NULL, heap_mask, heap_decode) +PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, btree_xlog_startup, btree_xlog_cleanup, btree_mask, NULL) +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, 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) +PG_RMGR(RM_REPLORIGIN_ID, "ReplicationOrigin", replorigin_redo, replorigin_desc, replorigin_identify, NULL, NULL, NULL, NULL) +PG_RMGR(RM_GENERIC_ID, "Generic", generic_redo, generic_desc, generic_identify, NULL, NULL, generic_mask, NULL) +PG_RMGR(RM_LOGICALMSG_ID, "LogicalMessage", logicalmsg_redo, logicalmsg_desc, logicalmsg_identify, NULL, NULL, NULL, logicalmsg_decode) diff --git a/third_party/spanner_pg/src/include/access/sdir.h b/third_party/spanner_pg/src/include/access/sdir.h index 8154adf3..1ab4d5e1 100644 --- a/third_party/spanner_pg/src/include/access/sdir.h +++ b/third_party/spanner_pg/src/include/access/sdir.h @@ -4,7 +4,7 @@ * POSTGRES scan direction definitions. * * - * 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 * * src/include/access/sdir.h diff --git a/third_party/spanner_pg/src/include/access/session.h b/third_party/spanner_pg/src/include/access/session.h index 82cee5af..775888bb 100644 --- a/third_party/spanner_pg/src/include/access/session.h +++ b/third_party/spanner_pg/src/include/access/session.h @@ -3,7 +3,7 @@ * session.h * Encapsulation of user session. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/access/skey.h b/third_party/spanner_pg/src/include/access/skey.h index 92b7d09f..b5ab17f7 100644 --- a/third_party/spanner_pg/src/include/access/skey.h +++ b/third_party/spanner_pg/src/include/access/skey.h @@ -4,7 +4,7 @@ * POSTGRES scan key definitions. * * - * 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 * * src/include/access/skey.h diff --git a/third_party/spanner_pg/src/include/access/slru.h b/third_party/spanner_pg/src/include/access/slru.h index dd52e8ce..130c41c8 100644 --- a/third_party/spanner_pg/src/include/access/slru.h +++ b/third_party/spanner_pg/src/include/access/slru.h @@ -3,7 +3,7 @@ * slru.h * Simple LRU buffering for transaction status logfiles * - * 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 * * src/include/access/slru.h diff --git a/third_party/spanner_pg/src/include/access/spgist.h b/third_party/spanner_pg/src/include/access/spgist.h index 2eb2f421..5ad4f859 100644 --- a/third_party/spanner_pg/src/include/access/spgist.h +++ b/third_party/spanner_pg/src/include/access/spgist.h @@ -4,7 +4,7 @@ * Public header file for SP-GiST access method. * * - * 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 * * src/include/access/spgist.h diff --git a/third_party/spanner_pg/src/include/access/spgist_private.h b/third_party/spanner_pg/src/include/access/spgist_private.h index 40d3b71b..eb56b1c6 100644 --- a/third_party/spanner_pg/src/include/access/spgist_private.h +++ b/third_party/spanner_pg/src/include/access/spgist_private.h @@ -4,7 +4,7 @@ * Private declarations for SP-GiST access method. * * - * 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 * * src/include/access/spgist_private.h diff --git a/third_party/spanner_pg/src/include/access/spgxlog.h b/third_party/spanner_pg/src/include/access/spgxlog.h index 69405b57..930ffdd4 100644 --- a/third_party/spanner_pg/src/include/access/spgxlog.h +++ b/third_party/spanner_pg/src/include/access/spgxlog.h @@ -3,7 +3,7 @@ * spgxlog.h * xlog declarations for SP-GiST access method. * - * 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 * * src/include/access/spgxlog.h diff --git a/third_party/spanner_pg/src/include/access/stratnum.h b/third_party/spanner_pg/src/include/access/stratnum.h index fad4b699..ac15f844 100644 --- a/third_party/spanner_pg/src/include/access/stratnum.h +++ b/third_party/spanner_pg/src/include/access/stratnum.h @@ -4,7 +4,7 @@ * POSTGRES strategy number definitions. * * - * 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 * * src/include/access/stratnum.h diff --git a/third_party/spanner_pg/src/include/access/subtrans.h b/third_party/spanner_pg/src/include/access/subtrans.h index d0ab44ae..f94e1166 100644 --- a/third_party/spanner_pg/src/include/access/subtrans.h +++ b/third_party/spanner_pg/src/include/access/subtrans.h @@ -3,7 +3,7 @@ * * PostgreSQL subtransaction-log manager * - * 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 * * src/include/access/subtrans.h diff --git a/third_party/spanner_pg/src/include/access/syncscan.h b/third_party/spanner_pg/src/include/access/syncscan.h index 7947f3c3..a3f0e482 100644 --- a/third_party/spanner_pg/src/include/access/syncscan.h +++ b/third_party/spanner_pg/src/include/access/syncscan.h @@ -4,7 +4,7 @@ * POSTGRES synchronous scan support functions. * * - * 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 * * src/include/access/syncscan.h diff --git a/third_party/spanner_pg/src/include/access/sysattr.h b/third_party/spanner_pg/src/include/access/sysattr.h index 968257bd..c0b1d5ab 100644 --- a/third_party/spanner_pg/src/include/access/sysattr.h +++ b/third_party/spanner_pg/src/include/access/sysattr.h @@ -4,7 +4,7 @@ * POSTGRES system attribute definitions. * * - * 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 * * src/include/access/sysattr.h diff --git a/third_party/spanner_pg/src/include/access/table.h b/third_party/spanner_pg/src/include/access/table.h index 5e4d9dd3..969952d6 100644 --- a/third_party/spanner_pg/src/include/access/table.h +++ b/third_party/spanner_pg/src/include/access/table.h @@ -4,7 +4,7 @@ * Generic routines for table related code. * * - * 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 * * src/include/access/table.h diff --git a/third_party/spanner_pg/src/include/access/tableam.h b/third_party/spanner_pg/src/include/access/tableam.h index 9f1e4a1a..5d0431a2 100644 --- a/third_party/spanner_pg/src/include/access/tableam.h +++ b/third_party/spanner_pg/src/include/access/tableam.h @@ -4,7 +4,7 @@ * POSTGRES table access method definitions. * * - * 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 * * 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; @@ -157,7 +157,7 @@ typedef struct TM_FailureData * work, too. This is a little like bottom-up deletion, but not too much. * The tableam will only perform speculative work when it's practically free * to do so in passing for simple deletion caller (while always performing - * whatever work is is needed to enable knowndeletable/LP_DEAD index tuples to + * whatever work is needed to enable knowndeletable/LP_DEAD index tuples to * be deleted within index AM). This is the real reason why it's possible for * simple index deletion caller to specify knowndeletable = false up front * (this means "check if it's possible for me to delete corresponding index @@ -220,6 +220,8 @@ typedef struct TM_IndexStatus */ typedef struct TM_IndexDeleteOp { + Relation irel; /* Target index relation */ + BlockNumber iblknum; /* Index block number (for error reports) */ bool bottomup; /* Bottom-up (not simple) deletion? */ int bottomupfreespace; /* Bottom-up space target */ @@ -1453,8 +1455,8 @@ table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots, * TM_BeingModified (the last only possible if wait == false). * * In the failure cases, the routine fills *tmfd with the tuple's t_ctid, - * t_xmax, and, if possible, and, if possible, t_cmax. See comments for - * struct TM_FailureData for additional info. + * t_xmax, and, if possible, t_cmax. See comments for struct + * TM_FailureData for additional info. */ static inline TM_Result table_tuple_delete(Relation rel, ItemPointer tid, CommandId cid, diff --git a/third_party/spanner_pg/src/include/access/timeline.h b/third_party/spanner_pg/src/include/access/timeline.h index ce3586c3..3a370868 100644 --- a/third_party/spanner_pg/src/include/access/timeline.h +++ b/third_party/spanner_pg/src/include/access/timeline.h @@ -3,7 +3,7 @@ * * Functions for reading and writing timeline history files. * - * 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 * * src/include/access/timeline.h diff --git a/third_party/spanner_pg/src/include/access/toast_compression.h b/third_party/spanner_pg/src/include/access/toast_compression.h index c992ece4..deb8f99d 100644 --- a/third_party/spanner_pg/src/include/access/toast_compression.h +++ b/third_party/spanner_pg/src/include/access/toast_compression.h @@ -3,7 +3,7 @@ * toast_compression.h * Functions for toast compression. * - * Copyright (c) 2021, PostgreSQL Global Development Group + * Copyright (c) 2021-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/access/toast_helper.h b/third_party/spanner_pg/src/include/access/toast_helper.h index 05104ce2..1e2aaf33 100644 --- a/third_party/spanner_pg/src/include/access/toast_helper.h +++ b/third_party/spanner_pg/src/include/access/toast_helper.h @@ -4,7 +4,7 @@ * Helper functions for table AMs implementing compressed or * out-of-line storage of varlena attributes. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/include/access/toast_helper.h * diff --git a/third_party/spanner_pg/src/include/access/toast_internals.h b/third_party/spanner_pg/src/include/access/toast_internals.h index 1c28b07c..85e7dc0f 100644 --- a/third_party/spanner_pg/src/include/access/toast_internals.h +++ b/third_party/spanner_pg/src/include/access/toast_internals.h @@ -3,7 +3,7 @@ * toast_internals.h * Internal definitions for the TOAST system. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/include/access/toast_internals.h * diff --git a/third_party/spanner_pg/src/include/access/transam.h b/third_party/spanner_pg/src/include/access/transam.h index 2fe8a591..775471d2 100644 --- a/third_party/spanner_pg/src/include/access/transam.h +++ b/third_party/spanner_pg/src/include/access/transam.h @@ -4,7 +4,7 @@ * postgres transaction access method support code * * - * 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 * * src/include/access/transam.h @@ -165,10 +165,14 @@ FullTransactionIdAdvance(FullTransactionId *dest) * when the .dat files in src/include/catalog/ do not specify an OID * for a catalog entry that requires one. Note that genbki.pl assigns * these OIDs independently in each catalog, so they're not guaranteed - * to be globally unique. + * to be globally unique. Furthermore, the bootstrap backend and + * initdb's post-bootstrap processing can also assign OIDs in this range. + * The normal OID-generation logic takes care of any OID conflicts that + * might arise from that. * - * OIDS 12000-16383 are reserved for assignment during initdb - * using the OID generator. (We start the generator at 12000.) + * OIDs 12000-16383 are reserved for unpinned objects created by initdb's + * post-bootstrap processing. initdb forces the OID generator up to + * 12000 as soon as it's made the pinned objects it's responsible for. * * OIDs beginning at 16384 are assigned from the OID generator * during normal multiuser operation. (We force the generator up to @@ -184,11 +188,12 @@ FullTransactionIdAdvance(FullTransactionId *dest) * * NOTE: if the OID generator wraps around, we skip over OIDs 0-16383 * and resume with 16384. This minimizes the odds of OID conflict, by not - * reassigning OIDs that might have been assigned during initdb. + * reassigning OIDs that might have been assigned during initdb. Critically, + * it also ensures that no user-created object will be considered pinned. * ---------- */ #define FirstGenbkiObjectId 10000 -#define FirstBootstrapObjectId 12000 +#define FirstUnpinnedObjectId 12000 #define FirstNormalObjectId 16384 /* @@ -268,7 +273,6 @@ extern PGDLLIMPORT VariableCache ShmemVariableCache; */ extern bool TransactionIdDidCommit(TransactionId transactionId); extern bool TransactionIdDidAbort(TransactionId transactionId); -extern bool TransactionIdIsKnownCompleted(TransactionId transactionId); extern void TransactionIdCommitTree(TransactionId xid, int nxids, TransactionId *xids); extern void TransactionIdAsyncCommitTree(TransactionId xid, int nxids, TransactionId *xids, XLogRecPtr lsn); extern void TransactionIdAbortTree(TransactionId xid, int nxids, TransactionId *xids); @@ -289,6 +293,7 @@ extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid, extern void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid); extern bool ForceTransactionIdLimitUpdate(void); extern Oid GetNewObjectId(void); +extern void StopGeneratingPinnedObjectIds(void); #ifdef USE_ASSERT_CHECKING extern void AssertTransactionIdInAllowableRange(TransactionId xid); diff --git a/third_party/spanner_pg/src/include/access/tsmapi.h b/third_party/spanner_pg/src/include/access/tsmapi.h index 2dc848ca..970993f8 100644 --- a/third_party/spanner_pg/src/include/access/tsmapi.h +++ b/third_party/spanner_pg/src/include/access/tsmapi.h @@ -3,7 +3,7 @@ * tsmapi.h * API for tablesample methods * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * src/include/access/tsmapi.h * diff --git a/third_party/spanner_pg/src/include/access/tupconvert.h b/third_party/spanner_pg/src/include/access/tupconvert.h index a2cc4b3a..f5a5fd82 100644 --- a/third_party/spanner_pg/src/include/access/tupconvert.h +++ b/third_party/spanner_pg/src/include/access/tupconvert.h @@ -4,7 +4,7 @@ * Tuple conversion support. * * - * 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 * * src/include/access/tupconvert.h diff --git a/third_party/spanner_pg/src/include/access/tupdesc.h b/third_party/spanner_pg/src/include/access/tupdesc.h index d0fed616..3e857496 100644 --- a/third_party/spanner_pg/src/include/access/tupdesc.h +++ b/third_party/spanner_pg/src/include/access/tupdesc.h @@ -4,7 +4,7 @@ * POSTGRES tuple descriptor definitions. * * - * 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 * * src/include/access/tupdesc.h diff --git a/third_party/spanner_pg/src/include/access/tupdesc_details.h b/third_party/spanner_pg/src/include/access/tupdesc_details.h index d0d2c992..04034bf9 100644 --- a/third_party/spanner_pg/src/include/access/tupdesc_details.h +++ b/third_party/spanner_pg/src/include/access/tupdesc_details.h @@ -4,7 +4,7 @@ * POSTGRES tuple descriptor definitions we can't include everywhere * * - * 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 * * src/include/access/tupdesc_details.h diff --git a/third_party/spanner_pg/src/include/access/tupmacs.h b/third_party/spanner_pg/src/include/access/tupmacs.h index 65ac1ef3..16c74a58 100644 --- a/third_party/spanner_pg/src/include/access/tupmacs.h +++ b/third_party/spanner_pg/src/include/access/tupmacs.h @@ -4,7 +4,7 @@ * Tuple macros used by both index tuples and heap tuples. * * - * 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 * * src/include/access/tupmacs.h diff --git a/third_party/spanner_pg/src/include/access/twophase.h b/third_party/spanner_pg/src/include/access/twophase.h index edb797b3..5d6544e2 100644 --- a/third_party/spanner_pg/src/include/access/twophase.h +++ b/third_party/spanner_pg/src/include/access/twophase.h @@ -4,7 +4,7 @@ * Two-phase-commit related declarations. * * - * 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 * * src/include/access/twophase.h @@ -60,4 +60,6 @@ extern void PrepareRedoAdd(char *buf, XLogRecPtr start_lsn, XLogRecPtr end_lsn, RepOriginId origin_id); extern void PrepareRedoRemove(TransactionId xid, bool giveWarning); extern void restoreTwoPhaseData(void); +extern bool LookupGXact(const char *gid, XLogRecPtr prepare_at_lsn, + TimestampTz origin_prepare_timestamp); #endif /* TWOPHASE_H */ diff --git a/third_party/spanner_pg/src/include/access/twophase_rmgr.h b/third_party/spanner_pg/src/include/access/twophase_rmgr.h index 2709d72d..96381a5e 100644 --- a/third_party/spanner_pg/src/include/access/twophase_rmgr.h +++ b/third_party/spanner_pg/src/include/access/twophase_rmgr.h @@ -4,7 +4,7 @@ * Two-phase-commit resource managers definition * * - * 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 * * 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/third_party/spanner_pg/src/include/access/valid.h b/third_party/spanner_pg/src/include/access/valid.h index a462113a..a5525d0d 100644 --- a/third_party/spanner_pg/src/include/access/valid.h +++ b/third_party/spanner_pg/src/include/access/valid.h @@ -4,7 +4,7 @@ * POSTGRES tuple qualification validity definitions. * * - * 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 * * src/include/access/valid.h diff --git a/third_party/spanner_pg/src/include/access/visibilitymap.h b/third_party/spanner_pg/src/include/access/visibilitymap.h index 0981b218..55f67edb 100644 --- a/third_party/spanner_pg/src/include/access/visibilitymap.h +++ b/third_party/spanner_pg/src/include/access/visibilitymap.h @@ -4,7 +4,7 @@ * visibility map interface * * - * Portions Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2007-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/visibilitymap.h diff --git a/third_party/spanner_pg/src/include/access/visibilitymapdefs.h b/third_party/spanner_pg/src/include/access/visibilitymapdefs.h index 58be5a4b..2803ef5c 100644 --- a/third_party/spanner_pg/src/include/access/visibilitymapdefs.h +++ b/third_party/spanner_pg/src/include/access/visibilitymapdefs.h @@ -4,7 +4,7 @@ * macros for accessing contents of visibility map pages * * - * Copyright (c) 2021, PostgreSQL Global Development Group + * Copyright (c) 2021-2022, PostgreSQL Global Development Group * * src/include/access/visibilitymapdefs.h * diff --git a/third_party/spanner_pg/src/include/access/xact.h b/third_party/spanner_pg/src/include/access/xact.h index 5af78bd0..8d46a781 100644 --- a/third_party/spanner_pg/src/include/access/xact.h +++ b/third_party/spanner_pg/src/include/access/xact.h @@ -4,7 +4,7 @@ * postgres transaction system definitions * * - * 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 * * 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. @@ -148,6 +148,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 @@ -185,6 +193,7 @@ typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid, #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 @@ -235,9 +244,10 @@ 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 - * four so following records don't have to care about alignment. Commit - * records can be large, so copying large portions isn't attractive. + * 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. */ uint32 xinfo; } xl_xact_xinfo; @@ -262,6 +272,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 */ @@ -288,6 +319,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. */ @@ -303,6 +335,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. */ @@ -321,6 +354,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 */ @@ -347,6 +382,9 @@ typedef struct xl_xact_parsed_commit int nrels; RelFileNode *xnodes; + int nstats; + xl_xact_stats_item *stats; + int nmsgs; SharedInvalidationMessage *msgs; @@ -354,6 +392,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; @@ -375,6 +415,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 */ @@ -412,8 +455,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); @@ -446,14 +489,16 @@ extern void UnregisterXactCallback(XactCallback callback, void *arg); extern void RegisterSubXactCallback(SubXactCallback callback, void *arg); extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg); -extern bool IsSubTransactionAssignmentPending(void); -extern void MarkSubTransactionAssigned(void); +extern bool IsSubxactTopXidLogPending(void); +extern void MarkSubxactTopXidLogged(void); 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, @@ -463,6 +508,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/third_party/spanner_pg/src/include/access/xlog.h b/third_party/spanner_pg/src/include/access/xlog.h index ee3e369b..cd674c3c 100644 --- a/third_party/spanner_pg/src/include/access/xlog.h +++ b/third_party/spanner_pg/src/include/access/xlog.h @@ -3,7 +3,7 @@ * * PostgreSQL write-ahead log manager * - * 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 * * src/include/access/xlog.h @@ -11,14 +11,11 @@ #ifndef XLOG_H #define XLOG_H -#include "access/rmgr.h" #include "access/xlogdefs.h" -#include "access/xloginsert.h" #include "access/xlogreader.h" #include "datatype/timestamp.h" #include "lib/stringinfo.h" #include "nodes/pg_list.h" -#include "storage/fd.h" /* Sync methods */ @@ -27,128 +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 PGDLLIMPORT TimeLineID ThisTimeLineID; /* current TLI */ - -/* - * Prior to 8.4, all activity during recovery was carried out by the startup - * process. This local variable continues to be used in many parts of the - * code to indicate actions taken by RecoveryManagers. Other processes that - * potentially perform work during recovery should check RecoveryInProgress(). - * See XLogCtl notes in xlog.c. - */ -extern bool InRecovery; - -/* - * Like InRecovery, standbyState is only valid in the startup process. - * In all other processes it will have the value STANDBY_DISABLED (so - * InHotStandby will read as false). - * - * In DISABLED state, we're performing crash recovery or hot standby was - * disabled in postgresql.conf. - * - * In INITIALIZED state, we've run InitRecoveryTransactionEnvironment, but - * we haven't yet processed a RUNNING_XACTS or shutdown-checkpoint WAL record - * to initialize our primary-transaction tracking system. - * - * When the transaction tracking is initialized, we enter the SNAPSHOT_PENDING - * state. The tracked information might still be incomplete, so we can't allow - * connections yet, but redo functions must update the in-memory state when - * appropriate. - * - * In SNAPSHOT_READY mode, we have full knowledge of transactions that are - * (or were) running on the primary at the current WAL location. Snapshots - * can be taken, and read-only queries can be run. - */ -typedef enum -{ - STANDBY_DISABLED, - STANDBY_INITIALIZED, - STANDBY_SNAPSHOT_PENDING, - STANDBY_SNAPSHOT_READY -} HotStandbyState; - -extern HotStandbyState standbyState; - -#define InHotStandby (standbyState >= STANDBY_SNAPSHOT_PENDING) - -/* - * Recovery target type. - * Only set during a Point in Time recovery, not when in standby mode. - */ -typedef enum -{ - RECOVERY_TARGET_UNSET, - RECOVERY_TARGET_XID, - RECOVERY_TARGET_TIME, - RECOVERY_TARGET_NAME, - RECOVERY_TARGET_LSN, - RECOVERY_TARGET_IMMEDIATE -} RecoveryTargetType; - -/* - * Recovery target TimeLine goal - */ -typedef enum -{ - RECOVERY_TARGET_TIMELINE_CONTROLFILE, - RECOVERY_TARGET_TIMELINE_LATEST, - RECOVERY_TARGET_TIMELINE_NUMERIC -} RecoveryTargetTimeLineGoal; - -extern XLogRecPtr ProcLastRecPtr; -extern XLogRecPtr XactLastRecEnd; +extern PGDLLIMPORT XLogRecPtr ProcLastRecPtr; +extern PGDLLIMPORT XLogRecPtr XactLastRecEnd; extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd; -extern bool reachedConsistency; - /* these variables are GUC parameters related to XLOG */ -extern 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 bool 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 char *recoveryRestoreCommand; -extern char *recoveryEndCommand; -extern char *archiveCleanupCommand; -extern bool recoveryTargetInclusive; -extern int recoveryTargetAction; -extern int recovery_min_apply_delay; -extern char *PrimaryConnInfo; -extern char *PrimarySlotName; -extern bool wal_receiver_create_temp_slot; -extern bool track_wal_io_timing; - -/* indirectly set via GUC system */ -extern TransactionId recoveryTargetXid; -extern char *recovery_target_time_string; -extern const char *recoveryTargetName; -extern XLogRecPtr recoveryTargetLSN; -extern RecoveryTargetType recoveryTarget; -extern char *PromoteTriggerFile; -extern RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal; -extern TimeLineID recoveryTargetTLIRequested; -extern TimeLineID recoveryTargetTLI; - -extern int CheckPointSegments; - -/* option set locally in startup process only when signal files exist */ -extern bool StandbyModeRequested; -extern bool StandbyMode; +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 @@ -157,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 @@ -167,6 +71,15 @@ typedef enum WalLevel WAL_LEVEL_LOGICAL } WalLevel; +/* Compression algorithms for WAL */ +typedef enum WalCompression +{ + WAL_COMPRESSION_NONE = 0, + WAL_COMPRESSION_PGLZ, + WAL_COMPRESSION_LZ4, + WAL_COMPRESSION_ZSTD +} WalCompression; + /* Recovery states */ typedef enum RecoveryState { @@ -175,14 +88,6 @@ typedef enum RecoveryState RECOVERY_STATE_DONE /* currently in production */ } RecoveryState; -/* Recovery pause states */ -typedef enum RecoveryPauseState -{ - RECOVERY_NOT_PAUSED, /* pause not requested */ - RECOVERY_PAUSE_REQUESTED, /* pause requested, but not yet paused */ - RECOVERY_PAUSED /* recovery is paused */ -} RecoveryPauseState; - extern PGDLLIMPORT int wal_level; /* Is WAL archiving enabled (always or only while server is running normally)? */ @@ -191,7 +96,6 @@ extern PGDLLIMPORT int wal_level; /* Is WAL archiving enabled always (even during recovery)? */ #define XLogArchivingAlways() \ (AssertMacro(XLogArchiveMode == ARCHIVE_MODE_OFF || wal_level >= WAL_LEVEL_REPLICA), XLogArchiveMode == ARCHIVE_MODE_ALWAYS) -#define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0') /* * Is WAL-logging necessary for archival or log-shipping, or can we skip @@ -217,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 /* @@ -246,7 +150,6 @@ extern bool XLOG_DEBUG; */ #define XLOG_INCLUDE_ORIGIN 0x01 /* include the replication origin */ #define XLOG_MARK_UNIMPORTANT 0x02 /* record not important for durability */ -#define XLOG_INCLUDE_XID 0x04 /* WAL-internal message-passing hack */ /* Checkpoint statistics */ @@ -272,7 +175,7 @@ typedef struct CheckpointStatsData * entire sync phase. */ } CheckpointStatsData; -extern CheckpointStatsData CheckpointStats; +extern PGDLLIMPORT CheckpointStatsData CheckpointStats; /* * GetWALAvailability return codes @@ -292,12 +195,13 @@ struct XLogRecData; extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, XLogRecPtr fpw_lsn, uint8 flags, - int num_fpi); + int num_fpi, + bool topxid_included); extern void XLogFlush(XLogRecPtr RecPtr); extern bool XLogBackgroundFlush(void); extern bool XLogNeedsFlush(XLogRecPtr RecPtr); -extern int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock); -extern int XLogFileOpen(XLogSegNo segno); +extern int XLogFileInit(XLogSegNo segno, TimeLineID tli); +extern int XLogFileOpen(XLogSegNo segno, TimeLineID tli); extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli); extern XLogSegNo XLogGetLastRemovedSegno(void); @@ -308,23 +212,14 @@ extern void xlog_redo(XLogReaderState *record); extern void xlog_desc(StringInfo buf, XLogReaderState *record); extern const char *xlog_identify(uint8 info); -extern void issue_xlog_fsync(int fd, XLogSegNo segno); +extern void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli); extern bool RecoveryInProgress(void); extern RecoveryState GetRecoveryState(void); -extern bool HotStandbyActive(void); -extern bool HotStandbyActiveInReplay(void); extern bool XLogInsertAllowed(void); -extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream); -extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI); extern XLogRecPtr GetXLogInsertRecPtr(void); extern XLogRecPtr GetXLogWriteRecPtr(void); -extern RecoveryPauseState GetRecoveryPauseState(void); -extern void SetRecoveryPause(bool recoveryPause); -extern TimestampTz GetLatestXTime(void); -extern TimestampTz GetCurrentChunkReplayStartTime(void); -extern void UpdateControlFile(void); extern uint64 GetSystemIdentifier(void); extern char *GetMockAuthenticationNonce(void); extern bool DataChecksumsEnabled(void); @@ -335,32 +230,35 @@ extern void BootStrapXLOG(void); extern void LocalProcessControlFile(bool reset); extern void StartupXLOG(void); extern void ShutdownXLOG(int code, Datum arg); -extern void InitXLOGAccess(void); extern void CreateCheckPoint(int flags); extern bool CreateRestartPoint(int flags); extern WALAvailability GetWALAvailability(XLogRecPtr targetLSN); -extern XLogRecPtr CalculateMaxmumSafeLSN(void); extern void XLogPutNextOid(Oid nextOid); extern XLogRecPtr XLogRestorePoint(const char *rpName); extern void UpdateFullPageWrites(void); extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p); extern XLogRecPtr GetRedoRecPtr(void); extern XLogRecPtr GetInsertRecPtr(void); -extern XLogRecPtr GetFlushRecPtr(void); +extern XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI); +extern TimeLineID GetWALInsertionTimeLine(void); extern XLogRecPtr GetLastImportantRecPtr(void); -extern void RemovePromoteSignalFiles(void); -extern bool PromoteIsTriggered(void); -extern bool CheckPromoteSignal(void); -extern void WakeupRecovery(void); extern void SetWalWriterSleeping(bool sleeping); -extern void StartupRequestWalReceiverRestart(void); -extern void XLogRequestWalReceiverReply(void); - extern void assign_max_wal_size(int newval, void *extra); extern void assign_checkpoint_completion_target(double newval, void *extra); +/* + * Routines used by xlogrecovery.c to call back into xlog.c during recovery. + */ +extern void RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI); +extern bool XLogCheckpointNeeded(XLogSegNo new_segno); +extern void SwitchIntoArchiveRecovery(XLogRecPtr EndRecPtr, TimeLineID replayTLI); +extern void ReachedEndOfBackup(XLogRecPtr EndRecPtr, TimeLineID tli); +extern void SetInstallXLogFileSegmentActive(void); +extern bool IsInstallXLogFileSegmentActive(void); +extern void XLogShutdownWalRcv(void); + /* * Routines to start, stop, and get status of a base backup. */ @@ -378,14 +276,13 @@ extern void assign_checkpoint_completion_target(double newval, void *extra); 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/third_party/spanner_pg/src/include/access/xlog_internal.h b/third_party/spanner_pg/src/include/access/xlog_internal.h index dcf41e92..fae0bef8 100644 --- a/third_party/spanner_pg/src/include/access/xlog_internal.h +++ b/third_party/spanner_pg/src/include/access/xlog_internal.h @@ -11,7 +11,7 @@ * Note: This file must be includable in both frontend and backend contexts, * to allow stand-alone tools like pg_receivewal to deal with WAL files. * - * 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 * * src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD10D /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD110 /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { @@ -287,6 +287,9 @@ typedef enum RECOVERY_TARGET_ACTION_SHUTDOWN } RecoveryTargetAction; +struct LogicalDecodingContext; +struct XLogRecordBuffer; + /* * Method table for resource managers. * @@ -301,7 +304,8 @@ typedef enum * 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 { @@ -312,9 +316,31 @@ typedef struct RmgrData 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; -extern const RmgrData RmgrTable[]; +extern PGDLLIMPORT RmgrData RmgrTable[]; +extern void RmgrStartup(void); +extern void RmgrCleanup(void); +extern void RmgrNotFound(RmgrId rmid); +extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr); + +#ifndef FRONTEND +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]; +} +#endif /* * Exported to support xlog switching from checkpointer @@ -324,13 +350,17 @@ 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. */ -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/third_party/spanner_pg/src/include/access/xlogarchive.h b/third_party/spanner_pg/src/include/access/xlogarchive.h index 3edd1a97..f47b2195 100644 --- a/third_party/spanner_pg/src/include/access/xlogarchive.h +++ b/third_party/spanner_pg/src/include/access/xlogarchive.h @@ -3,7 +3,7 @@ * xlogarchive.h * Prototypes for WAL archives in the backend * - * 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 * * IDENTIFICATION @@ -21,10 +21,10 @@ extern bool RestoreArchivedFile(char *path, const char *xlogfname, const char *recovername, off_t expectedSize, bool cleanupEnabled); extern void ExecuteRecoveryCommand(const char *command, const char *commandName, - bool failOnSignal); + bool failOnSignal, uint32 wait_event_info); extern void KeepFileRestoredFromArchive(const char *path, const char *xlogfname); extern void XLogArchiveNotify(const char *xlog); -extern void XLogArchiveNotifySeg(XLogSegNo segno); +extern void XLogArchiveNotifySeg(XLogSegNo segno, TimeLineID tli); extern void XLogArchiveForceDone(const char *xlog); extern bool XLogArchiveCheckDone(const char *xlog); extern bool XLogArchiveIsBusy(const char *xlog); diff --git a/third_party/spanner_pg/src/include/access/xlogdefs.h b/third_party/spanner_pg/src/include/access/xlogdefs.h index 0940b64c..a47e3eeb 100644 --- a/third_party/spanner_pg/src/include/access/xlogdefs.h +++ b/third_party/spanner_pg/src/include/access/xlogdefs.h @@ -4,7 +4,7 @@ * Postgres write-ahead log manager record pointer and * timeline number definitions * - * 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 * * src/include/access/xlogdefs.h @@ -64,21 +64,6 @@ typedef uint32 TimeLineID; */ typedef uint16 RepOriginId; -/* - * Because O_DIRECT bypasses the kernel buffers, and because we never - * read those buffers except during crash recovery or if wal_level != minimal, - * it is a win to use it in all cases where we sync on each write(). We could - * allow O_DIRECT with fsync(), but it is unclear if fsync() could process - * writes not buffered in the kernel. Also, O_DIRECT is never enough to force - * data to the drives, it merely tries to bypass the kernel cache, so we still - * need O_SYNC/O_DSYNC. - */ -#ifdef O_DIRECT -#define PG_O_DIRECT O_DIRECT -#else -#define PG_O_DIRECT 0 -#endif - /* * This chunk of hackery attempts to determine which file sync methods * are available on the current platform, and to choose an appropriate diff --git a/third_party/spanner_pg/src/include/access/xloginsert.h b/third_party/spanner_pg/src/include/access/xloginsert.h index f1d8c39e..5fc340c4 100644 --- a/third_party/spanner_pg/src/include/access/xloginsert.h +++ b/third_party/spanner_pg/src/include/access/xloginsert.h @@ -3,7 +3,7 @@ * * Functions for generating WAL records * - * 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 * * src/include/access/xloginsert.h diff --git a/third_party/spanner_pg/src/include/access/xlogprefetcher.h b/third_party/spanner_pg/src/include/access/xlogprefetcher.h new file mode 100644 index 00000000..fdd67fce --- /dev/null +++ b/third_party/spanner_pg/src/include/access/xlogprefetcher.h @@ -0,0 +1,55 @@ +/*------------------------------------------------------------------------- + * + * 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" +#include "access/xlogreader.h" +#include "access/xlogrecord.h" + +/* GUCs */ +extern PGDLLIMPORT 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/third_party/spanner_pg/src/include/access/xlogreader.h b/third_party/spanner_pg/src/include/access/xlogreader.h index 10458c23..9e63162e 100644 --- a/third_party/spanner_pg/src/include/access/xlogreader.h +++ b/third_party/spanner_pg/src/include/access/xlogreader.h @@ -3,7 +3,7 @@ * xlogreader.h * Definitions for the generic XLog reading facility * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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; @@ -144,6 +148,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,10 +199,23 @@ 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 */ + /* + * Set at the end of recovery: the start point of a partial record at the + * end of WAL (InvalidXLogRecPtr if there wasn't one), and the start + * location of its first contrecord that went missing. + */ + XLogRecPtr abortedRecPtr; + XLogRecPtr missingContrecPtr; + /* Set when XLP_FIRST_IS_OVERWRITE_CONTRECORD is found */ + XLogRecPtr overwrittenRecPtr; + /* ---------------------------------------- * Decoded representation of current record @@ -182,27 +223,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 */ - - 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 */ + XLogRecPtr DecodeRecPtr; /* start of last record decoded */ + XLogRecPtr NextRecPtr; /* end+1 of last record decoded */ + XLogRecPtr PrevRecPtr; /* start of previous record decoded */ - 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) @@ -252,18 +309,24 @@ struct XLogReaderState /* Buffer to hold error message */ char *errormsg_buf; + bool errormsg_deferred; /* - * Set at the end of recovery: the start point of a partial record at the - * end of WAL (InvalidXLogRecPtr if there wasn't one), and the start - * location of its first contrecord that went missing. + * Flag to indicate to XLogPageReadCB that it should not block waiting for + * data. */ - XLogRecPtr abortedRecPtr; - XLogRecPtr missingContrecPtr; - /* Set when XLP_FIRST_IS_OVERWRITE_CONTRECORD is found */ - XLogRecPtr overwrittenRecPtr; + 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,20 +337,45 @@ 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 XLogRecPtr 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); +/* Forget error produced by XLogReaderValidatePageHeader(). */ +extern void XLogReaderResetError(XLogReaderState *state); + /* * Error information from WALRead that both backend and frontend caller can * process. Currently only errors from pg_pread can be reported. @@ -307,25 +395,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); @@ -333,8 +432,12 @@ extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record); extern bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page); extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len); -extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, +extern void 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/third_party/spanner_pg/src/include/access/xlogrecord.h b/third_party/spanner_pg/src/include/access/xlogrecord.h index f68cb189..052ac681 100644 --- a/third_party/spanner_pg/src/include/access/xlogrecord.h +++ b/third_party/spanner_pg/src/include/access/xlogrecord.h @@ -3,7 +3,7 @@ * * Definitions for the WAL record format. * - * 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 * * src/include/access/xlogrecord.h @@ -114,8 +114,8 @@ typedef struct XLogRecordBlockHeader * present is (BLCKSZ - ). * * Additionally, when wal_compression is enabled, we will try to compress full - * page images using the PGLZ compression algorithm, after removing the "hole". - * This can reduce the WAL volume, but at some extra cost of CPU spent + * page images using one of the supported algorithms, after removing the + * "hole". This can reduce the WAL volume, but at some extra cost of CPU spent * on the compression during WAL logging. In this case, since the "hole" * length cannot be calculated by subtracting the number of page image bytes * from BLCKSZ, basically it needs to be stored as an extra information. @@ -134,7 +134,7 @@ typedef struct XLogRecordBlockImageHeader uint8 bimg_info; /* flag bits, see below */ /* - * If BKPIMAGE_HAS_HOLE and BKPIMAGE_IS_COMPRESSED, an + * If BKPIMAGE_HAS_HOLE and BKPIMAGE_COMPRESSED(), an * XLogRecordBlockCompressHeader struct follows. */ } XLogRecordBlockImageHeader; @@ -144,9 +144,16 @@ typedef struct XLogRecordBlockImageHeader /* Information stored in bimg_info */ #define BKPIMAGE_HAS_HOLE 0x01 /* page image has "hole" */ -#define BKPIMAGE_IS_COMPRESSED 0x02 /* page image is compressed */ -#define BKPIMAGE_APPLY 0x04 /* page image should be restored during - * replay */ +#define BKPIMAGE_APPLY 0x02 /* page image should be restored + * during replay */ +/* 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 | \ + BKPIMAGE_COMPRESS_ZSTD)) != 0) /* * Extra header information used when page image has "hole" and diff --git a/third_party/spanner_pg/src/include/access/xlogrecovery.h b/third_party/spanner_pg/src/include/access/xlogrecovery.h new file mode 100644 index 00000000..0aa85d90 --- /dev/null +++ b/third_party/spanner_pg/src/include/access/xlogrecovery.h @@ -0,0 +1,157 @@ +/* + * xlogrecovery.h + * + * Functions for WAL recovery and standby mode + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/access/xlogrecovery.h + */ +#ifndef XLOGRECOVERY_H +#define XLOGRECOVERY_H + +#include "access/xlogreader.h" +#include "catalog/pg_control.h" +#include "lib/stringinfo.h" +#include "utils/timestamp.h" + +/* + * Recovery target type. + * Only set during a Point in Time recovery, not when in standby mode. + */ +typedef enum +{ + RECOVERY_TARGET_UNSET, + RECOVERY_TARGET_XID, + RECOVERY_TARGET_TIME, + RECOVERY_TARGET_NAME, + RECOVERY_TARGET_LSN, + RECOVERY_TARGET_IMMEDIATE +} RecoveryTargetType; + +/* + * Recovery target TimeLine goal + */ +typedef enum +{ + RECOVERY_TARGET_TIMELINE_CONTROLFILE, + RECOVERY_TARGET_TIMELINE_LATEST, + RECOVERY_TARGET_TIMELINE_NUMERIC +} RecoveryTargetTimeLineGoal; + +/* Recovery pause states */ +typedef enum RecoveryPauseState +{ + RECOVERY_NOT_PAUSED, /* pause not requested */ + RECOVERY_PAUSE_REQUESTED, /* pause requested, but not yet paused */ + RECOVERY_PAUSED /* recovery is paused */ +} RecoveryPauseState; + +/* User-settable GUC parameters */ +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 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 PGDLLIMPORT bool reachedConsistency; + +/* Are we currently in standby mode? */ +extern PGDLLIMPORT bool StandbyMode; + +extern Size XLogRecoveryShmemSize(void); +extern void XLogRecoveryShmemInit(void); + +extern void InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdownPtr, bool *haveBackupLabel, bool *haveTblspcMap); +extern void PerformWalRecovery(void); + +/* + * FinishWalRecovery() returns this. It contains information about the point + * where recovery ended, and why it ended. + */ +typedef struct +{ + /* + * Information about the last valid or applied record, after which new WAL + * can be appended. 'lastRec' is the position where the last record + * starts, and 'endOfLog' is its end. 'lastPage' is a copy of the last + * partial page that contains endOfLog (or NULL if endOfLog is exactly at + * page boundary). 'lastPageBeginPtr' is the position where the last page + * begins. + * + * endOfLogTLI is the TLI in the filename of the XLOG segment containing + * the last applied record. It could be different from lastRecTLI, if + * there was a timeline switch in that segment, and we were reading the + * old WAL from a segment belonging to a higher timeline. + */ + XLogRecPtr lastRec; /* start of last valid or applied record */ + TimeLineID lastRecTLI; + XLogRecPtr endOfLog; /* end of last valid or applied record */ + TimeLineID endOfLogTLI; + + XLogRecPtr lastPageBeginPtr; /* LSN of page that contains endOfLog */ + char *lastPage; /* copy of the last page, up to endOfLog */ + + /* + * abortedRecPtr is the start pointer of a broken record at end of WAL + * when recovery completes; missingContrecPtr is the location of the first + * contrecord that went missing. See CreateOverwriteContrecordRecord for + * details. + */ + XLogRecPtr abortedRecPtr; + XLogRecPtr missingContrecPtr; + + /* short human-readable string describing why recovery ended */ + char *recoveryStopReason; + + /* + * If standby or recovery signal file was found, these flags are set + * accordingly. + */ + bool standby_signal_file_found; + bool recovery_signal_file_found; +} EndOfWalRecoveryInfo; + +extern EndOfWalRecoveryInfo *FinishWalRecovery(void); +extern void ShutdownWalRecovery(void); +extern void RemovePromoteSignalFiles(void); + +extern bool HotStandbyActive(void); +extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI); +extern RecoveryPauseState GetRecoveryPauseState(void); +extern void SetRecoveryPause(bool recoveryPause); +extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream); +extern TimestampTz GetLatestXTime(void); +extern TimestampTz GetCurrentChunkReplayStartTime(void); +extern XLogRecPtr GetCurrentReplayRecPtr(TimeLineID *replayEndTLI); + +extern bool PromoteIsTriggered(void); +extern bool CheckPromoteSignal(void); +extern void WakeupRecovery(void); + +extern void StartupRequestWalReceiverRestart(void); +extern void XLogRequestWalReceiverReply(void); + +extern void RecoveryRequiresIntParameter(const char *param_name, int currValue, int minValue); + +extern void xlog_outdesc(StringInfo buf, XLogReaderState *record); + +#endif /* XLOGRECOVERY_H */ diff --git a/third_party/spanner_pg/src/include/access/xlogstats.h b/third_party/spanner_pg/src/include/access/xlogstats.h new file mode 100644 index 00000000..7eb4370f --- /dev/null +++ b/third_party/spanner_pg/src/include/access/xlogstats.h @@ -0,0 +1,43 @@ +/*------------------------------------------------------------------------- + * + * 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 + +#include "access/rmgr.h" +#include "access/xlogreader.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/third_party/spanner_pg/src/include/access/xlogutils.h b/third_party/spanner_pg/src/include/access/xlogutils.h index 9ac602b6..c9d0b75a 100644 --- a/third_party/spanner_pg/src/include/access/xlogutils.h +++ b/third_party/spanner_pg/src/include/access/xlogutils.h @@ -3,7 +3,7 @@ * * Utilities for replaying WAL records. * - * 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 * * src/include/access/xlogutils.h @@ -14,6 +14,48 @@ #include "access/xlogreader.h" #include "storage/bufmgr.h" +/* + * Prior to 8.4, all activity during recovery was carried out by the startup + * process. This local variable continues to be used in many parts of the + * code to indicate actions taken by RecoveryManagers. Other processes that + * potentially perform work during recovery should check RecoveryInProgress(). + * See XLogCtl notes in xlog.c. + */ +extern PGDLLIMPORT bool InRecovery; + +/* + * Like InRecovery, standbyState is only valid in the startup process. + * In all other processes it will have the value STANDBY_DISABLED (so + * InHotStandby will read as false). + * + * In DISABLED state, we're performing crash recovery or hot standby was + * disabled in postgresql.conf. + * + * In INITIALIZED state, we've run InitRecoveryTransactionEnvironment, but + * we haven't yet processed a RUNNING_XACTS or shutdown-checkpoint WAL record + * to initialize our primary-transaction tracking system. + * + * When the transaction tracking is initialized, we enter the SNAPSHOT_PENDING + * state. The tracked information might still be incomplete, so we can't allow + * connections yet, but redo functions must update the in-memory state when + * appropriate. + * + * In SNAPSHOT_READY mode, we have full knowledge of transactions that are + * (or were) running on the primary at the current WAL location. Snapshots + * can be taken, and read-only queries can be run. + */ +typedef enum +{ + STANDBY_DISABLED, + STANDBY_INITIALIZED, + STANDBY_SNAPSHOT_PENDING, + STANDBY_SNAPSHOT_READY +} HotStandbyState; + +extern PGDLLIMPORT HotStandbyState standbyState; + +#define InHotStandby (standbyState >= STANDBY_SNAPSHOT_PENDING) + extern bool XLogHaveInvalidPages(void); extern void XLogCheckInvalidPages(void); @@ -33,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); @@ -42,7 +90,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); @@ -50,13 +99,19 @@ 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); extern void wal_segment_close(XLogReaderState *state); extern void XLogReadDetermineTimeline(XLogReaderState *state, - XLogRecPtr wantPage, uint32 wantLength); + XLogRecPtr wantPage, + uint32 wantLength, + TimeLineID currTLI); extern void WALReadRaiseError(WALReadError *errinfo); diff --git a/third_party/spanner_pg/src/include/replication/backup_manifest.h b/third_party/spanner_pg/src/include/backup/backup_manifest.h similarity index 86% rename from third_party/spanner_pg/src/include/replication/backup_manifest.h rename to third_party/spanner_pg/src/include/backup/backup_manifest.h index 09910891..b15f0fa2 100644 --- a/third_party/spanner_pg/src/include/replication/backup_manifest.h +++ b/third_party/spanner_pg/src/include/backup/backup_manifest.h @@ -3,16 +3,16 @@ * backup_manifest.h * Routines for generating a backup manifest. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * - * src/include/replication/backup_manifest.h + * src/include/backup/backup_manifest.h * *------------------------------------------------------------------------- */ #ifndef BACKUP_MANIFEST_H #define BACKUP_MANIFEST_H -#include "access/xlogdefs.h" +#include "backup/basebackup_sink.h" #include "common/checksum_helper.h" #include "pgtime.h" #include "storage/buffile.h" @@ -47,7 +47,8 @@ extern void AddWALInfoToBackupManifest(backup_manifest_info *manifest, XLogRecPtr startptr, TimeLineID starttli, XLogRecPtr endptr, TimeLineID endtli); -extern void SendBackupManifest(backup_manifest_info *manifest); + +extern void SendBackupManifest(backup_manifest_info *manifest, bbsink *sink); extern void FreeBackupManifest(backup_manifest_info *manifest); #endif diff --git a/third_party/spanner_pg/src/include/replication/basebackup.h b/third_party/spanner_pg/src/include/backup/basebackup.h similarity index 90% rename from third_party/spanner_pg/src/include/replication/basebackup.h rename to third_party/spanner_pg/src/include/backup/basebackup.h index 379eb418..593479af 100644 --- a/third_party/spanner_pg/src/include/replication/basebackup.h +++ b/third_party/spanner_pg/src/include/backup/basebackup.h @@ -3,9 +3,9 @@ * basebackup.h * Exports from replication/basebackup.c. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * - * src/include/replication/basebackup.h + * src/include/backup/basebackup.h * *------------------------------------------------------------------------- */ diff --git a/third_party/spanner_pg/src/include/backup/basebackup_sink.h b/third_party/spanner_pg/src/include/backup/basebackup_sink.h new file mode 100644 index 00000000..a1cd24ce --- /dev/null +++ b/third_party/spanner_pg/src/include/backup/basebackup_sink.h @@ -0,0 +1,301 @@ +/*------------------------------------------------------------------------- + * + * basebackup_sink.h + * API for filtering or sending to a final destination the archives + * produced by the base backup process + * + * Taking a base backup produces one archive per tablespace directory, + * plus a backup manifest unless that feature has been disabled. The + * goal of the backup process is to put those archives and that manifest + * someplace, possibly after postprocessing them in some way. A 'bbsink' + * is an object to which those archives, and the manifest if present, + * can be sent. + * + * In practice, there will be a chain of 'bbsink' objects rather than + * just one, with callbacks being forwarded from one to the next, + * possibly with modification. Each object is responsible for a + * single task e.g. command progress reporting, throttling, or + * communication with the client. + * + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group + * + * src/include/backup/basebackup_sink.h + * + *------------------------------------------------------------------------- + */ +#ifndef BASEBACKUP_SINK_H +#define BASEBACKUP_SINK_H + +#include "access/xlog_internal.h" +#include "common/compression.h" +#include "nodes/pg_list.h" + +/* Forward declarations. */ +struct bbsink; +struct bbsink_ops; +typedef struct bbsink bbsink; +typedef struct bbsink_ops bbsink_ops; + +/* + * Overall backup state shared by all bbsink objects for a backup. + * + * Before calling bbstate_begin_backup, caller must initiate a bbsink_state + * object which will last for the lifetime of the backup, and must thereafter + * update it as required before each new call to a bbsink method. The bbsink + * will retain a pointer to the state object and will consult it to understand + * the progress of the backup. + * + * 'tablespaces' is a list of tablespaceinfo objects. It must be set before + * calling bbstate_begin_backup() and must not be modified thereafter. + * + * 'tablespace_num' is the index of the current tablespace within the list + * stored in 'tablespaces'. + * + * 'bytes_done' is the number of bytes read so far from $PGDATA. + * + * 'bytes_total' is the total number of bytes estimated to be present in + * $PGDATA, if we have estimated this. + * + * 'bytes_total_is_valid' is true if and only if a proper estimate has been + * stored into 'bytes_total'. + * + * 'startptr' and 'starttli' identify the point in the WAL stream at which + * the backup began. They must be set before calling bbstate_begin_backup() + * and must not be modified thereafter. + */ +typedef struct bbsink_state +{ + List *tablespaces; + int tablespace_num; + uint64 bytes_done; + uint64 bytes_total; + bool bytes_total_is_valid; + XLogRecPtr startptr; + TimeLineID starttli; +} bbsink_state; + +/* + * Common data for any type of basebackup sink. + * + * 'bbs_ops' is the relevant callback table. + * + * 'bbs_buffer' is the buffer into which data destined for the bbsink + * should be stored. It must be a multiple of BLCKSZ. + * + * 'bbs_buffer_length' is the allocated length of the buffer. + * + * 'bbs_next' is a pointer to another bbsink to which this bbsink is + * forwarding some or all operations. + * + * 'bbs_state' is a pointer to the bbsink_state object for this backup. + * Every bbsink associated with this backup should point to the same + * underlying state object. + * + * In general it is expected that the values of these fields are set when + * a bbsink is created and that they do not change thereafter. It's OK + * to modify the data to which bbs_buffer or bbs_state point, but no changes + * should be made to the contents of this struct. + */ +struct bbsink +{ + const bbsink_ops *bbs_ops; + char *bbs_buffer; + size_t bbs_buffer_length; + bbsink *bbs_next; + bbsink_state *bbs_state; +}; + +/* + * Callbacks for a base backup sink. + * + * All of these callbacks are required. If a particular callback just needs to + * forward the call to sink->bbs_next, use bbsink_forward_ as + * the callback. + * + * Callers should always invoke these callbacks via the bbsink_* inline + * functions rather than calling them directly. + */ +struct bbsink_ops +{ + /* + * This callback is invoked just once, at the very start of the backup. It + * must set bbs_buffer to point to a chunk of storage where at least + * bbs_buffer_length bytes of data can be written. + */ + void (*begin_backup) (bbsink *sink); + + /* + * For each archive transmitted to a bbsink, there will be one call to the + * begin_archive() callback, some number of calls to the + * archive_contents() callback, and then one call to the end_archive() + * callback. + * + * Before invoking the archive_contents() callback, the caller should copy + * a number of bytes equal to what will be passed as len into bbs_buffer, + * but not more than bbs_buffer_length. + * + * It's generally good if the buffer is as full as possible before the + * archive_contents() callback is invoked, but it's not worth expending + * extra cycles to make sure it's absolutely 100% full. + */ + void (*begin_archive) (bbsink *sink, const char *archive_name); + void (*archive_contents) (bbsink *sink, size_t len); + void (*end_archive) (bbsink *sink); + + /* + * If a backup manifest is to be transmitted to a bbsink, there will be + * one call to the begin_manifest() callback, some number of calls to the + * manifest_contents() callback, and then one call to the end_manifest() + * callback. These calls will occur after all archives are transmitted. + * + * The rules for invoking the manifest_contents() callback are the same as + * for the archive_contents() callback above. + */ + void (*begin_manifest) (bbsink *sink); + void (*manifest_contents) (bbsink *sink, size_t len); + void (*end_manifest) (bbsink *sink); + + /* + * This callback is invoked just once, after all archives and the manifest + * have been sent. + */ + void (*end_backup) (bbsink *sink, XLogRecPtr endptr, TimeLineID endtli); + + /* + * If a backup is aborted by an error, this callback is invoked before the + * bbsink object is destroyed, so that it can release any resources that + * would not be released automatically. If no error occurs, this callback + * is invoked after the end_backup callback. + */ + void (*cleanup) (bbsink *sink); +}; + +/* Begin a backup. */ +static inline void +bbsink_begin_backup(bbsink *sink, bbsink_state *state, int buffer_length) +{ + Assert(sink != NULL); + + Assert(buffer_length > 0); + + sink->bbs_state = state; + sink->bbs_buffer_length = buffer_length; + sink->bbs_ops->begin_backup(sink); + + Assert(sink->bbs_buffer != NULL); + Assert((sink->bbs_buffer_length % BLCKSZ) == 0); +} + +/* Begin an archive. */ +static inline void +bbsink_begin_archive(bbsink *sink, const char *archive_name) +{ + Assert(sink != NULL); + + sink->bbs_ops->begin_archive(sink, archive_name); +} + +/* Process some of the contents of an archive. */ +static inline void +bbsink_archive_contents(bbsink *sink, size_t len) +{ + Assert(sink != NULL); + + /* + * The caller should make a reasonable attempt to fill the buffer before + * calling this function, so it shouldn't be completely empty. Nor should + * it be filled beyond capacity. + */ + Assert(len > 0 && len <= sink->bbs_buffer_length); + + sink->bbs_ops->archive_contents(sink, len); +} + +/* Finish an archive. */ +static inline void +bbsink_end_archive(bbsink *sink) +{ + Assert(sink != NULL); + + sink->bbs_ops->end_archive(sink); +} + +/* Begin the backup manifest. */ +static inline void +bbsink_begin_manifest(bbsink *sink) +{ + Assert(sink != NULL); + + sink->bbs_ops->begin_manifest(sink); +} + +/* Process some of the manifest contents. */ +static inline void +bbsink_manifest_contents(bbsink *sink, size_t len) +{ + Assert(sink != NULL); + + /* See comments in bbsink_archive_contents. */ + Assert(len > 0 && len <= sink->bbs_buffer_length); + + sink->bbs_ops->manifest_contents(sink, len); +} + +/* Finish the backup manifest. */ +static inline void +bbsink_end_manifest(bbsink *sink) +{ + Assert(sink != NULL); + + sink->bbs_ops->end_manifest(sink); +} + +/* Finish a backup. */ +static inline void +bbsink_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli) +{ + Assert(sink != NULL); + Assert(sink->bbs_state->tablespace_num == list_length(sink->bbs_state->tablespaces)); + + sink->bbs_ops->end_backup(sink, endptr, endtli); +} + +/* Release resources before destruction. */ +static inline void +bbsink_cleanup(bbsink *sink) +{ + Assert(sink != NULL); + + sink->bbs_ops->cleanup(sink); +} + +/* Forwarding callbacks. Use these to pass operations through to next sink. */ +extern void bbsink_forward_begin_backup(bbsink *sink); +extern void bbsink_forward_begin_archive(bbsink *sink, + const char *archive_name); +extern void bbsink_forward_archive_contents(bbsink *sink, size_t len); +extern void bbsink_forward_end_archive(bbsink *sink); +extern void bbsink_forward_begin_manifest(bbsink *sink); +extern void bbsink_forward_manifest_contents(bbsink *sink, size_t len); +extern void bbsink_forward_end_manifest(bbsink *sink); +extern void bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, + TimeLineID endtli); +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, pg_compress_specification *); +extern bbsink *bbsink_lz4_new(bbsink *next, pg_compress_specification *); +extern bbsink *bbsink_zstd_new(bbsink *next, pg_compress_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); + +/* Extra interface functions for progress reporting. */ +extern void basebackup_progress_wait_checkpoint(void); +extern void basebackup_progress_estimate_backup_size(void); +extern void basebackup_progress_wait_wal_archive(bbsink_state *); +extern void basebackup_progress_transfer_wal(void); +extern void basebackup_progress_done(void); + +#endif diff --git a/third_party/spanner_pg/src/include/backup/basebackup_target.h b/third_party/spanner_pg/src/include/backup/basebackup_target.h new file mode 100644 index 00000000..3a359dd4 --- /dev/null +++ b/third_party/spanner_pg/src/include/backup/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/backup/basebackup_target.h + * + *------------------------------------------------------------------------- + */ +#ifndef BASEBACKUP_TARGET_H +#define BASEBACKUP_TARGET_H + +#include "backup/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 diff --git a/third_party/spanner_pg/src/include/bootstrap/bootstrap.h b/third_party/spanner_pg/src/include/bootstrap/bootstrap.h index 8290d4c6..49d4ad56 100644 --- a/third_party/spanner_pg/src/include/bootstrap/bootstrap.h +++ b/third_party/spanner_pg/src/include/bootstrap/bootstrap.h @@ -4,7 +4,7 @@ * include file for the bootstrapping code * * - * 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 * * src/include/bootstrap/bootstrap.h @@ -27,12 +27,12 @@ #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 AuxiliaryProcessMain(int argc, char *argv[]) pg_attribute_noreturn(); +extern void BootstrapModeMain(int argc, char *argv[], bool check_only) pg_attribute_noreturn(); extern void closerel(char *name); extern void boot_openrel(char *name); diff --git a/third_party/spanner_pg/src/include/c.h b/third_party/spanner_pg/src/include/c.h index 4bc11f21..2c15ba12 100644 --- a/third_party/spanner_pg/src/include/c.h +++ b/third_party/spanner_pg/src/include/c.h @@ -9,7 +9,7 @@ * polluting the namespace with lots of stuff... * * - * 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 * * src/include/c.h @@ -1341,10 +1341,35 @@ extern long long strtoll(const char *str, char **endptr, int base); extern unsigned long long strtoull(const char *str, char **endptr, int base); #endif -/* no special DLL markers on most ports */ +/* + * Thin wrappers that convert strings to exactly 64-bit integers, matching our + * definition of int64. (For the naming, compare that POSIX has + * strtoimax()/strtoumax() which return intmax_t/uintmax_t.) + */ +#ifdef HAVE_LONG_INT_64 +#define strtoi64(str, endptr, base) ((int64) strtol(str, endptr, base)) +#define strtou64(str, endptr, base) ((uint64) strtoul(str, endptr, base)) +#else +#define strtoi64(str, endptr, base) ((int64) strtoll(str, endptr, base)) +#define strtou64(str, endptr, base) ((uint64) strtoull(str, endptr, base)) +#endif + +/* + * Use "extern PGDLLIMPORT ..." to declare variables that are defined + * in the core backend and need to be accessible by loadable modules. + * No special marking is required on most ports. + */ #ifndef PGDLLIMPORT #define PGDLLIMPORT #endif + +/* + * Use "extern PGDLLEXPORT ..." to declare functions that are defined in + * loadable modules and need to be callable by the core backend. (Usually, + * this is not necessary because our build process automatically exports + * such symbols, but sometimes manual marking is required.) + * No special marking is required on most ports. + */ #ifndef PGDLLEXPORT #define PGDLLEXPORT #endif diff --git a/third_party/spanner_pg/src/include/catalog/Makefile b/third_party/spanner_pg/src/include/catalog/Makefile index 81b7b189..9939491c 100644 --- a/third_party/spanner_pg/src/include/catalog/Makefile +++ b/third_party/spanner_pg/src/include/catalog/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/include/catalog # -# 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 # # src/include/catalog/Makefile diff --git a/third_party/spanner_pg/src/include/catalog/binary_upgrade.h b/third_party/spanner_pg/src/include/catalog/binary_upgrade.h index f6e82e7a..0b6944b2 100644 --- a/third_party/spanner_pg/src/include/catalog/binary_upgrade.h +++ b/third_party/spanner_pg/src/include/catalog/binary_upgrade.h @@ -4,7 +4,7 @@ * variables used for binary upgrades * * - * 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 * * src/include/catalog/binary_upgrade.h @@ -14,14 +14,19 @@ #ifndef BINARY_UPGRADE_H #define BINARY_UPGRADE_H +extern PGDLLIMPORT Oid binary_upgrade_next_pg_tablespace_oid; + extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_array_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_mrng_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_mrng_array_pg_type_oid; extern PGDLLIMPORT Oid binary_upgrade_next_heap_pg_class_oid; +extern PGDLLIMPORT Oid binary_upgrade_next_heap_pg_class_relfilenode; extern PGDLLIMPORT Oid binary_upgrade_next_index_pg_class_oid; +extern PGDLLIMPORT Oid binary_upgrade_next_index_pg_class_relfilenode; extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_class_oid; +extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_class_relfilenode; extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid; extern PGDLLIMPORT Oid binary_upgrade_next_pg_authid_oid; diff --git a/third_party/spanner_pg/src/include/catalog/catalog.h b/third_party/spanner_pg/src/include/catalog/catalog.h index f247be50..60c12153 100644 --- a/third_party/spanner_pg/src/include/catalog/catalog.h +++ b/third_party/spanner_pg/src/include/catalog/catalog.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/catalog.c * * - * 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 * * src/include/catalog/catalog.h @@ -34,6 +34,8 @@ extern bool IsReservedName(const char *name); extern bool IsSharedRelation(Oid relationId); +extern bool IsPinnedObject(Oid classId, Oid objectId); + extern Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn); extern Oid GetNewRelFileNode(Oid reltablespace, Relation pg_class, diff --git a/third_party/spanner_pg/src/include/catalog/catversion.h b/third_party/spanner_pg/src/include/catalog/catversion.h index 0a4f4abd..c616a258 100644 --- a/third_party/spanner_pg/src/include/catalog/catversion.h +++ b/third_party/spanner_pg/src/include/catalog/catversion.h @@ -34,7 +34,7 @@ * database contents or layout, such as altering tuple headers. * * - * 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 * * src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202107181 +#define CATALOG_VERSION_NO 202209061 #endif diff --git a/third_party/spanner_pg/src/include/catalog/dependency.h b/third_party/spanner_pg/src/include/catalog/dependency.h index 242026bd..6684933d 100644 --- a/third_party/spanner_pg/src/include/catalog/dependency.h +++ b/third_party/spanner_pg/src/include/catalog/dependency.h @@ -4,7 +4,7 @@ * Routines to support inter-object dependencies. * * - * 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 * * src/include/catalog/dependency.h @@ -36,8 +36,7 @@ typedef enum DependencyType DEPENDENCY_PARTITION_PRI = 'P', DEPENDENCY_PARTITION_SEC = 'S', DEPENDENCY_EXTENSION = 'e', - DEPENDENCY_AUTO_EXTENSION = 'x', - DEPENDENCY_PIN = 'p' + DEPENDENCY_AUTO_EXTENSION = 'x' } DependencyType; /* @@ -47,27 +46,21 @@ typedef enum DependencyType * unless the dependent object is dropped at the same time. There are some * additional rules however: * - * (a) For a SHARED_DEPENDENCY_PIN entry, there is no dependent object -- - * rather, the referenced object is an essential part of the system. This - * applies to the initdb-created superuser. Entries of this type are only - * created by initdb; objects in this category don't need further pg_shdepend - * entries if more objects come to depend on them. - * - * (b) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is + * (a) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is * the role owning the dependent object. The referenced object must be * a pg_authid entry. * - * (c) a SHARED_DEPENDENCY_ACL entry means that the referenced object is + * (b) a SHARED_DEPENDENCY_ACL entry means that the referenced object is * a role mentioned in the ACL field of the dependent object. The referenced * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not * created for the owner of an object; hence two objects may be linked by * one or the other, but not both, of these dependency types.) * - * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is + * (c) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is * a role mentioned in a policy object. The referenced object must be a * pg_authid entry. * - * (e) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced + * (d) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced * object is a tablespace mentioned in a relation without storage. The * referenced object must be a pg_tablespace entry. (Relations that have * storage don't need this: they are protected by the existence of a physical @@ -78,7 +71,6 @@ typedef enum DependencyType */ typedef enum SharedDependencyType { - SHARED_DEPENDENCY_PIN = 'p', SHARED_DEPENDENCY_OWNER = 'o', SHARED_DEPENDENCY_ACL = 'a', SHARED_DEPENDENCY_POLICY = 'r', @@ -128,8 +120,10 @@ 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 */ OCLASS_PUBLICATION_REL, /* pg_publication_rel */ OCLASS_SUBSCRIPTION, /* pg_subscription */ OCLASS_TRANSFORM /* pg_transform */ diff --git a/third_party/spanner_pg/src/include/catalog/duplicate_oids b/third_party/spanner_pg/src/include/catalog/duplicate_oids index ed60e962..e6ee2da0 100755 --- a/third_party/spanner_pg/src/include/catalog/duplicate_oids +++ b/third_party/spanner_pg/src/include/catalog/duplicate_oids @@ -9,7 +9,7 @@ # the same catalog, our project policy is that manually assigned OIDs # should be globally unique, to avoid confusion. # -# 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 # # src/include/catalog/duplicate_oids diff --git a/third_party/spanner_pg/src/include/catalog/genbki.h b/third_party/spanner_pg/src/include/catalog/genbki.h index b1fee54d..f7b491f7 100644 --- a/third_party/spanner_pg/src/include/catalog/genbki.h +++ b/third_party/spanner_pg/src/include/catalog/genbki.h @@ -9,7 +9,7 @@ * bootstrap file from these header files.) * * - * 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 * * 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 @@ -67,18 +71,27 @@ * DECLARE_UNIQUE_INDEX_PKEY. ("PKEY" marks the index as being the catalog's * primary key; currently this is only cosmetically different from a regular * unique index. By convention, we usually make a catalog's OID column its - * pkey, if it has one.) The first two arguments are the index's name and - * OID, the rest is much like a standard 'create index' SQL command. + * pkey, if it has one.) * - * For each index, we also provide a #define for its OID. References to - * the index in the C code should always use these #defines, not the actual - * index name (much less the numeric OID). + * The first two arguments are the index's name and OID. The third argument + * is the name of a #define to generate for its OID. References to the index + * in the C code should always use these #defines, not the actual index name + * (much less the numeric OID). The rest is much like a standard 'create + * index' SQL command. * * The macro definitions are just to keep the C compiler from spitting up. */ -#define DECLARE_INDEX(name,oid,decl) extern int no_such_variable -#define DECLARE_UNIQUE_INDEX(name,oid,decl) extern int no_such_variable -#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,decl) extern int no_such_variable +#define DECLARE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable +#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 diff --git a/third_party/spanner_pg/src/include/catalog/heap.h b/third_party/spanner_pg/src/include/catalog/heap.h index 5660ebff..c67af65b 100644 --- a/third_party/spanner_pg/src/include/catalog/heap.h +++ b/third_party/spanner_pg/src/include/catalog/heap.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/heap.c * * - * 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 * * src/include/catalog/heap.h @@ -59,7 +59,8 @@ extern Relation heap_create(const char *relname, bool mapped_relation, bool allow_system_table_mods, TransactionId *relfrozenxid, - MultiXactId *relminmxid); + MultiXactId *relminmxid, + bool create_storage); extern Oid heap_create_with_catalog(const char *relname, Oid relnamespace, @@ -116,11 +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, @@ -131,9 +127,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/third_party/spanner_pg/src/include/catalog/index.h b/third_party/spanner_pg/src/include/catalog/index.h index 008f723e..a1d6e3b6 100644 --- a/third_party/spanner_pg/src/include/catalog/index.h +++ b/third_party/spanner_pg/src/include/catalog/index.h @@ -4,7 +4,7 @@ * prototypes for catalog/index.c. * * - * 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 * * src/include/catalog/index.h diff --git a/third_party/spanner_pg/src/include/catalog/indexing.h b/third_party/spanner_pg/src/include/catalog/indexing.h index 758ec42e..3fe769be 100644 --- a/third_party/spanner_pg/src/include/catalog/indexing.h +++ b/third_party/spanner_pg/src/include/catalog/indexing.h @@ -5,7 +5,7 @@ * on system catalogs * * - * 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 * * src/include/catalog/indexing.h diff --git a/third_party/spanner_pg/src/include/catalog/namespace.h b/third_party/spanner_pg/src/include/catalog/namespace.h index 21577f55..a583eba2 100644 --- a/third_party/spanner_pg/src/include/catalog/namespace.h +++ b/third_party/spanner_pg/src/include/catalog/namespace.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/namespace.c * * - * 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 * * 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/third_party/spanner_pg/src/include/catalog/objectaccess.h b/third_party/spanner_pg/src/include/catalog/objectaccess.h index 896c3a0f..567ab63e 100644 --- a/third_party/spanner_pg/src/include/catalog/objectaccess.h +++ b/third_party/spanner_pg/src/include/catalog/objectaccess.h @@ -3,7 +3,7 @@ * * Object access hooks. * - * 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 */ @@ -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(classId,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/third_party/spanner_pg/src/include/catalog/objectaddress.h b/third_party/spanner_pg/src/include/catalog/objectaddress.h index 2b4e104b..cf4d8b31 100644 --- a/third_party/spanner_pg/src/include/catalog/objectaddress.h +++ b/third_party/spanner_pg/src/include/catalog/objectaddress.h @@ -3,7 +3,7 @@ * objectaddress.h * functions for working with object addresses * - * 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 * * 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/third_party/spanner_pg/src/include/catalog/partition.h b/third_party/spanner_pg/src/include/catalog/partition.h index c8c7bc1d..b29df669 100644 --- a/third_party/spanner_pg/src/include/catalog/partition.h +++ b/third_party/spanner_pg/src/include/catalog/partition.h @@ -4,7 +4,7 @@ * Header file for structures and utility functions related to * partitioning * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * src/include/catalog/partition.h * diff --git a/third_party/spanner_pg/src/include/catalog/pg_aggregate.dat b/third_party/spanner_pg/src/include/catalog/pg_aggregate.dat index fc6d3bfd..b9110a52 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_aggregate.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_aggregate.dat @@ -3,7 +3,7 @@ # pg_aggregate.dat # Initial contents of the pg_aggregate system catalog. # -# 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 # # src/include/catalog/pg_aggregate.dat @@ -149,6 +149,9 @@ { aggfnoid => 'max(pg_lsn)', aggtransfn => 'pg_lsn_larger', aggcombinefn => 'pg_lsn_larger', aggsortop => '>(pg_lsn,pg_lsn)', aggtranstype => 'pg_lsn' }, +{ aggfnoid => 'max(xid8)', aggtransfn => 'xid8_larger', + aggcombinefn => 'xid8_larger', aggsortop => '>(xid8,xid8)', + aggtranstype => 'xid8' }, # min { aggfnoid => 'min(int8)', aggtransfn => 'int8smaller', @@ -214,6 +217,9 @@ { aggfnoid => 'min(pg_lsn)', aggtransfn => 'pg_lsn_smaller', aggcombinefn => 'pg_lsn_smaller', aggsortop => '<(pg_lsn,pg_lsn)', aggtranstype => 'pg_lsn' }, +{ aggfnoid => 'min(xid8)', aggtransfn => 'xid8_smaller', + aggcombinefn => 'xid8_smaller', aggsortop => '<(xid8,xid8)', + aggtranstype => 'xid8' }, # count { aggfnoid => 'count(any)', aggtransfn => 'int8inc_any', @@ -557,6 +563,10 @@ { 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/third_party/spanner_pg/src/include/catalog/pg_aggregate.h b/third_party/spanner_pg/src/include/catalog/pg_aggregate.h index 25feb416..593da9f7 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_aggregate.h +++ b/third_party/spanner_pg/src/include/catalog/pg_aggregate.h @@ -4,7 +4,7 @@ * definition of the "aggregate" system catalog (pg_aggregate) * * - * 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 * * src/include/catalog/pg_aggregate.h @@ -110,8 +110,7 @@ typedef FormData_pg_aggregate *Form_pg_aggregate; DECLARE_TOAST(pg_aggregate, 4159, 4160); -DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, on pg_aggregate using btree(aggfnoid oid_ops)); -#define AggregateFnoidIndexId 2650 +DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, on pg_aggregate using btree(aggfnoid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_am.dat b/third_party/spanner_pg/src/include/catalog/pg_am.dat index 6082f0e6..3d6653e7 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_am.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_am.dat @@ -3,7 +3,7 @@ # pg_am.dat # Initial contents of the pg_am system catalog. # -# 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 # # src/include/catalog/pg_am.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_am.h b/third_party/spanner_pg/src/include/catalog/pg_am.h index ced86fae..50a68fe4 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_am.h +++ b/third_party/spanner_pg/src/include/catalog/pg_am.h @@ -4,7 +4,7 @@ * definition of the "access method" system catalog (pg_am) * * - * 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 * * src/include/catalog/pg_am.h @@ -47,10 +47,8 @@ CATALOG(pg_am,2601,AccessMethodRelationId) */ typedef FormData_pg_am *Form_pg_am; -DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, on pg_am using btree(amname name_ops)); -#define AmNameIndexId 2651 -DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, on pg_am using btree(oid oid_ops)); -#define AmOidIndexId 2652 +DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, on pg_am using btree(amname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, on pg_am using btree(oid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_amop.dat b/third_party/spanner_pg/src/include/catalog/pg_amop.dat index 81358541..61cd5914 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_amop.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_amop.dat @@ -3,7 +3,7 @@ # pg_amop.dat # Initial contents of the pg_amop system catalog. # -# 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 # # src/include/catalog/pg_amop.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_amop.h b/third_party/spanner_pg/src/include/catalog/pg_amop.h index e1cca35e..6c714b61 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_amop.h +++ b/third_party/spanner_pg/src/include/catalog/pg_amop.h @@ -29,7 +29,7 @@ * intentional denormalization of the catalogs to buy lookup speed. * * - * 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 * * src/include/catalog/pg_amop.h @@ -87,12 +87,9 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId) */ typedef FormData_pg_amop *Form_pg_amop; -DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops)); -#define AccessMethodStrategyIndexId 2653 -DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops)); -#define AccessMethodOperatorIndexId 2654 -DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, on pg_amop using btree(oid oid_ops)); -#define AccessMethodOperatorOidIndexId 2756 +DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops)); +DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, on pg_amop using btree(oid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_amproc.dat b/third_party/spanner_pg/src/include/catalog/pg_amproc.dat index d2445431..135caee6 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_amproc.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_amproc.dat @@ -3,7 +3,7 @@ # pg_amproc.dat # Initial contents of the pg_amproc system catalog. # -# 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 # # src/include/catalog/pg_amproc.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_amproc.h b/third_party/spanner_pg/src/include/catalog/pg_amproc.h index 8a727c35..f529fc60 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_amproc.h +++ b/third_party/spanner_pg/src/include/catalog/pg_amproc.h @@ -18,7 +18,7 @@ * some don't pay attention to non-default functions at all. * * - * 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 * * src/include/catalog/pg_amproc.h @@ -67,9 +67,7 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId) */ typedef FormData_pg_amproc *Form_pg_amproc; -DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops)); -#define AccessMethodProcedureIndexId 2655 -DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, on pg_amproc using btree(oid oid_ops)); -#define AccessMethodProcedureOidIndexId 2757 +DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, on pg_amproc using btree(oid oid_ops)); #endif /* PG_AMPROC_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_attrdef.h b/third_party/spanner_pg/src/include/catalog/pg_attrdef.h index d689ca20..a21dd381 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_attrdef.h +++ b/third_party/spanner_pg/src/include/catalog/pg_attrdef.h @@ -4,7 +4,7 @@ * definition of the "attribute defaults" system catalog (pg_attrdef) * * - * 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 * * 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" /* ---------------- @@ -49,11 +50,21 @@ typedef FormData_pg_attrdef *Form_pg_attrdef; DECLARE_TOAST(pg_attrdef, 2830, 2831); -DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops)); -#define AttrDefaultIndexId 2656 -DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, on pg_attrdef using btree(oid oid_ops)); -#define AttrDefaultOidIndexId 2657 +DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, on pg_attrdef using btree(oid oid_ops)); 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 */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_attribute.h b/third_party/spanner_pg/src/include/catalog/pg_attribute.h index 603392fe..053294c9 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_attribute.h +++ b/third_party/spanner_pg/src/include/catalog/pg_attribute.h @@ -8,7 +8,7 @@ * relations need be included. * * - * 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 * * src/include/catalog/pg_attribute.h @@ -206,10 +206,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75, */ typedef FormData_pg_attribute *Form_pg_attribute; -DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, on pg_attribute using btree(attrelid oid_ops, attname name_ops)); -#define AttributeRelidNameIndexId 2658 -DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops)); -#define AttributeRelidNumIndexId 2659 +DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, on pg_attribute using btree(attrelid oid_ops, attname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_auth_members.h b/third_party/spanner_pg/src/include/catalog/pg_auth_members.h index 76ab90c9..1bc027f1 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_auth_members.h +++ b/third_party/spanner_pg/src/include/catalog/pg_auth_members.h @@ -5,7 +5,7 @@ * (pg_auth_members). * * - * 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 * * src/include/catalog/pg_auth_members.h @@ -42,9 +42,7 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_ */ typedef FormData_pg_auth_members *Form_pg_auth_members; -DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_role_member_index, 2694, on pg_auth_members using btree(roleid oid_ops, member oid_ops)); -#define AuthMemRoleMemIndexId 2694 -DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, on pg_auth_members using btree(member oid_ops, roleid oid_ops)); -#define AuthMemMemRoleIndexId 2695 +DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, on pg_auth_members using btree(roleid oid_ops, member oid_ops)); +DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, on pg_auth_members using btree(member oid_ops, roleid oid_ops)); #endif /* PG_AUTH_MEMBERS_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_authid.dat b/third_party/spanner_pg/src/include/catalog/pg_authid.dat index 3da68016..3343a69d 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_authid.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_authid.dat @@ -3,7 +3,7 @@ # pg_authid.dat # Initial contents of the pg_authid system catalog. # -# 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 # # src/include/catalog/pg_authid.dat @@ -79,5 +79,10 @@ rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f', rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1', rolpassword => '_null_', rolvaliduntil => '_null_' }, +{ oid => '4544', oid_symbol => 'ROLE_PG_CHECKPOINT', + rolname => 'pg_checkpoint', rolsuper => 'f', rolinherit => 't', + rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f', + rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1', + rolpassword => '_null_', rolvaliduntil => '_null_' }, ] diff --git a/third_party/spanner_pg/src/include/catalog/pg_authid.h b/third_party/spanner_pg/src/include/catalog/pg_authid.h index 609bd7fc..3512601c 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_authid.h +++ b/third_party/spanner_pg/src/include/catalog/pg_authid.h @@ -6,7 +6,7 @@ * pg_shadow and pg_group are now publicly accessible views on pg_authid. * * - * 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 * * src/include/catalog/pg_authid.h @@ -55,13 +55,9 @@ 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, on pg_authid using btree(rolname name_ops)); -#define AuthIdRolnameIndexId 2676 -DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, on pg_authid using btree(oid oid_ops)); -#define AuthIdOidIndexId 2677 +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)); #endif /* PG_AUTHID_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_cast.dat b/third_party/spanner_pg/src/include/catalog/pg_cast.dat index 67f73cb6..4471eb6b 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_cast.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_cast.dat @@ -3,7 +3,7 @@ # pg_cast.dat # Initial contents of the pg_cast system catalog. # -# 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 # # src/include/catalog/pg_cast.dat @@ -381,8 +381,6 @@ castcontext => 'a', castmethod => 'f' }, { castsource => 'lseg', casttarget => 'point', castfunc => 'point(lseg)', castcontext => 'e', castmethod => 'f' }, -{ castsource => 'path', casttarget => 'point', castfunc => 'point(path)', - castcontext => 'e', castmethod => 'f' }, { castsource => 'path', casttarget => 'polygon', castfunc => 'polygon(path)', castcontext => 'a', castmethod => 'f' }, { castsource => 'box', casttarget => 'point', castfunc => 'point(box)', diff --git a/third_party/spanner_pg/src/include/catalog/pg_cast.h b/third_party/spanner_pg/src/include/catalog/pg_cast.h index f64a9df5..3c15df00 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_cast.h +++ b/third_party/spanner_pg/src/include/catalog/pg_cast.h @@ -6,7 +6,7 @@ * As of Postgres 8.0, pg_cast describes not only type coercion functions * but also length coercion functions. * - * 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 * * src/include/catalog/pg_cast.h @@ -56,10 +56,8 @@ CATALOG(pg_cast,2605,CastRelationId) */ typedef FormData_pg_cast *Form_pg_cast; -DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, on pg_cast using btree(oid oid_ops)); -#define CastOidIndexId 2660 -DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, on pg_cast using btree(castsource oid_ops, casttarget oid_ops)); -#define CastSourceTargetIndexId 2661 +DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, on pg_cast using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, on pg_cast using btree(castsource oid_ops, casttarget oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_class.dat b/third_party/spanner_pg/src/include/catalog/pg_class.dat index 601abb98..c2cd40d0 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_class.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_class.dat @@ -3,7 +3,7 @@ # pg_class.dat # Initial contents of the pg_class system catalog. # -# 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 # # src/include/catalog/pg_class.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_class.h b/third_party/spanner_pg/src/include/catalog/pg_class.h index 97e329e4..e1f4eefa 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_class.h +++ b/third_party/spanner_pg/src/include/catalog/pg_class.h @@ -4,7 +4,7 @@ * definition of the "relation" system catalog (pg_class) * * - * 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 * * src/include/catalog/pg_class.h @@ -152,12 +152,9 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat */ typedef FormData_pg_class *Form_pg_class; -DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, on pg_class using btree(oid oid_ops)); -#define ClassOidIndexId 2662 -DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, on pg_class using btree(relname name_ops, relnamespace oid_ops)); -#define ClassNameNspIndexId 2663 -DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops)); -#define ClassTblspcRelfilenodeIndexId 3455 +DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, on pg_class using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, on pg_class using btree(relname name_ops, relnamespace oid_ops)); +DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE @@ -201,6 +198,32 @@ DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, on pg_class using btree(r (relkind) == RELKIND_TOASTVALUE || \ (relkind) == RELKIND_MATVIEW) +#define RELKIND_HAS_PARTITIONS(relkind) \ + ((relkind) == RELKIND_PARTITIONED_TABLE || \ + (relkind) == RELKIND_PARTITIONED_INDEX) + +/* + * Relation kinds that support tablespaces: All relation kinds with storage + * support tablespaces, except that we don't support moving sequences around + * into different tablespaces. Partitioned tables and indexes don't have + * physical storage, but they have a tablespace settings so that their + * children can inherit it. + */ +#define RELKIND_HAS_TABLESPACE(relkind) \ + ((RELKIND_HAS_STORAGE(relkind) || RELKIND_HAS_PARTITIONS(relkind)) \ + && (relkind) != RELKIND_SEQUENCE) + +/* + * Relation kinds with a table access method (rd_tableam). Although sequences + * use the heap table AM, they are enough of a special case in most uses that + * they are not included here. + */ +#define RELKIND_HAS_TABLE_AM(relkind) \ + ((relkind) == RELKIND_RELATION || \ + (relkind) == RELKIND_TOASTVALUE || \ + (relkind) == RELKIND_MATVIEW) + +extern int errdetail_relkind_not_supported(char relkind); #endif /* EXPOSE_TO_CLIENT_CODE */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_collation.dat b/third_party/spanner_pg/src/include/catalog/pg_collation.dat index 6e0ab1ab..f7470ead 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_collation.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_collation.dat @@ -3,7 +3,7 @@ # pg_collation.dat # Initial contents of the pg_collation system catalog. # -# 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 # # 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/third_party/spanner_pg/src/include/catalog/pg_collation.h b/third_party/spanner_pg/src/include/catalog/pg_collation.h index 6adbeab6..2190ccb5 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_collation.h +++ b/third_party/spanner_pg/src/include/catalog/pg_collation.h @@ -4,7 +4,7 @@ * definition of the "collation" system catalog (pg_collation) * * - * 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 * * src/include/catalog/pg_collation.h @@ -39,9 +39,10 @@ CATALOG(pg_collation,3456,CollationRelationId) char collprovider; /* see constants below */ bool collisdeterministic BKI_DEFAULT(t); int32 collencoding; /* encoding for this collation; -1 = "all" */ - NameData collcollate; /* LC_COLLATE setting */ - NameData collctype; /* LC_CTYPE setting */ #ifdef CATALOG_VARLEN /* variable-length fields start here */ + 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 */ @@ -57,10 +58,8 @@ typedef FormData_pg_collation *Form_pg_collation; DECLARE_TOAST(pg_collation, 6175, 6176); -DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops)); -#define CollationNameEncNspIndexId 3164 -DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, on pg_collation using btree(oid oid_ops)); -#define CollationOidIndexId 3085 +DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, on pg_collation using btree(oid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE @@ -68,6 +67,20 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, on pg_collation using bt #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 */ @@ -77,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/third_party/spanner_pg/src/include/catalog/pg_constraint.h b/third_party/spanner_pg/src/include/catalog/pg_constraint.h index 85622393..4852f015 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_constraint.h +++ b/third_party/spanner_pg/src/include/catalog/pg_constraint.h @@ -4,7 +4,7 @@ * definition of the "constraint" system catalog (pg_constraint) * * - * 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 * * src/include/catalog/pg_constraint.h @@ -138,6 +138,12 @@ CATALOG(pg_constraint,2606,ConstraintRelationId) */ Oid conffeqop[1] BKI_LOOKUP(pg_operator); + /* + * If a foreign key with an ON DELETE SET NULL/DEFAULT action, the subset + * of conkey to updated. If null, all columns are updated. + */ + int16 confdelsetcols[1]; + /* * If an exclusion constraint, the OIDs of the exclusion operators for * each column of the constraint @@ -160,16 +166,11 @@ typedef FormData_pg_constraint *Form_pg_constraint; DECLARE_TOAST(pg_constraint, 2832, 2833); -DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, on pg_constraint using btree(conname name_ops, connamespace oid_ops)); -#define ConstraintNameNspIndexId 2664 -DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, on pg_constraint using btree(conrelid oid_ops, contypid oid_ops, conname name_ops)); -#define ConstraintRelidTypidNameIndexId 2665 -DECLARE_INDEX(pg_constraint_contypid_index, 2666, on pg_constraint using btree(contypid oid_ops)); -#define ConstraintTypidIndexId 2666 -DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, on pg_constraint using btree(oid oid_ops)); -#define ConstraintOidIndexId 2667 -DECLARE_INDEX(pg_constraint_conparentid_index, 2579, on pg_constraint using btree(conparentid oid_ops)); -#define ConstraintParentIndexId 2579 +DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, on pg_constraint using btree(conname name_ops, connamespace oid_ops)); +DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, on pg_constraint using btree(conrelid oid_ops, contypid oid_ops, conname name_ops)); +DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, on pg_constraint using btree(contypid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, on pg_constraint using btree(oid oid_ops)); +DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, on pg_constraint using btree(conparentid oid_ops)); /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */ DECLARE_ARRAY_FOREIGN_KEY_OPT((conrelid, conkey), pg_attribute, (attrelid, attnum)); @@ -225,6 +226,8 @@ extern Oid CreateConstraintEntry(const char *constraintName, int foreignNKeys, char foreignUpdateType, char foreignDeleteType, + const int16 *fkDeleteSetCols, + int numFkDeleteSetCols, char foreignMatchType, const Oid *exclOp, Node *conExpr, @@ -260,7 +263,8 @@ extern Bitmapset *get_primary_key_attnos_UNUSED_SPANGRES(Oid relid, bool deferra Oid *constraintOid); extern void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, - Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs); + Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs, + int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols); extern bool check_functional_grouping(Oid relid, Index varno, Index varlevelsup, diff --git a/third_party/spanner_pg/src/include/catalog/pg_control.h b/third_party/spanner_pg/src/include/catalog/pg_control.h index 749bce0c..06368e23 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_control.h +++ b/third_party/spanner_pg/src/include/catalog/pg_control.h @@ -5,7 +5,7 @@ * However, we define it here so that the format is documented. * * - * 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 * * 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/third_party/spanner_pg/src/include/catalog/pg_conversion.dat b/third_party/spanner_pg/src/include/catalog/pg_conversion.dat index d8ba3a6c..17f3f16a 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_conversion.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_conversion.dat @@ -3,7 +3,7 @@ # pg_conversion.dat # Initial contents of the pg_conversion system catalog. # -# 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 # # src/include/catalog/pg_conversion.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_conversion.h b/third_party/spanner_pg/src/include/catalog/pg_conversion.h index ca556f60..fb26123a 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_conversion.h +++ b/third_party/spanner_pg/src/include/catalog/pg_conversion.h @@ -3,7 +3,7 @@ * pg_conversion.h * definition of the "conversion" system catalog (pg_conversion) * - * 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 * * src/include/catalog/pg_conversion.h @@ -60,12 +60,9 @@ CATALOG(pg_conversion,2607,ConversionRelationId) */ typedef FormData_pg_conversion *Form_pg_conversion; -DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops)); -#define ConversionDefaultIndexId 2668 -DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, on pg_conversion using btree(conname name_ops, connamespace oid_ops)); -#define ConversionNameNspIndexId 2669 -DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, on pg_conversion using btree(oid oid_ops)); -#define ConversionOidIndexId 2670 +DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, on pg_conversion using btree(conname name_ops, connamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, on pg_conversion using btree(oid oid_ops)); extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace, diff --git a/third_party/spanner_pg/src/include/catalog/pg_database.dat b/third_party/spanner_pg/src/include/catalog/pg_database.dat index b8aa1364..47dcbfb3 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_database.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_database.dat @@ -3,7 +3,7 @@ # pg_database.dat # Initial contents of the pg_database system catalog. # -# 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 # # src/include/catalog/pg_database.dat @@ -12,11 +12,12 @@ [ -{ oid => '1', oid_symbol => 'TemplateDbOid', +{ oid => '1', oid_symbol => 'Template1DbOid', descr => 'default template for new databases', - datname => 'template1', encoding => 'ENCODING', datcollate => 'LC_COLLATE', - datctype => 'LC_CTYPE', datistemplate => 't', datallowconn => 't', - datconnlimit => '-1', datlastsysoid => '0', datfrozenxid => '0', - datminmxid => '1', dattablespace => 'pg_default', datacl => '_null_' }, + 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', daticulocale => 'ICU_LOCALE', datacl => '_null_' }, ] diff --git a/third_party/spanner_pg/src/include/catalog/pg_database.h b/third_party/spanner_pg/src/include/catalog/pg_database.h index acba8a39..48dec14a 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_database.h +++ b/third_party/spanner_pg/src/include/catalog/pg_database.h @@ -4,7 +4,7 @@ * definition of the "database" system catalog (pg_database) * * - * 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 * * src/include/catalog/pg_database.h @@ -40,11 +40,8 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID /* character encoding */ int32 encoding; - /* LC_COLLATE setting */ - NameData datcollate; - - /* LC_CTYPE setting */ - NameData datctype; + /* locale provider, see pg_collation.collprovider */ + char datlocprovider; /* allowed as CREATE DATABASE template? */ bool datistemplate; @@ -58,9 +55,6 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID */ int32 datconnlimit; - /* highest OID to consider a system OID */ - Oid datlastsysoid; - /* all Xids < this are frozen in this DB */ TransactionId datfrozenxid; @@ -71,6 +65,18 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID Oid dattablespace BKI_LOOKUP(pg_tablespace); #ifdef CATALOG_VARLEN /* variable-length fields start here */ + /* LC_COLLATE setting */ + text datcollate BKI_FORCE_NOT_NULL; + + /* 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_); + /* access permissions */ aclitem datacl[1]; #endif @@ -83,14 +89,19 @@ 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, on pg_database using btree(datname name_ops)); -#define DatabaseNameIndexId 2671 -DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, on pg_database using btree(oid oid_ops)); -#define DatabaseOidIndexId 2672 +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); /* * Special values for pg_database.datconnlimit. Normal values are >= 0. diff --git a/third_party/spanner_pg/src/include/catalog/pg_db_role_setting.h b/third_party/spanner_pg/src/include/catalog/pg_db_role_setting.h index 705f698a..45d478e9 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_db_role_setting.h +++ b/third_party/spanner_pg/src/include/catalog/pg_db_role_setting.h @@ -5,7 +5,7 @@ * configuration settings (pg_db_role_setting) * * - * 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 * * src/include/catalog/pg_db_role_setting.h @@ -46,12 +46,9 @@ 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, on pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops)); -#define DbRoleSettingDatidRolidIndexId 2965 +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)); /* * prototypes for functions in pg_db_role_setting.h diff --git a/third_party/spanner_pg/src/include/catalog/pg_default_acl.h b/third_party/spanner_pg/src/include/catalog/pg_default_acl.h index 156fc071..2a791556 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_default_acl.h +++ b/third_party/spanner_pg/src/include/catalog/pg_default_acl.h @@ -5,7 +5,7 @@ * (pg_default_acl) * * - * 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 * * src/include/catalog/pg_default_acl.h @@ -51,10 +51,8 @@ typedef FormData_pg_default_acl *Form_pg_default_acl; DECLARE_TOAST(pg_default_acl, 4143, 4144); -DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops)); -#define DefaultAclRoleNspObjIndexId 827 -DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, on pg_default_acl using btree(oid oid_ops)); -#define DefaultAclOidIndexId 828 +DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, on pg_default_acl using btree(oid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_depend.h b/third_party/spanner_pg/src/include/catalog/pg_depend.h index e0bc1141..2f736ecd 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_depend.h +++ b/third_party/spanner_pg/src/include/catalog/pg_depend.h @@ -4,8 +4,9 @@ * definition of the "dependency" system catalog (pg_depend) * * pg_depend has no preloaded contents, so there is no pg_depend.dat - * file; system-defined dependencies are loaded into it during a late stage - * of the initdb process. + * file; dependencies for system-defined objects are loaded into it + * on-the-fly during initdb. Most built-in objects are pinned anyway, + * and hence need no explicit entries in pg_depend. * * NOTE: we do not represent all possible dependency pairs in pg_depend; * for example, there's not much value in creating an explicit dependency @@ -16,7 +17,7 @@ * convenient to find from the contents of other catalogs. * * - * 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 * * src/include/catalog/pg_depend.h @@ -42,11 +43,9 @@ CATALOG(pg_depend,2608,DependRelationId) { /* * Identification of the dependent (referencing) object. - * - * These fields are all zeroes for a DEPENDENCY_PIN entry. */ - Oid classid BKI_LOOKUP_OPT(pg_class); /* OID of table containing - * object */ + Oid classid BKI_LOOKUP(pg_class); /* OID of table containing + * object */ Oid objid; /* OID of object itself */ int32 objsubid; /* column number, or 0 if not used */ @@ -72,9 +71,7 @@ CATALOG(pg_depend,2608,DependRelationId) */ typedef FormData_pg_depend *Form_pg_depend; -DECLARE_INDEX(pg_depend_depender_index, 2673, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops)); -#define DependDependerIndexId 2673 -DECLARE_INDEX(pg_depend_reference_index, 2674, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops)); -#define DependReferenceIndexId 2674 +DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops)); +DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops)); #endif /* PG_DEPEND_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_description.h b/third_party/spanner_pg/src/include/catalog/pg_description.h index adc06a85..67636ba9 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_description.h +++ b/third_party/spanner_pg/src/include/catalog/pg_description.h @@ -23,7 +23,7 @@ * for example). * * - * 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 * * src/include/catalog/pg_description.h @@ -65,8 +65,7 @@ typedef FormData_pg_description * Form_pg_description; DECLARE_TOAST(pg_description, 2834, 2835); -DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); -#define DescriptionObjIndexId 2675 +DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */ DECLARE_FOREIGN_KEY((classoid), pg_class, (oid)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_enum.h b/third_party/spanner_pg/src/include/catalog/pg_enum.h index 78a183b2..9c6deddc 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_enum.h +++ b/third_party/spanner_pg/src/include/catalog/pg_enum.h @@ -4,7 +4,7 @@ * definition of the "enum" system catalog (pg_enum) * * - * 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 * * src/include/catalog/pg_enum.h @@ -43,12 +43,9 @@ CATALOG(pg_enum,3501,EnumRelationId) */ typedef FormData_pg_enum *Form_pg_enum; -DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, on pg_enum using btree(oid oid_ops)); -#define EnumOidIndexId 3502 -DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops)); -#define EnumTypIdLabelIndexId 3503 -DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops)); -#define EnumTypIdSortOrderIndexId 3534 +DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, on pg_enum using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops)); +DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops)); /* * prototypes for functions in pg_enum.c diff --git a/third_party/spanner_pg/src/include/catalog/pg_event_trigger.h b/third_party/spanner_pg/src/include/catalog/pg_event_trigger.h index eeaa6be5..3fe0e8db 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_event_trigger.h +++ b/third_party/spanner_pg/src/include/catalog/pg_event_trigger.h @@ -4,7 +4,7 @@ * definition of the "event trigger" system catalog (pg_event_trigger) * * - * 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 * * src/include/catalog/pg_event_trigger.h @@ -51,9 +51,7 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger; DECLARE_TOAST(pg_event_trigger, 4145, 4146); -DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, on pg_event_trigger using btree(evtname name_ops)); -#define EventTriggerNameIndexId 3467 -DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, on pg_event_trigger using btree(oid oid_ops)); -#define EventTriggerOidIndexId 3468 +DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, on pg_event_trigger using btree(evtname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, on pg_event_trigger using btree(oid oid_ops)); #endif /* PG_EVENT_TRIGGER_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_extension.h b/third_party/spanner_pg/src/include/catalog/pg_extension.h index 2d6ad9fa..43d16d48 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_extension.h +++ b/third_party/spanner_pg/src/include/catalog/pg_extension.h @@ -4,7 +4,7 @@ * definition of the "extension" system catalog (pg_extension) * * - * 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 * * src/include/catalog/pg_extension.h @@ -53,9 +53,7 @@ typedef FormData_pg_extension *Form_pg_extension; DECLARE_TOAST(pg_extension, 4147, 4148); -DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, on pg_extension using btree(oid oid_ops)); -#define ExtensionOidIndexId 3080 -DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, on pg_extension using btree(extname name_ops)); -#define ExtensionNameIndexId 3081 +DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, on pg_extension using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, on pg_extension using btree(extname name_ops)); #endif /* PG_EXTENSION_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_foreign_data_wrapper.h b/third_party/spanner_pg/src/include/catalog/pg_foreign_data_wrapper.h index f6240d9e..86db6546 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_foreign_data_wrapper.h +++ b/third_party/spanner_pg/src/include/catalog/pg_foreign_data_wrapper.h @@ -4,7 +4,7 @@ * definition of the "foreign-data wrapper" system catalog (pg_foreign_data_wrapper) * * - * 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 * * src/include/catalog/pg_foreign_data_wrapper.h @@ -52,9 +52,7 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper; DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, on pg_foreign_data_wrapper using btree(oid oid_ops)); -#define ForeignDataWrapperOidIndexId 112 -DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, on pg_foreign_data_wrapper using btree(fdwname name_ops)); -#define ForeignDataWrapperNameIndexId 548 +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, on pg_foreign_data_wrapper using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, on pg_foreign_data_wrapper using btree(fdwname name_ops)); #endif /* PG_FOREIGN_DATA_WRAPPER_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_foreign_server.h b/third_party/spanner_pg/src/include/catalog/pg_foreign_server.h index a173699a..dcef33de 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_foreign_server.h +++ b/third_party/spanner_pg/src/include/catalog/pg_foreign_server.h @@ -3,7 +3,7 @@ * pg_foreign_server.h * definition of the "foreign server" system catalog (pg_foreign_server) * - * 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 * * src/include/catalog/pg_foreign_server.h @@ -49,9 +49,7 @@ typedef FormData_pg_foreign_server *Form_pg_foreign_server; DECLARE_TOAST(pg_foreign_server, 4151, 4152); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, on pg_foreign_server using btree(oid oid_ops)); -#define ForeignServerOidIndexId 113 -DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, on pg_foreign_server using btree(srvname name_ops)); -#define ForeignServerNameIndexId 549 +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, on pg_foreign_server using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, on pg_foreign_server using btree(srvname name_ops)); #endif /* PG_FOREIGN_SERVER_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_foreign_table.h b/third_party/spanner_pg/src/include/catalog/pg_foreign_table.h index 3b6221b0..88753cd5 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_foreign_table.h +++ b/third_party/spanner_pg/src/include/catalog/pg_foreign_table.h @@ -3,7 +3,7 @@ * pg_foreign_table.h * definition of the "foreign table" system catalog (pg_foreign_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 * * src/include/catalog/pg_foreign_table.h @@ -44,7 +44,6 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table; DECLARE_TOAST(pg_foreign_table, 4153, 4154); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, on pg_foreign_table using btree(ftrelid oid_ops)); -#define ForeignTableRelidIndexId 3119 +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, on pg_foreign_table using btree(ftrelid oid_ops)); #endif /* PG_FOREIGN_TABLE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_index.h b/third_party/spanner_pg/src/include/catalog/pg_index.h index 00d0b439..f853846e 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_index.h +++ b/third_party/spanner_pg/src/include/catalog/pg_index.h @@ -4,7 +4,7 @@ * definition of the "index" system catalog (pg_index) * * - * 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 * * src/include/catalog/pg_index.h @@ -34,6 +34,7 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO int16 indnatts; /* total number of columns in index */ int16 indnkeyatts; /* number of key columns in index */ bool indisunique; /* is this a unique index? */ + bool indnullsnotdistinct; /* null treatment in unique index */ bool indisprimary; /* is this index for primary key? */ bool indisexclusion; /* is this index for exclusion constraint? */ bool indimmediate; /* is uniqueness enforced immediately? */ @@ -68,10 +69,8 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO */ typedef FormData_pg_index *Form_pg_index; -DECLARE_INDEX(pg_index_indrelid_index, 2678, on pg_index using btree(indrelid oid_ops)); -#define IndexIndrelidIndexId 2678 -DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, on pg_index using btree(indexrelid oid_ops)); -#define IndexRelidIndexId 2679 +DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, on pg_index using btree(indrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, on pg_index using btree(indexrelid oid_ops)); /* indkey can contain zero (InvalidAttrNumber) to represent expressions */ DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_inherits.h b/third_party/spanner_pg/src/include/catalog/pg_inherits.h index f47c0a8c..b5a32755 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_inherits.h +++ b/third_party/spanner_pg/src/include/catalog/pg_inherits.h @@ -4,7 +4,7 @@ * definition of the "inherits" system catalog (pg_inherits) * * - * 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 * * src/include/catalog/pg_inherits.h @@ -44,10 +44,8 @@ CATALOG(pg_inherits,2611,InheritsRelationId) */ typedef FormData_pg_inherits *Form_pg_inherits; -DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops)); -#define InheritsRelidSeqnoIndexId 2680 -DECLARE_INDEX(pg_inherits_parent_index, 2187, on pg_inherits using btree(inhparent oid_ops)); -#define InheritsParentIndexId 2187 +DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops)); +DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, on pg_inherits using btree(inhparent oid_ops)); extern List *find_inheritance_children(Oid parentrelId, LOCKMODE lockmode); diff --git a/third_party/spanner_pg/src/include/catalog/pg_init_privs.h b/third_party/spanner_pg/src/include/catalog/pg_init_privs.h index 4aafeb24..c226edc4 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_init_privs.h +++ b/third_party/spanner_pg/src/include/catalog/pg_init_privs.h @@ -21,7 +21,7 @@ * are loaded near the end of initdb. * * - * 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 * * src/include/catalog/pg_init_privs.h @@ -65,8 +65,7 @@ typedef FormData_pg_init_privs * Form_pg_init_privs; DECLARE_TOAST(pg_init_privs, 4155, 4156); -DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, on pg_init_privs using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); -#define InitPrivsObjIndexId 3395 +DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, on pg_init_privs using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); /* * It is important to know if the initial privileges are from initdb or from an diff --git a/third_party/spanner_pg/src/include/catalog/pg_language.dat b/third_party/spanner_pg/src/include/catalog/pg_language.dat index a5846799..1663c964 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_language.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_language.dat @@ -3,7 +3,7 @@ # pg_language.dat # Initial contents of the pg_language system catalog. # -# 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 # # src/include/catalog/pg_language.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_language.h b/third_party/spanner_pg/src/include/catalog/pg_language.h index 3e56597e..4b9c2595 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_language.h +++ b/third_party/spanner_pg/src/include/catalog/pg_language.h @@ -4,7 +4,7 @@ * definition of the "language" system catalog (pg_language) * * - * 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 * * src/include/catalog/pg_language.h @@ -66,9 +66,7 @@ typedef FormData_pg_language *Form_pg_language; DECLARE_TOAST(pg_language, 4157, 4158); -DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, on pg_language using btree(lanname name_ops)); -#define LanguageNameIndexId 2681 -DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, on pg_language using btree(oid oid_ops)); -#define LanguageOidIndexId 2682 +DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, on pg_language using btree(lanname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, on pg_language using btree(oid oid_ops)); #endif /* PG_LANGUAGE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_largeobject.h b/third_party/spanner_pg/src/include/catalog/pg_largeobject.h index 32225f4d..1fd076d7 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_largeobject.h +++ b/third_party/spanner_pg/src/include/catalog/pg_largeobject.h @@ -4,7 +4,7 @@ * definition of the "large object" system catalog (pg_largeobject) * * - * 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 * * src/include/catalog/pg_largeobject.h @@ -44,8 +44,7 @@ CATALOG(pg_largeobject,2613,LargeObjectRelationId) */ typedef FormData_pg_largeobject *Form_pg_largeobject; -DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, on pg_largeobject using btree(loid oid_ops, pageno int4_ops)); -#define LargeObjectLOidPNIndexId 2683 +DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, on pg_largeobject using btree(loid oid_ops, pageno int4_ops)); extern Oid LargeObjectCreate(Oid loid); extern void LargeObjectDrop(Oid loid); diff --git a/third_party/spanner_pg/src/include/catalog/pg_largeobject_metadata.h b/third_party/spanner_pg/src/include/catalog/pg_largeobject_metadata.h index 9b689bab..ec1c3bf7 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_largeobject_metadata.h +++ b/third_party/spanner_pg/src/include/catalog/pg_largeobject_metadata.h @@ -5,7 +5,7 @@ * (pg_largeobject_metadata) * * - * 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 * * src/include/catalog/pg_largeobject_metadata.h @@ -46,7 +46,6 @@ CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId) */ typedef FormData_pg_largeobject_metadata *Form_pg_largeobject_metadata; -DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, on pg_largeobject_metadata using btree(oid oid_ops)); -#define LargeObjectMetadataOidIndexId 2996 +DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, on pg_largeobject_metadata using btree(oid oid_ops)); #endif /* PG_LARGEOBJECT_METADATA_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_namespace.dat b/third_party/spanner_pg/src/include/catalog/pg_namespace.dat index 2ed136b7..9f1d27cd 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_namespace.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_namespace.dat @@ -3,7 +3,7 @@ # pg_namespace.dat # Initial contents of the pg_namespace system catalog. # -# 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 # # src/include/catalog/pg_namespace.dat @@ -18,8 +18,9 @@ { oid => '99', oid_symbol => 'PG_TOAST_NAMESPACE', descr => 'reserved schema for TOAST tables', nspname => 'pg_toast', nspacl => '_null_' }, +# update dumpNamespace() if changing this descr { oid => '2200', oid_symbol => 'PG_PUBLIC_NAMESPACE', descr => 'standard public schema', - nspname => 'public', nspacl => '_null_' }, + nspname => 'public', nspowner => 'pg_database_owner', nspacl => '_null_' }, ] diff --git a/third_party/spanner_pg/src/include/catalog/pg_namespace.h b/third_party/spanner_pg/src/include/catalog/pg_namespace.h index fe87a947..ba56e44d 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_namespace.h +++ b/third_party/spanner_pg/src/include/catalog/pg_namespace.h @@ -4,7 +4,7 @@ * definition of the "namespace" system catalog (pg_namespace) * * - * 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 * * src/include/catalog/pg_namespace.h @@ -53,10 +53,8 @@ typedef FormData_pg_namespace *Form_pg_namespace; DECLARE_TOAST(pg_namespace, 4163, 4164); -DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, on pg_namespace using btree(nspname name_ops)); -#define NamespaceNameIndexId 2684 -DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, on pg_namespace using btree(oid oid_ops)); -#define NamespaceOidIndexId 2685 +DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, on pg_namespace using btree(nspname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, on pg_namespace using btree(oid oid_ops)); /* * prototypes for functions in pg_namespace.c diff --git a/third_party/spanner_pg/src/include/catalog/pg_opclass.dat b/third_party/spanner_pg/src/include/catalog/pg_opclass.dat index 484727a2..dbcae7ff 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_opclass.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_opclass.dat @@ -3,7 +3,7 @@ # pg_opclass.dat # Initial contents of the pg_opclass system catalog. # -# 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 # # src/include/catalog/pg_opclass.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_opclass.h b/third_party/spanner_pg/src/include/catalog/pg_opclass.h index 7b2cf259..3a3a19b8 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_opclass.h +++ b/third_party/spanner_pg/src/include/catalog/pg_opclass.h @@ -24,7 +24,7 @@ * AMs support this. * * - * 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 * * src/include/catalog/pg_opclass.h @@ -82,9 +82,7 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId) */ typedef FormData_pg_opclass *Form_pg_opclass; -DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops)); -#define OpclassAmNameNspIndexId 2686 -DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, on pg_opclass using btree(oid oid_ops)); -#define OpclassOidIndexId 2687 +DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, on pg_opclass using btree(oid oid_ops)); #endif /* PG_OPCLASS_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_operator.dat b/third_party/spanner_pg/src/include/catalog/pg_operator.dat index 89c73acd..bc5f8213 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_operator.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_operator.dat @@ -3,7 +3,7 @@ # pg_operator.dat # Initial contents of the pg_operator system catalog. # -# 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 # # src/include/catalog/pg_operator.dat @@ -102,7 +102,7 @@ oprright => 'text', oprresult => 'bool', oprcom => '=(text,text)', oprnegate => '<>(text,text)', oprcode => 'texteq', oprrest => 'eqsel', oprjoin => 'eqjoinsel' }, -{ oid => '3877', descr => 'starts with', +{ oid => '3877', oid_symbol => 'TextPrefixOperator', descr => 'starts with', oprname => '^@', oprleft => 'text', oprright => 'text', oprresult => 'bool', oprcode => 'starts_with', oprrest => 'prefixsel', oprjoin => 'prefixjoinsel' }, @@ -1177,9 +1177,6 @@ { oid => '969', descr => 'center of', oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'lseg', oprresult => 'point', oprcode => 'lseg_center' }, -{ oid => '970', descr => 'center of', - oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'path', - oprresult => 'point', oprcode => 'path_center' }, { oid => '971', descr => 'center of', oprname => '@@', oprkind => 'l', oprleft => '0', oprright => 'polygon', oprresult => 'point', oprcode => 'poly_center' }, @@ -1742,14 +1739,6 @@ oprresult => 'float8', oprcom => '<->(circle,polygon)', oprcode => 'dist_polyc' }, -# additional geometric operators - thomas 1997-07-09 -{ oid => '1524', descr => 'distance between', - oprname => '<->', oprleft => 'line', oprright => 'box', oprresult => 'float8', - oprcom => '<->(box,line)', oprcode => 'dist_lb' }, -{ oid => '1382', descr => 'distance between', - oprname => '<->', oprleft => 'box', oprright => 'line', oprresult => 'float8', - oprcom => '<->(line,box)', oprcode => 'dist_bl' }, - { oid => '1525', descr => 'intersect', oprname => '?#', oprleft => 'lseg', oprright => 'lseg', oprresult => 'bool', oprcom => '?#(lseg,lseg)', oprcode => 'lseg_intersect' }, @@ -1805,15 +1794,9 @@ oprname => '##', oprleft => 'point', oprright => 'box', oprresult => 'point', oprcode => 'close_pb' }, -{ oid => '1566', descr => 'closest point to A on B', - oprname => '##', oprleft => 'lseg', oprright => 'line', oprresult => 'point', - oprcode => 'close_sl' }, { oid => '1567', descr => 'closest point to A on B', oprname => '##', oprleft => 'lseg', oprright => 'box', oprresult => 'point', oprcode => 'close_sb' }, -{ oid => '1568', descr => 'closest point to A on B', - oprname => '##', oprleft => 'line', oprright => 'box', oprresult => 'point', - oprcode => 'close_lb' }, { oid => '1577', descr => 'closest point to A on B', oprname => '##', oprleft => 'line', oprright => 'lseg', oprresult => 'point', oprcode => 'close_ls' }, diff --git a/third_party/spanner_pg/src/include/catalog/pg_operator.h b/third_party/spanner_pg/src/include/catalog/pg_operator.h index a40e38a5..51263f55 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_operator.h +++ b/third_party/spanner_pg/src/include/catalog/pg_operator.h @@ -4,7 +4,7 @@ * definition of the "operator" system catalog (pg_operator) * * - * 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 * * src/include/catalog/pg_operator.h @@ -82,10 +82,8 @@ CATALOG(pg_operator,2617,OperatorRelationId) */ typedef FormData_pg_operator *Form_pg_operator; -DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, on pg_operator using btree(oid oid_ops)); -#define OperatorOidIndexId 2688 -DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops)); -#define OperatorNameNspIndexId 2689 +DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, on pg_operator using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops)); extern ObjectAddress OperatorCreate(const char *operatorName, diff --git a/third_party/spanner_pg/src/include/catalog/pg_opfamily.dat b/third_party/spanner_pg/src/include/catalog/pg_opfamily.dat index a950d93a..f2eaa9b2 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_opfamily.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_opfamily.dat @@ -3,7 +3,7 @@ # pg_opfamily.dat # Initial contents of the pg_opfamily system catalog. # -# 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 # # src/include/catalog/pg_opfamily.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_opfamily.h b/third_party/spanner_pg/src/include/catalog/pg_opfamily.h index 129102b5..8dc9ce01 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_opfamily.h +++ b/third_party/spanner_pg/src/include/catalog/pg_opfamily.h @@ -4,7 +4,7 @@ * definition of the "operator family" system catalog (pg_opfamily) * * - * 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 * * src/include/catalog/pg_opfamily.h @@ -50,10 +50,8 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId) */ typedef FormData_pg_opfamily *Form_pg_opfamily; -DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops)); -#define OpfamilyAmNameNspIndexId 2754 -DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, on pg_opfamily using btree(oid oid_ops)); -#define OpfamilyOidIndexId 2755 +DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, on pg_opfamily using btree(oid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_parameter_acl.h b/third_party/spanner_pg/src/include/catalog/pg_parameter_acl.h new file mode 100644 index 00000000..4bd52c2d --- /dev/null +++ b/third_party/spanner_pg/src/include/catalog/pg_parameter_acl.h @@ -0,0 +1,60 @@ +/*------------------------------------------------------------------------- + * + * 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,6243,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_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex); + +DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, 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/third_party/spanner_pg/src/include/catalog/pg_partitioned_table.h b/third_party/spanner_pg/src/include/catalog/pg_partitioned_table.h index 48cbaf30..9b78f84c 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_partitioned_table.h +++ b/third_party/spanner_pg/src/include/catalog/pg_partitioned_table.h @@ -5,7 +5,7 @@ * (pg_partitioned_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 * * src/include/catalog/pg_partitioned_table.h @@ -66,8 +66,7 @@ typedef FormData_pg_partitioned_table *Form_pg_partitioned_table; DECLARE_TOAST(pg_partitioned_table, 4165, 4166); -DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, on pg_partitioned_table using btree(partrelid oid_ops)); -#define PartitionedRelidIndexId 3351 +DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, on pg_partitioned_table using btree(partrelid oid_ops)); /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */ DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_policy.h b/third_party/spanner_pg/src/include/catalog/pg_policy.h index 645b8fe4..56b0ea10 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_policy.h +++ b/third_party/spanner_pg/src/include/catalog/pg_policy.h @@ -4,7 +4,7 @@ * definition of the "policy" system catalog (pg_policy) * * - * 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 * * src/include/catalog/pg_policy.h @@ -52,9 +52,7 @@ typedef FormData_pg_policy *Form_pg_policy; DECLARE_TOAST(pg_policy, 4167, 4168); -DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, on pg_policy using btree(oid oid_ops)); -#define PolicyOidIndexId 3257 -DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, on pg_policy using btree(polrelid oid_ops, polname name_ops)); -#define PolicyPolrelidPolnameIndexId 3258 +DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, on pg_policy using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, on pg_policy using btree(polrelid oid_ops, polname name_ops)); #endif /* PG_POLICY_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_proc.dat b/third_party/spanner_pg/src/include/catalog/pg_proc.dat index 0c1ca2c8..69c51291 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_proc.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_proc.dat @@ -3,7 +3,7 @@ # pg_proc.dat # Initial contents of the pg_proc system catalog. # -# 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 # # src/include/catalog/pg_proc.dat @@ -167,8 +167,12 @@ proname => 'texteq', proleakproof => 't', prorettype => 'bool', proargtypes => 'text text', prosrc => 'texteq' }, { oid => '3696', - proname => 'starts_with', proleakproof => 't', prorettype => 'bool', - proargtypes => 'text text', prosrc => 'text_starts_with' }, + proname => 'starts_with', prosupport => 'text_starts_with_support', + proleakproof => 't', prorettype => 'bool', proargtypes => 'text text', + prosrc => 'text_starts_with' }, +{ oid => '6242', descr => 'planner support for text_starts_with', + proname => 'text_starts_with_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'text_starts_with_support' }, { oid => '68', proname => 'xideq', proleakproof => 't', prorettype => 'bool', proargtypes => 'xid xid', prosrc => 'xideq' }, @@ -199,6 +203,12 @@ { oid => '5071', descr => 'convert xid8 to xid', proname => 'xid', prorettype => 'xid', proargtypes => 'xid8', prosrc => 'xid8toxid' }, +{ oid => '5097', descr => 'larger of two', + proname => 'xid8_larger', prorettype => 'xid8', proargtypes => 'xid8 xid8', + prosrc => 'xid8_larger' }, +{ oid => '5098', descr => 'smaller of two', + proname => 'xid8_smaller', prorettype => 'xid8', proargtypes => 'xid8 xid8', + prosrc => 'xid8_smaller' }, { oid => '69', proname => 'cideq', proleakproof => 't', prorettype => 'bool', proargtypes => 'cid cid', prosrc => 'cideq' }, @@ -654,9 +664,6 @@ { oid => '225', proname => 'lseg_center', prorettype => 'point', proargtypes => 'lseg', prosrc => 'lseg_center' }, -{ oid => '226', - proname => 'path_center', prorettype => 'point', proargtypes => 'path', - prosrc => 'path_center' }, { oid => '227', proname => 'poly_center', prorettype => 'point', proargtypes => 'polygon', prosrc => 'poly_center' }, @@ -1456,12 +1463,6 @@ { oid => '702', proname => 'dist_lp', prorettype => 'float8', proargtypes => 'line point', prosrc => 'dist_lp' }, -{ oid => '726', - proname => 'dist_lb', prorettype => 'float8', proargtypes => 'line box', - prosrc => 'dist_lb' }, -{ oid => '703', - proname => 'dist_bl', prorettype => 'float8', proargtypes => 'box line', - prosrc => 'dist_bl' }, { oid => '727', proname => 'dist_sl', prorettype => 'float8', proargtypes => 'lseg line', prosrc => 'dist_sl' }, @@ -1966,12 +1967,6 @@ { oid => '961', proname => 'close_pl', prorettype => 'point', proargtypes => 'point line', prosrc => 'close_pl' }, -{ oid => '962', - proname => 'close_sl', prorettype => 'point', proargtypes => 'lseg line', - prosrc => 'close_sl' }, -{ oid => '963', - proname => 'close_lb', prorettype => 'point', proargtypes => 'line box', - prosrc => 'close_lb' }, { oid => '964', descr => 'large object unlink (delete)', proname => 'lo_unlink', provolatile => 'v', proparallel => 'u', @@ -2301,8 +2296,8 @@ proname => 'interval_in', provolatile => 's', prorettype => 'interval', proargtypes => 'cstring oid int4', prosrc => 'interval_in' }, { oid => '1161', descr => 'I/O', - proname => 'interval_out', prorettype => 'cstring', proargtypes => 'interval', - prosrc => 'interval_out' }, + proname => 'interval_out', provolatile => 's', prorettype => 'cstring', + proargtypes => 'interval', prosrc => 'interval_out' }, { oid => '2903', descr => 'I/O typmod', proname => 'intervaltypmodin', prorettype => 'int4', proargtypes => '_cstring', prosrc => 'intervaltypmodin' }, @@ -3213,9 +3208,6 @@ { oid => '1532', descr => 'center of', proname => 'point', prorettype => 'point', proargtypes => 'lseg', prosrc => 'lseg_center' }, -{ oid => '1533', descr => 'center of', - proname => 'point', prorettype => 'point', proargtypes => 'path', - prosrc => 'path_center' }, { oid => '1534', descr => 'center of', proname => 'point', prorettype => 'point', proargtypes => 'box', prosrc => 'box_center' }, @@ -3299,6 +3291,10 @@ proname => 'pg_nextoid', provolatile => 'v', proparallel => 'u', prorettype => 'oid', proargtypes => 'regclass name regclass', prosrc => 'pg_nextoid' }, +{ oid => '6241', descr => 'stop making pinned objects during initdb', + proname => 'pg_stop_making_pinned_objects', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => '', + prosrc => 'pg_stop_making_pinned_objects' }, { oid => '1579', descr => 'I/O', proname => 'varbit_in', prorettype => 'varbit', @@ -3565,6 +3561,18 @@ { oid => '2285', descr => 'replace text using regexp', proname => 'regexp_replace', prorettype => 'text', proargtypes => 'text text text text', prosrc => 'textregexreplace' }, +{ oid => '6251', descr => 'replace text using regexp', + proname => 'regexp_replace', prorettype => 'text', + proargtypes => 'text text text int4 int4 text', + prosrc => 'textregexreplace_extended' }, +{ oid => '6252', descr => 'replace text using regexp', + proname => 'regexp_replace', prorettype => 'text', + proargtypes => 'text text text int4 int4', + prosrc => 'textregexreplace_extended_no_flags' }, +{ oid => '6253', descr => 'replace text using regexp', + proname => 'regexp_replace', prorettype => 'text', + proargtypes => 'text text text int4', + prosrc => 'textregexreplace_extended_no_n' }, { oid => '3396', descr => 'find first match for regexp', proname => 'regexp_match', prorettype => '_text', proargtypes => 'text text', prosrc => 'regexp_match_no_flags' }, @@ -3579,6 +3587,58 @@ proname => 'regexp_matches', prorows => '10', proretset => 't', prorettype => '_text', proargtypes => 'text text text', prosrc => 'regexp_matches' }, +{ oid => '6254', descr => 'count regexp matches', + proname => 'regexp_count', prorettype => 'int4', proargtypes => 'text text', + prosrc => 'regexp_count_no_start' }, +{ oid => '6255', descr => 'count regexp matches', + proname => 'regexp_count', prorettype => 'int4', + proargtypes => 'text text int4', prosrc => 'regexp_count_no_flags' }, +{ oid => '6256', descr => 'count regexp matches', + proname => 'regexp_count', prorettype => 'int4', + proargtypes => 'text text int4 text', prosrc => 'regexp_count' }, +{ oid => '6257', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', proargtypes => 'text text', + prosrc => 'regexp_instr_no_start' }, +{ oid => '6258', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', + proargtypes => 'text text int4', prosrc => 'regexp_instr_no_n' }, +{ oid => '6259', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', + proargtypes => 'text text int4 int4', prosrc => 'regexp_instr_no_endoption' }, +{ oid => '6260', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', + proargtypes => 'text text int4 int4 int4', + prosrc => 'regexp_instr_no_flags' }, +{ oid => '6261', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', + proargtypes => 'text text int4 int4 int4 text', + prosrc => 'regexp_instr_no_subexpr' }, +{ oid => '6262', descr => 'position of regexp match', + proname => 'regexp_instr', prorettype => 'int4', + proargtypes => 'text text int4 int4 int4 text int4', + prosrc => 'regexp_instr' }, +{ oid => '6263', descr => 'test for regexp match', + proname => 'regexp_like', prorettype => 'bool', proargtypes => 'text text', + prosrc => 'regexp_like_no_flags' }, +{ oid => '6264', descr => 'test for regexp match', + proname => 'regexp_like', prorettype => 'bool', + proargtypes => 'text text text', prosrc => 'regexp_like' }, +{ oid => '6265', descr => 'extract substring that matches regexp', + proname => 'regexp_substr', prorettype => 'text', proargtypes => 'text text', + prosrc => 'regexp_substr_no_start' }, +{ oid => '6266', descr => 'extract substring that matches regexp', + proname => 'regexp_substr', prorettype => 'text', + proargtypes => 'text text int4', prosrc => 'regexp_substr_no_n' }, +{ oid => '6267', descr => 'extract substring that matches regexp', + proname => 'regexp_substr', prorettype => 'text', + proargtypes => 'text text int4 int4', prosrc => 'regexp_substr_no_flags' }, +{ oid => '6268', descr => 'extract substring that matches regexp', + proname => 'regexp_substr', prorettype => 'text', + proargtypes => 'text text int4 int4 text', + prosrc => 'regexp_substr_no_subexpr' }, +{ oid => '6269', descr => 'extract substring that matches regexp', + proname => 'regexp_substr', prorettype => 'text', + proargtypes => 'text text int4 int4 text int4', prosrc => 'regexp_substr' }, { oid => '2088', descr => 'split string by field_sep and return field_num', proname => 'split_part', prorettype => 'text', proargtypes => 'text text int4', prosrc => 'split_part' }, @@ -5314,13 +5374,25 @@ 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', 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}', prosrc => 'pg_stat_get_replication_slot' }, + +{ oid => '6230', 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 => '6231', descr => 'statistics: information about subscription stats', + proname => 'pg_stat_get_subscription_stats', 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', @@ -5585,6 +5657,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 => '6248', descr => 'statistics: information about WAL prefetching', + proname => 'pg_stat_get_recovery_prefetch', prorows => '1', proretset => 't', + provolatile => 'v', 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', @@ -5681,6 +5760,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', @@ -5690,7 +5774,7 @@ proname => 'pg_stat_reset_shared', provolatile => 'v', prorettype => 'void', proargtypes => 'text', prosrc => 'pg_stat_reset_shared' }, { oid => '3776', - descr => 'statistics: reset collected statistics for a single table or index in the current database', + descr => 'statistics: reset collected statistics for a single table or index in the current database or shared across all databases in the cluster', proname => 'pg_stat_reset_single_table_counters', provolatile => 'v', prorettype => 'void', proargtypes => 'oid', prosrc => 'pg_stat_reset_single_table_counters' }, @@ -5708,6 +5792,11 @@ proname => 'pg_stat_reset_replication_slot', proisstrict => 'f', provolatile => 'v', prorettype => 'void', proargtypes => 'text', prosrc => 'pg_stat_reset_replication_slot' }, +{ oid => '6232', + 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_stats' }, { oid => '3163', descr => 'current trigger depth', proname => 'pg_trigger_depth', provolatile => 's', proparallel => 'r', @@ -5889,7 +5978,7 @@ proname => 'timestamp_larger', prorettype => 'timestamp', proargtypes => 'timestamp timestamp', prosrc => 'timestamp_larger' }, { oid => '2037', descr => 'adjust time with time zone to new zone', - proname => 'timezone', provolatile => 'v', prorettype => 'timetz', + proname => 'timezone', provolatile => 's', prorettype => 'timetz', proargtypes => 'text timetz', prosrc => 'timetz_zone' }, { oid => '2038', descr => 'adjust time with time zone to new zone', proname => 'timezone', prorettype => 'timetz', @@ -6028,6 +6117,11 @@ proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', proargnames => '{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline,pending_restart}', prosrc => 'show_all_settings' }, + +{ oid => '6240', descr => 'return flags for specified GUC', + proname => 'pg_settings_get_flags', provolatile => 's', prorettype => '_text', + proargtypes => 'text', prosrc => 'pg_settings_get_flags' }, + { oid => '3329', descr => 'show config file settings', proname => 'pg_show_all_file_settings', prorows => '1000', proretset => 't', provolatile => 'v', prorettype => 'record', proargtypes => '', @@ -6042,6 +6136,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 => '6250', 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 => '', @@ -6195,26 +6295,15 @@ 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', prorows => '1', proretset => 't', - 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}', @@ -6287,6 +6376,13 @@ prorettype => 'text', proargtypes => '', prosrc => 'pg_get_wal_replay_pause_state' }, +{ oid => '6224', 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' }, @@ -6491,6 +6587,9 @@ { oid => '4189', descr => 'maximum value of all pg_lsn input values', proname => 'max', prokind => 'a', proisstrict => 'f', prorettype => 'pg_lsn', proargtypes => 'pg_lsn', prosrc => 'aggregate_dummy' }, +{ oid => '5099', descr => 'maximum value of all xid8 input values', + proname => 'max', prokind => 'a', proisstrict => 'f', prorettype => 'xid8', + proargtypes => 'xid8', prosrc => 'aggregate_dummy' }, { oid => '2131', descr => 'minimum value of all bigint input values', proname => 'min', prokind => 'a', proisstrict => 'f', prorettype => 'int8', @@ -6558,15 +6657,23 @@ { oid => '4190', descr => 'minimum value of all pg_lsn input values', proname => 'min', prokind => 'a', proisstrict => 'f', prorettype => 'pg_lsn', proargtypes => 'pg_lsn', prosrc => 'aggregate_dummy' }, +{ oid => '5100', descr => 'minimum value of all xid8 input values', + proname => 'min', prokind => 'a', proisstrict => 'f', prorettype => 'xid8', + proargtypes => 'xid8', prosrc => 'aggregate_dummy' }, # 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 => '6236', 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)', @@ -7128,6 +7235,22 @@ proname => 'has_type_privilege', provolatile => 's', prorettype => 'bool', proargtypes => 'oid text', prosrc => 'has_type_privilege_id' }, +{ oid => '6205', + 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 => '6206', + 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 => '6207', + 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' }, @@ -10000,14 +10123,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 => '6233', 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', - proargtypes => '', prosrc => 'window_rank' }, + proname => 'rank', prosupport => 'window_rank_support', prokind => 'w', + proisstrict => 'f', prorettype => 'int8', proargtypes => '', + prosrc => 'window_rank' }, +{ oid => '6234', 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 => '6235', 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' }, @@ -10533,6 +10668,18 @@ proname => 'range_agg', prokind => 'a', proisstrict => 'f', prorettype => 'anymultirange', proargtypes => 'anyrange', prosrc => 'aggregate_dummy' }, +{ oid => '6225', descr => 'aggregate transition function', + proname => 'multirange_agg_transfn', proisstrict => 'f', + prorettype => 'internal', proargtypes => 'internal anymultirange', + prosrc => 'multirange_agg_transfn' }, +{ oid => '6226', descr => 'aggregate final function', + proname => 'multirange_agg_finalfn', proisstrict => 'f', + prorettype => 'anymultirange', proargtypes => 'internal anymultirange', + prosrc => 'range_agg_finalfn' }, +{ oid => '6227', 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', @@ -10542,8 +10689,8 @@ prorettype => 'anymultirange', proargtypes => 'anymultirange', prosrc => 'aggregate_dummy' }, { oid => '1293', descr => 'expand multirange to set of ranges', - proname => 'unnest', prorows => '100', - proretset => 't', prorettype => 'anyrange', proargtypes => 'anymultirange', + proname => 'unnest', prorows => '100', proretset => 't', + prorettype => 'anyrange', proargtypes => 'anymultirange', prosrc => 'multirange_unnest' }, # date, time, timestamp constructors @@ -10972,6 +11119,22 @@ proname => 'binary_upgrade_set_missing_value', provolatile => 'v', proparallel => 'u', prorettype => 'void', proargtypes => 'oid text text', prosrc => 'binary_upgrade_set_missing_value' }, +{ oid => '4545', descr => 'for use by pg_upgrade', + proname => 'binary_upgrade_set_next_heap_relfilenode', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => 'oid', + prosrc => 'binary_upgrade_set_next_heap_relfilenode' }, +{ oid => '4546', descr => 'for use by pg_upgrade', + proname => 'binary_upgrade_set_next_index_relfilenode', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => 'oid', + prosrc => 'binary_upgrade_set_next_index_relfilenode' }, +{ oid => '4547', descr => 'for use by pg_upgrade', + proname => 'binary_upgrade_set_next_toast_relfilenode', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => 'oid', + prosrc => 'binary_upgrade_set_next_toast_relfilenode' }, +{ oid => '4548', descr => 'for use by pg_upgrade', + proname => 'binary_upgrade_set_next_pg_tablespace_oid', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => 'oid', + prosrc => 'binary_upgrade_set_next_pg_tablespace_oid' }, # conversion functions { oid => '4302', @@ -11440,11 +11603,12 @@ 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', @@ -11526,6 +11690,11 @@ proname => 'pg_collation_actual_version', procost => '100', provolatile => 'v', prorettype => 'text', proargtypes => 'oid', prosrc => 'pg_collation_actual_version' }, +{ oid => '6249', + descr => 'get actual version of database collation from operating system', + proname => 'pg_database_collation_actual_version', procost => '100', + provolatile => 'v', prorettype => 'text', proargtypes => 'oid', + prosrc => 'pg_database_collation_actual_version' }, # system management/monitoring related functions { oid => '3353', descr => 'list files in the log directory', @@ -11555,6 +11724,28 @@ proallargtypes => '{oid,text,int8,timestamptz}', proargmodes => '{i,o,o,o}', proargnames => '{tablespace,name,size,modification}', prosrc => 'pg_ls_tmpdir_1arg' }, +{ oid => '6270', + descr => 'list of files in the pg_logical/snapshots directory', + proname => 'pg_ls_logicalsnapdir', procost => '10', prorows => '20', + proretset => 't', provolatile => 'v', prorettype => 'record', + proargtypes => '', proallargtypes => '{text,int8,timestamptz}', + proargmodes => '{o,o,o}', proargnames => '{name,size,modification}', + prosrc => 'pg_ls_logicalsnapdir' }, +{ oid => '6271', + descr => 'list of files in the pg_logical/mappings directory', + proname => 'pg_ls_logicalmapdir', procost => '10', prorows => '20', + proretset => 't', provolatile => 'v', prorettype => 'record', + proargtypes => '', proallargtypes => '{text,int8,timestamptz}', + proargmodes => '{o,o,o}', proargnames => '{name,size,modification}', + prosrc => 'pg_ls_logicalmapdir' }, +{ oid => '6272', + descr => 'list of files in the pg_replslot/slot_name directory', + proname => 'pg_ls_replslotdir', procost => '10', prorows => '20', + proretset => 't', provolatile => 'v', prorettype => 'record', + proargtypes => 'text', proallargtypes => '{text,text,int8,timestamptz}', + proargmodes => '{i,o,o,o}', + proargnames => '{slot_name,name,size,modification}', + prosrc => 'pg_ls_replslotdir' }, # hash partitioning constraint function { oid => '5028', descr => 'hash partition CHECK constraint', diff --git a/third_party/spanner_pg/src/include/catalog/pg_proc.h b/third_party/spanner_pg/src/include/catalog/pg_proc.h index 91e0244f..ba0166d1 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_proc.h +++ b/third_party/spanner_pg/src/include/catalog/pg_proc.h @@ -3,7 +3,7 @@ * pg_proc.h * definition of the "procedure" system catalog (pg_proc) * - * 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 * * src/include/catalog/pg_proc.h @@ -138,10 +138,8 @@ typedef FormData_pg_proc *Form_pg_proc; DECLARE_TOAST(pg_proc, 2836, 2837); -DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, on pg_proc using btree(oid oid_ops)); -#define ProcedureOidIndexId 2690 -DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops)); -#define ProcedureNameArgsNspIndexId 2691 +DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, on pg_proc using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/third_party/spanner_pg/src/include/catalog/pg_publication.h b/third_party/spanner_pg/src/include/catalog/pg_publication.h index 84552ab5..48205ba4 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_publication.h +++ b/third_party/spanner_pg/src/include/catalog/pg_publication.h @@ -3,7 +3,7 @@ * pg_publication.h * definition of the "publication" system catalog (pg_publication) * - * 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 * * src/include/catalog/pg_publication.h @@ -63,10 +63,8 @@ CATALOG(pg_publication,6104,PublicationRelationId) */ typedef FormData_pg_publication *Form_pg_publication; -DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, on pg_publication using btree(oid oid_ops)); -#define PublicationObjectIndexId 6110 -DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, on pg_publication using btree(pubname name_ops)); -#define PublicationNameIndexId 6111 +DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, on pg_publication using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, on pg_publication using btree(pubname name_ops)); typedef struct PublicationActions { @@ -76,6 +74,26 @@ 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; + + /* + * 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 { Oid oid; @@ -85,6 +103,13 @@ typedef struct Publication PublicationActions pubactions; } Publication; +typedef struct PublicationRelInfo +{ + Relation relation; + Node *whereClause; + List *columns; +} PublicationRelInfo; + extern Publication *GetPublication(Oid pubid); extern Publication *GetPublicationByName(const char *pubname, bool missing_ok); extern List *GetRelationPublications(Oid relid); @@ -108,16 +133,29 @@ typedef enum PublicationPartOpt extern List *GetPublicationRelations(Oid pubid, PublicationPartOpt pub_partopt); extern List *GetAllTablesPublications(void); extern List *GetAllTablesPublicationRelations(bool pubviaroot); - -extern bool is_publishable_relation(Relation rel); -extern ObjectAddress publication_add_relation(Oid pubid, Relation targetrel, - bool if_not_exists); +extern List *GetPublicationSchemas(Oid pubid); +extern List *GetSchemaPublications(Oid schemaid); +extern List *GetSchemaPublicationRelations(Oid schemaid, + PublicationPartOpt pub_partopt); +extern List *GetAllSchemaPublicationRelations(Oid puboid, + PublicationPartOpt pub_partopt); extern List *GetPubPartitionOptionRelations(List *result, PublicationPartOpt pub_partopt, Oid relid); +extern Oid GetTopMostAncestorInPublication(Oid puboid, List *ancestors, + int *ancestor_level); + +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, + 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); - #endif /* PG_PUBLICATION_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_publication_namespace.h b/third_party/spanner_pg/src/include/catalog/pg_publication_namespace.h new file mode 100644 index 00000000..d166600b --- /dev/null +++ b/third_party/spanner_pg/src/include/catalog/pg_publication_namespace.h @@ -0,0 +1,47 @@ +/*------------------------------------------------------------------------- + * + * pg_publication_namespace.h + * definition of the system catalog for mappings between schemas and + * publications (pg_publication_namespace) + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/catalog/pg_publication_namespace.h + * + * NOTES + * The Catalog.pm module reads this file and derives schema + * information. + * + *------------------------------------------------------------------------- + */ +#ifndef PG_PUBLICATION_NAMESPACE_H +#define PG_PUBLICATION_NAMESPACE_H + +#include "catalog/genbki.h" +#include "catalog/pg_publication_namespace_d.h" + + +/* ---------------- + * pg_publication_namespace definition. cpp turns this into + * typedef struct FormData_pg_publication_namespace + * ---------------- + */ +CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId) +{ + Oid oid; /* oid */ + Oid pnpubid BKI_LOOKUP(pg_publication); /* Oid of the publication */ + Oid pnnspid BKI_LOOKUP(pg_namespace); /* Oid of the schema */ +} FormData_pg_publication_namespace; + +/* ---------------- + * Form_pg_publication_namespace corresponds to a pointer to a tuple with + * the format of pg_publication_namespace relation. + * ---------------- + */ +typedef FormData_pg_publication_namespace *Form_pg_publication_namespace; + +DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops)); + +#endif /* PG_PUBLICATION_NAMESPACE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_publication_rel.h b/third_party/spanner_pg/src/include/catalog/pg_publication_rel.h index aecf53b3..ecd3739f 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_publication_rel.h +++ b/third_party/spanner_pg/src/include/catalog/pg_publication_rel.h @@ -4,7 +4,7 @@ * definition of the system catalog for mappings between relations and * publications (pg_publication_rel) * - * 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 * * src/include/catalog/pg_publication_rel.h @@ -31,6 +31,11 @@ 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 */ + int2vector prattrs; /* columns to replicate */ +#endif } FormData_pg_publication_rel; /* ---------------- @@ -40,9 +45,10 @@ CATALOG(pg_publication_rel,6106,PublicationRelRelationId) */ typedef FormData_pg_publication_rel *Form_pg_publication_rel; -DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, on pg_publication_rel using btree(oid oid_ops)); -#define PublicationRelObjectIndexId 6112 -DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops)); -#define PublicationRelPrrelidPrpubidIndexId 6113 +DECLARE_TOAST(pg_publication_rel, 6228, 6229); + +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)); #endif /* PG_PUBLICATION_REL_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_range.dat b/third_party/spanner_pg/src/include/catalog/pg_range.dat index 3bd2d83b..74d6de0c 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_range.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_range.dat @@ -3,7 +3,7 @@ # pg_range.dat # Initial contents of the pg_range system catalog. # -# 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 # # src/include/catalog/pg_range.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_range.h b/third_party/spanner_pg/src/include/catalog/pg_range.h index 5dfa4eef..faa57e8c 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_range.h +++ b/third_party/spanner_pg/src/include/catalog/pg_range.h @@ -4,7 +4,7 @@ * definition of the "range type" system catalog (pg_range) * * - * 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 * * src/include/catalog/pg_range.h @@ -57,12 +57,8 @@ CATALOG(pg_range,3541,RangeRelationId) */ typedef FormData_pg_range *Form_pg_range; -DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, on pg_range using btree(rngtypid oid_ops)); -#define RangeTypidIndexId 3542 - -DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, on pg_range using btree(rngmultitypid oid_ops)); -#define RangeMultirangeTypidIndexId 2228 - +DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, on pg_range using btree(rngtypid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, on pg_range using btree(rngmultitypid oid_ops)); /* * prototypes for functions in pg_range.c diff --git a/third_party/spanner_pg/src/include/catalog/pg_replication_origin.h b/third_party/spanner_pg/src/include/catalog/pg_replication_origin.h index 184f2403..3b11cd21 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_replication_origin.h +++ b/third_party/spanner_pg/src/include/catalog/pg_replication_origin.h @@ -4,7 +4,7 @@ * definition of the "replication origin" system catalog * (pg_replication_origin) * - * 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 * * src/include/catalog/pg_replication_origin.h @@ -54,13 +54,9 @@ 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, on pg_replication_origin using btree(roident oid_ops)); -#define ReplicationOriginIdentIndex 6001 -DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, on pg_replication_origin using btree(roname text_ops)); -#define ReplicationOriginNameIndex 6002 +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)); #endif /* PG_REPLICATION_ORIGIN_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_rewrite.h b/third_party/spanner_pg/src/include/catalog/pg_rewrite.h index 89c72545..c647f26a 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_rewrite.h +++ b/third_party/spanner_pg/src/include/catalog/pg_rewrite.h @@ -7,7 +7,7 @@ * --- ie, rule names are only unique among the rules of a given 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 * * src/include/catalog/pg_rewrite.h @@ -53,9 +53,7 @@ typedef FormData_pg_rewrite *Form_pg_rewrite; DECLARE_TOAST(pg_rewrite, 2838, 2839); -DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, on pg_rewrite using btree(oid oid_ops)); -#define RewriteOidIndexId 2692 -DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops)); -#define RewriteRelRulenameIndexId 2693 +DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, on pg_rewrite using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops)); #endif /* PG_REWRITE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_seclabel.h b/third_party/spanner_pg/src/include/catalog/pg_seclabel.h index 0a12225e..e1ddb644 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_seclabel.h +++ b/third_party/spanner_pg/src/include/catalog/pg_seclabel.h @@ -3,7 +3,7 @@ * pg_seclabel.h * definition of the "security label" system catalog (pg_seclabel) * - * 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 * * src/include/catalog/pg_seclabel.h @@ -40,7 +40,6 @@ CATALOG(pg_seclabel,3596,SecLabelRelationId) DECLARE_TOAST(pg_seclabel, 3598, 3599); -DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, on pg_seclabel using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops)); -#define SecLabelObjectIndexId 3597 +DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, SecLabelObjectIndexId, on pg_seclabel using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops)); #endif /* PG_SECLABEL_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_sequence.h b/third_party/spanner_pg/src/include/catalog/pg_sequence.h index 8d0a00ba..82b35aa6 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_sequence.h +++ b/third_party/spanner_pg/src/include/catalog/pg_sequence.h @@ -3,7 +3,7 @@ * pg_sequence.h * definition of the "sequence" system catalog (pg_sequence) * - * 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 * * src/include/catalog/pg_sequence.h @@ -39,7 +39,6 @@ CATALOG(pg_sequence,2224,SequenceRelationId) */ typedef FormData_pg_sequence *Form_pg_sequence; -DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, on pg_sequence using btree(seqrelid oid_ops)); -#define SequenceRelidIndexId 5002 +DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, on pg_sequence using btree(seqrelid oid_ops)); #endif /* PG_SEQUENCE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_shdepend.h b/third_party/spanner_pg/src/include/catalog/pg_shdepend.h index 4faa9579..8119b28e 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_shdepend.h +++ b/third_party/spanner_pg/src/include/catalog/pg_shdepend.h @@ -4,15 +4,16 @@ * definition of the "shared dependency" system catalog (pg_shdepend) * * pg_shdepend has no preloaded contents, so there is no pg_shdepend.dat - * file; system-defined dependencies are loaded into it during a late stage - * of the initdb process. + * file; dependencies for system-defined objects are loaded into it + * on-the-fly during initdb. Most built-in objects are pinned anyway, + * and hence need no explicit entries in pg_shdepend. * * NOTE: we do not represent all possible dependency pairs in pg_shdepend; * for example, there's not much value in creating an explicit dependency * from a relation to its database. Currently, only dependencies on roles * are explicitly stored in pg_shdepend. * - * 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 * * src/include/catalog/pg_shdepend.h @@ -39,13 +40,12 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION /* * Identification of the dependent (referencing) object. * - * These fields are all zeroes for a DEPENDENCY_PIN entry. Also, dbid can - * be zero to denote a shared object. + * Note that dbid can be zero to denote a shared object. */ Oid dbid BKI_LOOKUP_OPT(pg_database); /* OID of database * containing object */ - Oid classid BKI_LOOKUP_OPT(pg_class); /* OID of table containing - * object */ + Oid classid BKI_LOOKUP(pg_class); /* OID of table containing + * object */ Oid objid; /* OID of object itself */ int32 objsubid; /* column number, or 0 if not used */ @@ -72,9 +72,7 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION */ typedef FormData_pg_shdepend *Form_pg_shdepend; -DECLARE_INDEX(pg_shdepend_depender_index, 1232, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops)); -#define SharedDependDependerIndexId 1232 -DECLARE_INDEX(pg_shdepend_reference_index, 1233, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops)); -#define SharedDependReferenceIndexId 1233 +DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops)); +DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops)); #endif /* PG_SHDEPEND_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_shdescription.h b/third_party/spanner_pg/src/include/catalog/pg_shdescription.h index 543e2167..da2b9f6f 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_shdescription.h +++ b/third_party/spanner_pg/src/include/catalog/pg_shdescription.h @@ -16,7 +16,7 @@ * across tables. * * - * 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 * * src/include/catalog/pg_shdescription.h @@ -55,12 +55,9 @@ 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, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops)); -#define SharedDescriptionObjIndexId 2397 +DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops)); /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */ DECLARE_FOREIGN_KEY((classoid), pg_class, (oid)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_shseclabel.h b/third_party/spanner_pg/src/include/catalog/pg_shseclabel.h index 5d6864cf..fc1b97f4 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_shseclabel.h +++ b/third_party/spanner_pg/src/include/catalog/pg_shseclabel.h @@ -3,7 +3,7 @@ * pg_shseclabel.h * definition of the "shared security label" system catalog (pg_shseclabel) * - * 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 * * src/include/catalog/pg_shseclabel.h @@ -39,11 +39,8 @@ 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, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops)); -#define SharedSecLabelObjectIndexId 3593 +DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops)); #endif /* PG_SHSECLABEL_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_statistic.h b/third_party/spanner_pg/src/include/catalog/pg_statistic.h index d1827858..cdf74481 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_statistic.h +++ b/third_party/spanner_pg/src/include/catalog/pg_statistic.h @@ -4,7 +4,7 @@ * definition of the "statistics" system catalog (pg_statistic) * * - * 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 * * src/include/catalog/pg_statistic.h @@ -136,8 +136,7 @@ typedef FormData_pg_statistic *Form_pg_statistic; DECLARE_TOAST(pg_statistic, 2840, 2841); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops)); -#define StatisticRelidAttnumInhIndexId 2696 +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops)); DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_statistic_ext.h b/third_party/spanner_pg/src/include/catalog/pg_statistic_ext.h index 36912ce5..b8520ba9 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_statistic_ext.h +++ b/third_party/spanner_pg/src/include/catalog/pg_statistic_ext.h @@ -8,7 +8,7 @@ * objects, created by CREATE STATISTICS, but not the actual statistical data, * created by running ANALYZE. * - * 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 * * src/include/catalog/pg_statistic_ext.h @@ -70,12 +70,9 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext; DECLARE_TOAST(pg_statistic_ext, 3439, 3440); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, on pg_statistic_ext using btree(oid oid_ops)); -#define StatisticExtOidIndexId 3380 -DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops)); -#define StatisticExtNameIndexId 3997 -DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, on pg_statistic_ext using btree(stxrelid oid_ops)); -#define StatisticExtRelidIndexId 3379 +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, on pg_statistic_ext using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops)); +DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, on pg_statistic_ext using btree(stxrelid oid_ops)); DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_statistic_ext_data.h b/third_party/spanner_pg/src/include/catalog/pg_statistic_ext_data.h index be2abbcd..4b4cfa54 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_statistic_ext_data.h +++ b/third_party/spanner_pg/src/include/catalog/pg_statistic_ext_data.h @@ -6,7 +6,7 @@ * * This catalog stores the statistical data for extended statistics objects. * - * 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 * * src/include/catalog/pg_statistic_ext_data.h @@ -39,6 +39,7 @@ CATALOG(pg_statistic_ext_data,3429,StatisticExtDataRelationId) { Oid stxoid BKI_LOOKUP(pg_statistic_ext); /* statistics object * this data is for */ + bool stxdinherit; /* true if inheritance children are included */ #ifdef CATALOG_VARLEN /* variable-length fields start here */ @@ -56,11 +57,11 @@ CATALOG(pg_statistic_ext_data,3429,StatisticExtDataRelationId) * the format of pg_statistic_ext_data relation. * ---------------- */ -typedef FormData_pg_statistic_ext_data * Form_pg_statistic_ext_data; +typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data; DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_index, 3433, on pg_statistic_ext_data using btree(stxoid oid_ops)); -#define StatisticExtDataStxoidIndexId 3433 +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, on pg_statistic_ext_data using btree(stxoid oid_ops, stxdinherit bool_ops)); + #endif /* PG_STATISTIC_EXT_DATA_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_subscription.h b/third_party/spanner_pg/src/include/catalog/pg_subscription.h index 0060ebfb..d1260f59 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_subscription.h +++ b/third_party/spanner_pg/src/include/catalog/pg_subscription.h @@ -3,7 +3,7 @@ * pg_subscription.h * definition of the "subscription" system catalog (pg_subscription) * - * 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 * * src/include/catalog/pg_subscription.h @@ -17,11 +17,20 @@ #ifndef PG_SUBSCRIPTION_H #define PG_SUBSCRIPTION_H +#include "access/xlogdefs.h" #include "catalog/genbki.h" #include "catalog/pg_subscription_d.h" #include "nodes/pg_list.h" +/* + * two_phase tri-state values. See comments atop worker.c to know more about + * these states. + */ +#define LOGICALREP_TWOPHASE_STATE_DISABLED 'd' +#define LOGICALREP_TWOPHASE_STATE_PENDING 'p' +#define LOGICALREP_TWOPHASE_STATE_ENABLED 'e' + /* ---------------- * pg_subscription definition. cpp turns this into * typedef struct FormData_pg_subscription @@ -45,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 */ @@ -57,6 +70,11 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW bool substream; /* Stream in-progress transactions. */ + 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; @@ -74,26 +92,28 @@ 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, on pg_subscription using btree(oid oid_ops)); -#define SubscriptionObjectIndexId 6114 -DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, on pg_subscription using btree(subdbid oid_ops, subname name_ops)); -#define SubscriptionNameIndexId 6115 +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)); 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 */ bool binary; /* Indicates if the subscription wants data in * 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 */ @@ -102,6 +122,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/third_party/spanner_pg/src/include/catalog/pg_subscription_rel.h b/third_party/spanner_pg/src/include/catalog/pg_subscription_rel.h index ed94f57b..9df99c34 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_subscription_rel.h +++ b/third_party/spanner_pg/src/include/catalog/pg_subscription_rel.h @@ -4,7 +4,7 @@ * definition of the system catalog containing the state for each * replicated table in each subscription (pg_subscription_rel) * - * 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 * * src/include/catalog/pg_subscription_rel.h @@ -49,8 +49,7 @@ CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId) typedef FormData_pg_subscription_rel *Form_pg_subscription_rel; -DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops)); -#define SubscriptionRelSrrelidSrsubidIndexId 6117 +DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE @@ -88,6 +87,7 @@ extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn); extern void RemoveSubscriptionRel(Oid subid, Oid relid); +extern bool HasSubscriptionRelations(Oid subid); extern List *GetSubscriptionRelations(Oid subid); extern List *GetSubscriptionNotReadyRelations(Oid subid); diff --git a/third_party/spanner_pg/src/include/catalog/pg_tablespace.dat b/third_party/spanner_pg/src/include/catalog/pg_tablespace.dat index bf0d81d3..59234aef 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_tablespace.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_tablespace.dat @@ -3,7 +3,7 @@ # pg_tablespace.dat # Initial contents of the pg_tablespace system catalog. # -# 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 # # src/include/catalog/pg_tablespace.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_tablespace.h b/third_party/spanner_pg/src/include/catalog/pg_tablespace.h index 58bb1087..572eeeb8 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_tablespace.h +++ b/third_party/spanner_pg/src/include/catalog/pg_tablespace.h @@ -4,7 +4,7 @@ * definition of the "tablespace" system catalog (pg_tablespace) * * - * 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 * * src/include/catalog/pg_tablespace.h @@ -47,13 +47,9 @@ 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, on pg_tablespace using btree(oid oid_ops)); -#define TablespaceOidIndexId 2697 -DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, on pg_tablespace using btree(spcname name_ops)); -#define TablespaceNameIndexId 2698 +DECLARE_UNIQUE_INDEX_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)); #endif /* PG_TABLESPACE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_transform.h b/third_party/spanner_pg/src/include/catalog/pg_transform.h index d6032461..2a026915 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_transform.h +++ b/third_party/spanner_pg/src/include/catalog/pg_transform.h @@ -4,7 +4,7 @@ * definition of the "transform" system catalog (pg_transform) * * - * 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 * * src/include/catalog/pg_transform.h @@ -42,9 +42,7 @@ CATALOG(pg_transform,3576,TransformRelationId) */ typedef FormData_pg_transform *Form_pg_transform; -DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, on pg_transform using btree(oid oid_ops)); -#define TransformOidIndexId 3574 -DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, on pg_transform using btree(trftype oid_ops, trflang oid_ops)); -#define TransformTypeLangIndexId 3575 +DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, on pg_transform using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, on pg_transform using btree(trftype oid_ops, trflang oid_ops)); #endif /* PG_TRANSFORM_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_trigger.h b/third_party/spanner_pg/src/include/catalog/pg_trigger.h index 2e3d2338..194277bc 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_trigger.h +++ b/third_party/spanner_pg/src/include/catalog/pg_trigger.h @@ -4,7 +4,7 @@ * definition of the "trigger" system catalog (pg_trigger) * * - * 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 * * src/include/catalog/pg_trigger.h @@ -81,12 +81,9 @@ typedef FormData_pg_trigger *Form_pg_trigger; DECLARE_TOAST(pg_trigger, 2336, 2337); -DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, on pg_trigger using btree(tgconstraint oid_ops)); -#define TriggerConstraintIndexId 2699 -DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops)); -#define TriggerRelidNameIndexId 2701 -DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, on pg_trigger using btree(oid oid_ops)); -#define TriggerOidIndexId 2702 +DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, on pg_trigger using btree(tgconstraint oid_ops)); +DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, on pg_trigger using btree(oid oid_ops)); DECLARE_ARRAY_FOREIGN_KEY((tgrelid, tgattr), pg_attribute, (attrelid, attnum)); diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_config.dat b/third_party/spanner_pg/src/include/catalog/pg_ts_config.dat index f88d8991..1bbcfe3f 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_config.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_config.dat @@ -3,7 +3,7 @@ # pg_ts_config.dat # Initial contents of the pg_ts_config system catalog. # -# 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 # # src/include/catalog/pg_ts_config.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_config.h b/third_party/spanner_pg/src/include/catalog/pg_ts_config.h index 2e026396..e5a30847 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_config.h +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_config.h @@ -5,7 +5,7 @@ * (pg_ts_config) * * - * 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 * * src/include/catalog/pg_ts_config.h @@ -47,9 +47,7 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId) typedef FormData_pg_ts_config *Form_pg_ts_config; -DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops)); -#define TSConfigNameNspIndexId 3608 -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, on pg_ts_config using btree(oid oid_ops)); -#define TSConfigOidIndexId 3712 +DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, on pg_ts_config using btree(oid oid_ops)); #endif /* PG_TS_CONFIG_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.dat b/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.dat index cacfd125..ede0166f 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.dat @@ -3,7 +3,7 @@ # pg_ts_config_map.dat # Initial contents of the pg_ts_config_map system catalog. # -# 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 # # src/include/catalog/pg_ts_config_map.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.h b/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.h index f39d14fd..c10e0c51 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.h +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_config_map.h @@ -5,7 +5,7 @@ * (pg_ts_config_map) * * - * 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 * * src/include/catalog/pg_ts_config_map.h @@ -44,7 +44,6 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId) typedef FormData_pg_ts_config_map *Form_pg_ts_config_map; -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, on pg_ts_config_map using btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops)); -#define TSConfigMapIndexId 3609 +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, on pg_ts_config_map using btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops)); #endif /* PG_TS_CONFIG_MAP_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_dict.dat b/third_party/spanner_pg/src/include/catalog/pg_ts_dict.dat index 4d39bb8c..c9b0e66e 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_dict.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_dict.dat @@ -3,7 +3,7 @@ # pg_ts_dict.dat # Initial contents of the pg_ts_dict system catalog. # -# 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 # # src/include/catalog/pg_ts_dict.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_dict.h b/third_party/spanner_pg/src/include/catalog/pg_ts_dict.h index e53eead8..4b6188f4 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_dict.h +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_dict.h @@ -4,7 +4,7 @@ * definition of the "text search dictionary" system catalog (pg_ts_dict) * * - * 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 * * src/include/catalog/pg_ts_dict.h @@ -53,9 +53,7 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict; DECLARE_TOAST(pg_ts_dict, 4169, 4170); -DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops)); -#define TSDictionaryNameNspIndexId 3604 -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, on pg_ts_dict using btree(oid oid_ops)); -#define TSDictionaryOidIndexId 3605 +DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, on pg_ts_dict using btree(oid oid_ops)); #endif /* PG_TS_DICT_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_parser.dat b/third_party/spanner_pg/src/include/catalog/pg_ts_parser.dat index a2b7cf10..d1fdc020 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_parser.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_parser.dat @@ -3,7 +3,7 @@ # pg_ts_parser.dat # Initial contents of the pg_ts_parser system catalog. # -# 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 # # src/include/catalog/pg_ts_parser.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_parser.h b/third_party/spanner_pg/src/include/catalog/pg_ts_parser.h index 0231051c..c2d474dc 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_parser.h +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_parser.h @@ -4,7 +4,7 @@ * definition of the "text search parser" system catalog (pg_ts_parser) * * - * 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 * * src/include/catalog/pg_ts_parser.h @@ -54,9 +54,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId) typedef FormData_pg_ts_parser *Form_pg_ts_parser; -DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops)); -#define TSParserNameNspIndexId 3606 -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, on pg_ts_parser using btree(oid oid_ops)); -#define TSParserOidIndexId 3607 +DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, on pg_ts_parser using btree(oid oid_ops)); #endif /* PG_TS_PARSER_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_template.dat b/third_party/spanner_pg/src/include/catalog/pg_ts_template.dat index 0bdbcac7..edc01c0c 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_template.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_template.dat @@ -3,7 +3,7 @@ # pg_ts_template.dat # Initial contents of the pg_ts_template system catalog. # -# 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 # # src/include/catalog/pg_ts_template.dat diff --git a/third_party/spanner_pg/src/include/catalog/pg_ts_template.h b/third_party/spanner_pg/src/include/catalog/pg_ts_template.h index 194b9211..2a553fef 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_ts_template.h +++ b/third_party/spanner_pg/src/include/catalog/pg_ts_template.h @@ -4,7 +4,7 @@ * definition of the "text search template" system catalog (pg_ts_template) * * - * 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 * * src/include/catalog/pg_ts_template.h @@ -45,9 +45,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId) typedef FormData_pg_ts_template *Form_pg_ts_template; -DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops)); -#define TSTemplateNameNspIndexId 3766 -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, on pg_ts_template using btree(oid oid_ops)); -#define TSTemplateOidIndexId 3767 +DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, on pg_ts_template using btree(oid oid_ops)); #endif /* PG_TS_TEMPLATE_H */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_type.dat b/third_party/spanner_pg/src/include/catalog/pg_type.dat index 41074c99..df458794 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_type.dat +++ b/third_party/spanner_pg/src/include/catalog/pg_type.dat @@ -3,7 +3,7 @@ # pg_type.dat # Initial contents of the pg_type system catalog. # -# 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 # # src/include/catalog/pg_type.dat @@ -42,7 +42,7 @@ typinput => 'byteain', typoutput => 'byteaout', typreceive => 'bytearecv', typsend => 'byteasend', typalign => 'i', typstorage => 'x' }, { oid => '18', array_type_oid => '1002', descr => 'single character', - typname => 'char', typlen => '1', typbyval => 't', typcategory => 'S', + typname => 'char', typlen => '1', typbyval => 't', typcategory => 'Z', typinput => 'charin', typoutput => 'charout', typreceive => 'charrecv', typsend => 'charsend', typalign => 'c' }, { oid => '19', array_type_oid => '1003', @@ -145,24 +145,24 @@ typsend => 'xml_send', typalign => 'i', typstorage => 'x' }, { oid => '194', descr => 'string representing an internal node tree', typname => 'pg_node_tree', typlen => '-1', typbyval => 'f', - typcategory => 'S', typinput => 'pg_node_tree_in', + typcategory => 'Z', typinput => 'pg_node_tree_in', typoutput => 'pg_node_tree_out', typreceive => 'pg_node_tree_recv', typsend => 'pg_node_tree_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, { oid => '3361', descr => 'multivariate ndistinct coefficients', typname => 'pg_ndistinct', typlen => '-1', typbyval => 'f', - typcategory => 'S', typinput => 'pg_ndistinct_in', + typcategory => 'Z', typinput => 'pg_ndistinct_in', typoutput => 'pg_ndistinct_out', typreceive => 'pg_ndistinct_recv', typsend => 'pg_ndistinct_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, { oid => '3402', descr => 'multivariate dependencies', typname => 'pg_dependencies', typlen => '-1', typbyval => 'f', - typcategory => 'S', typinput => 'pg_dependencies_in', + typcategory => 'Z', typinput => 'pg_dependencies_in', typoutput => 'pg_dependencies_out', typreceive => 'pg_dependencies_recv', typsend => 'pg_dependencies_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, { oid => '5017', descr => 'multivariate MCV list', - typname => 'pg_mcv_list', typlen => '-1', typbyval => 'f', typcategory => 'S', + typname => 'pg_mcv_list', typlen => '-1', typbyval => 'f', typcategory => 'Z', typinput => 'pg_mcv_list_in', typoutput => 'pg_mcv_list_out', typreceive => 'pg_mcv_list_recv', typsend => 'pg_mcv_list_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, @@ -681,13 +681,13 @@ typalign => 'd', typstorage => 'x' }, { oid => '4600', descr => 'BRIN bloom summary', typname => 'pg_brin_bloom_summary', typlen => '-1', typbyval => 'f', - typcategory => 'S', typinput => 'brin_bloom_summary_in', + typcategory => 'Z', typinput => 'brin_bloom_summary_in', typoutput => 'brin_bloom_summary_out', typreceive => 'brin_bloom_summary_recv', typsend => 'brin_bloom_summary_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, { oid => '4601', descr => 'BRIN minmax-multi summary', typname => 'pg_brin_minmax_multi_summary', typlen => '-1', typbyval => 'f', - typcategory => 'S', typinput => 'brin_minmax_multi_summary_in', + typcategory => 'Z', typinput => 'brin_minmax_multi_summary_in', typoutput => 'brin_minmax_multi_summary_out', typreceive => 'brin_minmax_multi_summary_recv', typsend => 'brin_minmax_multi_summary_send', typalign => 'i', diff --git a/third_party/spanner_pg/src/include/catalog/pg_type.h b/third_party/spanner_pg/src/include/catalog/pg_type.h index 0ece1e03..48a25591 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_type.h +++ b/third_party/spanner_pg/src/include/catalog/pg_type.h @@ -4,7 +4,7 @@ * definition of the "type" system catalog (pg_type) * * - * 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 * * src/include/catalog/pg_type.h @@ -262,10 +262,8 @@ typedef FormData_pg_type *Form_pg_type; DECLARE_TOAST(pg_type, 4171, 4172); -DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, on pg_type using btree(oid oid_ops)); -#define TypeOidIndexId 2703 -DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, on pg_type using btree(typname name_ops, typnamespace oid_ops)); -#define TypeNameNspIndexId 2704 +DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, on pg_type using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, on pg_type using btree(typname name_ops, typnamespace oid_ops)); #ifdef EXPOSE_TO_CLIENT_CODE @@ -296,6 +294,7 @@ DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, on pg_type using btree(typ #define TYPCATEGORY_USER 'U' #define TYPCATEGORY_BITSTRING 'V' /* er ... "varbit"? */ #define TYPCATEGORY_UNKNOWN 'X' +#define TYPCATEGORY_INTERNAL 'Z' #define TYPALIGN_CHAR 'c' /* char alignment (i.e. unaligned) */ #define TYPALIGN_SHORT 's' /* short alignment (typically 2 bytes) */ diff --git a/third_party/spanner_pg/src/include/catalog/pg_user_mapping.h b/third_party/spanner_pg/src/include/catalog/pg_user_mapping.h index d440c67d..56150611 100644 --- a/third_party/spanner_pg/src/include/catalog/pg_user_mapping.h +++ b/third_party/spanner_pg/src/include/catalog/pg_user_mapping.h @@ -3,7 +3,7 @@ * pg_user_mapping.h * definition of the "user mapping" system catalog (pg_user_mapping) * - * 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 * * src/include/catalog/pg_user_mapping.h @@ -49,9 +49,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping; DECLARE_TOAST(pg_user_mapping, 4173, 4174); -DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, on pg_user_mapping using btree(oid oid_ops)); -#define UserMappingOidIndexId 174 -DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops)); -#define UserMappingUserServerIndexId 175 +DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, on pg_user_mapping using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops)); #endif /* PG_USER_MAPPING_H */ diff --git a/third_party/spanner_pg/src/include/catalog/reformat_dat_file.pl b/third_party/spanner_pg/src/include/catalog/reformat_dat_file.pl index c2631b1a..e4a105eb 100755 --- a/third_party/spanner_pg/src/include/catalog/reformat_dat_file.pl +++ b/third_party/spanner_pg/src/include/catalog/reformat_dat_file.pl @@ -10,7 +10,7 @@ # in the same order as the columns of the corresponding catalog. # Comments and blank lines are preserved. # -# 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 # # src/include/catalog/reformat_dat_file.pl diff --git a/third_party/spanner_pg/src/include/catalog/renumber_oids.pl b/third_party/spanner_pg/src/include/catalog/renumber_oids.pl index 660f7ddf..1e33450b 100755 --- a/third_party/spanner_pg/src/include/catalog/renumber_oids.pl +++ b/third_party/spanner_pg/src/include/catalog/renumber_oids.pl @@ -8,7 +8,7 @@ # Note: This does not reformat the .dat files, so you may want # to run reformat_dat_file.pl afterwards. # -# 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 # # src/include/catalog/renumber_oids.pl @@ -140,14 +140,47 @@ $changed = 1; } } - elsif ( - $line =~ m/^(DECLARE_(UNIQUE_)?INDEX\(\s*\w+,\s*)(\d+)(,\s*.+)\)/) + elsif ($line =~ + m/^(DECLARE_TOAST_WITH_MACRO\(\s*\w+,\s*)(\d+)(,\s*)(\d+)(,\s*\w+,\s*\w+)\)/ + ) { - if (exists $maphash{$3}) + 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(_PKEY)?\(\s*\w+,\s*)(\d+)(,\s*.+)\)/) + { + if (exists $maphash{$4}) + { + my $repl = $1 . $maphash{$4} . $5 . ")"; + $line =~ + s/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*\w+,\s*\d+,\s*.+\)/$repl/; + $changed = 1; + } + } + elsif (/^(DECLARE_OID_DEFINING_MACRO\(\s*\w+,\s*)(\d+)\)/) + { + if (exists $maphash{$2}) { - my $repl = $1 . $maphash{$3} . $4 . ")"; + my $repl = $1 . $maphash{$2} . ")"; $line =~ - s/^DECLARE_(UNIQUE_)?INDEX\(\s*\w+,\s*\d+,\s*.+\)/$repl/; + s/^DECLARE_OID_DEFINING_MACRO\(\s*\w+,\s*\d+\)/$repl/; $changed = 1; } } diff --git a/third_party/spanner_pg/src/include/catalog/storage.h b/third_party/spanner_pg/src/include/catalog/storage.h index 0ab32b44..59f3404a 100644 --- a/third_party/spanner_pg/src/include/catalog/storage.h +++ b/third_party/spanner_pg/src/include/catalog/storage.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/storage.c * * - * 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 * * src/include/catalog/storage.h @@ -20,9 +20,11 @@ #include "utils/relcache.h" /* GUC variables */ -extern int wal_skip_threshold; +extern PGDLLIMPORT 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/third_party/spanner_pg/src/include/catalog/storage_xlog.h b/third_party/spanner_pg/src/include/catalog/storage_xlog.h index f0814f14..622de22b 100644 --- a/third_party/spanner_pg/src/include/catalog/storage_xlog.h +++ b/third_party/spanner_pg/src/include/catalog/storage_xlog.h @@ -4,7 +4,7 @@ * prototypes for XLog support for backend/catalog/storage.c * * - * 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 * * src/include/catalog/storage_xlog.h diff --git a/third_party/spanner_pg/src/include/catalog/toasting.h b/third_party/spanner_pg/src/include/catalog/toasting.h index 7067c4c6..51e3ba7b 100644 --- a/third_party/spanner_pg/src/include/catalog/toasting.h +++ b/third_party/spanner_pg/src/include/catalog/toasting.h @@ -4,7 +4,7 @@ * This file provides some definitions to support creation of toast tables * * - * 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 * * src/include/catalog/toasting.h diff --git a/third_party/spanner_pg/src/include/catalog/unused_oids b/third_party/spanner_pg/src/include/catalog/unused_oids index 5b7ce5f5..e55bc6fa 100755 --- a/third_party/spanner_pg/src/include/catalog/unused_oids +++ b/third_party/spanner_pg/src/include/catalog/unused_oids @@ -11,7 +11,7 @@ # to take over what was intended as expansion space for something # else. # -# 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 # # src/include/catalog/unused_oids diff --git a/third_party/spanner_pg/src/include/commands/alter.h b/third_party/spanner_pg/src/include/commands/alter.h index 7b12e9ad..52f5e6f6 100644 --- a/third_party/spanner_pg/src/include/commands/alter.h +++ b/third_party/spanner_pg/src/include/commands/alter.h @@ -4,7 +4,7 @@ * prototypes for commands/alter.c * * - * 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 * * src/include/commands/alter.h diff --git a/third_party/spanner_pg/src/include/commands/async.h b/third_party/spanner_pg/src/include/commands/async.h index 85bfb247..926af933 100644 --- a/third_party/spanner_pg/src/include/commands/async.h +++ b/third_party/spanner_pg/src/include/commands/async.h @@ -3,7 +3,7 @@ * async.h * Asynchronous notification: NOTIFY, LISTEN, UNLISTEN * - * 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 * * 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); @@ -43,7 +43,6 @@ extern void AtAbort_Notify(void); extern void AtSubCommit_Notify(void); extern void AtSubAbort_Notify(void); extern void AtPrepare_Notify(void); -extern void ProcessCompletedNotifies(void); /* signal handler for inbound notifies (PROCSIG_NOTIFY_INTERRUPT) */ extern void HandleNotifyInterrupt(void); diff --git a/third_party/spanner_pg/src/include/commands/cluster.h b/third_party/spanner_pg/src/include/commands/cluster.h index a941f2ac..df8e73af 100644 --- a/third_party/spanner_pg/src/include/commands/cluster.h +++ b/third_party/spanner_pg/src/include/commands/cluster.h @@ -3,7 +3,7 @@ * cluster.h * header file for postgres cluster command stuff * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * 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 @@ -32,11 +34,11 @@ 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, char relpersistence, - LOCKMODE lockmode); +extern Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod, + char relpersistence, LOCKMODE lockmode); extern void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, bool is_system_catalog, bool swap_toast_by_content, diff --git a/third_party/spanner_pg/src/include/commands/collationcmds.h b/third_party/spanner_pg/src/include/commands/collationcmds.h index e49a5db0..201b19f8 100644 --- a/third_party/spanner_pg/src/include/commands/collationcmds.h +++ b/third_party/spanner_pg/src/include/commands/collationcmds.h @@ -4,7 +4,7 @@ * prototypes for collationcmds.c. * * - * 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 * * src/include/commands/collationcmds.h diff --git a/third_party/spanner_pg/src/include/commands/comment.h b/third_party/spanner_pg/src/include/commands/comment.h index 3a5f7256..2547ab00 100644 --- a/third_party/spanner_pg/src/include/commands/comment.h +++ b/third_party/spanner_pg/src/include/commands/comment.h @@ -7,7 +7,7 @@ * * Prototypes for functions in commands/comment.c * - * Copyright (c) 1999-2021, PostgreSQL Global Development Group + * Copyright (c) 1999-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/third_party/spanner_pg/src/include/commands/conversioncmds.h b/third_party/spanner_pg/src/include/commands/conversioncmds.h index 04385381..ab736fb6 100644 --- a/third_party/spanner_pg/src/include/commands/conversioncmds.h +++ b/third_party/spanner_pg/src/include/commands/conversioncmds.h @@ -4,7 +4,7 @@ * prototypes for conversioncmds.c. * * - * 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 * * src/include/commands/conversioncmds.h diff --git a/third_party/spanner_pg/src/include/commands/copy.h b/third_party/spanner_pg/src/include/commands/copy.h index 0321a58c..0c4e54c5 100644 --- a/third_party/spanner_pg/src/include/commands/copy.h +++ b/third_party/spanner_pg/src/include/commands/copy.h @@ -4,7 +4,7 @@ * Definitions for using the POSTGRES copy command. * * - * 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 * * 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; /* CSV 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/third_party/spanner_pg/src/include/commands/copyfrom_internal.h b/third_party/spanner_pg/src/include/commands/copyfrom_internal.h index 4d68d9cc..3df1c5a9 100644 --- a/third_party/spanner_pg/src/include/commands/copyfrom_internal.h +++ b/third_party/spanner_pg/src/include/commands/copyfrom_internal.h @@ -4,7 +4,7 @@ * Internal definitions for COPY FROM command. * * - * 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 * * src/include/commands/copyfrom_internal.h diff --git a/third_party/spanner_pg/src/include/commands/createas.h b/third_party/spanner_pg/src/include/commands/createas.h index ad5054d1..54a38491 100644 --- a/third_party/spanner_pg/src/include/commands/createas.h +++ b/third_party/spanner_pg/src/include/commands/createas.h @@ -4,7 +4,7 @@ * prototypes for createas.c. * * - * 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 * * src/include/commands/createas.h diff --git a/third_party/spanner_pg/src/include/commands/dbcommands.h b/third_party/spanner_pg/src/include/commands/dbcommands.h index 98428b89..ab61ba54 100644 --- a/third_party/spanner_pg/src/include/commands/dbcommands.h +++ b/third_party/spanner_pg/src/include/commands/dbcommands.h @@ -4,7 +4,7 @@ * Database management commands (create/drop database). * * - * 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 * * src/include/commands/dbcommands.h @@ -24,6 +24,7 @@ extern void dropdb(const char *dbname, bool missing_ok, bool force); extern void DropDatabase(ParseState *pstate, DropdbStmt *stmt); extern ObjectAddress RenameDatabase(const char *oldname, const char *newname); extern Oid AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel); +extern ObjectAddress AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt); extern Oid AlterDatabaseSet(AlterDatabaseSetStmt *stmt); extern ObjectAddress AlterDatabaseOwner(const char *dbname, Oid newOwnerId); diff --git a/third_party/spanner_pg/src/include/commands/dbcommands_xlog.h b/third_party/spanner_pg/src/include/commands/dbcommands_xlog.h index f5ed7626..0ee2452f 100644 --- a/third_party/spanner_pg/src/include/commands/dbcommands_xlog.h +++ b/third_party/spanner_pg/src/include/commands/dbcommands_xlog.h @@ -4,7 +4,7 @@ * Database resource manager XLOG definitions (create/drop database). * * - * 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 * * 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/third_party/spanner_pg/src/include/commands/defrem.h b/third_party/spanner_pg/src/include/commands/defrem.h index b8731e58..0f04d083 100644 --- a/third_party/spanner_pg/src/include/commands/defrem.h +++ b/third_party/spanner_pg/src/include/commands/defrem.h @@ -4,7 +4,7 @@ * POSTGRES define and remove utility definitions. * * - * 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 * * src/include/commands/defrem.h @@ -57,7 +57,7 @@ extern ObjectAddress CreateCast(CreateCastStmt *stmt); extern ObjectAddress CreateTransform(CreateTransformStmt *stmt); extern void IsThereFunctionInNamespace(const char *proname, int pronargs, oidvector *proargtypes, Oid nspOid); -extern void ExecuteDoStmt(DoStmt *stmt, bool atomic); +extern void ExecuteDoStmt(ParseState *pstate, DoStmt *stmt, bool atomic); extern void ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic, DestReceiver *dest); extern TupleDesc CallStmtResultDesc(CallStmt *stmt); extern Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok); @@ -85,6 +85,7 @@ extern ObjectAddress AlterOperator(AlterOperatorStmt *stmt); extern ObjectAddress CreateStatistics(CreateStatsStmt *stmt); extern ObjectAddress AlterStatistics(AlterStatsStmt *stmt); extern void RemoveStatisticsById(Oid statsOid); +extern void RemoveStatisticsDataById(Oid statsOid, bool inh); extern Oid StatisticsGetRelation(Oid statId, bool missing_ok); /* commands/aggregatecmds.c */ @@ -123,8 +124,8 @@ extern ObjectAddress AlterForeignServerOwner(const char *name, Oid newOwnerId); extern void AlterForeignServerOwner_oid(Oid, Oid newOwnerId); extern ObjectAddress AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId); extern void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId); -extern ObjectAddress CreateForeignDataWrapper(CreateFdwStmt *stmt); -extern ObjectAddress AlterForeignDataWrapper(AlterFdwStmt *stmt); +extern ObjectAddress CreateForeignDataWrapper(ParseState *pstate, CreateFdwStmt *stmt); +extern ObjectAddress AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt); extern ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt); extern ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt); extern ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt); @@ -151,9 +152,11 @@ extern double defGetNumeric(DefElem *def); extern bool defGetBoolean(DefElem *def); extern int32 defGetInt32(DefElem *def); extern int64 defGetInt64(DefElem *def); +extern Oid defGetObjectId(DefElem *def); extern List *defGetQualifiedName(DefElem *def); extern TypeName *defGetTypeName(DefElem *def); extern int defGetTypeLength(DefElem *def); extern List *defGetStringList(DefElem *def); +extern void errorConflictingDefElem(DefElem *defel, ParseState *pstate) pg_attribute_noreturn(); #endif /* DEFREM_H */ diff --git a/third_party/spanner_pg/src/include/commands/discard.h b/third_party/spanner_pg/src/include/commands/discard.h index 54b9dbba..86d9339e 100644 --- a/third_party/spanner_pg/src/include/commands/discard.h +++ b/third_party/spanner_pg/src/include/commands/discard.h @@ -4,7 +4,7 @@ * prototypes for discard.c. * * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/commands/discard.h * diff --git a/third_party/spanner_pg/src/include/commands/event_trigger.h b/third_party/spanner_pg/src/include/commands/event_trigger.h index c11bf2d7..10091c3a 100644 --- a/third_party/spanner_pg/src/include/commands/event_trigger.h +++ b/third_party/spanner_pg/src/include/commands/event_trigger.h @@ -3,7 +3,7 @@ * event_trigger.h * Declarations for command trigger handling. * - * 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 * * src/include/commands/event_trigger.h @@ -32,6 +32,7 @@ typedef struct EventTriggerData #define AT_REWRITE_ALTER_PERSISTENCE 0x01 #define AT_REWRITE_DEFAULT_VAL 0x02 #define AT_REWRITE_COLUMN_REWRITE 0x04 +#define AT_REWRITE_ACCESS_METHOD 0x08 /* * EventTriggerData is the node type that is passed as fmgr "context" info diff --git a/third_party/spanner_pg/src/include/commands/explain.h b/third_party/spanner_pg/src/include/commands/explain.h index af9482f4..787bd8c1 100644 --- a/third_party/spanner_pg/src/include/commands/explain.h +++ b/third_party/spanner_pg/src/include/commands/explain.h @@ -3,7 +3,7 @@ * explain.h * prototypes for explain.c * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * src/include/commands/explain.h diff --git a/third_party/spanner_pg/src/include/commands/extension.h b/third_party/spanner_pg/src/include/commands/extension.h index 24dbf86e..e24e3759 100644 --- a/third_party/spanner_pg/src/include/commands/extension.h +++ b/third_party/spanner_pg/src/include/commands/extension.h @@ -4,7 +4,7 @@ * Extension management commands (create/drop extension). * * - * 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 * * src/include/commands/extension.h diff --git a/third_party/spanner_pg/src/include/commands/lockcmds.h b/third_party/spanner_pg/src/include/commands/lockcmds.h index c005dee7..871b2414 100644 --- a/third_party/spanner_pg/src/include/commands/lockcmds.h +++ b/third_party/spanner_pg/src/include/commands/lockcmds.h @@ -4,7 +4,7 @@ * prototypes for lockcmds.c. * * - * 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 * * src/include/commands/lockcmds.h diff --git a/third_party/spanner_pg/src/include/commands/matview.h b/third_party/spanner_pg/src/include/commands/matview.h index 214b1c1d..a067da39 100644 --- a/third_party/spanner_pg/src/include/commands/matview.h +++ b/third_party/spanner_pg/src/include/commands/matview.h @@ -4,7 +4,7 @@ * prototypes for matview.c. * * - * 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 * * src/include/commands/matview.h diff --git a/third_party/spanner_pg/src/include/commands/policy.h b/third_party/spanner_pg/src/include/commands/policy.h index 116af689..c5f3753d 100644 --- a/third_party/spanner_pg/src/include/commands/policy.h +++ b/third_party/spanner_pg/src/include/commands/policy.h @@ -4,7 +4,7 @@ * prototypes for policy.c. * * - * 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 * * src/include/commands/policy.h diff --git a/third_party/spanner_pg/src/include/commands/portalcmds.h b/third_party/spanner_pg/src/include/commands/portalcmds.h index 5d5e7666..ab52c822 100644 --- a/third_party/spanner_pg/src/include/commands/portalcmds.h +++ b/third_party/spanner_pg/src/include/commands/portalcmds.h @@ -4,7 +4,7 @@ * prototypes for portalcmds.c. * * - * 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 * * src/include/commands/portalcmds.h diff --git a/third_party/spanner_pg/src/include/commands/prepare.h b/third_party/spanner_pg/src/include/commands/prepare.h index 93525815..e30df8f7 100644 --- a/third_party/spanner_pg/src/include/commands/prepare.h +++ b/third_party/spanner_pg/src/include/commands/prepare.h @@ -4,7 +4,7 @@ * PREPARE, EXECUTE and DEALLOCATE commands, and prepared-stmt storage * * - * Copyright (c) 2002-2021, PostgreSQL Global Development Group + * Copyright (c) 2002-2022, PostgreSQL Global Development Group * * src/include/commands/prepare.h * diff --git a/third_party/spanner_pg/src/include/commands/proclang.h b/third_party/spanner_pg/src/include/commands/proclang.h index 16e857fd..60d461bb 100644 --- a/third_party/spanner_pg/src/include/commands/proclang.h +++ b/third_party/spanner_pg/src/include/commands/proclang.h @@ -3,7 +3,7 @@ * proclang.h * prototypes for proclang.c. * - * 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 * * src/include/commands/proclang.h diff --git a/third_party/spanner_pg/src/include/commands/progress.h b/third_party/spanner_pg/src/include/commands/progress.h index d7bf1636..a28938ca 100644 --- a/third_party/spanner_pg/src/include/commands/progress.h +++ b/third_party/spanner_pg/src/include/commands/progress.h @@ -7,7 +7,7 @@ * constants, you probably also need to update the views based on them * in system_views.sql. * - * 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 * * src/include/commands/progress.h diff --git a/third_party/spanner_pg/src/include/commands/publicationcmds.h b/third_party/spanner_pg/src/include/commands/publicationcmds.h index 5432dda4..57df3fc1 100644 --- a/third_party/spanner_pg/src/include/commands/publicationcmds.h +++ b/third_party/spanner_pg/src/include/commands/publicationcmds.h @@ -4,7 +4,7 @@ * prototypes for publicationcmds.c. * * - * 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 * * src/include/commands/publicationcmds.h @@ -16,19 +16,24 @@ #define PUBLICATIONCMDS_H #include "catalog/objectaddress.h" -#include "nodes/parsenodes.h" +#include "parser/parse_node.h" #include "utils/inval.h" /* Same as MAXNUMMESSAGES in sinvaladt.c */ #define MAX_RELCACHE_INVAL_MSGS 4096 -extern ObjectAddress CreatePublication(CreatePublicationStmt *stmt); -extern void AlterPublication(AlterPublicationStmt *stmt); +extern ObjectAddress CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt); +extern void AlterPublication(ParseState *pstate, AlterPublicationStmt *stmt); extern void RemovePublicationById(Oid pubid); extern void RemovePublicationRelById(Oid proid); +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 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/third_party/spanner_pg/src/include/commands/schemacmds.h b/third_party/spanner_pg/src/include/commands/schemacmds.h index 25f4876f..8c21f2a2 100644 --- a/third_party/spanner_pg/src/include/commands/schemacmds.h +++ b/third_party/spanner_pg/src/include/commands/schemacmds.h @@ -4,7 +4,7 @@ * prototypes for schemacmds.c. * * - * 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 * * src/include/commands/schemacmds.h diff --git a/third_party/spanner_pg/src/include/commands/seclabel.h b/third_party/spanner_pg/src/include/commands/seclabel.h index 40e284e8..1577988f 100644 --- a/third_party/spanner_pg/src/include/commands/seclabel.h +++ b/third_party/spanner_pg/src/include/commands/seclabel.h @@ -3,7 +3,7 @@ * * Prototypes for functions in commands/seclabel.c * - * 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 */ #ifndef SECLABEL_H diff --git a/third_party/spanner_pg/src/include/commands/sequence.h b/third_party/spanner_pg/src/include/commands/sequence.h index 40544dd4..9da23008 100644 --- a/third_party/spanner_pg/src/include/commands/sequence.h +++ b/third_party/spanner_pg/src/include/commands/sequence.h @@ -3,7 +3,7 @@ * sequence.h * prototypes for sequence.c. * - * 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 * * src/include/commands/sequence.h @@ -57,6 +57,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 ResetSequenceCaches(void); diff --git a/third_party/spanner_pg/src/include/commands/subscriptioncmds.h b/third_party/spanner_pg/src/include/commands/subscriptioncmds.h index 3b926f35..2cbe7d7b 100644 --- a/third_party/spanner_pg/src/include/commands/subscriptioncmds.h +++ b/third_party/spanner_pg/src/include/commands/subscriptioncmds.h @@ -4,7 +4,7 @@ * prototypes for subscriptioncmds.c. * * - * 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 * * src/include/commands/subscriptioncmds.h @@ -16,11 +16,11 @@ #define SUBSCRIPTIONCMDS_H #include "catalog/objectaddress.h" -#include "nodes/parsenodes.h" +#include "parser/parse_node.h" -extern ObjectAddress CreateSubscription(CreateSubscriptionStmt *stmt, +extern ObjectAddress CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, bool isTopLevel); -extern ObjectAddress AlterSubscription(AlterSubscriptionStmt *stmt, bool isTopLevel); +extern ObjectAddress AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, bool isTopLevel); extern void DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel); extern ObjectAddress AlterSubscriptionOwner(const char *name, Oid newOwnerId); diff --git a/third_party/spanner_pg/src/include/commands/tablecmds.h b/third_party/spanner_pg/src/include/commands/tablecmds.h index 336549cc..5d4037f2 100644 --- a/third_party/spanner_pg/src/include/commands/tablecmds.h +++ b/third_party/spanner_pg/src/include/commands/tablecmds.h @@ -4,7 +4,7 @@ * prototypes for tablecmds.c. * * - * 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 * * src/include/commands/tablecmds.h diff --git a/third_party/spanner_pg/src/include/commands/tablespace.h b/third_party/spanner_pg/src/include/commands/tablespace.h index f33ba51b..24b64733 100644 --- a/third_party/spanner_pg/src/include/commands/tablespace.h +++ b/third_party/spanner_pg/src/include/commands/tablespace.h @@ -4,7 +4,7 @@ * Tablespace management commands (create/drop tablespace). * * - * 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 * * 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/third_party/spanner_pg/src/include/commands/trigger.h b/third_party/spanner_pg/src/include/commands/trigger.h index a97a2ef8..fff8d16c 100644 --- a/third_party/spanner_pg/src/include/commands/trigger.h +++ b/third_party/spanner_pg/src/include/commands/trigger.h @@ -3,7 +3,7 @@ * trigger.h * Declarations for trigger handling. * - * 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 * * 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" @@ -160,11 +161,18 @@ extern ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *que Node *whenClause, bool isInternal, bool in_partition, char trigger_fires_when); +extern void TriggerSetParentTrigger(Relation trigRel, + Oid childTrigId, + Oid parentTrigId, + Oid childTableId); extern void RemoveTriggerById(Oid trigOid); extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok); extern ObjectAddress renametrig(RenameStmt *stmt); +extern void EnableDisableTriggerNew2(Relation rel, const char *tgname, Oid tgparent, + char fires_when, bool skip_system, bool recurse, + LOCKMODE lockmode); extern void EnableDisableTriggerNew(Relation rel, const char *tgname, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode); @@ -203,6 +211,14 @@ extern void ExecBSDeleteTriggers(EState *estate, extern void ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture); +extern bool ExecBRDeleteTriggersNew(EState *estate, + EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot, + TM_Result *tmresult, + TM_FailureData *tmfd); extern bool ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, @@ -213,7 +229,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); @@ -222,19 +239,31 @@ extern void ExecBSUpdateTriggers(EState *estate, extern void ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture); +extern bool ExecBRUpdateTriggersNew(EState *estate, + EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_Result *tmresult, + TM_FailureData *tmfd); extern bool ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, ItemPointer tupleid, HeapTuple fdw_trigtuple, - TupleTableSlot *slot); + TupleTableSlot *slot, + TM_FailureData *tmfdp); 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/third_party/spanner_pg/src/include/commands/typecmds.h b/third_party/spanner_pg/src/include/commands/typecmds.h index 88067912..a17bedb8 100644 --- a/third_party/spanner_pg/src/include/commands/typecmds.h +++ b/third_party/spanner_pg/src/include/commands/typecmds.h @@ -4,7 +4,7 @@ * prototypes for typecmds.c. * * - * 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 * * src/include/commands/typecmds.h @@ -25,7 +25,7 @@ extern ObjectAddress DefineType(ParseState *pstate, List *names, List *parameter extern void RemoveTypeById(Oid typeOid); extern ObjectAddress DefineDomain(CreateDomainStmt *stmt); extern ObjectAddress DefineEnum(CreateEnumStmt *stmt); -extern ObjectAddress DefineRange(CreateRangeStmt *stmt); +extern ObjectAddress DefineRange(ParseState *pstate, CreateRangeStmt *stmt); extern ObjectAddress AlterEnum(AlterEnumStmt *stmt); extern ObjectAddress DefineCompositeType(RangeVar *typevar, List *coldeflist); extern Oid AssignTypeArrayOid(void); diff --git a/third_party/spanner_pg/src/include/commands/user.h b/third_party/spanner_pg/src/include/commands/user.h index 028e0dde..d3dd8303 100644 --- a/third_party/spanner_pg/src/include/commands/user.h +++ b/third_party/spanner_pg/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); @@ -25,7 +25,7 @@ typedef void (*check_password_hook_type) (const char *username, const char *shad extern PGDLLIMPORT check_password_hook_type check_password_hook; extern Oid CreateRole(ParseState *pstate, CreateRoleStmt *stmt); -extern Oid AlterRole(AlterRoleStmt *stmt); +extern Oid AlterRole(ParseState *pstate, AlterRoleStmt *stmt); extern Oid AlterRoleSet(AlterRoleSetStmt *stmt); extern void DropRole(DropRoleStmt *stmt); extern void GrantRole(GrantRoleStmt *stmt); diff --git a/third_party/spanner_pg/src/include/commands/vacuum.h b/third_party/spanner_pg/src/include/commands/vacuum.h index 60e79fd5..051a7f2f 100644 --- a/third_party/spanner_pg/src/include/commands/vacuum.h +++ b/third_party/spanner_pg/src/include/commands/vacuum.h @@ -4,7 +4,7 @@ * header file for postgres vacuum cleaner and statistics analyzer * * - * 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 * * src/include/commands/vacuum.h @@ -15,6 +15,8 @@ #define VACUUM_H #include "access/htup.h" +#include "access/genam.h" +#include "access/parallel.h" #include "catalog/pg_class.h" #include "catalog/pg_statistic.h" #include "catalog/pg_type.h" @@ -62,6 +64,9 @@ /* value for checking vacuum flags */ #define VACUUM_OPTION_MAX_VALID_VALUE ((1 << 3) - 1) +/* Abstract type for parallel vacuum state */ +typedef struct ParallelVacuumState ParallelVacuumState; + /*---------- * ANALYZE builds one of these structs for each attribute (column) that is * to be analyzed. The struct and subsidiary data are in anl_context, @@ -177,7 +182,7 @@ typedef struct VacAttrStats /* flag bits for VacuumParams->options */ #define VACOPT_VACUUM 0x01 /* do VACUUM */ #define VACOPT_ANALYZE 0x02 /* do ANALYZE */ -#define VACOPT_VERBOSE 0x04 /* print progress info */ +#define VACOPT_VERBOSE 0x04 /* output INFO instrumentation messages */ #define VACOPT_FREEZE 0x08 /* FREEZE option */ #define VACOPT_FULL 0x10 /* FULL (non-concurrent) vacuum */ #define VACOPT_SKIP_LOCKED 0x20 /* skip if cannot get lock */ @@ -217,8 +222,8 @@ typedef struct VacuumParams * whole table */ bool is_wraparound; /* force a for-wraparound vacuum */ int log_min_duration; /* minimum execution threshold in ms at - * which verbose logs are activated, -1 - * to use default */ + * which autovacuum is logged, -1 to use + * default */ VacOptValue index_cleanup; /* Do index vacuum and cleanup */ VacOptValue truncate; /* Truncate empty pages at the end */ @@ -230,19 +235,34 @@ typedef struct VacuumParams int nworkers; } VacuumParams; +/* + * VacDeadItems stores TIDs whose index tuples are deleted by index vacuuming. + */ +typedef struct VacDeadItems +{ + int max_items; /* # slots allocated in array */ + int num_items; /* current # of entries */ + + /* Sorted array of TIDs to delete from indexes */ + ItemPointerData items[FLEXIBLE_ARRAY_MEMBER]; +} VacDeadItems; + +#define MAXDEADITEMS(avail_mem) \ + (((avail_mem) - offsetof(VacDeadItems, items)) / sizeof(ItemPointerData)) + /* 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 */ @@ -264,16 +284,17 @@ extern void vac_update_relstats(Relation relation, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, + bool *frozenxid_updated, + bool *minmulti_updated, bool in_outer_xact); -extern void vacuum_set_xid_limits(Relation rel, +extern bool vacuum_set_xid_limits(Relation rel, int freeze_min_age, int freeze_table_age, int multixact_freeze_min_age, int multixact_freeze_table_age, TransactionId *oldestXmin, + MultiXactId *oldestMxact, TransactionId *freezeLimit, - TransactionId *xidFullScanLimit, - MultiXactId *multiXactCutoff, - MultiXactId *mxactFullScanLimit); + MultiXactId *multiXactCutoff); extern bool vacuum_xid_failsafe_check(TransactionId relfrozenxid, MultiXactId relminmxid); extern void vac_update_datfrozenxid(void); @@ -283,6 +304,28 @@ extern bool vacuum_is_relation_owner(Oid relid, Form_pg_class reltuple, extern Relation vacuum_open_relation(Oid relid, RangeVar *relation, bits32 options, bool verbose, LOCKMODE lmode); +extern IndexBulkDeleteResult *vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, + IndexBulkDeleteResult *istat, + VacDeadItems *dead_items); +extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, + IndexBulkDeleteResult *istat); +extern Size vac_max_items_to_alloc_size(int max_items); + +/* in commands/vacuumparallel.c */ +extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, + int nindexes, int nrequested_workers, + int max_items, int elevel, + BufferAccessStrategy bstrategy); +extern void parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats); +extern VacDeadItems *parallel_vacuum_get_dead_items(ParallelVacuumState *pvs); +extern void parallel_vacuum_bulkdel_all_indexes(ParallelVacuumState *pvs, + long num_table_tuples, + int num_index_scans); +extern void parallel_vacuum_cleanup_all_indexes(ParallelVacuumState *pvs, + long num_table_tuples, + int num_index_scans, + bool estimated_count); +extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc); /* in commands/analyze.c */ extern void analyze_rel(Oid relid, RangeVar *relation, diff --git a/third_party/spanner_pg/src/include/commands/variable.h b/third_party/spanner_pg/src/include/commands/variable.h index 483bc791..0e5ddcbc 100644 --- a/third_party/spanner_pg/src/include/commands/variable.h +++ b/third_party/spanner_pg/src/include/commands/variable.h @@ -2,7 +2,7 @@ * variable.h * Routines for handling specialized SET variables. * - * 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 * * src/include/commands/variable.h diff --git a/third_party/spanner_pg/src/include/commands/view.h b/third_party/spanner_pg/src/include/commands/view.h index d1032bd5..0e7aa1ff 100644 --- a/third_party/spanner_pg/src/include/commands/view.h +++ b/third_party/spanner_pg/src/include/commands/view.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/commands/view.h diff --git a/third_party/spanner_pg/src/include/common/archive.h b/third_party/spanner_pg/src/include/common/archive.h index b5fd143b..bbb64c36 100644 --- a/third_party/spanner_pg/src/include/common/archive.h +++ b/third_party/spanner_pg/src/include/common/archive.h @@ -3,7 +3,7 @@ * archive.h * Common WAL archive routines * - * 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 * * src/include/common/archive.h diff --git a/third_party/spanner_pg/src/include/common/base64.h b/third_party/spanner_pg/src/include/common/base64.h index 3b970561..8a040e8c 100644 --- a/third_party/spanner_pg/src/include/common/base64.h +++ b/third_party/spanner_pg/src/include/common/base64.h @@ -3,7 +3,7 @@ * Encoding and decoding routines for base64 without whitespace * support. * - * Portions Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2001-2022, PostgreSQL Global Development Group * * src/include/common/base64.h */ diff --git a/third_party/spanner_pg/src/include/common/checksum_helper.h b/third_party/spanner_pg/src/include/common/checksum_helper.h index cac7570e..23816cac 100644 --- a/third_party/spanner_pg/src/include/common/checksum_helper.h +++ b/third_party/spanner_pg/src/include/common/checksum_helper.h @@ -3,7 +3,7 @@ * checksum_helper.h * Compute a checksum of any of various types using common routines * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/common/checksum_helper.h diff --git a/third_party/spanner_pg/src/include/common/compression.h b/third_party/spanner_pg/src/include/common/compression.h new file mode 100644 index 00000000..bb80e881 --- /dev/null +++ b/third_party/spanner_pg/src/include/common/compression.h @@ -0,0 +1,45 @@ +/*------------------------------------------------------------------------- + * + * compression.h + * + * Shared definitions for compression methods and specifications. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/compression.h + *------------------------------------------------------------------------- + */ + +#ifndef PG_COMPRESSION_H +#define PG_COMPRESSION_H + +typedef enum pg_compress_algorithm +{ + PG_COMPRESSION_NONE, + PG_COMPRESSION_GZIP, + PG_COMPRESSION_LZ4, + PG_COMPRESSION_ZSTD +} pg_compress_algorithm; + +#define PG_COMPRESSION_OPTION_WORKERS (1 << 0) + +typedef struct pg_compress_specification +{ + pg_compress_algorithm algorithm; + unsigned options; /* OR of PG_COMPRESSION_OPTION constants */ + int level; + int workers; + char *parse_error; /* NULL if parsing was OK, else message */ +} pg_compress_specification; + +extern bool parse_compress_algorithm(char *name, pg_compress_algorithm *algorithm); +extern const char *get_compress_algorithm_name(pg_compress_algorithm algorithm); + +extern void parse_compress_specification(pg_compress_algorithm algorithm, + char *specification, + pg_compress_specification *result); + +extern char *validate_compress_specification(pg_compress_specification *); + +#endif diff --git a/third_party/spanner_pg/src/include/common/config_info.h b/third_party/spanner_pg/src/include/common/config_info.h index 814f4d3d..cb7df55b 100644 --- a/third_party/spanner_pg/src/include/common/config_info.h +++ b/third_party/spanner_pg/src/include/common/config_info.h @@ -2,7 +2,7 @@ * config_info.h * Common code for pg_config output * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/common/config_info.h */ diff --git a/third_party/spanner_pg/src/include/common/connect.h b/third_party/spanner_pg/src/include/common/connect.h index 71c2d6e7..7fce19d6 100644 --- a/third_party/spanner_pg/src/include/common/connect.h +++ b/third_party/spanner_pg/src/include/common/connect.h @@ -3,7 +3,7 @@ * Interfaces in support of FE/BE connections. * * - * 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 * * src/include/common/connect.h diff --git a/third_party/spanner_pg/src/include/common/controldata_utils.h b/third_party/spanner_pg/src/include/common/controldata_utils.h index dea78113..b1dab754 100644 --- a/third_party/spanner_pg/src/include/common/controldata_utils.h +++ b/third_party/spanner_pg/src/include/common/controldata_utils.h @@ -2,7 +2,7 @@ * controldata_utils.h * Common code for pg_controldata output * - * 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 * * src/include/common/controldata_utils.h diff --git a/third_party/spanner_pg/src/include/common/cryptohash.h b/third_party/spanner_pg/src/include/common/cryptohash.h index 541dc844..8e339c83 100644 --- a/third_party/spanner_pg/src/include/common/cryptohash.h +++ b/third_party/spanner_pg/src/include/common/cryptohash.h @@ -3,7 +3,7 @@ * cryptohash.h * Generic headers for cryptographic hash functions. * - * 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 * * IDENTIFICATION @@ -34,5 +34,6 @@ extern int pg_cryptohash_init(pg_cryptohash_ctx *ctx); extern int pg_cryptohash_update(pg_cryptohash_ctx *ctx, const uint8 *data, size_t len); extern int pg_cryptohash_final(pg_cryptohash_ctx *ctx, uint8 *dest, size_t len); extern void pg_cryptohash_free(pg_cryptohash_ctx *ctx); +extern const char *pg_cryptohash_error(pg_cryptohash_ctx *ctx); #endif /* PG_CRYPTOHASH_H */ diff --git a/third_party/spanner_pg/src/include/common/fe_memutils.h b/third_party/spanner_pg/src/include/common/fe_memutils.h index b706aa19..63f2b6a8 100644 --- a/third_party/spanner_pg/src/include/common/fe_memutils.h +++ b/third_party/spanner_pg/src/include/common/fe_memutils.h @@ -2,7 +2,7 @@ * fe_memutils.h * memory management support for frontend code * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/common/fe_memutils.h */ diff --git a/third_party/spanner_pg/src/include/common/file_perm.h b/third_party/spanner_pg/src/include/common/file_perm.h index ba1823a0..48d68ef2 100644 --- a/third_party/spanner_pg/src/include/common/file_perm.h +++ b/third_party/spanner_pg/src/include/common/file_perm.h @@ -3,7 +3,7 @@ * File and directory permission definitions * * - * 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 * * 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/third_party/spanner_pg/src/include/common/file_utils.h b/third_party/spanner_pg/src/include/common/file_utils.h index 978a5746..2811744c 100644 --- a/third_party/spanner_pg/src/include/common/file_utils.h +++ b/third_party/spanner_pg/src/include/common/file_utils.h @@ -3,7 +3,7 @@ * Assorted utility functions to work on files. * * - * 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 * * src/include/common/file_utils.h diff --git a/third_party/spanner_pg/src/include/common/hashfn.h b/third_party/spanner_pg/src/include/common/hashfn.h index c634cc06..8d539c0a 100644 --- a/third_party/spanner_pg/src/include/common/hashfn.h +++ b/third_party/spanner_pg/src/include/common/hashfn.h @@ -1,7 +1,7 @@ /* * Utilities for working with hash values. * - * Portions Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2022, PostgreSQL Global Development Group */ #ifndef HASHFN_H diff --git a/third_party/spanner_pg/src/include/common/hmac.h b/third_party/spanner_pg/src/include/common/hmac.h index dd012e66..c18783fe 100644 --- a/third_party/spanner_pg/src/include/common/hmac.h +++ b/third_party/spanner_pg/src/include/common/hmac.h @@ -3,7 +3,7 @@ * hmac.h * Generic headers for HMAC * - * 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 * * IDENTIFICATION @@ -25,5 +25,6 @@ extern int pg_hmac_init(pg_hmac_ctx *ctx, const uint8 *key, size_t len); extern int pg_hmac_update(pg_hmac_ctx *ctx, const uint8 *data, size_t len); extern int pg_hmac_final(pg_hmac_ctx *ctx, uint8 *dest, size_t len); extern void pg_hmac_free(pg_hmac_ctx *ctx); +extern const char *pg_hmac_error(pg_hmac_ctx *ctx); #endif /* PG_HMAC_H */ diff --git a/third_party/spanner_pg/src/include/common/int.h b/third_party/spanner_pg/src/include/common/int.h index 6e1e51ec..6c83c3b9 100644 --- a/third_party/spanner_pg/src/include/common/int.h +++ b/third_party/spanner_pg/src/include/common/int.h @@ -11,7 +11,7 @@ * the 64 bit cases can be considerably faster with intrinsics. In case no * intrinsics are available 128 bit math is used where available. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/include/common/int.h * @@ -218,8 +218,12 @@ pg_sub_s64_overflow(int64 a, int64 b, int64 *result) *result = (int64) res; return false; #else + /* + * Note: overflow is also possible when a == 0 and b < 0 (specifically, + * when b == PG_INT64_MIN). + */ if ((a < 0 && b > 0 && a < PG_INT64_MIN + b) || - (a > 0 && b < 0 && a > PG_INT64_MAX + b)) + (a >= 0 && b < 0 && a > PG_INT64_MAX + b)) { *result = 0x5EED; /* to avoid spurious warnings */ return true; diff --git a/third_party/spanner_pg/src/include/common/int128.h b/third_party/spanner_pg/src/include/common/int128.h index 01aedf6d..8f035cf4 100644 --- a/third_party/spanner_pg/src/include/common/int128.h +++ b/third_party/spanner_pg/src/include/common/int128.h @@ -8,7 +8,7 @@ * * See src/tools/testint128.c for a simple test harness for this file. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/include/common/int128.h * diff --git a/third_party/spanner_pg/src/include/common/ip.h b/third_party/spanner_pg/src/include/common/ip.h index 27f8c4cc..84145209 100644 --- a/third_party/spanner_pg/src/include/common/ip.h +++ b/third_party/spanner_pg/src/include/common/ip.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/common/ip.h * @@ -18,12 +18,6 @@ #include "libpq/pqcomm.h" /* pgrminclude ignore */ -#ifdef HAVE_UNIX_SOCKETS -#define IS_AF_UNIX(fam) ((fam) == AF_UNIX) -#else -#define IS_AF_UNIX(fam) (0) -#endif - extern int pg_getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result); diff --git a/third_party/spanner_pg/src/include/common/jsonapi.h b/third_party/spanner_pg/src/include/common/jsonapi.h index ec3dfce9..8d31630e 100644 --- a/third_party/spanner_pg/src/include/common/jsonapi.h +++ b/third_party/spanner_pg/src/include/common/jsonapi.h @@ -3,7 +3,7 @@ * jsonapi.h * Declarations for JSON API support. * - * 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 * * 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/third_party/spanner_pg/src/include/common/keywords.h b/third_party/spanner_pg/src/include/common/keywords.h index 19e4eda8..b85237f9 100644 --- a/third_party/spanner_pg/src/include/common/keywords.h +++ b/third_party/spanner_pg/src/include/common/keywords.h @@ -4,7 +4,7 @@ * PostgreSQL's list of SQL keywords * * - * 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 * * src/include/common/keywords.h @@ -22,14 +22,8 @@ #define TYPE_FUNC_NAME_KEYWORD 2 #define RESERVED_KEYWORD 3 -#ifndef FRONTEND extern PGDLLIMPORT const ScanKeywordList ScanKeywords; extern PGDLLIMPORT const uint8 ScanKeywordCategories[]; extern PGDLLIMPORT const bool ScanKeywordBareLabel[]; -#else -extern const ScanKeywordList ScanKeywords; -extern const uint8 ScanKeywordCategories[]; -extern const bool ScanKeywordBareLabel[]; -#endif #endif /* KEYWORDS_H */ diff --git a/third_party/spanner_pg/src/include/common/kwlookup.h b/third_party/spanner_pg/src/include/common/kwlookup.h index 70d4b8e5..48d7f08b 100644 --- a/third_party/spanner_pg/src/include/common/kwlookup.h +++ b/third_party/spanner_pg/src/include/common/kwlookup.h @@ -4,7 +4,7 @@ * Key word lookup for PostgreSQL * * - * 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 * * src/include/common/kwlookup.h diff --git a/third_party/spanner_pg/src/include/common/link-canary.h b/third_party/spanner_pg/src/include/common/link-canary.h index acb05b65..4733cd25 100644 --- a/third_party/spanner_pg/src/include/common/link-canary.h +++ b/third_party/spanner_pg/src/include/common/link-canary.h @@ -3,7 +3,7 @@ * link-canary.h * Detect whether src/common functions came from frontend or backend. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * src/include/common/link-canary.h * diff --git a/third_party/spanner_pg/src/include/common/logging.h b/third_party/spanner_pg/src/include/common/logging.h index a71cf842..9f426c32 100644 --- a/third_party/spanner_pg/src/include/common/logging.h +++ b/third_party/spanner_pg/src/include/common/logging.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * Logging framework for frontend programs * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * 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,20 +43,42 @@ 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.) - */ - PG_LOG_FATAL, - - /* - * Turn all logging off. + * Turn all logging off (not to be used as an actual message log level). */ 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 +{ + /* + * The primary message. Try to keep it to one line; follow the backend's + * style guideline for primary messages. + */ + PG_LOG_PRIMARY, + + /* + * 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 * the regression tests. @@ -70,27 +92,65 @@ 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); -#define pg_log_fatal(...) do { \ - if (likely(__pg_log_level <= PG_LOG_FATAL)) pg_log_generic(PG_LOG_FATAL, __VA_ARGS__); \ - } while(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(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__) + +#define pg_log_error_detail(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_DETAIL, __VA_ARGS__) + +#define pg_log_error_hint(...) \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_HINT, __VA_ARGS__) + +#define pg_log_warning(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_PRIMARY, __VA_ARGS__) + +#define pg_log_warning_detail(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_DETAIL, __VA_ARGS__) -#define pg_log_error(...) do { \ - if (likely(__pg_log_level <= PG_LOG_ERROR)) pg_log_generic(PG_LOG_ERROR, __VA_ARGS__); \ +#define pg_log_warning_hint(...) \ + pg_log_generic(PG_LOG_WARNING, PG_LOG_HINT, __VA_ARGS__) + +#define pg_log_info(...) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_PRIMARY, __VA_ARGS__) + +#define pg_log_info_detail(...) \ + pg_log_generic(PG_LOG_INFO, PG_LOG_DETAIL, __VA_ARGS__) + +#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)) \ + pg_log_generic(PG_LOG_DEBUG, PG_LOG_PRIMARY, __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__); \ +#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_info(...) do { \ - if (likely(__pg_log_level <= PG_LOG_INFO)) pg_log_generic(PG_LOG_INFO, __VA_ARGS__); \ +#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) -#define pg_log_debug(...) do { \ - if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) pg_log_generic(PG_LOG_DEBUG, __VA_ARGS__); \ +/* + * A common shortcut: pg_log_error() and immediately exit(1). + */ +#define pg_fatal(...) do { \ + pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \ + exit(1); \ } while(0) #endif /* COMMON_LOGGING_H */ diff --git a/third_party/spanner_pg/src/include/common/md5.h b/third_party/spanner_pg/src/include/common/md5.h index 62a31e6e..942ca424 100644 --- a/third_party/spanner_pg/src/include/common/md5.h +++ b/third_party/spanner_pg/src/include/common/md5.h @@ -6,7 +6,7 @@ * These definitions are needed by both frontend and backend code to work * with MD5-encrypted passwords. * - * 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 * * src/include/common/md5.h @@ -26,9 +26,12 @@ #define MD5_PASSWD_LEN 35 /* Utilities common to all the MD5 implementations, as of md5_common.c */ -extern bool pg_md5_hash(const void *buff, size_t len, char *hexsum); -extern bool pg_md5_binary(const void *buff, size_t len, void *outbuf); +extern bool pg_md5_hash(const void *buff, size_t len, char *hexsum, + const char **errstr); +extern bool pg_md5_binary(const void *buff, size_t len, void *outbuf, + const char **errstr); extern bool pg_md5_encrypt(const char *passwd, const char *salt, - size_t salt_len, char *buf); + size_t salt_len, char *buf, + const char **errstr); #endif /* PG_MD5_H */ diff --git a/third_party/spanner_pg/src/include/common/openssl.h b/third_party/spanner_pg/src/include/common/openssl.h index fcc5b505..aae5a341 100644 --- a/third_party/spanner_pg/src/include/common/openssl.h +++ b/third_party/spanner_pg/src/include/common/openssl.h @@ -3,7 +3,7 @@ * openssl.h * OpenSSL supporting functionality shared between frontend and backend * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/common/pg_lzcompress.h b/third_party/spanner_pg/src/include/common/pg_lzcompress.h index 3e53fbe9..2a12b33a 100644 --- a/third_party/spanner_pg/src/include/common/pg_lzcompress.h +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/include/common/pg_prng.h b/third_party/spanner_pg/src/include/common/pg_prng.h new file mode 100644 index 00000000..d9895b49 --- /dev/null +++ b/third_party/spanner_pg/src/include/common/pg_prng.h @@ -0,0 +1,60 @@ +/*------------------------------------------------------------------------- + * + * Pseudo-Random Number Generator + * + * Copyright (c) 2021-2022, PostgreSQL Global Development Group + * + * src/include/common/pg_prng.h + * + *------------------------------------------------------------------------- + */ +#ifndef PG_PRNG_H +#define PG_PRNG_H + +/* + * State vector for PRNG generation. Callers should treat this as an + * opaque typedef, but we expose its definition to allow it to be + * embedded in other structs. + */ +typedef struct pg_prng_state +{ + uint64 s0, + s1; +} pg_prng_state; + +/* + * Callers not needing local PRNG series may use this global state vector, + * after initializing it with one of the pg_prng_...seed functions. + */ +extern PGDLLIMPORT pg_prng_state pg_global_prng_state; + +extern void pg_prng_seed(pg_prng_state *state, uint64 seed); +extern void pg_prng_fseed(pg_prng_state *state, double fseed); +extern bool pg_prng_seed_check(pg_prng_state *state); + +/* + * Initialize the PRNG state from the pg_strong_random source, + * taking care that we don't produce all-zeroes. If this returns false, + * caller should initialize the PRNG state from some other random seed, + * using pg_prng_[f]seed. + * + * We implement this as a macro, so that the pg_strong_random() call is + * in the caller. If it were in pg_prng.c, programs using pg_prng.c + * but not needing strong seeding would nonetheless be forced to pull in + * pg_strong_random.c and thence OpenSSL. + */ +#define pg_prng_strong_seed(state) \ + (pg_strong_random((void *) (state), sizeof(pg_prng_state)) ? \ + pg_prng_seed_check(state) : false) + +extern uint64 pg_prng_uint64(pg_prng_state *state); +extern uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax); +extern int64 pg_prng_int64(pg_prng_state *state); +extern int64 pg_prng_int64p(pg_prng_state *state); +extern uint32 pg_prng_uint32(pg_prng_state *state); +extern int32 pg_prng_int32(pg_prng_state *state); +extern int32 pg_prng_int32p(pg_prng_state *state); +extern double pg_prng_double(pg_prng_state *state); +extern bool pg_prng_bool(pg_prng_state *state); + +#endif /* PG_PRNG_H */ diff --git a/third_party/spanner_pg/src/include/common/relpath.h b/third_party/spanner_pg/src/include/common/relpath.h index a44be11c..13849a37 100644 --- a/third_party/spanner_pg/src/include/common/relpath.h +++ b/third_party/spanner_pg/src/include/common/relpath.h @@ -3,7 +3,7 @@ * relpath.h * Declarations for GetRelationPath() and friends * - * 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 * * 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/third_party/spanner_pg/src/include/common/restricted_token.h b/third_party/spanner_pg/src/include/common/restricted_token.h index 75455e6d..0b6bdaf5 100644 --- a/third_party/spanner_pg/src/include/common/restricted_token.h +++ b/third_party/spanner_pg/src/include/common/restricted_token.h @@ -2,7 +2,7 @@ * restricted_token.h * helper routine to ensure restricted token on Windows * - * 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 * * src/include/common/restricted_token.h diff --git a/third_party/spanner_pg/src/include/common/saslprep.h b/third_party/spanner_pg/src/include/common/saslprep.h index a2c7a464..305c8f4a 100644 --- a/third_party/spanner_pg/src/include/common/saslprep.h +++ b/third_party/spanner_pg/src/include/common/saslprep.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/include/common/saslprep.h * diff --git a/third_party/spanner_pg/src/include/common/scram-common.h b/third_party/spanner_pg/src/include/common/scram-common.h index 5777ce9f..d1f840c1 100644 --- a/third_party/spanner_pg/src/include/common/scram-common.h +++ b/third_party/spanner_pg/src/include/common/scram-common.h @@ -3,7 +3,7 @@ * scram-common.h * Declarations for helper functions used for SCRAM authentication * - * 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 * * src/include/common/scram-common.h @@ -47,12 +47,16 @@ #define SCRAM_DEFAULT_ITERATIONS 4096 extern int scram_SaltedPassword(const char *password, const char *salt, - int saltlen, int iterations, uint8 *result); -extern int scram_H(const uint8 *str, int len, uint8 *result); -extern int scram_ClientKey(const uint8 *salted_password, uint8 *result); -extern int scram_ServerKey(const uint8 *salted_password, uint8 *result); + int saltlen, int iterations, uint8 *result, + const char **errstr); +extern int scram_H(const uint8 *str, int len, uint8 *result, + const char **errstr); +extern int scram_ClientKey(const uint8 *salted_password, uint8 *result, + const char **errstr); +extern int scram_ServerKey(const uint8 *salted_password, uint8 *result, + const char **errstr); extern char *scram_build_secret(const char *salt, int saltlen, int iterations, - const char *password); + const char *password, const char **errstr); #endif /* SCRAM_COMMON_H */ diff --git a/third_party/spanner_pg/src/include/common/sha1.h b/third_party/spanner_pg/src/include/common/sha1.h index a475fadb..e8cb360f 100644 --- a/third_party/spanner_pg/src/include/common/sha1.h +++ b/third_party/spanner_pg/src/include/common/sha1.h @@ -3,7 +3,7 @@ * sha1.h * Constants related to SHA1. * - * 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 * * src/include/common/sha1.h diff --git a/third_party/spanner_pg/src/include/common/sha2.h b/third_party/spanner_pg/src/include/common/sha2.h index f4bae35a..fe248e98 100644 --- a/third_party/spanner_pg/src/include/common/sha2.h +++ b/third_party/spanner_pg/src/include/common/sha2.h @@ -3,7 +3,7 @@ * sha2.h * Constants related to SHA224, 256, 384 AND 512. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/common/shortest_dec.h b/third_party/spanner_pg/src/include/common/shortest_dec.h index c21f39fa..f919f7f9 100644 --- a/third_party/spanner_pg/src/include/common/shortest_dec.h +++ b/third_party/spanner_pg/src/include/common/shortest_dec.h @@ -2,7 +2,7 @@ * * Ryu floating-point output. * - * Portions Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/common/shortest_dec.h diff --git a/third_party/spanner_pg/src/include/common/string.h b/third_party/spanner_pg/src/include/common/string.h index 686c158e..cf00fb53 100644 --- a/third_party/spanner_pg/src/include/common/string.h +++ b/third_party/spanner_pg/src/include/common/string.h @@ -2,7 +2,7 @@ * string.h * string handling helpers * - * 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 * * src/include/common/string.h @@ -12,6 +12,14 @@ struct StringInfoData; /* avoid including stringinfo.h here */ +typedef struct PromptInterruptContext +{ + /* To avoid including here, jmpbuf is declared "void *" */ + void *jmpbuf; /* existing longjmp buffer */ + volatile bool *enabled; /* flag that enables longjmp-on-interrupt */ + bool canceled; /* indicates whether cancellation occurred */ +} PromptInterruptContext; + /* functions in src/common/string.c */ extern bool pg_str_endswith(const char *str, const char *end); extern int strtoint(const char *pg_restrict str, char **pg_restrict endptr, @@ -21,11 +29,14 @@ extern int pg_strip_crlf(char *str); extern bool pg_is_ascii(const char *str); /* functions in src/common/pg_get_line.c */ -extern char *pg_get_line(FILE *stream); +extern char *pg_get_line(FILE *stream, PromptInterruptContext *prompt_ctx); extern bool pg_get_line_buf(FILE *stream, struct StringInfoData *buf); -extern bool pg_get_line_append(FILE *stream, struct StringInfoData *buf); +extern bool pg_get_line_append(FILE *stream, struct StringInfoData *buf, + PromptInterruptContext *prompt_ctx); /* functions in src/common/sprompt.c */ extern char *simple_prompt(const char *prompt, bool echo); +extern char *simple_prompt_extended(const char *prompt, bool echo, + PromptInterruptContext *prompt_ctx); #endif /* COMMON_STRING_H */ diff --git a/third_party/spanner_pg/src/include/common/unicode_combining_table.h b/third_party/spanner_pg/src/include/common/unicode_combining_table.h index a9f10c31..de1eab3a 100644 --- a/third_party/spanner_pg/src/include/common/unicode_combining_table.h +++ b/third_party/spanner_pg/src/include/common/unicode_combining_table.h @@ -25,7 +25,8 @@ static const struct mbinterval combining[] = { {0x0825, 0x0827}, {0x0829, 0x082D}, {0x0859, 0x085B}, - {0x08D3, 0x08E1}, + {0x0898, 0x089F}, + {0x08CA, 0x08E1}, {0x08E3, 0x0902}, {0x093A, 0x093A}, {0x093C, 0x093C}, @@ -59,6 +60,7 @@ static const struct mbinterval combining[] = { {0x0BCD, 0x0BCD}, {0x0C00, 0x0C00}, {0x0C04, 0x0C04}, + {0x0C3C, 0x0C3C}, {0x0C3E, 0x0C40}, {0x0C46, 0x0C56}, {0x0C62, 0x0C63}, @@ -104,7 +106,7 @@ static const struct mbinterval combining[] = { {0x109D, 0x109D}, {0x135D, 0x135F}, {0x1712, 0x1714}, - {0x1732, 0x1734}, + {0x1732, 0x1733}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17B5}, @@ -113,6 +115,7 @@ static const struct mbinterval combining[] = { {0x17C9, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D}, + {0x180F, 0x180F}, {0x1885, 0x1886}, {0x18A9, 0x18A9}, {0x1920, 0x1922}, @@ -193,4 +196,113 @@ static const struct mbinterval combining[] = { {0xFB1E, 0xFB1E}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, + {0x101FD, 0x101FD}, + {0x102E0, 0x102E0}, + {0x10376, 0x1037A}, + {0x10A01, 0x10A0F}, + {0x10A38, 0x10A3F}, + {0x10AE5, 0x10AE6}, + {0x10D24, 0x10D27}, + {0x10EAB, 0x10EAC}, + {0x10F46, 0x10F50}, + {0x10F82, 0x10F85}, + {0x11001, 0x11001}, + {0x11038, 0x11046}, + {0x11070, 0x11070}, + {0x11073, 0x11074}, + {0x1107F, 0x11081}, + {0x110B3, 0x110B6}, + {0x110B9, 0x110BA}, + {0x110C2, 0x110C2}, + {0x11100, 0x11102}, + {0x11127, 0x1112B}, + {0x1112D, 0x11134}, + {0x11173, 0x11173}, + {0x11180, 0x11181}, + {0x111B6, 0x111BE}, + {0x111C9, 0x111CC}, + {0x111CF, 0x111CF}, + {0x1122F, 0x11231}, + {0x11234, 0x11234}, + {0x11236, 0x11237}, + {0x1123E, 0x1123E}, + {0x112DF, 0x112DF}, + {0x112E3, 0x112EA}, + {0x11300, 0x11301}, + {0x1133B, 0x1133C}, + {0x11340, 0x11340}, + {0x11366, 0x11374}, + {0x11438, 0x1143F}, + {0x11442, 0x11444}, + {0x11446, 0x11446}, + {0x1145E, 0x1145E}, + {0x114B3, 0x114B8}, + {0x114BA, 0x114BA}, + {0x114BF, 0x114C0}, + {0x114C2, 0x114C3}, + {0x115B2, 0x115B5}, + {0x115BC, 0x115BD}, + {0x115BF, 0x115C0}, + {0x115DC, 0x115DD}, + {0x11633, 0x1163A}, + {0x1163D, 0x1163D}, + {0x1163F, 0x11640}, + {0x116AB, 0x116AB}, + {0x116AD, 0x116AD}, + {0x116B0, 0x116B5}, + {0x116B7, 0x116B7}, + {0x1171D, 0x1171F}, + {0x11722, 0x11725}, + {0x11727, 0x1172B}, + {0x1182F, 0x11837}, + {0x11839, 0x1183A}, + {0x1193B, 0x1193C}, + {0x1193E, 0x1193E}, + {0x11943, 0x11943}, + {0x119D4, 0x119DB}, + {0x119E0, 0x119E0}, + {0x11A01, 0x11A0A}, + {0x11A33, 0x11A38}, + {0x11A3B, 0x11A3E}, + {0x11A47, 0x11A47}, + {0x11A51, 0x11A56}, + {0x11A59, 0x11A5B}, + {0x11A8A, 0x11A96}, + {0x11A98, 0x11A99}, + {0x11C30, 0x11C3D}, + {0x11C3F, 0x11C3F}, + {0x11C92, 0x11CA7}, + {0x11CAA, 0x11CB0}, + {0x11CB2, 0x11CB3}, + {0x11CB5, 0x11CB6}, + {0x11D31, 0x11D45}, + {0x11D47, 0x11D47}, + {0x11D90, 0x11D91}, + {0x11D95, 0x11D95}, + {0x11D97, 0x11D97}, + {0x11EF3, 0x11EF4}, + {0x16AF0, 0x16AF4}, + {0x16B30, 0x16B36}, + {0x16F4F, 0x16F4F}, + {0x16F8F, 0x16F92}, + {0x16FE4, 0x16FE4}, + {0x1BC9D, 0x1BC9E}, + {0x1CF00, 0x1CF46}, + {0x1D167, 0x1D169}, + {0x1D17B, 0x1D182}, + {0x1D185, 0x1D18B}, + {0x1D1AA, 0x1D1AD}, + {0x1D242, 0x1D244}, + {0x1DA00, 0x1DA36}, + {0x1DA3B, 0x1DA6C}, + {0x1DA75, 0x1DA75}, + {0x1DA84, 0x1DA84}, + {0x1DA9B, 0x1DAAF}, + {0x1E000, 0x1E02A}, + {0x1E130, 0x1E136}, + {0x1E2AE, 0x1E2AE}, + {0x1E2EC, 0x1E2EF}, + {0x1E8D0, 0x1E8D6}, + {0x1E944, 0x1E94A}, + {0xE0100, 0xE01EF}, }; diff --git a/third_party/spanner_pg/src/include/common/unicode_east_asian_fw_table.h b/third_party/spanner_pg/src/include/common/unicode_east_asian_fw_table.h new file mode 100644 index 00000000..e9abfa24 --- /dev/null +++ b/third_party/spanner_pg/src/include/common/unicode_east_asian_fw_table.h @@ -0,0 +1,125 @@ +/* generated by src/common/unicode/generate-unicode_east_asian_fw_table.pl, do not edit */ + +static const struct mbinterval east_asian_fw[] = { + {0x1100, 0x115F}, + {0x231A, 0x231B}, + {0x2329, 0x232A}, + {0x23E9, 0x23EC}, + {0x23F0, 0x23F0}, + {0x23F3, 0x23F3}, + {0x25FD, 0x25FE}, + {0x2614, 0x2615}, + {0x2648, 0x2653}, + {0x267F, 0x267F}, + {0x2693, 0x2693}, + {0x26A1, 0x26A1}, + {0x26AA, 0x26AB}, + {0x26BD, 0x26BE}, + {0x26C4, 0x26C5}, + {0x26CE, 0x26CE}, + {0x26D4, 0x26D4}, + {0x26EA, 0x26EA}, + {0x26F2, 0x26F3}, + {0x26F5, 0x26F5}, + {0x26FA, 0x26FA}, + {0x26FD, 0x26FD}, + {0x2705, 0x2705}, + {0x270A, 0x270B}, + {0x2728, 0x2728}, + {0x274C, 0x274C}, + {0x274E, 0x274E}, + {0x2753, 0x2755}, + {0x2757, 0x2757}, + {0x2795, 0x2797}, + {0x27B0, 0x27B0}, + {0x27BF, 0x27BF}, + {0x2B1B, 0x2B1C}, + {0x2B50, 0x2B50}, + {0x2B55, 0x2B55}, + {0x2E80, 0x2E99}, + {0x2E9B, 0x2EF3}, + {0x2F00, 0x2FD5}, + {0x2FF0, 0x2FFB}, + {0x3000, 0x303E}, + {0x3041, 0x3096}, + {0x3099, 0x30FF}, + {0x3105, 0x312F}, + {0x3131, 0x318E}, + {0x3190, 0x31E3}, + {0x31F0, 0x321E}, + {0x3220, 0x3247}, + {0x3250, 0x4DBF}, + {0x4E00, 0xA48C}, + {0xA490, 0xA4C6}, + {0xA960, 0xA97C}, + {0xAC00, 0xD7A3}, + {0xF900, 0xFAFF}, + {0xFE10, 0xFE19}, + {0xFE30, 0xFE52}, + {0xFE54, 0xFE66}, + {0xFE68, 0xFE6B}, + {0xFF01, 0xFF60}, + {0xFFE0, 0xFFE6}, + {0x16FE0, 0x16FE4}, + {0x16FF0, 0x16FF1}, + {0x17000, 0x187F7}, + {0x18800, 0x18CD5}, + {0x18D00, 0x18D08}, + {0x1AFF0, 0x1AFF3}, + {0x1AFF5, 0x1AFFB}, + {0x1AFFD, 0x1AFFE}, + {0x1B000, 0x1B122}, + {0x1B150, 0x1B152}, + {0x1B164, 0x1B167}, + {0x1B170, 0x1B2FB}, + {0x1F004, 0x1F004}, + {0x1F0CF, 0x1F0CF}, + {0x1F18E, 0x1F18E}, + {0x1F191, 0x1F19A}, + {0x1F200, 0x1F202}, + {0x1F210, 0x1F23B}, + {0x1F240, 0x1F248}, + {0x1F250, 0x1F251}, + {0x1F260, 0x1F265}, + {0x1F300, 0x1F320}, + {0x1F32D, 0x1F335}, + {0x1F337, 0x1F37C}, + {0x1F37E, 0x1F393}, + {0x1F3A0, 0x1F3CA}, + {0x1F3CF, 0x1F3D3}, + {0x1F3E0, 0x1F3F0}, + {0x1F3F4, 0x1F3F4}, + {0x1F3F8, 0x1F43E}, + {0x1F440, 0x1F440}, + {0x1F442, 0x1F4FC}, + {0x1F4FF, 0x1F53D}, + {0x1F54B, 0x1F54E}, + {0x1F550, 0x1F567}, + {0x1F57A, 0x1F57A}, + {0x1F595, 0x1F596}, + {0x1F5A4, 0x1F5A4}, + {0x1F5FB, 0x1F64F}, + {0x1F680, 0x1F6C5}, + {0x1F6CC, 0x1F6CC}, + {0x1F6D0, 0x1F6D2}, + {0x1F6D5, 0x1F6D7}, + {0x1F6DD, 0x1F6DF}, + {0x1F6EB, 0x1F6EC}, + {0x1F6F4, 0x1F6FC}, + {0x1F7E0, 0x1F7EB}, + {0x1F7F0, 0x1F7F0}, + {0x1F90C, 0x1F93A}, + {0x1F93C, 0x1F945}, + {0x1F947, 0x1F9FF}, + {0x1FA70, 0x1FA74}, + {0x1FA78, 0x1FA7C}, + {0x1FA80, 0x1FA86}, + {0x1FA90, 0x1FAAC}, + {0x1FAB0, 0x1FABA}, + {0x1FAC0, 0x1FAC5}, + {0x1FAD0, 0x1FAD9}, + {0x1FAE0, 0x1FAE7}, + {0x1FAF0, 0x1FAF6}, + {0x20000, 0x2FFFD}, + {0x30000, 0x3FFFD}, +}; diff --git a/third_party/spanner_pg/src/include/common/unicode_norm.h b/third_party/spanner_pg/src/include/common/unicode_norm.h index 3c227900..deb125d4 100644 --- a/third_party/spanner_pg/src/include/common/unicode_norm.h +++ b/third_party/spanner_pg/src/include/common/unicode_norm.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/include/common/unicode_norm.h * diff --git a/third_party/spanner_pg/src/include/common/unicode_norm_hashfunc.h b/third_party/spanner_pg/src/include/common/unicode_norm_hashfunc.h index 5d050162..71963ba3 100644 --- a/third_party/spanner_pg/src/include/common/unicode_norm_hashfunc.h +++ b/third_party/spanner_pg/src/include/common/unicode_norm_hashfunc.h @@ -3,7 +3,7 @@ * unicode_norm_hashfunc.h * Perfect hash functions used for Unicode normalization * - * 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 * * src/include/common/unicode_norm_hashfunc.h @@ -41,561 +41,632 @@ typedef struct static int Decomp_hash_func(const void *key) { - static const int16 h[13209] = { - 0, 1515, 4744, 4745, 0, 0, 0, 0, - 0, 0, 0, 0, 3890, 3890, 0, 0, - 3891, 3891, -2046, 2800, 3890, 3890, 3890, -4396, - 4361, 4362, -4441, -4441, -4396, 1773, 1773, 1773, - 4372, 4373, -4438, -4438, -4393, -4393, 2619, 17, - -4347, -4393, -4393, -4393, -4393, -4393, 2619, 2619, - 1560, 4346, 4347, 4348, 1917, 1873, 1874, 1875, - -7856, 4358, 17619, 2622, 2622, 2622, 6357, 6358, - 6359, 6360, 6361, 6362, 6363, 2622, -4390, -4390, - 4414, -5356, -5356, 4374, 4375, -5356, -5356, -6335, - -3020, 2511, -5356, -5356, -3583, -3583, -3583, -3583, - -995, 0, 0, -9799, -9754, 2874, 2875, 2876, - 2877, 2878, -9830, -3591, -9756, -9756, -2744, -5346, - -9710, -9756, 342, -5346, -9756, -5346, -2743, -449, - 348, 2894, 2895, -2853, 2897, 2898, 2899, 2900, - 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, - 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, - 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, - 2933, 2934, 32767, 32767, 32767, 32767, 32767, 32767, - -8721, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1, 32767, 48, 32767, 32767, 32767, 32767, 49, - 32767, 32767, -8687, -8687, -6255, -6210, 32767, 32767, - -8689, -8689, -21949,32767, -18635,-15320,-15320,32767, - -12006,-8691, -8691, -8691, -8691, -8691, 32767, 66, - -8737, -8737, -8692, -8692, -8692, -8692, 73, 74, - 32767, -8738, -8693, -8693, -8693, -8693, -8693, 32767, - 32767, -8695, -8695, -8695, -8695, -8695, 32767, 32767, - 40, 41, -2390, -2434, 44, 45, 32767, 46, - 13307, 9993, 9994, 6680, 6681, 3367, 3368, 54, - 0, 55, 56, 57, -8699, -8699, 105, 32767, - 32767, 61, 62, 63, -8701, -8701, 32767, 111, - 32767, 67, 68, 69, 70, 1890, 3687, -1272, - 3690, 75, 76, 77, 78, 79, 80, 81, - 82, 32767, 32767, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 32767, - 32767, 103, 104, 105, 106, 107, 108, 109, - -8660, -8660, 32767, -8661, -8661, -8661, -8661, -8661, - -8661, 32767, 73, 74, 75, 76, -2355, -2399, - 79, 80, 32767, 32767, 13341, 10027, 10028, 6714, - 6715, 3401, 3402, 32767, 32767, 88, 89, 90, - -8666, -8666, 138, 32767, 32767, 94, 95, 96, - -8668, -8668, 144, 145, 101, -2553, -2553, -2553, - -2553, -4983, -2553, -2553, 154, -2553, 156, 32767, - 32767, 6114, 158, -3153, -3152, -3151, -12891,-6888, - -931, -3149, 166, -3148, -4728, 169, -3147, -3146, - -3145, -3144, -3143, -3142, -3141, -2543, -3139, -3138, - 180, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3314, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 3660, 3661, 2131, 2132, 2133, 2134, 2135, - 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, - 2144, 2145, -5472, -5472, -3612, -3612, -3612, -3612, - -3612, 2652, -3612, -3612, -3612, -3612, -3612, -3612, - -3612, -3612, 3693, -3613, -7015, -7015, 1742, 1743, - -7060, -7060, -7015, -846, -846, -846, 1753, 1754, - -7057, -7057, -7012, -7012, 0, -2602, -6966, -7012, - -7012, -7012, -7012, -7012, 0, 0, 1725, 1726, - 1727, 1728, -703, -747, -746, 0, 1735, 1736, - 14997, 0, 0, 0, 3735, 3736, 3737, 3738, - 3739, 3740, 3741, 0, -7012, -7012, 1792, 1793, - 1749, 1750, 1751, -7980, -7980, -8959, -5644, -113, - -7980, -113, -2382, -6116, -6116, -6116, -6116, -6116, - -6116, -6116, -2374, 4639, 4640, -4163, 5608, 5609, - -4120, -4120, 5612, 5613, 6593, 3279, -2251, 5617, - 5618, 3846, 3847, 3848, 3849, 1262, 1262, 10066, - 10067, 10023, 3855, 3856, 3857, 1259, 1259, 10071, - 3861, 10027, 10028, 3017, 5620, 9985, 10032, -65, - 5624, 10035, 5626, 3024, 731, -65, 1298, 12530, - 3727, 3727, 3772, 3772, 3772, 13504, 13505, 14485, - 11171, 5641, 13509, 5643, 7913, 11648, 11649, 11650, - 11651, 11652, 11653, 11654, 7913, 901, 901, 9705, - -65, -65, 9665, 9666, -65, -65, -1044, 2271, - 7802, -65, -65, 1708, 1708, 1708, 1708, 4296, - 4297, -4506, -4506, -4461, 1708, 1708, 1708, 4307, - 4308, -4503, 1708, -4457, -4457, 2555, -47, -4411, - -4457, 5641, -47, -4457, -47, 2556, 4850, 5647, - 4285, -6946, 1858, 1859, 1815, 1816, 1817, -7914, - -7914, -8893, -5578, -47, -7914, -47, -2316, -6050, - -6050, -6050, -6050, -6050, -6050, -6050, -2308, 4705, - 4706, -4097, 5674, 5675, -4054, -4054, 5678, 5679, - 6659, 3345, -2185, 5683, 5684, 3912, 3913, 3914, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -3083, -3083, 232, 287, 233, 233, - 233, 8990, 8991, 32767, 32767, 3668, 32767, 3667, - 3667, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 208, 208, 208, 208, 208, 208, - 32767, 32767, 206, 206, 206, 206, 206, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 304, 305, -1274, 307, 308, - 309, 6753, -1374, 10488, 4486, -1470, 4488, 316, - 4489, -5607, 4490, 4491, 4492, 322, 760, 324, - 325, 326, 166, 763, 329, -2553, 765, 332, - 333, 334, 335, 772, 337, 6310, 339, 340, - 341, 342, 343, 344, 345, 346, -2542, -2542, - -2542, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, -6008, 364, - 365, 366, 367, 368, 369, 370, 254, 372, - 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 32767, 383, 384, -3606, -3605, -3604, - -3603, 389, -3600, -3599, -3598, 2340, -1238, -3595, - -3594, -3593, 4694, -4062, -4062, 4742, 4743, 4699, - -1469, -1468, -1467, -4065, -4065, 4747, -1463, 4703, - 4704, -2307, 296, 32767, 0, 32767, 32767, 4708, - -1376, -1376, -1376, 32767, 32767, -1246, 506, 506, - 0, -1559, 32767, 32767, 32767, 32767, 32767, 305, - 419, 308, 2578, 6313, 6314, 424, 32767, -6030, + static const int16 h[13407] = { + 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, + 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, + 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, + 4967, 4968, 4969, 32767, 4970, 4971, 32767, 32767, + 4972, 32767, 32767, 4973, 4974, 32767, 32767, 4975, + 4976, 4977, 4978, 32767, 4979, 4980, 4981, 4982, + 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, + 32767, 4991, 32767, 4992, 4993, 4994, 4995, 4996, + 4997, 4998, 32767, 4999, 5000, 5001, 5002, 5003, + 5004, 5005, 5006, 5007, 5008, -6192, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, + 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, + 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, + 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, + 5052, 5053, 5054, 5055, 5056, 5057, 32767, 6396, + 6397, 6398, 6399, 6400, 6401, 32767, 6402, 6403, + 6404, 6405, 32767, 32767, 5059, 6407, 5060, 6409, + -9156, 6411, 5507, 6413, 32767, -290, -290, -290, + -290, -290, 9059, 9060, 32767, -291, -291, -291, + -6392, -291, -291, -291, -291, -291, -291, -291, + 951, -291, 952, -291, -291, -291, -291, -6404, + -291, -291, 4828, 4828, -6406, -6406, -291, -291, + -6408, -1694, -292, -292, -292, -292, -6408, -293, + -293, -293, -293, -293, -6409, -294, 32767, -6410, + -6410, -297, -297, -297, -297, -297, -297, -297, + 32767, -298, -6411, 2161, -298, -9253, -6861, 1544, + 2165, 2165, 2165, 7485, 7485, 7485, 7485, 25276, + 7485, 13219, 7485, 1043, 7485, 7485, 7485, 7485, + 7485, 7485, 7485, 5094, 12010, 12010, 13226, 12010, + 13228, 8732, 13230, -298, -6417, 7487, 12010, -298, + -298, -298, -6419, -6419, -1660, 8442, 8442, 8442, + 8442, 8442, -2519, 8442, 18541, -5775, 375, 8887, + 13224, -4566, 13226, 38, 39, -296, -296, 4431, + -296, -296, -6532, -296, -296, 1556, -296, 1557, + -296, -296, -296, -296, -296, -296, -296, -296, + -296, -296, -296, -296, -296, -296, -296, -296, + -296, 449, 450, -296, 106, 107, 679, -296, + 1559, -296, -1981, 112, -296, -296, -296, -296, + -296, -296, -296, 1560, 1561, 1562, 1563, 1564, + -296, -296, 1565, 1566, -296, -296, 1567, 1568, + -296, -296, -296, -296, -296, -296, 1569, 1570, + -296, -296, 1571, 1572, -296, 139, -1933, -295, + -295, 1895, -295, -295, -295, -295, -295, -295, + -295, -295, -295, -295, -486, -1943, -486, -1943, + -295, -295, -295, -295, -295, -295, -295, -295, + -295, -295, 4399, -295, -295, -295, -295, -295, + -295, -295, -295, -295, -295, -295, -295, 179, + -1339, -1339, -3797, -3797, -3797, -1339, -1339, -1339, + 1310, 1311, 1312, 1313, -6671, 1315, -13749,-1339, + -13748,1320, 6679, -1699, 1323, 1324, 1325, -1339, + -1339, -1339, -1339, -1339, 803, 804, 805, 806, + 5334, 3345, -3570, -3569, -1338, -1338, -1338, -1338, + -1338, -1338, -1338, -1338, -1338, -1338, -1338, -1338, + -1338, -1338, -1338, -1338, -1338, 8, -1338, 9, + -1338, 10, -1338, 14228, -1338, -433, -1338, 5365, + 5366, 5367, 5368, 5369, 5370, -3978, -3978, -3978, + 5374, 5375, 5376, 11478, 5378, 5379, 5380, 5381, + 5382, 5383, 5384, 4143, 5386, 4144, 5388, 5389, + 5390, 5391, 11505, 5393, 5394, 276, 277, 11512, + 11513, 5399, 5400, 11518, 5402, 5403, 5404, 5405, + 5406, 5407, 5408, 5409, 5410, 5411, 5412, 5413, + 5414, 5415, 5416, 5417, 5418, 5419, 5420, 5421, + 5422, 5423, 5424, 5425, 5426, 11540, 2969, 5429, + 14385, 11994, 3590, 2970, 2971, 2972, -2347, -2346, + -2345, -2344, -20134,-2342, -8075, -2340, 4103, -2338, + -2337, -2336, -2335, -2334, -2333, -2332, 60, -6855, + -6854, -8069, -6852, -8069, -3572, -8069, 5460, 11580, + -2323, -6845, 5464, 5465, 5466, 11588, 11589, 6831, + -3270, -3269, -3268, -3267, -3266, 7696, -3264, -13362, + 10955, 4806, -3705, -8041, 9750, -8041, 5148, 5148, + 5484, 5485, 759, 5487, 5488, 11725, 5490, 5491, + 3640, 5493, 3641, 5495, 5496, 5497, 5498, 5499, + 5500, 5501, 5502, 5503, 5504, 5505, 5506, 5507, + 5508, 5509, 5510, 5511, 4767, 4767, 5514, 5113, + 5113, 4542, 5518, 3664, 5520, 7206, 5114, 5523, + 5524, 5525, 5526, 5527, 5528, 5529, 3674, 3674, + 3674, 3674, 3674, 5535, 5536, 3676, 3676, 5539, + 5540, 3678, 3678, 5543, 5544, 5545, 5546, 5547, + 5548, 3684, 3684, 5551, 5552, 3686, 3686, 5555, + 5121, 7194, 5557, 5558, 3369, 5560, 5561, 5562, + 5563, 5564, 5565, 5566, 5567, 5568, 5569, 5761, + 7219, 5763, 7221, 5574, 5575, 5576, 5577, 5578, + 5579, 5580, 5581, 5582, 5583, 890, 5585, 5586, + 5587, 5588, 5589, 5590, 5591, 5592, 5593, 5594, + 5595, 5596, 5597, 5598, 5599, 5600, 5601, 5602, + 5603, 5604, -2311, -2310, -2309, -2308, -2307, -2306, + -2305, -2304, -2303, 5614, 5615, 5616, 5617, 5618, + 5619, 5620, 5621, 5622, 5623, 5624, 5625, 5626, + 5627, 5628, 5629, 5630, 5631, 5632, 5633, 5634, + 5635, 5636, 5637, 5638, 5639, 5640, 5641, 5642, + 5643, 5644, 5645, 5646, 5647, 5648, 5649, 5650, + 5651, 5652, -3666, 5654, 5655, 5656, 5657, 5658, + 5659, 5660, 5661, 5662, 5663, 5664, 5665, 5666, + 5667, 5668, 5669, 5670, 5671, 5672, 5673, 5674, + 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, + 5683, 5684, 5685, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 4336, + 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, -433, -433, -433, -433, -433, + -433, -433, -433, -433, -433, 346, 347, 9415, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 6920, + 6921, -2430, -2430, -2430, -8531, -2430, -2430, -2430, + 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -348, 5796, 5797, 2779, 5799, 2780, + 2780, 7568, 5803, 5804, 2782, 14440, 7577, 7578, + -2893, 417, 32767, 32767, 32767, 32767, 32767, 418, + 419, 420, 421, 422, 423, 424, 32767, 425, 32767, 426, 427, 428, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 32767, 0, - 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 0, 32767, 429, -5407, 431, - -5406, 433, -3601, 435, 32767, -3751, 32767, 32767, - 32767, 32767, -3755, 32767, 32767, 32767, 32767, 0, - 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 436, -11425,-5422, - 535, -5422, 535, -5422, 4675, -5421, -5421, -5421, - -5421, -5421, 4681, 0, 0, 0, 4682, 4683, - 4684, 4685, 4686, 4687, 0, 0, 32767, 32767, - 0, 0, -5684, 0, 4688, 4689, 4690, 4691, - 4692, 4693, 4694, 4695, -1257, -1257, 4696, -5441, - -5441, 4699, 4700, 4701, -5443, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 454, 0, 32767, 456, - 32767, 32767, 0, 457, 32767, 32767, 32767, 0, - 458, 459, 460, 32767, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 4703, 4704, 4705, 4706, 32767, - 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 4655, 4656, 4657, 4658, - 4659, 4712, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 462, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 2084, 2085, + 2657, 0, 0, 0, 0, 2093, 0, 0, + 32767, 32767, 32767, 32767, 32767, 429, 4598, 4599, + 4600, 4601, 4602, 435, 4603, 4604, 4605, 4606, + 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, + -2552, 4616, 4617, 4618, 4619, 4620, 4621, 4765, + 4766, 3854, 4625, 4626, 4627, 436, 437, 438, + 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, + 4639, 38, 17830, 4642, 4643, 4644, 0, 4645, + 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 448, 449, 450, 32767, 451, + 452, 32767, 32767, 32767, 453, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, -5211, -5211, 32767, -5212, + 32767, 32767, 32767, -5215, 32767, 32767, 32767, 32767, + -5219, -5219, -5219, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 153, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 463, 464, 32767, 465, - 32767, 32767, 32767, 466, 32767, 32767, 32767, 32767, - 467, 468, 469, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 3011, 3011, 3011, - 3011, 3011, 3011, 3011, 32767, 32767, 32767, 32767, - 32767, 32767, 470, 471, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 472, - 473, 474, 475, 476, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 895, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 4713, 4714, 4715, 32767, + 32767, 32767, 32767, 32767, 100, 100, 32767, 99, + 32767, 32767, 32767, 96, 32767, 32767, 32767, 32767, + 92, 92, 92, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 477, 478, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 479, 480, 481, 482, - 32767, 32767, 483, 484, 32767, 32767, 485, 486, - 487, 488, 489, 490, 32767, 32767, 491, 492, - 493, 494, 495, 496, 32767, 32767, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 665, -255, 667, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 693, 694, 695, 696, - 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, - 7183, 714, -1580, 716, 2547, 718, 7194, 720, - 2553, 722, 723, 7204, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, - 0, 0, 8114, 8159, 745, -1535, 747, 748, - 8161, -5019, -5019, -5019, -5019, 1938, 0, 0, - 0, 0, 0, 0, 767, 768, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32767, 32767, 32767, 32767, 32767, 0, 32767, + 32767, 32767, 70, 70, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 59, + 821, -5322, -5322, -2303, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, -2875, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, -2884, -2884, - -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884, - -2884, -2884, -4271, -2884, -2884, -2884, -2884, -2884, - -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884, - -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884, - -2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884, - -2884, -2884, -2884, 32767, -2885, 32767, -2886, -2886, - 32767, -2887, -2887, 32767, -2888, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, -4122, -4122, 32767, + 32767, 3651, 3652, 3653, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, -4134, -4134, 3033, -4134, + 32767, 32767, -4136, -4136, 32767, 32767, -4281, -3368, + -4138, -4138, -4138, 54, 32767, 32767, -4140, -4140, + -4140, -4140, -4140, -4140, 32767, 32767, -4142, 460, + -17331,-4142, -4142, -4142, 503, -4141, -4141, -4141, + -4141, -4141, 32767, 32767, -4143, -4143, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, - 573, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 574, 575, 576, 577, 578, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, -294, -294, -294, -3047, 583, 584, 585, - -4462, -4418, -4418, -4418, -4418, -4418, -4462, -4462, - -4462, 595, 596, 597, 598, 599, 32767, 32767, - 32767, 32767, -4471, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 4716, 4717, 4718, 4719, - 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, - 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, - 3826, 4737, 4738, 4739, 4740, 4741, 4742, 3832, - 4744, 3833, 3120, 3121, 3835, 3835, 3124, 3836, - 3836, 4753, 4754, 4755, 4756, 4757, 4758, 4759, - 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, - 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, - 4776, 4777, 4778, 4779, 4780, 4781, 6619, 6620, - 6621, 11272, 6623, 6624, 4788, 4789, 4790, 3874, - 4761, 3874, 4794, 3874, 4796, 4797, 4798, 3874, - 4800, 32767, 0, 4802, 4803, 4804, 4805, 4806, - 4807, 4808, 4809, 4810, 4811, 4812, 4813, 4814, - 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, - 4823, 4824, 4825, 4826, 4827, 4828, 11299, 4830, - 2536, 4832, 6663, 4834, 11310, 4836, 6669, 4838, - 4839, 11320, 4841, 4842, 4843, 4844, 4845, 4846, - 4847, 4848, 4849, 4850, 4851, 4852, 1188, 4854, - 4855, 4856, 4857, 2577, 4859, 4860, 12273, -907, - -907, -907, -907, -907, -907, 4868, 4869, 4870, - 4871, 32767, 4872, 4873, 32767, 32767, 4874, 32767, - 627, 4875, 4876, 32767, 32767, 4877, 4878, 4879, - 6722, 32767, 4881, 4882, 4883, 6730, 6731, 7446, - 6733, 4888, 7449, 7449, 4891, 4892, 32767, 4893, - 32767, 4894, 4895, 4896, 4897, 4898, 4899, 3512, - 3513, 3514, 3515, 3516, 4904, 3518, 3519, 3520, - 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, - 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, - 3537, 3538, 4926, 6797, 4928, 6800, 4930, 4931, - 4932, 4933, 4934, 4935, 6813, 4937, 4938, 6816, - 6817, 4941, 4942, 4943, 0, 4945, 6821, 0, - 0, 4949, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, -127, -127, -127, - 7285, -127, -127, 0, -128, -128, -128, -128, - 0, 32767, -130, 4971, -129, 5613, 5614, 5615, - 4976, 5618, 32767, 5619, 5620, 5621, 4981, 5624, - 4983, 4984, 32767, 5630, 5631, -1986, -1986, -126, - -126, 5078, 4992, 5037, 5038, 5039, 5040, 5041, - 5086, 5087, 5088, 5089, -2322, 5091, 5092, 5093, - 5094, 5095, 5096, 5097, 5098, 5099, 5100, 0, - 5101, -640, -640, -640, 0, -641, -641, -641, - -641, -641, 0, -642, 0, 0, 32767, -645, - -645, 6973, 6974, 5115, 5116, -87, 0, -44, - -44, -44, -44, -44, -88, -88, -88, -88, - 7324, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, 5654, 5655, 5656, - 5657, 5658, 5659, 5660, 5661, 5662, 5663, 5664, - 5665, 5666, 5667, 5668, 5669, -1948, -1948, -88, - -88, 5116, 5117, 5074, 5075, 5076, 5077, 5078, - 5123, 5124, 5125, 5126, -2285, 5128, 5129, 5130, - 5131, 5132, 5133, 5134, 5135, 5136, 5137, 5138, - 5139, -602, -602, -602, -602, -602, -602, -602, - -602, -602, -602, -602, -602, -602, -602, -602, - -602, 7016, 7017, 5158, 5159, -44, -44, 0, - 0, 0, 0, 0, -44, -44, -44, -44, - 7368, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, 5698, 5699, 5700, - 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, - 5709, 5710, 5711, 5712, 5713, -1904, -1904, -44, - -44, 5160, 5161, 5118, 5119, 5120, 5121, 5122, - 5167, 5168, 5169, 5170, -2241, 5172, 5173, 5174, - 5175, 5176, 5177, 5178, 5179, 5180, 5181, 5182, - 5183, -558, -558, -558, -558, -558, -558, -558, - -558, -558, -558, -558, -558, -558, -558, -558, - -558, 7060, 7061, 5202, 5203, 0, 0, 44, - 44, 44, 44, 44, 0, 0, 0, 0, - 7412, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5742, 5743, 5744, - 5745, 5746, 5747, 5748, 5749, 5750, 5751, 5752, - 5753, 5754, 5755, 5756, 5757, -1860, -1860, 0, - 0, 0, 0, 0, 6264, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -3402, - -3402, 5355, 5356, -3447, -3447, -3402, -3402, -3402, - -3402, 5363, 5364, -3447, -3447, -3402, -3402, -3402, - -3358, -3358, -3404, -3404, -3404, -3404, -3404, -3404, - -3404, 5331, 5332, 5333, 5334, 2903, 2859, 5337, - 5338, 5339, 5340, 18601, 15287, 15288, 11974, 11975, - 8661, 8662, 5348, 5349, 5350, 5351, 5352, -3404, - -3404, 5400, 5401, 5357, 5358, 5359, 5360, -3404, - -3404, 5408, 5409, 5365, 5366, 5367, 5324, 5325, - 5372, 5373, 5374, 5375, 5376, 5377, 5378, -3356, - -3356, -3356, -3356, -924, -879, -3356, -3356, -3356, - -3356, -16616,-13301,-13301,-9986, -9986, -6671, -6671, - -3356, -3356, -3356, -3356, -3356, 5401, 5402, -3401, - -3401, -3356, -3356, -3356, -3356, 5409, 5410, -3401, - -3401, -3356, -3356, -3356, -3312, -3312, -3358, -3358, - -3358, -3358, -3358, -3358, -3358, 5377, 5378, 5379, - 5380, 2949, 2905, 5383, 5384, 5385, 5386, 18647, - 15333, 15334, 12020, 12021, 8707, 8708, 5394, 5395, - 5396, 5397, 5398, -3358, -3358, 5446, 5447, 5403, - 5404, 5405, 5406, -3358, -3358, 5454, 5455, 5411, - 5412, 5413, 5414, 5415, 5416, 5417, 5418, 5419, - 5420, 5421, 5422, -3312, -3312, -3312, -3312, -880, - -835, -3312, -3312, -3312, -3312, -16572,-13257,-13257, - -9942, -9942, -6627, -6627, -3312, -3312, -3312, -3312, - -3312, 5445, 5446, -3357, -3357, -3312, -3312, -3312, - -3312, 5453, 5454, -3357, -3357, -3312, -3312, -3312, - -3312, -3312, -3312, -3312, -3312, -3312, -3312, -3312, - -3312, 5423, 5424, 5425, 5426, 2995, 2951, 5429, - 5430, 5431, 5432, 18693, 15379, 15380, 12066, 12067, - 8753, 8754, 5440, 5441, 5442, 5443, 5444, -3312, - -3312, 5492, 5493, 5449, 5450, 5451, 5452, -3312, - -3312, 5500, 5501, 5457, 2803, 2803, 2803, 2803, - 373, 2803, 2803, 5510, 2803, 5512, 11470, 5514, - 11472, 5516, 2205, 2206, 2207, -7533, -1530, 4427, - 2209, 5524, 2210, 630, 5527, 2211, 2212, 2213, - 2214, 2215, 2216, 2217, 2815, 2219, 2220, 5538, - 2221, 5540, 2222, 5542, 5543, 2223, -3312, -3312, - -3312, 5548, 5549, -3312, -3312, 2803, 2803, 2803, - 5555, 5556, 5557, 2803, 2803, 2803, 2803, 2803, - 2803, 2803, 2803, 2803, 2803, 2803, 2803, 2803, - 9050, 9051, 2803, 2803, 2803, 2803, 2803, 2803, - 2803, 2803, 2803, 2803, 2803, 2803, 4318, 7547, - 7548, 2803, 2803, 2803, 2803, 2803, 2803, 2803, - 2803, 6693, 6693, 2803, 2803, 6694, 6694, 757, - 5603, 6693, 6693, 6693, -1593, 7164, 7165, -1638, - -1638, -1593, 4576, 4576, 4576, 7175, 7176, -1635, - -1635, -1590, -1590, 5422, 2820, -1544, -1590, -1590, - -1590, -1590, -1590, 5422, 5422, 4363, 7149, 7150, - 7151, 4720, 4676, 4677, 4678, -5053, 7161, 20422, - 5425, 5425, 5425, 9160, 9161, 9162, 9163, 9164, - 9165, 9166, 5425, -1587, -1587, 7217, -2553, -2553, - 7177, 7178, -2553, 32767, 32767, -219, 5312, -2555, - -2555, -782, -782, -782, -782, 1806, 2801, 2801, - -6998, -6953, 5675, 5676, 5677, 5678, 5679, -7029, - -790, -6955, -6955, 57, -2545, -6909, -6955, 3143, - -2545, -6955, -2545, 58, 2352, 3149, 5695, 5696, - -52, 5698, 5699, 5700, 5701, 5702, 5703, 5704, - 5705, 5706, 5707, 5708, 5709, 5710, 5711, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, -1838, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 6927, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -973, 32767, 32767, - 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 4567, 4568, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 511, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 512, 513, + 514, 515, 516, -4236, -4236, -4236, -4236, -4236, + 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 5533, 534, 5534, 536, 5535, + 538, 5536, 540, 5537, -9327, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 32767, 557, 32767, 558, 559, + 32767, 560, 561, 32767, 562, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 32767, 0, 32767, 32767, 0, 0, 32767, + 0, 0, 32767, 32767, 32767, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 750, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 751, 32767, 32767, + 752, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 753, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8394, 567, 568, 569, -8394, -8393, -8392, + -6000, 32767, 32767, 32767, 0, 760, 761, -14129, + 574, 575, 576, -12902,-462, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, -1748, 32767, -1749, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -437, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 0, -255, -255, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 1214, 1215, + 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 4947, -171, -170, 1227, 1228, 1229, 1230, 11067, + 1232, 1233, 1234, 1235, 1236, 1237, 1238, -1391, + 1240, 1241, 1242, -1390, 1244, -3217, 604, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -448, 32767, 32767, -450, -450, - -450, 0, 32767, 32767, 32767, -2166, 32767, 32767, - 32767, 32767, 32767, 32767, 0, 0, 32767, -464, - -464, 32767, 0, 32767, 32767, 32767, 32767, 32767, + 767, 32767, 32767, 0, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, -9177, 32767, 32767, 32767, 911, + 912, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 771, -3830, 32767, 773, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 605, 32767, + 606, 32767, 774, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 607, 32767, 32767, 608, 609, 610, -236, + 612, 613, 5235, 32767, 32767, 615, 616, 617, + 618, 619, 620, 32767, 32767, -4084, -4084, 32767, + -63, -62, 625, -61, 32767, 32767, 32767, -61, + -60, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -514, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 4955, 4956, 32767, + -3764, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 5757, 5758, 5759, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -4186, -4186, -12097,-4186, 32767, - -4187, -4187, -8787, 32767, 0, 0, 5952, 0, - 0, -4183, -4183, -4183, 0, -2386, -4182, 778, - -4183, -5935, 32767, 32767, -4690, -6249, -4184, -4184, - -4184, 32767, 32767, -4186, -4186, -77, 32767, -77, - 32767, -4188, 0, -4189, 32767, 0, 0, 0, - 0, 32767, 0, 0, 0, 32767, 0, 0, - 0, 0, 0, 0, 0, 32767, 0, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 0, 0, 0, 0, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 0, 0, 0, 0, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, -3794, + -3794, -3794, -3794, -3794, 4880, -3794, -3794, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1423, -1750, -3794, -3794, -3794, -3794, -1754, -1754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -5937, -2358, 0, 0, 0, - -8286, 471, 472, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 1747, 32767, -2126, 32767, 32767, 1748, - 1749, 1750, 1751, 1752, 1753, 8224, 1755, -539, - 1757, 781, 32767, 32767, 32767, -1991, -2035, 32767, - 32767, 782, -3784, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6081, + 6082, 6083, 6084, 6085, 6086, 6087, 6088, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 837, 32767, 32767, 32767, 32767, 32767, -4008, - -4008, -4008, 2949, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, -797, 1806, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 4605, 4606, - 32767, 32767, 0, 455, 32767, 0, 32767, 32767, - 32767, 0, 32767, 32767, 32767, 32767, 0, 0, - 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -4244, 32767, 32767, 32767, 32767, + 32767, 3706, 4916, 3706, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 784, 32767, 32767, 2950, 2951, 32767, 32767, 32767, - 32767, 32767, 32767, 786, 787, 32767, 1252, 1253, - 32767, 790, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 32767, 0, 32767, 32767, - 32767, 0, 32767, 32767, 32767, 32767, 0, 0, - 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4918, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 0, - 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -200, -200, -200, - -200, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - -5932, -5932, 32767, 32767, 2952, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -5387, - -5387, -5387, -5387, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 0, 0, 32767, 32767, - 0, 0, 32767, 32767, 0, 0, 0, 0, - 0, 0, 32767, 32767, 0, 0, 0, 0, - 0, 0, 32767, 32767, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, - 32767, 32767, -156, 765, 32767, 32767, 32767, 32767, + 32767, 32767, 655, 656, 657, 658, -1487, -1487, + -1487, -1487, -1487, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, -1669, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 665, -573, + 9529, -573, 32767, -574, -574, -5333, -5333, -5333, + -5333, -5333, -5333, -5333, 32767, -5334, -5334, -5334, + 32767, 681, 682, 683, 684, 685, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -861, - 32767, 6106, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2953, 2954, 32767, 797, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 2955, 32767, 32767, 32767, -8929, - 32767, -8885, -8885, -8885, 32767, 32767, 32767, 32767, - 32767, 32767, -749, 7119, 7120, 32767, 32767, 32767, - 32767, 2760, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, -1181, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -5587, 0, 7596, - 7597, 0, 0, 0, 0, 0, 0, 32767, + 32767, 32767, 32767, 32767, 2467, 2468, 2469, 2470, + 2471, 2472, 2473, 2474, 2475, 2476, 2477, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1001, + -1001, -1001, -1001, 32767, -1002, -1002, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2512, 2513, 2514, 2515, 2516, 0, + 0, 0, 0, 0, 2522, 2523, 0, 1041, + 1042, 2527, 2528, 2529, 2530, 2531, 2532, 2533, + 2534, 2535, 2536, 2537, 693, 694, 695, -8253, + -4639, -4639, 32767, 32767, 2538, 2539, 0, 2541, + 2542, 2543, 2544, 2545, 0, 2547, 0, 2549, + 2550, 0, 2552, 2553, 0, 2555, 2556, 2557, + 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, + 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, + 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, + 2582, 2583, -1309, 706, 2585, 2586, 2587, 2588, + 2589, 2590, 2591, 2592, -7879, 2594, 2595, 2596, + 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, + 2605, 2606, 2607, 8568, 2609, 2610, 2611, 5328, + 5329, 5330, 5331, 5332, 2617, 5335, 201, 5337, + 5338, 5339, 5340, 5341, 5342, 5343, 5344, 5345, + 5346, 2630, 2631, 3718, 3719, 2634, 2635, 2636, + 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, + 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, + 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, + 2661, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2695, 2696, 2697, 2698, 2699, 2700, + 2701, 2702, 2703, 14882, 9148, 2706, 9148, 9148, + 2072, 9149, 9149, 9149, 9149, 6758, 13674, 13674, + 32767, 759, 0, 0, 14891, 189, 189, 189, + 13668, -4759, -4759, 1362, -4759, -4759, 0, 10102, + 0, 10103, 0, 0, 0, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 1458, 1459, 32767, 32767, 32767, 32767, 32767, 0, 0, 0, + 0, 0, 9309, 9310, 9311, 9312, 9313, 9314, + 0, 0, 0, 9320, 9321, 9322, 9323, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1962, 1962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -714, 0, - 0, -713, -712, 0, -711, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1859, - 0, 3247, 32767, 32767, 0, 3247, 0, 3248, - 0, 3249, 0, 3250, 0, 3251, 0, 3252, - 808, 3252, 0, 3253, 0, 3254, 0, 0, - 3256, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 32767, 32767, 32767, 32767, 0, 0, 6824, - 32767, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4207, 4208, 0, 0, 0, 0, 0, 1896, - 0, 0, 1898, 1898, 1898, 1898, 0, 0, - 0, 1901, 1901, 0, 0, 0, 0, 0, - 0, -1319, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7167, 0, 0, + 0, 0, 0, 0, -143, -143, 770, 0, + 0, 0, 4192, 4192, 4192, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4602, -13189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5320, 5320, 5320, 5320, 23111, 5320, 11054, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32767, 32767, 0, + 0, 0, 0, 0, 0, 6247, 6247, -4714, + 6247, 2055, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32767, 32767, 778, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 779, 780, 781, 32767, 32767, + 782, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, -2571, -2136, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7618, 7619, 7620, - 3, 3, 1863, 1863, 7067, 7068, 7025, 7026, - 7027, 7028, 7029, 7074, 7075, 7076, 7077, -334, - 7079, 7080, 7081, 7082, 7083, 7084, 7085, 7086, - 7087, 7088, 7089, 7090, 1349, 1349, 1349, 1349, - 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, - 1349, 1349, 1349, 1349, 8967, 8968, 7109, 7110, - 1907, 1907, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 2976, 2977, 2978, 32767, 32767, 32767, 32767, + 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 4811, 4812, 4813, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 2178, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2189, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4666, + 4667, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 0, 0, 820, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 821, - 2381, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 2005, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 823, 32767, 824, 32767, - 825, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 826, 32767, 32767, 32767, 32767, 32767, - 32767, 4575, 4576, 4577, 4578, 4579, 4580, 4581, - 4582, 4583, 4584, 4585, 32767, 32767, 829, 32767, - 32767, 32767, 32767, 830, 32767, 32767, 32767, 32767, + 32767, 32767, 1743, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 6253, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 6253, -3848, 834, 835, 836, -3845, -3845, -3845, - -3845, -3845, -3845, 843, 844, -4280, 32767, 845, - 846, 6531, 848, -3839, 32767, -3840, -3840, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 1946, 32767, - 32767, 32767, -3849, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 853, 32767, 32767, 32767, - 32767, 854, 32767, 32767, 32767, 32767, 855, 32767, - 32767, 32767, 32767, 856, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 857, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -3799, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 8266, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 785, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 786, 32767, 32767, 787, 788, + 789, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 790, + 791, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 4668, 2585, 2585, 2014, 4672, + 4673, 4674, 4675, 2583, 4677, 4678, 32767, 32767, + 32767, 32767, 755, 756, 757, 758, 759, 760, + 761, 2992, 762, -1954, -1953, -866, -865, -1950, + -1949, -4921, -858, -857, 7336, -4923, -4923, 792, + 660, 660, 660, 32767, 32767, -4922, -4922, -4922, + -4922, 658, 658, -4874, 32767, 657, 657, -8375, + 2587, -8373, -18471,5846, -303, -8814, -13150,4641, + -13150,39, 39, 375, 376, -4350, 378, 32767, + 32767, 379, 380, -1471, 382, -1470, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -346, -346, -346, + -346, 401, 0, 0, -571, 405, -1449, 407, + 32767, 0, 409, 410, 411, 412, 413, 0, + 414, -1441, -1441, -1441, -1441, -1441, 420, 421, + 32767, 32767, 422, 423, -1439, -1439, 426, 427, + 428, 32767, 32767, 429, -1435, -1435, 432, 433, + -1433, 32767, 32767, 0, 2073, 436, 437, -1752, + 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 640, 2098, 642, 32767, 32767, 452, + 453, 454, 455, 456, 457, 458, 459, 460, + -4233, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 0, 1519, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 859, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 860, - 32767, 861, -5065, 32767, 32767, 32767, 32767, 32767, + -456, 32767, 32767, 32767, 32767, 32767, 32767, -3164, + 3752, 32767, 32767, 32767, -467, 32767, 32767, 32767, + 32767, 799, 32767, 32767, 32767, 32767, 1521, 1522, + 32767, -4966, -478, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, -2387, -2386, -2385, -2384, -2383, + -2382, -2381, 3002, 4163, 4164, 4165, -5186, -5186, + -5186, -11287,-5186, -5186, -5186, -5186, -5186, -5186, + -5186, -3944, -5186, -3943, -5186, -5186, -5186, -5186, + -11299,-5186, -5186, -67, 32767, -11302,-11302,-5187, + -5187, -11304,-5187, 32767, 32767, -5189, -5189, -5189, + -5189, -5189, -5189, -5189, -5189, -5189, -5189, -5189, + -5189, -5189, -5189, -5189, -5189, 32767, 4684, -5191, + -5191, -5191, -5191, -11304,-2732, -5191, -14146,32767, + 32767, 32767, 32767, 32767, 32767, 4685, 32767, 3013, + 3014, 3015, 32767, 5848, 5849, 5850, 5851, 5852, + 5853, 5854, 32767, 32767, 32767, 32767, 32767, 32767, + 802, 32767, 32767, 32767, 803, 32767, 32767, 32767, + 4686, 32767, 4687, 804, 805, 32767, 806, 807, + 32767, 808, 32767, 32767, 32767, 32767, 32767, 3016, + 32767, 4688, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4689, + 4690, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 10746, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4526, - 32767, 4573, 4574, 4575, 32767, 32767, -2436, -1376, - 32767, 32767, 32767, 32767, 32767, -1689, -1689, 4349, - -4171, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 4588, 32767, - 4589, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4590, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4591, 4592, 32767, - 32767, 32767, 32767, 32767, 32767, 2933, 32767, 32767, + 32767, 32767, 32767, 32767, 0, 32767, 32767, 4691, + 4692, 4693, 32767, 32767, 32767, 32767, 32767, 2190, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -1638, -1638, 0, 0, 2190, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -191, + -1648, -191, -1648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4694, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7916, 7916, 7916, 7916, 7916, 7916, + 7916, 7916, 7916, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9319, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 1362, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 6151, 6152, 6153, 6154, 6155, + 6156, 6157, 6158, 6159, 6160, 5382, 5382, -3685, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 5382, 5382, 5382, 5382, 5382, + 5382, 5382, 5382, 5382, 5382, 0, -1160, -1160, + -1160, 8192, 8193, 8194, 14296, 8196, 8197, 8198, + 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, + 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, + 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, + 5381, 5381, 6143, 0, 0, 3019, 0, 3020, + 3021, -1766, 0, 0, 3023, -8634, -1770, -1770, + 8702, 32767, 32767, 3025, 3026, 32767, 3027, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, -1783, -7743, + -1783, -1783, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 5046, 5047, 5048, 5049, 5050, + 5051, 5052, 32767, 32767, 32767, 169, 169, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 6144, 6145, 5767, 6147, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, -2883, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 563, 564, 565, + 8960, 0, 0, 0, 8964, 8964, 8964, 6573, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 0, 0, 13479, 1040, 0, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, -5930, 32767, 32767, 32767, 32767, 829, 830, + -14060,32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 832, 833, + 834, 835, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -622, -622, -622, + -622, -622, -622, -622, -622, 3032, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 32767, 32767, 32767, 32767, -638, 32767, 32767, + 32767, 32767, 1991, -642, 3820, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 838, 32767, 32767, 32767, 32767, + 32767, 2458, 2458, 32767, 0, 4695, 32767, 839, + 840, 4696, 4697, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 841, 32767, 842, 32767, + 843, 32767, 32767, 32767, 32767, 0, 32767, 0, + 32767, 32767, 844, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 845, 32767, 32767, 32767, + 0, 846, 32767, 0, 0, 0, 847, 0, + 0, -4621, 32767, -2323, 0, 0, 0, 0, + 0, 0, 32767, 32767, 4705, 4706, 32767, 686, + 686, 0, 687, 3034, 32767, 32767, 32767, 32767, + -1963, -2342, -2342, 6037, 12728, 12729, -2990, 12731, + 12732, 12733, 12734, 12735, -531, 32767, 32767, -533, + -533, 2711, 2711, 2711, 32767, 2710, 5710, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 6589, + 6590, 6591, 2699, 4714, 6593, 6594, 32767, 32767, + 32767, 6595, 6596, 6597, -3874, 6599, 32767, 32767, + 32767, 2803, 32767, 32767, 32767, 32767, 8384, 32767, + 32767, 32767, 32767, 8337, 32767, 32767, 32767, 32767, + -682, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -2389, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, -2401, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 0, 32767, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32767, 0, 0, 32767, 0, 32767, 32767, 0, + 32767, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32767, 0, 0, 0, 0, + 32767, 0, 32767, 0, 32767, 32767, 32767, 32767, + 32767, 32767, -957, 32767, 32767, 32767, 32767, 0, + 32767, 0, 880, 0, 32767, 0, 0, 0, + 32767, 0, 0, 32767, 0, 32767, 32767, 0, + 32767, 0, 32767, 0, 32767, 0, 32767, 0, + 32767, 0, 0, 32767, 0, 32767, 32767, 0, + 0, 6115, 0, 6116, 6116, 0, 0, 6116, + 6116, 6116, 6116, 0, 6115, 0, 0, 0, + 6113, 6113, 6113, 6113, 6113, 6113, 6113, 0, + 6113, 0, 8572, 6113, -2842, -450, 0, 0, + 8578, 8578, 13898, 13898, 13898, 0, 0, 13900, + 19634, 13900, 7458, 13900, 13900, 6824, 13901, 13901, + 13901, 13901, 11510, 18426, 18426, 19642, 18426, 0, + 15149, 19647, 6119, 0, 13904, 18427, 0, 0, + 6121, 0, 0, 4759, 14861, 4759, 14862, 4759, + 4759, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4775, 4775, 4775, 4775, 0, 4776, 4776, + 4776, 0, 7826, 7827, 7828, 7829, 7830, 7831, + 4777, 4777, 4777, 4777, 4777, 0, 4778, 4778, + 0, 0, 4780, 4780, 4780, 4780, 4780, 0, + 0, 4782, 4782, 4782, 0, 4783, 0, 4784, + 0, 4785, 0, 4786, 4786, 4786, 4786, 0, + 4787, 4787, 4787, 0, 4788, 4788, 4788, 4788, + 4788, 4788, 4788, 0, 4789, 4789, 4789, 4789, + 4789, 4789, 0, 0, 0, 0, 4793, 4793, + 4793, 4793, 4793, 0, 882, 0, 0, 0, + 0, 4799, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 7927, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 4799, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 4799, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 4799, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 4799, 4799, 4799, 4799, 4799, 4799, 4799, + 4799, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2458, -2458, -2458, 0, 0, + 0, 2649, 2650, 2651, 2652, -5332, 2654, -12410, + 0, -12409,2659, 8018, -360, 2662, 2663, 2664, + 0, 0, 0, 0, 0, 2142, 2143, 2144, + 2145, 0, 0, 0, 0, 0, 0, 0, + 0, 4307, 4308, 0, 4309, 4310, 0, -173, + 0, 0, -1457, 0, -1457, 0, -1457, 0, + -1458, -8534, -8533, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3244, + -3244, 0, 0, 0, 0, 0, 3000, 0, + 5135, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2717, 2717, 1631, 1631, 2717, + 2717, 5690, 1628, 1628, -6564, 5696, 5697, 0, + 5700, 5701, 5702, 5703, 5704, 5705, 5706, 5707, + 5708, 129, 130, 5663, 0, 5664, 5664, 6433, + 0, 0, 0, -5044, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, + 1150, 1151, -5940, -5319, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32767, 32767, 0, 32767, + 0, 32767, 32767, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3316, 32767, 3317, 32767, + 3318, 32767, 32767, 3319, 3320, 32767, 32767, 32767, + 0, 0, 0, 9778, 3325, 3326, 3327, 3328, + 3329, 3330, 3331, 3332, 3333, 3334, 454, 3336, + 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, + 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, + 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, + 3361, 0, 0, 3364, 3365, 3366, 3367, 3368, + 3369, 3370, 3371, 3372, 3373, 3374, 3375, 0, + 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, + 3385, 3386, 0, 3388, 32767, 32767, 3389, 3390, + 3391, 3392, 3393, 0, 3395, 3396, 3397, 0, + 0, 0, 0, 0, 3403, 3404, 3405, 0, + 3407, 0, 3409, 3410, 3411, 3412, 3413, 3414, + 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, + 3423, 3424, 3425, 3426, 3427, 3428, 3429, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3723, 1396, 1396, 0, 0, 0, 0, + -9836, 0, 0, 0, 0, 0, 0, 0, + 2630, 0, 0, 0, 2633, 0, 4462, 3462, + 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, + 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 0, 0, + 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 864, 32767, 32767, 32767, - 0, 32767, 0, 32767, 32767, -2977, 335, 335, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 3400, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 471, 471, 885, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2992, 2993, 2994, 2995, - 32767, 32767, 32767, 4596, 2550, 32767, 32767, 32767, - -1188, 4769, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -603,191 +674,173 @@ Decomp_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 4600, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 2997, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4601, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2013, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -11287,32767, 32767, 32767, 32767, - 32767, 32767, 32767, -4664, 32767, 32767, -4711, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, -4718, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4049, - 32767, 32767, 32767, 4050, 4051, 4052, 17313, 32767, - 32767, 32767, 10684, 7370, 7371, 4057, 4058, 4059, - 4060, 4061, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 4603, 8793, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 7954, 32767, + 32767, 32767, 32767, 0, 32767, 32767, -620, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, -11684,32767, + 7964, 32767, 32767, 32767, 32767, 32767, 7967, 0, + 32767, -6890, -6889, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, -2878, -2877, -2876, -2875, 8087, -2873, + -12971,0, 32767, 0, 32767, 32767, 32767, 877, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 7021, + 13712, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 878, 32767, 879, 0, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 0, 0, 0, 0, 32767, 32767, 0, 0, + 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 0, 32767, 32767, 0, 0, + 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1283, 4897, 4898, 4899, 12175, 4901, 4902, 32767, - 4903, 4904, 4905, 4906, 4907, 10276, -1469, 1282, - 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, - 1282, 32767, 32767, 4920, 4921, 4063, -2051, -2050, - 4925, 4926, 32767, 7332, 7333, 32767, 7334, 7335, - 7336, 7337, 5045, 32767, 32767, 32767, -2049, -2048, - 32767, -8294, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 0, 32767, 32767, 32767, 32767, -18761,5867, + 5868, 5869, 5870, 5871, 5872, 5873, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 0, 0, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4392, + 4393, 4394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8674, 0, 0, 3794, 3794, 3794, + 3794, 3794, 3794, 3794, 3794, 3794, 2371, 2044, + 0, 0, 0, 0, 2040, 2040, 3794, 3794, + 0, 0, -4405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20166, 16852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6908, 6909, 6910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -4510, -4510, -4510, -4510, -4510, -4510, -4510, 0, - 0, 0, 0, 0, 0, -1831, -1831, -1831, - -15091,-11776,-11776,-8461, 0, 0, 0, -1834, - -1834, -1834, -1834, -1834, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7266, 7266, 7266, 7266, 7266, 7266, 7266, 7266, + 7266, 7266, 7266, 7266, 7266, 7266, 7266, 7266, + 7266, 7266, 7266, 32767, 32767, 32767, 7263, 7263, + 7263, 7263, 7263, 7263, 32767, 32767, 7261, 7261, + 7261, 7261, 7261, 7261, 32767, 32767, 2460, 2460, + 2460, 2460, 2460, 2460, 32767, 32767, 0, 0, + 0, 32767, 5102, 5103, 5104, 5105, 5106, 5107, + -2877, 5109, -9955, -6587, -9955, 5113, 10472, 2094, + 5116, 5117, 5118, 5119, 5120, 5121, 5122, 4744, + 5124, 5125, -3253, -9943, -9943, 5777, -9943, -9943, + -9943, -9943, -9943, 3324, 3325, 3326, 3327, 3328, + 85, 86, 87, 88, 89, -2910, 91, -5043, + 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, -2614, -2613, -1526, -1525, -2610, -2609, + -5581, -1518, -1517, 6676, -5583, -5583, 132, 0, + 0, 0, -5580, -5580, -5580, -5580, -5580, -5580, + 0, 0, -5532, 5183, 0, 0, 6677, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4922, + 4923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -1819, -3615, 1345, -3616, 0, + 0, 0, 0, 0, 0, 0, 0, 32767, + 0, 0, 32767, 32767, 0, 32767, 32767, 0, + 0, 32767, 32767, 0, 0, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32767, 0, 32767, 0, + 0, 0, 0, 0, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 32767, 0, - 0, 0, 0, 0, 0, 0, 8770, 8771, - 8772, 8773, 8774, 8775, 8776, 8777, 8778, 8779, - 45, 45, 45, 45, 2477, 2522, 45, 45, - 45, 45, -13215,-9900, -9900, -6585, -6585, -3270, - -3270, 45, 45, 45, 45, 45, 8802, 8803, - 0, 0, 45, 45, 45, 45, 8810, 8811, - 0, 0, 45, 2700, 2701, 2702, 2703, 5134, - 2705, 2706, 0, 2708, 0, -5957, 0, -5957, - 0, 3312, 3312, 3312, 13053, 7051, 1095, 3314, - 0, 3315, 4896, 0, 3317, 3317, 3317, 3317, - 3317, 3317, 3317, 2720, 3317, 3317, 0, 3318, - 0, 3319, 0, 0, 3321, 8857, 8858, 8859, - 0, 0, 8862, 8863, 2749, 2750, 2751, 0, - 0, 0, 2755, 2756, 2757, 2758, 2759, 2760, - 2761, 2762, 2763, 2764, 2765, 2766, 2767, -3479, - -3479, 2770, 2771, 2772, 2773, 2774, 2775, 2776, - 2777, 2778, 2779, 2780, 2781, 1267, -1961, -1961, - 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, - -1097, -1096, 2795, 2796, -1094, -1093, 4845, 0, - -1089, -1088, -1087, 7200, -1556, -1556, 7248, 7249, - 7205, 1037, 1038, 1039, -1559, -1559, 7253, 7254, - 7210, 7211, 200, 2803, 7168, 7215, 7216, 7217, - 7218, 7219, 208, 209, 1269, -1516, -1516, -1516, - 916, 961, 961, 961, 10693, -1520, -14780,218, - 219, 220, -3514, -3514, -3514, -3514, -3514, -3514, - -3514, 228, 7241, 7242, -1561, 8210, 8211, -1518, - -1518, 8214, 8215, 9195, 5881, 351, 8219, 8220, - 6448, 6449, 6450, 6451, 3864, 2870, 2871, 12671, - 12627, 0, 0, 0, 0, 0, 12709, 6471, - 12637, 12638, 5627, 8230, 12595, 12642, 2545, 8234, - 12645, 8236, 5634, 3341, 2545, 0, 0, 5749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32767, 32767, + 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 0, 0, 0, 11602, - 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 1466, - 0, 0, 32767, 32767, 32767, 32767, 32767, 0, + 32767, 32767, 32767, 886, 887, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 888, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, + 0, 0, -9067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5760, 0, 0, 0, 0, 0, 32767, - 0, 32767, 0, 0, 32767, 0, 0, 32767, - 0, 3507, 3508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6540, -6540, 2812, 32767, 2813, 8915, + 2815, 2816, 2817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1644, 1645, 1646, 1647, -5764, 1649, 1650, 1651, - 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, - 1660, -4081, -4081, -4081, -4081, -4081, -4081, -4081, - -4081, -4081, -4081, -4081, -4081, -4081, -4081, -4081, - -4081, 3537, 3538, 1679, 3582, 3583, 3584, -3482, - -3482, -3482, -3482, -3482, -3526, -3526, -3526, -3526, - 3886, -3526, -3526, -3526, -3526, 3599, 3600, 3601, - 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, - 3610, 3611, 3612, 3613, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 0, - -7275, 0, 0, -7234, 0, 0, 0, 0, - 0, -5368, 6378, 3628, 3629, 3630, 3631, 3632, - 3633, 3634, 3635, 3636, 3637, 3638, 3639, 0, - 0, 859, 6974, 6974, 0, 0, 3647, -2405, - -2405, 3650, -2405, -2405, -2405, -2405, -112, -2405, - -3201, 3658, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 0, 0, 762, 32767, 32767, + 32767, 32767, -2365, 32767, 32767, 32767, 32767, 32767, + -14024,32767, 32767, 32767, 0, 32767, 32767, 32767, + 32767, 32767, 0, 0, 0, 0, 0, 0, + 0, 32767, 0, 32767, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, - 32767, 5280, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 889, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 890, 32767, 32767, 32767, + 0, -4168, -4168, -4168, -4168, -4168, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, -4192, -4192, 32767, -4193, -4193, + -4193, -4193, -4193, -4193, 409, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 32767, 0, 0, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, -1663, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 4637, 4638, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 891, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 4014, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 802, 32767, 32767, - 32767, 32767, 803, -1055, 805, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 4639, 32767, - 32767, 32767, 806, -2445, 0, -2443, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -799,461 +852,466 @@ Decomp_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 892, 893, 894, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 810, 32767, 32767, - 32767, 32767, 811, 812, 813, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -6211, -6211, -6211, -6211, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, -6271, -6271, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 935, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, -10300,32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 32767, 0, + 0, 4788, 32767, 32767, 0, 11658, 32767, 8415, + 8416, 32767, 32767, 0, 0, 32767, 0, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 5874, 5875, 5876, 5877, 32767, 5878, 5879, 5880, + 5881, 5882, 5883, 5884, 5885, 5886, 5887, 5888, + 5889, 5890, 5891, 5892, 5893, 5894, 5895, 5896, + 5897, 5898, 5899, 5900, 5901, 5902, 5903, 5904, + 32767, 5905, 5906, 32767, 5907, 32767, 32767, 5908, + 32767, 5909, 5910, 5911, 5912, 5913, 5914, 5915, + 5916, 5917, 5918, 32767, 5919, 5920, 5921, 5922, + 32767, 5923, 32767, 5924, 32767, 32767, 32767, 32767, + 32767, 32767, 6882, 32767, 32767, 32767, 32767, 5926, + 32767, 5927, 32767, 5928, 32767, 5929, 5930, 5931, + 32767, 5932, 5933, 32767, 5934, 32767, 32767, 5935, + 32767, 5936, 32767, 5937, 32767, 5938, 32767, 5939, + 32767, 5940, 5941, 32767, 5942, 32767, 32767, 5943, + 5944, -170, 5946, 32767, -169, 5948, 5949, -166, + -165, -164, -163, 32767, -161, 5955, 5956, 5957, + 32767, -155, -154, -153, -152, 32767, -151, 32767, + -150, 5964, -2607, -147, 8809, 6418, 5969, 5970, + -2607, -2606, 32767, -7925, -7924, 5975, 5976, -7923, + -13656,-7921, -1478, -7919, -7918, -841, -7917, -7916, + -7915, -7914, -5522, -12437,32767, 32767, 32767, 32767, + 32767, -13657,-128, 5992, 32767, -12434,5994, 5995, + -125, 5997, 0, 1239, -8862, 1241, -8861, 1243, + 1244, 6004, 6005, 6006, 6007, 6008, 6009, 6010, + 6011, 6012, 6013, 6014, 32767, 0, 0, 0, + 0, 0, 0, 0, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 897, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 0, 0, 0, 0, 0, + 0, 0, 32767, 32767, 0, -1786, -1786, -1786, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 898, + 899, 900, 901, 902, 903, 904, 905, 32767, + 32767, 906, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 907, -8041, -8041, + 7679, -3281, 912, 913, 914, 915, 916, 0, + 0, 0, 0, 32767, -1845, -1845, -1845, -1845, + 0, 0, 0, 8949, 8950, -6769, 4192, 0, + 0, 0, 0, 0, 917, 918, 919, 920, + 32767, 2766, 2767, 2768, 2769, 925, 926, 927, + -8021, -8021, 7699, -3261, 932, 933, 934, 935, + 936, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, -1879, -1879, + -1879, -1879, -1879, -1879, -1879, -1879, 2014, 0, + -1878, -1878, -1878, -1878, -1878, -1878, -1878, -1878, + 8594, -1878, -1878, -1878, -1878, -1878, 32767, -1879, + -1879, -1879, -1879, -1879, -1879, -1879, -1879, -7839, + -1879, -1879, -1879, -4595, -4595, -4595, -4595, -4595, + -1879, -4596, 539, -4596, -4596, -4596, -4596, -4596, + -4596, -4596, -4596, -4596, 32767, 397, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 943, + 32767, 32767, 32767, 32767, 32767, 32767, 944, 32767, + 945, 32767, 32767, 946, 947, 32767, 948, 949, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 0, 0, 32767, 32767, 4640, 4641, 32767, - 32767, 32767, 32767, 32767, 4624, 32767, 32767, 32767, - -4233, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1859, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 4591, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 959, 960, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 872, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -4568, -1253, 32767, - -3590, 32767, 32767, 32767, -1820, -1820, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 961, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 51, 51, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 964, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 873, 874, 875, 3629, 0, 0, - 0, 5048, 5005, 5006, 5007, 5008, 5009, 5054, - 5055, 5056, 0, 0, 0, 0, 0, 32767, + 32767, 32767, 32767, 4767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4118, - 32767, 32767, 32767, 32767, -4122, -4122, -4122, -4122, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 6015, 6016, 6017, 6018, 6019, + 6020, 6021, 6022, 6023, 7447, 7775, 32767, 32767, + 32767, 32767, 32767, 7780, 6027, 6028, 6029, 6030, + 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, + 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, + 6047, 6048, 6049, 6050, 6051, 6052, 6053, 6054, + 6055, 6056, 32767, 6057, 6058, 6059, 6060, 6061, + 6062, 6063, 6064, 6065, 6066, 6067, 6068, 6069, + 6070, 6071, 6072, 6073, 6074, 6075, 6076, 6077, + 6078, 6079, 6080, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 965, 1410, 1411, 1412, + 1413, 1414, 1415, 1416, 1417, 1418, 12380, 1420, + -8678, 15639, 9490, 979, -3357, 14434, -3357, 2377, + -3357, 2379, 1174, 2381, 1174, 2383, 1174, 2385, + 1174, 2387, 1174, 1174, 2390, 1174, 2392, -2104, + 2394, 1174, -2102, 1174, 1174, 1174, 1174, -2400, + -2400, -2400, -2400, 2405, 1174, 2407, 2408, 1174, + 2410, 2411, 1174, 2413, 2414, -1896, 1174, 1174, + 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, + 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, + 1174, 1174, -3323, 2437, 1174, 1174, 1174, 1174, + 2442, 2443, 2444, 2445, 1174, 2447, 2448, 1174, + 1174, 992, -3314, -3314, -2076, -3314, -3314, 997, + 1171, 999, 1000, 2458, 1002, 2460, 1004, 2462, + 9540, 2464, 9541, 9541, 1009, 1010, 1011, 1012, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 0, 1024, 1025, 1026, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 0, 0, 0, 0, -8971, -1739, -1738, -1737, + -8971, -8971, -8971, -8971, -8971, 1052, -8971, -8971, + 32767, -8972, -8972, -8972, -8972, -5604, -8972, -8972, + -8972, -8972, -8972, -8972, -8972, -1697, -8972, -8972, + 32767, -8973, -8973, -8973, -2283, -8973, -8973, 6747, + -8973, -8973, -8973, -8973, -8973, 4294, 4295, 4296, + 4297, 4298, 1055, 1056, 1057, 1058, 1059, -1940, + 1061, -4073, 1063, 1064, 1065, 1066, 1067, 1068, + 1069, 1070, 1071, 1072, -1644, -1643, -556, -555, + -1640, -1639, -4611, -548, -547, 7646, -4613, -4613, + 1085, -4614, -4614, -4614, -4614, -4614, -4614, -4614, + -4614, -4614, 966, 966, -4566, 1098, -4565, -4564, + -5332, 1102, 1103, 1104, 6149, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7092, 6472, 6473, 6474, 1155, + 1156, 1157, 1158, -16632,1160, -4573, 1162, 7605, + 1164, 1165, 1166, 1167, 1168, 1169, 1170, 3562, + -3353, -3352, -4567, -3350, -4567, -70, -4567, -3346, + 1180, 1181, -3341, -3340, -3339, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 11206, 246, + -9852, 14465, 8316, -195, -4531, 13260, -4531, 1203, + -4531, 1205, 0, 1207, 0, 1209, 0, 1211, + 0, 1213, 0, 0, 1216, 0, 1218, -3278, + 1220, 0, -3276, 0, 0, 0, 0, -3574, + -3574, -3574, -3574, 1231, 0, 1233, 1234, 0, + 1236, 1237, 0, 1239, 1240, -3070, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4497, 1263, 0, 0, 0, 0, + 1268, 1269, 1270, 1271, 0, 1273, 1274, 0, + 0, -182, -4488, 0, 1280, 1281, -4485, -174, + 0, -172, -171, 1287, -169, 1289, -167, 1291, + 8369, 1293, 8370, 8370, 1296, 1297, 1298, 1299, + 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, + 1308, 1309, 0, 0, 0, 0, 1310, 1311, + 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, + 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, + 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, + 1336, 0, 1338, 1339, 1340, 1341, 1342, 1343, + 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, + 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, + 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, + 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, + 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, + 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, + 444, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10961,0, 10099, 32767, 32767, 443, + 4780, -13010,4782, -951, 4784, 11227, 32767, -953, + 255, -953, 257, -953, 259, -953, 261, 262, + -953, 264, -953, 3544, -953, 268, 3545, 270, + 271, 272, 273, 3848, 3849, 3850, 3851, -953, + 279, -953, -953, 282, -953, -953, 285, -953, + -953, 3358, 289, 290, 291, 32767, 32767, 292, + 293, 294, 295, 296, 297, 32767, 32767, 298, + 299, 300, 301, 302, 303, 304, 4802, 3582, + 306, 32767, 307, 32767, -960, 32767, -961, -961, + 311, -961, -961, 314, 315, 498, 4805, 4806, + 3569, 4808, 4809, 499, 326, 499, 499, -958, + 499, -958, 499, -958, -8035, -958, -8034, -8033, + 500, 500, 500, 500, 500, 32767, 32767, 498, + 498, 498, 498, 498, 498, 498, 498, 1522, + 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 499, 499, 499, 499, + 499, 499, 499, 499, 1551, 1552, 1553, 1554, + 10526, 3295, 3295, 3295, 10530, 10531, 10532, 10533, + 10534, 512, 10536, 10537, 10538, 10539, 10540, 10541, + 10542, 7175, 10544, 10545, 10546, 10547, 10548, 10549, + 10550, 3276, 10552, 10553, 10554, 10555, 10556, 10557, + 3868, 10559, 10560, -5159, 10562, 10563, 10564, 10565, + 10566, -2700, -2700, 3260, 10570, -2702, 542, 542, + 542, 542, 542, 3258, 541, 5676, 541, 541, + 541, 541, 541, 541, 541, 541, 541, 541, + 3258, 3258, 2172, 2172, 3258, 3258, 6231, 6232, + 6233, -6025, 6235, 6236, 6237, 6238, 6239, 6240, + 6241, 6242, 6243, 6244, 6245, 6246, 6247, 6248, + 1633, 1634, 1635, 1636, 1637, 1638, 1639, -872, + -872, -872, -872, 6260, 6261, 6262, 6263, 6264, + 6265, -878, 6267, 6268, 6269, 6270, 6271, -883, + 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, + 6281, 6282, 6283, 6284, 9899, 6286, 6287, 6288, + 6289, 6290, 6291, 6292, 6293, 6294, 6295, -895, + 6297, 6298, 6299, 1650, -898, 6302, 1652, -899, + 6305, 6306, 6307, 6308, -903, 6310, -904, 6312, + 6313, 6314, 6315, 6316, 6317, 6318, 6319, -912, + -912, -912, 6323, 6324, 6325, 6326, 6327, -3695, + 6329, 6330, 6331, 6332, 6333, 6334, 6335, 2968, + 6337, 6338, 6339, 6340, 6341, 6342, 6343, -931, + 6345, 6346, 6347, 6348, 6349, 6350, -339, 6352, + 6353, -9366, 6355, 6356, 6357, 6358, 6359, -6907, + -6907, -947, 6363, -6909, -3665, -3665, -3665, -3665, + -3665, -949, -3666, 1469, -3666, -3666, -3666, -3666, + -3666, -3666, -3666, -3666, -3666, -3666, -949, -949, + -2035, -2035, -949, -949, -949, -949, -949, 6392, + -950, -950, -950, -950, -950, -950, -950, -950, + -950, -950, -950, -950, -950, 6406, 6407, 6408, + 6409, -4824, -4823, 6412, 6413, 6414, 6415, 6416, + 1703, 302, 6418, 303, 304, 6421, 6422, 307, + 308, 309, 310, 6427, 313, 6429, 6430, 6431, + 319, 320, 321, 322, 323, 324, 325, 6439, + 327, 6441, -2130, 330, 9286, 6895, 6446, 6447, + -2130, -2129, -7448, -7447, -7446, 6453, 6454, -7445, + -13178,-7443, -1000, -7441, -7440, -363, -7439, -7438, + -7437, -7436, -5044, -11959,-11958,-13173,-11956,6471, + -8677, -13174,355, 6475, -7428, -11950,6478, 6479, + 359, 6481, 6482, 1724, -8377, 1726, -8376, 1728, + 1729, 6489, 6490, 6491, 6492, 6493, 6494, 6495, + 6496, 6497, 6498, 6499, 6500, 6501, 6502, 6503, + 6504, 1730, 1731, 1732, 1733, 6509, 1734, 1735, + 1736, 6513, -1312, -1312, -1312, -1312, -1312, -1312, + 1743, 1744, 1745, 1746, 1747, 6525, 1748, 1749, + 6528, 6529, 1750, 1751, 1752, 1753, 1754, 6535, + 6536, 1755, 1756, 1757, 6540, 1758, 6542, 1759, + 6544, 1760, 6546, 1761, 1762, 1763, 1764, 6551, + 1765, 1766, 1767, 6555, 1768, 1769, 1770, 1771, + 1772, 1773, 1774, 6563, 1775, 1776, 1777, 1778, + 1779, 1780, 6570, 6571, 6572, 6573, 1781, 1782, + 1783, 1784, 1785, 6579, 5698, 6581, 6582, 6583, + 6584, 1786, 1787, 1788, 1789, 1790, 1791, 1792, + 1793, -1334, 1795, 1796, 1797, 1798, 1799, 1800, + 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, + 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, + 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, + 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, + 1833, 6633, 6634, 6635, 6636, 6637, 6638, 6639, + 6640, 6641, 6642, 9101, 9102, 9103, 6646, 6647, + 6648, 4000, 4000, 4000, 4000, 11985, 4000, 19065, + 6656, 19066, 3999, -1359, 7020, 3999, 3999, 3999, + 6664, 6665, 6666, 6667, 6668, 4527, 4527, 4527, + 4527, 0, 1990, 8906, 8906, 6676, 6677, 6678, + 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, + 6687, 6688, 6689, 6690, 6691, 6692, 5347, 6694, + 5348, 6696, 5349, 6698, -8867, 6700, 5796, 6702, + 0, 0, 0, 0, 0, 0, 9349, 9350, + 9351, 0, 0, 0, -6101, 0, 0, 0, + 0, 0, 0, 0, 1242, 0, 1243, 0, + 0, 0, 0, -6113, 0, 0, 5119, 5119, + -6115, -6115, 0, 0, -6117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6113, 2459, + 0, -8955, -6563, 1842, 2463, 2463, 2463, 7783, + 7783, 7783, 7783, 25574, 7783, 13517, 7783, 1341, + 7783, 7783, 7783, 7783, 7783, 7783, 7783, 5392, + 12308, 12308, 13524, 12308, 13526, 9030, 13528, 0, + -6119, 7785, 12308, 0, 0, 0, -6121, 1847, + 32767, 8738, 8738, 8738, 8738, 8738, -2223, 8738, + 18837, -5479, 671, 9183, 13520, -4270, 13522, 334, + 335, 0, 0, 4727, 0, 0, -6236, 0, + 0, 1852, 0, 1853, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 745, 746, 0, + 402, 403, 975, 0, 1855, 0, -1685, 408, + 0, 0, 0, 0, 0, 0, 0, 1856, + 1857, 1858, 1859, 1860, 0, 0, 1861, 1862, + 0, 0, 1863, 1864, 0, 0, 0, 0, + 0, 0, 1865, 1866, 0, 0, 1867, 1868, + 0, 32767, 1869, 1870, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 1871, 1872, + 1873, 1874, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4193, - 32767, -4194, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 1875, 1876, 1877, 1878, 32767, 32767, + 32767, 32767, 32767, 32767, 1879, 1880, 1881, 1882, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -4209, 32767, 32767, -4211, -4211, -4211, - -4211, -4211, -4211, -4211, 32767, 32767, -4213, -10683, - -4213, -1918, -4213, -6043, 32767, 32767, -4215, -6047, - 32767, -4216, -10696,-4216, -4216, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4646, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 876, 877, 0, 32767, 0, 32767, 0, - 32767, 0, 32767, 0, 32767, 32767, 32767, 0, + 32767, 32767, 32767, 32767, 1883, 1884, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 1844, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2899, 0, 32767, - 0, 32767, 0, 32767, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 836, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767, 0, 0, 0, 879, - 880, 881, 882, 883, 884, 885, 886, 0, - 0, 887, 0, 920, 0, 922, 923, 924, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 5431, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, - 0, 32767, 3639, 889, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 899, 900, -2739, - 927, -1881, 4234, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -459, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -458, - -457, 904, 32767, 905, 32767, 906, 32767, 907, - 32767, 908, 32767, 32767, 32767, 909, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 910, - 0, 0, 0, 0, 0, 0, 911, 0, - 912, 1626, 1626, 913, 914, 1626, 915, 916, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1837, -1837, -1837, - -6487, -1837, -1837, 0, 0, 0, 917, 31, - 919, 0, 921, 0, 0, 0, 925, 0, - 32767, 4801, 0, 0, 0, 0, 0, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 0, 0, 4753, 4754, 4755, 4756, 4757, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5000, 0, -4999, 0, -4998, + 0, -4997, 0, -4996, 9869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -6470, 0, 2295, - 0, -1830, 0, -6475, 0, -1832, 0, 0, - -6480, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3665, 0, 0, - 0, 0, 2281, 0, 0, -7412, 5769, 5770, - 5771, 5772, 5773, 5774, 0, 0, 0, 0, - 32767, 0, 0, 32767, 32767, 0, 32767, 32767, - 0, 0, 32767, 32767, 0, 0, 0, -1842, - 32767, 0, 0, 0, -1846, -1846, -2560, -1846, - 0, -2560, -2559, 0, 0, 32767, 0, 32767, - 0, 0, 0, 0, 0, 0, 1388, 0, - 1387, 1387, 1387, 0, 1387, 1387, 1387, 1387, - 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, - 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, - 1387, 0, -1870, 0, -1871, 0, 0, 0, - 0, 0, 0, -1877, 0, 0, -1877, -1877, - 0, 0, 0, 4944, 0, -1875, 4947, 4948, - 0, 4950, 4951, 4952, 4953, 4954, 4955, 4956, - 4957, 4958, 4959, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, - 32767, 32767, 0, 0, 0, 0, 32767, 32767, - 32767, 0, 0, 931, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4650, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 5375, - 5376, 5377, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 13180, 0, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, -4011, 933, -4011, 32767, - 935, 936, -4012, 938, 939, 940, 941, 942, - 943, 944, 945, 946, 947, 32767, 1075, 1076, - 1077, -6334, 1079, 1080, 954, 32767, 32767, 32767, - 32767, 955, 32767, 32767, 32767, 32767, 32767, 32767, - -4659, 32767, 32767, 32767, -4662, -4662, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 959, 960, 961, 32767, 962, 963, 964, - 965, 966, 967, 968, 969, 970, 971, 972, - 32767, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 32767, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, - 1011, 1012, 1013, 1014, 1015, 1016, 1017, -362, - -362, 32767, 32767, 32767, 32767, -410, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 1019, 32767, 32767, + 0, 0, 0, 32767, 0, 32767, 0, 0, + 32767, 0, 0, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 164, 1021, -3551, -3551, 1024, 1025, 1026, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, - 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, - 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, - 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, - 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, - 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, - 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, - 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, - 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, - 1108, 1109, 1110, 1111, 1112, 1113, 1114, 32767, - 1115, 1116, 1117, 1118, 1119, 32767, 1120, 1121, - 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, - 1130, 1131, 0, 1133, 1134, 1135, 1136, 1137, - 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, - 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, - 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, - 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, - 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, - 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, - -18956,-15641,1212, 1213, 1214, 1215, 1216, 1217, - 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, - -5682, -5682, -5682, 1229, 1230, 1231, 1232, 1233, - 1234, 1235, 1236, 1237, 1238, 1239, 5750, 5751, - 5752, 5753, 5754, 5755, 5756, 1247, 1248, 1249, - 1250, 1251, 1252, 3084, 3085, 3086, 16347, 13033, - 13034, 9720, 1260, 1261, 1262, 3097, 3098, 3099, - 3100, 3101, 1268, 1269, 1270, 1271, 1272, 1273, - 1274, 1275, 32767, 32767, 32767, 32767, 1276, 1277, - 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, - 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, - 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, - 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, - 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, - 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, - 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, - 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, - 1342, 3162, 4959, 0, 4962, 1347, 1348, 1349, - 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, - 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 7481, - 7482, 7483, 7484, 5053, 5009, 7487, 7488, 7489, - 7490, 20751, 17437, 17438, 14124, 14125, 10811, 10812, - 7498, 7499, 7500, 7501, 7502, 32767, 32767, 7548, - 7549, 7505, 7506, 7507, 7508, 32767, 32767, 7554, - 7555, 7511, 4857, 4857, 4857, 4857, 2427, 4857, - 4857, 7564, 4857, 7566, 13524, 7568, 13526, 7570, - 4259, 4260, 4261, -5479, 524, 6481, 4263, 7578, - 4264, 2684, 1421, -7842, -4527, -4527, -1212, -1212, - -1212, -1212, -1212, 7545, 7546, 0, 0, -1214, - -1214, -1214, -1214, 7551, 7552, 32767, 1610, -1216, - 1439, 1440, 1441, 1442, 3873, 1444, 1445, 32767, - 1446, 32767, -7220, 32767, -7221, 0, 2047, 2047, - 2047, 11788, 5786, -170, 2049, -1265, 2050, 3631, - -1265, 2052, 2052, 2052, 2052, 2052, 2052, 2052, - 1455, 2052, 2052, -1265, 2053, -1265, 2054, -1265, - -1265, 2056, 7592, 7593, 7594, 32767, 32767, 7595, - 7596, 1482, 1483, 1484, -1267, -1267, -1267, 1488, - 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, - 1497, 1498, 1499, 1500, -4746, -4746, 1503, 1504, - 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, - 1513, 1514, 0, -3228, -3228, 1518, 1519, 1520, - 1521, 1522, 1523, 1524, 1525, -2364, -2363, 1528, - 1529, -2361, -2360, 3578, 0, -2357, -2356, -2355, - 5932, -2824, -2824, 5980, 5981, 5937, -231, -230, - -229, -2827, -2827, 5985, -225, 5941, 5942, -1069, - 1534, 5899, 5946, 5947, 5948, 5949, 5950, -1061, - -1060, 0, -2785, 0, -355, -355, -310, -310, - -310, 9422, -2791, 32767, -1054, -1053, -1052, -4786, - -4786, -4786, -4786, -4786, -4786, -4786, -1044, 5969, - 5970, -2833, 6938, 6939, -2790, -2790, 6942, 0, - 32767, 4607, -923, 6945, 32767, 5173, 5174, 5175, - 5176, 2589, 1595, 1596, 11396, 11352, 32767, 32767, - 6126, 2812, 2813, 2814, 2815, 2816, -5940, -5940, - 1607, 1608, 2823, 32767, 32767, 1516, 0, -8581, - 0, 0, 728, 1525, 163, -11068,0, -2262, - -2306, -2305, 32767, 32767, 0, 0, 1580, 0, - 0, 0, -6443, 1685, -10176,-4173, 1784, -4173, - 0, -4172, 5925, -4171, -4171, -4171, 0, -437, - 0, 0, 0, 161, -435, 0, 2883, -434, - 0, 0, 0, 0, -436, 0, -5972, 0, - 0, 0, 0, 0, 0, 0, 0, 2889, - 2890, 2891, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6371, - 0, 0, 0, 0, 0, 0, 0, 117, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767, 0, 0, 3991, 3991, - 3991, 3991, 0, 3990, 3990, 3990, -1947, 1632, - 3990, 3990, 3990, -4296, 4461, 4462, -4341, -4341, - -4296, 1873, 1873, 1873, 4472, 4473, -4338, 1873, - -4292, -4292, 2720, 118, -4246, -4292, -4292, 117, - -4293, -4293, 2719, 2719, 1660, 4446, 1662, 2018, - 2019, 1975, 1976, 1977, -7754, -7754, -8733, -5418, - 113, 0, 112, -2157, -5891, -5891, 0, -5892, - 6455, -5893, 0, 0, 0, 32767, 32767, 32767, - 5826, 32767, 32767, 32767, 32767, 6806, 32767, -2039, - 32767, 5829, 32767, 5830, 5831, 5832, 32767, 5833, - 5834, 32767, 5835, 32767, 32767, -3520, 0, 5837, - 0, 5838, 0, 4035, 0, 5840, 32767, 10251, - 154, 1671, 10253, 1673, 1674, 947, 151, 1514, - 12746, 1679, 3942, 3987, 3987, 3987, 13719, 13720, - 14700, 103, 5855, 13723, 5857, 8127, 0, 11862, - 5860, -96, 5862, 1690, 5863, -4233, 5864, 5865, - 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, - 32767, 5874, 5875, 5876, 5877, 5878, 5879, 5880, - 5881, 5882, 5883, 13795, 5885, 5886, 5887, 5888, - 10489, 5890, 1703, 1704, -4247, 1706, 1707, 5891, - 5892, 5893, 1711, 4098, 5895, 5896, 5897, 7650, - 32767, 5899, 6406, 7966, 5902, 5903, 5904, 5905, - 5906, 5907, 5908, 1800, 5910, 1801, 5912, 5913, - 5914, 5915, 32767, 1727, 1728, 1729, 1730, 32767, - 1731, 1732, 1733, 32767, 1734, 1735, 1736, 1737, - 1738, 1739, 1740, 32767, 1741, 1742, 1743, 1744, - 1745, 1746, 32767, 32767, 32767, 32767, 1747, 1748, - 1749, 1750, 1751, 32767, 32767, 32767, 32767, 32767, - 32767, 1752, 1753, 1754, 1755, 1756, 1757, 1758, - 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, - 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, - 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, - 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, - 1791, 7729, 4151, 1794, 1795, 1796, 10083, 1327, - 1327, 10131, 10132, 10088, 3920, 3921, 3922, 1324, - 1324, 10136, 3926, 10092, 10093, 3082, 5685, 10050, - 10097, 0, 5689, 10100, 5691, 3089, 796, 0, - 1363, 12595, 3792, 3792, 3837, 3837, 3837, 13569, - 13570, 14550, 11236, 5706, 13574, 5708, 7978, 11713, - 11714, 11715, 11716, 11717, 11718, 11719, 7978, 966, - 966, 9770, 0, 0, 9730, 9731, 0, 0, - -979, 2336, 7867, 0, 0, 32767, 0, 0, - 0, 32767, 0, 0, 32767, 0, 32767, 32767, - 9356, 32767, 0, 32767, 0, 32767, 1804, 2602, - 0, -4364, -4410, 5688, 0, -4410, 0, 2603, - 4897, 5694, 4332, -6899, 1905, 1906, 1862, 1863, - 1864, -7867, -7867, -8846, -5531, 0, -7867, 0, - -2269, -6003, -6003, 0, 5957, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -7911, 0, - 0, 0, 0, -4600, 0, 0, 4156, 32767, - 32767, 0, 0, 0, 0, 0, 1796, 0, - 0, 0, -1752, 0, 0, -506, -2065, 0, - 0, 0, 0, 0, 0, 0, 4109, 0, - 4110, 0, 0, 0, 0, 0, 4111, 17372, - 0, 14058, 10744, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -4650, 0, 0, 4161, 32767, - 32767, 4117, 32767, 4118, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -7946, 32767, -4632, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4642, - -4642, 4123, 4124, -4687, 0, 0, -4644, -4644, - 0, 0, -4646, -4646, 32767, 32767, 32767, 32767, - 32767, 32767, 4084, 4085, 32767, 32767, 1609, 4087, - 32767, 32767, 4088, 17349, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 10092, 4136, - 10094, 4138, 10096, 0, 10097, 10098, 10099, 10100, - 10101, 0, 32767, 32767, 32767, 0, 0, 0, - 0, 0, 0, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 0, 0, 0, 0, 0, - 0, 0, 0, 32767, 32767, 0, 10138, 10139, - 0, 0, 0, 10145, 32767, 32767, 32767, 32767, - 32767, 32767, -1425, 8316, 2314, -3642, 32767, 0, - 32767, 32767, 32767, 32767, -1426, -1426, -1426, -1426, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 0, 0, 32767, 32767, + 0, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 52, 52, 52, 52, 52, + 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 1849, 1850, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 100, 101, 102, 103, 104, 105, 106, 107, - 108, -5633, -5633, -5633, -5633, -5633, -5633, -5633, - -5633, -5633, -5633, -5633, -5633, -5633, -5633, -5633, - -5633, 1985, 1986, 127, 2030, 2031, 2032, -5034, - 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, - 32767, 5916, 5917, 5918, 5919, 5920, 5921, 5922, - 5923, 5924, 8824, 5926, 32767, 32767, 0, 32767, - 0, 5927, 5928, 5929, 5930, 5931, 5932, 5933, - 5934, 5935, 5936, 5937, 5938, 5939, 5940, 5105, - 5942, 5943, 5944, 5945, 5946, 5947, 5948, 5949, - 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, - 32767, 5958, 5959, 5960, 5082, 5082, 5082, 5082, - 5082, 5082, 5082, 5082, 5969, 5970, 5084, 5972, - 5053, 5974, 5053, 5053, 5053, 5978, 5979, 5980, - 5981, 5982, 5983, 5984, 5985, 5986, 5987, 5988, - 5989, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2552, 32767, 32767, 32767, - 32767, 32767, 32767, 5990, 5991, 5992, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 5993, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 6936, 32767, + 32767, 32767, 32767, 32767, 251, 251, 251, 251, + 251, 251, 2763, 2764, 2765, 2766, -4365, -4365, + -4365, -4365, -4365, -4365, 2779, -4365, -4365, -4365, + -4365, -4365, 2790, -4365, -4365, -4365, -4365, -4365, + -4365, -4365, -4365, -4365, -4365, -4365, -4365, -7979, + -4365, -4365, -4365, -4365, -4365, -4365, -4365, -4365, + -4365, -4365, 2826, -4365, -4365, -4365, 285, 2834, + -4365, 286, 2838, -4365, -4365, -4365, -4365, 2847, + -4365, 2850, -4365, -4365, -4365, -4365, -4365, -4365, + -4365, -4365, 2867, 2868, 2869, -4365, -4365, -4365, + -4365, -4365, 5658, -4365, -4365, -4365, -4365, -4365, + -4365, -4365, -997, -4365, -4365, -4365, -4365, -4365, + -4365, -4365, 2910, -4365, -4365, -4365, -4365, -4365, + -4365, 2325, -4365, -4365, 11355, -4365, -4365, -4365, + -4365, -4365, 8902, 8903, 2944, -4365, 8908, 5665, + 5666, 5667, 5668, 5669, 2954, 5672, 538, 5674, + 5675, 5676, 5677, 5678, 5679, 5680, 5681, 5682, + 5683, 2967, 2968, 4055, 4056, 2971, 2972, 0, + 0, 0, 12259, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4616, 4616, 4616, 4616, 4616, 4616, 4616, + 7128, 7129, 7130, 7131, 0, 0, 0, 0, + 0, 0, 7144, 0, 0, 0, 0, 0, + 7155, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3614, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 7191, 0, 0, 0, 4650, 7199, 0, 4651, + 7203, 0, 0, 0, 0, 7212, 0, 7215, + 0, 0, 0, 0, 0, 0, 0, 0, + 7232, 7233, 7234, 0, 0, 0, 0, 0, + 10023, 0, 0, 0, 0, 0, 0, 0, + 3368, 0, 0, 0, 0, 0, 0, 0, + 7275, 0, 0, 0, 0, 0, 0, 6690, + 0, 0, 15720, 0, 0, 0, 0, 0, + 13267, 13268, 7309, 0, 13273, 10030, 10031, 10032, + 10033, 10034, 7319, 10037, 4903, 10039, 10040, 10041, + 10042, 10043, 10044, 10045, 10046, 10047, 10048, 7332, + 7333, 8420, 8421, 7336, 7337, 7338, 7339, 7340, + 0, 7343, 7344, 7345, 7346, 7347, 7348, 7349, + 7350, 7351, 7352, 7353, 7354, 7355, 0, 0, + 0, 0, 11234, 11234, 0, 0, 0, 0, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 1851, 1852, 1853, 1854, - 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, - 1863, 1864, 1200, 2121, 1200, 1868, 1869, 1870, - 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, - 1879, 1880, 1188, 1188, 1188, 1188, 1188, 1188, - 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, - 1188, 1188, 1188, 1188, 1188, 1188, -5282, 1188, - 3483, 1188, -642, 1188, -5287, 1188, -644, 1188, - 1188, -5292, 1188, 1188, 1188, 1188, 1188, 1188, - 1188, 1188, 1188, 1188, 1188, 1188, 1925, 1926, - -6187, -6231, 1184, 3465, 1184, 1184, -6228, 6953, - 6954, 6955, 6956, 0, 1939, 1940, 1941, 1942, - 1943, 1944, 1178, 1178, 1947, 1948, 1949, 1950, - 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, - 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, - 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, - 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, - 1983, 1984, 1985, 1986, 1987, 1988, 1989, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 0, 0, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 775, 32767, + 32767, 776, 32767, 32767, 32767, 32767, 32767, 777, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 32767, 32767, 32767, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 0, 0, 0, 32767, + 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 709, 666, 667, 668, 32767, 669, - 714, 715, 716, 717, -6694, 719, 720, 721, - 32767, 722, 723, 724, 32767, 725, 726, 727, - 728, -5013, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 6052, 0, 0, 6055, - 0, 0, 0, 0, 2293, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 1244, 1245, 1246, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 32767, 32767, 32767, 0, -444, -444, 32767, + -445, -445, -445, -445, -445, -445, -11406,-445, + 9654, -14662,-8512, 0, 4337, 32767, 4338, -1395, + 4340, -1395, -189, -1395, -187, 32767, 32767, 32767, + 32767, -1399, 32767, 32767, 32767, 32767, 32767, 32767, + -1405, 32767, 32767, 32767, -184, -183, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 3035, 3036, + 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, + 3045, 3046, 3047, 0, 0, 0, 0, 0, + 0, 0, 3055, 3056, 3057, 3058, 3059, 3060, + 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, + 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, + 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, + 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, + 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, + 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, + 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, + 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, + 3125, 3126, 3127, 0, 3129, 3130, 3131, 3132, + 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, + 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, + 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, + 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, + 3165, 3166, 3167, 3168, 3169, 3170, 0, 0, + 0, 0, 0, 0, 7985, 0, 15065, 11698, + 15067, 0, -5358, 3021, 0, 0, 0, 0, + 0, 0, 0, 379, 0, 0, 8379, 15070, + 15071, -648, 15073, 15074, 15075, 15076, 15077, 1811, + 1811, 1811, 1811, 1811, 5055, 5055, 5055, 5055, + 5055, 8055, 5055, 10190, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 7772, 7772, + 6686, 6686, 7772, 7772, 10745, 6683, 6683, -1509, + 10751, 10752, 5038, 5171, 5172, 5173, 10754, 10755, + 10756, 10757, 10758, 10759, 5180, 5181, 10714, 0, + 5184, 5185, -1491, 3256, 14217, 24316, 0, 6150, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -1265,13 +1323,6 @@ Decomp_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4660, - -4660, -4660, -4660, 4097, 4098, -4705, -4705, -4660, - -4660, -4660, -4660, 4105, 4106, -4705, 32767, -4661, - -4661, -4661, -4617, -4617, -4663, -4663, -4663, -4663, - -4663, -4663, -4663, 4072, 4073, 4074, 4075, 1644, - 1600, 4078, 4079, 4080, 4081, 17342, 14028, 14029, - 10715, 10716, 7402, 7403, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -1281,25 +1332,15 @@ Decomp_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, - 0, 32767, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 32767, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1380, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 856, 0, 4573, - 4574, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 2713, 2714, 2715, 2716, 2717, + 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, + 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, + 2734, 2735, 2736, 2737, 2738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3048, 3049, 3050, 3051, 3052, 3053, + 3054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1307,393 +1348,376 @@ Decomp_hash_func(const void *key) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 5204, 5161, 5162, 5163, 5164, 5165, 5210, 5211, - 5212, 5213, -2198, 5215, 5216, 5217, 5218, 5219, - 5220, 5221, 5222, 5223, 5224, 5225, 5226, -515, - -515, -515, -515, -515, -515, -515, -515, -515, - -515, -515, -515, -515, -515, -515, -515, 7103, - 7104, 5245, 5246, 5247, 5248, 5249, -1014, 5251, - 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, - 5260, 8663, 8664, -92, -92, 8712, 8713, 8669, - 8670, 8671, 8672, -92, -92, 8720, 8721, 8677, - 8678, 8679, 8636, 8637, 8684, 8685, 8686, 8687, - 8688, 8689, 8690, -44, -44, -44, -44, 2388, - 2433, -44, -44, -44, -44, -13304,-9989, -9989, - -6674, -6674, -3359, -3359, -44, -44, -44, -44, - -44, 8713, 8714, -89, -89, -44, -44, -44, - -44, 8721, 8722, -89, -89, -44, -44, -44, - 0, 0, -46, -46, -46, -46, -46, -46, - -46, 8689, 8690, 8691, 8692, 6261, 6217, 8695, - 8696, 8697, 8698, 21959, 18645, 18646, 15332, 15333, - 12019, 12020, 8706, 8707, 8708, 8709, 8710, -46, - -46, 8758, 8759, 8715, 8716, 8717, 8718, -46, - -46, 8766, 8767, 8723, 8724, 8725, 8726, 8727, - 8728, 8729, 8730, 8731, 8732, 8733, 8734, 0, - 0, 0, 0, 2432, 2477, 0, 0, 0, - 0, -13260,-9945, -9945, -6630, -6630, -3315, -3315, - 0, 0, 0, 0, 0, 8757, 8758, -45, - -45, 0, 0, 0, 0, 8765, 8766, -45, - -45, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8735, 8736, 8737, - 8738, 6307, 6263, 8741, 8742, 8743, 8744, 22005, - 18691, 18692, 15378, 15379, 12065, 12066, 8752, 8753, - 8754, 8755, 8756, 0, 0, 8804, 8805, 8761, - 8762, 8763, 8764, 0, 0, 8812, 8813, 8769, - 6115, 6115, 6115, 6115, 3685, 6115, 6115, 8822, - 6115, 8824, 14782, 8826, 14784, 8828, 5517, 5518, - 5519, -4221, 1782, 7739, 5521, 8836, 5522, 3942, - 8839, 5523, 5524, 5525, 5526, 5527, 5528, 5529, - 6127, 5531, 5532, 8850, 5533, 8852, 5534, 8854, - 8855, 5535, 0, 0, 0, 8860, 8861, 0, - 0, 0, 13252, 9939, 9939, 6626, 6626, 3313, - 3313, 0, 0, 0, -9269, -3312, 0, 0, - 0, 9741, 32767, 32767, 0, 32767, 0, 32767, - 32767, 0, 0, 0, 0, 0, 0, 0, - -597, 0, 0, 32767, 0, 32767, 0, 32767, - 32767, 0, 0, 32767, 32767, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3171, 3172, 3173, + 3174, 3175, 3176, -4808, 3178, -11886,-8518, -11886, + 3182, 8541, 163, 3185, 3186, 3187, 3188, 3189, + 3190, 3191, 2813, 3193, 3194, -5184, -11874,-11874, + 3846, -11874,-11874,-11874,-11874,-11874,1393, 1394, + 1395, 1396, 1397, -1846, -1845, -1844, -1843, -1842, + -4841, -1840, -6974, -1838, -1837, -1836, -1835, -1834, + -1833, -1832, -1831, -1830, -1829, -4545, -4544, -3457, + -3456, -4541, -4540, -7512, -3449, -3448, 4745, -7514, + -7514, -1799, -1931, -1931, -1931, -7511, -7511, -7511, + -7511, -7511, -7511, -1931, -1931, -7463, 3252, -1931, + -1931, 4746, 0, -10960,-21058,3259, -2890, 3261, + 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, + 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, + 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, + 3286, 3287, 3288, 3289, 3290, 32767, 3291, 3292, + 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, + 3301, 3302, 3303, 3304, 32767, 32767, 3305, 32767, + 3306, 32767, 32767, 3307, 3308, 3309, 3310, 3311, + 3312, 3313, 3314, 3315, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32767, 32767, + 3321, 3322, 3323, -6454, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32767, 32767, 0, 0, 0, 0, + 0, 3362, 3363, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3376, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3387, 0, 0, 0, 0, 0, + 0, 0, 0, 3394, 0, 0, 0, 3398, + 3399, 3400, 3401, 3402, 0, 0, 0, 3406, + 0, 3408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3430, + 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, + 3439, 7163, 2045, 2046, 3443, 3444, 3445, 3446, + 13283, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 825, 3456, 3457, 3458, 826, 3460, -1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -1773, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, -4161, 1581, 1582, 32767, 32767, 1990, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 3499, 0, 0, 0, 0, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 3502, 3503, 3504, 3505, 3506, 32767, + 32767, 32767, 32767, 32767, 3507, 3508, 985, 2026, + 2027, 3512, 3513, 3514, 3515, 3516, 3517, 3518, + 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, + 3527, 3528, 3529, 3530, 3531, 3532, 32767, 3533, + 3534, 3535, 3536, 3537, 32767, 3538, 32767, 3539, + 3540, 32767, 3541, 3542, 32767, 3543, 3544, 3545, + 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, + 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, + 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, + 3570, 3571, -321, 3573, 3574, 3575, 3576, 3577, + 3578, 3579, 3580, 3581, -6890, 3583, 3584, 3585, + 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, + 3594, 3595, 3596, 9557, 3598, 3599, 3600, 6317, + 6318, 6319, 6320, 6321, 3606, 6324, 1190, 6326, + 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, + 6335, 3619, 3620, 4707, 4708, 3623, 3624, 3625, + 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, + 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, + 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, + 3650, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 3651, 3652, 3653, 3654, 3655, 3656, + 3657, 3658, 3659, 15838, 10104, 3662, 10104, 10104, + 3028, 10105, 10105, 10105, 3669, 3670, 3671, 3672, + 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, + 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, + 3689, 3690, 3691, 3692, 3693, 3694, 3695, 32767, + 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, + 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, + 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, + 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, + 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, + 3736, 3737, 3738, 3739, 3740, 3741, -3350, -2729, + -2729, -2729, 2591, 2591, 2591, 2591, 20382, 2591, + 8325, 2591, -3851, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 200, 7116, 7116, 8332, 7116, 8334, + 3838, 8336, 7116, 2591, 2591, 7114, 7114, 7114, + 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, + 3540, -7421, 3540, 13639, -10677,-4527, 3985, 8322, + -9468, 8324, 2591, 8326, 2591, 3797, 2591, 3799, + 2591, 3801, 2591, 3803, 2591, 3805, 3806, 2591, + 3808, 2591, 7088, 2591, 3812, 7089, 3814, 3815, + 3816, 3817, 7392, 7393, 7394, 7395, 2591, 3823, + 2591, 2591, 3826, 2591, 2591, 3829, 2591, 2591, + 6902, 3833, 3834, 3835, 3836, 3837, 3838, 3839, + 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, + 3848, 3849, 3850, 3851, 3852, 8350, 2591, 3855, + 3856, 3857, 3858, 2591, 2591, 2591, 2591, 3863, + 2591, 2591, 3866, 3867, 4050, 8357, 3870, 2591, + 2591, 8358, 4048, 3875, 4048, 4048, 2591, 4048, + 2591, 4048, 2591, -4486, 2591, -4485, -4484, 2591, + 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2591, 2591, 2591, 3901, 3902, 3903, + 3904, 2595, 2595, 2595, 2595, 2595, 2595, 2595, + 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, + 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, + 2595, 2595, 2595, 2595, 3932, 2595, 2595, 2595, + 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, + 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, + 32767, 3952, 3953, 3954, 3955, 3956, -5352, -5352, + -5352, -5352, -5352, -5352, 3963, 3964, 3965, -5354, + -5354, -5354, -5354, 3970, 3971, 3972, 3973, 3974, + 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, + 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, + 2029, 2030, 3993, 3994, 3995, 3996, 3997, 3998, + 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, + 4007, 4008, 4009, 4010, 4011, 4012, 4013, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 4014, 4015, 4016, 4017, 4018, 4019, 4020, + 4021, 4022, -579, 17213, 4025, 4026, 4027, 4028, + 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, + 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, + 4045, 4046, 4047, 4048, -1271, -1270, -1269, -1268, + -19058,-1266, -6999, 4056, 4057, 4058, 4059, 4060, + 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, + 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, + 4077, 32767, 32767, 4078, 4079, 4080, 4081, 4082, + 4083, -2163, -2162, 8800, -2160, 2033, 4089, 4090, + 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, + 4099, 4100, 4101, 4102, 4103, 4104, 4105, 4106, + 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, + 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, + 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, + 4131, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 4132, 4133, 4134, 4135, 4136, 4137, 4138, + 4139, 4140, 4141, 4142, 4143, 4144, 32767, 32767, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 4145, 4146, 4147, 4148, 4149, 4150, + 4151, 4152, 4153, 4154, 2034, 32767, 32767, 32767, + 32767, 32767, 4155, 4156, 4157, 4158, 4159, 4160, + 4161, 4162, 4163, 4164, 1284, 4166, 4167, 4168, + 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, + 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, + 4185, 4186, 4187, 4188, 4189, 4190, 4191, 32767, + 32767, 4192, 4193, 4194, 4195, 4196, 4197, 4198, + 4199, 4200, 4201, 4202, 4203, 32767, 4204, 4205, + 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, + 827, 4215, 4216, 4217, 4218, 4219, 4220, 4221, + 4222, 32767, 4223, 4224, 4225, 828, 32767, 32767, + 32767, 32767, 4227, 4228, 4229, 32767, 4230, 32767, + 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, + 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, + 4247, 4248, 4249, 4250, 4251, 822, 822, 822, + 822, 822, 822, 822, 822, 822, 822, -2901, + 2218, 2218, 822, 822, 822, 822, -9014, 822, + 822, 822, 822, 822, 822, 822, 3452, 822, + 822, 822, 3455, 822, 5284, 4284, 4285, 4286, + 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, + 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, + 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, + 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, + 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, + 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, + 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, + 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, + 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, + 4359, 861, 4361, 4362, 4363, 4364, 4365, 32767, + 32767, 32767, 32767, 32767, 4366, 4367, 4368, 4369, + 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, + 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, + 4386, 4387, 4388, 4389, 4390, 4391, 0, 0, + 0, 4395, 4396, 4397, 4398, 4399, 4400, 4401, + 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, + 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, + 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, + 4426, -4247, 4428, 4429, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 2068, 2396, 4441, + 4442, 4443, 4444, 2405, 2406, 653, 654, 4449, + 4450, 8856, 4452, 4453, 4454, 4455, 4456, 4457, + 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, + 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, + 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, + 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, + 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, + 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, + 4522, 2069, 4524, 4525, 4526, 4527, 4528, 4529, + 4530, 4531, 4532, 4533, 4534, 4535, 4536, -2729, + -2728, -2727, -2726, -2725, -2724, -2723, -2722, -2721, + -2720, -2719, -2718, -2717, -2716, -2715, -2714, -2713, + -2712, -2711, -2710, -2709, -2708, -2707, -2706, -2705, + -2704, -2703, -2702, -2701, -2700, -2699, -2698, -2697, + -2696, -2695, -2694, 2106, 2107, 2108, 2109, 2110, + 2111, 2112, 2113, 2114, 2115, 4574, 4575, 4576, + 2119, 2120, 2121, -527, -527, -527, -527, 7458, + -527, 14538, 2129, 14539, -528, -5886, 2493, -528, + -528, -528, 2137, 2138, 2139, 2140, 2141, 0, + 0, 0, 0, 2146, 2147, 2148, 2149, 2150, + 2151, 2152, 2153, -2153, -2153, 2156, -2152, -2152, + 2159, 2333, 2161, 2162, 3620, 2164, 3622, 2166, + 3624, 2168, 3627, 10704, 10704, 2172, 2173, 2174, + 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, + 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, + 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, + 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, + 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, + 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, + 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, + 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, + 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, + 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, + 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, + 2263, 5508, 5509, 2266, 2267, 2268, 2269, 2270, + -729, 2272, -2862, 2274, 2275, 2276, 2277, 2278, + 2279, 2280, 2281, 2282, 2283, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 2284, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 2285, 2286, -15504,2288, -3445, 2290, + 32767, 32767, 32767, 32767, 32767, 32767, 2291, 32767, + 4683, -2232, -2231, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1346, 0, 1347, 0, + 1348, 0, 15566, 0, 905, 0, 14359, 32767, + 2301, 32767, 2302, 32767, 2303, 32767, 2304, 32767, + 2305, 32767, 2306, 32767, 32767, 2307, 32767, 2308, + 32767, 2309, 32767, 32767, 32767, 32767, 32767, 32767, + -2491, -2491, 32767, -2492, 2313, 32767, 2314, 2315, + 32767, 2316, 2317, 32767, 2318, 2319, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 2320, 32767, 32767, 32767, + 32767, 2321, 2322, 2323, 2324, 32767, 2325, 2326, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 2327, 32767, 2328, 32767, + 2329, 32767, 2330, 32767, 9406, 32767, 2332, 32767, + 2333, 32767, 2334, 32767, 2335, 32767, 2336, 32767, + 2337, 32767, 2338, 32767, 32767, 2339, 32767, 2340, + 32767, 2341, 32767, 32767, 32767, 32767, 32767, 32767, + 2342, 2343, 32767, 2344, 2345, 32767, 2346, 2347, + 32767, 2348, 2349, 32767, 2350, 2351, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 2352, 32767, 32767, 2353, + 2354, 2355, 2356, 32767, 32767, 32767, 2357, 2358, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 1539, 32767, 32767, 6150, 6151, 6152, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 8029, - 8030, 6171, 6172, 969, 969, 1013, 1013, 1013, - 1013, 1013, 969, 969, 969, 969, 8381, 969, - 969, 969, 969, 969, 969, 969, 969, 969, - 969, 969, 969, 6711, 6712, 6713, 6714, 6715, - 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, - 6724, 6725, 6726, -891, -891, 969, 969, 6173, - 6174, 6131, 6132, 6133, 6134, 6135, 6180, 6181, - 6182, 6183, -1228, 6185, 6186, 6187, 6188, 6189, - 6190, 6191, 6192, 6193, 6194, 6195, 6196, 455, - 455, 455, 455, 455, 455, 455, 455, 455, - 455, 455, 455, 455, 455, 455, 455, 8073, - 8074, 6215, 6216, 1013, 1013, 1057, 1057, 1057, - 1057, 1057, 1013, 1013, 1013, 1013, 8425, 1013, - 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, - 1013, 1013, 1013, 6755, 6756, 6757, 6758, 6759, - 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, - 6768, 6769, 6770, -847, -847, 1013, 1013, 6217, - 6218, 6175, 6176, 6177, 6178, 6179, 6224, 6225, - 6226, 6227, -1184, 6229, 6230, 6231, 6232, 6233, - 6234, 6235, 6236, 6237, 6238, 6239, 6240, 499, - 499, 499, 499, 499, 499, 499, 499, 499, - 499, 499, 499, 499, 499, 499, 499, 8117, - 8118, 6259, 6260, 6261, 6262, 6263, 0, 6265, - 6266, 6267, 6268, 6269, 6270, 6271, 6272, 6273, - 6274, 9677, 9678, 922, 922, 9726, 9727, 9683, - 9684, 9685, 9686, 922, 922, 9734, 9735, 9691, - 9692, 9693, 9650, 9651, 9698, 9699, 9700, 9701, - 9702, 9703, 9704, 970, 970, 970, 970, 3402, - 3447, 970, 970, 970, 970, -12290,-8975, -8975, - -5660, -5660, -2345, -2345, -2345, -2345, -2345, 6412, - 6413, -2390, -2390, -2345, -2345, -2345, -2345, 6420, - 6421, -2390, -2390, -2345, -2345, -2345, -2301, -2301, - -2347, -2347, -2347, -2347, -2347, -2347, -2347, 6388, - 6389, 6390, 6391, 3960, 3916, 6394, 6395, 6396, - 6397, 19658, 16344, 16345, 13031, 13032, 9718, 9719, - 6405, 6406, 6407, 6408, 6409, -2347, -2347, 6457, - 6458, 6414, 6415, 6416, 6417, -2347, -2347, 6465, - 6466, 6422, 6423, 6424, 6381, 6382, 6429, 6430, - 6431, 6432, 6433, 6434, 6435, -2299, -2299, -2299, - -2299, 133, 178, -2299, -2299, -2299, -2299, -15559, - -12244,-12244,-8929, -8929, -5614, -5614, -2299, -2299, - -2299, -2299, -2299, 6458, 6459, -2344, -2344, -2299, - -2299, -2299, -2299, 6466, 6467, -2344, -2344, -2299, - -2299, -2299, -2299, -2299, -2299, -2299, -2299, -2299, - -2299, -2299, -2299, 6436, 6437, 6438, 6439, 4008, - 3964, 6442, 6443, 6444, 6445, 19706, 16392, 16393, - 13079, 13080, 9766, 9767, 6453, 6454, 6455, 6456, - 6457, -2299, -2299, 6505, 6506, 6462, 6463, 6464, - 6465, -2299, -2299, 6513, 6514, 6470, 6471, 6472, - 6473, 6474, 6475, 6476, 6477, 6478, 6479, 6480, - 6481, -2253, -2253, -2253, -2253, 179, 224, -2253, - -2253, -2253, -2253, -15513,-12198,-12198,-8883, -8883, - -5568, -5568, -2253, -2253, -2253, -2253, -2253, 6504, - 6505, -2298, -2298, -2253, -2253, -2253, -2253, 6512, - 6513, -2298, -2298, -2253, 402, 403, 404, 405, - 2836, 407, 408, -2298, 410, -2298, -8255, -2298, - -8255, -2298, 1014, 1014, 1014, 10755, 4753, -1203, - 1016, -2298, 1017, 2598, -2298, 1019, 1019, 1019, - 1019, 1019, 1019, 1019, 422, 1019, 1019, -2298, - 1020, -2298, 1021, -2298, -2298, 1023, 6559, 6560, - 6561, -2298, -2298, 6564, 6565, 6566, -6685, -3371, - -3370, -56, -55, 3259, 3260, 3261, 12531, 6575, - 3264, 3265, 3266, -6474, -471, 5486, 3268, 6583, - 3269, 1689, 6586, 3270, 3271, 3272, 3273, 3274, - 3275, 3276, 3874, 3278, 3279, 6597, 3280, 6599, - 3281, 6601, 6602, 3282, 3283, 32767, 32767, 32767, - 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, - 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, - 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, - 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, - 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, - 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, - 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, - 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, - 3348, 3349, 3350, 3351, 32767, 32767, 3352, 3353, - 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, - 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, - 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, - 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, - 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, - 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, - 3402, 3403, 3404, 3405, 3406, 3407, 4795, 3409, - 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, - 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, - 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, - 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, - 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, - 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3458, - 3459, 3460, 3461, 3462, -8139, 3464, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 3465, 3466, 2001, 3468, 3469, 32767, - 32767, 32767, 32767, 32767, 3470, 3471, 3472, 3473, - 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, - 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, - 3490, 3491, 3492, 3493, 3494, 3495, 32767, 3496, - 3497, 3498, 3499, 3500, 32767, 3501, 32767, 3502, - 3503, 32767, 3504, 3505, 32767, 3506, 0, 0, - 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, - 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, - 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, - 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, - 3541, 3542, 3543, 3544, 3545, 1902, 1902, 1902, - 1902, 9314, 1902, 1902, 1902, 1902, 1902, 1902, - 1902, 1902, 1902, 1902, 1902, 1902, 7644, 7645, - 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, - 7654, 7655, 7656, 7657, 7658, 7659, 42, 42, - 1902, 0, 0, 0, 7067, 7068, 7069, 7070, - 7071, 7116, 7117, 7118, 7119, -292, 7121, 7122, - 7123, 7124, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3614, 3615, 3616, 10892, 3618, 3619, - 10854, 3621, 3622, 3623, 3624, 3625, 8994, -2751, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3640, 3641, 2783, -3331, - -3330, 3645, 3646, 0, 6053, 6054, 0, 6056, - 6057, 6058, 6059, 3767, 6061, 6858, 0, 0, - 3659, 0, 0, 1531, 1531, 1531, 1531, 1531, - 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, - 1531, 1531, 9149, 9150, 7291, 7292, 7293, 7294, - 7295, 1032, 7297, 7298, 7299, 7300, 7301, 7302, - 7303, 7304, 0, 7307, 10710, 10711, 1955, 1955, - 10759, 10760, 10716, 4548, 4549, 4550, 1952, 1952, - 10764, 10765, 10721, 10722, 3711, 6314, 10679, 10726, - 10727, 10728, 10729, 10730, 3719, 3720, 1996, 1996, - 1996, 1996, 4428, 4473, 4473, 3728, 1994, 1994, - -11266,3732, 3733, 3734, 0, 0, 0, 0, - 0, 0, 0, 3742, 10755, 10756, 1953, 1953, - 1998, 1998, 1998, 11730, 11731, 12711, 9397, 3867, - 11735, 3869, 6139, 9874, 9875, 9876, 9877, 9878, - 9879, 9880, 6139, -873, -873, 7931, -1839, -1839, - 7891, 7892, -1839, -1839, -2818, 497, 6028, -1839, - -1839, -66, -66, -66, -66, 2522, 2523, -6280, - -6280, -6235, -66, -66, -66, 2533, 2534, -6277, - -66, -6231, -6231, 781, -1821, -6185, -6231, 3867, - -1821, -6231, -1821, 782, 3076, 3873, 2511, -8720, - 84, 85, 41, 42, 43, -9688, -9688, -10667, - -7352, -1821, -9688, -1821, -4090, -7824, -7824, -7824, - -7824, -7824, -7824, -7824, -4082, 2931, 2932, -5871, - 3900, 3901, -5828, -5828, 3904, 3905, 4885, 1571, - -3959, 3909, 3910, 2138, 2139, 2140, 2141, -446, - -446, 8358, 8359, 8315, 2147, 2148, 2149, -449, - -449, 8363, 2153, 8319, 8320, 1309, 3912, 8277, - 8324, -1773, 3916, 8327, 3918, 1316, -977, -1773, - -410, 10822, 2019, 2019, 2064, 2064, 2064, 11796, - 11797, 12777, 9463, 3933, 11801, 3935, 6205, 9940, - 9941, 9942, 9943, 9944, 9945, 9946, 6205, -807, - -807, 7997, -1773, -1773, 7957, 7958, -1773, -1773, - -2752, 563, 6094, -1773, -1773, 0, 0, 0, - 0, 2588, 2589, -6214, -6214, -6169, 0, 0, - 0, 2599, 2600, -6211, 0, -6165, -6165, 847, - -1755, -6119, -6165, 3933, -1755, -6165, -1755, 848, - 3142, 3939, 2577, -8654, 150, 151, 107, 108, - 109, -9622, -9622, -10601,-7286, -1755, -9622, -1755, - -4024, -7758, -7758, -7758, -7758, -7758, -7758, -7758, - -4016, 2997, 2998, -5805, 3966, 3967, -5762, -5762, - 3970, 3971, 4951, 1637, -3893, 3975, 3976, 2204, - 2205, 2206, 2207, -380, -380, 8424, 8425, 8381, - 2213, 2214, 2215, -383, -383, 8429, 2219, 8385, - 8386, 1375, 3978, 8343, 8390, -1707, 3982, 8393, - 3984, 1382, -911, -1707, -344, 10888, 2085, 2085, - 2130, 2130, 2130, 11862, 11863, 12843, 9529, 3999, - 11867, 4001, 6271, 10006, 10007, 4005, -1951, 4007, - 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, - 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, - 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, - 11943, 4033, 4034, 4035, 4036, 8637, 4038, 4039, - -116, 32767, 32767, 4041, 4042, 4043, 4044, 4045, - 2250, 4047, 4048, 4049, 5802, 4051, 4052, 4559, - 6119, 4055, 4056, 4057, 4058, 4059, 4060, 4061, - -47, 4063, -46, 4065, 4066, 4067, 4068, 4069, - -41, -13301,4072, -9985, -6670, 4075, 4076, 4077, - 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, - 4086, 4087, 4088, 4089, 4090, 8741, 4092, 4093, - -67, 32767, 32767, 32767, 32767, 32767, 2257, 32767, - 2258, 2259, 2260, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2261, 32767, 2262, 32767, - 2263, 32767, 2264, 32767, 2265, 32767, 2266, 32767, - 2267, 8737, 8738, -26, -26, 8786, 4100, 4101, - 8746, 8747, 4104, 4105, 8752, 8753, 32767, 2274, - 32767, 2275, 32767, 32767, 32767, 32767, 32767, 32767, - 2276, 2277, 32767, 2278, 2279, 32767, 2280, 0, - 32767, 2282, 9695, 4109, -3486, -3486, 4112, 4113, - 4114, 4115, 4116, 4117, 32767, 32767, 32767, 32767, - 32767, 32767, 4118, 4119, 4120, 4121, 4122, 4123, - 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, - 4132, 4133, 4134, 4849, 4136, 4137, 4851, 4851, - 4140, 4852, 4142, 4143, 4144, 4145, 4146, 4147, - 4148, 4149, 4150, 4151, 2293, 4153, 907, 32767, - 2295, 4155, 909, 4157, 910, 4159, 911, 4161, - 912, 4163, 913, 4165, 914, 32767, 915, 4168, - 916, 4170, 917, 4172, 4173, 918, 4175, 4176, - 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, - 4185, 2309, 4186, 4187, 4188, 4189, 2312, 2313, - 32767, 2314, 4190, 4191, -2632, 2317, 4193, 32767, - 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, - 4202, 4203, 4204, 4205, 4206, 0, 0, 4209, - 4210, 4211, 4212, 4213, 2318, 4215, 4216, 2319, - 2320, 2321, 2322, 4221, 4222, 4223, 2323, 2324, - 4226, 4227, 4228, 4229, 4230, 4231, 5551, 4233, - 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, - 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, - 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, - 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, - 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, - 4274, 4275, -3342, -3342, -3342, 4276, 4277, 2418, - 2419, -2784, -2784, -2740, -2740, -2740, -2740, -2740, - -2784, -2784, -2784, -2784, 4628, -2784, -2784, -2784, - -2784, -2784, -2784, -2784, -2784, -2784, -2784, -2784, - -2784, 2958, 2959, 2960, 2961, 2962, 2963, 2964, - 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, - 2973, -4644, -4644, -2784, -2784, 2420, 2421, 2378, - 2379, 2380, 2381, 2382, 2427, 2428, 2429, 2430, - -4981, 2432, 2433, 2434, 2435, 2436, 2437, 2438, - 2439, 2440, 2441, 2442, 2443, -3298, -3298, -3298, - -3298, -3298, -3298, -3298, -3298, -3298, -3298, -3298, - -3298, -3298, -3298, -3298, -3298, 4320, 4321, 2462, - 4365, 4366, 4367, -2699, -2699, -2699, -2699, -2699, - -2743, -2743, -2743, -2743, 4669, -2743, -2743, -2743, - -2743, 4382, 4383, 4384, 4385, 4386, 4387, 4388, - 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, - 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, - 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, - 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, - 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, - 4429, 816, 816, 816, -6459, 816, 816, -6418, - 816, 816, 816, 816, 816, -4552, 7194, 4444, - 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, - 4453, 4454, 4455, 816, 816, 1675, 7790, 7790, - 816, 816, 4463, -1589, -1589, 4466, -1589, -1589, - -1589, -1589, 704, -1589, -2385, 4474, 4475, 817, - 4477, 4478, 2948, 2949, 2950, 2951, 2952, 2953, - 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, - 2962, -4655, -4655, -2795, -2795, -2795, -2795, -2795, - 3469, -2795, -2795, -2795, -2795, -2795, -2795, -2795, - -2795, 4510, -2796, -6198, -6198, 2559, 2560, -6243, - -6243, -6198, -6198, -6198, -6198, 2567, 2568, -6243, - -6243, -6198, -6198, -6198, -6154, -6154, -6200, -6200, - -6200, -6200, -6200, -6200, -6200, 2535, 2536, 2537, - 2538, 107, 63, 2541, 2542, 2543, 2544, 15805, - 12491, 12492, 32767, 4540, 4541, 4542, 4543, 4544, - 4545, 4546, 2548, -6208, -6208, 2596, 2597, 2553, - 2554, 2555, 2556, -6208, -6208, 2604, 2605, 2561, - 2562, 2563, 2520, 2521, 2568, 2569, 2570, 2571, - 2572, 2573, 2574, -6160, -6160, -6160, -6160, -3728, - -3683, -6160, -6160, -6160, -6160, -19420,-16105,-16105, - -12790,-12790,-9475, -9475, -6160, -6160, -6160, -6160, - -6160, 32767, 2597, -6206, -6206, -6161, -6161, -6161, - -6161, 2604, 2605, -6206, -6206, -6161, -6161, -6161, - -6161, -6161, -6161, -6161, -6161, -6161, -6161, -6161, - -6161, 2574, 2575, 2576, 2577, 146, 102, 2580, - 2581, 2582, 2583, 15844, 12530, 12531, 9217, 9218, - 5904, 5905, 2591, 2592, 2593, 2594, 2595, -6161, - -6161, 2643, 2644, 2600, 2601, 2602, 2603, -6161, - -6161, 2651, 2652, 2608, 2609, 2610, 2611, 2612, - 2613, 2614, 2615, 2616, 2617, 2618, 2619, -6115, - -6115, -6115, -6115, -3683, -3638, -6115, -6115, -6115, - -6115, -19375,-16060,-16060,-12745,-12745,-9430, -9430, - -6115, -6115, -6115, -6115, -6115, 2642, 2643, -6160, - -6160, -6115, -6115, -6115, -6115, 2650, 2651, -6160, - -6160, -6115, -3460, -3459, -3458, -3457, -1026, -3455, - -3454, -6160, -3452, -6160, -12117,-6160, -12117,-6160, - -2848, -2848, -2848, 6893, 891, -5065, -2846, -6160, - -2845, -1264, 0, 9264, 5950, 5951, 2637, 2638, - 2639, 2640, 2641, -6115, -6115, 2689, 2690, 2646, - 2647, 2648, 2649, -6115, -6115, 2697, 2698, 2654, - 0, 0, 0, 0, -2430, 0, 0, 2707, - 0, 2709, 8667, 2711, 8669, 2713, -598, -597, - -596, -10336,-4333, 1624, -594, 2721, -593, -2173, - 2724, -592, -591, -590, -589, -588, -587, -586, - 12, -584, -583, 2735, -582, 2737, -581, 2739, - 2740, -580, -6115, -6115, -6115, 2745, 2746, -6115, - -6115, 0, 0, 0, 2752, 2753, 2754, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6247, 6248, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, + 4776, 15738, 4778, -5320, 0, 0, 0, 0, + 17791, 0, 5734, 0, -6442, 0, 0, 0, + 0, 0, 0, 0, -2391, 4525, 4525, 5741, + 4525, 5743, 1247, 5745, 4525, 0, 0, 4523, + 4523, 4523, 949, 949, 949, 949, 949, 949, + 949, 949, 949, -10012,949, 11048, -13268,-7118, + 1394, 5731, -12059,5733, 0, 5735, 0, 1206, + 0, 1208, 0, 1210, 0, 1212, 0, 1214, + 1215, 0, 1217, 0, 4497, 0, 1221, 4498, + 1223, 1224, 1225, 1226, 4801, 4802, 4803, 4804, + 0, 1232, 0, 0, 1235, 0, 0, 1238, + 0, 0, 4311, 1242, 1243, 1244, 1245, 1246, + 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, + 1255, 1256, 1257, 1258, 1259, 1260, 1261, 5759, + 0, 1264, 1265, 1266, 1267, 0, 0, 0, + 0, 1272, 0, 0, 1275, 1276, 1459, 5766, + 1279, 0, 0, 5767, 1457, 1284, 1457, 1457, + 0, 1457, 0, 1457, 0, -7077, 0, -7076, + -7075, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32767, + 32767, 0, 32767, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1337, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2478, 2479, 2480, + 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, + 2489, 2490, 2491, 2492, 2493, 3495, 3496, 3497, + 3498, 0, 3500, 3501, 2500, 2501, 2502, 2503, + 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, + 0, 0, 0, 0, 0, 2517, 2518, 2519, + 2520, 2521, 0, 0, 2524, 1484, 1484, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2540, 0, 0, 0, + 0, 0, 2546, 0, 2548, 0, 0, 2551, + 0, 0, 2554, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3893, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10472, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5960, 0, 0, 0, -2716, -2716, -2716, + -2716, -2716, 0, -2717, 2418, -2717, -2717, -2717, + -2717, -2717, -2717, -2717, -2717, -2717, -2717, 0, + 0, -1086, -1086, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2662, + 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, + 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, + 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, + 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12178,-6443, 0, -6441, -6440, 637, -6439, + -6438, -6437, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2739, 2740, 2741, + 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, + 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, + 2758, 2759, -288, -288, -288, -288, -288, -288, + -288, 2767, 2768, 2769, 2770, 2771, 2772, 2773, + 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, + 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, + 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, + 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, + 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, + 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, + 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, + 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, + 2838, 2839, -288, 2841, 2842, 2843, 2844, 2845, + 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, + 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, + 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, + 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, + 2878, 2879, 2880, 2881, 2882, -288, -288, -288, + -288, -288, -288, 7697, -288, 14777, 11410, 14779, + -288, -5646, 2733, -288, -288, -288, -288, -288, + -288, -288, 91, -288, -288, 8091, 14782, 14783, + -936, 14785, 14786, 14787, 14788, 14789, 1523, 1523, + 1523, 1523, 1523, 4767, 4767, 4767, 4767, 4767, + 7767, 4767, 9902, 4767, 4767, 4767, 4767, 4767, + 4767, 4767, 4767, 4767, 4767, 7484, 7484, 6398, + 6398, 7484, 7484, 10457, 6395, 6395, -1797, 10463, + 10464, 4750, 4883, 4884, 4885, 10466, 10467, 10468, + 10469, 10470, 10471, 4892, 4893, 10426, -288, 4896, + 4897, -1779, 2968, 4899, 4900, 4901, 4902, 4903, + 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, + 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, + 4920, 4921, 0, 0, 4924, 4925, 4926, 4927, + 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, + 4936, 4937, 4938, 4939, 4940, 4941, 4942 }; const unsigned char *k = (const unsigned char *) key; @@ -1708,7 +1732,7 @@ Decomp_hash_func(const void *key) a = a * 257 + c; b = b * 8191 + c; } - return h[a % 13209] + h[b % 13209]; + return h[a % 13407] + h[b % 13407]; } /* Hash lookup information for decomposition */ @@ -1716,15 +1740,15 @@ static const pg_unicode_decompinfo UnicodeDecompInfo = { UnicodeDecompMain, Decomp_hash_func, - 6604 + 6703 }; /* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */ static const uint16 RecompInverseLookup[941] = { - /* U+003C+0338 -> U+226E */ 1823, - /* U+003D+0338 -> U+2260 */ 1820, - /* U+003E+0338 -> U+226F */ 1824, + /* U+003C+0338 -> U+226E */ 1857, + /* U+003D+0338 -> U+2260 */ 1854, + /* U+003E+0338 -> U+226F */ 1858, /* U+0041+0300 -> U+00C0 */ 14, /* U+0041+0301 -> U+00C1 */ 15, /* U+0041+0302 -> U+00C2 */ 16, @@ -1733,60 +1757,60 @@ static const uint16 RecompInverseLookup[941] = /* U+0041+0306 -> U+0102 */ 69, /* U+0041+0307 -> U+0226 */ 270, /* U+0041+0308 -> U+00C4 */ 18, - /* U+0041+0309 -> U+1EA2 */ 1278, + /* U+0041+0309 -> U+1EA2 */ 1312, /* U+0041+030A -> U+00C5 */ 19, /* U+0041+030C -> U+01CD */ 194, /* U+0041+030F -> U+0200 */ 240, /* U+0041+0311 -> U+0202 */ 242, - /* U+0041+0323 -> U+1EA0 */ 1276, - /* U+0041+0325 -> U+1E00 */ 1120, + /* U+0041+0323 -> U+1EA0 */ 1310, + /* U+0041+0325 -> U+1E00 */ 1154, /* U+0041+0328 -> U+0104 */ 71, - /* U+0042+0307 -> U+1E02 */ 1122, - /* U+0042+0323 -> U+1E04 */ 1124, - /* U+0042+0331 -> U+1E06 */ 1126, + /* U+0042+0307 -> U+1E02 */ 1156, + /* U+0042+0323 -> U+1E04 */ 1158, + /* U+0042+0331 -> U+1E06 */ 1160, /* U+0043+0301 -> U+0106 */ 73, /* U+0043+0302 -> U+0108 */ 75, /* U+0043+0307 -> U+010A */ 77, /* U+0043+030C -> U+010C */ 79, /* U+0043+0327 -> U+00C7 */ 20, - /* U+0044+0307 -> U+1E0A */ 1130, + /* U+0044+0307 -> U+1E0A */ 1164, /* U+0044+030C -> U+010E */ 81, - /* U+0044+0323 -> U+1E0C */ 1132, - /* U+0044+0327 -> U+1E10 */ 1136, - /* U+0044+032D -> U+1E12 */ 1138, - /* U+0044+0331 -> U+1E0E */ 1134, + /* U+0044+0323 -> U+1E0C */ 1166, + /* U+0044+0327 -> U+1E10 */ 1170, + /* U+0044+032D -> U+1E12 */ 1172, + /* U+0044+0331 -> U+1E0E */ 1168, /* U+0045+0300 -> U+00C8 */ 21, /* U+0045+0301 -> U+00C9 */ 22, /* U+0045+0302 -> U+00CA */ 23, - /* U+0045+0303 -> U+1EBC */ 1304, + /* U+0045+0303 -> U+1EBC */ 1338, /* U+0045+0304 -> U+0112 */ 83, /* U+0045+0306 -> U+0114 */ 85, /* U+0045+0307 -> U+0116 */ 87, /* U+0045+0308 -> U+00CB */ 24, - /* U+0045+0309 -> U+1EBA */ 1302, + /* U+0045+0309 -> U+1EBA */ 1336, /* U+0045+030C -> U+011A */ 91, /* U+0045+030F -> U+0204 */ 244, /* U+0045+0311 -> U+0206 */ 246, - /* U+0045+0323 -> U+1EB8 */ 1300, + /* U+0045+0323 -> U+1EB8 */ 1334, /* U+0045+0327 -> U+0228 */ 272, /* U+0045+0328 -> U+0118 */ 89, - /* U+0045+032D -> U+1E18 */ 1144, - /* U+0045+0330 -> U+1E1A */ 1146, - /* U+0046+0307 -> U+1E1E */ 1150, + /* U+0045+032D -> U+1E18 */ 1178, + /* U+0045+0330 -> U+1E1A */ 1180, + /* U+0046+0307 -> U+1E1E */ 1184, /* U+0047+0301 -> U+01F4 */ 230, /* U+0047+0302 -> U+011C */ 93, - /* U+0047+0304 -> U+1E20 */ 1152, + /* U+0047+0304 -> U+1E20 */ 1186, /* U+0047+0306 -> U+011E */ 95, /* U+0047+0307 -> U+0120 */ 97, /* U+0047+030C -> U+01E6 */ 216, /* U+0047+0327 -> U+0122 */ 99, /* U+0048+0302 -> U+0124 */ 101, - /* U+0048+0307 -> U+1E22 */ 1154, - /* U+0048+0308 -> U+1E26 */ 1158, + /* U+0048+0307 -> U+1E22 */ 1188, + /* U+0048+0308 -> U+1E26 */ 1192, /* U+0048+030C -> U+021E */ 268, - /* U+0048+0323 -> U+1E24 */ 1156, - /* U+0048+0327 -> U+1E28 */ 1160, - /* U+0048+032E -> U+1E2A */ 1162, + /* U+0048+0323 -> U+1E24 */ 1190, + /* U+0048+0327 -> U+1E28 */ 1194, + /* U+0048+032E -> U+1E2A */ 1196, /* U+0049+0300 -> U+00CC */ 25, /* U+0049+0301 -> U+00CD */ 26, /* U+0049+0302 -> U+00CE */ 27, @@ -1795,37 +1819,37 @@ static const uint16 RecompInverseLookup[941] = /* U+0049+0306 -> U+012C */ 107, /* U+0049+0307 -> U+0130 */ 111, /* U+0049+0308 -> U+00CF */ 28, - /* U+0049+0309 -> U+1EC8 */ 1316, + /* U+0049+0309 -> U+1EC8 */ 1350, /* U+0049+030C -> U+01CF */ 196, /* U+0049+030F -> U+0208 */ 248, /* U+0049+0311 -> U+020A */ 250, - /* U+0049+0323 -> U+1ECA */ 1318, + /* U+0049+0323 -> U+1ECA */ 1352, /* U+0049+0328 -> U+012E */ 109, - /* U+0049+0330 -> U+1E2C */ 1164, + /* U+0049+0330 -> U+1E2C */ 1198, /* U+004A+0302 -> U+0134 */ 114, - /* U+004B+0301 -> U+1E30 */ 1168, + /* U+004B+0301 -> U+1E30 */ 1202, /* U+004B+030C -> U+01E8 */ 218, - /* U+004B+0323 -> U+1E32 */ 1170, + /* U+004B+0323 -> U+1E32 */ 1204, /* U+004B+0327 -> U+0136 */ 116, - /* U+004B+0331 -> U+1E34 */ 1172, + /* U+004B+0331 -> U+1E34 */ 1206, /* U+004C+0301 -> U+0139 */ 118, /* U+004C+030C -> U+013D */ 122, - /* U+004C+0323 -> U+1E36 */ 1174, + /* U+004C+0323 -> U+1E36 */ 1208, /* U+004C+0327 -> U+013B */ 120, - /* U+004C+032D -> U+1E3C */ 1180, - /* U+004C+0331 -> U+1E3A */ 1178, - /* U+004D+0301 -> U+1E3E */ 1182, - /* U+004D+0307 -> U+1E40 */ 1184, - /* U+004D+0323 -> U+1E42 */ 1186, + /* U+004C+032D -> U+1E3C */ 1214, + /* U+004C+0331 -> U+1E3A */ 1212, + /* U+004D+0301 -> U+1E3E */ 1216, + /* U+004D+0307 -> U+1E40 */ 1218, + /* U+004D+0323 -> U+1E42 */ 1220, /* U+004E+0300 -> U+01F8 */ 232, /* U+004E+0301 -> U+0143 */ 126, /* U+004E+0303 -> U+00D1 */ 29, - /* U+004E+0307 -> U+1E44 */ 1188, + /* U+004E+0307 -> U+1E44 */ 1222, /* U+004E+030C -> U+0147 */ 130, - /* U+004E+0323 -> U+1E46 */ 1190, + /* U+004E+0323 -> U+1E46 */ 1224, /* U+004E+0327 -> U+0145 */ 128, - /* U+004E+032D -> U+1E4A */ 1194, - /* U+004E+0331 -> U+1E48 */ 1192, + /* U+004E+032D -> U+1E4A */ 1228, + /* U+004E+0331 -> U+1E48 */ 1226, /* U+004F+0300 -> U+00D2 */ 30, /* U+004F+0301 -> U+00D3 */ 31, /* U+004F+0302 -> U+00D4 */ 32, @@ -1834,38 +1858,38 @@ static const uint16 RecompInverseLookup[941] = /* U+004F+0306 -> U+014E */ 135, /* U+004F+0307 -> U+022E */ 278, /* U+004F+0308 -> U+00D6 */ 34, - /* U+004F+0309 -> U+1ECE */ 1322, + /* U+004F+0309 -> U+1ECE */ 1356, /* U+004F+030B -> U+0150 */ 137, /* U+004F+030C -> U+01D1 */ 198, /* U+004F+030F -> U+020C */ 252, /* U+004F+0311 -> U+020E */ 254, /* U+004F+031B -> U+01A0 */ 181, - /* U+004F+0323 -> U+1ECC */ 1320, + /* U+004F+0323 -> U+1ECC */ 1354, /* U+004F+0328 -> U+01EA */ 220, - /* U+0050+0301 -> U+1E54 */ 1204, - /* U+0050+0307 -> U+1E56 */ 1206, + /* U+0050+0301 -> U+1E54 */ 1238, + /* U+0050+0307 -> U+1E56 */ 1240, /* U+0052+0301 -> U+0154 */ 139, - /* U+0052+0307 -> U+1E58 */ 1208, + /* U+0052+0307 -> U+1E58 */ 1242, /* U+0052+030C -> U+0158 */ 143, /* U+0052+030F -> U+0210 */ 256, /* U+0052+0311 -> U+0212 */ 258, - /* U+0052+0323 -> U+1E5A */ 1210, + /* U+0052+0323 -> U+1E5A */ 1244, /* U+0052+0327 -> U+0156 */ 141, - /* U+0052+0331 -> U+1E5E */ 1214, + /* U+0052+0331 -> U+1E5E */ 1248, /* U+0053+0301 -> U+015A */ 145, /* U+0053+0302 -> U+015C */ 147, - /* U+0053+0307 -> U+1E60 */ 1216, + /* U+0053+0307 -> U+1E60 */ 1250, /* U+0053+030C -> U+0160 */ 151, - /* U+0053+0323 -> U+1E62 */ 1218, + /* U+0053+0323 -> U+1E62 */ 1252, /* U+0053+0326 -> U+0218 */ 264, /* U+0053+0327 -> U+015E */ 149, - /* U+0054+0307 -> U+1E6A */ 1226, + /* U+0054+0307 -> U+1E6A */ 1260, /* U+0054+030C -> U+0164 */ 155, - /* U+0054+0323 -> U+1E6C */ 1228, + /* U+0054+0323 -> U+1E6C */ 1262, /* U+0054+0326 -> U+021A */ 266, /* U+0054+0327 -> U+0162 */ 153, - /* U+0054+032D -> U+1E70 */ 1232, - /* U+0054+0331 -> U+1E6E */ 1230, + /* U+0054+032D -> U+1E70 */ 1266, + /* U+0054+0331 -> U+1E6E */ 1264, /* U+0055+0300 -> U+00D9 */ 35, /* U+0055+0301 -> U+00DA */ 36, /* U+0055+0302 -> U+00DB */ 37, @@ -1873,43 +1897,43 @@ static const uint16 RecompInverseLookup[941] = /* U+0055+0304 -> U+016A */ 159, /* U+0055+0306 -> U+016C */ 161, /* U+0055+0308 -> U+00DC */ 38, - /* U+0055+0309 -> U+1EE6 */ 1346, + /* U+0055+0309 -> U+1EE6 */ 1380, /* U+0055+030A -> U+016E */ 163, /* U+0055+030B -> U+0170 */ 165, /* U+0055+030C -> U+01D3 */ 200, /* U+0055+030F -> U+0214 */ 260, /* U+0055+0311 -> U+0216 */ 262, /* U+0055+031B -> U+01AF */ 183, - /* U+0055+0323 -> U+1EE4 */ 1344, - /* U+0055+0324 -> U+1E72 */ 1234, + /* U+0055+0323 -> U+1EE4 */ 1378, + /* U+0055+0324 -> U+1E72 */ 1268, /* U+0055+0328 -> U+0172 */ 167, - /* U+0055+032D -> U+1E76 */ 1238, - /* U+0055+0330 -> U+1E74 */ 1236, - /* U+0056+0303 -> U+1E7C */ 1244, - /* U+0056+0323 -> U+1E7E */ 1246, - /* U+0057+0300 -> U+1E80 */ 1248, - /* U+0057+0301 -> U+1E82 */ 1250, + /* U+0055+032D -> U+1E76 */ 1272, + /* U+0055+0330 -> U+1E74 */ 1270, + /* U+0056+0303 -> U+1E7C */ 1278, + /* U+0056+0323 -> U+1E7E */ 1280, + /* U+0057+0300 -> U+1E80 */ 1282, + /* U+0057+0301 -> U+1E82 */ 1284, /* U+0057+0302 -> U+0174 */ 169, - /* U+0057+0307 -> U+1E86 */ 1254, - /* U+0057+0308 -> U+1E84 */ 1252, - /* U+0057+0323 -> U+1E88 */ 1256, - /* U+0058+0307 -> U+1E8A */ 1258, - /* U+0058+0308 -> U+1E8C */ 1260, - /* U+0059+0300 -> U+1EF2 */ 1358, + /* U+0057+0307 -> U+1E86 */ 1288, + /* U+0057+0308 -> U+1E84 */ 1286, + /* U+0057+0323 -> U+1E88 */ 1290, + /* U+0058+0307 -> U+1E8A */ 1292, + /* U+0058+0308 -> U+1E8C */ 1294, + /* U+0059+0300 -> U+1EF2 */ 1392, /* U+0059+0301 -> U+00DD */ 39, /* U+0059+0302 -> U+0176 */ 171, - /* U+0059+0303 -> U+1EF8 */ 1364, + /* U+0059+0303 -> U+1EF8 */ 1398, /* U+0059+0304 -> U+0232 */ 282, - /* U+0059+0307 -> U+1E8E */ 1262, + /* U+0059+0307 -> U+1E8E */ 1296, /* U+0059+0308 -> U+0178 */ 173, - /* U+0059+0309 -> U+1EF6 */ 1362, - /* U+0059+0323 -> U+1EF4 */ 1360, + /* U+0059+0309 -> U+1EF6 */ 1396, + /* U+0059+0323 -> U+1EF4 */ 1394, /* U+005A+0301 -> U+0179 */ 174, - /* U+005A+0302 -> U+1E90 */ 1264, + /* U+005A+0302 -> U+1E90 */ 1298, /* U+005A+0307 -> U+017B */ 176, /* U+005A+030C -> U+017D */ 178, - /* U+005A+0323 -> U+1E92 */ 1266, - /* U+005A+0331 -> U+1E94 */ 1268, + /* U+005A+0323 -> U+1E92 */ 1300, + /* U+005A+0331 -> U+1E94 */ 1302, /* U+0061+0300 -> U+00E0 */ 40, /* U+0061+0301 -> U+00E1 */ 41, /* U+0061+0302 -> U+00E2 */ 42, @@ -1918,61 +1942,61 @@ static const uint16 RecompInverseLookup[941] = /* U+0061+0306 -> U+0103 */ 70, /* U+0061+0307 -> U+0227 */ 271, /* U+0061+0308 -> U+00E4 */ 44, - /* U+0061+0309 -> U+1EA3 */ 1279, + /* U+0061+0309 -> U+1EA3 */ 1313, /* U+0061+030A -> U+00E5 */ 45, /* U+0061+030C -> U+01CE */ 195, /* U+0061+030F -> U+0201 */ 241, /* U+0061+0311 -> U+0203 */ 243, - /* U+0061+0323 -> U+1EA1 */ 1277, - /* U+0061+0325 -> U+1E01 */ 1121, + /* U+0061+0323 -> U+1EA1 */ 1311, + /* U+0061+0325 -> U+1E01 */ 1155, /* U+0061+0328 -> U+0105 */ 72, - /* U+0062+0307 -> U+1E03 */ 1123, - /* U+0062+0323 -> U+1E05 */ 1125, - /* U+0062+0331 -> U+1E07 */ 1127, + /* U+0062+0307 -> U+1E03 */ 1157, + /* U+0062+0323 -> U+1E05 */ 1159, + /* U+0062+0331 -> U+1E07 */ 1161, /* U+0063+0301 -> U+0107 */ 74, /* U+0063+0302 -> U+0109 */ 76, /* U+0063+0307 -> U+010B */ 78, /* U+0063+030C -> U+010D */ 80, /* U+0063+0327 -> U+00E7 */ 46, - /* U+0064+0307 -> U+1E0B */ 1131, + /* U+0064+0307 -> U+1E0B */ 1165, /* U+0064+030C -> U+010F */ 82, - /* U+0064+0323 -> U+1E0D */ 1133, - /* U+0064+0327 -> U+1E11 */ 1137, - /* U+0064+032D -> U+1E13 */ 1139, - /* U+0064+0331 -> U+1E0F */ 1135, + /* U+0064+0323 -> U+1E0D */ 1167, + /* U+0064+0327 -> U+1E11 */ 1171, + /* U+0064+032D -> U+1E13 */ 1173, + /* U+0064+0331 -> U+1E0F */ 1169, /* U+0065+0300 -> U+00E8 */ 47, /* U+0065+0301 -> U+00E9 */ 48, /* U+0065+0302 -> U+00EA */ 49, - /* U+0065+0303 -> U+1EBD */ 1305, + /* U+0065+0303 -> U+1EBD */ 1339, /* U+0065+0304 -> U+0113 */ 84, /* U+0065+0306 -> U+0115 */ 86, /* U+0065+0307 -> U+0117 */ 88, /* U+0065+0308 -> U+00EB */ 50, - /* U+0065+0309 -> U+1EBB */ 1303, + /* U+0065+0309 -> U+1EBB */ 1337, /* U+0065+030C -> U+011B */ 92, /* U+0065+030F -> U+0205 */ 245, /* U+0065+0311 -> U+0207 */ 247, - /* U+0065+0323 -> U+1EB9 */ 1301, + /* U+0065+0323 -> U+1EB9 */ 1335, /* U+0065+0327 -> U+0229 */ 273, /* U+0065+0328 -> U+0119 */ 90, - /* U+0065+032D -> U+1E19 */ 1145, - /* U+0065+0330 -> U+1E1B */ 1147, - /* U+0066+0307 -> U+1E1F */ 1151, + /* U+0065+032D -> U+1E19 */ 1179, + /* U+0065+0330 -> U+1E1B */ 1181, + /* U+0066+0307 -> U+1E1F */ 1185, /* U+0067+0301 -> U+01F5 */ 231, /* U+0067+0302 -> U+011D */ 94, - /* U+0067+0304 -> U+1E21 */ 1153, + /* U+0067+0304 -> U+1E21 */ 1187, /* U+0067+0306 -> U+011F */ 96, /* U+0067+0307 -> U+0121 */ 98, /* U+0067+030C -> U+01E7 */ 217, /* U+0067+0327 -> U+0123 */ 100, /* U+0068+0302 -> U+0125 */ 102, - /* U+0068+0307 -> U+1E23 */ 1155, - /* U+0068+0308 -> U+1E27 */ 1159, + /* U+0068+0307 -> U+1E23 */ 1189, + /* U+0068+0308 -> U+1E27 */ 1193, /* U+0068+030C -> U+021F */ 269, - /* U+0068+0323 -> U+1E25 */ 1157, - /* U+0068+0327 -> U+1E29 */ 1161, - /* U+0068+032E -> U+1E2B */ 1163, - /* U+0068+0331 -> U+1E96 */ 1270, + /* U+0068+0323 -> U+1E25 */ 1191, + /* U+0068+0327 -> U+1E29 */ 1195, + /* U+0068+032E -> U+1E2B */ 1197, + /* U+0068+0331 -> U+1E96 */ 1304, /* U+0069+0300 -> U+00EC */ 51, /* U+0069+0301 -> U+00ED */ 52, /* U+0069+0302 -> U+00EE */ 53, @@ -1980,38 +2004,38 @@ static const uint16 RecompInverseLookup[941] = /* U+0069+0304 -> U+012B */ 106, /* U+0069+0306 -> U+012D */ 108, /* U+0069+0308 -> U+00EF */ 54, - /* U+0069+0309 -> U+1EC9 */ 1317, + /* U+0069+0309 -> U+1EC9 */ 1351, /* U+0069+030C -> U+01D0 */ 197, /* U+0069+030F -> U+0209 */ 249, /* U+0069+0311 -> U+020B */ 251, - /* U+0069+0323 -> U+1ECB */ 1319, + /* U+0069+0323 -> U+1ECB */ 1353, /* U+0069+0328 -> U+012F */ 110, - /* U+0069+0330 -> U+1E2D */ 1165, + /* U+0069+0330 -> U+1E2D */ 1199, /* U+006A+0302 -> U+0135 */ 115, /* U+006A+030C -> U+01F0 */ 226, - /* U+006B+0301 -> U+1E31 */ 1169, + /* U+006B+0301 -> U+1E31 */ 1203, /* U+006B+030C -> U+01E9 */ 219, - /* U+006B+0323 -> U+1E33 */ 1171, + /* U+006B+0323 -> U+1E33 */ 1205, /* U+006B+0327 -> U+0137 */ 117, - /* U+006B+0331 -> U+1E35 */ 1173, + /* U+006B+0331 -> U+1E35 */ 1207, /* U+006C+0301 -> U+013A */ 119, /* U+006C+030C -> U+013E */ 123, - /* U+006C+0323 -> U+1E37 */ 1175, + /* U+006C+0323 -> U+1E37 */ 1209, /* U+006C+0327 -> U+013C */ 121, - /* U+006C+032D -> U+1E3D */ 1181, - /* U+006C+0331 -> U+1E3B */ 1179, - /* U+006D+0301 -> U+1E3F */ 1183, - /* U+006D+0307 -> U+1E41 */ 1185, - /* U+006D+0323 -> U+1E43 */ 1187, + /* U+006C+032D -> U+1E3D */ 1215, + /* U+006C+0331 -> U+1E3B */ 1213, + /* U+006D+0301 -> U+1E3F */ 1217, + /* U+006D+0307 -> U+1E41 */ 1219, + /* U+006D+0323 -> U+1E43 */ 1221, /* U+006E+0300 -> U+01F9 */ 233, /* U+006E+0301 -> U+0144 */ 127, /* U+006E+0303 -> U+00F1 */ 55, - /* U+006E+0307 -> U+1E45 */ 1189, + /* U+006E+0307 -> U+1E45 */ 1223, /* U+006E+030C -> U+0148 */ 131, - /* U+006E+0323 -> U+1E47 */ 1191, + /* U+006E+0323 -> U+1E47 */ 1225, /* U+006E+0327 -> U+0146 */ 129, - /* U+006E+032D -> U+1E4B */ 1195, - /* U+006E+0331 -> U+1E49 */ 1193, + /* U+006E+032D -> U+1E4B */ 1229, + /* U+006E+0331 -> U+1E49 */ 1227, /* U+006F+0300 -> U+00F2 */ 56, /* U+006F+0301 -> U+00F3 */ 57, /* U+006F+0302 -> U+00F4 */ 58, @@ -2020,39 +2044,39 @@ static const uint16 RecompInverseLookup[941] = /* U+006F+0306 -> U+014F */ 136, /* U+006F+0307 -> U+022F */ 279, /* U+006F+0308 -> U+00F6 */ 60, - /* U+006F+0309 -> U+1ECF */ 1323, + /* U+006F+0309 -> U+1ECF */ 1357, /* U+006F+030B -> U+0151 */ 138, /* U+006F+030C -> U+01D2 */ 199, /* U+006F+030F -> U+020D */ 253, /* U+006F+0311 -> U+020F */ 255, /* U+006F+031B -> U+01A1 */ 182, - /* U+006F+0323 -> U+1ECD */ 1321, + /* U+006F+0323 -> U+1ECD */ 1355, /* U+006F+0328 -> U+01EB */ 221, - /* U+0070+0301 -> U+1E55 */ 1205, - /* U+0070+0307 -> U+1E57 */ 1207, + /* U+0070+0301 -> U+1E55 */ 1239, + /* U+0070+0307 -> U+1E57 */ 1241, /* U+0072+0301 -> U+0155 */ 140, - /* U+0072+0307 -> U+1E59 */ 1209, + /* U+0072+0307 -> U+1E59 */ 1243, /* U+0072+030C -> U+0159 */ 144, /* U+0072+030F -> U+0211 */ 257, /* U+0072+0311 -> U+0213 */ 259, - /* U+0072+0323 -> U+1E5B */ 1211, + /* U+0072+0323 -> U+1E5B */ 1245, /* U+0072+0327 -> U+0157 */ 142, - /* U+0072+0331 -> U+1E5F */ 1215, + /* U+0072+0331 -> U+1E5F */ 1249, /* U+0073+0301 -> U+015B */ 146, /* U+0073+0302 -> U+015D */ 148, - /* U+0073+0307 -> U+1E61 */ 1217, + /* U+0073+0307 -> U+1E61 */ 1251, /* U+0073+030C -> U+0161 */ 152, - /* U+0073+0323 -> U+1E63 */ 1219, + /* U+0073+0323 -> U+1E63 */ 1253, /* U+0073+0326 -> U+0219 */ 265, /* U+0073+0327 -> U+015F */ 150, - /* U+0074+0307 -> U+1E6B */ 1227, - /* U+0074+0308 -> U+1E97 */ 1271, + /* U+0074+0307 -> U+1E6B */ 1261, + /* U+0074+0308 -> U+1E97 */ 1305, /* U+0074+030C -> U+0165 */ 156, - /* U+0074+0323 -> U+1E6D */ 1229, + /* U+0074+0323 -> U+1E6D */ 1263, /* U+0074+0326 -> U+021B */ 267, /* U+0074+0327 -> U+0163 */ 154, - /* U+0074+032D -> U+1E71 */ 1233, - /* U+0074+0331 -> U+1E6F */ 1231, + /* U+0074+032D -> U+1E71 */ 1267, + /* U+0074+0331 -> U+1E6F */ 1265, /* U+0075+0300 -> U+00F9 */ 61, /* U+0075+0301 -> U+00FA */ 62, /* U+0075+0302 -> U+00FB */ 63, @@ -2060,251 +2084,251 @@ static const uint16 RecompInverseLookup[941] = /* U+0075+0304 -> U+016B */ 160, /* U+0075+0306 -> U+016D */ 162, /* U+0075+0308 -> U+00FC */ 64, - /* U+0075+0309 -> U+1EE7 */ 1347, + /* U+0075+0309 -> U+1EE7 */ 1381, /* U+0075+030A -> U+016F */ 164, /* U+0075+030B -> U+0171 */ 166, /* U+0075+030C -> U+01D4 */ 201, /* U+0075+030F -> U+0215 */ 261, /* U+0075+0311 -> U+0217 */ 263, /* U+0075+031B -> U+01B0 */ 184, - /* U+0075+0323 -> U+1EE5 */ 1345, - /* U+0075+0324 -> U+1E73 */ 1235, + /* U+0075+0323 -> U+1EE5 */ 1379, + /* U+0075+0324 -> U+1E73 */ 1269, /* U+0075+0328 -> U+0173 */ 168, - /* U+0075+032D -> U+1E77 */ 1239, - /* U+0075+0330 -> U+1E75 */ 1237, - /* U+0076+0303 -> U+1E7D */ 1245, - /* U+0076+0323 -> U+1E7F */ 1247, - /* U+0077+0300 -> U+1E81 */ 1249, - /* U+0077+0301 -> U+1E83 */ 1251, + /* U+0075+032D -> U+1E77 */ 1273, + /* U+0075+0330 -> U+1E75 */ 1271, + /* U+0076+0303 -> U+1E7D */ 1279, + /* U+0076+0323 -> U+1E7F */ 1281, + /* U+0077+0300 -> U+1E81 */ 1283, + /* U+0077+0301 -> U+1E83 */ 1285, /* U+0077+0302 -> U+0175 */ 170, - /* U+0077+0307 -> U+1E87 */ 1255, - /* U+0077+0308 -> U+1E85 */ 1253, - /* U+0077+030A -> U+1E98 */ 1272, - /* U+0077+0323 -> U+1E89 */ 1257, - /* U+0078+0307 -> U+1E8B */ 1259, - /* U+0078+0308 -> U+1E8D */ 1261, - /* U+0079+0300 -> U+1EF3 */ 1359, + /* U+0077+0307 -> U+1E87 */ 1289, + /* U+0077+0308 -> U+1E85 */ 1287, + /* U+0077+030A -> U+1E98 */ 1306, + /* U+0077+0323 -> U+1E89 */ 1291, + /* U+0078+0307 -> U+1E8B */ 1293, + /* U+0078+0308 -> U+1E8D */ 1295, + /* U+0079+0300 -> U+1EF3 */ 1393, /* U+0079+0301 -> U+00FD */ 65, /* U+0079+0302 -> U+0177 */ 172, - /* U+0079+0303 -> U+1EF9 */ 1365, + /* U+0079+0303 -> U+1EF9 */ 1399, /* U+0079+0304 -> U+0233 */ 283, - /* U+0079+0307 -> U+1E8F */ 1263, + /* U+0079+0307 -> U+1E8F */ 1297, /* U+0079+0308 -> U+00FF */ 66, - /* U+0079+0309 -> U+1EF7 */ 1363, - /* U+0079+030A -> U+1E99 */ 1273, - /* U+0079+0323 -> U+1EF5 */ 1361, + /* U+0079+0309 -> U+1EF7 */ 1397, + /* U+0079+030A -> U+1E99 */ 1307, + /* U+0079+0323 -> U+1EF5 */ 1395, /* U+007A+0301 -> U+017A */ 175, - /* U+007A+0302 -> U+1E91 */ 1265, + /* U+007A+0302 -> U+1E91 */ 1299, /* U+007A+0307 -> U+017C */ 177, /* U+007A+030C -> U+017E */ 179, - /* U+007A+0323 -> U+1E93 */ 1267, - /* U+007A+0331 -> U+1E95 */ 1269, - /* U+00A8+0300 -> U+1FED */ 1584, + /* U+007A+0323 -> U+1E93 */ 1301, + /* U+007A+0331 -> U+1E95 */ 1303, + /* U+00A8+0300 -> U+1FED */ 1618, /* U+00A8+0301 -> U+0385 */ 419, - /* U+00A8+0342 -> U+1FC1 */ 1544, - /* U+00C2+0300 -> U+1EA6 */ 1282, - /* U+00C2+0301 -> U+1EA4 */ 1280, - /* U+00C2+0303 -> U+1EAA */ 1286, - /* U+00C2+0309 -> U+1EA8 */ 1284, + /* U+00A8+0342 -> U+1FC1 */ 1578, + /* U+00C2+0300 -> U+1EA6 */ 1316, + /* U+00C2+0301 -> U+1EA4 */ 1314, + /* U+00C2+0303 -> U+1EAA */ 1320, + /* U+00C2+0309 -> U+1EA8 */ 1318, /* U+00C4+0304 -> U+01DE */ 210, /* U+00C5+0301 -> U+01FA */ 234, /* U+00C6+0301 -> U+01FC */ 236, /* U+00C6+0304 -> U+01E2 */ 214, - /* U+00C7+0301 -> U+1E08 */ 1128, - /* U+00CA+0300 -> U+1EC0 */ 1308, - /* U+00CA+0301 -> U+1EBE */ 1306, - /* U+00CA+0303 -> U+1EC4 */ 1312, - /* U+00CA+0309 -> U+1EC2 */ 1310, - /* U+00CF+0301 -> U+1E2E */ 1166, - /* U+00D4+0300 -> U+1ED2 */ 1326, - /* U+00D4+0301 -> U+1ED0 */ 1324, - /* U+00D4+0303 -> U+1ED6 */ 1330, - /* U+00D4+0309 -> U+1ED4 */ 1328, - /* U+00D5+0301 -> U+1E4C */ 1196, + /* U+00C7+0301 -> U+1E08 */ 1162, + /* U+00CA+0300 -> U+1EC0 */ 1342, + /* U+00CA+0301 -> U+1EBE */ 1340, + /* U+00CA+0303 -> U+1EC4 */ 1346, + /* U+00CA+0309 -> U+1EC2 */ 1344, + /* U+00CF+0301 -> U+1E2E */ 1200, + /* U+00D4+0300 -> U+1ED2 */ 1360, + /* U+00D4+0301 -> U+1ED0 */ 1358, + /* U+00D4+0303 -> U+1ED6 */ 1364, + /* U+00D4+0309 -> U+1ED4 */ 1362, + /* U+00D5+0301 -> U+1E4C */ 1230, /* U+00D5+0304 -> U+022C */ 276, - /* U+00D5+0308 -> U+1E4E */ 1198, + /* U+00D5+0308 -> U+1E4E */ 1232, /* U+00D6+0304 -> U+022A */ 274, /* U+00D8+0301 -> U+01FE */ 238, /* U+00DC+0300 -> U+01DB */ 208, /* U+00DC+0301 -> U+01D7 */ 204, /* U+00DC+0304 -> U+01D5 */ 202, /* U+00DC+030C -> U+01D9 */ 206, - /* U+00E2+0300 -> U+1EA7 */ 1283, - /* U+00E2+0301 -> U+1EA5 */ 1281, - /* U+00E2+0303 -> U+1EAB */ 1287, - /* U+00E2+0309 -> U+1EA9 */ 1285, + /* U+00E2+0300 -> U+1EA7 */ 1317, + /* U+00E2+0301 -> U+1EA5 */ 1315, + /* U+00E2+0303 -> U+1EAB */ 1321, + /* U+00E2+0309 -> U+1EA9 */ 1319, /* U+00E4+0304 -> U+01DF */ 211, /* U+00E5+0301 -> U+01FB */ 235, /* U+00E6+0301 -> U+01FD */ 237, /* U+00E6+0304 -> U+01E3 */ 215, - /* U+00E7+0301 -> U+1E09 */ 1129, - /* U+00EA+0300 -> U+1EC1 */ 1309, - /* U+00EA+0301 -> U+1EBF */ 1307, - /* U+00EA+0303 -> U+1EC5 */ 1313, - /* U+00EA+0309 -> U+1EC3 */ 1311, - /* U+00EF+0301 -> U+1E2F */ 1167, - /* U+00F4+0300 -> U+1ED3 */ 1327, - /* U+00F4+0301 -> U+1ED1 */ 1325, - /* U+00F4+0303 -> U+1ED7 */ 1331, - /* U+00F4+0309 -> U+1ED5 */ 1329, - /* U+00F5+0301 -> U+1E4D */ 1197, + /* U+00E7+0301 -> U+1E09 */ 1163, + /* U+00EA+0300 -> U+1EC1 */ 1343, + /* U+00EA+0301 -> U+1EBF */ 1341, + /* U+00EA+0303 -> U+1EC5 */ 1347, + /* U+00EA+0309 -> U+1EC3 */ 1345, + /* U+00EF+0301 -> U+1E2F */ 1201, + /* U+00F4+0300 -> U+1ED3 */ 1361, + /* U+00F4+0301 -> U+1ED1 */ 1359, + /* U+00F4+0303 -> U+1ED7 */ 1365, + /* U+00F4+0309 -> U+1ED5 */ 1363, + /* U+00F5+0301 -> U+1E4D */ 1231, /* U+00F5+0304 -> U+022D */ 277, - /* U+00F5+0308 -> U+1E4F */ 1199, + /* U+00F5+0308 -> U+1E4F */ 1233, /* U+00F6+0304 -> U+022B */ 275, /* U+00F8+0301 -> U+01FF */ 239, /* U+00FC+0300 -> U+01DC */ 209, /* U+00FC+0301 -> U+01D8 */ 205, /* U+00FC+0304 -> U+01D6 */ 203, /* U+00FC+030C -> U+01DA */ 207, - /* U+0102+0300 -> U+1EB0 */ 1292, - /* U+0102+0301 -> U+1EAE */ 1290, - /* U+0102+0303 -> U+1EB4 */ 1296, - /* U+0102+0309 -> U+1EB2 */ 1294, - /* U+0103+0300 -> U+1EB1 */ 1293, - /* U+0103+0301 -> U+1EAF */ 1291, - /* U+0103+0303 -> U+1EB5 */ 1297, - /* U+0103+0309 -> U+1EB3 */ 1295, - /* U+0112+0300 -> U+1E14 */ 1140, - /* U+0112+0301 -> U+1E16 */ 1142, - /* U+0113+0300 -> U+1E15 */ 1141, - /* U+0113+0301 -> U+1E17 */ 1143, - /* U+014C+0300 -> U+1E50 */ 1200, - /* U+014C+0301 -> U+1E52 */ 1202, - /* U+014D+0300 -> U+1E51 */ 1201, - /* U+014D+0301 -> U+1E53 */ 1203, - /* U+015A+0307 -> U+1E64 */ 1220, - /* U+015B+0307 -> U+1E65 */ 1221, - /* U+0160+0307 -> U+1E66 */ 1222, - /* U+0161+0307 -> U+1E67 */ 1223, - /* U+0168+0301 -> U+1E78 */ 1240, - /* U+0169+0301 -> U+1E79 */ 1241, - /* U+016A+0308 -> U+1E7A */ 1242, - /* U+016B+0308 -> U+1E7B */ 1243, - /* U+017F+0307 -> U+1E9B */ 1275, - /* U+01A0+0300 -> U+1EDC */ 1336, - /* U+01A0+0301 -> U+1EDA */ 1334, - /* U+01A0+0303 -> U+1EE0 */ 1340, - /* U+01A0+0309 -> U+1EDE */ 1338, - /* U+01A0+0323 -> U+1EE2 */ 1342, - /* U+01A1+0300 -> U+1EDD */ 1337, - /* U+01A1+0301 -> U+1EDB */ 1335, - /* U+01A1+0303 -> U+1EE1 */ 1341, - /* U+01A1+0309 -> U+1EDF */ 1339, - /* U+01A1+0323 -> U+1EE3 */ 1343, - /* U+01AF+0300 -> U+1EEA */ 1350, - /* U+01AF+0301 -> U+1EE8 */ 1348, - /* U+01AF+0303 -> U+1EEE */ 1354, - /* U+01AF+0309 -> U+1EEC */ 1352, - /* U+01AF+0323 -> U+1EF0 */ 1356, - /* U+01B0+0300 -> U+1EEB */ 1351, - /* U+01B0+0301 -> U+1EE9 */ 1349, - /* U+01B0+0303 -> U+1EEF */ 1355, - /* U+01B0+0309 -> U+1EED */ 1353, - /* U+01B0+0323 -> U+1EF1 */ 1357, + /* U+0102+0300 -> U+1EB0 */ 1326, + /* U+0102+0301 -> U+1EAE */ 1324, + /* U+0102+0303 -> U+1EB4 */ 1330, + /* U+0102+0309 -> U+1EB2 */ 1328, + /* U+0103+0300 -> U+1EB1 */ 1327, + /* U+0103+0301 -> U+1EAF */ 1325, + /* U+0103+0303 -> U+1EB5 */ 1331, + /* U+0103+0309 -> U+1EB3 */ 1329, + /* U+0112+0300 -> U+1E14 */ 1174, + /* U+0112+0301 -> U+1E16 */ 1176, + /* U+0113+0300 -> U+1E15 */ 1175, + /* U+0113+0301 -> U+1E17 */ 1177, + /* U+014C+0300 -> U+1E50 */ 1234, + /* U+014C+0301 -> U+1E52 */ 1236, + /* U+014D+0300 -> U+1E51 */ 1235, + /* U+014D+0301 -> U+1E53 */ 1237, + /* U+015A+0307 -> U+1E64 */ 1254, + /* U+015B+0307 -> U+1E65 */ 1255, + /* U+0160+0307 -> U+1E66 */ 1256, + /* U+0161+0307 -> U+1E67 */ 1257, + /* U+0168+0301 -> U+1E78 */ 1274, + /* U+0169+0301 -> U+1E79 */ 1275, + /* U+016A+0308 -> U+1E7A */ 1276, + /* U+016B+0308 -> U+1E7B */ 1277, + /* U+017F+0307 -> U+1E9B */ 1309, + /* U+01A0+0300 -> U+1EDC */ 1370, + /* U+01A0+0301 -> U+1EDA */ 1368, + /* U+01A0+0303 -> U+1EE0 */ 1374, + /* U+01A0+0309 -> U+1EDE */ 1372, + /* U+01A0+0323 -> U+1EE2 */ 1376, + /* U+01A1+0300 -> U+1EDD */ 1371, + /* U+01A1+0301 -> U+1EDB */ 1369, + /* U+01A1+0303 -> U+1EE1 */ 1375, + /* U+01A1+0309 -> U+1EDF */ 1373, + /* U+01A1+0323 -> U+1EE3 */ 1377, + /* U+01AF+0300 -> U+1EEA */ 1384, + /* U+01AF+0301 -> U+1EE8 */ 1382, + /* U+01AF+0303 -> U+1EEE */ 1388, + /* U+01AF+0309 -> U+1EEC */ 1386, + /* U+01AF+0323 -> U+1EF0 */ 1390, + /* U+01B0+0300 -> U+1EEB */ 1385, + /* U+01B0+0301 -> U+1EE9 */ 1383, + /* U+01B0+0303 -> U+1EEF */ 1389, + /* U+01B0+0309 -> U+1EED */ 1387, + /* U+01B0+0323 -> U+1EF1 */ 1391, /* U+01B7+030C -> U+01EE */ 224, /* U+01EA+0304 -> U+01EC */ 222, /* U+01EB+0304 -> U+01ED */ 223, /* U+0226+0304 -> U+01E0 */ 212, /* U+0227+0304 -> U+01E1 */ 213, - /* U+0228+0306 -> U+1E1C */ 1148, - /* U+0229+0306 -> U+1E1D */ 1149, + /* U+0228+0306 -> U+1E1C */ 1182, + /* U+0229+0306 -> U+1E1D */ 1183, /* U+022E+0304 -> U+0230 */ 280, /* U+022F+0304 -> U+0231 */ 281, /* U+0292+030C -> U+01EF */ 225, - /* U+0391+0300 -> U+1FBA */ 1537, + /* U+0391+0300 -> U+1FBA */ 1571, /* U+0391+0301 -> U+0386 */ 420, - /* U+0391+0304 -> U+1FB9 */ 1536, - /* U+0391+0306 -> U+1FB8 */ 1535, - /* U+0391+0313 -> U+1F08 */ 1374, - /* U+0391+0314 -> U+1F09 */ 1375, - /* U+0391+0345 -> U+1FBC */ 1539, - /* U+0395+0300 -> U+1FC8 */ 1550, + /* U+0391+0304 -> U+1FB9 */ 1570, + /* U+0391+0306 -> U+1FB8 */ 1569, + /* U+0391+0313 -> U+1F08 */ 1408, + /* U+0391+0314 -> U+1F09 */ 1409, + /* U+0391+0345 -> U+1FBC */ 1573, + /* U+0395+0300 -> U+1FC8 */ 1584, /* U+0395+0301 -> U+0388 */ 422, - /* U+0395+0313 -> U+1F18 */ 1388, - /* U+0395+0314 -> U+1F19 */ 1389, - /* U+0397+0300 -> U+1FCA */ 1552, + /* U+0395+0313 -> U+1F18 */ 1422, + /* U+0395+0314 -> U+1F19 */ 1423, + /* U+0397+0300 -> U+1FCA */ 1586, /* U+0397+0301 -> U+0389 */ 423, - /* U+0397+0313 -> U+1F28 */ 1402, - /* U+0397+0314 -> U+1F29 */ 1403, - /* U+0397+0345 -> U+1FCC */ 1554, - /* U+0399+0300 -> U+1FDA */ 1566, + /* U+0397+0313 -> U+1F28 */ 1436, + /* U+0397+0314 -> U+1F29 */ 1437, + /* U+0397+0345 -> U+1FCC */ 1588, + /* U+0399+0300 -> U+1FDA */ 1600, /* U+0399+0301 -> U+038A */ 424, - /* U+0399+0304 -> U+1FD9 */ 1565, - /* U+0399+0306 -> U+1FD8 */ 1564, + /* U+0399+0304 -> U+1FD9 */ 1599, + /* U+0399+0306 -> U+1FD8 */ 1598, /* U+0399+0308 -> U+03AA */ 429, - /* U+0399+0313 -> U+1F38 */ 1418, - /* U+0399+0314 -> U+1F39 */ 1419, - /* U+039F+0300 -> U+1FF8 */ 1592, + /* U+0399+0313 -> U+1F38 */ 1452, + /* U+0399+0314 -> U+1F39 */ 1453, + /* U+039F+0300 -> U+1FF8 */ 1626, /* U+039F+0301 -> U+038C */ 425, - /* U+039F+0313 -> U+1F48 */ 1432, - /* U+039F+0314 -> U+1F49 */ 1433, - /* U+03A1+0314 -> U+1FEC */ 1583, - /* U+03A5+0300 -> U+1FEA */ 1581, + /* U+039F+0313 -> U+1F48 */ 1466, + /* U+039F+0314 -> U+1F49 */ 1467, + /* U+03A1+0314 -> U+1FEC */ 1617, + /* U+03A5+0300 -> U+1FEA */ 1615, /* U+03A5+0301 -> U+038E */ 426, - /* U+03A5+0304 -> U+1FE9 */ 1580, - /* U+03A5+0306 -> U+1FE8 */ 1579, + /* U+03A5+0304 -> U+1FE9 */ 1614, + /* U+03A5+0306 -> U+1FE8 */ 1613, /* U+03A5+0308 -> U+03AB */ 430, - /* U+03A5+0314 -> U+1F59 */ 1446, - /* U+03A9+0300 -> U+1FFA */ 1594, + /* U+03A5+0314 -> U+1F59 */ 1480, + /* U+03A9+0300 -> U+1FFA */ 1628, /* U+03A9+0301 -> U+038F */ 427, - /* U+03A9+0313 -> U+1F68 */ 1458, - /* U+03A9+0314 -> U+1F69 */ 1459, - /* U+03A9+0345 -> U+1FFC */ 1596, - /* U+03AC+0345 -> U+1FB4 */ 1532, - /* U+03AE+0345 -> U+1FC4 */ 1547, - /* U+03B1+0300 -> U+1F70 */ 1466, + /* U+03A9+0313 -> U+1F68 */ 1492, + /* U+03A9+0314 -> U+1F69 */ 1493, + /* U+03A9+0345 -> U+1FFC */ 1630, + /* U+03AC+0345 -> U+1FB4 */ 1566, + /* U+03AE+0345 -> U+1FC4 */ 1581, + /* U+03B1+0300 -> U+1F70 */ 1500, /* U+03B1+0301 -> U+03AC */ 431, - /* U+03B1+0304 -> U+1FB1 */ 1529, - /* U+03B1+0306 -> U+1FB0 */ 1528, - /* U+03B1+0313 -> U+1F00 */ 1366, - /* U+03B1+0314 -> U+1F01 */ 1367, - /* U+03B1+0342 -> U+1FB6 */ 1533, - /* U+03B1+0345 -> U+1FB3 */ 1531, - /* U+03B5+0300 -> U+1F72 */ 1468, + /* U+03B1+0304 -> U+1FB1 */ 1563, + /* U+03B1+0306 -> U+1FB0 */ 1562, + /* U+03B1+0313 -> U+1F00 */ 1400, + /* U+03B1+0314 -> U+1F01 */ 1401, + /* U+03B1+0342 -> U+1FB6 */ 1567, + /* U+03B1+0345 -> U+1FB3 */ 1565, + /* U+03B5+0300 -> U+1F72 */ 1502, /* U+03B5+0301 -> U+03AD */ 432, - /* U+03B5+0313 -> U+1F10 */ 1382, - /* U+03B5+0314 -> U+1F11 */ 1383, - /* U+03B7+0300 -> U+1F74 */ 1470, + /* U+03B5+0313 -> U+1F10 */ 1416, + /* U+03B5+0314 -> U+1F11 */ 1417, + /* U+03B7+0300 -> U+1F74 */ 1504, /* U+03B7+0301 -> U+03AE */ 433, - /* U+03B7+0313 -> U+1F20 */ 1394, - /* U+03B7+0314 -> U+1F21 */ 1395, - /* U+03B7+0342 -> U+1FC6 */ 1548, - /* U+03B7+0345 -> U+1FC3 */ 1546, - /* U+03B9+0300 -> U+1F76 */ 1472, + /* U+03B7+0313 -> U+1F20 */ 1428, + /* U+03B7+0314 -> U+1F21 */ 1429, + /* U+03B7+0342 -> U+1FC6 */ 1582, + /* U+03B7+0345 -> U+1FC3 */ 1580, + /* U+03B9+0300 -> U+1F76 */ 1506, /* U+03B9+0301 -> U+03AF */ 434, - /* U+03B9+0304 -> U+1FD1 */ 1559, - /* U+03B9+0306 -> U+1FD0 */ 1558, + /* U+03B9+0304 -> U+1FD1 */ 1593, + /* U+03B9+0306 -> U+1FD0 */ 1592, /* U+03B9+0308 -> U+03CA */ 436, - /* U+03B9+0313 -> U+1F30 */ 1410, - /* U+03B9+0314 -> U+1F31 */ 1411, - /* U+03B9+0342 -> U+1FD6 */ 1562, - /* U+03BF+0300 -> U+1F78 */ 1474, + /* U+03B9+0313 -> U+1F30 */ 1444, + /* U+03B9+0314 -> U+1F31 */ 1445, + /* U+03B9+0342 -> U+1FD6 */ 1596, + /* U+03BF+0300 -> U+1F78 */ 1508, /* U+03BF+0301 -> U+03CC */ 438, - /* U+03BF+0313 -> U+1F40 */ 1426, - /* U+03BF+0314 -> U+1F41 */ 1427, - /* U+03C1+0313 -> U+1FE4 */ 1575, - /* U+03C1+0314 -> U+1FE5 */ 1576, - /* U+03C5+0300 -> U+1F7A */ 1476, + /* U+03BF+0313 -> U+1F40 */ 1460, + /* U+03BF+0314 -> U+1F41 */ 1461, + /* U+03C1+0313 -> U+1FE4 */ 1609, + /* U+03C1+0314 -> U+1FE5 */ 1610, + /* U+03C5+0300 -> U+1F7A */ 1510, /* U+03C5+0301 -> U+03CD */ 439, - /* U+03C5+0304 -> U+1FE1 */ 1572, - /* U+03C5+0306 -> U+1FE0 */ 1571, + /* U+03C5+0304 -> U+1FE1 */ 1606, + /* U+03C5+0306 -> U+1FE0 */ 1605, /* U+03C5+0308 -> U+03CB */ 437, - /* U+03C5+0313 -> U+1F50 */ 1438, - /* U+03C5+0314 -> U+1F51 */ 1439, - /* U+03C5+0342 -> U+1FE6 */ 1577, - /* U+03C9+0300 -> U+1F7C */ 1478, + /* U+03C5+0313 -> U+1F50 */ 1472, + /* U+03C5+0314 -> U+1F51 */ 1473, + /* U+03C5+0342 -> U+1FE6 */ 1611, + /* U+03C9+0300 -> U+1F7C */ 1512, /* U+03C9+0301 -> U+03CE */ 440, - /* U+03C9+0313 -> U+1F60 */ 1450, - /* U+03C9+0314 -> U+1F61 */ 1451, - /* U+03C9+0342 -> U+1FF6 */ 1590, - /* U+03C9+0345 -> U+1FF3 */ 1588, - /* U+03CA+0300 -> U+1FD2 */ 1560, + /* U+03C9+0313 -> U+1F60 */ 1484, + /* U+03C9+0314 -> U+1F61 */ 1485, + /* U+03C9+0342 -> U+1FF6 */ 1624, + /* U+03C9+0345 -> U+1FF3 */ 1622, + /* U+03CA+0300 -> U+1FD2 */ 1594, /* U+03CA+0301 -> U+0390 */ 428, - /* U+03CA+0342 -> U+1FD7 */ 1563, - /* U+03CB+0300 -> U+1FE2 */ 1573, + /* U+03CA+0342 -> U+1FD7 */ 1597, + /* U+03CB+0300 -> U+1FE2 */ 1607, /* U+03CB+0301 -> U+03B0 */ 435, - /* U+03CB+0342 -> U+1FE7 */ 1578, - /* U+03CE+0345 -> U+1FF4 */ 1589, + /* U+03CB+0342 -> U+1FE7 */ 1612, + /* U+03CE+0345 -> U+1FF4 */ 1623, /* U+03D2+0301 -> U+03D3 */ 444, /* U+03D2+0308 -> U+03D4 */ 445, /* U+0406+0308 -> U+0407 */ 457, @@ -2367,302 +2391,302 @@ static const uint16 RecompInverseLookup[941] = /* U+06C1+0654 -> U+06C2 */ 606, /* U+06D2+0654 -> U+06D3 */ 607, /* U+06D5+0654 -> U+06C0 */ 605, - /* U+0928+093C -> U+0929 */ 733, - /* U+0930+093C -> U+0931 */ 734, - /* U+0933+093C -> U+0934 */ 735, - /* U+09C7+09BE -> U+09CB */ 751, - /* U+09C7+09D7 -> U+09CC */ 752, - /* U+0B47+0B3E -> U+0B4B */ 770, - /* U+0B47+0B56 -> U+0B48 */ 769, - /* U+0B47+0B57 -> U+0B4C */ 771, - /* U+0B92+0BD7 -> U+0B94 */ 775, - /* U+0BC6+0BBE -> U+0BCA */ 776, - /* U+0BC6+0BD7 -> U+0BCC */ 778, - /* U+0BC7+0BBE -> U+0BCB */ 777, - /* U+0C46+0C56 -> U+0C48 */ 780, - /* U+0CBF+0CD5 -> U+0CC0 */ 785, - /* U+0CC6+0CC2 -> U+0CCA */ 788, - /* U+0CC6+0CD5 -> U+0CC7 */ 786, - /* U+0CC6+0CD6 -> U+0CC8 */ 787, - /* U+0CCA+0CD5 -> U+0CCB */ 789, - /* U+0D46+0D3E -> U+0D4A */ 793, - /* U+0D46+0D57 -> U+0D4C */ 795, - /* U+0D47+0D3E -> U+0D4B */ 794, - /* U+0DD9+0DCA -> U+0DDA */ 798, - /* U+0DD9+0DCF -> U+0DDC */ 799, - /* U+0DD9+0DDF -> U+0DDE */ 801, - /* U+0DDC+0DCA -> U+0DDD */ 800, - /* U+1025+102E -> U+1026 */ 859, - /* U+1B05+1B35 -> U+1B06 */ 904, - /* U+1B07+1B35 -> U+1B08 */ 905, - /* U+1B09+1B35 -> U+1B0A */ 906, - /* U+1B0B+1B35 -> U+1B0C */ 907, - /* U+1B0D+1B35 -> U+1B0E */ 908, - /* U+1B11+1B35 -> U+1B12 */ 909, - /* U+1B3A+1B35 -> U+1B3B */ 911, - /* U+1B3C+1B35 -> U+1B3D */ 912, - /* U+1B3E+1B35 -> U+1B40 */ 913, - /* U+1B3F+1B35 -> U+1B41 */ 914, - /* U+1B42+1B35 -> U+1B43 */ 915, - /* U+1E36+0304 -> U+1E38 */ 1176, - /* U+1E37+0304 -> U+1E39 */ 1177, - /* U+1E5A+0304 -> U+1E5C */ 1212, - /* U+1E5B+0304 -> U+1E5D */ 1213, - /* U+1E62+0307 -> U+1E68 */ 1224, - /* U+1E63+0307 -> U+1E69 */ 1225, - /* U+1EA0+0302 -> U+1EAC */ 1288, - /* U+1EA0+0306 -> U+1EB6 */ 1298, - /* U+1EA1+0302 -> U+1EAD */ 1289, - /* U+1EA1+0306 -> U+1EB7 */ 1299, - /* U+1EB8+0302 -> U+1EC6 */ 1314, - /* U+1EB9+0302 -> U+1EC7 */ 1315, - /* U+1ECC+0302 -> U+1ED8 */ 1332, - /* U+1ECD+0302 -> U+1ED9 */ 1333, - /* U+1F00+0300 -> U+1F02 */ 1368, - /* U+1F00+0301 -> U+1F04 */ 1370, - /* U+1F00+0342 -> U+1F06 */ 1372, - /* U+1F00+0345 -> U+1F80 */ 1480, - /* U+1F01+0300 -> U+1F03 */ 1369, - /* U+1F01+0301 -> U+1F05 */ 1371, - /* U+1F01+0342 -> U+1F07 */ 1373, - /* U+1F01+0345 -> U+1F81 */ 1481, - /* U+1F02+0345 -> U+1F82 */ 1482, - /* U+1F03+0345 -> U+1F83 */ 1483, - /* U+1F04+0345 -> U+1F84 */ 1484, - /* U+1F05+0345 -> U+1F85 */ 1485, - /* U+1F06+0345 -> U+1F86 */ 1486, - /* U+1F07+0345 -> U+1F87 */ 1487, - /* U+1F08+0300 -> U+1F0A */ 1376, - /* U+1F08+0301 -> U+1F0C */ 1378, - /* U+1F08+0342 -> U+1F0E */ 1380, - /* U+1F08+0345 -> U+1F88 */ 1488, - /* U+1F09+0300 -> U+1F0B */ 1377, - /* U+1F09+0301 -> U+1F0D */ 1379, - /* U+1F09+0342 -> U+1F0F */ 1381, - /* U+1F09+0345 -> U+1F89 */ 1489, - /* U+1F0A+0345 -> U+1F8A */ 1490, - /* U+1F0B+0345 -> U+1F8B */ 1491, - /* U+1F0C+0345 -> U+1F8C */ 1492, - /* U+1F0D+0345 -> U+1F8D */ 1493, - /* U+1F0E+0345 -> U+1F8E */ 1494, - /* U+1F0F+0345 -> U+1F8F */ 1495, - /* U+1F10+0300 -> U+1F12 */ 1384, - /* U+1F10+0301 -> U+1F14 */ 1386, - /* U+1F11+0300 -> U+1F13 */ 1385, - /* U+1F11+0301 -> U+1F15 */ 1387, - /* U+1F18+0300 -> U+1F1A */ 1390, - /* U+1F18+0301 -> U+1F1C */ 1392, - /* U+1F19+0300 -> U+1F1B */ 1391, - /* U+1F19+0301 -> U+1F1D */ 1393, - /* U+1F20+0300 -> U+1F22 */ 1396, - /* U+1F20+0301 -> U+1F24 */ 1398, - /* U+1F20+0342 -> U+1F26 */ 1400, - /* U+1F20+0345 -> U+1F90 */ 1496, - /* U+1F21+0300 -> U+1F23 */ 1397, - /* U+1F21+0301 -> U+1F25 */ 1399, - /* U+1F21+0342 -> U+1F27 */ 1401, - /* U+1F21+0345 -> U+1F91 */ 1497, - /* U+1F22+0345 -> U+1F92 */ 1498, - /* U+1F23+0345 -> U+1F93 */ 1499, - /* U+1F24+0345 -> U+1F94 */ 1500, - /* U+1F25+0345 -> U+1F95 */ 1501, - /* U+1F26+0345 -> U+1F96 */ 1502, - /* U+1F27+0345 -> U+1F97 */ 1503, - /* U+1F28+0300 -> U+1F2A */ 1404, - /* U+1F28+0301 -> U+1F2C */ 1406, - /* U+1F28+0342 -> U+1F2E */ 1408, - /* U+1F28+0345 -> U+1F98 */ 1504, - /* U+1F29+0300 -> U+1F2B */ 1405, - /* U+1F29+0301 -> U+1F2D */ 1407, - /* U+1F29+0342 -> U+1F2F */ 1409, - /* U+1F29+0345 -> U+1F99 */ 1505, - /* U+1F2A+0345 -> U+1F9A */ 1506, - /* U+1F2B+0345 -> U+1F9B */ 1507, - /* U+1F2C+0345 -> U+1F9C */ 1508, - /* U+1F2D+0345 -> U+1F9D */ 1509, - /* U+1F2E+0345 -> U+1F9E */ 1510, - /* U+1F2F+0345 -> U+1F9F */ 1511, - /* U+1F30+0300 -> U+1F32 */ 1412, - /* U+1F30+0301 -> U+1F34 */ 1414, - /* U+1F30+0342 -> U+1F36 */ 1416, - /* U+1F31+0300 -> U+1F33 */ 1413, - /* U+1F31+0301 -> U+1F35 */ 1415, - /* U+1F31+0342 -> U+1F37 */ 1417, - /* U+1F38+0300 -> U+1F3A */ 1420, - /* U+1F38+0301 -> U+1F3C */ 1422, - /* U+1F38+0342 -> U+1F3E */ 1424, - /* U+1F39+0300 -> U+1F3B */ 1421, - /* U+1F39+0301 -> U+1F3D */ 1423, - /* U+1F39+0342 -> U+1F3F */ 1425, - /* U+1F40+0300 -> U+1F42 */ 1428, - /* U+1F40+0301 -> U+1F44 */ 1430, - /* U+1F41+0300 -> U+1F43 */ 1429, - /* U+1F41+0301 -> U+1F45 */ 1431, - /* U+1F48+0300 -> U+1F4A */ 1434, - /* U+1F48+0301 -> U+1F4C */ 1436, - /* U+1F49+0300 -> U+1F4B */ 1435, - /* U+1F49+0301 -> U+1F4D */ 1437, - /* U+1F50+0300 -> U+1F52 */ 1440, - /* U+1F50+0301 -> U+1F54 */ 1442, - /* U+1F50+0342 -> U+1F56 */ 1444, - /* U+1F51+0300 -> U+1F53 */ 1441, - /* U+1F51+0301 -> U+1F55 */ 1443, - /* U+1F51+0342 -> U+1F57 */ 1445, - /* U+1F59+0300 -> U+1F5B */ 1447, - /* U+1F59+0301 -> U+1F5D */ 1448, - /* U+1F59+0342 -> U+1F5F */ 1449, - /* U+1F60+0300 -> U+1F62 */ 1452, - /* U+1F60+0301 -> U+1F64 */ 1454, - /* U+1F60+0342 -> U+1F66 */ 1456, - /* U+1F60+0345 -> U+1FA0 */ 1512, - /* U+1F61+0300 -> U+1F63 */ 1453, - /* U+1F61+0301 -> U+1F65 */ 1455, - /* U+1F61+0342 -> U+1F67 */ 1457, - /* U+1F61+0345 -> U+1FA1 */ 1513, - /* U+1F62+0345 -> U+1FA2 */ 1514, - /* U+1F63+0345 -> U+1FA3 */ 1515, - /* U+1F64+0345 -> U+1FA4 */ 1516, - /* U+1F65+0345 -> U+1FA5 */ 1517, - /* U+1F66+0345 -> U+1FA6 */ 1518, - /* U+1F67+0345 -> U+1FA7 */ 1519, - /* U+1F68+0300 -> U+1F6A */ 1460, - /* U+1F68+0301 -> U+1F6C */ 1462, - /* U+1F68+0342 -> U+1F6E */ 1464, - /* U+1F68+0345 -> U+1FA8 */ 1520, - /* U+1F69+0300 -> U+1F6B */ 1461, - /* U+1F69+0301 -> U+1F6D */ 1463, - /* U+1F69+0342 -> U+1F6F */ 1465, - /* U+1F69+0345 -> U+1FA9 */ 1521, - /* U+1F6A+0345 -> U+1FAA */ 1522, - /* U+1F6B+0345 -> U+1FAB */ 1523, - /* U+1F6C+0345 -> U+1FAC */ 1524, - /* U+1F6D+0345 -> U+1FAD */ 1525, - /* U+1F6E+0345 -> U+1FAE */ 1526, - /* U+1F6F+0345 -> U+1FAF */ 1527, - /* U+1F70+0345 -> U+1FB2 */ 1530, - /* U+1F74+0345 -> U+1FC2 */ 1545, - /* U+1F7C+0345 -> U+1FF2 */ 1587, - /* U+1FB6+0345 -> U+1FB7 */ 1534, - /* U+1FBF+0300 -> U+1FCD */ 1555, - /* U+1FBF+0301 -> U+1FCE */ 1556, - /* U+1FBF+0342 -> U+1FCF */ 1557, - /* U+1FC6+0345 -> U+1FC7 */ 1549, - /* U+1FF6+0345 -> U+1FF7 */ 1591, - /* U+1FFE+0300 -> U+1FDD */ 1568, - /* U+1FFE+0301 -> U+1FDE */ 1569, - /* U+1FFE+0342 -> U+1FDF */ 1570, - /* U+2190+0338 -> U+219A */ 1801, - /* U+2192+0338 -> U+219B */ 1802, - /* U+2194+0338 -> U+21AE */ 1803, - /* U+21D0+0338 -> U+21CD */ 1804, - /* U+21D2+0338 -> U+21CF */ 1806, - /* U+21D4+0338 -> U+21CE */ 1805, - /* U+2203+0338 -> U+2204 */ 1807, - /* U+2208+0338 -> U+2209 */ 1808, - /* U+220B+0338 -> U+220C */ 1809, - /* U+2223+0338 -> U+2224 */ 1810, - /* U+2225+0338 -> U+2226 */ 1811, - /* U+223C+0338 -> U+2241 */ 1816, - /* U+2243+0338 -> U+2244 */ 1817, - /* U+2245+0338 -> U+2247 */ 1818, - /* U+2248+0338 -> U+2249 */ 1819, - /* U+224D+0338 -> U+226D */ 1822, - /* U+2261+0338 -> U+2262 */ 1821, - /* U+2264+0338 -> U+2270 */ 1825, - /* U+2265+0338 -> U+2271 */ 1826, - /* U+2272+0338 -> U+2274 */ 1827, - /* U+2273+0338 -> U+2275 */ 1828, - /* U+2276+0338 -> U+2278 */ 1829, - /* U+2277+0338 -> U+2279 */ 1830, - /* U+227A+0338 -> U+2280 */ 1831, - /* U+227B+0338 -> U+2281 */ 1832, - /* U+227C+0338 -> U+22E0 */ 1841, - /* U+227D+0338 -> U+22E1 */ 1842, - /* U+2282+0338 -> U+2284 */ 1833, - /* U+2283+0338 -> U+2285 */ 1834, - /* U+2286+0338 -> U+2288 */ 1835, - /* U+2287+0338 -> U+2289 */ 1836, - /* U+2291+0338 -> U+22E2 */ 1843, - /* U+2292+0338 -> U+22E3 */ 1844, - /* U+22A2+0338 -> U+22AC */ 1837, - /* U+22A8+0338 -> U+22AD */ 1838, - /* U+22A9+0338 -> U+22AE */ 1839, - /* U+22AB+0338 -> U+22AF */ 1840, - /* U+22B2+0338 -> U+22EA */ 1845, - /* U+22B3+0338 -> U+22EB */ 1846, - /* U+22B4+0338 -> U+22EC */ 1847, - /* U+22B5+0338 -> U+22ED */ 1848, - /* U+3046+3099 -> U+3094 */ 2286, - /* U+304B+3099 -> U+304C */ 2261, - /* U+304D+3099 -> U+304E */ 2262, - /* U+304F+3099 -> U+3050 */ 2263, - /* U+3051+3099 -> U+3052 */ 2264, - /* U+3053+3099 -> U+3054 */ 2265, - /* U+3055+3099 -> U+3056 */ 2266, - /* U+3057+3099 -> U+3058 */ 2267, - /* U+3059+3099 -> U+305A */ 2268, - /* U+305B+3099 -> U+305C */ 2269, - /* U+305D+3099 -> U+305E */ 2270, - /* U+305F+3099 -> U+3060 */ 2271, - /* U+3061+3099 -> U+3062 */ 2272, - /* U+3064+3099 -> U+3065 */ 2273, - /* U+3066+3099 -> U+3067 */ 2274, - /* U+3068+3099 -> U+3069 */ 2275, - /* U+306F+3099 -> U+3070 */ 2276, - /* U+306F+309A -> U+3071 */ 2277, - /* U+3072+3099 -> U+3073 */ 2278, - /* U+3072+309A -> U+3074 */ 2279, - /* U+3075+3099 -> U+3076 */ 2280, - /* U+3075+309A -> U+3077 */ 2281, - /* U+3078+3099 -> U+3079 */ 2282, - /* U+3078+309A -> U+307A */ 2283, - /* U+307B+3099 -> U+307C */ 2284, - /* U+307B+309A -> U+307D */ 2285, - /* U+309D+3099 -> U+309E */ 2291, - /* U+30A6+3099 -> U+30F4 */ 2318, - /* U+30AB+3099 -> U+30AC */ 2293, - /* U+30AD+3099 -> U+30AE */ 2294, - /* U+30AF+3099 -> U+30B0 */ 2295, - /* U+30B1+3099 -> U+30B2 */ 2296, - /* U+30B3+3099 -> U+30B4 */ 2297, - /* U+30B5+3099 -> U+30B6 */ 2298, - /* U+30B7+3099 -> U+30B8 */ 2299, - /* U+30B9+3099 -> U+30BA */ 2300, - /* U+30BB+3099 -> U+30BC */ 2301, - /* U+30BD+3099 -> U+30BE */ 2302, - /* U+30BF+3099 -> U+30C0 */ 2303, - /* U+30C1+3099 -> U+30C2 */ 2304, - /* U+30C4+3099 -> U+30C5 */ 2305, - /* U+30C6+3099 -> U+30C7 */ 2306, - /* U+30C8+3099 -> U+30C9 */ 2307, - /* U+30CF+3099 -> U+30D0 */ 2308, - /* U+30CF+309A -> U+30D1 */ 2309, - /* U+30D2+3099 -> U+30D3 */ 2310, - /* U+30D2+309A -> U+30D4 */ 2311, - /* U+30D5+3099 -> U+30D6 */ 2312, - /* U+30D5+309A -> U+30D7 */ 2313, - /* U+30D8+3099 -> U+30D9 */ 2314, - /* U+30D8+309A -> U+30DA */ 2315, - /* U+30DB+3099 -> U+30DC */ 2316, - /* U+30DB+309A -> U+30DD */ 2317, - /* U+30EF+3099 -> U+30F7 */ 2319, - /* U+30F0+3099 -> U+30F8 */ 2320, - /* U+30F1+3099 -> U+30F9 */ 2321, - /* U+30F2+3099 -> U+30FA */ 2322, - /* U+30FD+3099 -> U+30FE */ 2323, - /* U+11099+110BA -> U+1109A */ 4588, - /* U+1109B+110BA -> U+1109C */ 4589, - /* U+110A5+110BA -> U+110AB */ 4590, - /* U+11131+11127 -> U+1112E */ 4596, - /* U+11132+11127 -> U+1112F */ 4597, - /* U+11347+1133E -> U+1134B */ 4609, - /* U+11347+11357 -> U+1134C */ 4610, - /* U+114B9+114B0 -> U+114BC */ 4628, - /* U+114B9+114BA -> U+114BB */ 4627, - /* U+114B9+114BD -> U+114BE */ 4629, - /* U+115B8+115AF -> U+115BA */ 4632, - /* U+115B9+115AF -> U+115BB */ 4633, - /* U+11935+11930 -> U+11938 */ 4642 + /* U+0928+093C -> U+0929 */ 750, + /* U+0930+093C -> U+0931 */ 751, + /* U+0933+093C -> U+0934 */ 752, + /* U+09C7+09BE -> U+09CB */ 768, + /* U+09C7+09D7 -> U+09CC */ 769, + /* U+0B47+0B3E -> U+0B4B */ 787, + /* U+0B47+0B56 -> U+0B48 */ 786, + /* U+0B47+0B57 -> U+0B4C */ 788, + /* U+0B92+0BD7 -> U+0B94 */ 792, + /* U+0BC6+0BBE -> U+0BCA */ 793, + /* U+0BC6+0BD7 -> U+0BCC */ 795, + /* U+0BC7+0BBE -> U+0BCB */ 794, + /* U+0C46+0C56 -> U+0C48 */ 798, + /* U+0CBF+0CD5 -> U+0CC0 */ 803, + /* U+0CC6+0CC2 -> U+0CCA */ 806, + /* U+0CC6+0CD5 -> U+0CC7 */ 804, + /* U+0CC6+0CD6 -> U+0CC8 */ 805, + /* U+0CCA+0CD5 -> U+0CCB */ 807, + /* U+0D46+0D3E -> U+0D4A */ 811, + /* U+0D46+0D57 -> U+0D4C */ 813, + /* U+0D47+0D3E -> U+0D4B */ 812, + /* U+0DD9+0DCA -> U+0DDA */ 816, + /* U+0DD9+0DCF -> U+0DDC */ 817, + /* U+0DD9+0DDF -> U+0DDE */ 819, + /* U+0DDC+0DCA -> U+0DDD */ 818, + /* U+1025+102E -> U+1026 */ 877, + /* U+1B05+1B35 -> U+1B06 */ 937, + /* U+1B07+1B35 -> U+1B08 */ 938, + /* U+1B09+1B35 -> U+1B0A */ 939, + /* U+1B0B+1B35 -> U+1B0C */ 940, + /* U+1B0D+1B35 -> U+1B0E */ 941, + /* U+1B11+1B35 -> U+1B12 */ 942, + /* U+1B3A+1B35 -> U+1B3B */ 944, + /* U+1B3C+1B35 -> U+1B3D */ 945, + /* U+1B3E+1B35 -> U+1B40 */ 946, + /* U+1B3F+1B35 -> U+1B41 */ 947, + /* U+1B42+1B35 -> U+1B43 */ 948, + /* U+1E36+0304 -> U+1E38 */ 1210, + /* U+1E37+0304 -> U+1E39 */ 1211, + /* U+1E5A+0304 -> U+1E5C */ 1246, + /* U+1E5B+0304 -> U+1E5D */ 1247, + /* U+1E62+0307 -> U+1E68 */ 1258, + /* U+1E63+0307 -> U+1E69 */ 1259, + /* U+1EA0+0302 -> U+1EAC */ 1322, + /* U+1EA0+0306 -> U+1EB6 */ 1332, + /* U+1EA1+0302 -> U+1EAD */ 1323, + /* U+1EA1+0306 -> U+1EB7 */ 1333, + /* U+1EB8+0302 -> U+1EC6 */ 1348, + /* U+1EB9+0302 -> U+1EC7 */ 1349, + /* U+1ECC+0302 -> U+1ED8 */ 1366, + /* U+1ECD+0302 -> U+1ED9 */ 1367, + /* U+1F00+0300 -> U+1F02 */ 1402, + /* U+1F00+0301 -> U+1F04 */ 1404, + /* U+1F00+0342 -> U+1F06 */ 1406, + /* U+1F00+0345 -> U+1F80 */ 1514, + /* U+1F01+0300 -> U+1F03 */ 1403, + /* U+1F01+0301 -> U+1F05 */ 1405, + /* U+1F01+0342 -> U+1F07 */ 1407, + /* U+1F01+0345 -> U+1F81 */ 1515, + /* U+1F02+0345 -> U+1F82 */ 1516, + /* U+1F03+0345 -> U+1F83 */ 1517, + /* U+1F04+0345 -> U+1F84 */ 1518, + /* U+1F05+0345 -> U+1F85 */ 1519, + /* U+1F06+0345 -> U+1F86 */ 1520, + /* U+1F07+0345 -> U+1F87 */ 1521, + /* U+1F08+0300 -> U+1F0A */ 1410, + /* U+1F08+0301 -> U+1F0C */ 1412, + /* U+1F08+0342 -> U+1F0E */ 1414, + /* U+1F08+0345 -> U+1F88 */ 1522, + /* U+1F09+0300 -> U+1F0B */ 1411, + /* U+1F09+0301 -> U+1F0D */ 1413, + /* U+1F09+0342 -> U+1F0F */ 1415, + /* U+1F09+0345 -> U+1F89 */ 1523, + /* U+1F0A+0345 -> U+1F8A */ 1524, + /* U+1F0B+0345 -> U+1F8B */ 1525, + /* U+1F0C+0345 -> U+1F8C */ 1526, + /* U+1F0D+0345 -> U+1F8D */ 1527, + /* U+1F0E+0345 -> U+1F8E */ 1528, + /* U+1F0F+0345 -> U+1F8F */ 1529, + /* U+1F10+0300 -> U+1F12 */ 1418, + /* U+1F10+0301 -> U+1F14 */ 1420, + /* U+1F11+0300 -> U+1F13 */ 1419, + /* U+1F11+0301 -> U+1F15 */ 1421, + /* U+1F18+0300 -> U+1F1A */ 1424, + /* U+1F18+0301 -> U+1F1C */ 1426, + /* U+1F19+0300 -> U+1F1B */ 1425, + /* U+1F19+0301 -> U+1F1D */ 1427, + /* U+1F20+0300 -> U+1F22 */ 1430, + /* U+1F20+0301 -> U+1F24 */ 1432, + /* U+1F20+0342 -> U+1F26 */ 1434, + /* U+1F20+0345 -> U+1F90 */ 1530, + /* U+1F21+0300 -> U+1F23 */ 1431, + /* U+1F21+0301 -> U+1F25 */ 1433, + /* U+1F21+0342 -> U+1F27 */ 1435, + /* U+1F21+0345 -> U+1F91 */ 1531, + /* U+1F22+0345 -> U+1F92 */ 1532, + /* U+1F23+0345 -> U+1F93 */ 1533, + /* U+1F24+0345 -> U+1F94 */ 1534, + /* U+1F25+0345 -> U+1F95 */ 1535, + /* U+1F26+0345 -> U+1F96 */ 1536, + /* U+1F27+0345 -> U+1F97 */ 1537, + /* U+1F28+0300 -> U+1F2A */ 1438, + /* U+1F28+0301 -> U+1F2C */ 1440, + /* U+1F28+0342 -> U+1F2E */ 1442, + /* U+1F28+0345 -> U+1F98 */ 1538, + /* U+1F29+0300 -> U+1F2B */ 1439, + /* U+1F29+0301 -> U+1F2D */ 1441, + /* U+1F29+0342 -> U+1F2F */ 1443, + /* U+1F29+0345 -> U+1F99 */ 1539, + /* U+1F2A+0345 -> U+1F9A */ 1540, + /* U+1F2B+0345 -> U+1F9B */ 1541, + /* U+1F2C+0345 -> U+1F9C */ 1542, + /* U+1F2D+0345 -> U+1F9D */ 1543, + /* U+1F2E+0345 -> U+1F9E */ 1544, + /* U+1F2F+0345 -> U+1F9F */ 1545, + /* U+1F30+0300 -> U+1F32 */ 1446, + /* U+1F30+0301 -> U+1F34 */ 1448, + /* U+1F30+0342 -> U+1F36 */ 1450, + /* U+1F31+0300 -> U+1F33 */ 1447, + /* U+1F31+0301 -> U+1F35 */ 1449, + /* U+1F31+0342 -> U+1F37 */ 1451, + /* U+1F38+0300 -> U+1F3A */ 1454, + /* U+1F38+0301 -> U+1F3C */ 1456, + /* U+1F38+0342 -> U+1F3E */ 1458, + /* U+1F39+0300 -> U+1F3B */ 1455, + /* U+1F39+0301 -> U+1F3D */ 1457, + /* U+1F39+0342 -> U+1F3F */ 1459, + /* U+1F40+0300 -> U+1F42 */ 1462, + /* U+1F40+0301 -> U+1F44 */ 1464, + /* U+1F41+0300 -> U+1F43 */ 1463, + /* U+1F41+0301 -> U+1F45 */ 1465, + /* U+1F48+0300 -> U+1F4A */ 1468, + /* U+1F48+0301 -> U+1F4C */ 1470, + /* U+1F49+0300 -> U+1F4B */ 1469, + /* U+1F49+0301 -> U+1F4D */ 1471, + /* U+1F50+0300 -> U+1F52 */ 1474, + /* U+1F50+0301 -> U+1F54 */ 1476, + /* U+1F50+0342 -> U+1F56 */ 1478, + /* U+1F51+0300 -> U+1F53 */ 1475, + /* U+1F51+0301 -> U+1F55 */ 1477, + /* U+1F51+0342 -> U+1F57 */ 1479, + /* U+1F59+0300 -> U+1F5B */ 1481, + /* U+1F59+0301 -> U+1F5D */ 1482, + /* U+1F59+0342 -> U+1F5F */ 1483, + /* U+1F60+0300 -> U+1F62 */ 1486, + /* U+1F60+0301 -> U+1F64 */ 1488, + /* U+1F60+0342 -> U+1F66 */ 1490, + /* U+1F60+0345 -> U+1FA0 */ 1546, + /* U+1F61+0300 -> U+1F63 */ 1487, + /* U+1F61+0301 -> U+1F65 */ 1489, + /* U+1F61+0342 -> U+1F67 */ 1491, + /* U+1F61+0345 -> U+1FA1 */ 1547, + /* U+1F62+0345 -> U+1FA2 */ 1548, + /* U+1F63+0345 -> U+1FA3 */ 1549, + /* U+1F64+0345 -> U+1FA4 */ 1550, + /* U+1F65+0345 -> U+1FA5 */ 1551, + /* U+1F66+0345 -> U+1FA6 */ 1552, + /* U+1F67+0345 -> U+1FA7 */ 1553, + /* U+1F68+0300 -> U+1F6A */ 1494, + /* U+1F68+0301 -> U+1F6C */ 1496, + /* U+1F68+0342 -> U+1F6E */ 1498, + /* U+1F68+0345 -> U+1FA8 */ 1554, + /* U+1F69+0300 -> U+1F6B */ 1495, + /* U+1F69+0301 -> U+1F6D */ 1497, + /* U+1F69+0342 -> U+1F6F */ 1499, + /* U+1F69+0345 -> U+1FA9 */ 1555, + /* U+1F6A+0345 -> U+1FAA */ 1556, + /* U+1F6B+0345 -> U+1FAB */ 1557, + /* U+1F6C+0345 -> U+1FAC */ 1558, + /* U+1F6D+0345 -> U+1FAD */ 1559, + /* U+1F6E+0345 -> U+1FAE */ 1560, + /* U+1F6F+0345 -> U+1FAF */ 1561, + /* U+1F70+0345 -> U+1FB2 */ 1564, + /* U+1F74+0345 -> U+1FC2 */ 1579, + /* U+1F7C+0345 -> U+1FF2 */ 1621, + /* U+1FB6+0345 -> U+1FB7 */ 1568, + /* U+1FBF+0300 -> U+1FCD */ 1589, + /* U+1FBF+0301 -> U+1FCE */ 1590, + /* U+1FBF+0342 -> U+1FCF */ 1591, + /* U+1FC6+0345 -> U+1FC7 */ 1583, + /* U+1FF6+0345 -> U+1FF7 */ 1625, + /* U+1FFE+0300 -> U+1FDD */ 1602, + /* U+1FFE+0301 -> U+1FDE */ 1603, + /* U+1FFE+0342 -> U+1FDF */ 1604, + /* U+2190+0338 -> U+219A */ 1835, + /* U+2192+0338 -> U+219B */ 1836, + /* U+2194+0338 -> U+21AE */ 1837, + /* U+21D0+0338 -> U+21CD */ 1838, + /* U+21D2+0338 -> U+21CF */ 1840, + /* U+21D4+0338 -> U+21CE */ 1839, + /* U+2203+0338 -> U+2204 */ 1841, + /* U+2208+0338 -> U+2209 */ 1842, + /* U+220B+0338 -> U+220C */ 1843, + /* U+2223+0338 -> U+2224 */ 1844, + /* U+2225+0338 -> U+2226 */ 1845, + /* U+223C+0338 -> U+2241 */ 1850, + /* U+2243+0338 -> U+2244 */ 1851, + /* U+2245+0338 -> U+2247 */ 1852, + /* U+2248+0338 -> U+2249 */ 1853, + /* U+224D+0338 -> U+226D */ 1856, + /* U+2261+0338 -> U+2262 */ 1855, + /* U+2264+0338 -> U+2270 */ 1859, + /* U+2265+0338 -> U+2271 */ 1860, + /* U+2272+0338 -> U+2274 */ 1861, + /* U+2273+0338 -> U+2275 */ 1862, + /* U+2276+0338 -> U+2278 */ 1863, + /* U+2277+0338 -> U+2279 */ 1864, + /* U+227A+0338 -> U+2280 */ 1865, + /* U+227B+0338 -> U+2281 */ 1866, + /* U+227C+0338 -> U+22E0 */ 1875, + /* U+227D+0338 -> U+22E1 */ 1876, + /* U+2282+0338 -> U+2284 */ 1867, + /* U+2283+0338 -> U+2285 */ 1868, + /* U+2286+0338 -> U+2288 */ 1869, + /* U+2287+0338 -> U+2289 */ 1870, + /* U+2291+0338 -> U+22E2 */ 1877, + /* U+2292+0338 -> U+22E3 */ 1878, + /* U+22A2+0338 -> U+22AC */ 1871, + /* U+22A8+0338 -> U+22AD */ 1872, + /* U+22A9+0338 -> U+22AE */ 1873, + /* U+22AB+0338 -> U+22AF */ 1874, + /* U+22B2+0338 -> U+22EA */ 1879, + /* U+22B3+0338 -> U+22EB */ 1880, + /* U+22B4+0338 -> U+22EC */ 1881, + /* U+22B5+0338 -> U+22ED */ 1882, + /* U+3046+3099 -> U+3094 */ 2320, + /* U+304B+3099 -> U+304C */ 2295, + /* U+304D+3099 -> U+304E */ 2296, + /* U+304F+3099 -> U+3050 */ 2297, + /* U+3051+3099 -> U+3052 */ 2298, + /* U+3053+3099 -> U+3054 */ 2299, + /* U+3055+3099 -> U+3056 */ 2300, + /* U+3057+3099 -> U+3058 */ 2301, + /* U+3059+3099 -> U+305A */ 2302, + /* U+305B+3099 -> U+305C */ 2303, + /* U+305D+3099 -> U+305E */ 2304, + /* U+305F+3099 -> U+3060 */ 2305, + /* U+3061+3099 -> U+3062 */ 2306, + /* U+3064+3099 -> U+3065 */ 2307, + /* U+3066+3099 -> U+3067 */ 2308, + /* U+3068+3099 -> U+3069 */ 2309, + /* U+306F+3099 -> U+3070 */ 2310, + /* U+306F+309A -> U+3071 */ 2311, + /* U+3072+3099 -> U+3073 */ 2312, + /* U+3072+309A -> U+3074 */ 2313, + /* U+3075+3099 -> U+3076 */ 2314, + /* U+3075+309A -> U+3077 */ 2315, + /* U+3078+3099 -> U+3079 */ 2316, + /* U+3078+309A -> U+307A */ 2317, + /* U+307B+3099 -> U+307C */ 2318, + /* U+307B+309A -> U+307D */ 2319, + /* U+309D+3099 -> U+309E */ 2325, + /* U+30A6+3099 -> U+30F4 */ 2352, + /* U+30AB+3099 -> U+30AC */ 2327, + /* U+30AD+3099 -> U+30AE */ 2328, + /* U+30AF+3099 -> U+30B0 */ 2329, + /* U+30B1+3099 -> U+30B2 */ 2330, + /* U+30B3+3099 -> U+30B4 */ 2331, + /* U+30B5+3099 -> U+30B6 */ 2332, + /* U+30B7+3099 -> U+30B8 */ 2333, + /* U+30B9+3099 -> U+30BA */ 2334, + /* U+30BB+3099 -> U+30BC */ 2335, + /* U+30BD+3099 -> U+30BE */ 2336, + /* U+30BF+3099 -> U+30C0 */ 2337, + /* U+30C1+3099 -> U+30C2 */ 2338, + /* U+30C4+3099 -> U+30C5 */ 2339, + /* U+30C6+3099 -> U+30C7 */ 2340, + /* U+30C8+3099 -> U+30C9 */ 2341, + /* U+30CF+3099 -> U+30D0 */ 2342, + /* U+30CF+309A -> U+30D1 */ 2343, + /* U+30D2+3099 -> U+30D3 */ 2344, + /* U+30D2+309A -> U+30D4 */ 2345, + /* U+30D5+3099 -> U+30D6 */ 2346, + /* U+30D5+309A -> U+30D7 */ 2347, + /* U+30D8+3099 -> U+30D9 */ 2348, + /* U+30D8+309A -> U+30DA */ 2349, + /* U+30DB+3099 -> U+30DC */ 2350, + /* U+30DB+309A -> U+30DD */ 2351, + /* U+30EF+3099 -> U+30F7 */ 2353, + /* U+30F0+3099 -> U+30F8 */ 2354, + /* U+30F1+3099 -> U+30F9 */ 2355, + /* U+30F2+3099 -> U+30FA */ 2356, + /* U+30FD+3099 -> U+30FE */ 2357, + /* U+11099+110BA -> U+1109A */ 4686, + /* U+1109B+110BA -> U+1109C */ 4687, + /* U+110A5+110BA -> U+110AB */ 4688, + /* U+11131+11127 -> U+1112E */ 4694, + /* U+11132+11127 -> U+1112F */ 4695, + /* U+11347+1133E -> U+1134B */ 4707, + /* U+11347+11357 -> U+1134C */ 4708, + /* U+114B9+114B0 -> U+114BC */ 4726, + /* U+114B9+114BA -> U+114BB */ 4725, + /* U+114B9+114BD -> U+114BE */ 4727, + /* U+115B8+115AF -> U+115BA */ 4730, + /* U+115B9+115AF -> U+115BB */ 4731, + /* U+11935+11930 -> U+11938 */ 4740 }; /* Perfect hash function for recomposition */ diff --git a/third_party/spanner_pg/src/include/common/unicode_norm_table.h b/third_party/spanner_pg/src/include/common/unicode_norm_table.h index 7da633c3..c0cf3368 100644 --- a/third_party/spanner_pg/src/include/common/unicode_norm_table.h +++ b/third_party/spanner_pg/src/include/common/unicode_norm_table.h @@ -3,7 +3,7 @@ * unicode_norm_table.h * Composition table used for Unicode normalization * - * 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 * * src/include/common/unicode_norm_table.h @@ -36,7 +36,7 @@ typedef struct #define DECOMPOSITION_IS_COMPAT(x) (((x)->dec_size_flags & DECOMP_COMPAT) != 0) /* Table of Unicode codepoints and their decompositions */ -static const pg_unicode_decomposition UnicodeDecompMain[6604] = +static const pg_unicode_decomposition UnicodeDecompMain[6703] = { {0x00A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0020}, {0x00A8, 0, 2 | DECOMP_COMPAT, 0}, @@ -727,6 +727,23 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x0859, 220, 0, 0}, {0x085A, 220, 0, 0}, {0x085B, 220, 0, 0}, + {0x0898, 230, 0, 0}, + {0x0899, 220, 0, 0}, + {0x089A, 220, 0, 0}, + {0x089B, 220, 0, 0}, + {0x089C, 230, 0, 0}, + {0x089D, 230, 0, 0}, + {0x089E, 230, 0, 0}, + {0x089F, 230, 0, 0}, + {0x08CA, 230, 0, 0}, + {0x08CB, 230, 0, 0}, + {0x08CC, 230, 0, 0}, + {0x08CD, 230, 0, 0}, + {0x08CE, 230, 0, 0}, + {0x08CF, 220, 0, 0}, + {0x08D0, 220, 0, 0}, + {0x08D1, 220, 0, 0}, + {0x08D2, 220, 0, 0}, {0x08D3, 220, 0, 0}, {0x08D4, 230, 0, 0}, {0x08D5, 230, 0, 0}, @@ -818,6 +835,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x0BCB, 0, 2, 807}, {0x0BCC, 0, 2, 809}, {0x0BCD, 9, 0, 0}, + {0x0C3C, 7, 0, 0}, {0x0C48, 0, 2, 811}, {0x0C4D, 9, 0, 0}, {0x0C55, 84, 0, 0}, @@ -907,6 +925,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x135E, 230, 0, 0}, {0x135F, 230, 0, 0}, {0x1714, 9, 0, 0}, + {0x1715, 9, 0, 0}, {0x1734, 9, 0, 0}, {0x17D2, 9, 0, 0}, {0x17DD, 230, 0, 0}, @@ -942,6 +961,20 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1ABD, 220, 0, 0}, {0x1ABF, 220, 0, 0}, {0x1AC0, 220, 0, 0}, + {0x1AC1, 230, 0, 0}, + {0x1AC2, 230, 0, 0}, + {0x1AC3, 220, 0, 0}, + {0x1AC4, 220, 0, 0}, + {0x1AC5, 230, 0, 0}, + {0x1AC6, 230, 0, 0}, + {0x1AC7, 230, 0, 0}, + {0x1AC8, 230, 0, 0}, + {0x1AC9, 230, 0, 0}, + {0x1ACA, 220, 0, 0}, + {0x1ACB, 230, 0, 0}, + {0x1ACC, 230, 0, 0}, + {0x1ACD, 230, 0, 0}, + {0x1ACE, 230, 0, 0}, {0x1B06, 0, 2, 885}, {0x1B08, 0, 2, 887}, {0x1B0A, 0, 2, 889}, @@ -1153,6 +1186,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1DF7, 228, 0, 0}, {0x1DF8, 228, 0, 0}, {0x1DF9, 220, 0, 0}, + {0x1DFA, 218, 0, 0}, {0x1DFB, 230, 0, 0}, {0x1DFC, 233, 0, 0}, {0x1DFD, 220, 0, 0}, @@ -2991,6 +3025,9 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0xA6F0, 230, 0, 0}, {0xA6F1, 230, 0, 0}, {0xA770, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0xA76F}, + {0xA7F2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043}, + {0xA7F3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0046}, + {0xA7F4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0051}, {0xA7F8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0126}, {0xA7F9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0153}, {0xA806, 9, 0, 0}, @@ -4599,6 +4636,62 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x10378, 230, 0, 0}, {0x10379, 230, 0, 0}, {0x1037A, 230, 0, 0}, + {0x10781, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02D0}, + {0x10782, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02D1}, + {0x10783, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00E6}, + {0x10784, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0299}, + {0x10785, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0253}, + {0x10787, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A3}, + {0x10788, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0xAB66}, + {0x10789, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A5}, + {0x1078A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A4}, + {0x1078B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0256}, + {0x1078C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0257}, + {0x1078D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D91}, + {0x1078E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0258}, + {0x1078F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025E}, + {0x10790, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A9}, + {0x10791, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0264}, + {0x10792, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0262}, + {0x10793, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0260}, + {0x10794, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029B}, + {0x10795, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0127}, + {0x10796, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029C}, + {0x10797, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0267}, + {0x10798, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0284}, + {0x10799, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02AA}, + {0x1079A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02AB}, + {0x1079B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026C}, + {0x1079C, 0, 1 | DECOMP_COMPAT, 4776}, + {0x1079D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0xA78E}, + {0x1079E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026E}, + {0x1079F, 0, 1 | DECOMP_COMPAT, 4777}, + {0x107A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028E}, + {0x107A1, 0, 1 | DECOMP_COMPAT, 4778}, + {0x107A2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00F8}, + {0x107A3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0276}, + {0x107A4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0277}, + {0x107A5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0071}, + {0x107A6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027A}, + {0x107A7, 0, 1 | DECOMP_COMPAT, 4779}, + {0x107A8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027D}, + {0x107A9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027E}, + {0x107AA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0280}, + {0x107AB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A8}, + {0x107AC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A6}, + {0x107AD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0xAB67}, + {0x107AE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A7}, + {0x107AF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0288}, + {0x107B0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x2C71}, + {0x107B2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028F}, + {0x107B3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A1}, + {0x107B4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02A2}, + {0x107B5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0298}, + {0x107B6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C0}, + {0x107B7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C1}, + {0x107B8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C2}, + {0x107B9, 0, 1 | DECOMP_COMPAT, 4780}, + {0x107BA, 0, 1 | DECOMP_COMPAT, 4781}, {0x10A0D, 220, 0, 0}, {0x10A0F, 230, 0, 0}, {0x10A38, 230, 0, 0}, @@ -4624,18 +4717,23 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x10F4E, 220, 0, 0}, {0x10F4F, 220, 0, 0}, {0x10F50, 220, 0, 0}, + {0x10F82, 230, 0, 0}, + {0x10F83, 220, 0, 0}, + {0x10F84, 230, 0, 0}, + {0x10F85, 220, 0, 0}, {0x11046, 9, 0, 0}, + {0x11070, 9, 0, 0}, {0x1107F, 9, 0, 0}, - {0x1109A, 0, 2, 4776}, - {0x1109C, 0, 2, 4778}, - {0x110AB, 0, 2, 4780}, + {0x1109A, 0, 2, 4782}, + {0x1109C, 0, 2, 4784}, + {0x110AB, 0, 2, 4786}, {0x110B9, 9, 0, 0}, {0x110BA, 7, 0, 0}, {0x11100, 230, 0, 0}, {0x11101, 230, 0, 0}, {0x11102, 230, 0, 0}, - {0x1112E, 0, 2, 4782}, - {0x1112F, 0, 2, 4784}, + {0x1112E, 0, 2, 4788}, + {0x1112F, 0, 2, 4790}, {0x11133, 9, 0, 0}, {0x11134, 9, 0, 0}, {0x11173, 7, 0, 0}, @@ -4647,8 +4745,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x112EA, 9, 0, 0}, {0x1133B, 7, 0, 0}, {0x1133C, 7, 0, 0}, - {0x1134B, 0, 2, 4786}, - {0x1134C, 0, 2, 4788}, + {0x1134B, 0, 2, 4792}, + {0x1134C, 0, 2, 4794}, {0x1134D, 9, 0, 0}, {0x11366, 230, 0, 0}, {0x11367, 230, 0, 0}, @@ -4665,13 +4763,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x11442, 9, 0, 0}, {0x11446, 7, 0, 0}, {0x1145E, 230, 0, 0}, - {0x114BB, 0, 2, 4790}, - {0x114BC, 0, 2, 4792}, - {0x114BE, 0, 2, 4794}, + {0x114BB, 0, 2, 4796}, + {0x114BC, 0, 2, 4798}, + {0x114BE, 0, 2, 4800}, {0x114C2, 9, 0, 0}, {0x114C3, 7, 0, 0}, - {0x115BA, 0, 2, 4796}, - {0x115BB, 0, 2, 4798}, + {0x115BA, 0, 2, 4802}, + {0x115BB, 0, 2, 4804}, {0x115BF, 9, 0, 0}, {0x115C0, 7, 0, 0}, {0x1163F, 9, 0, 0}, @@ -4680,7 +4778,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1172B, 9, 0, 0}, {0x11839, 9, 0, 0}, {0x1183A, 7, 0, 0}, - {0x11938, 0, 2, 4800}, + {0x11938, 0, 2, 4806}, {0x1193D, 9, 0, 0}, {0x1193E, 9, 0, 0}, {0x11943, 7, 0, 0}, @@ -4708,13 +4806,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x16FF0, 6, 0, 0}, {0x16FF1, 6, 0, 0}, {0x1BC9E, 1, 0, 0}, - {0x1D15E, 0, 2 | DECOMP_NO_COMPOSE, 4802}, /* in exclusion list */ - {0x1D15F, 0, 2 | DECOMP_NO_COMPOSE, 4804}, /* in exclusion list */ - {0x1D160, 0, 2 | DECOMP_NO_COMPOSE, 4806}, /* in exclusion list */ - {0x1D161, 0, 2 | DECOMP_NO_COMPOSE, 4808}, /* in exclusion list */ - {0x1D162, 0, 2 | DECOMP_NO_COMPOSE, 4810}, /* in exclusion list */ - {0x1D163, 0, 2 | DECOMP_NO_COMPOSE, 4812}, /* in exclusion list */ - {0x1D164, 0, 2 | DECOMP_NO_COMPOSE, 4814}, /* in exclusion list */ + {0x1D15E, 0, 2 | DECOMP_NO_COMPOSE, 4808}, /* in exclusion list */ + {0x1D15F, 0, 2 | DECOMP_NO_COMPOSE, 4810}, /* in exclusion list */ + {0x1D160, 0, 2 | DECOMP_NO_COMPOSE, 4812}, /* in exclusion list */ + {0x1D161, 0, 2 | DECOMP_NO_COMPOSE, 4814}, /* in exclusion list */ + {0x1D162, 0, 2 | DECOMP_NO_COMPOSE, 4816}, /* in exclusion list */ + {0x1D163, 0, 2 | DECOMP_NO_COMPOSE, 4818}, /* in exclusion list */ + {0x1D164, 0, 2 | DECOMP_NO_COMPOSE, 4820}, /* in exclusion list */ {0x1D165, 216, 0, 0}, {0x1D166, 216, 0, 0}, {0x1D167, 1, 0, 0}, @@ -4745,12 +4843,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1D1AB, 230, 0, 0}, {0x1D1AC, 230, 0, 0}, {0x1D1AD, 230, 0, 0}, - {0x1D1BB, 0, 2 | DECOMP_NO_COMPOSE, 4816}, /* in exclusion list */ - {0x1D1BC, 0, 2 | DECOMP_NO_COMPOSE, 4818}, /* in exclusion list */ - {0x1D1BD, 0, 2 | DECOMP_NO_COMPOSE, 4820}, /* in exclusion list */ - {0x1D1BE, 0, 2 | DECOMP_NO_COMPOSE, 4822}, /* in exclusion list */ - {0x1D1BF, 0, 2 | DECOMP_NO_COMPOSE, 4824}, /* in exclusion list */ - {0x1D1C0, 0, 2 | DECOMP_NO_COMPOSE, 4826}, /* in exclusion list */ + {0x1D1BB, 0, 2 | DECOMP_NO_COMPOSE, 4822}, /* in exclusion list */ + {0x1D1BC, 0, 2 | DECOMP_NO_COMPOSE, 4824}, /* in exclusion list */ + {0x1D1BD, 0, 2 | DECOMP_NO_COMPOSE, 4826}, /* in exclusion list */ + {0x1D1BE, 0, 2 | DECOMP_NO_COMPOSE, 4828}, /* in exclusion list */ + {0x1D1BF, 0, 2 | DECOMP_NO_COMPOSE, 4830}, /* in exclusion list */ + {0x1D1C0, 0, 2 | DECOMP_NO_COMPOSE, 4832}, /* in exclusion list */ {0x1D242, 230, 0, 0}, {0x1D243, 230, 0, 0}, {0x1D244, 230, 0, 0}, @@ -5795,6 +5893,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1E134, 230, 0, 0}, {0x1E135, 230, 0, 0}, {0x1E136, 230, 0, 0}, + {0x1E2AE, 230, 0, 0}, {0x1E2EC, 230, 0, 0}, {0x1E2ED, 230, 0, 0}, {0x1E2EE, 230, 0, 0}, @@ -5954,48 +6053,48 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1EEB9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0636}, {0x1EEBA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0638}, {0x1EEBB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x063A}, - {0x1F100, 0, 2 | DECOMP_COMPAT, 4828}, - {0x1F101, 0, 2 | DECOMP_COMPAT, 4830}, - {0x1F102, 0, 2 | DECOMP_COMPAT, 4832}, - {0x1F103, 0, 2 | DECOMP_COMPAT, 4834}, - {0x1F104, 0, 2 | DECOMP_COMPAT, 4836}, - {0x1F105, 0, 2 | DECOMP_COMPAT, 4838}, - {0x1F106, 0, 2 | DECOMP_COMPAT, 4840}, - {0x1F107, 0, 2 | DECOMP_COMPAT, 4842}, - {0x1F108, 0, 2 | DECOMP_COMPAT, 4844}, - {0x1F109, 0, 2 | DECOMP_COMPAT, 4846}, - {0x1F10A, 0, 2 | DECOMP_COMPAT, 4848}, - {0x1F110, 0, 3 | DECOMP_COMPAT, 4850}, - {0x1F111, 0, 3 | DECOMP_COMPAT, 4853}, - {0x1F112, 0, 3 | DECOMP_COMPAT, 4856}, - {0x1F113, 0, 3 | DECOMP_COMPAT, 4859}, - {0x1F114, 0, 3 | DECOMP_COMPAT, 4862}, - {0x1F115, 0, 3 | DECOMP_COMPAT, 4865}, - {0x1F116, 0, 3 | DECOMP_COMPAT, 4868}, - {0x1F117, 0, 3 | DECOMP_COMPAT, 4871}, - {0x1F118, 0, 3 | DECOMP_COMPAT, 4874}, - {0x1F119, 0, 3 | DECOMP_COMPAT, 4877}, - {0x1F11A, 0, 3 | DECOMP_COMPAT, 4880}, - {0x1F11B, 0, 3 | DECOMP_COMPAT, 4883}, - {0x1F11C, 0, 3 | DECOMP_COMPAT, 4886}, - {0x1F11D, 0, 3 | DECOMP_COMPAT, 4889}, - {0x1F11E, 0, 3 | DECOMP_COMPAT, 4892}, - {0x1F11F, 0, 3 | DECOMP_COMPAT, 4895}, - {0x1F120, 0, 3 | DECOMP_COMPAT, 4898}, - {0x1F121, 0, 3 | DECOMP_COMPAT, 4901}, - {0x1F122, 0, 3 | DECOMP_COMPAT, 4904}, - {0x1F123, 0, 3 | DECOMP_COMPAT, 4907}, - {0x1F124, 0, 3 | DECOMP_COMPAT, 4910}, - {0x1F125, 0, 3 | DECOMP_COMPAT, 4913}, - {0x1F126, 0, 3 | DECOMP_COMPAT, 4916}, - {0x1F127, 0, 3 | DECOMP_COMPAT, 4919}, - {0x1F128, 0, 3 | DECOMP_COMPAT, 4922}, - {0x1F129, 0, 3 | DECOMP_COMPAT, 4925}, - {0x1F12A, 0, 3 | DECOMP_COMPAT, 4928}, + {0x1F100, 0, 2 | DECOMP_COMPAT, 4834}, + {0x1F101, 0, 2 | DECOMP_COMPAT, 4836}, + {0x1F102, 0, 2 | DECOMP_COMPAT, 4838}, + {0x1F103, 0, 2 | DECOMP_COMPAT, 4840}, + {0x1F104, 0, 2 | DECOMP_COMPAT, 4842}, + {0x1F105, 0, 2 | DECOMP_COMPAT, 4844}, + {0x1F106, 0, 2 | DECOMP_COMPAT, 4846}, + {0x1F107, 0, 2 | DECOMP_COMPAT, 4848}, + {0x1F108, 0, 2 | DECOMP_COMPAT, 4850}, + {0x1F109, 0, 2 | DECOMP_COMPAT, 4852}, + {0x1F10A, 0, 2 | DECOMP_COMPAT, 4854}, + {0x1F110, 0, 3 | DECOMP_COMPAT, 4856}, + {0x1F111, 0, 3 | DECOMP_COMPAT, 4859}, + {0x1F112, 0, 3 | DECOMP_COMPAT, 4862}, + {0x1F113, 0, 3 | DECOMP_COMPAT, 4865}, + {0x1F114, 0, 3 | DECOMP_COMPAT, 4868}, + {0x1F115, 0, 3 | DECOMP_COMPAT, 4871}, + {0x1F116, 0, 3 | DECOMP_COMPAT, 4874}, + {0x1F117, 0, 3 | DECOMP_COMPAT, 4877}, + {0x1F118, 0, 3 | DECOMP_COMPAT, 4880}, + {0x1F119, 0, 3 | DECOMP_COMPAT, 4883}, + {0x1F11A, 0, 3 | DECOMP_COMPAT, 4886}, + {0x1F11B, 0, 3 | DECOMP_COMPAT, 4889}, + {0x1F11C, 0, 3 | DECOMP_COMPAT, 4892}, + {0x1F11D, 0, 3 | DECOMP_COMPAT, 4895}, + {0x1F11E, 0, 3 | DECOMP_COMPAT, 4898}, + {0x1F11F, 0, 3 | DECOMP_COMPAT, 4901}, + {0x1F120, 0, 3 | DECOMP_COMPAT, 4904}, + {0x1F121, 0, 3 | DECOMP_COMPAT, 4907}, + {0x1F122, 0, 3 | DECOMP_COMPAT, 4910}, + {0x1F123, 0, 3 | DECOMP_COMPAT, 4913}, + {0x1F124, 0, 3 | DECOMP_COMPAT, 4916}, + {0x1F125, 0, 3 | DECOMP_COMPAT, 4919}, + {0x1F126, 0, 3 | DECOMP_COMPAT, 4922}, + {0x1F127, 0, 3 | DECOMP_COMPAT, 4925}, + {0x1F128, 0, 3 | DECOMP_COMPAT, 4928}, + {0x1F129, 0, 3 | DECOMP_COMPAT, 4931}, + {0x1F12A, 0, 3 | DECOMP_COMPAT, 4934}, {0x1F12B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043}, {0x1F12C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0052}, - {0x1F12D, 0, 2 | DECOMP_COMPAT, 4931}, - {0x1F12E, 0, 2 | DECOMP_COMPAT, 4933}, + {0x1F12D, 0, 2 | DECOMP_COMPAT, 4937}, + {0x1F12E, 0, 2 | DECOMP_COMPAT, 4939}, {0x1F130, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0041}, {0x1F131, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0042}, {0x1F132, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043}, @@ -6022,18 +6121,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1F147, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0058}, {0x1F148, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0059}, {0x1F149, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x005A}, - {0x1F14A, 0, 2 | DECOMP_COMPAT, 4935}, - {0x1F14B, 0, 2 | DECOMP_COMPAT, 4937}, - {0x1F14C, 0, 2 | DECOMP_COMPAT, 4939}, - {0x1F14D, 0, 2 | DECOMP_COMPAT, 4941}, - {0x1F14E, 0, 3 | DECOMP_COMPAT, 4943}, - {0x1F14F, 0, 2 | DECOMP_COMPAT, 4946}, - {0x1F16A, 0, 2 | DECOMP_COMPAT, 4948}, - {0x1F16B, 0, 2 | DECOMP_COMPAT, 4950}, - {0x1F16C, 0, 2 | DECOMP_COMPAT, 4952}, - {0x1F190, 0, 2 | DECOMP_COMPAT, 4954}, - {0x1F200, 0, 2 | DECOMP_COMPAT, 4956}, - {0x1F201, 0, 2 | DECOMP_COMPAT, 4958}, + {0x1F14A, 0, 2 | DECOMP_COMPAT, 4941}, + {0x1F14B, 0, 2 | DECOMP_COMPAT, 4943}, + {0x1F14C, 0, 2 | DECOMP_COMPAT, 4945}, + {0x1F14D, 0, 2 | DECOMP_COMPAT, 4947}, + {0x1F14E, 0, 3 | DECOMP_COMPAT, 4949}, + {0x1F14F, 0, 2 | DECOMP_COMPAT, 4952}, + {0x1F16A, 0, 2 | DECOMP_COMPAT, 4954}, + {0x1F16B, 0, 2 | DECOMP_COMPAT, 4956}, + {0x1F16C, 0, 2 | DECOMP_COMPAT, 4958}, + {0x1F190, 0, 2 | DECOMP_COMPAT, 4960}, + {0x1F200, 0, 2 | DECOMP_COMPAT, 4962}, + {0x1F201, 0, 2 | DECOMP_COMPAT, 4964}, {0x1F202, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x30B5}, {0x1F210, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x624B}, {0x1F211, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5B57}, @@ -6079,15 +6178,15 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x1F239, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5272}, {0x1F23A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x55B6}, {0x1F23B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x914D}, - {0x1F240, 0, 3 | DECOMP_COMPAT, 4960}, - {0x1F241, 0, 3 | DECOMP_COMPAT, 4963}, - {0x1F242, 0, 3 | DECOMP_COMPAT, 4966}, - {0x1F243, 0, 3 | DECOMP_COMPAT, 4969}, - {0x1F244, 0, 3 | DECOMP_COMPAT, 4972}, - {0x1F245, 0, 3 | DECOMP_COMPAT, 4975}, - {0x1F246, 0, 3 | DECOMP_COMPAT, 4978}, - {0x1F247, 0, 3 | DECOMP_COMPAT, 4981}, - {0x1F248, 0, 3 | DECOMP_COMPAT, 4984}, + {0x1F240, 0, 3 | DECOMP_COMPAT, 4966}, + {0x1F241, 0, 3 | DECOMP_COMPAT, 4969}, + {0x1F242, 0, 3 | DECOMP_COMPAT, 4972}, + {0x1F243, 0, 3 | DECOMP_COMPAT, 4975}, + {0x1F244, 0, 3 | DECOMP_COMPAT, 4978}, + {0x1F245, 0, 3 | DECOMP_COMPAT, 4981}, + {0x1F246, 0, 3 | DECOMP_COMPAT, 4984}, + {0x1F247, 0, 3 | DECOMP_COMPAT, 4987}, + {0x1F248, 0, 3 | DECOMP_COMPAT, 4990}, {0x1F250, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5F97}, {0x1F251, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x53EF}, {0x1FBF0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0030}, @@ -6103,7 +6202,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F800, 0, 1 | DECOMP_INLINE, 0x4E3D}, {0x2F801, 0, 1 | DECOMP_INLINE, 0x4E38}, {0x2F802, 0, 1 | DECOMP_INLINE, 0x4E41}, - {0x2F803, 0, 1, 4987}, + {0x2F803, 0, 1, 4993}, {0x2F804, 0, 1 | DECOMP_INLINE, 0x4F60}, {0x2F805, 0, 1 | DECOMP_INLINE, 0x4FAE}, {0x2F806, 0, 1 | DECOMP_INLINE, 0x4FBB}, @@ -6113,22 +6212,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F80A, 0, 1 | DECOMP_INLINE, 0x50E7}, {0x2F80B, 0, 1 | DECOMP_INLINE, 0x50CF}, {0x2F80C, 0, 1 | DECOMP_INLINE, 0x349E}, - {0x2F80D, 0, 1, 4988}, + {0x2F80D, 0, 1, 4994}, {0x2F80E, 0, 1 | DECOMP_INLINE, 0x514D}, {0x2F80F, 0, 1 | DECOMP_INLINE, 0x5154}, {0x2F810, 0, 1 | DECOMP_INLINE, 0x5164}, {0x2F811, 0, 1 | DECOMP_INLINE, 0x5177}, - {0x2F812, 0, 1, 4989}, + {0x2F812, 0, 1, 4995}, {0x2F813, 0, 1 | DECOMP_INLINE, 0x34B9}, {0x2F814, 0, 1 | DECOMP_INLINE, 0x5167}, {0x2F815, 0, 1 | DECOMP_INLINE, 0x518D}, - {0x2F816, 0, 1, 4990}, + {0x2F816, 0, 1, 4996}, {0x2F817, 0, 1 | DECOMP_INLINE, 0x5197}, {0x2F818, 0, 1 | DECOMP_INLINE, 0x51A4}, {0x2F819, 0, 1 | DECOMP_INLINE, 0x4ECC}, {0x2F81A, 0, 1 | DECOMP_INLINE, 0x51AC}, {0x2F81B, 0, 1 | DECOMP_INLINE, 0x51B5}, - {0x2F81C, 0, 1, 4991}, + {0x2F81C, 0, 1, 4997}, {0x2F81D, 0, 1 | DECOMP_INLINE, 0x51F5}, {0x2F81E, 0, 1 | DECOMP_INLINE, 0x5203}, {0x2F81F, 0, 1 | DECOMP_INLINE, 0x34DF}, @@ -6152,11 +6251,11 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F831, 0, 1 | DECOMP_INLINE, 0x537F}, {0x2F832, 0, 1 | DECOMP_INLINE, 0x537F}, {0x2F833, 0, 1 | DECOMP_INLINE, 0x537F}, - {0x2F834, 0, 1, 4992}, + {0x2F834, 0, 1, 4998}, {0x2F835, 0, 1 | DECOMP_INLINE, 0x7070}, {0x2F836, 0, 1 | DECOMP_INLINE, 0x53CA}, {0x2F837, 0, 1 | DECOMP_INLINE, 0x53DF}, - {0x2F838, 0, 1, 4993}, + {0x2F838, 0, 1, 4999}, {0x2F839, 0, 1 | DECOMP_INLINE, 0x53EB}, {0x2F83A, 0, 1 | DECOMP_INLINE, 0x53F1}, {0x2F83B, 0, 1 | DECOMP_INLINE, 0x5406}, @@ -6189,15 +6288,15 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F856, 0, 1 | DECOMP_INLINE, 0x5832}, {0x2F857, 0, 1 | DECOMP_INLINE, 0x5831}, {0x2F858, 0, 1 | DECOMP_INLINE, 0x58AC}, - {0x2F859, 0, 1, 4994}, + {0x2F859, 0, 1, 5000}, {0x2F85A, 0, 1 | DECOMP_INLINE, 0x58F2}, {0x2F85B, 0, 1 | DECOMP_INLINE, 0x58F7}, {0x2F85C, 0, 1 | DECOMP_INLINE, 0x5906}, {0x2F85D, 0, 1 | DECOMP_INLINE, 0x591A}, {0x2F85E, 0, 1 | DECOMP_INLINE, 0x5922}, {0x2F85F, 0, 1 | DECOMP_INLINE, 0x5962}, - {0x2F860, 0, 1, 4995}, - {0x2F861, 0, 1, 4996}, + {0x2F860, 0, 1, 5001}, + {0x2F861, 0, 1, 5002}, {0x2F862, 0, 1 | DECOMP_INLINE, 0x59EC}, {0x2F863, 0, 1 | DECOMP_INLINE, 0x5A1B}, {0x2F864, 0, 1 | DECOMP_INLINE, 0x5A27}, @@ -6208,12 +6307,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F869, 0, 1 | DECOMP_INLINE, 0x5B08}, {0x2F86A, 0, 1 | DECOMP_INLINE, 0x5B3E}, {0x2F86B, 0, 1 | DECOMP_INLINE, 0x5B3E}, - {0x2F86C, 0, 1, 4997}, + {0x2F86C, 0, 1, 5003}, {0x2F86D, 0, 1 | DECOMP_INLINE, 0x5BC3}, {0x2F86E, 0, 1 | DECOMP_INLINE, 0x5BD8}, {0x2F86F, 0, 1 | DECOMP_INLINE, 0x5BE7}, {0x2F870, 0, 1 | DECOMP_INLINE, 0x5BF3}, - {0x2F871, 0, 1, 4998}, + {0x2F871, 0, 1, 5004}, {0x2F872, 0, 1 | DECOMP_INLINE, 0x5BFF}, {0x2F873, 0, 1 | DECOMP_INLINE, 0x5C06}, {0x2F874, 0, 1 | DECOMP_INLINE, 0x5F53}, @@ -6223,9 +6322,9 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F878, 0, 1 | DECOMP_INLINE, 0x5C6E}, {0x2F879, 0, 1 | DECOMP_INLINE, 0x5CC0}, {0x2F87A, 0, 1 | DECOMP_INLINE, 0x5C8D}, - {0x2F87B, 0, 1, 4999}, + {0x2F87B, 0, 1, 5005}, {0x2F87C, 0, 1 | DECOMP_INLINE, 0x5D43}, - {0x2F87D, 0, 1, 5000}, + {0x2F87D, 0, 1, 5006}, {0x2F87E, 0, 1 | DECOMP_INLINE, 0x5D6E}, {0x2F87F, 0, 1 | DECOMP_INLINE, 0x5D6B}, {0x2F880, 0, 1 | DECOMP_INLINE, 0x5D7C}, @@ -6237,22 +6336,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F886, 0, 1 | DECOMP_INLINE, 0x5E3D}, {0x2F887, 0, 1 | DECOMP_INLINE, 0x5E69}, {0x2F888, 0, 1 | DECOMP_INLINE, 0x3862}, - {0x2F889, 0, 1, 5001}, + {0x2F889, 0, 1, 5007}, {0x2F88A, 0, 1 | DECOMP_INLINE, 0x387C}, {0x2F88B, 0, 1 | DECOMP_INLINE, 0x5EB0}, {0x2F88C, 0, 1 | DECOMP_INLINE, 0x5EB3}, {0x2F88D, 0, 1 | DECOMP_INLINE, 0x5EB6}, {0x2F88E, 0, 1 | DECOMP_INLINE, 0x5ECA}, - {0x2F88F, 0, 1, 5002}, + {0x2F88F, 0, 1, 5008}, {0x2F890, 0, 1 | DECOMP_INLINE, 0x5EFE}, - {0x2F891, 0, 1, 5003}, - {0x2F892, 0, 1, 5004}, + {0x2F891, 0, 1, 5009}, + {0x2F892, 0, 1, 5010}, {0x2F893, 0, 1 | DECOMP_INLINE, 0x8201}, {0x2F894, 0, 1 | DECOMP_INLINE, 0x5F22}, {0x2F895, 0, 1 | DECOMP_INLINE, 0x5F22}, {0x2F896, 0, 1 | DECOMP_INLINE, 0x38C7}, - {0x2F897, 0, 1, 5005}, - {0x2F898, 0, 1, 5006}, + {0x2F897, 0, 1, 5011}, + {0x2F898, 0, 1, 5012}, {0x2F899, 0, 1 | DECOMP_INLINE, 0x5F62}, {0x2F89A, 0, 1 | DECOMP_INLINE, 0x5F6B}, {0x2F89B, 0, 1 | DECOMP_INLINE, 0x38E3}, @@ -6264,7 +6363,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F8A1, 0, 1 | DECOMP_INLINE, 0x393A}, {0x2F8A2, 0, 1 | DECOMP_INLINE, 0x391C}, {0x2F8A3, 0, 1 | DECOMP_INLINE, 0x6094}, - {0x2F8A4, 0, 1, 5007}, + {0x2F8A4, 0, 1, 5013}, {0x2F8A5, 0, 1 | DECOMP_INLINE, 0x60C7}, {0x2F8A6, 0, 1 | DECOMP_INLINE, 0x6148}, {0x2F8A7, 0, 1 | DECOMP_INLINE, 0x614C}, @@ -6284,13 +6383,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F8B5, 0, 1 | DECOMP_INLINE, 0x62B1}, {0x2F8B6, 0, 1 | DECOMP_INLINE, 0x62D4}, {0x2F8B7, 0, 1 | DECOMP_INLINE, 0x6350}, - {0x2F8B8, 0, 1, 5008}, + {0x2F8B8, 0, 1, 5014}, {0x2F8B9, 0, 1 | DECOMP_INLINE, 0x633D}, {0x2F8BA, 0, 1 | DECOMP_INLINE, 0x62FC}, {0x2F8BB, 0, 1 | DECOMP_INLINE, 0x6368}, {0x2F8BC, 0, 1 | DECOMP_INLINE, 0x6383}, {0x2F8BD, 0, 1 | DECOMP_INLINE, 0x63E4}, - {0x2F8BE, 0, 1, 5009}, + {0x2F8BE, 0, 1, 5015}, {0x2F8BF, 0, 1 | DECOMP_INLINE, 0x6422}, {0x2F8C0, 0, 1 | DECOMP_INLINE, 0x63C5}, {0x2F8C1, 0, 1 | DECOMP_INLINE, 0x63A9}, @@ -6302,7 +6401,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F8C7, 0, 1 | DECOMP_INLINE, 0x3A6C}, {0x2F8C8, 0, 1 | DECOMP_INLINE, 0x654F}, {0x2F8C9, 0, 1 | DECOMP_INLINE, 0x656C}, - {0x2F8CA, 0, 1, 5010}, + {0x2F8CA, 0, 1, 5016}, {0x2F8CB, 0, 1 | DECOMP_INLINE, 0x65E3}, {0x2F8CC, 0, 1 | DECOMP_INLINE, 0x66F8}, {0x2F8CD, 0, 1 | DECOMP_INLINE, 0x6649}, @@ -6321,13 +6420,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F8DA, 0, 1 | DECOMP_INLINE, 0x6721}, {0x2F8DB, 0, 1 | DECOMP_INLINE, 0x675E}, {0x2F8DC, 0, 1 | DECOMP_INLINE, 0x6753}, - {0x2F8DD, 0, 1, 5011}, + {0x2F8DD, 0, 1, 5017}, {0x2F8DE, 0, 1 | DECOMP_INLINE, 0x3B49}, {0x2F8DF, 0, 1 | DECOMP_INLINE, 0x67FA}, {0x2F8E0, 0, 1 | DECOMP_INLINE, 0x6785}, {0x2F8E1, 0, 1 | DECOMP_INLINE, 0x6852}, {0x2F8E2, 0, 1 | DECOMP_INLINE, 0x6885}, - {0x2F8E3, 0, 1, 5012}, + {0x2F8E3, 0, 1, 5018}, {0x2F8E4, 0, 1 | DECOMP_INLINE, 0x688E}, {0x2F8E5, 0, 1 | DECOMP_INLINE, 0x681F}, {0x2F8E6, 0, 1 | DECOMP_INLINE, 0x6914}, @@ -6336,22 +6435,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F8E9, 0, 1 | DECOMP_INLINE, 0x69A3}, {0x2F8EA, 0, 1 | DECOMP_INLINE, 0x69EA}, {0x2F8EB, 0, 1 | DECOMP_INLINE, 0x6AA8}, - {0x2F8EC, 0, 1, 5013}, + {0x2F8EC, 0, 1, 5019}, {0x2F8ED, 0, 1 | DECOMP_INLINE, 0x6ADB}, {0x2F8EE, 0, 1 | DECOMP_INLINE, 0x3C18}, {0x2F8EF, 0, 1 | DECOMP_INLINE, 0x6B21}, - {0x2F8F0, 0, 1, 5014}, + {0x2F8F0, 0, 1, 5020}, {0x2F8F1, 0, 1 | DECOMP_INLINE, 0x6B54}, {0x2F8F2, 0, 1 | DECOMP_INLINE, 0x3C4E}, {0x2F8F3, 0, 1 | DECOMP_INLINE, 0x6B72}, {0x2F8F4, 0, 1 | DECOMP_INLINE, 0x6B9F}, {0x2F8F5, 0, 1 | DECOMP_INLINE, 0x6BBA}, {0x2F8F6, 0, 1 | DECOMP_INLINE, 0x6BBB}, - {0x2F8F7, 0, 1, 5015}, - {0x2F8F8, 0, 1, 5016}, - {0x2F8F9, 0, 1, 5017}, + {0x2F8F7, 0, 1, 5021}, + {0x2F8F8, 0, 1, 5022}, + {0x2F8F9, 0, 1, 5023}, {0x2F8FA, 0, 1 | DECOMP_INLINE, 0x6C4E}, - {0x2F8FB, 0, 1, 5018}, + {0x2F8FB, 0, 1, 5024}, {0x2F8FC, 0, 1 | DECOMP_INLINE, 0x6CBF}, {0x2F8FD, 0, 1 | DECOMP_INLINE, 0x6CCD}, {0x2F8FE, 0, 1 | DECOMP_INLINE, 0x6C67}, @@ -6362,18 +6461,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F903, 0, 1 | DECOMP_INLINE, 0x6D69}, {0x2F904, 0, 1 | DECOMP_INLINE, 0x6D78}, {0x2F905, 0, 1 | DECOMP_INLINE, 0x6D85}, - {0x2F906, 0, 1, 5019}, + {0x2F906, 0, 1, 5025}, {0x2F907, 0, 1 | DECOMP_INLINE, 0x6D34}, {0x2F908, 0, 1 | DECOMP_INLINE, 0x6E2F}, {0x2F909, 0, 1 | DECOMP_INLINE, 0x6E6E}, {0x2F90A, 0, 1 | DECOMP_INLINE, 0x3D33}, {0x2F90B, 0, 1 | DECOMP_INLINE, 0x6ECB}, {0x2F90C, 0, 1 | DECOMP_INLINE, 0x6EC7}, - {0x2F90D, 0, 1, 5020}, + {0x2F90D, 0, 1, 5026}, {0x2F90E, 0, 1 | DECOMP_INLINE, 0x6DF9}, {0x2F90F, 0, 1 | DECOMP_INLINE, 0x6F6E}, - {0x2F910, 0, 1, 5021}, - {0x2F911, 0, 1, 5022}, + {0x2F910, 0, 1, 5027}, + {0x2F911, 0, 1, 5028}, {0x2F912, 0, 1 | DECOMP_INLINE, 0x6FC6}, {0x2F913, 0, 1 | DECOMP_INLINE, 0x7039}, {0x2F914, 0, 1 | DECOMP_INLINE, 0x701E}, @@ -6383,19 +6482,19 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F918, 0, 1 | DECOMP_INLINE, 0x707D}, {0x2F919, 0, 1 | DECOMP_INLINE, 0x7077}, {0x2F91A, 0, 1 | DECOMP_INLINE, 0x70AD}, - {0x2F91B, 0, 1, 5023}, + {0x2F91B, 0, 1, 5029}, {0x2F91C, 0, 1 | DECOMP_INLINE, 0x7145}, - {0x2F91D, 0, 1, 5024}, + {0x2F91D, 0, 1, 5030}, {0x2F91E, 0, 1 | DECOMP_INLINE, 0x719C}, - {0x2F91F, 0, 1, 5025}, + {0x2F91F, 0, 1, 5031}, {0x2F920, 0, 1 | DECOMP_INLINE, 0x7228}, {0x2F921, 0, 1 | DECOMP_INLINE, 0x7235}, {0x2F922, 0, 1 | DECOMP_INLINE, 0x7250}, - {0x2F923, 0, 1, 5026}, + {0x2F923, 0, 1, 5032}, {0x2F924, 0, 1 | DECOMP_INLINE, 0x7280}, {0x2F925, 0, 1 | DECOMP_INLINE, 0x7295}, - {0x2F926, 0, 1, 5027}, - {0x2F927, 0, 1, 5028}, + {0x2F926, 0, 1, 5033}, + {0x2F927, 0, 1, 5034}, {0x2F928, 0, 1 | DECOMP_INLINE, 0x737A}, {0x2F929, 0, 1 | DECOMP_INLINE, 0x738B}, {0x2F92A, 0, 1 | DECOMP_INLINE, 0x3EAC}, @@ -6409,22 +6508,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F932, 0, 1 | DECOMP_INLINE, 0x74CA}, {0x2F933, 0, 1 | DECOMP_INLINE, 0x3F1B}, {0x2F934, 0, 1 | DECOMP_INLINE, 0x7524}, - {0x2F935, 0, 1, 5029}, + {0x2F935, 0, 1, 5035}, {0x2F936, 0, 1 | DECOMP_INLINE, 0x753E}, - {0x2F937, 0, 1, 5030}, + {0x2F937, 0, 1, 5036}, {0x2F938, 0, 1 | DECOMP_INLINE, 0x7570}, - {0x2F939, 0, 1, 5031}, + {0x2F939, 0, 1, 5037}, {0x2F93A, 0, 1 | DECOMP_INLINE, 0x7610}, - {0x2F93B, 0, 1, 5032}, - {0x2F93C, 0, 1, 5033}, - {0x2F93D, 0, 1, 5034}, + {0x2F93B, 0, 1, 5038}, + {0x2F93C, 0, 1, 5039}, + {0x2F93D, 0, 1, 5040}, {0x2F93E, 0, 1 | DECOMP_INLINE, 0x3FFC}, {0x2F93F, 0, 1 | DECOMP_INLINE, 0x4008}, {0x2F940, 0, 1 | DECOMP_INLINE, 0x76F4}, - {0x2F941, 0, 1, 5035}, - {0x2F942, 0, 1, 5036}, - {0x2F943, 0, 1, 5037}, - {0x2F944, 0, 1, 5038}, + {0x2F941, 0, 1, 5041}, + {0x2F942, 0, 1, 5042}, + {0x2F943, 0, 1, 5043}, + {0x2F944, 0, 1, 5044}, {0x2F945, 0, 1 | DECOMP_INLINE, 0x771E}, {0x2F946, 0, 1 | DECOMP_INLINE, 0x771F}, {0x2F947, 0, 1 | DECOMP_INLINE, 0x771F}, @@ -6433,68 +6532,68 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F94A, 0, 1 | DECOMP_INLINE, 0x778B}, {0x2F94B, 0, 1 | DECOMP_INLINE, 0x4046}, {0x2F94C, 0, 1 | DECOMP_INLINE, 0x4096}, - {0x2F94D, 0, 1, 5039}, + {0x2F94D, 0, 1, 5045}, {0x2F94E, 0, 1 | DECOMP_INLINE, 0x784E}, {0x2F94F, 0, 1 | DECOMP_INLINE, 0x788C}, {0x2F950, 0, 1 | DECOMP_INLINE, 0x78CC}, {0x2F951, 0, 1 | DECOMP_INLINE, 0x40E3}, - {0x2F952, 0, 1, 5040}, + {0x2F952, 0, 1, 5046}, {0x2F953, 0, 1 | DECOMP_INLINE, 0x7956}, - {0x2F954, 0, 1, 5041}, - {0x2F955, 0, 1, 5042}, + {0x2F954, 0, 1, 5047}, + {0x2F955, 0, 1, 5048}, {0x2F956, 0, 1 | DECOMP_INLINE, 0x798F}, {0x2F957, 0, 1 | DECOMP_INLINE, 0x79EB}, {0x2F958, 0, 1 | DECOMP_INLINE, 0x412F}, {0x2F959, 0, 1 | DECOMP_INLINE, 0x7A40}, {0x2F95A, 0, 1 | DECOMP_INLINE, 0x7A4A}, {0x2F95B, 0, 1 | DECOMP_INLINE, 0x7A4F}, - {0x2F95C, 0, 1, 5043}, - {0x2F95D, 0, 1, 5044}, - {0x2F95E, 0, 1, 5045}, + {0x2F95C, 0, 1, 5049}, + {0x2F95D, 0, 1, 5050}, + {0x2F95E, 0, 1, 5051}, {0x2F95F, 0, 1 | DECOMP_INLINE, 0x7AEE}, {0x2F960, 0, 1 | DECOMP_INLINE, 0x4202}, - {0x2F961, 0, 1, 5046}, + {0x2F961, 0, 1, 5052}, {0x2F962, 0, 1 | DECOMP_INLINE, 0x7BC6}, {0x2F963, 0, 1 | DECOMP_INLINE, 0x7BC9}, {0x2F964, 0, 1 | DECOMP_INLINE, 0x4227}, - {0x2F965, 0, 1, 5047}, + {0x2F965, 0, 1, 5053}, {0x2F966, 0, 1 | DECOMP_INLINE, 0x7CD2}, {0x2F967, 0, 1 | DECOMP_INLINE, 0x42A0}, {0x2F968, 0, 1 | DECOMP_INLINE, 0x7CE8}, {0x2F969, 0, 1 | DECOMP_INLINE, 0x7CE3}, {0x2F96A, 0, 1 | DECOMP_INLINE, 0x7D00}, - {0x2F96B, 0, 1, 5048}, + {0x2F96B, 0, 1, 5054}, {0x2F96C, 0, 1 | DECOMP_INLINE, 0x7D63}, {0x2F96D, 0, 1 | DECOMP_INLINE, 0x4301}, {0x2F96E, 0, 1 | DECOMP_INLINE, 0x7DC7}, {0x2F96F, 0, 1 | DECOMP_INLINE, 0x7E02}, {0x2F970, 0, 1 | DECOMP_INLINE, 0x7E45}, {0x2F971, 0, 1 | DECOMP_INLINE, 0x4334}, - {0x2F972, 0, 1, 5049}, - {0x2F973, 0, 1, 5050}, + {0x2F972, 0, 1, 5055}, + {0x2F973, 0, 1, 5056}, {0x2F974, 0, 1 | DECOMP_INLINE, 0x4359}, - {0x2F975, 0, 1, 5051}, + {0x2F975, 0, 1, 5057}, {0x2F976, 0, 1 | DECOMP_INLINE, 0x7F7A}, - {0x2F977, 0, 1, 5052}, + {0x2F977, 0, 1, 5058}, {0x2F978, 0, 1 | DECOMP_INLINE, 0x7F95}, {0x2F979, 0, 1 | DECOMP_INLINE, 0x7FFA}, {0x2F97A, 0, 1 | DECOMP_INLINE, 0x8005}, - {0x2F97B, 0, 1, 5053}, - {0x2F97C, 0, 1, 5054}, + {0x2F97B, 0, 1, 5059}, + {0x2F97C, 0, 1, 5060}, {0x2F97D, 0, 1 | DECOMP_INLINE, 0x8060}, - {0x2F97E, 0, 1, 5055}, + {0x2F97E, 0, 1, 5061}, {0x2F97F, 0, 1 | DECOMP_INLINE, 0x8070}, - {0x2F980, 0, 1, 5056}, + {0x2F980, 0, 1, 5062}, {0x2F981, 0, 1 | DECOMP_INLINE, 0x43D5}, {0x2F982, 0, 1 | DECOMP_INLINE, 0x80B2}, {0x2F983, 0, 1 | DECOMP_INLINE, 0x8103}, {0x2F984, 0, 1 | DECOMP_INLINE, 0x440B}, {0x2F985, 0, 1 | DECOMP_INLINE, 0x813E}, {0x2F986, 0, 1 | DECOMP_INLINE, 0x5AB5}, - {0x2F987, 0, 1, 5057}, - {0x2F988, 0, 1, 5058}, - {0x2F989, 0, 1, 5059}, - {0x2F98A, 0, 1, 5060}, + {0x2F987, 0, 1, 5063}, + {0x2F988, 0, 1, 5064}, + {0x2F989, 0, 1, 5065}, + {0x2F98A, 0, 1, 5066}, {0x2F98B, 0, 1 | DECOMP_INLINE, 0x8201}, {0x2F98C, 0, 1 | DECOMP_INLINE, 0x8204}, {0x2F98D, 0, 1 | DECOMP_INLINE, 0x8F9E}, @@ -6507,7 +6606,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F994, 0, 1 | DECOMP_INLINE, 0x82B3}, {0x2F995, 0, 1 | DECOMP_INLINE, 0x82BD}, {0x2F996, 0, 1 | DECOMP_INLINE, 0x82E6}, - {0x2F997, 0, 1, 5061}, + {0x2F997, 0, 1, 5067}, {0x2F998, 0, 1 | DECOMP_INLINE, 0x82E5}, {0x2F999, 0, 1 | DECOMP_INLINE, 0x831D}, {0x2F99A, 0, 1 | DECOMP_INLINE, 0x8363}, @@ -6520,20 +6619,20 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F9A1, 0, 1 | DECOMP_INLINE, 0x83CA}, {0x2F9A2, 0, 1 | DECOMP_INLINE, 0x83CC}, {0x2F9A3, 0, 1 | DECOMP_INLINE, 0x83DC}, - {0x2F9A4, 0, 1, 5062}, - {0x2F9A5, 0, 1, 5063}, - {0x2F9A6, 0, 1, 5064}, + {0x2F9A4, 0, 1, 5068}, + {0x2F9A5, 0, 1, 5069}, + {0x2F9A6, 0, 1, 5070}, {0x2F9A7, 0, 1 | DECOMP_INLINE, 0x452B}, {0x2F9A8, 0, 1 | DECOMP_INLINE, 0x84F1}, {0x2F9A9, 0, 1 | DECOMP_INLINE, 0x84F3}, {0x2F9AA, 0, 1 | DECOMP_INLINE, 0x8516}, - {0x2F9AB, 0, 1, 5065}, + {0x2F9AB, 0, 1, 5071}, {0x2F9AC, 0, 1 | DECOMP_INLINE, 0x8564}, - {0x2F9AD, 0, 1, 5066}, + {0x2F9AD, 0, 1, 5072}, {0x2F9AE, 0, 1 | DECOMP_INLINE, 0x455D}, {0x2F9AF, 0, 1 | DECOMP_INLINE, 0x4561}, - {0x2F9B0, 0, 1, 5067}, - {0x2F9B1, 0, 1, 5068}, + {0x2F9B0, 0, 1, 5073}, + {0x2F9B1, 0, 1, 5074}, {0x2F9B2, 0, 1 | DECOMP_INLINE, 0x456B}, {0x2F9B3, 0, 1 | DECOMP_INLINE, 0x8650}, {0x2F9B4, 0, 1 | DECOMP_INLINE, 0x865C}, @@ -6553,39 +6652,39 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F9C2, 0, 1 | DECOMP_INLINE, 0x45F9}, {0x2F9C3, 0, 1 | DECOMP_INLINE, 0x8860}, {0x2F9C4, 0, 1 | DECOMP_INLINE, 0x8863}, - {0x2F9C5, 0, 1, 5069}, + {0x2F9C5, 0, 1, 5075}, {0x2F9C6, 0, 1 | DECOMP_INLINE, 0x88D7}, {0x2F9C7, 0, 1 | DECOMP_INLINE, 0x88DE}, {0x2F9C8, 0, 1 | DECOMP_INLINE, 0x4635}, {0x2F9C9, 0, 1 | DECOMP_INLINE, 0x88FA}, {0x2F9CA, 0, 1 | DECOMP_INLINE, 0x34BB}, - {0x2F9CB, 0, 1, 5070}, - {0x2F9CC, 0, 1, 5071}, + {0x2F9CB, 0, 1, 5076}, + {0x2F9CC, 0, 1, 5077}, {0x2F9CD, 0, 1 | DECOMP_INLINE, 0x46BE}, {0x2F9CE, 0, 1 | DECOMP_INLINE, 0x46C7}, {0x2F9CF, 0, 1 | DECOMP_INLINE, 0x8AA0}, {0x2F9D0, 0, 1 | DECOMP_INLINE, 0x8AED}, {0x2F9D1, 0, 1 | DECOMP_INLINE, 0x8B8A}, {0x2F9D2, 0, 1 | DECOMP_INLINE, 0x8C55}, - {0x2F9D3, 0, 1, 5072}, + {0x2F9D3, 0, 1, 5078}, {0x2F9D4, 0, 1 | DECOMP_INLINE, 0x8CAB}, {0x2F9D5, 0, 1 | DECOMP_INLINE, 0x8CC1}, {0x2F9D6, 0, 1 | DECOMP_INLINE, 0x8D1B}, {0x2F9D7, 0, 1 | DECOMP_INLINE, 0x8D77}, - {0x2F9D8, 0, 1, 5073}, - {0x2F9D9, 0, 1, 5074}, + {0x2F9D8, 0, 1, 5079}, + {0x2F9D9, 0, 1, 5080}, {0x2F9DA, 0, 1 | DECOMP_INLINE, 0x8DCB}, {0x2F9DB, 0, 1 | DECOMP_INLINE, 0x8DBC}, {0x2F9DC, 0, 1 | DECOMP_INLINE, 0x8DF0}, - {0x2F9DD, 0, 1, 5075}, + {0x2F9DD, 0, 1, 5081}, {0x2F9DE, 0, 1 | DECOMP_INLINE, 0x8ED4}, {0x2F9DF, 0, 1 | DECOMP_INLINE, 0x8F38}, - {0x2F9E0, 0, 1, 5076}, - {0x2F9E1, 0, 1, 5077}, + {0x2F9E0, 0, 1, 5082}, + {0x2F9E1, 0, 1, 5083}, {0x2F9E2, 0, 1 | DECOMP_INLINE, 0x9094}, {0x2F9E3, 0, 1 | DECOMP_INLINE, 0x90F1}, {0x2F9E4, 0, 1 | DECOMP_INLINE, 0x9111}, - {0x2F9E5, 0, 1, 5078}, + {0x2F9E5, 0, 1, 5084}, {0x2F9E6, 0, 1 | DECOMP_INLINE, 0x911B}, {0x2F9E7, 0, 1 | DECOMP_INLINE, 0x9238}, {0x2F9E8, 0, 1 | DECOMP_INLINE, 0x92D7}, @@ -6593,27 +6692,27 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2F9EA, 0, 1 | DECOMP_INLINE, 0x927C}, {0x2F9EB, 0, 1 | DECOMP_INLINE, 0x93F9}, {0x2F9EC, 0, 1 | DECOMP_INLINE, 0x9415}, - {0x2F9ED, 0, 1, 5079}, + {0x2F9ED, 0, 1, 5085}, {0x2F9EE, 0, 1 | DECOMP_INLINE, 0x958B}, {0x2F9EF, 0, 1 | DECOMP_INLINE, 0x4995}, {0x2F9F0, 0, 1 | DECOMP_INLINE, 0x95B7}, - {0x2F9F1, 0, 1, 5080}, + {0x2F9F1, 0, 1, 5086}, {0x2F9F2, 0, 1 | DECOMP_INLINE, 0x49E6}, {0x2F9F3, 0, 1 | DECOMP_INLINE, 0x96C3}, {0x2F9F4, 0, 1 | DECOMP_INLINE, 0x5DB2}, {0x2F9F5, 0, 1 | DECOMP_INLINE, 0x9723}, - {0x2F9F6, 0, 1, 5081}, - {0x2F9F7, 0, 1, 5082}, + {0x2F9F6, 0, 1, 5087}, + {0x2F9F7, 0, 1, 5088}, {0x2F9F8, 0, 1 | DECOMP_INLINE, 0x4A6E}, {0x2F9F9, 0, 1 | DECOMP_INLINE, 0x4A76}, {0x2F9FA, 0, 1 | DECOMP_INLINE, 0x97E0}, - {0x2F9FB, 0, 1, 5083}, + {0x2F9FB, 0, 1, 5089}, {0x2F9FC, 0, 1 | DECOMP_INLINE, 0x4AB2}, - {0x2F9FD, 0, 1, 5084}, + {0x2F9FD, 0, 1, 5090}, {0x2F9FE, 0, 1 | DECOMP_INLINE, 0x980B}, {0x2F9FF, 0, 1 | DECOMP_INLINE, 0x980B}, {0x2FA00, 0, 1 | DECOMP_INLINE, 0x9829}, - {0x2FA01, 0, 1, 5085}, + {0x2FA01, 0, 1, 5091}, {0x2FA02, 0, 1 | DECOMP_INLINE, 0x98E2}, {0x2FA03, 0, 1 | DECOMP_INLINE, 0x4B33}, {0x2FA04, 0, 1 | DECOMP_INLINE, 0x9929}, @@ -6621,18 +6720,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2FA06, 0, 1 | DECOMP_INLINE, 0x99C2}, {0x2FA07, 0, 1 | DECOMP_INLINE, 0x99FE}, {0x2FA08, 0, 1 | DECOMP_INLINE, 0x4BCE}, - {0x2FA09, 0, 1, 5086}, + {0x2FA09, 0, 1, 5092}, {0x2FA0A, 0, 1 | DECOMP_INLINE, 0x9B12}, {0x2FA0B, 0, 1 | DECOMP_INLINE, 0x9C40}, {0x2FA0C, 0, 1 | DECOMP_INLINE, 0x9CFD}, {0x2FA0D, 0, 1 | DECOMP_INLINE, 0x4CCE}, {0x2FA0E, 0, 1 | DECOMP_INLINE, 0x4CED}, {0x2FA0F, 0, 1 | DECOMP_INLINE, 0x9D67}, - {0x2FA10, 0, 1, 5087}, + {0x2FA10, 0, 1, 5093}, {0x2FA11, 0, 1 | DECOMP_INLINE, 0x4CF8}, - {0x2FA12, 0, 1, 5088}, - {0x2FA13, 0, 1, 5089}, - {0x2FA14, 0, 1, 5090}, + {0x2FA12, 0, 1, 5094}, + {0x2FA13, 0, 1, 5095}, + {0x2FA14, 0, 1, 5096}, {0x2FA15, 0, 1 | DECOMP_INLINE, 0x9EBB}, {0x2FA16, 0, 1 | DECOMP_INLINE, 0x4D56}, {0x2FA17, 0, 1 | DECOMP_INLINE, 0x9EF9}, @@ -6641,12 +6740,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] = {0x2FA1A, 0, 1 | DECOMP_INLINE, 0x9F0F}, {0x2FA1B, 0, 1 | DECOMP_INLINE, 0x9F16}, {0x2FA1C, 0, 1 | DECOMP_INLINE, 0x9F3B}, - {0x2FA1D, 0, 1, 5091} + {0x2FA1D, 0, 1, 5097} }; /* codepoints array */ -static const uint32 UnicodeDecomp_codepoints[5092] = +static const uint32 UnicodeDecomp_codepoints[5098] = { /* 0 */ 0x0020, 0x0308, /* 2 */ 0x0020, 0x0304, @@ -8742,196 +8841,202 @@ static const uint32 UnicodeDecomp_codepoints[5092] = /* 4770 */ 0x0644, 0x0625, /* 4772 */ 0x0644, 0x0627, /* 4774 */ 0x0644, 0x0627, - /* 4776 */ 0x11099, 0x110BA, - /* 4778 */ 0x1109B, 0x110BA, - /* 4780 */ 0x110A5, 0x110BA, - /* 4782 */ 0x11131, 0x11127, - /* 4784 */ 0x11132, 0x11127, - /* 4786 */ 0x11347, 0x1133E, - /* 4788 */ 0x11347, 0x11357, - /* 4790 */ 0x114B9, 0x114BA, - /* 4792 */ 0x114B9, 0x114B0, - /* 4794 */ 0x114B9, 0x114BD, - /* 4796 */ 0x115B8, 0x115AF, - /* 4798 */ 0x115B9, 0x115AF, - /* 4800 */ 0x11935, 0x11930, - /* 4802 */ 0x1D157, 0x1D165, - /* 4804 */ 0x1D158, 0x1D165, - /* 4806 */ 0x1D15F, 0x1D16E, - /* 4808 */ 0x1D15F, 0x1D16F, - /* 4810 */ 0x1D15F, 0x1D170, - /* 4812 */ 0x1D15F, 0x1D171, - /* 4814 */ 0x1D15F, 0x1D172, - /* 4816 */ 0x1D1B9, 0x1D165, - /* 4818 */ 0x1D1BA, 0x1D165, - /* 4820 */ 0x1D1BB, 0x1D16E, - /* 4822 */ 0x1D1BC, 0x1D16E, - /* 4824 */ 0x1D1BB, 0x1D16F, - /* 4826 */ 0x1D1BC, 0x1D16F, - /* 4828 */ 0x0030, 0x002E, - /* 4830 */ 0x0030, 0x002C, - /* 4832 */ 0x0031, 0x002C, - /* 4834 */ 0x0032, 0x002C, - /* 4836 */ 0x0033, 0x002C, - /* 4838 */ 0x0034, 0x002C, - /* 4840 */ 0x0035, 0x002C, - /* 4842 */ 0x0036, 0x002C, - /* 4844 */ 0x0037, 0x002C, - /* 4846 */ 0x0038, 0x002C, - /* 4848 */ 0x0039, 0x002C, - /* 4850 */ 0x0028, 0x0041, 0x0029, - /* 4853 */ 0x0028, 0x0042, 0x0029, - /* 4856 */ 0x0028, 0x0043, 0x0029, - /* 4859 */ 0x0028, 0x0044, 0x0029, - /* 4862 */ 0x0028, 0x0045, 0x0029, - /* 4865 */ 0x0028, 0x0046, 0x0029, - /* 4868 */ 0x0028, 0x0047, 0x0029, - /* 4871 */ 0x0028, 0x0048, 0x0029, - /* 4874 */ 0x0028, 0x0049, 0x0029, - /* 4877 */ 0x0028, 0x004A, 0x0029, - /* 4880 */ 0x0028, 0x004B, 0x0029, - /* 4883 */ 0x0028, 0x004C, 0x0029, - /* 4886 */ 0x0028, 0x004D, 0x0029, - /* 4889 */ 0x0028, 0x004E, 0x0029, - /* 4892 */ 0x0028, 0x004F, 0x0029, - /* 4895 */ 0x0028, 0x0050, 0x0029, - /* 4898 */ 0x0028, 0x0051, 0x0029, - /* 4901 */ 0x0028, 0x0052, 0x0029, - /* 4904 */ 0x0028, 0x0053, 0x0029, - /* 4907 */ 0x0028, 0x0054, 0x0029, - /* 4910 */ 0x0028, 0x0055, 0x0029, - /* 4913 */ 0x0028, 0x0056, 0x0029, - /* 4916 */ 0x0028, 0x0057, 0x0029, - /* 4919 */ 0x0028, 0x0058, 0x0029, - /* 4922 */ 0x0028, 0x0059, 0x0029, - /* 4925 */ 0x0028, 0x005A, 0x0029, - /* 4928 */ 0x3014, 0x0053, 0x3015, - /* 4931 */ 0x0043, 0x0044, - /* 4933 */ 0x0057, 0x005A, - /* 4935 */ 0x0048, 0x0056, - /* 4937 */ 0x004D, 0x0056, - /* 4939 */ 0x0053, 0x0044, - /* 4941 */ 0x0053, 0x0053, - /* 4943 */ 0x0050, 0x0050, 0x0056, - /* 4946 */ 0x0057, 0x0043, - /* 4948 */ 0x004D, 0x0043, - /* 4950 */ 0x004D, 0x0044, - /* 4952 */ 0x004D, 0x0052, - /* 4954 */ 0x0044, 0x004A, - /* 4956 */ 0x307B, 0x304B, - /* 4958 */ 0x30B3, 0x30B3, - /* 4960 */ 0x3014, 0x672C, 0x3015, - /* 4963 */ 0x3014, 0x4E09, 0x3015, - /* 4966 */ 0x3014, 0x4E8C, 0x3015, - /* 4969 */ 0x3014, 0x5B89, 0x3015, - /* 4972 */ 0x3014, 0x70B9, 0x3015, - /* 4975 */ 0x3014, 0x6253, 0x3015, - /* 4978 */ 0x3014, 0x76D7, 0x3015, - /* 4981 */ 0x3014, 0x52DD, 0x3015, - /* 4984 */ 0x3014, 0x6557, 0x3015, - /* 4987 */ 0x20122, - /* 4988 */ 0x2063A, - /* 4989 */ 0x2051C, - /* 4990 */ 0x2054B, - /* 4991 */ 0x291DF, - /* 4992 */ 0x20A2C, - /* 4993 */ 0x20B63, - /* 4994 */ 0x214E4, - /* 4995 */ 0x216A8, - /* 4996 */ 0x216EA, - /* 4997 */ 0x219C8, - /* 4998 */ 0x21B18, - /* 4999 */ 0x21DE4, - /* 5000 */ 0x21DE6, - /* 5001 */ 0x22183, - /* 5002 */ 0x2A392, - /* 5003 */ 0x22331, - /* 5004 */ 0x22331, - /* 5005 */ 0x232B8, - /* 5006 */ 0x261DA, - /* 5007 */ 0x226D4, - /* 5008 */ 0x22B0C, - /* 5009 */ 0x22BF1, - /* 5010 */ 0x2300A, - /* 5011 */ 0x233C3, - /* 5012 */ 0x2346D, - /* 5013 */ 0x236A3, - /* 5014 */ 0x238A7, - /* 5015 */ 0x23A8D, - /* 5016 */ 0x21D0B, - /* 5017 */ 0x23AFA, - /* 5018 */ 0x23CBC, - /* 5019 */ 0x23D1E, - /* 5020 */ 0x23ED1, - /* 5021 */ 0x23F5E, - /* 5022 */ 0x23F8E, - /* 5023 */ 0x20525, - /* 5024 */ 0x24263, - /* 5025 */ 0x243AB, - /* 5026 */ 0x24608, - /* 5027 */ 0x24735, - /* 5028 */ 0x24814, - /* 5029 */ 0x24C36, - /* 5030 */ 0x24C92, - /* 5031 */ 0x2219F, - /* 5032 */ 0x24FA1, - /* 5033 */ 0x24FB8, - /* 5034 */ 0x25044, - /* 5035 */ 0x250F3, - /* 5036 */ 0x250F2, - /* 5037 */ 0x25119, - /* 5038 */ 0x25133, - /* 5039 */ 0x2541D, - /* 5040 */ 0x25626, - /* 5041 */ 0x2569A, - /* 5042 */ 0x256C5, - /* 5043 */ 0x2597C, - /* 5044 */ 0x25AA7, - /* 5045 */ 0x25AA7, - /* 5046 */ 0x25BAB, - /* 5047 */ 0x25C80, - /* 5048 */ 0x25F86, - /* 5049 */ 0x26228, - /* 5050 */ 0x26247, - /* 5051 */ 0x262D9, - /* 5052 */ 0x2633E, - /* 5053 */ 0x264DA, - /* 5054 */ 0x26523, - /* 5055 */ 0x265A8, - /* 5056 */ 0x2335F, - /* 5057 */ 0x267A7, - /* 5058 */ 0x267B5, - /* 5059 */ 0x23393, - /* 5060 */ 0x2339C, - /* 5061 */ 0x26B3C, - /* 5062 */ 0x26C36, - /* 5063 */ 0x26D6B, - /* 5064 */ 0x26CD5, - /* 5065 */ 0x273CA, - /* 5066 */ 0x26F2C, - /* 5067 */ 0x26FB1, - /* 5068 */ 0x270D2, - /* 5069 */ 0x27667, - /* 5070 */ 0x278AE, - /* 5071 */ 0x27966, - /* 5072 */ 0x27CA8, - /* 5073 */ 0x27F2F, - /* 5074 */ 0x20804, - /* 5075 */ 0x208DE, - /* 5076 */ 0x285D2, - /* 5077 */ 0x285ED, - /* 5078 */ 0x2872E, - /* 5079 */ 0x28BFA, - /* 5080 */ 0x28D77, - /* 5081 */ 0x29145, - /* 5082 */ 0x2921A, - /* 5083 */ 0x2940A, - /* 5084 */ 0x29496, - /* 5085 */ 0x295B6, - /* 5086 */ 0x29B30, - /* 5087 */ 0x2A0CE, - /* 5088 */ 0x2A105, - /* 5089 */ 0x2A20E, - /* 5090 */ 0x2A291, - /* 5091 */ 0x2A600 + /* 4776 */ 0x1DF04, + /* 4777 */ 0x1DF05, + /* 4778 */ 0x1DF06, + /* 4779 */ 0x1DF08, + /* 4780 */ 0x1DF0A, + /* 4781 */ 0x1DF1E, + /* 4782 */ 0x11099, 0x110BA, + /* 4784 */ 0x1109B, 0x110BA, + /* 4786 */ 0x110A5, 0x110BA, + /* 4788 */ 0x11131, 0x11127, + /* 4790 */ 0x11132, 0x11127, + /* 4792 */ 0x11347, 0x1133E, + /* 4794 */ 0x11347, 0x11357, + /* 4796 */ 0x114B9, 0x114BA, + /* 4798 */ 0x114B9, 0x114B0, + /* 4800 */ 0x114B9, 0x114BD, + /* 4802 */ 0x115B8, 0x115AF, + /* 4804 */ 0x115B9, 0x115AF, + /* 4806 */ 0x11935, 0x11930, + /* 4808 */ 0x1D157, 0x1D165, + /* 4810 */ 0x1D158, 0x1D165, + /* 4812 */ 0x1D15F, 0x1D16E, + /* 4814 */ 0x1D15F, 0x1D16F, + /* 4816 */ 0x1D15F, 0x1D170, + /* 4818 */ 0x1D15F, 0x1D171, + /* 4820 */ 0x1D15F, 0x1D172, + /* 4822 */ 0x1D1B9, 0x1D165, + /* 4824 */ 0x1D1BA, 0x1D165, + /* 4826 */ 0x1D1BB, 0x1D16E, + /* 4828 */ 0x1D1BC, 0x1D16E, + /* 4830 */ 0x1D1BB, 0x1D16F, + /* 4832 */ 0x1D1BC, 0x1D16F, + /* 4834 */ 0x0030, 0x002E, + /* 4836 */ 0x0030, 0x002C, + /* 4838 */ 0x0031, 0x002C, + /* 4840 */ 0x0032, 0x002C, + /* 4842 */ 0x0033, 0x002C, + /* 4844 */ 0x0034, 0x002C, + /* 4846 */ 0x0035, 0x002C, + /* 4848 */ 0x0036, 0x002C, + /* 4850 */ 0x0037, 0x002C, + /* 4852 */ 0x0038, 0x002C, + /* 4854 */ 0x0039, 0x002C, + /* 4856 */ 0x0028, 0x0041, 0x0029, + /* 4859 */ 0x0028, 0x0042, 0x0029, + /* 4862 */ 0x0028, 0x0043, 0x0029, + /* 4865 */ 0x0028, 0x0044, 0x0029, + /* 4868 */ 0x0028, 0x0045, 0x0029, + /* 4871 */ 0x0028, 0x0046, 0x0029, + /* 4874 */ 0x0028, 0x0047, 0x0029, + /* 4877 */ 0x0028, 0x0048, 0x0029, + /* 4880 */ 0x0028, 0x0049, 0x0029, + /* 4883 */ 0x0028, 0x004A, 0x0029, + /* 4886 */ 0x0028, 0x004B, 0x0029, + /* 4889 */ 0x0028, 0x004C, 0x0029, + /* 4892 */ 0x0028, 0x004D, 0x0029, + /* 4895 */ 0x0028, 0x004E, 0x0029, + /* 4898 */ 0x0028, 0x004F, 0x0029, + /* 4901 */ 0x0028, 0x0050, 0x0029, + /* 4904 */ 0x0028, 0x0051, 0x0029, + /* 4907 */ 0x0028, 0x0052, 0x0029, + /* 4910 */ 0x0028, 0x0053, 0x0029, + /* 4913 */ 0x0028, 0x0054, 0x0029, + /* 4916 */ 0x0028, 0x0055, 0x0029, + /* 4919 */ 0x0028, 0x0056, 0x0029, + /* 4922 */ 0x0028, 0x0057, 0x0029, + /* 4925 */ 0x0028, 0x0058, 0x0029, + /* 4928 */ 0x0028, 0x0059, 0x0029, + /* 4931 */ 0x0028, 0x005A, 0x0029, + /* 4934 */ 0x3014, 0x0053, 0x3015, + /* 4937 */ 0x0043, 0x0044, + /* 4939 */ 0x0057, 0x005A, + /* 4941 */ 0x0048, 0x0056, + /* 4943 */ 0x004D, 0x0056, + /* 4945 */ 0x0053, 0x0044, + /* 4947 */ 0x0053, 0x0053, + /* 4949 */ 0x0050, 0x0050, 0x0056, + /* 4952 */ 0x0057, 0x0043, + /* 4954 */ 0x004D, 0x0043, + /* 4956 */ 0x004D, 0x0044, + /* 4958 */ 0x004D, 0x0052, + /* 4960 */ 0x0044, 0x004A, + /* 4962 */ 0x307B, 0x304B, + /* 4964 */ 0x30B3, 0x30B3, + /* 4966 */ 0x3014, 0x672C, 0x3015, + /* 4969 */ 0x3014, 0x4E09, 0x3015, + /* 4972 */ 0x3014, 0x4E8C, 0x3015, + /* 4975 */ 0x3014, 0x5B89, 0x3015, + /* 4978 */ 0x3014, 0x70B9, 0x3015, + /* 4981 */ 0x3014, 0x6253, 0x3015, + /* 4984 */ 0x3014, 0x76D7, 0x3015, + /* 4987 */ 0x3014, 0x52DD, 0x3015, + /* 4990 */ 0x3014, 0x6557, 0x3015, + /* 4993 */ 0x20122, + /* 4994 */ 0x2063A, + /* 4995 */ 0x2051C, + /* 4996 */ 0x2054B, + /* 4997 */ 0x291DF, + /* 4998 */ 0x20A2C, + /* 4999 */ 0x20B63, + /* 5000 */ 0x214E4, + /* 5001 */ 0x216A8, + /* 5002 */ 0x216EA, + /* 5003 */ 0x219C8, + /* 5004 */ 0x21B18, + /* 5005 */ 0x21DE4, + /* 5006 */ 0x21DE6, + /* 5007 */ 0x22183, + /* 5008 */ 0x2A392, + /* 5009 */ 0x22331, + /* 5010 */ 0x22331, + /* 5011 */ 0x232B8, + /* 5012 */ 0x261DA, + /* 5013 */ 0x226D4, + /* 5014 */ 0x22B0C, + /* 5015 */ 0x22BF1, + /* 5016 */ 0x2300A, + /* 5017 */ 0x233C3, + /* 5018 */ 0x2346D, + /* 5019 */ 0x236A3, + /* 5020 */ 0x238A7, + /* 5021 */ 0x23A8D, + /* 5022 */ 0x21D0B, + /* 5023 */ 0x23AFA, + /* 5024 */ 0x23CBC, + /* 5025 */ 0x23D1E, + /* 5026 */ 0x23ED1, + /* 5027 */ 0x23F5E, + /* 5028 */ 0x23F8E, + /* 5029 */ 0x20525, + /* 5030 */ 0x24263, + /* 5031 */ 0x243AB, + /* 5032 */ 0x24608, + /* 5033 */ 0x24735, + /* 5034 */ 0x24814, + /* 5035 */ 0x24C36, + /* 5036 */ 0x24C92, + /* 5037 */ 0x2219F, + /* 5038 */ 0x24FA1, + /* 5039 */ 0x24FB8, + /* 5040 */ 0x25044, + /* 5041 */ 0x250F3, + /* 5042 */ 0x250F2, + /* 5043 */ 0x25119, + /* 5044 */ 0x25133, + /* 5045 */ 0x2541D, + /* 5046 */ 0x25626, + /* 5047 */ 0x2569A, + /* 5048 */ 0x256C5, + /* 5049 */ 0x2597C, + /* 5050 */ 0x25AA7, + /* 5051 */ 0x25AA7, + /* 5052 */ 0x25BAB, + /* 5053 */ 0x25C80, + /* 5054 */ 0x25F86, + /* 5055 */ 0x26228, + /* 5056 */ 0x26247, + /* 5057 */ 0x262D9, + /* 5058 */ 0x2633E, + /* 5059 */ 0x264DA, + /* 5060 */ 0x26523, + /* 5061 */ 0x265A8, + /* 5062 */ 0x2335F, + /* 5063 */ 0x267A7, + /* 5064 */ 0x267B5, + /* 5065 */ 0x23393, + /* 5066 */ 0x2339C, + /* 5067 */ 0x26B3C, + /* 5068 */ 0x26C36, + /* 5069 */ 0x26D6B, + /* 5070 */ 0x26CD5, + /* 5071 */ 0x273CA, + /* 5072 */ 0x26F2C, + /* 5073 */ 0x26FB1, + /* 5074 */ 0x270D2, + /* 5075 */ 0x27667, + /* 5076 */ 0x278AE, + /* 5077 */ 0x27966, + /* 5078 */ 0x27CA8, + /* 5079 */ 0x27F2F, + /* 5080 */ 0x20804, + /* 5081 */ 0x208DE, + /* 5082 */ 0x285D2, + /* 5083 */ 0x285ED, + /* 5084 */ 0x2872E, + /* 5085 */ 0x28BFA, + /* 5086 */ 0x28D77, + /* 5087 */ 0x29145, + /* 5088 */ 0x2921A, + /* 5089 */ 0x2940A, + /* 5090 */ 0x29496, + /* 5091 */ 0x295B6, + /* 5092 */ 0x29B30, + /* 5093 */ 0x2A0CE, + /* 5094 */ 0x2A105, + /* 5095 */ 0x2A20E, + /* 5096 */ 0x2A291, + /* 5097 */ 0x2A600 }; diff --git a/third_party/spanner_pg/src/include/common/unicode_normprops_table.h b/third_party/spanner_pg/src/include/common/unicode_normprops_table.h index 8c310f10..2b421cbf 100644 --- a/third_party/spanner_pg/src/include/common/unicode_normprops_table.h +++ b/third_party/spanner_pg/src/include/common/unicode_normprops_table.h @@ -3120,6 +3120,9 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = { {0xA69C, UNICODE_NORM_QC_NO}, {0xA69D, UNICODE_NORM_QC_NO}, {0xA770, UNICODE_NORM_QC_NO}, + {0xA7F2, UNICODE_NORM_QC_NO}, + {0xA7F3, UNICODE_NORM_QC_NO}, + {0xA7F4, UNICODE_NORM_QC_NO}, {0xA7F8, UNICODE_NORM_QC_NO}, {0xA7F9, UNICODE_NORM_QC_NO}, {0xAB5C, UNICODE_NORM_QC_NO}, @@ -4666,6 +4669,62 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = { {0xFFEC, UNICODE_NORM_QC_NO}, {0xFFED, UNICODE_NORM_QC_NO}, {0xFFEE, UNICODE_NORM_QC_NO}, + {0x10781, UNICODE_NORM_QC_NO}, + {0x10782, UNICODE_NORM_QC_NO}, + {0x10783, UNICODE_NORM_QC_NO}, + {0x10784, UNICODE_NORM_QC_NO}, + {0x10785, UNICODE_NORM_QC_NO}, + {0x10787, UNICODE_NORM_QC_NO}, + {0x10788, UNICODE_NORM_QC_NO}, + {0x10789, UNICODE_NORM_QC_NO}, + {0x1078A, UNICODE_NORM_QC_NO}, + {0x1078B, UNICODE_NORM_QC_NO}, + {0x1078C, UNICODE_NORM_QC_NO}, + {0x1078D, UNICODE_NORM_QC_NO}, + {0x1078E, UNICODE_NORM_QC_NO}, + {0x1078F, UNICODE_NORM_QC_NO}, + {0x10790, UNICODE_NORM_QC_NO}, + {0x10791, UNICODE_NORM_QC_NO}, + {0x10792, UNICODE_NORM_QC_NO}, + {0x10793, UNICODE_NORM_QC_NO}, + {0x10794, UNICODE_NORM_QC_NO}, + {0x10795, UNICODE_NORM_QC_NO}, + {0x10796, UNICODE_NORM_QC_NO}, + {0x10797, UNICODE_NORM_QC_NO}, + {0x10798, UNICODE_NORM_QC_NO}, + {0x10799, UNICODE_NORM_QC_NO}, + {0x1079A, UNICODE_NORM_QC_NO}, + {0x1079B, UNICODE_NORM_QC_NO}, + {0x1079C, UNICODE_NORM_QC_NO}, + {0x1079D, UNICODE_NORM_QC_NO}, + {0x1079E, UNICODE_NORM_QC_NO}, + {0x1079F, UNICODE_NORM_QC_NO}, + {0x107A0, UNICODE_NORM_QC_NO}, + {0x107A1, UNICODE_NORM_QC_NO}, + {0x107A2, UNICODE_NORM_QC_NO}, + {0x107A3, UNICODE_NORM_QC_NO}, + {0x107A4, UNICODE_NORM_QC_NO}, + {0x107A5, UNICODE_NORM_QC_NO}, + {0x107A6, UNICODE_NORM_QC_NO}, + {0x107A7, UNICODE_NORM_QC_NO}, + {0x107A8, UNICODE_NORM_QC_NO}, + {0x107A9, UNICODE_NORM_QC_NO}, + {0x107AA, UNICODE_NORM_QC_NO}, + {0x107AB, UNICODE_NORM_QC_NO}, + {0x107AC, UNICODE_NORM_QC_NO}, + {0x107AD, UNICODE_NORM_QC_NO}, + {0x107AE, UNICODE_NORM_QC_NO}, + {0x107AF, UNICODE_NORM_QC_NO}, + {0x107B0, UNICODE_NORM_QC_NO}, + {0x107B2, UNICODE_NORM_QC_NO}, + {0x107B3, UNICODE_NORM_QC_NO}, + {0x107B4, UNICODE_NORM_QC_NO}, + {0x107B5, UNICODE_NORM_QC_NO}, + {0x107B6, UNICODE_NORM_QC_NO}, + {0x107B7, UNICODE_NORM_QC_NO}, + {0x107B8, UNICODE_NORM_QC_NO}, + {0x107B9, UNICODE_NORM_QC_NO}, + {0x107BA, UNICODE_NORM_QC_NO}, {0x110BA, UNICODE_NORM_QC_MAYBE}, {0x11127, UNICODE_NORM_QC_MAYBE}, {0x1133E, UNICODE_NORM_QC_MAYBE}, @@ -6519,70 +6578,12 @@ static const pg_unicode_normprops UnicodeNormProps_NFKC_QC[] = { static int NFKC_QC_hash_func(const void *key) { - static const int16 h[9837] = { - -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472, - -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472, - -2472, -2472, -2472, -2472, -2472, -2472, -2472, -2472, - -2472, -2472, -2472, -2472, -2472, 32767, 32767, 32767, - -2475, -2475, -2475, -2475, -2475, -2475, -2475, -2475, - -2475, -2475, -2475, -2475, -2475, -2475, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 865, 865, 865, 865, 865, 865, 865, - 865, 865, 865, 865, -2255, 32767, -5207, 32767, - -5207, 860, 860, 860, 860, 860, 860, 860, - 860, 860, 4250, 861, 861, 861, 3339, 3339, - 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, - 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, - 32767, 3338, 3338, 3338, 3338, 3338, 3338, 3338, - 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, - 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, - 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, - 3338, 9, 10, 32767, 11, 12, 0, 32767, - 0, 2913, 2914, 2915, 2916, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2917, 32767, 2918, -100, - 2919, 2920, 2921, 840, 840, 840, 2922, 0, - 0, 0, 0, 0, 2206, 0, 2923, 0, - 2924, 2925, 2926, 0, 0, 0, -2590, 0, - 0, 0, 0, 0, 0, 0, 2934, 0, - 2474, 2931, 2932, 0, 0, 0, 0, 0, - 14, 805, 0, 0, 2933, 0, 2934, 0, - 2935, 2936, 0, 0, 0, 16, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -790, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1675, 0, 0, 19, 0, -1679, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1694, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32767, 32767, + static const int16 h[9955] = { 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3138, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 29, 30, 31, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -6598,6 +6599,10 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -50, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 1, 32767, 2, 32767, 32767, 32767, 32767, 3, + 32767, 32767, 4, 5, 6, 7, 32767, 32767, + 8, 9, 10, 32767, 11, 12, -39, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -6606,72 +6611,47 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 724, 2668, 724, 4350, -2633, -2633, - 2533, 2534, 2535, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 2518, 2519, 2520, 1431, 45, 46, - 32767, 32767, 47, 48, 49, 50, 51, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -3011, 53, -1125, -3010, -3010, - 32767, -3334, -1123, -3011, 60, 61, 62, 63, - 32767, 32767, 64, 32767, 65, 32767, 66, 67, - 32767, 32767, 32767, 32767, 32767, 32767, 2268, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 69, 70, - 71, 72, 73, 74, 32767, 32767, 32767, 32767, - 75, 76, 32767, 77, 281, 32767, 32767, 32767, - 32767, 32767, 32767, 811, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 1341, 1342, 1343, 1344, 1345, - 1346, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 14, 15, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -36, -3114, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, -43, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 86, - 32767, 32767, 32767, 32767, 32767, 4550, 32767, 32767, - 32767, 1135, 32767, 32767, 32767, 32767, 32767, 1130, - 3016, 32767, 3017, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -61, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 3139, 3140, 3141, 3142, + 3143, 3144, 3145, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 677, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 2858, 2859, 651, 2861, -438, - 2863, 2864, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 3104, 21, 3107, + 23, 24, 25, 26, 27, 28, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -5305, -5305, -5305, 32767, -5306, - -5306, 32767, 32767, 32767, 2871, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 3146, 3147, 3148, 3149, 3150, 3151, 32767, + 32767, 32767, 29, 30, 31, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 3022, 3023, 680, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, -272, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4308, 4309, 4310, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4311, 4312, 4313, - 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, - 4322, 4323, 4324, 4325, 4326, 4307, 4307, 4307, - 4307, 4307, 4307, 4307, 4307, 4307, 4336, 4337, - 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, - 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, - 4354, 32767, 32767, 32767, 32767, 4355, 4356, 4357, - 4358, 4359, 4360, 4361, 4362, 4363, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 4364, 4365, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -6681,351 +6661,692 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 3130, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 3213, 3214, 2948, 35, 3060, 3219, + 38, 39, 40, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2202, 0, 0, 0, 59, 0, - 0, 35, 0, 0, 0, 3549, 0, 0, - 0, 0, 0, 3394, 0, 0, 3399, 0, - 0, 0, 0, 0, 0, 0, 0, 2012, - 0, 0, 0, 0, 87, 2022, 0, 7490, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2255, 0, 2256, 2256, 2256, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 0, 0, - 0, 0, 0, 0, -1759, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4767, 0, 0, 4772, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 41, 42, 43, 44, 45, 46, + 32767, 32767, -634, 48, 49, 50, 51, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 32767, 0, + 32767, 32767, 32767, 32767, 0, 32767, 0, 0, + 0, 0, 0, 32767, 32767, 0, 0, 0, + 32767, 0, 0, 52, 3131, 54, 55, 56, + 32767, 57, 58, 59, 60, 61, 62, 63, + 32767, 32767, 64, 32767, 3221, 32767, 3222, 3223, + 32767, 32767, 32767, 32767, 32767, 32767, 68, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 69, 70, + 71, 72, 73, 74, 32767, 32767, 32767, 32767, + 75, 76, 32767, 77, 3259, 32767, 32767, 32767, + 32767, 32767, 32767, 79, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 80, 81, 82, 83, 84, + 85, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, -33, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, -2919, + 32767, 32767, 32767, 32767, 32767, -3076, 32767, 32767, + 32767, -3079, 32767, 32767, 32767, 32767, 32767, -3084, + -3084, 0, -3085, 0, 0, 0, 0, 0, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 0, 0, + 32767, 32767, 32767, -943, -942, -941, 32767, 32767, + 32767, 32767, 0, -3078, 0, 0, 0, 32767, + 0, 0, 0, 0, 0, 0, 0, 32767, + 32767, 0, 32767, -3156, -3156, -3156, -3156, -3156, + -3156, -3156, 32767, 32767, 32767, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 0, 0, + 0, 0, 0, 32767, 32767, 32767, 32767, 0, + 0, 32767, 0, -3181, -3181, -2914, 0, -3024, + -3182, 0, 0, 0, -3185, 32767, 32767, 32767, + 32767, 32767, 0, 0, 0, 0, 0, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 0, 0, 0, 0, 0, + 0, 32767, 32767, 681, 0, 0, 0, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 3152, 3153, 3154, 3155, 4895, 3005, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, + 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, + 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, + 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, + 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, + 3199, 3200, 3201, 3202, 3203, 3204, 1002, 3206, + 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, + 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, + 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, + 3231, 3232, 3233, 3234, 3235, 3236, 32767, 3237, + 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, + 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, + 3254, 3255, 3256, 3257, 3258, 7120, 3260, 3261, + 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3114, + 3270, 3271, 3272, 3273, 3118, 3275, 3276, 3277, + 3278, 3122, 3280, 3281, 3015, 3283, 3126, 3285, + 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, + 3294, 3295, 3296, 5040, 3298, 3299, 3300, 3301, + 3302, 3303, 3304, 3305, 3306, 5059, 32767, 574, + 574, 32767, 32767, 3944, 32767, 32767, 3311, 3312, + 32767, 32767, 3313, 5153, 3315, 3316, 32767, 3317, + 3318, 3319, 3320, 4304, 4305, 4306, 4307, 4308, + 4309, 4310, 3328, 32767, 4313, 32767, 3330, 3331, + 3332, 3333, 3334, 3335, 3336, 32767, 3337, 8896, + 3339, 3340, 3341, 3342, 5133, 3344, 3345, 3346, + 3347, 5142, 3349, 3350, 3351, 3352, 7858, 3354, + 3355, 3356, -12, 3358, 3359, 3360, 3361, 3362, + -3689, -3689, -3689, -920, 3367, 3368, 3369, 3370, + 3371, 3372, 3373, 3374, 3375, 3132, 3377, 3378, + 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, + 3387, 3388, 1815, 3390, 3391, 3392, 3393, 3394, + 3395, 32767, 3396, 3240, 3398, 3399, 3133, 3401, + 32767, 3402, 3403, 3404, 3405, 32767, 32767, 3406, + 3407, 3408, 3409, 3410, 3411, 5155, 3413, 0, + 3414, 3415, 3416, 3417, 3418, 3419, 3420, 32767, + 3421, 688, 688, 688, 4059, 4060, 3427, 3428, + 3429, 3430, 3431, 3432, 3433, 5273, 3435, 3436, + 3437, 3438, 3439, 3440, 3441, 4425, 4426, 4427, + 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4378, + 3452, 32767, 3453, 3454, 3455, 3456, 3457, 32767, + 3458, 32767, 32767, 32767, 3459, 3460, 5251, 3462, + 3463, 3464, 3465, 32767, 3466, 3467, 3468, 3469, + 7975, 3471, 3472, 3473, 105, 3475, 3476, 3477, + 3478, 3479, -3572, -3572, -3572, -803, 3484, 3485, + 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3249, + 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, + 3502, 3503, 3504, 3505, 1932, 3507, 3508, 3509, + 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, + 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, + 3526, 3527, 3528, 3529, 3530, 682, 683, 3533, + 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, + 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, + 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, + 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, + 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, + 3582, -3534, -3534, -3534, -3534, 3587, 3588, 3589, + 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, + 3598, 3599, 3600, 5398, 3602, 3603, 10119, 3605, + 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, + 2446, 3615, 3616, 2444, 3618, 3619, 3620, 3621, + 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, + 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, + 3638, 3639, 32767, 3640, 3641, 3642, 3643, 3644, + 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, + 3653, 3654, 3655, 3656, 3657, 3658, 3659, 811, + 812, 3662, 3663, 3664, 3665, 3666, 3667, 3668, + 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, + 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, + 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, + 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, + 3709, 3710, 3711, -3405, -3405, -3405, -3405, 3716, + 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, + 3725, 3726, 3727, 3728, 3729, 5527, 3731, 3732, + 10248, 3734, 3735, 3736, 3737, 3738, 3739, 3740, + 3741, 3742, 2575, 3744, 3745, 2573, 3747, 3748, + 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, + 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, + 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, + 3773, 684, 3775, 3776, 3777, 3778, 3779, 3780, + 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, + 3789, 3790, 3937, 3938, 2261, 3940, 3795, 3796, + 3797, 3798, 3799, 3800, 3801, 3802, 3803, 221, + 3805, 32767, 32767, 3806, 3807, 3808, 3809, 3810, + 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, + 3819, 3820, 3821, 3822, 2571, 3824, 3825, -2009, + 3827, 3828, 3829, 5428, -32, 3832, 2298, 2298, + 3651, 2298, 2298, 2298, 2298, 2298, 2298, 2298, + 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, + 2298, 2298, 2298, 2298, 2298, 2298, 3008, 2298, + 2298, -1412, -1970, 3070, 3790, -10984,-10984,4117, + -1240, -1239, -1238, -10892,2298, 2298, 2298, 2298, + 3199, 2298, 2298, 8405, 3654, 12572, 2298, 12575, + 3655, 8408, 12579, 12580, 12581, 3786, 3889, 3890, + 3891, 3892, 2298, 32767, 3894, 3895, 3896, 3897, + 3898, 3899, 3900, 811, 3902, 3903, 3904, 3905, + 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, + 3914, 3915, 3916, 3917, 4064, 4065, 2388, 4067, + 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, + 3930, 348, 3932, 3933, 3934, 3935, 3936, 3937, + 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, + 3946, 3947, 3948, 3949, 3950, 3951, 2700, 3953, + 3954, -1880, 3956, 3957, 3958, 5557, 97, 3961, + 2427, 2427, 3780, 2427, 2427, 2427, 2427, 2427, + 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, + 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, + 3137, 2427, 2427, -1283, -1841, 3199, 3919, -10855, + -10855,4246, -1111, -1110, -1109, -10763,2427, 2427, + 2427, 2427, 3328, 2427, 2427, 8534, 3783, 12701, + 2427, 12704, 3784, 8537, 12708, 12709, 12710, 3915, + 4018, 4019, 4020, 4021, 2427, 10069, -1249, 13526, + 13527, -1573, 3785, 3785, 3785, 13440, 4978, 12723, + 12724, 13444, 3785, 3785, 3785, 3785, 3785, 2427, + 13783, 13784, 13785, 13786, 13787, 13788, 13789, 13790, + 13791, 12571, 7690, 12573, 4054, 8638, 8639, 7689, + 4848, 12578, 4849, 4850, 4851, 6358, 7295, 7295, + 7295, 7295, 7295, 7295, 2427, 2427, 2427, 2427, + 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, + 2427, 13409, 2427, 2427, 2427, 2427, 2427, 2427, + -2360, 2427, 2427, 2427, 2427, 2427, 2427, 2427, + 32767, 32767, 2425, 2425, 2425, 4101, 4102, 2425, + 4104, 4034, 2425, 2425, 308, 1325, 1326, 376, + 2841, 2841, 376, 376, 3794, 4117, 3792, 375, + 4120, 4121, 4122, 4123, -1233, 6543, 4126, 4127, + 4128, 6544, 6545, 4131, 16128, 3831, 8385, 4135, + 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, + 4144, 4145, 4146, 4147, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 686, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 70, 70, 70, 688, 689, 690, + 67, 67, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 2461, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, + -1302, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 3609, + 755, 3805, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, + 795, 796, 797, 798, 799, 800, 801, 802, + 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, + 819, 820, 821, 822, 823, 824, 825, -3308, + -5758, -5758, -5758, -5758, -5758, -5758, -5758, -5758, + -5758, -5758, -5758, -1733, -1732, -1731, -1730, -1729, + -1728, -1727, -1726, -1725, -1724, -1723, -1722, -1721, + -3609, -3609, -1720, -3609, -1718, -3609, -1373, -3609, + -1714, -3609, -1712, -3609, -1710, -3609, -1708, -3609, + -3609, 2387, 2388, 2389, 2390, 2391, 2392, 2393, + -3609, -3609, -1696, 878, 879, 880, -2490, -2490, + -3609, -1689, -1688, -1687, 2092, 2427, -3688, -3688, + -3688, -1681, -1680, -1679, -1678, 896, -3683, -1675, + -3682, -2759, 32767, 0, 0, 1353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 5977, 0, - 892, 32767, 0, 32767, 32767, 0, 0, 32767, - 32767, 2344, 4834, 4835, 4836, 32767, 0, 4840, + 0, 0, 0, 710, 0, 0, -3710, -4268, + 772, 1492, -13282,-13282,1819, -3538, -3537, -3536, + -13190,0, 0, 0, 0, 901, 0, 0, + 6107, 1356, 10274, 0, 10277, 1357, 6110, 10281, + 10282, 10283, 1488, 1591, 1592, 1593, 1594, 0, + 7642, -3676, 11099, 11100, -4000, 1358, 1358, 1358, + 11013, 2551, 10296, 10297, 11017, 1358, 1358, 1358, + 1358, 1358, 0, 11356, 11357, 11358, 11359, 11360, + 11361, 11362, 11363, 11364, 10144, 5263, 10146, 1627, + 6211, 6212, 5262, 2421, 10151, 2422, 2423, 2424, + 3931, 4868, 4868, 4868, 4868, 4868, 4868, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32767, 0, 32767, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, + 0, 0, 0, 0, 10982, 0, 0, 0, + 0, 0, 0, -4787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1676, 1677, 0, 1679, 1609, 0, 0, -2117, + -1100, -1099, -2049, 416, 416, -2049, -2049, 1369, + 1692, 1367, -2050, 1695, 1696, 1697, 1698, -3658, + 4118, 1701, 1702, 1703, 4119, 4120, 1706, 13703, + 1406, 5960, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1406, + 1406, 1406, 1406, 1406, 0, 10979, -4121, 77, + 1236, 2500, 0, 0, 2501, 0, 1563, 1563, + 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, + 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, + 4022, 4023, 4024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1890, 0, 1892, -343, 1894, + 0, 1896, 0, 1898, 0, 1900, 0, 1902, + 1903, -4092, -4092, -4092, -4092, -4092, -4092, -4092, + 1911, 1912, 0, -2573, -2573, -2573, 798, 799, + 1919, 0, 0, 0, -3778, -4112, 2004, 2005, + 2006, 0, 0, 0, 0, -2573, 2007, 0, + 2008, 1086, 2010, -446, 2012, 2013, 2014, 2015, + 2016, 1094, -443, -3070, 2390, -3070, -3070, 1100, + -3070, -3070, -3070, 5726, 2028, 5729, 5730, 2031, + 1959, -426, 10893, -3881, -3881, 1964, 1965, -3068, + 1967, -3787, 4676, 1970, -3069, -3788, 1973, -4114, + -4114, -4114, -4114, -4114, -4114, -4114, -4114, -4114, + -4114, -4114, -4114, -4114, -4114, -2893, 1989, -2893, + 2059, 1043, 1043, 1994, 4836, -2893, 4837, 4837, + 4837, 3331, 2395, 2396, 2397, 2398, 2399, 2400, + 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, + 2409, 2410, 2411, -3687, -3687, -3687, -3687, -3687, + -3687, 2092, 2093, 2428, -3687, -3687, -3687, 10820, + -2764, -2764, -3687, -3687, -3687, 2104, -3687, -2764, + -3687, -1230, -3687, -3687, -3687, -3687, -3687, -2764, + -1226, 1402, -4057, 1404, 1405, -2764, 1407, 1408, + 1409, -7386, -3687, -7387, -7387, -3687, -3687, -1229, + -12547,2228, 2229, -3615, -1402, 1418, -1400, 2138, + -6324, 1421, 1422, 2142, -6327, 2469, 2470, 2471, + 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, + 2480, 2481, 2482, -30, -3686, 0, 0, 0, + -2739, -3689, -1224, -1224, -3689, -3689, -271, 52, + -3689, -3689, -4140, 58, 1217, 2481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32767, 32767, 0, 32767, 0, 0, 0, 32767, - 32767, 32767, 32767, 3261, 3262, 32767, 3007, 32767, + 0, 0, 0, 0, 0, 0, 0, 2451, + 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, + 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, + 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, + 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, + 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, + 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, + 2508, 2509, 2510, 2511, 2512, 0, -3656, 1227, + -3724, -2707, -2706, -3656, -1191, -1191, -3656, -3656, + -238, 85, -3656, -3656, -4107, 91, 0, 2513, + -5261, 2515, 2516, 2517, 2518, 2519, 2520, 2521, + 2522, 2523, 2413, 2525, 2526, 2416, 2528, 2529, + 2419, 2420, 2421, 4867, 4867, 3361, 2425, 2426, + 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, + 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, + 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, + -3665, -3665, -3665, 10842, -2742, -2742, -3665, -3665, + -3665, 2126, -3665, -2742, -3665, -1208, -3665, -3665, + -3665, -3665, -3665, -2742, -1204, 1424, -4035, 1426, + 1427, -2742, 1429, 1430, 1431, -7364, -3665, -7365, + -7365, -3665, -3665, -1207, -12525,2250, 2251, -3593, + -1380, 1440, -1378, 2160, -6302, 1443, 0, 2163, + -6306, 2490, 2491, 2492, 2493, 2494, 2495, 2496, + 2497, 2498, 2499, 2500, 2501, 2502, 2503, 1283, + -3598, 1285, -3666, -2649, -2648, -3598, -6439, 1291, + -6438, -6437, -6436, -4929, -3992, -3992, -3992, -3992, + -3992, -3992, -3992, -3992, -3992, -3992, -3992, -3992, + -3992, -3992, -3992, -3992, -3992, 2107, 2108, 2109, + 2110, 2111, 2112, -3666, -3666, -4000, 2116, 2117, + 2118, -12388,1197, 1198, 2122, 2123, 2124, -3666, + 2126, 1204, 2128, -328, 2130, 2131, 2132, 2133, + 2134, 1212, -325, -2952, 2508, -2952, -2952, 1218, + -2952, -2952, -2952, 5844, 2146, 5847, 5848, 2149, + 2150, -307, 11012, -3762, -3762, 2083, -129, -2948, + -129, -3666, 4797, -2947, -2947, -3666, 4804, -3991, + -3991, -3991, -3991, -3991, -3991, -2946, -2946, 5630, + -129, -211, -129, -2944, -129, -129, -129, -129, + -129, -129, 1261, -129, 3621, -129, -129, 0, + 1572, 2292, -6177, 2619, 2620, 2621, 2622, 2623, + 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, + 2632, 1412, -3469, 1414, -3537, -2520, -2519, -3469, + -6310, 1420, -6309, -6308, -6307, -4800, -3863, -3863, + -3863, -3863, -3863, -3863, -3863, -3863, -3863, -3863, + -3863, -3863, -3863, -3863, -3863, -3863, -3863, 2236, + 2237, 2238, 2239, 2240, 2241, -3537, -3537, -3871, + 2245, 2246, 2247, -12259,1326, 1327, 2251, 2252, + 2253, -3537, 2255, 1333, 2257, -199, 2259, 2260, + 2261, 2262, 2263, 1341, -196, -2823, 2637, -2823, + -2823, 1347, -2823, -2823, -2823, 5973, 2275, 5976, + 5977, 2278, 2279, -178, 11141, -3633, -3633, 2212, + 0, -2819, 0, -3537, 4926, -2818, -2818, -3537, + 4933, -3862, -3862, -3862, -3862, -3862, -3862, -2817, + -2817, 5759, 0, -82, 0, -2815, 0, 0, + 0, 0, 0, 0, 1390, 0, 3750, 0, + 0, -2805, 0, -2804, 0, -2803, 0, 1401, + 1402, 1403, 0, 1405, 1406, -3537, 1408, 0, + 1410, 2632, 2633, 1413, -3468, 1415, -3536, -2519, + -2518, -3468, -6309, 1421, -6308, -6307, -6306, -4799, + -3862, -3862, -3862, -3862, -3862, -3862, -3862, -3862, + -3862, -3862, -3862, -3862, -3862, -3862, -3862, 1441, + 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, + 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, + 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, + 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, + 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, + 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, + 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, + 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, + 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 2635, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 106, 107, 108, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 109, 110, 111, 112, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, -2344, - -2344, 0, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -1642, 1469, -1641, 1469, -1640, 1469, - 1469, 1457, 1469, 1469, 1469, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -3359, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4103, - -1478, 0, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, -4254, -2433, -4254, -4254, -4254, -3658, - -4254, -4254, -4254, -4254, -4254, -4254, -4254, -4254, - -4254, -4254, 0, -4253, -4253, -4253, -4253, -4253, - -4253, -4253, -4253, -4253, -678, -677, -676, -675, - -674, -673, -672, -4253, 314, -4253, -4253, -4253, - -4253, -4253, -4253, -4253, -4253, -4253, -4253, -4253, - -4253, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 1464, 1465, 1466, 1467, - 1468, 1469, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 0, 32767, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, -5116, + 32767, 32767, 32767, 32767, -2277, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 148, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 0, 0, 0, 0, + 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, -10147,32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 150, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 0, + 0, 0, -1739, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 827, 828, 829, -2469, -2469, -260, 0, - 0, 32767, 0, 32767, 0, 0, 32767, 0, - 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3575, 3576, 3577, 3578, 3579, 3580, 3581, 0, - 4567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2201, 4411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -3338, 0, 0, 0, - 0, 0, 0, 0, -3337, 0, -3336, 0, - 0, 0, 0, -3335, 0, 0, -3334, -3333, - -3332, -3331, 0, 0, -3330, 0, 0, 32767, - 0, 0, 13, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 0, 0, 0, 32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3861, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 0, 0, 0, + 0, 156, 0, 0, 0, 0, 157, 0, + 0, 267, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1743, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1752, 0, 2734, 2735, 2736, -634, + -634, 0, 0, 0, 0, 0, 0, 0, + -1839, 0, 0, 0, 0, 0, 0, 0, + -983, -983, -983, -983, -983, -983, -983, 0, + -984, -984, -927, 0, 0, 0, 0, 0, + 0, 0, 32767, 0, -5558, 0, 0, 0, + 0, -1790, 0, 0, 0, 0, -1794, 0, + 0, 0, 0, -4505, 0, 0, 0, 3369, + 0, 0, 0, 0, 0, 7052, 7053, 7054, + 4286, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 244, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 3073, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - -2556, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 3074, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 2355, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -488, -488, -488, -302, -3067, -3067, - -3067, -3067, -488, -488, -488, -488, 2999, -488, - 2999, -488, -488, -488, -3067, -3067, -3067, -488, - -488, -3067, -3067, -3067, -488, -488, -488, 2463, - -488, -488, -488, -301, 2465, -488, 2466, 2467, - -3600, -493, -3599, -488, -3598, -488, -3597, -488, - -488, -500, -488, -488, -488, -488, -488, 2470, - 2471, 2472, -488, -488, -254, -488, -488, -488, - -488, -488, -104, -488, -488, -488, -102, -101, - -100, -99, -98, -97, -96, -95, -94, -93, - -92, -488, -488, -488, -488, -488, -488, -488, - -488, -488, -2194, -2194, -2194, -2194, -2194, -2194, - -2194, -2194, -2194, -2194, 5211, 3269, 5213, 3269, - 6895, -88, -88, 5078, 5079, 5080, 1773, -92, - -92, 1773, 1773, 1773, 1773, 1773, 1773, 5072, - 5073, 2865, 5075, 1776, 5077, 5078, 1778, 1778, - 6942, 6943, 1778, 1778, 1778, 5086, 6952, 6953, - 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, - 4007, 5098, 2333, 2334, 2335, 2336, 2337, -3066, - -3066, -3066, 2341, -3066, -3066, 2344, 2345, 2346, - 5114, 317, 2349, 848, 849, 850, 2353, 852, - 853, 854, 855, 856, 857, 858, 859, 860, - 861, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 692, 692, 692, 692, 692, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 3093, 3094, 3095, 3096, 3097, 3098, 3099, - 3100, 3101, 3102, 901, 3104, 3105, 3106, 3048, - 3108, 3109, 3075, 3111, 3112, 3113, -435, 3115, - 3116, 3117, 3118, 3119, -274, 3121, 3122, -276, - 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, - 1120, 3133, 3134, 3135, 3136, 3050, 1116, 3139, - -4350, 3141, 3142, 3143, 3144, 3145, 3146, 3147, - 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, - 3156, 902, 3158, 903, 904, 905, 3162, 3163, - 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, - 3172, 3173, 3174, 3175, 3176, 3177, 32767, 3178, - 3179, 3180, 3181, 3182, 3183, 4943, 3185, 3186, - 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, - 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, - 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, - 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, - 3219, 3220, 3221, 3222, 3223, -1543, 3225, 3226, - -1545, 3228, 3229, 3230, 3231, 3232, 3233, 3234, - 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, - 3243, 3244, 3245, 3246, 3247, 3248, -1251, -2728, - 3250, 32767, 32767, 3251, 906, 907, 3252, 3253, - 32767, 32767, 910, -1579, -1579, -1579, 32767, 3258, - -1581, 3260, 3261, 3262, 3263, 3264, 3265, 3266, - 3267, 3268, 3269, 32767, 3270, 32767, 3271, 3272, - 3273, 3274, 3275, 3276, 3277, 32767, 3278, 3279, - 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, - 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, - 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, - 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, - 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, - 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, - 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, - 3336, 32767, 3337, 3338, 3339, 3340, 3341, 3342, - 0, 3343, 3344, 3345, 3346, 32767, 32767, 3347, - 3348, 3349, 3350, 3351, 3352, 3353, 3354, 32767, - 3355, 3356, 3357, 3358, 3359, 3360, 3361, 32767, - 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, - 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, - 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, - 3386, 3387, 3388, 3389, 0, 3390, 3391, 3392, - 915, 916, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 935, 936, 937, 938, - 939, 940, 941, 942, 943, 944, 945, 946, - 947, 948, 949, 950, 951, 952, 953, 954, - 955, 956, 957, 958, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 974, 975, 976, 3449, 3450, - 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, - 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, - 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, - 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, - 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, - 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, - 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, - 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, - 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, - 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, - 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, - 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, - 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, - 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, - 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, - 3571, 3572, 3573, 3574, 3575, 3576, 3577, 6056, - 6057, 6058, 32767, 3581, 3582, 3583, 3584, 3585, - 4157, 4158, 4159, 3589, 4162, -4510, -1558, -1557, - -1556, -1742, -4507, -1553, -4506, -4506, 1562, -1544, - 1563, -1547, 1564, -1545, 1565, -1543, -1542, -1529, - -1540, -1539, -1538, -1537, -1536, -4493, -4493, -4493, - -1532, -1531, -1764, -1529, 3622, -1528, -1527, -1526, - -1909, -1524, -1523, -1522, -1907, -1907, -1907, -1907, - -1907, -1907, -1907, -1907, -1907, -1907, -1907, -1510, - -1509, 1071, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 3663, 3664, 3665, - 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, - 3674, 1095, 1096, 1097, 1098, 1099, 1100, 1101, - 3682, 1103, 3684, 1105, 3686, 3687, 3688, 1109, - 1110, 1111, 3692, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 3700, 1121, 3702, 3703, 3704, 1125, - 1126, 1127, -1809, -1809, -1809, -1809, -1809, -1809, - 3720, 3721, 3722, 3717, 3718, 3719, 3720, 1140, - 1141, 1142, 1143, -1802, 1145, 1146, 1147, 1148, - 3730, -1797, 3732, 1152, 3734, 3735, 1155, 1156, - 3738, 3739, 3740, 3741, 3742, 3743, -1785, -1785, - -1785, -1779, -1324, 1168, 1169, 1170, 1171, 1172, - 3752, 3753, 1175, 1176, 1177, 992, 3758, 3759, - 3760, 3761, 1183, 1184, 1185, 1186, -2300, 1188, - -2298, 1190, 1191, 1192, 3772, 3773, 3774, 1196, - 1197, 3777, 3778, 3779, 1201, 1202, 1203, -1747, - 1205, 1206, 1207, 1021, -1744, 1210, -1743, -1743, - 4325, 1219, 4326, 1216, 4327, 1218, 4328, 1220, - 1221, 1234, 1223, 1224, 1225, 1226, 1227, -1730, - -1730, -1730, 1231, 1232, 999, 1234, 1235, 1236, - 1237, 1238, 855, 1240, 1241, 1242, 857, 857, - 857, 857, 857, 857, 857, 857, 857, 857, - 857, 1254, 1255, 1256, 1257, 1258, 1259, 1260, - 1261, 1262, 2969, 2970, 2971, 2972, 2973, 2974, - 2975, 2976, 2977, 2978, -4426, -2483, -4426, -2481, - -6106, 878, 879, -4286, -4286, -4286, -978, 888, - 889, -975, -974, -973, -972, -971, -970, -4268, - -4268, -2059, -4268, -968, -4268, -4268, -967, -966, - -6129, -6129, -963, -962, -961, -4268, -6133, -6133, - -4268, -4268, -4268, -4268, -4268, -4268, -4268, -4268, - -3178, -4268, -1502, -1502, -1502, -1502, -1502, 3902, - 3903, 3904, -1502, 3906, 3907, -1502, -1502, -1502, - -4269, 529, -1502, 0, 0, 0, -1502, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, -3194, 221, 222, 223, 224, - -1657, 226, 227, -1657, 229, 230, -1655, 555, - -1655, 234, 235, 236, 732, 238, 239, 240, - 241, 242, 243, -1655, 245, 246, 247, 248, - -1655, 250, -1655, 252, -1655, -1655, -1655, -1655, - -1655, -1655, 259, -1655, -1655, -1655, -1655, 264, - -1655, 266, -1655, 268, -1655, -3620, 271, 272, - -1655, 274, 275, -1655, 277, -1655, -1655, 280, - -1655, 282, 5746, 5747, 5748, 5749, -1655, 288, - -1655, 290, -3335, 3649, 3650, -1515, -1515, -1515, - 1793, 3659, 3660, 1796, 1797, 1798, 1799, 1800, - 1801, -1497, -1497, 712, -1497, 1803, -1497, -1497, - 1804, 1805, -3358, -3358, 1808, 1809, 1810, -1497, - -3362, -3362, -1497, -1497, -1497, -1497, -1497, -1497, - -1497, -1497, -407, -1497, -1497, -1497, -1497, -1497, - -1497, 3667, 3668, -1497, -1497, -1497, 1811, 3677, - 3678, 32767, 1814, 32767, 1815, 32767, 32767, 1816, - 1817, 32767, 32767, 32767, 1818, 1819, 1820, 1821, - -3342, -3342, 1824, 1825, 1826, 1827, 1828, 1829, - 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, - 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, - 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, - 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, - 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, - 1870, 1871, 1872, 1873, 1874, 1875, 1876, -1537, - 1878, 1879, 1880, 1881, 0, 1883, 1884, 0, - 529, 0, 0, 2210, 0, 1889, 1890, 1891, - 2387, 1893, 1894, 1895, 1896, 1897, 1898, 0, - 1900, 1901, 1902, 1903, 0, 1905, 0, 1907, - 0, 0, 0, 0, 0, 0, 1914, 0, - 0, 0, 0, 1919, 0, 1921, 0, 1923, - 0, -1965, 1926, 1927, 0, 1929, 1930, 0, - 1932, 0, 0, 1935, 0, 1937, 7401, 7402, - 7403, 7404, 0, 1943, 0, 1945, 1946, 0, - 1948, 0, 0, 1951, 1952, 1953, 1954, 0, - 1956, 1957, 1958, 1959, 1960, 1961, 1962, 0, - 1964, 1965, 1966, 1967, 0, 1969, 1970, 1971, - 1972, 0, 1974, 0, 1976, 1977, 1978, 1979, - 1980, 1981, 1982, 1983, 1984, 1985, 0, 1987, - 1988, 1989, 1990, 1991, 566, 566, 566, 5141, - 5142, 566, 566, 566, 566, 566, 566, 566, + 2849, 2849, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7117, 7118, 7119, 7120, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1797, 0, + 0, -6515, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1168, 0, 0, 1173, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3090, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -146, -146, 1532, -146, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3583, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1252, 0, 0, + 5835, 0, 0, 0, -1598, 3863, 0, 1535, + 1536, 184, 1538, 1539, 1540, 1541, 1542, 1543, + 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, + 1552, 1553, 1554, 1555, 1556, 1557, 1558, 849, + 1560, 1561, 5272, 5831, 792, 73, 14848, 14849, + -251, 5107, 5107, 5107, 14762, 1573, 1574, 1575, + 1576, 676, 1578, 1579, -4527, 225, -8692, 1583, + -8693, 228, -4524, -8694, -8694, -8694, 102, 0, + 0, 0, 0, 1595, -6046, 5273, -9501, -9501, + 5600, 243, 244, 245, -9409, -946, -8690, -8690, + -9409, 251, 252, 253, 254, 255, 1614, -9741, + -9741, -9741, -9741, -9741, -9741, -9741, -9741, -9741, + -8520, -3638, -8520, 0, -4583, -4583, -3632, -790, + -8519, -789, -789, -789, -2295, -3231, -3230, -3229, + -3228, -3227, -3226, 1643, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, + -9326, 1657, 1658, 1659, 1660, 1661, 1662, 6450, + 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, + 1672, 1673, 1674, 1675, 0, 0, 1678, 0, + 71, 1681, 1682, 3800, 2784, 2784, 3735, 1271, + 1272, 3738, 3739, 322, 0, 326, 3744, 0, + 0, 0, 0, 5357, -2418, 0, 0, 0, + -2415, -2415, 0, -11996,302, -4251, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 317, 318, 319, 320, 321, + 1728, -9250, 5851, 1654, 496, -767, 1734, 1735, + -765, 1737, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, -2266, -2266, -2266, -2266, + -2266, -2266, -2266, -2266, -2266, -2266, -2266, 1759, + 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1771, 1772, 1773, 1774, -115, + 1776, -115, 2121, -115, 1780, -115, 1782, -115, + 1784, -115, 1786, -115, -115, 5881, 5882, 32767, + 1791, 6579, 1793, 1794, 1795, 1796, 1797, 1798, + 1799, 1800, 1801, 1802, 1803, 1804, 32767, 32767, + 1805, -2316, 197, 3854, -1028, 3924, 2908, 2908, + 3859, 1395, 1396, 3862, 3863, 446, 124, 3866, + 3867, 4319, 122, 214, -2298, 5477, -2298, -2298, + -2298, -2298, -2298, -2298, 117, -11879,419, -4134, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 434, 435, 436, + 437, 438, 1845, -9133, 5968, 1771, 613, -650, + 1851, 1852, -648, 1854, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, -2149, -2149, + -2149, -2149, -2149, -2149, -2149, -2149, -2149, -2149, + -2149, 1876, 1877, 1878, 1879, 1880, 1881, 1882, + 1883, 1884, 1885, 1886, 1887, 1888, 0, 0, + 1889, 0, 1891, 0, 2236, 0, 1895, 0, + 1897, 0, 1899, 0, 1901, 0, 0, 5996, + 5997, 5998, 5999, 6000, 6001, 6002, 0, 0, + 1913, 4487, 4488, 4489, 1119, 1119, 0, 1920, + 1921, 1922, 5701, 6036, -79, -79, -79, 1928, + 1929, 1930, 1931, 4505, -74, 1934, -73, 850, + -73, 2384, -73, -73, -73, -73, -73, 850, + 2388, 5016, -443, 5018, 5019, 850, 5021, 5022, + 5023, -3772, -73, -3773, -3773, -73, 0, 2386, + -8932, 5843, 5844, 0, 0, 5034, 0, 5755, + -2707, 0, 5040, 5760, 0, 6088, 6089, 6090, + 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, + 6099, 6100, 6101, 4881, 0, 4883, -68, 949, + 950, 0, 2465, 2465, 0, 0, 3418, 3741, + 0, 0, -451, 3747, 4906, 6170, -1604, 6172, + 6173, 6174, 6175, 6176, 6177, 6178, 6179, 6180, + 6070, 6182, 6183, 6073, 6185, 6186, 6076, 6077, + 6078, 8524, 8524, 7018, 6082, 6083, 6084, 6085, + 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, + 6094, 6095, 6096, 6097, 6098, 0, 0, 0, + 0, 0, 0, 5779, 5780, 6115, 0, 0, + 0, 14507, 923, 923, 0, 0, 0, 5791, + 0, 923, 0, 2457, 0, 0, 0, 0, + 0, 923, 2461, 5089, -370, 5091, 5092, 923, + 5094, 5095, 5096, -3699, 0, -3700, -3700, 0, + 0, 2458, -8860, 5915, 5916, 72, 2285, 5105, + 2287, 5825, -2637, 5108, 5109, 5829, -2640, 6156, + 6157, 6158, 6159, 6160, 6161, 6162, 6163, 6164, + 6165, 6166, 6167, 6168, 6169, 4949, 68, 4951, + 0, 1017, 1018, 68, -2773, 4957, -2772, -2771, + -2770, -1263, -326, -326, -326, -326, -326, -326, + -326, -326, -326, -326, -326, -326, -326, -326, + -326, -326, -326, 5773, 5774, 5775, 5776, 5777, + 5778, 0, 0, -334, 5782, 5783, 5784, -8722, + 4863, 4864, 5788, 5789, 5790, 0, 5792, 4870, + 5794, 3338, 5796, 5797, 5798, 5799, 5800, 4878, + 3341, 714, 6174, 714, 714, 4884, 714, 714, + 714, 9510, 5812, 9513, 9514, 5815, 5816, 3359, + 14678, -96, -96, 5749, 3537, 718, 3537, 0, + 8463, 719, 719, 0, 8470, -325, -325, -325, + -325, -325, -325, 720, 720, 9296, 3537, 3455, + 3537, 722, 3537, 3537, 3537, 3537, 3537, 3537, + 4927, 3537, 7287, 3537, 3537, 732, 3537, 733, + 3537, 734, 3537, 4938, 4939, 4940, 3537, 4942, + 4943, 0, 4945, 3537, 2150, 2151, 2152, 2153, + 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, + 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, + 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, + 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, + 2186, 2187, 2188, 2189, 2190, 2191, 2192, -258, + -258, 32767, 4959, 4960, 5884, 5885, 5886, 96, + 5888, 4966, 5890, 3434, 5892, 5893, 5894, 5895, + 5896, 4974, 3437, 810, 6270, 810, 810, 4980, + 810, 810, 810, 9606, 5908, 9609, 9610, 5911, + 5912, 3455, 14774, 0, 0, 5845, 3633, 814, + 3633, 96, 8559, 815, 815, 96, 8566, -229, + -229, -229, -229, -229, -229, -229, -229, -229, + -229, -229, -229, -229, -229, 2284, 5941, 2256, + 2257, 2258, 4998, 5949, 3485, 3486, 5952, 5953, + 2536, 2214, 5956, 5957, 6409, 2212, 1054, -209, + 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, + 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, + 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, + 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, + 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, + 2321, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, 2384, + 6041, 1159, 6111, 5095, 5095, 6046, 3582, 3583, + 6049, 6050, 2633, 2311, 6053, 6054, 6506, 2309, + 2401, -111, 7664, -111, -111, -111, -111, -111, + -111, -111, -111, -111, 0, -111, -111, 0, + -111, -111, 0, 0, 0, -2445, -2444, -937, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8673, 5722, 5722, 5722, 0, 8676, - 5723, 8677, 8678, 2611, 5718, 2612, 5723, 2613, - 5723, 2614, 5723, 5723, 5711, 5723, 5723, 5723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 151, 2776, 4254, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1821, 0, - 0, 0, 596, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 32767, 32767, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7775, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 111, 0, + 0, 111, 0, 0, 111, 111, 111, -2334, + -2333, -826, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 6227, 6228, 6229, -8277, + 5308, 5309, 6233, 6234, 6235, 445, 6237, 5315, + 6239, 3783, 6241, 32767, 32767, 6242, 6243, 5321, + 3784, 1157, 6617, 1157, 1157, 5327, 1157, 1157, + 1157, 9953, 6255, 9956, 9957, 6258, 6259, 3802, + 15121, 347, 347, 6192, 3980, 1161, 3980, 443, + 8906, 1162, 2606, 444, 8914, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 1340, 6222, 1340, 6292, 5276, + 5276, 6227, 9069, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 6297, 506, 1429, 506, 2963, + 506, 506, 506, 506, 506, 1429, 2967, 5595, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 6309, 6310, 6311, 6312, + 6313, 5391, 3854, 1227, 6687, 1227, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 2654, 492, 8962, 167, + 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 167, 167, 167, 1388, 6270, 1388, + 6340, 32767, 32767, 6273, 9115, 1386, 9116, 9116, + 9116, 7610, 6674, 6675, 6676, 6677, 6678, 32767, + 6679, 6680, 6681, 6682, 6683, 6684, 6685, 6686, + 6687, 6688, 6689, 591, 591, 591, 591, 591, + 591, 6370, 6371, 32767, 590, 590, 590, 15097, + 32767, 32767, 32767, 32767, 586, 6377, 586, 32767, + 585, 32767, 584, 584, 584, 584, 584, 1507, + 3045, 5673, 214, 5675, 5676, 1507, 5678, 5679, + 5680, -3115, 584, -3116, -3116, 584, 584, 3042, + -8276, 6499, 6500, 656, 2869, 5689, 2871, 6409, + -2053, 5692, 5693, 6413, -2056, 6740, 6741, 6742, + 6743, 6744, 6745, 5701, 5702, -2873, 2887, 2970, + 2889, 5705, 2891, 2892, 2893, 2894, 2895, 2896, + 1507, 2898, -851, 2900, 2901, 2773, 1202, 483, + 8953, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 158, 158, 1379, + 6261, 1379, 6331, 5315, 5315, 6266, 9108, 1379, + 9109, 9109, 9109, 7603, 6667, 6668, 6669, 6670, + 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, + 6679, 6680, 6681, 6682, 6683, 585, 585, 585, + 585, 585, 585, 6364, 6365, 6700, 585, 585, + 585, 15092, 1508, 1508, 585, 585, 585, 6376, + 585, 1508, 585, 3042, 585, 585, 585, 585, + 585, 32767, 32767, 32767, 32767, 32767, 5801, 1632, + 5803, 5804, 5805, -2990, 709, -2991, -2991, 709, + 709, 3167, -8151, 6624, 6625, 781, 2994, 5814, + 2996, 6534, -1928, 5817, 5818, 6538, -1931, 6865, + 6866, 6867, 6868, 6869, 6870, 5826, 5827, -2748, + 3012, 3095, 3014, 5830, 3016, 3017, 3018, 3019, + 3020, 3021, 1632, 3023, -726, 3025, 3026, 2898, + 1327, 608, 9078, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 1504, 6386, 1504, 6456, 5440, 5440, 6391, + 9233, 1504, 9234, 9234, 9234, 7728, 6792, 6793, + 6794, 6795, 6796, 6797, 6798, 6799, 6800, 6801, + 6802, 6803, 6804, 6805, 6806, 6807, 6808, 710, + 710, 710, 710, 710, 710, 6489, 6490, 6825, + 710, 710, 710, 15217, 1633, 1633, 710, 710, + 710, 6501, 710, 1633, 710, 3167, 710, 710, + 710, 710, 710, 1633, 3171, 5799, 340, 5801, + 5802, 1633, 5804, 5805, 5806, -2989, 710, -2990, + -2990, 710, 710, 3168, -8150, 6625, 6626, 782, + 2995, 5815, 2997, 6535, -1927, 5818, 5819, 6539, + -1930, 6866, 6867, 6868, 6869, 6870, 6871, 5827, + 5828, -2747, 3013, 3096, 3015, 5831, 3017, 3018, + 3019, 3020, 3021, 3022, 1633, 3024, -725, 3026, + 3027, 5833, 3029, 5834, 3031, 5835, 3033, 1633, + 1633, 1633, 3037, 1633, 32767, 32767, 32767, 3039, + 1630, 409, 409, 1630, 6512, 32767, 32767, 5564, + 5564, 6515, 9357, 1628, 9358, 32767, 32767, 7850, + 6914, 6915, 6916, 6917, 6918, 32767, 32767, 6919, + 6920, 6921, 32767, 32767, 32767, 6922, 6923, 1621, + 1621, 1621, 1621, 1621, 32767, 1620, 1620, 1620, + 1620, 1620, 1620, 1620, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -2856, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, -2901, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, -1025, 32767, 32767, 32767, - 32767, -2910, 32767, 32767, 32767, 32767, 157, 32767, - 32767, 32767, 32767, 158, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 2359, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 160, 32767, 161, 162, 163, 164, - 165, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 898, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 1428, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 1254, 32767, 32767, 32767, - 32767, 1250, 32767, 32767, 32767, 32767, 1246, 32767, - 32767, 32767, 32767, 1243, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1231, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7039,33 +7360,33 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 1842, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 3177, 1235, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, -4323, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 174, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7076,21 +7397,111 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 617, 0, + 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1742, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2033, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2855, 0, -3049, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4134, 6585, 6586, 6587, 6588, 6589, 6590, + 6591, 6592, 6593, 6594, 6595, 2571, 2571, 2571, + 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, + 2571, 2571, 4460, 4461, 2573, 4463, 2573, 4465, + 2230, 4467, 2573, 4469, 2573, 4471, 2573, 4473, + 2573, 4475, 4476, -1519, -1519, -1519, -1519, -1519, + -1519, -1519, 4484, 4485, 2573, 0, 0, 0, + 3371, 3372, 4492, 2573, 2573, 2573, -1205, -1539, + 4577, 4578, 4579, 2573, 2573, 2573, 2573, 0, + 4580, 2573, 4581, 3659, 4583, 2127, 4585, 4586, + 4587, 4588, 4589, 3667, 2130, -497, 4963, -497, + -497, 3673, -497, -497, -497, 8299, 4601, 8302, + 8303, 4604, 4532, 2147, 13466, -1308, -1308, 4537, + 4538, -495, 4540, -1214, 7249, 4543, -496, -1215, + 4546, -1541, -1541, -1541, -1541, -1541, -1541, -1541, + -1541, -1541, -1541, -1541, -1541, -1541, -1541, -320, + 4562, -320, 4632, 3616, 3616, 4567, 2103, 2104, + 4570, 4571, 1154, 832, 4574, 4575, 5027, 830, + -328, -1591, 6184, -1591, -1591, -1591, -1591, -1591, + -1591, -1591, -1591, -1591, -1480, -1591, -1591, -1480, + -1591, -1591, -1480, -1480, -1480, -3925, -3924, -2417, + -1480, -1480, -1480, -1480, -1480, -1480, -1480, -1480, + -1480, -1480, -1480, -1480, -1480, -1480, -1480, -1480, + -1480, 4619, 4620, 4621, 4622, 4623, 4624, -1154, + -1154, -1488, 4628, 4629, 4630, -9876, 3709, 3710, + 4634, 4635, 4636, -1154, 4638, 3716, 4640, 2184, + 4642, 4643, 4644, 4645, 4646, 3724, 2187, -440, + 5020, -440, -440, 3730, -440, -440, -440, 8356, + 4658, 8359, 8360, 4661, 4662, 2205, 13524, -1250, + -1250, 4595, 2383, -436, 2383, -1154, 7309, -435, + -435, -1154, 7316, -1479, -1479, -1479, -1479, -1479, + -1479, -1479, -1479, -1479, -1479, -1479, -1479, -1479, + -1479, 1034, 4691, -191, 4761, 3745, 3745, 4696, + 2232, 2233, 4699, 4700, 1283, 961, 4703, 4704, + 5156, 959, -199, -1462, 6313, -1462, -1462, -1462, + -1462, -1462, -1462, -1462, -1462, -1462, -1351, -1462, + -1462, -1351, -1462, -1462, -1351, -1351, -1351, -3796, + -3795, -2288, -1351, -1351, -1351, -1351, -1351, -1351, + -1351, -1351, -1351, -1351, -1351, -1351, -1351, -1351, + -1351, -1351, -1351, 4748, 4749, 4750, 4751, 4752, + 4753, -1025, -1025, -1359, 4757, 4758, 4759, -9747, + 3838, 3839, 4763, 4764, 4765, -1025, 4767, 3845, + 4769, 2313, 4771, 4772, 4773, 4774, 4775, 3853, + 2316, -311, 5149, -311, -311, 3859, -311, -311, + -311, 8485, 4787, 8488, 8489, 4790, 4791, 2334, + 13653, -1121, -1121, 4724, 2512, -307, 2512, -1025, + 7438, -306, -306, -1025, 7445, -1350, -1350, -1350, + -1350, -1350, -1350, -1350, -1350, -1350, -1350, -1350, + -1350, -1350, -1350, -129, 4753, -129, 4823, 3807, + 3807, 4758, 7600, -129, 7601, 7601, 7601, 6095, + 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, + 5167, 5168, 5169, 5170, 5171, 5172, 5173, 5174, + 5175, -923, -923, -923, -923, -923, -923, 4856, + 4857, 5192, -923, -923, -923, 13584, 0, 0, + -923, -923, -923, 4868, -923, 0, -923, 1534, + -923, -923, -923, -923, -923, 0, 1538, 4166, + -1293, 4168, 4169, 0, 4171, 4172, 4173, -4622, + -923, -4623, -4623, -923, -923, 1535, -9783, 4992, + 4993, -851, 1362, 4182, 1364, 4902, -3560, 4185, + 4186, 4906, -3563, 5233, 5234, 5235, 5236, 5237, + 5238, 4194, 4195, -4380, 1380, 1463, 1382, 4198, + 1384, 1385, 1386, 1387, 1388, 1389, 0, 1391, + -2358, 1393, 1394, 4200, 1396, 4201, 1398, 4202, + 1400, 0, 0, 0, 1404, 0, 0, 4944, + 0, 1409, 0, -1221, -1221, 0, 4882, 0, + 4952, 3936, 3936, 4887, 7729, 0, 7730, 7730, + 7730, 6224, 5288, 5289, 5290, 5291, 5292, 5293, + 5294, 5295, 5296, 5297, 5298, 5299, 5300, 5301, + 5302, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 1830, -112, 1832, -112, 3514, -3469, - -3469, 1697, 1698, 1699, -1608, -3473, -3473, -1608, - -1608, -1608, -1608, -1608, -1608, 1691, 1692, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, -1623, -1623, -1623, 3541, 3542, -1623, -1623, - -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623, - -1623, -1623, -1623, -1623, -1623, -1623, -1623, -1623, - -1623, -1623, -1623, -1623, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7105,15 +7516,62 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 4751, 0, 8918, 3459, 8920, 0, 4753, + 8924, 8925, 8926, 131, 234, 235, 236, 237, + 32767, 6284, -5034, 9741, 9742, -5358, 0, 0, + 0, 9655, 1193, 8938, 8939, 9659, 0, 0, + 0, 0, 0, 0, 9997, 9998, 9999, 10000, + 10001, 10002, 10003, 10004, 10005, 8785, 3904, 8787, + 268, 4852, 4853, 3903, 1062, 8792, 1063, 1064, + 1065, 2572, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 9608, 9609, 9610, 9611, 9612, + 9613, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -766, 2253, 2254, 2255, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1531, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 0, 0, 0, 32767, 32767, + -37, 286, -39, -3456, 289, 290, 291, 292, + -5064, 2712, 295, 296, 297, 2713, 2714, 300, + 12297, 0, 4554, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32767, 32767, 32767, 32767, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 5071, -9435, 4150, 4151, 32767, + 5075, 5076, -714, 5078, 4156, 5080, 2624, 5082, + 5083, 5084, 5085, 5086, 4164, 2627, 0, 5460, + 0, 0, 4170, 0, 0, 0, 8796, 5098, + 8799, 8800, 5101, 2644, 2644, 13963, 0, -812, + 0, 0, 0, 0, -719, 7744, 0, 0, + -719, 7751, -1044, -1044, -1044, -1044, 0, -1045, + 0, 0, 8576, 0, 2734, 0, 0, 0, + 0, 0, 0, 0, 0, 4199, 8829, 8830, + 0, 0, 0, 0, 0, 0, 0, 32767, + 4203, 4204, 4205, 32767, 4206, 4207, 32767, 4208, + 32767, 32767, 5430, 32767, 4210, 32767, 4211, 32767, + 276, 32767, -674, 32767, 4214, -3515, 32767, -3514, + 32767, 32767, -1072, -1072, -1072, -1072, 32767, -1073, + -1073, -1073, -1073, -1073, -1073, -1073, 32767, -1074, + 4229, 4230, 4231, 32767, 4232, 4233, 4234, 4235, + 32767, 4236, 32767, 4237, 4238, 4239, 4240, 4241, + 4242, 4243, 4244, 4245, 4246, 32767, 4247, 4248, + 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256, + 4257, 4258, 4259, 4260, 4261, 4262, 4263, 32767, + 32767, 32767, 32767, 32767, 4264, 4265, 4266, 32767, + 4267, 4268, 4269, 4270, 4271, 32767, 4272, 4273, + 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, + 4282, 4283, 4284, 4285, 4286, 4287, 4288, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7131,6 +7589,8 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 324, 32767, 325, 32767, 326, 32767, 327, 32767, + 328, 32767, 329, 32767, 330, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7138,266 +7598,37 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 0, 0, 32767, 0, 0, 32767, + 32767, 32767, -5512, 32767, 332, 333, -4700, 335, + -5419, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -5753, 32767, -5754, 32767, -5755, -5755, -5755, 32767, + 32767, 32767, -5758, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 343, 32767, -2121, 345, 346, 32767, + 32767, 32767, 347, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, -5826, 32767, -5827, -5827, -5827, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -5725, 32767, -8171, 32767, -6664, -5727, 32767, 32767, + 356, 357, -5638, -5638, -5638, -5638, -5638, -5638, + -5638, 365, 366, 32767, 32767, 32767, 32767, 32767, + 32767, 367, 32767, 32767, 32767, 32767, 32767, 447, + 3075, -2384, 3077, 3078, 32767, 3079, 3080, 3081, + -5714, -2015, -5715, -5715, -2015, 443, 444, -10874, + 3090, 3903, 3092, 3093, 3094, 3095, 3815, -4647, + 3098, 3099, 3819, -4650, 4146, 4147, 4148, 4149, + 3106, 4152, 3108, 3109, -5466, 3111, 378, 3113, + 3114, 3115, 3116, 3117, 3118, 3119, 3120, 379, + -5708, -5708, 3123, 3124, 3125, 3126, 3127, 3128, + 3129, 32767, 32767, 32767, 32767, 32767, 32767, 382, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -173, -173, -173, -173, -173, - -173, -173, -173, -173, -173, -173, -173, 3241, - -173, -173, -173, -173, 1709, -173, -173, 1712, - -173, -173, 1713, -496, 1715, -173, -173, -173, - -668, -173, -173, -173, -173, -173, -173, 1726, - -173, -173, -173, -173, 1731, -173, 1733, -173, - 1735, 1736, 1737, 1738, 1739, 1740, -173, 1742, - 1743, 1744, 1745, -173, 1747, -173, 1749, -173, - 1751, 3717, -173, -173, 1755, -173, -173, 1758, - -173, 1760, 1761, -173, 1763, -173, -5636, -5636, - -5636, -5636, 1769, -173, 1771, -173, 3453, -3530, - -3530, 1636, 1637, 1638, -1669, -3534, -3534, -1669, - -1669, -1669, -1669, -1669, -1669, 1630, 1631, -577, - 1633, -1666, 1635, 1636, -1664, -1664, 3500, 3501, - -1664, -1664, -1664, 1644, 3510, 3511, 1647, 1648, - 1649, 1650, 1651, 1652, 1653, 1654, 565, 1656, - 1657, 1658, 1659, 1660, 1661, -3502, -3502, 1664, - 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, - 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, - 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, - 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, - 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, - 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, - 1713, 1714, 1715, 1716, -1697, 1718, 1719, 1720, - 1721, -160, 1723, 1724, -160, 1726, 1727, -158, - 2052, -158, 1731, 1732, 1733, 2229, 1735, 1736, - 1737, 1738, 1739, 1740, -158, 1742, 1743, 1744, - 1745, -158, 1747, -158, 1749, -158, -158, -158, - -158, -158, -158, 1756, -158, -158, -158, -158, - 1761, -158, 1763, -158, 1765, -158, -2123, 1768, - 1769, -158, 1771, 1772, -158, 1774, -158, -158, - 1777, -158, 1779, 7243, 7244, 7245, 7246, -158, - 1785, -158, 1787, -1838, 5146, 5147, -18, -18, - -18, 3290, 5156, 5157, 3293, 3294, 3295, 3296, - 3297, 3298, 0, 0, 2209, 0, 3300, 0, - 0, 3301, 3302, -1861, -1861, 3305, 3306, 3307, - 0, -1865, -1865, 0, 0, 0, 0, 0, - 0, 0, 0, 1090, 0, 0, 0, 0, - 0, 0, 5164, 5165, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3414, 0, 0, 0, 0, 1882, 0, - 0, 1885, 0, 0, 1886, -323, 1888, 0, - 0, 0, -495, 0, 0, 0, 0, 0, - 0, 1899, 0, 0, 0, 0, 1904, 0, - 1906, 0, 1908, 1909, 1910, 1911, 1912, 1913, - 0, 1915, 1916, 1917, 1918, 0, 1920, 0, - 1922, 0, 1924, 3890, 0, 0, 1928, 0, - 0, 1931, 0, 1933, 1934, 0, 1936, 0, - -5463, -5463, -5463, -5463, 1942, 0, 1944, 0, - 0, 1947, 0, 1949, 1950, 0, 0, 0, - 0, 1955, 0, 0, 0, 0, 0, 0, - 0, 1963, 0, 0, 0, 0, 1968, 0, - 0, 0, 0, 1973, 0, 1975, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1986, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 527, 527, 527, 527, 0, - 528, 528, 528, 528, 528, 528, 528, 528, - 528, 528, 528, 1998, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1999, 2000, 2001, 2002, 2003, 32767, 32767, 32767, - 32767, 32767, 2004, 32767, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, - 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, - 2025, 2026, 1200, 1200, 32767, 4498, 4499, 2291, - 2032, 2033, 32767, 2034, 32767, 2035, 2036, 32767, - 2037, 2038, 32767, 2039, 2040, 2041, 2042, 2043, - 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, - 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, - 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, - 2068, -1506, -1506, -1506, -1506, -1506, -1506, -1506, - 2076, -2490, 2078, 2079, 2080, 2081, 2082, 2083, - 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, - 2092, 2093, 2094, 2095, -105, -2314, 2098, 2099, - 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, - 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, - 2116, 2117, 2118, 2119, 2120, 5459, 2122, 2123, - 2124, 2125, 2126, 2127, 2128, 5466, 2130, 5467, - 2132, 2133, 2134, 2135, 5471, 2137, 2138, 5473, - 5473, 5473, 5473, 2143, 2144, 5475, 2146, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, - 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, - 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, - 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, - 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, - 2187, 2188, 2189, 2190, 2191, 32767, -726, 2293, - -725, -725, -725, 1357, 1358, 1359, -722, 2201, - 2202, 2203, 2204, 2205, 0, 2207, -715, 2209, - -714, -714, -714, 2213, 2214, 2215, 4806, 2217, - 2218, 2219, 2220, 2221, 2222, 2223, -710, 2225, - -248, -704, -704, 2229, 2230, 2231, 2232, 2233, - 2220, 1430, 2236, 2237, -695, 2239, -694, 2241, - -693, -693, 2244, 2245, 2246, 2231, 2231, 2249, - 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2239, - 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, - 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, - 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, - 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, - 2290, 2291, 2292, 2293, 3084, 2295, 2296, 2297, - 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, - 2306, 2307, 3983, 2309, 2310, 2292, 2312, 3992, - 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, - 2322, 2323, 2324, 2325, 2326, 2327, 2328, 4023, - 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, - 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, - 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, - 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, - 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, - 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, - 2378, 2379, 2360, 2360, 2360, 2360, 2360, 2360, - 2360, 2360, 2360, 2389, 2390, 2391, 2392, 2393, - 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, - 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, - 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, - 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, - 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, - 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, - 2442, 2443, 2444, 2445, 2446, 2447, 32767, 2448, - 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, - 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, - 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, - 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, - 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, - 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, - 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, - 2505, 2506, 2507, 2508, 2509, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 2510, - 2511, 2512, 2513, 3266, 3266, 3266, 3266, 2518, - 3267, 3267, 3267, 2522, 3268, 3268, 3268, 3268, - 3268, 3268, 3268, 6682, 3268, 3268, 3268, 2534, - 5151, 3269, 2537, 2538, 3271, 3271, 5157, 2948, - 5159, 2544, 2545, 3273, 2778, 3273, 2549, 3274, - 2551, 3275, 2553, 5175, 2555, 3277, 3277, 3277, - 5181, 2560, 5184, 3278, 5186, 2564, 5189, 5190, - 5191, 5192, 3279, 5194, 5195, 2572, 5198, 32767, - 32767, 3278, 5200, 3278, 2577, 2578, 2579, 2580, - 5210, 3282, 3282, 5213, 3282, 2586, 2587, 2588, - 2589, 2590, 2591, -2175, -2175, -2175, 5230, 3288, - 5232, 3288, 6914, -69, -69, 5097, 5098, 5099, - 1792, -73, -73, 1792, 1792, 1792, 1792, 1792, - 1792, 5091, 5092, 2884, 5094, 1795, 5096, 5097, - 1797, 1797, 6961, 6962, 1797, 1797, 1797, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 2578, 2578, 2578, 2578, 2578, - 2578, 872, 872, 872, 872, 872, 872, 872, - 872, 872, 872, 8277, 6335, 8279, 6335, 9961, - 2978, 2978, 8144, 8145, 8146, 4839, 2974, 2974, - 4839, 4839, 4839, 4839, 4839, 4839, 8138, 8139, - 5931, 8141, 4842, 8143, 8144, 4844, 4844, 10008, - 10009, 4844, 4844, 4844, 8152, 10018, 10019, 8155, - 8156, 8157, 8158, 8159, 8160, 8161, 8162, 7073, - 8164, 5399, 5400, 5401, 5402, 5403, 0, 0, - 0, 5407, 0, 0, 5410, 5411, 5412, 8180, - 3383, 5415, 3914, 3915, 3916, 5419, 3918, 3919, - 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, - 3758, 3758, 7172, 3758, 3758, 3758, 3758, 5640, - 3758, 3758, 5643, 3758, 3758, 5644, 3435, 5646, - 3758, 3758, 3758, 3263, 3758, 3758, 3758, 3758, - 3758, 3758, 5657, 3758, 3758, 3758, 3758, 5662, - 3758, 5664, 3758, 5666, 5667, 5668, 5669, 5670, - 5671, 3758, 5673, 5674, 5675, 5676, 3758, 5678, - 3758, 5680, 3758, 5682, 7648, 3758, 3758, 5686, - 3758, 3758, 5689, 3758, 5691, 5692, 3758, -1707, - -1707, -1707, -1707, -1707, -1707, 5698, 3756, 5700, - 3756, 7382, 399, 399, 5565, 5566, 5567, 2260, - 395, 395, 2260, 2260, 2260, 2260, 2260, 2260, - 5559, 5560, 3352, 5562, 2263, 5564, 5565, 2265, - 2265, 7429, 7430, 2265, 2265, 2265, 5573, 7439, - 7440, 5576, 5577, 5578, 5579, 5580, 5581, 5582, - 5583, 4494, 5585, 2820, 2821, 2822, 2823, 2824, - -2579, -2579, -2579, 2828, -2579, -2579, 2831, 2832, - 2833, 5601, 804, 2836, 1335, 1336, 1337, 2840, - 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, - 1347, 1348, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, - 1179, 1179, 1179, 1179, 4593, 1179, 1179, 1179, - 1179, 3061, 1179, 1179, 3064, 1179, 1179, 3065, - 856, 3067, 1179, 1179, 1179, 684, 1179, 1179, - 1179, 1179, 1179, 1179, 3078, 1179, 1179, 1179, - 1179, 3083, 1179, 3085, 1179, 3087, 3088, 3089, - 3090, 3091, 3092, 1179, 3094, 3095, 3096, 3097, - 1179, 3099, 1179, 3101, 1179, 3103, 5069, 1179, - 1179, 3107, 1179, 1179, 3110, 1179, 3112, 3113, - 1179, 3115, 1179, -4284, -4284, -4284, -4284, 3121, - 1179, 3123, 1179, 4805, -2178, -2178, 2988, 2989, - 2990, -317, -2182, -2182, -317, -317, -317, -317, - -317, -317, 2982, 2983, 775, 2985, -314, 2987, - 2988, -312, -312, 4852, 4853, -312, -312, -312, - 2996, 4862, 4863, 2999, 3000, 3001, 3002, 3003, - 3004, 3005, 3006, 1917, 3008, 3009, 3010, 3011, - 3012, 3013, -2150, -2150, 3016, 3017, 3018, 3019, - 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, - 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, - 32767, 32767, 32767, 3036, 3037, 3038, 3039, 3040, - 3041, 32767, 32767, 3042, 3043, 3044, 3045, 3046, - 3047, 32767, 32767, 3048, 3049, 3050, 3051, 3052, - 3053, 32767, 32767, 3054, 3055, 3056, 32767, 32767, - 32767, -357, 3058, 3059, 3060, 3061, 1180, 3063, - 0, 1179, 3065, 3066, 1181, 3391, 1181, 3070, - 0, 0, 0, 0, 32767, 0, 0, 32767, - 0, 32767, 0, 0, -4973, 32767, 32767, -7368, - -2202, -2201, -2200, -5507, -7372, -7372, -5507, -5507, - -5507, 32767, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767, 0, 0, 32767, 0, - -203, -2234, -732, -732, -732, -2234, -732, -732, - -2763, -1261, -1261, -1261, -2763, -1261, -1261, -1261, - -1261, -1261, -1261, -1261, -1261, -1261, -1261, -1091, - -1090, -1089, -1088, -1087, 32767, 32767, -1086, -1085, - -1084, -1083, -1082, -1081, -1080, -1079, -1078, -1077, - -1076, -1075, 32767, -1074, -1073, -1072, -1071, -1070, - -1069, -1068, -1067, -1066, -1065, -1064, -1063, -1062, - -1061, -1060, -1059, -1058, -1057, -1056, 32767, -1055, - -1054, -1053, -1052, 0, 32767, 32767, 32767, -1051, - -1050, -4463, 32767, -1048, 32767, -1047, -2928, -1045, - -1044, -2928, -1042, -1041, -2926, -716, -2926, -1037, - -1036, -1035, -539, -1033, -1032, -1031, -1030, -1029, - -1028, -2926, -1026, -1025, -1024, -1023, -2926, -1021, - -2926, -1019, -2926, -2926, -2926, -2926, -2926, -2926, - -1012, -2926, -2926, -2926, -2926, -1007, -2926, -1005, - -2926, -1003, -2926, -4891, -1000, -999, -2926, -997, - -996, -2926, -994, -2926, -2926, -991, 4475, 4476, - 4477, 4478, 4479, 4480, -2924, -981, -2924, -979, - -4604, 2380, 2381, -2784, -2784, -2784, 524, 2390, - 2391, 527, 528, 529, 530, 531, 532, -2766, - -2766, -557, -2766, 534, -2766, -2766, 535, 536, - -4627, -4627, 539, 540, 541, -2766, -4631, -4631, - -2766, -2766, -2766, -2766, -2766, -2766, -2766, -2766, - -1676, -2766, 0, 0, 0, 0, 0, 5404, - 5405, 5406, 0, 5408, 5409, 0, 0, 0, - -2767, 2031, 0, 1502, 1502, 1502, 0, 1502, - 1502, 1502, 1502, 1502, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + -5794, -5794, 32767, 32767, -5796, -5796, -5685, -5796, + -5796, -5685, -5685, -5685, -8130, -8129, -6622, -5685, + -5685, -5685, -5685, -5685, -5685, -5685, -5685, -5685, + -5685, -5685, -5685, -5685, -5685, -5685, -5685, 32767, + 413, 414, 415, 416, 417, 418, -5360, -5360, + -5694, 422, 423, 424, -14082,32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 426, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7408,10 +7639,30 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, -5655, -5655, -5655, -5655, 32767, -5656, -5656, + -5656, 32767, -5657, -5657, -5657, -5657, -5657, -5657, + -5657, -5657, 442, 443, 444, 32767, 445, 446, + 32767, 32767, -5668, 448, 449, 450, -14056,32767, + 32767, 452, 453, 454, 32767, 455, 32767, 456, + 32767, 457, 32767, 458, 459, 460, -462, 4290, + -4627, 833, -4627, 4294, -458, -4628, -4628, -4628, + 4168, 470, 4171, 32767, 472, 473, -1984, 9335, + -5439, -5439, 9662, 4305, 4306, 4307, -5347, 3116, + -4628, -4628, -5347, 4313, 4314, 4315, 4316, 4317, + 4318, -5678, -5678, -5678, -5678, -5678, -5678, -5678, + -5678, -5678, -4457, 425, -4457, 495, -521, -521, + 430, 3272, -4457, 3273, 3273, 3273, 1767, 831, + 832, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, + -5251, -5251, -5251, -5251, -5251, -5251, 528, 529, + 864, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 531, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 4363, 4364, 4365, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 4366, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7425,6 +7676,18 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 532, -7930, + 4368, -185, 535, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4370, + 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, + 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, + 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, + 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, + 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, + 4411, 4412, 4413, 32767, 32767, 32767, 32767, 4414, + 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 4423, + 4424, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7435,11 +7698,17 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 536, 537, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7457,155 +7726,45 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 224, 225, 226, 32767, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 67, - 32767, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 32767, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, -271, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 1940, 18, 1942, 3908, 18, 18, 1946, 18, - 18, 1949, 18, 1951, 1952, 18, 1954, 18, - -5445, -5445, -5445, -5445, 1960, 18, 1962, 18, - 3644, -3339, -3339, 1827, 1828, 1829, -1478, -3343, - -3343, -1478, -1478, -1478, -1478, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 0, - 0, 32767, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1340, 1341, - 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, - -2064, 1351, 1352, 1353, 1354, 32767, 1355, 1356, - 32767, 0, 32767, 32767, 1679, 32767, 1357, 1358, - 1359, 1855, 1361, 1362, 1363, 1364, 1365, 1366, - 32767, 1367, 1368, 1369, 1370, 32767, 1371, 32767, - 1372, 32767, 32767, 32767, 32767, 32767, 32767, 1373, - 32767, 32767, 32767, 32767, 1374, 32767, 1375, 32767, - 1376, 32767, -2513, 1378, 1379, 32767, 1380, 1381, - 32767, 1382, 32767, 32767, 1383, 32767, 1384, 32767, - 6848, 32767, 6849, 32767, 1387, 32767, 1388, 1389, - 32767, 1390, 32767, 32767, 1391, 1392, 1393, 1394, - 32767, 1395, 1396, 1397, 1398, 1399, 1400, 1401, - 32767, 1402, 1403, 1404, 1405, 32767, 1406, 1407, - 1408, 1409, 32767, 1410, 32767, 1411, 1412, 1413, - 1414, 1415, 1416, 1417, 1418, 1419, 1420, 32767, - 1421, 1422, 1423, 1424, 1425, 0, 0, 0, - 4575, 4576, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -571, -571, - -571, 0, -572, 8101, 5150, 5150, 5150, 5337, - 8103, 5150, 8104, 8105, 2038, 5145, 2039, 5150, - 2040, 5150, 2041, 5150, 5150, 5138, 5150, 5150, - 5150, 5150, 5150, 8108, 8109, 8110, 5150, 5150, - 5384, 5150, 0, 5151, 5151, 5151, 5535, 5151, - 5151, 5151, 5537, 5538, 5539, 5540, 5541, 5542, - 5543, 5544, 5545, 5546, 5547, 5151, 5151, 2572, - 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, - 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, - 2572, 2572, 2572, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2580, - 2580, 2580, 2580, 2580, 2580, 2580, 0, 2580, - 0, 2580, 0, 0, 0, 2580, 2580, 2580, - 0, 2580, 2580, 2580, 2580, 2580, 2580, 2580, - 0, 2580, 0, 0, 0, 2580, 2580, 2580, - 5517, 5518, 5519, 5520, 5521, 5522, -6, -6, - -6, 0, 0, 0, 0, 2581, 2581, 2581, - 2581, 5527, 2581, 2581, 2581, 2581, 0, 5528, - 0, 2581, 0, 0, 2581, 2581, 0, 0, - 0, 0, 0, 0, 5529, 5530, 5531, 32767, - 32767, 2579, 2579, 2579, 2579, 2579, 0, 0, - 2579, 2579, 2579, 2765, 0, 0, 0, 0, - 2579, 2579, 2579, 2579, 6066, 2579, 6066, 2579, - 2579, 2579, 0, 0, 0, 2579, 2579, 0, - 0, 0, 2579, 2579, 2579, 5530, 2579, 2579, - 2579, 2766, 5532, 2579, 5533, 5534, -533, 2574, - -532, 2579, -531, 2579, -530, 2579, 2579, 2567, - 2579, 2579, 2579, 2579, 2579, 5537, 5538, 5539, - 2579, 2579, 2813, 2579, 2579, 2579, 2579, 2579, - 2963, 2579, 2579, 2579, 2965, 2966, 2967, 2968, - 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2579, - 2579, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32767, 32767, 32767, - 32767, 32767, 331, 32767, 332, -2580, -2580, -2580, - -2580, 0, 0, 0, 0, 0, 0, 0, - -2580, 0, -2580, 0, -2580, -2580, -2580, 0, - 0, 0, -2580, 0, 0, 0, 0, 0, - 0, 0, -2580, 0, -2580, -2580, -2580, 0, - 0, 0, 2937, 2938, 2939, 2940, 2941, 2942, - -2586, -2586, -2586, -2580, -2125, -2581, -2581, 0, - 0, 0, 0, 2946, 0, 0, 0, 0, - -2581, 2947, -2581, 0, -2581, -2581, 0, 0, - -2581, -2581, -2581, -2581, -2581, -2581, 2948, 2949, - 2950, 2945, 2491, 0, 0, 0, 0, 0, - -2579, -2579, 0, 0, 0, 186, -2579, -2579, - -2579, -2579, 0, 0, 0, 0, 3487, 0, - 3487, 0, 0, 0, -2579, -2579, -2579, 0, - 0, -2579, -2579, -2579, 0, 0, 0, 2951, - 0, 0, 0, 187, 2953, 0, 2954, 2955, - -3112, -5, -3111, 0, -3110, 0, -3109, 0, - 0, -12, 0, 0, 0, 0, 0, 2958, - 2959, 2960, 0, 0, 234, 0, 0, 0, - 0, 0, 384, 0, 0, 0, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1706, -1706, -1706, 0, 0, 0, - 0, 385, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 397, - 398, 399, 400, 401, 402, 403, 404, 405, - 2112, 2113, 2114, 409, 410, 411, 412, 32767, - 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - -1688, 32767, 32767, 32767, 32767, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 0, 0, 0, - 0, -752, -751, -750, -749, 0, -748, -747, - -746, 0, -745, -744, -743, -742, -741, -740, - -739, -4152, -737, -736, -735, 0, -2616, -733, - 0, 0, -732, -731, -2616, -406, -2616, 0, - 0, -727, -231, -725, 0, -724, 0, -723, - 0, -2621, 0, -721, -720, -719, -2622, 0, - -2623, -716, -2623, 0, -2624, -2624, -2624, -2624, - -710, -2624, -2624, 0, -2625, -706, -2625, -704, - -2625, -702, 0, 0, 0, 0, -2629, -700, - -699, -2629, -697, 0, 0, 0, 0, 0, - 0, 4767, 4768, 4769, -2635, -692, -2635, -690, - -4315, 2669, 2670, -2495, -2495, -2495, 813, 2679, - 2680, 816, 817, 818, 819, 820, 821, -2477, - -2477, -268, -2477, 823, -2477, -2477, 824, 825, - -4338, -4338, 828, 829, 830, -2477, -4342, -4342, - -2477, -2477, -2477, -2477, -2477, -2477, -2477, -2477, - -1387, 0, 0, 32767, 32767, 0, 0, 0, - 0, 0, -2486, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 1756, 1757, 1758, - 1759, -5645, -3702, -5645, -3700, -7325, -341, -340, - -5505, -5505, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 649, 650, 651, 541, + 653, 654, 544, 656, 657, 547, 548, 549, + 2995, 2995, 1489, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, -7114, + 662, 663, 664, 665, 666, 667, 668, 669, + 670, 560, 672, 673, 563, 675, 676, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7617,10 +7776,9 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 532, 533, - 32767, 534, 535, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, @@ -7636,120 +7794,36 @@ NFKC_QC_hash_func(const void *key) 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, -781, 1084, 1084, 1084, 1084, - 1084, 1084, 4383, 4384, 2176, 4386, 1087, 4388, - 4389, 1089, 1089, 6253, 6254, 1089, 1089, 1089, - 4397, 6263, 6264, 4400, 4401, 4402, 4403, 4404, - 4405, 4406, 4407, 3318, 4409, 4410, 4411, 4412, - 4413, 4414, -749, -749, 4417, 4418, 4419, 4420, - 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, - 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, - 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, - 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, - 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, - 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, - 4469, 1056, 4471, 4472, 4473, 4474, 2593, 4476, - 4477, 2593, 4479, 4480, 2595, 4805, 2595, 4484, - 4485, 4486, 4982, 4488, 4489, 4490, 4491, 4492, - 4493, 2595, 4495, 4496, 4497, 4498, 2595, 4500, - 2595, 4502, 2595, 2595, 2595, 2595, 2595, 2595, - 4509, 2595, 2595, 2595, 2595, 4514, 2595, 4516, - 2595, 4518, 2595, 630, 4521, 4522, 2595, 4524, - 4525, 2595, 4527, 2595, 2595, 4530, 2595, 4532, - 9996, 9997, 9998, 9999, 2595, 4538, 2595, 4540, - 4541, 2595, 4543, 2595, 2595, 4546, 4547, 4548, - 4549, 2595, 4551, 4552, 4553, 4554, 4555, 4556, - 4557, 2595, 4559, 4560, 4561, 4562, 2595, 4564, - 4565, 4566, 4567, 2595, 4569, 2595, 4571, 4572, - 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, - 2595, 4582, 4583, 4584, 4585, 4586, 4587, 4588, - 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, - 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, - 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, - 4613, 4614, 4615, 4089, 4090, 4091, 4092, 4620, - 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, - 4101, 4102, 4103, 4104, 2765, 2765, 2765, 2765, - 2765, 2765, 2765, 2765, 2765, 2765, 6179, 2765, - 2765, 2765, 2765, 4647, 2765, 2765, 4650, 4122, - 4652, 4653, 2444, 4655, 2767, 2767, 2767, 2272, - 2767, 2767, 2767, 2767, 2767, 2767, 4666, 2767, - 2767, 2767, 2767, 4671, 2767, 4673, 2767, 4675, - 4676, 4677, 4678, 4679, 4680, 2767, 4682, 4683, - 4684, 4685, 2767, 4687, 2767, 4689, 2767, 4691, - 6657, 2767, 2767, 4695, 2767, 2767, 4698, 2767, - 4700, 4701, 2767, 4703, 2767, -2696, -2696, -2696, - -2696, 4709, 2767, 4711, 2767, 2767, 4714, 2767, - 4716, 4717, 2767, 2767, 2767, 2767, 4722, 2767, - 2767, 2767, 2767, 2767, 2767, 2767, 4730, 2767, - 2767, 2767, 2767, 4735, 2767, 2767, 2767, 2767, - 4740, 2767, 4742, 2767, 2767, 2767, 2767, 2767, - 2767, 2767, 2767, 2767, 2767, 4753, 2767, 2767, - 2767, 2767, 2767, 4193, 4194, 4195, -379, -379, - 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4771, - 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, - 4780, -3892, -940, -939, -938, 4785, -3890, -936, - -3889, -3889, 2179, -927, 2180, -930, 2181, -928, - 2182, -926, -925, -912, -923, -922, -921, 4803, - 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, - 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, - 3925, 4821, 4822, 4823, 4824, 4825, 4826, 4827, - 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, - 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, - 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, - 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, - 4860, 4710, 2086, 609, 4864, 4865, 4866, 4867, - 4868, 4869, 4870, 4871, 4872, 3052, 4874, 4875, - 4876, 4281, 4878, 4879, 4880, 4881, 4882, 4883, - 4884, 4885, 4886, 4887, 634, 4888, 4889, 4890, - 4891, 4892, 4893, 4894, 4895, 4896, 1322, 1322, - 1322, 1322, 1322, 1322, 1322, 4904, 338, 4906, - 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, - 4915, 4916, 4917, 665, 666, 667, 668, 669, - 670, 671, 672, 673, 674, 675, 676, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, 32767, 32767, 32767, 0, - 0, 0, 0, 0, 0, 32767, 0, 0, - 0, 0, 32767, 32767, 0, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 0, 0, 32767, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32767, 0, 0, 0, 2478, 32767, 2477, - 2477, 2477, 2477, 2477, 32767, 2476, 32767, 32767, - 32767, 2473, 2473, 2473, 2473, 2473, 2473, 2473, - 32767, 2472, 2472, 2472, 2472, 2472, 2472, 2472, - 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472, - 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472, - 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472, - 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472, - 2472, 2472, 2472, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -2478, -2478, -2478, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767 }; const unsigned char *k = (const unsigned char *) key; @@ -7762,14 +7836,14 @@ NFKC_QC_hash_func(const void *key) unsigned char c = *k++; a = a * 257 + c; - b = b * 8191 + c; + b = b * 127 + c; } - return h[a % 9837] + h[b % 9837]; + return h[a % 9955] + h[b % 9955]; } /* Hash lookup information for NFKC_QC */ static const pg_unicode_norminfo UnicodeNormInfo_NFKC_QC = { UnicodeNormProps_NFKC_QC, NFKC_QC_hash_func, - 4918 + 4977 }; diff --git a/third_party/spanner_pg/src/include/common/username.h b/third_party/spanner_pg/src/include/common/username.h index bd3ee5f7..b17f560f 100644 --- a/third_party/spanner_pg/src/include/common/username.h +++ b/third_party/spanner_pg/src/include/common/username.h @@ -2,7 +2,7 @@ * username.h * lookup effective username * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/common/username.h */ diff --git a/third_party/spanner_pg/src/include/datatype/timestamp.h b/third_party/spanner_pg/src/include/datatype/timestamp.h index dfc60b4b..e9350389 100644 --- a/third_party/spanner_pg/src/include/datatype/timestamp.h +++ b/third_party/spanner_pg/src/include/datatype/timestamp.h @@ -5,7 +5,7 @@ * * Note: this file must be includable in both frontend and backend contexts. * - * 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 * * src/include/datatype/timestamp.h @@ -40,7 +40,10 @@ typedef int64 TimestampTz; typedef int64 TimeOffset; typedef int32 fsec_t; /* fractional seconds (in microseconds) */ -/* Spangres: name the Interval struct IntervalS instead of making it anonymous +/* + * Storage format for type interval. + * + * Spangres: name the Interval struct IntervalS instead of making it anonymous * and then typedef it as Interval. This allows the datetime parsing library * to be used by the Spangres analyzer and Spanner execution */ @@ -54,6 +57,41 @@ struct IntervalS typedef struct IntervalS 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/third_party/spanner_pg/src/include/executor/execAsync.h b/third_party/spanner_pg/src/include/executor/execAsync.h index 7551b553..fc6452fd 100644 --- a/third_party/spanner_pg/src/include/executor/execAsync.h +++ b/third_party/spanner_pg/src/include/executor/execAsync.h @@ -2,7 +2,7 @@ * execAsync.h * Support functions for asynchronous execution * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/executor/execExpr.h b/third_party/spanner_pg/src/include/executor/execExpr.h index 785600d0..144728e2 100644 --- a/third_party/spanner_pg/src/include/executor/execExpr.h +++ b/third_party/spanner_pg/src/include/executor/execExpr.h @@ -4,7 +4,7 @@ * Low level infrastructure related to expression evaluation * * - * 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 * * src/include/executor/execExpr.h @@ -574,15 +574,11 @@ typedef struct ExprEvalStep struct { bool has_nulls; + bool inclause; /* true for IN and false for NOT IN */ struct ScalarArrayOpExprHashTable *elements_tab; FmgrInfo *finfo; /* function's lookup data */ FunctionCallInfo fcinfo_data; /* arguments etc */ - /* faster to access without additional indirection: */ - PGFunction fn_addr; /* actual call address */ - FmgrInfo *hash_finfo; /* function's lookup data */ - FunctionCallInfo hash_fcinfo_data; /* arguments etc */ - /* faster to access without additional indirection: */ - PGFunction hash_fn_addr; /* actual call address */ + ScalarArrayOpExpr *saop; } hashedscalararrayop; /* for EEOP_XMLEXPR */ diff --git a/third_party/spanner_pg/src/include/executor/execParallel.h b/third_party/spanner_pg/src/include/executor/execParallel.h index 3888175a..3a1b1132 100644 --- a/third_party/spanner_pg/src/include/executor/execParallel.h +++ b/third_party/spanner_pg/src/include/executor/execParallel.h @@ -2,7 +2,7 @@ * execParallel.h * POSTGRES parallel execution interface * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/executor/execPartition.h b/third_party/spanner_pg/src/include/executor/execPartition.h index 694e38b7..708435e9 100644 --- a/third_party/spanner_pg/src/include/executor/execPartition.h +++ b/third_party/spanner_pg/src/include/executor/execPartition.h @@ -2,7 +2,7 @@ * execPartition.h * POSTGRES partitioning executor interface * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/include/executor/execdebug.h b/third_party/spanner_pg/src/include/executor/execdebug.h index 596c4990..8cb8b8c6 100644 --- a/third_party/spanner_pg/src/include/executor/execdebug.h +++ b/third_party/spanner_pg/src/include/executor/execdebug.h @@ -7,7 +7,7 @@ * for debug printouts, because that's more flexible than printf(). * * - * 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 * * src/include/executor/execdebug.h diff --git a/third_party/spanner_pg/src/include/executor/execdesc.h b/third_party/spanner_pg/src/include/executor/execdesc.h index 017ad871..e79e2c00 100644 --- a/third_party/spanner_pg/src/include/executor/execdesc.h +++ b/third_party/spanner_pg/src/include/executor/execdesc.h @@ -5,7 +5,7 @@ * and related modules. * * - * 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 * * src/include/executor/execdesc.h diff --git a/third_party/spanner_pg/src/include/executor/executor.h b/third_party/spanner_pg/src/include/executor/executor.h index cc97cf8c..7cd9b2f2 100644 --- a/third_party/spanner_pg/src/include/executor/executor.h +++ b/third_party/spanner_pg/src/include/executor/executor.h @@ -4,7 +4,7 @@ * support for the POSTGRES executor module * * - * 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 * * 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, @@ -462,7 +464,7 @@ typedef bool (*ExecScanRecheckMtd) (ScanState *node, TupleTableSlot *slot); extern TupleTableSlot *ExecScan(ScanState *node, ExecScanAccessMtd accessMtd, ExecScanRecheckMtd recheckMtd); extern void ExecAssignScanProjectionInfo(ScanState *node); -extern void ExecAssignScanProjectionInfoWithVarno(ScanState *node, Index varno); +extern void ExecAssignScanProjectionInfoWithVarno(ScanState *node, int varno); extern void ExecScanReScan(ScanState *node); /* @@ -555,7 +557,7 @@ extern const TupleTableSlotOps *ExecGetResultSlotOps(PlanState *planstate, extern void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc); extern void ExecConditionalAssignProjectionInfo(PlanState *planstate, - TupleDesc inputDesc, Index varno); + TupleDesc inputDesc, int varno); extern void ExecFreeExprContext(PlanState *planstate); extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc); extern void ExecCreateScanSlotFromOuterPlan(EState *estate, diff --git a/third_party/spanner_pg/src/include/executor/functions.h b/third_party/spanner_pg/src/include/executor/functions.h index fb60be86..f8167ba0 100644 --- a/third_party/spanner_pg/src/include/executor/functions.h +++ b/third_party/spanner_pg/src/include/executor/functions.h @@ -4,7 +4,7 @@ * Declarations for execution of SQL-language functions. * * - * 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 * * src/include/executor/functions.h diff --git a/third_party/spanner_pg/src/include/executor/hashjoin.h b/third_party/spanner_pg/src/include/executor/hashjoin.h index d8edd399..d7e90bc0 100644 --- a/third_party/spanner_pg/src/include/executor/hashjoin.h +++ b/third_party/spanner_pg/src/include/executor/hashjoin.h @@ -4,7 +4,7 @@ * internal structures for hash joins * * - * 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 * * src/include/executor/hashjoin.h diff --git a/third_party/spanner_pg/src/include/executor/instrument.h b/third_party/spanner_pg/src/include/executor/instrument.h index 2f9905b7..2945cce3 100644 --- a/third_party/spanner_pg/src/include/executor/instrument.h +++ b/third_party/spanner_pg/src/include/executor/instrument.h @@ -4,7 +4,7 @@ * definitions for run-time statistics collection * * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/executor/nodeAgg.h b/third_party/spanner_pg/src/include/executor/nodeAgg.h index 398446d1..4d1bd929 100644 --- a/third_party/spanner_pg/src/include/executor/nodeAgg.h +++ b/third_party/spanner_pg/src/include/executor/nodeAgg.h @@ -4,7 +4,7 @@ * prototypes for nodeAgg.c * * - * 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 * * src/include/executor/nodeAgg.h diff --git a/third_party/spanner_pg/src/include/executor/nodeAppend.h b/third_party/spanner_pg/src/include/executor/nodeAppend.h index fa54ac6a..4cb78ee5 100644 --- a/third_party/spanner_pg/src/include/executor/nodeAppend.h +++ b/third_party/spanner_pg/src/include/executor/nodeAppend.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeAppend.h diff --git a/third_party/spanner_pg/src/include/executor/nodeBitmapAnd.h b/third_party/spanner_pg/src/include/executor/nodeBitmapAnd.h index ac5d4aec..bae6a838 100644 --- a/third_party/spanner_pg/src/include/executor/nodeBitmapAnd.h +++ b/third_party/spanner_pg/src/include/executor/nodeBitmapAnd.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeBitmapAnd.h diff --git a/third_party/spanner_pg/src/include/executor/nodeBitmapHeapscan.h b/third_party/spanner_pg/src/include/executor/nodeBitmapHeapscan.h index 3b0bd5ac..789522cb 100644 --- a/third_party/spanner_pg/src/include/executor/nodeBitmapHeapscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeBitmapHeapscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeBitmapHeapscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeBitmapIndexscan.h b/third_party/spanner_pg/src/include/executor/nodeBitmapIndexscan.h index 95bf2287..01fb6ef5 100644 --- a/third_party/spanner_pg/src/include/executor/nodeBitmapIndexscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeBitmapIndexscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeBitmapIndexscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeBitmapOr.h b/third_party/spanner_pg/src/include/executor/nodeBitmapOr.h index 1c1da2f1..ad90812c 100644 --- a/third_party/spanner_pg/src/include/executor/nodeBitmapOr.h +++ b/third_party/spanner_pg/src/include/executor/nodeBitmapOr.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeBitmapOr.h diff --git a/third_party/spanner_pg/src/include/executor/nodeCtescan.h b/third_party/spanner_pg/src/include/executor/nodeCtescan.h index 2c33442d..317d142b 100644 --- a/third_party/spanner_pg/src/include/executor/nodeCtescan.h +++ b/third_party/spanner_pg/src/include/executor/nodeCtescan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeCtescan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeCustom.h b/third_party/spanner_pg/src/include/executor/nodeCustom.h index 0be69a50..5ef89014 100644 --- a/third_party/spanner_pg/src/include/executor/nodeCustom.h +++ b/third_party/spanner_pg/src/include/executor/nodeCustom.h @@ -4,7 +4,7 @@ * * prototypes for CustomScan nodes * - * 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/third_party/spanner_pg/src/include/executor/nodeForeignscan.h b/third_party/spanner_pg/src/include/executor/nodeForeignscan.h index 8ffc0ca5..c9fbaed7 100644 --- a/third_party/spanner_pg/src/include/executor/nodeForeignscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeForeignscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeForeignscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeFunctionscan.h b/third_party/spanner_pg/src/include/executor/nodeFunctionscan.h index 8f210a77..7a598a1d 100644 --- a/third_party/spanner_pg/src/include/executor/nodeFunctionscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeFunctionscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeFunctionscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeGather.h b/third_party/spanner_pg/src/include/executor/nodeGather.h index e7c92b84..29829ffe 100644 --- a/third_party/spanner_pg/src/include/executor/nodeGather.h +++ b/third_party/spanner_pg/src/include/executor/nodeGather.h @@ -4,7 +4,7 @@ * prototypes for nodeGather.c * * - * 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 * * src/include/executor/nodeGather.h diff --git a/third_party/spanner_pg/src/include/executor/nodeGatherMerge.h b/third_party/spanner_pg/src/include/executor/nodeGatherMerge.h index 65e72456..d724d5fe 100644 --- a/third_party/spanner_pg/src/include/executor/nodeGatherMerge.h +++ b/third_party/spanner_pg/src/include/executor/nodeGatherMerge.h @@ -4,7 +4,7 @@ * prototypes for nodeGatherMerge.c * * - * 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 * * src/include/executor/nodeGatherMerge.h diff --git a/third_party/spanner_pg/src/include/executor/nodeGroup.h b/third_party/spanner_pg/src/include/executor/nodeGroup.h index 8cb2e090..816ed2c0 100644 --- a/third_party/spanner_pg/src/include/executor/nodeGroup.h +++ b/third_party/spanner_pg/src/include/executor/nodeGroup.h @@ -4,7 +4,7 @@ * prototypes for nodeGroup.c * * - * 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 * * src/include/executor/nodeGroup.h diff --git a/third_party/spanner_pg/src/include/executor/nodeHash.h b/third_party/spanner_pg/src/include/executor/nodeHash.h index 3fbe02e8..e1e0dec2 100644 --- a/third_party/spanner_pg/src/include/executor/nodeHash.h +++ b/third_party/spanner_pg/src/include/executor/nodeHash.h @@ -4,7 +4,7 @@ * prototypes for nodeHash.c * * - * 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 * * src/include/executor/nodeHash.h diff --git a/third_party/spanner_pg/src/include/executor/nodeHashjoin.h b/third_party/spanner_pg/src/include/executor/nodeHashjoin.h index 7d6541a0..b3b5a2c3 100644 --- a/third_party/spanner_pg/src/include/executor/nodeHashjoin.h +++ b/third_party/spanner_pg/src/include/executor/nodeHashjoin.h @@ -4,7 +4,7 @@ * prototypes for nodeHashjoin.c * * - * 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 * * src/include/executor/nodeHashjoin.h diff --git a/third_party/spanner_pg/src/include/executor/nodeIncrementalSort.h b/third_party/spanner_pg/src/include/executor/nodeIncrementalSort.h index 0e141833..84cfd96b 100644 --- a/third_party/spanner_pg/src/include/executor/nodeIncrementalSort.h +++ b/third_party/spanner_pg/src/include/executor/nodeIncrementalSort.h @@ -2,7 +2,7 @@ * * nodeIncrementalSort.h * - * 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 * * src/include/executor/nodeIncrementalSort.h diff --git a/third_party/spanner_pg/src/include/executor/nodeIndexonlyscan.h b/third_party/spanner_pg/src/include/executor/nodeIndexonlyscan.h index bcb266b2..47b03950 100644 --- a/third_party/spanner_pg/src/include/executor/nodeIndexonlyscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeIndexonlyscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeIndexonlyscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeIndexscan.h b/third_party/spanner_pg/src/include/executor/nodeIndexscan.h index 70a2cff1..0a075f9a 100644 --- a/third_party/spanner_pg/src/include/executor/nodeIndexscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeIndexscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeIndexscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeLimit.h b/third_party/spanner_pg/src/include/executor/nodeLimit.h index 789871f0..6da0c402 100644 --- a/third_party/spanner_pg/src/include/executor/nodeLimit.h +++ b/third_party/spanner_pg/src/include/executor/nodeLimit.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeLimit.h diff --git a/third_party/spanner_pg/src/include/executor/nodeLockRows.h b/third_party/spanner_pg/src/include/executor/nodeLockRows.h index ca4b72a2..125a32b6 100644 --- a/third_party/spanner_pg/src/include/executor/nodeLockRows.h +++ b/third_party/spanner_pg/src/include/executor/nodeLockRows.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeLockRows.h diff --git a/third_party/spanner_pg/src/include/executor/nodeMaterial.h b/third_party/spanner_pg/src/include/executor/nodeMaterial.h index 3acfc886..21a6860a 100644 --- a/third_party/spanner_pg/src/include/executor/nodeMaterial.h +++ b/third_party/spanner_pg/src/include/executor/nodeMaterial.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeMaterial.h diff --git a/third_party/spanner_pg/src/include/executor/nodeMemoize.h b/third_party/spanner_pg/src/include/executor/nodeMemoize.h index 898fa438..4643163d 100644 --- a/third_party/spanner_pg/src/include/executor/nodeMemoize.h +++ b/third_party/spanner_pg/src/include/executor/nodeMemoize.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeMemoize.h diff --git a/third_party/spanner_pg/src/include/executor/nodeMergeAppend.h b/third_party/spanner_pg/src/include/executor/nodeMergeAppend.h index eb54c2fb..97fe3b06 100644 --- a/third_party/spanner_pg/src/include/executor/nodeMergeAppend.h +++ b/third_party/spanner_pg/src/include/executor/nodeMergeAppend.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeMergeAppend.h diff --git a/third_party/spanner_pg/src/include/executor/nodeMergejoin.h b/third_party/spanner_pg/src/include/executor/nodeMergejoin.h index 031d67d7..26ab5175 100644 --- a/third_party/spanner_pg/src/include/executor/nodeMergejoin.h +++ b/third_party/spanner_pg/src/include/executor/nodeMergejoin.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeMergejoin.h diff --git a/third_party/spanner_pg/src/include/executor/nodeModifyTable.h b/third_party/spanner_pg/src/include/executor/nodeModifyTable.h index 7b20f14b..372cec47 100644 --- a/third_party/spanner_pg/src/include/executor/nodeModifyTable.h +++ b/third_party/spanner_pg/src/include/executor/nodeModifyTable.h @@ -3,7 +3,7 @@ * nodeModifyTable.h * * - * 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 * * src/include/executor/nodeModifyTable.h @@ -27,4 +27,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/third_party/spanner_pg/src/include/executor/nodeNamedtuplestorescan.h b/third_party/spanner_pg/src/include/executor/nodeNamedtuplestorescan.h index fd270a53..d595124e 100644 --- a/third_party/spanner_pg/src/include/executor/nodeNamedtuplestorescan.h +++ b/third_party/spanner_pg/src/include/executor/nodeNamedtuplestorescan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeNamedtuplestorescan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeNestloop.h b/third_party/spanner_pg/src/include/executor/nodeNestloop.h index 9f32e927..b1411faf 100644 --- a/third_party/spanner_pg/src/include/executor/nodeNestloop.h +++ b/third_party/spanner_pg/src/include/executor/nodeNestloop.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeNestloop.h diff --git a/third_party/spanner_pg/src/include/executor/nodeProjectSet.h b/third_party/spanner_pg/src/include/executor/nodeProjectSet.h index 5852237f..2c2b5828 100644 --- a/third_party/spanner_pg/src/include/executor/nodeProjectSet.h +++ b/third_party/spanner_pg/src/include/executor/nodeProjectSet.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeProjectSet.h diff --git a/third_party/spanner_pg/src/include/executor/nodeRecursiveunion.h b/third_party/spanner_pg/src/include/executor/nodeRecursiveunion.h index b1f5f5d8..2d20470d 100644 --- a/third_party/spanner_pg/src/include/executor/nodeRecursiveunion.h +++ b/third_party/spanner_pg/src/include/executor/nodeRecursiveunion.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeRecursiveunion.h diff --git a/third_party/spanner_pg/src/include/executor/nodeResult.h b/third_party/spanner_pg/src/include/executor/nodeResult.h index 197eabac..ebb131d2 100644 --- a/third_party/spanner_pg/src/include/executor/nodeResult.h +++ b/third_party/spanner_pg/src/include/executor/nodeResult.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeResult.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSamplescan.h b/third_party/spanner_pg/src/include/executor/nodeSamplescan.h index 7142a8a2..340b41a4 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSamplescan.h +++ b/third_party/spanner_pg/src/include/executor/nodeSamplescan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSamplescan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSeqscan.h b/third_party/spanner_pg/src/include/executor/nodeSeqscan.h index ef1521ca..c225ba6e 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSeqscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeSeqscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSeqscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSetOp.h b/third_party/spanner_pg/src/include/executor/nodeSetOp.h index d40ed747..a504cf86 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSetOp.h +++ b/third_party/spanner_pg/src/include/executor/nodeSetOp.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSetOp.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSort.h b/third_party/spanner_pg/src/include/executor/nodeSort.h index bf9a5229..008e6a6b 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSort.h +++ b/third_party/spanner_pg/src/include/executor/nodeSort.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSort.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSubplan.h b/third_party/spanner_pg/src/include/executor/nodeSubplan.h index df136cbb..75cc6d51 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSubplan.h +++ b/third_party/spanner_pg/src/include/executor/nodeSubplan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSubplan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeSubqueryscan.h b/third_party/spanner_pg/src/include/executor/nodeSubqueryscan.h index ded12a7d..a09e2be4 100644 --- a/third_party/spanner_pg/src/include/executor/nodeSubqueryscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeSubqueryscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeSubqueryscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeTableFuncscan.h b/third_party/spanner_pg/src/include/executor/nodeTableFuncscan.h index 6b64e08a..2b82e7d7 100644 --- a/third_party/spanner_pg/src/include/executor/nodeTableFuncscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeTableFuncscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeTableFuncscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeTidrangescan.h b/third_party/spanner_pg/src/include/executor/nodeTidrangescan.h index a57a47ed..f122e095 100644 --- a/third_party/spanner_pg/src/include/executor/nodeTidrangescan.h +++ b/third_party/spanner_pg/src/include/executor/nodeTidrangescan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeTidrangescan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeTidscan.h b/third_party/spanner_pg/src/include/executor/nodeTidscan.h index 6be5ace6..91a5f89f 100644 --- a/third_party/spanner_pg/src/include/executor/nodeTidscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeTidscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeTidscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeUnique.h b/third_party/spanner_pg/src/include/executor/nodeUnique.h index 1cde34f2..61f09d98 100644 --- a/third_party/spanner_pg/src/include/executor/nodeUnique.h +++ b/third_party/spanner_pg/src/include/executor/nodeUnique.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeUnique.h diff --git a/third_party/spanner_pg/src/include/executor/nodeValuesscan.h b/third_party/spanner_pg/src/include/executor/nodeValuesscan.h index 1c2a4614..07c13ef1 100644 --- a/third_party/spanner_pg/src/include/executor/nodeValuesscan.h +++ b/third_party/spanner_pg/src/include/executor/nodeValuesscan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeValuesscan.h diff --git a/third_party/spanner_pg/src/include/executor/nodeWindowAgg.h b/third_party/spanner_pg/src/include/executor/nodeWindowAgg.h index f64841c6..4e62c893 100644 --- a/third_party/spanner_pg/src/include/executor/nodeWindowAgg.h +++ b/third_party/spanner_pg/src/include/executor/nodeWindowAgg.h @@ -4,7 +4,7 @@ * prototypes for nodeWindowAgg.c * * - * 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 * * src/include/executor/nodeWindowAgg.h diff --git a/third_party/spanner_pg/src/include/executor/nodeWorktablescan.h b/third_party/spanner_pg/src/include/executor/nodeWorktablescan.h index 998a731c..17842de5 100644 --- a/third_party/spanner_pg/src/include/executor/nodeWorktablescan.h +++ b/third_party/spanner_pg/src/include/executor/nodeWorktablescan.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/executor/nodeWorktablescan.h diff --git a/third_party/spanner_pg/src/include/executor/spi.h b/third_party/spanner_pg/src/include/executor/spi.h index 1e66a7d2..b2c0c748 100644 --- a/third_party/spanner_pg/src/include/executor/spi.h +++ b/third_party/spanner_pg/src/include/executor/spi.h @@ -3,7 +3,7 @@ * spi.h * Server Programming Interface public declarations * - * 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 * * 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) @@ -205,7 +206,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/third_party/spanner_pg/src/include/executor/spi_priv.h b/third_party/spanner_pg/src/include/executor/spi_priv.h index 97f4279a..950e2b19 100644 --- a/third_party/spanner_pg/src/include/executor/spi_priv.h +++ b/third_party/spanner_pg/src/include/executor/spi_priv.h @@ -3,7 +3,7 @@ * spi_priv.h * Server Programming Interface private declarations * - * 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 * * src/include/executor/spi_priv.h diff --git a/third_party/spanner_pg/src/include/executor/tablefunc.h b/third_party/spanner_pg/src/include/executor/tablefunc.h index 17626b00..23b7ae55 100644 --- a/third_party/spanner_pg/src/include/executor/tablefunc.h +++ b/third_party/spanner_pg/src/include/executor/tablefunc.h @@ -3,7 +3,7 @@ * tablefunc.h * interface for TableFunc executor node * - * 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 * * src/include/executor/tablefunc.h diff --git a/third_party/spanner_pg/src/include/executor/tqueue.h b/third_party/spanner_pg/src/include/executor/tqueue.h index ed470f0f..c9e3ffdb 100644 --- a/third_party/spanner_pg/src/include/executor/tqueue.h +++ b/third_party/spanner_pg/src/include/executor/tqueue.h @@ -3,7 +3,7 @@ * tqueue.h * Use shm_mq to send & receive tuples between parallel backends * - * 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 * * src/include/executor/tqueue.h diff --git a/third_party/spanner_pg/src/include/executor/tstoreReceiver.h b/third_party/spanner_pg/src/include/executor/tstoreReceiver.h index 1f58b4f5..4e168b63 100644 --- a/third_party/spanner_pg/src/include/executor/tstoreReceiver.h +++ b/third_party/spanner_pg/src/include/executor/tstoreReceiver.h @@ -4,7 +4,7 @@ * prototypes for tstoreReceiver.c * * - * 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 * * src/include/executor/tstoreReceiver.h diff --git a/third_party/spanner_pg/src/include/executor/tuptable.h b/third_party/spanner_pg/src/include/executor/tuptable.h index 679e57fb..6306bb6f 100644 --- a/third_party/spanner_pg/src/include/executor/tuptable.h +++ b/third_party/spanner_pg/src/include/executor/tuptable.h @@ -4,7 +4,7 @@ * tuple table support stuff * * - * 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 * * src/include/executor/tuptable.h diff --git a/third_party/spanner_pg/src/include/fe_utils/archive.h b/third_party/spanner_pg/src/include/fe_utils/archive.h index 3e6b2915..22e64a51 100644 --- a/third_party/spanner_pg/src/include/fe_utils/archive.h +++ b/third_party/spanner_pg/src/include/fe_utils/archive.h @@ -3,7 +3,7 @@ * archive.h * Routines to access WAL archives from frontend * - * 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 * * src/include/fe_utils/archive.h diff --git a/third_party/spanner_pg/src/include/fe_utils/cancel.h b/third_party/spanner_pg/src/include/fe_utils/cancel.h index 3a87d1a8..3b84daf6 100644 --- a/third_party/spanner_pg/src/include/fe_utils/cancel.h +++ b/third_party/spanner_pg/src/include/fe_utils/cancel.h @@ -3,7 +3,7 @@ * Query cancellation support for frontend code * * - * 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 * * 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/third_party/spanner_pg/src/include/fe_utils/conditional.h b/third_party/spanner_pg/src/include/fe_utils/conditional.h index c64c6557..fa53d865 100644 --- a/third_party/spanner_pg/src/include/fe_utils/conditional.h +++ b/third_party/spanner_pg/src/include/fe_utils/conditional.h @@ -14,7 +14,7 @@ * a true branch?) so that the interpreter knows whether to execute * code and whether to evaluate conditions. * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * * 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); diff --git a/third_party/spanner_pg/src/include/fe_utils/connect_utils.h b/third_party/spanner_pg/src/include/fe_utils/connect_utils.h index 50489405..74613966 100644 --- a/third_party/spanner_pg/src/include/fe_utils/connect_utils.h +++ b/third_party/spanner_pg/src/include/fe_utils/connect_utils.h @@ -2,7 +2,7 @@ * * Facilities for frontend code to connect to and disconnect from databases. * - * 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 * * src/include/fe_utils/connect_utils.h diff --git a/third_party/spanner_pg/src/include/fe_utils/mbprint.h b/third_party/spanner_pg/src/include/fe_utils/mbprint.h index df677dc5..5dd21817 100644 --- a/third_party/spanner_pg/src/include/fe_utils/mbprint.h +++ b/third_party/spanner_pg/src/include/fe_utils/mbprint.h @@ -3,7 +3,7 @@ * Multibyte character printing support for frontend code * * - * 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 * * src/include/fe_utils/mbprint.h diff --git a/third_party/spanner_pg/src/include/fe_utils/option_utils.h b/third_party/spanner_pg/src/include/fe_utils/option_utils.h index d653cb94..03c09fd1 100644 --- a/third_party/spanner_pg/src/include/fe_utils/option_utils.h +++ b/third_party/spanner_pg/src/include/fe_utils/option_utils.h @@ -2,7 +2,7 @@ * * Command line option processing facilities for frontend code * - * 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 * * src/include/fe_utils/option_utils.h @@ -19,5 +19,8 @@ typedef void (*help_handler) (const char *progname); extern void handle_help_version_opts(int argc, char *argv[], const char *fixed_progname, help_handler hlp); +extern bool option_parse_int(const char *optarg, const char *optname, + int min_range, int max_range, + int *result); #endif /* OPTION_UTILS_H */ diff --git a/third_party/spanner_pg/src/include/fe_utils/parallel_slot.h b/third_party/spanner_pg/src/include/fe_utils/parallel_slot.h index b7e2b0a2..8ce63c93 100644 --- a/third_party/spanner_pg/src/include/fe_utils/parallel_slot.h +++ b/third_party/spanner_pg/src/include/fe_utils/parallel_slot.h @@ -3,7 +3,7 @@ * parallel_slot.h * Parallel support for bin/scripts/ * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/fe_utils/parallel_slot.h * diff --git a/third_party/spanner_pg/src/include/fe_utils/print.h b/third_party/spanner_pg/src/include/fe_utils/print.h index 27ccbd51..bb2f1bf4 100644 --- a/third_party/spanner_pg/src/include/fe_utils/print.h +++ b/third_party/spanner_pg/src/include/fe_utils/print.h @@ -3,7 +3,7 @@ * Query-result printing support for frontend code * * - * 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 * * 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/third_party/spanner_pg/src/include/fe_utils/psqlscan.h b/third_party/spanner_pg/src/include/fe_utils/psqlscan.h index e55f1fa2..249acab2 100644 --- a/third_party/spanner_pg/src/include/fe_utils/psqlscan.h +++ b/third_party/spanner_pg/src/include/fe_utils/psqlscan.h @@ -10,7 +10,7 @@ * backslash commands. * * - * 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 * * src/include/fe_utils/psqlscan.h diff --git a/third_party/spanner_pg/src/include/fe_utils/psqlscan_int.h b/third_party/spanner_pg/src/include/fe_utils/psqlscan_int.h index 8ada9770..4905aae4 100644 --- a/third_party/spanner_pg/src/include/fe_utils/psqlscan_int.h +++ b/third_party/spanner_pg/src/include/fe_utils/psqlscan_int.h @@ -34,7 +34,7 @@ * same flex version, or if they don't use the same flex options. * * - * 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 * * src/include/fe_utils/psqlscan_int.h diff --git a/third_party/spanner_pg/src/include/fe_utils/query_utils.h b/third_party/spanner_pg/src/include/fe_utils/query_utils.h index 10992601..90cb3db7 100644 --- a/third_party/spanner_pg/src/include/fe_utils/query_utils.h +++ b/third_party/spanner_pg/src/include/fe_utils/query_utils.h @@ -2,7 +2,7 @@ * * Facilities for frontend code to query a databases. * - * 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 * * src/include/fe_utils/query_utils.h diff --git a/third_party/spanner_pg/src/include/fe_utils/recovery_gen.h b/third_party/spanner_pg/src/include/fe_utils/recovery_gen.h index 7ac89539..83e181a2 100644 --- a/third_party/spanner_pg/src/include/fe_utils/recovery_gen.h +++ b/third_party/spanner_pg/src/include/fe_utils/recovery_gen.h @@ -2,7 +2,7 @@ * * Generator for recovery configuration * - * Portions Copyright (c) 2011-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2011-2022, PostgreSQL Global Development Group * * src/include/fe_utils/recovery_gen.h * diff --git a/third_party/spanner_pg/src/include/fe_utils/simple_list.h b/third_party/spanner_pg/src/include/fe_utils/simple_list.h index b05b9984..9261a7b0 100644 --- a/third_party/spanner_pg/src/include/fe_utils/simple_list.h +++ b/third_party/spanner_pg/src/include/fe_utils/simple_list.h @@ -7,7 +7,7 @@ * facilities, but it's all we need in, eg, pg_dump. * * - * 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 * * src/include/fe_utils/simple_list.h diff --git a/third_party/spanner_pg/src/include/fe_utils/string_utils.h b/third_party/spanner_pg/src/include/fe_utils/string_utils.h index 0cc4b212..fa4deb24 100644 --- a/third_party/spanner_pg/src/include/fe_utils/string_utils.h +++ b/third_party/spanner_pg/src/include/fe_utils/string_utils.h @@ -6,7 +6,7 @@ * assorted contexts. * * - * 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 * * 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 */ @@ -46,6 +46,7 @@ extern void appendConnStrVal(PQExpBuffer buf, const char *str); extern void appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname); extern bool parsePGArray(const char *atext, char ***itemarray, int *nitems); +extern void appendPGArray(PQExpBuffer buffer, const char *value); extern bool appendReloptionsArray(PQExpBuffer buffer, const char *reloptions, const char *prefix, int encoding, bool std_strings); diff --git a/third_party/spanner_pg/src/include/fmgr.h b/third_party/spanner_pg/src/include/fmgr.h index cf10b5b6..b64287e3 100644 --- a/third_party/spanner_pg/src/include/fmgr.h +++ b/third_party/spanner_pg/src/include/fmgr.h @@ -8,7 +8,7 @@ * or call fmgr-callable functions. * * - * 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 * * src/include/fmgr.h @@ -458,6 +458,7 @@ typedef struct int indexmaxkeys; /* INDEX_MAX_KEYS */ int namedatalen; /* NAMEDATALEN */ int float8byval; /* FLOAT8PASSBYVAL */ + char abi_extra[32]; /* see pg_config_manual.h */ } Pg_magic_struct; /* The actual data block contents */ @@ -468,9 +469,13 @@ typedef struct FUNC_MAX_ARGS, \ INDEX_MAX_KEYS, \ NAMEDATALEN, \ - FLOAT8PASSBYVAL \ + FLOAT8PASSBYVAL, \ + FMGR_ABI_EXTRA, \ } +StaticAssertDecl(sizeof(FMGR_ABI_EXTRA) <= sizeof(((Pg_magic_struct *) 0)->abi_extra), + "FMGR_ABI_EXTRA too long"); + /* * Declare the module magic function. It needs to be a function as the dlsym * in the backend is only guaranteed to work on functions, not data @@ -775,7 +780,6 @@ extern bytea *OidSendFunctionCall(Oid functionId, Datum val); * Routines in fmgr.c */ extern const Pg_finfo_record *fetch_finfo_record(void *filehandle, const char *funcname); -extern void clear_external_function_hash(void *filehandle); extern Oid fmgr_internal_function(const char *proname); extern Oid get_fn_expr_rettype(FmgrInfo *flinfo); extern Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum); @@ -791,7 +795,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/third_party/spanner_pg/src/include/foreign/fdwapi.h b/third_party/spanner_pg/src/include/foreign/fdwapi.h index a801cd30..57c02bff 100644 --- a/third_party/spanner_pg/src/include/foreign/fdwapi.h +++ b/third_party/spanner_pg/src/include/foreign/fdwapi.h @@ -3,7 +3,7 @@ * fdwapi.h * API for foreign-data wrappers * - * Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Copyright (c) 2010-2022, PostgreSQL Global Development Group * * src/include/foreign/fdwapi.h * diff --git a/third_party/spanner_pg/src/include/foreign/foreign.h b/third_party/spanner_pg/src/include/foreign/foreign.h index 8169eb76..75538110 100644 --- a/third_party/spanner_pg/src/include/foreign/foreign.h +++ b/third_party/spanner_pg/src/include/foreign/foreign.h @@ -4,7 +4,7 @@ * support for foreign-data wrappers, servers and user mappings. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/foreign/foreign.h * diff --git a/third_party/spanner_pg/src/include/funcapi.h b/third_party/spanner_pg/src/include/funcapi.h index 87df73f2..740357b4 100644 --- a/third_party/spanner_pg/src/include/funcapi.h +++ b/third_party/spanner_pg/src/include/funcapi.h @@ -8,7 +8,7 @@ * or call FUNCAPI-callable functions or macros. * * - * Copyright (c) 2002-2021, PostgreSQL Global Development Group + * Copyright (c) 2002-2022, PostgreSQL Global Development Group * * src/include/funcapi.h * @@ -278,14 +278,26 @@ 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 InitMaterializedSRF() (see + * fmgr/README). Alternatively, set up a callback to release resources + * at query shutdown, using RegisterExprContextCallback(). * *---------- */ /* from funcapi.c */ + +/* flag bits for InitMaterializedSRF() */ +#define MAT_SRF_USE_EXPECTED_DESC 0x01 /* use expectedDesc as tupdesc. */ +#define MAT_SRF_BLESS 0x02 /* "Bless" a tuple descriptor with + * BlessTupleDesc(). */ +extern void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags); + +/* Compatibility declarations, for v15 */ +#define SRF_SINGLE_USE_EXPECTED MAT_SRF_USE_EXPECTED_DESC +#define SRF_SINGLE_BLESS MAT_SRF_BLESS +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); diff --git a/third_party/spanner_pg/src/include/getaddrinfo.h b/third_party/spanner_pg/src/include/getaddrinfo.h index 4cf4c4d4..2042c2d3 100644 --- a/third_party/spanner_pg/src/include/getaddrinfo.h +++ b/third_party/spanner_pg/src/include/getaddrinfo.h @@ -13,7 +13,7 @@ * This code will also work on platforms where struct addrinfo is defined * in the system headers but no getaddrinfo() can be located. * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/getaddrinfo.h * diff --git a/third_party/spanner_pg/src/include/getopt_long.h b/third_party/spanner_pg/src/include/getopt_long.h index 812e2c84..83dde67a 100644 --- a/third_party/spanner_pg/src/include/getopt_long.h +++ b/third_party/spanner_pg/src/include/getopt_long.h @@ -2,7 +2,7 @@ * Portions Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * Portions Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/getopt_long.h */ diff --git a/third_party/spanner_pg/src/include/jit/jit.h b/third_party/spanner_pg/src/include/jit/jit.h index b634df30..d1940332 100644 --- a/third_party/spanner_pg/src/include/jit/jit.h +++ b/third_party/spanner_pg/src/include/jit/jit.h @@ -2,7 +2,7 @@ * jit.h * Provider independent JIT infrastructure. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/jit/llvmjit.h b/third_party/spanner_pg/src/include/jit/llvmjit.h index 60cb5d51..08fac9ec 100644 --- a/third_party/spanner_pg/src/include/jit/llvmjit.h +++ b/third_party/spanner_pg/src/include/jit/llvmjit.h @@ -2,7 +2,7 @@ * llvmjit.h * LLVM JIT provider. * - * Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/jit/llvmjit.h * @@ -42,6 +42,13 @@ typedef struct LLVMJitContext /* number of modules created */ size_t module_generation; + /* + * The LLVM Context used by this JIT context. An LLVM context is reused + * across many compilations, but occasionally reset to prevent it using + * too much memory due to more and more types accumulating. + */ + LLVMContextRef llvm_context; + /* current, "open for write", module */ LLVMModuleRef module; @@ -56,34 +63,35 @@ 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 StructHeapTupleHeaderData; -extern LLVMTypeRef StructMinimalTupleData; -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 LLVMValueRef ExecEvalBoolSubroutineTemplate; -extern LLVMValueRef ExecEvalSubroutineTemplate; +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 StructHeapTupleHeaderData; +extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleData; +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 LLVMTypeRef StructPlanState; + +extern PGDLLIMPORT LLVMValueRef AttributeTemplate; +extern PGDLLIMPORT LLVMValueRef ExecEvalBoolSubroutineTemplate; +extern PGDLLIMPORT LLVMValueRef ExecEvalSubroutineTemplate; extern void llvm_enter_fatal_on_oom(void); @@ -106,6 +114,7 @@ extern LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMModuleRef mod, FunctionCallInfo fcinfo); +extern void llvm_inline_reset_caches(void); extern void llvm_inline(LLVMModuleRef mod); /* diff --git a/third_party/spanner_pg/src/include/jit/llvmjit_emit.h b/third_party/spanner_pg/src/include/jit/llvmjit_emit.h index c7e31249..0a0f876b 100644 --- a/third_party/spanner_pg/src/include/jit/llvmjit_emit.h +++ b/third_party/spanner_pg/src/include/jit/llvmjit_emit.h @@ -2,7 +2,7 @@ * llvmjit_emit.h * Helpers to make emitting LLVM IR a bit more concise and pgindent proof. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * src/include/jit/llvmjit_emit.h */ @@ -45,36 +45,36 @@ l_ptr(LLVMTypeRef t) * Emit constant integer. */ static inline LLVMValueRef -l_int8_const(int8 i) +l_int8_const(LLVMContextRef lc, int8 i) { - return LLVMConstInt(LLVMInt8Type(), i, false); + return LLVMConstInt(LLVMInt8TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int16_const(int16 i) +l_int16_const(LLVMContextRef lc, int16 i) { - return LLVMConstInt(LLVMInt16Type(), i, false); + return LLVMConstInt(LLVMInt16TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int32_const(int32 i) +l_int32_const(LLVMContextRef lc, int32 i) { - return LLVMConstInt(LLVMInt32Type(), i, false); + return LLVMConstInt(LLVMInt32TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int64_const(int64 i) +l_int64_const(LLVMContextRef lc, int64 i) { - return LLVMConstInt(LLVMInt64Type(), i, false); + return LLVMConstInt(LLVMInt64TypeInContext(lc), i, false); } /* @@ -177,12 +177,15 @@ l_bb_before_v(LLVMBasicBlockRef r, const char *fmt,...) { char buf[512]; va_list args; + LLVMContextRef lc; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); - return LLVMInsertBasicBlock(r, buf); + lc = LLVMGetTypeContext(LLVMTypeOf(LLVMGetBasicBlockParent(r))); + + return LLVMInsertBasicBlockInContext(lc, r, buf); } /* separate, because pg_attribute_printf(2, 3) can't appear in definition */ @@ -197,12 +200,15 @@ l_bb_append_v(LLVMValueRef f, const char *fmt,...) { char buf[512]; va_list args; + LLVMContextRef lc; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); - return LLVMAppendBasicBlock(f, buf); + lc = LLVMGetTypeContext(LLVMTypeOf(f)); + + return LLVMAppendBasicBlockInContext(lc, f, buf); } /* @@ -214,7 +220,7 @@ l_callsite_ro(LLVMValueRef f) const char argname[] = "readonly"; LLVMAttributeRef ref; - ref = LLVMCreateStringAttribute(LLVMGetGlobalContext(), + ref = LLVMCreateStringAttribute(LLVMGetTypeContext(LLVMTypeOf(f)), argname, sizeof(argname) - 1, NULL, 0); @@ -234,7 +240,7 @@ l_callsite_alwaysinline(LLVMValueRef f) id = LLVMGetEnumAttributeKindForName(argname, sizeof(argname) - 1); - attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), id, 0); + attr = LLVMCreateEnumAttribute(LLVMGetTypeContext(LLVMTypeOf(f)), id, 0); LLVMAddCallSiteAttribute(f, LLVMAttributeFunctionIndex, attr); } diff --git a/third_party/spanner_pg/src/include/lib/binaryheap.h b/third_party/spanner_pg/src/include/lib/binaryheap.h index 5831351e..e420e071 100644 --- a/third_party/spanner_pg/src/include/lib/binaryheap.h +++ b/third_party/spanner_pg/src/include/lib/binaryheap.h @@ -3,7 +3,7 @@ * * A simple binary heap implementation * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * src/include/lib/binaryheap.h */ diff --git a/third_party/spanner_pg/src/include/lib/bipartite_match.h b/third_party/spanner_pg/src/include/lib/bipartite_match.h index ee65ae26..7560883f 100644 --- a/third_party/spanner_pg/src/include/lib/bipartite_match.h +++ b/third_party/spanner_pg/src/include/lib/bipartite_match.h @@ -1,7 +1,7 @@ /* * bipartite_match.h * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * src/include/lib/bipartite_match.h */ diff --git a/third_party/spanner_pg/src/include/lib/bloomfilter.h b/third_party/spanner_pg/src/include/lib/bloomfilter.h index d919dad6..8146d8e7 100644 --- a/third_party/spanner_pg/src/include/lib/bloomfilter.h +++ b/third_party/spanner_pg/src/include/lib/bloomfilter.h @@ -3,7 +3,7 @@ * bloomfilter.h * Space-efficient set membership testing * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/bloomfilter.h diff --git a/third_party/spanner_pg/src/include/lib/dshash.h b/third_party/spanner_pg/src/include/lib/dshash.h index c069ec9d..28f8db2e 100644 --- a/third_party/spanner_pg/src/include/lib/dshash.h +++ b/third_party/spanner_pg/src/include/lib/dshash.h @@ -3,7 +3,7 @@ * dshash.h * Concurrent hash tables backed by dynamic shared memory areas. * - * 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 * * IDENTIFICATION @@ -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,13 @@ 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); + /* 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/third_party/spanner_pg/src/include/lib/hyperloglog.h b/third_party/spanner_pg/src/include/lib/hyperloglog.h index 42f89171..414bcb4b 100644 --- a/third_party/spanner_pg/src/include/lib/hyperloglog.h +++ b/third_party/spanner_pg/src/include/lib/hyperloglog.h @@ -3,7 +3,7 @@ * * A simple HyperLogLog cardinality estimator implementation * - * Portions Copyright (c) 2014-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2014-2022, PostgreSQL Global Development Group * * Based on Hideaki Ohno's C++ implementation. The copyright terms of Ohno's * original version (the MIT license) follow. diff --git a/third_party/spanner_pg/src/include/lib/ilist.h b/third_party/spanner_pg/src/include/lib/ilist.h index ddbdb207..7ab0888f 100644 --- a/third_party/spanner_pg/src/include/lib/ilist.h +++ b/third_party/spanner_pg/src/include/lib/ilist.h @@ -96,7 +96,7 @@ * } * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/lib/integerset.h b/third_party/spanner_pg/src/include/lib/integerset.h index 589535f0..081ae3cc 100644 --- a/third_party/spanner_pg/src/include/lib/integerset.h +++ b/third_party/spanner_pg/src/include/lib/integerset.h @@ -2,7 +2,7 @@ * integerset.h * In-memory data structure to hold a large set of integers efficiently * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * src/include/lib/integerset.h */ diff --git a/third_party/spanner_pg/src/include/lib/knapsack.h b/third_party/spanner_pg/src/include/lib/knapsack.h index dcfdbe34..e86a0bc8 100644 --- a/third_party/spanner_pg/src/include/lib/knapsack.h +++ b/third_party/spanner_pg/src/include/lib/knapsack.h @@ -1,7 +1,7 @@ /* * knapsack.h * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * src/include/lib/knapsack.h */ diff --git a/third_party/spanner_pg/src/include/lib/pairingheap.h b/third_party/spanner_pg/src/include/lib/pairingheap.h index 73d1a30e..26b1cad5 100644 --- a/third_party/spanner_pg/src/include/lib/pairingheap.h +++ b/third_party/spanner_pg/src/include/lib/pairingheap.h @@ -3,7 +3,7 @@ * * A Pairing Heap implementation * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * * src/include/lib/pairingheap.h */ diff --git a/third_party/spanner_pg/src/include/lib/qunique.h b/third_party/spanner_pg/src/include/lib/qunique.h index d33b219e..982addf7 100644 --- a/third_party/spanner_pg/src/include/lib/qunique.h +++ b/third_party/spanner_pg/src/include/lib/qunique.h @@ -2,7 +2,7 @@ * * qunique.h * inline array unique functions - * Portions Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2019-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/qunique.h diff --git a/third_party/spanner_pg/src/include/lib/rbtree.h b/third_party/spanner_pg/src/include/lib/rbtree.h index 48c60f7e..580a3e34 100644 --- a/third_party/spanner_pg/src/include/lib/rbtree.h +++ b/third_party/spanner_pg/src/include/lib/rbtree.h @@ -3,7 +3,7 @@ * rbtree.h * interface for PostgreSQL generic Red-Black binary tree package * - * Copyright (c) 2009-2021, PostgreSQL Global Development Group + * Copyright (c) 2009-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/rbtree.h diff --git a/third_party/spanner_pg/src/include/lib/simplehash.h b/third_party/spanner_pg/src/include/lib/simplehash.h index 548526f7..d95388d0 100644 --- a/third_party/spanner_pg/src/include/lib/simplehash.h +++ b/third_party/spanner_pg/src/include/lib/simplehash.h @@ -41,7 +41,7 @@ * - SH_SCOPE - in which scope (e.g. extern, static inline) do function * declarations reside * - SH_RAW_ALLOCATOR - if defined, memory contexts are not used; instead, - * use this to allocate bytes + * use this to allocate bytes. The allocator must zero the returned space. * - SH_USE_NONDEFAULT_ALLOCATOR - if defined no element allocator functions * are defined, so you can supply your own * The following parameters are only relevant when SH_DEFINE is defined: @@ -87,7 +87,7 @@ * looking or is done - buckets following a deleted element are shifted * backwards, unless they're empty or already at their optimal position. * - * 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 * * 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__) @@ -1115,7 +1114,7 @@ SH_STAT(SH_TYPE * tb) avg_collisions = 0; } - sh_log("size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %i, avg_collisions: %f", + sh_log("size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %u, avg_collisions: %f", tb->size, tb->members, fillfactor, total_chain_length, max_chain_length, avg_chain_length, total_collisions, max_collisions, avg_collisions); } diff --git a/third_party/spanner_pg/src/include/lib/sort_template.h b/third_party/spanner_pg/src/include/lib/sort_template.h index f52627d8..3122a930 100644 --- a/third_party/spanner_pg/src/include/lib/sort_template.h +++ b/third_party/spanner_pg/src/include/lib/sort_template.h @@ -5,7 +5,7 @@ * A template for a sort algorithm that supports varying degrees of * specialization. * - * Copyright (c) 2021, PostgreSQL Global Development Group + * Copyright (c) 2021-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1992-1994, Regents of the University of California * * Usage notes: @@ -407,6 +407,7 @@ ST_SORT(ST_ELEMENT_TYPE * data, size_t n #undef DO_SORT #undef DO_SWAP #undef DO_SWAPN +#undef ST_CHECK_FOR_INTERRUPTS #undef ST_COMPARATOR_TYPE_NAME #undef ST_COMPARE #undef ST_COMPARE_ARG_TYPE diff --git a/third_party/spanner_pg/src/include/lib/stringinfo.h b/third_party/spanner_pg/src/include/lib/stringinfo.h index 262d79fb..9b755c48 100644 --- a/third_party/spanner_pg/src/include/lib/stringinfo.h +++ b/third_party/spanner_pg/src/include/lib/stringinfo.h @@ -8,7 +8,7 @@ * (null-terminated text) or arbitrary binary data. All storage is allocated * with palloc() (falling back to malloc in frontend code). * - * 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 * * src/include/lib/stringinfo.h diff --git a/third_party/spanner_pg/src/include/libpq/auth.h b/third_party/spanner_pg/src/include/libpq/auth.h index 3610fae3..d3c189ef 100644 --- a/third_party/spanner_pg/src/include/libpq/auth.h +++ b/third_party/spanner_pg/src/include/libpq/auth.h @@ -4,7 +4,7 @@ * Definitions for network authentication routines * * - * 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 * * src/include/libpq/auth.h @@ -16,11 +16,13 @@ #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, + int extralen); /* Hook for plugins to get control in ClientAuthentication() */ typedef void (*ClientAuthentication_hook_type) (Port *, int); diff --git a/third_party/spanner_pg/src/include/libpq/be-fsstubs.h b/third_party/spanner_pg/src/include/libpq/be-fsstubs.h index 9c15efef..130bc300 100644 --- a/third_party/spanner_pg/src/include/libpq/be-fsstubs.h +++ b/third_party/spanner_pg/src/include/libpq/be-fsstubs.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/libpq/be-fsstubs.h diff --git a/third_party/spanner_pg/src/include/libpq/be-gssapi-common.h b/third_party/spanner_pg/src/include/libpq/be-gssapi-common.h index c2215f6c..ae841124 100644 --- a/third_party/spanner_pg/src/include/libpq/be-gssapi-common.h +++ b/third_party/spanner_pg/src/include/libpq/be-gssapi-common.h @@ -3,7 +3,7 @@ * be-gssapi-common.h * Definitions for GSSAPI authentication and encryption handling * - * 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 * * src/include/libpq/be-gssapi-common.h diff --git a/third_party/spanner_pg/src/include/libpq/crypt.h b/third_party/spanner_pg/src/include/libpq/crypt.h index a4fea6e4..3238cf66 100644 --- a/third_party/spanner_pg/src/include/libpq/crypt.h +++ b/third_party/spanner_pg/src/include/libpq/crypt.h @@ -3,7 +3,7 @@ * crypt.h * Interface to libpq/crypt.c * - * 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 * * src/include/libpq/crypt.h @@ -35,12 +35,13 @@ extern PasswordType get_password_type(const char *shadow_pass); extern char *encrypt_password(PasswordType target_type, const char *role, const char *password); -extern char *get_role_password(const char *role, char **logdetail); +extern char *get_role_password(const char *role, const char **logdetail); extern int md5_crypt_verify(const char *role, const char *shadow_pass, const char *client_pass, const char *md5_salt, - int md5_salt_len, char **logdetail); + int md5_salt_len, const char **logdetail); extern int plain_crypt_verify(const char *role, const char *shadow_pass, - const char *client_pass, char **logdetail); + const char *client_pass, + const char **logdetail); #endif diff --git a/third_party/spanner_pg/src/include/libpq/hba.h b/third_party/spanner_pg/src/include/libpq/hba.h index 1b90a044..6a89b858 100644 --- a/third_party/spanner_pg/src/include/libpq/hba.h +++ b/third_party/spanner_pg/src/include/libpq/hba.h @@ -131,6 +131,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; @@ -141,6 +169,10 @@ extern void hba_getauthmethod(hbaPort *port); extern int check_usermap(const char *usermap_name, const char *pg_role, const char *auth_user, bool case_insensitive); +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); #endif /* HBA_H */ diff --git a/third_party/spanner_pg/src/include/libpq/ifaddr.h b/third_party/spanner_pg/src/include/libpq/ifaddr.h index e6ef1417..b04d0937 100644 --- a/third_party/spanner_pg/src/include/libpq/ifaddr.h +++ b/third_party/spanner_pg/src/include/libpq/ifaddr.h @@ -3,7 +3,7 @@ * ifaddr.h * IP netmask calculations, and enumerating network interfaces. * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/libpq/ifaddr.h * diff --git a/third_party/spanner_pg/src/include/libpq/libpq-be.h b/third_party/spanner_pg/src/include/libpq/libpq-be.h index 4acb1cda..351b4f4d 100644 --- a/third_party/spanner_pg/src/include/libpq/libpq-be.h +++ b/third_party/spanner_pg/src/include/libpq/libpq-be.h @@ -8,7 +8,7 @@ * Structs that need to be client-visible are in pqcomm.h. * * - * 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 * * 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; @@ -327,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/third_party/spanner_pg/src/include/libpq/libpq-fs.h b/third_party/spanner_pg/src/include/libpq/libpq-fs.h index e61768cd..7fa02d2c 100644 --- a/third_party/spanner_pg/src/include/libpq/libpq-fs.h +++ b/third_party/spanner_pg/src/include/libpq/libpq-fs.h @@ -4,7 +4,7 @@ * definitions for using Inversion file system routines (ie, large objects) * * - * 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 * * src/include/libpq/libpq-fs.h diff --git a/third_party/spanner_pg/src/include/libpq/libpq.h b/third_party/spanner_pg/src/include/libpq/libpq.h index 6b67a2a3..2de7d9ba 100644 --- a/third_party/spanner_pg/src/include/libpq/libpq.h +++ b/third_party/spanner_pg/src/include/libpq/libpq.h @@ -4,7 +4,7 @@ * POSTGRES LIBPQ buffer structure definitions. * * - * 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 * * src/include/libpq/libpq.h @@ -58,10 +58,11 @@ extern const PGDLLIMPORT PQcommMethods *PqCommMethods; /* * prototypes for functions in pqcomm.c */ -extern WaitEventSet *FeBeWaitSet; +extern PGDLLIMPORT WaitEventSet *FeBeWaitSet; #define FeBeWaitSetSocketPos 0 #define FeBeWaitSetLatchPos 1 +#define FeBeWaitSetNEvents 3 extern int StreamServerPort(int family, const char *hostName, unsigned short portNumber, const char *unixSocketDir, @@ -86,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); @@ -117,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/third_party/spanner_pg/src/include/libpq/pqcomm.h b/third_party/spanner_pg/src/include/libpq/pqcomm.h index be9d9705..b418283d 100644 --- a/third_party/spanner_pg/src/include/libpq/pqcomm.h +++ b/third_party/spanner_pg/src/include/libpq/pqcomm.h @@ -6,7 +6,7 @@ * NOTE: for historical reasons, this does not correspond to pqcomm.c. * pqcomm.c's routines are declared in libpq.h. * - * 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 * * src/include/libpq/pqcomm.h @@ -62,7 +62,7 @@ struct sockaddr_storage typedef struct { struct sockaddr_storage addr; - ACCEPT_TYPE_ARG3 salen; + socklen_t salen; } SockAddr; /* Configure the UNIX socket location for the well known port. */ @@ -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/third_party/spanner_pg/src/include/libpq/pqformat.h b/third_party/spanner_pg/src/include/libpq/pqformat.h index 51f76661..cd834825 100644 --- a/third_party/spanner_pg/src/include/libpq/pqformat.h +++ b/third_party/spanner_pg/src/include/libpq/pqformat.h @@ -3,7 +3,7 @@ * pqformat.h * Definitions for formatting and parsing frontend/backend messages * - * 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 * * src/include/libpq/pqformat.h diff --git a/third_party/spanner_pg/src/include/libpq/pqmq.h b/third_party/spanner_pg/src/include/libpq/pqmq.h index 31a4723f..6687c8f4 100644 --- a/third_party/spanner_pg/src/include/libpq/pqmq.h +++ b/third_party/spanner_pg/src/include/libpq/pqmq.h @@ -3,7 +3,7 @@ * pqmq.h * Use the frontend/backend protocol for communication over a shm_mq * - * 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 * * src/include/libpq/pqmq.h diff --git a/third_party/spanner_pg/src/include/libpq/pqsignal.h b/third_party/spanner_pg/src/include/libpq/pqsignal.h index 1161b138..41227a30 100644 --- a/third_party/spanner_pg/src/include/libpq/pqsignal.h +++ b/third_party/spanner_pg/src/include/libpq/pqsignal.h @@ -3,7 +3,7 @@ * pqsignal.h * Backend signal(2) support (see also src/port/pqsignal.c) * - * 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 * * src/include/libpq/pqsignal.h @@ -30,9 +30,9 @@ extern int pqsigsetmask(int mask); #define sigdelset(set, signum) (*(set) &= ~(sigmask(signum))) #endif /* WIN32 */ -extern sigset_t UnBlockSig, - BlockSig, - StartupBlockSig; +extern PGDLLIMPORT sigset_t UnBlockSig; +extern PGDLLIMPORT sigset_t BlockSig; +extern PGDLLIMPORT sigset_t StartupBlockSig; extern void pqinitmask(void); diff --git a/third_party/spanner_pg/src/include/libpq/sasl.h b/third_party/spanner_pg/src/include/libpq/sasl.h new file mode 100644 index 00000000..39ccf8f0 --- /dev/null +++ b/third_party/spanner_pg/src/include/libpq/sasl.h @@ -0,0 +1,136 @@ +/*------------------------------------------------------------------------- + * + * sasl.h + * Defines the SASL mechanism interface for the backend. + * + * Each SASL mechanism defines a frontend and a backend callback structure. + * + * See src/interfaces/libpq/fe-auth-sasl.h for the frontend counterpart. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/libpq/sasl.h + * + *------------------------------------------------------------------------- + */ + +#ifndef PG_SASL_H +#define PG_SASL_H + +#include "lib/stringinfo.h" +#include "libpq/libpq-be.h" + +/* Status codes for message exchange */ +#define PG_SASL_EXCHANGE_CONTINUE 0 +#define PG_SASL_EXCHANGE_SUCCESS 1 +#define PG_SASL_EXCHANGE_FAILURE 2 + +/* + * Backend SASL mechanism callbacks. + * + * To implement a backend mechanism, declare a pg_be_sasl_mech struct with + * appropriate callback implementations. Then pass the mechanism to + * CheckSASLAuth() during ClientAuthentication(), once the server has decided + * which authentication method to use. + */ +typedef struct pg_be_sasl_mech +{ + /*--------- + * get_mechanisms() + * + * Retrieves the list of SASL mechanism names supported by this + * implementation. + * + * Input parameters: + * + * port: The client Port + * + * Output parameters: + * + * buf: A StringInfo buffer that the callback should populate with + * supported mechanism names. The names are appended into this + * StringInfo, each one ending with '\0' bytes. + *--------- + */ + void (*get_mechanisms) (Port *port, StringInfo buf); + + /*--------- + * init() + * + * Initializes mechanism-specific state for a connection. This callback + * must return a pointer to its allocated state, which will be passed + * as-is as the first argument to the other callbacks. + * + * Input parameters: + * + * port: The client Port. + * + * mech: The actual mechanism name in use by the client. + * + * shadow_pass: The stored secret for the role being authenticated, or + * NULL if one does not exist. Mechanisms that do not use + * shadow entries may ignore this parameter. If a + * mechanism uses shadow entries but shadow_pass is NULL, + * the implementation must continue the exchange as if the + * user existed and the password did not match, to avoid + * disclosing valid user names. + *--------- + */ + void *(*init) (Port *port, const char *mech, const char *shadow_pass); + + /*--------- + * exchange() + * + * Produces a server challenge to be sent to the client. The callback + * must return one of the PG_SASL_EXCHANGE_* values, depending on + * whether the exchange continues, has finished successfully, or has + * failed. + * + * Input parameters: + * + * state: The opaque mechanism state returned by init() + * + * input: The response data sent by the client, or NULL if the + * mechanism is client-first but the client did not send an + * initial response. (This can only happen during the first + * message from the client.) This is guaranteed to be + * null-terminated for safety, but SASL allows embedded + * nulls in responses, so mechanisms must be careful to + * check inputlen. + * + * inputlen: The length of the challenge data sent by the server, or + * -1 if the client did not send an initial response + * + * Output parameters, to be set by the callback function: + * + * output: A palloc'd buffer containing either the server's next + * challenge (if PG_SASL_EXCHANGE_CONTINUE is returned) or + * the server's outcome data (if PG_SASL_EXCHANGE_SUCCESS is + * returned and the mechanism requires data to be sent during + * a successful outcome). The callback should set this to + * NULL if the exchange is over and no output should be sent, + * which should correspond to either PG_SASL_EXCHANGE_FAILURE + * or a PG_SASL_EXCHANGE_SUCCESS with no outcome data. + * + * outputlen: The length of the challenge data. Ignored if *output is + * NULL. + * + * logdetail: Set to an optional DETAIL message to be printed to the + * server log, to disambiguate failure modes. (The client + * will only ever see the same generic authentication + * failure message.) Ignored if the exchange is completed + * with PG_SASL_EXCHANGE_SUCCESS. + *--------- + */ + int (*exchange) (void *state, + const char *input, int inputlen, + char **output, int *outputlen, + const char **logdetail); +} pg_be_sasl_mech; + +/* Common implementation for auth.c */ +extern int CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, + char *shadow_pass, const char **logdetail); + +#endif /* PG_SASL_H */ diff --git a/third_party/spanner_pg/src/include/libpq/scram.h b/third_party/spanner_pg/src/include/libpq/scram.h index 2c879150..c51e848c 100644 --- a/third_party/spanner_pg/src/include/libpq/scram.h +++ b/third_party/spanner_pg/src/include/libpq/scram.h @@ -3,7 +3,7 @@ * scram.h * Interface to libpq/scram.c * - * 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 * * src/include/libpq/scram.h @@ -15,17 +15,10 @@ #include "lib/stringinfo.h" #include "libpq/libpq-be.h" +#include "libpq/sasl.h" -/* Status codes for message exchange */ -#define SASL_EXCHANGE_CONTINUE 0 -#define SASL_EXCHANGE_SUCCESS 1 -#define SASL_EXCHANGE_FAILURE 2 - -/* Routines dedicated to authentication */ -extern void pg_be_scram_get_mechanisms(Port *port, StringInfo buf); -extern void *pg_be_scram_init(Port *port, const char *selected_mech, const char *shadow_pass); -extern int pg_be_scram_exchange(void *opaq, const char *input, int inputlen, - char **output, int *outputlen, char **logdetail); +/* SASL implementation callbacks */ +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/third_party/spanner_pg/src/include/mb/pg_wchar.h b/third_party/spanner_pg/src/include/mb/pg_wchar.h index d93ccac2..4a0e6bfb 100644 --- a/third_party/spanner_pg/src/include/mb/pg_wchar.h +++ b/third_party/spanner_pg/src/include/mb/pg_wchar.h @@ -3,7 +3,7 @@ * pg_wchar.h * multibyte-character support * - * 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 * * 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/third_party/spanner_pg/src/include/mb/stringinfo_mb.h b/third_party/spanner_pg/src/include/mb/stringinfo_mb.h index ffc37122..8781ffdf 100644 --- a/third_party/spanner_pg/src/include/mb/stringinfo_mb.h +++ b/third_party/spanner_pg/src/include/mb/stringinfo_mb.h @@ -3,7 +3,7 @@ * stringinfo_mb.h * multibyte support for StringInfo * - * 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 * * src/include/mb/stringinfo_mb.h diff --git a/third_party/spanner_pg/src/include/miscadmin.h b/third_party/spanner_pg/src/include/miscadmin.h index f4e08fb9..5f8f6928 100644 --- a/third_party/spanner_pg/src/include/miscadmin.h +++ b/third_party/spanner_pg/src/include/miscadmin.h @@ -10,7 +10,7 @@ * Over time, this has also become the preferred place for widely known * resource-limitation stuff, such as work_mem and check_stack_depth(). * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * 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; @@ -182,15 +183,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 +256,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 */ @@ -308,7 +309,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); /***************************************************************************** @@ -321,7 +322,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); @@ -343,11 +344,10 @@ typedef enum BackendType B_WAL_SENDER, B_WAL_WRITER, B_ARCHIVER, - B_STATS_COLLECTOR, B_LOGGER, } BackendType; -extern BackendType MyBackendType; +extern PGDLLIMPORT BackendType MyBackendType; extern const char *GetBackendTypeDesc(BackendType backendType); @@ -410,7 +410,7 @@ typedef enum ProcessingMode NormalProcessing /* normal processing */ } ProcessingMode; -extern ProcessingMode Mode; +extern PGDLLIMPORT ProcessingMode Mode; #define IsBootstrapProcessingMode() (Mode == BootstrapProcessing) #define IsInitProcessingMode() (Mode == InitProcessing) @@ -430,15 +430,15 @@ extern ProcessingMode Mode; /* * Auxiliary-process type identifiers. These used to be in bootstrap.h * but it seems saner to have them here, with the ProcessingMode stuff. - * The MyAuxProcType global is defined and set in bootstrap.c. + * The MyAuxProcType global is defined and set in auxprocess.c. + * + * Make sure to list in the glossary any items you add here. */ typedef enum { NotAnAuxProcess = -1, - CheckerProcess = 0, - BootstrapProcess, - StartupProcess, + StartupProcess = 0, BgWriterProcess, ArchiverProcess, CheckpointerProcess, @@ -448,9 +448,8 @@ typedef enum NUM_AUXPROCTYPES /* Must be last! */ } AuxProcType; -extern AuxProcType MyAuxProcType; +extern PGDLLIMPORT AuxProcType MyAuxProcType; -#define AmBootstrapProcess() (MyAuxProcType == BootstrapProcess) #define AmStartupProcess() (MyAuxProcType == StartupProcess) #define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess) #define AmArchiverProcess() (MyAuxProcType == ArchiverProcess) @@ -467,16 +466,21 @@ 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 void InitPostgres(const char *in_dbname, Oid dboid, const char *username, - Oid useroid, char *out_dbname, bool override_allow_connections); +extern void InitPostgres(const char *in_dbname, Oid dboid, + const char *username, Oid useroid, + bool load_session_libraries, + bool override_allow_connections, + char *out_dbname); 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 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 bool process_shmem_requests_in_progress; +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, @@ -487,15 +491,14 @@ extern bool RecheckDataDirLockFile(void); extern void ValidatePgVersion(const char *path); extern void process_shared_preload_libraries(void); extern void process_session_preload_libraries(void); +extern void process_shmem_requests(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); +typedef void (*shmem_request_hook_type) (void); +extern PGDLLIMPORT shmem_request_hook_type shmem_request_hook; /* in executor/nodeHash.c */ extern size_t get_hash_memory_limit(void); -extern int get_hash_mem(void); #endif /* MISCADMIN_H */ diff --git a/third_party/spanner_pg/src/include/nodes/bitmapset.h b/third_party/spanner_pg/src/include/nodes/bitmapset.h index 1fd12de6..75b5ce1a 100644 --- a/third_party/spanner_pg/src/include/nodes/bitmapset.h +++ b/third_party/spanner_pg/src/include/nodes/bitmapset.h @@ -11,7 +11,7 @@ * bms_is_empty() in preference to testing for NULL.) * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/nodes/bitmapset.h * diff --git a/third_party/spanner_pg/src/include/nodes/execnodes.h b/third_party/spanner_pg/src/include/nodes/execnodes.h index c8286cc4..9f176b0e 100644 --- a/third_party/spanner_pg/src/include/nodes/execnodes.h +++ b/third_party/spanner_pg/src/include/nodes/execnodes.h @@ -4,7 +4,7 @@ * definitions for executor state nodes * * - * 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 * * src/include/nodes/execnodes.h @@ -41,6 +41,7 @@ struct ExprContext; struct RangeTblEntry; /* avoid including parsenodes.h here */ struct ExprEvalStep; /* avoid including execExpr.h everywhere */ struct CopyMultiInsertBuffer; +struct LogicalTapeSet; /* ---------------- @@ -60,7 +61,7 @@ typedef Datum (*ExprStateEvalFunc) (struct ExprState *expression, typedef struct ExprState { - NodeTag tag; + NodeTag type; uint8 flags; /* bitmask of EEO_FLAG_* bits, see above */ @@ -141,6 +142,8 @@ typedef struct ExprState * Unique is it a unique index? * OpclassOptions opclass-specific options, or NULL if none * ReadyForInserts is it valid for inserts? + * CheckedUnchanged IndexUnchanged status determined yet? + * IndexUnchanged aminsert hint, cached for retail inserts * Concurrent are we doing a concurrent index build? * BrokenHotChain did we detect any broken HOT chains? * ParallelWorkers # of workers requested (excludes leader) @@ -170,7 +173,10 @@ typedef struct IndexInfo uint16 *ii_UniqueStrats; /* array with one entry per column */ Datum *ii_OpclassOptions; /* array with one entry per column */ bool ii_Unique; + bool ii_NullsNotDistinct; bool ii_ReadyForInserts; + bool ii_CheckedUnchanged; + bool ii_IndexUnchanged; bool ii_Concurrent; bool ii_BrokenHotChain; int ii_ParallelWorkers; @@ -383,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 * @@ -494,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; @@ -524,6 +550,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; /* @@ -675,8 +707,8 @@ typedef struct EState * ExecRowMark - * runtime representation of FOR [KEY] UPDATE/SHARE clauses * - * When doing UPDATE, DELETE, or SELECT FOR [KEY] UPDATE/SHARE, we will have an - * ExecRowMark for each non-target relation in the query (except inheritance + * When doing UPDATE/DELETE/MERGE/SELECT FOR [KEY] UPDATE/SHARE, we will have + * an ExecRowMark for each non-target relation in the query (except inheritance * parent RTEs, which can be ignored at runtime). Virtual relations such as * subqueries-in-FROM will have an ExecRowMark with relation == NULL. See * PlanRowMark for details about most of the fields. In addition to fields @@ -1221,6 +1253,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 * ---------------- @@ -1228,7 +1266,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[] */ @@ -1270,6 +1308,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; /* ---------------- @@ -2155,8 +2201,8 @@ typedef struct MemoizeState * by bit, false when using hash equality ops */ MemoizeInstrumentation stats; /* execution statistics */ SharedMemoizeInfo *shared_info; /* statistics for parallel workers */ - Bitmapset *keyparamids; /* Param->paramids of expressions belonging to - * param_exprs */ + Bitmapset *keyparamids; /* Param->paramids of expressions belonging to + * param_exprs */ } MemoizeState; /* ---------------- @@ -2198,6 +2244,7 @@ typedef struct SortState int64 bound_Done; /* value of bound we did the sort with */ void *tuplesortstate; /* private state of tuplesort.c */ bool am_worker; /* are we a worker? */ + bool datumSort; /* Datum sort instead of tuple sort? */ SharedSortInfo *shared_info; /* one entry per worker */ } SortState; @@ -2362,7 +2409,7 @@ typedef struct AggState bool table_filled; /* hash table filled yet? */ int num_hashes; MemoryContext hash_metacxt; /* memory for hash table itself */ - struct HashTapeInfo *hash_tapeinfo; /* metadata for spill tapes */ + struct LogicalTapeSet *hash_tapeset; /* tape set for hash spill tapes */ struct HashAggSpill *hash_spills; /* HashAggSpill for each grouping set, * exists only during first pass */ TupleTableSlot *hash_spill_rslot; /* for reading spill files */ @@ -2402,6 +2449,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 */ @@ -2428,6 +2487,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 */ @@ -2454,8 +2514,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/third_party/spanner_pg/src/include/nodes/extensible.h b/third_party/spanner_pg/src/include/nodes/extensible.h index 9e425e56..6244c8d9 100644 --- a/third_party/spanner_pg/src/include/nodes/extensible.h +++ b/third_party/spanner_pg/src/include/nodes/extensible.h @@ -4,7 +4,7 @@ * Definitions for extensible nodes and custom scans * * - * 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 * * src/include/nodes/extensible.h @@ -76,10 +76,12 @@ extern const ExtensibleNodeMethods *GetExtensibleNodeMethods(const char *name, /* * Flags for custom paths, indicating what capabilities the resulting scan - * will have. + * will have. The flags fields of CustomPath and CustomScan nodes are + * bitmasks of these flags. */ #define CUSTOMPATH_SUPPORT_BACKWARD_SCAN 0x0001 #define CUSTOMPATH_SUPPORT_MARK_RESTORE 0x0002 +#define CUSTOMPATH_SUPPORT_PROJECTION 0x0004 /* * Custom path methods. Mostly, we just need to know how to convert a diff --git a/third_party/spanner_pg/src/include/nodes/lockoptions.h b/third_party/spanner_pg/src/include/nodes/lockoptions.h index b1524350..399f7296 100644 --- a/third_party/spanner_pg/src/include/nodes/lockoptions.h +++ b/third_party/spanner_pg/src/include/nodes/lockoptions.h @@ -4,7 +4,7 @@ * Common header for some locking-related declarations. * * - * Copyright (c) 2014-2021, PostgreSQL Global Development Group + * Copyright (c) 2014-2022, PostgreSQL Global Development Group * * src/include/nodes/lockoptions.h * diff --git a/third_party/spanner_pg/src/include/nodes/makefuncs.h b/third_party/spanner_pg/src/include/nodes/makefuncs.h index 48a7ebfe..50de4c62 100644 --- a/third_party/spanner_pg/src/include/nodes/makefuncs.h +++ b/third_party/spanner_pg/src/include/nodes/makefuncs.h @@ -4,7 +4,7 @@ * prototypes for the creator functions of various nodes * * - * 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 * * src/include/nodes/makefuncs.h @@ -24,18 +24,18 @@ extern A_Expr *makeA_Expr(A_Expr_Kind kind, List *name, extern A_Expr *makeSimpleA_Expr(A_Expr_Kind kind, char *name, Node *lexpr, Node *rexpr, int location); -extern Var *makeVar(Index varno, +extern Var *makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup); -extern Var *makeVarFromTargetEntry(Index varno, +extern Var *makeVarFromTargetEntry(int varno, TargetEntry *tle); extern Var *makeWholeRowVar(RangeTblEntry *rte, - Index varno, + int varno, Index varlevelsup, bool allowScalar); @@ -96,7 +96,7 @@ extern List *make_ands_implicit(Expr *clause); extern IndexInfo *makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, List *expressions, List *predicates, - bool unique, bool isready, bool concurrent); + bool unique, bool nulls_not_distinct, bool isready, bool concurrent); extern DefElem *makeDefElem(char *name, Node *arg, int location); extern DefElem *makeDefElemExtended(char *nameSpace, char *name, Node *arg, diff --git a/third_party/spanner_pg/src/include/nodes/memnodes.h b/third_party/spanner_pg/src/include/nodes/memnodes.h index e6a757d6..bbbe151e 100644 --- a/third_party/spanner_pg/src/include/nodes/memnodes.h +++ b/third_party/spanner_pg/src/include/nodes/memnodes.h @@ -4,7 +4,7 @@ * POSTGRES memory context node definitions. * * - * 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 * * src/include/nodes/memnodes.h diff --git a/third_party/spanner_pg/src/include/nodes/nodeFuncs.h b/third_party/spanner_pg/src/include/nodes/nodeFuncs.h index 03a346c0..93c60bde 100644 --- a/third_party/spanner_pg/src/include/nodes/nodeFuncs.h +++ b/third_party/spanner_pg/src/include/nodes/nodeFuncs.h @@ -3,7 +3,7 @@ * nodeFuncs.h * Various general-purpose manipulations of Node trees * - * 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 * * src/include/nodes/nodeFuncs.h diff --git a/third_party/spanner_pg/src/include/nodes/nodes.h b/third_party/spanner_pg/src/include/nodes/nodes.h index 2efc1b5d..04d4ce85 100644 --- a/third_party/spanner_pg/src/include/nodes/nodes.h +++ b/third_party/spanner_pg/src/include/nodes/nodes.h @@ -4,7 +4,7 @@ * Definitions for tagged nodes. * * - * 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 * * 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, @@ -153,7 +154,6 @@ typedef enum NodeTag T_Alias, T_RangeVar, T_TableFunc, - T_Expr, T_Var, T_Const, T_Param, @@ -267,6 +267,7 @@ typedef enum NodeTag T_EquivalenceClass, T_EquivalenceMember, T_PathKey, + T_PathKeyInfo, T_PathTarget, T_RestrictInfo, T_IndexClause, @@ -280,11 +281,11 @@ typedef enum NodeTag T_RollupData, T_GroupingSetData, T_StatisticExtInfo, + T_MergeAction, /* * TAGS FOR MEMORY NODES (memnodes.h) */ - T_MemoryContext, T_AllocSetContext, T_SlabContext, T_GenerationContext, @@ -292,12 +293,11 @@ typedef enum NodeTag /* * TAGS FOR VALUE NODES (value.h) */ - T_Value, T_Integer, T_Float, + T_Boolean, T_String, T_BitString, - T_Null, /* * TAGS FOR LIST NODES (pg_list.h) @@ -320,6 +320,7 @@ typedef enum NodeTag T_InsertStmt, T_DeleteStmt, T_UpdateStmt, + T_MergeStmt, T_SelectStmt, T_ReturnStmt, T_PLAssignStmt, @@ -374,6 +375,7 @@ typedef enum NodeTag T_CheckPointStmt, T_CreateSchemaStmt, T_AlterDatabaseStmt, + T_AlterDatabaseRefreshCollStmt, T_AlterDatabaseSetStmt, T_AlterRoleSetStmt, T_CreateConversionStmt, @@ -487,6 +489,7 @@ typedef enum NodeTag T_CTESearchClause, T_CTECycleClause, T_CommonTableExpr, + T_MergeWhenClause, T_RoleSpec, T_TriggerTransition, T_PartitionElem, @@ -495,6 +498,8 @@ typedef enum NodeTag T_PartitionRangeDatum, T_PartitionCmd, T_VacuumRelation, + T_PublicationObjSpec, + T_PublicationTable, T_InterleaveSpec, T_ChangeStreamTrackedTable, T_SynonymClause, @@ -507,9 +512,9 @@ typedef enum NodeTag T_BaseBackupCmd, T_CreateReplicationSlotCmd, T_DropReplicationSlotCmd, + T_ReadReplicationSlotCmd, T_StartReplicationCmd, T_TimeLineHistoryCmd, - T_SQLCmd, /* * TAGS FOR RANDOM OTHER STUFF @@ -535,7 +540,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 */ T_Ttl /* For TTL option specifier */ } NodeTag; @@ -680,6 +686,8 @@ extern bool equal(const void *a, const void *b); */ typedef double Selectivity; /* fraction of tuples a qualifier will pass */ typedef double Cost; /* execution cost (in page-access units) */ +typedef double Cardinality; /* (estimated) number of rows or other integer + * count */ /* @@ -694,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/third_party/spanner_pg/src/include/nodes/params.h b/third_party/spanner_pg/src/include/nodes/params.h index 41c21fb5..de2dd907 100644 --- a/third_party/spanner_pg/src/include/nodes/params.h +++ b/third_party/spanner_pg/src/include/nodes/params.h @@ -4,7 +4,7 @@ * Support for finding the values associated with Param nodes. * * - * 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 * * src/include/nodes/params.h diff --git a/third_party/spanner_pg/src/include/nodes/parsenodes.h b/third_party/spanner_pg/src/include/nodes/parsenodes.h index 2be2ac9d..d9278eb5 100644 --- a/third_party/spanner_pg/src/include/nodes/parsenodes.h +++ b/third_party/spanner_pg/src/include/nodes/parsenodes.h @@ -12,7 +12,7 @@ * identifying statement boundaries in multi-statement source strings. * * - * 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 * * src/include/nodes/parsenodes.h @@ -105,7 +105,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<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 @@ -1665,6 +1722,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 * @@ -1851,9 +1922,11 @@ typedef enum ObjectType OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, + OBJECT_PARAMETER_ACL, OBJECT_POLICY, OBJECT_PROCEDURE, OBJECT_PUBLICATION, + OBJECT_PUBLICATION_NAMESPACE, OBJECT_PUBLICATION_REL, OBJECT_ROLE, OBJECT_ROUTINE, @@ -1952,6 +2025,7 @@ typedef enum AlterTableType AT_SetLogged, /* SET LOGGED */ AT_SetUnLogged, /* SET UNLOGGED */ AT_DropOids, /* SET WITHOUT OIDS */ + AT_SetAccessMethod, /* SET ACCESS METHOD */ AT_SetTableSpace, /* SET TABLESPACE */ AT_SetRelOptions, /* SET (...) -- AM specific parameters */ AT_ResetRelOptions, /* RESET (...) -- AM specific parameters */ @@ -2077,7 +2151,7 @@ typedef struct GrantStmt GrantTargetType targtype; /* type of the grant target */ ObjectType objtype; /* kind of object being operated on */ List *objects; /* list of RangeVar nodes, ObjectWithArgs - * nodes, or plain names (as Value strings) */ + * nodes, or plain names (as String values) */ List *privileges; /* list of AccessPriv nodes */ /* privileges == NIL denotes ALL PRIVILEGES */ List *grantees; /* list of RoleSpec nodes */ @@ -2123,7 +2197,7 @@ typedef struct AccessPriv { NodeTag type; char *priv_name; /* string name of privilege */ - List *cols; /* list of Value strings */ + List *cols; /* list of String */ } AccessPriv; /* ---------------------- @@ -2132,7 +2206,7 @@ typedef struct AccessPriv * Note: because of the parsing ambiguity with the GRANT * statement, granted_roles is a list of AccessPriv; the execution code * should complain if any column lists appear. grantee_roles is a list - * of role names, as Value strings. + * of role names, as String values. * ---------------------- */ typedef struct GrantRoleStmt @@ -2187,7 +2261,7 @@ typedef struct CopyStmt * preserve the distinction in VariableSetKind for CreateCommandTag(). * ---------------------- */ -typedef enum +typedef enum VariableSetKind { VAR_SET_VALUE, /* SET var = value */ VAR_SET_DEFAULT, /* SET var TO DEFAULT */ @@ -2328,6 +2402,7 @@ typedef struct Constraint_UNUSED_SPANGRES char generated_when; /* ALWAYS or BY DEFAULT */ /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */ + bool nulls_not_distinct; /* null treatment for UNIQUE constraints */ List *keys; /* String nodes naming referenced key * column(s) */ List *including; /* String nodes naming referenced nonkey @@ -2353,6 +2428,7 @@ typedef struct Constraint_UNUSED_SPANGRES char fk_matchtype; /* FULL, PARTIAL, SIMPLE */ char fk_upd_action; /* ON UPDATE action */ char fk_del_action; /* ON DELETE action */ + List *fk_del_set_cols; /* ON DELETE SET NULL/DEFAULT (col1, col2) */ List *old_conpfeqop; /* pg_constraint.conpfeqop of my former self */ Oid old_pktable_oid; /* pg_constraint.confrelid of my former * self */ @@ -2606,7 +2682,7 @@ typedef struct CreateTrigStmt char *trigname; /* TRIGGER's name */ RangeVar *relation; /* relation trigger is on */ List *funcname; /* qual. name of function to call */ - List *args; /* list of (T_String) Values or NIL */ + List *args; /* list of String or NIL */ bool row; /* ROW/STATEMENT */ /* timing uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */ int16 timing; /* BEFORE, AFTER, or INSTEAD */ @@ -2742,7 +2818,7 @@ typedef struct DefineStmt NodeTag type; ObjectType kind; /* aggregate, operator, type */ bool oldstyle; /* hack to signal old CREATE AGG syntax */ - List *defnames; /* qualified name (list of Value strings) */ + List *defnames; /* qualified name (list of String) */ List *args; /* a list of TypeName (if needed) */ List *definition; /* a list of DefElem */ bool if_not_exists; /* just do nothing if it already exists? */ @@ -2756,7 +2832,7 @@ typedef struct DefineStmt typedef struct CreateDomainStmt { NodeTag type; - List *domainname; /* qualified name (list of Value strings) */ + List *domainname; /* qualified name (list of String) */ TypeName *typeName; /* the base type */ CollateClause *collClause; /* untransformed COLLATE spec, if any */ List *constraints; /* constraints (list of Constraint nodes) */ @@ -2769,7 +2845,7 @@ typedef struct CreateDomainStmt typedef struct CreateOpClassStmt { NodeTag type; - List *opclassname; /* qualified name (list of Value strings) */ + List *opclassname; /* qualified name (list of String) */ List *opfamilyname; /* qualified name (ditto); NIL if omitted */ char *amname; /* name of index AM opclass is for */ TypeName *datatype; /* datatype of indexed column */ @@ -2801,7 +2877,7 @@ typedef struct CreateOpClassItem typedef struct CreateOpFamilyStmt { NodeTag type; - List *opfamilyname; /* qualified name (list of Value strings) */ + List *opfamilyname; /* qualified name (list of String) */ char *amname; /* name of index AM opfamily is for */ } CreateOpFamilyStmt; @@ -2812,7 +2888,7 @@ typedef struct CreateOpFamilyStmt typedef struct AlterOpFamilyStmt { NodeTag type; - List *opfamilyname; /* qualified name (list of Value strings) */ + List *opfamilyname; /* qualified name (list of String) */ char *amname; /* name of index AM opfamily is for */ bool isDrop; /* ADD or DROP the items? */ List *items; /* List of CreateOpClassItem nodes */ @@ -2966,6 +3042,7 @@ typedef struct IndexStmt SubTransactionId oldFirstRelfilenodeSubid; /* rd_firstRelfilenodeSubid of * oldNode */ bool unique; /* is index unique? */ + bool nulls_not_distinct; /* null treatment for UNIQUE constraints */ bool primary; /* is index a primary key? */ bool isconstraint; /* is it for a pkey/unique constraint? */ bool deferrable; /* is the constraint DEFERRABLE? */ @@ -2984,8 +3061,8 @@ typedef struct IndexStmt typedef struct CreateStatsStmt { NodeTag type; - List *defnames; /* qualified name (list of Value strings) */ - List *stat_types; /* stat types (list of Value strings) */ + List *defnames; /* qualified name (list of String) */ + List *stat_types; /* stat types (list of String) */ List *exprs; /* expressions to build statistics on */ List *relations; /* rels to build stats on (list of RangeVar) */ char *stxcomment; /* comment to apply to stats, or NULL */ @@ -3015,7 +3092,7 @@ typedef struct StatsElem typedef struct AlterStatsStmt { NodeTag type; - List *defnames; /* qualified name (list of Value strings) */ + List *defnames; /* qualified name (list of String) */ int stxstattarget; /* statistics target */ bool missing_ok; /* skip error if statistics object is missing */ } AlterStatsStmt; @@ -3168,7 +3245,7 @@ typedef struct AlterObjectDependsStmt ObjectType objectType; /* OBJECT_FUNCTION, OBJECT_TRIGGER, etc */ RangeVar *relation; /* in case a table is involved */ Node *object; /* name of the object */ - Value *extname; /* extension name */ + String *extname; /* extension name */ bool remove; /* set true to remove dep rather than add */ } AlterObjectDependsStmt; @@ -3314,8 +3391,8 @@ typedef struct CompositeTypeStmt typedef struct CreateEnumStmt { NodeTag type; - List *typeName; /* qualified name (list of Value strings) */ - List *vals; /* enum values (list of Value strings) */ + List *typeName; /* qualified name (list of String) */ + List *vals; /* enum values (list of String) */ } CreateEnumStmt; /* ---------------------- @@ -3325,7 +3402,7 @@ typedef struct CreateEnumStmt typedef struct CreateRangeStmt { NodeTag type; - List *typeName; /* qualified name (list of Value strings) */ + List *typeName; /* qualified name (list of String) */ List *params; /* range parameters (list of DefElem) */ } CreateRangeStmt; @@ -3336,7 +3413,7 @@ typedef struct CreateRangeStmt typedef struct AlterEnumStmt { NodeTag type; - List *typeName; /* qualified name (list of Value strings) */ + List *typeName; /* qualified name (list of String) */ char *oldVal; /* old enum value's name, if renaming */ char *newVal; /* new enum value's name */ char *newValNeighbor; /* neighboring enum value, if specified */ @@ -3398,6 +3475,12 @@ typedef struct AlterDatabaseStmt List *options; /* List of DefElem nodes */ } AlterDatabaseStmt; +typedef struct AlterDatabaseRefreshCollStmt +{ + NodeTag type; + char *dbname; +} AlterDatabaseRefreshCollStmt; + typedef struct AlterDatabaseSetStmt { NodeTag type; @@ -3698,7 +3781,7 @@ typedef struct ReassignOwnedStmt typedef struct AlterTSDictionaryStmt { NodeTag type; - List *dictname; /* qualified name (list of Value strings) */ + List *dictname; /* qualified name (list of String) */ List *options; /* List of DefElem nodes */ } AlterTSDictionaryStmt; @@ -3718,29 +3801,64 @@ typedef struct AlterTSConfigurationStmt { NodeTag type; AlterTSConfigType kind; /* ALTER_TSCONFIG_ADD_MAPPING, etc */ - List *cfgname; /* qualified name (list of Value strings) */ + List *cfgname; /* qualified name (list of String) */ /* * dicts will be non-NIL if ADD/ALTER MAPPING was specified. If dicts is * NIL, but tokentype isn't, DROP MAPPING was specified. */ - List *tokentype; /* list of Value strings */ - List *dicts; /* list of list of Value strings */ + List *tokentype; /* list of String */ + List *dicts; /* list of list of String */ bool override; /* if true - remove old variant */ bool replace; /* if true - replace dictionary by another */ bool missing_ok; /* for DROP - skip error if missing? */ } AlterTSConfigurationStmt; +typedef struct PublicationTable +{ + NodeTag type; + RangeVar *relation; /* relation to be published */ + Node *whereClause; /* qualifications */ + List *columns; /* List of columns in a publication table */ +} PublicationTable; + +/* + * Publication object type + */ +typedef enum PublicationObjSpecType +{ + PUBLICATIONOBJ_TABLE, /* A table */ + PUBLICATIONOBJ_TABLES_IN_SCHEMA, /* All tables in schema */ + PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA, /* All tables in first element of + * search_path */ + PUBLICATIONOBJ_CONTINUATION /* Continuation of previous type */ +} PublicationObjSpecType; + +typedef struct PublicationObjSpec +{ + NodeTag type; + PublicationObjSpecType pubobjtype; /* type of this publication object */ + char *name; + PublicationTable *pubtable; + int location; /* token location, or -1 if unknown */ +} PublicationObjSpec; typedef struct CreatePublicationStmt { NodeTag type; char *pubname; /* Name of the publication */ List *options; /* List of DefElem nodes */ - List *tables; /* Optional list of tables to add */ + List *pubobjects; /* Optional list of publication objects */ bool for_all_tables; /* Special publication for all tables in db */ } CreatePublicationStmt; +typedef enum AlterPublicationAction +{ + AP_AddObjects, /* add objects to publication */ + AP_DropObjects, /* remove objects from publication */ + AP_SetObjects /* set list of objects */ +} AlterPublicationAction; + typedef struct AlterPublicationStmt { NodeTag type; @@ -3749,10 +3867,14 @@ typedef struct AlterPublicationStmt /* parameters used for ALTER PUBLICATION ... WITH */ List *options; /* List of DefElem nodes */ - /* parameters used for ALTER PUBLICATION ... ADD/DROP TABLE */ - List *tables; /* List of tables to add/drop */ + /* + * Parameters used for ALTER PUBLICATION ... ADD/DROP/SET publication + * objects. + */ + List *pubobjects; /* Optional list of publication objects */ bool for_all_tables; /* Special publication for all tables in db */ - DefElemAction tableAction; /* What action to perform with the tables */ + AlterPublicationAction action; /* What action to perform with the given + * objects */ } AlterPublicationStmt; typedef struct CreateSubscriptionStmt @@ -3772,7 +3894,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/third_party/spanner_pg/src/include/nodes/pathnodes.h b/third_party/spanner_pg/src/include/nodes/pathnodes.h index 3c034fa3..9d804d4b 100644 --- a/third_party/spanner_pg/src/include/nodes/pathnodes.h +++ b/third_party/spanner_pg/src/include/nodes/pathnodes.h @@ -4,7 +4,7 @@ * Definitions for planner's internal data structures, especially Paths. * * - * 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 * * src/include/nodes/pathnodes.h @@ -71,6 +71,7 @@ typedef enum UpperRelationKind * any */ UPPERREL_GROUP_AGG, /* result of grouping/aggregation, if any */ UPPERREL_WINDOW, /* result of window functions, if any */ + UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */ UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */ UPPERREL_ORDERED, /* result of ORDER BY, if any */ UPPERREL_FINAL /* result of any remaining top-level actions */ @@ -267,11 +268,11 @@ struct PlannerInfo /* * all_result_relids is empty for SELECT, otherwise it contains at least - * parse->resultRelation. For UPDATE/DELETE across an inheritance or - * partitioning tree, the result rel's child relids are added. When using - * multi-level partitioning, intermediate partitioned rels are included. - * leaf_result_relids is similar except that only actual result tables, - * not partitioned tables, are included in it. + * parse->resultRelation. For UPDATE/DELETE/MERGE across an inheritance + * or partitioning tree, the result rel's child relids are added. When + * using multi-level partitioning, intermediate partitioned rels are + * included. leaf_result_relids is similar except that only actual result + * tables, not partitioned tables, are included in it. */ Relids all_result_relids; /* set of all result relids */ Relids leaf_result_relids; /* set of all leaf relids */ @@ -334,11 +335,11 @@ struct PlannerInfo MemoryContext planner_cxt; /* context holding PlannerInfo */ - double total_table_pages; /* # of pages in all non-dummy tables of + Cardinality total_table_pages; /* # of pages in all non-dummy tables of * query */ - double tuple_fraction; /* tuple_fraction passed to query_planner */ - double limit_tuples; /* limit_tuples passed to query_planner */ + Selectivity tuple_fraction; /* tuple_fraction passed to query_planner */ + Cardinality limit_tuples; /* limit_tuples passed to query_planner */ Index qual_security_level; /* minimum security_level for quals */ /* Note: qual_security_level is zero if there are no securityQuals */ @@ -681,7 +682,7 @@ typedef struct RelOptInfo Relids relids; /* set of base relids (rangetable indexes) */ /* size estimates generated by planner */ - double rows; /* estimated number of result tuples */ + Cardinality rows; /* estimated number of result tuples */ /* per-relation planner control flags */ bool consider_startup; /* keep cheap-startup-cost paths? */ @@ -718,7 +719,7 @@ typedef struct RelOptInfo List *indexlist; /* list of IndexOptInfo */ List *statlist; /* list of StatisticExtInfo */ BlockNumber pages; /* size estimates derived from pg_class */ - double tuples; + Cardinality tuples; double allvisfrac; Bitmapset *eclass_indexes; /* Indexes in PlannerInfo's eq_classes list of * ECs that mention this rel */ @@ -767,6 +768,9 @@ typedef struct RelOptInfo List *partition_qual; /* Partition constraint, if not the root */ struct RelOptInfo **part_rels; /* Array of RelOptInfos of partitions, * stored in the same order as bounds */ + Bitmapset *live_parts; /* Bitmap with members acting as indexes into + * the part_rels[] array to indicate which + * partitions survived partition pruning. */ Relids all_partrels; /* Relids set of all partition relids */ List **partexprs; /* Non-nullable partition key expressions */ List **nullable_partexprs; /* Nullable partition key expressions */ @@ -838,7 +842,7 @@ struct IndexOptInfo /* index-size statistics (from pg_class and elsewhere) */ BlockNumber pages; /* number of disk pages in index */ - double tuples; /* number of index tuples in index */ + Cardinality tuples; /* number of index tuples in index */ int tree_height; /* index tree height, or -1 if unknown */ /* index descriptor information */ @@ -931,6 +935,7 @@ typedef struct StatisticExtInfo NodeTag type; Oid statOid; /* OID of the statistics row */ + bool inherit; /* includes child relations */ RelOptInfo *rel; /* back-link to statistic's table */ char kind; /* statistics kind of this entry */ Bitmapset *keys; /* attnums of the columns covered */ @@ -1136,7 +1141,7 @@ typedef struct ParamPathInfo NodeTag type; Relids ppi_req_outer; /* rels supplying parameters used by path */ - double ppi_rows; /* estimated number of result tuples */ + Cardinality ppi_rows; /* estimated number of result tuples */ List *ppi_clauses; /* join clauses available from outer rels */ } ParamPathInfo; @@ -1186,7 +1191,7 @@ typedef struct Path int parallel_workers; /* desired # of workers; 0 = not parallel */ /* estimated size/costs for path (see costsize.c for more info) */ - double rows; /* estimated number of result tuples */ + Cardinality rows; /* estimated number of result tuples */ Cost startup_cost; /* cost expended before fetching any tuples */ Cost total_cost; /* total cost (assuming all tuples fetched) */ @@ -1355,7 +1360,7 @@ typedef struct TidPath } TidPath; /* - * TidRangePath represents a scan by a continguous range of TIDs + * TidRangePath represents a scan by a contiguous range of TIDs * * tidrangequals is an implicitly AND'ed list of qual expressions of the form * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=. @@ -1452,7 +1457,7 @@ typedef struct AppendPath List *subpaths; /* list of component Paths */ /* Index of first partial path in subpaths; list_length(subpaths) if none */ int first_partial_path; - double limit_tuples; /* hard limit on output tuples, or -1 */ + Cardinality limit_tuples; /* hard limit on output tuples, or -1 */ } AppendPath; #define IS_DUMMY_APPEND(p) \ @@ -1474,7 +1479,7 @@ typedef struct MergeAppendPath { Path path; List *subpaths; /* list of component Paths */ - double limit_tuples; /* hard limit on output tuples, or -1 */ + Cardinality limit_tuples; /* hard limit on output tuples, or -1 */ } MergeAppendPath; /* @@ -1517,7 +1522,7 @@ typedef struct MemoizePath * complete after caching the first record. */ bool binary_mode; /* true when cache key should be compared bit * by bit, false when using hash equality ops */ - double calls; /* expected number of rescans */ + Cardinality calls; /* expected number of rescans */ uint32 est_entries; /* The maximum number of entries that the * planner expects will fit in the cache, or 0 * if unknown */ @@ -1535,7 +1540,7 @@ typedef struct MemoizePath * it's convenient to have a UniquePath in the path tree to signal upper-level * routines that the input is known distinct.) */ -typedef enum +typedef enum UniquePathMethod { UNIQUE_PATH_NOOP, /* input is known unique already */ UNIQUE_PATH_HASH, /* use hashing */ @@ -1605,7 +1610,10 @@ typedef struct JoinPath * A nested-loop path needs no special fields. */ -typedef JoinPath NestPath; +typedef struct NestPath +{ + JoinPath jpath; +} NestPath; /* * A mergejoin path has these fields. @@ -1666,7 +1674,7 @@ typedef struct HashPath JoinPath jpath; List *path_hashclauses; /* join clauses used for hashing */ int num_batches; /* number of batches expected */ - double inner_rows_total; /* total inner rows expected */ + Cardinality inner_rows_total; /* total inner rows expected */ } HashPath; /* @@ -1769,7 +1777,7 @@ typedef struct AggPath Path *subpath; /* path representing input source */ AggStrategy aggstrategy; /* basic strategy, see nodes.h */ AggSplit aggsplit; /* agg-splitting mode, see nodes.h */ - double numGroups; /* estimated number of groups in input */ + Cardinality numGroups; /* estimated number of groups in input */ uint64 transitionSpace; /* for pass-by-ref transition data */ List *groupClause; /* a list of SortGroupClause's */ List *qual; /* quals (HAVING quals), if any */ @@ -1783,7 +1791,7 @@ typedef struct GroupingSetData { NodeTag type; List *set; /* grouping set as list of sortgrouprefs */ - double numGroups; /* est. number of result groups */ + Cardinality numGroups; /* est. number of result groups */ } GroupingSetData; typedef struct RollupData @@ -1792,7 +1800,7 @@ typedef struct RollupData List *groupClause; /* applicable subset of parse->groupClause */ List *gsets; /* lists of integer indexes into groupClause */ List *gsets_data; /* list of GroupingSetData */ - double numGroups; /* est. number of result groups */ + Cardinality numGroups; /* est. number of result groups */ bool hashable; /* can be hashed */ bool is_hashed; /* to be implemented as a hashagg */ } RollupData; @@ -1829,6 +1837,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; /* @@ -1843,7 +1854,7 @@ typedef struct SetOpPath List *distinctList; /* SortGroupClauses identifying target cols */ AttrNumber flagColIdx; /* where is the flag column, if any */ int firstFlag; /* flag value for first input relation */ - double numGroups; /* estimated number of groups in input */ + Cardinality numGroups; /* estimated number of groups in input */ } SetOpPath; /* @@ -1856,7 +1867,7 @@ typedef struct RecursiveUnionPath Path *rightpath; List *distinctList; /* SortGroupClauses identifying target cols */ int wtParam; /* ID of Param representing work table */ - double numGroups; /* estimated number of groups in input */ + Cardinality numGroups; /* estimated number of groups in input */ } RecursiveUnionPath; /* @@ -1871,7 +1882,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 @@ -1881,7 +1892,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 partitioned/inherited */ @@ -1893,6 +1904,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; /* @@ -2121,8 +2134,9 @@ typedef struct RestrictInfo Selectivity left_mcvfreq; /* left side's most common val's freq */ Selectivity right_mcvfreq; /* right side's most common val's freq */ - /* hash equality operator used for memoize nodes, else InvalidOid */ - Oid hasheqoperator; + /* hash equality operators used for memoize nodes, else InvalidOid */ + Oid left_hasheqoperator; + Oid right_hasheqoperator; } RestrictInfo; /* @@ -2350,10 +2364,10 @@ typedef struct AppendRelInfo } AppendRelInfo; /* - * Information about a row-identity "resjunk" column in UPDATE/DELETE. + * Information about a row-identity "resjunk" column in UPDATE/DELETE/MERGE. * - * In partitioned UPDATE/DELETE it's important for child partitions to share - * row-identity columns whenever possible, so as not to chew up too many + * In partitioned UPDATE/DELETE/MERGE it's important for child partitions to + * share row-identity columns whenever possible, so as not to chew up too many * targetlist columns. We use these structs to track which identity columns * have been requested. In the finished plan, each of these will give rise * to one resjunk entry in the targetlist of the ModifyTable's subplan node. @@ -2611,7 +2625,7 @@ typedef struct typedef struct { bool limit_needed; - double limit_tuples; + Cardinality limit_tuples; int64 count_est; int64 offset_est; } FinalPathExtraData; @@ -2642,15 +2656,15 @@ typedef struct JoinCostWorkspace Cost inner_rescan_run_cost; /* private for cost_mergejoin code */ - double outer_rows; - double inner_rows; - double outer_skip_rows; - double inner_skip_rows; + Cardinality outer_rows; + Cardinality inner_rows; + Cardinality outer_skip_rows; + Cardinality inner_skip_rows; /* private for cost_hashjoin code */ int numbuckets; int numbatches; - double inner_rows_total; + Cardinality inner_rows_total; } JoinCostWorkspace; /* diff --git a/third_party/spanner_pg/src/include/nodes/pg_list.h b/third_party/spanner_pg/src/include/nodes/pg_list.h index c3f47db8..5a43290a 100644 --- a/third_party/spanner_pg/src/include/nodes/pg_list.h +++ b/third_party/spanner_pg/src/include/nodes/pg_list.h @@ -27,7 +27,7 @@ * always be so; try to be careful to maintain the distinction.) * * - * 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 * * src/include/nodes/pg_list.h @@ -599,6 +599,7 @@ extern void list_free(List *list); extern void list_free_deep(List *list); extern pg_nodiscard List *list_copy(const List *list); +extern pg_nodiscard List *list_copy_head(const List *oldlist, int len); extern pg_nodiscard List *list_copy_tail(const List *list, int nskip); extern pg_nodiscard List *list_copy_deep(const List *oldlist); diff --git a/third_party/spanner_pg/src/include/nodes/plannodes.h b/third_party/spanner_pg/src/include/nodes/plannodes.h index 1c9357f6..b778ba99 100644 --- a/third_party/spanner_pg/src/include/nodes/plannodes.h +++ b/third_party/spanner_pg/src/include/nodes/plannodes.h @@ -4,7 +4,7 @@ * definitions for query plan nodes * * - * 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 * * 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) */ @@ -65,7 +66,7 @@ typedef struct PlannedStmt List *rtable; /* list of RangeTblEntry nodes */ - /* rtable indexes of target relations for INSERT/UPDATE/DELETE */ + /* rtable indexes of target relations for INSERT/UPDATE/DELETE/MERGE */ List *resultRelations; /* integer list of RT indexes, or NIL */ List *appendRelations; /* list of AppendRelInfo nodes */ @@ -120,7 +121,7 @@ typedef struct Plan /* * planner's estimate of result size of this plan step */ - double plan_rows; /* number of rows plan is expected to emit */ + Cardinality plan_rows; /* number of rows plan is expected to emit */ int plan_width; /* average row width in bytes */ /* @@ -209,7 +210,7 @@ typedef struct ProjectSet * partition root or appendrel RTE, which is not otherwise mentioned in the * plan. Otherwise rootRelation is zero. However, nominalRelation will * always be set, as it's the rel that EXPLAIN should claim is the - * INSERT/UPDATE/DELETE target. + * INSERT/UPDATE/DELETE/MERGE target. * * Note that rowMarks and epqParam are presumed to be valid for all the * table(s); they can't contain any info that varies across tables. @@ -218,7 +219,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 partitioned/inherited */ @@ -238,6 +239,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 */ @@ -349,7 +352,10 @@ typedef struct Scan * sequential scan node * ---------------- */ -typedef Scan SeqScan; +typedef struct SeqScan +{ + Scan scan; +} SeqScan; /* ---------------- * table sample scan node @@ -447,10 +453,10 @@ typedef struct IndexOnlyScan Scan scan; Oid indexid; /* OID of index to scan */ List *indexqual; /* list of index quals (usually OpExprs) */ + List *recheckqual; /* index quals in recheckable form */ List *indexorderby; /* list of index ORDER BY exprs */ List *indextlist; /* TargetEntry list describing index's cols */ ScanDirection indexorderdir; /* forward or backward or don't care */ - List *recheckqual; /* index quals in recheckable form */ } IndexOnlyScan; /* ---------------- @@ -531,16 +537,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; /* ---------------- @@ -818,7 +836,7 @@ typedef struct Memoize uint32 est_entries; /* The maximum number of entries that the * planner expects will fit in the cache, or 0 * if unknown */ - Bitmapset *keyparamids; /* paramids from param_exprs */ + Bitmapset *keyparamids; /* paramids from param_exprs */ } Memoize; /* ---------------- @@ -910,12 +928,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; /* ---------------- @@ -993,7 +1015,7 @@ typedef struct Hash AttrNumber skewColumn; /* outer join key's column #, or zero */ bool skewInherit; /* is outer join rel an inheritance tree? */ /* all other info is in the parent HashJoin node */ - double rows_total; /* estimate total rows if parallel_aware */ + Cardinality rows_total; /* estimate total rows if parallel_aware */ } Hash; /* ---------------- @@ -1068,7 +1090,7 @@ typedef struct Limit * doing a separate remote query to lock each selected row is usually pretty * unappealing, so early locking remains a credible design choice for FDWs. * - * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we have to uniquely + * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we have to uniquely * identify all the source rows, not only those from the target relations, so * that we can perform EvalPlanQual rechecking at need. For plain tables we * can just fetch the TID, much as for a target relation; this case is @@ -1097,7 +1119,7 @@ typedef enum RowMarkType * PlanRowMark - * plan-time representation of FOR [KEY] UPDATE/SHARE clauses * - * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we create a separate + * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we create a separate * PlanRowMark node for each non-target relation in the query. Relations that * are not specified as FOR UPDATE/SHARE are marked ROW_MARK_REFERENCE (if * regular tables or supported foreign tables) or ROW_MARK_COPY (if not). @@ -1308,4 +1330,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/third_party/spanner_pg/src/include/nodes/primnodes.h b/third_party/spanner_pg/src/include/nodes/primnodes.h index c94b918a..b9876755 100644 --- a/third_party/spanner_pg/src/include/nodes/primnodes.h +++ b/third_party/spanner_pg/src/include/nodes/primnodes.h @@ -7,7 +7,7 @@ * and join trees. * * - * 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 * * src/include/nodes/primnodes.h @@ -31,7 +31,7 @@ * specifies an alias for a range variable; the alias might also * specify renaming of columns within the table. * - * Note: colnames is a list of Value nodes (always strings). In Alias structs + * Note: colnames is a list of String nodes. In Alias structs * associated with RTEs, there may be entries corresponding to dropped * columns; these are normally empty strings (""). See parsenodes.h for info. */ @@ -77,7 +77,7 @@ typedef struct RangeVar /* * TableFunc - node for a table function, such as XMLTABLE. * - * Entries in the ns_names list are either string Value nodes containing + * Entries in the ns_names list are either String nodes containing * literal namespace names, or NULL pointers to represent DEFAULT. */ typedef struct TableFunc @@ -160,8 +160,8 @@ typedef struct Expr * is abused to signify references to columns of a custom scan tuple type.) * * ROWID_VAR is used in the planner to identify nonce variables that carry - * row identity information during UPDATE/DELETE. This value should never - * be seen outside the planner. + * row identity information during UPDATE/DELETE/MERGE. This value should + * never be seen outside the planner. * * In the parser, varnosyn and varattnosyn are either identical to * varno/varattno, or they specify the column's position in an aliased JOIN @@ -173,12 +173,12 @@ typedef struct Expr * in the planner and doesn't correspond to any simple relation column may * have varnosyn = varattnosyn = 0. */ -#define INNER_VAR 65000 /* reference to inner subplan */ -#define OUTER_VAR 65001 /* reference to outer subplan */ -#define INDEX_VAR 65002 /* reference to index column */ -#define ROWID_VAR 65003 /* row identity column during planning */ +#define INNER_VAR (-1) /* reference to inner subplan */ +#define OUTER_VAR (-2) /* reference to outer subplan */ +#define INDEX_VAR (-3) /* reference to index column */ +#define ROWID_VAR (-4) /* row identity column during planning */ -#define IS_SPECIAL_VARNO(varno) ((varno) >= INNER_VAR) +#define IS_SPECIAL_VARNO(varno) ((int) (varno) < 0) /* Symbols for the indexes of the special RTE entries in rules */ #define PRS2_OLD_VARNO 1 @@ -187,8 +187,8 @@ typedef struct Expr typedef struct Var { Expr xpr; - Index varno; /* index of this var's relation in the range - * table, or INNER_VAR/OUTER_VAR/INDEX_VAR */ + int varno; /* index of this var's relation in the range + * table, or INNER_VAR/OUTER_VAR/etc */ AttrNumber varattno; /* attribute number of this var, or zero for * all attrs ("whole-row Var") */ Oid vartype; /* pg_type OID for the type of this var */ @@ -593,10 +593,18 @@ typedef OpExpr NullIfExpr; * the result type (or the collation) because it must be boolean. * * A ScalarArrayOpExpr with a valid hashfuncid is evaluated during execution - * by building a hash table containing the Const values from the rhs arg. - * This table is probed during expression evaluation. Only useOr=true - * ScalarArrayOpExpr with Const arrays on the rhs can have the hashfuncid - * field set. See convert_saop_to_hashed_saop(). + * by building a hash table containing the Const values from the RHS arg. + * This table is probed during expression evaluation. The planner will set + * hashfuncid to the hash function which must be used to build and probe the + * hash table. The executor determines if it should use hash-based checks or + * the more traditional means based on if the hashfuncid is set or not. + * + * When performing hashed NOT IN, the negfuncid will also be set to the + * equality function which the hash table must use to build and probe the hash + * table. opno and opfuncid will remain set to the <> operator and its + * corresponding function and won't be used during execution. For + * non-hashtable based NOT INs, negfuncid will be set to InvalidOid. See + * convert_saop_to_hashed_saop(). */ typedef struct ScalarArrayOpExpr { @@ -604,6 +612,8 @@ typedef struct ScalarArrayOpExpr Oid opno; /* PG_OPERATOR OID of the operator */ Oid opfuncid; /* PG_PROC OID of comparison function */ Oid hashfuncid; /* PG_PROC OID of hash func or InvalidOid */ + Oid negfuncid; /* PG_PROC OID of negator of opfuncid function + * or InvalidOid. See above */ bool useOr; /* true for ANY, false for ALL */ Oid inputcollid; /* OID of collation that operator should use */ List *args; /* the scalar and array operands */ @@ -1059,15 +1069,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 { @@ -1222,7 +1230,7 @@ typedef enum XmlExprOp IS_DOCUMENT /* xmlval IS DOCUMENT */ } XmlExprOp; -typedef enum +typedef enum XmlOptionType { XMLOPTION_DOCUMENT, XMLOPTION_CONTENT @@ -1234,7 +1242,7 @@ typedef struct XmlExpr XmlExprOp op; /* xml function ID */ char *name; /* name in xml(NAME foo ...) syntaxes */ List *named_args; /* non-XML expressions for xml_attributes */ - List *arg_names; /* parallel list of Value strings */ + List *arg_names; /* parallel list of String values */ List *args; /* list of expressions */ XmlOptionType xmloption; /* DOCUMENT or CONTENT */ Oid type; /* target type/typmod for XMLSERIALIZE */ @@ -1358,6 +1366,7 @@ typedef struct SetToDefault * of the target relation being constrained; this aids placing the expression * correctly during planning. We can assume however that its "levelsup" is * always zero, due to the syntactic constraints on where it can appear. + * Also, cvarno will always be a true RT index, never INNER_VAR etc. * * The referenced cursor can be represented either as a hardwired string * or as a reference to a run-time parameter of type REFCURSOR. The latter diff --git a/third_party/spanner_pg/src/include/nodes/print.h b/third_party/spanner_pg/src/include/nodes/print.h index 7bb1e1b6..be5e2287 100644 --- a/third_party/spanner_pg/src/include/nodes/print.h +++ b/third_party/spanner_pg/src/include/nodes/print.h @@ -4,7 +4,7 @@ * definitions for nodes/print.c * * - * 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 * * src/include/nodes/print.h diff --git a/third_party/spanner_pg/src/include/nodes/readfuncs.h b/third_party/spanner_pg/src/include/nodes/readfuncs.h index 5dc78cdc..66717fd6 100644 --- a/third_party/spanner_pg/src/include/nodes/readfuncs.h +++ b/third_party/spanner_pg/src/include/nodes/readfuncs.h @@ -4,7 +4,7 @@ * header file for read.c and readfuncs.c. These functions are internal * to the stringToNode interface and should not be used by anyone else. * - * 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 * * 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/third_party/spanner_pg/src/include/nodes/replnodes.h b/third_party/spanner_pg/src/include/nodes/replnodes.h index faa3a251..8ae9c517 100644 --- a/third_party/spanner_pg/src/include/nodes/replnodes.h +++ b/third_party/spanner_pg/src/include/nodes/replnodes.h @@ -4,7 +4,7 @@ * definitions for replication grammar parse nodes * * - * 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 * * src/include/nodes/replnodes.h @@ -88,22 +88,24 @@ typedef struct StartReplicationCmd /* ---------------------- - * TIMELINE_HISTORY command + * READ_REPLICATION_SLOT command * ---------------------- */ -typedef struct TimeLineHistoryCmd +typedef struct ReadReplicationSlotCmd { NodeTag type; - TimeLineID timeline; -} TimeLineHistoryCmd; + char *slotname; +} ReadReplicationSlotCmd; + /* ---------------------- - * SQL commands + * TIMELINE_HISTORY command * ---------------------- */ -typedef struct SQLCmd +typedef struct TimeLineHistoryCmd { NodeTag type; -} SQLCmd; + TimeLineID timeline; +} TimeLineHistoryCmd; #endif /* REPLNODES_H */ diff --git a/third_party/spanner_pg/src/include/nodes/subscripting.h b/third_party/spanner_pg/src/include/nodes/subscripting.h index 811b45ad..7bee44ca 100644 --- a/third_party/spanner_pg/src/include/nodes/subscripting.h +++ b/third_party/spanner_pg/src/include/nodes/subscripting.h @@ -3,7 +3,7 @@ * subscripting.h * API for generic type subscripting * - * 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 * * src/include/nodes/subscripting.h diff --git a/third_party/spanner_pg/src/include/nodes/supportnodes.h b/third_party/spanner_pg/src/include/nodes/supportnodes.h index 85e1b8a8..9fcbc399 100644 --- a/third_party/spanner_pg/src/include/nodes/supportnodes.h +++ b/third_party/spanner_pg/src/include/nodes/supportnodes.h @@ -23,7 +23,7 @@ * allows for future extensions of the set of request cases. * * - * 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 * * 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/third_party/spanner_pg/src/include/nodes/tidbitmap.h b/third_party/spanner_pg/src/include/nodes/tidbitmap.h index bc671661..64ed8d16 100644 --- a/third_party/spanner_pg/src/include/nodes/tidbitmap.h +++ b/third_party/spanner_pg/src/include/nodes/tidbitmap.h @@ -13,7 +13,7 @@ * fact that a particular page needs to be visited. * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/nodes/tidbitmap.h * diff --git a/third_party/spanner_pg/src/include/nodes/value.h b/third_party/spanner_pg/src/include/nodes/value.h index b28928de..eaf93705 100644 --- a/third_party/spanner_pg/src/include/nodes/value.h +++ b/third_party/spanner_pg/src/include/nodes/value.h @@ -1,10 +1,10 @@ /*------------------------------------------------------------------------- * * value.h - * interface for Value nodes + * interface for value nodes * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * src/include/nodes/value.h * @@ -16,46 +16,65 @@ #include "nodes/nodes.h" -/*---------------------- - * Value node +/* + * The node types Integer, Float, String, and BitString are used to represent + * literals in the lexer and are also used to pass constants around in the + * parser. One difference between these node types and, say, a plain int or + * char * is that the nodes can be put into a List. * - * The same Value struct is used for five node types: T_Integer, - * T_Float, T_String, T_BitString, T_Null. - * - * Integral values are actually represented by a machine integer, - * but both floats and strings are represented as strings. - * Using T_Float as the node type simply indicates that - * the contents of the string look like a valid numeric literal. - * - * (Before Postgres 7.0, we used a double to represent T_Float, - * but that creates loss-of-precision problems when the value is - * ultimately destined to be converted to NUMERIC. Since Value nodes - * are only used in the parsing process, not for runtime data, it's - * better to use the more general representation.) - * - * Note that an integer-looking string will get lexed as T_Float if - * the value is too large to fit in an 'int'. + * (There used to be a Value node, which encompassed all these different node types. Hence the name of this file.) + */ + +typedef struct Integer +{ + NodeTag type; + int ival; +} Integer; + +/* + * Float is internally represented as string. Using T_Float as the node type + * simply indicates that the contents of the string look like a valid numeric + * literal. The value might end up being converted to NUMERIC, so we can't + * store it internally as a C double, since that could lose precision. Since + * these nodes are generally only used in the parsing process, not for runtime + * data, it's better to use the more general representation. * - * Nulls, of course, don't need the value part at all. - *---------------------- + * Note that an integer-looking string will get lexed as T_Float if the value + * is too large to fit in an 'int'. */ -typedef struct Value +typedef struct Float { - NodeTag type; /* tag appropriately (eg. T_String) */ - union ValUnion - { - int ival; /* machine integer */ - char *str; /* string */ - } val; -} Value; - -#define intVal(v) (((Value *)(v))->val.ival) -#define floatVal(v) atof(((Value *)(v))->val.str) -#define strVal(v) (((Value *)(v))->val.str) - -extern Value *makeInteger(int i); -extern Value *makeFloat(char *numericStr); -extern Value *makeString(char *str); -extern Value *makeBitString(char *str); + NodeTag type; + char *fval; +} Float; + +typedef struct Boolean +{ + NodeTag type; + bool boolval; +} Boolean; + +typedef struct String +{ + NodeTag type; + char *sval; +} String; + +typedef struct BitString +{ + NodeTag type; + char *bsval; +} BitString; + +#define intVal(v) (castNode(Integer, v)->ival) +#define floatVal(v) atof(castNode(Float, v)->fval) +#define boolVal(v) (castNode(Boolean, v)->boolval) +#define strVal(v) (castNode(String, v)->sval) + +extern Integer *makeInteger(int i); +extern Float *makeFloat(char *numericStr); +extern Boolean *makeBoolean(bool var); +extern String *makeString(char *str); +extern BitString *makeBitString(char *str); #endif /* VALUE_H */ diff --git a/third_party/spanner_pg/src/include/optimizer/appendinfo.h b/third_party/spanner_pg/src/include/optimizer/appendinfo.h index 39d04d9c..fc808dcd 100644 --- a/third_party/spanner_pg/src/include/optimizer/appendinfo.h +++ b/third_party/spanner_pg/src/include/optimizer/appendinfo.h @@ -4,7 +4,7 @@ * Routines for mapping expressions between append rel parent(s) and * children * - * 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 * * src/include/optimizer/appendinfo.h diff --git a/third_party/spanner_pg/src/include/optimizer/clauses.h b/third_party/spanner_pg/src/include/optimizer/clauses.h index bc3f3e60..6c5203dc 100644 --- a/third_party/spanner_pg/src/include/optimizer/clauses.h +++ b/third_party/spanner_pg/src/include/optimizer/clauses.h @@ -4,7 +4,7 @@ * prototypes for clauses.c. * * - * 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 * * src/include/optimizer/clauses.h diff --git a/third_party/spanner_pg/src/include/optimizer/cost.h b/third_party/spanner_pg/src/include/optimizer/cost.h index 2113bc82..bc12071a 100644 --- a/third_party/spanner_pg/src/include/optimizer/cost.h +++ b/third_party/spanner_pg/src/include/optimizer/cost.h @@ -4,7 +4,7 @@ * prototypes for costsize.c and clausesel.c. * * - * 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 * * 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/third_party/spanner_pg/src/include/optimizer/geqo.h b/third_party/spanner_pg/src/include/optimizer/geqo.h index 24dcdfb6..d3993233 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo.h @@ -3,7 +3,7 @@ * geqo.h * prototypes for various files in optimizer/geqo * - * 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 * * src/include/optimizer/geqo.h @@ -22,6 +22,7 @@ #ifndef GEQO_H #define GEQO_H +#include "common/pg_prng.h" #include "nodes/pathnodes.h" #include "optimizer/geqo_gene.h" @@ -48,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 */ /* @@ -73,7 +75,7 @@ extern double Geqo_seed; /* 0 .. 1 */ typedef struct { List *initial_rels; /* the base relations we are joining */ - unsigned short random_state[3]; /* state for pg_erand48() */ + pg_prng_state random_state; /* PRNG state */ } GeqoPrivateData; diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_copy.h b/third_party/spanner_pg/src/include/optimizer/geqo_copy.h index 47c54498..4905f712 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_copy.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_copy.h @@ -3,7 +3,7 @@ * geqo_copy.h * prototypes for copy functions in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_copy.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_gene.h b/third_party/spanner_pg/src/include/optimizer/geqo_gene.h index 89300548..414f54d1 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_gene.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_gene.h @@ -3,7 +3,7 @@ * geqo_gene.h * genome representation in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_gene.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_misc.h b/third_party/spanner_pg/src/include/optimizer/geqo_misc.h index 458c4089..205a89fe 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_misc.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_misc.h @@ -3,7 +3,7 @@ * geqo_misc.h * prototypes for printout routines in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_misc.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_mutation.h b/third_party/spanner_pg/src/include/optimizer/geqo_mutation.h index 076e4ab5..89ee3305 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_mutation.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_mutation.h @@ -3,7 +3,7 @@ * geqo_mutation.h * prototypes for mutation functions in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_mutation.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_pool.h b/third_party/spanner_pg/src/include/optimizer/geqo_pool.h index d5c41ac8..c98abd75 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_pool.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_pool.h @@ -3,7 +3,7 @@ * geqo_pool.h * pool representation in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_pool.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_random.h b/third_party/spanner_pg/src/include/optimizer/geqo_random.h index 7f4aad44..56d06704 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_random.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_random.h @@ -3,7 +3,7 @@ * geqo_random.h * random number generator * - * 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 * * src/include/optimizer/geqo_random.h @@ -31,11 +31,10 @@ extern void geqo_set_seed(PlannerInfo *root, double seed); -/* geqo_rand returns a random float value between 0 and 1 inclusive */ +/* geqo_rand returns a random float value in the range [0.0, 1.0) */ extern double geqo_rand(PlannerInfo *root); /* geqo_randint returns integer value between lower and upper inclusive */ -#define geqo_randint(root, upper, lower) \ - ( (int) floor( geqo_rand(root)*(((upper)-(lower))+0.999999) ) + (lower) ) +extern int geqo_randint(PlannerInfo *root, int upper, int lower); #endif /* GEQO_RANDOM_H */ diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_recombination.h b/third_party/spanner_pg/src/include/optimizer/geqo_recombination.h index 30018328..4c0acfaa 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_recombination.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_recombination.h @@ -3,7 +3,7 @@ * geqo_recombination.h * prototypes for recombination in the genetic query optimizer * - * 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 * * src/include/optimizer/geqo_recombination.h diff --git a/third_party/spanner_pg/src/include/optimizer/geqo_selection.h b/third_party/spanner_pg/src/include/optimizer/geqo_selection.h index 099c8ce4..4e50ae01 100644 --- a/third_party/spanner_pg/src/include/optimizer/geqo_selection.h +++ b/third_party/spanner_pg/src/include/optimizer/geqo_selection.h @@ -3,7 +3,7 @@ * geqo_selection.h * prototypes for selection routines in optimizer/geqo * - * 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 * * src/include/optimizer/geqo_selection.h diff --git a/third_party/spanner_pg/src/include/optimizer/inherit.h b/third_party/spanner_pg/src/include/optimizer/inherit.h index 0abd8c37..8ebd42b7 100644 --- a/third_party/spanner_pg/src/include/optimizer/inherit.h +++ b/third_party/spanner_pg/src/include/optimizer/inherit.h @@ -4,7 +4,7 @@ * prototypes for inherit.c. * * - * 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 * * src/include/optimizer/inherit.h diff --git a/third_party/spanner_pg/src/include/optimizer/joininfo.h b/third_party/spanner_pg/src/include/optimizer/joininfo.h index 739cc52c..f86e5c0b 100644 --- a/third_party/spanner_pg/src/include/optimizer/joininfo.h +++ b/third_party/spanner_pg/src/include/optimizer/joininfo.h @@ -4,7 +4,7 @@ * prototypes for joininfo.c. * * - * 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 * * src/include/optimizer/joininfo.h diff --git a/third_party/spanner_pg/src/include/optimizer/optimizer.h b/third_party/spanner_pg/src/include/optimizer/optimizer.h index 575f245d..7b2a0e0a 100644 --- a/third_party/spanner_pg/src/include/optimizer/optimizer.h +++ b/third_party/spanner_pg/src/include/optimizer/optimizer.h @@ -12,7 +12,7 @@ * example. For the most part, however, code outside the core planner * should not need to include any optimizer/ header except this one. * - * 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 * * src/include/optimizer/optimizer.h @@ -86,9 +86,11 @@ 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); +extern long clamp_cardinality_to_long(Cardinality x); /* in path/indxpath.c: */ @@ -106,8 +108,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, @@ -136,7 +138,9 @@ extern Expr *canonicalize_qual(Expr *qual, bool is_check); /* in util/clauses.c: */ extern bool contain_mutable_functions(Node *clause); +extern bool contain_mutable_functions_after_planning(Expr *expr); extern bool contain_volatile_functions(Node *clause); +extern bool contain_volatile_functions_after_planning(Expr *expr); extern bool contain_volatile_functions_not_nextval(Node *clause); extern Node *eval_const_expressions(PlannerInfo *root, Node *node); diff --git a/third_party/spanner_pg/src/include/optimizer/orclauses.h b/third_party/spanner_pg/src/include/optimizer/orclauses.h index 526101e1..fb54fd2b 100644 --- a/third_party/spanner_pg/src/include/optimizer/orclauses.h +++ b/third_party/spanner_pg/src/include/optimizer/orclauses.h @@ -4,7 +4,7 @@ * prototypes for orclauses.c. * * - * 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 * * src/include/optimizer/orclauses.h diff --git a/third_party/spanner_pg/src/include/optimizer/paramassign.h b/third_party/spanner_pg/src/include/optimizer/paramassign.h index b4fd3799..f3870f26 100644 --- a/third_party/spanner_pg/src/include/optimizer/paramassign.h +++ b/third_party/spanner_pg/src/include/optimizer/paramassign.h @@ -3,7 +3,7 @@ * paramassign.h * Functions for assigning PARAM_EXEC slots during planning. * - * 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 * * src/include/optimizer/paramassign.h diff --git a/third_party/spanner_pg/src/include/optimizer/pathnode.h b/third_party/spanner_pg/src/include/optimizer/pathnode.h index 2922c0cd..d2d46b15 100644 --- a/third_party/spanner_pg/src/include/optimizer/pathnode.h +++ b/third_party/spanner_pg/src/include/optimizer/pathnode.h @@ -4,7 +4,7 @@ * prototypes for pathnode.c, relnode.c. * * - * 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 * * 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, @@ -276,7 +278,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/third_party/spanner_pg/src/include/optimizer/paths.h b/third_party/spanner_pg/src/include/optimizer/paths.h index f1d11106..e313eb21 100644 --- a/third_party/spanner_pg/src/include/optimizer/paths.h +++ b/third_party/spanner_pg/src/include/optimizer/paths.h @@ -4,7 +4,7 @@ * prototypes for various files in optimizer/path * * - * 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 * * src/include/optimizer/paths.h @@ -143,7 +143,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); diff --git a/third_party/spanner_pg/src/include/optimizer/placeholder.h b/third_party/spanner_pg/src/include/optimizer/placeholder.h index 69ef5aed..39803ea4 100644 --- a/third_party/spanner_pg/src/include/optimizer/placeholder.h +++ b/third_party/spanner_pg/src/include/optimizer/placeholder.h @@ -4,7 +4,7 @@ * prototypes for optimizer/util/placeholder.c. * * - * 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 * * src/include/optimizer/placeholder.h diff --git a/third_party/spanner_pg/src/include/optimizer/plancat.h b/third_party/spanner_pg/src/include/optimizer/plancat.h index cb0f6740..b0c06ca1 100644 --- a/third_party/spanner_pg/src/include/optimizer/plancat.h +++ b/third_party/spanner_pg/src/include/optimizer/plancat.h @@ -4,7 +4,7 @@ * prototypes for plancat.c. * * - * 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 * * src/include/optimizer/plancat.h diff --git a/third_party/spanner_pg/src/include/optimizer/planmain.h b/third_party/spanner_pg/src/include/optimizer/planmain.h index bf1adfc5..c4f61c1a 100644 --- a/third_party/spanner_pg/src/include/optimizer/planmain.h +++ b/third_party/spanner_pg/src/include/optimizer/planmain.h @@ -4,7 +4,7 @@ * prototypes for various files in optimizer/plan * * - * 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 * * 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); @@ -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); diff --git a/third_party/spanner_pg/src/include/optimizer/planner.h b/third_party/spanner_pg/src/include/optimizer/planner.h index 9a15de50..eb96b2cf 100644 --- a/third_party/spanner_pg/src/include/optimizer/planner.h +++ b/third_party/spanner_pg/src/include/optimizer/planner.h @@ -8,7 +8,7 @@ * non-planner code. Declarations here are meant for use by other * planner modules. * - * 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 * * src/include/optimizer/planner.h diff --git a/third_party/spanner_pg/src/include/optimizer/prep.h b/third_party/spanner_pg/src/include/optimizer/prep.h index bcd2a861..2b11ff1d 100644 --- a/third_party/spanner_pg/src/include/optimizer/prep.h +++ b/third_party/spanner_pg/src/include/optimizer/prep.h @@ -4,7 +4,7 @@ * prototypes for files in optimizer/prep/ * * - * 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 * * 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/third_party/spanner_pg/src/include/optimizer/restrictinfo.h b/third_party/spanner_pg/src/include/optimizer/restrictinfo.h index 4ff1d6f1..fd7a0ec6 100644 --- a/third_party/spanner_pg/src/include/optimizer/restrictinfo.h +++ b/third_party/spanner_pg/src/include/optimizer/restrictinfo.h @@ -4,7 +4,7 @@ * prototypes for restrictinfo.c. * * - * 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 * * src/include/optimizer/restrictinfo.h diff --git a/third_party/spanner_pg/src/include/optimizer/subselect.h b/third_party/spanner_pg/src/include/optimizer/subselect.h index 059bdf94..456d3076 100644 --- a/third_party/spanner_pg/src/include/optimizer/subselect.h +++ b/third_party/spanner_pg/src/include/optimizer/subselect.h @@ -3,7 +3,7 @@ * subselect.h * Planning routines for subselects. * - * 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 * * src/include/optimizer/subselect.h diff --git a/third_party/spanner_pg/src/include/optimizer/tlist.h b/third_party/spanner_pg/src/include/optimizer/tlist.h index d62a0966..04668ba1 100644 --- a/third_party/spanner_pg/src/include/optimizer/tlist.h +++ b/third_party/spanner_pg/src/include/optimizer/tlist.h @@ -4,7 +4,7 @@ * prototypes for tlist.c. * * - * 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 * * src/include/optimizer/tlist.h diff --git a/third_party/spanner_pg/src/include/parser/analyze.h b/third_party/spanner_pg/src/include/parser/analyze.h index d40fc48f..dc4660ed 100644 --- a/third_party/spanner_pg/src/include/parser/analyze.h +++ b/third_party/spanner_pg/src/include/parser/analyze.h @@ -4,7 +4,7 @@ * parse analysis for optimizable statements * * - * 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 * * 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" @@ -24,16 +25,26 @@ 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); + 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, - bool locked_from_parent, - bool resolve_unknowns); + CommonTableExpr *parentCTE, + 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/third_party/spanner_pg/src/include/parser/gramparse.h b/third_party/spanner_pg/src/include/parser/gramparse.h index 4e8c8d42..e5e6e82c 100644 --- a/third_party/spanner_pg/src/include/parser/gramparse.h +++ b/third_party/spanner_pg/src/include/parser/gramparse.h @@ -8,7 +8,7 @@ * Definitions that are needed outside the core parser should be in parser.h. * * - * 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 * * src/include/parser/gramparse.h diff --git a/third_party/spanner_pg/src/include/parser/kwlist.h b/third_party/spanner_pg/src/include/parser/kwlist.h index aec48775..af61639e 100644 --- a/third_party/spanner_pg/src/include/parser/kwlist.h +++ b/third_party/spanner_pg/src/include/parser/kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -262,8 +262,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) @@ -318,6 +320,7 @@ PG_KEYWORD("overriding", OVERRIDING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("parallel", PARALLEL, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("parameter", PARAMETER, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("parent", PARENT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD, BARE_LABEL) diff --git a/third_party/spanner_pg/src/include/parser/parse_agg.h b/third_party/spanner_pg/src/include/parser/parse_agg.h index af2df6eb..d485f17e 100644 --- a/third_party/spanner_pg/src/include/parser/parse_agg.h +++ b/third_party/spanner_pg/src/include/parser/parse_agg.h @@ -3,7 +3,7 @@ * parse_agg.h * handle aggregates and window functions in parser * - * 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 * * src/include/parser/parse_agg.h @@ -46,11 +46,6 @@ extern void build_aggregate_transfn_expr(Oid *agg_input_types, Expr **transfnexpr, Expr **invtransfnexpr); -extern void build_aggregate_combinefn_expr(Oid agg_state_type, - Oid agg_input_collation, - Oid combinefn_oid, - Expr **combinefnexpr); - extern void build_aggregate_serialfn_expr(Oid serialfn_oid, Expr **serialfnexpr); diff --git a/third_party/spanner_pg/src/include/parser/parse_clause.h b/third_party/spanner_pg/src/include/parser/parse_clause.h index fe759df8..30cdfbb6 100644 --- a/third_party/spanner_pg/src/include/parser/parse_clause.h +++ b/third_party/spanner_pg/src/include/parser/parse_clause.h @@ -4,7 +4,7 @@ * handle clauses in parser * * - * 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 * * src/include/parser/parse_clause.h diff --git a/third_party/spanner_pg/src/include/parser/parse_coerce.h b/third_party/spanner_pg/src/include/parser/parse_coerce.h index 4948453a..68536a0c 100644 --- a/third_party/spanner_pg/src/include/parser/parse_coerce.h +++ b/third_party/spanner_pg/src/include/parser/parse_coerce.h @@ -4,7 +4,7 @@ * Routines for type coercion. * * - * 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 * * src/include/parser/parse_coerce.h diff --git a/third_party/spanner_pg/src/include/parser/parse_collate.h b/third_party/spanner_pg/src/include/parser/parse_collate.h index 45245d6c..cd16aa05 100644 --- a/third_party/spanner_pg/src/include/parser/parse_collate.h +++ b/third_party/spanner_pg/src/include/parser/parse_collate.h @@ -4,7 +4,7 @@ * Routines for assigning collation information. * * - * 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 * * src/include/parser/parse_collate.h diff --git a/third_party/spanner_pg/src/include/parser/parse_cte.h b/third_party/spanner_pg/src/include/parser/parse_cte.h index d89b7a61..719f383b 100644 --- a/third_party/spanner_pg/src/include/parser/parse_cte.h +++ b/third_party/spanner_pg/src/include/parser/parse_cte.h @@ -4,7 +4,7 @@ * handle CTEs (common table expressions) in parser * * - * 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 * * src/include/parser/parse_cte.h diff --git a/third_party/spanner_pg/src/include/parser/parse_enr.h b/third_party/spanner_pg/src/include/parser/parse_enr.h index 65787c25..a3c05fd9 100644 --- a/third_party/spanner_pg/src/include/parser/parse_enr.h +++ b/third_party/spanner_pg/src/include/parser/parse_enr.h @@ -4,7 +4,7 @@ * Internal definitions for parser * * - * 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 * * src/include/parser/parse_enr.h diff --git a/third_party/spanner_pg/src/include/parser/parse_expr.h b/third_party/spanner_pg/src/include/parser/parse_expr.h index 8ac4a0a3..c8e5c57b 100644 --- a/third_party/spanner_pg/src/include/parser/parse_expr.h +++ b/third_party/spanner_pg/src/include/parser/parse_expr.h @@ -3,7 +3,7 @@ * parse_expr.h * handle expressions in parser * - * 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 * * 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/third_party/spanner_pg/src/include/parser/parse_func.h b/third_party/spanner_pg/src/include/parser/parse_func.h index 9529cef5..71140c01 100644 --- a/third_party/spanner_pg/src/include/parser/parse_func.h +++ b/third_party/spanner_pg/src/include/parser/parse_func.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/parser/parse_func.h diff --git a/third_party/spanner_pg/src/include/parser/parse_merge.h b/third_party/spanner_pg/src/include/parser/parse_merge.h new file mode 100644 index 00000000..1a1baa1f --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/include/parser/parse_node.h b/third_party/spanner_pg/src/include/parser/parse_node.h index de19e0d1..e096b4fe 100644 --- a/third_party/spanner_pg/src/include/parser/parse_node.h +++ b/third_party/spanner_pg/src/include/parser/parse_node.h @@ -4,7 +4,7 @@ * Internal definitions for parser * * - * 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 * * 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_UNUSED_SPANGRES 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 */ @@ -333,7 +334,6 @@ extern SubscriptingRef *transformContainerSubscripts(ParseState *pstate, int32 containerTypMod, List *indirection, bool isAssignment); - -extern Const *make_const_UNUSED_SPANGRES(ParseState *pstate, Value *value, int location); +extern Const *make_const_UNUSED_SPANGRES(ParseState *pstate, A_Const *aconst); #endif /* PARSE_NODE_H */ diff --git a/third_party/spanner_pg/src/include/parser/parse_oper.h b/third_party/spanner_pg/src/include/parser/parse_oper.h index b80b4aa5..7ff2cd3f 100644 --- a/third_party/spanner_pg/src/include/parser/parse_oper.h +++ b/third_party/spanner_pg/src/include/parser/parse_oper.h @@ -4,7 +4,7 @@ * handle operator things for parser * * - * 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 * * src/include/parser/parse_oper.h diff --git a/third_party/spanner_pg/src/include/parser/parse_param.h b/third_party/spanner_pg/src/include/parser/parse_param.h index 2644a8ac..df1ee660 100644 --- a/third_party/spanner_pg/src/include/parser/parse_param.h +++ b/third_party/spanner_pg/src/include/parser/parse_param.h @@ -3,7 +3,7 @@ * parse_param.h * handle parameters in parser * - * 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 * * src/include/parser/parse_param.h @@ -15,11 +15,11 @@ #include "parser/parse_node.h" - -extern void parse_fixed_parameters(ParseState *pstate, - Oid *paramTypes, int numParams); -extern void 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); +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); #endif /* PARSE_PARAM_H */ diff --git a/third_party/spanner_pg/src/include/parser/parse_relation.h b/third_party/spanner_pg/src/include/parser/parse_relation.h index ec9002c4..dff4b89d 100644 --- a/third_party/spanner_pg/src/include/parser/parse_relation.h +++ b/third_party/spanner_pg/src/include/parser/parse_relation.h @@ -4,7 +4,7 @@ * prototypes for parse_relation.c. * * - * 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 * * src/include/parser/parse_relation.h @@ -118,7 +118,8 @@ extern List *expandNSItemVars_UNUSED_SPANGRES(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/third_party/spanner_pg/src/include/parser/parse_target.h b/third_party/spanner_pg/src/include/parser/parse_target.h index a814de86..dcd2b16f 100644 --- a/third_party/spanner_pg/src/include/parser/parse_target.h +++ b/third_party/spanner_pg/src/include/parser/parse_target.h @@ -4,7 +4,7 @@ * handle target lists * * - * 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 * * src/include/parser/parse_target.h diff --git a/third_party/spanner_pg/src/include/parser/parse_type.h b/third_party/spanner_pg/src/include/parser/parse_type.h index c3a3a00c..28021beb 100644 --- a/third_party/spanner_pg/src/include/parser/parse_type.h +++ b/third_party/spanner_pg/src/include/parser/parse_type.h @@ -3,7 +3,7 @@ * parse_type.h * handle type operations for parser * - * 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 * * src/include/parser/parse_type.h diff --git a/third_party/spanner_pg/src/include/parser/parse_utilcmd.h b/third_party/spanner_pg/src/include/parser/parse_utilcmd.h index 5b88d48d..f7735e18 100644 --- a/third_party/spanner_pg/src/include/parser/parse_utilcmd.h +++ b/third_party/spanner_pg/src/include/parser/parse_utilcmd.h @@ -4,7 +4,7 @@ * parse analysis for utility commands * * - * 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 * * src/include/parser/parse_utilcmd.h diff --git a/third_party/spanner_pg/src/include/parser/parser.h b/third_party/spanner_pg/src/include/parser/parser.h index 853b0f16..828150f0 100644 --- a/third_party/spanner_pg/src/include/parser/parser.h +++ b/third_party/spanner_pg/src/include/parser/parser.h @@ -5,7 +5,7 @@ * * This is the external API for the raw lexing/parsing functions. * - * 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 * * 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/third_party/spanner_pg/src/include/parser/parsetree.h b/third_party/spanner_pg/src/include/parser/parsetree.h index ccd0f054..9a2756b2 100644 --- a/third_party/spanner_pg/src/include/parser/parsetree.h +++ b/third_party/spanner_pg/src/include/parser/parsetree.h @@ -5,7 +5,7 @@ * parse trees. * * - * 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 * * src/include/parser/parsetree.h diff --git a/third_party/spanner_pg/src/include/parser/scanner.h b/third_party/spanner_pg/src/include/parser/scanner.h index 0d8182fa..08434815 100644 --- a/third_party/spanner_pg/src/include/parser/scanner.h +++ b/third_party/spanner_pg/src/include/parser/scanner.h @@ -8,7 +8,7 @@ * higher-level API provided by parser.h. * * - * 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 * * src/include/parser/scanner.h diff --git a/third_party/spanner_pg/src/include/parser/scansup.h b/third_party/spanner_pg/src/include/parser/scansup.h index 813327b7..ff65224b 100644 --- a/third_party/spanner_pg/src/include/parser/scansup.h +++ b/third_party/spanner_pg/src/include/parser/scansup.h @@ -3,7 +3,7 @@ * scansup.h * scanner support routines used by the core lexer * - * 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 * * src/include/parser/scansup.h diff --git a/third_party/spanner_pg/src/include/partitioning/partbounds.h b/third_party/spanner_pg/src/include/partitioning/partbounds.h index ebf3ff1f..b1e3f1b8 100644 --- a/third_party/spanner_pg/src/include/partitioning/partbounds.h +++ b/third_party/spanner_pg/src/include/partitioning/partbounds.h @@ -2,7 +2,7 @@ * * partbounds.h * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * src/include/partitioning/partbounds.h * @@ -61,6 +61,20 @@ struct RelOptInfo; /* avoid including pathnodes.h here */ * The indexes array is indexed according to the hash key's remainder modulo * the greatest modulus, and it contains either the partition index accepting * that remainder, or -1 if there is no partition for that remainder. + * + * For LIST partitioned tables, we track the partition indexes of partitions + * which are possibly "interleaved" partitions. A partition is considered + * interleaved if it allows multiple values and there exists at least one + * other partition which could contain a value that lies between those values. + * For example, if a partition exists FOR VALUES IN(3,5) and another partition + * exists FOR VALUES IN (4), then the IN(3,5) partition is an interleaved + * partition. The same is possible with DEFAULT partitions since they can + * contain any value that does not belong in another partition. This field + * only serves as proof that a particular partition is not interleaved, not + * proof that it is interleaved. When we're uncertain, we marked the + * partition as interleaved. The interleaved_parts field is only ever set for + * RELOPT_BASEREL and RELOPT_OTHER_MEMBER_REL, it is always left NULL for join + * relations. */ typedef struct PartitionBoundInfoData { @@ -70,6 +84,9 @@ typedef struct PartitionBoundInfoData PartitionRangeDatumKind **kind; /* The kind of each range bound datum; * NULL for hash and list partitioned * tables */ + Bitmapset *interleaved_parts; /* Partition indexes of partitions which + * may be interleaved. See above. This is + * only set for LIST partitioned tables */ int nindexes; /* Length of the indexes[] array */ int *indexes; /* Partition indexes */ int null_index; /* Index of the null-accepting partition; -1 @@ -85,7 +102,7 @@ extern int get_hash_partition_greatest_modulus(PartitionBoundInfo b); extern uint64 compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, Oid *partcollation, Datum *values, bool *isnull); -extern List *get_qual_from_partbound(Relation rel, Relation parent, +extern List *get_qual_from_partbound(Relation parent, PartitionBoundSpec *spec); extern PartitionBoundInfo partition_bounds_create(PartitionBoundSpec **boundspecs, int nparts, PartitionKey key, int **mapping); @@ -102,7 +119,8 @@ extern PartitionBoundInfo partition_bounds_merge(int partnatts, JoinType jointype, List **outer_parts, List **inner_parts); -extern bool partitions_are_ordered(PartitionBoundInfo boundinfo, int nparts); +extern bool partitions_are_ordered(PartitionBoundInfo boundinfo, + Bitmapset *live_parts); extern void check_new_partition_bound(char *relname, Relation parent, PartitionBoundSpec *spec, ParseState *pstate); diff --git a/third_party/spanner_pg/src/include/partitioning/partdefs.h b/third_party/spanner_pg/src/include/partitioning/partdefs.h index d742b961..aed62eae 100644 --- a/third_party/spanner_pg/src/include/partitioning/partdefs.h +++ b/third_party/spanner_pg/src/include/partitioning/partdefs.h @@ -3,7 +3,7 @@ * partdefs.h * Base definitions for partitioned table handling * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * src/include/partitioning/partdefs.h * diff --git a/third_party/spanner_pg/src/include/partitioning/partdesc.h b/third_party/spanner_pg/src/include/partitioning/partdesc.h index 0792f485..ae1afe3d 100644 --- a/third_party/spanner_pg/src/include/partitioning/partdesc.h +++ b/third_party/spanner_pg/src/include/partitioning/partdesc.h @@ -2,7 +2,7 @@ * * partdesc.h * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/partitioning/partdesc.h * diff --git a/third_party/spanner_pg/src/include/partitioning/partprune.h b/third_party/spanner_pg/src/include/partitioning/partprune.h index 5f51e73a..90684efa 100644 --- a/third_party/spanner_pg/src/include/partitioning/partprune.h +++ b/third_party/spanner_pg/src/include/partitioning/partprune.h @@ -4,7 +4,7 @@ * prototypes for partprune.c * * - * 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 * * 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; diff --git a/third_party/spanner_pg/src/include/pg_config.h.in b/third_party/spanner_pg/src/include/pg_config.h.in index 40d513c1..768e3d71 100644 --- a/third_party/spanner_pg/src/include/pg_config.h.in +++ b/third_party/spanner_pg/src/include/pg_config.h.in @@ -1,17 +1,5 @@ /* src/include/pg_config.h.in. Generated from configure.ac by autoheader. */ -/* Define to the type of arg 1 of 'accept' */ -#undef ACCEPT_TYPE_ARG1 - -/* Define to the type of arg 2 of 'accept' */ -#undef ACCEPT_TYPE_ARG2 - -/* Define to the type of arg 3 of 'accept' */ -#undef ACCEPT_TYPE_ARG3 - -/* Define to the return type of 'accept' */ -#undef ACCEPT_TYPE_RETURN - /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD @@ -54,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 @@ -86,9 +77,6 @@ /* Define to 1 if you have the `backtrace_symbols' function. */ #undef HAVE_BACKTRACE_SYMBOLS -/* Define to 1 if you have the `BIO_get_data' function. */ -#undef HAVE_BIO_GET_DATA - /* Define to 1 if you have the `BIO_meth_new' function. */ #undef HAVE_BIO_METH_NEW @@ -158,6 +146,10 @@ don't. */ #undef HAVE_DECL_RTLD_NOW +/* Define to 1 if you have the declaration of `sigwait', and to 0 if you + don't. */ +#undef HAVE_DECL_SIGWAIT + /* Define to 1 if you have the declaration of `strlcat', and to 0 if you don't. */ #undef HAVE_DECL_STRLCAT @@ -288,6 +280,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 @@ -360,6 +355,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 @@ -372,9 +370,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 @@ -414,6 +409,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H +/* Define to 1 if you have a POSIX-conforming sigwait declaration. */ +#undef HAVE_POSIX_DECL_SIGWAIT + /* Define to 1 if you have the `posix_fadvise' function. */ #undef HAVE_POSIX_FADVISE @@ -450,9 +448,6 @@ /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE -/* Define to 1 if you have the `random' function. */ -#undef HAVE_RANDOM - /* Define to 1 if you have the header file. */ #undef HAVE_READLINE_H @@ -468,10 +463,6 @@ /* Define to 1 if you have the `readv' function. */ #undef HAVE_READV -/* Define to 1 if you have the global variable - 'rl_completion_append_character'. */ -#undef HAVE_RL_COMPLETION_APPEND_CHARACTER - /* Define to 1 if you have the `rl_completion_matches' function. */ #undef HAVE_RL_COMPLETION_MATCHES @@ -493,6 +484,9 @@ /* Define to 1 if you have the `rl_reset_screen_size' function. */ #undef HAVE_RL_RESET_SCREEN_SIZE +/* Define to 1 if you have the `rl_variable_bind' function. */ +#undef HAVE_RL_VARIABLE_BIND + /* Define to 1 if you have the header file. */ #undef HAVE_SECURITY_PAM_APPL_H @@ -511,12 +505,12 @@ /* Define to 1 if you have the `shm_open' function. */ #undef HAVE_SHM_OPEN +/* Define to 1 if the system has the type `socklen_t'. */ +#undef HAVE_SOCKLEN_T + /* Define to 1 if you have spinlocks. */ #undef HAVE_SPINLOCKS -/* Define to 1 if you have the `srandom' function. */ -#undef HAVE_SRANDOM - /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H @@ -964,6 +958,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/third_party/spanner_pg/src/include/pg_config_manual.h b/third_party/spanner_pg/src/include/pg_config_manual.h index 614035e2..8d2e3e3a 100644 --- a/third_party/spanner_pg/src/include/pg_config_manual.h +++ b/third_party/spanner_pg/src/include/pg_config_manual.h @@ -6,7 +6,7 @@ * for developers. If you edit any of these, be sure to do a *full* * rebuild (and an initdb if noted). * - * 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 * * src/include/pg_config_manual.h @@ -42,6 +42,23 @@ */ #define FUNC_MAX_ARGS 100 +/* + * When creating a product derived from PostgreSQL with changes that cause + * incompatibilities for loadable modules, it is recommended to change this + * string so that dfmgr.c can refuse to load incompatible modules with a clean + * error message. Typical examples that cause incompatibilities are any + * changes to node tags or node structures. (Note that dfmgr.c already + * detects common sources of incompatibilities due to major version + * differences and due to some changed compile-time constants. This setting + * is for catching anything that cannot be detected in a straightforward way.) + * + * There is no prescribed format for the string. The suggestion is to include + * product or company name, and optionally any internally-relevant ABI + * version. Example: "ACME Postgres/1.2". Note that the string will appear + * in a user-facing error message if an ABI mismatch is detected. + */ +#define FMGR_ABI_EXTRA "PostgreSQL" + /* * Maximum number of columns in an index. There is little point in making * this anything but a multiple of 32, because the main cost is associated @@ -217,17 +234,6 @@ */ #define DEFAULT_EVENT_SOURCE "PostgreSQL" -/* - * The random() function is expected to yield values between 0 and - * MAX_RANDOM_VALUE. Currently, all known implementations yield - * 0..2^31-1, so we just hardwire this constant. We could do a - * configure test if it proves to be necessary. CAUTION: Think not to - * replace this with RAND_MAX. RAND_MAX defines the maximum value of - * the older rand() function, which is often different from --- and - * considerably inferior to --- random(). - */ -#define MAX_RANDOM_VALUE PG_INT32_MAX - /* * On PPC machines, decide whether to use the mutex hint bit in LWARX * instructions. Setting the hint bit will slightly improve spinlock diff --git a/third_party/spanner_pg/src/include/pg_getopt.h b/third_party/spanner_pg/src/include/pg_getopt.h index 66f1b750..9d91e602 100644 --- a/third_party/spanner_pg/src/include/pg_getopt.h +++ b/third_party/spanner_pg/src/include/pg_getopt.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * Portions Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2003-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/pg_trace.h b/third_party/spanner_pg/src/include/pg_trace.h index a1ecedb7..8c63222c 100644 --- a/third_party/spanner_pg/src/include/pg_trace.h +++ b/third_party/spanner_pg/src/include/pg_trace.h @@ -3,7 +3,7 @@ * * Definitions for the PostgreSQL tracing framework * - * Copyright (c) 2006-2021, PostgreSQL Global Development Group + * Copyright (c) 2006-2022, PostgreSQL Global Development Group * * src/include/pg_trace.h * ---------- diff --git a/third_party/spanner_pg/src/include/pgstat.h b/third_party/spanner_pg/src/include/pgstat.h index 9a90bd81..44279ea3 100644 --- a/third_party/spanner_pg/src/include/pgstat.h +++ b/third_party/spanner_pg/src/include/pgstat.h @@ -1,9 +1,9 @@ /* ---------- * pgstat.h * - * Definitions for the PostgreSQL statistics collector daemon. + * Definitions for the PostgreSQL cumulative statistics system. * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * src/include/pgstat.h * ---------- @@ -16,7 +16,6 @@ #include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */ #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 */ @@ -26,12 +25,37 @@ * ---------- */ #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" +/* 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 { @@ -40,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 { @@ -51,52 +82,75 @@ typedef enum SessionEndType } SessionEndType; /* ---------- - * The types of backend -> collector messages + * The data type used for counters. + * ---------- + */ +typedef int64 PgStat_Counter; + + +/* ------------------------------------------------------------ + * Structures kept in backend local memory while accumulating counts + * ------------------------------------------------------------ + */ + +/* ---------- + * 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 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. * ---------- */ -typedef enum StatMsgType +typedef struct PgStat_FunctionCounts { - 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_AUTOVAC_START, - PGSTAT_MTYPE_VACUUM, - PGSTAT_MTYPE_ANALYZE, - PGSTAT_MTYPE_ARCHIVER, - PGSTAT_MTYPE_BGWRITER, - 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, -} StatMsgType; + PgStat_Counter f_numcalls; + instr_time f_total_time; + instr_time f_self_time; +} PgStat_FunctionCounts; /* ---------- - * The data type used for counters. + * PgStat_BackendFunctionEntry Non-flushed function stats. * ---------- */ -typedef int64 PgStat_Counter; +typedef struct PgStat_BackendFunctionEntry +{ + 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_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 @@ -122,7 +176,7 @@ typedef struct PgStat_TableCounts PgStat_Counter t_tuples_updated; PgStat_Counter t_tuples_deleted; PgStat_Counter t_tuples_hot_updated; - bool t_truncated; + bool t_truncdropped; PgStat_Counter t_delta_live_tuples; PgStat_Counter t_delta_dead_tuples; @@ -132,27 +186,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 * @@ -174,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; /* ---------- @@ -185,10 +219,12 @@ typedef struct PgStat_TableXactStatus PgStat_Counter tuples_inserted; /* tuples inserted in (sub)xact */ PgStat_Counter tuples_updated; /* tuples updated in (sub)xact */ PgStat_Counter tuples_deleted; /* tuples deleted in (sub)xact */ - bool truncated; /* relation truncated in this (sub)xact */ - PgStat_Counter inserted_pre_trunc; /* tuples inserted prior to truncate */ - PgStat_Counter updated_pre_trunc; /* tuples updated prior to truncate */ - PgStat_Counter deleted_pre_trunc; /* tuples deleted prior to truncate */ + 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; + PgStat_Counter deleted_pre_truncdrop; int nest_level; /* subtransaction nest level */ /* links to other structs for same relation: */ struct PgStat_TableXactStatus *upper; /* next higher subxact if any */ @@ -199,862 +235,334 @@ typedef struct PgStat_TableXactStatus /* ------------------------------------------------------------ - * Message formats 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 0x01A5BCA7 -/* ---------- - * PgStat_MsgHdr The common message header - * ---------- - */ -typedef struct PgStat_MsgHdr +typedef struct PgStat_ArchiverStats { - 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_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; +typedef struct PgStat_BgWriterStats +{ + PgStat_Counter buf_written_clean; + PgStat_Counter maxwritten_clean; + PgStat_Counter buf_alloc; + TimestampTz stat_reset_timestamp; +} PgStat_BgWriterStats; -/* ---------- - * PgStat_MsgDummy A dummy message, ignored by the collector - * ---------- - */ -typedef struct PgStat_MsgDummy +typedef struct PgStat_CheckpointerStats { - PgStat_MsgHdr m_hdr; -} PgStat_MsgDummy; + 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; +typedef struct PgStat_StatDBEntry +{ + PgStat_Counter n_xact_commit; + PgStat_Counter n_xact_rollback; + PgStat_Counter n_blocks_fetched; + PgStat_Counter n_blocks_hit; + PgStat_Counter n_tuples_returned; + PgStat_Counter n_tuples_fetched; + PgStat_Counter n_tuples_inserted; + PgStat_Counter n_tuples_updated; + PgStat_Counter n_tuples_deleted; + TimestampTz last_autovac_time; + PgStat_Counter n_conflict_tablespace; + PgStat_Counter n_conflict_lock; + PgStat_Counter n_conflict_snapshot; + PgStat_Counter n_conflict_bufferpin; + PgStat_Counter n_conflict_startup_deadlock; + PgStat_Counter n_temp_files; + PgStat_Counter n_temp_bytes; + PgStat_Counter n_deadlocks; + PgStat_Counter n_checksum_failures; + TimestampTz last_checksum_failure; + PgStat_Counter n_block_read_time; /* times in microseconds */ + PgStat_Counter n_block_write_time; + PgStat_Counter n_sessions; + PgStat_Counter total_session_time; + PgStat_Counter total_active_time; + PgStat_Counter total_idle_in_xact_time; + PgStat_Counter n_sessions_abandoned; + PgStat_Counter n_sessions_fatal; + PgStat_Counter n_sessions_killed; -/* ---------- - * 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. - * ---------- - */ + TimestampTz stat_reset_timestamp; +} PgStat_StatDBEntry; -typedef struct PgStat_MsgInquiry +typedef struct PgStat_StatFuncEntry { - 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_Counter f_numcalls; + PgStat_Counter f_total_time; /* times in microseconds */ + PgStat_Counter f_self_time; +} PgStat_StatFuncEntry; -/* ---------- - * PgStat_TableEntry Per-table info in a MsgTabstat - * ---------- - */ -typedef struct PgStat_TableEntry +typedef struct PgStat_StatReplSlotEntry { - Oid t_id; - PgStat_TableCounts t_counts; -} PgStat_TableEntry; + /* + * In PG 15 this field is unused, but not removed, to avoid changing + * PGSTAT_FILE_FORMAT_ID. + */ + NameData slotname_unused; + 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; -/* ---------- - * 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_SLRUStats +{ + PgStat_Counter blocks_zeroed; + PgStat_Counter blocks_hit; + PgStat_Counter blocks_read; + PgStat_Counter blocks_written; + PgStat_Counter blocks_exists; + PgStat_Counter flush; + PgStat_Counter truncate; + TimestampTz stat_reset_timestamp; +} PgStat_SLRUStats; -typedef struct PgStat_MsgTabstat +typedef struct PgStat_StatSubEntry { - 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_Counter apply_error_count; + PgStat_Counter sync_error_count; + TimestampTz stat_reset_timestamp; +} PgStat_StatSubEntry; +typedef struct PgStat_StatTabEntry +{ + PgStat_Counter numscans; -/* ---------- - * 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)) + PgStat_Counter tuples_returned; + PgStat_Counter tuples_fetched; -typedef struct PgStat_MsgTabpurge -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - Oid m_tableid[PGSTAT_NUM_TABPURGE]; -} PgStat_MsgTabpurge; + 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_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_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_MsgResetcounter Sent by the backend to tell the collector - * to reset counters - * ---------- - */ -typedef struct PgStat_MsgResetcounter +typedef struct PgStat_WalStats { - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgResetcounter; + 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; -/* ---------- - * PgStat_MsgResetsharedcounter Sent by the backend to tell the collector - * to reset a shared counter - * ---------- - */ -typedef struct PgStat_MsgResetsharedcounter -{ - PgStat_MsgHdr m_hdr; - PgStat_Shared_Reset_Target m_resettarget; -} PgStat_MsgResetsharedcounter; -/* ---------- - * PgStat_MsgResetsinglecounter Sent by the backend to tell the collector - * to reset a single counter - * ---------- +/* + * Functions in pgstat.c */ -typedef struct PgStat_MsgResetsinglecounter -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - PgStat_Single_Reset_Type 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; +/* functions called from postmaster */ +extern Size StatsShmemSize(void); +extern void StatsShmemInit(void); -/* ---------- - * 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; +/* 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); -/* ---------- - * 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; +/* Functions for backend initialization */ +extern void pgstat_initialize(void); +/* Functions called from backends */ +extern long pgstat_report_stat(bool force); +extern void pgstat_force_next_flush(void); -/* ---------- - * 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; +extern void pgstat_reset_counters(void); +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); +extern TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot); -/* ---------- - * 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_timed_checkpoints; - PgStat_Counter m_requested_checkpoints; - PgStat_Counter m_buf_written_checkpoints; - PgStat_Counter m_buf_written_clean; - PgStat_Counter m_maxwritten_clean; - PgStat_Counter m_buf_written_backend; - PgStat_Counter m_buf_fsync_backend; - PgStat_Counter m_buf_alloc; - PgStat_Counter m_checkpoint_write_time; /* times in milliseconds */ - PgStat_Counter m_checkpoint_sync_time; -} PgStat_MsgBgWriter; - -/* ---------- - * PgStat_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_MsgRecoveryConflict Sent by the backend upon recovery conflict - * ---------- - */ -typedef struct PgStat_MsgRecoveryConflict -{ - PgStat_MsgHdr m_hdr; - - Oid m_databaseid; - int m_reason; -} PgStat_MsgRecoveryConflict; - -/* ---------- - * PgStat_MsgTempFile Sent by the backend upon creating a temp file - * ---------- - */ -typedef struct PgStat_MsgTempFile -{ - PgStat_MsgHdr m_hdr; - - Oid m_databaseid; - size_t m_filesize; -} PgStat_MsgTempFile; - -/* ---------- - * PgStat_FunctionCounts The actual per-function counts kept by a backend - * - * This struct should contain only actual event counters, because we memcmp - * it against zeroes to detect whether there are any counts to transmit. - * - * Note that the time counters are in instr_time format here. We convert to - * microseconds in PgStat_Counter format when transmitting to the collector. - * ---------- - */ -typedef struct PgStat_FunctionCounts -{ - PgStat_Counter f_numcalls; - instr_time f_total_time; - instr_time f_self_time; -} PgStat_FunctionCounts; - -/* ---------- - * PgStat_BackendFunctionEntry Entry in backend's per-function hash table - * ---------- - */ -typedef struct PgStat_BackendFunctionEntry -{ - Oid f_id; - PgStat_FunctionCounts f_counts; -} PgStat_BackendFunctionEntry; - -/* ---------- - * PgStat_FunctionEntry Per-function info in a MsgFuncstat - * ---------- - */ -typedef struct PgStat_FunctionEntry -{ - Oid f_id; - PgStat_Counter f_numcalls; - PgStat_Counter f_total_time; /* times in microseconds */ - PgStat_Counter f_self_time; -} PgStat_FunctionEntry; - -/* ---------- - * PgStat_MsgFuncstat Sent by the backend to report function - * usage statistics. - * ---------- - */ -#define PGSTAT_NUM_FUNCENTRIES \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \ - / sizeof(PgStat_FunctionEntry)) - -typedef struct PgStat_MsgFuncstat -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - PgStat_FunctionEntry m_entry[PGSTAT_NUM_FUNCENTRIES]; -} PgStat_MsgFuncstat; - -/* ---------- - * PgStat_MsgFuncpurge Sent by the backend to tell the collector - * about dead functions. - * ---------- - */ -#define PGSTAT_NUM_FUNCPURGE \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \ - / sizeof(Oid)) - -typedef struct PgStat_MsgFuncpurge -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - int m_nentries; - Oid m_functionid[PGSTAT_NUM_FUNCPURGE]; -} PgStat_MsgFuncpurge; - -/* ---------- - * PgStat_MsgDeadlock Sent by the backend to tell the collector - * about a deadlock that occurred. - * ---------- - */ -typedef struct PgStat_MsgDeadlock -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; -} PgStat_MsgDeadlock; - -/* ---------- - * PgStat_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_MsgAutovacStart msg_autovacuum_start; - PgStat_MsgVacuum msg_vacuum; - PgStat_MsgAnalyze msg_analyze; - PgStat_MsgArchiver msg_archiver; - PgStat_MsgBgWriter msg_bgwriter; - 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_Msg; - - -/* ------------------------------------------------------------ - * Statistic collector data structures follow - * - * PGSTAT_FILE_FORMAT_ID should be changed whenever any of these - * data structures change. - * ------------------------------------------------------------ - */ - -#define PGSTAT_FILE_FORMAT_ID 0x01A5BCA2 - -/* ---------- - * PgStat_StatDBEntry The collector's data per database - * ---------- - */ -typedef struct PgStat_StatDBEntry -{ - Oid databaseid; - PgStat_Counter n_xact_commit; - PgStat_Counter n_xact_rollback; - PgStat_Counter n_blocks_fetched; - PgStat_Counter n_blocks_hit; - PgStat_Counter n_tuples_returned; - PgStat_Counter n_tuples_fetched; - PgStat_Counter n_tuples_inserted; - PgStat_Counter n_tuples_updated; - PgStat_Counter n_tuples_deleted; - TimestampTz last_autovac_time; - PgStat_Counter n_conflict_tablespace; - PgStat_Counter n_conflict_lock; - PgStat_Counter n_conflict_snapshot; - PgStat_Counter n_conflict_bufferpin; - PgStat_Counter n_conflict_startup_deadlock; - PgStat_Counter n_temp_files; - PgStat_Counter n_temp_bytes; - PgStat_Counter n_deadlocks; - PgStat_Counter n_checksum_failures; - TimestampTz last_checksum_failure; - PgStat_Counter n_block_read_time; /* times in microseconds */ - PgStat_Counter n_block_write_time; - PgStat_Counter n_sessions; - PgStat_Counter total_session_time; - PgStat_Counter total_active_time; - PgStat_Counter total_idle_in_xact_time; - PgStat_Counter n_sessions_abandoned; - PgStat_Counter n_sessions_fatal; - 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; - - -/* ---------- - * PgStat_StatTabEntry The collector's data per table (or index) - * ---------- - */ -typedef struct PgStat_StatTabEntry -{ - Oid tableid; - - PgStat_Counter numscans; - - PgStat_Counter tuples_returned; - PgStat_Counter tuples_fetched; - - PgStat_Counter tuples_inserted; - PgStat_Counter tuples_updated; - PgStat_Counter tuples_deleted; - PgStat_Counter tuples_hot_updated; - - PgStat_Counter n_live_tuples; - PgStat_Counter n_dead_tuples; - PgStat_Counter changes_since_analyze; - PgStat_Counter unused_counter; /* kept for ABI compatibility */ - 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; +/* helpers */ +extern PgStat_Kind pgstat_get_kind_from_str(char *kind_str); +extern bool pgstat_have_entry(PgStat_Kind kind, Oid dboid, Oid objoid); +/* GUC hook for stats_fetch_consistency */ +extern void assign_stats_fetch_consistency(int newval, void *extra); /* - * Archiver statistics kept in the stats collector + * Functions in pgstat_archiver.c */ -typedef struct PgStat_ArchiverStats -{ - PgStat_Counter archived_count; /* archival successes */ - char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file - * archived */ - TimestampTz last_archived_timestamp; /* last archival success time */ - PgStat_Counter failed_count; /* failed archival attempts */ - char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in - * last failure */ - TimestampTz last_failed_timestamp; /* last archival failure time */ - TimestampTz stat_reset_timestamp; -} PgStat_ArchiverStats; -/* - * Global statistics kept in the stats collector - */ -typedef struct PgStat_GlobalStats -{ - TimestampTz stats_timestamp; /* time of stats file update */ - PgStat_Counter timed_checkpoints; - PgStat_Counter requested_checkpoints; - PgStat_Counter checkpoint_write_time; /* times in milliseconds */ - PgStat_Counter checkpoint_sync_time; - PgStat_Counter buf_written_checkpoints; - PgStat_Counter buf_written_clean; - PgStat_Counter maxwritten_clean; - PgStat_Counter buf_written_backend; - PgStat_Counter buf_fsync_backend; - PgStat_Counter buf_alloc; - TimestampTz stat_reset_timestamp; -} PgStat_GlobalStats; +extern void pgstat_report_archiver(const char *xlog, bool failed); +extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void); -/* - * WAL statistics kept in the stats collector - */ -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; /* - * SLRU statistics kept in the stats collector + * Functions in pgstat_bgwriter.c */ -typedef struct PgStat_SLRUStats -{ - PgStat_Counter blocks_zeroed; - PgStat_Counter blocks_hit; - PgStat_Counter blocks_read; - PgStat_Counter blocks_written; - PgStat_Counter blocks_exists; - PgStat_Counter flush; - PgStat_Counter truncate; - 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; +extern void pgstat_report_bgwriter(void); +extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void); /* - * Working state needed to accumulate per-function-call timing statistics. + * Functions in pgstat_checkpointer.c */ -typedef struct PgStat_FunctionCallUsage -{ - /* Link to function's hashtable entry (must still be there at exit!) */ - /* NULL means we are not tracking the current function call */ - PgStat_FunctionCounts *fs; - /* Total time previously charged to function, as of function start */ - instr_time save_f_total_time; - /* Backend-wide total time as of function start */ - instr_time save_total; - /* system clock as of function start */ - instr_time f_start; -} PgStat_FunctionCallUsage; - -/* ---------- - * GUC parameters - * ---------- - */ -extern 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; +extern void pgstat_report_checkpointer(void); +extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void); -/* - * BgWriter statistics counters are updated directly by bgwriter and bufmgr - */ -extern PgStat_MsgBgWriter BgWriterStats; /* - * WAL statistics counter is updated by backends and background processes + * Functions in pgstat_database.c */ -extern PgStat_MsgWal WalStats; -/* - * Updated by pgstat_count_buffer_*_time macros - */ -extern PgStat_Counter pgStatBlockReadTime; -extern PgStat_Counter pgStatBlockWriteTime; +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); +extern void pgstat_report_checksum_failure(void); +extern void pgstat_report_connect(Oid dboid); -/* - * Updated by pgstat_count_conn_*_time macros, called by - * pgstat_report_activity(). - */ -extern PgStat_Counter pgStatActiveTime; -extern PgStat_Counter pgStatTransactionIdleTime; +#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_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid); /* - * Updated by the traffic cop and in errfinish() + * Functions in pgstat_function.c */ -extern SessionEndType pgStatSessionEndCause; -/* ---------- - * Functions called from postmaster - * ---------- - */ -extern void pgstat_init(void); -extern int pgstat_start(void); -extern void pgstat_reset_all(void); -extern void allow_immediate_pgstat_restart(void); +extern void pgstat_create_function(Oid proid); +extern void pgstat_drop_function(Oid proid); -#ifdef EXEC_BACKEND -extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn(); -#endif +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_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid); +extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id); -/* ---------- - * Functions called from backends - * ---------- + +/* + * Functions in pgstat_relation.c */ -extern void pgstat_ping(void); -extern void pgstat_report_stat(bool force); -extern void pgstat_vacuum_stat(void); -extern void pgstat_drop_database(Oid databaseid); +extern void pgstat_create_relation(Relation rel); +extern void pgstat_drop_relation(Relation rel); +extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel); -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_init_relation(Relation rel); +extern void pgstat_assoc_relation(Relation rel); +extern void pgstat_unlink_relation(Relation rel); -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); -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_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); +/* + * 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) ? true : \ + ((rel)->pgstat_enabled ? pgstat_assoc_relation(rel), true : false)) /* nontransactional event counts are simple enough to inline */ #define pgstat_count_heap_scan(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_should_count_relation(rel)) \ (rel)->pgstat_info->t_counts.t_numscans++; \ } while (0) #define pgstat_count_heap_getnext(rel) \ do { \ - if ((rel)->pgstat_info != NULL) \ + if (pgstat_should_count_relation(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_should_count_relation(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_should_count_relation(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_should_count_relation(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_should_count_relation(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_should_count_relation(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); @@ -1062,41 +570,35 @@ 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_wal(bool force); +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); -/* ---------- - * 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_ArchiverStats *pgstat_fetch_stat_archiver(void); -extern PgStat_GlobalStats *pgstat_fetch_global(void); -extern PgStat_WalStats *pgstat_fetch_stat_wal(void); -extern PgStat_SLRUStats *pgstat_fetch_slru(void); + +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); + +/* + * Functions in pgstat_slru.c + */ + +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); @@ -1104,7 +606,96 @@ 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); +extern PgStat_SLRUStats *pgstat_fetch_slru(void); + + +/* + * Functions in pgstat_subscription.c + */ + +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); + + +/* + * 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); +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); + + +/* + * Functions in pgstat_wal.c + */ + +extern void pgstat_report_wal(bool force); +extern PgStat_WalStats *pgstat_fetch_stat_wal(void); + + +/* + * Variables in pgstat.c + */ + +/* GUC parameters */ +extern PGDLLIMPORT bool pgstat_track_counts; +extern PGDLLIMPORT int pgstat_track_functions; +extern PGDLLIMPORT int pgstat_fetch_consistency; + + +/* + * Variables in pgstat_bgwriter.c + */ + +/* updated directly by bgwriter and bufmgr */ +extern PGDLLIMPORT PgStat_BgWriterStats PendingBgWriterStats; + + +/* + * Variables in pgstat_checkpointer.c + */ + +/* + * Checkpointer statistics counters are updated directly by checkpointer and + * bufmgr. + */ +extern PGDLLIMPORT PgStat_CheckpointerStats PendingCheckpointerStats; + + +/* + * Variables in pgstat_database.c + */ + +/* Updated by pgstat_count_buffer_*_time macros */ +extern PGDLLIMPORT PgStat_Counter pgStatBlockReadTime; +extern PGDLLIMPORT PgStat_Counter pgStatBlockWriteTime; + +/* + * Updated by pgstat_count_conn_*_time macros, called by + * pgstat_report_activity(). + */ +extern PGDLLIMPORT PgStat_Counter pgStatActiveTime; +extern PGDLLIMPORT PgStat_Counter pgStatTransactionIdleTime; + +/* updated by the traffic cop and in errfinish() */ +extern PGDLLIMPORT SessionEndType pgStatSessionEndCause; + + +/* + * Variables in pgstat_wal.c + */ + +/* updated directly by backends and background processes */ +extern PGDLLIMPORT PgStat_WalStats PendingWalStats; + #endif /* PGSTAT_H */ diff --git a/third_party/spanner_pg/src/include/pgtar.h b/third_party/spanner_pg/src/include/pgtar.h index 6d47ece6..94289f14 100644 --- a/third_party/spanner_pg/src/include/pgtar.h +++ b/third_party/spanner_pg/src/include/pgtar.h @@ -4,7 +4,7 @@ * Functions for manipulating tarfile datastructures (src/port/tar.c) * * - * 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 * * src/include/pgtar.h diff --git a/third_party/spanner_pg/src/include/pgtime.h b/third_party/spanner_pg/src/include/pgtime.h index 64767de8..617159fc 100644 --- a/third_party/spanner_pg/src/include/pgtime.h +++ b/third_party/spanner_pg/src/include/pgtime.h @@ -3,7 +3,7 @@ * pgtime.h * PostgreSQL internal timezone library * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/pgtime.h @@ -22,14 +22,23 @@ 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 + * from 1 and tm_year as relative to 1 BC. Be sure to make the appropriate + * adjustments when moving from one code domain to the other. + */ struct pg_tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; - int tm_mon; /* origin 1, not 0! */ - int tm_year; /* relative to 1900 */ + int tm_mon; /* see above */ + int tm_year; /* see above */ int tm_wday; int tm_yday; int tm_isdst; @@ -37,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; @@ -75,7 +85,7 @@ extern size_t pg_strftime(char *s, size_t max, const char *format, // See pgtz.c for more background. void ClearTimezoneHashtablePointer(); extern __thread PGDLLIMPORT pg_tz *session_timezone; -extern __thread pg_tz *log_timezone; +extern __thread PGDLLIMPORT pg_tz *log_timezone; /* SPANGRES END */ extern void pg_timezone_initialize(void); diff --git a/third_party/spanner_pg/src/include/port.h b/third_party/spanner_pg/src/include/port.h index 676a93d7..9f357612 100644 --- a/third_party/spanner_pg/src/include/port.h +++ b/third_party/spanner_pg/src/include/port.h @@ -3,7 +3,7 @@ * port.h * Header for src/port/ compatibility functions. * - * 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 * * src/include/port.h @@ -14,8 +14,6 @@ #define PG_PORT_H #include -#include -#include /* * Windows has enough specialized port stuff that we push most of it off @@ -37,6 +35,11 @@ typedef SOCKET pgsocket; #define PGINVALID_SOCKET INVALID_SOCKET #endif +/* if platform lacks socklen_t, we assume this will work */ +#ifndef HAVE_SOCKLEN_T +typedef unsigned int socklen_t; +#endif + /* non-blocking */ extern bool pg_set_noblock(pgsocket sock); extern bool pg_set_block(pgsocket sock); @@ -123,7 +126,8 @@ extern void pgfnames_cleanup(char **filenames); case EHOSTUNREACH: \ case ENETDOWN: \ case ENETRESET: \ - case ENETUNREACH + case ENETUNREACH: \ + case ETIMEDOUT /* Portable locale initialization (in exec.c) */ extern void set_pglocale_pgservice(const char *argv0, const char *app); @@ -140,7 +144,7 @@ extern char *pipe_read_line(char *cmd, char *line, int maxsize); #ifdef EXEC_BACKEND /* Disable ASLR before exec, for developer builds only (in exec.c) */ -extern int pg_disable_aslr(void); +extern int pg_disable_aslr(void); #endif @@ -299,6 +303,7 @@ extern bool rmtree(const char *path, bool rmtopdir); * passing of other special options. */ #define O_DIRECT 0x80000000 +extern HANDLE pgwin32_open_handle(const char *, int, bool); extern int pgwin32_open(const char *, int,...); extern FILE *pgwin32_fopen(const char *, const char *); #define open(a,b,c) pgwin32_open(a,b,c) @@ -365,11 +370,6 @@ extern int gettimeofday(struct timeval *tp, struct timezone *tzp); #define pgoff_t off_t #endif -extern double pg_erand48(unsigned short xseed[3]); -extern long pg_lrand48(void); -extern long pg_jrand48(unsigned short xseed[3]); -extern void pg_srand48(long seed); - #ifndef HAVE_FLS extern int fls(int mask); #endif @@ -455,10 +455,6 @@ extern size_t strlcpy(char *dst, const char *src, size_t siz); extern size_t strnlen(const char *str, size_t maxlen); #endif -#if !defined(HAVE_RANDOM) -extern long random(void); -#endif - #ifndef HAVE_SETENV extern int setenv(const char *name, const char *value, int overwrite); #endif @@ -467,10 +463,6 @@ extern int setenv(const char *name, const char *value, int overwrite); extern int unsetenv(const char *name); #endif -#ifndef HAVE_SRANDOM -extern void srandom(unsigned int seed); -#endif - #ifndef HAVE_DLOPEN extern void *dlopen(const char *file, int mode); extern void *dlsym(void *handle, const char *symbol); @@ -494,18 +486,12 @@ extern char *dlerror(void); #define RTLD_GLOBAL 0 #endif -/* thread.h */ +/* thread.c */ #ifndef WIN32 -extern int pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer, - size_t buflen, struct passwd **result); +extern bool pg_get_user_name(uid_t user_id, char *buffer, size_t buflen); +extern bool pg_get_user_home_dir(uid_t user_id, char *buffer, size_t buflen); #endif -extern int pqGethostbyname(const char *name, - struct hostent *resultbuf, - char *buffer, size_t buflen, - struct hostent **result, - int *herrno); - extern void pg_qsort(void *base, size_t nel, size_t elsize, int (*cmp) (const void *, const void *)); extern int pg_qsort_strcmp(const void *a, const void *b); diff --git a/third_party/spanner_pg/src/include/port/atomics.h b/third_party/spanner_pg/src/include/port/atomics.h index 856338f1..9550e04a 100644 --- a/third_party/spanner_pg/src/include/port/atomics.h +++ b/third_party/spanner_pg/src/include/port/atomics.h @@ -28,7 +28,7 @@ * For an introduction to using memory barriers within the PostgreSQL backend, * see src/backend/storage/lmgr/README.barrier * - * 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 * * src/include/port/atomics.h diff --git a/third_party/spanner_pg/src/include/port/atomics/arch-arm.h b/third_party/spanner_pg/src/include/port/atomics/arch-arm.h index efa38532..9fe8f1b9 100644 --- a/third_party/spanner_pg/src/include/port/atomics/arch-arm.h +++ b/third_party/spanner_pg/src/include/port/atomics/arch-arm.h @@ -3,7 +3,7 @@ * arch-arm.h * Atomic operations considerations specific to ARM * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * * NOTES: * @@ -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 */ diff --git a/third_party/spanner_pg/src/include/port/atomics/arch-hppa.h b/third_party/spanner_pg/src/include/port/atomics/arch-hppa.h index 0661c0e5..7a7bb6ea 100644 --- a/third_party/spanner_pg/src/include/port/atomics/arch-hppa.h +++ b/third_party/spanner_pg/src/include/port/atomics/arch-hppa.h @@ -3,7 +3,7 @@ * arch-hppa.h * Atomic operations considerations specific to HPPA * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/arch-ia64.h b/third_party/spanner_pg/src/include/port/atomics/arch-ia64.h index 45f36f2b..771bac1f 100644 --- a/third_party/spanner_pg/src/include/port/atomics/arch-ia64.h +++ b/third_party/spanner_pg/src/include/port/atomics/arch-ia64.h @@ -3,7 +3,7 @@ * arch-ia64.h * Atomic operations considerations specific to intel itanium * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/arch-ppc.h b/third_party/spanner_pg/src/include/port/atomics/arch-ppc.h index 08142963..eb645136 100644 --- a/third_party/spanner_pg/src/include/port/atomics/arch-ppc.h +++ b/third_party/spanner_pg/src/include/port/atomics/arch-ppc.h @@ -3,7 +3,7 @@ * arch-ppc.h * Atomic operations considerations specific to PowerPC * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/arch-x86.h b/third_party/spanner_pg/src/include/port/atomics/arch-x86.h index 2cab5a32..cef1ba72 100644 --- a/third_party/spanner_pg/src/include/port/atomics/arch-x86.h +++ b/third_party/spanner_pg/src/include/port/atomics/arch-x86.h @@ -7,7 +7,7 @@ * support for xadd and cmpxchg. Given that the 386 isn't supported anywhere * anymore that's not much of a restriction luckily. * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/fallback.h b/third_party/spanner_pg/src/include/port/atomics/fallback.h index b344aae9..1cdef5f2 100644 --- a/third_party/spanner_pg/src/include/port/atomics/fallback.h +++ b/third_party/spanner_pg/src/include/port/atomics/fallback.h @@ -4,7 +4,7 @@ * Fallback for platforms without spinlock and/or atomics support. Slower * than native atomics support, but not unusably slow. * - * 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 * * src/include/port/atomics/fallback.h diff --git a/third_party/spanner_pg/src/include/port/atomics/generic-acc.h b/third_party/spanner_pg/src/include/port/atomics/generic-acc.h index 3c75b6a8..842b2dec 100644 --- a/third_party/spanner_pg/src/include/port/atomics/generic-acc.h +++ b/third_party/spanner_pg/src/include/port/atomics/generic-acc.h @@ -3,7 +3,7 @@ * generic-acc.h * Atomic operations support when using HPs acc on HPUX * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/generic-gcc.h b/third_party/spanner_pg/src/include/port/atomics/generic-gcc.h index 99fda188..6c566aff 100644 --- a/third_party/spanner_pg/src/include/port/atomics/generic-gcc.h +++ b/third_party/spanner_pg/src/include/port/atomics/generic-gcc.h @@ -3,7 +3,7 @@ * generic-gcc.h * Atomic operations, implemented using gcc (or compatible) intrinsics. * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/generic-msvc.h b/third_party/spanner_pg/src/include/port/atomics/generic-msvc.h index f535b456..6294162b 100644 --- a/third_party/spanner_pg/src/include/port/atomics/generic-msvc.h +++ b/third_party/spanner_pg/src/include/port/atomics/generic-msvc.h @@ -3,7 +3,7 @@ * generic-msvc.h * Atomic operations support when using MSVC * - * 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 * * NOTES: diff --git a/third_party/spanner_pg/src/include/port/atomics/generic-sunpro.h b/third_party/spanner_pg/src/include/port/atomics/generic-sunpro.h index 7196021e..da1f8f11 100644 --- a/third_party/spanner_pg/src/include/port/atomics/generic-sunpro.h +++ b/third_party/spanner_pg/src/include/port/atomics/generic-sunpro.h @@ -3,7 +3,7 @@ * generic-sunpro.h * Atomic operations for solaris' CC * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * * NOTES: * diff --git a/third_party/spanner_pg/src/include/port/atomics/generic.h b/third_party/spanner_pg/src/include/port/atomics/generic.h index 6d094dc4..d62428ac 100644 --- a/third_party/spanner_pg/src/include/port/atomics/generic.h +++ b/third_party/spanner_pg/src/include/port/atomics/generic.h @@ -4,7 +4,7 @@ * Implement higher level operations based on some lower level atomic * operations. * - * 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 * * src/include/port/atomics/generic.h @@ -83,7 +83,7 @@ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr) static inline bool pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr) { - return pg_atomic_exchange_u32_impl(ptr, &value, 1) == 0; + return pg_atomic_exchange_u32_impl(ptr, 1) == 0; } #define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG diff --git a/third_party/spanner_pg/src/include/port/cygwin.h b/third_party/spanner_pg/src/include/port/cygwin.h index 64d69936..44bf8533 100644 --- a/third_party/spanner_pg/src/include/port/cygwin.h +++ b/third_party/spanner_pg/src/include/port/cygwin.h @@ -1,12 +1,18 @@ /* src/include/port/cygwin.h */ +/* + * Variables declared in the core backend and referenced by loadable + * modules need to be marked "dllimport" in the core build, but + * "dllexport" when the declaration is read in a loadable module. + * No special markings should be used when compiling frontend code. + */ +#ifndef FRONTEND #ifdef BUILDING_DLL #define PGDLLIMPORT __declspec (dllexport) #else #define PGDLLIMPORT __declspec (dllimport) #endif - -#define PGDLLEXPORT +#endif /* * Cygwin has a strtof() which is literally just (float)strtod(), which means diff --git a/third_party/spanner_pg/src/include/port/pg_bitutils.h b/third_party/spanner_pg/src/include/port/pg_bitutils.h index 086bd081..04e58cd1 100644 --- a/third_party/spanner_pg/src/include/port/pg_bitutils.h +++ b/third_party/spanner_pg/src/include/port/pg_bitutils.h @@ -4,7 +4,7 @@ * Miscellaneous functions for bit-wise operations. * * - * Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Copyright (c) 2019-2022, PostgreSQL Global Development Group * * src/include/port/pg_bitutils.h * @@ -13,15 +13,9 @@ #ifndef PG_BITUTILS_H #define PG_BITUTILS_H -#ifndef FRONTEND extern PGDLLIMPORT const uint8 pg_leftmost_one_pos[256]; extern PGDLLIMPORT const uint8 pg_rightmost_one_pos[256]; extern PGDLLIMPORT const uint8 pg_number_of_ones[256]; -#else -extern const uint8 pg_leftmost_one_pos[256]; -extern const uint8 pg_rightmost_one_pos[256]; -extern const uint8 pg_number_of_ones[256]; -#endif /* * pg_leftmost_one_pos32 @@ -253,20 +247,56 @@ pg_ceil_log2_64(uint64 num) return pg_leftmost_one_pos64(num - 1) + 1; } -/* Count the number of one-bits in a uint32 or uint64 */ +/* + * With MSVC on x86_64 builds, try using native popcnt instructions via the + * __popcnt and __popcnt64 intrinsics. These don't work the same as GCC's + * __builtin_popcount* intrinsic functions as they always emit popcnt + * instructions. + */ +#if defined(_MSC_VER) && defined(_M_AMD64) +#define HAVE_X86_64_POPCNTQ +#endif + +/* + * On x86_64, we can use the hardware popcount instruction, but only if + * we can verify that the CPU supports it via the cpuid instruction. + * + * Otherwise, we fall back to a hand-rolled implementation. + */ +#ifdef HAVE_X86_64_POPCNTQ +#if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID) +#define TRY_POPCNT_FAST 1 +#endif +#endif + +#ifdef TRY_POPCNT_FAST +/* Attempt to use the POPCNT instruction, but perform a runtime check first */ extern int (*pg_popcount32) (uint32 word); extern int (*pg_popcount64) (uint64 word); +#else +/* Use a portable implementation -- no need for a function pointer. */ +extern int pg_popcount32(uint32 word); +extern int pg_popcount64(uint64 word); + +#endif /* TRY_POPCNT_FAST */ + /* Count the number of one-bits in a byte array */ 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 */ diff --git a/third_party/spanner_pg/src/include/port/pg_bswap.h b/third_party/spanner_pg/src/include/port/pg_bswap.h index 6dfa7757..4033d2bf 100644 --- a/third_party/spanner_pg/src/include/port/pg_bswap.h +++ b/third_party/spanner_pg/src/include/port/pg_bswap.h @@ -11,7 +11,7 @@ * return the same. Use caution when using these wrapper macros with signed * integers. * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * src/include/port/pg_bswap.h * diff --git a/third_party/spanner_pg/src/include/port/pg_crc32c.h b/third_party/spanner_pg/src/include/port/pg_crc32c.h index f3c4107f..d7668651 100644 --- a/third_party/spanner_pg/src/include/port/pg_crc32c.h +++ b/third_party/spanner_pg/src/include/port/pg_crc32c.h @@ -23,7 +23,7 @@ * EQ_CRC32C(c1, c2) * Check for equality of two CRCs. * - * 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 * * src/include/port/pg_crc32c.h diff --git a/third_party/spanner_pg/src/include/port/pg_iovec.h b/third_party/spanner_pg/src/include/port/pg_iovec.h index 4bb3d441..9d0a84f3 100644 --- a/third_party/spanner_pg/src/include/port/pg_iovec.h +++ b/third_party/spanner_pg/src/include/port/pg_iovec.h @@ -3,7 +3,7 @@ * pg_iovec.h * Header for vectored I/O functions, to use in place of . * - * 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 * * src/include/port/pg_iovec.h diff --git a/third_party/spanner_pg/src/include/port/win32.h b/third_party/spanner_pg/src/include/port/win32.h index d8ae49e2..c6213c77 100644 --- a/third_party/spanner_pg/src/include/port/win32.h +++ b/third_party/spanner_pg/src/include/port/win32.h @@ -45,16 +45,26 @@ * defines for dynamic linking on Win32 platform */ +/* + * Variables declared in the core backend and referenced by loadable + * modules need to be marked "dllimport" in the core build, but + * "dllexport" when the declaration is read in a loadable module. + * No special markings should be used when compiling frontend code. + */ +#ifndef FRONTEND #ifdef BUILDING_DLL #define PGDLLIMPORT __declspec (dllexport) #else #define PGDLLIMPORT __declspec (dllimport) #endif +#endif +/* + * Under MSVC, functions exported by a loadable module must be marked + * "dllexport". Other compilers don't need that. + */ #ifdef _MSC_VER #define PGDLLEXPORT __declspec (dllexport) -#else -#define PGDLLEXPORT #endif /* diff --git a/third_party/spanner_pg/src/include/port/win32_port.h b/third_party/spanner_pg/src/include/port/win32_port.h index 41427a9c..d1e89f36 100644 --- a/third_party/spanner_pg/src/include/port/win32_port.h +++ b/third_party/spanner_pg/src/include/port/win32_port.h @@ -6,7 +6,7 @@ * Note this is read in MinGW as well as native Windows builds, * but not in Cygwin builds. * - * 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 * * src/include/port/win32_port.h @@ -43,6 +43,14 @@ #define _WINSOCKAPI_ #endif +/* + * windows.h includes a lot of other headers, slowing down compilation + * significantly. WIN32_LEAN_AND_MEAN reduces that a bit. It'd be better to + * remove the include of windows.h (as well as indirect inclusions of it) from + * such a central place, but until then... + */ +#define WIN32_LEAN_AND_MEAN + #include #include #include @@ -387,6 +395,8 @@ extern int _pgstat64(const char *name, struct stat *buf); #define ENETUNREACH WSAENETUNREACH #undef ENOTCONN #define ENOTCONN WSAENOTCONN +#undef ETIMEDOUT +#define ETIMEDOUT WSAETIMEDOUT /* * Locale stuff. @@ -445,16 +455,16 @@ 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 -void pgwin32_signal_initialize(void); -HANDLE pgwin32_create_signal_listener(pid_t pid); -void pgwin32_dispatch_queued_signals(void); -void pg_queue_signal(int signum); +extern void pgwin32_signal_initialize(void); +extern HANDLE pgwin32_create_signal_listener(pid_t pid); +extern void pgwin32_dispatch_queued_signals(void); +extern void pg_queue_signal(int signum); /* In src/port/kill.c */ #define kill(pid,sig) pgkill(pid,sig) @@ -471,17 +481,17 @@ extern int pgkill(int pid, int sig); #define recv(s, buf, len, flags) pgwin32_recv(s, buf, len, flags) #define send(s, buf, len, flags) pgwin32_send(s, buf, len, flags) -SOCKET pgwin32_socket(int af, int type, int protocol); -int pgwin32_bind(SOCKET s, struct sockaddr *addr, int addrlen); -int pgwin32_listen(SOCKET s, int backlog); -SOCKET pgwin32_accept(SOCKET s, struct sockaddr *addr, int *addrlen); -int pgwin32_connect(SOCKET s, const struct sockaddr *name, int namelen); -int pgwin32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout); -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 SOCKET pgwin32_socket(int af, int type, int protocol); +extern int pgwin32_bind(SOCKET s, struct sockaddr *addr, int addrlen); +extern int pgwin32_listen(SOCKET s, int backlog); +extern SOCKET pgwin32_accept(SOCKET s, struct sockaddr *addr, int *addrlen); +extern int pgwin32_connect(SOCKET s, const struct sockaddr *name, int namelen); +extern int pgwin32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout); +extern int pgwin32_recv(SOCKET s, char *buf, int len, int flags); +extern int pgwin32_send(SOCKET s, const void *buf, int len, int flags); +extern int pgwin32_waitforsinglesocket(SOCKET s, int what, int timeout); -extern int pgwin32_noblock; +extern PGDLLIMPORT int pgwin32_noblock; #endif /* FRONTEND */ @@ -525,9 +535,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/third_party/spanner_pg/src/include/port/win32ntdll.h b/third_party/spanner_pg/src/include/port/win32ntdll.h new file mode 100644 index 00000000..291b067e --- /dev/null +++ b/third_party/spanner_pg/src/include/port/win32ntdll.h @@ -0,0 +1,32 @@ +/*------------------------------------------------------------------------- + * + * win32ntdll.h + * Dynamically loaded Windows NT functions. + * + * Portions Copyright (c) 2021-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/port/win32ntdll.h + * + *------------------------------------------------------------------------- + */ + +#ifndef WIN32NTDLL_H +#define WIN32NTDLL_H + +/* + * Because this includes NT headers that normally conflict with Win32 headers, + * any translation unit that includes it should #define UMDF_USING_NTSTATUS + * before including . + */ + +#include +#include + +typedef NTSTATUS (__stdcall * RtlGetLastNtStatus_t) (void); + +extern PGDLLIMPORT RtlGetLastNtStatus_t pg_RtlGetLastNtStatus; + +extern int initialize_ntdll(void); + +#endif /* WIN32NTDLL_H */ diff --git a/third_party/spanner_pg/src/include/portability/instr_time.h b/third_party/spanner_pg/src/include/portability/instr_time.h index 39a4f060..ca09a160 100644 --- a/third_party/spanner_pg/src/include/portability/instr_time.h +++ b/third_party/spanner_pg/src/include/portability/instr_time.h @@ -46,7 +46,7 @@ * Beware of multiple evaluations of the macro arguments. * * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * src/include/portability/instr_time.h * diff --git a/third_party/spanner_pg/src/include/portability/mem.h b/third_party/spanner_pg/src/include/portability/mem.h index 566d21fb..b553b401 100644 --- a/third_party/spanner_pg/src/include/portability/mem.h +++ b/third_party/spanner_pg/src/include/portability/mem.h @@ -3,7 +3,7 @@ * mem.h * portability definitions for various memory operations * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * src/include/portability/mem.h * diff --git a/third_party/spanner_pg/src/include/postgres.h b/third_party/spanner_pg/src/include/postgres.h index 0446daa0..31358110 100644 --- a/third_party/spanner_pg/src/include/postgres.h +++ b/third_party/spanner_pg/src/include/postgres.h @@ -7,7 +7,7 @@ * Client-side code should include postgres_fe.h instead. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/include/postgres.h diff --git a/third_party/spanner_pg/src/include/postgres_fe.h b/third_party/spanner_pg/src/include/postgres_fe.h index 3cdb911f..ece853c0 100644 --- a/third_party/spanner_pg/src/include/postgres_fe.h +++ b/third_party/spanner_pg/src/include/postgres_fe.h @@ -8,7 +8,7 @@ * postgres.h. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/include/postgres_fe.h diff --git a/third_party/spanner_pg/src/include/postmaster/autovacuum.h b/third_party/spanner_pg/src/include/postmaster/autovacuum.h index aacdd0f5..9d40fd6d 100644 --- a/third_party/spanner_pg/src/include/postmaster/autovacuum.h +++ b/third_party/spanner_pg/src/include/postmaster/autovacuum.h @@ -4,7 +4,7 @@ * header file for integrated autovacuum daemon * * - * 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 * * 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/third_party/spanner_pg/src/include/postmaster/auxprocess.h b/third_party/spanner_pg/src/include/postmaster/auxprocess.h new file mode 100644 index 00000000..e3789fb8 --- /dev/null +++ b/third_party/spanner_pg/src/include/postmaster/auxprocess.h @@ -0,0 +1,20 @@ +/*------------------------------------------------------------------------- + * auxprocess.h + * include file for functions related to auxiliary processes. + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/postmaster/auxprocess.h + *------------------------------------------------------------------------- + */ +#ifndef AUXPROCESS_H +#define AUXPROCESS_H + +#include "miscadmin.h" + +extern void AuxiliaryProcessMain(AuxProcType auxtype) pg_attribute_noreturn(); + +#endif /* AUXPROCESS_H */ diff --git a/third_party/spanner_pg/src/include/postmaster/bgworker.h b/third_party/spanner_pg/src/include/postmaster/bgworker.h index 8e9ef7c7..96975bdc 100644 --- a/third_party/spanner_pg/src/include/postmaster/bgworker.h +++ b/third_party/spanner_pg/src/include/postmaster/bgworker.h @@ -31,7 +31,7 @@ * different) code. * * - * 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 * * IDENTIFICATION @@ -48,6 +48,7 @@ /* * Pass this flag to have your worker be able to connect to shared memory. + * This flag is required. */ #define BGWORKER_SHMEM_ACCESS 0x0001 diff --git a/third_party/spanner_pg/src/include/postmaster/bgworker_internals.h b/third_party/spanner_pg/src/include/postmaster/bgworker_internals.h index fc770631..38768354 100644 --- a/third_party/spanner_pg/src/include/postmaster/bgworker_internals.h +++ b/third_party/spanner_pg/src/include/postmaster/bgworker_internals.h @@ -2,7 +2,7 @@ * bgworker_internals.h * POSTGRES pluggable background workers internals * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/include/postmaster/bgwriter.h b/third_party/spanner_pg/src/include/postmaster/bgwriter.h index c430b1b2..2511ef45 100644 --- a/third_party/spanner_pg/src/include/postmaster/bgwriter.h +++ b/third_party/spanner_pg/src/include/postmaster/bgwriter.h @@ -6,7 +6,7 @@ * The bgwriter process used to handle checkpointing duties too. Now * there is a separate process, but we did not bother to split this header. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/postmaster/fork_process.h b/third_party/spanner_pg/src/include/postmaster/fork_process.h index 64e03733..5fc8490e 100644 --- a/third_party/spanner_pg/src/include/postmaster/fork_process.h +++ b/third_party/spanner_pg/src/include/postmaster/fork_process.h @@ -3,7 +3,7 @@ * fork_process.h * Exports from postmaster/fork_process.c. * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/postmaster/fork_process.h * diff --git a/third_party/spanner_pg/src/include/postmaster/interrupt.h b/third_party/spanner_pg/src/include/postmaster/interrupt.h index 85a1293e..289e0457 100644 --- a/third_party/spanner_pg/src/include/postmaster/interrupt.h +++ b/third_party/spanner_pg/src/include/postmaster/interrupt.h @@ -7,7 +7,7 @@ * have their own implementations, but we provide a few generic things * here to facilitate code reuse. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/postmaster/pgarch.h b/third_party/spanner_pg/src/include/postmaster/pgarch.h index 1e47a143..f366a159 100644 --- a/third_party/spanner_pg/src/include/postmaster/pgarch.h +++ b/third_party/spanner_pg/src/include/postmaster/pgarch.h @@ -3,7 +3,7 @@ * pgarch.h * Exports from postmaster/pgarch.c. * - * 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 * * src/include/postmaster/pgarch.h @@ -31,5 +31,43 @@ extern void PgArchShmemInit(void); extern bool PgArchCanRestart(void); extern void PgArchiverMain(void) pg_attribute_noreturn(); extern void PgArchWakeup(void); +extern void PgArchForceDirScan(void); + +/* + * The value of the archive_library GUC. + */ +extern PGDLLIMPORT char *XLogArchiveLibrary; + +/* + * Archive module callbacks + * + * These callback functions should be defined by archive libraries and returned + * via _PG_archive_module_init(). ArchiveFileCB is the only required callback. + * For more information about the purpose of each callback, refer to the + * archive modules documentation. + */ +typedef bool (*ArchiveCheckConfiguredCB) (void); +typedef bool (*ArchiveFileCB) (const char *file, const char *path); +typedef void (*ArchiveShutdownCB) (void); + +typedef struct ArchiveModuleCallbacks +{ + ArchiveCheckConfiguredCB check_configured_cb; + ArchiveFileCB archive_file_cb; + ArchiveShutdownCB shutdown_cb; +} 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); + +/* + * 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); #endif /* _PGARCH_H */ diff --git a/third_party/spanner_pg/src/include/postmaster/postmaster.h b/third_party/spanner_pg/src/include/postmaster/postmaster.h index 0efdd7c2..90e333cc 100644 --- a/third_party/spanner_pg/src/include/postmaster/postmaster.h +++ b/third_party/spanner_pg/src/include/postmaster/postmaster.h @@ -3,7 +3,7 @@ * postmaster.h * Exports from postmaster/postmaster.c. * - * 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 * * 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/third_party/spanner_pg/src/include/postmaster/startup.h b/third_party/spanner_pg/src/include/postmaster/startup.h index bf6adf1d..12897531 100644 --- a/third_party/spanner_pg/src/include/postmaster/startup.h +++ b/third_party/spanner_pg/src/include/postmaster/startup.h @@ -3,7 +3,7 @@ * startup.h * Exports from postmaster/startup.c. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/postmaster/startup.h * @@ -12,6 +12,19 @@ #ifndef _STARTUP_H #define _STARTUP_H +/* + * Log the startup progress message if a timer has expired. + */ +#define ereport_startup_progress(msg, ...) \ + do { \ + long secs; \ + int usecs; \ + if (has_startup_progress_timeout_expired(&secs, &usecs)) \ + ereport(LOG, errmsg(msg, secs, (usecs / 10000), __VA_ARGS__ )); \ + } while(0) + +extern PGDLLIMPORT int log_startup_progress_interval; + extern void HandleStartupProcInterrupts(void); extern void StartupProcessMain(void) pg_attribute_noreturn(); extern void PreRestoreCommand(void); @@ -19,4 +32,10 @@ extern void PostRestoreCommand(void); extern bool IsPromoteSignaled(void); extern void ResetPromoteSignaled(void); +extern void enable_startup_progress_timeout(void); +extern void disable_startup_progress_timeout(void); +extern void begin_startup_progress_phase(void); +extern void startup_progress_timeout_handler(void); +extern bool has_startup_progress_timeout_expired(long *secs, int *usecs); + #endif /* _STARTUP_H */ diff --git a/third_party/spanner_pg/src/include/postmaster/syslogger.h b/third_party/spanner_pg/src/include/postmaster/syslogger.h index 1491eecb..6436724f 100644 --- a/third_party/spanner_pg/src/include/postmaster/syslogger.h +++ b/third_party/spanner_pg/src/include/postmaster/syslogger.h @@ -3,7 +3,7 @@ * syslogger.h * Exports from postmaster/syslogger.c. * - * Copyright (c) 2004-2021, PostgreSQL Global Development Group + * Copyright (c) 2004-2022, PostgreSQL Global Development Group * * src/include/postmaster/syslogger.h * @@ -46,8 +46,7 @@ typedef struct char nuls[2]; /* always \0\0 */ uint16 len; /* size of this chunk (counts data only) */ int32 pid; /* writer's pid */ - char is_last; /* last chunk of message? 't' or 'f' ('T' or - * 'F' for CSV case) */ + bits8 flags; /* bitmask of PIPE_PROTO_* */ char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */ } PipeProtoHeader; @@ -60,20 +59,26 @@ typedef union #define PIPE_HEADER_SIZE offsetof(PipeProtoHeader, data) #define PIPE_MAX_PAYLOAD ((int) (PIPE_CHUNK_SIZE - PIPE_HEADER_SIZE)) +/* flag bits for PipeProtoHeader->flags */ +#define PIPE_PROTO_IS_LAST 0x01 /* last chunk of message? */ +/* log destinations */ +#define PIPE_PROTO_DEST_STDERR 0x10 +#define PIPE_PROTO_DEST_CSVLOG 0x20 +#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/third_party/spanner_pg/src/include/postmaster/walwriter.h b/third_party/spanner_pg/src/include/postmaster/walwriter.h index 3ccc3323..ddc94365 100644 --- a/third_party/spanner_pg/src/include/postmaster/walwriter.h +++ b/third_party/spanner_pg/src/include/postmaster/walwriter.h @@ -3,7 +3,7 @@ * walwriter.h * Exports from postmaster/walwriter.c. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/regex/regex.h b/third_party/spanner_pg/src/include/regex/regex.h index e2b29b10..a4a541d9 100644 --- a/third_party/spanner_pg/src/include/regex/regex.h +++ b/third_party/spanner_pg/src/include/regex/regex.h @@ -106,7 +106,7 @@ typedef struct #define REG_QUOTE 000004 /* no special characters, none */ #define REG_NOSPEC REG_QUOTE /* historical synonym */ #define REG_ICASE 000010 /* ignore case */ -#define REG_NOSUB 000020 /* don't care about subexpressions */ +#define REG_NOSUB 000020 /* caller doesn't need subexpr match data */ #define REG_EXPANDED 000040 /* expanded format, white space & comments */ #define REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ #define REG_NLANCH 000200 /* ^ matches after \n, $ before */ diff --git a/third_party/spanner_pg/src/include/regex/regexport.h b/third_party/spanner_pg/src/include/regex/regexport.h index 99c4fb85..4ac10647 100644 --- a/third_party/spanner_pg/src/include/regex/regexport.h +++ b/third_party/spanner_pg/src/include/regex/regexport.h @@ -17,7 +17,7 @@ * line and start/end of string. Colors are numbered 0..C-1, but note that * color 0 is "white" (all unused characters) and can generally be ignored. * - * Portions Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/regex/regguts.h b/third_party/spanner_pg/src/include/regex/regguts.h index a833de80..1c78f1ef 100644 --- a/third_party/spanner_pg/src/include/regex/regguts.h +++ b/third_party/spanner_pg/src/include/regex/regguts.h @@ -477,13 +477,14 @@ struct subre #define MIXED 04 /* mixed preference below */ #define CAP 010 /* capturing parens here or below */ #define BACKR 020 /* back reference here or below */ +#define BRUSE 040 /* is referenced by a back reference */ #define INUSE 0100 /* in use in final tree */ -#define NOPROP 03 /* bits which may not propagate up */ +#define UPPROP (MIXED|CAP|BACKR) /* flags which should propagate up */ #define LMIX(f) ((f)<<2) /* LONGER -> MIXED */ #define SMIX(f) ((f)<<1) /* SHORTER -> MIXED */ -#define UP(f) (((f)&~NOPROP) | (LMIX(f) & SMIX(f) & MIXED)) +#define UP(f) (((f)&UPPROP) | (LMIX(f) & SMIX(f) & MIXED)) #define MESSY(f) ((f)&(MIXED|CAP|BACKR)) -#define PREF(f) ((f)&NOPROP) +#define PREF(f) ((f)&(LONGER|SHORTER)) #define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2)) #define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2)) char latype; /* LATYPE code, if lookaround constraint */ diff --git a/third_party/spanner_pg/src/include/replication/decode.h b/third_party/spanner_pg/src/include/replication/decode.h index 69918080..741bf65c 100644 --- a/third_party/spanner_pg/src/include/replication/decode.h +++ b/third_party/spanner_pg/src/include/replication/decode.h @@ -2,7 +2,7 @@ * decode.h * PostgreSQL WAL to logical transformation * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -14,7 +14,21 @@ #include "replication/logical.h" #include "replication/reorderbuffer.h" -void LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, +typedef struct XLogRecordBuffer +{ + XLogRecPtr origptr; + XLogRecPtr endptr; + XLogReaderState *record; +} XLogRecordBuffer; + +extern void xlog_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); +extern void heap_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); +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 LogicalDecodingProcessRecord(LogicalDecodingContext *ctx, XLogReaderState *record); #endif diff --git a/third_party/spanner_pg/src/include/replication/logical.h b/third_party/spanner_pg/src/include/replication/logical.h index 25490f22..edadacd5 100644 --- a/third_party/spanner_pg/src/include/replication/logical.h +++ b/third_party/spanner_pg/src/include/replication/logical.h @@ -2,7 +2,7 @@ * logical.h * PostgreSQL logical decoding coordination * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -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 @@ -49,9 +50,6 @@ typedef struct LogicalDecodingContext */ bool fast_forward; - /* Are we processing the end LSN of a transaction? */ - bool end_xact; - OutputPluginCallbacks callbacks; OutputPluginOptions options; @@ -92,6 +90,16 @@ typedef struct LogicalDecodingContext */ bool twophase; + /* + * Is two-phase option given by output plugin? + * + * This flag indicates that the plugin passed in the two-phase option as + * part of the START_STREAMING command. We can't rely solely on the + * twophase flag which only tells whether the plugin provided all the + * necessary two-phase callbacks. + */ + bool twophase_opt_given; + /* * State for writing output. */ @@ -99,6 +107,8 @@ typedef struct LogicalDecodingContext bool prepared_write; XLogRecPtr write_location; TransactionId write_xid; + /* Are we processing the end LSN of a transaction? */ + bool end_xact; } LogicalDecodingContext; diff --git a/third_party/spanner_pg/src/include/replication/logicallauncher.h b/third_party/spanner_pg/src/include/replication/logicallauncher.h index 301e494f..f1e2821e 100644 --- a/third_party/spanner_pg/src/include/replication/logicallauncher.h +++ b/third_party/spanner_pg/src/include/replication/logicallauncher.h @@ -3,7 +3,7 @@ * logicallauncher.h * Exports for logical replication launcher. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/replication/logicalproto.h b/third_party/spanner_pg/src/include/replication/logicalproto.h index 55b90c03..8cdc04a6 100644 --- a/third_party/spanner_pg/src/include/replication/logicalproto.h +++ b/third_party/spanner_pg/src/include/replication/logicalproto.h @@ -3,7 +3,7 @@ * logicalproto.h * logical replication protocol * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/replication/logicalproto.h @@ -13,6 +13,8 @@ #ifndef LOGICAL_PROTO_H #define LOGICAL_PROTO_H +#include "access/xact.h" +#include "executor/tuptable.h" #include "replication/reorderbuffer.h" #include "utils/rel.h" @@ -26,12 +28,16 @@ * connect time. * * LOGICALREP_PROTO_STREAM_VERSION_NUM is the minimum protocol version with - * support for streaming large transactions. + * support for streaming large transactions. Introduced in PG14. + * + * LOGICALREP_PROTO_TWOPHASE_VERSION_NUM is the minimum protocol version with + * support for two-phase commit decoding (at prepare time). Introduced in PG15. */ #define LOGICALREP_PROTO_MIN_VERSION_NUM 1 #define LOGICALREP_PROTO_VERSION_NUM 1 #define LOGICALREP_PROTO_STREAM_VERSION_NUM 2 -#define LOGICALREP_PROTO_MAX_VERSION_NUM LOGICALREP_PROTO_STREAM_VERSION_NUM +#define LOGICALREP_PROTO_TWOPHASE_VERSION_NUM 3 +#define LOGICALREP_PROTO_MAX_VERSION_NUM LOGICALREP_PROTO_TWOPHASE_VERSION_NUM /* * Logical message types @@ -55,10 +61,15 @@ typedef enum LogicalRepMsgType LOGICAL_REP_MSG_RELATION = 'R', LOGICAL_REP_MSG_TYPE = 'Y', LOGICAL_REP_MSG_MESSAGE = 'M', + LOGICAL_REP_MSG_BEGIN_PREPARE = 'b', + LOGICAL_REP_MSG_PREPARE = 'P', + LOGICAL_REP_MSG_COMMIT_PREPARED = 'K', + LOGICAL_REP_MSG_ROLLBACK_PREPARED = 'r', LOGICAL_REP_MSG_STREAM_START = 'S', - LOGICAL_REP_MSG_STREAM_END = 'E', + LOGICAL_REP_MSG_STREAM_STOP = 'E', LOGICAL_REP_MSG_STREAM_COMMIT = 'c', - LOGICAL_REP_MSG_STREAM_ABORT = 'A' + LOGICAL_REP_MSG_STREAM_ABORT = 'A', + LOGICAL_REP_MSG_STREAM_PREPARE = 'p' } LogicalRepMsgType; /* @@ -122,6 +133,48 @@ typedef struct LogicalRepCommitData TimestampTz committime; } LogicalRepCommitData; +/* + * Prepared transaction protocol information for begin_prepare, and prepare. + */ +typedef struct LogicalRepPreparedTxnData +{ + XLogRecPtr prepare_lsn; + XLogRecPtr end_lsn; + TimestampTz prepare_time; + TransactionId xid; + char gid[GIDSIZE]; +} LogicalRepPreparedTxnData; + +/* + * Prepared transaction protocol information for commit prepared. + */ +typedef struct LogicalRepCommitPreparedTxnData +{ + XLogRecPtr commit_lsn; + XLogRecPtr end_lsn; + TimestampTz commit_time; + TransactionId xid; + char gid[GIDSIZE]; +} LogicalRepCommitPreparedTxnData; + +/* + * Rollback Prepared transaction protocol information. The prepare information + * prepare_end_lsn and prepare_time are used to check if the downstream has + * received this prepared transaction in which case it can apply the rollback, + * otherwise, it can skip the rollback operation. The gid alone is not + * sufficient because the downstream node can have a prepared transaction with + * same identifier. + */ +typedef struct LogicalRepRollbackPreparedTxnData +{ + XLogRecPtr prepare_end_lsn; + XLogRecPtr rollback_end_lsn; + TimestampTz prepare_time; + TimestampTz rollback_time; + TransactionId xid; + char gid[GIDSIZE]; +} LogicalRepRollbackPreparedTxnData; + extern void logicalrep_write_begin(StringInfo out, ReorderBufferTXN *txn); extern void logicalrep_read_begin(StringInfo in, LogicalRepBeginData *begin_data); @@ -129,22 +182,45 @@ extern void logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn, XLogRecPtr commit_lsn); extern void logicalrep_read_commit(StringInfo in, LogicalRepCommitData *commit_data); +extern void logicalrep_write_begin_prepare(StringInfo out, ReorderBufferTXN *txn); +extern void logicalrep_read_begin_prepare(StringInfo in, + LogicalRepPreparedTxnData *begin_data); +extern void logicalrep_write_prepare(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn); +extern void logicalrep_read_prepare(StringInfo in, + LogicalRepPreparedTxnData *prepare_data); +extern void logicalrep_write_commit_prepared(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr commit_lsn); +extern void logicalrep_read_commit_prepared(StringInfo in, + LogicalRepCommitPreparedTxnData *prepare_data); +extern void logicalrep_write_rollback_prepared(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr prepare_end_lsn, + TimestampTz prepare_time); +extern void logicalrep_read_rollback_prepared(StringInfo in, + LogicalRepRollbackPreparedTxnData *rollback_data); +extern void logicalrep_write_stream_prepare(StringInfo out, ReorderBufferTXN *txn, + XLogRecPtr prepare_lsn); +extern void logicalrep_read_stream_prepare(StringInfo in, + LogicalRepPreparedTxnData *prepare_data); + 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, - bool binary); + Relation rel, + TupleTableSlot *newslot, + bool binary, Bitmapset *columns); 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, Bitmapset *columns); 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, - bool binary); + Relation rel, TupleTableSlot *oldtuple, + bool binary, Bitmapset *columns); extern LogicalRepRelId logicalrep_read_delete(StringInfo in, LogicalRepTupleData *oldtup); extern void logicalrep_write_truncate(StringInfo out, TransactionId xid, @@ -155,7 +231,7 @@ extern List *logicalrep_read_truncate(StringInfo in, 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_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); @@ -173,5 +249,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid, TransactionId subxid); extern void logicalrep_read_stream_abort(StringInfo in, TransactionId *xid, TransactionId *subxid); +extern const char *logicalrep_message_type(LogicalRepMsgType action); #endif /* LOGICAL_PROTO_H */ diff --git a/third_party/spanner_pg/src/include/replication/logicalrelation.h b/third_party/spanner_pg/src/include/replication/logicalrelation.h index 10f91490..78cd7e77 100644 --- a/third_party/spanner_pg/src/include/replication/logicalrelation.h +++ b/third_party/spanner_pg/src/include/replication/logicalrelation.h @@ -3,7 +3,7 @@ * logicalrelation.h * Relation definitions for logical replication relation mapping. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/replication/logicalrelation.h * diff --git a/third_party/spanner_pg/src/include/replication/logicalworker.h b/third_party/spanner_pg/src/include/replication/logicalworker.h index 2ad61a00..cd1b6e8a 100644 --- a/third_party/spanner_pg/src/include/replication/logicalworker.h +++ b/third_party/spanner_pg/src/include/replication/logicalworker.h @@ -3,7 +3,7 @@ * logicalworker.h * Exports for logical replication workers. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/replication/logicalworker.h * diff --git a/third_party/spanner_pg/src/include/replication/message.h b/third_party/spanner_pg/src/include/replication/message.h index d3fb324c..0b396c56 100644 --- a/third_party/spanner_pg/src/include/replication/message.h +++ b/third_party/spanner_pg/src/include/replication/message.h @@ -2,7 +2,7 @@ * message.h * Exports from replication/logical/message.c * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * src/include/replication/message.h *------------------------------------------------------------------------- @@ -32,10 +32,10 @@ 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); -const char *logicalmsg_identify(uint8 info); +extern void logicalmsg_redo(XLogReaderState *record); +extern void logicalmsg_desc(StringInfo buf, XLogReaderState *record); +extern const char *logicalmsg_identify(uint8 info); #endif /* PG_LOGICAL_MESSAGE_H */ diff --git a/third_party/spanner_pg/src/include/replication/origin.h b/third_party/spanner_pg/src/include/replication/origin.h index cd0b3e19..2d1b5e5c 100644 --- a/third_party/spanner_pg/src/include/replication/origin.h +++ b/third_party/spanner_pg/src/include/replication/origin.h @@ -2,7 +2,7 @@ * origin.h * Exports from replication/logical/origin.c * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * src/include/replication/origin.h *------------------------------------------------------------------------- @@ -62,9 +62,9 @@ extern void CheckPointReplicationOrigin(void); extern void StartupReplicationOrigin(void); /* WAL logging */ -void replorigin_redo(XLogReaderState *record); -void replorigin_desc(StringInfo buf, XLogReaderState *record); -const char *replorigin_identify(uint8 info); +extern void replorigin_redo(XLogReaderState *record); +extern void replorigin_desc(StringInfo buf, XLogReaderState *record); +extern const char *replorigin_identify(uint8 info); /* shared memory allocation */ extern Size ReplicationOriginShmemSize(void); diff --git a/third_party/spanner_pg/src/include/replication/output_plugin.h b/third_party/spanner_pg/src/include/replication/output_plugin.h index 810495ed..539dc8e6 100644 --- a/third_party/spanner_pg/src/include/replication/output_plugin.h +++ b/third_party/spanner_pg/src/include/replication/output_plugin.h @@ -2,7 +2,7 @@ * output_plugin.h * PostgreSQL Logical Decode Plugin Interface * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -243,6 +243,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/third_party/spanner_pg/src/include/replication/pgoutput.h b/third_party/spanner_pg/src/include/replication/pgoutput.h index 51e7c034..eafedd61 100644 --- a/third_party/spanner_pg/src/include/replication/pgoutput.h +++ b/third_party/spanner_pg/src/include/replication/pgoutput.h @@ -3,10 +3,10 @@ * pgoutput.h * Logical Replication output plugin * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION - * pgoutput.h + * 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; @@ -27,6 +28,7 @@ typedef struct PGOutputData bool binary; bool streaming; bool messages; + bool two_phase; } PGOutputData; #endif /* PGOUTPUT_H */ diff --git a/third_party/spanner_pg/src/include/replication/reorderbuffer.h b/third_party/spanner_pg/src/include/replication/reorderbuffer.h index ba257d81..4a01f877 100644 --- a/third_party/spanner_pg/src/include/replication/reorderbuffer.h +++ b/third_party/spanner_pg/src/include/replication/reorderbuffer.h @@ -2,7 +2,7 @@ * reorderbuffer.h * PostgreSQL logical replay/reorder buffer management. * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * 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, @@ -65,7 +65,7 @@ enum ReorderBufferChangeType REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM, REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT, REORDER_BUFFER_CHANGE_TRUNCATE -}; +} ReorderBufferChangeType; /* forward declaration */ struct ReorderBufferTXN; @@ -82,7 +82,7 @@ typedef struct ReorderBufferChange XLogRecPtr lsn; /* The type of change. */ - enum ReorderBufferChangeType action; + ReorderBufferChangeType action; /* Transaction this change belongs to. */ struct ReorderBufferTXN *txn; @@ -297,7 +297,11 @@ typedef struct ReorderBufferTXN * Commit or Prepare time, only known when we read the actual commit or * prepare record. */ - TimestampTz commit_time; + union + { + TimestampTz commit_time; + TimestampTz prepare_time; + } xact_time; /* * The base snapshot is used to decode all changes until either this @@ -614,68 +618,68 @@ struct ReorderBuffer }; -ReorderBuffer *ReorderBufferAllocate(void); -void ReorderBufferFree(ReorderBuffer *); +extern ReorderBuffer *ReorderBufferAllocate(void); +extern void ReorderBufferFree(ReorderBuffer *); -ReorderBufferTupleBuf *ReorderBufferGetTupleBuf(ReorderBuffer *, Size tuple_len); -void ReorderBufferReturnTupleBuf(ReorderBuffer *, ReorderBufferTupleBuf *tuple); -ReorderBufferChange *ReorderBufferGetChange(ReorderBuffer *); -void ReorderBufferReturnChange(ReorderBuffer *, ReorderBufferChange *, bool); +extern ReorderBufferTupleBuf *ReorderBufferGetTupleBuf(ReorderBuffer *, Size tuple_len); +extern void ReorderBufferReturnTupleBuf(ReorderBuffer *, ReorderBufferTupleBuf *tuple); +extern ReorderBufferChange *ReorderBufferGetChange(ReorderBuffer *); +extern void ReorderBufferReturnChange(ReorderBuffer *, ReorderBufferChange *, bool); -Oid *ReorderBufferGetRelids(ReorderBuffer *, int nrelids); -void ReorderBufferReturnRelids(ReorderBuffer *, Oid *relids); +extern Oid *ReorderBufferGetRelids(ReorderBuffer *, int nrelids); +extern void ReorderBufferReturnRelids(ReorderBuffer *, Oid *relids); -void ReorderBufferQueueChange(ReorderBuffer *, TransactionId, +extern void ReorderBufferQueueChange(ReorderBuffer *, TransactionId, XLogRecPtr lsn, ReorderBufferChange *, bool toast_insert); -void ReorderBufferQueueMessage(ReorderBuffer *, TransactionId, Snapshot snapshot, XLogRecPtr lsn, +extern void ReorderBufferQueueMessage(ReorderBuffer *, TransactionId, Snapshot snapshot, XLogRecPtr lsn, bool transactional, const char *prefix, Size message_size, const char *message); -void ReorderBufferCommit(ReorderBuffer *, TransactionId, +extern void ReorderBufferCommit(ReorderBuffer *, TransactionId, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn); -void ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, +extern void ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, XLogRecPtr commit_lsn, XLogRecPtr end_lsn, - XLogRecPtr initial_consistent_point, + XLogRecPtr two_phase_at, TimestampTz commit_time, RepOriginId origin_id, XLogRecPtr origin_lsn, char *gid, bool is_commit); -void ReorderBufferAssignChild(ReorderBuffer *, TransactionId, TransactionId, XLogRecPtr commit_lsn); -void ReorderBufferCommitChild(ReorderBuffer *, TransactionId, TransactionId, +extern void ReorderBufferAssignChild(ReorderBuffer *, TransactionId, TransactionId, XLogRecPtr commit_lsn); +extern void ReorderBufferCommitChild(ReorderBuffer *, TransactionId, TransactionId, XLogRecPtr commit_lsn, XLogRecPtr end_lsn); -void ReorderBufferAbort(ReorderBuffer *, TransactionId, XLogRecPtr lsn); -void ReorderBufferAbortOld(ReorderBuffer *, TransactionId xid); -void ReorderBufferForget(ReorderBuffer *, TransactionId, XLogRecPtr lsn); -void ReorderBufferInvalidate(ReorderBuffer *, TransactionId, XLogRecPtr lsn); - -void ReorderBufferSetBaseSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); -void ReorderBufferAddSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); -void ReorderBufferAddNewCommandId(ReorderBuffer *, TransactionId, XLogRecPtr lsn, +extern void ReorderBufferAbort(ReorderBuffer *, TransactionId, XLogRecPtr lsn); +extern void ReorderBufferAbortOld(ReorderBuffer *, TransactionId xid); +extern void ReorderBufferForget(ReorderBuffer *, TransactionId, XLogRecPtr lsn); +extern void ReorderBufferInvalidate(ReorderBuffer *, TransactionId, XLogRecPtr lsn); + +extern void ReorderBufferSetBaseSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); +extern void ReorderBufferAddSnapshot(ReorderBuffer *, TransactionId, XLogRecPtr lsn, struct SnapshotData *snap); +extern void ReorderBufferAddNewCommandId(ReorderBuffer *, TransactionId, XLogRecPtr lsn, CommandId cid); -void ReorderBufferAddNewTupleCids(ReorderBuffer *, TransactionId, XLogRecPtr lsn, +extern void ReorderBufferAddNewTupleCids(ReorderBuffer *, TransactionId, XLogRecPtr lsn, RelFileNode node, ItemPointerData pt, CommandId cmin, CommandId cmax, CommandId combocid); -void ReorderBufferAddInvalidations(ReorderBuffer *, TransactionId, XLogRecPtr lsn, +extern void ReorderBufferAddInvalidations(ReorderBuffer *, TransactionId, XLogRecPtr lsn, Size nmsgs, SharedInvalidationMessage *msgs); -void ReorderBufferImmediateInvalidation(ReorderBuffer *, uint32 ninvalidations, +extern void ReorderBufferImmediateInvalidation(ReorderBuffer *, uint32 ninvalidations, SharedInvalidationMessage *invalidations); -void ReorderBufferProcessXid(ReorderBuffer *, TransactionId xid, XLogRecPtr lsn); +extern void ReorderBufferProcessXid(ReorderBuffer *, TransactionId xid, XLogRecPtr lsn); -void ReorderBufferXidSetCatalogChanges(ReorderBuffer *, TransactionId xid, XLogRecPtr lsn); -bool ReorderBufferXidHasCatalogChanges(ReorderBuffer *, TransactionId xid); -bool ReorderBufferXidHasBaseSnapshot(ReorderBuffer *, TransactionId xid); +extern void ReorderBufferXidSetCatalogChanges(ReorderBuffer *, TransactionId xid, XLogRecPtr lsn); +extern bool ReorderBufferXidHasCatalogChanges(ReorderBuffer *, TransactionId xid); +extern bool ReorderBufferXidHasBaseSnapshot(ReorderBuffer *, TransactionId xid); -bool ReorderBufferRememberPrepareInfo(ReorderBuffer *rb, TransactionId xid, +extern bool ReorderBufferRememberPrepareInfo(ReorderBuffer *rb, TransactionId xid, XLogRecPtr prepare_lsn, XLogRecPtr end_lsn, TimestampTz prepare_time, RepOriginId origin_id, XLogRecPtr origin_lsn); -void ReorderBufferSkipPrepare(ReorderBuffer *rb, TransactionId xid); -void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid); -ReorderBufferTXN *ReorderBufferGetOldestTXN(ReorderBuffer *); -TransactionId ReorderBufferGetOldestXmin(ReorderBuffer *rb); +extern void ReorderBufferSkipPrepare(ReorderBuffer *rb, TransactionId xid); +extern void ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, char *gid); +extern ReorderBufferTXN *ReorderBufferGetOldestTXN(ReorderBuffer *); +extern TransactionId ReorderBufferGetOldestXmin(ReorderBuffer *rb); -void ReorderBufferSetRestartPoint(ReorderBuffer *, XLogRecPtr ptr); +extern void ReorderBufferSetRestartPoint(ReorderBuffer *, XLogRecPtr ptr); -void StartupReorderBuffer(void); +extern void StartupReorderBuffer(void); #endif diff --git a/third_party/spanner_pg/src/include/replication/slot.h b/third_party/spanner_pg/src/include/replication/slot.h index c0fca56b..deba2c4e 100644 --- a/third_party/spanner_pg/src/include/replication/slot.h +++ b/third_party/spanner_pg/src/include/replication/slot.h @@ -2,7 +2,7 @@ * slot.h * Replication slot management. * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -84,11 +84,10 @@ typedef struct ReplicationSlotPersistentData XLogRecPtr confirmed_flush; /* - * LSN at which we found a consistent point at the time of slot creation. - * This is also the point where we have exported a snapshot for the - * initial copy. + * LSN at which we enabled two_phase commit for this slot or LSN at which + * we found a consistent point at the time of slot creation. */ - XLogRecPtr initial_consistent_point; + XLogRecPtr two_phase_at; /* * Allow decoding of prepared transactions? @@ -207,6 +206,7 @@ extern void ReplicationSlotSave(void); extern void ReplicationSlotMarkDirty(void); /* misc stuff */ +extern void ReplicationSlotInitialize(void); extern bool ReplicationSlotValidateName(const char *name, int elevel); extern void ReplicationSlotReserveWal(void); extern void ReplicationSlotsComputeRequiredXmin(bool already_locked); @@ -216,6 +216,8 @@ 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 bool ReplicationSlotName(int index, Name name); extern void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslotname, int szslot); extern void ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missing_ok); @@ -223,5 +225,6 @@ extern void StartupReplicationSlots(void); extern void CheckPointReplicationSlots(void); extern void CheckSlotRequirements(void); +extern void CheckSlotPermissions(void); #endif /* SLOT_H */ diff --git a/third_party/spanner_pg/src/include/replication/snapbuild.h b/third_party/spanner_pg/src/include/replication/snapbuild.h index a19b59e1..53d83f34 100644 --- a/third_party/spanner_pg/src/include/replication/snapbuild.h +++ b/third_party/spanner_pg/src/include/replication/snapbuild.h @@ -3,7 +3,7 @@ * snapbuild.h * Exports from replication/logical/snapbuild.c. * - * Copyright (c) 2012-2021, PostgreSQL Global Development Group + * Copyright (c) 2012-2022, PostgreSQL Global Development Group * * src/include/replication/snapbuild.h * @@ -62,7 +62,7 @@ extern void CheckPointSnapBuild(void); extern SnapBuild *AllocateSnapshotBuilder(struct ReorderBuffer *cache, TransactionId xmin_horizon, XLogRecPtr start_lsn, bool need_full_snapshot, - XLogRecPtr initial_consistent_point); + XLogRecPtr two_phase_at); extern void FreeSnapshotBuilder(SnapBuild *cache); extern void SnapBuildSnapDecRefcount(Snapshot snap); @@ -77,7 +77,8 @@ extern Snapshot SnapBuildGetOrBuildSnapshot(SnapBuild *builder, TransactionId xid); extern bool SnapBuildXactNeedsSkip(SnapBuild *snapstate, XLogRecPtr ptr); -extern XLogRecPtr SnapBuildInitialConsistentPoint(SnapBuild *builder); +extern XLogRecPtr SnapBuildGetTwoPhaseAt(SnapBuild *builder); +extern void SnapBuildSetTwoPhaseAt(SnapBuild *builder, XLogRecPtr ptr); extern void SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid, int nsubxacts, diff --git a/third_party/spanner_pg/src/include/replication/syncrep.h b/third_party/spanner_pg/src/include/replication/syncrep.h index 4266afde..4d7c90b9 100644 --- a/third_party/spanner_pg/src/include/replication/syncrep.h +++ b/third_party/spanner_pg/src/include/replication/syncrep.h @@ -3,7 +3,7 @@ * syncrep.h * Exports from replication/syncrep.c. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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/third_party/spanner_pg/src/include/replication/walreceiver.h b/third_party/spanner_pg/src/include/replication/walreceiver.h index 4fd7c25e..81184aa9 100644 --- a/third_party/spanner_pg/src/include/replication/walreceiver.h +++ b/third_party/spanner_pg/src/include/replication/walreceiver.h @@ -3,7 +3,7 @@ * walreceiver.h * Exports from replication/walreceiverfuncs.c. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * 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 { @@ -181,6 +181,8 @@ typedef struct List *publication_names; /* String list of publications */ bool binary; /* Ask publisher to use binary */ bool streaming; /* Streaming of large transactions */ + bool twophase; /* Streaming of two-phase transactions at + * prepare time */ } logical; } proto; } WalRcvStreamOptions; @@ -347,6 +349,7 @@ typedef void (*walrcv_send_fn) (WalReceiverConn *conn, typedef char *(*walrcv_create_slot_fn) (WalReceiverConn *conn, const char *slotname, bool temporary, + bool two_phase, CRSSnapshotAction snapshot_action, XLogRecPtr *lsn); @@ -420,8 +423,8 @@ extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions; WalReceiverFunctions->walrcv_receive(conn, buffer, wait_fd) #define walrcv_send(conn, buffer, nbytes) \ WalReceiverFunctions->walrcv_send(conn, buffer, nbytes) -#define walrcv_create_slot(conn, slotname, temporary, snapshot_action, lsn) \ - WalReceiverFunctions->walrcv_create_slot(conn, slotname, temporary, snapshot_action, lsn) +#define walrcv_create_slot(conn, slotname, temporary, two_phase, snapshot_action, lsn) \ + WalReceiverFunctions->walrcv_create_slot(conn, slotname, temporary, two_phase, snapshot_action, lsn) #define walrcv_get_backend_pid(conn) \ WalReceiverFunctions->walrcv_get_backend_pid(conn) #define walrcv_exec(conn, exec, nRetTypes, retTypes) \ diff --git a/third_party/spanner_pg/src/include/replication/walsender.h b/third_party/spanner_pg/src/include/replication/walsender.h index 82810693..d99a21b0 100644 --- a/third_party/spanner_pg/src/include/replication/walsender.h +++ b/third_party/spanner_pg/src/include/replication/walsender.h @@ -3,7 +3,7 @@ * walsender.h * Exports from replication/walsender.c. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/replication/walsender_private.h b/third_party/spanner_pg/src/include/replication/walsender_private.h index 07abf26f..c14888e4 100644 --- a/third_party/spanner_pg/src/include/replication/walsender_private.h +++ b/third_party/spanner_pg/src/include/replication/walsender_private.h @@ -3,7 +3,7 @@ * walsender_private.h * Private definitions from replication/walsender.c. * - * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/replication/worker_internal.h b/third_party/spanner_pg/src/include/replication/worker_internal.h index 179eb439..901845ab 100644 --- a/third_party/spanner_pg/src/include/replication/worker_internal.h +++ b/third_party/spanner_pg/src/include/replication/worker_internal.h @@ -3,7 +3,7 @@ * worker_internal.h * Internal headers shared by logical replication workers. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * src/include/replication/worker_internal.h * @@ -17,6 +17,7 @@ #include "access/xlogdefs.h" #include "catalog/pg_subscription.h" #include "datatype/timestamp.h" +#include "storage/fileset.h" #include "storage/lock.h" #include "storage/spin.h" @@ -50,6 +51,15 @@ typedef struct LogicalRepWorker XLogRecPtr relstate_lsn; slock_t relmutex; + /* + * Used to create the changes and subxact files for the streaming + * transactions. Upon the arrival of the first streaming transaction, the + * fileset will be initialized, and it will be deleted when the worker + * exits. Under this, separate buffiles would be created for each + * transaction which will be deleted after the transaction is finished. + */ + FileSet *stream_fileset; + /* Stats. */ XLogRecPtr last_lsn; TimestampTz last_send_time; @@ -59,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, @@ -86,8 +96,11 @@ extern void ReplicationOriginNameForTablesync(Oid suboid, Oid relid, char *originname, int szorgname); extern char *LogicalRepSyncTableStart(XLogRecPtr *origin_startpos); -void process_syncing_tables(XLogRecPtr current_lsn); -void invalidate_syncing_table_states(Datum arg, int cacheid, +extern bool AllTablesyncsReady(void); +extern void UpdateTwoPhaseState(Oid suboid, char new_state); + +extern void process_syncing_tables(XLogRecPtr current_lsn); +extern void invalidate_syncing_table_states(Datum arg, int cacheid, uint32 hashvalue); static inline bool diff --git a/third_party/spanner_pg/src/include/rewrite/prs2lock.h b/third_party/spanner_pg/src/include/rewrite/prs2lock.h index 8c356550..6d984839 100644 --- a/third_party/spanner_pg/src/include/rewrite/prs2lock.h +++ b/third_party/spanner_pg/src/include/rewrite/prs2lock.h @@ -3,7 +3,7 @@ * prs2lock.h * data structures for POSTGRES Rule System II (rewrite rules only) * - * 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 * * src/include/rewrite/prs2lock.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteDefine.h b/third_party/spanner_pg/src/include/rewrite/rewriteDefine.h index b5dd36aa..2a0d4933 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteDefine.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteDefine.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/rewrite/rewriteDefine.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteHandler.h b/third_party/spanner_pg/src/include/rewrite/rewriteHandler.h index 3d9be9e5..d76b30de 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteHandler.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteHandler.h @@ -4,7 +4,7 @@ * External interface to query rewriter. * * - * 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 * * src/include/rewrite/rewriteHandler.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteManip.h b/third_party/spanner_pg/src/include/rewrite/rewriteManip.h index 812414e6..98b9b3a2 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteManip.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteManip.h @@ -4,7 +4,7 @@ * Querytree manipulation subroutines for query rewriter. * * - * 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 * * src/include/rewrite/rewriteManip.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteRemove.h b/third_party/spanner_pg/src/include/rewrite/rewriteRemove.h index 08277bec..8e039eb1 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteRemove.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteRemove.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/rewrite/rewriteRemove.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteSearchCycle.h b/third_party/spanner_pg/src/include/rewrite/rewriteSearchCycle.h index 6be9541d..d8aac038 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteSearchCycle.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteSearchCycle.h @@ -4,7 +4,7 @@ * Support for rewriting SEARCH and CYCLE clauses. * * - * 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 * * src/include/rewrite/rewriteSearchCycle.h diff --git a/third_party/spanner_pg/src/include/rewrite/rewriteSupport.h b/third_party/spanner_pg/src/include/rewrite/rewriteSupport.h index bf0014ff..226ff66f 100644 --- a/third_party/spanner_pg/src/include/rewrite/rewriteSupport.h +++ b/third_party/spanner_pg/src/include/rewrite/rewriteSupport.h @@ -4,7 +4,7 @@ * * * - * 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 * * src/include/rewrite/rewriteSupport.h diff --git a/third_party/spanner_pg/src/include/rewrite/rowsecurity.h b/third_party/spanner_pg/src/include/rewrite/rowsecurity.h index 22476de9..8798e719 100644 --- a/third_party/spanner_pg/src/include/rewrite/rowsecurity.h +++ b/third_party/spanner_pg/src/include/rewrite/rowsecurity.h @@ -5,7 +5,7 @@ * prototypes for rewrite/rowsecurity.c and the structures for managing * the row security policies for relations in relcache. * - * 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/third_party/spanner_pg/src/include/rusagestub.h b/third_party/spanner_pg/src/include/rusagestub.h index 21175038..b887effa 100644 --- a/third_party/spanner_pg/src/include/rusagestub.h +++ b/third_party/spanner_pg/src/include/rusagestub.h @@ -4,7 +4,7 @@ * Stubs for getrusage(3). * * - * 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 * * src/include/rusagestub.h diff --git a/third_party/spanner_pg/src/include/snowball/header.h b/third_party/spanner_pg/src/include/snowball/header.h index 48521d70..850b72e8 100644 --- a/third_party/spanner_pg/src/include/snowball/header.h +++ b/third_party/spanner_pg/src/include/snowball/header.h @@ -13,7 +13,7 @@ * * NOTE: this file should not be included into any non-snowball sources! * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/snowball/header.h * diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_basque.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_basque.h index abdb9206..bffb6e90 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_basque.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_basque.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_catalan.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_catalan.h index f8c86d61..96e97ddf 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_catalan.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_catalan.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h index 1626bfbe..965436d9 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h index 36a871c8..64f1c6d9 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h index d61f02ba..ea90984b 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h index f7213228..2c80e4cd 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h index afdbf6a7..1febb49d 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h index 00e3ae8f..98696bb3 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_indonesian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_indonesian.h index 599fb540..d998b41b 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_indonesian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_indonesian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_irish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_irish.h index 278a9d20..d91d2317 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_irish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_irish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h index f56a3c46..22950bd2 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h index 5adaeaab..53930960 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h index aed5a35e..f504be10 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h index 1b8121cd..c7b517c0 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h index 658d3ae7..b066b4fc 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h index 1414e77f..7b5ec755 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h index 6bd6e574..be6ebf68 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h index fe0ab811..a7acc38e 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_KOI8_R_russian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_KOI8_R_russian.h index 2d7d1f82..42a8518b 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_KOI8_R_russian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_KOI8_R_russian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_arabic.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_arabic.h index 1d928625..cad02f34 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_arabic.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_arabic.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_armenian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_armenian.h index 3f75ce3b..793fd09e 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_armenian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_armenian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_basque.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_basque.h index bc9ccdd6..79ddc983 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_basque.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_basque.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_catalan.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_catalan.h index c048a19c..58c9995d 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_catalan.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_catalan.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_danish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_danish.h index fdd82d34..a5084dc6 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_danish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_danish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_dutch.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_dutch.h index 7543be3f..16cb9954 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_dutch.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_dutch.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_english.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_english.h index 532cd0f6..11fa090e 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_english.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_english.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_finnish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_finnish.h index 2c08de63..eebaa2de 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_finnish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_finnish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_french.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_french.h index 977455a7..22158b07 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_french.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_french.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_german.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_german.h index e601e45f..f276c53b 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_german.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_german.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_greek.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_greek.h index c1f14548..77667a31 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_greek.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_greek.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hindi.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hindi.h index 8abf20f9..bbc2e9b7 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hindi.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hindi.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h index 2fe259af..cc29d77b 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_indonesian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_indonesian.h index 688b5e25..9f51324c 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_indonesian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_indonesian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_irish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_irish.h index c15d5e8a..f06da96d 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_irish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_irish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_italian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_italian.h index 64c56178..f00dcaa5 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_italian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_italian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_lithuanian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_lithuanian.h index e06101e6..e62ff1c9 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_lithuanian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_lithuanian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_nepali.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_nepali.h index c1e3fcb7..f8f50af8 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_nepali.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_nepali.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h index c08cd38c..72aab402 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_porter.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_porter.h index a29518bf..00685b2c 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_porter.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_porter.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h index 6c33f36a..7be43352 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_romanian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_romanian.h index 30f72968..c93cd335 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_romanian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_romanian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_russian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_russian.h index ea470968..ca1d8821 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_russian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_russian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_serbian.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_serbian.h index 4d785adc..1df04f64 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_serbian.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_serbian.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_spanish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_spanish.h index 7cf53a81..dfd8dc36 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_spanish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_spanish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_swedish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_swedish.h index 3ee43d4a..ca08a647 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_swedish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_swedish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_tamil.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_tamil.h index 0faca9de..5f5ae352 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_tamil.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_tamil.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_turkish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_turkish.h index 32aa7739..68405929 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_turkish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_turkish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_yiddish.h b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_yiddish.h index 27516150..55b66256 100644 --- a/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_yiddish.h +++ b/third_party/spanner_pg/src/include/snowball/libstemmer/stem_UTF_8_yiddish.h @@ -1,4 +1,4 @@ -/* Generated by Snowball 2.1.0 - https://snowballstem.org/ */ +/* Generated by Snowball 2.2.0 - https://snowballstem.org/ */ #ifdef __cplusplus extern "C" { diff --git a/third_party/spanner_pg/src/include/statistics/extended_stats_internal.h b/third_party/spanner_pg/src/include/statistics/extended_stats_internal.h index 55cd9252..71f852c1 100644 --- a/third_party/spanner_pg/src/include/statistics/extended_stats_internal.h +++ b/third_party/spanner_pg/src/include/statistics/extended_stats_internal.h @@ -3,7 +3,7 @@ * extended_stats_internal.h * POSTGRES extended statistics internal declarations * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/statistics/statistics.h b/third_party/spanner_pg/src/include/statistics/statistics.h index 326cf26f..bb7ef124 100644 --- a/third_party/spanner_pg/src/include/statistics/statistics.h +++ b/third_party/spanner_pg/src/include/statistics/statistics.h @@ -3,7 +3,7 @@ * statistics.h * Extended statistics and selectivity estimation functions. * - * 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 * * src/include/statistics/statistics.h @@ -94,11 +94,11 @@ typedef struct MCVList MCVItem items[FLEXIBLE_ARRAY_MEMBER]; /* array of MCV items */ } MCVList; -extern MVNDistinct *statext_ndistinct_load(Oid mvoid); -extern MVDependencies *statext_dependencies_load(Oid mvoid); -extern MCVList *statext_mcv_load(Oid mvoid); +extern MVNDistinct *statext_ndistinct_load(Oid mvoid, bool inh); +extern MVDependencies *statext_dependencies_load(Oid mvoid, bool inh); +extern MCVList *statext_mcv_load(Oid mvoid, bool inh); -extern void BuildRelationExtStatistics(Relation onerel, double totalrows, +extern void BuildRelationExtStatistics(Relation onerel, bool inh, double totalrows, int numrows, HeapTuple *rows, int natts, VacAttrStats **vacattrstats); extern int ComputeExtStatisticsRows(Relation onerel, @@ -121,9 +121,10 @@ extern Selectivity statext_clauselist_selectivity(PlannerInfo *root, bool is_or); extern bool has_stats_of_kind(List *stats, char requiredkind); extern StatisticExtInfo *choose_best_statistics(List *stats, char requiredkind, + bool inh, Bitmapset **clause_attnums, List **clause_exprs, int nclauses); -extern HeapTuple statext_expressions_load(Oid stxoid, int idx); +extern HeapTuple statext_expressions_load(Oid stxoid, bool inh, int idx); #endif /* STATISTICS_H */ diff --git a/third_party/spanner_pg/src/include/storage/backendid.h b/third_party/spanner_pg/src/include/storage/backendid.h index 7aa39368..93d5b508 100644 --- a/third_party/spanner_pg/src/include/storage/backendid.h +++ b/third_party/spanner_pg/src/include/storage/backendid.h @@ -4,7 +4,7 @@ * POSTGRES backend id communication definitions * * - * 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 * * src/include/storage/backendid.h diff --git a/third_party/spanner_pg/src/include/storage/barrier.h b/third_party/spanner_pg/src/include/storage/barrier.h index ba997717..57d2c52e 100644 --- a/third_party/spanner_pg/src/include/storage/barrier.h +++ b/third_party/spanner_pg/src/include/storage/barrier.h @@ -3,7 +3,7 @@ * barrier.h * Barriers for synchronizing cooperating processes. * - * 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 * * src/include/storage/barrier.h diff --git a/third_party/spanner_pg/src/include/storage/block.h b/third_party/spanner_pg/src/include/storage/block.h index e7d86e5f..d756e3fd 100644 --- a/third_party/spanner_pg/src/include/storage/block.h +++ b/third_party/spanner_pg/src/include/storage/block.h @@ -4,7 +4,7 @@ * POSTGRES disk block definitions. * * - * 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 * * 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 */ diff --git a/third_party/spanner_pg/src/include/storage/buf.h b/third_party/spanner_pg/src/include/storage/buf.h index ad729199..aec01ca0 100644 --- a/third_party/spanner_pg/src/include/storage/buf.h +++ b/third_party/spanner_pg/src/include/storage/buf.h @@ -4,7 +4,7 @@ * Basic buffer manager data types. * * - * 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 * * src/include/storage/buf.h diff --git a/third_party/spanner_pg/src/include/storage/buf_internals.h b/third_party/spanner_pg/src/include/storage/buf_internals.h index 33fcaf5c..dbb0aef4 100644 --- a/third_party/spanner_pg/src/include/storage/buf_internals.h +++ b/third_party/spanner_pg/src/include/storage/buf_internals.h @@ -5,7 +5,7 @@ * strategy. * * - * 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 * * src/include/storage/buf_internals.h @@ -136,7 +136,7 @@ typedef struct buftag * BufferDesc -- shared descriptor/state data for a single shared buffer. * * Note: Buffer header lock (BM_LOCKED flag) must be held to examine or change - * the tag, state or wait_backend_pid fields. In general, buffer header lock + * tag, state or wait_backend_pgprocno fields. In general, buffer header lock * is a spinlock which is combined with flags, refcount and usagecount into * single atomic variable. This layout allow us to do some operations in a * single atomic operation, without actually acquiring and releasing spinlock; @@ -150,7 +150,7 @@ typedef struct buftag * is held. Thus buffer header lock holder can do complex updates of the * state variable in single write, simultaneously with lock release (cleaning * BM_LOCKED flag). On the other hand, updating of state without holding - * buffer header lock is restricted to CAS, which insure that BM_LOCKED flag + * buffer header lock is restricted to CAS, which ensures that BM_LOCKED flag * is not set. Atomic increment/decrement, OR/AND etc. are not allowed. * * An exception is that if we have the buffer pinned, its tag can't change @@ -161,8 +161,8 @@ typedef struct buftag * * We can't physically remove items from a disk page if another backend has * the buffer pinned. Hence, a backend may need to wait for all other pins - * to go away. This is signaled by storing its own PID into - * wait_backend_pid and setting flag bit BM_PIN_COUNT_WAITER. At present, + * to go away. This is signaled by storing its own pgprocno into + * wait_backend_pgprocno and setting flag bit BM_PIN_COUNT_WAITER. At present, * there can be only one such waiter per buffer. * * We use this same struct for local buffer headers, but the locks are not @@ -187,7 +187,7 @@ typedef struct BufferDesc /* state of the tag, containing flags, refcount and usagecount */ pg_atomic_uint32 state; - int wait_backend_pid; /* backend PID of pin-count waiter */ + int wait_backend_pgprocno; /* backend of pin-count waiter */ int freeNext; /* link in freelist chain */ LWLock content_lock; /* to lock access to buffer contents */ } BufferDesc; @@ -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/third_party/spanner_pg/src/include/storage/buffile.h b/third_party/spanner_pg/src/include/storage/buffile.h index 566523de..a4922d18 100644 --- a/third_party/spanner_pg/src/include/storage/buffile.h +++ b/third_party/spanner_pg/src/include/storage/buffile.h @@ -15,7 +15,7 @@ * but currently we have no need for oversize temp files without buffered * access. * - * 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 * * src/include/storage/buffile.h @@ -26,7 +26,7 @@ #ifndef BUFFILE_H #define BUFFILE_H -#include "storage/sharedfileset.h" +#include "storage/fileset.h" /* BufFile is an opaque type whose details are not known outside buffile.c. */ @@ -46,11 +46,12 @@ extern int BufFileSeekBlock(BufFile *file, long blknum); extern int64 BufFileSize(BufFile *file); extern long BufFileAppend(BufFile *target, BufFile *source); -extern BufFile *BufFileCreateShared(SharedFileSet *fileset, const char *name); -extern void BufFileExportShared(BufFile *file); -extern BufFile *BufFileOpenShared(SharedFileSet *fileset, const char *name, - int mode); -extern void BufFileDeleteShared(SharedFileSet *fileset, const char *name); -extern void BufFileTruncateShared(BufFile *file, int fileno, off_t offset); +extern BufFile *BufFileCreateFileSet(FileSet *fileset, const char *name); +extern void BufFileExportFileSet(BufFile *file); +extern BufFile *BufFileOpenFileSet(FileSet *fileset, const char *name, + int mode, bool missing_ok); +extern void BufFileDeleteFileSet(FileSet *fileset, const char *name, + bool missing_ok); +extern void BufFileTruncateFileSet(BufFile *file, int fileno, off_t offset); #endif /* BUFFILE_H */ diff --git a/third_party/spanner_pg/src/include/storage/bufmgr.h b/third_party/spanner_pg/src/include/storage/bufmgr.h index aa64fb42..58391406 100644 --- a/third_party/spanner_pg/src/include/storage/bufmgr.h +++ b/third_party/spanner_pg/src/include/storage/bufmgr.h @@ -4,7 +4,7 @@ * POSTGRES buffer manager definitions. * * - * 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 * * 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 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 int checkpoint_flush_after; -extern int backend_flush_after; -extern int bgwriter_flush_after; +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; @@ -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); @@ -194,7 +195,6 @@ extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, extern void InitBufferPool(void); extern void InitBufferPoolAccess(void); -extern void InitBufferPoolBackend(void); extern void AtEOXact_Buffers(bool isCommit); extern void PrintBufferLeakWarning(Buffer buffer); extern void CheckPointBuffers(int flags); @@ -204,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/third_party/spanner_pg/src/include/storage/bufpage.h b/third_party/spanner_pg/src/include/storage/bufpage.h index c86ccdaf..e9f253f2 100644 --- a/third_party/spanner_pg/src/include/storage/bufpage.h +++ b/third_party/spanner_pg/src/include/storage/bufpage.h @@ -4,7 +4,7 @@ * Standard POSTGRES buffer page definitions. * * - * 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 * * src/include/storage/bufpage.h diff --git a/third_party/spanner_pg/src/include/storage/checksum.h b/third_party/spanner_pg/src/include/storage/checksum.h index 80d23591..1904fabd 100644 --- a/third_party/spanner_pg/src/include/storage/checksum.h +++ b/third_party/spanner_pg/src/include/storage/checksum.h @@ -3,7 +3,7 @@ * checksum.h * Checksum implementation for data pages. * - * 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 * * src/include/storage/checksum.h diff --git a/third_party/spanner_pg/src/include/storage/checksum_impl.h b/third_party/spanner_pg/src/include/storage/checksum_impl.h index ef302683..015f0f1f 100644 --- a/third_party/spanner_pg/src/include/storage/checksum_impl.h +++ b/third_party/spanner_pg/src/include/storage/checksum_impl.h @@ -8,7 +8,7 @@ * referenced by storage/checksum.h. (Note: you may need to redefine * Assert() as empty to compile this successfully externally.) * - * 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 * * src/include/storage/checksum_impl.h diff --git a/third_party/spanner_pg/src/include/storage/condition_variable.h b/third_party/spanner_pg/src/include/storage/condition_variable.h index 6310ca23..e89175eb 100644 --- a/third_party/spanner_pg/src/include/storage/condition_variable.h +++ b/third_party/spanner_pg/src/include/storage/condition_variable.h @@ -12,7 +12,7 @@ * can be canceled prior to the fulfillment of the condition) and do not * use pointers internally (so that they are safe to use within DSMs). * - * 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 * * src/include/storage/condition_variable.h diff --git a/third_party/spanner_pg/src/include/storage/copydir.h b/third_party/spanner_pg/src/include/storage/copydir.h index 2c3936b0..50a26ede 100644 --- a/third_party/spanner_pg/src/include/storage/copydir.h +++ b/third_party/spanner_pg/src/include/storage/copydir.h @@ -3,7 +3,7 @@ * copydir.h * Copy a directory. * - * 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 * * src/include/storage/copydir.h diff --git a/third_party/spanner_pg/src/include/storage/dsm.h b/third_party/spanner_pg/src/include/storage/dsm.h index e4e3e9b3..4dd6af23 100644 --- a/third_party/spanner_pg/src/include/storage/dsm.h +++ b/third_party/spanner_pg/src/include/storage/dsm.h @@ -3,7 +3,7 @@ * dsm.h * manage dynamic shared memory segments * - * 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 * * src/include/storage/dsm.h diff --git a/third_party/spanner_pg/src/include/storage/dsm_impl.h b/third_party/spanner_pg/src/include/storage/dsm_impl.h index ff72f7b0..c51584dc 100644 --- a/third_party/spanner_pg/src/include/storage/dsm_impl.h +++ b/third_party/spanner_pg/src/include/storage/dsm_impl.h @@ -3,7 +3,7 @@ * dsm_impl.h * low-level dynamic shared memory primitives * - * 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 * * 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/third_party/spanner_pg/src/include/storage/fd.h b/third_party/spanner_pg/src/include/storage/fd.h index 5b3c280d..69549b00 100644 --- a/third_party/spanner_pg/src/include/storage/fd.h +++ b/third_party/spanner_pg/src/include/storage/fd.h @@ -4,7 +4,7 @@ * Virtual file descriptor definitions. * * - * 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 * * 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 @@ -79,6 +79,22 @@ extern int max_safe_fds; #define FILE_POSSIBLY_DELETED(err) ((err) == ENOENT || (err) == EACCES) #endif +/* + * O_DIRECT is not standard, but almost every Unix has it. We translate it + * to the appropriate Windows flag in src/port/open.c. We simulate it with + * fcntl(F_NOCACHE) on macOS inside fd.c's open() wrapper. We use the name + * PG_O_DIRECT rather than defining O_DIRECT in that case (probably not a good + * idea on a Unix). + */ +#if defined(O_DIRECT) +#define PG_O_DIRECT O_DIRECT +#elif defined(F_NOCACHE) +#define PG_O_DIRECT 0x80000000 +#define PG_O_DIRECT_USE_F_NOCACHE +#else +#define PG_O_DIRECT 0 +#endif + /* * prototypes for functions in fd.c */ @@ -142,6 +158,7 @@ extern int MakePGDirectory(const char *directoryName); /* Miscellaneous support routines */ extern void InitFileAccess(void); +extern void InitTemporaryFileAccess(void); extern void set_max_safe_fds(void); extern void closeAllVfds(void); extern void SetTempTablespaces(Oid *tableSpaces, int numSpaces); diff --git a/third_party/spanner_pg/src/include/storage/fileset.h b/third_party/spanner_pg/src/include/storage/fileset.h new file mode 100644 index 00000000..ad378847 --- /dev/null +++ b/third_party/spanner_pg/src/include/storage/fileset.h @@ -0,0 +1,40 @@ +/*------------------------------------------------------------------------- + * + * fileset.h + * Management of named temporary files. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/fileset.h + * + *------------------------------------------------------------------------- + */ + +#ifndef FILESET_H +#define FILESET_H + +#include "storage/fd.h" + +/* + * A set of temporary files. + */ +typedef struct FileSet +{ + pid_t creator_pid; /* PID of the creating process */ + uint32 number; /* per-PID identifier */ + int ntablespaces; /* number of tablespaces to use */ + Oid tablespaces[8]; /* OIDs of tablespaces to use. Assumes that + * it's rare that there more than temp + * tablespaces. */ +} FileSet; + +extern void FileSetInit(FileSet *fileset); +extern File FileSetCreate(FileSet *fileset, const char *name); +extern File FileSetOpen(FileSet *fileset, const char *name, + int mode); +extern bool FileSetDelete(FileSet *fileset, const char *name, + bool error_on_failure); +extern void FileSetDeleteAll(FileSet *fileset); + +#endif diff --git a/third_party/spanner_pg/src/include/storage/freespace.h b/third_party/spanner_pg/src/include/storage/freespace.h index 600826ca..dcc40eb8 100644 --- a/third_party/spanner_pg/src/include/storage/freespace.h +++ b/third_party/spanner_pg/src/include/storage/freespace.h @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding free space in relations * * - * 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 * * src/include/storage/freespace.h diff --git a/third_party/spanner_pg/src/include/storage/fsm_internals.h b/third_party/spanner_pg/src/include/storage/fsm_internals.h index 09749769..a6f83721 100644 --- a/third_party/spanner_pg/src/include/storage/fsm_internals.h +++ b/third_party/spanner_pg/src/include/storage/fsm_internals.h @@ -4,7 +4,7 @@ * internal functions for free space map * * - * 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 * * src/include/storage/fsm_internals.h diff --git a/third_party/spanner_pg/src/include/storage/indexfsm.h b/third_party/spanner_pg/src/include/storage/indexfsm.h index 1885b816..04c1a051 100644 --- a/third_party/spanner_pg/src/include/storage/indexfsm.h +++ b/third_party/spanner_pg/src/include/storage/indexfsm.h @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding an unused page in index * * - * 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 * * src/include/storage/indexfsm.h diff --git a/third_party/spanner_pg/src/include/storage/ipc.h b/third_party/spanner_pg/src/include/storage/ipc.h index 753a6dd4..fade4dbe 100644 --- a/third_party/spanner_pg/src/include/storage/ipc.h +++ b/third_party/spanner_pg/src/include/storage/ipc.h @@ -8,7 +8,7 @@ * exit-time cleanup for either a postmaster or a backend. * * - * 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 * * src/include/storage/ipc.h @@ -77,6 +77,8 @@ extern void check_on_shmem_exit_lists_are_empty(void); /* ipci.c */ extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook; +extern Size CalculateShmemSize(int *num_semaphores); extern void CreateSharedMemoryAndSemaphores(void); +extern void InitializeShmemGUCs(void); #endif /* IPC_H */ diff --git a/third_party/spanner_pg/src/include/storage/item.h b/third_party/spanner_pg/src/include/storage/item.h index cb439655..6f3eaebc 100644 --- a/third_party/spanner_pg/src/include/storage/item.h +++ b/third_party/spanner_pg/src/include/storage/item.h @@ -4,7 +4,7 @@ * POSTGRES disk item definitions. * * - * 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 * * src/include/storage/item.h diff --git a/third_party/spanner_pg/src/include/storage/itemid.h b/third_party/spanner_pg/src/include/storage/itemid.h index d1f0e382..e33637ff 100644 --- a/third_party/spanner_pg/src/include/storage/itemid.h +++ b/third_party/spanner_pg/src/include/storage/itemid.h @@ -4,7 +4,7 @@ * Standard POSTGRES buffer page item identifier/line pointer definitions. * * - * 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 * * src/include/storage/itemid.h diff --git a/third_party/spanner_pg/src/include/storage/itemptr.h b/third_party/spanner_pg/src/include/storage/itemptr.h index cd4b8fba..81947bc6 100644 --- a/third_party/spanner_pg/src/include/storage/itemptr.h +++ b/third_party/spanner_pg/src/include/storage/itemptr.h @@ -4,7 +4,7 @@ * POSTGRES disk item pointer definitions. * * - * 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 * * src/include/storage/itemptr.h diff --git a/third_party/spanner_pg/src/include/storage/large_object.h b/third_party/spanner_pg/src/include/storage/large_object.h index ae1e2482..b826a7dc 100644 --- a/third_party/spanner_pg/src/include/storage/large_object.h +++ b/third_party/spanner_pg/src/include/storage/large_object.h @@ -5,7 +5,7 @@ * zillions of large objects (internal, external, jaquith, inversion). * Now we only support inversion. * - * 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 * * 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/third_party/spanner_pg/src/include/storage/latch.h b/third_party/spanner_pg/src/include/storage/latch.h index 44f9368c..68ab740f 100644 --- a/third_party/spanner_pg/src/include/storage/latch.h +++ b/third_party/spanner_pg/src/include/storage/latch.h @@ -90,7 +90,7 @@ * efficient than using WaitLatch or WaitLatchOrSocket. * * - * 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 * * src/include/storage/latch.h @@ -134,10 +134,11 @@ typedef struct Latch /* avoid having to deal with case on platforms not requiring it */ #define WL_SOCKET_CONNECTED WL_SOCKET_WRITEABLE #endif - +#define WL_SOCKET_CLOSED (1 << 7) #define WL_SOCKET_MASK (WL_SOCKET_READABLE | \ WL_SOCKET_WRITEABLE | \ - WL_SOCKET_CONNECTED) + WL_SOCKET_CONNECTED | \ + WL_SOCKET_CLOSED) typedef struct WaitEvent { @@ -180,5 +181,6 @@ extern int WaitLatchOrSocket(Latch *latch, int wakeEvents, pgsocket sock, long timeout, uint32 wait_event_info); extern void InitializeLatchWaitSet(void); extern int GetNumRegisteredWaitEvents(WaitEventSet *set); +extern bool WaitEventSetCanReportClosed(void); #endif /* LATCH_H */ diff --git a/third_party/spanner_pg/src/include/storage/lmgr.h b/third_party/spanner_pg/src/include/storage/lmgr.h index b0095592..be1d2c99 100644 --- a/third_party/spanner_pg/src/include/storage/lmgr.h +++ b/third_party/spanner_pg/src/include/storage/lmgr.h @@ -4,7 +4,7 @@ * POSTGRES lock manager definitions. * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/lock.h b/third_party/spanner_pg/src/include/storage/lock.h index 27de90b4..e55bfb41 100644 --- a/third_party/spanner_pg/src/include/storage/lock.h +++ b/third_party/spanner_pg/src/include/storage/lock.h @@ -4,7 +4,7 @@ * POSTGRES low-level lock mechanism * * - * 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 * * 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 */ @@ -155,7 +155,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/third_party/spanner_pg/src/include/storage/lockdefs.h b/third_party/spanner_pg/src/include/storage/lockdefs.h index 51b6df0f..d3a2ff42 100644 --- a/third_party/spanner_pg/src/include/storage/lockdefs.h +++ b/third_party/spanner_pg/src/include/storage/lockdefs.h @@ -7,7 +7,7 @@ * contains definition that have to (indirectly) be available when included by * FRONTEND code. * - * 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 * * src/include/storage/lockdefs.h @@ -46,7 +46,7 @@ typedef int LOCKMODE; #define AccessExclusiveLock 8 /* ALTER TABLE, DROP TABLE, VACUUM FULL, * and unqualified LOCK TABLE */ -#define MaxLockMode 8 +#define MaxLockMode 8 /* highest standard lock mode */ /* WAL representation of an AccessExclusiveLock on a table */ diff --git a/third_party/spanner_pg/src/include/storage/lwlock.h b/third_party/spanner_pg/src/include/storage/lwlock.h index 78afe57f..d88fa4b4 100644 --- a/third_party/spanner_pg/src/include/storage/lwlock.h +++ b/third_party/spanner_pg/src/include/storage/lwlock.h @@ -4,7 +4,7 @@ * Lightweight lock manager * * - * 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 * * src/include/storage/lwlock.h @@ -23,6 +23,14 @@ struct PGPROC; +/* what state of the wait process is a backend in */ +typedef enum LWLockWaitState +{ + LW_WS_NOT_WAITING, /* not currently waiting / woken up */ + LW_WS_WAITING, /* currently waiting */ + LW_WS_PENDING_WAKEUP /* removed from waitlist, but not yet signalled */ +} LWLockWaitState; + /* * Code outside of lwlock.c should not manipulate the contents of this * structure directly, but we have to declare it here to allow LWLocks to be @@ -110,7 +118,7 @@ typedef enum LWLockMode #ifdef LOCK_DEBUG -extern bool Trace_lwlocks; +extern PGDLLIMPORT bool Trace_lwlocks; #endif extern bool LWLockAcquire(LWLock *lock, LWLockMode mode); @@ -190,6 +198,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/third_party/spanner_pg/src/include/storage/md.h b/third_party/spanner_pg/src/include/storage/md.h index 752b4408..ffffa40d 100644 --- a/third_party/spanner_pg/src/include/storage/md.h +++ b/third_party/spanner_pg/src/include/storage/md.h @@ -4,7 +4,7 @@ * magnetic disk storage manager public interface declarations. * * - * 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 * * src/include/storage/md.h diff --git a/third_party/spanner_pg/src/include/storage/off.h b/third_party/spanner_pg/src/include/storage/off.h index a5df0ab2..e6573aca 100644 --- a/third_party/spanner_pg/src/include/storage/off.h +++ b/third_party/spanner_pg/src/include/storage/off.h @@ -4,7 +4,7 @@ * POSTGRES disk "offset" definitions. * * - * 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 * * src/include/storage/off.h diff --git a/third_party/spanner_pg/src/include/storage/pg_sema.h b/third_party/spanner_pg/src/include/storage/pg_sema.h index 3112a8ce..5ca941ae 100644 --- a/third_party/spanner_pg/src/include/storage/pg_sema.h +++ b/third_party/spanner_pg/src/include/storage/pg_sema.h @@ -10,7 +10,7 @@ * be provided by each port. * * - * 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 * * src/include/storage/pg_sema.h diff --git a/third_party/spanner_pg/src/include/storage/pg_shmem.h b/third_party/spanner_pg/src/include/storage/pg_shmem.h index 059df1b7..da5962ed 100644 --- a/third_party/spanner_pg/src/include/storage/pg_shmem.h +++ b/third_party/spanner_pg/src/include/storage/pg_shmem.h @@ -14,7 +14,7 @@ * only one ID number. * * - * 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 * * 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 @@ -87,5 +87,6 @@ extern PGShmemHeader *PGSharedMemoryCreate(Size size, PGShmemHeader **shim); extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2); extern void PGSharedMemoryDetach(void); +extern void GetHugePageSize(Size *hugepagesize, int *mmap_flags); #endif /* PG_SHMEM_H */ diff --git a/third_party/spanner_pg/src/include/storage/pmsignal.h b/third_party/spanner_pg/src/include/storage/pmsignal.h index 8ed4d87a..58f4ddf4 100644 --- a/third_party/spanner_pg/src/include/storage/pmsignal.h +++ b/third_party/spanner_pg/src/include/storage/pmsignal.h @@ -4,7 +4,7 @@ * routines for signaling between the postmaster and its child processes * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/predicate.h b/third_party/spanner_pg/src/include/storage/predicate.h index 152b6986..8dfcb394 100644 --- a/third_party/spanner_pg/src/include/storage/predicate.h +++ b/third_party/spanner_pg/src/include/storage/predicate.h @@ -4,7 +4,7 @@ * POSTGRES public predicate locking definitions. * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/predicate_internals.h b/third_party/spanner_pg/src/include/storage/predicate_internals.h index 104f560d..2416d3c2 100644 --- a/third_party/spanner_pg/src/include/storage/predicate_internals.h +++ b/third_party/spanner_pg/src/include/storage/predicate_internals.h @@ -4,7 +4,7 @@ * POSTGRES internal predicate locking definitions. * * - * 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 * * src/include/storage/predicate_internals.h @@ -113,6 +113,7 @@ typedef struct SERIALIZABLEXACT TransactionId xmin; /* the transaction's snapshot xmin */ uint32 flags; /* OR'd combination of values defined below */ int pid; /* pid of associated process */ + int pgprocno; /* pgprocno of associated process */ } SERIALIZABLEXACT; #define SXACT_FLAG_COMMITTED 0x00000001 /* already committed */ diff --git a/third_party/spanner_pg/src/include/storage/proc.h b/third_party/spanner_pg/src/include/storage/proc.h index 1464fad9..2ea77309 100644 --- a/third_party/spanner_pg/src/include/storage/proc.h +++ b/third_party/spanner_pg/src/include/storage/proc.h @@ -4,7 +4,7 @@ * per-process shared memory data structures * * - * 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 * * 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 \ @@ -86,8 +89,36 @@ struct XidCache #define INVALID_PGPROCNO PG_INT32_MAX /* - * Flags used only for type of internal functions - * GetVirtualXIDsDelayingChkptGuts and HaveVirtualXIDsDelayingChkptGuts. + * 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) @@ -180,7 +211,7 @@ struct PGPROC bool recoveryConflictPending; /* Info about LWLock the process is currently waiting for, if any. */ - bool lwWaiting; /* true if waiting for an LW lock */ + uint8 lwWaiting; /* see LWLockWaitState */ uint8 lwWaitMode; /* lwlock mode being waited for */ proclist_node lwWaitLink; /* position in LW lock wait list */ @@ -197,12 +228,11 @@ struct PGPROC pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition * started */ - bool delayChkpt; /* true if this proc delays checkpoint start */ + int delayChkptFlags; /* for DELAY_CHKPT_* flags */ uint8 statusFlags; /* this backend's status flags, see PROC_* * above. mirrored in * ProcGlobal->statusFlags[pgxactoff] */ - bool delayChkptEnd; /* true if this proc delays checkpoint end */ /* * Info to allow us to wait for synchronous replication, if needed. @@ -366,16 +396,13 @@ typedef struct PROC_HDR Latch *checkpointerLatch; /* Current shared estimate of appropriate spins_per_delay value */ int spins_per_delay; - /* The proc of the Startup process, since not in ProcArray */ - PGPROC *startupProc; - int startupProcPid; /* Buffer id of the buffer that Startup process waits for pin on, or -1 */ int startupBufferPinWaitBufId; } PROC_HDR; extern PGDLLIMPORT PROC_HDR *ProcGlobal; -extern PGPROC *PreparedXactProcs; +extern PGDLLIMPORT PGPROC *PreparedXactProcs; /* Accessor for PGPROC given a pgprocno. */ #define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)]) @@ -396,7 +423,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; /* @@ -409,7 +436,6 @@ extern void InitProcess(void); extern void InitProcessPhase2(void); extern void InitAuxiliaryProcess(void); -extern void PublishStartupProcessInformation(void); extern void SetStartupBufferPinWaitBufId(int bufid); extern int GetStartupBufferPinWaitBufId(void); @@ -425,7 +451,7 @@ extern bool IsWaitingForLock(void); extern void LockErrorCleanup(void); extern void ProcWaitForSignal(uint32 wait_event_info); -extern void ProcSendSignal(int pid); +extern void ProcSendSignal(int pgprocno); extern PGPROC *AuxiliaryPidGetProc(int pid); diff --git a/third_party/spanner_pg/src/include/storage/procarray.h b/third_party/spanner_pg/src/include/storage/procarray.h index 767a910e..781e3f61 100644 --- a/third_party/spanner_pg/src/include/storage/procarray.h +++ b/third_party/spanner_pg/src/include/storage/procarray.h @@ -4,7 +4,7 @@ * POSTGRES process array definitions. * * - * 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 * * src/include/storage/procarray.h @@ -60,12 +60,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 VirtualTransactionId *GetVirtualXIDsDelayingChkptEnd(int *nvxids); +extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids, int type); extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, - int nvxids); -extern bool HaveVirtualXIDsDelayingChkptEnd(VirtualTransactionId *vxids, - int nvxids); + int nvxids, int type); extern PGPROC *BackendPidGetProc(int pid); extern PGPROC *BackendPidGetProcWithLock(int pid); diff --git a/third_party/spanner_pg/src/include/storage/proclist.h b/third_party/spanner_pg/src/include/storage/proclist.h index afdd4f8f..509e341b 100644 --- a/third_party/spanner_pg/src/include/storage/proclist.h +++ b/third_party/spanner_pg/src/include/storage/proclist.h @@ -10,7 +10,7 @@ * See proclist_types.h for the structs that these functions operate on. They * are separated to break a header dependency cycle with proc.h. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/storage/proclist.h diff --git a/third_party/spanner_pg/src/include/storage/proclist_types.h b/third_party/spanner_pg/src/include/storage/proclist_types.h index b2d6e826..52326794 100644 --- a/third_party/spanner_pg/src/include/storage/proclist_types.h +++ b/third_party/spanner_pg/src/include/storage/proclist_types.h @@ -5,7 +5,7 @@ * * See proclist.h for functions that operate on these types. * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/storage/proclist_types.h diff --git a/third_party/spanner_pg/src/include/storage/procsignal.h b/third_party/spanner_pg/src/include/storage/procsignal.h index eec186be..ee636900 100644 --- a/third_party/spanner_pg/src/include/storage/procsignal.h +++ b/third_party/spanner_pg/src/include/storage/procsignal.h @@ -4,7 +4,7 @@ * Routines for interprocess signaling * * - * 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 * * src/include/storage/procsignal.h @@ -49,12 +49,7 @@ typedef enum typedef enum { - /* - * XXX. PROCSIGNAL_BARRIER_PLACEHOLDER should be replaced when the first - * real user of the ProcSignalBarrier mechanism is added. It's just here - * for now because we can't have an empty enum. - */ - PROCSIGNAL_BARRIER_PLACEHOLDER = 0 + PROCSIGNAL_BARRIER_SMGRRELEASE /* ask smgr to close files */ } ProcSignalBarrierType; /* diff --git a/third_party/spanner_pg/src/include/storage/reinit.h b/third_party/spanner_pg/src/include/storage/reinit.h index fad1e5c4..bf2c10d4 100644 --- a/third_party/spanner_pg/src/include/storage/reinit.h +++ b/third_party/spanner_pg/src/include/storage/reinit.h @@ -4,7 +4,7 @@ * Reinitialization of unlogged relations * * - * 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 * * src/include/storage/reinit.h diff --git a/third_party/spanner_pg/src/include/storage/relfilenode.h b/third_party/spanner_pg/src/include/storage/relfilenode.h index 5e36d3b9..4fdc606c 100644 --- a/third_party/spanner_pg/src/include/storage/relfilenode.h +++ b/third_party/spanner_pg/src/include/storage/relfilenode.h @@ -4,7 +4,7 @@ * Physical access information for relations. * * - * 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 * * src/include/storage/relfilenode.h diff --git a/third_party/spanner_pg/src/include/storage/s_lock.h b/third_party/spanner_pg/src/include/storage/s_lock.h index 95049f02..4d3ffc76 100644 --- a/third_party/spanner_pg/src/include/storage/s_lock.h +++ b/third_party/spanner_pg/src/include/storage/s_lock.h @@ -86,7 +86,7 @@ * when using the SysV semaphore code. * * - * 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 * * 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 */ @@ -1047,7 +1064,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 @@ -1087,7 +1104,7 @@ init_spin_delay(SpinDelayStatus *status, } #define init_local_spin_delay(status) init_spin_delay(status, __FILE__, __LINE__, PG_FUNCNAME_MACRO) -void perform_spin_delay(SpinDelayStatus *status); -void finish_spin_delay(SpinDelayStatus *status); +extern void perform_spin_delay(SpinDelayStatus *status); +extern void finish_spin_delay(SpinDelayStatus *status); #endif /* S_LOCK_H */ diff --git a/third_party/spanner_pg/src/include/storage/sharedfileset.h b/third_party/spanner_pg/src/include/storage/sharedfileset.h index 09ba121a..b1cde36d 100644 --- a/third_party/spanner_pg/src/include/storage/sharedfileset.h +++ b/third_party/spanner_pg/src/include/storage/sharedfileset.h @@ -4,7 +4,7 @@ * Shared temporary file management. * * - * 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 * * src/include/storage/sharedfileset.h @@ -17,6 +17,7 @@ #include "storage/dsm.h" #include "storage/fd.h" +#include "storage/fileset.h" #include "storage/spin.h" /* @@ -24,24 +25,13 @@ */ typedef struct SharedFileSet { - pid_t creator_pid; /* PID of the creating process */ - uint32 number; /* per-PID identifier */ + FileSet fs; slock_t mutex; /* mutex protecting the reference count */ int refcnt; /* number of attached backends */ - int ntablespaces; /* number of tablespaces to use */ - Oid tablespaces[8]; /* OIDs of tablespaces to use. Assumes that - * it's rare that there more than temp - * tablespaces. */ } SharedFileSet; extern void SharedFileSetInit(SharedFileSet *fileset, dsm_segment *seg); extern void SharedFileSetAttach(SharedFileSet *fileset, dsm_segment *seg); -extern File SharedFileSetCreate(SharedFileSet *fileset, const char *name); -extern File SharedFileSetOpen(SharedFileSet *fileset, const char *name, - int mode); -extern bool SharedFileSetDelete(SharedFileSet *fileset, const char *name, - bool error_on_failure); extern void SharedFileSetDeleteAll(SharedFileSet *fileset); -extern void SharedFileSetUnregister(SharedFileSet *input_fileset); #endif diff --git a/third_party/spanner_pg/src/include/storage/shm_mq.h b/third_party/spanner_pg/src/include/storage/shm_mq.h index e693f3f7..b6fe6872 100644 --- a/third_party/spanner_pg/src/include/storage/shm_mq.h +++ b/third_party/spanner_pg/src/include/storage/shm_mq.h @@ -3,7 +3,7 @@ * shm_mq.h * single-reader, single-writer shared memory message queue * - * 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 * * src/include/storage/shm_mq.h @@ -70,9 +70,10 @@ extern shm_mq *shm_mq_get_queue(shm_mq_handle *mqh); /* Send or receive messages. */ extern shm_mq_result shm_mq_send(shm_mq_handle *mqh, - Size nbytes, const void *data, bool nowait); -extern shm_mq_result shm_mq_sendv(shm_mq_handle *mqh, - shm_mq_iovec *iov, int iovcnt, bool nowait); + Size nbytes, const void *data, bool nowait, + bool force_flush); +extern shm_mq_result shm_mq_sendv(shm_mq_handle *mqh, shm_mq_iovec *iov, + int iovcnt, bool nowait, bool force_flush); extern shm_mq_result shm_mq_receive(shm_mq_handle *mqh, Size *nbytesp, void **datap, bool nowait); diff --git a/third_party/spanner_pg/src/include/storage/shm_toc.h b/third_party/spanner_pg/src/include/storage/shm_toc.h index dd29a593..153a57cf 100644 --- a/third_party/spanner_pg/src/include/storage/shm_toc.h +++ b/third_party/spanner_pg/src/include/storage/shm_toc.h @@ -12,7 +12,7 @@ * other data structure within the segment and only put the pointer to * the data structure itself in the table of contents. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/shm_toc.h diff --git a/third_party/spanner_pg/src/include/storage/shmem.h b/third_party/spanner_pg/src/include/storage/shmem.h index 31024e5a..de9e7c6e 100644 --- a/third_party/spanner_pg/src/include/storage/shmem.h +++ b/third_party/spanner_pg/src/include/storage/shmem.h @@ -11,7 +11,7 @@ * at the same address. This means shared memory pointers can be passed * around directly between different processes. * - * 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 * * src/include/storage/shmem.h diff --git a/third_party/spanner_pg/src/include/storage/sinval.h b/third_party/spanner_pg/src/include/storage/sinval.h index f03dc23b..e7cd4565 100644 --- a/third_party/spanner_pg/src/include/storage/sinval.h +++ b/third_party/spanner_pg/src/include/storage/sinval.h @@ -4,7 +4,7 @@ * POSTGRES shared cache invalidation communication definitions. * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/sinvaladt.h b/third_party/spanner_pg/src/include/storage/sinvaladt.h index 14148bf8..91e24189 100644 --- a/third_party/spanner_pg/src/include/storage/sinvaladt.h +++ b/third_party/spanner_pg/src/include/storage/sinvaladt.h @@ -12,7 +12,7 @@ * The struct type SharedInvalidationMessage, defining the contents of * a single message, is defined in sinval.h. * - * 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 * * src/include/storage/sinvaladt.h diff --git a/third_party/spanner_pg/src/include/storage/smgr.h b/third_party/spanner_pg/src/include/storage/smgr.h index a6fbf7b6..6b63c60f 100644 --- a/third_party/spanner_pg/src/include/storage/smgr.h +++ b/third_party/spanner_pg/src/include/storage/smgr.h @@ -4,7 +4,7 @@ * storage manager switch public interface declarations. * * - * 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 * * 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); @@ -104,5 +106,6 @@ extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks); extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); extern void AtEOXact_SMgr(void); +extern bool ProcessBarrierSmgrRelease(void); #endif /* SMGR_H */ diff --git a/third_party/spanner_pg/src/include/storage/spin.h b/third_party/spanner_pg/src/include/storage/spin.h index ef067981..7031f1d2 100644 --- a/third_party/spanner_pg/src/include/storage/spin.h +++ b/third_party/spanner_pg/src/include/storage/spin.h @@ -41,7 +41,7 @@ * be again. * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/standby.h b/third_party/spanner_pg/src/include/storage/standby.h index 38fd85a4..6a776326 100644 --- a/third_party/spanner_pg/src/include/storage/standby.h +++ b/third_party/spanner_pg/src/include/storage/standby.h @@ -4,7 +4,7 @@ * Definitions for hot standby mode. * * - * 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 * * 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/third_party/spanner_pg/src/include/storage/standbydefs.h b/third_party/spanner_pg/src/include/storage/standbydefs.h index d99e6f40..c0234b6c 100644 --- a/third_party/spanner_pg/src/include/storage/standbydefs.h +++ b/third_party/spanner_pg/src/include/storage/standbydefs.h @@ -4,7 +4,7 @@ * Frontend exposed definitions for hot standby mode. * * - * 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 * * src/include/storage/standbydefs.h diff --git a/third_party/spanner_pg/src/include/storage/sync.h b/third_party/spanner_pg/src/include/storage/sync.h index fbdf34f7..9737e1eb 100644 --- a/third_party/spanner_pg/src/include/storage/sync.h +++ b/third_party/spanner_pg/src/include/storage/sync.h @@ -3,7 +3,7 @@ * sync.h * File synchronization management code. * - * 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 * * src/include/storage/sync.h @@ -60,7 +60,6 @@ extern void SyncPreCheckpoint(void); extern void SyncPostCheckpoint(void); extern void ProcessSyncRequests(void); extern void RememberSyncRequest(const FileTag *ftag, SyncRequestType type); -extern void EnableSyncRequestForwarding(void); extern bool RegisterSyncRequest(const FileTag *ftag, SyncRequestType type, bool retryOnError); diff --git a/third_party/spanner_pg/src/include/tcop/cmdtag.h b/third_party/spanner_pg/src/include/tcop/cmdtag.h index f67b2528..b9e8992a 100644 --- a/third_party/spanner_pg/src/include/tcop/cmdtag.h +++ b/third_party/spanner_pg/src/include/tcop/cmdtag.h @@ -3,7 +3,7 @@ * cmdtag.h * Declarations for commandtag names and enumeration. * - * 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 * * src/include/tcop/cmdtag.h diff --git a/third_party/spanner_pg/src/include/tcop/cmdtaglist.h b/third_party/spanner_pg/src/include/tcop/cmdtaglist.h index 9ba24d4c..9e94f44c 100644 --- a/third_party/spanner_pg/src/include/tcop/cmdtaglist.h +++ b/third_party/spanner_pg/src/include/tcop/cmdtaglist.h @@ -8,7 +8,7 @@ * determined by the PG_CMDTAG macro, which is not defined in this file; * it can be defined by the caller for special purposes. * - * 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 * * src/include/tcop/cmdtaglist.h @@ -42,7 +42,7 @@ PG_CMDTAG(CMDTAG_ALTER_FUNCTION, "ALTER FUNCTION", true, false, false) PG_CMDTAG(CMDTAG_ALTER_INDEX, "ALTER INDEX", true, false, false) PG_CMDTAG(CMDTAG_ALTER_LANGUAGE, "ALTER LANGUAGE", true, false, false) PG_CMDTAG(CMDTAG_ALTER_LARGE_OBJECT, "ALTER LARGE OBJECT", true, false, false) -PG_CMDTAG(CMDTAG_ALTER_MATERIALIZED_VIEW, "ALTER MATERIALIZED VIEW", true, false, false) +PG_CMDTAG(CMDTAG_ALTER_MATERIALIZED_VIEW, "ALTER MATERIALIZED VIEW", true, true, false) PG_CMDTAG(CMDTAG_ALTER_OPERATOR, "ALTER OPERATOR", true, false, false) PG_CMDTAG(CMDTAG_ALTER_OPERATOR_CLASS, "ALTER OPERATOR CLASS", true, false, false) PG_CMDTAG(CMDTAG_ALTER_OPERATOR_FAMILY, "ALTER OPERATOR FAMILY", true, false, false) @@ -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/third_party/spanner_pg/src/include/tcop/deparse_utility.h b/third_party/spanner_pg/src/include/tcop/deparse_utility.h index 371c6f33..94de13d9 100644 --- a/third_party/spanner_pg/src/include/tcop/deparse_utility.h +++ b/third_party/spanner_pg/src/include/tcop/deparse_utility.h @@ -2,7 +2,7 @@ * * deparse_utility.h * - * 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 * * src/include/tcop/deparse_utility.h diff --git a/third_party/spanner_pg/src/include/tcop/dest.h b/third_party/spanner_pg/src/include/tcop/dest.h index 88a7e59d..3c3eabae 100644 --- a/third_party/spanner_pg/src/include/tcop/dest.h +++ b/third_party/spanner_pg/src/include/tcop/dest.h @@ -57,7 +57,7 @@ * calls in portal and cursor manipulations. * * - * 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 * * src/include/tcop/dest.h diff --git a/third_party/spanner_pg/src/include/tcop/fastpath.h b/third_party/spanner_pg/src/include/tcop/fastpath.h index c4d7a47d..cb15a16a 100644 --- a/third_party/spanner_pg/src/include/tcop/fastpath.h +++ b/third_party/spanner_pg/src/include/tcop/fastpath.h @@ -3,7 +3,7 @@ * fastpath.h * * - * 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 * * src/include/tcop/fastpath.h diff --git a/third_party/spanner_pg/src/include/tcop/pquery.h b/third_party/spanner_pg/src/include/tcop/pquery.h index 2318f04f..f9a6882e 100644 --- a/third_party/spanner_pg/src/include/tcop/pquery.h +++ b/third_party/spanner_pg/src/include/tcop/pquery.h @@ -4,7 +4,7 @@ * prototypes for pquery.c. * * - * 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 * * src/include/tcop/pquery.h diff --git a/third_party/spanner_pg/src/include/tcop/tcopprot.h b/third_party/spanner_pg/src/include/tcop/tcopprot.h index 96834540..70d9dab2 100644 --- a/third_party/spanner_pg/src/include/tcop/tcopprot.h +++ b/third_party/spanner_pg/src/include/tcop/tcopprot.h @@ -4,7 +4,7 @@ * prototypes for postgres.c. * * - * 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 * * 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 */ @@ -45,11 +45,16 @@ 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, - const char *query_string, - Oid *paramTypes, int numParams, - QueryEnvironment *queryEnv); -extern List *pg_analyze_and_rewrite_params(RawStmt *parsetree, +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, void *parserSetupArg, @@ -75,8 +80,9 @@ extern void ProcessClientWriteInterrupt(bool blocked); extern void process_postgres_switches(int argc, char *argv[], GucContext ctx, const char **dbname); -extern void PostgresMain(int argc, char *argv[], - const char *dbname, +extern void PostgresSingleUserMain(int argc, char *argv[], + const char *username) pg_attribute_noreturn(); +extern void PostgresMain(const char *dbname, const char *username) pg_attribute_noreturn(); extern long get_stack_depth_rlimit(void); extern void ResetUsage(void); diff --git a/third_party/spanner_pg/src/include/tcop/utility.h b/third_party/spanner_pg/src/include/tcop/utility.h index 212e9b32..f9daf5b7 100644 --- a/third_party/spanner_pg/src/include/tcop/utility.h +++ b/third_party/spanner_pg/src/include/tcop/utility.h @@ -4,7 +4,7 @@ * prototypes for utility.c. * * - * 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 * * src/include/tcop/utility.h diff --git a/third_party/spanner_pg/src/include/tsearch/dicts/regis.h b/third_party/spanner_pg/src/include/tsearch/dicts/regis.h index 5411926e..c7c3d9fb 100644 --- a/third_party/spanner_pg/src/include/tsearch/dicts/regis.h +++ b/third_party/spanner_pg/src/include/tsearch/dicts/regis.h @@ -4,7 +4,7 @@ * * Declarations for fast regex subset, used by ISpell * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/tsearch/dicts/regis.h * @@ -38,12 +38,12 @@ typedef struct Regis unused:15; } Regis; -bool RS_isRegis(const char *str); +extern bool RS_isRegis(const char *str); -void RS_compile(Regis *r, bool issuffix, const char *str); -void RS_free(Regis *r); +extern void RS_compile(Regis *r, bool issuffix, const char *str); +extern void RS_free(Regis *r); /*returns true if matches */ -bool RS_execute(Regis *r, char *str); +extern bool RS_execute(Regis *r, char *str); #endif diff --git a/third_party/spanner_pg/src/include/tsearch/dicts/spell.h b/third_party/spanner_pg/src/include/tsearch/dicts/spell.h index e03ed423..978f43a6 100644 --- a/third_party/spanner_pg/src/include/tsearch/dicts/spell.h +++ b/third_party/spanner_pg/src/include/tsearch/dicts/spell.h @@ -4,7 +4,7 @@ * * Declarations for ISpell dictionary * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/tsearch/dicts/spell.h * diff --git a/third_party/spanner_pg/src/include/tsearch/ts_cache.h b/third_party/spanner_pg/src/include/tsearch/ts_cache.h index 888f7028..5e4a49ea 100644 --- a/third_party/spanner_pg/src/include/tsearch/ts_cache.h +++ b/third_party/spanner_pg/src/include/tsearch/ts_cache.h @@ -3,7 +3,7 @@ * ts_cache.h * Tsearch related object caches. * - * 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 * * 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/third_party/spanner_pg/src/include/tsearch/ts_locale.h b/third_party/spanner_pg/src/include/tsearch/ts_locale.h index cfd34b32..7d7c4e16 100644 --- a/third_party/spanner_pg/src/include/tsearch/ts_locale.h +++ b/third_party/spanner_pg/src/include/tsearch/ts_locale.h @@ -3,7 +3,7 @@ * ts_locale.h * locale compatibility layer for tsearch * - * Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Copyright (c) 1998-2022, PostgreSQL Global Development Group * * src/include/tsearch/ts_locale.h * diff --git a/third_party/spanner_pg/src/include/tsearch/ts_public.h b/third_party/spanner_pg/src/include/tsearch/ts_public.h index c9e5888b..fe2a1678 100644 --- a/third_party/spanner_pg/src/include/tsearch/ts_public.h +++ b/third_party/spanner_pg/src/include/tsearch/ts_public.h @@ -4,7 +4,7 @@ * Public interface to various tsearch modules, such as * parsers and dictionaries. * - * Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Copyright (c) 1998-2022, PostgreSQL Global Development Group * * src/include/tsearch/ts_public.h * diff --git a/third_party/spanner_pg/src/include/tsearch/ts_type.h b/third_party/spanner_pg/src/include/tsearch/ts_type.h index 7f44f1b1..689b2d1c 100644 --- a/third_party/spanner_pg/src/include/tsearch/ts_type.h +++ b/third_party/spanner_pg/src/include/tsearch/ts_type.h @@ -3,7 +3,7 @@ * ts_type.h * Definitions for the tsvector and tsquery types * - * Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Copyright (c) 1998-2022, PostgreSQL Global Development Group * * src/include/tsearch/ts_type.h * @@ -169,9 +169,9 @@ 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*/ +/* 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) diff --git a/third_party/spanner_pg/src/include/tsearch/ts_utils.h b/third_party/spanner_pg/src/include/tsearch/ts_utils.h index 42665601..c36c711d 100644 --- a/third_party/spanner_pg/src/include/tsearch/ts_utils.h +++ b/third_party/spanner_pg/src/include/tsearch/ts_utils.h @@ -3,7 +3,7 @@ * ts_utils.h * helper utilities for tsearch * - * Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Copyright (c) 1998-2022, PostgreSQL Global Development Group * * src/include/tsearch/ts_utils.h * diff --git a/third_party/spanner_pg/src/include/utils/acl.h b/third_party/spanner_pg/src/include/utils/acl.h index 0404683b..c4b1e087 100644 --- a/third_party/spanner_pg/src/include/utils/acl.h +++ b/third_party/spanner_pg/src/include/utils/acl.h @@ -4,7 +4,7 @@ * Definition of (and support for) access control list data structures. * * - * 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 * * src/include/utils/acl.h @@ -146,9 +146,11 @@ typedef struct ArrayType Acl; #define ACL_CREATE_CHR 'C' #define ACL_CREATE_TEMP_CHR 'T' #define ACL_CONNECT_CHR 'c' +#define ACL_SET_CHR 's' +#define ACL_ALTER_SYSTEM_CHR 'A' /* string holding all privilege code chars, in order by bitmask position */ -#define ACL_ALL_RIGHTS_STR "arwdDxtXUCTc" +#define ACL_ALL_RIGHTS_STR "arwdDxtXUCTcsA" /* * Bitmasks defining "all rights" for each supported object type @@ -162,6 +164,7 @@ typedef struct ArrayType Acl; #define ACL_ALL_RIGHTS_FUNCTION (ACL_EXECUTE) #define ACL_ALL_RIGHTS_LANGUAGE (ACL_USAGE) #define ACL_ALL_RIGHTS_LARGEOBJECT (ACL_SELECT|ACL_UPDATE) +#define ACL_ALL_RIGHTS_PARAMETER_ACL (ACL_SET|ACL_ALTER_SYSTEM) #define ACL_ALL_RIGHTS_SCHEMA (ACL_USAGE|ACL_CREATE) #define ACL_ALL_RIGHTS_TABLESPACE (ACL_CREATE) #define ACL_ALL_RIGHTS_TYPE (ACL_USAGE) @@ -243,6 +246,10 @@ extern AclMode pg_class_aclmask_ext(Oid table_oid, Oid roleid, bool *is_missing); extern AclMode pg_database_aclmask(Oid db_oid, Oid roleid, AclMode mask, AclMaskHow how); +extern AclMode pg_parameter_aclmask(const char *name, Oid roleid, + AclMode mask, AclMaskHow how); +extern AclMode pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid, + AclMode mask, AclMaskHow how); extern AclMode pg_proc_aclmask(Oid proc_oid, Oid roleid, AclMode mask, AclMaskHow how); extern AclMode pg_language_aclmask(Oid lang_oid, Oid roleid, @@ -271,6 +278,10 @@ extern AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode); extern AclResult pg_class_aclcheck_ext(Oid table_oid, Oid roleid, AclMode mode, bool *is_missing); extern AclResult pg_database_aclcheck(Oid db_oid, Oid roleid, AclMode mode); +extern AclResult pg_parameter_aclcheck(const char *name, Oid roleid, + AclMode mode); +extern AclResult pg_parameter_acl_aclcheck(Oid acl_oid, Oid roleid, + AclMode mode); extern AclResult pg_proc_aclcheck(Oid proc_oid, Oid roleid, AclMode mode); extern AclResult pg_language_aclcheck(Oid lang_oid, Oid roleid, AclMode mode); extern AclResult pg_largeobject_aclcheck_snapshot(Oid lang_oid, Oid roleid, diff --git a/third_party/spanner_pg/src/include/utils/aclchk_internal.h b/third_party/spanner_pg/src/include/utils/aclchk_internal.h index 946ba7aa..361284d8 100644 --- a/third_party/spanner_pg/src/include/utils/aclchk_internal.h +++ b/third_party/spanner_pg/src/include/utils/aclchk_internal.h @@ -2,7 +2,7 @@ * * aclchk_internal.h * - * 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 * * src/include/utils/aclchk_internal.h diff --git a/third_party/spanner_pg/src/include/utils/array.h b/third_party/spanner_pg/src/include/utils/array.h index 0d6db51b..b4327b4d 100644 --- a/third_party/spanner_pg/src/include/utils/array.h +++ b/third_party/spanner_pg/src/include/utils/array.h @@ -51,7 +51,7 @@ * arrays holding the elements. * * - * 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 * * src/include/utils/array.h @@ -346,7 +346,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/third_party/spanner_pg/src/include/utils/arrayaccess.h b/third_party/spanner_pg/src/include/utils/arrayaccess.h index d0483b2a..7ad01d01 100644 --- a/third_party/spanner_pg/src/include/utils/arrayaccess.h +++ b/third_party/spanner_pg/src/include/utils/arrayaccess.h @@ -4,7 +4,7 @@ * Declarations for element-by-element access to Postgres arrays. * * - * 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 * * src/include/utils/arrayaccess.h diff --git a/third_party/spanner_pg/src/include/utils/ascii.h b/third_party/spanner_pg/src/include/utils/ascii.h index c246f407..4e3a1d4a 100644 --- a/third_party/spanner_pg/src/include/utils/ascii.h +++ b/third_party/spanner_pg/src/include/utils/ascii.h @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------- * ascii.h * - * Portions Copyright (c) 1999-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2022, PostgreSQL Global Development Group * * src/include/utils/ascii.h * @@ -13,4 +13,56 @@ extern void ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz); +/* + * Verify a chunk of bytes for valid ASCII. + * + * Returns false if the input contains any zero bytes or bytes with the + * high-bit set. Input len must be a multiple of 8. + */ +static inline bool +is_valid_ascii(const unsigned char *s, int len) +{ + uint64 chunk, + highbit_cum = UINT64CONST(0), + zero_cum = UINT64CONST(0x8080808080808080); + + Assert(len % sizeof(chunk) == 0); + + while (len > 0) + { + memcpy(&chunk, s, sizeof(chunk)); + + /* + * Capture any zero bytes in this chunk. + * + * First, add 0x7f to each byte. This sets the high bit in each byte, + * unless it was a zero. If any resulting high bits are zero, the + * corresponding high bits in the zero accumulator will be cleared. + * + * If none of the bytes in the chunk had the high bit set, the max + * value each byte can have after the addition is 0x7f + 0x7f = 0xfe, + * and we don't need to worry about carrying over to the next byte. If + * any input bytes did have the high bit set, it doesn't matter + * because we check for those separately. + */ + zero_cum &= (chunk + UINT64CONST(0x7f7f7f7f7f7f7f7f)); + + /* Capture any set bits in this chunk. */ + highbit_cum |= chunk; + + s += sizeof(chunk); + len -= sizeof(chunk); + } + + /* Check if any high bits in the high bit accumulator got set. */ + if (highbit_cum & UINT64CONST(0x8080808080808080)) + return false; + + /* Check if any high bits in the zero accumulator got cleared. */ + if (zero_cum != UINT64CONST(0x8080808080808080)) + return false; + + return true; +} + #endif /* _ASCII_H_ */ diff --git a/third_party/spanner_pg/src/include/utils/attoptcache.h b/third_party/spanner_pg/src/include/utils/attoptcache.h index f55a9b6e..ee37af95 100644 --- a/third_party/spanner_pg/src/include/utils/attoptcache.h +++ b/third_party/spanner_pg/src/include/utils/attoptcache.h @@ -3,7 +3,7 @@ * attoptcache.h * Attribute options cache. * - * 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 * * src/include/utils/attoptcache.h @@ -23,6 +23,6 @@ typedef struct AttributeOpts float8 n_distinct_inherited; } AttributeOpts; -AttributeOpts *get_attribute_options(Oid spcid, int attnum); +extern AttributeOpts *get_attribute_options(Oid spcid, int attnum); #endif /* ATTOPTCACHE_H */ diff --git a/third_party/spanner_pg/src/include/utils/backend_progress.h b/third_party/spanner_pg/src/include/utils/backend_progress.h index 53bddf66..47bf8029 100644 --- a/third_party/spanner_pg/src/include/utils/backend_progress.h +++ b/third_party/spanner_pg/src/include/utils/backend_progress.h @@ -6,7 +6,7 @@ * backend's command progress counters, without ascribing meaning to the * individual fields. See commands/progress.h and system_views.sql for that. * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * src/include/utils/backend_progress.h * ---------- diff --git a/third_party/spanner_pg/src/include/utils/backend_status.h b/third_party/spanner_pg/src/include/utils/backend_status.h index 8042b817..7403bca2 100644 --- a/third_party/spanner_pg/src/include/utils/backend_status.h +++ b/third_party/spanner_pg/src/include/utils/backend_status.h @@ -2,7 +2,7 @@ * backend_status.h * Definitions related to backend status reporting * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/utils/builtins.h b/third_party/spanner_pg/src/include/utils/builtins.h index dad75a10..4d6fba46 100644 --- a/third_party/spanner_pg/src/include/utils/builtins.h +++ b/third_party/spanner_pg/src/include/utils/builtins.h @@ -4,7 +4,7 @@ * Declarations for operations on built-in types. * * - * 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 * * src/include/utils/builtins.h @@ -44,9 +44,9 @@ extern void namestrcpy(Name name, const char *str); extern int namestrcmp(Name name, const char *str); /* numutils.c */ -extern int32 pg_atoi(const char *s, int size, int c); extern int16 pg_strtoint16(const char *s); extern int32 pg_strtoint32(const char *s); +extern int64 pg_strtoint64(const char *s); extern int pg_itoa(int16 i, char *a); extern int pg_ultoa_n(uint32 l, char *a); extern int pg_ulltoa_n(uint64 l, char *a); @@ -54,7 +54,6 @@ extern int pg_ltoa(int32 l, char *a); extern int pg_lltoa(int64 ll, char *a); extern char *pg_ultostr_zeropad(char *str, uint32 value, int32 minwidth); extern char *pg_ultostr(char *str, uint32 value); -extern uint64 pg_strtouint64(const char *str, char **endptr, int base); /* oid.c */ extern oidvector *buildoidvector(const Oid *oids, int n); @@ -66,7 +65,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 void simple_quote_literal(StringInfo buf, const char* val); extern char *quote_qualified_identifier(const char *qualifier, diff --git a/third_party/spanner_pg/src/include/utils/bytea.h b/third_party/spanner_pg/src/include/utils/bytea.h index eb9df9e4..c3c9e547 100644 --- a/third_party/spanner_pg/src/include/utils/bytea.h +++ b/third_party/spanner_pg/src/include/utils/bytea.h @@ -4,7 +4,7 @@ * Declarations for BYTEA data type support. * * - * 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 * * 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/third_party/spanner_pg/src/include/utils/catcache.h b/third_party/spanner_pg/src/include/utils/catcache.h index 31c40bfc..a3af5ee5 100644 --- a/third_party/spanner_pg/src/include/utils/catcache.h +++ b/third_party/spanner_pg/src/include/utils/catcache.h @@ -10,7 +10,7 @@ * guarantee that there can only be one matching row for a key combination. * * - * 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 * * src/include/utils/catcache.h diff --git a/third_party/spanner_pg/src/include/utils/combocid.h b/third_party/spanner_pg/src/include/utils/combocid.h index 7f2e1f70..80fe6d2c 100644 --- a/third_party/spanner_pg/src/include/utils/combocid.h +++ b/third_party/spanner_pg/src/include/utils/combocid.h @@ -4,7 +4,7 @@ * Combo command ID support routines * * - * 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 * * src/include/utils/combocid.h diff --git a/third_party/spanner_pg/src/include/utils/date.h b/third_party/spanner_pg/src/include/utils/date.h index 9bfec8c0..921aa565 100644 --- a/third_party/spanner_pg/src/include/utils/date.h +++ b/third_party/spanner_pg/src/include/utils/date.h @@ -4,7 +4,7 @@ * Definitions for the SQL "date" and "time" types. * * - * 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 * * src/include/utils/date.h diff --git a/third_party/spanner_pg/src/include/utils/datetime.h b/third_party/spanner_pg/src/include/utils/datetime.h index b56086c9..4527e825 100644 --- a/third_party/spanner_pg/src/include/utils/datetime.h +++ b/third_party/spanner_pg/src/include/utils/datetime.h @@ -6,7 +6,7 @@ * including date, and time. * * - * 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 * * 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. @@ -300,9 +301,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 +316,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/third_party/spanner_pg/src/include/utils/datum.h b/third_party/spanner_pg/src/include/utils/datum.h index 8a59f110..d7de961f 100644 --- a/third_party/spanner_pg/src/include/utils/datum.h +++ b/third_party/spanner_pg/src/include/utils/datum.h @@ -8,7 +8,7 @@ * of the Datum. (We do it this way because in most situations the caller * can look up the info just once and use it for many per-datum operations.) * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/datum.h diff --git a/third_party/spanner_pg/src/include/utils/dsa.h b/third_party/spanner_pg/src/include/utils/dsa.h index 74b69de6..405606fe 100644 --- a/third_party/spanner_pg/src/include/utils/dsa.h +++ b/third_party/spanner_pg/src/include/utils/dsa.h @@ -3,7 +3,7 @@ * dsa.h * Dynamic shared memory areas. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/utils/dynahash.h b/third_party/spanner_pg/src/include/utils/dynahash.h index 2f6adc2e..4564fb24 100644 --- a/third_party/spanner_pg/src/include/utils/dynahash.h +++ b/third_party/spanner_pg/src/include/utils/dynahash.h @@ -1,13 +1,14 @@ /*------------------------------------------------------------------------- * - * dynahash + * dynahash.h * POSTGRES dynahash.h file definitions * * - * 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 * - * src/include/utils/dynahash.h + * IDENTIFICATION + * src/include/utils/dynahash.h * *------------------------------------------------------------------------- */ diff --git a/third_party/spanner_pg/src/include/utils/elog.h b/third_party/spanner_pg/src/include/utils/elog.h index aa38a491..e0f76469 100644 --- a/third_party/spanner_pg/src/include/utils/elog.h +++ b/third_party/spanner_pg/src/include/utils/elog.h @@ -4,7 +4,7 @@ * POSTGRES error reporting/logging definitions. * * - * 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 * * src/include/utils/elog.h @@ -468,24 +468,38 @@ 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 #define LOG_DESTINATION_SYSLOG 2 #define LOG_DESTINATION_EVENTLOG 4 #define LOG_DESTINATION_CSVLOG 8 +#define LOG_DESTINATION_JSONLOG 16 /* Other exported functions */ extern void DebugFileOpen(void); extern char *unpack_sql_state(int sql_state); extern bool in_error_recursion_trouble(void); +/* Common functions shared across destinations */ +extern void reset_formatted_start_time(void); +extern char *get_formatted_start_time(void); +extern char *get_formatted_log_time(void); +extern const char *get_backend_type_for_log(void); +extern bool check_log_of_query(ErrorData *edata); +extern const char *error_severity(int elevel); +extern void write_pipe_chunks(char *data, int len, int dest); + +/* Destination-specific functions */ +extern void write_csvlog(ErrorData *edata); +extern void write_jsonlog(ErrorData *edata); + #ifdef HAVE_SYSLOG extern void set_syslog_parameters(const char *ident, int facility); #endif diff --git a/third_party/spanner_pg/src/include/utils/evtcache.h b/third_party/spanner_pg/src/include/utils/evtcache.h index 58ddb71c..ddb67a68 100644 --- a/third_party/spanner_pg/src/include/utils/evtcache.h +++ b/third_party/spanner_pg/src/include/utils/evtcache.h @@ -3,7 +3,7 @@ * evtcache.h * Special-purpose cache for event trigger data. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/utils/expandeddatum.h b/third_party/spanner_pg/src/include/utils/expandeddatum.h index f1815a8c..ffdb0c45 100644 --- a/third_party/spanner_pg/src/include/utils/expandeddatum.h +++ b/third_party/spanner_pg/src/include/utils/expandeddatum.h @@ -34,7 +34,7 @@ * value if they fail partway through. * * - * 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 * * src/include/utils/expandeddatum.h diff --git a/third_party/spanner_pg/src/include/utils/expandedrecord.h b/third_party/spanner_pg/src/include/utils/expandedrecord.h index 0f744b17..be60e2ce 100644 --- a/third_party/spanner_pg/src/include/utils/expandedrecord.h +++ b/third_party/spanner_pg/src/include/utils/expandedrecord.h @@ -3,7 +3,7 @@ * expandedrecord.h * Declarations for composite expanded objects. * - * 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 * * src/include/utils/expandedrecord.h diff --git a/third_party/spanner_pg/src/include/utils/float.h b/third_party/spanner_pg/src/include/utils/float.h index fcf7bd58..4bf0e3ac 100644 --- a/third_party/spanner_pg/src/include/utils/float.h +++ b/third_party/spanner_pg/src/include/utils/float.h @@ -3,7 +3,7 @@ * float.h * Definitions for the built-in floating-point types * - * 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/third_party/spanner_pg/src/include/utils/fmgrtab.h b/third_party/spanner_pg/src/include/utils/fmgrtab.h index 21a5f211..0a599376 100644 --- a/third_party/spanner_pg/src/include/utils/fmgrtab.h +++ b/third_party/spanner_pg/src/include/utils/fmgrtab.h @@ -3,7 +3,7 @@ * fmgrtab.h * The function manager's table of internal functions. * - * 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 * * 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/third_party/spanner_pg/src/include/utils/formatting.h b/third_party/spanner_pg/src/include/utils/formatting.h index 99e7dd6d..72a91153 100644 --- a/third_party/spanner_pg/src/include/utils/formatting.h +++ b/third_party/spanner_pg/src/include/utils/formatting.h @@ -4,7 +4,7 @@ * src/include/utils/formatting.h * * - * Portions Copyright (c) 1999-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2022, PostgreSQL Global Development Group * * The PostgreSQL routines for a DateTime/int/float/numeric formatting, * inspired by the Oracle TO_CHAR() / TO_DATE() / TO_NUMBER() routines. diff --git a/third_party/spanner_pg/src/include/utils/freepage.h b/third_party/spanner_pg/src/include/utils/freepage.h index b02ca452..e69b2804 100644 --- a/third_party/spanner_pg/src/include/utils/freepage.h +++ b/third_party/spanner_pg/src/include/utils/freepage.h @@ -3,7 +3,7 @@ * freepage.h * Management of page-organized free memory. * - * 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 * * src/include/utils/freepage.h diff --git a/third_party/spanner_pg/src/include/utils/geo_decls.h b/third_party/spanner_pg/src/include/utils/geo_decls.h index 0b87437d..71903077 100644 --- a/third_party/spanner_pg/src/include/utils/geo_decls.h +++ b/third_party/spanner_pg/src/include/utils/geo_decls.h @@ -3,7 +3,7 @@ * geo_decls.h - Declarations for various 2D constructs. * * - * 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 * * src/include/utils/geo_decls.h diff --git a/third_party/spanner_pg/src/include/utils/guc.h b/third_party/spanner_pg/src/include/utils/guc.h index bdff0734..62430c91 100644 --- a/third_party/spanner_pg/src/include/utils/guc.h +++ b/third_party/spanner_pg/src/include/utils/guc.h @@ -4,7 +4,7 @@ * External declarations pertaining to backend/utils/misc/guc.c and * backend/utils/misc/guc-file.l * - * Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Copyright (c) 2000-2022, PostgreSQL Global Development Group * Written by Peter Eisentraut . * * src/include/utils/guc.h @@ -83,8 +83,7 @@ typedef enum * override the postmaster command line.) Tracking the source allows us * to process sources in any convenient order without affecting results. * Sources <= PGC_S_OVERRIDE will set the default used by RESET, as well - * as the current value. Note that source == PGC_S_OVERRIDE should be - * used when setting a PGC_INTERNAL option. + * as the current value. * * PGC_S_INTERACTIVE isn't actually a source value, but is the * dividing line between "interactive" and "non-interactive" sources for @@ -99,6 +98,11 @@ typedef enum * shouldn't throw hard errors in this case, at most NOTICEs, since the * objects might exist by the time the setting is used for real. * + * When setting the value of a non-compile-time-constant PGC_INTERNAL option, + * source == PGC_S_DYNAMIC_DEFAULT should typically be used so that the value + * will show as "default" in pg_settings. If there is a specific reason not + * to want that, use source == PGC_S_OVERRIDE. + * * NB: see GucSource_Names in guc.c if you change this. */ typedef enum @@ -229,57 +233,63 @@ typedef enum #define GUC_EXPLAIN 0x100000 /* include in explain */ +/* + * GUC_RUNTIME_COMPUTED is intended for runtime-computed GUCs that are only + * available via 'postgres -C' if the server is not running. + */ +#define GUC_RUNTIME_COMPUTED 0x200000 + #define GUC_UNIT (GUC_UNIT_MEMORY | GUC_UNIT_TIME) /* 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 char *cluster_name; +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 /* @@ -348,14 +358,20 @@ 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); extern const char *GetConfigOptionResetString(const char *name); extern int GetConfigOptionFlags(const char *name, bool missing_ok); 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_UNUSED_SPANGRES(void); +extern void InitializeWalConsistencyChecking(void); extern bool SelectConfigFiles(const char *userDoption, const char *progname); extern void ResetAllOptions(void); extern void AtStart_GUC(void); @@ -372,6 +388,11 @@ extern int set_config_option(const char *name, const char *value, GucContext context, GucSource source, GucAction action, bool changeVal, int elevel, bool is_reload); +extern int set_config_option_ext(const char *name, const char *value, + GucContext context, GucSource source, + Oid srole, + GucAction action, bool changeVal, int elevel, + bool is_reload); extern void AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt); extern char *GetConfigOptionByName(const char *name, const char **varname, bool missing_ok); @@ -441,4 +462,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/third_party/spanner_pg/src/include/utils/guc_tables.h b/third_party/spanner_pg/src/include/utils/guc_tables.h index 5c37577b..47e78190 100644 --- a/third_party/spanner_pg/src/include/utils/guc_tables.h +++ b/third_party/spanner_pg/src/include/utils/guc_tables.h @@ -5,7 +5,7 @@ * * See src/backend/utils/misc/README for design notes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * 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, @@ -82,7 +83,7 @@ enum config_group LOGGING_WHAT, PROCESS_TITLE, STATS_MONITORING, - STATS_COLLECTOR, + STATS_CUMULATIVE, AUTOVACUUM, CLIENT_CONN_STATEMENT, CLIENT_CONN_LOCALE, @@ -119,6 +120,8 @@ typedef struct guc_stack /* masked value's source must be PGC_S_SESSION, so no need to store it */ GucContext scontext; /* context that set the prior value */ GucContext masked_scontext; /* context that set the masked value */ + Oid srole; /* role that set the prior value */ + Oid masked_srole; /* role that set the masked value */ config_var_value prior; /* previous value of variable */ config_var_value masked; /* SET value in a GUC_SET_LOCAL entry */ } GucStack; @@ -130,6 +133,10 @@ typedef struct guc_stack * applications may use the long description as well, and will append * it to the short description. (separated by a newline or '. ') * + * srole is the role that set the current value, or BOOTSTRAP_SUPERUSERID + * if the value came from an internal source or the config file. Similarly + * for reset_srole (which is usually BOOTSTRAP_SUPERUSERID, but not always). + * * Note that sourcefile/sourceline are kept here, and not pushed into stacked * values, although in principle they belong with some stacked value if the * active value is session- or transaction-local. This is to avoid bloating @@ -151,6 +158,8 @@ struct config_generic GucSource reset_source; /* source of the reset_value */ GucContext scontext; /* context that set the current value */ GucContext reset_scontext; /* context that set the reset value */ + Oid srole; /* role that set the current value */ + Oid reset_srole; /* role that set the reset value */ GucStack *stack; /* stacked prior values */ void *extra; /* "extra" pointer for current actual value */ char *last_reported; /* if variable is GUC_REPORT, value last sent @@ -258,10 +267,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/third_party/spanner_pg/src/include/utils/help_config.h b/third_party/spanner_pg/src/include/utils/help_config.h index 3f277c74..dc23ae2e 100644 --- a/third_party/spanner_pg/src/include/utils/help_config.h +++ b/third_party/spanner_pg/src/include/utils/help_config.h @@ -3,7 +3,7 @@ * help_config.h * Interface to the --help-config option of main.c * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/utils/help_config.h * diff --git a/third_party/spanner_pg/src/include/utils/hsearch.h b/third_party/spanner_pg/src/include/utils/hsearch.h index d7af0239..854c3312 100644 --- a/third_party/spanner_pg/src/include/utils/hsearch.h +++ b/third_party/spanner_pg/src/include/utils/hsearch.h @@ -4,7 +4,7 @@ * exported definitions for utils/hash/dynahash.c; see notes therein * * - * 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 * * src/include/utils/hsearch.h diff --git a/third_party/spanner_pg/src/include/utils/index_selfuncs.h b/third_party/spanner_pg/src/include/utils/index_selfuncs.h index 289b1b70..6483522e 100644 --- a/third_party/spanner_pg/src/include/utils/index_selfuncs.h +++ b/third_party/spanner_pg/src/include/utils/index_selfuncs.h @@ -9,7 +9,7 @@ * If you make it depend on anything besides access/amapi.h, that's likely * a mistake. * - * 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 * * src/include/utils/index_selfuncs.h diff --git a/third_party/spanner_pg/src/include/utils/inet.h b/third_party/spanner_pg/src/include/utils/inet.h index d8c59ca6..3073c030 100644 --- a/third_party/spanner_pg/src/include/utils/inet.h +++ b/third_party/spanner_pg/src/include/utils/inet.h @@ -4,7 +4,7 @@ * Declarations for operations on INET datatypes. * * - * 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 * * src/include/utils/inet.h diff --git a/third_party/spanner_pg/src/include/utils/int8.h b/third_party/spanner_pg/src/include/utils/int8.h deleted file mode 100644 index 6571188f..00000000 --- a/third_party/spanner_pg/src/include/utils/int8.h +++ /dev/null @@ -1,25 +0,0 @@ -/*------------------------------------------------------------------------- - * - * int8.h - * Declarations for operations on 64-bit integers. - * - * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * src/include/utils/int8.h - * - * NOTES - * These data types are supported on all 64-bit architectures, and may - * be supported through libraries on some 32-bit machines. If your machine - * is not currently supported, then please try to make it so, then post - * patches to the postgresql.org hackers mailing list. - * - *------------------------------------------------------------------------- - */ -#ifndef INT8_H -#define INT8_H - -extern bool scanint8(const char *str, bool errorOK, int64 *result); - -#endif /* INT8_H */ diff --git a/third_party/spanner_pg/src/include/utils/inval.h b/third_party/spanner_pg/src/include/utils/inval.h index 877e66c6..0e0323b9 100644 --- a/third_party/spanner_pg/src/include/utils/inval.h +++ b/third_party/spanner_pg/src/include/utils/inval.h @@ -4,7 +4,7 @@ * POSTGRES cache invalidation dispatcher definitions. * * - * 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 * * src/include/utils/inval.h diff --git a/third_party/spanner_pg/src/include/utils/json.h b/third_party/spanner_pg/src/include/utils/json.h index 7daf09f2..8a84a0cd 100644 --- a/third_party/spanner_pg/src/include/utils/json.h +++ b/third_party/spanner_pg/src/include/utils/json.h @@ -3,7 +3,7 @@ * json.h * Declarations for JSON data type support. * - * 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 * * src/include/utils/json.h diff --git a/third_party/spanner_pg/src/include/utils/jsonb.h b/third_party/spanner_pg/src/include/utils/jsonb.h index 4e07debf..4cbe6edf 100644 --- a/third_party/spanner_pg/src/include/utils/jsonb.h +++ b/third_party/spanner_pg/src/include/utils/jsonb.h @@ -3,7 +3,7 @@ * jsonb.h * Declarations for jsonb data type support. * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/utils/jsonb.h * diff --git a/third_party/spanner_pg/src/include/utils/jsonfuncs.h b/third_party/spanner_pg/src/include/utils/jsonfuncs.h index 0ca48591..865b2ff7 100644 --- a/third_party/spanner_pg/src/include/utils/jsonfuncs.h +++ b/third_party/spanner_pg/src/include/utils/jsonfuncs.h @@ -3,7 +3,7 @@ * jsonfuncs.h * Functions to process JSON data types. * - * 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 * * src/include/utils/jsonfuncs.h diff --git a/third_party/spanner_pg/src/include/utils/jsonpath.h b/third_party/spanner_pg/src/include/utils/jsonpath.h index 87d302b7..cd0b5d5b 100644 --- a/third_party/spanner_pg/src/include/utils/jsonpath.h +++ b/third_party/spanner_pg/src/include/utils/jsonpath.h @@ -3,7 +3,7 @@ * jsonpath.h * Definitions for jsonpath datatype * - * Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Copyright (c) 2019-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/utils/jsonpath.h diff --git a/third_party/spanner_pg/src/include/utils/logtape.h b/third_party/spanner_pg/src/include/utils/logtape.h index 85d2e03c..8c742ac4 100644 --- a/third_party/spanner_pg/src/include/utils/logtape.h +++ b/third_party/spanner_pg/src/include/utils/logtape.h @@ -5,7 +5,7 @@ * * See logtape.c for explanations. * - * 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 * * src/include/utils/logtape.h @@ -18,9 +18,13 @@ #include "storage/sharedfileset.h" -/* LogicalTapeSet is an opaque type whose details are not known outside logtape.c. */ - +/* + * LogicalTapeSet and LogicalTape are opaque types whose details are not + * known outside logtape.c. + */ typedef struct LogicalTapeSet LogicalTapeSet; +typedef struct LogicalTape LogicalTape; + /* * The approach tuplesort.c takes to parallel external sorts is that workers, @@ -54,27 +58,20 @@ typedef struct TapeShare * prototypes for functions in logtape.c */ -extern LogicalTapeSet *LogicalTapeSetCreate(int ntapes, bool preallocate, - TapeShare *shared, +extern LogicalTapeSet *LogicalTapeSetCreate(bool preallocate, SharedFileSet *fileset, int worker); +extern void LogicalTapeClose(LogicalTape *lt); extern void LogicalTapeSetClose(LogicalTapeSet *lts); +extern LogicalTape *LogicalTapeCreate(LogicalTapeSet *lts); +extern LogicalTape *LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared); extern void LogicalTapeSetForgetFreeSpace(LogicalTapeSet *lts); -extern size_t LogicalTapeRead(LogicalTapeSet *lts, int tapenum, - void *ptr, size_t size); -extern void LogicalTapeWrite(LogicalTapeSet *lts, int tapenum, - void *ptr, size_t size); -extern void LogicalTapeRewindForRead(LogicalTapeSet *lts, int tapenum, - size_t buffer_size); -extern void LogicalTapeRewindForWrite(LogicalTapeSet *lts, int tapenum); -extern void LogicalTapeFreeze(LogicalTapeSet *lts, int tapenum, - TapeShare *share); -extern void LogicalTapeSetExtend(LogicalTapeSet *lts, int nAdditional); -extern size_t LogicalTapeBackspace(LogicalTapeSet *lts, int tapenum, - size_t size); -extern void LogicalTapeSeek(LogicalTapeSet *lts, int tapenum, - long blocknum, int offset); -extern void LogicalTapeTell(LogicalTapeSet *lts, int tapenum, - long *blocknum, int *offset); +extern size_t LogicalTapeRead(LogicalTape *lt, void *ptr, size_t size); +extern void LogicalTapeWrite(LogicalTape *lt, void *ptr, size_t size); +extern void LogicalTapeRewindForRead(LogicalTape *lt, size_t buffer_size); +extern void LogicalTapeFreeze(LogicalTape *lt, TapeShare *share); +extern size_t LogicalTapeBackspace(LogicalTape *lt, size_t size); +extern void LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset); +extern void LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset); extern long LogicalTapeSetBlocks(LogicalTapeSet *lts); #endif /* LOGTAPE_H */ diff --git a/third_party/spanner_pg/src/include/utils/lsyscache.h b/third_party/spanner_pg/src/include/utils/lsyscache.h index 7501b102..ed4418e5 100644 --- a/third_party/spanner_pg/src/include/utils/lsyscache.h +++ b/third_party/spanner_pg/src/include/utils/lsyscache.h @@ -3,7 +3,7 @@ * lsyscache.h * Convenience routines for common queries in the system catalog cache. * - * 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 * * src/include/utils/lsyscache.h diff --git a/third_party/spanner_pg/src/include/utils/memdebug.h b/third_party/spanner_pg/src/include/utils/memdebug.h index e88b4c6e..6876e0ac 100644 --- a/third_party/spanner_pg/src/include/utils/memdebug.h +++ b/third_party/spanner_pg/src/include/utils/memdebug.h @@ -7,7 +7,7 @@ * empty definitions for Valgrind client request macros we use. * * - * 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 * * src/include/utils/memdebug.h diff --git a/third_party/spanner_pg/src/include/utils/memutils.h b/third_party/spanner_pg/src/include/utils/memutils.h index 650bdf99..08b4acea 100644 --- a/third_party/spanner_pg/src/include/utils/memutils.h +++ b/third_party/spanner_pg/src/include/utils/memutils.h @@ -7,7 +7,7 @@ * of the API of the memory management subsystem. * * - * 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 * * src/include/utils/memutils.h @@ -189,7 +189,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 diff --git a/third_party/spanner_pg/src/include/utils/multirangetypes.h b/third_party/spanner_pg/src/include/utils/multirangetypes.h index 70e9a537..915330f9 100644 --- a/third_party/spanner_pg/src/include/utils/multirangetypes.h +++ b/third_party/spanner_pg/src/include/utils/multirangetypes.h @@ -4,7 +4,7 @@ * Declarations for Postgres multirange types. * * - * 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 * * src/include/utils/multirangetypes.h diff --git a/third_party/spanner_pg/src/include/utils/numeric.h b/third_party/spanner_pg/src/include/utils/numeric.h index dfc8688c..3caa74df 100644 --- a/third_party/spanner_pg/src/include/utils/numeric.h +++ b/third_party/spanner_pg/src/include/utils/numeric.h @@ -5,7 +5,7 @@ * * Original coding 1998, Jan Wieck. Heavily revised 2003, Tom Lane. * - * Copyright (c) 1998-2021, PostgreSQL Global Development Group + * Copyright (c) 1998-2022, PostgreSQL Global Development Group * * src/include/utils/numeric.h * @@ -17,12 +17,22 @@ #include "fmgr.h" /* - * Limit on the precision (and hence scale) specifiable in a NUMERIC typmod. - * Note that the implementation limit on the length of a numeric value is - * much larger --- beware of what you use this for! + * Limits on the precision and scale specifiable in a NUMERIC typmod. The + * precision is strictly positive, but the scale may be positive or negative. + * A negative scale implies rounding before the decimal point. + * + * Note that the minimum display scale defined below is zero --- we always + * display all digits before the decimal point, even when the scale is + * negative. + * + * Note that the implementation limits on the precision and display scale of a + * numeric value are much larger --- beware of what you use these for! */ #define NUMERIC_MAX_PRECISION 1000 +#define NUMERIC_MIN_SCALE (-1000) +#define NUMERIC_MAX_SCALE 1000 + /* * Internal limits on the scales chosen for calculation results */ @@ -58,7 +68,7 @@ typedef struct NumericData *Numeric; */ extern bool numeric_is_nan(Numeric num); extern bool numeric_is_inf(Numeric num); -int32 numeric_maximum_size(int32 typmod); +extern int32 numeric_maximum_size(int32 typmod); extern char *numeric_out_sci(Numeric num, int scale); extern char *numeric_normalize(Numeric num); diff --git a/third_party/spanner_pg/src/include/utils/old_snapshot.h b/third_party/spanner_pg/src/include/utils/old_snapshot.h index c9c73f11..e5b9d357 100644 --- a/third_party/spanner_pg/src/include/utils/old_snapshot.h +++ b/third_party/spanner_pg/src/include/utils/old_snapshot.h @@ -3,7 +3,7 @@ * old_snapshot.h * Data structures for 'snapshot too old' * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/include/utils/palloc.h b/third_party/spanner_pg/src/include/utils/palloc.h index 092118c0..e51f0276 100644 --- a/third_party/spanner_pg/src/include/utils/palloc.h +++ b/third_party/spanner_pg/src/include/utils/palloc.h @@ -18,7 +18,7 @@ * everything that should be freed. See utils/mmgr/README for more info. * * - * 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 * * src/include/utils/palloc.h diff --git a/third_party/spanner_pg/src/include/utils/partcache.h b/third_party/spanner_pg/src/include/utils/partcache.h index a451bfb2..3394e1fc 100644 --- a/third_party/spanner_pg/src/include/utils/partcache.h +++ b/third_party/spanner_pg/src/include/utils/partcache.h @@ -2,7 +2,7 @@ * * partcache.h * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/include/utils/partcache.h * diff --git a/third_party/spanner_pg/src/include/utils/pg_crc.h b/third_party/spanner_pg/src/include/utils/pg_crc.h index dfbae9d8..48a064ec 100644 --- a/third_party/spanner_pg/src/include/utils/pg_crc.h +++ b/third_party/spanner_pg/src/include/utils/pg_crc.h @@ -26,7 +26,7 @@ * * The CRC-32C variant is in port/pg_crc32c.h. * - * 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 * * src/include/utils/pg_crc.h diff --git a/third_party/spanner_pg/src/include/utils/pg_locale.h b/third_party/spanner_pg/src/include/utils/pg_locale.h index c1b68e4e..cf5fc92b 100644 --- a/third_party/spanner_pg/src/include/utils/pg_locale.h +++ b/third_party/spanner_pg/src/include/utils/pg_locale.h @@ -4,7 +4,7 @@ * * src/include/utils/pg_locale.h * - * Copyright (c) 2002-2021, PostgreSQL Global Development Group + * Copyright (c) 2002-2022, PostgreSQL Global Development Group * *----------------------------------------------------------------------- */ @@ -34,22 +34,27 @@ #endif #endif +/* use for libc locale names */ +#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 */ // SPANGRES BEGIN // Defined in `shims/pg_locale.h` -extern char *localized_abbrev_days_UNUSED_SPANGRES[]; -extern char *localized_full_days_UNUSED_SPANGRES[]; -extern char *localized_abbrev_months_UNUSED_SPANGRES[]; -extern char *localized_full_months_UNUSED_SPANGRES[]; +extern PGDLLIMPORT char *localized_abbrev_days_UNUSED_SPANGRES[]; +extern PGDLLIMPORT char *localized_full_days_UNUSED_SPANGRES[]; +extern PGDLLIMPORT char *localized_abbrev_months_UNUSED_SPANGRES[]; +extern PGDLLIMPORT char *localized_full_months_UNUSED_SPANGRES[]; // SPANGRES END +/* is the databases's LC_CTYPE the C locale? */ +extern PGDLLIMPORT bool database_ctype_is_c; + extern bool check_locale_messages(char **newval, void **extra, GucSource source); extern void assign_locale_messages(const char *newval, void *extra); extern bool check_locale_monetary(char **newval, void **extra, GucSource source); @@ -106,6 +111,11 @@ struct pg_locale_struct typedef struct pg_locale_struct *pg_locale_t; +extern PGDLLIMPORT 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); @@ -114,6 +124,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/third_party/spanner_pg/src/include/utils/pg_lsn.h b/third_party/spanner_pg/src/include/utils/pg_lsn.h index eeeac5cc..7b708f10 100644 --- a/third_party/spanner_pg/src/include/utils/pg_lsn.h +++ b/third_party/spanner_pg/src/include/utils/pg_lsn.h @@ -5,7 +5,7 @@ * PostgreSQL. * * - * 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 * * src/include/utils/pg_lsn.h diff --git a/third_party/spanner_pg/src/include/utils/pg_rusage.h b/third_party/spanner_pg/src/include/utils/pg_rusage.h index c0def804..a6344abd 100644 --- a/third_party/spanner_pg/src/include/utils/pg_rusage.h +++ b/third_party/spanner_pg/src/include/utils/pg_rusage.h @@ -4,7 +4,7 @@ * header file for resource usage measurement support routines * * - * 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 * * src/include/utils/pg_rusage.h diff --git a/third_party/spanner_pg/src/include/utils/pgstat_internal.h b/third_party/spanner_pg/src/include/utils/pgstat_internal.h new file mode 100644 index 00000000..4b65dfef --- /dev/null +++ b/third_party/spanner_pg/src/include/utils/pgstat_internal.h @@ -0,0 +1,784 @@ +/* ---------- + * pgstat_internal.h + * + * Definitions for the PostgreSQL cumulative statistics system 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 "common/hashfn.h" +#include "lib/dshash.h" +#include "lib/ilist.h" +#include "pgstat.h" +#include "storage/lwlock.h" +#include "utils/dsa.h" + + +/* + * 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. + */ + +/* 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. + */ +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; + + +/* + * 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 */ + + /* + * 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; + + /* + * 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; + + +/* + * 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 PgStat_HashKey *key, + 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", + "MultiXactMember", + "MultiXactOffset", + "Notify", + "Serial", + "Subtrans", + "Xact", + "other" /* has to be last */ +}; + +#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 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 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 pgstat_report_disconnect(Oid dboid); +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 bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); + + +/* + * 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 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 PgStat_HashKey *key, const PgStatShared_Common *header, 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 bool pgstat_lock_entry_shared(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 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 + */ + +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 + */ + +extern PGDLLIMPORT PgStat_LocalState pgStatLocal; + + +/* + * Variables in pgstat_slru.c + */ + +extern PGDLLIMPORT bool have_slrustats; + + +/* + * Implementation of inline functions declared above. + */ + +/* + * Helpers for changecount manipulation. See comments around struct + * PgBackendStatus for details. + */ + +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; +} + +/* + * 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; + + Assert(off != 0 && off < PG_UINT32_MAX); + + return ((char *) (entry)) + off; +} + +#endif /* PGSTAT_INTERNAL_H */ diff --git a/third_party/spanner_pg/src/include/utils/pidfile.h b/third_party/spanner_pg/src/include/utils/pidfile.h index f5305a87..14bfba42 100644 --- a/third_party/spanner_pg/src/include/utils/pidfile.h +++ b/third_party/spanner_pg/src/include/utils/pidfile.h @@ -3,7 +3,7 @@ * pidfile.h * Declarations describing the data directory lock file (postmaster.pid) * - * 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 * * src/include/utils/pidfile.h diff --git a/third_party/spanner_pg/src/include/utils/plancache.h b/third_party/spanner_pg/src/include/utils/plancache.h index ff09c63a..0499635f 100644 --- a/third_party/spanner_pg/src/include/utils/plancache.h +++ b/third_party/spanner_pg/src/include/utils/plancache.h @@ -5,7 +5,7 @@ * * See plancache.c for comments. * - * 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 * * 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/third_party/spanner_pg/src/include/utils/portal.h b/third_party/spanner_pg/src/include/utils/portal.h index 46c482d6..aeddbdaf 100644 --- a/third_party/spanner_pg/src/include/utils/portal.h +++ b/third_party/spanner_pg/src/include/utils/portal.h @@ -36,7 +36,7 @@ * to look like NO SCROLL cursors. * * - * 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 * * src/include/utils/portal.h @@ -130,6 +130,7 @@ typedef struct PortalData */ SubTransactionId createSubid; /* the creating subxact */ SubTransactionId activeSubid; /* the last subxact with activity */ + int createLevel; /* creating subxact's nesting level */ /* The query or queries the portal will execute */ const char *sourceText; /* text of query (as of 8.4, never NULL) */ @@ -202,9 +203,6 @@ typedef struct PortalData /* Presentation data, primarily used by the pg_cursors system view */ TimestampTz creation_time; /* time at which this portal was defined */ bool visible; /* include this portal in pg_cursors? */ - - /* Stuff added at the end to avoid ABI break in stable branches: */ - int createLevel; /* creating subxact's nesting level */ } PortalData; /* diff --git a/third_party/spanner_pg/src/include/utils/ps_status.h b/third_party/spanner_pg/src/include/utils/ps_status.h index 9f43e1fd..bba46359 100644 --- a/third_party/spanner_pg/src/include/utils/ps_status.h +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/include/utils/queryenvironment.h b/third_party/spanner_pg/src/include/utils/queryenvironment.h index 78f2f569..23a16a91 100644 --- a/third_party/spanner_pg/src/include/utils/queryenvironment.h +++ b/third_party/spanner_pg/src/include/utils/queryenvironment.h @@ -4,7 +4,7 @@ * Access to functions to mutate the query environment and retrieve the * actual data related to entries (if any). * - * 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 * * src/include/utils/queryenvironment.h diff --git a/third_party/spanner_pg/src/include/utils/queryjumble.h b/third_party/spanner_pg/src/include/utils/queryjumble.h index af5d999b..3c2d9bea 100644 --- a/third_party/spanner_pg/src/include/utils/queryjumble.h +++ b/third_party/spanner_pg/src/include/utils/queryjumble.h @@ -3,7 +3,7 @@ * queryjumble.h * Query normalization and fingerprinting. * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/include/utils/rangetypes.h b/third_party/spanner_pg/src/include/utils/rangetypes.h index 04c302c6..993fad4f 100644 --- a/third_party/spanner_pg/src/include/utils/rangetypes.h +++ b/third_party/spanner_pg/src/include/utils/rangetypes.h @@ -4,7 +4,7 @@ * Declarations for Postgres range types. * * - * 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 * * src/include/utils/rangetypes.h diff --git a/third_party/spanner_pg/src/include/utils/regproc.h b/third_party/spanner_pg/src/include/utils/regproc.h index 308a7faa..a36ceba7 100644 --- a/third_party/spanner_pg/src/include/utils/regproc.h +++ b/third_party/spanner_pg/src/include/utils/regproc.h @@ -3,7 +3,7 @@ * regproc.h * Functions for the built-in types regproc, regclass, regtype, etc. * - * 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 * * src/include/utils/regproc.h diff --git a/third_party/spanner_pg/src/include/utils/rel.h b/third_party/spanner_pg/src/include/utils/rel.h index f2d53c92..a1bc0717 100644 --- a/third_party/spanner_pg/src/include/utils/rel.h +++ b/third_party/spanner_pg/src/include/utils/rel.h @@ -4,7 +4,7 @@ * POSTGRES relation descriptor (a/k/a relcache entry) definitions. * * - * 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 * * src/include/utils/rel.h @@ -160,7 +160,7 @@ typedef struct RelationData Bitmapset *rd_pkattr; /* cols included in primary key */ Bitmapset *rd_idattr; /* included in replica identity index */ - 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. @@ -245,6 +245,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; @@ -396,6 +397,7 @@ typedef struct ViewOptions { int32 vl_len_; /* varlena header (do not touch directly!) */ bool security_barrier; + bool security_invoker; ViewOptCheckOption check_option; } ViewOptions; @@ -409,6 +411,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 @@ -549,19 +561,6 @@ RelationGetSmgr(Relation rel) } #endif /* !FRONTEND */ -/* - * RelationOpenSmgr - * Open the relation at the smgr level, if not already done. - * - * XXX this is now deprecated, and should not be used in new code. - * Instead, call RelationGetSmgr in place of fetching rd_smgr directly. - */ -#define RelationOpenSmgr(relation) \ - do { \ - if ((relation)->rd_smgr == NULL) \ - smgrsetowner(&((relation)->rd_smgr), smgropen((relation)->rd_node, (relation)->rd_backend)); \ - } while (0) - /* * RelationCloseSmgr * Close the relation at the smgr level, if not already done. diff --git a/third_party/spanner_pg/src/include/utils/relcache.h b/third_party/spanner_pg/src/include/utils/relcache.h index aa060ef1..c93d8654 100644 --- a/third_party/spanner_pg/src/include/utils/relcache.h +++ b/third_party/spanner_pg/src/include/utils/relcache.h @@ -4,7 +4,7 @@ * Relation descriptor cache definitions. * * - * 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 * * 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); @@ -144,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/third_party/spanner_pg/src/include/utils/relfilenodemap.h b/third_party/spanner_pg/src/include/utils/relfilenodemap.h index 405b1123..77d80465 100644 --- a/third_party/spanner_pg/src/include/utils/relfilenodemap.h +++ b/third_party/spanner_pg/src/include/utils/relfilenodemap.h @@ -3,7 +3,7 @@ * relfilenodemap.h * relfilenode to oid mapping cache. * - * 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 * * src/include/utils/relfilenodemap.h diff --git a/third_party/spanner_pg/src/include/utils/relmapper.h b/third_party/spanner_pg/src/include/utils/relmapper.h index c0d14daa..557f77e3 100644 --- a/third_party/spanner_pg/src/include/utils/relmapper.h +++ b/third_party/spanner_pg/src/include/utils/relmapper.h @@ -4,7 +4,7 @@ * Catalog-to-filenode mapping * * - * 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 * * 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/third_party/spanner_pg/src/include/utils/relptr.h b/third_party/spanner_pg/src/include/utils/relptr.h index 2ed4b518..9364dd66 100644 --- a/third_party/spanner_pg/src/include/utils/relptr.h +++ b/third_party/spanner_pg/src/include/utils/relptr.h @@ -3,7 +3,7 @@ * relptr.h * This file contains basic declarations for relative pointers. * - * 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 * * src/include/utils/relptr.h diff --git a/third_party/spanner_pg/src/include/utils/reltrigger.h b/third_party/spanner_pg/src/include/utils/reltrigger.h index 7dc7699b..9bac164a 100644 --- a/third_party/spanner_pg/src/include/utils/reltrigger.h +++ b/third_party/spanner_pg/src/include/utils/reltrigger.h @@ -4,7 +4,7 @@ * POSTGRES relation trigger definitions. * * - * 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 * * src/include/utils/reltrigger.h diff --git a/third_party/spanner_pg/src/include/utils/resowner.h b/third_party/spanner_pg/src/include/utils/resowner.h index 109ac31b..4aff7015 100644 --- a/third_party/spanner_pg/src/include/utils/resowner.h +++ b/third_party/spanner_pg/src/include/utils/resowner.h @@ -9,7 +9,7 @@ * See utils/resowner/README for more info. * * - * 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 * * src/include/utils/resowner.h diff --git a/third_party/spanner_pg/src/include/utils/resowner_private.h b/third_party/spanner_pg/src/include/utils/resowner_private.h index 6dafc87e..d01cccc2 100644 --- a/third_party/spanner_pg/src/include/utils/resowner_private.h +++ b/third_party/spanner_pg/src/include/utils/resowner_private.h @@ -6,7 +6,7 @@ * See utils/resowner/README for more info. * * - * 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 * * src/include/utils/resowner_private.h diff --git a/third_party/spanner_pg/src/include/utils/rls.h b/third_party/spanner_pg/src/include/utils/rls.h index 46b32347..75259cc1 100644 --- a/third_party/spanner_pg/src/include/utils/rls.h +++ b/third_party/spanner_pg/src/include/utils/rls.h @@ -4,7 +4,7 @@ * Header file for Row Level Security (RLS) utility commands to be used * with the rowsecurity feature. * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * 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/third_party/spanner_pg/src/include/utils/ruleutils.h b/third_party/spanner_pg/src/include/utils/ruleutils.h index 030c9968..951d78df 100644 --- a/third_party/spanner_pg/src/include/utils/ruleutils.h +++ b/third_party/spanner_pg/src/include/utils/ruleutils.h @@ -3,7 +3,7 @@ * ruleutils.h * Declarations for ruleutils.c * - * 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 * * src/include/utils/ruleutils.h @@ -28,6 +28,7 @@ extern char *pg_get_indexdef_string(Oid indexrelid); extern char *pg_get_indexdef_columns(Oid indexrelid, bool pretty); extern char *pg_get_indexdef_columns_extended(Oid indexrelid, bits16 flags); +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); diff --git a/third_party/spanner_pg/src/include/utils/sampling.h b/third_party/spanner_pg/src/include/utils/sampling.h index a58d1428..c773b59b 100644 --- a/third_party/spanner_pg/src/include/utils/sampling.h +++ b/third_party/spanner_pg/src/include/utils/sampling.h @@ -3,7 +3,7 @@ * sampling.h * definitions for sampling functions * - * 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 * * src/include/utils/sampling.h @@ -13,15 +13,14 @@ #ifndef SAMPLING_H #define SAMPLING_H +#include "common/pg_prng.h" #include "storage/block.h" /* for typedef BlockNumber */ /* Random generator for sampling code */ -typedef unsigned short SamplerRandomState[3]; - -extern void sampler_random_init_state(long seed, - SamplerRandomState randstate); -extern double sampler_random_fract(SamplerRandomState randstate); +extern void sampler_random_init_state(uint32 seed, + pg_prng_state *randstate); +extern double sampler_random_fract(pg_prng_state *randstate); /* Block sampling methods */ @@ -32,13 +31,13 @@ typedef struct int n; /* desired sample size */ BlockNumber t; /* current block number */ int m; /* blocks selected so far */ - SamplerRandomState randstate; /* random generator state */ + pg_prng_state randstate; /* random generator state */ } BlockSamplerData; typedef BlockSamplerData *BlockSampler; extern BlockNumber BlockSampler_Init(BlockSampler bs, BlockNumber nblocks, - int samplesize, long randseed); + int samplesize, uint32 randseed); extern bool BlockSampler_HasMore(BlockSampler bs); extern BlockNumber BlockSampler_Next(BlockSampler bs); @@ -47,7 +46,7 @@ extern BlockNumber BlockSampler_Next(BlockSampler bs); typedef struct { double W; - SamplerRandomState randstate; /* random generator state */ + pg_prng_state randstate; /* random generator state */ } ReservoirStateData; typedef ReservoirStateData *ReservoirState; diff --git a/third_party/spanner_pg/src/include/utils/selfuncs.h b/third_party/spanner_pg/src/include/utils/selfuncs.h index 9dd444e1..8f3d73ed 100644 --- a/third_party/spanner_pg/src/include/utils/selfuncs.h +++ b/third_party/spanner_pg/src/include/utils/selfuncs.h @@ -5,7 +5,7 @@ * infrastructure for selectivity and cost estimation. * * - * 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 * * src/include/utils/selfuncs.h diff --git a/third_party/spanner_pg/src/include/utils/sharedtuplestore.h b/third_party/spanner_pg/src/include/utils/sharedtuplestore.h index 01ad6efe..79be13d5 100644 --- a/third_party/spanner_pg/src/include/utils/sharedtuplestore.h +++ b/third_party/spanner_pg/src/include/utils/sharedtuplestore.h @@ -3,7 +3,7 @@ * sharedtuplestore.h * Simple mechanism for sharing tuples between backends. * - * 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 * * src/include/utils/sharedtuplestore.h diff --git a/third_party/spanner_pg/src/include/utils/snapmgr.h b/third_party/spanner_pg/src/include/utils/snapmgr.h index 33e6c14e..06eafdf1 100644 --- a/third_party/spanner_pg/src/include/utils/snapmgr.h +++ b/third_party/spanner_pg/src/include/utils/snapmgr.h @@ -3,7 +3,7 @@ * snapmgr.h * POSTGRES snapshot manager * - * 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 * * 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; @@ -137,6 +137,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, diff --git a/third_party/spanner_pg/src/include/utils/snapshot.h b/third_party/spanner_pg/src/include/utils/snapshot.h index 6b60755c..4e96f1af 100644 --- a/third_party/spanner_pg/src/include/utils/snapshot.h +++ b/third_party/spanner_pg/src/include/utils/snapshot.h @@ -3,7 +3,7 @@ * snapshot.h * POSTGRES snapshot definition * - * 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 * * src/include/utils/snapshot.h diff --git a/third_party/spanner_pg/src/include/utils/sortsupport.h b/third_party/spanner_pg/src/include/utils/sortsupport.h index 2f12a8b8..8c36cf8d 100644 --- a/third_party/spanner_pg/src/include/utils/sortsupport.h +++ b/third_party/spanner_pg/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. * @@ -42,7 +42,7 @@ * function for such cases, but probably not any other acceleration method. * * - * 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 * * src/include/utils/sortsupport.h @@ -229,6 +229,109 @@ 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; +} + +#if SIZEOF_DATUM >= 8 +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 + { + compare = DatumGetInt64(datum1) < DatumGetInt64(datum2) ? -1 : + DatumGetInt64(datum1) > DatumGetInt64(datum2) ? 1 : 0; + if (ssup->ssup_reverse) + INVERT_COMPARE_RESULT(compare); + } + + return compare; +} +#endif + +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 = DatumGetInt32(datum1) < DatumGetInt32(datum2) ? -1 : + DatumGetInt32(datum1) > DatumGetInt32(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 +370,17 @@ 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); +#if SIZEOF_DATUM >= 8 +extern int ssup_datum_signed_cmp(Datum x, Datum y, SortSupport ssup); +#endif +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); diff --git a/third_party/spanner_pg/src/include/utils/spccache.h b/third_party/spanner_pg/src/include/utils/spccache.h index 26ac680f..5163eeed 100644 --- a/third_party/spanner_pg/src/include/utils/spccache.h +++ b/third_party/spanner_pg/src/include/utils/spccache.h @@ -3,7 +3,7 @@ * spccache.h * Tablespace cache. * - * 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 * * src/include/utils/spccache.h @@ -13,9 +13,9 @@ #ifndef SPCCACHE_H #define SPCCACHE_H -void get_tablespace_page_costs(Oid spcid, float8 *spc_random_page_cost, +extern void get_tablespace_page_costs(Oid spcid, float8 *spc_random_page_cost, float8 *spc_seq_page_cost); -int get_tablespace_io_concurrency(Oid spcid); -int get_tablespace_maintenance_io_concurrency(Oid spcid); +extern int get_tablespace_io_concurrency(Oid spcid); +extern int get_tablespace_maintenance_io_concurrency(Oid spcid); #endif /* SPCCACHE_H */ diff --git a/third_party/spanner_pg/src/include/utils/syscache.h b/third_party/spanner_pg/src/include/utils/syscache.h index d74a3486..4463ea66 100644 --- a/third_party/spanner_pg/src/include/utils/syscache.h +++ b/third_party/spanner_pg/src/include/utils/syscache.h @@ -6,7 +6,7 @@ * See also lsyscache.h, which provides convenience routines for * common cache-lookup operations. * - * 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 * * src/include/utils/syscache.h @@ -72,10 +72,14 @@ enum SysCacheIdentifier OPEROID, OPFAMILYAMNAMENSP, OPFAMILYOID, + PARAMETERACLNAME, + PARAMETERACLOID, PARTRELID, PROCNAMEARGSNSP, PROCOID, PUBLICATIONNAME, + PUBLICATIONNAMESPACE, + PUBLICATIONNAMESPACEMAP, PUBLICATIONOID, PUBLICATIONREL, PUBLICATIONRELMAP, diff --git a/third_party/spanner_pg/src/include/utils/timeout.h b/third_party/spanner_pg/src/include/utils/timeout.h index 93e6a691..c068986d 100644 --- a/third_party/spanner_pg/src/include/utils/timeout.h +++ b/third_party/spanner_pg/src/include/utils/timeout.h @@ -4,7 +4,7 @@ * Routines to multiplex SIGALRM interrupts for multiple timeout reasons. * * - * 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 * * src/include/utils/timeout.h @@ -32,7 +32,9 @@ 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 */ USER_TIMEOUT, /* Maximum number of timeout reasons */ @@ -48,14 +50,15 @@ typedef void (*timeout_handler_proc) (void); typedef enum TimeoutType { TMPARAM_AFTER, - TMPARAM_AT + TMPARAM_AT, + TMPARAM_EVERY } TimeoutType; typedef struct { TimeoutId id; /* timeout to set */ TimeoutType type; /* TMPARAM_AFTER or TMPARAM_AT */ - int delay_ms; /* only used for TMPARAM_AFTER */ + int delay_ms; /* only used for TMPARAM_AFTER/EVERY */ TimestampTz fin_time; /* only used for TMPARAM_AT */ } EnableTimeoutParams; @@ -75,6 +78,8 @@ extern void reschedule_timeouts(void); /* timeout operation */ extern void enable_timeout_after(TimeoutId id, int delay_ms); +extern void enable_timeout_every(TimeoutId id, TimestampTz fin_time, + int delay_ms); extern void enable_timeout_at(TimeoutId id, TimestampTz fin_time); extern void enable_timeouts(const EnableTimeoutParams *timeouts, int count); extern void disable_timeout(TimeoutId id, bool keep_indicator); diff --git a/third_party/spanner_pg/src/include/utils/timestamp.h b/third_party/spanner_pg/src/include/utils/timestamp.h index 63bf71ac..edf3a973 100644 --- a/third_party/spanner_pg/src/include/utils/timestamp.h +++ b/third_party/spanner_pg/src/include/utils/timestamp.h @@ -3,7 +3,7 @@ * timestamp.h * Definitions for the SQL "timestamp" and "interval" types. * - * 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 * * 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) */ @@ -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/third_party/spanner_pg/src/include/utils/tuplesort.h b/third_party/spanner_pg/src/include/utils/tuplesort.h index f9494937..a2eaeabe 100644 --- a/third_party/spanner_pg/src/include/utils/tuplesort.h +++ b/third_party/spanner_pg/src/include/utils/tuplesort.h @@ -11,7 +11,7 @@ * algorithm. Parallel sorts use a variant of this external sort * algorithm, and are typically only used for large amounts of data. * - * 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 * * src/include/utils/tuplesort.h @@ -86,6 +86,15 @@ 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) + +/* specifies if the tuplesort is able to support bounded sorts */ +#define TUPLESORT_ALLOWBOUNDED (1 << 1) + typedef struct TuplesortInstrumentation { TuplesortMethod sortMethod; /* sort algorithm used */ @@ -201,31 +210,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); @@ -268,12 +279,11 @@ extern void tuplesort_initialize_shared(Sharedsort *shared, int nWorkers, extern void tuplesort_attach_shared(Sharedsort *shared, dsm_segment *seg); /* - * These routines may only be called if randomAccess was specified 'true'. - * Likewise, backwards scan in gettuple/getdatum is only allowed if - * randomAccess was specified. Note that parallel sorts do not support - * randomAccess. + * These routines may only be called if TUPLESORT_RANDOMACCESS was specified + * during tuplesort_begin_*. Additionally backwards scan in gettuple/getdatum + * also require TUPLESORT_RANDOMACCESS. Note that parallel sorts do not + * support random access. */ - extern void tuplesort_rescan(Tuplesortstate *state); extern void tuplesort_markpos(Tuplesortstate *state); extern void tuplesort_restorepos(Tuplesortstate *state); diff --git a/third_party/spanner_pg/src/include/utils/tuplestore.h b/third_party/spanner_pg/src/include/utils/tuplestore.h index 99b1bc1e..01716fb4 100644 --- a/third_party/spanner_pg/src/include/utils/tuplestore.h +++ b/third_party/spanner_pg/src/include/utils/tuplestore.h @@ -21,7 +21,7 @@ * Also, we have changed the API to return tuples in TupleTableSlots, * so that there is a check to prevent attempted access to system columns. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * 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); diff --git a/third_party/spanner_pg/src/include/utils/typcache.h b/third_party/spanner_pg/src/include/utils/typcache.h index ff08fd0d..037f934f 100644 --- a/third_party/spanner_pg/src/include/utils/typcache.h +++ b/third_party/spanner_pg/src/include/utils/typcache.h @@ -6,7 +6,7 @@ * The type cache exists to speed lookup of certain information about data * types that is not directly available from a type's pg_type row. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/typcache.h diff --git a/third_party/spanner_pg/src/include/utils/tzparser.h b/third_party/spanner_pg/src/include/utils/tzparser.h index 4bb42a34..015b1773 100644 --- a/third_party/spanner_pg/src/include/utils/tzparser.h +++ b/third_party/spanner_pg/src/include/utils/tzparser.h @@ -3,7 +3,7 @@ * tzparser.h * Timezone offset file parsing definitions. * - * 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 * * src/include/utils/tzparser.h diff --git a/third_party/spanner_pg/src/include/utils/uuid.h b/third_party/spanner_pg/src/include/utils/uuid.h index bb3ca107..0029da4e 100644 --- a/third_party/spanner_pg/src/include/utils/uuid.h +++ b/third_party/spanner_pg/src/include/utils/uuid.h @@ -5,7 +5,7 @@ * to avoid conflicts with any uuid_t type that might be defined by * the system headers. * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * src/include/utils/uuid.h * diff --git a/third_party/spanner_pg/src/include/utils/varbit.h b/third_party/spanner_pg/src/include/utils/varbit.h index 2fcbb5d4..039ba860 100644 --- a/third_party/spanner_pg/src/include/utils/varbit.h +++ b/third_party/spanner_pg/src/include/utils/varbit.h @@ -5,7 +5,7 @@ * * Code originally contributed by Adriaan Joubert. * - * 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 * * src/include/utils/varbit.h diff --git a/third_party/spanner_pg/src/include/utils/varlena.h b/third_party/spanner_pg/src/include/utils/varlena.h index 5c397233..c45208a2 100644 --- a/third_party/spanner_pg/src/include/utils/varlena.h +++ b/third_party/spanner_pg/src/include/utils/varlena.h @@ -3,7 +3,7 @@ * varlena.h * Functions for the variable-length built-in types. * - * 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 * * src/include/utils/varlena.h @@ -33,7 +33,9 @@ extern bool SplitDirectoriesString(char *rawstring, char separator, List **namelist); extern bool SplitGUCList(char *rawstring, char separator, List **namelist); -extern text *replace_text_regexp(text *src_text, void *regexp, - text *replace_text, bool glob); +extern text *replace_text_regexp(text *src_text, text *pattern_text, + text *replace_text, + int cflags, Oid collation, + int search_start, int n); #endif diff --git a/third_party/spanner_pg/src/include/utils/wait_event.h b/third_party/spanner_pg/src/include/utils/wait_event.h index 4b1cea65..c814918d 100644 --- a/third_party/spanner_pg/src/include/utils/wait_event.h +++ b/third_party/spanner_pg/src/include/utils/wait_event.h @@ -2,7 +2,7 @@ * wait_event.h * Definitions related to wait event reporting * - * Copyright (c) 2001-2021, PostgreSQL Global Development Group + * Copyright (c) 2001-2022, PostgreSQL Global Development Group * * 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, @@ -80,6 +79,8 @@ typedef enum typedef enum { WAIT_EVENT_APPEND_READY = PG_WAIT_IPC, + WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND, + WAIT_EVENT_ARCHIVE_COMMAND, WAIT_EVENT_BACKEND_TERMINATION, WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE, WAIT_EVENT_BGWORKER_SHUTDOWN, @@ -118,9 +119,11 @@ typedef enum WAIT_EVENT_PROMOTE, WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, + WAIT_EVENT_RECOVERY_END_COMMAND, WAIT_EVENT_RECOVERY_PAUSE, WAIT_EVENT_REPLICATION_ORIGIN_DROP, WAIT_EVENT_REPLICATION_SLOT_DROP, + WAIT_EVENT_RESTORE_COMMAND, WAIT_EVENT_SAFE_SNAPSHOT, WAIT_EVENT_SYNC_REP, WAIT_EVENT_WAL_RECEIVER_EXIT, @@ -137,12 +140,13 @@ 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, + WAIT_EVENT_REGISTER_SYNC_REQUEST, WAIT_EVENT_VACUUM_DELAY, - WAIT_EVENT_CHECKPOINT_WRITE_DELAY, - WAIT_EVENT_REGISTER_SYNC_REQUEST + WAIT_EVENT_VACUUM_TRUNCATE } WaitEventTimeout; /* ---------- @@ -154,6 +158,8 @@ typedef enum typedef enum { WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO, + WAIT_EVENT_BASEBACKUP_SYNC, + WAIT_EVENT_BASEBACKUP_WRITE, WAIT_EVENT_BUFFILE_READ, WAIT_EVENT_BUFFILE_WRITE, WAIT_EVENT_BUFFILE_TRUNCATE, @@ -211,6 +217,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, @@ -223,10 +230,7 @@ typedef enum WAIT_EVENT_WAL_SYNC, WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN, WAIT_EVENT_WAL_WRITE, - WAIT_EVENT_LOGICAL_CHANGES_READ, - WAIT_EVENT_LOGICAL_CHANGES_WRITE, - WAIT_EVENT_LOGICAL_SUBXACT_READ, - WAIT_EVENT_LOGICAL_SUBXACT_WRITE + WAIT_EVENT_VERSION_FILE_SYNC } WaitEventIO; diff --git a/third_party/spanner_pg/src/include/utils/xid8.h b/third_party/spanner_pg/src/include/utils/xid8.h index 8f59d793..b702fc1a 100644 --- a/third_party/spanner_pg/src/include/utils/xid8.h +++ b/third_party/spanner_pg/src/include/utils/xid8.h @@ -3,7 +3,7 @@ * xid8.h * Header file for the "xid8" ADT. * - * Copyright (c) 2020-2021, PostgreSQL Global Development Group + * Copyright (c) 2020-2022, PostgreSQL Global Development Group * * src/include/utils/xid8.h * diff --git a/third_party/spanner_pg/src/include/utils/xml.h b/third_party/spanner_pg/src/include/utils/xml.h index d79668f3..6620a626 100644 --- a/third_party/spanner_pg/src/include/utils/xml.h +++ b/third_party/spanner_pg/src/include/utils/xml.h @@ -4,7 +4,7 @@ * Declarations for XML data type support. * * - * 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 * * 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 */ diff --git a/third_party/spanner_pg/src/include/windowapi.h b/third_party/spanner_pg/src/include/windowapi.h index c5324aa8..5a620a2e 100644 --- a/third_party/spanner_pg/src/include/windowapi.h +++ b/third_party/spanner_pg/src/include/windowapi.h @@ -19,7 +19,7 @@ * function in nodeWindowAgg.c for details. * * - * Portions Copyright (c) 2000-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2000-2022, PostgreSQL Global Development Group * * src/include/windowapi.h * diff --git a/third_party/spanner_pg/src/interfaces/ecpg/compatlib/Makefile b/third_party/spanner_pg/src/interfaces/ecpg/compatlib/Makefile index 1c2866fa..867ad555 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/compatlib/Makefile +++ b/third_party/spanner_pg/src/interfaces/ecpg/compatlib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg compatibility library # -# 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 # # src/interfaces/ecpg/compatlib/Makefile diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/Makefile b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/Makefile index 13c4bebc..b00229f3 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/Makefile +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg library # -# 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 # # src/interfaces/ecpg/ecpglib/Makefile diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/connect.c b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/connect.c index 056940cb..db0bae1f 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/connect.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/connect.c @@ -321,7 +321,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/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/data.c b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/data.c index c94907bc..40cbfc0d 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/data.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/execute.c b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/execute.c index e8e8fb2b..2ebe6656 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/execute.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/execute.c @@ -1389,7 +1389,6 @@ ecpg_build_params(struct statement *stmt) if (sqlda->sqln == desc_counter) desc_counter = 0; } - } else { diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/misc.c b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/misc.c index b8dbe5e7..1eef1ec0 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/misc.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/misc.c @@ -191,7 +191,6 @@ ECPGtransactionStatus(const char *connection_name) } return PQtransactionStatus(con->connection); - } bool diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/nls.mk b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/nls.mk index 2f6b0895..fff2dfdb 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/nls.mk +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/nls.mk @@ -1,6 +1,6 @@ # src/interfaces/ecpg/ecpglib/nls.mk CATALOG_NAME = ecpglib -AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka 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/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/es.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/es.po index 73e7db86..9af2825c 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/es.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL) 14\n" +"Project-Id-Version: ecpglib (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:54+0000\n" -"PO-Revision-Date: 2019-06-06 17:20-0400\n" +"POT-Creation-Date: 2023-05-07 16:39+0000\n" +"PO-Revision-Date: 2022-10-20 09:05+0200\n" "Last-Translator: Emanuel Calvo Franco \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -22,7 +22,7 @@ msgstr "" msgid "empty message text" msgstr "mensaje de texto vacío" -#: connect.c:411 connect.c:676 +#: connect.c:410 connect.c:675 msgid "" msgstr "" @@ -195,6 +195,6 @@ msgstr "se ha perdido la conexión al servidor" msgid "SQL error: %s\n" msgstr "error SQL: %s\n" -#: execute.c:2190 execute.c:2197 +#: execute.c:2189 execute.c:2196 msgid "" msgstr "" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/fr.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/fr.po index 5f6c7d7f..e976d5cb 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/fr.po +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ja.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ja.po index 895a46a5..9a99b57f 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ja.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ja.po @@ -4,10 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL 14)\n" +"Project-Id-Version: ecpglib (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-20 15:39+0900\n" -"PO-Revision-Date: 2021-08-19 15:13+0900\n" +"POT-Creation-Date: 2022-08-09 12:00+0900\n" +"PO-Revision-Date: 2019-06-11 09:04+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -15,17 +15,17 @@ 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.8.13\n" +"X-Generator: Poedit 1.5.4\n" -#: connect.c:237 +#: connect.c:243 msgid "empty message text" -msgstr "空のメッセージテキスト" +msgstr "メッセージテキストが空です" -#: connect.c:405 connect.c:627 +#: connect.c:410 connect.c:675 msgid "" msgstr "<デフォルト>" -#: descriptor.c:871 misc.c:119 +#: descriptor.c:876 misc.c:119 msgid "NULL" msgstr "ヌル" @@ -111,7 +111,7 @@ msgstr "行番号%dにおいて、変数は配列型ではありません" #: error.c:123 #, c-format msgid "data read from server is not an array on line %d" -msgstr "行番号%dにおいて、サーバから読み込んだデータは配列ではありません" +msgstr "行番号%dにおいて、サーバーから読み込んだデータは配列ではありません" #. translator: this string will be truncated at 149 characters expanded. #: error.c:130 @@ -185,15 +185,15 @@ msgstr "行番号%2$dにおいて、データベース\"%1$s\"に接続できま msgid "SQL error %d on line %d" msgstr "行番号%2$dにおいて、SQLエラー%1$dがあります" -#: error.c:254 +#: error.c:253 msgid "the connection to the server was lost" -msgstr "サーバへの接続が切れました" +msgstr "サーバーへの接続が切れました" -#: error.c:346 +#: error.c:345 #, c-format msgid "SQL error: %s\n" msgstr "SQLエラー: %s\n" -#: execute.c:2196 execute.c:2203 +#: execute.c:2189 execute.c:2196 msgid "" msgstr "<空>" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ka.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ka.po new file mode 100644 index 00000000..d0e6d4fe --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ka.po @@ -0,0 +1,200 @@ +# Georgian message translation file for ecpglib +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpglib (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: ecpglib (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-02 08:50+0200\n" +"PO-Revision-Date: 2022-07-04 13:16+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1\n" + +#: connect.c:239 +msgid "empty message text" +msgstr "შეტყობინების ცარიელი ტექსტი" + +#: connect.c:406 connect.c:635 +msgid "" +msgstr "<ნაგულისხმები>" + +#: descriptor.c:871 misc.c:119 +msgid "NULL" +msgstr "არაფერი" + +#. 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 "მთელი რიცხვის შეყვანის არასწორი ფორმატი: \"%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 "უნიშნო მთელი რიცხვის შეყვანის არასწორი ფორმატი: \"%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 "წილადი რიცხვის შეყვანის არასწორი ფორმატი: \"%s\", %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 "ლოგიკური ტიპის მიშვნეობის შეყვანის არასწორი ფორმატი: \"%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 "%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 "%d-ე ხაზზე SQL-ის შეცდომა: %d" + +#: error.c:253 +msgid "the connection to the server was lost" +msgstr "სერვერთან კავშირი დაკარგულია" + +#: error.c:345 +#, c-format +msgid "SQL error: %s\n" +msgstr "SQL-ის შეცდომა: %s\n" + +#: execute.c:2195 execute.c:2202 +msgid "" +msgstr "" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/pt_BR.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/pt_BR.po index cc54e749..781ad174 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/pt_BR.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/pt_BR.po @@ -1,31 +1,33 @@ # Brazilian Portuguese message translation file for ecpglib -# Copyright (C) 2009 PostgreSQL Global Development Group +# +# Copyright (C) 2009-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. +# # Fernando Ike de Oliveira , 2009. -# Euler Taveira de Oliveira , 2010-2014. +# Euler Taveira , 2010-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.5\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2015-09-17 22:32-0300\n" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-10 18:24-0300\n" "PO-Revision-Date: 2009-02-09 13:00-0200\n" "Last-Translator: Fernando Ike de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: connect.c:237 +#: connect.c:243 msgid "empty message text" msgstr "mensagem vazia" -#: connect.c:401 connect.c:430 connect.c:638 +#: connect.c:410 connect.c:675 msgid "" msgstr "" -#: descriptor.c:833 misc.c:120 +#: descriptor.c:876 misc.c:119 msgid "NULL" msgstr "NULL" @@ -185,15 +187,15 @@ msgstr "não pôde connectar ao banco de dados \"%s\" na linha %d" msgid "SQL error %d on line %d" msgstr "Erro SQL %d na linha %d" -#: error.c:254 +#: error.c:253 msgid "the connection to the server was lost" msgstr "a conexão com servidor foi perdida" -#: error.c:347 +#: error.c:345 #, c-format msgid "SQL error: %s\n" msgstr "Erro SQL: %s\n" -#: execute.c:1972 +#: execute.c:2189 execute.c:2196 msgid "" msgstr "" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ru.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ru.po index 3ff70d19..d4eb7daa 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/ru.po +++ b/third_party/spanner_pg/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: 2022-08-10 11:56+0300\n" +"POT-Creation-Date: 2022-08-27 14:52+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:411 connect.c:676 +#: connect.c:410 connect.c:675 msgid "" msgstr "<ПО_УМОЛЧАНИЮ>" @@ -196,7 +196,7 @@ msgstr "подключение к серверу потеряно" msgid "SQL error: %s\n" msgstr "ошибка SQL: %s\n" -#: execute.c:2190 execute.c:2197 +#: execute.c:2189 execute.c:2196 msgid "" msgstr "<>" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/uk.po b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/uk.po index 81526f9e..dcb17387 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/po/uk.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/ecpglib/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: 2022-06-16 03:55+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2022-08-12 10:39+0000\n" +"PO-Revision-Date: 2022-09-13 11:52\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,18 +14,18 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/ecpglib.pot\n" -"X-Crowdin-File-ID: 746\n" +"X-Crowdin-File: /REL_15_STABLE/ecpglib.pot\n" +"X-Crowdin-File-ID: 890\n" -#: connect.c:239 +#: connect.c:243 msgid "empty message text" msgstr "пусте повідомлення" -#: connect.c:407 connect.c:636 +#: connect.c:410 connect.c:675 msgid "" msgstr "<ЗА_ЗАМОВЧУВАННЯМ>" -#: descriptor.c:871 misc.c:119 +#: descriptor.c:876 misc.c:119 msgid "NULL" msgstr "NULL" @@ -194,7 +194,7 @@ msgstr "з'єднання із сервером втрачено" msgid "SQL error: %s\n" msgstr "помилка SQL: %s\n" -#: execute.c:2196 execute.c:2203 +#: execute.c:2189 execute.c:2196 msgid "" msgstr "<пусто>" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/Makefile b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/Makefile index 513af517..763787f2 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg pgtypes library # -# 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 # # src/interfaces/ecpg/pgtypeslib/Makefile diff --git a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/dt_common.c b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/dt_common.c index e8a8a0f0..e0fae3d5 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/dt_common.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/interval.c b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/interval.c index 02b3c472..73bde94a 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/interval.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/interval.c @@ -155,7 +155,7 @@ DecodeISO8601Interval(char *str, { case 'Y': tm->tm_year += val; - tm->tm_mon += (fval * MONTHS_PER_YEAR); + tm->tm_mon += rint(fval * MONTHS_PER_YEAR); break; case 'M': tm->tm_mon += val; @@ -191,7 +191,7 @@ DecodeISO8601Interval(char *str, return DTERR_BAD_FORMAT; tm->tm_year += val; - tm->tm_mon += (fval * MONTHS_PER_YEAR); + tm->tm_mon += rint(fval * MONTHS_PER_YEAR); if (unit == '\0') return 0; if (unit == 'T') @@ -528,29 +528,25 @@ DecodeInterval(char **field, int *ftype, int nf, /* int range, */ case DTK_YEAR: tm->tm_year += val; - if (fval != 0) - tm->tm_mon += fval * MONTHS_PER_YEAR; + tm->tm_mon += rint(fval * MONTHS_PER_YEAR); tmask = (fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR); break; case DTK_DECADE: tm->tm_year += val * 10; - if (fval != 0) - tm->tm_mon += fval * MONTHS_PER_YEAR * 10; + tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 10); tmask = (fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR); break; case DTK_CENTURY: tm->tm_year += val * 100; - if (fval != 0) - tm->tm_mon += fval * MONTHS_PER_YEAR * 100; + tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 100); tmask = (fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR); break; case DTK_MILLENNIUM: tm->tm_year += val * 1000; - if (fval != 0) - tm->tm_mon += fval * MONTHS_PER_YEAR * 1000; + tm->tm_mon += rint(fval * MONTHS_PER_YEAR * 1000); tmask = (fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR); break; @@ -951,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/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/numeric.c b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/numeric.c index dbe4eb21..34efc904 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/numeric.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/timestamp.c b/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/timestamp.c index 3f82ee54..54cc04ad 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/pgtypeslib/timestamp.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/preproc/Makefile b/third_party/spanner_pg/src/interfaces/ecpg/preproc/Makefile index 29479f96..ef6d645d 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/Makefile +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/interfaces/ecpg/preproc # -# Copyright (c) 1998-2021, PostgreSQL Global Development Group +# Copyright (c) 1998-2022, PostgreSQL Global Development Group # # src/interfaces/ecpg/preproc/Makefile # diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/c_kwlist.h b/third_party/spanner_pg/src/interfaces/ecpg/preproc/c_kwlist.h index 51c5dfbf..f99e3d74 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/c_kwlist.h +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/c_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/ecpg/preproc/c_kwlist.h diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/check_rules.pl b/third_party/spanner_pg/src/interfaces/ecpg/preproc/check_rules.pl index c0b5d192..0a3fafc3 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/check_rules.pl +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/check_rules.pl @@ -3,7 +3,7 @@ # test parser generator for ecpg # call with backend grammar as stdin # -# Copyright (c) 2009-2021, PostgreSQL Global Development Group +# Copyright (c) 2009-2022, PostgreSQL Global Development Group # # Written by Michael Meskes # Andy Colson diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.c b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.c index 13e0f8cf..6fff9e78 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.c @@ -1,7 +1,7 @@ /* src/interfaces/ecpg/preproc/ecpg.c */ /* Main for ecpg, the PostgreSQL embedded SQL precompiler. */ -/* Copyright (c) 1996-2021, PostgreSQL Global Development Group */ +/* Copyright (c) 1996-2022, PostgreSQL Global Development Group */ #include "postgres_fe.h" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.type b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.type index e4b77fa0..d1cde691 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.type +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg.type @@ -143,4 +143,4 @@ %type action -%type ECPGDescribe \ No newline at end of file +%type ECPGDescribe diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg_kwlist.h b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg_kwlist.h index 3c466f84..0332e985 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg_kwlist.h +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/ecpg_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/ecpg/preproc/ecpg_kwlist.h diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/keywords.c b/third_party/spanner_pg/src/interfaces/ecpg/preproc/keywords.c index 83609e31..16e65745 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/keywords.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/keywords.c @@ -4,7 +4,7 @@ * lexical token lookup for key words in PostgreSQL * * - * 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/third_party/spanner_pg/src/interfaces/ecpg/preproc/nls.mk b/third_party/spanner_pg/src/interfaces/ecpg/preproc/nls.mk index fed0f7c9..7265d97e 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/nls.mk +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/nls.mk @@ -1,6 +1,6 @@ # src/interfaces/ecpg/preproc/nls.mk CATALOG_NAME = ecpg -AVAIL_LANGUAGES = cs de el 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 ka 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/third_party/spanner_pg/src/interfaces/ecpg/preproc/parse.pl b/third_party/spanner_pg/src/interfaces/ecpg/preproc/parse.pl index 1e24801a..dee6b820 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/parse.pl +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/parse.pl @@ -3,7 +3,7 @@ # parser generator for ecpg version 2 # call with backend parser as stdin # -# Copyright (c) 2007-2021, PostgreSQL Global Development Group +# Copyright (c) 2007-2022, PostgreSQL Global Development Group # # Written by Mike Aubury # Michael Meskes diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/parser.c b/third_party/spanner_pg/src/interfaces/ecpg/preproc/parser.c index a8571a3f..a44e07a1 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/parser.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/parser.c @@ -10,7 +10,7 @@ * This file will need work if we ever want it to. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/pgc.l b/third_party/spanner_pg/src/interfaces/ecpg/preproc/pgc.l index 7a035663..996718cb 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/pgc.l +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/pgc.l @@ -10,7 +10,7 @@ * only here to simplify syncing this file with scan.l. * * - * 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 * * IDENTIFICATION @@ -99,9 +99,9 @@ static short preproc_tos; static bool ifcond; static struct _if_value { - bool active; - bool saw_active; - bool else_branch; + bool active; + bool saw_active; + bool else_branch; } stacked_if_value[MAX_NESTED_IF]; %} @@ -130,7 +130,7 @@ static struct _if_value * extended C-style comments * delimited identifiers (double-quoted identifiers) * double-quoted strings in C - * hexadecimal numeric string + * hexadecimal byte string * national character quoted strings * standard quoted strings * quote stop (detect continued strings) @@ -223,7 +223,7 @@ quotecontinuefail {whitespace}*"-"? xbstart [bB]{quote} xbinside [^']* -/* Hexadecimal number */ +/* Hexadecimal byte string */ xhstart [xX]{quote} xhinside [^']* @@ -305,7 +305,6 @@ xcstart \/\*{op_chars}* xcstop \*+\/ xcinside [^*/]+ -digit [0-9] ident_start [A-Za-z\200-\377_] ident_cont [A-Za-z\200-\377_0-9\$] @@ -346,24 +345,31 @@ self [,()\[\].;\:\+\-\*\/\%\^\<\>\=] op_chars [\~\!\@\#\^\&\|\`\?\+\-\*\/\%\<\>\=] operator {op_chars}+ -/* we no longer allow unary minus in numbers. - * instead we pass it separately to parser. there it gets - * coerced via doNegate() -- Leon aug 20 1999 +/* + * Numbers + * + * Unary minus is not part of a number here. Instead we pass it separately to + * the parser, and there it gets coerced via doNegate(). * * {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10. * - * {realfail1} and {realfail2} are added to prevent the need for scanner + * {realfail} is added to prevent the need for scanner * backup when the {real} rule fails to match completely. */ +digit [0-9] integer {digit}+ decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*)) decimalfail {digit}+\.\. real ({integer}|{decimal})[Ee][-+]?{digit}+ -realfail1 ({integer}|{decimal})[Ee] -realfail2 ({integer}|{decimal})[Ee][-+] +realfail ({integer}|{decimal})[Ee][-+] + +integer_junk {integer}{ident_start} +decimal_junk {decimal}{ident_start} +real_junk {real}{ident_start} param \${integer} +param_junk \${integer}{ident_start} /* special characters for other dbms */ /* we have to react differently in compat mode */ @@ -603,7 +609,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ return BCONST; case xh: if (literalbuf[strspn(literalbuf, "0123456789abcdefABCDEF")] != '\0') - mmerror(PARSE_ERROR, ET_ERROR, "invalid hex string literal"); + mmerror(PARSE_ERROR, ET_ERROR, "invalid hexadecimal string literal"); base_yylval.str = psprintf("x'%s'", literalbuf); return XCONST; case xq: @@ -735,7 +741,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ } {dquote} { BEGIN(state_before_str_start); - if (literallen == 2) /* "U&" */ + if (literallen == 0) mmerror(PARSE_ERROR, ET_ERROR, "zero-length delimited identifier"); /* The backend will truncate the identifier here. We do not as it does not change the result. */ base_yylval.str = psprintf("U&\"%s\"", literalbuf); @@ -915,6 +921,9 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ base_yylval.ival = atol(yytext+1); return PARAM; } +{param_junk} { + mmfatal(PARSE_ERROR, "trailing junk after parameter"); + } {ip} { base_yylval.str = mm_strdup(yytext); @@ -939,22 +948,31 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ base_yylval.str = mm_strdup(yytext); return FCONST; } -{realfail1} { +{realfail} { /* - * throw back the [Ee], and figure out whether what + * throw back the [Ee][+-], and figure out whether what * remains is an {integer} or {decimal}. */ - yyless(yyleng - 1); - return process_integer_literal(yytext, &base_yylval); - } -{realfail2} { - /* throw back the [Ee][+-], and proceed as above */ yyless(yyleng - 2); return process_integer_literal(yytext, &base_yylval); } } /* */ { + /* + * Note that some trailing junk is valid in C (such as 100LL), so we + * contain this to SQL mode. + */ +{integer_junk} { + mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); + } +{decimal_junk} { + mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); + } +{real_junk} { + mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); + } + :{identifier}((("->"|\.){identifier})|(\[{array}\]))* { base_yylval.str = mm_strdup(yytext+1); return CVARIABLE; @@ -1013,7 +1031,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ char* endptr; errno = 0; - base_yylval.ival = strtoul((char *)yytext,&endptr,16); + base_yylval.ival = strtoul((char *) yytext, &endptr, 16); if (*endptr != '\0' || errno == ERANGE) { errno = 0; @@ -1148,7 +1166,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ */ for (i = strlen(yytext)-2; i > 0 && ecpg_isspace(yytext[i]); - i-- ) + i--) ; yytext[i+1] = '\0'; @@ -1272,7 +1290,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ } {exec_sql}{else}{space}*";" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */ - if ( preproc_tos == 0 ) + if (preproc_tos == 0) mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\""); else if (stacked_if_value[preproc_tos].else_branch) mmfatal(PARSE_ERROR, "more than one EXEC SQL ELSE"); @@ -1294,7 +1312,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ /* are we simulating Informix? */ if (INFORMIX_MODE) { - if ( preproc_tos == 0 ) + if (preproc_tos == 0) mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\""); else if (stacked_if_value[preproc_tos].else_branch) mmfatal(PARSE_ERROR, "more than one EXEC SQL ELSE"); @@ -1364,7 +1382,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ */ for (i = strlen(yytext)-2; i > 0 && ecpg_isspace(yytext[i]); - i-- ) + i--) ; yytext[i+1] = '\0'; @@ -1438,7 +1456,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ <> { if (yy_buffer == NULL) { - if ( preproc_tos > 0 ) + if (preproc_tos > 0) { preproc_tos = 0; mmfatal(PARSE_ERROR, "missing \"EXEC SQL ENDIF;\""); @@ -1461,7 +1479,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ if (yyin != NULL) fclose(yyin); - yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(yy_buffer->buffer); yylineno = yy_buffer->lineno; @@ -1643,7 +1661,7 @@ parse_include(void) if (strcmp(inc_file + strlen(inc_file) - 2, ".h") != 0) { strcat(inc_file, ".h"); - yyin = fopen( inc_file, "r" ); + yyin = fopen(inc_file, "r"); } } /* if the command was "include_next" we have to disregard the first hit */ @@ -1659,7 +1677,7 @@ parse_include(void) mmfatal(NO_INCLUDE_FILE, "could not open include file \"%s\" on line %d", yytext, yylineno); input_filename = mm_strdup(inc_file); - yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE )); + yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); yylineno = 1; output_line_number(); diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/de.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/de.po index caadb674..9575a1a2 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/de.po +++ b/third_party/spanner_pg/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-09-16 09:39+0000\n" -"PO-Revision-Date: 2021-09-16 14:00+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" @@ -235,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" @@ -379,12 +389,12 @@ 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:17675 +#: 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:18310 preproc.y:18635 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" @@ -394,180 +404,180 @@ msgstr "mehrdimensionale Arrays für einfache Datentypen werden nicht unterstüt msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "Verbindung %s wird mit %s überschrieben, durch DECLARE-Anweisung %s" -#: preproc.y:1753 +#: 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:2001 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl CONNECT" -#: preproc.y:2041 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl DISCONNECT" -#: preproc.y:2096 +#: 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:2118 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-Option ist nicht erlaubt im TYPE-Befehl" -#: preproc.y:2127 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-Option ist nicht erlaubt im VAR-Befehl" -#: preproc.y:2134 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-Option ist nicht erlaubt im WHENEVER-Befehl" -#: 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 +#: 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:2769 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL ist nicht implementiert" -#: preproc.y:3464 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN ist nicht implementiert" -#: preproc.y:10014 preproc.y:17250 +#: 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:10021 preproc.y:17260 +#: 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:10023 preproc.y:17262 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "Cursor »%s« ist bereits definiert" -#: preproc.y:10497 +#: 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:10830 preproc.y:10837 +#: 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:16942 preproc.y:16949 +#: 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:16985 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "»@« erwartet, »%s« gefunden" -#: preproc.y:16997 +#: 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:17000 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "»://« erwartet, »%s« gefunden" -#: preproc.y:17005 +#: 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:17031 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "»postgresql« erwartet, »%s« gefunden" -#: preproc.y:17034 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "ungültiger Verbindungstyp: %s" -#: preproc.y:17043 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "»@« oder »://« erwartet, »%s« gefunden" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "ungültiger Datentyp" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "unvollständige Anweisung" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "nicht erkanntes Token »%s«" -#: preproc.y:17212 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "Name »%s« ist bereits deklariert" -#: preproc.y:17478 +#: 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:17490 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "Intervallangabe hier nicht erlaubt" -#: preproc.y:17650 preproc.y:17702 +#: 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:17825 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "Zeiger auf varchar sind nicht implementiert" -#: preproc.y:18276 +#: 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:18593 +#: 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:18780 +#: 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:18821 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s bei »%s«" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/el.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/el.po index e0e1d550..7e7c0b2c 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/el.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/el.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 14\n" +"Project-Id-Version: ecpg (PostgreSQL) 15\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" +"POT-Creation-Date: 2023-04-12 08:10+0000\n" +"PO-Revision-Date: 2023-04-12 11:08+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -16,7 +16,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 3.0\n" +"X-Generator: Poedit 3.2.2\n" #: descriptor.c:64 #, c-format @@ -235,117 +235,127 @@ msgstr "ο δρομέας «%s» έχει δηλωθεί αλλά δεν έχε msgid "could not remove output file \"%s\"\n" msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου εξόδου «%s»\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "ατερμάτιστο /* σχόλιο" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "ατερμάτιστη bit κυριολεκτική συμβολοσειρά" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "ατερμάτιστη δεκαεξαδική κυριολεκτική συμβολοσειρά" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "μη έγκυρη bit κυριολεκτική συμβολοσειρά" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" -msgstr "μη έγκυρη hex κυριολεκτική συμβολοσειρά" +msgid "invalid hexadecimal string literal" +msgstr "μη έγκυρη δεκαεξαδική κυριολεκτική συμβολοσειρά" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "μη χειρισμένη προηγούμενη κατάσταση σε xqs\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "ανολοκλήρωτη συμβολοσειρά με εισαγωγικά" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "ατερμάτιστη dollar-quoted συμβολοσειρά" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "μηδενικού μήκους οριοθετημένο αναγνωριστικό" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "ατερμάτιστο αναγνωριστικό σε εισαγωγικά" -#: pgc.l:1082 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "ανεπιθύμητα στοιχεία μετά την παράμετρο" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "ανεπιθύμητα στοιχεία μετά κυριολεκτικό αριθμητικό" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "ένθετα /* ... */ σχόλια" -#: pgc.l:1175 +#: pgc.l:1193 #, 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 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, 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 +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, 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 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "λείπει «EXEC SQL ENDIF;»" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "περισσότερες από μία 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" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "λείπει αναγνωριστικό στην εντολή EXEC SQL IFDEF" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "λείπει αναγνωριστικό στην εντολή EXEC SQL DEFINE" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "συντακτικό σφάλμα στην εντολή EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "εσωτερικό σφάλμα: μη δυνατή κατάσταση· Παρακαλούμε όπως το αναφέρετε σε <%s>" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Σφάλμα: η διαδρομή ενσωμάτωσης «%s/%s» είναι πολύ μακρυά στη γραμμή %d, παρακάμπτεται\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου ενσωμάτωσης «%s» στη γραμμή %d" @@ -379,12 +389,12 @@ msgstr "δεν επιτρέπεται εκκινητής σε ορισμό τύ msgid "type name \"string\" is reserved in Informix mode" msgstr "το όνομα τύπου «string» είναι δεσμευμένο σε λειτουργία Informix" -#: preproc.y:552 preproc.y:17675 +#: preproc.y:552 preproc.y:17925 #, c-format msgid "type \"%s\" is already defined" msgstr "ο τύπος «%s» έχει ήδη οριστεί" -#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 +#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "οι πολυδιάστατες συστυχίες για απλούς τύπους δεδομένων δεν υποστηρίζονται" @@ -394,180 +404,180 @@ msgstr "οι πολυδιάστατες συστυχίες για απλούς msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "η σύνδεση %s αντικαθίσταται με %s από τη δήλωση DECLARE %s" -#: preproc.y:1753 +#: preproc.y:1767 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση CLOSE DATABASE" -#: preproc.y:2001 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση CONNECT" -#: preproc.y:2041 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση DISCONNECT" -#: preproc.y:2096 +#: preproc.y:2112 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση SET CONNECTION" -#: preproc.y:2118 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση TYPE" -#: preproc.y:2127 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "η επιλογή AT δεν επιτρέπεται σε δήλωση VAR" -#: preproc.y:2134 +#: preproc.y:2150 #, 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 +#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "μη υποστηριζόμενο χαρακτηριστικό που θα προωθηθεί στον διακομιστή" -#: preproc.y:2769 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL δεν είναι υλοποιημένο" -#: preproc.y:3464 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN δεν είναι υλοποιημένο" -#: preproc.y:10014 preproc.y:17250 +#: preproc.y:10230 preproc.y:17498 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "το «database» δεν μπορεί να χρησιμοποιηθεί ως όνομα δρομέα σε λειτουργία INFORMIX" -#: preproc.y:10021 preproc.y:17260 +#: preproc.y:10237 preproc.y:17508 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "η χρήση της μεταβλητής «%s» σε διαφορετικές δηλώσεις προτάσεων δεν υποστηρίζεται" -#: preproc.y:10023 preproc.y:17262 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "ο δρομέας «%s» έχει ήδη οριστεί" -#: preproc.y:10497 +#: preproc.y:10713 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "μη υποστηριζόμενη πλέον σύνταξη LIMIT #,# που θα προωθηθεί στον διακομιστή" -#: preproc.y:10830 preproc.y:10837 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "υποερώτημα σε FROM πρέπει να έχει ένα alias" -#: preproc.y:16942 preproc.y:16949 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS δεν δύναται να ορίσει INTO" -#: preproc.y:16985 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "ανέμενε «@», βρήκε «%s»." -#: preproc.y:16997 +#: preproc.y:17245 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "μόνο τα πρωτόκολλα \"TCP\" και \"UNIX\" και ο τύπος βάσης δεδομένων «postgresql» υποστηρίζονται" -#: preproc.y:17000 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "ανέμενε «://», βρήκε «%s»." -#: preproc.y:17005 +#: preproc.y:17253 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" -msgstr "οι υποδοχές πεδίου-Unix λειτουργούν μόνο στο «localhost» αλλά όχι στο «%s»" +msgstr "Οι υποδοχές πεδίου-Unix λειτουργούν μόνο στο «localhost» αλλά όχι στο «%s»" -#: preproc.y:17031 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "ανέμενε «postgresql», βρήκε «%s»." -#: preproc.y:17034 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "άκυρη επιλογή σύνδεσης: %s" -#: preproc.y:17043 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "ανέμενε «@» ή «://», βρήκε «%s»." -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "μη έγκυρος τύπος δεδομένων" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "ανολοκλήρωτη δήλωση" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "μη αναγνωρίσιμο διακριτικό «%s»" -#: preproc.y:17212 +#: preproc.y:17460 #, c-format msgid "name \"%s\" is already declared" msgstr "το όνομα «%s» έχει ήδη δηλωθεί" -#: preproc.y:17478 +#: preproc.y:17728 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "μόνο οι αριθμητικοί και δεκαδικοί τύποι δεδομένων έχουν όρισμα ακρίβειας/κλίμακας" -#: preproc.y:17490 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "προδιαγραφές διαστήματος δεν επιτρέπονται εδώ" -#: preproc.y:17650 preproc.y:17702 +#: preproc.y:17900 preproc.y:17952 #, c-format msgid "too many levels in nested structure/union definition" msgstr "πάρα πολλά επίπεδα σε ένθετο ορισμό δομής/ένωσης" -#: preproc.y:17825 +#: preproc.y:18075 #, c-format msgid "pointers to varchar are not implemented" msgstr "δείκτες σε varchar δεν είναι υλοποιημένοι" -#: preproc.y:18276 +#: preproc.y:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "δεν επιτρέπεται αρχικοποιητής σε εντολή EXEC SQL VAR" -#: preproc.y:18593 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "δεν επιτρέπονται δείκτες συστάδων για είσοδο" -#: preproc.y:18780 +#: preproc.y:19030 #, c-format msgid "operator not allowed in variable definition" msgstr "δεν επιτρέπεται χειριστής σε ορισμό μεταβλητής" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18821 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s σε ή κοντά σε «%s»" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/es.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/es.po index 365776d8..21d385ac 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/es.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 14\n" +"Project-Id-Version: ecpg (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:55+0000\n" -"PO-Revision-Date: 2021-10-13 23:43-0500\n" +"POT-Creation-Date: 2023-05-07 16:40+0000\n" +"PO-Revision-Date: 2022-10-20 09:05+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -241,117 +241,127 @@ msgstr "el cursor «%s» fue declarado pero no abierto" msgid "could not remove output file \"%s\"\n" msgstr "no se pudo eliminar el archivo de salida «%s»\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "comentario /* no cerrado" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "una cadena de bits está inconclusa" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "una cadena hexadecimal está inconclusa" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "cadena de bits no válida" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" +msgid "invalid hexadecimal string literal" msgstr "cadena hexadecimal no válida" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "estado previo no manejado en xqs\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "una cadena en comillas está inconclusa" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "una cadena separada por $ está inconclusa" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "identificador delimitado de longitud cero" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "un identificador en comillas está inconcluso" -#: pgc.l:1082 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "basura sigue después de un parámetro" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "basura sigue después de un literal numérico" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "comentarios /* ... */ anidados" -#: pgc.l:1175 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "falta un identificador en la orden 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 "demasiadas condiciones EXEC SQL IFDEF anidadas" -#: 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 "falta el «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 "falta el «EXEC SQL ENDIF;»" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "hay más de un 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 sin coincidencia" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "identificador faltante en la orden EXEC SQL IFDEF" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "identificador faltante en la orden EXEC SQL DEFINE" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "error de sintaxis en orden EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "error interno: estado no esperado; por favor reporte a <%s>" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Error: ruta de inclusión «%s/%s» es demasiada larga en la línea %d, omitiendo\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "no se pudo abrir el archivo a incluir «%s» en la línea %d" @@ -385,12 +395,12 @@ 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:17677 +#: preproc.y:552 preproc.y:17925 #, c-format msgid "type \"%s\" is already defined" msgstr "el tipo «%s» ya está definido" -#: preproc.y:577 preproc.y:18312 preproc.y:18637 variable.c:620 +#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:620 #, 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" @@ -400,180 +410,180 @@ msgstr "los arrays multidimensionales para tipos de datos simples no están sopo 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 +#: preproc.y:1767 #, 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:2001 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "la opción AT no está permitida en la sentencia CONNECT" -#: preproc.y:2041 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "la opción AT no está permitida en la sentencia DISCONNECT" -#: preproc.y:2096 +#: preproc.y:2112 #, 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:2118 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "la opción AT no está permitida en la sentencia TYPE" -#: preproc.y:2127 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "la opción AT no está permitida en la sentencia VAR" -#: preproc.y:2134 +#: preproc.y:2150 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "la opción AT no está permitida en la sentencia 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 +#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "característica no soportada será pasada al servidor" -#: preproc.y:2769 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL no está implementado" -#: preproc.y:3464 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN no está implementado" -#: preproc.y:10014 preproc.y:17250 +#: preproc.y:10230 preproc.y:17498 #, 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:10021 preproc.y:17260 +#: preproc.y:10237 preproc.y:17508 #, 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:10023 preproc.y:17262 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "el cursor «%s» ya está definido" -#: preproc.y:10497 +#: preproc.y:10713 #, 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:10830 preproc.y:10837 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "las subconsultas en FROM deben tener un alias" -#: preproc.y:16942 preproc.y:16949 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS no puede especificar INTO" -#: preproc.y:16985 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "se esperaba «@», se encontró «%s»" -#: preproc.y:16997 +#: preproc.y:17245 #, 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:17000 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "se esperaba «://», se encontró «%s»" -#: preproc.y:17005 +#: preproc.y:17253 #, 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:17031 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "se esperaba «postgresql», se encontró «%s»" -#: preproc.y:17034 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "tipo de conexión no válido: %s" -#: preproc.y:17043 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "se esperaba «@» o «://», se encontró «%s»" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "tipo de dato no válido" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "sentencia incompleta" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "elemento «%s» no reconocido" -#: preproc.y:17212 +#: preproc.y:17460 #, c-format msgid "name \"%s\" is already declared" msgstr "el nombre «%s» ya está declarado" -#: preproc.y:17480 +#: preproc.y:17728 #, 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:17492 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "la especificación de intervalo no está permitida aquí" -#: preproc.y:17652 preproc.y:17704 +#: preproc.y:17900 preproc.y:17952 #, 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:17827 +#: preproc.y:18075 #, c-format msgid "pointers to varchar are not implemented" msgstr "los punteros a varchar no están implementados" -#: preproc.y:18278 +#: preproc.y:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "inicializador no permitido en la orden EXEC SQL VAR" -#: preproc.y:18595 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "no se permiten los arrays de indicadores en la entrada" -#: preproc.y:18782 +#: preproc.y:19030 #, 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:18823 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/fr.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/fr.po index 5b09eb16..ca4aa527 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/fr.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/fr.po @@ -1,24 +1,26 @@ -# 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-08-27 02:09+0000\n" -"PO-Revision-Date: 2021-08-27 17:30+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 3.0\n" +"X-Generator: Poedit 3.0.1\n" #: descriptor.c:64 #, c-format @@ -240,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é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 longueur nulle" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "identifiant entre guillemets non terminé" -#: pgc.l:1082 +#: 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: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" @@ -386,12 +398,12 @@ 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:17675 +#: 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:18310 preproc.y:18635 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 "" @@ -403,186 +415,186 @@ msgstr "" 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:1753 +#: 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:2041 +#: 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:2096 +#: 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:2118 +#: 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:2127 +#: 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:2134 +#: 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: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 +#: 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:2769 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL n'est pas implanté" -#: preproc.y:3464 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN n'est pas implanté" -#: preproc.y:10014 preproc.y:17250 +#: 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:10021 preproc.y:17260 +#: 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:10023 preproc.y:17262 +#: 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:10497 +#: 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:10830 preproc.y:10837 +#: 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:16942 preproc.y:16949 +#: 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:16985 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "« @ » attendu, « %s » trouvé" -#: preproc.y:16997 +#: 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:17000 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "« :// » attendu, « %s » trouvé" -#: preproc.y:17005 +#: 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:17031 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "« postgresql » attendu, « %s » trouvé" -#: preproc.y:17034 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "type de connexion invalide : %s" -#: preproc.y:17043 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "« @ » ou « :// » attendu, « %s » trouvé" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "type de données invalide" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "instruction incomplète" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "jeton « %s » non reconnu" -#: preproc.y:17212 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "le nom « %s » est déjà défini" -#: preproc.y:17478 +#: 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:17490 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "interval de spécification non autorisé ici" -#: preproc.y:17650 preproc.y:17702 +#: 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:17825 +#: 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:18276 +#: 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:18593 +#: 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:18780 +#: 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:18821 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" @@ -722,15 +734,25 @@ msgstr "ce type de données ne supporte pas les pointeurs de pointeur" msgid "multidimensional arrays for structures are not supported" msgstr "les tableaux multidimensionnels ne sont pas supportés pour les structures" -#~ msgid "declared name %s is already defined" -#~ msgstr "le nom déclaré %s est déjà défini" +#~ msgid "" +#~ "\n" +#~ "Report bugs to .\n" +#~ msgstr "" +#~ "\n" +#~ "Rapporter les bogues à .\n" -#~ msgid "COPY TO STDIN is not possible" -#~ msgstr "COPY TO STDIN n'est pas possible" +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version affiche la version et quitte\n" + +#~ msgid "AT option not allowed in DEALLOCATE statement" +#~ msgstr "option AT non autorisée dans une instruction DEALLOCATE" #~ msgid "COPY FROM STDOUT is not possible" #~ msgstr "COPY FROM STDOUT n'est pas possible" +#~ 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" @@ -740,18 +762,8 @@ msgstr "les tableaux multidimensionnels ne sont pas supportés pour les structur #~ msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" #~ msgstr "une contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" -#~ msgid "AT option not allowed in DEALLOCATE statement" -#~ msgstr "option AT non autorisée dans une instruction DEALLOCATE" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" +#~ 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/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/it.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/it.po index bfdd9ea0..aef91c33 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/it.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/it.po @@ -16,10 +16,10 @@ msgid "" msgstr "" "Project-Id-Version: ecpg (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:08+0000\n" -"PO-Revision-Date: 2018-10-08 21:54+0100\n" -"Last-Translator: Daniele Varrazzo \n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-30 12:09+0000\n" +"PO-Revision-Date: 2022-09-30 15:07+0200\n" +"Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" "MIME-Version: 1.0\n" @@ -27,44 +27,49 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.3\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "la variabile \"%s\" deve essere di tipo numerico" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "il descrittore \"%s\" non esiste" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "il descrittore %s associato alla connessione %s non esiste" -#: 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 "il descrittore %s associato alla connessione predefinita non esiste" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "la voce \"%d\" dell'header del descrittore non esiste" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable è sempre 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member è sempre 0" -#: descriptor.c:280 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "la voce \"%s\" del descrittore non è implementata" -#: descriptor.c:290 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "la voce \"%s\" del descrittore non può essere impostata" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" @@ -73,7 +78,7 @@ msgstr "" "%s è il preprocessore SQL embedded di PostgreSQL per programmi scritti in C.\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -84,12 +89,12 @@ msgstr "" " %s [OPZIONE]... FILE...\n" "\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "Opzioni:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" @@ -98,7 +103,7 @@ msgstr "" " -c genera automaticamente il codice C dal codice SQL embedded;\n" " questo ha effetto su EXEC SQL TYPE\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid "" " -C MODE set compatibility mode; MODE can be one of\n" @@ -107,37 +112,37 @@ msgstr "" " -C MODO imposta la modalità di compatibilità; MODO può essere uno\n" " tra \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d genera l'output di debug del parser\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D SIMBOLO definisci SIMBOLO\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h analizza un file header, questa opzione include \"-c\"\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i analizza anche i file di sistema\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I DIRECTORY cerca gli include file in DIRECTORY\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o FILEOUT scrive il risultato in FILEOUT\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" @@ -146,27 +151,27 @@ msgstr "" " -r OPZIONE specifica il comportamento run-time; OPZIONE può essere:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression esegui in modalità test di regressione\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t attiva il commit automatico delle transazioni\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V --version mostra informazioni sulla versione ed esci\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostra questo aiuto ed esci\n" -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "" "\n" @@ -177,163 +182,193 @@ msgstr "" "Se non viene specificato nessun file di output, il nome è composto aggiungendo\n" ".c al nome del file di input, dopo aver tolto .pgc se presente.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"Puoi segnalare eventuali bug a .\n" +"Segnala i bug a <%s>.\n" -#: ecpg.c:139 +#: ecpg.c:63 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Pagina iniziale di %s: <%s>\n" + +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: percorso del proprio eseguibile non trovato\n" -#: ecpg.c:174 ecpg.c:331 ecpg.c:342 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: apertura del file \"%s\" fallita: %s\n" -#: ecpg.c:217 ecpg.c:230 ecpg.c:246 ecpg.c:272 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Prova \"%s --help\" per maggiori informazioni.\n" -#: ecpg.c:241 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: il supporto al debug del parser (-d) non è disponibile\n" -#: ecpg.c:260 +#: ecpg.c:262 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, il preprocessore di PostgreSQL per programmi in C, versione %s\n" -#: ecpg.c:262 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... la ricerca inizia da qui:\n" -#: ecpg.c:265 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "fine della lista di ricerca\n" -#: ecpg.c:271 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: non è stato specificato nessun file di input\n" -#: ecpg.c:465 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "il cursore \"%s\" è stato dichiarato, ma non aperto" -#: ecpg.c:478 preproc.y:127 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "rimozione del file di output \"%s\" fallita\n" -#: pgc.l:444 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "commento /* non terminato" +#: pgc.l:525 +#, c-format +msgid "unterminated bit string literal" +msgstr "letterale di stringa di bit non terminato" + +#: pgc.l:533 +#, c-format +msgid "unterminated hexadecimal string literal" +msgstr "letterale di stringa esadecimale non terminato" + # string literal sarebbe intraducubile infatti è come la stringa viene rappresentata nel linguaggio di programmazione, ma come si fa a tradurlo?.... # Secondo me "stringa letterale" -- Daniele -#: pgc.l:457 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "bit nella stringa letterale non valido" -#: pgc.l:466 +#: pgc.l:613 #, c-format -msgid "unterminated bit string literal" -msgstr "letterale di stringa di bit non terminato" +msgid "invalid hexadecimal string literal" +msgstr "letterale stringa esadecimale non valido" -#: pgc.l:482 +#: pgc.l:631 #, c-format -msgid "unterminated hexadecimal string literal" -msgstr "letterale di stringa esadecimale non terminato" +msgid "unhandled previous state in xqs\n" +msgstr "stato precedente non gestito in xqs\n" -#: pgc.l:560 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "stringa tra virgolette non terminata" -#: pgc.l:618 pgc.l:631 +#: pgc.l:708 +#, c-format +msgid "unterminated dollar-quoted string" +msgstr "stringa delimitata da dollari non terminata" + +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "identificativo delimitato di lunghezza zero" -#: pgc.l:639 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "identificativo tra virgolette non terminato" -#: pgc.l:921 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "spazzatura finale dopo il parametro" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "spazzatura finale dopo il letterale numerico" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "commenti /* ... */ annidati" -#: pgc.l:1014 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "identificativo mancante nel comando EXEC SQL UNDEF" -#: pgc.l:1060 pgc.l:1074 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "troppe condizioni EXEC SQL IFDEF annidate" + +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "mancata corrispondenza fra \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1063 pgc.l:1076 pgc.l:1252 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "manca \"EXEC SQL ENDIF;\"" -#: pgc.l:1092 pgc.l:1111 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "più di un EXEC SQL ELSE" -#: pgc.l:1133 pgc.l:1147 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF non corrispondente" -#: pgc.l:1167 -#, c-format -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "troppe condizioni EXEC SQL IFDEF annidate" - -#: pgc.l:1200 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "identificativo mancante nel comando EXEC SQL IFDEF" -#: pgc.l:1209 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "identificativo mancante nel comando EXEC SQL DEFINE" -#: pgc.l:1242 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "errore di sintassi nel comando EXEC SQL INCLUDE" -#: pgc.l:1291 +#: pgc.l:1503 #, c-format -msgid "internal error: unreachable state; please report this to " -msgstr "errore interno: stato non raggiungibile, si prega di segnalarlo a " +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "errore interno: stato irraggiungibile; per favore segnalalo a <%s>" -#: pgc.l:1420 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Errore: il percorso delle inclusioni \"%s/%s\" è troppo lungo alla riga %d, perciò viene saltato\n" -#: pgc.l:1443 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "apertura del file di include \"%s\" alla riga %d fallita" @@ -342,210 +377,220 @@ msgstr "apertura del file di include \"%s\" alla riga %d fallita" msgid "syntax error" msgstr "errore di sintassi" -#: preproc.y:81 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "ATTENZIONE: " -#: preproc.y:84 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "ERRORE: " -#: preproc.y:508 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "il cursore \"%s\" non esiste" -#: preproc.y:537 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "l'inizializzatore non è permesso nella definizione del tipo di dato" -#: preproc.y:539 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "il nome di tipo \"string\" è riservato alla modalità Informix" -#: preproc.y:546 preproc.y:15744 +#: preproc.y:552 preproc.y:17925 #, c-format msgid "type \"%s\" is already defined" msgstr "il tipo \"%s\" è già definito" -#: preproc.y:570 preproc.y:16402 preproc.y:16727 variable.c:620 +#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "gli array multidimensionali per tipi dato semplici non sono supportati" -#: preproc.y:1694 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "la connessione %s viene sovrascritta con %s dall'istruzione DECLARE %s" + +#: preproc.y:1767 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "l'opzione AT non è permessa nell'istruzione CLOSE DATABASE" -#: preproc.y:1903 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "l'opzione AT non è permessa nell'istruzione CONNECT" -#: preproc.y:1937 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "l'opzione AT non è permessa nell'istruzione DISCONNECT" -#: preproc.y:1992 +#: preproc.y:2112 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "l'opzione AT non è permessa nell'istruzione SET CONNECTION" -#: preproc.y:2014 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "l'opzione AT non è permessa nell'istruzione TYPE" -#: preproc.y:2023 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "l'opzione AT non è permessa nell'istruzione VAR" -#: preproc.y:2030 +#: preproc.y:2150 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "l'opzione AT non è permessa nell'istruzione WHENEVER" -#: preproc.y:2107 preproc.y:2279 preproc.y:2284 preproc.y:2400 preproc.y:4045 -#: preproc.y:5615 preproc.y:5624 preproc.y:5924 preproc.y:7523 preproc.y:9016 -#: preproc.y:9021 preproc.y:11812 +#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "al server è stata richiesta una funzionalità non supportata" -#: preproc.y:2658 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL non è implementato" -#: preproc.y:3386 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN non è implementato" -#: preproc.y:9969 preproc.y:15333 +#: preproc.y:10230 preproc.y:17498 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "\"database\" non può essere utilizzato come nome del cursore in modalità INFORMIX" + +#: preproc.y:10237 preproc.y:17508 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "usare la variabile \"%s\" in una diversa istruzione declare non è supportato" -#: preproc.y:9971 preproc.y:15335 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "il cursore \"%s\" è già definito" -#: preproc.y:10401 +#: preproc.y:10713 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "la sintassi LIMIT #,# passata al server non è più supportata" -#: preproc.y:10726 preproc.y:10733 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "la sottoquery in FROM deve avere un alias" -#: preproc.y:15063 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS non può specificare INTO" -#: preproc.y:15099 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "atteso \"@\", trovato \"%s\"" -#: preproc.y:15111 +#: preproc.y:17245 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "soltanto i protocolli \"tcp\" e \"unix\" ed il tipo database \"postgresql\" sono supportati" -#: preproc.y:15114 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "atteso \"://\", trovato \"%s\"" -#: preproc.y:15119 +#: preproc.y:17253 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "i socket di dominio Unix funzionano solo con \"localhost\" ma non con \"%s\"" -#: preproc.y:15145 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "atteso \"postgresql\", trovato \"%s\"" -#: preproc.y:15148 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "tipo di connessione non valido: %s" -#: preproc.y:15157 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "atteso \"@\" oppure \"://\", trovato \"%s\"" -#: preproc.y:15232 preproc.y:15250 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "tipo dato non valido" -#: preproc.y:15261 preproc.y:15278 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "istruzione incompleta" -#: preproc.y:15264 preproc.y:15281 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "token \"%s\" sconosciuto" -#: preproc.y:15555 +#: preproc.y:17460 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "il nome \"%s\" è già stato dichiarato" + +#: preproc.y:17728 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "solo i dati di tipo numeric e decimal hanno argomento precisione/scala" -#: preproc.y:15567 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "specificazione di intervallo non permessa qui" -#: preproc.y:15719 preproc.y:15771 +#: preproc.y:17900 preproc.y:17952 #, c-format msgid "too many levels in nested structure/union definition" msgstr "troppi livelli nidificati nella definizione della struttura/unione" -#: preproc.y:15910 +#: preproc.y:18075 #, c-format msgid "pointers to varchar are not implemented" msgstr "i puntatori a varchar non sono implementati" -#: preproc.y:16097 preproc.y:16122 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "si sta utilizzando una istruzione DESCRIBE non supportata" - -#: preproc.y:16369 +#: preproc.y:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "initializer non è permesso nel comando EXEC SQL VAR" -#: preproc.y:16685 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "array di indicatori non sono permessi" -#: preproc.y:16906 +#: preproc.y:19030 #, c-format msgid "operator not allowed in variable definition" msgstr "operatore non permesso nella definizione di variabile" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:16947 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s a o presso \"%s\"" @@ -555,63 +600,63 @@ msgstr "%s a o presso \"%s\"" msgid "out of memory" msgstr "memoria esaurita" -#: type.c:212 type.c:676 +#: type.c:214 type.c:685 #, c-format msgid "unrecognized variable type code %d" msgstr "tipo di variabile sconosciuto codice %d" -#: type.c:261 +#: type.c:263 #, c-format msgid "variable \"%s\" is hidden by a local variable of a different type" msgstr "la variabile \"%s\" è nascosta da una variabile locale di tipo diverso" -#: type.c:263 +#: type.c:265 #, c-format msgid "variable \"%s\" is hidden by a local variable" msgstr "la variabile \"%s\" è nascosta da una variabile locale" -#: type.c:275 +#: type.c:277 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "la variabile di indicatore \"%s\" è nascosta da una variabile locale di tipo diverso" -#: type.c:277 +#: type.c:279 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable" msgstr "la variabile di indicatore \"%s\" è nascosta da una variabile locale" -#: type.c:285 +#: type.c:287 #, c-format msgid "indicator for array/pointer has to be array/pointer" msgstr "un indicatore per un array/puntatore deve essere un array/puntatore" -#: type.c:289 +#: type.c:291 #, c-format msgid "nested arrays are not supported (except strings)" msgstr "array annidati non sono supportati (tranne che per le stringhe)" -#: type.c:331 +#: type.c:333 #, c-format msgid "indicator for struct has to be a struct" msgstr "un indicatore per una struttura deve essere una struttura" # capire meglio i "simple data types" -#: type.c:351 type.c:372 type.c:392 +#: type.c:353 type.c:374 type.c:394 #, c-format msgid "indicator for simple data type has to be simple" msgstr "un indicatore per un tipo di dato semplice deve essere semplice" -#: type.c:616 +#: type.c:625 #, c-format msgid "indicator struct \"%s\" has too few members" msgstr "l'indicatore struttura \"%s\" non ha abbastanza membri" -#: type.c:624 +#: type.c:633 #, c-format msgid "indicator struct \"%s\" has too many members" msgstr "l'indicatore struttura \"%s\" ha troppi membri" -#: type.c:735 +#: type.c:744 #, c-format msgid "unrecognized descriptor item code %d" msgstr "descrittore di codice %d sconosciuto" @@ -677,3 +722,6 @@ msgstr "il puntatore a puntatore non è supportato per questo tipo di dato" #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "gli array multidimensionali per strutture non sono supportati" + +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "si sta utilizzando una istruzione DESCRIBE non supportata" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ja.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ja.po index 30196c1a..3c97ba8a 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ja.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ja.po @@ -4,17 +4,17 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL 14)\n" +"Project-Id-Version: ecpg (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-25 17:29+0900\n" -"PO-Revision-Date: 2021-08-25 17:34+0900\n" +"POT-Creation-Date: 2022-08-09 12:00+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" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" #: descriptor.c:64 @@ -30,7 +30,7 @@ msgstr "接続%2$sに関連付けられている記述子%1$sは存在しませ #: descriptor.c:127 descriptor.c:158 #, c-format msgid "descriptor %s bound to the default connection does not exist" -msgstr "デフォルト接続に関連付けられている記述し%sは存在しません" +msgstr "デフォルト接続に関連付けられている記述子%sは存在しません" #: descriptor.c:173 descriptor.c:225 #, c-format @@ -88,8 +88,8 @@ msgid "" " -c automatically generate C code from embedded SQL code;\n" " this affects EXEC SQL TYPE\n" msgstr "" -" -c 埋め込まれたSQLコードを元にC言語コードを自動的に生成します\n" -" これはEXEC SQL TYPEに影響を与えます\n" +" -c 埋め込まれたSQLコードを元にC言語コードを自動的に生成\n" +" これはEXEC SQL TYPEに影響を与える\n" #: ecpg.c:44 #, c-format @@ -98,39 +98,39 @@ msgid "" " \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" msgstr "" " -C MODE 互換モードを設定; MODEは\"INFORMIX\"、 \"INFORMIX_SE\"、\n" -" \"ORACLE\"のいずれかです\n" +" \"ORACLE\"のいずれか\n" #: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" -msgstr " -d パーサのデバッグ出力を有効にします\n" +msgstr " -d パーサのデバッグ出力を有効にする\n" #: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" -msgstr " -D SYMBOL シンボル 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 ヘッダファイルをパースします。このオプションには\"-c\"オプション\n" -" が含まれます\n" +" -h ヘッダファイルをパースする。このオプションには\"-c\"オプション\n" +" が含まれる\n" #: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" -msgstr " -i システムインクルードファイルもパースします\n" +msgstr " -i システムインクルードファイルもパースする\n" #: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" -msgstr " -I DIRECTORY DIRECTORYからインクルードファイルを検索します\n" +msgstr " -I DIRECTORY DIRECTORYからインクルードファイルを検索する\n" #: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" -msgstr " -o OUTFILE 結果をOUTFILEに出力します\n" +msgstr " -o OUTFILE 結果をOUTFILEに出力する\n" #: ecpg.c:54 #, c-format @@ -138,28 +138,28 @@ msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" msgstr "" -" -r OPTION 実行時の動作を指定します。オプションは次のいずれかです\n" +" -r OPTION 実行時の動作を指定する。オプションは次のいずれか\n" " \"no_indicator\"、\"prepare\"、\"questionmarks\"\n" #: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" -msgstr " --regression リグレッション試験モードで実行します\n" +msgstr " --regression リグレッション試験モードで実行\n" #: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" -msgstr " -t トランザクションの自動コミットを有効にします\n" +msgstr " -t トランザクションの自動コミットを有効にする\n" #: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version バージョン情報を出力して、終了します\n" +msgstr " -V, --version バージョン情報を出力して終了\n" #: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help このヘルプを表示して、終了します\n" +msgstr " -?, --help このヘルプを表示して終了\n" #: ecpg.c:60 #, c-format @@ -189,7 +189,7 @@ msgstr "%s ホームページ: <%s>\n" #: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" -msgstr "%s: 自身の実行ファイルが見つかりませんでした\n" +msgstr "%s: 自身の実行ファイルの場所がわかりません\n" #: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format @@ -199,7 +199,7 @@ 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" +msgstr "詳細は\"%s --help\"を実行してください。\n" #: ecpg.c:243 #, c-format @@ -236,117 +236,127 @@ msgstr "カーソル%sは宣言されましたが、オープンされていま msgid "could not remove output file \"%s\"\n" msgstr "出力ファイル\"%s\"を削除できませんでした\n" -#: pgc.l:501 +#: pgc.l:507 #, c-format msgid "unterminated /* comment" msgstr "/*コメントが閉じていません" -#: pgc.l:518 +#: pgc.l:524 #, c-format msgid "unterminated bit string literal" -msgstr "ビット列リテラルの終端がありません" +msgstr "ビット文字列リテラルの終端がありません" -#: pgc.l:526 +#: pgc.l:532 #, c-format msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルの終端がありません" -#: pgc.l:601 +#: pgc.l:607 #, c-format msgid "invalid bit string literal" msgstr "無効なビット列リテラルです" -#: pgc.l:606 +#: pgc.l:612 #, c-format -msgid "invalid hex string literal" -msgstr "不正な16進文字列リテラルです" +msgid "invalid hexadecimal string literal" +msgstr "不正な16進数文字列リテラル" -#: pgc.l:624 +#: pgc.l:630 #, c-format msgid "unhandled previous state in xqs\n" msgstr "xqsの中で処理されない前ステート\n" -#: pgc.l:650 pgc.l:759 +#: pgc.l:656 pgc.l:765 #, c-format msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: pgc.l:701 +#: pgc.l:707 #, c-format msgid "unterminated dollar-quoted string" msgstr "文字列のドル引用符が閉じていません" -#: pgc.l:719 pgc.l:739 +#: pgc.l:725 pgc.l:745 #, c-format msgid "zero-length delimited identifier" -msgstr "二重引用符で囲まれた識別子の長さがゼロです" +msgstr "区切りつき識別子の長さがゼロです" -#: pgc.l:750 +#: pgc.l:756 #, c-format msgid "unterminated quoted identifier" msgstr "識別子の引用符が閉じていません" -#: pgc.l:1081 +#: 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:1174 +#: pgc.l:1192 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "EXEC SQL UNDEFコマンドにおいて識別子がありません" -#: pgc.l:1192 pgc.l:1205 pgc.l:1221 pgc.l:1234 +#: 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:1250 pgc.l:1261 pgc.l:1276 pgc.l:1298 +#: 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:1252 pgc.l:1263 pgc.l:1444 +#: pgc.l:1270 pgc.l:1281 pgc.l:1462 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\"がありません" -#: pgc.l:1278 pgc.l:1300 +#: pgc.l:1296 pgc.l:1318 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "1つ以上のEXEC SQL ELSE\"が存在します" -#: pgc.l:1323 pgc.l:1337 +#: pgc.l:1341 pgc.l:1355 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIFに対応するものがありません" -#: pgc.l:1392 +#: pgc.l:1410 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEFコマンドにおいて識別子がありません" -#: pgc.l:1401 +#: pgc.l:1419 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINEコマンドにおいて識別子がありません" -#: pgc.l:1434 +#: pgc.l:1452 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDEコマンドにおいて構文エラーがあります" -#: pgc.l:1484 +#: pgc.l:1502 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "内部エラー: 到達しないはずの状態です。<%s>まで報告してください" -#: pgc.l:1637 +#: 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" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "行番号%2$dのインクルードファイル\"%1$s\"をオープンすることができませんでした" @@ -380,12 +390,12 @@ msgstr "型定義では初期化子は許されません" msgid "type name \"string\" is reserved in Informix mode" msgstr "型名\"string\"はInformixモードですでに予約されています" -#: preproc.y:552 preproc.y:17675 +#: preproc.y:552 preproc.y:19354 #, c-format msgid "type \"%s\" is already defined" msgstr "\"%s\"型はすでに定義されています" -#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 +#: preproc.y:577 preproc.y:19989 preproc.y:20314 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "単純なデータ型の多次元配列はサポートされていません" @@ -393,182 +403,182 @@ msgstr "単純なデータ型の多次元配列はサポートされていませ #: preproc.y:599 #, c-format msgid "connection %s is overwritten with %s by DECLARE statement %s" -msgstr "接続%1$sはDECLARE文%3$sで%2$sに上書きされます" +msgstr "DECLARE文%3$sにより接続%1$sは%2$sで上書きされます" -#: preproc.y:1753 +#: preproc.y:1872 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASE文ではATオプションは許されません" -#: preproc.y:2001 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT文ではATオプションは許されません" -#: preproc.y:2041 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT文ではATオプションは許されません" -#: preproc.y:2096 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION文ではATオプションは許されません" -#: preproc.y:2118 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE文ではATオプションは許されません" -#: preproc.y:2127 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR文ではATオプションは許されません" -#: preproc.y:2134 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER文ではATオプションは許されません" -#: 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 +#: 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 "非サポートの機能がサーバに渡されます" +msgstr "非サポートの機能がサーバーに渡されます" -#: preproc.y:2769 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALLは実装されていません" -#: preproc.y:3464 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDINは実装されていません" -#: preproc.y:10014 preproc.y:17250 +#: preproc.y:10335 preproc.y:18892 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "INFORMIXモードでは\"database\"をカーソル名として使用できません" -#: preproc.y:10021 preproc.y:17260 +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "異なったdeclareステートメントにおける変数\"%s\"の使用はサポートされていません" -#: preproc.y:10023 preproc.y:17262 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "カーソル\"%s\"はすでに定義されています" -#: preproc.y:10497 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" -msgstr "サーバに渡されるLIMIT #,#構文はもはやサポートされていません" +msgstr "サーバーに渡されるLIMIT #,#構文はもはやサポートされていません" -#: preproc.y:10830 preproc.y:10837 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" -msgstr "FROM句の副問い合わせには別名が必要です" +msgstr "FROM句の副問い合わせは別名を持たなければなりません" -#: preproc.y:16942 preproc.y:16949 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE ASはINTOを指定できません" -#: preproc.y:16985 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "想定では\"@\"、結果では\"%s\"" -#: preproc.y:16997 +#: preproc.y:18639 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "プロトコルでは\"tcp\"および\"unix\"のみ、データベースの種類では\"postgresql\"のみがサポートされています" -#: preproc.y:17000 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "想定では\"://\"、結果では\"%s\"" -#: preproc.y:17005 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unixドメインソケットは\"localhost\"でのみで動作し、\"%s\"では動作しません" -#: preproc.y:17031 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "想定では\"postgresql\"、結果では\"%s\"" -#: preproc.y:17034 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "無効な接続種類: %s" -#: preproc.y:17043 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "想定では\"@または\"\"://\"、結果では\"%s\"" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "無効なデータ型" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "不完全な文" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "認識できないトークン\"%s\"" -#: preproc.y:17212 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "名前\"%s\"はすでに定義されています" -#: preproc.y:17478 +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" -msgstr "数値データ型または10進数データ型のみが精度/位取りの引数を取ることができます" +msgstr "数値データ型または10進数データ型のみが精度/位取り引数と取ることができます" -#: preproc.y:17490 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "時間間隔の指定はここでは許されません" -#: preproc.y:17650 preproc.y:17702 +#: preproc.y:19329 preproc.y:19381 #, c-format msgid "too many levels in nested structure/union definition" msgstr "構造体/ユニオンの定義の入れ子レベルが深すぎます" -#: preproc.y:17825 +#: preproc.y:19504 #, c-format msgid "pointers to varchar are not implemented" msgstr "varcharを指し示すポインタは実装されていません" -#: preproc.y:18276 +#: preproc.y:19955 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VARコマンドでは初期化子は許されません" -#: preproc.y:18593 +#: preproc.y:20272 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "指示子配列は入力として許されません" -#: preproc.y:18780 +#: preproc.y:20459 #, c-format msgid "operator not allowed in variable definition" msgstr "変数定義では演算子は許されません" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18821 +#: preproc.y:20500 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"またはその近辺で%1$s" @@ -576,7 +586,7 @@ msgstr "\"%2$s\"またはその近辺で%1$s" #: type.c:18 type.c:30 #, c-format msgid "out of memory" -msgstr "メモリ不足" +msgstr "メモリ不足です" #: type.c:214 type.c:685 #, c-format @@ -687,8 +697,7 @@ msgstr "多次元配列はサポートされません" #, 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] "複数レベルのポインタ(3レベル以上)はサポートされません。%dレベルあります" -msgstr[1] "複数レベルのポインタ(3レベル以上)はサポートされません。%dレベルあります" +msgstr[0] "複数レベルのポインタ(2レベル以上)はサポートされません。%dレベルあります" #: variable.c:539 #, c-format @@ -699,3 +708,20 @@ msgstr "このデータ型では、ポインタを指し示すポインタはサ #, c-format 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" +#~ msgstr "" +#~ "\n" +#~ "不具合はに報告してください。\n" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ka.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ka.po new file mode 100644 index 00000000..6399849f --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ka.po @@ -0,0 +1,734 @@ +# Georgian message translation file for ecpg +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpg (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: ecpg (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-02 04:39+0000\n" +"PO-Revision-Date: 2022-07-13 13:13+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1.1\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 "განულებადი ყოველთვის 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 PostgreSQL-ში ჩაშენებული SQL პრეპროცესორია 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 ჩადგმული SQL კოდიდან C-ის კოდის ავტომატური გენერაცია;\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 რეჟიმი თავსებადობის დაყენება. რეჟიმი შეიძლება იყოს:\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" + +#: ecpg.c:47 +#, c-format +msgid " -d generate parser debug output\n" +msgstr " -d დამმუშავებლის გასამართი ინფორმაციის გენერაცია\n" + +#: ecpg.c:49 +#, c-format +msgid " -D SYMBOL define SYMBOL\n" +msgstr " -D ფუნქცია ფუნქციის აღწერა\n" + +#: ecpg.c:50 +#, c-format +msgid "" +" -h parse a header file, this option includes option \"-c\"\n" +msgstr "" +" -h თავსართის ფაილის დამუშავება. ეს პარამეტრი ასევე შეიცავს " +"პარამეტრს \"-c\"\n" + +#: ecpg.c:51 +#, c-format +msgid " -i parse system include files as well\n" +msgstr " -i დამუშავებისას სისტემური ფაილების ჩართვა\n" + +#: ecpg.c:52 +#, c-format +msgid " -I DIRECTORY search DIRECTORY for include files\n" +msgstr "" +" -I საქაღალდე თავსართის ფაილების ძებნისას მათი ალტერნატიული მდებარეობა\n" + +#: ecpg.c:53 +#, c-format +msgid " -o OUTFILE write result to OUTFILE\n" +msgstr "" +" -o გამოსატანიფაილი გამოტანილი ინფორმაციის მითითებულ ფაილში ჩაწერა\n" + +#: ecpg.c:54 +#, c-format +msgid "" +" -r OPTION specify run-time behavior; OPTION can be:\n" +" \"no_indicator\", \"prepare\", \"questionmarks\"\n" +msgstr "" +" -r პარამეტრი გაშვების ქცევა; პარამეტრი შეიძლება იყოს:\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" +"თუ გამოსატანი ფაილი მითითებული არაა, სახელი იქმნება \n" +"შეყვანის ფაილის სახელისთვის .c- ს დამატებით, წარდგენის შემთხვევაში .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, PostgreSQL-ის ჩაშენებული C პრეპროცესორი, ვერსია %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:508 +#, c-format +msgid "unterminated /* comment" +msgstr "დაუსრულებელი /* კომენტარი" + +#: pgc.l:525 +#, c-format +msgid "unterminated bit string literal" +msgstr "გაწყვეტილი ბიტური სტრიქონი" + +#: pgc.l:533 +#, c-format +msgid "unterminated hexadecimal string literal" +msgstr "გაწყვეტილი თექვსმეტობითი სტრიქონი" + +#: pgc.l:608 +#, c-format +msgid "invalid bit string literal" +msgstr "არასწორი ბიტური სტრიქონი" + +#: pgc.l:613 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "არასწორი თექვსმეტობითი სტრიქონი" + +#: pgc.l:631 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "დაუმუშავებელი წინა მდგომარეობა დაუხურავი ბრჭყალის აღმოჩენისას\n" + +#: pgc.l:657 pgc.l:766 +#, c-format +msgid "unterminated quoted string" +msgstr "ბრჭყალებში ჩასმული ციტატის დაუსრულებელი სტრიქონი" + +#: pgc.l:708 +#, c-format +msgid "unterminated dollar-quoted string" +msgstr "$-ით დაწყებული სტრიქონ დაუმთავრებელია" + +#: pgc.l:726 pgc.l:746 +#, c-format +msgid "zero-length delimited identifier" +msgstr "გამყოფის ნულოვანი სიგრძის იდენტიფიკატორი" + +#: pgc.l:757 +#, c-format +msgid "unterminated quoted identifier" +msgstr "დაუსრულებელი იდენტიფიკატორი ბრჭყალებში" + +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "პარამეტრის შემდეგ მოყოლილი მონაცემები ნაგავია" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "რიცხვითი მნიშვნელობის შემდეგ მონაცემები ნაგავია" + +#: pgc.l:1100 +#, c-format +msgid "nested /* ... */ comments" +msgstr "ჩადგმული /* ... */ კომენტარები" + +#: pgc.l:1193 +#, c-format +msgid "missing identifier in EXEC SQL UNDEF command" +msgstr "ბრძანებაში EXEC SQL UNDEF იდენტიფიკატორი აკლია" + +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "\"EXEC SQL IFDEF\"-ის მეტისმეტად ბევრი ჩადგმული პირობა" + +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#, c-format +msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" +msgstr "შესატყვისი \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\" არ არსებობს" + +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#, c-format +msgid "missing \"EXEC SQL ENDIF;\"" +msgstr "აკლია \"EXEC SQL ENDIF;\"" + +#: pgc.l:1297 pgc.l:1319 +#, c-format +msgid "more than one EXEC SQL ELSE" +msgstr "ერთზე მეტი EXEC SQL ELSE" + +#: pgc.l:1342 pgc.l:1356 +#, c-format +msgid "unmatched EXEC SQL ENDIF" +msgstr "უწყვილო EXEC SQL ENDIF" + +#: pgc.l:1411 +#, c-format +msgid "missing identifier in EXEC SQL IFDEF command" +msgstr "ბრძანებას: EXEC SQL IFDEFიდენტიფიკატორი აკლია" + +#: pgc.l:1420 +#, c-format +msgid "missing identifier in EXEC SQL DEFINE command" +msgstr "ბრძანებას: EXEC SQL DEFINE იდენტიფიკატორი აკლია" + +#: pgc.l:1453 +#, c-format +msgid "syntax error in EXEC SQL INCLUDE command" +msgstr "სინტაქსური შეცდომა ბრძანებაში: EXEC SQL INCLUDE" + +#: pgc.l:1503 +#, c-format +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "შიდა შეცდომა: მდგომარეობა მიუწვდომელია; მისწერეთ ეს <%s>-ს" + +#: pgc.l:1655 +#, c-format +msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" +msgstr "" +"შეცდომა: ჩასართავი ბილიკი \"%s/%s\" ძალიან გრძელია, ხაზზე %d. გამოტოვება\n" + +#: pgc.l:1678 +#, 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 "informix-ის რეჟიმში ტიპის სახელი \"string\" დაცულია" + +#: preproc.y:552 preproc.y:19354 +#, c-format +msgid "type \"%s\" is already defined" +msgstr "ტიპი უკვე აღწერილია: %s" + +#: preproc.y:577 preproc.y:19989 preproc.y:20314 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: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:2162 +#, c-format +msgid "AT option not allowed in DISCONNECT statement" +msgstr "ოპერატორში \"DISCONNECT\" პარამეტრი \"AT\" დაუშვებელია" + +#: preproc.y:2217 +#, c-format +msgid "AT option not allowed in SET CONNECTION statement" +msgstr "ოპერატორში \"SET CONNECTION\" პარამეტრი \"AT\" დაუშვებელია" + +#: preproc.y:2239 +#, c-format +msgid "AT option not allowed in TYPE statement" +msgstr "ოპერატორში \"TYPE\" პარამეტრი \"AT\" დაუშვებელია" + +#: preproc.y:2248 +#, c-format +msgid "AT option not allowed in VAR statement" +msgstr "ოპერატორში \"VAR\" პარამეტრი \"AT\" დაუშვებელია" + +#: preproc.y:2255 +#, c-format +msgid "AT option not allowed in WHENEVER statement" +msgstr "ოპერატორში \"WHENEVER\" პარამეტრი \"AT\" დაუშვებელია" + +#: 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:2890 +#, c-format +msgid "SHOW ALL is not implemented" +msgstr "SHOW ALL განხორციელებული არაა" + +#: preproc.y:3589 +#, c-format +msgid "COPY FROM STDIN is not implemented" +msgstr "COPY FROM STDIN განხორციელებული არაა" + +#: preproc.y:10335 preproc.y:18892 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "" +"\"database\" არ შეიძლება გამოყენებულ იქნას როგორც კურსორის სახელი INFORMIX " +"რეჟიმში" + +#: preproc.y:10342 preproc.y:18902 +#, c-format +msgid "using variable \"%s\" in different declare statements is not supported" +msgstr "\"%s\"ცვლადის სხვადასხვა პირობებში აღწერა მხარდაუჭერელია" + +#: preproc.y:10344 preproc.y:18904 +#, c-format +msgid "cursor \"%s\" is already defined" +msgstr "კურსორი უკვე აღწერილია: \"%s\"" + +#: preproc.y:10818 +#, c-format +msgid "no longer supported LIMIT #,# syntax passed to server" +msgstr "სერვერზე გადაცემული LIMIT #.# სინტაქსი მხარდაჭერილი აღარაა" + +#: preproc.y:11151 preproc.y:11158 +#, c-format +msgid "subquery in FROM must have an alias" +msgstr "ქვემოთხოვნას \"FROM\"-ში მეტსახელი უნდა ჰქონდეს" + +#: preproc.y:18584 preproc.y:18591 +#, c-format +msgid "CREATE TABLE AS cannot specify INTO" +msgstr "CREATE TABLE AS არ შეიძლება INTO მიეთითოს" + +#: preproc.y:18627 +#, c-format +msgid "expected \"@\", found \"%s\"" +msgstr "მოველოდი \"@\", მივიღე \"%s\"" + +#: preproc.y:18639 +#, c-format +msgid "" +"only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " +"supported" +msgstr "" +"მხარდაჭერილია მხოლოდ პროტოკოლები \"tcp\" და \"unix\" და მონაცემთა ბაზის " +"ტიპი \"postgresql\"" + +#: preproc.y:18642 +#, c-format +msgid "expected \"://\", found \"%s\"" +msgstr "მოველოდი \"://\", მივიღე \"%s\"" + +#: preproc.y:18647 +#, c-format +msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" +msgstr "" +"Unix-დომენის სოკეტები მხოლოდ \"localhost\"-ზე მუშაობს. მაგრამ არა \"%s\"-ზე" + +#: preproc.y:18673 +#, c-format +msgid "expected \"postgresql\", found \"%s\"" +msgstr "მოველოდი \"postgresql\", მივიღე \"%s\"" + +#: preproc.y:18676 +#, c-format +msgid "invalid connection type: %s" +msgstr "შეერთების არასწორი ტიპი: %s" + +#: preproc.y:18685 +#, c-format +msgid "expected \"@\" or \"://\", found \"%s\"" +msgstr "მოველოდი \"@\"-ს ან \"://\"-ს, მივიღე \"%s\"" + +#: preproc.y:18760 preproc.y:18778 +#, c-format +msgid "invalid data type" +msgstr "მონაცემების არასწორი ტიპი" + +#: preproc.y:18789 preproc.y:18806 +#, c-format +msgid "incomplete statement" +msgstr "არასწორი პირობა" + +#: preproc.y:18792 preproc.y:18809 +#, c-format +msgid "unrecognized token \"%s\"" +msgstr "უცნობი კოდი \"%s\"" + +#: preproc.y:18854 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "სახელი \"%s\" უკვე აღწერილია" + +#: preproc.y:19120 +#, c-format +msgid "only data types numeric and decimal have precision/scale argument" +msgstr "" +"სიზუსტის / მასშტაბის არგუმენტი მხოლოდ მონაცემთა ტიპებს numeric და decimal " +"აქვთ" + +#: preproc.y:19132 +#, c-format +msgid "interval specification not allowed here" +msgstr "აქ ინტერვალის სპეციფიკაცია დაუშვებელია" + +#: preproc.y:19329 preproc.y:19381 +#, c-format +msgid "too many levels in nested structure/union definition" +msgstr "ჩადგმული სტრუქტურის/გაერთიანების მეტისმეტად ბევრი დონე" + +#: preproc.y:19504 +#, c-format +msgid "pointers to varchar are not implemented" +msgstr "varchar-ზე მაჩვენებლები მხარდაუჭერელია" + +#: preproc.y:19955 +#, c-format +msgid "initializer not allowed in EXEC SQL VAR command" +msgstr "ინიციალიზატორი დაუშვებელია EXEC SQL VAR ბრძანებაში" + +#: preproc.y:20272 +#, c-format +msgid "arrays of indicators are not allowed on input" +msgstr "შესაყვანად ინდიკატორების მასივები დაუშვებელია" + +#: preproc.y:20459 +#, c-format +msgid "operator not allowed in variable definition" +msgstr "ცვლადის აღწერისას ოპერატორს ვერ გამოიყენებთ" + +#. translator: %s is typically the translation of "syntax error" +#: preproc.y:20500 +#, 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/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ko.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ko.po index 43516f9f..f5dd327e 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ko.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 13\n" +"Project-Id-Version: ecpg (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:09+0000\n" -"PO-Revision-Date: 2020-10-05 16:55+0900\n" +"POT-Creation-Date: 2023-04-12 00:40+0000\n" +"PO-Revision-Date: 2023-04-05 18:10+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\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 "null 허용 여부는 항상 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은(는) C 프로그램용 PostgreSQL 포함 SQL 전처리기입니다.\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -72,12 +77,12 @@ msgstr "" " %s [OPTION]... 파일...\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 포함된 SQL 코드에서 자동으로 C 코드를 생성합니다.\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" @@ -96,38 +101,38 @@ msgstr "" "다.\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 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 시스템 포함 파일도 구문 분석\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I DIRECTORY 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" @@ -137,27 +142,27 @@ msgstr "" "다.\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" @@ -168,7 +173,7 @@ msgstr "" "출력 파일 이름을 지정하지 않으면 입력 파일 이름에 .pgc가 있을 경우 제거하고\n" ".c를 추가하여 이름이 지정됩니다.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" @@ -177,169 +182,183 @@ 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" -#: 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 포함 C 전처리기, 버전 %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" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "마무리 안된 /* 주석" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "마무리 안된 비트 문자열 문자" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "마무리 안된 16진수 문자열 문자" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "잘못된 비트 문자열 리터럴" -#: pgc.l:623 +#: pgc.l:613 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "잘못된 16진수 문자열 문자" + +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "xqs 안에 다룰 수 없는 이전 상태값 있음\n" -#: pgc.l:652 pgc.l:754 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "마무리 안된 따옴표 안의 문자열" -#: pgc.l:703 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "마무리 안된 따옴표 안의 문자열" -#: pgc.l:721 pgc.l:734 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "길이가 0인 구분 식별자" -#: pgc.l:745 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "마무리 안된 따옴표 안의 식별자" -#: pgc.l:1076 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "매개 변수 뒤에 뭔가 붙었음" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "숫자 뒤에 문자가 붙었습니다" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "중첩된 /* ... */ 주석" -#: pgc.l:1169 +#: pgc.l:1193 #, 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:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, 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:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, 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:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\" 누락" -#: pgc.l:1273 pgc.l:1295 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "두 개 이상의 EXEC SQL ELSE" -#: pgc.l:1318 pgc.l:1332 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "일치하지 않는 EXEC SQL ENDIF" -#: pgc.l:1387 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEF 명령에 식별자 누락" -#: pgc.l:1396 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINE 명령에 식별자 누락" -#: pgc.l:1429 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDE 명령에 구문 오류 발생" -#: pgc.l:1479 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "" -"내부 오류: 상태값을 알 수 없습니다. 이 문제를 <%s> 주소로 " -"알려주십시오." +"내부 오류: 상태값을 알 수 없습니다. 이 문제를 <%s> 주소로 알려주십시오." -#: pgc.l:1631 +#: pgc.l:1655 #, 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:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "포함 파일 \"%s\"을(를) %d줄에서 열 수 없음" @@ -348,124 +367,134 @@ msgstr "포함 파일 \"%s\"을(를) %d줄에서 열 수 없음" 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\" 자료형 이름은 인포믹스 모드에서 예약어로 쓰입니다" -#: preproc.y:550 preproc.y:15960 +#: preproc.y:552 preproc.y:17925 #, 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:18560 preproc.y:18885 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 with %s by DECLARE statement %s" +msgstr "%s 연결은 %s 연결로 바뀌었음, 해당 DECLARE 구문: %s" + +#: preproc.y:1767 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASE 문에 AT 옵션이 허용되지 않음" -#: preproc.y:1952 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT 문에 AT 옵션이 허용되지 않음" -#: preproc.y:1986 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT 문에 AT 옵션이 허용되지 않음" -#: preproc.y:2041 +#: preproc.y:2112 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION 문에 AT 옵션이 허용되지 않음" -#: preproc.y:2063 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE 문에 AT 옵션이 허용되지 않음" -#: preproc.y:2072 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR 문에 AT 옵션이 허용되지 않음" -#: preproc.y:2079 +#: preproc.y:2150 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER 문에 AT 옵션이 허용되지 않음" -#: 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:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "지원되지 않는 기능이 서버에 전달됨" -#: preproc.y:2714 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL이 구현되지 않음" -#: preproc.y:3382 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN이 구현되지 않음" -#: preproc.y:10060 preproc.y:15545 +#: preproc.y:10230 preproc.y:17498 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "INFORMIX 모드에서는 \"database\"를 커서 이름으로 사용할 수 없음" + +#: preproc.y:10237 preproc.y:17508 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "서로 다른 선언 구문에서 \"%s\" 변수 사용은 지원하지 않습니다" -#: preproc.y:10062 preproc.y:15547 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "\"%s\" 커서가 이미 정의됨" -#: preproc.y:10502 +#: preproc.y:10713 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "더 이상 지원되지 않는 LIMIT #,# 구문이 서버에 전달됨" -#: preproc.y:10835 preproc.y:10842 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "FROM 절 내의 subquery 에는 반드시 alias 를 가져야만 합니다" -#: preproc.y:15268 preproc.y:15275 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS에서 INTO를 지정할 수 없음" -#: preproc.y:15311 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "\"@\"이 필요한데 \"%s\"이(가) 있음" -#: preproc.y:15323 +#: preproc.y:17245 #, c-format msgid "" "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " @@ -473,89 +502,89 @@ msgid "" msgstr "" "\"tcp\" 및 \"unix\" 프로토콜과 데이터베이스 형식 \"postgresql\"만 지원됨" -#: preproc.y:15326 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "\"://\"가 필요한데 \"%s\"이(가) 있음" -#: preproc.y:15331 +#: preproc.y:17253 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "" "Unix-domain 소켓은 \"localhost\"에서만 작동하며 \"%s\"에서는 작동하지 않음" -#: preproc.y:15357 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "\"postgresql\"이 필요한데 \"%s\"이(가) 있음" -#: preproc.y:15360 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "잘못된 연결 형식: %s" -#: preproc.y:15369 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "\"@\" 또는 \"://\"가 필요한데 \"%s\"이(가) 있음" -#: preproc.y:15444 preproc.y:15462 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "잘못된 데이터 형식" -#: preproc.y:15473 preproc.y:15490 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "불완전한 문" -#: preproc.y:15476 preproc.y:15493 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "인식할 수 없는 토큰 \"%s\"" -#: preproc.y:15763 +#: preproc.y:17460 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "\"%s\" 이름이 이미 정의됨" + +#: preproc.y:17728 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "숫자 및 10진수 데이터 형식에만 전체 자릿수/소수 자릿수 인수 포함" -#: preproc.y:15775 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "여기에는 간격 지정이 허용되지 않음" -#: preproc.y:15935 preproc.y:15987 +#: preproc.y:17900 preproc.y:17952 #, c-format msgid "too many levels in nested structure/union definition" msgstr "중첩된 구조/union 정의에 수준이 너무 많음" -#: preproc.y:16110 +#: preproc.y:18075 #, 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:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VAR 명령에 이니셜라이저가 허용되지 않음" -#: preproc.y:16886 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "입력에서 표시기의 배열이 허용되지 않음" -#: preproc.y:17073 +#: preproc.y:19030 #, c-format msgid "operator not allowed in variable definition" msgstr "연산자는 동적 정의 영역에서는 사용할 수 없음" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17114 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s, \"%s\" 부근" @@ -688,3 +717,7 @@ msgstr "이 데이터 형식에는 포인터에 대한 포인터가 지원되지 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "구조에는 다차원 배열이 지원되지 않음" + +#, c-format +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "지원되지 않는 DESCRIBE 문 사용" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/pt_BR.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/pt_BR.po index f64ecaee..4702bb61 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/pt_BR.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/pt_BR.po @@ -1,17 +1,19 @@ # Brazilian Portuguese message translation file for ecpg -# Copyright (C) 2009 PostgreSQL Global Development Group +# +# Copyright (C) 2009-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. +# # Fernando Ike de Oliveira , 2009. -# Euler Taveira de Oliveira , 2010-2016. +# Euler Taveira , 2010-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-10-25 16:32-0300\n" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-10 18:22-0300\n" "PO-Revision-Date: 2018-06-25 08:59+0200\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,44 +25,51 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "variável \"%s\" deve ter um tipo númerico" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:125 descriptor.c:156 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "descritor \"%s\" não existe" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "descritor %s vinculado a conexão %s não existe" -#: descriptor.c:161 descriptor.c:212 +#: descriptor.c:127 descriptor.c:158 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "descritor %s vinculado a conexão padrão não existe" + +#: descriptor.c:173 descriptor.c:225 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "item do cabeçalho do descritor \"%d\" não existe" -#: descriptor.c:183 +#: descriptor.c:195 #, c-format msgid "nullable is always 1" msgstr "nullable é sempre 1" -#: descriptor.c:186 +#: descriptor.c:198 #, c-format msgid "key_member is always 0" msgstr "key_member é sempre 0" -#: descriptor.c:279 +#: descriptor.c:292 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "item do descritor \"%s\" não está implementado" -#: descriptor.c:289 +#: descriptor.c:302 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "item do descritor \"%s\" não pode ser definido" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" "\n" -msgstr "%s é o pré-processador SQL embutido do PostgreSQL para programas em C.\n\n" +msgstr "" +"%s é o pré-processador SQL embutido do PostgreSQL para programas em C.\n" +"\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -71,12 +80,12 @@ msgstr "" " %s [OPÇÃO]... ARQUIVO...\n" "\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "Opções:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" @@ -85,46 +94,46 @@ msgstr "" " -c gera automaticamente código C a partir do código SQL embutido;\n" " isso afeta o 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\"\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" msgstr "" " -C mode define o modo de compatilidade; MODE pode ser um de\n" -" \"INFORMIX\", \"INFORMIX_SE\"\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d gera saída de depuração do analisador\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D SÍMBOLO define SÍMBOLO\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h analisa um arquivo de cabeçalho, essa opção inclui a opção \"-c\"\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i analisa arquivos de cabeçalho do sistema também\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I DIRETÓRIO procura DIRETÓRIO para incluir arquivos\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o ARQUIVO grava resultado no ARQUIVO\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" @@ -133,27 +142,27 @@ msgstr "" " -r OPÇÃO especifica comportamento em tempo de execução; OPÇÃO pode ser:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression executa em modo de teste de regressão\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t habilita o auto efetivação de transações\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostra informação sobre a versão e termina\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostra essa ajuda e termina\n" -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "" "\n" @@ -164,161 +173,191 @@ msgstr "" "Se nenhum arquivo de saída for especificado, o nome é formado adicionando .c ao\n" "nome do arquivo de entrada, após remover .pgc se presente.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"Relate erros a .\n" +"Relate erros a <%s>.\n" + +#: ecpg.c:63 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Página web do %s: <%s>\n" -#: ecpg.c:139 +#: ecpg.c:141 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: não pôde localizar meu próprio caminho executável\n" -#: ecpg.c:175 ecpg.c:326 ecpg.c:336 +#: ecpg.c:176 ecpg.c:333 ecpg.c:344 #, c-format msgid "%s: could not open file \"%s\": %s\n" msgstr "%s: não pôde abrir arquivo \"%s\": %s\n" -#: ecpg.c:214 ecpg.c:227 ecpg.c:243 ecpg.c:268 +#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Tente \"%s --help\" para obter informações adicionais.\n" -#: ecpg.c:238 +#: ecpg.c:243 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: suporte a depuração do analisador (-d) não está disponível\n" -#: ecpg.c:256 +#: ecpg.c:262 #, c-format -msgid "%s, the PostgreSQL embedded C preprocessor, version %d.%d.%d\n" -msgstr "%s, the pré-processador C embutido do PostgreSQL, versão %d.%d.%d\n" +msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" +msgstr "%s, the pré-processador C embutido do PostgreSQL, versão %s\n" -#: ecpg.c:258 +#: ecpg.c:264 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... pesquisa inicia aqui:\n" -#: ecpg.c:261 +#: ecpg.c:267 #, c-format msgid "end of search list\n" msgstr "fim da lista de pesquisa\n" -#: ecpg.c:267 +#: ecpg.c:273 #, c-format msgid "%s: no input files specified\n" msgstr "%s: nenhum arquivo de entrada foi especificado\n" -#: ecpg.c:459 +#: ecpg.c:477 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "cursor \"%s\" foi declarado mas não foi aberto" -#: ecpg.c:472 preproc.y:127 +#: ecpg.c:490 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "não pôde remover arquivo de saída \"%s\"\n" -#: pgc.l:440 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "comentário /* não foi terminado" -#: pgc.l:453 -#, c-format -msgid "invalid bit string literal" -msgstr "cadeia de bits inválida" - -#: pgc.l:462 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "cadeia de bits não foi terminada" -#: pgc.l:478 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "cadeia de caracteres hexadecimal não foi terminada" -#: pgc.l:556 +#: pgc.l:608 +#, c-format +msgid "invalid bit string literal" +msgstr "cadeia de bits inválida" + +#: pgc.l:613 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "cadeia de caracteres hexadecimal é inválida" + +#: pgc.l:631 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "estado anterior não tratado em xqs\n" + +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "cadeia de caracteres entre aspas não foi terminada" -#: pgc.l:613 pgc.l:626 +#: pgc.l:708 +#, c-format +msgid "unterminated dollar-quoted string" +msgstr "cadeia de caracteres entre dólares não foi terminada" + +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "identificador delimitado tem tamanho zero" -#: pgc.l:634 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "identificador entre aspas não foi terminado" -#: pgc.l:889 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "elemento indesejado após parâmetro" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "elemento indesejado após valor numérico" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "comentários /* ... */ aninhados" -#: pgc.l:982 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "faltando identificador no comando EXEC SQL UNDEF" -#: pgc.l:1028 pgc.l:1042 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "muitas condições EXEC SQL IFDEF aninhadas" + +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "faltando correspondente \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1031 pgc.l:1044 pgc.l:1220 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "faltando \"EXEC SQL ENDIF;\"" -#: pgc.l:1060 pgc.l:1079 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mais de um EXEC SQL ELSE" -#: pgc.l:1101 pgc.l:1115 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF não tem correspondente" -#: pgc.l:1135 -#, c-format -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "muitas condições EXEC SQL IFDEF aninhadas" - -#: pgc.l:1168 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "faltando identificador no comando EXEC SQL IFDEF" -#: pgc.l:1177 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "faltando identificador no comando EXEC SQL IFDEF" -#: pgc.l:1210 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "erro de sintaxe no comando EXEC SQL INCLUDE" -#: pgc.l:1259 +#: pgc.l:1503 #, c-format -msgid "internal error: unreachable state; please report this to " -msgstr "erro interno: estado inacessível; por favor relato isso a " +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "erro interno: estado inacessível; por favor relato isso a <%s>" -#: pgc.l:1383 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Erro: caminho de inclusão \"%s/%s\" é muito longo na linha %d, ignorando\n" -#: pgc.l:1406 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "não pôde abrir arquivo de inclusão \"%s\" na linha %d" @@ -327,210 +366,220 @@ msgstr "não pôde abrir arquivo de inclusão \"%s\" na linha %d" msgid "syntax error" msgstr "erro de sintaxe" -#: preproc.y:81 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "AVISO: " -#: preproc.y:84 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "ERRO: " -#: preproc.y:508 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "cursor \"%s\" não existe" -#: preproc.y:537 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "inicializador não é permitido na definição do tipo" -#: preproc.y:539 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "nome de tipo \"string\" é reservado no modo Informix" -#: preproc.y:546 preproc.y:14626 +#: preproc.y:552 preproc.y:17925 #, c-format msgid "type \"%s\" is already defined" msgstr "tipo \"%s\" já está definido" -#: preproc.y:570 preproc.y:15284 preproc.y:15604 variable.c:620 +#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "matrizes multidimensionais para tipo de dados simples não são suportadas" -#: preproc.y:1634 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "conexão %s é sobrescrita com %s pelo comando DECLARE %s" + +#: preproc.y:1767 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "opção AT não é permitida no comando CLOSE DATABASE" -#: preproc.y:1849 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "opção AT não é permitida no comando CONNECT" -#: preproc.y:1883 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "opção AT não é permitida no comando DISCONNECT" -#: preproc.y:1938 +#: preproc.y:2112 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "opção AT não é permitida no comando SET CONNECTION" -#: preproc.y:1960 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "opção AT não é permitida no comando TYPE" -#: preproc.y:1969 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "opção AT não é permitida no comando VAR" -#: preproc.y:1976 +#: preproc.y:2150 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "opção AT não é permitida no comando WHENEVER" -#: preproc.y:2228 preproc.y:2233 preproc.y:2349 preproc.y:3759 preproc.y:5173 -#: preproc.y:5182 preproc.y:5466 preproc.y:6902 preproc.y:8140 preproc.y:8145 -#: preproc.y:10776 preproc.y:11393 +#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "funcionalidade não suportada será enviada ao servidor" -#: preproc.y:2607 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL não está implementado" -#: preproc.y:3147 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN não está implementado" -#: preproc.y:9035 preproc.y:14215 +#: preproc.y:10230 preproc.y:17498 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "\"database\" não pode ser utilizado como nome de cursor no modo INFORMIX" + +#: preproc.y:10237 preproc.y:17508 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "utilizar variável \"%s\" em comandos de declaração diferentes não é suportado" -#: preproc.y:9037 preproc.y:14217 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "cursor \"%s\" já está definido" -#: preproc.y:9467 +#: preproc.y:10713 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "sintaxe LIMIT #,# que não é suportada foi enviada ao servidor" -#: preproc.y:9775 preproc.y:9782 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "subconsulta no FROM deve ter um aliás" -#: preproc.y:13945 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS não pode especificar INTO" -#: preproc.y:13981 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "esperado \"@\", encontrado \"%s\"" -#: preproc.y:13993 +#: preproc.y:17245 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "somente os protocolos \"tcp\" e \"unix\" e tipo banco de dados \"postgressql\" sãosuportados" -#: preproc.y:13996 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "esperado \"://\", encontrado \"%s\"" -#: preproc.y:14001 +#: preproc.y:17253 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Soquetes de domínio Unix trabalham somente com \"localhost\" e não com \"%s\"" -#: preproc.y:14027 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "esperado \"postgresql\", encontrado \"%s\"" -#: preproc.y:14030 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "tipo de conexão inválido: %s" -#: preproc.y:14039 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "esperado \"@\" ou \"://\", encontrado \"%s\"" -#: preproc.y:14114 preproc.y:14132 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "tipo de dado inválido" -#: preproc.y:14143 preproc.y:14160 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "comando incompleto" -#: preproc.y:14146 preproc.y:14163 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "informação desconhecida \"%s\"" -#: preproc.y:14437 +#: preproc.y:17460 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "nome \"%s\" já está declarado" + +#: preproc.y:17728 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "somente os tipos de dados numeric e decimal possuem argumento de precisão/escala" -#: preproc.y:14449 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "especificação de intervalo não é permitida aqui" -#: preproc.y:14601 preproc.y:14653 +#: preproc.y:17900 preproc.y:17952 #, c-format msgid "too many levels in nested structure/union definition" msgstr "muitos níveis em definição aninhada de estrutura/união" -#: preproc.y:14792 +#: preproc.y:18075 #, c-format msgid "pointers to varchar are not implemented" msgstr "ponteiros para varchar não estão implentados" -#: preproc.y:14979 preproc.y:15004 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "utilizando comando DESCRIBE que não é suportado" - -#: preproc.y:15251 +#: preproc.y:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "inicilização não é permitido no comando EXEC SQL VAR" -#: preproc.y:15562 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "matrizes do indicadores não são permitidas na entrada" -#: preproc.y:15783 +#: preproc.y:19030 #, c-format msgid "operator not allowed in variable definition" msgstr "operador não é permitido na definição da variável" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:15821 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s em ou próximo a \"%s\"" @@ -540,52 +589,62 @@ msgstr "%s em ou próximo a \"%s\"" msgid "out of memory" msgstr "sem memória" -#: type.c:212 type.c:664 +#: type.c:214 type.c:685 #, c-format msgid "unrecognized variable type code %d" msgstr "tipo de código de variável %d é desconhecido" -#: type.c:261 +#: type.c:263 #, c-format msgid "variable \"%s\" is hidden by a local variable of a different type" msgstr "variável \"%s\" está escondida por uma variável local de um tipo diferente" -#: type.c:263 +#: type.c:265 #, c-format msgid "variable \"%s\" is hidden by a local variable" msgstr "variável \"%s\" está escondida por uma variável local" -#: type.c:275 +#: type.c:277 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "variável de indicador \"%s\" está escondida por uma variável local de um tipo diferente" -#: type.c:277 +#: type.c:279 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable" msgstr "variável de indicador \"%s\" está escondida por uma variável local" -#: type.c:285 +#: type.c:287 #, c-format msgid "indicator for array/pointer has to be array/pointer" msgstr "indicador para matriz/ponteiro tem de ser matriz/ponteiro" -#: type.c:289 +#: type.c:291 #, c-format msgid "nested arrays are not supported (except strings)" msgstr "matrizes aninhadas não são suportadas (exceto cadeia de caracteres)" -#: type.c:331 +#: type.c:333 #, c-format msgid "indicator for struct has to be a struct" msgstr "indicador para struct tem que ser struct" -#: type.c:351 type.c:372 type.c:392 +#: type.c:353 type.c:374 type.c:394 #, c-format msgid "indicator for simple data type has to be simple" msgstr "indicador para tipo de dados simples tem que ser simples" -#: type.c:723 +#: type.c:625 +#, c-format +msgid "indicator struct \"%s\" has too few members" +msgstr "indicador struct \"%s\" tem poucos membros" + +#: type.c:633 +#, c-format +msgid "indicator struct \"%s\" has too many members" +msgstr "indicador struct \"%s\" tem muitos membros" + +#: type.c:744 #, c-format msgid "unrecognized descriptor item code %d" msgstr "código do item do descritor %d é desconhecido" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ru.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ru.po index ef479ee0..00dea8d2 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ru.po +++ b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/ru.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: ecpg (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2023-05-03 05:56+0300\n" -"PO-Revision-Date: 2021-09-04 10:54+0300\n" +"PO-Revision-Date: 2022-09-05 13:32+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -236,121 +236,131 @@ msgstr "курсор \"%s\" был объявлен, но не открыт" msgid "could not remove output file \"%s\"\n" msgstr "ошибка при удалении выходного файла \"%s\"\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "незавершённый комментарий /*" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "оборванная битовая строка" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "оборванная шестнадцатеричная строка" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "неверная битовая строка" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" +msgid "invalid hexadecimal string literal" msgstr "неверная шестнадцатеричная строка" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "" "необрабатываемое предыдущее состояние при обнаружении закрывающего " "апострофа\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "незавершённая строка в кавычках" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "незавершённая строка с $" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "пустой идентификатор в кавычках" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "незавершённый идентификатор в кавычках" -#: pgc.l:1082 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "мусорное содержимое после параметра" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "мусорное содержимое после числовой константы" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "вложенные комментарии /* ... */" -#: pgc.l:1175 +#: pgc.l:1193 #, 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 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, 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 +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, 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 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "отсутствует \"EXEC SQL ENDIF;\"" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "неоднократная команда 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" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "в команде EXEC SQL IFDEF отсутствует идентификатор" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "в команде EXEC SQL DEFINE отсутствует идентификатор" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "ошибка синтаксиса в команде EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "внутренняя ошибка: недостижимое состояние; пожалуйста, сообщите в <%s>" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "" "Ошибка: путь включаемых файлов \"%s/%s\" в строке %d слишком длинный, " "пропускается\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не удалось открыть включаемый файл \"%s\" (строка %d)" @@ -384,12 +394,12 @@ msgstr "определение типа не может включать ини msgid "type name \"string\" is reserved in Informix mode" msgstr "имя типа \"string\" в режиме Informix зарезервировано" -#: preproc.y:552 preproc.y:17677 +#: preproc.y:552 preproc.y:17925 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:577 preproc.y:18312 preproc.y:18637 variable.c:620 +#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:620 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные массивы с простыми типами данных не поддерживаются" @@ -399,96 +409,96 @@ msgstr "многомерные массивы с простыми типами msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "подключение %s заменяется на %s оператором DECLARE %s" -#: preproc.y:1753 +#: preproc.y:1767 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "оператор CLOSE DATABASE с параметром AT не поддерживается" -#: preproc.y:2001 +#: preproc.y:2017 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "оператор CONNECT с параметром AT не поддерживается" -#: preproc.y:2041 +#: preproc.y:2057 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "оператор DISCONNECT с параметром AT не поддерживается" -#: preproc.y:2096 +#: preproc.y:2112 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "оператор SET CONNECTION с параметром AT не поддерживается" -#: preproc.y:2118 +#: preproc.y:2134 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "оператор TYPE с параметром AT не поддерживается" -#: preproc.y:2127 +#: preproc.y:2143 #, c-format msgid "AT option not allowed in VAR statement" msgstr "оператор VAR с параметром AT не поддерживается" -#: preproc.y:2134 +#: preproc.y:2150 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "оператор WHENEVER с параметром AT не поддерживается" -#: 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 +#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 +#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 +#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 #, c-format msgid "unsupported feature will be passed to server" msgstr "неподдерживаемая функция будет передана серверу" -#: preproc.y:2769 +#: preproc.y:2785 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реализовано" -#: preproc.y:3464 +#: preproc.y:3484 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "операция COPY FROM STDIN не реализована" -#: preproc.y:10014 preproc.y:17250 +#: preproc.y:10230 preproc.y:17498 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "" "в режиме INFORMIX нельзя использовать \"database\" в качестве имени курсора" -#: preproc.y:10021 preproc.y:17260 +#: preproc.y:10237 preproc.y:17508 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "" "использование переменной \"%s\" в разных операторах DECLARE не поддерживается" -#: preproc.y:10023 preproc.y:17262 +#: preproc.y:10239 preproc.y:17510 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курсор \"%s\" уже определён" -#: preproc.y:10497 +#: preproc.y:10713 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "не поддерживаемое более предложение LIMIT #,# передано на сервер" -#: preproc.y:10830 preproc.y:10837 +#: preproc.y:11046 preproc.y:11053 #, c-format msgid "subquery in FROM must have an alias" msgstr "подзапрос во FROM должен иметь псевдоним" -#: preproc.y:16942 preproc.y:16949 +#: preproc.y:17190 preproc.y:17197 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "в CREATE TABLE AS нельзя указать INTO" -#: preproc.y:16985 +#: preproc.y:17233 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "ожидался знак \"@\", но на этом месте \"%s\"" -#: preproc.y:16997 +#: preproc.y:17245 #, c-format msgid "" "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " @@ -497,89 +507,89 @@ msgstr "" "поддерживаются только протоколы \"tcp\" и \"unix\", а тип базы данных - " "\"postgresql\"" -#: preproc.y:17000 +#: preproc.y:17248 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "ожидалось \"://\", но на этом месте \"%s\"" -#: preproc.y:17005 +#: preproc.y:17253 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-сокеты работают только с \"localhost\", но не с адресом \"%s\"" -#: preproc.y:17031 +#: preproc.y:17279 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "ожидался тип \"postgresql\", но на этом месте \"%s\"" -#: preproc.y:17034 +#: preproc.y:17282 #, c-format msgid "invalid connection type: %s" msgstr "неверный тип подключения: %s" -#: preproc.y:17043 +#: preproc.y:17291 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "ожидалось \"@\" или \"://\", но на этом месте \"%s\"" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:17366 preproc.y:17384 #, c-format msgid "invalid data type" msgstr "неверный тип данных" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:17395 preproc.y:17412 #, c-format msgid "incomplete statement" msgstr "неполный оператор" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:17398 preproc.y:17415 #, c-format msgid "unrecognized token \"%s\"" msgstr "нераспознанное ключевое слово \"%s\"" -#: preproc.y:17212 +#: preproc.y:17460 #, c-format msgid "name \"%s\" is already declared" msgstr "имя \"%s\" уже объявлено" -#: preproc.y:17480 +#: preproc.y:17728 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "" "точность/масштаб можно указать только для типов данных numeric и decimal" -#: preproc.y:17492 +#: preproc.y:17740 #, c-format msgid "interval specification not allowed here" msgstr "определение интервала здесь не допускается" -#: preproc.y:17652 preproc.y:17704 +#: preproc.y:17900 preproc.y:17952 #, c-format msgid "too many levels in nested structure/union definition" msgstr "слишком много уровней в определении вложенной структуры/объединения" -#: preproc.y:17827 +#: preproc.y:18075 #, c-format msgid "pointers to varchar are not implemented" msgstr "указатели на varchar не реализованы" -#: preproc.y:18278 +#: preproc.y:18526 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не может включать инициализатор" -#: preproc.y:18595 +#: preproc.y:18843 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "массивы индикаторов на входе недопустимы" -#: preproc.y:18782 +#: preproc.y:19030 #, c-format msgid "operator not allowed in variable definition" msgstr "недопустимый оператор в определении переменной" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18823 +#: preproc.y:19071 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/sv.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/sv.po index a0ff805b..3b8d67c6 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/sv.po +++ b/third_party/spanner_pg/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, 2021. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 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-11-06 17:09+0000\n" -"PO-Revision-Date: 2021-11-06 21:58+0100\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" @@ -234,117 +234,127 @@ msgstr "markören \"%s\" har deklarerats men inte öppnats" msgid "could not remove output file \"%s\"\n" msgstr "kunde inte ta bort utdatafil \"%s\"\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "ej avslutad /*-kommentar" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "ej avslutad bitsträngslitteral" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "ej avslutad hexadecimal stränglitteral" -#: pgc.l:602 +#: 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 hex string literal" -msgstr "ogiltig hex-sträng-literal" +msgid "invalid hexadecimal string literal" +msgstr "ogiltig hexdecimal sträng-literal" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "tidigare state i xqs som ej kan hanteras\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "icketerminerad citerad sträng" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "icke terminerad dollarciterad sträng" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "noll-längds avdelad identifierare" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "ej avslutad citerad identifierare" -#: pgc.l:1082 +#: 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:1175 +#: pgc.l:1193 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "saknar identifierare i EXEC SQL UNDEF-kommando" -#: 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 "för många nästlade EXEC SQL IFDEF-villkor" -#: 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 "saknar matchande \"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 "saknar \"EXEC SQL ENDIF;\"" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mer än en EXEC SQL ELSE" -#: pgc.l:1324 pgc.l:1338 +#: pgc.l:1342 pgc.l:1356 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "ej matchad EXEC SQL ENDIF" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "saknar identifierare i EXEC SQL IFDEF-kommando" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "saknar identifierare i EXEC SQL DEFINE-kommando" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "syntaxfel i EXEC SQL INCLUDE-kommando" -#: pgc.l:1485 +#: 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:1637 +#: 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:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "kunde inte öppna inkludefil \"%s\" på rad %d" @@ -378,12 +388,12 @@ msgstr "initialiserare tillåts inte i typdefinition" msgid "type name \"string\" is reserved in Informix mode" msgstr "typnamn \"string\" är reserverat i Informix-läge" -#: preproc.y:552 preproc.y:17675 +#: preproc.y:552 preproc.y:19317 #, c-format msgid "type \"%s\" is already defined" msgstr "typen \"%s\" är redan definierad" -#: preproc.y:577 preproc.y:18310 preproc.y:18635 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" @@ -393,180 +403,180 @@ msgstr "multidimensionella array:er för enkla datatyper stöds inte" msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "anslutning %s överskriven med %s av DECLARE-sats %s" -#: preproc.y:1753 +#: 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:2001 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-flaggan tillåts inte i CONNECT-sats" -#: preproc.y:2041 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-flaggan tillåts inte i DISCONNECT-sats" -#: preproc.y:2096 +#: 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:2118 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-flaggan tillåts inte i TYPE-sats" -#: preproc.y:2127 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-flaggan tillåts inte i VAR-sats" -#: preproc.y:2134 +#: preproc.y:2255 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-flaggan tillåts inte i WHENEVER-sats" -#: 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 +#: 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:2769 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL är inte implementerad" -#: preproc.y:3464 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN är inte implementerad" -#: preproc.y:10014 preproc.y:17250 +#: 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:10021 preproc.y:17260 +#: 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:10023 preproc.y:17262 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "markören \"%s\" är redan definierad" -#: preproc.y:10497 +#: 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:10830 preproc.y:10837 +#: 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:16942 preproc.y:16949 +#: 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:16985 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "förväntade \"@\", hittade \"%s\"" -#: preproc.y:16997 +#: 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:17000 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "förväntade \"://\", hittade \"%s\"" -#: preproc.y:17005 +#: 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:17031 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "förväntade \"postgresql\", hittade \"%s\"" -#: preproc.y:17034 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "ogiltig anslutningstyp: %s" -#: preproc.y:17043 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "förväntade \"@\" eller \"://\", hittade \"%s\"" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "ogiltig datatyp" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "ofullständig sats" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "okänd symbol \"%s\"" -#: preproc.y:17212 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "namnet \"%s\" är redan deklarerat" -#: preproc.y:17478 +#: 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:17490 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "intervallspecifikation tillåts inte här" -#: preproc.y:17650 preproc.y:17702 +#: 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:17825 +#: preproc.y:19467 #, c-format msgid "pointers to varchar are not implemented" msgstr "pekare till varchar är inte implementerat" -#: preproc.y:18276 +#: 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:18593 +#: 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:18780 +#: 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:18821 +#: preproc.y:20463 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/uk.po b/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/uk.po index 717def46..f5c64240 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/preproc/po/uk.po +++ b/third_party/spanner_pg/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: 2022-03-16 09:09+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2022-08-12 10:40+0000\n" +"PO-Revision-Date: 2022-09-13 11:52\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: /REL_14_STABLE/ecpg.pot\n" -"X-Crowdin-File-ID: 782\n" +"X-Crowdin-File: /REL_15_STABLE/ecpg.pot\n" +"X-Crowdin-File-ID: 906\n" #: descriptor.c:64 #, c-format @@ -215,117 +215,127 @@ msgstr "курсор \"%s\" був оголошений, але не відкр msgid "could not remove output file \"%s\"\n" msgstr "не вдалося видалити файл виводу \"%s\"\n" -#: pgc.l:502 +#: pgc.l:508 #, c-format msgid "unterminated /* comment" msgstr "незавершений коментар /*" -#: pgc.l:519 +#: pgc.l:525 #, c-format msgid "unterminated bit string literal" msgstr "незавершений бітовий рядок" -#: pgc.l:527 +#: pgc.l:533 #, c-format msgid "unterminated hexadecimal string literal" msgstr "незавершений шістнадцятковий рядок" -#: pgc.l:602 +#: pgc.l:608 #, c-format msgid "invalid bit string literal" msgstr "неприпустимий літерал бітового рядка" -#: pgc.l:607 +#: pgc.l:613 #, c-format -msgid "invalid hex string literal" +msgid "invalid hexadecimal string literal" msgstr "неприпустимий шістнадцятковий рядок" -#: pgc.l:625 +#: pgc.l:631 #, c-format msgid "unhandled previous state in xqs\n" msgstr "необроблений попередній стан у xqs\n" -#: pgc.l:651 pgc.l:760 +#: pgc.l:657 pgc.l:766 #, c-format msgid "unterminated quoted string" msgstr "незавершений рядок в лапках" -#: pgc.l:702 +#: pgc.l:708 #, c-format msgid "unterminated dollar-quoted string" msgstr "незавершений рядок з $" -#: pgc.l:720 pgc.l:740 +#: pgc.l:726 pgc.l:746 #, c-format msgid "zero-length delimited identifier" msgstr "пустий ідентифікатор із роздільниками" -#: pgc.l:751 +#: pgc.l:757 #, c-format msgid "unterminated quoted identifier" msgstr "незавершений ідентифікатор в лапках" -#: pgc.l:1082 +#: pgc.l:926 +#, c-format +msgid "trailing junk after parameter" +msgstr "сміття після параметру" + +#: pgc.l:968 pgc.l:971 pgc.l:974 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "сміття після числового літерала" + +#: pgc.l:1100 #, c-format msgid "nested /* ... */ comments" msgstr "вкладені /* ... */ коменарі" -#: pgc.l:1175 +#: pgc.l:1193 #, 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 +#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 #, 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 +#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 #, 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 +#: pgc.l:1271 pgc.l:1282 pgc.l:1463 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "відсутній \"EXEC SQL ENDIF;\"" -#: pgc.l:1279 pgc.l:1301 +#: pgc.l:1297 pgc.l:1319 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "більше ніж один 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" -#: pgc.l:1393 +#: pgc.l:1411 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "відсутній ідентифікатор у команді EXEC SQL IFDEF" -#: pgc.l:1402 +#: pgc.l:1420 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "відсутній ідентифікатор у команді EXEC SQL DEFINE" -#: pgc.l:1435 +#: pgc.l:1453 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "синтаксична помилка у команді EXEC SQL INCLUDE" -#: pgc.l:1485 +#: pgc.l:1503 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "внутрішня помилка: недосяжний стан; будь ласка, повідомте про це на <%s>" -#: pgc.l:1637 +#: pgc.l:1655 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Помилка: шлях включення \"%s/%s\" занадто довгий у рядку %d, пропускається\n" -#: pgc.l:1660 +#: pgc.l:1678 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не вдалося відкрити файл включення \"%s\" у рядку %d" @@ -359,12 +369,12 @@ msgstr "ініціалізація заборонена у визначенні msgid "type name \"string\" is reserved in Informix mode" msgstr "ім’я типу \"string\" зарезервовано у режимі Informix" -#: preproc.y:552 preproc.y:17675 +#: preproc.y:552 preproc.y:19354 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" вже визначений" -#: preproc.y:577 preproc.y:18310 preproc.y:18635 variable.c:621 +#: preproc.y:577 preproc.y:19989 preproc.y:20314 variable.c:621 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "багатовимірні масиви для простих типів даних не підтримуються" @@ -374,180 +384,180 @@ msgstr "багатовимірні масиви для простих типів msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "підключення %s було перезаписано з %s командою DECLARE %s" -#: preproc.y:1753 +#: preproc.y:1872 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "Параметр AT не дозволений в інструкції CLOSE DATABASE" -#: preproc.y:2001 +#: preproc.y:2122 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "Параметр AT не дозволений в інструкції CONNECT" -#: preproc.y:2041 +#: preproc.y:2162 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "Параметр AT не дозволений в інструкції DISCONNECT" -#: preproc.y:2096 +#: preproc.y:2217 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "Параметр AT не дозволений в інструкції SET CONNECTION" -#: preproc.y:2118 +#: preproc.y:2239 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "Параметр AT не дозволений в інструкції TYPE" -#: preproc.y:2127 +#: preproc.y:2248 #, c-format msgid "AT option not allowed in VAR statement" msgstr "Параметр AT не дозволений в інструкції VAR" -#: preproc.y:2134 +#: preproc.y:2255 #, 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 +#: 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:2769 +#: preproc.y:2890 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реалізовано" -#: preproc.y:3464 +#: preproc.y:3589 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN не реалізовано" -#: preproc.y:10014 preproc.y:17250 +#: preproc.y:10335 preproc.y:18892 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "\"database\" не може використовуватись як назва курсора в режимі INFORMIX" -#: preproc.y:10021 preproc.y:17260 +#: preproc.y:10342 preproc.y:18902 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "використання змінної \"%s\" у різних інструкціях declare не підтримується" -#: preproc.y:10023 preproc.y:17262 +#: preproc.y:10344 preproc.y:18904 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курсор \"%s\" вже визначено" -#: preproc.y:10497 +#: preproc.y:10818 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "непідтримуваний синтаксис LIMIT #,# передано до сервера" -#: preproc.y:10830 preproc.y:10837 +#: preproc.y:11151 preproc.y:11158 #, c-format msgid "subquery in FROM must have an alias" msgstr "підзапит в FROM повинен мати псевдонім" -#: preproc.y:16942 preproc.y:16949 +#: preproc.y:18584 preproc.y:18591 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS не може містити INTO" -#: preproc.y:16985 +#: preproc.y:18627 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "очікувалося \"@\", знайдено \"%s\"" -#: preproc.y:16997 +#: preproc.y:18639 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "підтримуються лише протоколи \"tcp\" та \"unix\" і тип бази даних \"postgresql\"" -#: preproc.y:17000 +#: preproc.y:18642 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "очікувалося \"://\", знайдено \"%s\"" -#: preproc.y:17005 +#: preproc.y:18647 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-сокети працюють лише з \"localhost\", але не з \"%s\"" -#: preproc.y:17031 +#: preproc.y:18673 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "очікувалось \"postgresql\", знайдено \"%s\"" -#: preproc.y:17034 +#: preproc.y:18676 #, c-format msgid "invalid connection type: %s" msgstr "неприпустимий тип підключення: %s" -#: preproc.y:17043 +#: preproc.y:18685 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "очікувалось \"@\" або \"://\", знайдено \"%s\"" -#: preproc.y:17118 preproc.y:17136 +#: preproc.y:18760 preproc.y:18778 #, c-format msgid "invalid data type" msgstr "неприпустимий тип даних" -#: preproc.y:17147 preproc.y:17164 +#: preproc.y:18789 preproc.y:18806 #, c-format msgid "incomplete statement" msgstr "неповний оператор" -#: preproc.y:17150 preproc.y:17167 +#: preproc.y:18792 preproc.y:18809 #, c-format msgid "unrecognized token \"%s\"" msgstr "нерозпізнаний токен \"%s\"" -#: preproc.y:17212 +#: preproc.y:18854 #, c-format msgid "name \"%s\" is already declared" msgstr "ім'я \"%s\" вже оголошена" -#: preproc.y:17478 +#: preproc.y:19120 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "точність/масштаб можна вказати лише для типів даних numeric і decimal" -#: preproc.y:17490 +#: preproc.y:19132 #, c-format msgid "interval specification not allowed here" msgstr "специфікація інтервалу тут не допускається" -#: preproc.y:17650 preproc.y:17702 +#: preproc.y:19329 preproc.y:19381 #, c-format msgid "too many levels in nested structure/union definition" msgstr "занадто багато рівнів у визначенні вкладеної структури/об'єднання" -#: preproc.y:17825 +#: preproc.y:19504 #, c-format msgid "pointers to varchar are not implemented" msgstr "вказівників на varchar не реалізовано" -#: preproc.y:18276 +#: preproc.y:19955 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не допускає ініціалізатор" -#: preproc.y:18593 +#: preproc.y:20272 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "вхідні масиви індикаторів не допускаються" -#: preproc.y:18780 +#: preproc.y:20459 #, c-format msgid "operator not allowed in variable definition" msgstr "у визначенні змінної оператор не допускається" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:18821 +#: preproc.y:20500 #, c-format msgid "%s at or near \"%s\"" msgstr "%s в або поблизу \"%s\"" diff --git a/third_party/spanner_pg/src/interfaces/ecpg/test/Makefile b/third_party/spanner_pg/src/interfaces/ecpg/test/Makefile index be53b7b9..10f53c70 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/test/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/ecpg/test/pg_regress_ecpg.c b/third_party/spanner_pg/src/interfaces/ecpg/test/pg_regress_ecpg.c index 15f588a8..f920af45 100644 --- a/third_party/spanner_pg/src/interfaces/ecpg/test/pg_regress_ecpg.c +++ b/third_party/spanner_pg/src/interfaces/ecpg/test/pg_regress_ecpg.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * 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 * * src/interfaces/ecpg/test/pg_regress_ecpg.c @@ -166,9 +166,14 @@ ecpg_start_test(const char *testname, snprintf(inprg, sizeof(inprg), "%s/%s", inputdir, testname); snprintf(insource, sizeof(insource), "%s.c", testname); + /* make a version of the test name that has dashes in place of slashes */ initStringInfo(&testname_dash); appendStringInfoString(&testname_dash, testname); - replace_string(&testname_dash, "/", "-"); + for (char *c = testname_dash.data; *c != '\0'; c++) + { + if (*c == '/') + *c = '-'; + } snprintf(expectfile_stdout, sizeof(expectfile_stdout), "%s/expected/%s.stdout", diff --git a/third_party/spanner_pg/src/interfaces/libpq/.gitignore b/third_party/spanner_pg/src/interfaces/libpq/.gitignore index 5c232ae2..10a39a0e 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/.gitignore +++ b/third_party/spanner_pg/src/interfaces/libpq/.gitignore @@ -1,4 +1,6 @@ /exports.list +/libpq-refs-stamp +/tmp_check/ /libpq.rc # .c files that are symlinked in from elsewhere /chklocale.c diff --git a/third_party/spanner_pg/src/interfaces/libpq/BUILD b/third_party/spanner_pg/src/interfaces/libpq/BUILD index ba16b2ae..b7016b11 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/BUILD +++ b/third_party/spanner_pg/src/interfaces/libpq/BUILD @@ -75,6 +75,7 @@ cc_library( srcs = [ "fe-auth.c", "fe-auth.h", + "fe-auth-sasl.h", "fe-auth-scram.c", "fe-connect.c", "fe-exec.c", @@ -88,7 +89,7 @@ cc_library( "libpq-events.h", "libpq-int.h", "pqexpbuffer.c", - "test/uri-regress.c", + "test/libpq_uri_regress.c", ], hdrs = [ "libpq-fe.h", diff --git a/third_party/spanner_pg/src/interfaces/libpq/Makefile b/third_party/spanner_pg/src/interfaces/libpq/Makefile index 43682574..8abdb092 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/Makefile +++ b/third_party/spanner_pg/src/interfaces/libpq/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/interfaces/libpq library # -# 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 # # 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" @@ -98,12 +99,31 @@ ifeq ($(with_ssl),openssl) PKG_CONFIG_REQUIRES_PRIVATE = libssl libcrypto endif -all: all-lib +all: all-lib libpq-refs-stamp # Shared library stuff include $(top_srcdir)/src/Makefile.shlib backend_src = $(top_srcdir)/src/backend +# Check for functions that libpq must not call, currently just exit(). +# (Ideally we'd reject abort() too, but there are various scenarios where +# build toolchains insert abort() calls, e.g. to implement assert().) +# If nm doesn't exist or doesn't work on shlibs, this test will do nothing, +# which is fine. The exclusion of __cxa_atexit is necessary on OpenBSD, +# which seems to insert references to that even in pure C code. +# Skip the test when profiling, as gcc may insert exit() calls for that. +# Also skip the test on platforms where libpq infrastructure may be provided +# by statically-linked libraries, as we can't expect them to honor this +# coding rule. +libpq-refs-stamp: $(shlib) +ifneq ($(enable_coverage), yes) +ifeq (,$(filter aix solaris,$(PORTNAME))) + @if nm -A -u $< 2>/dev/null | grep -v __cxa_atexit | grep exit; then \ + echo 'libpq must not be calling any function which invokes exit'; exit 1; \ + fi +endif +endif + touch $@ # Make dependencies on pg_config_paths.h visible in all builds. fe-connect.o: fe-connect.c $(top_builddir)/src/port/pg_config_paths.h @@ -116,11 +136,20 @@ install: all installdirs install-lib $(INSTALL_DATA) $(srcdir)/libpq-fe.h '$(DESTDIR)$(includedir)' $(INSTALL_DATA) $(srcdir)/libpq-events.h '$(DESTDIR)$(includedir)' $(INSTALL_DATA) $(srcdir)/libpq-int.h '$(DESTDIR)$(includedir_internal)' + $(INSTALL_DATA) $(srcdir)/fe-auth-sasl.h '$(DESTDIR)$(includedir_internal)' $(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 installcheck: export PATH := $(CURDIR)/test:$(PATH) + +check: test-build all + $(prove_check) + +installcheck: test-build all + $(prove_installcheck) installdirs: installdirs-lib $(MKDIR_P) '$(DESTDIR)$(includedir)' '$(DESTDIR)$(includedir_internal)' '$(DESTDIR)$(datadir)' @@ -129,12 +158,14 @@ uninstall: uninstall-lib rm -f '$(DESTDIR)$(includedir)/libpq-fe.h' rm -f '$(DESTDIR)$(includedir)/libpq-events.h' rm -f '$(DESTDIR)$(includedir_internal)/libpq-int.h' + rm -f '$(DESTDIR)$(includedir_internal)/fe-auth-sasl.h' rm -f '$(DESTDIR)$(includedir_internal)/pqexpbuffer.h' rm -f '$(DESTDIR)$(datadir)/pg_service.conf.sample' clean distclean: clean-lib $(MAKE) -C test $@ - rm -f $(OBJS) pthread.h + 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 diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-auth-sasl.h b/third_party/spanner_pg/src/interfaces/libpq/fe-auth-sasl.h new file mode 100644 index 00000000..da3c30b8 --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-auth-sasl.h @@ -0,0 +1,131 @@ +/*------------------------------------------------------------------------- + * + * fe-auth-sasl.h + * Defines the SASL mechanism interface for libpq. + * + * Each SASL mechanism defines a frontend and a backend callback structure. + * This is not part of the public API for applications. + * + * See src/include/libpq/sasl.h for the backend counterpart. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/interfaces/libpq/fe-auth-sasl.h + * + *------------------------------------------------------------------------- + */ + +#ifndef FE_AUTH_SASL_H +#define FE_AUTH_SASL_H + +#include "libpq-fe.h" + +/* + * Frontend SASL mechanism callbacks. + * + * To implement a frontend mechanism, declare a pg_be_sasl_mech struct with + * appropriate callback implementations, then hook it into conn->sasl during + * pg_SASL_init()'s mechanism negotiation. + */ +typedef struct pg_fe_sasl_mech +{ + /*------- + * init() + * + * Initializes mechanism-specific state for a connection. This + * callback must return a pointer to its allocated state, which will + * be passed as-is as the first argument to the other callbacks. + * the free() callback is called to release any state resources. + * + * If state allocation fails, the implementation should return NULL to + * fail the authentication exchange. + * + * Input parameters: + * + * conn: The connection to the server + * + * password: The user's supplied password for the current connection + * + * mech: The mechanism name in use, for implementations that may + * advertise more than one name (such as *-PLUS variants). + *------- + */ + void *(*init) (PGconn *conn, const char *password, const char *mech); + + /*-------- + * exchange() + * + * Produces a client response to a server challenge. As a special case + * for client-first SASL mechanisms, exchange() is called with a NULL + * server response once at the start of the authentication exchange to + * generate an initial response. + * + * Input parameters: + * + * state: The opaque mechanism state returned by init() + * + * input: The challenge data sent by the server, or NULL when + * generating a client-first initial response (that is, when + * the server expects the client to send a message to start + * the exchange). This is guaranteed to be null-terminated + * for safety, but SASL allows embedded nulls in challenges, + * so mechanisms must be careful to check inputlen. + * + * inputlen: The length of the challenge data sent by the server, or -1 + * during client-first initial response generation. + * + * Output parameters, to be set by the callback function: + * + * output: A malloc'd buffer containing the client's response to + * the server (can be empty), or NULL if the exchange should + * be aborted. (*success should be set to false in the + * latter case.) + * + * outputlen: The length (0 or higher) of the client response buffer, + * ignored if output is NULL. + * + * done: Set to true if the SASL exchange should not continue, + * because the exchange is either complete or failed + * + * success: Set to true if the SASL exchange completed successfully. + * Ignored if *done is false. + *-------- + */ + void (*exchange) (void *state, char *input, int inputlen, + char **output, int *outputlen, + bool *done, bool *success); + + /*-------- + * channel_bound() + * + * Returns true if the connection has an established channel binding. A + * mechanism implementation must ensure that a SASL exchange has actually + * been completed, in addition to checking that channel binding is in use. + * + * Mechanisms that do not implement channel binding may simply return + * false. + * + * Input parameters: + * + * state: The opaque mechanism state returned by init() + *-------- + */ + bool (*channel_bound) (void *state); + + /*-------- + * free() + * + * Frees the state allocated by init(). This is called when the connection + * is dropped, not when the exchange is completed. + * + * Input parameters: + * + * state: The opaque mechanism state returned by init() + *-------- + */ + void (*free) (void *state); + +} pg_fe_sasl_mech; + +#endif /* FE_AUTH_SASL_H */ diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-auth-scram.c b/third_party/spanner_pg/src/interfaces/libpq/fe-auth-scram.c index cf3195e5..cd66e975 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-auth-scram.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-auth-scram.c @@ -3,7 +3,7 @@ * fe-auth-scram.c * The front-end (client) implementation of SCRAM authentication. * - * 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 * * IDENTIFICATION @@ -21,6 +21,22 @@ #include "fe-auth.h" +/* The exported SCRAM callback mechanism. */ +static void *scram_init(PGconn *conn, const char *password, + const char *sasl_mechanism); +static void scram_exchange(void *opaq, char *input, int inputlen, + char **output, int *outputlen, + bool *done, bool *success); +static bool scram_channel_bound(void *opaq); +static void scram_free(void *opaq); + +const pg_fe_sasl_mech pg_scram_mech = { + scram_init, + scram_exchange, + scram_channel_bound, + scram_free +}; + /* * Status of exchange messages used for SCRAM authentication via the * SASL protocol. @@ -64,18 +80,19 @@ static bool read_server_first_message(fe_scram_state *state, char *input); static bool read_server_final_message(fe_scram_state *state, char *input); static char *build_client_first_message(fe_scram_state *state); static char *build_client_final_message(fe_scram_state *state); -static bool verify_server_signature(fe_scram_state *state, bool *match); +static bool verify_server_signature(fe_scram_state *state, bool *match, + const char **errstr); static bool calculate_client_proof(fe_scram_state *state, const char *client_final_message_without_proof, - uint8 *result); + uint8 *result, const char **errstr); /* * Initialize SCRAM exchange status. */ -void * -pg_fe_scram_init(PGconn *conn, - const char *password, - const char *sasl_mechanism) +static void * +scram_init(PGconn *conn, + const char *password, + const char *sasl_mechanism) { fe_scram_state *state; char *prep_password; @@ -128,8 +145,8 @@ pg_fe_scram_init(PGconn *conn, * Note that the caller must also ensure that the exchange was actually * successful. */ -bool -pg_fe_scram_channel_bound(void *opaq) +static bool +scram_channel_bound(void *opaq) { fe_scram_state *state = (fe_scram_state *) opaq; @@ -152,8 +169,8 @@ pg_fe_scram_channel_bound(void *opaq) /* * Free SCRAM exchange status */ -void -pg_fe_scram_free(void *opaq) +static void +scram_free(void *opaq) { fe_scram_state *state = (fe_scram_state *) opaq; @@ -188,13 +205,14 @@ pg_fe_scram_free(void *opaq) /* * Exchange a SCRAM message with backend. */ -void -pg_fe_scram_exchange(void *opaq, char *input, int inputlen, - char **output, int *outputlen, - bool *done, bool *success) +static void +scram_exchange(void *opaq, char *input, int inputlen, + char **output, int *outputlen, + bool *done, bool *success) { fe_scram_state *state = (fe_scram_state *) opaq; PGconn *conn = state->conn; + const char *errstr = NULL; *done = false; *success = false; @@ -257,10 +275,10 @@ pg_fe_scram_exchange(void *opaq, char *input, int inputlen, * Verify server signature, to make sure we're talking to the * genuine server. */ - if (!verify_server_signature(state, success)) + if (!verify_server_signature(state, success, &errstr)) { - appendPQExpBufferStr(&conn->errorMessage, - libpq_gettext("could not verify server signature\n")); + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not verify server signature: %s\n"), errstr); goto error; } @@ -453,6 +471,7 @@ build_client_final_message(fe_scram_state *state) uint8 client_proof[SCRAM_KEY_LEN]; char *result; int encoded_len; + const char *errstr = NULL; initPQExpBuffer(&buf); @@ -556,11 +575,12 @@ build_client_final_message(fe_scram_state *state) /* Append proof to it, to form client-final-message. */ if (!calculate_client_proof(state, state->client_final_message_without_proof, - client_proof)) + client_proof, &errstr)) { termPQExpBuffer(&buf); - appendPQExpBufferStr(&conn->errorMessage, - libpq_gettext("could not calculate client proof\n")); + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not calculate client proof: %s\n"), + errstr); return NULL; } @@ -766,12 +786,13 @@ read_server_final_message(fe_scram_state *state, char *input) /* * Calculate the client proof, part of the final exchange message sent - * by the client. Returns true on success, false on failure. + * by the client. Returns true on success, false on failure with *errstr + * pointing to a message about the error details. */ static bool calculate_client_proof(fe_scram_state *state, const char *client_final_message_without_proof, - uint8 *result) + uint8 *result, const char **errstr) { uint8 StoredKey[SCRAM_KEY_LEN]; uint8 ClientKey[SCRAM_KEY_LEN]; @@ -781,17 +802,27 @@ calculate_client_proof(fe_scram_state *state, ctx = pg_hmac_create(PG_SHA256); if (ctx == NULL) + { + *errstr = pg_hmac_error(NULL); /* returns OOM */ return false; + } /* * Calculate SaltedPassword, and store it in 'state' so that we can reuse * it later in verify_server_signature. */ if (scram_SaltedPassword(state->password, state->salt, state->saltlen, - state->iterations, state->SaltedPassword) < 0 || - scram_ClientKey(state->SaltedPassword, ClientKey) < 0 || - scram_H(ClientKey, SCRAM_KEY_LEN, StoredKey) < 0 || - pg_hmac_init(ctx, StoredKey, SCRAM_KEY_LEN) < 0 || + state->iterations, state->SaltedPassword, + errstr) < 0 || + scram_ClientKey(state->SaltedPassword, ClientKey, errstr) < 0 || + scram_H(ClientKey, SCRAM_KEY_LEN, StoredKey, errstr) < 0) + { + /* errstr is already filled here */ + pg_hmac_free(ctx); + return false; + } + + if (pg_hmac_init(ctx, StoredKey, SCRAM_KEY_LEN) < 0 || pg_hmac_update(ctx, (uint8 *) state->client_first_message_bare, strlen(state->client_first_message_bare)) < 0 || @@ -805,6 +836,7 @@ calculate_client_proof(fe_scram_state *state, strlen(client_final_message_without_proof)) < 0 || pg_hmac_final(ctx, ClientSignature, sizeof(ClientSignature)) < 0) { + *errstr = pg_hmac_error(ctx); pg_hmac_free(ctx); return false; } @@ -820,10 +852,12 @@ calculate_client_proof(fe_scram_state *state, * Validate the server signature, received as part of the final exchange * message received from the server. *match tracks if the server signature * matched or not. Returns true if the server signature got verified, and - * false for a processing error. + * false for a processing error with *errstr pointing to a message about the + * error details. */ static bool -verify_server_signature(fe_scram_state *state, bool *match) +verify_server_signature(fe_scram_state *state, bool *match, + const char **errstr) { uint8 expected_ServerSignature[SCRAM_KEY_LEN]; uint8 ServerKey[SCRAM_KEY_LEN]; @@ -831,11 +865,20 @@ verify_server_signature(fe_scram_state *state, bool *match) ctx = pg_hmac_create(PG_SHA256); if (ctx == NULL) + { + *errstr = pg_hmac_error(NULL); /* returns OOM */ return false; + } + + if (scram_ServerKey(state->SaltedPassword, ServerKey, errstr) < 0) + { + /* errstr is filled already */ + pg_hmac_free(ctx); + return false; + } - if (scram_ServerKey(state->SaltedPassword, ServerKey) < 0 || /* calculate ServerSignature */ - pg_hmac_init(ctx, ServerKey, SCRAM_KEY_LEN) < 0 || + if (pg_hmac_init(ctx, ServerKey, SCRAM_KEY_LEN) < 0 || pg_hmac_update(ctx, (uint8 *) state->client_first_message_bare, strlen(state->client_first_message_bare)) < 0 || @@ -850,6 +893,7 @@ verify_server_signature(fe_scram_state *state, bool *match) pg_hmac_final(ctx, expected_ServerSignature, sizeof(expected_ServerSignature)) < 0) { + *errstr = pg_hmac_error(ctx); pg_hmac_free(ctx); return false; } @@ -867,9 +911,12 @@ verify_server_signature(fe_scram_state *state, bool *match) /* * Build a new SCRAM secret. + * + * On error, returns NULL and sets *errstr to point to a message about the + * error details. */ char * -pg_fe_scram_build_secret(const char *password) +pg_fe_scram_build_secret(const char *password, const char **errstr) { char *prep_password; pg_saslprep_rc rc; @@ -884,20 +931,25 @@ pg_fe_scram_build_secret(const char *password) */ rc = pg_saslprep(password, &prep_password); if (rc == SASLPREP_OOM) + { + *errstr = libpq_gettext("out of memory"); return NULL; + } if (rc == SASLPREP_SUCCESS) password = (const char *) prep_password; /* Generate a random salt */ if (!pg_strong_random(saltbuf, SCRAM_DEFAULT_SALT_LEN)) { + *errstr = libpq_gettext("could not generate random salt"); if (prep_password) free(prep_password); return NULL; } result = scram_build_secret(saltbuf, SCRAM_DEFAULT_SALT_LEN, - SCRAM_DEFAULT_ITERATIONS, password); + SCRAM_DEFAULT_ITERATIONS, password, + errstr); if (prep_password) free(prep_password); diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-auth.c b/third_party/spanner_pg/src/interfaces/libpq/fe-auth.c index e8062647..0a072a36 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-auth.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-auth.c @@ -3,7 +3,7 @@ * fe-auth.c * The front-end (client) authorization routines * - * 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 * * IDENTIFICATION @@ -35,12 +35,12 @@ #ifndef MAXHOSTNAMELEN #include /* for MAXHOSTNAMELEN on some */ #endif -#include #endif #include "common/md5.h" #include "common/scram-common.h" #include "fe-auth.h" +#include "fe-auth-sasl.h" #include "libpq-fe.h" #ifdef ENABLE_GSS @@ -482,7 +482,10 @@ pg_SASL_init(PGconn *conn, int payloadlen) * channel_binding is not disabled. */ if (conn->channel_binding[0] != 'd') /* disable */ + { selected_mechanism = SCRAM_SHA_256_PLUS_NAME; + conn->sasl = &pg_scram_mech; + } #else /* * The client does not support channel binding. If it is @@ -516,7 +519,10 @@ pg_SASL_init(PGconn *conn, int payloadlen) } else if (strcmp(mechanism_buf.data, SCRAM_SHA_256_NAME) == 0 && !selected_mechanism) + { selected_mechanism = SCRAM_SHA_256_NAME; + conn->sasl = &pg_scram_mech; + } } if (!selected_mechanism) @@ -555,20 +561,22 @@ pg_SASL_init(PGconn *conn, int payloadlen) goto error; } + Assert(conn->sasl); + /* * Initialize the SASL state information with all the information gathered * during the initial exchange. * * Note: Only tls-unique is supported for the moment. */ - conn->sasl_state = pg_fe_scram_init(conn, + conn->sasl_state = conn->sasl->init(conn, password, selected_mechanism); if (!conn->sasl_state) goto oom_error; /* Get the mechanism-specific Initial Client Response, if any */ - pg_fe_scram_exchange(conn->sasl_state, + conn->sasl->exchange(conn->sasl_state, NULL, -1, &initialresponse, &initialresponselen, &done, &success); @@ -649,7 +657,7 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) /* For safety and convenience, ensure the buffer is NULL-terminated. */ challenge[payloadlen] = '\0'; - pg_fe_scram_exchange(conn->sasl_state, + conn->sasl->exchange(conn->sasl_state, challenge, payloadlen, &output, &outputlen, &done, &success); @@ -664,7 +672,23 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) libpq_gettext("AuthenticationSASLFinal received from server, but SASL authentication was not completed\n")); return STATUS_ERROR; } - if (outputlen != 0) + + /* + * If the exchange is not completed yet, we need to make sure that the + * SASL mechanism has generated a message to send back. + */ + if (output == NULL && !done) + { + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("no client response found after SASL exchange success\n")); + return STATUS_ERROR; + } + + /* + * SASL allows zero-length responses, so this check uses "output" and not + * "outputlen" to allow the case of an empty message. + */ + if (output) { /* * Send the SASL response to the server. @@ -765,6 +789,7 @@ pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq) case AUTH_REQ_MD5: { char *crypt_pwd2; + const char *errstr = NULL; /* Allocate enough space for two MD5 hashes */ crypt_pwd = malloc(2 * (MD5_PASSWD_LEN + 1)); @@ -777,14 +802,21 @@ pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq) crypt_pwd2 = crypt_pwd + MD5_PASSWD_LEN + 1; if (!pg_md5_encrypt(password, conn->pguser, - strlen(conn->pguser), crypt_pwd2)) + strlen(conn->pguser), crypt_pwd2, + &errstr)) { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not encrypt password: %s\n"), + errstr); free(crypt_pwd); return STATUS_ERROR; } if (!pg_md5_encrypt(crypt_pwd2 + strlen("md5"), md5Salt, - 4, crypt_pwd)) + 4, crypt_pwd, &errstr)) { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not encrypt password: %s\n"), + errstr); free(crypt_pwd); return STATUS_ERROR; } @@ -830,7 +862,7 @@ check_expected_areq(AuthRequest areq, PGconn *conn) case AUTH_REQ_SASL_FIN: break; case AUTH_REQ_OK: - if (!pg_fe_scram_channel_bound(conn->sasl_state)) + if (!conn->sasl || !conn->sasl->channel_bound(conn->sasl_state)) { appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("channel binding required, but server authenticated client without channel binding\n")); @@ -1066,14 +1098,17 @@ pg_fe_sendauth(AuthRequest areq, int payloadlen, PGconn *conn) /* - * pg_fe_getauthname + * pg_fe_getusername * - * Returns a pointer to malloc'd space containing whatever name the user - * has authenticated to the system. If there is an error, return NULL, - * and append a suitable error message to *errorMessage if that's not NULL. + * Returns a pointer to malloc'd space containing the name of the + * specified user_id. If there is an error, return NULL, and append + * a suitable error message to *errorMessage if that's not NULL. + * + * Caution: on Windows, the user_id argument is ignored, and we always + * fetch the current user's name. */ char * -pg_fe_getauthname(PQExpBuffer errorMessage) +pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage) { char *result = NULL; const char *name = NULL; @@ -1083,19 +1118,15 @@ pg_fe_getauthname(PQExpBuffer errorMessage) char username[256 + 1]; DWORD namesize = sizeof(username); #else - uid_t user_id = geteuid(); char pwdbuf[BUFSIZ]; - struct passwd pwdstr; - struct passwd *pw = NULL; - int pwerr; #endif /* * Some users are using configure --enable-thread-safety-force, so we - * might as well do the locking within our library to protect - * pqGetpwuid(). In fact, application developers can use getpwuid() in - * their application if they use the locking call we provide, or install - * their own locking function using PQregisterThreadLock(). + * might as well do the locking within our library to protect getpwuid(). + * In fact, application developers can use getpwuid() in their application + * if they use the locking call we provide, or install their own locking + * function using PQregisterThreadLock(). */ pglock_thread(); @@ -1107,21 +1138,10 @@ pg_fe_getauthname(PQExpBuffer errorMessage) libpq_gettext("user name lookup failure: error code %lu\n"), GetLastError()); #else - pwerr = pqGetpwuid(user_id, &pwdstr, pwdbuf, sizeof(pwdbuf), &pw); - if (pw != NULL) - name = pw->pw_name; + if (pg_get_user_name(user_id, pwdbuf, sizeof(pwdbuf))) + name = pwdbuf; else if (errorMessage) - { - if (pwerr != 0) - appendPQExpBuffer(errorMessage, - libpq_gettext("could not look up local user ID %d: %s\n"), - (int) user_id, - strerror_r(pwerr, pwdbuf, sizeof(pwdbuf))); - else - appendPQExpBuffer(errorMessage, - libpq_gettext("local user with ID %d does not exist\n"), - (int) user_id); - } + appendPQExpBuffer(errorMessage, "%s\n", pwdbuf); #endif if (name) @@ -1137,6 +1157,23 @@ pg_fe_getauthname(PQExpBuffer errorMessage) return result; } +/* + * pg_fe_getauthname + * + * Returns a pointer to malloc'd space containing whatever name the user + * has authenticated to the system. If there is an error, return NULL, + * and append a suitable error message to *errorMessage if that's not NULL. + */ +char * +pg_fe_getauthname(PQExpBuffer errorMessage) +{ +#ifdef WIN32 + return pg_fe_getusername(0, errorMessage); +#else + return pg_fe_getusername(geteuid(), errorMessage); +#endif +} + /* * PQencryptPassword -- exported routine to encrypt a password with MD5 @@ -1150,12 +1187,13 @@ char * PQencryptPassword(const char *passwd, const char *user) { char *crypt_pwd; + const char *errstr = NULL; crypt_pwd = malloc(MD5_PASSWD_LEN + 1); if (!crypt_pwd) return NULL; - if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd)) + if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd, &errstr)) { free(crypt_pwd); return NULL; @@ -1199,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) @@ -1255,19 +1293,33 @@ PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, */ if (strcmp(algorithm, "scram-sha-256") == 0) { - crypt_pwd = pg_fe_scram_build_secret(passwd); + const char *errstr = NULL; + + crypt_pwd = pg_fe_scram_build_secret(passwd, &errstr); + if (!crypt_pwd) + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not encrypt password: %s\n"), + errstr); } else if (strcmp(algorithm, "md5") == 0) { crypt_pwd = malloc(MD5_PASSWD_LEN + 1); if (crypt_pwd) { - if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd)) + const char *errstr = NULL; + + if (!pg_md5_encrypt(passwd, user, strlen(user), crypt_pwd, &errstr)) { + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not encrypt password: %s\n"), + errstr); free(crypt_pwd); crypt_pwd = NULL; } } + else + appendPQExpBufferStr(&conn->errorMessage, + libpq_gettext("out of memory\n")); } else { @@ -1277,9 +1329,5 @@ PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, return NULL; } - if (!crypt_pwd) - appendPQExpBufferStr(&conn->errorMessage, - libpq_gettext("out of memory\n")); - return crypt_pwd; } diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-auth.h b/third_party/spanner_pg/src/interfaces/libpq/fe-auth.h index 7877dcbd..049a8bb1 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-auth.h +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-auth.h @@ -4,7 +4,7 @@ * * Definitions for network authentication routines * - * 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 * * src/interfaces/libpq/fe-auth.h @@ -20,17 +20,12 @@ /* Prototypes for functions in fe-auth.c */ extern int pg_fe_sendauth(AuthRequest areq, int payloadlen, PGconn *conn); +extern char *pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage); extern char *pg_fe_getauthname(PQExpBuffer errorMessage); -/* Prototypes for functions in fe-auth-scram.c */ -extern void *pg_fe_scram_init(PGconn *conn, - const char *password, - const char *sasl_mechanism); -extern bool pg_fe_scram_channel_bound(void *opaq); -extern void pg_fe_scram_free(void *opaq); -extern void pg_fe_scram_exchange(void *opaq, char *input, int inputlen, - char **output, int *outputlen, - bool *done, bool *success); -extern char *pg_fe_scram_build_secret(const char *password); +/* Mechanisms in fe-auth-scram.c */ +extern const pg_fe_sasl_mech pg_scram_mech; +extern char *pg_fe_scram_build_secret(const char *password, + const char **errstr); #endif /* FE_AUTH_H */ diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-connect.c b/third_party/spanner_pg/src/interfaces/libpq/fe-connect.c index 0278f1c6..a8090134 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-connect.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-connect.c @@ -3,7 +3,7 @@ * fe-connect.c * functions related to setting up a connection to the backend * - * 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 * * @@ -377,6 +377,7 @@ static int connectDBStart(PGconn *conn); static int connectDBComplete(PGconn *conn); static PGPing internal_ping(PGconn *conn); static PGconn *makeEmptyPGconn(void); +static void pqFreeCommandQueue(PGcmdQueueEntry *queue); static bool fillPGconn(PGconn *conn, PQconninfoOption *connOptions); static void freePGconn(PGconn *conn); static void closePGconn(PGconn *conn); @@ -462,6 +463,12 @@ pqDropConnection(PGconn *conn, bool flushInput) /* Always discard any unsent data */ conn->outCount = 0; + /* Likewise, discard any pending pipelined commands */ + pqFreeCommandQueue(conn->cmd_queue_head); + conn->cmd_queue_head = conn->cmd_queue_tail = NULL; + pqFreeCommandQueue(conn->cmd_queue_recycle); + conn->cmd_queue_recycle = NULL; + /* Free authentication/encryption state */ #ifdef ENABLE_GSS { @@ -516,11 +523,7 @@ pqDropConnection(PGconn *conn, bool flushInput) #endif if (conn->sasl_state) { - /* - * XXX: if support for more authentication mechanisms is added, this - * needs to call the right 'free' function. - */ - pg_fe_scram_free(conn->sasl_state); + conn->sasl->free(conn->sasl_state); conn->sasl_state = NULL; } } @@ -573,12 +576,6 @@ pqDropServerData(PGconn *conn) } conn->notifyHead = conn->notifyTail = NULL; - pqFreeCommandQueue(conn->cmd_queue_head); - conn->cmd_queue_head = conn->cmd_queue_tail = NULL; - - pqFreeCommandQueue(conn->cmd_queue_recycle); - conn->cmd_queue_recycle = NULL; - /* Reset ParameterStatus data, as well as variables deduced from it */ pstatus = conn->pstatus; while (pstatus != NULL) @@ -668,7 +665,6 @@ PQconnectdbParams(const char *const *keywords, (void) connectDBComplete(conn); return conn; - } /* @@ -1703,7 +1699,7 @@ static void emitHostIdentityInfo(PGconn *conn, const char *host_addr) { #ifdef HAVE_UNIX_SOCKETS - if (IS_AF_UNIX(conn->raddr.addr.ss_family)) + if (conn->raddr.addr.ss_family == AF_UNIX) { char service[NI_MAXHOST]; @@ -1767,7 +1763,7 @@ connectFailureMessage(PGconn *conn, int errorno) SOCK_STRERROR(errorno, sebuf, sizeof(sebuf))); #ifdef HAVE_UNIX_SOCKETS - if (IS_AF_UNIX(conn->raddr.addr.ss_family)) + if (conn->raddr.addr.ss_family == AF_UNIX) appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("\tIs the server running locally and accepting connections on that socket?\n")); else @@ -1953,26 +1949,17 @@ setKeepalivesCount(PGconn *conn) /* * Enable keepalives and set the keepalive values on Win32, * where they are always set in one batch. + * + * CAUTION: This needs to be signal safe, since it's used by PQcancel. */ static int -setKeepalivesWin32(PGconn *conn) +setKeepalivesWin32(pgsocket sock, int idle, int interval) { struct tcp_keepalive ka; DWORD retsize; - int idle = 0; - int interval = 0; - if (conn->keepalives_idle && - !parse_int_param(conn->keepalives_idle, &idle, conn, - "keepalives_idle")) - return 0; if (idle <= 0) idle = 2 * 60 * 60; /* 2 hours = default */ - - if (conn->keepalives_interval && - !parse_int_param(conn->keepalives_interval, &interval, conn, - "keepalives_interval")) - return 0; if (interval <= 0) interval = 1; /* 1 second = default */ @@ -1980,7 +1967,7 @@ setKeepalivesWin32(PGconn *conn) ka.keepalivetime = idle * 1000; ka.keepaliveinterval = interval * 1000; - if (WSAIoctl(conn->sock, + if (WSAIoctl(sock, SIO_KEEPALIVE_VALS, (LPVOID) &ka, sizeof(ka), @@ -1990,6 +1977,26 @@ setKeepalivesWin32(PGconn *conn) NULL, NULL) != 0) + return 0; + return 1; +} + +static int +prepKeepalivesWin32(PGconn *conn) +{ + int idle = -1; + int interval = -1; + + if (conn->keepalives_idle && + !parse_int_param(conn->keepalives_idle, &idle, conn, + "keepalives_idle")) + return 0; + if (conn->keepalives_interval && + !parse_int_param(conn->keepalives_interval, &interval, conn, + "keepalives_interval")) + return 0; + + if (!setKeepalivesWin32(conn->sock, idle, interval)) { appendPQExpBuffer(&conn->errorMessage, libpq_gettext("%s(%s) failed: error code %d\n"), @@ -2588,7 +2595,7 @@ PQconnectPoll(PGconn *conn) * TCP sockets, nonblock mode, close-on-exec. Try the * next address if any of this fails. */ - if (!IS_AF_UNIX(addr_cur->ai_family)) + if (addr_cur->ai_family != AF_UNIX) { if (!connectNoDelay(conn)) { @@ -2617,7 +2624,7 @@ PQconnectPoll(PGconn *conn) } #endif /* F_SETFD */ - if (!IS_AF_UNIX(addr_cur->ai_family)) + if (addr_cur->ai_family != AF_UNIX) { #ifndef WIN32 int on = 1; @@ -2653,7 +2660,7 @@ PQconnectPoll(PGconn *conn) err = 1; #else /* WIN32 */ #ifdef SIO_KEEPALIVE_VALS - else if (!setKeepalivesWin32(conn)) + else if (!prepKeepalivesWin32(conn)) err = 1; #endif /* SIO_KEEPALIVE_VALS */ #endif /* WIN32 */ @@ -2753,7 +2760,7 @@ PQconnectPoll(PGconn *conn) case CONNECTION_STARTED: { - ACCEPT_TYPE_ARG3 optlen = sizeof(optval); + socklen_t optlen = sizeof(optval); /* * Write ready, since we've made it here, so the connection @@ -2819,13 +2826,10 @@ PQconnectPoll(PGconn *conn) * Unix-domain socket. */ if (conn->requirepeer && conn->requirepeer[0] && - IS_AF_UNIX(conn->raddr.addr.ss_family)) + conn->raddr.addr.ss_family == AF_UNIX) { #ifndef WIN32 - char pwdbuf[BUFSIZ]; - struct passwd pass_buf; - struct passwd *pass; - int passerr; + char *remote_username; #endif uid_t uid; gid_t gid; @@ -2848,35 +2852,27 @@ PQconnectPoll(PGconn *conn) } #ifndef WIN32 - passerr = pqGetpwuid(uid, &pass_buf, pwdbuf, sizeof(pwdbuf), &pass); - if (pass == NULL) - { - if (passerr != 0) - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("could not look up local user ID %d: %s\n"), - (int) uid, - strerror_r(passerr, sebuf, sizeof(sebuf))); - else - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("local user with ID %d does not exist\n"), - (int) uid); - goto error_return; - } + remote_username = pg_fe_getusername(uid, + &conn->errorMessage); + if (remote_username == NULL) + goto error_return; /* message already logged */ - if (strcmp(pass->pw_name, conn->requirepeer) != 0) + if (strcmp(remote_username, conn->requirepeer) != 0) { appendPQExpBuffer(&conn->errorMessage, libpq_gettext("requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n"), - conn->requirepeer, pass->pw_name); + conn->requirepeer, remote_username); + free(remote_username); goto error_return; } + free(remote_username); #else /* WIN32 */ /* should have failed with ENOSYS above */ Assert(false); #endif /* WIN32 */ } - if (IS_AF_UNIX(conn->raddr.addr.ss_family)) + if (conn->raddr.addr.ss_family == AF_UNIX) { /* Don't request SSL or GSSAPI over Unix sockets */ #ifdef USE_SSL @@ -3699,7 +3695,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; @@ -3933,8 +3929,7 @@ internal_ping(PGconn *conn) return PQPING_NO_RESPONSE; /* - * Report PQPING_REJECT if server says it's not accepting connections. (We - * distinguish this case mainly for the convenience of pg_ctl.) + * Report PQPING_REJECT if server says it's not accepting connections. */ if (strcmp(conn->last_sqlstate, ERRCODE_CANNOT_CONNECT_NOW) == 0) return PQPING_REJECT; @@ -4246,7 +4241,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. */ @@ -4256,7 +4251,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 */ @@ -4291,8 +4286,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; @@ -4301,15 +4295,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); } } } @@ -4351,8 +4338,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; @@ -4361,15 +4347,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); } } @@ -4406,8 +4385,53 @@ PQgetCancel(PGconn *conn) memcpy(&cancel->raddr, &conn->raddr, sizeof(SockAddr)); cancel->be_pid = conn->be_pid; cancel->be_key = conn->be_key; + /* We use -1 to indicate an unset connection option */ + cancel->pgtcp_user_timeout = -1; + cancel->keepalives = -1; + cancel->keepalives_idle = -1; + cancel->keepalives_interval = -1; + cancel->keepalives_count = -1; + if (conn->pgtcp_user_timeout != NULL) + { + if (!parse_int_param(conn->pgtcp_user_timeout, + &cancel->pgtcp_user_timeout, + conn, "tcp_user_timeout")) + goto fail; + } + if (conn->keepalives != NULL) + { + if (!parse_int_param(conn->keepalives, + &cancel->keepalives, + conn, "keepalives")) + goto fail; + } + if (conn->keepalives_idle != NULL) + { + if (!parse_int_param(conn->keepalives_idle, + &cancel->keepalives_idle, + conn, "keepalives_idle")) + goto fail; + } + if (conn->keepalives_interval != NULL) + { + if (!parse_int_param(conn->keepalives_interval, + &cancel->keepalives_interval, + conn, "keepalives_interval")) + goto fail; + } + if (conn->keepalives_count != NULL) + { + if (!parse_int_param(conn->keepalives_count, + &cancel->keepalives_count, + conn, "keepalives_count")) + goto fail; + } return cancel; + +fail: + free(cancel); + return NULL; } /* PQfreeCancel: free a cancel structure */ @@ -4420,14 +4444,36 @@ PQfreeCancel(PGcancel *cancel) /* - * PQcancel and PQrequestCancel: attempt to request cancellation of the - * current operation. + * Sets an integer socket option on a TCP socket, if the provided value is + * not negative. Returns false if setsockopt fails for some reason. + * + * CAUTION: This needs to be signal safe, since it's used by PQcancel. + */ +#if defined(TCP_USER_TIMEOUT) || !defined(WIN32) +static bool +optional_setsockopt(int fd, int protoid, int optid, int value) +{ + if (value < 0) + return true; + if (setsockopt(fd, protoid, optid, (char *) &value, sizeof(value)) < 0) + return false; + return true; +} +#endif + + +/* + * PQcancel: request query cancel * * The return value is true if the cancel request was successfully * dispatched, false if not (in which case an error message is available). * Note: successful dispatch is no guarantee that there will be any effect at * the backend. The application must read the operation result as usual. * + * On failure, an error message is stored in *errbuf, which must be of size + * errbufsize (recommended size is 256 bytes). *errbuf is not changed on + * success return. + * * CAUTION: we want this routine to be safely callable from a signal handler * (for example, an application might want to call it in a SIGINT handler). * This means we cannot use any C library routine that might be non-reentrant. @@ -4435,13 +4481,9 @@ PQfreeCancel(PGcancel *cancel) * just as dangerous. We avoid sprintf here for that reason. Building up * error messages with strcpy/strcat is tedious but should be quite safe. * We also save/restore errno in case the signal handler support doesn't. - * - * internal_cancel() is an internal helper function to make code-sharing - * between the two versions of the cancel function possible. */ -static int -internal_cancel(SockAddr *raddr, int be_pid, int be_key, - char *errbuf, int errbufsize) +int +PQcancel(PGcancel *cancel, char *errbuf, int errbufsize) { int save_errno = SOCK_ERRNO; pgsocket tmpsock = PGINVALID_SOCKET; @@ -4452,18 +4494,98 @@ internal_cancel(SockAddr *raddr, int be_pid, int be_key, CancelRequestPacket cp; } crp; + if (!cancel) + { + strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize); + /* strlcpy probably doesn't change errno, but be paranoid */ + SOCK_ERRNO_SET(save_errno); + return false; + } + /* * We need to open a temporary connection to the postmaster. Do this with * only kernel calls. */ - if ((tmpsock = socket(raddr->addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET) + if ((tmpsock = socket(cancel->raddr.addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET) { strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize); goto cancel_errReturn; } + + /* + * Since this connection will only be used to send a single packet of + * data, we don't need NODELAY. We also don't set the socket to + * nonblocking mode, because the API definition of PQcancel requires the + * cancel to be sent in a blocking way. + * + * We do set socket options related to keepalives and other TCP timeouts. + * This ensures that this function does not block indefinitely when + * reasonable keepalive and timeout settings have been provided. + */ + if (cancel->raddr.addr.ss_family != AF_UNIX && + cancel->keepalives != 0) + { +#ifndef WIN32 + if (!optional_setsockopt(tmpsock, SOL_SOCKET, SO_KEEPALIVE, 1)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(SO_KEEPALIVE) failed: ", errbufsize); + goto cancel_errReturn; + } + +#ifdef PG_TCP_KEEPALIVE_IDLE + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE, + cancel->keepalives_idle)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(" PG_TCP_KEEPALIVE_IDLE_STR ") failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#ifdef TCP_KEEPINTVL + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPINTVL, + cancel->keepalives_interval)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPINTVL) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#ifdef TCP_KEEPCNT + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPCNT, + cancel->keepalives_count)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPCNT) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#else /* WIN32 */ + +#ifdef SIO_KEEPALIVE_VALS + if (!setKeepalivesWin32(tmpsock, + cancel->keepalives_idle, + cancel->keepalives_interval)) + { + strlcpy(errbuf, "PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif /* SIO_KEEPALIVE_VALS */ +#endif /* WIN32 */ + + /* TCP_USER_TIMEOUT works the same way on Unix and Windows */ +#ifdef TCP_USER_TIMEOUT + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_USER_TIMEOUT, + cancel->pgtcp_user_timeout)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + } + retry3: - if (connect(tmpsock, (struct sockaddr *) &raddr->addr, - raddr->salen) < 0) + if (connect(tmpsock, (struct sockaddr *) &cancel->raddr.addr, + cancel->raddr.salen) < 0) { if (SOCK_ERRNO == EINTR) /* Interrupted system call - we'll just try again */ @@ -4472,16 +4594,12 @@ internal_cancel(SockAddr *raddr, int be_pid, int be_key, goto cancel_errReturn; } - /* - * We needn't set nonblocking I/O or NODELAY options here. - */ - /* Create and send the cancel request packet. */ crp.packetlen = pg_hton32((uint32) sizeof(crp)); crp.cp.cancelRequestCode = (MsgType) pg_hton32(CANCEL_REQUEST_CODE); - crp.cp.backendPID = pg_hton32(be_pid); - crp.cp.cancelAuthCode = pg_hton32(be_key); + crp.cp.backendPID = pg_hton32(cancel->be_pid); + crp.cp.cancelAuthCode = pg_hton32(cancel->be_key); retry4: if (send(tmpsock, (char *) &crp, sizeof(crp), 0) != (int) sizeof(crp)) @@ -4550,27 +4668,6 @@ internal_cancel(SockAddr *raddr, int be_pid, int be_key, return false; } -/* - * PQcancel: request query cancel - * - * Returns true if able to send the cancel request, false if not. - * - * On failure, an error message is stored in *errbuf, which must be of size - * errbufsize (recommended size is 256 bytes). *errbuf is not changed on - * success return. - */ -int -PQcancel(PGcancel *cancel, char *errbuf, int errbufsize) -{ - if (!cancel) - { - strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize); - return false; - } - - return internal_cancel(&cancel->raddr, cancel->be_pid, cancel->be_key, - errbuf, errbufsize); -} /* * PQrequestCancel: old, not thread-safe function for requesting query cancel @@ -4588,6 +4685,7 @@ int PQrequestCancel(PGconn *conn) { int r; + PGcancel *cancel; /* Check we have an open connection */ if (!conn) @@ -4599,15 +4697,30 @@ PQrequestCancel(PGconn *conn) "PQrequestCancel() -- connection is not open\n", conn->errorMessage.maxlen); conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; return false; } - r = internal_cancel(&conn->raddr, conn->be_pid, conn->be_key, - conn->errorMessage.data, conn->errorMessage.maxlen); + cancel = PQgetCancel(conn); + if (cancel) + { + r = PQcancel(cancel, conn->errorMessage.data, + conn->errorMessage.maxlen); + PQfreeCancel(cancel); + } + else + { + strlcpy(conn->errorMessage.data, "out of memory", + conn->errorMessage.maxlen); + r = false; + } if (!r) + { conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; + } return r; } @@ -5137,7 +5250,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 @@ -7298,14 +7411,12 @@ bool pqGetHomeDirectory(char *buf, int bufsize) { #ifndef WIN32 - char pwdbuf[BUFSIZ]; - struct passwd pwdstr; - struct passwd *pwd = NULL; + const char *home; - (void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd); - if (pwd == NULL) - return false; - strlcpy(buf, pwd->pw_dir, bufsize); + home = getenv("HOME"); + if (home == NULL || home[0] == '\0') + return pg_get_user_home_dir(geteuid(), buf, bufsize); + strlcpy(buf, home, bufsize); return true; #else char tmppath[MAX_PATH]; @@ -7321,6 +7432,11 @@ pqGetHomeDirectory(char *buf, int bufsize) /* * To keep the API consistent, the locking stubs are always provided, even * if they are not required. + * + * Since we neglected to provide any error-return convention in the + * pgthreadlock_t API, we can't do much except Assert upon failure of any + * mutex primitive. Fortunately, such failures appear to be nonexistent in + * the field. */ static void @@ -7340,7 +7456,7 @@ default_threadlock(int acquire) if (singlethread_lock == NULL) { if (pthread_mutex_init(&singlethread_lock, NULL)) - PGTHREAD_ERROR("failed to initialize mutex"); + Assert(false); } InterlockedExchange(&mutex_initlock, 0); } @@ -7348,12 +7464,12 @@ default_threadlock(int acquire) if (acquire) { if (pthread_mutex_lock(&singlethread_lock)) - PGTHREAD_ERROR("failed to lock mutex"); + Assert(false); } else { if (pthread_mutex_unlock(&singlethread_lock)) - PGTHREAD_ERROR("failed to unlock mutex"); + Assert(false); } #endif } diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-exec.c b/third_party/spanner_pg/src/interfaces/libpq/fe-exec.c index 1800d736..c9450ecf 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-exec.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-exec.c @@ -3,7 +3,7 @@ * fe-exec.c * functions related to sending a query down to the backend * - * 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 * * @@ -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 */ @@ -363,19 +379,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; } } @@ -438,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; @@ -522,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); } @@ -660,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; @@ -677,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) @@ -696,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 */ @@ -751,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. @@ -795,24 +839,81 @@ 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. + * + * Note that in no case (not even OOM) do we return NULL. */ 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 @@ -821,6 +922,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; @@ -1096,6 +1198,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, @@ -1281,10 +1384,7 @@ pqAppendCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry) */ if (conn->asyncStatus == PGASYNC_IDLE || conn->asyncStatus == PGASYNC_PIPELINE_IDLE) - { - resetPQExpBuffer(&conn->errorMessage); pqPipelineProcessQueue(conn); - } break; } } @@ -1339,7 +1439,6 @@ static int PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery) { PGcmdQueueEntry *entry = NULL; - PGcmdQueueEntry *entry2 = NULL; if (!PQsendQueryStart(conn, newQuery)) return 0; @@ -1352,103 +1451,48 @@ PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery) return 0; } - entry = pqAllocCmdQueueEntry(conn); - if (entry == NULL) - return 0; /* error msg already set */ if (conn->pipelineStatus != PQ_PIPELINE_OFF) { - entry2 = pqAllocCmdQueueEntry(conn); - if (entry2 == NULL) - goto sendFailed; + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("%s not allowed in pipeline mode\n"), + "PQsendQuery"); + return 0; } + entry = pqAllocCmdQueueEntry(conn); + if (entry == NULL) + return 0; /* error msg already set */ + /* Send the query message(s) */ - if (conn->pipelineStatus == PQ_PIPELINE_OFF) + /* construct the outgoing Query message */ + if (pqPutMsgStart('Q', conn) < 0 || + pqPuts(query, conn) < 0 || + pqPutMsgEnd(conn) < 0) { - /* construct the outgoing Query message */ - if (pqPutMsgStart('Q', conn) < 0 || - pqPuts(query, conn) < 0 || - pqPutMsgEnd(conn) < 0) - { - /* error message should be set up already */ - pqRecycleCmdQueueEntry(conn, entry); - return 0; - } - - /* remember we are using simple query protocol */ - entry->queryclass = PGQUERY_SIMPLE; - /* and remember the query text too, if possible */ - entry->query = strdup(query); + /* error message should be set up already */ + pqRecycleCmdQueueEntry(conn, entry); + return 0; } - else - { - /* - * In pipeline mode we cannot use the simple protocol, so we send - * Parse, Bind, Describe Portal, Execute, Close Portal (with the - * unnamed portal). - */ - if (pqPutMsgStart('P', conn) < 0 || - pqPuts("", conn) < 0 || - pqPuts(query, conn) < 0 || - pqPutInt(0, 2, conn) < 0 || - pqPutMsgEnd(conn) < 0) - goto sendFailed; - if (pqPutMsgStart('B', conn) < 0 || - pqPuts("", conn) < 0 || - pqPuts("", conn) < 0 || - pqPutInt(0, 2, conn) < 0 || - pqPutInt(0, 2, conn) < 0 || - pqPutInt(0, 2, conn) < 0 || - pqPutMsgEnd(conn) < 0) - goto sendFailed; - if (pqPutMsgStart('D', conn) < 0 || - pqPutc('P', conn) < 0 || - pqPuts("", conn) < 0 || - pqPutMsgEnd(conn) < 0) - goto sendFailed; - if (pqPutMsgStart('E', conn) < 0 || - pqPuts("", conn) < 0 || - pqPutInt(0, 4, conn) < 0 || - pqPutMsgEnd(conn) < 0) - goto sendFailed; - if (pqPutMsgStart('C', conn) < 0 || - pqPutc('P', conn) < 0 || - pqPuts("", conn) < 0 || - pqPutMsgEnd(conn) < 0) - goto sendFailed; - entry->queryclass = PGQUERY_EXTENDED; - entry->query = strdup(query); - } + /* remember we are using simple query protocol */ + entry->queryclass = PGQUERY_SIMPLE; + /* and remember the query text too, if possible */ + entry->query = strdup(query); /* * Give the data a push. In nonblock mode, don't complain if we're unable * to send it all; PQgetResult() will do any additional flushing needed. */ - if (pqPipelineFlush(conn) < 0) + if (pqFlush(conn) < 0) goto sendFailed; /* OK, it's launched! */ pqAppendCmdQueueEntry(conn, entry); - /* - * When pipeline mode is in use, we need a second entry in the command - * queue to represent Close Portal message. This allows us later to wait - * for the CloseComplete message to be received before getting in IDLE - * state. - */ - if (conn->pipelineStatus != PQ_PIPELINE_OFF) - { - entry2->queryclass = PGQUERY_CLOSE; - entry2->query = NULL; - pqAppendCmdQueueEntry(conn, entry2); - } - return 1; sendFailed: pqRecycleCmdQueueEntry(conn, entry); - pqRecycleCmdQueueEntry(conn, entry2); /* error message should be set up already */ return 0; } @@ -1652,10 +1696,12 @@ 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. + * However, in pipeline mode with something already queued, the error + * buffer belongs to that command and we shouldn't clear it. */ - if (newQuery) - resetPQExpBuffer(&conn->errorMessage); + if (newQuery && conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); /* Don't try to send if we know there's no live connection. */ if (conn->status != CONNECTION_OK) @@ -1715,8 +1761,8 @@ PQsendQueryStart(PGconn *conn, bool newQuery) /* reset single-row processing mode */ conn->singleRowMode = false; - } + /* ready to send command message */ return true; } @@ -1912,7 +1958,7 @@ PQsetSingleRowMode(PGconn *conn) (conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE && conn->cmd_queue_head->queryclass != PGQUERY_EXTENDED)) return 0; - if (conn->result) + if (pgHavePendingResult(conn)) return 0; /* OK, set flag */ @@ -2043,10 +2089,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); @@ -2078,30 +2121,21 @@ 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, if any, when we're called next. If there's - * no next element in the command queue, this gets us in IDLE - * state. + * results from the current query; prepare to send the results of + * the next query, if any, when we're called next. If there's no + * next element in the command queue, this gets us in IDLE state. */ - resetPQExpBuffer(&conn->errorMessage); pqPipelineProcessQueue(conn); res = NULL; /* query is complete */ break; case PGASYNC_READY: - - /* - * For any query type other than simple query protocol, we advance - * the command queue here. This is because for simple query - * protocol we can get the READY state multiple times before the - * command is actually complete, since the command string can - * contain many queries. In simple query protocol, the queue - * advance is done by fe-protocol3 when it receives ReadyForQuery. - */ - if (conn->cmd_queue_head && - conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE) - pqCommandQueueAdvance(conn); res = pqPrepareAsyncResult(conn); + + /* Advance the queue as appropriate */ + pqCommandQueueAdvance(conn, false, + res->resultStatus == PGRES_PIPELINE_SYNC); + if (conn->pipelineStatus != PQ_PIPELINE_OFF) { /* @@ -2121,7 +2155,7 @@ PQgetResult(PGconn *conn) * (In other words: we don't return a NULL after a pipeline * sync.) */ - if (res && res->resultStatus == PGRES_PIPELINE_SYNC) + if (res->resultStatus == PGRES_PIPELINE_SYNC) pqPipelineProcessQueue(conn); } else @@ -2148,49 +2182,15 @@ 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; } - /* If the next command we expect is CLOSE, read and consume it */ - if (conn->asyncStatus == PGASYNC_PIPELINE_IDLE && - conn->cmd_queue_head && - conn->cmd_queue_head->queryclass == PGQUERY_CLOSE) - { - if (res && res->resultStatus != PGRES_FATAL_ERROR) - { - conn->asyncStatus = PGASYNC_BUSY; - parseInput(conn); - conn->asyncStatus = PGASYNC_PIPELINE_IDLE; - } - else - /* we won't ever see the Close */ - pqCommandQueueAdvance(conn); - } - - 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; } @@ -2327,6 +2327,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, @@ -2334,11 +2342,6 @@ PQexecStart(PGconn *conn) return false; } - /* - * Since this is the beginning of a query cycle, reset the error buffer. - */ - resetPQExpBuffer(&conn->errorMessage); - /* * Silently discard any prior query result that application didn't eat. * This is probably poor design, but it's here for backward compatibility. @@ -2892,19 +2895,23 @@ 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. + * However, in pipeline mode with something already queued, the error + * buffer belongs to that command and we shouldn't clear it. */ - resetPQExpBuffer(&conn->errorMessage); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); if (conn->pipelineStatus != PQ_PIPELINE_OFF) { - appendPQExpBufferStr(&conn->errorMessage, - libpq_gettext("PQfn not allowed in pipeline mode\n")); + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("%s not allowed in pipeline mode\n"), + "PQfn"); return NULL; } if (conn->sock == PGINVALID_SOCKET || conn->asyncStatus != PGASYNC_IDLE || - conn->result != NULL) + pgHavePendingResult(conn)) { appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("connection in wrong state\n")); @@ -3027,18 +3034,44 @@ PQexitPipelineMode(PGconn *conn) /* * pqCommandQueueAdvance - * Remove one query from the command queue, when we receive - * all results from the server that pertain to it. + * Remove one query from the command queue, if appropriate. + * + * If we have received all results corresponding to the head element + * in the command queue, remove it. + * + * In simple query protocol we must not advance the command queue until the + * ReadyForQuery message has been received. This is because in simple mode a + * command can have multiple queries, and we must process result for all of + * them before moving on to the next command. + * + * Another consideration is synchronization during error processing in + * extended query protocol: we refuse to advance the queue past a SYNC queue + * element, unless the result we've received is also a SYNC. In particular + * this protects us from advancing when an error is received at an + * inappropriate moment. */ void -pqCommandQueueAdvance(PGconn *conn) +pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, bool gotSync) { PGcmdQueueEntry *prevquery; if (conn->cmd_queue_head == NULL) return; - /* delink from queue */ + /* + * If processing a query of simple query protocol, we only advance the + * queue when we receive the ReadyForQuery message for it. + */ + if (conn->cmd_queue_head->queryclass == PGQUERY_SIMPLE && !isReadyForQuery) + return; + + /* + * If we're waiting for a SYNC, don't advance the queue until we get one. + */ + if (conn->cmd_queue_head->queryclass == PGQUERY_SYNC && !gotSync) + return; + + /* delink element from queue */ prevquery = conn->cmd_queue_head; conn->cmd_queue_head = conn->cmd_queue_head->next; @@ -3046,7 +3079,7 @@ pqCommandQueueAdvance(PGconn *conn) if (conn->cmd_queue_head == NULL) conn->cmd_queue_tail = NULL; - /* and make it recyclable */ + /* and make the queue element recyclable */ prevquery->next = NULL; pqRecycleCmdQueueEntry(conn, prevquery); } @@ -3070,6 +3103,7 @@ pqPipelineProcessQueue(PGconn *conn) return; case PGASYNC_IDLE: + /* * If we're in IDLE mode and there's some command in the queue, * get us into PIPELINE_IDLE mode and process normally. Otherwise @@ -3104,6 +3138,12 @@ pqPipelineProcessQueue(PGconn *conn) 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); @@ -3252,6 +3292,14 @@ PQsendFlushRequest(PGconn *conn) return 0; } + /* + * Give the data a push (in pipeline mode, only if we're past the size + * threshold). In nonblock mode, don't complain if we're unable to send + * it all; PQgetResult() will do any additional flushing needed. + */ + if (pqPipelineFlush(conn) < 0) + return 0; + return 1; } @@ -3662,9 +3710,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 */ @@ -3691,7 +3739,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) @@ -3809,9 +3858,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 errorMessage 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. */ - resetPQExpBuffer(&conn->errorMessage); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); /* if we are going from blocking to non-blocking flush here */ if (pqFlush(conn)) @@ -4007,7 +4058,8 @@ PQescapeStringConn(PGconn *conn, return 0; } - resetPQExpBuffer(&conn->errorMessage); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); return PQescapeStringInternal(conn, to, from, length, error, conn->client_encoding, @@ -4045,7 +4097,8 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) if (!conn) return NULL; - resetPQExpBuffer(&conn->errorMessage); + 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) @@ -4310,7 +4363,8 @@ PQescapeByteaConn(PGconn *conn, if (!conn) return NULL; - resetPQExpBuffer(&conn->errorMessage); + if (conn->cmd_queue_head == NULL) + pqClearConnErrorState(conn); return PQescapeByteaInternal(conn, from, from_length, to_length, conn->std_strings, diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.c b/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.c index 9e8aeae1..fa08526e 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.c @@ -3,7 +3,7 @@ * fe-gssapi-common.c * The front-end (client) GSSAPI common code * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.h b/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.h index 47766066..72ee9728 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.h +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-gssapi-common.h @@ -4,7 +4,7 @@ * * Definitions for GSSAPI common routines * - * 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 * * src/interfaces/libpq/fe-gssapi-common.h diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-lobj.c b/third_party/spanner_pg/src/interfaces/libpq/fe-lobj.c index ffd9926d..075a5ed8 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-lobj.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-lobj.c @@ -3,7 +3,7 @@ * fe-lobj.c * Front-end large object interface * - * 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 * * @@ -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/third_party/spanner_pg/src/interfaces/libpq/fe-misc.c b/third_party/spanner_pg/src/interfaces/libpq/fe-misc.c index fc0ec03c..d76bb395 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-misc.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-misc.c @@ -19,7 +19,7 @@ * routines. * * - * 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 * * IDENTIFICATION @@ -777,19 +777,19 @@ pqReadData(PGconn *conn) * (putting it in conn->inBuffer) in any situation where we can't send * all the specified data immediately. * - * Upon write failure, conn->write_failed is set and the error message is - * saved in conn->write_err_msg, but we clear the output buffer and return - * zero anyway; this is because callers should soldier on until it's possible - * to read from the server and check for an error message. write_err_msg - * should be reported only when we are unable to obtain a server error first. - * (Thus, a -1 result is returned only for an internal *read* failure.) + * If a socket-level write failure occurs, conn->write_failed is set and the + * error message is saved in conn->write_err_msg, but we clear the output + * buffer and return zero anyway; this is because callers should soldier on + * until we have read what we can from the server and checked for an error + * message. write_err_msg should be reported only when we are unable to + * obtain a server error first. Much of that behavior is implemented at + * lower levels, but this function deals with some edge cases. */ static int pqSendSome(PGconn *conn, int len) { char *ptr = conn->outBuffer; int remaining = conn->outCount; - int oldmsglen = conn->errorMessage.len; int result = 0; /* @@ -817,7 +817,7 @@ pqSendSome(PGconn *conn, int len) if (conn->sock == PGINVALID_SOCKET) { conn->write_failed = true; - /* Insert error message into conn->write_err_msg, if possible */ + /* Store error message in conn->write_err_msg, if possible */ /* (strdup failure is OK, we'll cope later) */ conn->write_err_msg = strdup(libpq_gettext("connection not open\n")); /* Discard queued data; no chance it'll ever be sent */ @@ -859,24 +859,6 @@ pqSendSome(PGconn *conn, int len) continue; default: - /* pqsecure_write set the error message for us */ - conn->write_failed = true; - - /* - * Transfer error message to conn->write_err_msg, if - * possible (strdup failure is OK, we'll cope later). - * - * We only want to transfer whatever has been appended to - * conn->errorMessage since we entered this routine. - */ - if (!PQExpBufferBroken(&conn->errorMessage)) - { - conn->write_err_msg = strdup(conn->errorMessage.data + - oldmsglen); - conn->errorMessage.len = oldmsglen; - conn->errorMessage.data[oldmsglen] = '\0'; - } - /* Discard queued data; no chance it'll ever be sent */ conn->outCount = 0; @@ -886,7 +868,18 @@ pqSendSome(PGconn *conn, int len) if (pqReadData(conn) < 0) return -1; } - return 0; + + /* + * Lower-level code should already have filled + * conn->write_err_msg (and set conn->write_failed) or + * conn->errorMessage. In the former case, we pretend + * there's no problem; the write_failed condition will be + * dealt with later. Otherwise, report the error now. + */ + if (conn->write_failed) + return 0; + else + return -1; } } else diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-print.c b/third_party/spanner_pg/src/interfaces/libpq/fe-print.c index 09bbc668..82fc592f 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-print.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-print.c @@ -3,7 +3,7 @@ * fe-print.c * functions for pretty-printing query results * - * 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 * * These functions were formerly part of fe-exec.c, but they diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-protocol3.c b/third_party/spanner_pg/src/interfaces/libpq/fe-protocol3.c index c33f904d..3870d520 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-protocol3.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-protocol3.c @@ -3,7 +3,7 @@ * fe-protocol3.c * functions that are specific to frontend/backend protocol version 3 * - * 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 * * @@ -197,7 +197,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); @@ -240,18 +240,13 @@ pqParseInput3(PGconn *conn) } else { - /* - * In simple query protocol, advance the command queue - * (see PQgetResult). - */ - if (conn->cmd_queue_head && - conn->cmd_queue_head->queryclass == PGQUERY_SIMPLE) - pqCommandQueueAdvance(conn); + /* Advance the command queue and set us idle */ + pqCommandQueueAdvance(conn, true, false); conn->asyncStatus = PGASYNC_IDLE; } break; case 'I': /* empty query */ - if (conn->result == NULL) + if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, PGRES_EMPTY_QUERY); @@ -269,7 +264,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); @@ -284,24 +279,8 @@ pqParseInput3(PGconn *conn) } break; case '2': /* Bind Complete */ - /* Nothing to do for this message type */ - break; case '3': /* Close Complete */ - /* - * If we get CloseComplete when waiting for it, consume - * the queue element and keep going. A result is not - * expected from this message; it is just there so that - * we know to wait for it when PQsendQuery is used in - * pipeline mode, before going in IDLE state. Failing to - * do this makes us receive CloseComplete when IDLE, which - * creates problems. - */ - if (conn->cmd_queue_head && - conn->cmd_queue_head->queryclass == PGQUERY_CLOSE) - { - pqCommandQueueAdvance(conn); - } - + /* Nothing to do for these message types */ break; case 'S': /* parameter status */ if (getParameterStatus(conn)) @@ -320,8 +299,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 @@ -365,7 +345,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); @@ -391,8 +371,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 @@ -970,10 +951,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")); @@ -2120,10 +2109,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 (!pgHavePendingResult(conn)) + { + 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/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.c b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.c index afa5d133..8046fcd8 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.c @@ -8,7 +8,7 @@ * file contains support routines that are used by the library-specific * implementations such as fe-secure-openssl.c. * - * 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 * * IDENTIFICATION @@ -19,6 +19,8 @@ #include "postgres_fe.h" +#include + #include "fe-secure-common.h" #include "libpq-int.h" @@ -144,6 +146,109 @@ 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/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.h b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.h index 2389f671..d18db713 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.h +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-common.h @@ -4,7 +4,7 @@ * * common implementation-independent SSL support code * - * 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 * * IDENTIFICATION @@ -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/third_party/spanner_pg/src/interfaces/libpq/fe-secure-gssapi.c b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-gssapi.c index 854468cd..a3768cd7 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-secure-gssapi.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-gssapi.c @@ -3,7 +3,7 @@ * fe-secure-gssapi.c * The front-end (client) encryption support for GSSAPI * - * Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/interfaces/libpq/fe-secure-gssapi.c @@ -79,8 +79,8 @@ * On success, returns the number of data bytes consumed (possibly less than * len). On failure, returns -1 with errno set appropriately. If the errno * indicates a non-retryable error, a message is added to conn->errorMessage. - * For retryable errors, caller should call again (passing the same data) - * once the socket is ready. + * For retryable errors, caller should call again (passing the same or more + * data) once the socket is ready. */ ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len) @@ -90,19 +90,25 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) gss_buffer_desc input, output = GSS_C_EMPTY_BUFFER; ssize_t ret = -1; - size_t bytes_sent = 0; size_t bytes_to_encrypt; size_t bytes_encrypted; gss_ctx_id_t gctx = conn->gctx; /* - * When we get a failure, we must not tell the caller we have successfully - * transmitted everything, else it won't retry. Hence a "success" - * (positive) return value must only count source bytes corresponding to - * fully-transmitted encrypted packets. The amount of source data - * corresponding to the current partly-transmitted packet is remembered in + * When we get a retryable failure, we must not tell the caller we have + * successfully transmitted everything, else it won't retry. For + * simplicity, we claim we haven't transmitted anything until we have + * successfully transmitted all "len" bytes. Between calls, the amount of + * the current input data that's already been encrypted and placed into + * PqGSSSendBuffer (and perhaps transmitted) is remembered in * PqGSSSendConsumed. On a retry, the caller *must* be sending that data * again, so if it offers a len less than that, something is wrong. + * + * Note: it may seem attractive to report partial write completion once + * we've successfully sent any encrypted packets. However, that can cause + * problems for callers; notably, pqPutMsgEnd's heuristic to send only + * full 8K blocks interacts badly with such a hack. We won't save much, + * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) { @@ -135,38 +141,25 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) */ if (PqGSSSendLength) { - ssize_t ret; + ssize_t retval; ssize_t amount = PqGSSSendLength - PqGSSSendNext; - ret = pqsecure_raw_write(conn, PqGSSSendBuffer + PqGSSSendNext, amount); - if (ret <= 0) - { - /* - * Report any previously-sent data; if there was none, reflect - * the pqsecure_raw_write result up to our caller. When there - * was some, we're effectively assuming that any interesting - * failure condition will recur on the next try. - */ - if (bytes_sent) - return bytes_sent; - return ret; - } + retval = pqsecure_raw_write(conn, PqGSSSendBuffer + PqGSSSendNext, amount); + if (retval <= 0) + return retval; /* * Check if this was a partial write, and if so, move forward that * far in our buffer and try again. */ - if (ret != amount) + if (retval < amount) { - PqGSSSendNext += ret; + PqGSSSendNext += retval; continue; } - /* We've successfully sent whatever data was in that packet. */ - bytes_sent += PqGSSSendConsumed; - - /* All encrypted data was sent, our buffer is empty now. */ - PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + /* We've successfully sent whatever data was in the buffer. */ + PqGSSSendLength = PqGSSSendNext = 0; } /* @@ -192,7 +185,7 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) /* * Create the next encrypted packet. Any failure here is considered a - * hard failure, so we return -1 even if bytes_sent > 0. + * hard failure, so we return -1 even if some data has been sent. */ major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT, &input, &conf_state, &output); @@ -238,10 +231,13 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) } /* If we get here, our counters should all match up. */ - Assert(bytes_sent == len); - Assert(bytes_sent == bytes_encrypted); + Assert(len == PqGSSSendConsumed); + Assert(len == bytes_encrypted); + + /* We're reporting all the data as sent, so reset PqGSSSendConsumed. */ + PqGSSSendConsumed = 0; - ret = bytes_sent; + ret = bytes_encrypted; cleanup: /* Release GSSAPI buffer storage, if we didn't already */ diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-secure-openssl.c b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-openssl.c index 7f27767d..61f37678 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-secure-openssl.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-secure-openssl.c @@ -4,7 +4,7 @@ * OpenSSL support * * - * 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 * * @@ -30,7 +30,6 @@ #include "fe-auth.h" #include "fe-secure-common.h" #include "libpq-int.h" -#include "common/openssl.h" #ifdef WIN32 #include "win32.h" @@ -55,17 +54,27 @@ #endif #endif -#include +/* + * These SSL-related #includes must come after all system-provided headers. + * This ensures that OpenSSL can take care of conflicts with Windows' + * by #undef'ing the conflicting macros. (We don't directly + * include , but some other Windows headers do.) + */ +#include "common/openssl.h" #include #ifdef USE_SSL_ENGINE #include #endif #include + 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 *); @@ -200,7 +209,7 @@ pgtls_read(PGconn *conn, void *ptr, size_t len) */ goto rloop; case SSL_ERROR_SYSCALL: - if (n < 0) + if (n < 0 && SOCK_ERRNO != 0) { result_errno = SOCK_ERRNO; if (result_errno == EPIPE || @@ -308,7 +317,13 @@ pgtls_write(PGconn *conn, const void *ptr, size_t len) n = 0; break; case SSL_ERROR_SYSCALL: - if (n < 0) + + /* + * If errno is still zero then assume it's a read EOF situation, + * and report EOF. (This seems possible because SSL_write can + * also do reads.) + */ + if (n < 0 && SOCK_ERRNO != 0) { result_errno = SOCK_ERRNO; if (result_errno == EPIPE || result_errno == ECONNRESET) @@ -508,6 +523,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. * @@ -521,6 +586,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, @@ -536,38 +631,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; @@ -580,10 +699,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); + } } } } @@ -616,15 +745,20 @@ static pthread_mutex_t *pq_lockarray; static void pq_lockingcallback(int mode, int n, const char *file, int line) { + /* + * There's no way to report a mutex-primitive failure, so we just Assert + * in development builds, and ignore any errors otherwise. Fortunately + * this is all obsolete in modern OpenSSL. + */ if (mode & CRYPTO_LOCK) { if (pthread_mutex_lock(&pq_lockarray[n])) - PGTHREAD_ERROR("failed to lock mutex"); + Assert(false); } else { if (pthread_mutex_unlock(&pq_lockarray[n])) - PGTHREAD_ERROR("failed to unlock mutex"); + Assert(false); } } #endif /* ENABLE_THREAD_SAFETY && HAVE_CRYPTO_LOCK */ @@ -1229,9 +1363,14 @@ initialize_SSL(PGconn *conn) if (stat(fnbuf, &buf) != 0) { - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("certificate present, but not private key file \"%s\"\n"), - fnbuf); + if (errno == ENOENT) + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("certificate present, but not private key file \"%s\"\n"), + fnbuf); + else + appendPQExpBuffer(&conn->errorMessage, + libpq_gettext("could not stat private key file \"%s\": %m\n"), + fnbuf); return -1; } @@ -1304,7 +1443,6 @@ initialize_SSL(PGconn *conn) } SSLerrfree(err); - } } @@ -1347,10 +1485,12 @@ open_client_SSL(PGconn *conn) { int r; + SOCK_ERRNO_SET(0); ERR_clear_error(); r = SSL_connect(conn->ssl); if (r <= 0) { + int save_errno = SOCK_ERRNO; int err = SSL_get_error(conn->ssl, r); unsigned long ecode; @@ -1367,10 +1507,10 @@ open_client_SSL(PGconn *conn) { char sebuf[PG_STRERROR_R_BUFLEN]; - if (r == -1) + if (r == -1 && save_errno != 0) appendPQExpBuffer(&conn->errorMessage, libpq_gettext("SSL SYSCALL error: %s\n"), - SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); + SOCK_STRERROR(save_errno, sebuf, sizeof(sebuf))); else appendPQExpBufferStr(&conn->errorMessage, libpq_gettext("SSL SYSCALL error: EOF detected\n")); @@ -1621,7 +1761,14 @@ const char * PQsslAttribute(PGconn *conn, const char *attribute_name) { if (!conn) + { + /* PQsslAttribute(NULL, "library") reports the default SSL library */ + if (strcmp(attribute_name, "library") == 0) + return "OpenSSL"; return NULL; + } + + /* All attributes read as NULL for a non-encrypted connection */ if (conn->ssl == NULL) return NULL; @@ -1661,11 +1808,7 @@ PQsslAttribute(PGconn *conn, const char *attribute_name) * to retry; do we need to adopt their logic for that? */ -#ifndef HAVE_BIO_GET_DATA -#define BIO_get_data(bio) (bio->ptr) -#define BIO_set_data(bio, data) (bio->ptr = data) -#endif - +/* protected by ssl_config_mutex */ static BIO_METHOD *my_bio_methods; static int @@ -1673,7 +1816,7 @@ my_sock_read(BIO *h, char *buf, int size) { int res; - res = pqsecure_raw_read((PGconn *) BIO_get_data(h), buf, size); + res = pqsecure_raw_read((PGconn *) BIO_get_app_data(h), buf, size); BIO_clear_retry_flags(h); if (res < 0) { @@ -1703,7 +1846,7 @@ my_sock_write(BIO *h, const char *buf, int size) { int res; - res = pqsecure_raw_write((PGconn *) BIO_get_data(h), buf, size); + res = pqsecure_raw_write((PGconn *) BIO_get_app_data(h), buf, size); BIO_clear_retry_flags(h); if (res < 0) { @@ -1731,6 +1874,15 @@ my_sock_write(BIO *h, const char *buf, int size) static BIO_METHOD * my_BIO_s_socket(void) { + BIO_METHOD *res; + +#ifdef ENABLE_THREAD_SAFETY + if (pthread_mutex_lock(&ssl_config_mutex)) + return NULL; +#endif + + res = my_bio_methods; + if (!my_bio_methods) { BIO_METHOD *biom = (BIO_METHOD *) BIO_s_socket(); @@ -1739,39 +1891,58 @@ my_BIO_s_socket(void) my_bio_index = BIO_get_new_index(); if (my_bio_index == -1) - return NULL; + goto err; my_bio_index |= (BIO_TYPE_DESCRIPTOR | BIO_TYPE_SOURCE_SINK); - my_bio_methods = BIO_meth_new(my_bio_index, "libpq socket"); - if (!my_bio_methods) - return NULL; + res = BIO_meth_new(my_bio_index, "libpq socket"); + if (!res) + goto err; /* * As of this writing, these functions never fail. But check anyway, * like OpenSSL's own examples do. */ - if (!BIO_meth_set_write(my_bio_methods, my_sock_write) || - !BIO_meth_set_read(my_bio_methods, my_sock_read) || - !BIO_meth_set_gets(my_bio_methods, BIO_meth_get_gets(biom)) || - !BIO_meth_set_puts(my_bio_methods, BIO_meth_get_puts(biom)) || - !BIO_meth_set_ctrl(my_bio_methods, BIO_meth_get_ctrl(biom)) || - !BIO_meth_set_create(my_bio_methods, BIO_meth_get_create(biom)) || - !BIO_meth_set_destroy(my_bio_methods, BIO_meth_get_destroy(biom)) || - !BIO_meth_set_callback_ctrl(my_bio_methods, BIO_meth_get_callback_ctrl(biom))) + if (!BIO_meth_set_write(res, my_sock_write) || + !BIO_meth_set_read(res, my_sock_read) || + !BIO_meth_set_gets(res, BIO_meth_get_gets(biom)) || + !BIO_meth_set_puts(res, BIO_meth_get_puts(biom)) || + !BIO_meth_set_ctrl(res, BIO_meth_get_ctrl(biom)) || + !BIO_meth_set_create(res, BIO_meth_get_create(biom)) || + !BIO_meth_set_destroy(res, BIO_meth_get_destroy(biom)) || + !BIO_meth_set_callback_ctrl(res, BIO_meth_get_callback_ctrl(biom))) { - BIO_meth_free(my_bio_methods); - my_bio_methods = NULL; - return NULL; + goto err; } #else - my_bio_methods = malloc(sizeof(BIO_METHOD)); - if (!my_bio_methods) - return NULL; - memcpy(my_bio_methods, biom, sizeof(BIO_METHOD)); - my_bio_methods->bread = my_sock_read; - my_bio_methods->bwrite = my_sock_write; + res = malloc(sizeof(BIO_METHOD)); + if (!res) + goto err; + memcpy(res, biom, sizeof(BIO_METHOD)); + res->bread = my_sock_read; + res->bwrite = my_sock_write; #endif } - return my_bio_methods; + + my_bio_methods = res; + +#ifdef ENABLE_THREAD_SAFETY + pthread_mutex_unlock(&ssl_config_mutex); +#endif + + return res; + +err: +#ifdef HAVE_BIO_METH_NEW + if (res) + BIO_meth_free(res); +#else + if (res) + free(res); +#endif + +#ifdef ENABLE_THREAD_SAFETY + pthread_mutex_unlock(&ssl_config_mutex); +#endif + return NULL; } /* This should exactly match OpenSSL's SSL_set_fd except for using my BIO */ @@ -1794,7 +1965,7 @@ my_SSL_set_fd(PGconn *conn, int fd) SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } - BIO_set_data(bio, conn); + BIO_set_app_data(bio, conn); SSL_set_bio(conn->ssl, bio, bio); BIO_set_fd(bio, fd, BIO_NOCLOSE); diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-secure.c b/third_party/spanner_pg/src/interfaces/libpq/fe-secure.c index b15d8d13..4c85b729 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-secure.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-secure.c @@ -6,7 +6,7 @@ * message integrity and endpoint authentication. * * - * 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 * * @@ -235,6 +235,8 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) int result_errno = 0; char sebuf[PG_STRERROR_R_BUFLEN]; + SOCK_ERRNO_SET(0); + n = recv(conn->sock, ptr, len, 0); if (n < 0) @@ -262,6 +264,11 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) "\tbefore or while processing the request.\n")); break; + case 0: + /* If errno didn't get set, treat it as regular EOF */ + n = 0; + break; + default: appendPQExpBuffer(&conn->errorMessage, libpq_gettext("could not receive data from server: %s\n"), @@ -280,9 +287,22 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) /* * Write data to a secure connection. * - * On failure, this function is responsible for appending a suitable message - * to conn->errorMessage. The caller must still inspect errno, but only - * to determine whether to continue/retry after error. + * Returns the number of bytes written, or a negative value (with errno + * set) upon failure. The write count could be less than requested. + * + * Note that socket-level hard failures are masked from the caller, + * instead setting conn->write_failed and storing an error message + * in conn->write_err_msg; see pqsecure_raw_write. This allows us to + * postpone reporting of write failures until we're sure no error + * message is available from the server. + * + * However, errors detected in the SSL or GSS management level are reported + * via a negative result, with message appended to conn->errorMessage. + * It's frequently unclear whether such errors should be considered read or + * write errors, so we don't attempt to postpone reporting them. + * + * The caller must still inspect errno upon failure, but only to determine + * whether to continue/retry; a message has been saved someplace in any case. */ ssize_t pqsecure_write(PGconn *conn, const void *ptr, size_t len) @@ -310,16 +330,50 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len) return n; } +/* + * Low-level implementation of pqsecure_write. + * + * This is used directly for an unencrypted connection. For encrypted + * connections, this does the physical I/O on behalf of pgtls_write or + * pg_GSS_write. + * + * This function reports failure (i.e., returns a negative result) only + * for retryable errors such as EINTR. Looping for such cases is to be + * handled at some outer level, maybe all the way up to the application. + * For hard failures, we set conn->write_failed and store an error message + * in conn->write_err_msg, but then claim to have written the data anyway. + * This is because we don't want to report write failures so long as there + * is a possibility of reading from the server and getting an error message + * that could explain why the connection dropped. Many TCP stacks have + * race conditions such that a write failure may or may not be reported + * before all incoming data has been read. + * + * Note that this error behavior happens below the SSL management level when + * we are using SSL. That's because at least some versions of OpenSSL are + * too quick to report a write failure when there's still a possibility to + * get a more useful error from the server. + */ ssize_t pqsecure_raw_write(PGconn *conn, const void *ptr, size_t len) { ssize_t n; int flags = 0; int result_errno = 0; + char msgbuf[1024]; char sebuf[PG_STRERROR_R_BUFLEN]; DECLARE_SIGPIPE_INFO(spinfo); + /* + * If we already had a write failure, we will never again try to send data + * on that connection. Even if the kernel would let us, we've probably + * lost message boundary sync with the server. conn->write_failed + * therefore persists until the connection is reset, and we just discard + * all data presented to be written. + */ + if (conn->write_failed) + return len; + #ifdef MSG_NOSIGNAL if (conn->sigpipe_flag) flags |= MSG_NOSIGNAL; @@ -369,17 +423,29 @@ pqsecure_raw_write(PGconn *conn, const void *ptr, size_t len) /* FALL THRU */ case ECONNRESET: - appendPQExpBufferStr(&conn->errorMessage, - libpq_gettext("server closed the connection unexpectedly\n" - "\tThis probably means the server terminated abnormally\n" - "\tbefore or while processing the request.\n")); + conn->write_failed = true; + /* Store error message in conn->write_err_msg, if possible */ + /* (strdup failure is OK, we'll cope later) */ + snprintf(msgbuf, sizeof(msgbuf), + libpq_gettext("server closed the connection unexpectedly\n" + "\tThis probably means the server terminated abnormally\n" + "\tbefore or while processing the request.\n")); + conn->write_err_msg = strdup(msgbuf); + /* Now claim the write succeeded */ + n = len; break; default: - appendPQExpBuffer(&conn->errorMessage, - libpq_gettext("could not send data to server: %s\n"), - SOCK_STRERROR(result_errno, - sebuf, sizeof(sebuf))); + conn->write_failed = true; + /* Store error message in conn->write_err_msg, if possible */ + /* (strdup failure is OK, we'll cope later) */ + snprintf(msgbuf, sizeof(msgbuf), + libpq_gettext("could not send data to server: %s\n"), + SOCK_STRERROR(result_errno, + sebuf, sizeof(sebuf))); + conn->write_err_msg = strdup(msgbuf); + /* Now claim the write succeeded */ + n = len; break; } } diff --git a/third_party/spanner_pg/src/interfaces/libpq/fe-trace.c b/third_party/spanner_pg/src/interfaces/libpq/fe-trace.c index 8660d279..5d68cf2e 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/fe-trace.c +++ b/third_party/spanner_pg/src/interfaces/libpq/fe-trace.c @@ -3,7 +3,7 @@ * fe-trace.c * functions for libpq protocol tracing * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/interfaces/libpq/legacy-pqsignal.c b/third_party/spanner_pg/src/interfaces/libpq/legacy-pqsignal.c index 37fa9e58..db470df9 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/legacy-pqsignal.c +++ b/third_party/spanner_pg/src/interfaces/libpq/legacy-pqsignal.c @@ -4,7 +4,7 @@ * reliable BSD-style signal(2) routine stolen from RWW who stole it * from Stevens... * - * 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/third_party/spanner_pg/src/interfaces/libpq/libpq-events.c b/third_party/spanner_pg/src/interfaces/libpq/libpq-events.c index 8e244899..1ec86b1d 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/libpq-events.c +++ b/third_party/spanner_pg/src/interfaces/libpq/libpq-events.c @@ -3,7 +3,7 @@ * libpq-events.c * functions for supporting the libpq "events" API * - * 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 * * @@ -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; } diff --git a/third_party/spanner_pg/src/interfaces/libpq/libpq-events.h b/third_party/spanner_pg/src/interfaces/libpq/libpq-events.h index 30ed8517..d93b7c4d 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/libpq-events.h +++ b/third_party/spanner_pg/src/interfaces/libpq/libpq-events.h @@ -5,7 +5,7 @@ * that invoke the libpq "events" API, but are not interesting to * ordinary users of libpq. * - * 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 * * src/interfaces/libpq/libpq-events.h diff --git a/third_party/spanner_pg/src/interfaces/libpq/libpq-fe.h b/third_party/spanner_pg/src/interfaces/libpq/libpq-fe.h index a6fd69ac..7986445f 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/libpq-fe.h +++ b/third_party/spanner_pg/src/interfaces/libpq/libpq-fe.h @@ -4,7 +4,7 @@ * This file contains definitions for structures and * externs for functions used by frontend postgres applications. * - * 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 * * 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/third_party/spanner_pg/src/interfaces/libpq/libpq-int.h b/third_party/spanner_pg/src/interfaces/libpq/libpq-int.h index 913d4803..07318557 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/libpq-int.h +++ b/third_party/spanner_pg/src/interfaces/libpq/libpq-int.h @@ -9,7 +9,7 @@ * more likely to break across PostgreSQL releases than code that uses * only the official API. * - * 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 * * src/interfaces/libpq/libpq-int.h @@ -41,6 +41,7 @@ #include "getaddrinfo.h" #include "libpq/pqcomm.h" /* include stuff found in fe only */ +#include "fe-auth-sasl.h" #include "pqexpbuffer.h" #ifdef ENABLE_GSS @@ -497,11 +498,21 @@ 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 */ + const pg_fe_sasl_mech *sasl; void *sasl_state; /* SSL structures */ @@ -542,8 +553,8 @@ struct pg_conn int gss_SendLength; /* End of data available in gss_SendBuffer */ int gss_SendNext; /* Next index to send a byte from * gss_SendBuffer */ - int gss_SendConsumed; /* Number of *unencrypted* bytes consumed - * for current contents of gss_SendBuffer */ + int gss_SendConsumed; /* Number of source bytes encrypted but + * not yet reported as sent */ char *gss_RecvBuffer; /* Received, encrypted data */ int gss_RecvLength; /* End of data available in gss_RecvBuffer */ char *gss_ResultBuffer; /* Decryption of data in gss_RecvBuffer */ @@ -567,8 +578,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 */ @@ -583,6 +600,13 @@ struct pg_cancel SockAddr raddr; /* Remote address */ int be_pid; /* PID of backend --- needed for cancels */ int be_key; /* key of backend --- needed for cancels */ + int pgtcp_user_timeout; /* tcp user timeout */ + int keepalives; /* use TCP keepalives? */ + int keepalives_idle; /* time between TCP keepalives */ + int keepalives_interval; /* time between TCP keepalive + * retransmits */ + int keepalives_count; /* maximum number of TCP keepalive + * retransmits */ }; @@ -628,13 +652,6 @@ extern bool pqGetHomeDirectory(char *buf, int bufsize); #ifdef ENABLE_THREAD_SAFETY extern pgthreadlock_t pg_g_threadlock; -#define PGTHREAD_ERROR(msg) \ - do { \ - fprintf(stderr, "%s\n", msg); \ - abort(); \ - } while (0) - - #define pglock_thread() pg_g_threadlock(true) #define pgunlock_thread() pg_g_threadlock(false) #else @@ -644,7 +661,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); @@ -656,7 +673,8 @@ extern void pqSaveMessageField(PGresult *res, char code, extern void pqSaveParameterStatus(PGconn *conn, const char *name, const char *value); extern int pqRowProcessor(PGconn *conn, const char **errmsgp); -extern void pqCommandQueueAdvance(PGconn *conn); +extern void pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, + bool gotSync); extern int PQsendQueryContinue(PGconn *conn, const char *query); /* === in fe-protocol3.c === */ @@ -830,6 +848,21 @@ 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) + +/* + * 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 @@ -848,6 +881,11 @@ extern char *libpq_ngettext(const char *msgid, const char *msgid_plural, unsigne #define libpq_gettext(x) (x) #define libpq_ngettext(s, p, n) ((n) == 1 ? (s) : (p)) #endif +/* + * libpq code should use the above, not _(), since that would use the + * surrounding programs's message catalog. + */ +#undef _ /* * These macros are needed to let error-handling code be portable between diff --git a/third_party/spanner_pg/src/interfaces/libpq/nls.mk b/third_party/spanner_pg/src/interfaces/libpq/nls.mk index a7e54cd3..9fabc298 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/nls.mk +++ b/third_party/spanner_pg/src/interfaces/libpq/nls.mk @@ -1,6 +1,6 @@ # src/interfaces/libpq/nls.mk CATALOG_NAME = libpq -AVAIL_LANGUAGES = cs de el es fr ja ko ru sv uk zh_CN -GETTEXT_FILES = fe-auth.c fe-auth-scram.c fe-connect.c fe-exec.c fe-gssapi-common.c fe-lobj.c fe-misc.c fe-protocol3.c fe-secure.c fe-secure-common.c fe-secure-gssapi.c fe-secure-openssl.c win32.c +AVAIL_LANGUAGES = cs de el es fr it ja ka ko ru sv uk zh_CN +GETTEXT_FILES = fe-auth.c fe-auth-scram.c fe-connect.c fe-exec.c fe-gssapi-common.c fe-lobj.c fe-misc.c fe-protocol3.c fe-secure.c fe-secure-common.c fe-secure-gssapi.c fe-secure-openssl.c win32.c ../../port/thread.c GETTEXT_TRIGGERS = libpq_gettext pqInternalNotice:2 GETTEXT_FLAGS = libpq_gettext:1:pass-c-format pqInternalNotice:2:c-format diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/de.po b/third_party/spanner_pg/src/interfaces/libpq/po/de.po index 15461809..3853e088 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/de.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/de.po @@ -5,10 +5,10 @@ # 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: 2022-07-19 08:55+0000\n" -"PO-Revision-Date: 2022-04-01 11:08+0200\n" +"POT-Creation-Date: 2022-09-24 23:10+0000\n" +"PO-Revision-Date: 2022-09-25 10:37+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,98 +16,119 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: fe-auth-scram.c:213 +#: ../../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" + +#: 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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4711 fe-connect.c:4972 fe-connect.c:5091 fe-connect.c:5343 -#: fe-connect.c:5424 fe-connect.c:5523 fe-connect.c:5779 fe-connect.c:5808 -#: fe-connect.c:5880 fe-connect.c:5904 fe-connect.c:5922 fe-connect.c:6023 -#: fe-connect.c:6032 fe-connect.c:6390 fe-connect.c:6540 fe-connect.c:6806 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4082 fe-exec.c:4247 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "Speicher aufgebraucht" + +#: fe-auth-scram.c:943 +msgid "could not 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" @@ -117,7 +138,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: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 "Hostname muss angegeben werden\n" @@ -150,619 +172,608 @@ 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:2856 -#, 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:2861 -#, 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:1094 +#: fe-connect.c:1090 #, 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:1180 +#: fe-connect.c:1176 #, 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:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "ungültiger %s-Wert: »%s«\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, 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:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "ungültiges SSL-Protokollsintervall\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, 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:1653 +#: fe-connect.c:1649 #, 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:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "Verbindung zum Server auf Socket »%s« fehlgeschlagen: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "Verbindung zum Server auf »%s« (%s), Port %s fehlgeschlagen: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "Verbindung zum Server auf »%s«, Port %s fehlgeschlagen: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "\tLäuft der Server lokal und akzeptiert er Verbindungen auf diesem Socket?\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "\tLäuft der Server auf diesem Host und akzeptiert er TCP/IP-Verbindungen?\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, 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:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s) fehlgeschlagen: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "ungültiger Verbindungszustand, möglicherweise ein Speicherproblem\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "ungültige Portnummer: »%s«\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, 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:2418 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "konnte Netzwerkadresse »%s« nicht interpretieren: %s\n" -#: fe-connect.c:2431 +#: fe-connect.c:2438 #, 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:2446 +#: fe-connect.c:2453 #, 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:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "konnte Socket nicht erzeugen: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, 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:2613 +#: fe-connect.c:2620 #, 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:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "Parameter »keepalives« muss eine ganze Zahl sein\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "konnte Socket-Fehlerstatus nicht ermitteln: %s\n" -#: fe-connect.c:2800 +#: fe-connect.c:2807 #, 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:2842 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "Parameter »requirepeer« wird auf dieser Plattform nicht unterstützt\n" -#: fe-connect.c:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, 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:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "konnte Paket zur GSSAPI-Verhandlung nicht senden: %s\n" -#: fe-connect.c:2921 +#: 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-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:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "konnte Paket zur SSL-Verhandlung nicht senden: %s\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "konnte Startpaket nicht senden: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 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:3097 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "ungültige Antwort auf SSL-Verhandlungspaket empfangen: %c\n" -#: fe-connect.c:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "unverschlüsselte Daten nach SSL-Antwort empfangen\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 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:3211 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "ungültige Antwort auf GSSAPI-Verhandlungspaket empfangen: %c\n" -#: fe-connect.c:3230 +#: fe-connect.c:3226 msgid "received unencrypted data after GSSAPI encryption response\n" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsantwort empfangen\n" -#: fe-connect.c:3290 fe-connect.c:3315 +#: fe-connect.c:3286 fe-connect.c:3311 #, 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:3522 +#: fe-connect.c:3518 msgid "unexpected message from server during startup\n" msgstr "unerwartete Nachricht vom Server beim Start\n" -#: fe-connect.c:3614 +#: fe-connect.c:3610 msgid "session is read-only\n" msgstr "Sitzung ist read-only\n" -#: fe-connect.c:3617 +#: fe-connect.c:3613 msgid "session is not read-only\n" msgstr "Sitzung ist nicht read-only\n" -#: fe-connect.c:3671 +#: fe-connect.c:3667 msgid "server is in hot standby mode\n" msgstr "Server ist im Hot-Standby-Modus\n" -#: fe-connect.c:3674 +#: fe-connect.c:3670 msgid "server is not in hot standby mode\n" msgstr "Server ist nicht im Hot-Standby-Modus\n" -#: fe-connect.c:3792 fe-connect.c:3844 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format msgid "\"%s\" failed\n" msgstr "»%s« fehlgeschlagen\n" -#: fe-connect.c:3858 +#: fe-connect.c:3854 #, 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:4304 fe-connect.c:4364 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc »%s« während PGEVT_CONNRESET-Ereignis fehlgeschlagen\n" - -#: fe-connect.c:4724 +#: fe-connect.c:4837 #, 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:4739 +#: fe-connect.c:4852 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "ungültige LDAP-URL »%s«: Distinguished Name fehlt\n" -#: fe-connect.c:4751 fe-connect.c:4809 +#: fe-connect.c:4864 fe-connect.c:4922 #, 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:4763 fe-connect.c:4825 +#: fe-connect.c:4876 fe-connect.c:4938 #, 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:4775 +#: fe-connect.c:4888 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "ungültige LDAP-URL »%s«: kein Filter\n" -#: fe-connect.c:4797 +#: fe-connect.c:4910 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "ungültige LDAP-URL »%s«: ungültige Portnummer\n" -#: fe-connect.c:4835 +#: fe-connect.c:4948 msgid "could not create LDAP structure\n" msgstr "konnte LDAP-Struktur nicht erzeugen\n" -#: fe-connect.c:4911 +#: fe-connect.c:5024 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "Suche auf LDAP-Server fehlgeschlagen: %s\n" -#: fe-connect.c:4922 +#: fe-connect.c:5035 msgid "more than one entry found on LDAP lookup\n" msgstr "LDAP-Suche ergab mehr als einen Eintrag\n" -#: fe-connect.c:4923 fe-connect.c:4935 +#: fe-connect.c:5036 fe-connect.c:5048 msgid "no entry found on LDAP lookup\n" msgstr "kein Eintrag gefunden bei LDAP-Suche\n" -#: fe-connect.c:4946 fe-connect.c:4959 +#: fe-connect.c:5059 fe-connect.c:5072 msgid "attribute has no values on LDAP lookup\n" msgstr "Attribut hat keine Werte bei LDAP-Suche\n" -#: fe-connect.c:5011 fe-connect.c:5030 fe-connect.c:5562 +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "fehlendes »=« nach »%s« in der Zeichenkette der Verbindungsdaten\n" -#: fe-connect.c:5103 fe-connect.c:5747 fe-connect.c:6523 +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "ungültige Verbindungsoption »%s«\n" -#: fe-connect.c:5119 fe-connect.c:5611 +#: fe-connect.c:5232 fe-connect.c:5724 msgid "unterminated quoted string in connection info string\n" msgstr "fehlendes schließendes Anführungszeichen (\") in der Zeichenkette der Verbindungsdaten\n" -#: fe-connect.c:5200 +#: fe-connect.c:5313 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "Definition von Service »%s« nicht gefunden\n" -#: fe-connect.c:5226 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "Servicedatei »%s« nicht gefunden\n" -#: fe-connect.c:5240 +#: fe-connect.c:5353 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "Zeile %d zu lang in Servicedatei »%s«\n" -#: fe-connect.c:5311 fe-connect.c:5355 +#: fe-connect.c:5424 fe-connect.c:5468 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "Syntaxfehler in Servicedatei »%s«, Zeile %d\n" -#: fe-connect.c:5322 +#: fe-connect.c:5435 #, 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:6043 +#: fe-connect.c:6156 #, 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:6120 +#: fe-connect.c:6233 #, 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:6127 +#: fe-connect.c:6240 #, 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:6142 +#: fe-connect.c:6255 #, 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:6272 +#: fe-connect.c:6385 #, 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:6292 +#: fe-connect.c:6405 #, 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:6344 +#: fe-connect.c:6457 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "ungültiger URI-Query-Parameter: »%s«\n" -#: fe-connect.c:6418 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "ungültiges Prozent-kodiertes Token: »%s«\n" -#: fe-connect.c:6428 +#: fe-connect.c:6541 #, 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:6798 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7086 +#: fe-connect.c:7199 #, 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:7095 +#: 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 "WARNUNG: Passwortdatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Rechte sollten u=rw (0600) oder weniger sein\n" -#: fe-connect.c:7203 +#: fe-connect.c:7316 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "Passwort wurde aus Datei »%s« gelesen\n" -#: fe-exec.c:449 fe-exec.c:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, 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:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "Speicher aufgebraucht" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "Schreiben zum Server fehlgeschlagen\n" -#: fe-exec.c:864 +#: 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:922 +#: 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:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "Überlauf von size_t" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "Befehlszeichenkette ist ein NULL-Zeiger\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s im Pipeline-Modus nicht erlaubt\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, 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:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "Anweisungsname ist ein NULL-Zeiger\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "keine Verbindung mit dem Server\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "ein anderer Befehl ist bereits in Ausführung\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "während COPY können keine Befehle aufgereiht werden\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 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:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "unerwarteter asyncStatus: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc »%s« während PGEVT_RESULTCREATE-Ereignis fehlgeschlagen\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2347 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:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec ist während COPY BOTH nicht erlaubt\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "keine COPY in Ausführung\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn im Pipeline-Modus nicht erlaubt\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "Verbindung im falschen Zustand\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv\n" -#: fe-exec.c:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse\n" -#: fe-exec.c:2996 +#: fe-exec.c:3009 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:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "kann Pipeline-Modus nicht beenden während COPY aktiv ist\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 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:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, 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:3405 +#: fe-exec.c:3424 #, 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:3715 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:3975 fe-exec.c:4064 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "unvollständiges Mehrbyte-Zeichen\n" @@ -771,8 +782,8 @@ 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 +800,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 +833,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 +845,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 +863,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:407 +#: fe-protocol3.c:393 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:450 +#: fe-protocol3.c:436 #, 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:475 +#: fe-protocol3.c:461 #, 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:495 +#: fe-protocol3.c:481 #, 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:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: Text COPY OUT nicht ausgeführt\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "Protokollfehler: kein Funktionsergebnis\n" + +#: fe-protocol3.c:2151 #, 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:233 +#, 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:243 +#, 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:276 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:301 #, 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:307 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 +1054,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:1367 +#: 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:1371 +#: 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:1380 +#: 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:1430 +#: 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 +1136,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,92 +1145,97 @@ 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:1103 +#: 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:1149 +#: 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:1161 +#: 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:1177 +#: 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:1191 +#: 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:1228 +#: 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:1237 +#: 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\" is not a regular file\n" msgstr "private Schlüsseldatei »%s« ist keine normale Datei\n" -#: fe-secure-openssl.c:1270 +#: 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:1295 +#: 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:1313 +#: 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:1413 +#: 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:1449 +#: 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:1555 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:1812 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" @@ -1210,7 +1245,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" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/el.po b/third_party/spanner_pg/src/interfaces/libpq/po/el.po index c9e738e6..9a6b9b0d 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/el.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/el.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 14\n" +"Project-Id-Version: libpq (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-10 20:25+0000\n" -"PO-Revision-Date: 2023-04-11 10:47+0200\n" +"POT-Creation-Date: 2023-04-12 08:10+0000\n" +"PO-Revision-Date: 2023-04-12 11:33+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -20,98 +20,119 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.2.2\n" -#: fe-auth-scram.c:213 +#: ../../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:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναντιστοιχία μήκους)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "δεν ήταν δυνατή πιστοποίηση της υπογραφής του διακομιστή\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "δεν ήταν δυνατή πιστοποίηση της υπογραφής του διακομιστή: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "λανθασμένη υπογραφή διακομιστή\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "άκυρη κατάσταση ανταλλαγής SCRAM\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαρακτηριστικό «%c»)\n" -#: fe-auth-scram.c:315 +#: 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:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "δεν δύναται να δημιουργήσει 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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4716 fe-connect.c:4977 fe-connect.c:5096 fe-connect.c:5348 -#: fe-connect.c:5429 fe-connect.c:5528 fe-connect.c:5784 fe-connect.c:5813 -#: fe-connect.c:5885 fe-connect.c:5909 fe-connect.c:5927 fe-connect.c:6028 -#: fe-connect.c:6037 fe-connect.c:6395 fe-connect.c:6545 fe-connect.c:6811 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4086 fe-exec.c:4251 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:445 fe-secure-openssl.c:1138 +#: 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:4829 fe-connect.c:5090 fe-connect.c:5209 fe-connect.c:5461 +#: fe-connect.c:5542 fe-connect.c:5641 fe-connect.c:5897 fe-connect.c:5926 +#: fe-connect.c:5998 fe-connect.c:6022 fe-connect.c:6040 fe-connect.c:6141 +#: fe-connect.c:6150 fe-connect.c:6508 fe-connect.c:6658 fe-connect.c:6924 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:454 fe-secure-openssl.c:1266 msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 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:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "δεν μπόρεσε να υπολογίσει την απόδειξη του πελάτη: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "δεν δύναται να κωδικοποιήσει την απόδειξη του πελάτη\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "μη έγκυρη απόκριση SCRAM (ασυμφωνία nonce)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυρο salt)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυρη μέτρηση επαναλήψεων)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του πρώτου-μηνύματος-διακομιστή)\n" -#: fe-auth-scram.c:723 +#: 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:739 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του τελικού-μηνύματος-διακομιστή)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυρη υπογραφή διακομιστή)\n" +#: fe-auth-scram.c:935 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "έλλειψη μνήμης" + +#: fe-auth-scram.c:944 +msgid "could not generate random salt" +msgstr "δεν δύναται να δημιουργήσει τυχαίο salt" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -121,7 +142,8 @@ msgstr "η μνήμη δεν επαρκεί για την εκχώρηση τη msgid "GSSAPI continuation error" msgstr "σφάλμα συνέχισης GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 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" @@ -154,621 +176,610 @@ msgstr "απαιτείται σύνδεση καναλιού, αλλά δεν χ msgid "duplicate SASL authentication request\n" msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας SASL\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "απαιτείται σύνδεση καναλιού, αλλά ο πελάτης δεν την υποστηρίζει\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "ο διακομιστής προσέφερε έλεγχο ταυτότητας SCRAM-SHA-256-PLUS μέσω σύνδεσης που δεν είναι SSL\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "δεν υποστηρίζεται κανένας από τους μηχανισμούς ελέγχου ταυτότητας SASL του διακομιστή\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 "απαιτείται σύνδεση καναλιού, αλλά ο διακομιστής δεν προσέφερε καμία μέθοδο ελέγχου ταυτότητας που να υποστηρίζει σύνδεση καναλιού\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "η μνήμη δεν επαρκεί για την εκχώρηση της ενδιάμεσης μνήμης του 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 από το διακομιστή, αλλά ο έλεγχος ταυτότητας SASL έχει ολοκληρωθεί\n" +msgstr "παραλήφθηκε AuthenticationSASLFinal από το διακομιστή, αλλά ο έλεγχος ταυτότητας SASL δεν έχει ολοκληρωθεί\n" + +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "δεν βρέθηκε απάντηση πελάτη μετά την επιτυχία της ανταλλαγής SASL\n" -#: fe-auth.c:741 +#: 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:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης Kerberos 4\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης Kerberos 5\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης GSSAPI\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης SSPI\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης Crypt\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "δεν υποστηρίζεται η μέθοδος πιστοποίησης %u\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" -msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος % lu\n" +msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος %lu\n" -#: fe-auth.c:1117 fe-connect.c:2856 -#, 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:2861 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "δεν υπάρχει τοπικός χρήστης με ID %d\n" - -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "μη αναμενόμενο σχήμα συνόλου αποτελεσμάτων που επιστράφηκε από την εντολή SHOW\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "πολύ μακρυά τιμή password_encryption\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "μη αναγνωρίσιμος αλγόριθμος κρυπτογράφησης «%s» κωδικού πρόσβασης\n" -#: fe-connect.c:1094 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "δεν μπόρεσε να ταιριάξει %d ονομασίες διακομιστών με %d τιμές hostaddr\n" -#: fe-connect.c:1180 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "δεν μπόρεσε να ταιριάξει %d αριθμούς θυρών με %d διακομιστές\n" -#: fe-connect.c:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "άκυρο %s τιμή: «%s»\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "η τιμή SSLmode «%s» είναι άκυρη όταν η υποστήριξη SSL δεν έχει μεταγλωττιστεί (compiled)\n" -#: fe-connect.c:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "άκυρο εύρος εκδόσεων πρωτοκόλλου SSL\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "η τιμή SSLmode «%s» είναι άκυρη όταν η υποστήριξη GSSAPI δεν έχει μεταγλωττιστεί (compiled)\n" -#: fe-connect.c:1653 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "δεν μπόρεσε να ορίσει τον υποδοχέα σε λειτουργία TCP χωρίς καθυστέρηση: %s\n" -#: fe-connect.c:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "σύνδεση στον διακομιστή στην υποδοχή «%s» απέτυχε: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "σύνδεση στον διακομιστή σε «%s» (%s), θύρα %s απέτυχε: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "σύνδεση στον διακομιστή σε «%s», θύρα %s απέτυχε: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "\tΕκτελείται τοπικά ο διακομιστής και αποδέχεται συνδέσεις σε αυτή την υποδοχή;\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "\tΕκτελείται ο διακομιστής σε αυτόν τον κεντρικό υπολογιστή και αποδέχεται συνδέσεις TCP/IP;\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "άκυρη τιμή ακεραίου »%s» για την επιλογή σύνδεσης «%s»\n" -#: fe-connect.c:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s) απέτυχε: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) απέτυχε: κωδικός σφάλματος %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "μη έγκυρη κατάσταση σύνδεσης, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "μη έγκυρος αριθμός πύλης: «%s»\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "δεν ήταν δυνατή η μετάφραση του ονόματος κεντρικού υπολογιστή «%s» στη διεύθυνση: %s\n" -#: fe-connect.c:2418 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "δεν ήταν δυνατή η ανάλυση της διεύθυνσης δικτύου «%s»: %s\n" -#: fe-connect.c:2431 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "η διαδρομή υποδοχής τομέα Unix «%s» είναι πολύ μακρυά (μέγιστο %d bytes)\n" -#: fe-connect.c:2446 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "δεν ήταν δυνατή η μετάφραση της διαδρομής υποδοχής πεδίου-Unix «%s» στη διεύθυνση: %s\n" -#: fe-connect.c:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "δεν ήταν δυνατή η δημιουργία υποδοχέα: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "δεν ήταν δυνατή η ρύθμιση της υποδοχής σε λειτουργία μη αποκλεισμού: %s\n" -#: fe-connect.c:2613 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "δεν ήταν δυνατή η ρύθμιση της υποδοχής σε λειτουργία close-on-exec: %s\n" -#: fe-connect.c:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "η παράμετρος keepalives πρέπει να είναι ακέραιος\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης σφάλματος της υποδοχής: %s\n" -#: fe-connect.c:2800 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση διεύθυνσης πελάτη από την υποδοχή: %s\n" -#: fe-connect.c:2842 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "η παράμετρος requirepeer δεν υποστηρίζεται από την παρούσα πλατφόρμα\n" -#: fe-connect.c:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "δεν ήταν δυνατή η απόκτηση διαπιστευτηρίων από peer: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "το requirepeer καθορίζει «%s», αλλά το πραγματικό όνομα ομότιμου χρήστη είναι «%s»\n" -#: fe-connect.c:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "δεν ήταν δυνατή η αποστολή GSSAPI πακέτου διαπραγμάτευσης: %s\n" -#: fe-connect.c:2921 +#: 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 κρυπτογράφηση απαιτείται αλλά ήταν αδύνατη (πιθανώς απουσία cache διαπιστευτηρίων, απουσία υποστήριξης διακομιστή, ή χρησιμοποιείται τοπική υποδοχή)\n" -#: fe-connect.c:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "" "δεν ήταν δυνατή η αποστολή SSL πακέτου διαπραγμάτευσης: %s\n" "\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "δεν ήταν δυνατή η αποστολή πακέτου εκκίνησης: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "ο διακομιστής δεν υποστηρίζει SSL, αλλά απαιτείται SSL\n" -#: fe-connect.c:3097 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "έλαβε μη έγκυρη απάντηση κατά τη διαπραγμάτευση SSL: %c\n" -#: fe-connect.c:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "έλαβε μη κρυπτογραφημένα δεδομένα μετά την απάντηση SSL\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "ο διακομιστής δεν υποστηρίζει κρυπτογράφηση GSSAPI, αλλά αυτή ήταν απαραίτητη\n" -#: fe-connect.c:3211 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "έλαβε μη έγκυρη απάντηση κατά τη διαπραγμάτευση GSSAPI: %c\n" -#: fe-connect.c:3230 +#: fe-connect.c:3226 msgid "received unencrypted data after GSSAPI encryption response\n" msgstr "λήψη μη κρυπτογραφημένων δεδομένων μετά την απάντηση κρυπτογράφησης GSSAPI\n" -#: fe-connect.c:3295 fe-connect.c:3320 +#: fe-connect.c:3291 fe-connect.c:3316 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "ανέμενε αίτηση ελέγχου ταυτότητας από το διακομιστή, αλλά αντί αυτής ελήφθη %c\n" -#: fe-connect.c:3527 +#: fe-connect.c:3523 msgid "unexpected message from server during startup\n" msgstr "μη αναμενόμενο μήνυμα από το διακομιστή κατά την εκκίνηση\n" -#: fe-connect.c:3619 +#: fe-connect.c:3615 msgid "session is read-only\n" msgstr "η περίοδος λειτουργίας είναι μόνο για ανάγνωση\n" -#: fe-connect.c:3622 +#: fe-connect.c:3618 msgid "session is not read-only\n" msgstr "η περίοδος λειτουργίας δεν είναι μόνο για ανάγνωση\n" -#: fe-connect.c:3676 +#: fe-connect.c:3672 msgid "server is in hot standby mode\n" msgstr "%s: ο διακομιστής βρίσκεται σε hot κατάσταση αναμονής\n" -#: fe-connect.c:3679 +#: fe-connect.c:3675 msgid "server is not in hot standby mode\n" msgstr "ο διακομιστής δεν βρίσκεται σε hot κατάσταση αναμονής\n" -#: fe-connect.c:3797 fe-connect.c:3849 +#: fe-connect.c:3793 fe-connect.c:3845 #, c-format msgid "\"%s\" failed\n" msgstr "«%s» απέτυχε.\n" -#: fe-connect.c:3863 +#: fe-connect.c:3859 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "κατάσταση μη έγκυρης σύνδεσης %d, πιθανώς ενδεικτική αλλοίωσης της μνήμης\n" -#: fe-connect.c:4309 fe-connect.c:4369 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc «%s» απέτυχε κατά τη διάρκεια συμβάντος PGEVT_CONNRESET\n" - -#: fe-connect.c:4729 +#: fe-connect.c:4842 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "άκυρη διεύθυνση URL LDAP «%s»: ο συνδυασμός πρέπει να είναι ldap://\n" -#: fe-connect.c:4744 +#: fe-connect.c:4857 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "άκυρη διεύθυνση URL LDAP «%s»: λείπει το αποκλειστικό όνομα\n" -#: fe-connect.c:4756 fe-connect.c:4814 +#: fe-connect.c:4869 fe-connect.c:4927 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "άκυρη διεύθυνση URL LDAP «%s»: πρέπει να περιέχει ακριβώς ένα χαρακτηριστικό\n" -#: fe-connect.c:4768 fe-connect.c:4830 +#: fe-connect.c:4881 fe-connect.c:4943 #, 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:4780 +#: fe-connect.c:4893 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "άκυρη διεύθυνση URL LDAP «%s»: κανένα φίλτρο\n" -#: fe-connect.c:4802 +#: fe-connect.c:4915 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "άκυρη διεύθυνση URL LDAP «%s»: άκυρος αριθμός θύρας\n" -#: fe-connect.c:4840 +#: fe-connect.c:4953 msgid "could not create LDAP structure\n" msgstr "δεν ήταν δυνατή η δημιουργία δομής LDAP\n" -#: fe-connect.c:4916 +#: fe-connect.c:5029 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "απέτυχε η αναζήτηση στον διακομιστή LDAP: %s\n" -#: fe-connect.c:4927 +#: fe-connect.c:5040 msgid "more than one entry found on LDAP lookup\n" msgstr "βρέθηκαν περισσότερες από μία καταχωρήσεις στην αναζήτηση LDAP\n" -#: fe-connect.c:4928 fe-connect.c:4940 +#: fe-connect.c:5041 fe-connect.c:5053 msgid "no entry found on LDAP lookup\n" msgstr "δεν βρέθηκε καταχώρηση στην αναζήτηση LDAP\n" -#: fe-connect.c:4951 fe-connect.c:4964 +#: fe-connect.c:5064 fe-connect.c:5077 msgid "attribute has no values on LDAP lookup\n" msgstr "το χαρακτηριστικό δεν έχει τιμές στην αναζήτηση LDAP\n" -#: fe-connect.c:5016 fe-connect.c:5035 fe-connect.c:5567 +#: fe-connect.c:5129 fe-connect.c:5148 fe-connect.c:5680 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "λείπει το «=» μετά από «%s» στην συμβολοσειρά πληροφορίας σύνδεσης\n" -#: fe-connect.c:5108 fe-connect.c:5752 fe-connect.c:6528 +#: fe-connect.c:5221 fe-connect.c:5865 fe-connect.c:6641 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "άκυρη επιλογή σύνδεσης «%s»\n" -#: fe-connect.c:5124 fe-connect.c:5616 +#: fe-connect.c:5237 fe-connect.c:5729 msgid "unterminated quoted string in connection info string\n" msgstr "ατερμάτιστη συμβολοσειρά με εισαγωγικά στην συμβολοσειρά πληροφορίας σύνδεσης\n" -#: fe-connect.c:5205 +#: fe-connect.c:5318 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "δεν βρέθηκε ο ορισμός της υπηρεσίας «%s»\n" -#: fe-connect.c:5231 +#: fe-connect.c:5344 #, c-format msgid "service file \"%s\" not found\n" msgstr "δεν βρέθηκε αρχείο υπηρεσίας «%s»\n" -#: fe-connect.c:5245 +#: fe-connect.c:5358 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "πολύ μακρυά γραμμή %d στο αρχείο υπηρεσίας «%s»\n" -#: fe-connect.c:5316 fe-connect.c:5360 +#: fe-connect.c:5429 fe-connect.c:5473 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "συντακτικό σφάλμα στο αρχείο υπηρεσίας «%s», γραμμή %d\n" -#: fe-connect.c:5327 +#: fe-connect.c:5440 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "οι ένθετες προδιαγραφές υπηρεσίας δεν υποστηρίζονται στο αρχείο υπηρεσίας «%s», γραμμή %d\n" -#: fe-connect.c:6048 +#: fe-connect.c:6161 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "μη έγκυρο URI διαδόθηκε στη ρουτίνα εσωτερικής ανάλυσης: «%s»\n" -#: fe-connect.c:6125 +#: fe-connect.c:6238 #, 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:6132 +#: fe-connect.c:6245 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "η διεύθυνση IPv6 κεντρικού υπολογιστή δεν δύναται να είναι κενή στο URI: «%s»\n" -#: fe-connect.c:6147 +#: fe-connect.c:6260 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "μη αναμενόμενος χαρακτήρας «%c» στη θέση %d του URI (αναμένεται «:» ή «/»): «%s»\n" -#: fe-connect.c:6277 +#: fe-connect.c:6390 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "επιπλέον διαχωριστικό κλειδιού/τιμής «=» στην παράμετρο ερωτήματος URI: «%s»\n" -#: fe-connect.c:6297 +#: fe-connect.c:6410 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "λείπει διαχωριστικό κλειδιού/τιμής «=» στην παράμετρο ερωτήματος URI: «%s»\n" -#: fe-connect.c:6349 +#: fe-connect.c:6462 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "άκυρη παράμετρος ερωτήματος URI: «%s»\n" -#: fe-connect.c:6423 +#: fe-connect.c:6536 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "άκυρο διακριτικό με κωδικοποίηση ποσοστού: «%s»\n" -#: fe-connect.c:6433 +#: fe-connect.c:6546 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "απαγορευμένη τιμή %%00 σε τιμή κωδικοποιημένου ποσοστού: «%s»\n" -#: fe-connect.c:6803 +#: fe-connect.c:6916 msgid "connection pointer is NULL\n" msgstr "ο δείκτης σύνδεσης είναι NULL\n" -#: fe-connect.c:7091 +#: fe-connect.c:7204 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αρχείο κωδικών πρόσβασης «%s» δεν είναι ένα απλό αρχείο\n" -#: fe-connect.c:7100 +#: fe-connect.c:7213 #, 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:7208 +#: fe-connect.c:7321 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "ο κωδικός πρόσβασης ελήφθει από αρχείο «%s»\n" -#: fe-exec.c:449 fe-exec.c:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, c-format msgid "row number %d is out of range 0..%d" msgstr "ο αριθμός σειράς %d βρίσκεται εκτός εύρους 0..%d" -#: fe-exec.c:510 fe-protocol3.c:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "έλλειψη μνήμης" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "απέτυχε η εγγραφή στον διακομιστή\n" -#: fe-exec.c:864 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "κανένα μήνυμα σφάλματος διαθέσιμο\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "NOTICE" -#: fe-exec.c:922 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "το PGresult δεν μπορεί να υποστηρίξει περισσότερες πλείαδες από INT_MAX" -#: fe-exec.c:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "υπερχείλιση overflow" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "η συμβολοσειρά εντολής είναι ένας κενός δείκτης\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s δεν επιτρέπεται σε λειτουργία αγωγού\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "ο αριθμός των παραμέτρων πρέπει να είναι μεταξύ 0 και %d\n" -#: fe-exec.c:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "η ονομασία της δήλωσης είναι ένας κενός δείκτης\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "καμία σύνδεση στον διακομιστή\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "υπάρχει άλλη εντολή σε πρόοδο\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "δεν είναι δυνατή η ουρά εντολών κατά τη διάρκεια του COPY\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 msgid "length must be given for binary parameter\n" msgstr "το μήκος πρέπει να περαστεί ως δυαδική παράμετρος\n" -#: fe-exec.c:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "μη αναμενόμενο asyncStatus: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc «%s» κατά τη διάρκεια συμβάντος PGEVT_RESULTCREATE\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2347 msgid "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "οι συναρτήσεις σύγχρονης εκτέλεσης εντολών δεν επιτρέπονται σε λειτουργία διοχέτευσης\n" -#: fe-exec.c:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY τερματίστηκε από νέο PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec δεν επιτρέπεται κατά τη διάρκεια COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "κανένα COPY σε εξέλιξη\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "το PQfn δεν επιτρέπεται σε λειτουργία διοχέτευσης\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "σύνδεση σε λανθάνουσα κατάσταση\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "δεν ήταν δυνατή η είσοδος σε λειτουργία διοχέτευσης, σύνδεση μη αδρανή\n" -#: fe-exec.c:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "δεν είναι δυνατή η έξοδος από τη λειτουργία διοχέτευσης με μη λαμβανόμενα αποτελέσματα\n" -#: fe-exec.c:2996 +#: fe-exec.c:3009 msgid "cannot exit pipeline mode while busy\n" msgstr "δεν είναι δυνατή η έξοδος από τη λειτουργία διοχέτευσης ενώ απασχολείται\n" -#: fe-exec.c:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "δεν μπορεί να εξέλθει από τη λειτουργία αγωγού ενώ βρίσκεται σε COPY\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "δεν είναι δυνατή η αποστολή διοχέτευσης όταν δεν βρίσκεται σε λειτουργία διοχέτευσης\n" -#: fe-exec.c:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "άκυρος κωδικός ExecStatusType" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult δεν είναι ένα αποτέλεσμα σφάλματος\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, c-format msgid "column number %d is out of range 0..%d" msgstr "αριθμός στήλης %d βρίσκεται εκτός εύρους 0..%d" -#: fe-exec.c:3405 +#: fe-exec.c:3424 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "αριθμός παραμέτρου %d βρίσκεται εκτός εύρους 0..%d" -#: fe-exec.c:3715 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "δεν μπόρεσε να ερμηνεύσει το αποτέλεσμα από τον διακομιστή: %s" -#: fe-exec.c:3979 fe-exec.c:4068 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "ελλιπής χαρακτήρας πολλαπλών byte\n" @@ -777,8 +788,8 @@ 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 +#: 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 "δεν ήταν δυνατός ο προσδιορισμός του OID της συνάρτησης %s\n" @@ -795,22 +806,22 @@ msgstr "η παράμετρος του lo_read υπερβαίνει το εύρ msgid "argument of lo_write exceeds integer range\n" msgstr "η παράμετρος του lo_write υπερβαίνει το εύρος ακέραιων\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 "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο «%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 "δεν ήταν δυνατή η εγγραφή στο αρχείο »%s»: %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "το ερώτημα αρχικοποίησης συναρτήσεων μεγάλων αντικειμένων δεν επέστρεψε δεδομένα\n" @@ -828,8 +839,9 @@ msgstr "ακέραιος μεγέθους %lu δεν υποστηρίζεται msgid "connection not open\n" msgstr "μη ανοικτή σύνδεση\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" @@ -839,15 +851,15 @@ msgstr "" "\tΑυτό πιθανώς σημαίνει ότι ο διακομιστής τερματίστηκε ασυνήθιστα\n" "\tπριν ή κατά την επεξεργασία του αιτήματος.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "έληξε το χρονικό όριο\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "άκυρος υποδοχέας\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "%s() απέτυχε: %s\n" @@ -857,142 +869,156 @@ msgstr "%s() απέτυχε: %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "μήνυμα τύπου 0x%02x έφτασε από το διακομιστή ενώ αυτός ήταν αδρανής" -#: fe-protocol3.c:407 +#: fe-protocol3.c:393 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωρίς προηγούμενη περιγραφή γραμμής («T» μήνυμα)\n" -#: fe-protocol3.c:450 +#: fe-protocol3.c:436 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "μη αναμενόμενη απόκριση από το διακομιστή· πρώτος χαρακτήρας που ελήφθη ήταν «%c»\n" -#: fe-protocol3.c:475 +#: fe-protocol3.c:461 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "τα περιεχόμενα του μηνύματος δεν συμφωνούν με το μήκος του σε τύπο μηνύματος «%c»\n" -#: fe-protocol3.c:495 +#: fe-protocol3.c:481 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "χάθηκε ο συγχρονισμός με το διακομιστή: ελήφθει τύπος μηνύματος «%c», μήκους %d\n" -#: fe-protocol3.c:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "ανεπαρκή δεδομένα σε «T» μήνυμα" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "έλλειψη μνήμης για το αποτέλεσμα ερωτήματος" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "ανεπαρκή δεδομένα σε «t» μήνυμα" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "ανεπαρκή δεδομένα σε «D» μήνυμα" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "μη αναμενόμενο πλήθος πεδίων σε »D» μήνυμα" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "κανένα μήνυμα σφάλματος διαθέσιμο\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " στο χαρακτήρα %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "ΕΡΩΤΗΜΑ: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s: %s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "ΓΡΑΜΜΗ %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: δεν κάνει το κείμενο COPY OUT\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "σφάλμα πρωτοκόλλου: κανένα αποτέλεσμα συνάρτησης\n" + +#: fe-protocol3.c:2151 #, c-format msgid "protocol error: id=0x%x\n" msgstr "σφάλμα πρωτοκόλλου: id=0x%x\n" -#: fe-secure-common.c:124 +#: 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:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "το πιστοποιητικό περιέχει διεύθυνση IP με μη έγκυρο μήκος %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "δεν μπόρεσε να μετατρέψει τη διεύθυνση IP του πιστοποιητικού σε συμβολοσειρά: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "το όνομα κεντρικού υπολογιστή πρέπει να έχει καθοριστεί για μια επαληθευμένη σύνδεση SSL\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 "το πιστοποιητικό διακομιστή για το «%s» δεν ταιριάζει με το όνομα κεντρικού υπολογιστή «%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" @@ -1034,77 +1060,81 @@ msgstr "σφάλμα ελέγχου μεγέθους GSSAPI" msgid "GSSAPI context establishment error" msgstr "σφάλμα δημιουργίας περιεχομένου GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1372 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1504 #, 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:1376 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1508 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:1385 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1517 #, 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:1435 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1567 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "μη αναγνωρίσιμος κωδικός σφάλματος SSL: %d\n" -#: fe-secure-openssl.c:405 +#: fe-secure-openssl.c:414 msgid "could not determine server certificate signature algorithm\n" msgstr "δεν μπόρεσε να προσδιορίσει τον αλγόριθμο υπογραφής πιστοποιητικού διακομιστή\n" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:435 #, c-format msgid "could not find digest for NID %s\n" msgstr "δεν μπόρεσε να βρεθεί σύνοψη (digest) για NID %s\n" -#: fe-secure-openssl.c:436 +#: fe-secure-openssl.c:445 msgid "could not generate peer certificate hash\n" msgstr "δεν ήταν δυνατή η δημιουργία ομότιμου πιστοποιητικού hash\n" -#: fe-secure-openssl.c:493 +#: fe-secure-openssl.c:502 msgid "SSL certificate's name entry is missing\n" msgstr "λείπει καταχώρηση ονόματος του πιστοποιητικού SSL\n" -#: fe-secure-openssl.c:827 +#: fe-secure-openssl.c:537 +msgid "SSL certificate's address entry is missing\n" +msgstr "λείπει καταχώρηση ονόματος του πιστοποιητικού SSL\n" + +#: fe-secure-openssl.c:955 #, c-format msgid "could not create SSL context: %s\n" msgstr "δεν ήταν δυνατή η δημιουργία περιεχομένου SSL: %s\n" -#: fe-secure-openssl.c:866 +#: fe-secure-openssl.c:994 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "άκυρη τιμή «%s» για την ελάχιστη έκδοση πρωτοκόλλου SSL\n" -#: fe-secure-openssl.c:877 +#: fe-secure-openssl.c:1005 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "δεν ήταν δυνατό να ορίσει ελάχιστη έκδοση πρωτοκόλλου SSL: %s\n" -#: fe-secure-openssl.c:895 +#: fe-secure-openssl.c:1023 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "άκυρη τιμή «%s» για μέγιστη έκδοση πρωτοκόλλου SSL\n" -#: fe-secure-openssl.c:906 +#: fe-secure-openssl.c:1034 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "δεν ήταν δυνατό να ορίσει μέγιστη έκδοση πρωτοκόλλου SSL: %s\n" -#: fe-secure-openssl.c:942 +#: fe-secure-openssl.c:1070 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "δεν ήταν δυνατή η ανάγνωση βασικού αρχείου πιστοποιητικού «%s»: %s\n" -#: fe-secure-openssl.c:995 +#: fe-secure-openssl.c:1123 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" @@ -1112,7 +1142,7 @@ msgstr "" "δεν ήταν δυνατή η δημιουργία του προσωπικού καταλόγου για τον εντοπισμό βασικού αρχείου πιστοποιητικού\n" "Δώστε το αρχείο ή αλλάξτε το sslmode για να απενεργοποιήσετε την επαλήθευση πιστοποιητικού διακομιστή.\n" -#: fe-secure-openssl.c:999 +#: fe-secure-openssl.c:1127 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1121,96 +1151,101 @@ msgstr "" "βασικό αρχείο πιστοποιητικού \"%s\" δεν υπάρχει\n" "Είτε παρουσιάστε το αρχείο ή αλλάξτε το sslmode για να απενεργοποιήσετε την επαλήθευση πιστοποιητικού διακομιστή.\n" -#: fe-secure-openssl.c:1030 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου πιστοποιητικού «%s»: %s\n" -#: fe-secure-openssl.c:1049 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "δεν ήταν δυνατή η ανάγνωση αρχείου πιστοποιητικού «%s»: %s\n" -#: fe-secure-openssl.c:1074 +#: fe-secure-openssl.c:1202 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "δεν ήταν δυνατή η δημιουργία σύνδεσης SSL: %s\n" -#: fe-secure-openssl.c:1108 +#: fe-secure-openssl.c:1236 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" msgstr "δεν ήταν δυνατός ο ορισμός SSL Server Name Indication (SNI): %s\n" -#: fe-secure-openssl.c:1154 +#: fe-secure-openssl.c:1282 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "δεν ήταν δυνατή η φόρτωση της μηχανής SSL «%s»: %s\n" -#: fe-secure-openssl.c:1166 +#: fe-secure-openssl.c:1294 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "" "δεν ήταν δυνατή η εκκίνηση του κινητήρα SSL »%s»: %s\n" "\n" -#: fe-secure-openssl.c:1182 +#: fe-secure-openssl.c:1310 #, 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:1196 +#: fe-secure-openssl.c:1324 #, 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:1233 +#: fe-secure-openssl.c:1362 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "υπάρχει πιστοποιητικό, αλλά όχι αρχείο ιδιωτικού κλειδιού «%s»\n" -#: fe-secure-openssl.c:1242 +#: fe-secure-openssl.c:1366 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "δεν ήταν δυνατή η φόρτωση αρχείου ιδιωτικού κλειδιού «%s»: %m\n" + +#: fe-secure-openssl.c:1375 #, c-format msgid "private key file \"%s\" is not a regular file\n" msgstr "το αρχείο ιδιωτικού κλειδιού «%s» δεν είναι κανονικό αρχείο\n" -#: fe-secure-openssl.c:1275 +#: fe-secure-openssl.c:1408 #, 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) ή λιγότερα αν ανήκει στον τρέχοντα χρήστη, ή δικαιώματα u=rw,g=r (0640) ή λιγότερα αν ανήκει στον υπερχρήστη\n" +msgstr "το αρχείο ιδιωτικού κλειδιού «%s» έχει πρόσβαση σε ομάδα ή κόσμο- το αρχείο πρέπει να έχει δικαιώματα u=rw (0600) ή λιγότερα αν ανήκει στον τρέχοντα χρήστη, ή δικαιώματα u=rw,g=r (0640) ή λιγότερα αν ανήκει στον υπερχρήστη\n" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1433 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "δεν ήταν δυνατή η φόρτωση αρχείου ιδιωτικού κλειδιού «%s»: %s\n" -#: fe-secure-openssl.c:1318 +#: fe-secure-openssl.c:1450 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "το πιστοποιητικό δεν ταιριάζει με το αρχείο ιδιωτικού κλειδιού «%s»: %s\n" -#: fe-secure-openssl.c:1418 +#: fe-secure-openssl.c:1550 #, 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:1454 +#: fe-secure-openssl.c:1586 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "" "δεν ήταν δυνατή η λήψη πιστοποιητικού: %s\n" "\n" -#: fe-secure-openssl.c:1560 +#: fe-secure-openssl.c:1692 #, c-format msgid "no SSL error reported" msgstr "δεν αναφέρθηκε κανένα σφάλμα SSL" -#: fe-secure-openssl.c:1569 +#: fe-secure-openssl.c:1701 #, c-format msgid "SSL error code %lu" msgstr "κωδικός σφάλματος SSL %lu" -#: fe-secure-openssl.c:1817 +#: fe-secure-openssl.c:1956 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNING: περικομμένο sslpassword\n" @@ -1220,7 +1255,7 @@ msgstr "WARNING: περικομμένο sslpassword\n" msgid "could not receive data from server: %s\n" msgstr "δεν ήταν δυνατή η λήψη δεδομένων από το διακομιστή: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "δεν ήταν δυνατή η αποστολή δεδομένων στο διακομιστή: %s\n" @@ -1238,6 +1273,12 @@ msgstr "μη αναγνωρίσιμο σφάλμα υποδοχής: 0x%08X/%d" #~ msgid "COPY OUT state must be terminated first\n" #~ msgstr "πρέπει πρώτα να τερματιστεί η κατάσταση COPY OUT\n" +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEventProc «%s» απέτυχε κατά τη διάρκεια συμβάντος PGEVT_CONNRESET\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEventProc «%s» κατά τη διάρκεια συμβάντος PGEVT_RESULTCREATE\n" + #~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" #~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) απέτυχε: %ui\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/es.po b/third_party/spanner_pg/src/interfaces/libpq/po/es.po index 15494256..8d0d5b4f 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/es.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 14\n" +"Project-Id-Version: libpq (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:55+0000\n" -"PO-Revision-Date: 2022-08-08 00:59+0200\n" +"POT-Creation-Date: 2023-05-07 16:40+0000\n" +"PO-Revision-Date: 2022-10-20 09:06+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -22,98 +22,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: BlackCAT 1.1\n" -#: fe-auth-scram.c:213 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "no se pudo buscar el usuario local de ID %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "no existe un usuario local con ID %d" + +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "mensaje SCRAM mal formado (mensaje vacío)\n" -#: fe-auth-scram.c:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "mensaje SCRAM mal formado (longitud no coincide)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "no se pudo verificar la signatura del servidor\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "no se pudo verificar la signatura del servidor: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "signatura de servidor incorrecta\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "estado de intercambio SCRAM no es válido\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "mensaje SCRAM mal formado (se esperaba atributo «%c»)\n" -#: fe-auth-scram.c:315 +#: fe-auth-scram.c:333 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" msgstr "mensaje SCRAM mal formado (se esperaba el carácter «=» para el atributo «%c»)\n" -#: fe-auth-scram.c:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" -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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4716 fe-connect.c:4977 fe-connect.c:5096 fe-connect.c:5348 -#: fe-connect.c:5429 fe-connect.c:5528 fe-connect.c:5784 fe-connect.c:5813 -#: fe-connect.c:5885 fe-connect.c:5909 fe-connect.c:5927 fe-connect.c:6028 -#: fe-connect.c:6037 fe-connect.c:6395 fe-connect.c:6545 fe-connect.c:6811 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4086 fe-exec.c:4251 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:445 fe-secure-openssl.c:1138 +msgstr "no se pudo generar nonce\n" + +#: 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:4829 fe-connect.c:5090 fe-connect.c:5209 fe-connect.c:5461 +#: fe-connect.c:5542 fe-connect.c:5641 fe-connect.c:5897 fe-connect.c:5926 +#: fe-connect.c:5998 fe-connect.c:6022 fe-connect.c:6040 fe-connect.c:6141 +#: fe-connect.c:6150 fe-connect.c:6508 fe-connect.c:6658 fe-connect.c:6924 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:454 fe-secure-openssl.c:1266 msgid "out of memory\n" msgstr "memoria agotada\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" -msgstr "no se pude generar nonce\n" +msgstr "no se pudo codificar nonce\n" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "no se pudo calcular la prueba del cliente\n" +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "no se pudo calcular la prueba del cliente: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "no se pudo codificar la prueba del cliente\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "respuesta SCRAM no es válida (nonce no coincide)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "mensaje SCRAM mal formado (sal no válida)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "mensaje SCRAM mal formado (el conteo de iteración no es válido)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "mensaje SCRAM mal formado (se encontró basura al final de 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 "se recibió un error desde el servidor durante el intercambio 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 "mensaje SCRAM mal formado (se encontró basura al final de server-final-message)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "mensaje SCRAM mal formado (la signatura del servidor no es válida)\n" +#: fe-auth-scram.c:935 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "memoria agotada" + +#: fe-auth-scram.c:944 +msgid "could not generate random salt" +msgstr "no se pudo generar una sal aleatoria" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -123,7 +144,8 @@ 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: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 "el nombre de servidor debe ser especificado\n" @@ -156,619 +178,608 @@ msgstr "se requiere enlazado de canal (channel binding), pero no se está usando msgid "duplicate SASL authentication request\n" msgstr "petición de autentificación SASL duplicada\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "se requiere enlazado de canal (channel binding), pero no está soportado en el cliente\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "el servidor ofreció autenticación SCRAM-SHA-256-PLUS sobre una conexión no-SSL\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "ningún método de autentificación SASL del servidor está soportado\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 "se requiere enlazado de canal (channel binding), pero el servidor no ofrece un método de autenticación que lo soporte\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "memoria agotada creando el búfer SASL (%d)\n" -#: fe-auth.c:664 +#: fe-auth.c:672 msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" msgstr "Se recibió AuthenticationSASLFinal desde el servidor, pero la autentificación SASL no se completó\n" -#: fe-auth.c:741 +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "no se encontró respuesta del cliente luego del intercambio SASL exitoso\n" + +#: fe-auth.c:765 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:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#, c-format +msgid "could not encrypt password: %s\n" +msgstr "no se pudo cifrar contraseña: %s\n" + +#: fe-auth.c:868 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:874 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:909 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:914 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:985 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:1017 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:1025 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:1092 #, 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:1138 #, 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:2856 -#, 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:2861 -#, 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:1264 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:1273 msgid "password_encryption value too long\n" msgstr "el valor para password_encryption es demasiado largo\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "algoritmo para cifrado de contraseña «%s» desconocido\n" -#: fe-connect.c:1094 +#: fe-connect.c:1090 #, 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:1180 +#: fe-connect.c:1176 #, 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:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "valor %s no válido: «%s»\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, 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:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "rango de protocolo SSL no válido \n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, 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:1653 +#: fe-connect.c:1649 #, 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:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "falló la conexión al servidor en el socket «%s»: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, 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:1747 +#: fe-connect.c:1743 #, 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:1772 +#: fe-connect.c:1768 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:1776 +#: fe-connect.c:1772 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:1840 +#: fe-connect.c:1836 #, 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:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s) falló: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) falló: código de error %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 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:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "número de puerto no válido: «%s»\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, 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:2418 +#: fe-connect.c:2425 #, 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:2431 +#: fe-connect.c:2438 #, 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:2446 +#: fe-connect.c:2453 #, 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:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "no se pudo crear el socket: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, 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:2613 +#: fe-connect.c:2620 #, 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:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "el parámetro de keepalives debe ser un entero\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, 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:2800 +#: fe-connect.c:2807 #, 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:2842 +#: fe-connect.c:2846 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:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "no se pudo obtener credenciales de la contraparte: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, 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:2909 +#: fe-connect.c:2905 #, 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:2921 +#: 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 "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:2963 +#: fe-connect.c:2959 #, 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:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "no se pudo enviar el paquete de inicio: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 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:3097 +#: fe-connect.c:3093 #, 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:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "se recibieron datos no cifrados después de la respuesta SSL\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 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:3211 +#: fe-connect.c:3207 #, 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:3230 +#: fe-connect.c:3226 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:3295 fe-connect.c:3320 +#: fe-connect.c:3291 fe-connect.c:3316 #, 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:3527 +#: fe-connect.c:3523 msgid "unexpected message from server during startup\n" msgstr "se ha recibido un mensaje inesperado del servidor durante el inicio\n" -#: fe-connect.c:3619 +#: fe-connect.c:3615 msgid "session is read-only\n" msgstr "la sesión es de solo lectura\n" -#: fe-connect.c:3622 +#: fe-connect.c:3618 msgid "session is not read-only\n" msgstr "la sesión no es de solo lectura\n" -#: fe-connect.c:3676 +#: fe-connect.c:3672 msgid "server is in hot standby mode\n" msgstr "el servidor está en modo hot standby\n" -#: fe-connect.c:3679 +#: fe-connect.c:3675 msgid "server is not in hot standby mode\n" msgstr "el servidor no está en modo hot standby\n" -#: fe-connect.c:3797 fe-connect.c:3849 +#: fe-connect.c:3793 fe-connect.c:3845 #, c-format msgid "\"%s\" failed\n" msgstr "«%s» falló\n" -#: fe-connect.c:3863 +#: fe-connect.c:3859 #, 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:4309 fe-connect.c:4369 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc «%s» falló durante el evento PGEVT_CONNRESET\n" - -#: fe-connect.c:4729 +#: fe-connect.c:4842 #, 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:4744 +#: fe-connect.c:4857 #, 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:4756 fe-connect.c:4814 +#: fe-connect.c:4869 fe-connect.c:4927 #, 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:4768 fe-connect.c:4830 +#: fe-connect.c:4881 fe-connect.c:4943 #, 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:4780 +#: fe-connect.c:4893 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "URL LDAP no válida «%s»: no tiene filtro\n" -#: fe-connect.c:4802 +#: fe-connect.c:4915 #, 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:4840 +#: fe-connect.c:4953 msgid "could not create LDAP structure\n" msgstr "no se pudo crear estructura LDAP\n" -#: fe-connect.c:4916 +#: fe-connect.c:5029 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "búsqueda en servidor LDAP falló: %s\n" -#: fe-connect.c:4927 +#: fe-connect.c:5040 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:4928 fe-connect.c:4940 +#: fe-connect.c:5041 fe-connect.c:5053 msgid "no entry found on LDAP lookup\n" msgstr "no se encontró ninguna entrada en búsqueda LDAP\n" -#: fe-connect.c:4951 fe-connect.c:4964 +#: fe-connect.c:5064 fe-connect.c:5077 msgid "attribute has no values on LDAP lookup\n" msgstr "la búsqueda LDAP entregó atributo sin valores\n" -#: fe-connect.c:5016 fe-connect.c:5035 fe-connect.c:5567 +#: fe-connect.c:5129 fe-connect.c:5148 fe-connect.c:5680 #, 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:5108 fe-connect.c:5752 fe-connect.c:6528 +#: fe-connect.c:5221 fe-connect.c:5865 fe-connect.c:6641 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "opción de conexión no válida «%s»\n" -#: fe-connect.c:5124 fe-connect.c:5616 +#: fe-connect.c:5237 fe-connect.c:5729 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:5205 +#: fe-connect.c:5318 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "la definición de servicio «%s» no fue encontrada\n" -#: fe-connect.c:5231 +#: fe-connect.c:5344 #, c-format msgid "service file \"%s\" not found\n" msgstr "el archivo de servicio «%s» no fue encontrado\n" -#: fe-connect.c:5245 +#: fe-connect.c:5358 #, 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:5316 fe-connect.c:5360 +#: fe-connect.c:5429 fe-connect.c:5473 #, 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:5327 +#: fe-connect.c:5440 #, 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:6048 +#: fe-connect.c:6161 #, 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:6125 +#: fe-connect.c:6238 #, 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:6132 +#: fe-connect.c:6245 #, 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:6147 +#: fe-connect.c:6260 #, 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:6277 +#: fe-connect.c:6390 #, 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:6297 +#: fe-connect.c:6410 #, 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:6349 +#: fe-connect.c:6462 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "parámetro de URI no válido: «%s»\n" -#: fe-connect.c:6423 +#: fe-connect.c:6536 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "elemento escapado con %% no válido: «%s»\n" -#: fe-connect.c:6433 +#: fe-connect.c:6546 #, 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:6803 +#: fe-connect.c:6916 msgid "connection pointer is NULL\n" msgstr "el puntero de conexión es NULL\n" -#: fe-connect.c:7091 +#: fe-connect.c:7204 #, 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:7100 +#: fe-connect.c:7213 #, 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:7208 +#: fe-connect.c:7321 #, 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:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, 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:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "memoria agotada" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "falló escritura al servidor\n" -#: fe-exec.c:864 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "no hay mensaje de error disponible\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "AVISO" -#: fe-exec.c:922 +#: fe-exec.c:1022 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:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "desbordamiento de size_t" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "la cadena de orden es un puntero nulo\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "no se permite %s en modo pipeline\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, 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:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "el nombre de sentencia es un puntero nulo\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "no hay conexión con el servidor\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "hay otra orden en ejecución\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "no se puede agregar órdenes a la cola mientras se hace COPY\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 msgid "length must be given for binary parameter\n" msgstr "el largo debe ser especificado para un parámetro binario\n" -#: fe-exec.c:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "asyncStatus no esperado: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc «%s» falló durante el evento PGEVT_RESULTCREATE\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2347 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:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY terminado por un nuevo PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec no está permitido durante COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "no hay COPY alguno en ejecución\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "no se permite PQfn en modo pipeline\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "la conexión está en un estado incorrecto\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 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:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 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:2996 +#: fe-exec.c:3009 msgid "cannot exit pipeline mode while busy\n" msgstr "no se puede salir de modo pipeline mientras haya actividad\n" -#: fe-exec.c:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "no se puede salir de modo pipeline mientras se está en COPY\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 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:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "el código de ExecStatusType no es válido" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult no es un resultado de error\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, 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:3405 +#: fe-exec.c:3424 #, 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:3715 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "no se pudo interpretar el resultado del servidor: %s" -#: fe-exec.c:3979 fe-exec.c:4068 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "carácter multibyte incompleto\n" @@ -777,8 +788,8 @@ msgid "GSSAPI name import error" msgstr "error de importación de nombre de 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 "no se puede determinar el OID de la función %s\n" @@ -795,22 +806,22 @@ msgstr "el argumento de lo_read excede el rango de enteros\n" msgid "argument of lo_write exceeds integer range\n" msgstr "el argumento de lo_write excede el rango de enteros\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 "no se pudo abrir el archivo «%s»: %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "no se pudo leer el archivo «%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 "no se pudo escribir a archivo «%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 consulta para inicializar las funciones de objetos grandes no devuelve datos\n" @@ -828,8 +839,9 @@ msgstr "el entero de tamaño %lu no está soportado por pqPutInt" msgid "connection not open\n" msgstr "la conexión no está abierta\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" @@ -839,15 +851,15 @@ msgstr "" "\tProbablemente se debe a que el servidor terminó de manera anormal\n" "\tantes o durante el procesamiento de la petición.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "tiempo de espera agotado\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "socket no válido\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "%s() falló: %s\n" @@ -857,142 +869,156 @@ msgstr "%s() falló: %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "un mensaje de tipo 0x%02x llegó del servidor estando inactivo" -#: fe-protocol3.c:407 +#: fe-protocol3.c:393 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "el servidor envió datos (mensaje «D») sin precederlos con una descripción de fila (mensaje «T»)\n" -#: fe-protocol3.c:450 +#: fe-protocol3.c:436 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "se ha recibido una respuesta inesperada del servidor; el primer carácter recibido fue «%c»\n" -#: fe-protocol3.c:475 +#: fe-protocol3.c:461 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "el contenido del mensaje no concuerda con el largo, en el mensaje tipo «%c»\n" -#: fe-protocol3.c:495 +#: fe-protocol3.c:481 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "se perdió la sincronía con el servidor: se recibió un mensaje de tipo «%c», largo %d\n" -#: fe-protocol3.c:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "datos insuficientes en el mensaje «T»" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "no hay suficiente memoria para el resultado de la consulta" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "datos insuficientes en el mensaje «t»" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "datos insuficientes en el mensaje «D»" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "cantidad de campos inesperada en mensaje «D»" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "no hay mensaje de error disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " en el carácter %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DETALLE: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "SUGERENCIA: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "CONSULTA: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTO: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOMBRE DE ESQUEMA: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOMBRE DE TABLA: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOMBRE DE COLUMNA: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOMBRE TIPO DE DATO: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOMBRE DE RESTRICCIÓN: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "UBICACIÓN: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "LÍNEA %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: no se está haciendo COPY OUT de texto\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "error de protocolo: no hay resultado de función\n" + +#: fe-protocol3.c:2151 #, c-format msgid "protocol error: id=0x%x\n" msgstr "error de protocolo: id=0x%x\n" -#: fe-secure-common.c:124 +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "el elemento de nombre en el certificado SSL contiene un carácter 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 "el certificado contiene una dirección IP con largo %lu no válido\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "no se pudo convertir la dirección IP del certificado a cadena: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "el nombre de servidor debe ser especificado para una conexión SSL verificada\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 "el certificado de servidor para «%s» no coincide con el nombre de servidor «%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 "no se pudo obtener el nombre de servidor desde el certificado del servidor\n" @@ -1034,77 +1060,81 @@ msgstr "error de verificación de tamaño GSSAPI" msgid "GSSAPI context establishment error" msgstr "error de establecimiento de contexto de GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1372 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1504 #, c-format msgid "SSL SYSCALL error: %s\n" msgstr "ERROR en llamada SSL: %s\n" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1508 msgid "SSL SYSCALL error: EOF detected\n" msgstr "ERROR en llamada SSL: detectado fin de archivo\n" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1385 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1517 #, c-format msgid "SSL error: %s\n" msgstr "error de 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 conexión SSL se ha cerrado inesperadamente\n" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1435 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1567 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "código de error SSL no reconocido: %d\n" -#: fe-secure-openssl.c:405 +#: fe-secure-openssl.c:414 msgid "could not determine server certificate signature algorithm\n" msgstr "no se pudo determinar el algoritmo de firma del certificado del servidor\n" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:435 #, c-format msgid "could not find digest for NID %s\n" msgstr "no se pudo encontrar «digest» para el NID %s\n" -#: fe-secure-openssl.c:436 +#: fe-secure-openssl.c:445 msgid "could not generate peer certificate hash\n" msgstr "no se pudo generar hash de certificado de la contraparte\n" -#: fe-secure-openssl.c:493 +#: fe-secure-openssl.c:502 msgid "SSL certificate's name entry is missing\n" msgstr "falta el elemento de nombre en el certificado SSL\n" -#: fe-secure-openssl.c:827 +#: fe-secure-openssl.c:537 +msgid "SSL certificate's address entry is missing\n" +msgstr "falta el elemento de dirección en el certificado SSL\n" + +#: fe-secure-openssl.c:955 #, c-format msgid "could not create SSL context: %s\n" msgstr "no se pudo crear un contexto SSL: %s\n" -#: fe-secure-openssl.c:866 +#: fe-secure-openssl.c:994 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "valor entero «%s» no válido para la versión mínima del protocolo SSL\n" -#: fe-secure-openssl.c:877 +#: fe-secure-openssl.c:1005 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "no se pudo definir la versión mínima de protocolo SSL: %s\n" -#: fe-secure-openssl.c:895 +#: fe-secure-openssl.c:1023 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "valor entero «%s» no válido para la versión máxima del protocolo SSL\n" -#: fe-secure-openssl.c:906 +#: fe-secure-openssl.c:1034 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "no se pudo definir la versión máxima de protocolo SSL: %s\n" -#: fe-secure-openssl.c:942 +#: fe-secure-openssl.c:1070 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "no se pudo leer la lista de certificado raíz «%s»: %s\n" -#: fe-secure-openssl.c:995 +#: fe-secure-openssl.c:1123 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" @@ -1112,7 +1142,7 @@ msgstr "" "no se pudo obtener el directorio «home» para ubicar el archivo del certificado raíz\n" "Debe ya sea entregar este archivo, o bien cambiar sslmode para deshabilitar la verificación de certificados del servidor.\n" -#: fe-secure-openssl.c:999 +#: fe-secure-openssl.c:1127 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1121,92 +1151,97 @@ msgstr "" "el archivo de certificado raíz «%s» no existe\n" "Debe ya sea entregar este archivo, o bien cambiar sslmode para deshabilitar la verificación de certificados del servidor.\n" -#: fe-secure-openssl.c:1030 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "no se pudo abrir el archivo de certificado «%s»: %s\n" -#: fe-secure-openssl.c:1049 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "no se pudo leer el archivo de certificado «%s»: %s\n" -#: fe-secure-openssl.c:1074 +#: fe-secure-openssl.c:1202 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "no se pudo establecer conexión SSL: %s\n" -#: fe-secure-openssl.c:1108 +#: fe-secure-openssl.c:1236 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" msgstr "no se pudo establecer el Indicador de Nombre del Servidor (SNI) de SSL: %s\n" -#: fe-secure-openssl.c:1154 +#: fe-secure-openssl.c:1282 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "no se pudo cargar el motor SSL «%s»: %s\n" -#: fe-secure-openssl.c:1166 +#: fe-secure-openssl.c:1294 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "no se pudo inicializar el motor SSL «%s»: %s\n" -#: fe-secure-openssl.c:1182 +#: fe-secure-openssl.c:1310 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "no se pudo leer el archivo de la llave privada SSL «%s» desde el motor «%s»: %s\n" -#: fe-secure-openssl.c:1196 +#: fe-secure-openssl.c:1324 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" msgstr "no se pudo leer la llave privada SSL «%s» desde el motor «%s»: %s\n" -#: fe-secure-openssl.c:1233 +#: fe-secure-openssl.c:1362 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "el certificado está presente, pero no la llave privada «%s»\n" -#: fe-secure-openssl.c:1242 +#: fe-secure-openssl.c:1366 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "no se pudo hacer stat del archivo de la llave privada «%s»: %m\n" + +#: fe-secure-openssl.c:1375 #, c-format msgid "private key file \"%s\" is not a regular file\n" msgstr "el archivo de llave privada «%s» no es un archivo regular\n" -#: fe-secure-openssl.c:1275 +#: fe-secure-openssl.c:1408 #, 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 "el archivo de llave privada «%s» tiene acceso de grupo o para todos; debe tener permisos u=rw (0600) o menos si es de propiedad del usuario de base de datos, o permisos u=rw,g=r (0640) o menos si es de root\n" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1433 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "no se pudo cargar el archivo de la llave privada «%s»: %s\n" -#: fe-secure-openssl.c:1318 +#: fe-secure-openssl.c:1450 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "el certificado no coincide con la llave privada «%s»: %s\n" -#: fe-secure-openssl.c:1418 +#: fe-secure-openssl.c:1550 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" -msgstr "Esto puede indicar que el servidor no soporta ninguna versión del protocolo SSL entre %s and %s.\n" +msgstr "Esto puede indicar que el servidor no soporta ninguna versión del protocolo SSL entre %s y %s.\n" -#: fe-secure-openssl.c:1454 +#: fe-secure-openssl.c:1586 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "el certificado no pudo ser obtenido: %s\n" -#: fe-secure-openssl.c:1560 +#: fe-secure-openssl.c:1692 #, c-format msgid "no SSL error reported" msgstr "código de error SSL no reportado" -#: fe-secure-openssl.c:1569 +#: fe-secure-openssl.c:1701 #, c-format msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: fe-secure-openssl.c:1817 +#: fe-secure-openssl.c:1956 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ADVERTENCIA: sslpassword truncada\n" @@ -1216,7 +1251,7 @@ msgstr "ADVERTENCIA: sslpassword truncada\n" msgid "could not receive data from server: %s\n" msgstr "no se pudo recibir datos del servidor: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "no se pudo enviar datos al servidor: %s\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/fr.po b/third_party/spanner_pg/src/interfaces/libpq/po/fr.po index b67f3eb2..d1fbd9b4 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/fr.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/fr.po @@ -1,116 +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: 2022-07-18 13:25+0000\n" -"PO-Revision-Date: 2022-07-18 17:18+0200\n" +"POT-Creation-Date: 2022-09-26 08:10+0000\n" +"PO-Revision-Date: 2022-09-26 14:05+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 3.1\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.1.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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4711 fe-connect.c:4972 fe-connect.c:5091 fe-connect.c:5343 -#: fe-connect.c:5424 fe-connect.c:5523 fe-connect.c:5779 fe-connect.c:5808 -#: fe-connect.c:5880 fe-connect.c:5904 fe-connect.c:5922 fe-connect.c:6023 -#: fe-connect.c:6032 fe-connect.c:6390 fe-connect.c:6540 fe-connect.c:6806 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4082 fe-exec.c:4247 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "mémoire épuisée" + +#: fe-auth-scram.c:943 +msgid "could not generate random salt" +msgstr "n'a pas pu générer le sel aléatoire" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -120,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: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 "le nom d'hôte doit être précisé\n" @@ -153,484 +179,478 @@ 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 d'erreur %lu\n" -#: fe-auth.c:1117 fe-connect.c:2856 -#, 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:2861 -#, 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" - -#: 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:1094 +#: 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" -#: fe-connect.c:1180 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "n'a pas pu faire correspondre les %d numéros de port aux %d hôtes\n" -#: fe-connect.c:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "valeur %s invalide : « %s »\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "valeur sslmode « %s » invalide si le support SSL n'est pas compilé initialement\n" -#: fe-connect.c:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "intervalle de version invalide pour le protocole SSL\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "valeur gssencmode « %s » invalide si le support GSSAPI n'est pas compilé\n" -#: fe-connect.c:1653 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "n'a pas pu activer le mode TCP sans délai pour la socket : %s\n" -#: fe-connect.c:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "la connexion au serveur sur le socket « %s » a échoué : " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "la connexion au serveur sur « %s » (%s), port %s a échoué : " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "la connexion au serveur sur « %s », port %s a échoué : " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "\tLe serveur est-il actif localement et accepte-t-il les connexions sur ce socket ?\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "\tLe serveur est-il actif sur cet hôte et accepte-t-il les connexions ?\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, c-format 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:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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:1995 +#: 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:2310 +#: 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:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "numéro de port invalide : « %s »\n" -#: fe-connect.c:2405 +#: 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:2418 +#: 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:2431 +#: 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:2446 +#: 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:2572 +#: 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:2603 +#: 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:2613 +#: 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:2631 +#: 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:2772 +#: 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:2800 +#: 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:2842 +#: 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:2845 +#: 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:2869 +#: 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" -#: fe-connect.c:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "n'a pas pu transmettre le paquet de négociation GSSAPI : %s\n" -#: fe-connect.c:2921 +#: 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 "le chiffrage avec GSSAPI était requis, mais impossible (potentiellement pas de cache, de support serveur ou de socket local)\n" -#: fe-connect.c:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "n'a pas pu transmettre le paquet de négociation SSL : %s\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "n'a pas pu transmettre le paquet de démarrage : %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "le serveur ne supporte pas SSL alors que SSL était réclamé\n" -#: fe-connect.c:3097 +#: fe-connect.c:3093 #, c-format 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:3118 +#: 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:3199 +#: 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:3211 +#: 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:3230 +#: 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:3290 fe-connect.c:3315 +#: 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:3522 +#: 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:3614 +#: fe-connect.c:3610 msgid "session is read-only\n" msgstr "la session est en lecture seule\n" -#: fe-connect.c:3617 +#: fe-connect.c:3613 msgid "session is not read-only\n" msgstr "la session n'est pas en lecture seule\n" -#: fe-connect.c:3671 +#: 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:3674 +#: 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:3792 fe-connect.c:3844 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format msgid "\"%s\" failed\n" msgstr "échec de « %s »\n" -#: fe-connect.c:3858 +#: 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:4304 fe-connect.c:4364 -#, 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:4724 +#: 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:4739 +#: 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:4751 fe-connect.c:4809 +#: 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:4763 fe-connect.c:4825 +#: 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:4775 +#: 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:4797 +#: 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:4835 +#: 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:4911 +#: 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:4922 +#: 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:4923 fe-connect.c:4935 +#: 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:4946 fe-connect.c:4959 +#: 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:5011 fe-connect.c:5030 fe-connect.c:5562 +#: 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:5103 fe-connect.c:5747 fe-connect.c:6523 +#: 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:5119 fe-connect.c:5611 +#: 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:5200 +#: 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:5226 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "fichier de service « %s » introuvable\n" -#: fe-connect.c:5240 +#: 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:5311 fe-connect.c:5355 +#: 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:5322 +#: 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:6043 +#: 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:6120 +#: 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:6127 +#: 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:6142 +#: 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:6272 +#: 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:6292 +#: 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:6344 +#: 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:6418 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "jeton encodé en pourcentage invalide : « %s »\n" -#: fe-connect.c:6428 +#: 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:6798 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "le pointeur de connexion est NULL\n" -#: fe-connect.c:7086 +#: 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:7095 +#: 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 "" @@ -638,149 +658,144 @@ msgstr "" "lecture pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" "ou inférieur\n" -#: fe-connect.c:7203 +#: 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:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, 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:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "mémoire épuisée" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "échec en écriture vers le serveur\n" -#: fe-exec.c:864 +#: 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:922 +#: 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:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "saturation de size_t" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "la chaîne de commande est un pointeur nul\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s non autorisé dans le mode pipeline\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, 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:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "le nom de l'instruction est un pointeur nul\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "aucune connexion au serveur\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "une autre commande est déjà en cours\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "ne peut pas mettre en queue les commandes lors du COPY\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 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:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "asyncStatus inattendu : %d\n" -#: fe-exec.c:2185 -#, 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:2333 +#: fe-exec.c:2347 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:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY terminé par un nouveau PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec non autorisé pendant COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "aucun COPY en cours\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn non autorisé dans le mode pipeline\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "connexion dans un état erroné\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "ne peut pas entrer dans le mode pipeline, connexion active\n" -#: fe-exec.c:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 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:2996 +#: fe-exec.c:3009 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:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "ne peut pas sortir du mode pipeline pendant un COPY\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 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:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "code ExecStatusType invalide" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult n'est pas un résultat d'erreur\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, 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:3405 +#: fe-exec.c:3424 #, 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:3715 +#: fe-exec.c:3735 #, 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:3975 fe-exec.c:4064 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "caractère multi-octet incomplet\n" @@ -789,8 +804,8 @@ 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" @@ -807,22 +822,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" @@ -842,8 +857,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" @@ -853,15 +869,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" @@ -871,148 +887,162 @@ 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:407 +#: fe-protocol3.c:393 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:450 +#: fe-protocol3.c:436 #, 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:475 +#: fe-protocol3.c:461 #, 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:495 +#: fe-protocol3.c:481 #, 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:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "données insuffisantes dans le message « T »" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "mémoire épuisée pour le résultat de la requête" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "données insuffisantes dans le message « t »" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "données insuffisantes dans le message « D »" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "nombre de champs inattendu dans le message « D »" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "aucun message d'erreur disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " au caractère %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DÉTAIL : %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "ASTUCE : %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "REQUÊTE : %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTE : %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOM DE SCHÉMA : %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOM DE TABLE : %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOM DE COLONNE : %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOM DU TYPE DE DONNÉES : %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOM DE CONTRAINTE : %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "EMPLACEMENT : " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s : %s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "LIGNE %d : " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 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:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "erreur de protocole : aucun résultat de fonction\n" + +#: fe-protocol3.c:2151 #, 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" @@ -1054,77 +1084,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:1367 +#: 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:1371 +#: 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:1380 +#: 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:1430 +#: 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" @@ -1133,7 +1167,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" @@ -1143,92 +1177,97 @@ 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:1237 +#: fe-secure-openssl.c:1361 +#, c-format +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: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:1270 +#: 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:1295 +#: 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:1313 +#: 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:1413 +#: 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:1449 +#: 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:1555 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "code d'erreur SSL %lu" -#: fe-secure-openssl.c:1812 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ATTENTION : sslpassword tronqué\n" @@ -1238,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" @@ -1263,6 +1302,14 @@ msgstr "erreur de socket non reconnue : 0x%08X/%d" #~ msgid "Kerberos 5 authentication rejected: %*s\n" #~ msgstr "authentification Kerberos 5 rejetée : %*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" + +#, 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 "SSL library does not support CRL certificates (file \"%s\")\n" #~ msgstr "la bibliothèque SSL ne supporte pas les certificats CRL (fichier « %s »)\n" @@ -1317,10 +1364,6 @@ msgstr "erreur de socket non reconnue : 0x%08X/%d" #~ "\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 "could not encrypt password: %s\n" -#~ msgstr "n'a pas pu chiffré le mot de passe : %s\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" @@ -1369,6 +1412,9 @@ msgstr "erreur de socket non reconnue : 0x%08X/%d" #~ msgid "failed to generate nonce\n" #~ msgstr "échec pour la génération de nonce\n" +#~ msgid "failed to generate random salt" +#~ msgstr "a échoué à générer le sel aléatoire" + #~ msgid "function requires at least protocol version 3.0\n" #~ msgstr "la fonction nécessite au minimum le protocole 3.0\n" @@ -1396,6 +1442,10 @@ msgstr "erreur de socket non reconnue : 0x%08X/%d" #~ msgid "invalid target_session_attrs value: \"%s\"\n" #~ msgstr "valeur target_session_attrs invalide : « %s »\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 "lost synchronization with server, resetting connection" #~ msgstr "synchronisation perdue avec le serveur, réinitialisation de la connexion" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/it.po b/third_party/spanner_pg/src/interfaces/libpq/po/it.po new file mode 100644 index 00000000..fbc68ce6 --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/libpq/po/it.po @@ -0,0 +1,1385 @@ +# +# libpq.po +# Italian message translation file for libpq +# +# For development and bug report please use: +# https://github.com/dvarrazzo/postgresql-it +# +# Copyright (C) 2012-2017 PostgreSQL Global Development Group +# Copyright (C) 2010, Associazione Culturale ITPUG +# +# Daniele Varrazzo , 2012-2017 +# Maurizio Totti , 2010 +# Fabrizio Mazzoni , 2003. +# Gaetano Mendola , 2003. +# +# This file is distributed under the same license as the PostgreSQL package. +# +msgid "" +msgstr "" +"Project-Id-Version: libpq (PostgreSQL) 11\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:10+0000\n" +"PO-Revision-Date: 2022-10-03 14:22+0200\n" +"Last-Translator: Daniele Varrazzo \n" +"Language-Team: https://github.com/dvarrazzo/postgresql-it\n" +"Language: it\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-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 3.1.1\n" + +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "impossibile cercare l'ID utente locale %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "l'utente locale con ID %d non esiste" + +#: fe-auth-scram.c:231 +msgid "malformed SCRAM message (empty message)\n" +msgstr "messaggio SCRAM malformato (messaggio vuoto)\n" + +#: fe-auth-scram.c:237 +msgid "malformed SCRAM message (length mismatch)\n" +msgstr "messaggio SCRAM malformato (lunghezza errata)\n" + +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "impossibile verificare la firma del server: %s\n" + +#: fe-auth-scram.c:288 +msgid "incorrect server signature\n" +msgstr "firma del server non corretta\n" + +#: fe-auth-scram.c:297 +msgid "invalid SCRAM exchange state\n" +msgstr "stato di scambio SCRAM non valido\n" + +#: fe-auth-scram.c:324 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)\n" +msgstr "messaggio SCRAM malformato (atteso attributo \"%c\")\n" + +#: fe-auth-scram.c:333 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" +msgstr "messaggio SCRAM malformato (atteso carattere \"=\" per l'attributo \"%c\")\n" + +#: fe-auth-scram.c:374 +msgid "could not generate nonce\n" +msgstr "generazione del nonce fallita\n" + +#: 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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 "memoria esaurita\n" + +#: fe-auth-scram.c:392 +msgid "could not encode nonce\n" +msgstr "non è stato possibile codificare nonce\n" + +#: fe-auth-scram.c:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "impossibile calcolare la prova del cliente: %s\n" + +#: fe-auth-scram.c:599 +msgid "could not encode client proof\n" +msgstr "non è stato possibile codificare la prova del client\n" + +#: fe-auth-scram.c:654 +msgid "invalid SCRAM response (nonce mismatch)\n" +msgstr "risposta SCRAM non valida (il nonce non combacia)\n" + +#: fe-auth-scram.c:687 +msgid "malformed SCRAM message (invalid salt)\n" +msgstr "messaggio SCRAM non corretto (sale non valido)\n" + +#: fe-auth-scram.c:701 +msgid "malformed SCRAM message (invalid iteration count)\n" +msgstr "messaggio SCRAM malformato (numero di iterazione non valido)\n" + +#: fe-auth-scram.c:707 +msgid "malformed SCRAM message (garbage at end of server-first-message)\n" +msgstr "messaggio SCRAM malformato (dati non riconosciuti dopo il primo messaggio del server)\n" + +#: fe-auth-scram.c:743 +#, c-format +msgid "error received from server in SCRAM exchange: %s\n" +msgstr "errore ricevuto dal server durante lo scambio SCRAM: %s\n" + +#: fe-auth-scram.c:759 +msgid "malformed SCRAM message (garbage at end of server-final-message)\n" +msgstr "messaggio SCRAM malformato (dati non riconosciuti dopo il messaggio finale del server)\n" + +#: fe-auth-scram.c:778 +msgid "malformed SCRAM message (invalid server signature)\n" +msgstr "messaggio SCRAM malformato (firma del server non valida)\n" + +#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "memoria esaurita" + +#: fe-auth-scram.c:943 +msgid "could not generate random salt" +msgstr "errore nella generazione del sale casuale" + +#: fe-auth.c:76 +#, c-format +msgid "out of memory allocating GSSAPI buffer (%d)\n" +msgstr "memoria esaurita nell'allocazione del buffer GSSAPI (%d)\n" + +# DV: non ne sono convinto +#: fe-auth.c:131 +msgid "GSSAPI continuation error" +msgstr "GSSAPI errore di continuazione" + +#: 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 "il nome dell'host deve essere specificato\n" + +#: fe-auth.c:165 +msgid "duplicate GSS authentication request\n" +msgstr "richiesta di autenticazione GSS duplicata\n" + +#: fe-auth.c:230 +#, c-format +msgid "out of memory allocating SSPI buffer (%d)\n" +msgstr "memoria esaurita nell'allocazione del buffer SSPI (%d)\n" + +#: fe-auth.c:278 +msgid "SSPI continuation error" +msgstr "SSPI errore di continuazione" + +#: fe-auth.c:351 +msgid "duplicate SSPI authentication request\n" +msgstr "richiesta di autenticazione SSPI duplicata\n" + +#: fe-auth.c:377 +msgid "could not acquire SSPI credentials" +msgstr "non è stato possibile ottenere le credenziali SSPI" + +#: fe-auth.c:433 +msgid "channel binding required, but SSL not in use\n" +msgstr "associazione di canale richiesta, ma SSL non in uso\n" + +#: fe-auth.c:440 +msgid "duplicate SASL authentication request\n" +msgstr "doppia richiesta di autenticazione SASL\n" + +#: fe-auth.c:499 +msgid "channel binding is required, but client does not support it\n" +msgstr "è richiesto il binding del canale, ma il client non lo supporta\n" + +#: fe-auth.c:516 +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" +msgstr "il server ha offerto autenticazione SCRAM-SHA-256-PLUS su una connessione non SSL\n" + +#: fe-auth.c:531 +msgid "none of the server's SASL authentication mechanisms are supported\n" +msgstr "nessuno dei meccanismi di autenticazione SASL del server è supportato\n" + +#: fe-auth.c:539 +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" +msgstr "è richiesto il binding del canale, ma il server non ha offerto un metodo di autenticazione che supporta il binding del canale\n" + +#: fe-auth.c:647 +#, c-format +msgid "out of memory allocating SASL buffer (%d)\n" +msgstr "memoria esaurita nell'allocazione del buffer SASL (%d)\n" + +#: fe-auth.c:672 +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" +msgstr "Ricevuto AuthenticationSASLFinal dal server, ma l'autenticazione SASL non è stata completata\n" + +#: fe-auth.c:683 +msgid "no client response found after SASL exchange success\n" +msgstr "nessuna risposta client trovata dopo il successo dello scambio SASL\n" + +#: fe-auth.c:765 +msgid "SCM_CRED authentication method not supported\n" +msgstr "il metodo di autenticazione SCM_CRED non è supportato\n" + +#: 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 "impossibile crittografare la password: %s\n" + +#: fe-auth.c:868 +msgid "channel binding required, but server authenticated client without channel binding\n" +msgstr "associazione di canale richiesta, ma client autenticato dal server senza associazione di canale\n" + +#: fe-auth.c:874 +msgid "channel binding required but not supported by server's authentication request\n" +msgstr "associazione di canale richiesta ma non supportata dalla richiesta di autenticazione del server\n" + +#: fe-auth.c:909 +msgid "Kerberos 4 authentication not supported\n" +msgstr "L'autenticazione Kerberos 4 non è supportata\n" + +#: fe-auth.c:914 +msgid "Kerberos 5 authentication not supported\n" +msgstr "L'autenticazione Kerberos 5 non è supportata\n" + +#: fe-auth.c:985 +msgid "GSSAPI authentication not supported\n" +msgstr "l'autenticazione GSSAPI non è supportata\n" + +#: fe-auth.c:1017 +msgid "SSPI authentication not supported\n" +msgstr "l'autenticazione SSPI non è supportata\n" + +#: fe-auth.c:1025 +msgid "Crypt authentication not supported\n" +msgstr "L'autenticazione Crypt non è supportata\n" + +#: fe-auth.c:1092 +#, c-format +msgid "authentication method %u not supported\n" +msgstr "l'autenticazione %u non è supportata\n" + +#: fe-auth.c:1138 +#, c-format +msgid "user name lookup failure: error code %lu\n" +msgstr "ricerca del nome utente fallita: codice di errore %lu\n" + +#: fe-auth.c:1264 +msgid "unexpected shape of result set returned for SHOW\n" +msgstr "il risultato restituito da SHOW ha una forma imprevista\n" + +#: fe-auth.c:1273 +msgid "password_encryption value too long\n" +msgstr "valore di password_encryption troppo lungo\n" + +#: fe-auth.c:1327 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"\n" +msgstr "algoritmo di criptaggio della password \"%s\" sconosciuto\n" + +#: fe-connect.c:1090 +#, c-format +msgid "could not match %d host names to %d hostaddr values\n" +msgstr "non è possibile far combaciare %d nomi host con %d valori hostaddr\n" + +#: fe-connect.c:1176 +#, c-format +msgid "could not match %d port numbers to %d hosts\n" +msgstr "non è possibile far combaciare %d numeri di porta con %d host\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 +#, c-format +msgid "invalid %s value: \"%s\"\n" +msgstr "valore %s non valido: \"%s\"\n" + +#: fe-connect.c:1316 +#, c-format +msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" +msgstr "valore sslmode \"%s\" non valido quando il supporto SSL non è compilato\n" + +#: fe-connect.c:1364 +msgid "invalid SSL protocol version range\n" +msgstr "intervallo di versioni del protocollo SSL non valido\n" + +#: fe-connect.c:1389 +#, c-format +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" +msgstr "valore gssencmode \"%s\" non valido quando il supporto GSSAPI non è compilato\n" + +#: fe-connect.c:1649 +#, c-format +msgid "could not set socket to TCP no delay mode: %s\n" +msgstr "impostazione del socket in modalità TCP no delay fallita: %s\n" + +#: fe-connect.c:1711 +#, c-format +msgid "connection to server on socket \"%s\" failed: " +msgstr "connessione al server sul socket \"%s\" non riuscita: " + +#: fe-connect.c:1738 +#, c-format +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "connessione al server su \"%s\" (%s), porta %s non riuscita: " + +#: fe-connect.c:1743 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "connessione al server su \"%s\", porta %s non riuscita: " + +#: fe-connect.c:1768 +msgid "\tIs the server running locally and accepting connections on that socket?\n" +msgstr "\tIl server è in esecuzione localmente e accetta connessioni su quel socket?\n" + +#: fe-connect.c:1772 +msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\tIl server è in esecuzione su quell'host e accetta connessioni TCP/IP?\n" + +#: fe-connect.c:1836 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"\n" +msgstr "valore intero non valido \"%s\" per l'opzione di connessione \"%s\"\n" + +#: 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 "%s(%s) fallito: %s\n" + +#: fe-connect.c:2002 +#, c-format +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) non riuscito: codice di errore %d\n" + +#: fe-connect.c:2317 +msgid "invalid connection state, probably indicative of memory corruption\n" +msgstr "stato della connessione non valido, probabilmente indica una corruzione della memoria\n" + +#: fe-connect.c:2396 +#, c-format +msgid "invalid port number: \"%s\"\n" +msgstr "numero di porta non valido: \"%s\"\n" + +#: fe-connect.c:2412 +#, c-format +msgid "could not translate host name \"%s\" to address: %s\n" +msgstr "conversione del nome host \"%s\" in indirizzo fallita: %s\n" + +#: fe-connect.c:2425 +#, c-format +msgid "could not parse network address \"%s\": %s\n" +msgstr "interpretazione dell'indirizzo di rete \"%s\" fallita: %s\n" + +#: fe-connect.c:2438 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" +msgstr "Il percorso del socket di dominio unix \"%s\" è troppo lungo (massimo %d byte)\n" + +#: fe-connect.c:2453 +#, c-format +msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" +msgstr "conversione del percorso del socket di dominio Unix \"%s\" in indirizzo fallita: %s\n" + +#: fe-connect.c:2579 +#, c-format +msgid "could not create socket: %s\n" +msgstr "creazione del socket fallita: %s\n" + +#: fe-connect.c:2610 +#, c-format +msgid "could not set socket to nonblocking mode: %s\n" +msgstr "impostazione del socket in modalità non bloccante fallita: %s\n" + +#: fe-connect.c:2620 +#, c-format +msgid "could not set socket to close-on-exec mode: %s\n" +msgstr "impostazione del socket in modalità close-on-exec fallita: %s\n" + +#: fe-connect.c:2638 +msgid "keepalives parameter must be an integer\n" +msgstr "il parametro keepalives dev'essere un intero\n" + +#: fe-connect.c:2779 +#, c-format +msgid "could not get socket error status: %s\n" +msgstr "lettura dello stato di errore del socket fallita: %s\n" + +#: fe-connect.c:2807 +#, c-format +msgid "could not get client address from socket: %s\n" +msgstr "non è stato possibile ottenere l'indirizzo del client dal socket: %s\n" + +#: fe-connect.c:2846 +msgid "requirepeer parameter is not supported on this platform\n" +msgstr "il parametro requirepeer non è supportato su questa piattaforma\n" + +#: fe-connect.c:2849 +#, c-format +msgid "could not get peer credentials: %s\n" +msgstr "non è stato possibile ottenere le credenziali del peer: %s\n" + +#: fe-connect.c:2863 +#, c-format +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" +msgstr "requirepeer specifica \"%s\", ma il vero nome utente del peer è \"%s\"\n" + +#: fe-connect.c:2905 +#, c-format +msgid "could not send GSSAPI negotiation packet: %s\n" +msgstr "impossibile inviare il pacchetto di negoziazione GSSAPI: %s\n" + +#: 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 "Crittografia GSSAPI richiesta ma impossibile (probabilmente nessuna cache delle credenziali, nessun supporto per il server o utilizzo di un socket locale)\n" + +#: fe-connect.c:2959 +#, c-format +msgid "could not send SSL negotiation packet: %s\n" +msgstr "invio del pacchetto di negoziazione SSL fallito: %s\n" + +#: fe-connect.c:2990 +#, c-format +msgid "could not send startup packet: %s\n" +msgstr "invio del pacchetto di avvio fallito: %s\n" + +#: fe-connect.c:3066 +msgid "server does not support SSL, but SSL was required\n" +msgstr "il server non supporta SSL, ma SSL è stato richiesto\n" + +#: fe-connect.c:3093 +#, c-format +msgid "received invalid response to SSL negotiation: %c\n" +msgstr "ricevuta risposta errata alla negoziazione SSL: %c\n" + +#: fe-connect.c:3114 +msgid "received unencrypted data after SSL response\n" +msgstr "ricevuto dati non crittografati dopo la risposta SSL\n" + +#: fe-connect.c:3195 +msgid "server doesn't support GSSAPI encryption, but it was required\n" +msgstr "il server non supporta la crittografia GSSAPI, ma era richiesta\n" + +#: fe-connect.c:3207 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c\n" +msgstr "ha ricevuto una risposta non valida alla negoziazione GSSAPI: %c\n" + +#: fe-connect.c:3226 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "ha ricevuto dati non crittografati dopo la risposta della crittografia GSSAPI\n" + +#: fe-connect.c:3286 fe-connect.c:3311 +#, c-format +msgid "expected authentication request from server, but received %c\n" +msgstr "prevista richiesta di autenticazione dal server, ma è stato ricevuto %c\n" + +#: fe-connect.c:3518 +msgid "unexpected message from server during startup\n" +msgstr "messaggio imprevisto dal server durante l'avvio\n" + +#: fe-connect.c:3610 +msgid "session is read-only\n" +msgstr "la sessione è di sola lettura\n" + +#: fe-connect.c:3613 +msgid "session is not read-only\n" +msgstr "la sessione non è di sola lettura\n" + +#: fe-connect.c:3667 +msgid "server is in hot standby mode\n" +msgstr "il server è in modalità hot standby\n" + +#: fe-connect.c:3670 +msgid "server is not in hot standby mode\n" +msgstr "il server non è in modalità hot standby\n" + +#: fe-connect.c:3788 fe-connect.c:3840 +#, c-format +msgid "\"%s\" failed\n" +msgstr "\"%s\" non è riuscito\n" + +#: fe-connect.c:3854 +#, c-format +msgid "invalid connection state %d, probably indicative of memory corruption\n" +msgstr "stato connessione errato %d, probabilmente indica una corruzione di memoria\n" + +#: fe-connect.c:4837 +#, c-format +msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" +msgstr "URL LDAP \"%s\" non corretta: lo schema deve essere ldap://\n" + +#: fe-connect.c:4852 +#, c-format +msgid "invalid LDAP URL \"%s\": missing distinguished name\n" +msgstr "URL LDAP \"%s\" non corretta: distinguished name non trovato\n" + +#: 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\" non corretta: deve avere esattamente un attributo\n" + +#: 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\" non corretta: deve essere specificato la portata della ricerca (base/one/sub)\n" + +#: fe-connect.c:4888 +#, c-format +msgid "invalid LDAP URL \"%s\": no filter\n" +msgstr "URL LDAP \"%s\" non corretta: filtro non specificato\n" + +#: fe-connect.c:4910 +#, c-format +msgid "invalid LDAP URL \"%s\": invalid port number\n" +msgstr "URL LDAP \"%s\" non corretta: numero di porta non valido\n" + +#: fe-connect.c:4948 +msgid "could not create LDAP structure\n" +msgstr "creazione della struttura dati LDAP fallita\n" + +#: fe-connect.c:5024 +#, c-format +msgid "lookup on LDAP server failed: %s\n" +msgstr "ricerca del server LDAP fallita: %s\n" + +#: fe-connect.c:5035 +msgid "more than one entry found on LDAP lookup\n" +msgstr "trovata più di una voce nella ricerca LDAP\n" + +#: fe-connect.c:5036 fe-connect.c:5048 +msgid "no entry found on LDAP lookup\n" +msgstr "nessun elemento trovato per la ricerca LDAP\n" + +#: fe-connect.c:5059 fe-connect.c:5072 +msgid "attribute has no values on LDAP lookup\n" +msgstr "l'attributo non ha valori nella ricerca LDAP\n" + +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 +#, c-format +msgid "missing \"=\" after \"%s\" in connection info string\n" +msgstr "manca \"=\" dopo \"%s\" nella stringa di connessione\n" + +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 +#, c-format +msgid "invalid connection option \"%s\"\n" +msgstr "opzione di connessione errata \"%s\"\n" + +#: fe-connect.c:5232 fe-connect.c:5724 +msgid "unterminated quoted string in connection info string\n" +msgstr "stringa tra virgolette non terminata nella stringa di connessione\n" + +#: fe-connect.c:5313 +#, c-format +msgid "definition of service \"%s\" not found\n" +msgstr "il file di definizione di servizio \"%s\" non è stato trovato\n" + +#: fe-connect.c:5339 +#, c-format +msgid "service file \"%s\" not found\n" +msgstr "il file di servizio \"%s\" non è stato trovato\n" + +#: fe-connect.c:5353 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "la riga %d nel file di servizio \"%s\" è troppo lunga\n" + +#: fe-connect.c:5424 fe-connect.c:5468 +#, c-format +msgid "syntax error in service file \"%s\", line %d\n" +msgstr "errore di sintassi del file di servizio \"%s\", alla riga %d\n" + +#: fe-connect.c:5435 +#, c-format +msgid "nested service specifications not supported in service file \"%s\", line %d\n" +msgstr "specifiche di servizio annidate non supportate nel file di servizio \"%s\", linea %d\n" + +#: fe-connect.c:6156 +#, c-format +msgid "invalid URI propagated to internal parser routine: \"%s\"\n" +msgstr "URI invalida propagata alla routine di parsing interna: \"%s\"\n" + +#: fe-connect.c:6233 +#, c-format +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" +msgstr "fine stringa raggiunta cercando un \"]\" corrispondente nell'indirizzo host IPv6 nella URI: \"%s\"\n" + +#: fe-connect.c:6240 +#, c-format +msgid "IPv6 host address may not be empty in URI: \"%s\"\n" +msgstr "l'indirizzo host IPv6 non dev'essere assente nella URI: \"%s\"\n" + +#: fe-connect.c:6255 +#, c-format +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" +msgstr "carattere inatteso \"%c\" in posizione %d nella uri URI (atteso \":\" oppure \"/\"): \"%s\"\n" + +#: fe-connect.c:6385 +#, c-format +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" +msgstr "separatore chiave/valore \"=\" in eccesso nei parametri della URI: \"%s\"\n" + +#: fe-connect.c:6405 +#, c-format +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" +msgstr "separatore chiave/valore \"=\" mancante nei parametri della URI: \"%s\"\n" + +#: fe-connect.c:6457 +#, c-format +msgid "invalid URI query parameter: \"%s\"\n" +msgstr "parametro URI non valido: \"%s\"\n" + +#: fe-connect.c:6531 +#, c-format +msgid "invalid percent-encoded token: \"%s\"\n" +msgstr "simbolo percent-encoded non valido \"%s\"\n" + +#: fe-connect.c:6541 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" +msgstr "valore non ammesso %%00 nel valore percent-encoded: \"%s\"\n" + +#: fe-connect.c:6911 +msgid "connection pointer is NULL\n" +msgstr "il puntatore della connessione è NULL\n" + +#: fe-connect.c:7199 +#, c-format +msgid "WARNING: password file \"%s\" is not a plain file\n" +msgstr "ATTENZIONE: il file delle password \"%s\" non è un file regolare\n" + +#: 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 "" +"ATTENZIONE: Il file delle password %s ha privilegi di accesso in lettura e scrittura per tutti;\n" +"i permessi dovrebbero essere u=rw (0600) o inferiori\n" + +#: fe-connect.c:7316 +#, c-format +msgid "password retrieved from file \"%s\"\n" +msgstr "password ottenuta dal file \"%s\"\n" + +#: fe-exec.c:466 fe-exec.c:3402 +#, c-format +msgid "row number %d is out of range 0..%d" +msgstr "la riga numero %d non è compreso tra 0 e %d" + +#: fe-exec.c:528 fe-protocol3.c:1937 +#, c-format +msgid "%s" +msgstr "%s" + +#: fe-exec.c:836 +msgid "write to server failed\n" +msgstr "scrittura sul server non riuscita\n" + +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "nessun testo di errore disponibile\n" + +#: fe-exec.c:964 +msgid "NOTICE" +msgstr "NOTIFICA" + +#: fe-exec.c:1022 +msgid "PGresult cannot support more than INT_MAX tuples" +msgstr "PGresult non può supportare più di INT_MAX tuple" + +#: fe-exec.c:1034 +msgid "size_t overflow" +msgstr "overflow size_t" + +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 +msgid "command string is a null pointer\n" +msgstr "il testo del comando è un puntatore nullo\n" + +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s non consentito in modalità pipeline\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "il numero di parametri deve essere compreso tra 0 e %d\n" + +#: fe-exec.c:1562 fe-exec.c:1664 +msgid "statement name is a null pointer\n" +msgstr "il nome dell'istruzione è un puntatore nullo\n" + +#: fe-exec.c:1708 fe-exec.c:3255 +msgid "no connection to the server\n" +msgstr "nessuna connessione al server\n" + +#: fe-exec.c:1717 fe-exec.c:3264 +msgid "another command is already in progress\n" +msgstr "un altro comando è in esecuzione\n" + +#: fe-exec.c:1748 +msgid "cannot queue commands during COPY\n" +msgstr "impossibile mettere in coda i comandi durante la COPIA\n" + +#: fe-exec.c:1866 +msgid "length must be given for binary parameter\n" +msgstr "la lunghezza deve essere fornita per i parametri binari\n" + +#: fe-exec.c:2189 +#, c-format +msgid "unexpected asyncStatus: %d\n" +msgstr "asyncStatus imprevisto: %d\n" + +#: fe-exec.c:2347 +msgid "synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "le funzioni di esecuzione sincrona dei comandi non sono consentite in modalità pipeline\n" + +#: fe-exec.c:2364 +msgid "COPY terminated by new PQexec" +msgstr "COPY terminato da una nuova PQexec" + +# NON SONO ASSOLUTAMENTE CONVINTO! +#: fe-exec.c:2381 +msgid "PQexec not allowed during COPY BOTH\n" +msgstr "PQexec not consentito durante COPY BOTH\n" + +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 +msgid "no COPY in progress\n" +msgstr "nessun comando COPY in corso\n" + +#: fe-exec.c:2923 +msgid "connection in wrong state\n" +msgstr "la connessione è in uno stato errato\n" + +#: fe-exec.c:2967 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "impossibile entrare in modalità pipeline, connessione non inattiva\n" + +#: fe-exec.c:3004 fe-exec.c:3028 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "impossibile uscire dalla modalità pipeline con risultati non raccolti\n" + +#: fe-exec.c:3009 +msgid "cannot exit pipeline mode while busy\n" +msgstr "non può uscire dalla modalità pipeline mentre è occupato\n" + +#: fe-exec.c:3021 +msgid "cannot exit pipeline mode while in COPY\n" +msgstr "non è possibile uscire dalla modalità pipeline mentre si è in COPIA\n" + +#: fe-exec.c:3188 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "impossibile inviare pipeline quando non è in modalità pipeline\n" + +#: fe-exec.c:3291 +msgid "invalid ExecStatusType code" +msgstr "codice ExecStatusType errato" + +#: fe-exec.c:3318 +msgid "PGresult is not an error result\n" +msgstr "PGresult non è un risultato di errore\n" + +#: fe-exec.c:3386 fe-exec.c:3409 +#, c-format +msgid "column number %d is out of range 0..%d" +msgstr "la colonna numero %d non è compreso tra 0 e %d" + +#: fe-exec.c:3424 +#, c-format +msgid "parameter number %d is out of range 0..%d" +msgstr "il parametro numero %d non è compreso tra 0 e %d" + +#: fe-exec.c:3735 +#, c-format +msgid "could not interpret result from server: %s" +msgstr "errore nell'interpretazione del risultato dal server: %s" + +#: fe-exec.c:4001 fe-exec.c:4092 +msgid "incomplete multibyte character\n" +msgstr "carattere multibyte incompleto\n" + +# non è che mi torni tanto così +#: fe-gssapi-common.c:124 +msgid "GSSAPI name import error" +msgstr "errore di importazione del nome GSSAPI" + +#: 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 "impossibile determinare l'OID della funzione %s\n" + +#: fe-lobj.c:162 +msgid "argument of lo_truncate exceeds integer range\n" +msgstr "l'argomento di lo_truncate supera l'intervallo degli interi\n" + +#: fe-lobj.c:266 +msgid "argument of lo_read exceeds integer range\n" +msgstr "l'argomento di lo_read supera l'intervallo degli interi\n" + +#: fe-lobj.c:318 +msgid "argument of lo_write exceeds integer range\n" +msgstr "l'argomento di lo_write supera l'intervallo degli interi\n" + +#: fe-lobj.c:678 fe-lobj.c:791 +#, c-format +msgid "could not open file \"%s\": %s\n" +msgstr "apertura del file \"%s\" fallita: %s\n" + +#: fe-lobj.c:735 +#, c-format +msgid "could not read from file \"%s\": %s\n" +msgstr "lettura dal file \"%s\" fallita: %s\n" + +#: fe-lobj.c:813 fe-lobj.c:837 +#, c-format +msgid "could not write to file \"%s\": %s\n" +msgstr "scrittura nel file \"%s\" fallita: %s\n" + +#: fe-lobj.c:923 +msgid "query to initialize large object functions did not return data\n" +msgstr "la query per inizializzare le funzioni large object non hanno restituito dati\n" + +#: fe-misc.c:242 +#, c-format +msgid "integer of size %lu not supported by pqGetInt" +msgstr "intero di dimensione %lu non supportato da pqGetInt" + +#: fe-misc.c:275 +#, c-format +msgid "integer of size %lu not supported by pqPutInt" +msgstr "intero di dimensione %lu non supportato da pqPutInt" + +#: fe-misc.c:576 fe-misc.c:822 +msgid "connection not open\n" +msgstr "connessione non aperta\n" + +#: 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" +"\tbefore or while processing the request.\n" +msgstr "" +"il server ha chiuso la connessione inaspettatamente\n" +"\tQuesto probabilmente indica che il server ha terminato in modo anormale\n" +"\tprima o durante l'elaborazione della richiesta.\n" + +#: fe-misc.c:1008 +msgid "timeout expired\n" +msgstr "timeout scaduto\n" + +#: fe-misc.c:1053 +msgid "invalid socket\n" +msgstr "socket non valido\n" + +#: fe-misc.c:1076 +#, c-format +msgid "%s() failed: %s\n" +msgstr "%s() fallito: %s\n" + +#: fe-protocol3.c:184 +#, c-format +msgid "message type 0x%02x arrived from server while idle" +msgstr "messaggio tipo 0x%02x arrivato dal server mentre era inattivo" + +#: fe-protocol3.c:393 +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +msgstr "il server ha spedito dati (messaggio di tipo \"D\") senza prima il descrittore di riga (messaggio di tipo \"T\")\n" + +#: fe-protocol3.c:436 +#, c-format +msgid "unexpected response from server; first received character was \"%c\"\n" +msgstr "risposta inattesa dal server; il primo carattere ricevuto era \"%c\"\n" + +#: fe-protocol3.c:461 +#, c-format +msgid "message contents do not agree with length in message type \"%c\"\n" +msgstr "i contenuti del messaggio non sono in accordo con la lunghezza del tipo di messaggio \"%c\"\n" + +#: fe-protocol3.c:481 +#, c-format +msgid "lost synchronization with server: got message type \"%c\", length %d\n" +msgstr "persa la sincronizzazione con il server: ricevuto il tipo di messaggio \"%c\" di lunghezza %d\n" + +#: fe-protocol3.c:533 fe-protocol3.c:573 +msgid "insufficient data in \"T\" message" +msgstr "dati insufficienti nel messaggio di tipo \"T\"" + +#: fe-protocol3.c:644 fe-protocol3.c:850 +msgid "out of memory for query result" +msgstr "memoria esaurita per il risultato della query" + +#: fe-protocol3.c:713 +msgid "insufficient data in \"t\" message" +msgstr "dati insufficienti nel messaggio \"t\"" + +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 +msgid "insufficient data in \"D\" message" +msgstr "dati insufficienti nel messaggio di tipo \"D\"" + +#: fe-protocol3.c:778 +msgid "unexpected field count in \"D\" message" +msgstr "numero dei campi non previsto nel messaggio di tipo \"D\"" + +#: fe-protocol3.c:1034 +msgid "no error message available\n" +msgstr "nessun messaggio di errore disponibile\n" + +#. translator: %s represents a digit string +#: fe-protocol3.c:1082 fe-protocol3.c:1101 +#, c-format +msgid " at character %s" +msgstr " al carattere %s" + +#: fe-protocol3.c:1114 +#, c-format +msgid "DETAIL: %s\n" +msgstr "DETTAGLI: %s\n" + +#: fe-protocol3.c:1117 +#, c-format +msgid "HINT: %s\n" +msgstr "NOTA: %s\n" + +#: fe-protocol3.c:1120 +#, c-format +msgid "QUERY: %s\n" +msgstr "QUERY: %s\n" + +#: fe-protocol3.c:1127 +#, c-format +msgid "CONTEXT: %s\n" +msgstr "CONTESTO: %s\n" + +#: fe-protocol3.c:1136 +#, c-format +msgid "SCHEMA NAME: %s\n" +msgstr "NOME SCHEMA: %s\n" + +#: fe-protocol3.c:1140 +#, c-format +msgid "TABLE NAME: %s\n" +msgstr "NOME TABELLA: %s\n" + +#: fe-protocol3.c:1144 +#, c-format +msgid "COLUMN NAME: %s\n" +msgstr "NOME COLONNA: %s\n" + +#: fe-protocol3.c:1148 +#, c-format +msgid "DATATYPE NAME: %s\n" +msgstr "NOME TIPO DATI: %s\n" + +#: fe-protocol3.c:1152 +#, c-format +msgid "CONSTRAINT NAME: %s\n" +msgstr "NOME VINCOLO: %s\n" + +#: fe-protocol3.c:1164 +msgid "LOCATION: " +msgstr "POSIZIONE: " + +#: fe-protocol3.c:1166 +#, c-format +msgid "%s, " +msgstr "%s, " + +#: fe-protocol3.c:1168 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: fe-protocol3.c:1363 +#, c-format +msgid "LINE %d: " +msgstr "RIGA %d: " + +#: fe-protocol3.c:1762 +msgid "PQgetline: not doing text COPY OUT\n" +msgstr "PQgetline: COPY OUT testuale ignorato\n" + +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "errore di protocollo: nessun risultato di funzione\n" + +#: fe-protocol3.c:2151 +#, c-format +msgid "protocol error: id=0x%x\n" +msgstr "errore di protocollo: id=0x%x\n" + +#: fe-secure-common.c:126 +msgid "SSL certificate's name contains embedded null\n" +msgstr "Il nome del certificato SSL contiene null\n" + +#: fe-secure-common.c:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "il certificato contiene un indirizzo IP con lunghezza non valida %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "impossibile convertire l'indirizzo IP del certificato in stringa: %s\n" + +#: fe-secure-common.c:276 +msgid "host name must be specified for a verified SSL connection\n" +msgstr "il nome dell'host dev'essere specificato per una connessione SSL verificata\n" + +#: fe-secure-common.c:301 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"\n" +msgstr "il certificato per il server \"%s\" non combacia col nome host \"%s\"\n" + +#: fe-secure-common.c:307 +msgid "could not get server's host name from server certificate\n" +msgstr "impossibile ottenere il nome dell'host del server dal certificato del server\n" + +# non è che mi torni tanto così +#: fe-secure-gssapi.c:201 +msgid "GSSAPI wrap error" +msgstr "Errore di avvolgimento GSSAPI" + +#: fe-secure-gssapi.c:209 +msgid "outgoing GSSAPI message would not use confidentiality\n" +msgstr "il messaggio GSSAPI in uscita non utilizzerà la riservatezza\n" + +#: fe-secure-gssapi.c:217 +#, c-format +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" +msgstr "il client ha tentato di inviare un pacchetto GSSAPI di dimensioni eccessive (%zu > %zu)\n" + +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#, c-format +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" +msgstr "pacchetto GSSAPI sovradimensionato inviato dal server (%zu > %zu)\n" + +# non è che mi torni tanto così +#: fe-secure-gssapi.c:393 +msgid "GSSAPI unwrap error" +msgstr "Errore di annullamento del wrapping di GSSAPI" + +#: fe-secure-gssapi.c:403 +msgid "incoming GSSAPI message did not use confidentiality\n" +msgstr "il messaggio GSSAPI in arrivo non utilizzava la riservatezza\n" + +#: fe-secure-gssapi.c:642 +msgid "could not initiate GSSAPI security context" +msgstr "impossibile avviare il contesto di sicurezza GSSAPI" + +# non è che mi torni tanto così +#: fe-secure-gssapi.c:670 +msgid "GSSAPI size check error" +msgstr "Errore di controllo delle dimensioni GSSAPI" + +# DV: non ne sono convinto +#: fe-secure-gssapi.c:681 +msgid "GSSAPI context establishment error" +msgstr "Errore di creazione del contesto GSSAPI" + +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 +#, c-format +msgid "SSL SYSCALL error: %s\n" +msgstr "errore SSL SYSCALL: %s\n" + +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 +msgid "SSL SYSCALL error: EOF detected\n" +msgstr "errore SSL SYSCALL: rilevato EOF\n" + +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 +#, c-format +msgid "SSL error: %s\n" +msgstr "errore SSL: %s\n" + +#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 +msgid "SSL connection has been closed unexpectedly\n" +msgstr "la connessione SSL è stata chiusa inaspettatamente\n" + +#: 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 "codice di errore SSL sconosciuto: %d\n" + +#: fe-secure-openssl.c:409 +msgid "could not determine server certificate signature algorithm\n" +msgstr "impossibile determinare l'algoritmo di firma del certificato del server\n" + +#: fe-secure-openssl.c:430 +#, c-format +msgid "could not find digest for NID %s\n" +msgstr "impossibile trovare il digest per il NID %s\n" + +#: fe-secure-openssl.c:440 +msgid "could not generate peer certificate hash\n" +msgstr "impossibile generare l'hash del certificato del peer\n" + +#: fe-secure-openssl.c:497 +msgid "SSL certificate's name entry is missing\n" +msgstr "manca il nome del certificato SSL\n" + +#: fe-secure-openssl.c:532 +msgid "SSL certificate's address entry is missing\n" +msgstr "La voce dell'indirizzo del certificato SSL è mancante\n" + +#: fe-secure-openssl.c:950 +#, c-format +msgid "could not create SSL context: %s\n" +msgstr "creazione del contesto SSL fallita: %s\n" + +#: fe-secure-openssl.c:989 +#, c-format +msgid "invalid value \"%s\" for minimum SSL protocol version\n" +msgstr "valore \"%s\" non valido per la versione minima del protocollo SSL\n" + +#: fe-secure-openssl.c:1000 +#, c-format +msgid "could not set minimum SSL protocol version: %s\n" +msgstr "impossibile impostare la versione minima del protocollo SSL: %s\n" + +#: fe-secure-openssl.c:1018 +#, c-format +msgid "invalid value \"%s\" for maximum SSL protocol version\n" +msgstr "valore \"%s\" non valido per la versione massima del protocollo SSL\n" + +#: fe-secure-openssl.c:1029 +#, c-format +msgid "could not set maximum SSL protocol version: %s\n" +msgstr "impossibile impostare la versione massima del protocollo SSL: %s\n" + +#: fe-secure-openssl.c:1065 +#, c-format +msgid "could not read root certificate file \"%s\": %s\n" +msgstr "lettura del file di certificato radice \"%s\" fallita: %s\n" + +#: 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" +msgstr "" +"directory utente non trovata per la locazione del file di certificato radice\n" +"Per favore fornisci il file oppure cambia sslmode per disabilitare la verifica del certificato del server.\n" + +#: fe-secure-openssl.c:1122 +#, 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 "" +"il file \"%s\" del certificato radice non esiste\n" +"Per favore fornisci il file oppure cambia sslmode per disabilitare la verifica del certificato del server.\n" + +#: fe-secure-openssl.c:1153 +#, c-format +msgid "could not open certificate file \"%s\": %s\n" +msgstr "apertura del file di certificato \"%s\" fallita: %s\n" + +#: fe-secure-openssl.c:1172 +#, c-format +msgid "could not read certificate file \"%s\": %s\n" +msgstr "lettura del file di certificato \"%s\" fallita: %s\n" + +#: fe-secure-openssl.c:1197 +#, c-format +msgid "could not establish SSL connection: %s\n" +msgstr "non è stato possibile stabilire una connessione SSL: %s\n" + +#: fe-secure-openssl.c:1231 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "impossibile impostare l'indicazione del nome del server SSL (SNI): %s\n" + +#: fe-secure-openssl.c:1277 +#, c-format +msgid "could not load SSL engine \"%s\": %s\n" +msgstr "caricamento del motore SSL \"%s\" fallito: %s\n" + +#: fe-secure-openssl.c:1289 +#, c-format +msgid "could not initialize SSL engine \"%s\": %s\n" +msgstr "inizializzazione del motore SSL \"%s\" fallita: %s\n" + +#: fe-secure-openssl.c:1305 +#, c-format +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" +msgstr "lettura del file della chiave privata SSL \"%s\" dal motore \"%s\" fallita: %s\n" + +#: fe-secure-openssl.c:1319 +#, c-format +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" +msgstr "caricamento della chiave privata SSL \"%s\" dal motore \"%s\" fallito: %s\n" + +#: fe-secure-openssl.c:1357 +#, c-format +msgid "certificate present, but not private key file \"%s\"\n" +msgstr "certificato trovato, ma non la chiave privata \"%s\"\n" + +#: fe-secure-openssl.c:1361 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "impossibile stabilire il file della chiave privata \"%s\": %m\n" + +#: fe-secure-openssl.c:1370 +#, c-format +msgid "private key file \"%s\" is not a regular file\n" +msgstr "il file della chiave privata \"%s\" non è un file normale\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 "il file della chiave privata \"%s\" ha accesso di gruppo o mondiale; il file deve avere i permessi u=rw (0600) o meno se di proprietà dell'utente corrente, o i permessi u=rw,g=r (0640) o meno se di proprietà di root\n" + +#: fe-secure-openssl.c:1428 +#, c-format +msgid "could not load private key file \"%s\": %s\n" +msgstr "caricamento del file della chiave privata \"%s\" fallito: %s\n" + +#: fe-secure-openssl.c:1445 +#, c-format +msgid "certificate does not match private key file \"%s\": %s\n" +msgstr "il certificato non corrisponde con il file della chiave privata \"%s\": %s\n" + +#: 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 "Ciò potrebbe indicare che il server non supporta alcuna versione del protocollo SSL compresa tra %s e %s.\n" + +#: fe-secure-openssl.c:1581 +#, c-format +msgid "certificate could not be obtained: %s\n" +msgstr "non è stato possibile possibile ottenere il certificato: %s\n" + +#: fe-secure-openssl.c:1687 +#, c-format +msgid "no SSL error reported" +msgstr "nessun errore SSL riportato" + +#: fe-secure-openssl.c:1696 +#, c-format +msgid "SSL error code %lu" +msgstr "codice di errore SSL: %lu" + +#: fe-secure-openssl.c:1944 +#, c-format +msgid "WARNING: sslpassword truncated\n" +msgstr "ATTENZIONE: sslpassword troncata\n" + +#: fe-secure.c:267 +#, c-format +msgid "could not receive data from server: %s\n" +msgstr "ricezione dati dal server fallita: %s\n" + +#: fe-secure.c:436 +#, c-format +msgid "could not send data to server: %s\n" +msgstr "invio dati al server fallito: %s\n" + +#: win32.c:314 +#, c-format +msgid "unrecognized socket error: 0x%08X/%d" +msgstr "errore socket sconosciuto: 0x%08X/%d" + +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "lo stato COPY IN deve prima essere terminato\n" + +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "lo stato COPY OUT deve prima essere terminato\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEventProc \"%s\" fallito durante l'evento PGEVT_CONNRESET\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEventProc \"%s\" fallito durante l'evento PGEVT_RESULTCREATE\n" + +#~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" +#~ msgstr "la libreria SSL non supporta i certificati di tipo CRL (file \"%s\")\n" + +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "chiamata WSAIoctl(SIO_KEEPALIVE_VALS) fallito: %ui\n" + +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_create\n" + +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_create\n" + +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_seek\n" + +#~ msgid "cannot determine OID of function lo_lseek64\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_seek64\n" + +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_open\n" + +#~ msgid "cannot determine OID of function lo_tell64\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_tell64\n" + +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_truncate\n" + +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_truncate64\n" + +#~ msgid "cannot determine OID of function lo_unlink\n" +#~ msgstr "non è possibile determinare l'OID della funzione lo_unlink\n" + +#~ msgid "cannot determine OID of function loread\n" +#~ msgstr "non è possibile determinare l'OID della funzione loread\n" + +#~ msgid "cannot determine OID of function lowrite\n" +#~ msgstr "non è possibile determinare l'OID della funzione lowrite\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 "" +#~ "connessione al server fallita: %s\n" +#~ "\tVerifica che il server all'indirizzo \"%s\" (%s) sia in funzione\n" +#~ "\te che accetti connessioni TCP/IP sulla porta %s\n" + +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "errore nello stabilire una connessione scrivibile col server \"%s:%s\"\n" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "dati estranei nel messaggio di tipo \"D\"" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "dati estranei nel messaggio di tipo \"T\"" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "dati estranei nel messaggio di tipo \"t\"" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "la funzione richiede almeno il protocollo versione 3.0\n" + +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "stato %c di setenv non valido, probabilmente indica una corruzione di memoria\n" + +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "stato %c non valido, probabilmente indica una corruzione di memoria\n" + +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "valore per target_session_attrs non valido: \"%s\"\n" + +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "persa la sincronizzazione con il server, sto resettando la connessione" + +#~ msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" +#~ msgstr "Il file della chiave privata \"%s\" ha privilegi di accesso in lettura e scrittura per tutti; i permessi dovrebbero essere u=rw (0600) o inferiori\n" + +#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgstr "il server ha spedito dati binari (messaggio di tipo \"B\") senza prima il descrittore di riga (messaggio di tipo \"T\")" + +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +#~ msgstr "il server ha spedito dati (messaggio di tipo \"D\") senza prima il descrittore di riga (messaggio di tipo \"T\")" + +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s) fallita: %s\n" + +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "test \"SHOW transaction_read_only\" fallito sul server \"%s:%s\"\n" + +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "carattere %c non previsto a seguito di una risposta vuota ad una query (messaggio \"I\")" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/ja.po b/third_party/spanner_pg/src/interfaces/libpq/po/ja.po index 020370b6..c24e1263 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/ja.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/ja.po @@ -7,9 +7,9 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL 14)\n" +"Project-Id-Version: libpq (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-06 10:32+0900\n" +"POT-Creation-Date: 2022-09-26 11:13+0900\n" "PO-Revision-Date: 2023-04-06 10:33+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" @@ -20,98 +20,119 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: fe-auth-scram.c:213 +#: ../../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:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "SCRAMメッセージのフォーマット異常 (長さの不整合)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "サーバーシグネチャの検証ができませんでした\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "サーバー署名を検証できませんでした: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "正しくないサーバー署名\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "不正なSCRAM交換状態\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "SCRAMメッセージのフォーマット異常 (属性 \"%c\" が必要)\n" -#: fe-auth-scram.c:315 +#: 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:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4711 fe-connect.c:4972 fe-connect.c:5091 fe-connect.c:5343 -#: fe-connect.c:5424 fe-connect.c:5523 fe-connect.c:5779 fe-connect.c:5808 -#: fe-connect.c:5880 fe-connect.c:5904 fe-connect.c:5922 fe-connect.c:6023 -#: fe-connect.c:6032 fe-connect.c:6390 fe-connect.c:6540 fe-connect.c:6806 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3124 fe-exec.c:3308 -#: fe-exec.c:4081 fe-exec.c:4246 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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:374 +#: fe-auth-scram.c:392 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:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "クライアント証明の算出に失敗しました: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "クライアントの証明のエンコードに失敗しました\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "不正なSCRAM応答 (nonce の不一致)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "SCRAMメッセージのフォーマット異常 (不正なソルト)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "SCRAMメッセージのフォーマット異常 (不正な繰り返し回数)\n" -#: fe-auth-scram.c:687 +#: 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:723 +#: 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:739 +#: 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:758 +#: 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:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "メモリ不足です" + +#: fe-auth-scram.c:943 +msgid "could not generate random salt" +msgstr "乱数ソルトを生成できませんでした" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -121,7 +142,8 @@ msgstr "GSSAPIバッファの割り当ての際のメモリ不足(%d)\n" msgid "GSSAPI continuation error" msgstr "GSSAI続行エラー" -#: fe-auth.c:158 fe-auth.c:391 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" @@ -144,7 +166,7 @@ msgstr "重複するSSPI認証要求\n" #: fe-auth.c:377 msgid "could not acquire SSPI credentials" -msgstr "SSPIクレデンシャルを取得できませんでした" +msgstr "SSPI資格を入手できませんでした" #: fe-auth.c:433 msgid "channel binding required, but SSL not in use\n" @@ -154,619 +176,610 @@ msgstr "チャネルバインディングが要求されていますが、SSLが msgid "duplicate SASL authentication request\n" msgstr "重複するSASL認証要求\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "チャネルバインディングが要求されていますが、クライアントがサポートしていません\n" -#: fe-auth.c:513 +#: 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:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "サーバー側のいずれのSASL認証機構もサポートされていません\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 "チャネルバインディングが要求されていますが、サーバーがチャネルバインディングをサポートする認証方式を提供しませんでした\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "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を受信しました、しかしSASL認証は完了していません\n" -#: fe-auth.c:741 +#: 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:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Kerberos 4認証はサポートされていません\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Kerberos 5認証はサポートされていません\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "GSSAPI認証はサポートされていません\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "SSPI認証はサポートされていません\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Crypt認証はサポートされていません\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "認証方式%uはサポートされていません\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" -msgstr "ユーザー名の参照に失敗: エラーコード %lu\n" - -#: fe-auth.c:1117 fe-connect.c:2856 -#, 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:2861 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "ID %d を持つローカルユーザは存在しません\n" +msgstr "ユーザー名の検索に失敗: エラー コード %lu\n" -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "SHOW に対する予期しない形のリザルトセット\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "password_encryptionの値が長すぎます\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "認識できないパスワード暗号化アルゴリズム \"%s\"\n" -#: fe-connect.c:1094 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "%d個のホスト名と%d個のhostaddrの値との突き合せはできません\n" -#: fe-connect.c:1180 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "%d個のポート番号と%d個のホストとの突き合せはできません\n" -#: fe-connect.c:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "%s の値が不正: \"%s\"\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "SSLサポートが組み込まれていない場合sslmodeの値\"%s\"は不正です\n" -#: fe-connect.c:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "不正なSSLプロトコルバージョン範囲\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "gssencmodeの値\"%s\"はGSSAPIサポートがコンパイルされていない場合は不正\n" -#: fe-connect.c:1653 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "TCPソケットを非遅延モードに設定できませんでした: %s\n" -#: fe-connect.c:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " -msgstr "ソケット\"%s\"上でのサーバーへの接続に失敗しました: " +msgstr "ソケット\"%s\"のサーバーへの接続に失敗しました: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " -msgstr "\"%s\" (%s)、ポート %sでのサーバーへの接続に失敗しました: " +msgstr "\"%s\"(%s)、ポート%sのサーバーへの接続に失敗しました: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " -msgstr "\"%s\"、ポート%sでのサーバーへの接続に失敗しました: " +msgstr "\"%s\"、ポート%sのサーバーへの接続に失敗しました: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "\tサーバーは同一マシン上で動作していて、そのソケットで接続の待ち受けをしていますか?\n" +msgstr "\tサーバーはローカルで稼働していてそのソケットで接続を受け付けていますか?\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "\tサーバーはそのホストで動作していて、TCP/IP接続を受け付けていますか?\n" +msgstr "\tサーバーはそのホスト上で稼働していてTCP/IP接続を受け付けていますか?\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "接続オプション\"%2$s\"に対する不正な整数値\"%1$s\"\n" -#: fe-connect.c:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s)が失敗しました: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s)が失敗しました: エラーコード %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "接続状態が不正です。メモリ障害の可能性があります\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "不正なポート番号です: \"%s\"\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "ホスト名\"%s\"をアドレスに変換できませんでした: %s\n" -#: fe-connect.c:2418 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "ネットワークアドレス\"%s\"をパースできませんでした: %s\n" -#: fe-connect.c:2431 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Unixドメインソケットのパス\"%s\"が長すぎます(最大 %d バイト)\n" -#: fe-connect.c:2446 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "Unixドメインソケットのパス\"%s\"をアドレスに変換できませんでした: %s\n" -#: fe-connect.c:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "ソケットを作成できませんでした: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "ソケットを非ブロッキングモードに設定できませんでした: %s\n" -#: fe-connect.c:2613 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "ソケットをclose-on-execモードに設定できませんでした: %s\n" -#: fe-connect.c:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "keepaliveのパラメータは整数でなければなりません\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "ソケットのエラー状態を入手できませんでした: %s\n" -#: fe-connect.c:2800 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "ソケットからクライアントアドレスを入手できませんでした: %s\n" -#: fe-connect.c:2842 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "このプラットフォームでは requirepeer パラメータはサポートされていません\n" -#: fe-connect.c:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "ピアの資格証明を入手できませんでした: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeerは\"%s\"を指定していますが、実際のピア名は\"%s\"です\n" -#: fe-connect.c:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "GSSAPIネゴシエーションパケットを送信できませんでした: %s\n" -#: fe-connect.c:2921 +#: 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暗号化が要求されていますが、実行できませんでした(おそらく資格キャッシュがない、サーバーがサポートしていないあるいはローカルソケットで接続しています)\n" -#: fe-connect.c:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "SSLネゴシエーションパケットを送信できませんでした: %s\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "開始パケットを送信できませんでした: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "サーバーはSSLをサポートしていませんが、SSLが要求されました\n" -#: fe-connect.c:3097 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "SSLネゴシエーションに対して不正な応答を受信しました: %c\n" -#: fe-connect.c:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "SSL応答の後に非暗号化データを受信しました\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "サーバーはGSSAPI暗号化をサポートしていませんが、要求されました\n" -#: fe-connect.c:3211 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "GSSAPIネゴシエーションに対して不正な応答を受信しました: %c\n" -#: fe-connect.c:3230 +#: fe-connect.c:3226 msgid "received unencrypted data after GSSAPI encryption response\n" msgstr "GSSAPI暗号化応答の後に非暗号化データを受信しました\n" -#: fe-connect.c:3290 fe-connect.c:3315 +#: fe-connect.c:3286 fe-connect.c:3311 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "サーバーからの認証要求を想定していましたが、%cを受信しました\n" -#: fe-connect.c:3522 +#: fe-connect.c:3518 msgid "unexpected message from server during startup\n" msgstr "起動時にサーバーから想定外のメッセージがありました\n" -#: fe-connect.c:3614 +#: fe-connect.c:3610 msgid "session is read-only\n" msgstr "セッションは読み取り専用です\n" -#: fe-connect.c:3617 +#: fe-connect.c:3613 msgid "session is not read-only\n" msgstr "セッションは読み取り専用ではありません\n" -#: fe-connect.c:3671 +#: fe-connect.c:3667 msgid "server is in hot standby mode\n" msgstr "サーバーはホットスタンバイモードです\n" -#: fe-connect.c:3674 +#: fe-connect.c:3670 msgid "server is not in hot standby mode\n" -msgstr "サーバーはホットスタンバイモードではありません\n" +msgstr "サーバーはスタンバイモードではありません\n" -#: fe-connect.c:3792 fe-connect.c:3844 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format msgid "\"%s\" failed\n" msgstr "\"%s\"が失敗しました\n" -#: fe-connect.c:3858 +#: fe-connect.c:3854 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "接続状態%dが不正です。メモリ障害の可能性があります\n" -#: fe-connect.c:4304 fe-connect.c:4364 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEVT_CONNRESETイベント中にPGEventProc \"%s\"に失敗しました\n" - -#: fe-connect.c:4724 +#: fe-connect.c:4837 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "不正なLDAP URL\"%s\":スキーマはldap://でなければなりません\n" -#: fe-connect.c:4739 +#: fe-connect.c:4852 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "不正なLDAP URL \"%s\": 区別名がありません\n" -#: fe-connect.c:4751 fe-connect.c:4809 +#: fe-connect.c:4864 fe-connect.c:4922 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "不正なLDAP URL \"%s\": 正確に1つの属性を持たなければなりません\n" -#: fe-connect.c:4763 fe-connect.c:4825 +#: fe-connect.c:4876 fe-connect.c:4938 #, 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:4775 +#: fe-connect.c:4888 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "不正なLDAP URL \"%s\": フィルタがありません\n" -#: fe-connect.c:4797 +#: fe-connect.c:4910 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "不正なLDAP URL \"%s\": ポート番号が不正です\n" -#: fe-connect.c:4835 +#: fe-connect.c:4948 msgid "could not create LDAP structure\n" msgstr "LDAP構造体を作成できませんでした\n" -#: fe-connect.c:4911 +#: fe-connect.c:5024 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "LDAPサーバーで検索に失敗しました: %s\n" -#: fe-connect.c:4922 +#: fe-connect.c:5035 msgid "more than one entry found on LDAP lookup\n" msgstr "LDAP検索結果が複数ありました\n" -#: fe-connect.c:4923 fe-connect.c:4935 +#: fe-connect.c:5036 fe-connect.c:5048 msgid "no entry found on LDAP lookup\n" msgstr "LDAP検索結果が空でした\n" -#: fe-connect.c:4946 fe-connect.c:4959 +#: fe-connect.c:5059 fe-connect.c:5072 msgid "attribute has no values on LDAP lookup\n" msgstr "LDAP検索で属性に値がありませんでした\n" -#: fe-connect.c:5011 fe-connect.c:5030 fe-connect.c:5562 +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "接続情報文字列において\"%s\"の後に\"=\"がありませんでした\n" -#: fe-connect.c:5103 fe-connect.c:5747 fe-connect.c:6523 +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "接続オプション\"%s\"は不正です\n" -#: fe-connect.c:5119 fe-connect.c:5611 +#: fe-connect.c:5232 fe-connect.c:5724 msgid "unterminated quoted string in connection info string\n" msgstr "接続情報文字列において閉じていない引用符がありました\n" -#: fe-connect.c:5200 +#: fe-connect.c:5313 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "サービス定義\"%s\"がみつかりません\n" -#: fe-connect.c:5226 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "サービスファイル\"%s\"がみつかりません\n" -#: fe-connect.c:5240 +#: fe-connect.c:5353 #, c-format msgid "line %d too long in service file \"%s\"\n" -msgstr "サービスファイル\"%2$s\"の行%1$dが長すぎます\n" +msgstr "サービスファイル\"%2$s\"の行%1$dが長すぎます。\n" -#: fe-connect.c:5311 fe-connect.c:5355 +#: fe-connect.c:5424 fe-connect.c:5468 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "サービスファイル\"%s\"の行%dに構文エラーがあります\n" -#: fe-connect.c:5322 +#: fe-connect.c:5435 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "サービスファイル\"%s\"ではネストしたサービス指定はサポートされていません、行%d\n" -#: fe-connect.c:6043 +#: fe-connect.c:6156 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "内部パーサ処理へ伝わった不正なURI: \"%s\"\n" -#: fe-connect.c:6120 +#: fe-connect.c:6233 #, 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:6127 +#: fe-connect.c:6240 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "URI内ではIPv6ホストアドレスは空であってはなりません: \"%s\"\n" -#: fe-connect.c:6142 +#: fe-connect.c:6255 #, 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:6272 +#: fe-connect.c:6385 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "URI問い合わせパラメータ内に余分なキーと値を分ける\"=\"があります: \"%s\"\n" -#: fe-connect.c:6292 +#: fe-connect.c:6405 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "URI問い合わせパラメータ内にキーと値を分ける\\\"=\\\"がありません: \"%s\"\n" -#: fe-connect.c:6344 +#: fe-connect.c:6457 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "不正なURI問い合わせパラメータ:\"%s\"\n" -#: fe-connect.c:6418 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "不正なパーセント符号化トークン: \"%s\"\n" -#: fe-connect.c:6428 +#: fe-connect.c:6541 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "パーセント符号化された値では%%00値は許されません: \"%s\"\n" -#: fe-connect.c:6798 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "接続ポインタはNULLです\n" -#: fe-connect.c:7086 +#: fe-connect.c:7199 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" -msgstr "警告: パスワードファイル\"%s\"がテキストファイルではありません\n" +msgstr "WARNING: パスワードファイル\"%s\"がテキストファイルではありません\n" -#: fe-connect.c:7095 +#: 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 "警告: パスワードファイル\"%s\"がグループメンバもしくは他のユーザから読める状態になっています。この権限はu=rw (0600)以下にすべきです\n" +msgstr "警告: パスワードファイル \"%s\" がグループメンバもしくは他のユーザーから読める状態になっています。この権限はu=rw (0600)以下にすべきです\n" -#: fe-connect.c:7203 +#: fe-connect.c:7316 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "ファイル\"%s\"からパスワードを読み込みました\n" -#: fe-exec.c:449 fe-exec.c:3382 +#: fe-exec.c:466 fe-exec.c:3402 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行番号%dは0..%dの範囲を超えています" -#: fe-exec.c:510 fe-protocol3.c:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "メモリ不足" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "サーバーへの書き込みに失敗\n" -#: fe-exec.c:864 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "エラーメッセージがありません\n" + +#: fe-exec.c:964 msgid "NOTICE" -msgstr "NOTICE" +msgstr "注意" -#: fe-exec.c:922 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresultはINT_MAX個以上のタプルを扱えません" -#: fe-exec.c:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "size_t オーバーフロー" -#: fe-exec.c:1351 fe-exec.c:1476 fe-exec.c:1525 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "コマンド文字列がヌルポインタです\n" -#: fe-exec.c:1482 fe-exec.c:1531 fe-exec.c:1627 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%sはパイプラインモードでは使用できません\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "パラメータ数は0から%dまでの間でなければなりません\n" -#: fe-exec.c:1519 fe-exec.c:1621 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "文の名前がヌルポインタです\n" -#: fe-exec.c:1663 fe-exec.c:3235 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "サーバーへの接続がありません\n" -#: fe-exec.c:1672 fe-exec.c:3244 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "他のコマンドを処理しています\n" -#: fe-exec.c:1703 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" -msgstr "COPYの実行中はコマンドの先行積み込みはできません\n" +msgstr "COPY中はコマンドのキューイングはできません\n" -#: fe-exec.c:1821 +#: fe-exec.c:1866 msgid "length must be given for binary parameter\n" msgstr "バイナリパラメータには長さを指定しなければなりません\n" -#: fe-exec.c:2148 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "想定外のasyncStatus: %d\n" -#: fe-exec.c:2184 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEVT_RESULTCREATEイベント中にPGEventProc \"%s\"に失敗しました\n" - -#: fe-exec.c:2332 +#: fe-exec.c:2347 msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "同期コマンド実行関数はパイプラインモードでは使用できません\n" +msgstr "同期的にコマンドを実行する関数はパイプラインモード中は実行できません\n" -#: fe-exec.c:2354 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "新たなPQexec\"によりCOPYが終了しました" -#: fe-exec.c:2371 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "COPY BOTH 実行中の PQexec は許可されていません\n" -#: fe-exec.c:2599 fe-exec.c:2655 fe-exec.c:2724 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "実行中のCOPYはありません\n" -#: fe-exec.c:2901 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfnはパイプラインモードでは実行できません\n" - -#: fe-exec.c:2909 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "接続状態が異常です\n" -#: fe-exec.c:2953 +#: fe-exec.c:2967 msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "パイプラインモードに移行できません、接続はアイドル状態です\n" +msgstr "" +"パイプラインモードに入れません、接続がアイドル状態ではありません\n" +"\n" -#: fe-exec.c:2990 fe-exec.c:3014 +#: fe-exec.c:3004 fe-exec.c:3028 msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "未受信の結果がある状態でパイプラインモードを終了することはできません\n" +msgstr "未回収の結果が残っている状態でパイプラインモードを抜けることはできません\n" -#: fe-exec.c:2995 +#: fe-exec.c:3009 msgid "cannot exit pipeline mode while busy\n" -msgstr "ビジー状態でパイプラインモードを終了することはできません\n" +msgstr "ビジー状態でパイプラインモードを抜けることはできません\n" -#: fe-exec.c:3007 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "COPY実行中にパイプラインモードを抜けることはできません\n" -#: fe-exec.c:3168 +#: fe-exec.c:3188 msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "パイプラインモード中ではないためパイプラインの送出はできません\n" +msgstr "パイプラインモード外でパイプライン送出はできません\n" -#: fe-exec.c:3271 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "ExecStatusTypeコードが不正です" -#: fe-exec.c:3298 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresutがエラー結果ではありません\n" -#: fe-exec.c:3366 fe-exec.c:3389 +#: fe-exec.c:3386 fe-exec.c:3409 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列番号%dは0..%dの範囲を超えています" -#: fe-exec.c:3404 +#: fe-exec.c:3424 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "パラメータ%dは0..%dの範囲を超えています" -#: fe-exec.c:3714 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "サーバーからの結果を解釈できませんでした: %s" -#: fe-exec.c:3974 fe-exec.c:4063 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "不完全なマルチバイト文字\n" @@ -775,11 +788,11 @@ 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 +#: 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" +msgstr "関数%sのOIDが確定できません\n" #: fe-lobj.c:162 msgid "argument of lo_truncate exceeds integer range\n" @@ -793,22 +806,22 @@ msgstr "lo_readへの引数が整数範囲を超えています。\n" msgid "argument of lo_write exceeds integer range\n" msgstr "lo_writeへの引数が整数範囲を超えています。\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 "ファイル\"%s\"をオープンできませんでした: %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "ファイル\"%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 "ファイル\"%s\"に書き込めませんでした: %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "ラージオブジェクト機能を初期化する問い合わせがデータを返しませんでした\n" @@ -826,177 +839,192 @@ msgstr "サイズ%luの整数はpqPutIntでサポートされていません" msgid "connection not open\n" msgstr "接続はオープンされていません\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" "\tbefore or while processing the request.\n" msgstr "" -"サーバーとの接続が予期せずクローズされました\n" -" おそらく要求の処理前または処理中にサーバが異常終了\n" +"サーバーとの接続が想定外にクローズされました\n" +" おそらく要求の処理前または処理中にサーバーが異常終了\n" " したことを意味しています。\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "タイムアウト期間が過ぎました\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "不正なソケットです\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" -msgstr "%s()が失敗しました: %s\n" +msgstr "%s() が失敗しました: %s\n" #: fe-protocol3.c:184 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "待機中にサーバーからメッセージ種類0x%02xが届きました" -#: fe-protocol3.c:407 +#: fe-protocol3.c:393 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "サーバーが事前の行記述(\"T\"メッセージ)なしにデータ(\"D\"メッセージ)を送信しました\"\n" -#: fe-protocol3.c:450 +#: fe-protocol3.c:436 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "サーバーから想定外の応答がありました。受け付けた先頭文字は\"%c\"です\n" -#: fe-protocol3.c:475 +#: fe-protocol3.c:461 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "メッセージの内容がメッセージ種類\"%c\"の長さに合いません\n" -#: fe-protocol3.c:495 +#: fe-protocol3.c:481 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "サーバーとの同期が失われました。受信したメッセージ種類は\"%c\"、長さは%d\n" -#: fe-protocol3.c:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "\"T\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "問い合わせ結果用のメモリが不足しています" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" -msgstr "\"t\"メッセージ内のデータが不十分です" +msgstr "\"t\"メッセージ内のデータが足りません" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "\"D\"\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "\"D\"メッセージ内のフィールド数が想定外です。" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "エラーメッセージがありません\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr "(文字位置: %s)" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "QUERY: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "行 %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: テキストのCOPY OUTを行っていません\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "プロトコルエラー: 関数の結果がありません\n" + +#: fe-protocol3.c:2151 #, c-format msgid "protocol error: id=0x%x\n" msgstr "プロトコルエラー: id=0x%x\n" -#: fe-secure-common.c:124 +#: 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:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "証明書は不正な長さ%luのIPアドレスを含んでいます\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "証明書のIPアドレスを文字列へ変換できませんでした: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "SSL 接続を検証するためにホスト名を指定しなければなりません\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 "\"%s\"のサーバー証明書がホスト名\"%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" +msgstr "サーバー証明書からサーバーのホスト名を取り出すことができませんでした。\n" #: fe-secure-gssapi.c:201 msgid "GSSAPI wrap error" -msgstr "GSSAPIラップエラー" +msgstr "GSSAPI名ラップエラー" #: fe-secure-gssapi.c:209 msgid "outgoing GSSAPI message would not use confidentiality\n" @@ -1018,7 +1046,7 @@ 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" @@ -1032,85 +1060,89 @@ msgstr "GSSAPIサイズチェックエラー" msgid "GSSAPI context establishment error" msgstr "GSSAPIコンテクスト確立エラー" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1367 +#: 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:1371 +#: 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:1380 +#: 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:1430 +#: 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" +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:822 +#: 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:861 +#: 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:872 +#: 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:890 +#: 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:901 +#: 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:937 +#: 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: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" msgstr "" -"ルート証明書ファイルを特定するためのホームディレクトリが取得できませんでした。\n" +"ルート証明書ファイルを特定するためのホームディレクトリが取得できませんでした\n" "ファイルを用意するか、サーバー証明書の検証を無効にするように sslmode を変更してください\n" -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1119,92 +1151,99 @@ msgstr "" "ルート証明書ファイル\"%s\"が存在しません。\n" "ファイルを用意するかサーバー証明書の検証を無効にするようにsslmodeを変更してください\n" -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1153 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "証明書ファイル\"%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 "証明書ファイル\"%s\"を読み込めませんでした: %s\n" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "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 "SSLサーバー名表示を設定できませんでした: %s\n" +msgstr "" +"SSLサーバー名表示(SNI)を設定できませんでした: %s\n" +"\n" -#: fe-secure-openssl.c:1149 +#: 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:1161 +#: 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:1177 +#: 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" -#: 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 "SSL秘密鍵\"%s\"をエンジン\"%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 "証明書はありましたが、秘密鍵ファイル\"%s\"はありませんでした\n" -#: fe-secure-openssl.c:1237 +#: 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:1370 #, c-format msgid "private key file \"%s\" is not a regular file\n" msgstr "秘密鍵ファイル\"%s\"は通常のファイルではありません\n" -#: fe-secure-openssl.c:1270 +#: 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:1295 +#: fe-secure-openssl.c:1428 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "秘密鍵ファイル\"%s\"をロードできませんでした: %s\n" -#: fe-secure-openssl.c:1313 +#: fe-secure-openssl.c:1445 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "証明書と秘密鍵ファイル\"%s\"が一致しません: %s\n" -#: fe-secure-openssl.c:1413 +#: 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:1449 +#: fe-secure-openssl.c:1581 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "証明書を入手できませんでした: %s\n" -#: fe-secure-openssl.c:1555 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "SSLエラーはありませんでした" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: fe-secure-openssl.c:1812 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "警告: sslpasswordが切り詰められました\n" @@ -1214,7 +1253,7 @@ msgstr "警告: sslpasswordが切り詰められました\n" msgid "could not receive data from server: %s\n" msgstr "サーバーからデータを受信できませんでした: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "サーバーにデータを送信できませんでした: %s\n" @@ -1223,9 +1262,3 @@ msgstr "サーバーにデータを送信できませんでした: %s\n" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "不明なソケットエラー 0x%08X/%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 "private key file \"%s\" must be owned by the current user or root\n" -#~ msgstr "秘密鍵ファイル\"%s\"は現在のユーザーもしくはrootの所有である必要があります\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/ka.po b/third_party/spanner_pg/src/interfaces/libpq/po/ka.po new file mode 100644 index 00000000..a8447e60 --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/libpq/po/ka.po @@ -0,0 +1,1356 @@ +# Georgian message translation file for libpq +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the libpq (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: libpq (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-25 19:40+0000\n" +"PO-Revision-Date: 2022-09-25 22:01+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1.1\n" + +#: ../../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:237 +msgid "malformed SCRAM message (length mismatch)\n" +msgstr "დამახინჯებული SCRAM-ის შეტყობინება (სიგრძე არ ემთხვევა)\n" + +#: 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:297 +msgid "invalid SCRAM exchange state\n" +msgstr "არასწორი SCRAM-ის გაცვლის მდგომარეობა\n" + +#: fe-auth-scram.c:324 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)\n" +msgstr "დამახინჯებული SCRAM-ის შეტყობინება (აკლია ატრიბუტი \"%c\")\n" + +#: 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:374 +msgid "could not generate nonce\n" +msgstr "ერთჯერადი კოდის გენერაციის შეცდომა\n" + +#: 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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:392 +msgid "could not encode nonce\n" +msgstr "ერთჯერადი კოდის კოდირების შეცდომა\n" + +#: 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:654 +msgid "invalid SCRAM response (nonce mismatch)\n" +msgstr "არასწორი SCRAM-ის პასუხი (ერთჯერადი კოდი არ ემთხვევა)\n" + +#: fe-auth-scram.c:687 +msgid "malformed SCRAM message (invalid salt)\n" +msgstr "დამახინჯებული SCRAM-ის შეტყობინება (არასწორი მარილი)\n" + +#: fe-auth-scram.c:701 +msgid "malformed SCRAM message (invalid iteration count)\n" +msgstr "დამახინჯებული SCRAM-ის შეტყობინება (იტერაციების არასწორი რიცხვი)\n" + +#: fe-auth-scram.c:707 +msgid "malformed SCRAM message (garbage at end of server-first-message)\n" +msgstr "" +"დამახინჯებული SCRAM-ის შეტყობინება (ნაპოვნია ნაგავი სერვერისთვის გასაგზავნი " +"პირველი შეტყობინების ბოლოში)\n" + +#: 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:759 +msgid "malformed SCRAM message (garbage at end of server-final-message)\n" +msgstr "" +"დამახინჯებული SCRAM შეტყობინება (ნაგავი სერვერის-საბოლოო-შეტყობინების " +"ბოლოში)\n" + +#: 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:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "მეხსიერებას გარეთ" + +#: fe-auth-scram.c:943 +msgid "could not generate random salt" +msgstr "შემთხვევითი მარილის გენერაციის შეცდომა" + +#: fe-auth.c:76 +#, c-format +msgid "out of memory allocating GSSAPI buffer (%d)\n" +msgstr "არასაკმარისი მეხსიერება GSSAPI-ის ბაფერის გამოყოფისას (%d)\n" + +#: fe-auth.c:131 +msgid "GSSAPI continuation error" +msgstr "GSSAPI-ის განგრძობადობის შეცდომა" + +#: 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" + +#: fe-auth.c:165 +msgid "duplicate GSS authentication request\n" +msgstr "დუბლირებული GSS ავთენტიკაციის მოთხოვნა\n" + +#: fe-auth.c:230 +#, c-format +msgid "out of memory allocating SSPI buffer (%d)\n" +msgstr "არასაკმარისი მეხსიერება SSPI-ის ბაფერის გამოყოფისას (%d)\n" + +#: fe-auth.c:278 +msgid "SSPI continuation error" +msgstr "SSPI-ის განგრძობადობის შეცდომა" + +#: fe-auth.c:351 +msgid "duplicate SSPI authentication request\n" +msgstr "დუბლირებული SSPI ავთენტიკაციის მოთხოვნა\n" + +#: fe-auth.c:377 +msgid "could not acquire SSPI credentials" +msgstr "შეცდომა SSPI-ის მომხმ./პაროლის მიღებისას" + +#: fe-auth.c:433 +msgid "channel binding required, but SSL not in use\n" +msgstr "მითითებულია არხის მიბმა, მაგრამ SSL არ გამოიყენება\n" + +#: fe-auth.c:440 +msgid "duplicate SASL authentication request\n" +msgstr "დუბლირებული SASL ავთენტიკაციის მოთხოვნა\n" + +#: fe-auth.c:499 +msgid "channel binding is required, but client does not support it\n" +msgstr "არხის მიბმა აუცილებელია, მაგრამ კლიენტს მხარდაჭერა არ გააჩნია\n" + +#: fe-auth.c:516 +msgid "" +"server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" +msgstr "" +"სერვერი გვთავაზობს SCRAM-SHA-256-PLUS ავთენტიკაციას მაშინ, როცა SSL " +"გამორთულია\n" + +#: fe-auth.c:531 +msgid "none of the server's SASL authentication mechanisms are supported\n" +msgstr "სერვერის SASL ავთენტიკაციის არც ერთი მექანიზმი მხარდაჭერილი არაა\n" + +#: 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:647 +#, c-format +msgid "out of memory allocating SASL buffer (%d)\n" +msgstr "არასაკმარისი მეხსიერება SASL ბაფერის გამოყოფისას (%d)\n" + +#: fe-auth.c:672 +msgid "" +"AuthenticationSASLFinal received from server, but SASL authentication was " +"not completed\n" +msgstr "" +"სერვერიდან AuthenticationSASLFinal მიღებულია, მაგრამ SASL ავთენტიკაცია არ " +"დასრულებულა\n" + +#: 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: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:874 +msgid "" +"channel binding required but not supported by server's authentication " +"request\n" +msgstr "" +"არხზე მიბმა მოთხოვნილია, მაგრამ მხარდაუჭერელია სერვერის ავთენტიკაციის " +"მოთხოვნის მიერ\n" + +#: fe-auth.c:909 +msgid "Kerberos 4 authentication not supported\n" +msgstr "Kerberos 4 ავთენტიკაცია მხარდაუჭერელია\n" + +#: fe-auth.c:914 +msgid "Kerberos 5 authentication not supported\n" +msgstr "Kerberos 5 ავთენტიკაცია მხარდაუჭერელია\n" + +#: fe-auth.c:985 +msgid "GSSAPI authentication not supported\n" +msgstr "GSSAPI ავთენტიკაცია მხარდაუჭერელია\n" + +#: fe-auth.c:1017 +msgid "SSPI authentication not supported\n" +msgstr "SSPI ავთენტიკაცია მხარდაუჭერელია\n" + +#: fe-auth.c:1025 +msgid "Crypt authentication not supported\n" +msgstr "Crypt ავთენტიკაცია მხარდაუჭერელია\n" + +#: fe-auth.c:1092 +#, c-format +msgid "authentication method %u not supported\n" +msgstr "ავთენტიკაციის მეთოდი მხარდაუჭერელია: %u\n" + +#: fe-auth.c:1138 +#, c-format +msgid "user name lookup failure: error code %lu\n" +msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu\n" + +#: fe-auth.c:1264 +msgid "unexpected shape of result set returned for SHOW\n" +msgstr "ბრძანებისთვის SHOW დაბრუნებული შედეგის მოხაზულობა მოულოდნელია\n" + +#: fe-auth.c:1273 +msgid "password_encryption value too long\n" +msgstr "password_encryption -ის მნიშვნელობა ძალიან გრძელია\n" + +#: fe-auth.c:1327 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"\n" +msgstr "პაროლის დაშიფვრის უცნობ ალგორითმი: \"%s\"\n" + +#: fe-connect.c:1090 +#, c-format +msgid "could not match %d host names to %d hostaddr values\n" +msgstr "%d ჰოსტის სახელები %d ჰოსტის მისამართების მნიშვნელობებს არ ემთხვევა\n" + +#: fe-connect.c:1176 +#, 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 +#, c-format +msgid "invalid %s value: \"%s\"\n" +msgstr "%s-ის არასწორი მნიშვნელობა: \"%s\"\n" + +#: fe-connect.c:1316 +#, c-format +msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" +msgstr "" +"sslmode-ის მნიშვნელობა \"%s\" არასწორია, როცა SSL-ის მხარდაჭერა გამორთული " +"იყო აგების დროს\n" + +#: fe-connect.c:1364 +msgid "invalid SSL protocol version range\n" +msgstr "არასწორი SSL პროტოკოლის ვერსიის დიაპაზონი\n" + +#: fe-connect.c:1389 +#, c-format +msgid "" +"gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" +msgstr "" +"gssencmode -ის მნიშვნელობა \"%s\" არასწორია. GSSAPI-ის მხარდაჭერა გამორთული " +"იყო აგების დროს\n" + +#: fe-connect.c:1649 +#, c-format +msgid "could not set socket to TCP no delay mode: %s\n" +msgstr "სოკეტის TCP no_delay რეჟიმის ჩართვის შეცდომა: %s\n" + +#: fe-connect.c:1711 +#, c-format +msgid "connection to server on socket \"%s\" failed: " +msgstr "სოკეტით (\"%s\")სერვერთან მიერთების შეცდომა: " + +#: fe-connect.c:1738 +#, c-format +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "სერვერის (\"%s\" (%s)) %s-ე პორტზე მიერთების შეცდომა: " + +#: fe-connect.c:1743 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "სერვერის (\"%s\" ) %s-ე პორტზე მიერთების შეცდომა: " + +#: fe-connect.c:1768 +msgid "" +"\tIs the server running locally and accepting connections on that socket?\n" +msgstr "" +"\tარს სერვერი ლოკალურად გაშვებული და მზადაა სოკეტითა დასაკავშირებლად?\n" + +#: fe-connect.c:1772 +msgid "" +"\tIs the server running on that host and accepting TCP/IP connections?\n" +msgstr "\tარის სერვერი გაშვებული ამ ჰოსტზე და ეთანხმება TCP/IP შეერთებებს?\n" + +#: fe-connect.c:1836 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"\n" +msgstr "" +"არასწორი მნიშვნელობა: \"%s\" (უნდა იყოს მთელი რიცხვი) შეერთების " +"პარამეტრისთვის \"%s\"\n" + +#: 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 "%s(%s) -ის შეცდომა: %s\n" + +#: fe-connect.c:2002 +#, c-format +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) -ის შეცდომა: შეცდომის კოდი %d\n" + +#: fe-connect.c:2317 +msgid "invalid connection state, probably indicative of memory corruption\n" +msgstr "" +"შეერთების არასწორი მდგომარეობა. დიდი შანსით ნიშნავს მეხსიერების დაზიანებას\n" + +#: fe-connect.c:2396 +#, c-format +msgid "invalid port number: \"%s\"\n" +msgstr "პორტის არასწორი ნომერი: \"%s\"\n" + +#: fe-connect.c:2412 +#, c-format +msgid "could not translate host name \"%s\" to address: %s\n" +msgstr "ჰოსტის სახელის (%s) მისამართში თარგმნის შეცდომა: %s\n" + +#: fe-connect.c:2425 +#, c-format +msgid "could not parse network address \"%s\": %s\n" +msgstr "ქსელური მისამართის (\"%s\") დამუშავების პრობლემა: %s\n" + +#: fe-connect.c:2438 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" +msgstr "" +"Unix-დომენის სოკეტის მისამართი \"%s\" ძალიან გრძელია (დასაშვებია %d ბაიტი)\n" + +#: fe-connect.c:2453 +#, c-format +msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" +msgstr "" +"unix-დომენის სოკეტის ბილიკის (\"%s\") მისამართად თარგმნის შეცდომა: %s\n" + +#: fe-connect.c:2579 +#, c-format +msgid "could not create socket: %s\n" +msgstr "სოკეტის შექმნის შეცდომა: %s\n" + +#: fe-connect.c:2610 +#, c-format +msgid "could not set socket to nonblocking mode: %s\n" +msgstr "სოკეტის არაბლოკირებული რეჟიმის დაყენების შეცდომა: %s\n" + +#: fe-connect.c:2620 +#, c-format +msgid "could not set socket to close-on-exec mode: %s\n" +msgstr "სოკეტის დახურვა-შესრულებისას რეჟიმის დაყენების შეცდომა: %s\n" + +#: fe-connect.c:2638 +msgid "keepalives parameter must be an integer\n" +msgstr "პარამეტრი keepalives მთელი რიცხვი უნდა იყოს\n" + +#: fe-connect.c:2779 +#, c-format +msgid "could not get socket error status: %s\n" +msgstr "სოკეტის შეცდომის სტატუსის მიღების შეცდომა: %s\n" + +#: fe-connect.c:2807 +#, c-format +msgid "could not get client address from socket: %s\n" +msgstr "კლიენტის მისამართის სოკეტიდან მიღების შეცდომა: %s\n" + +#: fe-connect.c:2846 +msgid "requirepeer parameter is not supported on this platform\n" +msgstr "პარამეტრი requirepeer ამ პლატფორმაზე მხარდაჭერილი არაა\n" + +#: fe-connect.c:2849 +#, c-format +msgid "could not get peer credentials: %s\n" +msgstr "პარტნიორის მომხმ./პაროლის მიღების შეცდომა: %s\n" + +#: fe-connect.c:2863 +#, c-format +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" +msgstr "" +"requrepeer-ის მნიშვნელობაა \"%s\", მაგრამ პარტნიორის მომხმარებლის ნამდვილი " +"ასხელია: \"%s\"\n" + +#: fe-connect.c:2905 +#, c-format +msgid "could not send GSSAPI negotiation packet: %s\n" +msgstr "შეცდომა GSSAPI-ის მიმოცვლის პაკეტის გაგზავნისას: %s\n" + +#: 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 დაშიფვრა მოთხოვნილია, მაგრამ შეუძლებელი (შესაძლო მიზეზებია მომხმ/" +"პაროლის ქეშის არარსებობა, სერვერის მხარეს მხარდაჭერის არ არსებობა ან " +"ლოკალური სოკეტის გამოყენება)\n" + +#: fe-connect.c:2959 +#, c-format +msgid "could not send SSL negotiation packet: %s\n" +msgstr "შეცდომა SSL მიმოცვლის პაკეტის გაგზავნისას: %s\n" + +#: fe-connect.c:2990 +#, c-format +msgid "could not send startup packet: %s\n" +msgstr "გაშვების პაკეტის გაგზავნის შეცდომა: %s\n" + +#: fe-connect.c:3066 +msgid "server does not support SSL, but SSL was required\n" +msgstr "სერვერს SSL-ის მხარდაჭერა არ გააჩნია, მაგრამ SSL-ი აუცილებელია\n" + +#: fe-connect.c:3093 +#, c-format +msgid "received invalid response to SSL negotiation: %c\n" +msgstr "არასწორი პასუხი SSL მიმოცვლისას: %c\n" + +#: fe-connect.c:3114 +msgid "received unencrypted data after SSL response\n" +msgstr "SSL პასუხის შემდეგ მიღებული მონაცემები დაუშიფრავია\n" + +#: fe-connect.c:3195 +msgid "server doesn't support GSSAPI encryption, but it was required\n" +msgstr "სერვერს GSSAPI დაშიფვრის მხარდაჭერა არ გააჩნა, მაგრამ ის მოთხოვილია\n" + +#: fe-connect.c:3207 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c\n" +msgstr "GSSAPI მიმოცვლის არასწორი პასუხი: %c\n" + +#: fe-connect.c:3226 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "GSSAPI პასუხის შემდეგ მიღებული მონაცემები დაუშიფრავია\n" + +#: fe-connect.c:3286 fe-connect.c:3311 +#, c-format +msgid "expected authentication request from server, but received %c\n" +msgstr "" +"სერვერიდან მოსალოდნელი იყო ავთენტიკაციის მოთხოვნა, მაგრამ მიღებულია %c\n" + +#: fe-connect.c:3518 +msgid "unexpected message from server during startup\n" +msgstr "სერვერის გაშვებისას მიღებულია მოულოდნელი შეტყობინება\n" + +#: fe-connect.c:3610 +msgid "session is read-only\n" +msgstr "სესია მხოლოდ კითხვადია\n" + +#: fe-connect.c:3613 +msgid "session is not read-only\n" +msgstr "სესია მხოლოდ კითხვადი არა\n" + +#: fe-connect.c:3667 +msgid "server is in hot standby mode\n" +msgstr "სერვერი მზა-უქმე რეჟიმშია\n" + +#: fe-connect.c:3670 +msgid "server is not in hot standby mode\n" +msgstr "სერვერი მზა-უქმე რეჟიმში არაა\n" + +#: fe-connect.c:3788 fe-connect.c:3840 +#, c-format +msgid "\"%s\" failed\n" +msgstr "\"%s\" -ის შეცდომა\n" + +#: fe-connect.c:3854 +#, c-format +msgid "invalid connection state %d, probably indicative of memory corruption\n" +msgstr "" +"შეერთების არასწორი მდგომარეობა (%d). დიდი შანსით ნიშნავს მეხსიერების " +"დაზიანებას\n" + +#: fe-connect.c:4837 +#, c-format +msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" +msgstr "LDAP-ის არასწორი URL: \"%s\": სქემა ldap:// უნდა იყოს\n" + +#: fe-connect.c:4852 +#, c-format +msgid "invalid LDAP URL \"%s\": missing distinguished name\n" +msgstr "LDAP-ის არასწორი URL: \"%s\": აკლია გამოყოფილი სახელი\n" + +#: fe-connect.c:4864 fe-connect.c:4922 +#, c-format +msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" +msgstr "LDAP-ის არასწორი URL \"%s\": ზუსტად ერთი ატრიბუტი უნდა ჰქონდეს\n" + +#: fe-connect.c:4876 fe-connect.c:4938 +#, c-format +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" +msgstr "" +"LDAP-ის არასწორი URL: \"%s\": საჭიროა ძებნის ფარგლების ქონა (საბაზისო/ერთი/" +"ქვე)\n" + +#: fe-connect.c:4888 +#, c-format +msgid "invalid LDAP URL \"%s\": no filter\n" +msgstr "LDAP-ის არასწორი URL: \"%s\":ფილტრი არ არსებობს\n" + +#: fe-connect.c:4910 +#, c-format +msgid "invalid LDAP URL \"%s\": invalid port number\n" +msgstr "LDAP-ის არასწორი URL: \"%s\": პორტის არასწორი ნომერი\n" + +#: fe-connect.c:4948 +msgid "could not create LDAP structure\n" +msgstr "შეცდომა LDAP-ის სტრუქტურის შექმნისას\n" + +#: fe-connect.c:5024 +#, c-format +msgid "lookup on LDAP server failed: %s\n" +msgstr "LDAP სერვერის მოძებნის შეცდომა:%s\n" + +#: fe-connect.c:5035 +msgid "more than one entry found on LDAP lookup\n" +msgstr "ძებნისას (LDAP) ნაპოვნია ერთზე მეტი ჩანაწერი\n" + +#: fe-connect.c:5036 fe-connect.c:5048 +msgid "no entry found on LDAP lookup\n" +msgstr "ძებნისას (LDAP) ჩანაწერები ნაპოვნი არაა\n" + +#: fe-connect.c:5059 fe-connect.c:5072 +msgid "attribute has no values on LDAP lookup\n" +msgstr "LDAP ძებნის ატრიბუტს მნიშვნელობა არ გააჩნია\n" + +#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 +#, c-format +msgid "missing \"=\" after \"%s\" in connection info string\n" +msgstr "შეერთების სტრიქონში \"%s\"-ის შემდეგ \"=\" აკლია\n" + +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 +#, c-format +msgid "invalid connection option \"%s\"\n" +msgstr "შეერთების არასწორი პარამეტრი: \"%s\"\n" + +#: fe-connect.c:5232 fe-connect.c:5724 +msgid "unterminated quoted string in connection info string\n" +msgstr "" +"შეერთების ინფორმაციის სტრიქონში ბრჭყალებში ჩასმული სტრიქონი დაუსრულებელია\n" + +#: fe-connect.c:5313 +#, c-format +msgid "definition of service \"%s\" not found\n" +msgstr "სერვისის აღწერა არ არსებობს: \"%s\"\n" + +#: fe-connect.c:5339 +#, c-format +msgid "service file \"%s\" not found\n" +msgstr "სერვისის ფაილი არ არსებობს: \"%s\"\n" + +#: fe-connect.c:5353 +#, c-format +msgid "line %d too long in service file \"%s\"\n" +msgstr "ძალიან გრძელი ხაზი (%d) სერვისის ფაილში \"%s\"\n" + +#: fe-connect.c:5424 fe-connect.c:5468 +#, c-format +msgid "syntax error in service file \"%s\", line %d\n" +msgstr "სინტაქსის შეცდომა სერვისის ფაილში \"%s\" ხაზზე %d\n" + +#: fe-connect.c:5435 +#, c-format +msgid "" +"nested service specifications not supported in service file \"%s\", line %d\n" +msgstr "" +"სერვისის ფაილში \"%s\" ჩადგმული სერვისის მითითება მხარდაუჭერელია. ხაზი %d\n" + +#: fe-connect.c:6156 +#, c-format +msgid "invalid URI propagated to internal parser routine: \"%s\"\n" +msgstr "დამუშავებს შიდა ფუნქციაში გადაცემული URI არასწორია: %s\n" + +#: fe-connect.c:6233 +#, 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:6240 +#, c-format +msgid "IPv6 host address may not be empty in URI: \"%s\"\n" +msgstr "ჰოსტის IPv6 მისამართი URI-ში ცარიელი ვერ იქნება: \"%s\"\n" + +#: fe-connect.c:6255 +#, c-format +msgid "" +"unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " +"\"%s\"\n" +msgstr "" +"უცნობი სიმბოლო (\"%c\") URI-ში პოზიციაზე %d (მოველოდი \":\"-ს ან \"/\"-ს): " +"\"%s\"\n" + +#: fe-connect.c:6385 +#, c-format +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" +msgstr "" +"მოთხოვნის URI არამეტრში მითითებულია გასაღები/მნიშვნელობის ზედმეტი \"=\": \"%s" +"\"\n" + +#: fe-connect.c:6405 +#, c-format +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" +msgstr "" +"მოთხოვნის URI პარამეტრში მითითებულია გასაღები/მნიშვნელობის წყვილს \"=\" " +"აკლია: \"%s\"\n" + +#: fe-connect.c:6457 +#, c-format +msgid "invalid URI query parameter: \"%s\"\n" +msgstr "მოთხოვნის არასწორი პარამეტრი: \"%s\"\n" + +#: fe-connect.c:6531 +#, c-format +msgid "invalid percent-encoded token: \"%s\"\n" +msgstr "არასწორი პროცენტულად-კოდირებული კოდი: \"%s\"\n" + +#: fe-connect.c:6541 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" +msgstr "პროცენტში კოდირებული მნიშვნელობის აკრძალული მნიშვნელობა %%00: \"%s\"\n" + +#: fe-connect.c:6911 +msgid "connection pointer is NULL\n" +msgstr "შეერთების მაჩვენებელი ნულოვანია\n" + +#: fe-connect.c:7199 +#, c-format +msgid "WARNING: password file \"%s\" is not a plain file\n" +msgstr "გაფრთხილება. პაროლის ფაილი \"%s\" უბრალოდ ფაილს არ წარმოადგენს\n" + +#: 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 "" +"გაფრთხილება: პაროლების ფაილს \"%s\" ჯგუფზე ან დანარჩენ ყველაზე წვდომა " +"გააჩნია. წვდომა 0600 ან ნაკლები უნდა იყოს\n" + +#: fe-connect.c:7316 +#, c-format +msgid "password retrieved from file \"%s\"\n" +msgstr "პაროლი მიღებულია ფაილიდან \"%s\"\n" + +#: fe-exec.c:466 fe-exec.c:3402 +#, c-format +msgid "row number %d is out of range 0..%d" +msgstr "მწკრივების რაოდენობა %d ზღვარს (0..%d) გარეთაა" + +#: fe-exec.c:528 fe-protocol3.c:1937 +#, c-format +msgid "%s" +msgstr "%s" + +#: fe-exec.c:836 +msgid "write to server failed\n" +msgstr "სერვერზე ჩაწერის შეცდომა\n" + +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "შეცდომის ტექსტი ხელმიუწვდომელია\n" + +#: fe-exec.c:964 +msgid "NOTICE" +msgstr "გაფრთხილება" + +#: fe-exec.c:1022 +msgid "PGresult cannot support more than INT_MAX tuples" +msgstr "PGresult-ს INT_MAX-ზე მეტი სტრუქტურის მხარდაჭერა არ გააჩნია" + +#: fe-exec.c:1034 +msgid "size_t overflow" +msgstr "size_t -ის გადავსება" + +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 +msgid "command string is a null pointer\n" +msgstr "ბრძანების სრიქონი ნულოვანი მაჩვენებელია\n" + +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "კომუნიკაციის არხის რეჟიმში %s დაუშვებელია\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 +#, c-format +msgid "number of parameters must be between 0 and %d\n" +msgstr "პარამეტრების რაოდენობა 0-სა და %d-ს შორის შეიძლება იყოს\n" + +#: fe-exec.c:1562 fe-exec.c:1664 +msgid "statement name is a null pointer\n" +msgstr "პირობის სახელი ნულოვანი მაჩვენებელია\n" + +#: fe-exec.c:1708 fe-exec.c:3255 +msgid "no connection to the server\n" +msgstr "სერვერთან შეერთება არ არსებობს\n" + +#: fe-exec.c:1717 fe-exec.c:3264 +msgid "another command is already in progress\n" +msgstr "უკვე გაშვებულია სხვა ბრძანება\n" + +#: fe-exec.c:1748 +msgid "cannot queue commands during COPY\n" +msgstr "როცა გაშვებულია ბრძანება COPY, სხვა ბრძანებებს ვერ გაუშვებთ\n" + +#: fe-exec.c:1866 +msgid "length must be given for binary parameter\n" +msgstr "ბინარული პარამეტრისთვის საჭიროა სიგრძის მითითება\n" + +#: fe-exec.c:2189 +#, c-format +msgid "unexpected asyncStatus: %d\n" +msgstr "მოულოდნელი asyncStatus: %d\n" + +#: fe-exec.c:2347 +msgid "" +"synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "" +"კომუნიკაციის არხის რეჟიმში ბრძანების სინქრონული შესრულების ფუნქციები " +"მუწვდომელია\n" + +#: fe-exec.c:2364 +msgid "COPY terminated by new PQexec" +msgstr "COPY შეწყვეტილია ახალი PQexec-ის მიერ" + +#: fe-exec.c:2381 +msgid "PQexec not allowed during COPY BOTH\n" +msgstr "COPY BOTH-ის დროს PQexec დაუშვებელია\n" + +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 +msgid "no COPY in progress\n" +msgstr "ბრძანება COPY გაშვებული არაა\n" + +#: fe-exec.c:2923 +msgid "connection in wrong state\n" +msgstr "შეერთების მდგომარეობა არასწორია\n" + +#: fe-exec.c:2967 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "კომუნიკაციის არხის რეჟიმზე გადართვის შეცდომა. შეერთება უქმე არაა\n" + +#: fe-exec.c:3004 fe-exec.c:3028 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "" +"მოგროვებული შედეგების გარეშე კომუნიკაციის არხის რეჟიმიდან ვერ გახვალთ\n" + +#: fe-exec.c:3009 +msgid "cannot exit pipeline mode while busy\n" +msgstr "" +"კომუნიკაციის არხის რეჟიმიდან გასვლა მაშინ, როცა ის დაკავებულია, შეუძლებელია\n" + +#: fe-exec.c:3021 +msgid "cannot exit pipeline mode while in COPY\n" +msgstr "" +"კომუნიკაციის არხის რეჟიმიდან გასვლა მაშინ, როცა ის დაკავებულია, შეუძლებელია\n" + +#: fe-exec.c:3188 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "" +"კომუნიკაციის არხის გაგზავნა, როცა კომუნიკაციის არხის რეჟიმში არ ხართ, " +"შეუძლებელია\n" + +#: fe-exec.c:3291 +msgid "invalid ExecStatusType code" +msgstr "ExecStatusType-ის არასწორი კოდი" + +#: fe-exec.c:3318 +msgid "PGresult is not an error result\n" +msgstr "PGresult შეცდომითი შედეგი არაა\n" + +#: fe-exec.c:3386 fe-exec.c:3409 +#, c-format +msgid "column number %d is out of range 0..%d" +msgstr "სვეტების რაოდენობა %d ზღვარს (0..%d) გარეთაა" + +#: fe-exec.c:3424 +#, c-format +msgid "parameter number %d is out of range 0..%d" +msgstr "პარამეტრების რაოდენობა %d ზღვარს (0..%d) გარეთაა" + +#: fe-exec.c:3735 +#, c-format +msgid "could not interpret result from server: %s" +msgstr "სერვერის პასუხის გაურკვეველია: %s" + +#: fe-exec.c:4001 fe-exec.c:4092 +msgid "incomplete multibyte character\n" +msgstr "დაუსრულებელი მრავალბაიტიანი სიმბოლო\n" + +#: 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: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 "ფუნქციის OID-ის გამოცნობის შეცდომა: %s\n" + +#: fe-lobj.c:162 +msgid "argument of lo_truncate exceeds integer range\n" +msgstr "lo_truncate-ის არგუმენტიმთელი რიცხვის დასაშვებ საზღვრებს სცდება\n" + +#: fe-lobj.c:266 +msgid "argument of lo_read exceeds integer range\n" +msgstr "lo_read -ის არგუმენტიმთელი რიცხვის დასაშვებ საზღვრებს სცდება\n" + +#: fe-lobj.c:318 +msgid "argument of lo_write exceeds integer range\n" +msgstr "lo_write -ის არგუმენტიმთელი რიცხვის დასაშვებ საზღვრებს სცდება\n" + +#: 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:735 +#, c-format +msgid "could not read from file \"%s\": %s\n" +msgstr "ფაილიდან (\"%s\") კითხვის შეცდომა: %s\n" + +#: 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:923 +msgid "query to initialize large object functions did not return data\n" +msgstr "" +"დიდი ობიექტის ფუნქციების ინიციალიზაციის მოთხოვნას შედეგ არ დაუბრუნებია\n" + +#: fe-misc.c:242 +#, c-format +msgid "integer of size %lu not supported by pqGetInt" +msgstr "%lu-ის მთელი რიცხვის ზომა მხარდაუჭერელია pqGetInt-is მიერ" + +#: fe-misc.c:275 +#, c-format +msgid "integer of size %lu not supported by pqPutInt" +msgstr "%lu-ის მთელი რიცხვის ზომა მხარდაუჭერელია pqPutInt-is მიერ" + +#: fe-misc.c:576 fe-misc.c:822 +msgid "connection not open\n" +msgstr "შეერთება ღია არაა\n" + +#: 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" +"\tbefore or while processing the request.\n" +msgstr "" +"სერვერმა კავშირი მოულოდნელად დახურა\n" +"\tეს დიდი ალბათობით ნიშნავს, რომ სერვერის პროცესი \n" +"\\მოულოდნელად, მოთხოვნამდე ან მოთხოვნის შესრულებსას დასრულდა\n" + +#: fe-misc.c:1008 +msgid "timeout expired\n" +msgstr "მოლოდინის დრო გავიდა\n" + +#: fe-misc.c:1053 +msgid "invalid socket\n" +msgstr "არასწორი სოკეტი\n" + +#: fe-misc.c:1076 +#, c-format +msgid "%s() failed: %s\n" +msgstr "%s()-ის შეცდომა: %s\n" + +#: fe-protocol3.c:184 +#, c-format +msgid "message type 0x%02x arrived from server while idle" +msgstr "შეტყობინების ტიპი 0x%02x მოვიდა სერვერიდან, როცა უქმე ვიყავი" + +#: fe-protocol3.c:393 +msgid "" +"server sent data (\"D\" message) without prior row description (\"T\" " +"message)\n" +msgstr "" +"სერვერმა მონაცემები (\"D\" შეტყობინება) მწკრივების წინასწარი აღწერის (\"T\" " +"შეტყობინება) გარეშე გამოაგზავნა\n" + +#: fe-protocol3.c:436 +#, c-format +msgid "unexpected response from server; first received character was \"%c\"\n" +msgstr "სერვერის მოულოდნელი პასუხი; პირველი მიღებული სიმბოლოა \"%c\"\n" + +#: fe-protocol3.c:461 +#, c-format +msgid "message contents do not agree with length in message type \"%c\"\n" +msgstr "შეტყობინების შიგთავსი შეტყობინების ამ ტიპის (%c) სიგრძეს არ ემთხვევა\n" + +#: fe-protocol3.c:481 +#, c-format +msgid "lost synchronization with server: got message type \"%c\", length %d\n" +msgstr "" +"სერვერთან სინქრონიზაციის შეცდომა: შეტყობინების ტიპი: \"%c\", სიგრძე %d\n" + +#: fe-protocol3.c:533 fe-protocol3.c:573 +msgid "insufficient data in \"T\" message" +msgstr "არასაკმარისი მონაცემები \"T\" შეტყობინებაში" + +#: fe-protocol3.c:644 fe-protocol3.c:850 +msgid "out of memory for query result" +msgstr "არასაკმარისი მეხსიერება მოთხოვნის შედეგისთვის" + +#: fe-protocol3.c:713 +msgid "insufficient data in \"t\" message" +msgstr "არასაკმარისი მონაცემები \"t\" შეტყობინებაში" + +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 +msgid "insufficient data in \"D\" message" +msgstr "არასაკმარისი მონაცემები \"D\" შეტყობინებაში" + +#: fe-protocol3.c:778 +msgid "unexpected field count in \"D\" message" +msgstr "ველების მოულოდნელი რაოდენობა \"D\" შეტყობინებაში" + +#: fe-protocol3.c:1034 +msgid "no error message available\n" +msgstr "შეცდომის შეტყობინების გარეშე\n" + +#. translator: %s represents a digit string +#: fe-protocol3.c:1082 fe-protocol3.c:1101 +#, c-format +msgid " at character %s" +msgstr " სიმბოლოსთან %s" + +#: fe-protocol3.c:1114 +#, c-format +msgid "DETAIL: %s\n" +msgstr "დეტალი: %s\n" + +#: fe-protocol3.c:1117 +#, c-format +msgid "HINT: %s\n" +msgstr "მინიშნება: %s\n" + +#: fe-protocol3.c:1120 +#, c-format +msgid "QUERY: %s\n" +msgstr "მოთხოვნა: %s\n" + +#: fe-protocol3.c:1127 +#, c-format +msgid "CONTEXT: %s\n" +msgstr "კონტექსტი: %s\n" + +#: fe-protocol3.c:1136 +#, c-format +msgid "SCHEMA NAME: %s\n" +msgstr "სქემის სახელი: %s\n" + +#: fe-protocol3.c:1140 +#, c-format +msgid "TABLE NAME: %s\n" +msgstr "ცხრილის სახელი: %s\n" + +#: fe-protocol3.c:1144 +#, c-format +msgid "COLUMN NAME: %s\n" +msgstr "სვეტის სახელი: %s\n" + +#: fe-protocol3.c:1148 +#, c-format +msgid "DATATYPE NAME: %s\n" +msgstr "მონ. ტიპის სახელი: %s\n" + +#: fe-protocol3.c:1152 +#, c-format +msgid "CONSTRAINT NAME: %s\n" +msgstr "შეზღუდვის სახელი: %s\n" + +#: fe-protocol3.c:1164 +msgid "LOCATION: " +msgstr "მდებარეობა: " + +#: fe-protocol3.c:1166 +#, c-format +msgid "%s, " +msgstr "%s, " + +#: fe-protocol3.c:1168 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: fe-protocol3.c:1363 +#, c-format +msgid "LINE %d: " +msgstr "ხაზი %d: " + +#: fe-protocol3.c:1762 +msgid "PQgetline: not doing text COPY OUT\n" +msgstr "PQgetline: ტექსტის COPY OUT-ს არ გავაკეთებ\n" + +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "პროტოკოლის შეცდომა: ფუნქციის შედეგის გარეშე\n" + +#: fe-protocol3.c:2151 +#, 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 სერტიფიკატი ჩადგმულ ნულოვანს შეიცავს\n" + +#: fe-secure-common.c:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "სერტიფიკატში მითითებული IP მისამართის სიგრძე არასწორია: %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "სერტიფიკატის IP მისამართის სტრიქონად გარდაქმნის შეცდომა: %s\n" + +#: fe-secure-common.c:276 +msgid "host name must be specified for a verified SSL connection\n" +msgstr "შემოწმებულ SSL შეერთებაში ჰოსტის სახელის მითითება აუცილებელია\n" + +#: fe-secure-common.c:301 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"\n" +msgstr "სერვერის სერტიფიკატი \"%s\"-თვის ჰოსტის სახელს (\"%s\") არ ემთხვევა\n" + +#: fe-secure-common.c:307 +msgid "could not get server's host name from server certificate\n" +msgstr "სერვერის სერტიფიკატიდან ჰოსტის სახელის მიღების შეცდომა\n" + +#: fe-secure-gssapi.c:201 +msgid "GSSAPI wrap error" +msgstr "GSSAPI -ის გადატანის შეცდომა" + +#: fe-secure-gssapi.c:209 +msgid "outgoing GSSAPI message would not use confidentiality\n" +msgstr "გამავალი GSSAPI შეტყობინება კონფიდენციალობას არ იყენებს\n" + +#: fe-secure-gssapi.c:217 +#, c-format +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" +msgstr "კლიენტი ძალიან დიდი GSSAPI პაკეტების გაგზავნას ცდილობს (%zu > %zu)\n" + +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#, c-format +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" +msgstr "სერვერის მიერ გამოგზავნილი GSSAPI-ის პაკეტი ძალიან დიდია (%zu > %zu)\n" + +#: fe-secure-gssapi.c:393 +msgid "GSSAPI unwrap error" +msgstr "GSSAPI-ის გადატანის მოხსნის შეცდომა" + +#: fe-secure-gssapi.c:403 +msgid "incoming GSSAPI message did not use confidentiality\n" +msgstr "შემომავალი GSSAPI შეტყობინება კონფიდენციალობას არ იყენებს\n" + +#: fe-secure-gssapi.c:642 +msgid "could not initiate GSSAPI security context" +msgstr "GSSAPI უსაფრთხოების კონტექსტის დაწყების შეცდომა" + +#: fe-secure-gssapi.c:670 +msgid "GSSAPI size check error" +msgstr "GSSAPI-ის ზომის შემოწმების შეცდომა" + +#: fe-secure-gssapi.c:681 +msgid "GSSAPI context establishment error" +msgstr "GSSAPI-ის კონტექსტის დამყარებულობის შეცდომა" + +#: 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: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: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:256 fe-secure-openssl.c:363 +msgid "SSL connection has been closed unexpectedly\n" +msgstr "SSL შეერთება მოულოდნელად დაიხურა\n" + +#: 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:409 +msgid "could not determine server certificate signature algorithm\n" +msgstr "სერვერის სერტიფიკატის ხელმოწერის ალგორითმის დადგენა შეუძლებელია\n" + +#: fe-secure-openssl.c:430 +#, c-format +msgid "could not find digest for NID %s\n" +msgstr "NID-ისთვის (%s) დაიჯესტის პოვნა შეუძლებელია\n" + +#: fe-secure-openssl.c:440 +msgid "could not generate peer certificate hash\n" +msgstr "პარტნიორის სერტიფიკატის ჰეშის გენერირების შეცდომა\n" + +#: fe-secure-openssl.c:497 +msgid "SSL certificate's name entry is missing\n" +msgstr "SSL სერტიფიკატის სახელის ჩანაწერი არ არსებობს\n" + +#: 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:989 +#, c-format +msgid "invalid value \"%s\" for minimum SSL protocol version\n" +msgstr "SSL პროტოკოლის ვერსიის არასწორი მინიმალური მნიშვნელობა: %s\n" + +#: 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:1018 +#, c-format +msgid "invalid value \"%s\" for maximum SSL protocol version\n" +msgstr "SSL პროტოკოლის ვერსიის არასწორი მაქსიმალური მნიშვნელობა: %s\n" + +#: 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:1065 +#, c-format +msgid "could not read root certificate file \"%s\": %s\n" +msgstr "root სერტიფიკატის ფაილის (\"%s\") წაკითხვის შეცდომა: %s\n" + +#: 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" +msgstr "" +"root სერტიფიკატის ფაილის მოსაძებნად საწყისი საქაღალდის მიღება შეუძლებელია\n" +"ამ წარმოადგინეთ ფაილი, ან sslmode სერვერის სერტიფიკატის შემოწმება გამორთეთ.\n" + +#: fe-secure-openssl.c:1122 +#, 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 "" +"root სერტიფიკატის ფაილი \"%s\" არ არსებობს\n" +"წარმოადგინეთ ფაილი ან გამორთეთ sslmode სერვერის სერტიფიკატის შემოწმება.\n" + +#: fe-secure-openssl.c:1153 +#, c-format +msgid "could not open certificate file \"%s\": %s\n" +msgstr "სერტიფიკატის ფაილის გახსნის შეცდომა \"%s\": %s\n" + +#: fe-secure-openssl.c:1172 +#, c-format +msgid "could not read certificate file \"%s\": %s\n" +msgstr "სერტიფიკატის ფაილის წაკითხვის შეცდომა \"%s\": %s\n" + +#: fe-secure-openssl.c:1197 +#, c-format +msgid "could not establish SSL connection: %s\n" +msgstr "SSL შეერთების დამყარების შეცდომა: %s\n" + +#: fe-secure-openssl.c:1231 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "SSL სერვერის სახელის ინდიკაციის (SNI) დაყენების შეცდომა: %s\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:1289 +#, c-format +msgid "could not initialize SSL engine \"%s\": %s\n" +msgstr "SSL ძრავის (\"%s\") ინიციალიზაციის შეცდომა: %s\n" + +#: 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" + +#: 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" + +#: fe-secure-openssl.c:1357 +#, c-format +msgid "certificate present, but not private key file \"%s\"\n" +msgstr "" +"სერტიფიკატისგან განსხვავებით, პირადი გასაღების ფაილი \"%s\" არ არსებობს\n" + +#: fe-secure-openssl.c:1361 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "პირადი გასაღების ფაილი \"%s\" არ არსებობს: %m\n" + +#: fe-secure-openssl.c:1370 +#, c-format +msgid "private key file \"%s\" is not a regular file\n" +msgstr "პირადი გასაღების ფაილი \"%s\" ჩვეულებრივი ფაილი არაა\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) ან ნაკლები, თუ ეკუთვნის ამჟამინდელ " +"მომხმარებელს, ან ნებართვები u=rw,g=r (0640) ან ნაკლები, თუ ეკუთვნის root-ს\n" + +#: fe-secure-openssl.c:1428 +#, c-format +msgid "could not load private key file \"%s\": %s\n" +msgstr "პირადი გასაღების ფაილის \"%s\" ჩატვირთვის შეცდომა: %s\n" + +#: fe-secure-openssl.c:1445 +#, c-format +msgid "certificate does not match private key file \"%s\": %s\n" +msgstr "სერტიფიკატი პირადი გასაღების ფაილს (\"%s\") არ ემთხვევა: %s\n" + +#: 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:1581 +#, c-format +msgid "certificate could not be obtained: %s\n" +msgstr "სერტიფიკატის მიღების შეცდომა: %s\n" + +#: fe-secure-openssl.c:1687 +#, c-format +msgid "no SSL error reported" +msgstr "SSL-ის შეცდომების გარეშე" + +#: fe-secure-openssl.c:1696 +#, c-format +msgid "SSL error code %lu" +msgstr "SSL-ის შეცდომის კოდი %lu" + +#: fe-secure-openssl.c:1944 +#, c-format +msgid "WARNING: sslpassword truncated\n" +msgstr "გაფრთხილება: sslpasswrord შეკვეცილია\n" + +#: fe-secure.c:267 +#, c-format +msgid "could not receive data from server: %s\n" +msgstr "სერვერიდან მონაცემების მიღების შეცდომა: %s\n" + +#: fe-secure.c:436 +#, c-format +msgid "could not send data to server: %s\n" +msgstr "სერვერისთვის მონაცემების გაგზავნის შეცდომა: %s\n" + +#: win32.c:314 +#, c-format +msgid "unrecognized socket error: 0x%08X/%d" +msgstr "სოკეტის უცნობი შეცდომა: 0x%08X/%d" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/ko.po b/third_party/spanner_pg/src/interfaces/libpq/po/ko.po index 602069ae..48fa1b23 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/ko.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/ko.po @@ -3,11 +3,11 @@ # 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-10-05 01:09+0000\n" -"PO-Revision-Date: 2020-10-05 17:53+0900\n" -"Last-Translator: Ioseph Kim \n" +"POT-Creation-Date: 2023-04-12 00:40+0000\n" +"PO-Revision-Date: 2023-04-05 15:25+0900\n" +"Last-Translator: YOUR NAME \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -15,92 +15,122 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\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 "UID %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: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:4829 fe-connect.c:5090 fe-connect.c:5209 fe-connect.c:5461 +#: fe-connect.c:5542 fe-connect.c:5641 fe-connect.c:5897 fe-connect.c:5926 +#: fe-connect.c:5998 fe-connect.c:6022 fe-connect.c:6040 fe-connect.c:6141 +#: fe-connect.c:6150 fe-connect.c:6508 fe-connect.c:6658 fe-connect.c:6924 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:454 fe-secure-openssl.c:1266 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 "클라이언트 프루프(proof)를 계산할 수 없음: %s\n" + +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "클라이언트 프루프(proof)를 인코딩할 수 없음\n" -#: fe-auth-scram.c:618 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "잘못된 SCRAM 응답 (토큰 불일치)\n" -#: fe-auth-scram.c:651 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\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 메시지 (서버 첫 메시지 끝에 쓸모 없는 값이 있음)\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 메시지 (서버 끝 메시지 뒤에 쓸모 없는 값이 있음)\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:935 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "메모리 부족" + +#: fe-auth-scram.c:944 +msgid "could not generate random salt" +msgstr "무작위 솔트 생성 실패" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -110,7 +140,8 @@ 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:100 +#: fe-secure-common.c:177 msgid "host name must be specified\n" msgstr "호스트 이름을 지정해야 함\n" @@ -127,172 +158,150 @@ 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 "서버는 non-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" +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" +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 "암호화 인증은 지원되지 않음\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:2834 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "UID %d 해당하는 사용자를 찾을 수 없음: %s\n" - -#: fe-auth.c:1119 fe-connect.c:2839 -#, 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:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "호스트 이름은 %d개인데, 호스트 주소는 %d개임\n" -#: fe-connect.c:1156 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "포트 번호는 %d개인데, 호스트는 %d개입니다.\n" -#: fe-connect.c:1249 +#: 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 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:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "" "SSL 연결 기능을 지원하지 않고 컴파일 된 경우는 sslmode 값으로 \"%s\" 값은 타" "당치 않습니다\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:1364 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:1389 #, c-format msgid "" "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" @@ -300,144 +309,133 @@ msgstr "" "GSSAPI 접속을 지원하지 않는 서버에서는 gssencmode 값(\"%s\")이 적당하지 않" "음\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:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "소켓을 TCP에 no delay 모드로 지정할 수 없음: %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 "" -"서버에 연결할 수 없음: %s\n" -"\t로컬호스트에 서버가 가동 중인지,\n" -"\t\"%s\" 유닉스 도메인 소켓 접근이 가능한지 살펴보십시오.\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "\"%s\" 소켓으로 서버 접속 할 수 없음: " -#: fe-connect.c:1717 +#: fe-connect.c:1738 #, c-format +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "\"%s\" (%s), %s 포트로 서버 접속 할 수 없음: " + +#: fe-connect.c:1743 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "\"%s\" 포트 %s 서버에 접속 할 수 없음: " + +#: fe-connect.c:1768 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%s 포트로 TCP/IP 연결이 가능한지 살펴보십시오.\n" +"\t로컬 연결을 시도 중이고, 유닉스 도메인 소켓 접속을 허용하는지 확인하세요.\n" -#: fe-connect.c:1725 -#, c-format +#: fe-connect.c:1772 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%s 포트로 TCP/IP 연결이 가능한지 살펴보십시오.\n" +"\t해당 호스트에 서버가 실행 중이고, TCP/IP 접속을 허용하는지 확인하세요.\n" -#: fe-connect.c:1795 +#: fe-connect.c:1836 #, 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: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) 실패: %s\n" +msgid "%s(%s) failed: %s\n" +msgstr "%s(%s) 실패: %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) 실패: %ui\n" +msgid "%s(%s) failed: error code %d\n" +msgstr "%s(%s) 실패: 오류 코드 %d\n" -#: fe-connect.c:2313 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "잘못된 연결 상태, 메모리 손상일 가능성이 큼\n" -#: fe-connect.c:2379 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "잘못된 포트 번호: \"%s\"\n" -#: fe-connect.c:2395 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "\"%s\" 호스트 이름을 전송할 수 없습니다: 대상 주소: %s\n" -#: fe-connect.c:2408 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "\"%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\" 유닉스 도메인 소켓 경로가 너무 깁니다 (최대 %d 바이트)\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 "\"%s\" 유닉스 도메인 소켓 경로를 전송할 수 없습니다: 대상 주소: %s\n" -#: fe-connect.c:2560 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "소켓을 만들 수 없음: %s\n" -#: fe-connect.c:2582 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "소켓을 nonblocking 모드로 지정할 수 없음: %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 "소켓을 close-on-exec 모드로 지정할 수 없음: %s\n" -#: fe-connect.c:2610 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "keepalives 매개변수값은 정수여야 합니다.\n" -#: fe-connect.c:2750 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "소켓 오류 상태를 구할 수 없음: %s\n" -#: fe-connect.c:2778 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "소켓에서 클라이언트 주소를 구할 수 없음: %s\n" -#: fe-connect.c:2820 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "requirepeer 매개변수는 이 운영체제에서 지원하지 않음\n" -#: fe-connect.c:2823 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "신뢰성 피어를 얻을 수 없습니다: %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 "" "\"%s\" 이름으로 requirepeer를 지정했지만, 실재 사용자 이름은 \"%s\" 입니다\n" -#: fe-connect.c:2887 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "GSSAPI 교섭 패킷을 보낼 수 없음: %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" @@ -445,160 +443,174 @@ msgstr "" "GSSAPI 암호화가 필요하지만 사용할 수 없음 (자격 증명 캐시가 없거나, 서버가 지" "원하지 않거나, 로컬 소켓을 사용하고 있는 듯합니다.)\n" -#: fe-connect.c:2926 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "SSL 교섭 패킷을 보낼 수 없음: %s\n" -#: fe-connect.c:2965 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "시작 패킷을 보낼 수 없음: %s\n" -#: fe-connect.c:3035 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "서버가 SSL 기능을 지원하지 않는데, SSL 기능을 요구했음\n" -#: fe-connect.c:3061 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "SSL 교섭에 대한 잘못된 응답을 감지했음: %c\n" -#: fe-connect.c:3151 +#: fe-connect.c:3114 +msgid "received unencrypted data after SSL response\n" +msgstr "SSL 응답 후에 비암호화 데이터를 받았음\n" + +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "서버가 GSSAPI 암호화 기능을 지원하지 않는데, 이것이 필요함\n" -#: fe-connect.c:3162 +#: fe-connect.c:3207 #, 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:3226 +msgid "received unencrypted data after GSSAPI encryption response\n" +msgstr "GSSAPI 암호화 응답 후 비암호화 데이터 받았음\n" + +#: fe-connect.c:3291 fe-connect.c:3316 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "서버가 인증을 요구했지만, %c 받았음\n" -#: fe-connect.c:3502 +#: fe-connect.c:3523 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:3615 +msgid "session is read-only\n" +msgstr "세션이 읽기 전용임\n" -#: fe-connect.c:3753 +#: fe-connect.c:3618 +msgid "session is not read-only\n" +msgstr "세션이 읽기 전용이 아님\n" + +#: fe-connect.c:3672 +msgid "server is in hot standby mode\n" +msgstr "서버가 hot standby 모드 상태임\n" + +#: fe-connect.c:3675 +msgid "server is not in hot standby mode\n" +msgstr "서버가 hot standby 모드 상태가 아님\n" + +#: fe-connect.c:3793 fe-connect.c:3845 #, 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:3768 +#: fe-connect.c:3859 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "잘못된 연결 상태 %d, 메모리 손상일 가능성이 큼\n" -#: fe-connect.c:4204 fe-connect.c:4264 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEVT_CONNRESET 이벤트 동안 PGEventProc \"%s\"이(가) 실패함\n" - -#: fe-connect.c:4611 +#: fe-connect.c:4842 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "잘못된 LDAP URL \"%s\": 스키마는 ldap:// 여야함\n" -#: fe-connect.c:4626 +#: fe-connect.c:4857 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "잘못된 LDAP URL \"%s\": 식별자 이름이 빠졌음\n" -#: fe-connect.c:4638 fe-connect.c:4693 +#: fe-connect.c:4869 fe-connect.c:4927 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "잘못된 LDAP URL \"%s\": 단 하나의 속성만 가져야함\n" -#: fe-connect.c:4649 fe-connect.c:4708 +#: fe-connect.c:4881 fe-connect.c:4943 #, 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:4660 +#: fe-connect.c:4893 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "잘못된 LDAP URL \"%s\": 필터 없음\n" -#: fe-connect.c:4681 +#: fe-connect.c:4915 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "잘못된 LDAP URL \"%s\": 포트번호가 잘못됨\n" -#: fe-connect.c:4717 +#: fe-connect.c:4953 msgid "could not create LDAP structure\n" msgstr "LDAP 구조를 만들 수 없음\n" -#: fe-connect.c:4793 +#: fe-connect.c:5029 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "LDAP 서버를 찾을 수 없음: %s\n" -#: fe-connect.c:4804 +#: fe-connect.c:5040 msgid "more than one entry found on LDAP lookup\n" msgstr "LDAP 검색에서 하나 이상의 엔트리가 발견되었음\n" -#: fe-connect.c:4805 fe-connect.c:4817 +#: fe-connect.c:5041 fe-connect.c:5053 msgid "no entry found on LDAP lookup\n" msgstr "LDAP 검색에서 해당 항목 없음\n" -#: fe-connect.c:4828 fe-connect.c:4841 +#: fe-connect.c:5064 fe-connect.c:5077 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:5129 fe-connect.c:5148 fe-connect.c:5680 #, 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:5221 fe-connect.c:5865 fe-connect.c:6641 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "잘못된 연결 옵션 \"%s\"\n" -#: fe-connect.c:5001 fe-connect.c:5493 +#: fe-connect.c:5237 fe-connect.c:5729 msgid "unterminated quoted string in connection info string\n" msgstr "연결문자열에서 완성되지 못한 따옴표문자열이 있음\n" -#: fe-connect.c:5084 +#: fe-connect.c:5318 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "\"%s\" 서비스 정의를 찾을 수 없음\n" -#: fe-connect.c:5107 +#: fe-connect.c:5344 #, c-format msgid "service file \"%s\" not found\n" msgstr "\"%s\" 서비스 파일을 찾을 수 없음\n" -#: fe-connect.c:5122 +#: fe-connect.c:5358 #, 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:5429 fe-connect.c:5473 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "\"%s\" 서비스 파일의 %d번째 줄에 구문 오류 있음\n" -#: fe-connect.c:5205 +#: fe-connect.c:5440 #, 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:6161 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "URI 구문 분석을 할 수 없음: \"%s\"\n" -#: fe-connect.c:6002 +#: fe-connect.c:6238 #, c-format msgid "" "end of string reached when looking for matching \"]\" in IPv6 host address " @@ -606,12 +618,12 @@ msgid "" msgstr "" "URI의 IPv6 호스트 주소에서 \"]\" 매칭 검색을 실패했습니다, 해당 URI: \"%s\"\n" -#: fe-connect.c:6009 +#: fe-connect.c:6245 #, 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:6260 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " @@ -620,41 +632,41 @@ msgstr "" "잘못된 \"%c\" 문자가 URI 문자열 가운데 %d 번째 있습니다(\":\" 또는 \"/\" 문자" "가 있어야 함): \"%s\"\n" -#: fe-connect.c:6153 +#: fe-connect.c:6390 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "키/밸류 구분자 \"=\" 문자가 필요함, 해당 URI 쿼리 매개변수: \"%s\"\n" -#: fe-connect.c:6173 +#: fe-connect.c:6410 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "키/밸류 구분자 \"=\" 문자가 필요함, 해당 URI 쿼리 매개변수: \"%s\"\n" -#: fe-connect.c:6224 +#: fe-connect.c:6462 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "잘못된 URL 쿼리 매개변수값: \"%s\"\n" -#: fe-connect.c:6298 +#: fe-connect.c:6536 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "잘못된 퍼센트 인코드 토큰: \"%s\"\n" -#: fe-connect.c:6308 +#: fe-connect.c:6546 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "퍼센트 인코드 값에 %%00 숨김 값이 있음: \"%s\"\n" -#: fe-connect.c:6671 +#: fe-connect.c:6916 msgid "connection pointer is NULL\n" msgstr "연결 포인터가 NULL\n" -#: fe-connect.c:6967 +#: fe-connect.c:7204 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "경고: \"%s\" 패스워드 파일이 plain 파일이 아님\n" -#: fe-connect.c:6976 +#: fe-connect.c:7213 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -663,130 +675,145 @@ msgstr "" "경고: 패스워드 파일 \"%s\"에 그룹 또는 범용 액세스 권한이 있습니다. 권한은 " "u=rw(0600) 이하여야 합니다.\n" -#: fe-connect.c:7084 +#: fe-connect.c:7321 #, 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:3402 #, c-format msgid "row number %d is out of range 0..%d" msgstr "%d 번째 행(row)은 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:1937 #, 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:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "명령 문자열이 null 포인터\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:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "파이프라인 모드에서는 %s 사용할 수 없음\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 +#, 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:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "실행 구문 이름이 null 포인트(값이 없음)입니다\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의 프로토콜을 요구하고 있습니다\n" - -#: fe-exec.c:1479 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "서버에 대한 연결이 없음\n" -#: fe-exec.c:1486 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "처리 중에 이미 다른 명령이 존재함\n" -#: fe-exec.c:1600 +#: fe-exec.c:1748 +msgid "cannot queue commands during COPY\n" +msgstr "COPY 작업 중 명령들을 큐에 담을 수 없음\n" + +#: fe-exec.c:1866 msgid "length must be given for binary parameter\n" msgstr "바이너리 자료 매개 변수를 사용할 때는 그 길이를 지정해야 함\n" -#: fe-exec.c:1863 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "기대되지 않은 동기화상태: %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:2347 +msgid "" +"synchronous command execution functions are not allowed in pipeline mode\n" +msgstr "파이프라인 모드에서는 동기식 명령 실행 함수는 사용할 수 없음\n" -#: fe-exec.c:2043 +#: fe-exec.c:2364 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:2381 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:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "처리 가운데 COPY가 없음\n" -#: fe-exec.c:2672 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "잘못된 상태의 연결\n" -#: fe-exec.c:2703 +#: fe-exec.c:2967 +msgid "cannot enter pipeline mode, connection not idle\n" +msgstr "파이프라인 모드로 바꿀 수 없음, 연결이 idle 상태가 아님\n" + +#: fe-exec.c:3004 fe-exec.c:3028 +msgid "cannot exit pipeline mode with uncollected results\n" +msgstr "수집할 수 없는 결과로 파이프라인 모드를 종료할 수 없음\n" + +#: fe-exec.c:3009 +msgid "cannot exit pipeline mode while busy\n" +msgstr "바빠서 파이프라인 모드를 종료할 수 없음\n" + +#: fe-exec.c:3021 +msgid "cannot exit pipeline mode while in COPY\n" +msgstr "COPY 하고 있어 파이프라인 모드를 종료할 수 없음\n" + +#: fe-exec.c:3188 +msgid "cannot send pipeline when not in pipeline mode\n" +msgstr "파이프라인 모드 상태가 아닐 때는 파이프라인을 보낼 수 없음\n" + +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "잘못된 ExecStatusType 코드" -#: fe-exec.c:2730 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult가 오류 결과가 아님\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3386 fe-exec.c:3409 #, c-format msgid "column number %d is out of range 0..%d" msgstr "%d 번째 열은 0..%d 범위를 벗어났음" -#: fe-exec.c:2843 +#: fe-exec.c:3424 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "%d개의 매개 변수는 0..%d 범위를 벗어났음" -#: fe-exec.c:3153 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "서버로부터 결과처리를 중지 시킬 수 없음: %s" -#: fe-exec.c:3392 fe-exec.c:3476 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "완성되지 않은 멀티바이트 문자\n" @@ -794,105 +821,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 "large object function을 초기화 하는 쿼리가 데이터를 리턴하지 않았음\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_create 함수의 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 "%lu 정수형 크기는 pqGetInt 함수에서 지원하지 않음" -#: fe-misc.c:325 +#: fe-misc.c:275 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "%lu 정수형 크기는 pqPutInt 함수에서 지원하지 않음" -#: 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: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" @@ -902,209 +885,178 @@ msgstr "" "\t이런 처리는 클라이언트의 요구를 처리하는 동안이나\n" "\t처리하기 전에 서버가 갑자기 종료되었음을 의미함\n" -#: fe-misc.c:1063 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "시간 초과\n" -#: fe-misc.c:1108 +#: fe-misc.c:1053 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 "잘못된 환경변수 상태 %c, 메모리 손상일 가능성이 큼\n" - -#: fe-protocol2.c:384 +#: fe-misc.c:1076 #, 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:184 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "휴지(idle)동안 서버로 부터 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 +#: fe-protocol3.c:393 msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " -"message)" -msgstr "" -"서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 자료(\"D\" 메시지)를 보냈음" - -#: fe-protocol2.c:607 -#, c-format -msgid "" -"server sent binary data (\"B\" message) without prior row description (\"T\" " -"message)" +"message)\n" msgstr "" -"서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 바이너리 자료(\"B\" 메시지)를 " -"보냈음" +"서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 자료(\"D\" 메시지)를 보냈음\n" -#: fe-protocol2.c:626 fe-protocol3.c:408 +#: fe-protocol3.c:436 #, 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 "" -"서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 자료(\"D\" 메시지)를 보냈음\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:461 #, 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:481 #, 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:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "\"T\" 메시지 안에 부족자 데이터" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "\"T\" 메시지 안에 잘못된 데이터" +#: fe-protocol3.c:644 fe-protocol3.c:850 +msgid "out of memory for query result" +msgstr "쿼리 결과 처리를 위한 메모리 부족" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "\"t\" 메시지 안에 잘못된 데이터" +#: fe-protocol3.c:713 +msgid "insufficient data in \"t\" message" +msgstr "\"t\" 메시지 안에 데이터가 충분하지 않음" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "\"D\" 메시지 안에 불충분한 데이터" -#: fe-protocol3.c:763 +#: fe-protocol3.c:778 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:1034 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:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " 위치: %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "상세정보: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "힌트: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "쿼리: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "구문: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "스키마 이름: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "테이블 이름: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "칼럼 이름: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "자료형 이름: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "제약조건 이름: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "위치: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "줄 %d: " -#: fe-protocol3.c:1732 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: text COPY OUT 작업을 할 수 없음\n" -#: fe-secure-common.c:124 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "프로토콜 오류: 함수 결과 없음\n" + +#: fe-protocol3.c:2151 +#, 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:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "인증서에 IP 주소용 %lu 길이가 잘못됨\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "인증서의 IP 주소를 문자열로 바꿀 수 없음: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "인증된 SSL 접속을 위해서는 호스트 이름을 지정해야 함\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 "" "서버 인증서의 이름 \"%s\"이(가) 호스트 이름 \"%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" @@ -1121,7 +1073,7 @@ msgstr "GSSAPI 송출 메시지는 기밀성을 사용하지 말아야함\n" msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" msgstr "클라이언트의 GSSAPI 패킷이 너무 큼 (%zu > %zu)\n" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:598 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" msgstr "서버의 GSSAPI 패킷이 너무 큼 (%zu > %zu)\n" @@ -1134,89 +1086,93 @@ msgstr "GSSAPI 벗기기 오류" msgid "incoming GSSAPI message did not use confidentiality\n" msgstr "GSSAPI 수신 메시지는 기밀성을 사용하지 말아야 함\n" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:644 msgid "could not initiate GSSAPI security context" msgstr "GSSAPI 보안 context 초기화 실패" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:672 msgid "GSSAPI size check error" msgstr "GSSAPI 크기 검사 오류" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:683 msgid "GSSAPI context establishment error" msgstr "GSSAPI context 설정 오류" -#: 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:1504 #, 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:1508 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:1517 #, 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:1567 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "알 수 없는 SSL 오류 코드: %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:414 msgid "could not determine server certificate signature algorithm\n" msgstr "서버 인증서 서명 알고리즘을 알 수 없음\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:435 #, c-format msgid "could not find digest for NID %s\n" msgstr "%s NID용 다이제스트를 찾을 수 없음\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:445 msgid "could not generate peer certificate hash\n" msgstr "피어 인증 해시 값을 만들 수 없음\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:502 msgid "SSL certificate's name entry is missing\n" msgstr "SSL 인증서의 이름 항목이 잘못됨\n" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:537 +msgid "SSL certificate's address entry is missing\n" +msgstr "SSL 인증서의 주소 항목이 빠졌음\n" + +#: fe-secure-openssl.c:955 #, c-format msgid "could not create SSL context: %s\n" msgstr "SSL context를 만들 수 없음: %s\n" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:994 #, 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:1005 #, 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:1023 #, 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:1034 #, 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:1070 #, 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:1123 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate " @@ -1226,7 +1182,7 @@ msgstr "" "해당 파일을 제공하거나 서버 인증서 확인을 사용하지 않도록 sslmode를 변경하십" "시오.\n" -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:1127 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1237,99 +1193,115 @@ msgstr "" "해당 파일을 제공하거나 서버 인증서 확인을 사용하지 않도록 sslmode를 변경하십" "시오.\n" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "\"%s\" 인증서 파일을 열수 없음: %s\n" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "\"%s\" 인증서 파일을 읽을 수 없음: %s\n" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1202 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "SSL 연결을 확립할 수 없음: %s\n" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1236 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s\n" +msgstr "서버 이름 표시(SNI)를 설정할 수 없음: %s\n" + +#: fe-secure-openssl.c:1282 #, 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:1294 #, 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:1310 #, 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:1324 #, 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:1362 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "인증서가 있지만, \"%s\" 개인키가 아닙니다.\n" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1366 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "\"%s\" 개인키 파일 상태를 알 수 없음: %m\n" + +#: fe-secure-openssl.c:1375 +#, c-format +msgid "private key file \"%s\" is not a regular file\n" +msgstr "\"%s\" 개인키 파일은 일반 파일이 아님\n" + +#: fe-secure-openssl.c:1408 #, c-format msgid "" -"private key file \"%s\" has group or world access; permissions should be " -"u=rw (0600) or less\n" +"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) 이하여야 합니다.\n" +"\"%s\" 개인키 파일의 접근권한이 그룹 또는 그외 사용자도 접근 가능함; 파일 소" +"유주가 현재 사용자라면, 접근권한을 u=rw (0600) 또는 더 작게 설정하고, root가 " +"소유주라면 u=rw,g=r (0640) 권한으로 지정하세요.\n" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1433 #, 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:1450 #, 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:1550 #, 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" +msgstr "해당 서버는 SSL 프로토콜 버전 %s - %s 사이를 지원하지 않습니다.\n" -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1586 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "인증서를 구하질 못했습니다: %s\n" -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1692 #, c-format msgid "no SSL error reported" msgstr "SSL 오류 없음이 보고됨" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1701 #, c-format msgid "SSL error code %lu" msgstr "SSL 오류 번호 %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:1956 #, 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" @@ -1338,3 +1310,152 @@ msgstr "서버에 데이터를 보낼 수 없음: %s\n" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "알 수 없는 소켓오류: 0x%08X/%d" + +#~ 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" + +#, c-format +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEVT_CONNRESET 이벤트 동안 PGEventProc \"%s\"이(가) 실패함\n" + +#, c-format +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEVT_RESULTCREATE 이벤트 동안 PGEventProc \"%s\" 실패함\n" + +#, c-format +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) 실패: %ui\n" + +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "lo_create 함수의 OID 조사를 할 수 없음\n" + +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "lo_create 함수의 OID 조사를 할 수 없음\n" + +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "lo_lseek 함수의 OID 조사를 할 수 없음\n" + +#~ msgid "cannot determine OID of function lo_lseek64\n" +#~ msgstr "lo_lseek64 함수의 OID를 알 수 없음\n" + +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "lo_open 함수의 OID 조사를 할 수 없음\n" + +#~ msgid "cannot determine OID of function lo_tell64\n" +#~ msgstr "lo_tell64 함수의 OID를 알 수 없음\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_unlink\n" +#~ msgstr "lo_unlink 함수의 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" + +#, 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" + +#, c-format +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "\"%s:%s\" 서버에 쓰기 가능한 연결을 맺을 수 없음\n" + +#~ msgid "extraneous data in \"D\" message" +#~ msgstr "\"D\" 메시지 안에 잘못된 데이터" + +#~ msgid "extraneous data in \"T\" message" +#~ msgstr "\"T\" 메시지 안에 잘못된 데이터" + +#~ msgid "extraneous data in \"t\" message" +#~ msgstr "\"t\" 메시지 안에 잘못된 데이터" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "함수는 적어도 버전 3의 프로토콜을 요구하고 있습니다\n" + +#, c-format +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "잘못된 channel_binding 값: \"%s\"\n" + +#, c-format +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "잘못된 gssencmode 값: \"%s\"\n" + +#, c-format +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "잘못된 환경변수 상태 %c, 메모리 손상일 가능성이 큼\n" + +#, c-format +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "잘못된 ssl_max_protocol_version 값: \"%s\"\n" + +#, c-format +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "잘못된 ssl_min_protocol_version 값: \"%s\"\n" + +#, c-format +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "잘못된 상태 %c, 메모리 손상일 가능성이 큼\n" + +#, c-format +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "잘못된 target_session_attrs 값: \"%s\"\n" + +#, c-format +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "서버와의 동기화가 끊김, 연결을 재 시도함" + +#, 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" + +#, c-format +#~ msgid "select() failed: %s\n" +#~ msgstr "select() 실패: %s\n" + +#, c-format +#~ msgid "" +#~ "server sent binary data (\"B\" message) without prior row description (\"T" +#~ "\" message)" +#~ msgstr "" +#~ "서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 바이너리 자료(\"B\" 메시지)" +#~ "를 보냈음" + +#, c-format +#~ msgid "" +#~ "server sent data (\"D\" message) without prior row description (\"T\" " +#~ "message)" +#~ msgstr "" +#~ "서버에서 먼저 행(row) 설명(\"T\" 메시지) 없이 자료(\"D\" 메시지)를 보냈음" + +#, c-format +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s) 실패: %s\n" + +#, c-format +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "\"%s:%s\" 서버에서 \"SHOW transaction_read_only\" 검사가 실패함\n" + +#, c-format +#~ msgid "" +#~ "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "비어있는 쿼리 응답(\"I\" 메시지)에 뒤이어 %c의 잘못된 문자가 있음" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/ru.po b/third_party/spanner_pg/src/interfaces/libpq/po/ru.po index 09351fd2..78affba4 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/ru.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-03 05:56+0300\n" +"POT-Creation-Date: 2024-02-02 18:11+0300\n" "PO-Revision-Date: 2023-08-30 15:09+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -21,102 +21,123 @@ 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:213 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "найти локального пользователя по идентификатору (%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:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "неправильное сообщение SCRAM (некорректная длина)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "не удалось проверить сигнатуру сервера\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "не удалось проверить сигнатуру сервера: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "некорректная сигнатура сервера\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "ошибочное состояние обмена SCRAM\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "неправильное сообщение SCRAM (ожидался атрибут \"%c\")\n" -#: fe-auth-scram.c:315 +#: 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:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "не удалось сгенерировать разовый код\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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4716 fe-connect.c:4977 fe-connect.c:5096 fe-connect.c:5348 -#: fe-connect.c:5429 fe-connect.c:5528 fe-connect.c:5784 fe-connect.c:5813 -#: fe-connect.c:5885 fe-connect.c:5909 fe-connect.c:5927 fe-connect.c:6028 -#: fe-connect.c:6037 fe-connect.c:6395 fe-connect.c:6545 fe-connect.c:6811 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4086 fe-exec.c:4251 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:445 fe-secure-openssl.c:1138 +#: 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:4829 fe-connect.c:5090 fe-connect.c:5209 fe-connect.c:5461 +#: fe-connect.c:5542 fe-connect.c:5641 fe-connect.c:5897 fe-connect.c:5926 +#: fe-connect.c:5998 fe-connect.c:6022 fe-connect.c:6040 fe-connect.c:6141 +#: fe-connect.c:6150 fe-connect.c:6508 fe-connect.c:6658 fe-connect.c:6924 +#: fe-exec.c:710 fe-exec.c:978 fe-exec.c:1326 fe-exec.c:3165 fe-exec.c:3357 +#: fe-exec.c:4139 fe-exec.c:4304 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:968 fe-protocol3.c:983 fe-protocol3.c:1016 +#: fe-protocol3.c:1724 fe-protocol3.c:2127 fe-secure-common.c:112 +#: fe-secure-gssapi.c:500 fe-secure-openssl.c:460 fe-secure-openssl.c:1272 msgid "out of memory\n" msgstr "нехватка памяти\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 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:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "не удалось вычислить подтверждение клиента: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "не удалось закодировать подтверждение клиента\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "неверный ответ SCRAM (несовпадение разового кода)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "неправильное сообщение SCRAM (некорректная соль)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "неправильное сообщение SCRAM (некорректное число итераций)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "" "неправильное сообщение SCRAM (мусор в конце первого сообщения сервера)\n" -#: fe-auth-scram.c:723 +#: 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:739 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "" "неправильное сообщение SCRAM (мусор в конце последнего сообщения сервера)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "неправильное сообщение SCRAM (неверная сигнатура сервера)\n" +#: fe-auth-scram.c:935 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:256 fe-protocol3.c:274 fe-protocol3.c:355 fe-protocol3.c:728 +msgid "out of memory" +msgstr "нехватка памяти" + +#: fe-auth-scram.c:944 +msgid "could not generate random salt" +msgstr "не удалось сгенерировать случайную соль" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -126,7 +147,8 @@ msgstr "недостаточно памяти для буфера GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "ошибка продолжения в GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 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" @@ -159,23 +181,23 @@ msgstr "требуется привязка каналов, но SSL не исп msgid "duplicate SASL authentication request\n" msgstr "повторный запрос аутентификации SASL\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "требуется привязка каналов, но клиент её не поддерживает\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "" "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "" "сервер предложил аутентификацию SCRAM-SHA-256-PLUS для соединения, не " "защищённого SSL\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "" "ни один из серверных механизмов аутентификации SASL не поддерживается\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" @@ -183,12 +205,12 @@ msgstr "" "требуется привязка каналов, но сервер не предложил поддерживающий её метод " "аутентификации\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "недостаточно памяти для буфера SASL (%d)\n" -#: fe-auth.c:664 +#: fe-auth.c:672 msgid "" "AuthenticationSASLFinal received from server, but SASL authentication was " "not completed\n" @@ -196,18 +218,27 @@ msgstr "" "c сервера получено сообщение AuthenticationSASLFinal, но аутентификация SASL " "ещё не завершена\n" -#: fe-auth.c:741 +#: 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" @@ -215,224 +246,214 @@ msgstr "" "требуется привязка каналов, но она не поддерживается при том запросе " "аутентификации, который передал сервер\n" -#: fe-auth.c:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "аутентификация Kerberos 4 не поддерживается\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "аутентификация Kerberos 5 не поддерживается\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "аутентификация через GSSAPI не поддерживается\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "аутентификация через SSPI не поддерживается\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "аутентификация Crypt не поддерживается\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "метод аутентификации %u не поддерживается\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "распознать имя пользователя не удалось (код ошибки: %lu)\n" -#: fe-auth.c:1117 fe-connect.c:2856 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "найти локального пользователя по идентификатору (%d) не удалось: %s\n" - -#: fe-auth.c:1122 fe-connect.c:2861 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "локальный пользователь с ID %d не существует\n" - -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "неожиданная форма набора результатов, возвращённого для SHOW\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "слишком длинное значение password_encryption\n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "нераспознанный алгоритм шифрования пароля \"%s\"\n" -#: fe-connect.c:1094 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "не удалось сопоставить имена узлов (%d) со значениями hostaddr (%d)\n" -#: fe-connect.c:1180 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "не удалось сопоставить номера портов (%d) с узлами (%d)\n" -#: fe-connect.c:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "неверное значение %s: \"%s\"\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "значение sslmode \"%s\" недопустимо для сборки без поддержки SSL\n" -#: fe-connect.c:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "неверный диапазон версий протокола SSL\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, c-format msgid "" "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "" "значение gssencmode \"%s\" недопустимо для сборки без поддержки GSSAPI\n" -#: fe-connect.c:1653 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "не удалось перевести сокет в режим TCP-передачи без задержки: %s\n" -#: fe-connect.c:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "подключиться к серверу через сокет \"%s\" не удалось: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "подключиться к серверу \"%s\" (%s), порту %s не удалось: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "подключиться к серверу \"%s\", порту %s не удалось: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "" "\tIs the server running locally and accepting connections on that socket?\n" msgstr "" "\tСервер действительно работает локально и принимает подключения через этот " "сокет?\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "" "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "" "\tСервер действительно работает по данному адресу и принимает TCP-" "соединения?\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "" "неверное целочисленное значение \"%s\" для параметра соединения \"%s\"\n" -#: fe-connect.c:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "ошибка в %s(%s): %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "ошибка в %s(%s): код ошибки %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "неверное состояние соединения - возможно разрушение памяти\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "неверный номер порта: \"%s\"\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "преобразовать имя \"%s\" в адрес не удалось: %s\n" -#: fe-connect.c:2418 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "не удалось разобрать сетевой адрес \"%s\": %s\n" -#: fe-connect.c:2431 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "длина пути Unix-сокета \"%s\" превышает предел (%d байт)\n" -#: fe-connect.c:2446 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "преобразовать путь Unix-сокета \"%s\" в адрес не удалось: %s\n" -#: fe-connect.c:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "не удалось создать сокет: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "не удалось перевести сокет в неблокирующий режим: %s\n" -#: fe-connect.c:2613 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "" "не удалось перевести сокет в режим закрытия при выполнении (close-on-exec): " "%s\n" -#: fe-connect.c:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "параметр keepalives должен быть целым числом\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "не удалось получить статус ошибки сокета: %s\n" -#: fe-connect.c:2800 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "не удалось получить адрес клиента из сокета: %s\n" -#: fe-connect.c:2842 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "параметр requirepeer не поддерживается в этой ОС\n" -#: fe-connect.c:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "не удалось получить учётные данные сервера: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "" "requirepeer допускает подключение только к \"%s\", но сервер работает под " "именем \"%s\"\n" -#: fe-connect.c:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "не удалось отправить пакет согласования GSSAPI: %s\n" -#: fe-connect.c:2921 +#: fe-connect.c:2917 msgid "" "GSSAPI encryption required but was impossible (possibly no credential cache, " "no server support, or using a local socket)\n" @@ -441,170 +462,165 @@ msgstr "" "отсутствует кеш учётных данных, нет поддержки на сервере или используется " "локальный сокет)\n" -#: fe-connect.c:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "не удалось отправить пакет согласования SSL: %s\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "не удалось отправить стартовый пакет: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "затребовано подключение через SSL, но сервер не поддерживает SSL\n" -#: fe-connect.c:3097 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "получен неверный ответ при согласовании SSL: %c\n" -#: fe-connect.c:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "после ответа SSL получены незашифрованные данные\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "затребовано шифрование GSSAPI, но сервер его не поддерживает\n" -#: fe-connect.c:3211 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "получен неверный ответ при согласовании GSSAPI: %c\n" -#: fe-connect.c:3230 +#: fe-connect.c:3226 msgid "received unencrypted data after GSSAPI encryption response\n" msgstr "" "после ответа на запрос шифрования GSSAPI получены незашифрованные данные\n" -#: fe-connect.c:3295 fe-connect.c:3320 +#: fe-connect.c:3291 fe-connect.c:3316 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "ожидался запрос аутентификации от сервера, но получено: %c\n" -#: fe-connect.c:3527 +#: fe-connect.c:3523 msgid "unexpected message from server during startup\n" msgstr "неожиданное сообщение от сервера в начале работы\n" -#: fe-connect.c:3619 +#: fe-connect.c:3615 msgid "session is read-only\n" msgstr "сеанс не допускает запись\n" -#: fe-connect.c:3622 +#: fe-connect.c:3618 msgid "session is not read-only\n" msgstr "сеанс допускает запись\n" -#: fe-connect.c:3676 +#: fe-connect.c:3672 msgid "server is in hot standby mode\n" msgstr "сервер работает в режиме горячего резерва\n" -#: fe-connect.c:3679 +#: fe-connect.c:3675 msgid "server is not in hot standby mode\n" msgstr "сервер работает не в режиме горячего резерва\n" -#: fe-connect.c:3797 fe-connect.c:3849 +#: fe-connect.c:3793 fe-connect.c:3845 #, c-format msgid "\"%s\" failed\n" msgstr "выполнить \"%s\" не удалось\n" -#: fe-connect.c:3863 +#: fe-connect.c:3859 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "неверное состояние соединения %d - возможно разрушение памяти\n" -#: fe-connect.c:4309 fe-connect.c:4369 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "ошибка в PGEventProc \"%s\" при обработке события PGEVT_CONNRESET\n" - -#: fe-connect.c:4729 +#: fe-connect.c:4842 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "некорректный адрес LDAP \"%s\": схема должна быть ldap://\n" -#: fe-connect.c:4744 +#: fe-connect.c:4857 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "некорректный адрес LDAP \"%s\": отсутствует уникальное имя\n" -#: fe-connect.c:4756 fe-connect.c:4814 +#: fe-connect.c:4869 fe-connect.c:4927 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "некорректный адрес LDAP \"%s\": должен быть только один атрибут\n" -#: fe-connect.c:4768 fe-connect.c:4830 +#: fe-connect.c:4881 fe-connect.c:4943 #, 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:4780 +#: fe-connect.c:4893 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "некорректный адрес LDAP \"%s\": нет фильтра\n" -#: fe-connect.c:4802 +#: fe-connect.c:4915 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "некорректный адрес LDAP \"%s\": неверный номер порта\n" -#: fe-connect.c:4840 +#: fe-connect.c:4953 msgid "could not create LDAP structure\n" msgstr "не удалось создать структуру LDAP\n" -#: fe-connect.c:4916 +#: fe-connect.c:5029 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "ошибка поиска на сервере LDAP: %s\n" -#: fe-connect.c:4927 +#: fe-connect.c:5040 msgid "more than one entry found on LDAP lookup\n" msgstr "при поиске LDAP найдено более одного вхождения\n" -#: fe-connect.c:4928 fe-connect.c:4940 +#: fe-connect.c:5041 fe-connect.c:5053 msgid "no entry found on LDAP lookup\n" msgstr "при поиске LDAP ничего не найдено\n" -#: fe-connect.c:4951 fe-connect.c:4964 +#: fe-connect.c:5064 fe-connect.c:5077 msgid "attribute has no values on LDAP lookup\n" msgstr "атрибут не содержит значений при поиске LDAP\n" -#: fe-connect.c:5016 fe-connect.c:5035 fe-connect.c:5567 +#: fe-connect.c:5129 fe-connect.c:5148 fe-connect.c:5680 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "в строке соединения нет \"=\" после \"%s\"\n" -#: fe-connect.c:5108 fe-connect.c:5752 fe-connect.c:6528 +#: fe-connect.c:5221 fe-connect.c:5865 fe-connect.c:6641 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "неверный параметр соединения \"%s\"\n" -#: fe-connect.c:5124 fe-connect.c:5616 +#: fe-connect.c:5237 fe-connect.c:5729 msgid "unterminated quoted string in connection info string\n" msgstr "в строке соединения не хватает закрывающей кавычки\n" -#: fe-connect.c:5205 +#: fe-connect.c:5318 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "определение службы \"%s\" не найдено\n" -#: fe-connect.c:5231 +#: fe-connect.c:5344 #, c-format msgid "service file \"%s\" not found\n" msgstr "файл определений служб \"%s\" не найден\n" -#: fe-connect.c:5245 +#: fe-connect.c:5358 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "слишком длинная строка (%d) в файле определений служб \"%s\"\n" -#: fe-connect.c:5316 fe-connect.c:5360 +#: fe-connect.c:5429 fe-connect.c:5473 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "синтаксическая ошибка в файле определения служб \"%s\" (строка %d)\n" -#: fe-connect.c:5327 +#: fe-connect.c:5440 #, c-format msgid "" "nested service specifications not supported in service file \"%s\", line %d\n" @@ -612,24 +628,24 @@ msgstr "" "рекурсивные определения служб не поддерживаются (файл определения служб " "\"%s\", строка %d)\n" -#: fe-connect.c:6048 +#: fe-connect.c:6161 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "во внутреннюю процедуру разбора строки передан ошибочный URI: \"%s\"\n" -#: fe-connect.c:6125 +#: fe-connect.c:6238 #, 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:6132 +#: fe-connect.c:6245 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6, содержащийся в URI, не может быть пустым: \"%s\"\n" -#: fe-connect.c:6147 +#: fe-connect.c:6260 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " @@ -638,41 +654,41 @@ msgstr "" "неожиданный символ \"%c\" в позиции %d в URI (ожидалось \":\" или \"/\"): " "\"%s\"\n" -#: fe-connect.c:6277 +#: fe-connect.c:6390 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "лишний разделитель ключа/значения \"=\" в параметрах URI: \"%s\"\n" -#: fe-connect.c:6297 +#: fe-connect.c:6410 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "в параметрах URI не хватает разделителя ключа/значения \"=\": \"%s\"\n" -#: fe-connect.c:6349 +#: fe-connect.c:6462 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "неверный параметр в URI: \"%s\"\n" -#: fe-connect.c:6423 +#: fe-connect.c:6536 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "неверный символ, закодированный с %%: \"%s\"\n" -#: fe-connect.c:6433 +#: fe-connect.c:6546 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "недопустимое значение %%00 для символа, закодированного с %%: \"%s\"\n" -#: fe-connect.c:6803 +#: fe-connect.c:6916 msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7091 +#: fe-connect.c:7204 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:7100 +#: fe-connect.c:7213 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -681,151 +697,146 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: к файлу паролей \"%s\" имеют доступ все или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7208 +#: fe-connect.c:7321 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "пароль получен из файла \"%s\"\n" -#: fe-exec.c:449 fe-exec.c:3383 +#: fe-exec.c:466 fe-exec.c:3431 #, c-format msgid "row number %d is out of range 0..%d" msgstr "номер записи %d вне диапазона 0..%d" -#: fe-exec.c:510 fe-protocol3.c:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "нехватка памяти" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1932 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "ошибка при передаче данных серверу\n" -#: fe-exec.c:864 +#: fe-exec.c:877 +msgid "no error text available\n" +msgstr "текст ошибки отсутствует\n" + +#: fe-exec.c:966 msgid "NOTICE" msgstr "ЗАМЕЧАНИЕ" -#: fe-exec.c:922 +#: fe-exec.c:1024 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не может вместить больше чем INT_MAX кортежей" -#: fe-exec.c:934 +#: fe-exec.c:1036 msgid "size_t overflow" msgstr "переполнение size_t" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1450 fe-exec.c:1521 fe-exec.c:1570 msgid "command string is a null pointer\n" msgstr "указатель на командную строку нулевой\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1457 fe-exec.c:2908 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s не допускается в конвейерном режиме\n" + +#: fe-exec.c:1527 fe-exec.c:1576 fe-exec.c:1672 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "число параметров должно быть от 0 до %d\n" -#: fe-exec.c:1520 fe-exec.c:1622 +#: fe-exec.c:1564 fe-exec.c:1666 msgid "statement name is a null pointer\n" msgstr "указатель на имя оператора нулевой\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1710 fe-exec.c:3276 msgid "no connection to the server\n" msgstr "нет соединения с сервером\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1719 fe-exec.c:3285 msgid "another command is already in progress\n" msgstr "уже выполняется другая команда\n" -#: fe-exec.c:1704 +#: fe-exec.c:1750 msgid "cannot queue commands during COPY\n" msgstr "во время COPY нельзя добавлять команды в очередь\n" -#: fe-exec.c:1822 +#: fe-exec.c:1868 msgid "length must be given for binary parameter\n" msgstr "для двоичного параметра должна быть указана длина\n" -#: fe-exec.c:2149 +#: fe-exec.c:2183 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "неожиданный asyncStatus: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "ошибка в PGEventProc \"%s\" при обработке события PGEVT_RESULTCREATE\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2341 msgid "" "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "" "функции синхронного выполнения команд не допускаются в конвейерном режиме\n" -#: fe-exec.c:2355 +#: fe-exec.c:2358 msgid "COPY terminated by new PQexec" msgstr "операция COPY прервана вызовом PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2375 msgid "PQexec not allowed during COPY BOTH\n" msgstr "вызов PQexec не допускается в процессе COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2603 fe-exec.c:2659 fe-exec.c:2728 fe-protocol3.c:1863 msgid "no COPY in progress\n" msgstr "операция COPY не выполняется\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn не допускается в конвейерном режиме\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2917 msgid "connection in wrong state\n" msgstr "соединение в неправильном состоянии\n" -#: fe-exec.c:2954 +#: fe-exec.c:2961 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "перейти в конвейерный режиме нельзя, соединение не простаивает\n" -#: fe-exec.c:2991 fe-exec.c:3015 +#: fe-exec.c:2998 fe-exec.c:3022 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "выйти из конвейерного режима нельзя, не собрав все результаты\n" -#: fe-exec.c:2996 +#: fe-exec.c:3003 msgid "cannot exit pipeline mode while busy\n" msgstr "выйти из конвейерного режима в занятом состоянии нельзя\n" -#: fe-exec.c:3008 +#: fe-exec.c:3015 msgid "cannot exit pipeline mode while in COPY\n" msgstr "выйти из конвейерного режима во время COPY нельзя\n" -#: fe-exec.c:3169 +#: fe-exec.c:3209 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "отправить конвейер, не перейдя в конвейерный режим, нельзя\n" -#: fe-exec.c:3272 +#: fe-exec.c:3320 msgid "invalid ExecStatusType code" msgstr "неверный код ExecStatusType" -#: fe-exec.c:3299 +#: fe-exec.c:3347 msgid "PGresult is not an error result\n" msgstr "В PGresult не передан результат ошибки\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3415 fe-exec.c:3438 #, c-format msgid "column number %d is out of range 0..%d" msgstr "номер столбца %d вне диапазона 0..%d" -#: fe-exec.c:3405 +#: fe-exec.c:3453 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "номер параметра %d вне диапазона 0..%d" -#: fe-exec.c:3715 +#: fe-exec.c:3764 #, c-format msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:3979 fe-exec.c:4068 +#: fe-exec.c:4030 fe-exec.c:4121 msgid "incomplete multibyte character\n" msgstr "неполный многобайтный символ\n" @@ -834,8 +845,8 @@ 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 +#: 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 "определить OID функции %s нельзя\n" @@ -852,22 +863,22 @@ msgstr "аргумент lo_read не умещается в обычном це msgid "argument of lo_write exceeds integer range\n" msgstr "аргумент lo_write не умещается в обычном целом\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 "не удалось открыть файл \"%s\": %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "не удалось прочитать файл \"%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 "не удалось записать файл \"%s\": %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "запрос инициализации функций для больших объектов не вернул данные\n" @@ -885,8 +896,9 @@ msgstr "функция pqPutInt не поддерживает integer разме msgid "connection not open\n" msgstr "соединение не открыто\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:331 +#: fe-secure.c:262 fe-secure.c:430 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" @@ -896,15 +908,15 @@ msgstr "" "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "тайм-аут\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "неверный сокет\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "ошибка в %s(): %s\n" @@ -914,7 +926,7 @@ msgstr "ошибка в %s(): %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "от сервера во время простоя получено сообщение типа 0x%02x" -#: fe-protocol3.c:407 +#: fe-protocol3.c:388 msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " "message)\n" @@ -922,252 +934,270 @@ msgstr "" "сервер отправил данные (сообщение \"D\") без предварительного описания " "строки (сообщение \"T\")\n" -#: fe-protocol3.c:450 +#: fe-protocol3.c:431 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "неожиданный ответ сервера; первый полученный символ: \"%c\"\n" -#: fe-protocol3.c:475 +#: fe-protocol3.c:456 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "содержимое не соответствует длине в сообщении типа \"%c\"\n" -#: fe-protocol3.c:495 +#: fe-protocol3.c:476 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "" "потеряна синхронизация с сервером: получено сообщение типа \"%c\", длина %d\n" -#: fe-protocol3.c:547 fe-protocol3.c:587 +#: fe-protocol3.c:528 fe-protocol3.c:568 msgid "insufficient data in \"T\" message" msgstr "недостаточно данных в сообщении \"T\"" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:639 fe-protocol3.c:845 msgid "out of memory for query result" msgstr "недостаточно памяти для результата запроса" -#: fe-protocol3.c:727 +#: fe-protocol3.c:708 msgid "insufficient data in \"t\" message" msgstr "недостаточно данных в сообщении \"t\"" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:767 fe-protocol3.c:799 fe-protocol3.c:817 msgid "insufficient data in \"D\" message" msgstr "недостаточно данных в сообщении \"D\"" -#: fe-protocol3.c:792 +#: fe-protocol3.c:773 msgid "unexpected field count in \"D\" message" msgstr "неверное число полей в сообщении \"D\"" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1029 msgid "no error message available\n" msgstr "нет сообщения об ошибке\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1077 fe-protocol3.c:1096 #, c-format msgid " at character %s" msgstr " символ %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1109 #, c-format msgid "DETAIL: %s\n" msgstr "ПОДРОБНОСТИ: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1112 #, c-format msgid "HINT: %s\n" msgstr "ПОДСКАЗКА: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1115 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПРОС: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1122 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1131 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "СХЕМА: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1135 #, c-format msgid "TABLE NAME: %s\n" msgstr "ТАБЛИЦА: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1139 #, c-format msgid "COLUMN NAME: %s\n" msgstr "СТОЛБЕЦ: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1143 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ТИП ДАННЫХ: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1147 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ОГРАНИЧЕНИЕ: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1159 msgid "LOCATION: " msgstr "ПОЛОЖЕНИЕ: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1161 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1163 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1358 #, c-format msgid "LINE %d: " msgstr "СТРОКА %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1757 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline можно вызывать только во время COPY OUT с текстом\n" #: fe-protocol3.c:2134 +msgid "protocol error: no function result\n" +msgstr "ошибка протокола: нет результата функции\n" + +#: fe-protocol3.c:2146 #, c-format msgid "protocol error: id=0x%x\n" msgstr "ошибка протокола: id=0x%x\n" -#: fe-secure-common.c:124 +#: fe-secure-common.c:126 msgid "SSL certificate's name contains embedded null\n" msgstr "имя в SSL-сертификате включает нулевой байт\n" -#: fe-secure-common.c:171 +#: fe-secure-common.c:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "сертификат содержит IP-адрес неверной длины %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "не удалось преобразовать в строку IP-адрес из сертификата: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "для проверенного SSL-соединения должно указываться имя узла\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 "" "серверный сертификат для \"%s\" не соответствует имени сервера \"%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" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:209 +#: fe-secure-gssapi.c:202 msgid "outgoing GSSAPI message would not use confidentiality\n" msgstr "исходящее сообщение GSSAPI не будет защищено\n" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:210 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" msgstr "клиент попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)\n" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:598 +#: fe-secure-gssapi.c:350 fe-secure-gssapi.c:594 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" msgstr "сервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)\n" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:389 msgid "GSSAPI unwrap error" msgstr "ошибка развёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:403 +#: fe-secure-gssapi.c:399 msgid "incoming GSSAPI message did not use confidentiality\n" msgstr "входящее сообщение GSSAPI не защищено\n" -#: fe-secure-gssapi.c:644 +#: fe-secure-gssapi.c:640 msgid "could not initiate GSSAPI security context" msgstr "не удалось инициализировать контекст безопасности GSSAPI" -#: fe-secure-gssapi.c:672 +#: fe-secure-gssapi.c:668 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: fe-secure-gssapi.c:683 +#: fe-secure-gssapi.c:679 msgid "GSSAPI context establishment error" msgstr "ошибка установления контекста в GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1372 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:336 fe-secure-openssl.c:1512 #, 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:1376 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:343 fe-secure-openssl.c:1516 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:1385 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:354 fe-secure-openssl.c:1525 #, 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:369 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:1435 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:375 fe-secure-openssl.c:1575 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "нераспознанный код ошибки SSL: %d\n" -#: fe-secure-openssl.c:405 +#: fe-secure-openssl.c:420 msgid "could not determine server certificate signature algorithm\n" msgstr "не удалось определить алгоритм подписи сертификата сервера\n" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:441 #, c-format msgid "could not find digest for NID %s\n" msgstr "не удалось найти алгоритм хеширования по NID %s\n" -#: fe-secure-openssl.c:436 +#: fe-secure-openssl.c:451 msgid "could not generate peer certificate hash\n" msgstr "не удалось сгенерировать хеш сертификата сервера\n" -#: fe-secure-openssl.c:493 +#: fe-secure-openssl.c:508 msgid "SSL certificate's name entry is missing\n" msgstr "в SSL-сертификате отсутствует запись имени\n" -#: fe-secure-openssl.c:827 +#: fe-secure-openssl.c:543 +msgid "SSL certificate's address entry is missing\n" +msgstr "в SSL-сертификате отсутствует запись адреса\n" + +#: fe-secure-openssl.c:961 #, c-format msgid "could not create SSL context: %s\n" msgstr "не удалось создать контекст SSL: %s\n" -#: fe-secure-openssl.c:866 +#: fe-secure-openssl.c:1000 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "неверное значение \"%s\" для минимальной версии протокола SSL\n" -#: fe-secure-openssl.c:877 +#: fe-secure-openssl.c:1011 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "не удалось задать минимальную версию протокола SSL: %s\n" -#: fe-secure-openssl.c:895 +#: fe-secure-openssl.c:1029 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "неверное значение \"%s\" для максимальной версии протокола SSL\n" -#: fe-secure-openssl.c:906 +#: fe-secure-openssl.c:1040 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "не удалось задать максимальную версию протокола SSL: %s\n" -#: fe-secure-openssl.c:942 +#: fe-secure-openssl.c:1076 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "не удалось прочитать файл корневых сертификатов \"%s\": %s\n" -#: fe-secure-openssl.c:995 +#: fe-secure-openssl.c:1129 msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file or change sslmode to disable server certificate " @@ -1177,7 +1207,7 @@ msgstr "" "Укажите полный путь к файлу или отключите проверку сертификата сервера, " "изменив sslmode.\n" -#: fe-secure-openssl.c:999 +#: fe-secure-openssl.c:1133 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1188,58 +1218,63 @@ msgstr "" "Укажите полный путь к файлу или отключите проверку сертификата сервера, " "изменив sslmode.\n" -#: fe-secure-openssl.c:1030 +#: fe-secure-openssl.c:1164 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "не удалось открыть файл сертификата \"%s\": %s\n" -#: fe-secure-openssl.c:1049 +#: fe-secure-openssl.c:1183 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "не удалось прочитать файл сертификата \"%s\": %s\n" -#: fe-secure-openssl.c:1074 +#: fe-secure-openssl.c:1208 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "не удалось установить SSL-соединение: %s\n" -#: fe-secure-openssl.c:1108 +#: fe-secure-openssl.c:1242 #, 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:1154 +#: fe-secure-openssl.c:1288 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "не удалось загрузить модуль SSL ENGINE \"%s\": %s\n" -#: fe-secure-openssl.c:1166 +#: fe-secure-openssl.c:1300 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "не удалось инициализировать модуль SSL ENGINE \"%s\": %s\n" -#: fe-secure-openssl.c:1182 +#: fe-secure-openssl.c:1316 #, 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:1196 +#: fe-secure-openssl.c:1330 #, 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:1233 +#: fe-secure-openssl.c:1368 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "при наличии сертификата отсутствует файл закрытого ключа \"%s\"\n" -#: fe-secure-openssl.c:1242 +#: fe-secure-openssl.c:1372 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "не удалось получить информацию о файле закрытого ключа \"%s\": %m\n" + +#: fe-secure-openssl.c:1381 #, c-format msgid "private key file \"%s\" is not a regular file\n" msgstr "файл закрытого ключа \"%s\" - не обычный файл\n" -#: fe-secure-openssl.c:1275 +#: fe-secure-openssl.c:1414 #, c-format msgid "" "private key file \"%s\" has group or world access; file must have " @@ -1251,17 +1286,17 @@ msgstr "" "текущему пользователю, либо u=rw,g=r (0640) или более строгие, если он " "принадлежит root\n" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1439 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1318 +#: fe-secure-openssl.c:1456 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "сертификат не соответствует файлу закрытого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1418 +#: fe-secure-openssl.c:1558 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " @@ -1270,32 +1305,32 @@ msgstr "" "Это может указывать на то, что сервер не поддерживает ни одну версию " "протокола SSL между %s и %s.\n" -#: fe-secure-openssl.c:1454 +#: fe-secure-openssl.c:1594 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "не удалось получить сертификат: %s\n" -#: fe-secure-openssl.c:1560 +#: fe-secure-openssl.c:1700 #, c-format msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: fe-secure-openssl.c:1569 +#: fe-secure-openssl.c:1709 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: fe-secure-openssl.c:1817 +#: fe-secure-openssl.c:1988 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: значение sslpassword усечено\n" -#: fe-secure.c:267 +#: fe-secure.c:274 #, c-format msgid "could not receive data from server: %s\n" msgstr "не удалось получить данные с сервера: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:443 #, c-format msgid "could not send data to server: %s\n" msgstr "не удалось передать данные серверу: %s\n" @@ -1305,10 +1340,12 @@ msgstr "не удалось передать данные серверу: %s\n" msgid "unrecognized socket error: 0x%08X/%d" msgstr "нераспознанная ошибка сокета: 0x%08X/%d" -#~ msgid "private key file \"%s\" must be owned by the current user or root\n" +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "ошибка в PGEventProc \"%s\" при обработке события PGEVT_CONNRESET\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" #~ msgstr "" -#~ "файл закрытого ключа \"%s\" должен принадлежать root или текущему " -#~ "пользователю\n" +#~ "ошибка в PGEventProc \"%s\" при обработке события PGEVT_RESULTCREATE\n" #~ msgid "invalid channel_binding value: \"%s\"\n" #~ msgstr "неверное значение channel_binding: \"%s\"\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/sv.po b/third_party/spanner_pg/src/interfaces/libpq/po/sv.po index 8c84415e..473713cb 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/sv.po +++ b/third_party/spanner_pg/src/interfaces/libpq/po/sv.po @@ -6,10 +6,10 @@ # 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: 2022-08-04 09:26+0000\n" -"PO-Revision-Date: 2022-08-04 12:19+0200\n" +"POT-Creation-Date: 2022-09-29 11:40+0000\n" +"PO-Revision-Date: 2022-09-29 21:30+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,98 +18,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: fe-auth-scram.c:213 +#: ../../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:219 +#: 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:263 -msgid "could not verify server signature\n" -msgstr "kunde inte verifiera serversignaturen\n" +#: 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:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "felaktig serversignatur\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "ogiltig SCRAM-utbytesstatus\n" -#: fe-auth-scram.c:306 +#: 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:315 +#: 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:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "kunde inte skapa engångsnummer\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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4711 fe-connect.c:4972 fe-connect.c:5091 fe-connect.c:5343 -#: fe-connect.c:5424 fe-connect.c:5523 fe-connect.c:5779 fe-connect.c:5808 -#: fe-connect.c:5880 fe-connect.c:5904 fe-connect.c:5922 fe-connect.c:6023 -#: fe-connect.c:6032 fe-connect.c:6390 fe-connect.c:6540 fe-connect.c:6806 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4082 fe-exec.c:4247 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 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:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 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:374 +#: fe-auth-scram.c:392 msgid "could not encode nonce\n" msgstr "kunde inte koda engångsnummer\n" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "kunde inte räkna ut klientbevis\n" +#: 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:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "kunde inte koda klientbevis\n" -#: fe-auth-scram.c:634 +#: 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:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "felaktigt SCRAM-meddelande (ogiltigt salt)\n" -#: fe-auth-scram.c:681 +#: 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:687 +#: 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:723 +#: 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:739 +#: 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:758 +#: 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:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "slut på minne" + +#: fe-auth-scram.c:943 +msgid "could not generate random salt" +msgstr "kunde inte generera slumpat salt" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -119,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:391 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" @@ -152,621 +174,610 @@ msgstr "kräver kanalbindning, men SSL används inte\n" msgid "duplicate SASL authentication request\n" msgstr "duplicerad autentiseringsbegäran från SASL\n" -#: fe-auth.c:496 +#: 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:513 +#: 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:525 +#: 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:533 +#: 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:639 +#: 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:664 +#: 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:741 +#: 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:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Kerberos-4-autentisering stöds ej\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Kerberos-5-autentisering stöds ej\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "GSSAPI-autentisering stöds ej\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "SSPI-autentisering stöds ej\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Crypt-autentisering stöds ej\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "autentiseringsmetod %u stöds ej\n" -#: fe-auth.c:1107 +#: 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:1117 fe-connect.c:2856 -#, 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:1122 fe-connect.c:2861 -#, 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:1226 +#: 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:1235 +#: 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:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "okänd lösenordskrypteringsalgoritm \"%s\"\n" -#: fe-connect.c:1094 +#: 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:1180 +#: 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:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "ogiltigt %s-värde: \"%s\"\n" -#: fe-connect.c:1320 +#: 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:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "ogiltigt intervall för SSL-protokollversion\n" -#: fe-connect.c:1393 +#: 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:1653 +#: 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:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "anslutning till server på uttag \"%s\" misslyckades: " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "anslutning til server på \"%s\" (%s), port %s misslyckades: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "anslutning till server på \"%s\", port %s misslyckades: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "" "\tKör servern lokalt och accepterar den\n" "\tanslutningar till detta uttag (socket)?\n" -#: fe-connect.c:1776 +#: 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:1840 +#: 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:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s) misslyckades: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) misslyckades: felkod %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "ogiltigt tillstånd i anslutning, antagligen korrupt minne\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "ogiltigt portnummer \"%s\"\n" -#: fe-connect.c:2405 +#: 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:2418 +#: 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:2431 +#: 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:2446 +#: 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:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "kan inte skapa uttag: %s\n" -#: fe-connect.c:2603 +#: 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:2613 +#: 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:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "keepalives-parameter måste vara ett heltal\n" -#: fe-connect.c:2772 +#: 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:2800 +#: 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:2842 +#: 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:2845 +#: 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:2869 +#: 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:2909 +#: 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:2921 +#: 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:2963 +#: 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:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "kan inte skicka startpaketet: %s\n" -#: fe-connect.c:3070 +#: 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:3097 +#: 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:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "tog emot okrypterad data efter SSL-svar\n" -#: fe-connect.c:3199 +#: 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:3211 +#: 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:3230 +#: 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:3290 fe-connect.c:3315 +#: 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:3522 +#: 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:3614 +#: fe-connect.c:3610 msgid "session is read-only\n" msgstr "sessionen är i readonly-läge\n" -#: fe-connect.c:3617 +#: fe-connect.c:3613 msgid "session is not read-only\n" msgstr "sessionen är inte i readonly-läge\n" -#: fe-connect.c:3671 +#: fe-connect.c:3667 msgid "server is in hot standby mode\n" msgstr "servern är i varmt standby-läge\n" -#: fe-connect.c:3674 +#: 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:3792 fe-connect.c:3844 +#: fe-connect.c:3788 fe-connect.c:3840 #, c-format msgid "\"%s\" failed\n" msgstr "\"%s\" misslyckades\n" -#: fe-connect.c:3858 +#: fe-connect.c:3854 #, c-format 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:4304 fe-connect.c:4364 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc \"%s\" misslyckades under PGEVT_CONNRESET-händelse\n" - -#: fe-connect.c:4724 +#: 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:4739 +#: 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:4751 fe-connect.c:4809 +#: 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:4763 fe-connect.c:4825 +#: 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:4775 +#: 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:4797 +#: 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:4835 +#: fe-connect.c:4948 msgid "could not create LDAP structure\n" msgstr "kunde inte skapa LDAP-struktur\n" -#: fe-connect.c:4911 +#: 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:4922 +#: 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:4923 fe-connect.c:4935 +#: 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:4946 fe-connect.c:4959 +#: 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:5011 fe-connect.c:5030 fe-connect.c:5562 +#: 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 anslutningssträng\n" -#: fe-connect.c:5103 fe-connect.c:5747 fe-connect.c:6523 +#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "ogiltig anslutningsparameter \"%s\"\n" -#: fe-connect.c:5119 fe-connect.c:5611 +#: 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:5200 +#: 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:5226 +#: fe-connect.c:5339 #, c-format msgid "service file \"%s\" not found\n" msgstr "servicefil \"%s\" hittades inte\n" -#: fe-connect.c:5240 +#: 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:5311 fe-connect.c:5355 +#: 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:5322 +#: 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:6043 +#: 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:6120 +#: 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:6127 +#: 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:6142 +#: 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:6272 +#: 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:6292 +#: 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:6344 +#: fe-connect.c:6457 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "ogiltig URI-frågeparameter: \"%s\"\n" -#: fe-connect.c:6418 +#: fe-connect.c:6531 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "ogiltigt procent-kodad symbol: \"%s\"\n" -#: fe-connect.c:6428 +#: 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:6798 +#: fe-connect.c:6911 msgid "connection pointer is NULL\n" msgstr "anslutningspekare är NULL\n" -#: fe-connect.c:7086 +#: 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:7095 +#: 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:7203 +#: 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:449 fe-exec.c:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, 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:510 fe-protocol3.c:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "slut på minne" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "skrivning till servern misslyckades\n" -#: fe-exec.c:864 +#: 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:922 +#: 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:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "size_t-överspill" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "kommandosträngen är en null-pekare\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s tillåts inte i pipeline-läge\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, 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:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "satsens namn är en null-pekare\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "inte förbunden till servern\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "ett annat kommando pågår redan\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "kan inte köa kommandon när COPY körs\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 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:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "oväntad asyncStatus: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc \"%s\" misslyckades under PGEVT_RESULTCREATE-händelse\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2347 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:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY terminerad av ny PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec tillåts inte under COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" msgstr "ingen COPY pågår\n" -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn tillåts inte i pipeline-läge\n" - -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "anslutning i felaktigt tillstånd\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 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:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 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:2996 +#: fe-exec.c:3009 msgid "cannot exit pipeline mode while busy\n" msgstr "är upptagen och kan inte avsluta pipeline-läge\n" -#: fe-exec.c:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "kan inte avsluta pipeline-läge inne i en COPY\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 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:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "ogiltig ExecStatusType-kod" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult är inte ett felresultat\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, 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:3405 +#: fe-exec.c:3424 #, 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:3715 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "kunde inte tolka svaret från servern: %s" -#: fe-exec.c:3975 fe-exec.c:4064 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "ofullständigt multibyte-tecken\n" @@ -775,8 +786,8 @@ msgid "GSSAPI name import error" msgstr "GSSAPI-fel vid import av namn" #: 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 "kan inte ta reda på OID för funktionen %s\n" @@ -793,22 +804,22 @@ msgstr "ett argument till lo_read överskriver heltalsintervallet\n" msgid "argument of lo_write exceeds integer range\n" msgstr "ett argument till lo_write överskriver heltalsintervallet\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 "kan inte öppna fil \"%s\": %s\n" -#: fe-lobj.c:734 +#: 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: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 "kan inte skriva till fil \"%s\": %s\n" -#: fe-lobj.c:920 +#: 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" @@ -826,8 +837,9 @@ msgstr "heltal med storlek %lu stöds inte av pqPutInt" msgid "connection not open\n" msgstr "anslutningen är inte öppen\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" @@ -837,15 +849,15 @@ 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:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "timeout utgången\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "ogiltigt uttag\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "%s() misslyckades: %s\n" @@ -855,142 +867,156 @@ msgstr "%s() misslyckades: %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "meddelandetyp 0x%02x kom från server under viloperiod" -#: fe-protocol3.c:407 +#: fe-protocol3.c:393 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:450 +#: fe-protocol3.c:436 #, 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-protocol3.c:475 +#: fe-protocol3.c:461 #, 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:495 +#: fe-protocol3.c:481 #, 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:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "otillräckligt med data i \"T\"-meddelande" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "slut på minnet för frågeresultat" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "otillräckligt med data i \"t\"-meddelande" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "otillräckligt med data i \"D\"-meddelande" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "oväntat fältantal i \"D\"-meddelande" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "inget felmeddelande finns tillgängligt\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " vid tecken %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "DETALJ: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "TIPS: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "FRÅGA: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAMN: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLNAMN: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "KOLUMNNAMN: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPNAMN: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "VILLKORSNAMN: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "PLATS: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "RAD %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline: utför inte text-COPY OUT\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "protokollfel: inget funktionsresultat\n" + +#: fe-protocol3.c:2151 #, c-format msgid "protocol error: id=0x%x\n" msgstr "protokollfel: id=0x%x\n" -#: fe-secure-common.c:124 +#: 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" @@ -1032,77 +1058,81 @@ msgstr "GSSAPI-fel vid kontroll av storlek" 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:1367 +#: 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:1371 +#: 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:1380 +#: 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:1430 +#: 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 namnpost saknas\n" -#: fe-secure-openssl.c:822 +#: 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:861 +#: 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:872 +#: 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:890 +#: 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:901 +#: 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:937 +#: 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: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" @@ -1110,7 +1140,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:994 +#: fe-secure-openssl.c:1122 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1119,92 +1149,97 @@ 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:1025 +#: 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:1044 +#: 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:1069 +#: fe-secure-openssl.c:1197 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "kan inte skapa SSL-anslutning: %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 "kunde inte sätta SSL servernamnsindikering (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 "kunde inte ladda SSL-motor \"%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 "kunde inte initiera SSL-motor \"%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 "kunde inte läsa privat SSL-nyckel \"%s\" från motor \"%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 "kunde inte ladda privat SSL-nyckel \"%s\" från motor \"%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 "certifikat tillgängligt, men inte den privata nyckelfilen \"%s\"\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1361 +#, c-format +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: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:1270 +#: 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:1295 +#: 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:1313 +#: 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:1413 +#: 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:1449 +#: 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:1555 +#: fe-secure-openssl.c:1687 #, c-format msgid "no SSL error reported" msgstr "inget SSL-fel rapporterat" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1696 #, c-format msgid "SSL error code %lu" msgstr "SSL-felkod %lu" -#: fe-secure-openssl.c:1812 +#: fe-secure-openssl.c:1944 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "VARNING: sslpassword trunkerat\n" @@ -1214,7 +1249,7 @@ msgstr "VARNING: sslpassword trunkerat\n" msgid "could not receive data from server: %s\n" msgstr "kan inte ta emot data från servern: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "kan inte skicka data till servern: %s\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/po/uk.po b/third_party/spanner_pg/src/interfaces/libpq/po/uk.po index b447166b..56473744 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/po/uk.po +++ b/third_party/spanner_pg/src/interfaces/libpq/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: 2022-07-19 08:55+0000\n" -"PO-Revision-Date: 2022-09-13 12:23\n" +"POT-Creation-Date: 2023-04-18 19:10+0000\n" +"PO-Revision-Date: 2023-04-19 15:06\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,101 +14,122 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/libpq.pot\n" -"X-Crowdin-File-ID: 774\n" +"X-Crowdin-File: /REL_15_STABLE/libpq.pot\n" +"X-Crowdin-File-ID: 902\n" -#: fe-auth-scram.c:213 +#: ../../port/thread.c:100 ../../port/thread.c:136 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "не вдалося знайти локального користувача з ідентифікатором %d: %s" + +#: ../../port/thread.c:105 ../../port/thread.c:141 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "локального користувача з ідентифікатором %d не існує" + +#: fe-auth-scram.c:231 msgid "malformed SCRAM message (empty message)\n" msgstr "неправильне повідомлення SCRAM (пусте повідомлення)\n" -#: fe-auth-scram.c:219 +#: fe-auth-scram.c:237 msgid "malformed SCRAM message (length mismatch)\n" msgstr "неправильне повідомлення SCRAM (невідповідність довжини)\n" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "не вдалося перевірити підпис сервера\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "could not verify server signature: %s\n" +msgstr "не вдалося перевірити підпис сервера: %s\n" -#: fe-auth-scram.c:270 +#: fe-auth-scram.c:288 msgid "incorrect server signature\n" msgstr "невірний підпис сервера\n" -#: fe-auth-scram.c:279 +#: fe-auth-scram.c:297 msgid "invalid SCRAM exchange state\n" msgstr "неприпустимий стан обміну SCRAM\n" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:324 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)\n" msgstr "неправильне повідомлення SCRAM (очікувався атрибут \"%c\")\n" -#: fe-auth-scram.c:315 +#: 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:356 +#: fe-auth-scram.c:374 msgid "could not generate nonce\n" msgstr "не вдалося згенерувати одноразовий ідентифікатор\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:911 fe-connect.c:1460 fe-connect.c:1629 fe-connect.c:2981 -#: fe-connect.c:4711 fe-connect.c:4972 fe-connect.c:5091 fe-connect.c:5343 -#: fe-connect.c:5424 fe-connect.c:5523 fe-connect.c:5779 fe-connect.c:5808 -#: fe-connect.c:5880 fe-connect.c:5904 fe-connect.c:5922 fe-connect.c:6023 -#: fe-connect.c:6032 fe-connect.c:6390 fe-connect.c:6540 fe-connect.c:6806 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3125 fe-exec.c:3309 -#: fe-exec.c:4082 fe-exec.c:4247 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:979 fe-protocol3.c:994 fe-protocol3.c:1027 -#: fe-protocol3.c:1735 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:4829 fe-connect.c:5090 fe-connect.c:5209 fe-connect.c:5461 +#: fe-connect.c:5542 fe-connect.c:5641 fe-connect.c:5897 fe-connect.c:5926 +#: fe-connect.c:5998 fe-connect.c:6022 fe-connect.c:6040 fe-connect.c:6141 +#: fe-connect.c:6150 fe-connect.c:6508 fe-connect.c:6658 fe-connect.c:6924 +#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3144 fe-exec.c:3328 +#: fe-exec.c:4110 fe-exec.c:4275 fe-gssapi-common.c:111 fe-lobj.c:884 +#: fe-protocol3.c:973 fe-protocol3.c:988 fe-protocol3.c:1021 +#: fe-protocol3.c:1729 fe-protocol3.c:2132 fe-secure-common.c:112 +#: fe-secure-gssapi.c:504 fe-secure-openssl.c:454 fe-secure-openssl.c:1266 msgid "out of memory\n" msgstr "недостатньо пам'яті\n" -#: fe-auth-scram.c:374 +#: fe-auth-scram.c:392 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:582 +#, c-format +msgid "could not calculate client proof: %s\n" +msgstr "не вдалося обчислити підтвердження клієнта: %s\n" -#: fe-auth-scram.c:579 +#: fe-auth-scram.c:599 msgid "could not encode client proof\n" msgstr "не вдалося закодувати підтвердження клієнта\n" -#: fe-auth-scram.c:634 +#: fe-auth-scram.c:654 msgid "invalid SCRAM response (nonce mismatch)\n" msgstr "неприпустима відповідь SCRAM (невідповідність одноразового ідентифікатора)\n" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:687 msgid "malformed SCRAM message (invalid salt)\n" msgstr "неправильне повідомлення SCRAM (неприпустима сіль)\n" -#: fe-auth-scram.c:681 +#: fe-auth-scram.c:701 msgid "malformed SCRAM message (invalid iteration count)\n" msgstr "неправильне повідомлення SCRAM (неприпустима кількість ітерацій)\n" -#: fe-auth-scram.c:687 +#: fe-auth-scram.c:707 msgid "malformed SCRAM message (garbage at end of server-first-message)\n" msgstr "неправильне повідомлення SCRAM (сміття в кінці першого повідомлення сервера)\n" -#: fe-auth-scram.c:723 +#: 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:739 +#: fe-auth-scram.c:759 msgid "malformed SCRAM message (garbage at end of server-final-message)\n" msgstr "неправильне повідомлення SCRAM (сміття в кінці останнього повідомлення сервера)\n" -#: fe-auth-scram.c:758 +#: fe-auth-scram.c:778 msgid "malformed SCRAM message (invalid server signature)\n" msgstr "неправильне повідомлення SCRAM (неприпустимий підпис сервера)\n" +#: fe-auth-scram.c:935 fe-exec.c:527 fe-protocol3.c:207 fe-protocol3.c:232 +#: fe-protocol3.c:261 fe-protocol3.c:279 fe-protocol3.c:360 fe-protocol3.c:733 +msgid "out of memory" +msgstr "недостатньо пам'яті" + +#: fe-auth-scram.c:944 +msgid "could not generate random salt" +msgstr "не вдалося згенерувати випадкову сіль" + #: fe-auth.c:76 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)\n" @@ -118,7 +139,8 @@ msgstr "недостатньо пам'яті для буфера GSSAPI (%d)\n" msgid "GSSAPI continuation error" msgstr "Помилка продовження у GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 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" @@ -151,619 +173,608 @@ msgstr "необхідно зв’язування каналів, але SSL н msgid "duplicate SASL authentication request\n" msgstr "дублікат запиту автентифікації SASL\n" -#: fe-auth.c:496 +#: fe-auth.c:499 msgid "channel binding is required, but client does not support it\n" msgstr "потрібно зв'язування каналів, але клієнт не підтримує його\n" -#: fe-auth.c:513 +#: fe-auth.c:516 msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" msgstr "сервер запропонував автентифікацію SCRAM-SHA-256-PLUS через підключення без SSL\n" -#: fe-auth.c:525 +#: fe-auth.c:531 msgid "none of the server's SASL authentication mechanisms are supported\n" msgstr "жоден з серверних механізмів автентифікації SASL не підтримується\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 "потрібно зв'язування каналів, але сервер не запропонував метод аутентифікації, який підтримує зв’язування каналів\n" -#: fe-auth.c:639 +#: fe-auth.c:647 #, c-format msgid "out of memory allocating SASL buffer (%d)\n" msgstr "недостатньо пам'яті для буфера 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, але автентифікація SASL не була завершена\n" -#: fe-auth.c:741 +#: 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:877 +#: fe-auth.c:909 msgid "Kerberos 4 authentication not supported\n" msgstr "Автентифікація Kerberos 4 не підтримується\n" -#: fe-auth.c:882 +#: fe-auth.c:914 msgid "Kerberos 5 authentication not supported\n" msgstr "Автентифікація Kerberos 5 не підтримується\n" -#: fe-auth.c:953 +#: fe-auth.c:985 msgid "GSSAPI authentication not supported\n" msgstr "Автентифікація GSSAPI не підтримується\n" -#: fe-auth.c:985 +#: fe-auth.c:1017 msgid "SSPI authentication not supported\n" msgstr "Автентифікація SSPI не підтримується\n" -#: fe-auth.c:993 +#: fe-auth.c:1025 msgid "Crypt authentication not supported\n" msgstr "Автентифікація Crypt не підтримується\n" -#: fe-auth.c:1060 +#: fe-auth.c:1092 #, c-format msgid "authentication method %u not supported\n" msgstr "спосіб автентифікації %u не підтримується\n" -#: fe-auth.c:1107 +#: fe-auth.c:1138 #, c-format msgid "user name lookup failure: error code %lu\n" msgstr "невдала підстановка імені користувача: код помилки %lu\n" -#: fe-auth.c:1117 fe-connect.c:2856 -#, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "не вдалося знайти локального користувача за ідентифікатором: %d: %s\n" - -#: fe-auth.c:1122 fe-connect.c:2861 -#, c-format -msgid "local user with ID %d does not exist\n" -msgstr "локального користувача з ідентифікатором %d не існує\n" - -#: fe-auth.c:1226 +#: fe-auth.c:1264 msgid "unexpected shape of result set returned for SHOW\n" msgstr "неочікувану форму набору результатів повернуто для SHOW\n" -#: fe-auth.c:1235 +#: fe-auth.c:1273 msgid "password_encryption value too long\n" msgstr "занадто довге значення password_encryption \n" -#: fe-auth.c:1275 +#: fe-auth.c:1327 #, c-format msgid "unrecognized password encryption algorithm \"%s\"\n" msgstr "нерозпізнаний алгоритм шифрування пароля \"%s\"\n" -#: fe-connect.c:1094 +#: fe-connect.c:1090 #, c-format msgid "could not match %d host names to %d hostaddr values\n" msgstr "не вдалося зіставити %d імен хостів зі %d значеннями hostaddr\n" -#: fe-connect.c:1180 +#: fe-connect.c:1176 #, c-format msgid "could not match %d port numbers to %d hosts\n" msgstr "не вдалося зіставити %d номерів портів з %d хостами\n" -#: fe-connect.c:1273 fe-connect.c:1299 fe-connect.c:1341 fe-connect.c:1350 -#: fe-connect.c:1383 fe-connect.c:1427 +#: 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 %s value: \"%s\"\n" msgstr "неприпустиме значення %s : \"%s\"\n" -#: fe-connect.c:1320 +#: fe-connect.c:1316 #, c-format msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" msgstr "значення sslmode \"%s\" неприпустиме, якщо підтримку протоколу SSL не скомпільовано\n" -#: fe-connect.c:1368 +#: fe-connect.c:1364 msgid "invalid SSL protocol version range\n" msgstr "неприпустимий діапазон версії протоколу SSL\n" -#: fe-connect.c:1393 +#: fe-connect.c:1389 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" msgstr "значення gssencmode \"%s\" неприпустиме, якщо підтримку протоколу GSSAPI не скомпільовано\n" -#: fe-connect.c:1653 +#: fe-connect.c:1649 #, c-format msgid "could not set socket to TCP no delay mode: %s\n" msgstr "не вдалося встановити сокет у TCP-режим без затримки: %s\n" -#: fe-connect.c:1715 +#: fe-connect.c:1711 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "помилка при з'єднанні з сервером через сокет \"%s\": " -#: fe-connect.c:1742 +#: fe-connect.c:1738 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "підключення до серверу \"%s\" (%s), порт %s провалено: " -#: fe-connect.c:1747 +#: fe-connect.c:1743 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "підключення до серверу \"%s\", порт %s провалено: " -#: fe-connect.c:1772 +#: fe-connect.c:1768 msgid "\tIs the server running locally and accepting connections on that socket?\n" msgstr "\tЧи працює сервер локально і приймає підключення до цього сокету?\n" -#: fe-connect.c:1776 +#: fe-connect.c:1772 msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" msgstr "\tЧи працює сервер на цьому хості і приймає TCP/IP підключення?\n" -#: fe-connect.c:1840 +#: fe-connect.c:1836 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"\n" msgstr "неприпустиме ціле значення \"%s\" для параметра з'єднання \"%s\"\n" -#: fe-connect.c:1870 fe-connect.c:1905 fe-connect.c:1941 fe-connect.c:2030 -#: fe-connect.c:2644 +#: 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 "%s(%s) помилка: %s\n" -#: fe-connect.c:1995 +#: fe-connect.c:2002 #, c-format msgid "%s(%s) failed: error code %d\n" msgstr "%s(%s) помилка: код помилки %d\n" -#: fe-connect.c:2310 +#: fe-connect.c:2317 msgid "invalid connection state, probably indicative of memory corruption\n" msgstr "неприпустимий стан підключення, можливо, пошкоджена пам'ять\n" -#: fe-connect.c:2389 +#: fe-connect.c:2396 #, c-format msgid "invalid port number: \"%s\"\n" msgstr "неприпустимий номер порту: \"%s\"\n" -#: fe-connect.c:2405 +#: fe-connect.c:2412 #, c-format msgid "could not translate host name \"%s\" to address: %s\n" msgstr "не вдалося перекласти ім’я хоста \"%s\" в адресу: %s\n" -#: fe-connect.c:2418 +#: fe-connect.c:2425 #, c-format msgid "could not parse network address \"%s\": %s\n" msgstr "не вдалося проаналізувати адресу мережі \"%s\": %s\n" -#: fe-connect.c:2431 +#: fe-connect.c:2438 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" msgstr "Шлях Unix-сокету \"%s\" занадто довгий (максимум %d байтів)\n" -#: fe-connect.c:2446 +#: fe-connect.c:2453 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" msgstr "не вдалося перекласти шлях Unix-сокету \"%s\" в адресу: %s\n" -#: fe-connect.c:2572 +#: fe-connect.c:2579 #, c-format msgid "could not create socket: %s\n" msgstr "не вдалося створити сокет: %s\n" -#: fe-connect.c:2603 +#: fe-connect.c:2610 #, c-format msgid "could not set socket to nonblocking mode: %s\n" msgstr "не вдалося встановити сокет у режим без блокування: %s\n" -#: fe-connect.c:2613 +#: fe-connect.c:2620 #, c-format msgid "could not set socket to close-on-exec mode: %s\n" msgstr "не вдалося встановити сокет у режим закриття по виконанню: %s\n" -#: fe-connect.c:2631 +#: fe-connect.c:2638 msgid "keepalives parameter must be an integer\n" msgstr "параметр keepalives має бути цілим числом\n" -#: fe-connect.c:2772 +#: fe-connect.c:2779 #, c-format msgid "could not get socket error status: %s\n" msgstr "не вдалося отримати статус помилки сокету: %s\n" -#: fe-connect.c:2800 +#: fe-connect.c:2807 #, c-format msgid "could not get client address from socket: %s\n" msgstr "не вдалося отримати адресу клієнта з сокету: %s\n" -#: fe-connect.c:2842 +#: fe-connect.c:2846 msgid "requirepeer parameter is not supported on this platform\n" msgstr "параметр requirepeer не підтримується на цій платформі\n" -#: fe-connect.c:2845 +#: fe-connect.c:2849 #, c-format msgid "could not get peer credentials: %s\n" msgstr "не вдалося отримати облікові дані сервера: %s\n" -#: fe-connect.c:2869 +#: fe-connect.c:2863 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" msgstr "requirepeer вказує на \"%s\", але фактичне ім'я вузла \"%s\"\n" -#: fe-connect.c:2909 +#: fe-connect.c:2905 #, c-format msgid "could not send GSSAPI negotiation packet: %s\n" msgstr "не вдалося передати пакет узгодження протоколу GSSAPI: %s\n" -#: fe-connect.c:2921 +#: 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, але не було неможливим (можливо, без кешу облікових даних, підтримки сервера, або використання локального сокета)\n" -#: fe-connect.c:2963 +#: fe-connect.c:2959 #, c-format msgid "could not send SSL negotiation packet: %s\n" msgstr "не вдалося передати пакет узгодження протоколу SSL: %s\n" -#: fe-connect.c:2994 +#: fe-connect.c:2990 #, c-format msgid "could not send startup packet: %s\n" msgstr "не вдалося передати стартовий пакет: %s\n" -#: fe-connect.c:3070 +#: fe-connect.c:3066 msgid "server does not support SSL, but SSL was required\n" msgstr "сервер не підтримує протокол SSL, але протокол SSL вимагається\n" -#: fe-connect.c:3097 +#: fe-connect.c:3093 #, c-format msgid "received invalid response to SSL negotiation: %c\n" msgstr "отримано неприпустиму відповідь на узгодження SSL: %c\n" -#: fe-connect.c:3118 +#: fe-connect.c:3114 msgid "received unencrypted data after SSL response\n" msgstr "отримані незашифровані дані після відповіді SSL\n" -#: fe-connect.c:3199 +#: fe-connect.c:3195 msgid "server doesn't support GSSAPI encryption, but it was required\n" msgstr "сервер не підтримує шифрування GSSAPI, але це було необхідно\n" -#: fe-connect.c:3211 +#: fe-connect.c:3207 #, c-format msgid "received invalid response to GSSAPI negotiation: %c\n" msgstr "отримано неприпустиму відповідь на узгодження GSSAPI: %c\n" -#: fe-connect.c:3230 +#: fe-connect.c:3226 msgid "received unencrypted data after GSSAPI encryption response\n" msgstr "отримані незашифровані дані після відповіді шифрування GSSAPI\n" -#: fe-connect.c:3290 fe-connect.c:3315 +#: fe-connect.c:3291 fe-connect.c:3316 #, c-format msgid "expected authentication request from server, but received %c\n" msgstr "очікувався запит автентифікації від сервера, але отримано %c\n" -#: fe-connect.c:3522 +#: fe-connect.c:3523 msgid "unexpected message from server during startup\n" msgstr "неочікуване повідомлення від сервера під час запуску\n" -#: fe-connect.c:3614 +#: fe-connect.c:3615 msgid "session is read-only\n" msgstr "сесія доступна тільки для читання\n" -#: fe-connect.c:3617 +#: fe-connect.c:3618 msgid "session is not read-only\n" msgstr "сесія доступна не лише для читання\n" -#: fe-connect.c:3671 +#: fe-connect.c:3672 msgid "server is in hot standby mode\n" msgstr "сервер знаходиться у режимі hot standby\n" -#: fe-connect.c:3674 +#: fe-connect.c:3675 msgid "server is not in hot standby mode\n" msgstr "сервер не в режимі hot standby\n" -#: fe-connect.c:3792 fe-connect.c:3844 +#: fe-connect.c:3793 fe-connect.c:3845 #, c-format msgid "\"%s\" failed\n" msgstr "\"%s\" помилка\n" -#: fe-connect.c:3858 +#: fe-connect.c:3859 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption\n" msgstr "неприпустимий стан підключення %d, можливо, пошкоджена пам'ять\n" -#: fe-connect.c:4304 fe-connect.c:4364 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "Помилка у PGEventProc \"%s\" під час події PGEVT_CONNRESET\n" - -#: fe-connect.c:4724 +#: fe-connect.c:4842 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": схема має бути ldap://\n" -#: fe-connect.c:4739 +#: fe-connect.c:4857 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутнє унікальне ім'я\n" -#: fe-connect.c:4751 fe-connect.c:4809 +#: fe-connect.c:4869 fe-connect.c:4927 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": має бути лише один атрибут\n" -#: fe-connect.c:4763 fe-connect.c:4825 +#: fe-connect.c:4881 fe-connect.c:4943 #, 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:4775 +#: fe-connect.c:4893 #, c-format msgid "invalid LDAP URL \"%s\": no filter\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутній фільтр\n" -#: fe-connect.c:4797 +#: fe-connect.c:4915 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number\n" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": неприпустимий номер порту\n" -#: fe-connect.c:4835 +#: fe-connect.c:4953 msgid "could not create LDAP structure\n" msgstr "не вдалося створити структуру протоколу LDAP\n" -#: fe-connect.c:4911 +#: fe-connect.c:5029 #, c-format msgid "lookup on LDAP server failed: %s\n" msgstr "помилка підстановки на сервері протоколу LDAP: %s\n" -#: fe-connect.c:4922 +#: fe-connect.c:5040 msgid "more than one entry found on LDAP lookup\n" msgstr "знайдено більше одного входження при підстановці протоколу LDAP\n" -#: fe-connect.c:4923 fe-connect.c:4935 +#: fe-connect.c:5041 fe-connect.c:5053 msgid "no entry found on LDAP lookup\n" msgstr "не знайдено входження при підстановці протоколу LDAP\n" -#: fe-connect.c:4946 fe-connect.c:4959 +#: fe-connect.c:5064 fe-connect.c:5077 msgid "attribute has no values on LDAP lookup\n" msgstr "атрибут не має значення при підстановці протоколу LDAP\n" -#: fe-connect.c:5011 fe-connect.c:5030 fe-connect.c:5562 +#: fe-connect.c:5129 fe-connect.c:5148 fe-connect.c:5680 #, c-format msgid "missing \"=\" after \"%s\" in connection info string\n" msgstr "відсутній \"=\" після \"%s\" у рядку інформації про підключення\n" -#: fe-connect.c:5103 fe-connect.c:5747 fe-connect.c:6523 +#: fe-connect.c:5221 fe-connect.c:5865 fe-connect.c:6641 #, c-format msgid "invalid connection option \"%s\"\n" msgstr "неприпустимий параметр підключення \"%s\"\n" -#: fe-connect.c:5119 fe-connect.c:5611 +#: fe-connect.c:5237 fe-connect.c:5729 msgid "unterminated quoted string in connection info string\n" msgstr "відкриті лапки у рядку інформації про підключення\n" -#: fe-connect.c:5200 +#: fe-connect.c:5318 #, c-format msgid "definition of service \"%s\" not found\n" msgstr "не знайдено визначення сервера \"%s\"\n" -#: fe-connect.c:5226 +#: fe-connect.c:5344 #, c-format msgid "service file \"%s\" not found\n" msgstr "не знайдено сервісний файл \"%s\"\n" -#: fe-connect.c:5240 +#: fe-connect.c:5358 #, c-format msgid "line %d too long in service file \"%s\"\n" msgstr "рядок %d занадто довгий у сервісному файлі \"%s\"\n" -#: fe-connect.c:5311 fe-connect.c:5355 +#: fe-connect.c:5429 fe-connect.c:5473 #, c-format msgid "syntax error in service file \"%s\", line %d\n" msgstr "синтаксична помилка у сервісному файлі \"%s\", рядок %d\n" -#: fe-connect.c:5322 +#: fe-connect.c:5440 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d\n" msgstr "вкладені сервісні специфікації не підтримуються у сервісному файлі \"%s\", рядок %d\n" -#: fe-connect.c:6043 +#: fe-connect.c:6161 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"\n" msgstr "у внутрішню процедуру аналізу рядка передано помилковий URI: \"%s\"\n" -#: fe-connect.c:6120 +#: fe-connect.c:6238 #, 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:6127 +#: fe-connect.c:6245 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"\n" msgstr "IPv6, що знаходиться в URI, не може бути пустим: \"%s\"\n" -#: fe-connect.c:6142 +#: fe-connect.c:6260 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" msgstr "неочікуваний символ \"%c\" на позиції %d в URI (очікувалося \":\" або \"/\"): \"%s\"\n" -#: fe-connect.c:6272 +#: fe-connect.c:6390 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "зайвий розділювач ключа/значення \"=\" в параметрі запиту URI: \"%s\"\n" -#: fe-connect.c:6292 +#: fe-connect.c:6410 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" msgstr "відсутній розділювач ключа/значення \"=\" у параметрі запиту URI: \"%s\"\n" -#: fe-connect.c:6344 +#: fe-connect.c:6462 #, c-format msgid "invalid URI query parameter: \"%s\"\n" msgstr "неприпустимий параметр запиту URI: \"%s\"\n" -#: fe-connect.c:6418 +#: fe-connect.c:6536 #, c-format msgid "invalid percent-encoded token: \"%s\"\n" msgstr "неприпустимий токен, закодований відсотками: \"%s\"\n" -#: fe-connect.c:6428 +#: fe-connect.c:6546 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" msgstr "неприпустиме значення %%00 для значення, закодованого відсотками: \"%s\"\n" -#: fe-connect.c:6798 +#: fe-connect.c:6916 msgid "connection pointer is NULL\n" msgstr "нульове значення вказівника підключення \n" -#: fe-connect.c:7086 +#: fe-connect.c:7204 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПОПЕРЕДЖЕННЯ: файл паролів \"%s\" не є простим файлом\n" -#: fe-connect.c:7095 +#: fe-connect.c:7213 #, 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:7203 +#: fe-connect.c:7321 #, c-format msgid "password retrieved from file \"%s\"\n" msgstr "пароль отримано з файлу \"%s\"\n" -#: fe-exec.c:449 fe-exec.c:3383 +#: fe-exec.c:466 fe-exec.c:3402 #, c-format msgid "row number %d is out of range 0..%d" msgstr "число рядків %d поза діапазоном 0..%d" -#: fe-exec.c:510 fe-protocol3.c:207 fe-protocol3.c:232 fe-protocol3.c:261 -#: fe-protocol3.c:279 fe-protocol3.c:375 fe-protocol3.c:747 -msgid "out of memory" -msgstr "недостатньо пам'яті" - -#: fe-exec.c:511 fe-protocol3.c:1943 +#: fe-exec.c:528 fe-protocol3.c:1937 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 +#: fe-exec.c:836 msgid "write to server failed\n" msgstr "записати на сервер не вдалося\n" -#: fe-exec.c:864 +#: fe-exec.c:875 +msgid "no error text available\n" +msgstr "немає доступного тексту помилки\n" + +#: fe-exec.c:964 msgid "NOTICE" msgstr "ПОВІДОМЛЕННЯ" -#: fe-exec.c:922 +#: fe-exec.c:1022 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не може підтримувати більше ніж INT_MAX кортежів" -#: fe-exec.c:934 +#: fe-exec.c:1034 msgid "size_t overflow" msgstr "переповнення size_t" -#: fe-exec.c:1351 fe-exec.c:1477 fe-exec.c:1526 +#: fe-exec.c:1448 fe-exec.c:1519 fe-exec.c:1568 msgid "command string is a null pointer\n" msgstr "рядок команди є нульовим вказівником\n" -#: fe-exec.c:1483 fe-exec.c:1532 fe-exec.c:1628 +#: fe-exec.c:1455 fe-exec.c:2914 +#, c-format +msgid "%s not allowed in pipeline mode\n" +msgstr "%s не дозволено в режимі конвеєра\n" + +#: fe-exec.c:1525 fe-exec.c:1574 fe-exec.c:1670 #, c-format msgid "number of parameters must be between 0 and %d\n" msgstr "кількість параметрів має бути між 0 і %d\n" -#: fe-exec.c:1520 fe-exec.c:1622 +#: fe-exec.c:1562 fe-exec.c:1664 msgid "statement name is a null pointer\n" msgstr "ім’я оператора є пустим вказівником\n" -#: fe-exec.c:1664 fe-exec.c:3236 +#: fe-exec.c:1708 fe-exec.c:3255 msgid "no connection to the server\n" msgstr "немає підключення до сервера\n" -#: fe-exec.c:1673 fe-exec.c:3245 +#: fe-exec.c:1717 fe-exec.c:3264 msgid "another command is already in progress\n" msgstr "інша команда уже в прогресі\n" -#: fe-exec.c:1704 +#: fe-exec.c:1748 msgid "cannot queue commands during COPY\n" msgstr "не можна поставити в чергу команди під час COPY\n" -#: fe-exec.c:1822 +#: fe-exec.c:1866 msgid "length must be given for binary parameter\n" msgstr "для бінарного параметра має бути надана довжина\n" -#: fe-exec.c:2149 +#: fe-exec.c:2189 #, c-format msgid "unexpected asyncStatus: %d\n" msgstr "неочікуваний asyncStatus: %d\n" -#: fe-exec.c:2185 -#, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "Помилка у PGEventProc \"%s\" під час події PGEVT_RESULTCREAT\n" - -#: fe-exec.c:2333 +#: fe-exec.c:2347 msgid "synchronous command execution functions are not allowed in pipeline mode\n" msgstr "функції синхронного виконання команд заборонені в режимі конвеєра\n" -#: fe-exec.c:2355 +#: fe-exec.c:2364 msgid "COPY terminated by new PQexec" msgstr "COPY завершено новим PQexec" -#: fe-exec.c:2372 +#: fe-exec.c:2381 msgid "PQexec not allowed during COPY BOTH\n" msgstr "PQexec не дозволяється під час COPY BOTH\n" -#: fe-exec.c:2600 fe-exec.c:2656 fe-exec.c:2725 fe-protocol3.c:1874 +#: fe-exec.c:2609 fe-exec.c:2665 fe-exec.c:2734 fe-protocol3.c:1868 msgid "no COPY in progress\n" -msgstr "Немає COPY у процесі\n" - -#: fe-exec.c:2902 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn заборонено в режимі конвеєра\n" +msgstr "немає COPY у процесі\n" -#: fe-exec.c:2910 +#: fe-exec.c:2923 msgid "connection in wrong state\n" msgstr "підключення у неправильному стані\n" -#: fe-exec.c:2954 +#: fe-exec.c:2967 msgid "cannot enter pipeline mode, connection not idle\n" msgstr "не можна увійти в режим конвеєра, підключення не в очікуванні\n" -#: fe-exec.c:2991 fe-exec.c:3015 +#: fe-exec.c:3004 fe-exec.c:3028 msgid "cannot exit pipeline mode with uncollected results\n" msgstr "не можна вийти з режиму конвеєра з незібраними результатами\n" -#: fe-exec.c:2996 +#: fe-exec.c:3009 msgid "cannot exit pipeline mode while busy\n" msgstr "не можна вийти з режиму конвеєра, коли зайнято\n" -#: fe-exec.c:3008 +#: fe-exec.c:3021 msgid "cannot exit pipeline mode while in COPY\n" msgstr "не можна вийти з режиму конвеєра під час COPY\n" -#: fe-exec.c:3169 +#: fe-exec.c:3188 msgid "cannot send pipeline when not in pipeline mode\n" msgstr "неможливо скористатися конвеєром не у режимі конвеєра\n" -#: fe-exec.c:3272 +#: fe-exec.c:3291 msgid "invalid ExecStatusType code" msgstr "неприпустимий код ExecStatusType" -#: fe-exec.c:3299 +#: fe-exec.c:3318 msgid "PGresult is not an error result\n" msgstr "PGresult не є помилковим результатом\n" -#: fe-exec.c:3367 fe-exec.c:3390 +#: fe-exec.c:3386 fe-exec.c:3409 #, c-format msgid "column number %d is out of range 0..%d" msgstr "число стовпців %d поза діапазоном 0..%d" -#: fe-exec.c:3405 +#: fe-exec.c:3424 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "число параметрів %d поза діапазоном 0..%d" -#: fe-exec.c:3715 +#: fe-exec.c:3735 #, c-format msgid "could not interpret result from server: %s" msgstr "не вдалося інтерпретувати результат від сервера: %s" -#: fe-exec.c:3975 fe-exec.c:4064 +#: fe-exec.c:4001 fe-exec.c:4092 msgid "incomplete multibyte character\n" msgstr "неповний мультибайтний символ\n" @@ -772,8 +783,8 @@ 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 +#: 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 "неможливо визначити ідентифікатор OID функції %s\n" @@ -790,22 +801,22 @@ msgstr "аргумент lo_read перевищує діапазон цілог msgid "argument of lo_write exceeds integer range\n" msgstr "аргумент lo_write перевищує діапазон цілого числа\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 "не вдалося відкрити файл \"%s\": %s\n" -#: fe-lobj.c:734 +#: fe-lobj.c:735 #, c-format msgid "could not read from file \"%s\": %s\n" msgstr "не вдалося прочитати з файлу \"%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 "не вдалося записати у файл \"%s\": %s\n" -#: fe-lobj.c:920 +#: fe-lobj.c:923 msgid "query to initialize large object functions did not return data\n" msgstr "запит на ініціалізацію функцій для великих об’єктів не повернув дані\n" @@ -823,23 +834,24 @@ msgstr "pqPutInt не підтримує ціле число розміром %l msgid "connection not open\n" msgstr "підключення не відкрито\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" "\tbefore or while processing the request.\n" msgstr "сервер неочікувано закрив підключення\n" " Це може означати, що сервер завершив роботу ненормально до або під час обробки запиту.\n" -#: fe-misc.c:1015 +#: fe-misc.c:1008 msgid "timeout expired\n" msgstr "тайм-аут минув\n" -#: fe-misc.c:1060 +#: fe-misc.c:1053 msgid "invalid socket\n" msgstr "неприпустимий сокет\n" -#: fe-misc.c:1083 +#: fe-misc.c:1076 #, c-format msgid "%s() failed: %s\n" msgstr "%s() помилка: %s\n" @@ -849,142 +861,156 @@ msgstr "%s() помилка: %s\n" msgid "message type 0x%02x arrived from server while idle" msgstr "отримано тип повідомлення 0x%02x від сервера під час бездіяльності" -#: fe-protocol3.c:407 +#: fe-protocol3.c:393 msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" msgstr "сервер передав дані (повідомлення \"D\") без попереднього опису рядка (повідомлення \"T\")\n" -#: fe-protocol3.c:450 +#: fe-protocol3.c:436 #, c-format msgid "unexpected response from server; first received character was \"%c\"\n" msgstr "неочікувана відповідь від сервера; перший отриманий символ був \"%c\"\n" -#: fe-protocol3.c:475 +#: fe-protocol3.c:461 #, c-format msgid "message contents do not agree with length in message type \"%c\"\n" msgstr "вміст повідомлення не відповідає довжині у типі повідомлення \"%c\"\n" -#: fe-protocol3.c:495 +#: fe-protocol3.c:481 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d\n" msgstr "втрачено синхронізацію з сервером: отримано тип повідомлення \"%c\", довжина %d\n" -#: fe-protocol3.c:547 fe-protocol3.c:587 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "недостатньо даних у повідомленні \"T\"" -#: fe-protocol3.c:658 fe-protocol3.c:864 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "недостатньо пам'яті для результату запиту" -#: fe-protocol3.c:727 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "недостатньо даних у повідомленні \"t\"" -#: fe-protocol3.c:786 fe-protocol3.c:818 fe-protocol3.c:836 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "зайві дані у повідомленні \"D\"" -#: fe-protocol3.c:792 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "неочікувана кількість полів у повідомленні \"D\"" -#: fe-protocol3.c:1040 +#: fe-protocol3.c:1034 msgid "no error message available\n" msgstr "немає доступного повідомлення про помилку\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1088 fe-protocol3.c:1107 +#: fe-protocol3.c:1082 fe-protocol3.c:1101 #, c-format msgid " at character %s" msgstr " в символі %s" -#: fe-protocol3.c:1120 +#: fe-protocol3.c:1114 #, c-format msgid "DETAIL: %s\n" msgstr "ДЕТАЛІ: %s\n" -#: fe-protocol3.c:1123 +#: fe-protocol3.c:1117 #, c-format msgid "HINT: %s\n" msgstr "ПІДКАЗКА: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1120 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПИТ: %s\n" -#: fe-protocol3.c:1133 +#: fe-protocol3.c:1127 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1136 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "ІМ'Я СХЕМИ: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1140 #, c-format msgid "TABLE NAME: %s\n" msgstr "ІМ'Я ТАБЛИЦІ: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1144 #, c-format msgid "COLUMN NAME: %s\n" msgstr "ІМ'Я СТОВПЦЯ: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1148 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ІМ'Я ТИПУ ДАНИХ: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1152 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ІМ'Я ОБМЕЖЕННЯ: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1164 msgid "LOCATION: " msgstr "РОЗТАШУВАННЯ: " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1166 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1174 +#: fe-protocol3.c:1168 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1369 +#: fe-protocol3.c:1363 #, c-format msgid "LINE %d: " msgstr "РЯДОК %d: " -#: fe-protocol3.c:1768 +#: fe-protocol3.c:1762 msgid "PQgetline: not doing text COPY OUT\n" msgstr "PQgetline можна викликати лише під час COPY OUT\n" -#: fe-protocol3.c:2134 +#: fe-protocol3.c:2139 +msgid "protocol error: no function result\n" +msgstr "помилка протоколу: результат функції не знайдено\n" + +#: fe-protocol3.c:2151 #, c-format msgid "protocol error: id=0x%x\n" msgstr "помилка протоколу: id=0x%x\n" -#: fe-secure-common.c:124 +#: 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:233 +#, c-format +msgid "certificate contains IP address with invalid length %lu\n" +msgstr "сертифікат містить IP-адресу з недійсною довжиною %lu\n" + +#: fe-secure-common.c:243 +#, c-format +msgid "could not convert certificate's IP address to string: %s\n" +msgstr "не вдалося перетворити IP-адресу сертифікату у рядок: %s\n" + +#: fe-secure-common.c:276 msgid "host name must be specified for a verified SSL connection\n" msgstr "має бути вказано ім'я хосту для перевіреного SSL підключення\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 "серверний сертифікат \"%s\" не співпадає з іменем хосту \"%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" @@ -1001,7 +1027,7 @@ msgstr "вихідне повідомлення GSSAPI не буде викор msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" msgstr "клієнт намагався відправити переповнений пакет GSSAPI: (%zu > %zu)\n" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:598 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" msgstr "переповнений пакет GSSAPI відправлений сервером: (%zu > %zu)\n" @@ -1014,187 +1040,196 @@ msgstr "помилка при розгортанні GSSAPI" msgid "incoming GSSAPI message did not use confidentiality\n" msgstr "вхідне повідомлення GSSAPI не використовувало конфіденційність\n" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:644 msgid "could not initiate GSSAPI security context" msgstr "не вдалося ініціювати контекст безпеки GSSAPI" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:672 msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:683 msgid "GSSAPI context establishment error" msgstr "помилка встановлення контексту GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1367 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1504 #, 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:1371 +#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1508 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:1380 +#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1517 #, 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:1430 +#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1567 #, c-format msgid "unrecognized SSL error code: %d\n" msgstr "нерозпізнаний код помилки SSL: %d\n" -#: fe-secure-openssl.c:400 +#: fe-secure-openssl.c:414 msgid "could not determine server certificate signature algorithm\n" msgstr "не вдалося визначити алгоритм підпису серверного сертифікату\n" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:435 #, c-format msgid "could not find digest for NID %s\n" msgstr "не вдалося знайти дайджест для NID %s\n" -#: fe-secure-openssl.c:431 +#: fe-secure-openssl.c:445 msgid "could not generate peer certificate hash\n" msgstr "не вдалося згенерувати хеш сертифікату вузла\n" -#: fe-secure-openssl.c:488 +#: fe-secure-openssl.c:502 msgid "SSL certificate's name entry is missing\n" msgstr "Відсутня ім'я в сертифікаті SSL\n" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:537 +msgid "SSL certificate's address entry is missing\n" +msgstr "відсутній елемент адреси SSL-сертифікату\n" + +#: fe-secure-openssl.c:955 #, c-format msgid "could not create SSL context: %s\n" msgstr "не вдалося створити контекст SSL: %s\n" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:994 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version\n" msgstr "неприпустиме значення \"%s\" для мінімальної версії протоколу SSL\n" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:1005 #, c-format msgid "could not set minimum SSL protocol version: %s\n" msgstr "не вдалося встановити мінімальну версію протоколу SSL: %s\n" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1023 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version\n" msgstr "неприпустиме значення \"%s\" для максимальної версії протоколу SSL\n" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1034 #, c-format msgid "could not set maximum SSL protocol version: %s\n" msgstr "не вдалося встановити максимальну версію протоколу SSL: %s\n" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1070 #, c-format msgid "could not read root certificate file \"%s\": %s\n" msgstr "не вдалося прочитати файл кореневого сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1123 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:994 +#: fe-secure-openssl.c:1127 #, 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:1025 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s\n" msgstr "не вдалося відкрити файл сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1177 #, c-format msgid "could not read certificate file \"%s\": %s\n" msgstr "не вдалося прочитати файл сертифікату \"%s\": %s\n" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1202 #, c-format msgid "could not establish SSL connection: %s\n" msgstr "не вдалося встановити SSL-підключення: %s\n" -#: fe-secure-openssl.c:1103 +#: fe-secure-openssl.c:1236 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s\n" msgstr "не вдалося встановити Індикацію Імені Сервера протокол SSL (SNI): %s\n" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1282 #, c-format msgid "could not load SSL engine \"%s\": %s\n" msgstr "не вдалося завантажити модуль SSL \"%s\": %s\n" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1294 #, c-format msgid "could not initialize SSL engine \"%s\": %s\n" msgstr "не вдалося ініціалізувати модуль SSL \"%s\": %s\n" -#: fe-secure-openssl.c:1177 +#: fe-secure-openssl.c:1310 #, 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:1191 +#: fe-secure-openssl.c:1324 #, 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:1228 +#: fe-secure-openssl.c:1362 #, c-format msgid "certificate present, but not private key file \"%s\"\n" msgstr "сертифікат присутній, але файл закритого ключа \"%s\" ні\n" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1366 +#, c-format +msgid "could not stat private key file \"%s\": %m\n" +msgstr "не вдалося отримати інформацію про файл закритого ключа\"%s\": %m\n" + +#: fe-secure-openssl.c:1375 #, c-format msgid "private key file \"%s\" is not a regular file\n" msgstr "файл закритого ключа \"%s\" не є звичайним файлом\n" -#: fe-secure-openssl.c:1270 +#: fe-secure-openssl.c:1408 #, 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) або менше, якщо він належить поточному користувачу, або права u=rw,g=r (0640) або менше, якщо належить root\n" -#: fe-secure-openssl.c:1295 +#: fe-secure-openssl.c:1433 #, c-format msgid "could not load private key file \"%s\": %s\n" msgstr "не вдалося завантажити файл закритого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1313 +#: fe-secure-openssl.c:1450 #, c-format msgid "certificate does not match private key file \"%s\": %s\n" msgstr "сертифікат не відповідає файлу закритого ключа \"%s\": %s\n" -#: fe-secure-openssl.c:1413 +#: fe-secure-openssl.c:1550 #, 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:1449 +#: fe-secure-openssl.c:1586 #, c-format msgid "certificate could not be obtained: %s\n" msgstr "не вдалося отримати сертифікат: %s\n" -#: fe-secure-openssl.c:1555 +#: fe-secure-openssl.c:1692 #, c-format msgid "no SSL error reported" msgstr "немає повідомлення про помилку SSL" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1701 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: fe-secure-openssl.c:1812 +#: fe-secure-openssl.c:1956 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПОПЕРЕДЖЕННЯ: sslpassword скорочено\n" @@ -1204,7 +1239,7 @@ msgstr "ПОПЕРЕДЖЕННЯ: sslpassword скорочено\n" msgid "could not receive data from server: %s\n" msgstr "не вдалося отримати дані з серверу: %s\n" -#: fe-secure.c:380 +#: fe-secure.c:436 #, c-format msgid "could not send data to server: %s\n" msgstr "не вдалося передати дані серверу: %s\n" diff --git a/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.c b/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.c index a57f753b..eb51e6d0 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.c +++ b/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.c @@ -15,7 +15,7 @@ * a usable vsnprintf(), then a copy of our own implementation of it will * be linked into libpq. * - * 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 * * src/interfaces/libpq/pqexpbuffer.c diff --git a/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.h b/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.h index 02510957..efd652c8 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.h +++ b/third_party/spanner_pg/src/interfaces/libpq/pqexpbuffer.h @@ -15,7 +15,7 @@ * a usable vsnprintf(), then a copy of our own implementation of it will * be linked into libpq. * - * 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 * * src/interfaces/libpq/pqexpbuffer.h diff --git a/third_party/spanner_pg/src/interfaces/libpq/pthread-win32.c b/third_party/spanner_pg/src/interfaces/libpq/pthread-win32.c index 6dbb0a34..c0e056ea 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/pthread-win32.c +++ b/third_party/spanner_pg/src/interfaces/libpq/pthread-win32.c @@ -3,7 +3,7 @@ * pthread-win32.c * partial pthread implementation for win32 * -* Copyright (c) 2004-2021, PostgreSQL Global Development Group +* Copyright (c) 2004-2022, PostgreSQL Global Development Group * IDENTIFICATION * src/interfaces/libpq/pthread-win32.c * diff --git a/third_party/spanner_pg/src/interfaces/libpq/t/001_uri.pl b/third_party/spanner_pg/src/interfaces/libpq/t/001_uri.pl new file mode 100644 index 00000000..beaf13b4 --- /dev/null +++ b/third_party/spanner_pg/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{libpq_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{libpq_uri_regress: invalid URI query parameter: "uzer"}, + ], + [ + q{postgre://}, + q{}, + q{libpq_uri_regress: missing "=" after "postgre://" in connection info string}, + ], + [ + q{postgres://[::1}, + q{}, + q{libpq_uri_regress: end of string reached when looking for matching "]" in IPv6 host address in URI: "postgres://[::1"}, + ], + [ + q{postgres://[]}, + q{}, + q{libpq_uri_regress: IPv6 host address may not be empty in URI: "postgres://[]"}, + ], + [ + q{postgres://[::1]z}, + q{}, + q{libpq_uri_regress: unexpected character "z" at position 17 in URI (expected ":" or "/"): "postgres://[::1]z"}, + ], + [ + q{postgresql://host?zzz}, + q{}, + q{libpq_uri_regress: missing key/value separator "=" in URI query parameter: "zzz"}, + ], + [ + q{postgresql://host?value1&value2}, + q{}, + q{libpq_uri_regress: missing key/value separator "=" in URI query parameter: "value1"}, + ], + [ + q{postgresql://host?key=key=value}, + q{}, + q{libpq_uri_regress: extra key/value separator "=" in URI query parameter: "key"}, + ], + [ + q{postgres://host?dbname=%XXfoo}, q{}, + q{libpq_uri_regress: invalid percent-encoded token: "%XXfoo"}, + ], + [ + q{postgresql://a%00b}, + q{}, + q{libpq_uri_regress: forbidden value %00 in percent-encoded value: "a%00b"}, + ], + [ + q{postgresql://%zz}, q{}, + q{libpq_uri_regress: invalid percent-encoded token: "%zz"}, + ], + [ + q{postgresql://%1}, q{}, + q{libpq_uri_regress: invalid percent-encoded token: "%1"}, + ], + [ + q{postgresql://%}, q{}, + q{libpq_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 = [ 'libpq_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 + # losing the information whether stdout/stderr mismatched. + is_deeply(\%result, \%expect, $uri); +} + +foreach (@tests) +{ + test_uri($_); +} + +done_testing(); diff --git a/third_party/spanner_pg/src/interfaces/libpq/t/002_api.pl b/third_party/spanner_pg/src/interfaces/libpq/t/002_api.pl new file mode 100644 index 00000000..fa00221a --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/libpq/t/002_api.pl @@ -0,0 +1,22 @@ +# 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([ 'libpq_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/third_party/spanner_pg/src/interfaces/libpq/test/.gitignore b/third_party/spanner_pg/src/interfaces/libpq/test/.gitignore index 5387b3b6..6ba78adb 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/test/.gitignore +++ b/third_party/spanner_pg/src/interfaces/libpq/test/.gitignore @@ -1,3 +1,2 @@ -/uri-regress -/regress.diff -/regress.out +/libpq_testclient +/libpq_uri_regress diff --git a/third_party/spanner_pg/src/interfaces/libpq/test/Makefile b/third_party/spanner_pg/src/interfaces/libpq/test/Makefile index 4832fab9..75ac08f9 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/test/Makefile +++ b/third_party/spanner_pg/src/interfaces/libpq/test/Makefile @@ -1,3 +1,8 @@ +# src/interfaces/libpq/test/Makefile + +PGFILEDESC = "libpq test program" +PGAPPICON = win32 + subdir = src/interfaces/libpq/test top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global @@ -9,14 +14,11 @@ endif override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += $(libpq_pgport) -PROGS = uri-regress +PROGS = libpq_testclient libpq_uri_regress all: $(PROGS) -installcheck: all - SRCDIR='$(top_srcdir)' SUBDIR='$(subdir)' \ - $(PERL) $(top_srcdir)/$(subdir)/regress.pl +$(PROGS): $(WIN32RES) clean distclean maintainer-clean: rm -f $(PROGS) *.o - rm -f regress.out regress.diff diff --git a/third_party/spanner_pg/src/interfaces/libpq/test/README b/third_party/spanner_pg/src/interfaces/libpq/test/README deleted file mode 100644 index a05eb6bb..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/libpq/test/expected.out b/third_party/spanner_pg/src/interfaces/libpq/test/expected.out deleted file mode 100644 index d375e82b..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/libpq/test/libpq_testclient.c b/third_party/spanner_pg/src/interfaces/libpq/test/libpq_testclient.c new file mode 100644 index 00000000..d945bacf --- /dev/null +++ b/third_party/spanner_pg/src/interfaces/libpq/test/libpq_testclient.c @@ -0,0 +1,37 @@ +/* + * libpq_testclient.c + * A test program for the libpq public API + * + * Copyright (c) 2022, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/interfaces/libpq/test/libpq_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; +} diff --git a/third_party/spanner_pg/src/interfaces/libpq/test/uri-regress.c b/third_party/spanner_pg/src/interfaces/libpq/test/libpq_uri_regress.c similarity index 87% rename from third_party/spanner_pg/src/interfaces/libpq/test/uri-regress.c rename to third_party/spanner_pg/src/interfaces/libpq/test/libpq_uri_regress.c index 84fc52a7..60469002 100644 --- a/third_party/spanner_pg/src/interfaces/libpq/test/uri-regress.c +++ b/third_party/spanner_pg/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 @@ -7,10 +7,10 @@ * prints out the values from the parsed PQconninfoOption struct that differ * from the defaults (obtained from PQconndefaults). * - * Portions Copyright (c) 2012-2021, PostgreSQL Global Development Group + * 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/third_party/spanner_pg/src/interfaces/libpq/test/regress.in b/third_party/spanner_pg/src/interfaces/libpq/test/regress.in deleted file mode 100644 index de034f39..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/interfaces/libpq/test/regress.pl b/third_party/spanner_pg/src/interfaces/libpq/test/regress.pl deleted file mode 100644 index de705cf5..00000000 --- a/third_party/spanner_pg/src/interfaces/libpq/test/regress.pl +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/perl - -# Copyright (c) 2021, 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 < 256, for values + * Unfortunately, while HeUTF8 is true for most things > 256, for values * 128..255 it's not, but perl will treat them as unicode code points if * the utf8 flag is not set ( see The "Unicode Bug" in perldoc perlunicode * for more) @@ -456,7 +456,7 @@ _PG_init(void) PGC_SUSET, 0, NULL, NULL, NULL); - EmitWarningsOnPlaceholders("plperl"); + MarkGUCPrefixReserved("plperl"); /* * Create hash tables. @@ -2433,12 +2433,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/third_party/spanner_pg/src/pl/plperl/plperl.h b/third_party/spanner_pg/src/pl/plperl/plperl.h index 30fb5aa2..c0dd8cb5 100644 --- a/third_party/spanner_pg/src/pl/plperl/plperl.h +++ b/third_party/spanner_pg/src/pl/plperl/plperl.h @@ -5,7 +5,7 @@ * * This should be included _AFTER_ postgres.h and system include files * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/pl/plperl/plperl.h @@ -14,200 +14,11 @@ #ifndef PL_PERL_H #define PL_PERL_H -/* stop perl headers from hijacking stdio and other stuff on Windows */ -#ifdef WIN32 -#define WIN32IO_IS_STDIO -#endif /* WIN32 */ - -/* - * Supply a value of PERL_UNUSED_DECL that will satisfy gcc - the one - * perl itself supplies doesn't seem to. - */ -#define PERL_UNUSED_DECL pg_attribute_unused() - -/* - * Sometimes perl carefully scribbles on our *printf macros. - * So we undefine them here and redefine them after it's done its dirty deed. - */ -#undef vsnprintf -#undef snprintf -#undef vsprintf -#undef sprintf -#undef vfprintf -#undef fprintf -#undef vprintf -#undef printf - -/* - * Perl scribbles on the "_" macro too. - */ -#undef _ - -/* - * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's - * __inline__. Translate to something MSVC recognizes. Also, perl.h sometimes - * defines isnan, so undefine it here and put back the definition later if - * perl.h doesn't. - */ -#ifdef _MSC_VER -#define __inline__ inline -#ifdef isnan -#undef isnan -#endif -/* Work around for using MSVC and Strawberry Perl >= 5.30. */ -#define __builtin_expect(expr, val) (expr) -#endif - -/* - * Regarding bool, both PostgreSQL and Perl might use stdbool.h or not, - * depending on configuration. If both agree, things are relatively harmless. - * If not, things get tricky. If PostgreSQL does but Perl does not, define - * HAS_BOOL here so that Perl does not redefine bool; this avoids compiler - * warnings. If PostgreSQL does not but Perl does, we need to undefine bool - * after we include the Perl headers; see below. - */ -#ifdef PG_USE_STDBOOL -#define HAS_BOOL 1 -#endif - -/* - * Newer versions of the perl headers trigger a lot of warnings with our - * compiler flags (at least -Wdeclaration-after-statement, - * -Wshadow=compatible-local are known to be problematic). The system_header - * pragma hides warnings from within the rest of this file, if supported. - */ -#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER -#pragma GCC system_header -#endif - /* - * Get the basic Perl API. We use PERL_NO_GET_CONTEXT mode so that our code - * can compile against MULTIPLICITY Perl builds without including XSUB.h. + * Pull in Perl headers via a wrapper header, to control the scope of + * the system_header pragma therein. */ -#define PERL_NO_GET_CONTEXT -#include "EXTERN.h" -#include "perl.h" - -/* - * We want to include XSUB.h only within .xs files, because on some platforms - * it undesirably redefines a lot of libc functions. But it must appear - * before ppport.h, so use a #define flag to control inclusion here. - */ -#ifdef PG_NEED_PERL_XSUB_H -/* - * On Windows, win32_port.h defines macros for a lot of these same functions. - * To avoid compiler warnings when XSUB.h redefines them, #undef our versions. - */ -#ifdef WIN32 -#undef accept -#undef bind -#undef connect -#undef fopen -#undef fstat -#undef kill -#undef listen -#undef lstat -#undef mkdir -#undef open -#undef putenv -#undef recv -#undef rename -#undef select -#undef send -#undef socket -#undef stat -#undef unlink -#endif - -#include "XSUB.h" -#endif - -/* put back our *printf macros ... this must match src/include/port.h */ -#ifdef vsnprintf -#undef vsnprintf -#endif -#ifdef snprintf -#undef snprintf -#endif -#ifdef vsprintf -#undef vsprintf -#endif -#ifdef sprintf -#undef sprintf -#endif -#ifdef vfprintf -#undef vfprintf -#endif -#ifdef fprintf -#undef fprintf -#endif -#ifdef vprintf -#undef vprintf -#endif -#ifdef printf -#undef printf -#endif - -#define vsnprintf pg_vsnprintf -#define snprintf pg_snprintf -#define vsprintf pg_vsprintf -#define sprintf pg_sprintf -#define vfprintf pg_vfprintf -#define fprintf pg_fprintf -#define vprintf pg_vprintf -#define printf(...) pg_printf(__VA_ARGS__) - -/* - * Put back "_" too; but rather than making it just gettext() as the core - * code does, make it dgettext() so that the right things will happen in - * loadable modules (if they've set up TEXTDOMAIN correctly). Note that - * we can't just set TEXTDOMAIN here, because this file is used by more - * extensions than just PL/Perl itself. - */ -#undef _ -#define _(x) dgettext(TEXTDOMAIN, x) - -/* put back the definition of isnan if needed */ -#ifdef _MSC_VER -#ifndef isnan -#define isnan(x) _isnan(x) -#endif -#endif - -/* perl version and platform portability */ -#include "ppport.h" - -/* - * perl might have included stdbool.h. If we also did that earlier (see c.h), - * then that's fine. If not, we probably rejected it for some reason. In - * that case, undef bool and proceed with our own bool. (Note that stdbool.h - * makes bool a macro, but our own replacement is a typedef, so the undef - * makes ours visible again). - */ -#ifndef PG_USE_STDBOOL -#ifdef bool -#undef bool -#endif -#endif - -/* supply HeUTF8 if it's missing - ppport.h doesn't supply it, unfortunately */ -#ifndef HeUTF8 -#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ - SvUTF8(HeKEY_sv(he)) : \ - (U32)HeKUTF8(he)) -#endif - -/* supply GvCV_set if it's missing - ppport.h doesn't supply it, unfortunately */ -#ifndef GvCV_set -#define GvCV_set(gv, cv) (GvCV(gv) = cv) -#endif - -/* Perl 5.19.4 changed array indices from I32 to SSize_t */ -#if PERL_BCDVERSION >= 0x5019004 -#define AV_SIZE_MAX SSize_t_MAX -#else -#define AV_SIZE_MAX I32_MAX -#endif +#include "plperl_system.h" /* declare routines from plperl.c for access by .xs files */ HV *plperl_spi_exec(char *, int); diff --git a/third_party/spanner_pg/src/pl/plperl/plperl_opmask.pl b/third_party/spanner_pg/src/pl/plperl/plperl_opmask.pl index 4f7b19db..49720435 100644 --- a/third_party/spanner_pg/src/pl/plperl/plperl_opmask.pl +++ b/third_party/spanner_pg/src/pl/plperl/plperl_opmask.pl @@ -1,6 +1,6 @@ #!perl -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/pl/plperl/plperl_system.h b/third_party/spanner_pg/src/pl/plperl/plperl_system.h new file mode 100644 index 00000000..61550db2 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plperl/plperl_system.h @@ -0,0 +1,215 @@ +/*------------------------------------------------------------------------- + * + * plperl_system.h + * Pull in Perl's system header files. + * + * We break this out as a separate header file to precisely control + * the scope of the "system_header" pragma. No Postgres-specific + * declarations should be put here. However, we do include some stuff + * that is meant to prevent conflicts between our code and Perl. + * + * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1995, Regents of the University of California + * + * src/pl/plperl/plperl_system.h + */ + +#ifndef PL_PERL_SYSTEM_H +#define PL_PERL_SYSTEM_H + +/* + * Newer versions of the perl headers trigger a lot of warnings with our + * preferred compiler flags (at least -Wdeclaration-after-statement, + * -Wshadow=compatible-local are known to be problematic). The system_header + * pragma hides warnings from within the rest of this file, if supported. + */ +#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER +#pragma GCC system_header +#endif + +/* stop perl headers from hijacking stdio and other stuff on Windows */ +#ifdef WIN32 +#define WIN32IO_IS_STDIO +#endif /* WIN32 */ + +/* + * Supply a value of PERL_UNUSED_DECL that will satisfy gcc - the one + * perl itself supplies doesn't seem to. + */ +#define PERL_UNUSED_DECL pg_attribute_unused() + +/* + * Sometimes perl carefully scribbles on our *printf macros. + * So we undefine them here and redefine them after it's done its dirty deed. + */ +#undef vsnprintf +#undef snprintf +#undef vsprintf +#undef sprintf +#undef vfprintf +#undef fprintf +#undef vprintf +#undef printf + +/* + * Perl scribbles on the "_" macro too. + */ +#undef _ + +/* + * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's + * __inline__. Translate to something MSVC recognizes. Also, perl.h sometimes + * defines isnan, so undefine it here and put back the definition later if + * perl.h doesn't. + */ +#ifdef _MSC_VER +#define __inline__ inline +#ifdef isnan +#undef isnan +#endif +/* Work around for using MSVC and Strawberry Perl >= 5.30. */ +#define __builtin_expect(expr, val) (expr) +#endif + +/* + * Regarding bool, both PostgreSQL and Perl might use stdbool.h or not, + * depending on configuration. If both agree, things are relatively harmless. + * If not, things get tricky. If PostgreSQL does but Perl does not, define + * HAS_BOOL here so that Perl does not redefine bool; this avoids compiler + * warnings. If PostgreSQL does not but Perl does, we need to undefine bool + * after we include the Perl headers; see below. + */ +#ifdef PG_USE_STDBOOL +#define HAS_BOOL 1 +#endif + +/* + * Get the basic Perl API. We use PERL_NO_GET_CONTEXT mode so that our code + * can compile against MULTIPLICITY Perl builds without including XSUB.h. + */ +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" + +/* + * We want to include XSUB.h only within .xs files, because on some platforms + * it undesirably redefines a lot of libc functions. But it must appear + * before ppport.h, so use a #define flag to control inclusion here. + */ +#ifdef PG_NEED_PERL_XSUB_H +/* + * On Windows, win32_port.h defines macros for a lot of these same functions. + * To avoid compiler warnings when XSUB.h redefines them, #undef our versions. + */ +#ifdef WIN32 +#undef accept +#undef bind +#undef connect +#undef fopen +#undef fstat +#undef kill +#undef listen +#undef lstat +#undef mkdir +#undef open +#undef putenv +#undef recv +#undef rename +#undef select +#undef send +#undef socket +#undef stat +#undef unlink +#endif + +#include "XSUB.h" +#endif + +/* put back our *printf macros ... this must match src/include/port.h */ +#ifdef vsnprintf +#undef vsnprintf +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsprintf +#undef vsprintf +#endif +#ifdef sprintf +#undef sprintf +#endif +#ifdef vfprintf +#undef vfprintf +#endif +#ifdef fprintf +#undef fprintf +#endif +#ifdef vprintf +#undef vprintf +#endif +#ifdef printf +#undef printf +#endif + +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf +#define vsprintf pg_vsprintf +#define sprintf pg_sprintf +#define vfprintf pg_vfprintf +#define fprintf pg_fprintf +#define vprintf pg_vprintf +#define printf(...) pg_printf(__VA_ARGS__) + +/* + * Put back "_" too; but rather than making it just gettext() as the core + * code does, make it dgettext() so that the right things will happen in + * loadable modules (if they've set up TEXTDOMAIN correctly). Note that + * we can't just set TEXTDOMAIN here, because this file is used by more + * extensions than just PL/Perl itself. + */ +#undef _ +#define _(x) dgettext(TEXTDOMAIN, x) + +/* put back the definition of isnan if needed */ +#ifdef _MSC_VER +#ifndef isnan +#define isnan(x) _isnan(x) +#endif +#endif + +/* perl version and platform portability */ +#include "ppport.h" + +/* + * perl might have included stdbool.h. If we also did that earlier (see c.h), + * then that's fine. If not, we probably rejected it for some reason. In + * that case, undef bool and proceed with our own bool. (Note that stdbool.h + * makes bool a macro, but our own replacement is a typedef, so the undef + * makes ours visible again). + */ +#ifndef PG_USE_STDBOOL +#ifdef bool +#undef bool +#endif +#endif + +/* supply HeUTF8 if it's missing - ppport.h doesn't supply it, unfortunately */ +#ifndef HeUTF8 +#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ + SvUTF8(HeKEY_sv(he)) : \ + (U32)HeKUTF8(he)) +#endif + +/* supply GvCV_set if it's missing - ppport.h doesn't supply it, unfortunately */ +#ifndef GvCV_set +#define GvCV_set(gv, cv) (GvCV(gv) = cv) +#endif + +/* Perl 5.19.4 changed array indices from I32 to SSize_t */ +#if PERL_BCDVERSION >= 0x5019004 +#define AV_SIZE_MAX SSize_t_MAX +#else +#define AV_SIZE_MAX I32_MAX +#endif + +#endif /* PL_PERL_SYSTEM_H */ diff --git a/third_party/spanner_pg/src/pl/plperl/po/de.po b/third_party/spanner_pg/src/pl/plperl/po/de.po index ba33d41c..91260feb 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/de.po +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plperl/po/el.po b/third_party/spanner_pg/src/pl/plperl/po/el.po index 65928046..2be4cfe8 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/el.po +++ b/third_party/spanner_pg/src/pl/plperl/po/el.po @@ -7,219 +7,222 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 14\n" +"Project-Id-Version: plperl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-07-21 05:08+0000\n" -"PO-Revision-Date: 2021-07-21 09:36+0200\n" +"POT-Creation-Date: 2023-04-14 09:09+0000\n" +"PO-Revision-Date: 2023-04-14 15:00+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 3.0\n" +"X-Generator: Poedit 3.2.2\n" -#: plperl.c:405 +#: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Εάν αληθής, αξιόπιστος και αναξιόπιστος κώδικας Perl θα μεταγλωττιστεί σε αυστηρή λειτουργία." -#: plperl.c:419 +#: plperl.c:422 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Κώδικας αρχικοποίησης Perl για να εκτελέσει όταν ένας διερμηνέας Perl αρχικοποιείται." -#: plperl.c:441 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Κώδικας αρχικοποίησης Perl για να εκτελέσει μία φορά όταν plperl χρησιμοποιείται για πρώτη φορά." -#: plperl.c:449 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Κώδικας αρχικοποίησης Perl για να εκτελέσει μία φορά όταν plperlu χρησιμοποιείται για πρώτη φορά." -#: plperl.c:643 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "δεν είναι δυνατή η εκχώρηση πολλαπλών διερμηνέων Perl σε αυτήν την πλατφόρμα" -#: 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 +#: 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:667 +#: plperl.c:670 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "κατά την εκτέλεση PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:851 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "κατά την ανάλυση αρχικοποίησης Perl" -#: plperl.c:857 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "κατά την εκτέλεση αρχικοποίησης Perl" -#: plperl.c:974 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "κατά την εκτέλεση PLC_TRUSTED" -#: plperl.c:986 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "κατά την εκτέλεση utf8fix" -#: plperl.c:1029 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "κατά την εκτέλεση plperl.on_plperl_init" -#: plperl.c:1052 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "κατά την εκτέλεση plperl.on_plperlu_init" -#: plperl.c:1098 plperl.c:1786 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Κατατεμαχιστής Perl περιέχει ανύπαρκτη στήλη «%s»" -#: plperl.c:1103 plperl.c:1791 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος «%s»" -#: plperl.c:1191 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "ο αριθμός των διαστάσεων συστυχίας (%d) υπερβαίνει το μέγιστο επιτρεπόμενο (%d)" -#: plperl.c:1203 plperl.c:1220 +#: plperl.c:1206 plperl.c:1223 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "πολυδιάστατες συστυχίες πρέπει να περιέχουν εκφράσεις συστυχίας με αντίστοιχο αριθμό διαστάσεων" -#: plperl.c:1256 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "δεν είναι δυνατή η μετατροπή συστυχίας Perl σε τύπο μή-συστυχίας %s" -#: plperl.c:1359 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "δεν είναι δυνατή η μετατροπή κατατμητή Perl σε μη-σύνθετος τύπο %s" -#: plperl.c:1381 plperl.c:3279 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "συνάρτηση που επιστρέφει εγγραφή καλείται σε περιεχόμενο που δεν δύναται να αποδεχτεί τύπο εγγραφής" -#: plperl.c:1440 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "αναζήτηση απέτυχε για τύπο %s" -#: plperl.c:1761 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} δεν υπάρχει" -#: plperl.c:1765 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "Το >{new} $_TD δεν είναι αναφορά κατατμητή" -#: plperl.c:1796 +#: plperl.c:1801 #, c-format msgid "cannot set generated column \"%s\"" msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης «%s»" -#: plperl.c:2008 plperl.c:2846 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Tcl συναρτήσεις δεν είναι δυνατό να επιστρέψουν τύπο %s" -#: plperl.c:2021 plperl.c:2885 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Tcl συναρτήσεις δεν είναι δυνατό να δεχτούν τύπο %s" -#: plperl.c:2138 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "δεν έλαβε μία αναφορά CODE από τη μεταγλώττιση της συνάρτησης «%s»" -#: plperl.c:2229 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "δεν έλαβε ένα στοιχείο επιστροφής από συνάρτηση" -#: plperl.c:2273 plperl.c:2340 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "δεν μπόρεσε να ανακτήσει $_TD" -#: plperl.c:2297 plperl.c:2360 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "δεν έλαβε ένα στοιχείο επιστροφής από συνάρτηση ενεργοποίησης" -#: plperl.c:2419 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "set-valued συνάρτηση καλείται σε περιεχόμενο που δεν μπορεί να δεχτεί ένα σύνολο" -#: plperl.c:2464 +#: plperl.c:2428 +#, c-format +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:2585 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "παράβλεψη τροποποιημένης σειράς σε εναύσμα DELETE" -#: plperl.c:2593 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "το αποτέλεσμα της συνάρτησης ενεργοποίησης PL/Perl πρέπει να είναι undef, «SKIP» ή «MODIFY»" -#: plperl.c:2841 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "συναρτήσεις εναυσμάτων μπορούν να κληθούν μόνο ως εναύσματα" -#: plperl.c:3186 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "το αποτέλεσμα ερωτήματος περιέχει πάρα πολλές σειρές για να χωρέσει σε μία συστοιχία Perl" -#: plperl.c:3256 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "δεν είναι δυνατή η χρήση return_next σε συνάρτηση non-SETOF" -#: plperl.c:3330 +#: plperl.c:3355 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "συνάρτηση SETOF-composite-returning PL/Perl πρέπει να καλεί return_next με αναφορά σε κατάτμηση" -#: plperl.c:4105 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl συνάρτηση «%s»" -#: plperl.c:4117 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "μεταγλώτιση της συνάρτησης PL/Perl «%s»" -#: plperl.c:4126 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl ανώνυμο μπλοκ κώδικα" diff --git a/third_party/spanner_pg/src/pl/plperl/po/es.po b/third_party/spanner_pg/src/pl/plperl/po/es.po index 1bbc8bb4..ce1bc7f7 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/es.po +++ b/third_party/spanner_pg/src/pl/plperl/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 14\n" +"Project-Id-Version: plperl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:54+0000\n" -"PO-Revision-Date: 2019-06-06 17:25-0400\n" +"POT-Creation-Date: 2023-05-07 16:39+0000\n" +"PO-Revision-Date: 2022-10-20 09:06+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -113,7 +113,7 @@ msgstr "no se puede convertir un array de Perl al tipo no-array %s" msgid "cannot convert Perl hash to non-composite type %s" msgstr "no se puede convertir un hash de Perl al tipo no compuesto %s" -#: plperl.c:1400 plperl.c:3317 +#: plperl.c:1400 plperl.c:3320 #, 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" @@ -138,12 +138,12 @@ msgstr "$_TD->{new} no es una referencia a un hash" msgid "cannot set generated column \"%s\"" msgstr "no se puede definir la columna generada «%s»" -#: plperl.c:2029 plperl.c:2867 +#: plperl.c:2029 plperl.c:2870 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "las funciones en PL/Perl no pueden retornar el tipo %s" -#: plperl.c:2042 plperl.c:2906 +#: plperl.c:2042 plperl.c:2909 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "funciones de PL/Perl no pueden aceptar el tipo %s" @@ -168,57 +168,62 @@ msgstr "no se pudo obtener $_TD" msgid "didn't get a return item from trigger function" msgstr "no se obtuvo un elemento de retorno desde la función de disparador" -#: plperl.c:2440 +#: plperl.c:2439 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó a una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: plperl.c:2485 +#: plperl.c:2444 +#, 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" + +#: plperl.c:2488 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "una función PL/Perl que retorna un conjunto debe retornar una referencia a un array o usar return_next" -#: plperl.c:2606 +#: plperl.c:2609 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ignorando la tupla modificada en el disparador DELETE" -#: plperl.c:2614 +#: plperl.c:2617 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "el resultado de la función disparadora en PL/Perl debe ser undef, «SKIP» o «MODIFY»" -#: plperl.c:2862 +#: plperl.c:2865 #, c-format msgid "trigger functions can only be called as triggers" msgstr "las funciones disparadoras sólo pueden ser llamadas como disparadores" -#: plperl.c:3222 +#: plperl.c:3225 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "el resultado de la consulta tiene demasiados registros y no entran en un array de Perl" -#: plperl.c:3294 +#: plperl.c:3297 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "no se puede utilizar return_next en una función sin SETOF" -#: plperl.c:3368 +#: plperl.c:3371 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "una función Perl que retorna SETOF de un tipo compuesto debe invocar return_next con una referencia a un hash" -#: plperl.c:4150 +#: plperl.c:4153 #, c-format msgid "PL/Perl function \"%s\"" msgstr "función PL/Perl «%s»" -#: plperl.c:4162 +#: plperl.c:4165 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "compilación de la función PL/Perl «%s»" -#: plperl.c:4171 +#: plperl.c:4174 #, c-format msgid "PL/Perl anonymous code block" msgstr "bloque de código anónimo de PL/Perl" diff --git a/third_party/spanner_pg/src/pl/plperl/po/fr.po b/third_party/spanner_pg/src/pl/plperl/po/fr.po index a927d877..fcb6d67f 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/fr.po +++ b/third_party/spanner_pg/src/pl/plperl/po/fr.po @@ -1,276 +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 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 "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/third_party/spanner_pg/src/pl/plperl/po/it.po b/third_party/spanner_pg/src/pl/plperl/po/it.po index 359817dd..d2be3261 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/it.po +++ b/third_party/spanner_pg/src/pl/plperl/po/it.po @@ -16,213 +16,223 @@ msgid "" msgstr "" "Project-Id-Version: plperl (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:08+0000\n" -"PO-Revision-Date: 2017-04-23 04:42+0100\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:08+0000\n" +"PO-Revision-Date: 2022-09-26 15:10+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-SourceCharset: utf-8\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 1.8.7.1\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 3.1.1\n" -#: plperl.c:409 +#: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Se vero, il codice Perl affidabile e non affidabile sarà compilato in modalità strict." -#: plperl.c:423 +#: plperl.c:422 msgid "Perl initialization code to execute when a Perl interpreter is initialized." -msgstr "codice Perl di inizializzazione da eseguire quando l'interprete Perl è inizializzato." +msgstr "Codice Perl di inizializzazione da eseguire quando l'interprete Perl è inizializzato." -#: plperl.c:445 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." -msgstr "codice Perl di inizializzazione da eseguire una sola volta quando plperl è usato per la prima volta." +msgstr "Codice Perl di inizializzazione da eseguire una sola volta quando plperl è usato per la prima volta." -#: plperl.c:453 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "codice Perl di inizializzazione da eseguire una sola volta quando plperlu è usato per la prima volta." +msgstr "Codice Perl di inizializzazione da eseguire una sola volta quando plperlu è usato per la prima volta." -#: plperl.c:650 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "non è possibile allocare piû interpreti Perl su questa piattaforma" -#: plperl.c:673 plperl.c:857 plperl.c:863 plperl.c:980 plperl.c:992 -#: plperl.c:1035 plperl.c:1058 plperl.c:2143 plperl.c:2253 plperl.c:2321 -#: plperl.c:2384 +#: 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 "nell'esecuzione di PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:858 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "durante il parsing dell'inizializzazione Perl" -#: plperl.c:864 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "durante l'esecuzione dell'inizializzazione Perl" -#: plperl.c:981 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "nell'esecuzione di PLC_TRUSTED" -#: plperl.c:993 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "durante l'esecuzione di utf8fix" -#: plperl.c:1036 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "nell'esecuzione di plperl.on_plperl_init" -#: plperl.c:1059 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "nell'esecuzione di plperl.on_plperlu_init" -#: plperl.c:1105 plperl.c:1787 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "La struttura hash in Perl contiene la colonna inesistente \"%s\"" -#: plperl.c:1110 plperl.c:1792 +#: plperl.c:1106 plperl.c:1796 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "l'attributo di sistema \"%s\" non si può impostare" -#: plperl.c:1198 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "il numero di dimensioni dell'array (%d) eccede il massimo consentito (%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 "gli array multidimensionali devono avere espressioni array di dimensioni corrispondenti" -#: plperl.c:1263 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "non è possibile convertire un array Perl nel tipo non-array %s" -#: plperl.c:1366 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "non è possibile convertire un hash Perl nel tipo non composito %s" -#: plperl.c:1388 plperl.c:3288 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "la funzione che restituisce un record è chiamata in un contesto che non può accettare il tipo record" -#: plperl.c:1447 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "ricerca del tipo %s fallita" -#: plperl.c:1762 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} non esiste" -#: plperl.c:1766 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} non è un riferimento ad un hash" -#: plperl.c:2018 plperl.c:2860 +#: plperl.c:1801 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "non è possibile modificare la colonna ereditata \"%s\"" + +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "la funzione PL/Perl non può restituire il tipo %s" -#: plperl.c:2031 plperl.c:2901 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "la funzione PL/Perl non può accettare il tipo %s" -#: plperl.c:2148 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "non ho ricevuto un riferimento CODE dal compilare la funzione \"%s\"" -#: plperl.c:2241 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "la funzione non ha restituito un elemento" -#: plperl.c:2285 plperl.c:2352 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "lettura di $_TD fallita" -#: plperl.c:2309 plperl.c:2372 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "la funzione trigger non ha restituito un elemento" -#: plperl.c:2433 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "la funzione che restituisce insiemi è chiamata in un contesto che non può accettare un insieme" -#: plperl.c:2478 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "necessaria modalità materializzata, ma non ammessa in questo contesto" + +#: plperl.c:2472 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "la funzione PL/Perl che restituisce un insieme deve restituire un riferimento ad un array o usare return_next" -#: plperl.c:2599 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "modifiche alla riga ignorate nel trigger DELETE" -#: plperl.c:2607 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "il risultato della funzione trigger PL/Perl deve essere undef, \"SKIP\" oppure \"MODIFY\"" -#: plperl.c:2855 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "le funzioni trigger possono essere chiamate esclusivamente da trigger" -#: plperl.c:3195 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "il risultato della query ha troppe righe per un array Perl" -#: plperl.c:3265 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "non si può usare return_next in una funzione non-SETOF" -#: plperl.c:3339 +#: plperl.c:3355 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "una funzione PL/Perl che restituisce SETOF di un tipo composito deve chiamare return_next con riferimento ad un hash" -#: plperl.c:4117 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "funzione PL/Perl \"%s\"" -#: plperl.c:4129 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "compilazione della funzione Perl \"%s\"" -#: plperl.c:4138 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "blocco di codice anonimo PL/Perl" diff --git a/third_party/spanner_pg/src/pl/plperl/po/ja.po b/third_party/spanner_pg/src/pl/plperl/po/ja.po index 197975bc..522893ce 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/ja.po +++ b/third_party/spanner_pg/src/pl/plperl/po/ja.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL 14)\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" -"PO-Revision-Date: 2021-08-25 11:26+0900\n" +"POT-Creation-Date: 2022-08-09 12:01+0900\n" +"PO-Revision-Date: 2019-06-11 12:08+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -16,228 +16,215 @@ 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.8.13\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の初期化コード。" +msgstr "plperl が最初に使用される際に一度だけ実行される Perl の初期化コード。" -#: plperl.c:450 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "plperluが最初に使用される際に一度だけ実行されるPerlの初期化コード。" +msgstr "plperlu が最初に使用される際に一度だけ実行される Perl の初期化コード。" -#: plperl.c:647 +#: plperl.c:646 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" -msgstr "このプラットフォームでは複数のPerlインタプリタを設定できません" +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初期化処理のパース中" +msgstr "Perl 初期化処理のパース中" -#: plperl.c:861 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" -msgstr "Perl初期化処理の実行中" +msgstr "Perl 初期化処理の実行中" -#: plperl.c:978 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" -msgstr "PLC_TRUSTEDの実行中" +msgstr "PLC_TRUSTED の実行中" -#: plperl.c:990 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" -msgstr "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\"があります" +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\"は設定できません" +msgstr "システム属性 \"%s\" は変更できません" -#: plperl.c:1195 +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "配列の次元数(%d)が上限(%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" -msgstr "多次元配列は次元が合致する配列式でなければなりません" +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 に変換できません" +msgstr "Perl 配列を非配列型 %s に変換できません" -#: plperl.c:1363 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" -msgstr "Perlハッシュを非複合型 %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\"は設定できません" +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\"のコンパイルからはコード参照を取得しませんでした" +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 "集合を受け付けないコンテキストで集合値関数が呼び出されました" +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 "トリガー関数はトリガーとしてのみ呼び出せます" +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\"" +msgstr "PL/Perl 関数 \"%s\"" -#: plperl.c:4144 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" -msgstr "PL/Perl関数\"%s\"のコンパイル" +msgstr "PL/Perl 関数 \"%s\" のコンパイル" -#: plperl.c:4153 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" -msgstr "PL/Perlの無名コードブロック" +msgstr "PL/Perl の無名コードブロック" + +#~ msgid "PL/Perl function must return reference to hash or array" +#~ msgstr "PL/Perl 関数はハッシュまたは配列への参照を返す必要があります" diff --git a/third_party/spanner_pg/src/pl/plperl/po/ka.po b/third_party/spanner_pg/src/pl/plperl/po/ka.po new file mode 100644 index 00000000..94ae0c44 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plperl/po/ka.po @@ -0,0 +1,254 @@ +# Georgian message translation file for plperl +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plperl (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: plperl (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-02 04:39+0000\n" +"PO-Revision-Date: 2022-07-07 10:10+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1\n" + +#: plperl.c:408 +msgid "" +"If true, trusted and untrusted Perl code will be compiled in strict mode." +msgstr "" +"თუ ჩართულია, Perl-ის სანდრო და არასანდო კოდი მკაცრ რეჟიმში დაკომპილდება." + +#: plperl.c:422 +msgid "" +"Perl initialization code to execute when a Perl interpreter is initialized." +msgstr "" +"Perl-ის ინიციალიზაციის კოდი, რომელიც ინტერპრეტატორის ინიციალიზაციისას " +"ეშვება." + +#: plperl.c:444 +msgid "Perl initialization code to execute once when plperl is first used." +msgstr "" +"Perl-ის ინიციალიზაციის კოდი, რომელიც plperl-ის პირველი გამოყენებისას ეშვება." + +#: plperl.c:452 +msgid "Perl initialization code to execute once when plperlu is first used." +msgstr "" +"Perl-ის ინიციალიზაციის კოდი, რომელიც plperlu-ის პირველი გამოყენებისას " +"ეშვება." + +#: plperl.c:646 +#, 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:2138 plperl.c:2246 plperl.c:2314 +#: plperl.c:2377 +#, c-format +msgid "%s" +msgstr "%s" + +#: plperl.c:670 +#, c-format +msgid "while executing PostgreSQL::InServer::SPI::bootstrap" +msgstr "\"PostgreSQL::InServer::SPI::bootstrap\"-ის შესრულებისას" + +#: plperl.c:854 +#, c-format +msgid "while parsing Perl initialization" +msgstr "\"Perl\"-ის ინიციალიზაციის დამუშავებისას" + +#: plperl.c:860 +#, c-format +msgid "while running Perl initialization" +msgstr "\"Perl\"-ის ინიციალიზაციის შესრულებისას" + +#: plperl.c:977 +#, c-format +msgid "while executing PLC_TRUSTED" +msgstr "\"PLC_TRUSTED\"-ის შესრულებისას" + +#: plperl.c:989 +#, c-format +msgid "while executing utf8fix" +msgstr "utf8fix-ის შესრულებისას" + +#: plperl.c:1032 +#, c-format +msgid "while executing plperl.on_plperl_init" +msgstr "plperl.on_plperl_init-ის შესრულებისას" + +#: plperl.c:1055 +#, c-format +msgid "while executing plperl.on_plperlu_init" +msgstr "plperl.on_plperlu_init-ის შესრულებისას" + +#: plperl.c:1101 plperl.c:1791 +#, c-format +msgid "Perl hash contains nonexistent column \"%s\"" +msgstr "Perl-ის ჰეში არარსებულ სვეტს შეიცავს: %s" + +#: plperl.c:1106 plperl.c:1796 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "სისტემური ატრიბუტის დაყენების შეცდომა: \"%s\"" + +#: plperl.c:1194 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "მასივის ზომების რაოდენობა (%d) მაქსიმუმ დასაშვებზე (%d) დიდია" + +#: plperl.c:1206 plperl.c:1223 +#, c-format +msgid "" +"multidimensional arrays must have array expressions with matching dimensions" +msgstr "" +"მრავალგანზომილებიან მასივებს უნდა ჰქონდეთ მასივის გამოსახულებები შესაბამისი " +"ზომებით" + +#: plperl.c:1259 +#, c-format +msgid "cannot convert Perl array to non-array type %s" +msgstr "\"Perl\"-ის მასივის არა-მასივის ტიპში გადაყვანა შეუძლებელია: %s" + +#: plperl.c:1362 +#, c-format +msgid "cannot convert Perl hash to non-composite type %s" +msgstr "\"Perl\"-ის ჰეშის არაკომპოზიტურ ტიპში გადაყვანა შეუძლებელია: %s" + +#: plperl.c:1384 plperl.c:3304 +#, c-format +msgid "" +"function returning record called in context that cannot accept type record" +msgstr "" +"ფუნქცია, რომელიც ჩანაწერს აბრუნებს, გამოძახებულია კონტექსტში, რომელსაც " +"ჩანაწერის მიღება არ შეუძლია" + +#: plperl.c:1445 +#, c-format +msgid "lookup failed for type %s" +msgstr "ტიპის მოძებნის შეცდომა: %s" + +#: plperl.c:1766 +#, c-format +msgid "$_TD->{new} does not exist" +msgstr "$_TD->{new} არ არსებობს" + +#: plperl.c:1770 +#, c-format +msgid "$_TD->{new} is not a hash reference" +msgstr "$_TD->{new} ჰეშის ბმას არ წარმოადგენს" + +#: plperl.c:1801 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "გენერირებული სვეტის დაყენება შეუძლებელია: %s" + +#: plperl.c:2013 plperl.c:2854 +#, c-format +msgid "PL/Perl functions cannot return type %s" +msgstr "PL/Perl ფუნქციას %s ტიპის დაბრუნება არ შეუძლია" + +#: plperl.c:2026 plperl.c:2893 +#, c-format +msgid "PL/Perl functions cannot accept type %s" +msgstr "PL/Perl ფუნქციას %s ტიპის გამოყენება არ შეუძლია" + +#: plperl.c:2143 +#, c-format +msgid "didn't get a CODE reference from compiling function \"%s\"" +msgstr "კომპილირებადი ფუნქციის (\"%s\") CODE მიბმა არ მიმიღია" + +#: plperl.c:2234 +#, c-format +msgid "didn't get a return item from function" +msgstr "ფუნქციას არაფერი დაუბრუნებია" + +#: plperl.c:2278 plperl.c:2345 +#, c-format +msgid "couldn't fetch $_TD" +msgstr "$_TD -ის გამოთხოვის შეცდომა" + +#: plperl.c:2302 plperl.c:2365 +#, c-format +msgid "didn't get a return item from trigger function" +msgstr "ტრიგერის ფუნქციიდან ჩანაწერი არ დაბრუნებულა" + +#: plperl.c:2423 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "" +"ფუნქცია, რომელიც სეტს აბრუნებს, გამოძახებულია კონტექსტში, რომელიც სეტებს " +"ვერ იღებს" + +#: plperl.c:2428 +#, c-format +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:2593 +#, c-format +msgid "ignoring modified row in DELETE trigger" +msgstr "\"DELETE\" ტრიგერში შეცვლილი მწკრივის იგნორი" + +#: plperl.c:2601 +#, c-format +msgid "" +"result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" +msgstr "" +"\"PL/Perl\"-ის ტრიგერის ფუნქციის შედეგი უნდა იყოს undef, \"SKIP\" ან " +"\"MODIFY\"" + +#: plperl.c:2849 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "ტრიგერის ფუნქციების გამოძახება მხოლოდ ტრიგერებად შეიძლება" + +#: plperl.c:3209 +#, c-format +msgid "query result has too many rows to fit in a Perl array" +msgstr "მოთხოვნის შედეგში Perl-ის მასივში ჩასატევად მეტისმეტად ბევრი მწკრივია" + +#: plperl.c:3281 +#, c-format +msgid "cannot use return_next in a non-SETOF function" +msgstr "return_next-ის გამოყენება არა-SETOF ტიპის ფუნქციებში შეუძლებელია" + +#: plperl.c:3355 +#, 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:4137 +#, c-format +msgid "PL/Perl function \"%s\"" +msgstr "PL/Perl-ის ფუნქცია \"%s\"" + +#: plperl.c:4149 +#, c-format +msgid "compilation of PL/Perl function \"%s\"" +msgstr "\"PL/Perl\" ფუნქციის \"%s\" კომპილაცია" + +#: plperl.c:4158 +#, c-format +msgid "PL/Perl anonymous code block" +msgstr "PL/Perl ანონიმური კოდის ბლოკი" diff --git a/third_party/spanner_pg/src/pl/plperl/po/ko.po b/third_party/spanner_pg/src/pl/plperl/po/ko.po index a512cfef..17f22871 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/ko.po +++ b/third_party/spanner_pg/src/pl/plperl/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 12\n" +"Project-Id-Version: plperl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:08+0000\n" -"PO-Revision-Date: 2019-11-01 12:51+0900\n" +"POT-Creation-Date: 2023-04-12 00:39+0000\n" +"PO-Revision-Date: 2023-04-06 10:02+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -16,200 +16,205 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: plperl.c:406 +#: plperl.c:408 msgid "" "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "true로 지정하면, Perl 코드가 엄격한 구문 검사로 컴파일 됨" -#: plperl.c:420 +#: 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" 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 "반환 자료형이 record인데 함수가 그 자료형으로 반환하지 않음" -#: 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 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 "" "set-values 함수(테이블 리턴 함수)가 set 정의 없이 사용되었습니다 (테이블과 해" "당 열 alias 지정하세요)" -#: plperl.c:2489 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, 이 구문에서는 허용되지 않습니다" + +#: 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\" 중 하나여야 함" -#: 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 "SETOF 함수가 아닌 경우에는 return_next 구문을 쓸 수 없음" -#: plperl.c:3357 +#: plperl.c:3355 #, c-format msgid "" "SETOF-composite-returning PL/Perl function must call return_next with " @@ -218,17 +223,17 @@ msgstr "" "SETOF-composite-returning PL/Perl 함수는 return_next 에서 해시 자료형을 참조" "해야 함" -#: plperl.c:4132 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "\"%s\" PL/Perl 함수" -#: plperl.c:4144 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "\"%s\" PL/Perl 함수 컴필레이션" -#: plperl.c:4153 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl 익명 코드 블럭" diff --git a/third_party/spanner_pg/src/pl/plperl/po/pt_BR.po b/third_party/spanner_pg/src/pl/plperl/po/pt_BR.po index ff6a1f86..72d357ee 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/pt_BR.po +++ b/third_party/spanner_pg/src/pl/plperl/po/pt_BR.po @@ -1,34 +1,36 @@ # Brazilian Portuguese message translation file for plperl -# Copyright (C) 2009 PostgreSQL Global Development Group +# +# Copyright (C) 2009-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Euler Taveira de Oliveira , 2009-2016. +# +# Euler Taveira , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-08-09 22:53-0300\n" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-27 13:15-0300\n" "PO-Revision-Date: 2009-05-10 01:12-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: plperl.c:405 +#: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Se verdadeiro, código Perl confiável e não-confiável será compilado em modo estrito." -#: plperl.c:419 +#: plperl.c:422 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Código de inicialização Perl executado quando um interpretador Perl for inicializado." -#: plperl.c:441 +#: plperl.c:444 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Código de inicialização Perl executado quando plperl for utilizado pela primeira vez." -#: plperl.c:449 +#: plperl.c:452 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Código de inicialização Perl executado quando plperlu for utilizado pela primeira vez." @@ -37,184 +39,189 @@ msgstr "Código de inicialização Perl executado quando plperlu for utilizado p msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "não pode alocar múltiplos interpretadores Perl nessa plataforma" -#: plperl.c:666 plperl.c:841 plperl.c:847 plperl.c:961 plperl.c:973 -#: plperl.c:1016 plperl.c:1037 plperl.c:2080 plperl.c:2189 plperl.c:2256 -#: plperl.c:2318 +#: 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:667 +#: plperl.c:670 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "ao executar PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:842 +#: plperl.c:854 #, c-format msgid "while parsing Perl initialization" msgstr "ao analisar código de inicialização Perl" -#: plperl.c:848 +#: plperl.c:860 #, c-format msgid "while running Perl initialization" msgstr "ao executar código de inicialização Perl" -#: plperl.c:962 +#: plperl.c:977 #, c-format msgid "while executing PLC_TRUSTED" msgstr "ao executar PLC_TRUSTED" -#: plperl.c:974 +#: plperl.c:989 #, c-format msgid "while executing utf8fix" msgstr "ao executar utf8fix" -#: plperl.c:1017 +#: plperl.c:1032 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "ao executar plperl.on_plperl_init" -#: plperl.c:1038 +#: plperl.c:1055 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "ao executar plperl.on_plperlu_init" -#: plperl.c:1082 plperl.c:1722 +#: plperl.c:1101 plperl.c:1791 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "hash Perl contém coluna inexistente \"%s\"" -#: plperl.c:1167 +#: plperl.c:1106 plperl.c:1796 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "não pode definir atributo do sistema \"%s\"" + +#: plperl.c:1194 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "número de dimensões da matriz (%d) excede o máximo permitido (%d)" -#: plperl.c:1179 plperl.c:1196 +#: plperl.c:1206 plperl.c:1223 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "matrizes multidimensionais devem ter expressões de matriz com dimensões correspondentes" -#: plperl.c:1231 +#: plperl.c:1259 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "não pode converter array Perl para tipo que não é array %s" -#: plperl.c:1333 +#: plperl.c:1362 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "não pode converter hash Perl para tipo não-composto %s" -#: plperl.c:1344 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "função que retorna record foi chamada em um contexto que não pode aceitar tipo record" -#: plperl.c:1359 -#, c-format -msgid "PL/Perl function must return reference to hash or array" -msgstr "função PL/Perl deve retornar referência a um hash ou uma matriz" - -#: plperl.c:1396 +#: plperl.c:1445 #, c-format msgid "lookup failed for type %s" msgstr "falhou ao pesquisar por tipo %s" -#: plperl.c:1699 +#: plperl.c:1766 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} não existe" -#: plperl.c:1703 +#: plperl.c:1770 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} não é uma referência hash" -#: plperl.c:1956 plperl.c:2790 +#: plperl.c:1801 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "não pode definir coluna gerada \"%s\"" + +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "funções PL/Perl não podem retornar tipo %s" -#: plperl.c:1969 plperl.c:2835 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "funções PL/Perl não podem aceitar tipo %s" -#: plperl.c:2085 +#: plperl.c:2143 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "não obteve uma referência CODE da compilação da função \"%s\"" -#: plperl.c:2177 +#: plperl.c:2234 #, c-format msgid "didn't get a return item from function" msgstr "não obteve um item de retorno da função" -#: plperl.c:2220 plperl.c:2286 +#: plperl.c:2278 plperl.c:2345 #, c-format msgid "couldn't fetch $_TD" msgstr "não pôde obter $_TD" -#: plperl.c:2244 plperl.c:2306 +#: plperl.c:2302 plperl.c:2365 #, c-format msgid "didn't get a return item from trigger function" msgstr "não obteve um item de retorno da função de gatilho" -#: plperl.c:2363 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "função que tem argumento do tipo conjunto foi chamada em um contexto que não pode aceitar um conjunto" -#: plperl.c:2407 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "modo de materialização é requerido, mas ele não é permitido neste contexto" + +#: plperl.c:2472 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "funçao PL/Perl que retorna conjunto deve retornar referência para matriz ou usar return_next" -#: plperl.c:2521 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ignorando registro modificado em gatilho DELETE" -#: plperl.c:2529 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "resultado da função de gatilho PL/Perl deve ser undef, \"SKIP\" ou \"MODIFY\"" -#: plperl.c:2708 plperl.c:2718 -#, c-format -msgid "out of memory" -msgstr "sem memória" - -#: plperl.c:2782 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "funções de gatilho só podem ser chamadas como gatilhos" -#: plperl.c:3121 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "resultado da consulta tem muitos registros para caber em um array Perl" -#: plperl.c:3166 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "não pode utilizar return_next em uma função que não retorna conjunto" -#: plperl.c:3222 +#: plperl.c:3355 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "função PL/Perl que retorna um conjunto de tipo composto deve chamar return_next com referência a um hash" -#: plperl.c:3954 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "função PL/Perl \"%s\"" -#: plperl.c:3966 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "compilação da função PL/Perl \"%s\"" -#: plperl.c:3975 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "bloco de código PL/Perl anônimo" diff --git a/third_party/spanner_pg/src/pl/plperl/po/ro.po b/third_party/spanner_pg/src/pl/plperl/po/ro.po deleted file mode 100644 index d101c4dd..00000000 --- a/third_party/spanner_pg/src/pl/plperl/po/ro.po +++ /dev/null @@ -1,185 +0,0 @@ -# LANGUAGE message translation file for plperl -# Copyright (C) 2010 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2010. -# -msgid "" -msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-11-09 20:39+0000\n" -"PO-Revision-Date: 2022-06-15 09:26+0200\n" -"Last-Translator: Gheorge Rosca Codreanu \n" -"Language-Team: ROMANA \n" -"Language: ro\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Romanian\n" -"X-Poedit-Country: ROMANIA\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -#: plperl.c:364 -msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." -msgstr "Dacă true, trusted și untrusted codul Perl se va compila în modul strict." - -#: plperl.c:378 -msgid "Perl initialization code to execute when a Perl interpreter is initialized." -msgstr "codul de inițializare Perl de executat odată când interpreterul Perl este inițializat." - -#: plperl.c:400 -msgid "Perl initialization code to execute once when plperl is first used." -msgstr "codul de inițializare Perl de executat odată când plperl este folosit pentru prima oară." - -#: plperl.c:408 -msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "codul de inițializare Perl de executat odată când plperlu este folosit pentru prima oară." - -#: plperl.c:625 -#: plperl.c:787 -#: plperl.c:792 -#: plperl.c:896 -#: plperl.c:907 -#: plperl.c:948 -#: plperl.c:969 -#: plperl.c:1942 -#: plperl.c:2037 -#: plperl.c:2099 -#, c-format -msgid "%s" -msgstr "%s" - -#: plperl.c:626 -msgid "while executing PostgreSQL::InServer::SPI::bootstrap" -msgstr "în timpul execuției PostgreSQL::InServer::SPI::bootstrap" - -#: plperl.c:788 -msgid "while parsing Perl initialization" -msgstr "în timpul parsing inițializării Perl" - -#: plperl.c:793 -msgid "while running Perl initialization" -msgstr "în timpul rulării inițializării Perl" - -#: plperl.c:897 -msgid "while executing PLC_TRUSTED" -msgstr "în timpul execuției PLC_TRUSTED" - -#: plperl.c:908 -msgid "while executing utf8fix" -msgstr "în timpul execuției utf8fix" - -#: plperl.c:949 -msgid "while executing plperl.on_plperl_init" -msgstr "în timpul execuției plperl.on_plperl_init" - -#: plperl.c:970 -msgid "while executing plperl.on_plperlu_init" -msgstr "în timpul execuției plperl.on_plperlu_init" - -#: plperl.c:1014 -#: plperl.c:1614 -#, c-format -msgid "Perl hash contains nonexistent column \"%s\"" -msgstr "Perl hash conține o coloană \"%s\" inexistentă" - -#: plperl.c:1099 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "numarul dimensiunilor array-ului (%d) depăşeşte maximul admis, %d" - -#: plperl.c:1111 -#: plperl.c:1128 -msgid "multidimensional arrays must have array expressions with matching dimensions" -msgstr "array-urile multidimensionale trebuie să aibă expresii de tip array cu dimensiuni corespunzătoare" - -#: plperl.c:1165 -#, c-format -msgid "cannot convert Perl array to non-array type %s" -msgstr "nu pot converti un array Perl în tipul de dată %s" - -#: plperl.c:1261 -#, c-format -msgid "cannot convert Perl hash to non-composite type %s" -msgstr "nu pot converti tipul de dată hash din Perl într-un tip de dată composit %s" - -#: plperl.c:1272 -msgid "function returning record called in context that cannot accept type record" -msgstr "apel de funcție care are rezultat de tip rând într-un context care nu acceptă tipul rând" - -#: plperl.c:1287 -msgid "PL/Perl function must return reference to hash or array" -msgstr "funcția PL/Perl trebuie să returneze o referință la hash sau array" - -#: plperl.c:1591 -msgid "$_TD->{new} does not exist" -msgstr "$_TD->{new} nu există" - -#: plperl.c:1595 -msgid "$_TD->{new} is not a hash reference" -msgstr "$_TD->{new} nu e o referință de tip hash" - -#: plperl.c:1819 -#: plperl.c:2517 -#, c-format -msgid "PL/Perl functions cannot return type %s" -msgstr "funcțiile PL/Perl functions nu pot avea ca rezultat tipul %s" - -#: plperl.c:1832 -#: plperl.c:2564 -#, c-format -msgid "PL/Perl functions cannot accept type %s" -msgstr "funcțiile PL/Perl nu pot accepta tipul %s" - -#: plperl.c:1946 -#, c-format -msgid "didn't get a CODE reference from compiling function \"%s\"" -msgstr "compilarea funcției \"%s\" nu a rezultat o referință CODE" - -#: plperl.c:2150 -msgid "set-valued function called in context that cannot accept a set" -msgstr "funcţie set-valoare apelată într-un context care nu acceptă set" - -#: plperl.c:2194 -msgid "set-returning PL/Perl function must return reference to array or use return_next" -msgstr "funcția PL/Perl care are rezultat de tip set trebuie să intoarcă o referință la un array sau să folosească return_next" - -#: plperl.c:2314 -msgid "ignoring modified row in DELETE trigger" -msgstr "ignor rândul modificat in triggerul DELETE" - -#: plperl.c:2322 -msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" -msgstr "rezultatul unei funcții trigger PL/Perl trebuie să fie de tip undef, \"SKIP\", or \"MODIFY\"" - -#: plperl.c:2448 -#: plperl.c:2454 -msgid "out of memory" -msgstr "memorie insuficientă" - -#: plperl.c:2508 -msgid "trigger functions can only be called as triggers" -msgstr "funcţiile trigger pot fi apelate doar ca triggere" - -#: plperl.c:2884 -msgid "cannot use return_next in a non-SETOF function" -msgstr "nu puteți folosi return_next într-o funcție de tip non-SETOF" - -#: plperl.c:2940 -msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" -msgstr "funcția PL/Perl cu rezultat de tip SETOF-composite trebuie să apeleze return_next cu referință la hash" - -#: plperl.c:3655 -#, c-format -msgid "PL/Perl function \"%s\"" -msgstr "funcție PL/Perl \"%s\"" - -#: plperl.c:3667 -#, c-format -msgid "compilation of PL/Perl function \"%s\"" -msgstr "compilare a funcției PL/Perl \"%s\"" - -#: plperl.c:3676 -msgid "PL/Perl anonymous code block" -msgstr "bloc de cod PL/Perl anonim" - diff --git a/third_party/spanner_pg/src/pl/plperl/po/ru.po b/third_party/spanner_pg/src/pl/plperl/po/ru.po index a6b90bf8..342c79c0 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/ru.po +++ b/third_party/spanner_pg/src/pl/plperl/po/ru.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: plperl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2023-05-03 05:56+0300\n" -"PO-Revision-Date: 2019-08-29 15:42+0300\n" +"PO-Revision-Date: 2022-09-05 13:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -123,7 +123,7 @@ msgstr "Perl-массив нельзя преобразовать в тип не msgid "cannot convert Perl hash to non-composite type %s" msgstr "Perl-хеш нельзя преобразовать в не составной тип %s" -#: plperl.c:1400 plperl.c:3317 +#: plperl.c:1400 plperl.c:3320 #, c-format msgid "" "function returning record called in context that cannot accept type record" @@ -150,12 +150,12 @@ msgstr "$_TD->{new} - не ссылка на хеш" msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" -#: plperl.c:2029 plperl.c:2867 +#: plperl.c:2029 plperl.c:2870 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функции PL/Perl не могут возвращать тип %s" -#: plperl.c:2042 plperl.c:2906 +#: plperl.c:2042 plperl.c:2909 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функции PL/Perl не могут принимать тип %s" @@ -180,13 +180,18 @@ msgstr "не удалось получить $_TD" msgid "didn't get a return item from trigger function" msgstr "не удалось получить возвращаемый элемент от триггерной функции" -#: plperl.c:2440 +#: plperl.c:2439 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: plperl.c:2485 +#: plperl.c:2444 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "требуется режим материализации, но он недопустим в этом контексте" + +#: plperl.c:2488 #, c-format msgid "" "set-returning PL/Perl function must return reference to array or use " @@ -195,12 +200,12 @@ msgstr "" "функция PL/Perl, возвращающая множество, должна возвращать ссылку на массив " "или вызывать return_next" -#: plperl.c:2606 +#: plperl.c:2609 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "в триггере DELETE изменённая строка игнорируется" -#: plperl.c:2614 +#: plperl.c:2617 #, c-format msgid "" "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" @@ -208,24 +213,24 @@ msgstr "" "результатом триггерной функции PL/Perl должен быть undef, \"SKIP\" или " "\"MODIFY\"" -#: plperl.c:2862 +#: plperl.c:2865 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: plperl.c:3222 +#: plperl.c:3225 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "" "результат запроса содержит слишком много строк для передачи в массиве Perl" -#: plperl.c:3294 +#: plperl.c:3297 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "" "return_next можно использовать только в функциях, возвращающих множества" -#: plperl.c:3368 +#: plperl.c:3371 #, c-format msgid "" "SETOF-composite-returning PL/Perl function must call return_next with " @@ -234,17 +239,17 @@ msgstr "" "функция PL/Perl, возвращающая составное множество, должна вызывать " "return_next со ссылкой на хеш" -#: plperl.c:4150 +#: plperl.c:4153 #, c-format msgid "PL/Perl function \"%s\"" msgstr "функция PL/Perl \"%s\"" -#: plperl.c:4162 +#: plperl.c:4165 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компиляция функции PL/Perl \"%s\"" -#: plperl.c:4171 +#: plperl.c:4174 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонимный блок кода PL/Perl" diff --git a/third_party/spanner_pg/src/pl/plperl/po/sv.po b/third_party/spanner_pg/src/pl/plperl/po/sv.po index 0a41ded1..94944665 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/sv.po +++ b/third_party/spanner_pg/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, 2021. +# Dennis Björklund 2017, 2018, 2019, 2020, 2021, 2022, 2023. # 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: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2021-11-07 10:37+0100\n" +"POT-Creation-Date: 2022-04-11 13:38+0000\n" +"PO-Revision-Date: 2023-03-09 22:40+0100\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" +msgstr "fick inget returvärde från triggerfunktion" -#: 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/third_party/spanner_pg/src/pl/plperl/po/uk.po b/third_party/spanner_pg/src/pl/plperl/po/uk.po index 2d0eec87..79516496 100644 --- a/third_party/spanner_pg/src/pl/plperl/po/uk.po +++ b/third_party/spanner_pg/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: 2022-03-16 09:08+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2022-08-12 10:39+0000\n" +"PO-Revision-Date: 2022-09-13 11:52\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: /REL_14_STABLE/plperl.pot\n" -"X-Crowdin-File-ID: 770\n" +"X-Crowdin-File: /REL_15_STABLE/plperl.pot\n" +"X-Crowdin-File-ID: 920\n" #: plperl.c:408 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." @@ -110,7 +110,7 @@ msgstr "неможливо конвертувати масив Perl у тип н msgid "cannot convert Perl hash to non-composite type %s" msgstr "неможливо конвертувати хеш Perl у нескладений тип %s" -#: plperl.c:1384 plperl.c:3301 +#: plperl.c:1384 plperl.c:3304 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" @@ -135,12 +135,12 @@ msgstr "$_TD->{new} не є посиланням на хеш" msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований стовпець \"%s\"" -#: plperl.c:2013 plperl.c:2851 +#: plperl.c:2013 plperl.c:2854 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функції PL/Perl не можуть повертати тип %s" -#: plperl.c:2026 plperl.c:2890 +#: plperl.c:2026 plperl.c:2893 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функції PL/Perl не можуть приймати тип %s" @@ -165,57 +165,62 @@ msgstr "не вдалось отримати $_TD" msgid "didn't get a return item from trigger function" msgstr "не отримано елемент результату з функції-тригеру" -#: plperl.c:2424 +#: plperl.c:2423 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: plperl.c:2469 +#: plperl.c:2428 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" + +#: 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:2590 +#: plperl.c:2593 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ігнорується змінений рядок у тригері DELETE" -#: plperl.c:2598 +#: plperl.c:2601 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "результат тригерної функції PL/Perl повинен бути undef, \"SKIP\" або \"MODIFY\"" -#: plperl.c:2846 +#: plperl.c:2849 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: plperl.c:3206 +#: plperl.c:3209 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "результат запиту має забагато рядків для відповідності в масиві Perl" -#: plperl.c:3278 +#: plperl.c:3281 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "не можна використовувати return_next в функціях, що не повертають набори даних" -#: plperl.c:3352 +#: 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 з посиланням на хеш" -#: plperl.c:4136 +#: plperl.c:4137 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl функція \"%s\"" -#: plperl.c:4148 +#: plperl.c:4149 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компіляція функції PL/Perl \"%s\"" -#: plperl.c:4157 +#: plperl.c:4158 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонімний блок коду PL/Perl" diff --git a/third_party/spanner_pg/src/pl/plperl/sql/plperl_init.sql b/third_party/spanner_pg/src/pl/plperl/sql/plperl_init.sql index 4ebf3f86..2aa38110 100644 --- a/third_party/spanner_pg/src/pl/plperl/sql/plperl_init.sql +++ b/third_party/spanner_pg/src/pl/plperl/sql/plperl_init.sql @@ -1,4 +1,4 @@ --- test plperl.on_plperl_init errors are fatal +-- test plperl.on_plperl_init -- This test tests setting on_plperl_init after loading plperl LOAD 'plperl'; @@ -8,3 +8,34 @@ SET SESSION plperl.on_plperl_init = ' system("/nonesuch"); '; SHOW plperl.on_plperl_init; DO $$ warn 42 $$ language plperl; + +-- +-- Reconnect (to unload plperl), then test setting on_plperl_init +-- as an unprivileged user +-- + +\c - + +CREATE ROLE regress_plperl_user; + +SET ROLE regress_plperl_user; + +-- this succeeds, since the GUC isn't known yet +SET SESSION plperl.on_plperl_init = 'test'; + +RESET ROLE; + +LOAD 'plperl'; + +SHOW plperl.on_plperl_init; + +DO $$ warn 42 $$ language plperl; + +-- now we won't be allowed to set it in the first place +SET ROLE regress_plperl_user; + +SET SESSION plperl.on_plperl_init = 'test'; + +RESET ROLE; + +DROP ROLE regress_plperl_user; diff --git a/third_party/spanner_pg/src/pl/plperl/sql/plperl_setup.sql b/third_party/spanner_pg/src/pl/plperl/sql/plperl_setup.sql index 74844782..a89cf566 100644 --- a/third_party/spanner_pg/src/pl/plperl/sql/plperl_setup.sql +++ b/third_party/spanner_pg/src/pl/plperl/sql/plperl_setup.sql @@ -27,12 +27,16 @@ SET ROLE regress_user1; CREATE EXTENSION plperl; CREATE EXTENSION plperlu; -- fail +CREATE SCHEMA plperl_setup_scratch; +SET search_path = plperl_setup_scratch; +GRANT ALL ON SCHEMA plperl_setup_scratch TO regress_user2; CREATE FUNCTION foo1() returns int language plperl as '1;'; SELECT foo1(); -- Must reconnect to avoid failure with non-MULTIPLICITY Perl interpreters \c - +SET search_path = plperl_setup_scratch; SET ROLE regress_user1; diff --git a/third_party/spanner_pg/src/pl/plperl/text2macro.pl b/third_party/spanner_pg/src/pl/plperl/text2macro.pl index a3e307b1..70b7c3f1 100644 --- a/third_party/spanner_pg/src/pl/plperl/text2macro.pl +++ b/third_party/spanner_pg/src/pl/plperl/text2macro.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # src/pl/plperl/text2macro.pl diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/Makefile b/third_party/spanner_pg/src/pl/plpgsql/src/Makefile index 9946abbc..7cd89002 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/Makefile +++ b/third_party/spanner_pg/src/pl/plpgsql/src/Makefile @@ -32,8 +32,9 @@ DATA = plpgsql.control plpgsql--1.0.sql REGRESS_OPTS = --dbname=$(PL_TESTDB) -REGRESS = plpgsql_array plpgsql_call plpgsql_control plpgsql_copy plpgsql_domain \ - plpgsql_record plpgsql_cache plpgsql_simple plpgsql_transaction \ +REGRESS = plpgsql_array plpgsql_cache plpgsql_call plpgsql_control \ + plpgsql_copy plpgsql_domain plpgsql_misc \ + plpgsql_record plpgsql_simple plpgsql_transaction \ plpgsql_trap plpgsql_trigger plpgsql_varprops # where to find gen_keywordlist.pl and subsidiary files @@ -41,11 +42,6 @@ TOOLSDIR = $(top_srcdir)/src/tools GEN_KEYWORDLIST = $(PERL) -I $(TOOLSDIR) $(TOOLSDIR)/gen_keywordlist.pl GEN_KEYWORDLIST_DEPS = $(TOOLSDIR)/gen_keywordlist.pl $(TOOLSDIR)/PerfectHash.pm -# Test input and expected files. These are created by pg_regress itself, so we -# don't have a rule to create them. We do need rules to clean them however. -input_files = $(patsubst $(srcdir)/input/%.source,sql/%.sql, $(wildcard $(srcdir)/input/*.source)) -output_files := $(patsubst $(srcdir)/output/%.source,expected/%.out, $(wildcard $(srcdir)/output/*.source)) - all: all-lib # Shared library stuff @@ -116,7 +112,6 @@ distprep: pl_gram.h pl_gram.c plerrcodes.h pl_reserved_kwlist_d.h pl_unreserved_ # are not cleaned here. clean distclean: clean-lib rm -f $(OBJS) - rm -f $(output_files) $(input_files) rm -rf $(pg_regress_clean_files) maintainer-clean: distclean diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/expected/.gitignore b/third_party/spanner_pg/src/pl/plpgsql/src/expected/.gitignore deleted file mode 100644 index 13e59187..00000000 --- a/third_party/spanner_pg/src/pl/plpgsql/src/expected/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/plpgsql_copy.out diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_call.out b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_call.out index 25ad35d8..ab16416c 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_call.out +++ b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_call.out @@ -139,6 +139,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/third_party/spanner_pg/src/pl/plpgsql/src/output/plpgsql_copy.source b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_copy.out similarity index 62% rename from third_party/spanner_pg/src/pl/plpgsql/src/output/plpgsql_copy.source rename to third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_copy.out index 86e833d0..bc834be1 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/output/plpgsql_copy.source +++ b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_copy.out @@ -1,3 +1,9 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR +-- set up file names to use +\set srcfilename :abs_srcdir '/data/copy1.data' +\set destfilename :abs_builddir '/results/copy1.data' CREATE TABLE copy1 (a int, b float); -- COPY TO/FROM not authorized from client. DO LANGUAGE plpgsql $$ @@ -30,11 +36,8 @@ ERROR: cannot COPY to/from client in PL/pgSQL CONTEXT: PL/pgSQL function inline_code_block line 3 at EXECUTE -- Valid cases -- COPY FROM -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 FROM '@abs_srcdir@/data/copy1.data'; -END; -$$; +\set dobody 'BEGIN COPY copy1 FROM ' :'srcfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; SELECT * FROM copy1 ORDER BY 1; a | b ---+----- @@ -44,11 +47,9 @@ SELECT * FROM copy1 ORDER BY 1; (3 rows) TRUNCATE copy1; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 FROM ''@abs_srcdir@/data/copy1.data'''; -END; -$$; +\set cmd 'COPY copy1 FROM ' :'srcfilename' +\set dobody 'BEGIN EXECUTE ' :'cmd' '; END' +DO LANGUAGE plpgsql :'dobody'; SELECT * FROM copy1 ORDER BY 1; a | b ---+----- @@ -59,22 +60,14 @@ SELECT * FROM copy1 ORDER BY 1; -- COPY TO -- Copy the data externally once, then process it back to the table. -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 TO '@abs_builddir@/results/copy1.data'; -END; -$$; +\set dobody 'BEGIN COPY copy1 TO ' :'destfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; TRUNCATE copy1; -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 FROM '@abs_builddir@/results/copy1.data'; -END; -$$; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 FROM ''@abs_builddir@/results/copy1.data'''; -END; -$$; +\set dobody 'BEGIN COPY copy1 FROM ' :'destfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; +\set cmd 'COPY copy1 FROM ' :'destfilename' +\set dobody 'BEGIN EXECUTE ' :'cmd' '; END' +DO LANGUAGE plpgsql :'dobody'; SELECT * FROM copy1 ORDER BY 1; a | b ---+----- diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_domain.out b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_domain.out index efc877cd..516c2b9e 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_domain.out +++ b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_domain.out @@ -33,7 +33,7 @@ SELECT * FROM test_assign_booltrue(true, true); SELECT * FROM test_assign_booltrue(false, true); ERROR: value for domain booltrue violates check constraint "booltrue_check" -CONTEXT: PL/pgSQL function test_assign_booltrue(boolean,boolean) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_booltrue(boolean,boolean) line 2 during statement block local variable initialization SELECT * FROM test_assign_booltrue(true, false); ERROR: value for domain booltrue violates check constraint "booltrue_check" CONTEXT: PL/pgSQL function test_assign_booltrue(boolean,boolean) line 4 at assignment @@ -76,7 +76,7 @@ ERROR: value for domain uint2 violates check constraint "uint2_check" CONTEXT: PL/pgSQL function test_assign_uint2(integer,integer) line 4 at assignment SELECT * FROM test_assign_uint2(-100, 50); ERROR: value for domain uint2 violates check constraint "uint2_check" -CONTEXT: PL/pgSQL function test_assign_uint2(integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_uint2(integer,integer) line 2 during statement block local variable initialization SELECT * FROM test_assign_uint2(null, 1); test_assign_uint2 ------------------- @@ -115,7 +115,7 @@ SELECT * FROM test_assign_nnint(10, 20); SELECT * FROM test_assign_nnint(null, 20); ERROR: domain nnint does not allow null values -CONTEXT: PL/pgSQL function test_assign_nnint(integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_nnint(integer,integer) line 2 during statement block local variable initialization SELECT * FROM test_assign_nnint(10, null); ERROR: domain nnint does not allow null values CONTEXT: PL/pgSQL function test_assign_nnint(integer,integer) line 4 at assignment @@ -168,7 +168,7 @@ ERROR: value for domain ordered_pair_domain violates check constraint "ordered_ CONTEXT: PL/pgSQL function test_assign_ordered_pair_domain(integer,integer,integer) line 4 at assignment SELECT * FROM test_assign_ordered_pair_domain(2,1,3); ERROR: value for domain ordered_pair_domain violates check constraint "ordered_pair_domain_check" -CONTEXT: PL/pgSQL function test_assign_ordered_pair_domain(integer,integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_ordered_pair_domain(integer,integer,integer) line 2 during statement block local variable initialization -- -- Arrays of domains -- @@ -276,7 +276,7 @@ ERROR: domain nnint does not allow null values CONTEXT: PL/pgSQL function test_assign_nnint_container(integer,integer,integer) line 4 at assignment SELECT * FROM test_assign_nnint_container(1,null,3); ERROR: domain nnint does not allow null values -CONTEXT: PL/pgSQL function test_assign_nnint_container(integer,integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_nnint_container(integer,integer,integer) line 2 during statement block local variable initialization -- Since core system allows this: SELECT null::nnint_container; nnint_container @@ -356,7 +356,7 @@ ERROR: value for domain ordered_named_pair violates check constraint "ordered_n CONTEXT: PL/pgSQL function test_assign_ordered_named_pair(integer,integer,integer) line 4 at assignment SELECT * FROM test_assign_ordered_named_pair(2,1,3); ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" -CONTEXT: PL/pgSQL function test_assign_ordered_named_pair(integer,integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_ordered_named_pair(integer,integer,integer) line 2 during statement block local variable initialization CREATE FUNCTION build_ordered_named_pairs(i int, j int) RETURNS ordered_named_pair[] AS $$ begin return array[row(i, j), row(i, j+1)]; @@ -388,7 +388,7 @@ SELECT * FROM test_assign_ordered_named_pairs(1,2,3); SELECT * FROM test_assign_ordered_named_pairs(2,1,3); ERROR: value for domain ordered_named_pair violates check constraint "ordered_named_pair_check" -CONTEXT: PL/pgSQL function test_assign_ordered_named_pairs(integer,integer,integer) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function test_assign_ordered_named_pairs(integer,integer,integer) line 2 during statement block local variable initialization SELECT * FROM test_assign_ordered_named_pairs(1,2,0); -- should fail someday test_assign_ordered_named_pairs --------------------------------- diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_misc.out b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_misc.out new file mode 100644 index 00000000..faddba25 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_misc.out @@ -0,0 +1,31 @@ +-- +-- Miscellaneous topics +-- +-- Verify that we can parse new-style CREATE FUNCTION/PROCEDURE +do +$$ + declare procedure int; -- check we still recognize non-keywords as vars + begin + create function test1() returns int + begin atomic + select 2 + 2; + end; + create or replace procedure test2(x int) + begin atomic + select x + 2; + end; + end +$$; +\sf test1 +CREATE OR REPLACE FUNCTION public.test1() + RETURNS integer + LANGUAGE sql +BEGIN ATOMIC + SELECT (2 + 2); +END +\sf test2 +CREATE OR REPLACE PROCEDURE public.test2(IN x integer) + LANGUAGE sql +BEGIN ATOMIC + SELECT (x + 2); +END diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_varprops.out b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_varprops.out index 3801dccc..25115a02 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_varprops.out +++ b/third_party/spanner_pg/src/pl/plpgsql/src/expected/plpgsql_varprops.out @@ -77,7 +77,7 @@ begin end$$; ERROR: division by zero CONTEXT: SQL expression "1/0" -PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x bigint[] := array[1,3,5]; begin @@ -120,7 +120,7 @@ begin raise notice 'x = %', x; end$$; ERROR: null value cannot be assigned to variable "x" declared NOT NULL -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x record not null; -- fail begin @@ -147,7 +147,7 @@ begin raise notice 'x = %', x; end$$; ERROR: null value cannot be assigned to variable "x" declared NOT NULL -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record not null; -- fail begin @@ -174,7 +174,7 @@ begin raise notice 'x = %', x; end$$; ERROR: null value cannot be assigned to variable "x" declared NOT NULL -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization -- Check that variables are reinitialized on block re-entry. do $$ begin @@ -216,14 +216,14 @@ begin raise notice 'x = %', x; end$$; ERROR: domain int_nn does not allow null values -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x int_nn := null; -- fail begin raise notice 'x = %', x; end$$; ERROR: domain int_nn does not allow null values -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x int_nn := 42; begin @@ -239,14 +239,14 @@ begin raise notice 'x = %', x; end$$; ERROR: domain var_record_nn does not allow null values -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record_nn := null; -- fail begin raise notice 'x = %', x; end$$; ERROR: domain var_record_nn does not allow null values -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record_nn := row(1,2); begin @@ -263,21 +263,21 @@ begin raise notice 'x = %', x; end$$; ERROR: value for domain var_record_colnn violates check constraint "var_record_colnn_check" -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record_colnn := null; -- fail begin raise notice 'x = %', x; end$$; ERROR: value for domain var_record_colnn violates check constraint "var_record_colnn_check" -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record_colnn := row(1,null); -- fail begin raise notice 'x = %', x; end$$; ERROR: value for domain var_record_colnn violates check constraint "var_record_colnn_check" -CONTEXT: PL/pgSQL function inline_code_block line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization do $$ declare x var_record_colnn := row(1,2); begin diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/generate-plerrcodes.pl b/third_party/spanner_pg/src/pl/plpgsql/src/generate-plerrcodes.pl index 55ff1693..30e5732b 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/generate-plerrcodes.pl +++ b/third_party/spanner_pg/src/pl/plpgsql/src/generate-plerrcodes.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # # Generate the plerrcodes.h header from errcodes.txt -# Copyright (c) 2000-2021, PostgreSQL Global Development Group +# Copyright (c) 2000-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/input/plpgsql_copy.source b/third_party/spanner_pg/src/pl/plpgsql/src/input/plpgsql_copy.source deleted file mode 100644 index b7bcbb7d..00000000 --- a/third_party/spanner_pg/src/pl/plpgsql/src/input/plpgsql_copy.source +++ /dev/null @@ -1,62 +0,0 @@ -CREATE TABLE copy1 (a int, b float); - --- COPY TO/FROM not authorized from client. -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 TO stdout; -END; -$$; -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 FROM stdin; -END; -$$; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 TO stdout'; -END; -$$; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 FROM stdin'; -END; -$$; - --- Valid cases --- COPY FROM -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 FROM '@abs_srcdir@/data/copy1.data'; -END; -$$; -SELECT * FROM copy1 ORDER BY 1; -TRUNCATE copy1; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 FROM ''@abs_srcdir@/data/copy1.data'''; -END; -$$; -SELECT * FROM copy1 ORDER BY 1; - --- COPY TO --- Copy the data externally once, then process it back to the table. -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 TO '@abs_builddir@/results/copy1.data'; -END; -$$; -TRUNCATE copy1; -DO LANGUAGE plpgsql $$ -BEGIN - COPY copy1 FROM '@abs_builddir@/results/copy1.data'; -END; -$$; -DO LANGUAGE plpgsql $$ -BEGIN - EXECUTE 'COPY copy1 FROM ''@abs_builddir@/results/copy1.data'''; -END; -$$; - -SELECT * FROM copy1 ORDER BY 1; - -DROP TABLE copy1; diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/nls.mk b/third_party/spanner_pg/src/pl/plpgsql/src/nls.mk index da9012aa..611aa8ce 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/nls.mk +++ b/third_party/spanner_pg/src/pl/plpgsql/src/nls.mk @@ -1,6 +1,6 @@ # src/pl/plpgsql/src/nls.mk CATALOG_NAME = plpgsql -AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN 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/third_party/spanner_pg/src/pl/plpgsql/src/pl_comp.c b/third_party/spanner_pg/src/pl/plpgsql/src/pl_comp.c index fdaba544..65f259a9 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_comp.c +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_comp.c @@ -3,7 +3,7 @@ * pl_comp.c - Compiler part of the PL/pgSQL * procedural language * - * 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/third_party/spanner_pg/src/pl/plpgsql/src/pl_exec.c b/third_party/spanner_pg/src/pl/plpgsql/src/pl_exec.c index 4b326932..61fa04b1 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_exec.c +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_exec.c @@ -3,7 +3,7 @@ * pl_exec.c - Executor for the PL/pgSQL * procedural language * - * 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 * * @@ -341,6 +341,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, @@ -639,11 +640,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 */ @@ -1224,6 +1230,20 @@ static void plpgsql_exec_error_callback(void *arg) { PLpgSQL_execstate *estate = (PLpgSQL_execstate *) arg; + int err_lineno; + + /* + * If err_var is set, report the variable's declaration line number. + * Otherwise, if err_stmt is set, report the err_stmt's line number. When + * err_stmt is not set, we're in function entry/exit, or some such place + * not attached to a specific line number. + */ + if (estate->err_var != NULL) + err_lineno = estate->err_var->lineno; + else if (estate->err_stmt != NULL) + err_lineno = estate->err_stmt->lineno; + else + err_lineno = 0; if (estate->err_text != NULL) { @@ -1232,13 +1252,8 @@ plpgsql_exec_error_callback(void *arg) * actually need it. Therefore, places that set up err_text should * use gettext_noop() to ensure the strings get recorded in the * message dictionary. - * - * If both err_text and err_stmt are set, use the err_text as - * description, but report the err_stmt's line number. When err_stmt - * is not set, we're in function entry/exit, or some such place not - * attached to a specific line number. */ - if (estate->err_stmt != NULL) + if (err_lineno > 0) { /* * translator: last %s is a phrase such as "during statement block @@ -1246,7 +1261,7 @@ plpgsql_exec_error_callback(void *arg) */ errcontext("PL/pgSQL function %s line %d %s", estate->func->fn_signature, - estate->err_stmt->lineno, + err_lineno, _(estate->err_text)); } else @@ -1260,12 +1275,12 @@ plpgsql_exec_error_callback(void *arg) _(estate->err_text)); } } - else if (estate->err_stmt != NULL) + else if (estate->err_stmt != NULL && err_lineno > 0) { /* translator: last %s is a plpgsql statement type name */ errcontext("PL/pgSQL function %s line %d at %s", estate->func->fn_signature, - estate->err_stmt->lineno, + err_lineno, plpgsql_stmt_typename(estate->err_stmt)); } else @@ -1653,7 +1668,12 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block) * Note that we currently don't support promise datums within blocks, * only at a function's outermost scope, so we needn't handle those * here. + * + * Since RECFIELD isn't a supported case either, it's okay to cast the + * PLpgSQL_datum to PLpgSQL_variable. */ + estate->err_var = (PLpgSQL_variable *) datum; + switch (datum->dtype) { case PLPGSQL_DTYPE_VAR: @@ -1727,6 +1747,8 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block) } } + estate->err_var = NULL; + if (block->exceptions) { /* @@ -2331,9 +2353,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 { @@ -2915,10 +2941,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 @@ -3639,13 +3669,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 @@ -4056,6 +4090,7 @@ plpgsql_estate_setup(PLpgSQL_execstate *estate, estate->eval_econtext = NULL; estate->err_stmt = NULL; + estate->err_var = NULL; estate->err_text = NULL; estate->plugin_info = NULL; @@ -4066,15 +4101,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); @@ -4183,7 +4221,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); @@ -4205,7 +4243,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; @@ -4265,6 +4304,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; @@ -4446,6 +4486,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; @@ -4671,13 +4712,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; } @@ -4746,10 +4792,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); @@ -8063,7 +8113,7 @@ exec_save_simple_expr(PLpgSQL_expr *expr, CachedPlan *cplan) { /* Extract the single tlist expression */ Assert(list_length(plan->targetlist) == 1); - tle_expr = castNode(TargetEntry, linitial(plan->targetlist))->expr; + tle_expr = linitial_node(TargetEntry, plan->targetlist)->expr; if (IsA(plan, Result)) { @@ -8246,6 +8296,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/third_party/spanner_pg/src/pl/plpgsql/src/pl_funcs.c b/third_party/spanner_pg/src/pl/plpgsql/src/pl_funcs.c index e0863acb..93d9cef0 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_funcs.c +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_funcs.c @@ -3,7 +3,7 @@ * pl_funcs.c - Misc functions for the PL/pgSQL * procedural language * - * 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/third_party/spanner_pg/src/pl/plpgsql/src/pl_gram.y b/third_party/spanner_pg/src/pl/plpgsql/src/pl_gram.y index 0f6a5b30..debbafea 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_gram.y +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_gram.y @@ -3,7 +3,7 @@ * * pl_gram.y - Parser for the PL/pgSQL procedural language * - * 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 * * @@ -79,7 +79,8 @@ static PLpgSQL_expr *read_sql_expression2(int until, int until2, int *endtoken); static PLpgSQL_expr *read_sql_stmt(void); static PLpgSQL_type *read_datatype(int tok); -static PLpgSQL_stmt *make_execsql_stmt(int firsttoken, int location); +static PLpgSQL_stmt *make_execsql_stmt(int firsttoken, int location, + PLword *word); static PLpgSQL_stmt_fetch *read_fetch_direction(void); static void complete_direction(PLpgSQL_stmt_fetch *fetch, bool *check_FROM); @@ -116,55 +117,56 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt); %name-prefix="plpgsql_yy" %locations -%union { - core_YYSTYPE core_yystype; - /* these fields must match core_YYSTYPE: */ - int ival; - char *str; - const char *keyword; - - PLword word; - PLcword cword; - PLwdatum wdatum; - bool boolean; - Oid oid; - struct - { - char *name; - int lineno; - } varname; - struct - { - char *name; - int lineno; - PLpgSQL_datum *scalar; - PLpgSQL_datum *row; - } forvariable; - struct - { - char *label; - int n_initvars; - int *initvarnos; - } declhdr; - struct - { - List *stmts; - char *end_label; - int end_label_location; - } loop_body; - List *list; - PLpgSQL_type *dtype; - PLpgSQL_datum *datum; - PLpgSQL_var *var; - PLpgSQL_expr *expr; - PLpgSQL_stmt *stmt; - PLpgSQL_condition *condition; - PLpgSQL_exception *exception; - PLpgSQL_exception_block *exception_block; - PLpgSQL_nsitem *nsitem; - PLpgSQL_diag_item *diagitem; - PLpgSQL_stmt_fetch *fetch; - PLpgSQL_case_when *casewhen; +%union +{ + core_YYSTYPE core_yystype; + /* these fields must match core_YYSTYPE: */ + int ival; + char *str; + const char *keyword; + + PLword word; + PLcword cword; + PLwdatum wdatum; + bool boolean; + Oid oid; + struct + { + char *name; + int lineno; + } varname; + struct + { + char *name; + int lineno; + PLpgSQL_datum *scalar; + PLpgSQL_datum *row; + } forvariable; + struct + { + char *label; + int n_initvars; + int *initvarnos; + } declhdr; + struct + { + List *stmts; + char *end_label; + int end_label_location; + } loop_body; + List *list; + PLpgSQL_type *dtype; + PLpgSQL_datum *datum; + PLpgSQL_var *var; + PLpgSQL_expr *expr; + PLpgSQL_stmt *stmt; + PLpgSQL_condition *condition; + PLpgSQL_exception *exception; + PLpgSQL_exception_block *exception_block; + PLpgSQL_nsitem *nsitem; + PLpgSQL_diag_item *diagitem; + PLpgSQL_stmt_fetch *fetch; + PLpgSQL_case_when *casewhen; } %type decl_sect @@ -306,6 +308,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 @@ -424,7 +427,7 @@ pl_block : decl_sect K_BEGIN proc_sect exception_sect K_END opt_label check_labels($1.label, $6, @6); plpgsql_ns_pop(); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -537,8 +540,8 @@ decl_statement : decl_varname decl_const decl_datatype decl_collate decl_notnull PLpgSQL_var *new; PLpgSQL_expr *curname_def; char buf[NAMEDATALEN * 2 + 64]; - char *cp1; - char *cp2; + char *cp1; + char *cp2; /* pop local namespace for cursor args */ plpgsql_ns_pop(); @@ -610,8 +613,8 @@ decl_cursor_args : | '(' decl_cursor_arglist ')' { PLpgSQL_row *new; - int i; - ListCell *l; + int i; + ListCell *l; new = palloc0(sizeof(PLpgSQL_row)); new->dtype = PLPGSQL_DTYPE_ROW; @@ -902,7 +905,7 @@ proc_stmt : pl_block ';' stmt_perform : K_PERFORM { PLpgSQL_stmt_perform *new; - int startloc; + int startloc; new = palloc0(sizeof(PLpgSQL_stmt_perform)); new->cmd_type = PLPGSQL_STMT_PERFORM; @@ -931,7 +934,7 @@ stmt_perform : K_PERFORM check_sql_expr(new->expr->query, new->expr->parseMode, startloc + 1); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -950,7 +953,7 @@ stmt_call : K_CALL /* Remember we may need a procedure resource owner */ plpgsql_curr_compile->requires_procedure_resowner = true; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } | K_DO @@ -969,7 +972,7 @@ stmt_call : K_CALL /* Remember we may need a procedure resource owner */ plpgsql_curr_compile->requires_procedure_resowner = true; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -999,7 +1002,7 @@ stmt_assign : T_DATUM check_assignable($1.datum, @1); new = palloc0(sizeof(PLpgSQL_stmt_assign)); new->cmd_type = PLPGSQL_STMT_ASSIGN; - new->lineno = plpgsql_location_to_lineno(@1); + new->lineno = plpgsql_location_to_lineno(@1); new->stmtid = ++plpgsql_curr_compile->nstatements; new->varno = $1.datum->dno; /* Push back the head name to include it in the stmt */ @@ -1009,19 +1012,19 @@ stmt_assign : T_DATUM false, true, true, NULL, NULL); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; stmt_getdiag : K_GET getdiag_area_opt K_DIAGNOSTICS getdiag_list ';' { - PLpgSQL_stmt_getdiag *new; - ListCell *lc; + PLpgSQL_stmt_getdiag *new; + ListCell *lc; new = palloc0(sizeof(PLpgSQL_stmt_getdiag)); new->cmd_type = PLPGSQL_STMT_GETDIAG; - new->lineno = plpgsql_location_to_lineno(@1); - new->stmtid = ++plpgsql_curr_compile->nstatements; + new->lineno = plpgsql_location_to_lineno(@1); + new->stmtid = ++plpgsql_curr_compile->nstatements; new->is_stacked = $2; new->diag_items = $4; @@ -1071,7 +1074,7 @@ stmt_getdiag : K_GET getdiag_area_opt K_DIAGNOSTICS getdiag_list ';' } } - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -1113,7 +1116,7 @@ getdiag_list_item : getdiag_target assign_operator getdiag_item getdiag_item : { - int tok = yylex(); + int tok = yylex(); if (tok_is_keyword(tok, &yylval, K_ROW_COUNT, "row_count")) @@ -1191,15 +1194,15 @@ stmt_if : K_IF expr_until_then proc_sect stmt_elsifs stmt_else K_END K_IF ';' PLpgSQL_stmt_if *new; new = palloc0(sizeof(PLpgSQL_stmt_if)); - new->cmd_type = PLPGSQL_STMT_IF; - new->lineno = plpgsql_location_to_lineno(@1); - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->cond = $2; - new->then_body = $3; + new->cmd_type = PLPGSQL_STMT_IF; + new->lineno = plpgsql_location_to_lineno(@1); + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->cond = $2; + new->then_body = $3; new->elsif_list = $4; - new->else_body = $5; + new->else_body = $5; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -1213,8 +1216,8 @@ stmt_elsifs : new = palloc0(sizeof(PLpgSQL_if_elsif)); new->lineno = plpgsql_location_to_lineno(@2); - new->cond = $3; - new->stmts = $4; + new->cond = $3; + new->stmts = $4; $$ = lappend($1, new); } @@ -1239,7 +1242,7 @@ stmt_case : K_CASE opt_expr_until_when case_when_list opt_case_else K_END K_CAS opt_expr_until_when : { PLpgSQL_expr *expr = NULL; - int tok = yylex(); + int tok = yylex(); if (tok != K_WHEN) { @@ -1266,8 +1269,8 @@ case_when : K_WHEN expr_until_then proc_sect PLpgSQL_case_when *new = palloc(sizeof(PLpgSQL_case_when)); new->lineno = plpgsql_location_to_lineno(@1); - new->expr = $2; - new->stmts = $3; + new->expr = $2; + new->stmts = $3; $$ = new; } ; @@ -1297,15 +1300,15 @@ stmt_loop : opt_loop_label K_LOOP loop_body new = palloc0(sizeof(PLpgSQL_stmt_loop)); new->cmd_type = PLPGSQL_STMT_LOOP; - new->lineno = plpgsql_location_to_lineno(@2); - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->label = $1; - new->body = $3.stmts; + new->lineno = plpgsql_location_to_lineno(@2); + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->label = $1; + new->body = $3.stmts; check_labels($1, $3.end_label, $3.end_label_location); plpgsql_ns_pop(); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -1315,16 +1318,16 @@ stmt_while : opt_loop_label K_WHILE expr_until_loop loop_body new = palloc0(sizeof(PLpgSQL_stmt_while)); new->cmd_type = PLPGSQL_STMT_WHILE; - new->lineno = plpgsql_location_to_lineno(@2); - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->label = $1; - new->cond = $3; - new->body = $4.stmts; + new->lineno = plpgsql_location_to_lineno(@2); + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->label = $1; + new->cond = $3; + new->body = $4.stmts; check_labels($1, $4.end_label, $4.end_label_location); plpgsql_ns_pop(); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -1333,26 +1336,26 @@ stmt_for : opt_loop_label K_FOR for_control loop_body /* This runs after we've scanned the loop body */ if ($3->cmd_type == PLPGSQL_STMT_FORI) { - PLpgSQL_stmt_fori *new; + PLpgSQL_stmt_fori *new; new = (PLpgSQL_stmt_fori *) $3; - new->lineno = plpgsql_location_to_lineno(@2); - new->label = $1; - new->body = $4.stmts; + new->lineno = plpgsql_location_to_lineno(@2); + new->label = $1; + new->body = $4.stmts; $$ = (PLpgSQL_stmt *) new; } else { - PLpgSQL_stmt_forq *new; + PLpgSQL_stmt_forq *new; Assert($3->cmd_type == PLPGSQL_STMT_FORS || $3->cmd_type == PLPGSQL_STMT_FORC || $3->cmd_type == PLPGSQL_STMT_DYNFORS); /* forq is the common supertype of all three */ new = (PLpgSQL_stmt_forq *) $3; - new->lineno = plpgsql_location_to_lineno(@2); - new->label = $1; - new->body = $4.stmts; + new->lineno = plpgsql_location_to_lineno(@2); + new->label = $1; + new->body = $4.stmts; $$ = (PLpgSQL_stmt *) new; } @@ -1370,9 +1373,9 @@ for_control : for_variable K_IN if (tok == K_EXECUTE) { /* EXECUTE means it's a dynamic FOR loop */ - PLpgSQL_stmt_dynfors *new; - PLpgSQL_expr *expr; - int term; + PLpgSQL_stmt_dynfors *new; + PLpgSQL_expr *expr; + int term; expr = read_sql_expression2(K_LOOP, K_USING, "LOOP or USING", @@ -1380,7 +1383,7 @@ for_control : for_variable K_IN new = palloc0(sizeof(PLpgSQL_stmt_dynfors)); new->cmd_type = PLPGSQL_STMT_DYNFORS; - new->stmtid = ++plpgsql_curr_compile->nstatements; + new->stmtid = ++plpgsql_curr_compile->nstatements; if ($1.row) { new->var = (PLpgSQL_variable *) $1.row; @@ -1421,8 +1424,8 @@ for_control : for_variable K_IN ((PLpgSQL_var *) yylval.wdatum.datum)->datatype->typoid == REFCURSOROID) { /* It's FOR var IN cursor */ - PLpgSQL_stmt_forc *new; - PLpgSQL_var *cursor = (PLpgSQL_var *) yylval.wdatum.datum; + PLpgSQL_stmt_forc *new; + PLpgSQL_var *cursor = (PLpgSQL_var *) yylval.wdatum.datum; new = (PLpgSQL_stmt_forc *) palloc0(sizeof(PLpgSQL_stmt_forc)); new->cmd_type = PLPGSQL_STMT_FORC; @@ -1459,9 +1462,9 @@ for_control : for_variable K_IN } else { - PLpgSQL_expr *expr1; - int expr1loc; - bool reverse = false; + PLpgSQL_expr *expr1; + int expr1loc; + bool reverse = false; /* * We have to distinguish between two @@ -1502,10 +1505,10 @@ for_control : for_variable K_IN if (tok == DOT_DOT) { /* Saw "..", so it must be an integer loop */ - PLpgSQL_expr *expr2; - PLpgSQL_expr *expr_by; - PLpgSQL_var *fvar; - PLpgSQL_stmt_fori *new; + PLpgSQL_expr *expr2; + PLpgSQL_expr *expr_by; + PLpgSQL_var *fvar; + PLpgSQL_stmt_fori *new; /* * Relabel first expression as an expression; @@ -1546,12 +1549,12 @@ for_control : for_variable K_IN new = palloc0(sizeof(PLpgSQL_stmt_fori)); new->cmd_type = PLPGSQL_STMT_FORI; - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->var = fvar; - new->reverse = reverse; - new->lower = expr1; - new->upper = expr2; - new->step = expr_by; + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->var = fvar; + new->reverse = reverse; + new->lower = expr1; + new->upper = expr2; + new->step = expr_by; $$ = (PLpgSQL_stmt *) new; } @@ -1560,7 +1563,7 @@ for_control : for_variable K_IN /* * No "..", so it must be a query loop. */ - PLpgSQL_stmt_fors *new; + PLpgSQL_stmt_fors *new; if (reverse) ereport(ERROR, @@ -1722,11 +1725,11 @@ stmt_exit : exit_type opt_label opt_exitcond new = palloc0(sizeof(PLpgSQL_stmt_exit)); new->cmd_type = PLPGSQL_STMT_EXIT; - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->is_exit = $1; - new->lineno = plpgsql_location_to_lineno(@1); - new->label = $2; - new->cond = $3; + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->is_exit = $1; + new->lineno = plpgsql_location_to_lineno(@1); + new->label = $2; + new->cond = $3; if ($2) { @@ -1765,7 +1768,7 @@ stmt_exit : exit_type opt_label opt_exitcond parser_errposition(@1))); } - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -1781,7 +1784,7 @@ exit_type : K_EXIT stmt_return : K_RETURN { - int tok; + int tok; tok = yylex(); if (tok == 0) @@ -1807,19 +1810,19 @@ stmt_return : K_RETURN stmt_raise : K_RAISE { - PLpgSQL_stmt_raise *new; - int tok; + PLpgSQL_stmt_raise *new; + int tok; new = palloc(sizeof(PLpgSQL_stmt_raise)); - new->cmd_type = PLPGSQL_STMT_RAISE; - new->lineno = plpgsql_location_to_lineno(@1); - new->stmtid = ++plpgsql_curr_compile->nstatements; + new->cmd_type = PLPGSQL_STMT_RAISE; + new->lineno = plpgsql_location_to_lineno(@1); + new->stmtid = ++plpgsql_curr_compile->nstatements; new->elog_level = ERROR; /* default */ - new->condname = NULL; - new->message = NULL; - new->params = NIL; - new->options = NIL; + new->condname = NULL; + new->message = NULL; + new->params = NIL; + new->options = NIL; tok = yylex(); if (tok == 0) @@ -1912,7 +1915,7 @@ stmt_raise : K_RAISE K_SQLSTATE, "sqlstate")) { /* next token should be a string literal */ - char *sqlstatestr; + char *sqlstatestr; if (yylex() != SCONST) yyerror("syntax error"); @@ -1946,20 +1949,20 @@ stmt_raise : K_RAISE check_raise_parameters(new); - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; stmt_assert : K_ASSERT { - PLpgSQL_stmt_assert *new; - int tok; + PLpgSQL_stmt_assert *new; + int tok; new = palloc(sizeof(PLpgSQL_stmt_assert)); - new->cmd_type = PLPGSQL_STMT_ASSERT; - new->lineno = plpgsql_location_to_lineno(@1); - new->stmtid = ++plpgsql_curr_compile->nstatements; + new->cmd_type = PLPGSQL_STMT_ASSERT; + new->lineno = plpgsql_location_to_lineno(@1); + new->stmtid = ++plpgsql_curr_compile->nstatements; new->cond = read_sql_expression2(',', ';', ", or ;", @@ -1994,11 +1997,15 @@ loop_body : proc_sect K_END K_LOOP opt_label ';' */ stmt_execsql : K_IMPORT { - $$ = make_execsql_stmt(K_IMPORT, @1); + $$ = make_execsql_stmt(K_IMPORT, @1, NULL); } | K_INSERT { - $$ = make_execsql_stmt(K_INSERT, @1); + $$ = make_execsql_stmt(K_INSERT, @1, NULL); + } + | K_MERGE + { + $$ = make_execsql_stmt(K_MERGE, @1, NULL); } | T_WORD { @@ -2009,7 +2016,7 @@ stmt_execsql : K_IMPORT if (tok == '=' || tok == COLON_EQUALS || tok == '[' || tok == '.') word_is_not_variable(&($1), @1); - $$ = make_execsql_stmt(T_WORD, @1); + $$ = make_execsql_stmt(T_WORD, @1, &($1)); } | T_CWORD { @@ -2020,7 +2027,7 @@ stmt_execsql : K_IMPORT if (tok == '=' || tok == COLON_EQUALS || tok == '[' || tok == '.') cword_is_not_variable(&($1), @1); - $$ = make_execsql_stmt(T_CWORD, @1); + $$ = make_execsql_stmt(T_CWORD, @1, NULL); } ; @@ -2028,7 +2035,7 @@ stmt_dynexecute : K_EXECUTE { PLpgSQL_stmt_dynexecute *new; PLpgSQL_expr *expr; - int endtoken; + int endtoken; expr = read_sql_construct(K_INTO, K_USING, ';', "INTO or USING or ;", @@ -2083,7 +2090,7 @@ stmt_dynexecute : K_EXECUTE yyerror("syntax error"); } - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -2091,7 +2098,7 @@ stmt_dynexecute : K_EXECUTE stmt_open : K_OPEN cursor_variable { PLpgSQL_stmt_open *new; - int tok; + int tok; new = palloc0(sizeof(PLpgSQL_stmt_open)); new->cmd_type = PLPGSQL_STMT_OPEN; @@ -2128,7 +2135,7 @@ stmt_open : K_OPEN cursor_variable tok = yylex(); if (tok == K_EXECUTE) { - int endtoken; + int endtoken; new->dynquery = read_sql_expression2(K_USING, ';', @@ -2162,7 +2169,7 @@ stmt_open : K_OPEN cursor_variable new->argquery = read_cursor_args($2, ';'); } - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -2192,7 +2199,7 @@ stmt_fetch : K_FETCH opt_fetch_direction cursor_variable K_INTO fetch->curvar = $3->dno; fetch->is_move = false; - $$ = (PLpgSQL_stmt *)fetch; + $$ = (PLpgSQL_stmt *) fetch; } ; @@ -2201,10 +2208,10 @@ stmt_move : K_MOVE opt_fetch_direction cursor_variable ';' PLpgSQL_stmt_fetch *fetch = $2; fetch->lineno = plpgsql_location_to_lineno(@1); - fetch->curvar = $3->dno; - fetch->is_move = true; + fetch->curvar = $3->dno; + fetch->is_move = true; - $$ = (PLpgSQL_stmt *)fetch; + $$ = (PLpgSQL_stmt *) fetch; } ; @@ -2224,7 +2231,7 @@ stmt_close : K_CLOSE cursor_variable ';' new->stmtid = ++plpgsql_curr_compile->nstatements; new->curvar = $2->dno; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -2245,7 +2252,7 @@ stmt_commit : K_COMMIT opt_transaction_chain ';' new->stmtid = ++plpgsql_curr_compile->nstatements; new->chain = $2; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -2259,7 +2266,7 @@ stmt_rollback : K_ROLLBACK opt_transaction_chain ';' new->stmtid = ++plpgsql_curr_compile->nstatements; new->chain = $2; - $$ = (PLpgSQL_stmt *)new; + $$ = (PLpgSQL_stmt *) new; } ; @@ -2537,6 +2544,7 @@ unreserved_keyword : | K_IS | K_LAST | K_LOG + | K_MERGE | K_MESSAGE | K_MESSAGE_TEXT | K_MOVE @@ -2704,12 +2712,12 @@ read_sql_construct(int until, int *startloc, int *endtoken) { - int tok; - StringInfoData ds; - IdentifierLookup save_IdentifierLookup; - int startlocation = -1; - int parenlevel = 0; - PLpgSQL_expr *expr; + int tok; + StringInfoData ds; + IdentifierLookup save_IdentifierLookup; + int startlocation = -1; + int parenlevel = 0; + PLpgSQL_expr *expr; initStringInfo(&ds); @@ -2786,12 +2794,12 @@ read_sql_construct(int until, } expr = palloc0(sizeof(PLpgSQL_expr)); - expr->query = pstrdup(ds.data); - expr->parseMode = parsemode; - expr->plan = NULL; - expr->paramnos = NULL; - expr->target_param = -1; - expr->ns = plpgsql_ns_top(); + expr->query = pstrdup(ds.data); + expr->parseMode = parsemode; + expr->plan = NULL; + expr->paramnos = NULL; + expr->target_param = -1; + expr->ns = plpgsql_ns_top(); pfree(ds.data); if (valid_sql) @@ -2803,11 +2811,11 @@ read_sql_construct(int until, static PLpgSQL_type * read_datatype(int tok) { - StringInfoData ds; - char *type_name; - int startlocation; - PLpgSQL_type *result; - int parenlevel = 0; + StringInfoData ds; + char *type_name; + int startlocation; + PLpgSQL_type *result; + int parenlevel = 0; /* Should only be called while parsing DECLARE sections */ Assert(plpgsql_IdentifierLookup == IDENTIFIER_LOOKUP_DECLARE); @@ -2824,7 +2832,7 @@ read_datatype(int tok) */ if (tok == T_WORD) { - char *dtname = yylval.word.ident; + char *dtname = yylval.word.ident; tok = yylex(); if (tok == '%') @@ -2848,7 +2856,7 @@ read_datatype(int tok) } else if (plpgsql_token_is_unreserved_keyword(tok)) { - char *dtname = pstrdup(yylval.keyword); + char *dtname = pstrdup(yylval.keyword); tok = yylex(); if (tok == '%') @@ -2872,7 +2880,7 @@ read_datatype(int tok) } else if (tok == T_CWORD) { - List *dtnames = yylval.cword.idents; + List *dtnames = yylval.cword.idents; tok = yylex(); if (tok == '%') @@ -2936,23 +2944,35 @@ read_datatype(int tok) return result; } +/* + * Read a generic SQL statement. We have already read its first token; + * firsttoken is that token's code and location its starting location. + * If firsttoken == T_WORD, pass its yylval value as "word", else pass NULL. + */ static PLpgSQL_stmt * -make_execsql_stmt(int firsttoken, int location) +make_execsql_stmt(int firsttoken, int location, PLword *word) { - StringInfoData ds; - IdentifierLookup save_IdentifierLookup; + StringInfoData ds; + IdentifierLookup save_IdentifierLookup; PLpgSQL_stmt_execsql *execsql; - PLpgSQL_expr *expr; - PLpgSQL_variable *target = NULL; - int tok; - int prev_tok; - bool have_into = false; - bool have_strict = false; - int into_start_loc = -1; - int into_end_loc = -1; + PLpgSQL_expr *expr; + PLpgSQL_variable *target = NULL; + int tok; + int prev_tok; + bool have_into = false; + bool have_strict = false; + int into_start_loc = -1; + int into_end_loc = -1; + int paren_depth = 0; + int begin_depth = 0; + bool in_routine_definition = false; + int token_count = 0; + char tokens[4]; /* records the first few tokens */ initStringInfo(&ds); + memset(tokens, 0, sizeof(tokens)); + /* special lookup mode for identifiers within the SQL text */ save_IdentifierLookup = plpgsql_IdentifierLookup; plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR; @@ -2961,6 +2981,12 @@ make_execsql_stmt(int firsttoken, int location) * Scan to the end of the SQL command. Identify any INTO-variables * clause lurking within it, and parse that via read_into_target(). * + * The end of the statement is defined by a semicolon ... except that + * semicolons within parentheses or BEGIN/END blocks don't terminate a + * statement. We follow psql's lead in not recognizing BEGIN/END except + * after CREATE [OR REPLACE] {FUNCTION|PROCEDURE}. END can also appear + * within a CASE construct, so we treat CASE/END like BEGIN/END. + * * Because INTO is sometimes used in the main SQL grammar, we have to be * careful not to take any such usage of INTO as a PL/pgSQL INTO clause. * There are currently three such cases: @@ -2986,13 +3012,50 @@ make_execsql_stmt(int firsttoken, int location) * break this logic again ... beware! */ tok = firsttoken; + if (tok == T_WORD && strcmp(word->ident, "create") == 0) + tokens[token_count] = 'c'; + token_count++; + for (;;) { prev_tok = tok; tok = yylex(); if (have_into && into_end_loc < 0) into_end_loc = yylloc; /* token after the INTO part */ - if (tok == ';') + /* Detect CREATE [OR REPLACE] {FUNCTION|PROCEDURE} */ + if (tokens[0] == 'c' && token_count < sizeof(tokens)) + { + if (tok == K_OR) + tokens[token_count] = 'o'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "replace") == 0) + tokens[token_count] = 'r'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "function") == 0) + tokens[token_count] = 'f'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "procedure") == 0) + tokens[token_count] = 'f'; /* treat same as "function" */ + if (tokens[1] == 'f' || + (tokens[1] == 'o' && tokens[2] == 'r' && tokens[3] == 'f')) + in_routine_definition = true; + token_count++; + } + /* Track paren nesting (needed for CREATE RULE syntax) */ + if (tok == '(') + paren_depth++; + else if (tok == ')' && paren_depth > 0) + paren_depth--; + /* We need track BEGIN/END nesting only in a routine definition */ + if (in_routine_definition && paren_depth == 0) + { + if (tok == K_BEGIN || tok == K_CASE) + begin_depth++; + else if (tok == K_END && begin_depth > 0) + begin_depth--; + } + /* Command-ending semicolon? */ + if (tok == ';' && paren_depth == 0 && begin_depth == 0) break; if (tok == 0) yyerror("unexpected end of function definition"); @@ -3000,6 +3063,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) @@ -3033,24 +3098,24 @@ make_execsql_stmt(int firsttoken, int location) ds.data[--ds.len] = '\0'; expr = palloc0(sizeof(PLpgSQL_expr)); - expr->query = pstrdup(ds.data); - expr->parseMode = RAW_PARSE_DEFAULT; - expr->plan = NULL; - expr->paramnos = NULL; - expr->target_param = -1; - expr->ns = plpgsql_ns_top(); + expr->query = pstrdup(ds.data); + expr->parseMode = RAW_PARSE_DEFAULT; + expr->plan = NULL; + expr->paramnos = NULL; + expr->target_param = -1; + expr->ns = plpgsql_ns_top(); pfree(ds.data); check_sql_expr(expr->query, expr->parseMode, location); execsql = palloc0(sizeof(PLpgSQL_stmt_execsql)); execsql->cmd_type = PLPGSQL_STMT_EXECSQL; - execsql->lineno = plpgsql_location_to_lineno(location); - execsql->stmtid = ++plpgsql_curr_compile->nstatements; + execsql->lineno = plpgsql_location_to_lineno(location); + execsql->stmtid = ++plpgsql_curr_compile->nstatements; execsql->sqlstmt = expr; - execsql->into = have_into; - execsql->strict = have_strict; - execsql->target = target; + execsql->into = have_into; + execsql->strict = have_strict; + execsql->target = target; return (PLpgSQL_stmt *) execsql; } @@ -3072,11 +3137,11 @@ read_fetch_direction(void) */ fetch = (PLpgSQL_stmt_fetch *) palloc0(sizeof(PLpgSQL_stmt_fetch)); fetch->cmd_type = PLPGSQL_STMT_FETCH; - fetch->stmtid = ++plpgsql_curr_compile->nstatements; + fetch->stmtid = ++plpgsql_curr_compile->nstatements; /* set direction defaults: */ fetch->direction = FETCH_FORWARD; - fetch->how_many = 1; - fetch->expr = NULL; + fetch->how_many = 1; + fetch->expr = NULL; fetch->returns_multiple_rows = false; tok = yylex(); @@ -3224,9 +3289,9 @@ make_return_stmt(int location) new = palloc0(sizeof(PLpgSQL_stmt_return)); new->cmd_type = PLPGSQL_STMT_RETURN; - new->lineno = plpgsql_location_to_lineno(location); - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->expr = NULL; + new->lineno = plpgsql_location_to_lineno(location); + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->expr = NULL; new->retvarno = -1; if (plpgsql_curr_compile->fn_retset) @@ -3269,7 +3334,7 @@ make_return_stmt(int location) * We want to special-case simple variable references for efficiency. * So peek ahead to see if that's what we have. */ - int tok = yylex(); + int tok = yylex(); if (tok == T_DATUM && plpgsql_peek() == ';' && (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_VAR || @@ -3311,11 +3376,11 @@ make_return_next_stmt(int location) parser_errposition(location))); new = palloc0(sizeof(PLpgSQL_stmt_return_next)); - new->cmd_type = PLPGSQL_STMT_RETURN_NEXT; - new->lineno = plpgsql_location_to_lineno(location); - new->stmtid = ++plpgsql_curr_compile->nstatements; - new->expr = NULL; - new->retvarno = -1; + new->cmd_type = PLPGSQL_STMT_RETURN_NEXT; + new->lineno = plpgsql_location_to_lineno(location); + new->stmtid = ++plpgsql_curr_compile->nstatements; + new->expr = NULL; + new->retvarno = -1; if (plpgsql_curr_compile->out_param_varno >= 0) { @@ -3332,7 +3397,7 @@ make_return_next_stmt(int location) * We want to special-case simple variable references for efficiency. * So peek ahead to see if that's what we have. */ - int tok = yylex(); + int tok = yylex(); if (tok == T_DATUM && plpgsql_peek() == ';' && (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_VAR || @@ -3389,7 +3454,7 @@ make_return_query_stmt(int location) else { /* dynamic SQL */ - int term; + int term; new->dynquery = read_sql_expression2(';', K_USING, "; or USING", &term); @@ -3517,16 +3582,16 @@ read_into_scalar_list(char *initial_name, PLpgSQL_datum *initial_datum, int initial_location) { - int nfields; - char *fieldnames[1024]; - int varnos[1024]; - PLpgSQL_row *row; - int tok; + int nfields; + char *fieldnames[1024]; + int varnos[1024]; + PLpgSQL_row *row; + int tok; check_assignable(initial_datum, initial_location); fieldnames[0] = initial_name; - varnos[0] = initial_datum->dno; - nfields = 1; + varnos[0] = initial_datum->dno; + nfields = 1; while ((tok = yylex()) == ',') { @@ -3579,7 +3644,7 @@ read_into_scalar_list(char *initial_name, row->varnos[nfields] = varnos[nfields]; } - plpgsql_adddatum((PLpgSQL_datum *)row); + plpgsql_adddatum((PLpgSQL_datum *) row); return row; } @@ -3596,7 +3661,7 @@ make_scalar_list1(char *initial_name, PLpgSQL_datum *initial_datum, int lineno, int location) { - PLpgSQL_row *row; + PLpgSQL_row *row; check_assignable(initial_datum, location); @@ -3611,7 +3676,7 @@ make_scalar_list1(char *initial_name, row->fieldnames[0] = initial_name; row->varnos[0] = initial_datum->dno; - plpgsql_adddatum((PLpgSQL_datum *)row); + plpgsql_adddatum((PLpgSQL_datum *) row); return row; } @@ -3683,7 +3748,7 @@ plpgsql_sql_error_callback(void *arg) errpos = geterrposition(); if (errpos > 0) { - int myerrpos = getinternalerrposition(); + int myerrpos = getinternalerrposition(); if (myerrpos > 0) /* safety check */ internalerrposition(myerrpos + errpos - 1); @@ -3810,11 +3875,11 @@ read_cursor_args(PLpgSQL_var *cursor, int until) for (argc = 0; argc < row->nfields; argc++) { PLpgSQL_expr *item; - int endtoken; - int argpos; - int tok1, - tok2; - int arglocation; + int endtoken; + int argpos; + int tok1, + tok2; + int arglocation; /* Check if it's a named parameter: "param := value" */ plpgsql_peek2(&tok1, &tok2, &arglocation, NULL); @@ -3915,12 +3980,12 @@ read_cursor_args(PLpgSQL_var *cursor, int until) } expr = palloc0(sizeof(PLpgSQL_expr)); - expr->query = pstrdup(ds.data); - expr->parseMode = RAW_PARSE_PLPGSQL_EXPR; - expr->plan = NULL; - expr->paramnos = NULL; - expr->target_param = -1; - expr->ns = plpgsql_ns_top(); + expr->query = pstrdup(ds.data); + expr->parseMode = RAW_PARSE_PLPGSQL_EXPR; + expr->plan = NULL; + expr->paramnos = NULL; + expr->target_param = -1; + expr->ns = plpgsql_ns_top(); pfree(ds.data); /* Next we'd better find the until token */ @@ -3942,7 +4007,7 @@ read_raise_options(void) for (;;) { PLpgSQL_raise_option *opt; - int tok; + int tok; if ((tok = yylex()) == 0) yyerror("unexpected end of function definition"); @@ -4036,7 +4101,7 @@ static PLpgSQL_stmt * make_case(int location, PLpgSQL_expr *t_expr, List *case_when_list, List *else_stmts) { - PLpgSQL_stmt_case *new; + PLpgSQL_stmt_case *new; new = palloc(sizeof(PLpgSQL_stmt_case)); new->cmd_type = PLPGSQL_STMT_CASE; @@ -4062,9 +4127,9 @@ make_case(int location, PLpgSQL_expr *t_expr, */ if (t_expr) { - char varname[32]; + char varname[32]; PLpgSQL_var *t_var; - ListCell *l; + ListCell *l; /* use a name unlikely to collide with any user names */ snprintf(varname, sizeof(varname), "__Case__Variable_%d__", @@ -4087,7 +4152,7 @@ make_case(int location, PLpgSQL_expr *t_expr, { PLpgSQL_case_when *cwt = (PLpgSQL_case_when *) lfirst(l); PLpgSQL_expr *expr = cwt->expr; - StringInfoData ds; + StringInfoData ds; /* We expect to have expressions not statements */ Assert(expr->parseMode == RAW_PARSE_PLPGSQL_EXPR); diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/pl_handler.c b/third_party/spanner_pg/src/pl/plpgsql/src/pl_handler.c index 00aace2f..190d286f 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_handler.c +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_handler.c @@ -3,7 +3,7 @@ * pl_handler.c - Handler for the PL/pgSQL * procedural language * - * 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 * * @@ -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/third_party/spanner_pg/src/pl/plpgsql/src/pl_reserved_kwlist.h b/third_party/spanner_pg/src/pl/plpgsql/src/pl_reserved_kwlist.h index daf835e6..9043fbdd 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_reserved_kwlist.h +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_reserved_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/pl/plpgsql/src/pl_reserved_kwlist.h diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/pl_scanner.c b/third_party/spanner_pg/src/pl/plpgsql/src/pl_scanner.c index e4c7a91a..aa1beb6a 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_scanner.c +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_scanner.c @@ -4,7 +4,7 @@ * lexical scanning for PL/pgSQL * * - * 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/third_party/spanner_pg/src/pl/plpgsql/src/pl_unreserved_kwlist.h b/third_party/spanner_pg/src/pl/plpgsql/src/pl_unreserved_kwlist.h index fcb34f7c..ee2be1b2 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/pl_unreserved_kwlist.h +++ b/third_party/spanner_pg/src/pl/plpgsql/src/pl_unreserved_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * 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/third_party/spanner_pg/src/pl/plpgsql/src/plpgsql.h b/third_party/spanner_pg/src/pl/plpgsql/src/plpgsql.h index 1d0f673e..2b6cda69 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/plpgsql.h +++ b/third_party/spanner_pg/src/pl/plpgsql/src/plpgsql.h @@ -3,7 +3,7 @@ * plpgsql.h - Definitions for the PL/pgSQL * procedural language * - * 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 * * @@ -893,10 +893,10 @@ 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 */ - bool mod_stmt_set; /* is mod_stmt valid yet? */ PLpgSQL_variable *target; /* INTO target (record or row) */ } PLpgSQL_stmt_execsql; @@ -1088,6 +1088,7 @@ typedef struct PLpgSQL_execstate /* status information for error context reporting */ PLpgSQL_stmt *err_stmt; /* current stmt */ + PLpgSQL_variable *err_var; /* current variable, if in a DECLARE section */ const char *err_text; /* additional state info */ void *plugin_info; /* reserved for use by optional plugin */ @@ -1099,8 +1100,6 @@ typedef struct PLpgSQL_execstate * variable "PLpgSQL_plugin" and set it to point to a PLpgSQL_plugin struct. * Typically the struct could just be static data in the plugin library. * We expect that a plugin would do this at library load time (_PG_init()). - * It must also be careful to set the rendezvous variable back to NULL - * if it is unloaded (_PG_fini()). * * This structure is basically a collection of function pointers --- at * various interesting points in pl_exec.c, we call these functions @@ -1119,9 +1118,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 { @@ -1134,8 +1141,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; /* diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/de.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/de.po index 3f7f06d8..16a0cfa6 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/de.po +++ b/third_party/spanner_pg/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-09-16 11:39+0000\n" -"PO-Revision-Date: 2021-09-16 14: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" @@ -73,8 +73,8 @@ msgstr "Spaltenverweis »%s« ist nicht eindeutig" 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:1324 pl_exec.c:5202 pl_exec.c:5375 pl_exec.c:5462 pl_exec.c:5553 -#: pl_exec.c:6574 +#: 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«" @@ -99,7 +99,7 @@ msgstr "Variable »%s« hat Pseudotyp %s" msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" -#: pl_comp.c:2204 pl_exec.c:6875 +#: pl_comp.c:2204 pl_exec.c:6889 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" @@ -114,7 +114,7 @@ msgstr "unbekannte Ausnahmebedingung »%s«" 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:500 pl_exec.c:934 pl_exec.c:1169 +#: 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" @@ -122,7 +122,7 @@ msgstr "bei der Initialisierung des Ausführungszustandes" msgid "while storing call arguments into local variables" msgstr "beim Abspeichern der Aufrufargumente in lokale Variablen" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "beim Eintritts in die Funktion" @@ -135,37 +135,42 @@ msgstr "Kontrollfluss erreichte das Ende der Funktion ohne RETURN" 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:636 pl_exec.c:3649 +#: 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:762 pl_exec.c:1033 pl_exec.c:1191 +#: 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:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: 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:1038 +#: pl_exec.c:1043 #, c-format msgid "trigger procedure cannot return a set" msgstr "Triggerprozedur kann keine Ergebnismenge zurückgeben" -#: pl_exec.c:1077 pl_exec.c:1105 +#: 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:1237 +#: pl_exec.c:1251 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-Funktion %s Zeile %d %s" @@ -173,332 +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:1248 +#: 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:1256 +#: 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:1262 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-Funktion %s" -#: pl_exec.c:1633 +#: pl_exec.c:1647 msgid "during statement block local variable initialization" msgstr "bei der Initialisierung der lokalen Variablen des Anweisungsblocks" -#: pl_exec.c:1731 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "beim Eintreten in den Anweisungsblock" -#: pl_exec.c:1763 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "beim Verlassen des Anweisungsblocks" -#: pl_exec.c:1801 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "beim Aufräumen der Ausnahme" -#: pl_exec.c:2334 +#: 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:2339 +#: 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:2373 +#: 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:2573 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "Fall nicht gefunden" -#: pl_exec.c:2574 +#: pl_exec.c:2595 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Der CASE-Anweisung fehlt ein ELSE-Teil." -#: pl_exec.c:2667 +#: 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:2683 +#: 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:2701 +#: 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:2707 +#: 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:2841 pl_exec.c:4638 +#: 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:2864 pl_exec.c:4703 +#: 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:2883 pl_exec.c:4722 +#: pl_exec.c:2904 pl_exec.c:4742 #, c-format msgid "arguments required for cursor" msgstr "Cursor benötigt Argumente" -#: pl_exec.c:2970 +#: pl_exec.c:2991 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-Ausdruck darf nicht NULL sein" -#: pl_exec.c:2985 +#: 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:3002 +#: 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:3029 +#: 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:3033 +#: 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:3195 pl_exec.c:3252 pl_exec.c:3427 +#: 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:3291 pl_gram.y:3310 +#: 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:3332 pl_exec.c:3464 +#: 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:3370 pl_exec.c:3391 +#: 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:3483 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT muss einen Parameter haben" -#: pl_exec.c:3511 pl_gram.y:3374 +#: 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:3529 +#: 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:3568 pl_exec.c:5773 -#, c-format -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:3569 pl_exec.c:3574 pl_exec.c:5661 pl_exec.c:5673 pl_exec.c:5698 -#: pl_exec.c:5774 pl_exec.c:5779 -#, c-format -msgid "query: %s" -msgstr "Anfrage: %s" - -#: pl_exec.c:3573 pl_exec.c:5778 -#, c-format -msgid "query is not a SELECT" -msgstr "Anfrage ist kein SELECT" - -#: pl_exec.c:3597 pl_exec.c:4416 pl_exec.c:8616 +#: 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:3677 pl_exec.c:3815 +#: 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:3711 +#: 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:3805 +#: 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:3875 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3930 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "Assertion fehlgeschlagen" -#: pl_exec.c:4289 pl_exec.c:4477 +#: 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:4295 +#: pl_exec.c:4314 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "nicht unterstützter Transaktionsbefehl in PL/pgSQL" -#: pl_exec.c:4318 pl_exec.c:4506 +#: 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:4341 pl_exec.c:4529 +#: 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:4363 pl_exec.c:4548 pl_exec.c:5697 +#: 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:4365 +#: 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:4381 +#: 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:4382 +#: 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:4469 +#: 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:4470 +#: 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:4483 +#: pl_exec.c:4503 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE von Transaktionsbefehlen ist nicht implementiert" -#: pl_exec.c:4784 pl_exec.c:4872 +#: 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:4795 pl_exec.c:4883 +#: pl_exec.c:4815 pl_exec.c:4903 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" -#: pl_exec.c:4808 +#: pl_exec.c:4828 #, c-format msgid "relative or absolute cursor position is null" msgstr "relative oder absolute Cursorposition ist NULL" -#: pl_exec.c:5052 pl_exec.c:5147 +#: 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:5128 +#: 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:5160 +#: 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:5211 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kann Systemspalte »%s« keinen Wert zuweisen" -#: pl_exec.c:5660 +#: pl_exec.c:5674 #, c-format msgid "query did not return data" msgstr "Anfrage hat keine Daten zurückgegeben" -#: pl_exec.c:5669 +#: 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 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:6588 pl_exec.c:6628 pl_exec.c:6668 +#: pl_exec.c:5787 +#, c-format +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:5792 +#, c-format +msgid "query is not a SELECT" +msgstr "Anfrage ist kein SELECT" + +#: 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:7079 pl_exec.c:7113 pl_exec.c:7187 pl_exec.c:7213 +#: 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:7081 pl_exec.c:7115 pl_exec.c:7189 pl_exec.c:7215 +#: 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:7085 pl_exec.c:7119 pl_exec.c:7193 pl_exec.c:7219 +#: 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:7606 +#: pl_exec.c:7620 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "Record »%s« hat noch keinen Wert" -#: pl_exec.c:7607 +#: 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." @@ -535,280 +539,280 @@ msgstr "SQL-Anweisung" msgid "FOR over EXECUTE statement" msgstr "FOR-über-EXECUTE-Anweisung" -#: pl_gram.y:485 +#: 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:505 +#: 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:524 +#: 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:672 pl_gram.y:687 pl_gram.y:713 +#: 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:731 pl_gram.y:759 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "doppelte Deklaration" -#: pl_gram.y:742 pl_gram.y:770 +#: 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:1042 +#: 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:1060 +#: 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:1155 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "unbekanntes Element in GET DIAGNOSTICS" -#: pl_gram.y:1171 pl_gram.y:3549 +#: 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:1401 pl_gram.y:1595 +#: 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:1436 +#: 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:1443 +#: 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:1534 +#: 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:1568 +#: 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:1698 +#: 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:1740 +#: 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:1748 +#: 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:1763 +#: 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:1764 +#: 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: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 +#: 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: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 +#: 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:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: 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:2126 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "Syntaxfehler, »FOR« erwartet" -#: pl_gram.y:2187 +#: 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:2284 +#: 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:2290 +#: 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:2620 pl_gram.y:2631 +#: 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:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "Klammern passen nicht" -#: pl_gram.y:2751 +#: 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:2757 +#: 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:2774 +#: pl_gram.y:2780 msgid "missing expression" msgstr "Ausdruck fehlt" -#: pl_gram.y:2776 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "SQL-Anweisung fehlt" -#: pl_gram.y:2905 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "unvollständige Datentypdeklaration" -#: pl_gram.y:2928 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "fehlende Datentypdeklaration" -#: pl_gram.y:3006 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO mehr als einmal angegeben" -#: pl_gram.y:3176 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "FROM oder IN erwartet" -#: pl_gram.y:3237 +#: 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:3238 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Verwenden Sie RETURN NEXT oder RETURN QUERY." -#: pl_gram.y:3248 +#: 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:3253 +#: 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:3262 +#: 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:3325 +#: 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:3433 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "Variable »%s« ist als CONSTANT deklariert" -#: pl_gram.y:3491 +#: 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:3537 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "zu viele INTO-Variablen angegeben" -#: pl_gram.y:3745 +#: 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:3752 +#: 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:3786 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "Cursor »%s« hat keine Argumente" -#: pl_gram.y:3800 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "Cursor »%s« hat Argumente" -#: pl_gram.y:3842 +#: 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:3862 +#: 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:3887 +#: 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:3894 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "zu viele Argumente für Cursor »%s«" -#: pl_gram.y:3980 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "unbekannte Option für RAISE-Anweisung" -#: pl_gram.y:3984 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "Syntaxfehler, »=« erwartet" -#: pl_gram.y:4025 +#: pl_gram.y:4033 #, c-format msgid "too many parameters specified for RAISE" msgstr "zu viele Parameter für RAISE angegeben" -#: pl_gram.y:4029 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "zu wenige Parameter für RAISE angegeben" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/el.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/el.po index bafc55b7..e89a0c40 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/el.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/el.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 14\n" +"Project-Id-Version: plpgsql (PostgreSQL) 15\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" +"POT-Creation-Date: 2023-04-14 09:09+0000\n" +"PO-Revision-Date: 2023-04-14 15:03+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,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 3.0\n" +"X-Generator: Poedit 3.2.2\n" #: pl_comp.c:438 pl_handler.c:496 #, c-format @@ -75,8 +75,8 @@ msgstr "αναφορά στήλης «%s» είναι αμφίσημη" 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 +#: 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»" @@ -101,7 +101,7 @@ msgstr "η μεταβλητή «%s» έχει ψευδο-τύπο %s" msgid "type \"%s\" is only a shell" msgstr "τύπος «%s» είναι μόνο ένα κέλυφος" -#: pl_comp.c:2204 pl_exec.c:6863 +#: pl_comp.c:2204 pl_exec.c:6907 #, c-format msgid "type %s is not composite" msgstr "τύπος %s δεν είναι συνθετικός" @@ -111,63 +111,68 @@ msgstr "τύπος %s δεν είναι συνθετικός" msgid "unrecognized exception condition \"%s\"" msgstr "μη αναγνωρίσιμη συνθήκη εξαίρεσης «%s»" -#: pl_comp.c:2526 +#: pl_comp.c:2534 #, 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 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "κατά την αρχικοποίηση της κατάστασης εκτέλεσης" -#: pl_exec.c:506 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "κατά την αποθήκευση παραμέτρων κλήσης σε τοπικές μεταβλητές" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "κατά τη διάρκεια εισόδου συνάρτησης" -#: pl_exec.c:617 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "ο έλεγχος έφθασε στο τέλος συνάρτησης χωρίς RETURN" -#: pl_exec.c:623 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "κατά τη διάρκεια cast της τιμής επιστροφής στον τύπο επιστροφής της συνάρτησης" -#: pl_exec.c:636 pl_exec.c:3637 +#: pl_exec.c:636 pl_exec.c:3665 #, 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 +#: 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:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "ο έλεγχος έφτασε στο τέλος της διαδικασίας εναύσματος χωρίς RETURN" -#: pl_exec.c:1038 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "διεργασία εναύσματος δεν δύναται να επιστρέψει ένα σύνολο" -#: pl_exec.c:1077 pl_exec.c:1105 +#: 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:1237 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "συνάρτηση PL/pgSQL %s γραμμή %d %s" @@ -175,335 +180,340 @@ 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 +#: 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:1256 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "συνάρτηση PL/pgSQL %s γραμμή %d στο %s" -#: pl_exec.c:1262 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "συνάρτηση PL/pgSQL «%s»" -#: pl_exec.c:1633 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "κατά τη διάρκεια μπλοκ δήλωσης τοπικής αρχικοποίησης μεταβλητής" -#: pl_exec.c:1731 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "κατά τη διάρκεια εισόδου μπλοκ δήλωσης" -#: pl_exec.c:1763 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "κατά τη διάρκεια εξόδου μπλοκ δήλωσης" -#: pl_exec.c:1801 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "κατά τη διάρκεια καθαρισμού εξαίρεσης" -#: pl_exec.c:2334 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "η παράμετρος διαδικασίας «%s» είναι παράμετρος εξόδου, αλλά το αντίστοιχο όρισμα δεν είναι εγγράψιμο" -#: pl_exec.c:2339 +#: pl_exec.c:2365 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "η παράμετρος διαδικασίας %d είναι παράμετρος εξόδου, αλλά το αντίστοιχο όρισμα δεν είναι εγγράψιμο" -#: pl_exec.c:2373 +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS δεν είναι δυνατό να χρησιμοποιηθεί εκτός ενός χειριστή εξαιρέσεων" -#: pl_exec.c:2573 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "υπόθεση δεν βρέθηκε" -#: pl_exec.c:2574 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Η δήλωση CASE δεν περιέχει τμήμα ELSE." -#: pl_exec.c:2667 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "το κατώτατο όριο του βρόχου FOR δεν μπορεί να είναι null" -#: pl_exec.c:2683 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "το ανώνοτατο όριο του βρόχου FOR δεν μπορεί να είναι null" -#: pl_exec.c:2701 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "η τιμή BY του βρόχου FOR δεν μπορεί να είναι null" -#: pl_exec.c:2707 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "η τιμή BY του βρόχου FOR πρέπει να είναι μεγαλύτερη του μηδενός" -#: pl_exec.c:2841 pl_exec.c:4626 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "ο δρομέας «%s» βρίσκεται ήδη σε χρήση" -#: pl_exec.c:2864 pl_exec.c:4691 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "δίνονται ορίσματα σε δρομέα χωρίς ορίσματα" -#: pl_exec.c:2883 pl_exec.c:4710 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "επιβάλλονται ορίσματα για τον δρομέα" -#: pl_exec.c:2970 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "η έκφραση FOREACH πρέπει να μην είναι null" -#: pl_exec.c:2985 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "η έκφραση FOREACH πρέπει αποδώσει μία συστοιχία, όχι ένα τύπο %s" -#: pl_exec.c:3002 +#: pl_exec.c:3032 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "η διάσταση (%d) του slice βρίσκεται εκτός του έγκυρου εύρους 0.. %d" -#: pl_exec.c:3029 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "η μεταβλητή βρόχου FOREACH ... SLICE πρέπει να είναι τύπου συστοιχίας" -#: pl_exec.c:3033 +#: pl_exec.c:3063 #, 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 +#: 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" msgstr "δεν είναι δυνατή η επιστροφή μη-σύνθετης τιμής από σύνθετο τύπο συνάρτησης που επιστρέφει σύνθετο τύπο" -#: pl_exec.c:3291 pl_gram.y:3310 +#: pl_exec.c:3321 pl_gram.y:3319 #, 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 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "εσφαλμένος τύπος αποτελέσματος που παρέχεται στο RETURN NEXT" -#: pl_exec.c:3370 pl_exec.c:3391 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "εσφαλμένος τύπος εγγραφής που παρέχεται στο RETURN NEXT" -#: pl_exec.c:3483 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "το RETURN NEXT πρέπει να έχει παράμετρο" -#: pl_exec.c:3511 pl_gram.y:3374 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "δεν είναι δυνατή η χρήση RETURN QUERY σε συνάρτηση non-SETOF" -#: pl_exec.c:3529 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "η δομή του ερωτήματος δεν ταιριάζει με τον τύπο αποτελέσματος της συνάρτησης" -#: pl_exec.c:3584 pl_exec.c:4404 pl_exec.c:8604 +#: 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:3665 pl_exec.c:3803 +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "επιλογή RAISE που έχει ήδη καθοριστεί: %s" -#: pl_exec.c:3699 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE χωρίς παραμέτρους δεν μπορεί να χρησιμοποιηθεί εκτός ενός δείκτη χειρισμού εξαιρέσεων" -#: pl_exec.c:3793 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "η επιλογή δήλωσης RAISE δεν μπορεί να είναι null" -#: pl_exec.c:3863 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3918 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "η επιβεβαίωση απέτυχε" -#: pl_exec.c:4277 pl_exec.c:4465 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "δεν είναι δυνατό το COPY to/from τον πελάτη σε PL/pgSQL" -#: pl_exec.c:4283 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "μη υποστηριζόμενη συναλλαγή σε PL/pgSQL" -#: pl_exec.c:4306 pl_exec.c:4494 +#: 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:4329 pl_exec.c:4517 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "το ερώτημα επέστρεψε καθόλου γραμμές" -#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 +#: 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:4353 +#: pl_exec.c:4393 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Βεβαιωθείτε ότι το ερώτημα επιστρέφει μία μόνο γραμμή ή χρησιμοποιήστε το LIMIT 1." -#: pl_exec.c:4369 +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "το ερώτημα δεν έχει προορισμό για τα δεδομένα αποτελεσμάτων" -#: pl_exec.c:4370 +#: 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:4457 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE of SELECT ... INTO δεν έχει υλοποιηθεί" -#: pl_exec.c:4458 +#: 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 αντ' αυτού." -#: pl_exec.c:4471 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE εντολών συναλλαγής δεν έχει εφαρμοσθεί" -#: pl_exec.c:4772 pl_exec.c:4860 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "η μεταβλήτη «%s» του δρομέα είναι κενή" -#: pl_exec.c:4783 pl_exec.c:4871 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "ο δρομέας «%s» δεν υπάρχει" -#: pl_exec.c:4796 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "η σχετική ή η απόλυτη θέση δρομέα είναι null" -#: pl_exec.c:5040 pl_exec.c:5135 +#: pl_exec.c:5084 pl_exec.c:5179 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "δεν είναι δυνατή η αντιστοίχιση τιμής null στη μεταβλητή «%s» δηλωμένης ως NOT NULL" -#: pl_exec.c:5116 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "δεν είναι δυνατή η αντιστοίχιση μη-σύνθετης τιμής σε μεταβλητή σειράς" -#: pl_exec.c:5148 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "δεν είναι δυνατή η αντιστοίχιση μη-σύνθετης τιμής σε μεταβλητή εγγραφής" -#: pl_exec.c:5199 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "δεν είναι δυνατή η ανάθεση στη στήλη συστήματος «%s»" -#: pl_exec.c:5648 +#: pl_exec.c:5692 #, 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 +#: 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" msgstr "ερώτημα: %s" -#: pl_exec.c:5657 +#: pl_exec.c:5701 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "το ερώτημα επέστρεψε %d στήλη" msgstr[1] "το ερώτημα επέστρεψε %d στήλες" -#: pl_exec.c:5761 +#: pl_exec.c:5805 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "το ερώτημα είναι SELECT INTO, αλλά θα έπρεπε να είναι απλό SELECT" -#: pl_exec.c:5766 +#: pl_exec.c:5810 #, c-format msgid "query is not a SELECT" msgstr "ερώτημα δεν είναι SELECT" -#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 +#: 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)" msgstr "ο τύπος παραμέτρου %d (%s) δεν συμφωνεί με αυτόν κατά την προετοιμασία του σχεδίου (%s)" -#: pl_exec.c:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 +#: 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:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 +#: 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 "%s έλεγχος του %s είναι ενεργός." -#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Βεβαιωθείτε ότι το ερώτημα επιστρέφει την ακριβή λίστα στηλών." -#: pl_exec.c:7594 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "η εγγραφή «%s» δεν έχει ανατεθεί ακόμα" -#: pl_exec.c:7595 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Η δομή πλειάδας μίας εγγραφής που δεν έχει ακόμη ανατεθεί είναι απροσδιόριστη." +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "η μεταβλητή «%s» είναι δηλωμένη ως CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "μπλοκ δήλωσης" @@ -536,280 +546,275 @@ msgstr "SQL δήλωση" msgid "FOR over EXECUTE statement" msgstr "FOR σε δήλωση EXECUTE" -#: pl_gram.y:485 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "η ετικέτα μπλοκ πρέπει να τοποθετείται πριν από το DECLARE, όχι μετά" -#: pl_gram.y:505 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" msgstr "συρραφές δεν υποστηρίζονται από τον τύπο %s" -#: pl_gram.y:524 +#: pl_gram.y:526 #, 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 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "μεταβλητή «%s» δεν υπάρχει" -#: pl_gram.y:731 pl_gram.y:759 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "διπλότυπη δήλωση" -#: pl_gram.y:742 pl_gram.y:770 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "η μεταβλητή «%s» σκιάζει μια προηγουμένως ορισμένη μεταβλητή" -#: pl_gram.y:1042 +#: pl_gram.y:1044 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "δεν επιτρέπεται το διαγνωστικό στοιχείο %s σε GET STACKED DIAGNOSTICS" -#: pl_gram.y:1060 +#: pl_gram.y:1062 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "δεν επιτρέπεται το διαγνωστικό στοιχείο %s σε GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1155 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "μη αναγνωρίσιμο στοιχείο GET DIAGNOSTICS" -#: pl_gram.y:1171 pl_gram.y:3549 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "«%s» δεν είναι scalar μεταβλητή" -#: pl_gram.y:1401 pl_gram.y:1595 +#: pl_gram.y:1403 pl_gram.y:1597 #, 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 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "ο δρομέας βρόχου FOR πρέπει να έχει μόνο μία μεταβλητή προορισμού" -#: pl_gram.y:1443 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "ο δρομέας βρόχου FOR πρέπει να χρησιμοποιήσει μια δεσμευμένη μεταβλητή δρομέα" -#: pl_gram.y:1534 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "ακέραιος βρόχος FOR πρέπει να έχει μόνο μία μεταβλητή προορισμού" -#: pl_gram.y:1568 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "δεν είναι δυνατός ο καθορισμός REVERSE σε ερώτημα βρόχου FOR" -#: pl_gram.y:1698 +#: pl_gram.y:1700 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "η μεταβλητή του βρόχου FOREACH πρέπει να είναι είτε γνωστή μεταβλητή ή λίστα μεταβλητών" -#: pl_gram.y:1740 +#: pl_gram.y:1742 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "δεν υπάρχει ετικέτα «%s» προσαρτημένη σε οποιοδήποτε μπλοκ ή βρόχο που περικλείει αυτήν τη δήλωση" -#: pl_gram.y:1748 +#: pl_gram.y:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "η ετικέτα μπλοκ «%s» δεν μπορεί να χρησιμοποιηθεί σε CONTINUE" -#: pl_gram.y:1763 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "το EXIT δεν μπορεί να χρησιμοποιηθεί εκτός βρόχου, εκτός εάν έχει ετικέτα" -#: pl_gram.y:1764 +#: pl_gram.y:1766 #, 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 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 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 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "συντακτικό σφάλμα" -#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "μη έγκυρος κωδικός SQLSTATE" -#: pl_gram.y:2126 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "συντακτικό σφάλμα, αναμενόταν «FOR«" -#: pl_gram.y:2187 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "η δήλωση FETCH δεν είναι δυνατό να επιστρέψει πολλαπλές σειρές" -#: pl_gram.y:2284 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "η μεταβλητή δρομέα πρέπει να είναι απλή μεταβλητή" -#: pl_gram.y:2290 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "η μεταβλητή «%s» πρέπει να έχει τύπο δρομέα ή refcursor" -#: pl_gram.y:2620 pl_gram.y:2631 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" msgstr "«%s» δεν είναι γνωστή μεταβλητή" -#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "ασυμφωνία παρενθέσεων" -#: pl_gram.y:2751 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "λείπει «%s» στο τέλος SQL έκφρασης" -#: pl_gram.y:2757 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "λείπει «%s» στο τέλος SQL δήλωσης" -#: pl_gram.y:2774 +#: pl_gram.y:2781 msgid "missing expression" msgstr "λείπει έκφραση" -#: pl_gram.y:2776 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "λείπει SQL δήλωση" -#: pl_gram.y:2905 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "ελλιπής δήλωση τύπου δεδομένων" -#: pl_gram.y:2928 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "λείπει δήλωση τύπου δεδομένων" -#: pl_gram.y:3006 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO ορίστηκε περισσότερο από μία φορά" -#: pl_gram.y:3176 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "αναμενόταν FROM ή IN" -#: pl_gram.y:3237 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε συνάρτηση που επιστρέφει σύνολο" -#: pl_gram.y:3238 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Χρησιμοποίησε RETURN NEXT ή RETURN QUERY." -#: pl_gram.y:3248 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε μια διαδικασία" -#: pl_gram.y:3253 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN δεν μπορεί να έχει μία παράμετρο σε συνάρτηση που επιστρέφει κενό" -#: pl_gram.y:3262 +#: pl_gram.y:3271 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN δεν μπορεί να έχει μια παράμετρο σε συνάρτηση με παραμέτρους OUT" -#: pl_gram.y:3325 +#: pl_gram.y:3334 #, 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 +#: pl_gram.y:3500 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "η μεταβλητή εγγραφής δεν μπορεί να είναι μέρος λίστας INTO πολλαπλών στοιχείων" -#: pl_gram.y:3537 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "έχουν οριστεί πάρα πολλές παράμετροι ΙΝΤΟ" -#: pl_gram.y:3745 +#: pl_gram.y:3754 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "ετικέτα τέλους «%s» έχει καθοριστεί για μπλοκ χωρίς ετικέτα" -#: pl_gram.y:3752 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "η ετικέτα τέλους «%s» διαφέρει από την ετικέτα «%s» του μπλοκ" -#: pl_gram.y:3786 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "o δρομέας «%s» δεν έχει παραμέτρους" -#: pl_gram.y:3800 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "o δρομέας «%s» έχει παραμέτρους" -#: pl_gram.y:3842 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "ο δρομέας «%s» δεν έχει παράμετρο με όνομα «%s»" -#: pl_gram.y:3862 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "τιμή για την παράμετρο «%s» του δρομέα «%s» που καθορίζεται περισσότερες από μία φορές" -#: pl_gram.y:3887 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "λείπουν παράμετροι για τον δρομέα «%s»" -#: pl_gram.y:3894 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "πάρα πολλές παράμετροι για δρομέα «%s»" -#: pl_gram.y:3980 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" msgstr "μη αναγνωρίσιμη επιλογή δήλωσης RAISE" -#: pl_gram.y:3984 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" msgstr "συντακτικό σφάλμα, αναμενόταν «=«" -#: pl_gram.y:4025 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" msgstr "έχουν οριστεί πάρα πολλές παράμετροι για RAISE" -#: pl_gram.y:4029 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" msgstr "έχουν οριστεί πολύ λίγες παράμετροι για RAISE" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/es.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/es.po index 78836961..18644d47 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/es.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 14\n" +"Project-Id-Version: plpgsql (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:54+0000\n" -"PO-Revision-Date: 2021-10-14 10:18-0500\n" +"POT-Creation-Date: 2023-05-07 16:39+0000\n" +"PO-Revision-Date: 2022-10-20 09:06+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -78,8 +78,8 @@ msgstr "la referencia a la columna «%s» es ambigua" 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:1324 pl_exec.c:5199 pl_exec.c:5372 pl_exec.c:5459 pl_exec.c:5550 -#: pl_exec.c:6571 +#: pl_comp.c:1324 pl_exec.c:5249 pl_exec.c:5422 pl_exec.c:5509 pl_exec.c:5600 +#: pl_exec.c:6621 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "el registro «%s» no tiene un campo «%s»" @@ -104,7 +104,7 @@ msgstr "la variable «%s» tiene pseudotipo %s" msgid "type \"%s\" is only a shell" msgstr "el tipo «%s» está inconcluso" -#: pl_comp.c:2204 pl_exec.c:6872 +#: pl_comp.c:2204 pl_exec.c:6922 #, c-format msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" @@ -119,58 +119,63 @@ msgstr "no se reconoce la condición de excepción «%s»" 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:510 pl_exec.c:944 pl_exec.c:1179 +#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 msgid "during initialization of execution state" msgstr "durante la inicialización del estado de ejecución" -#: pl_exec.c:516 +#: pl_exec.c:517 msgid "while storing call arguments into local variables" msgstr "mientras se almacenaban los argumentos de invocación en variables locales" -#: pl_exec.c:604 pl_exec.c:1017 +#: pl_exec.c:605 pl_exec.c:1023 msgid "during function entry" msgstr "durante el ingreso a la función" -#: pl_exec.c:627 +#: pl_exec.c:628 #, 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:633 +#: pl_exec.c:634 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:646 pl_exec.c:3647 +#: pl_exec.c:646 pl_exec.c:3675 #, 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:772 pl_exec.c:1043 pl_exec.c:1201 +#: pl_exec.c:651 pl_exec.c:3681 +#, 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" + +#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 msgid "during function exit" msgstr "durante la salida de la función" -#: pl_exec.c:827 pl_exec.c:891 pl_exec.c:3444 +#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3474 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:1040 pl_exec.c:1198 +#: pl_exec.c:1046 pl_exec.c:1204 #, 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:1048 +#: pl_exec.c:1054 #, c-format msgid "trigger procedure cannot return a set" msgstr "los procedimientos disparadores no pueden retornar conjuntos" -#: pl_exec.c:1087 pl_exec.c:1115 +#: pl_exec.c:1093 pl_exec.c:1121 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:1247 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "función PL/pgSQL %s en la línea %d %s" @@ -178,335 +183,340 @@ 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:1258 +#: pl_exec.c:1273 #, 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:1266 +#: pl_exec.c:1281 #, 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:1272 +#: pl_exec.c:1287 #, c-format msgid "PL/pgSQL function %s" msgstr "función PL/pgSQL %s" -#: pl_exec.c:1643 +#: pl_exec.c:1658 msgid "during statement block local variable initialization" msgstr "durante inicialización de variables locales en el bloque de sentencias" -#: pl_exec.c:1741 +#: pl_exec.c:1763 msgid "during statement block entry" msgstr "durante la entrada al bloque de sentencias" -#: pl_exec.c:1773 +#: pl_exec.c:1795 msgid "during statement block exit" msgstr "durante la salida del bloque de sentencias" -#: pl_exec.c:1811 +#: pl_exec.c:1833 msgid "during exception cleanup" msgstr "durante la finalización por excepción" -#: pl_exec.c:2344 +#: pl_exec.c:2370 #, 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:2349 +#: pl_exec.c:2375 #, 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:2383 +#: pl_exec.c:2409 #, 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:2583 +#: pl_exec.c:2609 #, c-format msgid "case not found" msgstr "caso no encontrado" -#: pl_exec.c:2584 +#: pl_exec.c:2610 #, c-format msgid "CASE statement is missing ELSE part." msgstr "A la sentencia CASE le falta la parte ELSE." -#: pl_exec.c:2677 +#: pl_exec.c:2703 #, 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:2693 +#: pl_exec.c:2719 #, 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:2711 +#: pl_exec.c:2737 #, 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:2717 +#: pl_exec.c:2743 #, 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:2851 pl_exec.c:4641 +#: pl_exec.c:2877 pl_exec.c:4682 #, c-format msgid "cursor \"%s\" already in use" msgstr "el cursor «%s» ya está en uso" -#: pl_exec.c:2874 pl_exec.c:4706 +#: pl_exec.c:2900 pl_exec.c:4752 #, c-format msgid "arguments given for cursor without arguments" msgstr "se dieron argumentos a un cursor sin argumentos" -#: pl_exec.c:2893 pl_exec.c:4725 +#: pl_exec.c:2919 pl_exec.c:4771 #, c-format msgid "arguments required for cursor" msgstr "se requieren argumentos para el cursor" -#: pl_exec.c:2980 +#: pl_exec.c:3010 #, c-format msgid "FOREACH expression must not be null" msgstr "la expresión FOREACH no debe ser nula" -#: pl_exec.c:2995 +#: pl_exec.c:3025 #, 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:3012 +#: pl_exec.c:3042 #, 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:3039 +#: pl_exec.c:3069 #, 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:3043 +#: pl_exec.c:3073 #, 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:3205 pl_exec.c:3262 pl_exec.c:3437 +#: pl_exec.c:3235 pl_exec.c:3292 pl_exec.c:3467 #, 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:3301 pl_gram.y:3310 +#: pl_exec.c:3331 pl_gram.y:3319 #, 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:3342 pl_exec.c:3474 +#: pl_exec.c:3372 pl_exec.c:3504 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "se pasó un tipo incorrecto de resultado a RETURN NEXT" -#: pl_exec.c:3380 pl_exec.c:3401 +#: pl_exec.c:3410 pl_exec.c:3431 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "se pasó un tipo de registro incorrecto a RETURN NEXT" -#: pl_exec.c:3493 +#: pl_exec.c:3523 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT debe tener un parámetro" -#: pl_exec.c:3521 pl_gram.y:3374 +#: pl_exec.c:3551 pl_gram.y:3383 #, 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:3539 +#: pl_exec.c:3569 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:3594 pl_exec.c:4419 pl_exec.c:8634 +#: pl_exec.c:3624 pl_exec.c:4459 pl_exec.c:8721 #, c-format msgid "query string argument of EXECUTE is null" msgstr "el argumento de consulta a ejecutar en EXECUTE es null" -#: pl_exec.c:3675 pl_exec.c:3813 +#: pl_exec.c:3709 pl_exec.c:3847 #, c-format msgid "RAISE option already specified: %s" msgstr "la opción de RAISE ya se especificó: %s" -#: pl_exec.c:3709 +#: pl_exec.c:3743 #, 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:3803 +#: pl_exec.c:3837 #, c-format msgid "RAISE statement option cannot be null" msgstr "la opción de sentencia en RAISE no puede ser null" -#: pl_exec.c:3873 +#: pl_exec.c:3907 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3928 +#: pl_exec.c:3962 #, c-format msgid "assertion failed" msgstr "aseveración falló" -#: pl_exec.c:4292 pl_exec.c:4480 +#: pl_exec.c:4332 pl_exec.c:4521 #, 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:4298 +#: pl_exec.c:4338 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "orden de transacción no soportada en PL/pgSQL" -#: pl_exec.c:4321 pl_exec.c:4509 +#: pl_exec.c:4361 pl_exec.c:4550 #, 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:4344 pl_exec.c:4532 +#: pl_exec.c:4384 pl_exec.c:4573 #, c-format msgid "query returned no rows" msgstr "la consulta no regresó filas" -#: pl_exec.c:4366 pl_exec.c:4551 pl_exec.c:5694 +#: pl_exec.c:4406 pl_exec.c:4592 pl_exec.c:5744 #, c-format msgid "query returned more than one row" msgstr "la consulta regresó más de una fila" -#: pl_exec.c:4368 +#: pl_exec.c:4408 #, 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:4384 +#: pl_exec.c:4424 #, 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:4385 +#: pl_exec.c:4425 #, 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:4472 +#: pl_exec.c:4513 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "no está implementado EXECUTE de un SELECT ... INTO" -#: pl_exec.c:4473 +#: pl_exec.c:4514 #, 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:4486 +#: pl_exec.c:4527 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "no está implementado EXECUTE de órdenes de transacción" -#: pl_exec.c:4787 pl_exec.c:4875 +#: pl_exec.c:4837 pl_exec.c:4925 #, c-format msgid "cursor variable \"%s\" is null" msgstr "variable cursor «%s» es null" -#: pl_exec.c:4798 pl_exec.c:4886 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor \"%s\" does not exist" msgstr "no existe el cursor «%s»" -#: pl_exec.c:4811 +#: pl_exec.c:4861 #, c-format msgid "relative or absolute cursor position is null" msgstr "la posición relativa o absoluta del cursor es null" -#: pl_exec.c:5049 pl_exec.c:5144 +#: pl_exec.c:5099 pl_exec.c:5194 #, 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:5125 +#: pl_exec.c:5175 #, 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:5157 +#: pl_exec.c:5207 #, 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:5208 +#: pl_exec.c:5258 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "no se puede asignar a la columna de sistema «%s»" -#: pl_exec.c:5657 +#: pl_exec.c:5707 #, c-format msgid "query did not return data" msgstr "la consulta no retornó datos" -#: pl_exec.c:5658 pl_exec.c:5670 pl_exec.c:5695 pl_exec.c:5771 pl_exec.c:5776 +#: pl_exec.c:5708 pl_exec.c:5720 pl_exec.c:5745 pl_exec.c:5821 pl_exec.c:5826 #, c-format msgid "query: %s" msgstr "consulta: %s" -#: pl_exec.c:5666 +#: pl_exec.c:5716 #, c-format 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:5770 +#: pl_exec.c:5820 #, c-format 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:5775 +#: pl_exec.c:5825 #, c-format msgid "query is not a SELECT" msgstr "la consulta no es un SELECT" -#: pl_exec.c:6585 pl_exec.c:6625 pl_exec.c:6665 +#: pl_exec.c:6635 pl_exec.c:6675 pl_exec.c:6715 #, 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:7076 pl_exec.c:7110 pl_exec.c:7184 pl_exec.c:7210 +#: pl_exec.c:7126 pl_exec.c:7160 pl_exec.c:7234 pl_exec.c:7260 #, 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:7078 pl_exec.c:7112 pl_exec.c:7186 pl_exec.c:7212 +#: pl_exec.c:7128 pl_exec.c:7162 pl_exec.c:7236 pl_exec.c:7262 #, c-format msgid "%s check of %s is active." msgstr "El chequeo %s de %s está activo." -#: pl_exec.c:7082 pl_exec.c:7116 pl_exec.c:7190 pl_exec.c:7216 +#: pl_exec.c:7132 pl_exec.c:7166 pl_exec.c:7240 pl_exec.c:7266 #, 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:7603 +#: pl_exec.c:7653 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "el registro «%s» no ha sido asignado aún" -#: pl_exec.c:7604 +#: pl_exec.c:7654 #, 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." +#: pl_exec.c:8319 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "la variable «%s» esta declarada como CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "bloque de sentencias" @@ -539,280 +549,275 @@ msgstr "sentencia SQL" msgid "FOR over EXECUTE statement" msgstr "bucle FOR en torno a una sentencia EXECUTE" -#: pl_gram.y:485 +#: pl_gram.y:487 #, 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:505 +#: pl_gram.y:507 #, 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:524 +#: pl_gram.y:526 #, 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:672 pl_gram.y:687 pl_gram.y:713 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "no existe la variable «%s»" -#: pl_gram.y:731 pl_gram.y:759 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "declaración duplicada" -#: pl_gram.y:742 pl_gram.y:770 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variable «%s» oculta una variable definida anteriormente" -#: pl_gram.y:1042 +#: pl_gram.y:1044 #, 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:1060 +#: pl_gram.y:1062 #, 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:1155 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "elemento de GET DIAGNOSTICS no reconocido" -#: pl_gram.y:1171 pl_gram.y:3549 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "«%s» no es una variable escalar" -#: pl_gram.y:1401 pl_gram.y:1595 +#: pl_gram.y:1403 pl_gram.y:1597 #, 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:1436 +#: pl_gram.y:1438 #, 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:1443 +#: pl_gram.y:1445 #, 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:1534 +#: pl_gram.y:1536 #, 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:1568 +#: pl_gram.y:1570 #, 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:1698 +#: pl_gram.y:1700 #, 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:1740 +#: pl_gram.y:1742 #, 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:1748 +#: pl_gram.y:1750 #, 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:1763 +#: pl_gram.y:1765 #, 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:1764 +#: pl_gram.y:1766 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE no puede usarse fuera de un bucle" -#: 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 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 msgid "unexpected end of function definition" msgstr "fin inesperado de la definición de la función" -#: 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 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "error de sintaxis" -#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "código SQLSTATE no válido" -#: pl_gram.y:2126 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "error de sintaxis, se esperaba «FOR»" -#: pl_gram.y:2187 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "la sentencia FETCH no puede retornar múltiples filas" -#: pl_gram.y:2284 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "variable de cursor debe ser una variable simple" -#: pl_gram.y:2290 +#: pl_gram.y:2296 #, 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:2620 pl_gram.y:2631 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" msgstr "«%s» no es una variable conocida" -#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "no coinciden los paréntesis" -#: pl_gram.y:2751 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "falta «%s» al final de la expresión SQL" -#: pl_gram.y:2757 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "falta «%s» al final de la sentencia SQL" -#: pl_gram.y:2774 +#: pl_gram.y:2781 msgid "missing expression" msgstr "expresión faltante" -#: pl_gram.y:2776 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "sentencia SQL faltante" -#: pl_gram.y:2905 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "declaración de tipo de dato incompleta" -#: pl_gram.y:2928 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "declaración de tipo de dato faltante" -#: pl_gram.y:3006 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO fue especificado más de una vez" -#: pl_gram.y:3176 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "se espera FROM o IN" -#: pl_gram.y:3237 +#: pl_gram.y:3246 #, 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:3238 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Use RETURN NEXT o RETURN QUERY." -#: pl_gram.y:3248 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN no puede tener un parámetro un procedimiento" -#: pl_gram.y:3253 +#: pl_gram.y:3262 #, 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:3262 +#: pl_gram.y:3271 #, 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:3325 +#: pl_gram.y:3334 #, 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:3433 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "la variable «%s» esta declarada como CONSTANT" - -#: pl_gram.y:3491 +#: pl_gram.y:3500 #, 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:3537 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "se especificaron demasiadas variables INTO" -#: pl_gram.y:3745 +#: pl_gram.y:3754 #, 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:3752 +#: pl_gram.y:3761 #, 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:3786 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "el cursor «%s» no tiene argumentos" -#: pl_gram.y:3800 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "el cursor «%s» tiene argumentos" -#: pl_gram.y:3842 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "el cursor «%s» no tiene un argumento llamado «%s»" -#: pl_gram.y:3862 +#: pl_gram.y:3871 #, 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:3887 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "no hay suficientes argumentos para el cursor «%s»" -#: pl_gram.y:3894 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "demasiados argumentos para el cursor «%s»" -#: pl_gram.y:3980 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" msgstr "no se reconoce la opción de sentencia RAISE" -#: pl_gram.y:3984 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" msgstr "error de sintaxis, se esperaba «=»" -#: pl_gram.y:4025 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" msgstr "se especificaron demasiados parámetros a RAISE" -#: pl_gram.y:4029 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" msgstr "se especificaron muy pocos parámetros a RAISE" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/fr.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/fr.po index f5f04dce..19676ff6 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/fr.po +++ b/third_party/spanner_pg/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-08-27 02:09+0000\n" -"PO-Revision-Date: 2021-08-27 17:03+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 3.0\n" +"X-Generator: Poedit 3.0.1\n" #: pl_comp.c:438 pl_handler.c:496 #, c-format @@ -64,58 +66,58 @@ msgstr "compilation de la fonction PL/pgSQL « %s » près de la ligne %d" msgid "parameter name \"%s\" used more than once" msgstr "le nom du paramètre « %s » est utilisé plus d'une fois" -#: pl_comp.c:1137 +#: 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:1139 +#: 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:1322 pl_exec.c:5202 pl_exec.c:5375 pl_exec.c:5462 pl_exec.c:5553 -#: pl_exec.c:6574 +#: 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:1816 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relation « %s » n'existe pas" -#: pl_comp.c:1823 pl_comp.c:1865 +#: 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:1931 +#: 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:2120 +#: 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:2202 pl_exec.c:6875 +#: 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:2250 pl_comp.c:2303 +#: 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:2524 +#: 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:500 pl_exec.c:934 pl_exec.c:1169 +#: 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" @@ -123,7 +125,7 @@ msgstr "durant l'initialisation de l'état de la fonction" msgid "while storing call arguments into local variables" msgstr "lors du stockage des arguments dans les variables locales" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "durant l'entrée d'une fonction" @@ -136,37 +138,42 @@ msgstr "le contrôle a atteint la fin de la fonction sans RETURN" 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:636 pl_exec.c:3649 +#: pl_exec.c:635 pl_exec.c:3656 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 +#: 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:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: 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:1038 +#: 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:1077 pl_exec.c:1105 +#: 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:1237 +#: 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:1248 +#: 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:1256 +#: 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:1262 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "fonction PL/pgSQL %s" -#: pl_exec.c:1633 +#: 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:1731 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "lors de l'entrée dans le bloc d'instructions" -#: pl_exec.c:1763 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "lors de la sortie du bloc d'instructions" -#: pl_exec.c:1801 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "lors du nettoyage de l'exception" -#: pl_exec.c:2334 +#: 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:2339 +#: 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:2373 +#: 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,285 +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:2573 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "cas introuvable" -#: pl_exec.c:2574 +#: 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:2667 +#: 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:2683 +#: 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:2701 +#: 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:2707 +#: 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:2841 pl_exec.c:4638 +#: 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:2864 pl_exec.c:4703 +#: 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:2883 pl_exec.c:4722 +#: pl_exec.c:2904 pl_exec.c:4742 #, c-format msgid "arguments required for cursor" msgstr "arguments requis pour le curseur" -#: pl_exec.c:2970 +#: 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:2985 +#: 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:3002 +#: 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:3029 +#: 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:3033 +#: 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:3195 pl_exec.c:3252 pl_exec.c:3427 +#: 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:3291 pl_gram.y:3310 +#: 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:3332 pl_exec.c:3464 +#: 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:3370 pl_exec.c:3391 +#: 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:3483 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT doit avoir un paramètre" -#: pl_exec.c:3511 pl_gram.y:3374 +#: 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:3529 +#: 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:3568 pl_exec.c:5773 -#, c-format -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:3569 pl_exec.c:3574 pl_exec.c:5661 pl_exec.c:5673 pl_exec.c:5698 -#: pl_exec.c:5774 pl_exec.c:5779 -#, c-format -msgid "query: %s" -msgstr "requête : %s" - -#: pl_exec.c:3573 pl_exec.c:5778 -#, c-format -msgid "query is not a SELECT" -msgstr "la requête n'est pas un SELECT" - -#: pl_exec.c:3597 pl_exec.c:4416 pl_exec.c:8616 +#: 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:3677 pl_exec.c:3815 +#: 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:3711 +#: 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:3805 +#: 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:3875 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3930 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "échec de l'assertion" -#: pl_exec.c:4289 pl_exec.c:4477 +#: 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:4295 +#: 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:4318 pl_exec.c:4506 +#: 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:4341 pl_exec.c:4529 +#: 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:4363 pl_exec.c:4548 pl_exec.c:5697 +#: 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:4365 +#: 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:4381 +#: 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:4382 +#: 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:4469 +#: 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:4470 +#: 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:4483 +#: 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:4784 pl_exec.c:4872 +#: 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:4795 pl_exec.c:4883 +#: 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:4808 +#: 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:5052 pl_exec.c:5147 +#: 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:5128 +#: 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:5160 +#: 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:5211 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "ne peut pas affecter à une colonne système « %s »" -#: pl_exec.c:5660 +#: 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:5669 +#: 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:5683 #, c-format 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:6588 pl_exec.c:6628 pl_exec.c:6668 +#: pl_exec.c:5787 +#, c-format +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:5792 +#, c-format +msgid "query is not a SELECT" +msgstr "la requête n'est pas un SELECT" + +#: 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:7079 pl_exec.c:7113 pl_exec.c:7187 pl_exec.c:7213 +#: 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:7081 pl_exec.c:7115 pl_exec.c:7189 pl_exec.c:7215 +#: 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:7085 pl_exec.c:7119 pl_exec.c:7193 pl_exec.c:7219 +#: 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:7606 +#: 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:7607 +#: 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." @@ -542,280 +548,280 @@ msgstr "instruction SQL" msgid "FOR over EXECUTE statement" msgstr "FOR sur une instruction EXECUTE" -#: pl_gram.y:485 +#: 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:505 +#: 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:524 +#: 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:672 pl_gram.y:687 pl_gram.y:713 +#: 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:731 pl_gram.y:759 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "déclaration dupliquée" -#: pl_gram.y:742 pl_gram.y:770 +#: 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:1042 +#: 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:1060 +#: 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:1155 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "élément GET DIAGNOSTICS non reconnu" -#: pl_gram.y:1171 pl_gram.y:3549 +#: 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:1401 pl_gram.y:1595 +#: 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:1436 +#: 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:1443 +#: 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:1534 +#: 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:1568 +#: 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:1698 +#: 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:1740 +#: 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:1748 +#: 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:1763 +#: 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:1764 +#: 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: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 +#: 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: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 +#: 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:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: 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:2126 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "erreur de syntaxe, « FOR » attendu" -#: pl_gram.y:2187 +#: 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:2284 +#: 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:2290 +#: 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:2620 pl_gram.y:2631 +#: 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:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 msgid "mismatched parentheses" msgstr "parenthèses non correspondantes" -#: pl_gram.y:2751 +#: 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:2757 +#: 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:2774 +#: pl_gram.y:2780 msgid "missing expression" msgstr "expression manquante" -#: pl_gram.y:2776 +#: pl_gram.y:2782 msgid "missing SQL statement" msgstr "instruction SQL manquante" -#: pl_gram.y:2905 +#: pl_gram.y:2911 msgid "incomplete data type declaration" msgstr "déclaration incomplète d'un type de données" -#: pl_gram.y:2928 +#: pl_gram.y:2934 msgid "missing data type declaration" msgstr "déclaration manquante d'un type de données" -#: pl_gram.y:3006 +#: pl_gram.y:3014 msgid "INTO specified more than once" msgstr "INTO spécifié plus d'une fois" -#: pl_gram.y:3176 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "attendait FROM ou IN" -#: pl_gram.y:3237 +#: 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:3238 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Utilisez RETURN NEXT ou RETURN QUERY." -#: pl_gram.y:3248 +#: 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:3253 +#: 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:3262 +#: 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:3325 +#: 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:3433 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "la variable « %s » est déclarée CONSTANT" -#: pl_gram.y:3491 +#: 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:3537 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "trop de variables INTO indiquées" -#: pl_gram.y:3745 +#: 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:3752 +#: 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:3786 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "le curseur « %s » n'a pas d'argument" -#: pl_gram.y:3800 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "le curseur « %s » a des arguments" -#: pl_gram.y:3842 +#: 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:3862 +#: 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:3887 +#: 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:3894 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "trop d'arguments pour le curseur « %s »" -#: pl_gram.y:3980 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "option de l'instruction RAISE inconnue" -#: pl_gram.y:3984 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "erreur de syntaxe, « = » attendu" -#: pl_gram.y:4025 +#: 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:4029 +#: pl_gram.y:4037 #, c-format msgid "too few parameters specified for RAISE" msgstr "trop peu de paramètres pour RAISE" @@ -852,82 +858,69 @@ msgstr "%s à la fin de l'entrée" msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %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 "EXECUTE statement" +#~ msgstr "instruction EXECUTE" -#~ msgid "subscripted object is not an array" -#~ msgstr "l'objet souscrit n'est pas un tableau" +#~ 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 "array subscript in assignment must not be null" -#~ msgstr "un indice de tableau dans une affectation ne peut pas être NULL" +#~ 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 "label does not exist" -#~ msgstr "le label n'existe pas" +#~ msgid "N/A (dropped column)" +#~ msgstr "N/A (colonne supprimée)" -#~ msgid "RETURN must specify a record or row variable in function returning row" +#~ msgid "Number of returned columns (%d) does not match expected column count (%d)." #~ msgstr "" -#~ "RETURN ne peut pas indiquer une variable RECORD ou ROW dans une fonction\n" -#~ "renvoyant une ligne" +#~ "Le nombre de colonnes renvoyées (%d) ne correspond pas au nombre de colonnes\n" +#~ "attendues (%d)." #~ 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 "unterminated dollar-quoted string" -#~ msgstr "chaîne entre dollars non terminée" - -#~ msgid "unterminated quoted string" -#~ msgstr "chaîne entre guillemets non terminée" - -#~ msgid "unterminated /* comment" -#~ msgstr "commentaire /* non terminé" - -#~ msgid "unterminated quoted identifier" -#~ msgstr "identifiant entre guillemets non terminé" - -#~ msgid "qualified identifier cannot be used here: %s" -#~ msgstr "l'identifiant qualifié ne peut pas être utilisé ici : %s" - -#~ msgid "unterminated \" in identifier: %s" -#~ msgstr "\" non terminé dans l'identifiant : %s" - -#~ msgid "variable \"%s\" does not exist in the current block" -#~ msgstr "la variable « %s » n'existe pas dans le bloc actuel" +#~ 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 "expected \")\"" -#~ msgstr "« ) » attendu" +#~ 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 "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 "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 "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 "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 "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 "cursor \"%s\" closed unexpectedly" +#~ msgstr "le curseur « %s » a été fermé de façon inattendu" -#~ msgid "too many variables specified in SQL statement" -#~ msgstr "trop de variables spécifiées dans l'instruction SQL" +#~ 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 "expected a cursor or refcursor variable" -#~ msgstr "attendait une variable de type cursor ou refcursor" +#~ msgid "expected \")\"" +#~ msgstr "« ) » attendu" -#~ 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 "expected \"[\"" +#~ msgstr "« [ » attendu" -#~ msgid "syntax error at \"%s\"" -#~ msgstr "erreur de syntaxe à « %s »" +#~ msgid "expected a cursor or refcursor variable" +#~ msgstr "attendait une variable de type cursor ou refcursor" #~ msgid "expected an integer variable" #~ msgstr "attend une variable entière" @@ -935,64 +928,77 @@ msgstr "%s sur ou près de « %s »" #~ msgid "function has no parameter \"%s\"" #~ msgstr "la fonction n'a pas de paramètre « %s »" -#~ msgid "only positional parameters can be aliased" -#~ msgstr "seuls les paramètres de position peuvent avoir un alias" +#~ 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 "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 "only positional parameters can be aliased" +#~ msgstr "seuls les paramètres de position peuvent avoir un alias" -#~ msgid "N/A (dropped column)" -#~ msgstr "N/A (colonne supprimée)" +#~ msgid "qualified identifier cannot be used here: %s" +#~ msgstr "l'identifiant qualifié ne peut pas être utilisé ici : %s" -#~ 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 "query \"%s\" returned more than one row" +#~ msgstr "la requête « %s » a renvoyé plus d'une ligne" -#~ 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 "relation \"%s\" is not a table" +#~ msgstr "la relation « %s » n'est pas une table" -#~ 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 "relation \"%s.%s\" does not exist" +#~ msgstr "la relation « %s.%s » n'existe pas" -#~ msgid "expected \"[\"" -#~ msgstr "« [ » attendu" +#~ msgid "row \"%s\" has no field \"%s\"" +#~ msgstr "la ligne « %s » n'a aucun champ « %s »" #~ msgid "row \"%s.%s\" has no field \"%s\"" #~ msgstr "la ligne « %s.%s » n'a aucun champ « %s »" -#~ msgid "row \"%s\" has no field \"%s\"" -#~ msgstr "la ligne « %s » n'a aucun champ « %s »" +#~ msgid "row or record variable cannot be CONSTANT" +#~ msgstr "la variable ROW ou RECORD ne peut pas être CONSTANT" -#~ msgid "cursor \"%s\" closed unexpectedly" -#~ msgstr "le curseur « %s » a été fermé de façon inattendu" +#~ msgid "row or record variable cannot be NOT NULL" +#~ msgstr "la variable ROW ou RECORD ne peut pas être NOT NULL" -#~ msgid "relation \"%s.%s\" does not exist" -#~ msgstr "la relation « %s.%s » n'existe pas" +#~ 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 "EXECUTE statement" -#~ msgstr "instruction EXECUTE" +#~ msgid "subscripted object is not an array" +#~ msgstr "l'objet souscrit n'est pas un tableau" -#~ 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 "syntax error at \"%s\"" +#~ msgstr "erreur de syntaxe à « %s »" -#~ msgid "row or record variable cannot be NOT NULL" -#~ msgstr "la variable ROW ou RECORD ne peut pas être NOT NULL" +#~ msgid "too many variables specified in SQL statement" +#~ msgstr "trop de variables spécifiées dans l'instruction SQL" -#~ msgid "row or record variable cannot be CONSTANT" -#~ msgstr "la variable ROW ou RECORD ne peut pas être CONSTANT" +#~ 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 "Use a BEGIN block with an EXCEPTION clause instead." -#~ msgstr "Utiliser un bloc BEGIN dans une clause EXCEPTION à la place." +#~ 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 dollar-quoted string" +#~ msgstr "chaîne entre dollars non terminée" + +#~ msgid "unterminated quoted identifier" +#~ msgstr "identifiant entre guillemets non terminé" + +#~ msgid "unterminated quoted string" +#~ msgstr "chaîne entre guillemets non terminée" #~ 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 "relation \"%s\" is not a table" -#~ msgstr "la relation « %s » n'est pas une table" - -#~ msgid "query \"%s\" returned more than one row" -#~ msgstr "la requête « %s » a renvoyé plus d'une ligne" +#~ msgid "variable \"%s\" does not exist in the current block" +#~ msgstr "la variable « %s » n'existe pas dans le bloc actuel" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/it.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/it.po index f32ae19e..a58d1cb4 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/it.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/it.po @@ -16,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:08+0000\n" -"PO-Revision-Date: 2018-10-08 23:10+0100\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:09+0000\n" +"PO-Revision-Date: 2022-09-26 15:08+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -27,146 +27,161 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 3.1.1\n" -#: pl_comp.c:434 pl_handler.c:457 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "Le funzioni PL/pgSQL non accettano il tipo %s" -#: pl_comp.c:522 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "determinazione del tipo di ritorno reale per la funzione polimorfa \"%s\" fallita" -#: pl_comp.c:552 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "le funzioni trigger possono essere chiamate esclusivamente da trigger" -#: pl_comp.c:556 pl_handler.c:441 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "Le funzioni PL/pgSQL non possono restituire un tipo %s" -#: pl_comp.c:595 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" -msgstr "Le funzioni trigger non possono avere argomenti dichiarati" +msgstr "le funzioni trigger non possono avere argomenti dichiarati" -#: pl_comp.c:596 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Gli argomenti del trigger possono essere acceduti tramite TG_NARGS e TG_ARGV invece." -#: pl_comp.c:719 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "le funzioni trigger di evento non possono avere argomenti dichiarati" -#: pl_comp.c:976 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "compilazione della funzione PL/pgSQL \"%s\" in prossimità della riga %d" -#: pl_comp.c:999 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "il nome di parametro \"%s\" è usato più di una volta" -#: pl_comp.c:1109 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "il riferimento alla colonna \"%s\" è ambiguo" -#: pl_comp.c:1111 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Può riferirsi o ad una variabile PL/pgSQL o ad una colonna di tabella." -#: pl_comp.c:1294 pl_exec.c:5049 pl_exec.c:5414 pl_exec.c:5501 pl_exec.c:5592 -#: pl_exec.c:6510 +#: 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 "il record \"%s\" non ha un campo \"%s\"" -#: pl_comp.c:1756 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relazione \"%s\" non esiste" -#: pl_comp.c:1848 +#: pl_comp.c:1825 pl_comp.c:1867 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "la relazione \"%s\" non ha un tipo composto" + +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "la variabile \"%s\" ha lo pseudo-tipo %s" -#: pl_comp.c:2028 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "il tipo \"%s\" non è completamente definito" -#: pl_comp.c:2125 pl_comp.c:2178 +#: pl_comp.c:2204 pl_exec.c:6907 +#, c-format +msgid "type %s is not composite" +msgstr "il tipo %s non è composito" + +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "condizione di eccezione \"%s\" sconosciuta" -#: pl_comp.c:2392 +#: pl_comp.c:2534 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "il tipo reale dell'argomento non è determinabile per la funzione polimorfa \"%s\"" -#: pl_exec.c:474 pl_exec.c:886 pl_exec.c:1103 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "durante l'inizializzazione dello stato di esecuzione" -#: pl_exec.c:480 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "durante la memorizzazione degli argomenti di chiamata in variabili locali" -#: pl_exec.c:568 pl_exec.c:938 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "durante l'ingresso nella funzione" -#: pl_exec.c:593 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "il controllo ha raggiunto la fine di una funzione senza incontrare alcun RETURN" -#: pl_exec.c:600 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "durante la conversione del valore da restituire nel tipo restituito della funzione" -#: pl_exec.c:613 pl_exec.c:3512 +#: pl_exec.c:636 pl_exec.c:3665 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "la funzione che restituisce insiemi è chiamata in un contesto che non può accettare un insieme" -#: pl_exec.c:739 pl_exec.c:967 pl_exec.c:1128 +#: pl_exec.c:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "necessaria modalità materializzata, ma non ammessa in questo contesto" + +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "durante l'uscita della funzione" -#: pl_exec.c:794 pl_exec.c:833 pl_exec.c:3357 +#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 msgid "returned record type does not match expected record type" msgstr "il tipo del record restituito non coincide con quello atteso" -#: pl_exec.c:963 pl_exec.c:1124 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "il controllo ha raggiunto la fine di una procedura trigger senza incontrare alcun RETURN" -#: pl_exec.c:972 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "la procedura trigger non può restituire un insieme" -#: pl_exec.c:1011 pl_exec.c:1039 +#: pl_exec.c:1083 pl_exec.c:1111 msgid "returned row structure does not match the structure of the triggering table" msgstr "la struttura della riga restituita non coincide con la struttura della tabella che ha generato il trigger" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1176 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "funzione PL/pgSQL %s riga %d %s" @@ -174,658 +189,686 @@ msgstr "funzione PL/pgSQL %s riga %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1187 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s %s" msgstr "funzione PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1195 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "funzione PL/pgSQL %s riga %d a %s" -#: pl_exec.c:1201 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "funzione PL/pgSQL %s" -#: pl_exec.c:1539 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "durante l'inizializzazione di variabili locali del blocco di istruzioni" -#: pl_exec.c:1637 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "durante l'entrata nel blocco di istruzioni" -#: pl_exec.c:1669 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "durante l'uscita dal blocco di istruzioni" -#: pl_exec.c:1707 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "durante la pulizia delle eccezioni" -#: pl_exec.c:2235 pl_exec.c:2249 +#: pl_exec.c:2360 #, c-format -msgid "argument %d is an output argument but is not writable" -msgstr "l'argomento %d è un argomento di output ma non è scrivibile" +msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" +msgstr "il parametro di procedura \"%s\" è un parametro di output ma l'argomento corrispondente non è scrivibile" -#: pl_exec.c:2291 +#: pl_exec.c:2365 +#, c-format +msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" +msgstr "il parametro di procedura %d è un parametro di output ma l'argomento corrispondente non è scrivibile" + +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS non può essere usato fuori da un gestore di eccezioni" -#: pl_exec.c:2496 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "caso non trovato" -#: pl_exec.c:2497 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "all'istruzione CASE manca la parte ELSE." -#: pl_exec.c:2590 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "il limite inferiore di un ciclo FOR non può essere nullo" -#: pl_exec.c:2606 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "il limite superiore di un ciclo FOR non può essere null" -#: pl_exec.c:2624 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "il valore BY di un ciclo FOR non può essere null" -#: pl_exec.c:2630 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "il valore BY di un ciclo FOR deve essere maggiore di zero" -#: pl_exec.c:2764 pl_exec.c:4479 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "il cursore \"%s\" è già in uso" -#: pl_exec.c:2787 pl_exec.c:4544 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "sono stati passati argomenti al cursore che non ne accetta" -#: pl_exec.c:2806 pl_exec.c:4563 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "sono richiesti argomenti per il cursore" -#: pl_exec.c:2893 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "l'espressione FOREACH non può essere vuota" -#: pl_exec.c:2908 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "l'espressione FOREACH deve generare un array, non il tipo %s" -#: pl_exec.c:2925 +#: pl_exec.c:3032 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "la dimensione della sezione (%d) è fuori dell'intervallo valido 0..%d" -#: pl_exec.c:2952 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "la variabile del ciclo FOREACH ... SLICE dev'essere di tipo array" -#: pl_exec.c:2956 +#: pl_exec.c:3063 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "la variabile di ciclo FOREACH non può essere un tipo array" -#: pl_exec.c:3118 pl_exec.c:3175 pl_exec.c:3350 +#: 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" msgstr "non è possibile restituire valori non compositi da una funzione che restituisce un tipo composito" -#: pl_exec.c:3214 pl_gram.y:3267 +#: pl_exec.c:3321 pl_gram.y:3319 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "non si può usare RETURN NEXT in una funzione non-SETOF" -#: pl_exec.c:3255 pl_exec.c:3387 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "è stato fornito un risultato di tipo non corretto a RETURN NEXT" -#: pl_exec.c:3293 pl_exec.c:3314 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "è stato fornito un record di tipo non corretto a RETURN NEXT" -#: pl_exec.c:3406 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT deve avere un parametro" -#: pl_exec.c:3432 pl_gram.y:3330 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "non si può usare RETURN QUERY in una funzione non-SETOF" -#: pl_exec.c:3456 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "la struttura della query non coincide con il tipo del risultato della funzione" -#: pl_exec.c:3540 pl_exec.c:3678 +#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "l'argomento della query di EXECUTE è nullo" + +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "opzione RAISE già specificata: %s" -#: pl_exec.c:3574 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE senza parametri non può essere usato all'esterno di un gestore di eccezioni" -#: pl_exec.c:3668 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "l'opzione dell'istruzione RAISE non può essere nulla" -#: pl_exec.c:3738 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3793 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "asserzione fallita" -#: pl_exec.c:4130 pl_exec.c:4317 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "non è possibile usare COPY verso/da un client in PL/pgSQL" -#: pl_exec.c:4136 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "comando di transazione non supportato in PL/pgSQL" -#: pl_exec.c:4160 pl_exec.c:4347 +#: pl_exec.c:4346 pl_exec.c:4535 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO usato con un comando che non restituisce alcun dato" -#: pl_exec.c:4183 pl_exec.c:4370 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "la query non ha restituito alcuna riga" -#: pl_exec.c:4202 pl_exec.c:4389 +#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 #, c-format msgid "query returned more than one row" msgstr "la query ha restituito più di una riga" -#: pl_exec.c:4219 +#: pl_exec.c:4393 +#, c-format +msgid "Make sure the query returns a single row, or use LIMIT 1." +msgstr "Assicurati che la query restituisca una singola riga o usa LIMIT 1." + +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "la query non ha una destinazione per i dati restituiti" -#: pl_exec.c:4220 +#: pl_exec.c:4410 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Se vuoi scartare i risultati di una SELECT, utilizza PERFORM." -#: pl_exec.c:4253 pl_exec.c:8271 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "l'argomento della query di EXECUTE è nullo" - -#: pl_exec.c:4309 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE di SELECT ... INTO non è implementato" -#: pl_exec.c:4310 +#: pl_exec.c:4499 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Potresti usare invece EXECUTE ... INTO oppure EXECUTE CREATE TABLE ... AS." -#: pl_exec.c:4323 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "l'EXECUTE dei comandi di transazione non è implementato" -#: pl_exec.c:4625 pl_exec.c:4713 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "la variabile del cursore \"%s\" è nulla" -#: pl_exec.c:4636 pl_exec.c:4724 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "il cursore \"%s\" non esiste" -#: pl_exec.c:4649 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "la posizione relativa o assoluta del cursore è nulla" -#: pl_exec.c:4899 pl_exec.c:4994 +#: pl_exec.c:5084 pl_exec.c:5179 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "il valore null non può essere assegnato alla variabile \"%s\" dichiarata NOT NULL" -#: pl_exec.c:4975 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "non è possibile assegnare un valore non composito ad una variabile di tipo row" -#: pl_exec.c:5007 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "non è possibile assegnare un valore non composito ad una variabile di tipo record" -#: pl_exec.c:5058 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "non è possibile assegnare alla colonna di sistema \"%s\"" -#: pl_exec.c:5122 +#: pl_exec.c:5692 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "il numero di dimensioni dell'array (%d) eccede il massimo consentito (%d)" +msgid "query did not return data" +msgstr "la query non ha restituito dati" -#: pl_exec.c:5154 +#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 #, c-format -msgid "subscripted object is not an array" -msgstr "l'oggetto del quale è stato richiesto un elemento non è un array" +msgid "query: %s" +msgstr "query: %s" -#: pl_exec.c:5192 +#: pl_exec.c:5701 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "l'indice di un array nell'assegnamento non può essere nullo" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "la query ha restituito %d colonna" +msgstr[1] "la query ha restituito %d colonne" -#: pl_exec.c:5699 +#: pl_exec.c:5805 #, c-format -msgid "query \"%s\" did not return data" -msgstr "la query \"%s\" non ha restituito dati" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "la query è SELECT INTO, ma dovrebbe essere semplice SELECT" -#: pl_exec.c:5707 +#: pl_exec.c:5810 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "la query \"%s\" ha restituito %d colonna" -msgstr[1] "la query \"%s\" ha restituito %d colonne" +msgid "query is not a SELECT" +msgstr "la query non è una SELECT" -#: pl_exec.c:5735 +#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "la query \"%s\" ha restituito più di una riga" +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "il tipo del parametro %d (%s) non combacia con quello usato preparando il piano (%s)" -#: pl_exec.c:5798 +#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "la query \"%s\" non è una SELECT" +msgid "number of source and target fields in assignment does not match" +msgstr "il numero di campi di origine e di destinazione nell'assegnazione non corrisponde" -#: pl_exec.c:6524 pl_exec.c:6564 pl_exec.c:6604 +#. translator: %s represents a name of an extra check +#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 #, c-format -msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" -msgstr "il tipo del parametro %d (%s) non combacia con quello usato preparando il piano (%s)" +msgid "%s check of %s is active." +msgstr "%s il controllo di %s è attivo." + +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#, c-format +msgid "Make sure the query returns the exact list of columns." +msgstr "Assicurati che la query restituisca l'esatto elenco di colonne." -#: pl_exec.c:7379 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "il record \"%s\" non è stato ancora assegnato" -#: pl_exec.c:7380 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "La struttura della tupla di un record non ancora assegnato è indeterminata." -#: pl_funcs.c:239 +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "la variabile \"%s\" è dichiarata CONSTANT" + +#: pl_funcs.c:237 msgid "statement block" msgstr "blocco di istruzioni" -#: pl_funcs.c:241 +#: pl_funcs.c:239 msgid "assignment" msgstr "assegnazione" -#: pl_funcs.c:251 +#: pl_funcs.c:249 msgid "FOR with integer loop variable" msgstr "ciclo FOR con variabile di ciclo intera" -#: pl_funcs.c:253 +#: pl_funcs.c:251 msgid "FOR over SELECT rows" msgstr "ciclo FOR su righe SELECT" -#: pl_funcs.c:255 +#: pl_funcs.c:253 msgid "FOR over cursor" msgstr "ciclo FOR su cursore" -#: pl_funcs.c:257 +#: pl_funcs.c:255 msgid "FOREACH over array" msgstr "FOREACH su array" -#: pl_funcs.c:271 +#: pl_funcs.c:269 msgid "SQL statement" msgstr "istruzione SQL" -#: pl_funcs.c:275 +#: pl_funcs.c:273 msgid "FOR over EXECUTE statement" msgstr "ciclo FOR su una istruzione EXECUTE" -#: pl_gram.y:485 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "l'etichetta del blocco dev'essere messa prima di DECLARE, non dopo" -#: pl_gram.y:505 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" msgstr "gli ordinamenti non sono supportati dal tipo %s" -#: pl_gram.y:524 +#: pl_gram.y:526 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "la variabile \"%s\" deve avere un valore di default, perché è dichiarata NOT NULL" -#: pl_gram.y:670 pl_gram.y:685 pl_gram.y:711 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "la variabile \"%s\" non esiste" -#: pl_gram.y:729 pl_gram.y:757 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "dichiarazione duplicata" -#: pl_gram.y:740 pl_gram.y:768 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variabile \"%s\" nasconde una variabile definita precedentemente" -#: pl_gram.y:984 +#: pl_gram.y:1044 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "l'elemento diagnostico %s non è consentito in GET STACKED DIAGNOSTICS" -#: pl_gram.y:1002 +#: pl_gram.y:1062 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "l'elemento diagnostico %s non è consentito in GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1100 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "elemento GET DIAGNOSTICS sconosciuto" -#: pl_gram.y:1110 pl_gram.y:3509 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" non è una variabile scalare" -#: pl_gram.y:1358 pl_gram.y:1551 +#: pl_gram.y:1403 pl_gram.y:1597 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "la variabile di loop di un loop su righe deve essere una variabile record o una lista di variabili scalari" -#: pl_gram.y:1392 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "il cursore FOR nel ciclo deve avere solo una variabile di destinazione" -#: pl_gram.y:1399 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "il cursore FOR nel ciclo deve usare una variabile cursore vincolata" -#: pl_gram.y:1486 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "il valore integer del ciclo FOR deve avere solo una variabile di destinazione" -#: pl_gram.y:1522 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "non puoi specificare REVERSE nel ciclo FOR della query" -#: pl_gram.y:1653 +#: pl_gram.y:1700 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "la variabile del ciclo FOREACH dev'essere una variabile o lista di variabili conosciuta" -#: pl_gram.y:1694 +#: pl_gram.y:1742 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "non c'è un'etichetta \"%s\" collegata ad alcun blocco o loop contenente questa istruzione" -#: pl_gram.y:1702 +#: pl_gram.y:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "l'etichetta di blocco \"%s\" non può essere usata con CONTINUE" -#: pl_gram.y:1717 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT non può essere usato fuori da un loop, a meno che non abbia un'etichetta" -#: pl_gram.y:1718 +#: pl_gram.y:1766 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE non può essere usato all'esterno di un ciclo" -#: pl_gram.y:1742 pl_gram.y:1779 pl_gram.y:1827 pl_gram.y:2959 pl_gram.y:3042 -#: pl_gram.y:3153 pl_gram.y:3910 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 msgid "unexpected end of function definition" msgstr "fine della definizione della funzione inaspettata" -#: pl_gram.y:1847 pl_gram.y:1871 pl_gram.y:1887 pl_gram.y:1893 pl_gram.y:2010 -#: pl_gram.y:2018 pl_gram.y:2032 pl_gram.y:2126 pl_gram.y:2361 pl_gram.y:2455 -#: pl_gram.y:2613 pl_gram.y:3752 pl_gram.y:3813 pl_gram.y:3891 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "errore di sintassi" -#: pl_gram.y:1875 pl_gram.y:1877 pl_gram.y:2365 pl_gram.y:2367 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "codice SQLSTATE non valido" -#: pl_gram.y:2074 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "errore di sintassi, atteso \"FOR\"" -#: pl_gram.y:2135 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "l'istruzione FETCH non può restituire più di una riga" -#: pl_gram.y:2245 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "la variabile cursore deve essere una variabile semplice" -#: pl_gram.y:2251 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "la variabile \"%s\" deve essere di tipo cursor o refcursor" -#: pl_gram.y:2584 pl_gram.y:2595 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" non è una variabile conosciuta" -#: pl_gram.y:2699 pl_gram.y:2709 pl_gram.y:2864 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "le parentesi non corrispondono" -#: pl_gram.y:2713 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "manca \"%s\" alla fine della espressione SQL" -#: pl_gram.y:2719 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "manca \"%s\" alla fine dell'istruzione SQL" -#: pl_gram.y:2736 +#: pl_gram.y:2781 msgid "missing expression" msgstr "espressione mancante" -#: pl_gram.y:2738 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "istruzione SQL mancante" -#: pl_gram.y:2866 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "dichiarazione del tipo di dati incompleta" -#: pl_gram.y:2889 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "manca la dichiarazione del tipo di dati" -#: pl_gram.y:2967 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO specificato più di una volta" -#: pl_gram.y:3134 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "atteso FROM o IN" -#: pl_gram.y:3194 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN non può avere un parametro in una funzione che restituisce insiemi" -#: pl_gram.y:3195 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Usa RETURN NEXT o RETURN QUERY." -#: pl_gram.y:3205 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN non può avere un parametro in una procedura" # Il fatto che una funzione che restituisce void sia chiamato "procedura" è un visual-basic-ismo che si può dimenticare -#: pl_gram.y:3210 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN non può avere un parametro in una funzione che restituisce void" -#: pl_gram.y:3219 +#: pl_gram.y:3271 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN non può avere un parametro in una funzione con parametri OUT" -#: pl_gram.y:3281 +#: pl_gram.y:3334 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT non può avere un parametro in una funzione con parametri OUT" -#: pl_gram.y:3388 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "la variabile \"%s\" è dichiarata CONSTANT" - -#: pl_gram.y:3451 +#: pl_gram.y:3500 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "una variabile record non può essere parte di una lista INTO con più di un elemento" -#: pl_gram.y:3497 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "troppe variabili INTO specificate" -#: pl_gram.y:3705 +#: pl_gram.y:3754 #, c-format -msgid "end label \"%s\" specified for unlabelled block" +msgid "end label \"%s\" specified for unlabeled block" msgstr "etichetta finale \"%s\" specificata per un blocco senza etichetta" -#: pl_gram.y:3712 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "l'etichetta finale \"%s\" differisce da quella del blocco \"%s\"" -#: pl_gram.y:3747 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "il cursore \"%s\" non ha argomenti" -#: pl_gram.y:3761 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "il cursore \"%s\" ha argomenti" -#: pl_gram.y:3803 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "il cursore \"%s\" non ha un argomento di nome \"%s\"" -#: pl_gram.y:3823 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "il valore per il parametro \"%s\" del cursore \"%s\" è stato specificato più di una volta" -#: pl_gram.y:3848 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "numero di argomenti non sufficiente per il cursore \"%s\"" -#: pl_gram.y:3855 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "troppi argomenti per il cursore \"%s\"" -#: pl_gram.y:3942 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" msgstr "opzione dell'istruzione RAISE sconosciuta" -#: pl_gram.y:3946 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" msgstr "errore di sintassi, atteso \"=\"" -#: pl_gram.y:3987 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" msgstr "troppi parametri specificati per RAISE" -#: pl_gram.y:3991 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" msgstr "numero di parametri non sufficiente specificati per RAISE" -#: pl_handler.c:154 +#: pl_handler.c:156 msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." msgstr "Imposta la gestione dei conflitti tra nomi di variabili PL/pgSQL e nomi di colonne di tabella." -#: pl_handler.c:163 +#: pl_handler.c:165 msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." msgstr "Stampa informazioni sui parametri nella parte DETAIL del messaggio di errore generato su errori in INTO ... STRICT." -#: pl_handler.c:171 +#: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." msgstr "Effettua i controlli dati nelle istruzioni ASSERT." -#: pl_handler.c:179 +#: pl_handler.c:181 msgid "List of programming constructs that should produce a warning." msgstr "Elenco dei costrutti di programmazione che dovrebbero generare un avvertimento." -#: pl_handler.c:189 +#: pl_handler.c:191 msgid "List of programming constructs that should produce an error." msgstr "Elenco dei costrutti di programmazione che dovrebbero generare un errore." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:630 +#: pl_scanner.c:508 #, c-format msgid "%s at end of input" msgstr "%s alla fine dell'input" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:646 +#: pl_scanner.c:524 #, c-format msgid "%s at or near \"%s\"" msgstr "%s a o presso \"%s\"" + +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "l'indice di un array nell'assegnamento non può essere nullo" + +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "il numero di dimensioni dell'array (%d) eccede il massimo consentito (%d)" + +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "la query \"%s\" ha restituito più di una riga" + +#~ msgid "subscripted object is not an array" +#~ msgstr "l'oggetto del quale è stato richiesto un elemento non è un array" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/ja.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/ja.po index 5c6b74d9..82da3a4d 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/ja.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/ja.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL 14)\n" +"Project-Id-Version: plpgsql (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-25 17:23+0900\n" -"PO-Revision-Date: 2021-08-25 11:38+0900\n" +"POT-Creation-Date: 2022-08-09 12:01+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" @@ -31,7 +31,7 @@ msgstr "多相関数\"%s\"の実際の戻り値の型を特定できませんで #: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "トリガー関数はトリガーとしてのみ呼び出せます" +msgstr "トリガー関数はトリガーとしてのみコールできます" #: pl_comp.c:564 pl_handler.c:480 #, c-format @@ -46,7 +46,7 @@ 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を通してのみアクセスできます" +msgstr "その代わり、トリガーの引数には TG_NARGS と TG_ARGV を通してのみアクセスできます" #: pl_comp.c:738 #, c-format @@ -56,116 +56,121 @@ msgstr "イベントトリガー関数では引数を宣言できません" #: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" -msgstr "PL/pgSQL関数\"%s\"の%d行目付近でのコンパイル" +msgstr "PL/pgSQL 関数 \"%s\" の %d 行目付近でのコンパイル" #: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" -msgstr "パラメータ\"%s\"が複数指定されました" +msgstr "パラメータ \"%s\" が複数指定されました" -#: pl_comp.c:1137 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" -msgstr "列参照\"%s\"が一意に特定できません" +msgstr "列参照 \"%s\" が一意に特定できません" -#: pl_comp.c:1139 +#: 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:1322 pl_exec.c:5202 pl_exec.c:5375 pl_exec.c:5462 pl_exec.c:5553 -#: pl_exec.c:6574 +#: 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\"はありません" +msgstr "レコード \"%s\" には項目 \"%s\" はありません" -#: pl_comp.c:1816 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" -msgstr "リレーション\"%s\"は存在しません" +msgstr "リレーション \"%s\" がありません" -#: pl_comp.c:1823 pl_comp.c:1865 +#: pl_comp.c:1825 pl_comp.c:1867 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"は複合型を持っていません" -#: pl_comp.c:1931 +#: pl_comp.c:1933 #, c-format msgid "variable \"%s\" has pseudo-type %s" -msgstr "変数\"%s\"の型は擬似型%sです" +msgstr "変数 \"%s\" の型は擬似タイプ %s です" -#: pl_comp.c:2120 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" -msgstr "型\"%s\"は単なるシェルです" +msgstr "型 \"%s\" はシェルでのみ使えます" -#: pl_comp.c:2202 pl_exec.c:6875 +#: pl_comp.c:2204 pl_exec.c:6907 #, c-format msgid "type %s is not composite" msgstr "型%sは複合型ではありません" -#: pl_comp.c:2250 pl_comp.c:2303 +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" -msgstr "例外条件\"%s\"が認識できません" +msgstr "例外条件 \"%s\" が認識できません" -#: pl_comp.c:2524 +#: 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 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "実行状態の初期化の際" -#: pl_exec.c:506 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "引数をローカル変数に格納する際" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "関数に入る際" -#: pl_exec.c:617 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" -msgstr "RETURNが現れる前に、制御が関数の終わりに達しました" +msgstr "RETURN が現れる前に、制御が関数の終わりに達しました" -#: pl_exec.c:623 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "戻り値を関数の戻り値の型へキャストする際に" -#: pl_exec.c:636 pl_exec.c:3649 +#: 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:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" -#: pl_exec.c:762 pl_exec.c:1033 pl_exec.c:1191 +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "関数を抜ける際" -#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "RETURN が現れる前に、制御がトリガープロシージャの終わりに達しました" -#: pl_exec.c:1038 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "トリガー手続きは集合値を返すことができません" -#: pl_exec.c:1077 pl_exec.c:1105 +#: 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:1237 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL関数%sの%d行目 %s" @@ -173,335 +178,339 @@ 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 +#: 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:1256 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL関数%sの%d行目 - %s" -#: pl_exec.c:1262 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL関数 %s" -#: pl_exec.c:1633 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "ステートメントブロックでローカル変数を初期化中" -#: pl_exec.c:1731 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "ステートメントブロックに入る際に" -#: pl_exec.c:1763 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "ステートメントブロックを抜ける際に" -#: pl_exec.c:1801 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "例外をクリーンアップする際に" -#: pl_exec.c:2334 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" -msgstr "プロシージャのパラメータ\"%s\"は出力パラメータですが、対応する引数が書き込み不可です" +msgstr "プロシージャのパラメータ\"%s\"は出力パラメータですが対応する引数が書き込み不可です" -#: pl_exec.c:2339 +#: pl_exec.c:2365 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" -msgstr "プロシージャのパラメータ%dは出力パラメータですが、対応する引数が書き込み不可です" +msgstr "プロシージャのパラメータ%dは出力パラメータですが対応する引数が書き込み不可です" -#: pl_exec.c:2373 +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS は例外ハンドラの外では使えません" -#: pl_exec.c:2573 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "case が見つかりません" -#: pl_exec.c:2574 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE ステートメントに ELSE 部分がありません" -#: pl_exec.c:2667 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR ループの下限を NULL にすることはできません" -#: pl_exec.c:2683 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR ループの上限を NULL にすることはできません" -#: pl_exec.c:2701 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR ループにおける BY の値を NULL にすることはできません" -#: pl_exec.c:2707 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR ループにおける BY の値はゼロより大きくなければなりません" -#: pl_exec.c:2841 pl_exec.c:4638 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" -msgstr "カーソル\"%s\"はすでに使われています" +msgstr "カーソル \"%s\" はすでに使われています" -#: pl_exec.c:2864 pl_exec.c:4703 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "引数なしのカーソルに引数が与えられました" -#: pl_exec.c:2883 pl_exec.c:4722 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "カーソルには引数が必要です" -#: pl_exec.c:2970 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH 式は NULL であってはなりません" -#: pl_exec.c:2985 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH 式は %s 型ではなく配列を生成しなければなりません" -#: pl_exec.c:3002 +#: 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:3029 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE ループ変数は配列型でなければなりません" -#: pl_exec.c:3033 +#: pl_exec.c:3063 #, 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 +#: 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" msgstr "複合型を返す関数から複合型以外の値を返すことはできません" -#: pl_exec.c:3291 pl_gram.y:3310 +#: pl_exec.c:3321 pl_gram.y:3319 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "SETOF でない関数では RETURN NEXT は使えません" -#: pl_exec.c:3332 pl_exec.c:3464 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "RETURN NEXT で指定されている結果の型が誤っています" -#: pl_exec.c:3370 pl_exec.c:3391 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "RETURN NEXT で指定されているレコードの型が誤っています" -#: pl_exec.c:3483 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT にはパラメーターが必要です" -#: pl_exec.c:3511 pl_gram.y:3374 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "SETOF でない関数では RETURN QUERY は使えません" -#: pl_exec.c:3529 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "問い合わせの構造が関数の結果の型と一致しません" -#: pl_exec.c:3568 pl_exec.c:5773 -#, c-format -msgid "query is SELECT INTO, but it should be plain SELECT" -msgstr "問い合わせはSELECT INTOではなく単純なSELECTである必要があります" - -#: pl_exec.c:3569 pl_exec.c:3574 pl_exec.c:5661 pl_exec.c:5673 pl_exec.c:5698 -#: pl_exec.c:5774 pl_exec.c:5779 -#, c-format -msgid "query: %s" -msgstr "問い合わせ: %s" - -#: pl_exec.c:3573 pl_exec.c:5778 -#, c-format -msgid "query is not a SELECT" -msgstr "問い合わせがSELECTではありません" - -#: pl_exec.c:3597 pl_exec.c:4416 pl_exec.c:8616 +#: 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です" +msgstr "EXECUTE の問い合わせ文字列の引数が NULL です" -#: pl_exec.c:3677 pl_exec.c:3815 +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE オプションは既に指定されています: %s" -#: pl_exec.c:3711 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "引数の無い RAISE は、例外ハンドラの外では使えません" -#: pl_exec.c:3805 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE ステートメントのオプションには NULL は指定できません" -#: pl_exec.c:3875 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3930 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "アサーションに失敗" -#: pl_exec.c:4289 pl_exec.c:4477 +#: 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 クライアントは使えません" +msgstr "PL/pgSQL 内では COPY to/from クライアントは使えません" -#: pl_exec.c:4295 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" -msgstr "PL/pgSQL内ではサポートされないトランザクションコマンド" +msgstr "PL/pgSQL 内ではサポートされないトランザクションコマンド" -#: pl_exec.c:4318 pl_exec.c:4506 +#: pl_exec.c:4346 pl_exec.c:4535 #, c-format msgid "INTO used with a command that cannot return data" -msgstr "データを返せないコマンドでINTOが使われました" +msgstr "データを返せないコマンドで INTO が使われました" -#: pl_exec.c:4341 pl_exec.c:4529 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "問い合わせは行を返しませんでした" -#: pl_exec.c:4363 pl_exec.c:4548 pl_exec.c:5697 +#: 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:4365 +#: 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:4381 +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "問い合わせに結果データの返却先が指定されていません" -#: pl_exec.c:4382 +#: pl_exec.c:4410 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." -msgstr "SELECTの結果を破棄したい場合は、代わりにPERFORMを使ってください" +msgstr "SELECT の結果を破棄したい場合、代わりに PERFORM を使ってください" -#: pl_exec.c:4469 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" -msgstr "SELECT ... INTOのEXECUTEは実装されていません" +msgstr "SELECT ... INTO の EXECUTE は実装されていません" -#: pl_exec.c:4470 +#: 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 が使えます。" -#: pl_exec.c:4483 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "トランザクションコマンドのEXECUTEは実装されていません" -#: pl_exec.c:4784 pl_exec.c:4872 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" -msgstr "カーソル変数\"%s\"がNULLです" +msgstr "カーソル変数 \"%s\" が NULL です" -#: pl_exec.c:4795 pl_exec.c:4883 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" -msgstr "カーソル\"%s\"は存在しません" +msgstr "カーソル \"%s\" は存在しません" -#: pl_exec.c:4808 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" -msgstr "相対もしくは絶対カーソル位置がNULLです" +msgstr "相対もしくは絶対カーソル位置が NULL です" -#: pl_exec.c:5052 pl_exec.c:5147 +#: 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を代入できません" +msgstr "NOT NULL として宣言された変数 \"%s\" には NULL を代入できません" -#: pl_exec.c:5128 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "複合型でない値を行変数に代入できません" -#: pl_exec.c:5160 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "複合型でない値をレコード変数に代入できません" -#: pl_exec.c:5211 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" -msgstr "システム列\"%s\"には代入できません" +msgstr "システム列\"%s\"に代入できません" -#: pl_exec.c:5660 +#: pl_exec.c:5692 #, c-format msgid "query did not return data" msgstr "問い合わせがデータを返しませんでした" -#: pl_exec.c:5669 +#: 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" +msgstr "問い合わせ: %s" + +#: pl_exec.c:5701 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "問い合わせが%d個の列を返しました" -#: pl_exec.c:6588 pl_exec.c:6628 pl_exec.c:6668 +#: pl_exec.c:5805 +#, c-format +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "問い合わせはSELECT INTOですが、単純なSELECTでなければなりません" + +#: pl_exec.c:5810 +#, c-format +msgid "query is not a SELECT" +msgstr "問い合わせがSELECTではありません" + +#: 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)" msgstr "パラメータの型%d(%s)が実行計画(%s)を準備する時点と一致しません" -#: pl_exec.c:7079 pl_exec.c:7113 pl_exec.c:7187 pl_exec.c:7213 +#: 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:7081 pl_exec.c:7115 pl_exec.c:7189 pl_exec.c:7215 +#: 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:7085 pl_exec.c:7119 pl_exec.c:7193 pl_exec.c:7219 +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "問い合わせはカラムの正確なリストを返却するようにしてください。" -#: pl_exec.c:7606 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" -msgstr "レコード\"%s\"にはまだ値が代入されていません" +msgstr "レコード \"%s\" にはまだ値が代入されていません" -#: pl_exec.c:7607 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "まだ代入されていないレコードのタプル構造は不定です" +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "変数\"%s\" はCONSTANTとして定義されています" + #: pl_funcs.c:237 msgid "statement block" msgstr "ステートメントブロック" @@ -512,317 +521,312 @@ msgstr "代入" #: pl_funcs.c:249 msgid "FOR with integer loop variable" -msgstr "整数のループ変数を使ったFOR" +msgstr "整数のループ変数を使った FOR" #: pl_funcs.c:251 msgid "FOR over SELECT rows" -msgstr "SELECT行を使ったFOR" +msgstr "SELECT 行を使った FOR" #: pl_funcs.c:253 msgid "FOR over cursor" -msgstr "カーソルを使ったFOR" +msgstr "カーソルを使った FOR" #: pl_funcs.c:255 msgid "FOREACH over array" -msgstr "配列を使ったFOREACH" +msgstr "配列を巡回する FOREACH" #: pl_funcs.c:269 msgid "SQL statement" -msgstr "SQL文" +msgstr "SQL ステートメント" #: pl_funcs.c:273 msgid "FOR over EXECUTE statement" -msgstr "EXECUTE文を使ったFOR" +msgstr "EXECUTE ステートメントを使った FOR" -#: pl_gram.y:485 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" -msgstr "ブロックラベルはDECLAREの後ではなく前に置かなければなりません" +msgstr "ブロックラベルは DECLARE の後ではなく前に置かなければなりません" -#: pl_gram.y:505 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" -msgstr "%s型では照合順序はサポートされません" +msgstr "%s 型では照合順序はサポートされていません" -#: pl_gram.y:524 +#: pl_gram.y:526 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "NOT NULL宣言されているため、変数\"%s\"はデフォルト値を持つ必要があります" -#: pl_gram.y:672 pl_gram.y:687 pl_gram.y:713 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" -msgstr "変数\"%s\"は存在しません" +msgstr "変数 \"%s\" は存在しません" -#: pl_gram.y:731 pl_gram.y:759 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "重複した宣言です。" -#: pl_gram.y:742 pl_gram.y:770 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" -msgstr "変数\"%s\"が事前に定義された変数を不可視にしています" +msgstr "変数 \"%s\" が事前に定義された変数を不可視にしています" -#: pl_gram.y:1042 +#: pl_gram.y:1044 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" -msgstr "GET STACKED DIAGNOSTICSでは診断項目%sは許可されていません" +msgstr "GET STACKED DIAGNOSTICS では診断項目 %s は許可されていません" -#: pl_gram.y:1060 +#: pl_gram.y:1062 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" -msgstr "GET CURRENT DIAGNOSTICSでは診断項目%sは許可されていません" +msgstr "GET CURRENT DIAGNOSTICS では診断項目 %s は許可されていません" -#: pl_gram.y:1155 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" -msgstr "GET DIAGNOSTICS項目が認識できません" +msgstr "GET DIAGNOSTICS 項目が認識できません" -#: pl_gram.y:1171 pl_gram.y:3549 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" -msgstr "\"%s\"はスカラー変数ではありません" +msgstr "\"%s\" はスカラー変数ではありません" -#: pl_gram.y:1401 pl_gram.y:1595 +#: pl_gram.y:1403 pl_gram.y:1597 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "行に対するループでのループ変数は、レコード変数またはスカラー変数のリストでなければなりません" -#: pl_gram.y:1436 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" -msgstr "カーソルを使ったFORループには、ターゲット変数が1個だけ必要です" +msgstr "カーソルを使った FOR ループには、ターゲット変数が1個だけ必要です" -#: pl_gram.y:1443 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" -msgstr "カーソルを使ったFORループでは、それに関連付けられたカーソル変数を使用しなければなりません" +msgstr "カーソルを使った FOR ループでは、それに関連付けられたカーソル変数を使用しなければなりません" -#: pl_gram.y:1534 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" -msgstr "整数を使った FOR ループには、ターゲット変数が1個だけ必要です" +msgstr "整数を使った FOR ループには、ターゲット変数が1個だけ必要です" -#: pl_gram.y:1568 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" -msgstr "問い合わせを使ったFORループの中ではREVERSEは指定できません" +msgstr "問い合わせを使った FOR ループの中では REVERSE は指定できません" -#: pl_gram.y:1698 +#: pl_gram.y:1700 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" -msgstr "FOREACHのループ変数は、既知の変数または変数のリストでなければなりません" +msgstr "FOREACH のループ変数は、既知の変数または変数のリストでなければなりません" -#: pl_gram.y:1740 +#: pl_gram.y:1742 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" -msgstr "このステートメントを囲むブロックやループに割り当てられた\"%s\"というラベルはありません。" +msgstr "このステートメントを囲むブロックやループに割り当てられた \"%s\" というラベルはありません。" -#: pl_gram.y:1748 +#: pl_gram.y:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" -msgstr "ブロックラベル\"%s\"はCONTINUEの中では使えません。" +msgstr "ブロックラベル \"%s\" は CONTINUE の中では使えません。" -#: pl_gram.y:1763 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" -msgstr "ラベルのないEXITは、ループの外では使えません" +msgstr "ラベルのない EXIT は、ループの外では使えません" -#: pl_gram.y:1764 +#: pl_gram.y:1766 #, c-format msgid "CONTINUE cannot be used outside a loop" -msgstr "CONTINUEはループの外では使えません" +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 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 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 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "構文エラー" -#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" -msgstr "無効なSQLSTATEコードです" +msgstr "無効な SQLSTATE コードです" -#: pl_gram.y:2126 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" -msgstr "構文エラー、\"FOR\"が現れるべきでした。" +msgstr "構文エラー。\"FOR\" が現れるべきでした。" -#: pl_gram.y:2187 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" -msgstr "FETCHステートメントは複数行を返せません" +msgstr "FETCH ステートメントは複数行を返せません" -#: pl_gram.y:2284 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "カーソル変数は単純変数でなければなりません" -#: pl_gram.y:2290 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" -msgstr "変数\"%s\"はcursor型またはrefcursor型でなければなりません" +msgstr "変数 \"%s\" は cursor 型または refcursor 型でなければなりません" -#: pl_gram.y:2620 pl_gram.y:2631 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" -msgstr "\"%s\"は既知の変数ではありません" +msgstr "\"%s\" は既知の変数ではありません" -#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "括弧が対応していません" -#: pl_gram.y:2751 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" -msgstr "SQL式の終わりに\"%s\"がありません" +msgstr "SQL 表現式の終わりに \"%s\" がありません" -#: pl_gram.y:2757 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" -msgstr "SQLステートメントの終わりに\"%s\"がありません" +msgstr "SQL ステートメントの終わりに \"%s\" がありません" -#: pl_gram.y:2774 +#: pl_gram.y:2781 msgid "missing expression" -msgstr "式がありません" +msgstr "表現式がありません" -#: pl_gram.y:2776 +#: pl_gram.y:2783 msgid "missing SQL statement" -msgstr "SQLステートメントがありません" +msgstr "SQL ステートメントがありません" -#: pl_gram.y:2905 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "データ型の定義が不完全です" -#: pl_gram.y:2928 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "データ型の定義がありません" -#: pl_gram.y:3006 +#: pl_gram.y:3015 msgid "INTO specified more than once" -msgstr "INTOが複数回指定されています" +msgstr "INTO が複数回指定されています" -#: pl_gram.y:3176 +#: pl_gram.y:3185 msgid "expected FROM or IN" -msgstr "FROMもしくはINが来るべきでした" +msgstr "FROM もしくは IN が来るべきでした" -#: pl_gram.y:3237 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" -msgstr "集合を返す関数では、RETURNにパラメータを指定できません" +msgstr "集合を返す関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3238 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." -msgstr "RETURN NEXTもしくはRETURN QUERYを使用してください" +msgstr "RETURN NEXT もしくは RETURN QUERY を使用してください" -#: pl_gram.y:3248 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" -msgstr "プロシージャ内のRETURNはパラメータを取ることができません" +msgstr "プロシージャないのRETURNはパラメータを取ることができません" -#: pl_gram.y:3253 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" -msgstr "void を返す関数では、RETURNにパラメータを指定できません" +msgstr "void を返す関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3262 +#: pl_gram.y:3271 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" -msgstr "OUTパラメータのない関数では、RETURNにパラメータを指定できません" +msgstr "OUT パラメータのない関数では、RETURN にパラメータを指定できません" -#: pl_gram.y:3325 +#: pl_gram.y:3334 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" -msgstr "OUTパラメータ付きの関数では、RETURN NEXTにパラメータを指定できません" +msgstr "OUT パラメータ付きの関数では、RETURN NEXT にパラメータを指定できません" -#: pl_gram.y:3433 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "変数\"%s\" はCONSTANTとして定義されています" - -#: pl_gram.y:3491 +#: pl_gram.y:3500 #, c-format msgid "record variable cannot be part of multiple-item INTO list" -msgstr "レコード変数は、複数項目を持つINTOリストでは使えません" +msgstr "レコード変数は、複数項目を持つ INTO リストでは使えません" -#: pl_gram.y:3537 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" -msgstr "INTO変数の指定が多すぎます" +msgstr "INTO 変数の指定が多すぎます" -#: pl_gram.y:3745 +#: pl_gram.y:3754 #, c-format msgid "end label \"%s\" specified for unlabeled block" -msgstr "ラベル無しブロックで終端ラベル\"%s\"が指定されました" +msgstr "終端ラベル\"%s\"がラベルなしのブロックに対して指定されました" -#: pl_gram.y:3752 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" -msgstr "終端ラベル\"%s\"がブロックのラベル\"%s\"と異なります" +msgstr "終端ラベル \"%s\" がブロックのラベル \"%s\" と異なります" -#: pl_gram.y:3786 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" -msgstr "カーソル\"%s\"に引数がありません" +msgstr "カーソル \"%s\" に引数がありません" -#: pl_gram.y:3800 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" -msgstr "カーソル\"%s\"に引数がついています" +msgstr "カーソル \"%s\" に引数がついています" -#: pl_gram.y:3842 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" -msgstr "カーソル\"%s\"に\"%s\"という名前の引数がありません" +msgstr "カーソル \"%s\" に \"%s\" という名前の引数がありません" -#: pl_gram.y:3862 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" -msgstr "カーソル\"%2$s\"のパラメータ\"%1$s\"の値が複数個指定されました" +msgstr "カーソル \"%2$s\" のパラメータ \"%1$s\" の値が複数個指定されました" -#: pl_gram.y:3887 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" -msgstr "カーソル\"%s\"の引数が不足しています" +msgstr "カーソル \"%s\" の引数が不足しています" -#: pl_gram.y:3894 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" -msgstr "カーソル\"%s\"に対する引数が多すぎます" +msgstr "カーソル \"%s\" に対する引数が多すぎます" -#: pl_gram.y:3980 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" -msgstr "RAISE文のオプションを認識できません" +msgstr "RAISE ステートメントのオプションを認識できません" -#: pl_gram.y:3984 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" -msgstr "構文エラー、\"=\"を期待していました" +msgstr "構文エラー。\"=\" を期待していました" -#: pl_gram.y:4025 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" -msgstr "RAISEに指定されたパラメーターの数が多すぎます" +msgstr "RAISE に指定されたパラメーターの数が多すぎます" -#: pl_gram.y:4029 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" -msgstr "RAISEに指定されたパラメーターの数が足りません" +msgstr "RAISE に指定されたパラメーターの数が足りません" #: pl_handler.c:156 msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." -msgstr "PL/pgSQL変数名とテーブルのカラム名の間の衝突時処理を設定します。" +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 "INTO ... STRICT 失敗時に生成されたエラーメッセージのDETAIL部分のパラメーター情報を表示します。" +msgstr "INTO ... STRICT 失敗時に生成されたエラーメッセージの DETAIL 部分のパラメーター情報を表示します。" #: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." -msgstr "ASSERTステートメントで指定されたチェックを実行します。" +msgstr "ASSERT ステートメントで指定されたチェックを実行します。" #: pl_handler.c:181 msgid "List of programming constructs that should produce a warning." @@ -836,10 +840,40 @@ msgstr "生成されたプログラムの中で、エラーを発生すべき部 #: pl_scanner.c:508 #, c-format msgid "%s at end of input" -msgstr "入力の最後に %s" +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 "\"%2$s\"またはその近辺で%1$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 にすることはできません" + +#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." +#~ msgstr "代わりに EXCEPTION 句を伴う BEGIN ブロックを使用してください" + +#~ msgid "row or record variable cannot be CONSTANT" +#~ msgstr "行またはレコード変数は CONSTANT にはできません" + +#~ msgid "row or record variable cannot be NOT NULL" +#~ msgstr "行またはレコード変数を NOT NULL にはできません" + +#~ msgid "default value for row or record variable is not supported" +#~ msgstr "行またはレコード変数のデフォルト値指定はサポートされていません" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/ka.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/ka.po new file mode 100644 index 00000000..be83a3e0 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/ka.po @@ -0,0 +1,906 @@ +# Georgian message translation file for plpgsql +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpgsql (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: plpgsql (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-02 04:39+0000\n" +"PO-Revision-Date: 2022-10-15 20:11+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1.1\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 instead გავლით შეგიძლიათ " +"გქონდეთ.." + +#: 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: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: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: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:2526 +#, c-format +msgid "" +"could not determine actual argument type for polymorphic function \"%s\"" +msgstr "" +"პოლიმორფული ფუნქციისთვის (%s) მიმდინარე არგუმენტის ტიპის დადგენა შეუძლებელია" + +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 +msgid "during initialization of execution state" +msgstr "შესრულების ინიციალიზაციისას" + +#: pl_exec.c:507 +msgid "while storing call arguments into local variables" +msgstr "გამოძახების არგუმენტების ლოკალურ ცვლადებში დამახსოვრებისას" + +#: pl_exec.c:595 pl_exec.c:1013 +msgid "during function entry" +msgstr "ფუნქციის შესვლისას" + +#: pl_exec.c:618 +#, c-format +msgid "control reached end of function without RETURN" +msgstr "კონტროლმა ფუნქციის დასასრულს RETURN-ის გარეშე მიაღწია" + +#: pl_exec.c:624 +msgid "while casting return value to function's return type" +msgstr "დაბრუნებული მნიშვნელობის ფუნქციის დაბრუნების ტიპში კასტისას" + +#: pl_exec.c:636 pl_exec.c:3665 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "" +"ფუნქცია, რომელიც სეტს აბრუნებს, გამოძახებულია კონტექსტში, რომელიც სეტებს ვერ " +"იღებს" + +#: 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:823 pl_exec.c:887 pl_exec.c:3464 +msgid "returned record type does not match expected record type" +msgstr "დაბრუნებული ჩანაწერის ტიპი მოსალოდნელი ჩანაწერის ტიპს არ ემთხვევა" + +#: pl_exec.c:1036 pl_exec.c:1194 +#, c-format +msgid "control reached end of trigger procedure without RETURN" +msgstr "კონტროლმა ტრიგერის პროცედურის დასასრულს RETURN-ის გარეშე მიაღწია" + +#: pl_exec.c:1044 +#, c-format +msgid "trigger procedure cannot return a set" +msgstr "ტრიგერი პროცედურა სეტს ვერ დააბრუნებს" + +#: 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:1252 +#, 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: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:1271 +#, c-format +msgid "PL/pgSQL function %s line %d at %s" +msgstr "PL/pgSQL ფუნქცია %s ხაზზე %d %s-სთან" + +#: pl_exec.c:1277 +#, c-format +msgid "PL/pgSQL function %s" +msgstr "PL/pgSQL ფუნქცია %s" + +#: pl_exec.c:1648 +msgid "during statement block local variable initialization" +msgstr "ოპერატორის ბლოკის ლოკალური ცვლადის ინიციალიზაციისას" + +#: pl_exec.c:1753 +msgid "during statement block entry" +msgstr "ოპერატორის ბლოკში შესვლისას" + +#: pl_exec.c:1785 +msgid "during statement block exit" +msgstr "ოპერატორის ბლოკიდან გამოსვლისას" + +#: pl_exec.c:1823 +msgid "during exception cleanup" +msgstr "გამონაკლისის მოსუფთავებისას" + +#: pl_exec.c:2360 +#, c-format +msgid "" +"procedure parameter \"%s\" is an output parameter but corresponding argument " +"is not writable" +msgstr "" +"პროცედურის პარამეტრი \"%s\" გამოტანის პარამეტრია, მაგრამ შესაბამისი " +"არგუმენტი ჩაწერადი არაა" + +#: pl_exec.c:2365 +#, c-format +msgid "" +"procedure parameter %d is an output parameter but corresponding argument is " +"not writable" +msgstr "" +"პროცედურის პარამეტრი %d გამოტანის პარამეტრია, მაგრამ შესაბამისი არგუმენტი " +"ჩაწერადი არაა" + +#: pl_exec.c:2399 +#, c-format +msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" +msgstr "" +"GET STACKED DIAGNOSTICS -ის გამოყენება გამონაკლისის დამმუშავებლის გარეთ " +"შეუძლებელია" + +#: pl_exec.c:2599 +#, c-format +msgid "case not found" +msgstr "შემთხვევა ნაპოვნი არაა" + +#: pl_exec.c:2600 +#, c-format +msgid "CASE statement is missing ELSE part." +msgstr "CASE ოპერატორს ELSE ნაწილი აკლია." + +#: pl_exec.c:2693 +#, c-format +msgid "lower bound of FOR loop cannot be null" +msgstr "\"FOR\" მარყუჟის ქვედა ზღვარი ნულოვანი ვერ იქნება" + +#: pl_exec.c:2709 +#, c-format +msgid "upper bound of FOR loop cannot be null" +msgstr "\"FOR\" მარყუჟის ზედა ზღვარი ნულოვანი ვერ იქნება" + +#: pl_exec.c:2727 +#, c-format +msgid "BY value of FOR loop cannot be null" +msgstr "FOR მარყუჟის BY-ის მნიშვნელობა ნულოვანი ვერ იქნება" + +#: pl_exec.c:2733 +#, c-format +msgid "BY value of FOR loop must be greater than zero" +msgstr "FOR მარყუჟის BY-ის მნიშვნელობა ნულზე მეტი უნდა იყოს" + +#: pl_exec.c:2867 pl_exec.c:4667 +#, c-format +msgid "cursor \"%s\" already in use" +msgstr "კურსორი \"%s\" უკვე გამოიყენება" + +#: pl_exec.c:2890 pl_exec.c:4737 +#, c-format +msgid "arguments given for cursor without arguments" +msgstr "კურსორისთვის გადმოცემული არგუმენტები არგუმენტების გარეშეა" + +#: pl_exec.c:2909 pl_exec.c:4756 +#, c-format +msgid "arguments required for cursor" +msgstr "კურსორისთვის საჭირო არგუმენტები" + +#: pl_exec.c:3000 +#, c-format +msgid "FOREACH expression must not be null" +msgstr "FOREACH გამოხატულება ნულოვანი ვერ იქნება" + +#: pl_exec.c:3015 +#, c-format +msgid "FOREACH expression must yield an array, not type %s" +msgstr "FOREACH გამოხატულების გამოტანა მასივი უნდა იყოს და არა %s ტიპის" + +#: 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:3059 +#, c-format +msgid "FOREACH ... SLICE loop variable must be of an array type" +msgstr "FOREACH ... SLICE მარყუჟის ცვლადი მასივის ტიპის უნდა იყოს" + +#: pl_exec.c:3063 +#, c-format +msgid "FOREACH loop variable must not be of an array type" +msgstr "FOREACH მარყუჟის ცვლადი მასივის ტიპის უნდა იყოს" + +#: 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" +msgstr "" +"ფუნქცია, რომელიც კომპოზიტურ ტიპს აბრუნებს, არაკომპოზიტურ ტიპს ვერ დააბრუნებს" + +#: pl_exec.c:3321 pl_gram.y:3319 +#, c-format +msgid "cannot use RETURN NEXT in a non-SETOF function" +msgstr "არა-SETOF ფუნქციაში RETURN NEXT-ს ვერ გამოიყენებთ" + +#: pl_exec.c:3362 pl_exec.c:3494 +#, c-format +msgid "wrong result type supplied in RETURN NEXT" +msgstr "არასწორი შედეგის ტიპი, რომელიც მიეწოდება RETURN NEXT- ში" + +#: pl_exec.c:3400 pl_exec.c:3421 +#, c-format +msgid "wrong record type supplied in RETURN NEXT" +msgstr "არასწორი ჩანაწერის ტიპი, რომელიც მიეწოდება RETURN NEXT- ში" + +#: pl_exec.c:3513 +#, c-format +msgid "RETURN NEXT must have a parameter" +msgstr "RETURN NEXT უნდა ჰქონდეს პარამეტრი" + +#: pl_exec.c:3541 pl_gram.y:3383 +#, c-format +msgid "cannot use RETURN QUERY in a non-SETOF function" +msgstr "არა-SETOF ფუნქციაში RETURN QUERY-ს ვერ გამოიყენებთ" + +#: pl_exec.c:3559 +msgid "structure of query does not match function result type" +msgstr "მოთხოვნის სტრუქტურა ფუნქციის შედეგის ტიპს არ ემთხვევა" + +#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "\"EXECUTE\"-ის მოთხოვნის სტრიქონის არგუმენტი ნულოვანია" + +#: pl_exec.c:3699 pl_exec.c:3837 +#, c-format +msgid "RAISE option already specified: %s" +msgstr "პარამეტრი RAISE უკვე მითითებულია: %s" + +#: pl_exec.c:3733 +#, c-format +msgid "RAISE without parameters cannot be used outside an exception handler" +msgstr "" +"ოპერატორ RAISE -ს გამონაკლისის დამმუშავებლის გარეთ პარამეტრების გარეშე ვერ " +"გამოიყენებთ" + +#: pl_exec.c:3827 +#, c-format +msgid "RAISE statement option cannot be null" +msgstr "RAISE ოპერატორის პარამეტრი ნულოვანი ვერ იქნება" + +#: pl_exec.c:3897 +#, c-format +msgid "%s" +msgstr "%s" + +#: pl_exec.c:3952 +#, c-format +msgid "assertion failed" +msgstr "მტკიცება ვერ მოხერხდა" + +#: pl_exec.c:4317 pl_exec.c:4506 +#, c-format +msgid "cannot COPY to/from client in PL/pgSQL" +msgstr "pl/pgSQL-ში COPY კლიენტიდან/ში შეუძლებელია" + +#: pl_exec.c:4323 +#, c-format +msgid "unsupported transaction command in PL/pgSQL" +msgstr "\"PL/pgSQL\"-ში მხარდაუჭერელი ტრანზაქციის ბრძანება" + +#: 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:4369 pl_exec.c:4558 +#, c-format +msgid "query returned no rows" +msgstr "მოთხოვნას მწკრივი არ დაუმატებია" + +#: 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:4393 +#, c-format +msgid "Make sure the query returns a single row, or use LIMIT 1." +msgstr "დარწმუნდით, რომ მოთხოვნა ერთ მწკრივს აბრუნებს, ან LIMIT 1 გამოიყენეთ." + +#: pl_exec.c:4409 +#, c-format +msgid "query has no destination for result data" +msgstr "მოთხოვნას არ აქვს დანიშნულების ადგილი შედეგის მონაცემებისთვის" + +#: 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:4498 +#, c-format +msgid "EXECUTE of SELECT ... INTO is not implemented" +msgstr "ბრძანება EXECUTE \"SELECT ... INTO\" განხორციელებული არაა" + +#: 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 -" +"ის გამოყენება." + +#: pl_exec.c:4512 +#, c-format +msgid "EXECUTE of transaction commands is not implemented" +msgstr "ტრანზაქციების ბრძანებების EXECUTE განხორციელებული არაა" + +#: pl_exec.c:4822 pl_exec.c:4910 +#, c-format +msgid "cursor variable \"%s\" is null" +msgstr "კურსორი ცვლადი \"%s\" ნულოვანია" + +#: pl_exec.c:4833 pl_exec.c:4921 +#, c-format +msgid "cursor \"%s\" does not exist" +msgstr "კურსორი \"%s\" არ არსებობს" + +#: pl_exec.c:4846 +#, c-format +msgid "relative or absolute cursor position is null" +msgstr "შედარებითი ან აბსოლუტური კურსორის პოზიცია ნულოვანია" + +#: pl_exec.c:5084 pl_exec.c:5179 +#, c-format +msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" +msgstr "ცვლადი \"%s\", აღწერილი, როგორც NOT NULL, ნულოვანი ვერ იქნება" + +#: pl_exec.c:5160 +#, c-format +msgid "cannot assign non-composite value to a row variable" +msgstr "მწკრივის ცვლადისთვის არაკომპოზიტური მნიშვნელობის მინიჭება შეუძლებელია" + +#: pl_exec.c:5192 +#, c-format +msgid "cannot assign non-composite value to a record variable" +msgstr "ჩანაწერის ცვლადისთვის არაკომპოზიტური მნიშვნელობის მინიჭება შეუძლებელია" + +#: pl_exec.c:5243 +#, c-format +msgid "cannot assign to system column \"%s\"" +msgstr "სისტემური სვეტზე (%s) მინიჭება შეუძლებელია" + +#: pl_exec.c:5692 +#, c-format +msgid "query did not return data" +msgstr "მოთხოვნამ მონაცემები არ დააბრუნა" + +#: 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" +msgstr "მოთხოვნა: %s" + +#: pl_exec.c:5701 +#, c-format +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "მოთხოვნამ %d სვეტი დააბრუნა" +msgstr[1] "მოთხოვნამ %d სვეტი დააბრუნა" + +#: pl_exec.c:5805 +#, c-format +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "მოთხოვნა SELECT INTO-ა, როცა ის უბრალოდ SELECT-ი უნდა იყოს" + +#: pl_exec.c:5810 +#, c-format +msgid "query is not a SELECT" +msgstr "მოთხოვნა SELECT-ი არაა" + +#: 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)" +msgstr "" +"პარამეტრის %d (%s) ტიპი არ ემთხვევა იმას, რომლითაც გეგმა მზადდებოდა (%s)" + +#: 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:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 +#, c-format +msgid "%s check of %s is active." +msgstr "აქტიურია %s შემოწმება %s -დან." + +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#, c-format +msgid "Make sure the query returns the exact list of columns." +msgstr "დარწმუნდით, რომ მოთხოვნა სვეტების ზუსტ ჩამონათვალს აბრუნებს." + +#: pl_exec.c:7638 +#, c-format +msgid "record \"%s\" is not assigned yet" +msgstr "ჩანაწერი %s ჯერ მიუნიჭებელია" + +#: pl_exec.c:7639 +#, c-format +msgid "The tuple structure of a not-yet-assigned record is indeterminate." +msgstr "" +"ჩანაწერის , რომელსაც მნიშვნელობა ჯერ მინიჭებული არ აქვს, კორტეჟის სტრუქტურა " +"გაურკვეველია." + +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "ცვლადი \"%s\" გამოცხადდა, როგორც CONSTANT" + +#: 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-ის მწკრივებზე" + +#: 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:487 +#, c-format +msgid "block label must be placed before DECLARE, not after" +msgstr "ბლოკის ჭდე DECLARE-მდე უნდა იყოს განთავსებული და არა შემდეგ" + +#: pl_gram.y:507 +#, c-format +msgid "collations are not supported by type %s" +msgstr "ტიპს \"%s\" კოლაციების მხარდაჭერა არ გააჩნია" + +#: pl_gram.y:526 +#, c-format +msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" +msgstr "" +"ცვლადისთვის \"%s\" ნაგულისხმები მნიშვნელობის ქონა აუცილებელია, რადგან ის " +"აღწერილია, როგორც NOT NULL" + +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "ცვლადი \"%s\" არ არსებობს" + +#: pl_gram.y:733 pl_gram.y:761 +msgid "duplicate declaration" +msgstr "დუბლირებული აღწერა" + +#: pl_gram.y:744 pl_gram.y:772 +#, c-format +msgid "variable \"%s\" shadows a previously defined variable" +msgstr "ცვლადი \"%s\" ადრე განსაზღვრულ ცვლადს ჩრდილავს" + +#: pl_gram.y:1044 +#, c-format +msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" +msgstr "დიაგნოსტიკის ჩანაწერი %s GET STACKED DIAGNOSTICS- ში დაშვებული არაა" + +#: pl_gram.y:1062 +#, c-format +msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" +msgstr "დიაგნოსტიკის ჩანაწერი %s GET CURRENT DIAGNOSTICS- ში დაშვებული არაა" + +#: pl_gram.y:1157 +msgid "unrecognized GET DIAGNOSTICS item" +msgstr "\"GET DIAGNOSTICS\"-ის უცნობი ჩანაწერი" + +#: pl_gram.y:1173 pl_gram.y:3558 +#, c-format +msgid "\"%s\" is not a scalar variable" +msgstr "\"%s\" სკალარული ცვლადი არაა" + +#: pl_gram.y:1403 pl_gram.y:1597 +#, c-format +msgid "" +"loop variable of loop over rows must be a record variable or list of scalar " +"variables" +msgstr "" +"კორტეჟის მარყუჟი ცვლადი ჩანაწერის ცვლადის ან სკალარული ცვლადების სიის ტიპის " +"უნდა იყოს" + +#: pl_gram.y:1438 +#, c-format +msgid "cursor FOR loop must have only one target variable" +msgstr "cursor FOR მარყუჟს მხოლოდ ერთი სამიზნე ცვლადი უნდა ჰქონდეს" + +#: pl_gram.y:1445 +#, c-format +msgid "cursor FOR loop must use a bound cursor variable" +msgstr "cursor FOR მარყუჟმა მხოლოდ bound cursor ცვლადები უნდა გამოიყენოს" + +#: pl_gram.y:1536 +#, c-format +msgid "integer FOR loop must have only one target variable" +msgstr "integer for loop მხოლოდ ერთი სამიზნე ცვლადი უნდა ჰქონდეს" + +#: pl_gram.y:1570 +#, c-format +msgid "cannot specify REVERSE in query FOR loop" +msgstr "მოთხოვნის FOR მარყუჟში REVERSE-ს ვერ მიუთითებთ" + +#: pl_gram.y:1700 +#, c-format +msgid "loop variable of FOREACH must be a known variable or list of variables" +msgstr "" +"\"FOREACH\"-ის მარყუჟი ცვლადი ცნობილი ცვლადს ან ცვლადების სიას უნდა " +"წარმოადგენდეს" + +#: pl_gram.y:1742 +#, c-format +msgid "" +"there is no label \"%s\" attached to any block or loop enclosing this " +"statement" +msgstr "" +"ბლოკში ან მარყუჟში, რომელიც ამ ოპერატორს შემოფარგლავს, ჭდე \"%s\" არ არსებობს" + +#: pl_gram.y:1750 +#, c-format +msgid "block label \"%s\" cannot be used in CONTINUE" +msgstr "ბლოკის ჭდეს \"%s\" CONTINUE-ში ვერ გამოიყენებთ" + +#: pl_gram.y:1765 +#, c-format +msgid "EXIT cannot be used outside a loop, unless it has a label" +msgstr "EXIT არ შეიძლება გამოყენებულ იქნას მარყუჟის გარეთ, თუ მას არ აქვს ჭდე" + +#: pl_gram.y:1766 +#, c-format +msgid "CONTINUE cannot be used outside a loop" +msgstr "CONTINUE-ის მარყუჟის გარეთ გამოყენება შეუძლებელია" + +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 +msgid "unexpected end of function definition" +msgstr "ფუნქციის აღწერის მოულოდნელი დასასრული" + +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 +msgid "syntax error" +msgstr "სინტაქსური შეცდომა" + +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 +msgid "invalid SQLSTATE code" +msgstr "არასწორი SQLSTATE კოდი" + +#: pl_gram.y:2132 +msgid "syntax error, expected \"FOR\"" +msgstr "სინტაქსის შეცდომა. მოველოდი \"FOR\"-ს" + +#: pl_gram.y:2193 +#, c-format +msgid "FETCH statement cannot return multiple rows" +msgstr "FETCH ოპერატორს ბევრი მწკრივის დაბრუნება არ შეუძლია" + +#: pl_gram.y:2290 +#, c-format +msgid "cursor variable must be a simple variable" +msgstr "cursor ტიპის ცვლადი მარტივი ცვლადი უნდა იყოს" + +#: pl_gram.y:2296 +#, c-format +msgid "variable \"%s\" must be of type cursor or refcursor" +msgstr "ცვლადი %s -ის ტიპი cursor ან refcursor უნდა იყოს" + +#: pl_gram.y:2627 pl_gram.y:2638 +#, c-format +msgid "\"%s\" is not a known variable" +msgstr "\"%s\" უცნობი ცვლადია" + +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 +msgid "mismatched parentheses" +msgstr "მშობლობა არ ემთხვევა" + +#: pl_gram.y:2758 +#, c-format +msgid "missing \"%s\" at end of SQL expression" +msgstr "\"SQL\" გამოსახულებას ბოლოში \"%s\" აკლია" + +#: pl_gram.y:2764 +#, c-format +msgid "missing \"%s\" at end of SQL statement" +msgstr "\"SQL\" გამოსახულებას ბოლოში \"%s\" აკლია" + +#: pl_gram.y:2781 +msgid "missing expression" +msgstr "აკლია გამოსახულება" + +#: pl_gram.y:2783 +msgid "missing SQL statement" +msgstr "აკლია SQL ოპერატორი" + +#: pl_gram.y:2912 +msgid "incomplete data type declaration" +msgstr "მონაცემის ტიპის არასრული აღწერა" + +#: pl_gram.y:2935 +msgid "missing data type declaration" +msgstr "მონაცემის ტიპის" + +#: pl_gram.y:3015 +msgid "INTO specified more than once" +msgstr "INTO ერთზე მეტჯერაა მითითებული" + +#: pl_gram.y:3185 +msgid "expected FROM or IN" +msgstr "მოველოდი FROM -ს ან IN -ს" + +#: pl_gram.y:3246 +#, c-format +msgid "RETURN cannot have a parameter in function returning set" +msgstr "RETURN-ს სეტის დამბრუნებელ ფუნქციაში პარამეტრი ვერ ექნება" + +#: pl_gram.y:3247 +#, c-format +msgid "Use RETURN NEXT or RETURN QUERY." +msgstr "გამოიყენეთ RETURN NEXT ან RETURN QUERY." + +#: pl_gram.y:3257 +#, c-format +msgid "RETURN cannot have a parameter in a procedure" +msgstr "RETURN-ს პროცედურაში პარამეტრი ვერ ექნება" + +#: pl_gram.y:3262 +#, c-format +msgid "RETURN cannot have a parameter in function returning void" +msgstr "RETURN-ს არაფრის-დამბრუნებელ ფუნქციაში პარამეტრი ვერ ექნება" + +#: pl_gram.y:3271 +#, c-format +msgid "RETURN cannot have a parameter in function with OUT parameters" +msgstr "RETURN-ს OUT პარამეტრების მქონე ფუნქციაში პარამეტრები ვერ ექნება" + +#: pl_gram.y:3334 +#, c-format +msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" +msgstr "" +"RETURN NEXT-ს პარამეტრი ფუნქციაში, რომელსაც OUT პარამეტრები აქვს, ვერ ექნება" + +#: pl_gram.y:3500 +#, c-format +msgid "record variable cannot be part of multiple-item INTO list" +msgstr "" +"ჩანაწერის ცვლადი მრავალე-ლემენტიანი INTO ჩამონათვალის ნაწილი ვერ იქნება" + +#: pl_gram.y:3546 +#, c-format +msgid "too many INTO variables specified" +msgstr "მითითებულია მეტისმეტი INTO ცვლადი" + +#: pl_gram.y:3754 +#, c-format +msgid "end label \"%s\" specified for unlabeled block" +msgstr "უჭდეო ბლოკისთვის მითითებულია საბოლოო ჭდე \"%s\"" + +#: pl_gram.y:3761 +#, c-format +msgid "end label \"%s\" differs from block's label \"%s\"" +msgstr "საბოლოო ჭდე \"%s\" განსხვავდება ბლოკის ჭდისგან \"%s\"" + +#: pl_gram.y:3795 +#, c-format +msgid "cursor \"%s\" has no arguments" +msgstr "კურსორს %s არგუმენტები არ გააჩნია" + +#: pl_gram.y:3809 +#, c-format +msgid "cursor \"%s\" has arguments" +msgstr "კურსორს %s აქვს არგუმენტები" + +#: pl_gram.y:3851 +#, c-format +msgid "cursor \"%s\" has no argument named \"%s\"" +msgstr "კურსორს %s არგუმენტი სახელად %s არ გააჩნია" + +#: pl_gram.y:3871 +#, c-format +msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" +msgstr "" +"კურსორის \"%2$s\" პარამეტრის \"%1$s\" მნიშვნელობა ერთზე მეტჯერაა მითითებული" + +#: pl_gram.y:3896 +#, c-format +msgid "not enough arguments for cursor \"%s\"" +msgstr "არასაკმარისი არგუმენტები კურსორისთვის \"%s\"" + +#: pl_gram.y:3903 +#, c-format +msgid "too many arguments for cursor \"%s\"" +msgstr "ძალიან ბევრი არგუმენტი კურსორისთვის \"%s\"" + +#: pl_gram.y:3989 +msgid "unrecognized RAISE statement option" +msgstr "\"RAISE\" ოპერატორის უცნობი პარამეტრი" + +#: pl_gram.y:3993 +msgid "syntax error, expected \"=\"" +msgstr "სინტაქსის შეცდომა. მოველოდი \"=\"-ს" + +#: pl_gram.y:4034 +#, c-format +msgid "too many parameters specified for RAISE" +msgstr "ძალიან ბევრი პარამეტრი მითითებულია RAISE- სთვის" + +#: pl_gram.y:4038 +#, 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 "" +"INTO … STRICT ავარიებზე გენერირებული შეცდომის შეტყობინებებში პარამეტრების " +"შესახებ ინფორმაციის DETAIL ნაწილში დამატება." + +#: 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\"-სთან ან ახლოს" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/ko.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/ko.po index e1397d11..3b4b5271 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/ko.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/ko.po @@ -4,10 +4,10 @@ # Ioseph Kim , 2010 msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 13\n" +"Project-Id-Version: plpgsql (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:38+0000\n" -"PO-Revision-Date: 2020-10-06 16:39+0900\n" +"POT-Creation-Date: 2023-04-12 00:39+0000\n" +"PO-Revision-Date: 2023-04-06 10:03+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -16,113 +16,118 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\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 "이벤트 트리거 함수는 선언된 인자(declare argument)를 사용할 수 없음" -#: 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: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:1793 +#: pl_comp.c:1818 #, c-format msgid "relation \"%s\" does not exist" msgstr "\"%s\" 이름의 릴레이션(relation)이 없습니다" -#: 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\" 는 오로지 shell 에만 있습니다. " -#: pl_comp.c:2162 pl_exec.c:7050 +#: pl_comp.c:2204 pl_exec.c:6907 #, 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:2534 #, 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:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "실행 상태를 초기화하는 동안" -#: pl_exec.c:504 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "호출 인수를 로컬 변수에 저장하는 동안" -#: pl_exec.c:592 pl_exec.c:1008 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "함수를 시작하는 동안" -#: pl_exec.c:617 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "컨트롤이 RETURN 없이 함수 끝에 도달함" @@ -131,32 +136,37 @@ msgstr "컨트롤이 RETURN 없이 함수 끝에 도달함" 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:3665 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "set-values 함수(테이블 리턴 함수)가 set 정의 없이 사용되었습니다 (테이블과 해" "당 열 alias 지정하세요)" -#: pl_exec.c:763 pl_exec.c:1037 pl_exec.c:1198 +#: pl_exec.c:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, 이 구문에서는 허용되지 않습니다" + +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "함수를 종료하는 동안" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3498 +#: 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:1033 pl_exec.c:1194 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "컨트롤이 RETURN 없이 트리거 프로시저 끝에 도달함" -#: pl_exec.c:1042 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "트리거 프로시저는 집합을 반환할 수 없음" -#: pl_exec.c:1081 pl_exec.c:1109 +#: pl_exec.c:1083 pl_exec.c:1111 msgid "" "returned row structure does not match the structure of the triggering table" msgstr "반환된 행 구조가 트리거하는 테이블의 구조와 일치하지 않음" @@ -164,7 +174,7 @@ msgstr "반환된 행 구조가 트리거하는 테이블의 구조와 일치하 #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1244 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL 함수 \"%s\" 의 %d번째 줄 %s" @@ -172,354 +182,349 @@ 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: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:1263 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL 함수 \"%s\" 의 %d번째 %s" -#: pl_exec.c:1269 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL 함수 %s" -#: pl_exec.c:1607 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "문 블록 로컬 변수를 초기화하는 동안" -#: pl_exec.c:1705 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "문 블록을 시작하는 동안" -#: pl_exec.c:1737 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "문 블록을 종료하는 동안" -#: pl_exec.c:1775 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "예외를 정리하는 동안" -#: pl_exec.c:2304 +#: pl_exec.c:2360 #, c-format msgid "" "procedure parameter \"%s\" is an output parameter but corresponding argument " "is not writable" msgstr "\"%s\" 프로시져 인자는 출력 인자인데, 값 변경이 불가능 함" -#: pl_exec.c:2309 +#: pl_exec.c:2365 #, c-format msgid "" "procedure parameter %d is an output parameter but corresponding argument is " "not writable" msgstr "%d 프로시져 인자는 출력 인자인데, 값 변경이 불가능 함" -#: pl_exec.c:2437 +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS 구문은 예외처리 헨들러 밖에서 사용할 수 없음" -#: pl_exec.c:2637 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "사례를 찾지 못함" -#: pl_exec.c:2638 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE 문에 ELSE 부분이 누락되었습니다." -#: pl_exec.c:2731 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR 루프의 하한은 null일 수 없음" -#: pl_exec.c:2747 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR 루프의 상한은 null일 수 없음" -#: pl_exec.c:2765 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR 루프의 BY 값은 null일 수 없음" -#: pl_exec.c:2771 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR 루프의 BY 값은 0보다 커야 함" -#: pl_exec.c:2905 pl_exec.c:4632 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "\"%s\" 커서가 이미 사용 중임" -#: pl_exec.c:2928 pl_exec.c:4697 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "인수가 없는 커서에 인수가 제공됨" -#: pl_exec.c:2947 pl_exec.c:4716 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "커서에 인수 필요" -#: pl_exec.c:3034 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH 구문은 null 이 아니여야 함" -#: pl_exec.c:3049 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH 구문에서는 배열이 사용됩니다. 사용된 자료형 %s" -#: pl_exec.c:3066 +#: pl_exec.c:3032 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "slice dimension (%d) 값이 범위를 벗어남, 0..%d" -#: pl_exec.c:3093 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE 루프 변수는 배열 자료형이어야 함" -#: pl_exec.c:3097 +#: pl_exec.c:3063 #, 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:3225 pl_exec.c:3282 pl_exec.c:3457 #, c-format msgid "" "cannot return non-composite value from function returning composite type" msgstr "" "함수의 반환값이 복합 자료형인데, 복합 자료형아닌 자료형을 반환하려고 함" -#: pl_exec.c:3355 pl_gram.y:3309 +#: pl_exec.c:3321 pl_gram.y:3319 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "SETOF 함수가 아닌 함수에서 RETURN NEXT를 사용할 수 없음" -#: pl_exec.c:3396 pl_exec.c:3528 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "RETURN NEXT에 잘못된 결과 형식이 제공됨" -#: pl_exec.c:3434 pl_exec.c:3455 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "RETURN NEXT에 잘못된 레코드 형식이 제공됨" -#: pl_exec.c:3547 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT에 매개 변수 필요" -#: pl_exec.c:3573 pl_gram.y:3373 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "SETOF 함수가 아닌 함수에서 RETURN QUERY를 사용할 수 없음" -#: pl_exec.c:3597 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "쿼리 구조가 함수 결과 형식과 일치하지 않음" -#: pl_exec.c:3681 pl_exec.c:3819 +#: 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:3715 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "매개 변수 없는 RAISE를 예외 처리기 외부에 사용할 수 없음" -#: pl_exec.c:3809 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE 문 옵션이 null일 수 없음" -#: pl_exec.c:3879 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3934 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "assertion 실패" -#: pl_exec.c:4281 pl_exec.c:4471 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "PL/pgSQL의 클라이언트와 상호 복사할 수 없음" -#: pl_exec.c:4287 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "PL/pgSQL 안에서는 지원하지 않는 트랜잭션 명령" -#: pl_exec.c:4310 pl_exec.c:4500 +#: 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:4333 pl_exec.c:4523 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "쿼리에서 행을 반환하지 않음" -#: pl_exec.c:4355 pl_exec.c:4542 +#: 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:4357 +#: pl_exec.c:4393 #, 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:4409 #, c-format msgid "query has no destination for result data" msgstr "쿼리에 결과 데이터의 대상이 없음" -#: pl_exec.c:4374 +#: 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: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:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "SELECT의 EXECUTE... INTO가 구현되지 않음" -#: pl_exec.c:4464 +#: 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 구문을 사용하세요." -#: pl_exec.c:4477 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "트랜잭션 명령들의 EXECUTE 기능은 구현되지 않았음" -#: pl_exec.c:4778 pl_exec.c:4866 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "커서 변수 \"%s\"이(가) null임" -#: pl_exec.c:4789 pl_exec.c:4877 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "\"%s\" 이름의 커서가 없음" -#: pl_exec.c:4802 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "상대 또는 절대 커서 위치가 null임" -#: pl_exec.c:5068 pl_exec.c:5163 +#: 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:5144 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "행 변수에 비복합 값을 할당할 수 없음" -#: pl_exec.c:5176 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "레코드 변수에 비복합 값을 할당할 수 없음" -#: pl_exec.c:5227 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "시스템 열 \"%s\"에 할당할 수 없습니다." -#: pl_exec.c:5291 +#: pl_exec.c:5692 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "지정한 배열 크기(%d)가 최대치(%d)를 초과했습니다" +msgid "query did not return data" +msgstr "쿼리 실행 결과 자료가 없음" -#: pl_exec.c:5323 +#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 #, c-format -msgid "subscripted object is not an array" -msgstr "하위 스크립트 개체는 배열이 아님" +msgid "query: %s" +msgstr "쿼리: %s" -#: pl_exec.c:5361 +#: pl_exec.c:5701 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "배열 하위 스크립트로 지정하는 값으로 null 값을 사용할 수 없습니다" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "쿼리가 %d 개의 칼럼을 반환함" -#: pl_exec.c:5868 +#: pl_exec.c:5805 #, c-format -msgid "query \"%s\" did not return data" -msgstr "\"%s\" 쿼리에서 데이터를 반환하지 않음" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "쿼리는 SELECT INTO 이지만, 일반 SELECT 구문이어야 함" -#: pl_exec.c:5876 +#: pl_exec.c:5810 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "\"%s\" 쿼리가 %d 개의 칼럼을 반환함" +msgid "query is not a SELECT" +msgstr "SELECT 쿼리가 아님" -#: pl_exec.c:5904 -#, c-format -msgid "query \"%s\" returned more than one row" -msgstr "\"%s\" 쿼리에서 두 개 이상의 행을 반환함" - -#: pl_exec.c:5967 -#, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "\"%s\" 쿼리가 SELECT가 아님" - -#: pl_exec.c:6763 pl_exec.c:6803 pl_exec.c:6843 +#: 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)" msgstr "" "%d번째 매개 변수의 자료형(%s)이 미리 준비된 실행계획의 자료형(%s)과 다릅니다" -#: pl_exec.c:7254 pl_exec.c:7288 pl_exec.c:7362 pl_exec.c:7388 +#: 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:7256 pl_exec.c:7290 pl_exec.c:7364 pl_exec.c:7390 +#: 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 "%s 검사(해당 변수이름: %s)가 활성화 되어있습니다." -#: pl_exec.c:7260 pl_exec.c:7294 pl_exec.c:7368 pl_exec.c:7394 +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "쿼리 결과가 정확한 칼럼 목록을 반환하도록 수정하세요." -#: pl_exec.c:7781 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "\"%s\" 레코드가 아직 할당되지 않음" -#: pl_exec.c:7782 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "아직 할당되지 않은 레코드의 튜플 구조는 미정입니다." +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "\"%s\" 변수는 CONSTANT로 선언됨" + #: pl_funcs.c:237 msgid "statement block" msgstr "문 블록" @@ -552,55 +557,55 @@ msgstr "SQL 문" msgid "FOR over EXECUTE statement" msgstr "EXECUTE 문을 제어하는 FOR" -#: pl_gram.y:489 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "블록 라벨은 DECLARE 영역 앞에 있어야 함" -#: pl_gram.y:509 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" msgstr "%s 자료형은 collation 지원 안함" -#: pl_gram.y:528 +#: pl_gram.y:526 #, 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:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "\"%s\" 변수가 없음" -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "중복 선언" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "variable \"%s\" shadows a previously defined variable" -#: pl_gram.y:993 +#: pl_gram.y:1044 #, 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:1062 #, 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:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "알 수 없는 GET DIAGNOSTICS 항목" -#: pl_gram.y:1116 pl_gram.y:3553 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\"은(는) 스칼라 변수가 아님" -#: pl_gram.y:1370 pl_gram.y:1567 +#: pl_gram.y:1403 pl_gram.y:1597 #, c-format msgid "" "loop variable of loop over rows must be a record variable or list of scalar " @@ -608,211 +613,206 @@ msgid "" msgstr "" "행에 있는 루프의 루프 변수는 레코드 변수이거나 스칼라 변수의 목록이어야 함" -#: pl_gram.y:1405 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "커서 FOR 루프에 대상 변수가 한 개만 있어야 함" -#: pl_gram.y:1412 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "커서 FOR 루프는 바인딩된 커서 변수를 한 개만 사용해야 함" -#: pl_gram.y:1499 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "정수 FOR 루프에 대상 변수가 한 개만 있어야 함" -#: pl_gram.y:1537 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "쿼리 FOR 루프에 REVERSE를 지정할 수 없음" -#: pl_gram.y:1670 +#: pl_gram.y:1700 #, 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:1742 #, 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:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "CONTINUE 안에서 \"%s\" 블록 라벨을 사용할 수 없음" -#: pl_gram.y:1735 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "루프 외부에 라벨 지정 없이 EXIT 사용할 수 없음" -#: pl_gram.y:1736 +#: pl_gram.y:1766 #, 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:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 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:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "구문 오류" -#: pl_gram.y:1894 pl_gram.y:1896 pl_gram.y:2403 pl_gram.y:2405 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "잘못된 SQLSTATE 코드" -#: pl_gram.y:2096 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "구문 오류, \"FOR\" 필요" -#: pl_gram.y:2157 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH 구문은 다중 로우를 반환할 수 없음" -#: pl_gram.y:2281 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "커서 변수는 단순 변수여야 함" -#: pl_gram.y:2287 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "\"%s\" 변수는 커서 또는 ref 커서 형식이어야 함" -#: pl_gram.y:2623 pl_gram.y:2634 +#: pl_gram.y:2627 pl_gram.y:2638 #, 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:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "괄호의 짝이 맞지 않음" -#: pl_gram.y:2752 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "SQL 식 끝에 \"%s\" 누락" -#: pl_gram.y:2758 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "SQL 문 끝에 \"%s\" 누락" -#: pl_gram.y:2775 +#: pl_gram.y:2781 msgid "missing expression" msgstr "표현식 빠졌음" -#: pl_gram.y:2777 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "SQL 문이 빠졌음" -#: pl_gram.y:2905 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "불완전한 데이터 형식 선언" -#: pl_gram.y:2928 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "데이터 형식 선언 누락" -#: pl_gram.y:3006 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO가 여러 번 지정됨" -#: pl_gram.y:3175 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "FROM 또는 IN 필요" -#: pl_gram.y:3236 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "집합을 반환하는 함수에서 RETURN 구문에는 인자가 없음" -#: pl_gram.y:3237 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "RETURN NEXT 나 RETURN QUERY 구문을 사용하세요." -#: pl_gram.y:3247 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "프로시져에서는 RETURN 문의 매개 변수를 사용할 수 없음" -#: pl_gram.y:3252 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN은 void를 반환하는 함수에 매개 변수를 포함할 수 없음" -#: pl_gram.y:3261 +#: pl_gram.y:3271 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN은 OUT 매개 변수가 있는 함수에 매개 변수를 포함할 수 없음" -#: pl_gram.y:3324 +#: pl_gram.y:3334 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT는 OUT 매개 변수가 있는 함수에 매개 변수를 포함할 수 없음" -#: pl_gram.y:3432 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "\"%s\" 변수는 CONSTANT로 선언됨" - -#: pl_gram.y:3495 +#: pl_gram.y:3500 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "다중 아이템 INTO 목록의 부분으로 record 변수가 사용될 수 없음" -#: pl_gram.y:3541 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "너무 많은 INTO 변수가 지정됨" -#: pl_gram.y:3752 +#: pl_gram.y:3754 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "레이블이 없는 블록에 끝 레이블 \"%s\"이(가) 지정됨" -#: pl_gram.y:3759 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "끝 레이블 \"%s\"이(가) 블록의 \"%s\" 레이블과 다름" -#: pl_gram.y:3794 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "\"%s\" 커서에 인수가 없음" -#: pl_gram.y:3808 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "\"%s\" 커서에 인수가 있음" -#: pl_gram.y:3850 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "\"%s\" 커서는 \"%s\" 이름의 인자가 없음" -#: pl_gram.y:3870 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "\"%s\" 이름의 인자가 \"%s\" 커서에서 중복됨" -#: pl_gram.y:3895 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "\"%s\" 커서를 위한 충분하지 않은 인자" -#: pl_gram.y:3902 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "\"%s\" 커서를 위한 인자가 너무 많음" @@ -873,3 +873,19 @@ msgstr "%s, 입력 끝부분" #, c-format msgid "%s at or near \"%s\"" msgstr "%s, \"%s\" 부근" + +#, c-format +#~ msgid "array subscript in assignment must not be null" +#~ msgstr "배열 하위 스크립트로 지정하는 값으로 null 값을 사용할 수 없습니다" + +#, c-format +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "지정한 배열 크기(%d)가 최대치(%d)를 초과했습니다" + +#, c-format +#~ msgid "query \"%s\" returned more than one row" +#~ msgstr "\"%s\" 쿼리에서 두 개 이상의 행을 반환함" + +#, c-format +#~ msgid "subscripted object is not an array" +#~ msgstr "하위 스크립트 개체는 배열이 아님" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/pt_BR.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/pt_BR.po index d6b3a0b3..0152c316 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/pt_BR.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/pt_BR.po @@ -1,79 +1,81 @@ # Brazilian Portuguese message translation file for plpgsql -# Copyright (C) 2010 PostgreSQL Global Development Group +# +# Copyright (C) 2010-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Euler Taveira de Oliveira , 2010-2016. +# +# Euler Taveira , 2010-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-08-09 22:53-0300\n" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-27 13:15-0300\n" "PO-Revision-Date: 2010-07-08 17:13-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\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" -#: pl_comp.c:432 pl_handler.c:450 +#: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "funções PL/pgSQL não podem aceitar tipo %s" -#: pl_comp.c:513 +#: pl_comp.c:530 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "não pôde determinar tipo de retorno atual para função polimófica \"%s\"" -#: pl_comp.c:543 +#: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" msgstr "funções de gatilho só podem ser chamadas como gatilhos" -#: pl_comp.c:547 pl_handler.c:435 +#: pl_comp.c:564 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "funções PL/pgSQL não podem retornar tipo %s" -#: pl_comp.c:588 +#: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "funções de gatilho não podem ter argumentos declarados" -#: pl_comp.c:589 +#: pl_comp.c:605 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Os argumentos de um gatilho podem ser acessados através de TG_NARGS e TG_ARGV." -#: pl_comp.c:691 +#: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "funções de gatilho de eventos não podem ter argumentos declarados" -#: pl_comp.c:944 +#: pl_comp.c:1002 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "compilação da função PL/pgSQL \"%s\" próximo a linha %d" -#: pl_comp.c:967 +#: pl_comp.c:1025 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "nome de parâmetro \"%s\" foi especificado mais de uma vez" -#: pl_comp.c:1077 +#: pl_comp.c:1139 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "referência à coluna \"%s\" é ambígua" -#: pl_comp.c:1079 +#: pl_comp.c:1141 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Ela poderia referenciar uma variável PL/pgSQL ou uma coluna de tabela." -#: pl_comp.c:1259 pl_comp.c:1287 pl_exec.c:4395 pl_exec.c:4744 pl_exec.c:4829 -#: pl_exec.c:4920 +#: 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 "registro \"%s\" não tem campo \"%s\"" @@ -83,83 +85,93 @@ msgstr "registro \"%s\" não tem campo \"%s\"" msgid "relation \"%s\" does not exist" msgstr "relação \"%s\" não existe" -#: pl_comp.c:1927 +#: pl_comp.c:1825 pl_comp.c:1867 #, c-format -msgid "variable \"%s\" has pseudo-type %s" -msgstr "variável \"%s\" tem pseudo-tipo %s" +msgid "relation \"%s\" does not have a composite type" +msgstr "relação \"%s\" não tem um tipo composto" -#: pl_comp.c:1994 +#: pl_comp.c:1933 #, c-format -msgid "relation \"%s\" is not a table" -msgstr "relação \"%s\" não é uma tabela" +msgid "variable \"%s\" has pseudo-type %s" +msgstr "variável \"%s\" tem pseudo-tipo %s" -#: pl_comp.c:2154 +#: pl_comp.c:2122 #, c-format msgid "type \"%s\" is only a shell" msgstr "tipo \"%s\" é indefinido" -#: pl_comp.c:2243 pl_comp.c:2296 +#: pl_comp.c:2204 pl_exec.c:6907 +#, c-format +msgid "type %s is not composite" +msgstr "tipo %s não é composto" + +#: pl_comp.c:2252 pl_comp.c:2305 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "condição de exceção \"%s\" é desconhecida" -#: pl_comp.c:2503 +#: pl_comp.c:2534 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "não pôde determinar tipo do argumento atual para função polimórfica \"%s\"" -#: pl_exec.c:324 pl_exec.c:612 pl_exec.c:872 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "durante inicialização de estado de execução" -#: pl_exec.c:331 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "ao armazenar argumentos em variáveis locais" -#: pl_exec.c:416 pl_exec.c:760 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "durante entrada da função" -#: pl_exec.c:441 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "controle atingiu o fim da função sem RETURN" -#: pl_exec.c:448 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "ao converter valor de retorno para tipo de retorno da função" -#: pl_exec.c:461 pl_exec.c:2938 +#: pl_exec.c:636 pl_exec.c:3665 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "função que tem argumento do tipo conjunto foi chamada em um contexto que não pode aceitar um conjunto" -#: pl_exec.c:499 pl_exec.c:2779 -msgid "returned record type does not match expected record type" -msgstr "tipo record retornado não corresponde ao tipo record esperado" +#: pl_exec.c:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "modo de materialização é requerido, mas ele não é permitido neste contexto" -#: pl_exec.c:554 pl_exec.c:789 pl_exec.c:907 +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "durante saída da função" -#: pl_exec.c:785 pl_exec.c:903 +#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 +msgid "returned record type does not match expected record type" +msgstr "tipo record retornado não corresponde ao tipo record esperado" + +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "controle atingiu o fim da função de gatilho sem RETURN" -#: pl_exec.c:794 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "função de gatilho não pode retornar um conjunto" -#: pl_exec.c:816 +#: pl_exec.c:1083 pl_exec.c:1111 msgid "returned row structure does not match the structure of the triggering table" msgstr "estrutura de registro retornada não corresponde a estrutura da tabela que disparou o evento" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:954 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "função PL/pgSQL %s linha %d %s" @@ -167,310 +179,339 @@ msgstr "função PL/pgSQL %s linha %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:965 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s %s" msgstr "função PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:973 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "função PL/pgSQL %s linha %d em %s" -#: pl_exec.c:979 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "função PL/pgSQL %s" -#: pl_exec.c:1089 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "durante inicialização de variável local em bloco de comandos" -#: pl_exec.c:1128 -#, c-format -msgid "variable \"%s\" declared NOT NULL cannot default to NULL" -msgstr "variável \"%s\" declarada NOT NULL não pode ter valor padrão NULL" - -#: pl_exec.c:1178 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "durante entrada em bloco de comandos" -#: pl_exec.c:1199 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "durante saída em bloco de comandos" -#: pl_exec.c:1242 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "durante término de exceção" -#: pl_exec.c:1593 +#: pl_exec.c:2360 +#, c-format +msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" +msgstr "parâmetro \"%s\" do procedimento é um parâmetro de saída mas o argumento correspondente não permite escrita" + +#: pl_exec.c:2365 +#, c-format +msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" +msgstr "parâmetro %d do procedimento é um parâmetro de saída mas o argumento correspondente não permite escrita" + +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS não pode ser utilizado fora de um manipulador de exceção" -#: pl_exec.c:1789 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "case não foi encontrado" -#: pl_exec.c:1790 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "comando CASE está faltando a parte ELSE." -#: pl_exec.c:1944 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "limite inferior do laço FOR não pode ser nulo" -#: pl_exec.c:1960 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "limite superior do laço FOR não pode ser nulo" -#: pl_exec.c:1978 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "valor BY do laço FOR não pode ser nulo" -#: pl_exec.c:1984 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "valor BY do laço FOR deve ser maior do que zero" -#: pl_exec.c:2153 pl_exec.c:3912 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "cursor \"%s\" já está em uso" -#: pl_exec.c:2176 pl_exec.c:3974 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "argumentos fornecidos a cursor sem argumentos" -#: pl_exec.c:2195 pl_exec.c:3993 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "argumentos requeridos pelo cursor" -#: pl_exec.c:2280 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "expressão FOREACH não deve ser nula" -#: pl_exec.c:2286 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "expressão FOREACH deve produzir uma matriz, e não tipo %s" -#: pl_exec.c:2303 +#: pl_exec.c:3032 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "fatia da dimensão (%d) está fora do intervalo válido, 0..%d" -#: pl_exec.c:2330 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "variável do laço FOREACH ... SLICE deve ser de um tipo matriz" -#: pl_exec.c:2334 +#: pl_exec.c:3063 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "variável do laço FOREACH não deve ser de um tipo matriz" -#: pl_exec.c:2522 pl_exec.c:2604 pl_exec.c:2771 +#: 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" msgstr "não pode retornar valor não-composto de função que retorna tipo composto" -#: pl_exec.c:2648 pl_gram.y:3190 +#: pl_exec.c:3321 pl_gram.y:3319 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "não pode utilizar RETURN NEXT em uma função que não foi declarada SETOF" -#: pl_exec.c:2682 pl_exec.c:2813 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "tipo resultante incorreto foi fornecido em RETURN NEXT" -#: pl_exec.c:2711 pl_exec.c:4382 pl_exec.c:4711 pl_exec.c:4737 pl_exec.c:4803 -#: pl_exec.c:4822 pl_exec.c:4890 pl_exec.c:4913 -#, c-format -msgid "record \"%s\" is not assigned yet" -msgstr "registro \"%s\" não foi atribuído ainda" - -#: pl_exec.c:2713 pl_exec.c:4384 pl_exec.c:4713 pl_exec.c:4739 pl_exec.c:4805 -#: pl_exec.c:4824 pl_exec.c:4892 pl_exec.c:4915 -#, c-format -msgid "The tuple structure of a not-yet-assigned record is indeterminate." -msgstr "A estrutura da tupla de um registro não atribuído é indeterminada." - -#: pl_exec.c:2717 pl_exec.c:2737 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "tipo registro incorreto foi fornecido em RETURN NEXT" -#: pl_exec.c:2832 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT deve ter um parâmetro" -#: pl_exec.c:2865 pl_gram.y:3252 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "não pode utilizar RETURN QUERY em uma função que não foi declarada SETOF" -#: pl_exec.c:2886 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "estrutura da consulta não corresponde ao tipo resultante da função" -#: pl_exec.c:2966 pl_exec.c:3096 +#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "argumento da cadeia de caracteres do EXECUTE é nulo" + +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "opção RAISE já foi especificada: %s" -#: pl_exec.c:2999 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE sem parâmetros não pode ser utilizado fora de um manipulador de exceção" -#: pl_exec.c:3086 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "opção do comando RAISE não pode ser nulo" -#: pl_exec.c:3155 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3226 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "asserção falhou" -#: pl_exec.c:3418 pl_exec.c:3562 pl_exec.c:3751 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "não pode executar COPY para/do cliente em PL/pgSQL" -#: pl_exec.c:3422 pl_exec.c:3566 pl_exec.c:3755 -#, c-format -msgid "cannot begin/end transactions in PL/pgSQL" -msgstr "não pode iniciar/terminar transações em PL/pgSQL" - -#: pl_exec.c:3423 pl_exec.c:3567 pl_exec.c:3756 +#: pl_exec.c:4323 #, c-format -msgid "Use a BEGIN block with an EXCEPTION clause instead." -msgstr "Ao invés disso utilize um bloco BEGIN com uma cláusula EXCEPTION." +msgid "unsupported transaction command in PL/pgSQL" +msgstr "comando de controle de transação não é suportado em PL/pgSQL" -#: pl_exec.c:3590 pl_exec.c:3780 +#: pl_exec.c:4346 pl_exec.c:4535 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO utilizado com um comando que não pode retornar dados" -#: pl_exec.c:3618 pl_exec.c:3808 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "consulta não retornou registros" -#: pl_exec.c:3637 pl_exec.c:3827 +#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 #, c-format msgid "query returned more than one row" msgstr "consulta retornou mais de um registro" -#: pl_exec.c:3654 +#: pl_exec.c:4393 +#, c-format +msgid "Make sure the query returns a single row, or use LIMIT 1." +msgstr "Certifique-se que a consulta retorna um único registro, ou utilize LIMIT 1." + +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "consulta não tem destino para os dados resultantes" -#: pl_exec.c:3655 +#: pl_exec.c:4410 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Se você quer descartar os resultados de um SELECT, utilize PERFORM." -#: pl_exec.c:3687 pl_exec.c:7128 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "argumento da cadeia de caracteres do EXECUTE é nulo" - -#: pl_exec.c:3743 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE de SELECT ... INTO não está implementado" -#: pl_exec.c:3744 +#: pl_exec.c:4499 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Ao invés disso, você pode querer utilizar EXECUTE ... INTO ou EXECUTE CREATE TABLE ... AS." -#: pl_exec.c:4056 pl_exec.c:4148 +#: pl_exec.c:4512 +#, c-format +msgid "EXECUTE of transaction commands is not implemented" +msgstr "EXECUTE de comandos de controle de transação não está implementado" + +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "variável do cursor \"%s\" é nula" -#: pl_exec.c:4063 pl_exec.c:4155 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "cursor \"%s\" não existe" -#: pl_exec.c:4077 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "posição relativa ou absoluta do cursor é nula" -#: pl_exec.c:4257 +#: pl_exec.c:5084 pl_exec.c:5179 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "valor nulo não pode ser atribuído a variável \"%s\" declarada NOT NULL" -#: pl_exec.c:4326 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "não pode atribuir valor que não é composto a variável do tipo row" -#: pl_exec.c:4350 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "não pode atribuir valor que não é composto a variável do tipo record" -#: pl_exec.c:4493 +#: pl_exec.c:5243 +#, c-format +msgid "cannot assign to system column \"%s\"" +msgstr "não pode atribuir a coluna do sistema \"%s\"" + +#: pl_exec.c:5692 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "número de dimensões da matriz (%d) excede o máximo permitido (%d)" +msgid "query did not return data" +msgstr "consulta não retornou dados" -#: pl_exec.c:4525 +#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 #, c-format -msgid "subscripted object is not an array" -msgstr "objeto com índice não é uma matriz" +msgid "query: %s" +msgstr "consulta: %s" -#: pl_exec.c:4562 +#: pl_exec.c:5701 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "índice da matriz em atribuição não deve ser nulo" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "consulta retornou %d coluna" +msgstr[1] "consulta retornou %d colunas" -#: pl_exec.c:5029 +#: pl_exec.c:5805 #, c-format -msgid "query \"%s\" did not return data" -msgstr "consulta \"%s\" não retornou dados" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "consulta é SELECT INTO mas ela deveria ser um SELECT" -#: pl_exec.c:5037 +#: pl_exec.c:5810 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "consulta \"%s\" retornou %d coluna" -msgstr[1] "consulta \"%s\" retornou %d colunas" +msgid "query is not a SELECT" +msgstr "consulta não é um SELECT" -#: pl_exec.c:5064 +#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "consulta \"%s\" retornou mais do que um registro" +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "tipo de parâmetro %d (%s) não corresponde aquele ao preparar o plano (%s)" -#: pl_exec.c:5128 +#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "consulta \"%s\" não é um SELECT" +msgid "number of source and target fields in assignment does not match" +msgstr "número de campos de fonte e alvo na atribuição não correspondem" + +#. translator: %s represents a name of an extra check +#: 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 "verificação %s de %s está ativa." + +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#, c-format +msgid "Make sure the query returns the exact list of columns." +msgstr "Certifique-se que se a consulta retorna a lista exata de colunas." + +#: pl_exec.c:7638 +#, c-format +msgid "record \"%s\" is not assigned yet" +msgstr "registro \"%s\" não foi atribuído ainda" + +#: pl_exec.c:7639 +#, c-format +msgid "The tuple structure of a not-yet-assigned record is indeterminate." +msgstr "A estrutura da tupla de um registro não atribuído é indeterminada." + +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "variável \"%s\" está declarada CONSTANT" #: pl_funcs.c:237 msgid "statement block" @@ -504,317 +545,307 @@ msgstr "comando SQL" msgid "FOR over EXECUTE statement" msgstr "FOR sobre comando EXECUTE" -#: pl_gram.y:474 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "rótulo de bloco deve estar localizado antes do DECLARE e não depois" -#: pl_gram.y:494 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" msgstr "ordenações não são suportadas pelo tipo %s" -#: pl_gram.y:509 -#, c-format -msgid "row or record variable cannot be CONSTANT" -msgstr "variável do tipo row ou record não pode ser CONSTANT" - -#: pl_gram.y:519 -#, c-format -msgid "row or record variable cannot be NOT NULL" -msgstr "variável do tipo row ou record não pode ser NOT NULL" - -#: pl_gram.y:530 +#: pl_gram.y:526 #, c-format -msgid "default value for row or record variable is not supported" -msgstr "valor padrão para variável do tipo row ou record não é suportado" +msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" +msgstr "variável \"%s\" deve ter um valor padrão, pois ela foi declarada NOT NULL" -#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "variável \"%s\" não existe" -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "declaração duplicada" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "variável \"%s\" esconde uma variável previamente definida" -#: pl_gram.y:952 +#: pl_gram.y:1044 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "item de diagnóstico %s não é permitido em GET STACKED DIAGNOSTICS" -#: pl_gram.y:970 +#: pl_gram.y:1062 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "item de diagnóstico %s não é permitido em GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1068 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "item de GET DIAGNOSTICS desconhecido" -#: pl_gram.y:1079 pl_gram.y:3439 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" não é uma variável escalar" -#: pl_gram.y:1331 pl_gram.y:1525 +#: pl_gram.y:1403 pl_gram.y:1597 #, c-format -msgid "loop variable of loop over rows must be a record or row variable or list of scalar variables" +msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "variável de laço sobre registros deve ser uma variável do tipo record ou row ou lista de variáveis escalares" -#: pl_gram.y:1365 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "cursor do laço FOR deve ter somente uma variável alvo" -#: pl_gram.y:1372 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "cursor do laço FOR deve utilizar uma variável cursor limitado" -#: pl_gram.y:1456 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "inteiro do laço FOR deve ter somente uma variável alvo" -#: pl_gram.y:1492 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "não pode especificar REVERSE na consulta do laço FOR" -#: pl_gram.y:1639 +#: pl_gram.y:1700 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "variável do laço FOEACH deve ser uma variável ou lista de variáveis conhecida" -#: pl_gram.y:1680 +#: pl_gram.y:1742 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "não há rótulo \"%s\" ligado a qualquer bloco ou laço que contém este comando" -#: pl_gram.y:1688 +#: pl_gram.y:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "rótulo de bloco \"%s\" não pode ser utilizado no CONTINUE" -#: pl_gram.y:1703 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT não pode ser utilizado fora de um laço, a menos que ele tenha um rótulo" -#: pl_gram.y:1704 +#: pl_gram.y:1766 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE não pode ser utilizado fora de um laço" -#: pl_gram.y:1728 pl_gram.y:1765 pl_gram.y:1813 pl_gram.y:2889 pl_gram.y:2974 -#: pl_gram.y:3085 pl_gram.y:3841 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 msgid "unexpected end of function definition" msgstr "fim de definição da função inesperado" -#: pl_gram.y:1833 pl_gram.y:1857 pl_gram.y:1873 pl_gram.y:1879 pl_gram.y:1997 -#: pl_gram.y:2005 pl_gram.y:2019 pl_gram.y:2114 pl_gram.y:2295 pl_gram.y:2389 -#: pl_gram.y:2541 pl_gram.y:3682 pl_gram.y:3743 pl_gram.y:3822 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "erro de sintaxe" -#: pl_gram.y:1861 pl_gram.y:1863 pl_gram.y:2299 pl_gram.y:2301 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "código SQLSTATE inválido" -#: pl_gram.y:2061 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "erro de sintaxe, \"FOR\" esperado" -#: pl_gram.y:2123 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "comando FETCH não pode retornar múltiplos registros" -#: pl_gram.y:2179 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "variável do cursor deve ser uma variável simples" -#: pl_gram.y:2185 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "variável \"%s\" deve ser do tipo cursor ou refcursor" -#: pl_gram.y:2512 pl_gram.y:2523 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" não é uma variável conhecida" -#: pl_gram.y:2627 pl_gram.y:2637 pl_gram.y:2793 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "parênteses não correspondem" -#: pl_gram.y:2641 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "faltando \"%s\" ao fim da expressão SQL" -#: pl_gram.y:2647 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "faltando \"%s\" ao fim do comando SQL" -#: pl_gram.y:2664 +#: pl_gram.y:2781 msgid "missing expression" msgstr "faltando expressão" -#: pl_gram.y:2666 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "faltando comando SQL" -#: pl_gram.y:2795 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "declaração de tipo de dado incompleta" -#: pl_gram.y:2818 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "faltando declaração de tipo de dado" -#: pl_gram.y:2897 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO especificado mais de uma vez" -#: pl_gram.y:3066 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "FROM ou IN esperado" -#: pl_gram.y:3126 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN não pode ter um parâmetro na função que retorna conjunto" -#: pl_gram.y:3127 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Utilize RETURN NEXT ou RETURN QUERY." -#: pl_gram.y:3135 +#: pl_gram.y:3257 #, c-format -msgid "RETURN cannot have a parameter in function with OUT parameters" -msgstr "RETURN não pode ter um parâmetro na função com parâmetros OUT" +msgid "RETURN cannot have a parameter in a procedure" +msgstr "RETURN não pode ter um parâmetro no procedimento" -#: pl_gram.y:3144 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN não pode ter um parâmetro na função que retorna void" -#: pl_gram.y:3204 +#: pl_gram.y:3271 #, c-format -msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" -msgstr "RETURN NEXT não pode ter um parâmetro na função com parâmetros OUT" +msgid "RETURN cannot have a parameter in function with OUT parameters" +msgstr "RETURN não pode ter um parâmetro na função com parâmetros OUT" -#: pl_gram.y:3308 +#: pl_gram.y:3334 #, c-format -msgid "\"%s\" is declared CONSTANT" -msgstr "\"%s\" está declarado CONSTANT" +msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" +msgstr "RETURN NEXT não pode ter um parâmetro na função com parâmetros OUT" -#: pl_gram.y:3370 pl_gram.y:3382 +#: pl_gram.y:3500 #, c-format -msgid "record or row variable cannot be part of multiple-item INTO list" -msgstr "variável do tipo record ou row não pode ser parte de uma lista INTO de múltiplos itens" +msgid "record variable cannot be part of multiple-item INTO list" +msgstr "variável do tipo record não pode ser parte de uma lista INTO de múltiplos itens" -#: pl_gram.y:3427 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "muitas variáveis INTO especificadas" -#: pl_gram.y:3635 +#: pl_gram.y:3754 #, c-format -msgid "end label \"%s\" specified for unlabelled block" +msgid "end label \"%s\" specified for unlabeled block" msgstr "rótulo de fim \"%s\" especificado para bloco sem rótulo" -#: pl_gram.y:3642 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "rótulo de fim \"%s\" difere de rótulo do bloco \"%s\"" -#: pl_gram.y:3677 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "cursor \"%s\" não tem argumentos" -#: pl_gram.y:3691 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "cursor \"%s\" tem argumentos" -#: pl_gram.y:3733 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "cursor \"%s\" não tem argumento chamado \"%s\"" -#: pl_gram.y:3753 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "valor para parâmetro \"%s\" do cursor \"%s\" foi especificado mais de uma vez" -#: pl_gram.y:3778 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "argumentos insuficientes para cursor \"%s\"" -#: pl_gram.y:3785 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "muitos argumentos para cursor \"%s\"" -#: pl_gram.y:3873 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" msgstr "opção do comando RAISE desconhecida" -#: pl_gram.y:3877 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" msgstr "erro de sintaxe, \"=\" esperado" -#: pl_gram.y:3918 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" msgstr "muitos parâmetros especificados para RAISE" -#: pl_gram.y:3922 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" msgstr "poucos parâmetros especificados para RAISE" -#: pl_handler.c:151 +#: pl_handler.c:156 msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." msgstr "Define resolução de conflitos entre nomes de variáveis PL/pgSQL e nomes de colunas de tabelas." -#: pl_handler.c:160 +#: pl_handler.c:165 msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." msgstr "Mostra informação sobre parâmetros na parte DETALHE das mensagens de erro geradas nas falhas INTO ... STRICT." -#: pl_handler.c:168 +#: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." msgstr "Realiza verificações informadas em comandos ASSERT." -#: pl_handler.c:176 +#: pl_handler.c:181 msgid "List of programming constructs that should produce a warning." msgstr "Lista de construções de programação que devem produzir um aviso." -#: pl_handler.c:186 +#: pl_handler.c:191 msgid "List of programming constructs that should produce an error." msgstr "Lista de construções de programação que devem produzir um erro." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:622 +#: pl_scanner.c:508 #, c-format msgid "%s at end of input" msgstr "%s no fim da entrada" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:638 +#: pl_scanner.c:524 #, c-format msgid "%s at or near \"%s\"" msgstr "%s em ou próximo a \"%s\"" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/ru.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/ru.po index 560d4949..a1a17a00 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/ru.po +++ b/third_party/spanner_pg/src/pl/plpgsql/src/po/ru.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-03 05:56+0300\n" -"PO-Revision-Date: 2021-09-04 12:39+0300\n" +"POT-Creation-Date: 2024-02-02 18:11+0300\n" +"PO-Revision-Date: 2022-09-05 13:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -78,8 +78,8 @@ msgstr "неоднозначная ссылка на столбец \"%s\"" msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Подразумевается ссылка на переменную PL/pgSQL или столбец таблицы." -#: pl_comp.c:1324 pl_exec.c:5199 pl_exec.c:5372 pl_exec.c:5459 pl_exec.c:5550 -#: pl_exec.c:6571 +#: pl_comp.c:1324 pl_exec.c:5249 pl_exec.c:5422 pl_exec.c:5509 pl_exec.c:5600 +#: pl_exec.c:6621 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "в записи \"%s\" нет поля \"%s\"" @@ -104,7 +104,7 @@ msgstr "переменная \"%s\" имеет псевдотип %s" msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" является пустышкой" -#: pl_comp.c:2204 pl_exec.c:6872 +#: pl_comp.c:2204 pl_exec.c:6922 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" @@ -122,52 +122,57 @@ msgstr "" "не удалось определить фактический тип аргумента для полиморфной функции " "\"%s\"" -#: pl_exec.c:510 pl_exec.c:944 pl_exec.c:1179 +#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 msgid "during initialization of execution state" msgstr "в процессе инициализации состояния выполнения" -#: pl_exec.c:516 +#: pl_exec.c:517 msgid "while storing call arguments into local variables" msgstr "при сохранении аргументов вызова в локальных переменных" -#: pl_exec.c:604 pl_exec.c:1017 +#: pl_exec.c:605 pl_exec.c:1023 msgid "during function entry" msgstr "при входе в функцию" -#: pl_exec.c:627 +#: pl_exec.c:628 #, c-format msgid "control reached end of function without RETURN" msgstr "конец функции достигнут без RETURN" -#: pl_exec.c:633 +#: pl_exec.c:634 msgid "while casting return value to function's return type" msgstr "при приведении возвращаемого значения к типу результата функции" -#: pl_exec.c:646 pl_exec.c:3647 +#: pl_exec.c:646 pl_exec.c:3675 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: pl_exec.c:772 pl_exec.c:1043 pl_exec.c:1201 +#: pl_exec.c:651 pl_exec.c:3681 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "требуется режим материализации, но он недопустим в этом контексте" + +#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 msgid "during function exit" msgstr "при выходе из функции" -#: pl_exec.c:827 pl_exec.c:891 pl_exec.c:3444 +#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3474 msgid "returned record type does not match expected record type" msgstr "возвращаемый тип записи не соответствует ожидаемому" -#: pl_exec.c:1040 pl_exec.c:1198 +#: pl_exec.c:1046 pl_exec.c:1204 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "конец триггерной процедуры достигнут без RETURN" -#: pl_exec.c:1048 +#: pl_exec.c:1054 #, c-format msgid "trigger procedure cannot return a set" msgstr "триггерная процедура не может возвращать множество" -#: pl_exec.c:1087 pl_exec.c:1115 +#: pl_exec.c:1093 pl_exec.c:1121 msgid "" "returned row structure does not match the structure of the triggering table" msgstr "" @@ -177,7 +182,7 @@ msgstr "" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1247 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "функция PL/pgSQL %s, строка %d, %s" @@ -185,39 +190,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:1258 +#: pl_exec.c:1273 #, 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:1266 +#: pl_exec.c:1281 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "функция PL/pgSQL %s, строка %d, оператор %s" -#: pl_exec.c:1272 +#: pl_exec.c:1287 #, c-format msgid "PL/pgSQL function %s" msgstr "функция PL/pgSQL %s" -#: pl_exec.c:1643 +#: pl_exec.c:1658 msgid "during statement block local variable initialization" msgstr "при инициализации локальной переменной в блоке операторов" -#: pl_exec.c:1741 +#: pl_exec.c:1763 msgid "during statement block entry" msgstr "при входе в блок операторов" -#: pl_exec.c:1773 +#: pl_exec.c:1795 msgid "during statement block exit" msgstr "при выходе из блока операторов" -#: pl_exec.c:1811 +#: pl_exec.c:1833 msgid "during exception cleanup" msgstr "при очистке после исключения" -#: pl_exec.c:2344 +#: pl_exec.c:2370 #, c-format msgid "" "procedure parameter \"%s\" is an output parameter but corresponding argument " @@ -226,7 +231,7 @@ msgstr "" "параметр процедуры \"%s\" является выходным, но соответствующий аргумент не " "допускает запись" -#: pl_exec.c:2349 +#: pl_exec.c:2375 #, c-format msgid "" "procedure parameter %d is an output parameter but corresponding argument is " @@ -235,199 +240,199 @@ msgstr "" "параметр процедуры %d является выходным, но соответствующий аргумент не " "допускает запись" -#: pl_exec.c:2383 +#: pl_exec.c:2409 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "" "GET STACKED DIAGNOSTICS нельзя использовать вне блока обработчика исключения" -#: pl_exec.c:2583 +#: pl_exec.c:2609 #, c-format msgid "case not found" msgstr "неправильный CASE" -#: pl_exec.c:2584 +#: pl_exec.c:2610 #, c-format msgid "CASE statement is missing ELSE part." msgstr "В операторе CASE не хватает части ELSE." -#: pl_exec.c:2677 +#: pl_exec.c:2703 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "нижняя граница цикла FOR не может быть равна NULL" -#: pl_exec.c:2693 +#: pl_exec.c:2719 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "верхняя граница цикла FOR не может быть равна NULL" -#: pl_exec.c:2711 +#: pl_exec.c:2737 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "значение BY в цикле FOR не может быть равно NULL" -#: pl_exec.c:2717 +#: pl_exec.c:2743 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "значение BY в цикле FOR должно быть больше нуля" -#: pl_exec.c:2851 pl_exec.c:4641 +#: pl_exec.c:2877 pl_exec.c:4682 #, c-format msgid "cursor \"%s\" already in use" msgstr "курсор \"%s\" уже используется" -#: pl_exec.c:2874 pl_exec.c:4706 +#: pl_exec.c:2900 pl_exec.c:4752 #, c-format msgid "arguments given for cursor without arguments" msgstr "курсору без аргументов были переданы аргументы" -#: pl_exec.c:2893 pl_exec.c:4725 +#: pl_exec.c:2919 pl_exec.c:4771 #, c-format msgid "arguments required for cursor" msgstr "курсору требуются аргументы" -#: pl_exec.c:2980 +#: pl_exec.c:3010 #, c-format msgid "FOREACH expression must not be null" msgstr "выражение FOREACH не может быть равно NULL" -#: pl_exec.c:2995 +#: pl_exec.c:3025 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "выражение в FOREACH должно быть массивом, но не типом %s" -#: pl_exec.c:3012 +#: pl_exec.c:3042 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "размерность среза (%d) вне допустимого диапазона 0..%d" -#: pl_exec.c:3039 +#: pl_exec.c:3069 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "переменная цикла FOREACH ... SLICE должна быть массивом" -#: pl_exec.c:3043 +#: pl_exec.c:3073 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "переменная цикла FOREACH не должна быть массивом" -#: pl_exec.c:3205 pl_exec.c:3262 pl_exec.c:3437 +#: pl_exec.c:3235 pl_exec.c:3292 pl_exec.c:3467 #, c-format msgid "" "cannot return non-composite value from function returning composite type" msgstr "" "функция, возвращающая составной тип, не может вернуть несоставное значение" -#: pl_exec.c:3301 pl_gram.y:3310 +#: pl_exec.c:3331 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "" "RETURN NEXT можно использовать только в функциях, возвращающих множества" -#: pl_exec.c:3342 pl_exec.c:3474 +#: pl_exec.c:3372 pl_exec.c:3504 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип результата" -#: pl_exec.c:3380 pl_exec.c:3401 +#: pl_exec.c:3410 pl_exec.c:3431 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип записи" -#: pl_exec.c:3493 +#: pl_exec.c:3523 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "у оператора RETURN NEXT должен быть параметр" -#: pl_exec.c:3521 pl_gram.y:3374 +#: pl_exec.c:3551 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "" "RETURN QUERY можно использовать только в функциях, возвращающих множества" -#: pl_exec.c:3539 +#: pl_exec.c:3569 msgid "structure of query does not match function result type" msgstr "структура запроса не соответствует типу результата функции" -#: pl_exec.c:3594 pl_exec.c:4419 pl_exec.c:8634 +#: pl_exec.c:3624 pl_exec.c:4459 pl_exec.c:8721 #, c-format msgid "query string argument of EXECUTE is null" msgstr "в качестве текста запроса в EXECUTE передан NULL" -#: pl_exec.c:3675 pl_exec.c:3813 +#: pl_exec.c:3709 pl_exec.c:3847 #, c-format msgid "RAISE option already specified: %s" msgstr "этот параметр RAISE уже указан: %s" -#: pl_exec.c:3709 +#: pl_exec.c:3743 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "" "RAISE без параметров нельзя использовать вне блока обработчика исключения" -#: pl_exec.c:3803 +#: pl_exec.c:3837 #, c-format msgid "RAISE statement option cannot be null" msgstr "параметром оператора RAISE не может быть NULL" -#: pl_exec.c:3873 +#: pl_exec.c:3907 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3928 +#: pl_exec.c:3962 #, c-format msgid "assertion failed" msgstr "нарушение истинности" -#: pl_exec.c:4292 pl_exec.c:4480 +#: pl_exec.c:4332 pl_exec.c:4521 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL нельзя выполнить COPY с участием клиента" -#: pl_exec.c:4298 +#: pl_exec.c:4338 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "неподдерживаемая транзакционная команда в PL/pgSQL" -#: pl_exec.c:4321 pl_exec.c:4509 +#: pl_exec.c:4361 pl_exec.c:4550 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO с командой не может возвращать данные" -#: pl_exec.c:4344 pl_exec.c:4532 +#: pl_exec.c:4384 pl_exec.c:4573 #, c-format msgid "query returned no rows" msgstr "запрос не вернул строк" -#: pl_exec.c:4366 pl_exec.c:4551 pl_exec.c:5694 +#: pl_exec.c:4406 pl_exec.c:4592 pl_exec.c:5744 #, c-format msgid "query returned more than one row" msgstr "запрос вернул несколько строк" -#: pl_exec.c:4368 +#: pl_exec.c:4408 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "" "Измените запрос, чтобы он выбирал одну строку, или используйте LIMIT 1." -#: pl_exec.c:4384 +#: pl_exec.c:4424 #, c-format msgid "query has no destination for result data" msgstr "в запросе нет назначения для данных результата" -#: pl_exec.c:4385 +#: pl_exec.c:4425 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Если вам нужно отбросить результаты SELECT, используйте PERFORM." -#: pl_exec.c:4472 +#: pl_exec.c:4513 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "возможность выполнения SELECT ... INTO в EXECUTE не реализована" # skip-rule: space-before-ellipsis -#: pl_exec.c:4473 +#: pl_exec.c:4514 #, c-format msgid "" "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " @@ -436,57 +441,57 @@ msgstr "" "Альтернативой может стать EXECUTE ... INTO или EXECUTE CREATE TABLE ... " "AS ..." -#: pl_exec.c:4486 +#: pl_exec.c:4527 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE с транзакционными командами не поддерживается" -#: pl_exec.c:4787 pl_exec.c:4875 +#: pl_exec.c:4837 pl_exec.c:4925 #, c-format msgid "cursor variable \"%s\" is null" msgstr "переменная курсора \"%s\" равна NULL" -#: pl_exec.c:4798 pl_exec.c:4886 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не существует" -#: pl_exec.c:4811 +#: pl_exec.c:4861 #, c-format msgid "relative or absolute cursor position is null" msgstr "относительная или абсолютная позиция курсора равна NULL" -#: pl_exec.c:5049 pl_exec.c:5144 +#: pl_exec.c:5099 pl_exec.c:5194 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "значение NULL нельзя присвоить переменной \"%s\", объявленной NOT NULL" -#: pl_exec.c:5125 +#: pl_exec.c:5175 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "переменной типа кортеж можно присвоить только составное значение" -#: pl_exec.c:5157 +#: pl_exec.c:5207 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "переменной типа запись можно присвоить только составное значение" -#: pl_exec.c:5208 +#: pl_exec.c:5258 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "присвоить значение системному столбцу \"%s\" нельзя" -#: pl_exec.c:5657 +#: pl_exec.c:5707 #, c-format msgid "query did not return data" msgstr "запрос не вернул данные" -#: pl_exec.c:5658 pl_exec.c:5670 pl_exec.c:5695 pl_exec.c:5771 pl_exec.c:5776 +#: pl_exec.c:5708 pl_exec.c:5720 pl_exec.c:5745 pl_exec.c:5821 pl_exec.c:5826 #, c-format msgid "query: %s" msgstr "запрос: %s" -#: pl_exec.c:5666 +#: pl_exec.c:5716 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" @@ -494,17 +499,17 @@ msgstr[0] "запрос вернул %d столбец" msgstr[1] "запрос вернул %d столбца" msgstr[2] "запрос вернул %d столбцов" -#: pl_exec.c:5770 +#: pl_exec.c:5820 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "запрос - не просто SELECT, а SELECT INTO" -#: pl_exec.c:5775 +#: pl_exec.c:5825 #, c-format msgid "query is not a SELECT" msgstr "запрос - не SELECT" -#: pl_exec.c:6585 pl_exec.c:6625 pl_exec.c:6665 +#: pl_exec.c:6635 pl_exec.c:6675 pl_exec.c:6715 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -512,34 +517,39 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: pl_exec.c:7076 pl_exec.c:7110 pl_exec.c:7184 pl_exec.c:7210 +#: pl_exec.c:7126 pl_exec.c:7160 pl_exec.c:7234 pl_exec.c:7260 #, 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:7078 pl_exec.c:7112 pl_exec.c:7186 pl_exec.c:7212 +#: pl_exec.c:7128 pl_exec.c:7162 pl_exec.c:7236 pl_exec.c:7262 #, c-format msgid "%s check of %s is active." msgstr "Включена проверка %s (с %s)." -#: pl_exec.c:7082 pl_exec.c:7116 pl_exec.c:7190 pl_exec.c:7216 +#: pl_exec.c:7132 pl_exec.c:7166 pl_exec.c:7240 pl_exec.c:7266 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "" "Измените запрос, чтобы он возвращал в точности требуемый список столбцов." -#: pl_exec.c:7603 +#: pl_exec.c:7653 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "записи \"%s\" не присвоено значение" -#: pl_exec.c:7604 +#: pl_exec.c:7654 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "" "Для записи, которой не присвоено значение, структура кортежа не определена." +#: pl_exec.c:8319 pl_gram.y:3498 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "переменная \"%s\" объявлена как CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "блок операторов" @@ -572,57 +582,57 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR по результатам EXECUTE" -#: pl_gram.y:485 +#: pl_gram.y:488 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "метка блока должна помещаться до DECLARE, а не после" -#: pl_gram.y:505 +#: pl_gram.y:508 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: pl_gram.y:524 +#: pl_gram.y:527 #, 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 +#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 #, c-format msgid "variable \"%s\" does not exist" msgstr "переменная \"%s\" не существует" -#: pl_gram.y:731 pl_gram.y:759 +#: pl_gram.y:734 pl_gram.y:762 msgid "duplicate declaration" msgstr "повторяющееся объявление" -#: pl_gram.y:742 pl_gram.y:770 +#: pl_gram.y:745 pl_gram.y:773 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "переменная \"%s\" скрывает ранее определённую переменную" -#: pl_gram.y:1042 +#: pl_gram.y:1045 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не принимает элемент %s" -#: pl_gram.y:1060 +#: pl_gram.y:1063 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не принимает элемент %s" -#: pl_gram.y:1155 +#: pl_gram.y:1158 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нераспознанный элемент GET DIAGNOSTICS" -#: pl_gram.y:1171 pl_gram.y:3549 +#: pl_gram.y:1174 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" - не скалярная переменная" -#: pl_gram.y:1401 pl_gram.y:1595 +#: pl_gram.y:1404 pl_gram.y:1598 #, c-format msgid "" "loop variable of loop over rows must be a record variable or list of scalar " @@ -631,234 +641,229 @@ msgstr "" "переменная цикла по кортежам должна быть переменной типа запись или списком " "скалярных переменных" -#: pl_gram.y:1436 +#: pl_gram.y:1439 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "в цикле FOR с курсором должна быть только одна переменная" -#: pl_gram.y:1443 +#: pl_gram.y:1446 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "" "в цикле FOR с курсором должен использоваться курсор, привязанный к запросу" -#: pl_gram.y:1534 +#: pl_gram.y:1537 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "в целочисленном цикле FOR должна быть только одна переменная" -#: pl_gram.y:1568 +#: pl_gram.y:1571 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в цикле FOR с запросом нельзя указать REVERSE" -#: pl_gram.y:1698 +#: pl_gram.y:1701 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "" "переменной цикла FOREACH должна быть известная переменная или список " "переменных" -#: pl_gram.y:1740 +#: pl_gram.y:1743 #, c-format msgid "" "there is no label \"%s\" attached to any block or loop enclosing this " "statement" msgstr "в блоке или цикле, окружающем этот оператор, нет метки \"%s\"" -#: pl_gram.y:1748 +#: pl_gram.y:1751 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "метку блока \"%s\" нельзя использовать в CONTINUE" -#: pl_gram.y:1763 +#: pl_gram.y:1766 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можно использовать вне цикла только с указанием метки" -#: pl_gram.y:1764 +#: pl_gram.y:1767 #, 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 +#: pl_gram.y:1791 pl_gram.y:1829 pl_gram.y:1877 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4013 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 +#: pl_gram.y:1897 pl_gram.y:1921 pl_gram.y:1937 pl_gram.y:1943 pl_gram.y:2068 +#: pl_gram.y:2076 pl_gram.y:2090 pl_gram.y:2185 pl_gram.y:2409 pl_gram.y:2499 +#: pl_gram.y:2657 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3994 msgid "syntax error" msgstr "ошибка синтаксиса" -#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: pl_gram.y:1925 pl_gram.y:1927 pl_gram.y:2413 pl_gram.y:2415 msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" -#: pl_gram.y:2126 +#: pl_gram.y:2133 msgid "syntax error, expected \"FOR\"" msgstr "ошибка синтаксиса, ожидался \"FOR\"" -#: pl_gram.y:2187 +#: pl_gram.y:2194 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "оператор FETCH не может вернуть несколько строк" -#: pl_gram.y:2284 +#: pl_gram.y:2291 #, c-format msgid "cursor variable must be a simple variable" msgstr "переменная-курсор должна быть простой переменной" -#: pl_gram.y:2290 +#: pl_gram.y:2297 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "переменная \"%s\" должна быть типа cursor или refcursor" -#: pl_gram.y:2620 pl_gram.y:2631 +#: pl_gram.y:2628 pl_gram.y:2639 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - не известная переменная" -#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2745 pl_gram.y:2755 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "непарные скобки" -#: pl_gram.y:2751 +#: pl_gram.y:2759 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "отсутствует \"%s\" в конце выражения SQL" -#: pl_gram.y:2757 +#: pl_gram.y:2765 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "отсутствует \"%s\" в конце оператора SQL" -#: pl_gram.y:2774 +#: pl_gram.y:2782 msgid "missing expression" msgstr "отсутствует выражение" -#: pl_gram.y:2776 +#: pl_gram.y:2784 msgid "missing SQL statement" msgstr "отсутствует оператор SQL" -#: pl_gram.y:2905 +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "неполное определение типа данных" -#: pl_gram.y:2928 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "отсутствует определение типа данных" -#: pl_gram.y:3006 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO указано неоднократно" -#: pl_gram.y:3176 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "ожидалось FROM или IN" -#: pl_gram.y:3237 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "в функции, возвращающей множество, RETURN должен быть без параметров" -#: pl_gram.y:3238 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Используйте RETURN NEXT или RETURN QUERY." -#: pl_gram.y:3248 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "в процедуре RETURN должен быть без параметров" -#: pl_gram.y:3253 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "в функции, не возвращающей ничего, RETURN не должен иметь параметров" -#: pl_gram.y:3262 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN должен быть без параметров в функции с параметрами OUT" -#: pl_gram.y:3325 +#: pl_gram.y:3390 #, 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 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "" "переменная типа запись не может быть частью списка INTO с несколькими " "элементами" -#: pl_gram.y:3537 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "указано слишком много переменных INTO" -#: pl_gram.y:3745 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "конечная метка \"%s\" указана для непомеченного блока" -#: pl_gram.y:3752 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "конечная метка \"%s\" отличается от метки блока \"%s\"" -#: pl_gram.y:3786 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курсор \"%s\" не имеет аргументов" -#: pl_gram.y:3800 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курсор \"%s\" имеет аргументы" -#: pl_gram.y:3842 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курсор \"%s\" не имеет аргумента \"%s\"" -#: pl_gram.y:3862 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "значение параметра \"%s\" курсора \"%s\" указано неоднократно" -#: pl_gram.y:3887 +#: pl_gram.y:3952 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недостаточно аргументов для курсора \"%s\"" -#: pl_gram.y:3894 +#: pl_gram.y:3959 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "слишком много аргументов для курсора \"%s\"" -#: pl_gram.y:3980 +#: pl_gram.y:4045 msgid "unrecognized RAISE statement option" msgstr "нераспознанный параметр оператора RAISE" -#: pl_gram.y:3984 +#: pl_gram.y:4049 msgid "syntax error, expected \"=\"" msgstr "ошибка синтаксиса, ожидалось \"=\"" -#: pl_gram.y:4025 +#: pl_gram.y:4090 #, c-format msgid "too many parameters specified for RAISE" msgstr "слишком много параметров для RAISE" -#: pl_gram.y:4029 +#: pl_gram.y:4094 #, c-format msgid "too few parameters specified for RAISE" msgstr "недостаточно параметров для RAISE" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/po/sv.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/sv.po index 5ff5dcf9..4ba61382 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/sv.po +++ b/third_party/spanner_pg/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, 2021. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023. # 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-11-07 06:39+0000\n" -"PO-Revision-Date: 2021-11-07 10:30+0100\n" +"POT-Creation-Date: 2022-04-11 13:39+0000\n" +"PO-Revision-Date: 2023-03-09 22:40+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -30,7 +30,7 @@ msgstr "kunde inte bestämma aktuell returtyp för polymorfisk funktion \"%s\"" #: pl_comp.c:560 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "utlösarfunktioner kan bara anropas som utlösare" +msgstr "triggerfunktioner kan bara anropas som triggrar" #: pl_comp.c:564 pl_handler.c:480 #, c-format @@ -40,17 +40,17 @@ msgstr "PL/pgSQL-funktioner kan inte returnera typ %s" #: pl_comp.c:604 #, c-format msgid "trigger functions cannot have declared arguments" -msgstr "utlösarfunktioner kan inte ha deklarerade argument" +msgstr "triggerfunktioner kan inte ha deklarerade argument" #: 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." +msgstr "Argumenten till triggern kan accessas via TG_NARGS och TG_ARGV istället." #: pl_comp.c:738 #, c-format msgid "event trigger functions cannot have declared arguments" -msgstr "händelseutlösarfunktioner kan inte ha deklarerade argument" +msgstr "händelsetriggerfunktioner kan inte ha deklarerade argument" #: pl_comp.c:1002 #, c-format @@ -72,8 +72,8 @@ msgstr "kolumnreferens \"%s\" är tvetydig" 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:1324 pl_exec.c:5190 pl_exec.c:5363 pl_exec.c:5450 pl_exec.c:5541 -#: pl_exec.c:6562 +#: 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\"" @@ -98,7 +98,7 @@ msgstr "variabel \"%s\" har pseudotyp %s" msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" -#: pl_comp.c:2204 pl_exec.c:6863 +#: pl_comp.c:2204 pl_exec.c:6889 #, c-format msgid "type %s is not composite" msgstr "typen %s är inte composite" @@ -113,7 +113,7 @@ msgstr "okänt avbrottsvillkor \"%s\"" 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:500 pl_exec.c:934 pl_exec.c:1169 +#: 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" @@ -121,7 +121,7 @@ msgstr "unde initiering av körtillstånd" msgid "while storing call arguments into local variables" msgstr "under sparande av anropsargument till lokala variabler" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:594 pl_exec.c:1012 msgid "during function entry" msgstr "under funktionsingången" @@ -134,37 +134,42 @@ msgstr "kontrollen nådde slutet av funktionen utan RETURN" msgid "while casting return value to function's return type" msgstr "under typomvandling av returvärde till funktionens returtyp" -#: pl_exec.c:636 pl_exec.c:3637 +#: 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:762 pl_exec.c:1033 pl_exec.c:1191 +#: 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:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: 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" +msgstr "programflödet nådde slutet på triggerprocedur utan RETURN" -#: pl_exec.c:1038 +#: pl_exec.c:1043 #, c-format msgid "trigger procedure cannot return a set" -msgstr "utlösarprocedur kan inte returnera en mängd" +msgstr "triggerprocedur kan inte returnera en mängd" -#: pl_exec.c:1077 pl_exec.c:1105 +#: 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" +msgstr "returnerad radstruktur matchar inte strukturen på triggad tabell" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1237 +#: pl_exec.c:1251 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-funktion %s rad %d %s" @@ -172,331 +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:1248 +#: 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:1256 +#: 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:1262 +#: pl_exec.c:1276 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-funktion %s" -#: pl_exec.c:1633 +#: pl_exec.c:1647 msgid "during statement block local variable initialization" msgstr "under initiering av lokala variabler i satsblock" -#: pl_exec.c:1731 +#: pl_exec.c:1752 msgid "during statement block entry" msgstr "under ingång till satsblock" -#: pl_exec.c:1763 +#: pl_exec.c:1784 msgid "during statement block exit" msgstr "under satsblockavslutning" -#: pl_exec.c:1801 +#: pl_exec.c:1822 msgid "during exception cleanup" msgstr "under avbrottsuppstädning" -#: pl_exec.c:2334 +#: 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:2339 +#: 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:2373 +#: 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:2573 +#: pl_exec.c:2594 #, c-format msgid "case not found" msgstr "hittade inte alternativ" -#: pl_exec.c:2574 +#: pl_exec.c:2595 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE-sats saknar ELSE-del." -#: pl_exec.c:2667 +#: 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:2683 +#: 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:2701 +#: 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:2707 +#: 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:2841 pl_exec.c:4626 +#: 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:2864 pl_exec.c:4691 +#: 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:2883 pl_exec.c:4710 +#: 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:2970 +#: pl_exec.c:2991 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-uttryck får inte vara null" -#: pl_exec.c:2985 +#: 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:3002 +#: 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:3029 +#: 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:3033 +#: 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:3195 pl_exec.c:3252 pl_exec.c:3427 +#: 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:3291 pl_gram.y:3310 +#: 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:3332 pl_exec.c:3464 +#: 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:3370 pl_exec.c:3391 +#: 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:3483 +#: pl_exec.c:3504 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT måste ha en parameter" -#: pl_exec.c:3511 pl_gram.y:3374 +#: 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:3529 +#: 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:3584 pl_exec.c:4404 pl_exec.c:8604 +#: 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:3665 pl_exec.c:3803 +#: 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:3699 +#: 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:3793 +#: 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:3863 +#: pl_exec.c:3888 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3918 +#: pl_exec.c:3943 #, c-format msgid "assertion failed" msgstr "assert misslyckades" -#: pl_exec.c:4277 pl_exec.c:4465 +#: 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:4283 +#: pl_exec.c:4314 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "transaktionskommando saknar stöd i PL/pgSQL" -#: pl_exec.c:4306 pl_exec.c:4494 +#: 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:4329 pl_exec.c:4517 +#: pl_exec.c:4360 pl_exec.c:4549 #, c-format msgid "query returned no rows" msgstr "frågan returnerade inga rader" -#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 +#: 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:4353 +#: 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:4369 +#: 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:4370 +#: 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:4457 +#: 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:4458 +#: 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:4471 +#: pl_exec.c:4503 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE på transaktionskommanon är inte implementerat" -#: pl_exec.c:4772 pl_exec.c:4860 +#: 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:4783 pl_exec.c:4871 +#: 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:4796 +#: 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:5040 pl_exec.c:5135 +#: 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:5116 +#: 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:5148 +#: 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:5199 +#: pl_exec.c:5225 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kan inte skriva till systemkolumn \"%s\"" -#: pl_exec.c:5648 +#: pl_exec.c:5674 #, c-format msgid "query did not return data" msgstr "frågan returnerade ingen data" -#: pl_exec.c:5649 pl_exec.c:5661 pl_exec.c:5686 pl_exec.c:5762 pl_exec.c:5767 +#: 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 "fråga: %s" -#: pl_exec.c:5657 +#: pl_exec.c:5683 #, c-format 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:5761 +#: pl_exec.c:5787 #, c-format 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:5766 +#: pl_exec.c:5792 #, c-format msgid "query is not a SELECT" msgstr "frågan är inte en SELECT" -#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 +#: 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:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 +#: 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:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 +#: 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:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: 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:7594 +#: pl_exec.c:7620 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "posten \"%s\" är inte tilldelad än" -#: pl_exec.c:7595 +#: 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." @@ -533,280 +538,280 @@ msgstr "SQL-sats" msgid "FOR over EXECUTE statement" msgstr "FOR över EXECUTE-sats" -#: pl_gram.y:485 +#: 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:505 +#: 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:524 +#: 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:672 pl_gram.y:687 pl_gram.y:713 +#: 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:731 pl_gram.y:759 +#: pl_gram.y:732 pl_gram.y:760 msgid "duplicate declaration" msgstr "duplicerad deklaration" -#: pl_gram.y:742 pl_gram.y:770 +#: 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:1042 +#: 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:1060 +#: 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:1155 +#: pl_gram.y:1156 msgid "unrecognized GET DIAGNOSTICS item" msgstr "okänd GET DIAGNOSTICS-del" -#: pl_gram.y:1171 pl_gram.y:3549 +#: 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:1401 pl_gram.y:1595 +#: 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:1436 +#: 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:1443 +#: 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:1534 +#: 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:1568 +#: 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:1698 +#: 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:1740 +#: 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:1748 +#: 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:1763 +#: 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:1764 +#: 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: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 +#: 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: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 +#: 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:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: 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:2126 +#: pl_gram.y:2131 msgid "syntax error, expected \"FOR\"" msgstr "syntaxfel, förväntade \"FOR\"" -#: pl_gram.y:2187 +#: pl_gram.y:2192 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH-sats kan inte returnera multipla rader" -#: pl_gram.y:2284 +#: 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:2290 +#: 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:2620 pl_gram.y:2631 +#: 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:2737 pl_gram.y:2747 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:2751 +#: 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:2757 +#: 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:2774 +#: pl_gram.y:2780 msgid "missing expression" msgstr "saknar uttryck" -#: pl_gram.y:2776 +#: 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:3176 +#: pl_gram.y:3184 msgid "expected FROM or IN" msgstr "förväntade FROM eller IN" -#: pl_gram.y:3237 +#: 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:3238 +#: pl_gram.y:3246 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Använd RETURN NEXT eller RETURN QUERY." -#: pl_gram.y:3248 +#: 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:3253 +#: 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:3262 +#: 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:3325 +#: 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:3433 +#: pl_gram.y:3441 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "variabel \"%s\" är deklarerad CONSTANT" -#: pl_gram.y:3491 +#: 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:3537 +#: pl_gram.y:3545 #, c-format msgid "too many INTO variables specified" msgstr "för många INTO-variabler angivna" -#: pl_gram.y:3745 +#: 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:3752 +#: 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\"" -#: pl_gram.y:3786 +#: pl_gram.y:3794 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "markör \"%s\" har inga argument" -#: pl_gram.y:3800 +#: pl_gram.y:3808 #, c-format msgid "cursor \"%s\" has arguments" msgstr "markör \"%s\" har argument" -#: pl_gram.y:3842 +#: pl_gram.y:3850 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "markör \"%s\" har inga argument med namn \"%s\"" -#: pl_gram.y:3862 +#: pl_gram.y:3870 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "värdet för parameter \"%s\" i markör \"%s\" är angivet mer än en gång" -#: pl_gram.y:3887 +#: pl_gram.y:3895 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "ej tillräckligt med argument för markör \"%s\"" -#: pl_gram.y:3894 +#: pl_gram.y:3902 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "fär många argument för markör \"%s\"" -#: pl_gram.y:3980 +#: pl_gram.y:3988 msgid "unrecognized RAISE statement option" msgstr "okänd RAISE-sats-flagga" -#: pl_gram.y:3984 +#: pl_gram.y:3992 msgid "syntax error, expected \"=\"" msgstr "syntaxfel, förväntade \"=\"" -#: pl_gram.y:4025 +#: 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:4029 +#: 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/third_party/spanner_pg/src/pl/plpgsql/src/po/uk.po b/third_party/spanner_pg/src/pl/plpgsql/src/po/uk.po index b28c58cb..77510da0 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/po/uk.po +++ b/third_party/spanner_pg/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: 2022-03-16 09:09+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2022-08-12 10:39+0000\n" +"PO-Revision-Date: 2022-09-13 11:52\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,13 +14,13 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_STABLE/plpgsql.pot\n" -"X-Crowdin-File-ID: 758\n" +"X-Crowdin-File: /REL_15_STABLE/plpgsql.pot\n" +"X-Crowdin-File-ID: 894\n" #: pl_comp.c:438 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" -msgstr "Функції PL/pgSQl не можуть приймати тип %s" +msgstr "Функції PL/pgSQL не можуть приймати тип %s" #: pl_comp.c:530 #, c-format @@ -72,8 +72,8 @@ msgstr "посилання на стовпець \"%s\" є неоднознач 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 +#: 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\"" @@ -98,7 +98,7 @@ msgstr "змінна \"%s\" має псевдотип %s" msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" є лише оболонкою" -#: pl_comp.c:2204 pl_exec.c:6863 +#: pl_comp.c:2204 pl_exec.c:6907 #, c-format msgid "type %s is not composite" msgstr "тип %s не є складеним" @@ -113,58 +113,63 @@ msgstr "нерозпізнана умова виключення \"%s\"" 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 +#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 msgid "during initialization of execution state" msgstr "під час ініціалізації стану виконання" -#: pl_exec.c:506 +#: pl_exec.c:507 msgid "while storing call arguments into local variables" msgstr "під час зберігання аргументів виклику до локальних змінних" -#: pl_exec.c:594 pl_exec.c:1007 +#: pl_exec.c:595 pl_exec.c:1013 msgid "during function entry" msgstr "під час входу до функції" -#: pl_exec.c:617 +#: pl_exec.c:618 #, c-format msgid "control reached end of function without RETURN" msgstr "досягнуто кінця функції без RETURN" -#: pl_exec.c:623 +#: pl_exec.c:624 msgid "while casting return value to function's return type" msgstr "під час приведення значення, що повертається, до типу результата функції" -#: pl_exec.c:636 pl_exec.c:3637 +#: pl_exec.c:636 pl_exec.c:3665 #, 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 +#: pl_exec.c:641 pl_exec.c:3671 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" + +#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 msgid "during function exit" msgstr "під час виходу з функції" -#: pl_exec.c:817 pl_exec.c:881 pl_exec.c:3434 +#: 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:1030 pl_exec.c:1188 +#: pl_exec.c:1036 pl_exec.c:1194 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "досягнуто кінця тригерної процедури без RETURN" -#: pl_exec.c:1038 +#: pl_exec.c:1044 #, c-format msgid "trigger procedure cannot return a set" msgstr "тригерна процедура не може повернути набір" -#: pl_exec.c:1077 pl_exec.c:1105 +#: 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:1237 +#: pl_exec.c:1252 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "Функція PL/pgSQL %s рядок %d %s" @@ -172,288 +177,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:1248 +#: 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:1256 +#: pl_exec.c:1271 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "Функція PL/pgSQL %s рядок %d в %s" -#: pl_exec.c:1262 +#: pl_exec.c:1277 #, c-format msgid "PL/pgSQL function %s" msgstr "Функція PL/pgSQL %s" -#: pl_exec.c:1633 +#: pl_exec.c:1648 msgid "during statement block local variable initialization" msgstr "під час ініціалізації локальної змінної в блоці операторів" -#: pl_exec.c:1731 +#: pl_exec.c:1753 msgid "during statement block entry" msgstr "під час входу в блок операторів" -#: pl_exec.c:1763 +#: pl_exec.c:1785 msgid "during statement block exit" msgstr "під час виходу з блоку операторів" -#: pl_exec.c:1801 +#: pl_exec.c:1823 msgid "during exception cleanup" msgstr "під час очищення винятку" -#: pl_exec.c:2334 +#: pl_exec.c:2360 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "параметр процедури \"%s\" є вихідним, але відповідний аргумент не допускає запис" -#: pl_exec.c:2339 +#: pl_exec.c:2365 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "параметр процедури %d є вихідним, але відповідний аргумент не допускає запис" -#: pl_exec.c:2373 +#: pl_exec.c:2399 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS не може використовуватись поза блоком обробника винятків" -#: pl_exec.c:2573 +#: pl_exec.c:2599 #, c-format msgid "case not found" msgstr "гілку не знайдено" -#: pl_exec.c:2574 +#: pl_exec.c:2600 #, c-format msgid "CASE statement is missing ELSE part." msgstr "В операторі CASE пропущено частину ELSE." -#: pl_exec.c:2667 +#: pl_exec.c:2693 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "нижня границя циклу FOR не може бути null" -#: pl_exec.c:2683 +#: pl_exec.c:2709 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "верхня границя циклу FOR не може бути null" -#: pl_exec.c:2701 +#: pl_exec.c:2727 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "Значення BY циклу FOR не може бути null" -#: pl_exec.c:2707 +#: pl_exec.c:2733 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "Значення BY циклу FOR повинно бути більше нуля" -#: pl_exec.c:2841 pl_exec.c:4626 +#: pl_exec.c:2867 pl_exec.c:4667 #, c-format msgid "cursor \"%s\" already in use" msgstr "курсор \"%s\" вже використовується" -#: pl_exec.c:2864 pl_exec.c:4691 +#: pl_exec.c:2890 pl_exec.c:4737 #, c-format msgid "arguments given for cursor without arguments" msgstr "аргументи, надані курсору без аргументів" -#: pl_exec.c:2883 pl_exec.c:4710 +#: pl_exec.c:2909 pl_exec.c:4756 #, c-format msgid "arguments required for cursor" msgstr "аргументи, необхідні для курсора" -#: pl_exec.c:2970 +#: pl_exec.c:3000 #, c-format msgid "FOREACH expression must not be null" msgstr "Вираз FOREACH не може бути null" -#: pl_exec.c:2985 +#: pl_exec.c:3015 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "Вираз в FOREACH повинен бути масивом, не типом %s" -#: pl_exec.c:3002 +#: 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:3029 +#: pl_exec.c:3059 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "Змінна циклу FOREACH ... SLICE повинна бути масивом" -#: pl_exec.c:3033 +#: pl_exec.c:3063 #, 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 +#: 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" msgstr "функція, що повертає складений тип, не може повернути не складене значення" -#: pl_exec.c:3291 pl_gram.y:3310 +#: pl_exec.c:3321 pl_gram.y:3319 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "не можна використовувати RETURN NEXT в функціях, що не повертають набори даних" -#: pl_exec.c:3332 pl_exec.c:3464 +#: pl_exec.c:3362 pl_exec.c:3494 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип результату" -#: pl_exec.c:3370 pl_exec.c:3391 +#: pl_exec.c:3400 pl_exec.c:3421 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип запису" -#: pl_exec.c:3483 +#: pl_exec.c:3513 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT повинен мати параметр" -#: pl_exec.c:3511 pl_gram.y:3374 +#: pl_exec.c:3541 pl_gram.y:3383 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "не можна використовувати RETURN QUERY в функціях, що не повертають набір" -#: pl_exec.c:3529 +#: pl_exec.c:3559 msgid "structure of query does not match function result type" msgstr "структура запиту не відповідає типу результата функції" -#: pl_exec.c:3584 pl_exec.c:4404 pl_exec.c:8604 +#: 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:3665 pl_exec.c:3803 +#: pl_exec.c:3699 pl_exec.c:3837 #, c-format msgid "RAISE option already specified: %s" msgstr "Параметр RAISE вже вказано: %s" -#: pl_exec.c:3699 +#: pl_exec.c:3733 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE без параметрів не можна використовувати поза блоком обробника винятків" -#: pl_exec.c:3793 +#: pl_exec.c:3827 #, c-format msgid "RAISE statement option cannot be null" msgstr "Параметром оператора RAISE не може бути null" -#: pl_exec.c:3863 +#: pl_exec.c:3897 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3918 +#: pl_exec.c:3952 #, c-format msgid "assertion failed" msgstr "порушення істинності" -#: pl_exec.c:4277 pl_exec.c:4465 +#: pl_exec.c:4317 pl_exec.c:4506 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL не можна виконати COPY за участю клієнта" -#: pl_exec.c:4283 +#: pl_exec.c:4323 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "непідтримувана транзакційна команда в PL/pgSQL" -#: pl_exec.c:4306 pl_exec.c:4494 +#: 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:4329 pl_exec.c:4517 +#: pl_exec.c:4369 pl_exec.c:4558 #, c-format msgid "query returned no rows" msgstr "запит не повернув рядки" -#: pl_exec.c:4351 pl_exec.c:4536 pl_exec.c:5685 +#: 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:4353 +#: pl_exec.c:4393 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Переконайтеся, що запит повертає один рядок, або використовуйте LIMIT 1." -#: pl_exec.c:4369 +#: pl_exec.c:4409 #, c-format msgid "query has no destination for result data" msgstr "запит не має призначення для даних результату" -#: pl_exec.c:4370 +#: 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:4457 +#: pl_exec.c:4498 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE виразу SELECT ... INTO не реалізовано" -#: pl_exec.c:4458 +#: 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." -#: pl_exec.c:4471 +#: pl_exec.c:4512 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE з транзакційними командами не реалізовано" -#: pl_exec.c:4772 pl_exec.c:4860 +#: pl_exec.c:4822 pl_exec.c:4910 #, c-format msgid "cursor variable \"%s\" is null" msgstr "змінна курсора \"%s\" дорівнює null" -#: pl_exec.c:4783 pl_exec.c:4871 +#: pl_exec.c:4833 pl_exec.c:4921 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не існує" -#: pl_exec.c:4796 +#: pl_exec.c:4846 #, c-format msgid "relative or absolute cursor position is null" msgstr "відносна або абсолютна позиція курсора дорівнює null" -#: pl_exec.c:5040 pl_exec.c:5135 +#: pl_exec.c:5084 pl_exec.c:5179 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "значення null не можна призначити змінній \"%s\", оголошеній NOT NULL" -#: pl_exec.c:5116 +#: pl_exec.c:5160 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "змінній типу кортеж можна призначити лише складене значення" -#: pl_exec.c:5148 +#: pl_exec.c:5192 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "змінній типу запис можна призначити лише складене значення" -#: pl_exec.c:5199 +#: pl_exec.c:5243 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "призначити значення системному стовпцю \"%s\" не можна" -#: pl_exec.c:5648 +#: pl_exec.c:5692 #, 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 +#: 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" msgstr "запит: %s" -#: pl_exec.c:5657 +#: pl_exec.c:5701 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" @@ -462,47 +467,52 @@ msgstr[1] "запит повернув %d колонки" msgstr[2] "запит повернув %d колонок" msgstr[3] "запит повернув %d колонок" -#: pl_exec.c:5761 +#: pl_exec.c:5805 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "запит є SELECT INTO, але має бути звичайним SELECT" -#: pl_exec.c:5766 +#: pl_exec.c:5810 #, c-format msgid "query is not a SELECT" msgstr "запит не є SELECT" -#: pl_exec.c:6576 pl_exec.c:6616 pl_exec.c:6656 +#: 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)" msgstr "тип параметру %d (%s) не відповідає тому, з котрим тривала підготовка плану (%s)" -#: pl_exec.c:7067 pl_exec.c:7101 pl_exec.c:7175 pl_exec.c:7201 +#: 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:7069 pl_exec.c:7103 pl_exec.c:7177 pl_exec.c:7203 +#: 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 "%s перевірка %s активна." -#: pl_exec.c:7073 pl_exec.c:7107 pl_exec.c:7181 pl_exec.c:7207 +#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Переконайтеся, що запит повертає точний список стовпців." -#: pl_exec.c:7594 +#: pl_exec.c:7638 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "запис \"%s\" ще не призначено" -#: pl_exec.c:7595 +#: pl_exec.c:7639 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Для запису, котрому не призначене значення, структура кортежа не визначена." +#: pl_exec.c:8283 pl_gram.y:3442 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "змінна \"%s\" оголошена як CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "блок операторів" @@ -535,280 +545,275 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR за результатами EXECUTE" -#: pl_gram.y:485 +#: pl_gram.y:487 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "мітка блоку повинна бути розміщена до DECLARE, а не після" -#: pl_gram.y:505 +#: pl_gram.y:507 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила сортування" -#: pl_gram.y:524 +#: pl_gram.y:526 #, 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 +#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 #, c-format msgid "variable \"%s\" does not exist" msgstr "змінної \"%s\" не існує" -#: pl_gram.y:731 pl_gram.y:759 +#: pl_gram.y:733 pl_gram.y:761 msgid "duplicate declaration" msgstr "дублікат оголошення" -#: pl_gram.y:742 pl_gram.y:770 +#: pl_gram.y:744 pl_gram.y:772 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "змінна \"%s\" приховує раніше оголошену змінну" -#: pl_gram.y:1042 +#: pl_gram.y:1044 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не дозволяє елемент діагностування %s" -#: pl_gram.y:1060 +#: pl_gram.y:1062 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не дозволяє елемент діагностування %s" -#: pl_gram.y:1155 +#: pl_gram.y:1157 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нерозпізнаний елемент GET DIAGNOSTICS" -#: pl_gram.y:1171 pl_gram.y:3549 +#: pl_gram.y:1173 pl_gram.y:3558 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" не є скалярною змінною" -#: pl_gram.y:1401 pl_gram.y:1595 +#: pl_gram.y:1403 pl_gram.y:1597 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "змінна циклу по кортежах повинна бути змінною типу запис або списком скалярних змінних" -#: pl_gram.y:1436 +#: pl_gram.y:1438 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "курсор в циклі FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1443 +#: pl_gram.y:1445 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "цикл курсора FOR повинен використовувати обмежуючу змінну курсора" -#: pl_gram.y:1534 +#: pl_gram.y:1536 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "цілочисельний цикл FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1568 +#: pl_gram.y:1570 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в циклі FOR з запитом не можна вказати REVERSE" -#: pl_gram.y:1698 +#: pl_gram.y:1700 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "змінній циклу FOREACH повинна бути відома змінна або список змінних" -#: pl_gram.y:1740 +#: pl_gram.y:1742 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "в блоку або циклу, розділеному цим оператором, немає мітки \"%s\"" -#: pl_gram.y:1748 +#: pl_gram.y:1750 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "мітку блока \"%s\" не можна використовувати в CONTINUE" -#: pl_gram.y:1763 +#: pl_gram.y:1765 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можна використовувати поза циклом, тільки з зазначенням мітки" -#: pl_gram.y:1764 +#: pl_gram.y:1766 #, 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 +#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 +#: pl_gram.y:3204 pl_gram.y:3957 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 +#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 +#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 +#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 msgid "syntax error" msgstr "синтаксична помилка" -#: pl_gram.y:1922 pl_gram.y:1924 pl_gram.y:2406 pl_gram.y:2408 +#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 msgid "invalid SQLSTATE code" msgstr "неприпустимий код SQLSTATE" -#: pl_gram.y:2126 +#: pl_gram.y:2132 msgid "syntax error, expected \"FOR\"" msgstr "помилка синтаксису, очікувався \"FOR\"" -#: pl_gram.y:2187 +#: pl_gram.y:2193 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "Оператор FETCH не може повернути декілька рядків" -#: pl_gram.y:2284 +#: pl_gram.y:2290 #, c-format msgid "cursor variable must be a simple variable" msgstr "змінна-курсор повинна бути простою змінною" -#: pl_gram.y:2290 +#: pl_gram.y:2296 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "змінна \"%s\" повинна бути типу cursor або refcursor" -#: pl_gram.y:2620 pl_gram.y:2631 +#: pl_gram.y:2627 pl_gram.y:2638 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - невідома змінна" -#: pl_gram.y:2737 pl_gram.y:2747 pl_gram.y:2903 +#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 msgid "mismatched parentheses" msgstr "неузгоджені дужки" -#: pl_gram.y:2751 +#: pl_gram.y:2758 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "пропущено \"%s\" в кінці виразу SQL" -#: pl_gram.y:2757 +#: pl_gram.y:2764 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "пропущено \"%s\" в кінці оператора SQL" -#: pl_gram.y:2774 +#: pl_gram.y:2781 msgid "missing expression" msgstr "пропущено вираз" -#: pl_gram.y:2776 +#: pl_gram.y:2783 msgid "missing SQL statement" msgstr "пропущений оператор SQL" -#: pl_gram.y:2905 +#: pl_gram.y:2912 msgid "incomplete data type declaration" msgstr "неповне оголошення типу даних" -#: pl_gram.y:2928 +#: pl_gram.y:2935 msgid "missing data type declaration" msgstr "пропущено оголошення типу даних" -#: pl_gram.y:3006 +#: pl_gram.y:3015 msgid "INTO specified more than once" msgstr "INTO вказано неодноразово" -#: pl_gram.y:3176 +#: pl_gram.y:3185 msgid "expected FROM or IN" msgstr "очікувалось FROM або IN" -#: pl_gram.y:3237 +#: pl_gram.y:3246 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "В функції, яка повертає набір, RETURN не може мати параметр" -#: pl_gram.y:3238 +#: pl_gram.y:3247 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Використайте RETURN NEXT або RETURN QUERY." -#: pl_gram.y:3248 +#: pl_gram.y:3257 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "В процедурі RETURN не може мати параметр" -#: pl_gram.y:3253 +#: pl_gram.y:3262 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "В функції, яка не повертає нічого, RETURN не може мати параметр" -#: pl_gram.y:3262 +#: pl_gram.y:3271 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "В функції з параметрами OUT, RETURN не може мати параметр" -#: pl_gram.y:3325 +#: pl_gram.y:3334 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "В функції з параметрами OUT, RETURN NEXT не може мати параметр" -#: pl_gram.y:3433 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "змінна \"%s\" оголошена як CONSTANT" - -#: pl_gram.y:3491 +#: pl_gram.y:3500 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "змінна типу запис не може бути частиною списка INTO з декількома елементами" -#: pl_gram.y:3537 +#: pl_gram.y:3546 #, c-format msgid "too many INTO variables specified" msgstr "вказано занадто багато змінних INTO" -#: pl_gram.y:3745 +#: pl_gram.y:3754 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "кінцева мітка \"%s\" вказана для невідміченого блоку" -#: pl_gram.y:3752 +#: pl_gram.y:3761 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "кінцева мітка \"%s\" відрізняється від мітки блоку \"%s\"" -#: pl_gram.y:3786 +#: pl_gram.y:3795 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курсор \"%s\" не має аргументів" -#: pl_gram.y:3800 +#: pl_gram.y:3809 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курсор \"%s\" має аргументи" -#: pl_gram.y:3842 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курсор \"%s\" не має аргументу \"%s\"" -#: pl_gram.y:3862 +#: pl_gram.y:3871 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "значення параметра \"%s\" курсора \"%s\" вказано неодноразово" -#: pl_gram.y:3887 +#: pl_gram.y:3896 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недостатньо аргументів для курсора \"%s\"" -#: pl_gram.y:3894 +#: pl_gram.y:3903 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "занадто багато аргументів для курсора \"%s\"" -#: pl_gram.y:3980 +#: pl_gram.y:3989 msgid "unrecognized RAISE statement option" msgstr "нерозпізнаний параметр оператора RAISE" -#: pl_gram.y:3984 +#: pl_gram.y:3993 msgid "syntax error, expected \"=\"" msgstr "помилка синтаксису, очікувалось \"=\"" -#: pl_gram.y:4025 +#: pl_gram.y:4034 #, c-format msgid "too many parameters specified for RAISE" msgstr "занадто багато параметрів вказано для RAISE" -#: pl_gram.y:4029 +#: pl_gram.y:4038 #, c-format msgid "too few parameters specified for RAISE" msgstr "занадто мало параметрів вказано для RAISE" diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/sql/.gitignore b/third_party/spanner_pg/src/pl/plpgsql/src/sql/.gitignore deleted file mode 100644 index 210bee18..00000000 --- a/third_party/spanner_pg/src/pl/plpgsql/src/sql/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/plpgsql_copy.sql diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_call.sql b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_call.sql index d80a5d28..8efc8e82 100644 --- a/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_call.sql +++ b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_call.sql @@ -130,6 +130,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/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_copy.sql b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_copy.sql new file mode 100644 index 00000000..37f1fa13 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_copy.sql @@ -0,0 +1,58 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR + +-- set up file names to use +\set srcfilename :abs_srcdir '/data/copy1.data' +\set destfilename :abs_builddir '/results/copy1.data' + +CREATE TABLE copy1 (a int, b float); + +-- COPY TO/FROM not authorized from client. +DO LANGUAGE plpgsql $$ +BEGIN + COPY copy1 TO stdout; +END; +$$; +DO LANGUAGE plpgsql $$ +BEGIN + COPY copy1 FROM stdin; +END; +$$; +DO LANGUAGE plpgsql $$ +BEGIN + EXECUTE 'COPY copy1 TO stdout'; +END; +$$; +DO LANGUAGE plpgsql $$ +BEGIN + EXECUTE 'COPY copy1 FROM stdin'; +END; +$$; + +-- Valid cases +-- COPY FROM +\set dobody 'BEGIN COPY copy1 FROM ' :'srcfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; +SELECT * FROM copy1 ORDER BY 1; +TRUNCATE copy1; +\set cmd 'COPY copy1 FROM ' :'srcfilename' +\set dobody 'BEGIN EXECUTE ' :'cmd' '; END' +DO LANGUAGE plpgsql :'dobody'; +SELECT * FROM copy1 ORDER BY 1; + +-- COPY TO +-- Copy the data externally once, then process it back to the table. +\set dobody 'BEGIN COPY copy1 TO ' :'destfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; +TRUNCATE copy1; +\set dobody 'BEGIN COPY copy1 FROM ' :'destfilename' '; END' +DO LANGUAGE plpgsql :'dobody'; + +\set cmd 'COPY copy1 FROM ' :'destfilename' +\set dobody 'BEGIN EXECUTE ' :'cmd' '; END' +DO LANGUAGE plpgsql :'dobody'; + +SELECT * FROM copy1 ORDER BY 1; + +DROP TABLE copy1; diff --git a/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_misc.sql b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_misc.sql new file mode 100644 index 00000000..71a8fc23 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpgsql/src/sql/plpgsql_misc.sql @@ -0,0 +1,22 @@ +-- +-- Miscellaneous topics +-- + +-- Verify that we can parse new-style CREATE FUNCTION/PROCEDURE +do +$$ + declare procedure int; -- check we still recognize non-keywords as vars + begin + create function test1() returns int + begin atomic + select 2 + 2; + end; + create or replace procedure test2(x int) + begin atomic + select x + 2; + end; + end +$$; + +\sf test1 +\sf test2 diff --git a/third_party/spanner_pg/src/pl/plpython/.gitignore b/third_party/spanner_pg/src/pl/plpython/.gitignore index 70c08db3..07bee6a2 100644 --- a/third_party/spanner_pg/src/pl/plpython/.gitignore +++ b/third_party/spanner_pg/src/pl/plpython/.gitignore @@ -1,7 +1,5 @@ /spiexceptions.h # Generated subdirectories -/expected/python3/ /log/ /results/ -/sql/python3/ /tmp_check/ diff --git a/third_party/spanner_pg/src/pl/plpython/Makefile b/third_party/spanner_pg/src/pl/plpython/Makefile index a83ae886..bb264266 100644 --- a/third_party/spanner_pg/src/pl/plpython/Makefile +++ b/third_party/spanner_pg/src/pl/plpython/Makefile @@ -35,13 +35,11 @@ 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. INCS = plpython.h \ + plpython_system.h \ plpy_cursorobject.h \ plpy_elog.h \ plpy_exec.h \ @@ -77,11 +75,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 +101,6 @@ REGRESS = \ plpython_transaction \ plpython_drop -REGRESS_PLPYTHON3_MANGLE := $(REGRESS) - include $(top_srcdir)/src/Makefile.shlib all: all-lib @@ -120,25 +111,21 @@ $(OBJS): | submake-generated-headers install: all install-lib install-data installdirs: installdirs-lib - $(MKDIR_P) '$(DESTDIR)$(datadir)/extension' '$(DESTDIR)$(includedir_server)' '$(DESTDIR)$(pgxsdir)/src/pl/plpython' + $(MKDIR_P) '$(DESTDIR)$(datadir)/extension' '$(DESTDIR)$(includedir_server)' 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))) - rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, plpython.h plpy_util.h) + rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, $(INCS)) .PHONY: install-data uninstall-data -include $(srcdir)/regress-python3-mangle.mk - - check: submake-pg-regress $(pg_regress_check) $(REGRESS_OPTS) $(REGRESS) diff --git a/third_party/spanner_pg/src/pl/plpython/expected/README b/third_party/spanner_pg/src/pl/plpython/expected/README index d735ae98..388c553a 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/README +++ b/third_party/spanner_pg/src/pl/plpython/expected/README @@ -1,8 +1,3 @@ Guide to alternative expected files: plpython_error_5.out Python 3.5 and newer - -plpython_unicode.out server encoding != SQL_ASCII -plpython_unicode_3.out server encoding == SQL_ASCII - -plpython_types_3.out Python 3.x diff --git a/third_party/spanner_pg/src/pl/plpython/expected/plpython_call.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_call.out index 55e10272..4c069006 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_call.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_composite.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_composite.out index af801923..bb101e07 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_composite.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_do.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_do.out index e300530e..d131a4c0 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_do.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_drop.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_drop.out index a0e3b5c4..97bb54a5 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_drop.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_ereport.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_ereport.out index b73bfff5..74dcc419 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_ereport.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_error.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_error.out index 0f1bab13..68722b00 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_error.out +++ b/third_party/spanner_pg/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,7 +241,7 @@ 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' CONTEXT: Traceback (most recent call last): @@ -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" @@ -452,7 +452,7 @@ CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ plan = plpy.prepare("SELECT to_date('xy', 'DD') d") for row in plpy.cursor(plan): yield row['d'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT python_error_detail(); ERROR: error fetching next item from iterator DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD" diff --git a/third_party/spanner_pg/src/pl/plpython/expected/plpython_error_5.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_error_5.out index 0e67b5a5..fd9cd73b 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_error_5.out +++ b/third_party/spanner_pg/src/pl/plpython/expected/plpython_error_5.out @@ -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" @@ -452,7 +452,7 @@ CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ plan = plpy.prepare("SELECT to_date('xy', 'DD') d") for row in plpy.cursor(plan): yield row['d'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT python_error_detail(); ERROR: error fetching next item from iterator DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD" diff --git a/third_party/spanner_pg/src/pl/plpython/expected/plpython_global.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_global.out index 192e3e48..a4cfb148 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_global.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_import.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_import.out index b59e1821..854e989e 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_import.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_newline.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_newline.out index 27dc2f8a..2bc14925 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_newline.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_params.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_params.out index 46ea7dfb..d1a36f36 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_params.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_quote.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_quote.out index eed72923..1fbe93d5 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_quote.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_record.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_record.out index 45833071..31de1985 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_record.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_setof.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_setof.out index 170dbc39..39409400 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_setof.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_spi.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_spi.out index a09df68c..8853e254 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_spi.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_subtransaction.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_subtransaction.out index 2a565419..43d9277a 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_subtransaction.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_test.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_test.out index 39b994f4..13c14119 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_test.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_transaction.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_transaction.out index 72d1e45a..659ccefc 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_transaction.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_trigger.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_trigger.out index 742988a5..dd1ca32f 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_trigger.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_types.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_types.out index d1776365..8a680e15 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_types.out +++ b/third_party/spanner_pg/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,7 +682,7 @@ 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 @@ -690,7 +690,7 @@ PL/Python function "test_type_conversion_array_mixed2" -- check output of multi-dimensional arrays CREATE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [['a'], ['b'], ['c']] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); test_type_conversion_md_array_out ----------------------------------- @@ -699,7 +699,7 @@ select test_type_conversion_md_array_out(); CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], []] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); test_type_conversion_md_array_out ----------------------------------- @@ -708,63 +708,63 @@ select test_type_conversion_md_array_out(); CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], [1]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_md_array_out" CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], 1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_md_array_out" CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [1, []] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_md_array_out" CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[1], [[]]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_md_array_out" 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: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_mdarray_malformed" CREATE FUNCTION test_type_conversion_mdarray_malformed2() RETURNS text[] AS $$ return [[1,2,3], "abc"] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed2(); ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_mdarray_malformed2" CREATE FUNCTION test_type_conversion_mdarray_malformed3() RETURNS text[] AS $$ return ["abc", [1,2,3]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed3(); ERROR: multidimensional arrays must have array expressions with matching dimensions CONTEXT: while creating return value PL/Python function "test_type_conversion_mdarray_malformed3" 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 ----------------------------------- @@ -773,7 +773,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 ----------------------------------- @@ -782,7 +782,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 ---------------------------------- @@ -791,7 +791,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 @@ -803,16 +803,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 ----------------------------------- @@ -820,7 +820,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 @@ -831,9 +831,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 @@ -841,7 +841,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 ------------------------ @@ -860,7 +860,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 @@ -873,9 +873,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 @@ -887,9 +887,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} @@ -906,7 +906,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 ------+---------------------------- @@ -936,7 +936,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 --------------------------- @@ -956,7 +956,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 ------------ @@ -973,7 +973,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 ------------------------- @@ -984,7 +984,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 -------------------------- @@ -997,7 +997,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 --------------------------- @@ -1012,7 +1012,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 @@ -1025,7 +1025,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) @@ -1040,7 +1040,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) @@ -1053,7 +1053,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) @@ -1061,7 +1061,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/third_party/spanner_pg/src/pl/plpython/expected/plpython_types_3.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_types_3.out deleted file mode 100644 index 6fadd546..00000000 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_types_3.out +++ /dev/null @@ -1,1069 +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" --- check output of multi-dimensional arrays -CREATE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [['a'], ['b'], ['c']] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); - test_type_conversion_md_array_out ------------------------------------ - {{a},{b},{c}} -(1 row) - -CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [[], []] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); - test_type_conversion_md_array_out ------------------------------------ - {} -(1 row) - -CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [[], [1]] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); -- fail -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_md_array_out" -CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [[], 1] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); -- fail -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_md_array_out" -CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [1, []] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); -- fail -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_md_array_out" -CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ -return [[1], [[]]] -$$ LANGUAGE plpython3u; -select test_type_conversion_md_array_out(); -- fail -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_md_array_out" -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: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_mdarray_malformed" -CREATE FUNCTION test_type_conversion_mdarray_malformed2() RETURNS text[] AS $$ -return [[1,2,3], "abc"] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_mdarray_malformed2(); -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_mdarray_malformed2" -CREATE FUNCTION test_type_conversion_mdarray_malformed3() RETURNS text[] AS $$ -return ["abc", [1,2,3]] -$$ LANGUAGE plpython3u; -SELECT * FROM test_type_conversion_mdarray_malformed3(); -ERROR: multidimensional arrays must have array expressions with matching dimensions -CONTEXT: while creating return value -PL/Python function "test_type_conversion_mdarray_malformed3" -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/third_party/spanner_pg/src/pl/plpython/expected/plpython_unicode.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_unicode.out index c7546dd4..fd54b0b8 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_unicode.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/expected/plpython_void.out b/third_party/spanner_pg/src/pl/plpython/expected/plpython_void.out index 1080d12d..07d07607 100644 --- a/third_party/spanner_pg/src/pl/plpython/expected/plpython_void.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/generate-spiexceptions.pl b/third_party/spanner_pg/src/pl/plpython/generate-spiexceptions.pl index 488c980e..43289d21 100644 --- a/third_party/spanner_pg/src/pl/plpython/generate-spiexceptions.pl +++ b/third_party/spanner_pg/src/pl/plpython/generate-spiexceptions.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # # Generate the spiexceptions.h header from errcodes.txt -# Copyright (c) 2000-2021, PostgreSQL Global Development Group +# Copyright (c) 2000-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/pl/plpython/nls.mk b/third_party/spanner_pg/src/pl/plpython/nls.mk index c46e2620..a7d31447 100644 --- a/third_party/spanner_pg/src/pl/plpython/nls.mk +++ b/third_party/spanner_pg/src/pl/plpython/nls.mk @@ -1,6 +1,6 @@ # src/pl/plpython/nls.mk CATALOG_NAME = plpython -AVAIL_LANGUAGES = cs de el es fr it ja ko pl pt_BR ru sv tr uk vi zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN GETTEXT_FILES = plpy_cursorobject.c plpy_elog.c plpy_exec.c plpy_main.c plpy_planobject.c plpy_plpymodule.c \ plpy_procedure.c plpy_resultobject.c plpy_spi.c plpy_subxactobject.c plpy_typeio.c plpy_util.c GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) PLy_elog:2 PLy_exception_set:2 PLy_exception_set_plural:2,3 diff --git a/third_party/spanner_pg/src/pl/plpython/plpy_cursorobject.c b/third_party/spanner_pg/src/pl/plpython/plpy_cursorobject.c index 08d8b607..6b6e7433 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_cursorobject.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_elog.c b/third_party/spanner_pg/src/pl/plpython/plpy_elog.c index 9b5b3bed..70de5ba1 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_elog.c +++ b/third_party/spanner_pg/src/pl/plpython/plpy_elog.c @@ -190,24 +190,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 @@ -287,11 +283,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", @@ -362,7 +358,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) { @@ -570,7 +566,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); } @@ -586,7 +582,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/third_party/spanner_pg/src/pl/plpython/plpy_exec.c b/third_party/spanner_pg/src/pl/plpython/plpy_exec.c index b38c73ae..993a4e2e 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_exec.c +++ b/third_party/spanner_pg/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 { @@ -720,35 +718,35 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r PG_TRY(); { - 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); @@ -759,7 +757,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); @@ -770,7 +768,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, @@ -783,7 +781,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, @@ -796,7 +794,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, @@ -823,7 +821,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); @@ -832,13 +830,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); @@ -864,7 +862,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 @@ -949,9 +947,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/third_party/spanner_pg/src/pl/plpython/plpy_main.c b/third_party/spanner_pg/src/pl/plpython/plpy_main.c index 3eedaa80..0bce1064 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_main.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_planobject.c b/third_party/spanner_pg/src/pl/plpython/plpy_planobject.c index 5951d2a6..ec2439c6 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_planobject.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.c b/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.c index 907f89d1..fa08f0db 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.h b/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.h index 54d78101..1ca3823d 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.h +++ b/third_party/spanner_pg/src/pl/plpython/plpy_plpymodule.h @@ -5,15 +5,14 @@ #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 */ 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/third_party/spanner_pg/src/pl/plpython/plpy_resultobject.c b/third_party/spanner_pg/src/pl/plpython/plpy_resultobject.c index 54f39419..a8516b2d 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_resultobject.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_spi.c b/third_party/spanner_pg/src/pl/plpython/plpy_spi.c index 86d70470..9a71a42c 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_spi.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_typeio.c b/third_party/spanner_pg/src/pl/plpython/plpy_typeio.c index 707fe416..db14c5f8 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_typeio.c +++ b/third_party/spanner_pg/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, @@ -60,7 +60,7 @@ static void PLySequence_ToArray_recurse(PyObject *obj, PLyObToDatum *elm, Oid elmbasetype); /* 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); @@ -518,10 +518,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; @@ -533,7 +533,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; @@ -601,15 +601,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 * @@ -639,10 +639,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; @@ -955,8 +955,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 @@ -1033,25 +1033,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"); @@ -1286,7 +1278,7 @@ PLySequence_ToArray_recurse(PyObject *obj, ArrayBuildState **astatep, * 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/third_party/spanner_pg/src/pl/plpython/plpy_util.c b/third_party/spanner_pg/src/pl/plpython/plpy_util.c index 4a7d7264..22e2a599 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_util.c +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpy_util.h b/third_party/spanner_pg/src/pl/plpython/plpy_util.h index c9ba7edc..7c657792 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpy_util.h +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpython.h b/third_party/spanner_pg/src/pl/plpython/plpython.h index ae1275af..c8f12c0e 100644 --- a/third_party/spanner_pg/src/pl/plpython/plpython.h +++ b/third_party/spanner_pg/src/pl/plpython/plpython.h @@ -2,7 +2,7 @@ * * plpython.h - Python as a procedural language for PostgreSQL * - * 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 * * src/pl/plpython/plpython.h @@ -22,116 +22,17 @@ #endif /* - * Undefine some things that get (re)defined in the Python headers. They aren't - * used by the PL/Python code, and all PostgreSQL headers should be included - * earlier, so this should be pretty safe. + * Pull in Python headers via a wrapper header, to control the scope of + * the system_header pragma therein. */ -#undef _POSIX_C_SOURCE -#undef _XOPEN_SOURCE - -/* - * Sometimes python carefully scribbles on our *printf macros. - * So we undefine them here and redefine them after it's done its dirty deed. - */ -#undef vsnprintf -#undef snprintf -#undef vsprintf -#undef sprintf -#undef vfprintf -#undef fprintf -#undef vprintf -#undef printf - -#if defined(_MSC_VER) && defined(_DEBUG) -/* Python uses #pragma to bring in a non-default libpython on VC++ if - * _DEBUG is defined */ -#undef _DEBUG -/* Also hide away errcode, since we load Python.h before postgres.h */ -#define errcode __msvc_errcode -#include -#undef errcode -#define _DEBUG -#elif defined (_MSC_VER) -#define errcode __msvc_errcode -#include -#undef errcode -#else -#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 +#include "plpython_system.h" /* define our text domain for translations */ #undef TEXTDOMAIN #define TEXTDOMAIN PG_TEXTDOMAIN("plpython") -/* put back our *printf macros ... this must match src/include/port.h */ -#ifdef vsnprintf -#undef vsnprintf -#endif -#ifdef snprintf -#undef snprintf -#endif -#ifdef vsprintf -#undef vsprintf -#endif -#ifdef sprintf -#undef sprintf -#endif -#ifdef vfprintf -#undef vfprintf -#endif -#ifdef fprintf -#undef fprintf -#endif -#ifdef vprintf -#undef vprintf -#endif -#ifdef printf -#undef printf -#endif - -#define vsnprintf pg_vsnprintf -#define snprintf pg_snprintf -#define vsprintf pg_vsprintf -#define sprintf pg_sprintf -#define vfprintf pg_vfprintf -#define fprintf pg_fprintf -#define vprintf pg_vprintf -#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" diff --git a/third_party/spanner_pg/src/pl/plpython/plpython2u--1.0.sql b/third_party/spanner_pg/src/pl/plpython/plpython2u--1.0.sql deleted file mode 100644 index 69f74775..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpython2u.control b/third_party/spanner_pg/src/pl/plpython/plpython2u.control deleted file mode 100644 index 39c2b791..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpython_system.h b/third_party/spanner_pg/src/pl/plpython/plpython_system.h new file mode 100644 index 00000000..e93583f5 --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpython/plpython_system.h @@ -0,0 +1,103 @@ +/*------------------------------------------------------------------------- + * + * plpython_system.h - pull in Python's system header files + * + * We break this out as a separate header file to precisely control + * the scope of the "system_header" pragma. No Postgres-specific + * declarations should be put here. However, we do include some stuff + * that is meant to prevent conflicts between our code and Python. + * + * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/pl/plpython/plpython_system.h + * + *------------------------------------------------------------------------- + */ +#ifndef PLPYTHON_SYSTEM_H +#define PLPYTHON_SYSTEM_H + +/* + * Newer versions of the Python headers trigger a lot of warnings with our + * preferred compiler flags (at least -Wdeclaration-after-statement is known + * to be problematic). The system_header pragma hides warnings from within + * the rest of this file, if supported. + */ +#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER +#pragma GCC system_header +#endif + +/* + * Undefine some things that get (re)defined in the Python headers. They aren't + * used by the PL/Python code, and all PostgreSQL headers should be included + * earlier, so this should be pretty safe. + */ +#undef _POSIX_C_SOURCE +#undef _XOPEN_SOURCE + +/* + * Sometimes python carefully scribbles on our *printf macros. + * So we undefine them here and redefine them after it's done its dirty deed. + */ +#undef vsnprintf +#undef snprintf +#undef vsprintf +#undef sprintf +#undef vfprintf +#undef fprintf +#undef vprintf +#undef printf + +#if defined(_MSC_VER) && defined(_DEBUG) +/* Python uses #pragma to bring in a non-default libpython on VC++ if + * _DEBUG is defined */ +#undef _DEBUG +/* Also hide away errcode, since we load Python.h before postgres.h */ +#define errcode __msvc_errcode +#include +#undef errcode +#define _DEBUG +#elif defined (_MSC_VER) +#define errcode __msvc_errcode +#include +#undef errcode +#else +#include +#endif + +/* put back our *printf macros ... this must match src/include/port.h */ +#ifdef vsnprintf +#undef vsnprintf +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsprintf +#undef vsprintf +#endif +#ifdef sprintf +#undef sprintf +#endif +#ifdef vfprintf +#undef vfprintf +#endif +#ifdef fprintf +#undef fprintf +#endif +#ifdef vprintf +#undef vprintf +#endif +#ifdef printf +#undef printf +#endif + +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf +#define vsprintf pg_vsprintf +#define sprintf pg_sprintf +#define vfprintf pg_vfprintf +#define fprintf pg_fprintf +#define vprintf pg_vprintf +#define printf(...) pg_printf(__VA_ARGS__) + +#endif /* PLPYTHON_SYSTEM_H */ diff --git a/third_party/spanner_pg/src/pl/plpython/plpythonu--1.0.sql b/third_party/spanner_pg/src/pl/plpython/plpythonu--1.0.sql deleted file mode 100644 index 4c6f7c3f..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/plpythonu.control b/third_party/spanner_pg/src/pl/plpython/plpythonu.control deleted file mode 100644 index ae91b1c2..00000000 --- a/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/pl/plpython/po/de.po b/third_party/spanner_pg/src/pl/plpython/po/de.po index ae74c72b..3e386b7d 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/de.po +++ b/third_party/spanner_pg/src/pl/plpython/po/de.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 12\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-05 06:41+0000\n" -"PO-Revision-Date: 2019-05-07 15:35+0200\n" +"POT-Creation-Date: 2023-05-05 06:26+0000\n" +"PO-Revision-Date: 2023-05-05 10:54+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -29,12 +29,12 @@ msgstr "plpy.cursor hat eine Anfrage oder einen Plan erwartet" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor nimmt eine Sequenz als zweites Argument" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "konnte Plan nicht ausführen" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -56,7 +56,7 @@ msgstr "Iteration mit einem Cursor in einer abgebrochenen Transaktionen" msgid "fetch from a closed cursor" msgstr "Lesen aus einem geschlossenen Cursor" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "Anfrageergebnis hat zu viele Zeilen, um in eine Python-Liste zu passen" @@ -66,7 +66,7 @@ msgstr "Anfrageergebnis hat zu viele Zeilen, um in eine Python-Liste zu passen" msgid "closing a cursor in an aborted subtransaction" msgstr "Schließen eines Cursors in einer abgebrochenen Subtransaktion" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:546 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -106,166 +106,166 @@ msgstr "PL/Python-Prozedur hat nicht None zurückgegeben" msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python-Funktion mit Rückgabetyp »void« hat nicht None zurückgegeben" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "unerwarteter Rückgabewert von Triggerprozedur" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Erwartete None oder eine Zeichenkette." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "PL/Python-Funktion gab in einem DELETE-Trigger \"MODIFY\" zurück -- ignoriert" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Erwartete None, \"OK\", \"SKIP\" oder \"MODIFY\"." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() fehlgeschlagen, beim Einrichten der Argumente" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() fehlgeschlagen, beim Einrichten der Argumente" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, 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" -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "beim Erzeugen des Rückgabewerts" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] wurde gelöscht, kann Zeile nicht ändern" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] ist kein Dictionary" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "Dictionary-Schlüssel auf Position %d in TD[\"new\"] ist keine Zeichenkette" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "in TD[\"new\"] gefundener Schlüssel »%s« existiert nicht als Spalte in der den Trigger auslösenden Zeile" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "beim Ändern der Triggerzeile" -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "Abbruch einer Subtransaktion, die nicht beendet wurde, wird erzwungen" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "in dieser Sitzung sind mehrere Python-Bibliotheken präsent" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Nur eine Python-Hauptversion kann in einer Sitzung verwendet werden." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "nicht abgefangener Fehler bei der Initialisierung" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "konnte Modul »__main__« nicht importieren" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "konnte globale Objekte nicht initialisieren" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python-Prozedur »%s«" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python-Funktion »%s«" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "anonymer PL/Python-Codeblock" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "konnte Modul »plpy« nicht importieren" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "konnte das Modul »spiexceptions« nicht erzeugen" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "konnte das Modul »spiexceptions« nicht hinzufügen" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "konnte SPI-Ausnahmen nicht erzeugen" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "konnte Argumente in plpy.elog nicht entpacken" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "konnte Fehlermeldung in plpy.elog nicht parsen" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "Argument »message« wurde durch Namen und Position angegeben" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "»%s« ist ein ungültiges Schlüsselwortargument für diese Funktion" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "ungültiger SQLSTATE-Code" @@ -305,27 +305,27 @@ msgstr "Befehl hat keine Ergebnismenge erzeugt" msgid "second argument of plpy.prepare must be a sequence" msgstr "zweites Argument von plpy.prepare muss eine Sequenz sein" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: Typname auf Position %d ist keine Zeichenkette" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute hat eine Anfrage oder einen Plan erwartet" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute nimmt eine Sequenz als zweites Argument" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan fehlgeschlagen: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute fehlgeschlagen: %s" @@ -370,72 +370,72 @@ msgstr "Umwandlung von numeric in Decimal fehlgeschlagen" msgid "could not create bytes representation of Python object" msgstr "konnte Bytes-Darstellung eines Python-Objektes nicht erzeugen" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "konnte Zeichenkettendarstellung eines Python-Objektes nicht erzeugen" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "konnte Python-Objekt nicht in cstring umwandeln: Python-Zeichenkettendarstellung enthält anscheinend Null-Bytes" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "Rückgabewert von Funktion mit Array-Rückgabetyp ist keine Python-Sequenz" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "konnte Sequenzlänge für Funktionsrückgabewert nicht ermitteln" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen überschreitet erlaubtes Maximum (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "fehlerhafte Record-Konstante: »%s«" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Linke Klammer fehlt." -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Um einen zusammengesetzten Typ in einem Array zurückzugeben, geben Sie den zusammengesetzten Typ als ein Python-Tupel zurück, z.B. »[('foo',)]«." -#: plpy_typeio.c:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "Schlüssel »%s« nicht in Mapping gefunden" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Um einen NULL-Wert in einer Spalte zurückzugeben, muss der Wert None mit einem nach der Spalte benannten Schlüssel in das Mapping eingefügt werden." -#: plpy_typeio.c:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "Länge der zurückgegebenen Sequenz hat nicht mit der Anzahl der Spalten in der Zeile übereingestimmt" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "Attribut »%s« existiert nicht in Python-Objekt" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Um einen NULL-Wert in einer Spalte zurückzugeben, muss das zurückzugebende Objekt ein nach der Spalte benanntes Attribut mit dem Wert None haben." diff --git a/third_party/spanner_pg/src/pl/plpython/po/es.po b/third_party/spanner_pg/src/pl/plpython/po/es.po index ac82ec33..13bda287 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/es.po +++ b/third_party/spanner_pg/src/pl/plpython/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 14\n" +"Project-Id-Version: plpython (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:54+0000\n" -"PO-Revision-Date: 2019-06-06 17:26-0400\n" +"POT-Creation-Date: 2023-05-07 16:39+0000\n" +"PO-Revision-Date: 2022-10-20 09:06+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -31,12 +31,12 @@ msgstr "plpy.cursor espera una consulta o un plan" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor lleva una secuencia como segundo argumento" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "no se pudo ejecutar el plan" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -58,7 +58,7 @@ msgstr "iterando un cursor en una subtransacción abortada" msgid "fetch from a closed cursor" msgstr "haciendo «fetch» en un cursor cerrado" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "el resultado de la consulta tiene demasiados registros y no entran en una lista de Python" @@ -68,7 +68,7 @@ msgstr "el resultado de la consulta tiene demasiados registros y no entran en un msgid "closing a cursor in an aborted subtransaction" msgstr "cerrando un cursor en una subtransacción abortada" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:546 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -108,167 +108,167 @@ msgstr "procedimiento PL/Python no returnó None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "función PL/Python con tipo de retorno «void» no retorna None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "valor de retorno no esperado desde el procedimiento disparador" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Se esperaba None o una cadena." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "función de disparador de PL/Python retorno «MODIFY» en un disparador de tipo DELETE -- ignorado" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Se esperaba None, «OK», «SKIP» o «MODIFY»." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() falló, mientras se inicializaban los argumentos" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() falló, mientras se inicializaban los argumentos" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, 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" -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "mientras se creaba el valor de retorno" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] borrado, no se puede modicar el registro" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] no es un diccionario" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "el nombre del atributo de TD[\"new\"] en la posición %d no es una cadena" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "la llave «%s» en TD[\"new\"] no existe como columna en la fila disparadora" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "no se puede definir el atributo de sistema «%s»" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "no se puede definir el atributo generado «%s»" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "mientras se modificaba la fila de disparador" # FIXME not very happy with this -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "abortando una subtransacción que no se ha cerrado" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "hay múltiples librerías de Python presentes en esta sesión" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Sólo se puede usar una versión mayor de Python en cada sesión." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "error no capturado en la inicialización" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "no se pudo importar el módulo «__main__»" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "no se pudo inicializar las globales" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "procedimiento PL/Python «%s»" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "función PL/Python «%s»" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "bloque de código anónimo de PL/Python" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "no se pudo importar el módulo «plpy»" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "no se pudo crear el módulo spiexceptions" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "no se pudo importar el módulo spiexceptions" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "no se pudo generar excepciones SPI" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "no se pudo desempaquetar los argumentos de plpy.elog" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "no se pudo analizar el mensaje de error de plpy.elog" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "el argumento 'message' fue pasado por nombre y posición" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "«%s» no es un argumento válido para esta función" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "código SQLSTATE no válido" @@ -308,27 +308,27 @@ msgstr "la orden no produjo un conjunto de resultados" msgid "second argument of plpy.prepare must be a sequence" msgstr "el segundo argumento de plpy.prepare debe ser una secuencia" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: el nombre de tipo en la posición %d no es una cadena" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute espera una consulta o un plan" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute lleva una secuencia como segundo argumento" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "falló SPI_execute_plan: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "falló SPI_execute: %s" @@ -373,72 +373,72 @@ msgstr "falló la conversión de numeric a Decimal" msgid "could not create bytes representation of Python object" msgstr "no se pudo crear la representación de cadena de bytes de Python" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "no se pudo crear la representación de cadena de texto del objeto de Python" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "no se pudo convertir el objeto Python a un cstring: la representación de cadena Python parece tener bytes nulos (\\0)" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "el valor de retorno de la función con tipo de retorno array no es una secuencia Python" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "no se pudo determinar el largo de secuencia del retorno de valor de la función" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "los arrays multidimensionales deben tener expresiones de arrays con dimensiones coincidentes" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "el número de dimensiones del array excede el máximo permitido (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "literal de record no es válido: «%s»" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Falta paréntesis izquierdo." -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Para retornar un tipo compuesto en un array, retorne el tipo compuesto como una tupla de Python, e.g., «[('foo',)]»." -#: plpy_typeio.c:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "la llave «%s» no fue encontrada en el mapa" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Para retornar null en una columna, agregue el valor None al mapa, con llave llamada igual que la columna." -#: plpy_typeio.c:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "el tamaño de la secuencia retornada no concuerda con el número de columnas de la fila" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "el atributo «%s» no existe en el objeto Python" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Para retornar null en una columna, haga que el objeto retornado tenga un atributo llamado igual que la columna, con valor None." diff --git a/third_party/spanner_pg/src/pl/plpython/po/fr.po b/third_party/spanner_pg/src/pl/plpython/po/fr.po index 5adf3559..b002f9b9 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/fr.po +++ b/third_party/spanner_pg/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: 2023-05-05 14:08+0000\n" -"PO-Revision-Date: 2019-05-17 14:58+0200\n" +"POT-Creation-Date: 2023-05-05 17:08+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:72 #, c-format @@ -29,12 +31,12 @@ msgstr "plpy.cursor attendait une requête ou un plan" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor prends une séquence dans son second argument" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "n'a pas pu exécuter le plan" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -56,7 +58,7 @@ msgstr "itération d'un curseur dans une sous-transaction annulée" msgid "fetch from a closed cursor" msgstr "récupérer à partir d'un curseur fermé" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "le résultat de la requête contient trop de lignes pour être intégré dans une liste Python" @@ -66,7 +68,7 @@ msgstr "le résultat de la requête contient trop de lignes pour être intégré msgid "closing a cursor in an aborted subtransaction" msgstr "fermeture d'un curseur dans une sous-transaction annulée" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:546 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -110,172 +112,172 @@ msgstr "la procédure PL/python n'a pas renvoyé None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "la fonction PL/python avec un code de retour « void » ne renvoyait pas None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "valeur de retour inattendue de la procédure trigger" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Attendait None ou une chaîne de caractères." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "" "la fonction trigger PL/python a renvoyé « MODIFY » dans un trigger DELETE\n" "-- ignoré" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Attendait None, « OK », « SKIP » ou « MODIFY »." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "échec de PyList_SetItem() lors de l'initialisation des arguments" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "échec de PyDict_SetItemString() lors de l'initialisation des arguments" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, 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" -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "lors de la création de la valeur de retour" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] supprimé, ne peut pas modifier la ligne" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] n'est pas un dictionnaire" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "la clé TD[\"new\"] à la position ordinale %d n'est pas une chaîne" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "" "la clé « %s » trouvée dans TD[\"new\"] n'existe pas comme colonne\n" "de la ligne impactée par le trigger" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "lors de la modification de la ligne du trigger" -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "annulation forcée d'une sous-transaction qui n'a jamais été quittée" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "plusieurs bibliothèques Python sont présentes dans la session" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Seule une version majeure de Python peut être utilisée dans une session." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "erreur non récupérée dans l'initialisation" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "n'a pas pu importer le module « __main__ »" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "n'a pas pu initialiser les variables globales" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "procédure PL/python « %s »" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "fonction PL/python « %s »" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "bloc de code PL/Python anonyme" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "n'a pas pu importer le module « plpy »" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "n'a pas pu créer le module « spiexceptions »" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "n'a pas pu ajouter le module « spiexceptions »" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "n'a pas pu générer les exceptions SPI" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "n'a pas pu déballer les arguments dans plpy.elog" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "n'a pas pu analyser le message d'erreur dans plpy.elog" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "argument 'message' donné par nom et position" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' est une argument mot-clé invalide pour cette fonction" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "code SQLSTATE invalide" @@ -315,27 +317,27 @@ msgstr "la commande n'a pas fourni d'ensemble de résultats" msgid "second argument of plpy.prepare must be a sequence" msgstr "le second argument de plpy.prepare doit être une séquence" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare : le nom du type sur la position ordinale %d n'est pas une chaîne" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.prepare attendait une requête ou un plan" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute prends une séquence dans son second argument" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "échec de SPI_execute_plan : %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "échec de SPI_execute : %s" @@ -380,78 +382,78 @@ msgstr "échec de la conversion numeric vers Decimal" msgid "could not create bytes representation of Python object" msgstr "n'a pas pu créer une représentation octets de l'objet Python" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "n'a pas pu créer une représentation chaîne de caractères de l'objet Python" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "n'a pas pu convertir l'objet Python en csting : la représentation de la chaîne Python contient des octets nuls" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "la valeur de retour de la fonction de type tableau n'est pas une séquence Python" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "n'a pas pu déterminer la longueur de la séquence pour la valeur de retour de la fonction" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format 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" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "le nombre de dimensions du tableau dépasse le maximum autorisé (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "enregistrement litéral invalide : « %s »" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Parenthèse gauche manquante." -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Pour renvoyer un type composite dans un tableau, renvoyez le type composite sous la forme d'un tuple Python, c'est-à-dire \"[('foo',)]\"." -#: plpy_typeio.c:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "la clé « %s » introuvable dans la correspondance" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "" "Pour renvoyer NULL dans une colonne, ajoutez la valeur None à la\n" "correspondance de la clé nommée d'après la colonne." -#: plpy_typeio.c:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "" "la longueur de la séquence renvoyée ne correspondait pas au nombre de\n" "colonnes dans la ligne" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "l'attribut « %s » n'existe pas dans l'objet Python" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "" diff --git a/third_party/spanner_pg/src/pl/plpython/po/it.po b/third_party/spanner_pg/src/pl/plpython/po/it.po index 32e65293..26ef9e0d 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/it.po +++ b/third_party/spanner_pg/src/pl/plpython/po/it.po @@ -16,450 +16,455 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL) 11\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2018-10-08 14:07+0000\n" -"PO-Revision-Date: 2018-10-08 23:11+0100\n" -"Last-Translator: Daniele Varrazzo \n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-30 12:08+0000\n" +"PO-Revision-Date: 2022-09-30 15:00+0200\n" +"Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\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.0.6\n" +"X-Generator: Poedit 2.3\n" -#: plpy_cursorobject.c:101 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor richiede una query o un piano" -#: plpy_cursorobject.c:184 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor richiede una sequenza come secondo argomento" -#: plpy_cursorobject.c:200 plpy_spi.c:211 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "esecuzione del piano fallita" -#: plpy_cursorobject.c:203 plpy_spi.c:214 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Attesa sequenza di %d argomento, ricevuti %d: %s" msgstr[1] "Attesa sequenza di %d argomenti, ricevuti %d: %s" -#: plpy_cursorobject.c:352 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "iterazione di un cursore chiuso" -#: plpy_cursorobject.c:360 plpy_cursorobject.c:426 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "iterazione di un cursore in una sotto-transazione interrotta" -#: plpy_cursorobject.c:418 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "lettura da un cursore chiuso" -#: plpy_cursorobject.c:461 plpy_spi.c:409 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "il risultato della query ha troppe righe per una lista Python" -#: plpy_cursorobject.c:512 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "chiusura di un cursore in una sotto-transazione interrotta" -#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:559 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:142 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "modalità di ritorno della funzione set non supportata" -#: plpy_exec.c:143 +#: plpy_exec.c:140 #, c-format msgid "PL/Python set-returning functions only support returning one value per call." msgstr "Le funzioni PL/Python che restituiscono insiemi supportano la restituzione di un solo valore per chiamata." -#: plpy_exec.c:156 +#: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" msgstr "l'oggetto restituito non può essere iterato" -#: plpy_exec.c:157 +#: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "Le funzioni PL/Python che restituiscono insiemi devono restituire un oggetto iterabile." -#: plpy_exec.c:171 +#: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" msgstr "errore nell'ottenere l'elemento successivo dall'iteratore" -#: plpy_exec.c:214 +#: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" msgstr "la procedura PL/Python non ha restituito None" -#: plpy_exec.c:218 +#: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "la funzione PL/Python che restituisce \"void\" non ha restituito None" -#: plpy_exec.c:374 plpy_exec.c:400 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "la prodedura trigger ha restituito un valore inatteso" -#: plpy_exec.c:375 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Atteso None o una stringa." -#: plpy_exec.c:390 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "la funzione trigger PL/Python ha restituito \"MODIFY\" in un trigger DELETE -- ignorato" -#: plpy_exec.c:401 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Atteso None, \"OK\", \"SKIP\", o \"MODIFY\"." -#: plpy_exec.c:451 +#: plpy_exec.c:441 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() è fallita durante l'impostazione degli argomenti" -#: plpy_exec.c:455 +#: plpy_exec.c:445 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() è fallita durante l'impostazione degli argomenti" -#: plpy_exec.c:467 +#: plpy_exec.c:457 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "la funzione che restituisce un record è chiamata in un contesto che non può accettare il tipo record" -#: plpy_exec.c:684 +#: plpy_exec.c:674 #, c-format msgid "while creating return value" msgstr "durante la creazione del valore da restituire" -#: plpy_exec.c:909 +#: plpy_exec.c:908 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] cancellato, non è possibile modificare la riga" -#: plpy_exec.c:914 +#: plpy_exec.c:913 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] non è un dizionario" -#: plpy_exec.c:941 +#: plpy_exec.c:938 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "la chiave di dizionario TD[\"new\"] alla posizione %d non è una stringa" -#: plpy_exec.c:948 +#: plpy_exec.c:945 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "la chiave \"%s\" trovata in TD[\"new\"] non esiste come colonna nella riga del trigger" -#: plpy_exec.c:953 +#: plpy_exec.c:950 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "non è possibile impostare l'attributo di sistema \"%s\"" -#: plpy_exec.c:1011 +#: plpy_exec.c:955 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "impossibile impostare la colonna generata \"%s\"" + +#: plpy_exec.c:1013 #, c-format msgid "while modifying trigger row" msgstr "durante la modifica della riga trigger" -#: plpy_exec.c:1072 +#: plpy_exec.c:1071 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "interruzione forzata di una sotto-transazione che non è terminata" -#: plpy_main.c:125 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "c'è più di una libreria Python presente nella sessione" -#: plpy_main.c:126 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Solo una versione maggiore di Python può essere usata in una sessione." -#: plpy_main.c:142 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "errore non catturato durante l'inizializzazione" -#: plpy_main.c:165 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "importazione del modulo \"__main__\"" -#: plpy_main.c:174 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "inizializzazione delle variabili globali fallita" -#: plpy_main.c:399 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "procedura PL/Python \"%s\"" -#: plpy_main.c:402 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "funzione PL/Python \"%s\"" -#: plpy_main.c:410 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "blocco di codice anonimo in PL/Python" -#: plpy_plpymodule.c:192 plpy_plpymodule.c:195 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "importazione del modulo \"plpy\" fallita" -#: plpy_plpymodule.c:210 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "creazione del modulo spiexceptions fallita" -#: plpy_plpymodule.c:218 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "aggiunta del modulo spiexceptions fallita" -#: plpy_plpymodule.c:286 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "generazione delle eccezioni SPI fallita" -#: plpy_plpymodule.c:454 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "non è stato possibile espandere gli argomenti in plpy.elog" -#: plpy_plpymodule.c:463 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "non è stato possibile interpretare il messaggio di errore in plpy.elog" -#: plpy_plpymodule.c:480 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "parametro 'message' dato con nome e posizione" -#: plpy_plpymodule.c:507 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' è un nome di argomento non valido per questa funzione" -#: plpy_plpymodule.c:518 plpy_plpymodule.c:524 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "codice SQLSTATE non valido" -#: plpy_procedure.c:230 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "le funzioni trigger possono essere chiamate esclusivamente da trigger" -#: plpy_procedure.c:234 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "le funzioni PL/Python non possono restituire il tipo %s" -#: plpy_procedure.c:312 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "le funzioni PL/Python non possono accettare il tipo %s" -#: plpy_procedure.c:402 +#: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "compilazione della funzione PL/Python \"%s\" fallita" -#: plpy_procedure.c:405 +#: plpy_procedure.c:400 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "compilazione del blocco di codice anonimo PL/Python fallita" -#: plpy_resultobject.c:150 plpy_resultobject.c:176 plpy_resultobject.c:202 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "il comando non ha prodotto risultati" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "il secondo argomento di plpy.prepare deve essere una sequenza" -#: plpy_spi.c:104 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: il nome del tipo nella posizione %d non è una stringa" -#: plpy_spi.c:176 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute si aspetta una query o un plan" -#: plpy_spi.c:195 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute richiede una sequenza come secondo argomento" -#: plpy_spi.c:305 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan ha fallito: %s" -#: plpy_spi.c:347 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute ha fallito: %s" -#: plpy_subxactobject.c:122 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "si è già entrati in questa sotto-transazione" -#: plpy_subxactobject.c:128 plpy_subxactobject.c:186 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "si è già usciti da questa sotto-transazione" -#: plpy_subxactobject.c:180 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "non si è entrati in questa sotto-transazione" -#: plpy_subxactobject.c:192 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "non c'è nessuna transazione da cui uscire" -#: plpy_typeio.c:591 +#: plpy_typeio.c:587 #, c-format msgid "could not import a module for Decimal constructor" msgstr "importazione di un modulo per il costrutto Decimal fallita" -#: plpy_typeio.c:595 +#: plpy_typeio.c:591 #, c-format msgid "no Decimal attribute in module" msgstr "attributo Decimal non trovato nel modulo" -#: plpy_typeio.c:601 +#: plpy_typeio.c:597 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "conversione da numeric a Decimal fallita" -#: plpy_typeio.c:908 +#: plpy_typeio.c:911 #, c-format msgid "could not create bytes representation of Python object" msgstr "creazione della rappresentazione in byte dell'oggetto Python fallita" -#: plpy_typeio.c:1056 +#: plpy_typeio.c:1048 #, c-format msgid "could not create string representation of Python object" msgstr "creazione della rappresentazione stringa dell'oggetto Python fallita" -#: plpy_typeio.c:1067 +#: plpy_typeio.c:1059 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "conversione dell'oggetto Python in cstring fallita: la rappresentazione stringa Python sembra contenere byte null" -#: plpy_typeio.c:1176 +#: plpy_typeio.c:1170 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "il numero di dimensioni dell'array supera il massimo consentito (%d)" -#: plpy_typeio.c:1180 +#: plpy_typeio.c:1175 #, c-format msgid "could not determine sequence length for function return value" msgstr "errore nel determinare la lunghezza della sequenza per il valore di ritorno della funzione" -#: plpy_typeio.c:1183 plpy_typeio.c:1187 +#: plpy_typeio.c:1180 plpy_typeio.c:1186 #, c-format msgid "array size exceeds the maximum allowed" msgstr "la dimensione dell'array supera il massimo consentito" -#: plpy_typeio.c:1213 +#: plpy_typeio.c:1214 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "il valore restituito dalla funzione con tipo restituito array non è una sequenza Python" -#: plpy_typeio.c:1259 +#: plpy_typeio.c:1261 #, c-format msgid "wrong length of inner sequence: has length %d, but %d was expected" msgstr "lunghezza errata della sequenza interna: la lunghezza è %d ma era atteso %d" -#: plpy_typeio.c:1261 +#: plpy_typeio.c:1263 #, c-format msgid "To construct a multidimensional array, the inner sequences must all have the same length." msgstr "Per costruire un array multidimensionale le sequenze interne devono avere tutte la stessa lunghezza." -#: plpy_typeio.c:1340 +#: plpy_typeio.c:1342 #, c-format msgid "malformed record literal: \"%s\"" msgstr "letterale di record non corretto: \"%s\"" -#: plpy_typeio.c:1341 +#: plpy_typeio.c:1343 #, c-format msgid "Missing left parenthesis." msgstr "Parentesi aperta mancante." -#: plpy_typeio.c:1342 plpy_typeio.c:1543 +#: plpy_typeio.c:1344 plpy_typeio.c:1545 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Per restutuire un tipo composito in un array, restituisci il tipo composito come tupla Python, per esempio \"[('foo',)]\" " -#: plpy_typeio.c:1389 +#: plpy_typeio.c:1391 #, c-format msgid "key \"%s\" not found in mapping" msgstr "la chiave \"%s\" non è stata trovata nel dizionario" -#: plpy_typeio.c:1390 +#: plpy_typeio.c:1392 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Per restituire null in una colonna, inserire nella mappa il valore None con una chiave chiamata come la colonna." -#: plpy_typeio.c:1443 +#: plpy_typeio.c:1445 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "la lunghezza della sequenza ritornata non rispetta il numero di colonne presenti nella riga" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1543 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "l'attributo \"%s\" non esiste nell'oggetto Python" -#: plpy_typeio.c:1544 +#: plpy_typeio.c:1546 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Per restituire null in una colonna, l'oggetto restituito deve avere un attributo chiamato come la colonna con valore None." -#: plpy_util.c:35 +#: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "conversione dell'oggetto Unicode Python in byte fallita" -#: plpy_util.c:41 +#: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" msgstr "estrazione dei byte dalla stringa codificata fallita" diff --git a/third_party/spanner_pg/src/pl/plpython/po/ja.po b/third_party/spanner_pg/src/pl/plpython/po/ja.po index 3177673e..56704782 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/ja.po +++ b/third_party/spanner_pg/src/pl/plpython/po/ja.po @@ -5,7 +5,7 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL 14)\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: 2021-08-25 17:42+0900\n" diff --git a/third_party/spanner_pg/src/pl/plpython/po/ka.po b/third_party/spanner_pg/src/pl/plpython/po/ka.po new file mode 100644 index 00000000..aeb662ed --- /dev/null +++ b/third_party/spanner_pg/src/pl/plpython/po/ka.po @@ -0,0 +1,462 @@ +# Georgian message translation file for plpython +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpython (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: plpython (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-08-23 22:55+0000\n" +"PO-Revision-Date: 2022-09-25 19:18+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1.1\n" + +#: plpy_cursorobject.c:72 +#, c-format +msgid "plpy.cursor expected a query or a plan" +msgstr "plpy.cursor გეგმას ან მოთხოვნას მოელოდა" + +#: plpy_cursorobject.c:155 +#, c-format +msgid "plpy.cursor takes a sequence as its second argument" +msgstr "plpy.cursor მეორე არგუმენტად მიმდევრობას იღებს" + +#: plpy_cursorobject.c:171 plpy_spi.c:205 +#, c-format +msgid "could not execute plan" +msgstr "გეგმის შესრულება ვერ მოხერხდა" + +#: plpy_cursorobject.c:174 plpy_spi.c:208 +#, 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" +msgstr[1] "მოველოდი %d არგუმენტის მიმდევრობას. მივიღე %d: %s" + +#: plpy_cursorobject.c:321 +#, c-format +msgid "iterating a closed cursor" +msgstr "დახურული კურსორის იტერაცია" + +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#, c-format +msgid "iterating a cursor in an aborted subtransaction" +msgstr "კურსორის იტერაცია გაუქმებულ ტრანზაქციაში" + +#: plpy_cursorobject.c:387 +#, c-format +msgid "fetch from a closed cursor" +msgstr "დახურული კურსორიდან გამოთხოვა" + +#: plpy_cursorobject.c:430 plpy_spi.c:401 +#, c-format +msgid "query result has too many rows to fit in a Python list" +msgstr "მოთხოვნის პასუხს Python-ის სიაში ჩასატევად მეტისმეტად ბევრი მწკრივი გააჩნია" + +#: plpy_cursorobject.c:482 +#, c-format +msgid "closing a cursor in an aborted subtransaction" +msgstr "გაუქმებულ ქვეტრანზაქციაში კურსორის დახურვა" + +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#, c-format +msgid "%s" +msgstr "%s" + +#: plpy_exec.c:139 +#, c-format +msgid "unsupported set function return mode" +msgstr "სეტების დამბრუნებელი ფუნქციის მხარდაუჭერელი რეჟიმი" + +#: 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:153 +#, c-format +msgid "returned object cannot be iterated" +msgstr "დაბრუნებული ობიექტის იტერაცია შეუძლებელია" + +#: plpy_exec.c:154 +#, c-format +msgid "PL/Python set-returning functions must return an iterable object." +msgstr "PL/Python-ის ფუნქციებმა, რომლებიც სეტებს აბრუნებენ, იტერირებადი ობიექტი უნდა დააბრუნონ." + +#: plpy_exec.c:168 +#, c-format +msgid "error fetching next item from iterator" +msgstr "იტერატორიდან შემდეგი ჩანაწერის მოთხოვის შეცდომა" + +#: plpy_exec.c:211 +#, c-format +msgid "PL/Python procedure did not return None" +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\", რაღაც დააბრუნა" + +#: plpy_exec.c:369 plpy_exec.c:395 +#, c-format +msgid "unexpected return value from trigger procedure" +msgstr "ტრიგერის პროცედურის მოულოდნელი დაბრუნებული მნიშვნელობა" + +#: plpy_exec.c:370 +#, c-format +msgid "Expected None or a string." +msgstr "ველოდებოდი არაფერს ან სტრიქონს." + +#: plpy_exec.c:385 +#, c-format +msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" +msgstr "PL/Python -ის ტრიგერმა ფუნქციამ DELETE ტრიგერში \"MODIFY\" დააბრუნა. -- იგნორირებულია" + +#: plpy_exec.c:396 +#, c-format +msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." +msgstr "მოსალოდნელია არცერთი, \"OK\", \"SKIP\", ან \"MODIFY\"." + +#: plpy_exec.c:446 +#, c-format +msgid "PyList_SetItem() failed, while setting up arguments" +msgstr "PyList_SetItem() -ის შეცდომა არგუმენტების მორგებისას" + +#: plpy_exec.c:450 +#, c-format +msgid "PyDict_SetItemString() failed, while setting up arguments" +msgstr "PyDict_SetItemString() -ის შეცდომა არგუმენტების მორგებისას" + +#: plpy_exec.c:462 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "ფუნქცია, რომელიც ჩანაწერს აბრუნებს, გამოძახებულია კონტექსტში, რომელსაც ჩანაწერის მიღება არ შეუძლია" + +#: plpy_exec.c:679 +#, c-format +msgid "while creating return value" +msgstr "დასაბრუნებელი მნიშვნელობის შექმნისას" + +#: plpy_exec.c:926 +#, c-format +msgid "TD[\"new\"] deleted, cannot modify row" +msgstr "TD[\"new\"] წაშლილია, მწკრივის შეცვლა შეუძლებელია" + +#: plpy_exec.c:931 +#, c-format +msgid "TD[\"new\"] is not a dictionary" +msgstr "TD[\"new\"] ლექსიკონი არაა" + +#: plpy_exec.c:956 +#, c-format +msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" +msgstr "TD[\"new\"] ლექსიკონის გასაღები ორდინალურ მდებარეობაზე %d სტრიქონს არ წარმოადგენს" + +#: plpy_exec.c:963 +#, 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:968 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "სისტემური ატრიბუტის დაყენების შეცდომა: \"%s\"" + +#: plpy_exec.c:973 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "გენერირებული სვეტის დაყენება შეუძლებელია: %s" + +#: plpy_exec.c:1031 +#, c-format +msgid "while modifying trigger row" +msgstr "ტრიგერის მწკრივის შეცვლისას" + +#: plpy_exec.c:1089 +#, c-format +msgid "forcibly aborting a subtransaction that has not been exited" +msgstr "ქვეტრანზაქცია, რომელიც ჯერ არ დასრულებულა, ძალით დასრულდება" + +#: plpy_main.c:111 +#, c-format +msgid "multiple Python libraries are present in session" +msgstr "სესია Python-ის ერთზე მეტ ბიბლიოთეკას შეიცავს" + +#: plpy_main.c:112 +#, c-format +msgid "Only one Python major version can be used in one session." +msgstr "ერთ სესიაში Python-ის მხოლოდ ერთი ძირითადი ვერსია შეგიძლიათ გამოიყენოთ." + +#: plpy_main.c:124 +#, c-format +msgid "untrapped error in initialization" +msgstr "დაუჭერელი შეცდომა ინიციალიზაციისას" + +#: plpy_main.c:147 +#, c-format +msgid "could not import \"__main__\" module" +msgstr "\"__main__\" მოდულის შემოტანის შეცდომა" + +#: plpy_main.c:156 +#, c-format +msgid "could not initialize globals" +msgstr "გლობალების ინიციალიზაციის შეცდომა" + +#: plpy_main.c:354 +#, c-format +msgid "PL/Python procedure \"%s\"" +msgstr "PL/Python -ის პროცედურა \"%s\"" + +#: plpy_main.c:357 +#, c-format +msgid "PL/Python function \"%s\"" +msgstr "PL/Python -ის ფუნქცია \"%s\"" + +#: plpy_main.c:365 +#, c-format +msgid "PL/Python anonymous code block" +msgstr "PL/Python -ის ანონიმური კოდის ბლოკი" + +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 +#, c-format +msgid "could not import \"plpy\" module" +msgstr "\"plpy\" მოდულის შემოტანის შეცდომა" + +#: plpy_plpymodule.c:182 +#, c-format +msgid "could not create the spiexceptions module" +msgstr "spiexceptions მოდულის შექმნის შეცდომა" + +#: plpy_plpymodule.c:190 +#, c-format +msgid "could not add the spiexceptions module" +msgstr "spiexceptions მოდულის დამატების შეცდომა" + +#: plpy_plpymodule.c:257 +#, c-format +msgid "could not generate SPI exceptions" +msgstr "\"SPI\" გამონაკლისების გენერაციის შეცდომა" + +#: plpy_plpymodule.c:425 +#, c-format +msgid "could not unpack arguments in plpy.elog" +msgstr "plpy.elog-ში არგუმენტების გაშლის შეცდომა" + +#: plpy_plpymodule.c:434 +msgid "could not parse error message in plpy.elog" +msgstr "plpy.elog-ში შეცდომის შეტყობინების დამუშავების შეცდომა" + +#: plpy_plpymodule.c:451 +#, c-format +msgid "argument 'message' given by name and position" +msgstr "არგუმენტი 'message', მოცემული სახელითა მდებარეობით" + +#: plpy_plpymodule.c:478 +#, c-format +msgid "'%s' is an invalid keyword argument for this function" +msgstr "%s ამ ფუნქციის არასწორი არგუმენტია" + +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 +#, c-format +msgid "invalid SQLSTATE code" +msgstr "არასწორი SQLSTATE კოდი" + +#: plpy_procedure.c:225 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "ტრიგერის ფუნქციების გამოძახება მხოლოდ ტრიგერებად შეიძლება" + +#: plpy_procedure.c:229 +#, c-format +msgid "PL/Python functions cannot return type %s" +msgstr "PL/Python ფუნქციებს ამ ტიპის დაბრუნება არ შეუძლიათ: %s" + +#: plpy_procedure.c:307 +#, c-format +msgid "PL/Python functions cannot accept type %s" +msgstr "PL/Python ფუნქციებს ამ ტიპის მიღება არ შეუძლიათ: %s" + +#: plpy_procedure.c:397 +#, c-format +msgid "could not compile PL/Python function \"%s\"" +msgstr "\"PL/Python\"-ის ფუნქციის კომპილაციის შეცდომა: \"%s\"" + +#: plpy_procedure.c:400 +#, c-format +msgid "could not compile anonymous PL/Python code block" +msgstr "\"PL/Python\"-ის კოდის ანონიმური ბლოკის კომპილაციის შეცდომა" + +#: 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:56 +#, c-format +msgid "second argument of plpy.prepare must be a sequence" +msgstr "plpy.prepare -ის მეორე არგუმენტი მიმდევრობა უნდა იყოს" + +#: plpy_spi.c:98 +#, c-format +msgid "plpy.prepare: type name at ordinal position %d is not a string" +msgstr "plpy.prepare: ტიპის სახელი ორდინალურ მდგომარეობაში %d სტრიქონს არ წარმოადგენს" + +#: plpy_spi.c:170 +#, c-format +msgid "plpy.execute expected a query or a plan" +msgstr "plpy.execute გეგმას ან მოთხოვნას მოელოდა" + +#: plpy_spi.c:189 +#, c-format +msgid "plpy.execute takes a sequence as its second argument" +msgstr "plpy.execute მეორე არგუმენტად მიმდევრობას იღებს" + +#: plpy_spi.c:297 +#, c-format +msgid "SPI_execute_plan failed: %s" +msgstr "SPI_execute_plan -ის შეცდომა: %s" + +#: plpy_spi.c:339 +#, c-format +msgid "SPI_execute failed: %s" +msgstr "SPI_execute -ის შეცდომა: %s" + +#: plpy_subxactobject.c:92 +#, c-format +msgid "this subtransaction has already been entered" +msgstr "ეს ქვეტრანზაქცია უკვე დაიწყო" + +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 +#, c-format +msgid "this subtransaction has already been exited" +msgstr "ეს ქვეტრანზაქცია უკვე დასრულდა" + +#: plpy_subxactobject.c:150 +#, c-format +msgid "this subtransaction has not been entered" +msgstr "ეს ქვეტრანზაქცია არ დაწყებულა" + +#: plpy_subxactobject.c:162 +#, c-format +msgid "there is no subtransaction to exit from" +msgstr "გამოსასვლელი ქვეტრანზაქციები არ არსებობს" + +#: plpy_typeio.c:588 +#, c-format +msgid "could not import a module for Decimal constructor" +msgstr "ათობითი კონსტრუქტორისთვის მოდულის შემოტანის პრობლემა" + +#: plpy_typeio.c:592 +#, c-format +msgid "no Decimal attribute in module" +msgstr "მოდულს ათობითს ატრიბუტი არ გააჩნია" + +#: plpy_typeio.c:598 +#, c-format +msgid "conversion from numeric to Decimal failed" +msgstr "რიცხვითიდან ათობითში გადაყვანის შეცდომა" + +#: plpy_typeio.c:912 +#, c-format +msgid "could not create bytes representation of Python object" +msgstr "\"Python\"-ის ობექტის ბაიტების რეპრეზენტაციის შექმნის შეცდომა" + +#: plpy_typeio.c:1049 +#, c-format +msgid "could not create string representation of Python object" +msgstr "\"Python\"-ის ობექტის სტრიქონების რეპრეზენტაციის შექმნის შეცდომა" + +#: plpy_typeio.c:1060 +#, 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:1157 +#, c-format +msgid "return value of function with array return type is not a Python sequence" +msgstr "ფუნქციის დაბრულების მნიშვნელობა მასივის დაბრუნების ტიპით Python-ის მიმდევრობა არაა" + +#: plpy_typeio.c:1202 +#, c-format +msgid "could not determine sequence length for function return value" +msgstr "ფუნქციის დაბრუნებული მნიშვნელობის მიმდევრობის სიგრძის განსაზღვრა შეუძლებელია" + +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "მრავალგანზომილებიან მასივებს უნდა ჰქონდეთ მასივის გამოსახულებები შესაბამისი ზომებით" + +#: plpy_typeio.c:1227 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "მასივის ზომების რაოდენობა მაქსიმუმ დასაშვებზე (%d) დიდია" + +#: plpy_typeio.c:1329 +#, c-format +msgid "malformed record literal: \"%s\"" +msgstr "ჩანაწერის არასწორი სტრიქონი: %s" + +#: plpy_typeio.c:1330 +#, c-format +msgid "Missing left parenthesis." +msgstr "აკლია მარჯვენა ფრჩხილი." + +#: plpy_typeio.c:1331 plpy_typeio.c:1532 +#, 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:1378 +#, c-format +msgid "key \"%s\" not found in mapping" +msgstr "ბმაში გასაღები %s ნაპოვნი არაა" + +#: plpy_typeio.c:1379 +#, 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:1432 +#, c-format +msgid "length of returned sequence did not match number of columns in row" +msgstr "დაბრუნებული მიმდევრობის სიგრძე მწკრივში სვეტების რაოდენობას არ ემთხვევა" + +#: plpy_typeio.c:1530 +#, c-format +msgid "attribute \"%s\" does not exist in Python object" +msgstr "ატრიბუტი \"%s\" Python -ის ობიექტში არ არსებობს" + +#: plpy_typeio.c:1533 +#, 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:31 +#, c-format +msgid "could not convert Python Unicode object to bytes" +msgstr "\"Python Unicode\" ტიპის ობიექტის ბაიტებად გარდაქმნის შეცდომა" + +#: plpy_util.c:37 +#, c-format +msgid "could not extract bytes from encoded string" +msgstr "ბაიტების ამოღების შეცდომა კოდირებული სტრიქონიდან" + +#, c-format +#~ msgid "To construct a multidimensional array, the inner sequences must all have the same length." +#~ msgstr "მრავალგანზომილებიანი მასივის ასაშენებლად ყველა შიდა მიმდევრობის სიგრძე ტოლი უნდა იყოს." + +#, c-format +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "მასივის ზომა მაქსიმალურ დასაშვებს აჭარბებს" + +#, c-format +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "შიდა მიმდევრობის არასწორი სიგრძე: სიგრძე: %d. უნდა იყოს: %d" diff --git a/third_party/spanner_pg/src/pl/plpython/po/pt_BR.po b/third_party/spanner_pg/src/pl/plpython/po/pt_BR.po index 5ea66785..ddeae154 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/pt_BR.po +++ b/third_party/spanner_pg/src/pl/plpython/po/pt_BR.po @@ -1,434 +1,461 @@ # Brazilian Portuguese message translation file for plpython -# Copyright (C) 2009 PostgreSQL Global Development Group +# +# Copyright (C) 2009-2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Euler Taveira de Oliveira , 2009-2016. +# +# Euler Taveira , 2009-2022. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-08-09 22:53-0300\n" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-27 13:15-0300\n" "PO-Revision-Date: 2009-05-10 01:15-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\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" -#: plpy_cursorobject.c:101 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor esperava uma consulta ou um plano" -#: plpy_cursorobject.c:179 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor tem uma sequência como seu segundo argumento" -#: plpy_cursorobject.c:195 plpy_spi.c:229 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "não pôde executar plano" -#: plpy_cursorobject.c:198 plpy_spi.c:232 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Sequência esperada de %d argumento, recebeu %d: %s" msgstr[1] "Sequência esperada de %d argumentos, recebeu %d: %s" -#: plpy_cursorobject.c:354 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "iterando um cursor fechado" -#: plpy_cursorobject.c:362 plpy_cursorobject.c:427 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "iterando um cursor em uma subtransação abortada" -#: plpy_cursorobject.c:419 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "busca em um cursor fechado" -#: plpy_cursorobject.c:467 plpy_spi.c:438 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "resultado da consulta tem muitos registros para caber em uma lista Python" -#: plpy_cursorobject.c:508 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "fechando um cursor em uma subtransação abortada" -#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:527 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:140 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "modo de retorno da função que retorna conjunto não é suportado" -#: plpy_exec.c:141 +#: plpy_exec.c:140 #, c-format msgid "PL/Python set-returning functions only support returning one value per call." msgstr "funções PL/Python que retornam conjunto só suportam retornar um valor por chamada." -#: plpy_exec.c:154 +#: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" msgstr "objeto retornado não pode ser iterado" -#: plpy_exec.c:155 +#: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "funções PL/Python que retornam conjunto devem retornar um objeto iterável." -#: plpy_exec.c:169 +#: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" msgstr "erro ao buscar próximo item do iterador" -#: plpy_exec.c:210 +#: plpy_exec.c:211 +#, c-format +msgid "PL/Python procedure did not return None" +msgstr "procedimento PL/Python não retornou None" + +#: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "função PL/Python com tipo de retorno \"void\" não retornou None" -#: plpy_exec.c:374 plpy_exec.c:400 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "função de gatilho retornou valor inesperado" -#: plpy_exec.c:375 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "None ou uma cadeia de caracteres era esperado." -#: plpy_exec.c:390 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "função de gatilho PL/Python retornou \"MODIFY\" em um gatilho DELETE -- ignorado" -#: plpy_exec.c:401 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Era esperado None, \"OK\", \"SKIP\" ou \"MODIFY\"." -#: plpy_exec.c:482 +#: plpy_exec.c:441 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() falhou ao definir argumentos" -#: plpy_exec.c:486 +#: plpy_exec.c:445 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() falhou ao definir argumentos" -#: plpy_exec.c:498 +#: plpy_exec.c:457 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "função que retorna record foi chamada em um contexto que não pode aceitar tipo record" -#: plpy_exec.c:714 +#: plpy_exec.c:674 #, c-format msgid "while creating return value" msgstr "ao criar valor de retorno" -#: plpy_exec.c:738 -#, c-format -msgid "could not create new dictionary while building trigger arguments" -msgstr "não pode criar novo dicionário ao construir argumentos do gatilho" - -#: plpy_exec.c:927 +#: plpy_exec.c:908 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] removido, não pode modificar registro" -#: plpy_exec.c:932 +#: plpy_exec.c:913 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] não é um dicionário" -#: plpy_exec.c:957 +#: plpy_exec.c:938 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "chave do dicionário TD[\"new\"] na posição %d não é uma cadeia de caracteres" -#: plpy_exec.c:964 +#: plpy_exec.c:945 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "chave \"%s\" encontrada em TD[\"new\"] não existe como uma coluna no registro do gatilho" -#: plpy_exec.c:1044 +#: plpy_exec.c:950 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "não pode definir atributo do sistema \"%s\"" + +#: plpy_exec.c:955 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "não pode definir coluna gerada \"%s\"" + +#: plpy_exec.c:1013 #, c-format msgid "while modifying trigger row" msgstr "ao modificar registro de gatilho" -#: plpy_exec.c:1105 +#: plpy_exec.c:1071 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "forçado a abortar subtransação que não foi concluída" -#: plpy_main.c:125 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "múltiplas bibliotecas do Python estão presentes na sessão" -#: plpy_main.c:126 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Apenas uma versão do Python pode ser utilizada na sessão." -#: plpy_main.c:142 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "erro não interceptado na inicialização" -#: plpy_main.c:165 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "não pôde importar módulo \"__main__\"" -#: plpy_main.c:170 -#, c-format -msgid "could not create globals" -msgstr "não pôde criar globais" - -#: plpy_main.c:174 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "não pôde inicializar globais" -#: plpy_main.c:389 +#: plpy_main.c:354 +#, c-format +msgid "PL/Python procedure \"%s\"" +msgstr "procedimento PL/Python \"%s\"" + +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "função PL/Python \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "bloco de código PL/Python anônimo" -#: plpy_planobject.c:123 -#, c-format -msgid "plan.status takes no arguments" -msgstr "plan.status não contém argumentos" - -#: plpy_plpymodule.c:178 plpy_plpymodule.c:181 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "não pôde importar módulo \"plpy\"" -#: plpy_plpymodule.c:196 +#: plpy_plpymodule.c:182 #, c-format -msgid "could not add the spiexceptions module" -msgstr "não pôde adicionar o módulo spiexceptions" +msgid "could not create the spiexceptions module" +msgstr "não pôde criar o módulo spiexceptions" -#: plpy_plpymodule.c:217 +#: plpy_plpymodule.c:190 #, c-format -msgid "could not create the base SPI exceptions" -msgstr "não pôde criar as exceções base da SPI" +msgid "could not add the spiexceptions module" +msgstr "não pôde adicionar o módulo spiexceptions" -#: plpy_plpymodule.c:252 plpy_plpymodule.c:256 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "não pôde gerar exceções da SPI" -#: plpy_plpymodule.c:422 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "não pode desempacotar argumentos em plpy.elog" -#: plpy_plpymodule.c:431 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "não pode analisar mensagem de erro em plpy.elog" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:451 #, c-format -msgid "Argument 'message' given by name and position" -msgstr "Argumento 'message' informado por nome e posição" +msgid "argument 'message' given by name and position" +msgstr "argumento 'message' informado por nome e posição" -#: plpy_plpymodule.c:475 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' é um argumento inválido para esta função" -#: plpy_plpymodule.c:486 plpy_plpymodule.c:492 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "código SQLSTATE inválido" -#: plpy_procedure.c:232 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "funções de gatilho só podem ser chamadas como gatilhos" -#: plpy_procedure.c:237 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "funções PL/Python não podem retornar tipo %s" -#: plpy_procedure.c:318 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "funções PL/Python não podem aceitar tipo %s" -#: plpy_procedure.c:414 +#: plpy_procedure.c:397 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "não pôde compilar função PL/Python \"%s\"" -#: plpy_procedure.c:417 +#: plpy_procedure.c:400 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "não pôde compilar bloco de código PL/Python anônimo" -#: plpy_resultobject.c:145 plpy_resultobject.c:165 plpy_resultobject.c:185 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "comando não produziu um conjunto de resultados" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "segundo argumento de plpy.prepare deve ser uma sequência" -#: plpy_spi.c:118 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: nome do tipo na posição %d não é uma cadeia de caracteres" -#: plpy_spi.c:194 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute espera uma consulta ou um plano" -#: plpy_spi.c:213 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute recebe uma sequência como segundo argumento" -#: plpy_spi.c:337 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan falhou: %s" -#: plpy_spi.c:379 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute falhou: %s" -#: plpy_subxactobject.c:123 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "essa subtransação já foi iniciada" -#: plpy_subxactobject.c:129 plpy_subxactobject.c:187 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "essa subtransação já foi concluída" -#: plpy_subxactobject.c:181 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "essa subtransação não foi iniciada" -#: plpy_subxactobject.c:193 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "não há uma subtransação a ser concluída" -#: plpy_typeio.c:286 -#, c-format -msgid "could not create new dictionary" -msgstr "não pôde criar novo dicionário" - -#: plpy_typeio.c:560 +#: plpy_typeio.c:587 #, c-format msgid "could not import a module for Decimal constructor" msgstr "não pôde importar módulo para construtor Decimal" -#: plpy_typeio.c:564 +#: plpy_typeio.c:591 #, c-format msgid "no Decimal attribute in module" msgstr "nenhum atributo Decimal no módulo" -#: plpy_typeio.c:570 +#: plpy_typeio.c:597 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "conversão de numeric para Decimal falhou" -#: plpy_typeio.c:645 -#, c-format -msgid "cannot convert multidimensional array to Python list" -msgstr "não pode converter matriz multidimensional para lista Python" - -#: plpy_typeio.c:646 -#, c-format -msgid "PL/Python only supports one-dimensional arrays." -msgstr "PL/Python só suporta matrizes unidimensionais." - -#: plpy_typeio.c:652 -#, c-format -msgid "could not create new Python list" -msgstr "não pôde criar nova lista Python" - -#: plpy_typeio.c:711 +#: plpy_typeio.c:911 #, c-format msgid "could not create bytes representation of Python object" msgstr "não pôde criar representação de bytes de um objeto Python" -#: plpy_typeio.c:822 +#: plpy_typeio.c:1048 #, c-format msgid "could not create string representation of Python object" msgstr "não pôde criar representação de cadeia de caracteres de um objeto Python" -#: plpy_typeio.c:833 +#: plpy_typeio.c:1059 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "não pôde converter objeto Python em cstring: representação de cadeia de caracteres Python parece conter bytes nulos" -#: plpy_typeio.c:879 +#: plpy_typeio.c:1170 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "número de dimensões da matriz excede o máximo permitido (%d)" + +#: plpy_typeio.c:1175 +#, c-format +msgid "could not determine sequence length for function return value" +msgstr "não pôde determinar tamanho da sequência para valor de retorno da função" + +#: plpy_typeio.c:1180 plpy_typeio.c:1186 +#, c-format +msgid "array size exceeds the maximum allowed" +msgstr "tamanho da matriz excede o máximo permitido" + +#: plpy_typeio.c:1214 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "valor de retorno da função do tipo matriz retorna tipo que não é uma sequência Python" -#: plpy_typeio.c:1000 +#: plpy_typeio.c:1261 +#, c-format +msgid "wrong length of inner sequence: has length %d, but %d was expected" +msgstr "tamanho incorreto da sequência interna: tem tamanho %d, mas %d era esperado" + +#: plpy_typeio.c:1263 +#, c-format +msgid "To construct a multidimensional array, the inner sequences must all have the same length." +msgstr "Para construir uma matriz multidimensional, todas as sequências internas devem ter o mesmo tamanho." + +#: plpy_typeio.c:1342 +#, c-format +msgid "malformed record literal: \"%s\"" +msgstr "matriz mal formada: \"%s\"" + +#: plpy_typeio.c:1343 +#, c-format +msgid "Missing left parenthesis." +msgstr "Faltando parêntese esquerdo." + +#: plpy_typeio.c:1344 plpy_typeio.c:1545 +#, c-format +msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." +msgstr "Para retornar um tipo composto em uma matriz, retorne o tipo composto como uma tupla do Python, i.e., \"[('foo',)]\"." + +#: plpy_typeio.c:1391 #, c-format msgid "key \"%s\" not found in mapping" msgstr "chave \"%s\" não foi encontrada no mapeamento" -#: plpy_typeio.c:1001 +#: plpy_typeio.c:1392 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Para retornar nulo em uma coluna, adicionar o valor None no mapeamento cuja chave é o nome da coluna." -#: plpy_typeio.c:1052 +#: plpy_typeio.c:1445 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "tamanho da sequência retornada não combina com número de colunas no registro" -#: plpy_typeio.c:1163 +#: plpy_typeio.c:1543 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "atributo \"%s\" não existe no objeto Python" -#: plpy_typeio.c:1164 +#: plpy_typeio.c:1546 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Para retornar nulo na coluna, deixe o objeto retornado ter um atributo cuja chave é o nome do coluna e o valor é None." -#: plpy_util.c:36 +#: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "não pôde converter objeto Unicode Python para bytes" -#: plpy_util.c:42 +#: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" msgstr "não pôde extrair bytes de cadeia de caracteres codificada" diff --git a/third_party/spanner_pg/src/pl/plpython/po/ru.po b/third_party/spanner_pg/src/pl/plpython/po/ru.po index 733ed408..b632dbaf 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/ru.po +++ b/third_party/spanner_pg/src/pl/plpython/po/ru.po @@ -27,12 +27,12 @@ msgstr "plpy.cursor ожидает запрос или план" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor принимает в качестве второго аргумента последовательность" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "нельзя выполнить план" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -55,7 +55,7 @@ msgstr "перемещение курсора в прерванной подтр msgid "fetch from a closed cursor" msgstr "выборка из закрытого курсора" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "" @@ -66,7 +66,7 @@ msgstr "" msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" -#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:546 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -111,17 +111,17 @@ msgstr "процедура PL/Python вернула не None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "функция PL/Python с типом результата \"void\" вернула не None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "триггерная процедура вернула недопустимое значение" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Ожидалось None или строка." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "" "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" @@ -129,49 +129,49 @@ msgstr "" "триггерная функция PL/Python вернула \"MODIFY\" в триггере DELETE -- " "игнорируется" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Ожидалось None, \"OK\", \"SKIP\" или \"MODIFY\"." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "ошибка в PyList_SetItem() при настройке аргументов" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "ошибка в PyDict_SetItemString() при настройке аргументов" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "при создании возвращаемого значения" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "элемент TD[\"new\"] удалён -- изменить строку нельзя" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] - не словарь" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "ключ словаря TD[\"new\"] с порядковым номером %d не является строкой" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "" "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering " @@ -180,106 +180,106 @@ msgstr "" "ключу \"%s\", найденному в TD[\"new\"], не соответствует столбец в строке, " "обрабатываемой триггером" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "присвоить значение системному атрибуту \"%s\" нельзя" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "при изменении строки в триггере" -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "принудительное прерывание незавершённой подтранзакции" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "в сеансе представлено несколько библиотек Python" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "В одном сеансе нельзя использовать Python разных старших версий." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "необработанная ошибка при инициализации" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "не удалось импортировать модуль \"__main__\"" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "не удалось инициализировать глобальные данные" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "процедура PL/Python \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "функция PL/Python \"%s\"" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "анонимный блок кода PL/Python" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "не удалось импортировать модуль \"plpy\"" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "не удалось создать модуль spiexceptions" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "не удалось добавить модуль spiexceptions" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "не удалось сгенерировать исключения SPI" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "не удалось распаковать аргументы в plpy.elog" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "не удалось разобрать сообщение об ошибке в plpy.elog" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "аргумент 'message' задан и по имени, и по позиции" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' - недопустимое ключевое слово (аргумент) для этой функции" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" @@ -319,27 +319,27 @@ msgstr "команда не выдала результирующий набор msgid "second argument of plpy.prepare must be a sequence" msgstr "вторым аргументом plpy.prepare должна быть последовательность" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: имя типа с порядковым номером %d не является строкой" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ожидает запрос или план" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute принимает в качестве второго аргумента последовательность" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "ошибка в SPI_execute_plan: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "ошибка в SPI_execute: %s" @@ -384,12 +384,12 @@ msgstr "не удалось преобразовать numeric в Decimal" msgid "could not create bytes representation of Python object" msgstr "не удалось создать байтовое представление объекта Python" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "не удалось создать строковое представление объекта Python" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "" "could not convert Python object into cstring: Python string representation " @@ -398,7 +398,7 @@ msgstr "" "не удалось преобразовать объект Python в cstring: похоже, представление " "строки Python содержит нулевые байты" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "" "return value of function with array return type is not a Python sequence" @@ -406,14 +406,14 @@ msgstr "" "возвращаемое значение функции с результатом-массивом не является " "последовательностью" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "" "не удалось определить длину последовательности в возвращаемом функцией " "значении" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -421,22 +421,22 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "число размерностей массива превышает предел (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале записи: \"%s\"" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Отсутствует левая скобка." -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -445,12 +445,12 @@ msgstr "" "Чтобы возвратить составной тип в массиве, нужно возвратить составное " "значение в виде кортежа Python, например: \"[('foo',)]\"." -#: plpy_typeio.c:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не найден в сопоставлении" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -459,17 +459,17 @@ msgstr "" "Чтобы присвоить столбцу NULL, добавьте в сопоставление значение None с " "ключом-именем столбца." -#: plpy_typeio.c:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "длина возвращённой последовательности не равна числу столбцов в строке" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "в объекте Python не существует атрибут \"%s\"" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " diff --git a/third_party/spanner_pg/src/pl/plpython/po/sv.po b/third_party/spanner_pg/src/pl/plpython/po/sv.po index 67a5dc6a..1b0e83c0 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/sv.po +++ b/third_party/spanner_pg/src/pl/plpython/po/sv.po @@ -5,9 +5,9 @@ # 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: 2023-08-07 20:39+0000\n" +"POT-Creation-Date: 2023-08-07 20:24+0000\n" "PO-Revision-Date: 2023-08-02 12:03+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" @@ -27,12 +27,12 @@ msgstr "plpy.cursor förväntade sig en fråga eller en plan" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor tar en sekvens som sitt andra argument" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "kunde inte exekvera plan" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -54,7 +54,7 @@ msgstr "itererar med en markör i en avbruten subtransaktion" msgid "fetch from a closed cursor" msgstr "hämta från en stängd markör" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "frågeresultet har för många rader för att få plats i en Python-lista" @@ -64,7 +64,7 @@ msgstr "frågeresultet har för många rader för att få plats i en Python-list msgid "closing a cursor in an aborted subtransaction" msgstr "stänger en markör i en avbruten subtransaktion" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:546 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -104,166 +104,166 @@ msgstr "PL/Python-procedur returnerade inte None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python-funktion med returtyp \"void\" returnerade inte None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "oväntat returvärde från triggerprocedur" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Förväntade None eller en sträng." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "PL/Python-triggerfunktion returnerade \"MODIFY\" i en DELETE-trigger -- ignorerad" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Förväntade None, \"OK\", \"SKIP\" eller \"MODIFY\"." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() misslyckades vid uppsättning av argument" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() misslyckades vid uppsättning av argument" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, 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." -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "vid skapande av returvärde" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] raderad, kan inte modifiera rad" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] är inte en dictionary" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "TD[\"new\"] dictionary-nyckel vid numerisk position %d är inte en sträng" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "nyckel \"%s\" hittad i TD[\"new\"] finns inte som en kolumn i den triggande raden" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "vid modifiering av triggerrad" -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "tvingar avbrytande av subtransaktion som inte har avslutats" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "multipla Python-bibliotek är aktiva i sessionen" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Bara en major-version av Python kan användas i en session." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "ej fångar fel i initiering" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "kunde inte importera \"__main__\"-modul" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "kunde inte initierar globaler" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python-procedur \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python-funktion \"%s\"" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Python anonymt kodblock" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "kunde inte importera \"plpy\"-modul" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "kunde inte skapa modulen spiexceptions" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "kunde inte lägga till modulen spiexceptions" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "kunde inte skapa SPI-undantag" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "kunde inte packa upp argument i plpy.elog" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "kunde inte parsa felmeddelande i plpy.elog" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "argumentet 'message' angivet med namn och position" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' är ett ogiltigt nyckelordsargument för denna funktion" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "ogiltig SQLSTATE-kod" @@ -303,27 +303,27 @@ msgstr "kommandot producerade inte en resultatmängd" msgid "second argument of plpy.prepare must be a sequence" msgstr "andra argumentet till plpy.prepare måste vara en sekvens" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: typnamn vid numerisk position %d är inte en sträng" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute förväntade en fråga eller en plan" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute tar en sekvens som sitt andra argument" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan misslyckades: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute misslyckades: %s" @@ -368,72 +368,72 @@ msgstr "konvertering från numeric till Decimal misslyckades" msgid "could not create bytes representation of Python object" msgstr "kunde inte skapa byte-representation av Python-objekt" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "kunde inte skapa strängrepresentation av Python-objekt" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "kunde inte konvertera Python-objekt till cstring: Python-strängrepresentationen verkar innehålla noll-bytes" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "returvärde för funktion med array-returtyp är inte en Python-sekvens" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "kunde inte bestämma sekvenslängd för funktionens returvärde" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "flerdimensionella vektorer måste ha array-uttryck av passande dimensioner" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "antal array-dimensioner överskriver maximalt tillåtna (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "felaktig postliteral: \"%s\"" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Saknar vänster parentes" -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "För att returnera en composite-typ i en array, returnera composite-typen som en Python-tupel, t.ex. \"[('foo',)]\"." -#: plpy_typeio.c:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "nyckeln \"%s\" hittades inte i mapping" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "För att returnera null i en kolumn så lägg till värdet None till mappningen med nyckelnamn taget från kolumnen." -#: plpy_typeio.c:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "längden på den returnerade sekvensen matchade inte antal kolumner i raden" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "attributet \"%s\" finns inte i Python-objektet" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "För att returnera null i en kolumn så låt det returnerade objektet ha ett attribut med namn efter kolumnen och med värdet None." diff --git a/third_party/spanner_pg/src/pl/plpython/po/uk.po b/third_party/spanner_pg/src/pl/plpython/po/uk.po index 33499e45..4bff31a1 100644 --- a/third_party/spanner_pg/src/pl/plpython/po/uk.po +++ b/third_party/spanner_pg/src/pl/plpython/po/uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-08-16 15:09+0000\n" +"POT-Creation-Date: 2023-08-17 04:25+0000\n" "PO-Revision-Date: 2023-08-17 15:51\n" "Last-Translator: \n" "Language-Team: Ukrainian\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: /REL_14_STABLE/plpython.pot\n" -"X-Crowdin-File-ID: 752\n" +"X-Crowdin-File: /REL_15_STABLE/plpython.pot\n" +"X-Crowdin-File-ID: 884\n" #: plpy_cursorobject.c:72 #, c-format @@ -27,12 +27,12 @@ msgstr "plpy.cursor очікував запит або план" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.сursor приймає як другий аргумент послідовність" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "не вдалося виконати план" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -56,7 +56,7 @@ msgstr "ітерація курсора в перерваній субтранз msgid "fetch from a closed cursor" msgstr "витяг з закритого курсору" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "результат запиту має забагато рядків для передачі у список Python" @@ -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:546 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -106,166 +106,166 @@ msgstr "процедура PL/Python не повернула None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python функція з типом результату \"void\" не повернули None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:395 #, c-format msgid "unexpected return value from trigger procedure" msgstr "неочікуване значення процедури тригера" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Очікувалось None або рядок." -#: plpy_exec.c:387 +#: plpy_exec.c:385 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "Тригерна функція PL/Python повернула \"MODIFY\" в тригері DELETE -- проігноровано" -#: plpy_exec.c:398 +#: plpy_exec.c:396 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Очікувалось None, \"OK\", \"SKIP\" або \"MODIFY\"." -#: plpy_exec.c:448 +#: plpy_exec.c:446 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "помилка PyList_SetItem() під час встановлення параметрів" -#: plpy_exec.c:452 +#: plpy_exec.c:450 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "помилка PyDict_SetItemString() під час встановлення параметрів" -#: plpy_exec.c:464 +#: plpy_exec.c:462 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: plpy_exec.c:681 +#: plpy_exec.c:679 #, c-format msgid "while creating return value" msgstr "під час створення значення результату" -#: plpy_exec.c:928 +#: plpy_exec.c:926 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] видалено, неможливо змінити рядок" -#: plpy_exec.c:933 +#: plpy_exec.c:931 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] не є словником" -#: plpy_exec.c:960 +#: plpy_exec.c:956 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "ключ словника TD[\"new\"] на порядковий позиції %d не є рядком" -#: plpy_exec.c:967 +#: plpy_exec.c:963 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "ключ \"%s\" знайдений у TD[\"new\"] не існує як стовпець у рядку тригера" -#: plpy_exec.c:972 +#: plpy_exec.c:968 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалося встановити системний атрибут \"%s\"" -#: plpy_exec.c:977 +#: plpy_exec.c:973 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований стовпець \"%s\"" -#: plpy_exec.c:1035 +#: plpy_exec.c:1031 #, c-format msgid "while modifying trigger row" msgstr "під час зміни рядка тригера" -#: plpy_exec.c:1093 +#: plpy_exec.c:1089 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "примусове переривання субтранзакції, яка не вийшла" -#: plpy_main.c:121 +#: plpy_main.c:111 #, c-format msgid "multiple Python libraries are present in session" msgstr "декілька бібліотек Python присутні у сесії" -#: plpy_main.c:122 +#: plpy_main.c:112 #, c-format msgid "Only one Python major version can be used in one session." msgstr "За один сеанс може використовуватися лише одна основна версія Python." -#: plpy_main.c:138 +#: plpy_main.c:124 #, c-format msgid "untrapped error in initialization" msgstr "неопрацьована помилка під час ініціалізації" -#: plpy_main.c:161 +#: plpy_main.c:147 #, c-format msgid "could not import \"__main__\" module" msgstr "не вдалося імпортувати \"__main__\" модуль" -#: plpy_main.c:170 +#: plpy_main.c:156 #, c-format msgid "could not initialize globals" msgstr "не вдалося ініціалізувати globals" -#: plpy_main.c:393 +#: plpy_main.c:354 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python процедура \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:357 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python функція \"%s\"" -#: plpy_main.c:404 +#: plpy_main.c:365 #, c-format msgid "PL/Python anonymous code block" msgstr "анонімні коди блоку PL/Python" -#: plpy_plpymodule.c:180 plpy_plpymodule.c:183 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "не вдалося імпортувати \"plpy\" модуль" -#: plpy_plpymodule.c:198 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "не вдалося створити spiexceptions модуль" -#: plpy_plpymodule.c:206 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "не вдалося додати spiexceptions модуль" -#: plpy_plpymodule.c:273 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "не вдається створити винятки SPI" -#: plpy_plpymodule.c:441 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "не вдалося розпакувати аргументи в plpy.elog" -#: plpy_plpymodule.c:450 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "не вдалося проаналізувати повідомлення про помилку в plpy.elog" -#: plpy_plpymodule.c:467 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "аргумент 'повідомлення' виданий за ім'ям та розташуванням" -#: plpy_plpymodule.c:494 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' є неприпустимим ключовим словом-аргументом для цієї функції" -#: plpy_plpymodule.c:505 plpy_plpymodule.c:511 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "неприпустимий код SQLSTATE" @@ -305,27 +305,27 @@ msgstr "команда не створила набір результатів" msgid "second argument of plpy.prepare must be a sequence" msgstr "другий аргумент plpy.prepare має бути послідовністю" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: ім'я на порядковий позиції %d не є рядком" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute очікував запит або план" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute приймає як другий аргумент послідовність" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan не спрацював: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute не спрацював: %s" @@ -370,72 +370,72 @@ msgstr "не вдалося виконати перетворення з numeric msgid "could not create bytes representation of Python object" msgstr "не вдалося створити байтову репрезентацію об'єкта Python" -#: plpy_typeio.c:1057 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "не вдалося створити рядкову репрезентацію об'єкта Python" -#: plpy_typeio.c:1068 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "не вдалося перетворити об'єкт Python на cstring: репрезентація рядка Python містить значення null-байти" -#: plpy_typeio.c:1165 +#: plpy_typeio.c:1157 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "значення функції з масивом в якості результату не є послідовністю Python" -#: plpy_typeio.c:1210 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "не вдалося визначити довжину послідовності для значення функція" -#: plpy_typeio.c:1230 plpy_typeio.c:1245 plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "для багатовимірних масивів повинні задаватись вирази з відповідними вимірами" -#: plpy_typeio.c:1235 +#: plpy_typeio.c:1227 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "кількість вимірів масиву перевищує максимально дозволену (%d)" -#: plpy_typeio.c:1337 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "невірно сформований літерал запису: \"%s\"" -#: plpy_typeio.c:1338 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Відсутня ліва дужка." -#: plpy_typeio.c:1339 plpy_typeio.c:1540 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, 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:1386 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не знайдено в зіставленні" -#: plpy_typeio.c:1387 +#: plpy_typeio.c:1379 #, 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:1440 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "довжина повернутої послідовності не відповідає кількості стовпців у рядку" -#: plpy_typeio.c:1538 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "атрибут \"%s\" не існує в об'єкті Python" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1533 #, 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/third_party/spanner_pg/src/pl/plpython/regress-python3-mangle.mk b/third_party/spanner_pg/src/pl/plpython/regress-python3-mangle.mk deleted file mode 100644 index a785818a..00000000 --- a/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_call.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_call.sql index b0b3705a..daa4bc37 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_call.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_composite.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_composite.sql index 0fd2f5d5..21757701 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_composite.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_do.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_do.sql index 0e281a08..d4941326 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_do.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_drop.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_drop.sql index 72d5d657..e4f373b2 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_drop.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_ereport.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_ereport.sql index 58df2057..d4f6223e 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_ereport.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_error.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_error.sql index 8d86bf7d..9bb1c0b0 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_error.sql +++ b/third_party/spanner_pg/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 @@ -352,6 +352,6 @@ CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ plan = plpy.prepare("SELECT to_date('xy', 'DD') d") for row in plpy.cursor(plan): yield row['d'] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT python_error_detail(); diff --git a/third_party/spanner_pg/src/pl/plpython/sql/plpython_global.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_global.sql index 32502b41..96d20492 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_global.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_import.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_import.sql index ec887677..3031eef2 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_import.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_newline.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_newline.sql index f9cee949..cb22ba92 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_newline.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_params.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_params.sql index ee75c4dc..8bab4888 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_params.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_quote.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_quote.sql index 346b5485..a1133e7e 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_quote.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_record.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_record.sql index 9bab4c9e..52bad8bc 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_record.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_setof.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_setof.sql index 16c2eef0..4cfb1019 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_setof.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_spi.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_spi.sql index dd77833e..fcd113ac 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_spi.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_subtransaction.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_subtransaction.sql index cc4b1ae1..c65c380f 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_subtransaction.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_test.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_test.sql index 5f1be9c9..aa22a274 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_test.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_transaction.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_transaction.sql index 68588d9f..c939ba76 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_transaction.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_trigger.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_trigger.sql index 19852dc5..e5504b9a 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_trigger.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_types.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_types.sql index a8ceb661..0985a9cc 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_types.sql +++ b/third_party/spanner_pg/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,21 +310,21 @@ 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(); @@ -332,88 +332,88 @@ SELECT * FROM test_type_conversion_array_mixed2(); -- check output of multi-dimensional arrays CREATE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [['a'], ['b'], ['c']] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], []] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], [1]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[], 1] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [1, []] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail CREATE OR REPLACE FUNCTION test_type_conversion_md_array_out() RETURNS text[] AS $$ return [[1], [[]]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; select test_type_conversion_md_array_out(); -- fail 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_malformed2() RETURNS text[] AS $$ return [[1,2,3], "abc"] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed2(); CREATE FUNCTION test_type_conversion_mdarray_malformed3() RETURNS text[] AS $$ return ["abc", [1,2,3]] -$$ LANGUAGE plpythonu; +$$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_mdarray_malformed3(); 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(); @@ -427,14 +427,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(); @@ -445,13 +445,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 @@ -464,7 +464,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 @@ -473,7 +473,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 @@ -482,7 +482,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]); @@ -501,7 +501,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; @@ -521,7 +521,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)); @@ -538,7 +538,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 @@ -552,21 +552,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 @@ -577,7 +577,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 @@ -588,7 +588,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) @@ -600,7 +600,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) @@ -611,7 +611,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/third_party/spanner_pg/src/pl/plpython/sql/plpython_unicode.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_unicode.sql index a11e5eea..14f7b4e0 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_unicode.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/plpython/sql/plpython_void.sql b/third_party/spanner_pg/src/pl/plpython/sql/plpython_void.sql index 77d7f59e..5a1a6711 100644 --- a/third_party/spanner_pg/src/pl/plpython/sql/plpython_void.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/tcl/Makefile b/third_party/spanner_pg/src/pl/tcl/Makefile index 25e65189..314f9b2e 100644 --- a/third_party/spanner_pg/src/pl/tcl/Makefile +++ b/third_party/spanner_pg/src/pl/tcl/Makefile @@ -15,7 +15,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(TCL_INCLUDE_SPEC) $(CPPFLAGS) # On Windows, we don't link directly with the Tcl library; see below ifneq ($(PORTNAME), win32) -SHLIB_LINK = $(TCL_LIB_SPEC) $(TCL_LIBS) -lc +SHLIB_LINK = $(TCL_LIB_SPEC) $(TCL_LIBS) endif PGFILEDESC = "PL/Tcl - procedural language" diff --git a/third_party/spanner_pg/src/pl/tcl/generate-pltclerrcodes.pl b/third_party/spanner_pg/src/pl/tcl/generate-pltclerrcodes.pl index c63c6323..e2aeefa0 100644 --- a/third_party/spanner_pg/src/pl/tcl/generate-pltclerrcodes.pl +++ b/third_party/spanner_pg/src/pl/tcl/generate-pltclerrcodes.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # # Generate the pltclerrcodes.h header from errcodes.txt -# Copyright (c) 2000-2021, PostgreSQL Global Development Group +# Copyright (c) 2000-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/pl/tcl/nls.mk b/third_party/spanner_pg/src/pl/tcl/nls.mk index cbf45254..5136d7fc 100644 --- a/third_party/spanner_pg/src/pl/tcl/nls.mk +++ b/third_party/spanner_pg/src/pl/tcl/nls.mk @@ -1,6 +1,6 @@ # src/pl/tcl/nls.mk CATALOG_NAME = pltcl -AVAIL_LANGUAGES = cs de el es fr it ja ko pl ru sv tr uk vi zh_CN +AVAIL_LANGUAGES = cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN GETTEXT_FILES = pltcl.c GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) diff --git a/third_party/spanner_pg/src/pl/tcl/pltcl.c b/third_party/spanner_pg/src/pl/tcl/pltcl.c index 4ce61a58..11f1ff19 100644 --- a/third_party/spanner_pg/src/pl/tcl/pltcl.c +++ b/third_party/spanner_pg/src/pl/tcl/pltcl.c @@ -474,6 +474,9 @@ _PG_init(void) PGC_SUSET, 0, NULL, NULL, NULL); + MarkGUCPrefixReserved("pltcl"); + MarkGUCPrefixReserved("pltclu"); + pltcl_pm_init_done = true; } @@ -826,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; @@ -1236,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(); { @@ -2436,6 +2442,7 @@ pltcl_process_SPI_result(Tcl_Interp *interp, case SPI_OK_INSERT: case SPI_OK_DELETE: case SPI_OK_UPDATE: + case SPI_OK_MERGE: Tcl_SetObjResult(interp, Tcl_NewWideIntObj(ntuples)); break; diff --git a/third_party/spanner_pg/src/pl/tcl/po/de.po b/third_party/spanner_pg/src/pl/tcl/po/de.po index 7e487706..e191a2bb 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/de.po +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/pl/tcl/po/el.po b/third_party/spanner_pg/src/pl/tcl/po/el.po index cd6a5e05..6d0bd507 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/el.po +++ b/third_party/spanner_pg/src/pl/tcl/po/el.po @@ -7,17 +7,17 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 14\n" +"Project-Id-Version: pltcl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-07-21 05:08+0000\n" -"PO-Revision-Date: 2021-07-21 09:41+0200\n" +"POT-Creation-Date: 2023-04-14 09:08+0000\n" +"PO-Revision-Date: 2023-04-14 15:05+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 3.0\n" +"X-Generator: Poedit 3.2.2\n" #: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." @@ -27,43 +27,48 @@ msgstr "Συνάρτηση PL/Tcl για να καλέσει μία μόνο φ msgid "PL/TclU function to call once when pltclu is first used." msgstr "Συνάρτηση PL/Tcl για να καλέσει μία μόνο φορά όταν χρησιμοποιείται pltclu για πρώτη φορά ." -#: pltcl.c:634 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "η συνάρτηση «%s» βρίσκεται σε λάθος γλώσσα" -#: pltcl.c:645 +#: 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:679 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "επεξεργάζεται παράμετρο %s" -#: pltcl.c:833 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "set-valued συνάρτηση καλείται σε περιεχόμενο που δεν μπορεί να δεχτεί ένα σύνολο" -#: pltcl.c:1006 +#: pltcl.c:840 +#, c-format +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:1290 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "δεν ήταν δυνατός ο διαχωρισμός επιστρεφόμενης τιμής από έναυσμα: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" @@ -72,42 +77,42 @@ msgstr "" "%s\n" "στη συνάρτηση PL/Tcl «%s»" -#: pltcl.c:1536 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "συναρτήσεις εναυσμάτων μπορούν να κληθούν μόνο ως εναύσματα" -#: pltcl.c:1540 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "συναρτήσεις PL/Tcl δεν είναι δυνατό να επιστρέψουν τύπο %s" -#: pltcl.c:1579 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "συναρτήσεις PL/Tcl δεν είναι δυνατό να δεχτούν τύπο %s" -#: pltcl.c:1693 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "δεν ήταν δυνατή η δημιουργία εσωτερικής διαδικασίας «%s»: %s" -#: pltcl.c:3197 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "λίστα ονόματος/τιμής στήλης πρέπει να έχει άρτιο αριθμό στοιχείων" -#: pltcl.c:3215 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "λίστα ονόματος/τιμής στήλης περιέχει ανύπαρκτο όνομα στήλης «%s»" -#: pltcl.c:3222 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "δεν είναι δυνατός ο ορισμός του χαρακτηριστικού συστήματος «%s»" -#: pltcl.c:3228 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "δεν είναι δυνατός ο ορισμός δημιουργημένης στήλης «%s»" diff --git a/third_party/spanner_pg/src/pl/tcl/po/es.po b/third_party/spanner_pg/src/pl/tcl/po/es.po index 89503923..fe7b70a8 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/es.po +++ b/third_party/spanner_pg/src/pl/tcl/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 14\n" +"Project-Id-Version: pltcl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-07 16:53+0000\n" -"PO-Revision-Date: 2019-06-06 17:26-0400\n" +"POT-Creation-Date: 2023-05-07 16:38+0000\n" +"PO-Revision-Date: 2022-10-20 09:06+0200\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -28,43 +28,48 @@ msgstr "función PL/Tcl a ejecutar cuando se use pltcl por primera vez." msgid "PL/TclU function to call once when pltclu is first used." msgstr "función PL/TclU a ejecutar cuando se use pltclu por primera vez." -#: pltcl.c:634 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "la función «%s» está en el lenguaje equivocado" -#: pltcl.c:645 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "la función «%s» no debe ser SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:679 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "procesando el parámetro %s" -#: pltcl.c:833 +#: pltcl.c:835 #, 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" -#: pltcl.c:1006 +#: pltcl.c:840 +#, 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" + +#: pltcl.c:1013 #, 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" -#: pltcl.c:1290 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "no se pudo separar el valor de retorno del disparador: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" @@ -73,42 +78,42 @@ msgstr "" "%s\n" "en función PL/Tcl \"%s\"" -#: pltcl.c:1536 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "las funciones disparadoras sólo pueden ser invocadas como disparadores" -#: pltcl.c:1540 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "las funciones PL/Tcl no pueden retornar tipo %s" -#: pltcl.c:1579 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "las funciones PL/Tcl no pueden aceptar el tipog%s" -#: pltcl.c:1693 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "no se pudo crear procedimiento interno «%s»: %s" -#: pltcl.c:3195 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "la lista de nombres de columnas y valores debe tener un número par de elementos" -#: pltcl.c:3213 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "la lista de nombres de columnas y valores contiene el nombre de columna no existente «%s»" -#: pltcl.c:3220 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "no se puede definir el atributo de sistema «%s»" -#: pltcl.c:3226 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "no se puede definir el atributo generado «%s»" diff --git a/third_party/spanner_pg/src/pl/tcl/po/fr.po b/third_party/spanner_pg/src/pl/tcl/po/fr.po index 637cbab5..2af48d87 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/fr.po +++ b/third_party/spanner_pg/src/pl/tcl/po/fr.po @@ -1,75 +1,78 @@ -# 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 renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas 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" @@ -78,62 +81,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/third_party/spanner_pg/src/pl/tcl/po/it.po b/third_party/spanner_pg/src/pl/tcl/po/it.po index 0aa100f3..01e64c62 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/it.po +++ b/third_party/spanner_pg/src/pl/tcl/po/it.po @@ -16,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL) 10\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2017-05-22 07:37+0000\n" -"PO-Revision-Date: 2017-05-29 17:51+0100\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-26 08:08+0000\n" +"PO-Revision-Date: 2022-09-26 15:04+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -26,53 +26,58 @@ 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 1.8.7.1\n" +"X-Generator: Poedit 3.1.1\n" -#: pltcl.c:459 +#: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Funzione PL/Tcl da richiamare una volta quando pltcl è usato la prima volta." -#: pltcl.c:466 +#: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Funzione PL/TclU da richiamare una volta quando pltcl è usato la prima volta." -#: pltcl.c:629 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "la funzione \"%s\" è nel linguaggio sbagliato" -#: pltcl.c:640 +#: pltcl.c:648 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "la funzione \"%s\" non può essere SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:674 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "esecuzione del parametro %s" -#: pltcl.c:830 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "funzione che restituisce insiemi richiamata in un contesto che non può accettare un insieme" -#: pltcl.c:994 +#: pltcl.c:840 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "necessaria modalità materializzata, ma non ammessa in questo contesto" + +#: pltcl.c:1013 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "funzione che restituisce record richiamata in un contesto che non può accettare record" -#: pltcl.c:1263 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "divisione del valore di ritorno del trigger fallita: %s" -#: pltcl.c:1343 pltcl.c:1771 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1344 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" @@ -81,37 +86,42 @@ msgstr "" "%s\n" "nella funzione PL/Tcl \"%s\"" -#: pltcl.c:1509 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "le funzioni trigger possono essere chiamate esclusivamente da trigger" -#: pltcl.c:1513 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "le funzioni PL/Tcl non possono restituire il tipo %s" -#: pltcl.c:1549 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "le funzioni PL/Tcl non possono accettare il tipo %s" -#: pltcl.c:1663 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "creazione della procedura interna \"%s\" fallita: %s" -#: pltcl.c:3100 +#: pltcl.c:3201 #, c-format msgid "column name/value list must have even number of elements" msgstr "la lista nome/valore di colonne deve avere un numero di elementi pari" -#: pltcl.c:3118 +#: pltcl.c:3219 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "la lista nome/valore di elementi contiene un nome di colonna inesistente \"%s\"" -#: pltcl.c:3125 +#: pltcl.c:3226 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "non è possibile impostare l'attributo di sistema \"%s\"" + +#: pltcl.c:3232 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "non è possibile modificare la colonna ereditata \"%s\"" diff --git a/third_party/spanner_pg/src/pl/tcl/po/ja.po b/third_party/spanner_pg/src/pl/tcl/po/ja.po index 27997d5e..d31a2487 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/ja.po +++ b/third_party/spanner_pg/src/pl/tcl/po/ja.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL 14)\n" +"Project-Id-Version: pltcl (PostgreSQL 15)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-25 17:23+0900\n" -"PO-Revision-Date: 2021-08-25 11:48+0900\n" +"POT-Creation-Date: 2022-08-09 12:01+0900\n" +"PO-Revision-Date: 2019-06-11 17:26+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -16,97 +16,102 @@ 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.8.13\n" +"X-Generator: Poedit 1.5.4\n" #: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." -msgstr "pltclが最初に使用される際に一度だけ呼び出されるPL/Tcl関数。" +msgstr "pltcl が最初に使用される際に一度だけ呼び出される PL/Tcl 関数。" #: pltcl.c:470 msgid "PL/TclU function to call once when pltclu is first used." -msgstr "pltcluが最初に使用される際に一度だけ呼び出されるPL/TclU関数。" +msgstr "pltclu が最初に使用される際に一度だけ呼び出される PL/TclU 関数。" -#: pltcl.c:634 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "関数\"%s\"は言語が異なります" -#: pltcl.c:645 +#: 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:679 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" -msgstr "パラメーター%sを処理しています" +msgstr "%sパラメーターを処理しています" -#: pltcl.c:833 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "集合を受け付けないコンテキストで集合値関数が呼び出されました" +msgstr "このコンテキストでは、集合値の関数は集合を受け付けられません" -#: pltcl.c:1006 +#: pltcl.c:840 +#, c-format +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:1290 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "トリガーからの戻り値を分割できませんでした: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" "in PL/Tcl function \"%s\"" msgstr "" "%s\n" -"PL/Tcl関数\"%s\"内" +"PL/Tcl 関数 \"%s\"" -#: pltcl.c:1536 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "トリガー関数はトリガーとしてのみ呼び出せます" +msgstr "トリガー関数はトリガーとしてのみコールできます" -#: pltcl.c:1540 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" -msgstr "PL/Tcl関数は%s型の戻り値を返せません" +msgstr "PL/Tcl 関数は%s型の戻り値を返せません" -#: pltcl.c:1579 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" -msgstr "PL/Tcl関数は%s型を受け付けません" +msgstr "PL/Tcl 関数は%s型を受け付けません" -#: pltcl.c:1693 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "内部プロシージャ\"%s\"を作成できませんでした: %s" -#: pltcl.c:3197 +#: pltcl.c:3201 #, c-format msgid "column name/value list must have even number of elements" msgstr "列名/値のリストの要素は偶数個でなければなりません" -#: pltcl.c:3215 +#: pltcl.c:3219 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "列名/値のリストの中に、存在しない列名\"%s\"が含まれています" -#: pltcl.c:3222 +#: pltcl.c:3226 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"は設定できません" -#: pltcl.c:3228 +#: pltcl.c:3232 #, c-format msgid "cannot set generated column \"%s\"" -msgstr "生成列\"%s\"は設定できません" +msgstr "生成列\"%s\"を変更できません" diff --git a/third_party/spanner_pg/src/pl/tcl/po/ka.po b/third_party/spanner_pg/src/pl/tcl/po/ka.po new file mode 100644 index 00000000..15540151 --- /dev/null +++ b/third_party/spanner_pg/src/pl/tcl/po/ka.po @@ -0,0 +1,117 @@ +# Georgian message translation file for pltcl +# Copyright (C) 2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the pltcl (PostgreSQL) package. +# Temuri Doghonadze , 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: pltcl (PostgreSQL) 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-07-06 23:08+0000\n" +"PO-Revision-Date: 2022-07-07 06:12+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\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.1\n" + +#: pltcl.c:463 +msgid "PL/Tcl function to call once when pltcl is first used." +msgstr "PL/Tcl ფუნქცია, როლის გამოძახებაც ერთხელ, pltcl-ის პირველი გამოყენებისას ხდება." + +#: pltcl.c:470 +msgid "PL/TclU function to call once when pltclu is first used." +msgstr "PL/TclU ფუნქცია, როლის გამოძახებაც ერთხელ, pltclu -ის პირველი გამოყენებისას ხდება." + +#: pltcl.c:637 +#, c-format +msgid "function \"%s\" is in the wrong language" +msgstr "ფუნქცია \"%s\" არასწორ ენაზეა" + +#: 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:682 +#, c-format +msgid "processing %s parameter" +msgstr "პარამეტრის დამუშავება: %s" + +#: pltcl.c:835 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "სეტ-ღირებული ფუნქცია, რომელსაც ეწოდება კონტექსტში, რომელსაც არ შეუძლია მიიღოს ნაკრები" + +#: pltcl.c:840 +#, c-format +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:1296 +#, c-format +msgid "could not split return value from trigger: %s" +msgstr "ტრიგერიდან დაბრუნებული მნიშვნელობის დაყოფა შეუძლებელია: %s" + +#: pltcl.c:1377 pltcl.c:1807 +#, c-format +msgid "%s" +msgstr "%s" + +#: pltcl.c:1378 +#, c-format +msgid "" +"%s\n" +"in PL/Tcl function \"%s\"" +msgstr "" +"%s\n" +"PL/Tcl-ის ფუნქციაში\"%s\"" + +#: pltcl.c:1542 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "ტრიგერის ფუნქციების გამოძახება მხოლოდ ტრიგერებად შეიძლება" + +#: pltcl.c:1546 +#, c-format +msgid "PL/Tcl functions cannot return type %s" +msgstr "PL/Tcl ფუნქციას %s ტიპის დაბრუნება არ შეუძლია" + +#: pltcl.c:1585 +#, c-format +msgid "PL/Tcl functions cannot accept type %s" +msgstr "PL/Tcl ფუნქციას %s ტიპის მიღება არ შეუძლია" + +#: pltcl.c:1699 +#, c-format +msgid "could not create internal procedure \"%s\": %s" +msgstr "შიდა პროცედურის (\"%s\") შექმნის შეცდომა: %s" + +#: pltcl.c:3201 +#, c-format +msgid "column name/value list must have even number of elements" +msgstr "სვეტის სახელი/მნიშვნელობების სიას ელემენტების ლუწი რაოდენობა უნდა ჰქონდეს" + +#: pltcl.c:3219 +#, c-format +msgid "column name/value list contains nonexistent column name \"%s\"" +msgstr "სვეტის სახელი/მნიშვნელობების სია შეიცავს სვეტის არარსებულ სახელს „%s“" + +#: pltcl.c:3226 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "სისტემური ატრიბუტის დაყენების შეცდომა: \"%s\"" + +#: pltcl.c:3232 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "გენერირებული სვეტის დაყენება შეუძლებელია: %s" diff --git a/third_party/spanner_pg/src/pl/tcl/po/ko.po b/third_party/spanner_pg/src/pl/tcl/po/ko.po index 06732234..ac9954bd 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/ko.po +++ b/third_party/spanner_pg/src/pl/tcl/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 12\n" +"Project-Id-Version: pltcl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:08+0000\n" -"PO-Revision-Date: 2019-11-01 12:52+0900\n" +"POT-Creation-Date: 2023-04-12 00:38+0000\n" +"PO-Revision-Date: 2023-04-06 10:02+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -17,53 +17,58 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\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/Tcl 함수" -#: 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 "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, 이 구문에서는 허용되지 않습니다" + +#: 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" @@ -72,42 +77,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:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "칼럼 이름/값 목록은 그 요소의 개수가 짝수여야 함" -#: pltcl.c:3226 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "칼럼 이름/값 목록에 \"%s\" 칼럼에 대한 값이 없음" -#: pltcl.c:3233 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "\"%s\" 시스템 속성을 지정할 수 없음" -#: pltcl.c:3239 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "\"%s\" 계산된 칼럼을 지정할 수 없음" diff --git a/third_party/spanner_pg/src/pl/tcl/po/pt_BR.po b/third_party/spanner_pg/src/pl/tcl/po/pt_BR.po new file mode 100644 index 00000000..39ee0049 --- /dev/null +++ b/third_party/spanner_pg/src/pl/tcl/po/pt_BR.po @@ -0,0 +1,117 @@ +# Brazilian Portuguese message translation file for pltcl +# +# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# This file is distributed under the same license as the PostgreSQL package. +# +# Euler Taveira , 2009-2022. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 15\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2022-09-27 13:15-0300\n" +"PO-Revision-Date: 2009-05-06 18:00-0300\n" +"Last-Translator: Euler Taveira \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: pltcl.c:463 +msgid "PL/Tcl function to call once when pltcl is first used." +msgstr "função PL/Tcl executada quando pltcl for utilizado pela primeira vez." + +#: pltcl.c:470 +msgid "PL/TclU function to call once when pltclu is first used." +msgstr "função PL/TclU executada quando pltclu for utilizado pela primeira vez." + +#: pltcl.c:637 +#, c-format +msgid "function \"%s\" is in the wrong language" +msgstr "função \"%s\" está na linguagem incorreta" + +#: pltcl.c:648 +#, c-format +msgid "function \"%s\" must not be SECURITY DEFINER" +msgstr "função \"%s\" não deve ser SECURITY DEFINER" + +#. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" +#: pltcl.c:682 +#, c-format +msgid "processing %s parameter" +msgstr "processando parâmetro %s" + +#: pltcl.c:835 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "função que tem argumento do tipo conjunto foi chamada em um contexto que não pode aceitar um conjunto" + +#: pltcl.c:840 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "modo de materialização é requerido, mas ele não é permitido neste contexto" + +#: pltcl.c:1013 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "função que retorna record foi chamada em um contexto que não pode aceitar tipo record" + +#: pltcl.c:1296 +#, c-format +msgid "could not split return value from trigger: %s" +msgstr "não pôde dividir valor retornado do gatilho: %s" + +#: pltcl.c:1377 pltcl.c:1807 +#, c-format +msgid "%s" +msgstr "%s" + +#: pltcl.c:1378 +#, c-format +msgid "" +"%s\n" +"in PL/Tcl function \"%s\"" +msgstr "" +"%s\n" +"na função PL/Tcl \"%s\"" + +#: pltcl.c:1542 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "funções de gatilho só podem ser chamadas como gatilhos" + +#: pltcl.c:1546 +#, c-format +msgid "PL/Tcl functions cannot return type %s" +msgstr "funções PL/Tcl não podem retornar tipo %s" + +#: pltcl.c:1585 +#, c-format +msgid "PL/Tcl functions cannot accept type %s" +msgstr "funções PL/Tcl não podem aceitar tipo %s" + +#: pltcl.c:1699 +#, c-format +msgid "could not create internal procedure \"%s\": %s" +msgstr "não pôde criar função interna \"%s\": %s" + +#: pltcl.c:3201 +#, c-format +msgid "column name/value list must have even number of elements" +msgstr "lista de nome/valor de colunas deve ter número par de elementos" + +#: pltcl.c:3219 +#, c-format +msgid "column name/value list contains nonexistent column name \"%s\"" +msgstr "lsta de nome/valor de colunas contém nome de coluna inexistente \"%s\"" + +#: pltcl.c:3226 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "não pode definir atributo do sistema \"%s\"" + +#: pltcl.c:3232 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "não pode definir coluna gerada \"%s\"" diff --git a/third_party/spanner_pg/src/pl/tcl/po/ru.po b/third_party/spanner_pg/src/pl/tcl/po/ru.po index 3e9cfe9e..876918d6 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/ru.po +++ b/third_party/spanner_pg/src/pl/tcl/po/ru.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-10 11:56+0300\n" -"PO-Revision-Date: 2019-08-29 15:43+0300\n" +"POT-Creation-Date: 2023-05-03 05:56+0300\n" +"PO-Revision-Date: 2022-09-05 13:38+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -25,46 +25,51 @@ msgstr "Функция на PL/Tcl, вызываемая при первом и msgid "PL/TclU function to call once when pltclu is first used." msgstr "Функция на PL/TclU, вызываемая при первом использовании pltclu." -#: pltcl.c:634 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Функция \"%s\" объявлена на другом языке" -#: pltcl.c:645 +#: 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:679 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "обработка параметра %s" -#: pltcl.c:833 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функция, возвращающая множество, вызвана в контексте, где ему нет места" -#: pltcl.c:1006 +#: pltcl.c:840 +#, c-format +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:1290 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "разложить возвращаемое из триггера значение не удалось: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1378 #, c-format msgid "" "%s\n" @@ -73,43 +78,43 @@ msgstr "" "%s\n" "в функции PL/Tcl \"%s\"" -#: pltcl.c:1536 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызываться только в триггерах" -#: pltcl.c:1540 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "функции PL/Tcl не могут возвращать тип %s" -#: pltcl.c:1579 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "функции PL/Tcl не могут принимать тип %s" -#: pltcl.c:1693 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не удалось создать внутреннюю процедуру \"%s\": %s" -#: pltcl.c:3195 +#: pltcl.c:3202 #, c-format msgid "column name/value list must have even number of elements" msgstr "в списке имён/значений столбцов должно быть чётное число элементов" -#: pltcl.c:3213 +#: pltcl.c:3220 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "" "список имён/значений столбцов содержит имя несуществующего столбца \"%s\"" -#: pltcl.c:3220 +#: pltcl.c:3227 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "присвоить значение системному атрибуту \"%s\" нельзя" -#: pltcl.c:3226 +#: pltcl.c:3233 #, c-format msgid "cannot set generated column \"%s\"" msgstr "присвоить значение генерируемому столбцу \"%s\" нельзя" diff --git a/third_party/spanner_pg/src/pl/tcl/po/sv.po b/third_party/spanner_pg/src/pl/tcl/po/sv.po index 7fd46087..5d140445 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/sv.po +++ b/third_party/spanner_pg/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, 2021. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023. # 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: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2021-11-07 10:38+0100\n" +"POT-Creation-Date: 2022-04-11 13:38+0000\n" +"PO-Revision-Date: 2023-03-09 22:42+0100\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" +msgstr "kunde inte dela på returvärde från trigger: %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/third_party/spanner_pg/src/pl/tcl/po/uk.po b/third_party/spanner_pg/src/pl/tcl/po/uk.po index b9b10ed1..ceb1e782 100644 --- a/third_party/spanner_pg/src/pl/tcl/po/uk.po +++ b/third_party/spanner_pg/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: 2022-03-16 09:08+0000\n" -"PO-Revision-Date: 2022-06-19 10:10\n" +"POT-Creation-Date: 2022-08-12 10:38+0000\n" +"PO-Revision-Date: 2022-09-13 11:52\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: /REL_14_STABLE/pltcl.pot\n" -"X-Crowdin-File-ID: 736\n" +"X-Crowdin-File: /REL_15_STABLE/pltcl.pot\n" +"X-Crowdin-File-ID: 914\n" #: pltcl.c:463 msgid "PL/Tcl function to call once when pltcl is first used." @@ -25,85 +25,90 @@ msgstr "Функція PL/Tcl використовується для викли msgid "PL/TclU function to call once when pltclu is first used." msgstr "Функція PL/TclU використовується для виклику коли pltclu вперше використаний." -#: pltcl.c:634 +#: pltcl.c:637 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "функція «%s» написана неправильною мовою" -#: pltcl.c:645 +#: 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:679 +#: pltcl.c:682 #, c-format msgid "processing %s parameter" msgstr "обробляється параметр %s" -#: pltcl.c:833 +#: pltcl.c:835 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "функція \"set-valued\" викликана в контексті, де йому немає місця" -#: pltcl.c:1006 +#: pltcl.c:840 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "необхідний режим матеріалізації (materialize mode), але він неприпустимий у цьому контексті" + +#: pltcl.c:1013 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функція, що повертає набір, викликана у контексті, що не приймає тип запис" -#: pltcl.c:1290 +#: pltcl.c:1296 #, c-format msgid "could not split return value from trigger: %s" msgstr "не вдалося розділити повернене значення з тригера: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1377 pltcl.c:1807 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1378 #, c-format msgid "%s\n" "in PL/Tcl function \"%s\"" msgstr "%s\n" "у функції PL/Tcl \"%s\"" -#: pltcl.c:1536 +#: pltcl.c:1542 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-функція може викликатися лише як тригер" -#: pltcl.c:1540 +#: pltcl.c:1546 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "Функції PL/Tcl не можуть повертати тип %s" -#: pltcl.c:1579 +#: pltcl.c:1585 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "Функції PL/Tcl не можуть приймати тип %s" -#: pltcl.c:1693 +#: pltcl.c:1699 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не вдалося створити внутрішню процедуру \"%s\": %s" -#: pltcl.c:3197 +#: pltcl.c:3201 #, c-format msgid "column name/value list must have even number of elements" msgstr "список імен і значень стовпців повинен мати парну кількість елементів" -#: pltcl.c:3215 +#: pltcl.c:3219 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "список імен і значень стовпців містить неіснуєче ім'я стовпця \"%s\"" -#: pltcl.c:3222 +#: pltcl.c:3226 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалося встановити системний атрибут \"%s\"" -#: pltcl.c:3228 +#: pltcl.c:3232 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований стовпець \"%s\"" diff --git a/third_party/spanner_pg/src/port/BUILD b/third_party/spanner_pg/src/port/BUILD index b24d00a3..faa8c459 100644 --- a/third_party/spanner_pg/src/port/BUILD +++ b/third_party/spanner_pg/src/port/BUILD @@ -49,7 +49,6 @@ filegroup( srcs = [ "bsearch_arg.c", "chklocale.c", - "erand48.c", "explicit_bzero.c", "fls.c", "getpeereid.c", @@ -108,8 +107,6 @@ filegroup( "pg_crc32c_armv8.c", "pg_crc32c_armv8_choose.c", "pthread-win32.h", - "random.c", - "srandom.c", "strnlen.c", "system.c", "unsetenv.c", diff --git a/third_party/spanner_pg/src/port/Makefile b/third_party/spanner_pg/src/port/Makefile index 52dbf578..bfe1feb0 100644 --- a/third_party/spanner_pg/src/port/Makefile +++ b/third_party/spanner_pg/src/port/Makefile @@ -42,7 +42,6 @@ OBJS = \ $(PG_CRC32C_OBJS) \ bsearch_arg.o \ chklocale.o \ - erand48.o \ inet_net_ntop.o \ noblock.o \ path.o \ @@ -85,6 +84,10 @@ libpgport.a: $(OBJS) rm -f $@ $(AR) $(AROPT) $@ $^ +# getaddrinfo.o and getaddrinfo_shlib.o need PTHREAD_CFLAGS (but getaddrinfo_srv.o does not) +getaddrinfo.o: CFLAGS+=$(PTHREAD_CFLAGS) +getaddrinfo_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS) + # thread.o and thread_shlib.o need PTHREAD_CFLAGS (but thread_srv.o does not) thread.o: CFLAGS+=$(PTHREAD_CFLAGS) thread_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS) diff --git a/third_party/spanner_pg/src/port/bsearch_arg.c b/third_party/spanner_pg/src/port/bsearch_arg.c index 8849bdff..a74c5882 100644 --- a/third_party/spanner_pg/src/port/bsearch_arg.c +++ b/third_party/spanner_pg/src/port/bsearch_arg.c @@ -1,7 +1,7 @@ /* * bsearch_arg.c: bsearch variant with a user-supplied pointer * - * Copyright (c) 2021, PostgreSQL Global Development Group + * Copyright (c) 2021-2022, PostgreSQL Global Development Group * Copyright (c) 1990 Regents of the University of California. * All rights reserved. * diff --git a/third_party/spanner_pg/src/port/chklocale.c b/third_party/spanner_pg/src/port/chklocale.c index 3d47d37e..c85d8da3 100644 --- a/third_party/spanner_pg/src/port/chklocale.c +++ b/third_party/spanner_pg/src/port/chklocale.c @@ -4,7 +4,7 @@ * Functions for handling locale-related info * * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -278,7 +278,6 @@ win32_langinfo(const char *ctype) strcpy(r, codepage); } } - } #endif diff --git a/third_party/spanner_pg/src/port/dirent.c b/third_party/spanner_pg/src/port/dirent.c index 2cd13449..10ea4bdd 100644 --- a/third_party/spanner_pg/src/port/dirent.c +++ b/third_party/spanner_pg/src/port/dirent.c @@ -3,7 +3,7 @@ * dirent.c * opendir/readdir/closedir for win32/msvc * - * 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/third_party/spanner_pg/src/port/dirmod.c b/third_party/spanner_pg/src/port/dirmod.c index 763bc5f9..7ce042e7 100644 --- a/third_party/spanner_pg/src/port/dirmod.c +++ b/third_party/spanner_pg/src/port/dirmod.c @@ -3,7 +3,7 @@ * dirmod.c * directory handling functions * - * 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 * * This includes replacement versions of functions that work on diff --git a/third_party/spanner_pg/src/port/dlopen.c b/third_party/spanner_pg/src/port/dlopen.c index f7948b86..d441dc81 100644 --- a/third_party/spanner_pg/src/port/dlopen.c +++ b/third_party/spanner_pg/src/port/dlopen.c @@ -3,7 +3,7 @@ * dlopen.c * dynamic loader for platforms without dlopen() * - * 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/third_party/spanner_pg/src/port/erand48.c b/third_party/spanner_pg/src/port/erand48.c deleted file mode 100644 index a82ea942..00000000 --- a/third_party/spanner_pg/src/port/erand48.c +++ /dev/null @@ -1,136 +0,0 @@ -/*------------------------------------------------------------------------- - * - * erand48.c - * - * This file supplies pg_erand48() and related functions, which except - * for the names are just like the POSIX-standard erand48() family. - * (We don't supply the full set though, only the ones we have found use - * for in Postgres. In particular, we do *not* implement lcong48(), so - * that there is no need for the multiplier and addend to be variable.) - * - * We used to test for an operating system version rather than - * unconditionally using our own, but (1) some versions of Cygwin have a - * buggy erand48() that always returns zero and (2) as of 2011, glibc's - * erand48() is strangely coded to be almost-but-not-quite thread-safe, - * which doesn't matter for the backend but is important for pgbench. - * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group - * - * Portions Copyright (c) 1993 Martin Birgmeier - * All rights reserved. - * - * You may redistribute unmodified or modified versions of this source - * code provided that the above copyright notice and this and the - * following conditions are retained. - * - * This software is provided ``as is'', and comes with no warranties - * of any kind. I shall in no event be liable for anything that happens - * to anyone/anything when using this software. - * - * IDENTIFICATION - * src/port/erand48.c - * - *------------------------------------------------------------------------- - */ - -#include "c.h" - -#include - -/* These values are specified by POSIX */ -#define RAND48_MULT UINT64CONST(0x0005deece66d) -#define RAND48_ADD UINT64CONST(0x000b) - -/* POSIX specifies 0x330e's use in srand48, but the other bits are arbitrary */ -#define RAND48_SEED_0 (0x330e) -#define RAND48_SEED_1 (0xabcd) -#define RAND48_SEED_2 (0x1234) - -static unsigned short _rand48_seed[3] = { - RAND48_SEED_0, - RAND48_SEED_1, - RAND48_SEED_2 -}; - - -/* - * Advance the 48-bit value stored in xseed[] to the next "random" number. - * - * Also returns the value of that number --- without masking it to 48 bits. - * If caller uses the result, it must mask off the bits it wants. - */ -static uint64 -_dorand48(unsigned short xseed[3]) -{ - /* - * We do the arithmetic in uint64; any type wider than 48 bits would work. - */ - uint64 in; - uint64 out; - - in = (uint64) xseed[2] << 32 | (uint64) xseed[1] << 16 | (uint64) xseed[0]; - - out = in * RAND48_MULT + RAND48_ADD; - - xseed[0] = out & 0xFFFF; - xseed[1] = (out >> 16) & 0xFFFF; - xseed[2] = (out >> 32) & 0xFFFF; - - return out; -} - - -/* - * Generate a random floating-point value using caller-supplied state. - * Values are uniformly distributed over the interval [0.0, 1.0). - */ -double -pg_erand48(unsigned short xseed[3]) -{ - uint64 x = _dorand48(xseed); - - return ldexp((double) (x & UINT64CONST(0xFFFFFFFFFFFF)), -48); -} - -/* - * Generate a random non-negative integral value using internal state. - * Values are uniformly distributed over the interval [0, 2^31). - */ -long -pg_lrand48(void) -{ - uint64 x = _dorand48(_rand48_seed); - - return (x >> 17) & UINT64CONST(0x7FFFFFFF); -} - -/* - * Generate a random signed integral value using caller-supplied state. - * Values are uniformly distributed over the interval [-2^31, 2^31). - */ -long -pg_jrand48(unsigned short xseed[3]) -{ - uint64 x = _dorand48(xseed); - - return (int32) ((x >> 16) & UINT64CONST(0xFFFFFFFF)); -} - -/* - * Initialize the internal state using the given seed. - * - * Per POSIX, this uses only 32 bits from "seed" even if "long" is wider. - * Hence, the set of possible seed values is smaller than it could be. - * Better practice is to use caller-supplied state and initialize it with - * random bits obtained from a high-quality source of random bits. - * - * Note: POSIX specifies a function seed48() that allows all 48 bits - * of the internal state to be set, but we don't currently support that. - */ -void -pg_srand48(long seed) -{ - _rand48_seed[0] = RAND48_SEED_0; - _rand48_seed[1] = (unsigned short) seed; - _rand48_seed[2] = (unsigned short) (seed >> 16); -} diff --git a/third_party/spanner_pg/src/port/explicit_bzero.c b/third_party/spanner_pg/src/port/explicit_bzero.c index e39e20b8..0d504eb6 100644 --- a/third_party/spanner_pg/src/port/explicit_bzero.c +++ b/third_party/spanner_pg/src/port/explicit_bzero.c @@ -2,7 +2,7 @@ * * explicit_bzero.c * - * 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/third_party/spanner_pg/src/port/fls.c b/third_party/spanner_pg/src/port/fls.c index 2c622c51..19b42218 100644 --- a/third_party/spanner_pg/src/port/fls.c +++ b/third_party/spanner_pg/src/port/fls.c @@ -3,7 +3,7 @@ * fls.c * finds the last (most significant) bit that is set * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/getaddrinfo.c b/third_party/spanner_pg/src/port/getaddrinfo.c index bb194da5..3284c6eb 100644 --- a/third_party/spanner_pg/src/port/getaddrinfo.c +++ b/third_party/spanner_pg/src/port/getaddrinfo.c @@ -13,7 +13,7 @@ * use the Windows native routines, but if not, we use our own. * * - * Copyright (c) 2003-2021, PostgreSQL Global Development Group + * Copyright (c) 2003-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/getaddrinfo.c @@ -34,6 +34,14 @@ #include "port/pg_bswap.h" +#ifdef FRONTEND +static int pqGethostbyname(const char *name, + struct hostent *resultbuf, + char *buffer, size_t buflen, + struct hostent **result, + int *herrno); +#endif + #ifdef WIN32 /* * The native routines may or may not exist on the Windows platform we are on, @@ -394,3 +402,39 @@ getnameinfo(const struct sockaddr *sa, int salen, return 0; } + +/* + * Wrapper around gethostbyname() or gethostbyname_r() to mimic + * POSIX gethostbyname_r() behaviour, if it is not available or required. + */ +#ifdef FRONTEND +static int +pqGethostbyname(const char *name, + struct hostent *resultbuf, + char *buffer, size_t buflen, + struct hostent **result, + int *herrno) +{ +#if defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETHOSTBYNAME_R) + + /* + * broken (well early POSIX draft) gethostbyname_r() which returns 'struct + * hostent *' + */ + *result = gethostbyname_r(name, resultbuf, buffer, buflen, herrno); + return (*result == NULL) ? -1 : 0; +#else + + /* no gethostbyname_r(), just use gethostbyname() */ + *result = gethostbyname(name); + + if (*result != NULL) + *herrno = h_errno; + + if (*result != NULL) + return 0; + else + return -1; +#endif +} +#endif /* FRONTEND */ diff --git a/third_party/spanner_pg/src/port/getpeereid.c b/third_party/spanner_pg/src/port/getpeereid.c index d6aa755d..56ae1410 100644 --- a/third_party/spanner_pg/src/port/getpeereid.c +++ b/third_party/spanner_pg/src/port/getpeereid.c @@ -3,7 +3,7 @@ * getpeereid.c * get peer userid for UNIX-domain socket connection * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -37,7 +37,7 @@ getpeereid(int sock, uid_t *uid, gid_t *gid) #if defined(SO_PEERCRED) /* Linux: use getsockopt(SO_PEERCRED) */ struct ucred peercred; - ACCEPT_TYPE_ARG3 so_len = sizeof(peercred); + socklen_t so_len = sizeof(peercred); if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) != 0 || so_len != sizeof(peercred)) @@ -48,7 +48,7 @@ getpeereid(int sock, uid_t *uid, gid_t *gid) #elif defined(LOCAL_PEERCRED) /* Debian with FreeBSD kernel: use getsockopt(LOCAL_PEERCRED) */ struct xucred peercred; - ACCEPT_TYPE_ARG3 so_len = sizeof(peercred); + socklen_t so_len = sizeof(peercred); if (getsockopt(sock, 0, LOCAL_PEERCRED, &peercred, &so_len) != 0 || so_len != sizeof(peercred) || diff --git a/third_party/spanner_pg/src/port/getrusage.c b/third_party/spanner_pg/src/port/getrusage.c index 99f240f6..8369fd27 100644 --- a/third_party/spanner_pg/src/port/getrusage.c +++ b/third_party/spanner_pg/src/port/getrusage.c @@ -3,7 +3,7 @@ * getrusage.c * get information about resource utilisation * - * 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/third_party/spanner_pg/src/port/kill.c b/third_party/spanner_pg/src/port/kill.c index 99b35de4..ff086268 100644 --- a/third_party/spanner_pg/src/port/kill.c +++ b/third_party/spanner_pg/src/port/kill.c @@ -3,7 +3,7 @@ * kill.c * kill() * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * This is a replacement version of kill for Win32 which sends * signals that the backend can recognize. diff --git a/third_party/spanner_pg/src/port/link.c b/third_party/spanner_pg/src/port/link.c index 0b61da5a..1e0ccd46 100644 --- a/third_party/spanner_pg/src/port/link.c +++ b/third_party/spanner_pg/src/port/link.c @@ -2,7 +2,7 @@ * * link.c * - * 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/third_party/spanner_pg/src/port/mkdtemp.c b/third_party/spanner_pg/src/port/mkdtemp.c index c97b6378..8809957d 100644 --- a/third_party/spanner_pg/src/port/mkdtemp.c +++ b/third_party/spanner_pg/src/port/mkdtemp.c @@ -3,7 +3,7 @@ * mkdtemp.c * create a mode-0700 temporary directory * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/noblock.c b/third_party/spanner_pg/src/port/noblock.c index b43222c3..4c95a1fc 100644 --- a/third_party/spanner_pg/src/port/noblock.c +++ b/third_party/spanner_pg/src/port/noblock.c @@ -3,7 +3,7 @@ * noblock.c * set a file descriptor as blocking or non-blocking * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/open.c b/third_party/spanner_pg/src/port/open.c index 14c6debb..8c09c7c1 100644 --- a/third_party/spanner_pg/src/port/open.c +++ b/third_party/spanner_pg/src/port/open.c @@ -4,7 +4,7 @@ * Win32 open() replacement * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/port/open.c * @@ -13,17 +13,20 @@ #ifdef WIN32 +#define UMDF_USING_NTSTATUS + #ifndef FRONTEND #include "postgres.h" #else #include "postgres_fe.h" #endif +#include "port/win32ntdll.h" + #include #include #include - static int openFlagsToCreateFileFlags(int openFlags) { @@ -56,38 +59,25 @@ openFlagsToCreateFileFlags(int openFlags) } /* - * - file attribute setting, based on fileMode? + * Internal function used by pgwin32_open() and _pgstat64(). When + * backup_semantics is true, directories may be opened (for limited uses). On + * failure, INVALID_HANDLE_VALUE is returned and errno is set. */ -int -pgwin32_open(const char *fileName, int fileFlags,...) +HANDLE +pgwin32_open_handle(const char *fileName, int fileFlags, bool backup_semantics) { - int fd; - HANDLE h = INVALID_HANDLE_VALUE; + HANDLE h; SECURITY_ATTRIBUTES sa; int loops = 0; + if (initialize_ntdll() < 0) + return INVALID_HANDLE_VALUE; + /* Check that we can handle the request */ assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND | (O_RANDOM | O_SEQUENTIAL | O_TEMPORARY) | _O_SHORT_LIVED | O_DSYNC | O_DIRECT | (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags); -#ifndef FRONTEND - Assert(pgwin32_signal_event != NULL); /* small chance of pg_usleep() */ -#endif - -#ifdef FRONTEND - - /* - * Since PostgreSQL 12, those concurrent-safe versions of open() and - * fopen() can be used by frontends, having as side-effect to switch the - * file-translation mode from O_TEXT to O_BINARY if none is specified. - * Caller may want to enforce the binary or text mode, but if nothing is - * defined make sure that the default mode maps with what versions older - * than 12 have been doing. - */ - if ((fileFlags & O_BINARY) == 0) - fileFlags |= O_TEXT; -#endif sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; @@ -102,6 +92,7 @@ pgwin32_open(const char *fileName, int fileFlags,...) &sa, openFlagsToCreateFileFlags(fileFlags), FILE_ATTRIBUTE_NORMAL | + (backup_semantics ? FILE_FLAG_BACKUP_SEMANTICS : 0) | ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) | ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) | ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) | @@ -140,38 +131,55 @@ pgwin32_open(const char *fileName, int fileFlags,...) /* * ERROR_ACCESS_DENIED is returned if the file is deleted but not yet * gone (Windows NT status code is STATUS_DELETE_PENDING). In that - * case we want to wait a bit and try again, giving up after 1 second - * (since this condition should never persist very long). However, - * there are other commonly-hit cases that return ERROR_ACCESS_DENIED, - * so care is needed. In particular that happens if we try to open a - * directory, or of course if there's an actual file-permissions - * problem. To distinguish these cases, try a stat(). In the - * delete-pending case, it will either also get STATUS_DELETE_PENDING, - * or it will see the file as gone and fail with ENOENT. In other - * cases it will usually succeed. The only somewhat-likely case where - * this coding will uselessly wait is if there's a permissions problem - * with a containing directory, which we hope will never happen in any - * performance-critical code paths. + * case, we'd better ask for the NT status too so we can translate it + * to a more Unix-like error. We hope that nothing clobbers the NT + * status in between the internal NtCreateFile() call and CreateFile() + * returning. + * + * If there's no O_CREAT flag, then we'll pretend the file is + * invisible. With O_CREAT, we have no choice but to report that + * there's a file in the way (which wouldn't happen on Unix). */ - if (err == ERROR_ACCESS_DENIED) + if (err == ERROR_ACCESS_DENIED && + pg_RtlGetLastNtStatus() == STATUS_DELETE_PENDING) { - if (loops < 10) - { - struct stat st; - - if (stat(fileName, &st) != 0) - { - pg_usleep(100000); - loops++; - continue; - } - } + if (fileFlags & O_CREAT) + err = ERROR_FILE_EXISTS; + else + err = ERROR_FILE_NOT_FOUND; } _dosmaperr(err); - return -1; + return INVALID_HANDLE_VALUE; } + return h; +} + +int +pgwin32_open(const char *fileName, int fileFlags,...) +{ + HANDLE h; + int fd; + + h = pgwin32_open_handle(fileName, fileFlags, false); + if (h == INVALID_HANDLE_VALUE) + return -1; + +#ifdef FRONTEND + + /* + * Since PostgreSQL 12, those concurrent-safe versions of open() and + * fopen() can be used by frontends, having as side-effect to switch the + * file-translation mode from O_TEXT to O_BINARY if none is specified. + * Caller may want to enforce the binary or text mode, but if nothing is + * defined make sure that the default mode maps with what versions older + * than 12 have been doing. + */ + if ((fileFlags & O_BINARY) == 0) + fileFlags |= O_TEXT; +#endif + /* _open_osfhandle will, on error, set errno accordingly */ if ((fd = _open_osfhandle((intptr_t) h, fileFlags & O_APPEND)) < 0) CloseHandle(h); /* will not affect errno */ diff --git a/third_party/spanner_pg/src/port/path.c b/third_party/spanner_pg/src/port/path.c index c39d4688..05fe812f 100644 --- a/third_party/spanner_pg/src/port/path.c +++ b/third_party/spanner_pg/src/port/path.c @@ -3,7 +3,7 @@ * path.c * portable path handling routines * - * 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 * * @@ -46,8 +46,9 @@ static void make_relative_path(char *ret_path, const char *target_path, const char *bin_path, const char *my_exec_path); -static void trim_directory(char *path); +static char *trim_directory(char *path); static void trim_trailing_separator(char *path); +static char *append_subdir_to_path(char *path, char *subdir); /* @@ -222,13 +223,9 @@ join_path_components(char *ret_path, strlcpy(ret_path, head, MAXPGPATH); /* - * Remove any leading "." in the tail component. - * - * Note: we used to try to remove ".." as well, but that's tricky to get - * right; now we just leave it to be done by canonicalize_path() later. + * We used to try to simplify some cases involving "." and "..", but now + * we just leave that to be done by canonicalize_path() later. */ - while (tail[0] == '.' && IS_DIR_SEP(tail[1])) - tail += 2; if (*tail) { @@ -241,14 +238,27 @@ join_path_components(char *ret_path, } +/* State-machine states for canonicalize_path */ +typedef enum +{ + ABSOLUTE_PATH_INIT, /* Just past the leading '/' (and Windows + * drive name if any) of an absolute path */ + ABSOLUTE_WITH_N_DEPTH, /* We collected 'pathdepth' directories in an + * absolute path */ + RELATIVE_PATH_INIT, /* At start of a relative path */ + RELATIVE_WITH_N_DEPTH, /* We collected 'pathdepth' directories in a + * relative path */ + RELATIVE_WITH_PARENT_REF /* Relative path containing only double-dots */ +} canonicalize_state; + /* * Clean up path by: * o make Win32 path use Unix slashes * o remove trailing quote on Win32 * o remove trailing slash - * o remove duplicate adjacent separators - * o remove trailing '.' - * o process trailing '..' ourselves + * o remove duplicate (adjacent) separators + * o remove '.' (unless path reduces to only '.') + * o process '..' ourselves, removing it if possible */ void canonicalize_path(char *path) @@ -256,8 +266,11 @@ canonicalize_path(char *path) char *p, *to_p; char *spath; + char *parsed; + char *unparse; bool was_sep = false; - int pending_strips; + canonicalize_state state; + int pathdepth = 0; /* counts collected regular directory names */ #ifdef WIN32 @@ -308,87 +321,194 @@ canonicalize_path(char *path) *to_p = '\0'; /* - * Remove any trailing uses of "." and process ".." ourselves + * Remove any uses of "." and process ".." ourselves * * Note that "/../.." should reduce to just "/", while "../.." has to be - * kept as-is. In the latter case we put back mistakenly trimmed ".." - * components below. Also note that we want a Windows drive spec to be - * visible to trim_directory(), but it's not part of the logic that's - * looking at the name components; hence distinction between path and - * spath. + * kept as-is. Also note that we want a Windows drive spec to be visible + * to trim_directory(), but it's not part of the logic that's looking at + * the name components; hence distinction between path and spath. + * + * This loop overwrites the path in-place. This is safe since we'll never + * make the path longer. "unparse" points to where we are reading the + * path, "parse" to where we are writing. */ spath = skip_drive(path); - pending_strips = 0; - for (;;) + if (*spath == '\0') + return; /* empty path is returned as-is */ + + if (*spath == '/') + { + state = ABSOLUTE_PATH_INIT; + /* Skip the leading slash for absolute path */ + parsed = unparse = (spath + 1); + } + else { - int len = strlen(spath); + state = RELATIVE_PATH_INIT; + parsed = unparse = spath; + } - if (len >= 2 && strcmp(spath + len - 2, "/.") == 0) - trim_directory(path); - else if (strcmp(spath, ".") == 0) + while (*unparse != '\0') + { + char *unparse_next; + bool is_double_dot; + + /* Split off this dir name, and set unparse_next to the next one */ + unparse_next = unparse; + while (*unparse_next && *unparse_next != '/') + unparse_next++; + if (*unparse_next != '\0') + *unparse_next++ = '\0'; + + /* Identify type of this dir name */ + if (strcmp(unparse, ".") == 0) { - /* Want to leave "." alone, but "./.." has to become ".." */ - if (pending_strips > 0) - *spath = '\0'; - break; + /* We can ignore "." components in all cases */ + unparse = unparse_next; + continue; } - else if ((len >= 3 && strcmp(spath + len - 3, "/..") == 0) || - strcmp(spath, "..") == 0) + + if (strcmp(unparse, "..") == 0) + is_double_dot = true; + else { - trim_directory(path); - pending_strips++; + /* adjacent separators were eliminated above */ + Assert(*unparse != '\0'); + is_double_dot = false; } - else if (pending_strips > 0 && *spath != '\0') + + switch (state) { - /* trim a regular directory name canceled by ".." */ - trim_directory(path); - pending_strips--; - /* foo/.. should become ".", not empty */ - if (*spath == '\0') - strcpy(spath, "."); + case ABSOLUTE_PATH_INIT: + /* We can ignore ".." immediately after / */ + if (!is_double_dot) + { + /* Append first dir name (we already have leading slash) */ + parsed = append_subdir_to_path(parsed, unparse); + state = ABSOLUTE_WITH_N_DEPTH; + pathdepth++; + } + break; + case ABSOLUTE_WITH_N_DEPTH: + if (is_double_dot) + { + /* Remove last parsed dir */ + /* (trim_directory won't remove the leading slash) */ + *parsed = '\0'; + parsed = trim_directory(path); + if (--pathdepth == 0) + state = ABSOLUTE_PATH_INIT; + } + else + { + /* Append normal dir */ + *parsed++ = '/'; + parsed = append_subdir_to_path(parsed, unparse); + pathdepth++; + } + break; + case RELATIVE_PATH_INIT: + if (is_double_dot) + { + /* Append irreducible double-dot (..) */ + parsed = append_subdir_to_path(parsed, unparse); + state = RELATIVE_WITH_PARENT_REF; + } + else + { + /* Append normal dir */ + parsed = append_subdir_to_path(parsed, unparse); + state = RELATIVE_WITH_N_DEPTH; + pathdepth++; + } + break; + case RELATIVE_WITH_N_DEPTH: + if (is_double_dot) + { + /* Remove last parsed dir */ + *parsed = '\0'; + parsed = trim_directory(path); + if (--pathdepth == 0) + { + /* + * If the output path is now empty, we're back to the + * INIT state. However, we could have processed a + * path like "../dir/.." and now be down to "..", in + * which case enter the correct state for that. + */ + if (parsed == spath) + state = RELATIVE_PATH_INIT; + else + state = RELATIVE_WITH_PARENT_REF; + } + } + else + { + /* Append normal dir */ + *parsed++ = '/'; + parsed = append_subdir_to_path(parsed, unparse); + pathdepth++; + } + break; + case RELATIVE_WITH_PARENT_REF: + if (is_double_dot) + { + /* Append next irreducible double-dot (..) */ + *parsed++ = '/'; + parsed = append_subdir_to_path(parsed, unparse); + } + else + { + /* Append normal dir */ + *parsed++ = '/'; + parsed = append_subdir_to_path(parsed, unparse); + + /* + * We can now start counting normal dirs. But if later + * double-dots make us remove this dir again, we'd better + * revert to RELATIVE_WITH_PARENT_REF not INIT state. + */ + state = RELATIVE_WITH_N_DEPTH; + pathdepth = 1; + } + break; } - else - break; - } - if (pending_strips > 0) - { - /* - * We could only get here if path is now totally empty (other than a - * possible drive specifier on Windows). We have to put back one or - * more ".."'s that we took off. - */ - while (--pending_strips > 0) - strcat(path, "../"); - strcat(path, ".."); + unparse = unparse_next; } + + /* + * If our output path is empty at this point, insert ".". We don't want + * to do this any earlier because it'd result in an extra dot in corner + * cases such as "../dir/..". Since we rejected the wholly-empty-path + * case above, there is certainly room. + */ + if (parsed == spath) + *parsed++ = '.'; + + /* And finally, ensure the output path is nul-terminated. */ + *parsed = '\0'; } /* * Detect whether a path contains any parent-directory references ("..") * * The input *must* have been put through canonicalize_path previously. - * - * This is a bit tricky because we mustn't be fooled by "..a.." (legal) - * nor "C:.." (legal on Unix but not Windows). */ bool path_contains_parent_reference(const char *path) { - int path_len; - - path = skip_drive(path); /* C: shouldn't affect our conclusion */ - - path_len = strlen(path); - /* - * ".." could be the whole path; otherwise, if it's present it must be at - * the beginning, in the middle, or at the end. + * Once canonicalized, an absolute path cannot contain any ".." at all, + * while a relative path could contain ".."(s) only at the start. So it + * is sufficient to check the start of the path, after skipping any + * Windows drive/network specifier. */ - if (strcmp(path, "..") == 0 || - strncmp(path, "../", 3) == 0 || - strstr(path, "/../") != NULL || - (path_len >= 3 && strcmp(path + path_len - 3, "/..") == 0)) + path = skip_drive(path); /* C: shouldn't affect our conclusion */ + + if (path[0] == '.' && + path[1] == '.' && + (path[2] == '\0' || path[2] == '/')) return true; return false; @@ -396,10 +516,11 @@ path_contains_parent_reference(const char *path) /* * Detect whether a path is only in or below the current working directory. + * + * The input *must* have been put through canonicalize_path previously. + * * An absolute path that matches the current working directory should - * return false (we only want relative to the cwd). We don't allow - * "/../" even if that would keep us under the cwd (it is too hard to - * track that). + * return false (we only want relative to the cwd). */ bool path_is_relative_and_below_cwd(const char *path) @@ -807,14 +928,16 @@ bool get_home_path(char *ret_path) { #ifndef WIN32 - char pwdbuf[BUFSIZ]; - struct passwd pwdstr; - struct passwd *pwd = NULL; + /* + * We first consult $HOME. If that's unset, try to get the info from + * . + */ + const char *home; - (void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd); - if (pwd == NULL) - return false; - strlcpy(ret_path, pwd->pw_dir, MAXPGPATH); + home = getenv("HOME"); + if (home == NULL || home[0] == '\0') + return pg_get_user_home_dir(geteuid(), ret_path, MAXPGPATH); + strlcpy(ret_path, home, MAXPGPATH); return true; #else char *tmppath; @@ -863,8 +986,11 @@ get_parent_directory(char *path) * Trim trailing directory from path, that is, remove any trailing slashes, * the last pathname component, and the slash just ahead of it --- but never * remove a leading slash. + * + * For the convenience of canonicalize_path, the path's new end location + * is returned. */ -static void +static char * trim_directory(char *path) { char *p; @@ -872,7 +998,7 @@ trim_directory(char *path) path = skip_drive(path); if (path[0] == '\0') - return; + return path; /* back up over trailing slash(es) */ for (p = path + strlen(path) - 1; IS_DIR_SEP(*p) && p > path; p--) @@ -887,6 +1013,7 @@ trim_directory(char *path) if (p == path && IS_DIR_SEP(*p)) p++; *p = '\0'; + return p; } @@ -906,3 +1033,25 @@ trim_trailing_separator(char *path) for (p--; p > path && IS_DIR_SEP(*p); p--) *p = '\0'; } + +/* + * append_subdir_to_path + * + * Append the currently-considered subdirectory name to the output + * path in canonicalize_path. Return the new end location of the + * output path. + * + * Since canonicalize_path updates the path in-place, we must use + * memmove not memcpy, and we don't yet terminate the path with '\0'. + */ +static char * +append_subdir_to_path(char *path, char *subdir) +{ + size_t len = strlen(subdir); + + /* No need to copy data if path and subdir are the same. */ + if (path != subdir) + memmove(path, subdir, len); + + return path + len; +} diff --git a/third_party/spanner_pg/src/port/pg_bitutils.c b/third_party/spanner_pg/src/port/pg_bitutils.c index 22520218..61d5e5d9 100644 --- a/third_party/spanner_pg/src/port/pg_bitutils.c +++ b/third_party/spanner_pg/src/port/pg_bitutils.c @@ -3,7 +3,7 @@ * pg_bitutils.c * Miscellaneous functions for bit-wise operations. * - * Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Copyright (c) 2019-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pg_bitutils.c @@ -103,37 +103,21 @@ const uint8 pg_number_of_ones[256] = { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; -/* - * On x86_64, we can use the hardware popcount instruction, but only if - * we can verify that the CPU supports it via the cpuid instruction. - * - * Otherwise, we fall back to __builtin_popcount if the compiler has that, - * or a hand-rolled implementation if not. - */ -#ifdef HAVE_X86_64_POPCNTQ -#if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID) -#define USE_POPCNT_ASM 1 -#endif -#endif - static int pg_popcount32_slow(uint32 word); static int pg_popcount64_slow(uint64 word); -#ifdef USE_POPCNT_ASM +#ifdef TRY_POPCNT_FAST static bool pg_popcount_available(void); static int pg_popcount32_choose(uint32 word); static int pg_popcount64_choose(uint64 word); -static int pg_popcount32_asm(uint32 word); -static int pg_popcount64_asm(uint64 word); +static int pg_popcount32_fast(uint32 word); +static int pg_popcount64_fast(uint64 word); int (*pg_popcount32) (uint32 word) = pg_popcount32_choose; int (*pg_popcount64) (uint64 word) = pg_popcount64_choose; -#else -int (*pg_popcount32) (uint32 word) = pg_popcount32_slow; -int (*pg_popcount64) (uint64 word) = pg_popcount64_slow; -#endif /* USE_POPCNT_ASM */ +#endif /* TRY_POPCNT_FAST */ -#ifdef USE_POPCNT_ASM +#ifdef TRY_POPCNT_FAST /* * Return true if CPUID indicates that the POPCNT instruction is available. @@ -165,8 +149,8 @@ pg_popcount32_choose(uint32 word) { if (pg_popcount_available()) { - pg_popcount32 = pg_popcount32_asm; - pg_popcount64 = pg_popcount64_asm; + pg_popcount32 = pg_popcount32_fast; + pg_popcount64 = pg_popcount64_fast; } else { @@ -182,8 +166,8 @@ pg_popcount64_choose(uint64 word) { if (pg_popcount_available()) { - pg_popcount32 = pg_popcount32_asm; - pg_popcount64 = pg_popcount64_asm; + pg_popcount32 = pg_popcount32_fast; + pg_popcount64 = pg_popcount64_fast; } else { @@ -195,32 +179,40 @@ pg_popcount64_choose(uint64 word) } /* - * pg_popcount32_asm + * pg_popcount32_fast * Return the number of 1 bits set in word */ static int -pg_popcount32_asm(uint32 word) +pg_popcount32_fast(uint32 word) { +#ifdef _MSC_VER + return __popcnt(word); +#else uint32 res; __asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc"); return (int) res; +#endif } /* - * pg_popcount64_asm + * pg_popcount64_fast * Return the number of 1 bits set in word */ static int -pg_popcount64_asm(uint64 word) +pg_popcount64_fast(uint64 word) { +#ifdef _MSC_VER + return __popcnt64(word); +#else uint64 res; __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc"); return (int) res; +#endif } -#endif /* USE_POPCNT_ASM */ +#endif /* TRY_POPCNT_FAST */ /* @@ -273,6 +265,28 @@ pg_popcount64_slow(uint64 word) #endif /* HAVE__BUILTIN_POPCOUNT */ } +#ifndef TRY_POPCNT_FAST + +/* + * When the POPCNT instruction is not available, there's no point in using + * function pointers to vary the implementation between the fast and slow + * method. We instead just make these actual external functions when + * TRY_POPCNT_FAST is not defined. The compiler should be able to inline + * the slow versions here. + */ +int +pg_popcount32(uint32 word) +{ + return pg_popcount32_slow(word); +} + +int +pg_popcount64(uint64 word) +{ + return pg_popcount64_slow(word); +} + +#endif /* !TRY_POPCNT_FAST */ /* * pg_popcount diff --git a/third_party/spanner_pg/src/port/pg_crc32c_armv8.c b/third_party/spanner_pg/src/port/pg_crc32c_armv8.c index 9a6517c9..9e301f96 100644 --- a/third_party/spanner_pg/src/port/pg_crc32c_armv8.c +++ b/third_party/spanner_pg/src/port/pg_crc32c_armv8.c @@ -3,7 +3,7 @@ * pg_crc32c_armv8.c * Compute CRC-32C checksum using ARMv8 CRC Extension instructions * - * 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/third_party/spanner_pg/src/port/pg_crc32c_armv8_choose.c b/third_party/spanner_pg/src/port/pg_crc32c_armv8_choose.c index ac8dcf6d..6443e6a6 100644 --- a/third_party/spanner_pg/src/port/pg_crc32c_armv8_choose.c +++ b/third_party/spanner_pg/src/port/pg_crc32c_armv8_choose.c @@ -8,7 +8,7 @@ * computation. Otherwise, fall back to the pure software implementation * (slicing-by-8). * - * 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/third_party/spanner_pg/src/port/pg_crc32c_sb8.c b/third_party/spanner_pg/src/port/pg_crc32c_sb8.c index 98da86cd..b3f579fc 100644 --- a/third_party/spanner_pg/src/port/pg_crc32c_sb8.c +++ b/third_party/spanner_pg/src/port/pg_crc32c_sb8.c @@ -8,7 +8,7 @@ * Generation", IEEE Transactions on Computers, vol.57, no. 11, * pp. 1550-1560, November 2008, doi:10.1109/TC.2008.85 * - * 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/third_party/spanner_pg/src/port/pg_crc32c_sse42.c b/third_party/spanner_pg/src/port/pg_crc32c_sse42.c index 10fc01e1..627ed335 100644 --- a/third_party/spanner_pg/src/port/pg_crc32c_sse42.c +++ b/third_party/spanner_pg/src/port/pg_crc32c_sse42.c @@ -3,7 +3,7 @@ * pg_crc32c_sse42.c * Compute CRC-32C checksum using Intel SSE 4.2 instructions. * - * 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/third_party/spanner_pg/src/port/pg_crc32c_sse42_choose.c b/third_party/spanner_pg/src/port/pg_crc32c_sse42_choose.c index 0608e020..85788c30 100644 --- a/third_party/spanner_pg/src/port/pg_crc32c_sse42_choose.c +++ b/third_party/spanner_pg/src/port/pg_crc32c_sse42_choose.c @@ -8,7 +8,7 @@ * computation. Otherwise, fall back to the pure software implementation * (slicing-by-8). * - * 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/third_party/spanner_pg/src/port/pg_strong_random.c b/third_party/spanner_pg/src/port/pg_strong_random.c index 07f24c00..be589c9d 100644 --- a/third_party/spanner_pg/src/port/pg_strong_random.c +++ b/third_party/spanner_pg/src/port/pg_strong_random.c @@ -10,7 +10,7 @@ * therefore, even when built for backend, it cannot rely on backend * infrastructure such as elog() or palloc(). * - * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pg_strong_random.c diff --git a/third_party/spanner_pg/src/port/pgcheckdir.c b/third_party/spanner_pg/src/port/pgcheckdir.c index 9fb2f23b..6c09cf29 100644 --- a/third_party/spanner_pg/src/port/pgcheckdir.c +++ b/third_party/spanner_pg/src/port/pgcheckdir.c @@ -1,13 +1,15 @@ /*------------------------------------------------------------------------- * - * src/port/pgcheckdir.c + * pgcheckdir.c * * A simple subroutine to check whether a directory exists and is empty or not. * Useful in both initdb and the backend. * - * 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 * + * IDENTIFICATION + * src/port/pgcheckdir.c *------------------------------------------------------------------------- */ diff --git a/third_party/spanner_pg/src/port/pgsleep.c b/third_party/spanner_pg/src/port/pgsleep.c index d6d51363..a84e6ccb 100644 --- a/third_party/spanner_pg/src/port/pgsleep.c +++ b/third_party/spanner_pg/src/port/pgsleep.c @@ -4,7 +4,7 @@ * Portable delay handling. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/port/pgsleep.c * diff --git a/third_party/spanner_pg/src/port/pgstrcasecmp.c b/third_party/spanner_pg/src/port/pgstrcasecmp.c index 98e1aedf..fc7ee91e 100644 --- a/third_party/spanner_pg/src/port/pgstrcasecmp.c +++ b/third_party/spanner_pg/src/port/pgstrcasecmp.c @@ -18,7 +18,7 @@ * C library thinks the locale is. * * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/port/pgstrcasecmp.c * diff --git a/third_party/spanner_pg/src/port/pgstrsignal.c b/third_party/spanner_pg/src/port/pgstrsignal.c index 0f3b5da0..3094e2aa 100644 --- a/third_party/spanner_pg/src/port/pgstrsignal.c +++ b/third_party/spanner_pg/src/port/pgstrsignal.c @@ -9,7 +9,7 @@ * This file is not currently built in MSVC builds, since it's useless * on non-Unix platforms. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/pqsignal.c b/third_party/spanner_pg/src/port/pqsignal.c index a373b480..6cb0320e 100644 --- a/third_party/spanner_pg/src/port/pqsignal.c +++ b/third_party/spanner_pg/src/port/pqsignal.c @@ -4,7 +4,7 @@ * reliable BSD-style signal(2) routine stolen from RWW who stole it * from Stevens... * - * 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/third_party/spanner_pg/src/port/pread.c b/third_party/spanner_pg/src/port/pread.c index a35d3f4b..bbf12ee0 100644 --- a/third_party/spanner_pg/src/port/pread.c +++ b/third_party/spanner_pg/src/port/pread.c @@ -3,7 +3,7 @@ * pread.c * Implementation of pread(2) for platforms that lack one. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pread.c diff --git a/third_party/spanner_pg/src/port/preadv.c b/third_party/spanner_pg/src/port/preadv.c index d83dab67..dcc7fe0d 100644 --- a/third_party/spanner_pg/src/port/preadv.c +++ b/third_party/spanner_pg/src/port/preadv.c @@ -3,7 +3,7 @@ * preadv.c * Implementation of preadv(2) for platforms that lack one. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/preadv.c diff --git a/third_party/spanner_pg/src/port/pthread_barrier_wait.c b/third_party/spanner_pg/src/port/pthread_barrier_wait.c index 8282cc5b..9e59b3f6 100644 --- a/third_party/spanner_pg/src/port/pthread_barrier_wait.c +++ b/third_party/spanner_pg/src/port/pthread_barrier_wait.c @@ -3,7 +3,7 @@ * pthread_barrier_wait.c * Implementation of pthread_barrier_t support for platforms lacking it. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pthread_barrier_wait.c diff --git a/third_party/spanner_pg/src/port/pwrite.c b/third_party/spanner_pg/src/port/pwrite.c index e3a132aa..cadecc48 100644 --- a/third_party/spanner_pg/src/port/pwrite.c +++ b/third_party/spanner_pg/src/port/pwrite.c @@ -3,7 +3,7 @@ * pwrite.c * Implementation of pwrite(2) for platforms that lack one. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pwrite.c diff --git a/third_party/spanner_pg/src/port/pwritev.c b/third_party/spanner_pg/src/port/pwritev.c index 082bed9a..bc53704e 100644 --- a/third_party/spanner_pg/src/port/pwritev.c +++ b/third_party/spanner_pg/src/port/pwritev.c @@ -3,7 +3,7 @@ * pwritev.c * Implementation of pwritev(2) for platforms that lack one. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pwritev.c diff --git a/third_party/spanner_pg/src/port/quotes.c b/third_party/spanner_pg/src/port/quotes.c index 63a219f5..d90a4567 100644 --- a/third_party/spanner_pg/src/port/quotes.c +++ b/third_party/spanner_pg/src/port/quotes.c @@ -3,7 +3,7 @@ * quotes.c * string quoting and escaping functions * - * 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/third_party/spanner_pg/src/port/random.c b/third_party/spanner_pg/src/port/random.c deleted file mode 100644 index 2dd59a08..00000000 --- a/third_party/spanner_pg/src/port/random.c +++ /dev/null @@ -1,25 +0,0 @@ -/*------------------------------------------------------------------------- - * - * random.c - * random() wrapper - * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * src/port/random.c - * - *------------------------------------------------------------------------- - */ - -#include "c.h" - -#include - - -long -random(void) -{ - return pg_lrand48(); -} diff --git a/third_party/spanner_pg/src/port/setenv.c b/third_party/spanner_pg/src/port/setenv.c index 440bc832..d13c8824 100644 --- a/third_party/spanner_pg/src/port/setenv.c +++ b/third_party/spanner_pg/src/port/setenv.c @@ -3,7 +3,7 @@ * setenv.c * setenv() emulation for machines without it * - * 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/third_party/spanner_pg/src/port/snprintf.c b/third_party/spanner_pg/src/port/snprintf.c index 8306ab4f..b8e2b0e7 100644 --- a/third_party/spanner_pg/src/port/snprintf.c +++ b/third_party/spanner_pg/src/port/snprintf.c @@ -2,7 +2,7 @@ * Copyright (c) 1983, 1995, 1996 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -1025,8 +1025,8 @@ fmtint(long long value, char type, int forcesign, int leftjust, int minlen, int zpad, int precision, int pointflag, PrintfTarget *target) { - unsigned long long base; unsigned long long uvalue; + int base; int dosign; const char *cvt = "0123456789abcdef"; int signvalue = 0; @@ -1085,12 +1085,36 @@ fmtint(long long value, char type, int forcesign, int leftjust, vallen = 0; else { - /* make integer string */ - do + /* + * Convert integer to string. We special-case each of the possible + * base values so as to avoid general-purpose divisions. On most + * machines, division by a fixed constant can be done much more + * cheaply than a general divide. + */ + if (base == 10) + { + do + { + convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 10]; + uvalue = uvalue / 10; + } while (uvalue); + } + else if (base == 16) { - convert[sizeof(convert) - (++vallen)] = cvt[uvalue % base]; - uvalue = uvalue / base; - } while (uvalue); + do + { + convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 16]; + uvalue = uvalue / 16; + } while (uvalue); + } + else /* base == 8 */ + { + do + { + convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 8]; + uvalue = uvalue / 8; + } while (uvalue); + } } zeropad = Max(0, precision - vallen); diff --git a/third_party/spanner_pg/src/port/srandom.c b/third_party/spanner_pg/src/port/srandom.c deleted file mode 100644 index cf1007b2..00000000 --- a/third_party/spanner_pg/src/port/srandom.c +++ /dev/null @@ -1,25 +0,0 @@ -/*------------------------------------------------------------------------- - * - * srandom.c - * srandom() wrapper - * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * src/port/srandom.c - * - *------------------------------------------------------------------------- - */ - -#include "c.h" - -#include - - -void -srandom(unsigned int seed) -{ - pg_srand48((long int) seed); -} diff --git a/third_party/spanner_pg/src/port/strerror.c b/third_party/spanner_pg/src/port/strerror.c index c07c983e..e47bbd00 100644 --- a/third_party/spanner_pg/src/port/strerror.c +++ b/third_party/spanner_pg/src/port/strerror.c @@ -3,7 +3,7 @@ * strerror.c * Replacements for standard strerror() and strerror_r() functions * - * 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 * * @@ -250,10 +250,8 @@ get_errno_symbol(int errnum) #endif case ESRCH: return "ESRCH"; -#ifdef ETIMEDOUT case ETIMEDOUT: return "ETIMEDOUT"; -#endif #ifdef ETXTBSY case ETXTBSY: return "ETXTBSY"; diff --git a/third_party/spanner_pg/src/port/strlcpy.c b/third_party/spanner_pg/src/port/strlcpy.c index b8cc887b..9dce3f51 100644 --- a/third_party/spanner_pg/src/port/strlcpy.c +++ b/third_party/spanner_pg/src/port/strlcpy.c @@ -3,7 +3,7 @@ * strlcpy.c * strncpy done right * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/strnlen.c b/third_party/spanner_pg/src/port/strnlen.c index cdc4b64b..27dec18e 100644 --- a/third_party/spanner_pg/src/port/strnlen.c +++ b/third_party/spanner_pg/src/port/strnlen.c @@ -4,7 +4,7 @@ * Fallback implementation of strnlen(). * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/strtof.c b/third_party/spanner_pg/src/port/strtof.c index 92bddfba..7da05be6 100644 --- a/third_party/spanner_pg/src/port/strtof.c +++ b/third_party/spanner_pg/src/port/strtof.c @@ -2,7 +2,7 @@ * * strtof.c * - * Portions Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 2019-2022, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/port/system.c b/third_party/spanner_pg/src/port/system.c index 8618e47f..20a830fd 100644 --- a/third_party/spanner_pg/src/port/system.c +++ b/third_party/spanner_pg/src/port/system.c @@ -29,7 +29,7 @@ * quote character on the command line, preserving any text after the last * quote character. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/port/system.c * diff --git a/third_party/spanner_pg/src/port/thread.c b/third_party/spanner_pg/src/port/thread.c index 1f3bcbd1..23c3fbdf 100644 --- a/third_party/spanner_pg/src/port/thread.c +++ b/third_party/spanner_pg/src/port/thread.c @@ -5,7 +5,7 @@ * Prototypes and macros around system calls, used to help make * threaded libraries reentrant and safe to use from threaded applications. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * src/port/thread.c * @@ -45,10 +45,9 @@ * use *_r function names if they exit * (*_THREADSAFE=yes) * use non-*_r functions if they are thread-safe - * - * One thread-safe solution for gethostbyname() might be to use getaddrinfo(). */ +#ifndef WIN32 /* * Wrapper around getpwuid() or getpwuid_r() to mimic POSIX getpwuid_r() @@ -60,8 +59,7 @@ * error during lookup: returns an errno code, *result is NULL * (caller should *not* assume that the errno variable is set) */ -#ifndef WIN32 -int +static int pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) { @@ -75,42 +73,74 @@ pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer, return (*result == NULL) ? errno : 0; #endif } -#endif /* - * Wrapper around gethostbyname() or gethostbyname_r() to mimic - * POSIX gethostbyname_r() behaviour, if it is not available or required. - * This function is called _only_ by our getaddrinfo() portability function. + * pg_get_user_name - get the name of the user with the given ID + * + * On success, the user name is returned into the buffer (of size buflen), + * and "true" is returned. On failure, a localized error message is + * returned into the buffer, and "false" is returned. */ -#ifndef HAVE_GETADDRINFO -int -pqGethostbyname(const char *name, - struct hostent *resultbuf, - char *buffer, size_t buflen, - struct hostent **result, - int *herrno) +bool +pg_get_user_name(uid_t user_id, char *buffer, size_t buflen) { -#if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETHOSTBYNAME_R) - - /* - * broken (well early POSIX draft) gethostbyname_r() which returns 'struct - * hostent *' - */ - *result = gethostbyname_r(name, resultbuf, buffer, buflen, herrno); - return (*result == NULL) ? -1 : 0; -#else + char pwdbuf[BUFSIZ]; + struct passwd pwdstr; + struct passwd *pw = NULL; + int pwerr; - /* no gethostbyname_r(), just use gethostbyname() */ - *result = gethostbyname(name); + pwerr = pqGetpwuid(user_id, &pwdstr, pwdbuf, sizeof(pwdbuf), &pw); + if (pw != NULL) + { + strlcpy(buffer, pw->pw_name, buflen); + return true; + } + if (pwerr != 0) + snprintf(buffer, buflen, + _("could not look up local user ID %d: %s"), + (int) user_id, + strerror_r(pwerr, pwdbuf, sizeof(pwdbuf))); + else + snprintf(buffer, buflen, + _("local user with ID %d does not exist"), + (int) user_id); + return false; +} - if (*result != NULL) - *herrno = h_errno; +/* + * pg_get_user_home_dir - get the home directory of the user with the given ID + * + * On success, the directory path is returned into the buffer (of size buflen), + * and "true" is returned. On failure, a localized error message is + * returned into the buffer, and "false" is returned. + * + * Note that this does not incorporate the common behavior of checking + * $HOME first, since it's independent of which user_id is queried. + */ +bool +pg_get_user_home_dir(uid_t user_id, char *buffer, size_t buflen) +{ + char pwdbuf[BUFSIZ]; + struct passwd pwdstr; + struct passwd *pw = NULL; + int pwerr; - if (*result != NULL) - return 0; + pwerr = pqGetpwuid(user_id, &pwdstr, pwdbuf, sizeof(pwdbuf), &pw); + if (pw != NULL) + { + strlcpy(buffer, pw->pw_dir, buflen); + return true; + } + if (pwerr != 0) + snprintf(buffer, buflen, + _("could not look up local user ID %d: %s"), + (int) user_id, + strerror_r(pwerr, pwdbuf, sizeof(pwdbuf))); else - return -1; -#endif + snprintf(buffer, buflen, + _("local user with ID %d does not exist"), + (int) user_id); + return false; } -#endif +#endif /* !WIN32 */ diff --git a/third_party/spanner_pg/src/port/unsetenv.c b/third_party/spanner_pg/src/port/unsetenv.c index b65f3521..62b806d7 100644 --- a/third_party/spanner_pg/src/port/unsetenv.c +++ b/third_party/spanner_pg/src/port/unsetenv.c @@ -3,7 +3,7 @@ * unsetenv.c * unsetenv() emulation for machines without it * - * 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/third_party/spanner_pg/src/port/win32env.c b/third_party/spanner_pg/src/port/win32env.c index a0355607..7aa5a308 100644 --- a/third_party/spanner_pg/src/port/win32env.c +++ b/third_party/spanner_pg/src/port/win32env.c @@ -6,7 +6,7 @@ * These functions update both the process environment and caches in * (potentially multiple) C run-time library (CRT) versions. * - * 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/third_party/spanner_pg/src/port/win32error.c b/third_party/spanner_pg/src/port/win32error.c index 0e5f91ad..fca867ba 100644 --- a/third_party/spanner_pg/src/port/win32error.c +++ b/third_party/spanner_pg/src/port/win32error.c @@ -3,7 +3,7 @@ * win32error.c * Map win32 error codes to errno values * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32error.c diff --git a/third_party/spanner_pg/src/port/win32ntdll.c b/third_party/spanner_pg/src/port/win32ntdll.c new file mode 100644 index 00000000..10c33c6a --- /dev/null +++ b/third_party/spanner_pg/src/port/win32ntdll.c @@ -0,0 +1,69 @@ +/*------------------------------------------------------------------------- + * + * win32ntdll.c + * Dynamically loaded Windows NT functions. + * + * Portions Copyright (c) 2021-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/port/win32ntdll.c + * + *------------------------------------------------------------------------- + */ + +#define UMDF_USING_NTSTATUS + +#include "c.h" + +#include "port/win32ntdll.h" + +RtlGetLastNtStatus_t pg_RtlGetLastNtStatus; + +typedef struct NtDllRoutine +{ + const char *name; + pg_funcptr_t *address; +} NtDllRoutine; + +static const NtDllRoutine routines[] = { + {"RtlGetLastNtStatus", (pg_funcptr_t *) &pg_RtlGetLastNtStatus} +}; + +static bool initialized; + +int +initialize_ntdll(void) +{ + HMODULE module; + + if (initialized) + return 0; + + if (!(module = LoadLibraryEx("ntdll.dll", NULL, 0))) + { + _dosmaperr(GetLastError()); + return -1; + } + + for (int i = 0; i < lengthof(routines); ++i) + { + pg_funcptr_t address; + + address = (pg_funcptr_t) GetProcAddress(module, routines[i].name); + if (!address) + { + _dosmaperr(GetLastError()); + FreeLibrary(module); + + return -1; + } + + *(pg_funcptr_t *) routines[i].address = address; + } + + initialized = true; + + return 0; +} diff --git a/third_party/spanner_pg/src/port/win32security.c b/third_party/spanner_pg/src/port/win32security.c index 4a673fde..1235199f 100644 --- a/third_party/spanner_pg/src/port/win32security.c +++ b/third_party/spanner_pg/src/port/win32security.c @@ -3,7 +3,7 @@ * win32security.c * Microsoft Windows Win32 Security Support Functions * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32security.c @@ -95,8 +95,11 @@ pgwin32_is_admin(void) * We consider ourselves running as a service if one of the following is * true: * - * 1) We are running as LocalSystem (only used by services) - * 2) Our token contains SECURITY_SERVICE_RID (automatically added to the + * 1) Standard error is not valid (always the case for services, and pg_ctl + * running as a service "passes" that down to postgres, + * c.f. CreateRestrictedProcess()) + * 2) We are running as LocalSystem (only used by services) + * 3) Our token contains SECURITY_SERVICE_RID (automatically added to the * process token by the SCM when starting a service) * * The check for LocalSystem is needed, because surprisingly, if a service @@ -121,12 +124,21 @@ pgwin32_is_service(void) PSID ServiceSid; PSID LocalSystemSid; SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; + HANDLE stderr_handle; /* Only check the first time */ if (_is_service != -1) return _is_service; - /* First check for LocalSystem */ + /* Check if standard error is not valid */ + stderr_handle = GetStdHandle(STD_ERROR_HANDLE); + if (stderr_handle != INVALID_HANDLE_VALUE && stderr_handle != NULL) + { + _is_service = 0; + return _is_service; + } + + /* Check if running as LocalSystem */ if (!AllocateAndInitializeSid(&NtAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &LocalSystemSid)) diff --git a/third_party/spanner_pg/src/port/win32setlocale.c b/third_party/spanner_pg/src/port/win32setlocale.c index 4edae05b..aadd09a4 100644 --- a/third_party/spanner_pg/src/port/win32setlocale.c +++ b/third_party/spanner_pg/src/port/win32setlocale.c @@ -3,7 +3,7 @@ * win32setlocale.c * Wrapper to work around bugs in Windows setlocale() implementation * - * Copyright (c) 2011-2021, PostgreSQL Global Development Group + * Copyright (c) 2011-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32setlocale.c diff --git a/third_party/spanner_pg/src/port/win32stat.c b/third_party/spanner_pg/src/port/win32stat.c index acbf4c7e..e25811d2 100644 --- a/third_party/spanner_pg/src/port/win32stat.c +++ b/third_party/spanner_pg/src/port/win32stat.c @@ -3,7 +3,7 @@ * win32stat.c * Replacements for functions using GetFileInformationByHandle * - * 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 * * @@ -18,53 +18,6 @@ #include "c.h" #include -/* - * In order to support MinGW and MSVC2013 we use NtQueryInformationFile as an - * alternative for GetFileInformationByHandleEx. It is loaded from the ntdll - * library. - */ -#if _WIN32_WINNT < 0x0600 -#include - -#if !defined(__MINGW32__) && !defined(__MINGW64__) -/* MinGW includes this in , but it is missing in MSVC */ -typedef struct _FILE_STANDARD_INFORMATION -{ - LARGE_INTEGER AllocationSize; - LARGE_INTEGER EndOfFile; - ULONG NumberOfLinks; - BOOLEAN DeletePending; - BOOLEAN Directory; -} FILE_STANDARD_INFORMATION; -#define FileStandardInformation 5 -#endif /* !defined(__MINGW32__) && - * !defined(__MINGW64__) */ - -typedef NTSTATUS (NTAPI * PFN_NTQUERYINFORMATIONFILE) - (IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); - -static PFN_NTQUERYINFORMATIONFILE _NtQueryInformationFile = NULL; - -static HMODULE ntdll = NULL; - -/* - * Load DLL file just once regardless of how many functions we load/call in it. - */ -static void -LoadNtdll(void) -{ - if (ntdll != NULL) - return; - ntdll = LoadLibraryEx("ntdll.dll", NULL, 0); -} - -#endif /* _WIN32_WINNT < 0x0600 */ - - /* * Convert a FILETIME struct into a 64 bit time_t. */ @@ -162,120 +115,18 @@ int _pgstat64(const char *name, struct stat *buf) { /* - * We must use a handle so lstat() returns the information of the target - * file. To have a reliable test for ERROR_DELETE_PENDING, we use - * NtQueryInformationFile from Windows 2000 or - * GetFileInformationByHandleEx from Server 2008 / Vista. + * Our open wrapper will report STATUS_DELETE_PENDING as ENOENT. We + * request FILE_FLAG_BACKUP_SEMANTICS so that we can open directories too, + * for limited purposes. We use the private handle-based version, so we + * don't risk running out of fds. */ - SECURITY_ATTRIBUTES sa; HANDLE hFile; int ret; -#if _WIN32_WINNT < 0x0600 - IO_STATUS_BLOCK ioStatus; - FILE_STANDARD_INFORMATION standardInfo; -#else - FILE_STANDARD_INFO standardInfo; -#endif - - if (name == NULL || buf == NULL) - { - errno = EINVAL; - return -1; - } - /* fast not-exists check */ - if (GetFileAttributes(name) == INVALID_FILE_ATTRIBUTES) - { - _dosmaperr(GetLastError()); - return -1; - } - - /* get a file handle as lightweight as we can */ - sa.nLength = sizeof(SECURITY_ATTRIBUTES); - sa.bInheritHandle = TRUE; - sa.lpSecurityDescriptor = NULL; - hFile = CreateFile(name, - GENERIC_READ, - (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), - &sa, - OPEN_EXISTING, - (FILE_FLAG_NO_BUFFERING | FILE_FLAG_BACKUP_SEMANTICS | - FILE_FLAG_OVERLAPPED), - NULL); + hFile = pgwin32_open_handle(name, O_RDONLY, true); if (hFile == INVALID_HANDLE_VALUE) - { - DWORD err = GetLastError(); - - CloseHandle(hFile); - _dosmaperr(err); return -1; - } - - memset(&standardInfo, 0, sizeof(standardInfo)); - -#if _WIN32_WINNT < 0x0600 - if (_NtQueryInformationFile == NULL) - { - /* First time through: load ntdll.dll and find NtQueryInformationFile */ - LoadNtdll(); - if (ntdll == NULL) - { - DWORD err = GetLastError(); - - CloseHandle(hFile); - _dosmaperr(err); - return -1; - } - - _NtQueryInformationFile = (PFN_NTQUERYINFORMATIONFILE) (pg_funcptr_t) - GetProcAddress(ntdll, "NtQueryInformationFile"); - if (_NtQueryInformationFile == NULL) - { - DWORD err = GetLastError(); - - CloseHandle(hFile); - _dosmaperr(err); - return -1; - } - } - - if (!NT_SUCCESS(_NtQueryInformationFile(hFile, &ioStatus, &standardInfo, - sizeof(standardInfo), - FileStandardInformation))) - { - DWORD err = GetLastError(); - - CloseHandle(hFile); - _dosmaperr(err); - return -1; - } -#else - if (!GetFileInformationByHandleEx(hFile, FileStandardInfo, &standardInfo, - sizeof(standardInfo))) - { - DWORD err = GetLastError(); - - CloseHandle(hFile); - _dosmaperr(err); - return -1; - } -#endif /* _WIN32_WINNT < 0x0600 */ - - if (standardInfo.DeletePending) - { - /* - * File has been deleted, but is not gone from the filesystem yet. - * This can happen when some process with FILE_SHARE_DELETE has it - * open, and it will be fully removed once that handle is closed. - * Meanwhile, we can't open it, so indicate that the file just doesn't - * exist. - */ - CloseHandle(hFile); - errno = ENOENT; - return -1; - } - /* At last we can invoke fileinfo_to_stat */ ret = fileinfo_to_stat(hFile, buf); CloseHandle(hFile); diff --git a/third_party/spanner_pg/src/port/win32ver.rc b/third_party/spanner_pg/src/port/win32ver.rc index 94fb7794..5410aa27 100644 --- a/third_party/spanner_pg/src/port/win32ver.rc +++ b/third_party/spanner_pg/src/port/win32ver.rc @@ -20,7 +20,7 @@ BEGIN VALUE "FileDescription", FILEDESC VALUE "FileVersion", PG_VERSION VALUE "InternalName", _INTERNAL_NAME_ - VALUE "LegalCopyright", "Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California." + VALUE "LegalCopyright", "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California." VALUE "OriginalFileName", _ORIGINAL_NAME_ VALUE "ProductName", "PostgreSQL" VALUE "ProductVersion", PG_VERSION diff --git a/third_party/spanner_pg/src/template/cygwin b/third_party/spanner_pg/src/template/cygwin index 1e7274bc..3f42e2f8 100644 --- a/third_party/spanner_pg/src/template/cygwin +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/template/hpux b/third_party/spanner_pg/src/template/hpux index 50fff80c..5105a74c 100644 --- a/third_party/spanner_pg/src/template/hpux +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/template/win32 b/third_party/spanner_pg/src/template/win32 index 1380d165..1895f067 100644 --- a/third_party/spanner_pg/src/template/win32 +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/Makefile b/third_party/spanner_pg/src/test/Makefile index 46275915..69ef074d 100644 --- a/third_party/spanner_pg/src/test/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/authentication/Makefile b/third_party/spanner_pg/src/test/authentication/Makefile index 9aa331e9..dca2ce7e 100644 --- a/third_party/spanner_pg/src/test/authentication/Makefile +++ b/third_party/spanner_pg/src/test/authentication/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/authentication # -# 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 # # src/test/authentication/Makefile diff --git a/third_party/spanner_pg/src/test/authentication/README b/third_party/spanner_pg/src/test/authentication/README index a8f27bfd..602280a0 100644 --- a/third_party/spanner_pg/src/test/authentication/README +++ b/third_party/spanner_pg/src/test/authentication/README @@ -24,3 +24,5 @@ sources and then tested. Either way, this test initializes, starts, and stops a test Postgres cluster. + +See src/test/perl/README for more info about running these tests. diff --git a/third_party/spanner_pg/src/test/authentication/t/001_password.pl b/third_party/spanner_pg/src/test/authentication/t/001_password.pl index 1296c530..3e3079c8 100644 --- a/third_party/spanner_pg/src/test/authentication/t/001_password.pl +++ b/third_party/spanner_pg/src/test/authentication/t/001_password.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Set of tests for authentication and pg_hba.conf. The following password # methods are checked through this test: @@ -10,19 +10,14 @@ use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; if (!$use_unix_sockets) { plan skip_all => "authentication tests cannot run without Unix-domain sockets"; } -else -{ - plan tests => 23; -} - # Delete pg_hba.conf from the given node, add a new entry to it # and then execute a reload to refresh it. @@ -64,7 +59,7 @@ sub test_role } # Initialize primary node -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init; $node->append_conf('postgresql.conf', "log_connections = on\n"); $node->start; @@ -136,7 +131,7 @@ sub test_role test_role($node, 'scram_role', 'scram-sha-256', 2); # Test .pgpass processing; but use a temp file, don't overwrite the real one! -my $pgpassfile = "${TestLib::tmp_check}/pgpass"; +my $pgpassfile = "${PostgreSQL::Test::Utils::tmp_check}/pgpass"; delete $ENV{"PGPASSWORD"}; delete $ENV{"PGCHANNELBINDING"}; @@ -160,3 +155,5 @@ sub test_role !); test_role($node, 'md5_role', 'password from pgpass', 0); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/authentication/t/002_saslprep.pl b/third_party/spanner_pg/src/test/authentication/t/002_saslprep.pl index 5b8b4b28..5e87e21e 100644 --- a/third_party/spanner_pg/src/test/authentication/t/002_saslprep.pl +++ b/third_party/spanner_pg/src/test/authentication/t/002_saslprep.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test password normalization in SCRAM. # @@ -7,18 +7,14 @@ use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; if (!$use_unix_sockets) { plan skip_all => "authentication tests cannot run without Unix-domain sockets"; } -else -{ - plan tests => 12; -} # Delete pg_hba.conf from the given node, add a new entry to it # and then execute a reload to refresh it. @@ -64,7 +60,7 @@ sub test_login # Initialize primary node. Force UTF-8 encoding, so that we can use non-ASCII # characters in the passwords below. -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(extra => [ '--locale=C', '--encoding=UTF8' ]); $node->start; @@ -117,3 +113,5 @@ sub test_login test_login($node, 'saslpreptest7_role', "foo\xd8\xa71bar", 0); test_login($node, 'saslpreptest7_role', "foo1\xd8\xa7bar", 2); test_login($node, 'saslpreptest7_role', "foobar", 2); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/examples/testlo.c b/third_party/spanner_pg/src/test/examples/testlo.c index 6d91681b..1b08b6ca 100644 --- a/third_party/spanner_pg/src/test/examples/testlo.c +++ b/third_party/spanner_pg/src/test/examples/testlo.c @@ -3,7 +3,7 @@ * testlo.c * test using large objects with libpq * - * 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/third_party/spanner_pg/src/test/examples/testlo64.c b/third_party/spanner_pg/src/test/examples/testlo64.c index 23e91094..981e29ad 100644 --- a/third_party/spanner_pg/src/test/examples/testlo64.c +++ b/third_party/spanner_pg/src/test/examples/testlo64.c @@ -3,7 +3,7 @@ * testlo64.c * test using large objects with libpq using 64-bit APIs * - * 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/third_party/spanner_pg/src/test/icu/.gitignore b/third_party/spanner_pg/src/test/icu/.gitignore new file mode 100644 index 00000000..871e943d --- /dev/null +++ b/third_party/spanner_pg/src/test/icu/.gitignore @@ -0,0 +1,2 @@ +# Generated by test suite +/tmp_check/ diff --git a/third_party/spanner_pg/src/test/icu/Makefile b/third_party/spanner_pg/src/test/icu/Makefile new file mode 100644 index 00000000..e30f5e95 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/icu/README b/third_party/spanner_pg/src/test/icu/README new file mode 100644 index 00000000..c257af19 --- /dev/null +++ b/third_party/spanner_pg/src/test/icu/README @@ -0,0 +1,25 @@ +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. + +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/third_party/spanner_pg/src/test/icu/t/010_database.pl b/third_party/spanner_pg/src/test/icu/t/010_database.pl new file mode 100644 index 00000000..3ddc5d87 --- /dev/null +++ b/third_party/spanner_pg/src/test/icu/t/010_database.pl @@ -0,0 +1,66 @@ +# 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@colCaseFirst=upper' ENCODING 'UTF8' TEMPLATE template0} +); + +$node1->safe_psql( + 'dbicu', + q{ +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'); +}); + +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 ENCODING UTF8}); +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/third_party/spanner_pg/src/test/isolation/expected/cluster-conflict-partition.out b/third_party/spanner_pg/src/test/isolation/expected/cluster-conflict-partition.out new file mode 100644 index 00000000..7acb675c --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/expected/cluster-conflict.out b/third_party/spanner_pg/src/test/isolation/expected/cluster-conflict.out new file mode 100644 index 00000000..614d8f9d --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/expected/fk-snapshot.out b/third_party/spanner_pg/src/test/isolation/expected/fk-snapshot.out new file mode 100644 index 00000000..bdd26bac --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/fk-snapshot.out @@ -0,0 +1,146 @@ +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) + + +starting permutation: s2ip2 s1brr s1ifp2 s2brr s2dp2 s1c s2c +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1ifp2: INSERT INTO fk_parted_pk VALUES (2); +step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2dp2: DELETE FROM pk_noparted WHERE a = 2; +step s1c: COMMIT; +step s2dp2: <... completed> +ERROR: could not serialize access due to concurrent update +step s2c: COMMIT; + +starting permutation: s2ip2 s1brr s1ifn2 s2brr s2dp2 s1c s2c +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1ifn2: INSERT INTO fk_noparted_sn VALUES (2); +step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2dp2: DELETE FROM pk_noparted WHERE a = 2; +step s1c: COMMIT; +step s2dp2: <... completed> +ERROR: could not serialize access due to concurrent update +step s2c: COMMIT; diff --git a/third_party/spanner_pg/src/test/isolation/expected/merge-delete.out b/third_party/spanner_pg/src/test/isolation/expected/merge-delete.out new file mode 100644 index 00000000..897b9351 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/merge-delete.out @@ -0,0 +1,236 @@ +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: delete_pa c1 select2_pa c2 +step delete_pa: DELETE FROM target_pa t WHERE t.key = 1; +step c1: COMMIT; +step select2_pa: SELECT * FROM target_pa; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete_tg c1 select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step c1: COMMIT; +step select2_tg: SELECT * FROM target_tg; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete c1 update2 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step c1: COMMIT; +step update2: UPDATE target t SET val = t.val || ' updated by update2' WHERE t.key = 1; +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete_pa c1 update2_pa select2_pa c2 +step delete_pa: DELETE FROM target_pa t WHERE t.key = 1; +step c1: COMMIT; +step update2_pa: UPDATE target_pa t SET val = t.val || ' updated by update2_pa' WHERE t.key = 1; +step select2_pa: SELECT * FROM target_pa; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete_tg c1 update2_tg select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step c1: COMMIT; +step update2_tg: UPDATE target_tg t SET val = t.val || ' updated by update2_tg' WHERE t.key = 1; +step select2_tg: SELECT * FROM target_tg; +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, '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 select2: SELECT * FROM target; +key|val +---+------ + 1|merge2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete_pa c1 merge2_pa select2_pa c2 +step delete_pa: DELETE FROM target_pa t WHERE t.key = 1; +step c1: COMMIT; +step merge2_pa: MERGE INTO target_pa t USING (SELECT 1 as key, 'merge2_pa' 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_pa: SELECT * FROM target_pa; +key|val +---+--------- + 1|merge2_pa +(1 row) + +step c2: COMMIT; + +starting permutation: delete_tg c1 merge2_tg select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step c1: COMMIT; +s2: NOTICE: Insert: (1,merge2_tg) +step merge2_tg: MERGE INTO target_tg t USING (SELECT 1 as key, 'merge2_tg' 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_tg: SELECT * FROM target_tg; +key|val +---+--------- + 1|merge2_tg +(1 row) + +step c2: COMMIT; + +starting permutation: delete c1 merge_delete2 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step c1: COMMIT; +step merge_delete2: MERGE INTO target t USING (SELECT 1 as key, 'merge_delete2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; +step select2: SELECT * FROM target; +key|val +---+------------- + 1|merge_delete2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete_tg c1 merge_delete2_tg select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step c1: COMMIT; +s2: NOTICE: Insert: (1,merge_delete2_tg) +step merge_delete2_tg: MERGE INTO target_tg t USING (SELECT 1 as key, 'merge_delete2_tg' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; +step select2_tg: SELECT * FROM target_tg; +key|val +---+---------------- + 1|merge_delete2_tg +(1 row) + +step c2: COMMIT; + +starting permutation: delete update2 c1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step update2: UPDATE target t SET val = t.val || ' updated by update2' WHERE t.key = 1; +step c1: COMMIT; +step update2: <... completed> +step select2: SELECT * FROM target; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete_pa update2_pa c1 select2_pa c2 +step delete_pa: DELETE FROM target_pa t WHERE t.key = 1; +step update2_pa: UPDATE target_pa t SET val = t.val || ' updated by update2_pa' WHERE t.key = 1; +step c1: COMMIT; +step update2_pa: <... completed> +step select2_pa: SELECT * FROM target_pa; +key|val +---+--- +(0 rows) + +step c2: COMMIT; + +starting permutation: delete_tg update2_tg c1 select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step update2_tg: UPDATE target_tg t SET val = t.val || ' updated by update2_tg' WHERE t.key = 1; +step c1: COMMIT; +step update2_tg: <... completed> +step select2_tg: SELECT * FROM target_tg; +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, '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 merge2: <... completed> +step select2: SELECT * FROM target; +key|val +---+------ + 1|merge2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete_pa merge2_pa c1 select2_pa c2 +step delete_pa: DELETE FROM target_pa t WHERE t.key = 1; +step merge2_pa: MERGE INTO target_pa t USING (SELECT 1 as key, 'merge2_pa' 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_pa: <... completed> +step select2_pa: SELECT * FROM target_pa; +key|val +---+--------- + 1|merge2_pa +(1 row) + +step c2: COMMIT; + +starting permutation: delete_tg merge2_tg c1 select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step merge2_tg: MERGE INTO target_tg t USING (SELECT 1 as key, 'merge2_tg' 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; +s2: NOTICE: Insert: (1,merge2_tg) +step merge2_tg: <... completed> +step select2_tg: SELECT * FROM target_tg; +key|val +---+--------- + 1|merge2_tg +(1 row) + +step c2: COMMIT; + +starting permutation: delete merge_delete2 c1 select2 c2 +step delete: DELETE FROM target t WHERE t.key = 1; +step merge_delete2: MERGE INTO target t USING (SELECT 1 as key, 'merge_delete2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; +step c1: COMMIT; +step merge_delete2: <... completed> +step select2: SELECT * FROM target; +key|val +---+------------- + 1|merge_delete2 +(1 row) + +step c2: COMMIT; + +starting permutation: delete_tg merge_delete2_tg c1 select2_tg c2 +s1: NOTICE: Delete: (1,setup1) +step delete_tg: DELETE FROM target_tg t WHERE t.key = 1; +step merge_delete2_tg: MERGE INTO target_tg t USING (SELECT 1 as key, 'merge_delete2_tg' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; +step c1: COMMIT; +s2: NOTICE: Insert: (1,merge_delete2_tg) +step merge_delete2_tg: <... completed> +step select2_tg: SELECT * FROM target_tg; +key|val +---+---------------- + 1|merge_delete2_tg +(1 row) + +step c2: COMMIT; diff --git a/third_party/spanner_pg/src/test/isolation/expected/merge-insert-update.out b/third_party/spanner_pg/src/test/isolation/expected/merge-insert-update.out new file mode 100644 index 00000000..ee8b3c4e --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/expected/merge-join.out b/third_party/spanner_pg/src/test/isolation/expected/merge-join.out new file mode 100644 index 00000000..57f048c5 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/merge-join.out @@ -0,0 +1,148 @@ +Parsed test spec with 2 sessions + +starting permutation: b1 m1 s1 c1 b2 m2 s2 c2 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + +step c1: COMMIT; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step s2: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + +step c2: COMMIT; + +starting permutation: b1 b2 m1 hj ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step hj: SET LOCAL enable_mergejoin = off; SET LOCAL enable_nestloop = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Hash Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + Hash Cond: (src.id = tgt.id) + -> Seq Scan on public.src + Output: src.val, src.id, src.ctid + -> Hash + Output: tgt.ctid, tgt.id + -> Seq Scan on public.tgt + Output: tgt.ctid, tgt.id +(11 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + + +starting permutation: b1 b2 m1 mj ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step mj: SET LOCAL enable_hashjoin = off; SET LOCAL enable_nestloop = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Merge Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + Merge Cond: (src.id = tgt.id) + -> Index Scan using src_pkey on public.src + Output: src.val, src.id, src.ctid + -> Index Scan using tgt_pkey on public.tgt + Output: tgt.ctid, tgt.id +(9 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + + +starting permutation: b1 b2 m1 nl ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step nl: SET LOCAL enable_hashjoin = off; SET LOCAL enable_mergejoin = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Nested Loop Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + -> Seq Scan on public.src + Output: src.val, src.id, src.ctid + -> Index Scan using tgt_pkey on public.tgt + Output: tgt.ctid, tgt.id + Index Cond: (tgt.id = src.id) +(9 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + diff --git a/third_party/spanner_pg/src/test/isolation/expected/merge-match-recheck.out b/third_party/spanner_pg/src/test/isolation/expected/merge-match-recheck.out new file mode 100644 index 00000000..9a44a595 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/merge-match-recheck.out @@ -0,0 +1,349 @@ +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: update1_tg merge_status_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,170,s1,"setup updated by update1_tg") +step update1_tg: UPDATE target_tg t SET balance = balance + 10, val = t.val || ' updated by update1_tg' WHERE t.key = 1; +step merge_status_tg: + MERGE INTO target_tg 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; +s1: NOTICE: Update: (1,170,s1,"setup updated by update1_tg") -> (1,170,s2,"setup updated by update1_tg when1") +step merge_status_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--------------------------------- + 1| 170|s2 |setup updated by update1_tg 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: update2_tg merge_status_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,160,s2,"setup updated by update2_tg") +step update2_tg: UPDATE target_tg t SET status = 's2', val = t.val || ' updated by update2_tg' WHERE t.key = 1; +step merge_status_tg: + MERGE INTO target_tg 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; +s1: NOTICE: Update: (1,160,s2,"setup updated by update2_tg") -> (1,160,s3,"setup updated by update2_tg when2") +step merge_status_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--------------------------------- + 1| 160|s3 |setup updated by update2_tg 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: update3_tg merge_status_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,160,s3,"setup updated by update3_tg") +step update3_tg: UPDATE target_tg t SET status = 's3', val = t.val || ' updated by update3_tg' WHERE t.key = 1; +step merge_status_tg: + MERGE INTO target_tg 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; +s1: NOTICE: Update: (1,160,s3,"setup updated by update3_tg") -> (1,160,s4,"setup updated by update3_tg when3") +step merge_status_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--------------------------------- + 1| 160|s4 |setup updated by update3_tg 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: update5_tg merge_status_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,160,s5,"setup updated by update5_tg") +step update5_tg: UPDATE target_tg t SET status = 's5', val = t.val || ' updated by update5_tg' WHERE t.key = 1; +step merge_status_tg: + MERGE INTO target_tg 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_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--------------------------- + 1| 160|s5 |setup updated by update5_tg +(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; + +starting permutation: update_bal1_pa merge_bal_pa c2 select1_pa c1 +step update_bal1_pa: UPDATE target_pa t SET balance = 50, val = t.val || ' updated by update_bal1_pa' WHERE t.key = 1; +step merge_bal_pa: + MERGE INTO target_pa 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_pa: <... completed> +step select1_pa: SELECT * FROM target_pa; +key|balance|status|val +---+-------+------+------------------------------------- + 1| 100|s1 |setup updated by update_bal1_pa when1 +(1 row) + +step c1: COMMIT; + +starting permutation: update_bal1_tg merge_bal_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,50,s1,"setup updated by update_bal1_tg") +step update_bal1_tg: UPDATE target_tg t SET balance = 50, val = t.val || ' updated by update_bal1_tg' WHERE t.key = 1; +step merge_bal_tg: + MERGE INTO target_tg 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; +s1: NOTICE: Update: (1,50,s1,"setup updated by update_bal1_tg") -> (1,100,s1,"setup updated by update_bal1_tg when1") +step merge_bal_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+------------------------------------- + 1| 100|s1 |setup updated by update_bal1_tg when1 +(1 row) + +step c1: COMMIT; + +starting permutation: update1 merge_delete c2 select1 c1 +step update1: UPDATE target t SET balance = balance + 10, val = t.val || ' updated by update1' WHERE t.key = 1; +step merge_delete: + 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 + DELETE; + +step c2: COMMIT; +step merge_delete: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+--- +(0 rows) + +step c1: COMMIT; + +starting permutation: update1_tg merge_delete_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,170,s1,"setup updated by update1_tg") +step update1_tg: UPDATE target_tg t SET balance = balance + 10, val = t.val || ' updated by update1_tg' WHERE t.key = 1; +step merge_delete_tg: + MERGE INTO target_tg 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 + DELETE; + +step c2: COMMIT; +s1: NOTICE: Delete: (1,170,s1,"setup updated by update1_tg") +step merge_delete_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--- +(0 rows) + +step c1: COMMIT; + +starting permutation: update_bal1 merge_delete 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_delete: + 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 + DELETE; + +step c2: COMMIT; +step merge_delete: <... completed> +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+---------------------------------- + 1| 100|s1 |setup updated by update_bal1 when1 +(1 row) + +step c1: COMMIT; + +starting permutation: update_bal1_tg merge_delete_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,50,s1,"setup updated by update_bal1_tg") +step update_bal1_tg: UPDATE target_tg t SET balance = 50, val = t.val || ' updated by update_bal1_tg' WHERE t.key = 1; +step merge_delete_tg: + MERGE INTO target_tg 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 + DELETE; + +step c2: COMMIT; +s1: NOTICE: Update: (1,50,s1,"setup updated by update_bal1_tg") -> (1,100,s1,"setup updated by update_bal1_tg when1") +step merge_delete_tg: <... completed> +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+------------------------------------- + 1| 100|s1 |setup updated by update_bal1_tg when1 +(1 row) + +step c1: COMMIT; diff --git a/third_party/spanner_pg/src/test/isolation/expected/merge-update.out b/third_party/spanner_pg/src/test/isolation/expected/merge-update.out new file mode 100644 index 00000000..55b1f908 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/expected/ri-trigger.out b/third_party/spanner_pg/src/test/isolation/expected/ri-trigger.out index 842df80a..db85618b 100644 --- a/third_party/spanner_pg/src/test/isolation/expected/ri-trigger.out +++ b/third_party/spanner_pg/src/test/isolation/expected/ri-trigger.out @@ -4,9 +4,9 @@ starting permutation: wxry1 c1 r2 wyrx2 c2 step wxry1: INSERT INTO child (parent_id) VALUES (0); step c1: COMMIT; step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; @@ -16,9 +16,9 @@ step c2: COMMIT; starting permutation: wxry1 r2 c1 wyrx2 c2 step wxry1: INSERT INTO child (parent_id) VALUES (0); step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step c1: COMMIT; @@ -29,9 +29,9 @@ step c2: COMMIT; starting permutation: wxry1 r2 wyrx2 c1 c2 step wxry1: INSERT INTO child (parent_id) VALUES (0); step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; @@ -42,9 +42,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: wxry1 r2 wyrx2 c2 c1 step wxry1: INSERT INTO child (parent_id) VALUES (0); step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; @@ -54,9 +54,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: r2 wxry1 c1 wyrx2 c2 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wxry1: INSERT INTO child (parent_id) VALUES (0); @@ -67,9 +67,9 @@ step c2: COMMIT; starting permutation: r2 wxry1 wyrx2 c1 c2 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wxry1: INSERT INTO child (parent_id) VALUES (0); @@ -80,9 +80,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: r2 wxry1 wyrx2 c2 c1 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wxry1: INSERT INTO child (parent_id) VALUES (0); @@ -93,9 +93,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: r2 wyrx2 wxry1 c1 c2 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; @@ -106,9 +106,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: r2 wyrx2 wxry1 c2 c1 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; @@ -119,9 +119,9 @@ ERROR: could not serialize access due to read/write dependencies among transact starting permutation: r2 wyrx2 c2 wxry1 c1 step r2: SELECT TRUE; -bool ----- -t +?column? +-------- +t (1 row) step wyrx2: DELETE FROM parent WHERE parent_id = 0; diff --git a/third_party/spanner_pg/src/test/isolation/expected/stats.out b/third_party/spanner_pg/src/test/isolation/expected/stats.out new file mode 100644 index 00000000..61b5a710 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/stats.out @@ -0,0 +1,3735 @@ +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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_ifexists 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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(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_ifexists 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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(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 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_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_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_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 +------------------------ + +(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_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_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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + +step s1_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_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_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 +------------------------ + +(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_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_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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + +step s1_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_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_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 +------------------------ + +(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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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_ff s2_commit_prepared_a 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 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 +------------------------ + +(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(); +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(); +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(); +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(); +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +pg_notify +--------- + + + +(3 rows) + +step s1_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_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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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/third_party/spanner_pg/src/test/isolation/expected/stats_1.out b/third_party/spanner_pg/src/test/isolation/expected/stats_1.out new file mode 100644 index 00000000..38543201 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/expected/stats_1.out @@ -0,0 +1,3759 @@ +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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_ifexists 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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(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_ifexists 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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(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 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_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_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_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 +------------------------ + +(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_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_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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + +step s1_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_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_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 +------------------------ + +(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_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_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_ifexists: SELECT test_stat_func_ifexists(); +test_stat_func_ifexists +----------------------- + +(1 row) + +step s1_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_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_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 +------------------------ + +(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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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(); +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_ff s2_commit_prepared_a 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 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 +------------------------ + +(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(); +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(); +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(); +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(); +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +pg_notify +--------- + + + +(3 rows) + +step s1_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_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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + +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/third_party/spanner_pg/src/test/isolation/expected/temp-schema-cleanup.out b/third_party/spanner_pg/src/test/isolation/expected/temp-schema-cleanup.out index a46e8a72..35b91d9e 100644 --- a/third_party/spanner_pg/src/test/isolation/expected/temp-schema-cleanup.out +++ b/third_party/spanner_pg/src/test/isolation/expected/temp-schema-cleanup.out @@ -85,7 +85,6 @@ exec step s1_exit: SELECT pg_terminate_backend(pg_backend_pid()); -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 diff --git a/third_party/spanner_pg/src/test/isolation/expected/vacuum-no-cleanup-lock.out b/third_party/spanner_pg/src/test/isolation/expected/vacuum-no-cleanup-lock.out new file mode 100644 index 00000000..f7bc93e8 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/expected/vacuum-reltuples.out b/third_party/spanner_pg/src/test/isolation/expected/vacuum-reltuples.out deleted file mode 100644 index cdbe7f3a..00000000 --- a/third_party/spanner_pg/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| 20 -(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/third_party/spanner_pg/src/test/isolation/isolation_main.c b/third_party/spanner_pg/src/test/isolation/isolation_main.c index eff9c4f2..31a0e6b7 100644 --- a/third_party/spanner_pg/src/test/isolation/isolation_main.c +++ b/third_party/spanner_pg/src/test/isolation/isolation_main.c @@ -2,7 +2,7 @@ * * isolation_main --- pg_regress test launcher for isolation tests * - * 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 * * src/test/isolation/isolation_main.c diff --git a/third_party/spanner_pg/src/test/isolation/isolation_schedule b/third_party/spanner_pg/src/test/isolation/isolation_schedule index 9c180a3e..2c3e1af4 100644 --- a/third_party/spanner_pg/src/test/isolation/isolation_schedule +++ b/third_party/spanner_pg/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 @@ -45,6 +46,11 @@ 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: merge-join test: delete-abort-savept test: delete-abort-savept-2 test: aborted-keyrevoke @@ -80,11 +86,12 @@ 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 test: vacuum-skip-locked +test: stats test: horizons test: predicate-hash test: predicate-gist @@ -96,6 +103,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/third_party/spanner_pg/src/test/isolation/isolationtester.h b/third_party/spanner_pg/src/test/isolation/isolationtester.h index 5f300219..e00bc6b8 100644 --- a/third_party/spanner_pg/src/test/isolation/isolationtester.h +++ b/third_party/spanner_pg/src/test/isolation/isolationtester.h @@ -3,7 +3,7 @@ * isolationtester.h * include file for isolation tests * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/test/isolation/specparse.y b/third_party/spanner_pg/src/test/isolation/specparse.y index c25aa1a7..eb368184 100644 --- a/third_party/spanner_pg/src/test/isolation/specparse.y +++ b/third_party/spanner_pg/src/test/isolation/specparse.y @@ -4,7 +4,7 @@ * specparse.y * bison grammar for the isolation test file format * - * 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/third_party/spanner_pg/src/test/isolation/specs/cluster-conflict-partition.spec b/third_party/spanner_pg/src/test/isolation/specs/cluster-conflict-partition.spec new file mode 100644 index 00000000..5091f684 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/specs/cluster-conflict.spec b/third_party/spanner_pg/src/test/isolation/specs/cluster-conflict.spec new file mode 100644 index 00000000..2e1d547f --- /dev/null +++ b/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/test/isolation/specs/fk-snapshot.spec b/third_party/spanner_pg/src/test/isolation/specs/fk-snapshot.spec new file mode 100644 index 00000000..9fad57e7 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/specs/fk-snapshot.spec @@ -0,0 +1,76 @@ +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 + ); + + CREATE TABLE fk_noparted_sn ( + a int REFERENCES pk_noparted ON DELETE SET NULL + ); + + 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, fk_noparted_sn; +} + +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 s1ifn2 { INSERT INTO fk_noparted_sn VALUES (2); } +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 s2dp2 { DELETE FROM pk_noparted WHERE a = 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 + +# trying to delete a row through DELETE CASCADE, whilst that row is deleted +# in a concurrent transaction +permutation s2ip2 s1brr s1ifp2 s2brr s2dp2 s1c s2c + +# trying to update a row through DELETE SET NULL, whilst that row is deleted +# in a concurrent transaction +permutation s2ip2 s1brr s1ifn2 s2brr s2dp2 s1c s2c diff --git a/third_party/spanner_pg/src/test/isolation/specs/merge-delete.spec b/third_party/spanner_pg/src/test/isolation/specs/merge-delete.spec new file mode 100644 index 00000000..ba5f70e5 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/specs/merge-delete.spec @@ -0,0 +1,96 @@ +# 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'); + + CREATE TABLE target_pa (key int primary key, val text) PARTITION BY LIST (key); + CREATE TABLE target_pa1 PARTITION OF target_pa FOR VALUES IN (1); + CREATE TABLE target_pa2 PARTITION OF target_pa FOR VALUES IN (2); + INSERT INTO target_pa VALUES (1, 'setup1'); + + CREATE TABLE target_tg (key int primary key, val text); + CREATE FUNCTION target_tg_trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ + BEGIN + IF tg_op = 'INSERT' THEN + RAISE NOTICE 'Insert: %', NEW; + RETURN NEW; + ELSIF tg_op = 'UPDATE' THEN + RAISE NOTICE 'Update: % -> %', OLD, NEW; + RETURN NEW; + ELSE + RAISE NOTICE 'Delete: %', OLD; + RETURN OLD; + END IF; + END + $$; + CREATE TRIGGER target_tg_trig BEFORE INSERT OR UPDATE OR DELETE ON target_tg + FOR EACH ROW EXECUTE FUNCTION target_tg_trig_fn(); + INSERT INTO target_tg VALUES (1, 'setup1'); +} + +teardown +{ + DROP TABLE target; + DROP TABLE target_pa; + DROP TABLE target_tg; + DROP FUNCTION target_tg_trig_fn; +} + +session "s1" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "delete" { DELETE FROM target t WHERE t.key = 1; } +step "delete_pa" { DELETE FROM target_pa t WHERE t.key = 1; } +step "delete_tg" { DELETE FROM target_tg t WHERE t.key = 1; } +step "c1" { COMMIT; } + +session "s2" +setup +{ + BEGIN ISOLATION LEVEL READ COMMITTED; +} +step "update2" { UPDATE target t SET val = t.val || ' updated by update2' WHERE t.key = 1; } +step "update2_pa" { UPDATE target_pa t SET val = t.val || ' updated by update2_pa' WHERE t.key = 1; } +step "update2_tg" { UPDATE target_tg t SET val = t.val || ' updated by update2_tg' WHERE t.key = 1; } +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 key = t.key + 1, val = t.val || ' updated by ' || s.val; } +step "merge2_pa" { MERGE INTO target_pa t USING (SELECT 1 as key, 'merge2_pa' 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 "merge2_tg" { MERGE INTO target_tg t USING (SELECT 1 as key, 'merge2_tg' 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 "merge_delete2" { MERGE INTO target t USING (SELECT 1 as key, 'merge_delete2' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; } +step "merge_delete2_tg" { MERGE INTO target_tg t USING (SELECT 1 as key, 'merge_delete2_tg' as val) s ON s.key = t.key WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN DELETE; } +step "select2" { SELECT * FROM target; } +step "select2_pa" { SELECT * FROM target_pa; } +step "select2_tg" { SELECT * FROM target_tg; } +step "c2" { COMMIT; } + +# Basic effects +permutation "delete" "c1" "select2" "c2" +permutation "delete_pa" "c1" "select2_pa" "c2" +permutation "delete_tg" "c1" "select2_tg" "c2" + +# One after the other, no concurrency +permutation "delete" "c1" "update2" "select2" "c2" +permutation "delete_pa" "c1" "update2_pa" "select2_pa" "c2" +permutation "delete_tg" "c1" "update2_tg" "select2_tg" "c2" +permutation "delete" "c1" "merge2" "select2" "c2" +permutation "delete_pa" "c1" "merge2_pa" "select2_pa" "c2" +permutation "delete_tg" "c1" "merge2_tg" "select2_tg" "c2" +permutation "delete" "c1" "merge_delete2" "select2" "c2" +permutation "delete_tg" "c1" "merge_delete2_tg" "select2_tg" "c2" + +# Now with concurrency +permutation "delete" "update2" "c1" "select2" "c2" +permutation "delete_pa" "update2_pa" "c1" "select2_pa" "c2" +permutation "delete_tg" "update2_tg" "c1" "select2_tg" "c2" +permutation "delete" "merge2" "c1" "select2" "c2" +permutation "delete_pa" "merge2_pa" "c1" "select2_pa" "c2" +permutation "delete_tg" "merge2_tg" "c1" "select2_tg" "c2" +permutation "delete" "merge_delete2" "c1" "select2" "c2" +permutation "delete_tg" "merge_delete2_tg" "c1" "select2_tg" "c2" diff --git a/third_party/spanner_pg/src/test/isolation/specs/merge-insert-update.spec b/third_party/spanner_pg/src/test/isolation/specs/merge-insert-update.spec new file mode 100644 index 00000000..1bf1ed46 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/specs/merge-join.spec b/third_party/spanner_pg/src/test/isolation/specs/merge-join.spec new file mode 100644 index 00000000..e33a02cc --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/specs/merge-join.spec @@ -0,0 +1,45 @@ +# MERGE JOIN +# +# This test checks the EPQ recheck mechanism during MERGE when joining to a +# source table using different join methods, per bug #18103 + +setup +{ + CREATE TABLE src (id int PRIMARY KEY, val int); + CREATE TABLE tgt (id int PRIMARY KEY, val int); + INSERT INTO src SELECT x, x*10 FROM generate_series(1,3) g(x); + INSERT INTO tgt SELECT x, x FROM generate_series(1,3) g(x); +} + +teardown +{ + DROP TABLE src, tgt; +} + +session s1 +step b1 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step m1 { MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step s1 { SELECT * FROM tgt; } +step c1 { COMMIT; } + +session s2 +step b2 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step hj { SET LOCAL enable_mergejoin = off; SET LOCAL enable_nestloop = off; } +step mj { SET LOCAL enable_hashjoin = off; SET LOCAL enable_nestloop = off; } +step nl { SET LOCAL enable_hashjoin = off; SET LOCAL enable_mergejoin = off; } +step ex { EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step m2 { MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step s2 { SELECT * FROM tgt; } +step c2 { COMMIT; } + +permutation b1 m1 s1 c1 b2 m2 s2 c2 +permutation b1 b2 m1 hj ex m2 c1 c2 s1 +permutation b1 b2 m1 mj ex m2 c1 c2 s1 +permutation b1 b2 m1 nl ex m2 c1 c2 s1 diff --git a/third_party/spanner_pg/src/test/isolation/specs/merge-match-recheck.spec b/third_party/spanner_pg/src/test/isolation/specs/merge-match-recheck.spec new file mode 100644 index 00000000..298b2bfd --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/specs/merge-match-recheck.spec @@ -0,0 +1,184 @@ +# 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'); + + CREATE TABLE target_pa (key int, balance integer, status text, val text) PARTITION BY RANGE (balance); + CREATE TABLE target_pa1 PARTITION OF target_pa FOR VALUES FROM (0) TO (200); + CREATE TABLE target_pa2 PARTITION OF target_pa FOR VALUES FROM (200) TO (1000); + INSERT INTO target_pa VALUES (1, 160, 's1', 'setup'); + + CREATE TABLE target_tg (key int primary key, balance integer, status text, val text); + CREATE FUNCTION target_tg_trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ + BEGIN + IF tg_op = 'INSERT' THEN + RAISE NOTICE 'Insert: %', NEW; + RETURN NEW; + ELSIF tg_op = 'UPDATE' THEN + RAISE NOTICE 'Update: % -> %', OLD, NEW; + RETURN NEW; + ELSE + RAISE NOTICE 'Delete: %', OLD; + RETURN OLD; + END IF; + END + $$; + CREATE TRIGGER target_tg_trig BEFORE INSERT OR UPDATE OR DELETE ON target_tg + FOR EACH ROW EXECUTE FUNCTION target_tg_trig_fn(); + INSERT INTO target_tg VALUES (1, 160, 's1', 'setup'); +} + +teardown +{ + DROP TABLE target; + DROP TABLE target_pa; + DROP TABLE target_tg; + DROP FUNCTION target_tg_trig_fn; +} + +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_status_tg" +{ + MERGE INTO target_tg 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 "merge_bal_pa" +{ + MERGE INTO target_pa 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 "merge_bal_tg" +{ + MERGE INTO target_tg 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 "merge_delete" +{ + 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 + DELETE; +} +step "merge_delete_tg" +{ + MERGE INTO target_tg 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 + DELETE; +} + +step "select1" { SELECT * FROM target; } +step "select1_pa" { SELECT * FROM target_pa; } +step "select1_tg" { SELECT * FROM target_tg; } +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 "update1_tg" { UPDATE target_tg t SET balance = balance + 10, val = t.val || ' updated by update1_tg' WHERE t.key = 1; } +step "update2" { UPDATE target t SET status = 's2', val = t.val || ' updated by update2' WHERE t.key = 1; } +step "update2_tg" { UPDATE target_tg t SET status = 's2', val = t.val || ' updated by update2_tg' WHERE t.key = 1; } +step "update3" { UPDATE target t SET status = 's3', val = t.val || ' updated by update3' WHERE t.key = 1; } +step "update3_tg" { UPDATE target_tg t SET status = 's3', val = t.val || ' updated by update3_tg' WHERE t.key = 1; } +step "update5" { UPDATE target t SET status = 's5', val = t.val || ' updated by update5' WHERE t.key = 1; } +step "update5_tg" { UPDATE target_tg t SET status = 's5', val = t.val || ' updated by update5_tg' 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 "update_bal1_pa" { UPDATE target_pa t SET balance = 50, val = t.val || ' updated by update_bal1_pa' WHERE t.key = 1; } +step "update_bal1_tg" { UPDATE target_tg t SET balance = 50, val = t.val || ' updated by update_bal1_tg' 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" +permutation "update1_tg" "merge_status_tg" "c2" "select1_tg" "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" +permutation "update2_tg" "merge_status_tg" "c2" "select1_tg" "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" +permutation "update3_tg" "merge_status_tg" "c2" "select1_tg" "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" +permutation "update5_tg" "merge_status_tg" "c2" "select1_tg" "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" +permutation "update_bal1_pa" "merge_bal_pa" "c2" "select1_pa" "c1" +permutation "update_bal1_tg" "merge_bal_tg" "c2" "select1_tg" "c1" + +# merge_delete sees concurrently updated row and rechecks WHEN conditions, but recheck passes and row is deleted +permutation "update1" "merge_delete" "c2" "select1" "c1" +permutation "update1_tg" "merge_delete_tg" "c2" "select1_tg" "c1" + +# merge_delete sees concurrently updated row and rechecks WHEN conditions, recheck fails, so final balance is 100 +permutation "update_bal1" "merge_delete" "c2" "select1" "c1" +permutation "update_bal1_tg" "merge_delete_tg" "c2" "select1_tg" "c1" diff --git a/third_party/spanner_pg/src/test/isolation/specs/merge-update.spec b/third_party/spanner_pg/src/test/isolation/specs/merge-update.spec new file mode 100644 index 00000000..e8d01666 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/specs/stats.spec b/third_party/spanner_pg/src/test/isolation/specs/stats.spec new file mode 100644 index 00000000..5b922d78 --- /dev/null +++ b/third_party/spanner_pg/src/test/isolation/specs/stats.spec @@ -0,0 +1,760 @@ +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); + + -- 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(); +} + +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(); + DROP FUNCTION test_stat_func_ifexists(); +} + +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_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(); } +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + } + +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'; } +step s2_begin { BEGIN; } +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_call_ifexists { SELECT test_stat_func_ifexists(); } +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(i::text, current_setting('block_size')::int / 2)) FROM generate_series(1, 3) g(i); + } + + +###################### +# 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 + +# 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 + 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_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_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 + 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 +# 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_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 +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 + +# 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 + s1_ff # flush out non-transactional stats, might happen anyway + s2_commit_prepared_a + 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/third_party/spanner_pg/src/test/isolation/specs/vacuum-no-cleanup-lock.spec b/third_party/spanner_pg/src/test/isolation/specs/vacuum-no-cleanup-lock.spec new file mode 100644 index 00000000..a88be66d --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/isolation/specs/vacuum-reltuples.spec b/third_party/spanner_pg/src/test/isolation/specs/vacuum-reltuples.spec deleted file mode 100644 index ae2f79b8..00000000 --- a/third_party/spanner_pg/src/test/isolation/specs/vacuum-reltuples.spec +++ /dev/null @@ -1,48 +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 in second permutation is 20 tuples rather than 21 as -# for the others, because vacuum should leave the previous result -# (from before the insert) in place. - -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 diff --git a/third_party/spanner_pg/src/test/isolation/specscanner.l b/third_party/spanner_pg/src/test/isolation/specscanner.l index d9fa6a5b..aa6e8926 100644 --- a/third_party/spanner_pg/src/test/isolation/specscanner.l +++ b/third_party/spanner_pg/src/test/isolation/specscanner.l @@ -4,7 +4,7 @@ * specscanner.l * a lexical scanner for an isolation test specification * - * 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/third_party/spanner_pg/src/test/kerberos/Makefile b/third_party/spanner_pg/src/test/kerberos/Makefile index e34e531b..c5319988 100644 --- a/third_party/spanner_pg/src/test/kerberos/Makefile +++ b/third_party/spanner_pg/src/test/kerberos/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/kerberos # -# 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 # # src/test/kerberos/Makefile diff --git a/third_party/spanner_pg/src/test/kerberos/README b/third_party/spanner_pg/src/test/kerberos/README index fa9c03e7..df7aad55 100644 --- a/third_party/spanner_pg/src/test/kerberos/README +++ b/third_party/spanner_pg/src/test/kerberos/README @@ -32,6 +32,8 @@ sources and then tested. Either way, this test initializes, starts, and stops a test Postgres cluster, as well as a test KDC server. +See src/test/perl/README for more info about running these tests. + Requirements ============ diff --git a/third_party/spanner_pg/src/test/kerberos/t/001_auth.pl b/third_party/spanner_pg/src/test/kerberos/t/001_auth.pl index 5d7add9d..64117c24 100644 --- a/third_party/spanner_pg/src/test/kerberos/t/001_auth.pl +++ b/third_party/spanner_pg/src/test/kerberos/t/001_auth.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Sets up a KDC and then runs a variety of tests to make sure that the # GSSAPI/Kerberos authentication and encryption are working properly, @@ -16,16 +16,12 @@ use strict; use warnings; -use TestLib; -use PostgresNode; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; use Test::More; use Time::HiRes qw(usleep); -if ($ENV{with_gssapi} eq 'yes') -{ - plan tests => 44; -} -else +if ($ENV{with_gssapi} ne 'yes') { plan skip_all => 'GSSAPI/Kerberos not supported by this build'; } @@ -76,15 +72,15 @@ my $hostaddr = '127.0.0.1'; my $realm = 'EXAMPLE.COM'; -my $krb5_conf = "${TestLib::tmp_check}/krb5.conf"; -my $kdc_conf = "${TestLib::tmp_check}/kdc.conf"; -my $krb5_cache = "${TestLib::tmp_check}/krb5cc"; -my $krb5_log = "${TestLib::log_path}/krb5libs.log"; -my $kdc_log = "${TestLib::log_path}/krb5kdc.log"; -my $kdc_port = get_free_port(); -my $kdc_datadir = "${TestLib::tmp_check}/krb5kdc"; -my $kdc_pidfile = "${TestLib::tmp_check}/krb5kdc.pid"; -my $keytab = "${TestLib::tmp_check}/krb5.keytab"; +my $krb5_conf = "${PostgreSQL::Test::Utils::tmp_check}/krb5.conf"; +my $kdc_conf = "${PostgreSQL::Test::Utils::tmp_check}/kdc.conf"; +my $krb5_cache = "${PostgreSQL::Test::Utils::tmp_check}/krb5cc"; +my $krb5_log = "${PostgreSQL::Test::Utils::log_path}/krb5libs.log"; +my $kdc_log = "${PostgreSQL::Test::Utils::log_path}/krb5kdc.log"; +my $kdc_port = PostgreSQL::Test::Cluster::get_free_port(); +my $kdc_datadir = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc"; +my $kdc_pidfile = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc.pid"; +my $keytab = "${PostgreSQL::Test::Utils::tmp_check}/krb5.keytab"; my $dbname = 'postgres'; my $username = 'test1'; @@ -193,7 +189,7 @@ END note "setting up PostgreSQL instance"; -my $node = get_new_node('node'); +my $node = PostgreSQL::Test::Cluster->new('node'); $node->init; $node->append_conf( 'postgresql.conf', qq{ @@ -328,7 +324,7 @@ sub test_query test_query( $node, 'test1', - "CREATE TABLE mytab (f1 int primary key);\n" + "CREATE TEMP TABLE mytab (f1 int primary key);\n" . "COPY mytab FROM STDIN;\n" . join("\n", (1 .. 100000)) . "\n\\.\n" @@ -425,3 +421,5 @@ sub test_query '', 'fails with wrong krb_realm, but still authenticates', "connection authenticated: identity=\"test1\@$realm\" method=gss"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/ldap/Makefile b/third_party/spanner_pg/src/test/ldap/Makefile index ed135748..e5fa3d86 100644 --- a/third_party/spanner_pg/src/test/ldap/Makefile +++ b/third_party/spanner_pg/src/test/ldap/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/ldap # -# 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 # # src/test/ldap/Makefile diff --git a/third_party/spanner_pg/src/test/ldap/README b/third_party/spanner_pg/src/test/ldap/README index 826b1537..d869f66e 100644 --- a/third_party/spanner_pg/src/test/ldap/README +++ b/third_party/spanner_pg/src/test/ldap/README @@ -31,6 +31,8 @@ sources and then tested. Either way, this test initializes, starts, and stops a test Postgres cluster, as well as a test LDAP server. +See src/test/perl/README for more info about running these tests. + Requirements ============ diff --git a/third_party/spanner_pg/src/test/ldap/t/001_auth.pl b/third_party/spanner_pg/src/test/ldap/t/001_auth.pl index d631d53e..2a7435ed 100644 --- a/third_party/spanner_pg/src/test/ldap/t/001_auth.pl +++ b/third_party/spanner_pg/src/test/ldap/t/001_auth.pl @@ -1,26 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use TestLib; -use PostgresNode; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; use Test::More; -if ($ENV{with_ldap} eq 'yes') -{ - plan tests => 28; -} -else -{ - 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 '/opt/homebrew/opt/openldap') +if ($ENV{with_ldap} ne 'yes') +{ + plan skip_all => 'LDAP not supported by this build'; +} +elsif ($^O eq 'darwin' && -d '/opt/homebrew/opt/openldap') { # typical paths for Homebrew on ARM $slapd = '/opt/homebrew/opt/openldap/libexec/slapd'; @@ -49,6 +45,16 @@ $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"; +} # make your own edits here #$slapd = ''; @@ -57,21 +63,21 @@ $ENV{PATH} = "$ldap_bin_dir:$ENV{PATH}" if $ldap_bin_dir; -my $ldap_datadir = "${TestLib::tmp_check}/openldap-data"; -my $slapd_certs = "${TestLib::tmp_check}/slapd-certs"; -my $slapd_conf = "${TestLib::tmp_check}/slapd.conf"; -my $slapd_pidfile = "${TestLib::tmp_check}/slapd.pid"; -my $slapd_logfile = "${TestLib::log_path}/slapd.log"; -my $ldap_conf = "${TestLib::tmp_check}/ldap.conf"; +my $ldap_datadir = "${PostgreSQL::Test::Utils::tmp_check}/openldap-data"; +my $slapd_certs = "${PostgreSQL::Test::Utils::tmp_check}/slapd-certs"; +my $slapd_conf = "${PostgreSQL::Test::Utils::tmp_check}/slapd.conf"; +my $slapd_pidfile = "${PostgreSQL::Test::Utils::tmp_check}/slapd.pid"; +my $slapd_logfile = "${PostgreSQL::Test::Utils::log_path}/slapd.log"; +my $ldap_conf = "${PostgreSQL::Test::Utils::tmp_check}/ldap.conf"; my $ldap_server = 'localhost'; -my $ldap_port = get_free_port(); -my $ldaps_port = get_free_port(); +my $ldap_port = PostgreSQL::Test::Cluster::get_free_port(); +my $ldaps_port = PostgreSQL::Test::Cluster::get_free_port(); my $ldap_url = "ldap://$ldap_server:$ldap_port"; my $ldaps_url = "ldaps://$ldap_server:$ldaps_port"; my $ldap_basedn = 'dc=example,dc=net'; my $ldap_rootdn = 'cn=Manager,dc=example,dc=net'; my $ldap_rootpw = 'secret'; -my $ldap_pwfile = "${TestLib::tmp_check}/ldappassword"; +my $ldap_pwfile = "${PostgreSQL::Test::Utils::tmp_check}/ldappassword"; note "setting up slapd"; @@ -162,7 +168,7 @@ END note "setting up PostgreSQL instance"; -my $node = get_new_node('node'); +my $node = PostgreSQL::Test::Cluster->new('node'); $node->init; $node->append_conf('postgresql.conf', "log_connections = on\n"); $node->start; @@ -374,3 +380,5 @@ sub test_access $ENV{"PGPASSWORD"} = 'secret1'; test_access($node, 'test1', 2, 'bad combination of LDAPS and StartTLS'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/locale/sort-test.pl b/third_party/spanner_pg/src/test/locale/sort-test.pl index ba8d3f38..318f6abd 100755 --- a/third_party/spanner_pg/src/test/locale/sort-test.pl +++ b/third_party/spanner_pg/src/test/locale/sort-test.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/test/locale/sort-test.py b/third_party/spanner_pg/src/test/locale/sort-test.py index 53019038..21d6e78e 100755 --- a/third_party/spanner_pg/src/test/locale/sort-test.py +++ b/third_party/spanner_pg/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)) diff --git a/third_party/spanner_pg/src/test/modules/Makefile b/third_party/spanner_pg/src/test/modules/Makefile index dffc79b2..9090226d 100644 --- a/third_party/spanner_pg/src/test/modules/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/modules/brin/Makefile b/third_party/spanner_pg/src/test/modules/brin/Makefile index c8715939..e74af891 100644 --- a/third_party/spanner_pg/src/test/modules/brin/Makefile +++ b/third_party/spanner_pg/src/test/modules/brin/Makefile @@ -1,6 +1,6 @@ # src/test/modules/brin/Makefile -EXTRA_INSTALL = contrib/pageinspect +EXTRA_INSTALL = contrib/pageinspect contrib/pg_walinspect ISOLATION = summarization-and-inprogress-insertion TAP_TESTS = 1 diff --git a/third_party/spanner_pg/src/test/modules/brin/t/01_workitems.pl b/third_party/spanner_pg/src/test/modules/brin/t/01_workitems.pl index a4f603a9..3108c02c 100644 --- a/third_party/spanner_pg/src/test/modules/brin/t/01_workitems.pl +++ b/third_party/spanner_pg/src/test/modules/brin/t/01_workitems.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Verify that work items work correctly use strict; use warnings; -use TestLib; -use Test::More tests => 2; -use PostgresNode; +use PostgreSQL::Test::Utils; +use Test::More; +use PostgreSQL::Test::Cluster; -my $node = get_new_node('tango'); +my $node = PostgreSQL::Test::Cluster->new('tango'); $node->init; $node->append_conf('postgresql.conf', 'autovacuum_naptime=1s'); $node->start; @@ -42,3 +42,5 @@ ); is($count, 't', "index got summarized"); $node->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/brin/t/02_wal_consistency.pl b/third_party/spanner_pg/src/test/modules/brin/t/02_wal_consistency.pl index 41d920a6..cbc269b1 100644 --- a/third_party/spanner_pg/src/test/modules/brin/t/02_wal_consistency.pl +++ b/third_party/spanner_pg/src/test/modules/brin/t/02_wal_consistency.pl @@ -15,6 +15,7 @@ $whiskey->append_conf('postgresql.conf', 'wal_consistency_checking = brin'); $whiskey->start; $whiskey->safe_psql('postgres', 'create extension pageinspect'); +$whiskey->safe_psql('postgres', 'create extension pg_walinspect'); is( $whiskey->psql( 'postgres', qq[SELECT pg_create_physical_replication_slot('standby_1');]), @@ -38,6 +39,7 @@ create table tbl_timestamp0 (d1 timestamp(0) without time zone) with (fillfactor=10); create index on tbl_timestamp0 using brin (d1) with (pages_per_range = 1, autosummarize=false); }); +my $start_lsn = $whiskey->lsn('insert'); # Run a loop that will end when the second revmap page is created $whiskey->safe_psql( 'postgres', q{ @@ -58,6 +60,15 @@ end $$; }); +my $end_lsn = $whiskey->lsn('flush'); + +my ($ret, $out, $err) = $whiskey->psql( + 'postgres', qq{ + select count(*) from pg_get_wal_records_info('$start_lsn', '$end_lsn') + where resource_manager = 'BRIN' AND + record_type ILIKE '%revmap%' + }); +cmp_ok($out, '>=', 1); $whiskey->wait_for_catchup($charlie, 'replay', $whiskey->lsn('insert')); diff --git a/third_party/spanner_pg/src/test/modules/commit_ts/t/001_base.pl b/third_party/spanner_pg/src/test/modules/commit_ts/t/001_base.pl index dd419366..3f0bb9e8 100644 --- a/third_party/spanner_pg/src/test/modules/commit_ts/t/001_base.pl +++ b/third_party/spanner_pg/src/test/modules/commit_ts/t/001_base.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Single-node test: value can be set, and is still present after recovery use strict; use warnings; -use TestLib; -use Test::More tests => 2; -use PostgresNode; +use PostgreSQL::Test::Utils; +use Test::More; +use PostgreSQL::Test::Cluster; -my $node = get_new_node('foxtrot'); +my $node = PostgreSQL::Test::Cluster->new('foxtrot'); $node->init; $node->append_conf('postgresql.conf', 'track_commit_timestamp = on'); $node->start; @@ -34,3 +34,5 @@ 'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t\'' ); is($recovered_ts, $ts, 'commit TS remains after crash recovery'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/commit_ts/t/002_standby.pl b/third_party/spanner_pg/src/test/modules/commit_ts/t/002_standby.pl index 2664b177..ace31405 100644 --- a/third_party/spanner_pg/src/test/modules/commit_ts/t/002_standby.pl +++ b/third_party/spanner_pg/src/test/modules/commit_ts/t/002_standby.pl @@ -1,17 +1,17 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test simple scenario involving a standby use strict; use warnings; -use TestLib; -use Test::More tests => 4; -use PostgresNode; +use PostgreSQL::Test::Utils; +use Test::More; +use PostgreSQL::Test::Cluster; my $bkplabel = 'backup'; -my $primary = get_new_node('primary'); +my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init(allows_streaming => 1); $primary->append_conf( @@ -22,7 +22,7 @@ $primary->start; $primary->backup($bkplabel); -my $standby = get_new_node('standby'); +my $standby = PostgreSQL::Test::Cluster->new('standby'); $standby->init_from_backup($primary, $bkplabel, has_streaming => 1); $standby->start; @@ -64,3 +64,5 @@ $standby_ts_stderr, qr/could not get commit timestamp data/, 'expected error when primary turned feature off'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/commit_ts/t/003_standby_2.pl b/third_party/spanner_pg/src/test/modules/commit_ts/t/003_standby_2.pl index 57ab9b1d..16d5f130 100644 --- a/third_party/spanner_pg/src/test/modules/commit_ts/t/003_standby_2.pl +++ b/third_party/spanner_pg/src/test/modules/commit_ts/t/003_standby_2.pl @@ -1,17 +1,17 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test primary/standby scenario where the track_commit_timestamp GUC is # repeatedly toggled on and off. use strict; use warnings; -use TestLib; -use Test::More tests => 4; -use PostgresNode; +use PostgreSQL::Test::Utils; +use Test::More; +use PostgreSQL::Test::Cluster; my $bkplabel = 'backup'; -my $primary = get_new_node('primary'); +my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init(allows_streaming => 1); $primary->append_conf( 'postgresql.conf', qq{ @@ -21,7 +21,7 @@ $primary->start; $primary->backup($bkplabel); -my $standby = get_new_node('standby'); +my $standby = PostgreSQL::Test::Cluster->new('standby'); $standby->init_from_backup($primary, $bkplabel, has_streaming => 1); $standby->start; @@ -65,3 +65,5 @@ ); isnt($standby_ts, '', "standby gives valid value ($standby_ts) after promotion"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/commit_ts/t/004_restart.pl b/third_party/spanner_pg/src/test/modules/commit_ts/t/004_restart.pl index bc993194..808164c3 100644 --- a/third_party/spanner_pg/src/test/modules/commit_ts/t/004_restart.pl +++ b/third_party/spanner_pg/src/test/modules/commit_ts/t/004_restart.pl @@ -1,14 +1,14 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Testing of commit timestamps preservation across restarts use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 16; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->append_conf('postgresql.conf', 'track_commit_timestamp = on'); $node_primary->start; @@ -150,3 +150,5 @@ 'timestamp of disabled tx null after re-enable'); $node_primary->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/delay_execution/delay_execution.c b/third_party/spanner_pg/src/test/modules/delay_execution/delay_execution.c index b3d0841b..407ebc0e 100644 --- a/third_party/spanner_pg/src/test/modules/delay_execution/delay_execution.c +++ b/third_party/spanner_pg/src/test/modules/delay_execution/delay_execution.c @@ -10,7 +10,7 @@ * test behaviors where some specified action happens in another backend * between parsing and execution of any desired query. * - * Copyright (c) 2020-2021, PostgreSQL Global Development Group + * Copyright (c) 2020-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/delay_execution/delay_execution.c @@ -36,9 +36,8 @@ static int post_planning_lock_id = 0; /* Save previous planner hook user to be a good citizen */ static planner_hook_type prev_planner_hook = NULL; -/* Module load/unload functions */ +/* Module load function */ void _PG_init(void); -void _PG_fini(void); /* planner_hook function to provide the desired delay */ @@ -91,14 +90,9 @@ _PG_init(void) NULL, NULL); + MarkGUCPrefixReserved("delay_execution"); + /* Install our hook */ prev_planner_hook = planner_hook; planner_hook = delay_execution_planner; } - -/* Module unload function (pro forma, not used currently) */ -void -_PG_fini(void) -{ - planner_hook = prev_planner_hook; -} diff --git a/third_party/spanner_pg/src/test/modules/dummy_index_am/dummy_index_am.c b/third_party/spanner_pg/src/test/modules/dummy_index_am/dummy_index_am.c index 5365b063..a0894ff9 100644 --- a/third_party/spanner_pg/src/test/modules/dummy_index_am/dummy_index_am.c +++ b/third_party/spanner_pg/src/test/modules/dummy_index_am/dummy_index_am.c @@ -3,7 +3,7 @@ * dummy_index_am.c * Index AM template main file. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/test/modules/dummy_seclabel/dummy_seclabel.c b/third_party/spanner_pg/src/test/modules/dummy_seclabel/dummy_seclabel.c index 9da11441..67658c1e 100644 --- a/third_party/spanner_pg/src/test/modules/dummy_seclabel/dummy_seclabel.c +++ b/third_party/spanner_pg/src/test/modules/dummy_seclabel/dummy_seclabel.c @@ -7,7 +7,7 @@ * perspective, but allows regression testing independent of platform-specific * features like SELinux. * - * 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 */ #include "postgres.h" diff --git a/third_party/spanner_pg/src/test/modules/libpq_pipeline/libpq_pipeline.c b/third_party/spanner_pg/src/test/modules/libpq_pipeline/libpq_pipeline.c index b6f5fd28..b30a97d2 100644 --- a/third_party/spanner_pg/src/test/modules/libpq_pipeline/libpq_pipeline.c +++ b/third_party/spanner_pg/src/test/modules/libpq_pipeline/libpq_pipeline.c @@ -3,7 +3,7 @@ * libpq_pipeline.c * Verify libpq pipeline execution functionality * - * 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 * * @@ -108,6 +108,18 @@ test_disallowed_in_pipeline(PGconn *conn) res = PQexec(conn, "SELECT 1"); if (PQresultStatus(res) != PGRES_FATAL_ERROR) pg_fatal("PQexec should fail in pipeline mode but succeeded"); + if (strcmp(PQerrorMessage(conn), + "synchronous command execution functions are not allowed in pipeline mode\n") != 0) + pg_fatal("did not get expected error message; got: \"%s\"", + PQerrorMessage(conn)); + + /* PQsendQuery should fail in pipeline mode */ + if (PQsendQuery(conn, "SELECT 1") != 0) + pg_fatal("PQsendQuery should fail in pipeline mode but succeeded"); + if (strcmp(PQerrorMessage(conn), + "PQsendQuery not allowed in pipeline mode\n") != 0) + pg_fatal("did not get expected error message; got: \"%s\"", + PQerrorMessage(conn)); /* Entering pipeline mode when already in pipeline mode is OK */ if (PQenterPipelineMode(conn) != 1) diff --git a/third_party/spanner_pg/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl b/third_party/spanner_pg/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl index b02928ca..0821329c 100644 --- a/third_party/spanner_pg/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl +++ b/third_party/spanner_pg/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl @@ -1,15 +1,14 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use Config; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; @@ -19,7 +18,7 @@ die "oops: $err" unless $err eq ''; my @tests = split(/\s+/, $out); -mkdir "$TestLib::tmp_check/traces"; +mkdir "$PostgreSQL::Test::Utils::tmp_check/traces"; for my $testname (@tests) { @@ -30,7 +29,8 @@ disallowed_in_pipeline)) > 0; # For a bunch of tests, generate a libpq trace file too. - my $traceout = "$TestLib::tmp_check/traces/$testname.trace"; + my $traceout = + "$PostgreSQL::Test::Utils::tmp_check/traces/$testname.trace"; if ($cmptrace) { push @extraargs, "-t", $traceout; diff --git a/third_party/spanner_pg/src/test/modules/plsample/expected/plsample.out b/third_party/spanner_pg/src/test/modules/plsample/expected/plsample.out index a0c318b6..8ad5f7af 100644 --- a/third_party/spanner_pg/src/test/modules/plsample/expected/plsample.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/modules/plsample/plsample.c b/third_party/spanner_pg/src/test/modules/plsample/plsample.c index 6fc33c72..780db729 100644 --- a/third_party/spanner_pg/src/test/modules/plsample/plsample.c +++ b/third_party/spanner_pg/src/test/modules/plsample/plsample.c @@ -3,7 +3,7 @@ * plsample.c * Handler for the PL/Sample procedural language * - * 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 * * @@ -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/third_party/spanner_pg/src/test/modules/plsample/sql/plsample.sql b/third_party/spanner_pg/src/test/modules/plsample/sql/plsample.sql index bf0fddac..cf652ad5 100644 --- a/third_party/spanner_pg/src/test/modules/plsample/sql/plsample.sql +++ b/third_party/spanner_pg/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; diff --git a/third_party/spanner_pg/src/test/modules/spgist_name_ops/expected/spgist_name_ops.out b/third_party/spanner_pg/src/test/modules/spgist_name_ops/expected/spgist_name_ops.out index ac0ddcec..1ee65ede 100644 --- a/third_party/spanner_pg/src/test/modules/spgist_name_ops/expected/spgist_name_ops.out +++ b/third_party/spanner_pg/src/test/modules/spgist_name_ops/expected/spgist_name_ops.out @@ -52,14 +52,18 @@ select * from t ------------------------------------------------------+----+------------------------------------------------------ binary_upgrade_set_next_array_pg_type_oid | | binary_upgrade_set_next_array_pg_type_oid binary_upgrade_set_next_heap_pg_class_oid | | binary_upgrade_set_next_heap_pg_class_oid + binary_upgrade_set_next_heap_relfilenode | 1 | binary_upgrade_set_next_heap_relfilenode binary_upgrade_set_next_index_pg_class_oid | 1 | binary_upgrade_set_next_index_pg_class_oid + binary_upgrade_set_next_index_relfilenode | | binary_upgrade_set_next_index_relfilenode binary_upgrade_set_next_multirange_array_pg_type_oid | 1 | binary_upgrade_set_next_multirange_array_pg_type_oid binary_upgrade_set_next_multirange_pg_type_oid | 1 | binary_upgrade_set_next_multirange_pg_type_oid binary_upgrade_set_next_pg_authid_oid | | binary_upgrade_set_next_pg_authid_oid binary_upgrade_set_next_pg_enum_oid | | binary_upgrade_set_next_pg_enum_oid + binary_upgrade_set_next_pg_tablespace_oid | | binary_upgrade_set_next_pg_tablespace_oid binary_upgrade_set_next_pg_type_oid | | binary_upgrade_set_next_pg_type_oid binary_upgrade_set_next_toast_pg_class_oid | 1 | binary_upgrade_set_next_toast_pg_class_oid -(9 rows) + binary_upgrade_set_next_toast_relfilenode | | binary_upgrade_set_next_toast_relfilenode +(13 rows) -- Verify clean failure when INCLUDE'd columns result in overlength tuple -- The error message details are platform-dependent, so show only SQLSTATE @@ -97,14 +101,18 @@ select * from t ------------------------------------------------------+----+------------------------------------------------------ binary_upgrade_set_next_array_pg_type_oid | | binary_upgrade_set_next_array_pg_type_oid binary_upgrade_set_next_heap_pg_class_oid | | binary_upgrade_set_next_heap_pg_class_oid + binary_upgrade_set_next_heap_relfilenode | 1 | binary_upgrade_set_next_heap_relfilenode binary_upgrade_set_next_index_pg_class_oid | 1 | binary_upgrade_set_next_index_pg_class_oid + binary_upgrade_set_next_index_relfilenode | | binary_upgrade_set_next_index_relfilenode binary_upgrade_set_next_multirange_array_pg_type_oid | 1 | binary_upgrade_set_next_multirange_array_pg_type_oid binary_upgrade_set_next_multirange_pg_type_oid | 1 | binary_upgrade_set_next_multirange_pg_type_oid binary_upgrade_set_next_pg_authid_oid | | binary_upgrade_set_next_pg_authid_oid binary_upgrade_set_next_pg_enum_oid | | binary_upgrade_set_next_pg_enum_oid + binary_upgrade_set_next_pg_tablespace_oid | | binary_upgrade_set_next_pg_tablespace_oid binary_upgrade_set_next_pg_type_oid | | binary_upgrade_set_next_pg_type_oid binary_upgrade_set_next_toast_pg_class_oid | 1 | binary_upgrade_set_next_toast_pg_class_oid -(9 rows) + binary_upgrade_set_next_toast_relfilenode | | binary_upgrade_set_next_toast_relfilenode +(13 rows) \set VERBOSITY sqlstate insert into t values(repeat('xyzzy', 12), 42, repeat('xyzzy', 4000)); diff --git a/third_party/spanner_pg/src/test/modules/spgist_name_ops/spgist_name_ops.c b/third_party/spanner_pg/src/test/modules/spgist_name_ops/spgist_name_ops.c index 63d3faae..89595fee 100644 --- a/third_party/spanner_pg/src/test/modules/spgist_name_ops/spgist_name_ops.c +++ b/third_party/spanner_pg/src/test/modules/spgist_name_ops/spgist_name_ops.c @@ -11,7 +11,7 @@ * Unlike spgtextproc.c, we don't bother with collation-aware logic. * * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c b/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c index 6b0a3db1..e9f2329a 100644 --- a/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c +++ b/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c @@ -21,7 +21,6 @@ PG_MODULE_MAGIC; void _PG_init(void); -void _PG_fini(void); static char *ssl_passphrase = NULL; @@ -48,16 +47,13 @@ _PG_init(void) NULL, NULL, NULL); + + MarkGUCPrefixReserved("ssl_passphrase"); + if (ssl_passphrase) openssl_tls_init_hook = set_rot13; } -void -_PG_fini(void) -{ - /* do nothing yet */ -} - static void set_rot13(SSL_CTX *context, bool isServerStart) { @@ -86,5 +82,4 @@ rot13_passphrase(char *buf, int size, int rwflag, void *userdata) } return strlen(buf); - } diff --git a/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl b/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl index 1e2455e8..5be5ac39 100644 --- a/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl +++ b/third_party/spanner_pg/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; use File::Copy; -use TestLib; +use PostgreSQL::Test::Utils; use Test::More; -use PostgresNode; +use PostgreSQL::Test::Cluster; -unless ($ENV{with_ssl} eq 'openssl') +unless (($ENV{with_ssl} || "") eq 'openssl') { plan skip_all => 'OpenSSL not supported by this build'; } @@ -20,7 +20,7 @@ # see the Makefile for how the certificate and key have been generated -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->append_conf('postgresql.conf', "ssl_passphrase.passphrase = '$rot13pass'"); @@ -63,7 +63,8 @@ $node->append_conf('postgresql.conf', "ssl_passphrase.passphrase = 'blurfl'"); # try to start the server again -my $ret = TestLib::system_log('pg_ctl', '-D', $node->data_dir, '-l', +my $ret = + PostgreSQL::Test::Utils::system_log('pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'start'); diff --git a/third_party/spanner_pg/src/test/modules/test_bloomfilter/test_bloomfilter.c b/third_party/spanner_pg/src/test/modules/test_bloomfilter/test_bloomfilter.c index 96c50114..415b96cf 100644 --- a/third_party/spanner_pg/src/test/modules/test_bloomfilter/test_bloomfilter.c +++ b/third_party/spanner_pg/src/test/modules/test_bloomfilter/test_bloomfilter.c @@ -3,7 +3,7 @@ * test_bloomfilter.c * Test false positive rate of Bloom filter. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_bloomfilter/test_bloomfilter.c @@ -12,6 +12,7 @@ */ #include "postgres.h" +#include "common/pg_prng.h" #include "fmgr.h" #include "lib/bloomfilter.h" #include "miscadmin.h" @@ -83,9 +84,8 @@ create_and_test_bloom(int power, int64 nelements, int callerseed) * Generate random seed, or use caller's. Seed should always be a * positive value less than or equal to PG_INT32_MAX, to ensure that any * random seed can be recreated through callerseed if the need arises. - * (Don't assume that RAND_MAX cannot exceed PG_INT32_MAX.) */ - seed = callerseed < 0 ? random() % PG_INT32_MAX : callerseed; + seed = callerseed < 0 ? pg_prng_int32p(&pg_global_prng_state) : callerseed; /* Create Bloom filter, populate it, and report on false positive rate */ filter = bloom_create(nelements, bloom_work_mem, seed); diff --git a/third_party/spanner_pg/src/test/modules/test_ddl_deparse/test_ddl_deparse.c b/third_party/spanner_pg/src/test/modules/test_ddl_deparse/test_ddl_deparse.c index 1bae1e54..9476c3f7 100644 --- a/third_party/spanner_pg/src/test/modules/test_ddl_deparse/test_ddl_deparse.c +++ b/third_party/spanner_pg/src/test/modules/test_ddl_deparse/test_ddl_deparse.c @@ -2,7 +2,7 @@ * test_ddl_deparse.c * Support functions for the test_ddl_deparse module * - * Copyright (c) 2014-2021, PostgreSQL Global Development Group + * Copyright (c) 2014-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_ddl_deparse/test_ddl_deparse.c diff --git a/third_party/spanner_pg/src/test/modules/test_ginpostinglist/test_ginpostinglist.c b/third_party/spanner_pg/src/test/modules/test_ginpostinglist/test_ginpostinglist.c index 7ce515fc..9a230097 100644 --- a/third_party/spanner_pg/src/test/modules/test_ginpostinglist/test_ginpostinglist.c +++ b/third_party/spanner_pg/src/test/modules/test_ginpostinglist/test_ginpostinglist.c @@ -3,7 +3,7 @@ * test_ginpostinglist.c * Test varbyte-encoding in ginpostinglist.c * - * Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Copyright (c) 2019-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_ginpostinglist/test_ginpostinglist.c diff --git a/third_party/spanner_pg/src/test/modules/test_integerset/test_integerset.c b/third_party/spanner_pg/src/test/modules/test_integerset/test_integerset.c index 21c6f49b..578d2e8a 100644 --- a/third_party/spanner_pg/src/test/modules/test_integerset/test_integerset.c +++ b/third_party/spanner_pg/src/test/modules/test_integerset/test_integerset.c @@ -3,7 +3,7 @@ * test_integerset.c * Test integer set data structure. * - * Copyright (c) 2019-2021, PostgreSQL Global Development Group + * Copyright (c) 2019-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_integerset/test_integerset.c @@ -12,6 +12,7 @@ */ #include "postgres.h" +#include "common/pg_prng.h" #include "fmgr.h" #include "lib/integerset.h" #include "miscadmin.h" @@ -248,8 +249,7 @@ test_pattern(const test_spec *spec) * only a small part of the integer space is used. We would very * rarely hit values that are actually in the set. */ - x = (pg_lrand48() << 31) | pg_lrand48(); - x = x % (last_int + 1000); + x = pg_prng_uint64_range(&pg_global_prng_state, 0, last_int + 1000); /* Do we expect this value to be present in the set? */ if (x >= last_int) @@ -571,7 +571,7 @@ test_huge_distances(void) */ while (num_values < 1000) { - val += pg_lrand48(); + val += pg_prng_uint32(&pg_global_prng_state); values[num_values++] = val; } diff --git a/third_party/spanner_pg/src/test/modules/test_misc/t/001_constraint_validation.pl b/third_party/spanner_pg/src/test/modules/test_misc/t/001_constraint_validation.pl index 3729906c..3b9fc66b 100644 --- a/third_party/spanner_pg/src/test/modules/test_misc/t/001_constraint_validation.pl +++ b/third_party/spanner_pg/src/test/modules/test_misc/t/001_constraint_validation.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Verify that ALTER TABLE optimizes certain operations as expected use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 42; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize a test cluster -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(); # Turn message level up to DEBUG1 so that we get the messages we want to see $node->append_conf('postgresql.conf', 'client_min_messages = DEBUG1'); @@ -311,3 +311,5 @@ sub is_table_verified run_sql_command('DROP TABLE quuux;'); $node->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/test_misc/t/002_tablespace.pl b/third_party/spanner_pg/src/test/modules/test_misc/t/002_tablespace.pl new file mode 100644 index 00000000..95cd2b7b --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_misc/t/002_tablespace.pl @@ -0,0 +1,95 @@ +# Simple tablespace tests that can't be replicated on the same host +# due to the use of absolute paths, so we keep them out of the regular +# regression tests. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->start; + +# Create a couple of directories to use as tablespaces. +my $basedir = $node->basedir(); +my $TS1_LOCATION = "$basedir/ts1"; +$TS1_LOCATION =~ s/\/\.\//\//g; # collapse foo/./bar to foo/bar +mkdir($TS1_LOCATION); +my $TS2_LOCATION = "$basedir/ts2"; +$TS2_LOCATION =~ s/\/\.\//\//g; +mkdir($TS2_LOCATION); + +my $result; + +# Create a tablespace with an absolute path +$result = $node->psql('postgres', + "CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'"); +ok($result == 0, 'create tablespace with absolute path'); + +# Can't create a tablespace where there is one already +$result = $node->psql('postgres', + "CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'"); +ok($result != 0, 'clobber tablespace with absolute path'); + +# Create table in it +$result = $node->psql('postgres', "CREATE TABLE t () TABLESPACE regress_ts1"); +ok($result == 0, 'create table in tablespace with absolute path'); + +# Can't drop a tablespace that still has a table in it +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1"); +ok($result != 0, 'drop tablespace with absolute path'); + +# Drop the table +$result = $node->psql('postgres', "DROP TABLE t"); +ok($result == 0, 'drop table in tablespace with absolute path'); + +# Drop the tablespace +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1"); +ok($result == 0, 'drop tablespace with absolute path'); + +# Create two absolute tablespaces and two in-place tablespaces, so we can +# testing various kinds of tablespace moves. +$result = $node->psql('postgres', + "CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'"); +ok($result == 0, 'create tablespace 1 with absolute path'); +$result = $node->psql('postgres', + "CREATE TABLESPACE regress_ts2 LOCATION '$TS2_LOCATION'"); +ok($result == 0, 'create tablespace 2 with absolute path'); +$result = $node->psql('postgres', + "SET allow_in_place_tablespaces=on; CREATE TABLESPACE regress_ts3 LOCATION ''" +); +ok($result == 0, 'create tablespace 3 with in-place directory'); +$result = $node->psql('postgres', + "SET allow_in_place_tablespaces=on; CREATE TABLESPACE regress_ts4 LOCATION ''" +); +ok($result == 0, 'create tablespace 4 with in-place directory'); + +# Create a table and test moving between absolute and in-place tablespaces +$result = $node->psql('postgres', "CREATE TABLE t () TABLESPACE regress_ts1"); +ok($result == 0, 'create table in tablespace 1'); +$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts2"); +ok($result == 0, 'move table abs->abs'); +$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts3"); +ok($result == 0, 'move table abs->in-place'); +$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts4"); +ok($result == 0, 'move table in-place->in-place'); +$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts1"); +ok($result == 0, 'move table in-place->abs'); + +# Drop everything +$result = $node->psql('postgres', "DROP TABLE t"); +ok($result == 0, 'create table in tablespace 1'); +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1"); +ok($result == 0, 'drop tablespace 1'); +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts2"); +ok($result == 0, 'drop tablespace 2'); +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts3"); +ok($result == 0, 'drop tablespace 3'); +$result = $node->psql('postgres', "DROP TABLESPACE regress_ts4"); +ok($result == 0, 'drop tablespace 4'); + +$node->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/test_misc/t/003_check_guc.pl b/third_party/spanner_pg/src/test/modules/test_misc/t/003_check_guc.pl new file mode 100644 index 00000000..20c2dc33 --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_misc/t/003_check_guc.pl @@ -0,0 +1,110 @@ +# Tests to cross-check the consistency of GUC parameters with +# postgresql.conf.sample. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->start; + +# Grab the names of all the parameters that can be listed in the +# configuration sample file. config_file is an exception, it is not +# in postgresql.conf.sample but is part of the lists from guc.c. +# Custom GUCs loaded by extensions are excluded. +my $all_params = $node->safe_psql( + 'postgres', + "SELECT name + FROM pg_settings + WHERE NOT 'NOT_IN_SAMPLE' = ANY (pg_settings_get_flags(name)) AND + name <> 'config_file' AND category <> 'Customized Options' + ORDER BY 1"); +# Note the lower-case conversion, for consistency. +my @all_params_array = split("\n", lc($all_params)); + +# Grab the names of all parameters marked as NOT_IN_SAMPLE. +my $not_in_sample = $node->safe_psql( + 'postgres', + "SELECT name + FROM pg_settings + WHERE 'NOT_IN_SAMPLE' = ANY (pg_settings_get_flags(name)) + ORDER BY 1"); +my @not_in_sample_array = split("\n", lc($not_in_sample)); + +# use the sample file from the temp install +my $share_dir = $node->config_data('--sharedir'); +my $sample_file = "$share_dir/postgresql.conf.sample"; + +# List of all the GUCs found in the sample file. +my @gucs_in_file; + +# Read the sample file line-by-line, checking its contents to build a list +# of everything known as a GUC. +my $num_tests = 0; +open(my $contents, '<', $sample_file) + || die "Could not open $sample_file: $!"; +while (my $line = <$contents>) +{ + # Check if this line matches a GUC parameter: + # - Each parameter is preceded by "#", but not "# " in the sample + # file. + # - Valid configuration options are followed immediately by " = ", + # with one space before and after the equal sign. + if ($line =~ m/^#?([_[:alpha:]]+) = .*/) + { + # Lower-case conversion matters for some of the GUCs. + my $param_name = lc($1); + + # Ignore some exceptions. + next if $param_name eq "include"; + next if $param_name eq "include_dir"; + next if $param_name eq "include_if_exists"; + + # Update the list of GUCs found in the sample file, for the + # follow-up tests. + push @gucs_in_file, $param_name; + } +} + +close $contents; + +# Cross-check that all the GUCs found in the sample file match the ones +# fetched above. This maps the arrays to a hash, making the creation of +# each exclude and intersection list easier. +my %gucs_in_file_hash = map { $_ => 1 } @gucs_in_file; +my %all_params_hash = map { $_ => 1 } @all_params_array; +my %not_in_sample_hash = map { $_ => 1 } @not_in_sample_array; + +my @missing_from_file = grep(!$gucs_in_file_hash{$_}, @all_params_array); +is(scalar(@missing_from_file), + 0, "no parameters missing from postgresql.conf.sample"); + +my @missing_from_list = grep(!$all_params_hash{$_}, @gucs_in_file); +is(scalar(@missing_from_list), 0, "no parameters missing from guc.c"); + +my @sample_intersect = grep($not_in_sample_hash{$_}, @gucs_in_file); +is(scalar(@sample_intersect), + 0, "no parameters marked as NOT_IN_SAMPLE in postgresql.conf.sample"); + +# These would log some information only on errors. +foreach my $param (@missing_from_file) +{ + print("found GUC $param in guc.c, missing from postgresql.conf.sample\n"); +} +foreach my $param (@missing_from_list) +{ + print( + "found GUC $param in postgresql.conf.sample, with incorrect info in guc.c\n" + ); +} +foreach my $param (@sample_intersect) +{ + print( + "found GUC $param in postgresql.conf.sample, marked as NOT_IN_SAMPLE\n" + ); +} + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/test_oat_hooks/.gitignore b/third_party/spanner_pg/src/test/modules/test_oat_hooks/.gitignore new file mode 100644 index 00000000..5dcb3ff9 --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_oat_hooks/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/third_party/spanner_pg/src/test/modules/test_oat_hooks/Makefile b/third_party/spanner_pg/src/test/modules/test_oat_hooks/Makefile new file mode 100644 index 00000000..2b5d2687 --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_oat_hooks/Makefile @@ -0,0 +1,26 @@ +# 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 + +# 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 +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/third_party/spanner_pg/src/test/modules/test_oat_hooks/README b/third_party/spanner_pg/src/test/modules/test_oat_hooks/README new file mode 100644 index 00000000..70c792a4 --- /dev/null +++ b/third_party/spanner_pg/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 control 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/third_party/spanner_pg/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out b/third_party/spanner_pg/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out new file mode 100644 index 00000000..194ee7dd --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out @@ -0,0 +1,309 @@ +-- This test script fails if debug_discard_caches is enabled, because cache +-- flushes cause extra calls of the OAT hook in recomputeNamespacePath, +-- resulting in more NOTICE messages than are in the expected output. +SET debug_discard_caches = 0; +-- Creating privileges on a placeholder GUC should create entries in the +-- pg_parameter_acl catalog which conservatively grant no privileges to public. +CREATE ROLE regress_role_joe; +GRANT SET ON PARAMETER test_oat_hooks.user_var1 TO regress_role_joe; +GRANT SET ON PARAMETER test_oat_hooks.super_var1 TO regress_role_joe; +-- 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. +LOAD 'test_oat_hooks'; +SET test_oat_hooks.audit = true; +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [test_oat_hooks.audit] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [test_oat_hooks.audit] +NOTICE: in process utility: superuser finished SET +-- Creating privileges on an existent custom GUC should create precisely the +-- right privileges, not overly conservative ones. +GRANT SET ON PARAMETER test_oat_hooks.user_var2 TO regress_role_joe; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +GRANT SET ON PARAMETER test_oat_hooks.super_var2 TO regress_role_joe; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +-- Granting multiple privileges on a parameter should be reported correctly to +-- the OAT hook, but beware that WITH GRANT OPTION is not represented. +GRANT SET, ALTER SYSTEM ON PARAMETER none.such TO regress_role_joe; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +GRANT SET, ALTER SYSTEM ON PARAMETER another.bogus TO regress_role_joe WITH GRANT OPTION; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +-- Check when the hooks fire relative to dependency based abort of a drop +DROP ROLE regress_role_joe; +NOTICE: in process utility: superuser attempting DROP ROLE +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +ERROR: role "regress_role_joe" cannot be dropped because some objects depend on it +DETAIL: privileges for parameter test_oat_hooks.user_var1 +privileges for parameter test_oat_hooks.super_var1 +privileges for parameter test_oat_hooks.user_var2 +privileges for parameter test_oat_hooks.super_var2 +privileges for parameter none.such +privileges for parameter another.bogus +-- Check the behavior of the hooks relative to do-nothing grants and revokes +GRANT SET ON PARAMETER maintenance_work_mem TO PUBLIC; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +REVOKE SET ON PARAMETER maintenance_work_mem FROM PUBLIC; +NOTICE: in process utility: superuser attempting REVOKE +NOTICE: in process utility: superuser finished REVOKE +REVOKE ALTER SYSTEM ON PARAMETER maintenance_work_mem FROM PUBLIC; +NOTICE: in process utility: superuser attempting REVOKE +NOTICE: in process utility: superuser finished REVOKE +-- Check the behavior of the hooks relative to unrecognized parameters +GRANT ALL ON PARAMETER "none.such" TO PUBLIC; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +-- Check relative to an operation that causes the catalog entry to be deleted +REVOKE ALL ON PARAMETER "none.such" FROM PUBLIC; +NOTICE: in process utility: superuser attempting REVOKE +NOTICE: in process utility: superuser finished REVOKE +-- Create objects for use in the test +CREATE USER regress_test_user; +NOTICE: in process utility: superuser attempting CREATE ROLE +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE ROLE +CREATE TABLE regress_test_table (t text); +NOTICE: in process utility: superuser attempting CREATE TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +LINE 1: CREATE TABLE regress_test_table (t text); + ^ +NOTICE: in object access: superuser finished namespace search (subId=0x0) [no report on violation, allowed] +LINE 1: CREATE TABLE regress_test_table (t text); + ^ +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [internal] +NOTICE: in object access: superuser finished create (subId=0x0) [internal] +NOTICE: in object access: superuser attempting create (subId=0x0) [internal] +NOTICE: in object access: superuser finished create (subId=0x0) [internal] +NOTICE: in process utility: superuser finished CREATE TABLE +GRANT SELECT ON Table regress_test_table TO public; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +CREATE FUNCTION regress_test_func (t text) RETURNS text AS $$ + SELECT $1; +$$ LANGUAGE sql; +NOTICE: in process utility: superuser attempting CREATE FUNCTION +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE FUNCTION +GRANT EXECUTE ON FUNCTION regress_test_func (text) TO public; +NOTICE: in process utility: superuser attempting GRANT +NOTICE: in process utility: superuser finished GRANT +-- 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 (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: superuser finished SET +RESET work_mem; +NOTICE: in process utility: superuser attempting RESET +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: superuser finished RESET +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: superuser attempting ALTER SYSTEM +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x2000, alter system) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x2000, alter system) [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 (subId=0x2000, alter system) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x2000, alter system) [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 (subId=0x1000, set) [session_authorization] +NOTICE: in object_access_hook_str: non-superuser finished alter (subId=0x1000, 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=0x0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in object access: non-superuser finished namespace search (subId=0x0) [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 (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: non-superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: non-superuser finished SET +RESET work_mem; +NOTICE: in process utility: non-superuser attempting RESET +NOTICE: in object_access_hook_str: non-superuser attempting alter (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: non-superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: non-superuser finished RESET +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "work_mem" +ALTER SYSTEM RESET work_mem; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "work_mem" +SET test_oat_hooks.user_var1 = true; +NOTICE: in process utility: non-superuser attempting SET +NOTICE: in object_access_hook_str: non-superuser attempting alter (subId=0x1000, set) [test_oat_hooks.user_var1] +NOTICE: in object_access_hook_str: non-superuser finished alter (subId=0x1000, set) [test_oat_hooks.user_var1] +NOTICE: in process utility: non-superuser finished SET +SET test_oat_hooks.super_var1 = true; +NOTICE: in process utility: non-superuser attempting SET +ERROR: permission denied to set parameter "test_oat_hooks.super_var1" +ALTER SYSTEM SET test_oat_hooks.user_var1 = true; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "test_oat_hooks.user_var1" +ALTER SYSTEM SET test_oat_hooks.super_var1 = true; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "test_oat_hooks.super_var1" +SET test_oat_hooks.user_var2 = true; +NOTICE: in process utility: non-superuser attempting SET +NOTICE: in object_access_hook_str: non-superuser attempting alter (subId=0x1000, set) [test_oat_hooks.user_var2] +NOTICE: in object_access_hook_str: non-superuser finished alter (subId=0x1000, set) [test_oat_hooks.user_var2] +NOTICE: in process utility: non-superuser finished SET +SET test_oat_hooks.super_var2 = true; +NOTICE: in process utility: non-superuser attempting SET +ERROR: permission denied to set parameter "test_oat_hooks.super_var2" +ALTER SYSTEM SET test_oat_hooks.user_var2 = true; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "test_oat_hooks.user_var2" +ALTER SYSTEM SET test_oat_hooks.super_var2 = true; +NOTICE: in process utility: non-superuser attempting ALTER SYSTEM +ERROR: permission denied to set parameter "test_oat_hooks.super_var2" +RESET SESSION AUTHORIZATION; +NOTICE: in process utility: non-superuser attempting RESET +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [session_authorization] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [session_authorization] +NOTICE: in process utility: superuser finished RESET +-- 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 (subId=0x1000, set) [test_oat_hooks.deny_set_variable] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, 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 (subId=0x1000, set) [test_oat_hooks.deny_alter_system] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, 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 (subId=0x1000, set) [test_oat_hooks.deny_object_access] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, 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 (subId=0x1000, set) [test_oat_hooks.deny_exec_perms] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, 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 (subId=0x1000, set) [test_oat_hooks.deny_utility_commands] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [test_oat_hooks.deny_utility_commands] +NOTICE: in process utility: superuser finished SET +-- 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 (subId=0x1000, set) [session_authorization] +ERROR: permission denied: set session_authorization +SELECT * FROM regress_test_table; +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +LINE 1: SELECT * FROM regress_test_table; + ^ +NOTICE: in object access: superuser finished namespace search (subId=0x0) [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 (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: superuser finished SET +RESET work_mem; +NOTICE: in process utility: superuser attempting RESET +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [work_mem] +NOTICE: in process utility: superuser finished RESET +ALTER SYSTEM SET work_mem = 8192; +NOTICE: in process utility: superuser attempting ALTER SYSTEM +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x2000, alter system) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x2000, alter system) [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 (subId=0x2000, alter system) [work_mem] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x2000, alter system) [work_mem] +NOTICE: in process utility: superuser finished ALTER SYSTEM +-- Clean up +RESET SESSION AUTHORIZATION; +NOTICE: in process utility: superuser attempting RESET +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [session_authorization] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [session_authorization] +NOTICE: in process utility: superuser finished RESET +SET test_oat_hooks.audit = false; +NOTICE: in process utility: superuser attempting SET +DROP ROLE regress_role_joe; -- fails +ERROR: role "regress_role_joe" cannot be dropped because some objects depend on it +DETAIL: privileges for parameter test_oat_hooks.user_var1 +privileges for parameter test_oat_hooks.super_var1 +privileges for parameter test_oat_hooks.user_var2 +privileges for parameter test_oat_hooks.super_var2 +privileges for parameter none.such +privileges for parameter another.bogus +REVOKE ALL PRIVILEGES ON PARAMETER + none.such, another.bogus, + test_oat_hooks.user_var1, test_oat_hooks.super_var1, + test_oat_hooks.user_var2, test_oat_hooks.super_var2 + FROM regress_role_joe; +DROP ROLE regress_role_joe; +DROP ROLE regress_test_user; diff --git a/third_party/spanner_pg/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql b/third_party/spanner_pg/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql new file mode 100644 index 00000000..ebbd6a1d --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_oat_hooks/sql/test_oat_hooks.sql @@ -0,0 +1,107 @@ +-- This test script fails if debug_discard_caches is enabled, because cache +-- flushes cause extra calls of the OAT hook in recomputeNamespacePath, +-- resulting in more NOTICE messages than are in the expected output. +SET debug_discard_caches = 0; + +-- Creating privileges on a placeholder GUC should create entries in the +-- pg_parameter_acl catalog which conservatively grant no privileges to public. +CREATE ROLE regress_role_joe; +GRANT SET ON PARAMETER test_oat_hooks.user_var1 TO regress_role_joe; +GRANT SET ON PARAMETER test_oat_hooks.super_var1 TO regress_role_joe; + +-- 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. +LOAD 'test_oat_hooks'; +SET test_oat_hooks.audit = true; + +-- Creating privileges on an existent custom GUC should create precisely the +-- right privileges, not overly conservative ones. +GRANT SET ON PARAMETER test_oat_hooks.user_var2 TO regress_role_joe; +GRANT SET ON PARAMETER test_oat_hooks.super_var2 TO regress_role_joe; + +-- Granting multiple privileges on a parameter should be reported correctly to +-- the OAT hook, but beware that WITH GRANT OPTION is not represented. +GRANT SET, ALTER SYSTEM ON PARAMETER none.such TO regress_role_joe; +GRANT SET, ALTER SYSTEM ON PARAMETER another.bogus TO regress_role_joe WITH GRANT OPTION; + +-- Check when the hooks fire relative to dependency based abort of a drop +DROP ROLE regress_role_joe; + +-- Check the behavior of the hooks relative to do-nothing grants and revokes +GRANT SET ON PARAMETER maintenance_work_mem TO PUBLIC; +REVOKE SET ON PARAMETER maintenance_work_mem FROM PUBLIC; +REVOKE ALTER SYSTEM ON PARAMETER maintenance_work_mem FROM PUBLIC; + +-- Check the behavior of the hooks relative to unrecognized parameters +GRANT ALL ON PARAMETER "none.such" TO PUBLIC; + +-- Check relative to an operation that causes the catalog entry to be deleted +REVOKE ALL ON PARAMETER "none.such" FROM PUBLIC; + +-- 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; + +SET test_oat_hooks.user_var1 = true; +SET test_oat_hooks.super_var1 = true; +ALTER SYSTEM SET test_oat_hooks.user_var1 = true; +ALTER SYSTEM SET test_oat_hooks.super_var1 = true; +SET test_oat_hooks.user_var2 = true; +SET test_oat_hooks.super_var2 = true; +ALTER SYSTEM SET test_oat_hooks.user_var2 = true; +ALTER SYSTEM SET test_oat_hooks.super_var2 = true; + +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 permissions 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; + +-- Clean up +RESET SESSION AUTHORIZATION; + +SET test_oat_hooks.audit = false; +DROP ROLE regress_role_joe; -- fails +REVOKE ALL PRIVILEGES ON PARAMETER + none.such, another.bogus, + test_oat_hooks.user_var1, test_oat_hooks.super_var1, + test_oat_hooks.user_var2, test_oat_hooks.super_var2 + FROM regress_role_joe; +DROP ROLE regress_role_joe; +DROP ROLE regress_test_user; diff --git a/third_party/spanner_pg/src/test/modules/test_oat_hooks/test_oat_hooks.c b/third_party/spanner_pg/src/test/modules/test_oat_hooks/test_oat_hooks.c new file mode 100644 index 00000000..5e387fae --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/test_oat_hooks/test_oat_hooks.c @@ -0,0 +1,520 @@ +/*-------------------------------------------------------------------------- + * + * 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 "access/parallel.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; + +/* + * GUCs for testing privileges on USERSET and SUSET variables, + * with and without privileges granted prior to module load. + */ +static bool REGRESS_userset_variable1 = false; +static bool REGRESS_userset_variable2 = false; +static bool REGRESS_suset_variable1 = false; +static bool REGRESS_suset_variable2 = false; + +/* Saved hook values */ +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 char *accesstype_to_string(ObjectAccessType access, int subId); +static char *accesstype_arg_to_string(ObjectAccessType access, void *arg); + + +void _PG_init(void); + +/* + * Module load callback + */ +void +_PG_init(void) +{ + /* + * 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); + + /* + * test_oat_hooks.user_var{1,2} = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.user_var1", + "Dummy parameter settable by public", + NULL, + ®RESS_userset_variable1, + false, + PGC_USERSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + DefineCustomBoolVariable("test_oat_hooks.user_var2", + "Dummy parameter settable by public", + NULL, + ®RESS_userset_variable2, + false, + PGC_USERSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + /* + * test_oat_hooks.super_var{1,2} = (on|off) + */ + DefineCustomBoolVariable("test_oat_hooks.super_var1", + "Dummy parameter settable by superuser", + NULL, + ®RESS_suset_variable1, + false, + PGC_SUSET, + GUC_NOT_IN_SAMPLE, + NULL, + NULL, + NULL); + + DefineCustomBoolVariable("test_oat_hooks.super_var2", + "Dummy parameter settable by superuser", + NULL, + ®RESS_suset_variable2, + 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; +} + +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"; + + 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) && (subId & ACL_ALTER_SYSTEM)) + { + if (REGRESS_deny_set_variable && !superuser_arg(GetUserId())) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied: all privileges %s", objName))); + } + else if (subId & ACL_SET) + { + 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 ParameterAclRelationId 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 = GetCommandTagName(CreateCommandTag(parsetree)); + + 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 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) && (subId & ACL_ALTER_SYSTEM)) + return psprintf("%s (subId=0x%x, all privileges)", type, subId); + if (subId & ACL_SET) + return psprintf("%s (subId=0x%x, set)", type, subId); + if (subId & ACL_ALTER_SYSTEM) + return psprintf("%s (subId=0x%x, alter system)", type, subId); + + return psprintf("%s (subId=0x%x)", 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/third_party/spanner_pg/src/test/modules/test_parser/test_parser.c b/third_party/spanner_pg/src/test/modules/test_parser/test_parser.c index f133676d..ec1e1b60 100644 --- a/third_party/spanner_pg/src/test/modules/test_parser/test_parser.c +++ b/third_party/spanner_pg/src/test/modules/test_parser/test_parser.c @@ -3,7 +3,7 @@ * test_parser.c * Simple example of a text search parser * - * Copyright (c) 2007-2021, PostgreSQL Global Development Group + * Copyright (c) 2007-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_parser/test_parser.c diff --git a/third_party/spanner_pg/src/test/modules/test_pg_dump/t/001_base.pl b/third_party/spanner_pg/src/test/modules/test_pg_dump/t/001_base.pl index 4baca365..23a7901a 100644 --- a/third_party/spanner_pg/src/test/modules/test_pg_dump/t/001_base.pl +++ b/third_party/spanner_pg/src/test/modules/test_pg_dump/t/001_base.pl @@ -1,16 +1,14 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use Config; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; -my $tempdir = TestLib::tempdir; -my $tempdir_short = TestLib::tempdir_short; +my $tempdir = PostgreSQL::Test::Utils::tempdir; ############################################################### # This structure is based off of the src/bin/pg_dump/t test @@ -29,7 +27,7 @@ # 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 -# PostgresNode system. +# PostgreSQL::Test::Cluster system. # # restore_cmd is the pg_restore command to run, if any. Note # that this should generally be used when the pg_dump goes to @@ -172,6 +170,19 @@ 'postgres', ], }, + + # regress_dump_login_role shouldn't need SELECT rights on internal + # (undumped) extension tables + privileged_internals => { + dump_cmd => [ + 'pg_dump', '--no-sync', "--file=$tempdir/privileged_internals.sql", + # these two tables are irrelevant to the test case + '--exclude-table=regress_pg_dump_schema.external_tab', + '--exclude-table=regress_pg_dump_schema.extdependtab', + '--username=regress_dump_login_role', 'postgres', + ], + }, + schema_only => { dump_cmd => [ 'pg_dump', '--no-sync', "--file=$tempdir/schema_only.sql", @@ -281,6 +292,7 @@ exclude_table => 1, no_privs => 1, no_owner => 1, + privileged_internals => 1, with_extension => 1, without_extension => 1); @@ -318,6 +330,56 @@ like => { pg_dumpall_globals => 1, }, }, + 'CREATE ROLE regress_dump_login_role' => { + create_order => 1, + create_sql => 'CREATE ROLE regress_dump_login_role LOGIN;', + regexp => qr/^ + \QCREATE ROLE regress_dump_login_role;\E + \n\QALTER ROLE regress_dump_login_role WITH \E.*\Q LOGIN \E.*; + \n/xm, + like => { 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 => { + extension_schema => 1, + without_extension_explicit_schema => 1, + }, + }, + 'CREATE SEQUENCE regress_pg_dump_table_col1_seq' => { regexp => qr/^ \QCREATE SEQUENCE public.regress_pg_dump_table_col1_seq\E @@ -661,6 +723,7 @@ data_only => 1, extension_schema => 1, pg_dumpall_globals => 1, + privileged_internals => 1, section_data => 1, section_pre_data => 1, # Excludes this schema as extension is not listed. @@ -677,6 +740,7 @@ data_only => 1, extension_schema => 1, pg_dumpall_globals => 1, + privileged_internals => 1, section_data => 1, section_pre_data => 1, # Excludes this schema as extension is not listed. @@ -700,55 +764,18 @@ # Excludes the extension and keeps the schema's data. without_extension_internal_schema => 1, }, + unlike => { privileged_internals => 1 }, },); ######################################### # Create a PG instance to test actually dumping from -my $node = get_new_node('main'); -$node->init; +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init('auth_extra' => [ '--create-role', 'regress_dump_login_role' ]); $node->start; my $port = $node->port; -my $num_tests = 0; - -foreach my $run (sort keys %pgdump_runs) -{ - my $test_key = $run; - - # Each run of pg_dump is a test itself - $num_tests++; - - # If there is a restore cmd, that's another test - if ($pgdump_runs{$run}->{restore_cmd}) - { - $num_tests++; - } - - if ($pgdump_runs{$run}->{test_key}) - { - $test_key = $pgdump_runs{$run}->{test_key}; - } - - # Then count all the tests run against each run - foreach my $test (sort keys %tests) - { - # If there is a like entry, but no unlike entry, then we will test the like case - if ($tests{$test}->{like}->{$test_key} - && !defined($tests{$test}->{unlike}->{$test_key})) - { - $num_tests++; - } - else - { - # We will test everything that isn't a 'like' - $num_tests++; - } - } -} -plan tests => $num_tests; - ######################################### # Set up schemas, tables, etc, to be dumped. @@ -840,3 +867,5 @@ # Stop the database instance, which will be removed at the end of the tests. $node->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql b/third_party/spanner_pg/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql index 110f7eef..1c68e146 100644 --- a/third_party/spanner_pg/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql +++ b/third_party/spanner_pg/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql @@ -12,11 +12,13 @@ CREATE SEQUENCE regress_pg_dump_seq; CREATE SEQUENCE regress_seq_dumpable; SELECT pg_catalog.pg_extension_config_dump('regress_seq_dumpable', ''); +GRANT SELECT ON SEQUENCE regress_seq_dumpable TO public; CREATE TABLE regress_table_dumpable ( col1 int check (col1 > 0) ); SELECT pg_catalog.pg_extension_config_dump('regress_table_dumpable', ''); +GRANT SELECT ON regress_table_dumpable TO public; CREATE SCHEMA regress_pg_dump_schema; diff --git a/third_party/spanner_pg/src/test/modules/test_predtest/test_predtest.c b/third_party/spanner_pg/src/test/modules/test_predtest/test_predtest.c index 9c0aadd6..3b19e0ea 100644 --- a/third_party/spanner_pg/src/test/modules/test_predtest/test_predtest.c +++ b/third_party/spanner_pg/src/test/modules/test_predtest/test_predtest.c @@ -3,7 +3,7 @@ * test_predtest.c * Test correctness of optimizer's predicate proof logic. * - * Copyright (c) 2018-2021, PostgreSQL Global Development Group + * Copyright (c) 2018-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_predtest/test_predtest.c @@ -131,8 +131,8 @@ test_predtest(PG_FUNCTION_ARGS) elog(ERROR, "failed to decipher query plan"); plan = stmt->planTree; Assert(list_length(plan->targetlist) >= 2); - clause1 = castNode(TargetEntry, linitial(plan->targetlist))->expr; - clause2 = castNode(TargetEntry, lsecond(plan->targetlist))->expr; + clause1 = linitial_node(TargetEntry, plan->targetlist)->expr; + clause2 = lsecond_node(TargetEntry, plan->targetlist)->expr; /* * Because the clauses are in the SELECT list, preprocess_expression did diff --git a/third_party/spanner_pg/src/test/modules/test_rbtree/test_rbtree.c b/third_party/spanner_pg/src/test/modules/test_rbtree/test_rbtree.c index 713ebd1b..7cb38759 100644 --- a/third_party/spanner_pg/src/test/modules/test_rbtree/test_rbtree.c +++ b/third_party/spanner_pg/src/test/modules/test_rbtree/test_rbtree.c @@ -3,7 +3,7 @@ * test_rbtree.c * Test correctness of red-black tree operations. * - * Copyright (c) 2009-2021, PostgreSQL Global Development Group + * Copyright (c) 2009-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rbtree/test_rbtree.c @@ -13,6 +13,7 @@ #include "postgres.h" +#include "common/pg_prng.h" #include "fmgr.h" #include "lib/rbtree.h" #include "utils/memutils.h" @@ -108,7 +109,7 @@ GetPermutation(int size) */ for (i = 1; i < size; i++) { - int j = random() % (i + 1); + int j = pg_prng_uint64_range(&pg_global_prng_state, 0, i); if (j < i) /* avoid fetching undefined data if j=i */ permutation[i] = permutation[j]; @@ -320,7 +321,7 @@ testdelete(int size, int delsize) for (i = 0; i < delsize; i++) { - int k = random() % size; + int k = pg_prng_uint64_range(&pg_global_prng_state, 0, size - 1); while (chosen[k]) k = (k + 1) % size; diff --git a/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex.out b/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex.out index 06f8881c..731ba506 100644 --- a/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex.out +++ b/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex.out @@ -146,12 +146,12 @@ select * from test_regex('(a)e', 'ae', '-'); {ae,a} (2 rows) --- expectMatch 4.2 o (a)e ae -select * from test_regex('(a)e', 'ae', 'o'); - test_regex ------------- - {0} - {NULL} +-- expectMatch 4.2 oPR (.)\1e abeaae aae {} +select * from test_regex('(.)\1e', 'abeaae', 'oPR'); + test_regex +-------------------------------- + {1,REG_UBACKREF,REG_UNONPOSIX} + {aae,NULL} (2 rows) -- expectMatch 4.3 b {\(a\)b} ab ab a @@ -937,6 +937,34 @@ select * from test_regex('a[[=x=]]', 'az', '+Lb'); {0,REG_ULOCALE} (1 row) +-- expectMatch 9.9b &iL {a[[=Y=]]} ay ay +select * from test_regex('a[[=Y=]]', 'ay', 'iL'); + test_regex +----------------- + {0,REG_ULOCALE} + {ay} +(2 rows) + +select * from test_regex('a[[=Y=]]', 'ay', 'iLb'); + test_regex +----------------- + {0,REG_ULOCALE} + {ay} +(2 rows) + +-- expectNomatch 9.9c &L {a[[=Y=]]} ay +select * from test_regex('a[[=Y=]]', 'ay', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} +(1 row) + +select * from test_regex('a[[=Y=]]', 'ay', 'Lb'); + test_regex +----------------- + {0,REG_ULOCALE} +(1 row) + -- expectError 9.10 & {a[0-[=x=]]} ERANGE select * from test_regex('a[0-[=x=]]', '', ''); ERROR: invalid regular expression: invalid character range @@ -2672,6 +2700,20 @@ select * from test_regex('(\w+(?= )).*\1', 'abc abcd abd', 'HLRP'); {"abc abc",abc} (2 rows) +-- exercise oversize-regmatch_t-array paths in regexec() +-- (that case is not reachable via test_regex, sadly) +select substring('fffoooooooooooooooooooooooooooooooo', '^(.)\1(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)'); + substring +----------- + f +(1 row) + +select regexp_split_to_array('abcxxxdefyyyghi', '((.))(\1\2)'); + regexp_split_to_array +----------------------- + {abc,def,ghi} +(1 row) + -- doing 15 "octal escapes vs back references" -- # initial zero is always octal -- expectMatch 15.1 MP "a\\010b" "a\bb" "a\bb" @@ -2932,6 +2974,34 @@ select * from test_regex('a[^b-d]', 'aC', 'iMb'); {0,REG_UUNPORT} (1 row) +-- expectMatch 19.6 &iM {a[B-Z]} aC aC +select * from test_regex('a[B-Z]', 'aC', 'iM'); + test_regex +----------------- + {0,REG_UUNPORT} + {aC} +(2 rows) + +select * from test_regex('a[B-Z]', 'aC', 'iMb'); + test_regex +----------------- + {0,REG_UUNPORT} + {aC} +(2 rows) + +-- expectNomatch 19.7 &iM {a[^B-Z]} aC +select * from test_regex('a[^B-Z]', 'aC', 'iM'); + test_regex +----------------- + {0,REG_UUNPORT} +(1 row) + +select * from test_regex('a[^B-Z]', 'aC', 'iMb'); + test_regex +----------------- + {0,REG_UUNPORT} +(1 row) + -- doing 20 "directors and embedded options" -- expectError 20.1 & ***? BADPAT select * from test_regex('***?', '', ''); @@ -3490,6 +3560,22 @@ select * from test_regex('((.))(\2){0}', 'xy', 'RPQ'); {x,x,x,NULL} (2 rows) +-- expectMatch 21.37 RP ((.))(\2) xyy yy y y y +select * from test_regex('((.))(\2)', 'xyy', 'RP'); + test_regex +-------------------------------- + {3,REG_UBACKREF,REG_UNONPOSIX} + {yy,y,y,y} +(2 rows) + +-- expectMatch 21.38 oRP ((.))(\2) xyy yy {} {} {} +select * from test_regex('((.))(\2)', 'xyy', 'oRP'); + test_regex +-------------------------------- + {3,REG_UBACKREF,REG_UNONPOSIX} + {yy,NULL,NULL,NULL} +(2 rows) + -- expectNomatch 21.39 PQR {(.){0}(\1)} xxx select * from test_regex('(.){0}(\1)', 'xxx', 'PQR'); test_regex @@ -3856,6 +3942,14 @@ select * from test_regex('^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', 'foo/bar/baz', {foo/bar/baz,foo,bar,baz} (2 rows) +-- expectMatch 24.14 PRT {^(.+?)(?:/(.+?))(?:/(.+?)\3)?$} {foo/bar/baz/quux} {foo/bar/baz/quux} {foo} {bar/baz/quux} {} +select * from test_regex('^(.+?)(?:/(.+?))(?:/(.+?)\3)?$', 'foo/bar/baz/quux', 'PRT'); + test_regex +---------------------------------------------- + {3,REG_UBACKREF,REG_UNONPOSIX,REG_USHORTEST} + {foo/bar/baz/quux,foo,bar/baz/quux,NULL} +(2 rows) + -- doing 25 "mixed quantifiers" -- # this is very incomplete as yet -- # should include | @@ -4932,3 +5026,59 @@ select * from test_regex('(\Y)+', 'foo', 'LNP'); {"",""} (2 rows) +-- and now, tests not from either Spencer or the Tcl project +-- These cases exercise additional code paths in pushfwd()/push()/combine() +select * from test_regex('a\Y(?=45)', 'a45', 'HLP'); + test_regex +----------------------------------------------- + {0,REG_ULOOKAROUND,REG_UNONPOSIX,REG_ULOCALE} + {a} +(2 rows) + +select * from test_regex('a(?=.)c', 'ac', 'HP'); + test_regex +----------------------------------- + {0,REG_ULOOKAROUND,REG_UNONPOSIX} + {ac} +(2 rows) + +select * from test_regex('a(?=.).*(?=3)3*', 'azz33', 'HP'); + test_regex +----------------------------------- + {0,REG_ULOOKAROUND,REG_UNONPOSIX} + {azz33} +(2 rows) + +select * from test_regex('a(?=\w)\w*(?=.).*', 'az3%', 'HLP'); + test_regex +----------------------------------------------- + {0,REG_ULOOKAROUND,REG_UNONPOSIX,REG_ULOCALE} + {az3%} +(2 rows) + +-- These exercise the bulk-arc-movement paths in moveins() and moveouts(); +-- you may need to make them longer if you change BULK_ARC_OP_USE_SORT() +select * from test_regex('ABCDEFGHIJKLMNOPQRSTUVWXYZ(?:\w|a|b|c|d|e|f|0|1|2|3|4|5|6|Q)', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ3', 'LP'); + test_regex +------------------------------- + {0,REG_UNONPOSIX,REG_ULOCALE} + {ABCDEFGHIJKLMNOPQRSTUVWXYZ3} +(2 rows) + +select * from test_regex('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789(\Y\Y)+', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Z', 'LP'); + test_regex +------------------------------------------- + {1,REG_UNONPOSIX,REG_ULOCALE} + {ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,""} +(2 rows) + +select * from test_regex('((x|xabcdefghijklmnopqrstuvwxyz0123456789)x*|[^y]z)$', + 'az', ''); + test_regex +-------------- + {2} + {az,az,NULL} +(2 rows) + diff --git a/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex_utf8.out b/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex_utf8.out index 112698ac..befd75e9 100644 --- a/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex_utf8.out +++ b/third_party/spanner_pg/src/test/modules/test_regex/expected/test_regex_utf8.out @@ -98,3 +98,109 @@ select * from test_regex('[[:alnum:]]*[[:upper:]]*[\u1000-\u2000]*\u1237', {0,REG_UBBS,REG_UNONPOSIX,REG_UUNPORT,REG_ULOCALE} (1 row) +select * from test_regex('[[:alnum:]]*[[:upper:]]*[\u1000-\u2000]*\u1237', + E'\u1500\u1237', 'iELMP'); + test_regex +---------------------------------------------------- + {0,REG_UBBS,REG_UNONPOSIX,REG_UUNPORT,REG_ULOCALE} + {ᔀሷ} +(2 rows) + +-- systematically test char classes +select * from test_regex('[[:alnum:]]+', E'x*\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {x} +(2 rows) + +select * from test_regex('[[:alpha:]]+', E'x*\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {x} +(2 rows) + +select * from test_regex('[[:ascii:]]+', E'x\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {x} +(2 rows) + +select * from test_regex('[[:blank:]]+', E'x \t\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {" "} +(2 rows) + +select * from test_regex('[[:cntrl:]]+', E'x\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} +(1 row) + +select * from test_regex('[[:digit:]]+', E'x9\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {9} +(2 rows) + +select * from test_regex('[[:graph:]]+', E'x\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {xᔀሷ} +(2 rows) + +select * from test_regex('[[:lower:]]+', E'x\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {x} +(2 rows) + +select * from test_regex('[[:print:]]+', E'x\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {xᔀሷ} +(2 rows) + +select * from test_regex('[[:punct:]]+', E'x.\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {.} +(2 rows) + +select * from test_regex('[[:space:]]+', E'x \t\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {" "} +(2 rows) + +select * from test_regex('[[:upper:]]+', E'xX\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {X} +(2 rows) + +select * from test_regex('[[:xdigit:]]+', E'xa9\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {a9} +(2 rows) + +select * from test_regex('[[:word:]]+', E'x_*\u1500\u1237', 'L'); + test_regex +----------------- + {0,REG_ULOCALE} + {x_} +(2 rows) + diff --git a/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex.sql b/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex.sql index bdc09010..478fa2c5 100644 --- a/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex.sql +++ b/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex.sql @@ -63,8 +63,8 @@ select * from test_regex('ab', 'ab', 'b'); -- expectMatch 4.1 - (a)e ae ae a select * from test_regex('(a)e', 'ae', '-'); --- expectMatch 4.2 o (a)e ae -select * from test_regex('(a)e', 'ae', 'o'); +-- expectMatch 4.2 oPR (.)\1e abeaae aae {} +select * from test_regex('(.)\1e', 'abeaae', 'oPR'); -- expectMatch 4.3 b {\(a\)b} ab ab a select * from test_regex('\(a\)b', 'ab', 'b'); -- expectMatch 4.4 - a((b)c) abc abc bc b @@ -304,6 +304,12 @@ select * from test_regex('a[[=x=]]', 'ay', '+Lb'); -- expectNomatch 9.9 &+L {a[[=x=]]} az select * from test_regex('a[[=x=]]', 'az', '+L'); select * from test_regex('a[[=x=]]', 'az', '+Lb'); +-- expectMatch 9.9b &iL {a[[=Y=]]} ay ay +select * from test_regex('a[[=Y=]]', 'ay', 'iL'); +select * from test_regex('a[[=Y=]]', 'ay', 'iLb'); +-- expectNomatch 9.9c &L {a[[=Y=]]} ay +select * from test_regex('a[[=Y=]]', 'ay', 'L'); +select * from test_regex('a[[=Y=]]', 'ay', 'Lb'); -- expectError 9.10 & {a[0-[=x=]]} ERANGE select * from test_regex('a[0-[=x=]]', '', ''); select * from test_regex('a[0-[=x=]]', '', 'b'); @@ -779,6 +785,11 @@ select * from test_regex('(^\w+).*\1', 'abc abc abc', 'LRP'); select * from test_regex('(^\w+\M).*\1', 'abc abcd abd', 'LRP'); select * from test_regex('(\w+(?= )).*\1', 'abc abcd abd', 'HLRP'); +-- exercise oversize-regmatch_t-array paths in regexec() +-- (that case is not reachable via test_regex, sadly) +select substring('fffoooooooooooooooooooooooooooooooo', '^(.)\1(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)'); +select regexp_split_to_array('abcxxxdefyyyghi', '((.))(\1\2)'); + -- doing 15 "octal escapes vs back references" -- # initial zero is always octal @@ -863,6 +874,12 @@ select * from test_regex('a[b-d]', 'aC', 'iMb'); -- expectNomatch 19.5 &iM {a[^b-d]} aC select * from test_regex('a[^b-d]', 'aC', 'iM'); select * from test_regex('a[^b-d]', 'aC', 'iMb'); +-- expectMatch 19.6 &iM {a[B-Z]} aC aC +select * from test_regex('a[B-Z]', 'aC', 'iM'); +select * from test_regex('a[B-Z]', 'aC', 'iMb'); +-- expectNomatch 19.7 &iM {a[^B-Z]} aC +select * from test_regex('a[^B-Z]', 'aC', 'iM'); +select * from test_regex('a[^B-Z]', 'aC', 'iMb'); -- doing 20 "directors and embedded options" @@ -1015,6 +1032,10 @@ select * from test_regex('(a*)*', 'bc', 'N'); select * from test_regex(' TO (([a-z0-9._]+|"([^"]+|"")+")+)', 'asd TO foo', 'M'); -- expectMatch 21.36 RPQ ((.))(\2){0} xy x x x {} select * from test_regex('((.))(\2){0}', 'xy', 'RPQ'); +-- expectMatch 21.37 RP ((.))(\2) xyy yy y y y +select * from test_regex('((.))(\2)', 'xyy', 'RP'); +-- expectMatch 21.38 oRP ((.))(\2) xyy yy {} {} {} +select * from test_regex('((.))(\2)', 'xyy', 'oRP'); -- expectNomatch 21.39 PQR {(.){0}(\1)} xxx select * from test_regex('(.){0}(\1)', 'xxx', 'PQR'); -- expectNomatch 21.40 PQR {((.)){0}(\2)} xxx @@ -1172,6 +1193,8 @@ select * from test_regex('z*4', '123zzzz456', '-'); select * from test_regex('z*?4', '123zzzz456', 'PT'); -- expectMatch 24.13 PT {^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$} {foo/bar/baz} {foo/bar/baz} {foo} {bar} {baz} select * from test_regex('^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$', 'foo/bar/baz', 'PT'); +-- expectMatch 24.14 PRT {^(.+?)(?:/(.+?))(?:/(.+?)\3)?$} {foo/bar/baz/quux} {foo/bar/baz/quux} {foo} {bar/baz/quux} {} +select * from test_regex('^(.+?)(?:/(.+?))(?:/(.+?)\3)?$', 'foo/bar/baz/quux', 'PRT'); -- doing 25 "mixed quantifiers" -- # this is very incomplete as yet @@ -1742,3 +1765,21 @@ select * from test_regex(repeat('x*y*z*', 200), 'x', 'N'); -- regexp {(\Y)+} foo -- } 1 select * from test_regex('(\Y)+', 'foo', 'LNP'); + + +-- and now, tests not from either Spencer or the Tcl project + +-- These cases exercise additional code paths in pushfwd()/push()/combine() +select * from test_regex('a\Y(?=45)', 'a45', 'HLP'); +select * from test_regex('a(?=.)c', 'ac', 'HP'); +select * from test_regex('a(?=.).*(?=3)3*', 'azz33', 'HP'); +select * from test_regex('a(?=\w)\w*(?=.).*', 'az3%', 'HLP'); + +-- These exercise the bulk-arc-movement paths in moveins() and moveouts(); +-- you may need to make them longer if you change BULK_ARC_OP_USE_SORT() +select * from test_regex('ABCDEFGHIJKLMNOPQRSTUVWXYZ(?:\w|a|b|c|d|e|f|0|1|2|3|4|5|6|Q)', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ3', 'LP'); +select * from test_regex('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789(\Y\Y)+', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Z', 'LP'); +select * from test_regex('((x|xabcdefghijklmnopqrstuvwxyz0123456789)x*|[^y]z)$', + 'az', ''); diff --git a/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex_utf8.sql b/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex_utf8.sql index cfd93961..2aa3e0f1 100644 --- a/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex_utf8.sql +++ b/third_party/spanner_pg/src/test/modules/test_regex/sql/test_regex_utf8.sql @@ -58,3 +58,21 @@ select * from test_regex('[[:alnum:]]*[[:upper:]]*[\u1000-\u2000]*\u1237', E'\u1500\u1237', 'ELMP'); select * from test_regex('[[:alnum:]]*[[:upper:]]*[\u1000-\u2000]*\u1237', E'A\u1239', 'ELMP'); +select * from test_regex('[[:alnum:]]*[[:upper:]]*[\u1000-\u2000]*\u1237', + E'\u1500\u1237', 'iELMP'); + +-- systematically test char classes +select * from test_regex('[[:alnum:]]+', E'x*\u1500\u1237', 'L'); +select * from test_regex('[[:alpha:]]+', E'x*\u1500\u1237', 'L'); +select * from test_regex('[[:ascii:]]+', E'x\u1500\u1237', 'L'); +select * from test_regex('[[:blank:]]+', E'x \t\u1500\u1237', 'L'); +select * from test_regex('[[:cntrl:]]+', E'x\u1500\u1237', 'L'); +select * from test_regex('[[:digit:]]+', E'x9\u1500\u1237', 'L'); +select * from test_regex('[[:graph:]]+', E'x\u1500\u1237', 'L'); +select * from test_regex('[[:lower:]]+', E'x\u1500\u1237', 'L'); +select * from test_regex('[[:print:]]+', E'x\u1500\u1237', 'L'); +select * from test_regex('[[:punct:]]+', E'x.\u1500\u1237', 'L'); +select * from test_regex('[[:space:]]+', E'x \t\u1500\u1237', 'L'); +select * from test_regex('[[:upper:]]+', E'xX\u1500\u1237', 'L'); +select * from test_regex('[[:xdigit:]]+', E'xa9\u1500\u1237', 'L'); +select * from test_regex('[[:word:]]+', E'x_*\u1500\u1237', 'L'); diff --git a/third_party/spanner_pg/src/test/modules/test_regex/test_regex.c b/third_party/spanner_pg/src/test/modules/test_regex/test_regex.c index 095751cf..e23a0bd0 100644 --- a/third_party/spanner_pg/src/test/modules/test_regex/test_regex.c +++ b/third_party/spanner_pg/src/test/modules/test_regex/test_regex.c @@ -3,7 +3,7 @@ * test_regex.c * Test harness for the regular expression package. * - * 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 * * IDENTIFICATION diff --git a/third_party/spanner_pg/src/test/modules/test_rls_hooks/Makefile b/third_party/spanner_pg/src/test/modules/test_rls_hooks/Makefile index a4f7d855..14ccc352 100644 --- a/third_party/spanner_pg/src/test/modules/test_rls_hooks/Makefile +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/modules/test_rls_hooks/rls_hooks.conf b/third_party/spanner_pg/src/test/modules/test_rls_hooks/rls_hooks.conf deleted file mode 100644 index a522c0e5..00000000 --- a/third_party/spanner_pg/src/test/modules/test_rls_hooks/rls_hooks.conf +++ /dev/null @@ -1 +0,0 @@ -shared_preload_libraries = test_rls_hooks diff --git a/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.c b/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.c index 02bf619d..c2b66f24 100644 --- a/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.c +++ b/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.c @@ -3,7 +3,7 @@ * test_rls_hooks.c * Code for testing RLS hooks. * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rls_hooks/test_rls_hooks.c @@ -31,34 +31,17 @@ PG_MODULE_MAGIC; -/* Saved hook values in case of unload */ -static row_security_policy_hook_type prev_row_security_policy_hook_permissive = NULL; -static row_security_policy_hook_type prev_row_security_policy_hook_restrictive = NULL; - void _PG_init(void); -void _PG_fini(void); /* Install hooks */ void _PG_init(void) { - /* Save values for unload */ - prev_row_security_policy_hook_permissive = row_security_policy_hook_permissive; - prev_row_security_policy_hook_restrictive = row_security_policy_hook_restrictive; - /* Set our hooks */ row_security_policy_hook_permissive = test_rls_hooks_permissive; row_security_policy_hook_restrictive = test_rls_hooks_restrictive; } -/* Uninstall hooks */ -void -_PG_fini(void) -{ - row_security_policy_hook_permissive = prev_row_security_policy_hook_permissive; - row_security_policy_hook_restrictive = prev_row_security_policy_hook_restrictive; -} - /* * Return permissive policies to be added */ diff --git a/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.control b/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.control deleted file mode 100644 index 9f9f13f7..00000000 --- a/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.h b/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.h index e5659c84..d4dd107e 100644 --- a/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.h +++ b/third_party/spanner_pg/src/test/modules/test_rls_hooks/test_rls_hooks.h @@ -3,7 +3,7 @@ * test_rls_hooks.h * Definitions for RLS hooks * - * Copyright (c) 2015-2021, PostgreSQL Global Development Group + * Copyright (c) 2015-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rls_hooks/test_rls_hooks.h diff --git a/third_party/spanner_pg/src/test/modules/test_shm_mq/setup.c b/third_party/spanner_pg/src/test/modules/test_shm_mq/setup.c index e05e97c6..6f1f4cf9 100644 --- a/third_party/spanner_pg/src/test/modules/test_shm_mq/setup.c +++ b/third_party/spanner_pg/src/test/modules/test_shm_mq/setup.c @@ -5,7 +5,7 @@ * number of background workers for shared memory message queue * testing. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/setup.c diff --git a/third_party/spanner_pg/src/test/modules/test_shm_mq/test.c b/third_party/spanner_pg/src/test/modules/test_shm_mq/test.c index 2d8d695f..5a788692 100644 --- a/third_party/spanner_pg/src/test/modules/test_shm_mq/test.c +++ b/third_party/spanner_pg/src/test/modules/test_shm_mq/test.c @@ -3,7 +3,7 @@ * test.c * Test harness code for shared memory message queues. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/test.c @@ -73,7 +73,7 @@ test_shm_mq(PG_FUNCTION_ARGS) test_shm_mq_setup(queue_size, nworkers, &seg, &outqh, &inqh); /* Send the initial message. */ - res = shm_mq_send(outqh, message_size, message_contents, false); + res = shm_mq_send(outqh, message_size, message_contents, false, true); if (res != SHM_MQ_SUCCESS) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), @@ -97,7 +97,7 @@ test_shm_mq(PG_FUNCTION_ARGS) break; /* Send it back out. */ - res = shm_mq_send(outqh, len, data, false); + res = shm_mq_send(outqh, len, data, false, true); if (res != SHM_MQ_SUCCESS) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), @@ -177,7 +177,8 @@ test_shm_mq_pipelined(PG_FUNCTION_ARGS) */ if (send_count < loop_count) { - res = shm_mq_send(outqh, message_size, message_contents, true); + res = shm_mq_send(outqh, message_size, message_contents, true, + true); if (res == SHM_MQ_SUCCESS) { ++send_count; diff --git a/third_party/spanner_pg/src/test/modules/test_shm_mq/test_shm_mq.h b/third_party/spanner_pg/src/test/modules/test_shm_mq/test_shm_mq.h index a6661218..0310caf5 100644 --- a/third_party/spanner_pg/src/test/modules/test_shm_mq/test_shm_mq.h +++ b/third_party/spanner_pg/src/test/modules/test_shm_mq/test_shm_mq.h @@ -3,7 +3,7 @@ * test_shm_mq.h * Definitions for shared memory message queues * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/test_shm_mq.h diff --git a/third_party/spanner_pg/src/test/modules/test_shm_mq/worker.c b/third_party/spanner_pg/src/test/modules/test_shm_mq/worker.c index 2180776a..9128912a 100644 --- a/third_party/spanner_pg/src/test/modules/test_shm_mq/worker.c +++ b/third_party/spanner_pg/src/test/modules/test_shm_mq/worker.c @@ -9,7 +9,7 @@ * but it should be possible to use much of the control logic just * as presented here. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/worker.c @@ -190,7 +190,7 @@ copy_messages(shm_mq_handle *inqh, shm_mq_handle *outqh) break; /* Send it back out. */ - res = shm_mq_send(outqh, len, data, false); + res = shm_mq_send(outqh, len, data, false, true); if (res != SHM_MQ_SUCCESS) break; } diff --git a/third_party/spanner_pg/src/test/modules/unsafe_tests/Makefile b/third_party/spanner_pg/src/test/modules/unsafe_tests/Makefile index 1d989007..90d19791 100644 --- a/third_party/spanner_pg/src/test/modules/unsafe_tests/Makefile +++ b/third_party/spanner_pg/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 # the whole point of these tests is to not run installcheck NO_INSTALLCHECK = 1 diff --git a/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/alter_system_table.out b/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/alter_system_table.out index 4b2f63a9..be055950 100644 --- a/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/alter_system_table.out +++ b/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/alter_system_table.out @@ -53,7 +53,7 @@ ERROR: permission denied: "pg_description" is a system catalog CREATE TABLE foo (a oid, b oid, c int, FOREIGN KEY (a, b, c) REFERENCES pg_description); ERROR: permission denied: "pg_description" is a system catalog -- RangeVarCallbackOwnsRelation() -CREATE INDEX pg_descripton_test_index ON pg_description (description); +CREATE INDEX pg_description_test_index ON pg_description (description); ERROR: permission denied: "pg_description" is a system catalog -- RangeVarCallbackForAlterRelation() ALTER TABLE pg_description RENAME TO pg_comment; @@ -151,7 +151,7 @@ CREATE TABLE foo (a oid, b oid, c int, FOREIGN KEY (a, b, c) REFERENCES pg_descr ROLLBACK; -- RangeVarCallbackOwnsRelation() BEGIN; -CREATE INDEX pg_descripton_test_index ON pg_description (description); +CREATE INDEX pg_description_test_index ON pg_description (description); ROLLBACK; -- RangeVarCallbackForAlterRelation() BEGIN; diff --git a/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/guc_privs.out b/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/guc_privs.out new file mode 100644 index 00000000..54f95b23 --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/guc_privs.out @@ -0,0 +1,562 @@ +-- +-- 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) + +-- Make a per-role setting that regress_host_resource_admin can't change +ALTER ROLE regress_host_resource_admin SET lc_messages = 'C'; +-- 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 = '100kB'; -- ok, privileges have been granted +RESET max_stack_depth; -- 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" +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 +ALTER ROLE regress_host_resource_admin SET lc_messages = 'POSIX'; -- fail +ERROR: permission denied to set parameter "lc_messages" +ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; + setconfig +------------------------------------- + {lc_messages=C,max_stack_depth=1MB} +(1 row) + +ALTER ROLE regress_host_resource_admin RESET max_stack_depth; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; + setconfig +----------------- + {lc_messages=C} +(1 row) + +ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; + setconfig +------------------------------------- + {lc_messages=C,max_stack_depth=1MB} +(1 row) + +ALTER ROLE regress_host_resource_admin RESET ALL; -- doesn't reset lc_messages +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; + setconfig +----------------- + {lc_messages=C} +(1 row) + +-- 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/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/rolenames.out b/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/rolenames.out index eb608fdc..88b1ff84 100644 --- a/third_party/spanner_pg/src/test/modules/unsafe_tests/expected/rolenames.out +++ b/third_party/spanner_pg/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; diff --git a/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/alter_system_table.sql b/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/alter_system_table.sql index 6bfc896e..b77b68c9 100644 --- a/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/alter_system_table.sql +++ b/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/alter_system_table.sql @@ -55,7 +55,7 @@ ALTER TABLE pg_description ALTER COLUMN description SET STATISTICS -1; CREATE TABLE foo (a oid, b oid, c int, FOREIGN KEY (a, b, c) REFERENCES pg_description); -- RangeVarCallbackOwnsRelation() -CREATE INDEX pg_descripton_test_index ON pg_description (description); +CREATE INDEX pg_description_test_index ON pg_description (description); -- RangeVarCallbackForAlterRelation() ALTER TABLE pg_description RENAME TO pg_comment; @@ -161,7 +161,7 @@ ROLLBACK; -- RangeVarCallbackOwnsRelation() BEGIN; -CREATE INDEX pg_descripton_test_index ON pg_description (description); +CREATE INDEX pg_description_test_index ON pg_description (description); ROLLBACK; -- RangeVarCallbackForAlterRelation() diff --git a/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/guc_privs.sql b/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/guc_privs.sql new file mode 100644 index 00000000..6c7733fc --- /dev/null +++ b/third_party/spanner_pg/src/test/modules/unsafe_tests/sql/guc_privs.sql @@ -0,0 +1,253 @@ +-- +-- 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; + +-- Make a per-role setting that regress_host_resource_admin can't change +ALTER ROLE regress_host_resource_admin SET lc_messages = 'C'; + +-- 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 = '100kB'; -- ok, privileges have been granted +RESET max_stack_depth; -- 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 +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 +ALTER ROLE regress_host_resource_admin SET lc_messages = 'POSIX'; -- fail +ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; +ALTER ROLE regress_host_resource_admin RESET max_stack_depth; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; +ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; +ALTER ROLE regress_host_resource_admin RESET ALL; -- doesn't reset lc_messages +SELECT setconfig FROM pg_db_role_setting + WHERE setrole = 'regress_host_resource_admin'::regrole; + +-- 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 diff --git a/third_party/spanner_pg/src/test/modules/worker_spi/worker_spi.c b/third_party/spanner_pg/src/test/modules/worker_spi/worker_spi.c index d0acef26..5b541ec4 100644 --- a/third_party/spanner_pg/src/test/modules/worker_spi/worker_spi.c +++ b/third_party/spanner_pg/src/test/modules/worker_spi/worker_spi.c @@ -13,7 +13,7 @@ * "delta" type. Delta rows will be deleted by this worker and their values * aggregated into the total. * - * Copyright (c) 2013-2021, PostgreSQL Global Development Group + * Copyright (c) 2013-2022, PostgreSQL Global Development Group * * IDENTIFICATION * 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); } @@ -282,7 +282,6 @@ void _PG_init(void) { BackgroundWorker worker; - unsigned int i; /* get the configuration */ DefineCustomIntVariable("worker_spi.naptime", @@ -323,6 +322,8 @@ _PG_init(void) 0, NULL, NULL, NULL); + MarkGUCPrefixReserved("worker_spi"); + /* set up common data for all our workers */ memset(&worker, 0, sizeof(worker)); worker.bgw_flags = BGWORKER_SHMEM_ACCESS | @@ -336,7 +337,7 @@ _PG_init(void) /* * Now fill in worker-specific data, and do the actual registrations. */ - for (i = 1; i <= worker_spi_total_workers; i++) + for (int i = 1; i <= worker_spi_total_workers; i++) { snprintf(worker.bgw_name, BGW_MAXLEN, "worker_spi worker %d", i); snprintf(worker.bgw_type, BGW_MAXLEN, "worker_spi"); diff --git a/third_party/spanner_pg/src/test/perl/Makefile b/third_party/spanner_pg/src/test/perl/Makefile index 811acf7c..ffa736a5 100644 --- a/third_party/spanner_pg/src/test/perl/Makefile +++ b/third_party/spanner_pg/src/test/perl/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/perl # -# 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 # # src/test/perl/Makefile @@ -19,21 +19,17 @@ installdirs: $(MKDIR_P) '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test' install: all installdirs - $(INSTALL_DATA) $(srcdir)/TestLib.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/TestLib.pm' - $(INSTALL_DATA) $(srcdir)/SimpleTee.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/SimpleTee.pm' - $(INSTALL_DATA) $(srcdir)/RecursiveCopy.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/RecursiveCopy.pm' - $(INSTALL_DATA) $(srcdir)/PostgresNode.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgresNode.pm' - $(INSTALL_DATA) $(srcdir)/PostgresVersion.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgresVersion.pm' - $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/Cluster.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/Utils.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Utils.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/SimpleTee.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/SimpleTee.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/RecursiveCopy.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/RecursiveCopy.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/Cluster.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Version.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Version.pm' uninstall: - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/TestLib.pm' - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/SimpleTee.pm' - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/RecursiveCopy.pm' - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgresNode.pm' - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgresVersion.pm' - rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Utils.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/SimpleTee.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/RecursiveCopy.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Version.pm' endif diff --git a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm index fc9efb79..c0ace7c5 100644 --- a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm +++ b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm @@ -294,34 +294,6 @@ sub adjust_old_dumpfile $dump =~ s/(?<=^\Q$prefix\E)\Q$orig\E/$repl/mg; } - # dumps from pre-9.6 databases will show assorted default grants explicitly - if ($old_version lt '9.6') - { - my $comment = - "-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: .*"; - my $sql = - "REVOKE ALL ON SCHEMA public FROM PUBLIC;\n" - . "REVOKE ALL ON SCHEMA public FROM .*;\n" - . "GRANT ALL ON SCHEMA public TO .*;\n" - . "GRANT ALL ON SCHEMA public TO PUBLIC;"; - $dump =~ s/^--\n$comment\n--\n+$sql\n+//mg; - - $comment = "-- Name: DATABASE .*; Type: ACL; Schema: -; Owner: .*"; - $sql = - "REVOKE ALL ON DATABASE .* FROM PUBLIC;\n" - . "REVOKE ALL ON DATABASE .* FROM .*;\n" - . "GRANT ALL ON DATABASE .* TO .*;\n" - . "GRANT CONNECT,TEMPORARY ON DATABASE .* TO PUBLIC;\n"; - $dump =~ s/^--\n$comment\n--\n+$sql\n+//mg; - $dump =~ s/^$sql//mg; - - $sql = - "REVOKE ALL ON TABLE .* FROM PUBLIC;\n" - . "REVOKE ALL ON TABLE .* FROM .*;\n" - . "GRANT ALL ON TABLE .* TO .*;\n"; - $dump =~ s/^$sql//mg; - } - if ($old_version lt '9.5') { # adjust some places where we don't print so many parens anymore diff --git a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Cluster.pm b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Cluster.pm index 14e9138a..0d7a1bcf 100644 --- a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1,13 +1,3095 @@ -# Copyright (c) 2022, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group -# Allow use of release 15+ Perl package name in older branches, by giving that -# package the same symbol table as the older package. See PostgresNode::new -# for supporting heuristics. +=pod + +=head1 NAME + +PostgreSQL::Test::Cluster - class representing PostgreSQL server instance + +=head1 SYNOPSIS + + use PostgreSQL::Test::Cluster; + + my $node = PostgreSQL::Test::Cluster->new('mynode'); + + # Create a data directory with initdb + $node->init(); + + # Start the PostgreSQL server + $node->start(); + + # Add a setting and restart + $node->append_conf('postgresql.conf', 'hot_standby = on'); + $node->restart(); + + # Modify or delete an existing setting + $node->adjust_conf('postgresql.conf', 'max_wal_senders', '10'); + + # get pg_config settings + # all the settings in one string + $pgconfig = $node->config_data; + # all the settings as a map + %config_map = ($node->config_data); + # specified settings + ($incdir, $sharedir) = $node->config_data(qw(--includedir --sharedir)); + + # run a query with psql, like: + # echo 'SELECT 1' | psql -qAXt postgres -v ON_ERROR_STOP=1 + $psql_stdout = $node->safe_psql('postgres', 'SELECT 1'); + + # Run psql with a timeout, capturing stdout and stderr + # as well as the psql exit code. Pass some extra psql + # options. If there's an error from psql raise an exception. + my ($stdout, $stderr, $timed_out); + my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', + stdout => \$stdout, stderr => \$stderr, + 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; + + # Similar thing, more convenient in common cases + my ($cmdret, $stdout, $stderr) = + $node->psql('postgres', 'SELECT 1'); + + # run query every second until it returns 't' + # or times out + $node->poll_query_until('postgres', q|SELECT random() < 0.1;|') + or die "timed out"; + + # Do an online pg_basebackup + my $ret = $node->backup('testbackup1'); + + # Take a backup of a running server + my $ret = $node->backup_fs_hot('testbackup2'); + + # Take a backup of a stopped server + $node->stop; + my $ret = $node->backup_fs_cold('testbackup3') + + # Restore it to create a new independent node (not a replica) + my $other_node = PostgreSQL::Test::Cluster->new('mycopy'); + $other_node->init_from_backup($node, 'testbackup'); + $other_node->start; + + # Stop the server + $node->stop('fast'); + + # Find a free, unprivileged TCP port to bind some other service to + my $port = PostgreSQL::Test::Cluster::get_free_port(); + +=head1 DESCRIPTION + +PostgreSQL::Test::Cluster contains a set of routines able to work on a PostgreSQL node, +allowing to start, stop, backup and initialize it with various options. +The set of nodes managed by a given test is also managed by this module. + +In addition to node management, PostgreSQL::Test::Cluster instances have some wrappers +around Test::More functions to run commands with an environment set up to +point to the instance. + +The IPC::Run module is required. + +=cut + +package PostgreSQL::Test::Cluster; use strict; use warnings; -BEGIN { *PostgreSQL::Test::Cluster:: = \*PostgresNode::; } -use PostgresNode (); + +use Carp; +use Config; +use Fcntl qw(:mode :flock :seek :DEFAULT); +use File::Basename; +use File::Path qw(rmtree mkpath); +use File::Spec; +use File::stat qw(stat); +use File::Temp (); +use IPC::Run; +use PostgreSQL::Version; +use PostgreSQL::Test::RecursiveCopy; +use Socket; +use Test::More; +use PostgreSQL::Test::Utils (); +use Time::HiRes qw(usleep); +use Scalar::Util qw(blessed); + +our ($use_tcp, $test_localhost, $test_pghost, $last_host_assigned, + $last_port_assigned, @all_nodes, $died, $portdir); + +# the minimum version we believe to be compatible with this package without +# subclassing. +our $min_compat = 12; + +# list of file reservations made by get_free_port +my @port_reservation_files; + +INIT +{ + + # Set PGHOST for backward compatibility. This doesn't work for own_host + # nodes, so prefer to not rely on this when writing new tests. + $use_tcp = !$PostgreSQL::Test::Utils::use_unix_sockets; + $test_localhost = "127.0.0.1"; + $last_host_assigned = 1; + if ($use_tcp) + { + $test_pghost = $test_localhost; + } + else + { + # On windows, replace windows-style \ path separators with / when + # putting socket directories either in postgresql.conf or libpq + # connection strings, otherwise they are interpreted as escapes. + $test_pghost = PostgreSQL::Test::Utils::tempdir_short; + $test_pghost =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; + } + $ENV{PGHOST} = $test_pghost; + $ENV{PGDATABASE} = 'postgres'; + + # Tracking of last port value assigned to accelerate free port lookup. + $last_port_assigned = int(rand() * 16384) + 49152; + + # Set the port lock directory + + # If we're told to use a directory (e.g. from a buildfarm client) + # explicitly, use that + $portdir = $ENV{PG_TEST_PORT_DIR}; + # Otherwise, try to use a directory at the top of the build tree + # or as a last resort use the tmp_check directory + my $build_dir = $ENV{top_builddir} + || $PostgreSQL::Test::Utils::tmp_check ; + $portdir ||= "$build_dir/portlock"; + $portdir =~ s!\\!/!g; + # Make sure the directory exists + mkpath($portdir) unless -d $portdir; +} + +=pod + +=head1 METHODS + +=over + +=item $node->port() + +Get the port number assigned to the host. This won't necessarily be a TCP port +open on the local host since we prefer to use unix sockets if possible. + +Use $node->connstr() if you want a connection string. + +=cut + +sub port +{ + my ($self) = @_; + return $self->{_port}; +} + +=pod + +=item $node->host() + +Return the host (like PGHOST) for this instance. May be a UNIX socket path. + +Use $node->connstr() if you want a connection string. + +=cut + +sub host +{ + my ($self) = @_; + return $self->{_host}; +} + +=pod + +=item $node->basedir() + +The directory all the node's files will be within - datadir, archive directory, +backups, etc. + +=cut + +sub basedir +{ + my ($self) = @_; + return $self->{_basedir}; +} + +=pod + +=item $node->name() + +The name assigned to the node at creation time. + +=cut + +sub name +{ + my ($self) = @_; + return $self->{_name}; +} + +=pod + +=item $node->logfile() + +Path to the PostgreSQL log file for this instance. + +=cut + +sub logfile +{ + my ($self) = @_; + return $self->{_logfile}; +} + +=pod + +=item $node->connstr() + +Get a libpq connection string that will establish a connection to +this node. Suitable for passing to psql, DBD::Pg, etc. + +=cut + +sub connstr +{ + my ($self, $dbname) = @_; + my $pgport = $self->port; + my $pghost = $self->host; + if (!defined($dbname)) + { + return "port=$pgport host=$pghost"; + } + + # Escape properly the database string before using it, only + # single quotes and backslashes need to be treated this way. + $dbname =~ s#\\#\\\\#g; + $dbname =~ s#\'#\\\'#g; + + return "port=$pgport host=$pghost dbname='$dbname'"; +} + +=pod + +=item $node->group_access() + +Does the data dir allow group access? + +=cut + +sub group_access +{ + my ($self) = @_; + + my $dir_stat = stat($self->data_dir); + + defined($dir_stat) + or die('unable to stat ' . $self->data_dir); + + return (S_IMODE($dir_stat->mode) == 0750); +} + +=pod + +=item $node->data_dir() + +Returns the path to the data directory. postgresql.conf and pg_hba.conf are +always here. + +=cut + +sub data_dir +{ + my ($self) = @_; + my $res = $self->basedir; + return "$res/pgdata"; +} + +=pod + +=item $node->archive_dir() + +If archiving is enabled, WAL files go here. + +=cut + +sub archive_dir +{ + my ($self) = @_; + my $basedir = $self->basedir; + return "$basedir/archives"; +} + +=pod + +=item $node->backup_dir() + +The output path for backups taken with $node->backup() + +=cut + +sub backup_dir +{ + my ($self) = @_; + my $basedir = $self->basedir; + return "$basedir/backup"; +} + +=pod + +=item $node->install_path() + +The configured install path (if any) for the node. + +=cut + +sub install_path +{ + my ($self) = @_; + return $self->{_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 configuration data from pg_config, using options (if supplied). +The options will be things like '--sharedir'. + +If no options are supplied, return a string in scalar context or a map in +array context. + +If options are supplied, return the list of values. + +=cut + +sub config_data +{ + my ($self, @options) = @_; + local %ENV = $self->_get_env(); + + my ($stdout, $stderr); + my $result = + IPC::Run::run [ $self->installed_command('pg_config'), @options ], + '>', \$stdout, '2>', \$stderr + or die "could not execute pg_config"; + # standardize line endings + $stdout =~ s/\r(?=\n)//g; + # no options, scalar context: just hand back the output + return $stdout unless (wantarray || @options); + chomp($stdout); + # exactly one option: hand back the output (minus LF) + return $stdout if (@options == 1); + my @lines = split(/\n/, $stdout); + # more than one option: hand back the list of values; + return @lines if (@options); + # no options, array context: return a map + my @map; + foreach my $line (@lines) + { + my ($k,$v) = split (/ = /,$line,2); + push(@map, $k, $v); + } + return @map; +} + +=pod + +=item $node->info() + +Return a string containing human-readable diagnostic information (paths, etc) +about this node. + +=cut + +sub info +{ + my ($self) = @_; + my $_info = ''; + open my $fh, '>', \$_info or die; + print $fh "Name: " . $self->name . "\n"; + print $fh "Version: " . $self->{_pg_version} . "\n" + if $self->{_pg_version}; + print $fh "Data directory: " . $self->data_dir . "\n"; + print $fh "Backup directory: " . $self->backup_dir . "\n"; + print $fh "Archive directory: " . $self->archive_dir . "\n"; + print $fh "Connection string: " . $self->connstr . "\n"; + print $fh "Log file: " . $self->logfile . "\n"; + print $fh "Install Path: ", $self->{_install_path} . "\n" + if $self->{_install_path}; + close $fh or die; + return $_info; +} + +=pod + +=item $node->dump_info() + +Print $node->info() + +=cut + +sub dump_info +{ + my ($self) = @_; + print $self->info; + return; +} + + +# Internal method to set up trusted pg_hba.conf for replication. Not +# documented because you shouldn't use it, it's called automatically if needed. +sub set_replication_conf +{ + my ($self) = @_; + my $pgdata = $self->data_dir; + + $self->host eq $test_pghost + or croak "set_replication_conf only works with the default host"; + + open my $hba, '>>', "$pgdata/pg_hba.conf"; + print $hba + "\n# Allow replication (set up by PostgreSQL::Test::Cluster.pm)\n"; + if ($PostgreSQL::Test::Utils::windows_os + && !$PostgreSQL::Test::Utils::use_unix_sockets) + { + print $hba + "host replication all $test_localhost/32 sspi include_realm=1 map=regress\n"; + } + close $hba; + return; +} + +=pod + +=item $node->init(...) + +Initialize a new cluster for testing. + +Authentication is set up so that only the current OS user can access the +cluster. On Unix, we use Unix domain socket connections, with the socket in +a directory that's only accessible to the current user to ensure that. +On Windows, we use SSPI authentication to ensure the same (by pg_regress +--config-auth). + +WAL archiving can be enabled on this node by passing the keyword parameter +has_archiving => 1. This is disabled by default. + +postgresql.conf can be set up for replication by passing the keyword +parameter allows_streaming => 'logical' or 'physical' (passing 1 will also +suffice for physical replication) depending on type of replication that +should be enabled. This is disabled by default. + +The new node is set up in a fast but unsafe configuration where fsync is +disabled. + +=cut + +sub init +{ + my ($self, %params) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $host = $self->host; + + local %ENV = $self->_get_env(); + + $params{allows_streaming} = 0 unless defined $params{allows_streaming}; + $params{has_archiving} = 0 unless defined $params{has_archiving}; + + mkdir $self->backup_dir; + mkdir $self->archive_dir; + + PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A', + 'trust', '-N', @{ $params{extra} }); + PostgreSQL::Test::Utils::system_or_bail($ENV{PG_REGRESS}, + '--config-auth', $pgdata, @{ $params{auth_extra} }); + + open my $conf, '>>', "$pgdata/postgresql.conf"; + print $conf "\n# Added by PostgreSQL::Test::Cluster.pm\n"; + print $conf "fsync = off\n"; + print $conf "restart_after_crash = off\n"; + print $conf "log_line_prefix = '%m [%p] %q%a '\n"; + print $conf "log_statement = all\n"; + print $conf "log_replication_commands = on\n"; + print $conf "wal_retrieve_retry_interval = '500ms'\n"; + + # If a setting tends to affect whether tests pass or fail, print it after + # TEMP_CONFIG. Otherwise, print it before TEMP_CONFIG, thereby permitting + # overrides. Settings that merely improve performance or ease debugging + # belong before TEMP_CONFIG. + print $conf PostgreSQL::Test::Utils::slurp_file($ENV{TEMP_CONFIG}) + if defined $ENV{TEMP_CONFIG}; + + if ($params{allows_streaming}) + { + if ($params{allows_streaming} eq "logical") + { + print $conf "wal_level = logical\n"; + } + else + { + print $conf "wal_level = replica\n"; + } + print $conf "max_wal_senders = 10\n"; + print $conf "max_replication_slots = 10\n"; + print $conf "wal_log_hints = on\n"; + print $conf "hot_standby = on\n"; + # conservative settings to ensure we can run multiple postmasters: + print $conf "shared_buffers = 1MB\n"; + print $conf "max_connections = 10\n"; + # limit disk space consumption, too: + print $conf "max_wal_size = 128MB\n"; + } + else + { + print $conf "wal_level = minimal\n"; + print $conf "max_wal_senders = 0\n"; + } + + print $conf "port = $port\n"; + if ($use_tcp) + { + print $conf "unix_socket_directories = ''\n"; + print $conf "listen_addresses = '$host'\n"; + } + else + { + print $conf "unix_socket_directories = '$host'\n"; + print $conf "listen_addresses = ''\n"; + } + close $conf; + + chmod($self->group_access ? 0640 : 0600, "$pgdata/postgresql.conf") + or die("unable to set permissions for $pgdata/postgresql.conf"); + + $self->set_replication_conf if $params{allows_streaming}; + $self->enable_archiving if $params{has_archiving}; + return; +} + +=pod + +=item $node->append_conf(filename, str) + +A shortcut method to append to files like pg_hba.conf and postgresql.conf. + +Does no validation or sanity checking. Does not reload the configuration +after writing. + +A newline is automatically appended to the string. + +=cut + +sub append_conf +{ + my ($self, $filename, $str) = @_; + + my $conffile = $self->data_dir . '/' . $filename; + + PostgreSQL::Test::Utils::append_to_file($conffile, $str . "\n"); + + chmod($self->group_access() ? 0640 : 0600, $conffile) + or die("unable to set permissions for $conffile"); + + return; +} + +=pod + +=item $node->adjust_conf(filename, setting, value, skip_equals) + +Modify the named config file setting with the value. If the value is undefined, +instead delete the setting. If the setting is not present no action is taken. + +This will write "$setting = $value\n" in place of the existing line, +unless skip_equals is true, in which case it will write +"$setting $value\n". If the value needs to be quoted it is the caller's +responsibility to do that. + +=cut + +sub adjust_conf +{ + my ($self, $filename, $setting, $value, $skip_equals) = @_; + + my $conffile = $self->data_dir . '/' . $filename; + + my $contents = PostgreSQL::Test::Utils::slurp_file($conffile); + my @lines = split(/\n/, $contents); + my @result; + my $eq = $skip_equals ? '' : '= '; + foreach my $line (@lines) + { + if ($line !~ /^$setting\W/) + { + push(@result, "$line\n"); + } + elsif (defined $value) + { + push(@result, "$setting $eq$value\n"); + } + } + open my $fh, ">", $conffile + or croak "could not write \"$conffile\": $!"; + print $fh @result; + close $fh; + + chmod($self->group_access() ? 0640 : 0600, $conffile) + or die("unable to set permissions for $conffile"); +} + +=pod + +=item $node->backup(backup_name) + +Create a hot backup with B in subdirectory B of +B<< $node->backup_dir >>, including the WAL. + +By default, WAL files are fetched at the end of the backup, not streamed. +You can adjust that and other things by passing an array of additional +B command line options in the keyword parameter backup_options. + +You'll have to configure a suitable B on the +target server since it isn't done by default. + +=cut + +sub backup +{ + my ($self, $backup_name, %params) = @_; + my $backup_path = $self->backup_dir . '/' . $backup_name; + my $name = $self->name; + + local %ENV = $self->_get_env(); + + print "# Taking pg_basebackup $backup_name from node \"$name\"\n"; + PostgreSQL::Test::Utils::system_or_bail( + 'pg_basebackup', '-D', + $backup_path, '-h', + $self->host, '-p', + $self->port, '--checkpoint', + 'fast', '--no-sync', + @{ $params{backup_options} }); + print "# Backup finished\n"; + return; +} + +=item $node->backup_fs_cold(backup_name) + +Create a backup with a filesystem level copy in subdirectory B of +B<< $node->backup_dir >>, including WAL. The server must be +stopped as no attempt to handle concurrent writes is made. + +Use B or B if you want to back up a running server. + +=cut + +sub backup_fs_cold +{ + my ($self, $backup_name) = @_; + + PostgreSQL::Test::RecursiveCopy::copypath( + $self->data_dir, + $self->backup_dir . '/' . $backup_name, + filterfn => sub { + my $src = shift; + return ($src ne 'log' and $src ne 'postmaster.pid'); + }); + + return; +} + +=pod + +=item $node->init_from_backup(root_node, backup_name) + +Initialize a node from a backup, which may come from this node or a different +node. root_node must be a PostgreSQL::Test::Cluster reference, backup_name the string name +of a backup previously created on that node with $node->backup. + +Does not start the node after initializing it. + +By default, the backup is assumed to be plain format. To restore from +a tar-format backup, pass the name of the tar program to use in the +keyword parameter tar_program. Note that tablespace tar files aren't +handled here. + +Streaming replication can be enabled on this node by passing the keyword +parameter has_streaming => 1. This is disabled by default. + +Restoring WAL segments from archives using restore_command can be enabled +by passing the keyword parameter has_restoring => 1. This is disabled by +default. + +If has_restoring is used, standby mode is used by default. To use +recovery mode instead, pass the keyword parameter standby => 0. + +The backup is copied, leaving the original unmodified. pg_hba.conf is +unconditionally set to enable replication connections. + +=cut + +sub init_from_backup +{ + my ($self, $root_node, $backup_name, %params) = @_; + my $backup_path = $root_node->backup_dir . '/' . $backup_name; + my $host = $self->host; + my $port = $self->port; + my $node_name = $self->name; + my $root_name = $root_node->name; + + $params{has_streaming} = 0 unless defined $params{has_streaming}; + $params{has_restoring} = 0 unless defined $params{has_restoring}; + $params{standby} = 1 unless defined $params{standby}; + + print + "# Initializing node \"$node_name\" from backup \"$backup_name\" of node \"$root_name\"\n"; + croak "Backup \"$backup_name\" does not exist at $backup_path" + unless -d $backup_path; + + mkdir $self->backup_dir; + mkdir $self->archive_dir; + + my $data_path = $self->data_dir; + if (defined $params{tar_program}) + { + mkdir($data_path); + PostgreSQL::Test::Utils::system_or_bail($params{tar_program}, 'xf', + $backup_path . '/base.tar', + '-C', $data_path); + PostgreSQL::Test::Utils::system_or_bail( + $params{tar_program}, 'xf', + $backup_path . '/pg_wal.tar', '-C', + $data_path . '/pg_wal'); + } + else + { + rmdir($data_path); + PostgreSQL::Test::RecursiveCopy::copypath($backup_path, $data_path); + } + chmod(0700, $data_path); + + # Base configuration for this node + $self->append_conf( + 'postgresql.conf', + qq( +port = $port +)); + if ($use_tcp) + { + $self->append_conf('postgresql.conf', "listen_addresses = '$host'"); + } + else + { + $self->append_conf('postgresql.conf', + "unix_socket_directories = '$host'"); + } + $self->enable_streaming($root_node) if $params{has_streaming}; + $self->enable_restoring($root_node, $params{standby}) + if $params{has_restoring}; + return; +} + +=pod + +=item $node->rotate_logfile() + +Switch to a new PostgreSQL log file. This does not alter any running +PostgreSQL process. Subsequent method calls, including pg_ctl invocations, +will use the new name. Return the new name. + +=cut + +sub rotate_logfile +{ + my ($self) = @_; + $self->{_logfile} = sprintf('%s_%d.log', + $self->{_logfile_base}, + ++$self->{_logfile_generation}); + return $self->{_logfile}; +} + +=pod + +=item $node->start(%params) => success_or_failure + +Wrapper for pg_ctl start + +Start the node and wait until it is ready to accept connections. + +=over + +=item fail_ok => 1 + +By default, failure terminates the entire F invocation. If given, +instead return a true or false value to indicate success or failure. + +=back + +=cut + +sub start +{ + my ($self, %params) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $name = $self->name; + my $ret; + + BAIL_OUT("node \"$name\" is already running") if defined $self->{_pid}; + + print("### Starting node \"$name\"\n"); + + # Temporarily unset PGAPPNAME so that the server doesn't + # inherit it. Otherwise this could affect libpqwalreceiver + # connections in confusing ways. + local %ENV = $self->_get_env(PGAPPNAME => undef); + + # Note: We set the cluster_name here, not in postgresql.conf (in + # sub init) so that it does not get copied to standbys. + # -w is now the default but having it here does no harm and helps + # compatibility with older versions. + $ret = PostgreSQL::Test::Utils::system_log( + 'pg_ctl', '-w', '-D', $self->data_dir, + '-l', $self->logfile, '-o', "--cluster-name=$name", + 'start'); + + if ($ret != 0) + { + print "# pg_ctl start failed; logfile:\n"; + print PostgreSQL::Test::Utils::slurp_file($self->logfile); + + # pg_ctl could have timed out, so check to see if there's a pid file; + # otherwise our END block will fail to shut down the new postmaster. + $self->_update_pid(-1); + + BAIL_OUT("pg_ctl start failed") unless $params{fail_ok}; + return 0; + } + + $self->_update_pid(1); + return 1; +} + +=pod + +=item $node->kill9() + +Send SIGKILL (signal 9) to the postmaster. + +Note: if the node is already known stopped, this does nothing. +However, if we think it's running and it's not, it's important for +this to fail. Otherwise, tests might fail to detect server crashes. + +=cut + +sub kill9 +{ + my ($self) = @_; + my $name = $self->name; + return unless defined $self->{_pid}; + + local %ENV = $self->_get_env(); + + print "### Killing node \"$name\" using signal 9\n"; + kill(9, $self->{_pid}); + $self->{_pid} = undef; + return; +} + +=pod + +=item $node->stop(mode) + +Stop the node using pg_ctl -m $mode and wait for it to stop. + +Note: if the node is already known stopped, this does nothing. +However, if we think it's running and it's not, it's important for +this to fail. Otherwise, tests might fail to detect server crashes. + +With optional extra param fail_ok => 1, returns 0 for failure +instead of bailing out. + +=cut + +sub stop +{ + my ($self, $mode, %params) = @_; + my $pgdata = $self->data_dir; + my $name = $self->name; + my $ret; + + local %ENV = $self->_get_env(); + + $mode = 'fast' unless defined $mode; + return 1 unless defined $self->{_pid}; + + print "### Stopping node \"$name\" using mode $mode\n"; + $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', '-D', $pgdata, + '-m', $mode, 'stop'); + + if ($ret != 0) + { + print "# pg_ctl stop failed: $ret\n"; + + # Check to see if we still have a postmaster or not. + $self->_update_pid(-1); + + BAIL_OUT("pg_ctl stop failed") unless $params{fail_ok}; + return 0; + } + + $self->_update_pid(0); + return 1; +} + +=pod + +=item $node->reload() + +Reload configuration parameters on the node. + +=cut + +sub reload +{ + my ($self) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $name = $self->name; + + local %ENV = $self->_get_env(); + + print "### Reloading node \"$name\"\n"; + PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata, + 'reload'); + return; +} + +=pod + +=item $node->restart() + +Wrapper for pg_ctl restart + +=cut + +sub restart +{ + my ($self) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $logfile = $self->logfile; + my $name = $self->name; + + local %ENV = $self->_get_env(PGAPPNAME => undef); + + print "### Restarting node \"$name\"\n"; + + # -w is now the default but having it here does no harm and helps + # compatibility with older versions. + PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-w', '-D', $pgdata, + '-l', $logfile, 'restart'); + + $self->_update_pid(1); + return; +} + +=pod + +=item $node->promote() + +Wrapper for pg_ctl promote + +=cut + +sub promote +{ + my ($self) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $logfile = $self->logfile; + my $name = $self->name; + + local %ENV = $self->_get_env(); + + print "### Promoting node \"$name\"\n"; + PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata, '-l', + $logfile, 'promote'); + return; +} + +=pod + +=item $node->logrotate() + +Wrapper for pg_ctl logrotate + +=cut + +sub logrotate +{ + my ($self) = @_; + my $port = $self->port; + my $pgdata = $self->data_dir; + my $logfile = $self->logfile; + my $name = $self->name; + + local %ENV = $self->_get_env(); + + print "### Rotating log in node \"$name\"\n"; + PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-D', $pgdata, '-l', + $logfile, 'logrotate'); + return; +} + +# Internal routine to enable streaming replication on a standby node. +sub enable_streaming +{ + my ($self, $root_node) = @_; + my $root_connstr = $root_node->connstr; + my $name = $self->name; + + print "### Enabling streaming replication for node \"$name\"\n"; + $self->append_conf( + $self->_recovery_file, qq( +primary_conninfo='$root_connstr' +)); + $self->set_standby_mode(); + return; +} + +# Internal routine to enable archive recovery command on a standby node +sub enable_restoring +{ + my ($self, $root_node, $standby) = @_; + my $path = $root_node->archive_dir; + my $name = $self->name; + + print "### Enabling WAL restore for node \"$name\"\n"; + + # On Windows, the path specified in the restore command needs to use + # double back-slashes to work properly and to be able to detect properly + # the file targeted by the copy command, so the directory value used + # in this routine, using only one back-slash, need to be properly changed + # first. Paths also need to be double-quoted to prevent failures where + # the path contains spaces. + $path =~ s{\\}{\\\\}g if ($PostgreSQL::Test::Utils::windows_os); + my $copy_command = + $PostgreSQL::Test::Utils::windows_os + ? qq{copy "$path\\\\%f" "%p"} + : qq{cp "$path/%f" "%p"}; + + $self->append_conf( + $self->_recovery_file, qq( +restore_command = '$copy_command' +)); + if ($standby) + { + $self->set_standby_mode(); + } + else + { + $self->set_recovery_mode(); + } + return; +} + +sub _recovery_file { return "postgresql.conf"; } + +=pod + +=item $node->set_recovery_mode() + +Place recovery.signal file. + +=cut + +sub set_recovery_mode +{ + my ($self) = @_; + + $self->append_conf('recovery.signal', ''); + return; +} + +=pod + +=item $node->set_standby_mode() + +Place standby.signal file. + +=cut + +sub set_standby_mode +{ + my ($self) = @_; + + $self->append_conf('standby.signal', ''); + return; +} + +# Internal routine to enable archiving +sub enable_archiving +{ + my ($self) = @_; + my $path = $self->archive_dir; + my $name = $self->name; + + print "### Enabling WAL archiving for node \"$name\"\n"; + + # On Windows, the path specified in the restore command needs to use + # double back-slashes to work properly and to be able to detect properly + # the file targeted by the copy command, so the directory value used + # in this routine, using only one back-slash, need to be properly changed + # first. Paths also need to be double-quoted to prevent failures where + # the path contains spaces. + $path =~ s{\\}{\\\\}g if ($PostgreSQL::Test::Utils::windows_os); + my $copy_command = + $PostgreSQL::Test::Utils::windows_os + ? qq{copy "%p" "$path\\\\%f"} + : qq{cp "%p" "$path/%f"}; + + # Enable archive_mode and archive_command on node + $self->append_conf( + 'postgresql.conf', qq( +archive_mode = on +archive_command = '$copy_command' +)); + return; +} + +# Internal method to update $self->{_pid} +# $is_running = 1: pid file should be there +# $is_running = 0: pid file should NOT be there +# $is_running = -1: we aren't sure +sub _update_pid +{ + my ($self, $is_running) = @_; + my $name = $self->name; + + # If we can open the PID file, read its first line and that's the PID we + # want. + if (open my $pidfile, '<', $self->data_dir . "/postmaster.pid") + { + chomp($self->{_pid} = <$pidfile>); + close $pidfile; + + # If we aren't sure what to expect, validate the PID using kill(). + # This protects against stale PID files left by crashed postmasters. + if ($is_running == -1 && kill(0, $self->{_pid}) == 0) + { + print + "# Stale postmaster.pid file for node \"$name\": PID $self->{_pid} no longer exists\n"; + $self->{_pid} = undef; + return; + } + + print "# Postmaster PID for node \"$name\" is $self->{_pid}\n"; + + # If we found a pidfile when there shouldn't be one, complain. + BAIL_OUT("postmaster.pid unexpectedly present") if $is_running == 0; + return; + } + + $self->{_pid} = undef; + print "# No postmaster PID for node \"$name\"\n"; + + # Complain if we expected to find a pidfile. + BAIL_OUT("postmaster.pid unexpectedly not present") if $is_running == 1; + return; +} + +=pod + +=item PostgreSQL::Test::Cluster->new(node_name, %params) + +Build a new object of class C (or of a subclass, if you have +one), assigning a free port number. Remembers the node, to prevent its port +number from being reused for another node, and to ensure that it gets +shut down when the test script exits. + +=over + +=item port => [1,65535] + +By default, this function assigns a port number to each node. Specify this to +force a particular port number. The caller is responsible for evaluating +potential conflicts and privilege requirements. + +=item own_host => 1 + +By default, all nodes use the same PGHOST value. If specified, generate a +PGHOST specific to this node. This allows multiple nodes to use the same +port. + +=item install_path => '/path/to/postgres/installation' + +Using this parameter is it possible to have nodes pointing to different +installations, for testing different versions together or the same version +with different build parameters. The provided path must be the parent of the +installation's 'bin' and 'lib' directories. In the common case where this is +not provided, Postgres binaries will be found in the caller's PATH. + +=back + +=cut + +sub new +{ + my $class = shift; + my ($name, %params) = @_; + + # Select a port. + my $port; + if (defined $params{port}) + { + $port = $params{port}; + } + else + { + # When selecting a port, we look for an unassigned TCP port number, + # even if we intend to use only Unix-domain sockets. This is clearly + # necessary on $use_tcp (Windows) configurations, and it seems like a + # good idea on Unixen as well. + $port = get_free_port(); + } + + # Select a host. + my $host = $test_pghost; + if ($params{own_host}) + { + if ($use_tcp) + { + $last_host_assigned++; + $last_host_assigned > 254 and BAIL_OUT("too many own_host nodes"); + $host = '127.0.0.' . $last_host_assigned; + } + else + { + $host = "$test_pghost/$name"; # Assume $name =~ /^[-_a-zA-Z0-9]+$/ + mkdir $host; + } + } + + my $testname = basename($0); + $testname =~ s/\.[^.]+$//; + my $node = { + _port => $port, + _host => $host, + _basedir => + "$PostgreSQL::Test::Utils::tmp_check/t_${testname}_${name}_data", + _name => $name, + _logfile_generation => 0, + _logfile_base => + "$PostgreSQL::Test::Utils::log_path/${testname}_${name}", + _logfile => + "$PostgreSQL::Test::Utils::log_path/${testname}_${name}.log" + }; + + if ($params{install_path}) + { + $node->{_install_path} = $params{install_path}; + } + + bless $node, $class; + mkdir $node->{_basedir} + or + BAIL_OUT("could not create data directory \"$node->{_basedir}\": $!"); + + $node->dump_info; + + $node->_set_pg_version; + + my $ver = $node->{_pg_version}; + + # 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; +} + +# Private routine to run the pg_config binary found in our environment (or in +# our install_path, if we have one), and set the version from it +# +sub _set_pg_version +{ + my ($self) = @_; + my $inst = $self->{_install_path}; + my $pg_config = "pg_config"; + + if (defined $inst) + { + # If the _install_path is invalid, our PATH variables might find an + # unrelated pg_config executable elsewhere. Sanity check the + # directory. + BAIL_OUT("directory not found: $inst") + unless -d $inst; + + # If the directory exists but is not the root of a postgresql + # installation, or if the user configured using + # --bindir=$SOMEWHERE_ELSE, we're not going to find pg_config, so + # complain about that, too. + $pg_config = "$inst/bin/pg_config"; + BAIL_OUT("pg_config not found: $pg_config") + unless -e $pg_config + or ($PostgreSQL::Test::Utils::windows_os and -e "$pg_config.exe"); + BAIL_OUT("pg_config not executable: $pg_config") + unless $PostgreSQL::Test::Utils::windows_os or -x $pg_config; + + # Leave $pg_config install_path qualified, to be sure we get the right + # version information, below, or die trying + } + + local %ENV = $self->_get_env(); + + # We only want the version field + my $version_line = qx{$pg_config --version}; + BAIL_OUT("$pg_config failed: $!") if $?; + + $self->{_pg_version} = PostgreSQL::Version->new($version_line); + + BAIL_OUT("could not parse pg_config --version output: $version_line") + unless defined $self->{_pg_version}; +} + +# Private routine to return a copy of the environment with the PATH and +# (DY)LD_LIBRARY_PATH correctly set when there is an install path set for +# the node. +# +# Routines that call Postgres binaries need to call this routine like this: +# +# 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 +# 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 +# bin and lib subdirectories as in a standard PostgreSQL installation, so this +# can't be used with installations where the bin and lib directories don't have +# a common parent directory. +sub _get_env +{ + my $self = shift; + my %inst_env = (%ENV, PGHOST => $self->{_host}, PGPORT => $self->{_port}); + # the remaining arguments are modifications to make to the environment + my %mods = (@_); + while (my ($k, $v) = each %mods) + { + if (defined $v) + { + $inst_env{$k} = "$v"; + } + else + { + delete $inst_env{$k}; + } + } + # now fix up the new environment for the install path + my $inst = $self->{_install_path}; + if ($inst) + { + if ($PostgreSQL::Test::Utils::windows_os) + { + # Windows picks up DLLs from the PATH rather than *LD_LIBRARY_PATH + # choose the right path separator + if ($Config{osname} eq 'MSWin32') + { + $inst_env{PATH} = "$inst/bin;$inst/lib;$ENV{PATH}"; + } + else + { + $inst_env{PATH} = "$inst/bin:$inst/lib:$ENV{PATH}"; + } + } + else + { + my $dylib_name = + $Config{osname} eq 'darwin' + ? "DYLD_LIBRARY_PATH" + : "LD_LIBRARY_PATH"; + $inst_env{PATH} = "$inst/bin:$ENV{PATH}"; + if (exists $ENV{$dylib_name}) + { + $inst_env{$dylib_name} = "$inst/lib:$ENV{$dylib_name}"; + } + else + { + $inst_env{$dylib_name} = "$inst/lib"; + } + } + } + return (%inst_env); +} + +# Private routine to get an installation path qualified command. +# +# IPC::Run maintains a cache, %cmd_cache, mapping commands to paths. Tests +# which use nodes spanning more than one postgres installation path need to +# avoid confusing which installation's binaries get run. Setting $ENV{PATH} is +# insufficient, as IPC::Run does not check to see if the path has changed since +# caching a command. +sub installed_command +{ + my ($self, $cmd) = @_; + + # Nodes using alternate installation locations use their installation's + # bin/ directory explicitly + return join('/', $self->{_install_path}, 'bin', $cmd) + if defined $self->{_install_path}; + + # Nodes implicitly using the default installation location rely on IPC::Run + # to find the right binary, which should not cause %cmd_cache confusion, + # because no nodes with other installation paths do it that way. + return $cmd; +} + +=pod + +=item get_free_port() + +Locate an unprivileged (high) TCP port that's not currently bound to +anything. This is used by C, and also by some test cases that need to +start other, non-Postgres servers. + +Ports assigned to existing PostgreSQL::Test::Cluster objects are automatically +excluded, even if those servers are not currently running. + +The port number is reserved so that other concurrent test programs will not +try to use the same port. + +Note: this is not an instance method. As it's not exported it should be +called from outside the module as C. + +=cut + +sub get_free_port +{ + my $found = 0; + my $port = $last_port_assigned; + + while ($found == 0) + { + + # advance $port, wrapping correctly around range end + $port = 49152 if ++$port >= 65536; + print "# Checking port $port\n"; + + # Check first that candidate port number is not included in + # the list of already-registered nodes. + $found = 1; + foreach my $node (@all_nodes) + { + $found = 0 if ($node->port == $port); + } + + # Check to see if anything else is listening on this TCP port. + # Seek a port available for all possible listen_addresses values, + # so callers can harness this port for the widest range of purposes. + # The 0.0.0.0 test achieves that for MSYS, which automatically sets + # SO_EXCLUSIVEADDRUSE. Testing 0.0.0.0 is insufficient for Windows + # native Perl (https://stackoverflow.com/a/14388707), so we also + # have to test individual addresses. Doing that for 127.0.0/24 + # addresses other than 127.0.0.1 might fail with EADDRNOTAVAIL on + # non-Linux, non-Windows kernels. + # + # Thus, 0.0.0.0 and individual 127.0.0/24 addresses are tested + # only on Windows and only when TCP usage is requested. + if ($found == 1) + { + foreach my $addr (qw(127.0.0.1), + ($use_tcp && $PostgreSQL::Test::Utils::windows_os) + ? qw(127.0.0.2 127.0.0.3 0.0.0.0) + : ()) + { + if (!can_bind($addr, $port)) + { + $found = 0; + last; + } + } + $found = _reserve_port($port) if $found; + } + } + + print "# Found port $port\n"; + + # Update port for next time + $last_port_assigned = $port; + + return $port; +} + +# Internal routine to check whether a host:port is available to bind +sub can_bind +{ + my ($host, $port) = @_; + my $iaddr = inet_aton($host); + my $paddr = sockaddr_in($port, $iaddr); + my $proto = getprotobyname("tcp"); + + socket(SOCK, PF_INET, SOCK_STREAM, $proto) + or die "socket failed: $!"; + + # As in postmaster, don't use SO_REUSEADDR on Windows + setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) + unless $PostgreSQL::Test::Utils::windows_os; + my $ret = bind(SOCK, $paddr) && listen(SOCK, SOMAXCONN); + close(SOCK); + return $ret; +} + +# Internal routine to reserve a port number +# Returns 1 if successful, 0 if port is already reserved. +sub _reserve_port +{ + my $port = shift; + # open in rw mode so we don't have to reopen it and lose the lock + my $filename = "$portdir/$port.rsv"; + sysopen(my $portfile, $filename, O_RDWR|O_CREAT) + || die "opening port file $filename: $!"; + # take an exclusive lock to avoid concurrent access + flock($portfile, LOCK_EX) || die "locking port file $filename: $!"; + # see if someone else has or had a reservation of this port + my $pid = <$portfile> || "0"; + chomp $pid; + if ($pid +0 > 0) + { + if (kill 0, $pid) + { + # process exists and is owned by us, so we can't reserve this port + flock($portfile, LOCK_UN); + close($portfile); + return 0; + } + } + # All good, go ahead and reserve the port + seek($portfile, 0, SEEK_SET); + # print the pid with a fixed width so we don't leave any trailing junk + print $portfile sprintf("%10d\n",$$); + flock($portfile, LOCK_UN); + close($portfile); + push(@port_reservation_files, $filename); + return 1; +} + +# Automatically shut down any still-running nodes (in the same order the nodes +# were created in) when the test script exits. +END +{ + + # take care not to change the script's exit value + my $exit_code = $?; + + foreach my $node (@all_nodes) + { + $node->teardown_node; + + # skip clean if we are requested to retain the basedir + next if defined $ENV{'PG_TEST_NOCLEAN'}; + + # clean basedir on clean test invocation + $node->clean_node + if $exit_code == 0 && PostgreSQL::Test::Utils::all_tests_passing(); + } + + unlink @port_reservation_files; + + $? = $exit_code; +} + +=pod + +=item $node->teardown_node() + +Do an immediate stop of the node + +=cut + +sub teardown_node +{ + my $self = shift; + + $self->stop('immediate'); + return; +} + +=pod + +=item $node->clean_node() + +Remove the base directory of the node if the node has been stopped. + +=cut + +sub clean_node +{ + my $self = shift; + + rmtree $self->{_basedir} unless defined $self->{_pid}; + return; +} + +=pod + +=item $node->safe_psql($dbname, $sql) => stdout + +Invoke B to run B on B and return its stdout on success. +Die if the SQL produces an error. Runs with B set. + +Takes optional extra params like timeout and timed_out parameters with the same +options as psql. + +=cut + +sub safe_psql +{ + my ($self, $dbname, $sql, %params) = @_; + + local %ENV = $self->_get_env(); + + my ($stdout, $stderr); + + my $ret = $self->psql( + $dbname, $sql, + %params, + stdout => \$stdout, + stderr => \$stderr, + on_error_die => 1, + on_error_stop => 1); + + # psql can emit stderr from NOTICEs etc + if ($stderr ne "") + { + print "#### Begin standard error\n"; + print $stderr; + print "\n#### End standard error\n"; + } + + return $stdout; +} + +=pod + +=item $node->psql($dbname, $sql, %params) => psql_retval + +Invoke B to execute B<$sql> on B<$dbname> and return the return value +from B, which is run with on_error_stop by default so that it will +stop running sql and return 3 if the passed SQL results in an error. + +As a convenience, if B is called in array context it returns an +array containing ($retval, $stdout, $stderr). + +psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> +disabled. That may be overridden by passing extra psql parameters. + +stdout and stderr are transformed to UNIX line endings if on Windows. Any +trailing newline is removed. + +Dies on failure to invoke psql but not if psql exits with a nonzero +return code (unless on_error_die specified). + +If psql exits because of a signal, an exception is raised. + +=over + +=item stdout => \$stdout + +B, if given, must be a scalar reference to which standard output is +written. If not given, standard output is not redirected and will be printed +unless B is called in array context, in which case it's captured and +returned. + +=item stderr => \$stderr + +Same as B but gets standard error. If the same scalar is passed for +both B and B the results may be interleaved unpredictably. + +=item on_error_stop => 1 + +By default, the B method invokes the B program with ON_ERROR_STOP=1 +set, so SQL execution is stopped at the first error and exit code 3 is +returned. Set B to 0 to ignore errors instead. + +=item on_error_die => 0 + +By default, this method returns psql's result code. Pass on_error_die to +instead die with an informative message. + +=item timeout => 'interval' + +Set a timeout for the psql call as an interval accepted by B +(integer seconds is fine). This method raises an exception on timeout, unless +the B parameter is also given. + +=item timed_out => \$timed_out + +If B is set and this parameter is given, the scalar it references +is set to true if the psql call times out. + +=item connstr => B + +If set, use this as the connection string for the connection to the +backend. + +=item replication => B + +If set, add B to the conninfo string. +Passing the literal value C results in a logical replication +connection. + +=item extra_params => ['--single-transaction'] + +If given, it must be an array reference containing additional parameters to B. + +=back + +e.g. + + my ($stdout, $stderr, $timed_out); + my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', + stdout => \$stdout, stderr => \$stderr, + 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. + + $node->psql('postgres', $sql, on_error_die => 1); + +dies with an informative message if $sql fails. + +=cut + +sub psql +{ + my ($self, $dbname, $sql, %params) = @_; + + local %ENV = $self->_get_env(); + + my $stdout = $params{stdout}; + my $stderr = $params{stderr}; + my $replication = $params{replication}; + my $timeout = undef; + my $timeout_exception = 'psql timed out'; + + # Build the connection string. + my $psql_connstr; + if (defined $params{connstr}) + { + $psql_connstr = $params{connstr}; + } + else + { + $psql_connstr = $self->connstr($dbname); + } + $psql_connstr .= defined $replication ? " replication=$replication" : ""; + + my @psql_params = ( + $self->installed_command('psql'), + '-XAtq', '-d', $psql_connstr, '-f', '-'); + + # If the caller wants an array and hasn't passed stdout/stderr + # references, allocate temporary ones to capture them so we + # can return them. Otherwise we won't redirect them at all. + if (wantarray) + { + if (!defined($stdout)) + { + my $temp_stdout = ""; + $stdout = \$temp_stdout; + } + if (!defined($stderr)) + { + my $temp_stderr = ""; + $stderr = \$temp_stderr; + } + } + + $params{on_error_stop} = 1 unless defined $params{on_error_stop}; + $params{on_error_die} = 0 unless defined $params{on_error_die}; + + push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; + push @psql_params, @{ $params{extra_params} } + if defined $params{extra_params}; + + $timeout = + IPC::Run::timeout($params{timeout}, exception => $timeout_exception) + if (defined($params{timeout})); + + ${ $params{timed_out} } = 0 if defined $params{timed_out}; + + # IPC::Run would otherwise append to existing contents: + $$stdout = "" if ref($stdout); + $$stderr = "" if ref($stderr); + + my $ret; + + # Run psql and capture any possible exceptions. If the exception is + # because of a timeout and the caller requested to handle that, just return + # and set the flag. Otherwise, and for any other exception, rethrow. + # + # For background, see + # https://metacpan.org/pod/release/ETHER/Try-Tiny-0.24/lib/Try/Tiny.pm + do + { + local $@; + eval { + my @ipcrun_opts = (\@psql_params, '<', \$sql); + push @ipcrun_opts, '>', $stdout if defined $stdout; + push @ipcrun_opts, '2>', $stderr if defined $stderr; + push @ipcrun_opts, $timeout if defined $timeout; + + IPC::Run::run @ipcrun_opts; + $ret = $?; + }; + my $exc_save = $@; + if ($exc_save) + { + + # IPC::Run::run threw an exception. re-throw unless it's a + # timeout, which we'll handle by testing is_expired + die $exc_save + if (blessed($exc_save) + || $exc_save !~ /^\Q$timeout_exception\E/); + + $ret = undef; + + die "Got timeout exception '$exc_save' but timer not expired?!" + unless $timeout->is_expired; + + if (defined($params{timed_out})) + { + ${ $params{timed_out} } = 1; + } + else + { + die "psql timed out: stderr: '$$stderr'\n" + . "while running '@psql_params'"; + } + } + }; + + if (defined $$stdout) + { + chomp $$stdout; + } + + if (defined $$stderr) + { + chomp $$stderr; + } + + # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR + # We don't use IPC::Run::Simple to limit dependencies. + # + # We always die on signal. + my $core = $ret & 128 ? " (core dumped)" : ""; + die "psql exited with signal " + . ($ret & 127) + . "$core: '$$stderr' while running '@psql_params'" + if $ret & 127; + $ret = $ret >> 8; + + if ($ret && $params{on_error_die}) + { + die "psql error: stderr: '$$stderr'\nwhile running '@psql_params'" + if $ret == 1; + die "connection error: '$$stderr'\nwhile running '@psql_params'" + if $ret == 2; + die + "error running SQL: '$$stderr'\nwhile running '@psql_params' with sql '$sql'" + if $ret == 3; + die "psql returns $ret: '$$stderr'\nwhile running '@psql_params'"; + } + + if (wantarray) + { + return ($ret, $$stdout, $$stderr); + } + else + { + return $ret; + } +} + +=pod + +=item $node->background_psql($dbname, \$stdin, \$stdout, $timer, %params) => harness + +Invoke B on B<$dbname> and return an IPC::Run harness object, which the +caller may use to send input to B. The process's stdin is sourced from +the $stdin scalar reference, and its stdout and stderr go to the $stdout +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 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. + +Dies on failure to invoke psql, or if psql fails to connect. Errors occurring +later are the caller's problem. psql runs with on_error_stop by default so +that it will stop running sql and return 3 if passed SQL results in an error. + +Be sure to "finish" the harness when done with it. + +=over + +=item on_error_stop => 1 + +By default, the B method invokes the B program with ON_ERROR_STOP=1 +set, so SQL execution is stopped at the first error and exit code 3 is +returned. Set B to 0 to ignore errors instead. + +=item replication => B + +If set, add B to the conninfo string. +Passing the literal value C results in a logical replication +connection. + +=item extra_params => ['--single-transaction'] + +If given, it must be an array reference containing additional parameters to B. + +=back + +=cut + +sub background_psql +{ + my ($self, $dbname, $stdin, $stdout, $timer, %params) = @_; + + local %ENV = $self->_get_env(); + + my $replication = $params{replication}; + + my @psql_params = ( + $self->installed_command('psql'), + '-XAtq', + '-d', + $self->connstr($dbname) + . (defined $replication ? " replication=$replication" : ""), + '-f', + '-'); + + $params{on_error_stop} = 1 unless defined $params{on_error_stop}; + + push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; + push @psql_params, @{ $params{extra_params} } + if defined $params{extra_params}; + + # Ensure there is no data waiting to be sent: + $$stdin = "" if ref($stdin); + # IPC::Run would otherwise append to existing contents: + $$stdout = "" if ref($stdout); + + my $harness = IPC::Run::start \@psql_params, + '<', $stdin, '>', $stdout, $timer; + + # Request some output, and pump until we see it. This means that psql + # connection failures are caught here, relieving callers of the need to + # handle those. (Right now, we have no particularly good handling for + # errors anyway, but that might be added later.) + my $banner = "background_psql: ready"; + $$stdin = "\\echo $banner\n"; + pump $harness until $$stdout =~ /$banner/ || $timer->is_expired; + + die "psql startup timed out" if $timer->is_expired; + + return $harness; +} + +=pod + +=item $node->interactive_psql($dbname, \$stdin, \$stdout, $timer, %params) => harness + +Invoke B on B<$dbname> and return an IPC::Run harness object, +which the caller may use to send interactive input to B. +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 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. + +Dies on failure to invoke psql, or if psql fails to connect. +Errors occurring later are the caller's problem. + +Be sure to "finish" the harness when done with it. + +The only extra parameter currently accepted is + +=over + +=item extra_params => ['--single-transaction'] + +If given, it must be an array reference containing additional parameters to B. + +=back + +This requires IO::Pty in addition to IPC::Run. + +=cut + +sub interactive_psql +{ + my ($self, $dbname, $stdin, $stdout, $timer, %params) = @_; + + local %ENV = $self->_get_env(); + + my @psql_params = ( + $self->installed_command('psql'), + '-XAt', '-d', $self->connstr($dbname)); + + push @psql_params, @{ $params{extra_params} } + if defined $params{extra_params}; + + # Ensure there is no data waiting to be sent: + $$stdin = "" if ref($stdin); + # IPC::Run would otherwise append to existing contents: + $$stdout = "" if ref($stdout); + + my $harness = IPC::Run::start \@psql_params, + 'pty>', $stdout, $timer; + + # Pump until we see psql's help banner. This ensures that callers + # won't write anything to the pty before it's ready, avoiding an + # implementation issue in IPC::Run. Also, it means that psql + # connection failures are caught here, relieving callers of + # the need to handle those. (Right now, we have no particularly + # good handling for errors anyway, but that might be added later.) + pump $harness + until $$stdout =~ /Type "help" for help/ || $timer->is_expired; + + die "psql startup timed out" if $timer->is_expired; + + return $harness; +} + +# Common sub of pgbench-invoking interfaces. Makes any requested script files +# and returns pgbench command-line options causing use of those files. +sub _pgbench_make_files +{ + my ($self, $files) = @_; + my @file_opts; + + if (defined $files) + { + + # note: files are ordered for determinism + for my $fn (sort keys %$files) + { + my $filename = $self->basedir . '/' . $fn; + push @file_opts, '-f', $filename; + + # cleanup file weight + $filename =~ s/\@\d+$//; + + #push @filenames, $filename; + # filenames are expected to be unique on a test + if (-e $filename) + { + ok(0, "$filename must not already exist"); + unlink $filename or die "cannot unlink $filename: $!"; + } + PostgreSQL::Test::Utils::append_to_file($filename, $$files{$fn}); + } + } + + return @file_opts; +} + +=pod + +=item $node->pgbench($opts, $stat, $out, $err, $name, $files, @args) + +Invoke B, with parameters and files. + +=over + +=item $opts + +Options as a string to be split on spaces. + +=item $stat + +Expected exit status. + +=item $out + +Reference to a regexp list that must match stdout. + +=item $err + +Reference to a regexp list that must match stderr. + +=item $name + +Name of test for error messages. + +=item $files + +Reference to filename/contents dictionary. + +=item @args + +Further raw options or arguments. + +=back + +=cut + +sub pgbench +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($self, $opts, $stat, $out, $err, $name, $files, @args) = @_; + my @cmd = ( + 'pgbench', + split(/\s+/, $opts), + $self->_pgbench_make_files($files), @args); + + $self->command_checks_all(\@cmd, $stat, $out, $err, $name); +} + +=pod + +=item $node->connect_ok($connstr, $test_name, %params) + +Attempt a connection with a custom connection string. This is expected +to succeed. + +=over + +=item sql => B + +If this parameter is set, this query is used for the connection attempt +instead of the default. + +=item expected_stdout => B + +If this regular expression is set, matches it with the output generated. + +=item log_like => [ qr/required message/ ] + +=item log_unlike => [ qr/prohibited message/ ] + +See C. + +=back + +=cut + +sub connect_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($self, $connstr, $test_name, %params) = @_; + + my $sql; + if (defined($params{sql})) + { + $sql = $params{sql}; + } + else + { + $sql = "SELECT \$\$connected with $connstr\$\$"; + } + + my $log_location = -s $self->logfile; + + # Never prompt for a password, any callers of this routine should + # have set up things properly, and this should not block. + my ($ret, $stdout, $stderr) = $self->psql( + 'postgres', + $sql, + extra_params => ['-w'], + connstr => "$connstr", + on_error_stop => 0); + + is($ret, 0, $test_name); + + if (defined($params{expected_stdout})) + { + like($stdout, $params{expected_stdout}, "$test_name: stdout matches"); + } + + is($stderr, "", "$test_name: no stderr"); + + $self->log_check($test_name, $log_location, %params); +} + +=pod + +=item $node->connect_fails($connstr, $test_name, %params) + +Attempt a connection with a custom connection string. This is expected +to fail. + +=over + +=item expected_stderr => B + +If this regular expression is set, matches it with the output generated. + +=item log_like => [ qr/required message/ ] + +=item log_unlike => [ qr/prohibited message/ ] + +See C. + +=back + +=cut + +sub connect_fails +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($self, $connstr, $test_name, %params) = @_; + + my $log_location = -s $self->logfile; + + # Never prompt for a password, any callers of this routine should + # have set up things properly, and this should not block. + my ($ret, $stdout, $stderr) = $self->psql( + 'postgres', + undef, + extra_params => ['-w'], + connstr => "$connstr"); + + isnt($ret, 0, $test_name); + + if (defined($params{expected_stderr})) + { + like($stderr, $params{expected_stderr}, "$test_name: matches"); + } + + $self->log_check($test_name, $log_location, %params); +} + +=pod + +=item $node->poll_query_until($dbname, $query [, $expected ]) + +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 $PostgreSQL::Test::Utils::timeout_default seconds. +Returns 1 if successful, 0 if timed out. + +=cut + +sub poll_query_until +{ + my ($self, $dbname, $query, $expected) = @_; + + local %ENV = $self->_get_env(); + + $expected = 't' unless defined($expected); # default value + + my $cmd = [ + $self->installed_command('psql'), '-XAt', + '-d', $self->connstr($dbname) + ]; + my ($stdout, $stderr); + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; + my $attempts = 0; + + while ($attempts < $max_attempts) + { + my $result = IPC::Run::run $cmd, '<', \$query, + '>', \$stdout, '2>', \$stderr; + + chomp($stdout); + chomp($stderr); + + if ($stdout eq $expected && $stderr eq '') + { + return 1; + } + + # Wait 0.1 second before retrying. + usleep(100_000); + + $attempts++; + } + + # 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: +$expected +last actual query output: +$stdout +with stderr: +$stderr); + return 0; +} + +=pod + +=item $node->command_ok(...) + +Runs a shell command like PostgreSQL::Test::Utils::command_ok, but with PGHOST and PGPORT set +so that the command will default to connecting to this PostgreSQL::Test::Cluster. + +=cut + +sub command_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $self = shift; + + local %ENV = $self->_get_env(); + + PostgreSQL::Test::Utils::command_ok(@_); + return; +} + +=pod + +=item $node->command_fails(...) + +PostgreSQL::Test::Utils::command_fails with our connection parameters. See command_ok(...) + +=cut + +sub command_fails +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $self = shift; + + local %ENV = $self->_get_env(); + + PostgreSQL::Test::Utils::command_fails(@_); + return; +} + +=pod + +=item $node->command_like(...) + +PostgreSQL::Test::Utils::command_like with our connection parameters. See command_ok(...) + +=cut + +sub command_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $self = shift; + + local %ENV = $self->_get_env(); + + PostgreSQL::Test::Utils::command_like(@_); + return; +} + +=pod + +=item $node->command_fails_like(...) + +PostgreSQL::Test::Utils::command_fails_like with our connection parameters. See command_ok(...) + +=cut + +sub command_fails_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $self = shift; + + local %ENV = $self->_get_env(); + + PostgreSQL::Test::Utils::command_fails_like(@_); + return; +} + +=pod + +=item $node->command_checks_all(...) + +PostgreSQL::Test::Utils::command_checks_all with our connection parameters. See +command_ok(...) + +=cut + +sub command_checks_all +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $self = shift; + + local %ENV = $self->_get_env(); + + PostgreSQL::Test::Utils::command_checks_all(@_); + return; +} + +=pod + +=item $node->issues_sql_like(cmd, expected_sql, test_name) + +Run a command on the node, then verify that $expected_sql appears in the +server log file. + +=cut + +sub issues_sql_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($self, $cmd, $expected_sql, $test_name) = @_; + + local %ENV = $self->_get_env(); + + my $log_location = -s $self->logfile; + + my $result = PostgreSQL::Test::Utils::run_log($cmd); + ok($result, "@$cmd exit code 0"); + my $log = + PostgreSQL::Test::Utils::slurp_file($self->logfile, $log_location); + like($log, $expected_sql, "$test_name: SQL found in server log"); + return; +} + +=pod + +=item $node->log_check($offset, $test_name, %parameters) + +Check contents of server logs. + +=over + +=item $test_name + +Name of test for error messages. + +=item $offset + +Offset of the log file. + +=item log_like => [ qr/required message/ ] + +If given, it must be an array reference containing a list of regular +expressions that must match against the server log, using +C. + +=item log_unlike => [ qr/prohibited message/ ] + +If given, it must be an array reference containing a list of regular +expressions that must NOT match against the server log. They will be +passed to C. + +=back + +=cut + +sub log_check +{ + my ($self, $test_name, $offset, %params) = @_; + + my (@log_like, @log_unlike); + if (defined($params{log_like})) + { + @log_like = @{ $params{log_like} }; + } + if (defined($params{log_unlike})) + { + @log_unlike = @{ $params{log_unlike} }; + } + + if (@log_like or @log_unlike) + { + my $log_contents = + PostgreSQL::Test::Utils::slurp_file($self->logfile, $offset); + + while (my $regex = shift @log_like) + { + like($log_contents, $regex, "$test_name: log matches"); + } + while (my $regex = shift @log_unlike) + { + unlike($log_contents, $regex, "$test_name: log does not match"); + } + } +} + +=pod + +=item log_contains(pattern, offset) + +Find pattern in logfile of node after offset byte. + +=cut + +sub log_contains +{ + my ($self, $pattern, $offset) = @_; + + return PostgreSQL::Test::Utils::slurp_file($self->logfile, $offset) =~ m/$pattern/; +} + +=pod + +=item $node->run_log(...) + +Runs a shell command like PostgreSQL::Test::Utils::run_log, but with connection parameters set +so that the command will default to connecting to this PostgreSQL::Test::Cluster. + +=cut + +sub run_log +{ + my $self = shift; + + local %ENV = $self->_get_env(); + + return PostgreSQL::Test::Utils::run_log(@_); +} + +=pod + +=item $node->lsn(mode) + +Look up WAL locations on the server: + + * insert location (primary only, error on replica) + * write location (primary only, error on replica) + * flush location (primary only, error on replica) + * receive location (always undef on primary) + * replay location (always undef on primary) + +mode must be specified. + +=cut + +sub lsn +{ + my ($self, $mode) = @_; + my %modes = ( + 'insert' => 'pg_current_wal_insert_lsn()', + 'flush' => 'pg_current_wal_flush_lsn()', + 'write' => 'pg_current_wal_lsn()', + 'receive' => 'pg_last_wal_receive_lsn()', + 'replay' => 'pg_last_wal_replay_lsn()'); + + $mode = '' if !defined($mode); + croak "unknown mode for 'lsn': '$mode', valid modes are " + . join(', ', keys %modes) + if !defined($modes{$mode}); + + my $result = $self->safe_psql('postgres', "SELECT $modes{$mode}"); + chomp($result); + if ($result eq '') + { + return; + } + else + { + return $result; + } +} + +=pod + +=item $node->wait_for_catchup(standby_name, mode, target_lsn) + +Wait for the replication connection with application_name standby_name until +its 'mode' replication column in pg_stat_replication equals or passes the +specified or default target_lsn. By default the replay_lsn is waited for, +but 'mode' may be specified to wait for any of sent|write|flush|replay. +The replication connection must be in a streaming state. + +When doing physical replication, the standby is usually identified by +passing its PostgreSQL::Test::Cluster instance. When doing logical +replication, standby_name identifies a subscription. + +The default value of target_lsn is $node->lsn('write'), which ensures +that the standby has caught up to what has been committed on the primary. +If you pass an explicit value of target_lsn, it should almost always be +the primary's write LSN; so this parameter is seldom needed except when +querying some intermediate replication node rather than the primary. + +If there is no active replication connection from this peer, waits until +poll_query_until timeout. + +Requires that the 'postgres' db exists and is accessible. + +This is not a test. It die()s on failure. + +=cut + +sub wait_for_catchup +{ + my ($self, $standby_name, $mode, $target_lsn) = @_; + $mode = defined($mode) ? $mode : 'replay'; + my %valid_modes = + ('sent' => 1, 'write' => 1, 'flush' => 1, 'replay' => 1); + croak "unknown mode $mode for 'wait_for_catchup', valid modes are " + . join(', ', keys(%valid_modes)) + unless exists($valid_modes{$mode}); + + # Allow passing of a PostgreSQL::Test::Cluster instance as shorthand + if (blessed($standby_name) + && $standby_name->isa("PostgreSQL::Test::Cluster")) + { + $standby_name = $standby_name->name; + } + if (!defined($target_lsn)) + { + $target_lsn = $self->lsn('write'); + } + print "Waiting for replication conn " + . $standby_name . "'s " + . $mode + . "_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 IN ('$standby_name', 'walreceiver')]; + if (!$self->poll_query_until('postgres', $query)) + { + if (PostgreSQL::Test::Utils::has_wal_read_bug) + { + # Mimic having skipped the test file. If >0 tests have run, the + # harness won't accept a skip; otherwise, it won't accept + # done_testing(). Force a nonzero count by running one test. + ok(1, 'dummy test before skip for filesystem bug'); + carp "skip rest: timed out waiting for catchup & filesystem bug"; + done_testing(); + exit 0; + } + else + { + croak "timed out waiting for catchup"; + } + } + print "done\n"; + return; +} + +=pod + +=item $node->wait_for_slot_catchup(slot_name, mode, target_lsn) + +Wait for the named replication slot to equal or pass the supplied target_lsn. +The location used is the restart_lsn unless mode is given, in which case it may +be 'restart' or 'confirmed_flush'. + +Requires that the 'postgres' db exists and is accessible. + +This is not a test. It die()s on failure. + +If the slot is not active, will time out after poll_query_until's timeout. + +target_lsn may be any arbitrary lsn, but is typically $primary_node->lsn('insert'). + +Note that for logical slots, restart_lsn is held down by the oldest in-progress tx. + +=cut + +sub wait_for_slot_catchup +{ + my ($self, $slot_name, $mode, $target_lsn) = @_; + $mode = defined($mode) ? $mode : 'restart'; + if (!($mode eq 'restart' || $mode eq 'confirmed_flush')) + { + croak "valid modes are restart, confirmed_flush"; + } + croak 'target lsn must be specified' unless defined($target_lsn); + print "Waiting for replication slot " + . $slot_name . "'s " + . $mode + . "_lsn to pass " + . $target_lsn . " on " + . $self->name . "\n"; + my $query = + qq[SELECT '$target_lsn' <= ${mode}_lsn FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name';]; + $self->poll_query_until('postgres', $query) + or croak "timed out waiting for catchup"; + print "done\n"; + return; +} + +=pod + +=item $node->wait_for_subscription_sync(publisher, subname, dbname) + +Wait for all tables in pg_subscription_rel to complete the initial +synchronization (i.e to be either in 'syncdone' or 'ready' state). + +If the publisher node is given, additionally, check if the subscriber has +caught up to what has been committed on the primary. This is useful to +ensure that the initial data synchronization has been completed after +creating a new subscription. + +If there is no active replication connection from this peer, wait until +poll_query_until timeout. + +This is not a test. It die()s on failure. + +=cut + +sub wait_for_subscription_sync +{ + my ($self, $publisher, $subname, $dbname) = @_; + my $name = $self->name; + + $dbname = defined($dbname) ? $dbname : 'postgres'; + + # Wait for all tables to finish initial sync. + print "Waiting for all subscriptions in \"$name\" to synchronize data\n"; + my $query = + qq[SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');]; + $self->poll_query_until($dbname, $query) + or croak "timed out waiting for subscriber to synchronize data"; + + # Then, wait for the replication to catchup if required. + if (defined($publisher)) + { + croak 'subscription name must be specified' unless defined($subname); + $publisher->wait_for_catchup($subname); + } + + print "done\n"; + return; +} + +=pod + +=item $node->wait_for_log(regexp, offset) + +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 $PostgreSQL::Test::Utils::timeout_default seconds. + +If successful, returns the length of the entire log file, in bytes. + +=cut + +sub wait_for_log +{ + my ($self, $regexp, $offset) = @_; + $offset = 0 unless defined $offset; + + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; + my $attempts = 0; + + while ($attempts < $max_attempts) + { + my $log = + PostgreSQL::Test::Utils::slurp_file($self->logfile, $offset); + + return $offset + length($log) if ($log =~ m/$regexp/); + + # Wait 0.1 second before retrying. + usleep(100_000); + + $attempts++; + } + + croak "timed out waiting for match: $regexp"; +} + +=pod + +=item $node->query_hash($dbname, $query, @columns) + +Execute $query on $dbname, replacing any appearance of the string __COLUMNS__ +within the query with a comma-separated list of @columns. + +If __COLUMNS__ does not appear in the query, its result columns must EXACTLY +match the order and number (but not necessarily alias) of supplied @columns. + +The query must return zero or one rows. + +Return a hash-ref representation of the results of the query, with any empty +or null results as defined keys with an empty-string value. There is no way +to differentiate between null and empty-string result fields. + +If the query returns zero rows, return a hash with all columns empty. There +is no way to differentiate between zero rows returned and a row with only +null columns. + +=cut + +sub query_hash +{ + my ($self, $dbname, $query, @columns) = @_; + croak 'calls in array context for multi-row results not supported yet' + if (wantarray); + + # Replace __COLUMNS__ if found + substr($query, index($query, '__COLUMNS__'), length('__COLUMNS__')) = + join(', ', @columns) + if index($query, '__COLUMNS__') >= 0; + my $result = $self->safe_psql($dbname, $query); + + # hash slice, see http://stackoverflow.com/a/16755894/398670 . + # + # Fills the hash with empty strings produced by x-operator element + # duplication if result is an empty row + # + my %val; + @val{@columns} = + $result ne '' ? split(qr/\|/, $result, -1) : ('',) x scalar(@columns); + return \%val; +} + +=pod + +=item $node->slot(slot_name) + +Return hash-ref of replication slot data for the named slot, or a hash-ref with +all values '' if not found. Does not differentiate between null and empty string +for fields, no field is ever undef. + +The restart_lsn and confirmed_flush_lsn fields are returned verbatim, and also +as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.8.8 we can't +"use bigint", it's from 5.20, and we can't assume we have Math::Bigint from CPAN +either. + +=cut + +sub slot +{ + my ($self, $slot_name) = @_; + my @columns = ( + 'plugin', 'slot_type', 'datoid', 'database', + 'active', 'active_pid', 'xmin', 'catalog_xmin', + 'restart_lsn'); + return $self->query_hash( + 'postgres', + "SELECT __COLUMNS__ FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name'", + @columns); +} + +=pod + +=item $node->pg_recvlogical_upto(self, dbname, slot_name, endpos, timeout_secs, ...) + +Invoke pg_recvlogical to read from slot_name on dbname until LSN endpos, which +corresponds to pg_recvlogical --endpos. Gives up after timeout (if nonzero). + +Disallows pg_recvlogical from internally retrying on error by passing --no-loop. + +Plugin options are passed as additional keyword arguments. + +If called in scalar context, returns stdout, and die()s on timeout or nonzero return. + +If called in array context, returns a tuple of (retval, stdout, stderr, timeout). +timeout is the IPC::Run::Timeout object whose is_expired method can be tested +to check for timeout. retval is undef on timeout. + +=cut + +sub pg_recvlogical_upto +{ + my ($self, $dbname, $slot_name, $endpos, $timeout_secs, %plugin_options) + = @_; + + local %ENV = $self->_get_env(); + + my ($stdout, $stderr); + + my $timeout_exception = 'pg_recvlogical timed out'; + + croak 'slot name must be specified' unless defined($slot_name); + croak 'endpos must be specified' unless defined($endpos); + + my @cmd = ( + $self->installed_command('pg_recvlogical'), + '-S', $slot_name, '--dbname', $self->connstr($dbname)); + push @cmd, '--endpos', $endpos; + push @cmd, '-f', '-', '--no-loop', '--start'; + + while (my ($k, $v) = each %plugin_options) + { + croak "= is not permitted to appear in replication option name" + if ($k =~ qr/=/); + push @cmd, "-o", "$k=$v"; + } + + my $timeout; + $timeout = + IPC::Run::timeout($timeout_secs, exception => $timeout_exception) + if $timeout_secs; + my $ret = 0; + + do + { + local $@; + eval { + IPC::Run::run(\@cmd, ">", \$stdout, "2>", \$stderr, $timeout); + $ret = $?; + }; + my $exc_save = $@; + if ($exc_save) + { + + # IPC::Run::run threw an exception. re-throw unless it's a + # timeout, which we'll handle by testing is_expired + die $exc_save + if (blessed($exc_save) || $exc_save !~ qr/$timeout_exception/); + + $ret = undef; + + die "Got timeout exception '$exc_save' but timer not expired?!" + unless $timeout->is_expired; + + die + "$exc_save waiting for endpos $endpos with stdout '$stdout', stderr '$stderr'" + unless wantarray; + } + }; + + if (wantarray) + { + return ($ret, $stdout, $stderr, $timeout); + } + else + { + die + "pg_recvlogical exited with code '$ret', stdout '$stdout' and stderr '$stderr'" + if $ret; + return $stdout; + } +} + +=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 + +########################################################################## + +package PostgreSQL::Test::Cluster::V_11 + ; ## no critic (ProhibitMultiplePackages) + +# 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 + +# 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); +push @PostgreSQL::Test::Cluster::V_10::ISA, 'PostgreSQL::Test::Cluster::V_11'; + +# https://www.postgresql.org/docs/10/release-10.html + +######################################################################## 1; diff --git a/third_party/spanner_pg/src/test/perl/RecursiveCopy.pm b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm similarity index 89% rename from third_party/spanner_pg/src/test/perl/RecursiveCopy.pm rename to third_party/spanner_pg/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm index 8a9cc722..0d8b0603 100644 --- a/third_party/spanner_pg/src/test/perl/RecursiveCopy.pm +++ b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm @@ -1,22 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group =pod =head1 NAME -RecursiveCopy - simple recursive copy implementation +PostgreSQL::Test::RecursiveCopy - simple recursive copy implementation =head1 SYNOPSIS -use RecursiveCopy; +use PostgreSQL::Test::RecursiveCopy; -RecursiveCopy::copypath($from, $to, filterfn => sub { return 1; }); -RecursiveCopy::copypath($from, $to); +PostgreSQL::Test::RecursiveCopy::copypath($from, $to, filterfn => sub { return 1; }); +PostgreSQL::Test::RecursiveCopy::copypath($from, $to); =cut -package RecursiveCopy; +package PostgreSQL::Test::RecursiveCopy; use strict; use warnings; @@ -54,7 +54,7 @@ attempted. =head1 EXAMPLES - RecursiveCopy::copypath('/some/path', '/empty/dir', + PostgreSQL::Test::RecursiveCopy::copypath('/some/path', '/empty/dir', filterfn => sub { # omit log/ and contents my $src = shift; diff --git a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/SimpleTee.pm b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/SimpleTee.pm new file mode 100644 index 00000000..ec13714c --- /dev/null +++ b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/SimpleTee.pm @@ -0,0 +1,63 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# A simple 'tee' implementation, using perl tie. +# +# Whenever you print to the handle, it gets forwarded to a list of +# handles. The list of output filehandles is passed to the constructor. +# +# This is similar to IO::Tee, but only used for output. Only the PRINT +# 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; + return bless \@_, $self; +} + +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 ($skip ? "" : $ts), @_ or $ok = 0; + $fh->flush or $ok = 0; + $skip = 0; + } + return $ok; +} + +1; diff --git a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Utils.pm b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Utils.pm index 2d15bbf2..702e69f7 100644 --- a/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/third_party/spanner_pg/src/test/perl/PostgreSQL/Test/Utils.pm @@ -1,11 +1,1044 @@ -# Copyright (c) 2022, PostgreSQL Global Development Group -# Allow use of release 15+ Perl package name in older branches, by giving that -# package the same symbol table as the older package. +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +=pod + +=head1 NAME + +PostgreSQL::Test::Utils - helper module for writing PostgreSQL's C tests. + +=head1 SYNOPSIS + + use PostgreSQL::Test::Utils; + + # Test basic output of a command + program_help_ok('initdb'); + program_version_ok('initdb'); + program_options_handling_ok('initdb'); + + # Test option combinations + command_fails(['initdb', '--invalid-option'], + 'command fails with invalid option'); + my $tempdir = PostgreSQL::Test::Utils::tempdir; + command_ok('initdb', '-D', $tempdir); + + # Miscellanea + print "on Windows" if $PostgreSQL::Test::Utils::windows_os; + ok(check_mode_recursive($stream_dir, 0700, 0600), + "check stream dir permissions"); + PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'QUIT', $slow_pid); + +=head1 DESCRIPTION + +C contains a set of routines dedicated to environment setup for +a PostgreSQL regression test run and includes some low-level routines +aimed at controlling command execution, logging and test functions. + +=cut + +# This module should never depend on any other PostgreSQL regression test +# modules. + +package PostgreSQL::Test::Utils; use strict; use warnings; -BEGIN { *PostgreSQL::Test::Utils:: = \*TestLib::; } -use TestLib (); + +use Carp; +use Config; +use Cwd; +use Exporter 'import'; +use Fcntl qw(:mode :seek); +use File::Basename; +use File::Find; +use File::Spec; +use File::stat qw(stat); +use File::Temp (); +use IPC::Run; +use PostgreSQL::Test::SimpleTee; + +# We need a version of Test::More recent enough to support subtests +use Test::More 0.98; + +our @EXPORT = qw( + generate_ascii_string + slurp_dir + slurp_file + append_to_file + check_mode_recursive + chmod_recursive + check_pg_config + dir_symlink + scan_server_header + system_or_bail + system_log + run_log + run_command + pump_until + + command_ok + command_fails + command_exit_is + program_help_ok + program_version_ok + program_options_handling_ok + command_like + command_like_safe + command_fails_like + command_checks_all + + $windows_os + $is_msys2 + $use_unix_sockets +); + +our ($windows_os, $is_msys2, $use_unix_sockets, $timeout_default, + $tmp_check, $log_path, $test_logfile); + +BEGIN +{ + + # Set to untranslated messages, to be able to compare program output + # with expected strings. + delete $ENV{LANGUAGE}; + delete $ENV{LC_ALL}; + $ENV{LC_MESSAGES} = 'C'; + + # This list should be kept in sync with pg_regress.c. + my @envkeys = qw ( + PGCHANNELBINDING + PGCLIENTENCODING + PGCONNECT_TIMEOUT + PGDATA + PGDATABASE + PGGSSENCMODE + PGGSSLIB + PGHOSTADDR + PGKRBSRVNAME + PGPASSFILE + PGPASSWORD + PGREQUIREPEER + PGREQUIRESSL + PGSERVICE + PGSERVICEFILE + PGSSLCERT + PGSSLCRL + PGSSLCRLDIR + PGSSLKEY + PGSSLMAXPROTOCOLVERSION + PGSSLMINPROTOCOLVERSION + PGSSLMODE + PGSSLROOTCERT + PGSSLSNI + PGTARGETSESSIONATTRS + PGUSER + PGPORT + PGHOST + PG_COLOR + ); + delete @ENV{@envkeys}; + + $ENV{PGAPPNAME} = basename($0); + + # Must be set early + $windows_os = $Config{osname} eq 'MSWin32' || $Config{osname} eq 'msys'; + # Check if this environment is MSYS2. + $is_msys2 = + $windows_os + && -x '/usr/bin/uname' + && `uname -or` =~ /^[2-9].*Msys/; + + if ($windows_os) + { + require Win32API::File; + Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle)); + } + + # Specifies whether to use Unix sockets for test setups. On + # Windows we don't use them by default since it's not universally + # 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 + +=head1 EXPORTED VARIABLES + +=over + +=item C<$windows_os> + +Set to true when running under Windows, except on Cygwin. + +=item C<$is_msys2> + +Set to true when running under MSYS2. + +=back + +=cut + +INIT +{ + + # Return EPIPE instead of killing the process with SIGPIPE. An affected + # test may still fail, but it's more likely to report useful facts. + $SIG{PIPE} = 'IGNORE'; + + # Determine output directories, and create them. The base path is the + # TESTDIR environment variable, which is normally set by the invoking + # Makefile. + $tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check"; + $log_path = "$tmp_check/log"; + + mkdir $tmp_check; + mkdir $log_path; + + # Open the test log file, whose name depends on the test name. + $test_logfile = basename($0); + $test_logfile =~ s/\.[^.]+$//; + $test_logfile = "$log_path/regress_log_$test_logfile"; + open my $testlog, '>', $test_logfile + or die "could not open STDOUT to logfile \"$test_logfile\": $!"; + + # Hijack STDOUT and STDERR to the log file + open(my $orig_stdout, '>&', \*STDOUT); + open(my $orig_stderr, '>&', \*STDERR); + open(STDOUT, '>&', $testlog); + open(STDERR, '>&', $testlog); + + # The test output (ok ...) needs to be printed to the original STDOUT so + # that the 'prove' program can parse it, and display it to the user in + # real time. But also copy it to the log file, to provide more context + # in the log. + my $builder = Test::More->builder; + my $fh = $builder->output; + tie *$fh, "PostgreSQL::Test::SimpleTee", $orig_stdout, $testlog; + $fh = $builder->failure_output; + tie *$fh, "PostgreSQL::Test::SimpleTee", $orig_stderr, $testlog; + + # Enable auto-flushing for all the file handles. Stderr and stdout are + # redirected to the same file, and buffering causes the lines to appear + # in the log in confusing order. + autoflush STDOUT 1; + autoflush STDERR 1; + autoflush $testlog 1; +} + +END +{ + + # Test files have several ways of causing prove_check to fail: + # 1. Exit with a non-zero status. + # 2. Call ok(0) or similar, indicating that a constituent test failed. + # 3. Deviate from the planned number of tests. + # + # Preserve temporary directories after (1) and after (2). + $File::Temp::KEEP_ALL = 1 unless $? == 0 && all_tests_passing(); +} + +=pod + +=head1 ROUTINES + +=over + +=item all_tests_passing() + +Return 1 if all the tests run so far have passed. Otherwise, return 0. + +=cut + +sub all_tests_passing +{ + foreach my $status (Test::More->builder->summary) + { + return 0 unless $status; + } + return 1; +} + +=pod + +=item tempdir(prefix) + +Securely create a temporary directory inside C<$tmp_check>, like C, +and return its name. The directory will be removed automatically at the +end of the tests, unless the environment variable PG_TEST_NOCLEAN is provided. + +If C is given, the new directory is templated as C<${prefix}_XXXX>. +Otherwise the template is C. + +=cut + +sub tempdir +{ + my ($prefix) = @_; + $prefix = "tmp_test" unless defined $prefix; + return File::Temp::tempdir( + $prefix . '_XXXX', + DIR => $tmp_check, + CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); +} + +=pod + +=item tempdir_short() + +As above, but the directory is outside the build tree so that it has a short +name, to avoid path length issues. + +=cut + +sub tempdir_short +{ + + return File::Temp::tempdir( + CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); +} + +=pod + +=item has_wal_read_bug() + +Returns true if $tmp_check is subject to a sparc64+ext4 bug that causes WAL +readers to see zeros if another process simultaneously wrote the same offsets. +Consult this in tests that fail frequently on affected configurations. The +bug has made streaming standbys fail to advance, reporting corrupt WAL. It +has made COMMIT PREPARED fail with "could not read two-phase state from WAL". +Non-WAL PostgreSQL reads haven't been affected, likely because those readers +and writers have buffering systems in common. See +https://postgr.es/m/20220116210241.GC756210@rfd.leadboat.com for details. + +=cut + +sub has_wal_read_bug +{ + return + $Config{osname} eq 'linux' + && $Config{archname} =~ /^sparc/ + && !run_log([ qw(df -x ext4), $tmp_check ], '>', '/dev/null', '2>&1'); +} + +=pod + +=item system_log(@cmd) + +Run (via C) the command passed as argument; the return +value is passed through. + +=cut + +sub system_log +{ + print("# Running: " . join(" ", @_) . "\n"); + return system(@_); +} + +=pod + +=item system_or_bail(@cmd) + +Run (via C) the command passed as argument, and returns +if the command is successful. +On failure, abandon further tests and exit the program. + +=cut + +sub system_or_bail +{ + if (system_log(@_) != 0) + { + if ($? == -1) + { + BAIL_OUT( + sprintf( + "failed to execute command \"%s\": $!", join(" ", @_))); + } + elsif ($? & 127) + { + BAIL_OUT( + sprintf( + "command \"%s\" died with signal %d", + join(" ", @_), + $? & 127)); + } + else + { + BAIL_OUT( + sprintf( + "command \"%s\" exited with value %d", + join(" ", @_), + $? >> 8)); + } + } +} + +=pod + +=item run_log(@cmd) + +Run the given command via C, noting it in the log. +The return value from the command is passed through. + +=cut + +sub run_log +{ + print("# Running: " . join(" ", @{ $_[0] }) . "\n"); + return IPC::Run::run(@_); +} + +=pod + +=item run_command(cmd) + +Run (via C) the command passed as argument. +The return value from the command is ignored. +The return value is C<($stdout, $stderr)>. + +=cut + +sub run_command +{ + my ($cmd) = @_; + my ($stdout, $stderr); + my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + chomp($stdout); + chomp($stderr); + return ($stdout, $stderr); +} + +=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/; + 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; +} + +=pod + +=item generate_ascii_string(from_char, to_char) + +Generate a string made of the given range of ASCII characters. + +=cut + +sub generate_ascii_string +{ + my ($from_char, $to_char) = @_; + my $res; + + for my $i ($from_char .. $to_char) + { + $res .= sprintf("%c", $i); + } + return $res; +} + +=pod + +=item slurp_dir(dir) + +Return the complete list of entries in the specified directory. + +=cut + +sub slurp_dir +{ + my ($dir) = @_; + opendir(my $dh, $dir) + or croak "could not opendir \"$dir\": $!"; + my @direntries = readdir $dh; + closedir $dh; + return @direntries; +} + +=pod + +=item slurp_file(filename [, $offset]) + +Return the full contents of the specified file, beginning from an +offset position if specified. + +=cut + +sub slurp_file +{ + my ($filename, $offset) = @_; + local $/; + my $contents; + my $fh; + + # On windows open file using win32 APIs, to allow us to set the + # FILE_SHARE_DELETE flag ("d" below), otherwise other accesses to the file + # may fail. + if ($Config{osname} ne 'MSWin32') + { + open($fh, '<', $filename) + or croak "could not read \"$filename\": $!"; + } + else + { + my $fHandle = createFile($filename, "r", "rwd") + or croak "could not open \"$filename\": $^E"; + OsFHandleOpen($fh = IO::Handle->new(), $fHandle, 'r') + or croak "could not read \"$filename\": $^E\n"; + } + + if (defined($offset)) + { + seek($fh, $offset, SEEK_SET) + or croak "could not seek \"$filename\": $!"; + } + + $contents = <$fh>; + close $fh; + + return $contents; +} + +=pod + +=item append_to_file(filename, str) + +Append a string at the end of a given file. (Note: no newline is appended at +end of file.) + +=cut + +sub append_to_file +{ + my ($filename, $str) = @_; + open my $fh, ">>", $filename + or croak "could not write \"$filename\": $!"; + print $fh $str; + close $fh; + return; +} + +=pod + +=item check_mode_recursive(dir, expected_dir_mode, expected_file_mode, ignore_list) + +Check that all file/dir modes in a directory match the expected values, +ignoring files in C (basename only). + +=cut + +sub check_mode_recursive +{ + my ($dir, $expected_dir_mode, $expected_file_mode, $ignore_list) = @_; + + # Result defaults to true + my $result = 1; + + find( + { + follow_fast => 1, + wanted => sub { + # Is file in the ignore list? + foreach my $ignore ($ignore_list ? @{$ignore_list} : []) + { + if ("$dir/$ignore" eq $File::Find::name) + { + return; + } + } + + # Allow ENOENT. A running server can delete files, such as + # those in pg_stat. Other stat() failures are fatal. + my $file_stat = stat($File::Find::name); + unless (defined($file_stat)) + { + my $is_ENOENT = $!{ENOENT}; + my $msg = "unable to stat $File::Find::name: $!"; + if ($is_ENOENT) + { + warn $msg; + return; + } + else + { + die $msg; + } + } + + my $file_mode = S_IMODE($file_stat->mode); + + # Is this a file? + if (S_ISREG($file_stat->mode)) + { + if ($file_mode != $expected_file_mode) + { + print( + *STDERR, + sprintf("$File::Find::name mode must be %04o\n", + $expected_file_mode)); + + $result = 0; + return; + } + } + + # Else a directory? + elsif (S_ISDIR($file_stat->mode)) + { + if ($file_mode != $expected_dir_mode) + { + print( + *STDERR, + sprintf("$File::Find::name mode must be %04o\n", + $expected_dir_mode)); + + $result = 0; + return; + } + } + + # Else something we can't handle + else + { + die "unknown file type for $File::Find::name"; + } + } + }, + $dir); + + return $result; +} + +=pod + +=item chmod_recursive(dir, dir_mode, file_mode) + +C recursively each file and directory within the given directory. + +=cut + +sub chmod_recursive +{ + my ($dir, $dir_mode, $file_mode) = @_; + + find( + { + follow_fast => 1, + wanted => sub { + my $file_stat = stat($File::Find::name); + + if (defined($file_stat)) + { + chmod( + S_ISDIR($file_stat->mode) ? $dir_mode : $file_mode, + $File::Find::name + ) or die "unable to chmod $File::Find::name"; + } + } + }, + $dir); + return; +} + +=pod + +=item scan_server_header(header_path, regexp) + +Returns an array that stores all the matches of the given regular expression +within the PostgreSQL installation's C. This can be used to +retrieve specific value patterns from the installation's header files. + +=cut + +sub scan_server_header +{ + my ($header_path, $regexp) = @_; + + my ($stdout, $stderr); + my $result = IPC::Run::run [ 'pg_config', '--includedir-server' ], '>', + \$stdout, '2>', \$stderr + or die "could not execute pg_config"; + chomp($stdout); + $stdout =~ s/\r$//; + + open my $header_h, '<', "$stdout/$header_path" or die "$!"; + + my @match = undef; + while (<$header_h>) + { + my $line = $_; + + if (@match = $line =~ /^$regexp/) + { + last; + } + } + + close $header_h; + die "could not find match in header $header_path\n" + unless @match; + return @match; +} + +=pod + +=item check_pg_config(regexp) + +Return the number of matches of the given regular expression +within the installation's C. + +=cut + +sub check_pg_config +{ + my ($regexp) = @_; + my ($stdout, $stderr); + my $result = IPC::Run::run [ 'pg_config', '--includedir' ], '>', + \$stdout, '2>', \$stderr + or die "could not execute pg_config"; + chomp($stdout); + $stdout =~ s/\r$//; + + open my $pg_config_h, '<', "$stdout/pg_config.h" or die "$!"; + my $match = (grep { /^$regexp/ } <$pg_config_h>); + close $pg_config_h; + return $match; +} + +=pod + +=item dir_symlink(oldname, newname) + +Portably create a symlink for a directory. On Windows this creates a junction +point. Elsewhere it just calls perl's builtin symlink. + +=cut + +sub dir_symlink +{ + my $oldname = shift; + my $newname = shift; + if ($windows_os) + { + $oldname =~ s,/,\\,g; + $newname =~ s,/,\\,g; + my $cmd = qq{mklink /j "$newname" "$oldname"}; + if ($Config{osname} eq 'msys') + { + # need some indirection on msys + $cmd = qq{echo '$cmd' | \$COMSPEC /Q}; + } + system($cmd); + } + else + { + symlink $oldname, $newname; + } + die "No $newname" unless -e $newname; +} + +=pod + +=back + +=head1 Test::More-LIKE METHODS + +=over + +=item command_ok(cmd, test_name) + +Check that the command runs (via C) successfully. + +=cut + +sub command_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd, $test_name) = @_; + my $result = run_log($cmd); + ok($result, $test_name); + return; +} + +=pod + +=item command_fails(cmd, test_name) + +Check that the command fails (when run via C). + +=cut + +sub command_fails +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd, $test_name) = @_; + my $result = run_log($cmd); + ok(!$result, $test_name); + return; +} + +=pod + +=item command_exit_is(cmd, expected, test_name) + +Check that the command exit code matches the expected exit code. + +=cut + +sub command_exit_is +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd, $expected, $test_name) = @_; + print("# Running: " . join(" ", @{$cmd}) . "\n"); + my $h = IPC::Run::start $cmd; + $h->finish(); + + # Normally, if the child called exit(N), IPC::Run::result() returns N. On + # Windows, with IPC::Run v20220807.0 and earlier, full_results() is the + # method that returns N (https://github.com/toddr/IPC-Run/issues/161). + my $result = + ($Config{osname} eq "MSWin32" && $IPC::Run::VERSION <= 20220807.0) + ? ($h->full_results)[0] + : $h->result(0); + is($result, $expected, $test_name); + return; +} + +=pod + +=item program_help_ok(cmd) + +Check that the command supports the C<--help> option. + +=cut + +sub program_help_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd) = @_; + my ($stdout, $stderr); + print("# Running: $cmd --help\n"); + my $result = IPC::Run::run [ $cmd, '--help' ], '>', \$stdout, '2>', + \$stderr; + ok($result, "$cmd --help exit code 0"); + isnt($stdout, '', "$cmd --help goes to stdout"); + is($stderr, '', "$cmd --help nothing to stderr"); + return; +} + +=pod + +=item program_version_ok(cmd) + +Check that the command supports the C<--version> option. + +=cut + +sub program_version_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd) = @_; + my ($stdout, $stderr); + print("# Running: $cmd --version\n"); + my $result = IPC::Run::run [ $cmd, '--version' ], '>', \$stdout, '2>', + \$stderr; + ok($result, "$cmd --version exit code 0"); + isnt($stdout, '', "$cmd --version goes to stdout"); + is($stderr, '', "$cmd --version nothing to stderr"); + return; +} + +=pod + +=item program_options_handling_ok(cmd) + +Check that a command with an invalid option returns a non-zero +exit code and error message. + +=cut + +sub program_options_handling_ok +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd) = @_; + my ($stdout, $stderr); + print("# Running: $cmd --not-a-valid-option\n"); + my $result = IPC::Run::run [ $cmd, '--not-a-valid-option' ], '>', + \$stdout, + '2>', \$stderr; + ok(!$result, "$cmd with invalid option nonzero exit code"); + isnt($stderr, '', "$cmd with invalid option prints error message"); + return; +} + +=pod + +=item command_like(cmd, expected_stdout, test_name) + +Check that the command runs successfully and the output +matches the given regular expression. + +=cut + +sub command_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd, $expected_stdout, $test_name) = @_; + my ($stdout, $stderr); + print("# Running: " . join(" ", @{$cmd}) . "\n"); + my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + ok($result, "$test_name: exit code 0"); + is($stderr, '', "$test_name: no stderr"); + like($stdout, $expected_stdout, "$test_name: matches"); + return; +} + +=pod + +=item command_like_safe(cmd, expected_stdout, test_name) + +Check that the command runs successfully and the output +matches the given regular expression. Doesn't assume that the +output files are closed. + +=cut + +sub command_like_safe +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + # Doesn't rely on detecting end of file on the file descriptors, + # which can fail, causing the process to hang, notably on Msys + # when used with 'pg_ctl start' + my ($cmd, $expected_stdout, $test_name) = @_; + my ($stdout, $stderr); + my $stdoutfile = File::Temp->new(); + my $stderrfile = File::Temp->new(); + print("# Running: " . join(" ", @{$cmd}) . "\n"); + my $result = IPC::Run::run $cmd, '>', $stdoutfile, '2>', $stderrfile; + $stdout = slurp_file($stdoutfile); + $stderr = slurp_file($stderrfile); + ok($result, "$test_name: exit code 0"); + is($stderr, '', "$test_name: no stderr"); + like($stdout, $expected_stdout, "$test_name: matches"); + return; +} + +=pod + +=item command_fails_like(cmd, expected_stderr, test_name) + +Check that the command fails and the error message matches +the given regular expression. + +=cut + +sub command_fails_like +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($cmd, $expected_stderr, $test_name) = @_; + my ($stdout, $stderr); + print("# Running: " . join(" ", @{$cmd}) . "\n"); + my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + ok(!$result, "$test_name: exit code not 0"); + like($stderr, $expected_stderr, "$test_name: matches"); + return; +} + +=pod + +=item command_checks_all(cmd, ret, out, err, test_name) + +Run a command and check its status and outputs. +Arguments: + +=over + +=item C: Array reference of command and arguments to run + +=item C: Expected exit code + +=item C: Expected stdout from command + +=item C: Expected stderr from command + +=item C: test name + +=back + +=cut + +sub command_checks_all +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($cmd, $expected_ret, $out, $err, $test_name) = @_; + + # run command + my ($stdout, $stderr); + print("# Running: " . join(" ", @{$cmd}) . "\n"); + IPC::Run::run($cmd, '>', \$stdout, '2>', \$stderr); + + # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR + my $ret = $?; + die "command exited with signal " . ($ret & 127) + if $ret & 127; + $ret = $ret >> 8; + + # check status + ok($ret == $expected_ret, + "$test_name status (got $ret vs expected $expected_ret)"); + + # check stdout + for my $re (@$out) + { + like($stdout, $re, "$test_name stdout /$re/"); + } + + # check stderr + for my $re (@$err) + { + like($stderr, $re, "$test_name stderr /$re/"); + } + + return; +} + +=pod + +=back + +=cut 1; diff --git a/third_party/spanner_pg/src/test/perl/PostgresNode.pm b/third_party/spanner_pg/src/test/perl/PostgresNode.pm deleted file mode 100644 index aae02b18..00000000 --- a/third_party/spanner_pg/src/test/perl/PostgresNode.pm +++ /dev/null @@ -1,2934 +0,0 @@ - -# Copyright (c) 2021, PostgreSQL Global Development Group - -=pod - -=head1 NAME - -PostgresNode - class representing PostgreSQL server instance - -=head1 SYNOPSIS - - use PostgresNode; - - my $node = PostgresNode->get_new_node('mynode'); - - # Create a data directory with initdb - $node->init(); - - # Start the PostgreSQL server - $node->start(); - - # Change a setting and restart - $node->append_conf('postgresql.conf', 'hot_standby = on'); - $node->restart(); - - # run a query with psql, like: - # echo 'SELECT 1' | psql -qAXt postgres -v ON_ERROR_STOP=1 - $psql_stdout = $node->safe_psql('postgres', 'SELECT 1'); - - # Run psql with a timeout, capturing stdout and stderr - # as well as the psql exit code. Pass some extra psql - # options. If there's an error from psql raise an exception. - my ($stdout, $stderr, $timed_out); - my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', - stdout => \$stdout, stderr => \$stderr, - timeout => $TestLib::timeout_default, - timed_out => \$timed_out, - extra_params => ['--single-transaction'], - on_error_die => 1) - print "Sleep timed out" if $timed_out; - - # Similar thing, more convenient in common cases - my ($cmdret, $stdout, $stderr) = - $node->psql('postgres', 'SELECT 1'); - - # run query every second until it returns 't' - # or times out - $node->poll_query_until('postgres', q|SELECT random() < 0.1;|') - or die "timed out"; - - # Do an online pg_basebackup - my $ret = $node->backup('testbackup1'); - - # Take a backup of a running server - my $ret = $node->backup_fs_hot('testbackup2'); - - # Take a backup of a stopped server - $node->stop; - my $ret = $node->backup_fs_cold('testbackup3') - - # Restore it to create a new independent node (not a replica) - my $replica = get_new_node('replica'); - $replica->init_from_backup($node, 'testbackup'); - $replica->start; - - # Stop the server - $node->stop('fast'); - - # Find a free, unprivileged TCP port to bind some other service to - my $port = get_free_port(); - -=head1 DESCRIPTION - -PostgresNode contains a set of routines able to work on a PostgreSQL node, -allowing to start, stop, backup and initialize it with various options. -The set of nodes managed by a given test is also managed by this module. - -In addition to node management, PostgresNode instances have some wrappers -around Test::More functions to run commands with an environment set up to -point to the instance. - -The IPC::Run module is required. - -=cut - -package PostgresNode; - -use strict; -use warnings; - -use Carp; -use Config; -use Cwd; -use Exporter 'import'; -use Fcntl qw(:mode :flock :seek :DEFAULT); -use File::Basename; -use File::Path qw(rmtree mkpath); -use File::Spec; -use File::stat qw(stat); -use File::Temp (); -use IPC::Run; -use PostgresVersion; -use RecursiveCopy; -use Socket; -use Test::More; -use TestLib (); -use Time::HiRes qw(usleep); -use Scalar::Util qw(blessed); - -our @EXPORT = qw( - get_new_node - get_free_port -); - -our ($use_tcp, $test_localhost, $test_pghost, $last_host_assigned, - $last_port_assigned, @all_nodes, $died, $portdir); - -# list of file reservations made by get_free_port -my @port_reservation_files; - -INIT -{ - - # Set PGHOST for backward compatibility. This doesn't work for own_host - # nodes, so prefer to not rely on this when writing new tests. - $use_tcp = !$TestLib::use_unix_sockets; - $test_localhost = "127.0.0.1"; - $last_host_assigned = 1; - $test_pghost = $use_tcp ? $test_localhost : TestLib::tempdir_short; - $ENV{PGHOST} = $test_pghost; - $ENV{PGDATABASE} = 'postgres'; - - # Tracking of last port value assigned to accelerate free port lookup. - $last_port_assigned = int(rand() * 16384) + 49152; - - # Set the port lock directory - - # If we're told to use a directory (e.g. from a buildfarm client) - # explicitly, use that - $portdir = $ENV{PG_TEST_PORT_DIR}; - # Otherwise, try to use a directory at the top of the build tree - # or as a last resort use the tmp_check directory - my $build_dir = $ENV{top_builddir} - || $TestLib::tmp_check ; - $portdir ||= "$build_dir/portlock"; - $portdir =~ s!\\!/!g; - # Make sure the directory exists - mkpath($portdir) unless -d $portdir; -} - -=pod - -=head1 METHODS - -=over - -=item PostgresNode::new($class, $name, $pghost, $pgport) - -Create a new PostgresNode instance. Does not initdb or start it. - -You should generally prefer to use get_new_node() instead since it takes care -of finding port numbers, registering instances for cleanup, etc. - -=cut - -sub new -{ - my ($class, $name, $pghost, $pgport) = @_; - - # Use release 15+ semantics when the arguments look like (node_name, - # %params). We can't use $class to decide, because get_new_node() passes - # a v14- argument list regardless of the class. $class might be an - # out-of-core subclass. $class->isa('PostgresNode') returns true even for - # descendants of PostgreSQL::Test::Cluster, so it doesn't help. - return $class->get_new_node(@_[ 1 .. $#_ ]) - if !$pghost - or !$pgport - or $pghost =~ /^[a-zA-Z0-9_]$/; - - my $testname = basename($0); - $testname =~ s/\.[^.]+$//; - my $self = { - _port => $pgport, - _host => $pghost, - _basedir => "$TestLib::tmp_check/t_${testname}_${name}_data", - _name => $name, - _logfile_generation => 0, - _logfile_base => "$TestLib::log_path/${testname}_${name}", - _logfile => "$TestLib::log_path/${testname}_${name}.log" - }; - - bless $self, $class; - mkdir $self->{_basedir} - or - BAIL_OUT("could not create data directory \"$self->{_basedir}\": $!"); - $self->dump_info; - - return $self; -} - -=pod - -=item $node->port() - -Get the port number assigned to the host. This won't necessarily be a TCP port -open on the local host since we prefer to use unix sockets if possible. - -Use $node->connstr() if you want a connection string. - -=cut - -sub port -{ - my ($self) = @_; - return $self->{_port}; -} - -=pod - -=item $node->host() - -Return the host (like PGHOST) for this instance. May be a UNIX socket path. - -Use $node->connstr() if you want a connection string. - -=cut - -sub host -{ - my ($self) = @_; - return $self->{_host}; -} - -=pod - -=item $node->basedir() - -The directory all the node's files will be within - datadir, archive directory, -backups, etc. - -=cut - -sub basedir -{ - my ($self) = @_; - return $self->{_basedir}; -} - -=pod - -=item $node->name() - -The name assigned to the node at creation time. - -=cut - -sub name -{ - my ($self) = @_; - return $self->{_name}; -} - -=pod - -=item $node->logfile() - -Path to the PostgreSQL log file for this instance. - -=cut - -sub logfile -{ - my ($self) = @_; - return $self->{_logfile}; -} - -=pod - -=item $node->connstr() - -Get a libpq connection string that will establish a connection to -this node. Suitable for passing to psql, DBD::Pg, etc. - -=cut - -sub connstr -{ - my ($self, $dbname) = @_; - my $pgport = $self->port; - my $pghost = $self->host; - if (!defined($dbname)) - { - return "port=$pgport host=$pghost"; - } - - # Escape properly the database string before using it, only - # single quotes and backslashes need to be treated this way. - $dbname =~ s#\\#\\\\#g; - $dbname =~ s#\'#\\\'#g; - - return "port=$pgport host=$pghost dbname='$dbname'"; -} - -=pod - -=item $node->group_access() - -Does the data dir allow group access? - -=cut - -sub group_access -{ - my ($self) = @_; - - my $dir_stat = stat($self->data_dir); - - defined($dir_stat) - or die('unable to stat ' . $self->data_dir); - - return (S_IMODE($dir_stat->mode) == 0750); -} - -=pod - -=item $node->data_dir() - -Returns the path to the data directory. postgresql.conf and pg_hba.conf are -always here. - -=cut - -sub data_dir -{ - my ($self) = @_; - my $res = $self->basedir; - return "$res/pgdata"; -} - -=pod - -=item $node->archive_dir() - -If archiving is enabled, WAL files go here. - -=cut - -sub archive_dir -{ - my ($self) = @_; - my $basedir = $self->basedir; - return "$basedir/archives"; -} - -=pod - -=item $node->backup_dir() - -The output path for backups taken with $node->backup() - -=cut - -sub backup_dir -{ - my ($self) = @_; - my $basedir = $self->basedir; - return "$basedir/backup"; -} - -=pod - -=item $node->info() - -Return a string containing human-readable diagnostic information (paths, etc) -about this node. - -=cut - -sub info -{ - my ($self) = @_; - my $_info = ''; - open my $fh, '>', \$_info or die; - print $fh "Name: " . $self->name . "\n"; - print $fh "Version: " . $self->{_pg_version} . "\n" - if $self->{_pg_version}; - print $fh "Data directory: " . $self->data_dir . "\n"; - print $fh "Backup directory: " . $self->backup_dir . "\n"; - print $fh "Archive directory: " . $self->archive_dir . "\n"; - print $fh "Connection string: " . $self->connstr . "\n"; - print $fh "Log file: " . $self->logfile . "\n"; - print $fh "Install Path: ", $self->{_install_path} . "\n" - if $self->{_install_path}; - close $fh or die; - return $_info; -} - -=pod - -=item $node->dump_info() - -Print $node->info() - -=cut - -sub dump_info -{ - my ($self) = @_; - print $self->info; - return; -} - - -# Internal method to set up trusted pg_hba.conf for replication. Not -# documented because you shouldn't use it, it's called automatically if needed. -sub set_replication_conf -{ - my ($self) = @_; - my $pgdata = $self->data_dir; - - $self->host eq $test_pghost - or croak "set_replication_conf only works with the default host"; - - open my $hba, '>>', "$pgdata/pg_hba.conf"; - print $hba "\n# Allow replication (set up by PostgresNode.pm)\n"; - if ($TestLib::windows_os && !$TestLib::use_unix_sockets) - { - print $hba - "host replication all $test_localhost/32 sspi include_realm=1 map=regress\n"; - } - close $hba; - return; -} - -=pod - -=item $node->init(...) - -Initialize a new cluster for testing. - -Authentication is set up so that only the current OS user can access the -cluster. On Unix, we use Unix domain socket connections, with the socket in -a directory that's only accessible to the current user to ensure that. -On Windows, we use SSPI authentication to ensure the same (by pg_regress ---config-auth). - -WAL archiving can be enabled on this node by passing the keyword parameter -has_archiving => 1. This is disabled by default. - -postgresql.conf can be set up for replication by passing the keyword -parameter allows_streaming => 'logical' or 'physical' (passing 1 will also -suffice for physical replication) depending on type of replication that -should be enabled. This is disabled by default. - -The new node is set up in a fast but unsafe configuration where fsync is -disabled. - -=cut - -sub init -{ - my ($self, %params) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $host = $self->host; - - local %ENV = $self->_get_env(); - - $params{allows_streaming} = 0 unless defined $params{allows_streaming}; - $params{has_archiving} = 0 unless defined $params{has_archiving}; - - mkdir $self->backup_dir; - mkdir $self->archive_dir; - - TestLib::system_or_bail('initdb', '-D', $pgdata, '-A', 'trust', '-N', - @{ $params{extra} }); - TestLib::system_or_bail($ENV{PG_REGRESS}, '--config-auth', $pgdata, - @{ $params{auth_extra} }); - - open my $conf, '>>', "$pgdata/postgresql.conf"; - print $conf "\n# Added by PostgresNode.pm\n"; - print $conf "fsync = off\n"; - print $conf "restart_after_crash = off\n"; - print $conf "log_line_prefix = '%m [%p] %q%a '\n"; - print $conf "log_statement = all\n"; - print $conf "log_replication_commands = on\n"; - print $conf "wal_retrieve_retry_interval = '500ms'\n"; - - # If a setting tends to affect whether tests pass or fail, print it after - # TEMP_CONFIG. Otherwise, print it before TEMP_CONFIG, thereby permitting - # overrides. Settings that merely improve performance or ease debugging - # belong before TEMP_CONFIG. - print $conf TestLib::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") - { - print $conf "wal_level = logical\n"; - } - else - { - print $conf "wal_level = replica\n"; - } - print $conf "max_wal_senders = 10\n"; - print $conf "max_replication_slots = 10\n"; - print $conf "wal_log_hints = on\n"; - print $conf "hot_standby = on\n"; - # conservative settings to ensure we can run multiple postmasters: - print $conf "shared_buffers = 1MB\n"; - print $conf "max_connections = 10\n"; - # limit disk space consumption, too: - print $conf "max_wal_size = 128MB\n"; - } - else - { - print $conf "wal_level = minimal\n"; - print $conf "max_wal_senders = 0\n"; - } - - print $conf "port = $port\n"; - if ($use_tcp) - { - print $conf "unix_socket_directories = ''\n"; - print $conf "listen_addresses = '$host'\n"; - } - else - { - print $conf "unix_socket_directories = '$host'\n"; - print $conf "listen_addresses = ''\n"; - } - close $conf; - - chmod($self->group_access ? 0640 : 0600, "$pgdata/postgresql.conf") - or die("unable to set permissions for $pgdata/postgresql.conf"); - - $self->set_replication_conf if $params{allows_streaming}; - $self->enable_archiving if $params{has_archiving}; - return; -} - -=pod - -=item $node->append_conf(filename, str) - -A shortcut method to append to files like pg_hba.conf and postgresql.conf. - -Does no validation or sanity checking. Does not reload the configuration -after writing. - -A newline is automatically appended to the string. - -=cut - -sub append_conf -{ - my ($self, $filename, $str) = @_; - - my $conffile = $self->data_dir . '/' . $filename; - - TestLib::append_to_file($conffile, $str . "\n"); - - chmod($self->group_access() ? 0640 : 0600, $conffile) - or die("unable to set permissions for $conffile"); - - return; -} - -=pod - -=item $node->backup(backup_name) - -Create a hot backup with B in subdirectory B of -B<< $node->backup_dir >>, including the WAL. - -By default, WAL files are fetched at the end of the backup, not streamed. -You can adjust that and other things by passing an array of additional -B command line options in the keyword parameter backup_options. - -You'll have to configure a suitable B on the -target server since it isn't done by default. - -=cut - -sub backup -{ - my ($self, $backup_name, %params) = @_; - my $backup_path = $self->backup_dir . '/' . $backup_name; - my $name = $self->name; - - local %ENV = $self->_get_env(); - - print "# Taking pg_basebackup $backup_name from node \"$name\"\n"; - TestLib::system_or_bail( - 'pg_basebackup', '-D', - $backup_path, '-h', - $self->host, '-p', - $self->port, '--checkpoint', - 'fast', '--no-sync', - @{ $params{backup_options} }); - print "# Backup finished\n"; - 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 -B<< $node->backup_dir >>, including WAL. The server must be -stopped as no attempt to handle concurrent writes is made. - -Use B or B if you want to back up a running server. - -=cut - -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"; - } - - RecursiveCopy::copypath( - $self->data_dir, - $backup_path, - 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) - -Initialize a node from a backup, which may come from this node or a different -node. root_node must be a PostgresNode reference, backup_name the string name -of a backup previously created on that node with $node->backup. - -Does not start the node after initializing it. - -By default, the backup is assumed to be plain format. To restore from -a tar-format backup, pass the name of the tar program to use in the -keyword parameter tar_program. Note that tablespace tar files aren't -handled here. - -Streaming replication can be enabled on this node by passing the keyword -parameter has_streaming => 1. This is disabled by default. - -Restoring WAL segments from archives using restore_command can be enabled -by passing the keyword parameter has_restoring => 1. This is disabled by -default. - -If has_restoring is used, standby mode is used by default. To use -recovery mode instead, pass the keyword parameter standby => 0. - -The backup is copied, leaving the original unmodified. pg_hba.conf is -unconditionally set to enable replication connections. - -=cut - -sub init_from_backup -{ - my ($self, $root_node, $backup_name, %params) = @_; - my $backup_path = $root_node->backup_dir . '/' . $backup_name; - my $host = $self->host; - my $port = $self->port; - my $node_name = $self->name; - my $root_name = $root_node->name; - - $params{has_streaming} = 0 unless defined $params{has_streaming}; - $params{has_restoring} = 0 unless defined $params{has_restoring}; - $params{standby} = 1 unless defined $params{standby}; - - print - "# Initializing node \"$node_name\" from backup \"$backup_name\" of node \"$root_name\"\n"; - croak "Backup \"$backup_name\" does not exist at $backup_path" - unless -d $backup_path; - - mkdir $self->backup_dir; - mkdir $self->archive_dir; - - my $data_path = $self->data_dir; - if (defined $params{tar_program}) - { - mkdir($data_path); - TestLib::system_or_bail($params{tar_program}, 'xf', - $backup_path . '/base.tar', - '-C', $data_path); - TestLib::system_or_bail( - $params{tar_program}, 'xf', - $backup_path . '/pg_wal.tar', '-C', - $data_path . '/pg_wal'); - } - else - { - rmdir($data_path); - RecursiveCopy::copypath($backup_path, $data_path); - } - chmod(0700, $data_path); - - # Base configuration for this node - $self->append_conf( - 'postgresql.conf', - qq( -port = $port -)); - if ($use_tcp) - { - $self->append_conf('postgresql.conf', "listen_addresses = '$host'"); - } - else - { - $self->append_conf('postgresql.conf', - "unix_socket_directories = '$host'"); - } - $self->enable_streaming($root_node) if $params{has_streaming}; - $self->enable_restoring($root_node, $params{standby}) - if $params{has_restoring}; - return; -} - -=pod - -=item $node->rotate_logfile() - -Switch to a new PostgreSQL log file. This does not alter any running -PostgreSQL process. Subsequent method calls, including pg_ctl invocations, -will use the new name. Return the new name. - -=cut - -sub rotate_logfile -{ - my ($self) = @_; - $self->{_logfile} = sprintf('%s_%d.log', - $self->{_logfile_base}, - ++$self->{_logfile_generation}); - return $self->{_logfile}; -} - -=pod - -=item $node->start(%params) => success_or_failure - -Wrapper for pg_ctl start - -Start the node and wait until it is ready to accept connections. - -=over - -=item fail_ok => 1 - -By default, failure terminates the entire F invocation. If given, -instead return a true or false value to indicate success or failure. - -=back - -=cut - -sub start -{ - my ($self, %params) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $name = $self->name; - my $ret; - - BAIL_OUT("node \"$name\" is already running") if defined $self->{_pid}; - - print("### Starting node \"$name\"\n"); - - # Temporarily unset PGAPPNAME so that the server doesn't - # inherit it. Otherwise this could affect libpqwalreceiver - # connections in confusing ways. - local %ENV = $self->_get_env(PGAPPNAME => undef); - - # Note: We set the cluster_name here, not in postgresql.conf (in - # sub init) so that it does not get copied to standbys. - $ret = TestLib::system_log('pg_ctl', '-D', $self->data_dir, '-l', - $self->logfile, '-o', "--cluster-name=$name", 'start'); - - if ($ret != 0) - { - print "# pg_ctl start failed; logfile:\n"; - print TestLib::slurp_file($self->logfile); - - # pg_ctl could have timed out, so check to see if there's a pid file; - # otherwise our END block will fail to shut down the new postmaster. - $self->_update_pid(-1); - - BAIL_OUT("pg_ctl start failed") unless $params{fail_ok}; - return 0; - } - - $self->_update_pid(1); - return 1; -} - -=pod - -=item $node->kill9() - -Send SIGKILL (signal 9) to the postmaster. - -Note: if the node is already known stopped, this does nothing. -However, if we think it's running and it's not, it's important for -this to fail. Otherwise, tests might fail to detect server crashes. - -=cut - -sub kill9 -{ - my ($self) = @_; - my $name = $self->name; - return unless defined $self->{_pid}; - - local %ENV = $self->_get_env(); - - print "### Killing node \"$name\" using signal 9\n"; - kill(9, $self->{_pid}); - $self->{_pid} = undef; - return; -} - -=pod - -=item $node->stop(mode) - -Stop the node using pg_ctl -m $mode and wait for it to stop. - -Note: if the node is already known stopped, this does nothing. -However, if we think it's running and it's not, it's important for -this to fail. Otherwise, tests might fail to detect server crashes. - -With optional extra param fail_ok => 1, returns 0 for failure -instead of bailing out. - -=cut - -sub stop -{ - my ($self, $mode, %params) = @_; - my $pgdata = $self->data_dir; - my $name = $self->name; - my $ret; - - local %ENV = $self->_get_env(); - - $mode = 'fast' unless defined $mode; - return 1 unless defined $self->{_pid}; - - print "### Stopping node \"$name\" using mode $mode\n"; - $ret = TestLib::system_log('pg_ctl', '-D', $pgdata, - '-m', $mode, 'stop'); - - if ($ret != 0) - { - print "# pg_ctl stop failed: $ret\n"; - - # Check to see if we still have a postmaster or not. - $self->_update_pid(-1); - - BAIL_OUT("pg_ctl stop failed") unless $params{fail_ok}; - return 0; - } - - $self->_update_pid(0); - return 1; -} - -=pod - -=item $node->reload() - -Reload configuration parameters on the node. - -=cut - -sub reload -{ - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $name = $self->name; - - local %ENV = $self->_get_env(); - - print "### Reloading node \"$name\"\n"; - TestLib::system_or_bail('pg_ctl', '-D', $pgdata, 'reload'); - return; -} - -=pod - -=item $node->restart() - -Wrapper for pg_ctl restart - -=cut - -sub restart -{ - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $logfile = $self->logfile; - my $name = $self->name; - - local %ENV = $self->_get_env(PGAPPNAME => undef); - - print "### Restarting node \"$name\"\n"; - - TestLib::system_or_bail('pg_ctl', '-D', $pgdata, '-l', $logfile, - 'restart'); - - $self->_update_pid(1); - return; -} - -=pod - -=item $node->promote() - -Wrapper for pg_ctl promote - -=cut - -sub promote -{ - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $logfile = $self->logfile; - my $name = $self->name; - - local %ENV = $self->_get_env(); - - print "### Promoting node \"$name\"\n"; - TestLib::system_or_bail('pg_ctl', '-D', $pgdata, '-l', $logfile, - 'promote'); - return; -} - -=pod - -=item $node->logrotate() - -Wrapper for pg_ctl logrotate - -=cut - -sub logrotate -{ - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $logfile = $self->logfile; - my $name = $self->name; - - local %ENV = $self->_get_env(); - - print "### Rotating log in node \"$name\"\n"; - TestLib::system_or_bail('pg_ctl', '-D', $pgdata, '-l', $logfile, - 'logrotate'); - return; -} - -# Internal routine to enable streaming replication on a standby node. -sub enable_streaming -{ - my ($self, $root_node) = @_; - my $root_connstr = $root_node->connstr; - my $name = $self->name; - - print "### Enabling streaming replication for node \"$name\"\n"; - $self->append_conf( - 'postgresql.conf', qq( -primary_conninfo='$root_connstr' -)); - $self->set_standby_mode(); - return; -} - -# Internal routine to enable archive recovery command on a standby node -sub enable_restoring -{ - my ($self, $root_node, $standby) = @_; - my $path = $root_node->archive_dir; - my $name = $self->name; - - print "### Enabling WAL restore for node \"$name\"\n"; - - # On Windows, the path specified in the restore command needs to use - # double back-slashes to work properly and to be able to detect properly - # the file targeted by the copy command, so the directory value used - # in this routine, using only one back-slash, need to be properly changed - # first. Paths also need to be double-quoted to prevent failures where - # the path contains spaces. - $path =~ s{\\}{\\\\}g if ($TestLib::windows_os); - my $copy_command = - $TestLib::windows_os - ? qq{copy "$path\\\\%f" "%p"} - : qq{cp "$path/%f" "%p"}; - - $self->append_conf( - 'postgresql.conf', qq( -restore_command = '$copy_command' -)); - if ($standby) - { - $self->set_standby_mode(); - } - else - { - $self->set_recovery_mode(); - } - return; -} - -=pod - -=item $node->set_recovery_mode() - -Place recovery.signal file. - -=cut - -sub set_recovery_mode -{ - my ($self) = @_; - - $self->append_conf('recovery.signal', ''); - return; -} - -=pod - -=item $node->set_standby_mode() - -Place standby.signal file. - -=cut - -sub set_standby_mode -{ - my ($self) = @_; - - $self->append_conf('standby.signal', ''); - return; -} - -# Internal routine to enable archiving -sub enable_archiving -{ - my ($self) = @_; - my $path = $self->archive_dir; - my $name = $self->name; - - print "### Enabling WAL archiving for node \"$name\"\n"; - - # On Windows, the path specified in the restore command needs to use - # double back-slashes to work properly and to be able to detect properly - # the file targeted by the copy command, so the directory value used - # in this routine, using only one back-slash, need to be properly changed - # first. Paths also need to be double-quoted to prevent failures where - # the path contains spaces. - $path =~ s{\\}{\\\\}g if ($TestLib::windows_os); - my $copy_command = - $TestLib::windows_os - ? qq{copy "%p" "$path\\\\%f"} - : qq{cp "%p" "$path/%f"}; - - # Enable archive_mode and archive_command on node - $self->append_conf( - 'postgresql.conf', qq( -archive_mode = on -archive_command = '$copy_command' -)); - return; -} - -# Internal method to update $self->{_pid} -# $is_running = 1: pid file should be there -# $is_running = 0: pid file should NOT be there -# $is_running = -1: we aren't sure -sub _update_pid -{ - my ($self, $is_running) = @_; - my $name = $self->name; - - # If we can open the PID file, read its first line and that's the PID we - # want. - if (open my $pidfile, '<', $self->data_dir . "/postmaster.pid") - { - chomp($self->{_pid} = <$pidfile>); - close $pidfile; - - # If we aren't sure what to expect, validate the PID using kill(). - # This protects against stale PID files left by crashed postmasters. - if ($is_running == -1 && kill(0, $self->{_pid}) == 0) - { - print - "# Stale postmaster.pid file for node \"$name\": PID $self->{_pid} no longer exists\n"; - $self->{_pid} = undef; - return; - } - - print "# Postmaster PID for node \"$name\" is $self->{_pid}\n"; - - # If we found a pidfile when there shouldn't be one, complain. - BAIL_OUT("postmaster.pid unexpectedly present") if $is_running == 0; - return; - } - - $self->{_pid} = undef; - print "# No postmaster PID for node \"$name\"\n"; - - # Complain if we expected to find a pidfile. - BAIL_OUT("postmaster.pid unexpectedly not present") if $is_running == 1; - return; -} - -=pod - -=item PostgresNode->get_new_node(node_name, %params) - -Build a new object of class C (or of a subclass, if you have -one), assigning a free port number. Remembers the node, to prevent its port -number from being reused for another node, and to ensure that it gets -shut down when the test script exits. - -You should generally use this instead of C. - -=over - -=item port => [1,65535] - -By default, this function assigns a port number to each node. Specify this to -force a particular port number. The caller is responsible for evaluating -potential conflicts and privilege requirements. - -=item own_host => 1 - -By default, all nodes use the same PGHOST value. If specified, generate a -PGHOST specific to this node. This allows multiple nodes to use the same -port. - -=item install_path => '/path/to/postgres/installation' - -Using this parameter is it possible to have nodes pointing to different -installations, for testing different versions together or the same version -with different build parameters. The provided path must be the parent of the -installation's 'bin' and 'lib' directories. In the common case where this is -not provided, Postgres binaries will be found in the caller's PATH. - -=back - -For backwards compatibility, it is also exported as a standalone function, -which can only create objects of class C. - -=cut - -sub get_new_node -{ - my $class = 'PostgresNode'; - $class = shift if scalar(@_) % 2 != 1; - my ($name, %params) = @_; - - # Select a port. - my $port; - if (defined $params{port}) - { - $port = $params{port}; - } - else - { - # When selecting a port, we look for an unassigned TCP port number, - # even if we intend to use only Unix-domain sockets. This is clearly - # necessary on $use_tcp (Windows) configurations, and it seems like a - # good idea on Unixen as well. - $port = get_free_port(); - } - - # Select a host. - my $host = $test_pghost; - if ($params{own_host}) - { - if ($use_tcp) - { - $last_host_assigned++; - $last_host_assigned > 254 and BAIL_OUT("too many own_host nodes"); - $host = '127.0.0.' . $last_host_assigned; - } - else - { - $host = "$test_pghost/$name"; # Assume $name =~ /^[-_a-zA-Z0-9]+$/ - mkdir $host; - } - } - - # Lock port number found by creating a new node - my $node = $class->new($name, $host, $port); - - if ($params{install_path}) - { - $node->{_install_path} = $params{install_path}; - } - - # Add node to list of nodes - push(@all_nodes, $node); - - $node->_set_pg_version; - - my $v = $node->{_pg_version}; - - carp("PostgresNode isn't fully compatible with version " . $v) - if $v < 12; - - return $node; -} - -# Private routine to run the pg_config binary found in our environment (or in -# our install_path, if we have one), and set the version from it -# -sub _set_pg_version -{ - my ($self) = @_; - my $inst = $self->{_install_path}; - my $pg_config = "pg_config"; - - if (defined $inst) - { - # If the _install_path is invalid, our PATH variables might find an - # unrelated pg_config executable elsewhere. Sanity check the - # directory. - BAIL_OUT("directory not found: $inst") - unless -d $inst; - - # If the directory exists but is not the root of a postgresql - # installation, or if the user configured using - # --bindir=$SOMEWHERE_ELSE, we're not going to find pg_config, so - # complain about that, too. - $pg_config = "$inst/bin/pg_config"; - BAIL_OUT("pg_config not found: $pg_config") - unless -e $pg_config - or ($TestLib::windows_os and -e "$pg_config.exe"); - BAIL_OUT("pg_config not executable: $pg_config") - unless $TestLib::windows_os or -x $pg_config; - - # Leave $pg_config install_path qualified, to be sure we get the right - # version information, below, or die trying - } - - local %ENV = $self->_get_env(); - - # We only want the version field - my $version_line = qx{$pg_config --version}; - BAIL_OUT("$pg_config failed: $!") if $?; - - $self->{_pg_version} = PostgresVersion->new($version_line); - - BAIL_OUT("could not parse pg_config --version output: $version_line") - unless defined $self->{_pg_version}; -} - -# Private routine to return a copy of the environment with the PATH and -# (DY)LD_LIBRARY_PATH correctly set when there is an install path set for -# the node. -# -# Routines that call Postgres binaries need to call this routine like this: -# -# 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 -# if the node's install path is set, and the copy environment is returned. -# -# The install path set in get_new_node needs to be a directory containing -# bin and lib subdirectories as in a standard PostgreSQL installation, so this -# can't be used with installations where the bin and lib directories don't have -# a common parent directory. -sub _get_env -{ - my $self = shift; - my %inst_env = (%ENV, PGHOST => $self->{_host}, PGPORT => $self->{_port}); - # the remaining arguments are modifications to make to the environment - my %mods = (@_); - while (my ($k, $v) = each %mods) - { - if (defined $v) - { - $inst_env{$k} = "$v"; - } - else - { - delete $inst_env{$k}; - } - } - # now fix up the new environment for the install path - my $inst = $self->{_install_path}; - if ($inst) - { - if ($TestLib::windows_os) - { - # Windows picks up DLLs from the PATH rather than *LD_LIBRARY_PATH - # choose the right path separator - if ($Config{osname} eq 'MSWin32') - { - $inst_env{PATH} = "$inst/bin;$inst/lib;$ENV{PATH}"; - } - else - { - $inst_env{PATH} = "$inst/bin:$inst/lib:$ENV{PATH}"; - } - } - else - { - my $dylib_name = - $Config{osname} eq 'darwin' - ? "DYLD_LIBRARY_PATH" - : "LD_LIBRARY_PATH"; - $inst_env{PATH} = "$inst/bin:$ENV{PATH}"; - if (exists $ENV{$dylib_name}) - { - $inst_env{$dylib_name} = "$inst/lib:$ENV{$dylib_name}"; - } - else - { - $inst_env{$dylib_name} = "$inst/lib"; - } - } - } - return (%inst_env); -} - -# Private routine to get an installation path qualified command. -# -# IPC::Run maintains a cache, %cmd_cache, mapping commands to paths. Tests -# which use nodes spanning more than one postgres installation path need to -# avoid confusing which installation's binaries get run. Setting $ENV{PATH} is -# insufficient, as IPC::Run does not check to see if the path has changed since -# caching a command. -sub installed_command -{ - my ($self, $cmd) = @_; - - # Nodes using alternate installation locations use their installation's - # bin/ directory explicitly - return join('/', $self->{_install_path}, 'bin', $cmd) - if defined $self->{_install_path}; - - # Nodes implicitly using the default installation location rely on IPC::Run - # to find the right binary, which should not cause %cmd_cache confusion, - # because no nodes with other installation paths do it that way. - return $cmd; -} - -=pod - -=item get_free_port() - -Locate an unprivileged (high) TCP port that's not currently bound to -anything. This is used by get_new_node, and is also exported for use -by test cases that need to start other, non-Postgres servers. - -Ports assigned to existing PostgresNode objects are automatically -excluded, even if those servers are not currently running. - -The port number is reserved so that other concurrent test programs will not -try to use the same port. - -=cut - -sub get_free_port -{ - my $found = 0; - my $port = $last_port_assigned; - - while ($found == 0) - { - - # advance $port, wrapping correctly around range end - $port = 49152 if ++$port >= 65536; - print "# Checking port $port\n"; - - # Check first that candidate port number is not included in - # the list of already-registered nodes. - $found = 1; - foreach my $node (@all_nodes) - { - $found = 0 if ($node->port == $port); - } - - # Check to see if anything else is listening on this TCP port. - # Seek a port available for all possible listen_addresses values, - # so callers can harness this port for the widest range of purposes. - # The 0.0.0.0 test achieves that for MSYS, which automatically sets - # SO_EXCLUSIVEADDRUSE. Testing 0.0.0.0 is insufficient for Windows - # native Perl (https://stackoverflow.com/a/14388707), so we also - # have to test individual addresses. Doing that for 127.0.0/24 - # addresses other than 127.0.0.1 might fail with EADDRNOTAVAIL on - # non-Linux, non-Windows kernels. - # - # Thus, 0.0.0.0 and individual 127.0.0/24 addresses are tested - # only on Windows and only when TCP usage is requested. - if ($found == 1) - { - foreach my $addr (qw(127.0.0.1), - ($use_tcp && $TestLib::windows_os) - ? qw(127.0.0.2 127.0.0.3 0.0.0.0) - : ()) - { - if (!can_bind($addr, $port)) - { - $found = 0; - last; - } - } - $found = _reserve_port($port) if $found; - } - } - - print "# Found port $port\n"; - - # Update port for next time - $last_port_assigned = $port; - - return $port; -} - -# Internal routine to check whether a host:port is available to bind -sub can_bind -{ - my ($host, $port) = @_; - my $iaddr = inet_aton($host); - my $paddr = sockaddr_in($port, $iaddr); - my $proto = getprotobyname("tcp"); - - socket(SOCK, PF_INET, SOCK_STREAM, $proto) - or die "socket failed: $!"; - - # As in postmaster, don't use SO_REUSEADDR on Windows - setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) - unless $TestLib::windows_os; - my $ret = bind(SOCK, $paddr) && listen(SOCK, SOMAXCONN); - close(SOCK); - return $ret; -} - -# Internal routine to reserve a port number -# Returns 1 if successful, 0 if port is already reserved. -sub _reserve_port -{ - my $port = shift; - # open in rw mode so we don't have to reopen it and lose the lock - my $filename = "$portdir/$port.rsv"; - sysopen(my $portfile, $filename, O_RDWR|O_CREAT) - || die "opening port file $filename: $!"; - # take an exclusive lock to avoid concurrent access - flock($portfile, LOCK_EX) || die "locking port file $filename: $!"; - # see if someone else has or had a reservation of this port - my $pid = <$portfile> || "0"; - chomp $pid; - if ($pid +0 > 0) - { - if (kill 0, $pid) - { - # process exists and is owned by us, so we can't reserve this port - flock($portfile, LOCK_UN); - close($portfile); - return 0; - } - } - # All good, go ahead and reserve the port - seek($portfile, 0, SEEK_SET); - # print the pid with a fixed width so we don't leave any trailing junk - print $portfile sprintf("%10d\n",$$); - flock($portfile, LOCK_UN); - close($portfile); - push(@port_reservation_files, $filename); - return 1; -} - -# Automatically shut down any still-running nodes (in the same order the nodes -# were created in) when the test script exits. -END -{ - - # take care not to change the script's exit value - my $exit_code = $?; - - foreach my $node (@all_nodes) - { - $node->teardown_node; - - # skip clean if we are requested to retain the basedir - next if defined $ENV{'PG_TEST_NOCLEAN'}; - - # clean basedir on clean test invocation - $node->clean_node if $exit_code == 0 && TestLib::all_tests_passing(); - } - - unlink @port_reservation_files; - - $? = $exit_code; -} - -=pod - -=item $node->teardown_node() - -Do an immediate stop of the node - -=cut - -sub teardown_node -{ - my $self = shift; - - $self->stop('immediate'); - return; -} - -=pod - -=item $node->clean_node() - -Remove the base directory of the node if the node has been stopped. - -=cut - -sub clean_node -{ - my $self = shift; - - rmtree $self->{_basedir} unless defined $self->{_pid}; - return; -} - -=pod - -=item $node->safe_psql($dbname, $sql) => stdout - -Invoke B to run B on B and return its stdout on success. -Die if the SQL produces an error. Runs with B set. - -Takes optional extra params like timeout and timed_out parameters with the same -options as psql. - -=cut - -sub safe_psql -{ - my ($self, $dbname, $sql, %params) = @_; - - local %ENV = $self->_get_env(); - - my ($stdout, $stderr); - - my $ret = $self->psql( - $dbname, $sql, - %params, - stdout => \$stdout, - stderr => \$stderr, - on_error_die => 1, - on_error_stop => 1); - - # psql can emit stderr from NOTICEs etc - if ($stderr ne "") - { - print "#### Begin standard error\n"; - print $stderr; - print "\n#### End standard error\n"; - } - - return $stdout; -} - -=pod - -=item $node->psql($dbname, $sql, %params) => psql_retval - -Invoke B to execute B<$sql> on B<$dbname> and return the return value -from B, which is run with on_error_stop by default so that it will -stop running sql and return 3 if the passed SQL results in an error. - -As a convenience, if B is called in array context it returns an -array containing ($retval, $stdout, $stderr). - -psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> -disabled. That may be overridden by passing extra psql parameters. - -stdout and stderr are transformed to UNIX line endings if on Windows. Any -trailing newline is removed. - -Dies on failure to invoke psql but not if psql exits with a nonzero -return code (unless on_error_die specified). - -If psql exits because of a signal, an exception is raised. - -=over - -=item stdout => \$stdout - -B, if given, must be a scalar reference to which standard output is -written. If not given, standard output is not redirected and will be printed -unless B is called in array context, in which case it's captured and -returned. - -=item stderr => \$stderr - -Same as B but gets standard error. If the same scalar is passed for -both B and B the results may be interleaved unpredictably. - -=item on_error_stop => 1 - -By default, the B method invokes the B program with ON_ERROR_STOP=1 -set, so SQL execution is stopped at the first error and exit code 3 is -returned. Set B to 0 to ignore errors instead. - -=item on_error_die => 0 - -By default, this method returns psql's result code. Pass on_error_die to -instead die with an informative message. - -=item timeout => 'interval' - -Set a timeout for the psql call as an interval accepted by B -(integer seconds is fine). This method raises an exception on timeout, unless -the B parameter is also given. - -=item timed_out => \$timed_out - -If B is set and this parameter is given, the scalar it references -is set to true if the psql call times out. - -=item connstr => B - -If set, use this as the connection string for the connection to the -backend. - -=item replication => B - -If set, add B to the conninfo string. -Passing the literal value C results in a logical replication -connection. - -=item extra_params => ['--single-transaction'] - -If given, it must be an array reference containing additional parameters to B. - -=back - -e.g. - - my ($stdout, $stderr, $timed_out); - my $cmdret = $node->psql('postgres', 'SELECT pg_sleep(600)', - stdout => \$stdout, stderr => \$stderr, - timeout => $TestLib::timeout_default, - timed_out => \$timed_out, - extra_params => ['--single-transaction']) - -will set $cmdret to undef and $timed_out to a true value. - - $node->psql('postgres', $sql, on_error_die => 1); - -dies with an informative message if $sql fails. - -=cut - -sub psql -{ - my ($self, $dbname, $sql, %params) = @_; - - local %ENV = $self->_get_env(); - - my $stdout = $params{stdout}; - my $stderr = $params{stderr}; - my $replication = $params{replication}; - my $timeout = undef; - my $timeout_exception = 'psql timed out'; - - # Build the connection string. - my $psql_connstr; - if (defined $params{connstr}) - { - $psql_connstr = $params{connstr}; - } - else - { - $psql_connstr = $self->connstr($dbname); - } - $psql_connstr .= defined $replication ? " replication=$replication" : ""; - - my @psql_params = ( - $self->installed_command('psql'), - '-XAtq', '-d', $psql_connstr, '-f', '-'); - - # If the caller wants an array and hasn't passed stdout/stderr - # references, allocate temporary ones to capture them so we - # can return them. Otherwise we won't redirect them at all. - if (wantarray) - { - if (!defined($stdout)) - { - my $temp_stdout = ""; - $stdout = \$temp_stdout; - } - if (!defined($stderr)) - { - my $temp_stderr = ""; - $stderr = \$temp_stderr; - } - } - - $params{on_error_stop} = 1 unless defined $params{on_error_stop}; - $params{on_error_die} = 0 unless defined $params{on_error_die}; - - push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; - push @psql_params, @{ $params{extra_params} } - if defined $params{extra_params}; - - $timeout = - IPC::Run::timeout($params{timeout}, exception => $timeout_exception) - if (defined($params{timeout})); - - ${ $params{timed_out} } = 0 if defined $params{timed_out}; - - # IPC::Run would otherwise append to existing contents: - $$stdout = "" if ref($stdout); - $$stderr = "" if ref($stderr); - - my $ret; - - # Run psql and capture any possible exceptions. If the exception is - # because of a timeout and the caller requested to handle that, just return - # and set the flag. Otherwise, and for any other exception, rethrow. - # - # For background, see - # https://metacpan.org/pod/release/ETHER/Try-Tiny-0.24/lib/Try/Tiny.pm - do - { - local $@; - eval { - my @ipcrun_opts = (\@psql_params, '<', \$sql); - push @ipcrun_opts, '>', $stdout if defined $stdout; - push @ipcrun_opts, '2>', $stderr if defined $stderr; - push @ipcrun_opts, $timeout if defined $timeout; - - IPC::Run::run @ipcrun_opts; - $ret = $?; - }; - my $exc_save = $@; - if ($exc_save) - { - - # IPC::Run::run threw an exception. re-throw unless it's a - # timeout, which we'll handle by testing is_expired - die $exc_save - if (blessed($exc_save) - || $exc_save !~ /^\Q$timeout_exception\E/); - - $ret = undef; - - die "Got timeout exception '$exc_save' but timer not expired?!" - unless $timeout->is_expired; - - if (defined($params{timed_out})) - { - ${ $params{timed_out} } = 1; - } - else - { - die "psql timed out: stderr: '$$stderr'\n" - . "while running '@psql_params'"; - } - } - }; - - if (defined $$stdout) - { - chomp $$stdout; - } - - if (defined $$stderr) - { - chomp $$stderr; - } - - # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR - # We don't use IPC::Run::Simple to limit dependencies. - # - # We always die on signal. - my $core = $ret & 128 ? " (core dumped)" : ""; - die "psql exited with signal " - . ($ret & 127) - . "$core: '$$stderr' while running '@psql_params'" - if $ret & 127; - $ret = $ret >> 8; - - if ($ret && $params{on_error_die}) - { - die "psql error: stderr: '$$stderr'\nwhile running '@psql_params'" - if $ret == 1; - die "connection error: '$$stderr'\nwhile running '@psql_params'" - if $ret == 2; - die - "error running SQL: '$$stderr'\nwhile running '@psql_params' with sql '$sql'" - if $ret == 3; - die "psql returns $ret: '$$stderr'\nwhile running '@psql_params'"; - } - - if (wantarray) - { - return ($ret, $$stdout, $$stderr); - } - else - { - return $ret; - } -} - -=pod - -=item $node->background_psql($dbname, \$stdin, \$stdout, $timer, %params) => harness - -Invoke B on B<$dbname> and return an IPC::Run harness object, which the -caller may use to send input to B. The process's stdin is sourced from -the $stdin scalar reference, and its stdout and stderr go to the $stdout -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 set the timeout length (usually -$TestLib::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. - -Dies on failure to invoke psql, or if psql fails to connect. Errors occurring -later are the caller's problem. psql runs with on_error_stop by default so -that it will stop running sql and return 3 if passed SQL results in an error. - -Be sure to "finish" the harness when done with it. - -=over - -=item on_error_stop => 1 - -By default, the B method invokes the B program with ON_ERROR_STOP=1 -set, so SQL execution is stopped at the first error and exit code 3 is -returned. Set B to 0 to ignore errors instead. - -=item replication => B - -If set, add B to the conninfo string. -Passing the literal value C results in a logical replication -connection. - -=item extra_params => ['--single-transaction'] - -If given, it must be an array reference containing additional parameters to B. - -=back - -=cut - -sub background_psql -{ - my ($self, $dbname, $stdin, $stdout, $timer, %params) = @_; - - local %ENV = $self->_get_env(); - - my $replication = $params{replication}; - - my @psql_params = ( - $self->installed_command('psql'), - '-XAtq', - '-d', - $self->connstr($dbname) - . (defined $replication ? " replication=$replication" : ""), - '-f', - '-'); - - $params{on_error_stop} = 1 unless defined $params{on_error_stop}; - - push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; - push @psql_params, @{ $params{extra_params} } - if defined $params{extra_params}; - - # Ensure there is no data waiting to be sent: - $$stdin = "" if ref($stdin); - # IPC::Run would otherwise append to existing contents: - $$stdout = "" if ref($stdout); - - my $harness = IPC::Run::start \@psql_params, - '<', $stdin, '>', $stdout, $timer; - - # Request some output, and pump until we see it. This means that psql - # connection failures are caught here, relieving callers of the need to - # handle those. (Right now, we have no particularly good handling for - # errors anyway, but that might be added later.) - my $banner = "background_psql: ready"; - $$stdin = "\\echo $banner\n"; - pump $harness until $$stdout =~ /$banner/ || $timer->is_expired; - - die "psql startup timed out" if $timer->is_expired; - - return $harness; -} - -=pod - -=item $node->interactive_psql($dbname, \$stdin, \$stdout, $timer, %params) => harness - -Invoke B on B<$dbname> and return an IPC::Run harness object, -which the caller may use to send interactive input to B. -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 set the timeout length (usually -$TestLib::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. - -Dies on failure to invoke psql, or if psql fails to connect. -Errors occurring later are the caller's problem. - -Be sure to "finish" the harness when done with it. - -The only extra parameter currently accepted is - -=over - -=item extra_params => ['--single-transaction'] - -If given, it must be an array reference containing additional parameters to B. - -=back - -This requires IO::Pty in addition to IPC::Run. - -=cut - -sub interactive_psql -{ - my ($self, $dbname, $stdin, $stdout, $timer, %params) = @_; - - local %ENV = $self->_get_env(); - - my @psql_params = ( - $self->installed_command('psql'), - '-XAt', '-d', $self->connstr($dbname)); - - push @psql_params, @{ $params{extra_params} } - if defined $params{extra_params}; - - # Ensure there is no data waiting to be sent: - $$stdin = "" if ref($stdin); - # IPC::Run would otherwise append to existing contents: - $$stdout = "" if ref($stdout); - - my $harness = IPC::Run::start \@psql_params, - 'pty>', $stdout, $timer; - - # Pump until we see psql's help banner. This ensures that callers - # won't write anything to the pty before it's ready, avoiding an - # implementation issue in IPC::Run. Also, it means that psql - # connection failures are caught here, relieving callers of - # the need to handle those. (Right now, we have no particularly - # good handling for errors anyway, but that might be added later.) - pump $harness - until $$stdout =~ /Type "help" for help/ || $timer->is_expired; - - die "psql startup timed out" if $timer->is_expired; - - return $harness; -} - -# Common sub of pgbench-invoking interfaces. Makes any requested script files -# and returns pgbench command-line options causing use of those files. -sub _pgbench_make_files -{ - my ($self, $files) = @_; - my @file_opts; - - if (defined $files) - { - - # note: files are ordered for determinism - for my $fn (sort keys %$files) - { - my $filename = $self->basedir . '/' . $fn; - push @file_opts, '-f', $filename; - - # cleanup file weight - $filename =~ s/\@\d+$//; - - #push @filenames, $filename; - # filenames are expected to be unique on a test - if (-e $filename) - { - ok(0, "$filename must not already exist"); - unlink $filename or die "cannot unlink $filename: $!"; - } - TestLib::append_to_file($filename, $$files{$fn}); - } - } - - return @file_opts; -} - -=pod - -=item $node->pgbench($opts, $stat, $out, $err, $name, $files, @args) - -Invoke B, with parameters and files. - -=over - -=item $opts - -Options as a string to be split on spaces. - -=item $stat - -Expected exit status. - -=item $out - -Reference to a regexp list that must match stdout. - -=item $err - -Reference to a regexp list that must match stderr. - -=item $name - -Name of test for error messages. - -=item $files - -Reference to filename/contents dictionary. - -=item @args - -Further raw options or arguments. - -=back - -=cut - -sub pgbench -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my ($self, $opts, $stat, $out, $err, $name, $files, @args) = @_; - my @cmd = ( - 'pgbench', - split(/\s+/, $opts), - $self->_pgbench_make_files($files), @args); - - $self->command_checks_all(\@cmd, $stat, $out, $err, $name); -} - -=pod - -=item $node->connect_ok($connstr, $test_name, %params) - -Attempt a connection with a custom connection string. This is expected -to succeed. - -=over - -=item sql => B - -If this parameter is set, this query is used for the connection attempt -instead of the default. - -=item expected_stdout => B - -If this regular expression is set, matches it with the output generated. - -=item log_like => [ qr/required message/ ] - -=item log_unlike => [ qr/prohibited message/ ] - -See C. - -=back - -=cut - -sub connect_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($self, $connstr, $test_name, %params) = @_; - - my $sql; - if (defined($params{sql})) - { - $sql = $params{sql}; - } - else - { - $sql = "SELECT \$\$connected with $connstr\$\$"; - } - - my $log_location = -s $self->logfile; - - # Never prompt for a password, any callers of this routine should - # have set up things properly, and this should not block. - my ($ret, $stdout, $stderr) = $self->psql( - 'postgres', - $sql, - extra_params => ['-w'], - connstr => "$connstr", - on_error_stop => 0); - - is($ret, 0, $test_name); - - if (defined($params{expected_stdout})) - { - like($stdout, $params{expected_stdout}, "$test_name: matches"); - } - $self->log_check($test_name, $log_location, %params); -} - -=pod - -=item $node->connect_fails($connstr, $test_name, %params) - -Attempt a connection with a custom connection string. This is expected -to fail. - -=over - -=item expected_stderr => B - -If this regular expression is set, matches it with the output generated. - -=item log_like => [ qr/required message/ ] - -=item log_unlike => [ qr/prohibited message/ ] - -See C. - -=back - -=cut - -sub connect_fails -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($self, $connstr, $test_name, %params) = @_; - - my $log_location = -s $self->logfile; - - # Never prompt for a password, any callers of this routine should - # have set up things properly, and this should not block. - my ($ret, $stdout, $stderr) = $self->psql( - 'postgres', - undef, - extra_params => ['-w'], - connstr => "$connstr"); - - isnt($ret, 0, $test_name); - - if (defined($params{expected_stderr})) - { - like($stderr, $params{expected_stderr}, "$test_name: matches"); - } - - $self->log_check($test_name, $log_location, %params); -} - -=pod - -=item $node->poll_query_until($dbname, $query [, $expected ]) - -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 $TestLib::timeout_default seconds. -Returns 1 if successful, 0 if timed out. - -=cut - -sub poll_query_until -{ - my ($self, $dbname, $query, $expected) = @_; - - local %ENV = $self->_get_env(); - - $expected = 't' unless defined($expected); # default value - - my $cmd = [ - $self->installed_command('psql'), '-XAt', - '-d', $self->connstr($dbname) - ]; - my ($stdout, $stderr); - my $max_attempts = 10 * $TestLib::timeout_default; - my $attempts = 0; - - while ($attempts < $max_attempts) - { - my $result = IPC::Run::run $cmd, '<', \$query, - '>', \$stdout, '2>', \$stderr; - - chomp($stdout); - chomp($stderr); - - if ($stdout eq $expected && $stderr eq '') - { - return 1; - } - - # Wait 0.1 second before retrying. - usleep(100_000); - - $attempts++; - } - - # 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: -$expected -last actual query output: -$stdout -with stderr: -$stderr); - return 0; -} - -=pod - -=item $node->command_ok(...) - -Runs a shell command like TestLib::command_ok, but with PGHOST and PGPORT set -so that the command will default to connecting to this PostgresNode. - -=cut - -sub command_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my $self = shift; - - local %ENV = $self->_get_env(); - - TestLib::command_ok(@_); - return; -} - -=pod - -=item $node->command_fails(...) - -TestLib::command_fails with our connection parameters. See command_ok(...) - -=cut - -sub command_fails -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my $self = shift; - - local %ENV = $self->_get_env(); - - TestLib::command_fails(@_); - return; -} - -=pod - -=item $node->command_like(...) - -TestLib::command_like with our connection parameters. See command_ok(...) - -=cut - -sub command_like -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my $self = shift; - - local %ENV = $self->_get_env(); - - TestLib::command_like(@_); - return; -} - -=pod - -=item $node->command_checks_all(...) - -TestLib::command_checks_all with our connection parameters. See -command_ok(...) - -=cut - -sub command_checks_all -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my $self = shift; - - local %ENV = $self->_get_env(); - - TestLib::command_checks_all(@_); - return; -} - -=pod - -=item $node->issues_sql_like(cmd, expected_sql, test_name) - -Run a command on the node, then verify that $expected_sql appears in the -server log file. - -=cut - -sub issues_sql_like -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my ($self, $cmd, $expected_sql, $test_name) = @_; - - local %ENV = $self->_get_env(); - - my $log_location = -s $self->logfile; - - my $result = TestLib::run_log($cmd); - ok($result, "@$cmd exit code 0"); - my $log = TestLib::slurp_file($self->logfile, $log_location); - like($log, $expected_sql, "$test_name: SQL found in server log"); - return; -} - -=pod - -=item $node->log_check($offset, $test_name, %parameters) - -Check contents of server logs. - -=over - -=item $test_name - -Name of test for error messages. - -=item $offset - -Offset of the log file. - -=item log_like => [ qr/required message/ ] - -If given, it must be an array reference containing a list of regular -expressions that must match against the server log, using -C. - -=item log_unlike => [ qr/prohibited message/ ] - -If given, it must be an array reference containing a list of regular -expressions that must NOT match against the server log. They will be -passed to C. - -=back - -=cut - -sub log_check -{ - my ($self, $test_name, $offset, %params) = @_; - - my (@log_like, @log_unlike); - if (defined($params{log_like})) - { - @log_like = @{ $params{log_like} }; - } - if (defined($params{log_unlike})) - { - @log_unlike = @{ $params{log_unlike} }; - } - - if (@log_like or @log_unlike) - { - my $log_contents = TestLib::slurp_file($self->logfile, $offset); - - while (my $regex = shift @log_like) - { - like($log_contents, $regex, "$test_name: log matches"); - } - while (my $regex = shift @log_unlike) - { - unlike($log_contents, $regex, "$test_name: log does not match"); - } - } -} - -=pod - -=item $node->log_contains(pattern, offset) - -Find pattern in logfile of node after offset byte. - -=cut - -sub log_contains -{ - my ($self, $pattern, $offset) = @_; - - return TestLib::slurp_file($self->logfile, $offset) =~ m/$pattern/; -} - -=pod - -=item $node->run_log(...) - -Runs a shell command like TestLib::run_log, but with connection parameters set -so that the command will default to connecting to this PostgresNode. - -=cut - -sub run_log -{ - my $self = shift; - - local %ENV = $self->_get_env(); - - TestLib::run_log(@_); - return; -} - -=pod - -=item $node->lsn(mode) - -Look up WAL locations on the server: - - * insert location (primary only, error on replica) - * write location (primary only, error on replica) - * flush location (primary only, error on replica) - * receive location (always undef on primary) - * replay location (always undef on primary) - -mode must be specified. - -=cut - -sub lsn -{ - my ($self, $mode) = @_; - my %modes = ( - 'insert' => 'pg_current_wal_insert_lsn()', - 'flush' => 'pg_current_wal_flush_lsn()', - 'write' => 'pg_current_wal_lsn()', - 'receive' => 'pg_last_wal_receive_lsn()', - 'replay' => 'pg_last_wal_replay_lsn()'); - - $mode = '' if !defined($mode); - croak "unknown mode for 'lsn': '$mode', valid modes are " - . join(', ', keys %modes) - if !defined($modes{$mode}); - - my $result = $self->safe_psql('postgres', "SELECT $modes{$mode}"); - chomp($result); - if ($result eq '') - { - return; - } - else - { - return $result; - } -} - -=pod - -=item $node->wait_for_catchup(standby_name, mode, target_lsn) - -Wait for the node with application_name standby_name (usually from node->name, -also works for logical subscriptions) -until its replication location in pg_stat_replication equals or passes the -upstream's WAL insert point at the time this function is called. By default -the replay_lsn is waited for, but 'mode' may be specified to wait for any of -sent|write|flush|replay. The connection catching up must be in a streaming -state. - -If there is no active replication connection from this peer, waits until -poll_query_until timeout. - -Requires that the 'postgres' db exists and is accessible. - -target_lsn may be any arbitrary lsn, but is typically $primary_node->lsn('insert'). -If omitted, pg_current_wal_lsn() is used. - -This is not a test. It die()s on failure. - -=cut - -sub wait_for_catchup -{ - my ($self, $standby_name, $mode, $target_lsn) = @_; - $mode = defined($mode) ? $mode : 'replay'; - my %valid_modes = - ('sent' => 1, 'write' => 1, 'flush' => 1, 'replay' => 1); - croak "unknown mode $mode for 'wait_for_catchup', valid modes are " - . join(', ', keys(%valid_modes)) - unless exists($valid_modes{$mode}); - - # Allow passing of a PostgresNode instance as shorthand - if (blessed($standby_name) && $standby_name->isa("PostgresNode")) - { - $standby_name = $standby_name->name; - } - my $lsn_expr; - if (defined($target_lsn)) - { - $lsn_expr = "'$target_lsn'"; - } - else - { - $lsn_expr = 'pg_current_wal_lsn()'; - } - print "Waiting for replication conn " - . $standby_name . "'s " - . $mode - . "_lsn to pass " - . $lsn_expr . " on " - . $self->name . "\n"; - my $query = - qq[SELECT $lsn_expr <= ${mode}_lsn AND state = 'streaming' FROM pg_catalog.pg_stat_replication WHERE application_name = '$standby_name';]; - $self->poll_query_until('postgres', $query) - or croak "timed out waiting for catchup"; - print "done\n"; - return; -} - -=pod - -=item $node->wait_for_slot_catchup(slot_name, mode, target_lsn) - -Wait for the named replication slot to equal or pass the supplied target_lsn. -The location used is the restart_lsn unless mode is given, in which case it may -be 'restart' or 'confirmed_flush'. - -Requires that the 'postgres' db exists and is accessible. - -This is not a test. It die()s on failure. - -If the slot is not active, will time out after poll_query_until's timeout. - -target_lsn may be any arbitrary lsn, but is typically $primary_node->lsn('insert'). - -Note that for logical slots, restart_lsn is held down by the oldest in-progress tx. - -=cut - -sub wait_for_slot_catchup -{ - my ($self, $slot_name, $mode, $target_lsn) = @_; - $mode = defined($mode) ? $mode : 'restart'; - if (!($mode eq 'restart' || $mode eq 'confirmed_flush')) - { - croak "valid modes are restart, confirmed_flush"; - } - croak 'target lsn must be specified' unless defined($target_lsn); - print "Waiting for replication slot " - . $slot_name . "'s " - . $mode - . "_lsn to pass " - . $target_lsn . " on " - . $self->name . "\n"; - my $query = - qq[SELECT '$target_lsn' <= ${mode}_lsn FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name';]; - $self->poll_query_until('postgres', $query) - or croak "timed out waiting for catchup"; - print "done\n"; - return; -} - -=pod - -=item $node->wait_for_subscription_sync(publisher, subname, dbname) - -Wait for all tables in pg_subscription_rel to complete the initial -synchronization (i.e to be either in 'syncdone' or 'ready' state). - -If the publisher node is given, additionally, check if the subscriber has -caught up to what has been committed on the primary. This is useful to -ensure that the initial data synchronization has been completed after -creating a new subscription. - -If there is no active replication connection from this peer, wait until -poll_query_until timeout. - -This is not a test. It die()s on failure. - -=cut - -sub wait_for_subscription_sync -{ - my ($self, $publisher, $subname, $dbname) = @_; - my $name = $self->name; - - $dbname = defined($dbname) ? $dbname : 'postgres'; - - # Wait for all tables to finish initial sync. - print "Waiting for all subscriptions in \"$name\" to synchronize data\n"; - my $query = - qq[SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');]; - $self->poll_query_until($dbname, $query) - or croak "timed out waiting for subscriber to synchronize data"; - - # Then, wait for the replication to catchup if required. - if (defined($publisher)) - { - croak 'subscription name must be specified' unless defined($subname); - $publisher->wait_for_catchup($subname); - } - - print "done\n"; - return; -} - -=pod - -=item $node->wait_for_log(regexp, offset) - -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 $TestLib::timeout_default seconds. - -If successful, returns the length of the entire log file, in bytes. - -=cut - -sub wait_for_log -{ - my ($self, $regexp, $offset) = @_; - $offset = 0 unless defined $offset; - - my $max_attempts = 10 * $TestLib::timeout_default; - my $attempts = 0; - - while ($attempts < $max_attempts) - { - my $log = TestLib::slurp_file($self->logfile, $offset); - - return $offset+length($log) if ($log =~ m/$regexp/); - - # Wait 0.1 second before retrying. - usleep(100_000); - - $attempts++; - } - - croak "timed out waiting for match: $regexp"; -} - -=pod - -=item $node->query_hash($dbname, $query, @columns) - -Execute $query on $dbname, replacing any appearance of the string __COLUMNS__ -within the query with a comma-separated list of @columns. - -If __COLUMNS__ does not appear in the query, its result columns must EXACTLY -match the order and number (but not necessarily alias) of supplied @columns. - -The query must return zero or one rows. - -Return a hash-ref representation of the results of the query, with any empty -or null results as defined keys with an empty-string value. There is no way -to differentiate between null and empty-string result fields. - -If the query returns zero rows, return a hash with all columns empty. There -is no way to differentiate between zero rows returned and a row with only -null columns. - -=cut - -sub query_hash -{ - my ($self, $dbname, $query, @columns) = @_; - croak 'calls in array context for multi-row results not supported yet' - if (wantarray); - - # Replace __COLUMNS__ if found - substr($query, index($query, '__COLUMNS__'), length('__COLUMNS__')) = - join(', ', @columns) - if index($query, '__COLUMNS__') >= 0; - my $result = $self->safe_psql($dbname, $query); - - # hash slice, see http://stackoverflow.com/a/16755894/398670 . - # - # Fills the hash with empty strings produced by x-operator element - # duplication if result is an empty row - # - my %val; - @val{@columns} = - $result ne '' ? split(qr/\|/, $result, -1) : ('',) x scalar(@columns); - return \%val; -} - -=pod - -=item $node->slot(slot_name) - -Return hash-ref of replication slot data for the named slot, or a hash-ref with -all values '' if not found. Does not differentiate between null and empty string -for fields, no field is ever undef. - -The restart_lsn and confirmed_flush_lsn fields are returned verbatim, and also -as a 2-list of [highword, lowword] integer. Since we rely on Perl 5.8.8 we can't -"use bigint", it's from 5.20, and we can't assume we have Math::Bigint from CPAN -either. - -=cut - -sub slot -{ - my ($self, $slot_name) = @_; - my @columns = ( - 'plugin', 'slot_type', 'datoid', 'database', - 'active', 'active_pid', 'xmin', 'catalog_xmin', - 'restart_lsn'); - return $self->query_hash( - 'postgres', - "SELECT __COLUMNS__ FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name'", - @columns); -} - -=pod - -=item $node->pg_recvlogical_upto(self, dbname, slot_name, endpos, timeout_secs, ...) - -Invoke pg_recvlogical to read from slot_name on dbname until LSN endpos, which -corresponds to pg_recvlogical --endpos. Gives up after timeout (if nonzero). - -Disallows pg_recvlogical from internally retrying on error by passing --no-loop. - -Plugin options are passed as additional keyword arguments. - -If called in scalar context, returns stdout, and die()s on timeout or nonzero return. - -If called in array context, returns a tuple of (retval, stdout, stderr, timeout). -timeout is the IPC::Run::Timeout object whose is_expired method can be tested -to check for timeout. retval is undef on timeout. - -=cut - -sub pg_recvlogical_upto -{ - my ($self, $dbname, $slot_name, $endpos, $timeout_secs, %plugin_options) - = @_; - - local %ENV = $self->_get_env(); - - my ($stdout, $stderr); - - my $timeout_exception = 'pg_recvlogical timed out'; - - croak 'slot name must be specified' unless defined($slot_name); - croak 'endpos must be specified' unless defined($endpos); - - my @cmd = ( - $self->installed_command('pg_recvlogical'), - '-S', $slot_name, '--dbname', $self->connstr($dbname)); - push @cmd, '--endpos', $endpos; - push @cmd, '-f', '-', '--no-loop', '--start'; - - while (my ($k, $v) = each %plugin_options) - { - croak "= is not permitted to appear in replication option name" - if ($k =~ qr/=/); - push @cmd, "-o", "$k=$v"; - } - - my $timeout; - $timeout = - IPC::Run::timeout($timeout_secs, exception => $timeout_exception) - if $timeout_secs; - my $ret = 0; - - do - { - local $@; - eval { - IPC::Run::run(\@cmd, ">", \$stdout, "2>", \$stderr, $timeout); - $ret = $?; - }; - my $exc_save = $@; - if ($exc_save) - { - - # IPC::Run::run threw an exception. re-throw unless it's a - # timeout, which we'll handle by testing is_expired - die $exc_save - if (blessed($exc_save) || $exc_save !~ qr/$timeout_exception/); - - $ret = undef; - - die "Got timeout exception '$exc_save' but timer not expired?!" - unless $timeout->is_expired; - - die - "$exc_save waiting for endpos $endpos with stdout '$stdout', stderr '$stderr'" - unless wantarray; - } - }; - - if (wantarray) - { - return ($ret, $stdout, $stderr, $timeout); - } - else - { - die - "pg_recvlogical exited with code '$ret', stdout '$stdout' and stderr '$stderr'" - if $ret; - return $stdout; - } -} - -=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 - -1; diff --git a/third_party/spanner_pg/src/test/perl/PostgresVersion.pm b/third_party/spanner_pg/src/test/perl/PostgresVersion.pm deleted file mode 100644 index 884d0e94..00000000 --- a/third_party/spanner_pg/src/test/perl/PostgresVersion.pm +++ /dev/null @@ -1,139 +0,0 @@ -############################################################################ -# -# PostgresVersion.pm -# -# Module encapsulating Postgres Version numbers -# -# Copyright (c) 2021, PostgreSQL Global Development Group -# -############################################################################ - -=pod - -=head1 NAME - -PostgresVersion - class representing PostgreSQL version numbers - -=head1 SYNOPSIS - - use PostgresVersion; - - my $version = PostgresVersion->new($version_arg); - - # compare two versions - my $bool = $version1 <= $version2; - - # or compare with a number - $bool = $version < 12; - - # or with a string - $bool = $version lt "13.1"; - - # interpolate in a string - my $stringyval = "version: $version"; - -=head1 DESCRIPTION - -PostgresVersion encapsulates Postgres version numbers, providing parsing -of common version formats and comparison operations. - -=cut - -package PostgresVersion; - -use strict; -use warnings; - -use Scalar::Util qw(blessed); - -use overload - '<=>' => \&_version_cmp, - 'cmp' => \&_version_cmp, - '""' => \&_stringify; - -=pod - -=head1 METHODS - -=over - -=item PostgresVersion->new($version) - -Create a new PostgresVersion instance. - -The argument can be a number like 12, or a string like '12.2' or the output -of a Postgres command like `psql --version` or `pg_config --version`; - -=back - -=cut - -sub new -{ - my $class = shift; - my $arg = shift; - - chomp $arg; - - # Accept standard formats, in case caller has handed us the output of a - # postgres command line tool - my $devel; - ($arg, $devel) = ($1, $2) - if ( - $arg =~ m!^ # beginning of line - (?:\(?PostgreSQL\)?\s)? # ignore PostgreSQL marker - (\d+(?:\.\d+)*) # version number, dotted notation - (devel|(?:alpha|beta|rc)\d+)? # dev marker - see version_stamp.pl - !x); - - # Split into an array - my @numbers = split(/\./, $arg); - - # Treat development versions as having a minor/micro version one less than - # the first released version of that branch. - push @numbers, -1 if ($devel); - - $devel ||= ""; - - return bless { str => "$arg$devel", num => \@numbers }, $class; -} - -# Routine which compares the _pg_version_array obtained for the two -# arguments and returns -1, 0, or 1, allowing comparison between two -# PostgresVersion objects or a PostgresVersion and a version string or number. -# -# If the second argument is not a blessed object we call the constructor -# to make one. -# -# Because we're overloading '<=>' and 'cmp' this function supplies us with -# all the comparison operators ('<' and friends, 'gt' and friends) -# -sub _version_cmp -{ - my ($a, $b, $swapped) = @_; - - $b = __PACKAGE__->new($b) unless blessed($b); - - ($a, $b) = ($b, $a) if $swapped; - - my ($an, $bn) = ($a->{num}, $b->{num}); - - for (my $idx = 0;; $idx++) - { - return 0 - if ($idx >= @$an && $idx >= @$bn); - # treat a missing number as 0 - my ($anum, $bnum) = ($an->[$idx] || 0, $bn->[$idx] || 0); - return $anum <=> $bnum - if ($anum <=> $bnum); - } -} - -# Render the version number using the saved string. -sub _stringify -{ - my $self = shift; - return $self->{str}; -} - -1; diff --git a/third_party/spanner_pg/src/test/perl/README b/third_party/spanner_pg/src/test/perl/README index 655448cc..92acf425 100644 --- a/third_party/spanner_pg/src/test/perl/README +++ b/third_party/spanner_pg/src/test/perl/README @@ -12,22 +12,41 @@ $(prove_installcheck) targets in Makefile.global. By default every test in the t/ subdirectory is run. Individual test(s) can be run instead by passing something like PROVE_TESTS="t/001_testname.pl t/002_othertestname.pl" to make. -You should prefer to write tests using pg_regress in src/test/regress, or -isolation tester specs in src/test/isolation, if possible. If not, check to -see if your new tests make sense under an existing tree in src/test, like -src/test/ssl, or should be added to one of the suites for an existing utility. - -Note that all tests and test tools should have perltidy run on them before -patches are submitted, using perltidy --profile=src/tools/pgindent/perltidyrc - By default, to keep the noise low during runs, we do not set any flags via PROVE_FLAGS, but this can be done on the 'make' command line if desired, eg: make check-world PROVE_FLAGS='--verbose' +When a test fails, the terminal output from 'prove' is usually not sufficient +to diagnose the problem. Look into the log files that are left under +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, the data directories will be retained +regardless of test status. This environment variable also prevents the +test's temporary directories from being removed. + + Writing tests ------------- +You should prefer to write tests using pg_regress in src/test/regress, or +isolation tester specs in src/test/isolation, if possible. If not, check to +see if your new tests make sense under an existing tree in src/test, like +src/test/ssl, or should be added to one of the suites for an existing utility. + +Note that all tests and test tools should have perltidy run on them before +patches are submitted, using perltidy --profile=src/tools/pgindent/perltidyrc + Tests are written using Perl's Test::More with some PostgreSQL-specific infrastructure from src/test/perl providing node management, support for invoking 'psql' to run queries and get results, etc. You should read the @@ -40,15 +59,14 @@ Each test script should begin with: use strict; use warnings; - use PostgresNode; - use TestLib; - # Replace with the number of tests to execute: - use Test::More tests => 1; + use PostgreSQL::Test::Cluster; + use PostgreSQL::Test::Utils; + use Test::More; then it will generally need to set up one or more nodes, run commands against them and evaluate the results. For example: - my $node = PostgresNode->get_new_node('primary'); + my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init; $node->start; @@ -57,6 +75,10 @@ against them and evaluate the results. For example: $node->stop('fast'); +Each test script should end with: + + done_testing(); + Test::More::like entails use of the qr// operator. Avoid Perl 5.8.8 bug #39185 by not using the "$" regular expression metacharacter in qr// when also using the "/m" modifier. Instead of "$", use "\n" or "(?=\n|\z)". @@ -76,22 +98,41 @@ Read the documentation for more on how to write tests: For available PostgreSQL-specific test methods and some example tests read the perldoc for the test modules, e.g.: - perldoc src/test/perl/PostgresNode.pm + perldoc src/test/perl/PostgreSQL/Test/Cluster.pm -Required Perl -------------- +Portability +----------- -Tests must run on perl 5.8.0 and newer. perlbrew is a good way to obtain such -a Perl; see http://perlbrew.pl . +Avoid using any bleeding-edge Perl features. We have buildfarm animals +running Perl versions as old as 5.8.3, so your tests will be expected +to pass on that. -Just install and +Also, do not use any non-core Perl modules except IPC::Run. Or, if you +must do so for a particular test, arrange to skip the test when the needed +module isn't present. If unsure, you can consult Module::CoreList to find +out whether a given module is part of the Perl core, and which module +versions shipped with which Perl releases. - perlbrew --force install 5.8.0 - perlbrew use 5.8.0 +One way to test for compatibility with old Perl versions is to use +perlbrew; see http://perlbrew.pl . After installing that, do + + export PERLBREW_CONFIGURE_FLAGS='-de -Duseshrplib' + perlbrew --force install 5.8.3 + perlbrew use 5.8.3 perlbrew install-cpanm - cpanm install IPC::Run + cpanm install Test::Simple@0.98 + cpanm install IPC::Run@0.79 + cpanm install ExtUtils::MakeMaker@6.50 # downgrade + +TIP: if Test::Simple's utf8 regression test hangs up, try setting a +UTF8-compatible locale, e.g. "export LANG=en_US.utf8". -then re-run configure to ensure the correct Perl is used when running -tests. To verify that the right Perl was found: +Then re-run Postgres' configure to ensure the correct Perl is used when +running tests. To verify that the right Perl was found: grep ^PERL= config.log + +Due to limitations of cpanm, this recipe doesn't exactly duplicate the +module list of older buildfarm animals. The discrepancies should seldom +matter, but if you want to be sure, bypass cpanm and instead manually +install the desired versions of Test::Simple and IPC::Run. diff --git a/third_party/spanner_pg/src/test/perl/SimpleTee.pm b/third_party/spanner_pg/src/test/perl/SimpleTee.pm deleted file mode 100644 index 681a36a0..00000000 --- a/third_party/spanner_pg/src/test/perl/SimpleTee.pm +++ /dev/null @@ -1,35 +0,0 @@ - -# Copyright (c) 2021, PostgreSQL Global Development Group - -# A simple 'tee' implementation, using perl tie. -# -# Whenever you print to the handle, it gets forwarded to a list of -# handles. The list of output filehandles is passed to the constructor. -# -# This is similar to IO::Tee, but only used for output. Only the PRINT -# method is currently implemented; that's all we need. We don't want to -# depend on IO::Tee just for this. - -package SimpleTee; -use strict; -use warnings; - -sub TIEHANDLE -{ - my $self = shift; - return bless \@_, $self; -} - -sub PRINT -{ - my $self = shift; - my $ok = 1; - for my $fh (@$self) - { - print $fh @_ or $ok = 0; - $fh->flush or $ok = 0; - } - return $ok; -} - -1; diff --git a/third_party/spanner_pg/src/test/perl/TestLib.pm b/third_party/spanner_pg/src/test/perl/TestLib.pm deleted file mode 100644 index 1aed8d4c..00000000 --- a/third_party/spanner_pg/src/test/perl/TestLib.pm +++ /dev/null @@ -1,1020 +0,0 @@ - -# Copyright (c) 2021, PostgreSQL Global Development Group - -=pod - -=head1 NAME - -TestLib - helper module for writing PostgreSQL's C tests. - -=head1 SYNOPSIS - - use TestLib; - - # Test basic output of a command - program_help_ok('initdb'); - program_version_ok('initdb'); - program_options_handling_ok('initdb'); - - # Test option combinations - command_fails(['initdb', '--invalid-option'], - 'command fails with invalid option'); - my $tempdir = TestLib::tempdir; - command_ok('initdb', '-D', $tempdir); - - # Miscellanea - print "on Windows" if $TestLib::windows_os; - ok(check_mode_recursive($stream_dir, 0700, 0600), - "check stream dir permissions"); - TestLib::system_log('pg_ctl', 'kill', 'QUIT', $slow_pid); - -=head1 DESCRIPTION - -C contains a set of routines dedicated to environment setup for -a PostgreSQL regression test run and includes some low-level routines -aimed at controlling command execution, logging and test functions. - -=cut - -# This module should never depend on any other PostgreSQL regression test -# modules. - -package TestLib; - -use strict; -use warnings; - -use Carp; -use Config; -use Cwd; -use Exporter 'import'; -use Fcntl qw(:mode :seek); -use File::Basename; -use File::Find; -use File::Spec; -use File::stat qw(stat); -use File::Temp (); -use IPC::Run; -use SimpleTee; - -# specify a recent enough version of Test::More to support the -# done_testing() function -use Test::More 0.87; - -our @EXPORT = qw( - generate_ascii_string - slurp_dir - slurp_file - append_to_file - check_mode_recursive - chmod_recursive - check_pg_config - dir_symlink - scan_server_header - system_or_bail - system_log - run_log - run_command - pump_until - - command_ok - command_fails - command_exit_is - program_help_ok - program_version_ok - program_options_handling_ok - command_like - command_like_safe - command_fails_like - command_checks_all - - $windows_os - $is_msys2 - $use_unix_sockets -); - -our ($windows_os, $is_msys2, $use_unix_sockets, $timeout_default, - $tmp_check, $log_path, $test_logfile); - -BEGIN -{ - - # Set to untranslated messages, to be able to compare program output - # with expected strings. - delete $ENV{LANGUAGE}; - delete $ENV{LC_ALL}; - $ENV{LC_MESSAGES} = 'C'; - - # This list should be kept in sync with pg_regress.c. - my @envkeys = qw ( - PGCHANNELBINDING - PGCLIENTENCODING - PGCONNECT_TIMEOUT - PGDATA - PGDATABASE - PGGSSENCMODE - PGGSSLIB - PGHOSTADDR - PGKRBSRVNAME - PGPASSFILE - PGPASSWORD - PGREQUIREPEER - PGREQUIRESSL - PGSERVICE - PGSERVICEFILE - PGSSLCERT - PGSSLCRL - PGSSLCRLDIR - PGSSLKEY - PGSSLMAXPROTOCOLVERSION - PGSSLMINPROTOCOLVERSION - PGSSLMODE - PGSSLROOTCERT - PGSSLSNI - PGTARGETSESSIONATTRS - PGUSER - PGPORT - PGHOST - PG_COLOR - ); - delete @ENV{@envkeys}; - - $ENV{PGAPPNAME} = basename($0); - - # Must be set early - $windows_os = $Config{osname} eq 'MSWin32' || $Config{osname} eq 'msys'; - # Check if this environment is MSYS2. - $is_msys2 = $windows_os && -x '/usr/bin/uname' && - `uname -or` =~ /^[2-9].*Msys/; - - if ($windows_os) - { - require Win32API::File; - Win32API::File->import( - qw(createFile OsFHandleOpen CloseHandle)); - } - - # Specifies whether to use Unix sockets for test setups. On - # Windows we don't use them by default since it's not universally - # 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 - -=head1 EXPORTED VARIABLES - -=over - -=item C<$windows_os> - -Set to true when running under Windows, except on Cygwin. - -=item C<$is_msys2> - -Set to true when running under MSYS2. - -=back - -=cut - -INIT -{ - - # Return EPIPE instead of killing the process with SIGPIPE. An affected - # test may still fail, but it's more likely to report useful facts. - $SIG{PIPE} = 'IGNORE'; - - # Determine output directories, and create them. The base path is the - # TESTDIR environment variable, which is normally set by the invoking - # Makefile. - $tmp_check = $ENV{TESTDIR} ? "$ENV{TESTDIR}/tmp_check" : "tmp_check"; - $log_path = "$tmp_check/log"; - - mkdir $tmp_check; - mkdir $log_path; - - # Open the test log file, whose name depends on the test name. - $test_logfile = basename($0); - $test_logfile =~ s/\.[^.]+$//; - $test_logfile = "$log_path/regress_log_$test_logfile"; - open my $testlog, '>', $test_logfile - or die "could not open STDOUT to logfile \"$test_logfile\": $!"; - - # Hijack STDOUT and STDERR to the log file - open(my $orig_stdout, '>&', \*STDOUT); - open(my $orig_stderr, '>&', \*STDERR); - open(STDOUT, '>&', $testlog); - open(STDERR, '>&', $testlog); - - # The test output (ok ...) needs to be printed to the original STDOUT so - # that the 'prove' program can parse it, and display it to the user in - # real time. But also copy it to the log file, to provide more context - # in the log. - my $builder = Test::More->builder; - my $fh = $builder->output; - tie *$fh, "SimpleTee", $orig_stdout, $testlog; - $fh = $builder->failure_output; - tie *$fh, "SimpleTee", $orig_stderr, $testlog; - - # Enable auto-flushing for all the file handles. Stderr and stdout are - # redirected to the same file, and buffering causes the lines to appear - # in the log in confusing order. - autoflush STDOUT 1; - autoflush STDERR 1; - autoflush $testlog 1; -} - -END -{ - - # Test files have several ways of causing prove_check to fail: - # 1. Exit with a non-zero status. - # 2. Call ok(0) or similar, indicating that a constituent test failed. - # 3. Deviate from the planned number of tests. - # - # Preserve temporary directories after (1) and after (2). - $File::Temp::KEEP_ALL = 1 unless $? == 0 && all_tests_passing(); -} - -=pod - -=head1 ROUTINES - -=over - -=item all_tests_passing() - -Return 1 if all the tests run so far have passed. Otherwise, return 0. - -=cut - -sub all_tests_passing -{ - foreach my $status (Test::More->builder->summary) - { - return 0 unless $status; - } - return 1; -} - -=pod - -=item tempdir(prefix) - -Securely create a temporary directory inside C<$tmp_check>, like C, -and return its name. The directory will be removed automatically at the -end of the tests, unless the environment variable PG_TEST_NOCLEAN is provided. - -If C is given, the new directory is templated as C<${prefix}_XXXX>. -Otherwise the template is C. - -=cut - -sub tempdir -{ - my ($prefix) = @_; - $prefix = "tmp_test" unless defined $prefix; - return File::Temp::tempdir( - $prefix . '_XXXX', - DIR => $tmp_check, - CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); -} - -=pod - -=item tempdir_short() - -As above, but the directory is outside the build tree so that it has a short -name, to avoid path length issues. - -=cut - -sub tempdir_short -{ - - return File::Temp::tempdir( - CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); -} - -=pod - -=item has_wal_read_bug() - -Returns true if $tmp_check is subject to a sparc64+ext4 bug that causes WAL -readers to see zeros if another process simultaneously wrote the same offsets. -Consult this in tests that fail frequently on affected configurations. The -bug has made streaming standbys fail to advance, reporting corrupt WAL. It -has made COMMIT PREPARED fail with "could not read two-phase state from WAL". -Non-WAL PostgreSQL reads haven't been affected, likely because those readers -and writers have buffering systems in common. See -https://postgr.es/m/20220116210241.GC756210@rfd.leadboat.com for details. - -=cut - -sub has_wal_read_bug -{ - return - $Config{osname} eq 'linux' - && $Config{archname} =~ /^sparc/ - && !run_log([ qw(df -x ext4), $tmp_check ], '>', '/dev/null', '2>&1'); -} - -=pod - -=item system_log(@cmd) - -Run (via C) the command passed as argument; the return -value is passed through. - -=cut - -sub system_log -{ - print("# Running: " . join(" ", @_) . "\n"); - return system(@_); -} - -=pod - -=item system_or_bail(@cmd) - -Run (via C) the command passed as argument, and returns -if the command is successful. -On failure, abandon further tests and exit the program. - -=cut - -sub system_or_bail -{ - if (system_log(@_) != 0) - { - BAIL_OUT("system $_[0] failed"); - } - return; -} - -=pod - -=item run_log(@cmd) - -Run the given command via C, noting it in the log. -The return value from the command is passed through. - -=cut - -sub run_log -{ - print("# Running: " . join(" ", @{ $_[0] }) . "\n"); - return IPC::Run::run(@_); -} - -=pod - -=item run_command(cmd) - -Run (via C) the command passed as argument. -The return value from the command is ignored. -The return value is C<($stdout, $stderr)>. - -=cut - -sub run_command -{ - my ($cmd) = @_; - my ($stdout, $stderr); - my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; - chomp($stdout); - chomp($stderr); - return ($stdout, $stderr); -} - -=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/; - 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; -} - -=pod - -=item generate_ascii_string(from_char, to_char) - -Generate a string made of the given range of ASCII characters. - -=cut - -sub generate_ascii_string -{ - my ($from_char, $to_char) = @_; - my $res; - - for my $i ($from_char .. $to_char) - { - $res .= sprintf("%c", $i); - } - return $res; -} - -=pod - -=item slurp_dir(dir) - -Return the complete list of entries in the specified directory. - -=cut - -sub slurp_dir -{ - my ($dir) = @_; - opendir(my $dh, $dir) - or croak "could not opendir \"$dir\": $!"; - my @direntries = readdir $dh; - closedir $dh; - return @direntries; -} - -=pod - -=item slurp_file(filename [, $offset]) - -Return the full contents of the specified file, beginning from an -offset position if specified. - -=cut - -sub slurp_file -{ - my ($filename, $offset) = @_; - local $/; - my $contents; - my $fh; - - # On windows open file using win32 APIs, to allow us to set the - # FILE_SHARE_DELETE flag ("d" below), otherwise other accesses to the file - # may fail. - if ($Config{osname} ne 'MSWin32') - { - open($fh, '<', $filename) - or croak "could not read \"$filename\": $!"; - } - else - { - my $fHandle = createFile($filename, "r", "rwd") - or croak "could not open \"$filename\": $^E"; - OsFHandleOpen($fh = IO::Handle->new(), $fHandle, 'r') - or croak "could not read \"$filename\": $^E\n"; - } - - if (defined($offset)) - { - seek($fh, $offset, SEEK_SET) - or croak "could not seek \"$filename\": $!"; - } - - $contents = <$fh>; - close $fh; - - return $contents; -} - -=pod - -=item append_to_file(filename, str) - -Append a string at the end of a given file. (Note: no newline is appended at -end of file.) - -=cut - -sub append_to_file -{ - my ($filename, $str) = @_; - open my $fh, ">>", $filename - or croak "could not write \"$filename\": $!"; - print $fh $str; - close $fh; - return; -} - -=pod - -=item check_mode_recursive(dir, expected_dir_mode, expected_file_mode, ignore_list) - -Check that all file/dir modes in a directory match the expected values, -ignoring files in C (basename only). - -=cut - -sub check_mode_recursive -{ - my ($dir, $expected_dir_mode, $expected_file_mode, $ignore_list) = @_; - - # Result defaults to true - my $result = 1; - - find( - { - follow_fast => 1, - wanted => sub { - # Is file in the ignore list? - foreach my $ignore ($ignore_list ? @{$ignore_list} : []) - { - if ("$dir/$ignore" eq $File::Find::name) - { - return; - } - } - - # Allow ENOENT. A running server can delete files, such as - # those in pg_stat. Other stat() failures are fatal. - my $file_stat = stat($File::Find::name); - unless (defined($file_stat)) - { - my $is_ENOENT = $!{ENOENT}; - my $msg = "unable to stat $File::Find::name: $!"; - if ($is_ENOENT) - { - warn $msg; - return; - } - else - { - die $msg; - } - } - - my $file_mode = S_IMODE($file_stat->mode); - - # Is this a file? - if (S_ISREG($file_stat->mode)) - { - if ($file_mode != $expected_file_mode) - { - print( - *STDERR, - sprintf("$File::Find::name mode must be %04o\n", - $expected_file_mode)); - - $result = 0; - return; - } - } - - # Else a directory? - elsif (S_ISDIR($file_stat->mode)) - { - if ($file_mode != $expected_dir_mode) - { - print( - *STDERR, - sprintf("$File::Find::name mode must be %04o\n", - $expected_dir_mode)); - - $result = 0; - return; - } - } - - # Else something we can't handle - else - { - die "unknown file type for $File::Find::name"; - } - } - }, - $dir); - - return $result; -} - -=pod - -=item chmod_recursive(dir, dir_mode, file_mode) - -C recursively each file and directory within the given directory. - -=cut - -sub chmod_recursive -{ - my ($dir, $dir_mode, $file_mode) = @_; - - find( - { - follow_fast => 1, - wanted => sub { - my $file_stat = stat($File::Find::name); - - if (defined($file_stat)) - { - chmod( - S_ISDIR($file_stat->mode) ? $dir_mode : $file_mode, - $File::Find::name - ) or die "unable to chmod $File::Find::name"; - } - } - }, - $dir); - return; -} - -=pod - -=item scan_server_header(header_path, regexp) - -Returns an array that stores all the matches of the given regular expression -within the PostgreSQL installation's C. This can be used to -retrieve specific value patterns from the installation's header files. - -=cut - -sub scan_server_header -{ - my ($header_path, $regexp) = @_; - - my ($stdout, $stderr); - my $result = IPC::Run::run [ 'pg_config', '--includedir-server' ], '>', - \$stdout, '2>', \$stderr - or die "could not execute pg_config"; - chomp($stdout); - $stdout =~ s/\r$//; - - open my $header_h, '<', "$stdout/$header_path" or die "$!"; - - my @match = undef; - while (<$header_h>) - { - my $line = $_; - - if (@match = $line =~ /^$regexp/) - { - last; - } - } - - close $header_h; - die "could not find match in header $header_path\n" - unless @match; - return @match; -} - -=pod - -=item check_pg_config(regexp) - -Return the number of matches of the given regular expression -within the installation's C. - -=cut - -sub check_pg_config -{ - my ($regexp) = @_; - my ($stdout, $stderr); - my $result = IPC::Run::run [ 'pg_config', '--includedir' ], '>', - \$stdout, '2>', \$stderr - or die "could not execute pg_config"; - chomp($stdout); - $stdout =~ s/\r$//; - - open my $pg_config_h, '<', "$stdout/pg_config.h" or die "$!"; - my $match = (grep { /^$regexp/ } <$pg_config_h>); - close $pg_config_h; - return $match; -} - -=pod - -=item dir_symlink(oldname, newname) - -Portably create a symlink for a directory. On Windows this creates a junction -point. Elsewhere it just calls perl's builtin symlink. - -=cut - -sub dir_symlink -{ - my $oldname = shift; - my $newname = shift; - if ($windows_os) - { - $oldname =~ s,/,\\,g; - $newname =~ s,/,\\,g; - my $cmd = qq{mklink /j "$newname" "$oldname"}; - if ($Config{osname} eq 'msys') - { - # need some indirection on msys - $cmd = qq{echo '$cmd' | \$COMSPEC /Q}; - } - system($cmd); - } - else - { - symlink $oldname, $newname; - } - die "No $newname" unless -e $newname; -} - -=pod - -=back - -=head1 Test::More-LIKE METHODS - -=over - -=item command_ok(cmd, test_name) - -Check that the command runs (via C) successfully. - -=cut - -sub command_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $test_name) = @_; - my $result = run_log($cmd); - ok($result, $test_name); - return; -} - -=pod - -=item command_fails(cmd, test_name) - -Check that the command fails (when run via C). - -=cut - -sub command_fails -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $test_name) = @_; - my $result = run_log($cmd); - ok(!$result, $test_name); - return; -} - -=pod - -=item command_exit_is(cmd, expected, test_name) - -Check that the command exit code matches the expected exit code. - -=cut - -sub command_exit_is -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $expected, $test_name) = @_; - print("# Running: " . join(" ", @{$cmd}) . "\n"); - my $h = IPC::Run::start $cmd; - $h->finish(); - - # Normally, if the child called exit(N), IPC::Run::result() returns N. On - # Windows, with IPC::Run v20220807.0 and earlier, full_results() is the - # method that returns N (https://github.com/toddr/IPC-Run/issues/161). - my $result = - ($Config{osname} eq "MSWin32" && $IPC::Run::VERSION <= 20220807.0) - ? ($h->full_results)[0] - : $h->result(0); - is($result, $expected, $test_name); - return; -} - -=pod - -=item program_help_ok(cmd) - -Check that the command supports the C<--help> option. - -=cut - -sub program_help_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd) = @_; - my ($stdout, $stderr); - print("# Running: $cmd --help\n"); - my $result = IPC::Run::run [ $cmd, '--help' ], '>', \$stdout, '2>', - \$stderr; - ok($result, "$cmd --help exit code 0"); - isnt($stdout, '', "$cmd --help goes to stdout"); - is($stderr, '', "$cmd --help nothing to stderr"); - return; -} - -=pod - -=item program_version_ok(cmd) - -Check that the command supports the C<--version> option. - -=cut - -sub program_version_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd) = @_; - my ($stdout, $stderr); - print("# Running: $cmd --version\n"); - my $result = IPC::Run::run [ $cmd, '--version' ], '>', \$stdout, '2>', - \$stderr; - ok($result, "$cmd --version exit code 0"); - isnt($stdout, '', "$cmd --version goes to stdout"); - is($stderr, '', "$cmd --version nothing to stderr"); - return; -} - -=pod - -=item program_options_handling_ok(cmd) - -Check that a command with an invalid option returns a non-zero -exit code and error message. - -=cut - -sub program_options_handling_ok -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd) = @_; - my ($stdout, $stderr); - print("# Running: $cmd --not-a-valid-option\n"); - my $result = IPC::Run::run [ $cmd, '--not-a-valid-option' ], '>', - \$stdout, - '2>', \$stderr; - ok(!$result, "$cmd with invalid option nonzero exit code"); - isnt($stderr, '', "$cmd with invalid option prints error message"); - return; -} - -=pod - -=item command_like(cmd, expected_stdout, test_name) - -Check that the command runs successfully and the output -matches the given regular expression. - -=cut - -sub command_like -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $expected_stdout, $test_name) = @_; - my ($stdout, $stderr); - print("# Running: " . join(" ", @{$cmd}) . "\n"); - my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; - ok($result, "$test_name: exit code 0"); - is($stderr, '', "$test_name: no stderr"); - like($stdout, $expected_stdout, "$test_name: matches"); - return; -} - -=pod - -=item command_like_safe(cmd, expected_stdout, test_name) - -Check that the command runs successfully and the output -matches the given regular expression. Doesn't assume that the -output files are closed. - -=cut - -sub command_like_safe -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - # Doesn't rely on detecting end of file on the file descriptors, - # which can fail, causing the process to hang, notably on Msys - # when used with 'pg_ctl start' - my ($cmd, $expected_stdout, $test_name) = @_; - my ($stdout, $stderr); - my $stdoutfile = File::Temp->new(); - my $stderrfile = File::Temp->new(); - print("# Running: " . join(" ", @{$cmd}) . "\n"); - my $result = IPC::Run::run $cmd, '>', $stdoutfile, '2>', $stderrfile; - $stdout = slurp_file($stdoutfile); - $stderr = slurp_file($stderrfile); - ok($result, "$test_name: exit code 0"); - is($stderr, '', "$test_name: no stderr"); - like($stdout, $expected_stdout, "$test_name: matches"); - return; -} - -=pod - -=item command_fails_like(cmd, expected_stderr, test_name) - -Check that the command fails and the error message matches -the given regular expression. - -=cut - -sub command_fails_like -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($cmd, $expected_stderr, $test_name) = @_; - my ($stdout, $stderr); - print("# Running: " . join(" ", @{$cmd}) . "\n"); - my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; - ok(!$result, "$test_name: exit code not 0"); - like($stderr, $expected_stderr, "$test_name: matches"); - return; -} - -=pod - -=item command_checks_all(cmd, ret, out, err, test_name) - -Run a command and check its status and outputs. -Arguments: - -=over - -=item C: Array reference of command and arguments to run - -=item C: Expected exit code - -=item C: Expected stdout from command - -=item C: Expected stderr from command - -=item C: test name - -=back - -=cut - -sub command_checks_all -{ - local $Test::Builder::Level = $Test::Builder::Level + 1; - - my ($cmd, $expected_ret, $out, $err, $test_name) = @_; - - # run command - my ($stdout, $stderr); - print("# Running: " . join(" ", @{$cmd}) . "\n"); - IPC::Run::run($cmd, '>', \$stdout, '2>', \$stderr); - - # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR - my $ret = $?; - die "command exited with signal " . ($ret & 127) - if $ret & 127; - $ret = $ret >> 8; - - # check status - ok($ret == $expected_ret, - "$test_name status (got $ret vs expected $expected_ret)"); - - # check stdout - for my $re (@$out) - { - like($stdout, $re, "$test_name stdout /$re/"); - } - - # check stderr - for my $re (@$err) - { - like($stderr, $re, "$test_name stderr /$re/"); - } - - return; -} - -=pod - -=back - -=cut - -1; diff --git a/third_party/spanner_pg/src/test/recovery/Makefile b/third_party/spanner_pg/src/test/recovery/Makefile index 288c04b8..c47eee27 100644 --- a/third_party/spanner_pg/src/test/recovery/Makefile +++ b/third_party/spanner_pg/src/test/recovery/Makefile @@ -2,20 +2,20 @@ # # Makefile for src/test/recovery # -# 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 # # src/test/recovery/Makefile # #------------------------------------------------------------------------- -EXTRA_INSTALL=contrib/test_decoding +EXTRA_INSTALL=contrib/test_decoding contrib/pg_prewarm subdir = src/test/recovery top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -# required for 017_shm.pl +# required for 017_shm.pl and 027_stream_regress.pl REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX) export REGRESS_SHLIB diff --git a/third_party/spanner_pg/src/test/recovery/README b/third_party/spanner_pg/src/test/recovery/README index 632e720e..da116796 100644 --- a/third_party/spanner_pg/src/test/recovery/README +++ b/third_party/spanner_pg/src/test/recovery/README @@ -10,7 +10,7 @@ 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/test_decoding in addition to the core code. +contrib/pg_prewarm and contrib/test_decoding in addition to the core code. Run make check @@ -23,3 +23,5 @@ 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/third_party/spanner_pg/src/test/recovery/t/001_stream_rep.pl b/third_party/spanner_pg/src/test/recovery/t/001_stream_rep.pl index 2a1bc815..86864098 100644 --- a/third_party/spanner_pg/src/test/recovery/t/001_stream_rep.pl +++ b/third_party/spanner_pg/src/test/recovery/t/001_stream_rep.pl @@ -1,15 +1,15 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Minimal test testing streaming replication use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 49; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); # A specific role is created to perform some tests related to replication, # and it needs proper authentication configuration. $node_primary->init( @@ -22,7 +22,7 @@ $node_primary->backup($backup_name); # Create streaming standby linking to primary -my $node_standby_1 = get_new_node('standby_1'); +my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby_1'); $node_standby_1->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby_1->start; @@ -37,20 +37,19 @@ $node_primary->start; # Create second standby node linking to standby 1 -my $node_standby_2 = get_new_node('standby_2'); +my $node_standby_2 = PostgreSQL::Test::Cluster->new('standby_2'); $node_standby_2->init_from_backup($node_standby_1, $backup_name, has_streaming => 1); $node_standby_2->start; -# Create some content on primary and check its presence in standby 1 +# Create some content on primary and check its presence in standby nodes $node_primary->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1,1002) AS a"); # Wait for standbys to catch up -$node_primary->wait_for_catchup($node_standby_1, 'replay', - $node_primary->lsn('insert')); -$node_standby_1->wait_for_catchup($node_standby_2, 'replay', - $node_standby_1->lsn('replay')); +my $primary_lsn = $node_primary->lsn('write'); +$node_primary->wait_for_catchup($node_standby_1, 'replay', $primary_lsn); +$node_standby_1->wait_for_catchup($node_standby_2, 'replay', $primary_lsn); my $result = $node_standby_1->safe_psql('postgres', "SELECT count(*) FROM tab_int"); @@ -62,6 +61,23 @@ print "standby 2: $result\n"; is($result, qq(1002), 'check streamed content on standby 2'); +# Likewise, but for a sequence +$node_primary->safe_psql('postgres', + "CREATE SEQUENCE seq1; SELECT nextval('seq1')"); + +# Wait for standbys to catch up +$primary_lsn = $node_primary->lsn('write'); +$node_primary->wait_for_catchup($node_standby_1, 'replay', $primary_lsn); +$node_standby_1->wait_for_catchup($node_standby_2, 'replay', $primary_lsn); + +$result = $node_standby_1->safe_psql('postgres', "SELECT * FROM seq1"); +print "standby 1: $result\n"; +is($result, qq(33|0|t), 'check streamed sequence content on standby 1'); + +$result = $node_standby_2->safe_psql('postgres', "SELECT * FROM seq1"); +print "standby 2: $result\n"; +is($result, qq(33|0|t), 'check streamed sequence content on standby 2'); + # Check that only READ-only queries can run on standbys is($node_standby_1->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), 3, 'read-only queries on standby 1'); @@ -254,6 +270,36 @@ sub test_target_session_attrs "SHOW with superuser-settable parameter, replication role and logical replication" ); +note "testing READ_REPLICATION_SLOT command for replication connection"; + +my $slotname = 'test_read_replication_slot_physical'; + +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', + 'READ_REPLICATION_SLOT non_existent_slot;', + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "READ_REPLICATION_SLOT exit code 0 on success"); +like($stdout, qr/^\|\|$/, + "READ_REPLICATION_SLOT returns NULL values if slot does not exist"); + +$node_primary->psql( + 'postgres', + "CREATE_REPLICATION_SLOT $slotname PHYSICAL RESERVE_WAL;", + extra_params => [ '-d', $connstr_rep ]); + +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', + "READ_REPLICATION_SLOT $slotname;", + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "READ_REPLICATION_SLOT success with existing slot"); +like($stdout, qr/^physical\|[^|]*\|1$/, + "READ_REPLICATION_SLOT returns tuple with slot information"); + +$node_primary->psql( + 'postgres', + "DROP_REPLICATION_SLOT $slotname;", + extra_params => [ '-d', $connstr_rep ]); + note "switching to physical replication slot"; # Switch to using a physical replication slot. We can do this without a new @@ -326,10 +372,11 @@ sub replay_check my $newval = $node_primary->safe_psql('postgres', 'INSERT INTO replayed(val) SELECT coalesce(max(val),0) + 1 AS newval FROM replayed RETURNING val' ); - $node_primary->wait_for_catchup($node_standby_1, 'replay', - $node_primary->lsn('insert')); + my $primary_lsn = $node_primary->lsn('write'); + $node_primary->wait_for_catchup($node_standby_1, 'replay', $primary_lsn); $node_standby_1->wait_for_catchup($node_standby_2, 'replay', - $node_standby_1->lsn('replay')); + $primary_lsn); + $node_standby_1->safe_psql('postgres', qq[SELECT 1 FROM replayed WHERE val = $newval]) or die "standby_1 didn't replay primary value $newval"; @@ -433,8 +480,7 @@ sub replay_check my $newval = $node_primary->safe_psql('postgres', 'INSERT INTO replayed(val) SELECT coalesce(max(val),0) + 1 AS newval FROM replayed RETURNING val' ); -$node_primary->wait_for_catchup($node_standby_2, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby_2); my $is_replayed = $node_standby_2->safe_psql('postgres', qq[SELECT 1 FROM replayed WHERE val = $newval]); is($is_replayed, qq(1), "standby_2 didn't replay primary value $newval"); @@ -484,3 +530,5 @@ sub replay_check my $primary_data = $node_primary->data_dir; ok(!-f "$primary_data/pg_wal/$segment_removed", "WAL segment $segment_removed recycled after physical slot advancing"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/002_archiving.pl b/third_party/spanner_pg/src/test/recovery/t/002_archiving.pl index c8498c73..d69da4e5 100644 --- a/third_party/spanner_pg/src/test/recovery/t/002_archiving.pl +++ b/third_party/spanner_pg/src/test/recovery/t/002_archiving.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # test for archiving with hot standby use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use File::Copy; # Initialize primary node, doing archives -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init( has_archiving => 1, allows_streaming => 1); @@ -23,18 +23,36 @@ $node_primary->backup($backup_name); # Initialize standby node from backup, fetching WAL from archives -my $node_standby = get_new_node('standby'); +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', "wal_retrieve_retry_interval = '100ms'"); + +# Set archive_cleanup_command and recovery_end_command, checking their +# execution by the backend with dummy commands. +my $data_dir = $node_standby->data_dir; +my $archive_cleanup_command_file = "archive_cleanup_command.done"; +my $recovery_end_command_file = "recovery_end_command.done"; +$node_standby->append_conf( + 'postgresql.conf', qq( +archive_cleanup_command = 'echo archive_cleanup_done > $archive_cleanup_command_file' +recovery_end_command = 'echo recovery_ended_done > $recovery_end_command_file' +)); $node_standby->start; # Create some content on primary $node_primary->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1,1000) AS a"); + +# 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();"); @@ -55,6 +73,14 @@ $node_standby->safe_psql('postgres', "SELECT count(*) FROM tab_int"); is($result, qq(1000), 'check content from archives'); +# archive_cleanup_command is executed after generating a restart point, +# with a checkpoint. +$node_standby->safe_psql('postgres', q{CHECKPOINT}); +ok( -f "$data_dir/$archive_cleanup_command_file", + 'archive_cleanup_command executed on checkpoint'); +ok( !-f "$data_dir/$recovery_end_command_file", + 'recovery_end_command not executed yet'); + # Check the presence of temporary files specifically generated during # archive recovery. To ensure the presence of the temporary history # file, switch to a timeline large enough to allow a standby to recover @@ -74,11 +100,24 @@ $node_primary->poll_query_until('postgres', $caughtup_query) or die "Timed out while waiting for archiving of 00000002.history"; -my $node_standby2 = get_new_node('standby2'); +# recovery_end_command should have been triggered on promotion. +ok( -f "$data_dir/$recovery_end_command_file", + 'recovery_end_command executed after promotion'); + +my $node_standby2 = PostgreSQL::Test::Cluster->new('standby2'); $node_standby2->init_from_backup($node_primary, $backup_name, has_restoring => 1); + +# Make execution of recovery_end_command fail. This should not affect +# promotion, and its failure should be logged. +$node_standby2->append_conf( + 'postgresql.conf', qq( +recovery_end_command = 'echo recovery_end_failed > missing_dir/xyz.file' +)); + $node_standby2->start; +# Save the log location, to see the failure of recovery_end_command. my $log_location = -s $node_standby2->logfile; # Now promote standby2, and check that temporary files specifically @@ -86,7 +125,7 @@ $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 $log_contents = slurp_file($node_standby2->logfile, $log_location); my $node_standby2_data = $node_standby2->data_dir; like( @@ -97,3 +136,9 @@ "RECOVERYHISTORY removed after promotion"); ok( !-f "$node_standby2_data/pg_wal/RECOVERYXLOG", "RECOVERYXLOG removed after promotion"); +like( + $log_contents, + qr/WARNING:.*recovery_end_command/s, + "recovery_end_command failure detected in logs after promotion"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/003_recovery_targets.pl b/third_party/spanner_pg/src/test/recovery/t/003_recovery_targets.pl index 0815e6ee..e8e1a420 100644 --- a/third_party/spanner_pg/src/test/recovery/t/003_recovery_targets.pl +++ b/third_party/spanner_pg/src/test/recovery/t/003_recovery_targets.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for recovery targets: name, timestamp, XID use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 9; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use Time::HiRes qw(usleep); # Create and test a standby from given backup, with a certain recovery target. @@ -23,7 +23,7 @@ sub test_recovery_standby my $num_rows = shift; my $until_lsn = shift; - my $node_standby = get_new_node($node_name); + my $node_standby = PostgreSQL::Test::Cluster->new($node_name); $node_standby->init_from_backup($node_primary, 'my_backup', has_restoring => 1); @@ -52,7 +52,7 @@ sub test_recovery_standby } # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(has_archiving => 1, allows_streaming => 1); # Bump the transaction ID epoch. This is useful to stress the portability @@ -138,7 +138,7 @@ sub test_recovery_standby test_recovery_standby('multiple overriding settings', 'standby_6', $node_primary, \@recovery_params, "3000", $lsn3); -my $node_standby = get_new_node('standby_7'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby_7'); $node_standby->init_from_backup($node_primary, 'my_backup', has_restoring => 1); $node_standby->append_conf( @@ -158,7 +158,7 @@ sub test_recovery_standby # Check behavior when recovery ends before target is reached -$node_standby = get_new_node('standby_8'); +$node_standby = PostgreSQL::Test::Cluster->new('standby_8'); $node_standby->init_from_backup( $node_primary, 'my_backup', has_restoring => 1, @@ -173,7 +173,7 @@ sub test_recovery_standby ]); # wait for postgres to terminate -foreach my $i (0 .. 10 * $TestLib::timeout_default) +foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) { last if !-f $node_standby->data_dir . '/postmaster.pid'; usleep(100_000); @@ -182,3 +182,5 @@ sub test_recovery_standby ok( $logfile =~ qr/FATAL: .* recovery ended before configured recovery target was reached/, 'recovery end before target reached is a fatal error'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/004_timeline_switch.pl b/third_party/spanner_pg/src/test/recovery/t/004_timeline_switch.pl index c101980e..3203d937 100644 --- a/third_party/spanner_pg/src/test/recovery/t/004_timeline_switch.pl +++ b/third_party/spanner_pg/src/test/recovery/t/004_timeline_switch.pl @@ -1,13 +1,13 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for timeline switch use strict; use warnings; use File::Path qw(rmtree); -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; $ENV{PGDATABASE} = 'postgres'; @@ -15,7 +15,7 @@ # on a new timeline. # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->start; @@ -24,11 +24,11 @@ $node_primary->backup($backup_name); # Create two standbys linking to it -my $node_standby_1 = get_new_node('standby_1'); +my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby_1'); $node_standby_1->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby_1->start; -my $node_standby_2 = get_new_node('standby_2'); +my $node_standby_2 = PostgreSQL::Test::Cluster->new('standby_2'); $node_standby_2->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby_2->start; @@ -38,8 +38,7 @@ "CREATE TABLE tab_int AS SELECT generate_series(1,1000) AS a"); # Wait until standby has replayed enough data on standby 1 -$node_primary->wait_for_catchup($node_standby_1, 'replay', - $node_primary->lsn('write')); +$node_primary->wait_for_catchup($node_standby_1); # Stop and remove primary $node_primary->teardown_node; @@ -64,8 +63,7 @@ # to ensure that the timeline switch has been done. $node_standby_1->safe_psql('postgres', "INSERT INTO tab_int VALUES (generate_series(1001,2000))"); -$node_standby_1->wait_for_catchup($node_standby_2, 'replay', - $node_standby_1->lsn('write')); +$node_standby_1->wait_for_catchup($node_standby_2); my $result = $node_standby_2->safe_psql('postgres', "SELECT count(*) FROM tab_int"); @@ -76,7 +74,7 @@ # when WAL archiving is enabled. # Initialize primary node -my $node_primary_2 = get_new_node('primary_2'); +my $node_primary_2 = PostgreSQL::Test::Cluster->new('primary_2'); $node_primary_2->init(allows_streaming => 1, has_archiving => 1); $node_primary_2->append_conf( 'postgresql.conf', qq( @@ -88,7 +86,7 @@ $node_primary_2->backup($backup_name); # Create standby node -my $node_standby_3 = get_new_node('standby_3'); +my $node_standby_3 = PostgreSQL::Test::Cluster->new('standby_3'); $node_standby_3->init_from_backup($node_primary_2, $backup_name, has_streaming => 1); @@ -103,9 +101,10 @@ $node_standby_3->start; $node_primary_2->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT 1 AS a"); -$node_primary_2->wait_for_catchup($node_standby_3, 'replay', - $node_primary_2->lsn('write')); +$node_primary_2->wait_for_catchup($node_standby_3); my $result_2 = $node_standby_3->safe_psql('postgres', "SELECT count(*) FROM tab_int"); is($result_2, qq(1), 'check content of standby 3'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/005_replay_delay.pl b/third_party/spanner_pg/src/test/recovery/t/005_replay_delay.pl index bd7ed4e3..370fc9ea 100644 --- a/third_party/spanner_pg/src/test/recovery/t/005_replay_delay.pl +++ b/third_party/spanner_pg/src/test/recovery/t/005_replay_delay.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Checks for recovery_min_apply_delay and recovery pause use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->start; @@ -23,7 +23,7 @@ $node_primary->backup($backup_name); # Create streaming standby from backup -my $node_standby = get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); my $delay = 3; $node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); @@ -58,7 +58,7 @@ # Check that recovery can be paused or resumed expectedly. -my $node_standby2 = get_new_node('standby2'); +my $node_standby2 = PostgreSQL::Test::Cluster->new('standby2'); $node_standby2->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby2->start; @@ -110,3 +110,5 @@ $node_standby2->promote; $node_standby2->poll_query_until('postgres', "SELECT NOT pg_is_in_recovery()") or die "Timed out while waiting for promotion to finish"; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/006_logical_decoding.pl b/third_party/spanner_pg/src/test/recovery/t/006_logical_decoding.pl index ae13c4fa..a9edd8cc 100644 --- a/third_party/spanner_pg/src/test/recovery/t/006_logical_decoding.pl +++ b/third_party/spanner_pg/src/test/recovery/t/006_logical_decoding.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Testing of logical decoding using SQL interface and/or pg_recvlogical # @@ -8,13 +8,13 @@ # are required. use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 14; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use Config; # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->append_conf( 'postgresql.conf', qq( @@ -39,6 +39,15 @@ m/replication slot "test_slot" was not created in this database/, "Logical decoding correctly fails to start"); +($result, $stdout, $stderr) = $node_primary->psql( + 'template1', + qq[READ_REPLICATION_SLOT test_slot;], + replication => 'database'); +like( + $stderr, + qr/cannot use READ_REPLICATION_SLOT with a logical replication slot/, + 'READ_REPLICATION_SLOT not supported for logical slots'); + # Check case of walsender not using a database connection. Logical # decoding should not be allowed. ($result, $stdout, $stderr) = $node_primary->psql( @@ -99,7 +108,7 @@ my $stdout_recv = $node_primary->pg_recvlogical_upto( 'postgres', 'test_slot', $endpos, - $TestLib::timeout_default, + $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); chomp($stdout_recv); @@ -112,7 +121,7 @@ $stdout_recv = $node_primary->pg_recvlogical_upto( 'postgres', 'test_slot', $endpos, - $TestLib::timeout_default, + $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); chomp($stdout_recv); @@ -191,5 +200,76 @@ 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; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/007_sync_rep.pl b/third_party/spanner_pg/src/test/recovery/t/007_sync_rep.pl index 0ff9b5d2..86f89c63 100644 --- a/third_party/spanner_pg/src/test/recovery/t/007_sync_rep.pl +++ b/third_party/spanner_pg/src/test/recovery/t/007_sync_rep.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Minimal test testing synchronous replication sync_state transition use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 11; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Query checking sync_priority and sync_state of each standby my $check_sql = @@ -51,7 +51,7 @@ sub start_standby_and_wait } # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->start; my $backup_name = 'primary_backup'; @@ -63,19 +63,19 @@ sub start_standby_and_wait # the ordering of each one of them in the WAL sender array of the primary. # Create standby1 linking to primary -my $node_standby_1 = get_new_node('standby1'); +my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby1'); $node_standby_1->init_from_backup($node_primary, $backup_name, has_streaming => 1); start_standby_and_wait($node_primary, $node_standby_1); # Create standby2 linking to primary -my $node_standby_2 = get_new_node('standby2'); +my $node_standby_2 = PostgreSQL::Test::Cluster->new('standby2'); $node_standby_2->init_from_backup($node_primary, $backup_name, has_streaming => 1); start_standby_and_wait($node_primary, $node_standby_2); # Create standby3 linking to primary -my $node_standby_3 = get_new_node('standby3'); +my $node_standby_3 = PostgreSQL::Test::Cluster->new('standby3'); $node_standby_3->init_from_backup($node_primary, $backup_name, has_streaming => 1); start_standby_and_wait($node_primary, $node_standby_3); @@ -125,7 +125,7 @@ sub start_standby_and_wait start_standby_and_wait($node_primary, $node_standby_1); # Create standby4 linking to primary -my $node_standby_4 = get_new_node('standby4'); +my $node_standby_4 = PostgreSQL::Test::Cluster->new('standby4'); $node_standby_4->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby_4->start; @@ -217,3 +217,5 @@ sub start_standby_and_wait standby4|1|quorum), 'all standbys are considered as candidates for quorum sync standbys', 'ANY 2(*)'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/008_fsm_truncation.pl b/third_party/spanner_pg/src/test/recovery/t/008_fsm_truncation.pl index 14b4b97e..5be2153c 100644 --- a/third_party/spanner_pg/src/test/recovery/t/008_fsm_truncation.pl +++ b/third_party/spanner_pg/src/test/recovery/t/008_fsm_truncation.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test WAL replay of FSM changes. # @@ -8,16 +8,15 @@ use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->append_conf( 'postgresql.conf', qq{ -fsync = on wal_log_hints = on max_prepared_transactions = 5 autovacuum = off @@ -28,7 +27,7 @@ $node_primary->start; $node_primary->backup('primary_backup'); -my $node_standby = get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); $node_standby->init_from_backup($node_primary, 'primary_backup', has_streaming => 1); $node_standby->start; @@ -97,3 +96,5 @@ qq{insert into testtab select generate_series(1,1000), 'foo';}), 0, 'INSERT succeeds with truncated relation FSM'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/009_twophase.pl b/third_party/spanner_pg/src/test/recovery/t/009_twophase.pl index 900d1817..3e25b8c4 100644 --- a/third_party/spanner_pg/src/test/recovery/t/009_twophase.pl +++ b/third_party/spanner_pg/src/test/recovery/t/009_twophase.pl @@ -1,13 +1,13 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests dedicated to two-phase commit in recovery use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 24; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; my $psql_out = ''; my $psql_rc = ''; @@ -31,7 +31,7 @@ sub configure_and_reload # Set up two nodes, which will alternately be primary and replication standby. # Setup london node -my $node_london = get_new_node("london"); +my $node_london = PostgreSQL::Test::Cluster->new("london"); $node_london->init(allows_streaming => 1); $node_london->append_conf( 'postgresql.conf', qq( @@ -42,7 +42,7 @@ sub configure_and_reload $node_london->backup('london_backup'); # Setup paris node -my $node_paris = get_new_node('paris'); +my $node_paris = PostgreSQL::Test::Cluster->new('paris'); $node_paris->init_from_backup($node_london, 'london_backup', has_streaming => 1); $node_paris->start; @@ -480,3 +480,5 @@ sub configure_and_reload is( $psql_out, qq{27|issued to paris}, "Check expected t_009_tbl2 data on standby"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/010_logical_decoding_timelines.pl b/third_party/spanner_pg/src/test/recovery/t/010_logical_decoding_timelines.pl index 973dcb59..135fb1a7 100644 --- a/third_party/spanner_pg/src/test/recovery/t/010_logical_decoding_timelines.pl +++ b/third_party/spanner_pg/src/test/recovery/t/010_logical_decoding_timelines.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Demonstrate that logical can follow timeline switches. # @@ -24,9 +24,9 @@ use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 13; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use File::Copy; use IPC::Run (); use Scalar::Util qw(blessed); @@ -34,7 +34,7 @@ my ($stdout, $stderr, $ret); # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1, has_archiving => 1); $node_primary->append_conf( 'postgresql.conf', q[ @@ -69,12 +69,14 @@ $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');]); -my $node_replica = get_new_node('replica'); +my $node_replica = PostgreSQL::Test::Cluster->new('replica'); $node_replica->init_from_backup( $node_primary, $backup_name, has_streaming => 1, @@ -88,8 +90,7 @@ # db and associated slot. is($node_primary->psql('postgres', 'DROP DATABASE dropme'), 0, 'dropped DB with logical slot OK on primary'); -$node_primary->wait_for_catchup($node_replica, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_replica); is( $node_replica->safe_psql( 'postgres', q[SELECT 1 FROM pg_database WHERE datname = 'dropme']), '', @@ -158,7 +159,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 => $TestLib::timeout_default); + timeout => $PostgreSQL::Test::Utils::timeout_default); is($ret, 0, 'replay from slot before_basebackup succeeds'); my $final_expected_output_bb = q(BEGIN @@ -187,7 +188,7 @@ BEGIN $stdout = $node_replica->pg_recvlogical_upto( 'postgres', 'before_basebackup', - $endpos, $TestLib::timeout_default, + $endpos, $PostgreSQL::Test::Utils::timeout_default, 'include-xids' => '0', 'skip-empty-xacts' => '1'); @@ -197,3 +198,5 @@ BEGIN 'got same output from walsender via pg_recvlogical on before_basebackup'); $node_replica->teardown_node(); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/012_subtransactions.pl b/third_party/spanner_pg/src/test/recovery/t/012_subtransactions.pl index aa840733..f8075097 100644 --- a/third_party/spanner_pg/src/test/recovery/t/012_subtransactions.pl +++ b/third_party/spanner_pg/src/test/recovery/t/012_subtransactions.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests dedicated to subtransactions in recovery use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 12; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Setup primary node -my $node_primary = get_new_node("primary"); +my $node_primary = PostgreSQL::Test::Cluster->new("primary"); $node_primary->init(allows_streaming => 1); $node_primary->append_conf( 'postgresql.conf', qq( @@ -22,7 +22,7 @@ $node_primary->psql('postgres', "CREATE TABLE t_012_tbl (id int)"); # Setup standby node -my $node_standby = get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); $node_standby->init_from_backup($node_primary, 'primary_backup', has_streaming => 1); $node_standby->start; @@ -103,8 +103,7 @@ BEGIN; SELECT hs_subxids(127); COMMIT;"); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); $node_standby->psql( 'postgres', "SELECT coalesce(sum(id),-1) FROM t_012_tbl", @@ -150,8 +149,7 @@ BEGIN; SELECT hs_subxids(127); PREPARE TRANSACTION 'xact_012_1';"); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); $node_standby->psql( 'postgres', "SELECT coalesce(sum(id),-1) FROM t_012_tbl", @@ -187,8 +185,7 @@ BEGIN; SELECT hs_subxids(201); PREPARE TRANSACTION 'xact_012_1';"); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); $node_standby->psql( 'postgres', "SELECT coalesce(sum(id),-1) FROM t_012_tbl", @@ -217,3 +214,5 @@ "SELECT coalesce(sum(id),-1) FROM t_012_tbl", stdout => \$psql_out); is($psql_out, '-1', "Not visible"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/013_crash_restart.pl b/third_party/spanner_pg/src/test/recovery/t/013_crash_restart.pl index 0ed15518..c22844d3 100644 --- a/third_party/spanner_pg/src/test/recovery/t/013_crash_restart.pl +++ b/third_party/spanner_pg/src/test/recovery/t/013_crash_restart.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Tests restarts of postgres due to crashes of a subprocess. @@ -13,25 +13,17 @@ # use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; -use Config; -plan tests => 18; +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); - -# 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($TestLib::timeout_default); - -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(allows_streaming => 1); $node->start(); -# by default PostgresNode 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; @@ -74,7 +66,8 @@ INSERT INTO alive VALUES($$committed-before-sigquit$$); SELECT pg_backend_pid(); ]; -ok(pump_until($killme, $psql_timeout, \$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); @@ -86,7 +79,9 @@ BEGIN; INSERT INTO alive VALUES($$in-progress-before-sigquit$$) RETURNING status; ]; -ok(pump_until($killme, $psql_timeout, \$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 = ''; @@ -99,13 +94,14 @@ SELECT $$psql-connected$$; SELECT pg_sleep(3600); ]; -ok(pump_until($monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), +ok( pump_until( + $monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), 'monitor connected'); $monitor_stdout = ''; $monitor_stderr = ''; # kill once with QUIT - we expect psql to exit, while emitting error message first -my $ret = TestLib::system_log('pg_ctl', 'kill', 'QUIT', $pid); +my $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'QUIT', $pid); # Exactly process should have been alive to be killed is($ret, 0, "killed process with SIGQUIT"); @@ -153,7 +149,8 @@ $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, $psql_timeout, \$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); @@ -166,7 +163,9 @@ BEGIN; INSERT INTO alive VALUES($$in-progress-before-sigkill$$) RETURNING status; ]; -ok(pump_until($killme, $psql_timeout, \$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 = ''; @@ -178,7 +177,8 @@ SELECT $$psql-connected$$; SELECT pg_sleep(3600); ]; -ok(pump_until($monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), +ok( pump_until( + $monitor, $psql_timeout, \$monitor_stdout, qr/psql-connected/m), 'monitor connected'); $monitor_stdout = ''; $monitor_stderr = ''; @@ -186,7 +186,7 @@ # kill with SIGKILL this time - we expect the backend to exit, without # being able to emit an error message -$ret = TestLib::system_log('pg_ctl', 'kill', 'KILL', $pid); +$ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); is($ret, 0, "killed process with KILL"); # Check that psql sees the server as being terminated. No WARNING, @@ -246,3 +246,5 @@ 'can still write after orderly restart'); $node->stop(); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/014_unlogged_reinit.pl b/third_party/spanner_pg/src/test/recovery/t/014_unlogged_reinit.pl index 6d40535e..72895104 100644 --- a/third_party/spanner_pg/src/test/recovery/t/014_unlogged_reinit.pl +++ b/third_party/spanner_pg/src/test/recovery/t/014_unlogged_reinit.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests that unlogged tables are properly reinitialized after a crash. # @@ -8,32 +8,44 @@ use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 12; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node = get_new_node('main'); +my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $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. -my $tablespaceDir = TestLib::tempdir; +my $tablespaceDir = PostgreSQL::Test::Utils::tempdir; -$node->safe_psql('postgres', "CREATE TABLESPACE ts1 LOCATION '$tablespaceDir'"); +$node->safe_psql('postgres', + "CREATE TABLESPACE ts1 LOCATION '$tablespaceDir'"); $node->safe_psql('postgres', 'CREATE UNLOGGED TABLE ts1_unlogged (id int) TABLESPACE ts1'); @@ -44,6 +56,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 +79,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 +91,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'); @@ -80,3 +119,16 @@ 'vm fork in tablespace removed at startup'); 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/third_party/spanner_pg/src/test/recovery/t/015_promotion_pages.pl b/third_party/spanner_pg/src/test/recovery/t/015_promotion_pages.pl index 2b72dc23..8d57b1b3 100644 --- a/third_party/spanner_pg/src/test/recovery/t/015_promotion_pages.pl +++ b/third_party/spanner_pg/src/test/recovery/t/015_promotion_pages.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for promotion handling with WAL records generated post-promotion # before the first checkpoint is generated. This test case checks for @@ -7,12 +7,12 @@ # recovery point defined. use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize primary node -my $alpha = get_new_node('alpha'); +my $alpha = PostgreSQL::Test::Cluster->new('alpha'); $alpha->init(allows_streaming => 1); # Setting wal_log_hints to off is important to get invalid page # references. @@ -25,7 +25,7 @@ # setup/start a standby $alpha->backup('bkp'); -my $bravo = get_new_node('bravo'); +my $bravo = PostgreSQL::Test::Cluster->new('bravo'); $bravo->init_from_backup($alpha, 'bkp', has_streaming => 1); $bravo->append_conf('postgresql.conf', <safe_psql('postgres', 'vacuum verbose test1'); # Wait for last record to have been replayed on the standby. -$alpha->wait_for_catchup($bravo, 'replay', $alpha->lsn('insert')); +$alpha->wait_for_catchup($bravo); # Now force a checkpoint on the standby. This seems unnecessary but for "some" # reason, the previous checkpoint on the primary does not reflect on the standby @@ -60,7 +60,7 @@ $alpha->safe_psql('postgres', 'truncate test2'); # Wait again for all records to be replayed. -$alpha->wait_for_catchup($bravo, 'replay', $alpha->lsn('insert')); +$alpha->wait_for_catchup($bravo); # Do the promotion, which reinitializes minRecoveryPoint in the control # file so as WAL is replayed up to the end. @@ -85,3 +85,5 @@ my $psql_out; $bravo->psql('postgres', "SELECT count(*) FROM test1", stdout => \$psql_out); is($psql_out, '1000', "Check that table state is correct"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/016_min_consistency.pl b/third_party/spanner_pg/src/test/recovery/t/016_min_consistency.pl index 60ecd3db..5e0655c2 100644 --- a/third_party/spanner_pg/src/test/recovery/t/016_min_consistency.pl +++ b/third_party/spanner_pg/src/test/recovery/t/016_min_consistency.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for checking consistency of on-disk pages for a cluster with # the minimum recovery LSN, ensuring that the updates happen across @@ -9,9 +9,9 @@ use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Find the largest LSN in the set of pages part of the given relation # file. This is used for offline checks of page consistency. The LSN @@ -43,7 +43,7 @@ sub find_largest_lsn } # Initialize primary node -my $primary = get_new_node('primary'); +my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init(allows_streaming => 1); # Set shared_buffers to a very low value to enforce discard and flush @@ -61,7 +61,7 @@ sub find_largest_lsn # setup/start a standby $primary->backup('bkp'); -my $standby = get_new_node('standby'); +my $standby = PostgreSQL::Test::Cluster->new('standby'); $standby->init_from_backup($primary, 'bkp', has_streaming => 1); $standby->start; @@ -78,7 +78,7 @@ sub find_largest_lsn $primary->safe_psql('postgres', 'UPDATE test1 SET a = a + 1;'); # Wait for last record to have been replayed on the standby. -$primary->wait_for_catchup($standby, 'replay', $primary->lsn('insert')); +$primary->wait_for_catchup($standby); # Fill in the standby's shared buffers with the data filled in # previously. @@ -99,7 +99,7 @@ sub find_largest_lsn "SELECT pg_relation_filepath('test1'::regclass);"); # Wait for last record to have been replayed on the standby. -$primary->wait_for_catchup($standby, 'replay', $primary->lsn('insert')); +$primary->wait_for_catchup($standby); # Issue a restart point on the standby now, which makes the checkpointer # update minRecoveryPoint. @@ -139,3 +139,5 @@ sub find_largest_lsn # the pages on disk. ok($offline_recovery_lsn ge $offline_max_lsn, "Check offline that table data is consistent with minRecoveryPoint"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/017_shm.pl b/third_party/spanner_pg/src/test/recovery/t/017_shm.pl index 48eb4654..875657b4 100644 --- a/third_party/spanner_pg/src/test/recovery/t/017_shm.pl +++ b/third_party/spanner_pg/src/test/recovery/t/017_shm.pl @@ -1,17 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Tests of pg_shmem.h functions # use strict; use warnings; -use Config; use File::stat qw(stat); use IPC::Run 'run'; -use PostgresNode; +use PostgreSQL::Test::Cluster; use Test::More; -use TestLib; +use PostgreSQL::Test::Utils; use Time::HiRes qw(usleep); # If we don't have shmem support, skip the whole thing @@ -25,12 +24,8 @@ { plan skip_all => 'SysV shared memory not supported by this platform'; } -else -{ - plan tests => 4; -} -my $tempdir = TestLib::tempdir; +my $tempdir = PostgreSQL::Test::Utils::tempdir; # Log "ipcs" diffs on a best-effort basis, swallowing any error. my $ipcs_before = "$tempdir/ipcs_before"; @@ -43,7 +38,7 @@ sub log_ipcs } # Node setup. -my $gnat = PostgresNode->get_new_node('gnat'); +my $gnat = PostgreSQL::Test::Cluster->new('gnat'); $gnat->init; # Create a shmem segment that will conflict with gnat's first choice @@ -136,7 +131,7 @@ sub log_ipcs \$stdout, '2>', \$stderr, - IPC::Run::timeout(5 * $TestLib::timeout_default)); + 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'), @@ -148,10 +143,10 @@ sub log_ipcs $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, -# every 0.1s for at least $TestLib::timeout_default seconds. +# 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 = 10 * $TestLib::timeout_default; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) { @@ -176,7 +171,7 @@ sub log_ipcs log_ipcs(); # cleanup slow backend -TestLib::system_log('pg_ctl', 'kill', 'QUIT', $slow_pid); +PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'QUIT', $slow_pid); $slow_client->finish; # client has detected backend termination log_ipcs(); @@ -198,7 +193,7 @@ sub poll_start { my ($node) = @_; - my $max_attempts = 10 * $TestLib::timeout_default; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; my $attempts = 0; while ($attempts < $max_attempts) @@ -219,3 +214,5 @@ sub poll_start $node->start && return 1; return 0; } + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/018_wal_optimize.pl b/third_party/spanner_pg/src/test/recovery/t/018_wal_optimize.pl index 69e1462a..4700d49c 100644 --- a/third_party/spanner_pg/src/test/recovery/t/018_wal_optimize.pl +++ b/third_party/spanner_pg/src/test/recovery/t/018_wal_optimize.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test WAL replay when some operation has skipped WAL. # @@ -12,9 +12,9 @@ use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 38; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; sub check_orphan_relfilenodes { @@ -45,7 +45,7 @@ sub run_wal_optimize { my $wal_level = shift; - my $node = get_new_node("node_$wal_level"); + my $node = PostgreSQL::Test::Cluster->new("node_$wal_level"); $node->init; $node->append_conf( 'postgresql.conf', qq( @@ -147,7 +147,7 @@ sub run_wal_optimize # Data file for COPY query in subsequent tests my $basedir = $node->basedir; my $copy_file = "$basedir/copy_data.txt"; - TestLib::append_to_file( + PostgreSQL::Test::Utils::append_to_file( $copy_file, qq(20000,30000 20001,30001 20002,30002)); @@ -397,3 +397,5 @@ sub run_wal_optimize # Run same test suite for multiple wal_level values. run_wal_optimize("minimal"); run_wal_optimize("replica"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/019_replslot_limit.pl b/third_party/spanner_pg/src/test/recovery/t/019_replslot_limit.pl index 1eec98f2..4ec1a9ab 100644 --- a/third_party/spanner_pg/src/test/recovery/t/019_replslot_limit.pl +++ b/third_party/spanner_pg/src/test/recovery/t/019_replslot_limit.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for replication slot limit # Ensure that max_slot_wal_keep_size limits the number of WAL files to @@ -7,17 +7,17 @@ use strict; use warnings; -use TestLib; -use PostgresNode; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; use File::Path qw(rmtree); -use Test::More tests => $TestLib::windows_os ? 16 : 20; +use Test::More; use Time::HiRes qw(usleep); $ENV{PGDATABASE} = 'postgres'; # Initialize primary node, setting wal-segsize to 1MB -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1, extra => ['--wal-segsize=1']); $node_primary->append_conf( 'postgresql.conf', qq( @@ -41,7 +41,7 @@ $node_primary->backup($backup_name); # Create a standby linking to it using the replication slot -my $node_standby = get_new_node('standby_1'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby_1'); $node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby->append_conf('postgresql.conf', "primary_slot_name = 'rep1'"); @@ -49,8 +49,7 @@ $node_standby->start; # Wait until standby has replayed enough data -my $start_lsn = $node_primary->lsn('write'); -$node_primary->wait_for_catchup($node_standby, 'replay', $start_lsn); +$node_primary->wait_for_catchup($node_standby); # Stop standby $node_standby->stop; @@ -84,8 +83,7 @@ # The standby can reconnect to primary $node_standby->start; -$start_lsn = $node_primary->lsn('write'); -$node_primary->wait_for_catchup($node_standby, 'replay', $start_lsn); +$node_primary->wait_for_catchup($node_standby); $node_standby->stop; @@ -115,8 +113,7 @@ # The standby can reconnect to primary $node_standby->start; -$start_lsn = $node_primary->lsn('write'); -$node_primary->wait_for_catchup($node_standby, 'replay', $start_lsn); +$node_primary->wait_for_catchup($node_standby); $node_standby->stop; # wal_keep_size overrides max_slot_wal_keep_size @@ -135,8 +132,7 @@ # The standby can reconnect to primary $node_standby->start; -$start_lsn = $node_primary->lsn('write'); -$node_primary->wait_for_catchup($node_standby, 'replay', $start_lsn); +$node_primary->wait_for_catchup($node_standby); $node_standby->stop; # Advance WAL again without checkpoint, reducing remain by 6 MB. @@ -163,8 +159,7 @@ # The standby still can connect to primary before a checkpoint $node_standby->start; -$start_lsn = $node_primary->lsn('write'); -$node_primary->wait_for_catchup($node_standby, 'replay', $start_lsn); +$node_primary->wait_for_catchup($node_standby); $node_standby->stop; @@ -257,7 +252,7 @@ $node_primary->stop; $node_standby->stop; -my $node_primary2 = get_new_node('primary2'); +my $node_primary2 = PostgreSQL::Test::Cluster->new('primary2'); $node_primary2->init(allows_streaming => 1); $node_primary2->append_conf( 'postgresql.conf', qq( @@ -278,7 +273,7 @@ )); $node_primary2->start; -$node_standby = get_new_node('standby_2'); +$node_standby = PostgreSQL::Test::Cluster->new('standby_2'); $node_standby->init_from_backup($node_primary2, $backup_name, has_streaming => 1); $node_standby->append_conf('postgresql.conf', "primary_slot_name = 'rep1'"); @@ -293,7 +288,7 @@ SELECT pg_switch_wal(); CHECKPOINT; SELECT 'finished';", - timeout => $TestLib::timeout_default)); + timeout => $PostgreSQL::Test::Utils::timeout_default)); is($result[1], 'finished', 'check if checkpoint command is not blocked'); $node_primary2->stop; @@ -302,7 +297,7 @@ # The next test depends on Perl's `kill`, which apparently is not # portable to Windows. (It would be nice to use Test::More's `subtest`, # but that's not in the ancient version we require.) -if ($TestLib::windows_os) +if ($PostgreSQL::Test::Utils::windows_os) { done_testing(); exit; @@ -310,7 +305,7 @@ # Get a slot terminated while the walsender is active # We do this by sending SIGSTOP to the walsender. Skip this on Windows. -my $node_primary3 = get_new_node('primary3'); +my $node_primary3 = PostgreSQL::Test::Cluster->new('primary3'); $node_primary3->init(allows_streaming => 1, extra => ['--wal-segsize=1']); $node_primary3->append_conf( 'postgresql.conf', qq( @@ -326,15 +321,53 @@ $backup_name = 'my_backup'; $node_primary3->backup($backup_name); # Create standby -my $node_standby3 = get_new_node('standby_3'); +my $node_standby3 = PostgreSQL::Test::Cluster->new('standby_3'); $node_standby3->init_from_backup($node_primary3, $backup_name, has_streaming => 1); $node_standby3->append_conf('postgresql.conf', "primary_slot_name = 'rep3'"); $node_standby3->start; -$node_primary3->wait_for_catchup($node_standby3->name, 'replay'); -my $senderpid = $node_primary3->safe_psql('postgres', - "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walsender'"); +$node_primary3->wait_for_catchup($node_standby3); + +my $senderpid; + +# We've seen occasional cases where multiple walsender pids are still active +# at this point, apparently just due to process shutdown being slow. To avoid +# spurious failures, retry a couple times. +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 $senderpid =~ qr/^[0-9]+$/; + + diag "multiple walsenders active in iteration $i"; + + # show information about all active connections + $node_primary3->psql( + 'postgres', + "\\a\\t\nSELECT * FROM pg_stat_activity", + stdout => \$stdout, + stderr => \$stderr); + diag $stdout, $stderr; + + # 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); +} + 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"); @@ -345,7 +378,7 @@ kill 'STOP', $senderpid, $receiverpid; advance_wal($node_primary3, 2); -my $max_attempts = $TestLib::timeout_default; +my $max_attempts = $PostgreSQL::Test::Utils::timeout_default; while ($max_attempts-- >= 0) { if ($node_primary3->log_contains( @@ -367,7 +400,7 @@ "lost") or die "timed out waiting for slot to be lost"; -$max_attempts = $TestLib::timeout_default; +$max_attempts = $PostgreSQL::Test::Utils::timeout_default; while ($max_attempts-- >= 0) { if ($node_primary3->log_contains( @@ -407,3 +440,5 @@ sub get_log_size return (stat $node->logfile)[7]; } + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/020_archive_status.pl b/third_party/spanner_pg/src/test/recovery/t/020_archive_status.pl index 777bf052..2108d500 100644 --- a/third_party/spanner_pg/src/test/recovery/t/020_archive_status.pl +++ b/third_party/spanner_pg/src/test/recovery/t/020_archive_status.pl @@ -1,17 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Tests related to WAL archiving and recovery. # use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 16; -use Config; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $primary = get_new_node('primary'); +my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init( has_archiving => 1, allows_streaming => 1); @@ -27,7 +26,7 @@ # a portable solution, use an archive command based on a command known to # work but will fail: copy with an incorrect original path. my $incorrect_command = - $TestLib::windows_os + $PostgreSQL::Test::Utils::windows_os ? qq{copy "%p_does_not_exist" "%f_does_not_exist"} : qq{cp "%p_does_not_exist" "%f_does_not_exist"}; $primary->safe_psql( @@ -75,7 +74,7 @@ # Recovery tests for the archiving with a standby partially check # the recovery behavior when restoring a backup taken using a -# snapshot with no pg_start/stop_backup. In this situation, +# snapshot with no pg_backup_start/stop. In this situation, # the recovered standby should enter first crash recovery then # switch to regular archive recovery. Note that the base backup # is taken here so as archive_command will fail. This is necessary @@ -138,7 +137,7 @@ or die "Timed out while waiting for archiving to finish"; # Test standby with archive_mode = on. -my $standby1 = get_new_node('standby'); +my $standby1 = PostgreSQL::Test::Cluster->new('standby'); $standby1->init_from_backup($primary, 'backup', has_restoring => 1); $standby1->append_conf('postgresql.conf', "archive_mode = on"); my $standby1_data = $standby1->data_dir; @@ -174,7 +173,7 @@ # command to fail to persist the .ready files. Note that this node # has inherited the archive command of the previous cold backup that # will cause archiving failures. -my $standby2 = get_new_node('standby2'); +my $standby2 = PostgreSQL::Test::Cluster->new('standby2'); $standby2->init_from_backup($primary, 'backup', has_restoring => 1); $standby2->append_conf('postgresql.conf', 'archive_mode = always'); my $standby2_data = $standby2->data_dir; @@ -234,3 +233,19 @@ && -f "$standby2_data/$segment_path_2_done", ".done files created after archive success with archive_mode=always on standby" ); + +# Check that the archiver process calls the shell archive module's shutdown +# callback. +$standby2->append_conf('postgresql.conf', "log_min_messages = debug1"); +$standby2->reload; + +# Run a query to make sure that the reload has taken effect. +$standby2->safe_psql('postgres', q{SELECT 1}); +my $log_location = -s $standby2->logfile; + +$standby2->stop; +my $logfile = slurp_file($standby2->logfile, $log_location); +ok( $logfile =~ qr/archiver process shutting down/, + 'check shutdown callback of shell archive module'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/021_row_visibility.pl b/third_party/spanner_pg/src/test/recovery/t/021_row_visibility.pl index 8a554c5a..aeaf37cf 100644 --- a/third_party/spanner_pg/src/test/recovery/t/021_row_visibility.pl +++ b/third_party/spanner_pg/src/test/recovery/t/021_row_visibility.pl @@ -1,18 +1,17 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Checks that snapshots on standbys behave in a minimally reasonable # way. use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 10; -use Config; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); $node_primary->append_conf('postgresql.conf', 'max_prepared_transactions=10'); $node_primary->start; @@ -26,14 +25,14 @@ $node_primary->backup($backup_name); # Create streaming standby from backup -my $node_standby = get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); $node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby->append_conf('postgresql.conf', 'max_prepared_transactions=10'); $node_standby->start; my $psql_timeout = - IPC::Run::timer(2 * $TestLib::timeout_default); + 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. @@ -73,8 +72,7 @@ # $node_primary->psql('postgres', "INSERT INTO test_visibility VALUES ('first insert')"); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); ok( send_query_and_wait( \%psql_standby, @@ -95,8 +93,7 @@ 'UPDATE'); $node_primary->psql('postgres', "SELECT txid_current();"); # ensure WAL flush -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); ok( send_query_and_wait( \%psql_standby, @@ -109,8 +106,7 @@ # ok(send_query_and_wait(\%psql_primary, q[COMMIT;], qr/^COMMIT$/m), 'COMMIT'); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); ok( send_query_and_wait( \%psql_standby, @@ -139,8 +135,7 @@ qr/^PREPARE TRANSACTION$/m), 'prepared will_abort'); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); ok( send_query_and_wait( \%psql_standby, @@ -151,8 +146,7 @@ # For some variation, finish prepared xacts via separate connections $node_primary->safe_psql('postgres', "COMMIT PREPARED 'will_commit';"); $node_primary->safe_psql('postgres', "ROLLBACK PREPARED 'will_abort';"); -$node_primary->wait_for_catchup($node_standby, 'replay', - $node_primary->lsn('insert')); +$node_primary->wait_for_catchup($node_standby); ok( send_query_and_wait( \%psql_standby, @@ -207,3 +201,5 @@ sub send_query_and_wait return 1; } + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/022_crash_temp_files.pl b/third_party/spanner_pg/src/test/recovery/t/022_crash_temp_files.pl index b0f5ba04..53a55c7a 100644 --- a/third_party/spanner_pg/src/test/recovery/t/022_crash_temp_files.pl +++ b/third_party/spanner_pg/src/test/recovery/t/022_crash_temp_files.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test remove of temporary files after a crash. use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; use Config; @@ -14,19 +14,14 @@ plan skip_all => 'tests hang on Windows'; exit; } -else -{ - plan tests => 11; -} +my $psql_timeout = IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); -my $psql_timeout = IPC::Run::timer($TestLib::timeout_default); - -my $node = get_new_node('node_crash'); +my $node = PostgreSQL::Test::Cluster->new('node_crash'); $node->init(); $node->start(); -# By default, PostgresNode doesn't restart after crash +# By default, PostgreSQL::Test::Cluster doesn't restart after crash # Reduce work_mem to generate temporary file with a few number of rows $node->safe_psql( 'postgres', @@ -58,7 +53,8 @@ $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, $psql_timeout, \$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); @@ -87,7 +83,8 @@ INSERT INTO tab_crash (a) VALUES(1); SELECT $$insert-tuple-to-lock-next-insert$$; ]; -pump_until($killme2, $psql_timeout, \$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 = ''; @@ -100,7 +97,9 @@ SELECT $$in-progress-before-sigkill$$; INSERT INTO tab_crash (a) SELECT i FROM generate_series(1, 5000) s(i); ]; -ok(pump_until($killme, $psql_timeout, \$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 = ''; @@ -122,12 +121,13 @@ BEGIN SELECT $$insert-tuple-lock-waiting$$; ]; -pump_until($killme2, $psql_timeout, \$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 = ''; # Kill with SIGKILL -my $ret = TestLib::system_log('pg_ctl', 'kill', 'KILL', $pid); +my $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); is($ret, 0, 'killed process with KILL'); # Close that psql session @@ -136,10 +136,11 @@ BEGIN # 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($TestLib::timeout_default); +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 ), @@ -171,7 +172,8 @@ BEGIN $killme_stdin .= q[ SELECT pg_backend_pid(); ]; -ok(pump_until($killme, $psql_timeout, \$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); @@ -188,7 +190,8 @@ BEGIN INSERT INTO tab_crash (a) VALUES(1); SELECT $$insert-tuple-to-lock-next-insert$$; ]; -pump_until($killme2, $psql_timeout, \$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 = ''; @@ -201,7 +204,9 @@ BEGIN SELECT $$in-progress-before-sigkill$$; INSERT INTO tab_crash (a) SELECT i FROM generate_series(1, 5000) s(i); ]; -ok(pump_until($killme, $psql_timeout, \$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 = ''; @@ -223,12 +228,13 @@ BEGIN SELECT $$insert-tuple-lock-waiting$$; ]; -pump_until($killme2, $psql_timeout, \$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 = ''; # Kill with SIGKILL -$ret = TestLib::system_log('pg_ctl', 'kill', 'KILL', $pid); +$ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); is($ret, 0, 'killed process with KILL'); # Close that psql session @@ -237,10 +243,11 @@ BEGIN # 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($TestLib::timeout_default); +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 ), @@ -266,3 +273,5 @@ BEGIN 'temporary file was removed'); $node->stop(); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/023_pitr_prepared_xact.pl b/third_party/spanner_pg/src/test/recovery/t/023_pitr_prepared_xact.pl index 9190a38f..39e8a8fa 100644 --- a/third_party/spanner_pg/src/test/recovery/t/023_pitr_prepared_xact.pl +++ b/third_party/spanner_pg/src/test/recovery/t/023_pitr_prepared_xact.pl @@ -1,16 +1,16 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for point-in-time-recovery (PITR) with prepared transactions use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use File::Compare; # Initialize and start primary node with WAL archiving -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(has_archiving => 1, allows_streaming => 1); $node_primary->append_conf( 'postgresql.conf', qq{ @@ -24,7 +24,7 @@ # Initialize node for PITR targeting a very specific restore point, just # after a PREPARE TRANSACTION is issued so as we finish with a promoted # node where this 2PC transaction needs an explicit COMMIT PREPARED. -my $node_pitr = get_new_node('node_pitr'); +my $node_pitr = PostgreSQL::Test::Cluster->new('node_pitr'); $node_pitr->init_from_backup( $node_primary, $backup_name, standby => 0, @@ -87,3 +87,5 @@ # still be found. $node_pitr->stop('immediate'); $node_pitr->start; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/024_archive_recovery.pl b/third_party/spanner_pg/src/test/recovery/t/024_archive_recovery.pl index 1befa826..ce347e0c 100644 --- a/third_party/spanner_pg/src/test/recovery/t/024_archive_recovery.pl +++ b/third_party/spanner_pg/src/test/recovery/t/024_archive_recovery.pl @@ -1,17 +1,17 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test for archive recovery of WAL generated with wal_level=minimal use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 2; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; use Time::HiRes qw(usleep); # Initialize and start node with wal_level = replica and WAL archiving # enabled. -my $node = get_new_node('orig'); +my $node = PostgreSQL::Test::Cluster->new('orig'); $node->init(has_archiving => 1, allows_streaming => 1); my $replica_config = q[ wal_level = replica @@ -66,7 +66,7 @@ sub test_recovery_wal_level_minimal { my ($node_name, $node_text, $standby_setting) = @_; - my $recovery_node = get_new_node($node_name); + my $recovery_node = PostgreSQL::Test::Cluster->new($node_name); $recovery_node->init_from_backup( $node, $backup_name, has_restoring => 1, @@ -82,7 +82,7 @@ sub test_recovery_wal_level_minimal ]); # wait for postgres to terminate - foreach my $i (0 .. 10 * $TestLib::timeout_default) + foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) { last if !-f $recovery_node->data_dir . '/postmaster.pid'; usleep(100_000); @@ -101,3 +101,5 @@ sub test_recovery_wal_level_minimal # Test for standby server test_recovery_wal_level_minimal('standby', 'standby', 1); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/025_stuck_on_old_timeline.pl b/third_party/spanner_pg/src/test/recovery/t/025_stuck_on_old_timeline.pl index 023cab49..fd821242 100644 --- a/third_party/spanner_pg/src/test/recovery/t/025_stuck_on_old_timeline.pl +++ b/third_party/spanner_pg/src/test/recovery/t/025_stuck_on_old_timeline.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Testing streaming replication where standby is promoted and a new cascading # standby (without WAL) is connected to the promoted standby. Both archiving @@ -8,15 +8,15 @@ # standby can follow the new primary (promoted standby). use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use File::Basename; use FindBin; -use Test::More tests => 1; +use Test::More; # Initialize primary node -my $node_primary = get_new_node('primary'); +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); # Set up an archive command that will copy the history file but not the WAL # files. No real archive command should behave this way; the point is to @@ -29,9 +29,9 @@ # that arise from use of backslashes. That means we need to double-quote all # the paths in the archive_command my $perlbin = $^X; -$perlbin =~ s!\\!/!g if $TestLib::windows_os; +$perlbin =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; my $archivedir_primary = $node_primary->archive_dir; -$archivedir_primary =~ s!\\!/!g if $TestLib::windows_os; +$archivedir_primary =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; $node_primary->append_conf( 'postgresql.conf', qq( archive_command = '"$perlbin" "$FindBin::RealBin/cp_history_files" "%p" "$archivedir_primary/%f"' @@ -47,7 +47,7 @@ $node_primary->backup($backup_name); # Create streaming standby linking to primary -my $node_standby = get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); $node_standby->init_from_backup( $node_primary, $backup_name, allows_streaming => 1, @@ -60,7 +60,7 @@ # Create cascading standby but don't start it yet. # Must set up both streaming and archiving. -my $node_cascade = get_new_node('cascade'); +my $node_cascade = PostgreSQL::Test::Cluster->new('cascade'); $node_cascade->init_from_backup($node_standby, $backup_name, has_streaming => 1); $node_cascade->enable_restoring($node_primary); @@ -101,11 +101,12 @@ $node_standby->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT 1 AS a"); # Wait for the replication to catch up -$node_standby->wait_for_catchup($node_cascade, 'replay', - $node_standby->lsn('insert')); +$node_standby->wait_for_catchup($node_cascade); # Check that cascading standby has the new content my $result = $node_cascade->safe_psql('postgres', "SELECT count(*) FROM tab_int"); print "cascade: $result\n"; is($result, 1, 'check streamed content on cascade standby'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/026_overwrite_contrecord.pl b/third_party/spanner_pg/src/test/recovery/t/026_overwrite_contrecord.pl index d451fe6b..78feccd9 100644 --- a/third_party/spanner_pg/src/test/recovery/t/026_overwrite_contrecord.pl +++ b/third_party/spanner_pg/src/test/recovery/t/026_overwrite_contrecord.pl @@ -1,4 +1,4 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests for already-propagated WAL segments ending in incomplete WAL records. @@ -6,18 +6,16 @@ use warnings; use FindBin; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; -plan tests => 3; - # 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 and the standby promotes successfully. -my $node = PostgresNode->get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init(allows_streaming => 1); # We need these settings for stability of WAL behavior. $node->append_conf( @@ -75,7 +73,7 @@ END # OK, create a standby at this spot. $node->backup_fs_cold('backup'); -my $node_standby = PostgresNode->get_new_node('standby'); +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); $node_standby->init_from_backup($node, 'backup', has_streaming => 1); $node_standby->start; @@ -107,3 +105,5 @@ END $node->stop; $node_standby->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/027_stream_regress.pl b/third_party/spanner_pg/src/test/recovery/t/027_stream_regress.pl new file mode 100644 index 00000000..69d6ddf2 --- /dev/null +++ b/third_party/spanner_pg/src/test/recovery/t/027_stream_regress.pl @@ -0,0 +1,113 @@ +# Run the standard regression tests with streaming replication +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use File::Basename; + +# 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. +if ( $ENV{PG_TEST_EXTRA} + && $ENV{PG_TEST_EXTRA} =~ m/\bwal_consistency_checking\b/) +{ + $node_primary->append_conf('postgresql.conf', + 'wal_consistency_checking = all'); +} + +$node_primary->start; +is( $node_primary->psql( + 'postgres', + qq[SELECT pg_create_physical_replication_slot('standby_1');]), + 0, + 'physical slot created on primary'); +my $backup_name = 'my_backup'; + +# Take backup +$node_primary->backup($backup_name); + +# Create streaming standby linking to primary +my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby_1'); +$node_standby_1->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby_1->append_conf('postgresql.conf', + "primary_slot_name = standby_1"); +$node_standby_1->append_conf('postgresql.conf', + 'max_standby_streaming_delay = 600s'); +$node_standby_1->start; + +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} || ""; +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. +$node_primary->psql('regression', + "select setval(seqrelid, nextval(seqrelid)) from pg_sequence"); + +# Wait for standby to catch up +$node_primary->wait_for_catchup($node_standby_1, 'replay', + $node_primary->lsn('insert')); + +# Perform a logical dump of primary and standby, and check that they match +command_ok( + [ + 'pg_dumpall', '-f', $outputdir . '/primary.dump', + '--no-sync', '-p', $node_primary->port, + '--no-unlogged-table-data' # if unlogged, standby has schema only + ], + 'dump primary server'); +command_ok( + [ + 'pg_dumpall', '-f', $outputdir . '/standby.dump', + '--no-sync', '-p', $node_standby_1->port + ], + 'dump standby server'); +command_ok( + [ 'diff', $outputdir . '/primary.dump', $outputdir . '/standby.dump' ], + 'compare primary and standby dumps'); + +$node_standby_1->stop; +$node_primary->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/028_pitr_timelines.pl b/third_party/spanner_pg/src/test/recovery/t/028_pitr_timelines.pl new file mode 100644 index 00000000..bad02edf --- /dev/null +++ b/third_party/spanner_pg/src/test/recovery/t/028_pitr_timelines.pl @@ -0,0 +1,176 @@ +# Copyright (c) 2022, PostgreSQL Global Development Group + +# Test recovering to a point-in-time using WAL archive, such that the +# target point is physically in a WAL segment with a higher TLI than +# the target point's TLI. For example, imagine that the following WAL +# segments exist in the WAL archive: +# +# 000000010000000000000001 +# 000000010000000000000002 +# 000000020000000000000003 +# +# The timeline switch happened in the middle of WAL segment 3, but it +# was never archived on timeline 1. The first half of +# 000000020000000000000003 contains the WAL from timeline 1 up to the +# point where the timeline switch happened. If you now perform +# archive recovery with recovery target point in that first half of +# segment 3, archive recovery will find the WAL up to that point in +# segment 000000020000000000000003, but it will not follow the +# timeline switch to timeline 2, and creates a timeline switching +# end-of-recovery record with TLI 1 -> 3. That's what this test case +# tests. +# +# The comments below contain lists of WAL segments at different points +# in the tests, to make it easier to follow along. They are correct +# as of this writing, but the exact WAL segment numbers could change +# if the backend logic for when it switches to a new segment changes. +# The actual checks are not sensitive to that. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use File::Compare; + +# Initialize and start primary node with WAL archiving +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(has_archiving => 1, allows_streaming => 1); +$node_primary->start; + +# Take a backup. +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +# Workload with some transactions, and the target restore point. +$node_primary->psql( + 'postgres', qq{ +CREATE TABLE foo(i int); +INSERT INTO foo VALUES(1); +SELECT pg_create_restore_point('rp'); +INSERT INTO foo VALUES(2); +}); + +# Contents of the WAL archive at this point: +# +# 000000010000000000000001 +# 000000010000000000000002 +# 000000010000000000000002.00000028.backup +# +# The operations on the test table and the restore point went into WAL +# segment 3, but it hasn't been archived yet. + +# Start a standby node, and wait for it to catch up. +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +$node_standby->init_from_backup( + $node_primary, $backup_name, + standby => 1, + has_streaming => 1, + has_archiving => 1, + has_restoring => 0); +$node_standby->append_conf('postgresql.conf', 'archive_mode = always'); +$node_standby->start; +$node_primary->wait_for_catchup($node_standby); + +# Check that it's really caught up. +my $result = $node_standby->safe_psql('postgres', "SELECT max(i) FROM foo;"); +is($result, qq{2}, "check table contents after archive recovery"); + +# Kill the old primary, before it archives the most recent WAL segment that +# contains all the INSERTs. +$node_primary->stop('immediate'); + +# Promote the standby, and switch WAL so that it archives a WAL segment +# that contains all the INSERTs, on a new timeline. +$node_standby->promote; + +# Find next WAL segment to be archived. +my $walfile_to_be_archived = $node_standby->safe_psql('postgres', + "SELECT pg_walfile_name(pg_current_wal_lsn());"); + +# Make WAL segment eligible for archival +$node_standby->safe_psql('postgres', 'SELECT pg_switch_wal()'); + +# We don't need the standby anymore, request shutdown. The server will +# finish archiving all the WAL on timeline 2 before it exits. +$node_standby->stop; + +# Contents of the WAL archive at this point: +# +# 000000010000000000000001 +# 000000010000000000000002 +# 000000010000000000000002.00000028.backup +# 000000010000000000000003.partial +# 000000020000000000000003 +# 00000002.history +# +# The operations on the test table and the restore point are in +# segment 3. They are part of timeline 1, but were not archived by +# the primary yet. However, they were copied into the beginning of +# segment 000000020000000000000003, before the timeline switching +# record. (They are also present in the +# 000000010000000000000003.partial file, but .partial files are not +# used automatically.) + +# Now test PITR to the recovery target. It should find the WAL in +# segment 000000020000000000000003, but not follow the timeline switch +# to timeline 2. +my $node_pitr = PostgreSQL::Test::Cluster->new('node_pitr'); +$node_pitr->init_from_backup( + $node_primary, $backup_name, + standby => 0, + has_restoring => 1); +$node_pitr->append_conf( + 'postgresql.conf', qq{ +recovery_target_name = 'rp' +recovery_target_action = 'promote' +}); + +$node_pitr->start; + +# Wait until recovery finishes. +$node_pitr->poll_query_until('postgres', "SELECT pg_is_in_recovery() = 'f';") + or die "Timed out while waiting for PITR promotion"; + +# Check that we see the data we expect. +$result = $node_pitr->safe_psql('postgres', "SELECT max(i) FROM foo;"); +is($result, qq{1}, "check table contents after point-in-time recovery"); + +# Insert a row so that we can check later that we successfully recover +# back to this timeline. +$node_pitr->safe_psql('postgres', "INSERT INTO foo VALUES(3);"); + +# Wait for the archiver to be running. The startup process might have yet to +# exit, in which case the postmaster has not started the archiver. If we +# stop() without an archiver, the archive will be incomplete. +$node_pitr->poll_query_until('postgres', + "SELECT true FROM pg_stat_activity WHERE backend_type = 'archiver';") + or die "Timed out while waiting for archiver to start"; + +# Stop the node. This archives the last segment. +$node_pitr->stop(); + +# Test archive recovery on the timeline created by the PITR. This +# replays the end-of-recovery record that switches from timeline 1 to +# 3. +my $node_pitr2 = PostgreSQL::Test::Cluster->new('node_pitr2'); +$node_pitr2->init_from_backup( + $node_primary, $backup_name, + standby => 0, + has_restoring => 1); +$node_pitr2->append_conf( + 'postgresql.conf', qq{ +recovery_target_action = 'promote' +}); + +$node_pitr2->start; + +# Wait until recovery finishes. +$node_pitr2->poll_query_until('postgres', "SELECT pg_is_in_recovery() = 'f';") + or die "Timed out while waiting for PITR promotion"; + +# Verify that we can see the row inserted after the PITR. +$result = $node_pitr2->safe_psql('postgres', "SELECT max(i) FROM foo;"); +is($result, qq{3}, "check table contents after point-in-time recovery"); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/029_stats_restart.pl b/third_party/spanner_pg/src/test/recovery/t/029_stats_restart.pl new file mode 100644 index 00000000..1bf7b568 --- /dev/null +++ b/third_party/spanner_pg/src/test/recovery/t/029_stats_restart.pl @@ -0,0 +1,344 @@ +# 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_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"); +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('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(); + +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 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; +} + +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; +} diff --git a/third_party/spanner_pg/src/test/recovery/t/030_stats_cleanup_replica.pl b/third_party/spanner_pg/src/test/recovery/t/030_stats_cleanup_replica.pl new file mode 100644 index 00000000..cc92ddbb --- /dev/null +++ b/third_party/spanner_pg/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"); +} diff --git a/third_party/spanner_pg/src/test/recovery/t/031_recovery_conflict.pl b/third_party/spanner_pg/src/test/recovery/t/031_recovery_conflict.pl index 72e0fa9a..99f154ae 100644 --- a/third_party/spanner_pg/src/test/recovery/t/031_recovery_conflict.pl +++ b/third_party/spanner_pg/src/test/recovery/t/031_recovery_conflict.pl @@ -10,7 +10,7 @@ use PostgreSQL::Test::Utils; use Test::More; -plan skip_all => "disabled until after minor releases, due to instability"; +plan skip_all => "disabled due to instability"; # Set up nodes my $node_primary = PostgreSQL::Test::Cluster->new('primary'); @@ -20,11 +20,7 @@ $node_primary->append_conf( 'postgresql.conf', qq[ - -# Doesn't currently exist pre 15, but might be backpatched later -#allow_in_place_tablespaces = on -#temp_tablespaces = $tablespace1 - +allow_in_place_tablespaces = on log_temp_files = 0 # for deadlock test @@ -33,6 +29,7 @@ # 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. @@ -43,9 +40,8 @@ my $backup_name = 'my_backup'; -# See allow_in_place_tablespaces comment above -#$node_primary->safe_psql('postgres', -# qq[CREATE TABLESPACE $tablespace1 LOCATION '']); +$node_primary->safe_psql('postgres', + qq[CREATE TABLESPACE $tablespace1 LOCATION '']); $node_primary->backup($backup_name); my $node_standby = PostgreSQL::Test::Cluster->new('standby'); @@ -197,45 +193,50 @@ check_conflict_stat("lock"); -# See allow_in_place_tablespaces comment above -### 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"); +## 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;]); -## RECOVERY CONFLICT 5: Deadlock -SKIP: -{ - skip "disabled until after minor releases, due to instability"; +$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"); + + +## RECOVERY CONFLICT 5: Deadlock $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 @@ -291,7 +292,10 @@ # 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 @@ -370,8 +374,10 @@ sub check_conflict_log sub check_conflict_stat { - # Stats can't easily be checked before 15, requires waiting for stats to - # be reported to stats collector and then those messages need to be - # processed. Dealt with here to reduce intra-branch difference in the - # tests. + 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"); } diff --git a/third_party/spanner_pg/src/test/recovery/t/032_relfilenode_reuse.pl b/third_party/spanner_pg/src/test/recovery/t/032_relfilenode_reuse.pl new file mode 100644 index 00000000..92ec5100 --- /dev/null +++ b/third_party/spanner_pg/src/test/recovery/t/032_relfilenode_reuse.pl @@ -0,0 +1,243 @@ +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 +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; + +# 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( + [ '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);] +); + +$node_primary->wait_for_catchup($node_standby); + +# 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 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, + "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; + + # 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"; + + # 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; +} diff --git a/third_party/spanner_pg/src/test/recovery/t/033_replay_tsp_drops.pl b/third_party/spanner_pg/src/test/recovery/t/033_replay_tsp_drops.pl index 4c8f4e79..64c3296a 100644 --- a/third_party/spanner_pg/src/test/recovery/t/033_replay_tsp_drops.pl +++ b/third_party/spanner_pg/src/test/recovery/t/033_replay_tsp_drops.pl @@ -13,7 +13,9 @@ sub test_tablespace { - my $node_primary = PostgreSQL::Test::Cluster->new("primary1"); + my ($strategy) = @_; + + my $node_primary = PostgreSQL::Test::Cluster->new("primary1_$strategy"); $node_primary->init(allows_streaming => 1); $node_primary->start; $node_primary->psql( @@ -30,7 +32,7 @@ sub test_tablespace my $backup_name = 'my_backup'; $node_primary->backup($backup_name); - my $node_standby = PostgreSQL::Test::Cluster->new("standby2"); + my $node_standby = PostgreSQL::Test::Cluster->new("standby2_$strategy"); $node_standby->init_from_backup($node_primary, $backup_name, has_streaming => 1); $node_standby->append_conf('postgresql.conf', @@ -47,12 +49,12 @@ sub test_tablespace # DATABASE / DROP TABLESPACE. This causes CREATE DATABASE WAL records # to be applied to already-removed directories. my $query = q[ - CREATE DATABASE dropme_db1 WITH TABLESPACE dropme_ts1; + CREATE DATABASE dropme_db1 WITH TABLESPACE dropme_ts1 STRATEGY=; CREATE TABLE t (a int) TABLESPACE dropme_ts2; - CREATE DATABASE dropme_db2 WITH TABLESPACE dropme_ts2; - CREATE DATABASE moveme_db TABLESPACE source_ts; + CREATE DATABASE dropme_db2 WITH TABLESPACE dropme_ts2 STRATEGY=; + CREATE DATABASE moveme_db TABLESPACE source_ts STRATEGY=; ALTER DATABASE moveme_db SET TABLESPACE target_ts; - CREATE DATABASE newdb TEMPLATE template_db; + CREATE DATABASE newdb TEMPLATE template_db STRATEGY=; ALTER DATABASE template_db IS_TEMPLATE = false; DROP DATABASE dropme_db1; DROP TABLE t; @@ -60,6 +62,7 @@ sub test_tablespace DROP TABLESPACE source_ts; DROP DATABASE template_db; ]; + $query =~ s//$strategy/g; $node_primary->safe_psql('postgres', $query); $node_primary->wait_for_catchup($node_standby, 'write', @@ -70,15 +73,18 @@ sub test_tablespace "ALTER SYSTEM SET log_min_messages TO debug1;"); $node_standby->stop('immediate'); # Should restart ignoring directory creation error. - is($node_standby->start(fail_ok => 1), 1, "standby node started"); + is($node_standby->start(fail_ok => 1), + 1, "standby node started for $strategy"); $node_standby->stop('immediate'); } -test_tablespace(); +test_tablespace("FILE_COPY"); +test_tablespace("WAL_LOG"); # Ensure that a missing tablespace directory during create database # replay immediately causes panic if the standby has already reached -# consistent state (archive recovery is in progress). +# consistent state (archive recovery is in progress). This is +# effective only for CREATE DATABASE WITH STRATEGY=FILE_COPY. my $node_primary = PostgreSQL::Test::Cluster->new('primary2'); $node_primary->init(allows_streaming => 1); @@ -89,9 +95,9 @@ sub test_tablespace 'postgres', q[ SET allow_in_place_tablespaces=on; CREATE TABLESPACE ts1 LOCATION '' - ]); + ]); $node_primary->safe_psql('postgres', - "CREATE DATABASE db1 WITH TABLESPACE ts1"); + "CREATE DATABASE db1 WITH TABLESPACE ts1 STRATEGY=FILE_COPY"); # Take backup my $backup_name = 'my_backup'; @@ -120,7 +126,7 @@ sub test_tablespace 'postgres', q[ CREATE TABLE should_not_replay_insertion(a int); - CREATE DATABASE db2 WITH TABLESPACE ts1; + CREATE DATABASE db2 WITH TABLESPACE ts1 STRATEGY=FILE_COPY; INSERT INTO should_not_replay_insertion VALUES (1); ]); diff --git a/third_party/spanner_pg/src/test/recovery/t/034_create_database.pl b/third_party/spanner_pg/src/test/recovery/t/034_create_database.pl new file mode 100644 index 00000000..4698cbc3 --- /dev/null +++ b/third_party/spanner_pg/src/test/recovery/t/034_create_database.pl @@ -0,0 +1,45 @@ + +# Copyright (c) 2023, PostgreSQL Global Development Group + +# Test WAL replay for CREATE DATABASE .. STRATEGY WAL_LOG. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('node'); +$node->init; +$node->start; + +# This checks that any DDLs run on the template database that modify pg_class +# are persisted after creating a database from it using the WAL_LOG strategy, +# as a direct copy of the template database's pg_class is used in this case. +my $db_template = "template1"; +my $db_new = "test_db_1"; + +# Create table. It should persist on the template database. +$node->safe_psql("postgres", + "CREATE DATABASE $db_new STRATEGY WAL_LOG TEMPLATE $db_template;"); + +$node->safe_psql($db_template, "CREATE TABLE tab_db_after_create_1 (a INT);"); + +# Flush the changes affecting the template database, then replay them. +$node->safe_psql("postgres", "CHECKPOINT;"); + +$node->stop('immediate'); +$node->start; +my $result = $node->safe_psql($db_template, + "SELECT count(*) FROM pg_class WHERE relname LIKE 'tab_db_%';"); +is($result, "1", + "check that table exists on template after crash, with checkpoint"); + +# The new database should have no tables. +$result = $node->safe_psql($db_new, + "SELECT count(*) FROM pg_class WHERE relname LIKE 'tab_db_%';"); +is($result, "0", + "check that there are no tables from template on new database after crash" +); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/recovery/t/039_end_of_wal.pl b/third_party/spanner_pg/src/test/recovery/t/039_end_of_wal.pl index 1d1d883b..b3b813d4 100644 --- a/third_party/spanner_pg/src/test/recovery/t/039_end_of_wal.pl +++ b/third_party/spanner_pg/src/test/recovery/t/039_end_of_wal.pl @@ -72,12 +72,6 @@ sub write_wal close $fh; } -sub format_lsn -{ - my $lsn = shift; - return sprintf("%X/%X", $lsn >> 32, $lsn & 0xffffffff); -} - # Emit a WAL record of arbitrary size. Returns the end LSN of the # record inserted, in bytes. sub emit_message @@ -181,7 +175,7 @@ sub advance_out_of_record_splitting_zone { my $node = shift; - my $page_threshold = 2000; + my $page_threshold = $WAL_BLOCK_SIZE / 4; my $end_lsn = get_insert_lsn($node); my $page_offset = $end_lsn % $WAL_BLOCK_SIZE; while ($page_offset >= $WAL_BLOCK_SIZE - $page_threshold) diff --git a/third_party/spanner_pg/src/test/regress/GNUmakefile b/third_party/spanner_pg/src/test/regress/GNUmakefile index fe6e0c98..88b82d92 100644 --- a/third_party/spanner_pg/src/test/regress/GNUmakefile +++ b/third_party/spanner_pg/src/test/regress/GNUmakefile @@ -3,7 +3,7 @@ # GNUmakefile-- # Makefile for src/test/regress (the regression tests) # -# 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 # # 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 @@ -69,19 +68,12 @@ all: all-lib # Ensure parallel safety if a build is started in this directory $(OBJS): | submake-libpgport submake-generated-headers -# Test input and expected files. These are created by pg_regress itself, so we -# don't have a rule to create them. We do need rules to clean them however. -input_files = $(patsubst $(srcdir)/input/%.source,sql/%.sql, $(wildcard $(srcdir)/input/*.source)) -output_files := $(patsubst $(srcdir)/output/%.source,expected/%.out, $(wildcard $(srcdir)/output/*.source)) - # not installed by default regress_data_files = \ - $(filter-out $(addprefix $(srcdir)/,$(output_files)),$(wildcard $(srcdir)/expected/*.out)) \ - $(wildcard $(srcdir)/input/*.source) \ - $(wildcard $(srcdir)/output/*.source) \ - $(filter-out $(addprefix $(srcdir)/,$(input_files)),$(wildcard $(srcdir)/sql/*.sql)) \ + $(wildcard $(srcdir)/sql/*.sql) \ + $(wildcard $(srcdir)/expected/*.out) \ $(wildcard $(srcdir)/data/*.data) \ $(srcdir)/parallel_schedule $(srcdir)/resultmap @@ -119,7 +111,7 @@ submake-contrib-spi: | submake-libpgport submake-generated-headers ## Run tests ## -REGRESS_OPTS = --dlpath=. --max-concurrent-tests=20 --make-testtablespace-dir \ +REGRESS_OPTS = --dlpath=. --max-concurrent-tests=20 \ $(EXTRA_REGRESS_OPTS) check: all @@ -137,9 +129,6 @@ installcheck-parallel: all installcheck-tests: all $(pg_regress_installcheck) $(REGRESS_OPTS) $(TESTS) $(EXTRA_TESTS) -standbycheck: all - $(pg_regress_installcheck) $(REGRESS_OPTS) --schedule=$(srcdir)/standby_schedule --use-existing - # old interfaces follow... runcheck: check @@ -162,6 +151,4 @@ clean distclean maintainer-clean: clean-lib rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX) rm -f pg_regress_main.o pg_regress.o pg_regress$(X) # things created by various check targets - rm -f $(output_files) $(input_files) - rm -rf testtablespace rm -rf $(pg_regress_clean_files) diff --git a/third_party/spanner_pg/src/test/regress/expected/.gitignore b/third_party/spanner_pg/src/test/regress/expected/.gitignore deleted file mode 100644 index b99caf5f..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/constraints.out -/copy.out -/create_function_0.out -/create_function_1.out -/create_function_2.out -/largeobject.out -/largeobject_1.out -/misc.out -/security_label.out -/tablespace.out diff --git a/third_party/spanner_pg/src/test/regress/expected/aggregates.out b/third_party/spanner_pg/src/test/regress/expected/aggregates.out index ffdfed8f..26031bc7 100644 --- a/third_party/spanner_pg/src/test/regress/expected/aggregates.out +++ b/third_party/spanner_pg/src/test/regress/expected/aggregates.out @@ -1,8 +1,18 @@ -- -- AGGREGATES -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; +-- prepare some test data +CREATE TABLE aggtest ( + a int2, + b float4 +); +\set filename :abs_srcdir '/data/agg.data' +COPY aggtest FROM :'filename'; +ANALYZE aggtest; SELECT avg(four) AS avg_1 FROM onek; avg_1 -------------------- @@ -1911,14 +1921,14 @@ from generate_series(1,5) x, (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) group by p order by p; ERROR: sum is not an ordered-set aggregate, so it cannot have WITHIN GROUP -LINE 1: select p, sum() within group (order by x::float8) +LINE 1: select p, sum() within group (order by x::float8) -- error ^ select p, percentile_cont(p,p) -- error from generate_series(1,5) x, (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p) group by p order by p; ERROR: WITHIN GROUP is required for ordered-set aggregate percentile_cont -LINE 1: select p, percentile_cont(p,p) +LINE 1: select p, percentile_cont(p,p) -- error ^ select percentile_cont(0.5) within group (order by b) from aggtest; percentile_cont diff --git a/third_party/spanner_pg/src/test/regress/expected/alter_generic.out b/third_party/spanner_pg/src/test/regress/expected/alter_generic.out index 505eb7ed..54d3fe57 100644 --- a/third_party/spanner_pg/src/test/regress/expected/alter_generic.out +++ b/third_party/spanner_pg/src/test/regress/expected/alter_generic.out @@ -1,6 +1,14 @@ -- -- Test for ALTER some_object {RENAME TO, OWNER TO, SET SCHEMA} -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_opclass_options_func(internal) + RETURNS void + AS :'regresslib', 'test_opclass_options_func' + LANGUAGE C; -- Clean up in case a prior regression run failed SET client_min_messages TO 'warning'; DROP ROLE IF EXISTS regress_alter_generic_user1; diff --git a/third_party/spanner_pg/src/test/regress/expected/alter_table.out b/third_party/spanner_pg/src/test/regress/expected/alter_table.out index dd9f2ee5..36350ddb 100644 --- a/third_party/spanner_pg/src/test/regress/expected/alter_table.out +++ b/third_party/spanner_pg/src/test/regress/expected/alter_table.out @@ -120,11 +120,6 @@ ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000; ERROR: column number 4 of relation "attmp_idx" does not exist ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; DROP TABLE attmp; --- fails with incorrect object type -CREATE VIEW at_v1 AS SELECT 1 as a; -ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -ERROR: "at_v1" is not a table, materialized view, index, partitioned index, or foreign table -DROP VIEW at_v1; -- -- rename - check on both non-temp and temp tables -- @@ -1140,9 +1135,11 @@ ERROR: column "bar" of relation "atacc1" does not exist -- try creating a view and altering that, should fail create view myview as select * from atacc1; alter table myview alter column test drop not null; -ERROR: "myview" is not a table or foreign table +ERROR: ALTER action ALTER COLUMN ... DROP NOT NULL cannot be performed on relation "myview" +DETAIL: This operation is not supported for views. alter table myview alter column test set not null; -ERROR: "myview" is not a table or foreign table +ERROR: ALTER action ALTER COLUMN ... SET NOT NULL cannot be performed on relation "myview" +DETAIL: This operation is not supported for views. drop view myview; drop table atacc1; -- set not null verified by constraints @@ -1440,7 +1437,8 @@ select * from myview; (0 rows) alter table myview drop d; -ERROR: "myview" is not a table, composite type, or foreign table +ERROR: ALTER action DROP COLUMN cannot be performed on relation "myview" +DETAIL: This operation is not supported for views. drop view myview; -- test some commands to make sure they fail on the dropped column analyze atacc1(a); @@ -3501,21 +3499,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 | u + unlogged1_pkey | i | u (5 rows) CREATE UNLOGGED TABLE unlogged2(f1 SERIAL PRIMARY KEY, f2 INTEGER REFERENCES unlogged1); -- foreign key @@ -3527,17 +3525,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 @@ -3545,21 +3543,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 @@ -3572,17 +3570,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 | u + logged1_pkey | i | u (5 rows) ALTER TABLE logged1 SET UNLOGGED; -- silently do nothing @@ -4228,11 +4226,6 @@ ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, R ERROR: every hash partition modulus must be a factor of the next larger modulus DETAIL: The new modulus 3 is not a factor of 4, the modulus of existing partition "hpart_1". DROP TABLE fail_part; --- fails with incorrect object type -CREATE VIEW at_v1 AS SELECT 1 as a; -ALTER TABLE at_v1 ATTACH PARTITION dummy default; -ERROR: "at_v1" is not a table or partitioned index -DROP VIEW at_v1; -- -- DETACH PARTITION -- @@ -4642,3 +4635,23 @@ DETAIL: Failing row contains (2, 1). -- ...and doesn't when the partition is detached along with its own partition alter table target_parted detach partition attach_parted; insert into attach_parted_part1 values (2, 1); +-- Test altering table having publication +create schema alter1; +create schema alter2; +create table alter1.t1 (a int); +set client_min_messages = 'ERROR'; +create publication pub1 for table alter1.t1, tables in schema alter2; +reset client_min_messages; +alter table alter1.t1 set schema alter2; +\d+ alter2.t1 + Table "alter2.t1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Publications: + "pub1" + +drop publication pub1; +drop schema alter1 cascade; +drop schema alter2 cascade; +NOTICE: drop cascades to table alter2.t1 diff --git a/third_party/spanner_pg/src/test/regress/expected/arrays.out b/third_party/spanner_pg/src/test/regress/expected/arrays.out index 7f9b6932..a5899478 100644 --- a/third_party/spanner_pg/src/test/regress/expected/arrays.out +++ b/third_party/spanner_pg/src/test/regress/expected/arrays.out @@ -1,6 +1,8 @@ -- -- ARRAYS -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR CREATE TABLE arrtest ( a int2[], b int4[][][], @@ -10,6 +12,14 @@ CREATE TABLE arrtest ( f char(5)[], g varchar(5)[] ); +CREATE TABLE array_op_test ( + seqno int4, + i int4[], + t text[] +); +\set filename :abs_srcdir '/data/array.data' +COPY array_op_test FROM :'filename'; +ANALYZE array_op_test; -- -- only the 'e' array is 0-based, the others are 1-based. -- @@ -307,6 +317,9 @@ INSERT INTO arrtest_s VALUES(NULL, NULL); UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null ERROR: array slice subscript must provide both boundaries DETAIL: When assigning to a slice of an empty array value, slice boundaries must be fully specified. +-- we want to work with a point_tbl that includes a null +CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; +INSERT INTO POINT_TBL(f1) VALUES (NULL); -- check with fixed-length-array type, such as point SELECT f1[0:1] FROM POINT_TBL; ERROR: slices of fixed-length arrays not implemented diff --git a/third_party/spanner_pg/src/test/regress/expected/brin.out b/third_party/spanner_pg/src/test/regress/expected/brin.out index e53d6e48..73fa3839 100644 --- a/third_party/spanner_pg/src/test/regress/expected/brin.out +++ b/third_party/spanner_pg/src/test/regress/expected/brin.out @@ -567,3 +567,8 @@ SELECT * FROM brintest_3 WHERE b < '0'; DROP TABLE brintest_3; RESET enable_seqscan; +-- test an unlogged table, mostly to get coverage of brinbuildempty +CREATE UNLOGGED TABLE brintest_unlogged (n numrange); +CREATE INDEX brinidx_unlogged ON brintest_unlogged USING brin (n); +INSERT INTO brintest_unlogged VALUES (numrange(0, 2^1000::numeric)); +DROP TABLE brintest_unlogged; diff --git a/third_party/spanner_pg/src/test/regress/expected/btree_index.out b/third_party/spanner_pg/src/test/regress/expected/btree_index.out index c7328b1d..93ed5e8c 100644 --- a/third_party/spanner_pg/src/test/regress/expected/btree_index.out +++ b/third_party/spanner_pg/src/test/regress/expected/btree_index.out @@ -1,5 +1,49 @@ -- -- BTREE_INDEX +-- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +CREATE TABLE bt_i4_heap ( + seqno int4, + random int4 +); +CREATE TABLE bt_name_heap ( + seqno name, + random int4 +); +CREATE TABLE bt_txt_heap ( + seqno text, + random int4 +); +CREATE TABLE bt_f8_heap ( + seqno float8, + random int4 +); +\set filename :abs_srcdir '/data/desc.data' +COPY bt_i4_heap FROM :'filename'; +\set filename :abs_srcdir '/data/hash.data' +COPY bt_name_heap FROM :'filename'; +\set filename :abs_srcdir '/data/desc.data' +COPY bt_txt_heap FROM :'filename'; +\set filename :abs_srcdir '/data/hash.data' +COPY bt_f8_heap FROM :'filename'; +ANALYZE bt_i4_heap; +ANALYZE bt_name_heap; +ANALYZE bt_txt_heap; +ANALYZE bt_f8_heap; +-- +-- BTREE ascending/descending cases +-- +-- we load int4/text from pure descending data (each key is a new +-- low key) and name/f8 from pure ascending data (each key is a new +-- high key). we had a bug where new low keys would sometimes be +-- "lost". +-- +CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); +CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); +CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); +CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); +-- -- test retrieval of min/max keys for each index -- SELECT b.* @@ -333,11 +377,13 @@ ERROR: operator class int4_ops has no options -- This grammar is not officially supported, but the parser allows it. CREATE INDEX btree_tall_idx2 ON btree_tall_tbl (id); ALTER INDEX btree_tall_idx2 ALTER COLUMN id SET (n_distinct=100); -ERROR: "btree_tall_idx2" is not a table, materialized view, or foreign table +ERROR: ALTER action ALTER COLUMN ... SET cannot be performed on relation "btree_tall_idx2" +DETAIL: This operation is not supported for indexes. DROP INDEX btree_tall_idx2; -- Partitioned index CREATE TABLE btree_part (id int4) PARTITION BY RANGE (id); CREATE INDEX btree_part_idx ON btree_part(id); ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100); -ERROR: "btree_part_idx" is not a table, materialized view, or foreign table +ERROR: ALTER action ALTER COLUMN ... SET cannot be performed on relation "btree_part_idx" +DETAIL: This operation is not supported for partitioned indexes. DROP TABLE btree_part; diff --git a/third_party/spanner_pg/src/test/regress/expected/char.out b/third_party/spanner_pg/src/test/regress/expected/char.out index d515b3ce..ea9b0b8e 100644 --- a/third_party/spanner_pg/src/test/regress/expected/char.out +++ b/third_party/spanner_pg/src/test/regress/expected/char.out @@ -1,8 +1,8 @@ -- -- CHAR -- --- fixed-length by value --- internally passed by value if <= 4 bytes in storage +-- Per SQL standard, CHAR means character(1), that is a varlena type +-- with a constraint restricting it to one character (not byte) SELECT char 'c' = char 'c' AS true; true ------ @@ -11,8 +11,9 @@ SELECT char 'c' = char 'c' AS true; -- -- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) -- -CREATE TABLE CHAR_TBL(f1 char); +CREATE TEMP TABLE CHAR_TBL(f1 char); INSERT INTO CHAR_TBL (f1) VALUES ('a'); INSERT INTO CHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -104,13 +105,11 @@ DROP TABLE CHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE CHAR_TBL(f1 char(4)); -INSERT INTO CHAR_TBL (f1) VALUES ('a'); -INSERT INTO CHAR_TBL (f1) VALUES ('ab'); -INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +-- This char_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character(4) -INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM CHAR_TBL; f1 ------ @@ -120,3 +119,62 @@ SELECT * FROM CHAR_TBL; abcd (4 rows) +-- +-- Also test "char", which is an ad-hoc one-byte type. It can only +-- really store ASCII characters, but we allow high-bit-set characters +-- to be accessed via bytea-like escapes. +-- +SELECT 'a'::"char"; + char +------ + a +(1 row) + +SELECT '\101'::"char"; + char +------ + A +(1 row) + +SELECT '\377'::"char"; + char +------ + \377 +(1 row) + +SELECT 'a'::"char"::text; + text +------ + a +(1 row) + +SELECT '\377'::"char"::text; + text +------ + \377 +(1 row) + +SELECT '\000'::"char"::text; + text +------ + +(1 row) + +SELECT 'a'::text::"char"; + char +------ + a +(1 row) + +SELECT '\377'::text::"char"; + char +------ + \377 +(1 row) + +SELECT ''::text::"char"; + char +------ + +(1 row) + diff --git a/third_party/spanner_pg/src/test/regress/expected/char_1.out b/third_party/spanner_pg/src/test/regress/expected/char_1.out index 6c917c0b..ffd31551 100644 --- a/third_party/spanner_pg/src/test/regress/expected/char_1.out +++ b/third_party/spanner_pg/src/test/regress/expected/char_1.out @@ -1,8 +1,8 @@ -- -- CHAR -- --- fixed-length by value --- internally passed by value if <= 4 bytes in storage +-- Per SQL standard, CHAR means character(1), that is a varlena type +-- with a constraint restricting it to one character (not byte) SELECT char 'c' = char 'c' AS true; true ------ @@ -11,8 +11,9 @@ SELECT char 'c' = char 'c' AS true; -- -- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) -- -CREATE TABLE CHAR_TBL(f1 char); +CREATE TEMP TABLE CHAR_TBL(f1 char); INSERT INTO CHAR_TBL (f1) VALUES ('a'); INSERT INTO CHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -104,13 +105,11 @@ DROP TABLE CHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE CHAR_TBL(f1 char(4)); -INSERT INTO CHAR_TBL (f1) VALUES ('a'); -INSERT INTO CHAR_TBL (f1) VALUES ('ab'); -INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +-- This char_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character(4) -INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM CHAR_TBL; f1 ------ @@ -120,3 +119,62 @@ SELECT * FROM CHAR_TBL; abcd (4 rows) +-- +-- Also test "char", which is an ad-hoc one-byte type. It can only +-- really store ASCII characters, but we allow high-bit-set characters +-- to be accessed via bytea-like escapes. +-- +SELECT 'a'::"char"; + char +------ + a +(1 row) + +SELECT '\101'::"char"; + char +------ + A +(1 row) + +SELECT '\377'::"char"; + char +------ + \377 +(1 row) + +SELECT 'a'::"char"::text; + text +------ + a +(1 row) + +SELECT '\377'::"char"::text; + text +------ + \377 +(1 row) + +SELECT '\000'::"char"::text; + text +------ + +(1 row) + +SELECT 'a'::text::"char"; + char +------ + a +(1 row) + +SELECT '\377'::text::"char"; + char +------ + \377 +(1 row) + +SELECT ''::text::"char"; + char +------ + +(1 row) + diff --git a/third_party/spanner_pg/src/test/regress/expected/char_2.out b/third_party/spanner_pg/src/test/regress/expected/char_2.out index 9a546586..56818f82 100644 --- a/third_party/spanner_pg/src/test/regress/expected/char_2.out +++ b/third_party/spanner_pg/src/test/regress/expected/char_2.out @@ -1,8 +1,8 @@ -- -- CHAR -- --- fixed-length by value --- internally passed by value if <= 4 bytes in storage +-- Per SQL standard, CHAR means character(1), that is a varlena type +-- with a constraint restricting it to one character (not byte) SELECT char 'c' = char 'c' AS true; true ------ @@ -11,8 +11,9 @@ SELECT char 'c' = char 'c' AS true; -- -- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) -- -CREATE TABLE CHAR_TBL(f1 char); +CREATE TEMP TABLE CHAR_TBL(f1 char); INSERT INTO CHAR_TBL (f1) VALUES ('a'); INSERT INTO CHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -104,13 +105,11 @@ DROP TABLE CHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE CHAR_TBL(f1 char(4)); -INSERT INTO CHAR_TBL (f1) VALUES ('a'); -INSERT INTO CHAR_TBL (f1) VALUES ('ab'); -INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); +-- This char_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character(4) -INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM CHAR_TBL; f1 ------ @@ -120,3 +119,62 @@ SELECT * FROM CHAR_TBL; abcd (4 rows) +-- +-- Also test "char", which is an ad-hoc one-byte type. It can only +-- really store ASCII characters, but we allow high-bit-set characters +-- to be accessed via bytea-like escapes. +-- +SELECT 'a'::"char"; + char +------ + a +(1 row) + +SELECT '\101'::"char"; + char +------ + A +(1 row) + +SELECT '\377'::"char"; + char +------ + \377 +(1 row) + +SELECT 'a'::"char"::text; + text +------ + a +(1 row) + +SELECT '\377'::"char"::text; + text +------ + \377 +(1 row) + +SELECT '\000'::"char"::text; + text +------ + +(1 row) + +SELECT 'a'::text::"char"; + char +------ + a +(1 row) + +SELECT '\377'::text::"char"; + char +------ + \377 +(1 row) + +SELECT ''::text::"char"; + char +------ + +(1 row) + diff --git a/third_party/spanner_pg/src/test/regress/expected/cluster.out b/third_party/spanner_pg/src/test/regress/expected/cluster.out index 7293c0f0..542c2e09 100644 --- a/third_party/spanner_pg/src/test/regress/expected/cluster.out +++ b/third_party/spanner_pg/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,14 +446,78 @@ 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; +-- 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/third_party/spanner_pg/src/test/regress/expected/collate.icu.utf8.out b/third_party/spanner_pg/src/test/regress/expected/collate.icu.utf8.out index 70133df8..d4c8c6de 100644 --- a/third_party/spanner_pg/src/test/regress/expected/collate.icu.utf8.out +++ b/third_party/spanner_pg/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 @@ -1085,6 +1083,10 @@ DROP ROLE regress_test_role; -- ALTER ALTER COLLATION "en-x-icu" REFRESH VERSION; NOTICE: version has not changed +-- also test for database while we are here +SELECT current_database() AS datname \gset +ALTER DATABASE :"datname" REFRESH COLLATION VERSION; +NOTICE: version has not changed -- dependencies CREATE COLLATION test0 FROM "C"; CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); diff --git a/third_party/spanner_pg/src/test/regress/expected/collate.linux.utf8.out b/third_party/spanner_pg/src/test/regress/expected/collate.linux.utf8.out index f06ae543..f2d0eb94 100644 --- a/third_party/spanner_pg/src/test/regress/expected/collate.linux.utf8.out +++ b/third_party/spanner_pg/src/test/regress/expected/collate.linux.utf8.out @@ -1096,6 +1096,10 @@ DROP ROLE regress_test_role; -- ALTER ALTER COLLATION "en_US" REFRESH VERSION; NOTICE: version has not changed +-- also test for database while we are here +SELECT current_database() AS datname \gset +ALTER DATABASE :"datname" REFRESH COLLATION VERSION; +NOTICE: version has not changed -- dependencies CREATE COLLATION test0 FROM "C"; CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); diff --git a/third_party/spanner_pg/src/test/regress/expected/collate.out b/third_party/spanner_pg/src/test/regress/expected/collate.out index 0b60b555..24683257 100644 --- a/third_party/spanner_pg/src/test/regress/expected/collate.out +++ b/third_party/spanner_pg/src/test/regress/expected/collate.out @@ -701,6 +701,53 @@ View definition: SELECT ss.c1 + 1 AS c1p FROM ( SELECT 4 AS c1) ss; +-- Check conflicting or redundant options in CREATE COLLATION +-- LC_COLLATE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE = "NONSENSE", LC_CTYPE = "POSIX"); +ERROR: conflicting or redundant options +LINE 1: ...ATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE... + ^ +-- LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE = "NONSENSE", LC_COLLATE = "POSIX"); +ERROR: conflicting or redundant options +LINE 1: ...REATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE =... + ^ +-- PROVIDER +CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NONSENSE, LC_COLLATE = "POSIX", LC_CTYPE = "POSIX"); +ERROR: conflicting or redundant options +LINE 1: CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NO... + ^ +-- LOCALE +CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONSENSE"); +ERROR: conflicting or redundant options +LINE 1: CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONS... + ^ +-- DETERMINISTIC +CREATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINISTIC = NONSENSE, LOCALE = ''); +ERROR: conflicting or redundant options +LINE 1: ...ATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINIS... + ^ +-- VERSION +CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NONSENSE", LOCALE = ''); +ERROR: conflicting or redundant options +LINE 1: CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NON... + ^ +-- LOCALE conflicts with LC_COLLATE and LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_CTYPE = "POSIX", LOCALE = ''); +ERROR: conflicting or redundant options +DETAIL: LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE. +-- LOCALE conflicts with LC_COLLATE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LOCALE = ''); +ERROR: conflicting or redundant options +DETAIL: LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE. +-- LOCALE conflicts with LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LOCALE = ''); +ERROR: conflicting or redundant options +DETAIL: LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE. +-- FROM conflicts with any other option +CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1"); +ERROR: conflicting or redundant options +DETAIL: FROM cannot be specified together with any other options. -- -- Clean up. Many of these table names will be re-used if the user is -- trying to run any platform-specific collation tests later, so we diff --git a/third_party/spanner_pg/src/test/regress/expected/compression_1.out b/third_party/spanner_pg/src/test/regress/expected/compression_1.out index 1ce2962d..c0a47646 100644 --- a/third_party/spanner_pg/src/test/regress/expected/compression_1.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/output/constraints.source b/third_party/spanner_pg/src/test/regress/expected/constraints.out similarity index 96% rename from third_party/spanner_pg/src/test/regress/output/constraints.source rename to third_party/spanner_pg/src/test/regress/expected/constraints.out index 28e3f2c7..e6f6602d 100644 --- a/third_party/spanner_pg/src/test/regress/output/constraints.source +++ b/third_party/spanner_pg/src/test/regress/expected/constraints.out @@ -7,6 +7,8 @@ -- - UNIQUE clauses -- - EXCLUDE clauses -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR -- -- DEFAULT syntax -- @@ -346,7 +348,8 @@ SELECT * FROM INSERT_TBL; CREATE TABLE COPY_TBL (x INT, y TEXT, z INT, CONSTRAINT COPY_CON CHECK (x > 3 AND y <> 'check failed' AND x < 7 )); -COPY COPY_TBL FROM '@abs_srcdir@/data/constro.data'; +\set filename :abs_srcdir '/data/constro.data' +COPY COPY_TBL FROM :'filename'; SELECT * FROM COPY_TBL; x | y | z ---+---------------+--- @@ -354,7 +357,8 @@ SELECT * FROM COPY_TBL; 6 | OK | 4 (2 rows) -COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data'; +\set filename :abs_srcdir '/data/constrf.data' +COPY COPY_TBL FROM :'filename'; ERROR: new row for relation "copy_tbl" violates check constraint "copy_con" DETAIL: Failing row contains (7, check failed, 6). CONTEXT: COPY copy_tbl, line 2: "7 check failed 6" @@ -441,6 +445,30 @@ SELECT * FROM UNIQUE_TBL; 6 | six-upsert-insert (7 rows) +DROP TABLE UNIQUE_TBL; +CREATE TABLE UNIQUE_TBL (i int UNIQUE NULLS NOT DISTINCT, t text); +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); -- fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(1) already exists. +INSERT INTO UNIQUE_TBL VALUES (4, 'four'); +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); +INSERT INTO UNIQUE_TBL (t) VALUES ('seven'); -- fail +ERROR: duplicate key value violates unique constraint "unique_tbl_i_key" +DETAIL: Key (i)=(null) already exists. +INSERT INTO UNIQUE_TBL (t) VALUES ('eight') ON CONFLICT DO NOTHING; -- no-op +SELECT * FROM UNIQUE_TBL; + i | t +---+------ + 1 | one + 2 | two + 4 | four + 5 | one + | six +(5 rows) + DROP TABLE UNIQUE_TBL; CREATE TABLE UNIQUE_TBL (i int, t text, UNIQUE(i,t)); diff --git a/third_party/spanner_pg/src/test/regress/expected/conversion.out b/third_party/spanner_pg/src/test/regress/expected/conversion.out index 04fdcba4..442e7aff 100644 --- a/third_party/spanner_pg/src/test/regress/expected/conversion.out +++ b/third_party/spanner_pg/src/test/regress/expected/conversion.out @@ -1,6 +1,13 @@ -- -- create user defined conversion -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) + AS :'regresslib', 'test_enc_conversion' + LANGUAGE C STRICT; CREATE USER regress_conversion_user WITH NOCREATEDB NOCREATEROLE; SET SESSION AUTHORIZATION regress_conversion_user; CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; @@ -33,7 +40,7 @@ DROP CONVERSION mydef; -- so there's no need to do that here. -- -- --- return to the super user +-- return to the superuser -- RESET SESSION AUTHORIZATION; DROP USER regress_conversion_user; @@ -72,6 +79,175 @@ $$; -- -- UTF-8 -- +-- The description column must be unique. +CREATE TABLE utf8_verification_inputs (inbytes bytea, description text PRIMARY KEY); +insert into utf8_verification_inputs values + ('\x66006f', 'NUL byte'), + ('\xaf', 'bare continuation'), + ('\xc5', 'missing second byte in 2-byte char'), + ('\xc080', 'smallest 2-byte overlong'), + ('\xc1bf', 'largest 2-byte overlong'), + ('\xc280', 'next 2-byte after overlongs'), + ('\xdfbf', 'largest 2-byte'), + ('\xe9af', 'missing third byte in 3-byte char'), + ('\xe08080', 'smallest 3-byte overlong'), + ('\xe09fbf', 'largest 3-byte overlong'), + ('\xe0a080', 'next 3-byte after overlong'), + ('\xed9fbf', 'last before surrogates'), + ('\xeda080', 'smallest surrogate'), + ('\xedbfbf', 'largest surrogate'), + ('\xee8080', 'next after surrogates'), + ('\xefbfbf', 'largest 3-byte'), + ('\xf1afbf', 'missing fourth byte in 4-byte char'), + ('\xf0808080', 'smallest 4-byte overlong'), + ('\xf08fbfbf', 'largest 4-byte overlong'), + ('\xf0908080', 'next 4-byte after overlong'), + ('\xf48fbfbf', 'largest 4-byte'), + ('\xf4908080', 'smallest too large'), + ('\xfa9a9a8a8a', '5-byte'); +-- Test UTF-8 verification slow path +select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_verification_inputs; + description | result | errorat | error +------------------------------------+------------+--------------+---------------------------------------------------------------- + NUL byte | \x66 | \x006f | invalid byte sequence for encoding "UTF8": 0x00 + bare continuation | \x | \xaf | invalid byte sequence for encoding "UTF8": 0xaf + missing second byte in 2-byte char | \x | \xc5 | invalid byte sequence for encoding "UTF8": 0xc5 + smallest 2-byte overlong | \x | \xc080 | invalid byte sequence for encoding "UTF8": 0xc0 0x80 + largest 2-byte overlong | \x | \xc1bf | invalid byte sequence for encoding "UTF8": 0xc1 0xbf + next 2-byte after overlongs | \xc280 | | + largest 2-byte | \xdfbf | | + missing third byte in 3-byte char | \x | \xe9af | invalid byte sequence for encoding "UTF8": 0xe9 0xaf + smallest 3-byte overlong | \x | \xe08080 | invalid byte sequence for encoding "UTF8": 0xe0 0x80 0x80 + largest 3-byte overlong | \x | \xe09fbf | invalid byte sequence for encoding "UTF8": 0xe0 0x9f 0xbf + next 3-byte after overlong | \xe0a080 | | + last before surrogates | \xed9fbf | | + smallest surrogate | \x | \xeda080 | invalid byte sequence for encoding "UTF8": 0xed 0xa0 0x80 + largest surrogate | \x | \xedbfbf | invalid byte sequence for encoding "UTF8": 0xed 0xbf 0xbf + next after surrogates | \xee8080 | | + largest 3-byte | \xefbfbf | | + missing fourth byte in 4-byte char | \x | \xf1afbf | invalid byte sequence for encoding "UTF8": 0xf1 0xaf 0xbf + smallest 4-byte overlong | \x | \xf0808080 | invalid byte sequence for encoding "UTF8": 0xf0 0x80 0x80 0x80 + largest 4-byte overlong | \x | \xf08fbfbf | invalid byte sequence for encoding "UTF8": 0xf0 0x8f 0xbf 0xbf + next 4-byte after overlong | \xf0908080 | | + largest 4-byte | \xf48fbfbf | | + smallest too large | \x | \xf4908080 | invalid byte sequence for encoding "UTF8": 0xf4 0x90 0x80 0x80 + 5-byte | \x | \xfa9a9a8a8a | invalid byte sequence for encoding "UTF8": 0xfa +(23 rows) + +-- Test UTF-8 verification with ASCII padding appended to provide +-- coverage for algorithms that work on multiple bytes at a time. +-- The error message for a sequence starting with a 4-byte lead +-- will contain all 4 bytes if they are present, so various +-- expressions below add 3 ASCII bytes to the end to ensure +-- consistent error messages. +-- The number 64 below needs to be at least the value of STRIDE_LENGTH in wchar.c. +-- Test multibyte verification in fast path +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(inbytes || repeat('.', 64)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + description | orig_error | error_after_padding +-------------+------------+--------------------- +(0 rows) + +-- Test ASCII verification in fast path where incomplete +-- UTF-8 sequences fall at the end of the preceding chunk. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64 - length(inbytes))::bytea || inbytes || repeat('.', 64)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + description | orig_error | error_after_padding +-------------+------------+--------------------- +(0 rows) + +-- Test cases where UTF-8 sequences within short text +-- come after the fast path returns. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64)::bytea || inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + description | orig_error | error_after_padding +-------------+------------+--------------------- +(0 rows) + +-- Test cases where incomplete UTF-8 sequences fall at the +-- end of the part checked by the fast path. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64 - length(inbytes))::bytea || inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + description | orig_error | error_after_padding +-------------+------------+--------------------- +(0 rows) + CREATE TABLE utf8_inputs (inbytes bytea, description text); insert into utf8_inputs values ('\x666f6f', 'valid, pure ASCII'), diff --git a/third_party/spanner_pg/src/test/regress/output/copy.source b/third_party/spanner_pg/src/test/regress/expected/copy.out similarity index 61% rename from third_party/spanner_pg/src/test/regress/output/copy.source rename to third_party/spanner_pg/src/test/regress/expected/copy.out index 25bdec6c..8a8bf43f 100644 --- a/third_party/spanner_pg/src/test/regress/output/copy.source +++ b/third_party/spanner_pg/src/test/regress/expected/copy.out @@ -1,63 +1,9 @@ -- -- COPY -- --- CLASS POPULATION --- (any resemblance to real life is purely coincidental) --- -COPY aggtest FROM '@abs_srcdir@/data/agg.data'; -COPY onek FROM '@abs_srcdir@/data/onek.data'; -COPY onek TO '@abs_builddir@/results/onek.data'; -DELETE FROM onek; -COPY onek FROM '@abs_builddir@/results/onek.data'; -COPY tenk1 FROM '@abs_srcdir@/data/tenk.data'; -COPY slow_emp4000 FROM '@abs_srcdir@/data/rect.data'; -COPY person FROM '@abs_srcdir@/data/person.data'; -COPY emp FROM '@abs_srcdir@/data/emp.data'; -COPY student FROM '@abs_srcdir@/data/student.data'; -COPY stud_emp FROM '@abs_srcdir@/data/stud_emp.data'; -COPY road FROM '@abs_srcdir@/data/streets.data'; -COPY real_city FROM '@abs_srcdir@/data/real_city.data'; -COPY hash_i4_heap FROM '@abs_srcdir@/data/hash.data'; -COPY hash_name_heap FROM '@abs_srcdir@/data/hash.data'; -COPY hash_txt_heap FROM '@abs_srcdir@/data/hash.data'; -COPY hash_f8_heap FROM '@abs_srcdir@/data/hash.data'; -COPY test_tsvector FROM '@abs_srcdir@/data/tsearch.data'; -COPY testjsonb FROM '@abs_srcdir@/data/jsonb.data'; --- the data in this file has a lot of duplicates in the index key --- fields, leading to long bucket chains and lots of table expansion. --- this is therefore a stress test of the bucket overflow code (unlike --- the data in hash.data, which has unique index keys). --- --- COPY hash_ovfl_heap FROM '@abs_srcdir@/data/hashovfl.data'; -COPY bt_i4_heap FROM '@abs_srcdir@/data/desc.data'; -COPY bt_name_heap FROM '@abs_srcdir@/data/hash.data'; -COPY bt_txt_heap FROM '@abs_srcdir@/data/desc.data'; -COPY bt_f8_heap FROM '@abs_srcdir@/data/hash.data'; -COPY array_op_test FROM '@abs_srcdir@/data/array.data'; -COPY array_index_op_test FROM '@abs_srcdir@/data/array.data'; --- analyze all the data we just loaded, to ensure plan consistency --- in later tests -ANALYZE aggtest; -ANALYZE onek; -ANALYZE tenk1; -ANALYZE slow_emp4000; -ANALYZE person; -ANALYZE emp; -ANALYZE student; -ANALYZE stud_emp; -ANALYZE road; -ANALYZE real_city; -ANALYZE hash_i4_heap; -ANALYZE hash_name_heap; -ANALYZE hash_txt_heap; -ANALYZE hash_f8_heap; -ANALYZE test_tsvector; -ANALYZE bt_i4_heap; -ANALYZE bt_name_heap; -ANALYZE bt_txt_heap; -ANALYZE bt_f8_heap; -ANALYZE array_op_test; -ANALYZE array_index_op_test; +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR --- test copying in CSV mode with various styles --- of embedded line ending characters create temp table copytest ( @@ -68,9 +14,10 @@ insert into copytest values('DOS',E'abc\r\ndef',1); insert into copytest values('Unix',E'abc\ndef',2); insert into copytest values('Mac',E'abc\rdef',3); insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); -copy copytest to '@abs_builddir@/results/copytest.csv' csv; +\set filename :abs_builddir '/results/copytest.csv' +copy copytest to :'filename' csv; create temp table copytest2 (like copytest); -copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; +copy copytest2 from :'filename' csv; select * from copytest except select * from copytest2; style | test | filler -------+------+-------- @@ -78,8 +25,8 @@ select * from copytest except select * from copytest2; truncate copytest2; --- same test but with an escape char different from quote char -copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; -copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; +copy copytest to :'filename' csv quote '''' escape E'\\'; +copy copytest2 from :'filename' csv quote '''' escape E'\\'; select * from copytest except select * from copytest2; style | test | filler -------+------+-------- @@ -95,6 +42,14 @@ copy copytest3 to stdout csv header; c1,"col with , comma","col with "" quote" 1,a,1 2,b,2 +create temp table copytest4 ( + c1 int, + "colname with tab: " text); +copy copytest4 from stdin (header); +copy copytest4 to stdout (header); +c1 colname with tab: \t +1 a +2 b -- test copy from with a partitioned table create table parted_copytest ( a int, @@ -110,13 +65,14 @@ alter table parted_copytest attach partition parted_copytest_a2 for values in(2) insert into parted_copytest select x,1,'One' from generate_series(1,1000) x; insert into parted_copytest select x,2,'Two' from generate_series(1001,1010) x; insert into parted_copytest select x,1,'One' from generate_series(1011,1020) x; -copy (select * from parted_copytest order by a) to '@abs_builddir@/results/parted_copytest.csv'; +\set filename :abs_builddir '/results/parted_copytest.csv' +copy (select * from parted_copytest order by a) to :'filename'; truncate parted_copytest; -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +copy parted_copytest from :'filename'; -- Ensure COPY FREEZE errors for partitioned tables. begin; truncate parted_copytest; -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv' (freeze); +copy parted_copytest from :'filename' (freeze); ERROR: cannot perform COPY FREEZE on a partitioned table rollback; select tableoid::regclass,count(*),sum(a) from parted_copytest @@ -138,7 +94,7 @@ create trigger part_ins_trig before insert on parted_copytest_a2 for each row execute procedure part_ins_func(); -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +copy parted_copytest from :'filename'; select tableoid::regclass,count(*),sum(a) from parted_copytest group by tableoid order by tableoid::regclass::name; tableoid | count | sum @@ -213,9 +169,74 @@ copy tab_progress_reporting from stdin; INFO: progress: {"type": "PIPE", "command": "COPY FROM", "relname": "tab_progress_reporting", "has_bytes_total": false, "tuples_excluded": 0, "tuples_processed": 3, "has_bytes_processed": true} -- Generate COPY FROM report with FILE, with some excluded tuples. truncate tab_progress_reporting; -copy tab_progress_reporting from '@abs_srcdir@/data/emp.data' +\set filename :abs_srcdir '/data/emp.data' +copy tab_progress_reporting from :'filename' where (salary < 2000); INFO: progress: {"type": "FILE", "command": "COPY FROM", "relname": "tab_progress_reporting", "has_bytes_total": true, "tuples_excluded": 1, "tuples_processed": 2, "has_bytes_processed": true} 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 +); +-- Make sure it works with dropped columns +alter table header_copytest drop column c; +alter table header_copytest add column c text; +copy header_copytest to stdout with (header match); +ERROR: cannot use "match" with HEADER in COPY TO +copy header_copytest from stdin with (header wrong_choice); +ERROR: header requires a Boolean value or "match" +-- works +copy header_copytest from stdin with (header match); +copy header_copytest (c, a, b) from stdin with (header match); +copy header_copytest from stdin with (header match, format csv); +-- errors +copy header_copytest (c, b, a) from stdin with (header match); +ERROR: column name mismatch in header line field 1: got "a", expected "c" +CONTEXT: COPY header_copytest, line 1: "a b c" +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: got 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: got 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" +SELECT * FROM header_copytest ORDER BY a; + a | b | c +---+---+----- + 1 | 2 | foo + 3 | 4 | bar + 5 | 6 | baz +(3 rows) + +-- Drop an extra column, in the middle of the existing set. +alter table header_copytest drop column b; +-- works +copy header_copytest (c, a) from stdin with (header match); +copy header_copytest (a, c) from stdin with (header match); +-- errors +copy header_copytest from stdin with (header match); +ERROR: wrong number of fields in header line: got 3, expected 2 +CONTEXT: COPY header_copytest, line 1: "a ........pg.dropped.2........ c" +copy header_copytest (a, c) from stdin with (header match); +ERROR: wrong number of fields in header line: got 3, expected 2 +CONTEXT: COPY header_copytest, line 1: "a c b" +SELECT * FROM header_copytest ORDER BY a; + a | c +---+----- + 1 | foo + 3 | bar + 5 | baz + 7 | foo + 8 | foo +(5 rows) + +drop table header_copytest; diff --git a/third_party/spanner_pg/src/test/regress/expected/copy2.out b/third_party/spanner_pg/src/test/regress/expected/copy2.out index c64f0719..5f3685e9 100644 --- a/third_party/spanner_pg/src/test/regress/expected/copy2.out +++ b/third_party/spanner_pg/src/test/regress/expected/copy2.out @@ -67,6 +67,8 @@ LINE 1: COPY x from stdin (force_not_null (a), force_not_null (b)); ^ COPY x from stdin (force_null (a), force_null (b)); ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (force_null (a), force_null (b)); + ^ COPY x from stdin (convert_selectively (a), convert_selectively (b)); ERROR: conflicting or redundant options LINE 1: COPY x from stdin (convert_selectively (a), convert_selectiv... diff --git a/third_party/spanner_pg/src/test/regress/expected/copyselect.out b/third_party/spanner_pg/src/test/regress/expected/copyselect.out index 72865fe1..bb9e026f 100644 --- a/third_party/spanner_pg/src/test/regress/expected/copyselect.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/expected/create_am.out b/third_party/spanner_pg/src/test/regress/expected/create_am.out index 0dfb26c3..b50293d5 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_am.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_am.out @@ -230,6 +230,95 @@ ORDER BY classid, objid, objsubid; table tableam_parted_d_heap2 (5 rows) +-- ALTER TABLE SET ACCESS METHOD +CREATE TABLE heaptable USING heap AS + SELECT a, repeat(a::text, 100) FROM generate_series(1,9) AS a; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; + amname +-------- + heap +(1 row) + +-- Switching to heap2 adds new dependency entry to the AM. +ALTER TABLE heaptable SET ACCESS METHOD heap2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_class'::regclass AND + objid = 'heaptable'::regclass + ORDER BY 1, 2; + obj | objref | deptype +-----------------+---------------------+--------- + table heaptable | access method heap2 | n + table heaptable | schema public | n +(2 rows) + +-- Switching to heap should not have a dependency entry to the AM. +ALTER TABLE heaptable SET ACCESS METHOD heap; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_class'::regclass AND + objid = 'heaptable'::regclass + ORDER BY 1, 2; + obj | objref | deptype +-----------------+---------------+--------- + table heaptable | schema public | n +(1 row) + +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; + amname +-------- + heap2 +(1 row) + +SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; + count | count +-------+------- + 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) + PARTITION BY hash (x); +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +ERROR: cannot change access method of a partitioned table +DROP TABLE am_partitioned; -- Second, create objects in the new AM by changing the default AM BEGIN; SET LOCAL default_table_access_method = 'heap2'; diff --git a/third_party/spanner_pg/src/test/regress/expected/create_function_c.out b/third_party/spanner_pg/src/test/regress/expected/create_function_c.out new file mode 100644 index 00000000..2dba9d70 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/expected/create_function_c.out @@ -0,0 +1,36 @@ +-- +-- CREATE_FUNCTION_C +-- +-- This script used to create C functions for other scripts to use. +-- But to get rid of the ordering dependencies that caused, such +-- functions are now made either in test_setup.sql or in the specific +-- test script that needs them. All that remains here is error cases. +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +-- +-- Check LOAD command. (The alternative of implicitly loading the library +-- is checked in many other test scripts.) +-- +LOAD :'regresslib'; +-- Things that shouldn't work: +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS 'nosuchfile'; +ERROR: could not access file "nosuchfile": No such file or directory +-- To produce stable regression test output, we have to filter the name +-- of the regresslib file out of the error message in this test. +\set VERBOSITY sqlstate +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS :'regresslib', 'nosuchsymbol'; +ERROR: 42883 +\set VERBOSITY default +SELECT regexp_replace(:'LAST_ERROR_MESSAGE', 'file ".*"', 'file "..."'); + regexp_replace +------------------------------------------------------ + could not find function "nosuchsymbol" in file "..." +(1 row) + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal + AS 'nosuch'; +ERROR: there is no built-in function named "nosuch" diff --git a/third_party/spanner_pg/src/test/regress/expected/create_function_3.out b/third_party/spanner_pg/src/test/regress/expected/create_function_sql.out similarity index 95% rename from third_party/spanner_pg/src/test/regress/expected/create_function_3.out rename to third_party/spanner_pg/src/test/regress/expected/create_function_sql.out index 14e47ce0..50aca594 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_function_3.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_function_sql.out @@ -1,5 +1,5 @@ -- --- CREATE FUNCTION +-- CREATE_FUNCTION_SQL -- -- Assorted tests using SQL-language functions -- @@ -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 @@ -403,7 +403,7 @@ SELECT pg_get_functiondef('functest_S_13'::regproc); LANGUAGE sql + BEGIN ATOMIC + SELECT 1; + - SELECT false AS bool; + + SELECT false; + END + (1 row) @@ -682,6 +682,30 @@ SELECT double_append(array_append(ARRAY[q1], q2), q3) {4,5,6,4,5,6} (2 rows) +-- Things that shouldn't work: +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT ''not an integer'';'; +ERROR: return type mismatch in function declared to return integer +DETAIL: Actual return type is text. +CONTEXT: SQL function "test1" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'not even SQL'; +ERROR: syntax error at or near "not" +LINE 2: AS 'not even SQL'; + ^ +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT 1, 2, 3;'; +ERROR: return type mismatch in function declared to return integer +DETAIL: Final statement must return exactly one column. +CONTEXT: SQL function "test1" +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT $2;'; +ERROR: there is no parameter $2 +LINE 2: AS 'SELECT $2;'; + ^ +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'a', 'b'; +ERROR: only one AS item needed for language "sql" -- Cleanup DROP SCHEMA temp_func_test CASCADE; NOTICE: drop cascades to 30 other objects diff --git a/third_party/spanner_pg/src/test/regress/expected/create_index.out b/third_party/spanner_pg/src/test/regress/expected/create_index.out index 88d11de4..d55aec3a 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_index.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_index.out @@ -2,6 +2,8 @@ -- CREATE_INDEX -- Create ancillary data structures (i.e. indices) -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR -- -- BTREE -- @@ -31,18 +33,6 @@ ERROR: relation "six_wrong" does not exist COMMENT ON INDEX six IS 'good index'; COMMENT ON INDEX six IS NULL; -- --- BTREE ascending/descending cases --- --- we load int4/text from pure descending data (each key is a new --- low key) and name/f8 from pure ascending data (each key is a new --- high key). we had a bug where new low keys would sometimes be --- "lost". --- -CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); -CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); -CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); -CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); --- -- BTREE partial indices -- CREATE INDEX onek2_u1_prtl ON onek2 USING btree(unique1 int4_ops) @@ -54,9 +44,20 @@ CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) -- -- GiST (rtree-equivalent opclasses only) -- +CREATE TABLE slow_emp4000 ( + home_base box +); +CREATE TABLE fast_emp4000 ( + home_base box +); +\set filename :abs_srcdir '/data/rect.data' +COPY slow_emp4000 FROM :'filename'; +INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; +ANALYZE slow_emp4000; +ANALYZE fast_emp4000; CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); -CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); -CREATE INDEX gcircleind ON circle_tbl USING gist (f1); +-- we want to work with a point_tbl that includes a null +CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; INSERT INTO POINT_TBL(f1) VALUES (NULL); CREATE INDEX gpointind ON point_tbl USING gist (f1); CREATE TEMP TABLE gpolygon_tbl AS @@ -95,23 +96,6 @@ SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; 278 (1 row) -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; - f1 ---------------------- - ((2,0),(2,4),(0,0)) -(1 row) - -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); - f1 ---------------- - <(1,2),3> - <(1,3),5> - <(1,2),100> - <(100,1),115> -(4 rows) - SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; count ------- @@ -310,45 +294,6 @@ SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; 278 (1 row) -EXPLAIN (COSTS OFF) -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; - QUERY PLAN ------------------------------------------------------------- - Sort - Sort Key: ((poly_center(f1))[0]) - -> Index Scan using gpolygonind on polygon_tbl - Index Cond: (f1 @> '((1,1),(2,2),(2,1))'::polygon) -(4 rows) - -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; - f1 ---------------------- - ((2,0),(2,4),(0,0)) -(1 row) - -EXPLAIN (COSTS OFF) -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); - QUERY PLAN --------------------------------------------------- - Sort - Sort Key: (area(f1)) - -> Index Scan using gcircleind on circle_tbl - Index Cond: (f1 && '<(1,-2),1>'::circle) -(4 rows) - -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); - f1 ---------------- - <(1,2),3> - <(1,3),5> - <(1,2),100> - <(100,1),115> -(4 rows) - EXPLAIN (COSTS OFF) SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; QUERY PLAN @@ -704,6 +649,36 @@ RESET enable_bitmapscan; -- -- Note: GIN currently supports only bitmap scans, not plain indexscans -- +CREATE TABLE array_index_op_test ( + seqno int4, + i int4[], + t text[] +); +\set filename :abs_srcdir '/data/array.data' +COPY array_index_op_test FROM :'filename'; +ANALYZE array_index_op_test; +SELECT * FROM array_index_op_test WHERE i = '{NULL}' ORDER BY seqno; + seqno | i | t +-------+--------+-------- + 102 | {NULL} | {NULL} +(1 row) + +SELECT * FROM array_index_op_test WHERE i @> '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_index_op_test WHERE i && '{NULL}' ORDER BY seqno; + seqno | i | t +-------+---+--- +(0 rows) + +SELECT * FROM array_index_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + seqno | i | t +-------+----+---- + 101 | {} | {} +(1 row) + SET enable_seqscan = OFF; SET enable_indexscan = OFF; SET enable_bitmapscan = ON; @@ -931,28 +906,6 @@ SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; 101 | {} | {} (1 row) -SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; - seqno | i | t --------+--------+-------- - 102 | {NULL} | {NULL} -(1 row) - -SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); explain (costs off) SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; @@ -1222,18 +1175,6 @@ SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; 101 | {} | {} (1 row) -SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; - seqno | i | t --------+--------+-------- - 102 | {NULL} | {NULL} -(1 row) - -SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan; @@ -1267,10 +1208,6 @@ Options: fastupdate=on, gin_pending_list_limit=128 -- -- HASH -- -CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); -CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); -CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); -CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) WITH (fillfactor=60); CREATE UNLOGGED TABLE unlogged_hash_table (id int4); CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); DROP TABLE unlogged_hash_table; @@ -1299,6 +1236,67 @@ SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; DROP INDEX hash_tuplesort_idx; RESET maintenance_work_mem; -- +-- Test unique null behavior +-- +CREATE TABLE unique_tbl (i int, t text); +CREATE UNIQUE INDEX unique_idx1 ON unique_tbl (i) NULLS DISTINCT; +CREATE UNIQUE INDEX unique_idx2 ON unique_tbl (i) NULLS NOT DISTINCT; +INSERT INTO unique_tbl VALUES (1, 'one'); +INSERT INTO unique_tbl VALUES (2, 'two'); +INSERT INTO unique_tbl VALUES (3, 'three'); +INSERT INTO unique_tbl VALUES (4, 'four'); +INSERT INTO unique_tbl VALUES (5, 'one'); +INSERT INTO unique_tbl (t) VALUES ('six'); +INSERT INTO unique_tbl (t) VALUES ('seven'); -- error from unique_idx2 +ERROR: duplicate key value violates unique constraint "unique_idx2" +DETAIL: Key (i)=(null) already exists. +DROP INDEX unique_idx1, unique_idx2; +INSERT INTO unique_tbl (t) VALUES ('seven'); +-- build indexes on filled table +CREATE UNIQUE INDEX unique_idx3 ON unique_tbl (i) NULLS DISTINCT; -- ok +CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- error +ERROR: could not create unique index "unique_idx4" +DETAIL: Key (i)=(null) is duplicated. +DELETE FROM unique_tbl WHERE t = 'seven'; +CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- ok now +\d unique_tbl + Table "public.unique_tbl" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + i | integer | | | + t | text | | | +Indexes: + "unique_idx3" UNIQUE, btree (i) + "unique_idx4" UNIQUE, btree (i) NULLS NOT DISTINCT + +\d unique_idx3 + Index "public.unique_idx3" + Column | Type | Key? | Definition +--------+---------+------+------------ + i | integer | yes | i +unique, btree, for table "public.unique_tbl" + +\d unique_idx4 + Index "public.unique_idx4" + Column | Type | Key? | Definition +--------+---------+------+------------ + i | integer | yes | i +unique nulls not distinct, btree, for table "public.unique_tbl" + +SELECT pg_get_indexdef('unique_idx3'::regclass); + pg_get_indexdef +---------------------------------------------------------------------- + CREATE UNIQUE INDEX unique_idx3 ON public.unique_tbl USING btree (i) +(1 row) + +SELECT pg_get_indexdef('unique_idx4'::regclass); + pg_get_indexdef +----------------------------------------------------------------------------------------- + CREATE UNIQUE INDEX unique_idx4 ON public.unique_tbl USING btree (i) NULLS NOT DISTINCT +(1 row) + +DROP TABLE unique_tbl; +-- -- Test functional index -- CREATE TABLE func_index_heap (f1 text, f2 text); @@ -1384,13 +1382,6 @@ ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING I covering_pkey; DROP TABLE covering_index_heap; -- --- Also try building functional, expressional, and partial indexes on --- tables that already contain data. --- -create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); -create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); -create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; --- -- Try some concurrent index builds -- -- Unfortunately this only tests about half the code paths because there are @@ -1915,7 +1906,6 @@ SELECT count(*) FROM dupindexcols -- -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- -vacuum tenk1; -- ensure we get consistent plans here explain (costs off) SELECT unique1 FROM tenk1 WHERE unique1 IN (1,42,7) diff --git a/third_party/spanner_pg/src/test/regress/expected/create_index_spgist.out b/third_party/spanner_pg/src/test/regress/expected/create_index_spgist.out index f4fb08a2..5c04df9c 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_index_spgist.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_index_spgist.out @@ -804,6 +804,22 @@ SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; 2 (1 row) +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + QUERY PLAN +------------------------------------------------------------ + Aggregate + -> Index Only Scan using sp_radix_ind on radix_text_tbl + Index Cond: (t ^@ 'Worth'::text) + Filter: starts_with(t, 'Worth'::text) +(4 rows) + +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + count +------- + 2 +(1 row) + -- Now check the results from bitmap indexscan SET enable_seqscan = OFF; SET enable_indexscan = OFF; @@ -1333,6 +1349,23 @@ SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; 2 (1 row) +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + QUERY PLAN +------------------------------------------------ + Aggregate + -> Bitmap Heap Scan on radix_text_tbl + Filter: starts_with(t, 'Worth'::text) + -> Bitmap Index Scan on sp_radix_ind + Index Cond: (t ^@ 'Worth'::text) +(5 rows) + +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + count +------- + 2 +(1 row) + RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan; diff --git a/third_party/spanner_pg/src/test/regress/expected/create_misc.out b/third_party/spanner_pg/src/test/regress/expected/create_misc.out index 41bc4d77..5b46ee5f 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_misc.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_misc.out @@ -1,53 +1,34 @@ -- -- CREATE_MISC -- --- CLASS POPULATION --- (any resemblance to real life is purely coincidental) -- -INSERT INTO tenk2 SELECT * FROM tenk1; -CREATE TABLE onek2 AS SELECT * FROM onek; -INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; -SELECT * - INTO TABLE Bprime - FROM tenk1 - WHERE unique2 < 1000; -INSERT INTO hobbies_r (name, person) - SELECT 'posthacking', p.name - FROM person* p - WHERE p.name = 'mike' or p.name = 'jeff'; -INSERT INTO hobbies_r (name, person) - SELECT 'basketball', p.name - FROM person p - WHERE p.name = 'joe' or p.name = 'sally'; -INSERT INTO hobbies_r (name) VALUES ('skywalking'); -INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); -INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); -INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); -INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); -INSERT INTO city VALUES -('Podunk', '(1,2),(3,4)', '100,127,1000'), -('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); -TABLE city; - name | location | budget ---------+----------------------+----------------------- - Podunk | (3,4),(1,2) | 100,127,1000,0 - Gotham | (1100,334),(1000,34) | 123456,127,-1000,6789 -(2 rows) - -SELECT * - INTO TABLE ramp - FROM road - WHERE name ~ '.*Ramp'; -INSERT INTO ihighway - SELECT * - FROM road - WHERE name ~ 'I- .*'; -INSERT INTO shighway - SELECT * - FROM road - WHERE name ~ 'State Hwy.*'; -UPDATE shighway - SET surface = 'asphalt'; +-- a is the type root +-- b and c inherit from a (one-level single inheritance) +-- d inherits from b and c (two-level multiple inheritance) +-- e inherits from c (two-level single inheritance) +-- f inherits from e (three-level single inheritance) +-- +CREATE TABLE a_star ( + class char, + a int4 +); +CREATE TABLE b_star ( + b text +) INHERITS (a_star); +CREATE TABLE c_star ( + c name +) INHERITS (a_star); +CREATE TABLE d_star ( + d float8 +) INHERITS (b_star, c_star); +NOTICE: merging multiple inherited definitions of column "class" +NOTICE: merging multiple inherited definitions of column "a" +CREATE TABLE e_star ( + e int2 +) INHERITS (c_star); +CREATE TABLE f_star ( + f polygon +) INHERITS (e_star); INSERT INTO a_star (class, a) VALUES ('a', 1); INSERT INTO a_star (class, a) VALUES ('a', 2); INSERT INTO a_star (class) VALUES ('a'); @@ -138,14 +119,369 @@ ANALYZE d_star; ANALYZE e_star; ANALYZE f_star; -- --- for internal portal (cursor) tests +-- inheritance stress test -- -CREATE TABLE iportaltest ( - i int4, - d float4, - p polygon -); -INSERT INTO iportaltest (i, d, p) - VALUES (1, 3.567, '(3.0,1.0),(4.0,2.0)'::polygon); -INSERT INTO iportaltest (i, d, p) - VALUES (2, 89.05, '(4.0,2.0),(3.0,1.0)'::polygon); +SELECT * FROM a_star*; + class | a +-------+---- + a | 1 + a | 2 + a | + b | 3 + b | 4 + b | + b | + c | 5 + c | 6 + c | + c | + d | 7 + d | 8 + d | 9 + d | 10 + d | + d | 11 + d | 12 + d | 13 + d | + d | + d | + d | 14 + d | + d | + d | + d | + e | 15 + e | 16 + e | 17 + e | + e | 18 + e | + e | + f | 19 + f | 20 + f | 21 + f | 22 + f | + f | 24 + f | 25 + f | 26 + f | + f | + f | + f | 27 + f | + f | + f | + f | +(50 rows) + +SELECT * + FROM b_star* x + WHERE x.b = text 'bumble' or x.a < 3; + class | a | b +-------+---+-------- + b | | bumble +(1 row) + +SELECT class, a + FROM c_star* x + WHERE x.c ~ text 'hi'; + class | a +-------+---- + c | 5 + c | + d | 7 + d | 8 + d | 10 + d | + d | 12 + d | + d | + d | + e | 15 + e | 16 + e | + e | + f | 19 + f | 20 + f | 21 + f | + f | 24 + f | + f | + f | +(22 rows) + +SELECT class, b, c + FROM d_star* x + WHERE x.a < 100; + class | b | c +-------+---------+------------ + d | grumble | hi sunita + d | stumble | hi koko + d | rumble | + d | | hi kristin + d | fumble | + d | | hi avi + d | | + d | | +(8 rows) + +SELECT class, c FROM e_star* x WHERE x.c NOTNULL; + class | c +-------+------------- + e | hi carol + e | hi bob + e | hi michelle + e | hi elisa + f | hi claire + f | hi mike + f | hi marcel + f | hi keith + f | hi marc + f | hi allison + f | hi jeff + f | hi carl +(12 rows) + +SELECT * FROM f_star* x WHERE x.c ISNULL; + class | a | c | e | f +-------+----+---+-----+------------------------------------------- + f | 22 | | -7 | ((111,555),(222,666),(333,777),(444,888)) + f | 25 | | -9 | + f | 26 | | | ((11111,33333),(22222,44444)) + f | | | -11 | ((1111111,3333333),(2222222,4444444)) + f | 27 | | | + f | | | -12 | + f | | | | ((11111111,33333333),(22222222,44444444)) + f | | | | +(8 rows) + +-- grouping and aggregation on inherited sets have been busted in the past... +SELECT sum(a) FROM a_star*; + sum +----- + 355 +(1 row) + +SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; + class | sum +-------+----- + a | 3 + b | 7 + c | 11 + d | 84 + e | 66 + f | 184 +(6 rows) + +ALTER TABLE f_star RENAME COLUMN f TO ff; +ALTER TABLE e_star* RENAME COLUMN e TO ee; +ALTER TABLE d_star* RENAME COLUMN d TO dd; +ALTER TABLE c_star* RENAME COLUMN c TO cc; +ALTER TABLE b_star* RENAME COLUMN b TO bb; +ALTER TABLE a_star* RENAME COLUMN a TO aa; +SELECT class, aa + FROM a_star* x + WHERE aa ISNULL; + class | aa +-------+---- + a | + b | + b | + c | + c | + d | + d | + d | + d | + d | + d | + d | + d | + e | + e | + e | + f | + f | + f | + f | + f | + f | + f | + f | +(24 rows) + +-- As of Postgres 7.1, ALTER implicitly recurses, +-- so this should be same as ALTER a_star* +ALTER TABLE a_star RENAME COLUMN aa TO foo; +SELECT class, foo + FROM a_star* x + WHERE x.foo >= 2; + class | foo +-------+----- + a | 2 + b | 3 + b | 4 + c | 5 + c | 6 + d | 7 + d | 8 + d | 9 + d | 10 + d | 11 + d | 12 + d | 13 + d | 14 + e | 15 + e | 16 + e | 17 + e | 18 + f | 19 + f | 20 + f | 21 + f | 22 + f | 24 + f | 25 + f | 26 + f | 27 +(25 rows) + +ALTER TABLE a_star RENAME COLUMN foo TO aa; +SELECT * + from a_star* + WHERE aa < 1000; + class | aa +-------+---- + a | 1 + a | 2 + b | 3 + b | 4 + c | 5 + c | 6 + d | 7 + d | 8 + d | 9 + d | 10 + d | 11 + d | 12 + d | 13 + d | 14 + e | 15 + e | 16 + e | 17 + e | 18 + f | 19 + f | 20 + f | 21 + f | 22 + f | 24 + f | 25 + f | 26 + f | 27 +(26 rows) + +ALTER TABLE f_star ADD COLUMN f int4; +UPDATE f_star SET f = 10; +ALTER TABLE e_star* ADD COLUMN e int4; +--UPDATE e_star* SET e = 42; +SELECT * FROM e_star*; + class | aa | cc | ee | e +-------+----+-------------+-----+--- + e | 15 | hi carol | -1 | + e | 16 | hi bob | | + e | 17 | | -2 | + e | | hi michelle | -3 | + e | 18 | | | + e | | hi elisa | | + e | | | -4 | + f | 19 | hi claire | -5 | + f | 20 | hi mike | -6 | + f | 21 | hi marcel | | + f | 22 | | -7 | + f | | hi keith | -8 | + f | 24 | hi marc | | + f | 25 | | -9 | + f | 26 | | | + f | | hi allison | -10 | + f | | hi jeff | | + f | | | -11 | + f | 27 | | | + f | | hi carl | | + f | | | -12 | + f | | | | + f | | | | +(23 rows) + +ALTER TABLE a_star* ADD COLUMN a text; +NOTICE: merging definition of column "a" for child "d_star" +-- That ALTER TABLE should have added TOAST tables. +SELECT relname, reltoastrelid <> 0 AS has_toast_table + FROM pg_class + WHERE oid::regclass IN ('a_star', 'c_star') + ORDER BY 1; + relname | has_toast_table +---------+----------------- + a_star | t + c_star | t +(2 rows) + +--UPDATE b_star* +-- SET a = text 'gazpacho' +-- WHERE aa > 4; +SELECT class, aa, a FROM a_star*; + class | aa | a +-------+----+--- + a | 1 | + a | 2 | + a | | + b | 3 | + b | 4 | + b | | + b | | + c | 5 | + c | 6 | + c | | + c | | + d | 7 | + d | 8 | + d | 9 | + d | 10 | + d | | + d | 11 | + d | 12 | + d | 13 | + d | | + d | | + d | | + d | 14 | + d | | + d | | + d | | + d | | + e | 15 | + e | 16 | + e | 17 | + e | | + e | 18 | + e | | + e | | + f | 19 | + f | 20 | + f | 21 | + f | 22 | + f | | + f | 24 | + f | 25 | + f | 26 | + f | | + f | | + f | | + f | 27 | + f | | + f | | + f | | + f | | +(50 rows) + diff --git a/third_party/spanner_pg/src/test/regress/expected/create_operator.out b/third_party/spanner_pg/src/test/regress/expected/create_operator.out index 53032775..f71b601f 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_operator.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_operator.out @@ -7,13 +7,6 @@ CREATE OPERATOR ## ( function = path_inter, commutator = ## ); -CREATE OPERATOR <% ( - leftarg = point, - rightarg = widget, - procedure = pt_in_widget, - commutator = >% , - negator = >=% -); CREATE OPERATOR @#@ ( rightarg = int8, -- prefix procedure = factorial @@ -25,11 +18,10 @@ CREATE OPERATOR #%# ( ERROR: operator right argument type must be specified DETAIL: Postfix operators are not supported. -- Test operator created above -SELECT point '(1,2)' <% widget '(0,0,3)' AS t, - point '(1,2)' <% widget '(0,0,1)' AS f; - t | f ----+--- - t | f +SELECT @#@ 24; + ?column? +-------------------------- + 620448401733239439360000 (1 row) -- Test comments diff --git a/third_party/spanner_pg/src/test/regress/expected/create_role.out b/third_party/spanner_pg/src/test/regress/expected/create_role.out new file mode 100644 index 00000000..4e67d727 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/expected/create_role.out @@ -0,0 +1,145 @@ +-- ok, superuser can create users with any set of privileges +CREATE ROLE regress_role_super SUPERUSER; +CREATE ROLE regress_role_admin CREATEDB CREATEROLE REPLICATION BYPASSRLS; +-- fail, only superusers can create users with these privileges +SET SESSION AUTHORIZATION regress_role_admin; +CREATE ROLE regress_nosuch_superuser SUPERUSER; +ERROR: must be superuser to create superusers +CREATE ROLE regress_nosuch_replication_bypassrls REPLICATION BYPASSRLS; +ERROR: must be superuser to create replication users +CREATE ROLE regress_nosuch_replication REPLICATION; +ERROR: must be superuser to create replication users +CREATE ROLE regress_nosuch_bypassrls BYPASSRLS; +ERROR: must be superuser to create bypassrls users +-- ok, having CREATEROLE is enough to create users with these privileges +CREATE ROLE regress_createdb CREATEDB; +CREATE ROLE regress_createrole CREATEROLE; +CREATE ROLE regress_login LOGIN; +CREATE ROLE regress_inherit INHERIT; +CREATE ROLE regress_connection_limit CONNECTION LIMIT 5; +CREATE ROLE regress_encrypted_password ENCRYPTED PASSWORD 'foo'; +CREATE ROLE regress_password_null PASSWORD NULL; +-- ok, backwards compatible noise words should be ignored +CREATE ROLE regress_noiseword SYSID 12345; +NOTICE: SYSID can no longer be specified +-- fail, cannot grant membership in superuser role +CREATE ROLE regress_nosuch_super IN ROLE regress_role_super; +ERROR: must be superuser to alter superusers +-- fail, database owner cannot have members +CREATE ROLE regress_nosuch_dbowner IN ROLE pg_database_owner; +ERROR: role "pg_database_owner" cannot have explicit members +-- ok, can grant other users into a role +CREATE ROLE regress_inroles ROLE + regress_role_super, regress_createdb, regress_createrole, regress_login, + regress_inherit, regress_connection_limit, regress_encrypted_password, regress_password_null; +-- fail, cannot grant a role into itself +CREATE ROLE regress_nosuch_recursive ROLE regress_nosuch_recursive; +ERROR: role "regress_nosuch_recursive" is a member of role "regress_nosuch_recursive" +-- ok, can grant other users into a role with admin option +CREATE ROLE regress_adminroles ADMIN + regress_role_super, regress_createdb, regress_createrole, regress_login, + regress_inherit, regress_connection_limit, regress_encrypted_password, regress_password_null; +-- fail, cannot grant a role into itself with admin option +CREATE ROLE regress_nosuch_admin_recursive ADMIN regress_nosuch_admin_recursive; +ERROR: role "regress_nosuch_admin_recursive" is a member of role "regress_nosuch_admin_recursive" +-- fail, regress_createrole does not have CREATEDB privilege +SET SESSION AUTHORIZATION regress_createrole; +CREATE DATABASE regress_nosuch_db; +ERROR: permission denied to create database +-- ok, regress_createrole can create new roles +CREATE ROLE regress_plainrole; +-- ok, roles with CREATEROLE can create new roles with it +CREATE ROLE regress_rolecreator CREATEROLE; +-- ok, roles with CREATEROLE can create new roles with privilege they lack +CREATE ROLE regress_tenant CREATEDB CREATEROLE LOGIN INHERIT CONNECTION LIMIT 5; +-- ok, regress_tenant can create objects within the database +SET SESSION AUTHORIZATION regress_tenant; +CREATE TABLE tenant_table (i integer); +CREATE INDEX tenant_idx ON tenant_table(i); +CREATE VIEW tenant_view AS SELECT * FROM pg_catalog.pg_class; +REVOKE ALL PRIVILEGES ON tenant_table FROM PUBLIC; +-- fail, these objects belonging to regress_tenant +SET SESSION AUTHORIZATION regress_createrole; +DROP INDEX tenant_idx; +ERROR: must be owner of index tenant_idx +ALTER TABLE tenant_table ADD COLUMN t text; +ERROR: must be owner of table tenant_table +DROP TABLE tenant_table; +ERROR: must be owner of table tenant_table +ALTER VIEW tenant_view OWNER TO regress_role_admin; +ERROR: must be owner of view tenant_view +DROP VIEW tenant_view; +ERROR: must be owner of view tenant_view +-- fail, cannot take ownership of these objects from regress_tenant +REASSIGN OWNED BY regress_tenant TO regress_createrole; +ERROR: permission denied to reassign objects +-- ok, having CREATEROLE is enough to create roles in privileged roles +CREATE ROLE regress_read_all_data IN ROLE pg_read_all_data; +CREATE ROLE regress_write_all_data IN ROLE pg_write_all_data; +CREATE ROLE regress_monitor IN ROLE pg_monitor; +CREATE ROLE regress_read_all_settings IN ROLE pg_read_all_settings; +CREATE ROLE regress_read_all_stats IN ROLE pg_read_all_stats; +CREATE ROLE regress_stat_scan_tables IN ROLE pg_stat_scan_tables; +CREATE ROLE regress_read_server_files IN ROLE pg_read_server_files; +CREATE ROLE regress_write_server_files IN ROLE pg_write_server_files; +CREATE ROLE regress_execute_server_program IN ROLE pg_execute_server_program; +CREATE ROLE regress_signal_backend IN ROLE pg_signal_backend; +-- fail, creation of these roles failed above so they do not now exist +SET SESSION AUTHORIZATION regress_role_admin; +DROP ROLE regress_nosuch_superuser; +ERROR: role "regress_nosuch_superuser" does not exist +DROP ROLE regress_nosuch_replication_bypassrls; +ERROR: role "regress_nosuch_replication_bypassrls" does not exist +DROP ROLE regress_nosuch_replication; +ERROR: role "regress_nosuch_replication" does not exist +DROP ROLE regress_nosuch_bypassrls; +ERROR: role "regress_nosuch_bypassrls" does not exist +DROP ROLE regress_nosuch_super; +ERROR: role "regress_nosuch_super" does not exist +DROP ROLE regress_nosuch_dbowner; +ERROR: role "regress_nosuch_dbowner" does not exist +DROP ROLE regress_nosuch_recursive; +ERROR: role "regress_nosuch_recursive" does not exist +DROP ROLE regress_nosuch_admin_recursive; +ERROR: role "regress_nosuch_admin_recursive" does not exist +DROP ROLE regress_plainrole; +-- ok, should be able to drop non-superuser roles we created +DROP ROLE regress_createdb; +DROP ROLE regress_createrole; +DROP ROLE regress_login; +DROP ROLE regress_inherit; +DROP ROLE regress_connection_limit; +DROP ROLE regress_encrypted_password; +DROP ROLE regress_password_null; +DROP ROLE regress_noiseword; +DROP ROLE regress_inroles; +DROP ROLE regress_adminroles; +DROP ROLE regress_rolecreator; +DROP ROLE regress_read_all_data; +DROP ROLE regress_write_all_data; +DROP ROLE regress_monitor; +DROP ROLE regress_read_all_settings; +DROP ROLE regress_read_all_stats; +DROP ROLE regress_stat_scan_tables; +DROP ROLE regress_read_server_files; +DROP ROLE regress_write_server_files; +DROP ROLE regress_execute_server_program; +DROP ROLE regress_signal_backend; +-- fail, role still owns database objects +DROP ROLE regress_tenant; +ERROR: role "regress_tenant" cannot be dropped because some objects depend on it +DETAIL: owner of table tenant_table +owner of view tenant_view +-- fail, cannot drop ourself nor superusers +DROP ROLE regress_role_super; +ERROR: must be superuser to drop superusers +DROP ROLE regress_role_admin; +ERROR: current user cannot be dropped +-- ok +RESET SESSION AUTHORIZATION; +DROP INDEX tenant_idx; +DROP TABLE tenant_table; +DROP VIEW tenant_view; +DROP ROLE regress_tenant; +DROP ROLE regress_role_admin; +DROP ROLE regress_role_super; diff --git a/third_party/spanner_pg/src/test/regress/expected/create_table.out b/third_party/spanner_pg/src/test/regress/expected/create_table.out index a958b849..4407a017 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_table.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_table.out @@ -1,204 +1,7 @@ -- -- CREATE_TABLE -- --- --- CLASS DEFINITIONS --- -CREATE TABLE hobbies_r ( - name text, - person text -); -CREATE TABLE equipment_r ( - name text, - hobby text -); -CREATE TABLE onek ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); -CREATE TABLE tenk1 ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); -CREATE TABLE tenk2 ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); -CREATE TABLE person ( - name text, - age int4, - location point -); -CREATE TABLE emp ( - salary int4, - manager name -) INHERITS (person); -CREATE TABLE student ( - gpa float8 -) INHERITS (person); -CREATE TABLE stud_emp ( - percent int4 -) INHERITS (emp, student); -NOTICE: merging multiple inherited definitions of column "name" -NOTICE: merging multiple inherited definitions of column "age" -NOTICE: merging multiple inherited definitions of column "location" -CREATE TABLE city ( - name name, - location box, - budget city_budget -); -CREATE TABLE dept ( - dname name, - mgrname text -); -CREATE TABLE slow_emp4000 ( - home_base box -); -CREATE TABLE fast_emp4000 ( - home_base box -); -CREATE TABLE road ( - name text, - thepath path -); -CREATE TABLE ihighway () INHERITS (road); -CREATE TABLE shighway ( - surface text -) INHERITS (road); -CREATE TABLE real_city ( - pop int4, - cname text, - outline path -); --- --- test the "star" operators a bit more thoroughly -- this time, --- throw in lots of NULL fields... --- --- a is the type root --- b and c inherit from a (one-level single inheritance) --- d inherits from b and c (two-level multiple inheritance) --- e inherits from c (two-level single inheritance) --- f inherits from e (three-level single inheritance) --- -CREATE TABLE a_star ( - class char, - a int4 -); -CREATE TABLE b_star ( - b text -) INHERITS (a_star); -CREATE TABLE c_star ( - c name -) INHERITS (a_star); -CREATE TABLE d_star ( - d float8 -) INHERITS (b_star, c_star); -NOTICE: merging multiple inherited definitions of column "class" -NOTICE: merging multiple inherited definitions of column "a" -CREATE TABLE e_star ( - e int2 -) INHERITS (c_star); -CREATE TABLE f_star ( - f polygon -) INHERITS (e_star); -CREATE TABLE aggtest ( - a int2, - b float4 -); -CREATE TABLE hash_i4_heap ( - seqno int4, - random int4 -); -CREATE TABLE hash_name_heap ( - seqno int4, - random name -); -CREATE TABLE hash_txt_heap ( - seqno int4, - random text -); -CREATE TABLE hash_f8_heap ( - seqno int4, - random float8 -); --- don't include the hash_ovfl_heap stuff in the distribution --- the data set is too large for what it's worth --- --- CREATE TABLE hash_ovfl_heap ( --- x int4, --- y int4 --- ); -CREATE TABLE bt_i4_heap ( - seqno int4, - random int4 -); -CREATE TABLE bt_name_heap ( - seqno name, - random int4 -); -CREATE TABLE bt_txt_heap ( - seqno text, - random int4 -); -CREATE TABLE bt_f8_heap ( - seqno float8, - random int4 -); -CREATE TABLE array_op_test ( - seqno int4, - i int4[], - t text[] -); -CREATE TABLE array_index_op_test ( - seqno int4, - i int4[], - t text[] -); -CREATE TABLE testjsonb ( - j jsonb -); +-- Error cases CREATE TABLE unknowntab ( u unknown -- fail ); @@ -207,14 +10,6 @@ CREATE TYPE unknown_comptype AS ( u unknown -- fail ); ERROR: column "u" has pseudo-type unknown -CREATE TABLE IF NOT EXISTS test_tsvector( - t text, - a tsvector -); -CREATE TABLE IF NOT EXISTS test_tsvector( - t text -); -NOTICE: relation "test_tsvector" already exists, skipping -- invalid: non-lowercase quoted reloptions identifiers CREATE TABLE tas_case WITH ("Fillfactor" = 10) AS SELECT 1 a; ERROR: unrecognized parameter "Fillfactor" @@ -1016,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/third_party/spanner_pg/src/test/regress/expected/create_table_like.out b/third_party/spanner_pg/src/test/regress/expected/create_table_like.out index e3087716..0ed94f1d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_table_like.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_table_like.out @@ -504,9 +504,10 @@ DROP TABLE noinh_con_copy, noinh_con_copy1; CREATE TABLE ctlt4 (a int, b text); CREATE SEQUENCE ctlseq1; CREATE TABLE ctlt10 (LIKE ctlseq1); -- fail -ERROR: "ctlseq1" is not a table, view, materialized view, composite type, or foreign table +ERROR: relation "ctlseq1" is invalid in LIKE clause LINE 1: CREATE TABLE ctlt10 (LIKE ctlseq1); ^ +DETAIL: This operation is not supported for sequences. CREATE VIEW ctlv1 AS SELECT * FROM ctlt4; CREATE TABLE ctlt11 (LIKE ctlv1); CREATE TABLE ctlt11a (LIKE ctlv1 INCLUDING ALL); diff --git a/third_party/spanner_pg/src/test/regress/expected/create_type.out b/third_party/spanner_pg/src/test/regress/expected/create_type.out index 14394cc9..0dfc88c1 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_type.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_type.out @@ -1,11 +1,36 @@ -- -- CREATE_TYPE -- +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix -- --- Note: widget_in/out were created in create_function_1, without any --- prior shell-type creation. These commands therefore complete a test --- of the "old style" approach of making the functions first. +-- Test the "old style" approach of making the I/O functions first, +-- with no explicit shell type creation. -- +CREATE FUNCTION widget_in(cstring) + RETURNS widget + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: type "widget" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION widget_out(widget) + RETURNS cstring + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: argument type widget is only a shell +CREATE FUNCTION int44in(cstring) + RETURNS city_budget + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: type "city_budget" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION int44out(city_budget) + RETURNS cstring + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; +NOTICE: argument type city_budget is only a shell CREATE TYPE widget ( internallength = 24, input = widget_in, @@ -224,6 +249,41 @@ select format_type('bpchar'::regtype, -1); bpchar (1 row) +-- Test creation of an operator over a user-defined type +CREATE FUNCTION pt_in_widget(point, widget) + RETURNS bool + AS :'regresslib' + LANGUAGE C STRICT; +CREATE OPERATOR <% ( + leftarg = point, + rightarg = widget, + procedure = pt_in_widget, + commutator = >% , + negator = >=% +); +SELECT point '(1,2)' <% widget '(0,0,3)' AS t, + point '(1,2)' <% widget '(0,0,1)' AS f; + t | f +---+--- + t | f +(1 row) + +-- exercise city_budget type +CREATE TABLE city ( + name name, + location box, + budget city_budget +); +INSERT INTO city VALUES +('Podunk', '(1,2),(3,4)', '100,127,1000'), +('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); +TABLE city; + name | location | budget +--------+----------------------+----------------------- + Podunk | (3,4),(1,2) | 100,127,1000,0 + Gotham | (1100,334),(1000,34) | 123456,127,-1000,6789 +(2 rows) + -- -- Test CREATE/ALTER TYPE using a type that's compatible with varchar, -- so we can re-use those support functions diff --git a/third_party/spanner_pg/src/test/regress/expected/create_view.out b/third_party/spanner_pg/src/test/regress/expected/create_view.out index 8c9952b6..63c3c2aa 100644 --- a/third_party/spanner_pg/src/test/regress/expected/create_view.out +++ b/third_party/spanner_pg/src/test/regress/expected/create_view.out @@ -3,15 +3,36 @@ -- Virtual class definitions -- (this also tests the query rewrite system) -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION interpt_pp(path, path) + RETURNS point + AS :'regresslib' + LANGUAGE C STRICT; +CREATE TABLE real_city ( + pop int4, + cname text, + outline path +); +\set filename :abs_srcdir '/data/real_city.data' +COPY real_city FROM :'filename'; +ANALYZE real_city; +SELECT * + INTO TABLE ramp + FROM ONLY road + WHERE name ~ '.*Ramp'; CREATE VIEW street AS SELECT r.name, r.thepath, c.cname AS cname FROM ONLY road r, real_city c - WHERE c.outline ## r.thepath; + WHERE c.outline ?# r.thepath; CREATE VIEW iexit AS SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r - WHERE ih.thepath ## r.thepath; + WHERE ih.thepath ?# r.thepath; CREATE VIEW toyemp AS SELECT name, age, location, 12*salary AS annualsal FROM emp; @@ -33,27 +54,27 @@ CREATE VIEW key_dependent_view_no_cols AS -- -- CREATE OR REPLACE VIEW -- -CREATE TABLE viewtest_tbl (a int, b int); +CREATE TABLE viewtest_tbl (a int, b int, c numeric(10,1), d text COLLATE "C"); COPY viewtest_tbl FROM stdin; CREATE OR REPLACE VIEW viewtest AS SELECT * FROM viewtest_tbl; CREATE OR REPLACE VIEW viewtest AS SELECT * FROM viewtest_tbl WHERE a > 10; SELECT * FROM viewtest; - a | b -----+---- - 15 | 20 - 20 | 25 + a | b | c | d +----+----+-----+------- + 15 | 20 | 3.3 | xyzz + 20 | 25 | 4.4 | xyzzy (2 rows) CREATE OR REPLACE VIEW viewtest AS - SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; + SELECT a, b, c, d FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; SELECT * FROM viewtest; - a | b -----+---- - 20 | 25 - 15 | 20 - 10 | 15 + a | b | c | d +----+----+-----+------- + 20 | 25 | 4.4 | xyzzy + 15 | 20 | 3.3 | xyzz + 10 | 15 | 2.2 | xyz (3 rows) -- should fail @@ -67,11 +88,19 @@ ERROR: cannot change name of view column "a" to "?column?" HINT: Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead. -- should fail CREATE OR REPLACE VIEW viewtest AS - SELECT a, b::numeric FROM viewtest_tbl; + SELECT a, b::numeric, c, d FROM viewtest_tbl; ERROR: cannot change data type of view column "b" from integer to numeric +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, c::numeric(10,2), d FROM viewtest_tbl; +ERROR: cannot change data type of view column "c" from numeric(10,1) to numeric(10,2) +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, c, d COLLATE "POSIX" FROM viewtest_tbl; +ERROR: cannot change collation of view column "d" from "C" to "POSIX" -- should work CREATE OR REPLACE VIEW viewtest AS - SELECT a, b, 0 AS c FROM viewtest_tbl; + SELECT a, b, c, d, 0 AS e FROM viewtest_tbl; DROP VIEW viewtest; DROP TABLE viewtest_tbl; -- tests for temporary views @@ -267,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; @@ -287,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. @@ -1543,8 +1597,29 @@ select * from tt14v; foo | baz | 42 (1 row) +alter table tt14t drop column f3; -- fail, view has explicit reference to f3 +ERROR: cannot drop column f3 of table tt14t because other objects depend on it +DETAIL: view tt14v depends on column f3 of table tt14t +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- We used to have a bug that would allow the above to succeed, posing +-- hazards for later execution of the view. Check that the internal +-- defenses for those hazards haven't bit-rotted, in case some other +-- bug with similar symptoms emerges. begin; --- this perhaps should be rejected, but it isn't: +-- destroy the dependency entry that prevents the DROP: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'tt14v'::regclass and rulename = '_RETURN') + and refobjsubid = 3 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + obj | ref | deptype +----------------------------+--------------------------+--------- + rule _RETURN on view tt14v | column f3 of table tt14t | n +(1 row) + +-- this will now succeed: alter table tt14t drop column f3; -- column f3 is still in the view, sort of ... select pg_get_viewdef('tt14v', true); @@ -1575,8 +1650,26 @@ select f1, f4 from tt14v; select * from tt14v; ERROR: attribute 3 of type record has been dropped rollback; +-- likewise, altering a referenced column's type is prohibited ... +alter table tt14t alter column f4 type integer using f4::integer; -- fail +ERROR: cannot alter type of a column used by a view or rule +DETAIL: rule _RETURN on view tt14v depends on column "f4" +-- ... but some bug might let it happen, so check defenses begin; --- this perhaps should be rejected, but it isn't: +-- destroy the dependency entry that prevents the ALTER: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'tt14v'::regclass and rulename = '_RETURN') + and refobjsubid = 4 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + obj | ref | deptype +----------------------------+--------------------------+--------- + rule _RETURN on view tt14v | column f4 of table tt14t | n +(1 row) + +-- this will now succeed: alter table tt14t alter column f4 type integer using f4::integer; -- f4 is still in the view ... select pg_get_viewdef('tt14v', true); @@ -1599,6 +1692,45 @@ select * from tt14v; ERROR: attribute 4 of type record has wrong type DETAIL: Table has type integer, but query expects text. rollback; +drop view tt14v; +create view tt14v as select t.f1, t.f4 from tt14f() t; +select pg_get_viewdef('tt14v', true); + pg_get_viewdef +-------------------------------- + SELECT t.f1, + + t.f4 + + FROM tt14f() t(f1, f3, f4); +(1 row) + +select * from tt14v; + f1 | f4 +-----+---- + foo | 42 +(1 row) + +alter table tt14t drop column f3; -- ok +select pg_get_viewdef('tt14v', true); + pg_get_viewdef +---------------------------- + SELECT t.f1, + + t.f4 + + FROM tt14f() t(f1, f4); +(1 row) + +explain (verbose, costs off) select * from tt14v; + QUERY PLAN +---------------------------------------- + Function Scan on testviewschm2.tt14f t + Output: t.f1, t.f4 + Function Call: tt14f() +(3 rows) + +select * from tt14v; + f1 | f4 +-----+---- + foo | 42 +(1 row) + -- check display of whole-row variables in some corner cases create type nestedcomposite as (x int8_tbl); create view tt15v as select row(i)::nestedcomposite from int8_tbl i; @@ -2044,7 +2176,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 75 other objects +NOTICE: drop cascades to 78 other objects DETAIL: drop cascades to table t1 drop cascades to view temporal1 drop cascades to view temporal2 @@ -2065,6 +2197,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/third_party/spanner_pg/src/test/regress/expected/date.out b/third_party/spanner_pg/src/test/regress/expected/date.out index c8b0566f..75ff6593 100644 --- a/third_party/spanner_pg/src/test/regress/expected/date.out +++ b/third_party/spanner_pg/src/test/regress/expected/date.out @@ -1129,15 +1129,15 @@ SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 -- all possible fields -- SELECT EXTRACT(MICROSECONDS FROM DATE '2020-08-11'); -ERROR: date units "microseconds" not supported +ERROR: unit "microseconds" not supported for type date SELECT EXTRACT(MILLISECONDS FROM DATE '2020-08-11'); -ERROR: date units "milliseconds" not supported +ERROR: unit "milliseconds" not supported for type date SELECT EXTRACT(SECOND FROM DATE '2020-08-11'); -ERROR: date units "second" not supported +ERROR: unit "second" not supported for type date SELECT EXTRACT(MINUTE FROM DATE '2020-08-11'); -ERROR: date units "minute" not supported +ERROR: unit "minute" not supported for type date SELECT EXTRACT(HOUR FROM DATE '2020-08-11'); -ERROR: date units "hour" not supported +ERROR: unit "hour" not supported for type date SELECT EXTRACT(DAY FROM DATE '2020-08-11'); extract --------- @@ -1235,11 +1235,11 @@ SELECT EXTRACT(DOY FROM DATE '2020-08-11'); (1 row) SELECT EXTRACT(TIMEZONE FROM DATE '2020-08-11'); -ERROR: date units "timezone" not supported +ERROR: unit "timezone" not supported for type date SELECT EXTRACT(TIMEZONE_M FROM DATE '2020-08-11'); -ERROR: date units "timezone_m" not supported +ERROR: unit "timezone_m" not supported for type date SELECT EXTRACT(TIMEZONE_H FROM DATE '2020-08-11'); -ERROR: date units "timezone_h" not supported +ERROR: unit "timezone_h" not supported for type date SELECT EXTRACT(EPOCH FROM DATE '2020-08-11'); extract ------------ @@ -1462,7 +1462,7 @@ SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity -- wrong fields from non-finite date: -- SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- error -ERROR: date units "microsec" not recognized +ERROR: unit "microsec" not recognized for type date -- test constructors select make_date(2013, 7, 15); make_date diff --git a/third_party/spanner_pg/src/test/regress/expected/dbsize.out b/third_party/spanner_pg/src/test/regress/expected/dbsize.out index 29804aee..d8d6686b 100644 --- a/third_party/spanner_pg/src/test/regress/expected/dbsize.out +++ b/third_party/spanner_pg/src/test/regress/expected/dbsize.out @@ -53,7 +53,7 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM 10994579406847 | 10239 GB | -10239 GB 10994579406848 | 10 TB | -10 TB 11258449312612351 | 10239 TB | -10239 TB - 11258449312612352 | 10240 TB | -10240 TB + 11258449312612352 | 10 PB | -10 PB (10 rows) SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM @@ -61,71 +61,77 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM (10485247::numeric), (10485248::numeric), (10736893951::numeric), (10736893952::numeric), (10994579406847::numeric), (10994579406848::numeric), - (11258449312612351::numeric), (11258449312612352::numeric)) x(size); - size | pg_size_pretty | pg_size_pretty --------------------+----------------+---------------- - 10239 | 10239 bytes | -10239 bytes - 10240 | 10 kB | -10 kB - 10485247 | 10239 kB | -10239 kB - 10485248 | 10 MB | -10 MB - 10736893951 | 10239 MB | -10239 MB - 10736893952 | 10 GB | -10 GB - 10994579406847 | 10239 GB | -10239 GB - 10994579406848 | 10 TB | -10 TB - 11258449312612351 | 10239 TB | -10239 TB - 11258449312612352 | 10240 TB | -10240 TB -(10 rows) + (11258449312612351::numeric), (11258449312612352::numeric), + (11528652096115048447::numeric), (11528652096115048448::numeric)) x(size); + size | pg_size_pretty | pg_size_pretty +----------------------+----------------+---------------- + 10239 | 10239 bytes | -10239 bytes + 10240 | 10 kB | -10 kB + 10485247 | 10239 kB | -10239 kB + 10485248 | 10 MB | -10 MB + 10736893951 | 10239 MB | -10239 MB + 10736893952 | 10 GB | -10 GB + 10994579406847 | 10239 GB | -10239 GB + 10994579406848 | 10 TB | -10 TB + 11258449312612351 | 10239 TB | -10239 TB + 11258449312612352 | 10 PB | -10 PB + 11528652096115048447 | 10239 PB | -10239 PB + 11528652096115048448 | 10240 PB | -10240 PB +(12 rows) -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), - ('1TB'), ('3000 TB'), ('1e6 MB')) x(size); - size | pg_size_bytes -----------+------------------ - 1 | 1 - 123bytes | 123 - 1kB | 1024 - 1MB | 1048576 - 1 GB | 1073741824 - 1.5 GB | 1610612736 - 1TB | 1099511627776 - 3000 TB | 3298534883328000 - 1e6 MB | 1048576000000 -(9 rows) + ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size); + size | pg_size_bytes +----------+-------------------- + 1 | 1 + 123bytes | 123 + 1kB | 1024 + 1MB | 1048576 + 1 GB | 1073741824 + 1.5 GB | 1610612736 + 1TB | 1099511627776 + 3000 TB | 3298534883328000 + 1e6 MB | 1048576000000 + 99 PB | 111464090777419776 +(10 rows) -- case-insensitive units are supported SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), - ('1tb'), ('3000 tb'), ('1e6 mb')) x(size); - size | pg_size_bytes -----------+------------------ - 1 | 1 - 123bYteS | 123 - 1kb | 1024 - 1mb | 1048576 - 1 Gb | 1073741824 - 1.5 gB | 1610612736 - 1tb | 1099511627776 - 3000 tb | 3298534883328000 - 1e6 mb | 1048576000000 -(9 rows) + ('1tb'), ('3000 tb'), ('1e6 mb'), ('99 pb')) x(size); + size | pg_size_bytes +----------+-------------------- + 1 | 1 + 123bYteS | 123 + 1kb | 1024 + 1mb | 1048576 + 1 Gb | 1073741824 + 1.5 gB | 1610612736 + 1tb | 1099511627776 + 3000 tb | 3298534883328000 + 1e6 mb | 1048576000000 + 99 pb | 111464090777419776 +(10 rows) -- negative numbers are supported SELECT size, pg_size_bytes(size) FROM (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), - ('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); - size | pg_size_bytes ------------+------------------- - -1 | -1 - -123bytes | -123 - -1kb | -1024 - -1mb | -1048576 - -1 Gb | -1073741824 - -1.5 gB | -1610612736 - -1tb | -1099511627776 - -3000 TB | -3298534883328000 - -10e-1 MB | -1048576 -(9 rows) + ('-1tb'), ('-3000 TB'), ('-10e-1 MB'), ('-99 PB')) x(size); + size | pg_size_bytes +-----------+--------------------- + -1 | -1 + -123bytes | -123 + -1kb | -1024 + -1mb | -1048576 + -1 Gb | -1073741824 + -1.5 gB | -1610612736 + -1tb | -1099511627776 + -3000 TB | -3298534883328000 + -10e-1 MB | -1048576 + -99 PB | -111464090777419776 +(10 rows) -- different cases with allowed points SELECT size, pg_size_bytes(size) FROM @@ -147,15 +153,15 @@ SELECT size, pg_size_bytes(size) FROM SELECT pg_size_bytes('1 AB'); ERROR: invalid size: "1 AB" DETAIL: Invalid size unit: "AB". -HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('1 AB A'); ERROR: invalid size: "1 AB A" DETAIL: Invalid size unit: "AB A". -HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('1 AB A '); ERROR: invalid size: "1 AB A " DETAIL: Invalid size unit: "AB A". -HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('9223372036854775807.9'); ERROR: bigint out of range SELECT pg_size_bytes('1e100'); @@ -165,7 +171,7 @@ ERROR: value overflows numeric format SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported ERROR: invalid size: "1 byte" DETAIL: Invalid size unit: "byte". -HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes(''); ERROR: invalid size: "" SELECT pg_size_bytes('kb'); @@ -183,6 +189,6 @@ ERROR: invalid size: ".+912" SELECT pg_size_bytes('+912+ kB'); ERROR: invalid size: "+912+ kB" DETAIL: Invalid size unit: "+ kB". -HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". +HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('++123 kB'); ERROR: invalid size: "++123 kB" diff --git a/third_party/spanner_pg/src/test/regress/expected/domain.out b/third_party/spanner_pg/src/test/regress/expected/domain.out index a9a21ff5..46a26353 100644 --- a/third_party/spanner_pg/src/test/regress/expected/domain.out +++ b/third_party/spanner_pg/src/test/regress/expected/domain.out @@ -879,7 +879,7 @@ begin end$$ language plpgsql; select doubledecrement(3); -- fail because of implicit null assignment ERROR: domain pos_int does not allow null values -CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 2 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 0; begin @@ -887,7 +887,7 @@ begin end$$ language plpgsql; select doubledecrement(3); -- fail at initialization assignment ERROR: value for domain pos_int violates check constraint "pos_int_check" -CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 3 during statement block local variable initialization +CONTEXT: PL/pgSQL function doubledecrement(pos_int) line 2 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 1; begin diff --git a/third_party/spanner_pg/src/test/regress/expected/errors.out b/third_party/spanner_pg/src/test/regress/expected/errors.out index 15862d44..8c527474 100644 --- a/third_party/spanner_pg/src/test/regress/expected/errors.out +++ b/third_party/spanner_pg/src/test/regress/expected/errors.out @@ -92,8 +92,8 @@ ERROR: relation "nonesuch" does not exist alter table nonesuch rename to stud_emp; ERROR: relation "nonesuch" does not exist -- conflict -alter table stud_emp rename to aggtest; -ERROR: relation "aggtest" already exists +alter table stud_emp rename to student; +ERROR: relation "student" already exists -- self-conflict alter table stud_emp rename to stud_emp; ERROR: relation "stud_emp" already exists diff --git a/third_party/spanner_pg/src/test/regress/expected/event_trigger.out b/third_party/spanner_pg/src/test/regress/expected/event_trigger.out index c95c30b3..5a10958d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/event_trigger.out +++ b/third_party/spanner_pg/src/test/regress/expected/event_trigger.out @@ -516,6 +516,11 @@ alter table rewriteme add column another int default -1, alter column foo type numeric(10,4); NOTICE: Table 'rewriteme' is being rewritten (reason = 4) +-- matview rewrite when changing access method +CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT 1 AS a; +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; +NOTICE: Table 'heapmv' is being rewritten (reason = 8) +DROP MATERIALIZED VIEW heapmv; -- shouldn't trigger a table_rewrite event alter table rewriteme alter column foo type numeric(12,4); begin; diff --git a/third_party/spanner_pg/src/test/regress/expected/explain.out b/third_party/spanner_pg/src/test/regress/expected/explain.out index cda28098..48620edb 100644 --- a/third_party/spanner_pg/src/test/regress/expected/explain.out +++ b/third_party/spanner_pg/src/test/regress/expected/explain.out @@ -47,6 +47,12 @@ begin return data::jsonb; end; $$; +-- 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 @@ -79,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 -------------------------------------------------------- @@ -270,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. @@ -477,6 +495,19 @@ select jsonb_pretty( (1 row) rollback; +-- Test display of temporary objects +create temp table t1(f1 float8); +create function pg_temp.mysin(float8) returns float8 language plpgsql +as 'begin return sin($1); end'; +select explain_filter('explain (verbose) select * from t1 where pg_temp.mysin(f1) < 0.5'); + explain_filter +------------------------------------------------------------ + Seq Scan on pg_temp.t1 (cost=N.N..N.N rows=N width=N) + Output: f1 + Filter: (pg_temp.mysin(t1.f1) < 'N.N'::double precision) +(3 rows) + +-- Test compute_query_id set compute_query_id = on; select explain_filter('explain (verbose) select * from int8_tbl i8'); explain_filter diff --git a/third_party/spanner_pg/src/test/regress/expected/expressions.out b/third_party/spanner_pg/src/test/regress/expected/expressions.out index 6b0ac8e1..889489ab 100644 --- a/third_party/spanner_pg/src/test/regress/expected/expressions.out +++ b/third_party/spanner_pg/src/test/regress/expected/expressions.out @@ -2,7 +2,7 @@ -- expression evaluation tests that don't fit into a more specific file -- -- --- Tests for SQLVAlueFunction +-- Tests for SQLValueFunction -- -- current_date (always matches because of transactional behaviour) SELECT date(now())::text = current_date::text; @@ -87,77 +87,6 @@ SELECT current_schema; (1 row) RESET search_path; --- --- Tests for BETWEEN --- -explain (costs off) -select count(*) from date_tbl - where f1 between '1997-01-01' and '1998-01-01'; - QUERY PLAN ------------------------------------------------------------------------------ - Aggregate - -> Seq Scan on date_tbl - Filter: ((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) -(3 rows) - -select count(*) from date_tbl - where f1 between '1997-01-01' and '1998-01-01'; - count -------- - 3 -(1 row) - -explain (costs off) -select count(*) from date_tbl - where f1 not between '1997-01-01' and '1998-01-01'; - QUERY PLAN --------------------------------------------------------------------------- - Aggregate - -> Seq Scan on date_tbl - Filter: ((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) -(3 rows) - -select count(*) from date_tbl - where f1 not between '1997-01-01' and '1998-01-01'; - count -------- - 13 -(1 row) - -explain (costs off) -select count(*) from date_tbl - where f1 between symmetric '1997-01-01' and '1998-01-01'; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------- - Aggregate - -> Seq Scan on date_tbl - Filter: (((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) OR ((f1 >= '01-01-1998'::date) AND (f1 <= '01-01-1997'::date))) -(3 rows) - -select count(*) from date_tbl - where f1 between symmetric '1997-01-01' and '1998-01-01'; - count -------- - 3 -(1 row) - -explain (costs off) -select count(*) from date_tbl - where f1 not between symmetric '1997-01-01' and '1998-01-01'; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------ - Aggregate - -> Seq Scan on date_tbl - Filter: (((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) AND ((f1 < '01-01-1998'::date) OR (f1 > '01-01-1997'::date))) -(3 rows) - -select count(*) from date_tbl - where f1 not between symmetric '1997-01-01' and '1998-01-01'; - count -------- - 13 -(1 row) - -- -- Test parsing of a no-op cast to a type with unspecified typmod -- @@ -319,6 +248,55 @@ select return_text_input('a') in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ' t (1 row) +-- NOT IN +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); + ?column? +---------- + f +(1 row) + +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 0); + ?column? +---------- + t +(1 row) + +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 2, null); + ?column? +---------- + +(1 row) + +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1, null); + ?column? +---------- + f +(1 row) + +select return_int_input(1) not in (null, null, null, null, null, null, null, null, null, null, null); + ?column? +---------- + +(1 row) + +select return_int_input(null::int) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); + ?column? +---------- + +(1 row) + +select return_int_input(null::int) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); + ?column? +---------- + +(1 row) + +select return_text_input('a') not in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); + ?column? +---------- + f +(1 row) + rollback; -- Test with non-strict equality function. -- We need to create our own type for this. @@ -345,6 +323,11 @@ begin end if; end; $$ language plpgsql immutable; +create function myintne(myint, myint) returns bool as $$ +begin + return not myinteq($1, $2); +end; +$$ language plpgsql immutable; create operator = ( leftarg = myint, rightarg = myint, @@ -355,6 +338,16 @@ create operator = ( join = eqjoinsel, merges ); +create operator <> ( + leftarg = myint, + rightarg = myint, + commutator = <>, + negator = =, + procedure = myintne, + restrict = eqsel, + join = eqjoinsel, + merges +); create operator class myint_ops default for type myint using hash as operator 1 = (myint, myint), @@ -369,6 +362,16 @@ select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6 (2 rows) +select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); + a +--- +(0 rows) + +select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); + a +--- +(0 rows) + -- ensure the result matched with the non-hashed version. We simply remove -- some array elements so that we don't reach the hashing threshold. select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint, null); @@ -378,4 +381,14 @@ select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint, (2 rows) +select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint, null); + a +--- +(0 rows) + +select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint, null); + a +--- +(0 rows) + rollback; diff --git a/third_party/spanner_pg/src/test/regress/expected/fast_default.out b/third_party/spanner_pg/src/test/regress/expected/fast_default.out index 91f25717..59365dad 100644 --- a/third_party/spanner_pg/src/test/regress/expected/fast_default.out +++ b/third_party/spanner_pg/src/test/regress/expected/fast_default.out @@ -272,7 +272,25 @@ SELECT comp(); Rewritten (1 row) +-- check that we notice insertion of a volatile default argument +CREATE FUNCTION foolme(timestamptz DEFAULT clock_timestamp()) + RETURNS timestamptz + IMMUTABLE AS 'select $1' LANGUAGE sql; +ALTER TABLE T ADD COLUMN c3 timestamptz DEFAULT foolme(); +NOTICE: rewriting table t for reason 2 +SELECT attname, atthasmissing, attmissingval FROM pg_attribute + WHERE attrelid = 't'::regclass AND attnum > 0 + ORDER BY attnum; + attname | atthasmissing | attmissingval +---------+---------------+--------------- + pk | f | + c1 | f | + c2 | f | + c3 | f | +(4 rows) + DROP TABLE T; +DROP FUNCTION foolme(timestamptz); -- Simple querie CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); SELECT set('t'); diff --git a/third_party/spanner_pg/src/test/regress/expected/float8.out b/third_party/spanner_pg/src/test/regress/expected/float8.out index fc4212b3..de4d57ec 100644 --- a/third_party/spanner_pg/src/test/regress/expected/float8.out +++ b/third_party/spanner_pg/src/test/regress/expected/float8.out @@ -1,7 +1,11 @@ -- -- FLOAT8 -- -CREATE TABLE FLOAT8_TBL(f1 float8); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- +CREATE TEMP TABLE FLOAT8_TBL(f1 float8); INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 '); INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 '); INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84'); @@ -779,14 +783,8 @@ INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); ERROR: "-10e-400" is out of range for type double precision LINE 1: INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); ^ --- maintain external table consistency across platforms --- delete all values and reinsert well-behaved ones -DELETE FROM FLOAT8_TBL; -INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0'); -INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84'); -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30'); -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200'); -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200'); +DROP TABLE FLOAT8_TBL; +-- Check the float8 values exported for use by other tests SELECT * FROM FLOAT8_TBL; f1 ----------------------- diff --git a/third_party/spanner_pg/src/test/regress/expected/foreign_data.out b/third_party/spanner_pg/src/test/regress/expected/foreign_data.out index 90ba1ff5..33505352 100644 --- a/third_party/spanner_pg/src/test/regress/expected/foreign_data.out +++ b/third_party/spanner_pg/src/test/regress/expected/foreign_data.out @@ -1,6 +1,14 @@ -- -- Test foreign-data wrapper and server management. -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_fdw_handler() + RETURNS fdw_handler + AS :'regresslib', 'test_fdw_handler' + LANGUAGE C; -- Clean up in case a prior regression run failed -- Suppress NOTICE messages when roles don't exist SET client_min_messages TO 'warning'; @@ -95,9 +103,14 @@ CREATE FOREIGN DATA WRAPPER test_fdw HANDLER invalid_fdw_handler; -- ERROR ERROR: function invalid_fdw_handler must return type fdw_handler CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler; -- ERROR ERROR: conflicting or redundant options +LINE 1: ...GN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER in... + ^ CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler; DROP FOREIGN DATA WRAPPER test_fdw; -- ALTER FOREIGN DATA WRAPPER +ALTER FOREIGN DATA WRAPPER foo OPTIONS (nonexistent 'fdw'); -- ERROR +ERROR: invalid option "nonexistent" +HINT: There are no valid options in this context. ALTER FOREIGN DATA WRAPPER foo; -- ERROR ERROR: syntax error at or near ";" LINE 1: ALTER FOREIGN DATA WRAPPER foo; @@ -201,6 +214,8 @@ ALTER FOREIGN DATA WRAPPER foo HANDLER invalid_fdw_handler; -- ERROR ERROR: function invalid_fdw_handler must return type fdw_handler ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler HANDLER anything; -- ERROR ERROR: conflicting or redundant options +LINE 1: ...FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler HANDLER an... + ^ ALTER FOREIGN DATA WRAPPER foo HANDLER test_fdw_handler; WARNING: changing the foreign-data wrapper handler can change behavior of existing foreign tables DROP FUNCTION invalid_fdw_handler(); @@ -740,7 +755,8 @@ FDW options: (delimiter ',', quote '"', "be quoted" 'value') (1 row) CREATE INDEX id_ft1_c2 ON ft1 (c2); -- ERROR -ERROR: cannot create index on foreign table "ft1" +ERROR: cannot create index on relation "ft1" +DETAIL: This operation is not supported for foreign tables. SELECT * FROM ft1; -- ERROR ERROR: foreign-data wrapper "dummy" has no handler EXPLAIN SELECT * FROM ft1; -- ERROR @@ -864,7 +880,8 @@ LINE 1: ALTER FOREIGN TABLE ft1 ADD PRIMARY KEY (c7); ^ ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c9_check CHECK (c9 < 0) NOT VALID; ALTER FOREIGN TABLE ft1 ALTER CONSTRAINT ft1_c9_check DEFERRABLE; -- ERROR -ERROR: "ft1" is not a table +ERROR: ALTER action ALTER CONSTRAINT cannot be performed on relation "ft1" +DETAIL: This operation is not supported for foreign tables. ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c9_check; ALTER FOREIGN TABLE ft1 DROP CONSTRAINT no_const; -- ERROR ERROR: constraint "no_const" of relation "ft1" does not exist @@ -880,8 +897,6 @@ ALTER FOREIGN TABLE ft1 DROP COLUMN c9; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR ERROR: relation "ft1" does not exist -ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR -ERROR: "ft1" is not a table, materialized view, index, or partitioned index ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 @@ -1807,11 +1822,6 @@ Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 --- TRUNCATE doesn't work on foreign tables, either directly or recursively -TRUNCATE ft2; -- ERROR -ERROR: foreign-data wrapper "dummy" has no handler -TRUNCATE fd_pt1; -- ERROR -ERROR: foreign-data wrapper "dummy" has no handler DROP TABLE fd_pt1 CASCADE; NOTICE: drop cascades to foreign table ft2 -- IMPORT FOREIGN SCHEMA @@ -2032,11 +2042,6 @@ ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR ERROR: child table is missing constraint "fd_pt2chk1" ALTER FOREIGN TABLE fd_pt2_1 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); --- TRUNCATE doesn't work on foreign tables, either directly or recursively -TRUNCATE fd_pt2_1; -- ERROR -ERROR: foreign-data wrapper "dummy" has no handler -TRUNCATE fd_pt2; -- ERROR -ERROR: foreign-data wrapper "dummy" has no handler DROP FOREIGN TABLE fd_pt2_1; DROP TABLE fd_pt2; -- foreign table cannot be part of partition tree made of temporary diff --git a/third_party/spanner_pg/src/test/regress/expected/foreign_key.out b/third_party/spanner_pg/src/test/regress/expected/foreign_key.out index ee733949..a97d67e4 100644 --- a/third_party/spanner_pg/src/test/regress/expected/foreign_key.out +++ b/third_party/spanner_pg/src/test/regress/expected/foreign_key.out @@ -755,6 +755,44 @@ SELECT * from FKTABLE; | | | 1 (7 rows) +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; +-- Test for ON DELETE SET NULL/DEFAULT (column_list); +CREATE TABLE PKTABLE (tid int, id int, PRIMARY KEY (tid, id)); +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, id) REFERENCES PKTABLE ON DELETE SET NULL (bar)); +ERROR: column "bar" referenced in foreign key constraint does not exist +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, id) REFERENCES PKTABLE ON DELETE SET NULL (foo)); +ERROR: column "foo" referenced in ON DELETE SET action must be part of foreign key +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, foo) REFERENCES PKTABLE ON UPDATE SET NULL (foo)); +ERROR: a column list with SET NULL is only supported for ON DELETE actions +LINE 1: ...oo int, FOREIGN KEY (tid, foo) REFERENCES PKTABLE ON UPDATE ... + ^ +CREATE TABLE FKTABLE ( + tid int, id int, + fk_id_del_set_null int, + fk_id_del_set_default int DEFAULT 0, + FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null), + FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default) +); +SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE conrelid = 'fktable'::regclass::oid ORDER BY oid; + pg_get_constraintdef +-------------------------------------------------------------------------------------------------------------------- + FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES pktable(tid, id) ON DELETE SET NULL (fk_id_del_set_null) + FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES pktable(tid, id) ON DELETE SET DEFAULT (fk_id_del_set_default) +(2 rows) + +INSERT INTO PKTABLE VALUES (1, 0), (1, 1), (1, 2); +INSERT INTO FKTABLE VALUES + (1, 1, 1, NULL), + (1, 2, NULL, 2); +DELETE FROM PKTABLE WHERE id = 1 OR id = 2; +SELECT * FROM FKTABLE ORDER BY id; + tid | id | fk_id_del_set_null | fk_id_del_set_default +-----+----+--------------------+----------------------- + 1 | 1 | | + 1 | 2 | | 0 +(2 rows) + DROP TABLE FKTABLE; DROP TABLE PKTABLE; -- Test some invalid FK definitions @@ -1735,6 +1773,39 @@ SELECT * FROM fk_partitioned_fk WHERE b = 142857; 2501 | 142857 (1 row) +-- ON DELETE SET NULL column_list +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET NULL (a); +BEGIN; +DELETE FROM fk_notpartitioned_pk WHERE b = 142857; +SELECT * FROM fk_partitioned_fk WHERE a IS NOT NULL OR b IS NOT NULL ORDER BY a NULLS LAST; + a | b +------+-------- + 2502 | + | 142857 +(2 rows) + +ROLLBACK; +-- ON DELETE SET DEFAULT column_list +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET DEFAULT (a); +BEGIN; +DELETE FROM fk_partitioned_fk; +DELETE FROM fk_notpartitioned_pk; +INSERT INTO fk_notpartitioned_pk VALUES (500, 100000), (2501, 100000); +INSERT INTO fk_partitioned_fk VALUES (500, 100000); +DELETE FROM fk_notpartitioned_pk WHERE a = 500; +SELECT * FROM fk_partitioned_fk ORDER BY a; + a | b +------+-------- + 2501 | 100000 +(1 row) + +ROLLBACK; -- ON UPDATE/DELETE CASCADE ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) @@ -2567,7 +2638,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 @@ -2636,15 +2707,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 table "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/third_party/spanner_pg/src/test/regress/expected/generated.out b/third_party/spanner_pg/src/test/regress/expected/generated.out index 5b9663f8..10208484 100644 --- a/third_party/spanner_pg/src/test/regress/expected/generated.out +++ b/third_party/spanner_pg/src/test/regress/expected/generated.out @@ -61,6 +61,9 @@ LINE 1: ..._3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) STO... -- generation expression must be immutable CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); ERROR: generation expression is not immutable +-- ... but be sure that the immutability test is accurate +CREATE TABLE gtest2 (a int, b text GENERATED ALWAYS AS (a || ' sec') STORED); +DROP TABLE gtest2; -- cannot have default/identity and generated CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); ERROR: both default and generation expression specified for column "b" of table "gtest_err_5a" @@ -192,6 +195,26 @@ SELECT * FROM gtest1 ORDER BY a; 3 | 6 (1 row) +-- test MERGE +CREATE TABLE gtestm ( + id int PRIMARY KEY, + f1 int, + f2 int, + f3 int GENERATED ALWAYS AS (f1 * 2) STORED, + f4 int GENERATED ALWAYS AS (f2 * 2) STORED +); +INSERT INTO gtestm VALUES (1, 5, 100); +MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id + WHEN MATCHED THEN UPDATE SET f1 = v.f1 + WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200); +SELECT * FROM gtestm ORDER BY id; + id | f1 | f2 | f3 | f4 +----+----+-----+----+----- + 1 | 10 | 100 | 20 | 200 + 2 | 20 | 200 | 40 | 400 +(2 rows) + +DROP TABLE gtestm; -- views CREATE VIEW gtest1v AS SELECT * FROM gtest1; SELECT * FROM gtest1v; @@ -496,7 +519,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 @@ -538,6 +566,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; @@ -961,7 +993,7 @@ CREATE TRIGGER gtest2a BEFORE INSERT OR UPDATE ON gtest26 WHEN (NEW.b < 0) -- error EXECUTE PROCEDURE gtest_trigger_func(); ERROR: BEFORE trigger's WHEN condition cannot reference NEW generated columns -LINE 3: WHEN (NEW.b < 0) +LINE 3: WHEN (NEW.b < 0) -- error ^ DETAIL: Column "b" is a generated column. CREATE TRIGGER gtest2b BEFORE INSERT OR UPDATE ON gtest26 @@ -969,7 +1001,7 @@ CREATE TRIGGER gtest2b BEFORE INSERT OR UPDATE ON gtest26 WHEN (NEW.* IS NOT NULL) -- error EXECUTE PROCEDURE gtest_trigger_func(); ERROR: BEFORE trigger's WHEN condition cannot reference NEW generated columns -LINE 3: WHEN (NEW.* IS NOT NULL) +LINE 3: WHEN (NEW.* IS NOT NULL) -- error ^ DETAIL: A whole-row reference is used and the table contains generated columns. CREATE TRIGGER gtest2 BEFORE INSERT ON gtest26 diff --git a/third_party/spanner_pg/src/test/regress/expected/geometry.out b/third_party/spanner_pg/src/test/regress/expected/geometry.out index 4bb16791..b50103b2 100644 --- a/third_party/spanner_pg/src/test/regress/expected/geometry.out +++ b/third_party/spanner_pg/src/test/regress/expected/geometry.out @@ -1467,11 +1467,6 @@ SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2; {-1,0,3} | {-1,0,3} | 0 (100 rows) --- Distance to box -SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b; -ERROR: function "dist_lb" not implemented -SELECT l.s, b.f1, b.f1 <-> l.s FROM LINE_TBL l, BOX_TBL b; -ERROR: function "dist_bl" not implemented -- Intersect with line SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s; s | s @@ -1773,9 +1768,6 @@ SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1; {-1,0,3} | [(NaN,1),(NaN,90)] | (80 rows) --- Closest point to box -SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b; -ERROR: function "close_lb" not implemented -- -- Line segments -- @@ -2376,9 +2368,6 @@ SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2; [(NaN,1),(NaN,90)] | [(NaN,1),(NaN,90)] | (64 rows) --- Closest point to line -SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1; -ERROR: function "close_sl" not implemented -- Closest point to line segment SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2; s | s | ?column? @@ -2922,9 +2911,6 @@ SELECT f1, @-@ f1 FROM PATH_TBL; ((11,12),(13,14)) | 5.65685424949 (9 rows) --- Center -SELECT f1, @@ f1 FROM PATH_TBL; -ERROR: function "path_center" not implemented -- To polygon SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1); f1 | f1 @@ -4189,7 +4175,59 @@ SELECT p1.f1, p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2 WHERE p1.f1 |&> p2.f1; -- Distance to polygon SELECT p1.f1, p2.f1, p1.f1 <-> p2.f1 FROM POLYGON_TBL p1, POLYGON_TBL p2; -ERROR: function "poly_distance" not implemented + f1 | f1 | ?column? +----------------------------+----------------------------+---------------- + ((2,0),(2,4),(0,0)) | ((2,0),(2,4),(0,0)) | 0 + ((2,0),(2,4),(0,0)) | ((3,1),(3,3),(1,0)) | 0 + ((2,0),(2,4),(0,0)) | ((1,2),(3,4),(5,6),(7,8)) | 0 + ((2,0),(2,4),(0,0)) | ((7,8),(5,6),(3,4),(1,2)) | 0 + ((2,0),(2,4),(0,0)) | ((1,2),(7,8),(5,6),(3,-4)) | 0 + ((2,0),(2,4),(0,0)) | ((0,0)) | 0 + ((2,0),(2,4),(0,0)) | ((0,1),(0,1)) | 0.4472135955 + ((3,1),(3,3),(1,0)) | ((2,0),(2,4),(0,0)) | 0 + ((3,1),(3,3),(1,0)) | ((3,1),(3,3),(1,0)) | 0 + ((3,1),(3,3),(1,0)) | ((1,2),(3,4),(5,6),(7,8)) | 0.707106781187 + ((3,1),(3,3),(1,0)) | ((7,8),(5,6),(3,4),(1,2)) | 0.707106781187 + ((3,1),(3,3),(1,0)) | ((1,2),(7,8),(5,6),(3,-4)) | 0 + ((3,1),(3,3),(1,0)) | ((0,0)) | 1 + ((3,1),(3,3),(1,0)) | ((0,1),(0,1)) | 1.38675049056 + ((1,2),(3,4),(5,6),(7,8)) | ((2,0),(2,4),(0,0)) | 0 + ((1,2),(3,4),(5,6),(7,8)) | ((3,1),(3,3),(1,0)) | 0.707106781187 + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(3,4),(5,6),(7,8)) | 0 + ((1,2),(3,4),(5,6),(7,8)) | ((7,8),(5,6),(3,4),(1,2)) | 0 + ((1,2),(3,4),(5,6),(7,8)) | ((1,2),(7,8),(5,6),(3,-4)) | 0 + ((1,2),(3,4),(5,6),(7,8)) | ((0,0)) | 2.2360679775 + ((1,2),(3,4),(5,6),(7,8)) | ((0,1),(0,1)) | 1.41421356237 + ((7,8),(5,6),(3,4),(1,2)) | ((2,0),(2,4),(0,0)) | 0 + ((7,8),(5,6),(3,4),(1,2)) | ((3,1),(3,3),(1,0)) | 0.707106781187 + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(3,4),(5,6),(7,8)) | 0 + ((7,8),(5,6),(3,4),(1,2)) | ((7,8),(5,6),(3,4),(1,2)) | 0 + ((7,8),(5,6),(3,4),(1,2)) | ((1,2),(7,8),(5,6),(3,-4)) | 0 + ((7,8),(5,6),(3,4),(1,2)) | ((0,0)) | 2.2360679775 + ((7,8),(5,6),(3,4),(1,2)) | ((0,1),(0,1)) | 1.41421356237 + ((1,2),(7,8),(5,6),(3,-4)) | ((2,0),(2,4),(0,0)) | 0 + ((1,2),(7,8),(5,6),(3,-4)) | ((3,1),(3,3),(1,0)) | 0 + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(3,4),(5,6),(7,8)) | 0 + ((1,2),(7,8),(5,6),(3,-4)) | ((7,8),(5,6),(3,4),(1,2)) | 0 + ((1,2),(7,8),(5,6),(3,-4)) | ((1,2),(7,8),(5,6),(3,-4)) | 0 + ((1,2),(7,8),(5,6),(3,-4)) | ((0,0)) | 1.58113883008 + ((1,2),(7,8),(5,6),(3,-4)) | ((0,1),(0,1)) | 1.26491106407 + ((0,0)) | ((2,0),(2,4),(0,0)) | 0 + ((0,0)) | ((3,1),(3,3),(1,0)) | 1 + ((0,0)) | ((1,2),(3,4),(5,6),(7,8)) | 2.2360679775 + ((0,0)) | ((7,8),(5,6),(3,4),(1,2)) | 2.2360679775 + ((0,0)) | ((1,2),(7,8),(5,6),(3,-4)) | 1.58113883008 + ((0,0)) | ((0,0)) | 0 + ((0,0)) | ((0,1),(0,1)) | 1 + ((0,1),(0,1)) | ((2,0),(2,4),(0,0)) | 0.4472135955 + ((0,1),(0,1)) | ((3,1),(3,3),(1,0)) | 1.38675049056 + ((0,1),(0,1)) | ((1,2),(3,4),(5,6),(7,8)) | 1.41421356237 + ((0,1),(0,1)) | ((7,8),(5,6),(3,4),(1,2)) | 1.41421356237 + ((0,1),(0,1)) | ((1,2),(7,8),(5,6),(3,-4)) | 1.26491106407 + ((0,1),(0,1)) | ((0,0)) | 1 + ((0,1),(0,1)) | ((0,1),(0,1)) | 0 +(49 rows) + -- -- Circles -- @@ -5197,3 +5235,63 @@ SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p; <(3,5),NaN> | ((0,1),(0,1)) | NaN (56 rows) +-- Check index behavior for circles +CREATE INDEX gcircleind ON circle_tbl USING gist (f1); +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + f1 +--------------- + <(1,2),3> + <(1,3),5> + <(1,2),100> + <(100,1),115> +(4 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + QUERY PLAN +---------------------------------------------- + Sort + Sort Key: (area(f1)) + -> Seq Scan on circle_tbl + Filter: (f1 && '<(1,-2),1>'::circle) +(4 rows) + +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + f1 +--------------- + <(1,2),3> + <(1,3),5> + <(1,2),100> + <(100,1),115> +(4 rows) + +-- Check index behavior for polygons +CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + f1 +--------------------- + ((2,0),(2,4),(0,0)) +(1 row) + +EXPLAIN (COSTS OFF) +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: ((poly_center(f1))[0]) + -> Seq Scan on polygon_tbl + Filter: (f1 @> '((1,1),(2,2),(2,1))'::polygon) +(4 rows) + +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + f1 +--------------------- + ((2,0),(2,4),(0,0)) +(1 row) + diff --git a/third_party/spanner_pg/src/test/regress/expected/gin.out b/third_party/spanner_pg/src/test/regress/expected/gin.out index 6402e89c..0af46430 100644 --- a/third_party/spanner_pg/src/test/regress/expected/gin.out +++ b/third_party/spanner_pg/src/test/regress/expected/gin.out @@ -288,3 +288,12 @@ select count(*) from t_gin_test_tbl where j @> '{}'::int[]; reset enable_seqscan; reset enable_bitmapscan; drop table t_gin_test_tbl; +-- test an unlogged table, mostly to get coverage of ginbuildempty +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 + (null, null), + ('{}', null), + ('{1}', '{2,3}'); +drop table t_gin_test_tbl; diff --git a/third_party/spanner_pg/src/test/regress/expected/gist.out b/third_party/spanner_pg/src/test/regress/expected/gist.out index 2393132e..ae6c4adc 100644 --- a/third_party/spanner_pg/src/test/regress/expected/gist.out +++ b/third_party/spanner_pg/src/test/regress/expected/gist.out @@ -392,3 +392,9 @@ reset enable_seqscan; reset enable_bitmapscan; reset enable_indexonlyscan; drop table gist_tbl; +-- test an unlogged table, mostly to get coverage of gistbuildempty +create unlogged table gist_tbl (b box); +create index gist_tbl_box_index on gist_tbl using gist (b); +insert into gist_tbl + select box(point(0.05*i, 0.05*i)) from generate_series(0,10) as i; +drop table gist_tbl; diff --git a/third_party/spanner_pg/src/test/regress/expected/groupingsets.out b/third_party/spanner_pg/src/test/regress/expected/groupingsets.out index 2be94ed3..fcad5c40 100644 --- a/third_party/spanner_pg/src/test/regress/expected/groupingsets.out +++ b/third_party/spanner_pg/src/test/regress/expected/groupingsets.out @@ -1638,6 +1638,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, @@ -1983,6 +1984,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/third_party/spanner_pg/src/test/regress/expected/guc.out b/third_party/spanner_pg/src/test/regress/expected/guc.out index 59da91ff..b1ea0418 100644 --- a/third_party/spanner_pg/src/test/regress/expected/guc.out +++ b/third_party/spanner_pg/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 -- @@ -813,3 +824,58 @@ set default_with_oids to f; -- Should not allow to set it to true. set default_with_oids to t; ERROR: tables declared WITH OIDS are not supported +-- Test GUC categories and flag patterns +SELECT pg_settings_get_flags(NULL); + pg_settings_get_flags +----------------------- + +(1 row) + +SELECT pg_settings_get_flags('does_not_exist'); + pg_settings_get_flags +----------------------- + +(1 row) + +CREATE TABLE tab_settings_flags AS SELECT name, category, + 'EXPLAIN' = ANY(flags) AS explain, + 'NO_RESET_ALL' = ANY(flags) AS no_reset_all, + 'NOT_IN_SAMPLE' = ANY(flags) AS not_in_sample, + 'RUNTIME_COMPUTED' = ANY(flags) AS runtime_computed + FROM pg_show_all_settings() AS psas, + pg_settings_get_flags(psas.name) AS flags; +-- Developer GUCs should be flagged with GUC_NOT_IN_SAMPLE: +SELECT name FROM tab_settings_flags + WHERE category = 'Developer Options' AND NOT not_in_sample + ORDER BY 1; + name +------ +(0 rows) + +-- Most query-tuning GUCs are flagged as valid for EXPLAIN. +-- default_statistics_target is an exception. +SELECT name FROM tab_settings_flags + WHERE category ~ '^Query Tuning' AND NOT explain + ORDER BY 1; + name +--------------------------- + default_statistics_target +(1 row) + +-- Runtime-computed GUCs should be part of the preset category. +SELECT name FROM tab_settings_flags + WHERE NOT category = 'Preset Options' AND runtime_computed + ORDER BY 1; + name +------ +(0 rows) + +-- Preset GUCs are flagged as NOT_IN_SAMPLE. +SELECT name FROM tab_settings_flags + WHERE category = 'Preset Options' AND NOT not_in_sample + ORDER BY 1; + name +------ +(0 rows) + +DROP TABLE tab_settings_flags; diff --git a/third_party/spanner_pg/src/test/regress/expected/hash_index.out b/third_party/spanner_pg/src/test/regress/expected/hash_index.out index e23de21b..a2036a15 100644 --- a/third_party/spanner_pg/src/test/regress/expected/hash_index.out +++ b/third_party/spanner_pg/src/test/regress/expected/hash_index.out @@ -1,5 +1,54 @@ -- -- HASH_INDEX +-- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +CREATE TABLE hash_i4_heap ( + seqno int4, + random int4 +); +CREATE TABLE hash_name_heap ( + seqno int4, + random name +); +CREATE TABLE hash_txt_heap ( + seqno int4, + random text +); +CREATE TABLE hash_f8_heap ( + seqno int4, + random float8 +); +\set filename :abs_srcdir '/data/hash.data' +COPY hash_i4_heap FROM :'filename'; +COPY hash_name_heap FROM :'filename'; +COPY hash_txt_heap FROM :'filename'; +COPY hash_f8_heap FROM :'filename'; +-- the data in this file has a lot of duplicates in the index key +-- fields, leading to long bucket chains and lots of table expansion. +-- this is therefore a stress test of the bucket overflow code (unlike +-- the data in hash.data, which has unique index keys). +-- +-- \set filename :abs_srcdir '/data/hashovfl.data' +-- COPY hash_ovfl_heap FROM :'filename'; +ANALYZE hash_i4_heap; +ANALYZE hash_name_heap; +ANALYZE hash_txt_heap; +ANALYZE hash_f8_heap; +CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); +CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); +CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); +CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=60); +-- +-- Also try building functional, expressional, and partial indexes on +-- tables that already contain data. +-- +create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); +create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); +create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; +-- +-- hash index -- grep 843938989 hash.data -- SELECT * FROM hash_i4_heap diff --git a/third_party/spanner_pg/src/test/regress/expected/horology.out b/third_party/spanner_pg/src/test/regress/expected/horology.out index 4b865e73..2dc9b00d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/horology.out +++ b/third_party/spanner_pg/src/test/regress/expected/horology.out @@ -373,6 +373,8 @@ SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' Sun Dec 31 00:00:00 294276 (1 row) +SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +ERROR: timestamp out of range SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; 106751991 Days ------------------ @@ -633,6 +635,8 @@ SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS Fri Dec 31 23:59:59 1999 PST (1 row) +SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +ERROR: timestamp out of range SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; True ------ @@ -2147,6 +2151,77 @@ SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::timestamp as t; (1 row) RESET TimeZone; +-- +-- Tests for BETWEEN +-- +explain (costs off) +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + QUERY PLAN +----------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: ((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) +(3 rows) + +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + count +------- + 3 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + QUERY PLAN +-------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: ((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) +(3 rows) + +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + count +------- + 13 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: (((f1 >= '01-01-1997'::date) AND (f1 <= '01-01-1998'::date)) OR ((f1 >= '01-01-1998'::date) AND (f1 <= '01-01-1997'::date))) +(3 rows) + +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + count +------- + 3 +(1 row) + +explain (costs off) +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------- + Aggregate + -> Seq Scan on date_tbl + Filter: (((f1 < '01-01-1997'::date) OR (f1 > '01-01-1998'::date)) AND ((f1 < '01-01-1998'::date) OR (f1 > '01-01-1997'::date))) +(3 rows) + +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + count +------- + 13 +(1 row) + -- -- Formats -- diff --git a/third_party/spanner_pg/src/test/regress/expected/hs_standby_allowed.out b/third_party/spanner_pg/src/test/regress/expected/hs_standby_allowed.out deleted file mode 100644 index 00b8faf9..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/hs_standby_allowed.out +++ /dev/null @@ -1,218 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_allowed.sql --- --- SELECT -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -select count(*) as should_be_2 from hs2; - should_be_2 -------------- - 2 -(1 row) - -select count(*) as should_be_3 from hs3; - should_be_3 -------------- - 3 -(1 row) - -COPY hs1 TO '/tmp/copy_test'; -\! cat /tmp/copy_test -1 --- Access sequence directly -select is_called from hsseq; - is_called ------------ - f -(1 row) - --- Transactions -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -end; -begin transaction read only; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -end; -begin transaction isolation level repeatable read; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -commit; -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -commit; -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -abort; -start transaction; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -commit; -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -rollback; -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -savepoint s; -select count(*) as should_be_2 from hs2; - should_be_2 -------------- - 2 -(1 row) - -commit; -begin; -select count(*) as should_be_1 from hs1; - should_be_1 -------------- - 1 -(1 row) - -savepoint s; -select count(*) as should_be_2 from hs2; - should_be_2 -------------- - 2 -(1 row) - -release savepoint s; -select count(*) as should_be_2 from hs2; - should_be_2 -------------- - 2 -(1 row) - -savepoint s; -select count(*) as should_be_3 from hs3; - should_be_3 -------------- - 3 -(1 row) - -rollback to savepoint s; -select count(*) as should_be_2 from hs2; - should_be_2 -------------- - 2 -(1 row) - -commit; --- SET parameters --- has no effect on read only transactions, but we can still set it -set synchronous_commit = on; -show synchronous_commit; - synchronous_commit --------------------- - on -(1 row) - -reset synchronous_commit; -discard temp; -discard all; --- CURSOR commands -BEGIN; -DECLARE hsc CURSOR FOR select * from hs3; -FETCH next from hsc; - col1 ------- - 113 -(1 row) - -fetch first from hsc; - col1 ------- - 113 -(1 row) - -fetch last from hsc; - col1 ------- - 115 -(1 row) - -fetch 1 from hsc; - col1 ------- -(0 rows) - -CLOSE hsc; -COMMIT; --- Prepared plans -PREPARE hsp AS select count(*) from hs1; -PREPARE hsp_noexec (integer) AS insert into hs1 values ($1); -EXECUTE hsp; - count -------- - 1 -(1 row) - -DEALLOCATE hsp; --- LOCK -BEGIN; -LOCK hs1 IN ACCESS SHARE MODE; -LOCK hs1 IN ROW SHARE MODE; -LOCK hs1 IN ROW EXCLUSIVE MODE; -COMMIT; --- UNLISTEN -UNLISTEN a; -UNLISTEN *; --- LOAD --- should work, easier if there is no test for that... --- ALLOWED COMMANDS -CHECKPOINT; -discard all; diff --git a/third_party/spanner_pg/src/test/regress/expected/hs_standby_check.out b/third_party/spanner_pg/src/test/regress/expected/hs_standby_check.out deleted file mode 100644 index df885ea9..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/hs_standby_check.out +++ /dev/null @@ -1,20 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_check.sql --- --- --- If the query below returns false then all other tests will fail after it. --- -select case pg_is_in_recovery() when false then - 'These tests are intended only for execution on a standby server that is reading ' || - 'WAL from a server upon which the regression database is already created and into ' || - 'which src/test/regress/sql/hs_primary_setup.sql has been run' -else - 'Tests are running on a standby server during recovery' -end; - case -------------------------------------------------------- - Tests are running on a standby server during recovery -(1 row) - diff --git a/third_party/spanner_pg/src/test/regress/expected/hs_standby_disallowed.out b/third_party/spanner_pg/src/test/regress/expected/hs_standby_disallowed.out deleted file mode 100644 index 8d3cafa5..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/hs_standby_disallowed.out +++ /dev/null @@ -1,133 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_disallowed.sql --- -SET transaction_read_only = off; -ERROR: cannot set transaction read-write mode during recovery -begin transaction read write; -ERROR: cannot set transaction read-write mode during recovery -commit; -WARNING: there is no transaction in progress --- SELECT -select * from hs1 FOR SHARE; -ERROR: cannot execute SELECT FOR SHARE in a read-only transaction -select * from hs1 FOR UPDATE; -ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction --- DML -BEGIN; -insert into hs1 values (37); -ERROR: cannot execute INSERT in a read-only transaction -ROLLBACK; -BEGIN; -delete from hs1 where col1 = 1; -ERROR: cannot execute DELETE in a read-only transaction -ROLLBACK; -BEGIN; -update hs1 set col1 = NULL where col1 > 0; -ERROR: cannot execute UPDATE in a read-only transaction -ROLLBACK; -BEGIN; -truncate hs3; -ERROR: cannot execute TRUNCATE TABLE in a read-only transaction -ROLLBACK; --- DDL -create temporary table hstemp1 (col1 integer); -ERROR: cannot execute CREATE TABLE in a read-only transaction -BEGIN; -drop table hs2; -ERROR: cannot execute DROP TABLE in a read-only transaction -ROLLBACK; -BEGIN; -create table hs4 (col1 integer); -ERROR: cannot execute CREATE TABLE in a read-only transaction -ROLLBACK; --- Sequences -SELECT nextval('hsseq'); -ERROR: cannot execute nextval() in a read-only transaction --- Two-phase commit transaction stuff -BEGIN; -SELECT count(*) FROM hs1; - count -------- - 1 -(1 row) - -PREPARE TRANSACTION 'foobar'; -ERROR: cannot execute PREPARE TRANSACTION during recovery -ROLLBACK; -BEGIN; -SELECT count(*) FROM hs1; - count -------- - 1 -(1 row) - -COMMIT PREPARED 'foobar'; -ERROR: cannot execute COMMIT PREPARED during recovery -ROLLBACK; -BEGIN; -SELECT count(*) FROM hs1; - count -------- - 1 -(1 row) - -PREPARE TRANSACTION 'foobar'; -ERROR: cannot execute PREPARE TRANSACTION during recovery -ROLLBACK PREPARED 'foobar'; -ERROR: current transaction is aborted, commands ignored until end of transaction block -ROLLBACK; -BEGIN; -SELECT count(*) FROM hs1; - count -------- - 1 -(1 row) - -ROLLBACK PREPARED 'foobar'; -ERROR: cannot execute ROLLBACK PREPARED during recovery -ROLLBACK; --- Locks -BEGIN; -LOCK hs1; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; -BEGIN; -LOCK hs1 IN SHARE UPDATE EXCLUSIVE MODE; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; -BEGIN; -LOCK hs1 IN SHARE MODE; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; -BEGIN; -LOCK hs1 IN SHARE ROW EXCLUSIVE MODE; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; -BEGIN; -LOCK hs1 IN EXCLUSIVE MODE; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; -BEGIN; -LOCK hs1 IN ACCESS EXCLUSIVE MODE; -ERROR: cannot execute LOCK TABLE during recovery -COMMIT; --- Listen -listen a; -ERROR: cannot execute LISTEN during recovery -notify a; -ERROR: cannot execute NOTIFY during recovery --- disallowed commands -ANALYZE hs1; -ERROR: cannot execute ANALYZE during recovery -VACUUM hs2; -ERROR: cannot execute VACUUM during recovery -CLUSTER hs2 using hs1_pkey; -ERROR: cannot execute CLUSTER during recovery -REINDEX TABLE hs2; -ERROR: cannot execute REINDEX during recovery -REVOKE SELECT ON hs1 FROM PUBLIC; -ERROR: cannot execute REVOKE in a read-only transaction -GRANT SELECT ON hs1 TO PUBLIC; -ERROR: cannot execute GRANT in a read-only transaction diff --git a/third_party/spanner_pg/src/test/regress/expected/hs_standby_functions.out b/third_party/spanner_pg/src/test/regress/expected/hs_standby_functions.out deleted file mode 100644 index ce846b75..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/hs_standby_functions.out +++ /dev/null @@ -1,40 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_functions.sql --- --- should fail -select pg_current_xact_id(); -ERROR: cannot execute pg_current_xact_id() during recovery -select length(pg_current_snapshot()::text) >= 4; - ?column? ----------- - t -(1 row) - -select pg_start_backup('should fail'); -ERROR: recovery is in progress -HINT: WAL control functions cannot be executed during recovery. -select pg_switch_wal(); -ERROR: recovery is in progress -HINT: WAL control functions cannot be executed during recovery. -select pg_stop_backup(); -ERROR: recovery is in progress -HINT: WAL control functions cannot be executed during recovery. --- should return no rows -select * from pg_prepared_xacts; - transaction | gid | prepared | owner | database --------------+-----+----------+-------+---------- -(0 rows) - --- just the startup process -select locktype, virtualxid, virtualtransaction, mode, granted -from pg_locks where virtualxid = '1/1'; - locktype | virtualxid | virtualtransaction | mode | granted -------------+------------+--------------------+---------------+--------- - virtualxid | 1/1 | 1/0 | ExclusiveLock | t -(1 row) - --- suicide is painless -select pg_cancel_backend(pg_backend_pid()); -ERROR: canceling statement due to user request diff --git a/third_party/spanner_pg/src/test/regress/expected/identity.out b/third_party/spanner_pg/src/test/regress/expected/identity.out index 99811570..5f03d8e1 100644 --- a/third_party/spanner_pg/src/test/regress/expected/identity.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/expected/incremental_sort.out b/third_party/spanner_pg/src/test/regress/expected/incremental_sort.out index a0b27477..0a631124 100644 --- a/third_party/spanner_pg/src/test/regress/expected/incremental_sort.out +++ b/third_party/spanner_pg/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. diff --git a/third_party/spanner_pg/src/test/regress/expected/indexing.out b/third_party/spanner_pg/src/test/regress/expected/indexing.out index a4e46eb3..e17879b7 100644 --- a/third_party/spanner_pg/src/test/regress/expected/indexing.out +++ b/third_party/spanner_pg/src/test/regress/expected/indexing.out @@ -137,7 +137,8 @@ select relname, relpartbound from pg_class (2 rows) alter table idxpart_c detach partition idxpart1_c; -ERROR: "idxpart_c" is not a table +ERROR: ALTER action DETACH PARTITION cannot be performed on relation "idxpart_c" +DETAIL: This operation is not supported for partitioned indexes. drop table idxpart; -- If a partition already has an index, don't create a duplicative one create table idxpart (a int, b int) partition by range (a, b); @@ -1280,6 +1281,45 @@ select tableoid::regclass, * from idxpart order by a; idxpart2 | 857142 | six (8 rows) +drop table idxpart; +-- Test some other non-btree index types +create table idxpart (a int, b text, c int[]) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +set enable_seqscan to off; +create index idxpart_brin on idxpart using brin(b); +explain (costs off) select * from idxpart where b = 'abcd'; + QUERY PLAN +------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (b = 'abcd'::text) + -> Bitmap Index Scan on idxpart1_b_idx + Index Cond: (b = 'abcd'::text) +(4 rows) + +drop index idxpart_brin; +create index idxpart_spgist on idxpart using spgist(b); +explain (costs off) select * from idxpart where b = 'abcd'; + QUERY PLAN +------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (b = 'abcd'::text) + -> Bitmap Index Scan on idxpart1_b_idx + Index Cond: (b = 'abcd'::text) +(4 rows) + +drop index idxpart_spgist; +create index idxpart_gin on idxpart using gin(c); +explain (costs off) select * from idxpart where c @> array[42]; + QUERY PLAN +---------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (c @> '{42}'::integer[]) + -> Bitmap Index Scan on idxpart1_c_idx + Index Cond: (c @> '{42}'::integer[]) +(4 rows) + +drop index idxpart_gin; +reset enable_seqscan; drop table idxpart; -- intentionally leave some objects around create table idxpart (a int) partition by range (a); diff --git a/third_party/spanner_pg/src/test/regress/expected/indirect_toast.out b/third_party/spanner_pg/src/test/regress/expected/indirect_toast.out index ab1fa5e7..44b54dc3 100644 --- a/third_party/spanner_pg/src/test/regress/expected/indirect_toast.out +++ b/third_party/spanner_pg/src/test/regress/expected/indirect_toast.out @@ -1,6 +1,14 @@ -- -- Tests for external toast datums -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION make_tuple_indirect (record) + RETURNS record + AS :'regresslib' + LANGUAGE C STRICT; -- Other compression algorithms may cause the compressed data to be stored -- inline. pglz guarantees that the data is externalized, so stick to it. SET default_toast_compression = 'pglz'; diff --git a/third_party/spanner_pg/src/test/regress/expected/inherit.out b/third_party/spanner_pg/src/test/regress/expected/inherit.out index 21625427..33d9f13f 100644 --- a/third_party/spanner_pg/src/test/regress/expected/inherit.out +++ b/third_party/spanner_pg/src/test/regress/expected/inherit.out @@ -1088,6 +1088,23 @@ Inherits: inht1, inhs1 DROP TABLE inhts; +-- Test for adding a column to a parent table with complex inheritance +CREATE TABLE inhta (); +CREATE TABLE inhtb () INHERITS (inhta); +CREATE TABLE inhtc () INHERITS (inhtb); +CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc); +ALTER TABLE inhta ADD COLUMN i int; +NOTICE: merging definition of column "i" for child "inhtd" +NOTICE: merging definition of column "i" for child "inhtd" +\d+ inhta + Table "public.inhta" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | +Child tables: inhtb, + inhtd + +DROP TABLE inhta, inhtb, inhtc, inhtd; -- Test for renaming in diamond inheritance CREATE TABLE inht2 (x int) INHERITS (inht1); CREATE TABLE inht3 (y int) INHERITS (inht1); @@ -2317,6 +2334,8 @@ explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c; Index Cond: (a < 20) (9 rows) +set enable_bitmapscan to off; +set enable_sort to off; create table mclparted (a int) partition by list(a); create table mclparted1 partition of mclparted for values in(1); create table mclparted2 partition of mclparted for values in(2); @@ -2345,7 +2364,113 @@ explain (costs off) select * from mclparted order by a; -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_4 (6 rows) +explain (costs off) select * from mclparted where a in(3,4,5) order by a; + QUERY PLAN +---------------------------------------------------------------------------- + Merge Append + Sort Key: mclparted.a + -> Index Only Scan using mclparted3_5_a_idx on mclparted3_5 mclparted_1 + Index Cond: (a = ANY ('{3,4,5}'::integer[])) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_2 + Index Cond: (a = ANY ('{3,4,5}'::integer[])) +(6 rows) + +-- Introduce a NULL and DEFAULT partition so we can test more complex cases +create table mclparted_null partition of mclparted for values in(null); +create table mclparted_def partition of mclparted default; +-- Append can be used providing we don't scan the interleaved partition +explain (costs off) select * from mclparted where a in(1,2,4) order by a; + QUERY PLAN +------------------------------------------------------------------------ + Append + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_3 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) +(7 rows) + +explain (costs off) select * from mclparted where a in(1,2,4) or a is null order by a; + QUERY PLAN +-------------------------------------------------------------------------------- + Append + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_3 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted_null_a_idx on mclparted_null mclparted_4 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) +(9 rows) + +-- Test a more complex case where the NULL partition allows some other value +drop table mclparted_null; +create table mclparted_0_null partition of mclparted for values in(0,null); +-- Ensure MergeAppend is used since 0 and NULLs are in the same partition. +explain (costs off) select * from mclparted where a in(1,2,4) or a is null order by a; + QUERY PLAN +------------------------------------------------------------------------------------ + Merge Append + Sort Key: mclparted.a + -> Index Only Scan using mclparted_0_null_a_idx on mclparted_0_null mclparted_1 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_2 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_3 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_4 + Filter: ((a = ANY ('{1,2,4}'::integer[])) OR (a IS NULL)) +(10 rows) + +explain (costs off) select * from mclparted where a in(0,1,2,4) order by a; + QUERY PLAN +------------------------------------------------------------------------------------ + Merge Append + Sort Key: mclparted.a + -> Index Only Scan using mclparted_0_null_a_idx on mclparted_0_null mclparted_1 + Index Cond: (a = ANY ('{0,1,2,4}'::integer[])) + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_2 + Index Cond: (a = ANY ('{0,1,2,4}'::integer[])) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_3 + Index Cond: (a = ANY ('{0,1,2,4}'::integer[])) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_4 + Index Cond: (a = ANY ('{0,1,2,4}'::integer[])) +(10 rows) + +-- Ensure Append is used when the null partition is pruned +explain (costs off) select * from mclparted where a in(1,2,4) order by a; + QUERY PLAN +------------------------------------------------------------------------ + Append + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_3 + Index Cond: (a = ANY ('{1,2,4}'::integer[])) +(7 rows) + +-- Ensure MergeAppend is used when the default partition is not pruned +explain (costs off) select * from mclparted where a in(1,2,4,100) order by a; + QUERY PLAN +------------------------------------------------------------------------------ + Merge Append + Sort Key: mclparted.a + -> Index Only Scan using mclparted1_a_idx on mclparted1 mclparted_1 + Index Cond: (a = ANY ('{1,2,4,100}'::integer[])) + -> Index Only Scan using mclparted2_a_idx on mclparted2 mclparted_2 + Index Cond: (a = ANY ('{1,2,4,100}'::integer[])) + -> Index Only Scan using mclparted4_a_idx on mclparted4 mclparted_3 + Index Cond: (a = ANY ('{1,2,4,100}'::integer[])) + -> Index Only Scan using mclparted_def_a_idx on mclparted_def mclparted_4 + Index Cond: (a = ANY ('{1,2,4,100}'::integer[])) +(10 rows) + drop table mclparted; +reset enable_sort; +reset enable_bitmapscan; -- Ensure subplans which don't have a path with the correct pathkeys get -- sorted correctly. drop index mcrparted_a_abs_c_idx; diff --git a/third_party/spanner_pg/src/test/regress/expected/insert.out b/third_party/spanner_pg/src/test/regress/expected/insert.out index 5063a3dc..dd4354fc 100644 --- a/third_party/spanner_pg/src/test/regress/expected/insert.out +++ b/third_party/spanner_pg/src/test/regress/expected/insert.out @@ -408,28 +408,6 @@ select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from list_p (9 rows) -- direct partition inserts should check hash partition bound constraint --- 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 --- of the non-empty string value passed to it or 0. -create or replace function part_hashint4_noop(value int4, seed int8) -returns int8 as $$ -select value + seed; -$$ language sql immutable; -create operator class part_test_int4_ops -for type int4 -using hash as -operator 1 =, -function 2 part_hashint4_noop(int4, int8); -create or replace function part_hashtext_length(value text, seed int8) -RETURNS int8 AS $$ -select length(coalesce(value, ''))::int8 -$$ language sql immutable; -create operator class part_test_text_ops -for type text -using hash as -operator 1 =, -function 2 part_hashtext_length(text, int8); create table hash_parted ( a int ) partition by hash (a part_test_int4_ops); diff --git a/third_party/spanner_pg/src/test/regress/expected/int2.out b/third_party/spanner_pg/src/test/regress/expected/int2.out index 8a64df72..109cf9ba 100644 --- a/third_party/spanner_pg/src/test/regress/expected/int2.out +++ b/third_party/spanner_pg/src/test/regress/expected/int2.out @@ -1,18 +1,12 @@ -- -- INT2 -- -CREATE TABLE INT2_TBL(f1 int2); -INSERT INTO INT2_TBL(f1) VALUES ('0 '); -INSERT INTO INT2_TBL(f1) VALUES (' 1234 '); -INSERT INTO INT2_TBL(f1) VALUES (' -1234'); +-- int2_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO INT2_TBL(f1) VALUES ('34.5'); ERROR: invalid input syntax for type smallint: "34.5" LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('34.5'); ^ --- largest and smallest values -INSERT INTO INT2_TBL(f1) VALUES ('32767'); -INSERT INTO INT2_TBL(f1) VALUES ('-32767'); --- bad input values -- should give errors INSERT INTO INT2_TBL(f1) VALUES ('100000'); ERROR: value "100000" is out of range for type smallint LINE 1: INSERT INTO INT2_TBL(f1) VALUES ('100000'); diff --git a/third_party/spanner_pg/src/test/regress/expected/int4.out b/third_party/spanner_pg/src/test/regress/expected/int4.out index 9d20b338..fbcc0e8d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/int4.out +++ b/third_party/spanner_pg/src/test/regress/expected/int4.out @@ -1,18 +1,12 @@ -- -- INT4 -- -CREATE TABLE INT4_TBL(f1 int4); -INSERT INTO INT4_TBL(f1) VALUES (' 0 '); -INSERT INTO INT4_TBL(f1) VALUES ('123456 '); -INSERT INTO INT4_TBL(f1) VALUES (' -123456'); +-- int4_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO INT4_TBL(f1) VALUES ('34.5'); ERROR: invalid input syntax for type integer: "34.5" LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('34.5'); ^ --- largest and smallest values -INSERT INTO INT4_TBL(f1) VALUES ('2147483647'); -INSERT INTO INT4_TBL(f1) VALUES ('-2147483647'); --- bad input values -- should give errors INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); ERROR: value "1000000000000" is out of range for type integer LINE 1: INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); diff --git a/third_party/spanner_pg/src/test/regress/expected/int8.out b/third_party/spanner_pg/src/test/regress/expected/int8.out index 36540ec4..329f3911 100644 --- a/third_party/spanner_pg/src/test/regress/expected/int8.out +++ b/third_party/spanner_pg/src/test/regress/expected/int8.out @@ -2,13 +2,8 @@ -- INT8 -- Test int8 64-bit integers. -- -CREATE TABLE INT8_TBL(q1 int8, q2 int8); -INSERT INTO INT8_TBL VALUES(' 123 ',' 456'); -INSERT INTO INT8_TBL VALUES('123 ','4567890123456789'); -INSERT INTO INT8_TBL VALUES('4567890123456789','123'); -INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789'); -INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789'); --- bad inputs +-- int8_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO INT8_TBL(q1) VALUES (' '); ERROR: invalid input syntax for type bigint: " " LINE 1: INSERT INTO INT8_TBL(q1) VALUES (' '); @@ -659,6 +654,8 @@ select -('-9223372036854775807'::int8); select -('-9223372036854775808'::int8); ERROR: bigint out of range +select 0::int8 - '-9223372036854775808'::int8; +ERROR: bigint out of range select '9223372036854775800'::int8 + '9223372036854775800'::int8; ERROR: bigint out of range select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; diff --git a/third_party/spanner_pg/src/test/regress/expected/interval.out b/third_party/spanner_pg/src/test/regress/expected/interval.out index 8e2d5355..f96eadd6 100644 --- a/third_party/spanner_pg/src/test/regress/expected/interval.out +++ b/third_party/spanner_pg/src/test/regress/expected/interval.out @@ -357,6 +357,19 @@ SELECT * FROM INTERVAL_TBL; @ 5 mons 12 hours (10 rows) +-- multiplication and division overflow test cases +SELECT '3000000 months'::interval * 1000; +ERROR: interval out of range +SELECT '3000000 months'::interval / 0.001; +ERROR: interval out of range +SELECT '3000000 days'::interval * 1000; +ERROR: interval out of range +SELECT '3000000 days'::interval / 0.001; +ERROR: interval out of range +SELECT '1 month 2146410 days'::interval * 1000.5002; +ERROR: interval out of range +SELECT '4611686018427387904 usec'::interval / 0.1; +ERROR: interval out of range -- test avg(interval), which is somewhat fragile since people have been -- known to change the allowed input syntax for type interval without -- updating pg_aggregate.agginitval @@ -396,6 +409,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 +420,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; @@ -790,6 +839,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', @@ -801,6 +860,21 @@ 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) + +-- edge case for sign-matching rules +SELECT interval ''; -- error +ERROR: invalid input syntax for type interval: "" +LINE 1: SELECT interval ''; + ^ -- test outputting iso8601 intervals SET IntervalStyle to iso_8601; select interval '0' AS "zero", @@ -852,6 +926,47 @@ 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 'P10.5e4Y'; -- not per spec, but we've historically taken it + interval +-------------- + 105000 years +(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'; @@ -872,6 +987,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.775429 secs +(1 row) + +select interval 'PT-2562047788.0152155022222'; + interval +--------------------------------------- + @ 2562047788 hours 54.775429 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 @@ -963,9 +1689,9 @@ SELECT f1, (10 rows) SELECT EXTRACT(FORTNIGHT FROM INTERVAL '2 days'); -- error -ERROR: interval units "fortnight" not recognized +ERROR: unit "fortnight" not recognized for type interval SELECT EXTRACT(TIMEZONE FROM INTERVAL '2 days'); -- error -ERROR: interval units "timezone" not supported +ERROR: unit "timezone" not supported for type interval SELECT EXTRACT(DECADE FROM INTERVAL '100 y'); extract --------- diff --git a/third_party/spanner_pg/src/test/regress/expected/join.out b/third_party/spanner_pg/src/test/regress/expected/join.out index b11a1cab..867c6d20 100644 --- a/third_party/spanner_pg/src/test/regress/expected/join.out +++ b/third_party/spanner_pg/src/test/regress/expected/join.out @@ -2261,7 +2261,7 @@ rollback; -- explain (costs off) select aa, bb, unique1, unique1 - from tenk1 right join b on aa = unique1 + from tenk1 right join b_star on aa = unique1 where bb < bb and bb is null; QUERY PLAN -------------------------- @@ -2270,7 +2270,7 @@ select aa, bb, unique1, unique1 (2 rows) select aa, bb, unique1, unique1 - from tenk1 right join b on aa = unique1 + from tenk1 right join b_star on aa = unique1 where bb < bb and bb is null; aa | bb | unique1 | unique1 ----+----+---------+--------- @@ -5803,6 +5803,32 @@ select * from Output: (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)) (24 rows) +-- another case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + QUERY PLAN +-------------------------------- + Nested Loop Left Join + Output: 0, (1), ((1)) + -> Result + Output: 1 + -> Result + Output: (1) + One-Time Filter: false +(7 rows) + +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + val0 | val | val_filtered +------+-----+-------------- + 0 | 1 | +(1 row) + -- case that breaks the old ph_may_need optimization explain (verbose, costs off) select c.*,a.*,ss1.q1,ss2.q1,ss3.* from diff --git a/third_party/spanner_pg/src/test/regress/expected/join_hash.out b/third_party/spanner_pg/src/test/regress/expected/join_hash.out index e1ec01af..d9eb6785 100644 --- a/third_party/spanner_pg/src/test/regress/expected/join_hash.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/expected/jsonb.out b/third_party/spanner_pg/src/test/regress/expected/jsonb.out index 3c5be773..f6530e5b 100644 --- a/third_party/spanner_pg/src/test/regress/expected/jsonb.out +++ b/third_party/spanner_pg/src/test/regress/expected/jsonb.out @@ -1,3 +1,10 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +CREATE TABLE testjsonb ( + j jsonb +); +\set filename :abs_srcdir '/data/jsonb.data' +COPY testjsonb FROM :'filename'; -- Strings. SELECT '""'::jsonb; -- OK. jsonb diff --git a/third_party/spanner_pg/src/test/regress/expected/jsonpath.out b/third_party/spanner_pg/src/test/regress/expected/jsonpath.out index 6dab98d0..fdaac583 100644 --- a/third_party/spanner_pg/src/test/regress/expected/jsonpath.out +++ b/third_party/spanner_pg/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; @@ -479,7 +477,7 @@ select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath; ERROR: invalid input syntax for type jsonpath LINE 1: select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath; ^ -DETAIL: unrecognized flag character "a" in LIKE_REGEX predicate +DETAIL: Unrecognized flag character "a" in LIKE_REGEX predicate. select '$ < 1'::jsonpath; 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 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 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 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 at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < .1e1)'::jsonpath; - ^ + jsonpath +--------------- + $?(@."a" < 1) +(1 row) + select '$ ? (@.a < -.1e1)'::jsonpath; -ERROR: syntax error at or near "." of jsonpath input -LINE 1: select '$ ? (@.a < -.1e1)'::jsonpath; - ^ + jsonpath +---------------- + $?(@."a" < -1) +(1 row) + select '$ ? (@.a < +.1e1)'::jsonpath; -ERROR: syntax error 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 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 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 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 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 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 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 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 at or near "." of jsonpath input -LINE 1: select '1..e'::jsonpath; - ^ select '1..e3'::jsonpath; -ERROR: syntax error at or near "." of jsonpath input -LINE 1: select '1..e3'::jsonpath; - ^ + jsonpath +---------- + (1)."e3" +(1 row) + select '(1.).e'::jsonpath; -ERROR: syntax error at or near ")" of jsonpath input -LINE 1: select '(1.).e'::jsonpath; - ^ + jsonpath +---------- + (1)."e" +(1 row) + select '(1.).e3'::jsonpath; -ERROR: syntax error 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/third_party/spanner_pg/src/test/regress/output/largeobject.source b/third_party/spanner_pg/src/test/regress/expected/largeobject.out similarity index 84% rename from third_party/spanner_pg/src/test/regress/output/largeobject.source rename to third_party/spanner_pg/src/test/regress/expected/largeobject.out index 91d33b4d..60d7b991 100644 --- a/third_party/spanner_pg/src/test/regress/output/largeobject.source +++ b/third_party/spanner_pg/src/test/regress/expected/largeobject.out @@ -1,39 +1,57 @@ -- -- Test large object support -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; +-- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +CREATE ROLE regress_lo_user; +SELECT lo_create(42); + lo_create +----------- + 42 +(1 row) + +ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; +GRANT SELECT ON LARGE OBJECT 42 TO public; +COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; +-- Test psql's \lo_list et al (we assume no other LOs exist yet) +\lo_list + Large objects + ID | Owner | Description +----+-----------------+--------------------- + 42 | regress_lo_user | the ultimate answer +(1 row) + +\lo_list+ + Large objects + ID | Owner | Access privileges | Description +----+-----------------+------------------------------------+--------------------- + 42 | regress_lo_user | regress_lo_user=rw/regress_lo_user+| the ultimate answer + | | =r/regress_lo_user | +(1 row) + +\lo_unlink 42 +\dl + Large objects + ID | Owner | Description +----+-------+------------- +(0 rows) + -- Load a file CREATE TABLE lotest_stash_values (loid oid, fd integer); -- lo_creat(mode integer) returns oid -- The mode arg to lo_creat is unused, some vestigal holdover from ancient times -- returns the large object id INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); --- Test ALTER LARGE OBJECT -CREATE ROLE regress_lo_user; -DO $$ - BEGIN - EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) - || ' OWNER TO regress_lo_user'; - END -$$; -SELECT - rol.rolname -FROM - lotest_stash_values s - JOIN pg_largeobject_metadata lo ON s.loid = lo.oid - JOIN pg_authid rol ON lo.lomowner = rol.oid; - rolname ------------------ - regress_lo_user -(1 row) - -- NOTE: large objects require transactions BEGIN; -- lo_open(lobjId oid, mode integer) returns integer -- The mode parameter to lo_open uses two constants: --- INV_READ = 0x20000 --- INV_WRITE = 0x40000 +-- INV_WRITE = 0x20000 +-- INV_READ = 0x40000 -- The return value is a file descriptor-like value which remains valid for the -- transaction. UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); @@ -161,16 +179,13 @@ SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; (1 row) ABORT; -DO $$ -DECLARE - loid oid; -BEGIN - SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; - PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); -EXCEPTION - WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; -END; -$$; +\set filename :abs_builddir '/results/invalid/path' +\set dobody 'DECLARE loid oid; BEGIN ' +\set dobody :dobody 'SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; ' +\set dobody :dobody 'PERFORM lo_export(loid, ' :'filename' '); ' +\set dobody :dobody 'EXCEPTION WHEN UNDEFINED_FILE THEN ' +\set dobody :dobody 'RAISE NOTICE ''could not open file, as expected''; END' +DO :'dobody'; NOTICE: could not open file, as expected -- Test truncation. BEGIN; @@ -327,7 +342,8 @@ SELECT lo_unlink(loid) from lotest_stash_values; (1 row) TRUNCATE lotest_stash_values; -INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); +\set filename :abs_srcdir '/data/tenk.data' +INSERT INTO lotest_stash_values (loid) SELECT lo_import(:'filename'); BEGIN; UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); -- verify length of large object @@ -390,16 +406,18 @@ SELECT lo_close(fd) FROM lotest_stash_values; (1 row) END; -SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; +\set filename :abs_builddir '/results/lotest.txt' +SELECT lo_export(loid, :'filename') FROM lotest_stash_values; lo_export ----------- 1 (1 row) -\lo_import '@abs_builddir@/results/lotest.txt' +\lo_import :filename \set newloid :LASTOID -- just make sure \lo_export does not barf -\lo_export :newloid '@abs_builddir@/results/lotest2.txt' +\set filename :abs_builddir '/results/lotest2.txt' +\lo_export :newloid :filename -- This is a hack to test that export/import are reversible -- This uses knowledge about the inner workings of large object mechanism -- which should not be used outside it. This makes it a HACK @@ -418,7 +436,8 @@ SELECT lo_unlink(loid) FROM lotest_stash_values; TRUNCATE lotest_stash_values; \lo_unlink :newloid -\lo_import '@abs_builddir@/results/lotest.txt' +\set filename :abs_builddir '/results/lotest.txt' +\lo_import :filename \set newloid_1 :LASTOID SELECT lo_from_bytea(0, lo_get(:newloid_1)) AS newloid_2 \gset diff --git a/third_party/spanner_pg/src/test/regress/output/largeobject_1.source b/third_party/spanner_pg/src/test/regress/expected/largeobject_1.out similarity index 84% rename from third_party/spanner_pg/src/test/regress/output/largeobject_1.source rename to third_party/spanner_pg/src/test/regress/expected/largeobject_1.out index cb910e2e..30c8d3da 100644 --- a/third_party/spanner_pg/src/test/regress/output/largeobject_1.source +++ b/third_party/spanner_pg/src/test/regress/expected/largeobject_1.out @@ -1,39 +1,57 @@ -- -- Test large object support -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; +-- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +CREATE ROLE regress_lo_user; +SELECT lo_create(42); + lo_create +----------- + 42 +(1 row) + +ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; +GRANT SELECT ON LARGE OBJECT 42 TO public; +COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; +-- Test psql's \lo_list et al (we assume no other LOs exist yet) +\lo_list + Large objects + ID | Owner | Description +----+-----------------+--------------------- + 42 | regress_lo_user | the ultimate answer +(1 row) + +\lo_list+ + Large objects + ID | Owner | Access privileges | Description +----+-----------------+------------------------------------+--------------------- + 42 | regress_lo_user | regress_lo_user=rw/regress_lo_user+| the ultimate answer + | | =r/regress_lo_user | +(1 row) + +\lo_unlink 42 +\dl + Large objects + ID | Owner | Description +----+-------+------------- +(0 rows) + -- Load a file CREATE TABLE lotest_stash_values (loid oid, fd integer); -- lo_creat(mode integer) returns oid -- The mode arg to lo_creat is unused, some vestigal holdover from ancient times -- returns the large object id INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); --- Test ALTER LARGE OBJECT -CREATE ROLE regress_lo_user; -DO $$ - BEGIN - EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) - || ' OWNER TO regress_lo_user'; - END -$$; -SELECT - rol.rolname -FROM - lotest_stash_values s - JOIN pg_largeobject_metadata lo ON s.loid = lo.oid - JOIN pg_authid rol ON lo.lomowner = rol.oid; - rolname ------------------ - regress_lo_user -(1 row) - -- NOTE: large objects require transactions BEGIN; -- lo_open(lobjId oid, mode integer) returns integer -- The mode parameter to lo_open uses two constants: --- INV_READ = 0x20000 --- INV_WRITE = 0x40000 +-- INV_WRITE = 0x20000 +-- INV_READ = 0x40000 -- The return value is a file descriptor-like value which remains valid for the -- transaction. UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); @@ -161,16 +179,13 @@ SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; (1 row) ABORT; -DO $$ -DECLARE - loid oid; -BEGIN - SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; - PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); -EXCEPTION - WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; -END; -$$; +\set filename :abs_builddir '/results/invalid/path' +\set dobody 'DECLARE loid oid; BEGIN ' +\set dobody :dobody 'SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; ' +\set dobody :dobody 'PERFORM lo_export(loid, ' :'filename' '); ' +\set dobody :dobody 'EXCEPTION WHEN UNDEFINED_FILE THEN ' +\set dobody :dobody 'RAISE NOTICE ''could not open file, as expected''; END' +DO :'dobody'; NOTICE: could not open file, as expected -- Test truncation. BEGIN; @@ -327,7 +342,8 @@ SELECT lo_unlink(loid) from lotest_stash_values; (1 row) TRUNCATE lotest_stash_values; -INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); +\set filename :abs_srcdir '/data/tenk.data' +INSERT INTO lotest_stash_values (loid) SELECT lo_import(:'filename'); BEGIN; UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); -- verify length of large object @@ -390,16 +406,18 @@ SELECT lo_close(fd) FROM lotest_stash_values; (1 row) END; -SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; +\set filename :abs_builddir '/results/lotest.txt' +SELECT lo_export(loid, :'filename') FROM lotest_stash_values; lo_export ----------- 1 (1 row) -\lo_import '@abs_builddir@/results/lotest.txt' +\lo_import :filename \set newloid :LASTOID -- just make sure \lo_export does not barf -\lo_export :newloid '@abs_builddir@/results/lotest2.txt' +\set filename :abs_builddir '/results/lotest2.txt' +\lo_export :newloid :filename -- This is a hack to test that export/import are reversible -- This uses knowledge about the inner workings of large object mechanism -- which should not be used outside it. This makes it a HACK @@ -418,7 +436,8 @@ SELECT lo_unlink(loid) FROM lotest_stash_values; TRUNCATE lotest_stash_values; \lo_unlink :newloid -\lo_import '@abs_builddir@/results/lotest.txt' +\set filename :abs_builddir '/results/lotest.txt' +\lo_import :filename \set newloid_1 :LASTOID SELECT lo_from_bytea(0, lo_get(:newloid_1)) AS newloid_2 \gset diff --git a/third_party/spanner_pg/src/test/regress/expected/lock.out b/third_party/spanner_pg/src/test/regress/expected/lock.out index d43bee0c..ad137d36 100644 --- a/third_party/spanner_pg/src/test/regress/expected/lock.out +++ b/third_party/spanner_pg/src/test/regress/expected/lock.out @@ -1,6 +1,10 @@ -- -- Test the LOCK statement -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix -- Setup CREATE SCHEMA lock_schema1; SET search_path = lock_schema1; @@ -152,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; @@ -170,6 +240,10 @@ DROP SCHEMA lock_schema1 CASCADE; DROP ROLE regress_rol_lock1; -- atomic ops tests RESET search_path; +CREATE FUNCTION test_atomic_ops() + RETURNS bool + AS :'regresslib' + LANGUAGE C; SELECT test_atomic_ops(); test_atomic_ops ----------------- diff --git a/third_party/spanner_pg/src/test/regress/expected/matview.out b/third_party/spanner_pg/src/test/regress/expected/matview.out index c109d976..e811e1a0 100644 --- a/third_party/spanner_pg/src/test/regress/expected/matview.out +++ b/third_party/spanner_pg/src/test/regress/expected/matview.out @@ -572,6 +572,22 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo; REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; DROP OWNED BY regress_user_mvtest CASCADE; DROP ROLE regress_user_mvtest; +-- Concurrent refresh requires a unique index on the materialized +-- view. Test what happens if it's dropped during the refresh. +CREATE OR REPLACE FUNCTION mvtest_drop_the_index() + RETURNS bool AS $$ +BEGIN + EXECUTE 'DROP INDEX IF EXISTS mvtest_drop_idx'; + RETURN true; +END; +$$ LANGUAGE plpgsql; +CREATE MATERIALIZED VIEW drop_idx_matview AS + SELECT 1 as i WHERE mvtest_drop_the_index(); +NOTICE: index "mvtest_drop_idx" does not exist, skipping +CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i); +REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview; +ERROR: could not find suitable unique index on materialized view +DROP MATERIALIZED VIEW drop_idx_matview; -- clean up -- make sure that create WITH NO DATA works via SPI BEGIN; CREATE FUNCTION mvtest_func() diff --git a/third_party/spanner_pg/src/test/regress/expected/memoize.out b/third_party/spanner_pg/src/test/regress/expected/memoize.out index 7d8f3ca4..60cbdeec 100644 --- a/third_party/spanner_pg/src/test/regress/expected/memoize.out +++ b/third_party/spanner_pg/src/test/regress/expected/memoize.out @@ -92,8 +92,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 @@ -279,6 +280,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/third_party/spanner_pg/src/test/regress/expected/merge.out b/third_party/spanner_pg/src/test/regress/expected/merge.out new file mode 100644 index 00000000..edc0043c --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/expected/merge.out @@ -0,0 +1,2246 @@ +-- +-- MERGE +-- +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; +NOTICE: table "source" does not exist, skipping +CREATE TABLE target (tid integer, balance integer) + WITH (autovacuum_enabled=off); +CREATE TABLE source (sid integer, delta integer) -- no index + WITH (autovacuum_enabled=off); +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 regress_merge_privs; +ALTER TABLE source OWNER TO regress_merge_privs; +CREATE TABLE target2 (tid integer, balance integer) + WITH (autovacuum_enabled=off); +CREATE TABLE source2 (sid integer, delta integer) + WITH (autovacuum_enabled=off); +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 +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. +-- used in a CTE +WITH foo AS ( + MERGE INTO target USING source ON (true) + WHEN MATCHED THEN DELETE +) SELECT * FROM foo; +ERROR: MERGE not supported in WITH query +LINE 1: WITH foo AS ( + ^ +-- used in COPY +COPY ( + MERGE INTO target USING source ON (true) + WHEN MATCHED THEN DELETE +) TO stdout; +ERROR: MERGE not supported in COPY +-- 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 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 regress_merge_privs; +SET SESSION AUTHORIZATION regress_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 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) + WITH (autovacuum_enabled=off); +CREATE TABLE wq_source (balance integer, sid integer) + WITH (autovacuum_enabled=off); +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 source-side whole-row references +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON (t.tid = s.sid) +WHEN matched and t = s or t.tid = s.sid THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; + tid | balance +-----+--------- + 1 | 399 +(1 row) + +ROLLBACK; +-- 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) + +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(); +DO $$ +DECLARE + result integer; +BEGIN +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); +IF FOUND THEN + RAISE NOTICE 'Found'; +ELSE + RAISE NOTICE 'Not found'; +END IF; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +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 +NOTICE: Not found +NOTICE: ROW_COUNT = 0 +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) + WITH (autovacuum_enabled=off); +CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0) + WITH (autovacuum_enabled=off); +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) + WITH (autovacuum_enabled=off); +CREATE TABLE ex_msource (a int, b int) + WITH (autovacuum_enabled=off); +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( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g'); + 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: updated=50 + -> 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) +(12 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: updated=5 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) +(12 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: 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) + 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) +(12 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 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) +(12 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 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) + 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) +(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) + -> Merge Join (actual rows=0 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=0 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=0 loops=1) + Filter: (a < '-1000'::integer) + Rows Removed by Filter: 54 + -> Sort (never executed) + Sort Key: s.a + -> Seq Scan on ex_msource s (never executed) +(12 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) + WITH (autovacuum_enabled=off); +CREATE TABLE part2 PARTITION OF pa_target FOR VALUES IN (2,5,6) + WITH (autovacuum_enabled=off); +CREATE TABLE part3 PARTITION OF pa_target FOR VALUES IN (3,8,9) + WITH (autovacuum_enabled=off); +CREATE TABLE part4 PARTITION OF pa_target DEFAULT + WITH (autovacuum_enabled=off); +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; +CREATE FUNCTION merge_func() RETURNS integer LANGUAGE plpgsql AS $$ +DECLARE + result integer; +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'); +IF FOUND THEN + GET DIAGNOSTICS result := ROW_COUNT; +END IF; +RETURN result; +END; +$$; +SELECT merge_func(); + merge_func +------------ + 14 +(1 row) + +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) + WITH (autovacuum_enabled=off); +CREATE TABLE part2 (balance float, tid integer, val text) + WITH (autovacuum_enabled=off); +CREATE TABLE part3 (tid integer, balance float, val text) + WITH (autovacuum_enabled=off); +CREATE TABLE part4 (extraid text, tid integer, balance float, val text) + WITH (autovacuum_enabled=off); +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; +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 14 +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; +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 14 +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; +-- as above, but blocked by BEFORE DELETE ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER del_trig BEFORE DELETE ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 10 +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 1 | 100 | initial + 2 | 20 | inserted by merge + 3 | 300 | initial + 4 | 40 | inserted by merge + 6 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 7 | 700 | initial + 8 | 80 | inserted by merge + 9 | 900 | initial + 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; +-- as above, but blocked by BEFORE INSERT ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER ins_trig BEFORE INSERT ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 3 +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 6 | 550 | initial updated by merge + 12 | 1210 | initial updated by merge + 14 | 1430 | initial updated by merge +(3 rows) + +ROLLBACK; +-- test RLS enforcement +BEGIN; +ALTER TABLE pa_target ENABLE ROW LEVEL SECURITY; +ALTER TABLE pa_target FORCE ROW LEVEL SECURITY; +CREATE POLICY pa_target_pol ON pa_target USING (tid != 0); +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND t.tid IN (1,2,3,4) + WHEN MATCHED THEN + UPDATE SET tid = tid - 1; +ERROR: new row violates row-level security policy for table "pa_target" +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) WITH (autovacuum_enabled=off); +CREATE TABLE part_m01_even PARTITION OF part_m01 + FOR VALUES IN (2,4,6,8) WITH (autovacuum_enabled=off); +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) WITH (autovacuum_enabled=off); +CREATE TABLE part_m02_even PARTITION OF part_m02 + FOR VALUES IN (2,4,6,8) WITH (autovacuum_enabled=off); +CREATE TABLE pa_source (sid integer, delta float) + WITH (autovacuum_enabled=off); +-- 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; +-- Partitioned table with primary key +CREATE TABLE pa_target (tid integer PRIMARY KEY) PARTITION BY LIST (tid); +CREATE TABLE pa_targetp PARTITION OF pa_target DEFAULT; +CREATE TABLE pa_source (sid integer); +INSERT INTO pa_source VALUES (1), (2); +EXPLAIN (VERBOSE, COSTS OFF) +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + QUERY PLAN +----------------------------------------------------------------------- + Merge on public.pa_target t + Merge on public.pa_targetp t_1 + -> Nested Loop Left Join + Output: s.sid, s.ctid, t_1.tableoid, t_1.ctid + -> Seq Scan on public.pa_source s + Output: s.sid, s.ctid + -> Index Scan using pa_targetp_pkey on public.pa_targetp t_1 + Output: t_1.tid, t_1.tableoid, t_1.ctid + Index Cond: (t_1.tid = s.sid) +(9 rows) + +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); +TABLE pa_target; + tid +----- + 1 + 2 +(2 rows) + +-- Partition-less partitioned table +-- (the bug we are checking for appeared only if table had partitions before) +DROP TABLE pa_targetp; +EXPLAIN (VERBOSE, COSTS OFF) +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + QUERY PLAN +-------------------------------------------- + Merge on public.pa_target t + -> Hash Left Join + Output: s.sid, s.ctid, t.ctid + Hash Cond: (s.sid = t.tid) + -> Seq Scan on public.pa_source s + Output: s.sid, s.ctid + -> Hash + Output: t.tid, t.ctid + -> Result + Output: t.tid, t.ctid + One-Time Filter: false +(11 rows) + +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); +ERROR: no partition of relation "pa_target" found for row +DETAIL: Partition key of the failing row contains (tid) = (1). +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) + WITH (autovacuum_enabled=off); +CREATE TABLE cj_source1 (sid1 integer, scat integer, delta integer) + WITH (autovacuum_enabled=off); +CREATE TABLE cj_source2 (sid2 integer, sval text) + WITH (autovacuum_enabled=off); +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) + +-- try it with an outer join and PlaceHolderVar +MERGE INTO cj_target t +USING (SELECT *, 'join input'::text AS phv FROM cj_source1) fj + FULL JOIN cj_source2 fj2 ON fj.scat = fj2.sid2 * 10 +ON t.tid = fj.scat +WHEN NOT MATCHED THEN + INSERT (tid, balance, val) VALUES (fj.scat, fj.delta, fj.phv); +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 + 10 | 100 | join input + 10 | 400 | join input + 20 | 200 | join input + 20 | 300 | join input + | | +(9 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) + WITH (autovacuum_enabled=off); +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 +) WITH (autovacuum_enabled=off); +CREATE TABLE measurement_y2006m02 ( + CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) +) INHERITS (measurement) WITH (autovacuum_enabled=off); +CREATE TABLE measurement_y2006m03 ( + CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) +) INHERITS (measurement) WITH (autovacuum_enabled=off); +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') +) WITH (autovacuum_enabled=off); +ALTER TABLE measurement_y2007m01 DROP COLUMN filler; +ALTER TABLE measurement_y2007m01 INHERIT measurement; +INSERT INTO measurement VALUES (0, '2005-07-21', 5, 15); +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 | 0 | 07-21-2005 | 5 | 15 + 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 +(7 rows) + +CREATE TABLE new_measurement (LIKE measurement) WITH (autovacuum_enabled=off); +INSERT INTO new_measurement VALUES (0, '2005-07-21', 25, 20); +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); +BEGIN; +MERGE INTO ONLY 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, peaktemp; + tableoid | city_id | logdate | peaktemp | unitsales +----------------------+---------+------------+----------+----------- + measurement | 0 | 07-21-2005 | 25 | 35 + measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10 + measurement_y2006m02 | 1 | 02-16-2006 | 45 | 20 + measurement_y2006m02 | 1 | 02-16-2006 | 50 | 10 + measurement_y2006m03 | 1 | 03-01-2006 | 20 | 10 + measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10 + measurement_y2006m03 | 1 | 03-27-2006 | 15 | 40 + measurement_y2006m03 | 1 | 03-27-2006 | | + measurement_y2007m01 | 1 | 01-15-2007 | 5 | + measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10 + measurement_y2007m01 | 1 | 01-16-2007 | 10 | 10 + measurement_y2007m01 | 1 | 01-17-2007 | 10 | 10 + measurement_y2007m01 | 1 | 01-17-2007 | | + measurement_y2006m02 | 2 | 02-10-2006 | 20 | 20 +(14 rows) + +ROLLBACK; +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 | 0 | 07-21-2005 | 25 | 35 + 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 +(8 rows) + +BEGIN; +MERGE INTO new_measurement nm + USING ONLY measurement m ON + (nm.city_id = m.city_id and nm.logdate=m.logdate) +WHEN MATCHED THEN DELETE; +SELECT * FROM new_measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 1 | 02-16-2006 | 50 | 10 + 1 | 03-01-2006 | 20 | 10 + 1 | 03-27-2006 | | + 1 | 01-15-2007 | 5 | + 1 | 01-16-2007 | 10 | 10 + 1 | 01-17-2007 | | + 2 | 02-10-2006 | 20 | 20 +(7 rows) + +ROLLBACK; +MERGE INTO new_measurement nm + USING measurement m ON + (nm.city_id = m.city_id and nm.logdate=m.logdate) +WHEN MATCHED THEN DELETE; +SELECT * FROM new_measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 1 | 03-27-2006 | | + 1 | 01-17-2007 | | +(2 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 regress_merge_privs; +DROP USER regress_merge_no_privs; diff --git a/third_party/spanner_pg/src/test/regress/expected/misc.out b/third_party/spanner_pg/src/test/regress/expected/misc.out new file mode 100644 index 00000000..6e816c57 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/expected/misc.out @@ -0,0 +1,398 @@ +-- +-- MISC +-- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION overpaid(emp) + RETURNS bool + AS :'regresslib' + LANGUAGE C STRICT; +CREATE FUNCTION reverse_name(name) + RETURNS name + AS :'regresslib' + LANGUAGE C STRICT; +-- +-- BTREE +-- +UPDATE onek + SET unique1 = onek.unique1 + 1; +UPDATE onek + SET unique1 = onek.unique1 - 1; +-- +-- BTREE partial +-- +-- UPDATE onek2 +-- SET unique1 = onek2.unique1 + 1; +--UPDATE onek2 +-- SET unique1 = onek2.unique1 - 1; +-- +-- BTREE shutting out non-functional updates +-- +-- the following two tests seem to take a long time on some +-- systems. This non-func update stuff needs to be examined +-- more closely. - jolly (2/22/96) +-- +SELECT two, stringu1, ten, string4 + INTO TABLE tmp + FROM onek; +UPDATE tmp + SET stringu1 = reverse_name(onek.stringu1) + FROM onek + WHERE onek.stringu1 = 'JBAAAA' and + onek.stringu1 = tmp.stringu1; +UPDATE tmp + SET stringu1 = reverse_name(onek2.stringu1) + FROM onek2 + WHERE onek2.stringu1 = 'JCAAAA' and + onek2.stringu1 = tmp.stringu1; +DROP TABLE tmp; +--UPDATE person* +-- SET age = age + 1; +--UPDATE person* +-- SET age = age + 3 +-- WHERE name = 'linda'; +-- +-- copy +-- +\set filename :abs_builddir '/results/onek.data' +COPY onek TO :'filename'; +CREATE TEMP TABLE onek_copy (LIKE onek); +COPY onek_copy FROM :'filename'; +SELECT * FROM onek EXCEPT ALL SELECT * FROM onek_copy; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- +(0 rows) + +SELECT * FROM onek_copy EXCEPT ALL SELECT * FROM onek; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- +(0 rows) + +\set filename :abs_builddir '/results/stud_emp.data' +COPY BINARY stud_emp TO :'filename'; +CREATE TEMP TABLE stud_emp_copy (LIKE stud_emp); +COPY BINARY stud_emp_copy FROM :'filename'; +SELECT * FROM stud_emp_copy; + name | age | location | salary | manager | gpa | percent +-------+-----+------------+--------+---------+-----+--------- + jeff | 23 | (8,7.7) | 600 | sharon | 3.5 | + cim | 30 | (10.5,4.7) | 400 | | 3.4 | + linda | 19 | (0.9,6.1) | 100 | | 2.9 | +(3 rows) + +-- +-- test data for postquel functions +-- +CREATE TABLE hobbies_r ( + name text, + person text +); +CREATE TABLE equipment_r ( + name text, + hobby text +); +INSERT INTO hobbies_r (name, person) + SELECT 'posthacking', p.name + FROM person* p + WHERE p.name = 'mike' or p.name = 'jeff'; +INSERT INTO hobbies_r (name, person) + SELECT 'basketball', p.name + FROM person p + WHERE p.name = 'joe' or p.name = 'sally'; +INSERT INTO hobbies_r (name) VALUES ('skywalking'); +INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); +INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); +INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); +INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); +-- +-- postquel functions +-- +CREATE FUNCTION hobbies(person) + RETURNS setof hobbies_r + AS 'select * from hobbies_r where person = $1.name' + LANGUAGE SQL; +CREATE FUNCTION hobby_construct(text, text) + RETURNS hobbies_r + AS 'select $1 as name, $2 as hobby' + LANGUAGE SQL; +CREATE FUNCTION hobby_construct_named(name text, hobby text) + RETURNS hobbies_r + AS 'select name, hobby' + LANGUAGE SQL; +CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) + RETURNS hobbies_r.person%TYPE + AS 'select person from hobbies_r where name = $1' + LANGUAGE SQL; +NOTICE: type reference hobbies_r.name%TYPE converted to text +NOTICE: type reference hobbies_r.person%TYPE converted to text +CREATE FUNCTION equipment(hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = $1.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = hobby.name' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' + LANGUAGE SQL; +CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby' + LANGUAGE SQL; +-- +-- mike does post_hacking, +-- joe and sally play basketball, and +-- everyone else does nothing. +-- +SELECT p.name, name(p.hobbies) FROM ONLY person p; + name | name +-------+------------- + mike | posthacking + joe | basketball + sally | basketball +(3 rows) + +-- +-- as above, but jeff also does post_hacking. +-- +SELECT p.name, name(p.hobbies) FROM person* p; + name | name +-------+------------- + mike | posthacking + joe | basketball + sally | basketball + jeff | posthacking +(4 rows) + +-- +-- the next two queries demonstrate how functions generate bogus duplicates. +-- this is a "feature" .. +-- +SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r + ORDER BY 1,2; + name | name +-------------+--------------- + basketball | hightops + posthacking | advil + posthacking | peet's coffee + skywalking | guts +(4 rows) + +SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; + name | name +-------------+--------------- + posthacking | advil + posthacking | peet's coffee + posthacking | advil + posthacking | peet's coffee + basketball | hightops + basketball | hightops + skywalking | guts +(7 rows) + +-- +-- mike needs advil and peet's coffee, +-- joe and sally need hightops, and +-- everyone else is fine. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; + name | name | name +-------+-------------+--------------- + mike | posthacking | advil + mike | posthacking | peet's coffee + joe | basketball | hightops + sally | basketball | hightops +(4 rows) + +-- +-- as above, but jeff needs advil and peet's coffee as well. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; + name | name | name +-------+-------------+--------------- + mike | posthacking | advil + mike | posthacking | peet's coffee + joe | basketball | hightops + sally | basketball | hightops + jeff | posthacking | advil + jeff | posthacking | peet's coffee +(6 rows) + +-- +-- just like the last two, but make sure that the target list fixup and +-- unflattening is being done correctly. +-- +SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; + name | name | name +---------------+-------+------------- + advil | mike | posthacking + peet's coffee | mike | posthacking + hightops | joe | basketball + hightops | sally | basketball +(4 rows) + +SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; + name | name | name +---------------+-------+------------- + advil | mike | posthacking + peet's coffee | mike | posthacking + hightops | joe | basketball + hightops | sally | basketball + advil | jeff | posthacking + peet's coffee | jeff | posthacking +(6 rows) + +SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; + name | name | name +---------------+-------------+------- + advil | posthacking | mike + peet's coffee | posthacking | mike + hightops | basketball | joe + hightops | basketball | sally +(4 rows) + +SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; + name | name | name +---------------+-------------+------- + advil | posthacking | mike + peet's coffee | posthacking | mike + hightops | basketball | joe + hightops | basketball | sally + advil | posthacking | jeff + peet's coffee | posthacking | jeff +(6 rows) + +SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); + name +------ + guts +(1 row) + +SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); + name +--------------- + advil + peet's coffee + hightops + guts +(4 rows) + +SELECT hobbies_by_name('basketball'); + hobbies_by_name +----------------- + joe +(1 row) + +SELECT name, overpaid(emp.*) FROM emp; + name | overpaid +--------+---------- + sharon | t + sam | t + bill | t + jeff | f + cim | f + linda | f +(6 rows) + +-- +-- Try a few cases with SQL-spec row constructor expressions +-- +SELECT * FROM equipment(ROW('skywalking', 'mer')); + name | hobby +------+------------ + guts | skywalking +(1 row) + +SELECT name(equipment(ROW('skywalking', 'mer'))); + name +------ + guts +(1 row) + +SELECT *, name(equipment(h.*)) FROM hobbies_r h; + name | person | name +-------------+--------+--------------- + posthacking | mike | advil + posthacking | mike | peet's coffee + posthacking | jeff | advil + posthacking | jeff | peet's coffee + basketball | joe | hightops + basketball | sally | hightops + skywalking | | guts +(7 rows) + +SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; + name | person | name +-------------+--------+--------------- + posthacking | mike | advil + posthacking | mike | peet's coffee + posthacking | jeff | advil + posthacking | jeff | peet's coffee + basketball | joe | hightops + basketball | sally | hightops + skywalking | | guts +(7 rows) + +-- +-- functional joins +-- +-- +-- instance rules +-- +-- +-- rewrite rules +-- diff --git a/third_party/spanner_pg/src/test/regress/expected/misc_functions.out b/third_party/spanner_pg/src/test/regress/expected/misc_functions.out index e845042d..01d1ad0b 100644 --- a/third_party/spanner_pg/src/test/regress/expected/misc_functions.out +++ b/third_party/spanner_pg/src/test/regress/expected/misc_functions.out @@ -1,3 +1,7 @@ +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix -- -- num_nulls() -- @@ -133,19 +137,194 @@ ERROR: function num_nulls() does not exist LINE 1: SELECT num_nulls(); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. +-- +-- canonicalize_path() +-- +CREATE FUNCTION test_canonicalize_path(text) + RETURNS text + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; +SELECT test_canonicalize_path('/'); + test_canonicalize_path +------------------------ + / +(1 row) + +SELECT test_canonicalize_path('/./abc/def/'); + test_canonicalize_path +------------------------ + /abc/def +(1 row) + +SELECT test_canonicalize_path('/./../abc/def'); + test_canonicalize_path +------------------------ + /abc/def +(1 row) + +SELECT test_canonicalize_path('/./../../abc/def/'); + test_canonicalize_path +------------------------ + /abc/def +(1 row) + +SELECT test_canonicalize_path('/abc/.././def/ghi'); + test_canonicalize_path +------------------------ + /def/ghi +(1 row) + +SELECT test_canonicalize_path('/abc/./../def/ghi//'); + test_canonicalize_path +------------------------ + /def/ghi +(1 row) + +SELECT test_canonicalize_path('/abc/def/../..'); + test_canonicalize_path +------------------------ + / +(1 row) + +SELECT test_canonicalize_path('/abc/def/../../..'); + test_canonicalize_path +------------------------ + / +(1 row) + +SELECT test_canonicalize_path('/abc/def/../../../../ghi/jkl'); + test_canonicalize_path +------------------------ + /ghi/jkl +(1 row) + +SELECT test_canonicalize_path('.'); + test_canonicalize_path +------------------------ + . +(1 row) + +SELECT test_canonicalize_path('./'); + test_canonicalize_path +------------------------ + . +(1 row) + +SELECT test_canonicalize_path('./abc/..'); + test_canonicalize_path +------------------------ + . +(1 row) + +SELECT test_canonicalize_path('abc/../'); + test_canonicalize_path +------------------------ + . +(1 row) + +SELECT test_canonicalize_path('abc/../def'); + test_canonicalize_path +------------------------ + def +(1 row) + +SELECT test_canonicalize_path('..'); + test_canonicalize_path +------------------------ + .. +(1 row) + +SELECT test_canonicalize_path('../abc/def'); + test_canonicalize_path +------------------------ + ../abc/def +(1 row) + +SELECT test_canonicalize_path('../abc/..'); + test_canonicalize_path +------------------------ + .. +(1 row) + +SELECT test_canonicalize_path('../abc/../def'); + test_canonicalize_path +------------------------ + ../def +(1 row) + +SELECT test_canonicalize_path('../abc/../../def/ghi'); + test_canonicalize_path +------------------------ + ../../def/ghi +(1 row) + +SELECT test_canonicalize_path('./abc/./def/.'); + test_canonicalize_path +------------------------ + abc/def +(1 row) + +SELECT test_canonicalize_path('./abc/././def/.'); + test_canonicalize_path +------------------------ + abc/def +(1 row) + +SELECT test_canonicalize_path('./abc/./def/.././ghi/../../../jkl/mno'); + test_canonicalize_path +------------------------ + ../jkl/mno +(1 row) + -- -- pg_log_backend_memory_contexts() -- -- Memory contexts are logged and they are not returned to the function. -- Furthermore, their contents can vary depending on the timing. However, --- we can at least verify that the code doesn't fail. +-- we can at least verify that the code doesn't fail, and that the +-- permissions are set properly. -- -SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid()); +SELECT pg_log_backend_memory_contexts(pg_backend_pid()); + pg_log_backend_memory_contexts +-------------------------------- + t +(1 row) + +SELECT pg_log_backend_memory_contexts(pid) FROM pg_stat_activity + WHERE backend_type = 'checkpointer'; + pg_log_backend_memory_contexts +-------------------------------- + t +(1 row) + +CREATE ROLE regress_log_memory; +SELECT has_function_privilege('regress_log_memory', + 'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- no + has_function_privilege +------------------------ + f +(1 row) + +GRANT EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) + TO regress_log_memory; +SELECT has_function_privilege('regress_log_memory', + 'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- yes + has_function_privilege +------------------------ + t +(1 row) + +SET ROLE regress_log_memory; +SELECT pg_log_backend_memory_contexts(pg_backend_pid()); pg_log_backend_memory_contexts -------------------------------- t (1 row) +RESET ROLE; +REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) + FROM regress_log_memory; +DROP ROLE regress_log_memory; -- -- Test some built-in SRFs -- @@ -199,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 ------ @@ -214,6 +416,56 @@ select count(*) > 0 from t (1 row) +-- +-- Test replication slot directory functions +-- +CREATE ROLE regress_slot_dir_funcs; +-- Not available by default. +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalsnapdir()', 'EXECUTE'); + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalmapdir()', 'EXECUTE'); + has_function_privilege +------------------------ + f +(1 row) + +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_replslotdir(text)', 'EXECUTE'); + has_function_privilege +------------------------ + f +(1 row) + +GRANT pg_monitor TO regress_slot_dir_funcs; +-- Role is now part of pg_monitor, so these are available. +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalsnapdir()', 'EXECUTE'); + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalmapdir()', 'EXECUTE'); + has_function_privilege +------------------------ + t +(1 row) + +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_replslotdir(text)', 'EXECUTE'); + has_function_privilege +------------------------ + t +(1 row) + +DROP ROLE regress_slot_dir_funcs; -- -- Test adding a support function to a subject function -- @@ -235,6 +487,10 @@ WHERE my_int_eq(a.unique2, 42); (6 rows) -- With support function that knows it's int4eq, we get a different plan +CREATE FUNCTION test_support_func(internal) + RETURNS internal + AS :'regresslib', 'test_support_func' + LANGUAGE C STRICT; ALTER FUNCTION my_int_eq(int, int) SUPPORT test_support_func; EXPLAIN (COSTS OFF) SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 diff --git a/third_party/spanner_pg/src/test/regress/expected/misc_sanity.out b/third_party/spanner_pg/src/test/regress/expected/misc_sanity.out index a67f4019..a57fd142 100644 --- a/third_party/spanner_pg/src/test/regress/expected/misc_sanity.out +++ b/third_party/spanner_pg/src/test/regress/expected/misc_sanity.out @@ -11,75 +11,26 @@ -- NB: run this test early, because some later tests create bogus entries. -- **************** pg_depend **************** -- Look for illegal values in pg_depend fields. --- classid/objid can be zero, but only in 'p' entries SELECT * FROM pg_depend as d1 WHERE refclassid = 0 OR refobjid = 0 OR - deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR - (deptype != 'p' AND (classid = 0 OR objid = 0)) OR - (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); + classid = 0 OR objid = 0 OR + deptype NOT IN ('a', 'e', 'i', 'n', 'x', 'P', 'S'); classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype ---------+-------+----------+------------+----------+-------------+--------- (0 rows) -- **************** pg_shdepend **************** -- Look for illegal values in pg_shdepend fields. --- classid/objid can be zero, but only in 'p' entries SELECT * FROM pg_shdepend as d1 WHERE refclassid = 0 OR refobjid = 0 OR - deptype NOT IN ('a', 'o', 'p', 'r') OR - (deptype != 'p' AND (classid = 0 OR objid = 0)) OR - (deptype = 'p' AND (dbid != 0 OR classid != 0 OR objid != 0 OR objsubid != 0)); + classid = 0 OR objid = 0 OR + deptype NOT IN ('a', 'o', 'r', 't'); dbid | classid | objid | objsubid | refclassid | refobjid | deptype ------+---------+-------+----------+------------+----------+--------- (0 rows) --- Check each OID-containing system catalog to see if its lowest-numbered OID --- is pinned. If not, and if that OID was generated during initdb, then --- perhaps initdb forgot to scan that catalog for pinnable entries. --- Generally, it's okay for a catalog to be listed in the output of this --- test if that catalog is scanned by initdb.c's setup_depend() function; --- whatever OID the test is complaining about must have been added later --- in initdb, where it intentionally isn't pinned. Legitimate exceptions --- to that rule are listed in the comments in setup_depend(). --- Currently, pg_rewrite is also listed by this check, even though it is --- covered by setup_depend(). That happens because there are no rules in --- the pinned data, but initdb creates some intentionally-not-pinned views. -do $$ -declare relnm text; - reloid oid; - shared bool; - lowoid oid; - pinned bool; -begin -for relnm, reloid, shared in - select relname, oid, relisshared from pg_class - where EXISTS( - SELECT * FROM pg_attribute - WHERE attrelid = pg_class.oid AND attname = 'oid') - and relkind = 'r' and oid < 16384 order by 1 -loop - execute 'select min(oid) from ' || relnm into lowoid; - continue when lowoid is null or lowoid >= 16384; - if shared then - pinned := exists(select 1 from pg_shdepend - where refclassid = reloid and refobjid = lowoid - and deptype = 'p'); - else - pinned := exists(select 1 from pg_depend - where refclassid = reloid and refobjid = lowoid - and deptype = 'p'); - end if; - if not pinned then - raise notice '% contains unpinned initdb-created object(s)', relnm; - end if; -end loop; -end$$; -NOTICE: pg_database contains unpinned initdb-created object(s) -NOTICE: pg_extension contains unpinned initdb-created object(s) -NOTICE: pg_rewrite contains unpinned initdb-created object(s) -NOTICE: pg_tablespace contains unpinned initdb-created object(s) -- **************** pg_class **************** -- Look for system tables with varlena columns but no toast table. All -- system tables with toastable columns should have toast tables, with diff --git a/third_party/spanner_pg/src/test/regress/expected/multirangetypes.out b/third_party/spanner_pg/src/test/regress/expected/multirangetypes.out index bde3f248..ac2eb84c 100644 --- a/third_party/spanner_pg/src/test/regress/expected/multirangetypes.out +++ b/third_party/spanner_pg/src/test/regress/expected/multirangetypes.out @@ -2784,6 +2784,70 @@ 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 +-- select range_intersect_agg(nmr) from nummultirange_test; range_intersect_agg --------------------- @@ -2796,13 +2860,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/third_party/spanner_pg/src/test/regress/expected/numeric.out b/third_party/spanner_pg/src/test/regress/expected/numeric.out index 2f2818e0..ea11fee3 100644 --- a/third_party/spanner_pg/src/test/regress/expected/numeric.out +++ b/third_party/spanner_pg/src/test/regress/expected/numeric.out @@ -2205,6 +2205,69 @@ SELECT * FROM num_input_test; -Infinity (13 rows) +-- +-- Test precision and scale typemods +-- +CREATE TABLE num_typemod_test ( + millions numeric(3, -6), + thousands numeric(3, -3), + units numeric(3, 0), + thousandths numeric(3, 3), + millionths numeric(3, 6) +); +\d num_typemod_test + Table "public.num_typemod_test" + Column | Type | Collation | Nullable | Default +-------------+---------------+-----------+----------+--------- + millions | numeric(3,-6) | | | + thousands | numeric(3,-3) | | | + units | numeric(3,0) | | | + thousandths | numeric(3,3) | | | + millionths | numeric(3,6) | | | + +-- rounding of valid inputs +INSERT INTO num_typemod_test VALUES (123456, 123, 0.123, 0.000123, 0.000000123); +INSERT INTO num_typemod_test VALUES (654321, 654, 0.654, 0.000654, 0.000000654); +INSERT INTO num_typemod_test VALUES (2345678, 2345, 2.345, 0.002345, 0.000002345); +INSERT INTO num_typemod_test VALUES (7654321, 7654, 7.654, 0.007654, 0.000007654); +INSERT INTO num_typemod_test VALUES (12345678, 12345, 12.345, 0.012345, 0.000012345); +INSERT INTO num_typemod_test VALUES (87654321, 87654, 87.654, 0.087654, 0.000087654); +INSERT INTO num_typemod_test VALUES (123456789, 123456, 123.456, 0.123456, 0.000123456); +INSERT INTO num_typemod_test VALUES (987654321, 987654, 987.654, 0.987654, 0.000987654); +INSERT INTO num_typemod_test VALUES ('NaN', 'NaN', 'NaN', 'NaN', 'NaN'); +SELECT scale(millions), * FROM num_typemod_test ORDER BY millions; + scale | millions | thousands | units | thousandths | millionths +-------+-----------+-----------+-------+-------------+------------ + 0 | 0 | 0 | 0 | 0.000 | 0.000000 + 0 | 1000000 | 1000 | 1 | 0.001 | 0.000001 + 0 | 2000000 | 2000 | 2 | 0.002 | 0.000002 + 0 | 8000000 | 8000 | 8 | 0.008 | 0.000008 + 0 | 12000000 | 12000 | 12 | 0.012 | 0.000012 + 0 | 88000000 | 88000 | 88 | 0.088 | 0.000088 + 0 | 123000000 | 123000 | 123 | 0.123 | 0.000123 + 0 | 988000000 | 988000 | 988 | 0.988 | 0.000988 + | NaN | NaN | NaN | NaN | NaN +(9 rows) + +-- invalid inputs +INSERT INTO num_typemod_test (millions) VALUES ('inf'); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale -6 cannot hold an infinite value. +INSERT INTO num_typemod_test (millions) VALUES (999500000); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale -6 must round to an absolute value less than 10^9. +INSERT INTO num_typemod_test (thousands) VALUES (999500); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale -3 must round to an absolute value less than 10^6. +INSERT INTO num_typemod_test (units) VALUES (999.5); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale 0 must round to an absolute value less than 10^3. +INSERT INTO num_typemod_test (thousandths) VALUES (0.9995); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale 3 must round to an absolute value less than 1. +INSERT INTO num_typemod_test (millionths) VALUES (0.0009995); +ERROR: numeric field overflow +DETAIL: A field with precision 3, scale 6 must round to an absolute value less than 10^-3. -- -- Test some corner cases for multiplication -- @@ -3120,6 +3183,56 @@ SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000); -999900000 (1 row) +-- +-- Tests for VARIANCE() +-- +CREATE TABLE num_variance (a numeric); +INSERT INTO num_variance VALUES (0); +INSERT INTO num_variance VALUES (3e-500); +INSERT INTO num_variance VALUES (-3e-500); +INSERT INTO num_variance VALUES (4e-500 - 1e-16383); +INSERT INTO num_variance VALUES (-4e-500 + 1e-16383); +-- variance is just under 12.5e-1000 and so should round down to 12e-1000 +SELECT trim_scale(variance(a) * 1e1000) FROM num_variance; + trim_scale +------------ + 12 +(1 row) + +-- check that parallel execution produces the same result +BEGIN; +ALTER TABLE num_variance SET (parallel_workers = 4); +SET LOCAL parallel_setup_cost = 0; +SET LOCAL max_parallel_workers_per_gather = 4; +SELECT trim_scale(variance(a) * 1e1000) FROM num_variance; + trim_scale +------------ + 12 +(1 row) + +ROLLBACK; +-- case where sum of squares would overflow but variance does not +DELETE FROM num_variance; +INSERT INTO num_variance SELECT 9e131071 + x FROM generate_series(1, 5) x; +SELECT variance(a) FROM num_variance; + variance +-------------------- + 2.5000000000000000 +(1 row) + +-- check that parallel execution produces the same result +BEGIN; +ALTER TABLE num_variance SET (parallel_workers = 4); +SET LOCAL parallel_setup_cost = 0; +SET LOCAL max_parallel_workers_per_gather = 4; +SELECT variance(a) FROM num_variance; + variance +-------------------- + 2.5000000000000000 +(1 row) + +ROLLBACK; +DROP TABLE num_variance; -- -- Tests for GCD() -- diff --git a/third_party/spanner_pg/src/test/regress/expected/numerology.out b/third_party/spanner_pg/src/test/regress/expected/numerology.out index 44d6c435..77d48434 100644 --- a/third_party/spanner_pg/src/test/regress/expected/numerology.out +++ b/third_party/spanner_pg/src/test/regress/expected/numerology.out @@ -3,6 +3,49 @@ -- Test various combinations of numeric types and functions. -- -- +-- Trailing junk in numeric literals +-- +SELECT 123abc; +ERROR: trailing junk after numeric literal at or near "123a" +LINE 1: SELECT 123abc; + ^ +SELECT 0x0o; +ERROR: trailing junk after numeric literal at or near "0x" +LINE 1: SELECT 0x0o; + ^ +SELECT 1_2_3; +ERROR: trailing junk after numeric literal at or near "1_" +LINE 1: SELECT 1_2_3; + ^ +SELECT 0.a; +ERROR: trailing junk after numeric literal at or near "0.a" +LINE 1: SELECT 0.a; + ^ +SELECT 0.0a; +ERROR: trailing junk after numeric literal at or near "0.0a" +LINE 1: SELECT 0.0a; + ^ +SELECT .0a; +ERROR: trailing junk after numeric literal at or near ".0a" +LINE 1: SELECT .0a; + ^ +SELECT 0.0e1a; +ERROR: trailing junk after numeric literal at or near "0.0e1a" +LINE 1: SELECT 0.0e1a; + ^ +SELECT 0.0e; +ERROR: trailing junk after numeric literal at or near "0.0e" +LINE 1: SELECT 0.0e; + ^ +SELECT 0.0e+a; +ERROR: trailing junk after numeric literal at or near "0.0e+" +LINE 1: SELECT 0.0e+a; + ^ +PREPARE p1 AS SELECT $1a; +ERROR: trailing junk after parameter at or near "$1a" +LINE 1: PREPARE p1 AS SELECT $1a; + ^ +-- -- Test implicit type conversions -- This fails for Postgres v6.1 (and earlier?) -- so let's try explicit conversions for now - tgl 97/05/07 diff --git a/third_party/spanner_pg/src/test/regress/expected/object_address.out b/third_party/spanner_pg/src/test/regress/expected/object_address.out index 388097a6..3549b63a 100644 --- a/third_party/spanner_pg/src/test/regress/expected/object_address.out +++ b/third_party/spanner_pg/src/test/regress/expected/object_address.out @@ -45,6 +45,7 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( -- suppress warning that depends on wal_level SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; +CREATE PUBLICATION addr_pub_schema FOR TABLES 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 @@ -104,7 +105,7 @@ BEGIN ('text search template'), ('text search configuration'), ('policy'), ('user mapping'), ('default acl'), ('transform'), ('operator of access method'), ('function of access method'), - ('publication relation') + ('publication namespace'), ('publication relation') LOOP FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}') LOOP @@ -284,10 +285,10 @@ WARNING: error for policy,{eins,zwei,drei},{}: schema "eins" does not exist WARNING: error for policy,{eins,zwei,drei},{integer}: schema "eins" does not exist WARNING: error for user mapping,{eins},{}: argument list length must be exactly 1 WARNING: error for user mapping,{eins},{integer}: user mapping for user "eins" on server "integer" does not exist -WARNING: error for user mapping,{addr_nsp,zwei},{}: argument list length must be exactly 1 -WARNING: error for user mapping,{addr_nsp,zwei},{integer}: user mapping for user "addr_nsp" on server "integer" does not exist -WARNING: error for user mapping,{eins,zwei,drei},{}: argument list length must be exactly 1 -WARNING: error for user mapping,{eins,zwei,drei},{integer}: user mapping for user "eins" on server "integer" does not exist +WARNING: error for user mapping,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for user mapping,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for user mapping,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for user mapping,{eins,zwei,drei},{integer}: name list length must be exactly 1 WARNING: error for default acl,{eins},{}: argument list length must be exactly 1 WARNING: error for default acl,{eins},{integer}: unrecognized default ACL object type "i" WARNING: error for default acl,{addr_nsp,zwei},{}: argument list length must be exactly 1 @@ -312,6 +313,12 @@ WARNING: error for function of access method,{addr_nsp,zwei},{}: name list leng WARNING: error for function of access method,{addr_nsp,zwei},{integer}: name list length must be at least 3 WARNING: error for function of access method,{eins,zwei,drei},{}: argument list length must be exactly 2 WARNING: error for function of access method,{eins,zwei,drei},{integer}: argument list length must be exactly 2 +WARNING: error for publication namespace,{eins},{}: argument list length must be exactly 1 +WARNING: error for publication namespace,{eins},{integer}: schema "eins" does not exist +WARNING: error for publication namespace,{addr_nsp,zwei},{}: name list length must be exactly 1 +WARNING: error for publication namespace,{addr_nsp,zwei},{integer}: name list length must be exactly 1 +WARNING: error for publication namespace,{eins,zwei,drei},{}: name list length must be exactly 1 +WARNING: error for publication namespace,{eins,zwei,drei},{integer}: name list length must be exactly 1 WARNING: error for publication relation,{eins},{}: argument list length must be exactly 1 WARNING: error for publication relation,{eins},{integer}: relation "eins" does not exist WARNING: error for publication relation,{addr_nsp,zwei},{}: argument list length must be exactly 1 @@ -427,6 +434,7 @@ WITH objects (type, name, args) AS (VALUES ('transform', '{int}', '{sql}'), ('access method', '{btree}', '{}'), ('publication', '{addr_pub}', '{}'), + ('publication namespace', '{addr_nsp}', '{addr_pub_schema}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -490,7 +498,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 -(49 rows) + publication namespace | | | addr_nsp in publication addr_pub_schema | t +(50 rows) --- --- Cleanup resources @@ -502,6 +511,7 @@ drop cascades to foreign table genftable 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 SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; NOTICE: drop cascades to 14 other objects @@ -554,7 +564,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/third_party/spanner_pg/src/test/regress/expected/oidjoins.out b/third_party/spanner_pg/src/test/regress/expected/oidjoins.out index 1461e947..215eb899 100644 --- a/third_party/spanner_pg/src/test/regress/expected/oidjoins.out +++ b/third_party/spanner_pg/src/test/regress/expected/oidjoins.out @@ -258,6 +258,8 @@ NOTICE: checking pg_transform {trftosql} => pg_proc {oid} NOTICE: checking pg_sequence {seqrelid} => pg_class {oid} NOTICE: checking pg_sequence {seqtypid} => pg_type {oid} NOTICE: checking pg_publication {pubowner} => pg_authid {oid} +NOTICE: checking pg_publication_namespace {pnpubid} => pg_publication {oid} +NOTICE: checking pg_publication_namespace {pnnspid} => pg_namespace {oid} NOTICE: checking pg_publication_rel {prpubid} => pg_publication {oid} NOTICE: checking pg_publication_rel {prrelid} => pg_class {oid} NOTICE: checking pg_subscription {subdbid} => pg_database {oid} diff --git a/third_party/spanner_pg/src/test/regress/expected/opr_sanity.out b/third_party/spanner_pg/src/test/regress/expected/opr_sanity.out index 69475d84..ba5875dc 100644 --- a/third_party/spanner_pg/src/test/regress/expected/opr_sanity.out +++ b/third_party/spanner_pg/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 @@ -991,9 +992,9 @@ WHERE c.castmethod = 'b' AND -- **************** pg_conversion **************** -- Look for illegal values in pg_conversion fields. -SELECT p1.oid, p1.conname -FROM pg_conversion as p1 -WHERE p1.conproc = 0 OR +SELECT c.oid, c.conname +FROM pg_conversion as c +WHERE c.conproc = 0 OR pg_encoding_to_char(conforencoding) = '' OR pg_encoding_to_char(contoencoding) = ''; oid | conname @@ -1025,8 +1026,8 @@ WHERE p.oid = c.conproc AND -- them directly from SQL. But there are no non-default built-in -- conversions anyway. -- (Similarly, this doesn't cope with any search path issues.) -SELECT p1.oid, p1.conname -FROM pg_conversion as p1 +SELECT c.oid, c.conname +FROM pg_conversion as c WHERE condefault AND convert('ABC'::bytea, pg_encoding_to_char(conforencoding), pg_encoding_to_char(contoencoding)) != 'ABC'; @@ -1036,32 +1037,32 @@ WHERE condefault AND -- **************** pg_operator **************** -- Look for illegal values in pg_operator fields. -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 -WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l') OR - p1.oprresult = 0 OR p1.oprcode = 0; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 +WHERE (o1.oprkind != 'b' AND o1.oprkind != 'l') OR + o1.oprresult = 0 OR o1.oprcode = 0; oid | oprname -----+--------- (0 rows) -- Look for missing or unwanted operand types -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 -WHERE (p1.oprleft = 0 and p1.oprkind != 'l') OR - (p1.oprleft != 0 and p1.oprkind = 'l') OR - p1.oprright = 0; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 +WHERE (o1.oprleft = 0 and o1.oprkind != 'l') OR + (o1.oprleft != 0 and o1.oprkind = 'l') OR + o1.oprright = 0; oid | oprname -----+--------- (0 rows) -- Look for conflicting operator definitions (same names and input datatypes). -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oid != p2.oid AND - p1.oprname = p2.oprname AND - p1.oprkind = p2.oprkind AND - p1.oprleft = p2.oprleft AND - p1.oprright = p2.oprright; +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oid != o2.oid AND + o1.oprname = o2.oprname AND + o1.oprkind = o2.oprkind AND + o1.oprleft = o2.oprleft AND + o1.oprright = o2.oprright; oid | oprcode | oid | oprcode -----+---------+-----+--------- (0 rows) @@ -1070,14 +1071,14 @@ WHERE p1.oid != p2.oid AND -- DEFINITIONAL NOTE: If A.oprcom = B, then x A y has the same result as y B x. -- We expect that B will always say that B.oprcom = A as well; that's not -- inherently essential, but it would be inefficient not to mark it so. -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprcom = p2.oid AND - (p1.oprkind != 'b' OR - p1.oprleft != p2.oprright OR - p1.oprright != p2.oprleft OR - p1.oprresult != p2.oprresult OR - p1.oid != p2.oprcom); +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprcom = o2.oid AND + (o1.oprkind != 'b' OR + o1.oprleft != o2.oprright OR + o1.oprright != o2.oprleft OR + o1.oprresult != o2.oprresult OR + o1.oid != o2.oprcom); oid | oprcode | oid | oprcode -----+---------+-----+--------- (0 rows) @@ -1089,16 +1090,16 @@ WHERE p1.oprcom = p2.oid AND -- We expect that B will always say that B.oprnegate = A as well; that's not -- inherently essential, but it would be inefficient not to mark it so. -- Also, A and B had better not be the same operator. -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprnegate = p2.oid AND - (p1.oprkind != p2.oprkind OR - p1.oprleft != p2.oprleft OR - p1.oprright != p2.oprright OR - p1.oprresult != 'bool'::regtype OR - p2.oprresult != 'bool'::regtype OR - p1.oid != p2.oprnegate OR - p1.oid = p2.oid); +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprnegate = o2.oid AND + (o1.oprkind != o2.oprkind OR + o1.oprleft != o2.oprleft OR + o1.oprright != o2.oprright OR + o1.oprresult != 'bool'::regtype OR + o2.oprresult != 'bool'::regtype OR + o1.oid != o2.oprnegate OR + o1.oid = o2.oid); oid | oprcode | oid | oprcode -----+---------+-----+--------- (0 rows) @@ -1168,100 +1169,100 @@ ORDER BY 1, 2; -- A mergejoinable or hashjoinable operator must be binary, must return -- boolean, and must have a commutator (itself, unless it's a cross-type -- operator). -SELECT p1.oid, p1.oprname FROM pg_operator AS p1 -WHERE (p1.oprcanmerge OR p1.oprcanhash) AND NOT - (p1.oprkind = 'b' AND p1.oprresult = 'bool'::regtype AND p1.oprcom != 0); +SELECT o1.oid, o1.oprname FROM pg_operator AS o1 +WHERE (o1.oprcanmerge OR o1.oprcanhash) AND NOT + (o1.oprkind = 'b' AND o1.oprresult = 'bool'::regtype AND o1.oprcom != 0); oid | oprname -----+--------- (0 rows) -- What's more, the commutator had better be mergejoinable/hashjoinable too. -SELECT p1.oid, p1.oprname, p2.oid, p2.oprname -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprcom = p2.oid AND - (p1.oprcanmerge != p2.oprcanmerge OR - p1.oprcanhash != p2.oprcanhash); +SELECT o1.oid, o1.oprname, o2.oid, o2.oprname +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprcom = o2.oid AND + (o1.oprcanmerge != o2.oprcanmerge OR + o1.oprcanhash != o2.oprcanhash); oid | oprname | oid | oprname -----+---------+-----+--------- (0 rows) -- Mergejoinable operators should appear as equality members of btree index -- opfamilies. -SELECT p1.oid, p1.oprname -FROM pg_operator AS p1 -WHERE p1.oprcanmerge AND NOT EXISTS +SELECT o1.oid, o1.oprname +FROM pg_operator AS o1 +WHERE o1.oprcanmerge AND NOT EXISTS (SELECT 1 FROM pg_amop WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND - amopopr = p1.oid AND amopstrategy = 3); + amopopr = o1.oid AND amopstrategy = 3); oid | oprname -----+--------- (0 rows) -- And the converse. -SELECT p1.oid, p1.oprname, p.amopfamily -FROM pg_operator AS p1, pg_amop p -WHERE amopopr = p1.oid +SELECT o1.oid, o1.oprname, p.amopfamily +FROM pg_operator AS o1, pg_amop p +WHERE amopopr = o1.oid AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND amopstrategy = 3 - AND NOT p1.oprcanmerge; + AND NOT o1.oprcanmerge; oid | oprname | amopfamily -----+---------+------------ (0 rows) -- Hashable operators should appear as members of hash index opfamilies. -SELECT p1.oid, p1.oprname -FROM pg_operator AS p1 -WHERE p1.oprcanhash AND NOT EXISTS +SELECT o1.oid, o1.oprname +FROM pg_operator AS o1 +WHERE o1.oprcanhash AND NOT EXISTS (SELECT 1 FROM pg_amop WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') AND - amopopr = p1.oid AND amopstrategy = 1); + amopopr = o1.oid AND amopstrategy = 1); oid | oprname -----+--------- (0 rows) -- And the converse. -SELECT p1.oid, p1.oprname, p.amopfamily -FROM pg_operator AS p1, pg_amop p -WHERE amopopr = p1.oid +SELECT o1.oid, o1.oprname, p.amopfamily +FROM pg_operator AS o1, pg_amop p +WHERE amopopr = o1.oid AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') - AND NOT p1.oprcanhash; + AND NOT o1.oprcanhash; oid | oprname | amopfamily -----+---------+------------ (0 rows) -- Check that each operator defined in pg_operator matches its oprcode entry -- in pg_proc. Easiest to do this separately for each oprkind. -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - p1.oprkind = 'b' AND - (p2.pronargs != 2 - OR NOT binary_coercible(p2.prorettype, p1.oprresult) - OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0]) - OR NOT binary_coercible(p1.oprright, p2.proargtypes[1])); +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + o1.oprkind = 'b' AND + (p1.pronargs != 2 + OR NOT binary_coercible(p1.prorettype, o1.oprresult) + OR NOT binary_coercible(o1.oprleft, p1.proargtypes[0]) + OR NOT binary_coercible(o1.oprright, p1.proargtypes[1])); oid | oprname | oid | proname -----+---------+-----+--------- (0 rows) -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - p1.oprkind = 'l' AND - (p2.pronargs != 1 - OR NOT binary_coercible(p2.prorettype, p1.oprresult) - OR NOT binary_coercible(p1.oprright, p2.proargtypes[0]) - OR p1.oprleft != 0); +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + o1.oprkind = 'l' AND + (p1.pronargs != 1 + OR NOT binary_coercible(p1.prorettype, o1.oprresult) + OR NOT binary_coercible(o1.oprright, p1.proargtypes[0]) + OR o1.oprleft != 0); oid | oprname | oid | proname -----+---------+-----+--------- (0 rows) -- If the operator is mergejoinable or hashjoinable, its underlying function -- should not be volatile. -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - (p1.oprcanmerge OR p1.oprcanhash) AND - p2.provolatile = 'v'; +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + (o1.oprcanmerge OR o1.oprcanhash) AND + p1.provolatile = 'v'; oid | oprname | oid | proname -----+---------+-----+--------- (0 rows) @@ -1270,10 +1271,10 @@ WHERE p1.oprcode = p2.oid AND -- and it must link to a proc with the right signature -- to be a restriction selectivity estimator. -- The proc signature we want is: float8 proc(internal, oid, internal, int4) -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprrest = p2.oid AND - (p1.oprresult != 'bool'::regtype OR +SELECT o1.oid, o1.oprname, p2.oid, p2.proname +FROM pg_operator AS o1, pg_proc AS p2 +WHERE o1.oprrest = p2.oid AND + (o1.oprresult != 'bool'::regtype OR p2.prorettype != 'float8'::regtype OR p2.proretset OR p2.pronargs != 4 OR p2.proargtypes[0] != 'internal'::regtype OR @@ -1290,10 +1291,10 @@ WHERE p1.oprrest = p2.oid AND -- The proc signature we want is: float8 proc(internal, oid, internal, int2, internal) -- (Note: the old signature with only 4 args is still allowed, but no core -- estimator should be using it.) -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprjoin = p2.oid AND - (p1.oprkind != 'b' OR p1.oprresult != 'bool'::regtype OR +SELECT o1.oid, o1.oprname, p2.oid, p2.proname +FROM pg_operator AS o1, pg_proc AS p2 +WHERE o1.oprjoin = p2.oid AND + (o1.oprkind != 'b' OR o1.oprresult != 'bool'::regtype OR p2.prorettype != 'float8'::regtype OR p2.proretset OR p2.pronargs != 5 OR p2.proargtypes[0] != 'internal'::regtype OR @@ -1306,10 +1307,10 @@ WHERE p1.oprjoin = p2.oid AND (0 rows) -- Insist that all built-in pg_operator entries have descriptions -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 LEFT JOIN pg_description as d - ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 -WHERE d.classoid IS NULL AND p1.oid <= 9999; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 LEFT JOIN pg_description as d + ON o1.tableoid = d.classoid and o1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND o1.oid <= 9999; oid | oprname -----+--------- (0 rows) @@ -1417,7 +1418,7 @@ ORDER BY 1; -- **************** pg_aggregate **************** -- Look for illegal values in pg_aggregate fields. SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggfnoid = 0 OR aggtransfn = 0 OR aggkind NOT IN ('n', 'o', 'h') OR aggnumdirectargs < 0 OR @@ -1518,7 +1519,7 @@ WHERE a.aggfnoid = p.oid AND -- Check for inconsistent specifications of moving-aggregate columns. SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggmtranstype != 0 AND (aggmtransfn = 0 OR aggminvtransfn = 0); ctid | aggfnoid @@ -1526,7 +1527,7 @@ WHERE aggmtranstype != 0 AND (0 rows) SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggmtranstype = 0 AND (aggmtransfn != 0 OR aggminvtransfn != 0 OR aggmfinalfn != 0 OR aggmtransspace != 0 OR aggminitval IS NOT NULL); @@ -1809,9 +1810,9 @@ WHERE prokind = 'a' AND provariadic != 0 AND a.aggkind = 'n'; -- **************** pg_opfamily **************** -- Look for illegal values in pg_opfamily fields -SELECT p1.oid -FROM pg_opfamily as p1 -WHERE p1.opfmethod = 0 OR p1.opfnamespace = 0; +SELECT f.oid +FROM pg_opfamily as f +WHERE f.opfmethod = 0 OR f.opfnamespace = 0; oid ----- (0 rows) @@ -1828,29 +1829,29 @@ WHERE NOT EXISTS (SELECT 1 FROM pg_opclass WHERE opcfamily = f.oid); -- **************** pg_opclass **************** -- Look for illegal values in pg_opclass fields -SELECT p1.oid -FROM pg_opclass AS p1 -WHERE p1.opcmethod = 0 OR p1.opcnamespace = 0 OR p1.opcfamily = 0 - OR p1.opcintype = 0; +SELECT c1.oid +FROM pg_opclass AS c1 +WHERE c1.opcmethod = 0 OR c1.opcnamespace = 0 OR c1.opcfamily = 0 + OR c1.opcintype = 0; oid ----- (0 rows) -- opcmethod must match owning opfamily's opfmethod -SELECT p1.oid, p2.oid -FROM pg_opclass AS p1, pg_opfamily AS p2 -WHERE p1.opcfamily = p2.oid AND p1.opcmethod != p2.opfmethod; +SELECT c1.oid, f1.oid +FROM pg_opclass AS c1, pg_opfamily AS f1 +WHERE c1.opcfamily = f1.oid AND c1.opcmethod != f1.opfmethod; oid | oid -----+----- (0 rows) -- There should not be multiple entries in pg_opclass with opcdefault true -- and the same opcmethod/opcintype combination. -SELECT p1.oid, p2.oid -FROM pg_opclass AS p1, pg_opclass AS p2 -WHERE p1.oid != p2.oid AND - p1.opcmethod = p2.opcmethod AND p1.opcintype = p2.opcintype AND - p1.opcdefault AND p2.opcdefault; +SELECT c1.oid, c2.oid +FROM pg_opclass AS c1, pg_opclass AS c2 +WHERE c1.oid != c2.oid AND + c1.opcmethod = c2.opcmethod AND c1.opcintype = c2.opcintype AND + c1.opcdefault AND c2.opcdefault; oid | oid -----+----- (0 rows) @@ -1864,59 +1865,59 @@ SELECT oid, opcname FROM pg_opclass WHERE NOT amvalidate(oid); -- **************** pg_am **************** -- Look for illegal values in pg_am fields -SELECT p1.oid, p1.amname -FROM pg_am AS p1 -WHERE p1.amhandler = 0; +SELECT a1.oid, a1.amname +FROM pg_am AS a1 +WHERE a1.amhandler = 0; oid | amname -----+-------- (0 rows) -- Check for index amhandler functions with the wrong signature -SELECT p1.oid, p1.amname, p2.oid, p2.proname -FROM pg_am AS p1, pg_proc AS p2 -WHERE p2.oid = p1.amhandler AND p1.amtype = 'i' AND - (p2.prorettype != 'index_am_handler'::regtype - OR p2.proretset - OR p2.pronargs != 1 - OR p2.proargtypes[0] != 'internal'::regtype); +SELECT a1.oid, a1.amname, p1.oid, p1.proname +FROM pg_am AS a1, pg_proc AS p1 +WHERE p1.oid = a1.amhandler AND a1.amtype = 'i' AND + (p1.prorettype != 'index_am_handler'::regtype + OR p1.proretset + OR p1.pronargs != 1 + OR p1.proargtypes[0] != 'internal'::regtype); oid | amname | oid | proname -----+--------+-----+--------- (0 rows) -- Check for table amhandler functions with the wrong signature -SELECT p1.oid, p1.amname, p2.oid, p2.proname -FROM pg_am AS p1, pg_proc AS p2 -WHERE p2.oid = p1.amhandler AND p1.amtype = 's' AND - (p2.prorettype != 'table_am_handler'::regtype - OR p2.proretset - OR p2.pronargs != 1 - OR p2.proargtypes[0] != 'internal'::regtype); +SELECT a1.oid, a1.amname, p1.oid, p1.proname +FROM pg_am AS a1, pg_proc AS p1 +WHERE p1.oid = a1.amhandler AND a1.amtype = 't' AND + (p1.prorettype != 'table_am_handler'::regtype + OR p1.proretset + OR p1.pronargs != 1 + OR p1.proargtypes[0] != 'internal'::regtype); oid | amname | oid | proname -----+--------+-----+--------- (0 rows) -- **************** pg_amop **************** -- Look for illegal values in pg_amop fields -SELECT p1.amopfamily, p1.amopstrategy -FROM pg_amop as p1 -WHERE p1.amopfamily = 0 OR p1.amoplefttype = 0 OR p1.amoprighttype = 0 - OR p1.amopopr = 0 OR p1.amopmethod = 0 OR p1.amopstrategy < 1; +SELECT a1.amopfamily, a1.amopstrategy +FROM pg_amop as a1 +WHERE a1.amopfamily = 0 OR a1.amoplefttype = 0 OR a1.amoprighttype = 0 + OR a1.amopopr = 0 OR a1.amopmethod = 0 OR a1.amopstrategy < 1; amopfamily | amopstrategy ------------+-------------- (0 rows) -SELECT p1.amopfamily, p1.amopstrategy -FROM pg_amop as p1 -WHERE NOT ((p1.amoppurpose = 's' AND p1.amopsortfamily = 0) OR - (p1.amoppurpose = 'o' AND p1.amopsortfamily <> 0)); +SELECT a1.amopfamily, a1.amopstrategy +FROM pg_amop as a1 +WHERE NOT ((a1.amoppurpose = 's' AND a1.amopsortfamily = 0) OR + (a1.amoppurpose = 'o' AND a1.amopsortfamily <> 0)); amopfamily | amopstrategy ------------+-------------- (0 rows) -- amopmethod must match owning opfamily's opfmethod -SELECT p1.oid, p2.oid -FROM pg_amop AS p1, pg_opfamily AS p2 -WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; +SELECT a1.oid, f1.oid +FROM pg_amop AS a1, pg_opfamily AS f1 +WHERE a1.amopfamily = f1.oid AND a1.amopmethod != f1.opfmethod; oid | oid -----+----- (0 rows) @@ -1926,7 +1927,7 @@ WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; -- in future releases, but it's an effective way of spotting mistakes such as -- swapping two operators within a family. SELECT DISTINCT amopmethod, amopstrategy, oprname -FROM pg_amop p1 LEFT JOIN pg_operator p2 ON amopopr = p2.oid +FROM pg_amop a1 LEFT JOIN pg_operator o1 ON amopopr = o1.oid ORDER BY 1, 2, 3; amopmethod | amopstrategy | oprname ------------+--------------+--------- @@ -2059,21 +2060,21 @@ ORDER BY 1, 2, 3; -- Check that all opclass search operators have selectivity estimators. -- This is not absolutely required, but it seems a reasonable thing -- to insist on for all standard datatypes. -SELECT p1.amopfamily, p1.amopopr, p2.oid, p2.oprname -FROM pg_amop AS p1, pg_operator AS p2 -WHERE p1.amopopr = p2.oid AND p1.amoppurpose = 's' AND - (p2.oprrest = 0 OR p2.oprjoin = 0); +SELECT a1.amopfamily, a1.amopopr, o1.oid, o1.oprname +FROM pg_amop AS a1, pg_operator AS o1 +WHERE a1.amopopr = o1.oid AND a1.amoppurpose = 's' AND + (o1.oprrest = 0 OR o1.oprjoin = 0); amopfamily | amopopr | oid | oprname ------------+---------+-----+--------- (0 rows) -- Check that each opclass in an opfamily has associated operators, that is -- ones whose oprleft matches opcintype (possibly by coercion). -SELECT p1.opcname, p1.opcfamily -FROM pg_opclass AS p1 -WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 - WHERE p2.amopfamily = p1.opcfamily - AND binary_coercible(p1.opcintype, p2.amoplefttype)); +SELECT c1.opcname, c1.opcfamily +FROM pg_opclass AS c1 +WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS a1 + WHERE a1.amopfamily = c1.opcfamily + AND binary_coercible(c1.opcintype, a1.amoplefttype)); opcname | opcfamily ---------+----------- (0 rows) @@ -2084,11 +2085,11 @@ WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 -- (In principle it could be useful to list such operators in multiple-datatype -- btree opfamilies, but in practice you'd expect there to be an opclass for -- every datatype the family knows about.) -SELECT p1.amopfamily, p1.amopstrategy, p1.amopopr -FROM pg_amop AS p1 -WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS p2 - WHERE p2.opcfamily = p1.amopfamily - AND binary_coercible(p2.opcintype, p1.amoplefttype)); +SELECT a1.amopfamily, a1.amopstrategy, a1.amopopr +FROM pg_amop AS a1 +WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS c1 + WHERE c1.opcfamily = a1.amopfamily + AND binary_coercible(c1.opcintype, a1.amoplefttype)); amopfamily | amopstrategy | amopopr ------------+--------------+--------- (0 rows) @@ -2097,30 +2098,30 @@ WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS p2 -- it suggests that the index ordering isn't fixed). Operators that are -- cross-type members need only be stable, since they are just shorthands -- for index probe queries. -SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc -FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 -WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND - p1.amoplefttype = p1.amoprighttype AND - p3.provolatile != 'i'; +SELECT a1.amopfamily, a1.amopopr, o1.oprname, p1.prosrc +FROM pg_amop AS a1, pg_operator AS o1, pg_proc AS p1 +WHERE a1.amopopr = o1.oid AND o1.oprcode = p1.oid AND + a1.amoplefttype = a1.amoprighttype AND + p1.provolatile != 'i'; amopfamily | amopopr | oprname | prosrc ------------+---------+---------+-------- (0 rows) -SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc -FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 -WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND - p1.amoplefttype != p1.amoprighttype AND - p3.provolatile = 'v'; +SELECT a1.amopfamily, a1.amopopr, o1.oprname, p1.prosrc +FROM pg_amop AS a1, pg_operator AS o1, pg_proc AS p1 +WHERE a1.amopopr = o1.oid AND o1.oprcode = p1.oid AND + a1.amoplefttype != a1.amoprighttype AND + p1.provolatile = 'v'; amopfamily | amopopr | oprname | prosrc ------------+---------+---------+-------- (0 rows) -- **************** pg_amproc **************** -- Look for illegal values in pg_amproc fields -SELECT p1.amprocfamily, p1.amprocnum -FROM pg_amproc as p1 -WHERE p1.amprocfamily = 0 OR p1.amproclefttype = 0 OR p1.amprocrighttype = 0 - OR p1.amprocnum < 0 OR p1.amproc = 0; +SELECT a1.amprocfamily, a1.amprocnum +FROM pg_amproc as a1 +WHERE a1.amprocfamily = 0 OR a1.amproclefttype = 0 OR a1.amprocrighttype = 0 + OR a1.amprocnum < 0 OR a1.amproc = 0; amprocfamily | amprocnum --------------+----------- (0 rows) @@ -2129,20 +2130,20 @@ WHERE p1.amprocfamily = 0 OR p1.amproclefttype = 0 OR p1.amprocrighttype = 0 -- (else it suggests that the index ordering isn't fixed). But cross-type -- members need only be stable, since they are just shorthands -- for index probe queries. -SELECT p1.amprocfamily, p1.amproc, p2.prosrc -FROM pg_amproc AS p1, pg_proc AS p2 -WHERE p1.amproc = p2.oid AND - p1.amproclefttype = p1.amprocrighttype AND - p2.provolatile != 'i'; +SELECT a1.amprocfamily, a1.amproc, p1.prosrc +FROM pg_amproc AS a1, pg_proc AS p1 +WHERE a1.amproc = p1.oid AND + a1.amproclefttype = a1.amprocrighttype AND + p1.provolatile != 'i'; amprocfamily | amproc | prosrc --------------+--------+-------- (0 rows) -SELECT p1.amprocfamily, p1.amproc, p2.prosrc -FROM pg_amproc AS p1, pg_proc AS p2 -WHERE p1.amproc = p2.oid AND - p1.amproclefttype != p1.amprocrighttype AND - p2.provolatile = 'v'; +SELECT a1.amprocfamily, a1.amproc, p1.prosrc +FROM pg_amproc AS a1, pg_proc AS p1 +WHERE a1.amproc = p1.oid AND + a1.amproclefttype != a1.amprocrighttype AND + p1.provolatile = 'v'; amprocfamily | amproc | prosrc --------------+--------+-------- (0 rows) @@ -2187,17 +2188,17 @@ ORDER BY 1, 2, 3; -- **************** pg_index **************** -- Look for illegal values in pg_index fields. -SELECT p1.indexrelid, p1.indrelid -FROM pg_index as p1 -WHERE p1.indexrelid = 0 OR p1.indrelid = 0 OR - p1.indnatts <= 0 OR p1.indnatts > 32; +SELECT indexrelid, indrelid +FROM pg_index +WHERE indexrelid = 0 OR indrelid = 0 OR + indnatts <= 0 OR indnatts > 32; indexrelid | indrelid ------------+---------- (0 rows) -- oidvector and int2vector fields should be of length indnatts. -SELECT p1.indexrelid, p1.indrelid -FROM pg_index as p1 +SELECT indexrelid, indrelid +FROM pg_index WHERE array_lower(indkey, 1) != 0 OR array_upper(indkey, 1) != indnatts-1 OR array_lower(indclass, 1) != 0 OR array_upper(indclass, 1) != indnatts-1 OR array_lower(indcollation, 1) != 0 OR array_upper(indcollation, 1) != indnatts-1 OR diff --git a/third_party/spanner_pg/src/test/regress/expected/partition_aggregate.out b/third_party/spanner_pg/src/test/regress/expected/partition_aggregate.out index dfa4b036..0d69619a 100644 --- a/third_party/spanner_pg/src/test/regress/expected/partition_aggregate.out +++ b/third_party/spanner_pg/src/test/regress/expected/partition_aggregate.out @@ -942,6 +942,7 @@ INSERT INTO pagg_tab_ml SELECT i % 30, i % 10, to_char(i % 4, 'FM0000') FROM gen ANALYZE pagg_tab_ml; -- For Parallel Append SET max_parallel_workers_per_gather TO 2; +SET parallel_setup_cost = 0; -- 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 -- PARTITION KEY, but still we do not see a partial aggregation as array_agg() @@ -1025,6 +1026,7 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA -> Seq Scan on pagg_tab_ml_p2_s2 pagg_tab_ml_3 (25 rows) +RESET parallel_setup_cost; -- 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 -- PARTITION KEY, thus we will have a partial aggregation for them. diff --git a/third_party/spanner_pg/src/test/regress/expected/partition_join.out b/third_party/spanner_pg/src/test/regress/expected/partition_join.out index 27f7525b..8b179fa6 100644 --- a/third_party/spanner_pg/src/test/regress/expected/partition_join.out +++ b/third_party/spanner_pg/src/test/regress/expected/partition_join.out @@ -459,6 +459,99 @@ SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL 550 | | (12 rows) +SET max_parallel_workers_per_gather = 0; +-- If there are lateral references to the other relation in sample scan, +-- we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN LATERAL + (SELECT * FROM prt1 t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a; + QUERY PLAN +--------------------------------------------------------- + Nested Loop + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Append + -> Sample Scan on prt1_p1 t2_1 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: (t1.a = a) + -> Sample Scan on prt1_p2 t2_2 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: (t1.a = a) + -> Sample Scan on prt1_p3 t2_3 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: (t1.a = a) +(15 rows) + +-- If there are lateral references to the other relation in scan's restriction +-- clauses, we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Nested Loop + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Append + -> Index Scan using iprt2_p1_b on prt2_p1 t2_1 + Index Cond: (b = t1.a) + Filter: (t1.b = a) + -> Index Scan using iprt2_p2_b on prt2_p2 t2_2 + Index Cond: (b = t1.a) + Filter: (t1.b = a) + -> Index Scan using iprt2_p3_b on prt2_p3 t2_3 + Index Cond: (b = t1.a) + Filter: (t1.b = a) +(16 rows) + +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + count +------- + 100 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; + QUERY PLAN +-------------------------------------------------------------------- + Aggregate + -> Nested Loop + -> Append + -> Seq Scan on prt1_p1 t1_1 + -> Seq Scan on prt1_p2 t1_2 + -> Seq Scan on prt1_p3 t1_3 + -> Append + -> Index Only Scan using iprt2_p1_b on prt2_p1 t2_1 + Index Cond: (b = t1.a) + Filter: (b = t1.b) + -> Index Only Scan using iprt2_p2_b on prt2_p2 t2_2 + Index Cond: (b = t1.a) + Filter: (b = t1.b) + -> Index Only Scan using iprt2_p3_b on prt2_p3 t2_3 + Index Cond: (b = t1.a) + Filter: (b = t1.b) +(16 rows) + +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; + count +------- + 5 +(1 row) + +RESET max_parallel_workers_per_gather; -- bug with inadequate sort key representation SET enable_partitionwise_aggregate TO true; SET enable_hashjoin TO false; @@ -1897,6 +1990,80 @@ SELECT * FROM prt1_l t1 LEFT JOIN LATERAL 550 | 0 | 0002 | | | | | (12 rows) +SET max_parallel_workers_per_gather = 0; +-- If there are lateral references to the other relation in sample scan, +-- we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 JOIN LATERAL + (SELECT * FROM prt1_l t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a AND t1.b = s.b AND t1.c = s.c; + QUERY PLAN +---------------------------------------------------------------------------------- + Nested Loop + -> Append + -> Seq Scan on prt1_l_p1 t1_1 + -> Seq Scan on prt1_l_p2_p1 t1_2 + -> Seq Scan on prt1_l_p2_p2 t1_3 + -> Seq Scan on prt1_l_p3_p1 t1_4 + -> Seq Scan on prt1_l_p3_p2 t1_5 + -> Append + -> Sample Scan on prt1_l_p1 t2_1 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: ((t1.a = a) AND (t1.b = b) AND ((t1.c)::text = (c)::text)) + -> Sample Scan on prt1_l_p2_p1 t2_2 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: ((t1.a = a) AND (t1.b = b) AND ((t1.c)::text = (c)::text)) + -> Sample Scan on prt1_l_p2_p2 t2_3 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: ((t1.a = a) AND (t1.b = b) AND ((t1.c)::text = (c)::text)) + -> Sample Scan on prt1_l_p3_p1 t2_4 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: ((t1.a = a) AND (t1.b = b) AND ((t1.c)::text = (c)::text)) + -> Sample Scan on prt1_l_p3_p2 t2_5 + Sampling: system (t1.a) REPEATABLE (t1.b) + Filter: ((t1.a = a) AND (t1.b = b) AND ((t1.c)::text = (c)::text)) +(23 rows) + +-- If there are lateral references to the other relation in scan's restriction +-- clauses, we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; + QUERY PLAN +------------------------------------------------------------------------------------------------------- + Aggregate + -> Nested Loop + -> Append + -> Seq Scan on prt1_l_p1 t1_1 + -> Seq Scan on prt1_l_p2_p1 t1_2 + -> Seq Scan on prt1_l_p2_p2 t1_3 + -> Seq Scan on prt1_l_p3_p1 t1_4 + -> Seq Scan on prt1_l_p3_p2 t1_5 + -> Append + -> Seq Scan on prt2_l_p1 t2_1 + Filter: ((a = t1.b) AND (t1.a = b) AND (t1.b = a) AND ((t1.c)::text = (c)::text)) + -> Seq Scan on prt2_l_p2_p1 t2_2 + Filter: ((a = t1.b) AND (t1.a = b) AND (t1.b = a) AND ((t1.c)::text = (c)::text)) + -> Seq Scan on prt2_l_p2_p2 t2_3 + Filter: ((a = t1.b) AND (t1.a = b) AND (t1.b = a) AND ((t1.c)::text = (c)::text)) + -> Seq Scan on prt2_l_p3_p1 t2_4 + Filter: ((a = t1.b) AND (t1.a = b) AND (t1.b = a) AND ((t1.c)::text = (c)::text)) + -> Seq Scan on prt2_l_p3_p2 t2_5 + Filter: ((a = t1.b) AND (t1.a = b) AND (t1.b = a) AND ((t1.c)::text = (c)::text)) +(19 rows) + +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; + count +------- + 100 +(1 row) + +RESET max_parallel_workers_per_gather; -- join with one side empty EXPLAIN (COSTS OFF) SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; @@ -4862,3 +5029,51 @@ SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2 1 | 209 | 0009 | 1 | 209 | 0009 (8 rows) +-- partitionwise join with fractional paths +CREATE TABLE fract_t (id BIGINT, PRIMARY KEY (id)) PARTITION BY RANGE (id); +CREATE TABLE fract_t0 PARTITION OF fract_t FOR VALUES FROM ('0') TO ('1000'); +CREATE TABLE fract_t1 PARTITION OF fract_t FOR VALUES FROM ('1000') TO ('2000'); +-- insert data +INSERT INTO fract_t (id) (SELECT generate_series(0, 1999)); +ANALYZE fract_t; +-- verify plan; nested index only scans +SET max_parallel_workers_per_gather = 0; +SET enable_partitionwise_join = on; +EXPLAIN (COSTS OFF) +SELECT * FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY id ASC LIMIT 10; + QUERY PLAN +----------------------------------------------------------------------- + Limit + -> Merge Append + Sort Key: x.id + -> Merge Left Join + Merge Cond: (x_1.id = y_1.id) + -> Index Only Scan using fract_t0_pkey on fract_t0 x_1 + -> Index Only Scan using fract_t0_pkey on fract_t0 y_1 + -> Merge Left Join + Merge Cond: (x_2.id = y_2.id) + -> Index Only Scan using fract_t1_pkey on fract_t1 x_2 + -> Index Only Scan using fract_t1_pkey on fract_t1 y_2 +(11 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY id DESC LIMIT 10; + QUERY PLAN +-------------------------------------------------------------------------------- + Limit + -> Merge Append + Sort Key: x.id DESC + -> Nested Loop Left Join + -> Index Only Scan Backward using fract_t0_pkey on fract_t0 x_1 + -> Index Only Scan using fract_t0_pkey on fract_t0 y_1 + Index Cond: (id = x_1.id) + -> Nested Loop Left Join + -> Index Only Scan Backward using fract_t1_pkey on fract_t1 x_2 + -> Index Only Scan using fract_t1_pkey on fract_t1 y_2 + Index Cond: (id = x_2.id) +(11 rows) + +-- cleanup +DROP TABLE fract_t; +RESET max_parallel_workers_per_gather; +RESET enable_partitionwise_join; diff --git a/third_party/spanner_pg/src/test/regress/expected/plpgsql.out b/third_party/spanner_pg/src/test/regress/expected/plpgsql.out index 278d0565..08e42f17 100644 --- a/third_party/spanner_pg/src/test/regress/expected/plpgsql.out +++ b/third_party/spanner_pg/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 -- @@ -4637,24 +4664,50 @@ NOTICE: caught division by zero NOTICE: caught division by zero NOTICE: caught division by zero -- Check variable scoping -- a var is not available in its own or prior --- default expressions. -create function scope_test() returns int as $$ +-- default expressions, but it is available in later ones. +do $$ +declare x int := x + 1; -- error +begin + raise notice 'x = %', x; +end; +$$; +ERROR: column "x" does not exist +LINE 1: x + 1 + ^ +QUERY: x + 1 +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization +do $$ +declare y int := x + 1; -- error + x int := 42; +begin + raise notice 'x = %, y = %', x, y; +end; +$$; +ERROR: column "x" does not exist +LINE 1: x + 1 + ^ +QUERY: x + 1 +CONTEXT: PL/pgSQL function inline_code_block line 2 during statement block local variable initialization +do $$ +declare x int := 42; + y int := x + 1; +begin + raise notice 'x = %, y = %', x, y; +end; +$$; +NOTICE: x = 42, y = 43 +do $$ declare x int := 42; begin declare y int := x + 1; x int := x + 2; + z int := x * 10; begin - return x * 100 + y; + raise notice 'x = %, y = %, z = %', x, y, z; end; end; -$$ language plpgsql; -select scope_test(); - scope_test ------------- - 4443 -(1 row) - -drop function scope_test(); +$$; +NOTICE: x = 44, y = 43, z = 440 -- Check handling of conflicts between plpgsql vars and table columns. set plpgsql.variable_conflict = error; create function conflict_test() returns setof int8_tbl as $$ diff --git a/third_party/spanner_pg/src/test/regress/expected/point.out b/third_party/spanner_pg/src/test/regress/expected/point.out index 1dc535d1..3bde8ac7 100644 --- a/third_party/spanner_pg/src/test/regress/expected/point.out +++ b/third_party/spanner_pg/src/test/regress/expected/point.out @@ -3,22 +3,12 @@ -- -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; -CREATE TABLE POINT_TBL(f1 point); -INSERT INTO POINT_TBL(f1) VALUES ('(0.0,0.0)'); -INSERT INTO POINT_TBL(f1) VALUES ('(-10.0,0.0)'); -INSERT INTO POINT_TBL(f1) VALUES ('(-3.0,4.0)'); -INSERT INTO POINT_TBL(f1) VALUES ('(5.1, 34.5)'); -INSERT INTO POINT_TBL(f1) VALUES ('(-5.0,-12.0)'); -INSERT INTO POINT_TBL(f1) VALUES ('(1e-300,-1e-300)'); -- To underflow -INSERT INTO POINT_TBL(f1) VALUES ('(1e+300,Inf)'); -- To overflow -INSERT INTO POINT_TBL(f1) VALUES ('(Inf,1e+300)'); -- Transposed -INSERT INTO POINT_TBL(f1) VALUES (' ( Nan , NaN ) '); --- bad format points +-- point_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); ERROR: invalid input syntax for type point: "asdfasdf" LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); ^ -INSERT INTO POINT_TBL(f1) VALUES ('10.0,10.0'); INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); ERROR: invalid input syntax for type point: "(10.0 10.0)" LINE 1: INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); diff --git a/third_party/spanner_pg/src/test/regress/expected/portals.out b/third_party/spanner_pg/src/test/regress/expected/portals.out index bc52317e..f71e0b3d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/portals.out +++ b/third_party/spanner_pg/src/test/regress/expected/portals.out @@ -715,6 +715,24 @@ FETCH BACKWARD 1 FROM foo24; -- should fail ERROR: cursor can only scan forward HINT: Declare it with SCROLL option to enable backward scan. END; +BEGIN; +DECLARE foo24 NO SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; +FETCH 1 FROM foo24; + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 8800 | 0 | 0 | 0 | 0 | 0 | 0 | 800 | 800 | 3800 | 8800 | 0 | 1 | MAAAAA | AAAAAA | AAAAxx +(1 row) + +FETCH ABSOLUTE 2 FROM foo24; -- allowed + unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 +---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- + 1891 | 1 | 1 | 3 | 1 | 11 | 91 | 891 | 1891 | 1891 | 1891 | 182 | 183 | TUAAAA | BAAAAA | HHHHxx +(1 row) + +FETCH ABSOLUTE 1 FROM foo24; -- should fail +ERROR: cursor can only scan forward +HINT: Declare it with SCROLL option to enable backward scan. +END; -- -- Cursors outside transaction blocks -- @@ -1518,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/third_party/spanner_pg/src/test/regress/expected/privileges.out b/third_party/spanner_pg/src/test/regress/expected/privileges.out index edf5f3a6..8213be3d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/privileges.out +++ b/third_party/spanner_pg/src/test/regress/expected/privileges.out @@ -29,9 +29,31 @@ CREATE USER regress_priv_user5; -- duplicate ERROR: role "regress_priv_user5" already exists CREATE USER regress_priv_user6; CREATE USER regress_priv_user7; +CREATE USER regress_priv_user8; +CREATE USER regress_priv_user9; +CREATE USER regress_priv_user10; CREATE ROLE regress_priv_role; GRANT pg_read_all_data TO regress_priv_user6; GRANT pg_write_all_data TO regress_priv_user7; +GRANT pg_read_all_settings TO regress_priv_user8 WITH ADMIN OPTION; +SET SESSION AUTHORIZATION regress_priv_user8; +GRANT pg_read_all_settings TO regress_priv_user9 WITH ADMIN OPTION; +SET SESSION AUTHORIZATION regress_priv_user9; +GRANT pg_read_all_settings TO regress_priv_user10; +SET SESSION AUTHORIZATION regress_priv_user8; +REVOKE pg_read_all_settings FROM regress_priv_user10; +REVOKE ADMIN OPTION FOR pg_read_all_settings FROM regress_priv_user9; +REVOKE pg_read_all_settings FROM regress_priv_user9; +RESET SESSION AUTHORIZATION; +REVOKE ADMIN OPTION FOR pg_read_all_settings FROM regress_priv_user8; +SET SESSION AUTHORIZATION regress_priv_user8; +SET ROLE pg_read_all_settings; +RESET ROLE; +RESET SESSION AUTHORIZATION; +REVOKE pg_read_all_settings FROM regress_priv_user8; +DROP USER regress_priv_user10; +DROP USER regress_priv_user9; +DROP USER regress_priv_user8; CREATE GROUP regress_priv_group1; CREATE GROUP regress_priv_group2 WITH USER regress_priv_user1, regress_priv_user2; ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; @@ -677,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)); @@ -1604,14 +1724,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; @@ -2509,3 +2623,50 @@ REVOKE TRUNCATE ON lock_table FROM regress_locktable_user; -- clean up DROP TABLE lock_table; DROP USER regress_locktable_user; +-- test to check privileges of system views pg_shmem_allocations and +-- pg_backend_memory_contexts. +-- switch to superuser +\c - +CREATE ROLE regress_readallstats; +SELECT has_table_privilege('regress_readallstats','pg_backend_memory_contexts','SELECT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +SELECT has_table_privilege('regress_readallstats','pg_shmem_allocations','SELECT'); -- no + has_table_privilege +--------------------- + f +(1 row) + +GRANT pg_read_all_stats TO regress_readallstats; +SELECT has_table_privilege('regress_readallstats','pg_backend_memory_contexts','SELECT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +SELECT has_table_privilege('regress_readallstats','pg_shmem_allocations','SELECT'); -- yes + has_table_privilege +--------------------- + t +(1 row) + +-- run query to ensure that functions within views can be executed +SET ROLE regress_readallstats; +SELECT COUNT(*) >= 0 AS ok FROM pg_backend_memory_contexts; + ok +---- + t +(1 row) + +SELECT COUNT(*) >= 0 AS ok FROM pg_shmem_allocations; + ok +---- + t +(1 row) + +RESET ROLE; +-- clean up +DROP ROLE regress_readallstats; diff --git a/third_party/spanner_pg/src/test/regress/expected/psql.out b/third_party/spanner_pg/src/test/regress/expected/psql.out index 265518de..29c6b2da 100644 --- a/third_party/spanner_pg/src/test/regress/expected/psql.out +++ b/third_party/spanner_pg/src/test/regress/expected/psql.out @@ -293,6 +293,18 @@ select '2000-01-01'::date as party_over (1 row) \unset FETCH_COUNT +-- \setenv, \getenv +-- ensure MYVAR isn't set +\setenv MYVAR +-- in which case, reading it doesn't change the target +\getenv res MYVAR +\echo :res +:res +-- now set it +\setenv MYVAR 'environment value' +\getenv res MYVAR +\echo :res +environment value -- show all pset options \pset border 1 @@ -5089,6 +5101,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 @@ -5252,6 +5281,347 @@ END 7 ts_debug.lexemes 8 FROM ts_debug(get_current_ts_config(), ts_debug.document) ts_debug(alias, description, token, dictionaries, dictionary, lexemes); 9 END +-- AUTOCOMMIT +CREATE TABLE ac_test (a int); +\set AUTOCOMMIT off +INSERT INTO ac_test VALUES (1); +COMMIT; +SELECT * FROM ac_test; + a +--- + 1 +(1 row) + +COMMIT; +INSERT INTO ac_test VALUES (2); +ROLLBACK; +SELECT * FROM ac_test; + a +--- + 1 +(1 row) + +COMMIT; +BEGIN; +INSERT INTO ac_test VALUES (3); +COMMIT; +SELECT * FROM ac_test; + a +--- + 1 + 3 +(2 rows) + +COMMIT; +BEGIN; +INSERT INTO ac_test VALUES (4); +ROLLBACK; +SELECT * FROM ac_test; + a +--- + 1 + 3 +(2 rows) + +COMMIT; +\set AUTOCOMMIT on +DROP TABLE ac_test; +SELECT * FROM ac_test; -- should be gone now +ERROR: relation "ac_test" does not exist +LINE 1: SELECT * FROM ac_test; + ^ +-- ON_ERROR_ROLLBACK +\set ON_ERROR_ROLLBACK on +CREATE TABLE oer_test (a int); +BEGIN; +INSERT INTO oer_test VALUES (1); +INSERT INTO oer_test VALUES ('foo'); +ERROR: invalid input syntax for type integer: "foo" +LINE 1: INSERT INTO oer_test VALUES ('foo'); + ^ +INSERT INTO oer_test VALUES (3); +COMMIT; +SELECT * FROM oer_test; + a +--- + 1 + 3 +(2 rows) + +BEGIN; +INSERT INTO oer_test VALUES (4); +ROLLBACK; +SELECT * FROM oer_test; + a +--- + 1 + 3 +(2 rows) + +BEGIN; +INSERT INTO oer_test VALUES (5); +COMMIT AND CHAIN; +INSERT INTO oer_test VALUES (6); +COMMIT; +SELECT * FROM oer_test; + a +--- + 1 + 3 + 5 + 6 +(4 rows) + +DROP TABLE oer_test; +\set ON_ERROR_ROLLBACK off +-- ECHO errors +\set ECHO errors +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 ; +NOTICE: warn 1.5 +CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE + one +----- + 1 +(1 row) + + 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 +NOTICE: warn 3.5 +CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE + three +------- + 3 +(1 row) + + 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 preceding 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; -- check describing invalid multipart names \dA regression.heap improper qualified name (too many dotted names): regression.heap @@ -5648,9 +6018,9 @@ List of schemas (0 rows) \dO "no.such.collation" - List of collations - Schema | Name | Collate | Ctype | Provider | Deterministic? ---------+------+---------+-------+----------+---------------- + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- (0 rows) \dp "no.such.access.privilege" @@ -5837,9 +6207,9 @@ cross-database references are not implemented: "no.such.schema"."no.such.languag (0 rows) \dO "no.such.schema"."no.such.collation" - List of collations - Schema | Name | Collate | Ctype | Provider | Deterministic? ---------+------+---------+-------+----------+---------------- + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- (0 rows) \dp "no.such.schema"."no.such.access.privilege" @@ -5980,9 +6350,9 @@ List of text search templates (0 rows) \dO regression."no.such.schema"."no.such.collation" - List of collations - Schema | Name | Collate | Ctype | Provider | Deterministic? ---------+------+---------+-------+----------+---------------- + List of collations + Schema | Name | Collate | Ctype | ICU Locale | Provider | Deterministic? +--------+------+---------+-------+------------+----------+---------------- (0 rows) \dp regression."no.such.schema"."no.such.access.privilege" diff --git a/third_party/spanner_pg/src/test/regress/expected/publication.out b/third_party/spanner_pg/src/test/regress/expected/publication.out index b7ce0804..69dc6cfd 100644 --- a/third_party/spanner_pg/src/test/regress/expected/publication.out +++ b/third_party/spanner_pg/src/test/regress/expected/publication.out @@ -24,9 +24,11 @@ ALTER PUBLICATION testpub_default SET (publish = update); CREATE PUBLICATION testpub_xxx WITH (foo); ERROR: unrecognized publication parameter: "foo" CREATE PUBLICATION testpub_xxx WITH (publish = 'cluster, vacuum'); -ERROR: unrecognized "publish" value: "cluster" +ERROR: unrecognized value for publication option "publish": "cluster" CREATE PUBLICATION testpub_xxx WITH (publish_via_partition_root = 'true', publish_via_partition_root = '0'); 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 @@ -67,6 +69,114 @@ DETAIL: Tables cannot be added to or dropped from FOR ALL TABLES publications. ALTER PUBLICATION testpub_foralltables SET TABLE pub_test.testpub_nopk; 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 schema to 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables ADD TABLES IN SCHEMA pub_test; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Schemas cannot be added to or dropped from FOR ALL TABLES publications. +-- fail - can't drop schema from 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables DROP TABLES IN SCHEMA pub_test; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Schemas cannot be added to or dropped from FOR ALL TABLES publications. +-- fail - can't set schema to 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables SET TABLES IN SCHEMA pub_test; +ERROR: publication "testpub_foralltables" is defined as FOR ALL TABLES +DETAIL: Schemas cannot be added to or dropped from FOR ALL TABLES publications. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1; +RESET client_min_messages; +-- should be able to add schema to 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable ADD 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 +Tables: + "public.testpub_tbl1" +Tables from schemas: + "pub_test" + +-- should be able to drop schema from 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable DROP 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 +Tables: + "public.testpub_tbl1" + +-- should be able to set schema to 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable SET 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 +Tables from schemas: + "pub_test" + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA pub_test; +-- should be able to create publication with schema and table of the same +-- schema +CREATE PUBLICATION testpub_for_tbl_schema FOR TABLES IN SCHEMA pub_test, TABLE pub_test.testpub_nopk; +RESET client_min_messages; +\dRp+ testpub_for_tbl_schema + Publication testpub_for_tbl_schema + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "pub_test.testpub_nopk" +Tables from schemas: + "pub_test" + +-- weird parser corner case +CREATE PUBLICATION testpub_parsertst FOR TABLE pub_test.testpub_nopk, CURRENT_SCHEMA; +ERROR: invalid table name +LINE 1: ...estpub_parsertst FOR TABLE pub_test.testpub_nopk, CURRENT_SC... + ^ +CREATE PUBLICATION testpub_parsertst FOR TABLES IN SCHEMA foo, test.foo; +ERROR: invalid schema name +LINE 1: ...CATION testpub_parsertst FOR TABLES IN SCHEMA foo, test.foo; + ^ +-- should be able to add a table of the same schema to the schema publication +ALTER PUBLICATION testpub_forschema ADD 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 +Tables: + "pub_test.testpub_nopk" +Tables from schemas: + "pub_test" + +-- should be able to drop the table +ALTER PUBLICATION testpub_forschema DROP 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 +Tables from schemas: + "pub_test" + +-- fail - can't drop a table from the schema publication which isn't in the +-- publication +ALTER PUBLICATION testpub_forschema DROP TABLE pub_test.testpub_nopk; +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 +Tables: + "pub_test.testpub_nopk" + SELECT pubname, puballtables FROM pg_publication WHERE pubname = 'testpub_foralltables'; pubname | puballtables ----------------------+-------------- @@ -92,7 +202,7 @@ Publications: (1 row) DROP TABLE testpub_tbl2; -DROP PUBLICATION testpub_foralltables; +DROP PUBLICATION testpub_foralltables, testpub_fortable, testpub_forschema, testpub_for_tbl_schema; CREATE TABLE testpub_tbl3 (a int); CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3); SET client_min_messages = 'ERROR'; @@ -165,17 +275,794 @@ HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. ALTER PUBLICATION testpub_forparted DROP TABLE testpub_parted; -- works again, because update is no longer replicated UPDATE testpub_parted2 SET a = 2; --- publication includes both the parent table and the child table -ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted, testpub_parted2; --- only parent is listed as being in publication, not the partition -SELECT * FROM pg_publication_tables; - pubname | schemaname | tablename --------------------+------------+---------------- - testpub_forparted | public | testpub_parted -(1 row) - 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)) + +\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 + 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)) + +\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 + 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)) + +\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'); +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 TABLES IN SCHEMA testpub_rf_schema1 WHERE (a = 123); +ERROR: syntax error at or near "WHERE" +LINE 1: ...b_syntax3 FOR TABLES IN SCHEMA testpub_rf_schema1 WHERE (a =... + ^ +CREATE PUBLICATION testpub_syntax3 FOR TABLES IN SCHEMA testpub_rf_schema1, testpub_rf_schema1 WHERE (a = 123); +ERROR: WHERE clause not allowed for schema +LINE 1: ..._syntax3 FOR 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: Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed. +-- 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 TABLES IN SCHEMA testpub_rf_schema2; +-- should be able to set publication with schema and table of the same schema +ALTER PUBLICATION testpub6 SET TABLES IN SCHEMA testpub_rf_schema2, TABLE testpub_rf_schema2.testpub_rf_tbl6 WHERE (i < 99); +RESET client_min_messages; +\dRp+ testpub6 + Publication testpub6 + Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | t | t | t | f +Tables: + "testpub_rf_schema2.testpub_rf_tbl6" WHERE (i < 99) +Tables from schemas: + "testpub_rf_schema2" + +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 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); +-- 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; +-- ====================================================== +-- 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 use 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 use 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 | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | t | f | f | t | 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. +-- test that using column list for table is disallowed if any schemas are +-- part of the publication +SET client_min_messages = 'ERROR'; +-- failure - cannot use column list and schema together +CREATE PUBLICATION testpub_tbl9 FOR TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +ERROR: cannot use column list for relation "public.testpub_tbl7" in publication "testpub_tbl9" +DETAIL: Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements. +-- ok - only publish schema +CREATE PUBLICATION testpub_tbl9 FOR TABLES IN SCHEMA public; +-- failure - add a table with column list when there is already a schema in the +-- publication +ALTER PUBLICATION testpub_tbl9 ADD TABLE public.testpub_tbl7(a); +ERROR: cannot use column list for relation "public.testpub_tbl7" in publication "testpub_tbl9" +DETAIL: Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements. +-- ok - only publish table with column list +ALTER PUBLICATION testpub_tbl9 SET TABLE public.testpub_tbl7(a); +-- failure - specify a schema when there is already a column list in the +-- publication +ALTER PUBLICATION testpub_tbl9 ADD TABLES IN SCHEMA public; +ERROR: cannot add schema to publication "testpub_tbl9" +DETAIL: Schemas cannot be added if any tables that specify a column list are already part of the publication. +-- failure - cannot SET column list and schema together +ALTER PUBLICATION testpub_tbl9 SET TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +ERROR: cannot use column list for relation "public.testpub_tbl7" in publication "testpub_tbl9" +DETAIL: Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements. +-- ok - drop table +ALTER PUBLICATION testpub_tbl9 DROP TABLE public.testpub_tbl7; +-- failure - cannot ADD column list and schema together +ALTER PUBLICATION testpub_tbl9 ADD TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +ERROR: cannot use column list for relation "public.testpub_tbl7" in publication "testpub_tbl9" +DETAIL: Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements. +RESET client_min_messages; +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, testpub_tbl9; +-- ====================================================== +-- 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 | 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) + +\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 column list for relation "public.rf_tbl_abcd_part_pk" in publication "testpub6" +DETAIL: Column lists cannot be specified for partitioned tables 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 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); +-- 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); @@ -193,8 +1080,24 @@ UPDATE testpub_tbl4 set a = 3; DROP TABLE testpub_tbl4; -- fail - view CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view; -ERROR: "testpub_view" is not a table -DETAIL: Only tables can be added to publications. +ERROR: cannot add relation "testpub_view" to publication +DETAIL: This operation is not supported for views. +CREATE TEMPORARY TABLE testpub_temptbl(a int); +-- fail - temporary table +CREATE PUBLICATION testpub_fortemptbl FOR TABLE testpub_temptbl; +ERROR: cannot add relation "testpub_temptbl" to publication +DETAIL: This operation is not supported for temporary tables. +DROP TABLE testpub_temptbl; +CREATE UNLOGGED TABLE testpub_unloggedtbl(a int); +-- fail - unlogged table +CREATE PUBLICATION testpub_forunloggedtbl FOR TABLE testpub_unloggedtbl; +ERROR: cannot add relation "testpub_unloggedtbl" to publication +DETAIL: This operation is not supported for unlogged tables. +DROP TABLE testpub_unloggedtbl; +-- fail - system table +CREATE PUBLICATION testpub_forsystemtbl FOR TABLE pg_publication; +ERROR: cannot add relation "pg_publication" to publication +DETAIL: This operation is not supported for system tables. SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk; RESET client_min_messages; @@ -215,8 +1118,8 @@ Tables: -- fail - view ALTER PUBLICATION testpub_default ADD TABLE testpub_view; -ERROR: "testpub_view" is not a table -DETAIL: Only tables can be added to publications. +ERROR: cannot add relation "testpub_view" to publication +DETAIL: This operation is not supported for views. ALTER PUBLICATION testpub_default ADD TABLE testpub_tbl1; ALTER PUBLICATION testpub_default SET TABLE testpub_tbl1; ALTER PUBLICATION testpub_default ADD TABLE pub_test.testpub_nopk; @@ -293,18 +1196,38 @@ GRANT CREATE ON DATABASE regression TO regress_publication_user2; SET ROLE regress_publication_user2; SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub2; -- ok +CREATE PUBLICATION testpub3 FOR TABLES IN SCHEMA pub_test; -- fail +ERROR: must be superuser to create FOR TABLES IN SCHEMA publication +CREATE PUBLICATION testpub3; -- ok RESET client_min_messages; ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- fail ERROR: must be owner of table testpub_tbl1 +ALTER PUBLICATION testpub3 ADD TABLES IN SCHEMA pub_test; -- fail +ERROR: must be superuser to add or set schemas SET ROLE regress_publication_user; GRANT regress_publication_user TO regress_publication_user2; SET ROLE regress_publication_user2; ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- ok DROP PUBLICATION testpub2; +DROP PUBLICATION testpub3; SET ROLE regress_publication_user; +CREATE ROLE regress_publication_user3; +GRANT regress_publication_user2 TO regress_publication_user3; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub4 FOR TABLES IN SCHEMA pub_test; +RESET client_min_messages; +ALTER PUBLICATION testpub4 OWNER TO regress_publication_user3; +SET ROLE regress_publication_user3; +-- fail - new owner must be superuser +ALTER PUBLICATION testpub4 owner to regress_publication_user2; -- fail +ERROR: permission denied to change owner of publication "testpub4" +HINT: The owner of a FOR TABLES IN SCHEMA publication must be a superuser. +ALTER PUBLICATION testpub4 owner to regress_publication_user; -- ok +SET ROLE regress_publication_user; +DROP PUBLICATION testpub4; +DROP ROLE regress_publication_user3; REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; DROP TABLE testpub_parted; -DROP VIEW testpub_view; DROP TABLE testpub_tbl1; \dRp+ testpub_default Publication testpub_default @@ -336,11 +1259,479 @@ ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; testpub_default | regress_publication_user2 | f | t | t | t | f | f (1 row) +-- adding schemas and tables +CREATE SCHEMA pub_test1; +CREATE SCHEMA pub_test2; +CREATE SCHEMA pub_test3; +CREATE SCHEMA "CURRENT_SCHEMA"; +CREATE TABLE pub_test1.tbl (id int, data text); +CREATE TABLE pub_test1.tbl1 (id serial primary key, data text); +CREATE TABLE pub_test2.tbl1 (id serial primary key, data text); +CREATE TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"(id int); +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub1_forschema FOR 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 +Tables from schemas: + "pub_test1" + +CREATE PUBLICATION testpub2_forschema FOR 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 +Tables from schemas: + "pub_test1" + "pub_test2" + "pub_test3" + +-- check create publication on CURRENT_SCHEMA +CREATE PUBLICATION testpub3_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA; +CREATE PUBLICATION testpub4_forschema FOR TABLES IN SCHEMA "CURRENT_SCHEMA"; +CREATE PUBLICATION testpub5_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA, "CURRENT_SCHEMA"; +CREATE PUBLICATION testpub6_forschema FOR TABLES IN SCHEMA "CURRENT_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 +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 +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 +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 +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 +Tables: + "CURRENT_SCHEMA.CURRENT_SCHEMA" + +-- check create publication on CURRENT_SCHEMA where search_path is not set +SET SEARCH_PATH=''; +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA; +ERROR: no schema has been selected for CURRENT_SCHEMA +RESET SEARCH_PATH; +-- check create publication on CURRENT_SCHEMA where TABLE/TABLES in SCHEMA +-- is not specified +CREATE PUBLICATION testpub_forschema1 FOR CURRENT_SCHEMA; +ERROR: invalid publication object list +LINE 1: CREATE PUBLICATION testpub_forschema1 FOR CURRENT_SCHEMA; + ^ +DETAIL: One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name. +-- check create publication on CURRENT_SCHEMA along with FOR TABLE +CREATE PUBLICATION testpub_forschema1 FOR TABLE CURRENT_SCHEMA; +ERROR: syntax error at or near "CURRENT_SCHEMA" +LINE 1: CREATE PUBLICATION testpub_forschema1 FOR TABLE CURRENT_SCHE... + ^ +-- check create publication on a schema that does not exist +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA non_existent_schema; +ERROR: schema "non_existent_schema" does not exist +-- check create publication on a system schema +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA pg_catalog; +ERROR: cannot add schema "pg_catalog" to publication +DETAIL: This operation is not supported for system schemas. +-- check create publication on an object which is not schema +CREATE PUBLICATION testpub1_forschema1 FOR TABLES IN SCHEMA testpub_view; +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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- 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 +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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- alter publication add schema +ALTER PUBLICATION testpub1_forschema ADD 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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- add non existent schema +ALTER PUBLICATION testpub1_forschema ADD 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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- add a schema which is already added to the publication +ALTER PUBLICATION testpub1_forschema ADD 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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- alter publication drop schema +ALTER PUBLICATION testpub1_forschema DROP 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 +Tables from schemas: + "pub_test1" + +-- drop schema that is not present in the publication +ALTER PUBLICATION testpub1_forschema DROP 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 +Tables from schemas: + "pub_test1" + +-- drop a schema that does not exist in the system +ALTER PUBLICATION testpub1_forschema DROP 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 +Tables from schemas: + "pub_test1" + +-- drop all schemas +ALTER PUBLICATION testpub1_forschema DROP 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 +(1 row) + +-- alter publication set multiple schema +ALTER PUBLICATION testpub1_forschema SET 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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- alter publication set non-existent schema +ALTER PUBLICATION testpub1_forschema SET 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 +Tables from schemas: + "pub_test1" + "pub_test2" + +-- alter publication set it duplicate schemas should set the schemas after +-- removing the duplicate schemas +ALTER PUBLICATION testpub1_forschema SET 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 +Tables from schemas: + "pub_test1" + +-- Verify that it fails to add a schema with a column specification +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA foo (a, b); +ERROR: syntax error at or near "(" +LINE 1: ...LICATION testpub1_forschema ADD TABLES IN SCHEMA foo (a, b); + ^ +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA foo, bar (a, b); +ERROR: column specification not allowed for schema +LINE 1: ...TION testpub1_forschema ADD TABLES IN SCHEMA foo, bar (a, b)... + ^ +-- cleanup pub_test1 schema for invalidation tests +ALTER PUBLICATION testpub2_forschema DROP TABLES IN SCHEMA pub_test1; +DROP PUBLICATION testpub3_forschema, testpub4_forschema, testpub5_forschema, testpub6_forschema, testpub_fortable; +DROP SCHEMA "CURRENT_SCHEMA" CASCADE; +NOTICE: drop cascades to table "CURRENT_SCHEMA"."CURRENT_SCHEMA" +-- verify relation cache invalidations through update statement for the +-- default REPLICA IDENTITY on the relation, if schema is part of the +-- publication then update will fail because relation's relreplident +-- option will be set, if schema is not part of the publication then update +-- will be successful. +INSERT INTO pub_test1.tbl VALUES(1, 'test'); +-- fail +UPDATE pub_test1.tbl SET id = 2; +ERROR: cannot update table "tbl" 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 testpub1_forschema DROP TABLES IN SCHEMA pub_test1; +-- success +UPDATE pub_test1.tbl SET id = 2; +ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA pub_test1; +-- fail +UPDATE pub_test1.tbl SET id = 2; +ERROR: cannot update table "tbl" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +-- verify invalidation of partition table having parent and child tables in +-- different schema +CREATE SCHEMA pub_testpart1; +CREATE SCHEMA pub_testpart2; +CREATE TABLE pub_testpart1.parent1 (a int) partition by list (a); +CREATE TABLE pub_testpart2.child_parent1 partition of pub_testpart1.parent1 for values in (1); +INSERT INTO pub_testpart2.child_parent1 values(1); +UPDATE pub_testpart2.child_parent1 set a = 1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpubpart_forschema FOR TABLES IN SCHEMA pub_testpart1; +RESET client_min_messages; +-- fail +UPDATE pub_testpart1.parent1 set a = 1; +ERROR: cannot update table "child_parent1" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +UPDATE pub_testpart2.child_parent1 set a = 1; +ERROR: cannot update table "child_parent1" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +DROP PUBLICATION testpubpart_forschema; +-- verify invalidation of partition tables for schema publication that has +-- parent and child tables of different partition hierarchies +CREATE TABLE pub_testpart2.parent2 (a int) partition by list (a); +CREATE TABLE pub_testpart1.child_parent2 partition of pub_testpart2.parent2 for values in (1); +INSERT INTO pub_testpart1.child_parent2 values(1); +UPDATE pub_testpart1.child_parent2 set a = 1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpubpart_forschema FOR TABLES IN SCHEMA pub_testpart2; +RESET client_min_messages; +-- fail +UPDATE pub_testpart2.child_parent1 set a = 1; +ERROR: cannot update table "child_parent1" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +UPDATE pub_testpart2.parent2 set a = 1; +ERROR: cannot update table "child_parent2" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +UPDATE pub_testpart1.child_parent2 set a = 1; +ERROR: cannot update table "child_parent2" 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 set 'TABLES IN SCHEMA' on an empty publication. +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 +(1 row) + +ALTER PUBLICATION testpub3_forschema SET 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 +Tables from schemas: + "pub_test1" + +-- create publication including both 'FOR TABLE' and 'FOR TABLES IN SCHEMA' +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema_fortable FOR TABLES IN SCHEMA pub_test1, TABLE pub_test2.tbl1; +CREATE PUBLICATION testpub_fortable_forschema FOR TABLE pub_test2.tbl1, 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 +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 +Tables: + "pub_test2.tbl1" +Tables from schemas: + "pub_test1" + +-- fail specifying table without any of 'FOR TABLES IN SCHEMA' or +--'FOR TABLE' or 'FOR ALL TABLES' +CREATE PUBLICATION testpub_error FOR pub_test2.tbl1; +ERROR: invalid publication object list +LINE 1: CREATE PUBLICATION testpub_error FOR pub_test2.tbl1; + ^ +DETAIL: One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name. +DROP VIEW testpub_view; DROP PUBLICATION testpub_default; DROP PUBLICATION testpib_ins_trunct; DROP PUBLICATION testpub_fortbl; +DROP PUBLICATION testpub1_forschema; +DROP PUBLICATION testpub2_forschema; +DROP PUBLICATION testpub3_forschema; +DROP PUBLICATION testpub_forschema_fortable; +DROP PUBLICATION testpub_fortable_forschema; +DROP PUBLICATION testpubpart_forschema; DROP SCHEMA pub_test CASCADE; NOTICE: drop cascades to table pub_test.testpub_nopk +DROP SCHEMA pub_test1 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table pub_test1.tbl +drop cascades to table pub_test1.tbl1 +DROP SCHEMA pub_test2 CASCADE; +NOTICE: drop cascades to table pub_test2.tbl1 +DROP SCHEMA pub_testpart1 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table pub_testpart1.parent1 +drop cascades to table pub_testpart1.child_parent2 +DROP SCHEMA pub_testpart2 CASCADE; +NOTICE: drop cascades to table pub_testpart2.parent2 +-- Test the list of partitions published with or without +-- 'PUBLISH_VIA_PARTITION_ROOT' parameter +SET client_min_messages = 'ERROR'; +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); +-- Schema publication that does not include the schema that has the parent table +CREATE PUBLICATION pub FOR TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +SELECT * FROM pg_publication_tables; + 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 | 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 | 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 TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); +SELECT * FROM pg_publication_tables; + 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 | 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 | attnames | rowfilter +---------+------------+------------+----------+----------- + pub | sch2 | tbl1_part1 | {a} | +(1 row) + +DROP PUBLICATION pub; +DROP TABLE sch2.tbl1_part1; +DROP TABLE sch1.tbl1; +CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); +CREATE TABLE sch1.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); +CREATE TABLE sch1.tbl1_part2 PARTITION OF sch1.tbl1 FOR VALUES FROM (10) to (20); +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 TABLES IN SCHEMA sch1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +SELECT * FROM pg_publication_tables; + pubname | schemaname | tablename | attnames | rowfilter +---------+------------+-----------+----------+----------- + pub | sch1 | tbl1 | {a} | +(1 row) + +RESET client_min_messages; +DROP PUBLICATION pub; +DROP TABLE sch1.tbl1; +DROP SCHEMA sch1 cascade; +DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; DROP ROLE regress_publication_user_dummy; diff --git a/third_party/spanner_pg/src/test/regress/expected/rangefuncs.out b/third_party/spanner_pg/src/test/regress/expected/rangefuncs.out index 2334a132..e2e62db6 100644 --- a/third_party/spanner_pg/src/test/regress/expected/rangefuncs.out +++ b/third_party/spanner_pg/src/test/regress/expected/rangefuncs.out @@ -2247,15 +2247,55 @@ select * from usersview; id2 | 2 | email2 | 12 | t | 11 | 2 (2 rows) +alter table users drop column moredrop; -- fail, view has reference +ERROR: cannot drop column moredrop of table users because other objects depend on it +DETAIL: view usersview depends on column moredrop of table users +HINT: Use DROP ... CASCADE to drop the dependent objects too. +-- We used to have a bug that would allow the above to succeed, posing +-- hazards for later execution of the view. Check that the internal +-- defenses for those hazards haven't bit-rotted, in case some other +-- bug with similar symptoms emerges. begin; +-- destroy the dependency entry that prevents the DROP: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'usersview'::regclass and rulename = '_RETURN') + and refobjsubid = 5 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + obj | ref | deptype +--------------------------------+--------------------------------+--------- + rule _RETURN on view usersview | column moredrop of table users | n +(1 row) + alter table users drop column moredrop; select * from usersview; -- expect clean failure ERROR: attribute 5 of type record has been dropped rollback; +alter table users alter column seq type numeric; -- fail, view has reference +ERROR: cannot alter type of a column used by a view or rule +DETAIL: rule _RETURN on view usersview depends on column "seq" +-- likewise, check we don't crash if the dependency goes wrong +begin; +-- destroy the dependency entry that prevents the ALTER: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'usersview'::regclass and rulename = '_RETURN') + and refobjsubid = 2 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + obj | ref | deptype +--------------------------------+---------------------------+--------- + rule _RETURN on view usersview | column seq of table users | n +(1 row) + alter table users alter column seq type numeric; select * from usersview; -- expect clean failure ERROR: attribute 2 of type record has wrong type DETAIL: Table has type numeric, but query expects integer. +rollback; drop view usersview; drop function get_first_user(); drop function get_users(); diff --git a/third_party/spanner_pg/src/test/regress/expected/rangetypes.out b/third_party/spanner_pg/src/test/regress/expected/rangetypes.out index 2eaed6e1..04ccd5d4 100644 --- a/third_party/spanner_pg/src/test/regress/expected/rangetypes.out +++ b/third_party/spanner_pg/src/test/regress/expected/rangetypes.out @@ -1,7 +1,7 @@ -- Tests for range data types. -create type textrange as range (subtype=text, collation="C"); -- -- test input parser +-- (type textrange was already made in test_setup.sql) -- -- negative tests; should fail select ''::textrange; @@ -1482,12 +1482,11 @@ LINE 1: select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)':... set timezone to default; -- -- Test user-defined range of floats +-- (type float8range was already made in test_setup.sql) -- --should fail -create type float8range as range (subtype=float8, subtype_diff=float4mi); +create type bogus_float8range as range (subtype=float8, subtype_diff=float4mi); ERROR: function float4mi(double precision, double precision) does not exist ---should succeed -create type float8range as range (subtype=float8, subtype_diff=float8mi); select '[123.001, 5.e9)'::float8range @> 888.882::float8; ?column? ---------- diff --git a/third_party/spanner_pg/src/test/regress/expected/regex.linux.utf8.out b/third_party/spanner_pg/src/test/regress/expected/regex.linux.utf8.out deleted file mode 100644 index 7c170a99..00000000 --- a/third_party/spanner_pg/src/test/regress/expected/regex.linux.utf8.out +++ /dev/null @@ -1,164 +0,0 @@ -/* - * This test is for Linux/glibc systems and others that implement proper - * locale classification of Unicode characters with high code values. - * It must be run in a database with UTF8 encoding and a Unicode-aware locale. - */ -SET client_encoding TO UTF8; --- --- Test the "high colormap" logic with single characters and ranges that --- exceed the MAX_SIMPLE_CHR cutoff, here assumed to be less than U+2000. --- --- trivial cases: -SELECT 'aⓐ' ~ U&'a\24D0' AS t; - t ---- - t -(1 row) - -SELECT 'aⓐ' ~ U&'a\24D1' AS f; - f ---- - f -(1 row) - -SELECT 'aⓕ' ~ 'a[ⓐ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⒻ' ~ 'a[ⓐ-ⓩ]' AS f; - f ---- - f -(1 row) - --- cases requiring splitting of ranges: -SELECT 'aⓕⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓕⓐ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓐⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS f; - f ---- - f -(1 row) - -SELECT 'aⓕⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; - t ---- - t -(1 row) - -SELECT 'aⓕⓐ' ~ 'a[ⓐ-ⓩ]ⓕ' AS f; - f ---- - f -(1 row) - -SELECT 'aⓐⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; - t ---- - t -(1 row) - -SELECT 'aⒶⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓜⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓜⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓩⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; - f ---- - f -(1 row) - -SELECT 'aⓜ⓪' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; - f ---- - f -(1 row) - -SELECT 'a0' ~ 'a[a-ⓩ]' AS f; - f ---- - f -(1 row) - -SELECT 'aq' ~ 'a[a-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓜ' ~ 'a[a-ⓩ]' AS t; - t ---- - t -(1 row) - -SELECT 'a⓪' ~ 'a[a-ⓩ]' AS f; - f ---- - f -(1 row) - --- Locale-dependent character classes -SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:graph:]]' AS t; - t ---- - t -(1 row) - -SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:alpha:]]' AS f; - f ---- - f -(1 row) - --- Locale-dependent character classes with high ranges -SELECT 'aⒶⓜ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS t; - t ---- - t -(1 row) - -SELECT 'aⓜⒶ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS f; - f ---- - f -(1 row) - -SELECT 'aⓜⒶ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS t; - t ---- - t -(1 row) - -SELECT 'aⒶⓜ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS f; - f ---- - f -(1 row) - diff --git a/third_party/spanner_pg/src/test/regress/expected/rowsecurity.out b/third_party/spanner_pg/src/test/regress/expected/rowsecurity.out index 20df48a4..2d99b897 100644 --- a/third_party/spanner_pg/src/test/regress/expected/rowsecurity.out +++ b/third_party/spanner_pg/src/test/regress/expected/rowsecurity.out @@ -2117,6 +2117,220 @@ 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 and new dlevel must be > 0 +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dlevel > 0); +-- 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 dlevel +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 ', dlevel = 0; +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 dlevel 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 ', dlevel = 1; +-- 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" +-- OK if DELETE is replaced with DO NOTHING +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 + DO NOTHING; +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 'novel' +RESET SESSION AUTHORIZATION; +DROP POLICY p1 ON document; +CREATE POLICY p1 ON document FOR SELECT + USING (cid = (SELECT cid from category WHERE cname = 'novel')); +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 7 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" +-- UPDATE action fails if new row is not visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge6 ', + cid = (SELECT cid from category WHERE cname = 'technology'); +ERROR: new row violates row-level security policy for table "document" +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge7 ', + cid = (SELECT cid from category WHERE cname = 'novel'); +-- OK to insert a new row that is not visible +MERGE INTO document d +USING (SELECT 13 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge8 ' +WHEN NOT MATCHED THEN + INSERT VALUES (13, 44, 1, 'regress_rls_bob', 'new manga'); +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 notes added by merge7 + 13 | 44 | 1 | regress_rls_bob | new manga | +(15 rows) + -- -- ROLE/GROUP -- @@ -2431,6 +2645,7 @@ 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 @@ -2447,6 +2662,259 @@ EXPLAIN (COSTS OFF) SELECT * FROM rls_view; 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 + 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) + +-- 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; -- @@ -4051,7 +4519,7 @@ DROP TABLE rls_t; -- 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 @@ -4069,6 +4537,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/third_party/spanner_pg/src/test/regress/expected/rules.out b/third_party/spanner_pg/src/test/regress/expected/rules.out index ecdb1722..225204c3 100644 --- a/third_party/spanner_pg/src/test/regress/expected/rules.out +++ b/third_party/spanner_pg/src/test/regress/expected/rules.out @@ -1283,30 +1283,8 @@ drop table cchild; -- temporarily disable fancy output, so view changes create less diff noise \a\t SELECT viewname, definition FROM pg_views -WHERE schemaname IN ('pg_catalog', 'public') +WHERE schemaname = 'pg_catalog' ORDER BY viewname; -iexit| SELECT ih.name, - ih.thepath, - interpt_pp(ih.thepath, r.thepath) AS exit - FROM ihighway ih, - ramp r - WHERE (ih.thepath ## r.thepath); -key_dependent_view| SELECT view_base_table.key, - view_base_table.data - FROM view_base_table - GROUP BY view_base_table.key; -key_dependent_view_no_cols| SELECT - FROM view_base_table - GROUP BY view_base_table.key - HAVING (length((view_base_table.data)::text) > 0); -mvtest_tv| SELECT mvtest_t.type, - sum(mvtest_t.amt) AS totamt - FROM mvtest_t - GROUP BY mvtest_t.type; -mvtest_tvv| SELECT sum(mvtest_tv.totamt) AS grandtot - FROM mvtest_tv; -mvtest_tvvmv| SELECT mvtest_tvvm.grandtot - FROM mvtest_tvvm; pg_available_extension_versions| SELECT e.name, e.version, (x.extname IS NOT NULL) AS installed, @@ -1369,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, @@ -1453,9 +1437,13 @@ 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 pg_attribute a + WHERE ((a.attrelid = gpt.relid) AND (a.attnum > 0) AND (NOT a.attisdropped) AND ((a.attnum = ANY ((gpt.attrs)::smallint[])) OR (gpt.attrs IS NULL)))) 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); @@ -2027,6 +2015,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, @@ -2094,6 +2093,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_stats| SELECT ss.subid, + s.subname, + 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, @@ -2276,19 +2282,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, @@ -2425,6 +2436,7 @@ pg_stats_ext| SELECT cn.nspname AS schemaname, JOIN pg_attribute a ON (((a.attrelid = s.stxrelid) AND (a.attnum = k.k))))) AS attnames, pg_get_statisticsobjdef_expressions(s.oid) AS exprs, s.stxkind AS kinds, + sd.stxdinherit AS inherited, sd.stxdndistinct AS n_distinct, sd.stxddependencies AS dependencies, m.most_common_vals, @@ -2451,6 +2463,7 @@ pg_stats_ext_exprs| SELECT cn.nspname AS schemaname, s.stxname AS statistics_name, pg_get_userbyid(s.stxowner) AS statistics_owner, stat.expr, + sd.stxdinherit AS inherited, (stat.a).stanullfrac AS null_frac, (stat.a).stawidth AS avg_width, (stat.a).stadistinct AS n_distinct, @@ -2572,204 +2585,14 @@ pg_views| SELECT n.nspname AS schemaname, FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'v'::"char"); -rtest_v1| SELECT rtest_t1.a, - rtest_t1.b - FROM rtest_t1; -rtest_vcomp| SELECT x.part, - (x.size * y.factor) AS size_in_cm - FROM rtest_comp x, - rtest_unitfact y - WHERE (x.unit = y.unit); -rtest_vview1| SELECT x.a, - x.b - FROM rtest_view1 x - WHERE (0 < ( SELECT count(*) AS count - FROM rtest_view2 y - WHERE (y.a = x.a))); -rtest_vview2| SELECT rtest_view1.a, - rtest_view1.b - FROM rtest_view1 - WHERE rtest_view1.v; -rtest_vview3| SELECT x.a, - x.b - FROM rtest_vview2 x - WHERE (0 < ( SELECT count(*) AS count - FROM rtest_view2 y - WHERE (y.a = x.a))); -rtest_vview4| SELECT x.a, - x.b, - count(y.a) AS refcount - FROM rtest_view1 x, - rtest_view2 y - WHERE (x.a = y.a) - GROUP BY x.a, x.b; -rtest_vview5| SELECT rtest_view1.a, - rtest_view1.b, - rtest_viewfunc1(rtest_view1.a) AS refcount - FROM rtest_view1; -shoe| SELECT sh.shoename, - sh.sh_avail, - sh.slcolor, - sh.slminlen, - (sh.slminlen * un.un_fact) AS slminlen_cm, - sh.slmaxlen, - (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, - sh.slunit - FROM shoe_data sh, - unit un - WHERE (sh.slunit = un.un_name); -shoe_ready| SELECT rsh.shoename, - rsh.sh_avail, - rsl.sl_name, - rsl.sl_avail, - int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail - FROM shoe rsh, - shoelace rsl - WHERE ((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm)); -shoelace| SELECT s.sl_name, - s.sl_avail, - s.sl_color, - s.sl_len, - s.sl_unit, - (s.sl_len * u.un_fact) AS sl_len_cm - FROM shoelace_data s, - unit u - WHERE (s.sl_unit = u.un_name); -shoelace_candelete| SELECT shoelace_obsolete.sl_name, - shoelace_obsolete.sl_avail, - shoelace_obsolete.sl_color, - shoelace_obsolete.sl_len, - shoelace_obsolete.sl_unit, - shoelace_obsolete.sl_len_cm - FROM shoelace_obsolete - WHERE (shoelace_obsolete.sl_avail = 0); -shoelace_obsolete| SELECT shoelace.sl_name, - shoelace.sl_avail, - shoelace.sl_color, - shoelace.sl_len, - shoelace.sl_unit, - shoelace.sl_len_cm - FROM shoelace - WHERE (NOT (EXISTS ( SELECT shoe.shoename - FROM shoe - WHERE (shoe.slcolor = shoelace.sl_color)))); -street| SELECT r.name, - r.thepath, - c.cname - FROM ONLY road r, - real_city c - WHERE (c.outline ## r.thepath); -test_tablesample_v1| SELECT test_tablesample.id - FROM test_tablesample TABLESAMPLE system ((10 * 2)) REPEATABLE (2); -test_tablesample_v2| SELECT test_tablesample.id - FROM test_tablesample TABLESAMPLE system (99); -toyemp| SELECT emp.name, - emp.age, - emp.location, - (12 * emp.salary) AS annualsal - FROM emp; SELECT tablename, rulename, definition FROM pg_rules -WHERE schemaname IN ('pg_catalog', 'public') +WHERE schemaname = 'pg_catalog' ORDER BY tablename, rulename; pg_settings|pg_settings_n|CREATE RULE pg_settings_n AS ON UPDATE TO pg_catalog.pg_settings DO INSTEAD NOTHING; pg_settings|pg_settings_u|CREATE RULE pg_settings_u AS ON UPDATE TO pg_catalog.pg_settings WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, false) AS set_config; -rtest_emp|rtest_emp_del|CREATE RULE rtest_emp_del AS - ON DELETE TO public.rtest_emp DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) - VALUES (old.ename, CURRENT_USER, 'fired'::bpchar, '$0.00'::money, old.salary); -rtest_emp|rtest_emp_ins|CREATE RULE rtest_emp_ins AS - ON INSERT TO public.rtest_emp DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) - VALUES (new.ename, CURRENT_USER, 'hired'::bpchar, new.salary, '$0.00'::money); -rtest_emp|rtest_emp_upd|CREATE RULE rtest_emp_upd AS - ON UPDATE TO public.rtest_emp - WHERE (new.salary <> old.salary) DO INSERT INTO rtest_emplog (ename, who, action, newsal, oldsal) - VALUES (new.ename, CURRENT_USER, 'honored'::bpchar, new.salary, old.salary); -rtest_nothn1|rtest_nothn_r1|CREATE RULE rtest_nothn_r1 AS - ON INSERT TO public.rtest_nothn1 - WHERE ((new.a >= 10) AND (new.a < 20)) DO INSTEAD NOTHING; -rtest_nothn1|rtest_nothn_r2|CREATE RULE rtest_nothn_r2 AS - ON INSERT TO public.rtest_nothn1 - WHERE ((new.a >= 30) AND (new.a < 40)) DO INSTEAD NOTHING; -rtest_nothn2|rtest_nothn_r3|CREATE RULE rtest_nothn_r3 AS - ON INSERT TO public.rtest_nothn2 - WHERE (new.a >= 100) DO INSTEAD INSERT INTO rtest_nothn3 (a, b) - VALUES (new.a, new.b); -rtest_nothn2|rtest_nothn_r4|CREATE RULE rtest_nothn_r4 AS - ON INSERT TO public.rtest_nothn2 DO INSTEAD NOTHING; -rtest_order1|rtest_order_r1|CREATE RULE rtest_order_r1 AS - ON INSERT TO public.rtest_order1 DO INSTEAD INSERT INTO rtest_order2 (a, b, c) - VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 1 - this should run 1st'::text); -rtest_order1|rtest_order_r2|CREATE RULE rtest_order_r2 AS - ON INSERT TO public.rtest_order1 DO INSERT INTO rtest_order2 (a, b, c) - VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 2 - this should run 2nd'::text); -rtest_order1|rtest_order_r3|CREATE RULE rtest_order_r3 AS - ON INSERT TO public.rtest_order1 DO INSTEAD INSERT INTO rtest_order2 (a, b, c) - VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 3 - this should run 3rd'::text); -rtest_order1|rtest_order_r4|CREATE RULE rtest_order_r4 AS - ON INSERT TO public.rtest_order1 - WHERE (new.a < 100) DO INSTEAD INSERT INTO rtest_order2 (a, b, c) - VALUES (new.a, nextval('rtest_seq'::regclass), 'rule 4 - this should run 4th'::text); -rtest_person|rtest_pers_del|CREATE RULE rtest_pers_del AS - ON DELETE TO public.rtest_person DO DELETE FROM rtest_admin - WHERE (rtest_admin.pname = old.pname); -rtest_person|rtest_pers_upd|CREATE RULE rtest_pers_upd AS - ON UPDATE TO public.rtest_person DO UPDATE rtest_admin SET pname = new.pname - WHERE (rtest_admin.pname = old.pname); -rtest_system|rtest_sys_del|CREATE RULE rtest_sys_del AS - ON DELETE TO public.rtest_system DO ( DELETE FROM rtest_interface - WHERE (rtest_interface.sysname = old.sysname); - DELETE FROM rtest_admin - WHERE (rtest_admin.sysname = old.sysname); -); -rtest_system|rtest_sys_upd|CREATE RULE rtest_sys_upd AS - ON UPDATE TO public.rtest_system DO ( UPDATE rtest_interface SET sysname = new.sysname - WHERE (rtest_interface.sysname = old.sysname); - UPDATE rtest_admin SET sysname = new.sysname - WHERE (rtest_admin.sysname = old.sysname); -); -rtest_t4|rtest_t4_ins1|CREATE RULE rtest_t4_ins1 AS - ON INSERT TO public.rtest_t4 - WHERE ((new.a >= 10) AND (new.a < 20)) DO INSTEAD INSERT INTO rtest_t5 (a, b) - VALUES (new.a, new.b); -rtest_t4|rtest_t4_ins2|CREATE RULE rtest_t4_ins2 AS - ON INSERT TO public.rtest_t4 - WHERE ((new.a >= 20) AND (new.a < 30)) DO INSERT INTO rtest_t6 (a, b) - VALUES (new.a, new.b); -rtest_t5|rtest_t5_ins|CREATE RULE rtest_t5_ins AS - ON INSERT TO public.rtest_t5 - WHERE (new.a > 15) DO INSERT INTO rtest_t7 (a, b) - VALUES (new.a, new.b); -rtest_t6|rtest_t6_ins|CREATE RULE rtest_t6_ins AS - ON INSERT TO public.rtest_t6 - WHERE (new.a > 25) DO INSTEAD INSERT INTO rtest_t8 (a, b) - VALUES (new.a, new.b); -rtest_v1|rtest_v1_del|CREATE RULE rtest_v1_del AS - ON DELETE TO public.rtest_v1 DO INSTEAD DELETE FROM rtest_t1 - WHERE (rtest_t1.a = old.a); -rtest_v1|rtest_v1_ins|CREATE RULE rtest_v1_ins AS - ON INSERT TO public.rtest_v1 DO INSTEAD INSERT INTO rtest_t1 (a, b) - VALUES (new.a, new.b); -rtest_v1|rtest_v1_upd|CREATE RULE rtest_v1_upd AS - ON UPDATE TO public.rtest_v1 DO INSTEAD UPDATE rtest_t1 SET a = new.a, b = new.b - WHERE (rtest_t1.a = old.a); -shoelace|shoelace_del|CREATE RULE shoelace_del AS - ON DELETE TO public.shoelace DO INSTEAD DELETE FROM shoelace_data - WHERE (shoelace_data.sl_name = old.sl_name); -shoelace|shoelace_ins|CREATE RULE shoelace_ins AS - ON INSERT TO public.shoelace DO INSTEAD INSERT INTO shoelace_data (sl_name, sl_avail, sl_color, sl_len, sl_unit) - VALUES (new.sl_name, new.sl_avail, new.sl_color, new.sl_len, new.sl_unit); -shoelace|shoelace_upd|CREATE RULE shoelace_upd AS - ON UPDATE TO public.shoelace DO INSTEAD UPDATE shoelace_data SET sl_name = new.sl_name, sl_avail = new.sl_avail, sl_color = new.sl_color, sl_len = new.sl_len, sl_unit = new.sl_unit - WHERE (shoelace_data.sl_name = old.sl_name); -shoelace_data|log_shoelace|CREATE RULE log_shoelace AS - ON UPDATE TO public.shoelace_data - WHERE (new.sl_avail <> old.sl_avail) DO INSERT INTO shoelace_log (sl_name, sl_avail, log_who, log_when) - VALUES (new.sl_name, new.sl_avail, 'Al Bundy'::name, 'Thu Jan 01 00:00:00 1970'::timestamp without time zone); -shoelace_ok|shoelace_ok_ins|CREATE RULE shoelace_ok_ins AS - ON INSERT TO public.shoelace_ok DO INSTEAD UPDATE shoelace SET sl_avail = (shoelace.sl_avail + new.ok_quant) - WHERE (shoelace.sl_name = new.ok_name); -- restore normal output mode \a\t -- @@ -3717,6 +3540,123 @@ 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 deparsing +CREATE TABLE sf_target(id int, data text, filling int[]); +CREATE FUNCTION merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN MATCHED + AND (s.a + t.id) = 42 + THEN UPDATE SET data = repeat(t.data, s.a) || s.b, id = length(s.b) +WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) +WHEN MATCHED + AND length(s.b || t.data) > 10 + THEN UPDATE SET data = s.b +WHEN MATCHED + AND s.a > 200 + THEN UPDATE SET filling[s.a] = t.id +WHEN MATCHED + AND s.a > 100 + THEN DELETE +WHEN MATCHED + THEN DO NOTHING +WHEN NOT MATCHED + AND s.a > 200 + THEN INSERT DEFAULT VALUES +WHEN NOT MATCHED + AND s.a > 100 + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) +WHEN NOT MATCHED + AND s.a > 0 + THEN INSERT + VALUES (s.a, s.b, DEFAULT) +WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END; +\sf merge_sf_test +CREATE OR REPLACE FUNCTION public.merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) + WHEN MATCHED + AND ((s.a + t.id) = 42) + THEN UPDATE SET data = (repeat(t.data, s.a) || s.b), id = length(s.b) + WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) + WHEN MATCHED + AND (length((s.b || t.data)) > 10) + THEN UPDATE SET data = s.b + WHEN MATCHED + AND (s.a > 200) + THEN UPDATE SET filling[s.a] = t.id + WHEN MATCHED + AND (s.a > 100) + THEN DELETE + WHEN MATCHED + THEN DO NOTHING + WHEN NOT MATCHED + AND (s.a > 200) + THEN INSERT DEFAULT VALUES + WHEN NOT MATCHED + AND (s.a > 100) + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) + WHEN NOT MATCHED + AND (s.a > 0) + THEN INSERT (id, data, filling) + VALUES (s.a, s.b, DEFAULT) + WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END +DROP FUNCTION merge_sf_test; +DROP TABLE sf_target; +-- -- Test enabling/disabling -- CREATE TABLE ruletest1 (a int); @@ -3750,3 +3690,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/third_party/spanner_pg/src/test/regress/expected/sanity_check.out b/third_party/spanner_pg/src/test/regress/expected/sanity_check.out index 99e7bb48..c5c675b7 100644 --- a/third_party/spanner_pg/src/test/regress/expected/sanity_check.out +++ b/third_party/spanner_pg/src/test/regress/expected/sanity_check.out @@ -1,227 +1,6 @@ VACUUM; -- --- sanity check, if we don't have indices the test will take years to --- complete. But skip TOAST relations (since they will have varying --- names depending on the current OID counter) as well as temp tables --- of other backends (to avoid timing-dependent behavior). --- --- temporarily disable fancy output, so catalog changes create less diff noise -\a\t -SELECT relname, relhasindex - FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace - WHERE relkind IN ('r', 'p') AND (nspname ~ '^pg_temp_') IS NOT TRUE - ORDER BY relname; -a|f -a_star|f -aggtest|f -array_index_op_test|t -array_op_test|f -b|f -b_star|f -bit_defaults|f -box_tbl|f -bprime|f -bt_f8_heap|t -bt_i4_heap|t -bt_name_heap|t -bt_txt_heap|t -c|f -c_star|f -char_tbl|f -check2_tbl|f -check_tbl|f -circle_tbl|t -city|f -copy_tbl|f -d|f -d_star|f -date_tbl|f -default_tbl|f -defaultexpr_tbl|f -dept|f -dupindexcols|t -e_star|f -emp|f -equipment_r|f -extra_wide_table|f -f_star|f -fast_emp4000|t -float4_tbl|f -float8_tbl|f -func_index_heap|t -hash_f8_heap|t -hash_i4_heap|t -hash_name_heap|t -hash_txt_heap|t -hobbies_r|f -ihighway|t -inet_tbl|f -insert_tbl|f -int2_tbl|f -int4_tbl|f -int8_tbl|f -interval_tbl|f -invalid_check_con|f -invalid_check_con_child|f -iportaltest|f -kd_point_tbl|t -line_tbl|f -log_table|f -lseg_tbl|f -main_table|f -mlparted|f -mlparted1|f -mlparted11|f -mlparted12|f -mlparted2|f -mlparted3|f -mlparted4|f -mlparted_def|f -mlparted_def1|f -mlparted_def2|f -mlparted_defd|f -money_data|f -num_data|f -num_exp_add|t -num_exp_div|t -num_exp_ln|t -num_exp_log10|t -num_exp_mul|t -num_exp_power_10_ln|t -num_exp_sqrt|t -num_exp_sub|t -num_input_test|f -num_result|f -nummultirange_test|t -numrange_test|t -onek|t -onek2|t -path_tbl|f -person|f -persons|f -persons2|t -persons3|t -pg_aggregate|t -pg_am|t -pg_amop|t -pg_amproc|t -pg_attrdef|t -pg_attribute|t -pg_auth_members|t -pg_authid|t -pg_cast|t -pg_class|t -pg_collation|t -pg_constraint|t -pg_conversion|t -pg_database|t -pg_db_role_setting|t -pg_default_acl|t -pg_depend|t -pg_description|t -pg_enum|t -pg_event_trigger|t -pg_extension|t -pg_foreign_data_wrapper|t -pg_foreign_server|t -pg_foreign_table|t -pg_index|t -pg_inherits|t -pg_init_privs|t -pg_language|t -pg_largeobject|t -pg_largeobject_metadata|t -pg_namespace|t -pg_opclass|t -pg_operator|t -pg_opfamily|t -pg_partitioned_table|t -pg_policy|t -pg_proc|t -pg_publication|t -pg_publication_rel|t -pg_range|t -pg_replication_origin|t -pg_rewrite|t -pg_seclabel|t -pg_sequence|t -pg_shdepend|t -pg_shdescription|t -pg_shseclabel|t -pg_statistic|t -pg_statistic_ext|t -pg_statistic_ext_data|t -pg_subscription|t -pg_subscription_rel|t -pg_tablespace|t -pg_transform|t -pg_trigger|t -pg_ts_config|t -pg_ts_config_map|t -pg_ts_dict|t -pg_ts_parser|t -pg_ts_template|t -pg_type|t -pg_user_mapping|t -point_tbl|t -polygon_tbl|t -quad_box_tbl|t -quad_box_tbl_ord_seq1|f -quad_box_tbl_ord_seq2|f -quad_point_tbl|t -quad_poly_tbl|t -radix_text_tbl|t -ramp|f -real_city|f -reservations|f -road|t -shighway|t -slow_emp4000|f -sql_features|f -sql_implementation_info|f -sql_parts|f -sql_sizing|f -stud_emp|f -student|f -tab_core_types|f -tableam_parted_a_heap2|f -tableam_parted_b_heap2|f -tableam_parted_c_heap2|f -tableam_parted_d_heap2|f -tableam_parted_heap2|f -tableam_tbl_heap2|f -tableam_tblas_heap2|f -tbl_include_box|t -tbl_include_box_pk|f -tbl_include_pk|t -tbl_include_reg|t -tbl_include_unique1|t -tbl_include_unique2|f -tenk1|t -tenk2|t -test_range_excl|t -test_range_gist|t -test_range_spgist|t -test_tsvector|f -testjsonb|f -text_tbl|f -textrange_test|t -time_tbl|f -timestamp_tbl|f -timestamptz_tbl|f -timetz_tbl|f -tmp|f -trigger_parted|t -trigger_parted_p1|t -trigger_parted_p1_1|t -trigger_parted_p2|t -trigger_parted_p2_2|t -varchar_tbl|f -view_base_table|t --- restore normal output mode -\a\t --- --- another sanity check: every system catalog that has OIDs should have +-- Sanity check: every system catalog that has OIDs should have -- a unique index on OID. This ensures that the OIDs will be unique, -- even after the OID counter wraps around. -- We exclude non-system tables from the check by looking at nspname. @@ -246,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_columns_length(coltypes) + FROM check_columns + WHERE get_columns_length(coltypes) % 8 != 0 OR + 'name'::regtype::oid = ANY(coltypes); + relname | attname | coltypes | get_columns_length +---------+---------+----------+-------------------- +(0 rows) + diff --git a/third_party/spanner_pg/src/test/regress/expected/select.out b/third_party/spanner_pg/src/test/regress/expected/select.out index 6dcd4fa8..33a6dceb 100644 --- a/third_party/spanner_pg/src/test/regress/expected/select.out +++ b/third_party/spanner_pg/src/test/regress/expected/select.out @@ -292,9 +292,6 @@ SELECT onek2.unique1, onek2.stringu1 FROM onek2 RESET enable_seqscan; RESET enable_bitmapscan; RESET enable_sort; -SELECT two, stringu1, ten, string4 - INTO TABLE tmp - FROM onek; -- -- awk '{print $1,$2;}' person.data | -- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | diff --git a/third_party/spanner_pg/src/test/regress/expected/select_distinct.out b/third_party/spanner_pg/src/test/regress/expected/select_distinct.out index 11c6f50f..748419ce 100644 --- a/third_party/spanner_pg/src/test/regress/expected/select_distinct.out +++ b/third_party/spanner_pg/src/test/regress/expected/select_distinct.out @@ -4,7 +4,7 @@ -- -- awk '{print $3;}' onek.data | sort -n | uniq -- -SELECT DISTINCT two FROM tmp ORDER BY 1; +SELECT DISTINCT two FROM onek ORDER BY 1; two ----- 0 @@ -14,7 +14,7 @@ SELECT DISTINCT two FROM tmp ORDER BY 1; -- -- awk '{print $5;}' onek.data | sort -n | uniq -- -SELECT DISTINCT ten FROM tmp ORDER BY 1; +SELECT DISTINCT ten FROM onek ORDER BY 1; ten ----- 0 @@ -32,7 +32,7 @@ SELECT DISTINCT ten FROM tmp ORDER BY 1; -- -- awk '{print $16;}' onek.data | sort -d | uniq -- -SELECT DISTINCT string4 FROM tmp ORDER BY 1; +SELECT DISTINCT string4 FROM onek ORDER BY 1; string4 --------- AAAAxx @@ -46,7 +46,7 @@ SELECT DISTINCT string4 FROM tmp ORDER BY 1; -- sort +0n -1 +1d -2 +2n -3 -- SELECT DISTINCT two, string4, ten - FROM tmp + FROM onek ORDER BY two using <, string4 using <, ten using <; two | string4 | ten -----+---------+----- @@ -210,6 +210,75 @@ DROP TABLE distinct_hash_1; DROP TABLE distinct_hash_2; DROP TABLE distinct_group_1; DROP TABLE distinct_group_2; +-- Test parallel DISTINCT +SET parallel_tuple_cost=0; +SET parallel_setup_cost=0; +SET min_parallel_table_scan_size=0; +SET max_parallel_workers_per_gather=2; +-- Ensure we get a parallel plan +EXPLAIN (costs off) +SELECT DISTINCT four FROM tenk1; + QUERY PLAN +---------------------------------------------------- + Unique + -> Sort + Sort Key: four + -> Gather + Workers Planned: 2 + -> HashAggregate + Group Key: four + -> Parallel Seq Scan on tenk1 +(8 rows) + +-- Ensure the parallel plan produces the correct results +SELECT DISTINCT four FROM tenk1; + four +------ + 0 + 1 + 2 + 3 +(4 rows) + +CREATE OR REPLACE FUNCTION distinct_func(a INT) RETURNS INT AS $$ + BEGIN + RETURN a; + END; +$$ LANGUAGE plpgsql PARALLEL UNSAFE; +-- Ensure we don't do parallel distinct with a parallel unsafe function +EXPLAIN (COSTS OFF) +SELECT DISTINCT distinct_func(1) FROM tenk1; + QUERY PLAN +---------------------------------------------------------- + Unique + -> Sort + Sort Key: (distinct_func(1)) + -> Index Only Scan using tenk1_hundred on tenk1 +(4 rows) + +-- make the function parallel safe +CREATE OR REPLACE FUNCTION distinct_func(a INT) RETURNS INT AS $$ + BEGIN + RETURN a; + END; +$$ LANGUAGE plpgsql PARALLEL SAFE; +-- Ensure we do parallel distinct now that the function is parallel safe +EXPLAIN (COSTS OFF) +SELECT DISTINCT distinct_func(1) FROM tenk1; + QUERY PLAN +---------------------------------------------- + Unique + -> Sort + Sort Key: (distinct_func(1)) + -> Gather + Workers Planned: 2 + -> Parallel Seq Scan on tenk1 +(6 rows) + +RESET max_parallel_workers_per_gather; +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; +RESET parallel_tuple_cost; -- -- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its -- very own regression file. diff --git a/third_party/spanner_pg/src/test/regress/expected/select_distinct_on.out b/third_party/spanner_pg/src/test/regress/expected/select_distinct_on.out index b787b307..3d989909 100644 --- a/third_party/spanner_pg/src/test/regress/expected/select_distinct_on.out +++ b/third_party/spanner_pg/src/test/regress/expected/select_distinct_on.out @@ -2,7 +2,7 @@ -- SELECT_DISTINCT_ON -- SELECT DISTINCT ON (string4) string4, two, ten - FROM tmp + FROM onek ORDER BY string4 using <, two using >, ten using <; string4 | two | ten ---------+-----+----- @@ -14,13 +14,13 @@ SELECT DISTINCT ON (string4) string4, two, ten -- this will fail due to conflict of ordering requirements SELECT DISTINCT ON (string4, ten) string4, two, ten - FROM tmp + FROM onek ORDER BY string4 using <, two using <, ten using <; ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON (string4, ten) string4, two, ten ^ SELECT DISTINCT ON (string4, ten) string4, ten, two - FROM tmp + FROM onek ORDER BY string4 using <, ten using >, two using <; string4 | ten | two ---------+-----+----- diff --git a/third_party/spanner_pg/src/test/regress/expected/select_into.out b/third_party/spanner_pg/src/test/regress/expected/select_into.out index 43b8209d..b79fe9a1 100644 --- a/third_party/spanner_pg/src/test/regress/expected/select_into.out +++ b/third_party/spanner_pg/src/test/regress/expected/select_into.out @@ -162,9 +162,9 @@ DROP TABLE easi, easi2; -- -- Disallowed uses of SELECT ... INTO. All should fail -- -DECLARE foo CURSOR FOR SELECT 1 INTO b; +DECLARE foo CURSOR FOR SELECT 1 INTO int4_tbl; ERROR: SELECT ... INTO is not allowed here -LINE 1: DECLARE foo CURSOR FOR SELECT 1 INTO b; +LINE 1: DECLARE foo CURSOR FOR SELECT 1 INTO int4_tbl; ^ COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob'; ERROR: COPY (SELECT INTO) is not supported @@ -172,12 +172,12 @@ SELECT * FROM (SELECT 1 INTO f) bar; ERROR: SELECT ... INTO is not allowed here LINE 1: SELECT * FROM (SELECT 1 INTO f) bar; ^ -CREATE VIEW foo AS SELECT 1 INTO b; +CREATE VIEW foo AS SELECT 1 INTO int4_tbl; ERROR: views must not contain SELECT INTO -INSERT INTO b SELECT 1 INTO f; +INSERT INTO int4_tbl SELECT 1 INTO f; ERROR: SELECT ... INTO is not allowed here -LINE 1: INSERT INTO b SELECT 1 INTO f; - ^ +LINE 1: INSERT INTO int4_tbl SELECT 1 INTO f; + ^ -- Test CREATE TABLE AS ... IF NOT EXISTS CREATE TABLE ctas_ine_tbl AS SELECT 1; CREATE TABLE ctas_ine_tbl AS SELECT 1 / 0; -- error diff --git a/third_party/spanner_pg/src/test/regress/expected/sequence.out b/third_party/spanner_pg/src/test/regress/expected/sequence.out index 8b928b28..7cb2f7cc 100644 --- a/third_party/spanner_pg/src/test/regress/expected/sequence.out +++ b/third_party/spanner_pg/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; @@ -21,7 +19,8 @@ CREATE SEQUENCE sequence_testx OWNED BY nobody; -- nonsense word ERROR: invalid OWNED BY option HINT: Specify OWNED BY table.column or OWNED BY NONE. CREATE SEQUENCE sequence_testx OWNED BY pg_class_oid_index.oid; -- not a table -ERROR: referenced relation "pg_class_oid_index" is not a table or foreign table +ERROR: sequence cannot be owned by relation "pg_class_oid_index" +DETAIL: This operation is not supported for indexes. CREATE SEQUENCE sequence_testx OWNED BY pg_class.relname; -- not same schema ERROR: sequence must be in same schema as table it is linked to CREATE TABLE sequence_test_table (a int); @@ -599,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/third_party/spanner_pg/src/test/regress/expected/spgist.out b/third_party/spanner_pg/src/test/regress/expected/spgist.out index 1688e0e0..2e911285 100644 --- a/third_party/spanner_pg/src/test/regress/expected/spgist.out +++ b/third_party/spanner_pg/src/test/regress/expected/spgist.out @@ -86,3 +86,11 @@ select * from spgist_domain_tbl where f1 = 'fo'; fo (1 row) +-- test an unlogged table, mostly to get coverage of spgistbuildempty +create unlogged table spgist_unlogged_tbl(id serial, b box); +create index spgist_unlogged_idx on spgist_unlogged_tbl using spgist (b); +insert into spgist_unlogged_tbl(b) +select box(point(i,j)) + from generate_series(1,100,5) i, + generate_series(1,10,5) j; +-- leave this table around, to help in testing dump/restore diff --git a/third_party/spanner_pg/src/test/regress/expected/stats.out b/third_party/spanner_pg/src/test/regress/expected/stats.out index 4eeaaca8..ffcba306 100644 --- a/third_party/spanner_pg/src/test/regress/expected/stats.out +++ b/third_party/spanner_pg/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). @@ -16,7 +16,13 @@ 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'; +-- record dboid for later use +SELECT oid AS dboid from pg_database where datname = current_database() \gset -- 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,58 +31,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'; --- 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 - -- we don't want to wait forever; loop will 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; +COMMIT; -- 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); @@ -145,21 +100,16 @@ 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) -- 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; @@ -199,8 +149,856 @@ FROM prevstats AS pr; t (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; +----- +-- Test reset of some stats for shared table +----- +-- This updates the comment of the database currently in use in +-- pg_shdescription with a fake value, then sets it back to its +-- original value. +SELECT shobj_description(d.oid, 'pg_database') as description_before + FROM pg_database d WHERE datname = current_database() \gset +-- force some stats in pg_shdescription. +BEGIN; +SELECT current_database() as datname \gset +COMMENT ON DATABASE :"datname" IS 'This is a test comment'; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +COMMIT; +-- check that the stats are reset. +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + has_data +---------- + t +(1 row) + +SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass); + pg_stat_reset_single_table_counters +------------------------------------- + +(1 row) + +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + has_data +---------- + f +(1 row) + +-- set back comment +\if :{?description_before} + COMMENT ON DATABASE :"datname" IS :'description_before'; +\else + COMMENT ON DATABASE :"datname" IS NULL; +\endif +----- +-- 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 pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +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 +---- +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; +---- +-- Changing stats_fetch_consistency in a transaction. +---- +BEGIN; +-- Stats filled under the cache mode +SET LOCAL stats_fetch_consistency = cache; +SELECT pg_stat_get_function_calls(0); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; + snapshot_ok +------------- + f +(1 row) + +-- Success in accessing pre-existing snapshot data. +SET LOCAL stats_fetch_consistency = snapshot; +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; + snapshot_ok +------------- + f +(1 row) + +SELECT pg_stat_get_function_calls(0); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; + snapshot_ok +------------- + t +(1 row) + +-- Snapshot cleared. +SET LOCAL stats_fetch_consistency = none; +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; + snapshot_ok +------------- + f +(1 row) + +SELECT pg_stat_get_function_calls(0); + pg_stat_get_function_calls +---------------------------- + +(1 row) + +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; + snapshot_ok +------------- + f +(1 row) + +ROLLBACK; +---- +-- 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', :dboid, 1); + pg_stat_have_stats +-------------------- + f +(1 row) + +SELECT pg_stat_have_stats('database', :dboid, 0); + pg_stat_have_stats +-------------------- + t +(1 row) + +-- pg_stat_have_stats returns true for committed index creation +CREATE table stats_test_tab1 as select generate_series(1,10) a; +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +SET enable_seqscan TO off; +select a from stats_test_tab1 where a = 3; + a +--- + 3 +(1 row) + +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +-- pg_stat_have_stats returns false for dropped index with stats +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +DROP index stats_test_idx1; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + f +(1 row) + +-- pg_stat_have_stats returns false for rolled back index creation +BEGIN; +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +select a from stats_test_tab1 where a = 3; + a +--- + 3 +(1 row) + +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +ROLLBACK; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + f +(1 row) + +-- pg_stat_have_stats returns true for reindex CONCURRENTLY +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +select a from stats_test_tab1 where a = 3; + a +--- + 3 +(1 row) + +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +REINDEX index CONCURRENTLY stats_test_idx1; +-- false for previous oid +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + f +(1 row) + +-- true for new oid +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +-- pg_stat_have_stats returns true for a rolled back drop index with stats +BEGIN; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +DROP index stats_test_idx1; +ROLLBACK; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + pg_stat_have_stats +-------------------- + t +(1 row) + +-- put enable_seqscan back to on +SET enable_seqscan TO on; -- ensure that stats accessors handle NULL input correctly SELECT pg_stat_get_replication_slot(NULL); pg_stat_get_replication_slot @@ -208,4 +1006,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/third_party/spanner_pg/src/test/regress/expected/stats_ext.out b/third_party/spanner_pg/src/test/regress/expected/stats_ext.out index 42a01dad..67cae4a8 100644 --- a/third_party/spanner_pg/src/test/regress/expected/stats_ext.out +++ b/third_party/spanner_pg/src/test/regress/expected/stats_ext.out @@ -140,13 +140,12 @@ Statistics objects: "public.ab1_a_b_stats" ON a, b FROM ab1; STATISTICS 0 ANALYZE ab1; -SELECT stxname, stxdndistinct, stxddependencies, stxdmcv - FROM pg_statistic_ext s, pg_statistic_ext_data d - WHERE s.stxname = 'ab1_a_b_stats' - AND d.stxoid = s.oid; - stxname | stxdndistinct | stxddependencies | stxdmcv ----------------+---------------+------------------+--------- - ab1_a_b_stats | | | +SELECT stxname, stxdndistinct, stxddependencies, stxdmcv, stxdinherit + FROM pg_statistic_ext s LEFT JOIN pg_statistic_ext_data d ON (d.stxoid = s.oid) + WHERE s.stxname = 'ab1_a_b_stats'; + stxname | stxdndistinct | stxddependencies | stxdmcv | stxdinherit +---------------+---------------+------------------+---------+------------- + ab1_a_b_stats | | | | (1 row) ALTER STATISTICS ab1_a_b_stats SET STATISTICS -1; @@ -200,12 +199,11 @@ SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b CREATE STATISTICS stxdinh ON a, b FROM stxdinh; VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; --- Since the stats object does not include inherited stats, it should not --- affect the estimates +-- See if the extended stats affect the estimates SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); estimated | actual -----------+-------- - 400 | 150 + 150 | 150 (1 row) -- Dependencies are applied at individual relations (within append), so @@ -216,12 +214,25 @@ SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b 22 | 40 (1 row) +-- Ensure correct (non-inherited) stats are applied to inherited query +SELECT * FROM check_estimated_rows('SELECT a, b FROM ONLY stxdinh GROUP BY 1, 2'); + estimated | actual +-----------+-------- + 100 | 100 +(1 row) + +SELECT * FROM check_estimated_rows('SELECT a, b FROM ONLY stxdinh WHERE a = 0 AND b = 0'); + estimated | actual +-----------+-------- + 20 | 20 +(1 row) + DROP TABLE stxdinh, stxdinh1, stxdinh2; -- Ensure inherited stats ARE applied to inherited query in partitioned table CREATE TABLE stxdinp(i int, a int, b int) PARTITION BY RANGE (i); CREATE TABLE stxdinp1 PARTITION OF stxdinp FOR VALUES FROM (1) TO (100); INSERT INTO stxdinp SELECT 1, a/100, a/100 FROM generate_series(1, 999) a; -CREATE STATISTICS stxdinp ON a, b FROM stxdinp; +CREATE STATISTICS stxdinp ON (a + 1), a, b FROM stxdinp; VACUUM ANALYZE stxdinp; -- partitions are processed recursively SELECT 1 FROM pg_statistic_ext WHERE stxrelid = 'stxdinp'::regclass; ?column? @@ -235,6 +246,12 @@ SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinp GROUP BY 1, 2'); 10 | 10 (1 row) +SELECT * FROM check_estimated_rows('SELECT a + 1, b FROM ONLY stxdinp GROUP BY 1, 2'); + estimated | actual +-----------+-------- + 1 | 0 +(1 row) + DROP TABLE stxdinp; -- basic test for statistics on expressions CREATE TABLE ab1 (a INTEGER, b INTEGER, c TIMESTAMP, d TIMESTAMPTZ); @@ -293,14 +310,18 @@ CREATE TABLE tststats.pt (a int, b int, c text) PARTITION BY RANGE (a, b); CREATE TABLE tststats.pt1 PARTITION OF tststats.pt FOR VALUES FROM (-10, -10) TO (10, 10); CREATE STATISTICS tststats.s1 ON a, b FROM tststats.t; CREATE STATISTICS tststats.s2 ON a, b FROM tststats.ti; -ERROR: relation "ti" is not a table, foreign table, or materialized view +ERROR: cannot define statistics for relation "ti" +DETAIL: This operation is not supported for indexes. CREATE STATISTICS tststats.s3 ON a, b FROM tststats.s; -ERROR: relation "s" is not a table, foreign table, or materialized view +ERROR: cannot define statistics for relation "s" +DETAIL: This operation is not supported for sequences. CREATE STATISTICS tststats.s4 ON a, b FROM tststats.v; -ERROR: relation "v" is not a table, foreign table, or materialized view +ERROR: cannot define statistics for relation "v" +DETAIL: This operation is not supported for views. CREATE STATISTICS tststats.s5 ON a, b FROM tststats.mv; CREATE STATISTICS tststats.s6 ON a, b FROM tststats.ty; -ERROR: relation "ty" is not a table, foreign table, or materialized view +ERROR: cannot define statistics for relation "ty" +DETAIL: This operation is not supported for composite types. CREATE STATISTICS tststats.s7 ON a, b FROM tststats.f; CREATE STATISTICS tststats.s8 ON a, b FROM tststats.pt; CREATE STATISTICS tststats.s9 ON a, b FROM tststats.pt1; diff --git a/third_party/spanner_pg/src/test/regress/expected/strings.out b/third_party/spanner_pg/src/test/regress/expected/strings.out index 99b0eb3f..b72120d4 100644 --- a/third_party/spanner_pg/src/test/regress/expected/strings.out +++ b/third_party/spanner_pg/src/test/regress/expected/strings.out @@ -515,6 +515,13 @@ SELECT SUBSTRING('abcdefg' FROM 'b(.*)f') AS "cde"; cde (1 row) +-- Check case where we have a match, but not a subexpression match +SELECT SUBSTRING('foo' FROM 'foo(bar)?') IS NULL AS t; + t +--- + t +(1 row) + -- Check behavior of SIMILAR TO, which uses largely the same regexp variant SELECT 'abcdefg' SIMILAR TO '_bcd%' AS true; true @@ -564,13 +571,32 @@ SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; ERROR: invalid escape string HINT: Escape string must be empty or one character. --- Test back reference in regexp_replace +-- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); regexp_replace ---------------- (111) 222-3333 (1 row) +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\&Y', 'g'); + regexp_replace +------------------- + fXooYbaXrrYbaXzzY +(1 row) + +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\\\Y', 'g'); + regexp_replace +---------------- + fX\YbaX\YbaX\Y +(1 row) + +-- not an error, though perhaps it should be: +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\Y\\1Z\\'); + regexp_replace +----------------- + fX\YoZ\barrbazz +(1 row) + SELECT regexp_replace('AAA BBB CCC ', E'\\s+', ' ', 'g'); regexp_replace ---------------- @@ -592,6 +618,370 @@ SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'gi'); -- invalid regexp option SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'z'); ERROR: invalid regular expression option: "z" +-- extended regexp_replace tests +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 1); + regexp_replace +----------------------- + X PostgreSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 1, 2); + regexp_replace +----------------------- + A PXstgreSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 0, 'i'); + regexp_replace +----------------------- + X PXstgrXSQL fXnctXXn +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 1, 'i'); + regexp_replace +----------------------- + X PostgreSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 2, 'i'); + regexp_replace +----------------------- + A PXstgreSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 3, 'i'); + regexp_replace +----------------------- + A PostgrXSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 9, 'i'); + regexp_replace +----------------------- + A PostgreSQL function +(1 row) + +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 7, 0, 'i'); + regexp_replace +----------------------- + A PostgrXSQL fXnctXXn +(1 row) + +-- 'g' flag should be ignored when N is specified +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 1, 'g'); + regexp_replace +----------------------- + A PXstgreSQL function +(1 row) + +-- errors +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', -1, 0, 'i'); +ERROR: invalid value for parameter "start": -1 +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, -1, 'i'); +ERROR: invalid value for parameter "n": -1 +-- erroneous invocation of non-extended form +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', '1'); +ERROR: invalid regular expression option: "1" +HINT: If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly. +-- regexp_count tests +SELECT regexp_count('123123123123123', '(12)3'); + regexp_count +-------------- + 5 +(1 row) + +SELECT regexp_count('123123123123', '123', 1); + regexp_count +-------------- + 4 +(1 row) + +SELECT regexp_count('123123123123', '123', 3); + regexp_count +-------------- + 3 +(1 row) + +SELECT regexp_count('123123123123', '123', 33); + regexp_count +-------------- + 0 +(1 row) + +SELECT regexp_count('ABCABCABCABC', 'Abc', 1, ''); + regexp_count +-------------- + 0 +(1 row) + +SELECT regexp_count('ABCABCABCABC', 'Abc', 1, 'i'); + regexp_count +-------------- + 4 +(1 row) + +-- errors +SELECT regexp_count('123123123123', '123', 0); +ERROR: invalid value for parameter "start": 0 +SELECT regexp_count('123123123123', '123', -3); +ERROR: invalid value for parameter "start": -3 +-- regexp_like tests +SELECT regexp_like('Steven', '^Ste(v|ph)en$'); + regexp_like +------------- + t +(1 row) + +SELECT regexp_like('a'||CHR(10)||'d', 'a.d', 'n'); + regexp_like +------------- + f +(1 row) + +SELECT regexp_like('a'||CHR(10)||'d', 'a.d', 's'); + regexp_like +------------- + t +(1 row) + +SELECT regexp_like('abc', ' a . c ', 'x'); + regexp_like +------------- + t +(1 row) + +SELECT regexp_like('abc', 'a.c', 'g'); -- error +ERROR: regexp_like() does not support the "global" option +-- regexp_instr tests +SELECT regexp_instr('abcdefghi', 'd.f'); + regexp_instr +-------------- + 4 +(1 row) + +SELECT regexp_instr('abcdefghi', 'd.q'); + regexp_instr +-------------- + 0 +(1 row) + +SELECT regexp_instr('abcabcabc', 'a.c'); + regexp_instr +-------------- + 1 +(1 row) + +SELECT regexp_instr('abcabcabc', 'a.c', 2); + regexp_instr +-------------- + 4 +(1 row) + +SELECT regexp_instr('abcabcabc', 'a.c', 1, 3); + regexp_instr +-------------- + 7 +(1 row) + +SELECT regexp_instr('abcabcabc', 'a.c', 1, 4); + regexp_instr +-------------- + 0 +(1 row) + +SELECT regexp_instr('abcabcabc', 'A.C', 1, 2, 0, 'i'); + regexp_instr +-------------- + 4 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 0); + regexp_instr +-------------- + 1 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1); + regexp_instr +-------------- + 1 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2); + regexp_instr +-------------- + 4 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 3); + regexp_instr +-------------- + 5 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4); + regexp_instr +-------------- + 7 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 5); + regexp_instr +-------------- + 0 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 0); + regexp_instr +-------------- + 9 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 1); + regexp_instr +-------------- + 4 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 2); + regexp_instr +-------------- + 9 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 3); + regexp_instr +-------------- + 7 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 4); + regexp_instr +-------------- + 9 +(1 row) + +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 5); + regexp_instr +-------------- + 0 +(1 row) + +-- Check case where we have a match, but not a subexpression match +SELECT regexp_instr('foo', 'foo(bar)?', 1, 1, 0, '', 1); + regexp_instr +-------------- + 0 +(1 row) + +-- errors +SELECT regexp_instr('abcabcabc', 'a.c', 0, 1); +ERROR: invalid value for parameter "start": 0 +SELECT regexp_instr('abcabcabc', 'a.c', 1, 0); +ERROR: invalid value for parameter "n": 0 +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, -1); +ERROR: invalid value for parameter "endoption": -1 +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 2); +ERROR: invalid value for parameter "endoption": 2 +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 0, 'g'); +ERROR: regexp_instr() does not support the "global" option +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 0, '', -1); +ERROR: invalid value for parameter "subexpr": -1 +-- regexp_substr tests +SELECT regexp_substr('abcdefghi', 'd.f'); + regexp_substr +--------------- + def +(1 row) + +SELECT regexp_substr('abcdefghi', 'd.q') IS NULL AS t; + t +--- + t +(1 row) + +SELECT regexp_substr('abcabcabc', 'a.c'); + regexp_substr +--------------- + abc +(1 row) + +SELECT regexp_substr('abcabcabc', 'a.c', 2); + regexp_substr +--------------- + abc +(1 row) + +SELECT regexp_substr('abcabcabc', 'a.c', 1, 3); + regexp_substr +--------------- + abc +(1 row) + +SELECT regexp_substr('abcabcabc', 'a.c', 1, 4) IS NULL AS t; + t +--- + t +(1 row) + +SELECT regexp_substr('abcabcabc', 'A.C', 1, 2, 'i'); + regexp_substr +--------------- + abc +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 0); + regexp_substr +--------------- + 12345678 +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 1); + regexp_substr +--------------- + 123 +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 2); + regexp_substr +--------------- + 45678 +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 3); + regexp_substr +--------------- + 56 +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 4); + regexp_substr +--------------- + 78 +(1 row) + +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 5) IS NULL AS t; + t +--- + t +(1 row) + +-- Check case where we have a match, but not a subexpression match +SELECT regexp_substr('foo', 'foo(bar)?', 1, 1, '', 1) IS NULL AS t; + t +--- + t +(1 row) + +-- errors +SELECT regexp_substr('abcabcabc', 'a.c', 0, 1); +ERROR: invalid value for parameter "start": 0 +SELECT regexp_substr('abcabcabc', 'a.c', 1, 0); +ERROR: invalid value for parameter "n": 0 +SELECT regexp_substr('abcabcabc', 'a.c', 1, 1, 'g'); +ERROR: regexp_substr() does not support the "global" option +SELECT regexp_substr('abcabcabc', 'a.c', 1, 1, '', -1); +ERROR: invalid value for parameter "subexpr": -1 -- set so we can tell NULL from empty string \pset null '\\N' -- return all matches from regexp diff --git a/third_party/spanner_pg/src/test/regress/expected/subscription.out b/third_party/spanner_pg/src/test/regress/expected/subscription.out index 85bd97ed..ab587354 100644 --- a/third_party/spanner_pg/src/test/regress/expected/subscription.out +++ b/third_party/spanner_pg/src/test/regress/expected/subscription.out @@ -54,7 +54,7 @@ CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PU ERROR: connect = false and create_slot = true are mutually exclusive options CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = true); ERROR: slot_name = NONE and enabled = true are mutually exclusive options -CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = false, create_slot = true); ERROR: slot_name = NONE and create_slot = true are mutually exclusive options CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE); ERROR: subscription with slot_name = NONE must also set enabled = false @@ -84,10 +84,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | 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); @@ -101,11 +101,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+---------------------+--------+-----------+--------------------+------------------------------ - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | 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; @@ -137,10 +151,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 | Synchronous commit | Conninfo ----------------------+---------------------------+---------+---------------------+--------+-----------+--------------------+------------------------------ - regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | 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 @@ -173,19 +187,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | t | 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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | 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; @@ -196,19 +210,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | 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 | 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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | 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 @@ -223,10 +237,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-----------------------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | 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 @@ -241,10 +255,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 | Synchronous commit | Conninfo ------------------+---------------------------+---------+-------------+--------+-----------+--------------------+----------------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | 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; @@ -271,6 +285,68 @@ ALTER SUBSCRIPTION regress_testsub DISABLE; ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); DROP SUBSCRIPTION regress_testsub; DROP FUNCTION func; +-- fail - two_phase must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, two_phase = foo); +ERROR: two_phase requires a Boolean value +-- now it works +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 | 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. +ALTER SUBSCRIPTION regress_testsub SET (two_phase = false); +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 | 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); +DROP SUBSCRIPTION regress_testsub; +-- two_phase and streaming are compatible. +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 | 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); +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 | 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 | 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); +DROP SUBSCRIPTION regress_testsub; RESET SESSION AUTHORIZATION; DROP ROLE regress_subscription_user; DROP ROLE regress_subscription_user2; diff --git a/third_party/spanner_pg/src/test/regress/expected/sysviews.out b/third_party/spanner_pg/src/test/regress/expected/sysviews.out index 20888576..579b861d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/sysviews.out +++ b/third_party/spanner_pg/src/test/regress/expected/sysviews.out @@ -20,7 +20,7 @@ select count(*) >= 0 as ok from pg_available_extensions; (1 row) -- The entire output of pg_backend_memory_contexts is not stable, --- we test only the existance and basic condition of TopMemoryContext. +-- we test only the existence and basic condition of TopMemoryContext. select name, ident, parent, level, total_bytes >= free_bytes from pg_backend_memory_contexts where level = 0; name | ident | parent | level | ?column? @@ -48,11 +48,20 @@ 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 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 diff --git a/third_party/spanner_pg/src/test/regress/expected/tablesample.out b/third_party/spanner_pg/src/test/regress/expected/tablesample.out index 078358d2..60bb4e8e 100644 --- a/third_party/spanner_pg/src/test/regress/expected/tablesample.out +++ b/third_party/spanner_pg/src/test/regress/expected/tablesample.out @@ -88,7 +88,7 @@ View definition: -- check a sampled query doesn't affect cursor in progress BEGIN; -DECLARE tablesample_cur CURSOR FOR +DECLARE tablesample_cur SCROLL CURSOR FOR SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); FETCH FIRST FROM tablesample_cur; id diff --git a/third_party/spanner_pg/src/test/regress/output/tablespace.source b/third_party/spanner_pg/src/test/regress/expected/tablespace.out similarity index 95% rename from third_party/spanner_pg/src/test/regress/output/tablespace.source rename to third_party/spanner_pg/src/test/regress/expected/tablespace.out index 1bbe7e03..c52cf1cf 100644 --- a/third_party/spanner_pg/src/test/regress/output/tablespace.source +++ b/third_party/spanner_pg/src/test/regress/expected/tablespace.out @@ -1,7 +1,18 @@ +-- relative tablespace locations are not allowed +CREATE TABLESPACE regress_tblspace LOCATION 'relative'; -- fail +ERROR: tablespace location must be an absolute path +-- empty tablespace locations are not usually allowed +CREATE TABLESPACE regress_tblspace LOCATION ''; -- fail +ERROR: tablespace location must be an absolute path +-- as a special developer-only option to allow us to use tablespaces +-- with streaming replication on the same server, an empty location +-- can be allowed as a way to say that the tablespace should be created +-- as a directory in pg_tblspc, rather than being a symlink +SET allow_in_place_tablespaces = true; -- create a tablespace using WITH clause -CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail +CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (some_nonexistent_parameter = true); -- fail ERROR: unrecognized parameter "some_nonexistent_parameter" -CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok +CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (random_page_cost = 3.0); -- ok -- check to see the parameter was used SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; spcoptions @@ -12,7 +23,16 @@ SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; -- drop the tablespace so we can re-use the location DROP TABLESPACE regress_tblspacewith; -- create a tablespace we can use -CREATE TABLESPACE regress_tblspace LOCATION '@testtablespace@'; +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 @@ -885,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 @@ -919,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/third_party/spanner_pg/src/test/regress/expected/test_setup.out b/third_party/spanner_pg/src/test/regress/expected/test_setup.out new file mode 100644 index 00000000..391b36d1 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/expected/test_setup.out @@ -0,0 +1,230 @@ +-- +-- TEST_SETUP --- prepare environment expected by regression test scripts +-- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv libdir PG_LIBDIR +\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. +-- +GRANT ALL ON SCHEMA public TO public; +-- +-- These tables have traditionally been referenced by many tests, +-- so create and populate them. Insert only non-error values here. +-- (Some subsequent tests try to insert erroneous values. That's okay +-- because the table won't actually change. Do not change the contents +-- of these tables in later tests, as it may affect other tests.) +-- +CREATE TABLE CHAR_TBL(f1 char(4)); +INSERT INTO CHAR_TBL (f1) VALUES + ('a'), + ('ab'), + ('abcd'), + ('abcd '); +VACUUM CHAR_TBL; +CREATE TABLE FLOAT8_TBL(f1 float8); +INSERT INTO FLOAT8_TBL(f1) VALUES + ('0.0'), + ('-34.84'), + ('-1004.30'), + ('-1.2345678901234e+200'), + ('-1.2345678901234e-200'); +VACUUM FLOAT8_TBL; +CREATE TABLE INT2_TBL(f1 int2); +INSERT INTO INT2_TBL(f1) VALUES + ('0 '), + (' 1234 '), + (' -1234'), + ('32767'), -- largest and smallest values + ('-32767'); +VACUUM INT2_TBL; +CREATE TABLE INT4_TBL(f1 int4); +INSERT INTO INT4_TBL(f1) VALUES + (' 0 '), + ('123456 '), + (' -123456'), + ('2147483647'), -- largest and smallest values + ('-2147483647'); +VACUUM INT4_TBL; +CREATE TABLE INT8_TBL(q1 int8, q2 int8); +INSERT INTO INT8_TBL VALUES + (' 123 ',' 456'), + ('123 ','4567890123456789'), + ('4567890123456789','123'), + (+4567890123456789,'4567890123456789'), + ('+4567890123456789','-4567890123456789'); +VACUUM INT8_TBL; +CREATE TABLE POINT_TBL(f1 point); +INSERT INTO POINT_TBL(f1) VALUES + ('(0.0,0.0)'), + ('(-10.0,0.0)'), + ('(-3.0,4.0)'), + ('(5.1, 34.5)'), + ('(-5.0,-12.0)'), + ('(1e-300,-1e-300)'), -- To underflow + ('(1e+300,Inf)'), -- To overflow + ('(Inf,1e+300)'), -- Transposed + (' ( Nan , NaN ) '), + ('10.0,10.0'); +-- We intentionally don't vacuum point_tbl here; geometry depends on that +CREATE TABLE TEXT_TBL (f1 text); +INSERT INTO TEXT_TBL VALUES + ('doh!'), + ('hi de ho neighbor'); +VACUUM TEXT_TBL; +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); +INSERT INTO VARCHAR_TBL (f1) VALUES + ('a'), + ('ab'), + ('abcd'), + ('abcd '); +VACUUM VARCHAR_TBL; +CREATE TABLE onek ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +\set filename :abs_srcdir '/data/onek.data' +COPY onek FROM :'filename'; +VACUUM ANALYZE onek; +CREATE TABLE onek2 AS SELECT * FROM onek; +VACUUM ANALYZE onek2; +CREATE TABLE tenk1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); +\set filename :abs_srcdir '/data/tenk.data' +COPY tenk1 FROM :'filename'; +VACUUM ANALYZE tenk1; +CREATE TABLE tenk2 AS SELECT * FROM tenk1; +VACUUM ANALYZE tenk2; +CREATE TABLE person ( + name text, + age int4, + location point +); +\set filename :abs_srcdir '/data/person.data' +COPY person FROM :'filename'; +VACUUM ANALYZE person; +CREATE TABLE emp ( + salary int4, + manager name +) INHERITS (person); +\set filename :abs_srcdir '/data/emp.data' +COPY emp FROM :'filename'; +VACUUM ANALYZE emp; +CREATE TABLE student ( + gpa float8 +) INHERITS (person); +\set filename :abs_srcdir '/data/student.data' +COPY student FROM :'filename'; +VACUUM ANALYZE student; +CREATE TABLE stud_emp ( + percent int4 +) INHERITS (emp, student); +NOTICE: merging multiple inherited definitions of column "name" +NOTICE: merging multiple inherited definitions of column "age" +NOTICE: merging multiple inherited definitions of column "location" +\set filename :abs_srcdir '/data/stud_emp.data' +COPY stud_emp FROM :'filename'; +VACUUM ANALYZE stud_emp; +CREATE TABLE road ( + name text, + thepath path +); +\set filename :abs_srcdir '/data/streets.data' +COPY road FROM :'filename'; +VACUUM ANALYZE road; +CREATE TABLE ihighway () INHERITS (road); +INSERT INTO ihighway + SELECT * + FROM ONLY road + WHERE name ~ 'I- .*'; +VACUUM ANALYZE ihighway; +CREATE TABLE shighway ( + surface text +) INHERITS (road); +INSERT INTO shighway + SELECT *, 'asphalt' + FROM ONLY road + WHERE name ~ 'State Hwy.*'; +VACUUM ANALYZE shighway; +-- +-- We must have some enum type in the database for opr_sanity and type_sanity. +-- +create type stoplight as enum ('red', 'yellow', 'green'); +-- +-- Also create some non-built-in range types. +-- +create type float8range as range (subtype = float8, subtype_diff = float8mi); +create type textrange as range (subtype = text, collation = "C"); +-- +-- Create some C functions that will be used by various tests. +-- +CREATE FUNCTION binary_coercible(oid, oid) + RETURNS bool + AS :'regresslib', 'binary_coercible' + LANGUAGE C STRICT STABLE PARALLEL SAFE; +CREATE FUNCTION ttdummy () + RETURNS trigger + AS :'regresslib' + LANGUAGE C; +CREATE FUNCTION get_columns_length(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 +-- of the non-empty string value passed to it or 0. +create function part_hashint4_noop(value int4, seed int8) + returns int8 as $$ + select value + seed; + $$ language sql strict immutable parallel safe; +create operator class part_test_int4_ops for type int4 using hash as + operator 1 =, + function 2 part_hashint4_noop(int4, int8); +create function part_hashtext_length(value text, seed int8) + returns int8 as $$ + select length(coalesce(value, ''))::int8 + $$ language sql strict immutable parallel safe; +create operator class part_test_text_ops for type text using hash as + operator 1 =, + function 2 part_hashtext_length(text, int8); diff --git a/third_party/spanner_pg/src/test/regress/expected/text.out b/third_party/spanner_pg/src/test/regress/expected/text.out index b625b09f..4c65b238 100644 --- a/third_party/spanner_pg/src/test/regress/expected/text.out +++ b/third_party/spanner_pg/src/test/regress/expected/text.out @@ -13,9 +13,7 @@ SELECT text 'this is a text string' = text 'this is a text strin' AS false; f (1 row) -CREATE TABLE TEXT_TBL (f1 text); -INSERT INTO TEXT_TBL VALUES ('doh!'); -INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); +-- text_tbl was already created and filled in test_setup.sql. SELECT * FROM TEXT_TBL; f1 ------------------- diff --git a/third_party/spanner_pg/src/test/regress/expected/tid.out b/third_party/spanner_pg/src/test/regress/expected/tid.out index 8da1a455..7d8957bd 100644 --- a/third_party/spanner_pg/src/test/regress/expected/tid.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/expected/time.out b/third_party/spanner_pg/src/test/regress/expected/time.out index 39b409fe..f3a71503 100644 --- a/third_party/spanner_pg/src/test/regress/expected/time.out +++ b/third_party/spanner_pg/src/test/regress/expected/time.out @@ -161,11 +161,11 @@ SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401'); (1 row) SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error -ERROR: "time" units "day" not recognized +ERROR: unit "day" not supported for type time without time zone SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error -ERROR: "time" units "fortnight" not recognized +ERROR: unit "fortnight" not recognized for type time without time zone SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error -ERROR: "time" units "timezone" not recognized +ERROR: unit "timezone" not supported for type time without time zone SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401'); extract -------------- diff --git a/third_party/spanner_pg/src/test/regress/expected/timestamptz.out b/third_party/spanner_pg/src/test/regress/expected/timestamptz.out index a0df947e..eba84191 100644 --- a/third_party/spanner_pg/src/test/regress/expected/timestamptz.out +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/expected/timetz.out b/third_party/spanner_pg/src/test/regress/expected/timetz.out index 79581222..8a9ec544 100644 --- a/third_party/spanner_pg/src/test/regress/expected/timetz.out +++ b/third_party/spanner_pg/src/test/regress/expected/timetz.out @@ -178,9 +178,9 @@ SELECT EXTRACT(HOUR FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401- (1 row) SELECT EXTRACT(DAY FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error -ERROR: "time with time zone" units "day" not recognized +ERROR: unit "day" not supported for type time with time zone SELECT EXTRACT(FORTNIGHT FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); -- error -ERROR: "time with time zone" units "fortnight" not recognized +ERROR: unit "fortnight" not recognized for type time with time zone SELECT EXTRACT(TIMEZONE FROM TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04:30'); extract --------- diff --git a/third_party/spanner_pg/src/test/regress/expected/transactions.out b/third_party/spanner_pg/src/test/regress/expected/transactions.out index c83debed..d80a0486 100644 --- a/third_party/spanner_pg/src/test/regress/expected/transactions.out +++ b/third_party/spanner_pg/src/test/regress/expected/transactions.out @@ -2,9 +2,12 @@ -- TRANSACTIONS -- BEGIN; -SELECT * - INTO TABLE xacttest - FROM aggtest; +CREATE TABLE xacttest (a smallint, b real); +INSERT INTO xacttest VALUES + (56, 7.8), + (100, 99.097), + (0, 0.09561), + (42, 324.78); INSERT INTO xacttest (a, b) VALUES (777, 777.777); END; -- should retrieve one value-- @@ -16,9 +19,9 @@ SELECT a FROM xacttest WHERE a > 100; BEGIN; CREATE TABLE disappear (a int4); -DELETE FROM aggtest; +DELETE FROM xacttest; -- should be empty -SELECT * FROM aggtest; +SELECT * FROM xacttest; a | b ---+--- (0 rows) @@ -31,14 +34,15 @@ SELECT oid FROM pg_class WHERE relname = 'disappear'; (0 rows) -- should have members again -SELECT * FROM aggtest; +SELECT * FROM xacttest; a | b -----+--------- 56 | 7.8 100 | 99.097 0 | 0.09561 42 | 324.78 -(4 rows) + 777 | 777.777 +(5 rows) -- Read-only tests CREATE TABLE writetest (a int); @@ -940,8 +944,18 @@ DROP TABLE trans_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 @@ -956,6 +970,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 @@ -975,8 +995,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; @@ -1003,22 +1033,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/third_party/spanner_pg/src/test/regress/expected/triggers.out b/third_party/spanner_pg/src/test/regress/expected/triggers.out index 45562bd3..723e8b71 100644 --- a/third_party/spanner_pg/src/test/regress/expected/triggers.out +++ b/third_party/spanner_pg/src/test/regress/expected/triggers.out @@ -1,6 +1,32 @@ -- -- TRIGGERS -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set autoinclib :libdir '/autoinc' :dlsuffix +\set refintlib :libdir '/refint' :dlsuffix +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION autoinc () + RETURNS trigger + AS :'autoinclib' + LANGUAGE C; +CREATE FUNCTION check_primary_key () + RETURNS trigger + AS :'refintlib' + LANGUAGE C; +CREATE FUNCTION check_foreign_key () + RETURNS trigger + AS :'refintlib' + LANGUAGE C; +CREATE FUNCTION trigger_return_old () + RETURNS trigger + AS :'regresslib' + LANGUAGE C; +CREATE FUNCTION set_ttdummy (int4) + RETURNS int4 + AS :'regresslib' + LANGUAGE C STRICT; create table pkeys (pkey1 int4 not null, pkey2 text not null); create table fkeys (fkey1 int4, fkey2 text, fkey3 int); create table fkeys2 (fkey21 int4, fkey22 text, pkey23 int not null); @@ -2105,7 +2131,7 @@ select tgrelid::regclass::text, tgname, tgfoid::regproc, tgenabled, tgisinternal tgrelid | tgname | tgfoid | tgenabled | tgisinternal -----------+--------+-----------------+-----------+-------------- trigpart | trg1 | trigger_nothing | O | f - trigpart1 | trg1 | trigger_nothing | O | t + trigpart1 | trg1 | trigger_nothing | O | f (2 rows) create table trigpart3 (like trigpart); @@ -2283,6 +2309,51 @@ NOTICE: trigger zzz on parted_trig_1_1 AFTER INSERT for ROW NOTICE: trigger bbb on parted_trig_2 AFTER INSERT for ROW NOTICE: trigger zzz on parted_trig_2 AFTER INSERT for ROW drop table parted_trig; +-- Verify that the correct triggers fire for cross-partition updates +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create table parted_trig2 partition of parted_trig for values in (2); +insert into parted_trig values (1); +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + end if; + return null; + end; + $$ language plpgsql; +create trigger parted_trig_before_stmt before insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +create trigger parted_trig_before_row before insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_row after insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_stmt after insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +update parted_trig set a = 2 where a = 1; +NOTICE: trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for STATEMENT +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE UPDATE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE DELETE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE INSERT for ROW +NOTICE: trigger parted_trig_after_row on parted_trig1 AFTER DELETE for ROW +NOTICE: trigger parted_trig_after_row on parted_trig2 AFTER INSERT for ROW +NOTICE: trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for STATEMENT +-- update action in merge should behave the same +merge into parted_trig using (select 1) as ss on true + when matched and a = 2 then update set a = 1; +NOTICE: trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for STATEMENT +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE UPDATE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE DELETE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE INSERT for ROW +NOTICE: trigger parted_trig_after_row on parted_trig2 AFTER DELETE for ROW +NOTICE: trigger parted_trig_after_row on parted_trig1 AFTER INSERT for ROW +NOTICE: trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for STATEMENT +drop table parted_trig; -- Verify propagation of trigger arguments to partitions create table parted_trig (a int) partition by list (a); create table parted_trig1 partition of parted_trig for values in (1); @@ -2713,23 +2784,30 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, tgfoid::regproc, tgenabled from pg_trigger where tgrelid in ('parent'::regclass, 'child1'::regclass) order by tgrelid::regclass::text, tgfoid; - tgrelid | tgname | tgfoid | tgenabled ----------+-------------------------+---------------------+----------- - child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O - child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O -(2 rows) + tgrelid | tgname | tgfoid | tgenabled +---------+-------------------------+------------------------+----------- + child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O + child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O + parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O + parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O + parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | O + parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | O +(6 rows) --- Before v15, this has no effect because parent has no triggers: alter table parent disable trigger all; select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, tgfoid::regproc, tgenabled from pg_trigger where tgrelid in ('parent'::regclass, 'child1'::regclass) order by tgrelid::regclass::text, tgfoid; - tgrelid | tgname | tgfoid | tgenabled ----------+-------------------------+---------------------+----------- - child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O - child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O -(2 rows) + tgrelid | tgname | tgfoid | tgenabled +---------+-------------------------+------------------------+----------- + child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | D + child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | D + parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | D + parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | D + parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | D + parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | D +(6 rows) drop table parent, child1; -- Verify that firing state propagates correctly on creation, too @@ -2982,7 +3060,7 @@ create trigger child_row_trig -- but now we're not allowed to reattach it alter table parent attach partition child for values in ('AAA'); ERROR: trigger "child_row_trig" prevents table "child" from becoming a partition -DETAIL: ROW triggers with transition tables are not supported on partitions +DETAIL: ROW triggers with transition tables are not supported on partitions. -- drop the trigger, and now we're allowed to attach it again drop trigger child_row_trig on child; alter table parent attach partition child for values in ('AAA'); @@ -3315,6 +3393,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(); @@ -3382,7 +3508,7 @@ NOTICE: hello from funcA create or replace trigger my_trig after insert on parted_trig_1 for each row execute procedure funcB(); -- should fail -ERROR: trigger "my_trig" for relation "parted_trig_1" is an internal trigger +ERROR: trigger "my_trig" for relation "parted_trig_1" is an internal or a child trigger insert into parted_trig (a) values (50); NOTICE: hello from funcA drop trigger my_trig on parted_trig; @@ -3507,3 +3633,79 @@ rollback to savepoint svp; rollback; drop table convslot_test_parent; drop function convslot_trig4(); +-- Test trigger renaming on partitioned tables +create table grandparent (id int, primary key (id)) partition by range (id); +create table middle partition of grandparent for values from (1) to (10) +partition by range (id); +create table chi partition of middle for values from (1) to (5); +create table cho partition of middle for values from (6) to (10); +create function f () returns trigger as +$$ begin return new; end; $$ +language plpgsql; +create trigger a after insert on grandparent +for each row execute procedure f(); +alter trigger a on grandparent rename to b; +select tgrelid::regclass, tgname, +(select tgname from pg_trigger tr where tr.oid = pg_trigger.tgparentid) parent_tgname +from pg_trigger where tgrelid in (select relid from pg_partition_tree('grandparent')) +order by tgname, tgrelid::regclass::text COLLATE "C"; + tgrelid | tgname | parent_tgname +-------------+--------+--------------- + chi | b | b + cho | b | b + grandparent | b | + middle | b | b +(4 rows) + +alter trigger a on only grandparent rename to b; -- ONLY not supported +ERROR: syntax error at or near "only" +LINE 1: alter trigger a on only grandparent rename to b; + ^ +alter trigger b on middle rename to c; -- can't rename trigger on partition +ERROR: cannot rename trigger "b" on table "middle" +HINT: Rename the trigger on the partitioned table "grandparent" instead. +create trigger c after insert on middle +for each row execute procedure f(); +alter trigger b on grandparent rename to c; +ERROR: trigger "c" for relation "middle" already exists +-- Rename cascading does not affect statement triggers +create trigger p after insert on grandparent for each statement execute function f(); +create trigger p after insert on middle for each statement execute function f(); +alter trigger p on grandparent rename to q; +select tgrelid::regclass, tgname, +(select tgname from pg_trigger tr where tr.oid = pg_trigger.tgparentid) parent_tgname +from pg_trigger where tgrelid in (select relid from pg_partition_tree('grandparent')) +order by tgname, tgrelid::regclass::text COLLATE "C"; + tgrelid | tgname | parent_tgname +-------------+--------+--------------- + chi | b | b + cho | b | b + grandparent | b | + middle | b | b + chi | c | c + cho | c | c + middle | c | + middle | p | + grandparent | q | +(9 rows) + +drop table grandparent; +-- Trigger renaming does not recurse on legacy inheritance +create table parent (a int); +create table child () inherits (parent); +create trigger parenttrig after insert on parent +for each row execute procedure f(); +create trigger parenttrig after insert on child +for each row execute procedure f(); +alter trigger parenttrig on parent rename to anothertrig; +\d+ child + Table "public.child" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | | | plain | | +Triggers: + parenttrig AFTER INSERT ON child FOR EACH ROW EXECUTE FUNCTION f() +Inherits: parent + +drop table parent, child; +drop function f(); diff --git a/third_party/spanner_pg/src/test/regress/expected/tsdicts.out b/third_party/spanner_pg/src/test/regress/expected/tsdicts.out index c8042931..4eff85da 100644 --- a/third_party/spanner_pg/src/test/regress/expected/tsdicts.out +++ b/third_party/spanner_pg/src/test/regress/expected/tsdicts.out @@ -687,3 +687,37 @@ CREATE TEXT SEARCH DICTIONARY tsdict_case "AffFile" = ispell_sample ); ERROR: unrecognized Ispell parameter: "DictFile" +-- Test grammar for configurations +CREATE TEXT SEARCH CONFIGURATION dummy_tst (COPY=english); +-- Overriden mapping change with duplicated tokens. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ALTER MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR not_a_token, not_a_token; +ERROR: token type "not_a_token" does not exist +-- Not a token supported by the configuration's parser, fails even +-- with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR not_a_token, not_a_token; +ERROR: token type "not_a_token" does not exist +-- Token supported by the configuration's parser, succeeds. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word, word; +-- No mapping for token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word; +ERROR: mapping for token type "word" does not exist +-- Token supported by the configuration's parser, cannot be found, +-- succeeds with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR word, word; +NOTICE: mapping for token type "word" does not exist, skipping +-- Re-add mapping, with duplicated tokens supported by the parser. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR not_a_token WITH ispell; +ERROR: token type "not_a_token" does not exist +DROP TEXT SEARCH CONFIGURATION dummy_tst; diff --git a/third_party/spanner_pg/src/test/regress/expected/tsearch.out b/third_party/spanner_pg/src/test/regress/expected/tsearch.out index cfe38aa3..85113703 100644 --- a/third_party/spanner_pg/src/test/regress/expected/tsearch.out +++ b/third_party/spanner_pg/src/test/regress/expected/tsearch.out @@ -1,3 +1,5 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR -- -- Sanity checks for text search catalogs -- @@ -55,6 +57,14 @@ WHERE -------+-------+--------+--------------+----------+--------- (0 rows) +-- Load some test data +CREATE TABLE test_tsvector( + t text, + a tsvector +); +\set filename :abs_srcdir '/data/tsearch.data' +COPY test_tsvector FROM :'filename'; +ANALYZE test_tsvector; -- test basic text search behavior without indexes, then with SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; count diff --git a/third_party/spanner_pg/src/test/regress/expected/tstypes.out b/third_party/spanner_pg/src/test/regress/expected/tstypes.out index 2601e312..92c1c6e1 100644 --- a/third_party/spanner_pg/src/test/regress/expected/tstypes.out +++ b/third_party/spanner_pg/src/test/regress/expected/tstypes.out @@ -85,6 +85,10 @@ SELECT 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; 'a':3A,4B 'b':2A 'ba':1237 (1 row) +SELECT $$'' '1' '2'$$::tsvector; -- error, empty lexeme is not allowed +ERROR: syntax error in tsvector: "'' '1' '2'" +LINE 1: SELECT $$'' '1' '2'$$::tsvector; + ^ --Base tsquery test SELECT '1'::tsquery; tsquery @@ -1258,8 +1262,12 @@ SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceshi 'base' 'hidden' 'strike' (1 row) -SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); -ERROR: lexeme array may not contain nulls +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', '', NULL]); + ts_delete +-------------------------- + 'base' 'hidden' 'strike' +(1 row) + SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); unnest --------------------------------------------- @@ -1328,8 +1336,11 @@ SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship','strike']); 'base' 'hidden' 'rebel' 'spaceship' 'strike' (1 row) +-- null and empty string are disallowed, since we mustn't make an empty lexeme SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', NULL]); ERROR: lexeme array may not contain nulls +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', '']); +ERROR: lexeme array may not contain empty strings -- array_to_tsvector must sort and de-dup SELECT array_to_tsvector(ARRAY['foo','bar','baz','bar']); array_to_tsvector @@ -1367,14 +1378,12 @@ SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', ' 'a':1C,3C 'asd':1C 'w':5,6,12B,13A 'zxc':81C,222C,567C (1 row) -SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', '', NULL]); setweight --------------------------------- 'a' 'asd' 'w':5,6,12B,13A 'zxc' (1 row) -SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); -ERROR: lexeme array may not contain nulls SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); ts_filter ------------------------------------------------------------- diff --git a/third_party/spanner_pg/src/test/regress/expected/type_sanity.out b/third_party/spanner_pg/src/test/regress/expected/type_sanity.out index 257b6cac..d3ac08c9 100644 --- a/third_party/spanner_pg/src/test/regress/expected/type_sanity.out +++ b/third_party/spanner_pg/src/test/regress/expected/type_sanity.out @@ -13,45 +13,45 @@ -- field can't be 0, we have to check it here. -- **************** pg_type **************** -- Look for illegal values in pg_type fields. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typnamespace = 0 OR - (p1.typlen <= 0 AND p1.typlen != -1 AND p1.typlen != -2) OR - (p1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR - NOT p1.typisdefined OR - (p1.typalign not in ('c', 's', 'i', 'd')) OR - (p1.typstorage not in ('p', 'x', 'e', 'm')); +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', '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')); oid | typname -----+--------- (0 rows) -- Look for "pass by value" types that can't be passed by value. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typbyval AND - (p1.typlen != 1 OR p1.typalign != 'c') AND - (p1.typlen != 2 OR p1.typalign != 's') AND - (p1.typlen != 4 OR p1.typalign != 'i') AND - (p1.typlen != 8 OR p1.typalign != 'd'); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typbyval AND + (t1.typlen != 1 OR t1.typalign != 'c') AND + (t1.typlen != 2 OR t1.typalign != 's') AND + (t1.typlen != 4 OR t1.typalign != 'i') AND + (t1.typlen != 8 OR t1.typalign != 'd'); oid | typname -----+--------- (0 rows) -- Look for "toastable" types that aren't varlena. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typstorage != 'p' AND - (p1.typbyval OR p1.typlen != -1); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typstorage != 'p' AND + (t1.typbyval OR t1.typlen != -1); oid | typname -----+--------- (0 rows) -- Look for complex types that do not have a typrelid entry, -- or basic types that do. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR - (p1.typtype != 'c' AND p1.typrelid != 0); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE (t1.typtype = 'c' AND t1.typrelid = 0) OR + (t1.typtype != 'c' AND t1.typrelid != 0); oid | typname -----+--------- (0 rows) @@ -59,14 +59,14 @@ WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR -- Look for types that should have an array type but don't. -- Generally anything that's not a pseudotype should have an array type. -- However, we do have a small number of exceptions. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typtype not in ('p') AND p1.typname NOT LIKE E'\\_%' +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typtype not in ('p') AND t1.typname NOT LIKE E'\\_%' AND NOT EXISTS - (SELECT 1 FROM pg_type as p2 - WHERE p2.typname = ('_' || p1.typname)::name AND - p2.typelem = p1.oid and p1.typarray = p2.oid) -ORDER BY p1.oid; + (SELECT 1 FROM pg_type as t2 + WHERE t2.typname = ('_' || t1.typname)::name AND + t2.typelem = t1.oid and t1.typarray = t2.oid) +ORDER BY t1.oid; oid | typname ------+------------------------------ 194 | pg_node_tree @@ -78,56 +78,56 @@ ORDER BY p1.oid; (6 rows) -- Make sure typarray points to a "true" array type of our own base -SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, - p2.typsubscript -FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) -WHERE p1.typarray <> 0 AND - (p2.oid IS NULL OR - p2.typsubscript <> 'array_subscript_handler'::regproc); +SELECT t1.oid, t1.typname as basetype, t2.typname as arraytype, + t2.typsubscript +FROM pg_type t1 LEFT JOIN pg_type t2 ON (t1.typarray = t2.oid) +WHERE t1.typarray <> 0 AND + (t2.oid IS NULL OR + t2.typsubscript <> 'array_subscript_handler'::regproc); oid | basetype | arraytype | typsubscript -----+----------+-----------+-------------- (0 rows) -- Look for range types that do not have a pg_range entry -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typtype = 'r' AND - NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = p1.oid); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typtype = 'r' AND + NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = t1.oid); oid | typname -----+--------- (0 rows) -- Look for range types whose typalign isn't sufficient -SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign -FROM pg_type as p1 - LEFT JOIN pg_range as r ON rngtypid = p1.oid - LEFT JOIN pg_type as p2 ON rngsubtype = p2.oid -WHERE p1.typtype = 'r' AND - (p1.typalign != (CASE WHEN p2.typalign = 'd' THEN 'd'::"char" +SELECT t1.oid, t1.typname, t1.typalign, t2.typname, t2.typalign +FROM pg_type as t1 + LEFT JOIN pg_range as r ON rngtypid = t1.oid + LEFT JOIN pg_type as t2 ON rngsubtype = t2.oid +WHERE t1.typtype = 'r' AND + (t1.typalign != (CASE WHEN t2.typalign = 'd' THEN 'd'::"char" ELSE 'i'::"char" END) - OR p2.oid IS NULL); + OR t2.oid IS NULL); oid | typname | typalign | typname | typalign -----+---------+----------+---------+---------- (0 rows) -- Text conversion routines must be provided. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE (p1.typinput = 0 OR p1.typoutput = 0); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE (t1.typinput = 0 OR t1.typoutput = 0); oid | typname -----+--------- (0 rows) -- Check for bogus typinput routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND NOT - ((p2.pronargs = 1 AND p2.proargtypes[0] = 'cstring'::regtype) OR - (p2.pronargs = 2 AND p2.proargtypes[0] = 'cstring'::regtype AND - p2.proargtypes[1] = 'oid'::regtype) OR - (p2.pronargs = 3 AND p2.proargtypes[0] = 'cstring'::regtype AND - p2.proargtypes[1] = 'oid'::regtype AND - p2.proargtypes[2] = 'int4'::regtype)); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND NOT + ((p1.pronargs = 1 AND p1.proargtypes[0] = 'cstring'::regtype) OR + (p1.pronargs = 2 AND p1.proargtypes[0] = 'cstring'::regtype AND + p1.proargtypes[1] = 'oid'::regtype) OR + (p1.pronargs = 3 AND p1.proargtypes[0] = 'cstring'::regtype AND + p1.proargtypes[1] = 'oid'::regtype AND + p1.proargtypes[2] = 'int4'::regtype)); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) @@ -165,11 +165,11 @@ WHERE (proargmodes IS NOT NULL AND 'v' = any(proargmodes)) -- As of 8.0, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.prorettype = p1.oid AND NOT p2.proretset) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.prorettype = t1.oid AND NOT p1.proretset) ORDER BY 1; oid | typname | oid | proname ------+-----------+-----+--------- @@ -178,11 +178,11 @@ ORDER BY 1; -- Varlena array types will point to array_in -- Exception as of 8.1: int2vector and oidvector have their own I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.oid = 'array_in'::regproc) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.oid = 'array_in'::regproc) ORDER BY 1; oid | typname | oid | proname -----+------------+-----+-------------- @@ -191,17 +191,17 @@ ORDER BY 1; (2 rows) -- typinput routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Composites, domains, enums, multiranges, ranges should all use the same input routines SELECT DISTINCT typtype, typinput -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'p') ORDER BY 1; typtype | typinput ---------+--------------- @@ -215,39 +215,39 @@ ORDER BY 1; -- Check for bogus typoutput routines -- As of 8.0, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p2.pronargs = 1 AND - (p2.proargtypes[0] = p1.oid OR - (p2.oid = 'array_out'::regproc AND - p1.typelem != 0 AND p1.typlen = -1))) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (p1.pronargs = 1 AND + (p1.proargtypes[0] = t1.oid OR + (p1.oid = 'array_out'::regproc AND + t1.typelem != 0 AND t1.typlen = -1))) ORDER BY 1; oid | typname | oid | proname ------+-----------+-----+--------- 1790 | refcursor | 47 | textout (1 row) -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND NOT - (p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND NOT + (p1.prorettype = 'cstring'::regtype AND NOT p1.proretset); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- typoutput routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Composites, enums, multiranges, ranges should all use the same output routines SELECT DISTINCT typtype, typoutput -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'd', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'd', 'p') ORDER BY 1; typtype | typoutput ---------+---------------- @@ -258,34 +258,34 @@ ORDER BY 1; (4 rows) -- Domains should have same typoutput as their base types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid -WHERE p1.typtype = 'd' AND p1.typoutput IS DISTINCT FROM p2.typoutput; +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1 LEFT JOIN pg_type AS t2 ON t1.typbasetype = t2.oid +WHERE t1.typtype = 'd' AND t1.typoutput IS DISTINCT FROM t2.typoutput; oid | typname | oid | typname -----+---------+-----+--------- (0 rows) -- Check for bogus typreceive routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND NOT - ((p2.pronargs = 1 AND p2.proargtypes[0] = 'internal'::regtype) OR - (p2.pronargs = 2 AND p2.proargtypes[0] = 'internal'::regtype AND - p2.proargtypes[1] = 'oid'::regtype) OR - (p2.pronargs = 3 AND p2.proargtypes[0] = 'internal'::regtype AND - p2.proargtypes[1] = 'oid'::regtype AND - p2.proargtypes[2] = 'int4'::regtype)); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND NOT + ((p1.pronargs = 1 AND p1.proargtypes[0] = 'internal'::regtype) OR + (p1.pronargs = 2 AND p1.proargtypes[0] = 'internal'::regtype AND + p1.proargtypes[1] = 'oid'::regtype) OR + (p1.pronargs = 3 AND p1.proargtypes[0] = 'internal'::regtype AND + p1.proargtypes[1] = 'oid'::regtype AND + p1.proargtypes[2] = 'int4'::regtype)); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- As of 7.4, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.prorettype = p1.oid AND NOT p2.proretset) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.prorettype = t1.oid AND NOT p1.proretset) ORDER BY 1; oid | typname | oid | proname ------+-----------+------+---------- @@ -294,11 +294,11 @@ ORDER BY 1; -- Varlena array types will point to array_recv -- Exception as of 8.1: int2vector and oidvector have their own I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.oid = 'array_recv'::regproc) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.oid = 'array_recv'::regproc) ORDER BY 1; oid | typname | oid | proname -----+------------+------+---------------- @@ -307,26 +307,26 @@ ORDER BY 1; (2 rows) -- Suspicious if typreceive doesn't take same number of args as typinput -SELECT p1.oid, p1.typname, p2.oid, p2.proname, p3.oid, p3.proname -FROM pg_type AS p1, pg_proc AS p2, pg_proc AS p3 -WHERE p1.typinput = p2.oid AND p1.typreceive = p3.oid AND - p2.pronargs != p3.pronargs; +SELECT t1.oid, t1.typname, p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_type AS t1, pg_proc AS p1, pg_proc AS p2 +WHERE t1.typinput = p1.oid AND t1.typreceive = p2.oid AND + p1.pronargs != p2.pronargs; oid | typname | oid | proname | oid | proname -----+---------+-----+---------+-----+--------- (0 rows) -- typreceive routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Composites, domains, enums, multiranges, ranges should all use the same receive routines SELECT DISTINCT typtype, typreceive -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'p') ORDER BY 1; typtype | typreceive ---------+----------------- @@ -340,39 +340,39 @@ ORDER BY 1; -- Check for bogus typsend routines -- As of 7.4, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p2.pronargs = 1 AND - (p2.proargtypes[0] = p1.oid OR - (p2.oid = 'array_send'::regproc AND - p1.typelem != 0 AND p1.typlen = -1))) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (p1.pronargs = 1 AND + (p1.proargtypes[0] = t1.oid OR + (p1.oid = 'array_send'::regproc AND + t1.typelem != 0 AND t1.typlen = -1))) ORDER BY 1; oid | typname | oid | proname ------+-----------+------+---------- 1790 | refcursor | 2415 | textsend (1 row) -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND NOT - (p2.prorettype = 'bytea'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND NOT + (p1.prorettype = 'bytea'::regtype AND NOT p1.proretset); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- typsend routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Composites, enums, multiranges, ranges should all use the same send routines SELECT DISTINCT typtype, typsend -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'd', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'd', 'p') ORDER BY 1; typtype | typsend ---------+----------------- @@ -383,112 +383,112 @@ ORDER BY 1; (4 rows) -- Domains should have same typsend as their base types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid -WHERE p1.typtype = 'd' AND p1.typsend IS DISTINCT FROM p2.typsend; +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1 LEFT JOIN pg_type AS t2 ON t1.typbasetype = t2.oid +WHERE t1.typtype = 'd' AND t1.typsend IS DISTINCT FROM t2.typsend; oid | typname | oid | typname -----+---------+-----+--------- (0 rows) -- Check for bogus typmodin routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodin = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'cstring[]'::regtype AND - p2.prorettype = 'int4'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodin = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'cstring[]'::regtype AND + p1.prorettype = 'int4'::regtype AND NOT p1.proretset); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- typmodin routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodin = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodin = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Check for bogus typmodout routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodout = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'int4'::regtype AND - p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodout = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'int4'::regtype AND + p1.prorettype = 'cstring'::regtype AND NOT p1.proretset); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- typmodout routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodout = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodout = p1.oid AND p1.provolatile NOT IN ('i', 's'); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) -- Array types should have same typmodin/out as their element types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typelem = p2.oid AND NOT - (p1.typmodin = p2.typmodin AND p1.typmodout = p2.typmodout); +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typelem = t2.oid AND NOT + (t1.typmodin = t2.typmodin AND t1.typmodout = t2.typmodout); oid | typname | oid | typname -----+---------+-----+--------- (0 rows) -- Array types should have same typdelim as their element types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typarray = p2.oid AND NOT (p1.typdelim = p2.typdelim); +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typarray = t2.oid AND NOT (t1.typdelim = t2.typdelim); oid | typname | oid | typname -----+---------+-----+--------- (0 rows) -- Look for array types whose typalign isn't sufficient -SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typarray = p2.oid AND - p2.typalign != (CASE WHEN p1.typalign = 'd' THEN 'd'::"char" +SELECT t1.oid, t1.typname, t1.typalign, t2.typname, t2.typalign +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typarray = t2.oid AND + t2.typalign != (CASE WHEN t1.typalign = 'd' THEN 'd'::"char" ELSE 'i'::"char" END); oid | typname | typalign | typname | typalign -----+---------+----------+---------+---------- (0 rows) -- Check for typelem set without a handler -SELECT p1.oid, p1.typname, p1.typelem -FROM pg_type AS p1 -WHERE p1.typelem != 0 AND p1.typsubscript = 0; +SELECT t1.oid, t1.typname, t1.typelem +FROM pg_type AS t1 +WHERE t1.typelem != 0 AND t1.typsubscript = 0; oid | typname | typelem -----+---------+--------- (0 rows) -- Check for misuse of standard subscript handlers -SELECT p1.oid, p1.typname, - p1.typelem, p1.typlen, p1.typbyval -FROM pg_type AS p1 -WHERE p1.typsubscript = 'array_subscript_handler'::regproc AND NOT - (p1.typelem != 0 AND p1.typlen = -1 AND NOT p1.typbyval); +SELECT t1.oid, t1.typname, + t1.typelem, t1.typlen, t1.typbyval +FROM pg_type AS t1 +WHERE t1.typsubscript = 'array_subscript_handler'::regproc AND NOT + (t1.typelem != 0 AND t1.typlen = -1 AND NOT t1.typbyval); oid | typname | typelem | typlen | typbyval -----+---------+---------+--------+---------- (0 rows) -SELECT p1.oid, p1.typname, - p1.typelem, p1.typlen, p1.typbyval -FROM pg_type AS p1 -WHERE p1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT - (p1.typelem != 0 AND p1.typlen > 0 AND NOT p1.typbyval); +SELECT t1.oid, t1.typname, + t1.typelem, t1.typlen, t1.typbyval +FROM pg_type AS t1 +WHERE t1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT + (t1.typelem != 0 AND t1.typlen > 0 AND NOT t1.typbyval); oid | typname | typelem | typlen | typbyval -----+---------+---------+--------+---------- (0 rows) -- Check for bogus typanalyze routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typanalyze = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'internal'::regtype AND - p2.prorettype = 'bool'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typanalyze = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'internal'::regtype AND + p1.prorettype = 'bool'::regtype AND NOT p1.proretset); oid | typname | oid | proname -----+---------+-----+--------- (0 rows) @@ -529,8 +529,8 @@ ORDER BY 1; -- **************** pg_class **************** -- Look for illegal values in pg_class fields -SELECT p1.oid, p1.relname -FROM pg_class as p1 +SELECT c1.oid, c1.relname +FROM pg_class as c1 WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); @@ -539,19 +539,19 @@ WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR (0 rows) -- All tables and indexes should have an access method. -SELECT p1.oid, p1.relname -FROM pg_class as p1 -WHERE p1.relkind NOT IN ('S', 'v', 'f', 'c') and - p1.relam = 0; +SELECT c1.oid, c1.relname +FROM pg_class as c1 +WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and + c1.relam = 0; oid | relname -----+--------- (0 rows) -- Conversely, sequences, views, types shouldn't have them -SELECT p1.oid, p1.relname -FROM pg_class as p1 -WHERE p1.relkind IN ('S', 'v', 'f', 'c') and - p1.relam != 0; +SELECT c1.oid, c1.relname +FROM pg_class as c1 +WHERE c1.relkind IN ('S', 'v', 'f', 'c') and + c1.relam != 0; oid | relname -----+--------- (0 rows) @@ -576,29 +576,29 @@ WHERE pc.relkind IN ('r', 't', 'm') and -- **************** pg_attribute **************** -- Look for illegal values in pg_attribute fields -SELECT p1.attrelid, p1.attname -FROM pg_attribute as p1 -WHERE p1.attrelid = 0 OR p1.atttypid = 0 OR p1.attnum = 0 OR - p1.attcacheoff != -1 OR p1.attinhcount < 0 OR - (p1.attinhcount = 0 AND NOT p1.attislocal); +SELECT a1.attrelid, a1.attname +FROM pg_attribute as a1 +WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR + a1.attcacheoff != -1 OR a1.attinhcount < 0 OR + (a1.attinhcount = 0 AND NOT a1.attislocal); attrelid | attname ----------+--------- (0 rows) -- Cross-check attnum against parent relation -SELECT p1.attrelid, p1.attname, p2.oid, p2.relname -FROM pg_attribute AS p1, pg_class AS p2 -WHERE p1.attrelid = p2.oid AND p1.attnum > p2.relnatts; +SELECT a1.attrelid, a1.attname, c1.oid, c1.relname +FROM pg_attribute AS a1, pg_class AS c1 +WHERE a1.attrelid = c1.oid AND a1.attnum > c1.relnatts; attrelid | attname | oid | relname ----------+---------+-----+--------- (0 rows) -- Detect missing pg_attribute entries: should have as many non-system -- attributes as parent relation expects -SELECT p1.oid, p1.relname -FROM pg_class AS p1 -WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2 - WHERE p2.attrelid = p1.oid AND p2.attnum > 0); +SELECT c1.oid, c1.relname +FROM pg_class AS c1 +WHERE c1.relnatts != (SELECT count(*) FROM pg_attribute AS a1 + WHERE a1.attrelid = c1.oid AND a1.attnum > 0); oid | relname -----+--------- (0 rows) @@ -606,29 +606,29 @@ WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2 -- Cross-check against pg_type entry -- NOTE: we allow attstorage to be 'plain' even when typstorage is not; -- this is mainly for toast tables. -SELECT p1.attrelid, p1.attname, p2.oid, p2.typname -FROM pg_attribute AS p1, pg_type AS p2 -WHERE p1.atttypid = p2.oid AND - (p1.attlen != p2.typlen OR - p1.attalign != p2.typalign OR - p1.attbyval != p2.typbyval OR - (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); +SELECT a1.attrelid, a1.attname, t1.oid, t1.typname +FROM pg_attribute AS a1, pg_type AS t1 +WHERE a1.atttypid = t1.oid AND + (a1.attlen != t1.typlen OR + a1.attalign != t1.typalign OR + a1.attbyval != t1.typbyval OR + (a1.attstorage != t1.typstorage AND a1.attstorage != 'p')); attrelid | attname | oid | typname ----------+---------+-----+--------- (0 rows) -- **************** pg_range **************** -- Look for illegal values in pg_range fields. -SELECT p1.rngtypid, p1.rngsubtype -FROM pg_range as p1 -WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; +SELECT r.rngtypid, r.rngsubtype +FROM pg_range as r +WHERE r.rngtypid = 0 OR r.rngsubtype = 0 OR r.rngsubopc = 0; rngtypid | rngsubtype ----------+------------ (0 rows) -- rngcollation should be specified iff subtype is collatable -SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation -FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +SELECT r.rngtypid, r.rngsubtype, r.rngcollation, t.typcollation +FROM pg_range r JOIN pg_type t ON t.oid = r.rngsubtype WHERE (rngcollation = 0) != (typcollation = 0); rngtypid | rngsubtype | rngcollation | typcollation ----------+------------+--------------+-------------- @@ -636,29 +636,29 @@ WHERE (rngcollation = 0) != (typcollation = 0); -- opclass had better be a btree opclass accepting the subtype. -- We must allow anyarray matches, cf IsBinaryCoercible() -SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname -FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +SELECT r.rngtypid, r.rngsubtype, o.opcmethod, o.opcname +FROM pg_range r JOIN pg_opclass o ON o.oid = r.rngsubopc WHERE o.opcmethod != 403 OR - ((o.opcintype != p1.rngsubtype) AND NOT + ((o.opcintype != r.rngsubtype) AND NOT (o.opcintype = 'pg_catalog.anyarray'::regtype AND EXISTS(select 1 from pg_catalog.pg_type where - oid = p1.rngsubtype and typelem != 0 and + oid = r.rngsubtype and typelem != 0 and typsubscript = 'array_subscript_handler'::regproc))); rngtypid | rngsubtype | opcmethod | opcname ----------+------------+-----------+--------- (0 rows) -- canonical function, if any, had better match the range type -SELECT p1.rngtypid, p1.rngsubtype, p.proname -FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +SELECT r.rngtypid, r.rngsubtype, p.proname +FROM pg_range r JOIN pg_proc p ON p.oid = r.rngcanonical WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; rngtypid | rngsubtype | proname ----------+------------+--------- (0 rows) -- subdiff function, if any, had better match the subtype -SELECT p1.rngtypid, p1.rngsubtype, p.proname -FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +SELECT r.rngtypid, r.rngsubtype, p.proname +FROM pg_range r JOIN pg_proc p ON p.oid = r.rngsubdiff WHERE pronargs != 2 OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype OR prorettype != 'pg_catalog.float8'::regtype; @@ -667,9 +667,9 @@ WHERE pronargs != 2 (0 rows) -- every range should have a valid multirange -SELECT p1.rngtypid, p1.rngsubtype, p1.rngmultitypid -FROM pg_range p1 -WHERE p1.rngmultitypid IS NULL OR p1.rngmultitypid = 0; +SELECT r.rngtypid, r.rngsubtype, r.rngmultitypid +FROM pg_range r +WHERE r.rngmultitypid IS NULL OR r.rngmultitypid = 0; rngtypid | rngsubtype | rngmultitypid ----------+------------+--------------- (0 rows) @@ -731,28 +731,23 @@ CREATE TABLE tab_core_types AS SELECT 'n'::information_schema.sql_identifier, 'now'::information_schema.time_stamp, 'YES'::information_schema.yes_or_no, - 'venus'::planets, - 'i16'::insenum, '(1,2)'::int4range, '{(1,2)}'::int4multirange, '(3,4)'::int8range, '{(3,4)}'::int8multirange, - '(1,2)'::float8range, '{(1,2)}'::float8multirange, '(3,4)'::numrange, '{(3,4)}'::nummultirange, - '(a,b)'::textrange, '{(a,b)}'::textmultirange, - '(12.34, 56.78)'::cashrange, '{(12.34, 56.78)}'::cashmultirange, '(2020-01-02, 2021-02-03)'::daterange, '{(2020-01-02, 2021-02-03)}'::datemultirange, '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tsrange, '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tsmultirange, '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tstzrange, - '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange, - arrayrange(ARRAY[1,2], ARRAY[2,1]), - arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange; -- Sanity check on the previous table, checking that all core types are -- included in this table. -SELECT oid, typname, typtype, typelem, typarray, typarray +SELECT oid, typname, typtype, typelem, typarray FROM pg_type t - WHERE typtype NOT IN ('p', 'c') AND - -- reg* types cannot be pg_upgraded, so discard them. + WHERE oid < 16384 AND + -- Exclude pseudotypes and composite types. + typtype NOT IN ('p', 'c') AND + -- These reg* types cannot be pg_upgraded, so discard them. oid != ALL(ARRAY['regproc', 'regprocedure', 'regoper', 'regoperator', 'regconfig', 'regdictionary', 'regnamespace', 'regcollation']::regtype[]) AND @@ -772,7 +767,7 @@ SELECT oid, typname, typtype, typelem, typarray, typarray WHERE a.atttypid=t.oid AND a.attnum > 0 AND a.attrelid='tab_core_types'::regclass); - oid | typname | typtype | typelem | typarray | typarray ------+---------+---------+---------+----------+---------- + oid | typname | typtype | typelem | typarray +-----+---------+---------+---------+---------- (0 rows) diff --git a/third_party/spanner_pg/src/test/regress/expected/updatable_views.out b/third_party/spanner_pg/src/test/regress/expected/updatable_views.out index 77082087..c27e2e80 100644 --- a/third_party/spanner_pg/src/test/regress/expected/updatable_views.out +++ b/third_party/spanner_pg/src/test/regress/expected/updatable_views.out @@ -1001,6 +1001,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); @@ -1227,8 +1228,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/third_party/spanner_pg/src/test/regress/expected/varchar.out b/third_party/spanner_pg/src/test/regress/expected/varchar.out index da23ae81..f1a8202d 100644 --- a/third_party/spanner_pg/src/test/regress/expected/varchar.out +++ b/third_party/spanner_pg/src/test/regress/expected/varchar.out @@ -1,7 +1,11 @@ -- -- VARCHAR -- -CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- +CREATE TEMP TABLE VARCHAR_TBL(f1 varchar(1)); INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -93,13 +97,11 @@ DROP TABLE VARCHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE VARCHAR_TBL(f1 varchar(4)); -INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +-- This varchar_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character varying(4) -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM VARCHAR_TBL; f1 ------ diff --git a/third_party/spanner_pg/src/test/regress/expected/varchar_1.out b/third_party/spanner_pg/src/test/regress/expected/varchar_1.out index 958f9c07..6f01ef96 100644 --- a/third_party/spanner_pg/src/test/regress/expected/varchar_1.out +++ b/third_party/spanner_pg/src/test/regress/expected/varchar_1.out @@ -1,7 +1,11 @@ -- -- VARCHAR -- -CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- +CREATE TEMP TABLE VARCHAR_TBL(f1 varchar(1)); INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -93,13 +97,11 @@ DROP TABLE VARCHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE VARCHAR_TBL(f1 varchar(4)); -INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +-- This varchar_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character varying(4) -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM VARCHAR_TBL; f1 ------ diff --git a/third_party/spanner_pg/src/test/regress/expected/varchar_2.out b/third_party/spanner_pg/src/test/regress/expected/varchar_2.out index b1d412ca..72e57050 100644 --- a/third_party/spanner_pg/src/test/regress/expected/varchar_2.out +++ b/third_party/spanner_pg/src/test/regress/expected/varchar_2.out @@ -1,7 +1,11 @@ -- -- VARCHAR -- -CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- +CREATE TEMP TABLE VARCHAR_TBL(f1 varchar(1)); INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); INSERT INTO VARCHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable @@ -93,13 +97,11 @@ DROP TABLE VARCHAR_TBL; -- -- Now test longer arrays of char -- -CREATE TABLE VARCHAR_TBL(f1 varchar(4)); -INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); +-- This varchar_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character varying(4) -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM VARCHAR_TBL; f1 ------ diff --git a/third_party/spanner_pg/src/test/regress/expected/window.out b/third_party/spanner_pg/src/test/regress/expected/window.out index 19e2ac51..1f23baa3 100644 --- a/third_party/spanner_pg/src/test/regress/expected/window.out +++ b/third_party/spanner_pg/src/test/regress/expected/window.out @@ -1839,6 +1839,146 @@ window w as | 43 | 42 | 43 (7 rows) +-- There is a syntactic ambiguity in the SQL standard. Since +-- UNBOUNDED is a non-reserved word, it could be the name of a +-- function parameter and be used as an expression. There is a +-- grammar hack to resolve such cases as the keyword. The following +-- tests record this behavior. +CREATE FUNCTION unbounded_syntax_test1a(x int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +BEGIN ATOMIC + SELECT sum(unique1) over (rows between x preceding and x following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +END; +CREATE FUNCTION unbounded_syntax_test1b(x int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +AS $$ + SELECT sum(unique1) over (rows between x preceding and x following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +$$; +-- These will apply the argument to the window specification inside the function. +SELECT * FROM unbounded_syntax_test1a(2); + a | b | c +----+---+--- + 7 | 4 | 0 + 13 | 2 | 2 + 22 | 1 | 1 + 26 | 6 | 2 + 29 | 9 | 1 + 31 | 8 | 0 + 32 | 5 | 1 + 23 | 3 | 3 + 15 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +SELECT * FROM unbounded_syntax_test1b(2); + a | b | c +----+---+--- + 7 | 4 | 0 + 13 | 2 | 2 + 22 | 1 | 1 + 26 | 6 | 2 + 29 | 9 | 1 + 31 | 8 | 0 + 32 | 5 | 1 + 23 | 3 | 3 + 15 | 7 | 3 + 10 | 0 | 0 +(10 rows) + +CREATE FUNCTION unbounded_syntax_test2a(unbounded int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +BEGIN ATOMIC + SELECT sum(unique1) over (rows between unbounded preceding and unbounded following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +END; +CREATE FUNCTION unbounded_syntax_test2b(unbounded int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +AS $$ + SELECT sum(unique1) over (rows between unbounded preceding and unbounded following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +$$; +-- These will not apply the argument but instead treat UNBOUNDED as a keyword. +SELECT * FROM unbounded_syntax_test2a(2); + a | b | c +----+---+--- + 45 | 4 | 0 + 45 | 2 | 2 + 45 | 1 | 1 + 45 | 6 | 2 + 45 | 9 | 1 + 45 | 8 | 0 + 45 | 5 | 1 + 45 | 3 | 3 + 45 | 7 | 3 + 45 | 0 | 0 +(10 rows) + +SELECT * FROM unbounded_syntax_test2b(2); + a | b | c +----+---+--- + 45 | 4 | 0 + 45 | 2 | 2 + 45 | 1 | 1 + 45 | 6 | 2 + 45 | 9 | 1 + 45 | 8 | 0 + 45 | 5 | 1 + 45 | 3 | 3 + 45 | 7 | 3 + 45 | 0 | 0 +(10 rows) + +DROP FUNCTION unbounded_syntax_test1a, unbounded_syntax_test1b, + unbounded_syntax_test2a, unbounded_syntax_test2b; +-- Other tests with token UNBOUNDED in potentially problematic position +CREATE FUNCTION unbounded(x int) RETURNS int LANGUAGE SQL IMMUTABLE RETURN x; +SELECT sum(unique1) over (rows between 1 preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 6 | 4 | 0 + 7 | 2 | 2 + 9 | 1 | 1 + 16 | 6 | 2 + 23 | 9 | 1 + 22 | 8 | 0 + 16 | 5 | 1 + 15 | 3 | 3 + 10 | 7 | 3 + 7 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between unbounded(1) preceding and unbounded(1) following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + sum | unique1 | four +-----+---------+------ + 6 | 4 | 0 + 7 | 2 | 2 + 9 | 1 | 1 + 16 | 6 | 2 + 23 | 9 | 1 + 22 | 8 | 0 + 16 | 5 | 1 + 15 | 3 | 3 + 10 | 7 | 3 + 7 | 0 | 0 +(10 rows) + +SELECT sum(unique1) over (rows between unbounded.x preceding and unbounded.x following), + unique1, four +FROM tenk1, (values (1)) as unbounded(x) WHERE unique1 < 10; +ERROR: argument of ROWS must not contain variables +LINE 1: SELECT sum(unique1) over (rows between unbounded.x preceding... + ^ +DROP FUNCTION unbounded; -- Check overflow behavior for various integer sizes select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) from generate_series(32764, 32766) x; @@ -3196,6 +3336,455 @@ 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) + +-- 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 + (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) + +-- Ensure we get the correct run condition when the window function is both +-- monotonically increasing and decreasing. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER () c + FROM empsalary) emp +WHERE c = 1; + QUERY PLAN +-------------------------------------------------------- + WindowAgg + Run Condition: (count(empsalary.empno) OVER (?) = 1) + -> Seq Scan on empsalary +(3 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 use a run condition when there's a volatile function in the +-- WindowFunc +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(random()) OVER (ORDER BY empno DESC) c + FROM empsalary) emp +WHERE c = 1; + QUERY PLAN +---------------------------------------------- + Subquery Scan on emp + Filter: (emp.c = 1) + -> WindowAgg + -> Sort + Sort Key: empsalary.empno DESC + -> Seq Scan on empsalary +(6 rows) + +-- Ensure we don't use a run condition when the WindowFunc contains subplans +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count((SELECT 1)) OVER (ORDER BY empno DESC) c + FROM empsalary) emp +WHERE c = 1; + QUERY PLAN +---------------------------------------------- + Subquery Scan on emp + Filter: (emp.c = 1) + -> WindowAgg + InitPlan 1 (returns $0) + -> Result + -> Sort + Sort Key: empsalary.empno DESC + -> Seq Scan on empsalary +(8 rows) + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/third_party/spanner_pg/src/test/regress/expected/with.out b/third_party/spanner_pg/src/test/regress/expected/with.out index 5ccadb50..8188c9dd 100644 --- a/third_party/spanner_pg/src/test/regress/expected/with.out +++ b/third_party/spanner_pg/src/test/regress/expected/with.out @@ -637,7 +637,7 @@ SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON (16 rows) -- SEARCH clause -create table graph0( f int, t int, label text ); +create temp table graph0( f int, t int, label text ); insert into graph0 values (1, 2, 'arc 1 -> 2'), (1, 3, 'arc 1 -> 3'), @@ -660,7 +660,7 @@ select * from search_graph order by seq; Sort Key: search_graph.seq CTE search_graph -> Recursive Union - -> Seq Scan on public.graph0 g + -> Seq Scan on pg_temp.graph0 g Output: g.f, g.t, g.label, ARRAY[ROW(g.f, g.t)] -> Merge Join Output: g_1.f, g_1.t, g_1.label, array_cat(sg.seq, ARRAY[ROW(g_1.f, g_1.t)]) @@ -668,7 +668,7 @@ select * from search_graph order by seq; -> Sort Output: g_1.f, g_1.t, g_1.label Sort Key: g_1.f - -> Seq Scan on public.graph0 g_1 + -> Seq Scan on pg_temp.graph0 g_1 Output: g_1.f, g_1.t, g_1.label -> Sort Output: sg.seq, sg.t @@ -733,7 +733,7 @@ select * from search_graph order by seq; Sort Key: search_graph.seq CTE search_graph -> Recursive Union - -> Seq Scan on public.graph0 g + -> Seq Scan on pg_temp.graph0 g Output: g.f, g.t, g.label, ROW('0'::bigint, g.f, g.t) -> Merge Join Output: g_1.f, g_1.t, g_1.label, ROW(int8inc((sg.seq)."*DEPTH*"), g_1.f, g_1.t) @@ -741,7 +741,7 @@ select * from search_graph order by seq; -> Sort Output: g_1.f, g_1.t, g_1.label Sort Key: g_1.f - -> Seq Scan on public.graph0 g_1 + -> Seq Scan on pg_temp.graph0 g_1 Output: g_1.f, g_1.t, g_1.label -> Sort Output: sg.seq, sg.t @@ -977,8 +977,6 @@ select * from v_search; 4 | 5 | arc 4 -> 5 (7 rows) -drop table graph0 cascade; -NOTICE: drop cascades to view v_search -- -- test cycle detection -- @@ -1104,6 +1102,39 @@ select * from search_graph order by path; (25 rows) -- CYCLE clause +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select * from search_graph; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + CTE Scan on search_graph + Output: search_graph.f, search_graph.t, search_graph.label, search_graph.is_cycle, search_graph.path + CTE search_graph + -> Recursive Union + -> Seq Scan on pg_temp.graph g + Output: g.f, g.t, g.label, false, ARRAY[ROW(g.f, g.t)] + -> Merge Join + Output: g_1.f, g_1.t, g_1.label, CASE WHEN (ROW(g_1.f, g_1.t) = ANY (sg.path)) THEN true ELSE false END, array_cat(sg.path, ARRAY[ROW(g_1.f, g_1.t)]) + Merge Cond: (g_1.f = sg.t) + -> Sort + Output: g_1.f, g_1.t, g_1.label + Sort Key: g_1.f + -> Seq Scan on pg_temp.graph g_1 + Output: g_1.f, g_1.t, g_1.label + -> Sort + Output: sg.path, sg.t + Sort Key: sg.t + -> WorkTable Scan on search_graph sg + Output: sg.path, sg.t + Filter: (NOT sg.is_cycle) +(20 rows) + with recursive search_graph(f, t, label) as ( select * from graph g union all @@ -2227,7 +2258,7 @@ WITH outermost(x) AS ( ) SELECT * FROM outermost ORDER BY 1; ERROR: relation "outermost" does not exist -LINE 4: SELECT * FROM outermost +LINE 4: SELECT * FROM outermost -- fail ^ DETAIL: There is a WITH item named "outermost", but it cannot be referenced from this part of the query. HINT: Use WITH RECURSIVE, or re-order the WITH items to remove forward references. @@ -2251,7 +2282,7 @@ WITH RECURSIVE outermost(x) AS ( ) SELECT * FROM outermost ORDER BY 1; ERROR: recursive reference to query "outermost" must not appear within a subquery -LINE 2: WITH innermost as (SELECT 2 FROM outermost) +LINE 2: WITH innermost as (SELECT 2 FROM outermost) -- fail ^ -- -- This test will fail with the old implementation of PARAM_EXEC parameter @@ -2958,6 +2989,143 @@ 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: m.ctid, o.k, o.v, o.* + Hash Cond: (m.k = o.k) + -> Seq Scan on public.m + Output: m.ctid, m.k + -> Hash + Output: o.k, o.v, o.* + -> Subquery Scan on o + Output: o.k, o.v, o.* + -> 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) +(21 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: m.ctid, o.k, o.v, o.* + Hash Cond: (m.k = o.k) + -> Seq Scan on public.m + Output: m.ctid, m.k + -> Hash + Output: o.k, o.v, o.* + -> Subquery Scan on o + Output: o.k, o.v, o.* + -> Result + Output: 1, 'merge source InitPlan'::text +(21 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: m.ctid, merge_source_cte.a, merge_source_cte.b, merge_source_cte.* + 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, merge_source_cte.* + -> CTE Scan on merge_source_cte + Output: merge_source_cte.a, merge_source_cte.b, merge_source_cte.* +(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); @@ -3234,36 +3402,42 @@ SELECT * FROM parent; -- check EXPLAIN VERBOSE for a wCTE with RETURNING EXPLAIN (VERBOSE, COSTS OFF) WITH wcte AS ( INSERT INTO int8_tbl VALUES ( 42, 47 ) RETURNING q2 ) -DELETE FROM a USING wcte WHERE aa = q2; - QUERY PLAN ------------------------------------------------------------- - Delete on public.a - Delete on public.a a_1 - Delete on public.b a_2 - Delete on public.c a_3 - Delete on public.d a_4 +DELETE FROM a_star USING wcte WHERE aa = q2; + QUERY PLAN +--------------------------------------------------------------------------- + Delete on public.a_star + Delete on public.a_star a_star_1 + Delete on public.b_star a_star_2 + Delete on public.c_star a_star_3 + Delete on public.d_star a_star_4 + Delete on public.e_star a_star_5 + Delete on public.f_star a_star_6 CTE wcte -> Insert on public.int8_tbl Output: int8_tbl.q2 -> Result Output: '42'::bigint, '47'::bigint -> Hash Join - Output: wcte.*, a.tableoid, a.ctid - Hash Cond: (a.aa = wcte.q2) + Output: wcte.*, a_star.tableoid, a_star.ctid + Hash Cond: (a_star.aa = wcte.q2) -> Append - -> Seq Scan on public.a a_1 - Output: a_1.aa, a_1.tableoid, a_1.ctid - -> Seq Scan on public.b a_2 - Output: a_2.aa, a_2.tableoid, a_2.ctid - -> Seq Scan on public.c a_3 - Output: a_3.aa, a_3.tableoid, a_3.ctid - -> Seq Scan on public.d a_4 - Output: a_4.aa, a_4.tableoid, a_4.ctid + -> Seq Scan on public.a_star a_star_1 + Output: a_star_1.aa, a_star_1.tableoid, a_star_1.ctid + -> Seq Scan on public.b_star a_star_2 + Output: a_star_2.aa, a_star_2.tableoid, a_star_2.ctid + -> Seq Scan on public.c_star a_star_3 + Output: a_star_3.aa, a_star_3.tableoid, a_star_3.ctid + -> Seq Scan on public.d_star a_star_4 + Output: a_star_4.aa, a_star_4.tableoid, a_star_4.ctid + -> Seq Scan on public.e_star a_star_5 + Output: a_star_5.aa, a_star_5.tableoid, a_star_5.ctid + -> Seq Scan on public.f_star a_star_6 + Output: a_star_6.aa, a_star_6.tableoid, a_star_6.ctid -> Hash Output: wcte.*, wcte.q2 -> CTE Scan on wcte Output: wcte.*, wcte.q2 -(26 rows) +(32 rows) -- error cases -- data-modifying WITH tries to use its own output diff --git a/third_party/spanner_pg/src/test/regress/expected/xid.out b/third_party/spanner_pg/src/test/regress/expected/xid.out index b7a1ed0f..d8e76f33 100644 --- a/third_party/spanner_pg/src/test/regress/expected/xid.out +++ b/third_party/spanner_pg/src/test/regress/expected/xid.out @@ -129,8 +129,16 @@ select xid8cmp('1', '2'), xid8cmp('2', '2'), xid8cmp('2', '1'); -1 | 0 | 1 (1 row) --- xid8 has btree and hash opclasses +-- min() and max() for xid8 create table xid8_t1 (x xid8); +insert into xid8_t1 values ('0'), ('010'), ('42'), ('0xffffffffffffffff'), ('-1'); +select min(x), max(x) from xid8_t1; + min | max +-----+---------------------- + 0 | 18446744073709551615 +(1 row) + +-- xid8 has btree and hash opclasses create index on xid8_t1 using btree(x); create index on xid8_t1 using hash(x); drop table xid8_t1; diff --git a/third_party/spanner_pg/src/test/regress/expected/xml_1.out b/third_party/spanner_pg/src/test/regress/expected/xml_1.out index 897ed382..3477606a 100644 --- a/third_party/spanner_pg/src/test/regress/expected/xml_1.out +++ b/third_party/spanner_pg/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="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, @@ -1028,7 +885,6 @@ ERROR: unsupported XML feature LINE 3: PASSING '10' @@ -1037,7 +893,6 @@ ERROR: unsupported XML feature LINE 3: PASSING '' COLUMNS a text PATH 'foo/namespace::node()'); @@ -1058,7 +912,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.* @@ -1118,33 +971,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 @@ -1228,7 +1075,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' @@ -1330,7 +1176,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, @@ -1355,32 +1200,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 --- @@ -1402,16 +1242,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/third_party/spanner_pg/src/test/regress/expected/xmlmap_1.out b/third_party/spanner_pg/src/test/regress/expected/xmlmap_1.out index 4504acd3..05c5d3eb 100644 --- a/third_party/spanner_pg/src/test/regress/expected/xmlmap_1.out +++ b/third_party/spanner_pg/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. diff --git a/third_party/spanner_pg/src/test/regress/input/create_function_0.source b/third_party/spanner_pg/src/test/regress/input/create_function_0.source deleted file mode 100644 index f47f6357..00000000 --- a/third_party/spanner_pg/src/test/regress/input/create_function_0.source +++ /dev/null @@ -1,95 +0,0 @@ --- --- CREATE_FUNCTION_0 --- - --- Create a bunch of C functions that will be used by later tests: - -CREATE FUNCTION check_primary_key () - RETURNS trigger - AS '@libdir@/refint@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION check_foreign_key () - RETURNS trigger - AS '@libdir@/refint@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION autoinc () - RETURNS trigger - AS '@libdir@/autoinc@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION trigger_return_old () - RETURNS trigger - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION ttdummy () - RETURNS trigger - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION set_ttdummy (int4) - RETURNS int4 - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - -CREATE FUNCTION make_tuple_indirect (record) - RETURNS record - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - -CREATE FUNCTION test_atomic_ops() - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; - -CREATE FUNCTION test_fdw_handler() - RETURNS fdw_handler - AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler' - LANGUAGE C; - -CREATE FUNCTION test_support_func(internal) - RETURNS internal - AS '@libdir@/regress@DLSUFFIX@', 'test_support_func' - LANGUAGE C STRICT; - -CREATE FUNCTION test_opclass_options_func(internal) - RETURNS void - AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func' - LANGUAGE C; - -CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) - AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion' - LANGUAGE C STRICT; - -CREATE FUNCTION binary_coercible(oid, oid) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible' - LANGUAGE C STRICT STABLE PARALLEL SAFE; - --- Things that shouldn't work: - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT ''not an integer'';'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'not even SQL'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT 1, 2, 3;'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT $2;'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'a', 'b'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C - AS 'nosuchfile'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C - AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol'; - -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal - AS 'nosuch'; diff --git a/third_party/spanner_pg/src/test/regress/input/create_function_1.source b/third_party/spanner_pg/src/test/regress/input/create_function_1.source deleted file mode 100644 index 79a41562..00000000 --- a/third_party/spanner_pg/src/test/regress/input/create_function_1.source +++ /dev/null @@ -1,25 +0,0 @@ --- --- CREATE_FUNCTION_1 --- - --- Create C functions needed by create_type.sql - -CREATE FUNCTION widget_in(cstring) - RETURNS widget - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; - -CREATE FUNCTION widget_out(widget) - RETURNS cstring - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; - -CREATE FUNCTION int44in(cstring) - RETURNS city_budget - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; - -CREATE FUNCTION int44out(city_budget) - RETURNS cstring - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; diff --git a/third_party/spanner_pg/src/test/regress/input/create_function_2.source b/third_party/spanner_pg/src/test/regress/input/create_function_2.source deleted file mode 100644 index 9e6d2942..00000000 --- a/third_party/spanner_pg/src/test/regress/input/create_function_2.source +++ /dev/null @@ -1,88 +0,0 @@ --- --- CREATE_FUNCTION_2 --- -CREATE FUNCTION hobbies(person) - RETURNS setof hobbies_r - AS 'select * from hobbies_r where person = $1.name' - LANGUAGE SQL; - - -CREATE FUNCTION hobby_construct(text, text) - RETURNS hobbies_r - AS 'select $1 as name, $2 as hobby' - LANGUAGE SQL; - - -CREATE FUNCTION hobby_construct_named(name text, hobby text) - RETURNS hobbies_r - AS 'select name, hobby' - LANGUAGE SQL; - - -CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) - RETURNS hobbies_r.person%TYPE - AS 'select person from hobbies_r where name = $1' - LANGUAGE SQL; - - -CREATE FUNCTION equipment(hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = $1.name' - LANGUAGE SQL; - - -CREATE FUNCTION equipment_named(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' - LANGUAGE SQL; - -CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' - LANGUAGE SQL; - -CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = hobby.name' - LANGUAGE SQL; - -CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = hobby.name' - LANGUAGE SQL; - -CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' - LANGUAGE SQL; - -CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = hobby' - LANGUAGE SQL; - - -CREATE FUNCTION pt_in_widget(point, widget) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - -CREATE FUNCTION overpaid(emp) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - -CREATE FUNCTION interpt_pp(path, path) - RETURNS point - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - -CREATE FUNCTION reverse_name(name) - RETURNS name - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; - --- --- Function dynamic loading --- -LOAD '@libdir@/regress@DLSUFFIX@'; diff --git a/third_party/spanner_pg/src/test/regress/input/misc.source b/third_party/spanner_pg/src/test/regress/input/misc.source deleted file mode 100644 index b1dbc573..00000000 --- a/third_party/spanner_pg/src/test/regress/input/misc.source +++ /dev/null @@ -1,262 +0,0 @@ --- --- MISC --- - --- --- BTREE --- -UPDATE onek - SET unique1 = onek.unique1 + 1; - -UPDATE onek - SET unique1 = onek.unique1 - 1; - --- --- BTREE partial --- --- UPDATE onek2 --- SET unique1 = onek2.unique1 + 1; - ---UPDATE onek2 --- SET unique1 = onek2.unique1 - 1; - --- --- BTREE shutting out non-functional updates --- --- the following two tests seem to take a long time on some --- systems. This non-func update stuff needs to be examined --- more closely. - jolly (2/22/96) --- -UPDATE tmp - SET stringu1 = reverse_name(onek.stringu1) - FROM onek - WHERE onek.stringu1 = 'JBAAAA' and - onek.stringu1 = tmp.stringu1; - -UPDATE tmp - SET stringu1 = reverse_name(onek2.stringu1) - FROM onek2 - WHERE onek2.stringu1 = 'JCAAAA' and - onek2.stringu1 = tmp.stringu1; - -DROP TABLE tmp; - ---UPDATE person* --- SET age = age + 1; - ---UPDATE person* --- SET age = age + 3 --- WHERE name = 'linda'; - --- --- copy --- -COPY onek TO '@abs_builddir@/results/onek.data'; - -DELETE FROM onek; - -COPY onek FROM '@abs_builddir@/results/onek.data'; - -SELECT unique1 FROM onek WHERE unique1 < 2 ORDER BY unique1; - -DELETE FROM onek2; - -COPY onek2 FROM '@abs_builddir@/results/onek.data'; - -SELECT unique1 FROM onek2 WHERE unique1 < 2 ORDER BY unique1; - -COPY BINARY stud_emp TO '@abs_builddir@/results/stud_emp.data'; - -DELETE FROM stud_emp; - -COPY BINARY stud_emp FROM '@abs_builddir@/results/stud_emp.data'; - -SELECT * FROM stud_emp; - --- COPY aggtest FROM stdin; --- 56 7.8 --- 100 99.097 --- 0 0.09561 --- 42 324.78 --- . --- COPY aggtest TO stdout; - - --- --- inheritance stress test --- -SELECT * FROM a_star*; - -SELECT * - FROM b_star* x - WHERE x.b = text 'bumble' or x.a < 3; - -SELECT class, a - FROM c_star* x - WHERE x.c ~ text 'hi'; - -SELECT class, b, c - FROM d_star* x - WHERE x.a < 100; - -SELECT class, c FROM e_star* x WHERE x.c NOTNULL; - -SELECT * FROM f_star* x WHERE x.c ISNULL; - --- grouping and aggregation on inherited sets have been busted in the past... - -SELECT sum(a) FROM a_star*; - -SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; - - -ALTER TABLE f_star RENAME COLUMN f TO ff; - -ALTER TABLE e_star* RENAME COLUMN e TO ee; - -ALTER TABLE d_star* RENAME COLUMN d TO dd; - -ALTER TABLE c_star* RENAME COLUMN c TO cc; - -ALTER TABLE b_star* RENAME COLUMN b TO bb; - -ALTER TABLE a_star* RENAME COLUMN a TO aa; - -SELECT class, aa - FROM a_star* x - WHERE aa ISNULL; - --- As of Postgres 7.1, ALTER implicitly recurses, --- so this should be same as ALTER a_star* - -ALTER TABLE a_star RENAME COLUMN aa TO foo; - -SELECT class, foo - FROM a_star* x - WHERE x.foo >= 2; - -ALTER TABLE a_star RENAME COLUMN foo TO aa; - -SELECT * - from a_star* - WHERE aa < 1000; - -ALTER TABLE f_star ADD COLUMN f int4; - -UPDATE f_star SET f = 10; - -ALTER TABLE e_star* ADD COLUMN e int4; - ---UPDATE e_star* SET e = 42; - -SELECT * FROM e_star*; - -ALTER TABLE a_star* ADD COLUMN a text; - --- That ALTER TABLE should have added TOAST tables. -SELECT relname, reltoastrelid <> 0 AS has_toast_table - FROM pg_class - WHERE oid::regclass IN ('a_star', 'c_star') - ORDER BY 1; - ---UPDATE b_star* --- SET a = text 'gazpacho' --- WHERE aa > 4; - -SELECT class, aa, a FROM a_star*; - - --- --- versions --- - --- --- postquel functions --- --- --- mike does post_hacking, --- joe and sally play basketball, and --- everyone else does nothing. --- -SELECT p.name, name(p.hobbies) FROM ONLY person p; - --- --- as above, but jeff also does post_hacking. --- -SELECT p.name, name(p.hobbies) FROM person* p; - --- --- the next two queries demonstrate how functions generate bogus duplicates. --- this is a "feature" .. --- -SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r - ORDER BY 1,2; - -SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; - --- --- mike needs advil and peet's coffee, --- joe and sally need hightops, and --- everyone else is fine. --- -SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; - --- --- as above, but jeff needs advil and peet's coffee as well. --- -SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; - --- --- just like the last two, but make sure that the target list fixup and --- unflattening is being done correctly. --- -SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; - -SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; - -SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; - -SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; - -SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); - -SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); - -SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); - -SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); - -SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); - -SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); - -SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); - -SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); - -SELECT hobbies_by_name('basketball'); - -SELECT name, overpaid(emp.*) FROM emp; - --- --- Try a few cases with SQL-spec row constructor expressions --- -SELECT * FROM equipment(ROW('skywalking', 'mer')); - -SELECT name(equipment(ROW('skywalking', 'mer'))); - -SELECT *, name(equipment(h.*)) FROM hobbies_r h; - -SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; - --- --- functional joins --- - --- --- instance rules --- - --- --- rewrite rules --- diff --git a/third_party/spanner_pg/src/test/regress/output/create_function_0.source b/third_party/spanner_pg/src/test/regress/output/create_function_0.source deleted file mode 100644 index 342bc40e..00000000 --- a/third_party/spanner_pg/src/test/regress/output/create_function_0.source +++ /dev/null @@ -1,88 +0,0 @@ --- --- CREATE_FUNCTION_0 --- --- Create a bunch of C functions that will be used by later tests: -CREATE FUNCTION check_primary_key () - RETURNS trigger - AS '@libdir@/refint@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION check_foreign_key () - RETURNS trigger - AS '@libdir@/refint@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION autoinc () - RETURNS trigger - AS '@libdir@/autoinc@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION trigger_return_old () - RETURNS trigger - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION ttdummy () - RETURNS trigger - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION set_ttdummy (int4) - RETURNS int4 - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; -CREATE FUNCTION make_tuple_indirect (record) - RETURNS record - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; -CREATE FUNCTION test_atomic_ops() - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C; -CREATE FUNCTION test_fdw_handler() - RETURNS fdw_handler - AS '@libdir@/regress@DLSUFFIX@', 'test_fdw_handler' - LANGUAGE C; -CREATE FUNCTION test_support_func(internal) - RETURNS internal - AS '@libdir@/regress@DLSUFFIX@', 'test_support_func' - LANGUAGE C STRICT; -CREATE FUNCTION test_opclass_options_func(internal) - RETURNS void - AS '@libdir@/regress@DLSUFFIX@', 'test_opclass_options_func' - LANGUAGE C; -CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) - AS '@libdir@/regress@DLSUFFIX@', 'test_enc_conversion' - LANGUAGE C STRICT; -CREATE FUNCTION binary_coercible(oid, oid) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@', 'binary_coercible' - LANGUAGE C STRICT STABLE PARALLEL SAFE; --- Things that shouldn't work: -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT ''not an integer'';'; -ERROR: return type mismatch in function declared to return integer -DETAIL: Actual return type is text. -CONTEXT: SQL function "test1" -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'not even SQL'; -ERROR: syntax error at or near "not" -LINE 2: AS 'not even SQL'; - ^ -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT 1, 2, 3;'; -ERROR: return type mismatch in function declared to return integer -DETAIL: Final statement must return exactly one column. -CONTEXT: SQL function "test1" -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'SELECT $2;'; -ERROR: there is no parameter $2 -LINE 2: AS 'SELECT $2;'; - ^ -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL - AS 'a', 'b'; -ERROR: only one AS item needed for language "sql" -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C - AS 'nosuchfile'; -ERROR: could not access file "nosuchfile": No such file or directory -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C - AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol'; -ERROR: could not find function "nosuchsymbol" in file "@libdir@/regress@DLSUFFIX@" -CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal - AS 'nosuch'; -ERROR: there is no built-in function named "nosuch" diff --git a/third_party/spanner_pg/src/test/regress/output/create_function_1.source b/third_party/spanner_pg/src/test/regress/output/create_function_1.source deleted file mode 100644 index 616b610e..00000000 --- a/third_party/spanner_pg/src/test/regress/output/create_function_1.source +++ /dev/null @@ -1,26 +0,0 @@ --- --- CREATE_FUNCTION_1 --- --- Create C functions needed by create_type.sql -CREATE FUNCTION widget_in(cstring) - RETURNS widget - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; -NOTICE: type "widget" is not yet defined -DETAIL: Creating a shell type definition. -CREATE FUNCTION widget_out(widget) - RETURNS cstring - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; -NOTICE: argument type widget is only a shell -CREATE FUNCTION int44in(cstring) - RETURNS city_budget - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; -NOTICE: type "city_budget" is not yet defined -DETAIL: Creating a shell type definition. -CREATE FUNCTION int44out(city_budget) - RETURNS cstring - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT IMMUTABLE; -NOTICE: argument type city_budget is only a shell diff --git a/third_party/spanner_pg/src/test/regress/output/create_function_2.source b/third_party/spanner_pg/src/test/regress/output/create_function_2.source deleted file mode 100644 index ac9a7f5c..00000000 --- a/third_party/spanner_pg/src/test/regress/output/create_function_2.source +++ /dev/null @@ -1,69 +0,0 @@ --- --- CREATE_FUNCTION_2 --- -CREATE FUNCTION hobbies(person) - RETURNS setof hobbies_r - AS 'select * from hobbies_r where person = $1.name' - LANGUAGE SQL; -CREATE FUNCTION hobby_construct(text, text) - RETURNS hobbies_r - AS 'select $1 as name, $2 as hobby' - LANGUAGE SQL; -CREATE FUNCTION hobby_construct_named(name text, hobby text) - RETURNS hobbies_r - AS 'select name, hobby' - LANGUAGE SQL; -CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) - RETURNS hobbies_r.person%TYPE - AS 'select person from hobbies_r where name = $1' - LANGUAGE SQL; -NOTICE: type reference hobbies_r.name%TYPE converted to text -NOTICE: type reference hobbies_r.person%TYPE converted to text -CREATE FUNCTION equipment(hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = $1.name' - LANGUAGE SQL; -CREATE FUNCTION equipment_named(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' - LANGUAGE SQL; -CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' - LANGUAGE SQL; -CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = hobby.name' - LANGUAGE SQL; -CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = hobby.name' - LANGUAGE SQL; -CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) - RETURNS setof equipment_r - AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' - LANGUAGE SQL; -CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) - RETURNS setof equipment_r - AS 'select * from equipment_r where equipment_r.hobby = hobby' - LANGUAGE SQL; -CREATE FUNCTION pt_in_widget(point, widget) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; -CREATE FUNCTION overpaid(emp) - RETURNS bool - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; -CREATE FUNCTION interpt_pp(path, path) - RETURNS point - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; -CREATE FUNCTION reverse_name(name) - RETURNS name - AS '@libdir@/regress@DLSUFFIX@' - LANGUAGE C STRICT; --- --- Function dynamic loading --- -LOAD '@libdir@/regress@DLSUFFIX@'; diff --git a/third_party/spanner_pg/src/test/regress/output/misc.source b/third_party/spanner_pg/src/test/regress/output/misc.source deleted file mode 100644 index b9595cc2..00000000 --- a/third_party/spanner_pg/src/test/regress/output/misc.source +++ /dev/null @@ -1,692 +0,0 @@ --- --- MISC --- --- --- BTREE --- -UPDATE onek - SET unique1 = onek.unique1 + 1; -UPDATE onek - SET unique1 = onek.unique1 - 1; --- --- BTREE partial --- --- UPDATE onek2 --- SET unique1 = onek2.unique1 + 1; ---UPDATE onek2 --- SET unique1 = onek2.unique1 - 1; --- --- BTREE shutting out non-functional updates --- --- the following two tests seem to take a long time on some --- systems. This non-func update stuff needs to be examined --- more closely. - jolly (2/22/96) --- -UPDATE tmp - SET stringu1 = reverse_name(onek.stringu1) - FROM onek - WHERE onek.stringu1 = 'JBAAAA' and - onek.stringu1 = tmp.stringu1; -UPDATE tmp - SET stringu1 = reverse_name(onek2.stringu1) - FROM onek2 - WHERE onek2.stringu1 = 'JCAAAA' and - onek2.stringu1 = tmp.stringu1; -DROP TABLE tmp; ---UPDATE person* --- SET age = age + 1; ---UPDATE person* --- SET age = age + 3 --- WHERE name = 'linda'; --- --- copy --- -COPY onek TO '@abs_builddir@/results/onek.data'; -DELETE FROM onek; -COPY onek FROM '@abs_builddir@/results/onek.data'; -SELECT unique1 FROM onek WHERE unique1 < 2 ORDER BY unique1; - unique1 ---------- - 0 - 1 -(2 rows) - -DELETE FROM onek2; -COPY onek2 FROM '@abs_builddir@/results/onek.data'; -SELECT unique1 FROM onek2 WHERE unique1 < 2 ORDER BY unique1; - unique1 ---------- - 0 - 1 -(2 rows) - -COPY BINARY stud_emp TO '@abs_builddir@/results/stud_emp.data'; -DELETE FROM stud_emp; -COPY BINARY stud_emp FROM '@abs_builddir@/results/stud_emp.data'; -SELECT * FROM stud_emp; - name | age | location | salary | manager | gpa | percent --------+-----+------------+--------+---------+-----+--------- - jeff | 23 | (8,7.7) | 600 | sharon | 3.5 | - cim | 30 | (10.5,4.7) | 400 | | 3.4 | - linda | 19 | (0.9,6.1) | 100 | | 2.9 | -(3 rows) - --- COPY aggtest FROM stdin; --- 56 7.8 --- 100 99.097 --- 0 0.09561 --- 42 324.78 --- . --- COPY aggtest TO stdout; --- --- inheritance stress test --- -SELECT * FROM a_star*; - class | a --------+---- - a | 1 - a | 2 - a | - b | 3 - b | 4 - b | - b | - c | 5 - c | 6 - c | - c | - d | 7 - d | 8 - d | 9 - d | 10 - d | - d | 11 - d | 12 - d | 13 - d | - d | - d | - d | 14 - d | - d | - d | - d | - e | 15 - e | 16 - e | 17 - e | - e | 18 - e | - e | - f | 19 - f | 20 - f | 21 - f | 22 - f | - f | 24 - f | 25 - f | 26 - f | - f | - f | - f | 27 - f | - f | - f | - f | -(50 rows) - -SELECT * - FROM b_star* x - WHERE x.b = text 'bumble' or x.a < 3; - class | a | b --------+---+-------- - b | | bumble -(1 row) - -SELECT class, a - FROM c_star* x - WHERE x.c ~ text 'hi'; - class | a --------+---- - c | 5 - c | - d | 7 - d | 8 - d | 10 - d | - d | 12 - d | - d | - d | - e | 15 - e | 16 - e | - e | - f | 19 - f | 20 - f | 21 - f | - f | 24 - f | - f | - f | -(22 rows) - -SELECT class, b, c - FROM d_star* x - WHERE x.a < 100; - class | b | c --------+---------+------------ - d | grumble | hi sunita - d | stumble | hi koko - d | rumble | - d | | hi kristin - d | fumble | - d | | hi avi - d | | - d | | -(8 rows) - -SELECT class, c FROM e_star* x WHERE x.c NOTNULL; - class | c --------+------------- - e | hi carol - e | hi bob - e | hi michelle - e | hi elisa - f | hi claire - f | hi mike - f | hi marcel - f | hi keith - f | hi marc - f | hi allison - f | hi jeff - f | hi carl -(12 rows) - -SELECT * FROM f_star* x WHERE x.c ISNULL; - class | a | c | e | f --------+----+---+-----+------------------------------------------- - f | 22 | | -7 | ((111,555),(222,666),(333,777),(444,888)) - f | 25 | | -9 | - f | 26 | | | ((11111,33333),(22222,44444)) - f | | | -11 | ((1111111,3333333),(2222222,4444444)) - f | 27 | | | - f | | | -12 | - f | | | | ((11111111,33333333),(22222222,44444444)) - f | | | | -(8 rows) - --- grouping and aggregation on inherited sets have been busted in the past... -SELECT sum(a) FROM a_star*; - sum ------ - 355 -(1 row) - -SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; - class | sum --------+----- - a | 3 - b | 7 - c | 11 - d | 84 - e | 66 - f | 184 -(6 rows) - -ALTER TABLE f_star RENAME COLUMN f TO ff; -ALTER TABLE e_star* RENAME COLUMN e TO ee; -ALTER TABLE d_star* RENAME COLUMN d TO dd; -ALTER TABLE c_star* RENAME COLUMN c TO cc; -ALTER TABLE b_star* RENAME COLUMN b TO bb; -ALTER TABLE a_star* RENAME COLUMN a TO aa; -SELECT class, aa - FROM a_star* x - WHERE aa ISNULL; - class | aa --------+---- - a | - b | - b | - c | - c | - d | - d | - d | - d | - d | - d | - d | - d | - e | - e | - e | - f | - f | - f | - f | - f | - f | - f | - f | -(24 rows) - --- As of Postgres 7.1, ALTER implicitly recurses, --- so this should be same as ALTER a_star* -ALTER TABLE a_star RENAME COLUMN aa TO foo; -SELECT class, foo - FROM a_star* x - WHERE x.foo >= 2; - class | foo --------+----- - a | 2 - b | 3 - b | 4 - c | 5 - c | 6 - d | 7 - d | 8 - d | 9 - d | 10 - d | 11 - d | 12 - d | 13 - d | 14 - e | 15 - e | 16 - e | 17 - e | 18 - f | 19 - f | 20 - f | 21 - f | 22 - f | 24 - f | 25 - f | 26 - f | 27 -(25 rows) - -ALTER TABLE a_star RENAME COLUMN foo TO aa; -SELECT * - from a_star* - WHERE aa < 1000; - class | aa --------+---- - a | 1 - a | 2 - b | 3 - b | 4 - c | 5 - c | 6 - d | 7 - d | 8 - d | 9 - d | 10 - d | 11 - d | 12 - d | 13 - d | 14 - e | 15 - e | 16 - e | 17 - e | 18 - f | 19 - f | 20 - f | 21 - f | 22 - f | 24 - f | 25 - f | 26 - f | 27 -(26 rows) - -ALTER TABLE f_star ADD COLUMN f int4; -UPDATE f_star SET f = 10; -ALTER TABLE e_star* ADD COLUMN e int4; ---UPDATE e_star* SET e = 42; -SELECT * FROM e_star*; - class | aa | cc | ee | e --------+----+-------------+-----+--- - e | 15 | hi carol | -1 | - e | 16 | hi bob | | - e | 17 | | -2 | - e | | hi michelle | -3 | - e | 18 | | | - e | | hi elisa | | - e | | | -4 | - f | 19 | hi claire | -5 | - f | 20 | hi mike | -6 | - f | 21 | hi marcel | | - f | 22 | | -7 | - f | | hi keith | -8 | - f | 24 | hi marc | | - f | 25 | | -9 | - f | 26 | | | - f | | hi allison | -10 | - f | | hi jeff | | - f | | | -11 | - f | 27 | | | - f | | hi carl | | - f | | | -12 | - f | | | | - f | | | | -(23 rows) - -ALTER TABLE a_star* ADD COLUMN a text; -NOTICE: merging definition of column "a" for child "d_star" --- That ALTER TABLE should have added TOAST tables. -SELECT relname, reltoastrelid <> 0 AS has_toast_table - FROM pg_class - WHERE oid::regclass IN ('a_star', 'c_star') - ORDER BY 1; - relname | has_toast_table ----------+----------------- - a_star | t - c_star | t -(2 rows) - ---UPDATE b_star* --- SET a = text 'gazpacho' --- WHERE aa > 4; -SELECT class, aa, a FROM a_star*; - class | aa | a --------+----+--- - a | 1 | - a | 2 | - a | | - b | 3 | - b | 4 | - b | | - b | | - c | 5 | - c | 6 | - c | | - c | | - d | 7 | - d | 8 | - d | 9 | - d | 10 | - d | | - d | 11 | - d | 12 | - d | 13 | - d | | - d | | - d | | - d | 14 | - d | | - d | | - d | | - d | | - e | 15 | - e | 16 | - e | 17 | - e | | - e | 18 | - e | | - e | | - f | 19 | - f | 20 | - f | 21 | - f | 22 | - f | | - f | 24 | - f | 25 | - f | 26 | - f | | - f | | - f | | - f | 27 | - f | | - f | | - f | | - f | | -(50 rows) - --- --- versions --- --- --- postquel functions --- --- --- mike does post_hacking, --- joe and sally play basketball, and --- everyone else does nothing. --- -SELECT p.name, name(p.hobbies) FROM ONLY person p; - name | name --------+------------- - mike | posthacking - joe | basketball - sally | basketball -(3 rows) - --- --- as above, but jeff also does post_hacking. --- -SELECT p.name, name(p.hobbies) FROM person* p; - name | name --------+------------- - mike | posthacking - joe | basketball - sally | basketball - jeff | posthacking -(4 rows) - --- --- the next two queries demonstrate how functions generate bogus duplicates. --- this is a "feature" .. --- -SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r - ORDER BY 1,2; - name | name --------------+--------------- - basketball | hightops - posthacking | advil - posthacking | peet's coffee - skywalking | guts -(4 rows) - -SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; - name | name --------------+--------------- - posthacking | advil - posthacking | peet's coffee - posthacking | advil - posthacking | peet's coffee - basketball | hightops - basketball | hightops - skywalking | guts -(7 rows) - --- --- mike needs advil and peet's coffee, --- joe and sally need hightops, and --- everyone else is fine. --- -SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; - name | name | name --------+-------------+--------------- - mike | posthacking | advil - mike | posthacking | peet's coffee - joe | basketball | hightops - sally | basketball | hightops -(4 rows) - --- --- as above, but jeff needs advil and peet's coffee as well. --- -SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; - name | name | name --------+-------------+--------------- - mike | posthacking | advil - mike | posthacking | peet's coffee - joe | basketball | hightops - sally | basketball | hightops - jeff | posthacking | advil - jeff | posthacking | peet's coffee -(6 rows) - --- --- just like the last two, but make sure that the target list fixup and --- unflattening is being done correctly. --- -SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; - name | name | name ----------------+-------+------------- - advil | mike | posthacking - peet's coffee | mike | posthacking - hightops | joe | basketball - hightops | sally | basketball -(4 rows) - -SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; - name | name | name ----------------+-------+------------- - advil | mike | posthacking - peet's coffee | mike | posthacking - hightops | joe | basketball - hightops | sally | basketball - advil | jeff | posthacking - peet's coffee | jeff | posthacking -(6 rows) - -SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; - name | name | name ----------------+-------------+------- - advil | posthacking | mike - peet's coffee | posthacking | mike - hightops | basketball | joe - hightops | basketball | sally -(4 rows) - -SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; - name | name | name ----------------+-------------+------- - advil | posthacking | mike - peet's coffee | posthacking | mike - hightops | basketball | joe - hightops | basketball | sally - advil | posthacking | jeff - peet's coffee | posthacking | jeff -(6 rows) - -SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); - name ------- - guts -(1 row) - -SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); - name ------- - guts -(1 row) - -SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); - name ---------------- - advil - peet's coffee - hightops - guts -(4 rows) - -SELECT hobbies_by_name('basketball'); - hobbies_by_name ------------------ - joe -(1 row) - -SELECT name, overpaid(emp.*) FROM emp; - name | overpaid ---------+---------- - sharon | t - sam | t - bill | t - jeff | f - cim | f - linda | f -(6 rows) - --- --- Try a few cases with SQL-spec row constructor expressions --- -SELECT * FROM equipment(ROW('skywalking', 'mer')); - name | hobby -------+------------ - guts | skywalking -(1 row) - -SELECT name(equipment(ROW('skywalking', 'mer'))); - name ------- - guts -(1 row) - -SELECT *, name(equipment(h.*)) FROM hobbies_r h; - name | person | name --------------+--------+--------------- - posthacking | mike | advil - posthacking | mike | peet's coffee - posthacking | jeff | advil - posthacking | jeff | peet's coffee - basketball | joe | hightops - basketball | sally | hightops - skywalking | | guts -(7 rows) - -SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; - name | person | name --------------+--------+--------------- - posthacking | mike | advil - posthacking | mike | peet's coffee - posthacking | jeff | advil - posthacking | jeff | peet's coffee - basketball | joe | hightops - basketball | sally | hightops - skywalking | | guts -(7 rows) - --- --- functional joins --- --- --- instance rules --- --- --- rewrite rules --- diff --git a/third_party/spanner_pg/src/test/regress/parallel_schedule b/third_party/spanner_pg/src/test/regress/parallel_schedule index d7f7e163..33c027a3 100644 --- a/third_party/spanner_pg/src/test/regress/parallel_schedule +++ b/third_party/spanner_pg/src/test/regress/parallel_schedule @@ -1,11 +1,17 @@ # ---------- # src/test/regress/parallel_schedule # +# Most test scripts can be run after running just test_setup and possibly +# create_index. Exceptions to this rule are documented below. +# # By convention, we put no more than twenty tests in any one parallel group; # this limits the number of connections needed to run the tests. # ---------- -# run tablespace by itself, and first, because it forces a checkpoint; +# required setup steps +test: test_setup + +# run tablespace by itself, and early, because it forces a checkpoint; # we'd prefer not to have checkpoints later in the tests because that # interferes with crash-recovery testing. test: tablespace @@ -17,48 +23,37 @@ test: boolean char name varchar text int2 int4 int8 oid float4 float8 bit numeri # ---------- # The second group of parallel tests -# strings depends on char, varchar and text -# numerology depends on int2, int4, int8, float4, float8 # multirangetypes depends on rangetypes # multirangetypes shouldn't run concurrently with type_sanity # ---------- -test: strings numerology point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 multirangetypes create_function_0 +test: strings numerology point lseg line box path polygon circle date time timetz timestamp timestamptz interval inet macaddr macaddr8 multirangetypes # ---------- # Another group of parallel tests -# geometry depends on point, lseg, box, path, polygon and circle -# horology depends on interval, timetz, timestamp, timestamptz -# opr_sanity depends on create_function_0 +# geometry depends on point, lseg, line, box, path, polygon, circle +# horology depends on date, time, timetz, timestamp, timestamptz, interval # ---------- test: geometry horology tstypes regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc -# ---------- -# These four each depend on the previous one -# ---------- -test: create_function_1 -test: create_type -test: create_table -test: create_function_2 - # ---------- # Load huge amounts of data # We should split the data files into single files and then -# execute two copy tests parallel, to check that copy itself +# execute two copy tests in parallel, to check that copy itself # is concurrent safe. # ---------- test: copy copyselect copydml insert insert_conflict # ---------- # More groups of parallel tests +# Note: many of the tests in later groups depend on create_index # ---------- -test: create_misc create_operator create_procedure create_schema -# These depend on create_misc and create_operator +test: create_function_c create_misc create_operator create_procedure create_table create_type create_schema test: create_index create_index_spgist create_view index_including index_including_gist # ---------- # Another group of parallel tests # ---------- -test: create_aggregate create_function_3 create_cast constraints triggers select inherit typed_table vacuum drop_if_exists updatable_views roleattributes create_am hash_func errors infinite_recurse +test: create_aggregate create_function_sql create_cast constraints triggers select inherit typed_table vacuum drop_if_exists updatable_views roleattributes create_am hash_func errors infinite_recurse # ---------- # sanity_check does a vacuum, affecting the sort order of SELECT * @@ -66,11 +61,14 @@ test: create_aggregate create_function_3 create_cast constraints triggers select # ---------- test: sanity_check +# Note: the ignore: line does not skip random, just mark it as ignorable +ignore: random + # ---------- # Another group of parallel tests -# Note: the ignore: line does not run random, just mark it as ignorable +# aggregates depends on create_aggregate +# join depends on create_misc # ---------- -ignore: random test: select_into select_distinct select_distinct_on select_implicit select_having subselect union case join aggregates transactions random portals arrays btree_index hash_index update delete namespace prepared_xacts # ---------- @@ -85,15 +83,18 @@ test: brin_bloom brin_multi # ---------- # Another group of parallel tests +# 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 +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 -# rules cannot run concurrently with any test that creates -# a view or rule in the public schema # collate.*.utf8 tests cannot be run in parallel with each other test: rules psql psql_crosstab amutils stats_ext collate.linux.utf8 -# run by itself so it can run parallel workers +# ---------- +# Run these alone so they don't run out of parallel workers +# select_parallel depends on create_misc +# ---------- test: select_parallel test: write_parallel test: vacuum_parallel @@ -103,6 +104,7 @@ test: publication subscription # ---------- # Another group of parallel tests +# select_views depends on create_view # ---------- test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combocid tsearch tsdicts foreign_data window xmlmap functional_deps advisory_lock indirect_toast equivclass @@ -113,6 +115,7 @@ test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath # ---------- # Another group of parallel tests +# with depends on create_misc # NB: temp.sql does a reconnect which transiently uses 2 connections, # so keep this parallel group to at most 19 tests # ---------- @@ -120,14 +123,15 @@ 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 +test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize stats -# event triggers cannot run concurrently with any test that runs DDL +# event_trigger cannot run concurrently with any test that runs DDL # oidjoins is read-only, though, and should run late for best coverage 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/third_party/spanner_pg/src/test/regress/pg_regress.c b/third_party/spanner_pg/src/test/regress/pg_regress.c index 7f8e7e76..e275871e 100644 --- a/third_party/spanner_pg/src/test/regress/pg_regress.c +++ b/third_party/spanner_pg/src/test/regress/pg_regress.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * 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 * * src/test/regress/pg_regress.c @@ -122,7 +122,9 @@ static void make_directory(const char *dir); static void header(const char *fmt,...) pg_attribute_printf(1, 2); static void status(const char *fmt,...) pg_attribute_printf(1, 2); -static void psql_command(const char *database, const char *query,...) pg_attribute_printf(2, 3); +static StringInfo psql_start_command(void); +static void psql_add_command(StringInfo buf, const char *query,...) pg_attribute_printf(2, 3); +static void psql_end_command(StringInfo buf, const char *database); /* * allow core files if possible. @@ -436,181 +438,6 @@ string_matches_pattern(const char *str, const char *pattern) return false; } -/* - * Replace all occurrences of "replace" in "string" with "replacement". - * The StringInfo will be suitably enlarged if necessary. - * - * Note: this is optimized on the assumption that most calls will find - * no more than one occurrence of "replace", and quite likely none. - */ -void -replace_string(StringInfo string, const char *replace, const char *replacement) -{ - int pos = 0; - char *ptr; - - while ((ptr = strstr(string->data + pos, replace)) != NULL) - { - /* Must copy the remainder of the string out of the StringInfo */ - char *suffix = pg_strdup(ptr + strlen(replace)); - - /* Truncate StringInfo at start of found string ... */ - string->len = ptr - string->data; - /* ... and append the replacement (this restores the trailing '\0') */ - appendStringInfoString(string, replacement); - /* Next search should start after the replacement */ - pos = string->len; - /* Put back the remainder of the string */ - appendStringInfoString(string, suffix); - free(suffix); - } -} - -/* - * Convert *.source found in the "source" directory, replacing certain tokens - * in the file contents with their intended values, and put the resulting files - * in the "dest" directory, replacing the ".source" prefix in their names with - * the given suffix. - */ -static void -convert_sourcefiles_in(const char *source_subdir, const char *dest_dir, const char *dest_subdir, const char *suffix) -{ - char testtablespace[MAXPGPATH]; - char indir[MAXPGPATH]; - char outdir_sub[MAXPGPATH]; - char **name; - char **names; - int count = 0; - - snprintf(indir, MAXPGPATH, "%s/%s", inputdir, source_subdir); - - /* Check that indir actually exists and is a directory */ - if (!directory_exists(indir)) - { - /* - * No warning, to avoid noise in tests that do not have these - * directories; for example, ecpg, contrib and src/pl. - */ - return; - } - - names = pgfnames(indir); - if (!names) - /* Error logged in pgfnames */ - exit(2); - - /* Create the "dest" subdirectory if not present */ - snprintf(outdir_sub, MAXPGPATH, "%s/%s", dest_dir, dest_subdir); - if (!directory_exists(outdir_sub)) - make_directory(outdir_sub); - - /* We might need to replace @testtablespace@ */ - snprintf(testtablespace, MAXPGPATH, "%s/testtablespace", outputdir); - - /* finally loop on each file and do the replacement */ - for (name = names; *name; name++) - { - char srcfile[MAXPGPATH]; - char destfile[MAXPGPATH]; - char prefix[MAXPGPATH]; - FILE *infile, - *outfile; - StringInfoData line; - - /* reject filenames not finishing in ".source" */ - if (strlen(*name) < 8) - continue; - if (strcmp(*name + strlen(*name) - 7, ".source") != 0) - continue; - - count++; - - /* build the full actual paths to open */ - snprintf(prefix, strlen(*name) - 6, "%s", *name); - snprintf(srcfile, MAXPGPATH, "%s/%s", indir, *name); - snprintf(destfile, MAXPGPATH, "%s/%s/%s.%s", dest_dir, dest_subdir, - prefix, suffix); - - infile = fopen(srcfile, "r"); - if (!infile) - { - fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), - progname, srcfile, strerror(errno)); - exit(2); - } - outfile = fopen(destfile, "w"); - if (!outfile) - { - fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), - progname, destfile, strerror(errno)); - exit(2); - } - - initStringInfo(&line); - - while (pg_get_line_buf(infile, &line)) - { - replace_string(&line, "@abs_srcdir@", inputdir); - replace_string(&line, "@abs_builddir@", outputdir); - replace_string(&line, "@testtablespace@", testtablespace); - replace_string(&line, "@libdir@", dlpath); - replace_string(&line, "@DLSUFFIX@", DLSUFFIX); - fputs(line.data, outfile); - } - - pfree(line.data); - fclose(infile); - fclose(outfile); - } - - /* - * If we didn't process any files, complain because it probably means - * somebody neglected to pass the needed --inputdir argument. - */ - if (count <= 0) - { - fprintf(stderr, _("%s: no *.source files found in \"%s\"\n"), - progname, indir); - exit(2); - } - - pgfnames_cleanup(names); -} - -/* Create the .sql and .out files from the .source files, if any */ -static void -convert_sourcefiles(void) -{ - convert_sourcefiles_in("input", outputdir, "sql", "sql"); - convert_sourcefiles_in("output", outputdir, "expected", "out"); -} - -/* - * Clean out the test tablespace dir, or create it if it doesn't exist. - * - * On Windows, doing this cleanup here makes it possible to run the - * regression tests under a Windows administrative user account with the - * restricted token obtained when starting pg_regress. - */ -static void -prepare_testtablespace_dir(void) -{ - char testtablespace[MAXPGPATH]; - - snprintf(testtablespace, MAXPGPATH, "%s/testtablespace", outputdir); - - if (directory_exists(testtablespace)) - { - if (!rmtree(testtablespace, true)) - { - fprintf(stderr, _("\n%s: could not remove test tablespace \"%s\"\n"), - progname, testtablespace); - exit(2); - } - } - make_directory(testtablespace); -} - /* * Scan resultmap file to find which platform-specific expected files to use. * @@ -744,6 +571,14 @@ initialize_environment(void) */ setenv("PGAPPNAME", "pg_regress", 1); + /* + * Set variables that the test scripts may need to refer to. + */ + setenv("PG_ABS_SRCDIR", inputdir, 1); + setenv("PG_ABS_BUILDDIR", outputdir, 1); + setenv("PG_LIBDIR", dlpath, 1); + setenv("PG_DLSUFFIX", DLSUFFIX, 1); + if (nolocale) { /* @@ -820,7 +655,7 @@ initialize_environment(void) * won't mess things up.) Also, set PGPORT to the temp port, and set * PGHOST depending on whether we are using TCP or Unix sockets. * - * This list should be kept in sync with TestLib.pm. + * This list should be kept in sync with PostgreSQL/Test/Utils.pm. */ unsetenv("PGCHANNELBINDING"); /* PGCLIENTENCODING, see above */ @@ -932,7 +767,6 @@ initialize_environment(void) printf(_("(using postmaster on Unix socket, default port)\n")); } - convert_sourcefiles(); load_resultmap(); } @@ -946,7 +780,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++) @@ -1142,51 +976,94 @@ config_sspi_auth(const char *pgdata, const char *superuser_name) #endif /* ENABLE_SSPI */ /* - * Issue a command via psql, connecting to the specified database + * psql_start_command, psql_add_command, psql_end_command + * + * Issue one or more commands within one psql call. + * Set up with psql_start_command, then add commands one at a time + * with psql_add_command, and finally execute with psql_end_command. * * Since we use system(), this doesn't return until the operation finishes */ +static StringInfo +psql_start_command(void) +{ + StringInfo buf = makeStringInfo(); + + appendStringInfo(buf, + "\"%s%spsql\" -X", + bindir ? bindir : "", + bindir ? "/" : ""); + return buf; +} + static void -psql_command(const char *database, const char *query,...) +psql_add_command(StringInfo buf, const char *query,...) { - char query_formatted[1024]; - char query_escaped[2048]; - char psql_cmd[MAXPGPATH + 2048]; - va_list args; - char *s; - char *d; + StringInfoData cmdbuf; + const char *cmdptr; + + /* Add each command as a -c argument in the psql call */ + appendStringInfoString(buf, " -c \""); /* Generate the query with insertion of sprintf arguments */ - va_start(args, query); - vsnprintf(query_formatted, sizeof(query_formatted), query, args); - va_end(args); + initStringInfo(&cmdbuf); + for (;;) + { + va_list args; + int needed; + + va_start(args, query); + needed = appendStringInfoVA(&cmdbuf, query, args); + va_end(args); + if (needed == 0) + break; /* success */ + enlargeStringInfo(&cmdbuf, needed); + } /* Now escape any shell double-quote metacharacters */ - d = query_escaped; - for (s = query_formatted; *s; s++) + for (cmdptr = cmdbuf.data; *cmdptr; cmdptr++) { - if (strchr("\\\"$`", *s)) - *d++ = '\\'; - *d++ = *s; + if (strchr("\\\"$`", *cmdptr)) + appendStringInfoChar(buf, '\\'); + appendStringInfoChar(buf, *cmdptr); } - *d = '\0'; - /* And now we can build and execute the shell command */ - snprintf(psql_cmd, sizeof(psql_cmd), - "\"%s%spsql\" -X -c \"%s\" \"%s\"", - bindir ? bindir : "", - bindir ? "/" : "", - query_escaped, - database); + appendStringInfoChar(buf, '"'); + + pfree(cmdbuf.data); +} - if (system(psql_cmd) != 0) +static void +psql_end_command(StringInfo buf, const char *database) +{ + /* Add the database name --- assume it needs no extra escaping */ + appendStringInfo(buf, + " \"%s\"", + database); + + /* And now we can execute the shell command */ + if (system(buf->data) != 0) { /* psql probably already reported the error */ - fprintf(stderr, _("command failed: %s\n"), psql_cmd); + fprintf(stderr, _("command failed: %s\n"), buf->data); exit(2); } + + /* Clean up */ + pfree(buf->data); + pfree(buf); } +/* + * Shorthand macro for the common case of a single command + */ +#define psql_command(database, ...) \ + do { \ + StringInfo cmdbuf = psql_start_command(); \ + psql_add_command(cmdbuf, __VA_ARGS__); \ + psql_end_command(cmdbuf, database); \ + } while (0) + /* * Spawn a process to execute the given shell command; don't wait for it * @@ -1249,7 +1126,7 @@ spawn_process(const char *cmdline) comspec = "CMD"; memset(&pi, 0, sizeof(pi)); - cmdline2 = psprintf("\"%s\" /c \"%s\"", comspec, cmdline); + cmdline2 = psprintf("\"%s\" /d /c \"%s\"", comspec, cmdline); if ((restrictedToken = CreateRestrictedProcess(cmdline2, &pi)) == 0) @@ -2022,13 +1899,19 @@ open_result_files(void) static void drop_database_if_exists(const char *dbname) { + StringInfo buf = psql_start_command(); + header(_("dropping database \"%s\""), dbname); - psql_command("postgres", "DROP DATABASE IF EXISTS \"%s\"", dbname); + /* Set warning level so we don't see chatter about nonexistent DB */ + psql_add_command(buf, "SET client_min_messages = warning"); + psql_add_command(buf, "DROP DATABASE IF EXISTS \"%s\"", dbname); + psql_end_command(buf, "postgres"); } static void create_database(const char *dbname) { + StringInfo buf = psql_start_command(); _stringlist *sl; /* @@ -2037,19 +1920,20 @@ create_database(const char *dbname) */ header(_("creating database \"%s\""), dbname); if (encoding) - psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'%s", dbname, encoding, - (nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : ""); + psql_add_command(buf, "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'%s", dbname, encoding, + (nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : ""); else - psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0%s", dbname, - (nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : ""); - psql_command(dbname, - "ALTER DATABASE \"%s\" SET lc_messages TO 'C';" - "ALTER DATABASE \"%s\" SET lc_monetary TO 'C';" - "ALTER DATABASE \"%s\" SET lc_numeric TO 'C';" - "ALTER DATABASE \"%s\" SET lc_time TO 'C';" - "ALTER DATABASE \"%s\" SET bytea_output TO 'hex';" - "ALTER DATABASE \"%s\" SET timezone_abbreviations TO 'Default';", - dbname, dbname, dbname, dbname, dbname, dbname); + psql_add_command(buf, "CREATE DATABASE \"%s\" TEMPLATE=template0%s", dbname, + (nolocale) ? " LC_COLLATE='C' LC_CTYPE='C'" : ""); + psql_add_command(buf, + "ALTER DATABASE \"%s\" SET lc_messages TO 'C';" + "ALTER DATABASE \"%s\" SET lc_monetary TO 'C';" + "ALTER DATABASE \"%s\" SET lc_numeric TO 'C';" + "ALTER DATABASE \"%s\" SET lc_time TO 'C';" + "ALTER DATABASE \"%s\" SET bytea_output TO 'hex';" + "ALTER DATABASE \"%s\" SET timezone_abbreviations TO 'Default';", + dbname, dbname, dbname, dbname, dbname, dbname); + psql_end_command(buf, "postgres"); /* * Install any requested extensions. We use CREATE IF NOT EXISTS so that @@ -2065,20 +1949,28 @@ create_database(const char *dbname) static void drop_role_if_exists(const char *rolename) { + StringInfo buf = psql_start_command(); + header(_("dropping role \"%s\""), rolename); - psql_command("postgres", "DROP ROLE IF EXISTS \"%s\"", rolename); + /* Set warning level so we don't see chatter about nonexistent role */ + psql_add_command(buf, "SET client_min_messages = warning"); + psql_add_command(buf, "DROP ROLE IF EXISTS \"%s\"", rolename); + psql_end_command(buf, "postgres"); } static void create_role(const char *rolename, const _stringlist *granted_dbs) { + StringInfo buf = psql_start_command(); + header(_("creating role \"%s\""), rolename); - psql_command("postgres", "CREATE ROLE \"%s\" WITH LOGIN", rolename); + psql_add_command(buf, "CREATE ROLE \"%s\" WITH LOGIN", rolename); for (; granted_dbs != NULL; granted_dbs = granted_dbs->next) { - psql_command("postgres", "GRANT ALL ON DATABASE \"%s\" TO \"%s\"", - granted_dbs->str, rolename); + psql_add_command(buf, "GRANT ALL ON DATABASE \"%s\" TO \"%s\"", + granted_dbs->str, rolename); } + psql_end_command(buf, "postgres"); } static void @@ -2102,7 +1994,6 @@ help(void) printf(_(" --launcher=CMD use CMD as launcher of psql\n")); printf(_(" --load-extension=EXT load the named extension before running the\n")); printf(_(" tests; can appear multiple times\n")); - printf(_(" --make-testtablespace-dir create testtablespace directory\n")); printf(_(" --max-connections=N maximum number of concurrent connections\n")); printf(_(" (default is 0, meaning unlimited)\n")); printf(_(" --max-concurrent-tests=N maximum number of concurrent tests in schedule\n")); @@ -2161,12 +2052,10 @@ regression_main(int argc, char *argv[], {"load-extension", required_argument, NULL, 22}, {"config-auth", required_argument, NULL, 24}, {"max-concurrent-tests", required_argument, NULL, 25}, - {"make-testtablespace-dir", no_argument, NULL, 26}, {NULL, 0, NULL, 0} }; bool use_unix_sockets; - bool make_testtablespace_dir = false; _stringlist *sl; int c; int i; @@ -2292,9 +2181,6 @@ regression_main(int argc, char *argv[], case 25: max_concurrent_tests = atoi(optarg); break; - case 26: - make_testtablespace_dir = true; - break; default: /* getopt_long already emitted a complaint */ fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"), @@ -2358,9 +2244,6 @@ regression_main(int argc, char *argv[], unlimit_core_size(); #endif - if (make_testtablespace_dir) - prepare_testtablespace_dir(); - if (temp_instance) { FILE *pg_conf; diff --git a/third_party/spanner_pg/src/test/regress/pg_regress.h b/third_party/spanner_pg/src/test/regress/pg_regress.h index c6d015c8..2143ee0e 100644 --- a/third_party/spanner_pg/src/test/regress/pg_regress.h +++ b/third_party/spanner_pg/src/test/regress/pg_regress.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * pg_regress.h --- regression test driver * - * 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 * * src/test/regress/pg_regress.h @@ -65,6 +65,4 @@ int regression_main(int argc, char *argv[], void add_stringlist_item(_stringlist **listhead, const char *str); PID_TYPE spawn_process(const char *cmdline); -void replace_string(struct StringInfoData *string, - const char *replace, const char *replacement); bool file_exists(const char *file); diff --git a/third_party/spanner_pg/src/test/regress/pg_regress_main.c b/third_party/spanner_pg/src/test/regress/pg_regress_main.c index 1524676f..a4b354c9 100644 --- a/third_party/spanner_pg/src/test/regress/pg_regress_main.c +++ b/third_party/spanner_pg/src/test/regress/pg_regress_main.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * 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 * * src/test/regress/pg_regress_main.c diff --git a/third_party/spanner_pg/src/test/regress/regress.c b/third_party/spanner_pg/src/test/regress/regress.c index 351d79e1..ba3532a5 100644 --- a/third_party/spanner_pg/src/test/regress/regress.c +++ b/third_party/spanner_pg/src/test/regress/regress.c @@ -6,7 +6,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * 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 * * 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" @@ -531,6 +532,16 @@ int44out(PG_FUNCTION_ARGS) PG_RETURN_CSTRING(result); } +PG_FUNCTION_INFO_V1(test_canonicalize_path); +Datum +test_canonicalize_path(PG_FUNCTION_ARGS) +{ + char *path = text_to_cstring(PG_GETARG_TEXT_PP(0)); + + canonicalize_path(path); + PG_RETURN_TEXT_P(cstring_to_text(path)); +} + PG_FUNCTION_INFO_V1(make_tuple_indirect); Datum make_tuple_indirect(PG_FUNCTION_ARGS) @@ -1206,3 +1217,43 @@ binary_coercible(PG_FUNCTION_ARGS) PG_RETURN_BOOL(IsBinaryCoercible(srctype, targettype)); } + +/* + * 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_columns_length); +Datum +get_columns_length(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 (typlen < 0) + elog(ERROR, "type %u is not fixed-length data type", typeoid); + + column_offset = att_align_nominal(column_offset + typlen, typalign); + } + + PG_RETURN_INT32(column_offset); +} diff --git a/third_party/spanner_pg/src/test/regress/sql/.gitignore b/third_party/spanner_pg/src/test/regress/sql/.gitignore deleted file mode 100644 index fe14af6a..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/constraints.sql -/copy.sql -/create_function_0.sql -/create_function_1.sql -/create_function_2.sql -/largeobject.sql -/misc.sql -/security_label.sql -/tablespace.sql diff --git a/third_party/spanner_pg/src/test/regress/sql/aggregates.sql b/third_party/spanner_pg/src/test/regress/sql/aggregates.sql index 3d5df2e4..48bea8af 100644 --- a/third_party/spanner_pg/src/test/regress/sql/aggregates.sql +++ b/third_party/spanner_pg/src/test/regress/sql/aggregates.sql @@ -2,9 +2,24 @@ -- AGGREGATES -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; +-- prepare some test data +CREATE TABLE aggtest ( + a int2, + b float4 +); + +\set filename :abs_srcdir '/data/agg.data' +COPY aggtest FROM :'filename'; + +ANALYZE aggtest; + + SELECT avg(four) AS avg_1 FROM onek; SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100; diff --git a/third_party/spanner_pg/src/test/regress/sql/alter_generic.sql b/third_party/spanner_pg/src/test/regress/sql/alter_generic.sql index 8c5d0e5e..de58d268 100644 --- a/third_party/spanner_pg/src/test/regress/sql/alter_generic.sql +++ b/third_party/spanner_pg/src/test/regress/sql/alter_generic.sql @@ -2,6 +2,17 @@ -- Test for ALTER some_object {RENAME TO, OWNER TO, SET SCHEMA} -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION test_opclass_options_func(internal) + RETURNS void + AS :'regresslib', 'test_opclass_options_func' + LANGUAGE C; + -- Clean up in case a prior regression run failed SET client_min_messages TO 'warning'; diff --git a/third_party/spanner_pg/src/test/regress/sql/alter_table.sql b/third_party/spanner_pg/src/test/regress/sql/alter_table.sql index e9f5d5ce..eccd1b8e 100644 --- a/third_party/spanner_pg/src/test/regress/sql/alter_table.sql +++ b/third_party/spanner_pg/src/test/regress/sql/alter_table.sql @@ -158,10 +158,6 @@ ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1; DROP TABLE attmp; --- fails with incorrect object type -CREATE VIEW at_v1 AS SELECT 1 as a; -ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -DROP VIEW at_v1; -- -- rename - check on both non-temp and temp tables @@ -2214,13 +2210,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 @@ -2230,22 +2226,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 @@ -2256,9 +2253,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; @@ -2716,11 +2713,6 @@ ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, R ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, REMAINDER 2); DROP TABLE fail_part; --- fails with incorrect object type -CREATE VIEW at_v1 AS SELECT 1 as a; -ALTER TABLE at_v1 ATTACH PARTITION dummy default; -DROP VIEW at_v1; - -- -- DETACH PARTITION -- @@ -3058,3 +3050,16 @@ insert into attach_parted_part1 values (2, 1); -- ...and doesn't when the partition is detached along with its own partition alter table target_parted detach partition attach_parted; insert into attach_parted_part1 values (2, 1); + +-- Test altering table having publication +create schema alter1; +create schema alter2; +create table alter1.t1 (a int); +set client_min_messages = 'ERROR'; +create publication pub1 for table alter1.t1, tables in schema alter2; +reset client_min_messages; +alter table alter1.t1 set schema alter2; +\d+ alter2.t1 +drop publication pub1; +drop schema alter1 cascade; +drop schema alter2 cascade; diff --git a/third_party/spanner_pg/src/test/regress/sql/arrays.sql b/third_party/spanner_pg/src/test/regress/sql/arrays.sql index 3ad8bdf0..df5a3403 100644 --- a/third_party/spanner_pg/src/test/regress/sql/arrays.sql +++ b/third_party/spanner_pg/src/test/regress/sql/arrays.sql @@ -2,6 +2,9 @@ -- ARRAYS -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + CREATE TABLE arrtest ( a int2[], b int4[][][], @@ -12,6 +15,16 @@ CREATE TABLE arrtest ( g varchar(5)[] ); +CREATE TABLE array_op_test ( + seqno int4, + i int4[], + t text[] +); + +\set filename :abs_srcdir '/data/array.data' +COPY array_op_test FROM :'filename'; +ANALYZE array_op_test; + -- -- only the 'e' array is 0-based, the others are 1-based. -- @@ -153,6 +166,10 @@ UPDATE arrtest_s SET a[:] = '{23, 24, 25}'; -- fail, too small INSERT INTO arrtest_s VALUES(NULL, NULL); UPDATE arrtest_s SET a[:] = '{11, 12, 13, 14, 15}'; -- fail, no good with null +-- we want to work with a point_tbl that includes a null +CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; +INSERT INTO POINT_TBL(f1) VALUES (NULL); + -- check with fixed-length-array type, such as point SELECT f1[0:1] FROM POINT_TBL; SELECT f1[0:] FROM POINT_TBL; diff --git a/third_party/spanner_pg/src/test/regress/sql/brin.sql b/third_party/spanner_pg/src/test/regress/sql/brin.sql index 3bd866d9..e68e9e18 100644 --- a/third_party/spanner_pg/src/test/regress/sql/brin.sql +++ b/third_party/spanner_pg/src/test/regress/sql/brin.sql @@ -509,3 +509,9 @@ SELECT * FROM brintest_3 WHERE b < '0'; DROP TABLE brintest_3; RESET enable_seqscan; + +-- test an unlogged table, mostly to get coverage of brinbuildempty +CREATE UNLOGGED TABLE brintest_unlogged (n numrange); +CREATE INDEX brinidx_unlogged ON brintest_unlogged USING brin (n); +INSERT INTO brintest_unlogged VALUES (numrange(0, 2^1000::numeric)); +DROP TABLE brintest_unlogged; diff --git a/third_party/spanner_pg/src/test/regress/sql/btree_index.sql b/third_party/spanner_pg/src/test/regress/sql/btree_index.sql index c3450224..239f4a47 100644 --- a/third_party/spanner_pg/src/test/regress/sql/btree_index.sql +++ b/third_party/spanner_pg/src/test/regress/sql/btree_index.sql @@ -1,5 +1,64 @@ -- -- BTREE_INDEX +-- + +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + +CREATE TABLE bt_i4_heap ( + seqno int4, + random int4 +); + +CREATE TABLE bt_name_heap ( + seqno name, + random int4 +); + +CREATE TABLE bt_txt_heap ( + seqno text, + random int4 +); + +CREATE TABLE bt_f8_heap ( + seqno float8, + random int4 +); + +\set filename :abs_srcdir '/data/desc.data' +COPY bt_i4_heap FROM :'filename'; + +\set filename :abs_srcdir '/data/hash.data' +COPY bt_name_heap FROM :'filename'; + +\set filename :abs_srcdir '/data/desc.data' +COPY bt_txt_heap FROM :'filename'; + +\set filename :abs_srcdir '/data/hash.data' +COPY bt_f8_heap FROM :'filename'; + +ANALYZE bt_i4_heap; +ANALYZE bt_name_heap; +ANALYZE bt_txt_heap; +ANALYZE bt_f8_heap; + +-- +-- BTREE ascending/descending cases +-- +-- we load int4/text from pure descending data (each key is a new +-- low key) and name/f8 from pure ascending data (each key is a new +-- high key). we had a bug where new low keys would sometimes be +-- "lost". +-- +CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); + +CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); + +CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); + +CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); + +-- -- test retrieval of min/max keys for each index -- diff --git a/third_party/spanner_pg/src/test/regress/sql/char.sql b/third_party/spanner_pg/src/test/regress/sql/char.sql index 79e6e565..120fed53 100644 --- a/third_party/spanner_pg/src/test/regress/sql/char.sql +++ b/third_party/spanner_pg/src/test/regress/sql/char.sql @@ -2,16 +2,17 @@ -- CHAR -- --- fixed-length by value --- internally passed by value if <= 4 bytes in storage +-- Per SQL standard, CHAR means character(1), that is a varlena type +-- with a constraint restricting it to one character (not byte) SELECT char 'c' = char 'c' AS true; -- -- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) -- -CREATE TABLE CHAR_TBL(f1 char); +CREATE TEMP TABLE CHAR_TBL(f1 char); INSERT INTO CHAR_TBL (f1) VALUES ('a'); @@ -63,13 +64,26 @@ DROP TABLE CHAR_TBL; -- -- Now test longer arrays of char -- +-- This char_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- -CREATE TABLE CHAR_TBL(f1 char(4)); - -INSERT INTO CHAR_TBL (f1) VALUES ('a'); -INSERT INTO CHAR_TBL (f1) VALUES ('ab'); -INSERT INTO CHAR_TBL (f1) VALUES ('abcd'); INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); -INSERT INTO CHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM CHAR_TBL; + +-- +-- Also test "char", which is an ad-hoc one-byte type. It can only +-- really store ASCII characters, but we allow high-bit-set characters +-- to be accessed via bytea-like escapes. +-- + +SELECT 'a'::"char"; +SELECT '\101'::"char"; +SELECT '\377'::"char"; +SELECT 'a'::"char"::text; +SELECT '\377'::"char"::text; +SELECT '\000'::"char"::text; +SELECT 'a'::text::"char"; +SELECT '\377'::text::"char"; +SELECT ''::text::"char"; diff --git a/third_party/spanner_pg/src/test/regress/sql/cluster.sql b/third_party/spanner_pg/src/test/regress/sql/cluster.sql index 99ee533c..6cb9c926 100644 --- a/third_party/spanner_pg/src/test/regress/sql/cluster.sql +++ b/third_party/spanner_pg/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,13 +205,49 @@ 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; +-- 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; diff --git a/third_party/spanner_pg/src/test/regress/sql/collate.icu.utf8.sql b/third_party/spanner_pg/src/test/regress/sql/collate.icu.utf8.sql index 9cee3d00..b0ddc7db 100644 --- a/third_party/spanner_pg/src/test/regress/sql/collate.icu.utf8.sql +++ b/third_party/spanner_pg/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; @@ -409,6 +407,10 @@ DROP ROLE regress_test_role; ALTER COLLATION "en-x-icu" REFRESH VERSION; +-- also test for database while we are here +SELECT current_database() AS datname \gset +ALTER DATABASE :"datname" REFRESH COLLATION VERSION; + -- dependencies diff --git a/third_party/spanner_pg/src/test/regress/sql/collate.linux.utf8.sql b/third_party/spanner_pg/src/test/regress/sql/collate.linux.utf8.sql index cbbd2203..0f6dd1b0 100644 --- a/third_party/spanner_pg/src/test/regress/sql/collate.linux.utf8.sql +++ b/third_party/spanner_pg/src/test/regress/sql/collate.linux.utf8.sql @@ -410,6 +410,10 @@ DROP ROLE regress_test_role; ALTER COLLATION "en_US" REFRESH VERSION; +-- also test for database while we are here +SELECT current_database() AS datname \gset +ALTER DATABASE :"datname" REFRESH COLLATION VERSION; + -- dependencies diff --git a/third_party/spanner_pg/src/test/regress/sql/collate.sql b/third_party/spanner_pg/src/test/regress/sql/collate.sql index 30f811ba..c3d40fc1 100644 --- a/third_party/spanner_pg/src/test/regress/sql/collate.sql +++ b/third_party/spanner_pg/src/test/regress/sql/collate.sql @@ -272,6 +272,27 @@ SELECT c1+1 AS c1p FROM (SELECT ('4' COLLATE "C")::INT AS c1) ss; \d+ collate_on_int +-- Check conflicting or redundant options in CREATE COLLATION +-- LC_COLLATE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_COLLATE = "NONSENSE", LC_CTYPE = "POSIX"); +-- LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LC_CTYPE = "NONSENSE", LC_COLLATE = "POSIX"); +-- PROVIDER +CREATE COLLATION coll_dup_chk (PROVIDER = icu, PROVIDER = NONSENSE, LC_COLLATE = "POSIX", LC_CTYPE = "POSIX"); +-- LOCALE +CREATE COLLATION case_sensitive (LOCALE = '', LOCALE = "NONSENSE"); +-- DETERMINISTIC +CREATE COLLATION coll_dup_chk (DETERMINISTIC = TRUE, DETERMINISTIC = NONSENSE, LOCALE = ''); +-- VERSION +CREATE COLLATION coll_dup_chk (VERSION = '1', VERSION = "NONSENSE", LOCALE = ''); +-- LOCALE conflicts with LC_COLLATE and LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LC_CTYPE = "POSIX", LOCALE = ''); +-- LOCALE conflicts with LC_COLLATE +CREATE COLLATION coll_dup_chk (LC_COLLATE = "POSIX", LOCALE = ''); +-- LOCALE conflicts with LC_CTYPE +CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LOCALE = ''); +-- FROM conflicts with any other option +CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1"); -- -- Clean up. Many of these table names will be re-used if the user is diff --git a/third_party/spanner_pg/src/test/regress/input/constraints.source b/third_party/spanner_pg/src/test/regress/sql/constraints.sql similarity index 95% rename from third_party/spanner_pg/src/test/regress/input/constraints.source rename to third_party/spanner_pg/src/test/regress/sql/constraints.sql index 8fe97549..5ffcd4ff 100644 --- a/third_party/spanner_pg/src/test/regress/input/constraints.source +++ b/third_party/spanner_pg/src/test/regress/sql/constraints.sql @@ -8,6 +8,9 @@ -- - EXCLUDE clauses -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + -- -- DEFAULT syntax -- @@ -239,11 +242,13 @@ CREATE TABLE COPY_TBL (x INT, y TEXT, z INT, CONSTRAINT COPY_CON CHECK (x > 3 AND y <> 'check failed' AND x < 7 )); -COPY COPY_TBL FROM '@abs_srcdir@/data/constro.data'; +\set filename :abs_srcdir '/data/constro.data' +COPY COPY_TBL FROM :'filename'; SELECT * FROM COPY_TBL; -COPY COPY_TBL FROM '@abs_srcdir@/data/constrf.data'; +\set filename :abs_srcdir '/data/constrf.data' +COPY COPY_TBL FROM :'filename'; SELECT * FROM COPY_TBL; @@ -301,6 +306,21 @@ SELECT * FROM UNIQUE_TBL; DROP TABLE UNIQUE_TBL; +CREATE TABLE UNIQUE_TBL (i int UNIQUE NULLS NOT DISTINCT, t text); + +INSERT INTO UNIQUE_TBL VALUES (1, 'one'); +INSERT INTO UNIQUE_TBL VALUES (2, 'two'); +INSERT INTO UNIQUE_TBL VALUES (1, 'three'); -- fail +INSERT INTO UNIQUE_TBL VALUES (4, 'four'); +INSERT INTO UNIQUE_TBL VALUES (5, 'one'); +INSERT INTO UNIQUE_TBL (t) VALUES ('six'); +INSERT INTO UNIQUE_TBL (t) VALUES ('seven'); -- fail +INSERT INTO UNIQUE_TBL (t) VALUES ('eight') ON CONFLICT DO NOTHING; -- no-op + +SELECT * FROM UNIQUE_TBL; + +DROP TABLE UNIQUE_TBL; + CREATE TABLE UNIQUE_TBL (i int, t text, UNIQUE(i,t)); diff --git a/third_party/spanner_pg/src/test/regress/sql/conversion.sql b/third_party/spanner_pg/src/test/regress/sql/conversion.sql index 83586824..9a65fca9 100644 --- a/third_party/spanner_pg/src/test/regress/sql/conversion.sql +++ b/third_party/spanner_pg/src/test/regress/sql/conversion.sql @@ -1,6 +1,17 @@ -- -- create user defined conversion -- + +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) + AS :'regresslib', 'test_enc_conversion' + LANGUAGE C STRICT; + CREATE USER regress_conversion_user WITH NOCREATEDB NOCREATEROLE; SET SESSION AUTHORIZATION regress_conversion_user; CREATE CONVERSION myconv FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8; @@ -30,7 +41,7 @@ DROP CONVERSION mydef; -- so there's no need to do that here. -- -- --- return to the super user +-- return to the superuser -- RESET SESSION AUTHORIZATION; DROP USER regress_conversion_user; @@ -74,6 +85,139 @@ $$; -- -- UTF-8 -- +-- The description column must be unique. +CREATE TABLE utf8_verification_inputs (inbytes bytea, description text PRIMARY KEY); +insert into utf8_verification_inputs values + ('\x66006f', 'NUL byte'), + ('\xaf', 'bare continuation'), + ('\xc5', 'missing second byte in 2-byte char'), + ('\xc080', 'smallest 2-byte overlong'), + ('\xc1bf', 'largest 2-byte overlong'), + ('\xc280', 'next 2-byte after overlongs'), + ('\xdfbf', 'largest 2-byte'), + ('\xe9af', 'missing third byte in 3-byte char'), + ('\xe08080', 'smallest 3-byte overlong'), + ('\xe09fbf', 'largest 3-byte overlong'), + ('\xe0a080', 'next 3-byte after overlong'), + ('\xed9fbf', 'last before surrogates'), + ('\xeda080', 'smallest surrogate'), + ('\xedbfbf', 'largest surrogate'), + ('\xee8080', 'next after surrogates'), + ('\xefbfbf', 'largest 3-byte'), + ('\xf1afbf', 'missing fourth byte in 4-byte char'), + ('\xf0808080', 'smallest 4-byte overlong'), + ('\xf08fbfbf', 'largest 4-byte overlong'), + ('\xf0908080', 'next 4-byte after overlong'), + ('\xf48fbfbf', 'largest 4-byte'), + ('\xf4908080', 'smallest too large'), + ('\xfa9a9a8a8a', '5-byte'); + +-- Test UTF-8 verification slow path +select description, (test_conv(inbytes, 'utf8', 'utf8')).* from utf8_verification_inputs; + +-- Test UTF-8 verification with ASCII padding appended to provide +-- coverage for algorithms that work on multiple bytes at a time. +-- The error message for a sequence starting with a 4-byte lead +-- will contain all 4 bytes if they are present, so various +-- expressions below add 3 ASCII bytes to the end to ensure +-- consistent error messages. +-- The number 64 below needs to be at least the value of STRIDE_LENGTH in wchar.c. + +-- Test multibyte verification in fast path +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(inbytes || repeat('.', 64)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + +-- Test ASCII verification in fast path where incomplete +-- UTF-8 sequences fall at the end of the preceding chunk. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64 - length(inbytes))::bytea || inbytes || repeat('.', 64)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + +-- Test cases where UTF-8 sequences within short text +-- come after the fast path returns. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64)::bytea || inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + +-- Test cases where incomplete UTF-8 sequences fall at the +-- end of the part checked by the fast path. +with test_bytes as ( + select + inbytes, + description, + (test_conv(inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from utf8_verification_inputs +), test_padded as ( + select + description, + (test_conv(repeat('.', 64 - length(inbytes))::bytea || inbytes || repeat('.', 3)::bytea, 'utf8', 'utf8')).error + from test_bytes +) +select + description, + b.error as orig_error, + p.error as error_after_padding +from test_padded p +join test_bytes b +using (description) +where p.error is distinct from b.error +order by description; + CREATE TABLE utf8_inputs (inbytes bytea, description text); insert into utf8_inputs values ('\x666f6f', 'valid, pure ASCII'), diff --git a/third_party/spanner_pg/src/test/regress/input/copy.source b/third_party/spanner_pg/src/test/regress/sql/copy.sql similarity index 60% rename from third_party/spanner_pg/src/test/regress/input/copy.source rename to third_party/spanner_pg/src/test/regress/sql/copy.sql index 8acb5168..f9da7b15 100644 --- a/third_party/spanner_pg/src/test/regress/input/copy.source +++ b/third_party/spanner_pg/src/test/regress/sql/copy.sql @@ -2,90 +2,9 @@ -- COPY -- --- CLASS POPULATION --- (any resemblance to real life is purely coincidental) --- -COPY aggtest FROM '@abs_srcdir@/data/agg.data'; - -COPY onek FROM '@abs_srcdir@/data/onek.data'; - -COPY onek TO '@abs_builddir@/results/onek.data'; - -DELETE FROM onek; - -COPY onek FROM '@abs_builddir@/results/onek.data'; - -COPY tenk1 FROM '@abs_srcdir@/data/tenk.data'; - -COPY slow_emp4000 FROM '@abs_srcdir@/data/rect.data'; - -COPY person FROM '@abs_srcdir@/data/person.data'; - -COPY emp FROM '@abs_srcdir@/data/emp.data'; - -COPY student FROM '@abs_srcdir@/data/student.data'; - -COPY stud_emp FROM '@abs_srcdir@/data/stud_emp.data'; - -COPY road FROM '@abs_srcdir@/data/streets.data'; - -COPY real_city FROM '@abs_srcdir@/data/real_city.data'; - -COPY hash_i4_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY hash_name_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY hash_txt_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY hash_f8_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY test_tsvector FROM '@abs_srcdir@/data/tsearch.data'; - -COPY testjsonb FROM '@abs_srcdir@/data/jsonb.data'; - --- the data in this file has a lot of duplicates in the index key --- fields, leading to long bucket chains and lots of table expansion. --- this is therefore a stress test of the bucket overflow code (unlike --- the data in hash.data, which has unique index keys). --- --- COPY hash_ovfl_heap FROM '@abs_srcdir@/data/hashovfl.data'; - -COPY bt_i4_heap FROM '@abs_srcdir@/data/desc.data'; - -COPY bt_name_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY bt_txt_heap FROM '@abs_srcdir@/data/desc.data'; - -COPY bt_f8_heap FROM '@abs_srcdir@/data/hash.data'; - -COPY array_op_test FROM '@abs_srcdir@/data/array.data'; - -COPY array_index_op_test FROM '@abs_srcdir@/data/array.data'; - --- analyze all the data we just loaded, to ensure plan consistency --- in later tests - -ANALYZE aggtest; -ANALYZE onek; -ANALYZE tenk1; -ANALYZE slow_emp4000; -ANALYZE person; -ANALYZE emp; -ANALYZE student; -ANALYZE stud_emp; -ANALYZE road; -ANALYZE real_city; -ANALYZE hash_i4_heap; -ANALYZE hash_name_heap; -ANALYZE hash_txt_heap; -ANALYZE hash_f8_heap; -ANALYZE test_tsvector; -ANALYZE bt_i4_heap; -ANALYZE bt_name_heap; -ANALYZE bt_txt_heap; -ANALYZE bt_f8_heap; -ANALYZE array_op_test; -ANALYZE array_index_op_test; +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR --- test copying in CSV mode with various styles --- of embedded line ending characters @@ -100,11 +19,12 @@ insert into copytest values('Unix',E'abc\ndef',2); insert into copytest values('Mac',E'abc\rdef',3); insert into copytest values(E'esc\\ape',E'a\\r\\\r\\\n\\nb',4); -copy copytest to '@abs_builddir@/results/copytest.csv' csv; +\set filename :abs_builddir '/results/copytest.csv' +copy copytest to :'filename' csv; create temp table copytest2 (like copytest); -copy copytest2 from '@abs_builddir@/results/copytest.csv' csv; +copy copytest2 from :'filename' csv; select * from copytest except select * from copytest2; @@ -112,9 +32,9 @@ truncate copytest2; --- same test but with an escape char different from quote char -copy copytest to '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; +copy copytest to :'filename' csv quote '''' escape E'\\'; -copy copytest2 from '@abs_builddir@/results/copytest.csv' csv quote '''' escape E'\\'; +copy copytest2 from :'filename' csv quote '''' escape E'\\'; select * from copytest except select * from copytest2; @@ -134,6 +54,18 @@ this is just a line full of junk that would error out if parsed copy copytest3 to stdout csv header; +create temp table copytest4 ( + c1 int, + "colname with tab: " text); + +copy copytest4 from stdin (header); +this is just a line full of junk that would error out if parsed +1 a +2 b +\. + +copy copytest4 to stdout (header); + -- test copy from with a partitioned table create table parted_copytest ( a int, @@ -153,16 +85,17 @@ insert into parted_copytest select x,1,'One' from generate_series(1,1000) x; insert into parted_copytest select x,2,'Two' from generate_series(1001,1010) x; insert into parted_copytest select x,1,'One' from generate_series(1011,1020) x; -copy (select * from parted_copytest order by a) to '@abs_builddir@/results/parted_copytest.csv'; +\set filename :abs_builddir '/results/parted_copytest.csv' +copy (select * from parted_copytest order by a) to :'filename'; truncate parted_copytest; -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +copy parted_copytest from :'filename'; -- Ensure COPY FREEZE errors for partitioned tables. begin; truncate parted_copytest; -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv' (freeze); +copy parted_copytest from :'filename' (freeze); rollback; select tableoid::regclass,count(*),sum(a) from parted_copytest @@ -182,7 +115,7 @@ create trigger part_ins_trig for each row execute procedure part_ins_func(); -copy parted_copytest from '@abs_builddir@/results/parted_copytest.csv'; +copy parted_copytest from :'filename'; select tableoid::regclass,count(*),sum(a) from parted_copytest group by tableoid order by tableoid::regclass::name; @@ -257,9 +190,81 @@ bill 20 (11,10) 1000 sharon -- Generate COPY FROM report with FILE, with some excluded tuples. truncate tab_progress_reporting; -copy tab_progress_reporting from '@abs_srcdir@/data/emp.data' +\set filename :abs_srcdir '/data/emp.data' +copy tab_progress_reporting from :'filename' where (salary < 2000); 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 +); +-- Make sure it works with dropped columns +alter table header_copytest drop column c; +alter table header_copytest add column c text; +copy header_copytest to stdout with (header match); +copy header_copytest from stdin with (header wrong_choice); +-- works +copy header_copytest from stdin with (header match); +a b c +1 2 foo +\. +copy header_copytest (c, a, b) from stdin with (header match); +c a b +bar 3 4 +\. +copy header_copytest from stdin with (header match, format csv); +a,b,c +5,6,baz +\. +-- errors +copy header_copytest (c, b, a) 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 +\. +SELECT * FROM header_copytest ORDER BY a; + +-- Drop an extra column, in the middle of the existing set. +alter table header_copytest drop column b; +-- works +copy header_copytest (c, a) from stdin with (header match); +c a +foo 7 +\. +copy header_copytest (a, c) from stdin with (header match); +a c +8 foo +\. +-- errors +copy header_copytest from stdin with (header match); +a ........pg.dropped.2........ c +1 2 foo +\. +copy header_copytest (a, c) from stdin with (header match); +a c b +1 foo 2 +\. + +SELECT * FROM header_copytest ORDER BY a; +drop table header_copytest; diff --git a/third_party/spanner_pg/src/test/regress/sql/copyselect.sql b/third_party/spanner_pg/src/test/regress/sql/copyselect.sql index 1d98dad3..e32a4f8e 100644 --- a/third_party/spanner_pg/src/test/regress/sql/copyselect.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/sql/create_am.sql b/third_party/spanner_pg/src/test/regress/sql/create_am.sql index 9a359466..2785ffd8 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_am.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_am.sql @@ -161,6 +161,51 @@ WHERE pg_depend.refclassid = 'pg_am'::regclass AND pg_am.amname = 'heap2' ORDER BY classid, objid, objsubid; +-- ALTER TABLE SET ACCESS METHOD +CREATE TABLE heaptable USING heap AS + SELECT a, repeat(a::text, 100) FROM generate_series(1,9) AS a; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; +-- Switching to heap2 adds new dependency entry to the AM. +ALTER TABLE heaptable SET ACCESS METHOD heap2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_class'::regclass AND + objid = 'heaptable'::regclass + ORDER BY 1, 2; +-- Switching to heap should not have a dependency entry to the AM. +ALTER TABLE heaptable SET ACCESS METHOD heap; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_class'::regclass AND + objid = 'heaptable'::regclass + ORDER BY 1, 2; +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) + PARTITION BY hash (x); +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +DROP TABLE am_partitioned; -- Second, create objects in the new AM by changing the default AM BEGIN; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_function_c.sql b/third_party/spanner_pg/src/test/regress/sql/create_function_c.sql new file mode 100644 index 00000000..2e5a390a --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/sql/create_function_c.sql @@ -0,0 +1,35 @@ +-- +-- CREATE_FUNCTION_C +-- +-- This script used to create C functions for other scripts to use. +-- But to get rid of the ordering dependencies that caused, such +-- functions are now made either in test_setup.sql or in the specific +-- test script that needs them. All that remains here is error cases. + +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +-- +-- Check LOAD command. (The alternative of implicitly loading the library +-- is checked in many other test scripts.) +-- +LOAD :'regresslib'; + +-- Things that shouldn't work: + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS 'nosuchfile'; + +-- To produce stable regression test output, we have to filter the name +-- of the regresslib file out of the error message in this test. +\set VERBOSITY sqlstate +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C + AS :'regresslib', 'nosuchsymbol'; +\set VERBOSITY default +SELECT regexp_replace(:'LAST_ERROR_MESSAGE', 'file ".*"', 'file "..."'); + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal + AS 'nosuch'; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_function_3.sql b/third_party/spanner_pg/src/test/regress/sql/create_function_sql.sql similarity index 96% rename from third_party/spanner_pg/src/test/regress/sql/create_function_3.sql rename to third_party/spanner_pg/src/test/regress/sql/create_function_sql.sql index ef809808..89e9af3a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_function_3.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_function_sql.sql @@ -1,5 +1,5 @@ -- --- CREATE FUNCTION +-- CREATE_FUNCTION_SQL -- -- Assorted tests using SQL-language functions -- @@ -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 @@ -398,6 +398,23 @@ $$ SELECT array_append($1, $2) || array_append($1, $2) $$; SELECT double_append(array_append(ARRAY[q1], q2), q3) FROM (VALUES(1,2,3), (4,5,6)) v(q1,q2,q3); +-- Things that shouldn't work: + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT ''not an integer'';'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'not even SQL'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT 1, 2, 3;'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'SELECT $2;'; + +CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL + AS 'a', 'b'; + -- Cleanup DROP SCHEMA temp_func_test CASCADE; DROP USER regress_unpriv_user; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_index.sql b/third_party/spanner_pg/src/test/regress/sql/create_index.sql index 7fa250e6..d8fded3d 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_index.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_index.sql @@ -3,6 +3,9 @@ -- Create ancillary data structures (i.e. indices) -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + -- -- BTREE -- @@ -43,22 +46,6 @@ COMMENT ON INDEX six_wrong IS 'bad index'; COMMENT ON INDEX six IS 'good index'; COMMENT ON INDEX six IS NULL; --- --- BTREE ascending/descending cases --- --- we load int4/text from pure descending data (each key is a new --- low key) and name/f8 from pure ascending data (each key is a new --- high key). we had a bug where new low keys would sometimes be --- "lost". --- -CREATE INDEX bt_i4_index ON bt_i4_heap USING btree (seqno int4_ops); - -CREATE INDEX bt_name_index ON bt_name_heap USING btree (seqno name_ops); - -CREATE INDEX bt_txt_index ON bt_txt_heap USING btree (seqno text_ops); - -CREATE INDEX bt_f8_index ON bt_f8_heap USING btree (seqno float8_ops); - -- -- BTREE partial indices -- @@ -74,12 +61,27 @@ CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) -- -- GiST (rtree-equivalent opclasses only) -- -CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); -CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); +CREATE TABLE slow_emp4000 ( + home_base box +); + +CREATE TABLE fast_emp4000 ( + home_base box +); + +\set filename :abs_srcdir '/data/rect.data' +COPY slow_emp4000 FROM :'filename'; + +INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; -CREATE INDEX gcircleind ON circle_tbl USING gist (f1); +ANALYZE slow_emp4000; +ANALYZE fast_emp4000; +CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); + +-- we want to work with a point_tbl that includes a null +CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; INSERT INTO POINT_TBL(f1) VALUES (NULL); CREATE INDEX gpointind ON point_tbl USING gist (f1); @@ -114,12 +116,6 @@ SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; - -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); - SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; @@ -175,18 +171,6 @@ EXPLAIN (COSTS OFF) SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; -EXPLAIN (COSTS OFF) -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; -SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon - ORDER BY (poly_center(f1))[0]; - -EXPLAIN (COSTS OFF) -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); -SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) - ORDER BY area(f1); - EXPLAIN (COSTS OFF) SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; @@ -278,6 +262,21 @@ RESET enable_bitmapscan; -- Note: GIN currently supports only bitmap scans, not plain indexscans -- +CREATE TABLE array_index_op_test ( + seqno int4, + i int4[], + t text[] +); + +\set filename :abs_srcdir '/data/array.data' +COPY array_index_op_test FROM :'filename'; +ANALYZE array_index_op_test; + +SELECT * FROM array_index_op_test WHERE i = '{NULL}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i @> '{NULL}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i && '{NULL}' ORDER BY seqno; +SELECT * FROM array_index_op_test WHERE i <@ '{NULL}' ORDER BY seqno; + SET enable_seqscan = OFF; SET enable_indexscan = OFF; SET enable_bitmapscan = ON; @@ -299,10 +298,6 @@ SELECT * FROM array_index_op_test WHERE i = '{}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE i @> '{}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE i && '{}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); @@ -335,8 +330,6 @@ SELECT * FROM array_index_op_test WHERE t && '{AAAAAAA80240}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE i @> '{32}' AND t && '{AAAAAAA80240}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE i && '{32}' AND t @> '{AAAAAAA80240}' ORDER BY seqno; SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno; -SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno; RESET enable_seqscan; RESET enable_indexscan; @@ -366,14 +359,6 @@ CREATE INDEX gin_relopts_test ON array_index_op_test USING gin (i) -- -- HASH -- -CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); - -CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); - -CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); - -CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) WITH (fillfactor=60); - CREATE UNLOGGED TABLE unlogged_hash_table (id int4); CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); DROP TABLE unlogged_hash_table; @@ -391,6 +376,43 @@ DROP INDEX hash_tuplesort_idx; RESET maintenance_work_mem; +-- +-- Test unique null behavior +-- +CREATE TABLE unique_tbl (i int, t text); + +CREATE UNIQUE INDEX unique_idx1 ON unique_tbl (i) NULLS DISTINCT; +CREATE UNIQUE INDEX unique_idx2 ON unique_tbl (i) NULLS NOT DISTINCT; + +INSERT INTO unique_tbl VALUES (1, 'one'); +INSERT INTO unique_tbl VALUES (2, 'two'); +INSERT INTO unique_tbl VALUES (3, 'three'); +INSERT INTO unique_tbl VALUES (4, 'four'); +INSERT INTO unique_tbl VALUES (5, 'one'); +INSERT INTO unique_tbl (t) VALUES ('six'); +INSERT INTO unique_tbl (t) VALUES ('seven'); -- error from unique_idx2 + +DROP INDEX unique_idx1, unique_idx2; + +INSERT INTO unique_tbl (t) VALUES ('seven'); + +-- build indexes on filled table +CREATE UNIQUE INDEX unique_idx3 ON unique_tbl (i) NULLS DISTINCT; -- ok +CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- error + +DELETE FROM unique_tbl WHERE t = 'seven'; + +CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- ok now + +\d unique_tbl +\d unique_idx3 +\d unique_idx4 +SELECT pg_get_indexdef('unique_idx3'::regclass); +SELECT pg_get_indexdef('unique_idx4'::regclass); + +DROP TABLE unique_tbl; + + -- -- Test functional index -- @@ -452,15 +474,6 @@ ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING I covering_pkey; DROP TABLE covering_index_heap; - --- --- Also try building functional, expressional, and partial indexes on --- tables that already contain data. --- -create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); -create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); -create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; - -- -- Try some concurrent index builds -- @@ -737,8 +750,6 @@ SELECT count(*) FROM dupindexcols -- Check ordering of =ANY indexqual results (bug in 9.2.0) -- -vacuum tenk1; -- ensure we get consistent plans here - explain (costs off) SELECT unique1 FROM tenk1 WHERE unique1 IN (1,42,7) diff --git a/third_party/spanner_pg/src/test/regress/sql/create_index_spgist.sql b/third_party/spanner_pg/src/test/regress/sql/create_index_spgist.sql index b126dae6..660bfc61 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_index_spgist.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_index_spgist.sql @@ -295,6 +295,10 @@ EXPLAIN (COSTS OFF) SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + -- Now check the results from bitmap indexscan SET enable_seqscan = OFF; SET enable_indexscan = OFF; @@ -424,6 +428,10 @@ EXPLAIN (COSTS OFF) SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; SELECT count(*) FROM radix_text_tbl WHERE t ^@ 'Worth'; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); +SELECT count(*) FROM radix_text_tbl WHERE starts_with(t, 'Worth'); + RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_misc.sql b/third_party/spanner_pg/src/test/regress/sql/create_misc.sql index c7d0d064..6fb9fdab 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_misc.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_misc.sql @@ -2,63 +2,37 @@ -- CREATE_MISC -- --- CLASS POPULATION --- (any resemblance to real life is purely coincidental) -- +-- a is the type root +-- b and c inherit from a (one-level single inheritance) +-- d inherits from b and c (two-level multiple inheritance) +-- e inherits from c (two-level single inheritance) +-- f inherits from e (three-level single inheritance) +-- +CREATE TABLE a_star ( + class char, + a int4 +); -INSERT INTO tenk2 SELECT * FROM tenk1; - -CREATE TABLE onek2 AS SELECT * FROM onek; - -INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; - -SELECT * - INTO TABLE Bprime - FROM tenk1 - WHERE unique2 < 1000; - -INSERT INTO hobbies_r (name, person) - SELECT 'posthacking', p.name - FROM person* p - WHERE p.name = 'mike' or p.name = 'jeff'; - -INSERT INTO hobbies_r (name, person) - SELECT 'basketball', p.name - FROM person p - WHERE p.name = 'joe' or p.name = 'sally'; - -INSERT INTO hobbies_r (name) VALUES ('skywalking'); - -INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); - -INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); - -INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); - -INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); - -INSERT INTO city VALUES -('Podunk', '(1,2),(3,4)', '100,127,1000'), -('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); -TABLE city; +CREATE TABLE b_star ( + b text +) INHERITS (a_star); -SELECT * - INTO TABLE ramp - FROM road - WHERE name ~ '.*Ramp'; +CREATE TABLE c_star ( + c name +) INHERITS (a_star); -INSERT INTO ihighway - SELECT * - FROM road - WHERE name ~ 'I- .*'; +CREATE TABLE d_star ( + d float8 +) INHERITS (b_star, c_star); -INSERT INTO shighway - SELECT * - FROM road - WHERE name ~ 'State Hwy.*'; +CREATE TABLE e_star ( + e int2 +) INHERITS (c_star); -UPDATE shighway - SET surface = 'asphalt'; +CREATE TABLE f_star ( + f polygon +) INHERITS (e_star); INSERT INTO a_star (class, a) VALUES ('a', 1); @@ -200,18 +174,85 @@ ANALYZE d_star; ANALYZE e_star; ANALYZE f_star; - -- --- for internal portal (cursor) tests +-- inheritance stress test -- -CREATE TABLE iportaltest ( - i int4, - d float4, - p polygon -); +SELECT * FROM a_star*; + +SELECT * + FROM b_star* x + WHERE x.b = text 'bumble' or x.a < 3; + +SELECT class, a + FROM c_star* x + WHERE x.c ~ text 'hi'; + +SELECT class, b, c + FROM d_star* x + WHERE x.a < 100; + +SELECT class, c FROM e_star* x WHERE x.c NOTNULL; + +SELECT * FROM f_star* x WHERE x.c ISNULL; + +-- grouping and aggregation on inherited sets have been busted in the past... + +SELECT sum(a) FROM a_star*; + +SELECT class, sum(a) FROM a_star* GROUP BY class ORDER BY class; + + +ALTER TABLE f_star RENAME COLUMN f TO ff; + +ALTER TABLE e_star* RENAME COLUMN e TO ee; + +ALTER TABLE d_star* RENAME COLUMN d TO dd; + +ALTER TABLE c_star* RENAME COLUMN c TO cc; + +ALTER TABLE b_star* RENAME COLUMN b TO bb; + +ALTER TABLE a_star* RENAME COLUMN a TO aa; + +SELECT class, aa + FROM a_star* x + WHERE aa ISNULL; + +-- As of Postgres 7.1, ALTER implicitly recurses, +-- so this should be same as ALTER a_star* + +ALTER TABLE a_star RENAME COLUMN aa TO foo; + +SELECT class, foo + FROM a_star* x + WHERE x.foo >= 2; + +ALTER TABLE a_star RENAME COLUMN foo TO aa; + +SELECT * + from a_star* + WHERE aa < 1000; + +ALTER TABLE f_star ADD COLUMN f int4; + +UPDATE f_star SET f = 10; + +ALTER TABLE e_star* ADD COLUMN e int4; + +--UPDATE e_star* SET e = 42; + +SELECT * FROM e_star*; + +ALTER TABLE a_star* ADD COLUMN a text; + +-- That ALTER TABLE should have added TOAST tables. +SELECT relname, reltoastrelid <> 0 AS has_toast_table + FROM pg_class + WHERE oid::regclass IN ('a_star', 'c_star') + ORDER BY 1; -INSERT INTO iportaltest (i, d, p) - VALUES (1, 3.567, '(3.0,1.0),(4.0,2.0)'::polygon); +--UPDATE b_star* +-- SET a = text 'gazpacho' +-- WHERE aa > 4; -INSERT INTO iportaltest (i, d, p) - VALUES (2, 89.05, '(4.0,2.0),(3.0,1.0)'::polygon); +SELECT class, aa, a FROM a_star*; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_operator.sql b/third_party/spanner_pg/src/test/regress/sql/create_operator.sql index 4ff2c0ff..f53e24db 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_operator.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_operator.sql @@ -9,14 +9,6 @@ CREATE OPERATOR ## ( commutator = ## ); -CREATE OPERATOR <% ( - leftarg = point, - rightarg = widget, - procedure = pt_in_widget, - commutator = >% , - negator = >=% -); - CREATE OPERATOR @#@ ( rightarg = int8, -- prefix procedure = factorial @@ -28,8 +20,7 @@ CREATE OPERATOR #%# ( ); -- Test operator created above -SELECT point '(1,2)' <% widget '(0,0,3)' AS t, - point '(1,2)' <% widget '(0,0,1)' AS f; +SELECT @#@ 24; -- Test comments COMMENT ON OPERATOR ###### (NONE, int4) IS 'bad prefix'; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_role.sql b/third_party/spanner_pg/src/test/regress/sql/create_role.sql new file mode 100644 index 00000000..292dc087 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/sql/create_role.sql @@ -0,0 +1,138 @@ +-- ok, superuser can create users with any set of privileges +CREATE ROLE regress_role_super SUPERUSER; +CREATE ROLE regress_role_admin CREATEDB CREATEROLE REPLICATION BYPASSRLS; + +-- fail, only superusers can create users with these privileges +SET SESSION AUTHORIZATION regress_role_admin; +CREATE ROLE regress_nosuch_superuser SUPERUSER; +CREATE ROLE regress_nosuch_replication_bypassrls REPLICATION BYPASSRLS; +CREATE ROLE regress_nosuch_replication REPLICATION; +CREATE ROLE regress_nosuch_bypassrls BYPASSRLS; + +-- ok, having CREATEROLE is enough to create users with these privileges +CREATE ROLE regress_createdb CREATEDB; +CREATE ROLE regress_createrole CREATEROLE; +CREATE ROLE regress_login LOGIN; +CREATE ROLE regress_inherit INHERIT; +CREATE ROLE regress_connection_limit CONNECTION LIMIT 5; +CREATE ROLE regress_encrypted_password ENCRYPTED PASSWORD 'foo'; +CREATE ROLE regress_password_null PASSWORD NULL; + +-- ok, backwards compatible noise words should be ignored +CREATE ROLE regress_noiseword SYSID 12345; + +-- fail, cannot grant membership in superuser role +CREATE ROLE regress_nosuch_super IN ROLE regress_role_super; + +-- fail, database owner cannot have members +CREATE ROLE regress_nosuch_dbowner IN ROLE pg_database_owner; + +-- ok, can grant other users into a role +CREATE ROLE regress_inroles ROLE + regress_role_super, regress_createdb, regress_createrole, regress_login, + regress_inherit, regress_connection_limit, regress_encrypted_password, regress_password_null; + +-- fail, cannot grant a role into itself +CREATE ROLE regress_nosuch_recursive ROLE regress_nosuch_recursive; + +-- ok, can grant other users into a role with admin option +CREATE ROLE regress_adminroles ADMIN + regress_role_super, regress_createdb, regress_createrole, regress_login, + regress_inherit, regress_connection_limit, regress_encrypted_password, regress_password_null; + +-- fail, cannot grant a role into itself with admin option +CREATE ROLE regress_nosuch_admin_recursive ADMIN regress_nosuch_admin_recursive; + +-- fail, regress_createrole does not have CREATEDB privilege +SET SESSION AUTHORIZATION regress_createrole; +CREATE DATABASE regress_nosuch_db; + +-- ok, regress_createrole can create new roles +CREATE ROLE regress_plainrole; + +-- ok, roles with CREATEROLE can create new roles with it +CREATE ROLE regress_rolecreator CREATEROLE; + +-- ok, roles with CREATEROLE can create new roles with privilege they lack +CREATE ROLE regress_tenant CREATEDB CREATEROLE LOGIN INHERIT CONNECTION LIMIT 5; + +-- ok, regress_tenant can create objects within the database +SET SESSION AUTHORIZATION regress_tenant; +CREATE TABLE tenant_table (i integer); +CREATE INDEX tenant_idx ON tenant_table(i); +CREATE VIEW tenant_view AS SELECT * FROM pg_catalog.pg_class; +REVOKE ALL PRIVILEGES ON tenant_table FROM PUBLIC; + +-- fail, these objects belonging to regress_tenant +SET SESSION AUTHORIZATION regress_createrole; +DROP INDEX tenant_idx; +ALTER TABLE tenant_table ADD COLUMN t text; +DROP TABLE tenant_table; +ALTER VIEW tenant_view OWNER TO regress_role_admin; +DROP VIEW tenant_view; + +-- fail, cannot take ownership of these objects from regress_tenant +REASSIGN OWNED BY regress_tenant TO regress_createrole; + +-- ok, having CREATEROLE is enough to create roles in privileged roles +CREATE ROLE regress_read_all_data IN ROLE pg_read_all_data; +CREATE ROLE regress_write_all_data IN ROLE pg_write_all_data; +CREATE ROLE regress_monitor IN ROLE pg_monitor; +CREATE ROLE regress_read_all_settings IN ROLE pg_read_all_settings; +CREATE ROLE regress_read_all_stats IN ROLE pg_read_all_stats; +CREATE ROLE regress_stat_scan_tables IN ROLE pg_stat_scan_tables; +CREATE ROLE regress_read_server_files IN ROLE pg_read_server_files; +CREATE ROLE regress_write_server_files IN ROLE pg_write_server_files; +CREATE ROLE regress_execute_server_program IN ROLE pg_execute_server_program; +CREATE ROLE regress_signal_backend IN ROLE pg_signal_backend; + +-- fail, creation of these roles failed above so they do not now exist +SET SESSION AUTHORIZATION regress_role_admin; +DROP ROLE regress_nosuch_superuser; +DROP ROLE regress_nosuch_replication_bypassrls; +DROP ROLE regress_nosuch_replication; +DROP ROLE regress_nosuch_bypassrls; +DROP ROLE regress_nosuch_super; +DROP ROLE regress_nosuch_dbowner; +DROP ROLE regress_nosuch_recursive; +DROP ROLE regress_nosuch_admin_recursive; +DROP ROLE regress_plainrole; + +-- ok, should be able to drop non-superuser roles we created +DROP ROLE regress_createdb; +DROP ROLE regress_createrole; +DROP ROLE regress_login; +DROP ROLE regress_inherit; +DROP ROLE regress_connection_limit; +DROP ROLE regress_encrypted_password; +DROP ROLE regress_password_null; +DROP ROLE regress_noiseword; +DROP ROLE regress_inroles; +DROP ROLE regress_adminroles; +DROP ROLE regress_rolecreator; +DROP ROLE regress_read_all_data; +DROP ROLE regress_write_all_data; +DROP ROLE regress_monitor; +DROP ROLE regress_read_all_settings; +DROP ROLE regress_read_all_stats; +DROP ROLE regress_stat_scan_tables; +DROP ROLE regress_read_server_files; +DROP ROLE regress_write_server_files; +DROP ROLE regress_execute_server_program; +DROP ROLE regress_signal_backend; + +-- fail, role still owns database objects +DROP ROLE regress_tenant; + +-- fail, cannot drop ourself nor superusers +DROP ROLE regress_role_super; +DROP ROLE regress_role_admin; + +-- ok +RESET SESSION AUTHORIZATION; +DROP INDEX tenant_idx; +DROP TABLE tenant_table; +DROP VIEW tenant_view; +DROP ROLE regress_tenant; +DROP ROLE regress_role_admin; +DROP ROLE regress_role_super; diff --git a/third_party/spanner_pg/src/test/regress/sql/create_table.sql b/third_party/spanner_pg/src/test/regress/sql/create_table.sql index cc41f58b..5175f404 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_table.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_table.sql @@ -2,240 +2,7 @@ -- CREATE_TABLE -- --- --- CLASS DEFINITIONS --- -CREATE TABLE hobbies_r ( - name text, - person text -); - -CREATE TABLE equipment_r ( - name text, - hobby text -); - -CREATE TABLE onek ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); - -CREATE TABLE tenk1 ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); - -CREATE TABLE tenk2 ( - unique1 int4, - unique2 int4, - two int4, - four int4, - ten int4, - twenty int4, - hundred int4, - thousand int4, - twothousand int4, - fivethous int4, - tenthous int4, - odd int4, - even int4, - stringu1 name, - stringu2 name, - string4 name -); - - -CREATE TABLE person ( - name text, - age int4, - location point -); - - -CREATE TABLE emp ( - salary int4, - manager name -) INHERITS (person); - - -CREATE TABLE student ( - gpa float8 -) INHERITS (person); - - -CREATE TABLE stud_emp ( - percent int4 -) INHERITS (emp, student); - - -CREATE TABLE city ( - name name, - location box, - budget city_budget -); - -CREATE TABLE dept ( - dname name, - mgrname text -); - -CREATE TABLE slow_emp4000 ( - home_base box -); - -CREATE TABLE fast_emp4000 ( - home_base box -); - -CREATE TABLE road ( - name text, - thepath path -); - -CREATE TABLE ihighway () INHERITS (road); - -CREATE TABLE shighway ( - surface text -) INHERITS (road); - -CREATE TABLE real_city ( - pop int4, - cname text, - outline path -); - --- --- test the "star" operators a bit more thoroughly -- this time, --- throw in lots of NULL fields... --- --- a is the type root --- b and c inherit from a (one-level single inheritance) --- d inherits from b and c (two-level multiple inheritance) --- e inherits from c (two-level single inheritance) --- f inherits from e (three-level single inheritance) --- -CREATE TABLE a_star ( - class char, - a int4 -); - -CREATE TABLE b_star ( - b text -) INHERITS (a_star); - -CREATE TABLE c_star ( - c name -) INHERITS (a_star); - -CREATE TABLE d_star ( - d float8 -) INHERITS (b_star, c_star); - -CREATE TABLE e_star ( - e int2 -) INHERITS (c_star); - -CREATE TABLE f_star ( - f polygon -) INHERITS (e_star); - -CREATE TABLE aggtest ( - a int2, - b float4 -); - -CREATE TABLE hash_i4_heap ( - seqno int4, - random int4 -); - -CREATE TABLE hash_name_heap ( - seqno int4, - random name -); - -CREATE TABLE hash_txt_heap ( - seqno int4, - random text -); - -CREATE TABLE hash_f8_heap ( - seqno int4, - random float8 -); - --- don't include the hash_ovfl_heap stuff in the distribution --- the data set is too large for what it's worth --- --- CREATE TABLE hash_ovfl_heap ( --- x int4, --- y int4 --- ); - -CREATE TABLE bt_i4_heap ( - seqno int4, - random int4 -); - -CREATE TABLE bt_name_heap ( - seqno name, - random int4 -); - -CREATE TABLE bt_txt_heap ( - seqno text, - random int4 -); - -CREATE TABLE bt_f8_heap ( - seqno float8, - random int4 -); - -CREATE TABLE array_op_test ( - seqno int4, - i int4[], - t text[] -); - -CREATE TABLE array_index_op_test ( - seqno int4, - i int4[], - t text[] -); - -CREATE TABLE testjsonb ( - j jsonb -); - +-- Error cases CREATE TABLE unknowntab ( u unknown -- fail ); @@ -244,15 +11,6 @@ CREATE TYPE unknown_comptype AS ( u unknown -- fail ); -CREATE TABLE IF NOT EXISTS test_tsvector( - t text, - a tsvector -); - -CREATE TABLE IF NOT EXISTS test_tsvector( - t text -); - -- invalid: non-lowercase quoted reloptions identifiers CREATE TABLE tas_case WITH ("Fillfactor" = 10) AS SELECT 1 a; @@ -801,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/third_party/spanner_pg/src/test/regress/sql/create_type.sql b/third_party/spanner_pg/src/test/regress/sql/create_type.sql index a32a9e67..c6fc4f90 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_type.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_type.sql @@ -2,11 +2,36 @@ -- CREATE_TYPE -- +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + -- --- Note: widget_in/out were created in create_function_1, without any --- prior shell-type creation. These commands therefore complete a test --- of the "old style" approach of making the functions first. +-- Test the "old style" approach of making the I/O functions first, +-- with no explicit shell type creation. -- +CREATE FUNCTION widget_in(cstring) + RETURNS widget + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION widget_out(widget) + RETURNS cstring + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION int44in(cstring) + RETURNS city_budget + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; + +CREATE FUNCTION int44out(city_budget) + RETURNS cstring + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; + CREATE TYPE widget ( internallength = 24, input = widget_in, @@ -167,6 +192,37 @@ select format_type('bpchar'::regtype, null); -- this behavior difference is intentional select format_type('bpchar'::regtype, -1); +-- Test creation of an operator over a user-defined type + +CREATE FUNCTION pt_in_widget(point, widget) + RETURNS bool + AS :'regresslib' + LANGUAGE C STRICT; + +CREATE OPERATOR <% ( + leftarg = point, + rightarg = widget, + procedure = pt_in_widget, + commutator = >% , + negator = >=% +); + +SELECT point '(1,2)' <% widget '(0,0,3)' AS t, + point '(1,2)' <% widget '(0,0,1)' AS f; + +-- exercise city_budget type +CREATE TABLE city ( + name name, + location box, + budget city_budget +); + +INSERT INTO city VALUES +('Podunk', '(1,2),(3,4)', '100,127,1000'), +('Gotham', '(1000,34),(1100,334)', '123456,127,-1000,6789'); + +TABLE city; + -- -- Test CREATE/ALTER TYPE using a type that's compatible with varchar, -- so we can re-use those support functions diff --git a/third_party/spanner_pg/src/test/regress/sql/create_view.sql b/third_party/spanner_pg/src/test/regress/sql/create_view.sql index 77246d0c..ee28d450 100644 --- a/third_party/spanner_pg/src/test/regress/sql/create_view.sql +++ b/third_party/spanner_pg/src/test/regress/sql/create_view.sql @@ -4,16 +4,43 @@ -- (this also tests the query rewrite system) -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION interpt_pp(path, path) + RETURNS point + AS :'regresslib' + LANGUAGE C STRICT; + +CREATE TABLE real_city ( + pop int4, + cname text, + outline path +); + +\set filename :abs_srcdir '/data/real_city.data' +COPY real_city FROM :'filename'; +ANALYZE real_city; + +SELECT * + INTO TABLE ramp + FROM ONLY road + WHERE name ~ '.*Ramp'; + CREATE VIEW street AS SELECT r.name, r.thepath, c.cname AS cname FROM ONLY road r, real_city c - WHERE c.outline ## r.thepath; + WHERE c.outline ?# r.thepath; CREATE VIEW iexit AS SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r - WHERE ih.thepath ## r.thepath; + WHERE ih.thepath ?# r.thepath; CREATE VIEW toyemp AS SELECT name, age, location, 12*salary AS annualsal @@ -40,12 +67,13 @@ CREATE VIEW key_dependent_view_no_cols AS -- CREATE OR REPLACE VIEW -- -CREATE TABLE viewtest_tbl (a int, b int); +CREATE TABLE viewtest_tbl (a int, b int, c numeric(10,1), d text COLLATE "C"); + COPY viewtest_tbl FROM stdin; -5 10 -10 15 -15 20 -20 25 +5 10 1.1 xy +10 15 2.2 xyz +15 20 3.3 xyzz +20 25 4.4 xyzzy \. CREATE OR REPLACE VIEW viewtest AS @@ -57,7 +85,7 @@ CREATE OR REPLACE VIEW viewtest AS SELECT * FROM viewtest; CREATE OR REPLACE VIEW viewtest AS - SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; + SELECT a, b, c, d FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC; SELECT * FROM viewtest; @@ -71,11 +99,19 @@ CREATE OR REPLACE VIEW viewtest AS -- should fail CREATE OR REPLACE VIEW viewtest AS - SELECT a, b::numeric FROM viewtest_tbl; + SELECT a, b::numeric, c, d FROM viewtest_tbl; + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, c::numeric(10,2), d FROM viewtest_tbl; + +-- should fail +CREATE OR REPLACE VIEW viewtest AS + SELECT a, b, c, d COLLATE "POSIX" FROM viewtest_tbl; -- should work CREATE OR REPLACE VIEW viewtest AS - SELECT a, b, 0 AS c FROM viewtest_tbl; + SELECT a, b, c, d, 0 AS e FROM viewtest_tbl; DROP VIEW viewtest; DROP TABLE viewtest_tbl; @@ -218,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 @@ -231,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, @@ -521,9 +575,24 @@ create view tt14v as select t.* from tt14f() t; select pg_get_viewdef('tt14v', true); select * from tt14v; +alter table tt14t drop column f3; -- fail, view has explicit reference to f3 + +-- We used to have a bug that would allow the above to succeed, posing +-- hazards for later execution of the view. Check that the internal +-- defenses for those hazards haven't bit-rotted, in case some other +-- bug with similar symptoms emerges. begin; --- this perhaps should be rejected, but it isn't: +-- destroy the dependency entry that prevents the DROP: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'tt14v'::regclass and rulename = '_RETURN') + and refobjsubid = 3 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + +-- this will now succeed: alter table tt14t drop column f3; -- column f3 is still in the view, sort of ... @@ -536,9 +605,22 @@ select * from tt14v; rollback; +-- likewise, altering a referenced column's type is prohibited ... +alter table tt14t alter column f4 type integer using f4::integer; -- fail + +-- ... but some bug might let it happen, so check defenses begin; --- this perhaps should be rejected, but it isn't: +-- destroy the dependency entry that prevents the ALTER: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'tt14v'::regclass and rulename = '_RETURN') + and refobjsubid = 4 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + +-- this will now succeed: alter table tt14t alter column f4 type integer using f4::integer; -- f4 is still in the view ... @@ -549,6 +631,19 @@ select * from tt14v; rollback; +drop view tt14v; + +create view tt14v as select t.f1, t.f4 from tt14f() t; + +select pg_get_viewdef('tt14v', true); +select * from tt14v; + +alter table tt14t drop column f3; -- ok + +select pg_get_viewdef('tt14v', true); +explain (verbose, costs off) select * from tt14v; +select * from tt14v; + -- check display of whole-row variables in some corner cases create type nestedcomposite as (x int8_tbl); diff --git a/third_party/spanner_pg/src/test/regress/sql/dbsize.sql b/third_party/spanner_pg/src/test/regress/sql/dbsize.sql index 6a45c5eb..7df86527 100644 --- a/third_party/spanner_pg/src/test/regress/sql/dbsize.sql +++ b/third_party/spanner_pg/src/test/regress/sql/dbsize.sql @@ -24,22 +24,23 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM (10485247::numeric), (10485248::numeric), (10736893951::numeric), (10736893952::numeric), (10994579406847::numeric), (10994579406848::numeric), - (11258449312612351::numeric), (11258449312612352::numeric)) x(size); + (11258449312612351::numeric), (11258449312612352::numeric), + (11528652096115048447::numeric), (11528652096115048448::numeric)) x(size); -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), - ('1TB'), ('3000 TB'), ('1e6 MB')) x(size); + ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size); -- case-insensitive units are supported SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), - ('1tb'), ('3000 tb'), ('1e6 mb')) x(size); + ('1tb'), ('3000 tb'), ('1e6 mb'), ('99 pb')) x(size); -- negative numbers are supported SELECT size, pg_size_bytes(size) FROM (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), - ('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); + ('-1tb'), ('-3000 TB'), ('-10e-1 MB'), ('-99 PB')) x(size); -- different cases with allowed points SELECT size, pg_size_bytes(size) FROM diff --git a/third_party/spanner_pg/src/test/regress/sql/errors.sql b/third_party/spanner_pg/src/test/regress/sql/errors.sql index a7fcf72d..52474e85 100644 --- a/third_party/spanner_pg/src/test/regress/sql/errors.sql +++ b/third_party/spanner_pg/src/test/regress/sql/errors.sql @@ -77,7 +77,7 @@ alter table nonesuch rename to newnonesuch; alter table nonesuch rename to stud_emp; -- conflict -alter table stud_emp rename to aggtest; +alter table stud_emp rename to student; -- self-conflict alter table stud_emp rename to stud_emp; diff --git a/third_party/spanner_pg/src/test/regress/sql/event_trigger.sql b/third_party/spanner_pg/src/test/regress/sql/event_trigger.sql index 5e45e3f1..1aeaddbe 100644 --- a/third_party/spanner_pg/src/test/regress/sql/event_trigger.sql +++ b/third_party/spanner_pg/src/test/regress/sql/event_trigger.sql @@ -379,6 +379,11 @@ alter table rewriteme add column another int default -1, alter column foo type numeric(10,4); +-- matview rewrite when changing access method +CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT 1 AS a; +ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; +DROP MATERIALIZED VIEW heapmv; + -- shouldn't trigger a table_rewrite event alter table rewriteme alter column foo type numeric(12,4); begin; diff --git a/third_party/spanner_pg/src/test/regress/sql/explain.sql b/third_party/spanner_pg/src/test/regress/sql/explain.sql index 3f9ae984..ae3f7a30 100644 --- a/third_party/spanner_pg/src/test/regress/sql/explain.sql +++ b/third_party/spanner_pg/src/test/regress/sql/explain.sql @@ -51,18 +51,31 @@ begin end; $$; +-- 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'); 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. @@ -104,5 +117,14 @@ select jsonb_pretty( rollback; +-- Test display of temporary objects +create temp table t1(f1 float8); + +create function pg_temp.mysin(float8) returns float8 language plpgsql +as 'begin return sin($1); end'; + +select explain_filter('explain (verbose) select * from t1 where pg_temp.mysin(f1) < 0.5'); + +-- Test compute_query_id set compute_query_id = on; select explain_filter('explain (verbose) select * from int8_tbl i8'); diff --git a/third_party/spanner_pg/src/test/regress/sql/expressions.sql b/third_party/spanner_pg/src/test/regress/sql/expressions.sql index f87751f4..aebd08fa 100644 --- a/third_party/spanner_pg/src/test/regress/sql/expressions.sql +++ b/third_party/spanner_pg/src/test/regress/sql/expressions.sql @@ -3,7 +3,7 @@ -- -- --- Tests for SQLVAlueFunction +-- Tests for SQLValueFunction -- @@ -38,35 +38,6 @@ SELECT current_schema; RESET search_path; --- --- Tests for BETWEEN --- - -explain (costs off) -select count(*) from date_tbl - where f1 between '1997-01-01' and '1998-01-01'; -select count(*) from date_tbl - where f1 between '1997-01-01' and '1998-01-01'; - -explain (costs off) -select count(*) from date_tbl - where f1 not between '1997-01-01' and '1998-01-01'; -select count(*) from date_tbl - where f1 not between '1997-01-01' and '1998-01-01'; - -explain (costs off) -select count(*) from date_tbl - where f1 between symmetric '1997-01-01' and '1998-01-01'; -select count(*) from date_tbl - where f1 between symmetric '1997-01-01' and '1998-01-01'; - -explain (costs off) -select count(*) from date_tbl - where f1 not between symmetric '1997-01-01' and '1998-01-01'; -select count(*) from date_tbl - where f1 not between symmetric '1997-01-01' and '1998-01-01'; - - -- -- Test parsing of a no-op cast to a type with unspecified typmod -- @@ -146,6 +117,15 @@ select return_int_input(1) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1, null); select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); select return_int_input(null::int) in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); select return_text_input('a') in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); +-- NOT IN +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 0); +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 2, null); +select return_int_input(1) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1, null); +select return_int_input(1) not in (null, null, null, null, null, null, null, null, null, null, null); +select return_int_input(null::int) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, 1); +select return_int_input(null::int) not in (10, 9, 2, 8, 3, 7, 4, 6, 5, null); +select return_text_input('a') not in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); rollback; @@ -177,6 +157,12 @@ begin end; $$ language plpgsql immutable; +create function myintne(myint, myint) returns bool as $$ +begin + return not myinteq($1, $2); +end; +$$ language plpgsql immutable; + create operator = ( leftarg = myint, rightarg = myint, @@ -188,6 +174,17 @@ create operator = ( merges ); +create operator <> ( + leftarg = myint, + rightarg = myint, + commutator = <>, + negator = =, + procedure = myintne, + restrict = eqsel, + join = eqjoinsel, + merges +); + create operator class myint_ops default for type myint using hash as operator 1 = (myint, myint), @@ -198,8 +195,12 @@ insert into inttest values(1::myint),(null); -- try an array with enough elements to cause hashing select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); +select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); +select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); -- ensure the result matched with the non-hashed version. We simply remove -- some array elements so that we don't reach the hashing threshold. select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint, null); +select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint, null); +select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint, null); rollback; diff --git a/third_party/spanner_pg/src/test/regress/sql/fast_default.sql b/third_party/spanner_pg/src/test/regress/sql/fast_default.sql index 16a3b7ca..dc9df78a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/fast_default.sql +++ b/third_party/spanner_pg/src/test/regress/sql/fast_default.sql @@ -256,7 +256,18 @@ ALTER TABLE T ADD COLUMN c2 TIMESTAMP DEFAULT clock_timestamp(); SELECT comp(); +-- check that we notice insertion of a volatile default argument +CREATE FUNCTION foolme(timestamptz DEFAULT clock_timestamp()) + RETURNS timestamptz + IMMUTABLE AS 'select $1' LANGUAGE sql; +ALTER TABLE T ADD COLUMN c3 timestamptz DEFAULT foolme(); + +SELECT attname, atthasmissing, attmissingval FROM pg_attribute + WHERE attrelid = 't'::regclass AND attnum > 0 + ORDER BY attnum; + DROP TABLE T; +DROP FUNCTION foolme(timestamptz); -- Simple querie CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); diff --git a/third_party/spanner_pg/src/test/regress/sql/float8.sql b/third_party/spanner_pg/src/test/regress/sql/float8.sql index 97f0c3bb..03c134b0 100644 --- a/third_party/spanner_pg/src/test/regress/sql/float8.sql +++ b/third_party/spanner_pg/src/test/regress/sql/float8.sql @@ -2,7 +2,12 @@ -- FLOAT8 -- -CREATE TABLE FLOAT8_TBL(f1 float8); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- + +CREATE TEMP TABLE FLOAT8_TBL(f1 float8); INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 '); INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 '); @@ -229,20 +234,9 @@ INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400'); INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400'); --- maintain external table consistency across platforms --- delete all values and reinsert well-behaved ones - -DELETE FROM FLOAT8_TBL; - -INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0'); - -INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84'); - -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30'); - -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200'); +DROP TABLE FLOAT8_TBL; -INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200'); +-- Check the float8 values exported for use by other tests SELECT * FROM FLOAT8_TBL; diff --git a/third_party/spanner_pg/src/test/regress/sql/foreign_data.sql b/third_party/spanner_pg/src/test/regress/sql/foreign_data.sql index 279786f4..eefb860a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/foreign_data.sql +++ b/third_party/spanner_pg/src/test/regress/sql/foreign_data.sql @@ -2,6 +2,17 @@ -- Test foreign-data wrapper and server management. -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION test_fdw_handler() + RETURNS fdw_handler + AS :'regresslib', 'test_fdw_handler' + LANGUAGE C; + -- Clean up in case a prior regression run failed -- Suppress NOTICE messages when roles don't exist @@ -59,6 +70,8 @@ CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler; DROP FOREIGN DATA WRAPPER test_fdw; -- ALTER FOREIGN DATA WRAPPER +ALTER FOREIGN DATA WRAPPER foo OPTIONS (nonexistent 'fdw'); -- ERROR + ALTER FOREIGN DATA WRAPPER foo; -- ERROR ALTER FOREIGN DATA WRAPPER foo VALIDATOR bar; -- ERROR ALTER FOREIGN DATA WRAPPER foo NO VALIDATOR; @@ -408,7 +421,6 @@ ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; ALTER FOREIGN TABLE ft1 DROP COLUMN c9; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR -ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 @@ -734,10 +746,6 @@ ALTER TABLE fd_pt1 RENAME CONSTRAINT fd_pt1chk3 TO f2_check; \d+ fd_pt1 \d+ ft2 --- TRUNCATE doesn't work on foreign tables, either directly or recursively -TRUNCATE ft2; -- ERROR -TRUNCATE fd_pt1; -- ERROR - DROP TABLE fd_pt1 CASCADE; -- IMPORT FOREIGN SCHEMA @@ -821,10 +829,6 @@ ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); -- ERROR ALTER FOREIGN TABLE fd_pt2_1 ADD CONSTRAINT fd_pt2chk1 CHECK (c1 > 0); ALTER TABLE fd_pt2 ATTACH PARTITION fd_pt2_1 FOR VALUES IN (1); --- TRUNCATE doesn't work on foreign tables, either directly or recursively -TRUNCATE fd_pt2_1; -- ERROR -TRUNCATE fd_pt2; -- ERROR - DROP FOREIGN TABLE fd_pt2_1; DROP TABLE fd_pt2; diff --git a/third_party/spanner_pg/src/test/regress/sql/foreign_key.sql b/third_party/spanner_pg/src/test/regress/sql/foreign_key.sql index 8917ead3..5e3291e0 100644 --- a/third_party/spanner_pg/src/test/regress/sql/foreign_key.sql +++ b/third_party/spanner_pg/src/test/regress/sql/foreign_key.sql @@ -463,6 +463,33 @@ SELECT * from FKTABLE; DROP TABLE FKTABLE; DROP TABLE PKTABLE; +-- Test for ON DELETE SET NULL/DEFAULT (column_list); +CREATE TABLE PKTABLE (tid int, id int, PRIMARY KEY (tid, id)); +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, id) REFERENCES PKTABLE ON DELETE SET NULL (bar)); +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, id) REFERENCES PKTABLE ON DELETE SET NULL (foo)); +CREATE TABLE FKTABLE (tid int, id int, foo int, FOREIGN KEY (tid, foo) REFERENCES PKTABLE ON UPDATE SET NULL (foo)); +CREATE TABLE FKTABLE ( + tid int, id int, + fk_id_del_set_null int, + fk_id_del_set_default int DEFAULT 0, + FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null), + FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default) +); + +SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE conrelid = 'fktable'::regclass::oid ORDER BY oid; + +INSERT INTO PKTABLE VALUES (1, 0), (1, 1), (1, 2); +INSERT INTO FKTABLE VALUES + (1, 1, 1, NULL), + (1, 2, NULL, 2); + +DELETE FROM PKTABLE WHERE id = 1 OR id = 2; + +SELECT * FROM FKTABLE ORDER BY id; + +DROP TABLE FKTABLE; +DROP TABLE PKTABLE; + -- Test some invalid FK definitions CREATE TABLE PKTABLE (ptest1 int PRIMARY KEY, someoid oid); CREATE TABLE FKTABLE_FAIL1 ( ftest1 int, CONSTRAINT fkfail1 FOREIGN KEY (ftest2) REFERENCES PKTABLE); @@ -1285,6 +1312,30 @@ INSERT INTO fk_notpartitioned_pk VALUES (2501, 142857); UPDATE fk_notpartitioned_pk SET a = 1500 WHERE a = 2502; SELECT * FROM fk_partitioned_fk WHERE b = 142857; +-- ON DELETE SET NULL column_list +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET NULL (a); +BEGIN; +DELETE FROM fk_notpartitioned_pk WHERE b = 142857; +SELECT * FROM fk_partitioned_fk WHERE a IS NOT NULL OR b IS NOT NULL ORDER BY a NULLS LAST; +ROLLBACK; + +-- ON DELETE SET DEFAULT column_list +ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; +ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) + REFERENCES fk_notpartitioned_pk + ON DELETE SET DEFAULT (a); +BEGIN; +DELETE FROM fk_partitioned_fk; +DELETE FROM fk_notpartitioned_pk; +INSERT INTO fk_notpartitioned_pk VALUES (500, 100000), (2501, 100000); +INSERT INTO fk_partitioned_fk VALUES (500, 100000); +DELETE FROM fk_notpartitioned_pk WHERE a = 500; +SELECT * FROM fk_partitioned_fk ORDER BY a; +ROLLBACK; + -- ON UPDATE/DELETE CASCADE ALTER TABLE fk_partitioned_fk DROP CONSTRAINT fk_partitioned_fk_a_b_fkey; ALTER TABLE fk_partitioned_fk ADD FOREIGN KEY (a, b) @@ -1876,12 +1927,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; diff --git a/third_party/spanner_pg/src/test/regress/sql/generated.sql b/third_party/spanner_pg/src/test/regress/sql/generated.sql index 1a38eab0..53bccf90 100644 --- a/third_party/spanner_pg/src/test/regress/sql/generated.sql +++ b/third_party/spanner_pg/src/test/regress/sql/generated.sql @@ -26,6 +26,9 @@ CREATE TABLE gtest_err_3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) S -- generation expression must be immutable CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); +-- ... but be sure that the immutability test is accurate +CREATE TABLE gtest2 (a int, b text GENERATED ALWAYS AS (a || ' sec') STORED); +DROP TABLE gtest2; -- cannot have default/identity and generated CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); @@ -81,6 +84,21 @@ SELECT * FROM gtest1 ORDER BY a; DELETE FROM gtest1 WHERE b = 2; SELECT * FROM gtest1 ORDER BY a; +-- test MERGE +CREATE TABLE gtestm ( + id int PRIMARY KEY, + f1 int, + f2 int, + f3 int GENERATED ALWAYS AS (f1 * 2) STORED, + f4 int GENERATED ALWAYS AS (f2 * 2) STORED +); +INSERT INTO gtestm VALUES (1, 5, 100); +MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id + WHEN MATCHED THEN UPDATE SET f1 = v.f1 + WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200); +SELECT * FROM gtestm ORDER BY id; +DROP TABLE gtestm; + -- views CREATE VIEW gtest1v AS SELECT * FROM gtest1; SELECT * FROM gtest1v; @@ -240,7 +258,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 @@ -269,6 +288,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; diff --git a/third_party/spanner_pg/src/test/regress/sql/geometry.sql b/third_party/spanner_pg/src/test/regress/sql/geometry.sql index bbb6acd4..8928d04a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/geometry.sql +++ b/third_party/spanner_pg/src/test/regress/sql/geometry.sql @@ -129,10 +129,6 @@ SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?-| l2.s; -- Distance to line SELECT l1.s, l2.s, l1.s <-> l2.s FROM LINE_TBL l1, LINE_TBL l2; --- Distance to box -SELECT l.s, b.f1, l.s <-> b.f1 FROM LINE_TBL l, BOX_TBL b; -SELECT l.s, b.f1, b.f1 <-> l.s FROM LINE_TBL l, BOX_TBL b; - -- Intersect with line SELECT l1.s, l2.s FROM LINE_TBL l1, LINE_TBL l2 WHERE l1.s ?# l2.s; @@ -145,9 +141,6 @@ SELECT l1.s, l2.s, l1.s # l2.s FROM LINE_TBL l1, LINE_TBL l2; -- Closest point to line segment SELECT l.s, l1.s, l.s ## l1.s FROM LINE_TBL l, LSEG_TBL l1; --- Closest point to box -SELECT l.s, b.f1, l.s ## b.f1 FROM LINE_TBL l, BOX_TBL b; - -- -- Line segments -- @@ -213,9 +206,6 @@ SELECT l.s, b.f1 FROM LSEG_TBL l, BOX_TBL b WHERE l.s ?# b.f1; -- Intersection point with line segment SELECT l1.s, l2.s, l1.s # l2.s FROM LSEG_TBL l1, LSEG_TBL l2; --- Closest point to line -SELECT l.s, l1.s, l.s ## l1.s FROM LSEG_TBL l, LINE_TBL l1; - -- Closest point to line segment SELECT l1.s, l2.s, l1.s ## l2.s FROM LSEG_TBL l1, LSEG_TBL l2; @@ -285,9 +275,6 @@ SELECT f1, area(f1) FROM PATH_TBL; -- Length SELECT f1, @-@ f1 FROM PATH_TBL; --- Center -SELECT f1, @@ f1 FROM PATH_TBL; - -- To polygon SELECT f1, f1::polygon FROM PATH_TBL WHERE isclosed(f1); @@ -510,3 +497,29 @@ SELECT c.f1, p.f1, c.f1 / p.f1 FROM CIRCLE_TBL c, POINT_TBL p WHERE p.f1 ~= '(0, -- Distance to polygon SELECT c.f1, p.f1, c.f1 <-> p.f1 FROM CIRCLE_TBL c, POLYGON_TBL p; + +-- Check index behavior for circles + +CREATE INDEX gcircleind ON circle_tbl USING gist (f1); + +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + +EXPLAIN (COSTS OFF) +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); +SELECT * FROM circle_tbl WHERE f1 && circle(point(1,-2), 1) + ORDER BY area(f1); + +-- Check index behavior for polygons + +CREATE INDEX gpolygonind ON polygon_tbl USING gist (f1); + +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; + +EXPLAIN (COSTS OFF) +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; +SELECT * FROM polygon_tbl WHERE f1 @> '((1,1),(2,2),(2,1))'::polygon + ORDER BY (poly_center(f1))[0]; diff --git a/third_party/spanner_pg/src/test/regress/sql/gin.sql b/third_party/spanner_pg/src/test/regress/sql/gin.sql index 5194afcc..0c6905ba 100644 --- a/third_party/spanner_pg/src/test/regress/sql/gin.sql +++ b/third_party/spanner_pg/src/test/regress/sql/gin.sql @@ -171,3 +171,13 @@ reset enable_seqscan; reset enable_bitmapscan; drop table t_gin_test_tbl; + +-- test an unlogged table, mostly to get coverage of ginbuildempty +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 + (null, null), + ('{}', null), + ('{1}', '{2,3}'); +drop table t_gin_test_tbl; diff --git a/third_party/spanner_pg/src/test/regress/sql/gist.sql b/third_party/spanner_pg/src/test/regress/sql/gist.sql index d94a0bb2..3dd7aa73 100644 --- a/third_party/spanner_pg/src/test/regress/sql/gist.sql +++ b/third_party/spanner_pg/src/test/regress/sql/gist.sql @@ -175,3 +175,10 @@ reset enable_bitmapscan; reset enable_indexonlyscan; drop table gist_tbl; + +-- test an unlogged table, mostly to get coverage of gistbuildempty +create unlogged table gist_tbl (b box); +create index gist_tbl_box_index on gist_tbl using gist (b); +insert into gist_tbl + select box(point(0.05*i, 0.05*i)) from generate_series(0,10) as i; +drop table gist_tbl; diff --git a/third_party/spanner_pg/src/test/regress/sql/groupingsets.sql b/third_party/spanner_pg/src/test/regress/sql/groupingsets.sql index 71d2ae9a..90ba2725 100644 --- a/third_party/spanner_pg/src/test/regress/sql/groupingsets.sql +++ b/third_party/spanner_pg/src/test/regress/sql/groupingsets.sql @@ -447,6 +447,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, @@ -542,6 +543,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/third_party/spanner_pg/src/test/regress/sql/guc.sql b/third_party/spanner_pg/src/test/regress/sql/guc.sql index c39c1138..23cd8a1c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/guc.sql +++ b/third_party/spanner_pg/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 -- @@ -311,3 +318,33 @@ reset check_function_bodies; set default_with_oids to f; -- Should not allow to set it to true. set default_with_oids to t; + +-- Test GUC categories and flag patterns +SELECT pg_settings_get_flags(NULL); +SELECT pg_settings_get_flags('does_not_exist'); +CREATE TABLE tab_settings_flags AS SELECT name, category, + 'EXPLAIN' = ANY(flags) AS explain, + 'NO_RESET_ALL' = ANY(flags) AS no_reset_all, + 'NOT_IN_SAMPLE' = ANY(flags) AS not_in_sample, + 'RUNTIME_COMPUTED' = ANY(flags) AS runtime_computed + FROM pg_show_all_settings() AS psas, + pg_settings_get_flags(psas.name) AS flags; + +-- Developer GUCs should be flagged with GUC_NOT_IN_SAMPLE: +SELECT name FROM tab_settings_flags + WHERE category = 'Developer Options' AND NOT not_in_sample + ORDER BY 1; +-- Most query-tuning GUCs are flagged as valid for EXPLAIN. +-- default_statistics_target is an exception. +SELECT name FROM tab_settings_flags + WHERE category ~ '^Query Tuning' AND NOT explain + ORDER BY 1; +-- Runtime-computed GUCs should be part of the preset category. +SELECT name FROM tab_settings_flags + WHERE NOT category = 'Preset Options' AND runtime_computed + ORDER BY 1; +-- Preset GUCs are flagged as NOT_IN_SAMPLE. +SELECT name FROM tab_settings_flags + WHERE category = 'Preset Options' AND NOT not_in_sample + ORDER BY 1; +DROP TABLE tab_settings_flags; diff --git a/third_party/spanner_pg/src/test/regress/sql/hash_index.sql b/third_party/spanner_pg/src/test/regress/sql/hash_index.sql index 4d1aa020..527024f7 100644 --- a/third_party/spanner_pg/src/test/regress/sql/hash_index.sql +++ b/third_party/spanner_pg/src/test/regress/sql/hash_index.sql @@ -1,8 +1,70 @@ -- -- HASH_INDEX --- grep 843938989 hash.data -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + +CREATE TABLE hash_i4_heap ( + seqno int4, + random int4 +); + +CREATE TABLE hash_name_heap ( + seqno int4, + random name +); + +CREATE TABLE hash_txt_heap ( + seqno int4, + random text +); + +CREATE TABLE hash_f8_heap ( + seqno int4, + random float8 +); + +\set filename :abs_srcdir '/data/hash.data' +COPY hash_i4_heap FROM :'filename'; +COPY hash_name_heap FROM :'filename'; +COPY hash_txt_heap FROM :'filename'; +COPY hash_f8_heap FROM :'filename'; + +-- the data in this file has a lot of duplicates in the index key +-- fields, leading to long bucket chains and lots of table expansion. +-- this is therefore a stress test of the bucket overflow code (unlike +-- the data in hash.data, which has unique index keys). +-- +-- \set filename :abs_srcdir '/data/hashovfl.data' +-- COPY hash_ovfl_heap FROM :'filename'; + +ANALYZE hash_i4_heap; +ANALYZE hash_name_heap; +ANALYZE hash_txt_heap; +ANALYZE hash_f8_heap; + +CREATE INDEX hash_i4_index ON hash_i4_heap USING hash (random int4_ops); + +CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops); + +CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops); + +CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops) + WITH (fillfactor=60); + +-- +-- Also try building functional, expressional, and partial indexes on +-- tables that already contain data. +-- +create unique index hash_f8_index_1 on hash_f8_heap(abs(random)); +create unique index hash_f8_index_2 on hash_f8_heap((seqno + 1), random); +create unique index hash_f8_index_3 on hash_f8_heap(random) where seqno > 1000; + +-- +-- hash index +-- grep 843938989 hash.data +-- SELECT * FROM hash_i4_heap WHERE hash_i4_heap.random = 843938989; diff --git a/third_party/spanner_pg/src/test/regress/sql/horology.sql b/third_party/spanner_pg/src/test/regress/sql/horology.sql index 78091112..40653481 100644 --- a/third_party/spanner_pg/src/test/regress/sql/horology.sql +++ b/third_party/spanner_pg/src/test/regress/sql/horology.sql @@ -86,6 +86,7 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; +SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range"; SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; -- Shorthand values @@ -117,6 +118,7 @@ SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; +SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range"; SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; @@ -306,6 +308,34 @@ SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::timestamp as t; RESET TimeZone; +-- +-- Tests for BETWEEN +-- + +explain (costs off) +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 between '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 not between '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 between symmetric '1997-01-01' and '1998-01-01'; + +explain (costs off) +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; +select count(*) from date_tbl + where f1 not between symmetric '1997-01-01' and '1998-01-01'; + -- -- Formats -- diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_primary_extremes.sql b/third_party/spanner_pg/src/test/regress/sql/hs_primary_extremes.sql deleted file mode 100644 index 2051e2e5..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_primary_extremes.sql +++ /dev/null @@ -1,73 +0,0 @@ --- --- Hot Standby tests --- --- hs_primary_extremes.sql --- - -drop table if exists hs_extreme; -create table hs_extreme (col1 integer); - -CREATE OR REPLACE FUNCTION hs_subxids (n integer) -RETURNS void -LANGUAGE plpgsql -AS $$ - BEGIN - IF n <= 0 THEN RETURN; END IF; - INSERT INTO hs_extreme VALUES (n); - PERFORM hs_subxids(n - 1); - RETURN; - EXCEPTION WHEN raise_exception THEN NULL; END; -$$; - -BEGIN; -SELECT hs_subxids(257); -ROLLBACK; -BEGIN; -SELECT hs_subxids(257); -COMMIT; - -set client_min_messages = 'warning'; - -CREATE OR REPLACE FUNCTION hs_locks_create (n integer) -RETURNS void -LANGUAGE plpgsql -AS $$ - BEGIN - IF n <= 0 THEN - CHECKPOINT; - RETURN; - END IF; - EXECUTE 'CREATE TABLE hs_locks_' || n::text || ' ()'; - PERFORM hs_locks_create(n - 1); - RETURN; - EXCEPTION WHEN raise_exception THEN NULL; END; -$$; - -CREATE OR REPLACE FUNCTION hs_locks_drop (n integer) -RETURNS void -LANGUAGE plpgsql -AS $$ - BEGIN - IF n <= 0 THEN - CHECKPOINT; - RETURN; - END IF; - EXECUTE 'DROP TABLE IF EXISTS hs_locks_' || n::text; - PERFORM hs_locks_drop(n - 1); - RETURN; - EXCEPTION WHEN raise_exception THEN NULL; END; -$$; - -BEGIN; -SELECT hs_locks_drop(257); -SELECT hs_locks_create(257); -SELECT count(*) > 257 FROM pg_locks; -ROLLBACK; -BEGIN; -SELECT hs_locks_drop(257); -SELECT hs_locks_create(257); -SELECT count(*) > 257 FROM pg_locks; -COMMIT; -SELECT hs_locks_drop(257); - -SELECT pg_switch_wal(); diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_primary_setup.sql b/third_party/spanner_pg/src/test/regress/sql/hs_primary_setup.sql deleted file mode 100644 index eeb44213..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_primary_setup.sql +++ /dev/null @@ -1,25 +0,0 @@ --- --- Hot Standby tests --- --- hs_primary_setup.sql --- - -drop table if exists hs1; -create table hs1 (col1 integer primary key); -insert into hs1 values (1); - -drop table if exists hs2; -create table hs2 (col1 integer primary key); -insert into hs2 values (12); -insert into hs2 values (13); - -drop table if exists hs3; -create table hs3 (col1 integer primary key); -insert into hs3 values (113); -insert into hs3 values (114); -insert into hs3 values (115); - -DROP sequence if exists hsseq; -create sequence hsseq; - -SELECT pg_switch_wal(); diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_standby_allowed.sql b/third_party/spanner_pg/src/test/regress/sql/hs_standby_allowed.sql deleted file mode 100644 index 6debddc5..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_standby_allowed.sql +++ /dev/null @@ -1,125 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_allowed.sql --- - --- SELECT - -select count(*) as should_be_1 from hs1; - -select count(*) as should_be_2 from hs2; - -select count(*) as should_be_3 from hs3; - -COPY hs1 TO '/tmp/copy_test'; -\! cat /tmp/copy_test - --- Access sequence directly -select is_called from hsseq; - --- Transactions - -begin; -select count(*) as should_be_1 from hs1; -end; - -begin transaction read only; -select count(*) as should_be_1 from hs1; -end; - -begin transaction isolation level repeatable read; -select count(*) as should_be_1 from hs1; -select count(*) as should_be_1 from hs1; -select count(*) as should_be_1 from hs1; -commit; - -begin; -select count(*) as should_be_1 from hs1; -commit; - -begin; -select count(*) as should_be_1 from hs1; -abort; - -start transaction; -select count(*) as should_be_1 from hs1; -commit; - -begin; -select count(*) as should_be_1 from hs1; -rollback; - -begin; -select count(*) as should_be_1 from hs1; -savepoint s; -select count(*) as should_be_2 from hs2; -commit; - -begin; -select count(*) as should_be_1 from hs1; -savepoint s; -select count(*) as should_be_2 from hs2; -release savepoint s; -select count(*) as should_be_2 from hs2; -savepoint s; -select count(*) as should_be_3 from hs3; -rollback to savepoint s; -select count(*) as should_be_2 from hs2; -commit; - --- SET parameters - --- has no effect on read only transactions, but we can still set it -set synchronous_commit = on; -show synchronous_commit; -reset synchronous_commit; - -discard temp; -discard all; - --- CURSOR commands - -BEGIN; - -DECLARE hsc CURSOR FOR select * from hs3; - -FETCH next from hsc; -fetch first from hsc; -fetch last from hsc; -fetch 1 from hsc; - -CLOSE hsc; - -COMMIT; - --- Prepared plans - -PREPARE hsp AS select count(*) from hs1; -PREPARE hsp_noexec (integer) AS insert into hs1 values ($1); - -EXECUTE hsp; - -DEALLOCATE hsp; - --- LOCK - -BEGIN; -LOCK hs1 IN ACCESS SHARE MODE; -LOCK hs1 IN ROW SHARE MODE; -LOCK hs1 IN ROW EXCLUSIVE MODE; -COMMIT; - --- UNLISTEN -UNLISTEN a; -UNLISTEN *; - --- LOAD --- should work, easier if there is no test for that... - - --- ALLOWED COMMANDS - -CHECKPOINT; - -discard all; diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_standby_check.sql b/third_party/spanner_pg/src/test/regress/sql/hs_standby_check.sql deleted file mode 100644 index 3fe8a027..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_standby_check.sql +++ /dev/null @@ -1,16 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_check.sql --- - --- --- If the query below returns false then all other tests will fail after it. --- -select case pg_is_in_recovery() when false then - 'These tests are intended only for execution on a standby server that is reading ' || - 'WAL from a server upon which the regression database is already created and into ' || - 'which src/test/regress/sql/hs_primary_setup.sql has been run' -else - 'Tests are running on a standby server during recovery' -end; diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_standby_disallowed.sql b/third_party/spanner_pg/src/test/regress/sql/hs_standby_disallowed.sql deleted file mode 100644 index a470600e..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_standby_disallowed.sql +++ /dev/null @@ -1,103 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_disallowed.sql --- - -SET transaction_read_only = off; - -begin transaction read write; -commit; - --- SELECT - -select * from hs1 FOR SHARE; -select * from hs1 FOR UPDATE; - --- DML -BEGIN; -insert into hs1 values (37); -ROLLBACK; -BEGIN; -delete from hs1 where col1 = 1; -ROLLBACK; -BEGIN; -update hs1 set col1 = NULL where col1 > 0; -ROLLBACK; -BEGIN; -truncate hs3; -ROLLBACK; - --- DDL - -create temporary table hstemp1 (col1 integer); -BEGIN; -drop table hs2; -ROLLBACK; -BEGIN; -create table hs4 (col1 integer); -ROLLBACK; - --- Sequences - -SELECT nextval('hsseq'); - --- Two-phase commit transaction stuff - -BEGIN; -SELECT count(*) FROM hs1; -PREPARE TRANSACTION 'foobar'; -ROLLBACK; -BEGIN; -SELECT count(*) FROM hs1; -COMMIT PREPARED 'foobar'; -ROLLBACK; - -BEGIN; -SELECT count(*) FROM hs1; -PREPARE TRANSACTION 'foobar'; -ROLLBACK PREPARED 'foobar'; -ROLLBACK; - -BEGIN; -SELECT count(*) FROM hs1; -ROLLBACK PREPARED 'foobar'; -ROLLBACK; - - --- Locks -BEGIN; -LOCK hs1; -COMMIT; -BEGIN; -LOCK hs1 IN SHARE UPDATE EXCLUSIVE MODE; -COMMIT; -BEGIN; -LOCK hs1 IN SHARE MODE; -COMMIT; -BEGIN; -LOCK hs1 IN SHARE ROW EXCLUSIVE MODE; -COMMIT; -BEGIN; -LOCK hs1 IN EXCLUSIVE MODE; -COMMIT; -BEGIN; -LOCK hs1 IN ACCESS EXCLUSIVE MODE; -COMMIT; - --- Listen -listen a; -notify a; - --- disallowed commands - -ANALYZE hs1; - -VACUUM hs2; - -CLUSTER hs2 using hs1_pkey; - -REINDEX TABLE hs2; - -REVOKE SELECT ON hs1 FROM PUBLIC; -GRANT SELECT ON hs1 TO PUBLIC; diff --git a/third_party/spanner_pg/src/test/regress/sql/hs_standby_functions.sql b/third_party/spanner_pg/src/test/regress/sql/hs_standby_functions.sql deleted file mode 100644 index b57f67ff..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/hs_standby_functions.sql +++ /dev/null @@ -1,24 +0,0 @@ --- --- Hot Standby tests --- --- hs_standby_functions.sql --- - --- should fail -select pg_current_xact_id(); - -select length(pg_current_snapshot()::text) >= 4; - -select pg_start_backup('should fail'); -select pg_switch_wal(); -select pg_stop_backup(); - --- should return no rows -select * from pg_prepared_xacts; - --- just the startup process -select locktype, virtualxid, virtualtransaction, mode, granted -from pg_locks where virtualxid = '1/1'; - --- suicide is painless -select pg_cancel_backend(pg_backend_pid()); diff --git a/third_party/spanner_pg/src/test/regress/sql/identity.sql b/third_party/spanner_pg/src/test/regress/sql/identity.sql index 52800f26..9b8db2e4 100644 --- a/third_party/spanner_pg/src/test/regress/sql/identity.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/sql/indexing.sql b/third_party/spanner_pg/src/test/regress/sql/indexing.sql index 6f60d1dc..a48a3177 100644 --- a/third_party/spanner_pg/src/test/regress/sql/indexing.sql +++ b/third_party/spanner_pg/src/test/regress/sql/indexing.sql @@ -668,6 +668,26 @@ insert into idxpart values (857142, 'six'); select tableoid::regclass, * from idxpart order by a; drop table idxpart; +-- Test some other non-btree index types +create table idxpart (a int, b text, c int[]) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +set enable_seqscan to off; + +create index idxpart_brin on idxpart using brin(b); +explain (costs off) select * from idxpart where b = 'abcd'; +drop index idxpart_brin; + +create index idxpart_spgist on idxpart using spgist(b); +explain (costs off) select * from idxpart where b = 'abcd'; +drop index idxpart_spgist; + +create index idxpart_gin on idxpart using gin(c); +explain (costs off) select * from idxpart where c @> array[42]; +drop index idxpart_gin; + +reset enable_seqscan; +drop table idxpart; + -- intentionally leave some objects around create table idxpart (a int) partition by range (a); create table idxpart1 partition of idxpart for values from (0) to (100); diff --git a/third_party/spanner_pg/src/test/regress/sql/indirect_toast.sql b/third_party/spanner_pg/src/test/regress/sql/indirect_toast.sql index 9156a44b..3e2f6c02 100644 --- a/third_party/spanner_pg/src/test/regress/sql/indirect_toast.sql +++ b/third_party/spanner_pg/src/test/regress/sql/indirect_toast.sql @@ -2,6 +2,17 @@ -- Tests for external toast datums -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION make_tuple_indirect (record) + RETURNS record + AS :'regresslib' + LANGUAGE C STRICT; + -- Other compression algorithms may cause the compressed data to be stored -- inline. pglz guarantees that the data is externalized, so stick to it. SET default_toast_compression = 'pglz'; diff --git a/third_party/spanner_pg/src/test/regress/sql/inherit.sql b/third_party/spanner_pg/src/test/regress/sql/inherit.sql index d3674fa2..bd908343 100644 --- a/third_party/spanner_pg/src/test/regress/sql/inherit.sql +++ b/third_party/spanner_pg/src/test/regress/sql/inherit.sql @@ -372,6 +372,15 @@ ALTER TABLE inhts RENAME d TO dd; DROP TABLE inhts; +-- Test for adding a column to a parent table with complex inheritance +CREATE TABLE inhta (); +CREATE TABLE inhtb () INHERITS (inhta); +CREATE TABLE inhtc () INHERITS (inhtb); +CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc); +ALTER TABLE inhta ADD COLUMN i int; +\d+ inhta +DROP TABLE inhta, inhtb, inhtc, inhtd; + -- Test for renaming in diamond inheritance CREATE TABLE inht2 (x int) INHERITS (inht1); CREATE TABLE inht3 (y int) INHERITS (inht1); @@ -832,6 +841,8 @@ explain (costs off) select a, abs(b) from mcrparted order by a, abs(b), c; -- during planning. explain (costs off) select * from mcrparted where a < 20 order by a, abs(b), c; +set enable_bitmapscan to off; +set enable_sort to off; create table mclparted (a int) partition by list(a); create table mclparted1 partition of mclparted for values in(1); create table mclparted2 partition of mclparted for values in(2); @@ -846,8 +857,33 @@ create table mclparted3_5 partition of mclparted for values in(3,5); create table mclparted4 partition of mclparted for values in(4); explain (costs off) select * from mclparted order by a; +explain (costs off) select * from mclparted where a in(3,4,5) order by a; + +-- Introduce a NULL and DEFAULT partition so we can test more complex cases +create table mclparted_null partition of mclparted for values in(null); +create table mclparted_def partition of mclparted default; + +-- Append can be used providing we don't scan the interleaved partition +explain (costs off) select * from mclparted where a in(1,2,4) order by a; +explain (costs off) select * from mclparted where a in(1,2,4) or a is null order by a; + +-- Test a more complex case where the NULL partition allows some other value +drop table mclparted_null; +create table mclparted_0_null partition of mclparted for values in(0,null); + +-- Ensure MergeAppend is used since 0 and NULLs are in the same partition. +explain (costs off) select * from mclparted where a in(1,2,4) or a is null order by a; +explain (costs off) select * from mclparted where a in(0,1,2,4) order by a; + +-- Ensure Append is used when the null partition is pruned +explain (costs off) select * from mclparted where a in(1,2,4) order by a; + +-- Ensure MergeAppend is used when the default partition is not pruned +explain (costs off) select * from mclparted where a in(1,2,4,100) order by a; drop table mclparted; +reset enable_sort; +reset enable_bitmapscan; -- Ensure subplans which don't have a path with the correct pathkeys get -- sorted correctly. diff --git a/third_party/spanner_pg/src/test/regress/sql/insert.sql b/third_party/spanner_pg/src/test/regress/sql/insert.sql index bfaa8a3b..bdcffd03 100644 --- a/third_party/spanner_pg/src/test/regress/sql/insert.sql +++ b/third_party/spanner_pg/src/test/regress/sql/insert.sql @@ -250,33 +250,6 @@ select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from list_p -- direct partition inserts should check hash partition bound constraint --- 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 --- of the non-empty string value passed to it or 0. - -create or replace function part_hashint4_noop(value int4, seed int8) -returns int8 as $$ -select value + seed; -$$ language sql immutable; - -create operator class part_test_int4_ops -for type int4 -using hash as -operator 1 =, -function 2 part_hashint4_noop(int4, int8); - -create or replace function part_hashtext_length(value text, seed int8) -RETURNS int8 AS $$ -select length(coalesce(value, ''))::int8 -$$ language sql immutable; - -create operator class part_test_text_ops -for type text -using hash as -operator 1 =, -function 2 part_hashtext_length(text, int8); - create table hash_parted ( a int ) partition by hash (a part_test_int4_ops); diff --git a/third_party/spanner_pg/src/test/regress/sql/int2.sql b/third_party/spanner_pg/src/test/regress/sql/int2.sql index 2f5ea64e..ea29066b 100644 --- a/third_party/spanner_pg/src/test/regress/sql/int2.sql +++ b/third_party/spanner_pg/src/test/regress/sql/int2.sql @@ -2,22 +2,10 @@ -- INT2 -- -CREATE TABLE INT2_TBL(f1 int2); - -INSERT INTO INT2_TBL(f1) VALUES ('0 '); - -INSERT INTO INT2_TBL(f1) VALUES (' 1234 '); - -INSERT INTO INT2_TBL(f1) VALUES (' -1234'); +-- int2_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO INT2_TBL(f1) VALUES ('34.5'); - --- largest and smallest values -INSERT INTO INT2_TBL(f1) VALUES ('32767'); - -INSERT INTO INT2_TBL(f1) VALUES ('-32767'); - --- bad input values -- should give errors INSERT INTO INT2_TBL(f1) VALUES ('100000'); INSERT INTO INT2_TBL(f1) VALUES ('asdf'); INSERT INTO INT2_TBL(f1) VALUES (' '); diff --git a/third_party/spanner_pg/src/test/regress/sql/int4.sql b/third_party/spanner_pg/src/test/regress/sql/int4.sql index 55ec07a1..f19077f3 100644 --- a/third_party/spanner_pg/src/test/regress/sql/int4.sql +++ b/third_party/spanner_pg/src/test/regress/sql/int4.sql @@ -2,22 +2,10 @@ -- INT4 -- -CREATE TABLE INT4_TBL(f1 int4); - -INSERT INTO INT4_TBL(f1) VALUES (' 0 '); - -INSERT INTO INT4_TBL(f1) VALUES ('123456 '); - -INSERT INTO INT4_TBL(f1) VALUES (' -123456'); +-- int4_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. INSERT INTO INT4_TBL(f1) VALUES ('34.5'); - --- largest and smallest values -INSERT INTO INT4_TBL(f1) VALUES ('2147483647'); - -INSERT INTO INT4_TBL(f1) VALUES ('-2147483647'); - --- bad input values -- should give errors INSERT INTO INT4_TBL(f1) VALUES ('1000000000000'); INSERT INTO INT4_TBL(f1) VALUES ('asdf'); INSERT INTO INT4_TBL(f1) VALUES (' '); diff --git a/third_party/spanner_pg/src/test/regress/sql/int8.sql b/third_party/spanner_pg/src/test/regress/sql/int8.sql index 32940b4d..8a3d5371 100644 --- a/third_party/spanner_pg/src/test/regress/sql/int8.sql +++ b/third_party/spanner_pg/src/test/regress/sql/int8.sql @@ -2,15 +2,10 @@ -- INT8 -- Test int8 64-bit integers. -- -CREATE TABLE INT8_TBL(q1 int8, q2 int8); -INSERT INTO INT8_TBL VALUES(' 123 ',' 456'); -INSERT INTO INT8_TBL VALUES('123 ','4567890123456789'); -INSERT INTO INT8_TBL VALUES('4567890123456789','123'); -INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789'); -INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789'); +-- int8_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. --- bad inputs INSERT INTO INT8_TBL(q1) VALUES (' '); INSERT INTO INT8_TBL(q1) VALUES ('xxx'); INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485'); @@ -131,6 +126,7 @@ select '9223372036854775808'::int8; select -('-9223372036854775807'::int8); select -('-9223372036854775808'::int8); +select 0::int8 - '-9223372036854775808'::int8; select '9223372036854775800'::int8 + '9223372036854775800'::int8; select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; diff --git a/third_party/spanner_pg/src/test/regress/sql/interval.sql b/third_party/spanner_pg/src/test/regress/sql/interval.sql index 6d532398..2a3dd0cf 100644 --- a/third_party/spanner_pg/src/test/regress/sql/interval.sql +++ b/third_party/spanner_pg/src/test/regress/sql/interval.sql @@ -129,6 +129,14 @@ SET IntervalStyle to postgres_verbose; SELECT * FROM INTERVAL_TBL; +-- multiplication and division overflow test cases +SELECT '3000000 months'::interval * 1000; +SELECT '3000000 months'::interval / 0.001; +SELECT '3000000 days'::interval * 1000; +SELECT '3000000 days'::interval / 0.001; +SELECT '1 month 2146410 days'::interval * 1000.5002; +SELECT '4611686018427387904 usec'::interval / 0.1; + -- test avg(interval), which is somewhat fragile since people have been -- known to change the allowed input syntax for type interval without -- updating pg_aggregate.agginitval @@ -149,10 +157,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; @@ -246,6 +266,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', @@ -253,6 +279,15 @@ 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'; + +-- edge case for sign-matching rules +SELECT interval ''; -- error + -- test outputting iso8601 intervals SET IntervalStyle to iso_8601; select interval '0' AS "zero", @@ -288,12 +323,205 @@ 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 'P10.5e4Y'; -- not per spec, but we've historically taken it +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'; 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; diff --git a/third_party/spanner_pg/src/test/regress/sql/join.sql b/third_party/spanner_pg/src/test/regress/sql/join.sql index bb72975f..1113e984 100644 --- a/third_party/spanner_pg/src/test/regress/sql/join.sql +++ b/third_party/spanner_pg/src/test/regress/sql/join.sql @@ -391,11 +391,11 @@ rollback; -- explain (costs off) select aa, bb, unique1, unique1 - from tenk1 right join b on aa = unique1 + from tenk1 right join b_star on aa = unique1 where bb < bb and bb is null; select aa, bb, unique1, unique1 - from tenk1 right join b on aa = unique1 + from tenk1 right join b_star on aa = unique1 where bb < bb and bb is null; -- @@ -1978,6 +1978,18 @@ select * from ) on c.q2 = ss2.q1, lateral (select ss2.y offset 0) ss3; +-- another case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + -- case that breaks the old ph_may_need optimization explain (verbose, costs off) select c.*,a.*,ss1.q1,ss2.q1,ss3.* from diff --git a/third_party/spanner_pg/src/test/regress/sql/join_hash.sql b/third_party/spanner_pg/src/test/regress/sql/join_hash.sql index 7163422a..e1707cd2 100644 --- a/third_party/spanner_pg/src/test/regress/sql/join_hash.sql +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/regress/sql/jsonb.sql b/third_party/spanner_pg/src/test/regress/sql/jsonb.sql index 040e1bac..66d731a3 100644 --- a/third_party/spanner_pg/src/test/regress/sql/jsonb.sql +++ b/third_party/spanner_pg/src/test/regress/sql/jsonb.sql @@ -1,3 +1,13 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + +CREATE TABLE testjsonb ( + j jsonb +); + +\set filename :abs_srcdir '/data/jsonb.data' +COPY testjsonb FROM :'filename'; + -- Strings. SELECT '""'::jsonb; -- OK. SELECT $$''$$::jsonb; -- ERROR, single quotes are not allowed diff --git a/third_party/spanner_pg/src/test/regress/sql/jsonpath.sql b/third_party/spanner_pg/src/test/regress/sql/jsonpath.sql index 17ab7757..d4917146 100644 --- a/third_party/spanner_pg/src/test/regress/sql/jsonpath.sql +++ b/third_party/spanner_pg/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; diff --git a/third_party/spanner_pg/src/test/regress/input/largeobject.source b/third_party/spanner_pg/src/test/regress/sql/largeobject.sql similarity index 85% rename from third_party/spanner_pg/src/test/regress/input/largeobject.source rename to third_party/spanner_pg/src/test/regress/sql/largeobject.sql index b1e7ae99..2ef03cfd 100644 --- a/third_party/spanner_pg/src/test/regress/input/largeobject.source +++ b/third_party/spanner_pg/src/test/regress/sql/largeobject.sql @@ -2,9 +2,26 @@ -- Test large object support -- +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR + -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; +-- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +CREATE ROLE regress_lo_user; +SELECT lo_create(42); +ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; +GRANT SELECT ON LARGE OBJECT 42 TO public; +COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; + +-- Test psql's \lo_list et al (we assume no other LOs exist yet) +\lo_list +\lo_list+ +\lo_unlink 42 +\dl + -- Load a file CREATE TABLE lotest_stash_values (loid oid, fd integer); -- lo_creat(mode integer) returns oid @@ -12,28 +29,13 @@ CREATE TABLE lotest_stash_values (loid oid, fd integer); -- returns the large object id INSERT INTO lotest_stash_values (loid) SELECT lo_creat(42); --- Test ALTER LARGE OBJECT -CREATE ROLE regress_lo_user; -DO $$ - BEGIN - EXECUTE 'ALTER LARGE OBJECT ' || (select loid from lotest_stash_values) - || ' OWNER TO regress_lo_user'; - END -$$; -SELECT - rol.rolname -FROM - lotest_stash_values s - JOIN pg_largeobject_metadata lo ON s.loid = lo.oid - JOIN pg_authid rol ON lo.lomowner = rol.oid; - -- NOTE: large objects require transactions BEGIN; -- lo_open(lobjId oid, mode integer) returns integer -- The mode parameter to lo_open uses two constants: --- INV_READ = 0x20000 --- INV_WRITE = 0x40000 +-- INV_WRITE = 0x20000 +-- INV_READ = 0x40000 -- The return value is a file descriptor-like value which remains valid for the -- transaction. UPDATE lotest_stash_values SET fd = lo_open(loid, CAST(x'20000' | x'40000' AS integer)); @@ -124,16 +126,13 @@ BEGIN; SELECT lo_open(loid, x'40000'::int) from lotest_stash_values; ABORT; -DO $$ -DECLARE - loid oid; -BEGIN - SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; - PERFORM lo_export(loid, '@abs_builddir@/results/invalid/path'); -EXCEPTION - WHEN UNDEFINED_FILE THEN RAISE NOTICE 'could not open file, as expected'; -END; -$$; +\set filename :abs_builddir '/results/invalid/path' +\set dobody 'DECLARE loid oid; BEGIN ' +\set dobody :dobody 'SELECT tbl.loid INTO loid FROM lotest_stash_values tbl; ' +\set dobody :dobody 'PERFORM lo_export(loid, ' :'filename' '); ' +\set dobody :dobody 'EXCEPTION WHEN UNDEFINED_FILE THEN ' +\set dobody :dobody 'RAISE NOTICE ''could not open file, as expected''; END' +DO :'dobody'; -- Test truncation. BEGIN; @@ -183,7 +182,8 @@ SELECT lo_unlink(loid) from lotest_stash_values; TRUNCATE lotest_stash_values; -INSERT INTO lotest_stash_values (loid) SELECT lo_import('@abs_srcdir@/data/tenk.data'); +\set filename :abs_srcdir '/data/tenk.data' +INSERT INTO lotest_stash_values (loid) SELECT lo_import(:'filename'); BEGIN; UPDATE lotest_stash_values SET fd=lo_open(loid, CAST(x'20000' | x'40000' AS integer)); @@ -212,14 +212,16 @@ SELECT loread(fd, 36) FROM lotest_stash_values; SELECT lo_close(fd) FROM lotest_stash_values; END; -SELECT lo_export(loid, '@abs_builddir@/results/lotest.txt') FROM lotest_stash_values; +\set filename :abs_builddir '/results/lotest.txt' +SELECT lo_export(loid, :'filename') FROM lotest_stash_values; -\lo_import '@abs_builddir@/results/lotest.txt' +\lo_import :filename \set newloid :LASTOID -- just make sure \lo_export does not barf -\lo_export :newloid '@abs_builddir@/results/lotest2.txt' +\set filename :abs_builddir '/results/lotest2.txt' +\lo_export :newloid :filename -- This is a hack to test that export/import are reversible -- This uses knowledge about the inner workings of large object mechanism @@ -234,7 +236,8 @@ TRUNCATE lotest_stash_values; \lo_unlink :newloid -\lo_import '@abs_builddir@/results/lotest.txt' +\set filename :abs_builddir '/results/lotest.txt' +\lo_import :filename \set newloid_1 :LASTOID diff --git a/third_party/spanner_pg/src/test/regress/sql/lock.sql b/third_party/spanner_pg/src/test/regress/sql/lock.sql index 05bdb8ad..b88488c6 100644 --- a/third_party/spanner_pg/src/test/regress/sql/lock.sql +++ b/third_party/spanner_pg/src/test/regress/sql/lock.sql @@ -2,6 +2,12 @@ -- Test the LOCK statement -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + -- Setup CREATE SCHEMA lock_schema1; SET search_path = lock_schema1; @@ -116,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; @@ -136,4 +191,10 @@ DROP ROLE regress_rol_lock1; -- atomic ops tests RESET search_path; + +CREATE FUNCTION test_atomic_ops() + RETURNS bool + AS :'regresslib' + LANGUAGE C; + SELECT test_atomic_ops(); diff --git a/third_party/spanner_pg/src/test/regress/sql/matview.sql b/third_party/spanner_pg/src/test/regress/sql/matview.sql index 68b9ccfd..543e0a6d 100644 --- a/third_party/spanner_pg/src/test/regress/sql/matview.sql +++ b/third_party/spanner_pg/src/test/regress/sql/matview.sql @@ -231,6 +231,23 @@ REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; DROP OWNED BY regress_user_mvtest CASCADE; DROP ROLE regress_user_mvtest; +-- Concurrent refresh requires a unique index on the materialized +-- view. Test what happens if it's dropped during the refresh. +CREATE OR REPLACE FUNCTION mvtest_drop_the_index() + RETURNS bool AS $$ +BEGIN + EXECUTE 'DROP INDEX IF EXISTS mvtest_drop_idx'; + RETURN true; +END; +$$ LANGUAGE plpgsql; + +CREATE MATERIALIZED VIEW drop_idx_matview AS + SELECT 1 as i WHERE mvtest_drop_the_index(); + +CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i); +REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview; +DROP MATERIALIZED VIEW drop_idx_matview; -- clean up + -- make sure that create WITH NO DATA works via SPI BEGIN; CREATE FUNCTION mvtest_func() diff --git a/third_party/spanner_pg/src/test/regress/sql/memoize.sql b/third_party/spanner_pg/src/test/regress/sql/memoize.sql index 10df997d..d66acaed 100644 --- a/third_party/spanner_pg/src/test/regress/sql/memoize.sql +++ b/third_party/spanner_pg/src/test/regress/sql/memoize.sql @@ -57,8 +57,9 @@ LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1 OFFSET 0) 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 @@ -147,6 +148,7 @@ WHERE unique1 < 3 RESET enable_seqscan; RESET enable_mergejoin; RESET work_mem; +RESET hash_mem_multiplier; RESET enable_bitmapscan; RESET enable_hashjoin; diff --git a/third_party/spanner_pg/src/test/regress/sql/merge.sql b/third_party/spanner_pg/src/test/regress/sql/merge.sql new file mode 100644 index 00000000..66cb75a7 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/sql/merge.sql @@ -0,0 +1,1473 @@ +-- +-- MERGE +-- + +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) + WITH (autovacuum_enabled=off); +CREATE TABLE source (sid integer, delta integer) -- no index + WITH (autovacuum_enabled=off); +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 regress_merge_privs; +ALTER TABLE source OWNER TO regress_merge_privs; + +CREATE TABLE target2 (tid integer, balance integer) + WITH (autovacuum_enabled=off); +CREATE TABLE source2 (sid integer, delta integer) + WITH (autovacuum_enabled=off); + +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 +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; +-- used in a CTE +WITH foo AS ( + MERGE INTO target USING source ON (true) + WHEN MATCHED THEN DELETE +) SELECT * FROM foo; +-- used in COPY +COPY ( + MERGE INTO target USING source ON (true) + WHEN MATCHED THEN DELETE +) TO stdout; + +-- 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 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; + +GRANT UPDATE ON target2 TO regress_merge_privs; +SET SESSION AUTHORIZATION regress_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 THEN + UPDATE SET balance = t.balance - s.delta; +ROLLBACK; + +-- conditional WHEN clause +CREATE TABLE wq_target (tid integer not null, balance integer DEFAULT -1) + WITH (autovacuum_enabled=off); +CREATE TABLE wq_source (balance integer, sid integer) + WITH (autovacuum_enabled=off); + +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 source-side whole-row references +BEGIN; +MERGE INTO wq_target t +USING wq_source s ON (t.tid = s.sid) +WHEN matched and t = s or t.tid = s.sid THEN + UPDATE SET balance = t.balance + s.balance; +SELECT * FROM wq_target; +ROLLBACK; + +-- 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; + +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(); +DO $$ +DECLARE + result integer; +BEGIN +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); +IF FOUND THEN + RAISE NOTICE 'Found'; +ELSE + RAISE NOTICE 'Not found'; +END IF; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +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) + WITH (autovacuum_enabled=off); +CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0) + WITH (autovacuum_enabled=off); + +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) + WITH (autovacuum_enabled=off); +CREATE TABLE ex_msource (a int, b int) + WITH (autovacuum_enabled=off); +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( Usage)?|Buckets|Batches): \S*', '\1: xxx', 'g'); + 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)'); + +-- 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); + +-- 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) + WITH (autovacuum_enabled=off); +CREATE TABLE part2 PARTITION OF pa_target FOR VALUES IN (2,5,6) + WITH (autovacuum_enabled=off); +CREATE TABLE part3 PARTITION OF pa_target FOR VALUES IN (3,8,9) + WITH (autovacuum_enabled=off); +CREATE TABLE part4 PARTITION OF pa_target DEFAULT + WITH (autovacuum_enabled=off); + +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; +CREATE FUNCTION merge_func() RETURNS integer LANGUAGE plpgsql AS $$ +DECLARE + result integer; +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'); +IF FOUND THEN + GET DIAGNOSTICS result := ROW_COUNT; +END IF; +RETURN result; +END; +$$; +SELECT merge_func(); +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) + WITH (autovacuum_enabled=off); +CREATE TABLE part2 (balance float, tid integer, val text) + WITH (autovacuum_enabled=off); +CREATE TABLE part3 (tid integer, balance float, val text) + WITH (autovacuum_enabled=off); +CREATE TABLE part4 (extraid text, tid integer, balance float, val text) + WITH (autovacuum_enabled=off); +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; +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +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; +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- as above, but blocked by BEFORE DELETE ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER del_trig BEFORE DELETE ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- as above, but blocked by BEFORE INSERT ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER ins_trig BEFORE INSERT ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +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'); +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid; +ROLLBACK; + +-- test RLS enforcement +BEGIN; +ALTER TABLE pa_target ENABLE ROW LEVEL SECURITY; +ALTER TABLE pa_target FORCE ROW LEVEL SECURITY; +CREATE POLICY pa_target_pol ON pa_target USING (tid != 0); +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND t.tid IN (1,2,3,4) + WHEN MATCHED THEN + UPDATE SET tid = tid - 1; +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) WITH (autovacuum_enabled=off); +CREATE TABLE part_m01_even PARTITION OF part_m01 + FOR VALUES IN (2,4,6,8) WITH (autovacuum_enabled=off); +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) WITH (autovacuum_enabled=off); +CREATE TABLE part_m02_even PARTITION OF part_m02 + FOR VALUES IN (2,4,6,8) WITH (autovacuum_enabled=off); + +CREATE TABLE pa_source (sid integer, delta float) + WITH (autovacuum_enabled=off); +-- 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; + +-- Partitioned table with primary key + +CREATE TABLE pa_target (tid integer PRIMARY KEY) PARTITION BY LIST (tid); +CREATE TABLE pa_targetp PARTITION OF pa_target DEFAULT; +CREATE TABLE pa_source (sid integer); + +INSERT INTO pa_source VALUES (1), (2); + +EXPLAIN (VERBOSE, COSTS OFF) +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + +TABLE pa_target; + +-- Partition-less partitioned table +-- (the bug we are checking for appeared only if table had partitions before) + +DROP TABLE pa_targetp; + +EXPLAIN (VERBOSE, COSTS OFF) +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + +MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid + WHEN NOT MATCHED THEN INSERT VALUES (s.sid); + +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) + WITH (autovacuum_enabled=off); +CREATE TABLE cj_source1 (sid1 integer, scat integer, delta integer) + WITH (autovacuum_enabled=off); +CREATE TABLE cj_source2 (sid2 integer, sval text) + WITH (autovacuum_enabled=off); +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; + +-- try it with an outer join and PlaceHolderVar +MERGE INTO cj_target t +USING (SELECT *, 'join input'::text AS phv FROM cj_source1) fj + FULL JOIN cj_source2 fj2 ON fj.scat = fj2.sid2 * 10 +ON t.tid = fj.scat +WHEN NOT MATCHED THEN + INSERT (tid, balance, val) VALUES (fj.scat, fj.delta, fj.phv); + +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) + WITH (autovacuum_enabled=off); +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 +) WITH (autovacuum_enabled=off); +CREATE TABLE measurement_y2006m02 ( + CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) +) INHERITS (measurement) WITH (autovacuum_enabled=off); +CREATE TABLE measurement_y2006m03 ( + CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) +) INHERITS (measurement) WITH (autovacuum_enabled=off); +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') +) WITH (autovacuum_enabled=off); +ALTER TABLE measurement_y2007m01 DROP COLUMN filler; +ALTER TABLE measurement_y2007m01 INHERIT measurement; +INSERT INTO measurement VALUES (0, '2005-07-21', 5, 15); + +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) WITH (autovacuum_enabled=off); +INSERT INTO new_measurement VALUES (0, '2005-07-21', 25, 20); +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); + +BEGIN; +MERGE INTO ONLY 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, peaktemp; +ROLLBACK; + +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; + +BEGIN; +MERGE INTO new_measurement nm + USING ONLY measurement m ON + (nm.city_id = m.city_id and nm.logdate=m.logdate) +WHEN MATCHED THEN DELETE; + +SELECT * FROM new_measurement ORDER BY city_id, logdate; +ROLLBACK; + +MERGE INTO new_measurement nm + USING measurement m ON + (nm.city_id = m.city_id and nm.logdate=m.logdate) +WHEN MATCHED THEN DELETE; + +SELECT * FROM new_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 regress_merge_privs; +DROP USER regress_merge_no_privs; diff --git a/third_party/spanner_pg/src/test/regress/sql/misc.sql b/third_party/spanner_pg/src/test/regress/sql/misc.sql new file mode 100644 index 00000000..165a2e17 --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/sql/misc.sql @@ -0,0 +1,275 @@ +-- +-- MISC +-- + +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION overpaid(emp) + RETURNS bool + AS :'regresslib' + LANGUAGE C STRICT; + +CREATE FUNCTION reverse_name(name) + RETURNS name + AS :'regresslib' + LANGUAGE C STRICT; + +-- +-- BTREE +-- +UPDATE onek + SET unique1 = onek.unique1 + 1; + +UPDATE onek + SET unique1 = onek.unique1 - 1; + +-- +-- BTREE partial +-- +-- UPDATE onek2 +-- SET unique1 = onek2.unique1 + 1; + +--UPDATE onek2 +-- SET unique1 = onek2.unique1 - 1; + +-- +-- BTREE shutting out non-functional updates +-- +-- the following two tests seem to take a long time on some +-- systems. This non-func update stuff needs to be examined +-- more closely. - jolly (2/22/96) +-- +SELECT two, stringu1, ten, string4 + INTO TABLE tmp + FROM onek; + +UPDATE tmp + SET stringu1 = reverse_name(onek.stringu1) + FROM onek + WHERE onek.stringu1 = 'JBAAAA' and + onek.stringu1 = tmp.stringu1; + +UPDATE tmp + SET stringu1 = reverse_name(onek2.stringu1) + FROM onek2 + WHERE onek2.stringu1 = 'JCAAAA' and + onek2.stringu1 = tmp.stringu1; + +DROP TABLE tmp; + +--UPDATE person* +-- SET age = age + 1; + +--UPDATE person* +-- SET age = age + 3 +-- WHERE name = 'linda'; + +-- +-- copy +-- +\set filename :abs_builddir '/results/onek.data' +COPY onek TO :'filename'; + +CREATE TEMP TABLE onek_copy (LIKE onek); + +COPY onek_copy FROM :'filename'; + +SELECT * FROM onek EXCEPT ALL SELECT * FROM onek_copy; + +SELECT * FROM onek_copy EXCEPT ALL SELECT * FROM onek; + +\set filename :abs_builddir '/results/stud_emp.data' +COPY BINARY stud_emp TO :'filename'; + +CREATE TEMP TABLE stud_emp_copy (LIKE stud_emp); + +COPY BINARY stud_emp_copy FROM :'filename'; + +SELECT * FROM stud_emp_copy; + +-- +-- test data for postquel functions +-- + +CREATE TABLE hobbies_r ( + name text, + person text +); + +CREATE TABLE equipment_r ( + name text, + hobby text +); + +INSERT INTO hobbies_r (name, person) + SELECT 'posthacking', p.name + FROM person* p + WHERE p.name = 'mike' or p.name = 'jeff'; + +INSERT INTO hobbies_r (name, person) + SELECT 'basketball', p.name + FROM person p + WHERE p.name = 'joe' or p.name = 'sally'; + +INSERT INTO hobbies_r (name) VALUES ('skywalking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('advil', 'posthacking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('peet''s coffee', 'posthacking'); + +INSERT INTO equipment_r (name, hobby) VALUES ('hightops', 'basketball'); + +INSERT INTO equipment_r (name, hobby) VALUES ('guts', 'skywalking'); + +-- +-- postquel functions +-- + +CREATE FUNCTION hobbies(person) + RETURNS setof hobbies_r + AS 'select * from hobbies_r where person = $1.name' + LANGUAGE SQL; + +CREATE FUNCTION hobby_construct(text, text) + RETURNS hobbies_r + AS 'select $1 as name, $2 as hobby' + LANGUAGE SQL; + +CREATE FUNCTION hobby_construct_named(name text, hobby text) + RETURNS hobbies_r + AS 'select name, hobby' + LANGUAGE SQL; + +CREATE FUNCTION hobbies_by_name(hobbies_r.name%TYPE) + RETURNS hobbies_r.person%TYPE + AS 'select person from hobbies_r where name = $1' + LANGUAGE SQL; + +CREATE FUNCTION equipment(hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = $1.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1a(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_1a.hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1b(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_1c(hobby hobbies_r) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = hobby.name' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_2a(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where hobby = equipment_named_ambiguous_2a.hobby' + LANGUAGE SQL; + +CREATE FUNCTION equipment_named_ambiguous_2b(hobby text) + RETURNS setof equipment_r + AS 'select * from equipment_r where equipment_r.hobby = hobby' + LANGUAGE SQL; + +-- +-- mike does post_hacking, +-- joe and sally play basketball, and +-- everyone else does nothing. +-- +SELECT p.name, name(p.hobbies) FROM ONLY person p; + +-- +-- as above, but jeff also does post_hacking. +-- +SELECT p.name, name(p.hobbies) FROM person* p; + +-- +-- the next two queries demonstrate how functions generate bogus duplicates. +-- this is a "feature" .. +-- +SELECT DISTINCT hobbies_r.name, name(hobbies_r.equipment) FROM hobbies_r + ORDER BY 1,2; + +SELECT hobbies_r.name, (hobbies_r.equipment).name FROM hobbies_r; + +-- +-- mike needs advil and peet's coffee, +-- joe and sally need hightops, and +-- everyone else is fine. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p; + +-- +-- as above, but jeff needs advil and peet's coffee as well. +-- +SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p; + +-- +-- just like the last two, but make sure that the target list fixup and +-- unflattening is being done correctly. +-- +SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p; + +SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p; + +SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p; + +SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p; + +SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer'))); + +SELECT name(equipment(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1a(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1b(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_1c(hobby_construct_named(text 'skywalking', text 'mer'))); + +SELECT name(equipment_named_ambiguous_2a(text 'skywalking')); + +SELECT name(equipment_named_ambiguous_2b(text 'skywalking')); + +SELECT hobbies_by_name('basketball'); + +SELECT name, overpaid(emp.*) FROM emp; + +-- +-- Try a few cases with SQL-spec row constructor expressions +-- +SELECT * FROM equipment(ROW('skywalking', 'mer')); + +SELECT name(equipment(ROW('skywalking', 'mer'))); + +SELECT *, name(equipment(h.*)) FROM hobbies_r h; + +SELECT *, (equipment(CAST((h.*) AS hobbies_r))).name FROM hobbies_r h; + +-- +-- functional joins +-- + +-- +-- instance rules +-- + +-- +-- rewrite rules +-- diff --git a/third_party/spanner_pg/src/test/regress/sql/misc_functions.sql b/third_party/spanner_pg/src/test/regress/sql/misc_functions.sql index a398349a..072fc36a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/misc_functions.sql +++ b/third_party/spanner_pg/src/test/regress/sql/misc_functions.sql @@ -1,3 +1,9 @@ +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + -- -- num_nulls() -- @@ -30,14 +36,71 @@ SELECT num_nulls(VARIADIC '{}'::int[]); SELECT num_nonnulls(); SELECT num_nulls(); +-- +-- canonicalize_path() +-- + +CREATE FUNCTION test_canonicalize_path(text) + RETURNS text + AS :'regresslib' + LANGUAGE C STRICT IMMUTABLE; + +SELECT test_canonicalize_path('/'); +SELECT test_canonicalize_path('/./abc/def/'); +SELECT test_canonicalize_path('/./../abc/def'); +SELECT test_canonicalize_path('/./../../abc/def/'); +SELECT test_canonicalize_path('/abc/.././def/ghi'); +SELECT test_canonicalize_path('/abc/./../def/ghi//'); +SELECT test_canonicalize_path('/abc/def/../..'); +SELECT test_canonicalize_path('/abc/def/../../..'); +SELECT test_canonicalize_path('/abc/def/../../../../ghi/jkl'); +SELECT test_canonicalize_path('.'); +SELECT test_canonicalize_path('./'); +SELECT test_canonicalize_path('./abc/..'); +SELECT test_canonicalize_path('abc/../'); +SELECT test_canonicalize_path('abc/../def'); +SELECT test_canonicalize_path('..'); +SELECT test_canonicalize_path('../abc/def'); +SELECT test_canonicalize_path('../abc/..'); +SELECT test_canonicalize_path('../abc/../def'); +SELECT test_canonicalize_path('../abc/../../def/ghi'); +SELECT test_canonicalize_path('./abc/./def/.'); +SELECT test_canonicalize_path('./abc/././def/.'); +SELECT test_canonicalize_path('./abc/./def/.././ghi/../../../jkl/mno'); + -- -- pg_log_backend_memory_contexts() -- -- Memory contexts are logged and they are not returned to the function. -- Furthermore, their contents can vary depending on the timing. However, --- we can at least verify that the code doesn't fail. +-- we can at least verify that the code doesn't fail, and that the +-- permissions are set properly. -- -SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid()); + +SELECT pg_log_backend_memory_contexts(pg_backend_pid()); + +SELECT pg_log_backend_memory_contexts(pid) FROM pg_stat_activity + WHERE backend_type = 'checkpointer'; + +CREATE ROLE regress_log_memory; + +SELECT has_function_privilege('regress_log_memory', + 'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- no + +GRANT EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) + TO regress_log_memory; + +SELECT has_function_privilege('regress_log_memory', + 'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- yes + +SET ROLE regress_log_memory; +SELECT pg_log_backend_memory_contexts(pg_backend_pid()); +RESET ROLE; + +REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) + FROM regress_log_memory; + +DROP ROLE regress_log_memory; -- -- Test some built-in SRFs @@ -61,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; @@ -69,6 +140,27 @@ select count(*) > 0 from where spcname = 'pg_default') pts join pg_database db on pts.pts = db.oid; +-- +-- Test replication slot directory functions +-- +CREATE ROLE regress_slot_dir_funcs; +-- Not available by default. +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalsnapdir()', 'EXECUTE'); +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalmapdir()', 'EXECUTE'); +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_replslotdir(text)', 'EXECUTE'); +GRANT pg_monitor TO regress_slot_dir_funcs; +-- Role is now part of pg_monitor, so these are available. +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalsnapdir()', 'EXECUTE'); +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_logicalmapdir()', 'EXECUTE'); +SELECT has_function_privilege('regress_slot_dir_funcs', + 'pg_ls_replslotdir(text)', 'EXECUTE'); +DROP ROLE regress_slot_dir_funcs; + -- -- Test adding a support function to a subject function -- @@ -83,6 +175,11 @@ SELECT * FROM tenk1 a JOIN tenk1 b ON a.unique1 = b.unique1 WHERE my_int_eq(a.unique2, 42); -- With support function that knows it's int4eq, we get a different plan +CREATE FUNCTION test_support_func(internal) + RETURNS internal + AS :'regresslib', 'test_support_func' + LANGUAGE C STRICT; + ALTER FUNCTION my_int_eq(int, int) SUPPORT test_support_func; EXPLAIN (COSTS OFF) diff --git a/third_party/spanner_pg/src/test/regress/sql/misc_sanity.sql b/third_party/spanner_pg/src/test/regress/sql/misc_sanity.sql index 9699f5cc..2c0f87a6 100644 --- a/third_party/spanner_pg/src/test/regress/sql/misc_sanity.sql +++ b/third_party/spanner_pg/src/test/regress/sql/misc_sanity.sql @@ -14,70 +14,24 @@ -- **************** pg_depend **************** -- Look for illegal values in pg_depend fields. --- classid/objid can be zero, but only in 'p' entries SELECT * FROM pg_depend as d1 WHERE refclassid = 0 OR refobjid = 0 OR - deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR - (deptype != 'p' AND (classid = 0 OR objid = 0)) OR - (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); + classid = 0 OR objid = 0 OR + deptype NOT IN ('a', 'e', 'i', 'n', 'x', 'P', 'S'); + -- **************** pg_shdepend **************** -- Look for illegal values in pg_shdepend fields. --- classid/objid can be zero, but only in 'p' entries SELECT * FROM pg_shdepend as d1 WHERE refclassid = 0 OR refobjid = 0 OR - deptype NOT IN ('a', 'o', 'p', 'r') OR - (deptype != 'p' AND (classid = 0 OR objid = 0)) OR - (deptype = 'p' AND (dbid != 0 OR classid != 0 OR objid != 0 OR objsubid != 0)); - - --- Check each OID-containing system catalog to see if its lowest-numbered OID --- is pinned. If not, and if that OID was generated during initdb, then --- perhaps initdb forgot to scan that catalog for pinnable entries. --- Generally, it's okay for a catalog to be listed in the output of this --- test if that catalog is scanned by initdb.c's setup_depend() function; --- whatever OID the test is complaining about must have been added later --- in initdb, where it intentionally isn't pinned. Legitimate exceptions --- to that rule are listed in the comments in setup_depend(). --- Currently, pg_rewrite is also listed by this check, even though it is --- covered by setup_depend(). That happens because there are no rules in --- the pinned data, but initdb creates some intentionally-not-pinned views. - -do $$ -declare relnm text; - reloid oid; - shared bool; - lowoid oid; - pinned bool; -begin -for relnm, reloid, shared in - select relname, oid, relisshared from pg_class - where EXISTS( - SELECT * FROM pg_attribute - WHERE attrelid = pg_class.oid AND attname = 'oid') - and relkind = 'r' and oid < 16384 order by 1 -loop - execute 'select min(oid) from ' || relnm into lowoid; - continue when lowoid is null or lowoid >= 16384; - if shared then - pinned := exists(select 1 from pg_shdepend - where refclassid = reloid and refobjid = lowoid - and deptype = 'p'); - else - pinned := exists(select 1 from pg_depend - where refclassid = reloid and refobjid = lowoid - and deptype = 'p'); - end if; - if not pinned then - raise notice '% contains unpinned initdb-created object(s)', relnm; - end if; -end loop; -end$$; + classid = 0 OR objid = 0 OR + deptype NOT IN ('a', 'o', 'r', 't'); + -- **************** pg_class **************** diff --git a/third_party/spanner_pg/src/test/regress/sql/multirangetypes.sql b/third_party/spanner_pg/src/test/regress/sql/multirangetypes.sql index df1edb4d..1abcaedd 100644 --- a/third_party/spanner_pg/src/test/regress/sql/multirangetypes.sql +++ b/third_party/spanner_pg/src/test/regress/sql/multirangetypes.sql @@ -572,10 +572,31 @@ 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 +-- 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); diff --git a/third_party/spanner_pg/src/test/regress/sql/numeric.sql b/third_party/spanner_pg/src/test/regress/sql/numeric.sql index 56294da5..c54ea52a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/numeric.sql +++ b/third_party/spanner_pg/src/test/regress/sql/numeric.sql @@ -1054,6 +1054,40 @@ INSERT INTO num_input_test(n1) VALUES ('+ infinity'); SELECT * FROM num_input_test; +-- +-- Test precision and scale typemods +-- + +CREATE TABLE num_typemod_test ( + millions numeric(3, -6), + thousands numeric(3, -3), + units numeric(3, 0), + thousandths numeric(3, 3), + millionths numeric(3, 6) +); +\d num_typemod_test + +-- rounding of valid inputs +INSERT INTO num_typemod_test VALUES (123456, 123, 0.123, 0.000123, 0.000000123); +INSERT INTO num_typemod_test VALUES (654321, 654, 0.654, 0.000654, 0.000000654); +INSERT INTO num_typemod_test VALUES (2345678, 2345, 2.345, 0.002345, 0.000002345); +INSERT INTO num_typemod_test VALUES (7654321, 7654, 7.654, 0.007654, 0.000007654); +INSERT INTO num_typemod_test VALUES (12345678, 12345, 12.345, 0.012345, 0.000012345); +INSERT INTO num_typemod_test VALUES (87654321, 87654, 87.654, 0.087654, 0.000087654); +INSERT INTO num_typemod_test VALUES (123456789, 123456, 123.456, 0.123456, 0.000123456); +INSERT INTO num_typemod_test VALUES (987654321, 987654, 987.654, 0.987654, 0.000987654); +INSERT INTO num_typemod_test VALUES ('NaN', 'NaN', 'NaN', 'NaN', 'NaN'); + +SELECT scale(millions), * FROM num_typemod_test ORDER BY millions; + +-- invalid inputs +INSERT INTO num_typemod_test (millions) VALUES ('inf'); +INSERT INTO num_typemod_test (millions) VALUES (999500000); +INSERT INTO num_typemod_test (thousands) VALUES (999500); +INSERT INTO num_typemod_test (units) VALUES (999.5); +INSERT INTO num_typemod_test (thousandths) VALUES (0.9995); +INSERT INTO num_typemod_test (millionths) VALUES (0.0009995); + -- -- Test some corner cases for multiplication -- @@ -1313,6 +1347,42 @@ select trim_scale(1e100); SELECT SUM(9999::numeric) FROM generate_series(1, 100000); SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000); +-- +-- Tests for VARIANCE() +-- +CREATE TABLE num_variance (a numeric); +INSERT INTO num_variance VALUES (0); +INSERT INTO num_variance VALUES (3e-500); +INSERT INTO num_variance VALUES (-3e-500); +INSERT INTO num_variance VALUES (4e-500 - 1e-16383); +INSERT INTO num_variance VALUES (-4e-500 + 1e-16383); + +-- variance is just under 12.5e-1000 and so should round down to 12e-1000 +SELECT trim_scale(variance(a) * 1e1000) FROM num_variance; + +-- check that parallel execution produces the same result +BEGIN; +ALTER TABLE num_variance SET (parallel_workers = 4); +SET LOCAL parallel_setup_cost = 0; +SET LOCAL max_parallel_workers_per_gather = 4; +SELECT trim_scale(variance(a) * 1e1000) FROM num_variance; +ROLLBACK; + +-- case where sum of squares would overflow but variance does not +DELETE FROM num_variance; +INSERT INTO num_variance SELECT 9e131071 + x FROM generate_series(1, 5) x; +SELECT variance(a) FROM num_variance; + +-- check that parallel execution produces the same result +BEGIN; +ALTER TABLE num_variance SET (parallel_workers = 4); +SET LOCAL parallel_setup_cost = 0; +SET LOCAL max_parallel_workers_per_gather = 4; +SELECT variance(a) FROM num_variance; +ROLLBACK; + +DROP TABLE num_variance; + -- -- Tests for GCD() -- diff --git a/third_party/spanner_pg/src/test/regress/sql/numerology.sql b/third_party/spanner_pg/src/test/regress/sql/numerology.sql index fddb58f8..be7d6dfe 100644 --- a/third_party/spanner_pg/src/test/regress/sql/numerology.sql +++ b/third_party/spanner_pg/src/test/regress/sql/numerology.sql @@ -3,6 +3,21 @@ -- Test various combinations of numeric types and functions. -- +-- +-- Trailing junk in numeric literals +-- + +SELECT 123abc; +SELECT 0x0o; +SELECT 1_2_3; +SELECT 0.a; +SELECT 0.0a; +SELECT .0a; +SELECT 0.0e1a; +SELECT 0.0e; +SELECT 0.0e+a; +PREPARE p1 AS SELECT $1a; + -- -- Test implicit type conversions -- This fails for Postgres v6.1 (and earlier?) diff --git a/third_party/spanner_pg/src/test/regress/sql/object_address.sql b/third_party/spanner_pg/src/test/regress/sql/object_address.sql index 2f4f66e3..e91072a7 100644 --- a/third_party/spanner_pg/src/test/regress/sql/object_address.sql +++ b/third_party/spanner_pg/src/test/regress/sql/object_address.sql @@ -48,6 +48,7 @@ CREATE TRANSFORM FOR int LANGUAGE SQL ( -- suppress warning that depends on wal_level SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; +CREATE PUBLICATION addr_pub_schema FOR TABLES 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; @@ -97,7 +98,7 @@ BEGIN ('text search template'), ('text search configuration'), ('policy'), ('user mapping'), ('default acl'), ('transform'), ('operator of access method'), ('function of access method'), - ('publication relation') + ('publication namespace'), ('publication relation') LOOP FOR names IN VALUES ('{eins}'), ('{addr_nsp, zwei}'), ('{eins, zwei, drei}') LOOP @@ -197,6 +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}'), ('publication relation', '{addr_nsp, gentable}', '{addr_pub}'), ('subscription', '{regress_addr_sub}', '{}'), ('statistics object', '{addr_nsp, gentable_stat}', '{}') @@ -215,6 +217,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 SUBSCRIPTION regress_addr_sub; DROP SCHEMA addr_nsp CASCADE; @@ -256,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/third_party/spanner_pg/src/test/regress/sql/opr_sanity.sql b/third_party/spanner_pg/src/test/regress/sql/opr_sanity.sql index 5a9c4796..0f039f2c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/opr_sanity.sql +++ b/third_party/spanner_pg/src/test/regress/sql/opr_sanity.sql @@ -489,9 +489,9 @@ WHERE c.castmethod = 'b' AND -- Look for illegal values in pg_conversion fields. -SELECT p1.oid, p1.conname -FROM pg_conversion as p1 -WHERE p1.conproc = 0 OR +SELECT c.oid, c.conname +FROM pg_conversion as c +WHERE c.conproc = 0 OR pg_encoding_to_char(conforencoding) = '' OR pg_encoding_to_char(contoencoding) = ''; @@ -519,8 +519,8 @@ WHERE p.oid = c.conproc AND -- conversions anyway. -- (Similarly, this doesn't cope with any search path issues.) -SELECT p1.oid, p1.conname -FROM pg_conversion as p1 +SELECT c.oid, c.conname +FROM pg_conversion as c WHERE condefault AND convert('ABC'::bytea, pg_encoding_to_char(conforencoding), pg_encoding_to_char(contoencoding)) != 'ABC'; @@ -530,42 +530,42 @@ WHERE condefault AND -- Look for illegal values in pg_operator fields. -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 -WHERE (p1.oprkind != 'b' AND p1.oprkind != 'l') OR - p1.oprresult = 0 OR p1.oprcode = 0; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 +WHERE (o1.oprkind != 'b' AND o1.oprkind != 'l') OR + o1.oprresult = 0 OR o1.oprcode = 0; -- Look for missing or unwanted operand types -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 -WHERE (p1.oprleft = 0 and p1.oprkind != 'l') OR - (p1.oprleft != 0 and p1.oprkind = 'l') OR - p1.oprright = 0; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 +WHERE (o1.oprleft = 0 and o1.oprkind != 'l') OR + (o1.oprleft != 0 and o1.oprkind = 'l') OR + o1.oprright = 0; -- Look for conflicting operator definitions (same names and input datatypes). -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oid != p2.oid AND - p1.oprname = p2.oprname AND - p1.oprkind = p2.oprkind AND - p1.oprleft = p2.oprleft AND - p1.oprright = p2.oprright; +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oid != o2.oid AND + o1.oprname = o2.oprname AND + o1.oprkind = o2.oprkind AND + o1.oprleft = o2.oprleft AND + o1.oprright = o2.oprright; -- Look for commutative operators that don't commute. -- DEFINITIONAL NOTE: If A.oprcom = B, then x A y has the same result as y B x. -- We expect that B will always say that B.oprcom = A as well; that's not -- inherently essential, but it would be inefficient not to mark it so. -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprcom = p2.oid AND - (p1.oprkind != 'b' OR - p1.oprleft != p2.oprright OR - p1.oprright != p2.oprleft OR - p1.oprresult != p2.oprresult OR - p1.oid != p2.oprcom); +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprcom = o2.oid AND + (o1.oprkind != 'b' OR + o1.oprleft != o2.oprright OR + o1.oprright != o2.oprleft OR + o1.oprresult != o2.oprresult OR + o1.oid != o2.oprcom); -- Look for negatory operators that don't agree. -- DEFINITIONAL NOTE: If A.oprnegate = B, then both A and B must yield @@ -575,16 +575,16 @@ WHERE p1.oprcom = p2.oid AND -- inherently essential, but it would be inefficient not to mark it so. -- Also, A and B had better not be the same operator. -SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprnegate = p2.oid AND - (p1.oprkind != p2.oprkind OR - p1.oprleft != p2.oprleft OR - p1.oprright != p2.oprright OR - p1.oprresult != 'bool'::regtype OR - p2.oprresult != 'bool'::regtype OR - p1.oid != p2.oprnegate OR - p1.oid = p2.oid); +SELECT o1.oid, o1.oprcode, o2.oid, o2.oprcode +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprnegate = o2.oid AND + (o1.oprkind != o2.oprkind OR + o1.oprleft != o2.oprleft OR + o1.oprright != o2.oprright OR + o1.oprresult != 'bool'::regtype OR + o2.oprresult != 'bool'::regtype OR + o1.oid != o2.oprnegate OR + o1.oid = o2.oid); -- Make a list of the names of operators that are claimed to be commutator -- pairs. This list will grow over time, but before accepting a new entry @@ -606,93 +606,93 @@ ORDER BY 1, 2; -- boolean, and must have a commutator (itself, unless it's a cross-type -- operator). -SELECT p1.oid, p1.oprname FROM pg_operator AS p1 -WHERE (p1.oprcanmerge OR p1.oprcanhash) AND NOT - (p1.oprkind = 'b' AND p1.oprresult = 'bool'::regtype AND p1.oprcom != 0); +SELECT o1.oid, o1.oprname FROM pg_operator AS o1 +WHERE (o1.oprcanmerge OR o1.oprcanhash) AND NOT + (o1.oprkind = 'b' AND o1.oprresult = 'bool'::regtype AND o1.oprcom != 0); -- What's more, the commutator had better be mergejoinable/hashjoinable too. -SELECT p1.oid, p1.oprname, p2.oid, p2.oprname -FROM pg_operator AS p1, pg_operator AS p2 -WHERE p1.oprcom = p2.oid AND - (p1.oprcanmerge != p2.oprcanmerge OR - p1.oprcanhash != p2.oprcanhash); +SELECT o1.oid, o1.oprname, o2.oid, o2.oprname +FROM pg_operator AS o1, pg_operator AS o2 +WHERE o1.oprcom = o2.oid AND + (o1.oprcanmerge != o2.oprcanmerge OR + o1.oprcanhash != o2.oprcanhash); -- Mergejoinable operators should appear as equality members of btree index -- opfamilies. -SELECT p1.oid, p1.oprname -FROM pg_operator AS p1 -WHERE p1.oprcanmerge AND NOT EXISTS +SELECT o1.oid, o1.oprname +FROM pg_operator AS o1 +WHERE o1.oprcanmerge AND NOT EXISTS (SELECT 1 FROM pg_amop WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND - amopopr = p1.oid AND amopstrategy = 3); + amopopr = o1.oid AND amopstrategy = 3); -- And the converse. -SELECT p1.oid, p1.oprname, p.amopfamily -FROM pg_operator AS p1, pg_amop p -WHERE amopopr = p1.oid +SELECT o1.oid, o1.oprname, p.amopfamily +FROM pg_operator AS o1, pg_amop p +WHERE amopopr = o1.oid AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'btree') AND amopstrategy = 3 - AND NOT p1.oprcanmerge; + AND NOT o1.oprcanmerge; -- Hashable operators should appear as members of hash index opfamilies. -SELECT p1.oid, p1.oprname -FROM pg_operator AS p1 -WHERE p1.oprcanhash AND NOT EXISTS +SELECT o1.oid, o1.oprname +FROM pg_operator AS o1 +WHERE o1.oprcanhash AND NOT EXISTS (SELECT 1 FROM pg_amop WHERE amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') AND - amopopr = p1.oid AND amopstrategy = 1); + amopopr = o1.oid AND amopstrategy = 1); -- And the converse. -SELECT p1.oid, p1.oprname, p.amopfamily -FROM pg_operator AS p1, pg_amop p -WHERE amopopr = p1.oid +SELECT o1.oid, o1.oprname, p.amopfamily +FROM pg_operator AS o1, pg_amop p +WHERE amopopr = o1.oid AND amopmethod = (SELECT oid FROM pg_am WHERE amname = 'hash') - AND NOT p1.oprcanhash; + AND NOT o1.oprcanhash; -- Check that each operator defined in pg_operator matches its oprcode entry -- in pg_proc. Easiest to do this separately for each oprkind. -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - p1.oprkind = 'b' AND - (p2.pronargs != 2 - OR NOT binary_coercible(p2.prorettype, p1.oprresult) - OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0]) - OR NOT binary_coercible(p1.oprright, p2.proargtypes[1])); - -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - p1.oprkind = 'l' AND - (p2.pronargs != 1 - OR NOT binary_coercible(p2.prorettype, p1.oprresult) - OR NOT binary_coercible(p1.oprright, p2.proargtypes[0]) - OR p1.oprleft != 0); +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + o1.oprkind = 'b' AND + (p1.pronargs != 2 + OR NOT binary_coercible(p1.prorettype, o1.oprresult) + OR NOT binary_coercible(o1.oprleft, p1.proargtypes[0]) + OR NOT binary_coercible(o1.oprright, p1.proargtypes[1])); + +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + o1.oprkind = 'l' AND + (p1.pronargs != 1 + OR NOT binary_coercible(p1.prorettype, o1.oprresult) + OR NOT binary_coercible(o1.oprright, p1.proargtypes[0]) + OR o1.oprleft != 0); -- If the operator is mergejoinable or hashjoinable, its underlying function -- should not be volatile. -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprcode = p2.oid AND - (p1.oprcanmerge OR p1.oprcanhash) AND - p2.provolatile = 'v'; +SELECT o1.oid, o1.oprname, p1.oid, p1.proname +FROM pg_operator AS o1, pg_proc AS p1 +WHERE o1.oprcode = p1.oid AND + (o1.oprcanmerge OR o1.oprcanhash) AND + p1.provolatile = 'v'; -- If oprrest is set, the operator must return boolean, -- and it must link to a proc with the right signature -- to be a restriction selectivity estimator. -- The proc signature we want is: float8 proc(internal, oid, internal, int4) -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprrest = p2.oid AND - (p1.oprresult != 'bool'::regtype OR +SELECT o1.oid, o1.oprname, p2.oid, p2.proname +FROM pg_operator AS o1, pg_proc AS p2 +WHERE o1.oprrest = p2.oid AND + (o1.oprresult != 'bool'::regtype OR p2.prorettype != 'float8'::regtype OR p2.proretset OR p2.pronargs != 4 OR p2.proargtypes[0] != 'internal'::regtype OR @@ -707,10 +707,10 @@ WHERE p1.oprrest = p2.oid AND -- (Note: the old signature with only 4 args is still allowed, but no core -- estimator should be using it.) -SELECT p1.oid, p1.oprname, p2.oid, p2.proname -FROM pg_operator AS p1, pg_proc AS p2 -WHERE p1.oprjoin = p2.oid AND - (p1.oprkind != 'b' OR p1.oprresult != 'bool'::regtype OR +SELECT o1.oid, o1.oprname, p2.oid, p2.proname +FROM pg_operator AS o1, pg_proc AS p2 +WHERE o1.oprjoin = p2.oid AND + (o1.oprkind != 'b' OR o1.oprresult != 'bool'::regtype OR p2.prorettype != 'float8'::regtype OR p2.proretset OR p2.pronargs != 5 OR p2.proargtypes[0] != 'internal'::regtype OR @@ -720,10 +720,10 @@ WHERE p1.oprjoin = p2.oid AND p2.proargtypes[4] != 'internal'::regtype); -- Insist that all built-in pg_operator entries have descriptions -SELECT p1.oid, p1.oprname -FROM pg_operator as p1 LEFT JOIN pg_description as d - ON p1.tableoid = d.classoid and p1.oid = d.objoid and d.objsubid = 0 -WHERE d.classoid IS NULL AND p1.oid <= 9999; +SELECT o1.oid, o1.oprname +FROM pg_operator as o1 LEFT JOIN pg_description as d + ON o1.tableoid = d.classoid and o1.oid = d.objoid and d.objsubid = 0 +WHERE d.classoid IS NULL AND o1.oid <= 9999; -- Check that operators' underlying functions have suitable comments, -- namely 'implementation of XXX operator'. (Note: it's not necessary to @@ -807,7 +807,7 @@ ORDER BY 1; -- Look for illegal values in pg_aggregate fields. SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggfnoid = 0 OR aggtransfn = 0 OR aggkind NOT IN ('n', 'o', 'h') OR aggnumdirectargs < 0 OR @@ -893,12 +893,12 @@ WHERE a.aggfnoid = p.oid AND -- Check for inconsistent specifications of moving-aggregate columns. SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggmtranstype != 0 AND (aggmtransfn = 0 OR aggminvtransfn = 0); SELECT ctid, aggfnoid::oid -FROM pg_aggregate as p1 +FROM pg_aggregate as a WHERE aggmtranstype = 0 AND (aggmtransfn != 0 OR aggminvtransfn != 0 OR aggmfinalfn != 0 OR aggmtransspace != 0 OR aggminitval IS NOT NULL); @@ -1130,9 +1130,9 @@ WHERE prokind = 'a' AND provariadic != 0 AND a.aggkind = 'n'; -- Look for illegal values in pg_opfamily fields -SELECT p1.oid -FROM pg_opfamily as p1 -WHERE p1.opfmethod = 0 OR p1.opfnamespace = 0; +SELECT f.oid +FROM pg_opfamily as f +WHERE f.opfmethod = 0 OR f.opfnamespace = 0; -- Look for opfamilies having no opclasses. While most validation of -- opfamilies is now handled by AM-specific amvalidate functions, that's @@ -1147,25 +1147,25 @@ WHERE NOT EXISTS (SELECT 1 FROM pg_opclass WHERE opcfamily = f.oid); -- Look for illegal values in pg_opclass fields -SELECT p1.oid -FROM pg_opclass AS p1 -WHERE p1.opcmethod = 0 OR p1.opcnamespace = 0 OR p1.opcfamily = 0 - OR p1.opcintype = 0; +SELECT c1.oid +FROM pg_opclass AS c1 +WHERE c1.opcmethod = 0 OR c1.opcnamespace = 0 OR c1.opcfamily = 0 + OR c1.opcintype = 0; -- opcmethod must match owning opfamily's opfmethod -SELECT p1.oid, p2.oid -FROM pg_opclass AS p1, pg_opfamily AS p2 -WHERE p1.opcfamily = p2.oid AND p1.opcmethod != p2.opfmethod; +SELECT c1.oid, f1.oid +FROM pg_opclass AS c1, pg_opfamily AS f1 +WHERE c1.opcfamily = f1.oid AND c1.opcmethod != f1.opfmethod; -- There should not be multiple entries in pg_opclass with opcdefault true -- and the same opcmethod/opcintype combination. -SELECT p1.oid, p2.oid -FROM pg_opclass AS p1, pg_opclass AS p2 -WHERE p1.oid != p2.oid AND - p1.opcmethod = p2.opcmethod AND p1.opcintype = p2.opcintype AND - p1.opcdefault AND p2.opcdefault; +SELECT c1.oid, c2.oid +FROM pg_opclass AS c1, pg_opclass AS c2 +WHERE c1.oid != c2.oid AND + c1.opcmethod = c2.opcmethod AND c1.opcintype = c2.opcintype AND + c1.opcdefault AND c2.opcdefault; -- Ask access methods to validate opclasses -- (this replaces a lot of SQL-level checks that used to be done in this file) @@ -1177,49 +1177,49 @@ SELECT oid, opcname FROM pg_opclass WHERE NOT amvalidate(oid); -- Look for illegal values in pg_am fields -SELECT p1.oid, p1.amname -FROM pg_am AS p1 -WHERE p1.amhandler = 0; +SELECT a1.oid, a1.amname +FROM pg_am AS a1 +WHERE a1.amhandler = 0; -- Check for index amhandler functions with the wrong signature -SELECT p1.oid, p1.amname, p2.oid, p2.proname -FROM pg_am AS p1, pg_proc AS p2 -WHERE p2.oid = p1.amhandler AND p1.amtype = 'i' AND - (p2.prorettype != 'index_am_handler'::regtype - OR p2.proretset - OR p2.pronargs != 1 - OR p2.proargtypes[0] != 'internal'::regtype); +SELECT a1.oid, a1.amname, p1.oid, p1.proname +FROM pg_am AS a1, pg_proc AS p1 +WHERE p1.oid = a1.amhandler AND a1.amtype = 'i' AND + (p1.prorettype != 'index_am_handler'::regtype + OR p1.proretset + OR p1.pronargs != 1 + OR p1.proargtypes[0] != 'internal'::regtype); -- Check for table amhandler functions with the wrong signature -SELECT p1.oid, p1.amname, p2.oid, p2.proname -FROM pg_am AS p1, pg_proc AS p2 -WHERE p2.oid = p1.amhandler AND p1.amtype = 's' AND - (p2.prorettype != 'table_am_handler'::regtype - OR p2.proretset - OR p2.pronargs != 1 - OR p2.proargtypes[0] != 'internal'::regtype); +SELECT a1.oid, a1.amname, p1.oid, p1.proname +FROM pg_am AS a1, pg_proc AS p1 +WHERE p1.oid = a1.amhandler AND a1.amtype = 't' AND + (p1.prorettype != 'table_am_handler'::regtype + OR p1.proretset + OR p1.pronargs != 1 + OR p1.proargtypes[0] != 'internal'::regtype); -- **************** pg_amop **************** -- Look for illegal values in pg_amop fields -SELECT p1.amopfamily, p1.amopstrategy -FROM pg_amop as p1 -WHERE p1.amopfamily = 0 OR p1.amoplefttype = 0 OR p1.amoprighttype = 0 - OR p1.amopopr = 0 OR p1.amopmethod = 0 OR p1.amopstrategy < 1; +SELECT a1.amopfamily, a1.amopstrategy +FROM pg_amop as a1 +WHERE a1.amopfamily = 0 OR a1.amoplefttype = 0 OR a1.amoprighttype = 0 + OR a1.amopopr = 0 OR a1.amopmethod = 0 OR a1.amopstrategy < 1; -SELECT p1.amopfamily, p1.amopstrategy -FROM pg_amop as p1 -WHERE NOT ((p1.amoppurpose = 's' AND p1.amopsortfamily = 0) OR - (p1.amoppurpose = 'o' AND p1.amopsortfamily <> 0)); +SELECT a1.amopfamily, a1.amopstrategy +FROM pg_amop as a1 +WHERE NOT ((a1.amoppurpose = 's' AND a1.amopsortfamily = 0) OR + (a1.amoppurpose = 'o' AND a1.amopsortfamily <> 0)); -- amopmethod must match owning opfamily's opfmethod -SELECT p1.oid, p2.oid -FROM pg_amop AS p1, pg_opfamily AS p2 -WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; +SELECT a1.oid, f1.oid +FROM pg_amop AS a1, pg_opfamily AS f1 +WHERE a1.amopfamily = f1.oid AND a1.amopmethod != f1.opfmethod; -- Make a list of all the distinct operator names being used in particular -- strategy slots. This is a bit hokey, since the list might need to change @@ -1227,26 +1227,26 @@ WHERE p1.amopfamily = p2.oid AND p1.amopmethod != p2.opfmethod; -- swapping two operators within a family. SELECT DISTINCT amopmethod, amopstrategy, oprname -FROM pg_amop p1 LEFT JOIN pg_operator p2 ON amopopr = p2.oid +FROM pg_amop a1 LEFT JOIN pg_operator o1 ON amopopr = o1.oid ORDER BY 1, 2, 3; -- Check that all opclass search operators have selectivity estimators. -- This is not absolutely required, but it seems a reasonable thing -- to insist on for all standard datatypes. -SELECT p1.amopfamily, p1.amopopr, p2.oid, p2.oprname -FROM pg_amop AS p1, pg_operator AS p2 -WHERE p1.amopopr = p2.oid AND p1.amoppurpose = 's' AND - (p2.oprrest = 0 OR p2.oprjoin = 0); +SELECT a1.amopfamily, a1.amopopr, o1.oid, o1.oprname +FROM pg_amop AS a1, pg_operator AS o1 +WHERE a1.amopopr = o1.oid AND a1.amoppurpose = 's' AND + (o1.oprrest = 0 OR o1.oprjoin = 0); -- Check that each opclass in an opfamily has associated operators, that is -- ones whose oprleft matches opcintype (possibly by coercion). -SELECT p1.opcname, p1.opcfamily -FROM pg_opclass AS p1 -WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 - WHERE p2.amopfamily = p1.opcfamily - AND binary_coercible(p1.opcintype, p2.amoplefttype)); +SELECT c1.opcname, c1.opcfamily +FROM pg_opclass AS c1 +WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS a1 + WHERE a1.amopfamily = c1.opcfamily + AND binary_coercible(c1.opcintype, a1.amoplefttype)); -- Check that each operator listed in pg_amop has an associated opclass, -- that is one whose opcintype matches oprleft (possibly by coercion). @@ -1255,55 +1255,55 @@ WHERE NOT EXISTS(SELECT 1 FROM pg_amop AS p2 -- btree opfamilies, but in practice you'd expect there to be an opclass for -- every datatype the family knows about.) -SELECT p1.amopfamily, p1.amopstrategy, p1.amopopr -FROM pg_amop AS p1 -WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS p2 - WHERE p2.opcfamily = p1.amopfamily - AND binary_coercible(p2.opcintype, p1.amoplefttype)); +SELECT a1.amopfamily, a1.amopstrategy, a1.amopopr +FROM pg_amop AS a1 +WHERE NOT EXISTS(SELECT 1 FROM pg_opclass AS c1 + WHERE c1.opcfamily = a1.amopfamily + AND binary_coercible(c1.opcintype, a1.amoplefttype)); -- Operators that are primary members of opclasses must be immutable (else -- it suggests that the index ordering isn't fixed). Operators that are -- cross-type members need only be stable, since they are just shorthands -- for index probe queries. -SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc -FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 -WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND - p1.amoplefttype = p1.amoprighttype AND - p3.provolatile != 'i'; +SELECT a1.amopfamily, a1.amopopr, o1.oprname, p1.prosrc +FROM pg_amop AS a1, pg_operator AS o1, pg_proc AS p1 +WHERE a1.amopopr = o1.oid AND o1.oprcode = p1.oid AND + a1.amoplefttype = a1.amoprighttype AND + p1.provolatile != 'i'; -SELECT p1.amopfamily, p1.amopopr, p2.oprname, p3.prosrc -FROM pg_amop AS p1, pg_operator AS p2, pg_proc AS p3 -WHERE p1.amopopr = p2.oid AND p2.oprcode = p3.oid AND - p1.amoplefttype != p1.amoprighttype AND - p3.provolatile = 'v'; +SELECT a1.amopfamily, a1.amopopr, o1.oprname, p1.prosrc +FROM pg_amop AS a1, pg_operator AS o1, pg_proc AS p1 +WHERE a1.amopopr = o1.oid AND o1.oprcode = p1.oid AND + a1.amoplefttype != a1.amoprighttype AND + p1.provolatile = 'v'; -- **************** pg_amproc **************** -- Look for illegal values in pg_amproc fields -SELECT p1.amprocfamily, p1.amprocnum -FROM pg_amproc as p1 -WHERE p1.amprocfamily = 0 OR p1.amproclefttype = 0 OR p1.amprocrighttype = 0 - OR p1.amprocnum < 0 OR p1.amproc = 0; +SELECT a1.amprocfamily, a1.amprocnum +FROM pg_amproc as a1 +WHERE a1.amprocfamily = 0 OR a1.amproclefttype = 0 OR a1.amprocrighttype = 0 + OR a1.amprocnum < 0 OR a1.amproc = 0; -- Support routines that are primary members of opfamilies must be immutable -- (else it suggests that the index ordering isn't fixed). But cross-type -- members need only be stable, since they are just shorthands -- for index probe queries. -SELECT p1.amprocfamily, p1.amproc, p2.prosrc -FROM pg_amproc AS p1, pg_proc AS p2 -WHERE p1.amproc = p2.oid AND - p1.amproclefttype = p1.amprocrighttype AND - p2.provolatile != 'i'; +SELECT a1.amprocfamily, a1.amproc, p1.prosrc +FROM pg_amproc AS a1, pg_proc AS p1 +WHERE a1.amproc = p1.oid AND + a1.amproclefttype = a1.amprocrighttype AND + p1.provolatile != 'i'; -SELECT p1.amprocfamily, p1.amproc, p2.prosrc -FROM pg_amproc AS p1, pg_proc AS p2 -WHERE p1.amproc = p2.oid AND - p1.amproclefttype != p1.amprocrighttype AND - p2.provolatile = 'v'; +SELECT a1.amprocfamily, a1.amproc, p1.prosrc +FROM pg_amproc AS a1, pg_proc AS p1 +WHERE a1.amproc = p1.oid AND + a1.amproclefttype != a1.amprocrighttype AND + p1.provolatile = 'v'; -- Almost all of the core distribution's Btree opclasses can use one of the -- two generic "equalimage" functions as their support function 4. Look for @@ -1328,15 +1328,15 @@ ORDER BY 1, 2, 3; -- Look for illegal values in pg_index fields. -SELECT p1.indexrelid, p1.indrelid -FROM pg_index as p1 -WHERE p1.indexrelid = 0 OR p1.indrelid = 0 OR - p1.indnatts <= 0 OR p1.indnatts > 32; +SELECT indexrelid, indrelid +FROM pg_index +WHERE indexrelid = 0 OR indrelid = 0 OR + indnatts <= 0 OR indnatts > 32; -- oidvector and int2vector fields should be of length indnatts. -SELECT p1.indexrelid, p1.indrelid -FROM pg_index as p1 +SELECT indexrelid, indrelid +FROM pg_index WHERE array_lower(indkey, 1) != 0 OR array_upper(indkey, 1) != indnatts-1 OR array_lower(indclass, 1) != 0 OR array_upper(indclass, 1) != indnatts-1 OR array_lower(indcollation, 1) != 0 OR array_upper(indcollation, 1) != indnatts-1 OR diff --git a/third_party/spanner_pg/src/test/regress/sql/partition_aggregate.sql b/third_party/spanner_pg/src/test/regress/sql/partition_aggregate.sql index c17294b1..ab070fee 100644 --- a/third_party/spanner_pg/src/test/regress/sql/partition_aggregate.sql +++ b/third_party/spanner_pg/src/test/regress/sql/partition_aggregate.sql @@ -222,6 +222,7 @@ ANALYZE pagg_tab_ml; -- For Parallel Append SET max_parallel_workers_per_gather TO 2; +SET parallel_setup_cost = 0; -- 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 @@ -235,6 +236,8 @@ SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HA EXPLAIN (COSTS OFF) SELECT a, sum(b), array_agg(distinct c), count(*) FROM pagg_tab_ml GROUP BY a HAVING avg(b) < 3; +RESET parallel_setup_cost; + -- 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 -- PARTITION KEY, thus we will have a partial aggregation for them. diff --git a/third_party/spanner_pg/src/test/regress/sql/partition_join.sql b/third_party/spanner_pg/src/test/regress/sql/partition_join.sql index d97b5b69..04d7adb8 100644 --- a/third_party/spanner_pg/src/test/regress/sql/partition_join.sql +++ b/third_party/spanner_pg/src/test/regress/sql/partition_join.sql @@ -91,6 +91,33 @@ SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.a) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; +SET max_parallel_workers_per_gather = 0; +-- If there are lateral references to the other relation in sample scan, +-- we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN LATERAL + (SELECT * FROM prt1 t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a; + +-- If there are lateral references to the other relation in scan's restriction +-- clauses, we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; +RESET max_parallel_workers_per_gather; + -- bug with inadequate sort key representation SET enable_partitionwise_aggregate TO true; SET enable_hashjoin TO false; @@ -378,6 +405,27 @@ SELECT * FROM prt1_l t1 LEFT JOIN LATERAL (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; +SET max_parallel_workers_per_gather = 0; +-- If there are lateral references to the other relation in sample scan, +-- we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 JOIN LATERAL + (SELECT * FROM prt1_l t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a AND t1.b = s.b AND t1.c = s.c; + +-- If there are lateral references to the other relation in scan's restriction +-- clauses, we cannot generate a partitionwise join. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; +RESET max_parallel_workers_per_gather; + -- join with one side empty EXPLAIN (COSTS OFF) SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; @@ -1142,3 +1190,28 @@ SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.c = t2 EXPLAIN (COSTS OFF) SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; SELECT t1.*, t2.* FROM alpha t1 INNER JOIN beta t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE ((t1.b >= 100 AND t1.b < 110) OR (t1.b >= 200 AND t1.b < 210)) AND ((t2.b >= 100 AND t2.b < 110) OR (t2.b >= 200 AND t2.b < 210)) AND t1.c IN ('0004', '0009') ORDER BY t1.a, t1.b; + +-- partitionwise join with fractional paths +CREATE TABLE fract_t (id BIGINT, PRIMARY KEY (id)) PARTITION BY RANGE (id); +CREATE TABLE fract_t0 PARTITION OF fract_t FOR VALUES FROM ('0') TO ('1000'); +CREATE TABLE fract_t1 PARTITION OF fract_t FOR VALUES FROM ('1000') TO ('2000'); + +-- insert data +INSERT INTO fract_t (id) (SELECT generate_series(0, 1999)); +ANALYZE fract_t; + +-- verify plan; nested index only scans +SET max_parallel_workers_per_gather = 0; +SET enable_partitionwise_join = on; + +EXPLAIN (COSTS OFF) +SELECT * FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY id ASC LIMIT 10; + +EXPLAIN (COSTS OFF) +SELECT * FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY id DESC LIMIT 10; + +-- cleanup +DROP TABLE fract_t; + +RESET max_parallel_workers_per_gather; +RESET enable_partitionwise_join; diff --git a/third_party/spanner_pg/src/test/regress/sql/plpgsql.sql b/third_party/spanner_pg/src/test/regress/sql/plpgsql.sql index 7e52d474..588c3310 100644 --- a/third_party/spanner_pg/src/test/regress/sql/plpgsql.sql +++ b/third_party/spanner_pg/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 -- @@ -3795,22 +3819,42 @@ end; $outer$; -- Check variable scoping -- a var is not available in its own or prior --- default expressions. +-- default expressions, but it is available in later ones. + +do $$ +declare x int := x + 1; -- error +begin + raise notice 'x = %', x; +end; +$$; + +do $$ +declare y int := x + 1; -- error + x int := 42; +begin + raise notice 'x = %, y = %', x, y; +end; +$$; -create function scope_test() returns int as $$ +do $$ +declare x int := 42; + y int := x + 1; +begin + raise notice 'x = %, y = %', x, y; +end; +$$; + +do $$ declare x int := 42; begin declare y int := x + 1; x int := x + 2; + z int := x * 10; begin - return x * 100 + y; + raise notice 'x = %, y = %, z = %', x, y, z; end; end; -$$ language plpgsql; - -select scope_test(); - -drop function scope_test(); +$$; -- Check handling of conflicts between plpgsql vars and table columns. diff --git a/third_party/spanner_pg/src/test/regress/sql/point.sql b/third_party/spanner_pg/src/test/regress/sql/point.sql index f8537919..435ff4b9 100644 --- a/third_party/spanner_pg/src/test/regress/sql/point.sql +++ b/third_party/spanner_pg/src/test/regress/sql/point.sql @@ -5,31 +5,11 @@ -- avoid bit-exact output here because operations may not be bit-exact. SET extra_float_digits = 0; -CREATE TABLE POINT_TBL(f1 point); +-- point_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. -INSERT INTO POINT_TBL(f1) VALUES ('(0.0,0.0)'); - -INSERT INTO POINT_TBL(f1) VALUES ('(-10.0,0.0)'); - -INSERT INTO POINT_TBL(f1) VALUES ('(-3.0,4.0)'); - -INSERT INTO POINT_TBL(f1) VALUES ('(5.1, 34.5)'); - -INSERT INTO POINT_TBL(f1) VALUES ('(-5.0,-12.0)'); - -INSERT INTO POINT_TBL(f1) VALUES ('(1e-300,-1e-300)'); -- To underflow - -INSERT INTO POINT_TBL(f1) VALUES ('(1e+300,Inf)'); -- To overflow - -INSERT INTO POINT_TBL(f1) VALUES ('(Inf,1e+300)'); -- Transposed - -INSERT INTO POINT_TBL(f1) VALUES (' ( Nan , NaN ) '); - --- bad format points INSERT INTO POINT_TBL(f1) VALUES ('asdfasdf'); -INSERT INTO POINT_TBL(f1) VALUES ('10.0,10.0'); - INSERT INTO POINT_TBL(f1) VALUES ('(10.0 10.0)'); INSERT INTO POINT_TBL(f1) VALUES ('(10.0, 10.0) x'); diff --git a/third_party/spanner_pg/src/test/regress/sql/portals.sql b/third_party/spanner_pg/src/test/regress/sql/portals.sql index 5d1ef52a..fc4cccb9 100644 --- a/third_party/spanner_pg/src/test/regress/sql/portals.sql +++ b/third_party/spanner_pg/src/test/regress/sql/portals.sql @@ -190,6 +190,18 @@ FETCH BACKWARD 1 FROM foo24; -- should fail END; +BEGIN; + +DECLARE foo24 NO SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY unique2; + +FETCH 1 FROM foo24; + +FETCH ABSOLUTE 2 FROM foo24; -- allowed + +FETCH ABSOLUTE 1 FROM foo24; -- should fail + +END; + -- -- Cursors outside transaction blocks -- @@ -569,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; diff --git a/third_party/spanner_pg/src/test/regress/sql/privileges.sql b/third_party/spanner_pg/src/test/regress/sql/privileges.sql index f96143e0..55b5df58 100644 --- a/third_party/spanner_pg/src/test/regress/sql/privileges.sql +++ b/third_party/spanner_pg/src/test/regress/sql/privileges.sql @@ -32,10 +32,39 @@ CREATE USER regress_priv_user5; CREATE USER regress_priv_user5; -- duplicate CREATE USER regress_priv_user6; CREATE USER regress_priv_user7; +CREATE USER regress_priv_user8; +CREATE USER regress_priv_user9; +CREATE USER regress_priv_user10; CREATE ROLE regress_priv_role; GRANT pg_read_all_data TO regress_priv_user6; GRANT pg_write_all_data TO regress_priv_user7; +GRANT pg_read_all_settings TO regress_priv_user8 WITH ADMIN OPTION; + +SET SESSION AUTHORIZATION regress_priv_user8; +GRANT pg_read_all_settings TO regress_priv_user9 WITH ADMIN OPTION; + +SET SESSION AUTHORIZATION regress_priv_user9; +GRANT pg_read_all_settings TO regress_priv_user10; + +SET SESSION AUTHORIZATION regress_priv_user8; +REVOKE pg_read_all_settings FROM regress_priv_user10; +REVOKE ADMIN OPTION FOR pg_read_all_settings FROM regress_priv_user9; +REVOKE pg_read_all_settings FROM regress_priv_user9; + +RESET SESSION AUTHORIZATION; +REVOKE ADMIN OPTION FOR pg_read_all_settings FROM regress_priv_user8; + +SET SESSION AUTHORIZATION regress_priv_user8; +SET ROLE pg_read_all_settings; +RESET ROLE; + +RESET SESSION AUTHORIZATION; +REVOKE pg_read_all_settings FROM regress_priv_user8; + +DROP USER regress_priv_user10; +DROP USER regress_priv_user9; +DROP USER regress_priv_user8; CREATE GROUP regress_priv_group1; CREATE GROUP regress_priv_group2 WITH USER regress_priv_user1, regress_priv_user2; @@ -430,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)); @@ -1016,11 +1153,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(); @@ -1563,3 +1696,28 @@ REVOKE TRUNCATE ON lock_table FROM regress_locktable_user; -- clean up DROP TABLE lock_table; DROP USER regress_locktable_user; + +-- test to check privileges of system views pg_shmem_allocations and +-- pg_backend_memory_contexts. + +-- switch to superuser +\c - + +CREATE ROLE regress_readallstats; + +SELECT has_table_privilege('regress_readallstats','pg_backend_memory_contexts','SELECT'); -- no +SELECT has_table_privilege('regress_readallstats','pg_shmem_allocations','SELECT'); -- no + +GRANT pg_read_all_stats TO regress_readallstats; + +SELECT has_table_privilege('regress_readallstats','pg_backend_memory_contexts','SELECT'); -- yes +SELECT has_table_privilege('regress_readallstats','pg_shmem_allocations','SELECT'); -- yes + +-- run query to ensure that functions within views can be executed +SET ROLE regress_readallstats; +SELECT COUNT(*) >= 0 AS ok FROM pg_backend_memory_contexts; +SELECT COUNT(*) >= 0 AS ok FROM pg_shmem_allocations; +RESET ROLE; + +-- clean up +DROP ROLE regress_readallstats; diff --git a/third_party/spanner_pg/src/test/regress/sql/psql.sql b/third_party/spanner_pg/src/test/regress/sql/psql.sql index 26ffe064..94a54d6f 100644 --- a/third_party/spanner_pg/src/test/regress/sql/psql.sql +++ b/third_party/spanner_pg/src/test/regress/sql/psql.sql @@ -149,6 +149,18 @@ select 'drop table gexec_test', 'select ''2000-01-01''::date as party_over' \unset FETCH_COUNT +-- \setenv, \getenv + +-- ensure MYVAR isn't set +\setenv MYVAR +-- in which case, reading it doesn't change the target +\getenv res MYVAR +\echo :res +-- now set it +\setenv MYVAR 'environment value' +\getenv res MYVAR +\echo :res + -- show all pset options \pset @@ -1237,6 +1249,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* @@ -1258,6 +1276,210 @@ drop role regress_partitioning_role; \sf ts_debug(text) \sf+ ts_debug(text) +-- AUTOCOMMIT + +CREATE TABLE ac_test (a int); +\set AUTOCOMMIT off + +INSERT INTO ac_test VALUES (1); +COMMIT; +SELECT * FROM ac_test; +COMMIT; + +INSERT INTO ac_test VALUES (2); +ROLLBACK; +SELECT * FROM ac_test; +COMMIT; + +BEGIN; +INSERT INTO ac_test VALUES (3); +COMMIT; +SELECT * FROM ac_test; +COMMIT; + +BEGIN; +INSERT INTO ac_test VALUES (4); +ROLLBACK; +SELECT * FROM ac_test; +COMMIT; + +\set AUTOCOMMIT on +DROP TABLE ac_test; +SELECT * FROM ac_test; -- should be gone now + +-- ON_ERROR_ROLLBACK + +\set ON_ERROR_ROLLBACK on +CREATE TABLE oer_test (a int); + +BEGIN; +INSERT INTO oer_test VALUES (1); +INSERT INTO oer_test VALUES ('foo'); +INSERT INTO oer_test VALUES (3); +COMMIT; +SELECT * FROM oer_test; + +BEGIN; +INSERT INTO oer_test VALUES (4); +ROLLBACK; +SELECT * FROM oer_test; + +BEGIN; +INSERT INTO oer_test VALUES (5); +COMMIT AND CHAIN; +INSERT INTO oer_test VALUES (6); +COMMIT; +SELECT * FROM oer_test; + +DROP TABLE oer_test; +\set ON_ERROR_ROLLBACK off + +-- ECHO errors +\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 preceding 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; + -- check describing invalid multipart names \dA regression.heap \dA nonesuch.heap diff --git a/third_party/spanner_pg/src/test/regress/sql/publication.sql b/third_party/spanner_pg/src/test/regress/sql/publication.sql index 7d5c9373..d5051a5e 100644 --- a/third_party/spanner_pg/src/test/regress/sql/publication.sql +++ b/third_party/spanner_pg/src/test/regress/sql/publication.sql @@ -51,12 +51,59 @@ ALTER PUBLICATION testpub_foralltables DROP TABLE testpub_tbl2; -- fail - can't add to for all tables publication ALTER PUBLICATION testpub_foralltables SET TABLE pub_test.testpub_nopk; +-- fail - can't add schema to 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables ADD TABLES IN SCHEMA pub_test; +-- fail - can't drop schema from 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables DROP TABLES IN SCHEMA pub_test; +-- fail - can't set schema to 'FOR ALL TABLES' publication +ALTER PUBLICATION testpub_foralltables SET TABLES IN SCHEMA pub_test; + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1; +RESET client_min_messages; +-- should be able to add schema to 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable ADD TABLES IN SCHEMA pub_test; +\dRp+ testpub_fortable +-- should be able to drop schema from 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable DROP TABLES IN SCHEMA pub_test; +\dRp+ testpub_fortable +-- should be able to set schema to 'FOR TABLE' publication +ALTER PUBLICATION testpub_fortable SET TABLES IN SCHEMA pub_test; +\dRp+ testpub_fortable + +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA pub_test; +-- should be able to create publication with schema and table of the same +-- schema +CREATE PUBLICATION testpub_for_tbl_schema FOR TABLES IN SCHEMA pub_test, TABLE pub_test.testpub_nopk; +RESET client_min_messages; +\dRp+ testpub_for_tbl_schema + +-- weird parser corner case +CREATE PUBLICATION testpub_parsertst FOR TABLE pub_test.testpub_nopk, CURRENT_SCHEMA; +CREATE PUBLICATION testpub_parsertst FOR TABLES IN SCHEMA foo, test.foo; + +-- should be able to add a table of the same schema to the schema publication +ALTER PUBLICATION testpub_forschema ADD TABLE pub_test.testpub_nopk; +\dRp+ testpub_forschema + +-- should be able to drop the table +ALTER PUBLICATION testpub_forschema DROP TABLE pub_test.testpub_nopk; +\dRp+ testpub_forschema + +-- fail - can't drop a table from the schema publication which isn't in the +-- publication +ALTER PUBLICATION testpub_forschema DROP TABLE pub_test.testpub_nopk; +-- should be able to set table to schema publication +ALTER PUBLICATION testpub_forschema SET TABLE pub_test.testpub_nopk; +\dRp+ testpub_forschema + SELECT pubname, puballtables FROM pg_publication WHERE pubname = 'testpub_foralltables'; \d+ testpub_tbl2 \dRp+ testpub_foralltables DROP TABLE testpub_tbl2; -DROP PUBLICATION testpub_foralltables; +DROP PUBLICATION testpub_foralltables, testpub_fortable, testpub_forschema, testpub_for_tbl_schema; CREATE TABLE testpub_tbl3 (a int); CREATE TABLE testpub_tbl3a (b text) INHERITS (testpub_tbl3); @@ -99,13 +146,564 @@ UPDATE testpub_parted2 SET a = 2; ALTER PUBLICATION testpub_forparted DROP TABLE testpub_parted; -- works again, because update is no longer replicated UPDATE testpub_parted2 SET a = 2; --- publication includes both the parent table and the child table -ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted, testpub_parted2; --- only parent is listed as being in publication, not the partition -SELECT * FROM pg_publication_tables; 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 +\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'); +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 TABLES IN SCHEMA testpub_rf_schema1 WHERE (a = 123); +CREATE PUBLICATION testpub_syntax3 FOR 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 TABLES IN SCHEMA testpub_rf_schema2; +-- should be able to set publication with schema and table of the same schema +ALTER PUBLICATION testpub6 SET TABLES IN SCHEMA testpub_rf_schema2, TABLE testpub_rf_schema2.testpub_rf_tbl6 WHERE (i < 99); +RESET client_min_messages; +\dRp+ testpub6 + +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); +-- 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); +-- 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; +-- ====================================================== + +-- 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; + +-- test that using column list for table is disallowed if any schemas are +-- part of the publication +SET client_min_messages = 'ERROR'; +-- failure - cannot use column list and schema together +CREATE PUBLICATION testpub_tbl9 FOR TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +-- ok - only publish schema +CREATE PUBLICATION testpub_tbl9 FOR TABLES IN SCHEMA public; +-- failure - add a table with column list when there is already a schema in the +-- publication +ALTER PUBLICATION testpub_tbl9 ADD TABLE public.testpub_tbl7(a); +-- ok - only publish table with column list +ALTER PUBLICATION testpub_tbl9 SET TABLE public.testpub_tbl7(a); +-- failure - specify a schema when there is already a column list in the +-- publication +ALTER PUBLICATION testpub_tbl9 ADD TABLES IN SCHEMA public; +-- failure - cannot SET column list and schema together +ALTER PUBLICATION testpub_tbl9 SET TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +-- ok - drop table +ALTER PUBLICATION testpub_tbl9 DROP TABLE public.testpub_tbl7; +-- failure - cannot ADD column list and schema together +ALTER PUBLICATION testpub_tbl9 ADD TABLES IN SCHEMA public, TABLE public.testpub_tbl7(a); +RESET client_min_messages; + +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, testpub_tbl9; +-- ====================================================== + +-- 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); +-- 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); +-- 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); @@ -122,6 +720,20 @@ DROP TABLE testpub_tbl4; -- fail - view CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_view; + +CREATE TEMPORARY TABLE testpub_temptbl(a int); +-- fail - temporary table +CREATE PUBLICATION testpub_fortemptbl FOR TABLE testpub_temptbl; +DROP TABLE testpub_temptbl; + +CREATE UNLOGGED TABLE testpub_unloggedtbl(a int); +-- fail - unlogged table +CREATE PUBLICATION testpub_forunloggedtbl FOR TABLE testpub_unloggedtbl; +DROP TABLE testpub_unloggedtbl; + +-- fail - system table +CREATE PUBLICATION testpub_forsystemtbl FOR TABLE pg_publication; + SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1, pub_test.testpub_nopk; RESET client_min_messages; @@ -173,9 +785,12 @@ GRANT CREATE ON DATABASE regression TO regress_publication_user2; SET ROLE regress_publication_user2; SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub2; -- ok +CREATE PUBLICATION testpub3 FOR TABLES IN SCHEMA pub_test; -- fail +CREATE PUBLICATION testpub3; -- ok RESET client_min_messages; ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- fail +ALTER PUBLICATION testpub3 ADD TABLES IN SCHEMA pub_test; -- fail SET ROLE regress_publication_user; GRANT regress_publication_user TO regress_publication_user2; @@ -183,12 +798,27 @@ SET ROLE regress_publication_user2; ALTER PUBLICATION testpub2 ADD TABLE testpub_tbl1; -- ok DROP PUBLICATION testpub2; +DROP PUBLICATION testpub3; + +SET ROLE regress_publication_user; +CREATE ROLE regress_publication_user3; +GRANT regress_publication_user2 TO regress_publication_user3; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub4 FOR TABLES IN SCHEMA pub_test; +RESET client_min_messages; +ALTER PUBLICATION testpub4 OWNER TO regress_publication_user3; +SET ROLE regress_publication_user3; +-- fail - new owner must be superuser +ALTER PUBLICATION testpub4 owner to regress_publication_user2; -- fail +ALTER PUBLICATION testpub4 owner to regress_publication_user; -- ok SET ROLE regress_publication_user; +DROP PUBLICATION testpub4; +DROP ROLE regress_publication_user3; + REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; DROP TABLE testpub_parted; -DROP VIEW testpub_view; DROP TABLE testpub_tbl1; \dRp+ testpub_default @@ -209,11 +839,263 @@ ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; \dRp testpub_default +-- adding schemas and tables +CREATE SCHEMA pub_test1; +CREATE SCHEMA pub_test2; +CREATE SCHEMA pub_test3; +CREATE SCHEMA "CURRENT_SCHEMA"; +CREATE TABLE pub_test1.tbl (id int, data text); +CREATE TABLE pub_test1.tbl1 (id serial primary key, data text); +CREATE TABLE pub_test2.tbl1 (id serial primary key, data text); +CREATE TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"(id int); + +-- suppress warning that depends on wal_level +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub1_forschema FOR TABLES IN SCHEMA pub_test1; +\dRp+ testpub1_forschema + +CREATE PUBLICATION testpub2_forschema FOR TABLES IN SCHEMA pub_test1, pub_test2, pub_test3; +\dRp+ testpub2_forschema + +-- check create publication on CURRENT_SCHEMA +CREATE PUBLICATION testpub3_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA; +CREATE PUBLICATION testpub4_forschema FOR TABLES IN SCHEMA "CURRENT_SCHEMA"; +CREATE PUBLICATION testpub5_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA, "CURRENT_SCHEMA"; +CREATE PUBLICATION testpub6_forschema FOR TABLES IN SCHEMA "CURRENT_SCHEMA", CURRENT_SCHEMA; +CREATE PUBLICATION testpub_fortable FOR TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"; + +RESET client_min_messages; + +\dRp+ testpub3_forschema +\dRp+ testpub4_forschema +\dRp+ testpub5_forschema +\dRp+ testpub6_forschema +\dRp+ testpub_fortable + +-- check create publication on CURRENT_SCHEMA where search_path is not set +SET SEARCH_PATH=''; +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA CURRENT_SCHEMA; +RESET SEARCH_PATH; + +-- check create publication on CURRENT_SCHEMA where TABLE/TABLES in SCHEMA +-- is not specified +CREATE PUBLICATION testpub_forschema1 FOR CURRENT_SCHEMA; + +-- check create publication on CURRENT_SCHEMA along with FOR TABLE +CREATE PUBLICATION testpub_forschema1 FOR TABLE CURRENT_SCHEMA; + +-- check create publication on a schema that does not exist +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA non_existent_schema; + +-- check create publication on a system schema +CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA pg_catalog; + +-- check create publication on an object which is not schema +CREATE PUBLICATION testpub1_forschema1 FOR TABLES IN SCHEMA testpub_view; + +-- dropping the schema should reflect the change in publication +DROP SCHEMA pub_test3; +\dRp+ testpub2_forschema + +-- renaming the schema should reflect the change in publication +ALTER SCHEMA pub_test1 RENAME to pub_test1_renamed; +\dRp+ testpub2_forschema + +ALTER SCHEMA pub_test1_renamed RENAME to pub_test1; +\dRp+ testpub2_forschema + +-- alter publication add schema +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA pub_test2; +\dRp+ testpub1_forschema + +-- add non existent schema +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA non_existent_schema; +\dRp+ testpub1_forschema + +-- add a schema which is already added to the publication +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA pub_test1; +\dRp+ testpub1_forschema + +-- alter publication drop schema +ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test2; +\dRp+ testpub1_forschema + +-- drop schema that is not present in the publication +ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test2; +\dRp+ testpub1_forschema + +-- drop a schema that does not exist in the system +ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA non_existent_schema; +\dRp+ testpub1_forschema + +-- drop all schemas +ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test1; +\dRp+ testpub1_forschema + +-- alter publication set multiple schema +ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA pub_test1, pub_test2; +\dRp+ testpub1_forschema + +-- alter publication set non-existent schema +ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA non_existent_schema; +\dRp+ testpub1_forschema + +-- alter publication set it duplicate schemas should set the schemas after +-- removing the duplicate schemas +ALTER PUBLICATION testpub1_forschema SET 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 TABLES IN SCHEMA foo (a, b); +ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA foo, bar (a, b); + +-- cleanup pub_test1 schema for invalidation tests +ALTER PUBLICATION testpub2_forschema DROP TABLES IN SCHEMA pub_test1; +DROP PUBLICATION testpub3_forschema, testpub4_forschema, testpub5_forschema, testpub6_forschema, testpub_fortable; +DROP SCHEMA "CURRENT_SCHEMA" CASCADE; + +-- verify relation cache invalidations through update statement for the +-- default REPLICA IDENTITY on the relation, if schema is part of the +-- publication then update will fail because relation's relreplident +-- option will be set, if schema is not part of the publication then update +-- will be successful. +INSERT INTO pub_test1.tbl VALUES(1, 'test'); + +-- fail +UPDATE pub_test1.tbl SET id = 2; +ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test1; + +-- success +UPDATE pub_test1.tbl SET id = 2; +ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA pub_test1; + +-- fail +UPDATE pub_test1.tbl SET id = 2; + +-- verify invalidation of partition table having parent and child tables in +-- different schema +CREATE SCHEMA pub_testpart1; +CREATE SCHEMA pub_testpart2; + +CREATE TABLE pub_testpart1.parent1 (a int) partition by list (a); +CREATE TABLE pub_testpart2.child_parent1 partition of pub_testpart1.parent1 for values in (1); +INSERT INTO pub_testpart2.child_parent1 values(1); +UPDATE pub_testpart2.child_parent1 set a = 1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpubpart_forschema FOR TABLES IN SCHEMA pub_testpart1; +RESET client_min_messages; + +-- fail +UPDATE pub_testpart1.parent1 set a = 1; +UPDATE pub_testpart2.child_parent1 set a = 1; + +DROP PUBLICATION testpubpart_forschema; + +-- verify invalidation of partition tables for schema publication that has +-- parent and child tables of different partition hierarchies +CREATE TABLE pub_testpart2.parent2 (a int) partition by list (a); +CREATE TABLE pub_testpart1.child_parent2 partition of pub_testpart2.parent2 for values in (1); +INSERT INTO pub_testpart1.child_parent2 values(1); +UPDATE pub_testpart1.child_parent2 set a = 1; +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpubpart_forschema FOR TABLES IN SCHEMA pub_testpart2; +RESET client_min_messages; + +-- fail +UPDATE pub_testpart2.child_parent1 set a = 1; +UPDATE pub_testpart2.parent2 set a = 1; +UPDATE pub_testpart1.child_parent2 set a = 1; + +-- alter publication set 'TABLES IN SCHEMA' on an empty publication. +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub3_forschema; +RESET client_min_messages; +\dRp+ testpub3_forschema +ALTER PUBLICATION testpub3_forschema SET TABLES IN SCHEMA pub_test1; +\dRp+ testpub3_forschema + +-- create publication including both 'FOR TABLE' and 'FOR TABLES IN SCHEMA' +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION testpub_forschema_fortable FOR TABLES IN SCHEMA pub_test1, TABLE pub_test2.tbl1; +CREATE PUBLICATION testpub_fortable_forschema FOR TABLE pub_test2.tbl1, TABLES IN SCHEMA pub_test1; +RESET client_min_messages; + +\dRp+ testpub_forschema_fortable +\dRp+ testpub_fortable_forschema + +-- fail specifying table without any of 'FOR TABLES IN SCHEMA' or +--'FOR TABLE' or 'FOR ALL TABLES' +CREATE PUBLICATION testpub_error FOR pub_test2.tbl1; + +DROP VIEW testpub_view; + DROP PUBLICATION testpub_default; DROP PUBLICATION testpib_ins_trunct; DROP PUBLICATION testpub_fortbl; +DROP PUBLICATION testpub1_forschema; +DROP PUBLICATION testpub2_forschema; +DROP PUBLICATION testpub3_forschema; +DROP PUBLICATION testpub_forschema_fortable; +DROP PUBLICATION testpub_fortable_forschema; +DROP PUBLICATION testpubpart_forschema; DROP SCHEMA pub_test CASCADE; +DROP SCHEMA pub_test1 CASCADE; +DROP SCHEMA pub_test2 CASCADE; +DROP SCHEMA pub_testpart1 CASCADE; +DROP SCHEMA pub_testpart2 CASCADE; + +-- Test the list of partitions published with or without +-- 'PUBLISH_VIA_PARTITION_ROOT' parameter +SET client_min_messages = 'ERROR'; +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); +-- Schema publication that does not include the schema that has the parent table +CREATE PUBLICATION pub FOR TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +SELECT * FROM pg_publication_tables; + +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; + +-- Table publication that includes both the parent table and the child table +ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +SELECT * FROM pg_publication_tables; + +DROP PUBLICATION pub; +-- Schema publication that does not include the schema that has the parent table +CREATE PUBLICATION pub FOR TABLES IN SCHEMA sch2 WITH (PUBLISH_VIA_PARTITION_ROOT=0); +SELECT * FROM pg_publication_tables; + +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; + +-- Table publication that includes both the parent table and the child table +ALTER PUBLICATION pub ADD TABLE sch1.tbl1; +SELECT * FROM pg_publication_tables; + +DROP PUBLICATION pub; +DROP TABLE sch2.tbl1_part1; +DROP TABLE sch1.tbl1; + +CREATE TABLE sch1.tbl1 (a int) PARTITION BY RANGE(a); +CREATE TABLE sch1.tbl1_part1 PARTITION OF sch1.tbl1 FOR VALUES FROM (1) to (10); +CREATE TABLE sch1.tbl1_part2 PARTITION OF sch1.tbl1 FOR VALUES FROM (10) to (20); +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 TABLES IN SCHEMA sch1 WITH (PUBLISH_VIA_PARTITION_ROOT=1); +SELECT * FROM pg_publication_tables; + +RESET client_min_messages; +DROP PUBLICATION pub; +DROP TABLE sch1.tbl1; +DROP SCHEMA sch1 cascade; +DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; diff --git a/third_party/spanner_pg/src/test/regress/sql/rangefuncs.sql b/third_party/spanner_pg/src/test/regress/sql/rangefuncs.sql index 7e5cde14..63351e14 100644 --- a/third_party/spanner_pg/src/test/regress/sql/rangefuncs.sql +++ b/third_party/spanner_pg/src/test/regress/sql/rangefuncs.sql @@ -682,12 +682,45 @@ SELECT * FROM ROWS FROM(get_users(), generate_series(10,11)) WITH ORDINALITY; select * from usersview; alter table users add column junk text; select * from usersview; + +alter table users drop column moredrop; -- fail, view has reference + +-- We used to have a bug that would allow the above to succeed, posing +-- hazards for later execution of the view. Check that the internal +-- defenses for those hazards haven't bit-rotted, in case some other +-- bug with similar symptoms emerges. begin; + +-- destroy the dependency entry that prevents the DROP: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'usersview'::regclass and rulename = '_RETURN') + and refobjsubid = 5 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + alter table users drop column moredrop; select * from usersview; -- expect clean failure rollback; + +alter table users alter column seq type numeric; -- fail, view has reference + +-- likewise, check we don't crash if the dependency goes wrong +begin; + +-- destroy the dependency entry that prevents the ALTER: +delete from pg_depend where + objid = (select oid from pg_rewrite + where ev_class = 'usersview'::regclass and rulename = '_RETURN') + and refobjsubid = 2 +returning pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as ref, + deptype; + alter table users alter column seq type numeric; select * from usersview; -- expect clean failure +rollback; drop view usersview; drop function get_first_user(); diff --git a/third_party/spanner_pg/src/test/regress/sql/rangetypes.sql b/third_party/spanner_pg/src/test/regress/sql/rangetypes.sql index a2d411d0..1a10f67f 100644 --- a/third_party/spanner_pg/src/test/regress/sql/rangetypes.sql +++ b/third_party/spanner_pg/src/test/regress/sql/rangetypes.sql @@ -1,9 +1,8 @@ -- Tests for range data types. -create type textrange as range (subtype=text, collation="C"); - -- -- test input parser +-- (type textrange was already made in test_setup.sql) -- -- negative tests; should fail @@ -424,13 +423,12 @@ set timezone to default; -- -- Test user-defined range of floats +-- (type float8range was already made in test_setup.sql) -- --should fail -create type float8range as range (subtype=float8, subtype_diff=float4mi); +create type bogus_float8range as range (subtype=float8, subtype_diff=float4mi); ---should succeed -create type float8range as range (subtype=float8, subtype_diff=float8mi); select '[123.001, 5.e9)'::float8range @> 888.882::float8; create table float8range_test(f8r float8range, i int); insert into float8range_test values(float8range(-100.00007, '1.111113e9'), 42); diff --git a/third_party/spanner_pg/src/test/regress/sql/regex.linux.utf8.sql b/third_party/spanner_pg/src/test/regress/sql/regex.linux.utf8.sql deleted file mode 100644 index 45778116..00000000 --- a/third_party/spanner_pg/src/test/regress/sql/regex.linux.utf8.sql +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This test is for Linux/glibc systems and others that implement proper - * locale classification of Unicode characters with high code values. - * It must be run in a database with UTF8 encoding and a Unicode-aware locale. - */ - -SET client_encoding TO UTF8; - --- --- Test the "high colormap" logic with single characters and ranges that --- exceed the MAX_SIMPLE_CHR cutoff, here assumed to be less than U+2000. --- - --- trivial cases: -SELECT 'aⓐ' ~ U&'a\24D0' AS t; -SELECT 'aⓐ' ~ U&'a\24D1' AS f; -SELECT 'aⓕ' ~ 'a[ⓐ-ⓩ]' AS t; -SELECT 'aⒻ' ~ 'a[ⓐ-ⓩ]' AS f; --- cases requiring splitting of ranges: -SELECT 'aⓕⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; -SELECT 'aⓕⓐ' ~ 'aⓕ[ⓐ-ⓩ]' AS t; -SELECT 'aⓐⓕ' ~ 'aⓕ[ⓐ-ⓩ]' AS f; -SELECT 'aⓕⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; -SELECT 'aⓕⓐ' ~ 'a[ⓐ-ⓩ]ⓕ' AS f; -SELECT 'aⓐⓕ' ~ 'a[ⓐ-ⓩ]ⓕ' AS t; -SELECT 'aⒶⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; -SELECT 'aⓜⓜ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; -SELECT 'aⓜⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS t; -SELECT 'aⓩⓩ' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; -SELECT 'aⓜ⓪' ~ 'a[Ⓐ-ⓜ][ⓜ-ⓩ]' AS f; -SELECT 'a0' ~ 'a[a-ⓩ]' AS f; -SELECT 'aq' ~ 'a[a-ⓩ]' AS t; -SELECT 'aⓜ' ~ 'a[a-ⓩ]' AS t; -SELECT 'a⓪' ~ 'a[a-ⓩ]' AS f; - --- Locale-dependent character classes - -SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:graph:]]' AS t; -SELECT 'aⒶⓜ⓪' ~ '[[:alpha:]][[:alpha:]][[:alpha:]][[:alpha:]]' AS f; - --- Locale-dependent character classes with high ranges - -SELECT 'aⒶⓜ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS t; -SELECT 'aⓜⒶ⓪' ~ '[a-z][[:alpha:]][ⓐ-ⓩ][[:graph:]]' AS f; -SELECT 'aⓜⒶ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS t; -SELECT 'aⒶⓜ⓪' ~ '[a-z][ⓐ-ⓩ][[:alpha:]][[:graph:]]' AS f; diff --git a/third_party/spanner_pg/src/test/regress/sql/rowsecurity.sql b/third_party/spanner_pg/src/test/regress/sql/rowsecurity.sql index b18b8a69..34ea2045 100644 --- a/third_party/spanner_pg/src/test/regress/sql/rowsecurity.sql +++ b/third_party/spanner_pg/src/test/regress/sql/rowsecurity.sql @@ -810,6 +810,196 @@ 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 and new dlevel must be > 0 +CREATE POLICY p3 ON document FOR UPDATE + USING (cid = (SELECT cid from category WHERE cname = 'novel')) + WITH CHECK (dlevel > 0); +-- 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 dlevel +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 ', dlevel = 0; + +-- 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 dlevel 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 ', dlevel = 1; + +-- 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; + +-- OK if DELETE is replaced with DO NOTHING +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 + DO NOTHING; + +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 'novel' +RESET SESSION AUTHORIZATION; +DROP POLICY p1 ON document; +CREATE POLICY p1 ON document FOR SELECT + USING (cid = (SELECT cid from category WHERE cname = 'novel')); + +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 7 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'); + +-- UPDATE action fails if new row is not visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge6 ', + cid = (SELECT cid from category WHERE cname = 'technology'); + +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge7 ', + cid = (SELECT cid from category WHERE cname = 'novel'); + +-- OK to insert a new row that is not visible +MERGE INTO document d +USING (SELECT 13 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge8 ' +WHEN NOT MATCHED THEN + INSERT VALUES (13, 44, 1, 'regress_rls_bob', 'new manga'); + +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 -- @@ -912,6 +1102,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/third_party/spanner_pg/src/test/regress/sql/rules.sql b/third_party/spanner_pg/src/test/regress/sql/rules.sql index 0c7f3df4..b7ac6407 100644 --- a/third_party/spanner_pg/src/test/regress/sql/rules.sql +++ b/third_party/spanner_pg/src/test/regress/sql/rules.sql @@ -776,11 +776,11 @@ drop table cchild; \a\t SELECT viewname, definition FROM pg_views -WHERE schemaname IN ('pg_catalog', 'public') +WHERE schemaname = 'pg_catalog' ORDER BY viewname; SELECT tablename, rulename, definition FROM pg_rules -WHERE schemaname IN ('pg_catalog', 'public') +WHERE schemaname = 'pg_catalog' ORDER BY tablename, rulename; -- restore normal output mode @@ -1263,6 +1263,88 @@ 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 deparsing +CREATE TABLE sf_target(id int, data text, filling int[]); + +CREATE FUNCTION merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN MATCHED + AND (s.a + t.id) = 42 + THEN UPDATE SET data = repeat(t.data, s.a) || s.b, id = length(s.b) +WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) +WHEN MATCHED + AND length(s.b || t.data) > 10 + THEN UPDATE SET data = s.b +WHEN MATCHED + AND s.a > 200 + THEN UPDATE SET filling[s.a] = t.id +WHEN MATCHED + AND s.a > 100 + THEN DELETE +WHEN MATCHED + THEN DO NOTHING +WHEN NOT MATCHED + AND s.a > 200 + THEN INSERT DEFAULT VALUES +WHEN NOT MATCHED + AND s.a > 100 + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) +WHEN NOT MATCHED + AND s.a > 0 + THEN INSERT + VALUES (s.a, s.b, DEFAULT) +WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END; + +\sf merge_sf_test + +DROP FUNCTION merge_sf_test; +DROP TABLE sf_target; + -- -- Test enabling/disabling -- @@ -1288,3 +1370,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/third_party/spanner_pg/src/test/regress/sql/sanity_check.sql b/third_party/spanner_pg/src/test/regress/sql/sanity_check.sql index a4ec0030..7f338d19 100644 --- a/third_party/spanner_pg/src/test/regress/sql/sanity_check.sql +++ b/third_party/spanner_pg/src/test/regress/sql/sanity_check.sql @@ -1,25 +1,7 @@ VACUUM; -- --- sanity check, if we don't have indices the test will take years to --- complete. But skip TOAST relations (since they will have varying --- names depending on the current OID counter) as well as temp tables --- of other backends (to avoid timing-dependent behavior). --- - --- temporarily disable fancy output, so catalog changes create less diff noise -\a\t - -SELECT relname, relhasindex - FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace - WHERE relkind IN ('r', 'p') AND (nspname ~ '^pg_temp_') IS NOT TRUE - ORDER BY relname; - --- restore normal output mode -\a\t - --- --- another sanity check: every system catalog that has OIDs should have +-- Sanity check: every system catalog that has OIDs should have -- a unique index on OID. This ensures that the OIDs will be unique, -- even after the OID counter wraps around. -- We exclude non-system tables from the check by looking at nspname. @@ -37,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_columns_length(coltypes) + FROM check_columns + WHERE get_columns_length(coltypes) % 8 != 0 OR + 'name'::regtype::oid = ANY(coltypes); diff --git a/third_party/spanner_pg/src/test/regress/sql/select.sql b/third_party/spanner_pg/src/test/regress/sql/select.sql index d6f42aa0..019f1e76 100644 --- a/third_party/spanner_pg/src/test/regress/sql/select.sql +++ b/third_party/spanner_pg/src/test/regress/sql/select.sql @@ -90,11 +90,6 @@ RESET enable_seqscan; RESET enable_bitmapscan; RESET enable_sort; - -SELECT two, stringu1, ten, string4 - INTO TABLE tmp - FROM onek; - -- -- awk '{print $1,$2;}' person.data | -- awk '{if(NF!=2){print $3,$2;}else{print;}}' - emp.data | diff --git a/third_party/spanner_pg/src/test/regress/sql/select_distinct.sql b/third_party/spanner_pg/src/test/regress/sql/select_distinct.sql index 33102744..f27ff714 100644 --- a/third_party/spanner_pg/src/test/regress/sql/select_distinct.sql +++ b/third_party/spanner_pg/src/test/regress/sql/select_distinct.sql @@ -5,24 +5,24 @@ -- -- awk '{print $3;}' onek.data | sort -n | uniq -- -SELECT DISTINCT two FROM tmp ORDER BY 1; +SELECT DISTINCT two FROM onek ORDER BY 1; -- -- awk '{print $5;}' onek.data | sort -n | uniq -- -SELECT DISTINCT ten FROM tmp ORDER BY 1; +SELECT DISTINCT ten FROM onek ORDER BY 1; -- -- awk '{print $16;}' onek.data | sort -d | uniq -- -SELECT DISTINCT string4 FROM tmp ORDER BY 1; +SELECT DISTINCT string4 FROM onek ORDER BY 1; -- -- awk '{print $3,$16,$5;}' onek.data | sort -d | uniq | -- sort +0n -1 +1d -2 +2n -3 -- SELECT DISTINCT two, string4, ten - FROM tmp + FROM onek ORDER BY two using <, string4 using <, ten using <; -- @@ -107,6 +107,45 @@ DROP TABLE distinct_hash_2; DROP TABLE distinct_group_1; DROP TABLE distinct_group_2; +-- Test parallel DISTINCT +SET parallel_tuple_cost=0; +SET parallel_setup_cost=0; +SET min_parallel_table_scan_size=0; +SET max_parallel_workers_per_gather=2; + +-- Ensure we get a parallel plan +EXPLAIN (costs off) +SELECT DISTINCT four FROM tenk1; + +-- Ensure the parallel plan produces the correct results +SELECT DISTINCT four FROM tenk1; + +CREATE OR REPLACE FUNCTION distinct_func(a INT) RETURNS INT AS $$ + BEGIN + RETURN a; + END; +$$ LANGUAGE plpgsql PARALLEL UNSAFE; + +-- Ensure we don't do parallel distinct with a parallel unsafe function +EXPLAIN (COSTS OFF) +SELECT DISTINCT distinct_func(1) FROM tenk1; + +-- make the function parallel safe +CREATE OR REPLACE FUNCTION distinct_func(a INT) RETURNS INT AS $$ + BEGIN + RETURN a; + END; +$$ LANGUAGE plpgsql PARALLEL SAFE; + +-- Ensure we do parallel distinct now that the function is parallel safe +EXPLAIN (COSTS OFF) +SELECT DISTINCT distinct_func(1) FROM tenk1; + +RESET max_parallel_workers_per_gather; +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; +RESET parallel_tuple_cost; + -- -- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its -- very own regression file. diff --git a/third_party/spanner_pg/src/test/regress/sql/select_distinct_on.sql b/third_party/spanner_pg/src/test/regress/sql/select_distinct_on.sql index d18733d2..0920bd64 100644 --- a/third_party/spanner_pg/src/test/regress/sql/select_distinct_on.sql +++ b/third_party/spanner_pg/src/test/regress/sql/select_distinct_on.sql @@ -3,16 +3,16 @@ -- SELECT DISTINCT ON (string4) string4, two, ten - FROM tmp + FROM onek ORDER BY string4 using <, two using >, ten using <; -- this will fail due to conflict of ordering requirements SELECT DISTINCT ON (string4, ten) string4, two, ten - FROM tmp + FROM onek ORDER BY string4 using <, two using <, ten using <; SELECT DISTINCT ON (string4, ten) string4, ten, two - FROM tmp + FROM onek ORDER BY string4 using <, ten using >, two using <; -- bug #5049: early 8.4.x chokes on volatile DISTINCT ON clauses diff --git a/third_party/spanner_pg/src/test/regress/sql/select_into.sql b/third_party/spanner_pg/src/test/regress/sql/select_into.sql index 7e903c33..689c448c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/select_into.sql +++ b/third_party/spanner_pg/src/test/regress/sql/select_into.sql @@ -110,11 +110,11 @@ DROP TABLE easi, easi2; -- -- Disallowed uses of SELECT ... INTO. All should fail -- -DECLARE foo CURSOR FOR SELECT 1 INTO b; +DECLARE foo CURSOR FOR SELECT 1 INTO int4_tbl; COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob'; SELECT * FROM (SELECT 1 INTO f) bar; -CREATE VIEW foo AS SELECT 1 INTO b; -INSERT INTO b SELECT 1 INTO f; +CREATE VIEW foo AS SELECT 1 INTO int4_tbl; +INSERT INTO int4_tbl SELECT 1 INTO f; -- Test CREATE TABLE AS ... IF NOT EXISTS CREATE TABLE ctas_ine_tbl AS SELECT 1; diff --git a/third_party/spanner_pg/src/test/regress/sql/sequence.sql b/third_party/spanner_pg/src/test/regress/sql/sequence.sql index 7928ee23..674f5f1f 100644 --- a/third_party/spanner_pg/src/test/regress/sql/sequence.sql +++ b/third_party/spanner_pg/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; diff --git a/third_party/spanner_pg/src/test/regress/sql/spgist.sql b/third_party/spanner_pg/src/test/regress/sql/spgist.sql index 7644f344..4828ede6 100644 --- a/third_party/spanner_pg/src/test/regress/sql/spgist.sql +++ b/third_party/spanner_pg/src/test/regress/sql/spgist.sql @@ -80,3 +80,12 @@ insert into spgist_domain_tbl values('fee'), ('fi'), ('fo'), ('fum'); explain (costs off) select * from spgist_domain_tbl where f1 = 'fo'; select * from spgist_domain_tbl where f1 = 'fo'; + +-- test an unlogged table, mostly to get coverage of spgistbuildempty +create unlogged table spgist_unlogged_tbl(id serial, b box); +create index spgist_unlogged_idx on spgist_unlogged_tbl using spgist (b); +insert into spgist_unlogged_tbl(b) +select box(point(i,j)) + from generate_series(1,100,5) i, + generate_series(1,10,5) j; +-- leave this table around, to help in testing dump/restore diff --git a/third_party/spanner_pg/src/test/regress/sql/stats.sql b/third_party/spanner_pg/src/test/regress/sql/stats.sql index dda07174..73c8d38b 100644 --- a/third_party/spanner_pg/src/test/regress/sql/stats.sql +++ b/third_party/spanner_pg/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). @@ -13,8 +13,15 @@ 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'; + +-- record dboid for later use +SELECT oid AS dboid from pg_database where datname = current_database() \gset -- 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,59 +30,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'; - --- 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 - -- we don't want to wait forever; loop will 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; +COMMIT; -- test effects of TRUNCATE on n_live_tup/n_dead_tup counters CREATE TABLE trunc_stats_test(id serial); @@ -143,18 +98,13 @@ 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; +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; @@ -174,12 +124,373 @@ 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; + +---- +-- 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; +----- +-- Test reset of some stats for shared table +----- + +-- This updates the comment of the database currently in use in +-- pg_shdescription with a fake value, then sets it back to its +-- original value. +SELECT shobj_description(d.oid, 'pg_database') as description_before + FROM pg_database d WHERE datname = current_database() \gset + +-- force some stats in pg_shdescription. +BEGIN; +SELECT current_database() as datname \gset +COMMENT ON DATABASE :"datname" IS 'This is a test comment'; +SELECT pg_stat_force_next_flush(); +COMMIT; + +-- check that the stats are reset. +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; +SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass); +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + +-- set back comment +\if :{?description_before} + COMMENT ON DATABASE :"datname" IS :'description_before'; +\else + COMMENT ON DATABASE :"datname" IS NULL; +\endif + +----- +-- 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 pg_stat_force_next_flush(); +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 +---- +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; + +---- +-- Changing stats_fetch_consistency in a transaction. +---- +BEGIN; +-- Stats filled under the cache mode +SET LOCAL stats_fetch_consistency = cache; +SELECT pg_stat_get_function_calls(0); +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; +-- Success in accessing pre-existing snapshot data. +SET LOCAL stats_fetch_consistency = snapshot; +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; +SELECT pg_stat_get_function_calls(0); +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; +-- Snapshot cleared. +SET LOCAL stats_fetch_consistency = none; +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; +SELECT pg_stat_get_function_calls(0); +SELECT pg_stat_get_snapshot_timestamp() IS NOT NULL AS snapshot_ok; +ROLLBACK; + +---- +-- 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', :dboid, 1); +SELECT pg_stat_have_stats('database', :dboid, 0); + +-- pg_stat_have_stats returns true for committed index creation +CREATE table stats_test_tab1 as select generate_series(1,10) a; +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +SET enable_seqscan TO off; +select a from stats_test_tab1 where a = 3; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + +-- pg_stat_have_stats returns false for dropped index with stats +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); +DROP index stats_test_idx1; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + +-- pg_stat_have_stats returns false for rolled back index creation +BEGIN; +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +select a from stats_test_tab1 where a = 3; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); +ROLLBACK; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + +-- pg_stat_have_stats returns true for reindex CONCURRENTLY +CREATE index stats_test_idx1 on stats_test_tab1(a); +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +select a from stats_test_tab1 where a = 3; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); +REINDEX index CONCURRENTLY stats_test_idx1; +-- false for previous oid +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); +-- true for new oid +SELECT 'stats_test_idx1'::regclass::oid AS stats_test_idx1_oid \gset +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + +-- pg_stat_have_stats returns true for a rolled back drop index with stats +BEGIN; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); +DROP index stats_test_idx1; +ROLLBACK; +SELECT pg_stat_have_stats('relation', :dboid, :stats_test_idx1_oid); + +-- put enable_seqscan back to on +SET enable_seqscan TO on; -- 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 diff --git a/third_party/spanner_pg/src/test/regress/sql/stats_ext.sql b/third_party/spanner_pg/src/test/regress/sql/stats_ext.sql index 14b62533..f0ee4159 100644 --- a/third_party/spanner_pg/src/test/regress/sql/stats_ext.sql +++ b/third_party/spanner_pg/src/test/regress/sql/stats_ext.sql @@ -91,10 +91,9 @@ ALTER TABLE ab1 ALTER a SET STATISTICS -1; ALTER STATISTICS ab1_a_b_stats SET STATISTICS 0; \d ab1 ANALYZE ab1; -SELECT stxname, stxdndistinct, stxddependencies, stxdmcv - FROM pg_statistic_ext s, pg_statistic_ext_data d - WHERE s.stxname = 'ab1_a_b_stats' - AND d.stxoid = s.oid; +SELECT stxname, stxdndistinct, stxddependencies, stxdmcv, stxdinherit + FROM pg_statistic_ext s LEFT JOIN pg_statistic_ext_data d ON (d.stxoid = s.oid) + WHERE s.stxname = 'ab1_a_b_stats'; ALTER STATISTICS ab1_a_b_stats SET STATISTICS -1; \d+ ab1 -- partial analyze doesn't build stats either @@ -126,22 +125,25 @@ SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); CREATE STATISTICS stxdinh ON a, b FROM stxdinh; VACUUM ANALYZE stxdinh, stxdinh1, stxdinh2; --- Since the stats object does not include inherited stats, it should not --- affect the estimates +-- See if the extended stats affect the estimates SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* GROUP BY 1, 2'); -- Dependencies are applied at individual relations (within append), so -- this estimate changes a bit because we improve estimates for the parent SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinh* WHERE a = 0 AND b = 0'); +-- Ensure correct (non-inherited) stats are applied to inherited query +SELECT * FROM check_estimated_rows('SELECT a, b FROM ONLY stxdinh GROUP BY 1, 2'); +SELECT * FROM check_estimated_rows('SELECT a, b FROM ONLY stxdinh WHERE a = 0 AND b = 0'); DROP TABLE stxdinh, stxdinh1, stxdinh2; -- Ensure inherited stats ARE applied to inherited query in partitioned table CREATE TABLE stxdinp(i int, a int, b int) PARTITION BY RANGE (i); CREATE TABLE stxdinp1 PARTITION OF stxdinp FOR VALUES FROM (1) TO (100); INSERT INTO stxdinp SELECT 1, a/100, a/100 FROM generate_series(1, 999) a; -CREATE STATISTICS stxdinp ON a, b FROM stxdinp; +CREATE STATISTICS stxdinp ON (a + 1), a, b FROM stxdinp; VACUUM ANALYZE stxdinp; -- partitions are processed recursively SELECT 1 FROM pg_statistic_ext WHERE stxrelid = 'stxdinp'::regclass; SELECT * FROM check_estimated_rows('SELECT a, b FROM stxdinp GROUP BY 1, 2'); +SELECT * FROM check_estimated_rows('SELECT a + 1, b FROM ONLY stxdinp GROUP BY 1, 2'); DROP TABLE stxdinp; -- basic test for statistics on expressions diff --git a/third_party/spanner_pg/src/test/regress/sql/strings.sql b/third_party/spanner_pg/src/test/regress/sql/strings.sql index 63ddce67..fd4f1f67 100644 --- a/third_party/spanner_pg/src/test/regress/sql/strings.sql +++ b/third_party/spanner_pg/src/test/regress/sql/strings.sql @@ -171,6 +171,8 @@ SELECT SUBSTRING('abcdefg' FROM 'c.e') AS "cde"; -- With a parenthesized subexpression, return only what matches the subexpr SELECT SUBSTRING('abcdefg' FROM 'b(.*)f') AS "cde"; +-- Check case where we have a match, but not a subexpression match +SELECT SUBSTRING('foo' FROM 'foo(bar)?') IS NULL AS t; -- Check behavior of SIMILAR TO, which uses largely the same regexp variant SELECT 'abcdefg' SIMILAR TO '_bcd%' AS true; @@ -185,14 +187,106 @@ SELECT 'abcd\efg' SIMILAR TO '_bcd\%' ESCAPE '' AS true; SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; --- Test back reference in regexp_replace +-- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\&Y', 'g'); +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\\\Y', 'g'); +-- not an error, though perhaps it should be: +SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\Y\\1Z\\'); + SELECT regexp_replace('AAA BBB CCC ', E'\\s+', ' ', 'g'); SELECT regexp_replace('AAA', '^|$', 'Z', 'g'); SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'gi'); -- invalid regexp option SELECT regexp_replace('AAA aaa', 'A+', 'Z', 'z'); +-- extended regexp_replace tests +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 1); +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 1, 2); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 0, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 1, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 2, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 3, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 9, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'A|e|i|o|u', 'X', 7, 0, 'i'); +-- 'g' flag should be ignored when N is specified +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, 1, 'g'); +-- errors +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', -1, 0, 'i'); +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', 1, -1, 'i'); +-- erroneous invocation of non-extended form +SELECT regexp_replace('A PostgreSQL function', 'a|e|i|o|u', 'X', '1'); + +-- regexp_count tests +SELECT regexp_count('123123123123123', '(12)3'); +SELECT regexp_count('123123123123', '123', 1); +SELECT regexp_count('123123123123', '123', 3); +SELECT regexp_count('123123123123', '123', 33); +SELECT regexp_count('ABCABCABCABC', 'Abc', 1, ''); +SELECT regexp_count('ABCABCABCABC', 'Abc', 1, 'i'); +-- errors +SELECT regexp_count('123123123123', '123', 0); +SELECT regexp_count('123123123123', '123', -3); + +-- regexp_like tests +SELECT regexp_like('Steven', '^Ste(v|ph)en$'); +SELECT regexp_like('a'||CHR(10)||'d', 'a.d', 'n'); +SELECT regexp_like('a'||CHR(10)||'d', 'a.d', 's'); +SELECT regexp_like('abc', ' a . c ', 'x'); +SELECT regexp_like('abc', 'a.c', 'g'); -- error + +-- regexp_instr tests +SELECT regexp_instr('abcdefghi', 'd.f'); +SELECT regexp_instr('abcdefghi', 'd.q'); +SELECT regexp_instr('abcabcabc', 'a.c'); +SELECT regexp_instr('abcabcabc', 'a.c', 2); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 3); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 4); +SELECT regexp_instr('abcabcabc', 'A.C', 1, 2, 0, 'i'); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 0); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 3); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 5); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 0); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 1); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 2); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 3); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 4); +SELECT regexp_instr('1234567890', '(123)(4(56)(78))', 1, 1, 1, 'i', 5); +-- Check case where we have a match, but not a subexpression match +SELECT regexp_instr('foo', 'foo(bar)?', 1, 1, 0, '', 1); +-- errors +SELECT regexp_instr('abcabcabc', 'a.c', 0, 1); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 0); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, -1); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 2); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 0, 'g'); +SELECT regexp_instr('abcabcabc', 'a.c', 1, 1, 0, '', -1); + +-- regexp_substr tests +SELECT regexp_substr('abcdefghi', 'd.f'); +SELECT regexp_substr('abcdefghi', 'd.q') IS NULL AS t; +SELECT regexp_substr('abcabcabc', 'a.c'); +SELECT regexp_substr('abcabcabc', 'a.c', 2); +SELECT regexp_substr('abcabcabc', 'a.c', 1, 3); +SELECT regexp_substr('abcabcabc', 'a.c', 1, 4) IS NULL AS t; +SELECT regexp_substr('abcabcabc', 'A.C', 1, 2, 'i'); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 0); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 1); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 2); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 3); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 4); +SELECT regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 5) IS NULL AS t; +-- Check case where we have a match, but not a subexpression match +SELECT regexp_substr('foo', 'foo(bar)?', 1, 1, '', 1) IS NULL AS t; +-- errors +SELECT regexp_substr('abcabcabc', 'a.c', 0, 1); +SELECT regexp_substr('abcabcabc', 'a.c', 1, 0); +SELECT regexp_substr('abcabcabc', 'a.c', 1, 1, 'g'); +SELECT regexp_substr('abcabcabc', 'a.c', 1, 1, '', -1); + -- set so we can tell NULL from empty string \pset null '\\N' diff --git a/third_party/spanner_pg/src/test/regress/sql/subscription.sql b/third_party/spanner_pg/src/test/regress/sql/subscription.sql index c8a2d08e..7c5e7487 100644 --- a/third_party/spanner_pg/src/test/regress/sql/subscription.sql +++ b/third_party/spanner_pg/src/test/regress/sql/subscription.sql @@ -43,7 +43,7 @@ CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PU CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, enabled = true); CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, create_slot = true); CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = true); -CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = true); +CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = false, create_slot = true); CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE); CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = false); CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = false); @@ -79,6 +79,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; @@ -209,6 +220,47 @@ ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); DROP SUBSCRIPTION regress_testsub; DROP FUNCTION func; +-- fail - two_phase must be boolean +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, two_phase = foo); + +-- now it works +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, two_phase = true); + +\dRs+ +--fail - alter of two_phase option not supported. +ALTER SUBSCRIPTION regress_testsub SET (two_phase = false); + +-- but can alter streaming when two_phase enabled +ALTER SUBSCRIPTION regress_testsub SET (streaming = true); + +\dRs+ + +ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); +DROP SUBSCRIPTION regress_testsub; + +-- two_phase and streaming are compatible. +CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect = false, streaming = true, two_phase = true); + +\dRs+ + +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/third_party/spanner_pg/src/test/regress/sql/sysviews.sql b/third_party/spanner_pg/src/test/regress/sql/sysviews.sql index b24816e3..351e469c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/sysviews.sql +++ b/third_party/spanner_pg/src/test/regress/sql/sysviews.sql @@ -13,7 +13,7 @@ select count(*) >= 0 as ok from pg_available_extension_versions; select count(*) >= 0 as ok from pg_available_extensions; -- The entire output of pg_backend_memory_contexts is not stable, --- we test only the existance and basic condition of TopMemoryContext. +-- we test only the existence and basic condition of TopMemoryContext. select name, ident, parent, level, total_bytes >= free_bytes from pg_backend_memory_contexts where level = 0; @@ -25,8 +25,13 @@ 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 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; diff --git a/third_party/spanner_pg/src/test/regress/sql/tablesample.sql b/third_party/spanner_pg/src/test/regress/sql/tablesample.sql index c39fe4b7..aa179942 100644 --- a/third_party/spanner_pg/src/test/regress/sql/tablesample.sql +++ b/third_party/spanner_pg/src/test/regress/sql/tablesample.sql @@ -24,7 +24,7 @@ CREATE VIEW test_tablesample_v2 AS -- check a sampled query doesn't affect cursor in progress BEGIN; -DECLARE tablesample_cur CURSOR FOR +DECLARE tablesample_cur SCROLL CURSOR FOR SELECT id FROM test_tablesample TABLESAMPLE SYSTEM (50) REPEATABLE (0); FETCH FIRST FROM tablesample_cur; diff --git a/third_party/spanner_pg/src/test/regress/input/tablespace.source b/third_party/spanner_pg/src/test/regress/sql/tablespace.sql similarity index 92% rename from third_party/spanner_pg/src/test/regress/input/tablespace.source rename to third_party/spanner_pg/src/test/regress/sql/tablespace.sql index c133e734..21db433f 100644 --- a/third_party/spanner_pg/src/test/regress/input/tablespace.source +++ b/third_party/spanner_pg/src/test/regress/sql/tablespace.sql @@ -1,6 +1,18 @@ +-- relative tablespace locations are not allowed +CREATE TABLESPACE regress_tblspace LOCATION 'relative'; -- fail + +-- empty tablespace locations are not usually allowed +CREATE TABLESPACE regress_tblspace LOCATION ''; -- fail + +-- as a special developer-only option to allow us to use tablespaces +-- with streaming replication on the same server, an empty location +-- can be allowed as a way to say that the tablespace should be created +-- as a directory in pg_tblspc, rather than being a symlink +SET allow_in_place_tablespaces = true; + -- create a tablespace using WITH clause -CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail -CREATE TABLESPACE regress_tblspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok +CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (some_nonexistent_parameter = true); -- fail +CREATE TABLESPACE regress_tblspacewith LOCATION '' WITH (random_page_cost = 3.0); -- ok -- check to see the parameter was used SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; @@ -9,7 +21,11 @@ SELECT spcoptions FROM pg_tablespace WHERE spcname = 'regress_tblspacewith'; DROP TABLESPACE regress_tblspacewith; -- create a tablespace we can use -CREATE TABLESPACE regress_tblspace LOCATION '@testtablespace@'; +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); @@ -364,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'; @@ -398,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; diff --git a/third_party/spanner_pg/src/test/regress/sql/test_setup.sql b/third_party/spanner_pg/src/test/regress/sql/test_setup.sql new file mode 100644 index 00000000..02c0c84c --- /dev/null +++ b/third_party/spanner_pg/src/test/regress/sql/test_setup.sql @@ -0,0 +1,282 @@ +-- +-- TEST_SETUP --- prepare environment expected by regression test scripts +-- + +-- directory paths and dlsuffix are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv libdir PG_LIBDIR +\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. +-- +GRANT ALL ON SCHEMA public TO public; + +-- +-- These tables have traditionally been referenced by many tests, +-- so create and populate them. Insert only non-error values here. +-- (Some subsequent tests try to insert erroneous values. That's okay +-- because the table won't actually change. Do not change the contents +-- of these tables in later tests, as it may affect other tests.) +-- + +CREATE TABLE CHAR_TBL(f1 char(4)); + +INSERT INTO CHAR_TBL (f1) VALUES + ('a'), + ('ab'), + ('abcd'), + ('abcd '); +VACUUM CHAR_TBL; + +CREATE TABLE FLOAT8_TBL(f1 float8); + +INSERT INTO FLOAT8_TBL(f1) VALUES + ('0.0'), + ('-34.84'), + ('-1004.30'), + ('-1.2345678901234e+200'), + ('-1.2345678901234e-200'); +VACUUM FLOAT8_TBL; + +CREATE TABLE INT2_TBL(f1 int2); + +INSERT INTO INT2_TBL(f1) VALUES + ('0 '), + (' 1234 '), + (' -1234'), + ('32767'), -- largest and smallest values + ('-32767'); +VACUUM INT2_TBL; + +CREATE TABLE INT4_TBL(f1 int4); + +INSERT INTO INT4_TBL(f1) VALUES + (' 0 '), + ('123456 '), + (' -123456'), + ('2147483647'), -- largest and smallest values + ('-2147483647'); +VACUUM INT4_TBL; + +CREATE TABLE INT8_TBL(q1 int8, q2 int8); + +INSERT INTO INT8_TBL VALUES + (' 123 ',' 456'), + ('123 ','4567890123456789'), + ('4567890123456789','123'), + (+4567890123456789,'4567890123456789'), + ('+4567890123456789','-4567890123456789'); +VACUUM INT8_TBL; + +CREATE TABLE POINT_TBL(f1 point); + +INSERT INTO POINT_TBL(f1) VALUES + ('(0.0,0.0)'), + ('(-10.0,0.0)'), + ('(-3.0,4.0)'), + ('(5.1, 34.5)'), + ('(-5.0,-12.0)'), + ('(1e-300,-1e-300)'), -- To underflow + ('(1e+300,Inf)'), -- To overflow + ('(Inf,1e+300)'), -- Transposed + (' ( Nan , NaN ) '), + ('10.0,10.0'); +-- We intentionally don't vacuum point_tbl here; geometry depends on that + +CREATE TABLE TEXT_TBL (f1 text); + +INSERT INTO TEXT_TBL VALUES + ('doh!'), + ('hi de ho neighbor'); +VACUUM TEXT_TBL; + +CREATE TABLE VARCHAR_TBL(f1 varchar(4)); + +INSERT INTO VARCHAR_TBL (f1) VALUES + ('a'), + ('ab'), + ('abcd'), + ('abcd '); +VACUUM VARCHAR_TBL; + +CREATE TABLE onek ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +\set filename :abs_srcdir '/data/onek.data' +COPY onek FROM :'filename'; +VACUUM ANALYZE onek; + +CREATE TABLE onek2 AS SELECT * FROM onek; +VACUUM ANALYZE onek2; + +CREATE TABLE tenk1 ( + unique1 int4, + unique2 int4, + two int4, + four int4, + ten int4, + twenty int4, + hundred int4, + thousand int4, + twothousand int4, + fivethous int4, + tenthous int4, + odd int4, + even int4, + stringu1 name, + stringu2 name, + string4 name +); + +\set filename :abs_srcdir '/data/tenk.data' +COPY tenk1 FROM :'filename'; +VACUUM ANALYZE tenk1; + +CREATE TABLE tenk2 AS SELECT * FROM tenk1; +VACUUM ANALYZE tenk2; + +CREATE TABLE person ( + name text, + age int4, + location point +); + +\set filename :abs_srcdir '/data/person.data' +COPY person FROM :'filename'; +VACUUM ANALYZE person; + +CREATE TABLE emp ( + salary int4, + manager name +) INHERITS (person); + +\set filename :abs_srcdir '/data/emp.data' +COPY emp FROM :'filename'; +VACUUM ANALYZE emp; + +CREATE TABLE student ( + gpa float8 +) INHERITS (person); + +\set filename :abs_srcdir '/data/student.data' +COPY student FROM :'filename'; +VACUUM ANALYZE student; + +CREATE TABLE stud_emp ( + percent int4 +) INHERITS (emp, student); + +\set filename :abs_srcdir '/data/stud_emp.data' +COPY stud_emp FROM :'filename'; +VACUUM ANALYZE stud_emp; + +CREATE TABLE road ( + name text, + thepath path +); + +\set filename :abs_srcdir '/data/streets.data' +COPY road FROM :'filename'; +VACUUM ANALYZE road; + +CREATE TABLE ihighway () INHERITS (road); + +INSERT INTO ihighway + SELECT * + FROM ONLY road + WHERE name ~ 'I- .*'; +VACUUM ANALYZE ihighway; + +CREATE TABLE shighway ( + surface text +) INHERITS (road); + +INSERT INTO shighway + SELECT *, 'asphalt' + FROM ONLY road + WHERE name ~ 'State Hwy.*'; +VACUUM ANALYZE shighway; + +-- +-- We must have some enum type in the database for opr_sanity and type_sanity. +-- + +create type stoplight as enum ('red', 'yellow', 'green'); + +-- +-- Also create some non-built-in range types. +-- + +create type float8range as range (subtype = float8, subtype_diff = float8mi); + +create type textrange as range (subtype = text, collation = "C"); + +-- +-- Create some C functions that will be used by various tests. +-- + +CREATE FUNCTION binary_coercible(oid, oid) + RETURNS bool + AS :'regresslib', 'binary_coercible' + LANGUAGE C STRICT STABLE PARALLEL SAFE; + +CREATE FUNCTION ttdummy () + RETURNS trigger + AS :'regresslib' + LANGUAGE C; + +CREATE FUNCTION get_columns_length(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 +-- of the non-empty string value passed to it or 0. + +create function part_hashint4_noop(value int4, seed int8) + returns int8 as $$ + select value + seed; + $$ language sql strict immutable parallel safe; + +create operator class part_test_int4_ops for type int4 using hash as + operator 1 =, + function 2 part_hashint4_noop(int4, int8); + +create function part_hashtext_length(value text, seed int8) + returns int8 as $$ + select length(coalesce(value, ''))::int8 + $$ language sql strict immutable parallel safe; + +create operator class part_test_text_ops for type text using hash as + operator 1 =, + function 2 part_hashtext_length(text, int8); diff --git a/third_party/spanner_pg/src/test/regress/sql/text.sql b/third_party/spanner_pg/src/test/regress/sql/text.sql index 56eee69a..540e5512 100644 --- a/third_party/spanner_pg/src/test/regress/sql/text.sql +++ b/third_party/spanner_pg/src/test/regress/sql/text.sql @@ -6,11 +6,7 @@ SELECT text 'this is a text string' = text 'this is a text string' AS true; SELECT text 'this is a text string' = text 'this is a text strin' AS false; -CREATE TABLE TEXT_TBL (f1 text); - -INSERT INTO TEXT_TBL VALUES ('doh!'); -INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); - +-- text_tbl was already created and filled in test_setup.sql. SELECT * FROM TEXT_TBL; -- As of 8.3 we have removed most implicit casts to text, so that for example diff --git a/third_party/spanner_pg/src/test/regress/sql/tid.sql b/third_party/spanner_pg/src/test/regress/sql/tid.sql index 34546a3c..990d314a 100644 --- a/third_party/spanner_pg/src/test/regress/sql/tid.sql +++ b/third_party/spanner_pg/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); diff --git a/third_party/spanner_pg/src/test/regress/sql/timestamptz.sql b/third_party/spanner_pg/src/test/regress/sql/timestamptz.sql index bce70fb2..a107abc5 100644 --- a/third_party/spanner_pg/src/test/regress/sql/timestamptz.sql +++ b/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/test/regress/sql/transactions.sql b/third_party/spanner_pg/src/test/regress/sql/transactions.sql index 0b2ad492..97ab16fe 100644 --- a/third_party/spanner_pg/src/test/regress/sql/transactions.sql +++ b/third_party/spanner_pg/src/test/regress/sql/transactions.sql @@ -4,10 +4,12 @@ BEGIN; -SELECT * - INTO TABLE xacttest - FROM aggtest; - +CREATE TABLE xacttest (a smallint, b real); +INSERT INTO xacttest VALUES + (56, 7.8), + (100, 99.097), + (0, 0.09561), + (42, 324.78); INSERT INTO xacttest (a, b) VALUES (777, 777.777); END; @@ -20,10 +22,10 @@ BEGIN; CREATE TABLE disappear (a int4); -DELETE FROM aggtest; +DELETE FROM xacttest; -- should be empty -SELECT * FROM aggtest; +SELECT * FROM xacttest; ABORT; @@ -31,7 +33,7 @@ ABORT; SELECT oid FROM pg_class WHERE relname = 'disappear'; -- should have members again -SELECT * FROM aggtest; +SELECT * FROM xacttest; -- Read-only tests @@ -515,7 +517,7 @@ DROP TABLE trans_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: diff --git a/third_party/spanner_pg/src/test/regress/sql/triggers.sql b/third_party/spanner_pg/src/test/regress/sql/triggers.sql index a1aa5252..46795a9c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/triggers.sql +++ b/third_party/spanner_pg/src/test/regress/sql/triggers.sql @@ -2,6 +2,39 @@ -- TRIGGERS -- +-- directory paths and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set autoinclib :libdir '/autoinc' :dlsuffix +\set refintlib :libdir '/refint' :dlsuffix +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION autoinc () + RETURNS trigger + AS :'autoinclib' + LANGUAGE C; + +CREATE FUNCTION check_primary_key () + RETURNS trigger + AS :'refintlib' + LANGUAGE C; + +CREATE FUNCTION check_foreign_key () + RETURNS trigger + AS :'refintlib' + LANGUAGE C; + +CREATE FUNCTION trigger_return_old () + RETURNS trigger + AS :'regresslib' + LANGUAGE C; + +CREATE FUNCTION set_ttdummy (int4) + RETURNS int4 + AS :'regresslib' + LANGUAGE C STRICT; + create table pkeys (pkey1 int4 not null, pkey2 text not null); create table fkeys (fkey1 int4, fkey2 text, fkey3 int); create table fkeys2 (fkey21 int4, fkey22 text, pkey23 int not null); @@ -1550,6 +1583,42 @@ create trigger qqq after insert on parted_trig_1_1 for each row execute procedur insert into parted_trig values (50), (1500); drop table parted_trig; +-- Verify that the correct triggers fire for cross-partition updates +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create table parted_trig2 partition of parted_trig for values in (2); +insert into parted_trig values (1); + +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + end if; + return null; + end; + $$ language plpgsql; +create trigger parted_trig_before_stmt before insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +create trigger parted_trig_before_row before insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_row after insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_stmt after insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); + +update parted_trig set a = 2 where a = 1; + +-- update action in merge should behave the same +merge into parted_trig using (select 1) as ss on true + when matched and a = 2 then update set a = 1; + +drop table parted_trig; + -- Verify propagation of trigger arguments to partitions create table parted_trig (a int) partition by list (a); create table parted_trig1 partition of parted_trig for values in (1); @@ -1863,7 +1932,6 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, tgfoid::regproc, tgenabled from pg_trigger where tgrelid in ('parent'::regclass, 'child1'::regclass) order by tgrelid::regclass::text, tgfoid; --- Before v15, this has no effect because parent has no triggers: alter table parent disable trigger all; select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, tgfoid::regproc, tgenabled @@ -2436,6 +2504,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(); @@ -2640,3 +2755,50 @@ rollback; drop table convslot_test_parent; drop function convslot_trig4(); + +-- Test trigger renaming on partitioned tables +create table grandparent (id int, primary key (id)) partition by range (id); +create table middle partition of grandparent for values from (1) to (10) +partition by range (id); +create table chi partition of middle for values from (1) to (5); +create table cho partition of middle for values from (6) to (10); +create function f () returns trigger as +$$ begin return new; end; $$ +language plpgsql; +create trigger a after insert on grandparent +for each row execute procedure f(); + +alter trigger a on grandparent rename to b; +select tgrelid::regclass, tgname, +(select tgname from pg_trigger tr where tr.oid = pg_trigger.tgparentid) parent_tgname +from pg_trigger where tgrelid in (select relid from pg_partition_tree('grandparent')) +order by tgname, tgrelid::regclass::text COLLATE "C"; +alter trigger a on only grandparent rename to b; -- ONLY not supported +alter trigger b on middle rename to c; -- can't rename trigger on partition +create trigger c after insert on middle +for each row execute procedure f(); +alter trigger b on grandparent rename to c; + +-- Rename cascading does not affect statement triggers +create trigger p after insert on grandparent for each statement execute function f(); +create trigger p after insert on middle for each statement execute function f(); +alter trigger p on grandparent rename to q; +select tgrelid::regclass, tgname, +(select tgname from pg_trigger tr where tr.oid = pg_trigger.tgparentid) parent_tgname +from pg_trigger where tgrelid in (select relid from pg_partition_tree('grandparent')) +order by tgname, tgrelid::regclass::text COLLATE "C"; + +drop table grandparent; + +-- Trigger renaming does not recurse on legacy inheritance +create table parent (a int); +create table child () inherits (parent); +create trigger parenttrig after insert on parent +for each row execute procedure f(); +create trigger parenttrig after insert on child +for each row execute procedure f(); +alter trigger parenttrig on parent rename to anothertrig; +\d+ child + +drop table parent, child; +drop function f(); diff --git a/third_party/spanner_pg/src/test/regress/sql/tsdicts.sql b/third_party/spanner_pg/src/test/regress/sql/tsdicts.sql index ddc6c7f4..6a2b0036 100644 --- a/third_party/spanner_pg/src/test/regress/sql/tsdicts.sql +++ b/third_party/spanner_pg/src/test/regress/sql/tsdicts.sql @@ -251,3 +251,33 @@ CREATE TEXT SEARCH DICTIONARY tsdict_case "DictFile" = ispell_sample, "AffFile" = ispell_sample ); + +-- Test grammar for configurations +CREATE TEXT SEARCH CONFIGURATION dummy_tst (COPY=english); +-- Overriden mapping change with duplicated tokens. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ALTER MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR not_a_token, not_a_token; +-- Not a token supported by the configuration's parser, fails even +-- with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR not_a_token, not_a_token; +-- Token supported by the configuration's parser, succeeds. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word, word; +-- No mapping for token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word; +-- Token supported by the configuration's parser, cannot be found, +-- succeeds with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR word, word; +-- Re-add mapping, with duplicated tokens supported by the parser. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR not_a_token WITH ispell; +DROP TEXT SEARCH CONFIGURATION dummy_tst; diff --git a/third_party/spanner_pg/src/test/regress/sql/tsearch.sql b/third_party/spanner_pg/src/test/regress/sql/tsearch.sql index b5a3a68a..ca522612 100644 --- a/third_party/spanner_pg/src/test/regress/sql/tsearch.sql +++ b/third_party/spanner_pg/src/test/regress/sql/tsearch.sql @@ -1,3 +1,6 @@ +-- directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR + -- -- Sanity checks for text search catalogs -- @@ -39,6 +42,17 @@ RIGHT JOIN pg_ts_config_map AS m WHERE tt.cfgid IS NULL OR tt.tokid IS NULL; +-- Load some test data +CREATE TABLE test_tsvector( + t text, + a tsvector +); + +\set filename :abs_srcdir '/data/tsearch.data' +COPY test_tsvector FROM :'filename'; + +ANALYZE test_tsvector; + -- test basic text search behavior without indexes, then with SELECT count(*) FROM test_tsvector WHERE a @@ 'wr|qh'; diff --git a/third_party/spanner_pg/src/test/regress/sql/tstypes.sql b/third_party/spanner_pg/src/test/regress/sql/tstypes.sql index 30c8c702..61e8f49c 100644 --- a/third_party/spanner_pg/src/test/regress/sql/tstypes.sql +++ b/third_party/spanner_pg/src/test/regress/sql/tstypes.sql @@ -17,6 +17,7 @@ SELECT $$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector; SELECT tsvectorin(tsvectorout($$'\\as' ab\c ab\\c AB\\\c ab\\\\c$$::tsvector)); SELECT '''w'':4A,3B,2C,1D,5 a:8'; SELECT 'a:3A b:2a'::tsvector || 'ba:1234 a:1B'; +SELECT $$'' '1' '2'$$::tsvector; -- error, empty lexeme is not allowed --Base tsquery test SELECT '1'::tsquery; @@ -239,7 +240,7 @@ SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3': SELECT ts_delete('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector, ARRAY['spaceship','leya','rebel']); SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel']); SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel','rebel']); -SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', NULL]); +SELECT ts_delete('base hidden rebel spaceship strike'::tsvector, ARRAY['spaceship','leya','rebel', '', NULL]); SELECT unnest('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D strike:3'::tsvector); SELECT unnest('base hidden rebel spaceship strike'::tsvector); @@ -251,7 +252,9 @@ SELECT tsvector_to_array('base:7 hidden:6 rebel:1 spaceship:2,33A,34B,35C,36D st SELECT tsvector_to_array('base hidden rebel spaceship strike'::tsvector); SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship','strike']); +-- null and empty string are disallowed, since we mustn't make an empty lexeme SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', NULL]); +SELECT array_to_tsvector(ARRAY['base','hidden','rebel','spaceship', '']); -- array_to_tsvector must sort and de-dup SELECT array_to_tsvector(ARRAY['foo','bar','baz','bar']); @@ -260,8 +263,7 @@ SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c'); SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a}'); SELECT setweight('a:1,3A asd:1C w:5,6,12B,13A zxc:81,222A,567'::tsvector, 'c', '{a,zxc}'); -SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', '{a,zxc}'); -SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', NULL]); +SELECT setweight('a asd w:5,6,12B,13A zxc'::tsvector, 'c', ARRAY['a', 'zxc', '', NULL]); SELECT ts_filter('base:7A empir:17 evil:15 first:11 galact:16 hidden:6A rebel:1A spaceship:2A strike:3A victori:12 won:9'::tsvector, '{a}'); SELECT ts_filter('base hidden rebel spaceship strike'::tsvector, '{a}'); diff --git a/third_party/spanner_pg/src/test/regress/sql/type_sanity.sql b/third_party/spanner_pg/src/test/regress/sql/type_sanity.sql index 82810764..5edc1f1f 100644 --- a/third_party/spanner_pg/src/test/regress/sql/type_sanity.sql +++ b/third_party/spanner_pg/src/test/regress/sql/type_sanity.sql @@ -16,94 +16,94 @@ -- Look for illegal values in pg_type fields. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typnamespace = 0 OR - (p1.typlen <= 0 AND p1.typlen != -1 AND p1.typlen != -2) OR - (p1.typtype not in ('b', 'c', 'd', 'e', 'p', 'r', 'm')) OR - NOT p1.typisdefined OR - (p1.typalign not in ('c', 's', 'i', 'd')) OR - (p1.typstorage not in ('p', 'x', 'e', 'm')); +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', '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')); -- Look for "pass by value" types that can't be passed by value. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typbyval AND - (p1.typlen != 1 OR p1.typalign != 'c') AND - (p1.typlen != 2 OR p1.typalign != 's') AND - (p1.typlen != 4 OR p1.typalign != 'i') AND - (p1.typlen != 8 OR p1.typalign != 'd'); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typbyval AND + (t1.typlen != 1 OR t1.typalign != 'c') AND + (t1.typlen != 2 OR t1.typalign != 's') AND + (t1.typlen != 4 OR t1.typalign != 'i') AND + (t1.typlen != 8 OR t1.typalign != 'd'); -- Look for "toastable" types that aren't varlena. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typstorage != 'p' AND - (p1.typbyval OR p1.typlen != -1); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typstorage != 'p' AND + (t1.typbyval OR t1.typlen != -1); -- Look for complex types that do not have a typrelid entry, -- or basic types that do. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR - (p1.typtype != 'c' AND p1.typrelid != 0); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE (t1.typtype = 'c' AND t1.typrelid = 0) OR + (t1.typtype != 'c' AND t1.typrelid != 0); -- Look for types that should have an array type but don't. -- Generally anything that's not a pseudotype should have an array type. -- However, we do have a small number of exceptions. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typtype not in ('p') AND p1.typname NOT LIKE E'\\_%' +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typtype not in ('p') AND t1.typname NOT LIKE E'\\_%' AND NOT EXISTS - (SELECT 1 FROM pg_type as p2 - WHERE p2.typname = ('_' || p1.typname)::name AND - p2.typelem = p1.oid and p1.typarray = p2.oid) -ORDER BY p1.oid; + (SELECT 1 FROM pg_type as t2 + WHERE t2.typname = ('_' || t1.typname)::name AND + t2.typelem = t1.oid and t1.typarray = t2.oid) +ORDER BY t1.oid; -- Make sure typarray points to a "true" array type of our own base -SELECT p1.oid, p1.typname as basetype, p2.typname as arraytype, - p2.typsubscript -FROM pg_type p1 LEFT JOIN pg_type p2 ON (p1.typarray = p2.oid) -WHERE p1.typarray <> 0 AND - (p2.oid IS NULL OR - p2.typsubscript <> 'array_subscript_handler'::regproc); +SELECT t1.oid, t1.typname as basetype, t2.typname as arraytype, + t2.typsubscript +FROM pg_type t1 LEFT JOIN pg_type t2 ON (t1.typarray = t2.oid) +WHERE t1.typarray <> 0 AND + (t2.oid IS NULL OR + t2.typsubscript <> 'array_subscript_handler'::regproc); -- Look for range types that do not have a pg_range entry -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE p1.typtype = 'r' AND - NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = p1.oid); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE t1.typtype = 'r' AND + NOT EXISTS(SELECT 1 FROM pg_range r WHERE rngtypid = t1.oid); -- Look for range types whose typalign isn't sufficient -SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign -FROM pg_type as p1 - LEFT JOIN pg_range as r ON rngtypid = p1.oid - LEFT JOIN pg_type as p2 ON rngsubtype = p2.oid -WHERE p1.typtype = 'r' AND - (p1.typalign != (CASE WHEN p2.typalign = 'd' THEN 'd'::"char" +SELECT t1.oid, t1.typname, t1.typalign, t2.typname, t2.typalign +FROM pg_type as t1 + LEFT JOIN pg_range as r ON rngtypid = t1.oid + LEFT JOIN pg_type as t2 ON rngsubtype = t2.oid +WHERE t1.typtype = 'r' AND + (t1.typalign != (CASE WHEN t2.typalign = 'd' THEN 'd'::"char" ELSE 'i'::"char" END) - OR p2.oid IS NULL); + OR t2.oid IS NULL); -- Text conversion routines must be provided. -SELECT p1.oid, p1.typname -FROM pg_type as p1 -WHERE (p1.typinput = 0 OR p1.typoutput = 0); +SELECT t1.oid, t1.typname +FROM pg_type as t1 +WHERE (t1.typinput = 0 OR t1.typoutput = 0); -- Check for bogus typinput routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND NOT - ((p2.pronargs = 1 AND p2.proargtypes[0] = 'cstring'::regtype) OR - (p2.pronargs = 2 AND p2.proargtypes[0] = 'cstring'::regtype AND - p2.proargtypes[1] = 'oid'::regtype) OR - (p2.pronargs = 3 AND p2.proargtypes[0] = 'cstring'::regtype AND - p2.proargtypes[1] = 'oid'::regtype AND - p2.proargtypes[2] = 'int4'::regtype)); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND NOT + ((p1.pronargs = 1 AND p1.proargtypes[0] = 'cstring'::regtype) OR + (p1.pronargs = 2 AND p1.proargtypes[0] = 'cstring'::regtype AND + p1.proargtypes[1] = 'oid'::regtype) OR + (p1.pronargs = 3 AND p1.proargtypes[0] = 'cstring'::regtype AND + p1.proargtypes[1] = 'oid'::regtype AND + p1.proargtypes[2] = 'int4'::regtype)); -- Check for type of the variadic array parameter's elements. -- provariadic should be ANYOID if the type of the last element is ANYOID, @@ -133,225 +133,225 @@ WHERE (proargmodes IS NOT NULL AND 'v' = any(proargmodes)) -- As of 8.0, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.prorettype = p1.oid AND NOT p2.proretset) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.prorettype = t1.oid AND NOT p1.proretset) ORDER BY 1; -- Varlena array types will point to array_in -- Exception as of 8.1: int2vector and oidvector have their own I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.oid = 'array_in'::regproc) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.oid = 'array_in'::regproc) ORDER BY 1; -- typinput routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typinput = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typinput = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Composites, domains, enums, multiranges, ranges should all use the same input routines SELECT DISTINCT typtype, typinput -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'p') ORDER BY 1; -- Check for bogus typoutput routines -- As of 8.0, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p2.pronargs = 1 AND - (p2.proargtypes[0] = p1.oid OR - (p2.oid = 'array_out'::regproc AND - p1.typelem != 0 AND p1.typlen = -1))) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (p1.pronargs = 1 AND + (p1.proargtypes[0] = t1.oid OR + (p1.oid = 'array_out'::regproc AND + t1.typelem != 0 AND t1.typlen = -1))) ORDER BY 1; -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND NOT - (p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND NOT + (p1.prorettype = 'cstring'::regtype AND NOT p1.proretset); -- typoutput routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typoutput = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typoutput = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Composites, enums, multiranges, ranges should all use the same output routines SELECT DISTINCT typtype, typoutput -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'd', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'd', 'p') ORDER BY 1; -- Domains should have same typoutput as their base types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid -WHERE p1.typtype = 'd' AND p1.typoutput IS DISTINCT FROM p2.typoutput; +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1 LEFT JOIN pg_type AS t2 ON t1.typbasetype = t2.oid +WHERE t1.typtype = 'd' AND t1.typoutput IS DISTINCT FROM t2.typoutput; -- Check for bogus typreceive routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND NOT - ((p2.pronargs = 1 AND p2.proargtypes[0] = 'internal'::regtype) OR - (p2.pronargs = 2 AND p2.proargtypes[0] = 'internal'::regtype AND - p2.proargtypes[1] = 'oid'::regtype) OR - (p2.pronargs = 3 AND p2.proargtypes[0] = 'internal'::regtype AND - p2.proargtypes[1] = 'oid'::regtype AND - p2.proargtypes[2] = 'int4'::regtype)); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND NOT + ((p1.pronargs = 1 AND p1.proargtypes[0] = 'internal'::regtype) OR + (p1.pronargs = 2 AND p1.proargtypes[0] = 'internal'::regtype AND + p1.proargtypes[1] = 'oid'::regtype) OR + (p1.pronargs = 3 AND p1.proargtypes[0] = 'internal'::regtype AND + p1.proargtypes[1] = 'oid'::regtype AND + p1.proargtypes[2] = 'int4'::regtype)); -- As of 7.4, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.prorettype = p1.oid AND NOT p2.proretset) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.prorettype = t1.oid AND NOT p1.proretset) ORDER BY 1; -- Varlena array types will point to array_recv -- Exception as of 8.1: int2vector and oidvector have their own I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND - (p1.typelem != 0 AND p1.typlen < 0) AND NOT - (p2.oid = 'array_recv'::regproc) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND + (t1.typelem != 0 AND t1.typlen < 0) AND NOT + (p1.oid = 'array_recv'::regproc) ORDER BY 1; -- Suspicious if typreceive doesn't take same number of args as typinput -SELECT p1.oid, p1.typname, p2.oid, p2.proname, p3.oid, p3.proname -FROM pg_type AS p1, pg_proc AS p2, pg_proc AS p3 -WHERE p1.typinput = p2.oid AND p1.typreceive = p3.oid AND - p2.pronargs != p3.pronargs; +SELECT t1.oid, t1.typname, p1.oid, p1.proname, p2.oid, p2.proname +FROM pg_type AS t1, pg_proc AS p1, pg_proc AS p2 +WHERE t1.typinput = p1.oid AND t1.typreceive = p2.oid AND + p1.pronargs != p2.pronargs; -- typreceive routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typreceive = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typreceive = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Composites, domains, enums, multiranges, ranges should all use the same receive routines SELECT DISTINCT typtype, typreceive -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'p') ORDER BY 1; -- Check for bogus typsend routines -- As of 7.4, this check finds refcursor, which is borrowing -- other types' I/O routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT - (p2.pronargs = 1 AND - (p2.proargtypes[0] = p1.oid OR - (p2.oid = 'array_send'::regproc AND - p1.typelem != 0 AND p1.typlen = -1))) +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND t1.typtype in ('b', 'p') AND NOT + (p1.pronargs = 1 AND + (p1.proargtypes[0] = t1.oid OR + (p1.oid = 'array_send'::regproc AND + t1.typelem != 0 AND t1.typlen = -1))) ORDER BY 1; -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND NOT - (p2.prorettype = 'bytea'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND NOT + (p1.prorettype = 'bytea'::regtype AND NOT p1.proretset); -- typsend routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typsend = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typsend = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Composites, enums, multiranges, ranges should all use the same send routines SELECT DISTINCT typtype, typsend -FROM pg_type AS p1 -WHERE p1.typtype not in ('b', 'd', 'p') +FROM pg_type AS t1 +WHERE t1.typtype not in ('b', 'd', 'p') ORDER BY 1; -- Domains should have same typsend as their base types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1 LEFT JOIN pg_type AS p2 ON p1.typbasetype = p2.oid -WHERE p1.typtype = 'd' AND p1.typsend IS DISTINCT FROM p2.typsend; +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1 LEFT JOIN pg_type AS t2 ON t1.typbasetype = t2.oid +WHERE t1.typtype = 'd' AND t1.typsend IS DISTINCT FROM t2.typsend; -- Check for bogus typmodin routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodin = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'cstring[]'::regtype AND - p2.prorettype = 'int4'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodin = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'cstring[]'::regtype AND + p1.prorettype = 'int4'::regtype AND NOT p1.proretset); -- typmodin routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodin = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodin = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Check for bogus typmodout routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodout = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'int4'::regtype AND - p2.prorettype = 'cstring'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodout = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'int4'::regtype AND + p1.prorettype = 'cstring'::regtype AND NOT p1.proretset); -- typmodout routines should not be volatile -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typmodout = p2.oid AND p2.provolatile NOT IN ('i', 's'); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typmodout = p1.oid AND p1.provolatile NOT IN ('i', 's'); -- Array types should have same typmodin/out as their element types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typelem = p2.oid AND NOT - (p1.typmodin = p2.typmodin AND p1.typmodout = p2.typmodout); +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typelem = t2.oid AND NOT + (t1.typmodin = t2.typmodin AND t1.typmodout = t2.typmodout); -- Array types should have same typdelim as their element types -SELECT p1.oid, p1.typname, p2.oid, p2.typname -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typarray = p2.oid AND NOT (p1.typdelim = p2.typdelim); +SELECT t1.oid, t1.typname, t2.oid, t2.typname +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typarray = t2.oid AND NOT (t1.typdelim = t2.typdelim); -- Look for array types whose typalign isn't sufficient -SELECT p1.oid, p1.typname, p1.typalign, p2.typname, p2.typalign -FROM pg_type AS p1, pg_type AS p2 -WHERE p1.typarray = p2.oid AND - p2.typalign != (CASE WHEN p1.typalign = 'd' THEN 'd'::"char" +SELECT t1.oid, t1.typname, t1.typalign, t2.typname, t2.typalign +FROM pg_type AS t1, pg_type AS t2 +WHERE t1.typarray = t2.oid AND + t2.typalign != (CASE WHEN t1.typalign = 'd' THEN 'd'::"char" ELSE 'i'::"char" END); -- Check for typelem set without a handler -SELECT p1.oid, p1.typname, p1.typelem -FROM pg_type AS p1 -WHERE p1.typelem != 0 AND p1.typsubscript = 0; +SELECT t1.oid, t1.typname, t1.typelem +FROM pg_type AS t1 +WHERE t1.typelem != 0 AND t1.typsubscript = 0; -- Check for misuse of standard subscript handlers -SELECT p1.oid, p1.typname, - p1.typelem, p1.typlen, p1.typbyval -FROM pg_type AS p1 -WHERE p1.typsubscript = 'array_subscript_handler'::regproc AND NOT - (p1.typelem != 0 AND p1.typlen = -1 AND NOT p1.typbyval); +SELECT t1.oid, t1.typname, + t1.typelem, t1.typlen, t1.typbyval +FROM pg_type AS t1 +WHERE t1.typsubscript = 'array_subscript_handler'::regproc AND NOT + (t1.typelem != 0 AND t1.typlen = -1 AND NOT t1.typbyval); -SELECT p1.oid, p1.typname, - p1.typelem, p1.typlen, p1.typbyval -FROM pg_type AS p1 -WHERE p1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT - (p1.typelem != 0 AND p1.typlen > 0 AND NOT p1.typbyval); +SELECT t1.oid, t1.typname, + t1.typelem, t1.typlen, t1.typbyval +FROM pg_type AS t1 +WHERE t1.typsubscript = 'raw_array_subscript_handler'::regproc AND NOT + (t1.typelem != 0 AND t1.typlen > 0 AND NOT t1.typbyval); -- Check for bogus typanalyze routines -SELECT p1.oid, p1.typname, p2.oid, p2.proname -FROM pg_type AS p1, pg_proc AS p2 -WHERE p1.typanalyze = p2.oid AND NOT - (p2.pronargs = 1 AND - p2.proargtypes[0] = 'internal'::regtype AND - p2.prorettype = 'bool'::regtype AND NOT p2.proretset); +SELECT t1.oid, t1.typname, p1.oid, p1.proname +FROM pg_type AS t1, pg_proc AS p1 +WHERE t1.typanalyze = p1.oid AND NOT + (p1.pronargs = 1 AND + p1.proargtypes[0] = 'internal'::regtype AND + p1.prorettype = 'bool'::regtype AND NOT p1.proretset); -- there does not seem to be a reason to care about volatility of typanalyze @@ -384,23 +384,23 @@ ORDER BY 1; -- Look for illegal values in pg_class fields -SELECT p1.oid, p1.relname -FROM pg_class as p1 +SELECT c1.oid, c1.relname +FROM pg_class as c1 WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); -- All tables and indexes should have an access method. -SELECT p1.oid, p1.relname -FROM pg_class as p1 -WHERE p1.relkind NOT IN ('S', 'v', 'f', 'c') and - p1.relam = 0; +SELECT c1.oid, c1.relname +FROM pg_class as c1 +WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and + c1.relam = 0; -- Conversely, sequences, views, types shouldn't have them -SELECT p1.oid, p1.relname -FROM pg_class as p1 -WHERE p1.relkind IN ('S', 'v', 'f', 'c') and - p1.relam != 0; +SELECT c1.oid, c1.relname +FROM pg_class as c1 +WHERE c1.relkind IN ('S', 'v', 'f', 'c') and + c1.relam != 0; -- Indexes should have AMs of type 'i' SELECT pc.oid, pc.relname, pa.amname, pa.amtype @@ -418,83 +418,83 @@ WHERE pc.relkind IN ('r', 't', 'm') and -- Look for illegal values in pg_attribute fields -SELECT p1.attrelid, p1.attname -FROM pg_attribute as p1 -WHERE p1.attrelid = 0 OR p1.atttypid = 0 OR p1.attnum = 0 OR - p1.attcacheoff != -1 OR p1.attinhcount < 0 OR - (p1.attinhcount = 0 AND NOT p1.attislocal); +SELECT a1.attrelid, a1.attname +FROM pg_attribute as a1 +WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR + a1.attcacheoff != -1 OR a1.attinhcount < 0 OR + (a1.attinhcount = 0 AND NOT a1.attislocal); -- Cross-check attnum against parent relation -SELECT p1.attrelid, p1.attname, p2.oid, p2.relname -FROM pg_attribute AS p1, pg_class AS p2 -WHERE p1.attrelid = p2.oid AND p1.attnum > p2.relnatts; +SELECT a1.attrelid, a1.attname, c1.oid, c1.relname +FROM pg_attribute AS a1, pg_class AS c1 +WHERE a1.attrelid = c1.oid AND a1.attnum > c1.relnatts; -- Detect missing pg_attribute entries: should have as many non-system -- attributes as parent relation expects -SELECT p1.oid, p1.relname -FROM pg_class AS p1 -WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2 - WHERE p2.attrelid = p1.oid AND p2.attnum > 0); +SELECT c1.oid, c1.relname +FROM pg_class AS c1 +WHERE c1.relnatts != (SELECT count(*) FROM pg_attribute AS a1 + WHERE a1.attrelid = c1.oid AND a1.attnum > 0); -- Cross-check against pg_type entry -- NOTE: we allow attstorage to be 'plain' even when typstorage is not; -- this is mainly for toast tables. -SELECT p1.attrelid, p1.attname, p2.oid, p2.typname -FROM pg_attribute AS p1, pg_type AS p2 -WHERE p1.atttypid = p2.oid AND - (p1.attlen != p2.typlen OR - p1.attalign != p2.typalign OR - p1.attbyval != p2.typbyval OR - (p1.attstorage != p2.typstorage AND p1.attstorage != 'p')); +SELECT a1.attrelid, a1.attname, t1.oid, t1.typname +FROM pg_attribute AS a1, pg_type AS t1 +WHERE a1.atttypid = t1.oid AND + (a1.attlen != t1.typlen OR + a1.attalign != t1.typalign OR + a1.attbyval != t1.typbyval OR + (a1.attstorage != t1.typstorage AND a1.attstorage != 'p')); -- **************** pg_range **************** -- Look for illegal values in pg_range fields. -SELECT p1.rngtypid, p1.rngsubtype -FROM pg_range as p1 -WHERE p1.rngtypid = 0 OR p1.rngsubtype = 0 OR p1.rngsubopc = 0; +SELECT r.rngtypid, r.rngsubtype +FROM pg_range as r +WHERE r.rngtypid = 0 OR r.rngsubtype = 0 OR r.rngsubopc = 0; -- rngcollation should be specified iff subtype is collatable -SELECT p1.rngtypid, p1.rngsubtype, p1.rngcollation, t.typcollation -FROM pg_range p1 JOIN pg_type t ON t.oid = p1.rngsubtype +SELECT r.rngtypid, r.rngsubtype, r.rngcollation, t.typcollation +FROM pg_range r JOIN pg_type t ON t.oid = r.rngsubtype WHERE (rngcollation = 0) != (typcollation = 0); -- opclass had better be a btree opclass accepting the subtype. -- We must allow anyarray matches, cf IsBinaryCoercible() -SELECT p1.rngtypid, p1.rngsubtype, o.opcmethod, o.opcname -FROM pg_range p1 JOIN pg_opclass o ON o.oid = p1.rngsubopc +SELECT r.rngtypid, r.rngsubtype, o.opcmethod, o.opcname +FROM pg_range r JOIN pg_opclass o ON o.oid = r.rngsubopc WHERE o.opcmethod != 403 OR - ((o.opcintype != p1.rngsubtype) AND NOT + ((o.opcintype != r.rngsubtype) AND NOT (o.opcintype = 'pg_catalog.anyarray'::regtype AND EXISTS(select 1 from pg_catalog.pg_type where - oid = p1.rngsubtype and typelem != 0 and + oid = r.rngsubtype and typelem != 0 and typsubscript = 'array_subscript_handler'::regproc))); -- canonical function, if any, had better match the range type -SELECT p1.rngtypid, p1.rngsubtype, p.proname -FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngcanonical +SELECT r.rngtypid, r.rngsubtype, p.proname +FROM pg_range r JOIN pg_proc p ON p.oid = r.rngcanonical WHERE pronargs != 1 OR proargtypes[0] != rngtypid OR prorettype != rngtypid; -- subdiff function, if any, had better match the subtype -SELECT p1.rngtypid, p1.rngsubtype, p.proname -FROM pg_range p1 JOIN pg_proc p ON p.oid = p1.rngsubdiff +SELECT r.rngtypid, r.rngsubtype, p.proname +FROM pg_range r JOIN pg_proc p ON p.oid = r.rngsubdiff WHERE pronargs != 2 OR proargtypes[0] != rngsubtype OR proargtypes[1] != rngsubtype OR prorettype != 'pg_catalog.float8'::regtype; -- every range should have a valid multirange -SELECT p1.rngtypid, p1.rngsubtype, p1.rngmultitypid -FROM pg_range p1 -WHERE p1.rngmultitypid IS NULL OR p1.rngmultitypid = 0; +SELECT r.rngtypid, r.rngsubtype, r.rngmultitypid +FROM pg_range r +WHERE r.rngmultitypid IS NULL OR r.rngmultitypid = 0; -- Create a table that holds all the known in-core data types and leave it -- around so as pg_upgrade is able to test their binary compatibility. @@ -553,29 +553,24 @@ CREATE TABLE tab_core_types AS SELECT 'n'::information_schema.sql_identifier, 'now'::information_schema.time_stamp, 'YES'::information_schema.yes_or_no, - 'venus'::planets, - 'i16'::insenum, '(1,2)'::int4range, '{(1,2)}'::int4multirange, '(3,4)'::int8range, '{(3,4)}'::int8multirange, - '(1,2)'::float8range, '{(1,2)}'::float8multirange, '(3,4)'::numrange, '{(3,4)}'::nummultirange, - '(a,b)'::textrange, '{(a,b)}'::textmultirange, - '(12.34, 56.78)'::cashrange, '{(12.34, 56.78)}'::cashmultirange, '(2020-01-02, 2021-02-03)'::daterange, '{(2020-01-02, 2021-02-03)}'::datemultirange, '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tsrange, '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tsmultirange, '(2020-01-02 03:04:05, 2021-02-03 06:07:08)'::tstzrange, - '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange, - arrayrange(ARRAY[1,2], ARRAY[2,1]), - arraymultirange(arrayrange(ARRAY[1,2], ARRAY[2,1])); + '{(2020-01-02 03:04:05, 2021-02-03 06:07:08)}'::tstzmultirange; -- Sanity check on the previous table, checking that all core types are -- included in this table. -SELECT oid, typname, typtype, typelem, typarray, typarray +SELECT oid, typname, typtype, typelem, typarray FROM pg_type t - WHERE typtype NOT IN ('p', 'c') AND - -- reg* types cannot be pg_upgraded, so discard them. + WHERE oid < 16384 AND + -- Exclude pseudotypes and composite types. + typtype NOT IN ('p', 'c') AND + -- These reg* types cannot be pg_upgraded, so discard them. oid != ALL(ARRAY['regproc', 'regprocedure', 'regoper', 'regoperator', 'regconfig', 'regdictionary', 'regnamespace', 'regcollation']::regtype[]) AND diff --git a/third_party/spanner_pg/src/test/regress/sql/updatable_views.sql b/third_party/spanner_pg/src/test/regress/sql/updatable_views.sql index 08983f17..eaee0b7e 100644 --- a/third_party/spanner_pg/src/test/regress/sql/updatable_views.sql +++ b/third_party/spanner_pg/src/test/regress/sql/updatable_views.sql @@ -427,6 +427,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); @@ -569,8 +570,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 diff --git a/third_party/spanner_pg/src/test/regress/sql/varchar.sql b/third_party/spanner_pg/src/test/regress/sql/varchar.sql index 35e24b84..a9708214 100644 --- a/third_party/spanner_pg/src/test/regress/sql/varchar.sql +++ b/third_party/spanner_pg/src/test/regress/sql/varchar.sql @@ -2,7 +2,12 @@ -- VARCHAR -- -CREATE TABLE VARCHAR_TBL(f1 varchar(1)); +-- +-- Build a table for testing +-- (This temporarily hides the table created in test_setup.sql) +-- + +CREATE TEMP TABLE VARCHAR_TBL(f1 varchar(1)); INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); @@ -54,13 +59,10 @@ DROP TABLE VARCHAR_TBL; -- -- Now test longer arrays of char -- +-- This varchar_tbl was already created and filled in test_setup.sql. +-- Here we just try to insert bad values. +-- -CREATE TABLE VARCHAR_TBL(f1 varchar(4)); - -INSERT INTO VARCHAR_TBL (f1) VALUES ('a'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('ab'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd'); INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); -INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT * FROM VARCHAR_TBL; diff --git a/third_party/spanner_pg/src/test/regress/sql/window.sql b/third_party/spanner_pg/src/test/regress/sql/window.sql index eae5fa60..253c1b70 100644 --- a/third_party/spanner_pg/src/test/regress/sql/window.sql +++ b/third_party/spanner_pg/src/test/regress/sql/window.sql @@ -471,6 +471,72 @@ from window w as (order by x desc nulls last range between 2 preceding and 2 following); +-- There is a syntactic ambiguity in the SQL standard. Since +-- UNBOUNDED is a non-reserved word, it could be the name of a +-- function parameter and be used as an expression. There is a +-- grammar hack to resolve such cases as the keyword. The following +-- tests record this behavior. + +CREATE FUNCTION unbounded_syntax_test1a(x int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +BEGIN ATOMIC + SELECT sum(unique1) over (rows between x preceding and x following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +END; + +CREATE FUNCTION unbounded_syntax_test1b(x int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +AS $$ + SELECT sum(unique1) over (rows between x preceding and x following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +$$; + +-- These will apply the argument to the window specification inside the function. +SELECT * FROM unbounded_syntax_test1a(2); +SELECT * FROM unbounded_syntax_test1b(2); + +CREATE FUNCTION unbounded_syntax_test2a(unbounded int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +BEGIN ATOMIC + SELECT sum(unique1) over (rows between unbounded preceding and unbounded following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +END; + +CREATE FUNCTION unbounded_syntax_test2b(unbounded int) RETURNS TABLE (a int, b int, c int) +LANGUAGE SQL +AS $$ + SELECT sum(unique1) over (rows between unbounded preceding and unbounded following), + unique1, four + FROM tenk1 WHERE unique1 < 10; +$$; + +-- These will not apply the argument but instead treat UNBOUNDED as a keyword. +SELECT * FROM unbounded_syntax_test2a(2); +SELECT * FROM unbounded_syntax_test2b(2); + +DROP FUNCTION unbounded_syntax_test1a, unbounded_syntax_test1b, + unbounded_syntax_test2a, unbounded_syntax_test2b; + +-- Other tests with token UNBOUNDED in potentially problematic position +CREATE FUNCTION unbounded(x int) RETURNS int LANGUAGE SQL IMMUTABLE RETURN x; + +SELECT sum(unique1) over (rows between 1 preceding and 1 following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between unbounded(1) preceding and unbounded(1) following), + unique1, four +FROM tenk1 WHERE unique1 < 10; + +SELECT sum(unique1) over (rows between unbounded.x preceding and unbounded.x following), + unique1, four +FROM tenk1, (values (1)) as unbounded(x) WHERE unique1 < 10; + +DROP FUNCTION unbounded; + -- Check overflow behavior for various integer sizes select x, last_value(x) over (order by x::smallint range between current row and 2147450884 following) @@ -922,6 +988,242 @@ 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; + +-- 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 + (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; + +-- Ensure we get the correct run condition when the window function is both +-- monotonically increasing and decreasing. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER () c + FROM empsalary) emp +WHERE c = 1; + +-- 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 use a run condition when there's a volatile function in the +-- WindowFunc +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(random()) OVER (ORDER BY empno DESC) c + FROM empsalary) emp +WHERE c = 1; + +-- Ensure we don't use a run condition when the WindowFunc contains subplans +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count((SELECT 1)) OVER (ORDER BY empno DESC) c + FROM empsalary) emp +WHERE c = 1; + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/third_party/spanner_pg/src/test/regress/sql/with.sql b/third_party/spanner_pg/src/test/regress/sql/with.sql index dc36b7cc..b2103fa3 100644 --- a/third_party/spanner_pg/src/test/regress/sql/with.sql +++ b/third_party/spanner_pg/src/test/regress/sql/with.sql @@ -349,7 +349,7 @@ SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON -- SEARCH clause -create table graph0( f int, t int, label text ); +create temp table graph0( f int, t int, label text ); insert into graph0 values (1, 2, 'arc 1 -> 2'), @@ -524,8 +524,6 @@ select pg_get_viewdef('v_search'); select * from v_search; -drop table graph0 cascade; - -- -- test cycle detection -- @@ -570,6 +568,16 @@ select * from search_graph order by path; -- CYCLE clause +explain (verbose, costs off) +with recursive search_graph(f, t, label) as ( + select * from graph g + union all + select g.* + from graph g, search_graph sg + where g.f = sg.t +) cycle f, t set is_cycle using path +select * from search_graph; + with recursive search_graph(f, t, label) as ( select * from graph g union all @@ -1367,6 +1375,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; @@ -1498,7 +1562,7 @@ SELECT * FROM parent; EXPLAIN (VERBOSE, COSTS OFF) WITH wcte AS ( INSERT INTO int8_tbl VALUES ( 42, 47 ) RETURNING q2 ) -DELETE FROM a USING wcte WHERE aa = q2; +DELETE FROM a_star USING wcte WHERE aa = q2; -- error cases diff --git a/third_party/spanner_pg/src/test/regress/sql/xid.sql b/third_party/spanner_pg/src/test/regress/sql/xid.sql index 565714d4..bee17e63 100644 --- a/third_party/spanner_pg/src/test/regress/sql/xid.sql +++ b/third_party/spanner_pg/src/test/regress/sql/xid.sql @@ -41,8 +41,12 @@ select '1'::xid8 >= '2'::xid8, '2'::xid8 >= '2'::xid8, '2'::xid8 >= '1'::xid8; -- we also have a 3way compare for btrees select xid8cmp('1', '2'), xid8cmp('2', '2'), xid8cmp('2', '1'); --- xid8 has btree and hash opclasses +-- min() and max() for xid8 create table xid8_t1 (x xid8); +insert into xid8_t1 values ('0'), ('010'), ('42'), ('0xffffffffffffffff'), ('-1'); +select min(x), max(x) from xid8_t1; + +-- xid8 has btree and hash opclasses create index on xid8_t1 using btree(x); create index on xid8_t1 using hash(x); drop table xid8_t1; diff --git a/third_party/spanner_pg/src/test/regress/standby_schedule b/third_party/spanner_pg/src/test/regress/standby_schedule deleted file mode 100644 index 3ddb961c..00000000 --- a/third_party/spanner_pg/src/test/regress/standby_schedule +++ /dev/null @@ -1,21 +0,0 @@ -# src/test/regress/standby_schedule -# -# Test schedule for Hot Standby -# -# First test checks we are on a standby server. -# Subsequent tests rely upon a setup script having already -# been executed in the appropriate database on the primary server -# which is feeding WAL files to target standby. -# -# psql -f src/test/regress/sql/hs_primary_setup.sql regression -# -test: hs_standby_check -# -# These tests will pass on both primary and standby servers -# -test: hs_standby_allowed -# -# These tests will fail on a non-standby server -# -test: hs_standby_disallowed -test: hs_standby_functions diff --git a/third_party/spanner_pg/src/test/ssl/.gitignore b/third_party/spanner_pg/src/test/ssl/.gitignore index a325c2fe..e07b677a 100644 --- a/third_party/spanner_pg/src/test/ssl/.gitignore +++ b/third_party/spanner_pg/src/test/ssl/.gitignore @@ -1,3 +1,2 @@ # Generated by regression tests -/client-log /tmp_check/ diff --git a/third_party/spanner_pg/src/test/ssl/Makefile b/third_party/spanner_pg/src/test/ssl/Makefile index a517756c..12b02eb4 100644 --- a/third_party/spanner_pg/src/test/ssl/Makefile +++ b/third_party/spanner_pg/src/test/ssl/Makefile @@ -2,189 +2,32 @@ # # Makefile for src/test/ssl # -# 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 # # src/test/ssl/Makefile # #------------------------------------------------------------------------- +EXTRA_INSTALL = contrib/sslinfo + subdir = src/test/ssl top_builddir = ../../.. include $(top_builddir)/src/Makefile.global export with_ssl -CERTIFICATES := server_ca server-cn-and-alt-names \ - server-cn-only server-single-alt-name server-multiple-alt-names \ - server-no-names server-revoked server-ss \ - client_ca client client-dn client-revoked \ - root_ca - -SSLFILES := $(CERTIFICATES:%=ssl/%.key) $(CERTIFICATES:%=ssl/%.crt) \ - ssl/server-password.key \ - ssl/client.crl ssl/server.crl ssl/root.crl \ - ssl/both-cas-1.crt ssl/both-cas-2.crt \ - ssl/root+server_ca.crt ssl/root+server.crl \ - ssl/root+client_ca.crt ssl/root+client.crl \ - ssl/client+client_ca.crt ssl/client-der.key \ - ssl/client-encrypted-pem.key ssl/client-encrypted-der.key - -SSLDIRS := ssl/client-crldir ssl/server-crldir \ - ssl/root+client-crldir ssl/root+server-crldir - -# This target re-generates all the key and certificate files. Usually we just -# use the ones that are committed to the tree without rebuilding them. -# -# This target will fail unless preceded by sslfiles-clean. -# -sslfiles: $(SSLFILES) $(SSLDIRS) - -# OpenSSL requires a directory to put all generated certificates in. We don't -# use this for anything, but we need a location. -ssl/new_certs_dir: - mkdir ssl/new_certs_dir - -# Rule for creating private/public key pairs. -ssl/%.key: - openssl genrsa -out $@ 2048 - chmod 0600 $@ - -# Root CA certificate -ssl/root_ca.crt: ssl/root_ca.key cas.config - touch ssl/root_ca-certindex - openssl req -new -out ssl/root_ca.crt -x509 -config cas.config -config root_ca.config -key ssl/root_ca.key -days 10000 -extensions v3_ca - echo "01" > ssl/root_ca.srl - -# Client and server CAs -ssl/%_ca.crt: ssl/%_ca.key %_ca.config ssl/root_ca.crt ssl/new_certs_dir - touch ssl/$*_ca-certindex - echo "unique_subject=no" > ssl/$*_ca-certindex.attr - openssl req -new -out ssl/temp_ca.crt -config cas.config -config $*_ca.config -key ssl/$*_ca.key -# Sign the certificate with the root CA - openssl ca -name root_ca -batch -config cas.config -in ssl/temp_ca.crt -out ssl/temp_ca_signed.crt -extensions v3_ca - openssl x509 -in ssl/temp_ca_signed.crt -out ssl/$*_ca.crt # to keep just the PEM cert - rm ssl/temp_ca.crt ssl/temp_ca_signed.crt - echo "01" > ssl/$*_ca.srl - -# Server certificates, signed by server CA: -ssl/server-%.crt: ssl/server-%.key ssl/server_ca.crt server-%.config - openssl req -new -key ssl/server-$*.key -out ssl/server-$*.csr -config server-$*.config - openssl ca -name server_ca -batch -config cas.config -in ssl/server-$*.csr -out ssl/temp.crt -extensions v3_req -extfile server-$*.config - openssl x509 -in ssl/temp.crt -out ssl/server-$*.crt # to keep just the PEM cert - rm ssl/server-$*.csr - -# Self-signed version of server-cn-only.crt -ssl/server-ss.crt: ssl/server-cn-only.key ssl/server-cn-only.crt server-cn-only.config - openssl req -new -key ssl/server-cn-only.key -out ssl/server-ss.csr -config server-cn-only.config - openssl x509 -req -days 10000 -in ssl/server-ss.csr -signkey ssl/server-cn-only.key -out ssl/server-ss.crt -extensions v3_req -extfile server-cn-only.config - rm ssl/server-ss.csr - -# Password-protected version of server-cn-only.key -ssl/server-password.key: ssl/server-cn-only.key - openssl rsa -aes256 -in $< -out $@ -passout 'pass:secret1' - -# Client certificate, signed by the client CA: -ssl/client.crt: ssl/client.key ssl/client_ca.crt - openssl req -new -key ssl/client.key -out ssl/client.csr -config client.config - openssl ca -name client_ca -batch -out ssl/temp.crt -config cas.config -infiles ssl/client.csr - openssl x509 -in ssl/temp.crt -out ssl/client.crt # to keep just the PEM cert - rm ssl/client.csr ssl/temp.crt - -# Client certificate with multi-part DN, signed by the client CA: -ssl/client-dn.crt: ssl/client-dn.key ssl/client_ca.crt - openssl req -new -key ssl/client-dn.key -out ssl/client-dn.csr -config client-dn.config - openssl ca -name client_ca -batch -out ssl/temp.crt -config cas.config -infiles ssl/client-dn.csr - openssl x509 -in ssl/temp.crt -out ssl/client-dn.crt # to keep just the PEM cert - rm ssl/client-dn.csr ssl/temp.crt - -# Another client certificate, signed by the client CA. This one is revoked. -ssl/client-revoked.crt: ssl/client-revoked.key ssl/client_ca.crt client.config - openssl req -new -key ssl/client-revoked.key -out ssl/client-revoked.csr -config client.config - openssl ca -name client_ca -batch -out ssl/temp.crt -config cas.config -infiles ssl/client-revoked.csr - openssl x509 -in ssl/temp.crt -out ssl/client-revoked.crt # to keep just the PEM cert - rm ssl/client-revoked.csr ssl/temp.crt - -# Convert the key to DER, to test our behaviour there too -ssl/client-der.key: ssl/client.key - openssl rsa -in ssl/client.key -outform DER -out ssl/client-der.key - -# Convert the existing key to encrypted PEM (X.509 text) and DER (X.509 ASN.1) formats -# to test libpq's support for the sslpassword= option. -ssl/client-encrypted-pem.key: ssl/client.key - openssl rsa -in ssl/client.key -outform PEM -aes128 -passout 'pass:dUmmyP^#+' -out ssl/client-encrypted-pem.key - -ssl/client-encrypted-der.key: ssl/client.key - openssl rsa -in ssl/client.key -outform DER -aes128 -passout 'pass:dUmmyP^#+' -out ssl/client-encrypted-der.key - -# Root certificate files that contains both CA certificates, for testing -# that multiple certificates can be used. -ssl/both-cas-1.crt: ssl/root_ca.crt ssl/client_ca.crt ssl/server_ca.crt - cat $^ > $@ - -# The same, but the certs are in different order -ssl/both-cas-2.crt: ssl/root_ca.crt ssl/server_ca.crt ssl/client_ca.crt - cat $^ > $@ - -# A root certificate file for the client, to validate server certs. -ssl/root+server_ca.crt: ssl/root_ca.crt ssl/server_ca.crt - cat $^ > $@ - -# and for the server, to validate client certs -ssl/root+client_ca.crt: ssl/root_ca.crt ssl/client_ca.crt - cat $^ > $@ - -ssl/client+client_ca.crt: ssl/client.crt ssl/client_ca.crt - cat $^ > $@ - -#### CRLs - -ssl/client.crl: ssl/client-revoked.crt - openssl ca -config cas.config -name client_ca -revoke ssl/client-revoked.crt - openssl ca -config cas.config -name client_ca -gencrl -out ssl/client.crl - -ssl/server.crl: ssl/server-revoked.crt - openssl ca -config cas.config -name server_ca -revoke ssl/server-revoked.crt - openssl ca -config cas.config -name server_ca -gencrl -out ssl/server.crl - -ssl/root.crl: ssl/root_ca.crt - openssl ca -config cas.config -name root_ca -gencrl -out ssl/root.crl - -# If a CRL is used, OpenSSL requires a CRL file for *all* the CAs in the -# chain, even if some of them are empty. -ssl/root+server.crl: ssl/root.crl ssl/server.crl - cat $^ > $@ -ssl/root+client.crl: ssl/root.crl ssl/client.crl - cat $^ > $@ - -ssl/root+server-crldir: ssl/server.crl ssl/root.crl - mkdir ssl/root+server-crldir - cp ssl/server.crl ssl/root+server-crldir/`openssl crl -hash -noout -in ssl/server.crl`.r0 - cp ssl/root.crl ssl/root+server-crldir/`openssl crl -hash -noout -in ssl/root.crl`.r0 - -ssl/root+client-crldir: ssl/client.crl ssl/root.crl - mkdir ssl/root+client-crldir - cp ssl/client.crl ssl/root+client-crldir/`openssl crl -hash -noout -in ssl/client.crl`.r0 - cp ssl/root.crl ssl/root+client-crldir/`openssl crl -hash -noout -in ssl/root.crl`.r0 - -ssl/server-crldir: ssl/server.crl - mkdir ssl/server-crldir - cp ssl/server.crl ssl/server-crldir/`openssl crl -hash -noout -in ssl/server.crl`.r0 - -ssl/client-crldir: ssl/client.crl - mkdir ssl/client-crldir - cp ssl/client.crl ssl/client-crldir/`openssl crl -hash -noout -in ssl/client.crl`.r0 - -.PHONY: sslfiles-clean -sslfiles-clean: - rm -f $(SSLFILES) ssl/client_ca.srl ssl/server_ca.srl ssl/client_ca-certindex* ssl/server_ca-certindex* ssl/root_ca-certindex* ssl/root_ca.srl ssl/temp_ca.crt ssl/temp_ca_signed.crt - rm -rf $(SSLDIRS) +# The sslfiles targets are separated into their own file due to interactions +# with settings in Makefile.global. +.PHONY: sslfiles sslfiles-clean +sslfiles sslfiles-clean: + $(MAKE) -f $(srcdir)/sslfiles.mk $@ clean distclean maintainer-clean: rm -rf tmp_check - rm -rf ssl/*.old ssl/new_certs_dir ssl/client*_tmp.key + $(MAKE) -f $(srcdir)/sslfiles.mk $@ -# Doesn't depend on $(SSLFILES) because we don't rebuild them by default +# Doesn't depend on sslfiles because we don't rebuild them by default check: $(prove_check) diff --git a/third_party/spanner_pg/src/test/ssl/README b/third_party/spanner_pg/src/test/ssl/README index 84baa478..ff55697c 100644 --- a/third_party/spanner_pg/src/test/ssl/README +++ b/third_party/spanner_pg/src/test/ssl/README @@ -16,6 +16,8 @@ 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/sslinfo in addition to the core code. Run make check @@ -29,6 +31,8 @@ sources and then tested. Either way, this test initializes, starts, and stops a test Postgres cluster that is accessible to other local users! +See src/test/perl/README for more info about running these tests. + Certificates ============ @@ -52,9 +56,6 @@ server-no-names server certificates, with small variations in the hostnames present in the certificate. Signed by server_ca. -server-ss - same as server-cn-only, but self-signed. - server-password same as server-cn-only, but password-protected. @@ -88,7 +89,10 @@ There are also CRLs for each of the CAs: root.crl, server.crl and client.crl. For convenience, all of these keypairs and certificates are included in the ssl/ subdirectory. The Makefile also contains a rule, "make sslfiles", to -recreate them if you need to make changes. +recreate them if you need to make changes. "make sslfiles-clean" is required +in order to recreate the full set of keypairs and certificates. To rebuild +separate files, touch (or remove) the files in question and run "make sslfiles". +This step requires at least OpenSSL 1.1.1. TODO ==== diff --git a/third_party/spanner_pg/src/test/ssl/cas.config b/third_party/spanner_pg/src/test/ssl/conf/cas.config similarity index 93% rename from third_party/spanner_pg/src/test/ssl/cas.config rename to third_party/spanner_pg/src/test/ssl/conf/cas.config index 8c0ef6d8..2c485103 100644 --- a/third_party/spanner_pg/src/test/ssl/cas.config +++ b/third_party/spanner_pg/src/test/ssl/conf/cas.config @@ -1,12 +1,5 @@ # This file contains the configuration for all the CAs. -[ req ] -prompt = no - -# Extensions for CA certs -[ v3_ca ] -basicConstraints = CA:true - # Root CA, used to sign the certificates of the intermediary server and # client CAs. [ root_ca ] @@ -21,6 +14,7 @@ private_key = ./ssl/root_ca.key new_certs_dir = ./ssl/new_certs_dir policy = policy_match email_in_dn = no +copy_extensions = copy # CA used to sign all the server certificates. [ server_ca ] @@ -35,6 +29,7 @@ new_certs_dir = ./ssl/new_certs_dir serial = ./ssl/server_ca.srl policy = policy_match email_in_dn = no +copy_extensions = copy unique_subject = no crl = ./ssl/server.crl @@ -51,6 +46,7 @@ new_certs_dir = ./ssl/new_certs_dir serial = ./ssl/client_ca.srl policy = policy_match email_in_dn = no +copy_extensions = copy unique_subject = no crl = ./ssl/client.crl diff --git a/third_party/spanner_pg/src/test/ssl/client-dn.config b/third_party/spanner_pg/src/test/ssl/conf/client-dn.config similarity index 97% rename from third_party/spanner_pg/src/test/ssl/client-dn.config rename to third_party/spanner_pg/src/test/ssl/conf/client-dn.config index ee2df54b..0c71d831 100644 --- a/third_party/spanner_pg/src/test/ssl/client-dn.config +++ b/third_party/spanner_pg/src/test/ssl/conf/client-dn.config @@ -13,4 +13,3 @@ O = PGDG CN = ssltestuser-dn # no extensions in client certs -[ v3_req ] diff --git a/third_party/spanner_pg/src/test/ssl/conf/client-revoked.config b/third_party/spanner_pg/src/test/ssl/conf/client-revoked.config new file mode 100644 index 00000000..3b82b571 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/conf/client-revoked.config @@ -0,0 +1,13 @@ +# An OpenSSL format CSR config file for creating a client certificate. +# +# This is identical to the client.config certificate, but this one is revoked +# later. + +[ req ] +distinguished_name = req_distinguished_name +prompt = no + +[ req_distinguished_name ] +CN = ssltestuser + +# no extensions in client certs diff --git a/third_party/spanner_pg/src/test/ssl/client.config b/third_party/spanner_pg/src/test/ssl/conf/client.config similarity index 96% rename from third_party/spanner_pg/src/test/ssl/client.config rename to third_party/spanner_pg/src/test/ssl/conf/client.config index 2e9d40d2..26fc2571 100644 --- a/third_party/spanner_pg/src/test/ssl/client.config +++ b/third_party/spanner_pg/src/test/ssl/conf/client.config @@ -10,4 +10,3 @@ prompt = no CN = ssltestuser # no extensions in client certs -[ v3_req ] diff --git a/third_party/spanner_pg/src/test/ssl/client_ca.config b/third_party/spanner_pg/src/test/ssl/conf/client_ca.config similarity index 81% rename from third_party/spanner_pg/src/test/ssl/client_ca.config rename to third_party/spanner_pg/src/test/ssl/conf/client_ca.config index ef93d598..5990f060 100644 --- a/third_party/spanner_pg/src/test/ssl/client_ca.config +++ b/third_party/spanner_pg/src/test/ssl/conf/client_ca.config @@ -6,6 +6,11 @@ [ req ] distinguished_name = req_distinguished_name prompt = no +req_extensions = v3_ca [ req_distinguished_name ] CN = Test CA for PostgreSQL SSL regression test client certs + +# Extensions for CA certs +[ v3_ca ] +basicConstraints = CA:true diff --git a/third_party/spanner_pg/src/test/ssl/conf/client_ext.config b/third_party/spanner_pg/src/test/ssl/conf/client_ext.config new file mode 100644 index 00000000..c2dbfef9 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/conf/client_ext.config @@ -0,0 +1,16 @@ +# An OpenSSL format CSR config file for creating a client certificate. +# +# The certificate is for user "ssltestuser" and intends to test client +# certificate with extensions. + +[ req ] +distinguished_name = req_distinguished_name +req_extensions = client_ext +prompt = no + +[ req_distinguished_name ] +CN = ssltestuser + +[ client_ext ] +basicConstraints = critical,CA:false +extendedKeyUsage = clientAuth diff --git a/third_party/spanner_pg/src/test/ssl/root_ca.config b/third_party/spanner_pg/src/test/ssl/conf/root_ca.config similarity index 92% rename from third_party/spanner_pg/src/test/ssl/root_ca.config rename to third_party/spanner_pg/src/test/ssl/conf/root_ca.config index 187a9b8a..e193186f 100644 --- a/third_party/spanner_pg/src/test/ssl/root_ca.config +++ b/third_party/spanner_pg/src/test/ssl/conf/root_ca.config @@ -4,6 +4,7 @@ [ req ] distinguished_name = req_distinguished_name prompt = no +x509_extensions = v3_ca [ req_distinguished_name ] CN = Test root CA for PostgreSQL SSL regression test suite diff --git a/third_party/spanner_pg/src/test/ssl/server-cn-and-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-cn-and-alt-names.config similarity index 100% rename from third_party/spanner_pg/src/test/ssl/server-cn-and-alt-names.config rename to third_party/spanner_pg/src/test/ssl/conf/server-cn-and-alt-names.config diff --git a/third_party/spanner_pg/src/test/ssl/conf/server-cn-and-ip-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-cn-and-ip-alt-names.config new file mode 100644 index 00000000..a6fa09ba --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/server-cn-only.config b/third_party/spanner_pg/src/test/ssl/conf/server-cn-only.config similarity index 85% rename from third_party/spanner_pg/src/test/ssl/server-cn-only.config rename to third_party/spanner_pg/src/test/ssl/conf/server-cn-only.config index 1e5d5822..9edb7b7a 100644 --- a/third_party/spanner_pg/src/test/ssl/server-cn-only.config +++ b/third_party/spanner_pg/src/test/ssl/conf/server-cn-only.config @@ -9,5 +9,4 @@ prompt = no CN = common-name.pg-ssltest.test OU = PostgreSQL test suite -# For Subject Alternative Names -[ v3_req ] +# No Subject Alternative Names diff --git a/third_party/spanner_pg/src/test/ssl/conf/server-ip-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-ip-alt-names.config new file mode 100644 index 00000000..c22f2295 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-and-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-and-alt-names.config new file mode 100644 index 00000000..a4087f0a --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-and-dns-alt-names.config new file mode 100644 index 00000000..7121803b --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-only.config b/third_party/spanner_pg/src/test/ssl/conf/server-ip-cn-only.config new file mode 100644 index 00000000..585d8bda --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/conf/server-ip-in-dnsname.config b/third_party/spanner_pg/src/test/ssl/conf/server-ip-in-dnsname.config new file mode 100644 index 00000000..b15649ae --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/server-multiple-alt-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-multiple-alt-names.config similarity index 100% rename from third_party/spanner_pg/src/test/ssl/server-multiple-alt-names.config rename to third_party/spanner_pg/src/test/ssl/conf/server-multiple-alt-names.config diff --git a/third_party/spanner_pg/src/test/ssl/server-no-names.config b/third_party/spanner_pg/src/test/ssl/conf/server-no-names.config similarity index 85% rename from third_party/spanner_pg/src/test/ssl/server-no-names.config rename to third_party/spanner_pg/src/test/ssl/conf/server-no-names.config index 2a71125a..89075dec 100644 --- a/third_party/spanner_pg/src/test/ssl/server-no-names.config +++ b/third_party/spanner_pg/src/test/ssl/conf/server-no-names.config @@ -10,7 +10,4 @@ prompt = no [ req_distinguished_name ] OU = PostgreSQL test suite -# For Subject Alternative Names -[ v3_req ] - -[ alt_names ] +# No Subject Alternative Names diff --git a/third_party/spanner_pg/src/test/ssl/server-revoked.config b/third_party/spanner_pg/src/test/ssl/conf/server-revoked.config similarity index 88% rename from third_party/spanner_pg/src/test/ssl/server-revoked.config rename to third_party/spanner_pg/src/test/ssl/conf/server-revoked.config index 47ef6462..c9e1f5d4 100644 --- a/third_party/spanner_pg/src/test/ssl/server-revoked.config +++ b/third_party/spanner_pg/src/test/ssl/conf/server-revoked.config @@ -11,5 +11,4 @@ prompt = no CN = common-name.pg-ssltest.test OU = PostgreSQL test suite -# For Subject Alternative Names -[ v3_req ] +# No Subject Alternative Names diff --git a/third_party/spanner_pg/src/test/ssl/conf/server-rsapss.config b/third_party/spanner_pg/src/test/ssl/conf/server-rsapss.config new file mode 100644 index 00000000..391f9b8d --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/conf/server-rsapss.config @@ -0,0 +1,14 @@ +# An OpenSSL format CSR config file for creating a server certificate. +# +# This is identical to server-cn-only certificate, but we specify +# RSA-PSS as the algorithm on the command line. + +[ req ] +distinguished_name = req_distinguished_name +prompt = no + +[ req_distinguished_name ] +CN = common-name.pg-ssltest.test +OU = PostgreSQL test suite + +# No Subject Alternative Names \ No newline at end of file diff --git a/third_party/spanner_pg/src/test/ssl/server-single-alt-name.config b/third_party/spanner_pg/src/test/ssl/conf/server-single-alt-name.config similarity index 100% rename from third_party/spanner_pg/src/test/ssl/server-single-alt-name.config rename to third_party/spanner_pg/src/test/ssl/conf/server-single-alt-name.config diff --git a/third_party/spanner_pg/src/test/ssl/server_ca.config b/third_party/spanner_pg/src/test/ssl/conf/server_ca.config similarity index 81% rename from third_party/spanner_pg/src/test/ssl/server_ca.config rename to third_party/spanner_pg/src/test/ssl/conf/server_ca.config index d6126d51..496aaba2 100644 --- a/third_party/spanner_pg/src/test/ssl/server_ca.config +++ b/third_party/spanner_pg/src/test/ssl/conf/server_ca.config @@ -6,6 +6,11 @@ [ req ] distinguished_name = req_distinguished_name prompt = no +req_extensions = v3_ca [ req_distinguished_name ] CN = Test CA for PostgreSQL SSL regression test server certs + +# Extensions for CA certs +[ v3_ca ] +basicConstraints = CA:true diff --git a/third_party/spanner_pg/src/test/ssl/ssl/.gitignore b/third_party/spanner_pg/src/test/ssl/ssl/.gitignore index af753d4c..9d5fd278 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/.gitignore +++ b/third_party/spanner_pg/src/test/ssl/ssl/.gitignore @@ -1,3 +1,2 @@ /*.old /new_certs_dir/ -/client*_tmp.key diff --git a/third_party/spanner_pg/src/test/ssl/ssl/both-cas-1.crt b/third_party/spanner_pg/src/test/ssl/ssl/both-cas-1.crt index 37ffa101..4f4bc707 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/both-cas-1.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/both-cas-1.crt @@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIUEAgXJ/ibw6TVTUoomlBsPMfVTlMwDQYJKoZIhvcNAQEL +MIIDHjCCAgagAwIBAgIUF+e8lCA0vD0zKtxIDVPdDY/IkgUwDQYJKoZIhvcNAQEL BQAwQDE+MDwGA1UEAww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCBy -ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYwNDE0MTM0 -MDU0WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM +ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIx +MjA3WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM IHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALZ81vKKBJlxgjwuNoK67I4IE9zfSLb0eHbgZwZxDVzdmFejARrHlWk3 +MK7Nav7RLSJ990am33zb58CTHc7YYVlBp07+PwLXzypqWkhYfok1OYYjyjCrFDs @@ -10,48 +10,48 @@ sjcJI3hRCZNEz+wYsG+tdYWJ+gRPQOWfh0YfO2rFgXAIMLiF6lyWzf1eOM+OjYrF /eyzwbMaJkkGa/AyZKz3wZiPq0jTuYLVmH4MK7MBOsUfSmsBsn/ohyRCQzM+ol0v Qlsrulj8usponRPDh9ng4PB5OSgR79YimQZnASQzJxiUvMADrKL5L6KwLxJlzbqY R0b5mLh8KBzBQmSh3Aj2e2I7Z17hdaMCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEASzA7ApbuKn8lkC706gRL37a33yTZZ8rjZ4dnvCtq -6OltlYDJ8IndotKbLH0SUEAxrvcaFnMt7AX9pRf2sGBKbY8zcxqPfsvzVehgx4Ea -1RYksFW4h97jj1a1RKukTKuEOEEipbxwo0rLxfjvdaf2izqchJsLGtbocIZf0bD8 -djbE9jOLkx7saL08qC8ECrf9utsee+LJCsUYbNgYyIItEy6yVnmF/ICz93Utn1cI -RfqZr1lM2Ia2LP9eDTmiuR9m+/MzkeRvvJHonNrRJHlcggtYHICvYioh9/jALBcm -wZ+hTUePVqy4hOCBJ975CXjfKFN4MKQAdeB3EO5eBYAD3Q== +BgkqhkiG9w0BAQsFAAOCAQEAY6h2MurDkE2LAG3TPhTrAczflR3np6y1cDxeRzRi +br2bczXVfgWDsBZDhKXdIQldYQhAUU7u09GtAtujWnkJguPuVtlhEfuW/eXpcBI2 +XQnrkaTqjD/DDMJGijNVAXEHSecEls6uEuuSCxmm7hVD781Aqo0HlLPDhTEkko6r +IYFO0QyFG+oFSVhUp2KuarQNHVgopOmWbtbrq2KqaL5Gm5AXPSRzEhIeobYdSnTe +OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s +kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75x7yuQ1+gK8j -1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMtOCrVKllsdC+S -1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWsJwme87VaFrL+ -B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8TXe+XEnRfW9KX -P3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXabdCH41j0F/0yc -kctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSOYbGmBCdBdYK7 -RTcnJQv9AgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AB6zh/Jw+t232100Tztr7wJoKH8DL1hnSm3e7omdj0WlKfuZwTqDuMzB3H4LOSnS -A00XpyMAGAJC6yRjS8pt+pjY5Jt6ouSqf6wNq0mF0jiIDeg1k/GNEjigx+0ITqbE -lUJ56AcpoBNhOwBjOCRFh4JuspHZqHXgUNYTEicClbV+lZwoMIIK1e6FYRZDqMtL -+34GtZACImqvRkP5alqQg7hJUM1zbDVf2qebY4cfSu4OfTu6Og6KrL8Cu6bqR2et -0a/TbthHYz1QGDYRoVTSP4uWoG9M1ZbsA/bNE2eqcrQj+dJ4AmIIr8Yl8mrwo/FZ -SvgeLMlQY7UNwLUDtwy9QkI= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce +8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq +1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ +nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v +lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh ++NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx +pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x +QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r +vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 +swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A +ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi +GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiSnYZbmc9vpCt -Ku1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45YD7Nq0kBCq3dH -t2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7XdRbRR6we1s9VG -/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7AOyoLEJlNS0B -QW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hynon/nQQvBP77 -SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMBW4L4VaGg3W6F -h6iuJwRfAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AFlcKTaU/Ug3Q0hr3P1UQ6dWyK4aVn9rs4jvVfFl0a0RnbBowqK2C+zQVUWYTcjo -KHREVje65goj6VzRB6ko/9mAQ6PZP8jRuRhfCmvmvSQ/mWdgPzSRsUh9MwgEm9c2 -vNbqwaznEU8cYZnLpHiR9O5S7/qWWxehjYtxk5Eb4J006YglYfHnhrRFJvPbiqlf -IOEivZ7gIVfvaOTbLjmN2kLOnzdlwpXGjxxg4Nu9ZhXOhfrplzUvRfmqvVsDiHXb -USIdX+OFZZqr64IKG4drT4K4Bt2wupOEyX4ZFsUXXd+Hgq83SWmV4wzflcpmGkLC -JZ3CEMu8/WA5uQBXdQUozlE= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 +GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z +atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 +UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs +qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J +/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC ++FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb +QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F +0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 +UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 +xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA +OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/both-cas-2.crt b/third_party/spanner_pg/src/test/ssl/ssl/both-cas-2.crt index 2f2723f2..01d0c4d6 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/both-cas-2.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/both-cas-2.crt @@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIUEAgXJ/ibw6TVTUoomlBsPMfVTlMwDQYJKoZIhvcNAQEL +MIIDHjCCAgagAwIBAgIUF+e8lCA0vD0zKtxIDVPdDY/IkgUwDQYJKoZIhvcNAQEL BQAwQDE+MDwGA1UEAww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCBy -ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYwNDE0MTM0 -MDU0WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM +ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIx +MjA3WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM IHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALZ81vKKBJlxgjwuNoK67I4IE9zfSLb0eHbgZwZxDVzdmFejARrHlWk3 +MK7Nav7RLSJ990am33zb58CTHc7YYVlBp07+PwLXzypqWkhYfok1OYYjyjCrFDs @@ -10,48 +10,48 @@ sjcJI3hRCZNEz+wYsG+tdYWJ+gRPQOWfh0YfO2rFgXAIMLiF6lyWzf1eOM+OjYrF /eyzwbMaJkkGa/AyZKz3wZiPq0jTuYLVmH4MK7MBOsUfSmsBsn/ohyRCQzM+ol0v Qlsrulj8usponRPDh9ng4PB5OSgR79YimQZnASQzJxiUvMADrKL5L6KwLxJlzbqY R0b5mLh8KBzBQmSh3Aj2e2I7Z17hdaMCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEASzA7ApbuKn8lkC706gRL37a33yTZZ8rjZ4dnvCtq -6OltlYDJ8IndotKbLH0SUEAxrvcaFnMt7AX9pRf2sGBKbY8zcxqPfsvzVehgx4Ea -1RYksFW4h97jj1a1RKukTKuEOEEipbxwo0rLxfjvdaf2izqchJsLGtbocIZf0bD8 -djbE9jOLkx7saL08qC8ECrf9utsee+LJCsUYbNgYyIItEy6yVnmF/ICz93Utn1cI -RfqZr1lM2Ia2LP9eDTmiuR9m+/MzkeRvvJHonNrRJHlcggtYHICvYioh9/jALBcm -wZ+hTUePVqy4hOCBJ975CXjfKFN4MKQAdeB3EO5eBYAD3Q== +BgkqhkiG9w0BAQsFAAOCAQEAY6h2MurDkE2LAG3TPhTrAczflR3np6y1cDxeRzRi +br2bczXVfgWDsBZDhKXdIQldYQhAUU7u09GtAtujWnkJguPuVtlhEfuW/eXpcBI2 +XQnrkaTqjD/DDMJGijNVAXEHSecEls6uEuuSCxmm7hVD781Aqo0HlLPDhTEkko6r +IYFO0QyFG+oFSVhUp2KuarQNHVgopOmWbtbrq2KqaL5Gm5AXPSRzEhIeobYdSnTe +OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s +kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiSnYZbmc9vpCt -Ku1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45YD7Nq0kBCq3dH -t2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7XdRbRR6we1s9VG -/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7AOyoLEJlNS0B -QW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hynon/nQQvBP77 -SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMBW4L4VaGg3W6F -h6iuJwRfAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AFlcKTaU/Ug3Q0hr3P1UQ6dWyK4aVn9rs4jvVfFl0a0RnbBowqK2C+zQVUWYTcjo -KHREVje65goj6VzRB6ko/9mAQ6PZP8jRuRhfCmvmvSQ/mWdgPzSRsUh9MwgEm9c2 -vNbqwaznEU8cYZnLpHiR9O5S7/qWWxehjYtxk5Eb4J006YglYfHnhrRFJvPbiqlf -IOEivZ7gIVfvaOTbLjmN2kLOnzdlwpXGjxxg4Nu9ZhXOhfrplzUvRfmqvVsDiHXb -USIdX+OFZZqr64IKG4drT4K4Bt2wupOEyX4ZFsUXXd+Hgq83SWmV4wzflcpmGkLC -JZ3CEMu8/WA5uQBXdQUozlE= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 +GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z +atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 +UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs +qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J +/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC ++FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb +QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F +0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 +UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 +xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA +OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75x7yuQ1+gK8j -1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMtOCrVKllsdC+S -1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWsJwme87VaFrL+ -B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8TXe+XEnRfW9KX -P3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXabdCH41j0F/0yc -kctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSOYbGmBCdBdYK7 -RTcnJQv9AgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AB6zh/Jw+t232100Tztr7wJoKH8DL1hnSm3e7omdj0WlKfuZwTqDuMzB3H4LOSnS -A00XpyMAGAJC6yRjS8pt+pjY5Jt6ouSqf6wNq0mF0jiIDeg1k/GNEjigx+0ITqbE -lUJ56AcpoBNhOwBjOCRFh4JuspHZqHXgUNYTEicClbV+lZwoMIIK1e6FYRZDqMtL -+34GtZACImqvRkP5alqQg7hJUM1zbDVf2qebY4cfSu4OfTu6Og6KrL8Cu6bqR2et -0a/TbthHYz1QGDYRoVTSP4uWoG9M1ZbsA/bNE2eqcrQj+dJ4AmIIr8Yl8mrwo/FZ -SvgeLMlQY7UNwLUDtwy9QkI= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce +8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq +1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ +nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v +lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh ++NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx +pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x +QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r +vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 +swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A +ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi +GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client+client_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/client+client_ca.crt index 2804527f..7fafa14d 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client+client_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/client+client_ca.crt @@ -1,36 +1,37 @@ -----BEGIN CERTIFICATE----- -MIICzDCCAbQCAQEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNsaWVudCBjZXJ0czAe -Fw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBYxFDASBgNVBAMMC3NzbHRl -c3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtIugLqHywEAE -vyRZGMVAkdk1zCa5FFaPOEFhHiAMpwFOEIEi4Svk9kSSRecmeJcody1sLNoFqtTA -b5tYaDoGIVZfc8/kxm8sbsTE/3JOsON3CMqjOQkI1ZKjDSF1gtrGSmatgjqsMnlP -UJkFEsPhFg6NTf1ZUjFiQeWEli0fQJ2/k+7MI4S0t0pDJJJWrqF4l6eSgu8rsBoX -XHy4OLAz6j23r2k5FZs6H/poII95ia+E8hG8SrJmMa88naRdq7hHW802Z6lEhnRW -ND+tDGjt0ZaTfxx+CxN4UjgbboOJifTykVHjuzBR1+IzLHcxoZCLP1cjadSqMz5b -ziJTGtHzYwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAcIGps6BnsRxkN5sphg6GK -tzDvp2IUyOu5oeAHdJLT5JFZhKKzhDD4KiOv+XWzdHcSAl3xMqAqnFdSTCt2vtc+ -rk04eyVWJALyf6oPT60Vn5sFaaxlTg1+tnZMCCycDxM6lc/6onzgp6DUWGozlgSh -eNgCyaNU73VTuMgd+s/QrZ5HCr0OPAb3aWRQy7hVZeOniNBXWrO/CC2Swfwz7jU3 -dvLAWYENUvZlE2S7HnQGclGIJb38qFCnquuSgmO9yT30Lmmwp33k5/evN9cNQMxU -c4ChYCaabOGXUaBJNzJAYMEUHh+o+LPgFF2iB0mL7FAUip9XsjOiOwcrbusM/g+2 +MIIC0zCCAbsCCCAhAwMUEgcAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD +DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSL +oC6h8sBABL8kWRjFQJHZNcwmuRRWjzhBYR4gDKcBThCBIuEr5PZEkkXnJniXKHct +bCzaBarUwG+bWGg6BiFWX3PP5MZvLG7ExP9yTrDjdwjKozkJCNWSow0hdYLaxkpm +rYI6rDJ5T1CZBRLD4RYOjU39WVIxYkHlhJYtH0Cdv5PuzCOEtLdKQySSVq6heJen +koLvK7AaF1x8uDiwM+o9t69pORWbOh/6aCCPeYmvhPIRvEqyZjGvPJ2kXau4R1vN +NmepRIZ0VjQ/rQxo7dGWk38cfgsTeFI4G26DiYn08pFR47swUdfiMyx3MaGQiz9X +I2nUqjM+W84iUxrR82MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACSZo32raJHcB +rYHeomzynmzgMVBHSA4XsXZVQw4+zBUER+/ZdQbtw6F/qdeWRvTl8TJjwoydta7u +4gUkgAnQhYm2f8XEBe/+MUegH+y54Yk6rtmkdLxJLGKZ0IUfYkn20sg/NZrltbog +A8glWRGVD8cEOaxUaNSQ4Xqmqsqjd6Kh8snVfIIcWgKgnTNgyapM5ePBpS2IREhN +u9fjikQQf6F/dycsm22OP7aWsp1XPs3nqnoq9ZnhQrITMwsGcjbU7+v8La2GbiJV +8yAy136NSXUujIG/8eqhICWZPqj+KbdVZupOsUeVoeuSwLXJjm4GWY0xH92emqCI +ac+HriJv5w== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75x7yuQ1+gK8j -1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMtOCrVKllsdC+S -1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWsJwme87VaFrL+ -B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8TXe+XEnRfW9KX -P3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXabdCH41j0F/0yc -kctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSOYbGmBCdBdYK7 -RTcnJQv9AgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AB6zh/Jw+t232100Tztr7wJoKH8DL1hnSm3e7omdj0WlKfuZwTqDuMzB3H4LOSnS -A00XpyMAGAJC6yRjS8pt+pjY5Jt6ouSqf6wNq0mF0jiIDeg1k/GNEjigx+0ITqbE -lUJ56AcpoBNhOwBjOCRFh4JuspHZqHXgUNYTEicClbV+lZwoMIIK1e6FYRZDqMtL -+34GtZACImqvRkP5alqQg7hJUM1zbDVf2qebY4cfSu4OfTu6Og6KrL8Cu6bqR2et -0a/TbthHYz1QGDYRoVTSP4uWoG9M1ZbsA/bNE2eqcrQj+dJ4AmIIr8Yl8mrwo/FZ -SvgeLMlQY7UNwLUDtwy9QkI= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce +8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq +1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ +nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v +lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh ++NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx +pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x +QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r +vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 +swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A +ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi +GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 b/third_party/spanner_pg/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 index a667680e..d93791b8 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf -8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p -xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4 -pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG -nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9 -2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwEXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAC1AJ+HhHg74uXNXdoXLnqDhowdx1y3z +GKSTPH4iW6jvGp7mMeJhq7cx5kzC+Rqtjui7FjkXbvGd4f6ZVKf30tDD/LvVLxLU +Up7TmwZjYHbB4NPMyMyqUxtusjYm6HFhbfJwf11TQFwF9yRN3MI4os3J9KTzvhY1 +AvfyEqhBdeygkc1cDduZD+cx7QFYtaeD316q4lz8yfegtxwng8/JDlThu72zdpWV +w0LuzLei1A9cPXoXfMxRGVEOrDt5z3ArNqdD0bnXTTYqm1IX8ZRHDNeUi4NuFCCu +tKWT4j9ad4mMcJ6TY/8MiJ14mSJmWSR8115QT69rrQIdDu0sA/sBJX0= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client-dn.crt b/third_party/spanner_pg/src/test/ssl/ssl/client-dn.crt index f2f6a62d..0db14e59 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client-dn.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/client-dn.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNsaWVudCBjZXJ0czAe -Fw0yMTAzMDUyMDUyNDVaFw00ODA3MjEyMDUyNDVaMFAxDTALBgNVBAoMBFBHREcx -FDASBgNVBAsMC0VuZ2luZWVyaW5nMRAwDgYDVQQLDAdUZXN0aW5nMRcwFQYDVQQD -DA5zc2x0ZXN0dXNlci1kbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AMRLriq2Sh8+N4bhVtRUp/MAEsLQK6u/GotMSmiSr9K31YBYOvNzw8liKt4Rmnh5 -zmsdXJBW8erPNpkUAy9tFRCAx0YobhWCSfyX3orEdrhDrLFihA62zXQC69T0u4Yp -PSXGd0yCAcOZERQ4CQVgqnsh7Kmx5QaQnqxaz4OVPArWFJP4RQBT/l+r+kCeAn6h -qvbSbxY3FoCElQq0EF5x1F2pjL+HcBvjeI+GP430gVeJJX0RaG14Fp4v9MQT6zv/ -gvvjHC8l7YSJUROjeUzLZpUnj/ik4yrtT4av/TDGTSOpGs5qEATqk4hxAUEWw6TJ -RoLh3Oq2N5KuzDmKBBskLX0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAL2H54oyx -pNkcgFF79lwc4c/Jda7j0wrZQIw5CWwO0MdCozJGRIEAA5WXA8b5THo1ZkaWv+sh -lWnCOflBtGnEpD7dUpMW9lxGL5clMeMf3CoNYBb7zBofm+oTJytCzXHNftB4hCZj -pvN79bNT4msWbmxDyi75nfbEfzK1BKnfCg+DWBBjEnHC8VzgDq6ACN6FEoyFb+fr -dlDoof+S7k8jYAzhxwySI5DnMzr9OIwnepWfx9HENsasAighc8vFSEouShvsOlYS -L0OIb9Tn6M5q1tWoLHulQsQYDPzaO/1M7ubsr5xCx1ReDK4gaNwS3YXn/2KE9Kco -aKCrL89AjQrJPA== +MIIDDTCCAfUCCCAhBikTA0IAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg +Y2VydHMwHhcNMjEwNjI5MjAwMzQyWhcNNDgxMTE0MjAwMzQyWjBQMQ0wCwYDVQQK +DARQR0RHMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEQMA4GA1UECwwHVGVzdGluZzEX +MBUGA1UEAwwOc3NsdGVzdHVzZXItZG4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDES64qtkofPjeG4VbUVKfzABLC0CurvxqLTEpokq/St9WAWDrzc8PJ +YireEZp4ec5rHVyQVvHqzzaZFAMvbRUQgMdGKG4Vgkn8l96KxHa4Q6yxYoQOts10 +AuvU9LuGKT0lxndMggHDmREUOAkFYKp7IeypseUGkJ6sWs+DlTwK1hST+EUAU/5f +q/pAngJ+oar20m8WNxaAhJUKtBBecdRdqYy/h3Ab43iPhj+N9IFXiSV9EWhteBae +L/TEE+s7/4L74xwvJe2EiVETo3lMy2aVJ4/4pOMq7U+Gr/0wxk0jqRrOahAE6pOI +cQFBFsOkyUaC4dzqtjeSrsw5igQbJC19AgMBAAEwDQYJKoZIhvcNAQELBQADggEB +AECbQQ9rBzCexNI3VKDVA+CZa0ib48XbcJwXmva3spvjjCB5cGPToyF1B+4mVg1H +1uM/XRAoQmNRtB+xKEAceMSxJA02tBlwMOclXlO0oGLYyc+S61K+UEPSk6Kka4aC +NpeLSqN5ahC9z8C5uMJl36pFf13aU05uRkXKcI4gkn02I4jRc/a8gF7URdhdf920 +KmYSUh1V0B3pPAB6ArqJ60iHOqkCYIIIbi2EpVP53IKkoB9tr4ud8oMoN6ggIXU1 +2oHvnaKJ7RZaQNefS3WweyHxr4cCVtEour/ELph48OuW6Y5jqPT+5Ln3Qz0e6KW9 +o3thBx0aKSYlmt9gH254M9M= -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client-revoked.crt b/third_party/spanner_pg/src/test/ssl/ssl/client-revoked.crt index 14857a33..51ebe924 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client-revoked.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/client-revoked.crt @@ -1,17 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzDCCAbQCAQIwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNsaWVudCBjZXJ0czAe -Fw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBYxFDASBgNVBAMMC3NzbHRl -c3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoBcmY2Z+qa+l -UB5YSYnGLt96S7axkoDvIzLJkwJugGqw1U72A6lAUTyAPVntsmbhoMpDEHK6ylg8 -U4HC3L1hbhSpFriTITJ3TzH4+wdDH1KZYlM2k0gfrKrksJyZ7ftAyuBvzBRlFbBe -xopR9VQjqgAuNKByJswldOe0KwP0nmb/TtT9lkAt7XjrSut5MUezFVnvTxabm7tQ -ciDG+8QqE0b8lH3N3VOXWZWCeXPRrwboO3baAmcue4V20N0ALARP+QZNElBa7Jq+ -l77VNjneRk07jjaE7PCGVlWfPggppZos1Ay1sb2JhK0S9pZrynQT/ck3qhG4QuKp -cmn/Bbe/8wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBySTwOO9zSFCtfRjbbblDx -AK2ttILR0ZJXnvzjNjuErsT9qeXaq2t/iG/vmhH5XDjaefXFLCLqFunvcg6cIz1A -HhAw+JInfyk3TUpDaX6M0X8qj184e4kXzVc83Afa3LiP5JkirzCSv6ErqAHw2VVd -bZbZUwMfQLpWHVqXK89Pb7q791H4VeEx9CLxtZ2PSr2GCdpFbVMJvdBPChD2Re1A -ELcbMZ9iOq2AUN/gxrt7HnE3dRoGQk6AJOfvhi2eZcVWiLtITScdPk1nYcNxGid3 -BWW+tdLbjmSe2FXNfDwBTvuHh5A9S399X5l/nLAng2iTGSvIm1OgUnC2oWsok3EI +MIIC0zCCAbsCCCAhAwMUEgcBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD +DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAX +JmNmfqmvpVAeWEmJxi7feku2sZKA7yMyyZMCboBqsNVO9gOpQFE8gD1Z7bJm4aDK +QxByuspYPFOBwty9YW4UqRa4kyEyd08x+PsHQx9SmWJTNpNIH6yq5LCcme37QMrg +b8wUZRWwXsaKUfVUI6oALjSgcibMJXTntCsD9J5m/07U/ZZALe1460rreTFHsxVZ +708Wm5u7UHIgxvvEKhNG/JR9zd1Tl1mVgnlz0a8G6Dt22gJnLnuFdtDdACwET/kG +TRJQWuyavpe+1TY53kZNO442hOzwhlZVnz4IKaWaLNQMtbG9iYStEvaWa8p0E/3J +N6oRuELiqXJp/wW3v/MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAcVhPcu55HcSf +Mci38T/fOBaiDUvzWwG/XlQRzFxcS+ZY/vYMbgor6PliGlCFBF4Mca2qtTs7zXRz +8aLNVX53p98Cnnn97mW4aYNbNdM87R76IqJdj40brEolu1JNOyFJRYzoaebABf9r +R64FTt3YVM9qjJrHG/apYwKwgAMxVzZ/M+3ujahP/8mOYD/Utj+lYHnXJmuHAYE6 +EnTxTSb2J+IsK8KuPoGjUPNZRW8zIUE0luMpJahvtmFVW91Vue7dW0AOmHpjmGUB +J9Vwxe7KJRW5/4dz6kMD2pKY3D9sBgXeku/QDVz/hdyB5YT0WChFiZn20DZyhOtu +moHgw8OJzg== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client.crl b/third_party/spanner_pg/src/test/ssl/ssl/client.crl index a667680e..d93791b8 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client.crl +++ b/third_party/spanner_pg/src/test/ssl/ssl/client.crl @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf -8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p -xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4 -pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG -nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9 -2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwEXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAC1AJ+HhHg74uXNXdoXLnqDhowdx1y3z +GKSTPH4iW6jvGp7mMeJhq7cx5kzC+Rqtjui7FjkXbvGd4f6ZVKf30tDD/LvVLxLU +Up7TmwZjYHbB4NPMyMyqUxtusjYm6HFhbfJwf11TQFwF9yRN3MI4os3J9KTzvhY1 +AvfyEqhBdeygkc1cDduZD+cx7QFYtaeD316q4lz8yfegtxwng8/JDlThu72zdpWV +w0LuzLei1A9cPXoXfMxRGVEOrDt5z3ArNqdD0bnXTTYqm1IX8ZRHDNeUi4NuFCCu +tKWT4j9ad4mMcJ6TY/8MiJ14mSJmWSR8115QT69rrQIdDu0sA/sBJX0= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client.crt b/third_party/spanner_pg/src/test/ssl/ssl/client.crt index 4d0a6ef4..1f6ae05f 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/client.crt @@ -1,17 +1,18 @@ -----BEGIN CERTIFICATE----- -MIICzDCCAbQCAQEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNsaWVudCBjZXJ0czAe -Fw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBYxFDASBgNVBAMMC3NzbHRl -c3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtIugLqHywEAE -vyRZGMVAkdk1zCa5FFaPOEFhHiAMpwFOEIEi4Svk9kSSRecmeJcody1sLNoFqtTA -b5tYaDoGIVZfc8/kxm8sbsTE/3JOsON3CMqjOQkI1ZKjDSF1gtrGSmatgjqsMnlP -UJkFEsPhFg6NTf1ZUjFiQeWEli0fQJ2/k+7MI4S0t0pDJJJWrqF4l6eSgu8rsBoX -XHy4OLAz6j23r2k5FZs6H/poII95ia+E8hG8SrJmMa88naRdq7hHW802Z6lEhnRW -ND+tDGjt0ZaTfxx+CxN4UjgbboOJifTykVHjuzBR1+IzLHcxoZCLP1cjadSqMz5b -ziJTGtHzYwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAcIGps6BnsRxkN5sphg6GK -tzDvp2IUyOu5oeAHdJLT5JFZhKKzhDD4KiOv+XWzdHcSAl3xMqAqnFdSTCt2vtc+ -rk04eyVWJALyf6oPT60Vn5sFaaxlTg1+tnZMCCycDxM6lc/6onzgp6DUWGozlgSh -eNgCyaNU73VTuMgd+s/QrZ5HCr0OPAb3aWRQy7hVZeOniNBXWrO/CC2Swfwz7jU3 -dvLAWYENUvZlE2S7HnQGclGIJb38qFCnquuSgmO9yT30Lmmwp33k5/evN9cNQMxU -c4ChYCaabOGXUaBJNzJAYMEUHh+o+LPgFF2iB0mL7FAUip9XsjOiOwcrbusM/g+2 +MIIC0zCCAbsCCCAhAwMUEgcAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD +DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSL +oC6h8sBABL8kWRjFQJHZNcwmuRRWjzhBYR4gDKcBThCBIuEr5PZEkkXnJniXKHct +bCzaBarUwG+bWGg6BiFWX3PP5MZvLG7ExP9yTrDjdwjKozkJCNWSow0hdYLaxkpm +rYI6rDJ5T1CZBRLD4RYOjU39WVIxYkHlhJYtH0Cdv5PuzCOEtLdKQySSVq6heJen +koLvK7AaF1x8uDiwM+o9t69pORWbOh/6aCCPeYmvhPIRvEqyZjGvPJ2kXau4R1vN +NmepRIZ0VjQ/rQxo7dGWk38cfgsTeFI4G26DiYn08pFR47swUdfiMyx3MaGQiz9X +I2nUqjM+W84iUxrR82MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACSZo32raJHcB +rYHeomzynmzgMVBHSA4XsXZVQw4+zBUER+/ZdQbtw6F/qdeWRvTl8TJjwoydta7u +4gUkgAnQhYm2f8XEBe/+MUegH+y54Yk6rtmkdLxJLGKZ0IUfYkn20sg/NZrltbog +A8glWRGVD8cEOaxUaNSQ4Xqmqsqjd6Kh8snVfIIcWgKgnTNgyapM5ePBpS2IREhN +u9fjikQQf6F/dycsm22OP7aWsp1XPs3nqnoq9ZnhQrITMwsGcjbU7+v8La2GbiJV +8yAy136NSXUujIG/8eqhICWZPqj+KbdVZupOsUeVoeuSwLXJjm4GWY0xH92emqCI +ac+HriJv5w== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/client_ca.crt index 1ef37712..ef48749f 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/client_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/client_ca.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75x7yuQ1+gK8j -1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMtOCrVKllsdC+S -1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWsJwme87VaFrL+ -B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8TXe+XEnRfW9KX -P3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXabdCH41j0F/0yc -kctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSOYbGmBCdBdYK7 -RTcnJQv9AgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AB6zh/Jw+t232100Tztr7wJoKH8DL1hnSm3e7omdj0WlKfuZwTqDuMzB3H4LOSnS -A00XpyMAGAJC6yRjS8pt+pjY5Jt6ouSqf6wNq0mF0jiIDeg1k/GNEjigx+0ITqbE -lUJ56AcpoBNhOwBjOCRFh4JuspHZqHXgUNYTEicClbV+lZwoMIIK1e6FYRZDqMtL -+34GtZACImqvRkP5alqQg7hJUM1zbDVf2qebY4cfSu4OfTu6Og6KrL8Cu6bqR2et -0a/TbthHYz1QGDYRoVTSP4uWoG9M1ZbsA/bNE2eqcrQj+dJ4AmIIr8Yl8mrwo/FZ -SvgeLMlQY7UNwLUDtwy9QkI= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce +8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq +1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ +nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v +lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh ++NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx +pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x +QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r +vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 +swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A +ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi +GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client_ext.crt b/third_party/spanner_pg/src/test/ssl/ssl/client_ext.crt new file mode 100644 index 00000000..9874ce49 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/ssl/client_ext.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIIICEREAQyQQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNs +aWVudCBjZXJ0czAeFw0yMTExMTAwMzMyNDFaFw00OTAzMjgwMzMyNDFaMBYxFDAS +BgNVBAMMC3NzbHRlc3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArCHikkEQLFITbn3ZfO8X2RW3fELeaImgy8W4Pkkc4LxdHCWjdCML/vtE/ZVu +Op74qrQQWT0HKXFVUiZLbjAgV2PONS6VFHhc3sTFxuTaBnVdY+K98hoFnXskINt/ +wgwUhRcRZuKPcZvEHiqF6e3g3lQa99l1nVKPGPLOCvVhSgoV0Gwgxok0t7s25BCV +ZmpMAwSTxpeviLF0e2MsttuyClQ4nuD92EHZX3BuG0WNPLxiwikV96uMffpMRGsx +uiAHzD5ykYM7/b3eU0bjfi0J0qcfTSeytqFuRCNEukJpmtUmyYGqsFJ7HN7ejCY7 +ObAlBn8h+4bgwBRaeZDZLTMaYQIDAQABo4GgMIGdMAwGA1UdEwEB/wQCMAAwEwYD +VR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFPPv1n7k1Vd9BBC4eoGWPZwVz2Lx +MFkGA1UdIwRSMFChRKRCMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBmb3IgUG9z +dGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlggggIQMDFBIHATANBgkq +hkiG9w0BAQsFAAOCAQEAtqIeTmUhtHyCt5k2yx88F0dKshYq4Z+LQI+agyZ1fRE6 +Ux5p+SBGbzvc+NcUvc7yGG6w2G/nTVnGwSHN9NtQa2T2XbHJysJ/dwCfmRsachKz +4kCp0zAHEDrEmZua0sy5BLwwVCk5WNBR0lZ35WmIEuRA+5G/2lCywtrb9W4YnbAM +nH7BtZE8qPbK4OicB40I2NXz6KhG3755oKN03VC1IaX9JFQxf37ac7jVK5bsjfaF +0xCAeuDN6wDiVHZj6q1GhhmNLzaF5zmU2e/cI1nTI5tfGKnygavlZIz2VvAlcypt +YZdMDy69VbTWUa57UPCspghgvm5M2/Hjmz50CXGMvw== +-----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/client_ext.key b/third_party/spanner_pg/src/test/ssl/ssl/client_ext.key new file mode 100644 index 00000000..04e59306 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/ssl/client_ext.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsIeKSQRAsUhNu +fdl87xfZFbd8Qt5oiaDLxbg+SRzgvF0cJaN0Iwv++0T9lW46nviqtBBZPQcpcVVS +JktuMCBXY841LpUUeFzexMXG5NoGdV1j4r3yGgWdeyQg23/CDBSFFxFm4o9xm8Qe +KoXp7eDeVBr32XWdUo8Y8s4K9WFKChXQbCDGiTS3uzbkEJVmakwDBJPGl6+IsXR7 +Yyy227IKVDie4P3YQdlfcG4bRY08vGLCKRX3q4x9+kxEazG6IAfMPnKRgzv9vd5T +RuN+LQnSpx9NJ7K2oW5EI0S6Qmma1SbJgaqwUnsc3t6MJjs5sCUGfyH7huDAFFp5 +kNktMxphAgMBAAECggEAQlVWkmUHXgUNHvXZo8chyhMP4A+G1QNAl3Zs73fObJ66 +RPgOOtmsrEjZh92XmnibvHDiofkeMu7NYfiG9gIO3I6GL0Fxyu8tXt22l9SmXnnJ +EQ6Wg19azZrgS9c6ryVnnPhMSPlDLRVJaRSbAZCdqSABOoUvSX7AzWz4UQnJwbVp +c9Le7DbXcD4IIhi+D2o6k46oGTm+P8kEAbw73tN7NmxBudwMhvGup3HlDNypbwPJ +0aWR+nxZbaAVnmYiENX7L68R9rweqDES8AgV030L4YF022C8TAuBLeCjuEQucdp4 ++ZcNUzAF2G1NN/VUpjBKK08+Pu0C0vV+fDrKWK+QnwKBgQC74THLylX/+7TJC24U +LXu/z5BjkejUr4GLHTZG9edGgaoSiKikXdseCI/RiDVXvtQ7kstFYflOZ+XGuc4l +GVAN52uRqg7uXw0R8F8bKpal08j4Rhe4rXKvH5h9hSeozOlxq7jrQ2xk96Guu3k7 +ujqkkVoPX+dnwUVN6elWrMIUpwKBgQDqiwqaKk7Pmkqc5et4WKvKFLKYuTU/qOO6 +fVEqGlgbLGNf+DVgKcTl5AVyhqtedh1hin0ij/dDHoYOmynmbe/zguSxF7kYUxdJ +STwWpQt/ccaWMfqgrjxXpWsPc1fRWgmACAaum04GXmBeZ4z0rVT4blwAVddgoLL8 +q4lrSNbRtwKBgQClv4jnyaxPNecLCmtln66xzFMMlJe8ssztRqswtRYA7Ll2ultV +DnwVpeYDK1AsBe1EVT/BCSshEaXzyM3lisxGR+htTIL5pp9oORAeblcTGqEM7wFU +aqhneM9VxRf04jn8j0uHOicxeAmKllfg6m1768NxFuGWdjpG/1pcnfJmtwKBgAF8 +Nen6AJvB710E+7O8ZAIYlXTwH00y5ZZFuuDYX9x0MIDoEnZ0bUHDauFpxuYHO3Jl +rRst7DPpmpG3G9HQumdBWe9hJhPoWsplA1NlYihBcS98S4j+8XTgoEftxA2YU10T +L++lHh5eNKAEadkWy+Xy1PRPltiOy/NbprgeMvYLAoGAKpt7DHcK8B0JdOnEzTuz +7mT6xRt2C9IASCiv92Fx1BPiPy4l9ukT4CJza/wpSpH3xyeB37afe0kQyU8lDrCF +iMU3RNTzTftwqO8GgtgntgW8ZKe9fuqzm9VLMQFyL+zdqEfGG6ROS8ipYLx9pn6x +FHc3UsmLmK0hfCr9B4Yo+C0= +-----END PRIVATE KEY----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 b/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 index a667680e..d93791b8 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf -8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p -xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4 -pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG -nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9 -2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwEXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAC1AJ+HhHg74uXNXdoXLnqDhowdx1y3z +GKSTPH4iW6jvGp7mMeJhq7cx5kzC+Rqtjui7FjkXbvGd4f6ZVKf30tDD/LvVLxLU +Up7TmwZjYHbB4NPMyMyqUxtusjYm6HFhbfJwf11TQFwF9yRN3MI4os3J9KTzvhY1 +AvfyEqhBdeygkc1cDduZD+cx7QFYtaeD316q4lz8yfegtxwng8/JDlThu72zdpWV +w0LuzLei1A9cPXoXfMxRGVEOrDt5z3ArNqdD0bnXTTYqm1IX8ZRHDNeUi4NuFCCu +tKWT4j9ad4mMcJ6TY/8MiJ14mSJmWSR8115QT69rrQIdDu0sA/sBJX0= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/a3d11bff.r0 b/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/a3d11bff.r0 index e879cf25..5b42d380 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/a3d11bff.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+client-crldir/a3d11bff.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx -MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a -qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz -4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5 -lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4 -pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E -PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG -AlO+O0a4SpYS +b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0yMTAzMDMy +MjEyMDdaFw00ODA3MTkyMjEyMDdaMA0GCSqGSIb3DQEBCwUAA4IBAQACkv0Nnerr +ZkacIUbRaANYLIsYAGfKuBYDAp4I4CCC2hvXL64KLDMZbVfB4vp3hvM2FZdT2AwT +SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +40qbmw8RU062ZbyFamBO7VTY7IFBA8PxuTgAH/3OYa5Jne8umyPQT5fKnqyRBz/A +6/b5RCxuPOWFm0MJKrEaAeLk6eaCxUUqXQP+8mHscphqZTOynjAW0NPH+/x2NpxS +/C5LTeOzJ28k8X434h323G18n/CFERWnhW1UyR1Pt6oSGMZqU5UwbSrwTsf8tSSc ++GrJP3XxJ1OC -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+client.crl b/third_party/spanner_pg/src/test/ssl/ssl/root+client.crl index 854d77b7..02eff4d3 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+client.crl +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+client.crl @@ -1,22 +1,22 @@ -----BEGIN X509 CRL----- MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx -MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a -qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz -4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5 -lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4 -pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E -PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG -AlO+O0a4SpYS +b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0yMTAzMDMy +MjEyMDdaFw00ODA3MTkyMjEyMDdaMA0GCSqGSIb3DQEBCwUAA4IBAQACkv0Nnerr +ZkacIUbRaANYLIsYAGfKuBYDAp4I4CCC2hvXL64KLDMZbVfB4vp3hvM2FZdT2AwT +SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +40qbmw8RU062ZbyFamBO7VTY7IFBA8PxuTgAH/3OYa5Jne8umyPQT5fKnqyRBz/A +6/b5RCxuPOWFm0MJKrEaAeLk6eaCxUUqXQP+8mHscphqZTOynjAW0NPH+/x2NpxS +/C5LTeOzJ28k8X434h323G18n/CFERWnhW1UyR1Pt6oSGMZqU5UwbSrwTsf8tSSc ++GrJP3XxJ1OC -----END X509 CRL----- -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf -8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p -xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4 -pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG -nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9 -2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwEXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAC1AJ+HhHg74uXNXdoXLnqDhowdx1y3z +GKSTPH4iW6jvGp7mMeJhq7cx5kzC+Rqtjui7FjkXbvGd4f6ZVKf30tDD/LvVLxLU +Up7TmwZjYHbB4NPMyMyqUxtusjYm6HFhbfJwf11TQFwF9yRN3MI4os3J9KTzvhY1 +AvfyEqhBdeygkc1cDduZD+cx7QFYtaeD316q4lz8yfegtxwng8/JDlThu72zdpWV +w0LuzLei1A9cPXoXfMxRGVEOrDt5z3ArNqdD0bnXTTYqm1IX8ZRHDNeUi4NuFCCu +tKWT4j9ad4mMcJ6TY/8MiJ14mSJmWSR8115QT69rrQIdDu0sA/sBJX0= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+client_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/root+client_ca.crt index 1867cd9c..7819c548 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+client_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+client_ca.crt @@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIUEAgXJ/ibw6TVTUoomlBsPMfVTlMwDQYJKoZIhvcNAQEL +MIIDHjCCAgagAwIBAgIUF+e8lCA0vD0zKtxIDVPdDY/IkgUwDQYJKoZIhvcNAQEL BQAwQDE+MDwGA1UEAww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCBy -ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYwNDE0MTM0 -MDU0WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM +ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIx +MjA3WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM IHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALZ81vKKBJlxgjwuNoK67I4IE9zfSLb0eHbgZwZxDVzdmFejARrHlWk3 +MK7Nav7RLSJ990am33zb58CTHc7YYVlBp07+PwLXzypqWkhYfok1OYYjyjCrFDs @@ -10,29 +10,29 @@ sjcJI3hRCZNEz+wYsG+tdYWJ+gRPQOWfh0YfO2rFgXAIMLiF6lyWzf1eOM+OjYrF /eyzwbMaJkkGa/AyZKz3wZiPq0jTuYLVmH4MK7MBOsUfSmsBsn/ohyRCQzM+ol0v Qlsrulj8usponRPDh9ng4PB5OSgR79YimQZnASQzJxiUvMADrKL5L6KwLxJlzbqY R0b5mLh8KBzBQmSh3Aj2e2I7Z17hdaMCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEASzA7ApbuKn8lkC706gRL37a33yTZZ8rjZ4dnvCtq -6OltlYDJ8IndotKbLH0SUEAxrvcaFnMt7AX9pRf2sGBKbY8zcxqPfsvzVehgx4Ea -1RYksFW4h97jj1a1RKukTKuEOEEipbxwo0rLxfjvdaf2izqchJsLGtbocIZf0bD8 -djbE9jOLkx7saL08qC8ECrf9utsee+LJCsUYbNgYyIItEy6yVnmF/ICz93Utn1cI -RfqZr1lM2Ia2LP9eDTmiuR9m+/MzkeRvvJHonNrRJHlcggtYHICvYioh9/jALBcm -wZ+hTUePVqy4hOCBJ975CXjfKFN4MKQAdeB3EO5eBYAD3Q== +BgkqhkiG9w0BAQsFAAOCAQEAY6h2MurDkE2LAG3TPhTrAczflR3np6y1cDxeRzRi +br2bczXVfgWDsBZDhKXdIQldYQhAUU7u09GtAtujWnkJguPuVtlhEfuW/eXpcBI2 +XQnrkaTqjD/DDMJGijNVAXEHSecEls6uEuuSCxmm7hVD781Aqo0HlLPDhTEkko6r +IYFO0QyFG+oFSVhUp2KuarQNHVgopOmWbtbrq2KqaL5Gm5AXPSRzEhIeobYdSnTe +OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s +kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC75x7yuQ1+gK8j -1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMtOCrVKllsdC+S -1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWsJwme87VaFrL+ -B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8TXe+XEnRfW9KX -P3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXabdCH41j0F/0yc -kctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSOYbGmBCdBdYK7 -RTcnJQv9AgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AB6zh/Jw+t232100Tztr7wJoKH8DL1hnSm3e7omdj0WlKfuZwTqDuMzB3H4LOSnS -A00XpyMAGAJC6yRjS8pt+pjY5Jt6ouSqf6wNq0mF0jiIDeg1k/GNEjigx+0ITqbE -lUJ56AcpoBNhOwBjOCRFh4JuspHZqHXgUNYTEicClbV+lZwoMIIK1e6FYRZDqMtL -+34GtZACImqvRkP5alqQg7hJUM1zbDVf2qebY4cfSu4OfTu6Og6KrL8Cu6bqR2et -0a/TbthHYz1QGDYRoVTSP4uWoG9M1ZbsA/bNE2eqcrQj+dJ4AmIIr8Yl8mrwo/FZ -SvgeLMlQY7UNwLUDtwy9QkI= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce +8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq +1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ +nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v +lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh ++NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx +pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x +QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r +vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 +swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A +ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi +GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a3d11bff.r0 b/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a3d11bff.r0 index e879cf25..5b42d380 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a3d11bff.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a3d11bff.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx -MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a -qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz -4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5 -lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4 -pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E -PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG -AlO+O0a4SpYS +b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0yMTAzMDMy +MjEyMDdaFw00ODA3MTkyMjEyMDdaMA0GCSqGSIb3DQEBCwUAA4IBAQACkv0Nnerr +ZkacIUbRaANYLIsYAGfKuBYDAp4I4CCC2hvXL64KLDMZbVfB4vp3hvM2FZdT2AwT +SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +40qbmw8RU062ZbyFamBO7VTY7IFBA8PxuTgAH/3OYa5Jne8umyPQT5fKnqyRBz/A +6/b5RCxuPOWFm0MJKrEaAeLk6eaCxUUqXQP+8mHscphqZTOynjAW0NPH+/x2NpxS +/C5LTeOzJ28k8X434h323G18n/CFERWnhW1UyR1Pt6oSGMZqU5UwbSrwTsf8tSSc ++GrJP3XxJ1OC -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 b/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 index 717951c2..331a83cb 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND -xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq -nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6 -RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ -SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu -41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV ++10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo +4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R +ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy +imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx +B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+server.crl b/third_party/spanner_pg/src/test/ssl/ssl/root+server.crl index 9720b302..8b0c716d 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+server.crl +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+server.crl @@ -1,22 +1,22 @@ -----BEGIN X509 CRL----- MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx -MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a -qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz -4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5 -lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4 -pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E -PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG -AlO+O0a4SpYS +b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0yMTAzMDMy +MjEyMDdaFw00ODA3MTkyMjEyMDdaMA0GCSqGSIb3DQEBCwUAA4IBAQACkv0Nnerr +ZkacIUbRaANYLIsYAGfKuBYDAp4I4CCC2hvXL64KLDMZbVfB4vp3hvM2FZdT2AwT +SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +40qbmw8RU062ZbyFamBO7VTY7IFBA8PxuTgAH/3OYa5Jne8umyPQT5fKnqyRBz/A +6/b5RCxuPOWFm0MJKrEaAeLk6eaCxUUqXQP+8mHscphqZTOynjAW0NPH+/x2NpxS +/C5LTeOzJ28k8X434h323G18n/CFERWnhW1UyR1Pt6oSGMZqU5UwbSrwTsf8tSSc ++GrJP3XxJ1OC -----END X509 CRL----- -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND -xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq -nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6 -RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ -SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu -41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV ++10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo +4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R +ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy +imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx +B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root+server_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/root+server_ca.crt index 861eba80..5074f4fa 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root+server_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/root+server_ca.crt @@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIUEAgXJ/ibw6TVTUoomlBsPMfVTlMwDQYJKoZIhvcNAQEL +MIIDHjCCAgagAwIBAgIUF+e8lCA0vD0zKtxIDVPdDY/IkgUwDQYJKoZIhvcNAQEL BQAwQDE+MDwGA1UEAww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCBy -ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYwNDE0MTM0 -MDU0WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM +ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIx +MjA3WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM IHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALZ81vKKBJlxgjwuNoK67I4IE9zfSLb0eHbgZwZxDVzdmFejARrHlWk3 +MK7Nav7RLSJ990am33zb58CTHc7YYVlBp07+PwLXzypqWkhYfok1OYYjyjCrFDs @@ -10,29 +10,29 @@ sjcJI3hRCZNEz+wYsG+tdYWJ+gRPQOWfh0YfO2rFgXAIMLiF6lyWzf1eOM+OjYrF /eyzwbMaJkkGa/AyZKz3wZiPq0jTuYLVmH4MK7MBOsUfSmsBsn/ohyRCQzM+ol0v Qlsrulj8usponRPDh9ng4PB5OSgR79YimQZnASQzJxiUvMADrKL5L6KwLxJlzbqY R0b5mLh8KBzBQmSh3Aj2e2I7Z17hdaMCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEASzA7ApbuKn8lkC706gRL37a33yTZZ8rjZ4dnvCtq -6OltlYDJ8IndotKbLH0SUEAxrvcaFnMt7AX9pRf2sGBKbY8zcxqPfsvzVehgx4Ea -1RYksFW4h97jj1a1RKukTKuEOEEipbxwo0rLxfjvdaf2izqchJsLGtbocIZf0bD8 -djbE9jOLkx7saL08qC8ECrf9utsee+LJCsUYbNgYyIItEy6yVnmF/ICz93Utn1cI -RfqZr1lM2Ia2LP9eDTmiuR9m+/MzkeRvvJHonNrRJHlcggtYHICvYioh9/jALBcm -wZ+hTUePVqy4hOCBJ975CXjfKFN4MKQAdeB3EO5eBYAD3Q== +BgkqhkiG9w0BAQsFAAOCAQEAY6h2MurDkE2LAG3TPhTrAczflR3np6y1cDxeRzRi +br2bczXVfgWDsBZDhKXdIQldYQhAUU7u09GtAtujWnkJguPuVtlhEfuW/eXpcBI2 +XQnrkaTqjD/DDMJGijNVAXEHSecEls6uEuuSCxmm7hVD781Aqo0HlLPDhTEkko6r +IYFO0QyFG+oFSVhUp2KuarQNHVgopOmWbtbrq2KqaL5Gm5AXPSRzEhIeobYdSnTe +OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s +kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiSnYZbmc9vpCt -Ku1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45YD7Nq0kBCq3dH -t2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7XdRbRR6we1s9VG -/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7AOyoLEJlNS0B -QW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hynon/nQQvBP77 -SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMBW4L4VaGg3W6F -h6iuJwRfAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AFlcKTaU/Ug3Q0hr3P1UQ6dWyK4aVn9rs4jvVfFl0a0RnbBowqK2C+zQVUWYTcjo -KHREVje65goj6VzRB6ko/9mAQ6PZP8jRuRhfCmvmvSQ/mWdgPzSRsUh9MwgEm9c2 -vNbqwaznEU8cYZnLpHiR9O5S7/qWWxehjYtxk5Eb4J006YglYfHnhrRFJvPbiqlf -IOEivZ7gIVfvaOTbLjmN2kLOnzdlwpXGjxxg4Nu9ZhXOhfrplzUvRfmqvVsDiHXb -USIdX+OFZZqr64IKG4drT4K4Bt2wupOEyX4ZFsUXXd+Hgq83SWmV4wzflcpmGkLC -JZ3CEMu8/WA5uQBXdQUozlE= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 +GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z +atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 +UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs +qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J +/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC ++FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb +QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F +0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 +UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 +xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA +OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root.crl b/third_party/spanner_pg/src/test/ssl/ssl/root.crl index e879cf25..5b42d380 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root.crl +++ b/third_party/spanner_pg/src/test/ssl/ssl/root.crl @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx -MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a -qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz -4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5 -lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4 -pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E -PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG -AlO+O0a4SpYS +b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0yMTAzMDMy +MjEyMDdaFw00ODA3MTkyMjEyMDdaMA0GCSqGSIb3DQEBCwUAA4IBAQACkv0Nnerr +ZkacIUbRaANYLIsYAGfKuBYDAp4I4CCC2hvXL64KLDMZbVfB4vp3hvM2FZdT2AwT +SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +40qbmw8RU062ZbyFamBO7VTY7IFBA8PxuTgAH/3OYa5Jne8umyPQT5fKnqyRBz/A +6/b5RCxuPOWFm0MJKrEaAeLk6eaCxUUqXQP+8mHscphqZTOynjAW0NPH+/x2NpxS +/C5LTeOzJ28k8X434h323G18n/CFERWnhW1UyR1Pt6oSGMZqU5UwbSrwTsf8tSSc ++GrJP3XxJ1OC -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/root_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/root_ca.crt index 402d7dab..5ee9870d 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/root_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/root_ca.crt @@ -1,8 +1,8 @@ -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIUEAgXJ/ibw6TVTUoomlBsPMfVTlMwDQYJKoZIhvcNAQEL +MIIDHjCCAgagAwIBAgIUF+e8lCA0vD0zKtxIDVPdDY/IkgUwDQYJKoZIhvcNAQEL BQAwQDE+MDwGA1UEAww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCBy -ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYwNDE0MTM0 -MDU0WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM +ZWdyZXNzaW9uIHRlc3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIx +MjA3WjBAMT4wPAYDVQQDDDVUZXN0IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NM IHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALZ81vKKBJlxgjwuNoK67I4IE9zfSLb0eHbgZwZxDVzdmFejARrHlWk3 +MK7Nav7RLSJ990am33zb58CTHc7YYVlBp07+PwLXzypqWkhYfok1OYYjyjCrFDs @@ -10,10 +10,10 @@ sjcJI3hRCZNEz+wYsG+tdYWJ+gRPQOWfh0YfO2rFgXAIMLiF6lyWzf1eOM+OjYrF /eyzwbMaJkkGa/AyZKz3wZiPq0jTuYLVmH4MK7MBOsUfSmsBsn/ohyRCQzM+ol0v Qlsrulj8usponRPDh9ng4PB5OSgR79YimQZnASQzJxiUvMADrKL5L6KwLxJlzbqY R0b5mLh8KBzBQmSh3Aj2e2I7Z17hdaMCAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEASzA7ApbuKn8lkC706gRL37a33yTZZ8rjZ4dnvCtq -6OltlYDJ8IndotKbLH0SUEAxrvcaFnMt7AX9pRf2sGBKbY8zcxqPfsvzVehgx4Ea -1RYksFW4h97jj1a1RKukTKuEOEEipbxwo0rLxfjvdaf2izqchJsLGtbocIZf0bD8 -djbE9jOLkx7saL08qC8ECrf9utsee+LJCsUYbNgYyIItEy6yVnmF/ICz93Utn1cI -RfqZr1lM2Ia2LP9eDTmiuR9m+/MzkeRvvJHonNrRJHlcggtYHICvYioh9/jALBcm -wZ+hTUePVqy4hOCBJ975CXjfKFN4MKQAdeB3EO5eBYAD3Q== +BgkqhkiG9w0BAQsFAAOCAQEAY6h2MurDkE2LAG3TPhTrAczflR3np6y1cDxeRzRi +br2bczXVfgWDsBZDhKXdIQldYQhAUU7u09GtAtujWnkJguPuVtlhEfuW/eXpcBI2 +XQnrkaTqjD/DDMJGijNVAXEHSecEls6uEuuSCxmm7hVD781Aqo0HlLPDhTEkko6r +IYFO0QyFG+oFSVhUp2KuarQNHVgopOmWbtbrq2KqaL5Gm5AXPSRzEhIeobYdSnTe +OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s +kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-alt-names.crt index 2bb206e4..12d1ec36 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-alt-names.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-alt-names.crt @@ -1,20 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDTjCCAjagAwIBAgIBATANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0 -IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNl -cnRzMB4XDTE4MTEyNzEzNDA1NFoXDTQ2MDQxNDEzNDA1NFowRjEeMBwGA1UECwwV -UG9zdGdyZVNRTCB0ZXN0IHN1aXRlMSQwIgYDVQQDDBtjb21tb24tbmFtZS5wZy1z -c2x0ZXN0LnRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBURL6 -YPWJjVQEZY0uy4HEaTI4ZMjVf+xdwJRntos4aRcdhq2JRNwitI00BLnIK9ur8D8L -U24PDn2etTZOK1wsHHkAiHPvgRX7G/+78a5fSC8nMNaH/oR4zMMhwksiruISA7x9 -/l+4DO7C42C5mRfnUmMGJdzau1+A8jcIxTWWoJtva9b1k3g+bvBGq9138X+bJKIW -YsWwHgcuEIZk3z287hxuyU3j5isYoRwd5cZZFrG/qBJdukSBRil5/PP5AHsB6lTl -pae2bdf4TXB7kActIpyTBR0G5Pm5iCZlxgD+QILj/1FLTaNOW7hV+t1J6YfC6jZR -Dk4MnHMCFasSXcXhAgMBAAGjSzBJMEcGA1UdEQRAMD6CHWRuczEuYWx0LW5hbWUu -cGctc3NsdGVzdC50ZXN0gh1kbnMyLmFsdC1uYW1lLnBnLXNzbHRlc3QudGVzdDAN -BgkqhkiG9w0BAQsFAAOCAQEAQeKHXoyipubldf4HUDCXrcIk6KiEs9DMH1DXRk7L -z2Hr0TljmKoGG5P6OrF4eP82bhXZlQmwHVclB7Pfo5DvoMYmYjSHxcEAeyJ7etxb -pV11yEkMkCbQpBVtdMqyTpckXM49GTwqD9US5p1E350snq4Duj3O7fSpE4HMfSd8 -dCkYdaCHq2NWH4/MfEBRy096oOIFxqgm6tRCU95ZI8KeeK4WwPXiGV2mb2rHj1kv -uBRC+sJGSnsLdbZzkpdAN1qnWrJoLezAMdhTmNRUJ7Cq8hAkroFIp+LE+JyxR9Nw -m6jD3eEwCAQi0pPGLEn4Rq4B8kxzL5F/jTq7PONRvOAdIg== +MIIDVTCCAj2gAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMEYxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5h +bWUucGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAwVES+mD1iY1UBGWNLsuBxGkyOGTI1X/sXcCUZ7aLOGkXHYatiUTcIrSNNAS5 +yCvbq/A/C1NuDw59nrU2TitcLBx5AIhz74EV+xv/u/GuX0gvJzDWh/6EeMzDIcJL +Iq7iEgO8ff5fuAzuwuNguZkX51JjBiXc2rtfgPI3CMU1lqCbb2vW9ZN4Pm7wRqvd +d/F/mySiFmLFsB4HLhCGZN89vO4cbslN4+YrGKEcHeXGWRaxv6gSXbpEgUYpefzz ++QB7AepU5aWntm3X+E1we5AHLSKckwUdBuT5uYgmZcYA/kCC4/9RS02jTlu4Vfrd +SemHwuo2UQ5ODJxzAhWrEl3F4QIDAQABo0swSTBHBgNVHREEQDA+gh1kbnMxLmFs +dC1uYW1lLnBnLXNzbHRlc3QudGVzdIIdZG5zMi5hbHQtbmFtZS5wZy1zc2x0ZXN0 +LnRlc3QwDQYJKoZIhvcNAQELBQADggEBAG3dFQ/DqjFbjzIOni079R3I94lAZqbc +cRUumDPSzihKwvCCnU5quqnYkOFISqBZsYmxR5fiHx4wT+jmWvLSltkaeS6gcGC1 +zuO8GFzL+PATUX63js8IfE3WYJE/bjmDVVzJOBArrbsExofdE2F2kkkLkjhk0ylg +/TrAKtyqpsob0b4ZjMloR5JFHQXGHN/922x6Do1vduHMXlGckmR0sX6Mg/fiChVh +vixUJje4W9ohft8G7lj3GnzI1gHEMp2PYKM+wqOug/gXEQuMIFlhjp2Mc6bAvFsD +grgdAgcYUvgKukF9efJHq2V5XjqBWrmGAOQkiH1y+9gxhiHUiw+vojY= -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt new file mode 100644 index 00000000..4e58c85c --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-ip-alt-names.key b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-and-ip-alt-names.key new file mode 100644 index 00000000..837eef99 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-cn-only.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-only.crt index 67bf0b16..acdf6f1a 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-cn-only.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-cn-only.crt @@ -1,18 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIC/DCCAeQCAQIwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNlcnZlciBjZXJ0czAe -Fw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEYxHjAcBgNVBAsMFVBvc3Rn -cmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5hbWUucGctc3NsdGVz -dC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1bNU8yTuLl/5 -bR4Rp1ET5NMC2wgrTwKQsxSeOzvMmTGeebpEYFc/Hq8rcCQAiL7AbhiZeNg/ca4y -JdouOdaHaTMFJ8hFDI1tNOGeFK7ecOMBWQ97GxKs/KIqKYW42AN+QZ7l1Apr0CDZ -K5VTi931JjE4wCIgUgLi2zgwtZYl/kP896F1K5zR7kx773U2dvP3SeV2ziUe+4NH -5oqdmVMeZyHfB+Fe/uU1AiYgHN/CXfop39tYHR8ARUWx7eJlaaKBoj/0UqH/9Yir -jdM0vGfrw4JCjIx78caNkNH9fCjesTqODr+IDBJaJv3Jpt9g8puqrYagXLppiaYS -q5oOAu5fuQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCTxkqpNNuO15osb+Lyw2aQ -RikYZiSJ4uJcOIya6DqSYSNf8wrgGMJAKz9TkCGEG7SszLCASaSIS/s+sR1+bE19 -f6BxoBnppPW8uIkTtQvmGhhcWHO13zMUs8bmg9OY7MvFYJdQAmSqfYebUCYR73So -OthALxV8h+boW5/xc2XM1NObpcuShQ9/uynm2dL3EbrNjvcoXOwu865FmVMffEn9 -+zhE8xl4kMKObQvB3r2utCmlAmJLaU2ejADncS9Y4ZwRMa7x+vfvekF/FvLEXUal -QcDlfrZ0xsw/HK7n0/UFXf5fUXq3hgUGcXEdWW7/yTA43qNxednfa+fMqlFztupt +MIIDAzCCAesCCCAhAwMUEgcBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBGMR4wHAYDVQQL +DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxJDAiBgNVBAMMG2NvbW1vbi1uYW1lLnBn +LXNzbHRlc3QudGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWz +VPMk7i5f+W0eEadRE+TTAtsIK08CkLMUnjs7zJkxnnm6RGBXPx6vK3AkAIi+wG4Y +mXjYP3GuMiXaLjnWh2kzBSfIRQyNbTThnhSu3nDjAVkPexsSrPyiKimFuNgDfkGe +5dQKa9Ag2SuVU4vd9SYxOMAiIFIC4ts4MLWWJf5D/PehdSuc0e5Me+91Nnbz90nl +ds4lHvuDR+aKnZlTHmch3wfhXv7lNQImIBzfwl36Kd/bWB0fAEVFse3iZWmigaI/ +9FKh//WIq43TNLxn68OCQoyMe/HGjZDR/Xwo3rE6jg6/iAwSWib9yabfYPKbqq2G +oFy6aYmmEquaDgLuX7kCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA2AZrD9cTQXTW +4j2tT8N/TTc6WK2ncN4h22NTte6vK7MVwsZJCtw5ndYkmxcWkXAqiclzWyMdayds +WOa12CEH7jKAhivF4Hcw3oO3JHM5BA6KzLWBVz9uZksOM6mPqn29DTKvA/Y1V8tj +mxK/KUA68h/u6inu3mo4ywBpb/tqHxxg2cjyR0faCmM0pwRM0HBr/16fUMfO83nj +QG8g9J/bybu5sYso/aSoC5nUNp4XjmDMdVLdqg/nTe/ejS8IfFr0WQxBlqooqFgx +MSE+kX2e2fHsuOWSU/9eClt6FpQrwoC2C8F+/4g1Uz7Liqc4yMHPwjgeP9ewrrLO +iIhlNNPqpQ== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-crldir/a836cc2d.r0 b/third_party/spanner_pg/src/test/ssl/ssl/server-crldir/a836cc2d.r0 index 717951c2..331a83cb 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-crldir/a836cc2d.r0 +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-crldir/a836cc2d.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND -xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq -nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6 -RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ -SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu -41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV ++10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo +4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R +ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy +imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx +B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-ip-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-alt-names.crt new file mode 100644 index 00000000..8a1bc620 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-alt-names.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-alt-names.key new file mode 100644 index 00000000..b210b3a9 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt new file mode 100644 index 00000000..2be02feb --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-alt-names.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-alt-names.key new file mode 100644 index 00000000..54fe80fc --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt new file mode 100644 index 00000000..23c06da0 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.key new file mode 100644 index 00000000..0ace41e0 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-only.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-only.crt new file mode 100644 index 00000000..9bf015cf --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-only.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-cn-only.key new file mode 100644 index 00000000..1966530e --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-in-dnsname.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-in-dnsname.crt new file mode 100644 index 00000000..78ad8d99 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-ip-in-dnsname.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ip-in-dnsname.key new file mode 100644 index 00000000..ba319b00 --- /dev/null +++ b/third_party/spanner_pg/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/third_party/spanner_pg/src/test/ssl/ssl/server-multiple-alt-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-multiple-alt-names.crt index 158153d1..58799e49 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-multiple-alt-names.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-multiple-alt-names.crt @@ -1,20 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDRDCCAiygAwIBAgIBBDANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0 -IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNl -cnRzMB4XDTE4MTEyNzEzNDA1NFoXDTQ2MDQxNDEzNDA1NFowIDEeMBwGA1UECwwV -UG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA10iQpfVf4nCqjkRcLXP9ONQqdhMPMdjHasKqmsFTx83SZLKUzKMOb56j -3bg83stqGoId4MIxtqnDKaSg1+kseQ1HCi0cu/E3lHLEkPibl9dyVGhXVnPDBdOp -eUQLCvPNgay3/ua4Mz0Nf7S9cgC9AZu/EEYjQIEzfO0cEANeVIWtgZfM3+2j0pmZ -46AEYlEZJkmDT0/mnHk3YTj3I6qQhr34wZvqcrwouYRN5NiOVYJLpb6gPSoalm+P -YXOKjP4+fWr18HdZLrzsa4xPRa9XcsDNyffjWvQTfptR/2vFKN8Ffv3XUqxUx6av -VCyRKa8xAUS/pHVGnzFQY+oqWREn2wIDAQABo2cwZTBjBgNVHREEXDBagh1kbnMx -LmFsdC1uYW1lLnBnLXNzbHRlc3QudGVzdIIdZG5zMi5hbHQtbmFtZS5wZy1zc2x0 -ZXN0LnRlc3SCGioud2lsZGNhcmQucGctc3NsdGVzdC50ZXN0MA0GCSqGSIb3DQEB -CwUAA4IBAQAuV+4TNADB/AinkjQVyzPtmeWDWZJDByRSGIzGlrYtzzrJzdRkohlL -svZi0QQWbYq3pkRoUncYXXp/JvS48Ft1jRi87RpLRiPRxJC9Eq77kMS5UKCIs86W -0nuYQ2tNmgHb7gnLHEr2t9gFEXcLwUAnRfNJK56KVmCl/v3/4kcVDLlL6L+pL80r -WGKGvixNy3bDCJ/YGJu6NH+H7NMlqFcg07nEWUHgMzETGGycTcPy3S6mY5P/1Ep1 -MCSTucUKoBIte2t5p9vM6bsFIioQDAYABhacmC62Z5xNW8evmNVtBDPLR1THsWhq -UjzdIzjpDgv1KUCVEPc1uVrZ5eju+aoU +MIIDSzCCAjOgAwIBAgIIICEDAxQSBwMwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMCAxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANdIkKX1X+Jwqo5EXC1z/TjUKnYTDzHYx2rCqprBU8fN0mSy +lMyjDm+eo924PN7LahqCHeDCMbapwymkoNfpLHkNRwotHLvxN5RyxJD4m5fXclRo +V1ZzwwXTqXlECwrzzYGst/7muDM9DX+0vXIAvQGbvxBGI0CBM3ztHBADXlSFrYGX +zN/to9KZmeOgBGJRGSZJg09P5px5N2E49yOqkIa9+MGb6nK8KLmETeTYjlWCS6W+ +oD0qGpZvj2Fzioz+Pn1q9fB3WS687GuMT0WvV3LAzcn341r0E36bUf9rxSjfBX79 +11KsVMemr1QskSmvMQFEv6R1Rp8xUGPqKlkRJ9sCAwEAAaNnMGUwYwYDVR0RBFww +WoIdZG5zMS5hbHQtbmFtZS5wZy1zc2x0ZXN0LnRlc3SCHWRuczIuYWx0LW5hbWUu +cGctc3NsdGVzdC50ZXN0ghoqLndpbGRjYXJkLnBnLXNzbHRlc3QudGVzdDANBgkq +hkiG9w0BAQsFAAOCAQEAuRAyYBwAZLKERoYDy/kE9LKddJfLhledTJ7+cIWs6T9V +KBfWBHZYxfxmdBYwqVZfog8c5uHREfWiUPoF/aMq3ARay96aMh4xXJ+2a7HAmknF +9AJWRieoc3H/QkMzAuT8IDTmoEarsr8vsX1MGabobZte/B9tEjq/z5t3GfLrHMVX +5092U6Ka40ii4U1VwjR8YnRBwjm3UpLmZJAjvXjw13/XucNV5O8Plo1yvS+G0AMh +KdMxExiItVtjZteiA0pJf0YGAzTFyzvwBljTcs4NfZ2M0ta9i0r4BF7wQ8tDezN7 +VxdJVPc5xPqncp0cMdUAE2xDmYlKEqB0kuAHNwH5/Q== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-no-names.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-no-names.crt index 97e11176..b5d05890 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-no-names.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-no-names.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC1jCCAb4CAQUwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNlcnZlciBjZXJ0czAe -Fw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMCAxHjAcBgNVBAsMFVBvc3Rn -cmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AJ85/vh52iDZAeQmWt47o0kR7VVlRLGf4sF4cfxPl+eIWIzhib1fajdcqFiy81LC -+t9bAyRqMyR3dve9RGK6IDFjMH/0DBf3tFSRnxN+5TdSAhKIJslmtUdOl8kS/smF -4+BikCg509aq0U+ac79e/q42OyvH9X/cI6i9SPd4hzJDMCX54LZT1Of/90nSQX6E -Oc5Hcj/d7psBugmMBW8uXYAGvJpq14e5RoK78F/mYbUNqtc1c8pi4/4quSMeEfQp -Dgmzee7ts8SIbQT8mYJHjnaPvZYpv4+Ikc7F0wzLO1neTpsYaVvDrSMLBCdQkCU8 -vgb1T6WlVgbp/sfE5okSxx8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAh+erODlf -+mEK2toZhaAmikNJ3Toj9P7I0C0Mo/tl2aVz8jQc/ft5t3blwZHfRzC9WmgnZLdY -yiCVgUlf9Kwhi836Btbczj3cK6MrngQneFBzSnCzsj40CuQAw5TOI8XRFFGL+fpl -o7ZnbmMZRhkPqDmNWXfpu7CYOFQyExkDoo0lTfqM+tF8zuKVTmsuWWvZpjuvqWFQ -/L+XRXi0cvhh+DY9vJiKNRg4exF7/tSedTJmLA8skuaXgAVez4rqzX4k1XnQo6Vi -YpAIQ4dGiijY24fDq2I/6pO3xlWtN+Lwu44Mnn2vWRtXijT69P5R12W8XS7+ciTU -NXu/iOo8f7mNDA== +MIIC3TCCAcUCCCAhAwMUEgcEMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAgMR4wHAYDVQQL +DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCfOf74edog2QHkJlreO6NJEe1VZUSxn+LBeHH8T5fniFiM4Ym9X2o3 +XKhYsvNSwvrfWwMkajMkd3b3vURiuiAxYzB/9AwX97RUkZ8TfuU3UgISiCbJZrVH +TpfJEv7JhePgYpAoOdPWqtFPmnO/Xv6uNjsrx/V/3COovUj3eIcyQzAl+eC2U9Tn +//dJ0kF+hDnOR3I/3e6bAboJjAVvLl2ABryaateHuUaCu/Bf5mG1DarXNXPKYuP+ +KrkjHhH0KQ4Js3nu7bPEiG0E/JmCR452j72WKb+PiJHOxdMMyztZ3k6bGGlbw60j +CwQnUJAlPL4G9U+lpVYG6f7HxOaJEscfAgMBAAEwDQYJKoZIhvcNAQELBQADggEB +AJAwYwIL4oj3NisXCXkEp9zqDXiZvNW9yW3bY8lFFCpU7o5n92tCf2OFAkKaYhF1 +Eb2weyDULtW7W/wgdlOZL9npayYKzTusl6e8xfTQyjRCsoKWvnWOEkPH7VraZJ8c +Ko1KhaVWX98VLdlUh5giYAEkdhk0qPYKsQ32unBXXJu0pX63pnPDoaUBiZUWr/3l +CfkjgGY5YA8YxiDlHGNF1qlcX2fQKloDlvtH0L5Enwt25w2/IvWhTN6YxDR+rgdD +XYbQr6o6vsmnZTJ3zUZ6XFo98sZq5L9oy1pcC8roV7w0AUVxraTWYILyGfNgruG8 +xsok/hu1L2VnktveEW/qoVs= -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-revoked.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-revoked.crt index 1ca5e6d3..3bb0f164 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-revoked.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-revoked.crt @@ -1,18 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIC/DCCAeQCAQYwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UEAww3VGVzdCBDQSBm -b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNlcnZlciBjZXJ0czAe -Fw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEYxHjAcBgNVBAsMFVBvc3Rn -cmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5hbWUucGctc3NsdGVz -dC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAooPO8lSz434p -4PBYBbTN8jkLW3cHEpTCH4yvC0V40hzGEl30HPLp82e+kxr+Q0+gd82fvc4Yth5I -PKINznp28GMs5/E9cUU3hMK4jFhKLMiOeIve3M/9ryHK874qpNjJoSxxPz7+s2eq -WoFc2px0KFIamTTLfi7Ju9aPb/AMlZNsUnbRsj7fQc7EJ8rwOnezw2Wy5VK4soX+ -qpuJ0Nm44ApzT8YmjYX/kAX0yQxgQuYbpcBWr9cOQjegu3FAqHqRh9ye7d8jQzCv -34Wg/ar4rkqyQDcokuWAE7KQbnk51t7omzhM8eswFOAL1pas/8jWBvy0VjYVU34P -9aXxP8GiHQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAS9abT/PhJgwAnm46Rzu16 -lL7tDb3SeR1RL25xZLzCexHcYJFi7aDZix3QlLRvf6HPqqUPuPYRICTBF4+fieEh -r5LotdAnadfYONwoB5GiYy2d93VGqlLosI27R6/tVvImXupviPpIYMDgBBRr1pZc -ykQOjog6T+xk9TqsfFQDe2/VKF7a5RxOA/V77GZ5qge5Nlx9jSXQ/WUG9vDQj9BA -d4nOwvjauKlcSqUU/3uVKntXQTNjmyq7S75eBitS920LLfjTL9LInLugDikFa/J/ -yPBkJLa/+rNMPikcnF3ci4Oi/XwLA8kGdGZAADuiIOeyORMuLFoTk7KpOYGKS5/U +MIIDAzCCAesCCCAhAwMUEgcFMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg +Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBGMR4wHAYDVQQL +DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxJDAiBgNVBAMMG2NvbW1vbi1uYW1lLnBn +LXNzbHRlc3QudGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKKD +zvJUs+N+KeDwWAW0zfI5C1t3BxKUwh+MrwtFeNIcxhJd9Bzy6fNnvpMa/kNPoHfN +n73OGLYeSDyiDc56dvBjLOfxPXFFN4TCuIxYSizIjniL3tzP/a8hyvO+KqTYyaEs +cT8+/rNnqlqBXNqcdChSGpk0y34uybvWj2/wDJWTbFJ20bI+30HOxCfK8Dp3s8Nl +suVSuLKF/qqbidDZuOAKc0/GJo2F/5AF9MkMYELmG6XAVq/XDkI3oLtxQKh6kYfc +nu3fI0Mwr9+FoP2q+K5KskA3KJLlgBOykG55Odbe6Js4TPHrMBTgC9aWrP/I1gb8 +tFY2FVN+D/Wl8T/Boh0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAxVHoqX25W4Hx +pMNjv2AJzcB7D+c+dUXAmLLJ7jh6szWeL0M2E5qX4dLc8LzQKnXv5ZcT4i/akjDX +etdzuqh03kvDJvUkHclSWffmowmWMTG6GCA6S/2TQzSibIptkwqs74aIkayVJaC4 +jCBR+PVT8+cE2FMD6dAWu//fyEcpTg6XpZ/Upgu9OITGNaEQUGz8pSRkTgspfO0Q +AKPmql6dpywReIlr5mzy9liCzf/BbAVHGmP/pBGIkLn2AzvPLCQ/UFZYT6aH7l5J +nzmFhgRC3U5wPMdelHGrPMXg6OHCcyrQY0kEi7N/GQ5+jZkICoQuPJ7APKEZAUgO +XRwVulaWJQ== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.crt new file mode 100644 index 00000000..1c35956d --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDezCCAi4CFCrZutHsw0Vl3OCgOmvtL0I/XAZyMEIGCSqGSIb3DQEBCjA1oA8w +DQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiBAIC +AN4wRjEkMCIGA1UEAwwbY29tbW9uLW5hbWUucGctc3NsdGVzdC50ZXN0MR4wHAYD +VQQLDBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUwHhcNMjMwMjEzMDEyMjA2WhcNMjMw +MzE1MDEyMjA2WjBGMSQwIgYDVQQDDBtjb21tb24tbmFtZS5wZy1zc2x0ZXN0LnRl +c3QxHjAcBgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASAwCwYJKoZIhvcN +AQEKA4IBDwAwggEKAoIBAQC6YtrZZukJ4n31gKpcIOl65D9roe2jzcIBX1AZq1fR +I6qmt7aR0iFCKEy9D2fs6lM+NVQSurg7b0gKL+XoOadySAxALIrUwcCQM7rZvUR0 +aKo3Qm0U00ir4x0i73/sTpY25zBSFoqGldmlqiIIWxpe8hqZEc6Sc78Bs2FaAa9A +5sTLaX5nG6jyreJweLcmv+TYFVqxNq7Y7tC67zWXr6r49JBkSHSibzBr/uFxOGsP +B9hwGo4/foACjeDNAT0vjwMLnV19Sd2zf9daBo+sd9bCj2C5CpOyXxFtO7cMh0tP +U3ZqcYPViFxcPObmhnJgqlBbgZD/WLxm1aFgUYjqMQ47AgMBAAEwQgYJKoZIhvcN +AQEKMDWgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQME +AgEFAKIEAgIA3gOCAQEAQpYu7fz9iz8CplCOp4SJ1eO9UjbtdxzvuaVR751TfYrX +OO19jq7YyWgqJDwROnDJBFEy9B+HaXTfscEHpGIHAIpx7S7az/gLnO90HshXcK+/ +CbjW9axRB9TrD2zOrISl9NSuEZ5tbd5/Ml2yzY85CCjYPuNy+euH5XgcXcwF3Q49 +G5eDJnaCCYzwdEOZY8ris9o9go8aL6zNAfhUKToRUfeoBCStOLZSgb6d/IKRB9eg +M0FImsMI3j5zHCiH0HhMwCRFRuZqTp1EMBHANIJncTZSGWQyKQ71zO/l/3YzwNfm +c2gyeh0DJWFkEZD3spWs8K6UEoTESP6Ivj47LmnWjg== +-----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.key b/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.key new file mode 100644 index 00000000..a5bc297f --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-rsapss.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADALBgkqhkiG9w0BAQoEggSpMIIEpQIBAAKCAQEAumLa2WbpCeJ99YCq +XCDpeuQ/a6Hto83CAV9QGatX0SOqpre2kdIhQihMvQ9n7OpTPjVUErq4O29ICi/l +6DmnckgMQCyK1MHAkDO62b1EdGiqN0JtFNNIq+MdIu9/7E6WNucwUhaKhpXZpaoi +CFsaXvIamRHOknO/AbNhWgGvQObEy2l+Zxuo8q3icHi3Jr/k2BVasTau2O7Quu81 +l6+q+PSQZEh0om8wa/7hcThrDwfYcBqOP36AAo3gzQE9L48DC51dfUnds3/XWgaP +rHfWwo9guQqTsl8RbTu3DIdLT1N2anGD1YhcXDzm5oZyYKpQW4GQ/1i8ZtWhYFGI +6jEOOwIDAQABAoIBAAPXZpi55PdieTXUQpxPxDJpx01p4IdAKoRzS3EwkP99d/sR +qNCekaUyIW9UqT2Hx2Tb1MzCBUZQ40I1614fehK5C2sFdtnls8/gdaIe7FqwIYxA +lcxhpvjHX2Ht8gLc8OvpC5vDOJkZymZsHM8qa8zcTD/AzzNBOpdHqwdES58YoqEb +5LOVLBRIoLli2eAWrrnoYl7MQuh3CHHtWGjn3drTzg6Tl2umfNhTMFANZssNexl4 +6npPHBASdevWWsqB8GXD56PaqWxxnjtwzk06lRbloSQYJOicI8OK7eaySpRuHpZV +3vJKhY3bcRN6joxveXA7jaAPSBvNXp2w5fQ1b2ECgYEA1mzqOCln87aaLzZ1KlWL +QfxcXmcke1lJgbhW+iEh6iht2OmBlntAlIVv/D3yBDhNrHdrNlUcWvm+VSrbVyxn +6e1RWHAGPzZNhpcg4odxdI6Oton/OBtsEQ7A6UJ6S7bPTVGVwi9fA4fI0Pfne0wV +IeJHvjDZboOBi6TF2thcJ2sCgYEA3oYzAt4tEiA+nQyNnP4nWZ17XONA6H8yVeUY +Sk6eczg8eGAQz9afVtbSI3uRIfQbQ1+mjaUl4pVej2UDXcROpYHgwCLJRBBDbzzB +4IcPh2woFGZOScQu9Q64C8g6MH4zm3WkFvXyJF3j3dHGFZGq8nmwEARJgAsQ6Yig +kYL8+HECgYEAtuKUbqxaPlL7dNNU4XOu3+v3eIkuY4qHGH36qUKDI62x6zVWUtvy ++/pHxnOrLRA8p6H/LosvMSUbwpZYGCUGyE2iePSrT1TokKfr42o0SX6hmG1g4iD5 +bh8QSKNrnZJhg4fXXJV8y40PqbQXmmENESZnnH8bpJfDcTBrlLm+99sCgYEA3F1f +xPZLAglGmHZnA1K5m0iWc01l6RiVu3RNksC6r3XAhKD15S0wzGme3p6vAkXgfd8K +bHlgxDuR0kWBiOkvzT2KWhvY3vuQHGe5w+VcnoqgQltyKiELM4mo/5oA7ib8anac +0lQrwJHuZ6wnExMXjFqv3ZyxQQk0bWDtSkzCwjECgYEAusqqCAmryRFWdOif2z+Z +3vfseSvBdQMj2FO7weqCVPV4Gnae0TO7A1bUpVX/pfkDEPitt5oUgS2KTozW5vwz +yaQTSB8RO8EG66GURZvPs3Cerkyrgk/OMmbCv3B0ALwhPMBqpemJqeBOuyaAjY8W +Tqb6E2ofRlYND0xH83gCTig= +-----END PRIVATE KEY----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-single-alt-name.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-single-alt-name.crt index e7403f3a..7affdd68 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-single-alt-name.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server-single-alt-name.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDCzCCAfOgAwIBAgIBAzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0 -IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNl -cnRzMB4XDTE4MTEyNzEzNDA1NFoXDTQ2MDQxNDEzNDA1NFowIDEeMBwGA1UECwwV -UG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAxYocLWWuiDsDzJ7wLc0zfwkGJAEy4hlHjTA5GXSEnGPlOnx1fxejZOGL -1HLff5h8zB+SQXrplHCcwwRrxVgGY7P59kXMXX1akTwXUJHc/EoTtqLO+6fHLygz -F1d0i5NPO3xrk1wMt7bYLhiPbWpplWiHXzbJy8wf3dXgzCwtxXf8Z1UqjtCnA/Zk -J/kPWuHJxzH5OvDJvZsq+Fbkl3catFpwUlAV9TKsC78W/K5I+afzppsmSvsIKAWW -Dp7g71IVjvJeI6Aui2yhDn9iuJMuKe9RMYIwJLFqiX3urHcjaBSkJm6Lsf7gO30v -kVwIyyGXRNTfZ2yPDoSXVZvOnq+gKwIDAQABoy4wLDAqBgNVHREEIzAhgh9zaW5n -bGUuYWx0LW5hbWUucGctc3NsdGVzdC50ZXN0MA0GCSqGSIb3DQEBCwUAA4IBAQBU -8wp8KZfS8vClx2gYSRlbXu3J1oAu4EBh45OuuRuLOJUhQZYcjFB3d/s0R1kcCQkB -EekV9X1iQSzk/HQq4uWi6ViUzxTR67Q6TXEFo8iuqJ6Rag7R7G6fhRD1upf1lev+ -rz7F9GsoWLyLAg8//DUfq1kfQUyy6TxamoRs0vipZ4s0p4G8rbRCxKT1WTRLJFdd -fSDVuMNuQQKTQXNdp6cYn+ikEhbUv/gG2S7Xiy2UM8oR7DR54nZBAKxgujWJZPfX -/ieSwLxnLFyePwtwgk9xMmywFBjHWTxSdyI1UnJwWC917BSw4M00djsRv5COsBX7 -v/Co7oiMyTrCqyCsWOBu +MIIDEjCCAfqgAwIBAgIIICEDAxQSBwIwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl +cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMCAxHjAc +BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMWKHC1lrog7A8ye8C3NM38JBiQBMuIZR40wORl0hJxj5Tp8 +dX8Xo2Thi9Ry33+YfMwfkkF66ZRwnMMEa8VYBmOz+fZFzF19WpE8F1CR3PxKE7ai +zvunxy8oMxdXdIuTTzt8a5NcDLe22C4Yj21qaZVoh182ycvMH93V4MwsLcV3/GdV +Ko7QpwP2ZCf5D1rhyccx+Trwyb2bKvhW5Jd3GrRacFJQFfUyrAu/FvyuSPmn86ab +Jkr7CCgFlg6e4O9SFY7yXiOgLotsoQ5/YriTLinvUTGCMCSxaol97qx3I2gUpCZu +i7H+4Dt9L5FcCMshl0TU32dsjw6El1Wbzp6voCsCAwEAAaMuMCwwKgYDVR0RBCMw +IYIfc2luZ2xlLmFsdC1uYW1lLnBnLXNzbHRlc3QudGVzdDANBgkqhkiG9w0BAQsF +AAOCAQEAUIhBQLzQgd7wHlT9DARxcC7SZwQtnk2BVqMYTRBU4uIa0i2HVyetpe1P +rREthYq5sgaSqdonD9Splg8BLUlah9y3v9j6DBxkxNnz/3AZuA5oPaC/TZ+lwlX3 +QNWWFNaNZdcQbvjUvoPXIbJ6U9UDfByOJdoN4kJ6xe8Faj1Mp5Euqzr1ErrMtPWJ +XLnXLV4WyAx+iMAbofXNlCyUorPGA8lRudzQ7bKdrhMZDE66VYwlwsUejEiODt7M +NGTDs4aAZz9cBRjMeXhvX60cFQoykjAvWbieUKOgaFmJJyKemFj12cLeWyxvUodI +kYtgAdzftiCSrbDjl1pzPSM6RC/E/A== -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-ss.crt b/third_party/spanner_pg/src/test/ssl/ssl/server-ss.crt deleted file mode 100644 index d775e602..00000000 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-ss.crt +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDGDCCAgCgAwIBAgIUVR71MjsbvBO6T1gJQaL/6hMwhqQwDQYJKoZIhvcNAQEL -BQAwRjEkMCIGA1UEAwwbY29tbW9uLW5hbWUucGctc3NsdGVzdC50ZXN0MR4wHAYD -VQQLDBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUwHhcNMTgxMTI3MTM0MDU0WhcNNDYw -NDE0MTM0MDU0WjBGMSQwIgYDVQQDDBtjb21tb24tbmFtZS5wZy1zc2x0ZXN0LnRl -c3QxHjAcBgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANWzVPMk7i5f+W0eEadRE+TTAtsIK08CkLMUnjs7 -zJkxnnm6RGBXPx6vK3AkAIi+wG4YmXjYP3GuMiXaLjnWh2kzBSfIRQyNbTThnhSu -3nDjAVkPexsSrPyiKimFuNgDfkGe5dQKa9Ag2SuVU4vd9SYxOMAiIFIC4ts4MLWW -Jf5D/PehdSuc0e5Me+91Nnbz90nlds4lHvuDR+aKnZlTHmch3wfhXv7lNQImIBzf -wl36Kd/bWB0fAEVFse3iZWmigaI/9FKh//WIq43TNLxn68OCQoyMe/HGjZDR/Xwo -3rE6jg6/iAwSWib9yabfYPKbqq2GoFy6aYmmEquaDgLuX7kCAwEAATANBgkqhkiG -9w0BAQsFAAOCAQEAtHR6o4UIO/aWEAzcmnJKsQDC999jbQGiqs9+v62mz5TvCk/1 -gL9/s/yfGY+pnDGW1ijI2xiL9KCJzjd8YB+F8iUViVQ6uHBxghxC1H2qOIr2UPFQ -gQRu7d0DByQBsiXMOdw10luGo1oHhqMe5J7VyMVG/7aRpr6zYKrH7PzsB8ucvxzv -Lm8ez0WBPebV69sim431iJcVcxxBbFd4qUJ9cHIc7VO2mSaazsIOzbd400POF/vk -gfpDs48GfnZ+X3hgoQA4u7eudLqttI+j1xV+IHlCtaa1nDHymUrN/FhI1x+6c1SU -V12eHqVatPMe0d+OCJPqIL9lbe+sGXlxDkMqAQ== ------END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server-ss.key b/third_party/spanner_pg/src/test/ssl/ssl/server-ss.key deleted file mode 100644 index a5e7f4bb..00000000 --- a/third_party/spanner_pg/src/test/ssl/ssl/server-ss.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAttI8Qu3wJgwp9RqLEqgO5GlYdA4bG+OyB4y+Bx4DQ7fhaJvJ -vwBfY8ig+nPZU5WJNDyoaPtDg2uQwWbUq9WXkdktAxelrisQ/oJiCscPARlAIM6U -XPOXai10XQ6QsMaaa6cXIGkMZVfhYEbuN0Q8TJSC1MbSQ/TtCnWxMRmktRv5xx8y -2DgGbYRSiuBNE0vneQMjBJeRs19k/V8Alk49vOk8T8Ep0PFkAQglpUc7/LFueKry -sVW+6ptdmqqHUZTdZhU/IojKEhUF8dtyGpGF9bE0kfjB7vXth8LKQ9Utik7VS1tQ -E8fK2ttvxAqDf8s3MChnXbMN6QrzaGSS44oZKwIDAQABAoIBAQCsMhjQcYxgSdS7 -J+UWDXT5bsABj8e43R4yPj4+NeadQfTtss6zOIagVbhKLhPkxlQU/40gVIminw4Z -G+H0d5nrpcLfxsYm5il7jxMJU7SuNDpSrEDRzB4xw952R+HAn0+TVi5SOJ+UVNHS -/Pwi0gJ5nugbwakKmQcrcu8ScDTS34yFScMIRUYiKQ44TDiDtwyL07sc4ob1X/uY -na1GnyOBjYEg+9nRwmV+QZwPjyP3Qe81rvH7saV2R2oc4uFU151KtoIT96V4FnpD -CsFPGVul4i428zYDEguzEMWvPkOKrfFA63gfYl3JRbPYE9ISdZXU8UX6XEE3Y6sU -VmeXK/IBAoGBAPLELsFdMqMhycXxrGuQ4HiH5/vQ2RhFcOf842a8qysopFC5kluf -Y83dMy9GP8BLgt/NMseBDFcaGgaZPhD10kpW0BCg5GKdkcBfuIE5C/rfe4m82TqC -VkriGimG8FkTCQS9ghGwbDWYZnMZbqyJ2iRt/+M9Lvfd1tYTCQtNuI/TAoGBAMDJ -g/vS12j4uJ+SDy7QY6suSOjkQoGO8qonhx9W/2XJSH4KL1ubeOt4eOJksHnwueCW -YD+2+T4+NDumMnmT7Rl8is1RfnnWNH91tylPB9I5Hyff/+PU5rUSoRfpmeckH3pc -5EmfoaqT7V436hjkZF1uY1QJjDMopSyg3TSVmtJJAoGBAOAVAAdSDGSR0ppYuktL -njcDU7mXjFwf9NjeD9UL/39F823j7NmPpWMnc5CGamAIE1SbJu0KDCb2G+HNX4Hu -Nd6ShVlj+YuhYCDO+hKlYo597J016Nld52MVkwqT2JSPwnpSppXHYAqUkrRZXFP8 -ppOLyW+qUQlQBnbxeR6q7dorAoGAU/gxzYCDJIyY1Z/njwtjLg8l4JJzSTz7AxPe -bc8VxL7MHWHQSMVKAL3jYTBcEXDBdUnqODY5D1xGoeh8uamtrtkpF860GNss2Its -MMjkbjNFF7ggG5sCtcGceu7bguqf70sAf/TQlJyD2fLeuuLXuD45c0QJVcsRToPu -dVXoLkkCgYEA5JkhCPE9a2ssrqi1ZFt3FAayulycM+r+wJY7zNIwv/ydzbE5D4Ar -s8YOjhwyBoyorrEztcvIKF5XA89ZIwHiKZQxJTWGeFKq/PYTclzwlOXAimkdYNXn -Nc/5RLjEeophXb4f3WPjMBliYGX0tOPhT+buHep+f0enxgO8Z2a4Omg= ------END RSA PRIVATE KEY----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server.crl b/third_party/spanner_pg/src/test/ssl/ssl/server.crl index 717951c2..331a83cb 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server.crl +++ b/third_party/spanner_pg/src/test/ssl/ssl/server.crl @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx -MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN -BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND -xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq -nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6 -RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ -SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu -41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ== +MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz +MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy +MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV ++10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo +4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R +ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy +imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx +B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= -----END X509 CRL----- diff --git a/third_party/spanner_pg/src/test/ssl/ssl/server_ca.crt b/third_party/spanner_pg/src/test/ssl/ssl/server_ca.crt index 9f727bf9..0d6d7a6f 100644 --- a/third_party/spanner_pg/src/test/ssl/ssl/server_ca.crt +++ b/third_party/spanner_pg/src/test/ssl/ssl/server_ca.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDDTCCAfWgAwIBAgIBATANBgkqhkiG9w0BAQsFADBAMT4wPAYDVQQDDDVUZXN0 -IHJvb3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzdWl0 -ZTAeFw0xODExMjcxMzQwNTRaFw00NjA0MTQxMzQwNTRaMEIxQDA+BgNVBAMMN1Rl -c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiSnYZbmc9vpCt -Ku1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45YD7Nq0kBCq3dH -t2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7XdRbRR6we1s9VG -/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7AOyoLEJlNS0B -QW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hynon/nQQvBP77 -SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMBW4L4VaGg3W6F -h6iuJwRfAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB -AFlcKTaU/Ug3Q0hr3P1UQ6dWyK4aVn9rs4jvVfFl0a0RnbBowqK2C+zQVUWYTcjo -KHREVje65goj6VzRB6ko/9mAQ6PZP8jRuRhfCmvmvSQ/mWdgPzSRsUh9MwgEm9c2 -vNbqwaznEU8cYZnLpHiR9O5S7/qWWxehjYtxk5Eb4J006YglYfHnhrRFJvPbiqlf -IOEivZ7gIVfvaOTbLjmN2kLOnzdlwpXGjxxg4Nu9ZhXOhfrplzUvRfmqvVsDiHXb -USIdX+OFZZqr64IKG4drT4K4Bt2wupOEyX4ZFsUXXd+Hgq83SWmV4wzflcpmGkLC -JZ3CEMu8/WA5uQBXdQUozlE= +MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD +VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg +c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 +GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z +atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 +UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs +qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J +/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC ++FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb +QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F +0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 +UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 +xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA +OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg -----END CERTIFICATE----- diff --git a/third_party/spanner_pg/src/test/ssl/sslfiles.mk b/third_party/spanner_pg/src/test/ssl/sslfiles.mk new file mode 100644 index 00000000..5d5e1376 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/sslfiles.mk @@ -0,0 +1,268 @@ +#------------------------------------------------------------------------- +# +# Makefile for sslfiles +# +# The SSL test files are completely disjoint from the rest of the build; they +# don't rely on other targets or on Makefile.global. Since these recipes rely +# on some default Make behavior that's disabled in the main build tree, such +# as intermediate cleanup, they've been moved into their own separate file. +# The main Makefile in this directory defers to this helper file when +# building the sslfiles-related targets. +# +# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/test/ssl/sslfiles.mk +# +#------------------------------------------------------------------------- + +# +# To add a new server or client certificate, add a new .config file in +# the conf/ directory, then add to either SERVERS or CLIENTS below. A +# 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 \ + server-no-names \ + server-revoked +CLIENTS := client client-dn client-revoked client_ext + +# +# To add a new non-standard certificate, add it to SPECIAL_CERTS and then add +# a recipe for creating it to the "Special-case certificates" section below. +# +SPECIAL_CERTS := ssl/server-rsapss.crt + +# Likewise for non-standard keys +SPECIAL_KEYS := ssl/server-password.key \ + ssl/client-der.key \ + ssl/client-encrypted-pem.key \ + ssl/client-encrypted-der.key \ + ssl/server-rsapss.key + +# +# These files are just concatenations of other files. You can add new ones to +# COMBINATIONS here, then declare the constituent files as dependencies in the +# "Combined files" section below. +# +COMBINATIONS := \ + ssl/both-cas-1.crt \ + ssl/both-cas-2.crt \ + ssl/root+server_ca.crt \ + ssl/root+server.crl \ + ssl/root+client_ca.crt \ + ssl/root+client.crl \ + ssl/client+client_ca.crt + +CERTIFICATES := root_ca server_ca client_ca $(SERVERS) $(CLIENTS) +STANDARD_CERTS := $(CERTIFICATES:%=ssl/%.crt) +STANDARD_KEYS := $(CERTIFICATES:%=ssl/%.key) +CRLS := ssl/root.crl \ + ssl/client.crl \ + ssl/server.crl + +SSLFILES := \ + $(STANDARD_CERTS) \ + $(STANDARD_KEYS) \ + $(SPECIAL_CERTS) \ + $(SPECIAL_KEYS) \ + $(COMBINATIONS) \ + $(CRLS) +SSLDIRS := ssl/client-crldir \ + ssl/server-crldir \ + ssl/root+client-crldir \ + ssl/root+server-crldir + +# This target re-generates all the key and certificate files. Usually we just +# use the ones that are committed to the tree without rebuilding them. +# +.PHONY: sslfiles +sslfiles: $(SSLFILES) $(SSLDIRS) + +# +# Special-case certificates +# + +# Root CA is self-signed. +ssl/root_ca.crt: ssl/root_ca.key conf/root_ca.config + openssl req -new -x509 -config conf/root_ca.config -days 10000 -key $< -out $@ + +# Certificate using RSA-PSS algorithm. Also self-signed. +ssl/server-rsapss.crt: ssl/server-rsapss.key conf/server-rsapss.config + $(OPENSSL) req -new -x509 -config conf/server-rsapss.config -key $< -out $@ + +# +# Special-case keys +# +# All targets here are contained in $(SPECIAL_KEYS). +# + +# Password-protected version of server-cn-only.key +ssl/server-password.key: ssl/server-cn-only.key + openssl rsa -aes256 -in $< -out $@ -passout 'pass:secret1' + +# Key that uses the RSA-PSS algorithm +ssl/server-rsapss.key: + $(OPENSSL) genpkey -algorithm rsa-pss -out $@ + +# DER-encoded version of client.key +ssl/client-der.key: ssl/client.key + openssl rsa -in $< -outform DER -out $@ + +# Convert client.key to encrypted PEM (X.509 text) and DER (X.509 ASN.1) +# formats to test libpq's support for the sslpassword= option. +ssl/client-encrypted-pem.key: ssl/client.key + openssl rsa -in $< -outform PEM -aes128 -passout 'pass:dUmmyP^#+' -out $@ +# TODO Explicitly choosing -aes128 generates a key unusable to PostgreSQL with +# OpenSSL 3.0.0, so fall back on the default for now. +ssl/client-encrypted-der.key: ssl/client.key + openssl rsa -in $< -outform DER -passout 'pass:dUmmyP^#+' -out $@ + +# +# Combined files +# +# All targets in $(COMBINATIONS) share a single recipe; just declare the +# necessary dependencies and they'll be smashed together. +# + +# Root certificate file that contains both CA certificates, for testing +# that multiple certificates can be used. +ssl/both-cas-1.crt: ssl/root_ca.crt ssl/client_ca.crt ssl/server_ca.crt + +# The same, but the certs are in different order +ssl/both-cas-2.crt: ssl/root_ca.crt ssl/server_ca.crt ssl/client_ca.crt + +# A root certificate file for the client, to validate server certs. +ssl/root+server_ca.crt: ssl/root_ca.crt ssl/server_ca.crt + +# and for the server, to validate client certs +ssl/root+client_ca.crt: ssl/root_ca.crt ssl/client_ca.crt + +# and for the client, to present to the server +ssl/client+client_ca.crt: ssl/client.crt ssl/client_ca.crt + +# If a CRL is used, OpenSSL requires a CRL file for *all* the CAs in the +# chain, even if some of them are empty. +ssl/root+server.crl: ssl/root.crl ssl/server.crl +ssl/root+client.crl: ssl/root.crl ssl/client.crl + +$(COMBINATIONS): + cat $^ > $@ + +# +# Standard keys +# + +$(STANDARD_KEYS): + openssl genrsa -out $@ 2048 + chmod 0600 $@ + +# +# Standard certificates +# + +CA_CERTS := ssl/server_ca.crt ssl/client_ca.crt +SERVER_CERTS := $(SERVERS:%=ssl/%.crt) +CLIENT_CERTS := $(CLIENTS:%=ssl/%.crt) + +# See the "CA State" section below. +root_ca_state_files := ssl/root_ca-certindex ssl/root_ca-certindex.attr ssl/root_ca.srl +server_ca_state_files := ssl/server_ca-certindex ssl/server_ca-certindex.attr ssl/server_ca.srl +client_ca_state_files := ssl/client_ca-certindex ssl/client_ca-certindex.attr ssl/client_ca.srl + +# These are the workhorse recipes. `openssl ca` can't be safely run from +# parallel processes, so we must mark the entire Makefile .NOTPARALLEL. +.NOTPARALLEL: +$(CA_CERTS): ssl/%.crt: ssl/%.csr conf/%.config conf/cas.config ssl/root_ca.crt | ssl/new_certs_dir $(root_ca_state_files) + openssl ca -batch -config conf/cas.config -name root_ca -notext -in $< -out $@ + +$(SERVER_CERTS): ssl/%.crt: ssl/%.csr conf/%.config conf/cas.config ssl/server_ca.crt | ssl/new_certs_dir $(server_ca_state_files) + openssl ca -batch -config conf/cas.config -name server_ca -notext -in $< -out $@ + +$(CLIENT_CERTS): ssl/%.crt: ssl/%.csr conf/%.config conf/cas.config ssl/client_ca.crt | ssl/new_certs_dir $(client_ca_state_files) + openssl ca -batch -config conf/cas.config -name client_ca -notext -in $< -out $@ + +# The CSRs don't need to persist after a build. +.INTERMEDIATE: $(CERTIFICATES:%=ssl/%.csr) +ssl/%.csr: ssl/%.key conf/%.config + openssl req -new -key $< -out $@ -config conf/$*.config + +# +# CA State +# +# All of these are intended to be order-only dependencies; additionally, the +# pattern recipes are marked as explicit intermediates. The goal is for Make to +# create the state files once for each CA, allow them to accumulate whatever +# state is needed, and then automatically remove them at the end of the run. +# + +.INTERMEDIATE: $(root_ca_state_files) $(server_ca_state_files) $(client_ca_state_files) + +# OpenSSL requires a directory to put all generated certificates in. We don't +# use this for anything, but we need a location. +ssl/new_certs_dir: + mkdir $@ + +ssl/%-certindex: + touch $@ + +ssl/%-certindex.attr: + echo "unique_subject=no" > $@ + +# The first serial number for each CA is based on the current timestamp, to +# avoid collisions across Make runs. +ssl/%.srl: + date +%Y%m%d%H%M%S00 > $@ + +# +# CRLs +# + +ssl/root.crl: ssl/root_ca.crt | $(root_ca_state_files) + openssl ca -config conf/cas.config -name root_ca -gencrl -out $@ + +ssl/server.crl: ssl/server-revoked.crt ssl/server_ca.crt | $(server_ca_state_files) + openssl ca -config conf/cas.config -name server_ca -revoke $< + openssl ca -config conf/cas.config -name server_ca -gencrl -out $@ + +ssl/client.crl: ssl/client-revoked.crt ssl/client_ca.crt | $(client_ca_state_files) + openssl ca -config conf/cas.config -name client_ca -revoke $< + openssl ca -config conf/cas.config -name client_ca -gencrl -out $@ + +# +# CRL hash directories +# + +ssl/root+server-crldir: ssl/server.crl ssl/root.crl +ssl/root+client-crldir: ssl/client.crl ssl/root.crl +ssl/server-crldir: ssl/server.crl +ssl/client-crldir: ssl/client.crl + +crlhashfile = $(shell openssl crl -hash -noout -in $(1)).r0 + +ssl/%-crldir: + mkdir -p $@ + rm -f $@/*.r0 + $(foreach crl,$^,cp $(crl) $@/$(call crlhashfile,$(crl)) &&) true + touch $@ + +.PHONY: sslfiles-clean +sslfiles-clean: + rm -f $(SSLFILES) ssl/*.old ssl/*.csr ssl/*.srl ssl/*-certindex* + rm -rf $(SSLDIRS) ssl/new_certs_dir + +# The difference between the below clean targets and sslfiles-clean is that the +# clean targets will be run during a "standard" recursive clean run from the +# main build tree. The sslfiles-clean target must be run explicitly from this +# directory. +.PHONY: clean distclean maintainer-clean +clean distclean maintainer-clean: + rm -rf ssl/*.old ssl/new_certs_dir ssl/client*_tmp.key diff --git a/third_party/spanner_pg/src/test/ssl/t/001_ssltests.pl b/third_party/spanner_pg/src/test/ssl/t/001_ssltests.pl index 8cdd0d2e..c570b48a 100644 --- a/third_party/spanner_pg/src/test/ssl/t/001_ssltests.pl +++ b/third_party/spanner_pg/src/test/ssl/t/001_ssltests.pl @@ -1,28 +1,34 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; -use PostgresNode; -use TestLib; +use Config qw ( %Config ); +use PostgreSQL::Test::Cluster; +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'; } -else + +my $ssl_server = SSL::Server->new(); + +sub sslkey { - plan tests => 110; + 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 @@ -35,36 +41,10 @@ # 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 ssl/client.key to ssl/client_tmp.key etc for the rest -# of the tests. -my @keys = ( - "client", "client-revoked", - "client-der", "client-encrypted-pem", - "client-encrypted-der", "client-dn"); -foreach my $key (@keys) -{ - copy("ssl/${key}.key", "ssl/${key}_tmp.key") - or die - "couldn't copy ssl/${key}.key to ssl/${key}_tmp.key for permissions change: $!"; - chmod 0600, "ssl/${key}_tmp.key" - or die "failed to change permissions on ssl/${key}_tmp.key: $!"; -} - -# Also make a copy of that explicitly world-readable. We can't -# necessarily rely on the file in the source tree having those -# permissions. Add it to @keys to include it in the final clean -# up phase. -copy("ssl/client.key", "ssl/client_wrongperms_tmp.key"); -chmod 0644, "ssl/client_wrongperms_tmp.key"; -push @keys, 'client_wrongperms'; - #### Set up the server. note "setting up data directory"; -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init; # PGHOST is enforced here to set up the node, subsequent connections @@ -75,31 +55,33 @@ # 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' ], @@ -132,12 +114,13 @@ 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 # in ~/.postgresql/. -my $default_ssl_connstr = "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid"; +my $default_ssl_connstr = + "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid"; $common_connstr = "$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test"; @@ -251,8 +234,32 @@ 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, '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"; @@ -281,7 +288,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"; @@ -303,9 +310,60 @@ 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 +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_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, '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"; @@ -321,9 +379,51 @@ 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, '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"; @@ -338,7 +438,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"; @@ -406,42 +506,50 @@ # correct client cert in unencrypted PEM $node->connect_ok( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=ssl/client_tmp.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=ssl/client-der_tmp.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=ssl/client-encrypted-pem_tmp.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=ssl/client-encrypted-der_tmp.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=ssl/client-encrypted-pem_tmp.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 "ssl/client-encrypted-pem_tmp.key": bad decrypt\E! -); + qr!private key file \".*client-encrypted-pem\.key\": bad decrypt!,); # correct client cert using whole DN my $dn_connstr = "$common_connstr dbname=certdb_dn"; $node->connect_ok( - "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt sslkey=ssl/client-dn_tmp.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/ @@ -451,14 +559,16 @@ $dn_connstr = "$common_connstr dbname=certdb_dn_re"; $node->connect_ok( - "$dn_connstr user=ssltestuser sslcert=ssl/client-dn.crt sslkey=ssl/client-dn_tmp.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=ssl/client-dn_tmp.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 => [ @@ -476,23 +586,53 @@ # correct client cert in encrypted PEM with empty password $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=ssl/client-encrypted-pem_tmp.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 "ssl/client-encrypted-pem_tmp.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=ssl/client-encrypted-pem_tmp.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 "ssl/client-encrypted-pem_tmp.key": processing error\E! + qr!private key file \".*client-encrypted-pem\.key\": processing error! ); } # pg_stat_ssl + +my $serialno = `openssl x509 -serial -noout -in ssl/client.crt`; +if ($? == 0) +{ + # OpenSSL prints serial numbers in hexadecimal and converting the serial + # from hex requires a 64-bit capable Perl as the serialnumber is based on + # the current timestamp. On 32-bit fall back to checking for it being an + # integer like how we do when grabbing the serial fails. + if ($Config{ivsize} == 8) + { + $serialno =~ s/^serial=//; + $serialno =~ s/\s+//g; + $serialno = hex($serialno); + } + else + { + $serialno = '\d+'; + } +} +else +{ + # OpenSSL isn't functioning on the user's PATH. This probably isn't worth + # skipping the test over, so just fall back to a generic integer match. + warn 'couldn\'t run `openssl x509` to get client cert serialno'; + $serialno = '\d+'; +} + command_like( [ 'psql', @@ -503,12 +643,13 @@ '-P', 'null=_null_', '-d', - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=ssl/client_tmp.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,1,\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 @@ -517,16 +658,18 @@ skip "Permissions check not enforced on Windows", 2 if ($windows_os); $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=ssl/client_wrongperms_tmp.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 "ssl/client_wrongperms_tmp.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=ssl/client_tmp.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"/, @@ -536,9 +679,10 @@ # revoked client cert $node->connect_fails( - "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt sslkey=ssl/client-revoked_tmp.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/, + expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, # revoked certificates should not authenticate the user log_unlike => [qr/connection authenticated:/],); @@ -549,31 +693,36 @@ "$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=ssl/client_tmp.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=ssl/client_tmp.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=ssl/client_tmp.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=ssl/client_tmp.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", @@ -584,17 +733,16 @@ 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=ssl/client-revoked_tmp.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/); + expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|); -# clean up -foreach my $key (@keys) -{ - unlink("ssl/${key}_tmp.key"); -} +done_testing(); diff --git a/third_party/spanner_pg/src/test/ssl/t/002_scram.pl b/third_party/spanner_pg/src/test/ssl/t/002_scram.pl index a508bbde..566cb125 100644 --- a/third_party/spanner_pg/src/test/ssl/t/002_scram.pl +++ b/third_party/spanner_pg/src/test/ssl/t/002_scram.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test SCRAM authentication and TLS channel binding types use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; use File::Copy; @@ -14,13 +14,26 @@ 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. @@ -29,8 +42,10 @@ # Determine whether build supports tls-server-end-point. my $supports_tls_server_end_point = check_pg_config("#define HAVE_X509_GET_SIGNATURE_NID 1"); - -my $number_of_tests = $supports_tls_server_end_point ? 11 : 12; +# Determine whether build supports detection of hash algorithms for +# RSA-PSS certificates. +my $supports_rsapss_certs = + check_pg_config("#define HAVE_X509_GET_SIGNATURE_INFO 1"); # Allocation of base connection string shared among multiple tests. my $common_connstr; @@ -38,7 +53,7 @@ # Set up the server. note "setting up data directory"; -my $node = get_new_node('primary'); +my $node = PostgreSQL::Test::Cluster->new('primary'); $node->init; # PGHOST is enforced here to set up the node, subsequent connections @@ -48,9 +63,12 @@ $node->start; # Configure server for SSL connections, with password handling. -configure_test_server_for_ssl($node, $SERVERHOSTADDR, $SERVERHOSTCIDR, - "scram-sha-256", "pass", "scram-sha-256"); -switch_server_cert($node, 'server-cn-only'); +$ssl_server->configure_test_server_for_ssl( + $node, $SERVERHOSTADDR, $SERVERHOSTCIDR, + "scram-sha-256", + 'password' => "pass", + 'password_enc' => "scram-sha-256"); +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"; @@ -95,9 +113,14 @@ # because channel binding is not performed. Note that ssl/client.key may # be used in a different test, so the name of this temporary client key # is chosen here to be unique. -my $client_tmp_key = "ssl/client_scram_tmp.key"; -copy("ssl/client.key", $client_tmp_key); -chmod 0600, $client_tmp_key; +my $cert_tempdir = PostgreSQL::Test::Utils::tempdir(); +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: $!"; +chmod 0600, "$cert_tempdir/client_scram.key" + or die "failed to change permissions on $cert_tempdir/client_scram.key: $!"; +$client_tmp_key =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; $node->connect_fails( "sslcert=ssl/client.crt sslkey=$client_tmp_key sslrootcert=invalid hostaddr=$SERVERHOSTADDR host=localhost dbname=certdb user=ssltestuser channel_binding=require", "Cert authentication and channel_binding=require", @@ -113,7 +136,17 @@ qr/connection authenticated: identity="ssltestuser" method=scram-sha-256/ ]); -# clean up -unlink($client_tmp_key); - -done_testing($number_of_tests); +# Now test with a server certificate that uses the RSA-PSS algorithm. +# This checks that the certificate can be loaded and that channel binding +# works. (see bug #17760) +if ($supports_rsapss_certs) +{ + switch_server_cert($node, certfile => 'server-rsapss'); + $node->connect_ok( + "$common_connstr user=ssltestuser channel_binding=require", + "SCRAM with SSL and channel_binding=require, server certificate uses 'rsassaPss'", + log_like => [ + qr/connection authenticated: identity="ssltestuser" method=scram-sha-256/ + ]); +} +done_testing(); diff --git a/third_party/spanner_pg/src/test/ssl/t/003_sslinfo.pl b/third_party/spanner_pg/src/test/ssl/t/003_sslinfo.pl new file mode 100644 index 00000000..87fb18a3 --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/t/003_sslinfo.pl @@ -0,0 +1,165 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +use File::Copy; + +use FindBin; +use lib $FindBin::RealBin; + +use SSL::Server; + +if ($ENV{with_ssl} ne 'openssl') +{ + plan skip_all => 'OpenSSL not supported by this build'; +} + +#### 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 +# postgresql-ssl-regression.test. +my $SERVERHOSTADDR = '127.0.0.1'; +# This is the pattern to use in pg_hba.conf to match incoming connections. +my $SERVERHOSTCIDR = '127.0.0.1/32'; + +# Allocation of base connection string shared among multiple tests. +my $common_connstr; + +#### Set up the server. + +note "setting up data directory"; +my $node = PostgreSQL::Test::Cluster->new('primary'); +$node->init; + +# PGHOST is enforced here to set up the node, subsequent connections +# will use a dedicated connection string. +$ENV{PGHOST} = $node->host; +$ENV{PGPORT} = $node->port; +$node->start; + +$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, 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 +# in ~/.postgresql/. +my $default_ssl_connstr = + "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid"; + +$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_ext.key'); + +# Make sure we can connect even though previous test suites have established this +$node->connect_ok( + $common_connstr, + "certificate authorization succeeds with correct client cert in PEM format", +); + +my $result; + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_is_used();", + connstr => $common_connstr); +is($result, 't', "ssl_is_used() for TLS connection"); + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_version();", + connstr => $common_connstr + . " ssl_min_protocol_version=TLSv1.2 " + . "ssl_max_protocol_version=TLSv1.2"); +is($result, 'TLSv1.2', "ssl_version() correctly returning TLS protocol"); + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_cipher() = cipher FROM pg_stat_ssl WHERE pid = pg_backend_pid();", + connstr => $common_connstr); +is($result, 't', "ssl_cipher() compared with pg_stat_ssl"); + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_client_cert_present();", + connstr => $common_connstr); +is($result, 't', "ssl_client_cert_present() for connection with cert"); + +$result = $node->safe_psql( + "trustdb", + "SELECT ssl_client_cert_present();", + 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"); + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_client_serial() = client_serial FROM pg_stat_ssl WHERE pid = pg_backend_pid();", + connstr => $common_connstr); +is($result, 't', "ssl_client_serial() compared with pg_stat_ssl"); + +# Must not use safe_psql since we expect an error here +$result = $node->psql( + "certdb", + "SELECT ssl_client_dn_field('invalid');", + connstr => $common_connstr); +is($result, '3', "ssl_client_dn_field() for an invalid field"); + +$result = $node->safe_psql( + "trustdb", + "SELECT ssl_client_dn_field('commonName');", + 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"); + +$result = $node->safe_psql( + "certdb", + "SELECT '/CN=' || ssl_client_dn_field('commonName') = client_dn FROM pg_stat_ssl WHERE pid = pg_backend_pid();", + connstr => $common_connstr); +is($result, 't', "ssl_client_dn_field() for commonName"); + +$result = $node->safe_psql( + "certdb", + "SELECT ssl_issuer_dn() = issuer_dn FROM pg_stat_ssl WHERE pid = pg_backend_pid();", + connstr => $common_connstr); +is($result, 't', "ssl_issuer_dn() for connection with cert"); + +$result = $node->safe_psql( + "certdb", + "SELECT '/CN=' || ssl_issuer_field('commonName') = issuer_dn FROM pg_stat_ssl WHERE pid = pg_backend_pid();", + connstr => $common_connstr); +is($result, 't', "ssl_issuer_field() for commonName"); + +$result = $node->safe_psql( + "certdb", + "SELECT value, critical FROM ssl_extension_info() WHERE name = 'basicConstraints';", + connstr => $common_connstr); +is($result, 'CA:FALSE|t', 'extract extension from cert'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/ssl/t/SSL/Backend/OpenSSL.pm b/third_party/spanner_pg/src/test/ssl/t/SSL/Backend/OpenSSL.pm new file mode 100644 index 00000000..aed6005b --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/t/SSL/Backend/OpenSSL.pm @@ -0,0 +1,229 @@ + +# 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 parameters 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/third_party/spanner_pg/src/test/ssl/t/SSL/Server.pm b/third_party/spanner_pg/src/test/ssl/t/SSL/Server.pm new file mode 100644 index 00000000..9520578e --- /dev/null +++ b/third_party/spanner_pg/src/test/ssl/t/SSL/Server.pm @@ -0,0 +1,356 @@ + +# 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 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/third_party/spanner_pg/src/test/ssl/t/SSLServer.pm b/third_party/spanner_pg/src/test/ssl/t/SSLServer.pm deleted file mode 100644 index 804d0082..00000000 --- a/third_party/spanner_pg/src/test/ssl/t/SSLServer.pm +++ /dev/null @@ -1,205 +0,0 @@ - -# Copyright (c) 2021, 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 PostgresNode; -use TestLib; -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, $password, - $password_enc) = @_; - - my $pgdata = $node->data_dir; - - # 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"); - $node->psql('postgres', "CREATE DATABASE trustdb"); - $node->psql('postgres', "CREATE DATABASE certdb"); - $node->psql('postgres', "CREATE DATABASE certdb_dn"); - $node->psql('postgres', "CREATE DATABASE certdb_dn_re"); - $node->psql('postgres', "CREATE DATABASE certdb_cn"); - $node->psql('postgres', "CREATE DATABASE verifydb"); - - # Update password of each user as needed. - if (defined($password)) - { - $node->psql('postgres', - "SET password_encryption='$password_enc'; ALTER USER ssltestuser PASSWORD '$password';" - ); - # A special user that always has an md5-encrypted password - $node->psql('postgres', - "SET password_encryption='md5'; ALTER USER md5testuser PASSWORD '$password';" - ); - $node->psql('postgres', - "SET password_encryption='$password_enc'; ALTER USER anotheruser PASSWORD '$password';" - ); - } - - # 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; diff --git a/third_party/spanner_pg/src/test/subscription/Makefile b/third_party/spanner_pg/src/test/subscription/Makefile index 28fd6f6c..5f2b3a5c 100644 --- a/third_party/spanner_pg/src/test/subscription/Makefile +++ b/third_party/spanner_pg/src/test/subscription/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/subscription # -# 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 # # src/test/subscription/Makefile diff --git a/third_party/spanner_pg/src/test/subscription/README b/third_party/spanner_pg/src/test/subscription/README index fb5382e1..69e40c5f 100644 --- a/third_party/spanner_pg/src/test/subscription/README +++ b/third_party/spanner_pg/src/test/subscription/README @@ -9,15 +9,19 @@ 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" -(including installing the hstore extension). 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. +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/third_party/spanner_pg/src/test/subscription/t/001_rep_changes.pl b/third_party/spanner_pg/src/test/subscription/t/001_rep_changes.pl index 2aedd9fb..6e6ebd80 100644 --- a/third_party/spanner_pg/src/test/subscription/t/001_rep_changes.pl +++ b/third_party/spanner_pg/src/test/subscription/t/001_rep_changes.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Basic logical replication test use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 32; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -57,6 +57,11 @@ "CREATE INDEX idx_no_replidentity_index ON tab_no_replidentity_index(c1)" ); +# Replicate the changes without columns +$node_publisher->safe_psql('postgres', "CREATE TABLE tab_no_col()"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_no_col default VALUES"); + # Setup structure on subscriber $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_notrep (a int)"); $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_ins (a int)"); @@ -87,13 +92,16 @@ "CREATE INDEX idx_no_replidentity_index ON tab_no_replidentity_index(c1)" ); +# replication of the table without columns +$node_subscriber->safe_psql('postgres', "CREATE TABLE tab_no_col()"); + # Setup logical replication my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; $node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub"); $node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub_ins_only WITH (publish = insert)"); $node_publisher->safe_psql('postgres', - "ALTER PUBLICATION tap_pub ADD TABLE tab_rep, tab_full, tab_full2, tab_mixed, tab_include, tab_nothing, tab_full_pk, tab_no_replidentity_index" + "ALTER PUBLICATION tap_pub ADD TABLE tab_rep, tab_full, tab_full2, tab_mixed, tab_include, tab_nothing, tab_full_pk, tab_no_replidentity_index, tab_no_col" ); $node_publisher->safe_psql('postgres', "ALTER PUBLICATION tap_pub_ins_only ADD TABLE tab_ins"); @@ -141,6 +149,9 @@ $node_publisher->safe_psql('postgres', "INSERT INTO tab_no_replidentity_index VALUES(1)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_no_col default VALUES"); + $node_publisher->wait_for_catchup('tap_sub'); $result = $node_subscriber->safe_psql('postgres', @@ -169,6 +180,10 @@ 1, "value replicated to subscriber without replica identity index"); +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_no_col"); +is($result, qq(2), 'check replicated changes for table having no columns'); + # insert some duplicate rows $node_publisher->safe_psql('postgres', "INSERT INTO tab_full SELECT generate_series(1,10)"); @@ -177,7 +192,7 @@ # # When a publisher drops a table from publication, it should also stop sending # its changes to subscribers. We look at the subscriber whether it receives -# the row that is inserted to the table in the publisher after it is dropped +# the row that is inserted to the table on the publisher after it is dropped # from the publication. $result = $node_subscriber->safe_psql('postgres', "SELECT count(*), min(a), max(a) FROM tab_ins"); @@ -408,7 +423,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';" ); @@ -417,7 +432,9 @@ ); $node_publisher->poll_query_until('postgres', "SELECT pid != $oldpid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" -) or die "Timed out while waiting for apply to restart after changing CONNECTION"; + ) + or die + "Timed out while waiting for apply to restart after changing CONNECTION"; $oldpid = $node_publisher->safe_psql('postgres', "SELECT pid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" @@ -427,7 +444,9 @@ ); $node_publisher->poll_query_until('postgres', "SELECT pid != $oldpid FROM pg_stat_replication WHERE application_name = 'tap_sub' AND state = 'streaming';" -) or die "Timed out while waiting for apply to restart after changing PUBLICATION"; + ) + or die + "Timed out while waiting for apply to restart after changing PUBLICATION"; $node_publisher->safe_psql('postgres', "INSERT INTO tab_ins SELECT generate_series(1001,1100)"); @@ -463,6 +482,32 @@ $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"); @@ -481,7 +526,9 @@ "ALTER SUBSCRIPTION tap_sub RENAME TO tap_sub_renamed"); $node_publisher->poll_query_until('postgres', "SELECT pid != $oldpid FROM pg_stat_replication WHERE application_name = 'tap_sub_renamed' AND state = 'streaming';" -) or die "Timed out while waiting for apply to restart after renaming SUBSCRIPTION"; + ) + or die + "Timed out while waiting for apply to restart after renaming SUBSCRIPTION"; # check all the cleanup $node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_renamed"); @@ -527,3 +574,5 @@ ok( $reterr =~ m/WARNING: wal_level is insufficient to publish logical changes/, 'CREATE PUBLICATION while wal_level=minimal'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/002_types.pl b/third_party/spanner_pg/src/test/subscription/t/002_types.pl index f73b8efd..d6c6f493 100644 --- a/third_party/spanner_pg/src/test/subscription/t/002_types.pl +++ b/third_party/spanner_pg/src/test/subscription/t/002_types.pl @@ -1,21 +1,21 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # This tests that more complex datatypes are replicated correctly # by logical replication use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -114,7 +114,7 @@ "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub WITH (slot_name = tap_sub_slot)" ); -# Wait for initial sync to finish +# Wait for initial sync to finish as well $node_subscriber->wait_for_subscription_sync($node_publisher, 'tap_sub'); # Insert initial test data @@ -561,3 +561,5 @@ $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/003_constraints.pl b/third_party/spanner_pg/src/test/subscription/t/003_constraints.pl index 1182a128..63c22699 100644 --- a/third_party/spanner_pg/src/test/subscription/t/003_constraints.pl +++ b/third_party/spanner_pg/src/test/subscription/t/003_constraints.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # This test checks that constraints work on subscriber use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 6; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -137,3 +137,5 @@ BEGIN $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/004_sync.pl b/third_party/spanner_pg/src/test/subscription/t/004_sync.pl index 545599b8..6251c07b 100644 --- a/third_party/spanner_pg/src/test/subscription/t/004_sync.pl +++ b/third_party/spanner_pg/src/test/subscription/t/004_sync.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests for logical replication table syncing use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 8; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->append_conf('postgresql.conf', "wal_retrieve_retry_interval = 1ms"); @@ -174,3 +174,5 @@ $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/005_encoding.pl b/third_party/spanner_pg/src/test/subscription/t/005_encoding.pl index 407f7164..3ee05224 100644 --- a/third_party/spanner_pg/src/test/subscription/t/005_encoding.pl +++ b/third_party/spanner_pg/src/test/subscription/t/005_encoding.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test replication between databases with different encodings use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init( allows_streaming => 'logical', extra => [ '--locale=C', '--encoding=UTF8' ]); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init( allows_streaming => 'logical', extra => [ '--locale=C', '--encoding=LATIN1' ]); @@ -48,3 +48,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/006_rewrite.pl b/third_party/spanner_pg/src/test/subscription/t/006_rewrite.pl index 0aeed5f6..fdcb3f81 100644 --- a/third_party/spanner_pg/src/test/subscription/t/006_rewrite.pl +++ b/third_party/spanner_pg/src/test/subscription/t/006_rewrite.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test logical replication behavior with heap rewrites use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 2; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -61,3 +61,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/007_ddl.pl b/third_party/spanner_pg/src/test/subscription/t/007_ddl.pl index dd10d5cf..5756f156 100644 --- a/third_party/spanner_pg/src/test/subscription/t/007_ddl.pl +++ b/third_party/spanner_pg/src/test/subscription/t/007_ddl.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test some logical replication DDL behavior use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -41,5 +41,35 @@ 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 on the publisher/, + "Create subscription throws warning for non-existent publication"); + +# Wait for initial table sync to finish. +$node_subscriber->wait_for_subscription_sync($node_publisher, 'mysub1'); + +# 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 on 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 on the publisher/, + "Alter subscription set publication throws warning for non-existent publication" +); + $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/008_diff_schema.pl b/third_party/spanner_pg/src/test/subscription/t/008_diff_schema.pl index b296c9a9..b4d44a20 100644 --- a/third_party/spanner_pg/src/test/subscription/t/008_diff_schema.pl +++ b/third_party/spanner_pg/src/test/subscription/t/008_diff_schema.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test behavior with different schema on subscriber use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 5; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -120,3 +120,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/009_matviews.pl b/third_party/spanner_pg/src/test/subscription/t/009_matviews.pl index 92c7d18b..1ce696d4 100644 --- a/third_party/spanner_pg/src/test/subscription/t/009_matviews.pl +++ b/third_party/spanner_pg/src/test/subscription/t/009_matviews.pl @@ -1,18 +1,18 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test materialized views behavior use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 1; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -50,3 +50,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/010_truncate.pl b/third_party/spanner_pg/src/test/subscription/t/010_truncate.pl index 21f25466..a6fe82a7 100644 --- a/third_party/spanner_pg/src/test/subscription/t/010_truncate.pl +++ b/third_party/spanner_pg/src/test/subscription/t/010_truncate.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test TRUNCATE use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 14; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # setup -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +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)); @@ -235,3 +235,5 @@ $result = $node_subscriber->safe_psql('postgres', "SELECT deadlocks FROM pg_stat_database WHERE datname='postgres'"); is($result, qq(0), 'no deadlocks detected'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/011_generated.pl b/third_party/spanner_pg/src/test/subscription/t/011_generated.pl index 3a92b718..c5082402 100644 --- a/third_party/spanner_pg/src/test/subscription/t/011_generated.pl +++ b/third_party/spanner_pg/src/test/subscription/t/011_generated.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test generated columns use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # setup -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -95,3 +95,5 @@ BEGIN 6|132| 8|176|18 9|198|19), 'generated columns replicated with trigger'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/012_collation.pl b/third_party/spanner_pg/src/test/subscription/t/012_collation.pl index 8137a165..2182f794 100644 --- a/third_party/spanner_pg/src/test/subscription/t/012_collation.pl +++ b/third_party/spanner_pg/src/test/subscription/t/012_collation.pl @@ -1,30 +1,26 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test collations, in particular nondeterministic ones # (only works with ICU) use strict; use warnings; -use PostgresNode; -use TestLib; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; -if ($ENV{with_icu} eq 'yes') -{ - plan tests => 2; -} -else +if ($ENV{with_icu} ne 'yes') { plan skip_all => 'ICU not supported by this build'; } -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init( allows_streaming => 'logical', extra => [ '--locale=C', '--encoding=UTF8' ]); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init( allows_streaming => 'logical', extra => [ '--locale=C', '--encoding=UTF8' ]); @@ -108,3 +104,5 @@ is($node_subscriber->safe_psql('postgres', q{SELECT b FROM tab2}), qq(bar), 'update with replica identity full with nondeterministic collation'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/013_partition.pl b/third_party/spanner_pg/src/test/subscription/t/013_partition.pl index 58d78b42..8b33e4e7 100644 --- a/third_party/spanner_pg/src/test/subscription/t/013_partition.pl +++ b/third_party/spanner_pg/src/test/subscription/t/013_partition.pl @@ -1,24 +1,24 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test logical replication with partitioned tables use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 71; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # setup -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber1 = get_new_node('subscriber1'); +my $node_subscriber1 = PostgreSQL::Test::Cluster->new('subscriber1'); $node_subscriber1->init(allows_streaming => 'logical'); $node_subscriber1->start; -my $node_subscriber2 = get_new_node('subscriber2'); +my $node_subscriber2 = PostgreSQL::Test::Cluster->new('subscriber2'); $node_subscriber2->init(allows_streaming => 'logical'); $node_subscriber2->start; @@ -405,12 +405,15 @@ 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)"); + "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 @@ -420,6 +423,8 @@ BEGIN $node_publisher->safe_psql('postgres', "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)" ); @@ -467,14 +472,16 @@ 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)" -); + "CREATE TABLE tab4 (a int PRIMARY KEY)"); $node_subscriber2->safe_psql('postgres', - "CREATE TABLE tab4_1 (a int PRIMARY KEY)" -); + "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 SET PUBLICATION pub_lower_level, pub_all"); @@ -483,9 +490,8 @@ BEGIN $node_subscriber2->wait_for_subscription_sync; # check that data is synced correctly -$result = $node_subscriber1->safe_psql('postgres', - "SELECT c, a FROM tab2"); -is( $result, qq(sub1_tab2|1), 'initial data synced for pub_viaroot'); +$result = $node_subscriber1->safe_psql('postgres', "SELECT c, a FROM tab2"); +is($result, qq(sub1_tab2|1), 'initial data synced for pub_viaroot'); # insert $node_publisher->safe_psql('postgres', "INSERT INTO tab1 VALUES (1), (0)"); @@ -495,8 +501,10 @@ BEGIN "INSERT INTO tab2 VALUES (0), (3), (5)"); $node_publisher->safe_psql('postgres', "INSERT INTO tab3 VALUES (1), (0), (3), (5)"); -$node_publisher->safe_psql('postgres', - "INSERT INTO tab4 VALUES (0)"); + +# 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'); @@ -536,13 +544,16 @@ BEGIN sub2_tab3|3 sub2_tab3|5), 'inserts into tab3 replicated'); -$result = $node_subscriber2->safe_psql('postgres', - "SELECT a FROM tab4 ORDER BY 1"); -is( $result, qq(0), 'inserts into tab4 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'); -$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) @@ -555,21 +566,21 @@ BEGIN # 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->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"); +$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'); +$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"); @@ -832,7 +843,9 @@ BEGIN $result = $node_subscriber2->safe_psql('postgres', "SELECT a, b, c FROM tab5 ORDER BY 1"); -is($result, qq(3|1|), 'updates of tab5 replicated correctly after altering table on subscriber'); +is($result, qq(3|1|), + 'updates of tab5 replicated correctly after altering table on subscriber' +); # Test that replication into the partitioned target table continues to # work correctly when the published table is altered. @@ -847,7 +860,8 @@ BEGIN $result = $node_subscriber2->safe_psql('postgres', "SELECT a, b, c FROM tab5 ORDER BY 1"); -is($result, qq(3||1), 'updates of tab5 replicated correctly after altering table on publisher'); +is($result, qq(3||1), + 'updates of tab5 replicated correctly after altering table on publisher'); # Test that replication works correctly as long as the leaf partition # has the necessary REPLICA IDENTITY, even though the actual target @@ -862,3 +876,5 @@ BEGIN $result = $node_subscriber2->safe_psql('postgres', "SELECT a, b, c FROM tab5_1 ORDER BY 1"); is($result, qq(4||1), 'updates of tab5 replicated correctly'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/014_binary.pl b/third_party/spanner_pg/src/test/subscription/t/014_binary.pl index ac178690..8d8b3572 100644 --- a/third_party/spanner_pg/src/test/subscription/t/014_binary.pl +++ b/third_party/spanner_pg/src/test/subscription/t/014_binary.pl @@ -1,21 +1,21 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Binary mode logical replication test use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 5; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create and initialize a publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create and initialize subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -132,3 +132,5 @@ $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/015_stream.pl b/third_party/spanner_pg/src/test/subscription/t/015_stream.pl index 79decdb8..cbaa327e 100644 --- a/third_party/spanner_pg/src/test/subscription/t/015_stream.pl +++ b/third_party/spanner_pg/src/test/subscription/t/015_stream.pl @@ -1,22 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test streaming of simple large transaction use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'logical_decoding_work_mem = 64kB'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -53,7 +53,7 @@ my $in = ''; my $out = ''; -my $timer = IPC::Run::timeout($TestLib::timeout_default); +my $timer = IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); my $h = $node_publisher->background_psql('postgres', \$in, \$out, $timer, on_error_stop => 0); @@ -128,3 +128,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/016_stream_subxact.pl b/third_party/spanner_pg/src/test/subscription/t/016_stream_subxact.pl index 90219f78..bc0a9cd0 100644 --- a/third_party/spanner_pg/src/test/subscription/t/016_stream_subxact.pl +++ b/third_party/spanner_pg/src/test/subscription/t/016_stream_subxact.pl @@ -1,22 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test streaming of large transaction containing large subtransactions use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 2; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'logical_decoding_work_mem = 64kB'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -86,3 +86,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/017_stream_ddl.pl b/third_party/spanner_pg/src/test/subscription/t/017_stream_ddl.pl index 558f2b9d..866f1512 100644 --- a/third_party/spanner_pg/src/test/subscription/t/017_stream_ddl.pl +++ b/third_party/spanner_pg/src/test/subscription/t/017_stream_ddl.pl @@ -1,22 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test streaming of large transaction with DDL and subtransactions use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'logical_decoding_work_mem = 64kB'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -122,3 +122,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/018_stream_subxact_abort.pl b/third_party/spanner_pg/src/test/subscription/t/018_stream_subxact_abort.pl index 676d54bd..551f16df 100644 --- a/third_party/spanner_pg/src/test/subscription/t/018_stream_subxact_abort.pl +++ b/third_party/spanner_pg/src/test/subscription/t/018_stream_subxact_abort.pl @@ -1,22 +1,22 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test streaming of large transaction containing multiple subtransactions and rollbacks use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 4; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'logical_decoding_work_mem = 64kB'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -126,3 +126,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/019_stream_subxact_ddl_abort.pl b/third_party/spanner_pg/src/test/subscription/t/019_stream_subxact_ddl_abort.pl index 9047a273..4d7da82b 100644 --- a/third_party/spanner_pg/src/test/subscription/t/019_stream_subxact_ddl_abort.pl +++ b/third_party/spanner_pg/src/test/subscription/t/019_stream_subxact_ddl_abort.pl @@ -1,23 +1,23 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Test streaming of large transaction with subtransactions, DDLs, DMLs, and # rollbacks use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 2; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'logical_decoding_work_mem = 64kB'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -80,3 +80,5 @@ $node_subscriber->stop; $node_publisher->stop; + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/020_messages.pl b/third_party/spanner_pg/src/test/subscription/t/020_messages.pl index 0e218e00..533419be 100644 --- a/third_party/spanner_pg/src/test/subscription/t/020_messages.pl +++ b/third_party/spanner_pg/src/test/subscription/t/020_messages.pl @@ -1,21 +1,21 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests that logical decoding messages use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 5; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Create publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', 'autovacuum = off'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -41,7 +41,7 @@ # Ensure a transactional logical decoding message shows up on the slot $node_subscriber->safe_psql('postgres', "ALTER SUBSCRIPTION tap_sub DISABLE"); -# wait for the replication slot to become inactive in the publisher +# wait for the replication slot to become inactive on the publisher $node_publisher->poll_query_until( 'postgres', "SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'tap_sub' AND active='f'", @@ -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' ); @@ -146,3 +145,5 @@ $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/021_twophase.pl b/third_party/spanner_pg/src/test/subscription/t/021_twophase.pl new file mode 100644 index 00000000..caa90897 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/021_twophase.pl @@ -0,0 +1,399 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# logical replication of 2PC test +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +############################### +# Setup +############################### + +# Initialize publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->append_conf('postgresql.conf', + qq(max_prepared_transactions = 10)); +$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_prepared_transactions = 10)); +$node_subscriber->start; + +# Create some pre-existing content on publisher +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_full (a int PRIMARY KEY)"); +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full SELECT generate_series(1,10); + PREPARE TRANSACTION 'some_initial_data'; + COMMIT PREPARED 'some_initial_data';"); + +# Setup structure on subscriber +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_full (a int PRIMARY KEY)"); + +# Setup logical replication +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub FOR TABLE tab_full"); + +my $appname = 'tap_sub'; +$node_subscriber->safe_psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub + CONNECTION '$publisher_connstr application_name=$appname' + PUBLICATION tap_pub + WITH (two_phase = on)"); + +# Wait for initial table sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# Also wait for two-phase to be enabled +my $twophase_query = + "SELECT count(1) = 0 FROM pg_subscription WHERE subtwophasestate NOT IN ('e');"; +$node_subscriber->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; + +############################### +# check that 2PC gets replicated to subscriber +# then COMMIT PREPARED +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (11); + PREPARE TRANSACTION 'test_prepared_tab_full';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +my $result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# check that 2PC gets committed on subscriber +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab_full';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is committed on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 11;"); +is($result, qq(1), 'Row inserted via 2PC has committed on subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber'); + +############################### +# check that 2PC gets replicated to subscriber +# then ROLLBACK PREPARED +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (12); + PREPARE TRANSACTION 'test_prepared_tab_full';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# check that 2PC gets aborted on subscriber +$node_publisher->safe_psql('postgres', + "ROLLBACK PREPARED 'test_prepared_tab_full';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is aborted on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 12;"); +is($result, qq(0), 'Row inserted via 2PC is not present on subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is aborted on subscriber'); + +############################### +# Check that ROLLBACK PREPARED is decoded properly on crash restart +# (publisher and subscriber crash) +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (12); + INSERT INTO tab_full VALUES (13); + PREPARE TRANSACTION 'test_prepared_tab';"); + +$node_subscriber->stop('immediate'); +$node_publisher->stop('immediate'); + +$node_publisher->start; +$node_subscriber->start; + +# rollback post the restart +$node_publisher->safe_psql('postgres', + "ROLLBACK PREPARED 'test_prepared_tab';"); +$node_publisher->wait_for_catchup($appname); + +# check inserts are rolled back +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a IN (12,13);"); +is($result, qq(0), 'Rows rolled back are not on the subscriber'); + +############################### +# Check that COMMIT PREPARED is decoded properly on crash restart +# (publisher and subscriber crash) +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (12); + INSERT INTO tab_full VALUES (13); + PREPARE TRANSACTION 'test_prepared_tab';"); + +$node_subscriber->stop('immediate'); +$node_publisher->stop('immediate'); + +$node_publisher->start; +$node_subscriber->start; + +# commit post the restart +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); +$node_publisher->wait_for_catchup($appname); + +# check inserts are visible +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a IN (12,13);"); +is($result, qq(2), 'Rows inserted via 2PC are visible on the subscriber'); + +############################### +# Check that COMMIT PREPARED is decoded properly on crash restart +# (subscriber only crash) +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (14); + INSERT INTO tab_full VALUES (15); + PREPARE TRANSACTION 'test_prepared_tab';"); + +$node_subscriber->stop('immediate'); +$node_subscriber->start; + +# commit post the restart +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); +$node_publisher->wait_for_catchup($appname); + +# check inserts are visible +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a IN (14,15);"); +is($result, qq(2), 'Rows inserted via 2PC are visible on the subscriber'); + +############################### +# Check that COMMIT PREPARED is decoded properly on crash restart +# (publisher only crash) +############################### + +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (16); + INSERT INTO tab_full VALUES (17); + PREPARE TRANSACTION 'test_prepared_tab';"); + +$node_publisher->stop('immediate'); +$node_publisher->start; + +# commit post the restart +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); +$node_publisher->wait_for_catchup($appname); + +# check inserts are visible +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a IN (16,17);"); +is($result, qq(2), 'Rows inserted via 2PC are visible on the subscriber'); + +############################### +# Test nested transaction with 2PC +############################### + +# check that 2PC gets replicated to subscriber +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (21); + SAVEPOINT sp_inner; + INSERT INTO tab_full VALUES (22); + ROLLBACK TO SAVEPOINT sp_inner; + PREPARE TRANSACTION 'outer'; + "); +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# COMMIT +$node_publisher->safe_psql('postgres', "COMMIT PREPARED 'outer';"); + +$node_publisher->wait_for_catchup($appname); + +# check the transaction state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber'); + +# check inserts are visible. 22 should be rolled back. 21 should be committed. +$result = $node_subscriber->safe_psql('postgres', + "SELECT a FROM tab_full where a IN (21,22);"); +is($result, qq(21), 'Rows committed are on the subscriber'); + +############################### +# Test using empty GID +############################### + +# check that 2PC gets replicated to subscriber +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (51); + PREPARE TRANSACTION '';"); +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# ROLLBACK +$node_publisher->safe_psql('postgres', "ROLLBACK PREPARED '';"); + +# check that 2PC gets aborted on subscriber +$node_publisher->wait_for_catchup($appname); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is aborted on subscriber'); + +############################### +# copy_data=false and two_phase +############################### + +#create some test tables for copy tests +$node_publisher->safe_psql('postgres', + "CREATE TABLE tab_copy (a int PRIMARY KEY)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_copy SELECT generate_series(1,5);"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE tab_copy (a int PRIMARY KEY)"); +$node_subscriber->safe_psql('postgres', "INSERT INTO tab_copy VALUES (88);"); +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); +is($result, qq(1), 'initial data in subscriber table'); + +# Setup logical replication +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_copy FOR TABLE tab_copy;"); + +my $appname_copy = 'appname_copy'; +$node_subscriber->safe_psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub_copy + CONNECTION '$publisher_connstr application_name=$appname_copy' + PUBLICATION tap_pub_copy + WITH (two_phase=on, copy_data=false);"); + +# Wait for initial table sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname_copy); + +# Also wait for two-phase to be enabled +$node_subscriber->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; + +# Check that the initial table data was NOT replicated (because we said copy_data=false) +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); +is($result, qq(1), 'initial data in subscriber table'); + +# Now do a prepare on publisher and check that it IS replicated +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_copy VALUES (99); + PREPARE TRANSACTION 'mygid';"); + +# Wait for both subscribers to catchup +$node_publisher->wait_for_catchup($appname_copy); +$node_publisher->wait_for_catchup($appname); + +# Check that the transaction has been prepared on the subscriber, there will be 2 +# prepared transactions for the 2 subscriptions. +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(2), 'transaction is prepared on subscriber'); + +# Now commit the insert and verify that it IS replicated +$node_publisher->safe_psql('postgres', "COMMIT PREPARED 'mygid';"); + +$result = + $node_publisher->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); +is($result, qq(6), 'publisher inserted data'); + +$node_publisher->wait_for_catchup($appname_copy); + +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); +is($result, qq(2), 'replicated data in subscriber table'); + +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_copy;"); +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_copy;"); + +############################### +# check all the cleanup +############################### + +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub"); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription"); +is($result, qq(0), 'check subscription was dropped on subscriber'); + +$result = $node_publisher->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_slots"); +is($result, qq(0), 'check replication slot was dropped on publisher'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel"); +is($result, qq(0), + 'check subscription relation status was dropped on subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_origin"); +is($result, qq(0), 'check replication origin was dropped on subscriber'); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/022_twophase_cascade.pl b/third_party/spanner_pg/src/test/subscription/t/022_twophase_cascade.pl new file mode 100644 index 00000000..7a797f37 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/022_twophase_cascade.pl @@ -0,0 +1,461 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test cascading logical replication of 2PC. +# +# Includes tests for options 2PC (not-streaming) and also for 2PC (streaming). +# +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +############################### +# Setup a cascade of pub/sub nodes. +# node_A -> node_B -> node_C +############################### + +# Initialize nodes +# node_A +my $node_A = PostgreSQL::Test::Cluster->new('node_A'); +$node_A->init(allows_streaming => 'logical'); +$node_A->append_conf( + 'postgresql.conf', qq( +max_prepared_transactions = 10 +logical_decoding_work_mem = 64kB +)); +$node_A->start; +# node_B +my $node_B = PostgreSQL::Test::Cluster->new('node_B'); +$node_B->init(allows_streaming => 'logical'); +$node_B->append_conf( + 'postgresql.conf', qq( +max_prepared_transactions = 10 +logical_decoding_work_mem = 64kB +)); +$node_B->start; +# node_C +my $node_C = PostgreSQL::Test::Cluster->new('node_C'); +$node_C->init(allows_streaming => 'logical'); +$node_C->append_conf( + 'postgresql.conf', qq( +max_prepared_transactions = 10 +logical_decoding_work_mem = 64kB +)); +$node_C->start; + +# Create some pre-existing content on node_A +$node_A->safe_psql('postgres', "CREATE TABLE tab_full (a int PRIMARY KEY)"); +$node_A->safe_psql( + 'postgres', " + INSERT INTO tab_full SELECT generate_series(1,10);"); + +# Create the same tables on node_B and node_C +$node_B->safe_psql('postgres', "CREATE TABLE tab_full (a int PRIMARY KEY)"); +$node_C->safe_psql('postgres', "CREATE TABLE tab_full (a int PRIMARY KEY)"); + +# Create some pre-existing content on node_A (for streaming tests) +$node_A->safe_psql('postgres', + "CREATE TABLE test_tab (a int primary key, b varchar)"); +$node_A->safe_psql('postgres', + "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); + +# Create the same tables on node_B and node_C +# columns a and b are compatible with same table name on node_A +$node_B->safe_psql('postgres', + "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" +); +$node_C->safe_psql('postgres', + "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" +); + +# Setup logical replication + +# ----------------------- +# 2PC NON-STREAMING TESTS +# ----------------------- + +# node_A (pub) -> node_B (sub) +my $node_A_connstr = $node_A->connstr . ' dbname=postgres'; +$node_A->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_A FOR TABLE tab_full, test_tab"); +my $appname_B = 'tap_sub_B'; +$node_B->safe_psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub_B + CONNECTION '$node_A_connstr application_name=$appname_B' + PUBLICATION tap_pub_A + WITH (two_phase = on)"); + +# node_B (pub) -> node_C (sub) +my $node_B_connstr = $node_B->connstr . ' dbname=postgres'; +$node_B->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_B FOR TABLE tab_full, test_tab"); +my $appname_C = 'tap_sub_C'; +$node_C->safe_psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub_C + CONNECTION '$node_B_connstr application_name=$appname_C' + PUBLICATION tap_pub_B + WITH (two_phase = on)"); + +# Wait for subscribers to finish initialization +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# Also wait for two-phase to be enabled +my $twophase_query = + "SELECT count(1) = 0 FROM pg_subscription WHERE subtwophasestate NOT IN ('e');"; +$node_B->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; +$node_C->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; + +is(1, 1, "Cascade setup is complete"); + +my $result; + +############################### +# check that 2PC gets replicated to subscriber(s) +# then COMMIT PREPARED +############################### + +# 2PC PREPARE +$node_A->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (11); + PREPARE TRANSACTION 'test_prepared_tab_full';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state is prepared on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber C'); + +# 2PC COMMIT +$node_A->safe_psql('postgres', "COMMIT PREPARED 'test_prepared_tab_full';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check that transaction was committed on subscriber(s) +$result = $node_B->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 11;"); +is($result, qq(1), 'Row inserted via 2PC has committed on subscriber B'); +$result = $node_C->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 11;"); +is($result, qq(1), 'Row inserted via 2PC has committed on subscriber C'); + +# check the transaction state is ended on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber C'); + +############################### +# check that 2PC gets replicated to subscriber(s) +# then ROLLBACK PREPARED +############################### + +# 2PC PREPARE +$node_A->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (12); + PREPARE TRANSACTION 'test_prepared_tab_full';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state is prepared on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber C'); + +# 2PC ROLLBACK +$node_A->safe_psql('postgres', "ROLLBACK PREPARED 'test_prepared_tab_full';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check that transaction is aborted on subscriber(s) +$result = $node_B->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 12;"); +is($result, qq(0), 'Row inserted via 2PC is not present on subscriber B'); +$result = $node_C->safe_psql('postgres', + "SELECT count(*) FROM tab_full where a = 12;"); +is($result, qq(0), 'Row inserted via 2PC is not present on subscriber C'); + +# check the transaction state is ended on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber C'); + +############################### +# Test nested transactions with 2PC +############################### + +# 2PC PREPARE with a nested ROLLBACK TO SAVEPOINT +$node_A->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO tab_full VALUES (21); + SAVEPOINT sp_inner; + INSERT INTO tab_full VALUES (22); + ROLLBACK TO SAVEPOINT sp_inner; + PREPARE TRANSACTION 'outer'; + "); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state prepared on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber C'); + +# 2PC COMMIT +$node_A->safe_psql('postgres', "COMMIT PREPARED 'outer';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state is ended on subscriber +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber C'); + +# check inserts are visible at subscriber(s). +# 22 should be rolled back. +# 21 should be committed. +$result = $node_B->safe_psql('postgres', + "SELECT a FROM tab_full where a IN (21,22);"); +is($result, qq(21), 'Rows committed are present on subscriber B'); +$result = $node_C->safe_psql('postgres', + "SELECT a FROM tab_full where a IN (21,22);"); +is($result, qq(21), 'Rows committed are present on subscriber C'); + +# --------------------- +# 2PC + STREAMING TESTS +# --------------------- + +my $oldpid_B = $node_A->safe_psql( + 'postgres', " + SELECT pid FROM pg_stat_replication + WHERE application_name = '$appname_B' AND state = 'streaming';"); +my $oldpid_C = $node_B->safe_psql( + 'postgres', " + SELECT pid FROM pg_stat_replication + WHERE application_name = '$appname_C' AND state = 'streaming';"); + +# Setup logical replication (streaming = on) + +$node_B->safe_psql( + 'postgres', " + ALTER SUBSCRIPTION tap_sub_B + SET (streaming = on);"); +$node_C->safe_psql( + 'postgres', " + ALTER SUBSCRIPTION tap_sub_C + SET (streaming = on)"); + +# Wait for subscribers to finish initialization + +$node_A->poll_query_until( + 'postgres', " + SELECT pid != $oldpid_B FROM pg_stat_replication + WHERE application_name = '$appname_B' AND state = 'streaming';" +) or die "Timed out while waiting for apply to restart"; +$node_B->poll_query_until( + 'postgres', " + SELECT pid != $oldpid_C FROM pg_stat_replication + WHERE application_name = '$appname_C' AND state = 'streaming';" +) or die "Timed out while waiting for apply to restart"; + +############################### +# Test 2PC PREPARE / COMMIT PREPARED. +# 1. Data is streamed as a 2PC transaction. +# 2. Then do commit prepared. +# +# Expect all data is replicated on subscriber(s) after the commit. +############################### + +# Insert, update and delete enough rows to exceed the 64kB limit. +# Then 2PC PREPARE +$node_A->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state is prepared on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber C'); + +# 2PC COMMIT +$node_A->safe_psql('postgres', "COMMIT PREPARED 'test_prepared_tab';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check that transaction was committed on subscriber(s) +$result = $node_B->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3334|3334|3334), + 'Rows inserted by 2PC have committed on subscriber B, and extra columns have local defaults' +); +$result = $node_C->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3334|3334|3334), + 'Rows inserted by 2PC have committed on subscriber C, and extra columns have local defaults' +); + +# check the transaction state is ended on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber C'); + +############################### +# Test 2PC PREPARE with a nested ROLLBACK TO SAVEPOINT. +# 0. Cleanup from previous test leaving only 2 rows. +# 1. Insert one more row. +# 2. Record a SAVEPOINT. +# 3. Data is streamed using 2PC. +# 4. Do rollback to SAVEPOINT prior to the streamed inserts. +# 5. Then COMMIT PREPARED. +# +# Expect data after the SAVEPOINT is aborted leaving only 3 rows (= 2 original + 1 from step 1). +############################### + +# First, delete the data except for 2 rows (delete will be replicated) +$node_A->safe_psql('postgres', "DELETE FROM test_tab WHERE a > 2;"); + +# 2PC PREPARE with a nested ROLLBACK TO SAVEPOINT +$node_A->safe_psql( + 'postgres', " + BEGIN; + INSERT INTO test_tab VALUES (9999, 'foobar'); + SAVEPOINT sp_inner; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + ROLLBACK TO SAVEPOINT sp_inner; + PREPARE TRANSACTION 'outer'; + "); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state prepared on subscriber(s) +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber C'); + +# 2PC COMMIT +$node_A->safe_psql('postgres', "COMMIT PREPARED 'outer';"); + +$node_A->wait_for_catchup($appname_B); +$node_B->wait_for_catchup($appname_C); + +# check the transaction state is ended on subscriber +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber B'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is ended on subscriber C'); + +# check inserts are visible at subscriber(s). +# All the streamed data (prior to the SAVEPOINT) should be rolled back. +# (9999, 'foobar') should be committed. +$result = $node_B->safe_psql('postgres', + "SELECT count(*) FROM test_tab where b = 'foobar';"); +is($result, qq(1), 'Rows committed are present on subscriber B'); +$result = $node_B->safe_psql('postgres', "SELECT count(*) FROM test_tab;"); +is($result, qq(3), 'Rows committed are present on subscriber B'); +$result = $node_C->safe_psql('postgres', + "SELECT count(*) FROM test_tab where b = 'foobar';"); +is($result, qq(1), 'Rows committed are present on subscriber C'); +$result = $node_C->safe_psql('postgres', "SELECT count(*) FROM test_tab;"); +is($result, qq(3), 'Rows committed are present on subscriber C'); + +############################### +# check all the cleanup +############################### + +# cleanup the node_B => node_C pub/sub +$node_C->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_C"); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_subscription"); +is($result, qq(0), 'check subscription was dropped on subscriber node C'); +$result = + $node_C->safe_psql('postgres', "SELECT count(*) FROM pg_subscription_rel"); +is($result, qq(0), + 'check subscription relation status was dropped on subscriber node C'); +$result = $node_C->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_origin"); +is($result, qq(0), + 'check replication origin was dropped on subscriber node C'); +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_replication_slots"); +is($result, qq(0), 'check replication slot was dropped on publisher node B'); + +# cleanup the node_A => node_B pub/sub +$node_B->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_B"); +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_subscription"); +is($result, qq(0), 'check subscription was dropped on subscriber node B'); +$result = + $node_B->safe_psql('postgres', "SELECT count(*) FROM pg_subscription_rel"); +is($result, qq(0), + 'check subscription relation status was dropped on subscriber node B'); +$result = $node_B->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_origin"); +is($result, qq(0), + 'check replication origin was dropped on subscriber node B'); +$result = + $node_A->safe_psql('postgres', "SELECT count(*) FROM pg_replication_slots"); +is($result, qq(0), 'check replication slot was dropped on publisher node A'); + +# shutdown +$node_C->stop('fast'); +$node_B->stop('fast'); +$node_A->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/023_twophase_stream.pl b/third_party/spanner_pg/src/test/subscription/t/023_twophase_stream.pl new file mode 100644 index 00000000..9b454106 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/023_twophase_stream.pl @@ -0,0 +1,324 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test logical replication of 2PC with streaming. +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +############################### +# Setup +############################### + +# Initialize publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_publisher->init(allows_streaming => 'logical'); +$node_publisher->append_conf( + 'postgresql.conf', qq( +max_prepared_transactions = 10 +logical_decoding_work_mem = 64kB +)); +$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_prepared_transactions = 10 +)); +$node_subscriber->start; + +# Create some pre-existing content on publisher +$node_publisher->safe_psql('postgres', + "CREATE TABLE test_tab (a int primary key, b varchar)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); + +# Setup structure on subscriber (columns a and b are compatible with same table name on publisher) +$node_subscriber->safe_psql('postgres', + "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" +); + +# Setup logical replication (streaming = on) +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub FOR TABLE test_tab"); + +my $appname = 'tap_sub'; +$node_subscriber->safe_psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub + CONNECTION '$publisher_connstr application_name=$appname' + PUBLICATION tap_pub + WITH (streaming = on, two_phase = on)"); + +# Wait for initial table sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# Also wait for two-phase to be enabled +my $twophase_query = + "SELECT count(1) = 0 FROM pg_subscription WHERE subtwophasestate NOT IN ('e');"; +$node_subscriber->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; + +############################### +# Check initial data was copied to subscriber +############################### +my $result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(2|2|2), 'check initial data was copied to subscriber'); + +############################### +# Test 2PC PREPARE / COMMIT PREPARED. +# 1. Data is streamed as a 2PC transaction. +# 2. Then do commit prepared. +# +# Expect all data is replicated on subscriber side after the commit. +############################### + +# check that 2PC gets replicated to subscriber +# Insert, update and delete enough rows to exceed the 64kB limit. +$node_publisher->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# 2PC transaction gets committed +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is committed on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3334|3334|3334), + 'Rows inserted by 2PC have committed on subscriber, and extra columns contain local defaults' +); +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber'); + +############################### +# Test 2PC PREPARE / ROLLBACK PREPARED. +# 1. Table is deleted back to 2 rows which are replicated on subscriber. +# 2. Data is streamed using 2PC. +# 3. Do rollback prepared. +# +# Expect data rolls back leaving only the original 2 rows. +############################### + +# First, delete the data except for 2 rows (will be replicated) +$node_publisher->safe_psql('postgres', "DELETE FROM test_tab WHERE a > 2;"); + +# Then insert, update and delete enough rows to exceed the 64kB limit. +$node_publisher->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# 2PC transaction gets aborted +$node_publisher->safe_psql('postgres', + "ROLLBACK PREPARED 'test_prepared_tab';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is aborted on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(2|2|2), + 'Rows inserted by 2PC are rolled back, leaving only the original 2 rows'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is aborted on subscriber'); + +############################### +# Check that 2PC COMMIT PREPARED is decoded properly on crash restart. +# 1. insert, update and delete enough rows to exceed the 64kB limit. +# 2. Then server crashes before the 2PC transaction is committed. +# 3. After servers are restarted the pending transaction is committed. +# +# Expect all data is replicated on subscriber side after the commit. +# Note: both publisher and subscriber do crash/restart. +############################### + +$node_publisher->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_subscriber->stop('immediate'); +$node_publisher->stop('immediate'); + +$node_publisher->start; +$node_subscriber->start; + +# commit post the restart +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); +$node_publisher->wait_for_catchup($appname); + +# check inserts are visible +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3334|3334|3334), + 'Rows inserted by 2PC have committed on subscriber, and extra columns contain local defaults' +); + +############################### +# Do INSERT after the PREPARE but before ROLLBACK PREPARED. +# 1. Table is deleted back to 2 rows which are replicated on subscriber. +# 2. Data is streamed using 2PC. +# 3. A single row INSERT is done which is after the PREPARE. +# 4. Then do a ROLLBACK PREPARED. +# +# Expect the 2PC data rolls back leaving only 3 rows on the subscriber +# (the original 2 + inserted 1). +############################### + +# First, delete the data except for 2 rows (will be replicated) +$node_publisher->safe_psql('postgres', "DELETE FROM test_tab WHERE a > 2;"); + +# Then insert, update and delete enough rows to exceed the 64kB limit. +$node_publisher->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# Insert a different record (now we are outside of the 2PC transaction) +# Note: the 2PC transaction still holds row locks so make sure this insert is for a separate primary key +$node_publisher->safe_psql('postgres', + "INSERT INTO test_tab VALUES (99999, 'foobar')"); + +# 2PC transaction gets aborted +$node_publisher->safe_psql('postgres', + "ROLLBACK PREPARED 'test_prepared_tab';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is aborted on subscriber, +# but the extra INSERT outside of the 2PC still was replicated +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3|3|3), 'check the outside insert was copied to subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is aborted on subscriber'); + +############################### +# Do INSERT after the PREPARE but before COMMIT PREPARED. +# 1. Table is deleted back to 2 rows which are replicated on subscriber. +# 2. Data is streamed using 2PC. +# 3. A single row INSERT is done which is after the PREPARE. +# 4. Then do a COMMIT PREPARED. +# +# Expect 2PC data + the extra row are on the subscriber +# (the 3334 + inserted 1 = 3335). +############################### + +# First, delete the data except for 2 rows (will be replicated) +$node_publisher->safe_psql('postgres', "DELETE FROM test_tab WHERE a > 2;"); + +# Then insert, update and delete enough rows to exceed the 64kB limit. +$node_publisher->safe_psql( + 'postgres', q{ + BEGIN; + INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + DELETE FROM test_tab WHERE mod(a,3) = 0; + PREPARE TRANSACTION 'test_prepared_tab';}); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is in prepared state on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(1), 'transaction is prepared on subscriber'); + +# Insert a different record (now we are outside of the 2PC transaction) +# Note: the 2PC transaction still holds row locks so make sure this insert is for a separare primary key +$node_publisher->safe_psql('postgres', + "INSERT INTO test_tab VALUES (99999, 'foobar')"); + +# 2PC transaction gets committed +$node_publisher->safe_psql('postgres', + "COMMIT PREPARED 'test_prepared_tab';"); + +$node_publisher->wait_for_catchup($appname); + +# check that transaction is committed on subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), count(c), count(d = 999) FROM test_tab"); +is($result, qq(3335|3335|3335), + 'Rows inserted by 2PC (as well as outside insert) have committed on subscriber, and extra columns contain local defaults' +); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'transaction is committed on subscriber'); + +############################### +# check all the cleanup +############################### + +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub"); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription"); +is($result, qq(0), 'check subscription was dropped on subscriber'); + +$result = $node_publisher->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_slots"); +is($result, qq(0), 'check replication slot was dropped on publisher'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel"); +is($result, qq(0), + 'check subscription relation status was dropped on subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_replication_origin"); +is($result, qq(0), 'check replication origin was dropped on subscriber'); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/021_alter_sub_pub.pl b/third_party/spanner_pg/src/test/subscription/t/024_add_drop_pub.pl similarity index 88% rename from third_party/spanner_pg/src/test/subscription/t/021_alter_sub_pub.pl rename to third_party/spanner_pg/src/test/subscription/t/024_add_drop_pub.pl index 4c59d44e..eaf47e66 100644 --- a/third_party/spanner_pg/src/test/subscription/t/021_alter_sub_pub.pl +++ b/third_party/spanner_pg/src/test/subscription/t/024_add_drop_pub.pl @@ -1,20 +1,20 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # This test checks behaviour of ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 3; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Initialize publisher node -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; # Create subscriber node -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -30,8 +30,7 @@ my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; $node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub_1 FOR TABLE tab_1"); -$node_publisher->safe_psql('postgres', - "CREATE PUBLICATION tap_pub_2"); +$node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub_2"); $node_subscriber->safe_psql('postgres', "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub_1, tap_pub_2" @@ -84,3 +83,5 @@ # shutdown $node_subscriber->stop('fast'); $node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/025_rep_changes_for_schema.pl b/third_party/spanner_pg/src/test/subscription/t/025_rep_changes_for_schema.pl new file mode 100644 index 00000000..4cfdb8b8 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/025_rep_changes_for_schema.pl @@ -0,0 +1,206 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Logical replication tests for schema publications +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; + +# Test replication with publications created using FOR TABLES IN SCHEMA +# option. +# Create schemas and tables on publisher +$node_publisher->safe_psql('postgres', "CREATE SCHEMA sch1"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE sch1.tab1 AS SELECT generate_series(1,10) AS a"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE sch1.tab2 AS SELECT generate_series(1,10) AS a"); +$node_publisher->safe_psql('postgres', + "CREATE TABLE sch1.tab1_parent (a int PRIMARY KEY, b text) PARTITION BY LIST (a)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE public.tab1_child1 PARTITION OF sch1.tab1_parent FOR VALUES IN (1, 2, 3)" +); +$node_publisher->safe_psql('postgres', + "CREATE TABLE public.tab1_child2 PARTITION OF sch1.tab1_parent FOR VALUES IN (4, 5, 6)" +); + +$node_publisher->safe_psql('postgres', + "INSERT INTO sch1.tab1_parent values (1),(4)"); + +# Create schemas and tables on subscriber +$node_subscriber->safe_psql('postgres', "CREATE SCHEMA sch1"); +$node_subscriber->safe_psql('postgres', "CREATE TABLE sch1.tab1 (a int)"); +$node_subscriber->safe_psql('postgres', "CREATE TABLE sch1.tab2 (a int)"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE sch1.tab1_parent (a int PRIMARY KEY, b text) PARTITION BY LIST (a)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE public.tab1_child1 PARTITION OF sch1.tab1_parent FOR VALUES IN (1, 2, 3)" +); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE public.tab1_child2 PARTITION OF sch1.tab1_parent FOR VALUES IN (4, 5, 6)" +); + +# Setup logical replication +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_schema FOR TABLES IN SCHEMA sch1"); + +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub_schema CONNECTION '$publisher_connstr' PUBLICATION tap_pub_schema" +); + +# Wait for initial table sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, 'tap_sub_schema'); + +# Check the schema table data is synced up +my $result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab1"); +is($result, qq(10|1|10), 'check rows on subscriber catchup'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab2"); +is($result, qq(10|1|10), 'check rows on subscriber catchup'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM sch1.tab1_parent order by 1"); +is( $result, qq(1| +4|), 'check rows on subscriber catchup'); + +# Insert some data into few tables and verify that inserted data is replicated +$node_publisher->safe_psql('postgres', + "INSERT INTO sch1.tab1 VALUES(generate_series(11,20))"); + +$node_publisher->safe_psql('postgres', + "INSERT INTO sch1.tab1_parent values (2),(5)"); + +$node_publisher->wait_for_catchup('tap_sub_schema'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab1"); +is($result, qq(20|1|20), 'check replicated inserts on subscriber'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT * FROM sch1.tab1_parent order by 1"); +is( $result, qq(1| +2| +4| +5|), 'check replicated inserts on subscriber'); + +# Create new table in the publication schema, verify that subscriber does not get +# the new table data before refresh. +$node_publisher->safe_psql('postgres', + "CREATE TABLE sch1.tab3 AS SELECT generate_series(1,10) AS a"); + +$node_subscriber->safe_psql('postgres', "CREATE TABLE sch1.tab3(a int)"); + +$node_publisher->wait_for_catchup('tap_sub_schema'); + +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM sch1.tab3"); +is($result, qq(0), 'check replicated inserts on subscriber'); + +# Table data should be reflected after refreshing the publication in +# subscriber. +$node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION tap_sub_schema REFRESH PUBLICATION"); + +# Wait for sync to finish +$node_subscriber->wait_for_subscription_sync; + +$node_publisher->safe_psql('postgres', "INSERT INTO sch1.tab3 VALUES(11)"); + +$node_publisher->wait_for_catchup('tap_sub_schema'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab3"); +is($result, qq(11|1|11), 'check rows on subscriber catchup'); + +# Set the schema of a publication schema table to a non publication schema and +# verify that inserted data is not reflected by the subscriber. +$node_publisher->safe_psql('postgres', + "ALTER TABLE sch1.tab3 SET SCHEMA public"); +$node_publisher->safe_psql('postgres', "INSERT INTO public.tab3 VALUES(12)"); + +$node_publisher->wait_for_catchup('tap_sub_schema'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab3"); +is($result, qq(11|1|11), 'check replicated inserts on subscriber'); + +# Verify that the subscription relation list is updated after refresh +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel WHERE srsubid IN (SELECT oid FROM pg_subscription WHERE subname = 'tap_sub_schema')" +); +is($result, qq(5), + 'check subscription relation status is not yet dropped on subscriber'); + +# Ask for data sync +$node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION tap_sub_schema REFRESH PUBLICATION"); + +# Wait for sync to finish +$node_subscriber->wait_for_subscription_sync; + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel WHERE srsubid IN (SELECT oid FROM pg_subscription WHERE subname = 'tap_sub_schema')" +); +is($result, qq(4), + 'check subscription relation status was dropped on subscriber'); + +# Drop table from the publication schema, verify that subscriber removes the +# table entry after refresh. +$node_publisher->safe_psql('postgres', "DROP TABLE sch1.tab2"); +$node_publisher->wait_for_catchup('tap_sub_schema'); +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel WHERE srsubid IN (SELECT oid FROM pg_subscription WHERE subname = 'tap_sub_schema')" +); +is($result, qq(4), + 'check subscription relation status is not yet dropped on subscriber'); + +# Table should be removed from pg_subscription_rel after refreshing the +# publication in subscriber. +$node_subscriber->safe_psql('postgres', + "ALTER SUBSCRIPTION tap_sub_schema REFRESH PUBLICATION"); + +# Wait for sync to finish +$node_subscriber->wait_for_subscription_sync; + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_subscription_rel WHERE srsubid IN (SELECT oid FROM pg_subscription WHERE subname = 'tap_sub_schema')" +); +is($result, qq(3), + 'check subscription relation status was dropped on subscriber'); + +# Drop schema from publication, verify that the inserts are not published after +# dropping the schema from publication. Here 2nd insert should not be +# published. +$node_publisher->safe_psql( + 'postgres', " + INSERT INTO sch1.tab1 VALUES(21); + ALTER PUBLICATION tap_pub_schema DROP TABLES IN SCHEMA sch1; + INSERT INTO sch1.tab1 values(22);" +); + +$node_publisher->wait_for_catchup('tap_sub_schema'); + +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*), min(a), max(a) FROM sch1.tab1"); +is($result, qq(21|1|21), 'check replicated inserts on subscriber'); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/026_stats.pl b/third_party/spanner_pg/src/test/subscription/t/026_stats.pl new file mode 100644 index 00000000..c0242f64 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/026_stats.pl @@ -0,0 +1,302 @@ + +# 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; + + +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($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') +); + +# 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.)); + +# Get subscription 2 oid +my $sub2_oid = $node_subscriber->safe_psql($db, + qq(SELECT oid FROM pg_subscription WHERE subname = '$sub2_name')); + +# Diassociate the subscription 2 from its replication slot and drop it +$node_subscriber->safe_psql( + $db, + qq( +ALTER SUBSCRIPTION $sub2_name DISABLE; +ALTER SUBSCRIPTION $sub2_name SET (slot_name = NONE); +DROP SUBSCRIPTION $sub2_name; + )); + +# Subscription stats for sub2 should be gone +is( $node_subscriber->safe_psql( + $db, qq(SELECT pg_stat_have_stats('subscription', 0, $sub2_oid))), + qq(f), + qq(Subscription stats for subscription '$sub2_name' should be removed.)); + +# Since disabling subscription doesn't wait for walsender to release the replication +# slot and exit, wait for the slot to become inactive. +$node_publisher->poll_query_until( + $db, + qq(SELECT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = '$sub2_name' AND active_pid IS NULL)) +) or die "slot never became inactive"; + +$node_publisher->safe_psql($db, + qq(SELECT pg_drop_replication_slot('$sub2_name'))); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/027_nosuperuser.pl b/third_party/spanner_pg/src/test/subscription/t/027_nosuperuser.pl new file mode 100644 index 00000000..8614bf04 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/027_nosuperuser.pl @@ -0,0 +1,319 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +# Test that logical replication respects permissions +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use Test::More; + +my ($node_publisher, $node_subscriber, $publisher_connstr, $result, $offset); +$offset = 0; + +sub publish_insert +{ + my ($tbl, $new_i) = @_; + $node_publisher->safe_psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_alice; + INSERT INTO $tbl (i) VALUES ($new_i); + )); +} + +sub publish_update +{ + my ($tbl, $old_i, $new_i) = @_; + $node_publisher->safe_psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_alice; + UPDATE $tbl SET i = $new_i WHERE i = $old_i; + )); +} + +sub publish_delete +{ + my ($tbl, $old_i) = @_; + $node_publisher->safe_psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_alice; + DELETE FROM $tbl WHERE i = $old_i; + )); +} + +sub expect_replication +{ + my ($tbl, $cnt, $min, $max, $testname) = @_; + $node_publisher->wait_for_catchup('admin_sub'); + $result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT COUNT(i), MIN(i), MAX(i) FROM $tbl)); + is($result, "$cnt|$min|$max", $testname); +} + +sub expect_failure +{ + my ($tbl, $cnt, $min, $max, $re, $testname) = @_; + $offset = $node_subscriber->wait_for_log($re, $offset); + $result = $node_subscriber->safe_psql( + 'postgres', qq( + SELECT COUNT(i), MIN(i), MAX(i) FROM $tbl)); + is($result, "$cnt|$min|$max", $testname); +} + +sub revoke_superuser +{ + my ($role) = @_; + $node_subscriber->safe_psql( + 'postgres', qq( + ALTER ROLE $role NOSUPERUSER)); +} + +sub grant_superuser +{ + my ($role) = @_; + $node_subscriber->safe_psql( + 'postgres', qq( + ALTER ROLE $role SUPERUSER)); +} + +sub revoke_bypassrls +{ + my ($role) = @_; + $node_subscriber->safe_psql( + 'postgres', qq( + ALTER ROLE $role NOBYPASSRLS)); +} + +sub grant_bypassrls +{ + my ($role) = @_; + $node_subscriber->safe_psql( + 'postgres', qq( + ALTER ROLE $role BYPASSRLS)); +} + +# Create publisher and subscriber nodes with schemas owned and published by +# "regress_alice" but subscribed and replicated by different role +# "regress_admin". For partitioned tables, layout the partitions differently +# on the publisher than on the subscriber. +# +$node_publisher = PostgreSQL::Test::Cluster->new('publisher'); +$node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); +$node_publisher->init(allows_streaming => 'logical'); +$node_subscriber->init; +$node_publisher->start; +$node_subscriber->start; +$publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +my %remainder_a = ( + publisher => 0, + subscriber => 1); +my %remainder_b = ( + publisher => 1, + subscriber => 0); + +for my $node ($node_publisher, $node_subscriber) +{ + my $remainder_a = $remainder_a{ $node->name }; + my $remainder_b = $remainder_b{ $node->name }; + $node->safe_psql( + 'postgres', qq( + CREATE ROLE regress_admin SUPERUSER LOGIN; + CREATE ROLE regress_alice NOSUPERUSER LOGIN; + GRANT CREATE ON DATABASE postgres TO regress_alice; + SET SESSION AUTHORIZATION regress_alice; + CREATE SCHEMA alice; + GRANT USAGE ON SCHEMA alice TO regress_admin; + + CREATE TABLE alice.unpartitioned (i INTEGER); + ALTER TABLE alice.unpartitioned REPLICA IDENTITY FULL; + GRANT SELECT ON TABLE alice.unpartitioned TO regress_admin; + + CREATE TABLE alice.hashpart (i INTEGER) PARTITION BY HASH (i); + ALTER TABLE alice.hashpart REPLICA IDENTITY FULL; + GRANT SELECT ON TABLE alice.hashpart TO regress_admin; + CREATE TABLE alice.hashpart_a PARTITION OF alice.hashpart + FOR VALUES WITH (MODULUS 2, REMAINDER $remainder_a); + ALTER TABLE alice.hashpart_a REPLICA IDENTITY FULL; + CREATE TABLE alice.hashpart_b PARTITION OF alice.hashpart + FOR VALUES WITH (MODULUS 2, REMAINDER $remainder_b); + ALTER TABLE alice.hashpart_b REPLICA IDENTITY FULL; + )); +} +$node_publisher->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_alice; + +CREATE PUBLICATION alice + FOR TABLE alice.unpartitioned, alice.hashpart + WITH (publish_via_partition_root = true); +)); +$node_subscriber->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_admin; +CREATE SUBSCRIPTION admin_sub CONNECTION '$publisher_connstr' PUBLICATION alice; +)); + +# Wait for initial sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, 'admin_sub'); + +# Verify that "regress_admin" can replicate into the tables +# +publish_insert("alice.unpartitioned", 1); +publish_insert("alice.unpartitioned", 3); +publish_insert("alice.unpartitioned", 5); +publish_update("alice.unpartitioned", 1 => 7); +publish_delete("alice.unpartitioned", 3); +expect_replication("alice.unpartitioned", 2, 5, 7, + "superuser admin replicates into unpartitioned"); + +# Revoke and restore superuser privilege for "regress_admin", +# verifying that replication fails while superuser privilege is +# missing, but works again and catches up once superuser is restored. +# +revoke_superuser("regress_admin"); +publish_update("alice.unpartitioned", 5 => 9); +expect_failure( + "alice.unpartitioned", + 2, + 5, + 7, + 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, + "admin with restored superuser privilege replicates update"); + +# Grant INSERT, UPDATE, DELETE privileges on the target tables to +# "regress_admin" so that superuser privileges are not necessary for +# replication. +# +# Note that UPDATE and DELETE also require SELECT privileges, which +# will be granted in subsequent test. +# +$node_subscriber->safe_psql( + 'postgres', qq( +ALTER ROLE regress_admin NOSUPERUSER; +SET SESSION AUTHORIZATION regress_alice; +GRANT INSERT,UPDATE,DELETE ON + alice.unpartitioned, + alice.hashpart, alice.hashpart_a, alice.hashpart_b + TO regress_admin; +REVOKE SELECT ON alice.unpartitioned FROM regress_admin; +)); + +publish_insert("alice.unpartitioned", 11); +expect_replication("alice.unpartitioned", 3, 7, 11, + "nosuperuser admin with INSERT privileges can replicate into unpartitioned" +); + +publish_update("alice.unpartitioned", 7 => 13); +expect_failure( + "alice.unpartitioned", + 3, + 7, + 11, + qr/ERROR: ( [A-Z0-9]+:)? permission denied for table unpartitioned/msi, + "non-superuser admin without SELECT privileges fails to replicate update" +); + +# Now grant SELECT +# +$node_subscriber->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_alice; +GRANT SELECT ON + alice.unpartitioned, + alice.hashpart, alice.hashpart_a, alice.hashpart_b + TO regress_admin; +)); + +publish_delete("alice.unpartitioned", 9); +expect_replication("alice.unpartitioned", 2, 11, 13, + "nosuperuser admin with all table privileges can replicate into unpartitioned" +); + +# Test partitioning +# +publish_insert("alice.hashpart", 101); +publish_insert("alice.hashpart", 102); +publish_insert("alice.hashpart", 103); +publish_update("alice.hashpart", 102 => 120); +publish_delete("alice.hashpart", 101); +expect_replication("alice.hashpart", 2, 103, 120, + "nosuperuser admin with all table privileges can replicate into hashpart" +); + + +# Enable RLS on the target table and check that "regress_admin" can +# only replicate into it when superuser or bypassrls. +# +$node_subscriber->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_alice; +ALTER TABLE alice.unpartitioned ENABLE ROW LEVEL SECURITY; +)); + +revoke_superuser("regress_admin"); +publish_insert("alice.unpartitioned", 15); +expect_failure( + "alice.unpartitioned", + 2, + 11, + 13, + qr/ERROR: ( [A-Z0-9]+:)? user "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, + "admin with restored superuser privilege replicates insert into rls enabled unpartitioned" +); + +revoke_superuser("regress_admin"); +publish_update("alice.unpartitioned", 11 => 17); +expect_failure( + "alice.unpartitioned", + 3, + 11, + 15, + qr/ERROR: ( [A-Z0-9]+:)? user "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" +); + +grant_bypassrls("regress_admin"); +expect_replication("alice.unpartitioned", 3, 13, 17, + "admin with bypassrls replicates update into rls enabled unpartitioned"); + +revoke_bypassrls("regress_admin"); +publish_delete("alice.unpartitioned", 13); +expect_failure( + "alice.unpartitioned", + 3, + 13, + 17, + qr/ERROR: ( [A-Z0-9]+:)? user "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"); +expect_replication("alice.unpartitioned", 2, 15, 17, + "admin with bypassrls replicates delete into rls enabled unpartitioned"); +grant_superuser("regress_admin"); + +# Alter the subscription owner to "regress_alice". She has neither superuser +# nor bypassrls, but as the table owner should be able to replicate. +# +$node_subscriber->safe_psql( + 'postgres', qq( +ALTER SUBSCRIPTION admin_sub DISABLE; +ALTER ROLE regress_alice SUPERUSER; +ALTER SUBSCRIPTION admin_sub OWNER TO regress_alice; +ALTER ROLE regress_alice NOSUPERUSER; +ALTER SUBSCRIPTION admin_sub ENABLE; +)); + +publish_insert("alice.unpartitioned", 23); +publish_update("alice.unpartitioned", 15 => 25); +publish_delete("alice.unpartitioned", 17); +expect_replication("alice.unpartitioned", 2, 23, 25, + "nosuperuser nobypassrls table owner can replicate delete into unpartitioned despite rls" +); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/028_row_filter.pl b/third_party/spanner_pg/src/test/subscription/t/028_row_filter.pl new file mode 100644 index 00000000..da52289d --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/028_row_filter.pl @@ -0,0 +1,731 @@ +# 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 $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" +); + +# wait for initial table synchronization to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# 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: TABLES IN SCHEMA +# +# The 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 TABLES IN SCHEMA schema_rf_x, TABLE schema_rf_x.tab_rf_x WHERE (x > 10)" +); +$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" +); + +# wait for initial table synchronization to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# The subscription of the 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 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: 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)" +); +$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', + "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)" +); +$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', + "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)" +); + +# 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. +# +$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, tap_pub_viaroot_2, tap_pub_viaroot_1" +); + +# wait for initial table synchronization to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# 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->safe_psql('postgres', + "INSERT INTO tab_rowfilter_viaroot_part (a) VALUES (14), (15), (16)"); + +$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)"); + +# wait for table synchronization to finish +$node_subscriber->wait_for_subscription_sync; + +$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'"); + +$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 +# 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'); + +# 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 +# ====================================================== + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/029_on_error.pl b/third_party/spanner_pg/src/test/subscription/t/029_on_error.pl new file mode 100644 index 00000000..1bd18a62 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/029_on_error.pl @@ -0,0 +1,180 @@ + +# 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 message type "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: ( [A-Z0-9]+:)? logical replication completed skipping transaction at LSN $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_subscriber->wait_for_subscription_sync($node_publisher, 'sub'); + +# 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(); diff --git a/third_party/spanner_pg/src/test/subscription/t/031_column_list.pl b/third_party/spanner_pg/src/test/subscription/t/031_column_list.pl new file mode 100644 index 00000000..2ca120f7 --- /dev/null +++ b/third_party/spanner_pg/src/test/subscription/t/031_column_list.pl @@ -0,0 +1,1241 @@ +# 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'; +my $offset = 0; + +# 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 +)); + +$node_subscriber->wait_for_subscription_sync; + +# 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 +$node_subscriber->wait_for_subscription_sync; + +$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 same 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, b); + + -- 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 +)); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'sub1'); + +# insert data and make sure the columns in column list 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| +2|22| +3|33| +4|44|), + '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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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_subscriber->wait_for_subscription_sync; + +$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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 the publications which is FOR ALL TABLES, it +# means 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_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, c); + 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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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), + 'all columns should be replicated'); + + +# TEST: With a table included in the publication which is FOR TABLES IN +# SCHEMA, it means 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, c); + CREATE PUBLICATION pub_mix_6 FOR 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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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), + 'all columns should be replicated'); + + +# 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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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 all columns). 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 TABLES IN SCHEMA s1; + CREATE PUBLICATION pub2 FOR TABLE t_1(a, b, c); + + -- 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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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; +)); + +$node_subscriber->wait_for_subscription_sync; + +$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: Only columns in the column list should exist in the old tuple of UPDATE +# and DELETE. + +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE test_oldtuple_col (a int PRIMARY KEY, b int, c int); + CREATE PUBLICATION pub_check_oldtuple FOR TABLE test_oldtuple_col (a, b); + INSERT INTO test_oldtuple_col VALUES(1, 2, 3); + SELECT * FROM pg_create_logical_replication_slot('test_slot', 'pgoutput'); + UPDATE test_oldtuple_col SET a = 2; + DELETE FROM test_oldtuple_col; +)); + + +# Check at 7th byte of binary data for the number of columns in the old tuple. +# +# 7 = 1 (count from 1) + 1 byte (message type) + 4 byte (relid) + 1 byte (flag +# for old key). +# +# The message type of UPDATE is 85('U'). +# The message type of DELETE is 68('D'). +$result = $node_publisher->safe_psql( + 'postgres', qq( + SELECT substr(data, 7, 2) = int2send(2::smallint) + FROM pg_logical_slot_peek_binary_changes('test_slot', NULL, NULL, + 'proto_version', '1', + 'publication_names', 'pub_check_oldtuple') + WHERE get_byte(data, 0) = 85 OR get_byte(data, 0) = 68 +)); + +is( $result, qq(t +t), 'check the number of columns in the old tuple'); + + +# TEST: With a table included in multiple publications with different column +# lists, we should catch the error when creating the subscription. + +$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); +)); + +$node_subscriber->safe_psql( + 'postgres', qq( + DROP SUBSCRIPTION sub1; + CREATE TABLE test_mix_1 (a int PRIMARY KEY, b int, c int); +)); + +my ($cmdret, $stdout, $stderr) = $node_subscriber->psql( + 'postgres', qq( + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub_mix_1, pub_mix_2; +)); + +ok( $stderr =~ + qr/cannot use different column lists for table "public.test_mix_1" in different publications/, + 'different column lists detected'); + +# TEST: If the column list is changed after creating the subscription, we +# should catch the error reported by walsender. + +$node_publisher->safe_psql( + 'postgres', qq( + ALTER PUBLICATION pub_mix_1 SET TABLE test_mix_1 (a, c); +)); + +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub_mix_1, pub_mix_2; +)); + +$node_publisher->wait_for_catchup('sub1'); + +$node_publisher->safe_psql( + 'postgres', qq( + ALTER PUBLICATION pub_mix_1 SET TABLE test_mix_1 (a, b); + INSERT INTO test_mix_1 VALUES(1, 1, 1); +)); + +$offset = $node_publisher->wait_for_log( + qr/cannot use different column lists for table "public.test_mix_1" in different publications/, + $offset); + +$node_subscriber->stop('fast'); +$node_publisher->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/test/subscription/t/100_bugs.pl b/third_party/spanner_pg/src/test/subscription/t/100_bugs.pl index cce91891..28ca4aff 100644 --- a/third_party/spanner_pg/src/test/subscription/t/100_bugs.pl +++ b/third_party/spanner_pg/src/test/subscription/t/100_bugs.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Tests for various bugs found over time use strict; use warnings; -use PostgresNode; -use TestLib; -use Test::More tests => 9; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; # Bug #15114 @@ -19,11 +19,11 @@ # fix was to avoid the constant expressions simplification in # RelationGetIndexAttrBitmap(), so it's safe to call in more contexts. -my $node_publisher = get_new_node('publisher'); +my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -my $node_subscriber = get_new_node('subscriber'); +my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -81,7 +81,7 @@ # identity set before accepting updates. If it did not it would cause # an error when an update was attempted. -$node_publisher = get_new_node('publisher2'); +$node_publisher = PostgreSQL::Test::Cluster->new('publisher2'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; @@ -108,7 +108,7 @@ # # Initial sync doesn't complete; the protocol was not being followed per # expectations after commit 07082b08cc5d. -my $node_twoways = get_new_node('twoways'); +my $node_twoways = PostgreSQL::Test::Cluster->new('twoways'); $node_twoways->init(allows_streaming => 'logical'); $node_twoways->start; for my $db (qw(d1 d2)) @@ -153,15 +153,15 @@ # Verify table data is synced with cascaded replication setup. This is mainly # to test whether the data written by tablesync worker gets replicated. -my $node_pub = get_new_node('testpublisher1'); +my $node_pub = PostgreSQL::Test::Cluster->new('testpublisher1'); $node_pub->init(allows_streaming => 'logical'); $node_pub->start; -my $node_pub_sub = get_new_node('testpublisher_subscriber'); +my $node_pub_sub = PostgreSQL::Test::Cluster->new('testpublisher_subscriber'); $node_pub_sub->init(allows_streaming => 'logical'); $node_pub_sub->start; -my $node_sub = get_new_node('testsubscriber1'); +my $node_sub = PostgreSQL::Test::Cluster->new('testsubscriber1'); $node_sub->init(allows_streaming => 'logical'); $node_sub->start; @@ -226,11 +226,11 @@ # target table's relcache was not being invalidated. This leads to skipping # UPDATE/DELETE operations during apply on the subscriber side as the columns # required to search corresponding rows won't get logged. -$node_publisher = get_new_node('publisher3'); +$node_publisher = PostgreSQL::Test::Cluster->new('publisher3'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->start; -$node_subscriber = get_new_node('subscriber3'); +$node_subscriber = PostgreSQL::Test::Cluster->new('subscriber3'); $node_subscriber->init(allows_streaming => 'logical'); $node_subscriber->start; @@ -301,11 +301,13 @@ # The bug was that when the REPLICA IDENTITY FULL is used with dropped or # generated columns, we fail to apply updates and deletes -my $node_publisher_d_cols = get_new_node('node_publisher_d_cols'); +my $node_publisher_d_cols = + PostgreSQL::Test::Cluster->new('node_publisher_d_cols'); $node_publisher_d_cols->init(allows_streaming => 'logical'); $node_publisher_d_cols->start; -my $node_subscriber_d_cols = get_new_node('node_subscriber_d_cols'); +my $node_subscriber_d_cols = + PostgreSQL::Test::Cluster->new('node_subscriber_d_cols'); $node_subscriber_d_cols->init(allows_streaming => 'logical'); $node_subscriber_d_cols->start; @@ -362,3 +364,58 @@ $node_publisher_d_cols->stop('fast'); $node_subscriber_d_cols->stop('fast'); + +# The bug was that pgoutput was incorrectly replacing missing attributes in +# tuples with NULL. This could result in incorrect replication with +# `REPLICA IDENTITY FULL`. + +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +$node_subscriber->rotate_logfile(); +$node_subscriber->start(); + +# Set up a table with schema `(a int, b bool)` where the `b` attribute is +# missing for one row due to the `ALTER TABLE ... ADD COLUMN ... DEFAULT` +# fast path. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int); + ALTER TABLE tab_default REPLICA IDENTITY FULL; + INSERT INTO tab_default VALUES (1); + ALTER TABLE tab_default ADD COLUMN b bool DEFAULT false NOT NULL; + INSERT INTO tab_default VALUES (2, true); + CREATE PUBLICATION pub1 FOR TABLE tab_default; +)); + +# Replicate to the subscriber. +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int, b bool); + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1; +)); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'sub1'); +my $result = $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_default"); +is($result, qq(1|f +2|t), 'check snapshot on subscriber'); + +# Update all rows in the table and ensure the rows with the missing `b` +# attribute replicate correctly. +$node_publisher->safe_psql('postgres', + "UPDATE tab_default SET a = a + 1"); +$node_publisher->wait_for_catchup('sub1'); + +# When the bug is present, the `1|f` row will not be updated to `2|f` because +# the publisher incorrectly fills in `NULL` for `b` and publishes an update +# for `1|NULL`, which doesn't exist in the subscriber. +$result = $node_subscriber->safe_psql('postgres', + "SELECT a, b FROM tab_default"); +is($result, qq(2|f +3|t), 'check replicated update on subscriber'); + +$node_publisher->stop('fast'); +$node_subscriber->stop('fast'); + +done_testing(); diff --git a/third_party/spanner_pg/src/timezone/README b/third_party/spanner_pg/src/timezone/README index f588d1f5..dd5d5f98 100644 --- a/third_party/spanner_pg/src/timezone/README +++ b/third_party/spanner_pg/src/timezone/README @@ -45,11 +45,17 @@ and pg_timezone_abbrevs views don't throw errors). It's worth running it as a cross-check on proposed updates. When there has been a new release of Windows (probably including Service -Packs), the list of matching timezones need to be updated. Run the -script in src/tools/win32tzlist.pl on a Windows machine running this new -release and apply any new timezones that it detects. Never remove any -mappings in case they are removed in Windows, since we still need to -match properly on the old version. +Packs), findtimezone.c's mapping from Windows zones to IANA zones may +need to be updated. We have two approaches to doing this: +1. Consult the CLDR project's windowsZones.xml file, and add any zones + listed there that we don't have. Use their "territory=001" mapping + if there's more than one IANA zone listed. +2. Run the script in src/tools/win32tzlist.pl on a Windows machine + running the new release, and add any new timezones that it detects. + (This is not a full substitute for #1, though, as win32tzlist.pl + can't tell you which IANA zone to map to.) +In either case, never remove any zone names that have disappeared from +Windows, since we still need to match properly on older versions. Time Zone code diff --git a/third_party/spanner_pg/src/timezone/data/tzdata.zi b/third_party/spanner_pg/src/timezone/data/tzdata.zi index b522e395..be1c4085 100644 --- a/third_party/spanner_pg/src/timezone/data/tzdata.zi +++ b/third_party/spanner_pg/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2023c +# version 2024a # 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 - @@ -22,27 +22,6 @@ R d 1978 o - Mar 24 1 1 S R d 1978 o - S 22 3 0 - R d 1980 o - Ap 25 0 1 S R d 1980 o - O 31 2 0 - -Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 -0:9:21 - PMT 1911 Mar 11 -0 d WE%sT 1940 F 25 2 -1 d CE%sT 1946 O 7 -0 - WET 1956 Ja 29 -1 - CET 1963 Ap 14 -0 d WE%sT 1977 O 21 -1 d CE%sT 1979 O 26 -0 d WE%sT 1981 May -1 - CET -Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u --2 - -02 1942 S --2 1 -01 1945 O 15 --2 - -02 1975 N 25 2 --1 - -01 -Z Africa/Ndjamena 1:0:12 - LMT 1912 -1 - WAT 1979 O 14 -1 1 WAST 1980 Mar 8 -1 - WAT -Z Africa/Abidjan -0:16:8 - LMT 1912 -0 - GMT R K 1940 o - Jul 15 0 1 S R K 1940 o - O 1 0 0 - R K 1941 o - Ap 15 0 1 S @@ -77,21 +56,6 @@ R K 2014 o - Jul 31 24 1 S R K 2014 o - S lastTh 24 0 - R K 2023 ma - Ap lastF 0 1 S R K 2023 ma - O lastTh 24 0 - -Z Africa/Cairo 2:5:9 - LMT 1900 O -2 K EE%sT -Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u --1 - -01 1975 -0 - GMT -Z Africa/Nairobi 2:27:16 - LMT 1908 May -2:30 - +0230 1928 Jun 30 24 -3 - EAT 1930 Ja 4 24 -2:30 - +0230 1936 D 31 24 -2:45 - +0245 1942 Jul 31 24 -3 - EAT -Z Africa/Monrovia -0:43:8 - LMT 1882 --0:43:8 - MMT 1919 Mar --0:44:30 - MMT 1972 Ja 7 -0 - GMT R L 1951 o - O 14 2 1 S R L 1952 o - Ja 1 0 0 - R L 1953 o - O 9 2 1 S @@ -109,21 +73,10 @@ R L 1997 o - Ap 4 0 1 S R L 1997 o - O 4 0 0 - R L 2013 o - Mar lastF 1 1 S R L 2013 o - O lastF 2 0 - -Z Africa/Tripoli 0:52:44 - LMT 1920 -1 L CE%sT 1959 -2 - EET 1982 -1 L CE%sT 1990 May 4 -2 - EET 1996 S 30 -1 L CE%sT 1997 O 4 -2 - EET 2012 N 10 2 -1 L CE%sT 2013 O 25 2 -2 - EET R MU 1982 o - O 10 0 1 - R MU 1983 o - Mar 21 0 0 - R MU 2008 o - O lastSu 2 1 - R MU 2009 o - Mar lastSu 2 0 - -Z Indian/Mauritius 3:50 - LMT 1907 -4 MU +04/+05 R M 1939 o - S 12 0 1 - R M 1939 o - N 19 0 0 - R M 1940 o - F 25 0 1 - @@ -307,53 +260,15 @@ R M 2086 o - Ap 14 3 -1 - R M 2086 o - May 19 2 0 - R M 2087 o - Mar 30 3 -1 - R M 2087 o - May 11 2 0 - -Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 -0 M +00/+01 1984 Mar 16 -1 - +01 1986 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 -Z Africa/El_Aaiun -0:52:48 - LMT 1934 --1 - -01 1976 Ap 14 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 -Z Africa/Maputo 2:10:20 - LMT 1903 Mar -2 - CAT R NA 1994 o - Mar 21 0 -1 WAT R NA 1994 2017 - S Su>=1 2 0 CAT R NA 1995 2017 - Ap Su>=1 2 -1 WAT -Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 -1:30 - +0130 1903 Mar -2 - SAST 1942 S 20 2 -2 1 SAST 1943 Mar 21 2 -2 - SAST 1990 Mar 21 -2 NA %s -Z Africa/Lagos 0:13:35 - LMT 1905 Jul -0 - GMT 1908 Jul -0:13:35 - LMT 1914 -0:30 - +0030 1919 S -1 - WAT -Z Africa/Sao_Tome 0:26:56 - LMT 1884 --0:36:45 - LMT 1912 Ja 1 0u -0 - GMT 2018 Ja 1 1 -1 - WAT 2019 Ja 1 2 -0 - GMT R SA 1942 1943 - S Su>=15 2 1 - R SA 1943 1944 - Mar Su>=15 2 0 - -Z Africa/Johannesburg 1:52 - LMT 1892 F 8 -1:30 - SAST 1903 Mar -2 SA SAST R SD 1970 o - May 1 0 1 S R SD 1970 1985 - O 15 0 0 - R SD 1971 o - Ap 30 0 1 S R SD 1972 1985 - Ap lastSu 0 1 S -Z Africa/Khartoum 2:10:8 - LMT 1931 -2 SD CA%sT 2000 Ja 15 12 -3 - EAT 2017 N -2 - CAT -Z Africa/Juba 2:6:28 - LMT 1931 -2 SD CA%sT 2000 Ja 15 12 -3 - EAT 2021 F -2 - CAT R n 1939 o - Ap 15 23s 1 S R n 1939 o - N 18 23s 0 - R n 1940 o - F 25 23s 1 S @@ -379,80 +294,14 @@ R n 2005 o - May 1 0s 1 S R n 2005 o - S 30 1s 0 - R n 2006 2008 - Mar lastSu 2s 1 S R n 2006 2008 - O lastSu 2s 0 - -Z Africa/Tunis 0:40:44 - LMT 1881 May 12 -0:9:21 - PMT 1911 Mar 11 -1 n CE%sT -Z Antarctica/Casey 0 - -00 1969 -8 - +08 2009 O 18 2 -11 - +11 2010 Mar 5 2 -8 - +08 2011 O 28 2 -11 - +11 2012 F 21 17u -8 - +08 2016 O 22 -11 - +11 2018 Mar 11 4 -8 - +08 2018 O 7 4 -11 - +11 2019 Mar 17 3 -8 - +08 2019 O 4 3 -11 - +11 2020 Mar 8 3 -8 - +08 2020 O 4 0:1 -11 - +11 -Z Antarctica/Davis 0 - -00 1957 Ja 13 -7 - +07 1964 N -0 - -00 1969 F -7 - +07 2009 O 18 2 -5 - +05 2010 Mar 10 20u -7 - +07 2011 O 28 2 -5 - +05 2012 F 21 20u -7 - +07 -Z Antarctica/Mawson 0 - -00 1954 F 13 -6 - +06 2009 O 18 2 -5 - +05 R Tr 2005 ma - Mar lastSu 1u 2 +02 R Tr 2004 ma - O lastSu 1u 0 +00 -Z Antarctica/Troll 0 - -00 2005 F 12 -0 Tr %s -Z Antarctica/Rothera 0 - -00 1976 D --3 - -03 -Z Asia/Kabul 4:36:48 - LMT 1890 -4 - +04 1945 -4:30 - +0430 R AM 2011 o - Mar lastSu 2s 1 - R AM 2011 o - O lastSu 2s 0 - -Z Asia/Yerevan 2:58 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1995 S 24 2s -4 - +04 1997 -4 R +04/+05 2011 -4 AM +04/+05 R AZ 1997 2015 - Mar lastSu 4 1 - R AZ 1997 2015 - O lastSu 5 0 - -Z Asia/Baku 3:19:24 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 S lastSu 2s -4 - +04 1996 -4 E +04/+05 1997 -4 AZ +04/+05 R BD 2009 o - Jun 19 23 1 - R BD 2009 o - D 31 24 0 - -Z Asia/Dhaka 6:1:40 - LMT 1890 -5:53:20 - HMT 1941 O -6:30 - +0630 1942 May 15 -5:30 - +0530 1942 S -6:30 - +0630 1951 S 30 -6 - +06 2009 -6 BD +06/+07 -Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 -5:30 - +0530 1987 O -6 - +06 -Z Indian/Chagos 4:49:40 - LMT 1907 -5 - +05 1996 -6 - +06 -Z Asia/Yangon 6:24:47 - LMT 1880 -6:24:47 - RMT 1920 -6:30 - +0630 1942 May -9 - +09 1945 May 3 -6:30 - +0630 R Sh 1919 o - Ap 12 24 1 D R Sh 1919 o - S 30 24 0 S R Sh 1940 o - Jun 1 0 1 D @@ -470,11 +319,6 @@ R Sh 1948 1949 - S 30 24 0 S R CN 1986 o - May 4 2 1 D R CN 1986 1991 - S Su>=11 2 0 S R CN 1987 1991 - Ap Su>=11 2 1 D -Z Asia/Shanghai 8:5:43 - LMT 1901 -8 Sh C%sT 1949 May 28 -8 CN C%sT -Z Asia/Urumqi 5:50:20 - LMT 1928 -6 - +06 R HK 1946 o - Ap 21 0 1 S R HK 1946 o - D 1 3:30s 0 - R HK 1947 o - Ap 13 3:30s 1 S @@ -489,12 +333,6 @@ R HK 1965 1976 - O Su>=16 3:30 0 - R HK 1973 o - D 30 3:30 1 S R HK 1979 o - May 13 3:30 1 S R HK 1979 o - O 21 3:30 0 - -Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u -8 - HKT 1941 Jun 15 3 -8 1 HKST 1941 O 1 4 -8 0:30 HKWT 1941 D 25 -9 - JST 1945 N 18 2 -8 HK HK%sT R f 1946 o - May 15 0 1 D R f 1946 o - O 1 0 0 S R f 1947 o - Ap 15 0 1 D @@ -510,10 +348,6 @@ R f 1974 1975 - Ap 1 0 1 D R f 1974 1975 - O 1 0 0 S R f 1979 o - Jul 1 0 1 D R f 1979 o - O 1 0 0 S -Z Asia/Taipei 8:6 - LMT 1896 -8 - CST 1937 O -9 - JST 1945 S 21 1 -8 f C%sT R _ 1942 1943 - Ap 30 23 1 - R _ 1942 o - N 17 23 0 - R _ 1943 o - S 30 23 0 S @@ -541,10 +375,6 @@ R _ 1973 o - D 30 3:30 1 D R _ 1975 1976 - Ap Su>=16 3:30 1 D R _ 1979 o - May 13 3:30 1 D R _ 1979 o - O Su>=16 3:30 0 S -Z Asia/Macau 7:34:10 - LMT 1904 O 30 -8 - CST 1941 D 21 23 -9 _ +09/+10 1945 S 30 24 -8 _ C%sT R CY 1975 o - Ap 13 0 1 S R CY 1975 o - O 12 0 0 - R CY 1976 o - May 15 0 1 S @@ -554,65 +384,6 @@ R CY 1977 o - S 25 0 0 - R CY 1978 o - O 2 0 0 - R CY 1979 1997 - S lastSu 0 0 - R CY 1981 1998 - Mar lastSu 0 1 S -Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 -2 CY EE%sT 1998 S -2 E EE%sT -Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 -2 CY EE%sT 1998 S -2 E EE%sT 2016 S 8 -3 - +03 2017 O 29 1u -2 E EE%sT -Z Asia/Tbilisi 2:59:11 - LMT 1880 -2:59:11 - TBMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 -3 e +03/+04 1994 S lastSu -4 e +04/+05 1996 O lastSu -4 1 +05 1997 Mar lastSu -4 e +04/+05 2004 Jun 27 -3 R +03/+04 2005 Mar lastSu 2 -4 - +04 -Z Asia/Dili 8:22:20 - LMT 1912 -8 - +08 1942 F 21 23 -9 - +09 1976 May 3 -8 - +08 2000 S 17 -9 - +09 -Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 -5:53:20 - HMT 1870 -5:21:10 - MMT 1906 -5:30 - IST 1941 O -5:30 1 +0630 1942 May 15 -5:30 - IST 1942 S -5:30 1 +0630 1945 O 15 -5:30 - IST -Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 -7:7:12 - BMT 1923 D 31 16:40u -7:20 - +0720 1932 N -7:30 - +0730 1942 Mar 23 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 -7 - WIB -Z Asia/Pontianak 7:17:20 - LMT 1908 May -7:17:20 - PMT 1932 N -7:30 - +0730 1942 Ja 29 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 -8 - WITA 1988 -7 - WIB -Z Asia/Makassar 7:57:36 - LMT 1920 -7:57:36 - MMT 1932 N -8 - +08 1942 F 9 -9 - +09 1945 S 23 -8 - WITA -Z Asia/Jayapura 9:22:48 - LMT 1932 N -9 - +09 1944 S -9:30 - +0930 1964 -9 - WIT R i 1910 o - Ja 1 0 0 - R i 1977 o - Mar 21 23 1 - R i 1977 o - O 20 24 0 - @@ -653,11 +424,6 @@ R i 2020 o - Mar 20 24 1 - R i 2020 o - S 20 24 0 - R i 2021 2022 - Mar 21 24 1 - R i 2021 2022 - S 21 24 0 - -Z Asia/Tehran 3:25:44 - LMT 1916 -3:25:44 - TMT 1935 Jun 13 -3:30 i +0330/+0430 1977 O 20 24 -4 i +04/+05 1979 -3:30 i +0330/+0430 R IQ 1982 o - May 1 0 1 - R IQ 1982 1984 - O 1 0 0 - R IQ 1983 o - Mar 31 0 1 - @@ -666,10 +432,6 @@ R IQ 1985 1990 - S lastSu 1s 0 - R IQ 1986 1990 - Mar lastSu 1s 1 - R IQ 1991 2007 - Ap 1 3s 1 - R IQ 1991 2007 - O 1 3s 0 - -Z Asia/Baghdad 2:57:40 - LMT 1890 -2:57:36 - BMT 1918 -3 - +03 1982 May -3 IQ +03/+04 R Z 1940 o - May 31 24u 1 D R Z 1940 o - S 30 24u 0 S R Z 1940 o - N 16 24u 1 D @@ -755,15 +517,10 @@ R Z 2011 o - O 2 2 0 S R Z 2012 o - S 23 2 0 S R Z 2013 ma - Mar F>=23 2 1 D R Z 2013 ma - O lastSu 2 0 S -Z Asia/Jerusalem 2:20:54 - LMT 1880 -2:20:40 - JMT 1918 -2 Z I%sT R JP 1948 o - May Sa>=1 24 1 D R JP 1948 1951 - S Sa>=8 25 0 S R JP 1949 o - Ap Sa>=1 24 1 D R JP 1950 1951 - May Sa>=1 24 1 D -Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u -9 JP J%sT R J 1973 o - Jun 6 0 1 S R J 1973 1975 - O 1 0 0 - R J 1974 1977 - May 1 0 1 S @@ -796,83 +553,10 @@ R J 2013 o - D 20 0 0 - R J 2014 2021 - Mar lastTh 24 1 S R J 2014 2022 - O lastF 0s 0 - R J 2022 o - F lastTh 24 1 S -Z Asia/Amman 2:23:44 - LMT 1931 -2 J EE%sT 2022 O 28 0s -3 - +03 -Z Asia/Almaty 5:7:48 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2004 O 31 2s -6 - +06 -Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1991 S 29 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 1992 Mar 29 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2018 D 21 -5 - +05 -Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -6 - +06 -Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -5 - +05 -Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1994 S 25 2s -4 R +04/+05 2004 O 31 2s -5 - +05 -Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1999 Mar 28 2s -4 R +04/+05 2004 O 31 2s -5 - +05 -Z Asia/Oral 3:25:24 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1989 Mar 26 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1992 Mar 29 2s -4 R +04/+05 2004 O 31 2s -5 - +05 R KG 1992 1996 - Ap Su>=7 0s 1 - R KG 1992 1996 - S lastSu 0 0 - R KG 1997 2005 - Mar lastSu 2:30 1 - R KG 1997 2004 - O lastSu 2:30 0 - -Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1991 Au 31 2 -5 KG +05/+06 2005 Au 12 -6 - +06 R KR 1948 o - Jun 1 0 1 D R KR 1948 o - S 12 24 0 S R KR 1949 o - Ap 3 0 1 D @@ -887,18 +571,6 @@ R KR 1957 1960 - May Su>=1 0 1 D R KR 1957 1960 - S Sa>=17 24 0 S R KR 1987 1988 - May Su>=8 2 1 D R KR 1987 1988 - O Su>=8 3 0 S -Z Asia/Seoul 8:27:52 - LMT 1908 Ap -8:30 - KST 1912 -9 - JST 1945 S 8 -9 KR K%sT 1954 Mar 21 -8:30 KR K%sT 1961 Au 10 -9 KR K%sT -Z Asia/Pyongyang 8:23 - LMT 1908 Ap -8:30 - KST 1912 -9 - JST 1945 Au 24 -9 - KST 2015 Au 15 -8:30 - KST 2018 May 4 23:30 -9 - KST R l 1920 o - Mar 28 0 1 S R l 1920 o - O 25 0 0 - R l 1921 o - Ap 3 0 1 S @@ -923,18 +595,8 @@ R l 1992 o - O 4 0 0 - R l 1993 ma - Mar lastSu 0 1 S R l 1993 1998 - S lastSu 0 0 - R l 1999 ma - O lastSu 0 0 - -Z Asia/Beirut 2:22 - LMT 1880 -2 l EE%sT R NB 1935 1941 - S 14 0 0:20 - R NB 1935 1941 - D 14 0 0 - -Z Asia/Kuching 7:21:20 - LMT 1926 Mar -7:30 - +0730 1933 -8 NB +08/+0820 1942 F 16 -9 - +09 1945 S 12 -8 - +08 -Z Indian/Maldives 4:54 - LMT 1880 -4:54 - MMT 1960 -5 - +05 R X 1983 1984 - Ap 1 0 1 - R X 1983 o - O 1 0 0 - R X 1985 1998 - Mar lastSu 0 1 - @@ -944,31 +606,11 @@ R X 2001 2006 - S lastSa 2 0 - R X 2002 2006 - Mar lastSa 2 1 - R X 2015 2016 - Mar lastSa 2 1 - R X 2015 2016 - S lastSa 0 0 - -Z Asia/Hovd 6:6:36 - LMT 1905 Au -6 - +06 1978 -7 X +07/+08 -Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au -7 - +07 1978 -8 X +08/+09 -Z Asia/Choibalsan 7:38 - LMT 1905 Au -7 - +07 1978 -8 - +08 1983 Ap -9 X +09/+10 2008 Mar 31 -8 X +08/+09 -Z Asia/Kathmandu 5:41:16 - LMT 1920 -5:30 - +0530 1986 -5:45 - +0545 R PK 2002 o - Ap Su>=2 0 1 S R PK 2002 o - O Su>=2 0 0 - R PK 2008 o - Jun 1 0 1 S R PK 2008 2009 - N 1 0 0 - R PK 2009 o - Ap 15 0 1 S -Z Asia/Karachi 4:28:12 - LMT 1907 -5:30 - +0530 1942 S -5:30 1 +0630 1945 O 15 -5:30 - +0530 1951 S 30 -5 - +05 1971 Mar 26 -5 PK PK%sT R P 1999 2005 - Ap F>=15 0 1 S R P 1999 2003 - O F>=15 0 0 - R P 2004 o - O 1 1 0 - @@ -1001,136 +643,90 @@ R P 2021 o - O 29 1 0 - R P 2022 o - Mar 27 0 1 S R P 2022 2035 - O Sa<=30 2 0 - R P 2023 o - Ap 29 2 1 S -R P 2024 o - Ap 13 2 1 S -R P 2025 o - Ap 5 2 1 S +R P 2024 o - Ap 20 2 1 S +R P 2025 o - Ap 12 2 1 S R P 2026 2054 - Mar Sa<=30 2 1 S R P 2036 o - O 18 2 0 - R P 2037 o - O 10 2 0 - R P 2038 o - S 25 2 0 - R P 2039 o - S 17 2 0 - -R P 2039 o - O 22 2 1 S -R P 2039 2067 - O Sa<=30 2 0 - R P 2040 o - S 1 2 0 - -R P 2040 o - O 13 2 1 S +R P 2040 o - O 20 2 1 S +R P 2040 2067 - O Sa<=30 2 0 - R P 2041 o - Au 24 2 0 - -R P 2041 o - S 28 2 1 S +R P 2041 o - O 5 2 1 S R P 2042 o - Au 16 2 0 - -R P 2042 o - S 20 2 1 S +R P 2042 o - S 27 2 1 S R P 2043 o - Au 1 2 0 - -R P 2043 o - S 12 2 1 S +R P 2043 o - S 19 2 1 S R P 2044 o - Jul 23 2 0 - -R P 2044 o - Au 27 2 1 S +R P 2044 o - S 3 2 1 S R P 2045 o - Jul 15 2 0 - -R P 2045 o - Au 19 2 1 S +R P 2045 o - Au 26 2 1 S R P 2046 o - Jun 30 2 0 - -R P 2046 o - Au 11 2 1 S +R P 2046 o - Au 18 2 1 S R P 2047 o - Jun 22 2 0 - -R P 2047 o - Jul 27 2 1 S +R P 2047 o - Au 3 2 1 S R P 2048 o - Jun 6 2 0 - -R P 2048 o - Jul 18 2 1 S +R P 2048 o - Jul 25 2 1 S R P 2049 o - May 29 2 0 - -R P 2049 o - Jul 3 2 1 S +R P 2049 o - Jul 10 2 1 S R P 2050 o - May 21 2 0 - -R P 2050 o - Jun 25 2 1 S +R P 2050 o - Jul 2 2 1 S R P 2051 o - May 6 2 0 - -R P 2051 o - Jun 17 2 1 S +R P 2051 o - Jun 24 2 1 S R P 2052 o - Ap 27 2 0 - -R P 2052 o - Jun 1 2 1 S +R P 2052 o - Jun 8 2 1 S R P 2053 o - Ap 12 2 0 - -R P 2053 o - May 24 2 1 S +R P 2053 o - May 31 2 1 S R P 2054 o - Ap 4 2 0 - -R P 2054 o - May 16 2 1 S -R P 2055 o - May 1 2 1 S -R P 2056 o - Ap 22 2 1 S -R P 2057 o - Ap 7 2 1 S -R P 2058 ma - Mar Sa<=30 2 1 S +R P 2054 o - May 23 2 1 S +R P 2055 o - May 8 2 1 S +R P 2056 o - Ap 29 2 1 S +R P 2057 o - Ap 14 2 1 S +R P 2058 o - Ap 6 2 1 S +R P 2059 ma - Mar Sa<=30 2 1 S R P 2068 o - O 20 2 0 - R P 2069 o - O 12 2 0 - R P 2070 o - O 4 2 0 - R P 2071 o - S 19 2 0 - R P 2072 o - S 10 2 0 - -R P 2072 o - O 15 2 1 S +R P 2072 o - O 22 2 1 S +R P 2072 ma - O Sa<=30 2 0 - R P 2073 o - S 2 2 0 - -R P 2073 o - O 7 2 1 S +R P 2073 o - O 14 2 1 S R P 2074 o - Au 18 2 0 - -R P 2074 o - S 29 2 1 S +R P 2074 o - O 6 2 1 S R P 2075 o - Au 10 2 0 - -R P 2075 o - S 14 2 1 S -R P 2075 ma - O Sa<=30 2 0 - +R P 2075 o - S 21 2 1 S R P 2076 o - Jul 25 2 0 - -R P 2076 o - S 5 2 1 S +R P 2076 o - S 12 2 1 S R P 2077 o - Jul 17 2 0 - -R P 2077 o - Au 28 2 1 S +R P 2077 o - S 4 2 1 S R P 2078 o - Jul 9 2 0 - -R P 2078 o - Au 13 2 1 S +R P 2078 o - Au 20 2 1 S R P 2079 o - Jun 24 2 0 - -R P 2079 o - Au 5 2 1 S +R P 2079 o - Au 12 2 1 S R P 2080 o - Jun 15 2 0 - -R P 2080 o - Jul 20 2 1 S +R P 2080 o - Jul 27 2 1 S R P 2081 o - Jun 7 2 0 - -R P 2081 o - Jul 12 2 1 S +R P 2081 o - Jul 19 2 1 S R P 2082 o - May 23 2 0 - -R P 2082 o - Jul 4 2 1 S +R P 2082 o - Jul 11 2 1 S R P 2083 o - May 15 2 0 - -R P 2083 o - Jun 19 2 1 S +R P 2083 o - Jun 26 2 1 S R P 2084 o - Ap 29 2 0 - -R P 2084 o - Jun 10 2 1 S +R P 2084 o - Jun 17 2 1 S R P 2085 o - Ap 21 2 0 - -R P 2085 o - Jun 2 2 1 S +R P 2085 o - Jun 9 2 1 S R P 2086 o - Ap 13 2 0 - -R P 2086 o - May 18 2 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 -2 Z I%sT 1996 -2 J EE%sT 1999 -2 P EE%sT 2008 Au 29 -2 - EET 2008 S -2 P EE%sT 2010 -2 - EET 2010 Mar 27 0:1 -2 P EE%sT 2011 Au -2 - EET 2012 -2 P EE%sT -Z Asia/Hebron 2:20:23 - LMT 1900 O -2 Z EET/EEST 1948 May 15 -2 K EE%sT 1967 Jun 5 -2 Z I%sT 1996 -2 J EE%sT 1999 -2 P EE%sT +R P 2086 o - May 25 2 1 S R PH 1936 o - N 1 0 1 D R PH 1937 o - F 1 0 0 S R PH 1954 o - Ap 12 0 1 D R PH 1954 o - Jul 1 0 0 S R PH 1978 o - Mar 22 0 1 D R PH 1978 o - S 21 0 0 S -Z Asia/Manila -15:56 - LMT 1844 D 31 -8:4 - LMT 1899 May 11 -8 PH P%sT 1942 May -9 - JST 1944 N -8 PH P%sT -Z Asia/Qatar 3:26:8 - LMT 1920 -4 - +04 1972 Jun -3 - +03 -Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 -3 - +03 -Z Asia/Singapore 6:55:25 - LMT 1901 -6:55:25 - SMT 1905 Jun -7 - +07 1933 -7 0:20 +0720 1936 -7:20 - +0720 1941 S -7:30 - +0730 1942 F 16 -9 - +09 1945 S 12 -7:30 - +0730 1981 D 31 16u -8 - +08 -Z Asia/Colombo 5:19:24 - LMT 1880 -5:19:32 - MMT 1906 -5:30 - +0530 1942 Ja 5 -5:30 0:30 +06 1942 S -5:30 1 +0630 1945 O 16 2 -5:30 - +0530 1996 May 25 -6:30 - +0630 1996 O 26 0:30 -6 - +06 2006 Ap 15 0:30 -5:30 - +0530 R S 1920 1923 - Ap Su>=15 2 1 S R S 1920 1923 - O Su>=1 2 0 - R S 1962 o - Ap 29 2 1 S @@ -1172,46 +768,6 @@ R S 2009 o - Mar lastF 0 1 S R S 2010 2011 - Ap F>=1 0 1 S R S 2012 2022 - Mar lastF 0 1 S R S 2009 2022 - O lastF 0 0 - -Z Asia/Damascus 2:25:12 - LMT 1920 -2 S EE%sT 2022 O 28 -3 - +03 -Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 1 +06 1991 S 9 2s -5 - +05 -Z Asia/Bangkok 6:42:4 - LMT 1880 -6:42:4 - BMT 1920 Ap -7 - +07 -Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2 -4 R +04/+05 1992 Ja 19 2 -5 - +05 -Z Asia/Dubai 3:41:12 - LMT 1920 -4 - +04 -Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1992 -5 - +05 -Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2 -5 R +05/+06 1992 -5 - +05 -Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul -7:6:30 - PLMT 1911 May -7 - +07 1942 D 31 23 -8 - +08 1945 Mar 14 23 -9 - +09 1945 S 2 -7 - +07 1947 Ap -8 - +08 1955 Jul -7 - +07 1959 D 31 23 -8 - +08 1975 Jun 13 -7 - +07 R AU 1917 o - Ja 1 2s 1 D R AU 1917 o - Mar lastSu 2s 0 S R AU 1942 o - Ja 1 2s 1 D @@ -1219,9 +775,6 @@ R AU 1942 o - Mar lastSu 2s 0 S R AU 1942 o - S 27 2s 1 D R AU 1943 1944 - Mar lastSu 2s 0 S R AU 1943 o - O 3 2s 1 D -Z Australia/Darwin 8:43:20 - LMT 1895 F -9 - ACST 1899 May -9:30 AU AC%sT R AW 1974 o - O lastSu 2s 1 D R AW 1975 o - Mar Su>=1 2s 0 S R AW 1983 o - O lastSu 2s 1 D @@ -1231,25 +784,12 @@ R AW 1992 o - Mar Su>=1 2s 0 S R AW 2006 o - D 3 2s 1 D R AW 2007 2009 - Mar lastSu 2s 0 S R AW 2007 2008 - O lastSu 2s 1 D -Z Australia/Perth 7:43:24 - LMT 1895 D -8 AU AW%sT 1943 Jul -8 AW AW%sT -Z Australia/Eucla 8:35:28 - LMT 1895 D -8:45 AU +0845/+0945 1943 Jul -8:45 AW +0845/+0945 R AQ 1971 o - O lastSu 2s 1 D R AQ 1972 o - F lastSu 2s 0 S R AQ 1989 1991 - O lastSu 2s 1 D R AQ 1990 1992 - Mar Su>=1 2s 0 S R Ho 1992 1993 - O lastSu 2s 1 D R Ho 1993 1994 - Mar Su>=1 2s 0 S -Z Australia/Brisbane 10:12:8 - LMT 1895 -10 AU AE%sT 1971 -10 AQ AE%sT -Z Australia/Lindeman 9:55:56 - LMT 1895 -10 AU AE%sT 1971 -10 AQ AE%sT 1992 Jul -10 Ho AE%sT R AS 1971 1985 - O lastSu 2s 1 D R AS 1986 o - O 19 2s 1 D R AS 1987 2007 - O lastSu 2s 1 D @@ -1265,10 +805,6 @@ R AS 2006 o - Ap 2 2s 0 S R AS 2007 o - Mar lastSu 2s 0 S R AS 2008 ma - Ap Su>=1 2s 0 S R AS 2008 ma - O Su>=1 2s 1 D -Z Australia/Adelaide 9:14:20 - LMT 1895 F -9 - ACST 1899 May -9:30 AU AC%sT 1971 -9:30 AS AC%sT R AT 1916 o - O Su>=1 2s 1 D R AT 1917 o - Mar lastSu 2s 0 S R AT 1917 1918 - O Su>=22 2s 1 D @@ -1292,10 +828,6 @@ R AT 2001 ma - O Su>=1 2s 1 D R AT 2006 o - Ap Su>=1 2s 0 S R AT 2007 o - Mar lastSu 2s 0 S R AT 2008 ma - Ap Su>=1 2s 0 S -Z Australia/Hobart 9:49:16 - LMT 1895 S -10 AT AE%sT 1919 O 24 -10 AU AE%sT 1967 -10 AT AE%sT R AV 1971 1985 - O lastSu 2s 1 D R AV 1972 o - F lastSu 2s 0 S R AV 1973 1985 - Mar Su>=1 2s 0 S @@ -1310,9 +842,6 @@ R AV 2006 o - Ap Su>=1 2s 0 S R AV 2007 o - Mar lastSu 2s 0 S R AV 2008 ma - Ap Su>=1 2s 0 S R AV 2008 ma - O Su>=1 2s 1 D -Z Australia/Melbourne 9:39:52 - LMT 1895 F -10 AU AE%sT 1971 -10 AV AE%sT R AN 1971 1985 - O lastSu 2s 1 D R AN 1972 o - F 27 2s 0 S R AN 1973 1981 - Mar Su>=1 2s 0 S @@ -1329,15 +858,6 @@ R AN 2006 o - Ap Su>=1 2s 0 S R AN 2007 o - Mar lastSu 2s 0 S R AN 2008 ma - Ap Su>=1 2s 0 S R AN 2008 ma - O Su>=1 2s 1 D -Z Australia/Sydney 10:4:52 - LMT 1895 F -10 AU AE%sT 1971 -10 AN AE%sT -Z Australia/Broken_Hill 9:25:48 - LMT 1895 F -10 - AEST 1896 Au 23 -9 - ACST 1899 May -9:30 AU AC%sT 1971 -9:30 AN AC%sT 2000 -9:30 AS AC%sT R LH 1981 1984 - O lastSu 2 1 - R LH 1982 1985 - Mar Su>=1 2 0 - R LH 1985 o - O lastSu 2 0:30 - @@ -1352,19 +872,6 @@ R LH 2006 o - Ap Su>=1 2 0 - R LH 2007 o - Mar lastSu 2 0 - R LH 2008 ma - Ap Su>=1 2 0 - R LH 2008 ma - O Su>=1 2 0:30 - -Z Australia/Lord_Howe 10:36:20 - LMT 1895 F -10 - AEST 1981 Mar -10:30 LH +1030/+1130 1985 Jul -10:30 LH +1030/+11 -Z Antarctica/Macquarie 0 - -00 1899 N -10 - AEST 1916 O 1 2 -10 1 AEDT 1917 F -10 AU AE%sT 1919 Ap 1 0s -0 - -00 1948 Mar 25 -10 AU AE%sT 1967 -10 AT AE%sT 2010 -10 1 AEDT 2011 -10 AT AE%sT R FJ 1998 1999 - N Su>=1 2 1 - R FJ 1999 2000 - F lastSu 3 0 - R FJ 2009 o - N 29 2 1 - @@ -1377,14 +884,6 @@ R FJ 2014 2018 - N Su>=1 2 1 - R FJ 2015 2021 - Ja Su>=12 3 0 - R FJ 2019 o - N Su>=8 2 1 - R FJ 2020 o - D 20 2 1 - -Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 -12 FJ +12/+13 -Z Pacific/Gambier -8:59:48 - LMT 1912 O --9 - -09 -Z Pacific/Marquesas -9:18 - LMT 1912 O --9:30 - -0930 -Z Pacific/Tahiti -9:58:16 - LMT 1912 O --10 - -10 R Gu 1959 o - Jun 27 2 1 D R Gu 1961 o - Ja 29 2 0 S R Gu 1967 o - S 1 2 1 D @@ -1399,50 +898,10 @@ R Gu 1976 o - May 26 2 1 D R Gu 1976 o - Au 22 2:1 0 S R Gu 1977 o - Ap 24 2 1 D R Gu 1977 o - Au 28 2 0 S -Z Pacific/Guam -14:21 - LMT 1844 D 31 -9:39 - LMT 1901 -10 - GST 1941 D 10 -9 - +09 1944 Jul 31 -10 Gu G%sT 2000 D 23 -10 - ChST -Z Pacific/Tarawa 11:32:4 - LMT 1901 -12 - +12 -Z Pacific/Kanton 0 - -00 1937 Au 31 --12 - -12 1979 O --11 - -11 1994 D 31 -13 - +13 -Z Pacific/Kiritimati -10:29:20 - LMT 1901 --10:40 - -1040 1979 O --10 - -10 1994 D 31 -14 - +14 -Z Pacific/Kwajalein 11:9:20 - LMT 1901 -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1944 F 6 -11 - +11 1969 O --12 - -12 1993 Au 20 24 -12 - +12 -Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 -10:51:56 - LMT 1901 -11 - +11 1914 O -9 - +09 1919 F -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1945 Au -11 - +11 1969 O -12 - +12 1999 -11 - +11 -Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 -11:30 - +1130 1942 Au 29 -9 - +09 1945 S 8 -11:30 - +1130 1979 F 10 2 -12 - +12 R NC 1977 1978 - D Su>=1 0 1 - R NC 1978 1979 - F 27 0 0 - R NC 1996 o - D 1 2s 1 - R NC 1997 o - Mar 2 2s 0 - -Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 -11 NC +11/+12 R NZ 1927 o - N 6 2 1 S R NZ 1928 o - Mar 4 2 0 M R NZ 1928 1933 - O Su>=8 2 0:30 S @@ -1468,80 +927,26 @@ R NZ 2007 ma - S lastSu 2s 1 D R k 2007 ma - S lastSu 2:45s 1 - R NZ 2008 ma - Ap Su>=1 2s 0 S R k 2008 ma - Ap Su>=1 2:45s 0 - -Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 -11:30 NZ NZ%sT 1946 -12 NZ NZ%sT -Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 -12:15 - +1215 1946 -12:45 k +1245/+1345 R CK 1978 o - N 12 0 0:30 - R CK 1979 1991 - Mar Su>=1 0 0 - R CK 1979 1990 - O lastSu 0 0:30 - -Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 --10:39:4 - LMT 1952 O 16 --10:30 - -1030 1978 N 12 --10 CK -10/-0930 -Z Pacific/Niue -11:19:40 - LMT 1952 O 16 --11:20 - -1120 1964 Jul --11 - -11 -Z Pacific/Norfolk 11:11:52 - LMT 1901 -11:12 - +1112 1951 -11:30 - +1130 1974 O 27 2s -11:30 1 +1230 1975 Mar 2 2s -11:30 - +1130 2015 O 4 2s -11 - +11 2019 Jul -11 AN +11/+12 -Z Pacific/Palau -15:2:4 - LMT 1844 D 31 -8:57:56 - LMT 1901 -9 - +09 -Z Pacific/Port_Moresby 9:48:40 - LMT 1880 -9:48:32 - PMMT 1895 -10 - +10 -Z Pacific/Bougainville 10:22:16 - LMT 1880 -9:48:32 - PMMT 1895 -10 - +10 1942 Jul -9 - +09 1945 Au 21 -10 - +10 2014 D 28 2 -11 - +11 -Z Pacific/Pitcairn -8:40:20 - LMT 1901 --8:30 - -0830 1998 Ap 27 --8 - -08 -Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 --11:22:48 - LMT 1911 --11 - SST R WS 2010 o - S lastSu 0 1 - R WS 2011 o - Ap Sa>=1 4 0 - R WS 2011 o - S lastSa 3 1 - R WS 2012 2021 - Ap Su>=1 4 0 - R WS 2012 2020 - S lastSu 3 1 - -Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 --11:26:56 - LMT 1911 --11:30 - -1130 1950 --11 WS -11/-10 2011 D 29 24 -13 WS +13/+14 -Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O -11 - +11 -Z Pacific/Fakaofo -11:24:56 - LMT 1901 --11 - -11 2011 D 30 -13 - +13 R TO 1999 o - O 7 2s 1 - R TO 2000 o - Mar 19 2s 0 - R TO 2000 2001 - N Su>=1 2 1 - R TO 2001 2002 - Ja lastSu 2 0 - R TO 2016 o - N Su>=1 2 1 - R TO 2017 o - Ja Su>=15 3 0 - -Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 -12:20 - +1220 1961 -13 - +13 1999 -13 TO +13/+14 R VU 1973 o - D 22 12u 1 - R VU 1974 o - Mar 30 12u 0 - R VU 1983 1991 - S Sa>=22 24 1 - R VU 1984 1991 - Mar Sa>=22 24 0 - R VU 1992 1993 - Ja Sa>=22 24 0 - R VU 1992 o - O Sa>=22 24 1 - -Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 -11 VU +11/+12 R G 1916 o - May 21 2s 1 BST R G 1916 o - O 1 2s 0 GMT R G 1917 o - Ap 8 2s 1 BST @@ -1607,11 +1012,6 @@ R G 1972 1980 - O Su>=23 2s 0 GMT R G 1981 1995 - Mar lastSu 1u 1 BST R G 1981 1989 - O Su>=23 1u 0 GMT R G 1990 1995 - O Su>=22 1u 0 GMT -Z Europe/London -0:1:15 - LMT 1847 D -0 G %s 1968 O 27 -1 - BST 1971 O 31 2u -0 G %s 1996 -0 E GMT/BST R IE 1971 o - O 31 2u -1 - R IE 1972 1980 - Mar Su>=16 2u 0 - R IE 1972 1980 - O Su>=23 2u -1 - @@ -1619,17 +1019,6 @@ R IE 1981 ma - Mar lastSu 1u 0 - R IE 1981 1989 - O Su>=23 1u -1 - R IE 1990 1995 - O Su>=22 1u -1 - R IE 1996 ma - O lastSu 1u -1 - -Z Europe/Dublin -0:25:21 - LMT 1880 Au 2 --0:25:21 - DMT 1916 May 21 2s --0:25:21 1 IST 1916 O 1 2s -0 G %s 1921 D 6 -0 G GMT/IST 1940 F 25 2s -0 1 IST 1946 O 6 2s -0 - GMT 1947 Mar 16 2s -0 1 IST 1947 N 2 2s -0 - GMT 1948 Ap 18 2s -0 G GMT/IST 1968 O 27 -1 IE IST/GMT R E 1977 1980 - Ap Su>=1 1u 1 S R E 1977 o - S lastSu 1u 0 - R E 1978 o - O 1 1u 0 - @@ -1681,10 +1070,6 @@ R R 1981 1983 - O 1 0 0 - R R 1984 1995 - S lastSu 2s 0 - R R 1985 2010 - Mar lastSu 2s 1 S R R 1996 2010 - O lastSu 2s 0 - -Z WET 0 E WE%sT -Z CET 1 c CE%sT -Z MET 1 c ME%sT -Z EET 2 E EE%sT R q 1940 o - Jun 16 0 1 S R q 1942 o - N 2 3 0 - R q 1943 o - Mar 29 2 1 S @@ -1710,14 +1095,6 @@ R q 1982 o - O 3 0 0 - R q 1983 o - Ap 18 0 1 S R q 1983 o - O 1 0 0 - R q 1984 o - Ap 1 0 1 S -Z Europe/Tirane 1:19:20 - LMT 1914 -1 - CET 1940 Jun 16 -1 q CE%sT 1984 Jul -1 E CE%sT -Z Europe/Andorra 0:6:4 - LMT 1901 -0 - WET 1946 S 30 -1 - CET 1985 Mar 31 2 -1 E CE%sT R a 1920 o - Ap 5 2s 1 S R a 1920 o - S 13 2s 0 - R a 1946 o - Ap 14 2s 1 S @@ -1727,23 +1104,6 @@ R a 1947 o - Ap 6 2s 1 S R a 1948 o - Ap 18 2s 1 S R a 1980 o - Ap 6 0 1 S R a 1980 o - S 28 0 0 - -Z Europe/Vienna 1:5:21 - LMT 1893 Ap -1 c CE%sT 1920 -1 a CE%sT 1940 Ap 1 2s -1 c CE%sT 1945 Ap 2 2s -1 1 CEST 1945 Ap 12 2s -1 - CET 1946 -1 a CE%sT 1981 -1 E CE%sT -Z Europe/Minsk 1:50:16 - LMT 1880 -1:50 - MMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 Jun 28 -1 c CE%sT 1944 Jul 3 -3 R MSK/MSD 1990 -3 - MSK 1991 Mar 31 2s -2 R EE%sT 2011 Mar 27 2s -3 - +03 R b 1918 o - Mar 9 0s 1 S R b 1918 1919 - O Sa>=1 23s 0 - R b 1919 o - Mar 1 23s 1 S @@ -1778,87 +1138,27 @@ R b 1945 o - Ap 2 2s 1 S R b 1945 o - S 16 2s 0 - R b 1946 o - May 19 2s 1 S R b 1946 o - O 7 2s 0 - -Z Europe/Brussels 0:17:30 - LMT 1880 -0:17:30 - BMT 1892 May 1 0:17:30 -0 - WET 1914 N 8 -1 - CET 1916 May -1 c CE%sT 1918 N 11 11u -0 b WE%sT 1940 May 20 2s -1 c CE%sT 1944 S 3 -1 b CE%sT 1977 -1 E CE%sT R BG 1979 o - Mar 31 23 1 S R BG 1979 o - O 1 1 0 - R BG 1980 1982 - Ap Sa>=1 23 1 S R BG 1980 o - S 29 1 0 - R BG 1981 o - S 27 2 0 - -Z Europe/Sofia 1:33:16 - LMT 1880 -1:56:56 - IMT 1894 N 30 -2 - EET 1942 N 2 3 -1 c CE%sT 1945 -1 - CET 1945 Ap 2 3 -2 - EET 1979 Mar 31 23 -2 BG EE%sT 1982 S 26 3 -2 c EE%sT 1991 -2 e EE%sT 1997 -2 E EE%sT R CZ 1945 o - Ap M>=1 2s 1 S R CZ 1945 o - O 1 2s 0 - R CZ 1946 o - May 6 2s 1 S R CZ 1946 1949 - O Su>=1 2s 0 - R CZ 1947 1948 - Ap Su>=15 2s 1 S R CZ 1949 o - Ap 9 2s 1 S -Z Europe/Prague 0:57:44 - LMT 1850 -0:57:44 - PMT 1891 O -1 c CE%sT 1945 May 9 -1 CZ CE%sT 1946 D 1 3 -1 -1 GMT 1947 F 23 2 -1 CZ CE%sT 1979 -1 E CE%sT -Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 -0 - WET 1981 -0 E WE%sT R Th 1991 1992 - Mar lastSu 2 1 D R Th 1991 1992 - S lastSu 2 0 S R Th 1993 2006 - Ap Su>=1 2 1 D R Th 1993 2006 - O lastSu 2 0 S R Th 2007 ma - Mar Su>=8 2 1 D R Th 2007 ma - N Su>=1 2 0 S -Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 1996 -0 - GMT -Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 --2 - -02 1980 Ap 6 2 --2 c -02/-01 1981 Mar 29 --1 E -01/+00 -Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 2023 O 29 1u --2 E -02/-01 -Z America/Thule -4:35:8 - LMT 1916 Jul 28 --4 Th A%sT -Z Europe/Tallinn 1:39 - LMT 1880 -1:39 - TMT 1918 F -1 c CE%sT 1919 Jul -1:39 - TMT 1921 May -2 - EET 1940 Au 6 -3 - MSK 1941 S 15 -1 c CE%sT 1944 S 22 -3 R MSK/MSD 1989 Mar 26 2s -2 1 EEST 1989 S 24 2s -2 c EE%sT 1998 S 22 -2 E EE%sT 1999 O 31 4 -2 - EET 2002 F 21 -2 E EE%sT R FI 1942 o - Ap 2 24 1 S R FI 1942 o - O 4 1 0 - R FI 1981 1982 - Mar lastSu 2 1 S R FI 1981 1982 - S lastSu 3 0 - -Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 -1:39:49 - HMT 1921 May -2 FI EE%sT 1983 -2 E EE%sT R F 1916 o - Jun 14 23s 1 S R F 1916 1919 - O Su>=1 23s 0 - R F 1917 o - Mar 24 23s 1 S @@ -1901,13 +1201,6 @@ R F 1945 o - Ap 2 2 2 M R F 1945 o - S 16 3 0 - R F 1976 o - Mar 28 1 1 S R F 1976 o - S 26 1 0 - -Z Europe/Paris 0:9:21 - LMT 1891 Mar 16 -0:9:21 - PMT 1911 Mar 11 -0 F WE%sT 1940 Jun 14 23 -1 c CE%sT 1944 Au 25 -0 F WE%sT 1945 S 16 3 -1 F CE%sT 1977 -1 E CE%sT R DE 1946 o - Ap 14 2s 1 S R DE 1946 o - O 7 2s 0 - R DE 1947 1949 - O Su>=1 2s 0 - @@ -1919,15 +1212,6 @@ R DE 1949 o - Ap 10 2s 1 S R So 1945 o - May 24 2 2 M R So 1945 o - S 24 3 1 S R So 1945 o - N 18 2s 0 - -Z Europe/Berlin 0:53:28 - LMT 1893 Ap -1 c CE%sT 1945 May 24 2 -1 So CE%sT 1946 -1 DE CE%sT 1980 -1 E CE%sT -Z Europe/Gibraltar -0:21:24 - LMT 1880 Au 2 -0 G %s 1957 Ap 14 2 -1 - CET 1982 -1 E CE%sT R g 1932 o - Jul 7 0 1 S R g 1932 o - S 1 0 0 - R g 1941 o - Ap 7 0 1 S @@ -1947,12 +1231,6 @@ R g 1979 o - Ap 1 9 1 S R g 1979 o - S 29 2 0 - R g 1980 o - Ap 1 0 1 S R g 1980 o - S 28 0 0 - -Z Europe/Athens 1:34:52 - LMT 1895 S 14 -1:34:52 - AMT 1916 Jul 28 0:1 -2 g EE%sT 1941 Ap 30 -1 g CE%sT 1944 Ap 4 -2 g EE%sT 1981 -2 E EE%sT R h 1918 1919 - Ap 15 2 1 S R h 1918 1920 - S M>=15 3 0 - R h 1920 o - Ap 5 2 1 S @@ -1972,12 +1250,6 @@ R h 1980 o - Ap 6 0 1 S R h 1980 o - S 28 1 0 - R h 1981 1983 - Mar lastSu 0 1 S R h 1981 1983 - S lastSu 1 0 - -Z Europe/Budapest 1:16:20 - LMT 1890 N -1 c CE%sT 1918 -1 h CE%sT 1941 Ap 7 23 -1 c CE%sT 1945 -1 h CE%sT 1984 -1 E CE%sT R I 1916 o - Jun 3 24 1 S R I 1916 1917 - S 30 24 0 - R I 1917 o - Mar 31 24 1 S @@ -2019,44 +1291,8 @@ R I 1976 o - May 30 0s 1 S R I 1977 1979 - May Su>=22 0s 1 S R I 1978 o - O 1 0s 0 - R I 1979 o - S 30 0s 0 - -Z Europe/Rome 0:49:56 - LMT 1866 D 12 -0:49:56 - RMT 1893 O 31 23u -1 I CE%sT 1943 S 10 -1 c CE%sT 1944 Jun 4 -1 I CE%sT 1980 -1 E CE%sT R LV 1989 1996 - Mar lastSu 2s 1 S R LV 1989 1996 - S lastSu 2s 0 - -Z Europe/Riga 1:36:34 - LMT 1880 -1:36:34 - RMT 1918 Ap 15 2 -1:36:34 1 LST 1918 S 16 3 -1:36:34 - RMT 1919 Ap 1 2 -1:36:34 1 LST 1919 May 22 3 -1:36:34 - RMT 1926 May 11 -2 - EET 1940 Au 5 -3 - MSK 1941 Jul -1 c CE%sT 1944 O 13 -3 R MSK/MSD 1989 Mar lastSu 2s -2 1 EEST 1989 S lastSu 2s -2 LV EE%sT 1997 Ja 21 -2 E EE%sT 2000 F 29 -2 - EET 2001 Ja 2 -2 E EE%sT -Z Europe/Vilnius 1:41:16 - LMT 1880 -1:24 - WMT 1917 -1:35:36 - KMT 1919 O 10 -1 - CET 1920 Jul 12 -2 - EET 1920 O 9 -1 - CET 1940 Au 3 -3 - MSK 1941 Jun 24 -1 c CE%sT 1944 Au -3 R MSK/MSD 1989 Mar 26 2s -2 R EE%sT 1991 S 29 2s -2 c EE%sT 1998 -2 - EET 1998 Mar 29 1u -1 E CE%sT 1999 O 31 1u -2 - EET 2003 -2 E EE%sT R MT 1973 o - Mar 31 0s 1 S R MT 1973 o - S 29 0s 0 - R MT 1974 o - Ap 21 0s 1 S @@ -2064,22 +1300,8 @@ R MT 1974 o - S 16 0s 0 - R MT 1975 1979 - Ap Su>=15 2 1 S R MT 1975 1980 - S Su>=15 2 0 - R MT 1980 o - Mar 31 2 1 S -Z Europe/Malta 0:58:4 - LMT 1893 N 2 -1 I CE%sT 1973 Mar 31 -1 MT CE%sT 1981 -1 E CE%sT R MD 1997 ma - Mar lastSu 2 1 S R MD 1997 ma - O lastSu 3 0 - -Z Europe/Chisinau 1:55:20 - LMT 1880 -1:55 - CMT 1918 F 15 -1:44:24 - BMT 1931 Jul 24 -2 z EE%sT 1940 Au 15 -2 1 EEST 1941 Jul 17 -1 c CE%sT 1944 Au 24 -3 R MSK/MSD 1990 May 6 2 -2 R EE%sT 1992 -2 e EE%sT 1997 -2 MD EE%sT R O 1918 1919 - S 16 2s 0 - R O 1919 o - Ap 15 2s 1 S R O 1944 o - Ap 3 2s 1 S @@ -2100,15 +1322,6 @@ R O 1959 1961 - O Su>=1 1s 0 - R O 1960 o - Ap 3 1s 1 S R O 1961 1964 - May lastSu 1s 1 S R O 1962 1964 - S lastSu 1s 0 - -Z Europe/Warsaw 1:24 - LMT 1880 -1:24 - WMT 1915 Au 5 -1 c CE%sT 1918 S 16 3 -2 O EE%sT 1922 Jun -1 O CE%sT 1940 Jun 23 2 -1 c CE%sT 1944 O -1 O CE%sT 1977 -1 W- CE%sT 1988 -1 E CE%sT R p 1916 o - Jun 17 23 1 S R p 1916 o - N 1 1 0 - R p 1917 o - F 28 23s 1 S @@ -2157,42 +1370,6 @@ R p 1979 1982 - S lastSu 1s 0 - R p 1980 o - Mar lastSu 0s 1 S R p 1981 1982 - Mar lastSu 1s 1 S R p 1983 o - Mar lastSu 2s 1 S -Z Europe/Lisbon -0:36:45 - LMT 1884 --0:36:45 - LMT 1912 Ja 1 0u -0 p WE%sT 1966 Ap 3 2 -1 - CET 1976 S 26 1 -0 p WE%sT 1983 S 25 1s -0 W- WE%sT 1992 S 27 1s -1 E CE%sT 1996 Mar 31 1u -0 E WE%sT -Z Atlantic/Azores -1:42:40 - LMT 1884 --1:54:32 - HMT 1912 Ja 1 2u --2 p -02/-01 1942 Ap 25 22s --2 p +00 1942 Au 15 22s --2 p -02/-01 1943 Ap 17 22s --2 p +00 1943 Au 28 22s --2 p -02/-01 1944 Ap 22 22s --2 p +00 1944 Au 26 22s --2 p -02/-01 1945 Ap 21 22s --2 p +00 1945 Au 25 22s --2 p -02/-01 1966 Ap 3 2 --1 p -01/+00 1983 S 25 1s --1 W- -01/+00 1992 S 27 1s -0 E WE%sT 1993 Mar 28 1u --1 E -01/+00 -Z Atlantic/Madeira -1:7:36 - LMT 1884 --1:7:36 - FMT 1912 Ja 1 1u --1 p -01/+00 1942 Ap 25 22s --1 p +01 1942 Au 15 22s --1 p -01/+00 1943 Ap 17 22s --1 p +01 1943 Au 28 22s --1 p -01/+00 1944 Ap 22 22s --1 p +01 1944 Au 26 22s --1 p -01/+00 1945 Ap 21 22s --1 p +01 1945 Au 25 22s --1 p -01/+00 1966 Ap 3 2 -0 p WE%sT 1983 S 25 1s -0 E WE%sT R z 1932 o - May 21 0s 1 S R z 1932 1939 - O Su>=1 0s 0 - R z 1933 1939 - Ap Su>=2 0s 1 S @@ -2202,252 +1379,6 @@ R z 1980 o - Ap 5 23 1 S R z 1980 o - S lastSu 1 0 - R z 1991 1993 - Mar lastSu 0s 1 S R z 1991 1993 - S lastSu 0s 0 - -Z Europe/Bucharest 1:44:24 - LMT 1891 O -1:44:24 - BMT 1931 Jul 24 -2 z EE%sT 1981 Mar 29 2s -2 c EE%sT 1991 -2 z EE%sT 1994 -2 e EE%sT 1997 -2 E EE%sT -Z Europe/Kaliningrad 1:22 - LMT 1893 Ap -1 c CE%sT 1945 Ap 10 -2 O EE%sT 1946 Ap 7 -3 R MSK/MSD 1989 Mar 26 2s -2 R EE%sT 2011 Mar 27 2s -3 - +03 2014 O 26 2s -2 - EET -Z Europe/Moscow 2:30:17 - LMT 1880 -2:30:17 - MMT 1916 Jul 3 -2:31:19 R %s 1919 Jul 1 0u -3 R %s 1921 O -3 R MSK/MSD 1922 O -2 - EET 1930 Jun 21 -3 R MSK/MSD 1991 Mar 31 2s -2 R EE%sT 1992 Ja 19 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Simferopol 2:16:24 - LMT 1880 -2:16 - SMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 N -1 c CE%sT 1944 Ap 13 -3 R MSK/MSD 1990 -3 - MSK 1990 Jul 1 2 -2 - EET 1992 Mar 20 -2 c EE%sT 1994 May -3 c MSK/MSD 1996 Mar 31 0s -3 1 MSD 1996 O 27 3s -3 - MSK 1997 Mar lastSu 1u -2 E EE%sT 2014 Mar 30 2 -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Astrakhan 3:12:12 - LMT 1924 May -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 -Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 -3 - +03 1930 Jun 21 -4 - +04 1961 N 11 -4 R +04/+05 1988 Mar 27 2s -3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK 2018 O 28 2s -4 - +04 2020 D 27 2s -3 - MSK -Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1988 Mar 27 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 D 4 2s -4 - +04 -Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 - +04 1935 Ja 27 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1991 S 29 2s -3 - +03 1991 O 20 3 -4 R +04/+05 2010 Mar 28 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 -Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1992 Ja 19 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 -Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 -3:45:5 - PMT 1919 Jul 15 4 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2011 Mar 27 2s -6 - +06 2014 O 26 2s -5 - +05 -Z Asia/Omsk 4:53:30 - LMT 1919 N 14 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 -Z Asia/Barnaul 5:35 - LMT 1919 D 10 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1995 May 28 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Mar 27 2s -7 - +07 -Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1993 May 23 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Jul 24 2s -7 - +07 -Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2002 May 1 3 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 May 29 2s -7 - +07 -Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2010 Mar 28 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 -Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2011 Mar 27 2s -8 - +08 2014 O 26 2s -7 - +07 -Z Asia/Irkutsk 6:57:5 - LMT 1880 -6:57:5 - IMT 1920 Ja 25 -7 - +07 1930 Jun 21 -8 R +08/+09 1991 Mar 31 2s -7 R +07/+08 1992 Ja 19 2s -8 R +08/+09 2011 Mar 27 2s -9 - +09 2014 O 26 2s -8 - +08 -Z Asia/Chita 7:33:52 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -8 - +08 2016 Mar 27 2 -9 - +09 -Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -9 - +09 -Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 -9 - +09 1930 Jun 21 -10 R +10/+11 1991 Mar 31 2s -9 R +09/+10 1992 Ja 19 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 -Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2004 -10 R +10/+11 2011 Mar 27 2s -11 - +11 2011 S 13 0s -10 - +10 2014 O 26 2s -9 - +09 -Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 -9 - +09 1945 Au 25 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 1997 Mar lastSu 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 2016 Mar 27 2s -11 - +11 -Z Asia/Magadan 10:3:12 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -10 - +10 2016 Ap 24 2s -11 - +11 -Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -11 - +11 -Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1981 Ap -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2011 S 13 0s -11 - +11 2014 O 26 2s -10 - +10 -Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 -11 - +11 1930 Jun 21 -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 -Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 -12 - +12 1930 Jun 21 -13 R +13/+14 1982 Ap 1 0s -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 -Z Europe/Belgrade 1:22 - LMT 1884 -1 - CET 1941 Ap 18 23 -1 c CE%sT 1945 -1 - CET 1945 May 8 2s -1 1 CEST 1945 S 16 2s -1 - CET 1982 N 27 -1 E CE%sT R s 1918 o - Ap 15 23 1 S R s 1918 1919 - O 6 24s 0 - R s 1919 o - Ap 6 23 1 S @@ -2487,30 +1418,8 @@ R Sp 1976 o - Au 1 0 0 - R Sp 1977 o - S 28 0 0 - R Sp 1978 o - Jun 1 0 1 S R Sp 1978 o - Au 4 0 0 - -Z Europe/Madrid -0:14:44 - LMT 1901 Ja 1 0u -0 s WE%sT 1940 Mar 16 23 -1 s CE%sT 1979 -1 E CE%sT -Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u -0 - WET 1918 May 6 23 -0 1 WEST 1918 O 7 23 -0 - WET 1924 -0 s WE%sT 1929 -0 - WET 1967 -0 Sp WE%sT 1984 Mar 16 -1 - CET 1986 -1 E CE%sT -Z Atlantic/Canary -1:1:36 - LMT 1922 Mar --1 - -01 1946 S 30 1 -0 - WET 1980 Ap 6 0s -0 1 WEST 1980 S 28 1u -0 E WE%sT R CH 1941 1942 - May M>=1 1 1 S R CH 1941 1942 - O M>=1 2 0 - -Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 -0:29:46 - BMT 1894 Jun -1 CH CE%sT 1981 -1 E CE%sT R T 1916 o - May 1 0 1 S R T 1916 o - O 1 0 0 - R T 1920 o - Mar 28 0 1 S @@ -2556,28 +1465,6 @@ R T 1986 1995 - S lastSu 1s 0 - R T 1994 o - Mar 20 1s 1 S R T 1995 2006 - Mar lastSu 1s 1 S R T 1996 2006 - O lastSu 1s 0 - -Z Europe/Istanbul 1:55:52 - LMT 1880 -1:56:56 - IMT 1910 O -2 T EE%sT 1978 Jun 29 -3 T +03/+04 1984 N 1 2 -2 T EE%sT 2007 -2 E EE%sT 2011 Mar 27 1u -2 - EET 2011 Mar 28 1u -2 E EE%sT 2014 Mar 30 1u -2 - EET 2014 Mar 31 1u -2 E EE%sT 2015 O 25 1u -2 1 EEST 2015 N 8 1u -2 E EE%sT 2016 S 7 -3 - +03 -Z Europe/Kyiv 2:2:4 - LMT 1880 -2:2:4 - KMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 S 20 -1 c CE%sT 1943 N 6 -3 R MSK/MSD 1990 Jul 1 2 -2 1 EEST 1991 S 29 3 -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 R u 1942 o - F 9 2 1 W @@ -2591,172 +1478,34 @@ R u 1976 1986 - Ap lastSu 2 1 D R u 1987 2006 - Ap Su>=1 2 1 D R u 2007 ma - Mar Su>=8 2 1 D R u 2007 ma - N Su>=1 2 0 S -Z EST -5 - EST -Z MST -7 - MST -Z HST -10 - HST -Z EST5EDT -5 u E%sT -Z CST6CDT -6 u C%sT -Z MST7MDT -7 u M%sT -Z PST8PDT -8 u P%sT R NY 1920 o - Mar lastSu 2 1 D R NY 1920 o - O lastSu 2 0 S R NY 1921 1966 - Ap lastSu 2 1 D R NY 1921 1954 - S lastSu 2 0 S R NY 1955 1966 - O lastSu 2 0 S -Z America/New_York -4:56:2 - LMT 1883 N 18 17u --5 u E%sT 1920 --5 NY E%sT 1942 --5 u E%sT 1946 --5 NY E%sT 1967 --5 u E%sT R Ch 1920 o - Jun 13 2 1 D R Ch 1920 1921 - O lastSu 2 0 S R Ch 1921 o - Mar lastSu 2 1 D R Ch 1922 1966 - Ap lastSu 2 1 D R Ch 1922 1954 - S lastSu 2 0 S R Ch 1955 1966 - O lastSu 2 0 S -Z America/Chicago -5:50:36 - LMT 1883 N 18 18u --6 u C%sT 1920 --6 Ch C%sT 1936 Mar 1 2 --5 - EST 1936 N 15 2 --6 Ch C%sT 1942 --6 u C%sT 1946 --6 Ch C%sT 1967 --6 u C%sT -Z America/North_Dakota/Center -6:45:12 - LMT 1883 N 18 19u --7 u M%sT 1992 O 25 2 --6 u C%sT -Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u --7 u M%sT 2003 O 26 2 --6 u C%sT -Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u --7 u M%sT 2010 N 7 2 --6 u C%sT R De 1920 1921 - Mar lastSu 2 1 D R De 1920 o - O lastSu 2 0 S R De 1921 o - May 22 2 0 S R De 1965 1966 - Ap lastSu 2 1 D R De 1965 1966 - O lastSu 2 0 S -Z America/Denver -6:59:56 - LMT 1883 N 18 19u --7 u M%sT 1920 --7 De M%sT 1942 --7 u M%sT 1946 --7 De M%sT 1967 --7 u M%sT R CA 1948 o - Mar 14 2:1 1 D R CA 1949 o - Ja 1 2 0 S R CA 1950 1966 - Ap lastSu 1 1 D R CA 1950 1961 - S lastSu 2 0 S R CA 1962 1966 - O lastSu 2 0 S -Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u --8 u P%sT 1946 --8 CA P%sT 1967 --8 u P%sT -Z America/Juneau 15:2:19 - LMT 1867 O 19 15:33:32 --8:57:41 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1980 Ap 27 2 --9 u Y%sT 1980 O 26 2 --8 u P%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 --9:1:13 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 --8:46:18 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1983 O 30 2 --8 - PST 2015 N 1 2 --9 u AK%sT 2018 N 4 2 --8 - PST 2019 Ja 20 2 --9 u AK%sT -Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 --9:18:55 - LMT 1900 Au 20 12 --9 - YST 1942 --9 u Y%sT 1946 --9 - YST 1969 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 --9:59:36 - LMT 1900 Au 20 12 --10 - AST 1942 --10 u A%sT 1967 Ap --10 - AHST 1969 --10 u AH%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 --11:1:38 - LMT 1900 Au 20 12 --11 - NST 1942 --11 u N%sT 1946 --11 - NST 1967 Ap --11 - BST 1969 --11 u B%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Adak 12:13:22 - LMT 1867 O 19 12:44:35 --11:46:38 - LMT 1900 Au 20 12 --11 - NST 1942 --11 u N%sT 1946 --11 - NST 1967 Ap --11 - BST 1969 --11 u B%sT 1983 O 30 2 --10 u AH%sT 1983 N 30 --10 u H%sT -Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 --10:30 - HST 1933 Ap 30 2 --10:30 1 HDT 1933 May 21 12 --10:30 u H%sT 1947 Jun 8 2 --10 - HST -Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u --7 u M%sT 1944 Ja 1 0:1 --7 - MST 1944 Ap 1 0:1 --7 u M%sT 1944 O 1 0:1 --7 - MST 1967 --7 u M%sT 1968 Mar 21 --7 - MST -Z America/Boise -7:44:49 - LMT 1883 N 18 20u --8 u P%sT 1923 May 13 2 --7 u M%sT 1974 --7 - MST 1974 F 3 2 --7 u M%sT R In 1941 o - Jun 22 2 1 D R In 1941 1954 - S lastSu 2 0 S R In 1946 1954 - Ap lastSu 2 1 D -Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u --6 u C%sT 1920 --6 In C%sT 1942 --6 u C%sT 1946 --6 In C%sT 1955 Ap 24 2 --5 - EST 1957 S 29 2 --6 - CST 1958 Ap 27 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 --5 u E%sT R Ma 1951 o - Ap lastSu 2 1 D R Ma 1951 o - S lastSu 2 0 S R Ma 1954 1960 - Ap lastSu 2 1 D R Ma 1954 1960 - S lastSu 2 0 S -Z America/Indiana/Marengo -5:45:23 - LMT 1883 N 18 18u --6 u C%sT 1951 --6 Ma C%sT 1961 Ap 30 2 --5 - EST 1969 --5 u E%sT 1974 Ja 6 2 --6 1 CDT 1974 O 27 2 --5 u E%sT 1976 --5 - EST 2006 --5 u E%sT R V 1946 o - Ap lastSu 2 1 D R V 1946 o - S lastSu 2 0 S R V 1953 1954 - Ap lastSu 2 1 D @@ -2766,68 +1515,23 @@ R V 1956 1963 - Ap lastSu 2 1 D R V 1960 o - O lastSu 2 0 S R V 1961 o - S lastSu 2 0 S R V 1962 1963 - O lastSu 2 0 S -Z America/Indiana/Vincennes -5:50:7 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 V C%sT 1964 Ap 26 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 N 4 2 --5 u E%sT R Pe 1955 o - May 1 0 1 D R Pe 1955 1960 - S lastSu 2 0 S R Pe 1956 1963 - Ap lastSu 2 1 D R Pe 1961 1963 - O lastSu 2 0 S -Z America/Indiana/Tell_City -5:47:3 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 Pe C%sT 1964 Ap 26 2 --5 - EST 1967 O 29 2 --6 u C%sT 1969 Ap 27 2 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT R Pi 1955 o - May 1 0 1 D R Pi 1955 1960 - S lastSu 2 0 S R Pi 1956 1964 - Ap lastSu 2 1 D R Pi 1961 1964 - O lastSu 2 0 S -Z America/Indiana/Petersburg -5:49:7 - LMT 1883 N 18 18u --6 u C%sT 1955 --6 Pi C%sT 1965 Ap 25 2 --5 - EST 1966 O 30 2 --6 u C%sT 1977 O 30 2 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 N 4 2 --5 u E%sT R St 1947 1961 - Ap lastSu 2 1 D R St 1947 1954 - S lastSu 2 0 S R St 1955 1956 - O lastSu 2 0 S R St 1957 1958 - S lastSu 2 0 S R St 1959 1961 - O lastSu 2 0 S -Z America/Indiana/Knox -5:46:30 - LMT 1883 N 18 18u --6 u C%sT 1947 --6 St C%sT 1962 Ap 29 2 --5 - EST 1963 O 27 2 --6 u C%sT 1991 O 27 2 --5 - EST 2006 Ap 2 2 --6 u C%sT R Pu 1946 1960 - Ap lastSu 2 1 D R Pu 1946 1954 - S lastSu 2 0 S R Pu 1955 1956 - O lastSu 2 0 S R Pu 1957 1960 - S lastSu 2 0 S -Z America/Indiana/Winamac -5:46:25 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 Pu C%sT 1961 Ap 30 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 Mar 11 2 --5 u E%sT -Z America/Indiana/Vevay -5:40:16 - LMT 1883 N 18 18u --6 u C%sT 1954 Ap 25 2 --5 - EST 1969 --5 u E%sT 1973 --5 - EST 2006 --5 u E%sT R v 1921 o - May 1 2 1 D R v 1921 o - S 1 2 0 S R v 1941 o - Ap lastSu 2 1 D @@ -2837,41 +1541,12 @@ R v 1946 o - Jun 2 2 0 S R v 1950 1961 - Ap lastSu 2 1 D R v 1950 1955 - S lastSu 2 0 S R v 1956 1961 - O lastSu 2 0 S -Z America/Kentucky/Louisville -5:43:2 - LMT 1883 N 18 18u --6 u C%sT 1921 --6 v C%sT 1942 --6 u C%sT 1946 --6 v C%sT 1961 Jul 23 2 --5 - EST 1968 --5 u E%sT 1974 Ja 6 2 --6 1 CDT 1974 O 27 2 --5 u E%sT -Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 - CST 1968 --6 u C%sT 2000 O 29 2 --5 u E%sT R Dt 1948 o - Ap lastSu 2 1 D R Dt 1948 o - S lastSu 2 0 S -Z America/Detroit -5:32:11 - LMT 1905 --6 - CST 1915 May 15 2 --5 - EST 1942 --5 u E%sT 1946 --5 Dt E%sT 1967 Jun 14 0:1 --5 u E%sT 1969 --5 - EST 1973 --5 u E%sT 1975 --5 - EST 1975 Ap 27 2 --5 u E%sT R Me 1946 o - Ap lastSu 2 1 D R Me 1946 o - S lastSu 2 0 S R Me 1966 o - Ap lastSu 2 1 D R Me 1966 o - O lastSu 2 0 S -Z America/Menominee -5:50:27 - LMT 1885 S 18 12 --6 u C%sT 1946 --6 Me C%sT 1969 Ap 27 2 --5 - EST 1973 Ap 29 2 --6 u C%sT R C 1918 o - Ap 14 2 1 D R C 1918 o - O 27 2 0 S R C 1942 o - F 9 2 1 W @@ -2901,24 +1576,6 @@ R j 1988 o - Ap Su>=1 0:1 2 DD R j 1989 2006 - Ap Su>=1 0:1 1 D R j 2007 2011 - Mar Su>=8 0:1 1 D R j 2007 2010 - N Su>=1 0:1 0 S -Z America/St_Johns -3:30:52 - LMT 1884 --3:30:52 j N%sT 1918 --3:30:52 C N%sT 1919 --3:30:52 j N%sT 1935 Mar 30 --3:30 j N%sT 1942 May 11 --3:30 C N%sT 1946 --3:30 j N%sT 2011 N --3:30 C N%sT -Z America/Goose_Bay -4:1:40 - LMT 1884 --3:30:52 - NST 1918 --3:30:52 C N%sT 1919 --3:30:52 - NST 1935 Mar 30 --3:30 - NST 1936 --3:30 j N%sT 1942 May 11 --3:30 C N%sT 1946 --3:30 j N%sT 1966 Mar 15 2 --4 j A%sT 2011 N --4 C A%sT R H 1916 o - Ap 1 0 1 D R H 1916 o - O 1 0 0 S R H 1920 o - May 9 0 1 D @@ -2960,19 +1617,6 @@ R H 1956 1959 - Ap lastSu 2 1 D R H 1956 1959 - S lastSu 2 0 S R H 1962 1973 - Ap lastSu 2 1 D R H 1962 1973 - O lastSu 2 0 S -Z America/Halifax -4:14:24 - LMT 1902 Jun 15 --4 H A%sT 1918 --4 C A%sT 1919 --4 H A%sT 1942 F 9 2s --4 C A%sT 1946 --4 H A%sT 1974 --4 C A%sT -Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 --4 C A%sT 1953 --4 H A%sT 1954 --4 - AST 1972 --4 H A%sT 1974 --4 C A%sT R o 1933 1935 - Jun Su>=8 1 1 D R o 1933 1935 - S Su>=8 1 0 S R o 1936 1938 - Jun Su>=1 1 1 D @@ -2986,15 +1630,6 @@ R o 1946 1956 - S lastSu 2 0 S R o 1957 1972 - O lastSu 2 0 S R o 1993 2006 - Ap Su>=1 0:1 1 D R o 1993 2006 - O lastSu 0:1 0 S -Z America/Moncton -4:19:8 - LMT 1883 D 9 --5 - EST 1902 Jun 15 --4 C A%sT 1933 --4 o A%sT 1942 --4 C A%sT 1946 --4 o A%sT 1973 --4 C A%sT 1993 --4 o A%sT 2007 --4 C A%sT R t 1919 o - Mar 30 23:30 1 D R t 1919 o - O 26 0 0 S R t 1920 o - May 2 2 1 D @@ -3008,21 +1643,11 @@ R t 1927 1937 - S Su>=25 2 0 S R t 1928 1937 - Ap Su>=25 2 1 D R t 1938 1940 - Ap lastSu 2 1 D R t 1938 1939 - S lastSu 2 0 S -R t 1945 1946 - S lastSu 2 0 S -R t 1946 o - Ap lastSu 2 1 D -R t 1947 1949 - Ap lastSu 0 1 D -R t 1947 1948 - S lastSu 0 0 S -R t 1949 o - N lastSu 0 0 S -R t 1950 1973 - Ap lastSu 2 1 D -R t 1950 o - N lastSu 2 0 S +R t 1945 1948 - S lastSu 2 0 S +R t 1946 1973 - Ap lastSu 2 1 D +R t 1949 1950 - N lastSu 2 0 S R t 1951 1956 - S lastSu 2 0 S R t 1957 1973 - O lastSu 2 0 S -Z America/Toronto -5:17:32 - LMT 1895 --5 C E%sT 1919 --5 t E%sT 1942 F 9 2s --5 C E%sT 1946 --5 t E%sT 1974 --5 C E%sT R W 1916 o - Ap 23 0 1 D R W 1916 o - S 17 0 0 S R W 1918 o - Ap 14 2 1 D @@ -3047,9 +1672,6 @@ R W 1963 o - S 22 2 0 S R W 1966 1986 - Ap lastSu 2s 1 D R W 1966 2005 - O lastSu 2s 0 S R W 1987 2005 - Ap Su>=1 2s 1 D -Z America/Winnipeg -6:28:36 - LMT 1887 Jul 16 --6 W C%sT 2006 --6 C C%sT R r 1918 o - Ap 14 2 1 D R r 1918 o - O 27 2 0 S R r 1930 1934 - May Su>=1 0 1 D @@ -3072,14 +1694,6 @@ R Sw 1957 o - O lastSu 2 0 S R Sw 1959 1961 - Ap lastSu 2 1 D R Sw 1959 o - O lastSu 2 0 S R Sw 1960 1961 - S lastSu 2 0 S -Z America/Regina -6:58:36 - LMT 1905 S --7 r M%sT 1960 Ap lastSu 2 --6 - CST -Z America/Swift_Current -7:11:20 - LMT 1905 S --7 C M%sT 1946 Ap lastSu 2 --7 r M%sT 1950 --7 Sw M%sT 1972 Ap lastSu 2 --6 - CST R Ed 1918 1919 - Ap Su>=8 2 1 D R Ed 1918 o - O 27 2 0 S R Ed 1919 o - May 27 2 0 S @@ -3093,9 +1707,6 @@ R Ed 1947 o - Ap lastSu 2 1 D R Ed 1947 o - S lastSu 2 0 S R Ed 1972 1986 - Ap lastSu 2 1 D R Ed 1972 2006 - O lastSu 2 0 S -Z America/Edmonton -7:33:52 - LMT 1906 S --7 Ed M%sT 1987 --7 C M%sT R Va 1918 o - Ap 14 2 1 D R Va 1918 o - O 27 2 0 S R Va 1942 o - F 9 2 1 W @@ -3105,19 +1716,6 @@ R Va 1946 1986 - Ap lastSu 2 1 D R Va 1946 o - S 29 2 0 S R Va 1947 1961 - S lastSu 2 0 S R Va 1962 2006 - O lastSu 2 0 S -Z America/Vancouver -8:12:28 - LMT 1884 --8 Va P%sT 1987 --8 C P%sT -Z America/Dawson_Creek -8:0:56 - LMT 1884 --8 C P%sT 1947 --8 Va P%sT 1972 Au 30 2 --7 - MST -Z America/Fort_Nelson -8:10:47 - LMT 1884 --8 Va P%sT 1946 --8 - PST 1947 --8 Va P%sT 1987 --8 C P%sT 2015 Mar 8 2 --7 - MST R Y 1918 o - Ap 14 2 1 D R Y 1918 o - O 27 2 0 S R Y 1919 o - May 25 2 1 D @@ -3130,42 +1728,6 @@ R Y 1972 2006 - O lastSu 2 0 S R Y 1987 2006 - Ap Su>=1 2 1 D R Yu 1965 o - Ap lastSu 0 2 DD R Yu 1965 o - O lastSu 2 0 S -Z America/Iqaluit 0 - -00 1942 Au --5 Y E%sT 1999 O 31 2 --6 C C%sT 2000 O 29 2 --5 C E%sT -Z America/Resolute 0 - -00 1947 Au 31 --6 Y C%sT 2000 O 29 2 --5 - EST 2001 Ap 1 3 --6 C C%sT 2006 O 29 2 --5 - EST 2007 Mar 11 3 --6 C C%sT -Z America/Rankin_Inlet 0 - -00 1957 --6 Y C%sT 2000 O 29 2 --5 - EST 2001 Ap 1 3 --6 C C%sT -Z America/Cambridge_Bay 0 - -00 1920 --7 Y M%sT 1999 O 31 2 --6 C C%sT 2000 O 29 2 --5 - EST 2000 N 5 --6 - CST 2001 Ap 1 3 --7 C M%sT -Z America/Inuvik 0 - -00 1953 --8 Y P%sT 1979 Ap lastSu 2 --7 Y M%sT 1980 --7 C M%sT -Z America/Whitehorse -9:0:12 - LMT 1900 Au 20 --9 Y Y%sT 1965 --9 Yu Y%sT 1966 F 27 --8 - PST 1980 --8 C P%sT 2020 N --7 - MST -Z America/Dawson -9:17:40 - LMT 1900 Au 20 --9 Y Y%sT 1965 --9 Yu Y%sT 1973 O 28 --8 - PST 1980 --8 C P%sT 2020 N --7 - MST R m 1931 o - May 1 23 1 D R m 1931 o - O 1 0 0 S R m 1939 o - F 5 0 1 D @@ -3182,107 +1744,6 @@ R m 2001 o - May Su>=1 2 1 D R m 2001 o - S lastSu 2 0 S R m 2002 2022 - Ap Su>=1 2 1 D R m 2002 2022 - O lastSu 2 0 S -Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 m E%sT 1998 Au 2 2 --6 m C%sT 2015 F 1 2 --5 - EST -Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 - EST 1982 D 2 --6 m C%sT -Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u --6 - CST 1988 --6 u C%sT 1989 --6 m C%sT 2010 --6 u C%sT -Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u --6 - CST 1988 --6 u C%sT 1989 --6 m C%sT -Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 m C%sT 2001 S 30 2 --6 - CST 2002 F 20 --6 m C%sT -Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2010 --7 u M%sT 2022 O 30 2 --6 - CST 2022 N 30 --7 u M%sT -Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2010 --7 u M%sT 2022 O 30 2 --6 - CST 2022 N 30 --6 u C%sT -Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2022 O 30 2 --6 - CST -Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT 1999 --7 - MST -Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT -Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT 2010 Ap 4 2 --6 m C%sT -Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u --7 - MST 1924 --8 - PST 1927 Jun 10 23 --7 - MST 1930 N 15 --8 - PST 1931 Ap --8 1 PDT 1931 S 30 --8 - PST 1942 Ap 24 --8 1 PWT 1945 Au 14 23u --8 1 PPT 1945 N 12 --8 - PST 1948 Ap 5 --8 1 PDT 1949 Ja 14 --8 - PST 1954 --8 CA P%sT 1961 --8 - PST 1976 --8 u P%sT 1996 --8 m P%sT 2001 --8 u P%sT 2002 F 20 --8 m P%sT 2010 --8 u P%sT R BB 1942 o - Ap 19 5u 1 D R BB 1942 o - Au 31 6u 0 S R BB 1943 o - May 2 5u 1 D @@ -3294,10 +1755,6 @@ R BB 1977 1978 - O Su>=1 2 0 S R BB 1978 1980 - Ap Su>=15 2 1 D R BB 1979 o - S 30 2 0 S R BB 1980 o - S 25 2 0 S -Z America/Barbados -3:58:29 - LMT 1911 Au 28 --4 BB A%sT 1944 --4 BB AST/-0330 1945 --4 BB A%sT R BZ 1918 1941 - O Sa>=1 24 0:30 -0530 R BZ 1919 1942 - F Sa>=8 24 0 CST R BZ 1942 o - Jun 27 24 1 CWT @@ -3309,8 +1766,6 @@ R BZ 1973 o - D 5 0 1 CDT R BZ 1974 o - F 9 0 0 CST R BZ 1982 o - D 18 0 1 CDT R BZ 1983 o - F 12 0 0 CST -Z America/Belize -5:52:48 - LMT 1912 Ap --6 BZ %s R Be 1917 o - Ap 5 24 1 - R Be 1917 o - S 30 24 0 - R Be 1918 o - Ap 13 24 1 - @@ -3327,19 +1782,11 @@ R Be 1948 1952 - May Su>=22 2 1 D R Be 1948 1952 - S Su>=1 2 0 S R Be 1956 o - May Su>=22 2 1 D R Be 1956 o - O lastSu 2 0 S -Z Atlantic/Bermuda -4:19:18 - LMT 1890 --4:19:18 Be BMT/BST 1930 Ja 1 2 --4 Be A%sT 1974 Ap 28 2 --4 C A%sT 1976 --4 u A%sT R CR 1979 1980 - F lastSu 0 1 D R CR 1979 1980 - Jun Su>=1 0 0 S R CR 1991 1992 - Ja Sa>=15 0 1 D R CR 1991 o - Jul 1 0 0 S R CR 1992 o - Mar 15 0 0 S -Z America/Costa_Rica -5:36:13 - LMT 1890 --5:36:13 - SJMT 1921 Ja 15 --6 CR C%sT R Q 1928 o - Jun 10 0 1 D R Q 1928 o - O 10 0 0 S R Q 1940 1942 - Jun Su>=1 0 1 D @@ -3379,25 +1826,14 @@ R Q 2011 o - N 13 0s 0 S R Q 2012 o - Ap 1 0s 1 D R Q 2012 ma - N Su>=1 0s 0 S R Q 2013 ma - Mar Su>=8 0s 1 D -Z America/Havana -5:29:28 - LMT 1890 --5:29:36 - HMT 1925 Jul 19 12 --5 Q C%sT R DO 1966 o - O 30 0 1 EDT R DO 1967 o - F 28 0 0 EST R DO 1969 1973 - O lastSu 0 0:30 -0430 R DO 1970 o - F 21 0 0 EST R DO 1971 o - Ja 20 0 0 EST R DO 1972 1974 - Ja 21 0 0 EST -Z America/Santo_Domingo -4:39:36 - LMT 1890 --4:40 - SDMT 1933 Ap 1 12 --5 DO %s 1974 O 27 --4 - AST 2000 O 29 2 --5 u E%sT 2000 D 3 1 --4 - AST R SV 1987 1988 - May Su>=1 0 1 D R SV 1987 1988 - S lastSu 0 0 S -Z America/El_Salvador -5:56:48 - LMT 1921 --6 SV C%sT R GT 1973 o - N 25 0 1 D R GT 1974 o - F 24 0 0 S R GT 1983 o - May 21 0 1 D @@ -3406,8 +1842,6 @@ R GT 1991 o - Mar 23 0 1 D R GT 1991 o - S 7 0 0 S R GT 2006 o - Ap 30 0 1 D R GT 2006 o - O 1 0 0 S -Z America/Guatemala -6:2:4 - LMT 1918 O 5 --6 GT C%sT R HT 1983 o - May 8 0 1 D R HT 1984 1987 - Ap lastSu 0 1 D R HT 1983 1987 - O lastSu 0 0 S @@ -3419,57 +1853,16 @@ R HT 2012 2015 - Mar Su>=8 2 1 D R HT 2012 2015 - N Su>=1 2 0 S R HT 2017 ma - Mar Su>=8 2 1 D R HT 2017 ma - N Su>=1 2 0 S -Z America/Port-au-Prince -4:49:20 - LMT 1890 --4:49 - PPMT 1917 Ja 24 12 --5 HT E%sT R HN 1987 1988 - May Su>=1 0 1 D R HN 1987 1988 - S lastSu 0 0 S R HN 2006 o - May Su>=1 0 1 D R HN 2006 o - Au M>=1 0 0 S -Z America/Tegucigalpa -5:48:52 - LMT 1921 Ap --6 HN C%sT -Z America/Jamaica -5:7:10 - LMT 1890 --5:7:10 - KMT 1912 F --5 - EST 1974 --5 u E%sT 1984 --5 - EST -Z America/Martinique -4:4:20 - LMT 1890 --4:4:20 - FFMT 1911 May --4 - AST 1980 Ap 6 --4 1 ADT 1980 S 28 --4 - AST R NI 1979 1980 - Mar Su>=16 0 1 D R NI 1979 1980 - Jun M>=23 0 0 S R NI 2005 o - Ap 10 0 1 D R NI 2005 o - O Su>=1 0 0 S R NI 2006 o - Ap 30 2 1 D R NI 2006 o - O Su>=1 1 0 S -Z America/Managua -5:45:8 - LMT 1890 --5:45:12 - MMT 1934 Jun 23 --6 - CST 1973 May --5 - EST 1975 F 16 --6 NI C%sT 1992 Ja 1 4 --5 - EST 1992 S 24 --6 - CST 1993 --5 - EST 1997 --6 NI C%sT -Z America/Panama -5:18:8 - LMT 1890 --5:19:36 - CMT 1908 Ap 22 --5 - EST -Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 --4 - AST 1942 May 3 --4 u A%sT 1946 --4 - AST -Z America/Miquelon -3:44:40 - LMT 1911 May 15 --4 - AST 1980 May --3 - -03 1987 --3 C -03/-02 -Z America/Grand_Turk -4:44:32 - LMT 1890 --5:7:10 - KMT 1912 F --5 - EST 1979 --5 u E%sT 2015 Mar 8 2 --4 - AST 2018 Mar 11 3 --5 u E%sT R A 1930 o - D 1 0 1 - R A 1931 o - Ap 1 0 0 - R A 1931 o - O 15 0 1 - @@ -3499,150 +1892,8 @@ R A 2000 o - Mar 3 0 0 - R A 2007 o - D 30 0 1 - R A 2008 2009 - Mar Su>=15 0 0 - R A 2008 o - O Su>=15 0 1 - -Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 -Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 -Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 13 --3 A -03/-02 -Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 28 --4 1 -03 1991 Mar 17 --4 - -04 1991 O 6 --3 1 -02 1992 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 O 15 --4 1 -03 1992 Mar --4 - -04 1992 O 18 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 23 --4 - -04 2004 S 26 --3 A -03/-02 2008 O 18 --3 - -03 R Sa 2008 2009 - Mar Su>=8 0 0 - R Sa 2007 2008 - O Su>=8 0 1 - -Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 --3 1 -02 1990 Mar 14 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 Jun --3 - -03 1999 O 3 --4 1 -03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 Ja 21 --4 Sa -04/-03 2009 O 11 --3 - -03 -Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 30 --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/La_Paz -4:32:36 - LMT 1890 --4:32:36 - CMT 1931 O 15 --4:32:36 1 BST 1932 Mar 21 --4 - -04 R B 1931 o - O 3 11 1 - R B 1932 1933 - Ap 1 0 0 - R B 1932 o - O 3 0 1 - @@ -3700,90 +1951,6 @@ R B 2013 2014 - F Su>=15 0 0 - R B 2015 o - F Su>=22 0 0 - R B 2016 2019 - F Su>=15 0 0 - R B 2018 o - N Su>=1 0 1 - -Z America/Noronha -2:9:40 - LMT 1914 --2 B -02/-01 1990 S 17 --2 - -02 1999 S 30 --2 B -02/-01 2000 O 15 --2 - -02 2001 S 13 --2 B -02/-01 2002 O --2 - -02 -Z America/Belem -3:13:56 - LMT 1914 --3 B -03/-02 1988 S 12 --3 - -03 -Z America/Santarem -3:38:48 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 2008 Jun 24 --3 - -03 -Z America/Fortaleza -2:34 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Recife -2:19:36 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 15 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Araguaina -3:12:48 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 S 14 --3 B -03/-02 2003 S 24 --3 - -03 2012 O 21 --3 B -03/-02 2013 S --3 - -03 -Z America/Maceio -2:22:52 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 O 13 --3 B -03/-02 1996 S 4 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Bahia -2:34:4 - LMT 1914 --3 B -03/-02 2003 S 24 --3 - -03 2011 O 16 --3 B -03/-02 2012 O 21 --3 - -03 -Z America/Sao_Paulo -3:6:28 - LMT 1914 --3 B -03/-02 1963 O 23 --3 1 -02 1964 --3 B -03/-02 -Z America/Campo_Grande -3:38:28 - LMT 1914 --4 B -04/-03 -Z America/Cuiaba -3:44:20 - LMT 1914 --4 B -04/-03 2003 S 24 --4 - -04 2004 O --4 B -04/-03 -Z America/Porto_Velho -4:15:36 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 -Z America/Boa_Vista -4:2:40 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1999 S 30 --4 B -04/-03 2000 O 15 --4 - -04 -Z America/Manaus -4:0:4 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1993 S 28 --4 B -04/-03 1994 S 22 --4 - -04 -Z America/Eirunepe -4:39:28 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 1993 S 28 --5 B -05/-04 1994 S 22 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 -Z America/Rio_Branco -4:31:12 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 R x 1927 1931 - S 1 0 1 - R x 1928 1932 - Ap 1 0 0 - R x 1968 o - N 3 4u 1 - @@ -3820,56 +1987,10 @@ R x 2019 ma - Ap Su>=2 3u 0 - R x 2019 2021 - S Su>=2 4u 1 - R x 2022 o - S Su>=9 4u 1 - R x 2023 ma - S Su>=2 4u 1 - -Z America/Santiago -4:42:45 - LMT 1890 --4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul --4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul --4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Jul 14 24 --4 1 -03 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 -Z America/Punta_Arenas -4:43:40 - LMT 1890 --4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul --4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul --4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 2016 D 4 --3 - -03 -Z Pacific/Easter -7:17:28 - LMT 1890 --7:17:28 - EMT 1932 S --7 x -07/-06 1982 Mar 14 3u --6 x -06/-05 -Z Antarctica/Palmer 0 - -00 1965 --4 A -04/-03 1969 O 5 --3 A -03/-02 1982 May --4 x -04/-03 2016 D 4 --3 - -03 R CO 1992 o - May 3 0 1 - R CO 1993 o - F 6 24 0 - -Z America/Bogota -4:56:16 - LMT 1884 Mar 13 --4:56:16 - BMT 1914 N 23 --5 CO -05/-04 R EC 1992 o - N 28 0 1 - R EC 1993 o - F 5 0 0 - -Z America/Guayaquil -5:19:20 - LMT 1890 --5:14 - QMT 1931 --5 EC -05/-04 -Z Pacific/Galapagos -5:58:24 - LMT 1931 --5 - -05 1986 --6 EC -06/-05 R FK 1937 1938 - S lastSu 0 1 - R FK 1938 1942 - Mar Su>=19 0 0 - R FK 1939 o - O 1 0 1 - @@ -3882,20 +2003,6 @@ R FK 1985 2000 - S Su>=9 0 1 - R FK 1986 2000 - Ap Su>=16 0 0 - R FK 2001 2010 - Ap Su>=15 2 0 - R FK 2001 2010 - S Su>=1 2 1 - -Z Atlantic/Stanley -3:51:24 - LMT 1890 --3:51:24 - SMT 1912 Mar 12 --4 FK -04/-03 1983 May --3 FK -03/-02 1985 S 15 --4 FK -04/-03 2010 S 5 2 --3 - -03 -Z America/Cayenne -3:29:20 - LMT 1911 Jul --4 - -04 1967 O --3 - -03 -Z America/Guyana -3:52:39 - LMT 1911 Au --4 - -04 1915 Mar --3:45 - -0345 1975 Au --3 - -03 1992 Mar 29 1 --4 - -04 R y 1975 1988 - O 1 0 1 - R y 1975 1978 - Mar 1 0 0 - R y 1979 1991 - Ap 1 0 0 - @@ -3918,11 +2025,6 @@ R y 2005 2009 - Mar Su>=8 0 0 - R y 2010 ma - O Su>=1 0 1 - R y 2010 2012 - Ap Su>=8 0 0 - R y 2013 ma - Mar Su>=22 0 0 - -Z America/Asuncion -3:50:40 - LMT 1890 --3:50:40 - AMT 1931 O 10 --4 - -04 1972 O --3 - -03 1974 Ap --4 y -04/-03 R PE 1938 o - Ja 1 0 1 - R PE 1938 o - Ap 1 0 0 - R PE 1938 1939 - S lastSu 0 1 - @@ -3933,16 +2035,6 @@ R PE 1990 o - Ja 1 0 1 - R PE 1990 o - Ap 1 0 0 - R PE 1994 o - Ja 1 0 1 - R PE 1994 o - Ap 1 0 0 - -Z America/Lima -5:8:12 - LMT 1890 --5:8:36 - LMT 1908 Jul 28 --5 PE -05/-04 -Z Atlantic/South_Georgia -2:26:8 - LMT 1890 --2 - -02 -Z America/Paramaribo -3:40:40 - LMT 1911 --3:40:52 - PMT 1935 --3:40:36 - PMT 1945 O --3:30 - -0330 1984 O --3 - -03 R U 1923 1925 - O 1 0 0:30 - R U 1924 1926 - Ap 1 0 0 - R U 1933 1938 - O lastSu 0 0:30 - @@ -3991,53 +2083,1971 @@ R U 2005 o - Mar 27 2 0 - R U 2005 o - O 9 2 1 - R U 2006 2015 - Mar Su>=8 2 0 - R U 2006 2014 - O Su>=1 2 1 - -Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 --3:44:51 - MMT 1920 May --4 - -04 1923 O --3:30 U -0330/-03 1942 D 14 --3 U -03/-0230 1960 --3 U -03/-02 1968 --3 U -03/-0230 1970 --3 U -03/-02 1974 --3 U -03/-0130 1974 Mar 10 --3 U -03/-0230 1974 D 22 --3 U -03/-02 -Z America/Caracas -4:27:44 - LMT 1890 --4:27:40 - CMT 1912 F 12 --4:30 - -0430 1965 --4 - -04 2007 D 9 3 --4:30 - -0430 2016 May 1 2:30 --4 - -04 -Z Etc/UTC 0 - UTC -Z Etc/GMT 0 - GMT -L Etc/GMT GMT -Z Etc/GMT-14 14 - +14 -Z Etc/GMT-13 13 - +13 -Z Etc/GMT-12 12 - +12 -Z Etc/GMT-11 11 - +11 -Z Etc/GMT-10 10 - +10 -Z Etc/GMT-9 9 - +09 -Z Etc/GMT-8 8 - +08 -Z Etc/GMT-7 7 - +07 -Z Etc/GMT-6 6 - +06 -Z Etc/GMT-5 5 - +05 -Z Etc/GMT-4 4 - +04 -Z Etc/GMT-3 3 - +03 -Z Etc/GMT-2 2 - +02 -Z Etc/GMT-1 1 - +01 -Z Etc/GMT+1 -1 - -01 -Z Etc/GMT+2 -2 - -02 -Z Etc/GMT+3 -3 - -03 -Z Etc/GMT+4 -4 - -04 -Z Etc/GMT+5 -5 - -05 -Z Etc/GMT+6 -6 - -06 -Z Etc/GMT+7 -7 - -07 -Z Etc/GMT+8 -8 - -08 -Z Etc/GMT+9 -9 - -09 -Z Etc/GMT+10 -10 - -10 -Z Etc/GMT+11 -11 - -11 -Z Etc/GMT+12 -12 - -12 -Z Factory 0 - -00 +Z Africa/Abidjan -0:16:8 - LMT 1912 +0 - GMT +Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 +0:9:21 - PMT 1911 Mar 11 +0 d WE%sT 1940 F 25 2 +1 d CE%sT 1946 O 7 +0 - WET 1956 Ja 29 +1 - CET 1963 Ap 14 +0 d WE%sT 1977 O 21 +1 d CE%sT 1979 O 26 +0 d WE%sT 1981 May +1 - CET +Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u +-1 - -01 1975 +0 - GMT +Z Africa/Cairo 2:5:9 - LMT 1900 O +2 K EE%sT +Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 +0 M +00/+01 1984 Mar 16 +1 - +01 1986 +0 M +00/+01 2018 O 28 3 +1 M +01/+00 +Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u +0 - WET 1918 May 6 23 +0 1 WEST 1918 O 7 23 +0 - WET 1924 +0 s WE%sT 1929 +0 - WET 1967 +0 Sp WE%sT 1984 Mar 16 +1 - CET 1986 +1 E CE%sT +Z Africa/El_Aaiun -0:52:48 - LMT 1934 +-1 - -01 1976 Ap 14 +0 M +00/+01 2018 O 28 3 +1 M +01/+00 +Z Africa/Johannesburg 1:52 - LMT 1892 F 8 +1:30 - SAST 1903 Mar +2 SA SAST +Z Africa/Juba 2:6:28 - LMT 1931 +2 SD CA%sT 2000 Ja 15 12 +3 - EAT 2021 F +2 - CAT +Z Africa/Khartoum 2:10:8 - LMT 1931 +2 SD CA%sT 2000 Ja 15 12 +3 - EAT 2017 N +2 - CAT +Z Africa/Lagos 0:13:35 - LMT 1905 Jul +0 - GMT 1908 Jul +0:13:35 - LMT 1914 +0:30 - +0030 1919 S +1 - WAT +Z Africa/Maputo 2:10:20 - LMT 1903 Mar +2 - CAT +Z Africa/Monrovia -0:43:8 - LMT 1882 +-0:43:8 - MMT 1919 Mar +-0:44:30 - MMT 1972 Ja 7 +0 - GMT +Z Africa/Nairobi 2:27:16 - LMT 1908 May +2:30 - +0230 1928 Jun 30 24 +3 - EAT 1930 Ja 4 24 +2:30 - +0230 1936 D 31 24 +2:45 - +0245 1942 Jul 31 24 +3 - EAT +Z Africa/Ndjamena 1:0:12 - LMT 1912 +1 - WAT 1979 O 14 +1 1 WAST 1980 Mar 8 +1 - WAT +Z Africa/Sao_Tome 0:26:56 - LMT 1884 +-0:36:45 - LMT 1912 Ja 1 0u +0 - GMT 2018 Ja 1 1 +1 - WAT 2019 Ja 1 2 +0 - GMT +Z Africa/Tripoli 0:52:44 - LMT 1920 +1 L CE%sT 1959 +2 - EET 1982 +1 L CE%sT 1990 May 4 +2 - EET 1996 S 30 +1 L CE%sT 1997 O 4 +2 - EET 2012 N 10 2 +1 L CE%sT 2013 O 25 2 +2 - EET +Z Africa/Tunis 0:40:44 - LMT 1881 May 12 +0:9:21 - PMT 1911 Mar 11 +1 n CE%sT +Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 +1:30 - +0130 1903 Mar +2 - SAST 1942 S 20 2 +2 1 SAST 1943 Mar 21 2 +2 - SAST 1990 Mar 21 +2 NA %s +Z America/Adak 12:13:22 - LMT 1867 O 19 12:44:35 +-11:46:38 - LMT 1900 Au 20 12 +-11 - NST 1942 +-11 u N%sT 1946 +-11 - NST 1967 Ap +-11 - BST 1969 +-11 u B%sT 1983 O 30 2 +-10 u AH%sT 1983 N 30 +-10 u H%sT +Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 +-9:59:36 - LMT 1900 Au 20 12 +-10 - AST 1942 +-10 u A%sT 1967 Ap +-10 - AHST 1969 +-10 u AH%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Araguaina -3:12:48 - LMT 1914 +-3 B -03/-02 1990 S 17 +-3 - -03 1995 S 14 +-3 B -03/-02 2003 S 24 +-3 - -03 2012 O 21 +-3 B -03/-02 2013 S +-3 - -03 +Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 A -03/-02 +Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar 3 +-4 - -04 1991 O 20 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 Jun +-4 - -04 2004 Jun 20 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar 3 +-4 - -04 1991 O 20 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 A -03/-02 +Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1990 Mar 4 +-4 - -04 1990 O 28 +-4 1 -03 1991 Mar 17 +-4 - -04 1991 O 6 +-3 1 -02 1992 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar +-4 - -04 1991 May 7 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 Jun +-4 - -04 2004 Jun 20 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1990 Mar 4 +-4 - -04 1990 O 15 +-4 1 -03 1991 Mar +-4 - -04 1991 O 15 +-4 1 -03 1992 Mar +-4 - -04 1992 O 18 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 May 23 +-4 - -04 2004 S 26 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 Jun +-4 - -04 2004 Jun 20 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar 3 +-4 - -04 1991 O 20 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar +-4 - -04 1991 May 7 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 May 31 +-4 - -04 2004 Jul 25 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1990 +-3 1 -02 1990 Mar 14 +-4 - -04 1990 O 15 +-4 1 -03 1991 Mar +-4 - -04 1991 Jun +-3 - -03 1999 O 3 +-4 1 -03 2000 Mar 3 +-3 - -03 2004 May 31 +-4 - -04 2004 Jul 25 +-3 A -03/-02 2008 Ja 21 +-4 Sa -04/-03 2009 O 11 +-3 - -03 +Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1991 Mar 3 +-4 - -04 1991 O 20 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 Jun +-4 - -04 2004 Jun 13 +-3 A -03/-02 +Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - -04 1930 D +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1999 O 3 +-4 A -04/-03 2000 Mar 3 +-3 - -03 2004 May 30 +-4 - -04 2004 Jun 20 +-3 A -03/-02 2008 O 18 +-3 - -03 +Z America/Asuncion -3:50:40 - LMT 1890 +-3:50:40 - AMT 1931 O 10 +-4 - -04 1972 O +-3 - -03 1974 Ap +-4 y -04/-03 +Z America/Bahia -2:34:4 - LMT 1914 +-3 B -03/-02 2003 S 24 +-3 - -03 2011 O 16 +-3 B -03/-02 2012 O 21 +-3 - -03 +Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1949 Ja 14 +-8 - PST 1970 +-7 m M%sT 2010 Ap 4 2 +-6 m C%sT +Z America/Barbados -3:58:29 - LMT 1911 Au 28 +-4 BB A%sT 1944 +-4 BB AST/-0330 1945 +-4 BB A%sT +Z America/Belem -3:13:56 - LMT 1914 +-3 B -03/-02 1988 S 12 +-3 - -03 +Z America/Belize -5:52:48 - LMT 1912 Ap +-6 BZ %s +Z America/Boa_Vista -4:2:40 - LMT 1914 +-4 B -04/-03 1988 S 12 +-4 - -04 1999 S 30 +-4 B -04/-03 2000 O 15 +-4 - -04 +Z America/Bogota -4:56:16 - LMT 1884 Mar 13 +-4:56:16 - BMT 1914 N 23 +-5 CO -05/-04 +Z America/Boise -7:44:49 - LMT 1883 N 18 20u +-8 u P%sT 1923 May 13 2 +-7 u M%sT 1974 +-7 - MST 1974 F 3 2 +-7 u M%sT +Z America/Cambridge_Bay 0 - -00 1920 +-7 Y M%sT 1999 O 31 2 +-6 C C%sT 2000 O 29 2 +-5 - EST 2000 N 5 +-6 - CST 2001 Ap 1 3 +-7 C M%sT +Z America/Campo_Grande -3:38:28 - LMT 1914 +-4 B -04/-03 +Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u +-6 - CST 1981 D 23 +-5 m E%sT 1998 Au 2 2 +-6 m C%sT 2015 F 1 2 +-5 - EST +Z America/Caracas -4:27:44 - LMT 1890 +-4:27:40 - CMT 1912 F 12 +-4:30 - -0430 1965 +-4 - -04 2007 D 9 3 +-4:30 - -0430 2016 May 1 2:30 +-4 - -04 +Z America/Cayenne -3:29:20 - LMT 1911 Jul +-4 - -04 1967 O +-3 - -03 +Z America/Chicago -5:50:36 - LMT 1883 N 18 18u +-6 u C%sT 1920 +-6 Ch C%sT 1936 Mar 1 2 +-5 - EST 1936 N 15 2 +-6 Ch C%sT 1942 +-6 u C%sT 1946 +-6 Ch C%sT 1967 +-6 u C%sT +Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2022 O 30 2 +-6 - CST +Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2010 +-7 u M%sT 2022 O 30 2 +-6 - CST 2022 N 30 +-7 u M%sT +Z America/Costa_Rica -5:36:13 - LMT 1890 +-5:36:13 - SJMT 1921 Ja 15 +-6 CR C%sT +Z America/Cuiaba -3:44:20 - LMT 1914 +-4 B -04/-03 2003 S 24 +-4 - -04 2004 O +-4 B -04/-03 +Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 +-3 - -03 1980 Ap 6 2 +-3 E -03/-02 1996 +0 - GMT +Z America/Dawson -9:17:40 - LMT 1900 Au 20 +-9 Y Y%sT 1965 +-9 Yu Y%sT 1973 O 28 +-8 - PST 1980 +-8 C P%sT 2020 N +-7 - MST +Z America/Dawson_Creek -8:0:56 - LMT 1884 +-8 C P%sT 1947 +-8 Va P%sT 1972 Au 30 2 +-7 - MST +Z America/Denver -6:59:56 - LMT 1883 N 18 19u +-7 u M%sT 1920 +-7 De M%sT 1942 +-7 u M%sT 1946 +-7 De M%sT 1967 +-7 u M%sT +Z America/Detroit -5:32:11 - LMT 1905 +-6 - CST 1915 May 15 2 +-5 - EST 1942 +-5 u E%sT 1946 +-5 Dt E%sT 1967 Jun 14 0:1 +-5 u E%sT 1969 +-5 - EST 1973 +-5 u E%sT 1975 +-5 - EST 1975 Ap 27 2 +-5 u E%sT +Z America/Edmonton -7:33:52 - LMT 1906 S +-7 Ed M%sT 1987 +-7 C M%sT +Z America/Eirunepe -4:39:28 - LMT 1914 +-5 B -05/-04 1988 S 12 +-5 - -05 1993 S 28 +-5 B -05/-04 1994 S 22 +-5 - -05 2008 Jun 24 +-4 - -04 2013 N 10 +-5 - -05 +Z America/El_Salvador -5:56:48 - LMT 1921 +-6 SV C%sT +Z America/Fort_Nelson -8:10:47 - LMT 1884 +-8 Va P%sT 1946 +-8 - PST 1947 +-8 Va P%sT 1987 +-8 C P%sT 2015 Mar 8 2 +-7 - MST +Z America/Fortaleza -2:34 - LMT 1914 +-3 B -03/-02 1990 S 17 +-3 - -03 1999 S 30 +-3 B -03/-02 2000 O 22 +-3 - -03 2001 S 13 +-3 B -03/-02 2002 O +-3 - -03 +Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 +-4 C A%sT 1953 +-4 H A%sT 1954 +-4 - AST 1972 +-4 H A%sT 1974 +-4 C A%sT +Z America/Goose_Bay -4:1:40 - LMT 1884 +-3:30:52 - NST 1918 +-3:30:52 C N%sT 1919 +-3:30:52 - NST 1935 Mar 30 +-3:30 - NST 1936 +-3:30 j N%sT 1942 May 11 +-3:30 C N%sT 1946 +-3:30 j N%sT 1966 Mar 15 2 +-4 j A%sT 2011 N +-4 C A%sT +Z America/Grand_Turk -4:44:32 - LMT 1890 +-5:7:10 - KMT 1912 F +-5 - EST 1979 +-5 u E%sT 2015 Mar 8 2 +-4 - AST 2018 Mar 11 3 +-5 u E%sT +Z America/Guatemala -6:2:4 - LMT 1918 O 5 +-6 GT C%sT +Z America/Guayaquil -5:19:20 - LMT 1890 +-5:14 - QMT 1931 +-5 EC -05/-04 +Z America/Guyana -3:52:39 - LMT 1911 Au +-4 - -04 1915 Mar +-3:45 - -0345 1975 Au +-3 - -03 1992 Mar 29 1 +-4 - -04 +Z America/Halifax -4:14:24 - LMT 1902 Jun 15 +-4 H A%sT 1918 +-4 C A%sT 1919 +-4 H A%sT 1942 F 9 2s +-4 C A%sT 1946 +-4 H A%sT 1974 +-4 C A%sT +Z America/Havana -5:29:28 - LMT 1890 +-5:29:36 - HMT 1925 Jul 19 12 +-5 Q C%sT +Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1949 Ja 14 +-8 - PST 1970 +-7 m M%sT 1999 +-7 - MST +Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u +-6 u C%sT 1920 +-6 In C%sT 1942 +-6 u C%sT 1946 +-6 In C%sT 1955 Ap 24 2 +-5 - EST 1957 S 29 2 +-6 - CST 1958 Ap 27 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Knox -5:46:30 - LMT 1883 N 18 18u +-6 u C%sT 1947 +-6 St C%sT 1962 Ap 29 2 +-5 - EST 1963 O 27 2 +-6 u C%sT 1991 O 27 2 +-5 - EST 2006 Ap 2 2 +-6 u C%sT +Z America/Indiana/Marengo -5:45:23 - LMT 1883 N 18 18u +-6 u C%sT 1951 +-6 Ma C%sT 1961 Ap 30 2 +-5 - EST 1969 +-5 u E%sT 1974 Ja 6 2 +-6 1 CDT 1974 O 27 2 +-5 u E%sT 1976 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Petersburg -5:49:7 - LMT 1883 N 18 18u +-6 u C%sT 1955 +-6 Pi C%sT 1965 Ap 25 2 +-5 - EST 1966 O 30 2 +-6 u C%sT 1977 O 30 2 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 N 4 2 +-5 u E%sT +Z America/Indiana/Tell_City -5:47:3 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 Pe C%sT 1964 Ap 26 2 +-5 - EST 1967 O 29 2 +-6 u C%sT 1969 Ap 27 2 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT +Z America/Indiana/Vevay -5:40:16 - LMT 1883 N 18 18u +-6 u C%sT 1954 Ap 25 2 +-5 - EST 1969 +-5 u E%sT 1973 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Vincennes -5:50:7 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 V C%sT 1964 Ap 26 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 N 4 2 +-5 u E%sT +Z America/Indiana/Winamac -5:46:25 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 Pu C%sT 1961 Ap 30 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 Mar 11 2 +-5 u E%sT +Z America/Inuvik 0 - -00 1953 +-8 Y P%sT 1979 Ap lastSu 2 +-7 Y M%sT 1980 +-7 C M%sT +Z America/Iqaluit 0 - -00 1942 Au +-5 Y E%sT 1999 O 31 2 +-6 C C%sT 2000 O 29 2 +-5 C E%sT +Z America/Jamaica -5:7:10 - LMT 1890 +-5:7:10 - KMT 1912 F +-5 - EST 1974 +-5 u E%sT 1984 +-5 - EST +Z America/Juneau 15:2:19 - LMT 1867 O 19 15:33:32 +-8:57:41 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1980 Ap 27 2 +-9 u Y%sT 1980 O 26 2 +-8 u P%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Kentucky/Louisville -5:43:2 - LMT 1883 N 18 18u +-6 u C%sT 1921 +-6 v C%sT 1942 +-6 u C%sT 1946 +-6 v C%sT 1961 Jul 23 2 +-5 - EST 1968 +-5 u E%sT 1974 Ja 6 2 +-6 1 CDT 1974 O 27 2 +-5 u E%sT +Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 - CST 1968 +-6 u C%sT 2000 O 29 2 +-5 u E%sT +Z America/La_Paz -4:32:36 - LMT 1890 +-4:32:36 - CMT 1931 O 15 +-4:32:36 1 BST 1932 Mar 21 +-4 - -04 +Z America/Lima -5:8:12 - LMT 1890 +-5:8:36 - LMT 1908 Jul 28 +-5 PE -05/-04 +Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u +-8 u P%sT 1946 +-8 CA P%sT 1967 +-8 u P%sT +Z America/Maceio -2:22:52 - LMT 1914 +-3 B -03/-02 1990 S 17 +-3 - -03 1995 O 13 +-3 B -03/-02 1996 S 4 +-3 - -03 1999 S 30 +-3 B -03/-02 2000 O 22 +-3 - -03 2001 S 13 +-3 B -03/-02 2002 O +-3 - -03 +Z America/Managua -5:45:8 - LMT 1890 +-5:45:12 - MMT 1934 Jun 23 +-6 - CST 1973 May +-5 - EST 1975 F 16 +-6 NI C%sT 1992 Ja 1 4 +-5 - EST 1992 S 24 +-6 - CST 1993 +-5 - EST 1997 +-6 NI C%sT +Z America/Manaus -4:0:4 - LMT 1914 +-4 B -04/-03 1988 S 12 +-4 - -04 1993 S 28 +-4 B -04/-03 1994 S 22 +-4 - -04 +Z America/Martinique -4:4:20 - LMT 1890 +-4:4:20 - FFMT 1911 May +-4 - AST 1980 Ap 6 +-4 1 ADT 1980 S 28 +-4 - AST +Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u +-6 - CST 1988 +-6 u C%sT 1989 +-6 m C%sT 2010 +-6 u C%sT +Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1949 Ja 14 +-8 - PST 1970 +-7 m M%sT +Z America/Menominee -5:50:27 - LMT 1885 S 18 12 +-6 u C%sT 1946 +-6 Me C%sT 1969 Ap 27 2 +-5 - EST 1973 Ap 29 2 +-6 u C%sT +Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u +-6 - CST 1981 D 23 +-5 - EST 1982 D 2 +-6 m C%sT +Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 +-8:46:18 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1983 O 30 2 +-8 - PST 2015 N 1 2 +-9 u AK%sT 2018 N 4 2 +-8 - PST 2019 Ja 20 2 +-9 u AK%sT +Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 m C%sT 2001 S 30 2 +-6 - CST 2002 F 20 +-6 m C%sT +Z America/Miquelon -3:44:40 - LMT 1911 Jun 15 +-4 - AST 1980 May +-3 - -03 1987 +-3 C -03/-02 +Z America/Moncton -4:19:8 - LMT 1883 D 9 +-5 - EST 1902 Jun 15 +-4 C A%sT 1933 +-4 o A%sT 1942 +-4 C A%sT 1946 +-4 o A%sT 1973 +-4 C A%sT 1993 +-4 o A%sT 2007 +-4 C A%sT +Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u +-6 - CST 1988 +-6 u C%sT 1989 +-6 m C%sT +Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 +-3:44:51 - MMT 1920 May +-4 - -04 1923 O +-3:30 U -0330/-03 1942 D 14 +-3 U -03/-0230 1960 +-3 U -03/-02 1968 +-3 U -03/-0230 1970 +-3 U -03/-02 1974 +-3 U -03/-0130 1974 Mar 10 +-3 U -03/-0230 1974 D 22 +-3 U -03/-02 +Z America/New_York -4:56:2 - LMT 1883 N 18 17u +-5 u E%sT 1920 +-5 NY E%sT 1942 +-5 u E%sT 1946 +-5 NY E%sT 1967 +-5 u E%sT +Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 +-11:1:38 - LMT 1900 Au 20 12 +-11 - NST 1942 +-11 u N%sT 1946 +-11 - NST 1967 Ap +-11 - BST 1969 +-11 u B%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Noronha -2:9:40 - LMT 1914 +-2 B -02/-01 1990 S 17 +-2 - -02 1999 S 30 +-2 B -02/-01 2000 O 15 +-2 - -02 2001 S 13 +-2 B -02/-01 2002 O +-2 - -02 +Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u +-7 u M%sT 2010 N 7 2 +-6 u C%sT +Z America/North_Dakota/Center -6:45:12 - LMT 1883 N 18 19u +-7 u M%sT 1992 O 25 2 +-6 u C%sT +Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u +-7 u M%sT 2003 O 26 2 +-6 u C%sT +Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 +-3 - -03 1980 Ap 6 2 +-3 E -03/-02 2023 Mar 26 1u +-2 - -02 2023 O 29 1u +-2 E -02/-01 +Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 23 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2010 +-7 u M%sT 2022 O 30 2 +-6 - CST 2022 N 30 +-6 u C%sT +Z America/Panama -5:18:8 - LMT 1890 +-5:19:36 - CMT 1908 Ap 22 +-5 - EST +Z America/Paramaribo -3:40:40 - LMT 1911 +-3:40:52 - PMT 1935 +-3:40:36 - PMT 1945 O +-3:30 - -0330 1984 O +-3 - -03 +Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u +-7 u M%sT 1944 Ja 1 0:1 +-7 - MST 1944 Ap 1 0:1 +-7 u M%sT 1944 O 1 0:1 +-7 - MST 1967 +-7 u M%sT 1968 Mar 21 +-7 - MST +Z America/Port-au-Prince -4:49:20 - LMT 1890 +-4:49 - PPMT 1917 Ja 24 12 +-5 HT E%sT +Z America/Porto_Velho -4:15:36 - LMT 1914 +-4 B -04/-03 1988 S 12 +-4 - -04 +Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 +-4 - AST 1942 May 3 +-4 u A%sT 1946 +-4 - AST +Z America/Punta_Arenas -4:43:40 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 +-5 - -05 1916 Jul +-4:42:45 - SMT 1918 S 10 +-4 - -04 1919 Jul +-4:42:45 - SMT 1927 S +-5 x -05/-04 1932 S +-4 - -04 1942 Jun +-5 - -05 1942 Au +-4 - -04 1946 Au 28 24 +-5 1 -04 1947 Mar 31 24 +-5 - -05 1947 May 21 23 +-4 x -04/-03 2016 D 4 +-3 - -03 +Z America/Rankin_Inlet 0 - -00 1957 +-6 Y C%sT 2000 O 29 2 +-5 - EST 2001 Ap 1 3 +-6 C C%sT +Z America/Recife -2:19:36 - LMT 1914 +-3 B -03/-02 1990 S 17 +-3 - -03 1999 S 30 +-3 B -03/-02 2000 O 15 +-3 - -03 2001 S 13 +-3 B -03/-02 2002 O +-3 - -03 +Z America/Regina -6:58:36 - LMT 1905 S +-7 r M%sT 1960 Ap lastSu 2 +-6 - CST +Z America/Resolute 0 - -00 1947 Au 31 +-6 Y C%sT 2000 O 29 2 +-5 - EST 2001 Ap 1 3 +-6 C C%sT 2006 O 29 2 +-5 - EST 2007 Mar 11 3 +-6 C C%sT +Z America/Rio_Branco -4:31:12 - LMT 1914 +-5 B -05/-04 1988 S 12 +-5 - -05 2008 Jun 24 +-4 - -04 2013 N 10 +-5 - -05 +Z America/Santarem -3:38:48 - LMT 1914 +-4 B -04/-03 1988 S 12 +-4 - -04 2008 Jun 24 +-3 - -03 +Z America/Santiago -4:42:45 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 +-5 - -05 1916 Jul +-4:42:45 - SMT 1918 S 10 +-4 - -04 1919 Jul +-4:42:45 - SMT 1927 S +-5 x -05/-04 1932 S +-4 - -04 1942 Jun +-5 - -05 1942 Au +-4 - -04 1946 Jul 14 24 +-4 1 -03 1946 Au 28 24 +-5 1 -04 1947 Mar 31 24 +-5 - -05 1947 May 21 23 +-4 x -04/-03 +Z America/Santo_Domingo -4:39:36 - LMT 1890 +-4:40 - SDMT 1933 Ap 1 12 +-5 DO %s 1974 O 27 +-4 - AST 2000 O 29 2 +-5 u E%sT 2000 D 3 1 +-4 - AST +Z America/Sao_Paulo -3:6:28 - LMT 1914 +-3 B -03/-02 1963 O 23 +-3 1 -02 1964 +-3 B -03/-02 +Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 +-2 - -02 1980 Ap 6 2 +-2 c -02/-01 1981 Mar 29 +-1 E -01/+00 2024 Mar 31 +-2 E -02/-01 +Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 +-9:1:13 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/St_Johns -3:30:52 - LMT 1884 +-3:30:52 j N%sT 1918 +-3:30:52 C N%sT 1919 +-3:30:52 j N%sT 1935 Mar 30 +-3:30 j N%sT 1942 May 11 +-3:30 C N%sT 1946 +-3:30 j N%sT 2011 N +-3:30 C N%sT +Z America/Swift_Current -7:11:20 - LMT 1905 S +-7 C M%sT 1946 Ap lastSu 2 +-7 r M%sT 1950 +-7 Sw M%sT 1972 Ap lastSu 2 +-6 - CST +Z America/Tegucigalpa -5:48:52 - LMT 1921 Ap +-6 HN C%sT +Z America/Thule -4:35:8 - LMT 1916 Jul 28 +-4 Th A%sT +Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u +-7 - MST 1924 +-8 - PST 1927 Jun 10 23 +-7 - MST 1930 N 15 +-8 - PST 1931 Ap +-8 1 PDT 1931 S 30 +-8 - PST 1942 Ap 24 +-8 1 PWT 1945 Au 14 23u +-8 1 PPT 1945 N 12 +-8 - PST 1948 Ap 5 +-8 1 PDT 1949 Ja 14 +-8 - PST 1954 +-8 CA P%sT 1961 +-8 - PST 1976 +-8 u P%sT 1996 +-8 m P%sT 2001 +-8 u P%sT 2002 F 20 +-8 m P%sT 2010 +-8 u P%sT +Z America/Toronto -5:17:32 - LMT 1895 +-5 C E%sT 1919 +-5 t E%sT 1942 F 9 2s +-5 C E%sT 1946 +-5 t E%sT 1974 +-5 C E%sT +Z America/Vancouver -8:12:28 - LMT 1884 +-8 Va P%sT 1987 +-8 C P%sT +Z America/Whitehorse -9:0:12 - LMT 1900 Au 20 +-9 Y Y%sT 1965 +-9 Yu Y%sT 1966 F 27 +-8 - PST 1980 +-8 C P%sT 2020 N +-7 - MST +Z America/Winnipeg -6:28:36 - LMT 1887 Jul 16 +-6 W C%sT 2006 +-6 C C%sT +Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 +-9:18:55 - LMT 1900 Au 20 12 +-9 - YST 1942 +-9 u Y%sT 1946 +-9 - YST 1969 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z Antarctica/Casey 0 - -00 1969 +8 - +08 2009 O 18 2 +11 - +11 2010 Mar 5 2 +8 - +08 2011 O 28 2 +11 - +11 2012 F 21 17u +8 - +08 2016 O 22 +11 - +11 2018 Mar 11 4 +8 - +08 2018 O 7 4 +11 - +11 2019 Mar 17 3 +8 - +08 2019 O 4 3 +11 - +11 2020 Mar 8 3 +8 - +08 2020 O 4 0:1 +11 - +11 2021 Mar 14 +8 - +08 2021 O 3 0:1 +11 - +11 2022 Mar 13 +8 - +08 2022 O 2 0:1 +11 - +11 2023 Mar 9 3 +8 - +08 +Z Antarctica/Davis 0 - -00 1957 Ja 13 +7 - +07 1964 N +0 - -00 1969 F +7 - +07 2009 O 18 2 +5 - +05 2010 Mar 10 20u +7 - +07 2011 O 28 2 +5 - +05 2012 F 21 20u +7 - +07 +Z Antarctica/Macquarie 0 - -00 1899 N +10 - AEST 1916 O 1 2 +10 1 AEDT 1917 F +10 AU AE%sT 1919 Ap 1 0s +0 - -00 1948 Mar 25 +10 AU AE%sT 1967 +10 AT AE%sT 2010 +10 1 AEDT 2011 +10 AT AE%sT +Z Antarctica/Mawson 0 - -00 1954 F 13 +6 - +06 2009 O 18 2 +5 - +05 +Z Antarctica/Palmer 0 - -00 1965 +-4 A -04/-03 1969 O 5 +-3 A -03/-02 1982 May +-4 x -04/-03 2016 D 4 +-3 - -03 +Z Antarctica/Rothera 0 - -00 1976 D +-3 - -03 +Z Antarctica/Troll 0 - -00 2005 F 12 +0 Tr %s +Z Antarctica/Vostok 0 - -00 1957 D 16 +7 - +07 1994 F +0 - -00 1994 N +7 - +07 2023 D 18 2 +5 - +05 +Z Asia/Almaty 5:7:48 - LMT 1924 May 2 +5 - +05 1930 Jun 21 +6 R +06/+07 1991 Mar 31 2s +5 R +05/+06 1992 Ja 19 2s +6 R +06/+07 2004 O 31 2s +6 - +06 2024 Mar +5 - +05 +Z Asia/Amman 2:23:44 - LMT 1931 +2 J EE%sT 2022 O 28 0s +3 - +03 +Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 +12 - +12 1930 Jun 21 +13 R +13/+14 1982 Ap 1 0s +12 R +12/+13 1991 Mar 31 2s +11 R +11/+12 1992 Ja 19 2s +12 R +12/+13 2010 Mar 28 2s +11 R +11/+12 2011 Mar 27 2s +12 - +12 +Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 - +05 1981 O +6 - +06 1982 Ap +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 1994 S 25 2s +4 R +04/+05 2004 O 31 2s +5 - +05 +Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 - +05 1981 Ap +5 1 +06 1981 O +6 - +06 1982 Ap +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 2004 O 31 2s +5 - +05 +Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 R +05/+06 1991 Mar 31 2 +4 R +04/+05 1992 Ja 19 2 +5 - +05 +Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 +3 - +03 1930 Jun 21 +5 - +05 1981 O +6 - +06 1982 Ap +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 1999 Mar 28 2s +4 R +04/+05 2004 O 31 2s +5 - +05 +Z Asia/Baghdad 2:57:40 - LMT 1890 +2:57:36 - BMT 1918 +3 - +03 1982 May +3 IQ +03/+04 +Z Asia/Baku 3:19:24 - LMT 1924 May 2 +3 - +03 1957 Mar +4 R +04/+05 1991 Mar 31 2s +3 R +03/+04 1992 S lastSu 2s +4 - +04 1996 +4 E +04/+05 1997 +4 AZ +04/+05 +Z Asia/Bangkok 6:42:4 - LMT 1880 +6:42:4 - BMT 1920 Ap +7 - +07 +Z Asia/Barnaul 5:35 - LMT 1919 D 10 +6 - +06 1930 Jun 21 +7 R +07/+08 1991 Mar 31 2s +6 R +06/+07 1992 Ja 19 2s +7 R +07/+08 1995 May 28 +6 R +06/+07 2011 Mar 27 2s +7 - +07 2014 O 26 2s +6 - +06 2016 Mar 27 2s +7 - +07 +Z Asia/Beirut 2:22 - LMT 1880 +2 l EE%sT +Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 +5 - +05 1930 Jun 21 +6 R +06/+07 1991 Mar 31 2s +5 R +05/+06 1991 Au 31 2 +5 KG +05/+06 2005 Au 12 +6 - +06 +Z Asia/Chita 7:33:52 - LMT 1919 D 15 +8 - +08 1930 Jun 21 +9 R +09/+10 1991 Mar 31 2s +8 R +08/+09 1992 Ja 19 2s +9 R +09/+10 2011 Mar 27 2s +10 - +10 2014 O 26 2s +8 - +08 2016 Mar 27 2 +9 - +09 +Z Asia/Choibalsan 7:38 - LMT 1905 Au +7 - +07 1978 +8 - +08 1983 Ap +9 X +09/+10 2008 Mar 31 +8 X +08/+09 +Z Asia/Colombo 5:19:24 - LMT 1880 +5:19:32 - MMT 1906 +5:30 - +0530 1942 Ja 5 +5:30 0:30 +06 1942 S +5:30 1 +0630 1945 O 16 2 +5:30 - +0530 1996 May 25 +6:30 - +0630 1996 O 26 0:30 +6 - +06 2006 Ap 15 0:30 +5:30 - +0530 +Z Asia/Damascus 2:25:12 - LMT 1920 +2 S EE%sT 2022 O 28 +3 - +03 +Z Asia/Dhaka 6:1:40 - LMT 1890 +5:53:20 - HMT 1941 O +6:30 - +0630 1942 May 15 +5:30 - +0530 1942 S +6:30 - +0630 1951 S 30 +6 - +06 2009 +6 BD +06/+07 +Z Asia/Dili 8:22:20 - LMT 1912 +8 - +08 1942 F 21 23 +9 - +09 1976 May 3 +8 - +08 2000 S 17 +9 - +09 +Z Asia/Dubai 3:41:12 - LMT 1920 +4 - +04 +Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 +5 - +05 1930 Jun 21 +6 R +06/+07 1991 Mar 31 2s +5 1 +06 1991 S 9 2s +5 - +05 +Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 +2 CY EE%sT 1998 S +2 E EE%sT 2016 S 8 +3 - +03 2017 O 29 1u +2 E EE%sT +Z Asia/Gaza 2:17:52 - LMT 1900 O +2 Z EET/EEST 1948 May 15 +2 K EE%sT 1967 Jun 5 +2 Z I%sT 1996 +2 J EE%sT 1999 +2 P EE%sT 2008 Au 29 +2 - EET 2008 S +2 P EE%sT 2010 +2 - EET 2010 Mar 27 0:1 +2 P EE%sT 2011 Au +2 - EET 2012 +2 P EE%sT +Z Asia/Hebron 2:20:23 - LMT 1900 O +2 Z EET/EEST 1948 May 15 +2 K EE%sT 1967 Jun 5 +2 Z I%sT 1996 +2 J EE%sT 1999 +2 P EE%sT +Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul +7:6:30 - PLMT 1911 May +7 - +07 1942 D 31 23 +8 - +08 1945 Mar 14 23 +9 - +09 1945 S 1 24 +7 - +07 1947 Ap +8 - +08 1955 Jul 1 1 +7 - +07 1959 D 31 23 +8 - +08 1975 Jun 13 +7 - +07 +Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u +8 - HKT 1941 Jun 15 3 +8 1 HKST 1941 O 1 4 +8 0:30 HKWT 1941 D 25 +9 - JST 1945 N 18 2 +8 HK HK%sT +Z Asia/Hovd 6:6:36 - LMT 1905 Au +6 - +06 1978 +7 X +07/+08 +Z Asia/Irkutsk 6:57:5 - LMT 1880 +6:57:5 - IMT 1920 Ja 25 +7 - +07 1930 Jun 21 +8 R +08/+09 1991 Mar 31 2s +7 R +07/+08 1992 Ja 19 2s +8 R +08/+09 2011 Mar 27 2s +9 - +09 2014 O 26 2s +8 - +08 +Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 +7:7:12 - BMT 1923 D 31 16:40u +7:20 - +0720 1932 N +7:30 - +0730 1942 Mar 23 +9 - +09 1945 S 23 +7:30 - +0730 1948 May +8 - +08 1950 May +7:30 - +0730 1964 +7 - WIB +Z Asia/Jayapura 9:22:48 - LMT 1932 N +9 - +09 1944 S +9:30 - +0930 1964 +9 - WIT +Z Asia/Jerusalem 2:20:54 - LMT 1880 +2:20:40 - JMT 1918 +2 Z I%sT +Z Asia/Kabul 4:36:48 - LMT 1890 +4 - +04 1945 +4:30 - +0430 +Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 +11 - +11 1930 Jun 21 +12 R +12/+13 1991 Mar 31 2s +11 R +11/+12 1992 Ja 19 2s +12 R +12/+13 2010 Mar 28 2s +11 R +11/+12 2011 Mar 27 2s +12 - +12 +Z Asia/Karachi 4:28:12 - LMT 1907 +5:30 - +0530 1942 S +5:30 1 +0630 1945 O 15 +5:30 - +0530 1951 S 30 +5 - +05 1971 Mar 26 +5 PK PK%sT +Z Asia/Kathmandu 5:41:16 - LMT 1920 +5:30 - +0530 1986 +5:45 - +0545 +Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 +8 - +08 1930 Jun 21 +9 R +09/+10 1991 Mar 31 2s +8 R +08/+09 1992 Ja 19 2s +9 R +09/+10 2004 +10 R +10/+11 2011 Mar 27 2s +11 - +11 2011 S 13 0s +10 - +10 2014 O 26 2s +9 - +09 +Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 +5:53:20 - HMT 1870 +5:21:10 - MMT 1906 +5:30 - IST 1941 O +5:30 1 +0630 1942 May 15 +5:30 - IST 1942 S +5:30 1 +0630 1945 O 15 +5:30 - IST +Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 +6 - +06 1930 Jun 21 +7 R +07/+08 1991 Mar 31 2s +6 R +06/+07 1992 Ja 19 2s +7 R +07/+08 2011 Mar 27 2s +8 - +08 2014 O 26 2s +7 - +07 +Z Asia/Kuching 7:21:20 - LMT 1926 Mar +7:30 - +0730 1933 +8 NB +08/+0820 1942 F 16 +9 - +09 1945 S 12 +8 - +08 +Z Asia/Macau 7:34:10 - LMT 1904 O 30 +8 - CST 1941 D 21 23 +9 _ +09/+10 1945 S 30 24 +8 _ C%sT +Z Asia/Magadan 10:3:12 - LMT 1924 May 2 +10 - +10 1930 Jun 21 +11 R +11/+12 1991 Mar 31 2s +10 R +10/+11 1992 Ja 19 2s +11 R +11/+12 2011 Mar 27 2s +12 - +12 2014 O 26 2s +10 - +10 2016 Ap 24 2s +11 - +11 +Z Asia/Makassar 7:57:36 - LMT 1920 +7:57:36 - MMT 1932 N +8 - +08 1942 F 9 +9 - +09 1945 S 23 +8 - WITA +Z Asia/Manila -15:56 - LMT 1844 D 31 +8:4 - LMT 1899 May 11 +8 PH P%sT 1942 May +9 - JST 1944 N +8 PH P%sT +Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 +2 CY EE%sT 1998 S +2 E EE%sT +Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May +6 - +06 1930 Jun 21 +7 R +07/+08 1991 Mar 31 2s +6 R +06/+07 1992 Ja 19 2s +7 R +07/+08 2010 Mar 28 2s +6 R +06/+07 2011 Mar 27 2s +7 - +07 +Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 +6 - +06 1930 Jun 21 +7 R +07/+08 1991 Mar 31 2s +6 R +06/+07 1992 Ja 19 2s +7 R +07/+08 1993 May 23 +6 R +06/+07 2011 Mar 27 2s +7 - +07 2014 O 26 2s +6 - +06 2016 Jul 24 2s +7 - +07 +Z Asia/Omsk 4:53:30 - LMT 1919 N 14 +5 - +05 1930 Jun 21 +6 R +06/+07 1991 Mar 31 2s +5 R +05/+06 1992 Ja 19 2s +6 R +06/+07 2011 Mar 27 2s +7 - +07 2014 O 26 2s +6 - +06 +Z Asia/Oral 3:25:24 - LMT 1924 May 2 +3 - +03 1930 Jun 21 +5 - +05 1981 Ap +5 1 +06 1981 O +6 - +06 1982 Ap +5 R +05/+06 1989 Mar 26 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 1992 Mar 29 2s +4 R +04/+05 2004 O 31 2s +5 - +05 +Z Asia/Pontianak 7:17:20 - LMT 1908 May +7:17:20 - PMT 1932 N +7:30 - +0730 1942 Ja 29 +9 - +09 1945 S 23 +7:30 - +0730 1948 May +8 - +08 1950 May +7:30 - +0730 1964 +8 - WITA 1988 +7 - WIB +Z Asia/Pyongyang 8:23 - LMT 1908 Ap +8:30 - KST 1912 +9 - JST 1945 Au 24 +9 - KST 2015 Au 15 +8:30 - KST 2018 May 4 23:30 +9 - KST +Z Asia/Qatar 3:26:8 - LMT 1920 +4 - +04 1972 Jun +3 - +03 +Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 - +05 1981 Ap +5 1 +06 1981 O +6 - +06 1982 Ap +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 2004 O 31 2s +6 - +06 2024 Mar +5 - +05 +Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 - +05 1981 Ap +5 1 +06 1981 O +6 - +06 1982 Ap +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1991 S 29 2s +5 R +05/+06 1992 Ja 19 2s +6 R +06/+07 1992 Mar 29 2s +5 R +05/+06 2004 O 31 2s +6 - +06 2018 D 21 +5 - +05 +Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 +3 - +03 +Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 +9 - +09 1945 Au 25 +11 R +11/+12 1991 Mar 31 2s +10 R +10/+11 1992 Ja 19 2s +11 R +11/+12 1997 Mar lastSu 2s +10 R +10/+11 2011 Mar 27 2s +11 - +11 2014 O 26 2s +10 - +10 2016 Mar 27 2s +11 - +11 +Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 +4 - +04 1930 Jun 21 +5 - +05 1981 Ap +5 1 +06 1981 O +6 - +06 1982 Ap +5 R +05/+06 1992 +5 - +05 +Z Asia/Seoul 8:27:52 - LMT 1908 Ap +8:30 - KST 1912 +9 - JST 1945 S 8 +9 KR K%sT 1954 Mar 21 +8:30 KR K%sT 1961 Au 10 +9 KR K%sT +Z Asia/Shanghai 8:5:43 - LMT 1901 +8 Sh C%sT 1949 May 28 +8 CN C%sT +Z Asia/Singapore 6:55:25 - LMT 1901 +6:55:25 - SMT 1905 Jun +7 - +07 1933 +7 0:20 +0720 1936 +7:20 - +0720 1941 S +7:30 - +0730 1942 F 16 +9 - +09 1945 S 12 +7:30 - +0730 1981 D 31 16u +8 - +08 +Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 +10 - +10 1930 Jun 21 +11 R +11/+12 1991 Mar 31 2s +10 R +10/+11 1992 Ja 19 2s +11 R +11/+12 2011 Mar 27 2s +12 - +12 2014 O 26 2s +11 - +11 +Z Asia/Taipei 8:6 - LMT 1896 +8 - CST 1937 O +9 - JST 1945 S 21 1 +8 f C%sT +Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 +5 - +05 1930 Jun 21 +6 R +06/+07 1991 Mar 31 2 +5 R +05/+06 1992 +5 - +05 +Z Asia/Tbilisi 2:59:11 - LMT 1880 +2:59:11 - TBMT 1924 May 2 +3 - +03 1957 Mar +4 R +04/+05 1991 Mar 31 2s +3 R +03/+04 1992 +3 e +03/+04 1994 S lastSu +4 e +04/+05 1996 O lastSu +4 1 +05 1997 Mar lastSu +4 e +04/+05 2004 Jun 27 +3 R +03/+04 2005 Mar lastSu 2 +4 - +04 +Z Asia/Tehran 3:25:44 - LMT 1916 +3:25:44 - TMT 1935 Jun 13 +3:30 i +0330/+0430 1977 O 20 24 +4 i +04/+05 1979 +3:30 i +0330/+0430 +Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 +5:30 - +0530 1987 O +6 - +06 +Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u +9 JP J%sT +Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 +6 - +06 1930 Jun 21 +7 R +07/+08 1991 Mar 31 2s +6 R +06/+07 1992 Ja 19 2s +7 R +07/+08 2002 May 1 3 +6 R +06/+07 2011 Mar 27 2s +7 - +07 2014 O 26 2s +6 - +06 2016 May 29 2s +7 - +07 +Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au +7 - +07 1978 +8 X +08/+09 +Z Asia/Urumqi 5:50:20 - LMT 1928 +6 - +06 +Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 +8 - +08 1930 Jun 21 +9 R +09/+10 1981 Ap +11 R +11/+12 1991 Mar 31 2s +10 R +10/+11 1992 Ja 19 2s +11 R +11/+12 2011 Mar 27 2s +12 - +12 2011 S 13 0s +11 - +11 2014 O 26 2s +10 - +10 +Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 +9 - +09 1930 Jun 21 +10 R +10/+11 1991 Mar 31 2s +9 R +09/+10 1992 Ja 19 2s +10 R +10/+11 2011 Mar 27 2s +11 - +11 2014 O 26 2s +10 - +10 +Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 +8 - +08 1930 Jun 21 +9 R +09/+10 1991 Mar 31 2s +8 R +08/+09 1992 Ja 19 2s +9 R +09/+10 2011 Mar 27 2s +10 - +10 2014 O 26 2s +9 - +09 +Z Asia/Yangon 6:24:47 - LMT 1880 +6:24:47 - RMT 1920 +6:30 - +0630 1942 May +9 - +09 1945 May 3 +6:30 - +0630 +Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 +3:45:5 - PMT 1919 Jul 15 4 +4 - +04 1930 Jun 21 +5 R +05/+06 1991 Mar 31 2s +4 R +04/+05 1992 Ja 19 2s +5 R +05/+06 2011 Mar 27 2s +6 - +06 2014 O 26 2s +5 - +05 +Z Asia/Yerevan 2:58 - LMT 1924 May 2 +3 - +03 1957 Mar +4 R +04/+05 1991 Mar 31 2s +3 R +03/+04 1995 S 24 2s +4 - +04 1997 +4 R +04/+05 2011 +4 AM +04/+05 +Z Atlantic/Azores -1:42:40 - LMT 1884 +-1:54:32 - HMT 1912 Ja 1 2u +-2 p -02/-01 1942 Ap 25 22s +-2 p +00 1942 Au 15 22s +-2 p -02/-01 1943 Ap 17 22s +-2 p +00 1943 Au 28 22s +-2 p -02/-01 1944 Ap 22 22s +-2 p +00 1944 Au 26 22s +-2 p -02/-01 1945 Ap 21 22s +-2 p +00 1945 Au 25 22s +-2 p -02/-01 1966 Ap 3 2 +-1 p -01/+00 1983 S 25 1s +-1 W- -01/+00 1992 S 27 1s +0 E WE%sT 1993 Mar 28 1u +-1 E -01/+00 +Z Atlantic/Bermuda -4:19:18 - LMT 1890 +-4:19:18 Be BMT/BST 1930 Ja 1 2 +-4 Be A%sT 1974 Ap 28 2 +-4 C A%sT 1976 +-4 u A%sT +Z Atlantic/Canary -1:1:36 - LMT 1922 Mar +-1 - -01 1946 S 30 1 +0 - WET 1980 Ap 6 0s +0 1 WEST 1980 S 28 1u +0 E WE%sT +Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u +-2 - -02 1942 S +-2 1 -01 1945 O 15 +-2 - -02 1975 N 25 2 +-1 - -01 +Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 +0 - WET 1981 +0 E WE%sT +Z Atlantic/Madeira -1:7:36 - LMT 1884 +-1:7:36 - FMT 1912 Ja 1 1u +-1 p -01/+00 1942 Ap 25 22s +-1 p +01 1942 Au 15 22s +-1 p -01/+00 1943 Ap 17 22s +-1 p +01 1943 Au 28 22s +-1 p -01/+00 1944 Ap 22 22s +-1 p +01 1944 Au 26 22s +-1 p -01/+00 1945 Ap 21 22s +-1 p +01 1945 Au 25 22s +-1 p -01/+00 1966 Ap 3 2 +0 p WE%sT 1983 S 25 1s +0 E WE%sT +Z Atlantic/South_Georgia -2:26:8 - LMT 1890 +-2 - -02 +Z Atlantic/Stanley -3:51:24 - LMT 1890 +-3:51:24 - SMT 1912 Mar 12 +-4 FK -04/-03 1983 May +-3 FK -03/-02 1985 S 15 +-4 FK -04/-03 2010 S 5 2 +-3 - -03 +Z Australia/Adelaide 9:14:20 - LMT 1895 F +9 - ACST 1899 May +9:30 AU AC%sT 1971 +9:30 AS AC%sT +Z Australia/Brisbane 10:12:8 - LMT 1895 +10 AU AE%sT 1971 +10 AQ AE%sT +Z Australia/Broken_Hill 9:25:48 - LMT 1895 F +10 - AEST 1896 Au 23 +9 - ACST 1899 May +9:30 AU AC%sT 1971 +9:30 AN AC%sT 2000 +9:30 AS AC%sT +Z Australia/Darwin 8:43:20 - LMT 1895 F +9 - ACST 1899 May +9:30 AU AC%sT +Z Australia/Eucla 8:35:28 - LMT 1895 D +8:45 AU +0845/+0945 1943 Jul +8:45 AW +0845/+0945 +Z Australia/Hobart 9:49:16 - LMT 1895 S +10 AT AE%sT 1919 O 24 +10 AU AE%sT 1967 +10 AT AE%sT +Z Australia/Lindeman 9:55:56 - LMT 1895 +10 AU AE%sT 1971 +10 AQ AE%sT 1992 Jul +10 Ho AE%sT +Z Australia/Lord_Howe 10:36:20 - LMT 1895 F +10 - AEST 1981 Mar +10:30 LH +1030/+1130 1985 Jul +10:30 LH +1030/+11 +Z Australia/Melbourne 9:39:52 - LMT 1895 F +10 AU AE%sT 1971 +10 AV AE%sT +Z Australia/Perth 7:43:24 - LMT 1895 D +8 AU AW%sT 1943 Jul +8 AW AW%sT +Z Australia/Sydney 10:4:52 - LMT 1895 F +10 AU AE%sT 1971 +10 AN AE%sT +Z CET 1 c CE%sT +Z CST6CDT -6 u C%sT +Z EET 2 E EE%sT +Z EST -5 - EST +Z EST5EDT -5 u E%sT +Z Etc/GMT 0 - GMT +Z Etc/GMT+1 -1 - -01 +Z Etc/GMT+10 -10 - -10 +Z Etc/GMT+11 -11 - -11 +Z Etc/GMT+12 -12 - -12 +Z Etc/GMT+2 -2 - -02 +Z Etc/GMT+3 -3 - -03 +Z Etc/GMT+4 -4 - -04 +Z Etc/GMT+5 -5 - -05 +Z Etc/GMT+6 -6 - -06 +Z Etc/GMT+7 -7 - -07 +Z Etc/GMT+8 -8 - -08 +Z Etc/GMT+9 -9 - -09 +Z Etc/GMT-1 1 - +01 +Z Etc/GMT-10 10 - +10 +Z Etc/GMT-11 11 - +11 +Z Etc/GMT-12 12 - +12 +Z Etc/GMT-13 13 - +13 +Z Etc/GMT-14 14 - +14 +Z Etc/GMT-2 2 - +02 +Z Etc/GMT-3 3 - +03 +Z Etc/GMT-4 4 - +04 +Z Etc/GMT-5 5 - +05 +Z Etc/GMT-6 6 - +06 +Z Etc/GMT-7 7 - +07 +Z Etc/GMT-8 8 - +08 +Z Etc/GMT-9 9 - +09 +Z Etc/UTC 0 - UTC +Z Europe/Andorra 0:6:4 - LMT 1901 +0 - WET 1946 S 30 +1 - CET 1985 Mar 31 2 +1 E CE%sT +Z Europe/Astrakhan 3:12:12 - LMT 1924 May +3 - +03 1930 Jun 21 +4 R +04/+05 1989 Mar 26 2s +3 R +03/+04 1991 Mar 31 2s +4 - +04 1992 Mar 29 2s +3 R +03/+04 2011 Mar 27 2s +4 - +04 2014 O 26 2s +3 - +03 2016 Mar 27 2s +4 - +04 +Z Europe/Athens 1:34:52 - LMT 1895 S 14 +1:34:52 - AMT 1916 Jul 28 0:1 +2 g EE%sT 1941 Ap 30 +1 g CE%sT 1944 Ap 4 +2 g EE%sT 1981 +2 E EE%sT +Z Europe/Belgrade 1:22 - LMT 1884 +1 - CET 1941 Ap 18 23 +1 c CE%sT 1945 +1 - CET 1945 May 8 2s +1 1 CEST 1945 S 16 2s +1 - CET 1982 N 27 +1 E CE%sT +Z Europe/Berlin 0:53:28 - LMT 1893 Ap +1 c CE%sT 1945 May 24 2 +1 So CE%sT 1946 +1 DE CE%sT 1980 +1 E CE%sT +Z Europe/Brussels 0:17:30 - LMT 1880 +0:17:30 - BMT 1892 May 1 0:17:30 +0 - WET 1914 N 8 +1 - CET 1916 May +1 c CE%sT 1918 N 11 11u +0 b WE%sT 1940 May 20 2s +1 c CE%sT 1944 S 3 +1 b CE%sT 1977 +1 E CE%sT +Z Europe/Bucharest 1:44:24 - LMT 1891 O +1:44:24 - BMT 1931 Jul 24 +2 z EE%sT 1981 Mar 29 2s +2 c EE%sT 1991 +2 z EE%sT 1994 +2 e EE%sT 1997 +2 E EE%sT +Z Europe/Budapest 1:16:20 - LMT 1890 N +1 c CE%sT 1918 +1 h CE%sT 1941 Ap 7 23 +1 c CE%sT 1945 +1 h CE%sT 1984 +1 E CE%sT +Z Europe/Chisinau 1:55:20 - LMT 1880 +1:55 - CMT 1918 F 15 +1:44:24 - BMT 1931 Jul 24 +2 z EE%sT 1940 Au 15 +2 1 EEST 1941 Jul 17 +1 c CE%sT 1944 Au 24 +3 R MSK/MSD 1990 May 6 2 +2 R EE%sT 1992 +2 e EE%sT 1997 +2 MD EE%sT +Z Europe/Dublin -0:25:21 - LMT 1880 Au 2 +-0:25:21 - DMT 1916 May 21 2s +-0:25:21 1 IST 1916 O 1 2s +0 G %s 1921 D 6 +0 G GMT/IST 1940 F 25 2s +0 1 IST 1946 O 6 2s +0 - GMT 1947 Mar 16 2s +0 1 IST 1947 N 2 2s +0 - GMT 1948 Ap 18 2s +0 G GMT/IST 1968 O 27 +1 IE IST/GMT +Z Europe/Gibraltar -0:21:24 - LMT 1880 Au 2 +0 G %s 1957 Ap 14 2 +1 - CET 1982 +1 E CE%sT +Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 +1:39:49 - HMT 1921 May +2 FI EE%sT 1983 +2 E EE%sT +Z Europe/Istanbul 1:55:52 - LMT 1880 +1:56:56 - IMT 1910 O +2 T EE%sT 1978 Jun 29 +3 T +03/+04 1984 N 1 2 +2 T EE%sT 2007 +2 E EE%sT 2011 Mar 27 1u +2 - EET 2011 Mar 28 1u +2 E EE%sT 2014 Mar 30 1u +2 - EET 2014 Mar 31 1u +2 E EE%sT 2015 O 25 1u +2 1 EEST 2015 N 8 1u +2 E EE%sT 2016 S 7 +3 - +03 +Z Europe/Kaliningrad 1:22 - LMT 1893 Ap +1 c CE%sT 1945 Ap 10 +2 O EE%sT 1946 Ap 7 +3 R MSK/MSD 1989 Mar 26 2s +2 R EE%sT 2011 Mar 27 2s +3 - +03 2014 O 26 2s +2 - EET +Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u +3 - +03 1930 Jun 21 +4 R +04/+05 1989 Mar 26 2s +3 R MSK/MSD 1991 Mar 31 2s +4 - +04 1992 Mar 29 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Kyiv 2:2:4 - LMT 1880 +2:2:4 - KMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 S 20 +1 c CE%sT 1943 N 6 +3 R MSK/MSD 1990 Jul 1 2 +2 1 EEST 1991 S 29 3 +2 c EE%sT 1996 May 13 +2 E EE%sT +Z Europe/Lisbon -0:36:45 - LMT 1884 +-0:36:45 - LMT 1912 Ja 1 0u +0 p WE%sT 1966 Ap 3 2 +1 - CET 1976 S 26 1 +0 p WE%sT 1983 S 25 1s +0 W- WE%sT 1992 S 27 1s +1 E CE%sT 1996 Mar 31 1u +0 E WE%sT +Z Europe/London -0:1:15 - LMT 1847 D +0 G %s 1968 O 27 +1 - BST 1971 O 31 2u +0 G %s 1996 +0 E GMT/BST +Z Europe/Madrid -0:14:44 - LMT 1901 Ja 1 0u +0 s WE%sT 1940 Mar 16 23 +1 s CE%sT 1979 +1 E CE%sT +Z Europe/Malta 0:58:4 - LMT 1893 N 2 +1 I CE%sT 1973 Mar 31 +1 MT CE%sT 1981 +1 E CE%sT +Z Europe/Minsk 1:50:16 - LMT 1880 +1:50 - MMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 Jun 28 +1 c CE%sT 1944 Jul 3 +3 R MSK/MSD 1990 +3 - MSK 1991 Mar 31 2s +2 R EE%sT 2011 Mar 27 2s +3 - +03 +Z Europe/Moscow 2:30:17 - LMT 1880 +2:30:17 - MMT 1916 Jul 3 +2:31:19 R %s 1919 Jul 1 0u +3 R %s 1921 O +3 R MSK/MSD 1922 O +2 - EET 1930 Jun 21 +3 R MSK/MSD 1991 Mar 31 2s +2 R EE%sT 1992 Ja 19 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Paris 0:9:21 - LMT 1891 Mar 16 +0:9:21 - PMT 1911 Mar 11 +0 F WE%sT 1940 Jun 14 23 +1 c CE%sT 1944 Au 25 +0 F WE%sT 1945 S 16 3 +1 F CE%sT 1977 +1 E CE%sT +Z Europe/Prague 0:57:44 - LMT 1850 +0:57:44 - PMT 1891 O +1 c CE%sT 1945 May 9 +1 CZ CE%sT 1946 D 1 3 +1 -1 GMT 1947 F 23 2 +1 CZ CE%sT 1979 +1 E CE%sT +Z Europe/Riga 1:36:34 - LMT 1880 +1:36:34 - RMT 1918 Ap 15 2 +1:36:34 1 LST 1918 S 16 3 +1:36:34 - RMT 1919 Ap 1 2 +1:36:34 1 LST 1919 May 22 3 +1:36:34 - RMT 1926 May 11 +2 - EET 1940 Au 5 +3 - MSK 1941 Jul +1 c CE%sT 1944 O 13 +3 R MSK/MSD 1989 Mar lastSu 2s +2 1 EEST 1989 S lastSu 2s +2 LV EE%sT 1997 Ja 21 +2 E EE%sT 2000 F 29 +2 - EET 2001 Ja 2 +2 E EE%sT +Z Europe/Rome 0:49:56 - LMT 1866 D 12 +0:49:56 - RMT 1893 O 31 23u +1 I CE%sT 1943 S 10 +1 c CE%sT 1944 Jun 4 +1 I CE%sT 1980 +1 E CE%sT +Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u +3 - +03 1930 Jun 21 +4 - +04 1935 Ja 27 +4 R +04/+05 1989 Mar 26 2s +3 R +03/+04 1991 Mar 31 2s +2 R +02/+03 1991 S 29 2s +3 - +03 1991 O 20 3 +4 R +04/+05 2010 Mar 28 2s +3 R +03/+04 2011 Mar 27 2s +4 - +04 +Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u +3 - +03 1930 Jun 21 +4 R +04/+05 1988 Mar 27 2s +3 R +03/+04 1991 Mar 31 2s +4 - +04 1992 Mar 29 2s +3 R +03/+04 2011 Mar 27 2s +4 - +04 2014 O 26 2s +3 - +03 2016 D 4 2s +4 - +04 +Z Europe/Simferopol 2:16:24 - LMT 1880 +2:16 - SMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 N +1 c CE%sT 1944 Ap 13 +3 R MSK/MSD 1990 +3 - MSK 1990 Jul 1 2 +2 - EET 1992 Mar 20 +2 c EE%sT 1994 May +3 c MSK/MSD 1996 Mar 31 0s +3 1 MSD 1996 O 27 3s +3 - MSK 1997 Mar lastSu 1u +2 E EE%sT 2014 Mar 30 2 +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Sofia 1:33:16 - LMT 1880 +1:56:56 - IMT 1894 N 30 +2 - EET 1942 N 2 3 +1 c CE%sT 1945 +1 - CET 1945 Ap 2 3 +2 - EET 1979 Mar 31 23 +2 BG EE%sT 1982 S 26 3 +2 c EE%sT 1991 +2 e EE%sT 1997 +2 E EE%sT +Z Europe/Tallinn 1:39 - LMT 1880 +1:39 - TMT 1918 F +1 c CE%sT 1919 Jul +1:39 - TMT 1921 May +2 - EET 1940 Au 6 +3 - MSK 1941 S 15 +1 c CE%sT 1944 S 22 +3 R MSK/MSD 1989 Mar 26 2s +2 1 EEST 1989 S 24 2s +2 c EE%sT 1998 S 22 +2 E EE%sT 1999 O 31 4 +2 - EET 2002 F 21 +2 E EE%sT +Z Europe/Tirane 1:19:20 - LMT 1914 +1 - CET 1940 Jun 16 +1 q CE%sT 1984 Jul +1 E CE%sT +Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u +3 - +03 1930 Jun 21 +4 R +04/+05 1989 Mar 26 2s +3 R +03/+04 1991 Mar 31 2s +2 R +02/+03 1992 Ja 19 2s +3 R +03/+04 2011 Mar 27 2s +4 - +04 2014 O 26 2s +3 - +03 2016 Mar 27 2s +4 - +04 +Z Europe/Vienna 1:5:21 - LMT 1893 Ap +1 c CE%sT 1920 +1 a CE%sT 1940 Ap 1 2s +1 c CE%sT 1945 Ap 2 2s +1 1 CEST 1945 Ap 12 2s +1 - CET 1946 +1 a CE%sT 1981 +1 E CE%sT +Z Europe/Vilnius 1:41:16 - LMT 1880 +1:24 - WMT 1917 +1:35:36 - KMT 1919 O 10 +1 - CET 1920 Jul 12 +2 - EET 1920 O 9 +1 - CET 1940 Au 3 +3 - MSK 1941 Jun 24 +1 c CE%sT 1944 Au +3 R MSK/MSD 1989 Mar 26 2s +2 R EE%sT 1991 S 29 2s +2 c EE%sT 1998 +2 - EET 1998 Mar 29 1u +1 E CE%sT 1999 O 31 1u +2 - EET 2003 +2 E EE%sT +Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 +3 - +03 1930 Jun 21 +4 - +04 1961 N 11 +4 R +04/+05 1988 Mar 27 2s +3 R MSK/MSD 1991 Mar 31 2s +4 - +04 1992 Mar 29 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK 2018 O 28 2s +4 - +04 2020 D 27 2s +3 - MSK +Z Europe/Warsaw 1:24 - LMT 1880 +1:24 - WMT 1915 Au 5 +1 c CE%sT 1918 S 16 3 +2 O EE%sT 1922 Jun +1 O CE%sT 1940 Jun 23 2 +1 c CE%sT 1944 O +1 O CE%sT 1977 +1 W- CE%sT 1988 +1 E CE%sT +Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 +0:29:46 - BMT 1894 Jun +1 CH CE%sT 1981 +1 E CE%sT +Z Factory 0 - -00 +Z HST -10 - HST +Z Indian/Chagos 4:49:40 - LMT 1907 +5 - +05 1996 +6 - +06 +Z Indian/Maldives 4:54 - LMT 1880 +4:54 - MMT 1960 +5 - +05 +Z Indian/Mauritius 3:50 - LMT 1907 +4 MU +04/+05 +Z MET 1 c ME%sT +Z MST -7 - MST +Z MST7MDT -7 u M%sT +Z PST8PDT -8 u P%sT +Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 +-11:26:56 - LMT 1911 +-11:30 - -1130 1950 +-11 WS -11/-10 2011 D 29 24 +13 WS +13/+14 +Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 +11:30 NZ NZ%sT 1946 +12 NZ NZ%sT +Z Pacific/Bougainville 10:22:16 - LMT 1880 +9:48:32 - PMMT 1895 +10 - +10 1942 Jul +9 - +09 1945 Au 21 +10 - +10 2014 D 28 2 +11 - +11 +Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 +12:15 - +1215 1946 +12:45 k +1245/+1345 +Z Pacific/Easter -7:17:28 - LMT 1890 +-7:17:28 - EMT 1932 S +-7 x -07/-06 1982 Mar 14 3u +-6 x -06/-05 +Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 +11 VU +11/+12 +Z Pacific/Fakaofo -11:24:56 - LMT 1901 +-11 - -11 2011 D 30 +13 - +13 +Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 +12 FJ +12/+13 +Z Pacific/Galapagos -5:58:24 - LMT 1931 +-5 - -05 1986 +-6 EC -06/-05 +Z Pacific/Gambier -8:59:48 - LMT 1912 O +-9 - -09 +Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O +11 - +11 +Z Pacific/Guam -14:21 - LMT 1844 D 31 +9:39 - LMT 1901 +10 - GST 1941 D 10 +9 - +09 1944 Jul 31 +10 Gu G%sT 2000 D 23 +10 - ChST +Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 +-10:30 - HST 1933 Ap 30 2 +-10:30 1 HDT 1933 May 21 12 +-10:30 u H%sT 1947 Jun 8 2 +-10 - HST +Z Pacific/Kanton 0 - -00 1937 Au 31 +-12 - -12 1979 O +-11 - -11 1994 D 31 +13 - +13 +Z Pacific/Kiritimati -10:29:20 - LMT 1901 +-10:40 - -1040 1979 O +-10 - -10 1994 D 31 +14 - +14 +Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 +10:51:56 - LMT 1901 +11 - +11 1914 O +9 - +09 1919 F +11 - +11 1937 +10 - +10 1941 Ap +9 - +09 1945 Au +11 - +11 1969 O +12 - +12 1999 +11 - +11 +Z Pacific/Kwajalein 11:9:20 - LMT 1901 +11 - +11 1937 +10 - +10 1941 Ap +9 - +09 1944 F 6 +11 - +11 1969 O +-12 - -12 1993 Au 20 24 +12 - +12 +Z Pacific/Marquesas -9:18 - LMT 1912 O +-9:30 - -0930 +Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 +11:30 - +1130 1942 Au 29 +9 - +09 1945 S 8 +11:30 - +1130 1979 F 10 2 +12 - +12 +Z Pacific/Niue -11:19:40 - LMT 1952 O 16 +-11:20 - -1120 1964 Jul +-11 - -11 +Z Pacific/Norfolk 11:11:52 - LMT 1901 +11:12 - +1112 1951 +11:30 - +1130 1974 O 27 2s +11:30 1 +1230 1975 Mar 2 2s +11:30 - +1130 2015 O 4 2s +11 - +11 2019 Jul +11 AN +11/+12 +Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 +11 NC +11/+12 +Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 +-11:22:48 - LMT 1911 +-11 - SST +Z Pacific/Palau -15:2:4 - LMT 1844 D 31 +8:57:56 - LMT 1901 +9 - +09 +Z Pacific/Pitcairn -8:40:20 - LMT 1901 +-8:30 - -0830 1998 Ap 27 +-8 - -08 +Z Pacific/Port_Moresby 9:48:40 - LMT 1880 +9:48:32 - PMMT 1895 +10 - +10 +Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 +-10:39:4 - LMT 1952 O 16 +-10:30 - -1030 1978 N 12 +-10 CK -10/-0930 +Z Pacific/Tahiti -9:58:16 - LMT 1912 O +-10 - -10 +Z Pacific/Tarawa 11:32:4 - LMT 1901 +12 - +12 +Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 +12:20 - +1220 1961 +13 - +13 1999 +13 TO +13/+14 +Z WET 0 E WE%sT +L Etc/GMT GMT L Australia/Sydney Australia/ACT L Australia/Lord_Howe Australia/LHI L Australia/Sydney Australia/NSW @@ -4185,7 +4195,6 @@ L America/Puerto_Rico America/Tortola L Pacific/Port_Moresby Antarctica/DumontDUrville L Pacific/Auckland Antarctica/McMurdo L Asia/Riyadh Antarctica/Syowa -L Asia/Urumqi Antarctica/Vostok L Europe/Berlin Arctic/Longyearbyen L Asia/Riyadh Asia/Aden L Asia/Qatar Asia/Bahrain diff --git a/third_party/spanner_pg/src/timezone/pgtz.c b/third_party/spanner_pg/src/timezone/pgtz.c index a43ffe48..d9bee643 100644 --- a/third_party/spanner_pg/src/timezone/pgtz.c +++ b/third_party/spanner_pg/src/timezone/pgtz.c @@ -3,7 +3,7 @@ * pgtz.c * Timezone Library Integration Functions * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/timezone/pgtz.c diff --git a/third_party/spanner_pg/src/timezone/pgtz.h b/third_party/spanner_pg/src/timezone/pgtz.h index ca01722e..30a3539a 100644 --- a/third_party/spanner_pg/src/timezone/pgtz.h +++ b/third_party/spanner_pg/src/timezone/pgtz.h @@ -6,7 +6,7 @@ * Note: this file contains only definitions that are private to the * timezone library. Public definitions are in pgtime.h. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group * * IDENTIFICATION * src/timezone/pgtz.h diff --git a/third_party/spanner_pg/src/tools/PerfectHash.pm b/third_party/spanner_pg/src/tools/PerfectHash.pm index db06d046..4ffb6bd5 100644 --- a/third_party/spanner_pg/src/tools/PerfectHash.pm +++ b/third_party/spanner_pg/src/tools/PerfectHash.pm @@ -20,7 +20,7 @@ # not in the set. # # -# 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 # # src/tools/PerfectHash.pm @@ -87,13 +87,14 @@ sub generate_hash_function my $hash_seed2; my @subresult; FIND_PARAMS: - foreach (17, 31, 127, 8191) + for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++) { - $hash_mult2 = $_; # "foreach $hash_mult2" doesn't work - for ($hash_seed1 = 0; $hash_seed1 < 10; $hash_seed1++) + + for ($hash_seed2 = 0; $hash_seed2 < 10; $hash_seed2++) { - for ($hash_seed2 = 0; $hash_seed2 < 10; $hash_seed2++) + foreach (17, 31, 127, 8191) { + $hash_mult2 = $_; # "foreach $hash_mult2" doesn't work @subresult = _construct_hash_table( $keys_ref, $hash_mult1, $hash_mult2, $hash_seed1, $hash_seed2); diff --git a/third_party/spanner_pg/src/tools/RELEASE_CHANGES b/third_party/spanner_pg/src/tools/RELEASE_CHANGES index 5cf2a4dd..e8de724f 100644 --- a/third_party/spanner_pg/src/tools/RELEASE_CHANGES +++ b/third_party/spanner_pg/src/tools/RELEASE_CHANGES @@ -70,11 +70,7 @@ but there may be reasons to do them at other times as well. * Run mechanical code beautification tools: pgindent, pgperltidy, and "make reformat-dat-files" - (see src/tools/pgindent/README) - -* Update .git-blame-ignore-revs. It should contain all of the newly - created code beautification commits. Make sure that you use - full-length commit hashes for this. + (complete steps from src/tools/pgindent/README) * Renumber any manually-assigned OIDs between 8000 and 9999 to lower numbers, using renumber_oids.pl (see notes in bki.sgml) @@ -90,7 +86,7 @@ Starting a New Development Cycle ================================ * Typically, we do pgindent and perltidy runs just before branching, - as well as before beta + as well as before beta (complete steps from src/tools/pgindent/README) * Create a branch in git for maintenance of the previous release o on master branch, do: @@ -111,8 +107,14 @@ Starting a New Development Cycle placeholder), "git rm" the previous one, and update release.sgml and filelist.sgml to match. +* Notify the private committers email list, to ensure all committers + are aware of the new branch even if they're not paying close attention + to pgsql-hackers. + * Get the buildfarm's 'branches_of_interest.txt' file updated with the new - branch. + branch. Once the buildfarm server is accepting reports, notify the + buildfarm owners' email list, for the benefit of owners who use manual + branch scheduling. Creating Back-Branch Release Notes @@ -145,8 +147,12 @@ Creating Back-Branch Release Notes Retiring a Branch ================= +* Notify the private committers email list, to ensure all committers + are aware of the branch being dead. + * Get the buildfarm's 'branches_of_interest.txt' file updated to remove - the retired branch. + the retired branch. Then notify the buildfarm owners' email list, + for the benefit of owners who use manual branch scheduling. diff --git a/third_party/spanner_pg/src/tools/check_bison_recursion.pl b/third_party/spanner_pg/src/tools/check_bison_recursion.pl index 5bb5722e..6f748ae6 100755 --- a/third_party/spanner_pg/src/tools/check_bison_recursion.pl +++ b/third_party/spanner_pg/src/tools/check_bison_recursion.pl @@ -16,7 +16,7 @@ # To use: run bison with the -v switch, then feed the produced y.output # file to this script. # -# Copyright (c) 2011-2021, PostgreSQL Global Development Group +# Copyright (c) 2011-2022, PostgreSQL Global Development Group # # src/tools/check_bison_recursion.pl ################################################################# diff --git a/third_party/spanner_pg/src/tools/ci/README b/third_party/spanner_pg/src/tools/ci/README new file mode 100644 index 00000000..d67e9c54 --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/README @@ -0,0 +1,84 @@ +Postgres Continuous Integration (CI) +==================================== + +Postgres has two forms of CI: + +1) All supported branches in the main postgres repository are continuously + tested via the buildfarm. As this covers only the main repository, it + cannot be used during development of features. + + For details see https://buildfarm.postgresql.org/ + +2) For not yet merged development work, CI can be enabled for some git hosting + providers. This allows developers to test patches on a number of platforms + before they are merged (or even submitted). + + +Configuring CI on personal repositories +======================================= + +Currently postgres contains CI support utilizing cirrus-ci. cirrus-ci +currently is only available for github. + + +Enabling cirrus-ci in a github repository +========================================= + +To enable cirrus-ci on a repository, go to +https://github.com/marketplace/cirrus-ci and select "Public +Repositories". Then "Install it for free" and "Complete order". The next page +allows to configure which repositories cirrus-ci has access to. Choose the +relevant repository and "Install". + +See also https://cirrus-ci.org/guide/quick-start/ + +Once enabled on a repository, future commits and pull-requests in that +repository will automatically trigger CI builds. These are visible from the +commit history / PRs, and can also be viewed in the cirrus-ci UI at +https://cirrus-ci.com/github/// + +Hint: all build log files are uploaded to cirrus-ci and can be downloaded +from the "Artifacts" section fron the cirrus-ci UI after clicking into a +specific task on a build's summary page. + + +Images used for CI +================== + +To keep CI times tolerable, most platforms use pre-generated images. Some +platforms use containers, others use full VMs. Images for both are generated +separately from CI runs, otherwise each git repository that is being tested +would need to build its own set of containers, which would be wasteful (both +in space and time. + +These images are built, on a daily basis, from the specifications in +github.com/anarazel/pg-vm-images/ + + +Controlling CI via commit messages +================================== + +The behavior of CI can be controlled by special content in commit +messages. Currently the following controls are available: + +- ci-os-only: {(freebsd|linux|macos|windows)} + + Only runs CI on operating systems specified. This can be useful when + addressing portability issues affecting only a subset of platforms. + + +Using custom compute resources for CI +===================================== + +When running a lot of tests in a repository, cirrus-ci's free credits do not +suffice. In those cases a repository can be configured to use other +infrastructure for running tests. To do so, the REPO_CI_CONFIG_GIT_URL +variable can be configured for the repository in the cirrus-ci web interface, +at https://cirrus-ci.com/github/. The file referenced +(see https://cirrus-ci.org/guide/programming-tasks/#fs) by the variable can +overwrite the default execution method for different operating systems, +defined in .cirrus.yml, by redefining the relevant yaml anchors. + +Custom compute resources can be provided using +- https://cirrus-ci.org/guide/supported-computing-services/ +- https://cirrus-ci.org/guide/persistent-workers/ diff --git a/third_party/spanner_pg/src/tools/ci/ci_macports_packages.sh b/third_party/spanner_pg/src/tools/ci/ci_macports_packages.sh new file mode 100755 index 00000000..4bc594a3 --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/ci_macports_packages.sh @@ -0,0 +1,97 @@ +#!/bin/sh + +# Installs the passed in packages via macports. To make it fast enough +# for CI, cache the installation as a .dmg file. To avoid +# unnecessarily updating the cache, the cached image is only modified +# when packages are installed or removed. Any package this script is +# not instructed to install, will be removed again. +# +# This currently expects to be run in a macos cirrus-ci environment. + +set -e +# set -x + +packages="$@" + +macports_url="https://github.com/macports/macports-base/releases/download/v2.8.1/MacPorts-2.8.1-13-Ventura.pkg" +cache_dmg="macports.hfs.dmg" + +if [ "$CIRRUS_CI" != "true" ]; then + echo "expect to be called within cirrus-ci" 1>2 + exit 1 +fi + +sudo mkdir -p /opt/local +mkdir -p ${MACPORTS_CACHE}/ + +# If we are starting from clean cache, perform a fresh macports +# install. Otherwise decompress the .dmg we created previously. +# +# After this we have a working macports installation, with an unknown set of +# packages installed. +new_install=0 +update_cached_image=0 +if [ -e ${MACPORTS_CACHE}/${cache_dmg}.zstd ]; then + time zstd -T0 -d ${MACPORTS_CACHE}/${cache_dmg}.zstd -o ${cache_dmg} + time sudo hdiutil attach -kernel ${cache_dmg} -owners on -shadow ${cache_dmg}.shadow -mountpoint /opt/local +else + new_install=1 + curl -fsSL -o macports.pkg "$macports_url" + time sudo installer -pkg macports.pkg -target / + # this is a throwaway environment, and it'd be a few lines to gin + # up a correct user / group when using the cache. + echo macportsuser root | sudo tee -a /opt/local/etc/macports/macports.conf +fi +export PATH=/opt/local/sbin/:/opt/local/bin/:$PATH + +# mark all installed packages unrequested, that allows us to detect +# packages that aren't needed anymore +if [ -n "$(port -q installed installed)" ] ; then + sudo port unsetrequested installed +fi + +# if setting all the required packages as requested fails, we need +# to install at least one of them +if ! sudo port setrequested $packages > /dev/null 2>&1 ; then + echo not all required packages installed, doing so now + update_cached_image=1 + # to keep the image small, we deleted the ports tree from the image... + sudo port selfupdate + # XXX likely we'll need some other way to force an upgrade at some + # point... + sudo port upgrade outdated + sudo port install -N $packages + sudo port setrequested $packages +fi + +# check if any ports should be uninstalled +if [ -n "$(port -q installed rleaves)" ] ; then + echo superflous packages installed + update_cached_image=1 + sudo port uninstall --follow-dependencies rleaves + + # remove prior cache contents, don't want to increase size + rm -f ${MACPORTS_CACHE}/* +fi + +# Shrink installation if we created / modified it +if [ "$new_install" -eq 1 -o "$update_cached_image" -eq 1 ]; then + sudo /opt/local/bin/port clean --all installed + sudo rm -rf /opt/local/var/macports/{software,sources}/* +fi + +# If we're starting from a clean cache, start a new image. If we have +# an image, but the contents changed, update the image in the cache +# location. +if [ "$new_install" -eq 1 ]; then + # use a generous size, so additional software can be installed later + time sudo hdiutil create -fs HFS+ -format UDRO -size 10g -layout NONE -srcfolder /opt/local/ ${cache_dmg} + time zstd -T -10 -z ${cache_dmg} -o ${MACPORTS_CACHE}/${cache_dmg}.zstd +elif [ "$update_cached_image" -eq 1 ]; then + sudo hdiutil detach /opt/local/ + time hdiutil convert -format UDRO ${cache_dmg} -shadow ${cache_dmg}.shadow -o updated.hfs.dmg + rm ${cache_dmg}.shadow + mv updated.hfs.dmg ${cache_dmg} + time zstd --force -T -10 -z ${cache_dmg} -o ${MACPORTS_CACHE}/${cache_dmg}.zstd + time sudo hdiutil attach -kernel ${cache_dmg} -owners on -shadow ${cache_dmg}.shadow -mountpoint /opt/local +fi diff --git a/third_party/spanner_pg/src/tools/ci/cores_backtrace.sh b/third_party/spanner_pg/src/tools/ci/cores_backtrace.sh new file mode 100755 index 00000000..28d3cecf --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/cores_backtrace.sh @@ -0,0 +1,50 @@ +#! /bin/sh + +if [ $# -ne 2 ]; then + echo "cores_backtrace.sh " + exit 1 +fi + +os=$1 +directory=$2 + +case $os in + freebsd|linux|macos) + ;; + *) + echo "unsupported operating system ${os}" + exit 1 + ;; +esac + +first=1 +for corefile in $(find "$directory" -type f) ; do + if [ "$first" -eq 1 ]; then + first=0 + else + # to make it easier to separate the different crash reports + echo -e '\n\n' + fi + + if [ "$os" = 'macos' ]; then + lldb -c $corefile --batch -o 'thread backtrace all' -o 'quit' + else + auxv=$(gdb --quiet --core ${corefile} --batch -ex 'info auxv' 2>/dev/null) + if [ $? -ne 0 ]; then + echo "could not process ${corefile}" + continue + fi + + if [ "$os" = 'freebsd' ]; then + binary=$(echo "$auxv" | grep AT_EXECPATH | perl -pe "s/^.*\"(.*)\"\$/\$1/g") + elif [ "$os" = 'linux' ]; then + binary=$(echo "$auxv" | grep AT_EXECFN | perl -pe "s/^.*\"(.*)\"\$/\$1/g") + else + echo 'should not get here' + exit 1 + fi + + echo "dumping ${corefile} for ${binary}" + gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" "$binary" "$corefile" 2>/dev/null + fi +done diff --git a/third_party/spanner_pg/src/tools/ci/gcp_freebsd_repartition.sh b/third_party/spanner_pg/src/tools/ci/gcp_freebsd_repartition.sh new file mode 100755 index 00000000..2d5e1738 --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/gcp_freebsd_repartition.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e +set -x + +# The default filesystem on freebsd gcp images is very slow to run tests on, +# due to its 32KB block size +# +# XXX: It'd probably better to fix this in the image, using something like +# https://people.freebsd.org/~lidl/blog/re-root.html + +# fix backup partition table after resize +gpart recover da0 +gpart show da0 +# kill swap, so we can delete a partition +swapoff -a || true +# (apparently we can only have 4!?) +gpart delete -i 3 da0 +gpart add -t freebsd-ufs -l data8k -a 4096 da0 +gpart show da0 +newfs -U -b 8192 /dev/da0p3 + +# Migrate working directory +du -hs $CIRRUS_WORKING_DIR +mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig +mkdir $CIRRUS_WORKING_DIR +mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR +cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/ diff --git a/third_party/spanner_pg/src/tools/ci/pg_ci_base.conf b/third_party/spanner_pg/src/tools/ci/pg_ci_base.conf new file mode 100644 index 00000000..d8faa9c2 --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/pg_ci_base.conf @@ -0,0 +1,14 @@ +# Tends to produce too many core files, taking a long time +restart_after_crash = false + +# So that tests using the "manually" started postgres on windows can use +# prepared statements +max_prepared_transactions = 10 + +# Settings that make logs more useful +log_autovacuum_min_duration = 0 +log_checkpoints = true +log_connections = true +log_disconnections = true +log_line_prefix = '%m [%p][%b] %q[%a][%v:%x] ' +log_lock_waits = true diff --git a/third_party/spanner_pg/src/tools/ci/windows_build_config.pl b/third_party/spanner_pg/src/tools/ci/windows_build_config.pl new file mode 100644 index 00000000..59268a0b --- /dev/null +++ b/third_party/spanner_pg/src/tools/ci/windows_build_config.pl @@ -0,0 +1,13 @@ +use strict; +use warnings; + +our $config; + +$config->{"tap_tests"} = 1; +$config->{"asserts"} = 1; + +$config->{"openssl"} = "c:/openssl/1.1/"; +$config->{"perl"} = "c:/strawberry/$ENV{DEFAULT_PERL_VERSION}/perl/"; +$config->{"python"} = "c:/python/"; + +1; diff --git a/third_party/spanner_pg/src/tools/copyright.pl b/third_party/spanner_pg/src/tools/copyright.pl index a55e6430..182177e9 100755 --- a/third_party/spanner_pg/src/tools/copyright.pl +++ b/third_party/spanner_pg/src/tools/copyright.pl @@ -2,7 +2,7 @@ ################################################################# # copyright.pl -- update copyright notices throughout the source tree, idempotently. # -# Copyright (c) 2011-2021, PostgreSQL Global Development Group +# Copyright (c) 2011-2022, PostgreSQL Global Development Group # # src/tools/copyright.pl # @@ -46,18 +46,23 @@ sub wanted my @lines; tie @lines, "Tie::File", $File::Find::name; + # We process all lines because some files have copyright + # strings embedded in them, e.g. src/bin/psql/help.c foreach my $line (@lines) { # We only care about lines with a copyright notice. next unless $line =~ m/$cc.*$pgdg/i; - # Skip line if already matches the current year; if not - # we get $year-$year, e.g. 2012-2012 + # Skip line if it already matches the current year; if not + # we get $year-$year, e.g. 2012-2012. next if $line =~ m/$cc $year, $pgdg/i; - # We process all lines because some files have copyright - # strings embedded in them, e.g. src/bin/psql/help.c + # Skip already-updated lines too, to avoid unnecessary + # file updates. + next if $line =~ m/$cc \d{4}-$year, $pgdg/i; + + # Apply the update, relying on Tie::File to write the file. $line =~ s/$cc (\d{4})-\d{4}, $pgdg/$ccliteral $1-$year, $pgdg/i; $line =~ s/$cc (\d{4}), $pgdg/$ccliteral $1-$year, $pgdg/i; } diff --git a/third_party/spanner_pg/src/tools/fix-old-flex-code.pl b/third_party/spanner_pg/src/tools/fix-old-flex-code.pl index 62b89e0e..8059cb56 100644 --- a/third_party/spanner_pg/src/tools/fix-old-flex-code.pl +++ b/third_party/spanner_pg/src/tools/fix-old-flex-code.pl @@ -8,7 +8,7 @@ # let's suppress it by inserting a dummy reference to the variable. # (That's exactly what 2.5.36 and later do ...) # -# 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 # # src/tools/fix-old-flex-code.pl diff --git a/third_party/spanner_pg/src/tools/gen_keywordlist.pl b/third_party/spanner_pg/src/tools/gen_keywordlist.pl index c8e72acf..348e905d 100644 --- a/third_party/spanner_pg/src/tools/gen_keywordlist.pl +++ b/third_party/spanner_pg/src/tools/gen_keywordlist.pl @@ -21,7 +21,7 @@ # Note that case folding works correctly only for all-ASCII keywords! # # -# 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 # # src/tools/gen_keywordlist.pl @@ -73,7 +73,7 @@ BEGIN * %s.h * List of keywords represented as a ScanKeywordList. * - * 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 * * NOTES diff --git a/third_party/spanner_pg/src/tools/git_changelog b/third_party/spanner_pg/src/tools/git_changelog index 30a64b37..189cfc88 100755 --- a/third_party/spanner_pg/src/tools/git_changelog +++ b/third_party/spanner_pg/src/tools/git_changelog @@ -1,6 +1,6 @@ #!/usr/bin/perl -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # src/tools/git_changelog @@ -59,7 +59,7 @@ require IPC::Open2; # (We could get this from "git branches", but not worth the trouble.) # NB: master must be first! my @BRANCHES = qw(master - REL_13_STABLE + REL_14_STABLE REL_13_STABLE REL_12_STABLE REL_11_STABLE REL_10_STABLE REL9_6_STABLE REL9_5_STABLE REL9_4_STABLE REL9_3_STABLE REL9_2_STABLE REL9_1_STABLE REL9_0_STABLE REL8_4_STABLE REL8_3_STABLE REL8_2_STABLE REL8_1_STABLE REL8_0_STABLE diff --git a/third_party/spanner_pg/src/tools/ifaddrs/Makefile b/third_party/spanner_pg/src/tools/ifaddrs/Makefile index 7cce9a5e..2abffafa 100644 --- a/third_party/spanner_pg/src/tools/ifaddrs/Makefile +++ b/third_party/spanner_pg/src/tools/ifaddrs/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/tools/ifaddrs # -# Copyright (c) 2003-2021, PostgreSQL Global Development Group +# Copyright (c) 2003-2022, PostgreSQL Global Development Group # # src/tools/ifaddrs/Makefile # diff --git a/third_party/spanner_pg/src/tools/make_ctags b/third_party/spanner_pg/src/tools/make_ctags index d8d18d15..9e952ce9 100755 --- a/third_party/spanner_pg/src/tools/make_ctags +++ b/third_party/spanner_pg/src/tools/make_ctags @@ -38,11 +38,10 @@ fi find `pwd`/ -type f -name '*.[chyl]' -print | xargs ctags -a -f tags "$FLAGS" -# Exuberant tags has a header that we cannot sort in with the other entries -# so we skip the sort step -# Why are we sorting this? I guess some tag implementation need this, -# particularly for append mode. bjm 2012-02-24 -if [ ! "$IS_EXUBERANT" ] +# Sorting non-Exuberant ctags file allows for fast searching of the tags file. +# Since etags file has a header that we cannot sort in with the other entries +# we skip the sort step. +if [ ! "$IS_EXUBERANT" -a ! "$EMACS_MODE" ] then LC_ALL=C export LC_ALL sort tags >/tmp/$$ && mv /tmp/$$ tags diff --git a/third_party/spanner_pg/src/tools/mark_pgdllimport.pl b/third_party/spanner_pg/src/tools/mark_pgdllimport.pl new file mode 100755 index 00000000..7b51ae3c --- /dev/null +++ b/third_party/spanner_pg/src/tools/mark_pgdllimport.pl @@ -0,0 +1,78 @@ +#!/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 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. +# +# It's probably a good idea to run pgindent on any files that this +# script modifies before committing. This script uses as arguments +# a list of the header files to scan for the markings. +# +# 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); + } +} diff --git a/third_party/spanner_pg/src/tools/msvc/Install.pm b/third_party/spanner_pg/src/tools/msvc/Install.pm index de22c9ba..8de79c61 100644 --- a/third_party/spanner_pg/src/tools/msvc/Install.pm +++ b/third_party/spanner_pg/src/tools/msvc/Install.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Install; @@ -441,6 +441,7 @@ sub CopyContribFiles # These configuration-based exclusions must match vcregress.pl next if ($d eq "uuid-ossp" && !defined($config->{uuid})); next if ($d eq "sslinfo" && !defined($config->{openssl})); + next if ($d eq "pgcrypto" && !defined($config->{openssl})); next if ($d eq "xml2" && !defined($config->{xml})); next if ($d =~ /_plperl$/ && !defined($config->{perl})); next if ($d =~ /_plpython$/ && !defined($config->{python})); @@ -633,7 +634,8 @@ sub CopyIncludeFiles CopyFiles( 'Libpq internal headers', $target . '/include/internal/', - 'src/interfaces/libpq/', 'libpq-int.h', 'pqexpbuffer.h'); + 'src/interfaces/libpq/', 'libpq-int.h', 'fe-auth-sasl.h', + 'pqexpbuffer.h'); CopyFiles( 'Internal headers', diff --git a/third_party/spanner_pg/src/tools/msvc/MSBuildProject.pm b/third_party/spanner_pg/src/tools/msvc/MSBuildProject.pm index 33595cce..f24d9e53 100644 --- a/third_party/spanner_pg/src/tools/msvc/MSBuildProject.pm +++ b/third_party/spanner_pg/src/tools/msvc/MSBuildProject.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package MSBuildProject; @@ -313,11 +313,8 @@ sub WriteItemDefinitionGroup my $targetmachine = $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64'; - my $includes = $self->{includes}; - unless ($includes eq '' or $includes =~ /;$/) - { - $includes .= ';'; - } + my $includes = join ';', @{ $self->{includes} }, ""; + print $f < diff --git a/third_party/spanner_pg/src/tools/msvc/Mkvcbuild.pm b/third_party/spanner_pg/src/tools/msvc/Mkvcbuild.pm index 62b00f3e..990c223a 100644 --- a/third_party/spanner_pg/src/tools/msvc/Mkvcbuild.pm +++ b/third_party/spanner_pg/src/tools/msvc/Mkvcbuild.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Mkvcbuild; @@ -35,26 +35,22 @@ my $libpq; my @unlink_on_exit; # Set of variables for modules in contrib/ and src/test/modules/ -my $contrib_defines = { 'refint' => 'REFINT_VERBOSE' }; -my @contrib_uselibpq = - ('dblink', 'oid2name', 'postgres_fdw', 'vacuumlo', 'libpq_pipeline'); -my @contrib_uselibpgport = ('libpq_pipeline', 'oid2name', 'vacuumlo'); -my @contrib_uselibpgcommon = ('libpq_pipeline', 'oid2name', 'vacuumlo'); -my $contrib_extralibs = { 'libpq_pipeline' => ['ws2_32.lib'] }; -my $contrib_extraincludes = { 'dblink' => ['src/backend'] }; -my $contrib_extrasource = { - 'cube' => [ 'contrib/cube/cubescan.l', 'contrib/cube/cubeparse.y' ], - 'seg' => [ 'contrib/seg/segscan.l', 'contrib/seg/segparse.y' ], -}; -my @contrib_excludes = ( - 'bool_plperl', 'commit_ts', - 'hstore_plperl', 'hstore_plpython', - 'intagg', 'jsonb_plperl', - 'jsonb_plpython', 'ltree_plpython', - 'pgcrypto', 'sepgsql', - 'brin', 'test_extensions', - 'test_misc', 'test_pg_dump', - 'snapshot_too_old', 'unsafe_tests'); +my $contrib_defines = {}; +my @contrib_uselibpq = (); +my @contrib_uselibpgport = (); +my @contrib_uselibpgcommon = (); +my $contrib_extralibs = { 'libpq_pipeline' => ['ws2_32.lib'] }; +my $contrib_extraincludes = {}; +my $contrib_extrasource = {}; +my @contrib_excludes = ( + 'bool_plperl', 'commit_ts', + 'hstore_plperl', 'hstore_plpython', + 'intagg', 'jsonb_plperl', + 'jsonb_plpython', 'ltree_plpython', + 'sepgsql', 'brin', + 'test_extensions', 'test_misc', + 'test_pg_dump', 'snapshot_too_old', + 'unsafe_tests'); # Set of variables for frontend modules my $frontend_defines = { 'initdb' => 'FRONTEND' }; @@ -103,16 +99,16 @@ sub mkvcbuild $solution = CreateSolution($vsVersion, $config); our @pgportfiles = qw( - chklocale.c explicit_bzero.c fls.c getpeereid.c getrusage.c inet_aton.c random.c - srandom.c getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c - erand48.c snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c + chklocale.c explicit_bzero.c fls.c getpeereid.c getrusage.c inet_aton.c + getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c + snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c dirent.c dlopen.c getopt.c getopt_long.c link.c pread.c preadv.c pwrite.c pwritev.c pg_bitutils.c pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c system.c - strerror.c tar.c thread.c - win32common.c win32env.c win32error.c win32fseek.c win32security.c - win32setlocale.c win32stat.c); + strerror.c tar.c + win32common.c win32env.c win32error.c win32fseek.c win32ntdll.c + win32security.c win32setlocale.c win32stat.c); push(@pgportfiles, 'strtof.c') if ($vsVersion < '14.00'); @@ -128,13 +124,13 @@ sub mkvcbuild } our @pgcommonallfiles = qw( - archive.c base64.c checksum_helper.c + archive.c base64.c checksum_helper.c compression.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 - pg_get_line.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c - saslprep.c scram-common.c string.c stringinfo.c unicode_norm.c username.c - wait_error.c wchar.c); + pg_get_line.c pg_lzcompress.c pg_prng.c pgfnames.c psprintf.c relpath.c + rmtree.c saslprep.c scram-common.c string.c stringinfo.c unicode_norm.c + username.c wait_error.c wchar.c); if ($solution->{options}->{openssl}) { @@ -288,6 +284,24 @@ sub mkvcbuild $libpqwalreceiver->AddIncludeDir('src/interfaces/libpq'); $libpqwalreceiver->AddReference($postgres, $libpq); + my $libpq_testclient = + $solution->AddProject('libpq_testclient', 'exe', 'misc', + 'src/interfaces/libpq/test'); + $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('libpq_uri_regress', 'exe', 'misc', + 'src/interfaces/libpq/test'); + $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'); + my $pgoutput = $solution->AddProject('pgoutput', 'dll', '', 'src/backend/replication/pgoutput'); $pgoutput->AddReference($postgres); @@ -378,7 +392,14 @@ sub mkvcbuild } my $pgbasebackup = AddSimpleFrontend('pg_basebackup', 1); + # This list of files has to match BBOBJS in pg_basebackup's Makefile. $pgbasebackup->AddFile('src/bin/pg_basebackup/pg_basebackup.c'); + $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_file.c'); + $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'); my $pgreceivewal = AddSimpleFrontend('pg_basebackup', 1); @@ -445,7 +466,8 @@ sub mkvcbuild if (!$solution->{options}->{openssl}) { - push @contrib_excludes, 'sslinfo', 'ssl_passphrase_callback'; + push @contrib_excludes, 'sslinfo', 'ssl_passphrase_callback', + 'pgcrypto'; } if (!$solution->{options}->{uuid}) @@ -453,41 +475,6 @@ sub mkvcbuild push @contrib_excludes, 'uuid-ossp'; } - # AddProject() does not recognize the constructs used to populate OBJS in - # the pgcrypto Makefile, so it will discover no files. - my $pgcrypto = - $solution->AddProject('pgcrypto', 'dll', 'crypto', 'contrib/pgcrypto'); - $pgcrypto->AddFiles( - 'contrib/pgcrypto', 'pgcrypto.c', - 'px.c', 'px-hmac.c', - 'px-crypt.c', 'crypt-gensalt.c', - 'crypt-blowfish.c', 'crypt-des.c', - 'crypt-md5.c', 'mbuf.c', - 'pgp.c', 'pgp-armor.c', - 'pgp-cfb.c', 'pgp-compress.c', - 'pgp-decrypt.c', 'pgp-encrypt.c', - 'pgp-info.c', 'pgp-mpi.c', - 'pgp-pubdec.c', 'pgp-pubenc.c', - 'pgp-pubkey.c', 'pgp-s2k.c', - 'pgp-pgsql.c'); - if ($solution->{options}->{openssl}) - { - $pgcrypto->AddFiles('contrib/pgcrypto', 'openssl.c', - 'pgp-mpi-openssl.c'); - } - else - { - $pgcrypto->AddFiles( - 'contrib/pgcrypto', 'internal.c', - 'internal-sha2.c', 'blf.c', - 'rijndael.c', 'pgp-mpi-internal.c', - 'imath.c'); - } - $pgcrypto->AddReference($postgres); - $pgcrypto->AddLibrary('ws2_32.lib'); - my $mf = Project::read_file('contrib/pgcrypto/Makefile'); - GenerateContribSqlFiles('pgcrypto', $mf); - foreach my $subdir ('contrib', 'src/test/modules') { opendir($D, $subdir) || croak "Could not opendir on $subdir!\n"; @@ -523,6 +510,11 @@ 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'); @@ -803,7 +795,7 @@ sub mkvcbuild } } - $mf = + my $mf = Project::read_file('src/backend/utils/mb/conversion_procs/Makefile'); $mf =~ s{\\\r?\n}{}g; $mf =~ m{SUBDIRS\s*=\s*(.*)$}m @@ -941,7 +933,7 @@ sub AddTransformModule # Add PL dependencies $p->AddIncludeDir($pl_src); $p->AddReference($pl_proj); - $p->AddIncludeDir($pl_proj->{includes}); + $p->AddIncludeDir($_) for @{ $pl_proj->{includes} }; foreach my $pl_lib (@{ $pl_proj->{libraries} }) { $p->AddLibrary($pl_lib); @@ -951,7 +943,7 @@ sub AddTransformModule if ($type_proj) { $p->AddIncludeDir($type_src); - $p->AddIncludeDir($type_proj->{includes}); + $p->AddIncludeDir($_) for @{ $type_proj->{includes} }; foreach my $type_lib (@{ $type_proj->{libraries} }) { $p->AddLibrary($type_lib); @@ -965,9 +957,10 @@ sub AddTransformModule # Add a simple contrib project sub AddContrib { - my $subdir = shift; - my $n = shift; - my $mf = Project::read_file("$subdir/$n/Makefile"); + my $subdir = shift; + my $n = shift; + my $mf = Project::read_file("$subdir/$n/Makefile"); + my @projects = (); if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg) { @@ -975,6 +968,7 @@ sub AddContrib my $proj = $solution->AddProject($dn, 'dll', 'contrib', "$subdir/$n"); $proj->AddReference($postgres); AdjustContribProj($proj); + push @projects, $proj; } elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg) { @@ -986,18 +980,91 @@ sub AddContrib $proj->AddFile("$subdir/$n/$filename"); $proj->AddReference($postgres); AdjustContribProj($proj); + push @projects, $proj; } } elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg) { my $proj = $solution->AddProject($1, 'exe', 'contrib', "$subdir/$n"); AdjustContribProj($proj); + push @projects, $proj; } else { croak "Could not determine contrib module type for $n\n"; } + # Process custom compiler flags + if ( $mf =~ /^PG_CPPFLAGS\s*=\s*(.*)$/mg + || $mf =~ /^override\s*CPPFLAGS\s*[+:]?=\s*(.*)$/mg) + { + foreach my $flag (split /\s+/, $1) + { + if ($flag =~ /^-D(.*)$/) + { + foreach my $proj (@projects) + { + $proj->AddDefine($1); + } + } + elsif ($flag =~ /^-I(.*)$/) + { + if ($1 eq '$(libpq_srcdir)') + { + foreach my $proj (@projects) + { + $proj->AddIncludeDir('src/interfaces/libpq'); + $proj->AddReference($libpq); + } + } + } + } + } + + if ($mf =~ /^SHLIB_LINK_INTERNAL\s*[+:]?=\s*(.*)$/mg) + { + foreach my $lib (split /\s+/, $1) + { + if ($lib eq '$(libpq)') + { + foreach my $proj (@projects) + { + $proj->AddIncludeDir('src/interfaces/libpq'); + $proj->AddReference($libpq); + } + } + } + } + + if ($mf =~ /^PG_LIBS_INTERNAL\s*[+:]?=\s*(.*)$/mg) + { + foreach my $lib (split /\s+/, $1) + { + if ($lib eq '$(libpq_pgport)') + { + foreach my $proj (@projects) + { + $proj->AddReference($libpgport); + $proj->AddReference($libpgcommon); + } + } + } + } + + foreach my $line (split /\n/, $mf) + { + if ($line =~ /^[A-Za-z0-9_]*\.o:\s(.*)/) + { + foreach my $file (split /\s+/, $1) + { + foreach my $proj (@projects) + { + $proj->AddDependantFiles("$subdir/$n/$file"); + } + } + } + } + # Are there any output data files to build? GenerateContribSqlFiles($n, $mf); return; diff --git a/third_party/spanner_pg/src/tools/msvc/Project.pm b/third_party/spanner_pg/src/tools/msvc/Project.pm index 2f1679ab..570bab56 100644 --- a/third_party/spanner_pg/src/tools/msvc/Project.pm +++ b/third_party/spanner_pg/src/tools/msvc/Project.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Project; @@ -30,11 +30,11 @@ sub _new references => [], libraries => [], suffixlib => [], - includes => '', + includes => [], prefixincludes => '', defines => ';', solution => $solution, - disablewarnings => '4018;4244;4273;4102;4090;4267', + disablewarnings => '4018;4244;4273;4101;4102;4090;4267', disablelinkerwarnings => '', platform => $solution->{platform}, }; @@ -47,10 +47,19 @@ sub AddFile { my ($self, $filename) = @_; + $self->FindAndAddAdditionalFiles($filename); $self->{files}->{$filename} = 1; return; } +sub AddDependantFiles +{ + my ($self, $filename) = @_; + + $self->FindAndAddAdditionalFiles($filename); + return; +} + sub AddFiles { my $self = shift; @@ -58,11 +67,39 @@ sub AddFiles while (my $f = shift) { - $self->{files}->{ $dir . "/" . $f } = 1; + $self->AddFile($dir . "/" . $f, 1); } return; } +# Handle Makefile rules by searching for other files which exist with the same +# name but a different file extension and add those files too. +sub FindAndAddAdditionalFiles +{ + my $self = shift; + my $fname = shift; + $fname =~ /(.*)(\.[^.]+)$/; + my $filenoext = $1; + my $fileext = $2; + + # For .c files, check if either a .l or .y file of the same name + # exists and add that too. + if ($fileext eq ".c") + { + my $file = $filenoext . ".l"; + if (-e $file) + { + $self->AddFile($file); + } + + $file = $filenoext . ".y"; + if (-e $file) + { + $self->AddFile($file); + } + } +} + sub ReplaceFile { my ($self, $filename, $newname) = @_; @@ -77,14 +114,14 @@ sub ReplaceFile if ($file eq $filename) { delete $self->{files}{$file}; - $self->{files}{$newname} = 1; + $self->AddFile($newname); return; } } elsif ($file =~ m/($re)/) { delete $self->{files}{$file}; - $self->{files}{"$newname/$filename"} = 1; + $self->AddFile("$newname/$filename"); return; } } @@ -124,7 +161,10 @@ sub AddReference while (my $ref = shift) { - push @{ $self->{references} }, $ref; + if (!grep { $_ eq $ref } @{ $self->{references} }) + { + push @{ $self->{references} }, $ref; + } $self->AddLibrary( "__CFGNAME__/" . $ref->{name} . "/" . $ref->{name} . ".lib"); } @@ -141,7 +181,11 @@ sub AddLibrary $lib = '"' . $lib . """; } - push @{ $self->{libraries} }, $lib; + if (!grep { $_ eq $lib } @{ $self->{libraries} }) + { + push @{ $self->{libraries} }, $lib; + } + if ($dbgsuffix) { push @{ $self->{suffixlib} }, $lib; @@ -151,13 +195,15 @@ sub AddLibrary sub AddIncludeDir { - my ($self, $inc) = @_; + my ($self, $incstr) = @_; - if ($self->{includes} ne '') + foreach my $inc (split(/;/, $incstr)) { - $self->{includes} .= ';'; + if (!grep { $_ eq $inc } @{ $self->{includes} }) + { + push @{ $self->{includes} }, $inc; + } } - $self->{includes} .= $inc; return; } @@ -259,11 +305,11 @@ sub AddDir if ($f =~ /^\$\(top_builddir\)\/(.*)/) { $f = $1; - $self->{files}->{$f} = 1; + $self->AddFile($f); } else { - $self->{files}->{"$reldir/$f"} = 1; + $self->AddFile("$reldir/$f"); } } $mf =~ s{OBJS[^=]*=\s*(.*)$}{}m; diff --git a/third_party/spanner_pg/src/tools/msvc/Solution.pm b/third_party/spanner_pg/src/tools/msvc/Solution.pm index 577b5afe..a53239fa 100644 --- a/third_party/spanner_pg/src/tools/msvc/Solution.pm +++ b/third_party/spanner_pg/src/tools/msvc/Solution.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Solution; @@ -205,10 +205,6 @@ sub GenerateFiles # Every symbol in pg_config.h.in must be accounted for here. Set # to undef if the symbol should not be defined. my %define = ( - ACCEPT_TYPE_ARG1 => 'unsigned int', - ACCEPT_TYPE_ARG2 => 'struct sockaddr *', - ACCEPT_TYPE_ARG3 => 'int', - ACCEPT_TYPE_RETURN => 'unsigned int PASCAL', ALIGNOF_DOUBLE => 8, ALIGNOF_INT => 4, ALIGNOF_LONG => 4, @@ -220,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, @@ -229,7 +226,6 @@ sub GenerateFiles HAVE_ATOMICS => 1, HAVE_ATOMIC_H => undef, HAVE_BACKTRACE_SYMBOLS => undef, - HAVE_BIO_GET_DATA => undef, HAVE_BIO_METH_NEW => undef, HAVE_CLOCK_GETTIME => undef, HAVE_COMPUTED_GOTO => undef, @@ -249,6 +245,7 @@ sub GenerateFiles HAVE_DECL_PWRITEV => 0, HAVE_DECL_RTLD_GLOBAL => 0, HAVE_DECL_RTLD_NOW => 0, + HAVE_DECL_SIGWAIT => 0, HAVE_DECL_STRLCAT => 0, HAVE_DECL_STRLCPY => 0, HAVE_DECL_STRNLEN => 1, @@ -290,6 +287,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, @@ -314,11 +312,11 @@ 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, HAVE_LONG_LONG_INT_64 => 1, - HAVE_LZ4_H => undef, HAVE_MBARRIER_H => undef, HAVE_MBSTOWCS_L => 1, HAVE_MEMORY_H => 1, @@ -332,6 +330,7 @@ sub GenerateFiles HAVE_PAM_PAM_APPL_H => undef, HAVE_POLL => undef, HAVE_POLL_H => undef, + HAVE_POSIX_DECL_SIGWAIT => undef, HAVE_POSIX_FADVISE => undef, HAVE_POSIX_FALLOCATE => undef, HAVE_PPC_LWARX_MUTEX_HINT => undef, @@ -344,27 +343,26 @@ sub GenerateFiles HAVE_PTHREAD_IS_THREADED_NP => undef, HAVE_PTHREAD_PRIO_INHERIT => undef, HAVE_PWRITE => undef, - HAVE_RANDOM => undef, HAVE_READLINE_H => undef, HAVE_READLINE_HISTORY_H => undef, HAVE_READLINE_READLINE_H => undef, HAVE_READLINK => undef, HAVE_READV => undef, - HAVE_RL_COMPLETION_APPEND_CHARACTER => undef, - HAVE_RL_COMPLETION_MATCHES => undef, + HAVE_RL_COMPLETION_MATCHES => undef, HAVE_RL_COMPLETION_SUPPRESS_QUOTE => undef, HAVE_RL_FILENAME_COMPLETION_FUNCTION => undef, HAVE_RL_FILENAME_QUOTE_CHARACTERS => undef, HAVE_RL_FILENAME_QUOTING_FUNCTION => undef, HAVE_RL_RESET_SCREEN_SIZE => undef, + HAVE_RL_VARIABLE_BIND => undef, HAVE_SECURITY_PAM_APPL_H => undef, HAVE_SETENV => undef, HAVE_SETPROCTITLE => undef, HAVE_SETPROCTITLE_FAST => undef, HAVE_SETSID => undef, HAVE_SHM_OPEN => undef, + HAVE_SOCKLEN_T => 1, HAVE_SPINLOCKS => 1, - HAVE_SRANDOM => undef, HAVE_STDBOOL_H => 1, HAVE_STDINT_H => 1, HAVE_STDLIB_H => 1, @@ -511,6 +509,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}, @@ -541,9 +540,13 @@ sub GenerateFiles if ($self->{options}->{lz4}) { $define{HAVE_LIBLZ4} = 1; - $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; @@ -562,7 +565,6 @@ sub GenerateFiles || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')) { $define{HAVE_ASN1_STRING_GET0_DATA} = 1; - $define{HAVE_BIO_GET_DATA} = 1; $define{HAVE_BIO_METH_NEW} = 1; $define{HAVE_HMAC_CTX_FREE} = 1; $define{HAVE_HMAC_CTX_NEW} = 1; @@ -1093,6 +1095,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'); @@ -1205,6 +1212,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/third_party/spanner_pg/src/tools/msvc/VSObjectFactory.pm b/third_party/spanner_pg/src/tools/msvc/VSObjectFactory.pm index a865604a..9f9712b7 100644 --- a/third_party/spanner_pg/src/tools/msvc/VSObjectFactory.pm +++ b/third_party/spanner_pg/src/tools/msvc/VSObjectFactory.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package VSObjectFactory; diff --git a/third_party/spanner_pg/src/tools/msvc/build.pl b/third_party/spanner_pg/src/tools/msvc/build.pl index 4c51d8b2..e5ce14d7 100644 --- a/third_party/spanner_pg/src/tools/msvc/build.pl +++ b/third_party/spanner_pg/src/tools/msvc/build.pl @@ -1,6 +1,6 @@ # -*-perl-*- hey - emacs - this is a perl file -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Script that provides 'make' functionality for msvc builds. diff --git a/third_party/spanner_pg/src/tools/msvc/config_default.pl b/third_party/spanner_pg/src/tools/msvc/config_default.pl index 460c0375..186849a0 100644 --- a/third_party/spanner_pg/src/tools/msvc/config_default.pl +++ b/third_party/spanner_pg/src/tools/msvc/config_default.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # Configuration arguments for vcbuild. use strict; @@ -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/third_party/spanner_pg/src/tools/msvc/dummylib/Win32.pm b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32.pm index d47e59a6..1c7e3d33 100644 --- a/third_party/spanner_pg/src/tools/msvc/dummylib/Win32.pm +++ b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Win32; use strict; diff --git a/third_party/spanner_pg/src/tools/msvc/dummylib/Win32/Registry.pm b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32/Registry.pm index 73bd8984..d995432a 100644 --- a/third_party/spanner_pg/src/tools/msvc/dummylib/Win32/Registry.pm +++ b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32/Registry.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Win32::Registry; diff --git a/third_party/spanner_pg/src/tools/msvc/dummylib/Win32API/File.pm b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32API/File.pm index b74d28fc..d77e48bf 100644 --- a/third_party/spanner_pg/src/tools/msvc/dummylib/Win32API/File.pm +++ b/third_party/spanner_pg/src/tools/msvc/dummylib/Win32API/File.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group package Win32API::File; diff --git a/third_party/spanner_pg/src/tools/msvc/gendef.pl b/third_party/spanner_pg/src/tools/msvc/gendef.pl index 71c18580..b8c514a8 100644 --- a/third_party/spanner_pg/src/tools/msvc/gendef.pl +++ b/third_party/spanner_pg/src/tools/msvc/gendef.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/tools/msvc/install.pl b/third_party/spanner_pg/src/tools/msvc/install.pl index 45276d0d..142d0dd1 100755 --- a/third_party/spanner_pg/src/tools/msvc/install.pl +++ b/third_party/spanner_pg/src/tools/msvc/install.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Script that provides 'make install' functionality for msvc builds diff --git a/third_party/spanner_pg/src/tools/msvc/mkvcbuild.pl b/third_party/spanner_pg/src/tools/msvc/mkvcbuild.pl index 3749e7f2..7c9f7ce1 100644 --- a/third_party/spanner_pg/src/tools/msvc/mkvcbuild.pl +++ b/third_party/spanner_pg/src/tools/msvc/mkvcbuild.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # Script that parses Unix style build environment and generates build files diff --git a/third_party/spanner_pg/src/tools/msvc/pgbison.pl b/third_party/spanner_pg/src/tools/msvc/pgbison.pl index e83c0b1f..3974c30d 100644 --- a/third_party/spanner_pg/src/tools/msvc/pgbison.pl +++ b/third_party/spanner_pg/src/tools/msvc/pgbison.pl @@ -1,6 +1,6 @@ # -*-perl-*- hey - emacs - this is a perl file -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # src/tools/msvc/pgbison.pl diff --git a/third_party/spanner_pg/src/tools/msvc/pgflex.pl b/third_party/spanner_pg/src/tools/msvc/pgflex.pl index 0728b85d..eb319838 100644 --- a/third_party/spanner_pg/src/tools/msvc/pgflex.pl +++ b/third_party/spanner_pg/src/tools/msvc/pgflex.pl @@ -1,6 +1,6 @@ # -*-perl-*- hey - emacs - this is a perl file -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # src/tools/msvc/pgflex.pl diff --git a/third_party/spanner_pg/src/tools/msvc/vcregress.pl b/third_party/spanner_pg/src/tools/msvc/vcregress.pl index c269ad28..74fb735e 100644 --- a/third_party/spanner_pg/src/tools/msvc/vcregress.pl +++ b/third_party/spanner_pg/src/tools/msvc/vcregress.pl @@ -1,6 +1,6 @@ # -*-perl-*- hey - emacs - this is a perl file -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # src/tools/msvc/vcregress.pl @@ -70,10 +70,10 @@ copy("$Config/dummy_seclabel/dummy_seclabel.dll", "src/test/regress"); # Configuration settings used by TAP tests -$ENV{with_ssl} = $config->{openssl} ? 'openssl' : 'no'; -$ENV{with_ldap} = $config->{ldap} ? 'yes' : 'no'; -$ENV{with_icu} = $config->{icu} ? 'yes' : 'no'; -$ENV{with_gssapi} = $config->{gss} ? 'yes' : 'no'; +$ENV{with_ssl} = $config->{openssl} ? 'openssl' : 'no'; +$ENV{with_ldap} = $config->{ldap} ? 'yes' : 'no'; +$ENV{with_icu} = $config->{icu} ? 'yes' : 'no'; +$ENV{with_gssapi} = $config->{gss} ? 'yes' : 'no'; $ENV{with_krb_srvnam} = $config->{krb_srvnam} || 'postgres'; $ENV{with_readline} = 'no'; @@ -108,7 +108,7 @@ ISOLATIONCHECK => \&isolationcheck, BINCHECK => \&bincheck, RECOVERYCHECK => \&recoverycheck, - UPGRADECHECK => \&upgradecheck, + UPGRADECHECK => \&upgradecheck, # no-op TAPTEST => \&taptest,); my $proc = $command{$what}; @@ -146,6 +146,7 @@ sub set_command_env { set_single_env('GZIP_PROGRAM', 'gzip'); set_single_env('LZ4', 'lz4'); + set_single_env('ZSTD', 'zstd'); } sub installcheck_internal @@ -162,8 +163,7 @@ sub installcheck_internal "--dlpath=.", "--bindir=../../../$Config/psql", "--schedule=${schedule}_schedule", - "--max-concurrent-tests=20", - "--make-testtablespace-dir"); + "--max-concurrent-tests=20"); push(@args, $maxconn) if $maxconn; push(@args, @EXTRA_REGRESS_OPTS); system(@args); @@ -196,7 +196,6 @@ sub check "--bindir=", "--schedule=${schedule}_schedule", "--max-concurrent-tests=20", - "--make-testtablespace-dir", "--encoding=SQL_ASCII", "--no-locale", "--temp-instance=./tmp_check"); @@ -317,6 +316,7 @@ sub bincheck foreach my $dir (@bin_dirs) { next unless -d "$dir/t"; + my $status = tap_check($dir); $mstat ||= $status; } @@ -348,55 +348,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"; @@ -420,8 +371,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 @@ -431,8 +381,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') { @@ -496,28 +444,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 = ( @@ -539,6 +465,7 @@ sub contribcheck # these configuration-based exclusions must match Install.pm next if ($module eq "uuid-ossp" && !defined($config->{uuid})); next if ($module eq "sslinfo" && !defined($config->{openssl})); + next if ($module eq "pgcrypto" && !defined($config->{openssl})); next if ($module eq "xml2" && !defined($config->{xml})); next if ($module =~ /_plperl$/ && !defined($config->{perl})); next if ($module =~ /_plpython$/ && !defined($config->{python})); @@ -570,7 +497,6 @@ sub recoverycheck { InstallTemp(); - my $mstat = 0; my $dir = "$topdir/src/test/recovery"; my $status = tap_check($dir); exit $status if $status; @@ -602,111 +528,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 { - 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); - 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); - } + # 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; } @@ -747,7 +573,6 @@ sub fetchRegressOpts # list is returned if the module does not need to run anything. sub fetchTests { - my $handle; open($handle, '<', "GNUmakefile") || open($handle, '<', "Makefile") @@ -774,18 +599,13 @@ sub fetchTests if ($m =~ /contrib\/pgcrypto/) { - # pgcrypto is special since the tests depend on the + # pgcrypto is special since some tests depend on the # configuration of the build - my $cftests = - $config->{openssl} - ? GetTests("OSSL_TESTS", $m) - : GetTests("INT_TESTS", $m); my $pgptests = $config->{zlib} ? GetTests("ZLIB_TST", $m) : GetTests("ZLIB_OFF_TST", $m); - $t =~ s/\$\(CF_TESTS\)/$cftests/; $t =~ s/\$\(CF_PGP_TESTS\)/$pgptests/; } } @@ -818,7 +638,7 @@ sub InstallTemp sub usage { print STDERR - "Usage: vcregress.pl [ ]\n\n", + "Usage: vcregress.pl []\n\n", "Options for :\n", " bincheck run tests of utilities in src/bin/\n", " check deploy instance and run regression tests on it\n", @@ -830,7 +650,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", diff --git a/third_party/spanner_pg/src/tools/perlcheck/perlcriticrc b/third_party/spanner_pg/src/tools/perlcheck/perlcriticrc index e230111b..9267fb43 100644 --- a/third_party/spanner_pg/src/tools/perlcheck/perlcriticrc +++ b/third_party/spanner_pg/src/tools/perlcheck/perlcriticrc @@ -22,3 +22,10 @@ verbose = %f: %m at line %l, column %c. %e. ([%p] Severity: %s)\n # insist on use of the warnings pragma [TestingAndDebugging::RequireUseWarnings] severity = 5 + +# forbid grep and map in void context +[BuiltinFunctions::ProhibitVoidGrep] +severity = 5 + +[BuiltinFunctions::ProhibitVoidMap] +severity = 5 diff --git a/third_party/spanner_pg/src/tools/perlcheck/pgperlsyncheck b/third_party/spanner_pg/src/tools/perlcheck/pgperlsyncheck index 74f1584b..730f5927 100755 --- a/third_party/spanner_pg/src/tools/perlcheck/pgperlsyncheck +++ b/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/tools/pginclude/cpluspluscheck b/third_party/spanner_pg/src/tools/pginclude/cpluspluscheck index e52d5e42..42688fff 100755 --- a/third_party/spanner_pg/src/tools/pginclude/cpluspluscheck +++ b/third_party/spanner_pg/src/tools/pginclude/cpluspluscheck @@ -13,7 +13,7 @@ # No output if everything is OK, else compiler errors. # # src/tools/pginclude/cpluspluscheck -# Copyright (c) 2009-2021, PostgreSQL Global Development Group +# Copyright (c) 2009-2022, PostgreSQL Global Development Group if [ -z "$1" ]; then srcdir="." @@ -75,6 +75,7 @@ do test "$f" = src/include/port/win32/sys/socket.h && continue test "$f" = src/include/port/win32_msvc/dirent.h && continue test "$f" = src/include/port/win32_msvc/utime.h && continue + test "$f" = src/include/port/win32ntdll.h && continue test "$f" = src/port/pthread-win32.h && continue # Likewise, these files are platform-specific, and the one @@ -114,6 +115,7 @@ do # Also not meant to be included standalone. test "$f" = src/include/common/unicode_combining_table.h && continue + test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue # We can't make these Bison output files compilable standalone # without using "%code require", which old Bison versions lack. diff --git a/third_party/spanner_pg/src/tools/pginclude/headerscheck b/third_party/spanner_pg/src/tools/pginclude/headerscheck index 5dab5553..f8b0674a 100755 --- a/third_party/spanner_pg/src/tools/pginclude/headerscheck +++ b/third_party/spanner_pg/src/tools/pginclude/headerscheck @@ -13,7 +13,7 @@ # No output if everything is OK, else compiler errors. # # src/tools/pginclude/headerscheck -# Copyright (c) 2009-2021, PostgreSQL Global Development Group +# Copyright (c) 2009-2022, PostgreSQL Global Development Group if [ -z "$1" ]; then srcdir="." @@ -71,6 +71,7 @@ do test "$f" = src/include/port/win32/sys/socket.h && continue test "$f" = src/include/port/win32_msvc/dirent.h && continue test "$f" = src/include/port/win32_msvc/utime.h && continue + test "$f" = src/include/port/win32ntdll.h && continue test "$f" = src/port/pthread-win32.h && continue # Likewise, these files are platform-specific, and the one @@ -110,6 +111,7 @@ do # Also not meant to be included standalone. test "$f" = src/include/common/unicode_combining_table.h && continue + test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue # We can't make these Bison output files compilable standalone # without using "%code require", which old Bison versions lack. diff --git a/third_party/spanner_pg/src/tools/pginclude/pgcheckdefines b/third_party/spanner_pg/src/tools/pginclude/pgcheckdefines index d6565b28..e46a7561 100755 --- a/third_party/spanner_pg/src/tools/pginclude/pgcheckdefines +++ b/third_party/spanner_pg/src/tools/pginclude/pgcheckdefines @@ -1,6 +1,6 @@ #! /usr/bin/perl -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group # # This script looks for symbols that are referenced in #ifdef or defined() diff --git a/third_party/spanner_pg/src/tools/pgindent/README b/third_party/spanner_pg/src/tools/pgindent/README index 74412d29..103970c1 100644 --- a/third_party/spanner_pg/src/tools/pgindent/README +++ b/third_party/spanner_pg/src/tools/pgindent/README @@ -82,7 +82,8 @@ you used. 4) Add the newly created commits to the .git-blame-ignore-revs file so that "git blame" ignores the commits (for anybody that has opted-in - to using the ignore file). + to using the ignore file). Follow the instructions that appear at + the top of the .git-blame-ignore-revs file. Another "git commit" will be required for your ignore file changes. diff --git a/third_party/spanner_pg/src/tools/pgindent/pgindent b/third_party/spanner_pg/src/tools/pgindent/pgindent index f8190b6c..2ef07bb9 100755 --- a/third_party/spanner_pg/src/tools/pgindent/pgindent +++ b/third_party/spanner_pg/src/tools/pgindent/pgindent @@ -1,6 +1,6 @@ #!/usr/bin/perl -# Copyright (c) 2021, PostgreSQL Global Development Group +# Copyright (c) 2021-2022, PostgreSQL Global Development Group use strict; use warnings; diff --git a/third_party/spanner_pg/src/tools/pgindent/typedefs.list b/third_party/spanner_pg/src/tools/pgindent/typedefs.list index 7b956590..2f9ae17e 100644 --- a/third_party/spanner_pg/src/tools/pgindent/typedefs.list +++ b/third_party/spanner_pg/src/tools/pgindent/typedefs.list @@ -4,6 +4,7 @@ ACL_SIZE_INFORMATION AFFIX ASN1_INTEGER ASN1_OBJECT +ASN1_OCTET_STRING ASN1_STRING AV A_ArrayExpr @@ -63,6 +64,7 @@ AllocSetFreeList AllocateDesc AllocateDescKind AlterCollationStmt +AlterDatabaseRefreshCollStmt AlterDatabaseSetStmt AlterDatabaseStmt AlterDefaultPrivilegesStmt @@ -80,6 +82,7 @@ AlterOpFamilyStmt AlterOperatorStmt AlterOwnerStmt AlterPolicyStmt +AlterPublicationAction AlterPublicationStmt AlterRoleSetStmt AlterRoleStmt @@ -113,14 +116,21 @@ Append AppendPath AppendRelInfo AppendState +ApplyErrorCallbackArg ApplyExecutionData ApplySubXactData Archive +ArchiveCheckConfiguredCB ArchiveEntryPtrType +ArchiveFileCB ArchiveFormat ArchiveHandle ArchiveMode +ArchiveModuleCallbacks +ArchiveModuleInit ArchiveOpts +ArchiveShutdownCB +ArchiveStreamState ArchiverOutput ArchiverStage ArrayAnalyzeExtraData @@ -152,6 +162,7 @@ AttrMissing AttrNumber AttributeOpts AuthRequest +AuthToken AutoPrewarmSharedState AutoVacOpts AutoVacuumShmemStruct @@ -224,6 +235,8 @@ BackgroundWorkerHandle BackgroundWorkerSlot Barrier BaseBackupCmd +BaseBackupTargetHandle +BaseBackupTargetType BeginDirectModify_function BeginForeignInsert_function BeginForeignModify_function @@ -235,6 +248,7 @@ BgwHandleStatus BinaryArithmFunc BindParamCbData BipartiteMatchState +BitString BitmapAnd BitmapAndPath BitmapAndState @@ -269,11 +283,11 @@ BloomScanOpaqueData BloomSignatureWord BloomState BloomTuple -BlowfishContext BoolAggState BoolExpr BoolExprType BoolTestType +Boolean BooleanTest BpChar BrinBuildState @@ -334,6 +348,7 @@ CachedPlanSource CallContext CallStmt CancelRequestPacket +Cardinality CaseExpr CaseTestExpr CaseWhen @@ -344,6 +359,7 @@ CatCTup CatCache CatCacheHeader CatalogId +CatalogIdMapEntry CatalogIndexState ChangeVarNodes_context CheckPoint @@ -411,6 +427,7 @@ CompositeIOData CompositeTypeStmt CompoundAffixFlag CompressionAlgorithm +CompressionLocation CompressorState ComputeXidHorizonsResult ConditionVariable @@ -424,7 +441,6 @@ ConnParams ConnStatusType ConnType ConnectionStateEnum -ConnsAllowedState ConsiderSplitContext Const ConstrCheck @@ -444,6 +460,7 @@ CopyDest CopyFormatOptions CopyFromState CopyFromStateData +CopyHeaderChoice CopyInsertMethod CopyMultiInsertBuffer CopyMultiInsertInfo @@ -459,6 +476,8 @@ CoverPos CreateAmStmt CreateCastStmt CreateConversionStmt +CreateDBRelInfo +CreateDBStrategy CreateDomainStmt CreateEnumStmt CreateEventTrigStmt @@ -532,6 +551,7 @@ DeadLockState DeallocateStmt DeclareCursorStmt DecodedBkpBlock +DecodedXLogRecord DecodingOutputState DefElem DefElemAction @@ -577,8 +597,10 @@ DumpComponents DumpId DumpOptions DumpSignalInformation +DumpableAcl DumpableObject DumpableObjectType +DumpableObjectWithAcl DynamicFileList DynamicZoneAbbrev EC_KEY @@ -589,6 +611,7 @@ EOM_get_flat_size_method EPQState EPlan EState +EStatus EVP_CIPHER EVP_CIPHER_CTX EVP_MD @@ -606,6 +629,7 @@ EndDirectModify_function EndForeignInsert_function EndForeignModify_function EndForeignScan_function +EndOfWalRecoveryInfo EndSampleScan_function EnumItem EolType @@ -629,9 +653,9 @@ EventTriggerInfo EventTriggerQueryState ExceptionLabelMap ExceptionMap -ExclusiveBackupState ExecAuxRowMark ExecEvalBoolSubroutine +ExecEvalJsonExprContext ExecEvalSubroutine ExecForeignBatchInsert_function ExecForeignDelete_function @@ -684,14 +708,12 @@ ExtensibleNodeEntry ExtensibleNodeMethods ExtensionControlFile ExtensionInfo -ExtensionMemberId ExtensionVersionInfo FDWCollateState FD_SET FILE FILETIME -FILE_INFORMATION_CLASS -FILE_STANDARD_INFORMATION +FPI FSMAddress FSMPage FSMPageData @@ -708,6 +730,7 @@ File FileFdwExecutionState FileFdwPlanState FileNameMap +FileSet FileTag FinalPathExtraData FindColsContext @@ -717,6 +740,7 @@ FixedParallelExecutorState FixedParallelState FixedParamState FlagMode +Float FlushPosition FmgrBuiltin FmgrHookEventType @@ -776,6 +800,7 @@ FormData_pg_partitioned_table FormData_pg_policy FormData_pg_proc FormData_pg_publication +FormData_pg_publication_namespace FormData_pg_publication_rel FormData_pg_range FormData_pg_replication_origin @@ -785,6 +810,7 @@ FormData_pg_sequence_data FormData_pg_shdepend FormData_pg_statistic FormData_pg_statistic_ext +FormData_pg_statistic_ext_data FormData_pg_subscription FormData_pg_subscription_rel FormData_pg_tablespace @@ -832,6 +858,7 @@ Form_pg_partitioned_table Form_pg_policy Form_pg_proc Form_pg_publication +Form_pg_publication_namespace Form_pg_publication_rel Form_pg_range Form_pg_replication_origin @@ -841,6 +868,7 @@ Form_pg_sequence_data Form_pg_shdepend Form_pg_statistic Form_pg_statistic_ext +Form_pg_statistic_ext_data Form_pg_subscription Form_pg_subscription_rel Form_pg_tablespace @@ -907,6 +935,7 @@ GISTSearchItem GISTTYPE GIST_SPLITVEC GMReaderTupleBuffer +GROUP GV Gather GatherMerge @@ -965,12 +994,13 @@ GistHstoreOptions GistInetKey GistNSN GistOptBufferingMode -GistSortedBuildPageState +GistSortedBuildLevelState GistSplitUnion GistSplitVector GistTsVectorOptions GistVacState GlobalTransaction +GlobalVisHorizonKind GlobalVisState GrantRoleStmt GrantStmt @@ -1011,7 +1041,6 @@ HASHELEMENT HASHHDR HASHSEGMENT HASH_SEQ_STATUS -HCRYPTPROV HE HEntry HIST_ENTRY @@ -1054,10 +1083,8 @@ HashScanPosData HashScanPosItem HashSkewBucket HashState -HashTapeInfo HashValueFunc HbaLine -HbaToken HeadlineJsonState HeadlineParsedText HeadlineWordEntry @@ -1079,7 +1106,6 @@ INFIX INT128 INTERFACE_INFO IOFuncSelector -IO_STATUS_BLOCK IPCompareMethod ITEM IV @@ -1150,13 +1176,14 @@ Instrumentation Int128AggState Int8TransTypeData IntRBTreeNode +Integer IntegerSet InternalDefaultACL InternalGrant Interval IntoClause -InvalidationChunk -InvalidationListHeader +InvalMessageArray +InvalidationMsgsGroup IpcMemoryId IpcMemoryKey IpcMemoryState @@ -1198,10 +1225,31 @@ JoinState JoinType JsObject JsValue +JsonAggConstructor JsonAggState +JsonArgument +JsonArrayAgg +JsonArrayConstructor +JsonArrayQueryConstructor JsonBaseObjectInfo +JsonBehavior +JsonBehaviorType +JsonCoercion +JsonCommon +JsonConstructorExpr +JsonConstructorType +JsonEncoding +JsonExpr +JsonExprOp +JsonFormat +JsonFormatType +JsonFunc +JsonFuncExpr JsonHashEntry +JsonIsPredicate +JsonItemCoercions JsonIterateStringValuesAction +JsonKeyValue JsonLexContext JsonLikeRegexContext JsonManifestFileField @@ -1209,10 +1257,15 @@ JsonManifestParseContext JsonManifestParseState JsonManifestSemanticState JsonManifestWALRangeField +JsonObjectAgg +JsonObjectConstructor +JsonOutput JsonParseContext JsonParseErrorType +JsonParseExpr JsonPath JsonPathBool +JsonPathDatatypeStatus JsonPathExecContext JsonPathExecResult JsonPathGinAddPathItemFunc @@ -1225,16 +1278,30 @@ JsonPathGinPathItem JsonPathItem JsonPathItemType JsonPathKeyword +JsonPathMutableContext JsonPathParseItem JsonPathParseResult JsonPathPredicateCallback JsonPathString +JsonPathVarCallback +JsonPathVariableEvalContext +JsonQuotes +JsonReturning +JsonScalarExpr JsonSemAction JsonTokenType JsonTransformStringValuesAction JsonTypeCategory +JsonUniqueBuilderState +JsonUniqueCheckState +JsonUniqueHashEntry +JsonUniqueParsingState +JsonUniqueStackEntry +JsonValueExpr JsonValueList JsonValueListIterator +JsonValueType +JsonWrapper Jsonb JsonbAggState JsonbContainer @@ -1249,6 +1316,8 @@ JsonbTypeCategory JsonbValue JumbleState JunkFilter +KeyAction +KeyActions KeyArray KeySuffix KeyWord @@ -1292,6 +1361,7 @@ LPBYTE LPCTSTR LPCWSTR LPDWORD +LPFILETIME LPSECURITY_ATTRIBUTES LPSERVICE_STATUS LPSTR @@ -1301,17 +1371,18 @@ LPVOID LPWSTR LSEG LUID -LVDeadTuples LVPagePruneState -LVParallelState LVRelState LVSavedErrInfo -LVShared -LVSharedIndStats LWLock LWLockHandle LWLockMode LWLockPadded +LZ4F_compressionContext_t +LZ4F_decompressOptions_t +LZ4F_decompressionContext_t +LZ4F_errorCode_t +LZ4F_preferences_t LabelProvider LagTracker LargeObjectDesc @@ -1391,18 +1462,24 @@ LogicalOutputPluginWriterUpdateProgress LogicalOutputPluginWriterWrite LogicalRepBeginData LogicalRepCommitData +LogicalRepCommitPreparedTxnData LogicalRepCtxStruct LogicalRepMsgType LogicalRepPartMapEntry +LogicalRepPreparedTxnData LogicalRepRelId LogicalRepRelMapEntry LogicalRepRelation +LogicalRepRollbackPreparedTxnData LogicalRepTupleData LogicalRepTyp LogicalRepWorker LogicalRewriteMappingData LogicalTape LogicalTapeSet +LsnReadQueue +LsnReadQueueNextFun +LsnReadQueueNextStatus LtreeGistOptions LtreeSignature MAGIC @@ -1410,6 +1487,7 @@ MBuf MCVItem MCVList MEMORY_BASIC_INFORMATION +MGVTBL MINIDUMPWRITEDUMP MINIDUMP_TYPE MJEvalResult @@ -1436,6 +1514,8 @@ MemoryContextCounters MemoryContextData MemoryContextMethods MemoryStatsPrintFunc +MergeAction +MergeActionState MergeAppend MergeAppendPath MergeAppendState @@ -1444,6 +1524,8 @@ MergeJoinClause MergeJoinState MergePath MergeScanSelCache +MergeStmt +MergeWhenClause MetaCommand MinMaxAggInfo MinMaxAggPath @@ -1456,8 +1538,10 @@ MinimalTupleTableSlot MinmaxMultiOpaque MinmaxOpaque ModifyTable +ModifyTableContext ModifyTablePath ModifyTableState +MonotonicFunction MorphOpaque MsgType MultiAssignRef @@ -1504,6 +1588,7 @@ NotificationHash NotificationList NotifyStmt Nsrt +NtDllRoutine NullIfExpr NullTest NullTestType @@ -1578,8 +1663,9 @@ PACL PATH PBOOL PCtxtHandle +PERL_CONTEXT +PERL_SI PFN -PFN_NTQUERYINFORMATIONFILE PGAlignedBlock PGAlignedXLogBlock PGAsyncStatusType @@ -1604,6 +1690,7 @@ PGMessageField PGModuleMagicFunction PGNoticeHooks PGOutputData +PGOutputTxnData PGPROC PGP_CFB PGP_Context @@ -1636,7 +1723,6 @@ PGresParamDesc PGresult PGresult_data PHANDLE -PIO_STATUS_BLOCK PLAINTREE PLAssignStmt PLUID_AND_ATTRIBUTES @@ -1766,8 +1852,12 @@ PTEntryArray PTIterationArray PTOKEN_PRIVILEGES PTOKEN_USER +PULONG PUTENVPROC +PVIndStats +PVIndVacStatus PVOID +PVShared PX_Alias PX_Cipher PX_Combo @@ -1801,6 +1891,7 @@ ParallelSlotResultHandler ParallelState ParallelTableScanDesc ParallelTableScanDescData +ParallelVacuumState ParallelWorkerContext ParallelWorkerInfo Param @@ -1866,8 +1957,11 @@ PathClauseUsage PathCostComparison PathHashStack PathKey +PathKeyInfo PathKeysComparison PathTarget +PathkeyMutatorState +PathkeySortCost PatternInfo PatternInfoArray Pattern_Prefix_Status @@ -1877,8 +1971,8 @@ PendingRelDelete PendingRelSync PendingUnlinkEntry PendingWriteback +PerLockTagEntry PerlInterpreter -Perl_check_t Perl_ppaddr_t Permutation PermutationStep @@ -1905,52 +1999,45 @@ 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_Msg -PgStat_MsgAnalyze -PgStat_MsgAnlAncestors -PgStat_MsgArchiver -PgStat_MsgAutovacStart -PgStat_MsgBgWriter -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_MsgSLRU -PgStat_MsgTabpurge -PgStat_MsgTabstat -PgStat_MsgTempFile -PgStat_MsgVacuum -PgStat_MsgWal +PgStat_HashKey +PgStat_Kind +PgStat_KindInfo +PgStat_LocalState +PgStat_PendingDroppedStatsItem PgStat_SLRUStats -PgStat_Shared_Reset_Target -PgStat_Single_Reset_Type +PgStat_ShmemControl +PgStat_Snapshot +PgStat_SnapshotEntry PgStat_StatDBEntry PgStat_StatFuncEntry PgStat_StatReplSlotEntry +PgStat_StatSubEntry PgStat_StatTabEntry PgStat_SubXactStatus PgStat_TableCounts -PgStat_TableEntry PgStat_TableStatus PgStat_TableXactStatus PgStat_WalStats @@ -2029,6 +2116,7 @@ ProjectSetPath ProjectSetState ProjectionInfo ProjectionPath +PromptInterruptContext ProtocolVersion PrsStorage PruneState @@ -2041,16 +2129,20 @@ PsqlScanStateData PsqlSettings Publication PublicationActions +PublicationDesc PublicationInfo +PublicationObjSpec +PublicationObjSpecType PublicationPartOpt PublicationRelInfo +PublicationSchemaInfo +PublicationTable PullFilter PullFilterOps PushFilter PushFilterOps PushFunction PyCFunction -PyCodeObject PyMappingMethods PyMethodDef PyModuleDef @@ -2095,7 +2187,6 @@ RI_QueryKey RTEKind RWConflict RWConflictPoolHeader -RandomState Range RangeBound RangeBox @@ -2123,6 +2214,8 @@ ReadBufferMode ReadBytePtrType ReadExtraTocPtrType ReadFunc +ReadLocalXLogPageNoWaitPrivate +ReadReplicationSlotCmd ReassignOwnedStmt RecheckForeignScan_function RecordCacheArrayEntry @@ -2169,6 +2262,7 @@ RelationInfo RelationPtr RelationSyncEntry RelcacheCallbackFunction +ReleaseMatchCB RelfilenodeMapEntry RelfilenodeMapKey Relids @@ -2183,6 +2277,7 @@ ReorderBufferApplyChangeCB ReorderBufferApplyTruncateCB ReorderBufferBeginCB ReorderBufferChange +ReorderBufferChangeType ReorderBufferCommitCB ReorderBufferCommitPreparedCB ReorderBufferDiskChange @@ -2244,7 +2339,7 @@ RewriteState RmgrData RmgrDescData RmgrId -RmgrIds +RoleNameItem RoleSpec RoleSpecType RoleStmtType @@ -2257,6 +2352,7 @@ RowMarkClause RowMarkType RowSecurityDesc RowSecurityPolicy +RtlGetLastNtStatus_t RuleInfo RuleLock RuleStmt @@ -2294,7 +2390,6 @@ SPLITCOST SPNode SPNodeData SPPageDesc -SQLCmd SQLDropObject SQLFunctionCache SQLFunctionCachePtr @@ -2312,7 +2407,7 @@ SYNCHRONIZATION_BARRIER SampleScan SampleScanGetSampleSize_function SampleScanState -SamplerRandomState +SavedTransactionCharacteristics ScalarArrayOpExpr ScalarArrayOpExprHashEntry ScalarArrayOpExprHashTable @@ -2423,7 +2518,6 @@ SlabBlock SlabChunk SlabContext SlabSlot -SlotErrCallbackArg SlotNumber SlruCtl SlruCtlData @@ -2493,10 +2587,8 @@ StartReplicationCmd StartupStatusEnum StatEntry StatExtEntry -StatMsgType StateFileChunk StatisticExtInfo -Stats StatsBuildData StatsData StatsElem @@ -2508,12 +2600,13 @@ Step StopList StrategyNumber StreamCtl -StreamXidHash +String StringInfo StringInfoData StripnullState SubLink SubLinkType +SubOpts SubPlan SubPlanState SubRemoveRels @@ -2525,6 +2618,7 @@ SubXactInfo SubqueryScan SubqueryScanPath SubqueryScanState +SubqueryScanStatus SubscriptExecSetup SubscriptExecSteps SubscriptRoutines @@ -2539,6 +2633,7 @@ SupportRequestIndexCondition SupportRequestRows SupportRequestSelectivity SupportRequestSimplify +SupportRequestWFuncMonotonic Syn SyncOps SyncRepConfigData @@ -2594,6 +2689,7 @@ TSQuerySign TSReadPointer TSTemplateInfo TSTernaryValue +TSTokenTypeItem TSTokenTypeStorage TSVector TSVectorBuildState @@ -2601,13 +2697,12 @@ TSVectorData TSVectorParseState TSVectorStat TState +TStatus TStoreState TXNEntryFile TYPCATEGORY T_Action T_WorkerStatus -TabStatHashEntry -TabStatusArray TableAmRoutine TableAttachInfo TableDataInfo @@ -2676,7 +2771,7 @@ ToastTupleContext ToastedAttribute TocEntry TokenAuxData -TokenizedLine +TokenizedAuthLine TrackItem TransInvalidationInfo TransState @@ -2772,9 +2867,9 @@ UniquePath UniquePathMethod UniqueState UnlistenStmt -UnpackTarState UnresolvedTup UnresolvedTupData +UpdateContext UpdateStmt UpperRelationKind UpperUniquePath @@ -2783,13 +2878,13 @@ UserMapping UserOpts VacAttrStats VacAttrStatsP +VacDeadItems VacErrPhase VacOptValue VacuumParams VacuumRelation VacuumStmt ValidateIndexState -Value ValuesScan ValuesScanState Var @@ -2808,6 +2903,7 @@ VariableShowStmt VariableSpace VariableStatData VariableSubstituteHook +Variables VersionedQuery Vfd ViewCheckOption @@ -2846,6 +2942,7 @@ WaitEventSet WaitEventTimeout WaitPMResult WalCloseMethod +WalCompression WalLevel WalRcvData WalRcvExecResult @@ -2865,6 +2962,7 @@ Walfile WindowAgg WindowAggPath WindowAggState +WindowAggStatus WindowClause WindowClauseSortData WindowDef @@ -2911,27 +3009,34 @@ XLogCtlData XLogCtlInsert XLogDumpConfig XLogDumpPrivate -XLogDumpStats XLogLongPageHeader XLogLongPageHeaderData XLogPageHeader XLogPageHeaderData XLogPageReadCB XLogPageReadPrivate +XLogPageReadResult +XLogPrefetchStats +XLogPrefetcher +XLogPrefetcherFilter XLogReaderRoutine XLogReaderState XLogRecData XLogRecPtr +XLogRecStats XLogRecord XLogRecordBlockCompressHeader XLogRecordBlockHeader XLogRecordBlockImageHeader XLogRecordBuffer +XLogRecoveryCtlData XLogRedoAction XLogSegNo XLogSource +XLogStats XLogwrtResult XLogwrtRqst +XPV XPVIV XPVMG XactCallback @@ -2950,6 +3055,10 @@ XmlTableBuilderData YYLTYPE YYSTYPE YY_BUFFER_STATE +ZSTD_CCtx +ZSTD_DCtx +ZSTD_inBuffer +ZSTD_outBuffer _SPI_connection _SPI_plan __AssignProcessToJobObject @@ -2961,6 +3070,7 @@ __SetInformationJobObject __time64_t _dev_t _ino_t +_locale_t _resultmap _stringlist acquireLocksOnSubLinks_context @@ -3003,6 +3113,29 @@ backup_manifest_info backup_manifest_option base_yy_extra_type basebackup_options +bbsink +bbsink_copystream +bbsink_gzip +bbsink_lz4 +bbsink_ops +bbsink_server +bbsink_shell +bbsink_state +bbsink_throttle +bbsink_zstd +bbstreamer +bbstreamer_archive_context +bbstreamer_extractor +bbstreamer_gzip_decompressor +bbstreamer_gzip_writer +bbstreamer_lz4_frame +bbstreamer_member +bbstreamer_ops +bbstreamer_plain_writer +bbstreamer_recovery_injector +bbstreamer_tar_archiver +bbstreamer_tar_parser +bbstreamer_zstd_frame bgworker_main_type binaryheap binaryheap_comparator @@ -3011,11 +3144,14 @@ bits16 bits32 bits8 bloom_filter +boolKEY brin_column_state brin_serialize_callback_type bytea cached_re_str +canonicalize_state cashKEY +catalogid_hash cfp check_agg_arguments_context check_function_callback @@ -3026,9 +3162,7 @@ check_ungrouped_columns_context chr clock_t cmpEntriesArg -cmpfunc codes_t -coercion collation_cache_entry color colormaprange @@ -3081,6 +3215,7 @@ dshash_hash dshash_hash_function dshash_parameters dshash_partition +dshash_seq_status dshash_table dshash_table_control dshash_table_handle @@ -3120,6 +3255,7 @@ find_expr_references_context fix_join_expr_context fix_scan_expr_context fix_upper_expr_context +fix_windowagg_cond_context flatten_join_alias_vars_context float4 float4KEY @@ -3200,7 +3336,6 @@ init_function inline_cte_walker_context inline_error_callback_arg ino_t -inquiry instr_time int128 int16 @@ -3281,16 +3416,8 @@ mix_data_t mixedStruct mode_t movedb_failure_params -mp_digit -mp_int -mp_result -mp_sign -mp_size -mp_small -mp_usmall -mp_word -mpz_t multirange_bsearch_comparison +multirange_unnest_fctx mxact mxtruncinfo needs_fmgr_hook_type @@ -3300,6 +3427,7 @@ normal_rand_fctx ntile_context numeric object_access_hook_type +object_access_hook_type_str off_t oidKEY oidvector @@ -3323,30 +3451,37 @@ pgParameterStatus pg_atomic_flag pg_atomic_uint32 pg_atomic_uint64 +pg_be_sasl_mech pg_checksum_context pg_checksum_raw_context pg_checksum_type +pg_compress_algorithm +pg_compress_specification pg_conn_host pg_conn_host_type pg_conv_map pg_crc32 pg_crc32c pg_cryptohash_ctx +pg_cryptohash_errno pg_cryptohash_type pg_ctype_cache pg_enc pg_enc2gettext pg_enc2name pg_encname +pg_fe_sasl_mech pg_funcptr_t pg_gssinfo pg_hmac_ctx +pg_hmac_errno pg_int64 pg_local_to_utf_combined pg_locale_t pg_mb_radix_tree pg_md5_ctx pg_on_exit_callback +pg_prng_state pg_re_flags pg_saslprep_rc pg_sha1_ctx @@ -3381,7 +3516,10 @@ pgssHashKey pgssSharedState pgssStoreKind pgssVersion +pgstat_entry_ref_hash_hash +pgstat_entry_ref_hash_iterator pgstat_page +pgstat_snapshot_hash pgstattuple_type pgthreadlock_t pid_t @@ -3483,7 +3621,7 @@ replace_rte_variables_context ret_type rewind_source rewrite_event -rijndael_ctx +rf_context rm_detail_t role_auth_extra row_security_policy_hook_type @@ -3503,6 +3641,7 @@ shm_mq_result shm_toc shm_toc_entry shm_toc_estimator +shmem_request_hook_type shmem_startup_hook_type sig_atomic_t sigjmp_buf @@ -3515,6 +3654,7 @@ slist_mutable_iter slist_node slock_t socket_set +socklen_t spgBulkDeleteState spgChooseIn spgChooseOut @@ -3557,7 +3697,6 @@ string substitute_actual_parameters_context substitute_actual_srf_parameters_context substitute_phv_relids_context -svtype symbol tablespaceinfo teSection @@ -3589,8 +3728,6 @@ tuplehash_hash tuplehash_iterator type tzEntry -u1byte -u4byte u_char u_int uchr @@ -3667,7 +3804,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 @@ -3730,6 +3868,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 diff --git a/third_party/spanner_pg/src/tools/testint128.c b/third_party/spanner_pg/src/tools/testint128.c index 71c34596..2ebd4f50 100644 --- a/third_party/spanner_pg/src/tools/testint128.c +++ b/third_party/spanner_pg/src/tools/testint128.c @@ -6,7 +6,7 @@ * This is a standalone test program that compares the behavior of an * implementation in int128.h to an (assumed correct) int128 native type. * - * Copyright (c) 2017-2021, PostgreSQL Global Development Group + * Copyright (c) 2017-2022, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -27,6 +27,7 @@ #endif #include "common/int128.h" +#include "common/pg_prng.h" /* * We assume the parts of this union are laid out compatibly. @@ -61,27 +62,11 @@ my_int128_compare(int128 x, int128 y) return 0; } -/* - * Get a random uint64 value. - * We don't assume random() is good for more than 16 bits. - */ -static uint64 -get_random_uint64(void) -{ - uint64 x; - - x = (uint64) (random() & 0xFFFF) << 48; - x |= (uint64) (random() & 0xFFFF) << 32; - x |= (uint64) (random() & 0xFFFF) << 16; - x |= (uint64) (random() & 0xFFFF); - return x; -} - /* * Main program. * * Generates a lot of random numbers and tests the implementation for each. - * The results should be reproducible, since we don't call srandom(). + * The results should be reproducible, since we use a fixed PRNG seed. * * You can give a loop count if you don't like the default 1B iterations. */ @@ -90,6 +75,8 @@ main(int argc, char **argv) { long count; + pg_prng_seed(&pg_global_prng_state, 0); + if (argc >= 2) count = strtol(argv[1], NULL, 0); else @@ -97,9 +84,9 @@ main(int argc, char **argv) while (count-- > 0) { - int64 x = get_random_uint64(); - int64 y = get_random_uint64(); - int64 z = get_random_uint64(); + int64 x = pg_prng_uint64(&pg_global_prng_state); + int64 y = pg_prng_uint64(&pg_global_prng_state); + int64 z = pg_prng_uint64(&pg_global_prng_state); test128 t1; test128 t2; @@ -151,7 +138,7 @@ main(int argc, char **argv) t1.hl.hi = x; t1.hl.lo = y; t2.hl.hi = z; - t2.hl.lo = get_random_uint64(); + t2.hl.lo = pg_prng_uint64(&pg_global_prng_state); if (my_int128_compare(t1.i128, t2.i128) != int128_compare(t1.I128, t2.I128)) diff --git a/third_party/spanner_pg/src/tools/valgrind.supp b/third_party/spanner_pg/src/tools/valgrind.supp index e3a179d2..4e8c4827 100644 --- a/third_party/spanner_pg/src/tools/valgrind.supp +++ b/third_party/spanner_pg/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 diff --git a/third_party/spanner_pg/src/tools/version_stamp.pl b/third_party/spanner_pg/src/tools/version_stamp.pl index ee8f314b..bf8fdfb3 100755 --- a/third_party/spanner_pg/src/tools/version_stamp.pl +++ b/third_party/spanner_pg/src/tools/version_stamp.pl @@ -3,7 +3,7 @@ ################################################################# # version_stamp.pl -- update version stamps throughout the source tree # -# Copyright (c) 2008-2021, PostgreSQL Global Development Group +# Copyright (c) 2008-2022, PostgreSQL Global Development Group # # src/tools/version_stamp.pl ################################################################# @@ -25,7 +25,7 @@ # Major version is hard-wired into the script. We update it when we branch # a new development version. -my $majorversion = 14; +my $majorversion = 15; # Validate argument and compute derived variables my $minor = shift; diff --git a/third_party/spanner_pg/src/tools/win32tzlist.pl b/third_party/spanner_pg/src/tools/win32tzlist.pl index 3dd0aaae..c43ab7e2 100755 --- a/third_party/spanner_pg/src/tools/win32tzlist.pl +++ b/third_party/spanner_pg/src/tools/win32tzlist.pl @@ -2,7 +2,7 @@ # # win32tzlist.pl -- compare Windows timezone information # -# Copyright (c) 2008-2021, PostgreSQL Global Development Group +# Copyright (c) 2008-2022, PostgreSQL Global Development Group # # src/tools/win32tzlist.pl ################################################################# diff --git a/third_party/spanner_pg/src/tutorial/complex.source b/third_party/spanner_pg/src/tutorial/complex.source index d1f61fdd..bab21af2 100644 --- a/third_party/spanner_pg/src/tutorial/complex.source +++ b/third_party/spanner_pg/src/tutorial/complex.source @@ -5,7 +5,7 @@ -- use this new type. -- -- --- 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 -- -- src/tutorial/complex.source diff --git a/third_party/spanner_pg/src/tutorial/syscat.source b/third_party/spanner_pg/src/tutorial/syscat.source index 6b3031c4..6458c323 100644 --- a/third_party/spanner_pg/src/tutorial/syscat.source +++ b/third_party/spanner_pg/src/tutorial/syscat.source @@ -4,7 +4,7 @@ -- sample queries to the system catalogs -- -- --- 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 -- -- src/tutorial/syscat.source diff --git a/third_party/spanner_pg/transformer/expr_transformer_helper.h b/third_party/spanner_pg/transformer/expr_transformer_helper.h index e14037d1..20a8aec6 100644 --- a/third_party/spanner_pg/transformer/expr_transformer_helper.h +++ b/third_party/spanner_pg/transformer/expr_transformer_helper.h @@ -60,7 +60,7 @@ typedef std::vector CorrelatedColumnsSetList; // The index of a Postgres `Var` (i.e. a column). struct VarIndex { // The index of the scan in Query.rtable. Starting from 1. - Index varno; + int varno; // The index of the var in Query.targetList. Starting from 1. int varattno; // The number of subqueries up for this Var. Only used by the reverse @@ -182,6 +182,10 @@ class VarIndexScope { /*allow_override=*/true); } for (auto& kv : group_by_map) { + // We only override vars at this subquery level. + if (kv.first->varlevelsup != 0) { + continue; + } new_scope->MapVarIndexToTarget( {.varno = kv.first->varno, .varattno = kv.first->varattno}, kv.second, /*allow_override=*/true); diff --git a/third_party/spanner_pg/transformer/forward_dml.cc b/third_party/spanner_pg/transformer/forward_dml.cc index 36d75bfc..31a70df3 100644 --- a/third_party/spanner_pg/transformer/forward_dml.cc +++ b/third_party/spanner_pg/transformer/forward_dml.cc @@ -279,7 +279,7 @@ ForwardTransformer::BuildPartialGsqlResolvedInsertStmt(const Query& query) { if (query.onConflict != nullptr) { switch (query.onConflict->action) { case ONCONFLICT_NOTHING: - insert_mode = zetasql::ResolvedInsertStmt::OR_IGNORE; + insert_mode = zetasql::ResolvedInsertStmt::OR_IGNORE; break; case ONCONFLICT_UPDATE: insert_mode = zetasql::ResolvedInsertStmt::OR_UPDATE; diff --git a/third_party/spanner_pg/transformer/forward_expr.cc b/third_party/spanner_pg/transformer/forward_expr.cc index 36bb8203..b2c866ca 100644 --- a/third_party/spanner_pg/transformer/forward_expr.cc +++ b/third_party/spanner_pg/transformer/forward_expr.cc @@ -327,20 +327,6 @@ ForwardTransformer::BuildGsqlCastExpression( ZETASQL_ASSIGN_OR_RETURN(std::unique_ptr resolved_input, BuildGsqlResolvedExpr(input, expr_transformer_info)); - // Casts between FLOAT4 and NUMERIC/JSONB must go through TEXT. - // Casts from FLOAT4 -> JSONB are not supported in native PG so they are - // not handled here. - // TODO: b/324455289 - remove when casts between FLOAT4 and NUMERIC/JSONB are - // supported in Spanner. - if ((source_type_oid == JSONBOID && result_type == FLOAT4OID) || - (source_type_oid == FLOAT4OID && result_type == NUMERICOID) || - (source_type_oid == NUMERICOID && result_type == FLOAT4OID)) { - ZETASQL_ASSIGN_OR_RETURN(resolved_input, - BuildGsqlCastExpression(TEXTOID, input, typmod, - expr_transformer_info)); - source_type_oid = TEXTOID; - } - const zetasql::Type* target_type = resolved_type; const zetasql::Type* source_type = resolved_input->type(); @@ -398,14 +384,8 @@ ForwardTransformer::BuildGsqlCastExpression( target_type, function_and_signature.function(), function_and_signature.signature(), std::move(argument_list), zetasql::ResolvedFunctionCallBase::DEFAULT_ERROR_MODE); - if (!(source_type_oid == NUMERICOID && result_type == FLOAT4OID)) { - return resolved_input; - } - // For a cast from PG.NUMERIC to FLOAT32, the casting function call has - // performed the cast from PG.NUMERIC to FLOAT64. Now we need to cast from - // FLOAT64 to FLOAT32. - source_type = zetasql::types::DoubleType(); - target_type = zetasql::types::FloatType(); + + return resolved_input; } // If not pg.numeric, rely on ResolvedCast. diff --git a/third_party/spanner_pg/transformer/forward_query.cc b/third_party/spanner_pg/transformer/forward_query.cc index 71a328f0..602dec63 100644 --- a/third_party/spanner_pg/transformer/forward_query.cc +++ b/third_party/spanner_pg/transformer/forward_query.cc @@ -147,7 +147,7 @@ absl::Status CheckTypeSupportsOrdering( } // namespace absl::StatusOr ForwardTransformer::GetResolvedColumn( - const VarIndexScope& var_index_scope, Index varno, AttrNumber varattno, + const VarIndexScope& var_index_scope, int varno, AttrNumber varattno, int var_levels_up, CorrelatedColumnsSetList* correlated_columns_sets) { VarIndex var_index{.varno = varno, .varattno = varattno}; zetasql::ResolvedColumn result; @@ -196,7 +196,7 @@ absl::StatusOr ForwardTransformer::GetTableFromRTE( absl::StatusOr> ForwardTransformer::BuildGsqlResolvedTableScan(const RangeTblEntry& rte, - Index rtindex, + int rtindex, VarIndexScope* output_scope) { ZETASQL_ASSIGN_OR_RETURN(const zetasql::Table* table, GetTableFromRTE(rte)); @@ -242,7 +242,7 @@ ForwardTransformer::BuildGsqlResolvedTableScan(const RangeTblEntry& rte, } absl::Status ForwardTransformer::MapVarIndexToColumn( - const zetasql::ResolvedScan& scan, Index rtindex, + const zetasql::ResolvedScan& scan, int rtindex, VarIndexScope* var_index_scope) { ZETASQL_RET_CHECK(var_index_scope != nullptr); for (int i = 0; i < scan.column_list_size(); ++i) { @@ -255,7 +255,7 @@ absl::Status ForwardTransformer::MapVarIndexToColumn( } absl::Status ForwardTransformer::MapVarIndexToColumnForJoin( - const RangeTblEntry& rte, Index rtindex, VarIndexScope* var_index_scope) { + const RangeTblEntry& rte, int rtindex, VarIndexScope* var_index_scope) { ZETASQL_RET_CHECK_EQ(rte.rtekind, RTE_JOIN); int var_index = 1; @@ -440,7 +440,7 @@ ForwardTransformer::BuildGsqlResolvedScanForFunctionCall( absl::StatusOr> ForwardTransformer::ConvertZeroBasedOffsetToOneBasedOrdinal( std::unique_ptr array_scan, - const Index& rtindex, VarIndexScope* output_scope) { + const int rtindex, VarIndexScope* output_scope) { ZETASQL_RET_CHECK(array_scan->array_offset_column() != nullptr); ZETASQL_ASSIGN_OR_RETURN( @@ -570,7 +570,7 @@ absl::Status ForwardTransformer::PrepareTVFInputArguments( absl::StatusOr> ForwardTransformer::BuildGsqlResolvedWithRefScan(absl::string_view with_alias, - Index rtindex, + int rtindex, VarIndexScope* output_scope) { // The ZetaSQL ResolvedWithRefScan is used whenever a WITH clause subquery // is referenced in the primary query or in another WITH clause subquery. @@ -1193,7 +1193,7 @@ ForwardTransformer::BuildGsqlResolvedScanForQueryExpression( // an array (including repeated proto values). absl::StatusOr> ForwardTransformer::BuildGsqlResolvedArrayScan( - const RangeTblEntry& rte, Index rtindex, + const RangeTblEntry& rte, int rtindex, const VarIndexScope* external_scope, VarIndexScope* output_scope) { // Caller has already verified that this is an UNNEST function call. We only // need to verify it's a supported kind of UNNEST. @@ -1312,7 +1312,7 @@ ForwardTransformer::BuildGsqlResolvedArrayScan( // - TVF Arguments are scalar only (never relation or model) absl::StatusOr> ForwardTransformer::BuildGsqlResolvedTVFScan( - const RangeTblEntry& rte, Index rtindex, + const RangeTblEntry& rte, int rtindex, const VarIndexScope* external_scope, const zetasql::TableValuedFunction* tvf_catalog_entry, VarIndexScope* output_scope) { diff --git a/third_party/spanner_pg/transformer/forward_transformer.h b/third_party/spanner_pg/transformer/forward_transformer.h index 4d4722cc..859cc57c 100644 --- a/third_party/spanner_pg/transformer/forward_transformer.h +++ b/third_party/spanner_pg/transformer/forward_transformer.h @@ -144,7 +144,7 @@ class ForwardTransformer { // Requires that `rte.rtekind` is RTE_RELATION. // `rtindex` is used for MapVarIndexToColumn. absl::StatusOr> - BuildGsqlResolvedTableScan(const RangeTblEntry& rte, Index rtindex, + BuildGsqlResolvedTableScan(const RangeTblEntry& rte, int rtindex, VarIndexScope* output_scope); // Builds a `ResolvedFilterScan` object. `where_clause` is taken from the @@ -185,7 +185,7 @@ class ForwardTransformer { // Builds a `ResolvedArrayScan` for UNNEST. absl::StatusOr> - BuildGsqlResolvedArrayScan(const RangeTblEntry& rte, Index rtindex, + BuildGsqlResolvedArrayScan(const RangeTblEntry& rte, int rtindex, const VarIndexScope* external_scope, VarIndexScope* output_scope); @@ -193,7 +193,7 @@ class ForwardTransformer { // Currently this is just the Change Streams TVF. absl::StatusOr> BuildGsqlResolvedTVFScan( - const RangeTblEntry& rte, Index rtindex, + const RangeTblEntry& rte, int rtindex, const VarIndexScope* external_scope, const zetasql::TableValuedFunction* tvf_catalog_entry, VarIndexScope* output_scope); @@ -310,7 +310,7 @@ class ForwardTransformer { absl::StatusOr> ConvertZeroBasedOffsetToOneBasedOrdinal( std::unique_ptr array_scan, - const Index& rtindex, VarIndexScope* output_scope); + const int rtindex, VarIndexScope* output_scope); // Simplified version of the ZetaSQL analyzer function of the same name. // This version only supports scalar arguments, which eliminates the need for @@ -327,7 +327,7 @@ class ForwardTransformer { std::vector* tvf_input_arguments); absl::StatusOr> - BuildGsqlResolvedWithRefScan(absl::string_view with_alias, Index rtindex, + BuildGsqlResolvedWithRefScan(absl::string_view with_alias, int rtindex, VarIndexScope* output_scope); // Returns a ZetaSQL join type corresponding to the input PostgreSQL @@ -982,7 +982,7 @@ class ForwardTransformer { // // This is used for the forward transformation. absl::Status MapVarIndexToColumn(const zetasql::ResolvedScan& scan, - Index rtindex, + int rtindex, VarIndexScope* var_index_scope); // Builds a synthetic limit node from a provided offset // if a limit is not provided. @@ -1000,12 +1000,12 @@ class ForwardTransformer { // other non-join RangeTblEntry objects, so that their ResolvedColumns are // already indexed in the map. absl::Status MapVarIndexToColumnForJoin(const RangeTblEntry& rte, - Index rtindex, + int rtindex, VarIndexScope* var_index_scope); // This is used for the forward transformation. absl::StatusOr GetResolvedColumn( - const VarIndexScope& var_index_scope, Index varno, AttrNumber varattno, + const VarIndexScope& var_index_scope, int varno, AttrNumber varattno, int var_levels_up, CorrelatedColumnsSetList* correlated_columns_sets = nullptr); diff --git a/third_party/spanner_pg/transformer/transformer.cc b/third_party/spanner_pg/transformer/transformer.cc index b2329cc1..0f3afc39 100644 --- a/third_party/spanner_pg/transformer/transformer.cc +++ b/third_party/spanner_pg/transformer/transformer.cc @@ -61,7 +61,7 @@ namespace postgres_translator { -using ::postgres_translator::internal::PostgresCastToValue; +using ::postgres_translator::internal::PostgresCastToString; // Returns true if all alphabetic characters in `qualified_table_name` are // lower-case. @@ -110,10 +110,10 @@ static absl::StatusOr BuildRelationEref( // columns. for (int colnum = 0; colnum < num_columns; ++colnum) { const zetasql::Column* column = gsql_table.GetColumn(colnum); - Value* attribute_name; + String* attribute_name; if (alias_list_cell != nullptr) { - attribute_name = PostgresCastToValue(lfirst(alias_list_cell)); + attribute_name = PostgresCastToString(lfirst(alias_list_cell)); alias_list_cell = lnext(alias->colnames, alias_list_cell); } else { ZETASQL_ASSIGN_OR_RETURN( diff --git a/third_party/spanner_pg/util/interval_helpers.cc b/third_party/spanner_pg/util/interval_helpers.cc index f783cb6d..187ac248 100644 --- a/third_party/spanner_pg/util/interval_helpers.cc +++ b/third_party/spanner_pg/util/interval_helpers.cc @@ -96,8 +96,7 @@ static absl::Status DateTimeParseError(int dterr, absl::string_view str, * should be safe to call directly instead of through the error shim. */ absl::StatusOr ParseInterval(absl::string_view input_string) { - fsec_t fsec; - struct pg_tm tt, *tm = &tt; + struct pg_itm_in tt, *itm_in = &tt; int dtype; int nf; int range = INTERVAL_FULL_RANGE; @@ -109,7 +108,7 @@ absl::StatusOr ParseInterval(absl::string_view input_string) { dterr = ParseDateTime(input_string.data(), workbuf, sizeof(workbuf), field, ftype, MAXDATEFIELDS, &nf); if (dterr == 0) { - dterr = DecodeInterval(field, ftype, nf, range, &dtype, tm, &fsec); + dterr = DecodeInterval(field, ftype, nf, range, &dtype, itm_in); } /* if those functions think it's a bad format, try ISO8601 style */ @@ -119,7 +118,7 @@ absl::StatusOr ParseInterval(absl::string_view input_string) { */ char *non_const_input = const_cast(input_string.data()); if (dterr == DTERR_BAD_FORMAT) { - dterr = DecodeISO8601Interval(non_const_input, &dtype, tm, &fsec); + dterr = DecodeISO8601Interval(non_const_input, &dtype, itm_in); } if (dterr != 0) { @@ -130,7 +129,7 @@ absl::StatusOr ParseInterval(absl::string_view input_string) { } Interval res; - if (tm2interval(tm, 0, &res) != 0) { + if (itmin2interval(itm_in, &res) != 0) { return absl::InvalidArgumentError( absl::StrFormat("invalid interval: \"%s\"", input_string)); } diff --git a/third_party/spanner_pg/util/postgres.cc b/third_party/spanner_pg/util/postgres.cc index 42d39a3e..c5dcc9d3 100644 --- a/third_party/spanner_pg/util/postgres.cc +++ b/third_party/spanner_pg/util/postgres.cc @@ -532,18 +532,7 @@ bool IsExpr(const Node& input) { } } -bool IsValue(const Node& input) { - switch (nodeTag(&input)) { - case T_Integer: - case T_Float: - case T_String: - case T_BitString: - case T_Null: - return true; - default: - return false; - } -} +bool IsString(const Node& input) { return nodeTag(&input) == T_String; } Node* PostgresCastToNode(void* pointer) { ABSL_CHECK_NE(pointer, nullptr); @@ -575,12 +564,12 @@ const Expr* PostgresConstCastToExpr(const void* pointer) { return reinterpret_cast(pointer); } -Value* PostgresCastToValue(void* pointer) { +String* PostgresCastToString(void* pointer) { ABSL_CHECK_NE(pointer, nullptr); // Check that pointer is an actual Value before casting it. - ABSL_CHECK(IsValue(*PostgresCastToNode(pointer))); - return reinterpret_cast(pointer); + ABSL_CHECK(IsString(*PostgresCastToNode(pointer))); + return reinterpret_cast(pointer); } std::string RTEKindToString(RTEKind rtekind) { diff --git a/third_party/spanner_pg/util/postgres.h b/third_party/spanner_pg/util/postgres.h index f219524a..aebc75b5 100644 --- a/third_party/spanner_pg/util/postgres.h +++ b/third_party/spanner_pg/util/postgres.h @@ -208,10 +208,10 @@ const Node* PostgresConstCastToNode(const void* pointer); Expr* PostgresCastToExpr(void* pointer); const Expr* PostgresConstCastToExpr(const void* pointer); -// Casts a Postgres object held by `pointer` to Value type, using C++ style +// Casts a Postgres object held by `pointer` to String type, using C++ style // casting. `pointer` should point to a valid PostgreSQL object that is a -// derived class of Value. -Value* PostgresCastToValue(void* pointer); +// derived class of String. +String* PostgresCastToString(void* pointer); // PostgreSQL safe cast function. Mimics the behavior of castNode(), but with // C++ constructs.